From b514cd27dd684021d0ec59bce657d52431264911 Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Thu, 19 Nov 2020 20:53:49 +0100 Subject: [PATCH] Restructure projects --- LanguageMaster.xml | 11 + src/SubtitleEdit.sln => SubtitleEdit.sln | 141 +- SubtitleEdit.sln.DotSettings | 24 + build.bat | 23 +- build_helpers.bat | 6 +- coverity.bat | 73 - installer/Subtitle_Edit_installer.iss | 4 +- src/packages.config => packages.config | 0 run_tabspace.bat | 10 - src/Forms/ChooseAudioTrack.resx | 120 - src/Forms/ChooseStyle.resx | 120 - src/Forms/ColumnPaste.resx | 120 - src/Forms/DoNotBreakAfterListEdit.resx | 120 - src/Forms/DurationsBridgeGaps.resx | 120 - src/Forms/DvdSubRipChooseLanguage.resx | 120 - src/Forms/FcpProperties.resx | 120 - src/Forms/GoogleOrMicrosoftTranslate.resx | 120 - src/Forms/Interjections.resx | 120 - src/Forms/MeasurementConverter.resx | 120 - src/Test/Test.csproj | 21 +- .../LanguageDeserializerGenerator.cs | 1 - src/UpdateLanguageFiles/Program.cs | 2 +- .../UpdateLanguageFiles.csproj | 6 +- src/Win32Resources/Win32Resources.vcxproj | 2 +- .../PocketSphinx/PocketSphinxSettings.cs | 0 .../AudioToText/PocketSphinx/ResultReader.cs | 0 .../PocketSphinx/SubtitleGenerator.cs | 0 .../libse}/AudioToText/ResultText.cs | 0 .../libse}/BluRaySup/BluRaySupPalette.cs | 0 .../libse}/BluRaySup/BluRaySupParser.cs | 0 .../libse}/BluRaySup/BluRaySupPicture.cs | 0 {libse => src/libse}/BluRaySup/Core.cs | 0 .../libse}/BluRaySup/ImageObjectFragment.cs | 0 {libse => src/libse}/BluRaySup/PaletteInfo.cs | 0 {libse => src/libse}/BluRaySup/ToolBox.cs | 0 {libse => src/libse}/CDG/CdgGraphics.cs | 0 {libse => src/libse}/CDG/CdgGraphicsFile.cs | 0 {libse => src/libse}/CDG/CdgToImageList.cs | 0 {libse => src/libse}/CDG/Command.cs | 0 {libse => src/libse}/CDG/Instruction.cs | 0 {libse => src/libse}/CDG/Packet.cs | 0 {libse => src/libse}/Common/BmpReader.cs | 0 .../libse}/Common/BookmarkPersistence.cs | 0 {libse => src/libse}/Common/CharUtils.cs | 0 {libse => src/libse}/Common/Configuration.cs | 0 .../libse}/Common/ContinuationUtilities.cs | 0 .../libse}/Common/CultureExtensions.cs | 0 .../libse}/Common/DialogSplitMerge.cs | 0 .../libse}/Common/DvdSubtitleLanguage.cs | 0 {libse => src/libse}/Common/FastBitmap.cs | 0 {libse => src/libse}/Common/FastFileStream.cs | 0 .../libse}/Common/FilePathComparer.cs | 0 {libse => src/libse}/Common/FileUtil.cs | 0 {libse => src/libse}/Common/FixCasing.cs | 0 .../libse}/Common/FixDurationLimits.cs | 0 {libse => src/libse}/Common/HistoryItem.cs | 0 {libse => src/libse}/Common/HtmlUtil.cs | 0 {libse => src/libse}/Common/IfoParser.cs | 0 .../libse}/Common/ImageSplitterItem.cs | 0 .../libse}/Common/Iso639Dash2LanguageCode.cs | 0 .../libse}/Common/IsoCountryCodes.cs | 0 .../libse}/Common/LanguageAutoDetect.cs | 0 {libse => src/libse}/Common/ManagedBitmap.cs | 0 .../libse}/Common/MergeLinesSameTextUtils.cs | 0 .../libse}/Common/MergeShortLinesUtils.cs | 0 {libse => src/libse}/Common/MovieHasher.cs | 0 {libse => src/libse}/Common/MurMurHash3.cs | 0 {libse => src/libse}/Common/NativeMethods.cs | 0 .../Common/NetflixImsc11JapaneseToAss.cs | 0 {libse => src/libse}/Common/NikseBitmap.cs | 0 .../libse}/Common/NoBreakAfterItem.cs | 0 {libse => src/libse}/Common/Paragraph.cs | 0 .../libse}/Common/PlainTextImporter.cs | 0 {libse => src/libse}/Common/Position.cs | 0 {libse => src/libse}/Common/RealFFT.cs | 0 {libse => src/libse}/Common/RegexUtils.cs | 0 {libse => src/libse}/Common/RegistryUtil.cs | 0 .../libse}/Common/ReplaceExpression.cs | 0 .../libse}/Common/RichTextToPlainText.cs | 0 {libse => src/libse}/Common/RulesProfile.cs | 0 .../libse}/Common/SccPositionAndStyle.cs | 0 .../libse}/Common/SccPositionAndStyleTable.cs | 0 .../libse}/Common/SceneChangeHelper.cs | 0 {libse => src/libse}/Common/SeJsonParser.cs | 0 .../libse}/Common/SeJsonValidator.cs | 0 {libse => src/libse}/Common/SeLogger.cs | 0 {libse => src/libse}/Common/Settings.cs | 0 {libse => src/libse}/Common/SsaStyle.cs | 0 .../libse}/Common/StringExtensions.cs | 0 {libse => src/libse}/Common/StrippableText.cs | 0 {libse => src/libse}/Common/TarHeader.cs | 0 {libse => src/libse}/Common/TarReader.cs | 0 .../libse}/Common/TesseractDictionary.cs | 0 {libse => src/libse}/Common/TextDraw.cs | 0 {libse => src/libse}/Common/TextEncoding.cs | 0 .../libse}/Common/TextEncodingExtensions.cs | 0 {libse => src/libse}/Common/TextSplit.cs | 0 .../libse}/Common/TextSplitResult.cs | 0 {libse => src/libse}/Common/TimeCode.cs | 0 {libse => src/libse}/Common/TinyJsonParser.cs | 0 .../libse}/Common/UnknownFormatImporter.cs | 0 .../Common/UnknownFormatImporterJson.cs | 0 {libse => src/libse}/Common/Utilities.cs | 0 {libse => src/libse}/Common/VideoInfo.cs | 0 .../libse}/Common/WaveToVisualizer.cs | 0 .../libse}/Common/XmlDeserializerGenerator.cs | 0 {libse => src/libse}/Common/ZipExtractor.cs | 0 .../libse}/ContainerFormats/AviRiffData.cs | 0 .../libse}/ContainerFormats/Ebml/Element.cs | 0 .../libse}/ContainerFormats/Ebml/ElementId.cs | 0 .../MaterialExchangeFormat/KeyIdentifier.cs | 0 .../MaterialExchangeFormat/KlvPacket.cs | 0 .../MaterialExchangeFormat/MxfParser.cs | 0 .../MaterialExchangeFormat/PartitionStatus.cs | 0 .../Matroska/MatroskaChapter.cs | 0 .../ContainerFormats/Matroska/MatroskaFile.cs | 0 .../Matroska/MatroskaSubtitle.cs | 0 .../Matroska/MatroskaTrackInfo.cs | 0 .../libse}/ContainerFormats/Mp4/Boxes/Box.cs | 0 .../libse}/ContainerFormats/Mp4/Boxes/Mdat.cs | 0 .../libse}/ContainerFormats/Mp4/Boxes/Mdhd.cs | 0 .../libse}/ContainerFormats/Mp4/Boxes/Mdia.cs | 0 .../libse}/ContainerFormats/Mp4/Boxes/Minf.cs | 0 .../libse}/ContainerFormats/Mp4/Boxes/Moof.cs | 0 .../libse}/ContainerFormats/Mp4/Boxes/Moov.cs | 0 .../libse}/ContainerFormats/Mp4/Boxes/Mvhd.cs | 0 .../libse}/ContainerFormats/Mp4/Boxes/Stbl.cs | 0 .../libse}/ContainerFormats/Mp4/Boxes/Tfdt.cs | 0 .../libse}/ContainerFormats/Mp4/Boxes/Tkhd.cs | 0 .../libse}/ContainerFormats/Mp4/Boxes/Traf.cs | 0 .../libse}/ContainerFormats/Mp4/Boxes/Trak.cs | 0 .../libse}/ContainerFormats/Mp4/Boxes/Trun.cs | 0 .../libse}/ContainerFormats/Mp4/Boxes/Vttc.cs | 0 .../libse}/ContainerFormats/Mp4/CmafParser.cs | 0 .../libse}/ContainerFormats/Mp4/Mp4Parser.cs | 0 .../ContainerFormats/Mp4/SampleTimeInfo.cs | 0 .../ContainerFormats/Mp4/TimeSegment.cs | 0 .../ContainerFormats/RiffDecodeHeader.cs | 0 .../libse}/ContainerFormats/RiffParser.cs | 0 .../TransportStream/AdaptationField.cs | 0 .../TransportStream/ClutDefinitionSegment.cs | 0 .../DisplayDefinitionSegment.cs | 0 .../TransportStream/DvbSubPes.cs | 0 .../TransportStream/EbuPesDataField.cs | 0 .../TransportStream/EbuPesDataFieldText.cs | 0 .../TransportStream/Helper.cs | 0 .../TransportStream/ObjectDataSegment.cs | 0 .../TransportStream/Packet.cs | 0 .../PacketizedElementaryStream.cs | 0 .../TransportStream/PageCompositionSegemnt.cs | 0 .../PageCompositionSegmentRegion.cs | 0 .../ProgramAssociationTable.cs | 0 .../TransportStream/ProgramMapTable.cs | 0 .../ProgramMapTableDescriptor.cs | 0 .../TransportStream/ProgramMapTableParser.cs | 0 .../TransportStream/ProgramMapTableStream.cs | 0 .../TransportStream/RegionClutSegmentEntry.cs | 0 .../RegionCompositionSegment.cs | 0 .../RegionCompositionSegmentObject.cs | 0 .../TransportStream/SubtitleSegment.cs | 0 .../TransportStream/Teletext.cs | 0 .../TransportStream/TeletextHamming.cs | 0 .../TransportStream/TeletextRunSettings.cs | 0 .../TransportStream/TeletextTables.cs | 0 .../TransportStream/TransportStreamParser.cs | 0 .../TransportStreamSubtitle.cs | 0 {libse => src/libse}/ContainerFormats/XSub.cs | 0 .../libse}/DetectEncoding/EncodingTools.cs | 0 {libse => src/libse}/Dictionaries/NameList.cs | 0 .../libse}/Dictionaries/OcrFixReplaceList.cs | 0 .../libse}/Enums/ContinuationStyle.cs | 0 {libse => src/libse}/Enums/DialogType.cs | 0 {libse => src/libse}/Enums/FindType.cs | 0 {libse => src/libse}/Enums/ReplaceType.cs | 0 {libse => src/libse}/Enums/SelectionChoice.cs | 0 .../libse}/Enums/SpellCheckAction.cs | 0 .../libse}/Enums/SubtitleSortCriteria.cs | 0 .../libse}/Forms/CheckForUpdatesHelper.cs | 0 .../libse}/Forms/DurationsBridgeGaps.cs | 0 .../Forms/FixCommonErrors/AddMissingQuotes.cs | 0 .../Forms/FixCommonErrors/EmptyFixCallback.cs | 0 .../Forms/FixCommonErrors/Fix3PlusLines.cs | 0 .../FixAloneLowercaseIToUppercaseI.cs | 0 .../libse}/Forms/FixCommonErrors/FixCommas.cs | 0 .../FixCommonErrors/FixContinuationStyle.cs | 0 .../Forms/FixCommonErrors/FixDanishLetterI.cs | 0 .../FixCommonErrors/FixDialogsOnOneLine.cs | 0 .../FixCommonErrors/FixDoubleApostrophes.cs | 0 .../Forms/FixCommonErrors/FixDoubleDash.cs | 0 .../FixCommonErrors/FixDoubleGreaterThan.cs | 0 .../Forms/FixCommonErrors/FixEllipsesStart.cs | 0 .../Forms/FixCommonErrors/FixEmptyLines.cs | 0 .../FixCommonErrors/FixHyphensInDialog.cs | 0 .../FixHyphensRemoveDashSingleLine.cs | 0 .../FixCommonErrors/FixInvalidItalicTags.cs | 0 .../FixCommonErrors/FixLongDisplayTimes.cs | 0 .../Forms/FixCommonErrors/FixLongLines.cs | 0 .../FixCommonErrors/FixMissingOpenBracket.cs | 0 .../FixMissingPeriodsAtEndOfLine.cs | 0 .../Forms/FixCommonErrors/FixMissingSpaces.cs | 1030 +- .../Forms/FixCommonErrors/FixMusicNotation.cs | 0 .../FixOverlappingDisplayTimes.cs | 0 .../FixCommonErrors/FixShortDisplayTimes.cs | 378 +- .../Forms/FixCommonErrors/FixShortGaps.cs | 0 .../Forms/FixCommonErrors/FixShortLines.cs | 0 .../Forms/FixCommonErrors/FixShortLinesAll.cs | 0 ...nishInvertedQuestionAndExclamationMarks.cs | 0 .../FixStartWithUppercaseLetterAfterColon.cs | 0 ...xStartWithUppercaseLetterAfterParagraph.cs | 0 ...percaseLetterAfterPeriodInsideParagraph.cs | 0 .../FixTurkishAnsiToUnicode.cs | 0 .../FixUnnecessaryLeadingDots.cs | 0 .../FixCommonErrors/FixUnneededPeriods.cs | 0 .../FixCommonErrors/FixUnneededSpaces.cs | 0 .../FixUppercaseIInsideWords.cs | 0 .../libse}/Forms/FixCommonErrors/Helper.cs | 1188 +- .../FixCommonErrors/HelperContinuation.cs | 0 .../Forms/FixCommonErrors/NormalizeStrings.cs | 0 .../RemoveSpaceBetweenNumbers.cs | 0 .../Forms/MergeLinesWithSameTimeCodes.cs | 0 {libse => src/libse}/Forms/MoveWordUpDown.cs | 0 .../libse}/Forms/RemoveInterjection.cs | 0 {libse => src/libse}/Forms/RemoveTextForHI.cs | 3002 +- .../libse}/Forms/RemoveTextForHISettings.cs | 0 .../libse}/Forms/SplitLongLinesHelper.cs | 0 .../libse}/Grammar/IGrammarDictionary.cs | 0 .../libse}/Grammar/LanguageToolsDictionary.cs | 0 .../libse}/Grammar/LanguageToolsRule.cs | 0 .../libse}/Interfaces/IBinaryParagraph.cs | 0 .../libse}/Interfaces/IBinaryParagraphList.cs | 0 .../Interfaces/IBinaryPersistableSubtitle.cs | 0 {libse => src/libse}/Interfaces/IDoSpell.cs | 12 +- .../libse}/Interfaces/IFixCallbacks.cs | 0 .../libse}/Interfaces/IFixCommonError.cs | 0 .../libse}/Interfaces/IRtfTextConverter.cs | 0 {libse => src/libse}/Language.cs | 6472 +- {libse => src/libse}/LanguageDeserializer.cs | 15187 ++-- {libse => src/libse}/LanguageStructure.cs | 6036 +- {libse => src/libse}/LibSE.csproj | 146 +- .../INetflixQualityChecker.cs | 0 .../NetflixCheckBridgeGaps.cs | 0 .../NetflixCheckDialogHyphenSpace.cs | 0 .../NetflixQualityCheck/NetflixCheckGlyph.cs | 0 .../NetflixCheckItalics.cs | 0 .../NetflixQualityCheck/NetflixCheckMaxCps.cs | 0 .../NetflixCheckMaxDuration.cs | 0 .../NetflixCheckMaxLineLength.cs | 0 .../NetflixCheckMinDuration.cs | 0 .../NetflixCheckNumberOfLines.cs | 0 .../NetflixCheckNumbersOneToTenSpellOut.cs | 0 .../NetflixCheckSceneChange.cs | 0 .../NetflixCheckStartNumberSpellOut.cs | 0 .../NetflixCheckTextForHiUseBrackets.cs | 0 .../NetflixCheckTimedTextFrameRate.cs | 0 .../NetflixCheckTwoFramesGap.cs | 0 .../NetflixCheckWhiteSpace.cs | 0 .../NetflixQualityCheck/NetflixHelper.cs | 0 .../NetflixQualityController.cs | 0 src/libse/Properties/AssemblyInfo.cs | 28 + .../Properties/AssemblyInfo.cs.template | 54 +- .../libse}/Properties/Resources.Designer.cs | 0 .../libse}/Properties/Resources.resx | 0 {libse => src/libse}/Readme.md | 0 .../libse}/Resources/netflix_glyphs2_gz | Bin .../libse}/SpellCheck/SpellCheckWord.cs | 16 +- .../libse}/SpellCheck/SpellCheckWordLists.cs | 1060 +- {libse => src/libse}/SpellCheck/UndoObject.cs | 38 +- {libse => src/libse}/Subtitle.cs | 1452 +- .../libse}/SubtitleFormats/AQTitle.cs | 282 +- .../libse}/SubtitleFormats/AbcIViewer.cs | 240 +- .../SubtitleFormats/AdobeAfterEffectsFTME.cs | 176 +- .../libse}/SubtitleFormats/AdobeEncore.cs | 296 +- .../AdobeEncoreLineTabNewLine.cs | 296 +- .../SubtitleFormats/AdobeEncoreLineTabs.cs | 264 +- .../libse}/SubtitleFormats/AdobeEncoreTabs.cs | 158 +- .../AdobeEncoreWithLineNumbers.cs | 222 +- .../AdobeEncoreWithLineNumbersNtsc.cs | 194 +- .../SubtitleFormats/AdobePremierePrProj.cs | 0 .../AdvancedSubStationAlpha.cs | 4562 +- .../libse}/SubtitleFormats/AribB24Decoder.cs | 0 .../libse}/SubtitleFormats/AribB36.cs | 0 .../libse}/SubtitleFormats/AvidCaption.cs | 254 +- .../libse}/SubtitleFormats/AvidDvd.cs | 310 +- .../libse}/SubtitleFormats/AvidStl.cs | 388 +- .../SubtitleFormats/AwsTranscribeJson.cs | 0 {libse => src/libse}/SubtitleFormats/Ayato.cs | 732 +- .../libse}/SubtitleFormats/BdnXml.cs | 224 +- .../SubtitleFormats/BelleNuitSubtitler.cs | 776 +- .../libse}/SubtitleFormats/Bilibili.cs | 0 .../libse}/SubtitleFormats/CapMakerPlus.cs | 554 +- .../libse}/SubtitleFormats/Cappella.cs | 0 .../SubtitleFormats/CaptionAssistant.cs | 312 +- .../libse}/SubtitleFormats/Captionate.cs | 330 +- .../libse}/SubtitleFormats/CaptionateMs.cs | 290 +- .../libse}/SubtitleFormats/CaptionsInc.cs | 528 +- .../libse}/SubtitleFormats/CaraokeXml.cs | 192 +- .../libse}/SubtitleFormats/Cavena890.cs | 3778 +- .../libse}/SubtitleFormats/CheetahCaption.cs | 734 +- .../SubtitleFormats/CheetahCaptionOld.cs | 198 +- {libse => src/libse}/SubtitleFormats/Chk.cs | 626 +- {libse => src/libse}/SubtitleFormats/Cmaft.cs | 0 {libse => src/libse}/SubtitleFormats/Csv.cs | 192 +- {libse => src/libse}/SubtitleFormats/Csv2.cs | 258 +- {libse => src/libse}/SubtitleFormats/Csv3.cs | 390 +- {libse => src/libse}/SubtitleFormats/Csv4.cs | 0 {libse => src/libse}/SubtitleFormats/Csv5.cs | 0 .../libse}/SubtitleFormats/CsvNuendo.cs | 0 .../libse}/SubtitleFormats/DCinemaInterop.cs | 0 .../SubtitleFormats/DCinemaSmpte2007.cs | 1682 +- .../SubtitleFormats/DCinemaSmpte2010.cs | 1708 +- .../SubtitleFormats/DCinemaSmpte2014.cs | 0 .../libse}/SubtitleFormats/DigiBeta.cs | 144 +- {libse => src/libse}/SubtitleFormats/DlDd.cs | 0 {libse => src/libse}/SubtitleFormats/Dost.cs | 208 +- .../libse}/SubtitleFormats/DvSubtitle.cs | 0 .../libse}/SubtitleFormats/DvdStudioPro.cs | 654 +- .../SubtitleFormats/DvdStudioProSpace.cs | 252 +- .../DvdStudioProSpaceGraphic.cs | 0 .../SubtitleFormats/DvdStudioProSpaceOne.cs | 250 +- .../DvdStudioProSpaceOneSemicolon.cs | 0 .../libse}/SubtitleFormats/DvdSubtitle.cs | 278 +- .../SubtitleFormats/DvdSubtitleSystem.cs | 174 +- .../SubtitleFormats/ELRStudioClosedCaption.cs | 288 +- .../libse}/SubtitleFormats/ESubXf.cs | 0 .../SubtitleFormats/EZTSubtitlesProject.cs | 0 {libse => src/libse}/SubtitleFormats/Ebu.cs | 3570 +- {libse => src/libse}/SubtitleFormats/Edl.cs | 282 +- .../libse}/SubtitleFormats/Eeg708.cs | 210 +- .../libse}/SubtitleFormats/ElrPrint.cs | 0 {libse => src/libse}/SubtitleFormats/F4Rtf.cs | 96 +- .../libse}/SubtitleFormats/F4Text.cs | 312 +- {libse => src/libse}/SubtitleFormats/F4Xml.cs | 148 +- .../SubtitleFormats/FLVCoreCuePoints.cs | 286 +- .../libse}/SubtitleFormats/FabSubtitler.cs | 160 +- .../libse}/SubtitleFormats/FilmEditXml.cs | 310 +- .../SubtitleFormats/FinalCutProImage.cs | 214 +- .../SubtitleFormats/FinalCutProTest2Xml.cs | 626 +- .../SubtitleFormats/FinalCutProTextXml.cs | 796 +- .../libse}/SubtitleFormats/FinalCutProXCM.cs | 284 +- .../libse}/SubtitleFormats/FinalCutProXXml.cs | 352 +- .../libse}/SubtitleFormats/FinalCutProXml.cs | 1314 +- .../SubtitleFormats/FinalCutProXml13.cs | 400 +- .../SubtitleFormats/FinalCutProXml14.cs | 376 +- .../SubtitleFormats/FinalCutProXml14Text.cs | 418 +- .../SubtitleFormats/FinalCutProXml15.cs | 0 .../SubtitleFormats/FinalCutProXml16.cs | 0 .../SubtitleFormats/FinalCutProXml17.cs | 0 .../SubtitleFormats/FinalCutProXml18.cs | 0 .../SubtitleFormats/FinalCutProXmlGap.cs | 298 +- .../SubtitleFormats/FinalDraftTemplate2.cs | 0 .../libse}/SubtitleFormats/FlashXml.cs | 352 +- .../libse}/SubtitleFormats/Footage.cs | 340 +- .../libse}/SubtitleFormats/GooglePlayJson.cs | 0 .../libse}/SubtitleFormats/GpacTtxt.cs | 240 +- .../libse}/SubtitleFormats/Gremots.cs | 0 .../libse}/SubtitleFormats/HollyStarJson.cs | 0 .../libse}/SubtitleFormats/HtmlSamiArray.cs | 202 +- .../libse}/SubtitleFormats/IaiSub.cs | 314 +- {libse => src/libse}/SubtitleFormats/Idx.cs | 284 +- .../SubtitleFormats/ImageLogicAutocaption.cs | 254 +- .../libse}/SubtitleFormats/InqScribe.cs | 0 .../libse}/SubtitleFormats/IsmtDfxp.cs | 0 .../libse}/SubtitleFormats/IssXml.cs | 382 +- .../libse}/SubtitleFormats/ItunesTimedText.cs | 754 +- .../libse}/SubtitleFormats/JacoSub.cs | 0 {libse => src/libse}/SubtitleFormats/Json.cs | 830 +- .../libse}/SubtitleFormats/JsonTed.cs | 0 .../libse}/SubtitleFormats/JsonType10.cs | 0 .../libse}/SubtitleFormats/JsonType11.cs | 0 .../libse}/SubtitleFormats/JsonType12.cs | 0 .../libse}/SubtitleFormats/JsonType13.cs | 0 .../libse}/SubtitleFormats/JsonType14.cs | 0 .../libse}/SubtitleFormats/JsonType15.cs | 0 .../libse}/SubtitleFormats/JsonType16.cs | 0 .../libse}/SubtitleFormats/JsonType17.cs | 0 .../libse}/SubtitleFormats/JsonType18.cs | 0 .../libse}/SubtitleFormats/JsonType2.cs | 158 +- .../libse}/SubtitleFormats/JsonType3.cs | 168 +- .../libse}/SubtitleFormats/JsonType4.cs | 174 +- .../libse}/SubtitleFormats/JsonType5.cs | 354 +- .../libse}/SubtitleFormats/JsonType6.cs | 370 +- .../libse}/SubtitleFormats/JsonType7.cs | 0 .../libse}/SubtitleFormats/JsonType8.cs | 0 .../libse}/SubtitleFormats/JsonType8b.cs | 0 .../libse}/SubtitleFormats/JsonType9.cs | 0 .../SubtitleFormats/JsonTypeOnlyLoad1.cs | 0 .../libse}/SubtitleFormats/KanopyHtml.cs | 0 .../SubtitleFormats/KaraokeCdgCreatorText.cs | 0 .../libse}/SubtitleFormats/LambdaCap.cs | 0 {libse => src/libse}/SubtitleFormats/Lrc.cs | 570 +- .../libse}/SubtitleFormats/MPlayer2.cs | 346 +- .../libse}/SubtitleFormats/MacCaption.cs | 426 +- .../libse}/SubtitleFormats/MacSub.cs | 0 .../libse}/SubtitleFormats/MediaTransData.cs | 0 .../libse}/SubtitleFormats/MicroDvd.cs | 1256 +- .../SubtitleFormats/MidwayInscriberCGX.cs | 184 +- .../SubtitleFormats/MsOfficeWorkbook.cs | 0 .../libse}/SubtitleFormats/NciCaption.cs | 506 +- .../SubtitleFormats/NciTimedRollUpCaptions.cs | 320 +- .../SubtitleFormats/NetflixImsc11Japanese.cs | 0 .../SubtitleFormats/NetflixTimedText.cs | 0 .../libse}/SubtitleFormats/OgmChapters.cs | 0 .../libse}/SubtitleFormats/OpenDvt.cs | 370 +- .../libse}/SubtitleFormats/Oresme.cs | 220 +- .../SubtitleFormats/OresmeDocXDocument.cs | 548 +- .../libse}/SubtitleFormats/OtterAi.cs | 0 {libse => src/libse}/SubtitleFormats/PE2.cs | 314 +- .../libse}/SubtitleFormats/PListCaption.cs | 330 +- {libse => src/libse}/SubtitleFormats/Pac.cs | 4584 +- .../libse}/SubtitleFormats/PacUnicode.cs | 790 +- .../libse}/SubtitleFormats/PhoenixSubtitle.cs | 0 .../SubtitleFormats/PinnacleImpression.cs | 236 +- .../SubtitleFormats/PlayCaptionsFreeEditor.cs | 0 {libse => src/libse}/SubtitleFormats/Pns.cs | 330 +- .../SubtitleFormats/ProjectionSubtitleList.cs | 0 .../SubtitleFormats/QubeMasterImport.cs | 270 +- .../libse}/SubtitleFormats/QuickTimeText.cs | 288 +- .../libse}/SubtitleFormats/RealTime.cs | 190 +- .../libse}/SubtitleFormats/RhozetHarmonic.cs | 326 +- {libse => src/libse}/SubtitleFormats/Rtf1.cs | 0 {libse => src/libse}/SubtitleFormats/Rtf2.cs | 0 {libse => src/libse}/SubtitleFormats/Sami.cs | 1078 +- .../libse}/SubtitleFormats/SamiAvDicPlayer.cs | 0 .../libse}/SubtitleFormats/SamiModern.cs | 18 +- .../libse}/SubtitleFormats/SamiYouTube.cs | 18 +- .../libse}/SubtitleFormats/SatBoxPng.cs | 188 +- .../libse}/SubtitleFormats/Scenarist.cs | 190 +- .../ScenaristClosedCaptions.cs | 2408 +- .../ScenaristClosedCaptionsDropFrame.cs | 36 +- .../SubtitleFormats/SeImageHtmlIndex.cs | 174 +- .../SubtitleFormats/SmilTimesheetData.cs | 472 +- .../libse}/SubtitleFormats/SmpteTt2052.cs | 0 .../libse}/SubtitleFormats/SoftNiColonSub.cs | 458 +- .../libse}/SubtitleFormats/SoftNiSub.cs | 456 +- {libse => src/libse}/SubtitleFormats/Son.cs | 136 +- .../SubtitleFormats/SonicScenaristBitmaps.cs | 186 +- .../SubtitleFormats/SonyDVDArchitect.cs | 190 +- .../SonyDVDArchitectExplicitDuration.cs | 198 +- .../SonyDVDArchitectLineAndDuration.cs | 220 +- .../SonyDVDArchitectLineDurationLength.cs | 220 +- .../SubtitleFormats/SonyDVDArchitectTabs.cs | 190 +- .../SonyDVDArchitectWithLineNumbers.cs | 254 +- .../libse}/SubtitleFormats/Speechmatics.cs | 0 .../libse}/SubtitleFormats/Spruce.cs | 430 +- .../libse}/SubtitleFormats/SpruceWithSpace.cs | 392 +- {libse => src/libse}/SubtitleFormats/Spt.cs | 354 +- {libse => src/libse}/SubtitleFormats/Sptx.cs | 0 .../libse}/SubtitleFormats/SpuImage.cs | 0 .../SubtitleFormats/StructuredTitles.cs | 382 +- .../libse}/SubtitleFormats/SubRip.cs | 998 +- .../libse}/SubtitleFormats/SubStationAlpha.cs | 1476 +- .../libse}/SubtitleFormats/SubUrbia.cs | 0 .../libse}/SubtitleFormats/SubViewer10.cs | 252 +- .../libse}/SubtitleFormats/SubViewer20.cs | 322 +- .../SubtitleFormats/SubtitleEditorProject.cs | 316 +- .../libse}/SubtitleFormats/SubtitleFormat.cs | 1322 +- .../SubtitleFormats/SwiftInterchange2.cs | 452 +- .../libse}/SubtitleFormats/SwiftText.cs | 396 +- .../SubtitleFormats/SwiftTextLineNoAndDur.cs | 370 +- .../SubtitleFormats/SwiftTextLineNumber.cs | 350 +- .../libse}/SubtitleFormats/TMPlayer.cs | 264 +- {libse => src/libse}/SubtitleFormats/TSB4.cs | 302 +- {libse => src/libse}/SubtitleFormats/Ted20.cs | 0 {libse => src/libse}/SubtitleFormats/Tek.cs | 214 +- .../libse}/SubtitleFormats/TextST.cs | 2378 +- .../libse}/SubtitleFormats/TimeCodesOnly1.cs | 0 .../libse}/SubtitleFormats/TimeCodesOnly2.cs | 0 .../libse}/SubtitleFormats/TimeXml.cs | 190 +- .../libse}/SubtitleFormats/TimeXml2.cs | 218 +- .../libse}/SubtitleFormats/TimedText.cs | 808 +- .../libse}/SubtitleFormats/TimedText10.cs | 2980 +- .../libse}/SubtitleFormats/TimedText200604.cs | 522 +- .../SubtitleFormats/TimedText200604CData.cs | 24 +- .../SubtitleFormats/TimedText200604Ooyala.cs | 0 .../libse}/SubtitleFormats/TimedTextImage.cs | 502 +- .../libse}/SubtitleFormats/TimelineAscii.cs | 432 +- .../SubtitleFormats/TimelineFootageAscii.cs | 398 +- .../libse}/SubtitleFormats/TimelineMvt.cs | 312 +- .../SubtitleFormats/TitleExchangePro.cs | 250 +- {libse => src/libse}/SubtitleFormats/Titra.cs | 234 +- .../libse}/SubtitleFormats/TmpegEncAW5.cs | 164 +- .../libse}/SubtitleFormats/TmpegEncText.cs | 190 +- .../libse}/SubtitleFormats/TmpegEncXml.cs | 776 +- {libse => src/libse}/SubtitleFormats/Tmx14.cs | 284 +- .../libse}/SubtitleFormats/TranscriberXml.cs | 252 +- .../SubtitleFormats/TranscriptiveJson.cs | 0 .../libse}/SubtitleFormats/TurboTitler.cs | 180 +- .../libse}/SubtitleFormats/TwentyThreeJson.cs | 0 .../SubtitleFormats/TwentyThreeJsonEmbed.cs | 0 .../TwentyThreeJsonEmbedWebSrt.cs | 0 .../libse}/SubtitleFormats/Tx3gTextOnly.cs | 0 .../libse}/SubtitleFormats/UTSubtitleXml.cs | 198 +- .../SubtitleFormats/UleadSubtitleFormat.cs | 256 +- .../libse}/SubtitleFormats/Ultech130.cs | 594 +- .../UniversalSubtitleFormat.cs | 332 +- .../SubtitleFormats/UnknownSubtitle1.cs | 224 +- .../SubtitleFormats/UnknownSubtitle10.cs | 240 +- .../SubtitleFormats/UnknownSubtitle100.cs | 0 .../SubtitleFormats/UnknownSubtitle101.cs | 0 .../SubtitleFormats/UnknownSubtitle11.cs | 568 +- .../SubtitleFormats/UnknownSubtitle12.cs | 182 +- .../SubtitleFormats/UnknownSubtitle13.cs | 240 +- .../SubtitleFormats/UnknownSubtitle14.cs | 202 +- .../SubtitleFormats/UnknownSubtitle15.cs | 220 +- .../SubtitleFormats/UnknownSubtitle16.cs | 84 +- .../SubtitleFormats/UnknownSubtitle17.cs | 362 +- .../SubtitleFormats/UnknownSubtitle18.cs | 306 +- .../SubtitleFormats/UnknownSubtitle19.cs | 224 +- .../SubtitleFormats/UnknownSubtitle2.cs | 284 +- .../SubtitleFormats/UnknownSubtitle20.cs | 306 +- .../SubtitleFormats/UnknownSubtitle21.cs | 254 +- .../SubtitleFormats/UnknownSubtitle22.cs | 200 +- .../SubtitleFormats/UnknownSubtitle23.cs | 248 +- .../SubtitleFormats/UnknownSubtitle24.cs | 100 +- .../SubtitleFormats/UnknownSubtitle25.cs | 248 +- .../SubtitleFormats/UnknownSubtitle26.cs | 246 +- .../SubtitleFormats/UnknownSubtitle27.cs | 232 +- .../SubtitleFormats/UnknownSubtitle28.cs | 234 +- .../SubtitleFormats/UnknownSubtitle29.cs | 172 +- .../SubtitleFormats/UnknownSubtitle3.cs | 142 +- .../SubtitleFormats/UnknownSubtitle30.cs | 300 +- .../SubtitleFormats/UnknownSubtitle31.cs | 304 +- .../SubtitleFormats/UnknownSubtitle32.cs | 320 +- .../SubtitleFormats/UnknownSubtitle33.cs | 284 +- .../SubtitleFormats/UnknownSubtitle34.cs | 254 +- .../SubtitleFormats/UnknownSubtitle35.cs | 194 +- .../SubtitleFormats/UnknownSubtitle36.cs | 196 +- .../SubtitleFormats/UnknownSubtitle37.cs | 100 +- .../SubtitleFormats/UnknownSubtitle38.cs | 192 +- .../SubtitleFormats/UnknownSubtitle39.cs | 100 +- .../SubtitleFormats/UnknownSubtitle4.cs | 288 +- .../SubtitleFormats/UnknownSubtitle40.cs | 174 +- .../SubtitleFormats/UnknownSubtitle41.cs | 220 +- .../SubtitleFormats/UnknownSubtitle42.cs | 218 +- .../SubtitleFormats/UnknownSubtitle43.cs | 342 +- .../SubtitleFormats/UnknownSubtitle44.cs | 272 +- .../SubtitleFormats/UnknownSubtitle45.cs | 240 +- .../SubtitleFormats/UnknownSubtitle46.cs | 186 +- .../SubtitleFormats/UnknownSubtitle47.cs | 176 +- .../SubtitleFormats/UnknownSubtitle48.cs | 182 +- .../SubtitleFormats/UnknownSubtitle49.cs | 310 +- .../SubtitleFormats/UnknownSubtitle5.cs | 198 +- .../SubtitleFormats/UnknownSubtitle50.cs | 354 +- .../SubtitleFormats/UnknownSubtitle51.cs | 200 +- .../SubtitleFormats/UnknownSubtitle52.cs | 278 +- .../SubtitleFormats/UnknownSubtitle53.cs | 222 +- .../SubtitleFormats/UnknownSubtitle54.cs | 266 +- .../SubtitleFormats/UnknownSubtitle55.cs | 248 +- .../SubtitleFormats/UnknownSubtitle56.cs | 224 +- .../SubtitleFormats/UnknownSubtitle57.cs | 148 +- .../SubtitleFormats/UnknownSubtitle58.cs | 228 +- .../SubtitleFormats/UnknownSubtitle59.cs | 380 +- .../SubtitleFormats/UnknownSubtitle6.cs | 254 +- .../SubtitleFormats/UnknownSubtitle60.cs | 298 +- .../SubtitleFormats/UnknownSubtitle61.cs | 292 +- .../SubtitleFormats/UnknownSubtitle62.cs | 218 +- .../SubtitleFormats/UnknownSubtitle63.cs | 236 +- .../SubtitleFormats/UnknownSubtitle64.cs | 292 +- .../SubtitleFormats/UnknownSubtitle65.cs | 220 +- .../SubtitleFormats/UnknownSubtitle66.cs | 244 +- .../SubtitleFormats/UnknownSubtitle67.cs | 214 +- .../SubtitleFormats/UnknownSubtitle68.cs | 378 +- .../SubtitleFormats/UnknownSubtitle69.cs | 200 +- .../SubtitleFormats/UnknownSubtitle7.cs | 256 +- .../SubtitleFormats/UnknownSubtitle70.cs | 1250 +- .../SubtitleFormats/UnknownSubtitle71.cs | 428 +- .../SubtitleFormats/UnknownSubtitle72.cs | 242 +- .../SubtitleFormats/UnknownSubtitle73.cs | 212 +- .../SubtitleFormats/UnknownSubtitle74.cs | 282 +- .../SubtitleFormats/UnknownSubtitle75.cs | 258 +- .../SubtitleFormats/UnknownSubtitle76.cs | 208 +- .../SubtitleFormats/UnknownSubtitle77.cs | 152 +- .../SubtitleFormats/UnknownSubtitle78.cs | 398 +- .../SubtitleFormats/UnknownSubtitle79.cs | 292 +- .../SubtitleFormats/UnknownSubtitle8.cs | 220 +- .../SubtitleFormats/UnknownSubtitle80.cs | 158 +- .../SubtitleFormats/UnknownSubtitle81.cs | 316 +- .../SubtitleFormats/UnknownSubtitle82.cs | 164 +- .../SubtitleFormats/UnknownSubtitle83.cs | 0 .../SubtitleFormats/UnknownSubtitle84.cs | 0 .../SubtitleFormats/UnknownSubtitle85.cs | 0 .../SubtitleFormats/UnknownSubtitle86.cs | 0 .../SubtitleFormats/UnknownSubtitle87.cs | 0 .../SubtitleFormats/UnknownSubtitle88.cs | 0 .../SubtitleFormats/UnknownSubtitle89.cs | 0 .../SubtitleFormats/UnknownSubtitle9.cs | 220 +- .../SubtitleFormats/UnknownSubtitle90.cs | 0 .../SubtitleFormats/UnknownSubtitle91.cs | 0 .../SubtitleFormats/UnknownSubtitle92.cs | 0 .../SubtitleFormats/UnknownSubtitle93.cs | 0 .../SubtitleFormats/UnknownSubtitle94.cs | 0 .../SubtitleFormats/UnknownSubtitle95.cs | 0 .../SubtitleFormats/UnknownSubtitle96.cs | 0 .../SubtitleFormats/UnknownSubtitle97.cs | 0 .../SubtitleFormats/UnknownSubtitle98.cs | 0 .../SubtitleFormats/UnknownSubtitle99.cs | 0 {libse => src/libse}/SubtitleFormats/Utx.cs | 172 +- .../libse}/SubtitleFormats/UtxFrames.cs | 176 +- .../libse}/SubtitleFormats/VidIcelandic.cs | 0 .../libse}/SubtitleFormats/VocapiaSplit.cs | 282 +- .../libse}/SubtitleFormats/WebVTT.cs | 1720 +- .../WebVTTFileWithLineNumber.cs | 338 +- .../libse}/SubtitleFormats/WinCaps32.cs | 0 {libse => src/libse}/SubtitleFormats/Wsb.cs | 200 +- {libse => src/libse}/SubtitleFormats/Xif.cs | 424 +- {libse => src/libse}/SubtitleFormats/Xmp.cs | 0 .../SubtitleFormats/YouTubeAnnotations.cs | 506 +- .../libse}/SubtitleFormats/YouTubeSbv.cs | 358 +- .../SubtitleFormats/YouTubeTranscript.cs | 192 +- .../YouTubeTranscriptOneLine.cs | 152 +- {libse => src/libse}/SubtitleFormats/ZeroG.cs | 166 +- {libse => src/libse}/Translate/Formatting.cs | 0 .../libse}/Translate/GoogleTranslator1.cs | 0 .../libse}/Translate/GoogleTranslator2.cs | 0 .../libse}/Translate/GoogleTranslator3.cs | 0 {libse => src/libse}/Translate/ITranslator.cs | 0 .../libse}/Translate/MicrosoftTranslator.cs | 0 .../libse}/Translate/TranslationHelper.cs | 0 .../libse}/Translate/TranslationPair.cs | 0 {libse => src/libse}/VobSub/Helper.cs | 0 {libse => src/libse}/VobSub/Idx.cs | 0 {libse => src/libse}/VobSub/IdxParagraph.cs | 0 {libse => src/libse}/VobSub/Mpeg2Header.cs | 0 .../VobSub/PacketizedElementaryStream.cs | 0 {libse => src/libse}/VobSub/SpHeader.cs | 0 {libse => src/libse}/VobSub/SubPicture.cs | 0 .../libse}/VobSub/VobSubMergedPack.cs | 0 {libse => src/libse}/VobSub/VobSubPack.cs | 0 {libse => src/libse}/VobSub/VobSubParser.cs | 0 {libse => src/libse}/VobSub/VobSubWriter.cs | 0 .../Controls/AudioVisualizer.Designer.cs | 112 +- src/{ => ui}/Controls/AudioVisualizer.cs | 5162 +- src/{ => ui}/Controls/AudioVisualizer.resx | 238 +- src/{ => ui}/Controls/SETextBox.cs | 2180 +- src/{ => ui}/Controls/SubtitleListView.cs | 4154 +- src/{ => ui}/Controls/TimeUpDown.Designer.cs | 156 +- src/{ => ui}/Controls/TimeUpDown.cs | 686 +- .../Controls/TimeUpDown.resx} | 0 src/{ => ui}/Controls/VideoPlayerContainer.cs | 4222 +- .../Controls/VideoPlayerContainer.resx | 1228 +- src/{ => ui}/DLLs/Interop.QuartzTypeLib.dll | Bin src/{ => ui}/DLLs/Voikkox64.dll | Bin src/{ => ui}/DLLs/Voikkox86.dll | Bin src/{ => ui}/Forms/About.Designer.cs | 314 +- src/{ => ui}/Forms/About.cs | 242 +- src/{ => ui}/Forms/About.resx | 388 +- src/{ => ui}/Forms/AddToNames.Designer.cs | 244 +- src/{ => ui}/Forms/AddToNames.cs | 232 +- .../Forms/AddToNames.resx} | 0 src/{ => ui}/Forms/AddToUserDic.Designer.cs | 264 +- src/{ => ui}/Forms/AddToUserDic.cs | 180 +- .../Forms/AddToUserDic.resx} | 0 src/{ => ui}/Forms/AddWaveform.Designer.cs | 0 src/{ => ui}/Forms/AddWaveform.cs | 982 +- src/{ => ui}/Forms/AddWaveform.resx | 0 .../Forms/AddWaveformBatch.Designer.cs | 0 src/{ => ui}/Forms/AddWaveformBatch.cs | 0 src/{ => ui}/Forms/AddWaveformBatch.resx | 0 .../Forms/AdjustDisplayDuration.Designer.cs | 796 +- src/{ => ui}/Forms/AdjustDisplayDuration.cs | 396 +- src/{ => ui}/Forms/AdjustDisplayDuration.resx | 238 +- .../Forms/AlignmentPicker.Designer.cs | 354 +- src/{ => ui}/Forms/AlignmentPicker.cs | 290 +- .../Forms/AlignmentPicker.resx} | 0 .../Forms/AlignmentPickerJapanese.Designer.cs | 0 src/{ => ui}/Forms/AlignmentPickerJapanese.cs | 0 .../Forms/AlignmentPickerJapanese.resx} | 0 .../Forms/ApplyDurationLimits.Designer.cs | 718 +- src/{ => ui}/Forms/ApplyDurationLimits.cs | 632 +- .../Forms/ApplyDurationLimits.resx} | 0 src/{ => ui}/Forms/AudioToText.Designer.cs | 0 src/{ => ui}/Forms/AudioToText.cs | 0 .../Forms/AudioToText.resx} | 0 .../Forms/AutoBreakUnbreakLines.Designer.cs | 418 +- src/{ => ui}/Forms/AutoBreakUnbreakLines.cs | 514 +- .../Forms/AutoBreakUnbreakLines.resx} | 0 src/{ => ui}/Forms/BatchConvert.Designer.cs | 3242 +- src/{ => ui}/Forms/BatchConvert.cs | 5952 +- src/{ => ui}/Forms/BatchConvert.resx | 262 +- .../Forms/BatchConvertMkvEnding.Designer.cs | 0 src/{ => ui}/Forms/BatchConvertMkvEnding.cs | 0 .../Forms/BatchConvertMkvEnding.resx} | 0 .../Forms/BatchConvertTsSettings.Designer.cs | 0 src/{ => ui}/Forms/BatchConvertTsSettings.cs | 0 .../Forms/BatchConvertTsSettings.resx | 0 src/{ => ui}/Forms/Beamer.Designer.cs | 724 +- src/{ => ui}/Forms/Beamer.cs | 1534 +- src/{ => ui}/Forms/Beamer.resx | 250 +- src/{ => ui}/Forms/BookmarkAdd.Designer.cs | 0 src/{ => ui}/Forms/BookmarkAdd.cs | 0 .../Forms/BookmarkAdd.resx} | 0 src/{ => ui}/Forms/BookmarksGoTo.Designer.cs | 0 src/{ => ui}/Forms/BookmarksGoTo.cs | 0 .../Forms/BookmarksGoTo.resx} | 0 .../Forms/Cavena890SaveOptions.Designer.cs | 538 +- src/{ => ui}/Forms/Cavena890SaveOptions.cs | 366 +- src/{ => ui}/Forms/Cavena890SaveOptions.resx | 244 +- src/{ => ui}/Forms/ChangeCasing.Designer.cs | 378 +- src/{ => ui}/Forms/ChangeCasing.cs | 222 +- src/{ => ui}/Forms/ChangeCasing.resx | 238 +- .../Forms/ChangeCasingNames.Designer.cs | 702 +- src/{ => ui}/Forms/ChangeCasingNames.cs | 714 +- src/{ => ui}/Forms/ChangeCasingNames.resx | 250 +- .../Forms/ChangeFrameRate.Designer.cs | 374 +- src/{ => ui}/Forms/ChangeFrameRate.cs | 248 +- src/{ => ui}/Forms/ChangeFrameRate.resx | 244 +- .../Forms/ChangeSpeedInPercent.Designer.cs | 428 +- src/{ => ui}/Forms/ChangeSpeedInPercent.cs | 240 +- .../Forms/ChangeSpeedInPercent.resx} | 0 .../Forms/CheckForUpdates.Designer.cs | 0 src/{ => ui}/Forms/CheckForUpdates.cs | 0 src/{ => ui}/Forms/CheckForUpdates.resx | 0 .../Forms/ChooseAudioTrack.Designer.cs | 220 +- src/{ => ui}/Forms/ChooseAudioTrack.cs | 108 +- .../Forms/ChooseAudioTrack.resx} | 0 src/{ => ui}/Forms/ChooseEncoding.Designer.cs | 386 +- src/{ => ui}/Forms/ChooseEncoding.cs | 336 +- src/{ => ui}/Forms/ChooseEncoding.resx | 238 +- src/{ => ui}/Forms/ChooseFontName.Designer.cs | 0 src/{ => ui}/Forms/ChooseFontName.cs | 0 .../Forms/ChooseFontName.resx} | 0 src/{ => ui}/Forms/ChooseLanguage.Designer.cs | 216 +- src/{ => ui}/Forms/ChooseLanguage.cs | 288 +- src/{ => ui}/Forms/ChooseLanguage.resx | 238 +- .../Forms/ChooseResolution.Designer.cs | 344 +- src/{ => ui}/Forms/ChooseResolution.cs | 126 +- src/{ => ui}/Forms/ChooseResolution.resx | 244 +- src/{ => ui}/Forms/ChooseStyle.Designer.cs | 332 +- src/{ => ui}/Forms/ChooseStyle.cs | 168 +- .../Forms/ChooseStyle.resx} | 0 src/{ => ui}/Forms/ColorChooser.cs | 0 src/{ => ui}/Forms/ColorChooser.resx | 0 src/{ => ui}/Forms/ColumnPaste.Designer.cs | 402 +- src/{ => ui}/Forms/ColumnPaste.cs | 240 +- .../Forms/ColumnPaste.resx} | 0 src/{ => ui}/Forms/Compare.Designer.cs | 782 +- src/{ => ui}/Forms/Compare.cs | 2312 +- src/{ => ui}/Forms/Compare.resx | 268 +- .../DCinemaPropertiesInterop.Designer.cs | 0 .../Forms/DCinema/DCinemaPropertiesInterop.cs | 0 .../DCinema/DCinemaPropertiesInterop.resx | 0 .../DCinemaPropertiesSmpte.Designer.cs | 0 .../Forms/DCinema/DCinemaPropertiesSmpte.cs | 0 .../Forms/DCinema/DCinemaPropertiesSmpte.resx | 0 .../Forms/DialogDoNotShowAgain.Designer.cs | 0 src/{ => ui}/Forms/DialogDoNotShowAgain.cs | 0 .../Forms/DialogDoNotShowAgain.resx} | 0 .../Forms/DoNotBreakAfterListEdit.Designer.cs | 426 +- src/{ => ui}/Forms/DoNotBreakAfterListEdit.cs | 492 +- .../Forms/DoNotBreakAfterListEdit.resx} | 0 src/{ => ui}/Forms/DownloadFfmpeg.Designer.cs | 0 src/{ => ui}/Forms/DownloadFfmpeg.cs | 0 .../Forms/DownloadFfmpeg.resx} | 0 .../Forms/DurationsBridgeGaps.Designer.cs | 520 +- src/{ => ui}/Forms/DurationsBridgeGaps.cs | 510 +- .../Forms/DurationsBridgeGaps.resx} | 0 .../Forms/DvdStudioProProperties.Designer.cs | 0 src/{ => ui}/Forms/DvdStudioProProperties.cs | 0 .../Forms/DvdStudioProProperties.resx} | 0 src/{ => ui}/Forms/DvdSubRip.Designer.cs | 652 +- src/{ => ui}/Forms/DvdSubRip.cs | 1202 +- src/{ => ui}/Forms/DvdSubRip.resx | 244 +- .../Forms/DvdSubRipChooseLanguage.Designer.cs | 350 +- src/{ => ui}/Forms/DvdSubRipChooseLanguage.cs | 444 +- .../Forms/DvdSubRipChooseLanguage.resx} | 0 src/{ => ui}/Forms/EbuColorPicker.Designer.cs | 0 src/{ => ui}/Forms/EbuColorPicker.cs | 0 .../Forms/EbuColorPicker.resx} | 0 .../Forms/EbuLanguageCode.Designer.cs | 0 src/{ => ui}/Forms/EbuLanguageCode.cs | 0 .../Forms/EbuLanguageCode.resx} | 0 src/{ => ui}/Forms/EbuSaveOptions.Designer.cs | 2080 +- src/{ => ui}/Forms/EbuSaveOptions.cs | 1094 +- src/{ => ui}/Forms/EbuSaveOptions.resx | 250 +- src/{ => ui}/Forms/EffectKaraoke.Designer.cs | 462 +- src/{ => ui}/Forms/EffectKaraoke.cs | 910 +- src/{ => ui}/Forms/EffectKaraoke.resx | 250 +- .../Forms/EffectTypewriter.Designer.cs | 362 +- src/{ => ui}/Forms/EffectTypewriter.cs | 816 +- src/{ => ui}/Forms/EffectTypewriter.resx | 244 +- .../Forms/ExportCustomText.Designer.cs | 590 +- src/{ => ui}/Forms/ExportCustomText.cs | 782 +- src/{ => ui}/Forms/ExportCustomText.resx | 250 +- .../Forms/ExportCustomTextFormat.Designer.cs | 1042 +- src/{ => ui}/Forms/ExportCustomTextFormat.cs | 802 +- .../Forms/ExportCustomTextFormat.resx | 256 +- .../Forms/ExportFcpXmlAdvanced.Designer.cs | 0 src/{ => ui}/Forms/ExportFcpXmlAdvanced.cs | 0 src/{ => ui}/Forms/ExportFcpXmlAdvanced.resx | 0 src/{ => ui}/Forms/ExportPngXml.Designer.cs | 2348 +- src/{ => ui}/Forms/ExportPngXml.cs | 11840 ++-- src/{ => ui}/Forms/ExportPngXml.resx | 268 +- .../ExportPngXmlDialogOpenFolder.Designer.cs | 0 .../Forms/ExportPngXmlDialogOpenFolder.cs | 0 .../Forms/ExportPngXmlDialogOpenFolder.resx} | 0 .../Forms/ExportPngXmlPreview.Designer.cs | 0 src/{ => ui}/Forms/ExportPngXmlPreview.cs | 0 .../Forms/ExportPngXmlPreview.resx} | 0 src/{ => ui}/Forms/ExportText.Designer.cs | 820 +- src/{ => ui}/Forms/ExportText.cs | 650 +- src/{ => ui}/Forms/ExportText.resx | 244 +- src/{ => ui}/Forms/ExportTextST.Designer.cs | 4274 +- src/{ => ui}/Forms/ExportTextST.cs | 1660 +- src/{ => ui}/Forms/ExportTextST.resx | 280 +- .../Forms/ExtractDateTimeInfo.Designer.cs | 546 +- src/{ => ui}/Forms/ExtractDateTimeInfo.cs | 300 +- src/{ => ui}/Forms/ExtractDateTimeInfo.resx | 244 +- src/{ => ui}/Forms/FcpProperties.Designer.cs | 302 +- src/{ => ui}/Forms/FcpProperties.cs | 100 +- .../Forms/FcpProperties.resx} | 0 src/{ => ui}/Forms/FindDialog.Designer.cs | 380 +- src/{ => ui}/Forms/FindDialog.cs | 486 +- src/{ => ui}/Forms/FindDialog.resx | 238 +- .../Forms/FindSubtitleLine.Designer.cs | 314 +- src/{ => ui}/Forms/FindSubtitleLine.cs | 414 +- src/{ => ui}/Forms/FindSubtitleLine.resx | 238 +- .../Forms/FixCommonErrors.Designer.cs | 1778 +- src/{ => ui}/Forms/FixCommonErrors.cs | 3954 +- src/{ => ui}/Forms/FixCommonErrors.resx | 256 +- .../Forms/GetDictionaries.Designer.cs | 352 +- src/{ => ui}/Forms/GetDictionaries.cs | 624 +- src/{ => ui}/Forms/GetDictionaries.resx | 238 +- src/{ => ui}/Forms/GoToLine.Designer.cs | 178 +- src/{ => ui}/Forms/GoToLine.cs | 216 +- src/{ => ui}/Forms/GoToLine.resx | 490 +- .../GoogleOrMicrosoftTranslate.Designer.cs | 402 +- .../Forms/GoogleOrMicrosoftTranslate.cs | 352 +- .../Forms/GoogleOrMicrosoftTranslate.resx} | 0 .../Forms/GoogleTranslate.Designer.cs | 500 +- src/{ => ui}/Forms/GoogleTranslate.cs | 1138 +- src/{ => ui}/Forms/GoogleTranslate.resx | 238 +- src/{ => ui}/Forms/HardSubExtract.Designer.cs | 892 +- src/{ => ui}/Forms/HardSubExtract.cs | 682 +- src/{ => ui}/Forms/HardSubExtract.resx | 268 +- src/{ => ui}/Forms/ImportCdg.Designer.cs | 0 src/{ => ui}/Forms/ImportCdg.cs | 0 src/{ => ui}/Forms/ImportCdg.resx | 0 .../Forms/ImportFinalDraft.Designer.cs | 0 src/{ => ui}/Forms/ImportFinalDraft.cs | 0 .../Forms/ImportFinalDraft.resx} | 0 src/{ => ui}/Forms/ImportImages.Designer.cs | 448 +- src/{ => ui}/Forms/ImportImages.cs | 430 +- src/{ => ui}/Forms/ImportImages.resx | 250 +- .../Forms/ImportSceneChanges.Designer.cs | 730 +- src/{ => ui}/Forms/ImportSceneChanges.cs | 790 +- src/{ => ui}/Forms/ImportSceneChanges.resx | 244 +- src/{ => ui}/Forms/ImportText.Designer.cs | 1586 +- src/{ => ui}/Forms/ImportText.cs | 2798 +- src/{ => ui}/Forms/ImportText.resx | 256 +- .../Forms/ImportUnknownFormat.Designer.cs | 530 +- src/{ => ui}/Forms/ImportUnknownFormat.cs | 232 +- src/{ => ui}/Forms/ImportUnknownFormat.resx | 244 +- src/{ => ui}/Forms/Interjections.Designer.cs | 292 +- src/{ => ui}/Forms/Interjections.cs | 318 +- .../Forms/Interjections.resx} | 0 src/{ => ui}/Forms/JoinSubtitles.Designer.cs | 566 +- src/{ => ui}/Forms/JoinSubtitles.cs | 698 +- src/{ => ui}/Forms/JoinSubtitles.resx | 244 +- src/{ => ui}/Forms/Main.Designer.cs | 11394 +-- src/{ => ui}/Forms/Main.cs | 57692 ++++++++-------- src/{ => ui}/Forms/Main.resx | 1518 +- .../Forms/MatroskaSubtitleChooser.Designer.cs | 362 +- src/{ => ui}/Forms/MatroskaSubtitleChooser.cs | 252 +- .../Forms/MatroskaSubtitleChooser.resx | 238 +- .../Forms/MeasurementConverter.Designer.cs | 408 +- src/{ => ui}/Forms/MeasurementConverter.cs | 9814 +-- .../Forms/MeasurementConverter.resx} | 0 .../Forms/MergeDoubleLines.Designer.cs | 514 +- src/{ => ui}/Forms/MergeDoubleLines.cs | 696 +- src/{ => ui}/Forms/MergeDoubleLines.resx | 244 +- .../Forms/MergeShortLines.Designer.cs | 608 +- src/{ => ui}/Forms/MergeShortLines.cs | 652 +- src/{ => ui}/Forms/MergeShortLines.resx | 244 +- .../MergeTextWithSameTimeCodes.Designer.cs | 0 .../Forms/MergeTextWithSameTimeCodes.cs | 0 .../Forms/MergeTextWithSameTimeCodes.resx} | 244 +- .../Forms/ModifySelection.Designer.cs | 768 +- src/{ => ui}/Forms/ModifySelection.cs | 1152 +- src/{ => ui}/Forms/ModifySelection.resx | 244 +- .../Forms/MultipleReplace.Designer.cs | 1618 +- src/{ => ui}/Forms/MultipleReplace.cs | 2618 +- src/{ => ui}/Forms/MultipleReplace.resx | 262 +- .../MultipleReplaceExportImport.Designer.cs | 0 .../Forms/MultipleReplaceExportImport.cs | 0 .../Forms/MultipleReplaceExportImport.resx | 0 .../Forms/MultipleReplaceNewGroup.Designer.cs | 0 src/{ => ui}/Forms/MultipleReplaceNewGroup.cs | 0 .../Forms/MultipleReplaceNewGroup.resx} | 0 .../Forms/NetflixFixErrors.Designer.cs | 0 src/{ => ui}/Forms/NetflixFixErrors.cs | 0 .../Forms/NetflixFixErrors.resx} | 0 .../Forms/Networking/NetworkChat.Designer.cs | 0 src/{ => ui}/Forms/Networking/NetworkChat.cs | 0 .../Forms/Networking/NetworkChat.resx | 0 .../Forms/Networking/NetworkJoin.Designer.cs | 0 src/{ => ui}/Forms/Networking/NetworkJoin.cs | 0 .../Forms/Networking/NetworkJoin.resx} | 0 .../Networking/NetworkLogAndInfo.Designer.cs | 0 .../Forms/Networking/NetworkLogAndInfo.cs | 0 .../Forms/Networking/NetworkLogAndInfo.resx} | 0 .../Forms/Networking/NetworkStart.Designer.cs | 0 src/{ => ui}/Forms/Networking/NetworkStart.cs | 0 .../Forms/Networking/NetworkStart.resx} | 0 .../Forms/NuendoProperties.Designer.cs | 274 +- src/{ => ui}/Forms/NuendoProperties.cs | 198 +- src/{ => ui}/Forms/NuendoProperties.resx | 244 +- .../Forms/Ocr/AddBeterMultiMatch.Designer.cs | 0 src/{ => ui}/Forms/Ocr/AddBeterMultiMatch.cs | 0 .../Forms/Ocr/AddBeterMultiMatch.resx} | 0 .../Ocr/AddBetterMultiMatchNOcr.Designer.cs | 0 .../Forms/Ocr/AddBetterMultiMatchNOcr.cs | 0 .../Forms/Ocr/AddBetterMultiMatchNOcr.resx} | 0 .../Forms/Ocr/AddToOcrReplaceList.Designer.cs | 0 src/{ => ui}/Forms/Ocr/AddToOcrReplaceList.cs | 0 .../Forms/Ocr/AddToOcrReplaceList.resx} | 0 .../Ocr/BinaryOcrChooseEditDb.Designer.cs | 0 .../Forms/Ocr/BinaryOcrChooseEditDb.cs | 0 .../Forms/Ocr/BinaryOcrChooseEditDb.resx} | 238 +- .../Forms/Ocr/BinaryOcrTrain.Designer.cs | 0 src/{ => ui}/Forms/Ocr/BinaryOcrTrain.cs | 0 src/{ => ui}/Forms/Ocr/BinaryOcrTrain.resx | 0 .../Ocr/DownloadTesseract302.Designer.cs | 0 .../Forms/Ocr/DownloadTesseract302.cs | 0 .../Forms/Ocr/DownloadTesseract302.resx} | 238 +- .../Forms/Ocr/DownloadTesseract4.Designer.cs | 0 src/{ => ui}/Forms/Ocr/DownloadTesseract4.cs | 0 .../Forms/Ocr/DownloadTesseract4.resx} | 238 +- .../GetTesseract302Dictionaries.Designer.cs | 0 .../Forms/Ocr/GetTesseract302Dictionaries.cs | 0 .../Ocr/GetTesseract302Dictionaries.resx} | 238 +- .../Ocr/GetTesseractDictionaries.Designer.cs | 0 .../Forms/Ocr/GetTesseractDictionaries.cs | 0 .../Forms/Ocr/GetTesseractDictionaries.resx | 120 + .../Forms/Ocr/OCRSpellCheck.Designer.cs | 0 src/{ => ui}/Forms/Ocr/OCRSpellCheck.cs | 0 .../Forms/Ocr/OCRSpellCheck.resx} | 244 +- .../Ocr/OcrPreprocessingSettings.Designer.cs | 0 .../Forms/Ocr/OcrPreprocessingSettings.cs | 0 .../Forms/Ocr/OcrPreprocessingSettings.resx | 0 .../Forms/Ocr/OcrPreprocessingT4.Designer.cs | 0 src/{ => ui}/Forms/Ocr/OcrPreprocessingT4.cs | 0 .../Forms/Ocr/OcrPreprocessingT4.resx | 0 .../Ocr/VobSubCharactersImport.Designer.cs | 0 .../Forms/Ocr/VobSubCharactersImport.cs | 0 .../Forms/Ocr/VobSubCharactersImport.resx | 0 .../Ocr/VobSubEditCharacters.Designer.cs | 0 .../Forms/Ocr/VobSubEditCharacters.cs | 0 .../Forms/Ocr/VobSubEditCharacters.resx | 0 .../VobSubNOcrCharacterInspect.Designer.cs | 0 .../Forms/Ocr/VobSubNOcrCharacterInspect.cs | 0 .../Forms/Ocr/VobSubNOcrCharacterInspect.resx | 0 .../Forms/Ocr/VobSubNOcrEdit.Designer.cs | 0 src/{ => ui}/Forms/Ocr/VobSubNOcrEdit.cs | 0 src/{ => ui}/Forms/Ocr/VobSubNOcrEdit.resx | 0 .../Forms/Ocr/VobSubNOcrTrain.Designer.cs | 0 src/{ => ui}/Forms/Ocr/VobSubNOcrTrain.cs | 0 src/{ => ui}/Forms/Ocr/VobSubNOcrTrain.resx | 0 src/{ => ui}/Forms/Ocr/VobSubOcr.Designer.cs | 0 src/{ => ui}/Forms/Ocr/VobSubOcr.cs | 0 src/{ => ui}/Forms/Ocr/VobSubOcr.resx | 0 .../Forms/Ocr/VobSubOcrCharacter.Designer.cs | 0 src/{ => ui}/Forms/Ocr/VobSubOcrCharacter.cs | 0 .../Forms/Ocr/VobSubOcrCharacter.resx | 0 .../Ocr/VobSubOcrCharacterInspect.Designer.cs | 0 .../Forms/Ocr/VobSubOcrCharacterInspect.cs | 0 .../Forms/Ocr/VobSubOcrCharacterInspect.resx | 0 .../Ocr/VobSubOcrNOcrCharacter.Designer.cs | 0 .../Forms/Ocr/VobSubOcrNOcrCharacter.cs | 0 .../Forms/Ocr/VobSubOcrNOcrCharacter.resx | 0 .../Forms/Ocr/VobSubOcrNewFolder.Designer.cs | 0 src/{ => ui}/Forms/Ocr/VobSubOcrNewFolder.cs | 0 .../Forms/Ocr/VobSubOcrNewFolder.resx} | 238 +- .../Ocr/VobSubOcrSetItalicFactor.Designer.cs | 0 .../Forms/Ocr/VobSubOcrSetItalicFactor.cs | 0 .../Forms/Ocr/VobSubOcrSetItalicFactor.resx | 0 src/{ => ui}/Forms/OpenVideoDvd.Designer.cs | 464 +- src/{ => ui}/Forms/OpenVideoDvd.cs | 234 +- src/{ => ui}/Forms/OpenVideoDvd.resx | 244 +- src/{ => ui}/Forms/PacEncoding.Designer.cs | 298 +- src/{ => ui}/Forms/PacEncoding.cs | 300 +- src/{ => ui}/Forms/PacEncoding.resx | 238 +- src/{ => ui}/Forms/PluginsGet.Designer.cs | 704 +- src/{ => ui}/Forms/PluginsGet.cs | 968 +- src/{ => ui}/Forms/PluginsGet.resx | 238 +- src/{ => ui}/Forms/PositionAndSizeForm.cs | 0 src/{ => ui}/Forms/ProfileChoose.Designer.cs | 0 src/{ => ui}/Forms/ProfileChoose.cs | 0 src/ui/Forms/ProfileChoose.resx | 120 + .../RemoveTextFromHearImpaired.Designer.cs | 1062 +- .../Forms/RemoveTextFromHearImpaired.cs | 840 +- .../Forms/RemoveTextFromHearImpaired.resx | 244 +- src/{ => ui}/Forms/ReplaceDialog.Designer.cs | 410 +- src/{ => ui}/Forms/ReplaceDialog.cs | 434 +- src/{ => ui}/Forms/ReplaceDialog.resx | 238 +- .../Forms/RestoreAutoBackup.Designer.cs | 358 +- src/{ => ui}/Forms/RestoreAutoBackup.cs | 396 +- src/{ => ui}/Forms/RestoreAutoBackup.resx | 238 +- src/{ => ui}/Forms/RubyJapanese.Designer.cs | 0 src/{ => ui}/Forms/RubyJapanese.cs | 0 src/ui/Forms/RubyJapanese.resx | 120 + src/{ => ui}/Forms/SeekSilence.Designer.cs | 420 +- src/{ => ui}/Forms/SeekSilence.cs | 116 +- src/{ => ui}/Forms/SeekSilence.resx | 238 +- ...umDisplayTimeBetweenParagraphs.Designer.cs | 514 +- .../SetMinimumDisplayTimeBetweenParagraphs.cs | 424 +- ...etMinimumDisplayTimeBetweenParagraphs.resx | 238 +- src/{ => ui}/Forms/SetSyncPoint.Designer.cs | 690 +- src/{ => ui}/Forms/SetSyncPoint.cs | 776 +- src/{ => ui}/Forms/SetSyncPoint.resx | 250 +- src/{ => ui}/Forms/SetVideoOffset.Designer.cs | 328 +- src/{ => ui}/Forms/SetVideoOffset.cs | 140 +- src/ui/Forms/SetVideoOffset.resx | 120 + src/{ => ui}/Forms/Settings.Designer.cs | 10564 +-- src/{ => ui}/Forms/Settings.cs | 6994 +- src/{ => ui}/Forms/Settings.resx | 268 +- .../SettingsFixContinuationStyle.Designer.cs | 0 .../Forms/SettingsFixContinuationStyle.cs | 0 .../Forms/SettingsFixContinuationStyle.resx | 120 + .../Forms/SettingsGapChoose.Designer.cs | 0 src/{ => ui}/Forms/SettingsGapChoose.cs | 0 src/ui/Forms/SettingsGapChoose.resx | 120 + .../Forms/SettingsLineWidth.Designer.cs | 0 src/{ => ui}/Forms/SettingsLineWidth.cs | 0 src/ui/Forms/SettingsLineWidth.resx | 120 + src/{ => ui}/Forms/SettingsMpv.Designer.cs | 286 +- src/{ => ui}/Forms/SettingsMpv.cs | 326 +- src/{ => ui}/Forms/SettingsMpv.resx | 238 +- .../Forms/SettingsProfile.Designer.cs | 0 src/{ => ui}/Forms/SettingsProfile.cs | 0 src/{ => ui}/Forms/SettingsProfile.resx | 0 .../Forms/SettingsProfileExport.Designer.cs | 0 src/{ => ui}/Forms/SettingsProfileExport.cs | 0 src/{ => ui}/Forms/SettingsProfileExport.resx | 0 .../Forms/ShowEarlierLater.Designer.cs | 368 +- src/{ => ui}/Forms/ShowEarlierLater.cs | 280 +- src/{ => ui}/Forms/ShowEarlierLater.resx | 244 +- src/{ => ui}/Forms/ShowHistory.Designer.cs | 314 +- src/{ => ui}/Forms/ShowHistory.cs | 256 +- src/{ => ui}/Forms/ShowHistory.resx | 238 +- src/{ => ui}/Forms/SpellCheck.Designer.cs | 936 +- src/{ => ui}/Forms/SpellCheck.cs | 2596 +- src/{ => ui}/Forms/SpellCheck.resx | 244 +- src/{ => ui}/Forms/Split.Designer.cs | 844 +- src/{ => ui}/Forms/Split.cs | 706 +- src/{ => ui}/Forms/Split.resx | 244 +- src/{ => ui}/Forms/SplitLongLines.Designer.cs | 716 +- src/{ => ui}/Forms/SplitLongLines.cs | 848 +- src/{ => ui}/Forms/SplitLongLines.resx | 244 +- src/{ => ui}/Forms/SplitSubtitle.Designer.cs | 360 +- src/{ => ui}/Forms/SplitSubtitle.cs | 342 +- src/{ => ui}/Forms/SplitSubtitle.resx | 250 +- .../Forms/StartNumberingFrom.Designer.cs | 210 +- src/{ => ui}/Forms/StartNumberingFrom.cs | 152 +- src/{ => ui}/Forms/StartNumberingFrom.resx | 238 +- src/{ => ui}/Forms/Statistics.Designer.cs | 378 +- src/{ => ui}/Forms/Statistics.cs | 1032 +- src/{ => ui}/Forms/Statistics.resx | 238 +- src/{ => ui}/Forms/StatusLog.Designer.cs | 188 +- src/{ => ui}/Forms/StatusLog.cs | 118 +- src/{ => ui}/Forms/StatusLog.resx | 244 +- src/{ => ui}/Forms/Styles/StylesForm.cs | 0 .../Styles/SubStationAlphaStyles.Designer.cs | 0 .../Forms/Styles/SubStationAlphaStyles.cs | 0 .../Forms/Styles/SubStationAlphaStyles.resx | 0 ...StationAlphaStylesBatchConvert.Designer.cs | 0 .../SubStationAlphaStylesBatchConvert.cs | 0 .../SubStationAlphaStylesBatchConvert.resx | 0 .../SubStationAlphaStylesExport.Designer.cs | 0 .../Styles/SubStationAlphaStylesExport.cs | 0 .../Styles/SubStationAlphaStylesExport.resx | 0 .../Forms/Styles/TimedTextStyles.Designer.cs | 0 src/{ => ui}/Forms/Styles/TimedTextStyles.cs | 0 .../Forms/Styles/TimedTextStyles.resx | 0 .../SubStationAlphaProperties.Designer.cs | 908 +- .../Forms/SubStationAlphaProperties.cs | 618 +- .../Forms/SubStationAlphaProperties.resx | 244 +- src/{ => ui}/Forms/SyncPointsSync.Designer.cs | 618 +- src/{ => ui}/Forms/SyncPointsSync.cs | 1012 +- src/{ => ui}/Forms/SyncPointsSync.resx | 238 +- src/{ => ui}/Forms/TextPrompt.Designer.cs | 0 src/{ => ui}/Forms/TextPrompt.cs | 0 src/ui/Forms/TextPrompt.resx | 120 + .../Forms/TimedTextNewLanguage.Designer.cs | 0 src/{ => ui}/Forms/TimedTextNewLanguage.cs | 0 src/ui/Forms/TimedTextNewLanguage.resx | 120 + .../Forms/TimedTextProperties.Designer.cs | 766 +- src/{ => ui}/Forms/TimedTextProperties.cs | 640 +- src/{ => ui}/Forms/TimedTextProperties.resx | 238 +- ...TransportStreamSubtitleChooser.Designer.cs | 486 +- .../Forms/TransportStreamSubtitleChooser.cs | 690 +- .../Forms/TransportStreamSubtitleChooser.resx | 250 +- .../Forms/UnknownSubtitle.Designer.cs | 290 +- src/{ => ui}/Forms/UnknownSubtitle.cs | 150 +- src/{ => ui}/Forms/UnknownSubtitle.resx | 238 +- .../Forms/VideoControlsUndocked.Designer.cs | 122 +- src/{ => ui}/Forms/VideoControlsUndocked.cs | 114 +- src/{ => ui}/Forms/VideoControlsUndocked.resx | 238 +- src/{ => ui}/Forms/VideoError.Designer.cs | 292 +- src/{ => ui}/Forms/VideoError.cs | 252 +- src/{ => ui}/Forms/VideoError.resx | 238 +- .../Forms/VideoPlayerUndocked.Designer.cs | 146 +- src/{ => ui}/Forms/VideoPlayerUndocked.cs | 346 +- src/{ => ui}/Forms/VideoPlayerUndocked.resx | 244 +- src/{ => ui}/Forms/VisualSync.Designer.cs | 912 +- src/{ => ui}/Forms/VisualSync.cs | 1796 +- src/{ => ui}/Forms/VisualSync.resx | 256 +- src/{ => ui}/Forms/Watermark.Designer.cs | 318 +- src/{ => ui}/Forms/Watermark.cs | 466 +- src/{ => ui}/Forms/Watermark.resx | 238 +- .../WaveformGenerateTimeCodes.Designer.cs | 798 +- .../Forms/WaveformGenerateTimeCodes.cs | 150 +- .../Forms/WaveformGenerateTimeCodes.resx | 238 +- .../Forms/WaveformUndocked.Designer.cs | 126 +- src/{ => ui}/Forms/WaveformUndocked.cs | 110 +- src/{ => ui}/Forms/WaveformUndocked.resx | 238 +- .../YouTubeAnnotationsImport.Designer.cs | 248 +- .../Forms/YouTubeAnnotationsImport.cs | 114 +- .../Forms/YouTubeAnnotationsImport.resx | 238 +- src/{ => ui}/Icons/Donate.png | Bin src/{ => ui}/Icons/Find.png | Bin src/{ => ui}/Icons/FixCommonErrors.png | Bin src/{ => ui}/Icons/Help.png | Bin src/{ => ui}/Icons/New.png | Bin src/{ => ui}/Icons/Open.png | Bin src/{ => ui}/Icons/RemoveTextForHI.png | Bin src/{ => ui}/Icons/Replace.png | Bin src/{ => ui}/Icons/SE.ico | Bin src/{ => ui}/Icons/Save.png | Bin src/{ => ui}/Icons/SaveAs.png | Bin src/{ => ui}/Icons/Settings.png | Bin src/{ => ui}/Icons/SpellCheck.png | Bin src/{ => ui}/Icons/VideoToggle.png | Bin src/{ => ui}/Icons/VisualSync.png | Bin src/{ => ui}/Icons/WaveformToggle.png | Bin src/{ => ui}/Icons/connect.png | Bin src/ui/Languages/XmlContentTranslator.exe | Bin 0 -> 83968 bytes src/{ => ui}/Languages/ar-EG.xml | 0 src/{ => ui}/Languages/bg-BG.xml | 0 src/{ => ui}/Languages/br-FR.xml | 0 src/{ => ui}/Languages/ca-ES.xml | 0 src/{ => ui}/Languages/cs-CZ.xml | 0 src/{ => ui}/Languages/da-DK.xml | 0 src/{ => ui}/Languages/de-DE.xml | 0 src/{ => ui}/Languages/el-GR.xml | 5564 +- src/{ => ui}/Languages/es-AR.xml | 0 src/{ => ui}/Languages/es-ES.xml | 0 src/{ => ui}/Languages/es-MX.xml | 0 src/{ => ui}/Languages/eu-ES.xml | 0 src/{ => ui}/Languages/fa-IR.xml | 0 src/{ => ui}/Languages/fi-FI.xml | 0 src/{ => ui}/Languages/fr-BE.xml | 0 src/{ => ui}/Languages/fr-FR.xml | 0 src/{ => ui}/Languages/hr-HR.xml | 0 src/{ => ui}/Languages/hu-HU.xml | 0 src/{ => ui}/Languages/id-ID.xml | 0 src/{ => ui}/Languages/it-IT.xml | 0 src/{ => ui}/Languages/ja-JP.xml | 0 src/{ => ui}/Languages/ko-KR.xml | 0 src/{ => ui}/Languages/mk-MK.xml | 0 src/{ => ui}/Languages/nb-NO.xml | 0 src/{ => ui}/Languages/nl-NL.xml | 0 src/{ => ui}/Languages/pl-PL.xml | 0 src/{ => ui}/Languages/pt-BR.xml | 0 src/{ => ui}/Languages/pt-PT.xml | 0 src/{ => ui}/Languages/ro-RO.xml | 0 src/{ => ui}/Languages/ru-RU.xml | 0 src/{ => ui}/Languages/sl-SI.xml | 0 src/{ => ui}/Languages/sr-Cyrl-RS.xml | 0 src/{ => ui}/Languages/sr-Latn-RS.xml | 0 src/{ => ui}/Languages/sv-SE.xml | 0 src/{ => ui}/Languages/th-TH.xml | 0 src/{ => ui}/Languages/tr-TR.xml | 0 src/{ => ui}/Languages/uk-UA.xml | 0 src/{ => ui}/Languages/vi-VN.xml | 0 src/{ => ui}/Languages/zh-Hans.xml | 0 src/{ => ui}/Languages/zh-TW.xml | 0 .../ColorChooser/ColorChangedEventArgs.cs | 0 .../Logic/ColorChooser/ColorHandler.cs | 0 src/{ => ui}/Logic/ColorChooser/ColorWheel.cs | 0 .../BluRaySupToBluRaySup.cs | 0 .../CommandLineConverter.cs | 0 .../Logic/CommandLineConvert/TsConvert.cs | 0 .../Logic/CommandLineConvert/TsToBdnXml.cs | 0 .../Logic/CommandLineConvert/TsToBluRaySup.cs | 0 src/{ => ui}/Logic/DarkTheme.cs | 0 src/{ => ui}/Logic/FindReplaceDialogHelper.cs | 890 +- src/{ => ui}/Logic/ListViewSorter.cs | 0 src/{ => ui}/Logic/MainShortcuts.cs | 0 src/{ => ui}/Logic/NativeMethods.cs | 0 .../Networking/NikseWebServiceSession.cs | 822 +- .../Logic/Networking/UpdateLogEntry.cs | 56 +- .../Logic/NikseBitmapImageSplitter.cs | 2306 +- .../Logic/Ocr/Binary/BinaryOcrBitmap.cs | 1822 +- src/{ => ui}/Logic/Ocr/Binary/BinaryOcrDb.cs | 508 +- .../Ocr/MatchesToItalicStringConverter.cs | 0 src/{ => ui}/Logic/Ocr/ModiLanguage.cs | 100 +- src/{ => ui}/Logic/Ocr/NOcrChar.cs | 636 +- src/{ => ui}/Logic/Ocr/NOcrDb.cs | 0 src/{ => ui}/Logic/Ocr/NOcrPoint.cs | 220 +- src/{ => ui}/Logic/Ocr/OcrAlphabet.cs | 102 +- src/{ => ui}/Logic/Ocr/OcrCharacter.cs | 32 +- src/{ => ui}/Logic/Ocr/OcrFixEngine.cs | 4196 +- src/{ => ui}/Logic/Ocr/OcrImage.cs | 74 +- .../Logic/Ocr/PreprocessingSettings.cs | 0 .../Logic/Ocr/SpellCheckOcrTextResult.cs | 20 +- .../Ocr/Tesseract/TesseractMultiRunner.cs | 0 .../Tesseract/TesseractMultiThreadRunner.cs | 0 .../Logic/Ocr/Tesseract/TesseractRunner.cs | 0 .../Ocr/Tesseract/TesseractThreadRunner.cs | 0 .../Logic/RtfTextConverterRichTextBox.cs | 0 src/{ => ui}/Logic/SceneChangesGenerator.cs | 0 src/{ => ui}/Logic/SpellCheck/Hunspell.cs | 106 +- .../Logic/SpellCheck/LinuxHunspell.cs | 164 +- src/{ => ui}/Logic/SpellCheck/MacHunspell.cs | 148 +- .../Logic/SpellCheck/VoikkoSpellCheck.cs | 428 +- .../Logic/SpellCheck/WindowsHunspell.cs | 92 +- src/{ => ui}/Logic/SyncContextExtensions.cs | 0 src/{ => ui}/Logic/TaskbarList.cs | 0 src/{ => ui}/Logic/TextDesigner.cs | 0 src/{ => ui}/Logic/TextWidth.cs | 0 src/{ => ui}/Logic/UiEbuSaveHelper.cs | 0 src/{ => ui}/Logic/UiGetPacEncoding.cs | 0 .../Logic/UiGetYouTubeAnnotationStyles.cs | 0 src/{ => ui}/Logic/UiUtil.cs | 2418 +- .../Logic/VideoPlayers/DirectShowLib2005.cs | 0 .../Logic/VideoPlayers/LibMpvDynamic.cs | 1410 +- src/{ => ui}/Logic/VideoPlayers/LibMpvMono.cs | 764 +- .../Logic/VideoPlayers/LibVlcDynamic.cs | 2090 +- src/{ => ui}/Logic/VideoPlayers/LibVlcMono.cs | 540 +- .../MpcHC/MessageHandlerWindow.Designer.cs | 0 .../MpcHC/MessageHandlerWindow.cs | 0 .../MpcHC/MessageHandlerWindow.resx | 120 + .../Logic/VideoPlayers/MpcHC/MpcHc.cs | 1082 +- .../Logic/VideoPlayers/MpcHC/MpcHcCommand.cs | 0 .../Logic/VideoPlayers/MpcHC/NativeMethods.cs | 0 .../Logic/VideoPlayers/QuartsPlayer.cs | 746 +- .../Logic/VideoPlayers/VideoPlayer.cs | 64 +- src/{ => ui}/Logic/WordSpellChecker.cs | 292 +- src/{ => ui}/Program.cs | 230 +- src/ui/Properties/AssemblyInfo.cs | 37 + .../Properties/AssemblyInfo.cs.template | 72 +- src/{ => ui}/Properties/Resources.Designer.cs | 266 +- src/{ => ui}/Properties/Resources.resx | 282 +- src/{ => ui}/Properties/Settings.Designer.cs | 72 +- src/{ => ui}/Properties/Settings.settings | 16 +- .../Resources/HunspellBackupDictionaries.xml | 0 .../HunspellBackupDictionaries.xml.gz | Bin .../Resources/HunspellDictionaries.xml | 748 +- .../Resources/HunspellDictionaries.xml.gz | Bin .../Resources/SMPTE-428-7-2007-DCST.xsd | 0 .../Resources/SMPTE-428-7-2007-DCST.xsd.gz | Bin .../Resources/SMPTE-428-7-2010-DCST.xsd | 668 +- .../Resources/SMPTE-428-7-2010-DCST.xsd.gz | Bin .../Resources/SMPTE-428-7-2014-DCST.xsd | 0 .../Resources/SMPTE-428-7-2014-DCST.xsd.gz | Bin .../Resources/TesseractDictionaries.xml | 574 +- .../Resources/TesseractDictionaries.xml.gz | Bin .../Resources/Transparent Background.png | Bin src/{ => ui}/Resources/bookmark22.png | Bin .../Resources/nOCR_TesseractHelper.xml.gz | Bin src/{ => ui}/Resources/pictureBoxFS.Image.png | Bin .../Resources/pictureBoxFSDown.Image.png | Bin .../Resources/pictureBoxFSOver.Image.png | Bin .../Resources/pictureBoxFastForward.Image.png | Bin .../pictureBoxFastForwardMouseDown.Image.png | Bin .../pictureBoxFastForwardMouseOver.Image.png | Bin .../Resources/pictureBoxNoFS.Image.png | Bin .../Resources/pictureBoxNoFSDown.Image.png | Bin .../Resources/pictureBoxNoFSOver.Image.png | Bin .../Resources/pictureBoxReverse.Image.png | Bin .../pictureBoxReverseMouseDown.Image.png | Bin .../pictureBoxReverseMouseOver.Image.png | Bin src/{ => ui}/SubtitleEdit.csproj | 3908 +- .../SeNetworkService/Reference.cs | 1928 +- .../SeNetworkService/Reference.map | 12 +- .../SeNetworkService/SeSequence.datasource | 18 +- .../SeNetworkService/SeService.disco | 10 +- .../SeNetworkService/SeService.wsdl | 1024 +- .../SeNetworkService/SeUpdate.datasource | 18 +- .../SeNetworkService/SeUser.datasource | 18 +- src/{ => ui}/app.config | 36 +- .../packages/ILRepack.2.0.18/.signature.p7s | Bin 0 -> 9471 bytes .../ILRepack.2.0.18/ILRepack.2.0.18.nupkg | Bin 0 -> 605768 bytes .../ILRepack.2.0.18/build/ILRepack.props | 6 + .../ILRepack.2.0.18/tools/ILRepack.exe | Bin 0 -> 1519104 bytes .../NHunspell.1.2.5554.16953/.signature.p7s | Bin 0 -> 9480 bytes .../NHunspell.1.2.5554.16953.nupkg | Bin 0 -> 413272 bytes .../Tools/install.ps1 | 13 + .../content/Hunspellx64.dll | Bin 0 -> 524288 bytes .../content/Hunspellx86.dll | Bin 0 -> 442368 bytes .../lib/net/NHunspell.dll | Bin 0 -> 31744 bytes .../lib/net/NHunspell.pdb | Bin 0 -> 69120 bytes www/Help.cshtml | 986 - www/HelpEU.cshtml | 955 - www/HelpEs.cshtml | 985 - 1295 files changed, 224308 insertions(+), 227165 deletions(-) rename src/SubtitleEdit.sln => SubtitleEdit.sln (69%) create mode 100644 SubtitleEdit.sln.DotSettings delete mode 100644 coverity.bat rename src/packages.config => packages.config (100%) delete mode 100644 run_tabspace.bat delete mode 100644 src/Forms/ChooseAudioTrack.resx delete mode 100644 src/Forms/ChooseStyle.resx delete mode 100644 src/Forms/ColumnPaste.resx delete mode 100644 src/Forms/DoNotBreakAfterListEdit.resx delete mode 100644 src/Forms/DurationsBridgeGaps.resx delete mode 100644 src/Forms/DvdSubRipChooseLanguage.resx delete mode 100644 src/Forms/FcpProperties.resx delete mode 100644 src/Forms/GoogleOrMicrosoftTranslate.resx delete mode 100644 src/Forms/Interjections.resx delete mode 100644 src/Forms/MeasurementConverter.resx rename {libse => src/libse}/AudioToText/PocketSphinx/PocketSphinxSettings.cs (100%) rename {libse => src/libse}/AudioToText/PocketSphinx/ResultReader.cs (100%) rename {libse => src/libse}/AudioToText/PocketSphinx/SubtitleGenerator.cs (100%) rename {libse => src/libse}/AudioToText/ResultText.cs (100%) rename {libse => src/libse}/BluRaySup/BluRaySupPalette.cs (100%) rename {libse => src/libse}/BluRaySup/BluRaySupParser.cs (100%) rename {libse => src/libse}/BluRaySup/BluRaySupPicture.cs (100%) rename {libse => src/libse}/BluRaySup/Core.cs (100%) rename {libse => src/libse}/BluRaySup/ImageObjectFragment.cs (100%) rename {libse => src/libse}/BluRaySup/PaletteInfo.cs (100%) rename {libse => src/libse}/BluRaySup/ToolBox.cs (100%) rename {libse => src/libse}/CDG/CdgGraphics.cs (100%) rename {libse => src/libse}/CDG/CdgGraphicsFile.cs (100%) rename {libse => src/libse}/CDG/CdgToImageList.cs (100%) rename {libse => src/libse}/CDG/Command.cs (100%) rename {libse => src/libse}/CDG/Instruction.cs (100%) rename {libse => src/libse}/CDG/Packet.cs (100%) rename {libse => src/libse}/Common/BmpReader.cs (100%) rename {libse => src/libse}/Common/BookmarkPersistence.cs (100%) rename {libse => src/libse}/Common/CharUtils.cs (100%) rename {libse => src/libse}/Common/Configuration.cs (100%) rename {libse => src/libse}/Common/ContinuationUtilities.cs (100%) rename {libse => src/libse}/Common/CultureExtensions.cs (100%) rename {libse => src/libse}/Common/DialogSplitMerge.cs (100%) rename {libse => src/libse}/Common/DvdSubtitleLanguage.cs (100%) rename {libse => src/libse}/Common/FastBitmap.cs (100%) rename {libse => src/libse}/Common/FastFileStream.cs (100%) rename {libse => src/libse}/Common/FilePathComparer.cs (100%) rename {libse => src/libse}/Common/FileUtil.cs (100%) rename {libse => src/libse}/Common/FixCasing.cs (100%) rename {libse => src/libse}/Common/FixDurationLimits.cs (100%) rename {libse => src/libse}/Common/HistoryItem.cs (100%) rename {libse => src/libse}/Common/HtmlUtil.cs (100%) rename {libse => src/libse}/Common/IfoParser.cs (100%) rename {libse => src/libse}/Common/ImageSplitterItem.cs (100%) rename {libse => src/libse}/Common/Iso639Dash2LanguageCode.cs (100%) rename {libse => src/libse}/Common/IsoCountryCodes.cs (100%) rename {libse => src/libse}/Common/LanguageAutoDetect.cs (100%) rename {libse => src/libse}/Common/ManagedBitmap.cs (100%) rename {libse => src/libse}/Common/MergeLinesSameTextUtils.cs (100%) rename {libse => src/libse}/Common/MergeShortLinesUtils.cs (100%) rename {libse => src/libse}/Common/MovieHasher.cs (100%) rename {libse => src/libse}/Common/MurMurHash3.cs (100%) rename {libse => src/libse}/Common/NativeMethods.cs (100%) rename {libse => src/libse}/Common/NetflixImsc11JapaneseToAss.cs (100%) rename {libse => src/libse}/Common/NikseBitmap.cs (100%) rename {libse => src/libse}/Common/NoBreakAfterItem.cs (100%) rename {libse => src/libse}/Common/Paragraph.cs (100%) rename {libse => src/libse}/Common/PlainTextImporter.cs (100%) rename {libse => src/libse}/Common/Position.cs (100%) rename {libse => src/libse}/Common/RealFFT.cs (100%) rename {libse => src/libse}/Common/RegexUtils.cs (100%) rename {libse => src/libse}/Common/RegistryUtil.cs (100%) rename {libse => src/libse}/Common/ReplaceExpression.cs (100%) rename {libse => src/libse}/Common/RichTextToPlainText.cs (100%) rename {libse => src/libse}/Common/RulesProfile.cs (100%) rename {libse => src/libse}/Common/SccPositionAndStyle.cs (100%) rename {libse => src/libse}/Common/SccPositionAndStyleTable.cs (100%) rename {libse => src/libse}/Common/SceneChangeHelper.cs (100%) rename {libse => src/libse}/Common/SeJsonParser.cs (100%) rename {libse => src/libse}/Common/SeJsonValidator.cs (100%) rename {libse => src/libse}/Common/SeLogger.cs (100%) rename {libse => src/libse}/Common/Settings.cs (100%) rename {libse => src/libse}/Common/SsaStyle.cs (100%) rename {libse => src/libse}/Common/StringExtensions.cs (100%) rename {libse => src/libse}/Common/StrippableText.cs (100%) rename {libse => src/libse}/Common/TarHeader.cs (100%) rename {libse => src/libse}/Common/TarReader.cs (100%) rename {libse => src/libse}/Common/TesseractDictionary.cs (100%) rename {libse => src/libse}/Common/TextDraw.cs (100%) rename {libse => src/libse}/Common/TextEncoding.cs (100%) rename {libse => src/libse}/Common/TextEncodingExtensions.cs (100%) rename {libse => src/libse}/Common/TextSplit.cs (100%) rename {libse => src/libse}/Common/TextSplitResult.cs (100%) rename {libse => src/libse}/Common/TimeCode.cs (100%) rename {libse => src/libse}/Common/TinyJsonParser.cs (100%) rename {libse => src/libse}/Common/UnknownFormatImporter.cs (100%) rename {libse => src/libse}/Common/UnknownFormatImporterJson.cs (100%) rename {libse => src/libse}/Common/Utilities.cs (100%) rename {libse => src/libse}/Common/VideoInfo.cs (100%) rename {libse => src/libse}/Common/WaveToVisualizer.cs (100%) rename {libse => src/libse}/Common/XmlDeserializerGenerator.cs (100%) rename {libse => src/libse}/Common/ZipExtractor.cs (100%) rename {libse => src/libse}/ContainerFormats/AviRiffData.cs (100%) rename {libse => src/libse}/ContainerFormats/Ebml/Element.cs (100%) rename {libse => src/libse}/ContainerFormats/Ebml/ElementId.cs (100%) rename {libse => src/libse}/ContainerFormats/MaterialExchangeFormat/KeyIdentifier.cs (100%) rename {libse => src/libse}/ContainerFormats/MaterialExchangeFormat/KlvPacket.cs (100%) rename {libse => src/libse}/ContainerFormats/MaterialExchangeFormat/MxfParser.cs (100%) rename {libse => src/libse}/ContainerFormats/MaterialExchangeFormat/PartitionStatus.cs (100%) rename {libse => src/libse}/ContainerFormats/Matroska/MatroskaChapter.cs (100%) rename {libse => src/libse}/ContainerFormats/Matroska/MatroskaFile.cs (100%) rename {libse => src/libse}/ContainerFormats/Matroska/MatroskaSubtitle.cs (100%) rename {libse => src/libse}/ContainerFormats/Matroska/MatroskaTrackInfo.cs (100%) rename {libse => src/libse}/ContainerFormats/Mp4/Boxes/Box.cs (100%) rename {libse => src/libse}/ContainerFormats/Mp4/Boxes/Mdat.cs (100%) rename {libse => src/libse}/ContainerFormats/Mp4/Boxes/Mdhd.cs (100%) rename {libse => src/libse}/ContainerFormats/Mp4/Boxes/Mdia.cs (100%) rename {libse => src/libse}/ContainerFormats/Mp4/Boxes/Minf.cs (100%) rename {libse => src/libse}/ContainerFormats/Mp4/Boxes/Moof.cs (100%) rename {libse => src/libse}/ContainerFormats/Mp4/Boxes/Moov.cs (100%) rename {libse => src/libse}/ContainerFormats/Mp4/Boxes/Mvhd.cs (100%) rename {libse => src/libse}/ContainerFormats/Mp4/Boxes/Stbl.cs (100%) rename {libse => src/libse}/ContainerFormats/Mp4/Boxes/Tfdt.cs (100%) rename {libse => src/libse}/ContainerFormats/Mp4/Boxes/Tkhd.cs (100%) rename {libse => src/libse}/ContainerFormats/Mp4/Boxes/Traf.cs (100%) rename {libse => src/libse}/ContainerFormats/Mp4/Boxes/Trak.cs (100%) rename {libse => src/libse}/ContainerFormats/Mp4/Boxes/Trun.cs (100%) rename {libse => src/libse}/ContainerFormats/Mp4/Boxes/Vttc.cs (100%) rename {libse => src/libse}/ContainerFormats/Mp4/CmafParser.cs (100%) rename {libse => src/libse}/ContainerFormats/Mp4/Mp4Parser.cs (100%) rename {libse => src/libse}/ContainerFormats/Mp4/SampleTimeInfo.cs (100%) rename {libse => src/libse}/ContainerFormats/Mp4/TimeSegment.cs (100%) rename {libse => src/libse}/ContainerFormats/RiffDecodeHeader.cs (100%) rename {libse => src/libse}/ContainerFormats/RiffParser.cs (100%) rename {libse => src/libse}/ContainerFormats/TransportStream/AdaptationField.cs (100%) rename {libse => src/libse}/ContainerFormats/TransportStream/ClutDefinitionSegment.cs (100%) rename {libse => src/libse}/ContainerFormats/TransportStream/DisplayDefinitionSegment.cs (100%) rename {libse => src/libse}/ContainerFormats/TransportStream/DvbSubPes.cs (100%) rename {libse => src/libse}/ContainerFormats/TransportStream/EbuPesDataField.cs (100%) rename {libse => src/libse}/ContainerFormats/TransportStream/EbuPesDataFieldText.cs (100%) rename {libse => src/libse}/ContainerFormats/TransportStream/Helper.cs (100%) rename {libse => src/libse}/ContainerFormats/TransportStream/ObjectDataSegment.cs (100%) rename {libse => src/libse}/ContainerFormats/TransportStream/Packet.cs (100%) rename {libse => src/libse}/ContainerFormats/TransportStream/PacketizedElementaryStream.cs (100%) rename {libse => src/libse}/ContainerFormats/TransportStream/PageCompositionSegemnt.cs (100%) rename {libse => src/libse}/ContainerFormats/TransportStream/PageCompositionSegmentRegion.cs (100%) rename {libse => src/libse}/ContainerFormats/TransportStream/ProgramAssociationTable.cs (100%) rename {libse => src/libse}/ContainerFormats/TransportStream/ProgramMapTable.cs (100%) rename {libse => src/libse}/ContainerFormats/TransportStream/ProgramMapTableDescriptor.cs (100%) rename {libse => src/libse}/ContainerFormats/TransportStream/ProgramMapTableParser.cs (100%) rename {libse => src/libse}/ContainerFormats/TransportStream/ProgramMapTableStream.cs (100%) rename {libse => src/libse}/ContainerFormats/TransportStream/RegionClutSegmentEntry.cs (100%) rename {libse => src/libse}/ContainerFormats/TransportStream/RegionCompositionSegment.cs (100%) rename {libse => src/libse}/ContainerFormats/TransportStream/RegionCompositionSegmentObject.cs (100%) rename {libse => src/libse}/ContainerFormats/TransportStream/SubtitleSegment.cs (100%) rename {libse => src/libse}/ContainerFormats/TransportStream/Teletext.cs (100%) rename {libse => src/libse}/ContainerFormats/TransportStream/TeletextHamming.cs (100%) rename {libse => src/libse}/ContainerFormats/TransportStream/TeletextRunSettings.cs (100%) rename {libse => src/libse}/ContainerFormats/TransportStream/TeletextTables.cs (100%) rename {libse => src/libse}/ContainerFormats/TransportStream/TransportStreamParser.cs (100%) rename {libse => src/libse}/ContainerFormats/TransportStream/TransportStreamSubtitle.cs (100%) rename {libse => src/libse}/ContainerFormats/XSub.cs (100%) rename {libse => src/libse}/DetectEncoding/EncodingTools.cs (100%) rename {libse => src/libse}/Dictionaries/NameList.cs (100%) rename {libse => src/libse}/Dictionaries/OcrFixReplaceList.cs (100%) rename {libse => src/libse}/Enums/ContinuationStyle.cs (100%) rename {libse => src/libse}/Enums/DialogType.cs (100%) rename {libse => src/libse}/Enums/FindType.cs (100%) rename {libse => src/libse}/Enums/ReplaceType.cs (100%) rename {libse => src/libse}/Enums/SelectionChoice.cs (100%) rename {libse => src/libse}/Enums/SpellCheckAction.cs (100%) rename {libse => src/libse}/Enums/SubtitleSortCriteria.cs (100%) rename {libse => src/libse}/Forms/CheckForUpdatesHelper.cs (100%) rename {libse => src/libse}/Forms/DurationsBridgeGaps.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/AddMissingQuotes.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/EmptyFixCallback.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/Fix3PlusLines.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/FixAloneLowercaseIToUppercaseI.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/FixCommas.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/FixContinuationStyle.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/FixDanishLetterI.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/FixDialogsOnOneLine.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/FixDoubleApostrophes.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/FixDoubleDash.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/FixDoubleGreaterThan.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/FixEllipsesStart.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/FixEmptyLines.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/FixHyphensInDialog.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/FixHyphensRemoveDashSingleLine.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/FixInvalidItalicTags.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/FixLongDisplayTimes.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/FixLongLines.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/FixMissingOpenBracket.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/FixMissingPeriodsAtEndOfLine.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/FixMissingSpaces.cs (98%) rename {libse => src/libse}/Forms/FixCommonErrors/FixMusicNotation.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/FixOverlappingDisplayTimes.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/FixShortDisplayTimes.cs (98%) rename {libse => src/libse}/Forms/FixCommonErrors/FixShortGaps.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/FixShortLines.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/FixShortLinesAll.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/FixSpanishInvertedQuestionAndExclamationMarks.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/FixStartWithUppercaseLetterAfterColon.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/FixStartWithUppercaseLetterAfterParagraph.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/FixStartWithUppercaseLetterAfterPeriodInsideParagraph.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/FixTurkishAnsiToUnicode.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/FixUnnecessaryLeadingDots.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/FixUnneededPeriods.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/FixUnneededSpaces.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/FixUppercaseIInsideWords.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/Helper.cs (97%) rename {libse => src/libse}/Forms/FixCommonErrors/HelperContinuation.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/NormalizeStrings.cs (100%) rename {libse => src/libse}/Forms/FixCommonErrors/RemoveSpaceBetweenNumbers.cs (100%) rename {libse => src/libse}/Forms/MergeLinesWithSameTimeCodes.cs (100%) rename {libse => src/libse}/Forms/MoveWordUpDown.cs (100%) rename {libse => src/libse}/Forms/RemoveInterjection.cs (100%) rename {libse => src/libse}/Forms/RemoveTextForHI.cs (97%) rename {libse => src/libse}/Forms/RemoveTextForHISettings.cs (100%) rename {libse => src/libse}/Forms/SplitLongLinesHelper.cs (100%) rename {libse => src/libse}/Grammar/IGrammarDictionary.cs (100%) rename {libse => src/libse}/Grammar/LanguageToolsDictionary.cs (100%) rename {libse => src/libse}/Grammar/LanguageToolsRule.cs (100%) rename {libse => src/libse}/Interfaces/IBinaryParagraph.cs (100%) rename {libse => src/libse}/Interfaces/IBinaryParagraphList.cs (100%) rename {libse => src/libse}/Interfaces/IBinaryPersistableSubtitle.cs (100%) rename {libse => src/libse}/Interfaces/IDoSpell.cs (95%) rename {libse => src/libse}/Interfaces/IFixCallbacks.cs (100%) rename {libse => src/libse}/Interfaces/IFixCommonError.cs (100%) rename {libse => src/libse}/Interfaces/IRtfTextConverter.cs (100%) rename {libse => src/libse}/Language.cs (98%) rename {libse => src/libse}/LanguageDeserializer.cs (98%) rename {libse => src/libse}/LanguageStructure.cs (98%) rename {libse => src/libse}/LibSE.csproj (91%) rename {libse => src/libse}/NetflixQualityCheck/INetflixQualityChecker.cs (100%) rename {libse => src/libse}/NetflixQualityCheck/NetflixCheckBridgeGaps.cs (100%) rename {libse => src/libse}/NetflixQualityCheck/NetflixCheckDialogHyphenSpace.cs (100%) rename {libse => src/libse}/NetflixQualityCheck/NetflixCheckGlyph.cs (100%) rename {libse => src/libse}/NetflixQualityCheck/NetflixCheckItalics.cs (100%) rename {libse => src/libse}/NetflixQualityCheck/NetflixCheckMaxCps.cs (100%) rename {libse => src/libse}/NetflixQualityCheck/NetflixCheckMaxDuration.cs (100%) rename {libse => src/libse}/NetflixQualityCheck/NetflixCheckMaxLineLength.cs (100%) rename {libse => src/libse}/NetflixQualityCheck/NetflixCheckMinDuration.cs (100%) rename {libse => src/libse}/NetflixQualityCheck/NetflixCheckNumberOfLines.cs (100%) rename {libse => src/libse}/NetflixQualityCheck/NetflixCheckNumbersOneToTenSpellOut.cs (100%) rename {libse => src/libse}/NetflixQualityCheck/NetflixCheckSceneChange.cs (100%) rename {libse => src/libse}/NetflixQualityCheck/NetflixCheckStartNumberSpellOut.cs (100%) rename {libse => src/libse}/NetflixQualityCheck/NetflixCheckTextForHiUseBrackets.cs (100%) rename {libse => src/libse}/NetflixQualityCheck/NetflixCheckTimedTextFrameRate.cs (100%) rename {libse => src/libse}/NetflixQualityCheck/NetflixCheckTwoFramesGap.cs (100%) rename {libse => src/libse}/NetflixQualityCheck/NetflixCheckWhiteSpace.cs (100%) rename {libse => src/libse}/NetflixQualityCheck/NetflixHelper.cs (100%) rename {libse => src/libse}/NetflixQualityCheck/NetflixQualityController.cs (100%) create mode 100644 src/libse/Properties/AssemblyInfo.cs rename {libse => src/libse}/Properties/AssemblyInfo.cs.template (97%) rename {libse => src/libse}/Properties/Resources.Designer.cs (100%) rename {libse => src/libse}/Properties/Resources.resx (100%) rename {libse => src/libse}/Readme.md (100%) rename {libse => src/libse}/Resources/netflix_glyphs2_gz (100%) rename {libse => src/libse}/SpellCheck/SpellCheckWord.cs (95%) rename {libse => src/libse}/SpellCheck/SpellCheckWordLists.cs (97%) rename {libse => src/libse}/SpellCheck/UndoObject.cs (97%) rename {libse => src/libse}/Subtitle.cs (97%) rename {libse => src/libse}/SubtitleFormats/AQTitle.cs (97%) rename {libse => src/libse}/SubtitleFormats/AbcIViewer.cs (97%) rename {libse => src/libse}/SubtitleFormats/AdobeAfterEffectsFTME.cs (97%) rename {libse => src/libse}/SubtitleFormats/AdobeEncore.cs (97%) rename {libse => src/libse}/SubtitleFormats/AdobeEncoreLineTabNewLine.cs (97%) rename {libse => src/libse}/SubtitleFormats/AdobeEncoreLineTabs.cs (97%) rename {libse => src/libse}/SubtitleFormats/AdobeEncoreTabs.cs (97%) rename {libse => src/libse}/SubtitleFormats/AdobeEncoreWithLineNumbers.cs (97%) rename {libse => src/libse}/SubtitleFormats/AdobeEncoreWithLineNumbersNtsc.cs (97%) rename {libse => src/libse}/SubtitleFormats/AdobePremierePrProj.cs (100%) rename {libse => src/libse}/SubtitleFormats/AdvancedSubStationAlpha.cs (97%) rename {libse => src/libse}/SubtitleFormats/AribB24Decoder.cs (100%) rename {libse => src/libse}/SubtitleFormats/AribB36.cs (100%) rename {libse => src/libse}/SubtitleFormats/AvidCaption.cs (97%) rename {libse => src/libse}/SubtitleFormats/AvidDvd.cs (97%) rename {libse => src/libse}/SubtitleFormats/AvidStl.cs (97%) rename {libse => src/libse}/SubtitleFormats/AwsTranscribeJson.cs (100%) rename {libse => src/libse}/SubtitleFormats/Ayato.cs (97%) rename {libse => src/libse}/SubtitleFormats/BdnXml.cs (97%) rename {libse => src/libse}/SubtitleFormats/BelleNuitSubtitler.cs (97%) rename {libse => src/libse}/SubtitleFormats/Bilibili.cs (100%) rename {libse => src/libse}/SubtitleFormats/CapMakerPlus.cs (98%) rename {libse => src/libse}/SubtitleFormats/Cappella.cs (100%) rename {libse => src/libse}/SubtitleFormats/CaptionAssistant.cs (97%) rename {libse => src/libse}/SubtitleFormats/Captionate.cs (97%) rename {libse => src/libse}/SubtitleFormats/CaptionateMs.cs (97%) rename {libse => src/libse}/SubtitleFormats/CaptionsInc.cs (97%) rename {libse => src/libse}/SubtitleFormats/CaraokeXml.cs (97%) rename {libse => src/libse}/SubtitleFormats/Cavena890.cs (97%) rename {libse => src/libse}/SubtitleFormats/CheetahCaption.cs (97%) rename {libse => src/libse}/SubtitleFormats/CheetahCaptionOld.cs (97%) rename {libse => src/libse}/SubtitleFormats/Chk.cs (97%) rename {libse => src/libse}/SubtitleFormats/Cmaft.cs (100%) rename {libse => src/libse}/SubtitleFormats/Csv.cs (97%) rename {libse => src/libse}/SubtitleFormats/Csv2.cs (97%) rename {libse => src/libse}/SubtitleFormats/Csv3.cs (97%) rename {libse => src/libse}/SubtitleFormats/Csv4.cs (100%) rename {libse => src/libse}/SubtitleFormats/Csv5.cs (100%) rename {libse => src/libse}/SubtitleFormats/CsvNuendo.cs (100%) rename {libse => src/libse}/SubtitleFormats/DCinemaInterop.cs (100%) rename {libse => src/libse}/SubtitleFormats/DCinemaSmpte2007.cs (97%) rename {libse => src/libse}/SubtitleFormats/DCinemaSmpte2010.cs (98%) rename {libse => src/libse}/SubtitleFormats/DCinemaSmpte2014.cs (100%) rename {libse => src/libse}/SubtitleFormats/DigiBeta.cs (97%) rename {libse => src/libse}/SubtitleFormats/DlDd.cs (100%) rename {libse => src/libse}/SubtitleFormats/Dost.cs (97%) rename {libse => src/libse}/SubtitleFormats/DvSubtitle.cs (100%) rename {libse => src/libse}/SubtitleFormats/DvdStudioPro.cs (97%) rename {libse => src/libse}/SubtitleFormats/DvdStudioProSpace.cs (97%) rename {libse => src/libse}/SubtitleFormats/DvdStudioProSpaceGraphic.cs (100%) rename {libse => src/libse}/SubtitleFormats/DvdStudioProSpaceOne.cs (97%) rename {libse => src/libse}/SubtitleFormats/DvdStudioProSpaceOneSemicolon.cs (100%) rename {libse => src/libse}/SubtitleFormats/DvdSubtitle.cs (97%) rename {libse => src/libse}/SubtitleFormats/DvdSubtitleSystem.cs (97%) rename {libse => src/libse}/SubtitleFormats/ELRStudioClosedCaption.cs (97%) rename {libse => src/libse}/SubtitleFormats/ESubXf.cs (100%) rename {libse => src/libse}/SubtitleFormats/EZTSubtitlesProject.cs (100%) rename {libse => src/libse}/SubtitleFormats/Ebu.cs (97%) rename {libse => src/libse}/SubtitleFormats/Edl.cs (97%) rename {libse => src/libse}/SubtitleFormats/Eeg708.cs (97%) rename {libse => src/libse}/SubtitleFormats/ElrPrint.cs (100%) rename {libse => src/libse}/SubtitleFormats/F4Rtf.cs (96%) rename {libse => src/libse}/SubtitleFormats/F4Text.cs (97%) rename {libse => src/libse}/SubtitleFormats/F4Xml.cs (96%) rename {libse => src/libse}/SubtitleFormats/FLVCoreCuePoints.cs (97%) rename {libse => src/libse}/SubtitleFormats/FabSubtitler.cs (97%) rename {libse => src/libse}/SubtitleFormats/FilmEditXml.cs (97%) rename {libse => src/libse}/SubtitleFormats/FinalCutProImage.cs (97%) rename {libse => src/libse}/SubtitleFormats/FinalCutProTest2Xml.cs (98%) rename {libse => src/libse}/SubtitleFormats/FinalCutProTextXml.cs (97%) rename {libse => src/libse}/SubtitleFormats/FinalCutProXCM.cs (97%) rename {libse => src/libse}/SubtitleFormats/FinalCutProXXml.cs (97%) rename {libse => src/libse}/SubtitleFormats/FinalCutProXml.cs (97%) rename {libse => src/libse}/SubtitleFormats/FinalCutProXml13.cs (97%) rename {libse => src/libse}/SubtitleFormats/FinalCutProXml14.cs (98%) rename {libse => src/libse}/SubtitleFormats/FinalCutProXml14Text.cs (97%) rename {libse => src/libse}/SubtitleFormats/FinalCutProXml15.cs (100%) rename {libse => src/libse}/SubtitleFormats/FinalCutProXml16.cs (100%) rename {libse => src/libse}/SubtitleFormats/FinalCutProXml17.cs (100%) rename {libse => src/libse}/SubtitleFormats/FinalCutProXml18.cs (100%) rename {libse => src/libse}/SubtitleFormats/FinalCutProXmlGap.cs (98%) rename {libse => src/libse}/SubtitleFormats/FinalDraftTemplate2.cs (100%) rename {libse => src/libse}/SubtitleFormats/FlashXml.cs (97%) rename {libse => src/libse}/SubtitleFormats/Footage.cs (97%) rename {libse => src/libse}/SubtitleFormats/GooglePlayJson.cs (100%) rename {libse => src/libse}/SubtitleFormats/GpacTtxt.cs (97%) rename {libse => src/libse}/SubtitleFormats/Gremots.cs (100%) rename {libse => src/libse}/SubtitleFormats/HollyStarJson.cs (100%) rename {libse => src/libse}/SubtitleFormats/HtmlSamiArray.cs (97%) rename {libse => src/libse}/SubtitleFormats/IaiSub.cs (97%) rename {libse => src/libse}/SubtitleFormats/Idx.cs (97%) rename {libse => src/libse}/SubtitleFormats/ImageLogicAutocaption.cs (97%) rename {libse => src/libse}/SubtitleFormats/InqScribe.cs (100%) rename {libse => src/libse}/SubtitleFormats/IsmtDfxp.cs (100%) rename {libse => src/libse}/SubtitleFormats/IssXml.cs (98%) rename {libse => src/libse}/SubtitleFormats/ItunesTimedText.cs (97%) rename {libse => src/libse}/SubtitleFormats/JacoSub.cs (100%) rename {libse => src/libse}/SubtitleFormats/Json.cs (97%) rename {libse => src/libse}/SubtitleFormats/JsonTed.cs (100%) rename {libse => src/libse}/SubtitleFormats/JsonType10.cs (100%) rename {libse => src/libse}/SubtitleFormats/JsonType11.cs (100%) rename {libse => src/libse}/SubtitleFormats/JsonType12.cs (100%) rename {libse => src/libse}/SubtitleFormats/JsonType13.cs (100%) rename {libse => src/libse}/SubtitleFormats/JsonType14.cs (100%) rename {libse => src/libse}/SubtitleFormats/JsonType15.cs (100%) rename {libse => src/libse}/SubtitleFormats/JsonType16.cs (100%) rename {libse => src/libse}/SubtitleFormats/JsonType17.cs (100%) rename {libse => src/libse}/SubtitleFormats/JsonType18.cs (100%) rename {libse => src/libse}/SubtitleFormats/JsonType2.cs (97%) rename {libse => src/libse}/SubtitleFormats/JsonType3.cs (97%) rename {libse => src/libse}/SubtitleFormats/JsonType4.cs (97%) rename {libse => src/libse}/SubtitleFormats/JsonType5.cs (97%) rename {libse => src/libse}/SubtitleFormats/JsonType6.cs (97%) rename {libse => src/libse}/SubtitleFormats/JsonType7.cs (100%) rename {libse => src/libse}/SubtitleFormats/JsonType8.cs (100%) rename {libse => src/libse}/SubtitleFormats/JsonType8b.cs (100%) rename {libse => src/libse}/SubtitleFormats/JsonType9.cs (100%) rename {libse => src/libse}/SubtitleFormats/JsonTypeOnlyLoad1.cs (100%) rename {libse => src/libse}/SubtitleFormats/KanopyHtml.cs (100%) rename {libse => src/libse}/SubtitleFormats/KaraokeCdgCreatorText.cs (100%) rename {libse => src/libse}/SubtitleFormats/LambdaCap.cs (100%) rename {libse => src/libse}/SubtitleFormats/Lrc.cs (97%) rename {libse => src/libse}/SubtitleFormats/MPlayer2.cs (97%) rename {libse => src/libse}/SubtitleFormats/MacCaption.cs (97%) rename {libse => src/libse}/SubtitleFormats/MacSub.cs (100%) rename {libse => src/libse}/SubtitleFormats/MediaTransData.cs (100%) rename {libse => src/libse}/SubtitleFormats/MicroDvd.cs (98%) rename {libse => src/libse}/SubtitleFormats/MidwayInscriberCGX.cs (97%) rename {libse => src/libse}/SubtitleFormats/MsOfficeWorkbook.cs (100%) rename {libse => src/libse}/SubtitleFormats/NciCaption.cs (97%) rename {libse => src/libse}/SubtitleFormats/NciTimedRollUpCaptions.cs (97%) rename {libse => src/libse}/SubtitleFormats/NetflixImsc11Japanese.cs (100%) rename {libse => src/libse}/SubtitleFormats/NetflixTimedText.cs (100%) rename {libse => src/libse}/SubtitleFormats/OgmChapters.cs (100%) rename {libse => src/libse}/SubtitleFormats/OpenDvt.cs (97%) rename {libse => src/libse}/SubtitleFormats/Oresme.cs (97%) rename {libse => src/libse}/SubtitleFormats/OresmeDocXDocument.cs (98%) rename {libse => src/libse}/SubtitleFormats/OtterAi.cs (100%) rename {libse => src/libse}/SubtitleFormats/PE2.cs (97%) rename {libse => src/libse}/SubtitleFormats/PListCaption.cs (97%) rename {libse => src/libse}/SubtitleFormats/Pac.cs (97%) rename {libse => src/libse}/SubtitleFormats/PacUnicode.cs (97%) rename {libse => src/libse}/SubtitleFormats/PhoenixSubtitle.cs (100%) rename {libse => src/libse}/SubtitleFormats/PinnacleImpression.cs (97%) rename {libse => src/libse}/SubtitleFormats/PlayCaptionsFreeEditor.cs (100%) rename {libse => src/libse}/SubtitleFormats/Pns.cs (97%) rename {libse => src/libse}/SubtitleFormats/ProjectionSubtitleList.cs (100%) rename {libse => src/libse}/SubtitleFormats/QubeMasterImport.cs (96%) rename {libse => src/libse}/SubtitleFormats/QuickTimeText.cs (97%) rename {libse => src/libse}/SubtitleFormats/RealTime.cs (97%) rename {libse => src/libse}/SubtitleFormats/RhozetHarmonic.cs (97%) rename {libse => src/libse}/SubtitleFormats/Rtf1.cs (100%) rename {libse => src/libse}/SubtitleFormats/Rtf2.cs (100%) rename {libse => src/libse}/SubtitleFormats/Sami.cs (97%) rename {libse => src/libse}/SubtitleFormats/SamiAvDicPlayer.cs (100%) rename {libse => src/libse}/SubtitleFormats/SamiModern.cs (95%) rename {libse => src/libse}/SubtitleFormats/SamiYouTube.cs (95%) rename {libse => src/libse}/SubtitleFormats/SatBoxPng.cs (97%) rename {libse => src/libse}/SubtitleFormats/Scenarist.cs (97%) rename {libse => src/libse}/SubtitleFormats/ScenaristClosedCaptions.cs (97%) rename {libse => src/libse}/SubtitleFormats/ScenaristClosedCaptionsDropFrame.cs (97%) rename {libse => src/libse}/SubtitleFormats/SeImageHtmlIndex.cs (97%) rename {libse => src/libse}/SubtitleFormats/SmilTimesheetData.cs (97%) rename {libse => src/libse}/SubtitleFormats/SmpteTt2052.cs (100%) rename {libse => src/libse}/SubtitleFormats/SoftNiColonSub.cs (97%) rename {libse => src/libse}/SubtitleFormats/SoftNiSub.cs (97%) rename {libse => src/libse}/SubtitleFormats/Son.cs (97%) rename {libse => src/libse}/SubtitleFormats/SonicScenaristBitmaps.cs (97%) rename {libse => src/libse}/SubtitleFormats/SonyDVDArchitect.cs (97%) rename {libse => src/libse}/SubtitleFormats/SonyDVDArchitectExplicitDuration.cs (97%) rename {libse => src/libse}/SubtitleFormats/SonyDVDArchitectLineAndDuration.cs (97%) rename {libse => src/libse}/SubtitleFormats/SonyDVDArchitectLineDurationLength.cs (97%) rename {libse => src/libse}/SubtitleFormats/SonyDVDArchitectTabs.cs (97%) rename {libse => src/libse}/SubtitleFormats/SonyDVDArchitectWithLineNumbers.cs (97%) rename {libse => src/libse}/SubtitleFormats/Speechmatics.cs (100%) rename {libse => src/libse}/SubtitleFormats/Spruce.cs (97%) rename {libse => src/libse}/SubtitleFormats/SpruceWithSpace.cs (97%) rename {libse => src/libse}/SubtitleFormats/Spt.cs (96%) rename {libse => src/libse}/SubtitleFormats/Sptx.cs (100%) rename {libse => src/libse}/SubtitleFormats/SpuImage.cs (100%) rename {libse => src/libse}/SubtitleFormats/StructuredTitles.cs (97%) rename {libse => src/libse}/SubtitleFormats/SubRip.cs (97%) rename {libse => src/libse}/SubtitleFormats/SubStationAlpha.cs (97%) rename {libse => src/libse}/SubtitleFormats/SubUrbia.cs (100%) rename {libse => src/libse}/SubtitleFormats/SubViewer10.cs (97%) rename {libse => src/libse}/SubtitleFormats/SubViewer20.cs (97%) rename {libse => src/libse}/SubtitleFormats/SubtitleEditorProject.cs (97%) rename {libse => src/libse}/SubtitleFormats/SubtitleFormat.cs (97%) rename {libse => src/libse}/SubtitleFormats/SwiftInterchange2.cs (97%) rename {libse => src/libse}/SubtitleFormats/SwiftText.cs (97%) rename {libse => src/libse}/SubtitleFormats/SwiftTextLineNoAndDur.cs (97%) rename {libse => src/libse}/SubtitleFormats/SwiftTextLineNumber.cs (97%) rename {libse => src/libse}/SubtitleFormats/TMPlayer.cs (97%) rename {libse => src/libse}/SubtitleFormats/TSB4.cs (97%) rename {libse => src/libse}/SubtitleFormats/Ted20.cs (100%) rename {libse => src/libse}/SubtitleFormats/Tek.cs (97%) rename {libse => src/libse}/SubtitleFormats/TextST.cs (97%) rename {libse => src/libse}/SubtitleFormats/TimeCodesOnly1.cs (100%) rename {libse => src/libse}/SubtitleFormats/TimeCodesOnly2.cs (100%) rename {libse => src/libse}/SubtitleFormats/TimeXml.cs (97%) rename {libse => src/libse}/SubtitleFormats/TimeXml2.cs (97%) rename {libse => src/libse}/SubtitleFormats/TimedText.cs (98%) rename {libse => src/libse}/SubtitleFormats/TimedText10.cs (97%) rename {libse => src/libse}/SubtitleFormats/TimedText200604.cs (97%) rename {libse => src/libse}/SubtitleFormats/TimedText200604CData.cs (96%) rename {libse => src/libse}/SubtitleFormats/TimedText200604Ooyala.cs (100%) rename {libse => src/libse}/SubtitleFormats/TimedTextImage.cs (97%) rename {libse => src/libse}/SubtitleFormats/TimelineAscii.cs (97%) rename {libse => src/libse}/SubtitleFormats/TimelineFootageAscii.cs (97%) rename {libse => src/libse}/SubtitleFormats/TimelineMvt.cs (97%) rename {libse => src/libse}/SubtitleFormats/TitleExchangePro.cs (97%) rename {libse => src/libse}/SubtitleFormats/Titra.cs (97%) rename {libse => src/libse}/SubtitleFormats/TmpegEncAW5.cs (97%) rename {libse => src/libse}/SubtitleFormats/TmpegEncText.cs (97%) rename {libse => src/libse}/SubtitleFormats/TmpegEncXml.cs (97%) rename {libse => src/libse}/SubtitleFormats/Tmx14.cs (97%) rename {libse => src/libse}/SubtitleFormats/TranscriberXml.cs (97%) rename {libse => src/libse}/SubtitleFormats/TranscriptiveJson.cs (100%) rename {libse => src/libse}/SubtitleFormats/TurboTitler.cs (97%) rename {libse => src/libse}/SubtitleFormats/TwentyThreeJson.cs (100%) rename {libse => src/libse}/SubtitleFormats/TwentyThreeJsonEmbed.cs (100%) rename {libse => src/libse}/SubtitleFormats/TwentyThreeJsonEmbedWebSrt.cs (100%) rename {libse => src/libse}/SubtitleFormats/Tx3gTextOnly.cs (100%) rename {libse => src/libse}/SubtitleFormats/UTSubtitleXml.cs (97%) rename {libse => src/libse}/SubtitleFormats/UleadSubtitleFormat.cs (97%) rename {libse => src/libse}/SubtitleFormats/Ultech130.cs (97%) rename {libse => src/libse}/SubtitleFormats/UniversalSubtitleFormat.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle1.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle10.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle100.cs (100%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle101.cs (100%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle11.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle12.cs (96%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle13.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle14.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle15.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle16.cs (96%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle17.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle18.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle19.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle2.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle20.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle21.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle22.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle23.cs (96%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle24.cs (96%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle25.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle26.cs (96%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle27.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle28.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle29.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle3.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle30.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle31.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle32.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle33.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle34.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle35.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle36.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle37.cs (96%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle38.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle39.cs (96%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle4.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle40.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle41.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle42.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle43.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle44.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle45.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle46.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle47.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle48.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle49.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle5.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle50.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle51.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle52.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle53.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle54.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle55.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle56.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle57.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle58.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle59.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle6.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle60.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle61.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle62.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle63.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle64.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle65.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle66.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle67.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle68.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle69.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle7.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle70.cs (98%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle71.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle72.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle73.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle74.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle75.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle76.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle77.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle78.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle79.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle8.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle80.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle81.cs (96%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle82.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle83.cs (100%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle84.cs (100%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle85.cs (100%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle86.cs (100%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle87.cs (100%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle88.cs (100%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle89.cs (100%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle9.cs (97%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle90.cs (100%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle91.cs (100%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle92.cs (100%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle93.cs (100%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle94.cs (100%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle95.cs (100%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle96.cs (100%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle97.cs (100%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle98.cs (100%) rename {libse => src/libse}/SubtitleFormats/UnknownSubtitle99.cs (100%) rename {libse => src/libse}/SubtitleFormats/Utx.cs (97%) rename {libse => src/libse}/SubtitleFormats/UtxFrames.cs (97%) rename {libse => src/libse}/SubtitleFormats/VidIcelandic.cs (100%) rename {libse => src/libse}/SubtitleFormats/VocapiaSplit.cs (97%) rename {libse => src/libse}/SubtitleFormats/WebVTT.cs (97%) rename {libse => src/libse}/SubtitleFormats/WebVTTFileWithLineNumber.cs (97%) rename {libse => src/libse}/SubtitleFormats/WinCaps32.cs (100%) rename {libse => src/libse}/SubtitleFormats/Wsb.cs (97%) rename {libse => src/libse}/SubtitleFormats/Xif.cs (97%) rename {libse => src/libse}/SubtitleFormats/Xmp.cs (100%) rename {libse => src/libse}/SubtitleFormats/YouTubeAnnotations.cs (97%) rename {libse => src/libse}/SubtitleFormats/YouTubeSbv.cs (97%) rename {libse => src/libse}/SubtitleFormats/YouTubeTranscript.cs (97%) rename {libse => src/libse}/SubtitleFormats/YouTubeTranscriptOneLine.cs (97%) rename {libse => src/libse}/SubtitleFormats/ZeroG.cs (97%) rename {libse => src/libse}/Translate/Formatting.cs (100%) rename {libse => src/libse}/Translate/GoogleTranslator1.cs (100%) rename {libse => src/libse}/Translate/GoogleTranslator2.cs (100%) rename {libse => src/libse}/Translate/GoogleTranslator3.cs (100%) rename {libse => src/libse}/Translate/ITranslator.cs (100%) rename {libse => src/libse}/Translate/MicrosoftTranslator.cs (100%) rename {libse => src/libse}/Translate/TranslationHelper.cs (100%) rename {libse => src/libse}/Translate/TranslationPair.cs (100%) rename {libse => src/libse}/VobSub/Helper.cs (100%) rename {libse => src/libse}/VobSub/Idx.cs (100%) rename {libse => src/libse}/VobSub/IdxParagraph.cs (100%) rename {libse => src/libse}/VobSub/Mpeg2Header.cs (100%) rename {libse => src/libse}/VobSub/PacketizedElementaryStream.cs (100%) rename {libse => src/libse}/VobSub/SpHeader.cs (100%) rename {libse => src/libse}/VobSub/SubPicture.cs (100%) rename {libse => src/libse}/VobSub/VobSubMergedPack.cs (100%) rename {libse => src/libse}/VobSub/VobSubPack.cs (100%) rename {libse => src/libse}/VobSub/VobSubParser.cs (100%) rename {libse => src/libse}/VobSub/VobSubWriter.cs (100%) rename src/{ => ui}/Controls/AudioVisualizer.Designer.cs (97%) rename src/{ => ui}/Controls/AudioVisualizer.cs (97%) rename src/{ => ui}/Controls/AudioVisualizer.resx (97%) rename src/{ => ui}/Controls/SETextBox.cs (97%) rename src/{ => ui}/Controls/SubtitleListView.cs (97%) rename src/{ => ui}/Controls/TimeUpDown.Designer.cs (97%) rename src/{ => ui}/Controls/TimeUpDown.cs (97%) rename src/{Forms/Ocr/VobSubOcrNewFolder.resx => ui/Controls/TimeUpDown.resx} (100%) rename src/{ => ui}/Controls/VideoPlayerContainer.cs (97%) rename src/{ => ui}/Controls/VideoPlayerContainer.resx (98%) rename src/{ => ui}/DLLs/Interop.QuartzTypeLib.dll (100%) rename src/{ => ui}/DLLs/Voikkox64.dll (100%) rename src/{ => ui}/DLLs/Voikkox86.dll (100%) rename src/{ => ui}/Forms/About.Designer.cs (98%) rename src/{ => ui}/Forms/About.cs (97%) rename src/{ => ui}/Forms/About.resx (98%) rename src/{ => ui}/Forms/AddToNames.Designer.cs (97%) rename src/{ => ui}/Forms/AddToNames.cs (97%) rename src/{Forms/AlignmentPickerJapanese.resx => ui/Forms/AddToNames.resx} (100%) rename src/{ => ui}/Forms/AddToUserDic.Designer.cs (97%) rename src/{ => ui}/Forms/AddToUserDic.cs (97%) rename src/{Forms/AudioToText.resx => ui/Forms/AddToUserDic.resx} (100%) rename src/{ => ui}/Forms/AddWaveform.Designer.cs (100%) rename src/{ => ui}/Forms/AddWaveform.cs (97%) rename src/{ => ui}/Forms/AddWaveform.resx (100%) rename src/{ => ui}/Forms/AddWaveformBatch.Designer.cs (100%) rename src/{ => ui}/Forms/AddWaveformBatch.cs (100%) rename src/{ => ui}/Forms/AddWaveformBatch.resx (100%) rename src/{ => ui}/Forms/AdjustDisplayDuration.Designer.cs (98%) rename src/{ => ui}/Forms/AdjustDisplayDuration.cs (97%) rename src/{ => ui}/Forms/AdjustDisplayDuration.resx (97%) rename src/{ => ui}/Forms/AlignmentPicker.Designer.cs (97%) rename src/{ => ui}/Forms/AlignmentPicker.cs (96%) rename src/{Forms/BatchConvertMkvEnding.resx => ui/Forms/AlignmentPicker.resx} (100%) rename src/{ => ui}/Forms/AlignmentPickerJapanese.Designer.cs (100%) rename src/{ => ui}/Forms/AlignmentPickerJapanese.cs (100%) rename src/{Forms/BookmarkAdd.resx => ui/Forms/AlignmentPickerJapanese.resx} (100%) rename src/{ => ui}/Forms/ApplyDurationLimits.Designer.cs (98%) rename src/{ => ui}/Forms/ApplyDurationLimits.cs (97%) rename src/{Forms/MergeTextWithSameTimeCodes.resx => ui/Forms/ApplyDurationLimits.resx} (100%) rename src/{ => ui}/Forms/AudioToText.Designer.cs (100%) rename src/{ => ui}/Forms/AudioToText.cs (100%) rename src/{Forms/BookmarksGoTo.resx => ui/Forms/AudioToText.resx} (100%) rename src/{ => ui}/Forms/AutoBreakUnbreakLines.Designer.cs (98%) rename src/{ => ui}/Forms/AutoBreakUnbreakLines.cs (97%) rename src/{Forms/Ocr/OCRSpellCheck.resx => ui/Forms/AutoBreakUnbreakLines.resx} (100%) rename src/{ => ui}/Forms/BatchConvert.Designer.cs (98%) rename src/{ => ui}/Forms/BatchConvert.cs (97%) rename src/{ => ui}/Forms/BatchConvert.resx (98%) rename src/{ => ui}/Forms/BatchConvertMkvEnding.Designer.cs (100%) rename src/{ => ui}/Forms/BatchConvertMkvEnding.cs (100%) rename src/{Forms/ChooseFontName.resx => ui/Forms/BatchConvertMkvEnding.resx} (100%) rename src/{ => ui}/Forms/BatchConvertTsSettings.Designer.cs (100%) rename src/{ => ui}/Forms/BatchConvertTsSettings.cs (100%) rename src/{ => ui}/Forms/BatchConvertTsSettings.resx (100%) rename src/{ => ui}/Forms/Beamer.Designer.cs (97%) rename src/{ => ui}/Forms/Beamer.cs (97%) rename src/{ => ui}/Forms/Beamer.resx (97%) rename src/{ => ui}/Forms/BookmarkAdd.Designer.cs (100%) rename src/{ => ui}/Forms/BookmarkAdd.cs (100%) rename src/{Forms/DialogDoNotShowAgain.resx => ui/Forms/BookmarkAdd.resx} (100%) rename src/{ => ui}/Forms/BookmarksGoTo.Designer.cs (100%) rename src/{ => ui}/Forms/BookmarksGoTo.cs (100%) rename src/{Forms/DownloadFfmpeg.resx => ui/Forms/BookmarksGoTo.resx} (100%) rename src/{ => ui}/Forms/Cavena890SaveOptions.Designer.cs (98%) rename src/{ => ui}/Forms/Cavena890SaveOptions.cs (98%) rename src/{ => ui}/Forms/Cavena890SaveOptions.resx (97%) rename src/{ => ui}/Forms/ChangeCasing.Designer.cs (98%) rename src/{ => ui}/Forms/ChangeCasing.cs (97%) rename src/{ => ui}/Forms/ChangeCasing.resx (97%) rename src/{ => ui}/Forms/ChangeCasingNames.Designer.cs (98%) rename src/{ => ui}/Forms/ChangeCasingNames.cs (97%) rename src/{ => ui}/Forms/ChangeCasingNames.resx (97%) rename src/{ => ui}/Forms/ChangeFrameRate.Designer.cs (98%) rename src/{ => ui}/Forms/ChangeFrameRate.cs (97%) rename src/{ => ui}/Forms/ChangeFrameRate.resx (97%) rename src/{ => ui}/Forms/ChangeSpeedInPercent.Designer.cs (98%) rename src/{ => ui}/Forms/ChangeSpeedInPercent.cs (97%) rename src/{Forms/DvdStudioProProperties.resx => ui/Forms/ChangeSpeedInPercent.resx} (100%) rename src/{ => ui}/Forms/CheckForUpdates.Designer.cs (100%) rename src/{ => ui}/Forms/CheckForUpdates.cs (100%) rename src/{ => ui}/Forms/CheckForUpdates.resx (100%) rename src/{ => ui}/Forms/ChooseAudioTrack.Designer.cs (97%) rename src/{ => ui}/Forms/ChooseAudioTrack.cs (96%) rename src/{Forms/EbuColorPicker.resx => ui/Forms/ChooseAudioTrack.resx} (100%) rename src/{ => ui}/Forms/ChooseEncoding.Designer.cs (98%) rename src/{ => ui}/Forms/ChooseEncoding.cs (97%) rename src/{ => ui}/Forms/ChooseEncoding.resx (97%) rename src/{ => ui}/Forms/ChooseFontName.Designer.cs (100%) rename src/{ => ui}/Forms/ChooseFontName.cs (100%) rename src/{Forms/EbuLanguageCode.resx => ui/Forms/ChooseFontName.resx} (100%) rename src/{ => ui}/Forms/ChooseLanguage.Designer.cs (97%) rename src/{ => ui}/Forms/ChooseLanguage.cs (97%) rename src/{ => ui}/Forms/ChooseLanguage.resx (97%) rename src/{ => ui}/Forms/ChooseResolution.Designer.cs (97%) rename src/{ => ui}/Forms/ChooseResolution.cs (97%) rename src/{ => ui}/Forms/ChooseResolution.resx (97%) rename src/{ => ui}/Forms/ChooseStyle.Designer.cs (97%) rename src/{ => ui}/Forms/ChooseStyle.cs (97%) rename src/{Forms/ExportPngXmlDialogOpenFolder.resx => ui/Forms/ChooseStyle.resx} (100%) rename src/{ => ui}/Forms/ColorChooser.cs (100%) rename src/{ => ui}/Forms/ColorChooser.resx (100%) rename src/{ => ui}/Forms/ColumnPaste.Designer.cs (98%) rename src/{ => ui}/Forms/ColumnPaste.cs (97%) rename src/{Forms/ExportPngXmlPreview.resx => ui/Forms/ColumnPaste.resx} (100%) rename src/{ => ui}/Forms/Compare.Designer.cs (98%) rename src/{ => ui}/Forms/Compare.cs (97%) rename src/{ => ui}/Forms/Compare.resx (98%) rename src/{ => ui}/Forms/DCinema/DCinemaPropertiesInterop.Designer.cs (100%) rename src/{ => ui}/Forms/DCinema/DCinemaPropertiesInterop.cs (100%) rename src/{ => ui}/Forms/DCinema/DCinemaPropertiesInterop.resx (100%) rename src/{ => ui}/Forms/DCinema/DCinemaPropertiesSmpte.Designer.cs (100%) rename src/{ => ui}/Forms/DCinema/DCinemaPropertiesSmpte.cs (100%) rename src/{ => ui}/Forms/DCinema/DCinemaPropertiesSmpte.resx (100%) rename src/{ => ui}/Forms/DialogDoNotShowAgain.Designer.cs (100%) rename src/{ => ui}/Forms/DialogDoNotShowAgain.cs (100%) rename src/{Forms/ImportFinalDraft.resx => ui/Forms/DialogDoNotShowAgain.resx} (100%) rename src/{ => ui}/Forms/DoNotBreakAfterListEdit.Designer.cs (98%) rename src/{ => ui}/Forms/DoNotBreakAfterListEdit.cs (97%) rename src/{Forms/MultipleReplaceNewGroup.resx => ui/Forms/DoNotBreakAfterListEdit.resx} (100%) rename src/{ => ui}/Forms/DownloadFfmpeg.Designer.cs (100%) rename src/{ => ui}/Forms/DownloadFfmpeg.cs (100%) rename src/{Forms/NetflixFixErrors.resx => ui/Forms/DownloadFfmpeg.resx} (100%) rename src/{ => ui}/Forms/DurationsBridgeGaps.Designer.cs (98%) rename src/{ => ui}/Forms/DurationsBridgeGaps.cs (97%) rename src/{Forms/Networking/NetworkJoin.resx => ui/Forms/DurationsBridgeGaps.resx} (100%) rename src/{ => ui}/Forms/DvdStudioProProperties.Designer.cs (100%) rename src/{ => ui}/Forms/DvdStudioProProperties.cs (100%) rename src/{Forms/Networking/NetworkLogAndInfo.resx => ui/Forms/DvdStudioProProperties.resx} (100%) rename src/{ => ui}/Forms/DvdSubRip.Designer.cs (98%) rename src/{ => ui}/Forms/DvdSubRip.cs (97%) rename src/{ => ui}/Forms/DvdSubRip.resx (97%) rename src/{ => ui}/Forms/DvdSubRipChooseLanguage.Designer.cs (98%) rename src/{ => ui}/Forms/DvdSubRipChooseLanguage.cs (97%) rename src/{Forms/Networking/NetworkStart.resx => ui/Forms/DvdSubRipChooseLanguage.resx} (100%) rename src/{ => ui}/Forms/EbuColorPicker.Designer.cs (100%) rename src/{ => ui}/Forms/EbuColorPicker.cs (100%) rename src/{Forms/Ocr/AddBeterMultiMatch.resx => ui/Forms/EbuColorPicker.resx} (100%) rename src/{ => ui}/Forms/EbuLanguageCode.Designer.cs (100%) rename src/{ => ui}/Forms/EbuLanguageCode.cs (100%) rename src/{Forms/Ocr/AddBetterMultiMatchNOcr.resx => ui/Forms/EbuLanguageCode.resx} (100%) rename src/{ => ui}/Forms/EbuSaveOptions.Designer.cs (98%) rename src/{ => ui}/Forms/EbuSaveOptions.cs (97%) rename src/{ => ui}/Forms/EbuSaveOptions.resx (97%) rename src/{ => ui}/Forms/EffectKaraoke.Designer.cs (97%) rename src/{ => ui}/Forms/EffectKaraoke.cs (97%) rename src/{ => ui}/Forms/EffectKaraoke.resx (97%) rename src/{ => ui}/Forms/EffectTypewriter.Designer.cs (97%) rename src/{ => ui}/Forms/EffectTypewriter.cs (97%) rename src/{ => ui}/Forms/EffectTypewriter.resx (97%) rename src/{ => ui}/Forms/ExportCustomText.Designer.cs (98%) rename src/{ => ui}/Forms/ExportCustomText.cs (97%) rename src/{ => ui}/Forms/ExportCustomText.resx (97%) rename src/{ => ui}/Forms/ExportCustomTextFormat.Designer.cs (98%) rename src/{ => ui}/Forms/ExportCustomTextFormat.cs (97%) rename src/{ => ui}/Forms/ExportCustomTextFormat.resx (98%) rename src/{ => ui}/Forms/ExportFcpXmlAdvanced.Designer.cs (100%) rename src/{ => ui}/Forms/ExportFcpXmlAdvanced.cs (100%) rename src/{ => ui}/Forms/ExportFcpXmlAdvanced.resx (100%) rename src/{ => ui}/Forms/ExportPngXml.Designer.cs (98%) rename src/{ => ui}/Forms/ExportPngXml.cs (97%) rename src/{ => ui}/Forms/ExportPngXml.resx (98%) rename src/{ => ui}/Forms/ExportPngXmlDialogOpenFolder.Designer.cs (100%) rename src/{ => ui}/Forms/ExportPngXmlDialogOpenFolder.cs (100%) rename src/{Forms/Ocr/AddToOcrReplaceList.resx => ui/Forms/ExportPngXmlDialogOpenFolder.resx} (100%) rename src/{ => ui}/Forms/ExportPngXmlPreview.Designer.cs (100%) rename src/{ => ui}/Forms/ExportPngXmlPreview.cs (100%) rename src/{Forms/Ocr/BinaryOcrChooseEditDb.resx => ui/Forms/ExportPngXmlPreview.resx} (100%) rename src/{ => ui}/Forms/ExportText.Designer.cs (98%) rename src/{ => ui}/Forms/ExportText.cs (97%) rename src/{ => ui}/Forms/ExportText.resx (97%) rename src/{ => ui}/Forms/ExportTextST.Designer.cs (98%) rename src/{ => ui}/Forms/ExportTextST.cs (97%) rename src/{ => ui}/Forms/ExportTextST.resx (98%) rename src/{ => ui}/Forms/ExtractDateTimeInfo.Designer.cs (98%) rename src/{ => ui}/Forms/ExtractDateTimeInfo.cs (97%) rename src/{ => ui}/Forms/ExtractDateTimeInfo.resx (97%) rename src/{ => ui}/Forms/FcpProperties.Designer.cs (97%) rename src/{ => ui}/Forms/FcpProperties.cs (96%) rename src/{Forms/Ocr/DownloadTesseract302.resx => ui/Forms/FcpProperties.resx} (100%) rename src/{ => ui}/Forms/FindDialog.Designer.cs (98%) rename src/{ => ui}/Forms/FindDialog.cs (97%) rename src/{ => ui}/Forms/FindDialog.resx (97%) rename src/{ => ui}/Forms/FindSubtitleLine.Designer.cs (98%) rename src/{ => ui}/Forms/FindSubtitleLine.cs (97%) rename src/{ => ui}/Forms/FindSubtitleLine.resx (97%) rename src/{ => ui}/Forms/FixCommonErrors.Designer.cs (98%) rename src/{ => ui}/Forms/FixCommonErrors.cs (97%) rename src/{ => ui}/Forms/FixCommonErrors.resx (98%) rename src/{ => ui}/Forms/GetDictionaries.Designer.cs (98%) rename src/{ => ui}/Forms/GetDictionaries.cs (97%) rename src/{ => ui}/Forms/GetDictionaries.resx (97%) rename src/{ => ui}/Forms/GoToLine.Designer.cs (97%) rename src/{ => ui}/Forms/GoToLine.cs (97%) rename src/{ => ui}/Forms/GoToLine.resx (97%) rename src/{ => ui}/Forms/GoogleOrMicrosoftTranslate.Designer.cs (97%) rename src/{ => ui}/Forms/GoogleOrMicrosoftTranslate.cs (97%) rename src/{Forms/Ocr/DownloadTesseract4.resx => ui/Forms/GoogleOrMicrosoftTranslate.resx} (100%) rename src/{ => ui}/Forms/GoogleTranslate.Designer.cs (98%) rename src/{ => ui}/Forms/GoogleTranslate.cs (97%) rename src/{ => ui}/Forms/GoogleTranslate.resx (97%) rename src/{ => ui}/Forms/HardSubExtract.Designer.cs (98%) rename src/{ => ui}/Forms/HardSubExtract.cs (97%) rename src/{ => ui}/Forms/HardSubExtract.resx (98%) rename src/{ => ui}/Forms/ImportCdg.Designer.cs (100%) rename src/{ => ui}/Forms/ImportCdg.cs (100%) rename src/{ => ui}/Forms/ImportCdg.resx (100%) rename src/{ => ui}/Forms/ImportFinalDraft.Designer.cs (100%) rename src/{ => ui}/Forms/ImportFinalDraft.cs (100%) rename src/{Forms/Ocr/GetTesseract302Dictionaries.resx => ui/Forms/ImportFinalDraft.resx} (100%) rename src/{ => ui}/Forms/ImportImages.Designer.cs (98%) rename src/{ => ui}/Forms/ImportImages.cs (97%) rename src/{ => ui}/Forms/ImportImages.resx (97%) rename src/{ => ui}/Forms/ImportSceneChanges.Designer.cs (98%) rename src/{ => ui}/Forms/ImportSceneChanges.cs (97%) rename src/{ => ui}/Forms/ImportSceneChanges.resx (97%) rename src/{ => ui}/Forms/ImportText.Designer.cs (98%) rename src/{ => ui}/Forms/ImportText.cs (97%) rename src/{ => ui}/Forms/ImportText.resx (98%) rename src/{ => ui}/Forms/ImportUnknownFormat.Designer.cs (98%) rename src/{ => ui}/Forms/ImportUnknownFormat.cs (97%) rename src/{ => ui}/Forms/ImportUnknownFormat.resx (97%) rename src/{ => ui}/Forms/Interjections.Designer.cs (97%) rename src/{ => ui}/Forms/Interjections.cs (97%) rename src/{Forms/Ocr/GetTesseractDictionaries.resx => ui/Forms/Interjections.resx} (100%) rename src/{ => ui}/Forms/JoinSubtitles.Designer.cs (98%) rename src/{ => ui}/Forms/JoinSubtitles.cs (97%) rename src/{ => ui}/Forms/JoinSubtitles.resx (97%) rename src/{ => ui}/Forms/Main.Designer.cs (98%) rename src/{ => ui}/Forms/Main.cs (97%) rename src/{ => ui}/Forms/Main.resx (98%) rename src/{ => ui}/Forms/MatroskaSubtitleChooser.Designer.cs (98%) rename src/{ => ui}/Forms/MatroskaSubtitleChooser.cs (97%) rename src/{ => ui}/Forms/MatroskaSubtitleChooser.resx (97%) rename src/{ => ui}/Forms/MeasurementConverter.Designer.cs (98%) rename src/{ => ui}/Forms/MeasurementConverter.cs (97%) rename src/{Forms/ProfileChoose.resx => ui/Forms/MeasurementConverter.resx} (100%) rename src/{ => ui}/Forms/MergeDoubleLines.Designer.cs (98%) rename src/{ => ui}/Forms/MergeDoubleLines.cs (97%) rename src/{ => ui}/Forms/MergeDoubleLines.resx (97%) rename src/{ => ui}/Forms/MergeShortLines.Designer.cs (98%) rename src/{ => ui}/Forms/MergeShortLines.cs (97%) rename src/{ => ui}/Forms/MergeShortLines.resx (97%) rename src/{ => ui}/Forms/MergeTextWithSameTimeCodes.Designer.cs (100%) rename src/{ => ui}/Forms/MergeTextWithSameTimeCodes.cs (100%) rename src/{Forms/ApplyDurationLimits.resx => ui/Forms/MergeTextWithSameTimeCodes.resx} (97%) rename src/{ => ui}/Forms/ModifySelection.Designer.cs (98%) rename src/{ => ui}/Forms/ModifySelection.cs (97%) rename src/{ => ui}/Forms/ModifySelection.resx (97%) rename src/{ => ui}/Forms/MultipleReplace.Designer.cs (98%) rename src/{ => ui}/Forms/MultipleReplace.cs (97%) rename src/{ => ui}/Forms/MultipleReplace.resx (98%) rename src/{ => ui}/Forms/MultipleReplaceExportImport.Designer.cs (100%) rename src/{ => ui}/Forms/MultipleReplaceExportImport.cs (100%) rename src/{ => ui}/Forms/MultipleReplaceExportImport.resx (100%) rename src/{ => ui}/Forms/MultipleReplaceNewGroup.Designer.cs (100%) rename src/{ => ui}/Forms/MultipleReplaceNewGroup.cs (100%) rename src/{Forms/RubyJapanese.resx => ui/Forms/MultipleReplaceNewGroup.resx} (100%) rename src/{ => ui}/Forms/NetflixFixErrors.Designer.cs (100%) rename src/{ => ui}/Forms/NetflixFixErrors.cs (100%) rename src/{Forms/SetVideoOffset.resx => ui/Forms/NetflixFixErrors.resx} (100%) rename src/{ => ui}/Forms/Networking/NetworkChat.Designer.cs (100%) rename src/{ => ui}/Forms/Networking/NetworkChat.cs (100%) rename src/{ => ui}/Forms/Networking/NetworkChat.resx (100%) rename src/{ => ui}/Forms/Networking/NetworkJoin.Designer.cs (100%) rename src/{ => ui}/Forms/Networking/NetworkJoin.cs (100%) rename src/{Forms/SettingsFixContinuationStyle.resx => ui/Forms/Networking/NetworkJoin.resx} (100%) rename src/{ => ui}/Forms/Networking/NetworkLogAndInfo.Designer.cs (100%) rename src/{ => ui}/Forms/Networking/NetworkLogAndInfo.cs (100%) rename src/{Forms/SettingsGapChoose.resx => ui/Forms/Networking/NetworkLogAndInfo.resx} (100%) rename src/{ => ui}/Forms/Networking/NetworkStart.Designer.cs (100%) rename src/{ => ui}/Forms/Networking/NetworkStart.cs (100%) rename src/{Forms/SettingsLineWidth.resx => ui/Forms/Networking/NetworkStart.resx} (100%) rename src/{ => ui}/Forms/NuendoProperties.Designer.cs (97%) rename src/{ => ui}/Forms/NuendoProperties.cs (97%) rename src/{ => ui}/Forms/NuendoProperties.resx (97%) rename src/{ => ui}/Forms/Ocr/AddBeterMultiMatch.Designer.cs (100%) rename src/{ => ui}/Forms/Ocr/AddBeterMultiMatch.cs (100%) rename src/{Forms/TextPrompt.resx => ui/Forms/Ocr/AddBeterMultiMatch.resx} (100%) rename src/{ => ui}/Forms/Ocr/AddBetterMultiMatchNOcr.Designer.cs (100%) rename src/{ => ui}/Forms/Ocr/AddBetterMultiMatchNOcr.cs (100%) rename src/{Forms/TimedTextNewLanguage.resx => ui/Forms/Ocr/AddBetterMultiMatchNOcr.resx} (100%) rename src/{ => ui}/Forms/Ocr/AddToOcrReplaceList.Designer.cs (100%) rename src/{ => ui}/Forms/Ocr/AddToOcrReplaceList.cs (100%) rename src/{Logic/VideoPlayers/MpcHC/MessageHandlerWindow.resx => ui/Forms/Ocr/AddToOcrReplaceList.resx} (100%) rename src/{ => ui}/Forms/Ocr/BinaryOcrChooseEditDb.Designer.cs (100%) rename src/{ => ui}/Forms/Ocr/BinaryOcrChooseEditDb.cs (100%) rename src/{Forms/AddToNames.resx => ui/Forms/Ocr/BinaryOcrChooseEditDb.resx} (97%) rename src/{ => ui}/Forms/Ocr/BinaryOcrTrain.Designer.cs (100%) rename src/{ => ui}/Forms/Ocr/BinaryOcrTrain.cs (100%) rename src/{ => ui}/Forms/Ocr/BinaryOcrTrain.resx (100%) rename src/{ => ui}/Forms/Ocr/DownloadTesseract302.Designer.cs (100%) rename src/{ => ui}/Forms/Ocr/DownloadTesseract302.cs (100%) rename src/{Forms/AddToUserDic.resx => ui/Forms/Ocr/DownloadTesseract302.resx} (97%) rename src/{ => ui}/Forms/Ocr/DownloadTesseract4.Designer.cs (100%) rename src/{ => ui}/Forms/Ocr/DownloadTesseract4.cs (100%) rename src/{Forms/AlignmentPicker.resx => ui/Forms/Ocr/DownloadTesseract4.resx} (97%) rename src/{ => ui}/Forms/Ocr/GetTesseract302Dictionaries.Designer.cs (100%) rename src/{ => ui}/Forms/Ocr/GetTesseract302Dictionaries.cs (100%) rename src/{Forms/ChangeSpeedInPercent.resx => ui/Forms/Ocr/GetTesseract302Dictionaries.resx} (97%) rename src/{ => ui}/Forms/Ocr/GetTesseractDictionaries.Designer.cs (100%) rename src/{ => ui}/Forms/Ocr/GetTesseractDictionaries.cs (100%) create mode 100644 src/ui/Forms/Ocr/GetTesseractDictionaries.resx rename src/{ => ui}/Forms/Ocr/OCRSpellCheck.Designer.cs (100%) rename src/{ => ui}/Forms/Ocr/OCRSpellCheck.cs (100%) rename src/{Forms/AutoBreakUnbreakLines.resx => ui/Forms/Ocr/OCRSpellCheck.resx} (97%) rename src/{ => ui}/Forms/Ocr/OcrPreprocessingSettings.Designer.cs (100%) rename src/{ => ui}/Forms/Ocr/OcrPreprocessingSettings.cs (100%) rename src/{ => ui}/Forms/Ocr/OcrPreprocessingSettings.resx (100%) rename src/{ => ui}/Forms/Ocr/OcrPreprocessingT4.Designer.cs (100%) rename src/{ => ui}/Forms/Ocr/OcrPreprocessingT4.cs (100%) rename src/{ => ui}/Forms/Ocr/OcrPreprocessingT4.resx (100%) rename src/{ => ui}/Forms/Ocr/VobSubCharactersImport.Designer.cs (100%) rename src/{ => ui}/Forms/Ocr/VobSubCharactersImport.cs (100%) rename src/{ => ui}/Forms/Ocr/VobSubCharactersImport.resx (100%) rename src/{ => ui}/Forms/Ocr/VobSubEditCharacters.Designer.cs (100%) rename src/{ => ui}/Forms/Ocr/VobSubEditCharacters.cs (100%) rename src/{ => ui}/Forms/Ocr/VobSubEditCharacters.resx (100%) rename src/{ => ui}/Forms/Ocr/VobSubNOcrCharacterInspect.Designer.cs (100%) rename src/{ => ui}/Forms/Ocr/VobSubNOcrCharacterInspect.cs (100%) rename src/{ => ui}/Forms/Ocr/VobSubNOcrCharacterInspect.resx (100%) rename src/{ => ui}/Forms/Ocr/VobSubNOcrEdit.Designer.cs (100%) rename src/{ => ui}/Forms/Ocr/VobSubNOcrEdit.cs (100%) rename src/{ => ui}/Forms/Ocr/VobSubNOcrEdit.resx (100%) rename src/{ => ui}/Forms/Ocr/VobSubNOcrTrain.Designer.cs (100%) rename src/{ => ui}/Forms/Ocr/VobSubNOcrTrain.cs (100%) rename src/{ => ui}/Forms/Ocr/VobSubNOcrTrain.resx (100%) rename src/{ => ui}/Forms/Ocr/VobSubOcr.Designer.cs (100%) rename src/{ => ui}/Forms/Ocr/VobSubOcr.cs (100%) rename src/{ => ui}/Forms/Ocr/VobSubOcr.resx (100%) rename src/{ => ui}/Forms/Ocr/VobSubOcrCharacter.Designer.cs (100%) rename src/{ => ui}/Forms/Ocr/VobSubOcrCharacter.cs (100%) rename src/{ => ui}/Forms/Ocr/VobSubOcrCharacter.resx (100%) rename src/{ => ui}/Forms/Ocr/VobSubOcrCharacterInspect.Designer.cs (100%) rename src/{ => ui}/Forms/Ocr/VobSubOcrCharacterInspect.cs (100%) rename src/{ => ui}/Forms/Ocr/VobSubOcrCharacterInspect.resx (100%) rename src/{ => ui}/Forms/Ocr/VobSubOcrNOcrCharacter.Designer.cs (100%) rename src/{ => ui}/Forms/Ocr/VobSubOcrNOcrCharacter.cs (100%) rename src/{ => ui}/Forms/Ocr/VobSubOcrNOcrCharacter.resx (100%) rename src/{ => ui}/Forms/Ocr/VobSubOcrNewFolder.Designer.cs (100%) rename src/{ => ui}/Forms/Ocr/VobSubOcrNewFolder.cs (100%) rename src/{Controls/TimeUpDown.resx => ui/Forms/Ocr/VobSubOcrNewFolder.resx} (97%) rename src/{ => ui}/Forms/Ocr/VobSubOcrSetItalicFactor.Designer.cs (100%) rename src/{ => ui}/Forms/Ocr/VobSubOcrSetItalicFactor.cs (100%) rename src/{ => ui}/Forms/Ocr/VobSubOcrSetItalicFactor.resx (100%) rename src/{ => ui}/Forms/OpenVideoDvd.Designer.cs (98%) rename src/{ => ui}/Forms/OpenVideoDvd.cs (97%) rename src/{ => ui}/Forms/OpenVideoDvd.resx (97%) rename src/{ => ui}/Forms/PacEncoding.Designer.cs (97%) rename src/{ => ui}/Forms/PacEncoding.cs (97%) rename src/{ => ui}/Forms/PacEncoding.resx (97%) rename src/{ => ui}/Forms/PluginsGet.Designer.cs (98%) rename src/{ => ui}/Forms/PluginsGet.cs (97%) rename src/{ => ui}/Forms/PluginsGet.resx (97%) rename src/{ => ui}/Forms/PositionAndSizeForm.cs (100%) rename src/{ => ui}/Forms/ProfileChoose.Designer.cs (100%) rename src/{ => ui}/Forms/ProfileChoose.cs (100%) create mode 100644 src/ui/Forms/ProfileChoose.resx rename src/{ => ui}/Forms/RemoveTextFromHearImpaired.Designer.cs (98%) rename src/{ => ui}/Forms/RemoveTextFromHearImpaired.cs (97%) rename src/{ => ui}/Forms/RemoveTextFromHearImpaired.resx (97%) rename src/{ => ui}/Forms/ReplaceDialog.Designer.cs (98%) rename src/{ => ui}/Forms/ReplaceDialog.cs (96%) rename src/{ => ui}/Forms/ReplaceDialog.resx (97%) rename src/{ => ui}/Forms/RestoreAutoBackup.Designer.cs (98%) rename src/{ => ui}/Forms/RestoreAutoBackup.cs (97%) rename src/{ => ui}/Forms/RestoreAutoBackup.resx (97%) rename src/{ => ui}/Forms/RubyJapanese.Designer.cs (100%) rename src/{ => ui}/Forms/RubyJapanese.cs (100%) create mode 100644 src/ui/Forms/RubyJapanese.resx rename src/{ => ui}/Forms/SeekSilence.Designer.cs (97%) rename src/{ => ui}/Forms/SeekSilence.cs (97%) rename src/{ => ui}/Forms/SeekSilence.resx (97%) rename src/{ => ui}/Forms/SetMinimumDisplayTimeBetweenParagraphs.Designer.cs (98%) rename src/{ => ui}/Forms/SetMinimumDisplayTimeBetweenParagraphs.cs (97%) rename src/{ => ui}/Forms/SetMinimumDisplayTimeBetweenParagraphs.resx (97%) rename src/{ => ui}/Forms/SetSyncPoint.Designer.cs (98%) rename src/{ => ui}/Forms/SetSyncPoint.cs (97%) rename src/{ => ui}/Forms/SetSyncPoint.resx (97%) rename src/{ => ui}/Forms/SetVideoOffset.Designer.cs (98%) rename src/{ => ui}/Forms/SetVideoOffset.cs (97%) create mode 100644 src/ui/Forms/SetVideoOffset.resx rename src/{ => ui}/Forms/Settings.Designer.cs (98%) rename src/{ => ui}/Forms/Settings.cs (98%) rename src/{ => ui}/Forms/Settings.resx (98%) rename src/{ => ui}/Forms/SettingsFixContinuationStyle.Designer.cs (100%) rename src/{ => ui}/Forms/SettingsFixContinuationStyle.cs (100%) create mode 100644 src/ui/Forms/SettingsFixContinuationStyle.resx rename src/{ => ui}/Forms/SettingsGapChoose.Designer.cs (100%) rename src/{ => ui}/Forms/SettingsGapChoose.cs (100%) create mode 100644 src/ui/Forms/SettingsGapChoose.resx rename src/{ => ui}/Forms/SettingsLineWidth.Designer.cs (100%) rename src/{ => ui}/Forms/SettingsLineWidth.cs (100%) create mode 100644 src/ui/Forms/SettingsLineWidth.resx rename src/{ => ui}/Forms/SettingsMpv.Designer.cs (97%) rename src/{ => ui}/Forms/SettingsMpv.cs (97%) rename src/{ => ui}/Forms/SettingsMpv.resx (97%) rename src/{ => ui}/Forms/SettingsProfile.Designer.cs (100%) rename src/{ => ui}/Forms/SettingsProfile.cs (100%) rename src/{ => ui}/Forms/SettingsProfile.resx (100%) rename src/{ => ui}/Forms/SettingsProfileExport.Designer.cs (100%) rename src/{ => ui}/Forms/SettingsProfileExport.cs (100%) rename src/{ => ui}/Forms/SettingsProfileExport.resx (100%) rename src/{ => ui}/Forms/ShowEarlierLater.Designer.cs (98%) rename src/{ => ui}/Forms/ShowEarlierLater.cs (97%) rename src/{ => ui}/Forms/ShowEarlierLater.resx (97%) rename src/{ => ui}/Forms/ShowHistory.Designer.cs (97%) rename src/{ => ui}/Forms/ShowHistory.cs (97%) rename src/{ => ui}/Forms/ShowHistory.resx (97%) rename src/{ => ui}/Forms/SpellCheck.Designer.cs (98%) rename src/{ => ui}/Forms/SpellCheck.cs (97%) rename src/{ => ui}/Forms/SpellCheck.resx (97%) rename src/{ => ui}/Forms/Split.Designer.cs (98%) rename src/{ => ui}/Forms/Split.cs (97%) rename src/{ => ui}/Forms/Split.resx (97%) rename src/{ => ui}/Forms/SplitLongLines.Designer.cs (98%) rename src/{ => ui}/Forms/SplitLongLines.cs (97%) rename src/{ => ui}/Forms/SplitLongLines.resx (97%) rename src/{ => ui}/Forms/SplitSubtitle.Designer.cs (97%) rename src/{ => ui}/Forms/SplitSubtitle.cs (97%) rename src/{ => ui}/Forms/SplitSubtitle.resx (97%) rename src/{ => ui}/Forms/StartNumberingFrom.Designer.cs (97%) rename src/{ => ui}/Forms/StartNumberingFrom.cs (97%) rename src/{ => ui}/Forms/StartNumberingFrom.resx (97%) rename src/{ => ui}/Forms/Statistics.Designer.cs (98%) rename src/{ => ui}/Forms/Statistics.cs (97%) rename src/{ => ui}/Forms/Statistics.resx (97%) rename src/{ => ui}/Forms/StatusLog.Designer.cs (97%) rename src/{ => ui}/Forms/StatusLog.cs (96%) rename src/{ => ui}/Forms/StatusLog.resx (97%) rename src/{ => ui}/Forms/Styles/StylesForm.cs (100%) rename src/{ => ui}/Forms/Styles/SubStationAlphaStyles.Designer.cs (100%) rename src/{ => ui}/Forms/Styles/SubStationAlphaStyles.cs (100%) rename src/{ => ui}/Forms/Styles/SubStationAlphaStyles.resx (100%) rename src/{ => ui}/Forms/Styles/SubStationAlphaStylesBatchConvert.Designer.cs (100%) rename src/{ => ui}/Forms/Styles/SubStationAlphaStylesBatchConvert.cs (100%) rename src/{ => ui}/Forms/Styles/SubStationAlphaStylesBatchConvert.resx (100%) rename src/{ => ui}/Forms/Styles/SubStationAlphaStylesExport.Designer.cs (100%) rename src/{ => ui}/Forms/Styles/SubStationAlphaStylesExport.cs (100%) rename src/{ => ui}/Forms/Styles/SubStationAlphaStylesExport.resx (100%) rename src/{ => ui}/Forms/Styles/TimedTextStyles.Designer.cs (100%) rename src/{ => ui}/Forms/Styles/TimedTextStyles.cs (100%) rename src/{ => ui}/Forms/Styles/TimedTextStyles.resx (100%) rename src/{ => ui}/Forms/SubStationAlphaProperties.Designer.cs (98%) rename src/{ => ui}/Forms/SubStationAlphaProperties.cs (97%) rename src/{ => ui}/Forms/SubStationAlphaProperties.resx (97%) rename src/{ => ui}/Forms/SyncPointsSync.Designer.cs (98%) rename src/{ => ui}/Forms/SyncPointsSync.cs (97%) rename src/{ => ui}/Forms/SyncPointsSync.resx (97%) rename src/{ => ui}/Forms/TextPrompt.Designer.cs (100%) rename src/{ => ui}/Forms/TextPrompt.cs (100%) create mode 100644 src/ui/Forms/TextPrompt.resx rename src/{ => ui}/Forms/TimedTextNewLanguage.Designer.cs (100%) rename src/{ => ui}/Forms/TimedTextNewLanguage.cs (100%) create mode 100644 src/ui/Forms/TimedTextNewLanguage.resx rename src/{ => ui}/Forms/TimedTextProperties.Designer.cs (98%) rename src/{ => ui}/Forms/TimedTextProperties.cs (97%) rename src/{ => ui}/Forms/TimedTextProperties.resx (97%) rename src/{ => ui}/Forms/TransportStreamSubtitleChooser.Designer.cs (98%) rename src/{ => ui}/Forms/TransportStreamSubtitleChooser.cs (97%) rename src/{ => ui}/Forms/TransportStreamSubtitleChooser.resx (97%) rename src/{ => ui}/Forms/UnknownSubtitle.Designer.cs (98%) rename src/{ => ui}/Forms/UnknownSubtitle.cs (97%) rename src/{ => ui}/Forms/UnknownSubtitle.resx (97%) rename src/{ => ui}/Forms/VideoControlsUndocked.Designer.cs (97%) rename src/{ => ui}/Forms/VideoControlsUndocked.cs (96%) rename src/{ => ui}/Forms/VideoControlsUndocked.resx (97%) rename src/{ => ui}/Forms/VideoError.Designer.cs (98%) rename src/{ => ui}/Forms/VideoError.cs (97%) rename src/{ => ui}/Forms/VideoError.resx (97%) rename src/{ => ui}/Forms/VideoPlayerUndocked.Designer.cs (97%) rename src/{ => ui}/Forms/VideoPlayerUndocked.cs (97%) rename src/{ => ui}/Forms/VideoPlayerUndocked.resx (97%) rename src/{ => ui}/Forms/VisualSync.Designer.cs (98%) rename src/{ => ui}/Forms/VisualSync.cs (97%) rename src/{ => ui}/Forms/VisualSync.resx (98%) rename src/{ => ui}/Forms/Watermark.Designer.cs (97%) rename src/{ => ui}/Forms/Watermark.cs (96%) rename src/{ => ui}/Forms/Watermark.resx (97%) rename src/{ => ui}/Forms/WaveformGenerateTimeCodes.Designer.cs (98%) rename src/{ => ui}/Forms/WaveformGenerateTimeCodes.cs (97%) rename src/{ => ui}/Forms/WaveformGenerateTimeCodes.resx (97%) rename src/{ => ui}/Forms/WaveformUndocked.Designer.cs (97%) rename src/{ => ui}/Forms/WaveformUndocked.cs (97%) rename src/{ => ui}/Forms/WaveformUndocked.resx (97%) rename src/{ => ui}/Forms/YouTubeAnnotationsImport.Designer.cs (97%) rename src/{ => ui}/Forms/YouTubeAnnotationsImport.cs (97%) rename src/{ => ui}/Forms/YouTubeAnnotationsImport.resx (97%) rename src/{ => ui}/Icons/Donate.png (100%) rename src/{ => ui}/Icons/Find.png (100%) rename src/{ => ui}/Icons/FixCommonErrors.png (100%) rename src/{ => ui}/Icons/Help.png (100%) rename src/{ => ui}/Icons/New.png (100%) rename src/{ => ui}/Icons/Open.png (100%) rename src/{ => ui}/Icons/RemoveTextForHI.png (100%) rename src/{ => ui}/Icons/Replace.png (100%) rename src/{ => ui}/Icons/SE.ico (100%) rename src/{ => ui}/Icons/Save.png (100%) rename src/{ => ui}/Icons/SaveAs.png (100%) rename src/{ => ui}/Icons/Settings.png (100%) rename src/{ => ui}/Icons/SpellCheck.png (100%) rename src/{ => ui}/Icons/VideoToggle.png (100%) rename src/{ => ui}/Icons/VisualSync.png (100%) rename src/{ => ui}/Icons/WaveformToggle.png (100%) rename src/{ => ui}/Icons/connect.png (100%) create mode 100644 src/ui/Languages/XmlContentTranslator.exe rename src/{ => ui}/Languages/ar-EG.xml (100%) rename src/{ => ui}/Languages/bg-BG.xml (100%) rename src/{ => ui}/Languages/br-FR.xml (100%) rename src/{ => ui}/Languages/ca-ES.xml (100%) rename src/{ => ui}/Languages/cs-CZ.xml (100%) rename src/{ => ui}/Languages/da-DK.xml (100%) rename src/{ => ui}/Languages/de-DE.xml (100%) rename src/{ => ui}/Languages/el-GR.xml (98%) rename src/{ => ui}/Languages/es-AR.xml (100%) rename src/{ => ui}/Languages/es-ES.xml (100%) rename src/{ => ui}/Languages/es-MX.xml (100%) rename src/{ => ui}/Languages/eu-ES.xml (100%) rename src/{ => ui}/Languages/fa-IR.xml (100%) rename src/{ => ui}/Languages/fi-FI.xml (100%) rename src/{ => ui}/Languages/fr-BE.xml (100%) rename src/{ => ui}/Languages/fr-FR.xml (100%) rename src/{ => ui}/Languages/hr-HR.xml (100%) rename src/{ => ui}/Languages/hu-HU.xml (100%) rename src/{ => ui}/Languages/id-ID.xml (100%) rename src/{ => ui}/Languages/it-IT.xml (100%) rename src/{ => ui}/Languages/ja-JP.xml (100%) rename src/{ => ui}/Languages/ko-KR.xml (100%) rename src/{ => ui}/Languages/mk-MK.xml (100%) rename src/{ => ui}/Languages/nb-NO.xml (100%) rename src/{ => ui}/Languages/nl-NL.xml (100%) rename src/{ => ui}/Languages/pl-PL.xml (100%) rename src/{ => ui}/Languages/pt-BR.xml (100%) rename src/{ => ui}/Languages/pt-PT.xml (100%) rename src/{ => ui}/Languages/ro-RO.xml (100%) rename src/{ => ui}/Languages/ru-RU.xml (100%) rename src/{ => ui}/Languages/sl-SI.xml (100%) rename src/{ => ui}/Languages/sr-Cyrl-RS.xml (100%) rename src/{ => ui}/Languages/sr-Latn-RS.xml (100%) rename src/{ => ui}/Languages/sv-SE.xml (100%) rename src/{ => ui}/Languages/th-TH.xml (100%) rename src/{ => ui}/Languages/tr-TR.xml (100%) rename src/{ => ui}/Languages/uk-UA.xml (100%) rename src/{ => ui}/Languages/vi-VN.xml (100%) rename src/{ => ui}/Languages/zh-Hans.xml (100%) rename src/{ => ui}/Languages/zh-TW.xml (100%) rename src/{ => ui}/Logic/ColorChooser/ColorChangedEventArgs.cs (100%) rename src/{ => ui}/Logic/ColorChooser/ColorHandler.cs (100%) rename src/{ => ui}/Logic/ColorChooser/ColorWheel.cs (100%) rename src/{ => ui}/Logic/CommandLineConvert/BluRaySupToBluRaySup.cs (100%) rename src/{ => ui}/Logic/CommandLineConvert/CommandLineConverter.cs (100%) rename src/{ => ui}/Logic/CommandLineConvert/TsConvert.cs (100%) rename src/{ => ui}/Logic/CommandLineConvert/TsToBdnXml.cs (100%) rename src/{ => ui}/Logic/CommandLineConvert/TsToBluRaySup.cs (100%) rename src/{ => ui}/Logic/DarkTheme.cs (100%) rename src/{ => ui}/Logic/FindReplaceDialogHelper.cs (97%) rename src/{ => ui}/Logic/ListViewSorter.cs (100%) rename src/{ => ui}/Logic/MainShortcuts.cs (100%) rename src/{ => ui}/Logic/NativeMethods.cs (100%) rename src/{ => ui}/Logic/Networking/NikseWebServiceSession.cs (97%) rename src/{ => ui}/Logic/Networking/UpdateLogEntry.cs (96%) rename src/{ => ui}/Logic/NikseBitmapImageSplitter.cs (97%) rename src/{ => ui}/Logic/Ocr/Binary/BinaryOcrBitmap.cs (96%) rename src/{ => ui}/Logic/Ocr/Binary/BinaryOcrDb.cs (97%) rename src/{ => ui}/Logic/Ocr/MatchesToItalicStringConverter.cs (100%) rename src/{ => ui}/Logic/Ocr/ModiLanguage.cs (97%) rename src/{ => ui}/Logic/Ocr/NOcrChar.cs (97%) rename src/{ => ui}/Logic/Ocr/NOcrDb.cs (100%) rename src/{ => ui}/Logic/Ocr/NOcrPoint.cs (96%) rename src/{ => ui}/Logic/Ocr/OcrAlphabet.cs (96%) rename src/{ => ui}/Logic/Ocr/OcrCharacter.cs (95%) rename src/{ => ui}/Logic/Ocr/OcrFixEngine.cs (97%) rename src/{ => ui}/Logic/Ocr/OcrImage.cs (96%) rename src/{ => ui}/Logic/Ocr/PreprocessingSettings.cs (100%) rename src/{ => ui}/Logic/Ocr/SpellCheckOcrTextResult.cs (96%) rename src/{ => ui}/Logic/Ocr/Tesseract/TesseractMultiRunner.cs (100%) rename src/{ => ui}/Logic/Ocr/Tesseract/TesseractMultiThreadRunner.cs (100%) rename src/{ => ui}/Logic/Ocr/Tesseract/TesseractRunner.cs (100%) rename src/{ => ui}/Logic/Ocr/Tesseract/TesseractThreadRunner.cs (100%) rename src/{ => ui}/Logic/RtfTextConverterRichTextBox.cs (100%) rename src/{ => ui}/Logic/SceneChangesGenerator.cs (100%) rename src/{ => ui}/Logic/SpellCheck/Hunspell.cs (96%) rename src/{ => ui}/Logic/SpellCheck/LinuxHunspell.cs (97%) rename src/{ => ui}/Logic/SpellCheck/MacHunspell.cs (96%) rename src/{ => ui}/Logic/SpellCheck/VoikkoSpellCheck.cs (96%) rename src/{ => ui}/Logic/SpellCheck/WindowsHunspell.cs (96%) rename src/{ => ui}/Logic/SyncContextExtensions.cs (100%) rename src/{ => ui}/Logic/TaskbarList.cs (100%) rename src/{ => ui}/Logic/TextDesigner.cs (100%) rename src/{ => ui}/Logic/TextWidth.cs (100%) rename src/{ => ui}/Logic/UiEbuSaveHelper.cs (100%) rename src/{ => ui}/Logic/UiGetPacEncoding.cs (100%) rename src/{ => ui}/Logic/UiGetYouTubeAnnotationStyles.cs (100%) rename src/{ => ui}/Logic/UiUtil.cs (97%) rename src/{ => ui}/Logic/VideoPlayers/DirectShowLib2005.cs (100%) rename src/{ => ui}/Logic/VideoPlayers/LibMpvDynamic.cs (97%) rename src/{ => ui}/Logic/VideoPlayers/LibMpvMono.cs (96%) rename src/{ => ui}/Logic/VideoPlayers/LibVlcDynamic.cs (97%) rename src/{ => ui}/Logic/VideoPlayers/LibVlcMono.cs (97%) rename src/{ => ui}/Logic/VideoPlayers/MpcHC/MessageHandlerWindow.Designer.cs (100%) rename src/{ => ui}/Logic/VideoPlayers/MpcHC/MessageHandlerWindow.cs (100%) create mode 100644 src/ui/Logic/VideoPlayers/MpcHC/MessageHandlerWindow.resx rename src/{ => ui}/Logic/VideoPlayers/MpcHC/MpcHc.cs (97%) rename src/{ => ui}/Logic/VideoPlayers/MpcHC/MpcHcCommand.cs (100%) rename src/{ => ui}/Logic/VideoPlayers/MpcHC/NativeMethods.cs (100%) rename src/{ => ui}/Logic/VideoPlayers/QuartsPlayer.cs (96%) rename src/{ => ui}/Logic/VideoPlayers/VideoPlayer.cs (97%) rename src/{ => ui}/Logic/WordSpellChecker.cs (97%) rename src/{ => ui}/Program.cs (97%) create mode 100644 src/ui/Properties/AssemblyInfo.cs rename src/{ => ui}/Properties/AssemblyInfo.cs.template (97%) rename src/{ => ui}/Properties/Resources.Designer.cs (97%) rename src/{ => ui}/Properties/Resources.resx (98%) rename src/{ => ui}/Properties/Settings.Designer.cs (97%) rename src/{ => ui}/Properties/Settings.settings (98%) rename src/{ => ui}/Resources/HunspellBackupDictionaries.xml (100%) rename src/{ => ui}/Resources/HunspellBackupDictionaries.xml.gz (100%) rename src/{ => ui}/Resources/HunspellDictionaries.xml (98%) rename src/{ => ui}/Resources/HunspellDictionaries.xml.gz (100%) rename src/{ => ui}/Resources/SMPTE-428-7-2007-DCST.xsd (100%) rename src/{ => ui}/Resources/SMPTE-428-7-2007-DCST.xsd.gz (100%) rename src/{ => ui}/Resources/SMPTE-428-7-2010-DCST.xsd (97%) rename src/{ => ui}/Resources/SMPTE-428-7-2010-DCST.xsd.gz (100%) rename src/{ => ui}/Resources/SMPTE-428-7-2014-DCST.xsd (100%) rename src/{ => ui}/Resources/SMPTE-428-7-2014-DCST.xsd.gz (100%) rename src/{ => ui}/Resources/TesseractDictionaries.xml (98%) rename src/{ => ui}/Resources/TesseractDictionaries.xml.gz (100%) rename src/{ => ui}/Resources/Transparent Background.png (100%) rename src/{ => ui}/Resources/bookmark22.png (100%) rename src/{ => ui}/Resources/nOCR_TesseractHelper.xml.gz (100%) rename src/{ => ui}/Resources/pictureBoxFS.Image.png (100%) rename src/{ => ui}/Resources/pictureBoxFSDown.Image.png (100%) rename src/{ => ui}/Resources/pictureBoxFSOver.Image.png (100%) rename src/{ => ui}/Resources/pictureBoxFastForward.Image.png (100%) rename src/{ => ui}/Resources/pictureBoxFastForwardMouseDown.Image.png (100%) rename src/{ => ui}/Resources/pictureBoxFastForwardMouseOver.Image.png (100%) rename src/{ => ui}/Resources/pictureBoxNoFS.Image.png (100%) rename src/{ => ui}/Resources/pictureBoxNoFSDown.Image.png (100%) rename src/{ => ui}/Resources/pictureBoxNoFSOver.Image.png (100%) rename src/{ => ui}/Resources/pictureBoxReverse.Image.png (100%) rename src/{ => ui}/Resources/pictureBoxReverseMouseDown.Image.png (100%) rename src/{ => ui}/Resources/pictureBoxReverseMouseOver.Image.png (100%) rename src/{ => ui}/SubtitleEdit.csproj (97%) rename src/{ => ui}/Web References/SeNetworkService/Reference.cs (97%) rename src/{ => ui}/Web References/SeNetworkService/Reference.map (98%) rename src/{ => ui}/Web References/SeNetworkService/SeSequence.datasource (98%) rename src/{ => ui}/Web References/SeNetworkService/SeService.disco (99%) rename src/{ => ui}/Web References/SeNetworkService/SeService.wsdl (97%) rename src/{ => ui}/Web References/SeNetworkService/SeUpdate.datasource (98%) rename src/{ => ui}/Web References/SeNetworkService/SeUser.datasource (98%) rename src/{ => ui}/app.config (98%) create mode 100644 src/ui/packages/ILRepack.2.0.18/.signature.p7s create mode 100644 src/ui/packages/ILRepack.2.0.18/ILRepack.2.0.18.nupkg create mode 100644 src/ui/packages/ILRepack.2.0.18/build/ILRepack.props create mode 100644 src/ui/packages/ILRepack.2.0.18/tools/ILRepack.exe create mode 100644 src/ui/packages/NHunspell.1.2.5554.16953/.signature.p7s create mode 100644 src/ui/packages/NHunspell.1.2.5554.16953/NHunspell.1.2.5554.16953.nupkg create mode 100644 src/ui/packages/NHunspell.1.2.5554.16953/Tools/install.ps1 create mode 100644 src/ui/packages/NHunspell.1.2.5554.16953/content/Hunspellx64.dll create mode 100644 src/ui/packages/NHunspell.1.2.5554.16953/content/Hunspellx86.dll create mode 100644 src/ui/packages/NHunspell.1.2.5554.16953/lib/net/NHunspell.dll create mode 100644 src/ui/packages/NHunspell.1.2.5554.16953/lib/net/NHunspell.pdb delete mode 100644 www/Help.cshtml delete mode 100644 www/HelpEU.cshtml delete mode 100644 www/HelpEs.cshtml diff --git a/LanguageMaster.xml b/LanguageMaster.xml index a8b7ca047..6632e120c 100644 --- a/LanguageMaster.xml +++ b/LanguageMaster.xml @@ -227,7 +227,11 @@ Note: Do check free disk space. File name ending TS settings... Remove line-breaks + Delete lines Try to use source encoding + Delete first lines + Delete last lines + Delete lines containing "Language" in output file name Matroska (.mkv) "Language" in output file name: {0} Two letter language code @@ -2106,6 +2110,9 @@ can edit in same subtitle file (collaboration) List view and text box List view Text box + Use syntax coloring + Html color + ASSA color Update Focus set video position Toggle dock/undock of video controls @@ -2117,6 +2124,8 @@ can edit in same subtitle file (collaboration) Set start, auto duration and go to next Set end, next start and go to next Key down=set start, Key up=set end and go to next + Set start and set end of previous (minus min gap) + Set start and set end of previous and go to next (minus min gap) Move selected lines 100 ms forward Move selected lines 100 ms back Move start {0} ms back @@ -2151,6 +2160,7 @@ can edit in same subtitle file (collaboration) Insert new subtitle at key-down, set end time at key-up Merge dialog (insert dashes) Go to next line + Go to next line and set cursor at end Go to previous line Go to current line start Go to current line end @@ -2274,6 +2284,7 @@ can edit in same subtitle file (collaboration) Move last word from first line down (current subtitle) Selection to lowercase Selection to uppercase + Toggle casing of selection (propercase/uppercase/lowercase) Selection to Ruby (Japanese) Toggle auto duration Auto break text diff --git a/src/SubtitleEdit.sln b/SubtitleEdit.sln similarity index 69% rename from src/SubtitleEdit.sln rename to SubtitleEdit.sln index 0fe045426..101c02e65 100644 --- a/src/SubtitleEdit.sln +++ b/SubtitleEdit.sln @@ -1,73 +1,68 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.29728.190 -MinimumVisualStudioVersion = 14.0.23107.0 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SubtitleEdit", "SubtitleEdit.csproj", "{511A5B59-1C35-4719-8536-23B19AF9B21A}" - ProjectSection(ProjectDependencies) = postProject - {DBD4656C-5F40-4067-A70B-C4460DE20F77} = {DBD4656C-5F40-4067-A70B-C4460DE20F77} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test", "Test\Test.csproj", "{7BE5B8E8-9469-4C7C-89D7-E8C884DEFC0E}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UpdateAssemblyInfo", "UpdateAssemblyInfo\UpdateAssemblyInfo.csproj", "{DBD4656C-5F40-4067-A70B-C4460DE20F77}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UpdateLanguageFiles", "UpdateLanguageFiles\UpdateLanguageFiles.csproj", "{36BCA2A7-EE6B-45FD-AF90-D3F76A84DA76}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UpdateResourceScript", "UpdateResourceScript\UpdateResourceScript.csproj", "{2CB9698C-F0A8-42FF-8938-DE047292D5FE}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibSE", "..\libse\LibSE.csproj", "{3E3CB28F-3A7B-430F-9EB3-0D6C1E53B753}" - ProjectSection(ProjectDependencies) = postProject - {DBD4656C-5F40-4067-A70B-C4460DE20F77} = {DBD4656C-5F40-4067-A70B-C4460DE20F77} - {36BCA2A7-EE6B-45FD-AF90-D3F76A84DA76} = {36BCA2A7-EE6B-45FD-AF90-D3F76A84DA76} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Win32Resources", "Win32Resources\Win32Resources.vcxproj", "{905ACC84-B353-4313-BFE5-CCF460B959AF}" - ProjectSection(ProjectDependencies) = postProject - {511A5B59-1C35-4719-8536-23B19AF9B21A} = {511A5B59-1C35-4719-8536-23B19AF9B21A} - {2CB9698C-F0A8-42FF-8938-DE047292D5FE} = {2CB9698C-F0A8-42FF-8938-DE047292D5FE} - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {511A5B59-1C35-4719-8536-23B19AF9B21A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {511A5B59-1C35-4719-8536-23B19AF9B21A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {511A5B59-1C35-4719-8536-23B19AF9B21A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {511A5B59-1C35-4719-8536-23B19AF9B21A}.Release|Any CPU.Build.0 = Release|Any CPU - {7BE5B8E8-9469-4C7C-89D7-E8C884DEFC0E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7BE5B8E8-9469-4C7C-89D7-E8C884DEFC0E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7BE5B8E8-9469-4C7C-89D7-E8C884DEFC0E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7BE5B8E8-9469-4C7C-89D7-E8C884DEFC0E}.Release|Any CPU.Build.0 = Release|Any CPU - {DBD4656C-5F40-4067-A70B-C4460DE20F77}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DBD4656C-5F40-4067-A70B-C4460DE20F77}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DBD4656C-5F40-4067-A70B-C4460DE20F77}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DBD4656C-5F40-4067-A70B-C4460DE20F77}.Release|Any CPU.Build.0 = Release|Any CPU - {36BCA2A7-EE6B-45FD-AF90-D3F76A84DA76}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {36BCA2A7-EE6B-45FD-AF90-D3F76A84DA76}.Debug|Any CPU.Build.0 = Debug|Any CPU - {36BCA2A7-EE6B-45FD-AF90-D3F76A84DA76}.Release|Any CPU.ActiveCfg = Release|Any CPU - {36BCA2A7-EE6B-45FD-AF90-D3F76A84DA76}.Release|Any CPU.Build.0 = Release|Any CPU - {2CB9698C-F0A8-42FF-8938-DE047292D5FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2CB9698C-F0A8-42FF-8938-DE047292D5FE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2CB9698C-F0A8-42FF-8938-DE047292D5FE}.Release|Any CPU.Build.0 = Release|Any CPU - {3E3CB28F-3A7B-430F-9EB3-0D6C1E53B753}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3E3CB28F-3A7B-430F-9EB3-0D6C1E53B753}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3E3CB28F-3A7B-430F-9EB3-0D6C1E53B753}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3E3CB28F-3A7B-430F-9EB3-0D6C1E53B753}.Release|Any CPU.Build.0 = Release|Any CPU - {905ACC84-B353-4313-BFE5-CCF460B959AF}.Debug|Any CPU.ActiveCfg = Debug|Win32 - {905ACC84-B353-4313-BFE5-CCF460B959AF}.Release|Any CPU.ActiveCfg = Release|Win32 - {905ACC84-B353-4313-BFE5-CCF460B959AF}.Release|Any CPU.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {E12BDE22-B6A4-4AB6-AF96-F3C0F89C15EC} - EndGlobalSection - GlobalSection(TestCaseManagementSettings) = postSolution - CategoryFile = SubtitleEdit.vsmdi - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29728.190 +MinimumVisualStudioVersion = 14.0.23107.0 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test", "src\Test\Test.csproj", "{7BE5B8E8-9469-4C7C-89D7-E8C884DEFC0E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UpdateAssemblyInfo", "src\UpdateAssemblyInfo\UpdateAssemblyInfo.csproj", "{DBD4656C-5F40-4067-A70B-C4460DE20F77}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UpdateLanguageFiles", "src\UpdateLanguageFiles\UpdateLanguageFiles.csproj", "{36BCA2A7-EE6B-45FD-AF90-D3F76A84DA76}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UpdateResourceScript", "src\UpdateResourceScript\UpdateResourceScript.csproj", "{2CB9698C-F0A8-42FF-8938-DE047292D5FE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Win32Resources", "src\Win32Resources\Win32Resources.vcxproj", "{905ACC84-B353-4313-BFE5-CCF460B959AF}" + ProjectSection(ProjectDependencies) = postProject + {511A5B59-1C35-4719-8536-23B19AF9B21A} = {511A5B59-1C35-4719-8536-23B19AF9B21A} + {2CB9698C-F0A8-42FF-8938-DE047292D5FE} = {2CB9698C-F0A8-42FF-8938-DE047292D5FE} + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{B1BB9DD1-0EE8-4D43-AAAB-C39D0CC882A9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibSE", "src\libse\LibSE.csproj", "{D6F64CD3-C3EA-4B36-B575-9B3B8A3CA13F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SubtitleEdit", "src\ui\SubtitleEdit.csproj", "{511A5B59-1C35-4719-8536-23B19AF9B21A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {7BE5B8E8-9469-4C7C-89D7-E8C884DEFC0E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7BE5B8E8-9469-4C7C-89D7-E8C884DEFC0E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7BE5B8E8-9469-4C7C-89D7-E8C884DEFC0E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7BE5B8E8-9469-4C7C-89D7-E8C884DEFC0E}.Release|Any CPU.Build.0 = Release|Any CPU + {DBD4656C-5F40-4067-A70B-C4460DE20F77}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DBD4656C-5F40-4067-A70B-C4460DE20F77}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DBD4656C-5F40-4067-A70B-C4460DE20F77}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DBD4656C-5F40-4067-A70B-C4460DE20F77}.Release|Any CPU.Build.0 = Release|Any CPU + {36BCA2A7-EE6B-45FD-AF90-D3F76A84DA76}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {36BCA2A7-EE6B-45FD-AF90-D3F76A84DA76}.Debug|Any CPU.Build.0 = Debug|Any CPU + {36BCA2A7-EE6B-45FD-AF90-D3F76A84DA76}.Release|Any CPU.ActiveCfg = Release|Any CPU + {36BCA2A7-EE6B-45FD-AF90-D3F76A84DA76}.Release|Any CPU.Build.0 = Release|Any CPU + {2CB9698C-F0A8-42FF-8938-DE047292D5FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2CB9698C-F0A8-42FF-8938-DE047292D5FE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2CB9698C-F0A8-42FF-8938-DE047292D5FE}.Release|Any CPU.Build.0 = Release|Any CPU + {905ACC84-B353-4313-BFE5-CCF460B959AF}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {905ACC84-B353-4313-BFE5-CCF460B959AF}.Release|Any CPU.ActiveCfg = Release|Win32 + {905ACC84-B353-4313-BFE5-CCF460B959AF}.Release|Any CPU.Build.0 = Release|Win32 + {D6F64CD3-C3EA-4B36-B575-9B3B8A3CA13F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D6F64CD3-C3EA-4B36-B575-9B3B8A3CA13F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D6F64CD3-C3EA-4B36-B575-9B3B8A3CA13F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D6F64CD3-C3EA-4B36-B575-9B3B8A3CA13F}.Release|Any CPU.Build.0 = Release|Any CPU + {511A5B59-1C35-4719-8536-23B19AF9B21A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {511A5B59-1C35-4719-8536-23B19AF9B21A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {511A5B59-1C35-4719-8536-23B19AF9B21A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {511A5B59-1C35-4719-8536-23B19AF9B21A}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {E12BDE22-B6A4-4AB6-AF96-F3C0F89C15EC} + EndGlobalSection + GlobalSection(TestCaseManagementSettings) = postSolution + CategoryFile = SubtitleEdit.vsmdi + EndGlobalSection +EndGlobal diff --git a/SubtitleEdit.sln.DotSettings b/SubtitleEdit.sln.DotSettings new file mode 100644 index 000000000..dd009cf93 --- /dev/null +++ b/SubtitleEdit.sln.DotSettings @@ -0,0 +1,24 @@ + + ExplicitlyExcluded + ExplicitlyExcluded + ExplicitlyExcluded + ExplicitlyExcluded + ExplicitlyExcluded + ExplicitlyExcluded + True + NEVER + False + False + True + False + SSA + True + True + True + True + True + True + True + True + True + True \ No newline at end of file diff --git a/build.bat b/build.bat index 1740cf75f..05e4f9a0f 100644 --- a/build.bat +++ b/build.bat @@ -81,7 +81,6 @@ TITLE %BUILDTYPE%ing Subtitle Edit - Release^|Any CPU... ECHO. ECHO %BUILDTYPE%ing Subtitle Edit - Release^|Any CPU... DEL /F /Q SubtitleEdit-*-Setup.exe SubtitleEdit-*.zip 2>NUL -PUSHD "src" ECHO. ECHO Visual Studio installation path: "%VSINSTALLDIR%" IF EXIST "%VSINSTALLDIR%MSBuild\15.0\Bin\MSBuild.exe" ( @@ -93,16 +92,24 @@ IF EXIST "%VSINSTALLDIR%MSBuild\Current\Bin\MSBuild.exe" ( ECHO Cannot find Visual Studio 2017. GOTO EndWithError )) + "%MSBUILD%" SubtitleEdit.sln /r /t:%BUILDTYPE% /p:Configuration=Release /p:Platform="Any CPU"^ /maxcpucount /consoleloggerparameters:DisableMPLogging;Summary;Verbosity=minimal IF %ERRORLEVEL% NEQ 0 GOTO EndWithError IF /I "%BUILDTYPE%" == "Clean" GOTO EndSuccessful +dir +PUSHD "src/ui" +dir ECHO. ECHO Merging assemblies with ILRepack... FOR /D %%A IN (packages\ILRepack.*) DO (SET "ILREPACKDIR=%%A") ECHO. +dir +echo ILREPACKDIR +echo %ILREPACKDIR% +echo ILREPACKDIR done "%ILREPACKDIR%\tools\ILRepack.exe" /parallel /internalize /targetplatform:v4 /out:"bin\Release\SubtitleEdit.exe" "bin\Release\SubtitleEdit.exe"^ "bin\Release\libse.dll" "bin\Release\zlib.net.dll" "bin\Release\NHunspell.dll" "bin\Release\UtfUnknown.dll" "DLLs\Interop.QuartzTypeLib.dll" IF %ERRORLEVEL% NEQ 0 GOTO EndWithError @@ -166,7 +173,7 @@ EXIT /B TITLE Creating ZIP archive with 7-Zip... ECHO. ECHO Creating ZIP archive with 7-Zip... -PUSHD "src\bin\Release" +PUSHD "src\ui\bin\Release" IF EXIST "temp_zip" RD /S /Q "temp_zip" IF NOT EXIST "temp_zip" MD "temp_zip" IF NOT EXIST "temp_zip\Languages" MD "temp_zip\Languages" @@ -174,14 +181,14 @@ IF NOT EXIST "temp_zip\Dictionaries" MD "temp_zip\Dictionaries" IF NOT EXIST "temp_zip\Ocr" MD "temp_zip\Ocr" ECHO. -COPY /Y /V "..\..\..\LICENSE.txt" "temp_zip\" -COPY /Y /V "..\..\..\Changelog.txt" "temp_zip\" +COPY /Y /V "..\..\..\..\LICENSE.txt" "temp_zip\" +COPY /Y /V "..\..\..\..\Changelog.txt" "temp_zip\" COPY /Y /V "Hunspellx86.dll" "temp_zip\" COPY /Y /V "Hunspellx64.dll" "temp_zip\" COPY /Y /V "SubtitleEdit.exe" "temp_zip\" COPY /Y /V "Languages\*.xml" "temp_zip\Languages\" -COPY /Y /V "..\..\..\Dictionaries\*.*" "temp_zip\Dictionaries\" -COPY /Y /V "..\..\..\Ocr\*.*" "temp_zip\Ocr\" +COPY /Y /V "..\..\..\..\Dictionaries\*.*" "temp_zip\Dictionaries\" +COPY /Y /V "..\..\..\..\Ocr\*.*" "temp_zip\Ocr\" PUSHD "temp_zip" START "" /B /WAIT "%SEVENZIP%" a -tzip -mx=9 "SubtitleEdit-%VERSION%.zip" * >NUL @@ -189,7 +196,7 @@ IF %ERRORLEVEL% NEQ 0 GOTO EndWithError ECHO. ECHO ZIP archive created successfully! -MOVE /Y "SubtitleEdit-%VERSION%.zip" "..\..\..\.." >NUL +MOVE /Y "SubtitleEdit-%VERSION%.zip" "..\..\..\..\.." >NUL POPD IF EXIST "temp_zip" RD /S /Q "temp_zip" POPD @@ -198,7 +205,7 @@ EXIT /B :SubGetVersion -FOR /F delims^=^"^ tokens^=2 %%A IN ('FINDSTR /R /C:"AssemblyVersion" "src\Properties\AssemblyInfo.cs.template"') DO ( +FOR /F delims^=^"^ tokens^=2 %%A IN ('FINDSTR /R /C:"AssemblyVersion" "src\ui\Properties\AssemblyInfo.cs.template"') DO ( REM 3.4.1.[REVNO] SET "VERSION=%%A" ) diff --git a/build_helpers.bat b/build_helpers.bat index 12c9a4651..06ed164cb 100644 --- a/build_helpers.bat +++ b/build_helpers.bat @@ -20,7 +20,7 @@ IF NOT EXIST "%ToolPath%" ( GOTO END ) -"%ToolPath%" "src\Win32Resources\Resources.rc.template" "src\bin\%ConfigurationName%\SubtitleEdit.exe" +"%ToolPath%" "src\Win32Resources\Resources.rc.template" "src\ui\bin\%ConfigurationName%\SubtitleEdit.exe" IF %ERRORLEVEL% NEQ 0 ( ECHO ERROR: Something went wrong when generating the resource script... @@ -35,7 +35,7 @@ IF NOT EXIST "%ToolPath%" ( GOTO END ) -"%ToolPath%" "LanguageMaster.xml" "libse\LanguageDeserializer.cs" +"%ToolPath%" "LanguageMaster.xml" "src\libse\LanguageDeserializer.cs" IF %ERRORLEVEL% NEQ 0 ( ECHO ERROR: Something went wrong when generating the language files... @@ -50,7 +50,7 @@ IF NOT EXIST "%ToolPath%" ( GOTO END ) -"%ToolPath%" "src\Properties\AssemblyInfo.cs.template" "libse\Properties\AssemblyInfo.cs.template" +"%ToolPath%" "src\ui\Properties\AssemblyInfo.cs.template" "src\libse\Properties\AssemblyInfo.cs.template" IF %ERRORLEVEL% NEQ 0 ( ECHO ERROR: Something went wrong when generating the revision number... diff --git a/coverity.bat b/coverity.bat deleted file mode 100644 index dfddfa2fc..000000000 --- a/coverity.bat +++ /dev/null @@ -1,73 +0,0 @@ -@ECHO OFF - -SETLOCAL - -PUSHD %~dp0 - -IF NOT DEFINED COVDIR SET "COVDIR=H:\progs\thirdparty\cov-analysis-win64" -IF DEFINED COVDIR IF NOT EXIST "%COVDIR%" ( - ECHO. - ECHO ERROR: Coverity not found in "%COVDIR%" - GOTO End -) - - -CALL "%VS140COMNTOOLS%\vsvars32.bat" -IF %ERRORLEVEL% NEQ 0 ( - ECHO vsvars32.bat call failed. - GOTO End -) - - -:Cleanup -IF EXIST "cov-int" RD /q /s "cov-int" -IF EXIST "SubtitleEdit.lzma" DEL "SubtitleEdit.lzma" -IF EXIST "SubtitleEdit.tar" DEL "SubtitleEdit.tar" -IF EXIST "SubtitleEdit.tgz" DEL "SubtitleEdit.tgz" - - -:Main -SET MSBUILD_SWITCHES=/nologo /t:Rebuild /p:Configuration=Release /p:Platform="Any CPU"^ - /maxcpucount /consoleloggerparameters:DisableMPLogging;Summary;Verbosity=minimal - -"%COVDIR%\bin\cov-build.exe" --dir cov-int MSBuild.exe src\SubtitleEdit.sln %MSBUILD_SWITCHES% - - -:tar -tar --version 1>&2 2>NUL || (ECHO. & ECHO ERROR: tar not found & GOTO SevenZip) -tar caf "SubtitleEdit.lzma" "cov-int" -GOTO End - - -:SevenZip -CALL :SubDetectSevenzipPath - -rem Coverity is totally bogus with lzma... -rem And since I cannot replicate the arguments with 7-Zip, just use tar/gzip. -IF EXIST "%SEVENZIP%" ( - "%SEVENZIP%" a -ttar "SubtitleEdit.tar" "cov-int" - "%SEVENZIP%" a -tgzip "SubtitleEdit.tgz" "SubtitleEdit.tar" - IF EXIST "SubtitleEdit.tar" DEL "SubtitleEdit.tar" - GOTO End -) - - -:SubDetectSevenzipPath -FOR %%G IN (7z.exe) DO (SET "SEVENZIP_PATH=%%~$PATH:G") -IF EXIST "%SEVENZIP_PATH%" (SET "SEVENZIP=%SEVENZIP_PATH%" & EXIT /B) - -FOR %%G IN (7za.exe) DO (SET "SEVENZIP_PATH=%%~$PATH:G") -IF EXIST "%SEVENZIP_PATH%" (SET "SEVENZIP=%SEVENZIP_PATH%" & EXIT /B) - -FOR /F "tokens=2*" %%A IN ( - 'REG QUERY "HKLM\SOFTWARE\7-Zip" /v "Path" 2^>NUL ^| FIND "REG_SZ" ^|^| - REG QUERY "HKLM\SOFTWARE\Wow6432Node\7-Zip" /v "Path" 2^>NUL ^| FIND "REG_SZ"') DO SET "SEVENZIP=%%B\7z.exe" -EXIT /B - - -:End -POPD -ECHO. & ECHO Press any key to close this window... -PAUSE >NUL -ENDLOCAL -EXIT /B diff --git a/installer/Subtitle_Edit_installer.iss b/installer/Subtitle_Edit_installer.iss index 80312784e..18cb1dcf0 100644 --- a/installer/Subtitle_Edit_installer.iss +++ b/installer/Subtitle_Edit_installer.iss @@ -44,7 +44,7 @@ #define VerBuild #define VerRevision -#define bindir "..\src\bin\Release" +#define bindir "..\src\ui\bin\Release" #ifnexist bindir + "\SubtitleEdit.exe" #error Compile Subtitle Edit first @@ -92,7 +92,7 @@ VersionInfoVersion={#app_ver_full} MinVersion=5.6 LicenseFile=..\LICENSE.txt InfoAfterFile=..\Changelog.txt -SetupIconFile=..\src\Icons\SE.ico +SetupIconFile=..\src\ui\Icons\SE.ico WizardImageFile=Icons\WizardImageFile.bmp WizardSmallImageFile=Icons\WizardSmallImageFile.bmp OutputDir=. diff --git a/src/packages.config b/packages.config similarity index 100% rename from src/packages.config rename to packages.config diff --git a/run_tabspace.bat b/run_tabspace.bat deleted file mode 100644 index a39cfc067..000000000 --- a/run_tabspace.bat +++ /dev/null @@ -1,10 +0,0 @@ -@ECHO OFF -SETLOCAL - -PUSHD %~dp0 - -tabspace /ext:bat;c;cc;cpp;cs;cxx;h;hpp;hxx;iss;xml /exclude:*\*.designer.cs - -POPD -ENDLOCAL -EXIT /B diff --git a/src/Forms/ChooseAudioTrack.resx b/src/Forms/ChooseAudioTrack.resx deleted file mode 100644 index 29dcb1b3a..000000000 --- a/src/Forms/ChooseAudioTrack.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/src/Forms/ChooseStyle.resx b/src/Forms/ChooseStyle.resx deleted file mode 100644 index 29dcb1b3a..000000000 --- a/src/Forms/ChooseStyle.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/src/Forms/ColumnPaste.resx b/src/Forms/ColumnPaste.resx deleted file mode 100644 index 29dcb1b3a..000000000 --- a/src/Forms/ColumnPaste.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/src/Forms/DoNotBreakAfterListEdit.resx b/src/Forms/DoNotBreakAfterListEdit.resx deleted file mode 100644 index 29dcb1b3a..000000000 --- a/src/Forms/DoNotBreakAfterListEdit.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/src/Forms/DurationsBridgeGaps.resx b/src/Forms/DurationsBridgeGaps.resx deleted file mode 100644 index 29dcb1b3a..000000000 --- a/src/Forms/DurationsBridgeGaps.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/src/Forms/DvdSubRipChooseLanguage.resx b/src/Forms/DvdSubRipChooseLanguage.resx deleted file mode 100644 index 29dcb1b3a..000000000 --- a/src/Forms/DvdSubRipChooseLanguage.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/src/Forms/FcpProperties.resx b/src/Forms/FcpProperties.resx deleted file mode 100644 index 29dcb1b3a..000000000 --- a/src/Forms/FcpProperties.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/src/Forms/GoogleOrMicrosoftTranslate.resx b/src/Forms/GoogleOrMicrosoftTranslate.resx deleted file mode 100644 index 29dcb1b3a..000000000 --- a/src/Forms/GoogleOrMicrosoftTranslate.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/src/Forms/Interjections.resx b/src/Forms/Interjections.resx deleted file mode 100644 index 29dcb1b3a..000000000 --- a/src/Forms/Interjections.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/src/Forms/MeasurementConverter.resx b/src/Forms/MeasurementConverter.resx deleted file mode 100644 index 29dcb1b3a..000000000 --- a/src/Forms/MeasurementConverter.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/src/Test/Test.csproj b/src/Test/Test.csproj index 2eccdc8a6..2a08429ec 100644 --- a/src/Test/Test.csproj +++ b/src/Test/Test.csproj @@ -92,16 +92,6 @@ - - - {3e3cb28f-3a7b-430f-9eb3-0d6c1e53b753} - LibSE - - - {511A5B59-1C35-4719-8536-23B19AF9B21A} - SubtitleEdit - - @@ -164,7 +154,16 @@ - + + + {d6f64cd3-c3ea-4b36-b575-9b3b8a3ca13f} + LibSE + + + {511a5b59-1c35-4719-8536-23b19af9b21a} + SubtitleEdit + + > 072058 - //Meine Mutter und meine Schwester, - - //-->> 072169 - - //-->> 072172 - //die in Zürich lebt, und ich, - - //-->> 072247 - const string paragraphWriteFormat = "-->> {0}{3}{2}{3}-->> {1}{3}{3}"; - - var sb = new StringBuilder(); - foreach (Paragraph p in subtitle.Paragraphs) - { - string text = Utilities.RemoveSsaTags(p.Text); - int noOfLines = Utilities.GetNumberOfLines(text); - if (noOfLines > 2) - { - text = Utilities.AutoBreakLine(text); - } - else if (noOfLines == 1) - { - text += Environment.NewLine; - } - - sb.AppendLine(string.Format(paragraphWriteFormat, EncodeTimeCode(p.StartTime), EncodeTimeCode(p.EndTime), text, Environment.NewLine)); - } - return sb.ToString().Trim(); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - var paragraph = new Paragraph(); - var expecting = ExpectingLine.TimeStart; - _errorCount = 0; - - subtitle.Paragraphs.Clear(); - foreach (string line in lines) - { - if (line.StartsWith("-->> ", StringComparison.Ordinal)) - { - string timePart = line.Substring(4).Trim(); - if (timePart.Length > 0) - { - try - { - var tc = DecodeTimeCode(timePart); - if (expecting == ExpectingLine.TimeStart) - { - paragraph = new Paragraph { StartTime = tc }; - expecting = ExpectingLine.Text; - } - else if (expecting == ExpectingLine.TimeEndOrText) - { - paragraph.EndTime = tc; - subtitle.Paragraphs.Add(paragraph); - paragraph = new Paragraph(); - expecting = ExpectingLine.TimeStart; - } - } - catch - { - _errorCount++; - expecting = ExpectingLine.TimeStart; - } - } - } - else - { - if (expecting == ExpectingLine.Text || expecting == ExpectingLine.TimeEndOrText) - { - if (line.Length > 0) - { - string text = line.Replace("|", Environment.NewLine); - if (string.IsNullOrEmpty(paragraph.Text)) - { - paragraph.Text = text.Trim(); - } - else - { - paragraph.Text += Environment.NewLine + text; - } - - if (paragraph.Text.Length > 2000) - { - _errorCount += 100; - return; - } - } - expecting = ExpectingLine.TimeEndOrText; - } - else if (expecting == ExpectingLine.TimeStart && !string.IsNullOrWhiteSpace(line)) - { - int ms = (int)paragraph.EndTime.TotalMilliseconds; - paragraph = new Paragraph { StartTime = { TotalMilliseconds = ms }, Text = line.Trim() }; - expecting = ExpectingLine.TimeEndOrText; - } - } - } - subtitle.Renumber(); - } - - private static string EncodeTimeCode(TimeCode time) - { - int frames = MillisecondsToFrames(time.TotalMilliseconds) + 1; - return frames.ToString(CultureInfo.InvariantCulture); - } - - private static TimeCode DecodeTimeCode(string timePart) - { - int milliseconds = (int)Math.Round(TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate * int.Parse(timePart)); - return new TimeCode(milliseconds); - } - - } -} +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class AQTitle : SubtitleFormat + { + private enum ExpectingLine + { + TimeStart, + Text, + TimeEndOrText, + } + + public override string Extension => ".aqt"; + + public override string Name => "AQTitle"; + + public override bool IsTimeBased => false; + + public override string ToText(Subtitle subtitle, string title) + { + //-->> 072058 + //Meine Mutter und meine Schwester, + + //-->> 072169 + + //-->> 072172 + //die in Zürich lebt, und ich, + + //-->> 072247 + const string paragraphWriteFormat = "-->> {0}{3}{2}{3}-->> {1}{3}{3}"; + + var sb = new StringBuilder(); + foreach (Paragraph p in subtitle.Paragraphs) + { + string text = Utilities.RemoveSsaTags(p.Text); + int noOfLines = Utilities.GetNumberOfLines(text); + if (noOfLines > 2) + { + text = Utilities.AutoBreakLine(text); + } + else if (noOfLines == 1) + { + text += Environment.NewLine; + } + + sb.AppendLine(string.Format(paragraphWriteFormat, EncodeTimeCode(p.StartTime), EncodeTimeCode(p.EndTime), text, Environment.NewLine)); + } + return sb.ToString().Trim(); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + var paragraph = new Paragraph(); + var expecting = ExpectingLine.TimeStart; + _errorCount = 0; + + subtitle.Paragraphs.Clear(); + foreach (string line in lines) + { + if (line.StartsWith("-->> ", StringComparison.Ordinal)) + { + string timePart = line.Substring(4).Trim(); + if (timePart.Length > 0) + { + try + { + var tc = DecodeTimeCode(timePart); + if (expecting == ExpectingLine.TimeStart) + { + paragraph = new Paragraph { StartTime = tc }; + expecting = ExpectingLine.Text; + } + else if (expecting == ExpectingLine.TimeEndOrText) + { + paragraph.EndTime = tc; + subtitle.Paragraphs.Add(paragraph); + paragraph = new Paragraph(); + expecting = ExpectingLine.TimeStart; + } + } + catch + { + _errorCount++; + expecting = ExpectingLine.TimeStart; + } + } + } + else + { + if (expecting == ExpectingLine.Text || expecting == ExpectingLine.TimeEndOrText) + { + if (line.Length > 0) + { + string text = line.Replace("|", Environment.NewLine); + if (string.IsNullOrEmpty(paragraph.Text)) + { + paragraph.Text = text.Trim(); + } + else + { + paragraph.Text += Environment.NewLine + text; + } + + if (paragraph.Text.Length > 2000) + { + _errorCount += 100; + return; + } + } + expecting = ExpectingLine.TimeEndOrText; + } + else if (expecting == ExpectingLine.TimeStart && !string.IsNullOrWhiteSpace(line)) + { + int ms = (int)paragraph.EndTime.TotalMilliseconds; + paragraph = new Paragraph { StartTime = { TotalMilliseconds = ms }, Text = line.Trim() }; + expecting = ExpectingLine.TimeEndOrText; + } + } + } + subtitle.Renumber(); + } + + private static string EncodeTimeCode(TimeCode time) + { + int frames = MillisecondsToFrames(time.TotalMilliseconds) + 1; + return frames.ToString(CultureInfo.InvariantCulture); + } + + private static TimeCode DecodeTimeCode(string timePart) + { + int milliseconds = (int)Math.Round(TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate * int.Parse(timePart)); + return new TimeCode(milliseconds); + } + + } +} diff --git a/libse/SubtitleFormats/AbcIViewer.cs b/src/libse/SubtitleFormats/AbcIViewer.cs similarity index 97% rename from libse/SubtitleFormats/AbcIViewer.cs rename to src/libse/SubtitleFormats/AbcIViewer.cs index ad8192616..230b47c38 100644 --- a/libse/SubtitleFormats/AbcIViewer.cs +++ b/src/libse/SubtitleFormats/AbcIViewer.cs @@ -1,120 +1,120 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class AbcIViewer : SubtitleFormat - { - public override string Extension => ".xml"; - - public override string Name => "ABC iView"; - - public override string ToText(Subtitle subtitle, string title) - { - string xmlStructure = - "" + Environment.NewLine + - "" + Environment.NewLine + - "" + Environment.NewLine + - "" + Environment.NewLine + - ""; - - var xml = new XmlDocument { XmlResolver = null }; - xml.LoadXml(xmlStructure); - XmlNode reel = xml.DocumentElement.SelectSingleNode("reel"); - foreach (Paragraph p in subtitle.Paragraphs) - { - XmlNode paragraph = xml.CreateElement("title"); - - XmlAttribute start = xml.CreateAttribute("start"); - start.InnerText = ToTimeCode(p.StartTime.TotalMilliseconds); - paragraph.Attributes.Append(start); - - XmlAttribute end = xml.CreateAttribute("end"); - end.InnerText = ToTimeCode(p.EndTime.TotalMilliseconds); - paragraph.Attributes.Append(end); - - paragraph.InnerText = HtmlUtil.RemoveHtmlTags(p.Text.Replace(Environment.NewLine, "|"), true); - - reel.AppendChild(paragraph); - } - - return ToUtf8XmlString(xml); - } - - private static string ToTimeCode(double totalMilliseconds) - { - var ts = TimeSpan.FromMilliseconds(totalMilliseconds); - return $"{ts.Hours:00}:{ts.Minutes:00}:{ts.Seconds:00}:{ts.Milliseconds:00}"; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - bool allTwoCifferMs = true; - - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - - string xmlString = sb.ToString(); - if (!xmlString.Contains(" ".xml"; + + public override string Name => "ABC iView"; + + public override string ToText(Subtitle subtitle, string title) + { + string xmlStructure = + "" + Environment.NewLine + + "" + Environment.NewLine + + "" + Environment.NewLine + + "" + Environment.NewLine + + ""; + + var xml = new XmlDocument { XmlResolver = null }; + xml.LoadXml(xmlStructure); + XmlNode reel = xml.DocumentElement.SelectSingleNode("reel"); + foreach (Paragraph p in subtitle.Paragraphs) + { + XmlNode paragraph = xml.CreateElement("title"); + + XmlAttribute start = xml.CreateAttribute("start"); + start.InnerText = ToTimeCode(p.StartTime.TotalMilliseconds); + paragraph.Attributes.Append(start); + + XmlAttribute end = xml.CreateAttribute("end"); + end.InnerText = ToTimeCode(p.EndTime.TotalMilliseconds); + paragraph.Attributes.Append(end); + + paragraph.InnerText = HtmlUtil.RemoveHtmlTags(p.Text.Replace(Environment.NewLine, "|"), true); + + reel.AppendChild(paragraph); + } + + return ToUtf8XmlString(xml); + } + + private static string ToTimeCode(double totalMilliseconds) + { + var ts = TimeSpan.FromMilliseconds(totalMilliseconds); + return $"{ts.Hours:00}:{ts.Minutes:00}:{ts.Seconds:00}:{ts.Milliseconds:00}"; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + bool allTwoCifferMs = true; + + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + + string xmlString = sb.ToString(); + if (!xmlString.Contains(" ".xml"; - - public override string Name => "Adobe After Effects ft-MarkerExporter"; - - public override string ToText(Subtitle subtitle, string title) - { - string xmlStructure = @" - - - 1 - - - - - -".Replace("'", "\""); - - var xml = new XmlDocument { XmlResolver = null }; - xml.LoadXml(xmlStructure); - const string innerXml = "", @"{\i}"); - text = text.Replace("", @"{\u1}"); - text = text.Replace("", @"{\u0}"); - text = text.Replace("", @"{\u}"); - text = text.Replace("", @"{\b1}"); - text = text.Replace("", @"{\b0}"); - text = text.Replace("", @"{\b}"); - int count = 0; - while (text.Contains("', start); - if (end > 0) - { - string fontTag = text.Substring(start + 5, end - (start + 4)); - text = text.Remove(start, end - start + 1); - int indexOfEndFont = text.IndexOf("", start, StringComparison.Ordinal); - if (indexOfEndFont > 0) - { - text = text.Remove(indexOfEndFont, 7); - if (indexOfEndFont < text.Length) - { - if (fontTag.Contains(" size=")) - { - text = text.Insert(indexOfEndFont, "{\\fs}"); - } - if (fontTag.Contains(" face=")) - { - text = text.Insert(indexOfEndFont, "{\\fn}"); - } - if (fontTag.Contains(" color=")) - { - text = text.Insert(indexOfEndFont, "{\\c}"); - } - } - } - - fontTag = FormatTag(ref text, start, fontTag, "face=\"", "fn", "}"); - fontTag = FormatTag(ref text, start, fontTag, "face='", "fn", "}"); - fontTag = FormatTag(ref text, start, fontTag, "face=", "fn", "}"); - - fontTag = FormatTag(ref text, start, fontTag, "size=\"", "fs", "}"); - fontTag = FormatTag(ref text, start, fontTag, "size='", "fs", "}"); - fontTag = FormatTag(ref text, start, fontTag, "size=", "fs", "}"); - - fontTag = FormatTag(ref text, start, fontTag, "color=\"", "c&H", "&}"); - fontTag = FormatTag(ref text, start, fontTag, "color='", "c&H", "&}"); - FormatTag(ref text, start, fontTag, "color=", "c&H", "&}"); - } - count++; - } - text = text.Replace("{\\c}", "@___@@").Replace("}{", string.Empty).Replace("@___@@", "{\\c}").Replace("{\\c}{\\c&", "{\\c&"); - while (text.EndsWith("{\\c}", StringComparison.Ordinal)) - { - text = text.Remove(text.Length - 4); - } - while (text.Contains("\\fs\\fs", StringComparison.Ordinal)) - { - text = text.Replace("\\fs\\fs", "\\fs"); - } - while (text.Contains("\\fn\\fn", StringComparison.Ordinal)) - { - text = text.Replace("\\fn\\fn", "\\fn"); - } - while (text.Contains("\\c\\c&H", StringComparison.Ordinal)) - { - text = text.Replace("\\c\\c&H", "\\c&H"); - } - return text; - } - - private static string FormatTag(ref string text, int start, string fontTag, string tag, string ssaTagName, string endSsaTag) - { - if (fontTag.Contains(tag)) - { - int fontStart = fontTag.IndexOf(tag, StringComparison.Ordinal); - - int fontEnd = fontTag.IndexOfAny(new[] { '"', '\'' }, fontStart + tag.Length); - if (fontEnd < 0) - { - fontEnd = fontTag.IndexOfAny(new[] { ' ', '>' }, fontStart + tag.Length); - } - - if (fontEnd > 0) - { - string subTag = fontTag.Substring(fontStart + tag.Length, fontEnd - (fontStart + tag.Length)); - if (tag.Contains("color")) - { - Color c; - try - { - c = ColorTranslator.FromHtml(subTag); - } - catch - { - c = Color.White; - } - subTag = (c.B.ToString("X2") + c.G.ToString("X2") + c.R.ToString("X2")).ToLowerInvariant(); // use bbggrr - } - fontTag = fontTag.Remove(fontStart, fontEnd - fontStart + 1); - if (start < text.Length) - { - text = text.Insert(start, @"{\" + ssaTagName + subTag + endSsaTag); - } - } - } - return fontTag; - } - - public static string GetFormattedText(string input) - { - var text = input.Replace("\\N", Environment.NewLine).Replace("\\n", Environment.NewLine); - - var tooComplex = ContainsUnsupportedTags(text); - - if (!tooComplex) - { - for (int i = 0; i < 10; i++) // just look ten times... - { - bool italic; - if (text.Contains(@"{\fn")) - { - int start = text.IndexOf(@"{\fn", StringComparison.Ordinal); - int end = text.IndexOf('}', start); - if (end > 0 && !text.Substring(start).StartsWith("{\\fn}", StringComparison.Ordinal)) - { - string fontName = text.Substring(start + 4, end - (start + 4)); - string extraTags = string.Empty; - CheckAndAddSubTags(ref fontName, ref extraTags, out var unknownTags, out italic); - text = text.Remove(start, end - start + 1); - if (italic) - { - text = text.Insert(start, "" + unknownTags + ""); - } - else - { - text = text.Insert(start, "" + unknownTags); - } - - int indexOfEndTag = text.IndexOf("{\\fn}", start, StringComparison.Ordinal); - if (indexOfEndTag > 0) - { - text = text.Remove(indexOfEndTag, "{\\fn}".Length).Insert(indexOfEndTag, ""); - } - else - { - int indexOfNextTag1 = text.IndexOf("{\\fn", start, StringComparison.Ordinal); - int indexOfNextTag2 = text.IndexOf("{\\c}", start, StringComparison.Ordinal); - if (indexOfNextTag1 > 0) - { - text = text.Insert(indexOfNextTag1, ""); - } - else if (indexOfNextTag2 > 0 && text.IndexOf("{\\", start, StringComparison.Ordinal) >= indexOfNextTag2) - { - text = text.Insert(indexOfNextTag2, ""); - } - else - { - text += ""; - } - } - } - } - - if (text.Contains(@"{\fs")) - { - int start = text.IndexOf(@"{\fs", StringComparison.Ordinal); - int end = text.IndexOf('}', start); - if (end > 0 && !text.Substring(start).StartsWith("{\\fs}", StringComparison.Ordinal)) - { - string fontSize = text.Substring(start + 4, end - (start + 4)); - string extraTags = string.Empty; - CheckAndAddSubTags(ref fontSize, ref extraTags, out var unknownTags, out italic); - if (float.TryParse(fontSize, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out _)) - { - text = text.Remove(start, end - start + 1); - if (italic) - { - text = text.Insert(start, "" + unknownTags + ""); - } - else - { - text = text.Insert(start, "" + unknownTags); - } - - int indexOfEndTag = text.IndexOf("{\\fs}", start, StringComparison.Ordinal); - if (indexOfEndTag > 0) - { - text = text.Remove(indexOfEndTag, "{\\fs}".Length).Insert(indexOfEndTag, ""); - } - else - { - int indexOfNextTag1 = text.IndexOf("{\\fs", start, StringComparison.Ordinal); - int indexOfNextTag2 = text.IndexOf("{\\c}", start, StringComparison.Ordinal); - if (indexOfNextTag1 > 0) - { - text = text.Insert(indexOfNextTag1, ""); - } - else if (indexOfNextTag2 > 0 && text.IndexOf("{\\", start, StringComparison.Ordinal) >= indexOfNextTag2) - { - text = text.Insert(indexOfNextTag2, ""); - } - else - { - text += ""; - } - } - } - } - } - - if (text.Contains(@"{\c")) - { - int start = text.IndexOf(@"{\c", StringComparison.Ordinal); - int end = text.IndexOf('}', start); - if (end > 0 && !text.Substring(start).StartsWith("{\\c}", StringComparison.Ordinal) && !text.Substring(start).StartsWith("{\\clip", StringComparison.Ordinal)) - { - string color = text.Substring(start + 4, end - (start + 4)); - string extraTags = string.Empty; - CheckAndAddSubTags(ref color, ref extraTags, out var unknownTags, out italic); - - color = color.RemoveChar('&').TrimStart('H'); - color = color.PadLeft(6, '0'); - - // switch to rrggbb from bbggrr - color = "#" + color.Remove(color.Length - 6) + color.Substring(color.Length - 2, 2) + color.Substring(color.Length - 4, 2) + color.Substring(color.Length - 6, 2); - color = color.ToLowerInvariant(); - - text = text.Remove(start, end - start + 1); - if (italic) - { - text = text.Insert(start, "" + unknownTags + ""); - } - else - { - text = text.Insert(start, "" + unknownTags); - } - - int indexOfEndTag = text.IndexOf("{\\c}", start, StringComparison.Ordinal); - int indexOfNextColorTag = text.IndexOf("{\\c&", start, StringComparison.Ordinal); - if (indexOfNextColorTag > 0 && (indexOfNextColorTag < indexOfEndTag || indexOfEndTag == -1)) - { - text = text.Insert(indexOfNextColorTag, ""); - } - else if (indexOfEndTag > 0) - { - text = text.Remove(indexOfEndTag, "{\\c}".Length).Insert(indexOfEndTag, ""); - } - else - { - text += ""; - } - } - } - - if (text.Contains(@"{\1c")) // "1" specifices primary color - { - int start = text.IndexOf(@"{\1c", StringComparison.Ordinal); - int end = text.IndexOf('}', start); - if (end > 0 && !text.Substring(start).StartsWith("{\\1c}", StringComparison.Ordinal)) - { - string color = text.Substring(start + 5, end - (start + 5)); - string extraTags = string.Empty; - CheckAndAddSubTags(ref color, ref extraTags, out var unknownTags, out italic); - - color = color.RemoveChar('&').TrimStart('H'); - color = color.PadLeft(6, '0'); - - // switch to rrggbb from bbggrr - color = "#" + color.Remove(color.Length - 6) + color.Substring(color.Length - 2, 2) + color.Substring(color.Length - 4, 2) + color.Substring(color.Length - 6, 2); - color = color.ToLowerInvariant(); - - text = text.Remove(start, end - start + 1); - if (italic) - { - text = text.Insert(start, "" + unknownTags + ""); - } - else - { - text = text.Insert(start, "" + unknownTags); - } - - text += ""; - } - } - } - } - - text = text.Replace(@"{\i1}", ""); - text = text.Replace(@"{\i0}", ""); - text = text.Replace(@"{\i}", ""); - if (Utilities.CountTagInText(text, "") > Utilities.CountTagInText(text, "")) - { - text += ""; - } - - text = text.Replace(@"{\u1}", ""); - text = text.Replace(@"{\u0}", ""); - text = text.Replace(@"{\u}", ""); - if (Utilities.CountTagInText(text, "") > Utilities.CountTagInText(text, "")) - { - text += ""; - } - - text = text.Replace(@"{\b1}", ""); - text = text.Replace(@"{\b0}", ""); - text = text.Replace(@"{\b}", ""); - if (Utilities.CountTagInText(text, "") > Utilities.CountTagInText(text, "")) - { - text += ""; - } - - return text; - } - - private static bool ContainsUnsupportedTags(string text) - { - if (string.IsNullOrEmpty(text) || !text.Contains("{\\", StringComparison.OrdinalIgnoreCase)) - { - return false; - } - - var unsupportedTags = new List - { - "\\alpha", - "\\be0", - "\\be1", - "\\bord", - "\\blur", - "\\clip", - "\\fad", - "\\fa", - "\\fade", - "\\fscx", - "\\fscy", - "\\fr", - "\\iclip", - "\\k", - "\\K", - "\\kf", - "\\ko", - "\\move", - "\\org", - "\\p", - "\\pos", - "\\s0", - "\\s1", - "\\t(", - "\\xbord", - "\\ybord", - "\\xshad", - "\\yshad" - }; - - foreach (var unsupportedTag in unsupportedTags) - { - if (text.Contains(unsupportedTag, StringComparison.Ordinal)) - { - return true; - } - } - - return false; - } - - private static void CheckAndAddSubTags(ref string tagName, ref string extraTags, out string unknownTags, out bool italic) - { - italic = false; - unknownTags = string.Empty; - int indexOfSPlit = tagName.IndexOf('\\'); - if (indexOfSPlit > 0) - { - string rest = tagName.Substring(indexOfSPlit).TrimStart('\\'); - tagName = tagName.Remove(indexOfSPlit); - - for (int i = 0; i < 10; i++) - { - if (rest.StartsWith("fs", StringComparison.Ordinal) && rest.Length > 2) - { - indexOfSPlit = rest.IndexOf('\\'); - string fontSize = rest; - if (indexOfSPlit > 0) - { - fontSize = rest.Substring(0, indexOfSPlit); - rest = rest.Substring(indexOfSPlit).TrimStart('\\'); - } - else - { - rest = string.Empty; - } - extraTags += " size=\"" + fontSize.Substring(2) + "\""; - } - else if (rest.StartsWith("fn", StringComparison.Ordinal) && rest.Length > 2) - { - indexOfSPlit = rest.IndexOf('\\'); - string fontName = rest; - if (indexOfSPlit > 0) - { - fontName = rest.Substring(0, indexOfSPlit); - rest = rest.Substring(indexOfSPlit).TrimStart('\\'); - } - else - { - rest = string.Empty; - } - extraTags += " face=\"" + fontName.Substring(2) + "\""; - } - else if (rest.StartsWith('c') && rest.Length > 2) - { - indexOfSPlit = rest.IndexOf('\\'); - string fontColor = rest; - if (indexOfSPlit > 0) - { - fontColor = rest.Substring(0, indexOfSPlit); - rest = rest.Substring(indexOfSPlit).TrimStart('\\'); - } - else - { - rest = string.Empty; - } - - string color = fontColor.Substring(2); - color = color.RemoveChar('&').TrimStart('H'); - color = color.PadLeft(6, '0'); - // switch to rrggbb from bbggrr - color = "#" + color.Remove(color.Length - 6) + color.Substring(color.Length - 2, 2) + color.Substring(color.Length - 4, 2) + color.Substring(color.Length - 6, 2); - color = color.ToLowerInvariant(); - - extraTags += " color=\"" + color + "\""; - } - else if (rest.StartsWith("i1", StringComparison.Ordinal) && rest.Length > 1) - { - indexOfSPlit = rest.IndexOf('\\'); - italic = true; - if (indexOfSPlit > 0) - { - rest = rest.Substring(indexOfSPlit).TrimStart('\\'); - } - else - { - rest = string.Empty; - } - } - else if (rest.Length > 0 && rest.Contains("\\")) - { - indexOfSPlit = rest.IndexOf('\\'); - var unknowntag = rest.Substring(0, indexOfSPlit); - unknownTags += "\\" + unknowntag; - rest = rest.Substring(indexOfSPlit).TrimStart('\\'); - } - else if (!string.IsNullOrEmpty(rest)) - { - unknownTags += "\\" + rest; - rest = string.Empty; - } - } - } - if (!string.IsNullOrEmpty(unknownTags)) - { - unknownTags = "{" + unknownTags + "}"; - } - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - Errors = null; - bool eventsStarted = false; - bool fontsStarted = false; - bool graphicsStarted = false; - subtitle.Paragraphs.Clear(); - - // Layer, Start, End, Style, Actor, MarginL, MarginR, MarginV, Effect, Text - int indexLayer = 0; - int indexStart = 1; - int indexEnd = 2; - int indexStyle = 3; - int indexActor = -1; // convert "Actor" to "Nam" (if no "Name") - int indexName = 4; - int indexMarginL = 5; - int indexMarginR = 6; - int indexMarginV = 7; - int indexEffect = 8; - int indexText = 9; - var errors = new StringBuilder(); - int lineNumber = 0; - - var header = new StringBuilder(); - var footer = new StringBuilder(); - foreach (string line in lines) - { - lineNumber++; - if (!eventsStarted && !fontsStarted && !graphicsStarted && - !line.Trim().Equals("[fonts]", StringComparison.InvariantCultureIgnoreCase) && - !line.Trim().Equals("[graphics]", StringComparison.InvariantCultureIgnoreCase)) - { - header.AppendLine(line); - } - - if (string.IsNullOrWhiteSpace(line) || line.TrimStart().StartsWith(';')) - { - // skip empty and comment lines - } - else if (line.TrimStart().StartsWith("dialog:", StringComparison.OrdinalIgnoreCase) || line.TrimStart().StartsWith("dialogue:", StringComparison.OrdinalIgnoreCase)) // fix faulty font tags... - { - eventsStarted = true; - fontsStarted = false; - graphicsStarted = false; - } - - if (line.Trim().Equals("[events]", StringComparison.OrdinalIgnoreCase)) - { - if (header.ToString().IndexOf(Environment.NewLine + "[events]", StringComparison.OrdinalIgnoreCase) < 0) - { - var h = header.ToString().TrimEnd(); - header.Clear(); - header.AppendLine(h); - header.AppendLine(); - header.AppendLine("[Events]"); - } - eventsStarted = true; - fontsStarted = false; - graphicsStarted = false; - } - else if (line.Trim().Equals("[fonts]", StringComparison.OrdinalIgnoreCase)) - { - eventsStarted = false; - fontsStarted = true; - graphicsStarted = false; - footer.AppendLine(); - footer.AppendLine("[Fonts]"); - } - else if (line.Trim().Equals("[graphics]", StringComparison.OrdinalIgnoreCase)) - { - eventsStarted = false; - fontsStarted = false; - graphicsStarted = true; - footer.AppendLine(); - footer.AppendLine("[Graphics]"); - } - else if (line.Trim().Equals("[Aegisub Extradata]", StringComparison.OrdinalIgnoreCase)) - { - eventsStarted = false; - fontsStarted = false; - graphicsStarted = true; - footer.AppendLine(); - footer.AppendLine("[Aegisub Extradata]"); - } - else if (fontsStarted) - { - footer.AppendLine(line); - } - else if (graphicsStarted) - { - footer.AppendLine(line); - } - else if (eventsStarted) - { - string s = line.Trim().ToLowerInvariant(); - if (line.Length > 10 && s.StartsWith("format:", StringComparison.Ordinal)) - { - indexLayer = -1; - indexStart = -1; - indexEnd = -1; - indexStyle = -1; - indexActor = -1; - indexName = -1; - indexMarginL = -1; - indexMarginR = -1; - indexMarginV = -1; - indexEffect = -1; - indexText = -1; - - var format = s.Substring(8).Split(','); - for (int i = 0; i < format.Length; i++) - { - var formatTrimmed = format[i].Trim(); - if (formatTrimmed.Equals("start", StringComparison.Ordinal)) - { - indexStart = i; - } - else if (formatTrimmed.Equals("end", StringComparison.Ordinal)) - { - indexEnd = i; - } - else if (formatTrimmed.Equals("text", StringComparison.Ordinal)) - { - indexText = i; - } - else if (formatTrimmed.Equals("style", StringComparison.Ordinal)) - { - indexStyle = i; - } - else if (formatTrimmed.Equals("actor", StringComparison.Ordinal)) - { - indexActor = i; - } - else if (formatTrimmed.Equals("name", StringComparison.Ordinal)) - { - indexName = i; - } - else if (formatTrimmed.Equals("marginl", StringComparison.Ordinal)) - { - indexMarginL = i; - } - else if (formatTrimmed.Equals("marginr", StringComparison.Ordinal)) - { - indexMarginR = i; - } - else if (formatTrimmed.Equals("marginv", StringComparison.Ordinal)) - { - indexMarginV = i; - } - else if (formatTrimmed.Equals("effect", StringComparison.Ordinal)) - { - indexEffect = i; - } - else if (formatTrimmed.Equals("layer", StringComparison.Ordinal)) - { - indexLayer = i; - } - } - } - else if (!string.IsNullOrEmpty(s)) - { - var text = string.Empty; - var start = string.Empty; - var end = string.Empty; - var style = string.Empty; - var actor = string.Empty; - var marginL = string.Empty; - var marginR = string.Empty; - var marginV = string.Empty; - var effect = string.Empty; - var layer = 0; - - string[] splittedLine; - if (s.StartsWith("dialog:", StringComparison.Ordinal)) - { - splittedLine = line.Remove(0, 7).Split(','); - } - else if (s.StartsWith("dialogue:", StringComparison.Ordinal)) - { - splittedLine = line.Remove(0, 9).Split(','); - } - else - { - splittedLine = line.Split(','); - } - - for (int i = 0; i < splittedLine.Length; i++) - { - if (i == indexStart) - { - start = splittedLine[i].Trim(); - } - else if (i == indexEnd) - { - end = splittedLine[i].Trim(); - } - else if (i == indexStyle) - { - style = splittedLine[i].Trim(); - } - else if (i == indexActor && indexName == -1) - { - actor = splittedLine[i].Trim(); - } - else if (i == indexName) - { - actor = splittedLine[i].Trim(); - } - else if (i == indexMarginL) - { - marginL = splittedLine[i].Trim(); - } - else if (i == indexMarginR) - { - marginR = splittedLine[i].Trim(); - } - else if (i == indexMarginV) - { - marginV = splittedLine[i].Trim(); - } - else if (i == indexEffect) - { - effect = splittedLine[i].Trim(); - } - else if (i == indexLayer) - { - int.TryParse(splittedLine[i].Replace("Comment:", string.Empty).Trim(), out layer); - } - else if (i == indexText) - { - text = splittedLine[i]; - } - else if (i > indexText) - { - text += "," + splittedLine[i]; - } - } - - try - { - var p = new Paragraph - { - StartTime = GetTimeCodeFromString(start), - EndTime = GetTimeCodeFromString(end), - Text = GetFormattedText(text) - }; - - if (!string.IsNullOrEmpty(style)) - { - p.Extra = style; - } - - if (!string.IsNullOrEmpty(actor)) - { - p.Actor = actor; - } - - if (!string.IsNullOrEmpty(marginL)) - { - p.MarginL = marginL; - } - - if (!string.IsNullOrEmpty(marginR)) - { - p.MarginR = marginR; - } - - if (!string.IsNullOrEmpty(marginV)) - { - p.MarginV = marginV; - } - - if (!string.IsNullOrEmpty(effect)) - { - p.Effect = effect; - } - - p.Layer = layer; - p.IsComment = s.StartsWith("comment:", StringComparison.Ordinal); - subtitle.Paragraphs.Add(p); - } - catch - { - _errorCount++; - if (errors.Length < 2000) - { - errors.AppendLine(string.Format(Configuration.Settings.Language.Main.LineNumberXErrorReadingTimeCodeFromSourceLineY, lineNumber, line)); - } - else if (subtitle.Paragraphs.Count == 0) - { - break; - } - } - } - } - } - if (header.Length > 0) - { - subtitle.Header = header.ToString(); - } - - if (footer.Length > 0) - { - subtitle.Footer = footer.ToString().Trim(); - } - - subtitle.Renumber(); - Errors = errors.ToString(); - } - - private static TimeCode GetTimeCodeFromString(string time) - { - // h:mm:ss.cc - string[] timeCode = time.Split(':', '.'); - return new TimeCode(int.Parse(timeCode[0]), - int.Parse(timeCode[1]), - int.Parse(timeCode[2]), - int.Parse(timeCode[3]) * 10); - } - - public override void RemoveNativeFormatting(Subtitle subtitle, SubtitleFormat newFormat) - { - if (newFormat != null && newFormat.Name == SubStationAlpha.NameOfFormat) - { - foreach (var p in subtitle.Paragraphs) - { - string s = p.Text; - - if (s.Contains('{') && s.Contains('}')) - { - var p1Index = s.IndexOf("\\p1", StringComparison.Ordinal); - var p0Index = s.IndexOf("{\\p0}", StringComparison.Ordinal); - if (p1Index > 0 && (p0Index > p1Index || p0Index == -1)) - { - var startTagIndex = s.Substring(0, p1Index).LastIndexOf('{'); - if (startTagIndex >= 0) - { - if (p0Index > p1Index) - { - s = s.Remove(startTagIndex, p0Index - startTagIndex + "{\\p0}".Length); - } - else - { - s = s.Remove(startTagIndex); - } - } - } - - var karaokeStart = s.IndexOf("{Kara Effector", StringComparison.Ordinal); - if (karaokeStart >= 0) - { - int l = s.IndexOf('}', karaokeStart + 1); - if (l < karaokeStart) - { - break; - } - - s = s.Remove(karaokeStart, l - karaokeStart + 1); - } - - s = s.Replace(@"\u0", string.Empty); - s = s.Replace(@"\u1", string.Empty); - s = s.Replace(@"\s0", string.Empty); - s = s.Replace(@"\s1", string.Empty); - s = s.Replace(@"\be0", string.Empty); - s = s.Replace(@"\be1", string.Empty); - - s = RemoveTag(s, "shad"); - s = RemoveTag(s, "fsc"); - s = RemoveTag(s, "fsp"); - s = RemoveTag(s, "fr"); - - s = RemoveTag(s, "t("); - s = RemoveTag(s, "move("); - s = RemoveTag(s, "Position("); - s = RemoveTag(s, "org("); - s = RemoveTag(s, "fade("); - s = RemoveTag(s, "fad("); - s = RemoveTag(s, "clip("); - s = RemoveTag(s, "iclip("); - s = RemoveTag(s, "pbo("); - s = RemoveTag(s, "bord"); - s = RemoveTag(s, "pos"); - - // TODO: Alignment tags - - s = s.Replace("{}", string.Empty); - - p.Text = s; - } - } - } - else - { - foreach (var p in subtitle.Paragraphs) - { - var noTags = Utilities.RemoveSsaTags(p.Text).Trim(); - if (noTags.Length == 0) - { - p.Text = string.Empty; - continue; - } - - p.Text = p.Text.Replace("\\n", Environment.NewLine); // Soft line break - p.Text = p.Text.Replace("\\N", Environment.NewLine); // Hard line break - p.Text = p.Text.Replace("\\h", " "); // Hard space - - if (noTags.StartsWith("m ", StringComparison.Ordinal)) - { - var test = noTags.Remove(0, 2) - .RemoveChar('0') - .RemoveChar('1') - .RemoveChar('2') - .RemoveChar('3') - .RemoveChar('4') - .RemoveChar('5') - .RemoveChar('6') - .RemoveChar('7') - .RemoveChar('8') - .RemoveChar('9') - .RemoveChar('-') - .RemoveChar('l') - .RemoveChar('m') - .RemoveChar(' ') - .RemoveChar('.'); - if (test.Length == 0) - { - p.Text = string.Empty; - continue; - } - } - - int indexOfBegin = p.Text.IndexOf('{'); - string pre = string.Empty; - while (indexOfBegin >= 0 && p.Text.IndexOf('}') > indexOfBegin) - { - string s = p.Text.Substring(indexOfBegin); - if (s.StartsWith("{\\an1}", StringComparison.Ordinal) || - s.StartsWith("{\\an2}", StringComparison.Ordinal) || - s.StartsWith("{\\an3}", StringComparison.Ordinal) || - s.StartsWith("{\\an4}", StringComparison.Ordinal) || - s.StartsWith("{\\an5}", StringComparison.Ordinal) || - s.StartsWith("{\\an6}", StringComparison.Ordinal) || - s.StartsWith("{\\an7}", StringComparison.Ordinal) || - s.StartsWith("{\\an8}", StringComparison.Ordinal) || - s.StartsWith("{\\an9}", StringComparison.Ordinal)) - { - pre = s.Substring(0, 6); - } - else if (s.StartsWith("{\\an1\\", StringComparison.Ordinal) || - s.StartsWith("{\\an2\\", StringComparison.Ordinal) || - s.StartsWith("{\\an3\\", StringComparison.Ordinal) || - s.StartsWith("{\\an4\\", StringComparison.Ordinal) || - s.StartsWith("{\\an5\\", StringComparison.Ordinal) || - s.StartsWith("{\\an6\\", StringComparison.Ordinal) || - s.StartsWith("{\\an7\\", StringComparison.Ordinal) || - s.StartsWith("{\\an8\\", StringComparison.Ordinal) || - s.StartsWith("{\\an9\\", StringComparison.Ordinal)) - { - pre = s.Substring(0, 5) + "}"; - } - int indexOfEnd = p.Text.IndexOf('}'); - p.Text = p.Text.Remove(indexOfBegin, indexOfEnd - indexOfBegin + 1); - - indexOfBegin = p.Text.IndexOf('{'); - } - p.Text = pre + p.Text; - } - } - } - - private static string RemoveTag(string s, string tag) - { - int indexOfTag = s.IndexOf(@"\" + tag, StringComparison.Ordinal); - if (indexOfTag > 0) - { - var endIndex1 = s.IndexOf('\\', indexOfTag + 1); - var endIndex2 = s.IndexOf('}', indexOfTag + 1); - endIndex1 = Math.Min(endIndex1, endIndex2); - if (endIndex1 > 0) - { - return s.Remove(indexOfTag, endIndex1 - indexOfTag); - } - } - return s; - } - - /// - /// BGR color like this: &HBBGGRR& (where BB, GG, and RR are hex values in uppercase) - /// - /// Input string - /// Default color - /// Input string as color, or default color if problems - public static Color GetSsaColor(string f, Color defaultColor) - { - //Red = &H0000FF& - //Green = &H00FF00& - //Blue = &HFF0000& - //White = &HFFFFFF& - //Black = &H000000& - string s = f.Trim().Trim('&'); - - if (s.StartsWith('h') && s.Length < 7) - { - while (s.Length < 7) - { - s = s.Insert(1, "0"); - } - } - - if (s.StartsWith('h') && s.Length == 7) - { - s = s.Substring(1); - string hexColor = "#" + s.Substring(4, 2) + s.Substring(2, 2) + s.Substring(0, 2); - try - { - return ColorTranslator.FromHtml(hexColor); - } - catch - { - return defaultColor; - } - } - if (s.StartsWith('h') && s.Length == 9) - { - if (int.TryParse(s.Substring(1, 2), NumberStyles.HexNumber, null, out var alpha)) - { - alpha = 255 - alpha; // ASS stores alpha in reverse (0=full itentity and 255=fully transparent) - } - else - { - alpha = 255; // full color - } - s = s.Substring(3); - string hexColor = "#" + s.Substring(4, 2) + s.Substring(2, 2) + s.Substring(0, 2); - try - { - var c = ColorTranslator.FromHtml(hexColor); - return Color.FromArgb(alpha, c); - } - catch - { - return defaultColor; - } - } - - if (int.TryParse(f, out var number)) - { - var temp = Color.FromArgb(number); - return Color.FromArgb(255, temp.B, temp.G, temp.R); - } - return defaultColor; - } - - public static string GetSsaColorString(Color c) - { - return $"&H{255 - c.A:X2}{c.B:X2}{c.G:X2}{c.R:X2}"; // ASS stores alpha in reverse (0=full itentity and 255=fully transparent) - } - - public static string CheckForErrors(string header) - { - if (string.IsNullOrEmpty(header)) - { - return string.Empty; - } - - var sb = new StringBuilder(); - - int styleCount = -1; - - int nameIndex = -1; - int fontNameIndex = -1; - int fontsizeIndex = -1; - int primaryColourIndex = -1; - int secondaryColourIndex = -1; - int outlineColourIndex = -1; - int backColourIndex = -1; - int boldIndex = -1; - int italicIndex = -1; - int underlineIndex = -1; - int outlineIndex = -1; - int shadowIndex = -1; - int alignmentIndex = -1; - int marginLIndex = -1; - int marginRIndex = -1; - int marginVIndex = -1; - int borderStyleIndex = -1; - - foreach (string line in header.SplitToLines()) - { - string s = line.Trim().ToLowerInvariant(); - if (s.StartsWith("format:", StringComparison.Ordinal)) - { - if (line.Length > 10) - { - var format = line.Substring(8).ToLowerInvariant().Split(','); - styleCount = format.Length; - for (int i = 0; i < format.Length; i++) - { - string f = format[i].Trim(); - if (f == "name") - { - nameIndex = i; - } - else if (f == "fontname") - { - fontNameIndex = i; - } - else if (f == "fontsize") - { - fontsizeIndex = i; - } - else if (f == "primarycolour") - { - primaryColourIndex = i; - } - else if (f == "secondarycolour") - { - secondaryColourIndex = i; - } - else if (f == "outlinecolour") - { - outlineColourIndex = i; - } - else if (f == "backcolour") - { - backColourIndex = i; - } - else if (f == "bold") - { - boldIndex = i; - } - else if (f == "italic") - { - italicIndex = i; - } - else if (f == "underline") - { - underlineIndex = i; - } - else if (f == "outline") - { - outlineIndex = i; - } - else if (f == "shadow") - { - shadowIndex = i; - } - else if (f == "alignment") - { - alignmentIndex = i; - } - else if (f == "marginl") - { - marginLIndex = i; - } - else if (f == "marginr") - { - marginRIndex = i; - } - else if (f == "marginv") - { - marginVIndex = i; - } - else if (f == "borderstyle") - { - borderStyleIndex = i; - } - } - } - } - else if (s.RemoveChar(' ').StartsWith("style:", StringComparison.Ordinal)) - { - if (line.Length > 10) - { - string rawLine = line; - var format = line.Substring(6).Split(','); - - if (format.Length != styleCount) - { - sb.AppendLine("Number of expected Style elements do not match number of Format elements: " + rawLine); - sb.AppendLine(); - } - else - { - var dummyColor = Color.FromArgb(9, 14, 16, 26); - for (int i = 0; i < format.Length; i++) - { - string f = format[i].Trim().ToLowerInvariant(); - if (i == nameIndex) - { - if (f.Length == 0) - { - sb.AppendLine("'Name' is empty: " + rawLine); - sb.AppendLine(); - } - } - else if (i == fontNameIndex) - { - if (f.Length == 0) - { - sb.AppendLine("'Fontname' is empty: " + rawLine); - sb.AppendLine(); - } - } - else if (i == fontsizeIndex) - { - if (!float.TryParse(f, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out _) || f.StartsWith('-')) - { - sb.AppendLine("'Fontsize' incorrect: " + rawLine); - sb.AppendLine(); - } - } - else if (i == primaryColourIndex) - { - if (GetSsaColor(f, dummyColor) == dummyColor || f == "&h") - { - sb.AppendLine("'PrimaryColour' incorrect: " + rawLine); - sb.AppendLine(); - } - } - else if (i == secondaryColourIndex) - { - if (GetSsaColor(f, dummyColor) == dummyColor) - { - sb.AppendLine("'SecondaryColour' incorrect: " + rawLine); - sb.AppendLine(); - } - } - else if (i == outlineColourIndex) - { - if (GetSsaColor(f, dummyColor) == dummyColor) - { - sb.AppendLine("'OutlineColour' incorrect: " + rawLine); - sb.AppendLine(); - } - } - else if (i == backColourIndex) - { - if (GetSsaColor(f, dummyColor) == dummyColor) - { - sb.AppendLine("'BackColour' incorrect: " + rawLine); - sb.AppendLine(); - } - } - else if (i == boldIndex) - { - if (Utilities.AllLetters.Contains(f)) - { - sb.AppendLine("'Bold' incorrect: " + rawLine); - sb.AppendLine(); - } - } - else if (i == italicIndex) - { - if (Utilities.AllLetters.Contains(f)) - { - sb.AppendLine("'Italic' incorrect: " + rawLine); - sb.AppendLine(); - } - } - else if (i == underlineIndex) - { - if (Utilities.AllLetters.Contains(f)) - { - sb.AppendLine("'Underline' incorrect: " + rawLine); - sb.AppendLine(); - } - } - else if (i == outlineIndex) - { - if (!float.TryParse(f, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out _) || f.StartsWith('-')) - { - sb.AppendLine("'Outline' (width) incorrect: " + rawLine); - sb.AppendLine(); - } - } - else if (i == shadowIndex) - { - if (!float.TryParse(f, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out _) || f.StartsWith('-')) - { - sb.AppendLine("'Shadow' (width) incorrect: " + rawLine); - sb.AppendLine(); - } - } - else if (i == alignmentIndex) - { - if (!"101123456789 ".Contains(f)) - { - sb.AppendLine("'Alignment' incorrect: " + rawLine); - sb.AppendLine(); - } - } - else if (i == marginLIndex) - { - if (!int.TryParse(f, out _) || f.StartsWith('-')) - { - sb.AppendLine("'MarginL' incorrect: " + rawLine); - sb.AppendLine(); - } - } - else if (i == marginRIndex) - { - if (!int.TryParse(f, out _) || f.StartsWith('-')) - { - sb.AppendLine("'MarginR' incorrect: " + rawLine); - sb.AppendLine(); - } - } - else if (i == marginVIndex) - { - if (!int.TryParse(f, out _) || f.StartsWith('-')) - { - sb.AppendLine("'MarginV' incorrect: " + rawLine); - sb.AppendLine(); - } - } - else if (i == borderStyleIndex) - { - if (f.Length != 0 && !"123".Contains(f)) - { - sb.AppendLine("'BorderStyle' incorrect: " + rawLine); - sb.AppendLine(); - } - } - } - } - } - } - } - return sb.ToString(); - } - - /// - /// Add new style to ASS header - /// - /// Header with new style - public static string AddSsaStyle(SsaStyle style, string inputHeader) - { - var header = inputHeader; - if (string.IsNullOrEmpty(header)) - { - header = DefaultHeader; - } - - var sb = new StringBuilder(); - bool stylesStarted = false; - bool styleAdded = false; - string styleFormat = "Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding"; - foreach (string line in header.SplitToLines()) - { - if (line.Equals("[V4+ Styles]", StringComparison.OrdinalIgnoreCase) || line.Equals("[V4 Styles]", StringComparison.OrdinalIgnoreCase)) - { - stylesStarted = true; - } - - if (line.StartsWith("format:", StringComparison.OrdinalIgnoreCase)) - { - styleFormat = line; - } - - if (!line.StartsWith("Style: " + style.Name + ",", StringComparison.Ordinal)) // overwrite existing style - { - sb.AppendLine(line); - } - - if (!styleAdded && stylesStarted && line.TrimStart().StartsWith("style:", StringComparison.OrdinalIgnoreCase)) - { - sb.AppendLine(style.ToRawAss(styleFormat)); - styleAdded = true; - } - } - return sb.ToString(); - } - - public static SsaStyle GetSsaStyle(string styleName, string header) - { - var style = new SsaStyle { Name = styleName }; - - int nameIndex = -1; - int fontNameIndex = -1; - int fontsizeIndex = -1; - int primaryColourIndex = -1; - int secondaryColourIndex = -1; - int tertiaryColourIndex = -1; - int outlineColourIndex = -1; - int backColourIndex = -1; - int boldIndex = -1; - int italicIndex = -1; - int underlineIndex = -1; - int outlineIndex = -1; - int shadowIndex = -1; - int alignmentIndex = -1; - int marginLIndex = -1; - int marginRIndex = -1; - int marginVIndex = -1; - int borderStyleIndex = -1; - - if (header == null) - { - header = DefaultHeader; - } - - foreach (string line in header.SplitToLines()) - { - string s = line.Trim().ToLowerInvariant(); - if (s.StartsWith("format:", StringComparison.Ordinal)) - { - if (line.Length > 10) - { - var format = line.ToLowerInvariant().Substring(8).Split(','); - for (int i = 0; i < format.Length; i++) - { - string f = format[i].Trim().ToLowerInvariant(); - if (f == "name") - { - nameIndex = i; - } - else if (f == "fontname") - { - fontNameIndex = i; - } - else if (f == "fontsize") - { - fontsizeIndex = i; - } - else if (f == "primarycolour") - { - primaryColourIndex = i; - } - else if (f == "secondarycolour") - { - secondaryColourIndex = i; - } - else if (f == "tertiarycolour") - { - tertiaryColourIndex = i; - } - else if (f == "outlinecolour") - { - outlineColourIndex = i; - } - else if (f == "backcolour") - { - backColourIndex = i; - } - else if (f == "bold") - { - boldIndex = i; - } - else if (f == "italic") - { - italicIndex = i; - } - else if (f == "underline") - { - underlineIndex = i; - } - else if (f == "outline") - { - outlineIndex = i; - } - else if (f == "shadow") - { - shadowIndex = i; - } - else if (f == "alignment") - { - alignmentIndex = i; - } - else if (f == "marginl") - { - marginLIndex = i; - } - else if (f == "marginr") - { - marginRIndex = i; - } - else if (f == "marginv") - { - marginVIndex = i; - } - else if (f == "borderstyle") - { - borderStyleIndex = i; - } - } - } - } - else if (s.RemoveChar(' ').StartsWith("style:", StringComparison.Ordinal)) - { - if (line.Length > 10) - { - style.RawLine = line; - var format = line.Substring(6).Split(','); - for (int i = 0; i < format.Length; i++) - { - string f = format[i].Trim().ToLowerInvariant(); - if (i == nameIndex) - { - style.Name = format[i].Trim(); - } - else if (i == fontNameIndex) - { - style.FontName = f; - } - else if (i == fontsizeIndex) - { - if (float.TryParse(f, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var fOut)) - { - style.FontSize = fOut; - } - } - else if (i == primaryColourIndex) - { - style.Primary = GetSsaColor(f, Color.White); - } - else if (i == secondaryColourIndex) - { - style.Secondary = GetSsaColor(f, Color.Yellow); - } - else if (i == tertiaryColourIndex) - { - style.Tertiary = GetSsaColor(f, Color.Yellow); - } - else if (i == outlineColourIndex) - { - style.Outline = GetSsaColor(f, Color.Black); - } - else if (i == backColourIndex) - { - style.Background = GetSsaColor(f, Color.Black); - } - else if (i == boldIndex) - { - style.Bold = f == "-1" || f == "1"; - } - else if (i == italicIndex) - { - style.Italic = f == "-1" || f == "1"; - } - else if (i == underlineIndex) - { - style.Underline = f == "-1" || f == "1"; - } - else if (i == outlineIndex) - { - if (decimal.TryParse(f, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var number)) - { - style.OutlineWidth = number; - } - } - else if (i == shadowIndex) - { - if (decimal.TryParse(f, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var number)) - { - style.ShadowWidth = number; - } - } - else if (i == alignmentIndex) - { - style.Alignment = f; - } - else if (i == marginLIndex) - { - if (int.TryParse(f, out var number)) - { - style.MarginLeft = number; - } - } - else if (i == marginRIndex) - { - if (int.TryParse(f, out var number)) - { - style.MarginRight = number; - } - } - else if (i == marginVIndex) - { - if (int.TryParse(f, out var number)) - { - style.MarginVertical = number; - } - } - else if (i == borderStyleIndex) - { - style.BorderStyle = f; - } - } - } - if (styleName != null && style.Name != null && (styleName.Equals(style.Name, StringComparison.OrdinalIgnoreCase) || - styleName.Equals("*Default", StringComparison.OrdinalIgnoreCase) && - style.Name.Equals("Default", StringComparison.OrdinalIgnoreCase))) - { - style.LoadedFromHeader = true; - return style; - } - } - } - return new SsaStyle { Name = styleName }; - } - - public override bool HasStyleSupport => true; - } +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class AdvancedSubStationAlpha : SubtitleFormat + { + public string Errors { get; private set; } + + public static string DefaultStyle + { + get + { + var borderStyle = "1"; // 1=normal, 3=opaque box + if (Configuration.Settings.SubtitleSettings.SsaOpaqueBox) + { + borderStyle = "3"; + } + + var boldStyle = "0"; // 0=regular + if (Configuration.Settings.SubtitleSettings.SsaFontBold) + { + boldStyle = "-1"; + } + + var ssa = Configuration.Settings.SubtitleSettings; + return "Style: Default," + ssa.SsaFontName + "," + + ssa.SsaFontSize.ToString(CultureInfo.InvariantCulture) + "," + + GetSsaColorString(Color.FromArgb(ssa.SsaFontColorArgb)) + "," + + "&H0300FFFF,&H00000000,&H02000000," + boldStyle + ",0,0,0,100,100,0,0," + borderStyle + "," + ssa.SsaOutline.ToString(CultureInfo.InvariantCulture) + "," + + Configuration.Settings.SubtitleSettings.SsaShadow.ToString(CultureInfo.InvariantCulture) + ",2," + ssa.SsaMarginLeft + "," + ssa.SsaMarginRight + "," + ssa.SsaMarginTopBottom + ",1"; + } + } + + public static string DefaultHeader + { + get + { + var format = new AdvancedSubStationAlpha(); + var sub = new Subtitle(); + string text = format.ToText(sub, string.Empty); + var lines = text.SplitToLines(); + format.LoadSubtitle(sub, lines, string.Empty); + return sub.Header; + } + } + + public override string Extension => ".ass"; + + public const string NameOfFormat = "Advanced Sub Station Alpha"; + + public override string Name => NameOfFormat; + + public override bool IsMine(List lines, string fileName) + { + var subtitle = new Subtitle(); + + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + string all = sb.ToString(); + if (!string.IsNullOrEmpty(fileName) && fileName.EndsWith(".ass", StringComparison.OrdinalIgnoreCase) && !all.Contains("[V4 Styles]")) + { + } + else if (!all.Contains("dialog:", StringComparison.OrdinalIgnoreCase) && !all.Contains("dialogue:", StringComparison.OrdinalIgnoreCase)) + { + return false; + } + else if (!all.Contains("[V4+ Styles]") && new SubStationAlpha().IsMine(lines, fileName)) + { + return false; + } + + LoadSubtitle(subtitle, lines, fileName); + Errors = null; + if (subtitle.Paragraphs.Count > _errorCount) + { + if (!string.IsNullOrEmpty(subtitle.Header)) + { + subtitle.Header = subtitle.Header.Replace("[V4 Styles]", "[V4+ Styles]"); + } + + return true; + } + return false; + } + + public const string HeaderNoStyles = @"[Script Info] +; This is an Advanced Sub Station Alpha v4+ script. +Title: {0} +ScriptType: v4.00+ +Collisions: Normal +PlayDepth: 0 + +[V4+ Styles] +Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding +{1} + +[Events] +Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text"; + + public override string ToText(Subtitle subtitle, string title) + { + bool fromTtml = false; + string header = @"[Script Info] +; This is an Advanced Sub Station Alpha v4+ script. +Title: {0} +ScriptType: v4.00+ +Collisions: Normal +PlayDepth: 0 + +[V4+ Styles] +Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding +" + DefaultStyle + @" + +[Events] +Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text"; + + const string timeCodeFormat = "{0}:{1:00}:{2:00}.{3:00}"; // h:mm:ss.cc + const string paragraphWriteFormat = "Dialogue: {9},{0},{1},{3},{4},{5},{6},{7},{8},{2}"; + const string commentWriteFormat = "Comment: {9},{0},{1},{3},{4},{5},{6},{7},{8},{2}"; + + var sb = new StringBuilder(); + bool isValidAssHeader = !string.IsNullOrEmpty(subtitle.Header) && subtitle.Header.Contains("[V4+ Styles]"); + var styles = new List(); + if (isValidAssHeader) + { + sb.AppendLine(subtitle.Header.Trim()); + sb.AppendLine("Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text"); + styles = GetStylesFromHeader(subtitle.Header); + } + else if (!string.IsNullOrEmpty(subtitle.Header) && subtitle.Header.Contains("[V4 Styles]")) + { + LoadStylesFromSubstationAlpha(subtitle, title, header, HeaderNoStyles, sb); + } + else if (subtitle.Header != null && subtitle.Header.Contains("http://www.w3.org/ns/ttml")) + { + LoadStylesFromTimedText10(subtitle, title, header, HeaderNoStyles, sb); + fromTtml = true; + isValidAssHeader = !string.IsNullOrEmpty(subtitle.Header) && subtitle.Header.Contains("[V4+ Styles]"); + if (isValidAssHeader) + { + styles = GetStylesFromHeader(subtitle.Header); + } + } + else if (subtitle.Header != null && subtitle.Header.Contains("http://www.w3.org/2006/10/ttaf1")) + { + LoadStylesFromTimedTextTimedDraft2006Oct(subtitle, title, header, HeaderNoStyles, sb); + fromTtml = true; + isValidAssHeader = !string.IsNullOrEmpty(subtitle.Header) && subtitle.Header.Contains("[V4+ Styles]"); + if (isValidAssHeader) + { + styles = GetStylesFromHeader(subtitle.Header); + } + } + else + { + sb.AppendLine(string.Format(header, title)); + } + foreach (var p in subtitle.Paragraphs) + { + string start = string.Format(timeCodeFormat, p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, p.StartTime.Milliseconds / 10); + string end = string.Format(timeCodeFormat, p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, p.EndTime.Milliseconds / 10); + string style = "Default"; + if (!string.IsNullOrEmpty(p.Extra) && isValidAssHeader && styles.Contains(p.Extra)) + { + style = p.Extra; + } + + if (fromTtml && !string.IsNullOrEmpty(p.Style) && isValidAssHeader && styles.Contains(p.Style)) + { + style = p.Style; + } + + string actor = ""; + if (!string.IsNullOrEmpty(p.Actor)) + { + actor = p.Actor; + } + + string marginL = "0"; + if (!string.IsNullOrEmpty(p.MarginL) && Utilities.IsInteger(p.MarginL)) + { + marginL = p.MarginL; + } + + string marginR = "0"; + if (!string.IsNullOrEmpty(p.MarginR) && Utilities.IsInteger(p.MarginR)) + { + marginR = p.MarginR; + } + + string marginV = "0"; + if (!string.IsNullOrEmpty(p.MarginV) && Utilities.IsInteger(p.MarginV)) + { + marginV = p.MarginV; + } + + string effect = ""; + if (!string.IsNullOrEmpty(p.Effect)) + { + effect = p.Effect; + } + + if (p.IsComment) + { + sb.AppendLine(string.Format(commentWriteFormat, start, end, FormatText(p), style, actor, marginL, marginR, marginV, effect, p.Layer)); + } + else + { + sb.AppendLine(string.Format(paragraphWriteFormat, start, end, FormatText(p), style, actor, marginL, marginR, marginV, effect, p.Layer)); + } + } + + if (!string.IsNullOrEmpty(subtitle.Footer) && + (subtitle.Footer.Contains("[Fonts]" + Environment.NewLine) || subtitle.Footer.Contains("[Graphics]" + Environment.NewLine) || subtitle.Footer.Contains("[Aegisub Extradata]" + Environment.NewLine))) + { + sb.AppendLine(); + sb.AppendLine(subtitle.Footer); + } + return sb.ToString().Trim() + Environment.NewLine; + } + + public static string GetHeaderAndStylesFromSubStationAlpha(string header) + { + var scriptInfo = string.Empty; + if (header != null && + header.Contains("[Script Info]") && + header.Contains("ScriptType: v4.00") && + !header.Contains("ScriptType: v4.00+")) + { + var sb = new StringBuilder(); + var scriptInfoOn = false; + foreach (var line in header.SplitToLines()) + { + if (line.RemoveChar(' ').Contains("Styles]", StringComparison.OrdinalIgnoreCase)) + { + break; + } + + if (line.Equals("[Script Info]", StringComparison.OrdinalIgnoreCase)) + { + scriptInfoOn = true; + } + + if (scriptInfoOn) + { + if (line.StartsWith("ScriptType:", StringComparison.OrdinalIgnoreCase)) + { + sb.AppendLine("ScriptType: v4.00+"); + } + else if (line.Equals("; This is a Sub Station Alpha v4 script.", StringComparison.OrdinalIgnoreCase)) + { + sb.AppendLine("; This is an Advanced Sub Station Alpha v4+ script."); + } + else + { + sb.AppendLine(line); + } + } + } + scriptInfo = sb.ToString(); + } + + var style = GetStyle(header); + + if (string.IsNullOrEmpty(scriptInfo) || string.IsNullOrEmpty(style)) + { + return DefaultHeader; + } + + return string.Format($@"{scriptInfo.Trim() + Environment.NewLine} +[V4+ Styles] +Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding +{style.Trim() + Environment.NewLine} +[Events]"); + } + + private static void LoadStylesFromSubstationAlpha(Subtitle subtitle, string title, string header, string headerNoStyles, StringBuilder sb) + { + try + { + var ttStyles = GetStyle(subtitle.Header); + if (!string.IsNullOrEmpty(ttStyles)) + { + sb.AppendLine(string.Format(headerNoStyles, title, ttStyles)); + subtitle.Header = sb.ToString(); + } + else + { + sb.AppendLine(string.Format(header, title)); + } + } + catch + { + sb.AppendLine(string.Format(header, title)); + } + } + + private static string GetStyle(string header) + { + var ttStyles = new StringBuilder(); + + // Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding + const string styleFormat = "Style: {0},{1},{2},{3},{4},{5},{6},{7},{8},{9},0,100,100,0,0,{10},{11},{12},{13},{14},{15},{16},1"; + foreach (var styleName in GetStylesFromHeader(header)) + { + try + { + var ssaStyle = GetSsaStyle(styleName, header); + + string bold = "0"; + if (ssaStyle.Bold) + { + bold = "-1"; + } + + string italic = "0"; + if (ssaStyle.Italic) + { + italic = "-1"; + } + + string underline = "0"; + if (ssaStyle.Underline) + { + underline = "-1"; + } + + string newAlignment = "2"; + switch (ssaStyle.Alignment) + { + case "1": + newAlignment = "1"; + break; + case "3": + newAlignment = "3"; + break; + case "9": + newAlignment = "4"; + break; + case "10": + newAlignment = "5"; + break; + case "11": + newAlignment = "6"; + break; + case "5": + newAlignment = "7"; + break; + case "6": + newAlignment = "8"; + break; + case "7": + newAlignment = "9"; + break; + } + + ttStyles.AppendLine(string.Format(styleFormat, ssaStyle.Name, ssaStyle.FontName, ssaStyle.FontSize, GetSsaColorString(ssaStyle.Primary), GetSsaColorString(ssaStyle.Secondary), + GetSsaColorString(ssaStyle.Outline), GetSsaColorString(ssaStyle.Background), bold, italic, underline, ssaStyle.BorderStyle, ssaStyle.OutlineWidth.ToString(CultureInfo.InvariantCulture), ssaStyle.ShadowWidth.ToString(CultureInfo.InvariantCulture), + newAlignment, ssaStyle.MarginLeft, ssaStyle.MarginRight, ssaStyle.MarginVertical)); + } + catch + { + // ignored + } + } + + return ttStyles.ToString(); + } + + public static void LoadStylesFromTimedText10(Subtitle subtitle, string title, string header, string headerNoStyles, StringBuilder sb) + { + foreach (Paragraph p in subtitle.Paragraphs) + { + p.Effect = null; + } + + try + { + var lines = subtitle.Header.SplitToLines(); + var tt = new TimedText10(); + var sub = new Subtitle(); + tt.LoadSubtitle(sub, lines, string.Empty); + + var xml = new XmlDocument(); + xml.LoadXml(subtitle.Header); + var nsmgr = new XmlNamespaceManager(xml.NameTable); + nsmgr.AddNamespace("ttml", "http://www.w3.org/ns/ttml"); + XmlNode head = xml.DocumentElement.SelectSingleNode("ttml:head", nsmgr); + int styleCount = 0; + var ttStyles = new StringBuilder(); + var styleNames = new List(); + foreach (XmlNode node in head.SelectNodes("//ttml:style", nsmgr)) + { + string name = null; + if (node.Attributes["xml:id"] != null) + { + name = node.Attributes["xml:id"].Value; + } + else if (node.Attributes["id"] != null) + { + name = node.Attributes["id"].Value; + } + + if (name != null) + { + styleCount++; + + string fontFamily = "Arial"; + if (node.Attributes["tts:fontFamily"]?.Value != null) + { + fontFamily = node.Attributes["tts:fontFamily"].Value; + if (fontFamily.Contains(",")) + { + fontFamily = fontFamily.Split(',')[0]; + } + } + + string fontWeight = "normal"; + if (node.Attributes["tts:fontWeight"] != null) + { + fontWeight = node.Attributes["tts:fontWeight"].Value; + } + + string fontStyle = "normal"; + if (node.Attributes["tts:fontStyle"] != null) + { + fontStyle = node.Attributes["tts:fontStyle"].Value; + } + + string color = "#ffffff"; + if (node.Attributes["tts:color"] != null) + { + color = node.Attributes["tts:color"].Value.Trim(); + } + + Color c = Color.White; + try + { + if (color.StartsWith("rgb(", StringComparison.Ordinal)) + { + string[] arr = color.Remove(0, 4).TrimEnd(')').Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + c = Color.FromArgb(int.Parse(arr[0]), int.Parse(arr[1]), int.Parse(arr[2])); + } + else + { + c = ColorTranslator.FromHtml(color); + } + } + catch + { + // ignored + } + + string fontSize = "20"; + if (node.Attributes["tts:fontSize"] != null) + { + fontSize = node.Attributes["tts:fontSize"].Value.Replace("px", string.Empty).Replace("em", string.Empty); + } + + if (!float.TryParse(fontSize, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var fSize)) + { + fSize = 20; + } + + string italic = "0"; + if (fontStyle == "italic") + { + italic = "-1"; + } + + string bold = "0"; + if (fontWeight == "bold") + { + bold = "-1"; + } + + const string styleFormat = "Style: {0},{1},{2},{3},&H0300FFFF,&H00000000,&H02000000,{4},{5},0,0,100,100,0,0,1,2,2,2,10,10,10,1"; + ttStyles.AppendLine(string.Format(styleFormat, name, fontFamily, fSize, GetSsaColorString(c), bold, italic)); + styleNames.Add(name); + } + } + + if (styleCount > 0) + { + if (!styleNames.Contains("Default") && !styleNames.Contains("default") && subtitle.Paragraphs.Any(pa => string.IsNullOrEmpty(pa.Extra))) + { + ttStyles = new StringBuilder(DefaultStyle + Environment.NewLine + ttStyles); + foreach (var paragraph in subtitle.Paragraphs) + { + if (string.IsNullOrEmpty(paragraph.Extra)) + { + paragraph.Extra = "Default"; + } + } + } + sb.AppendLine(string.Format(headerNoStyles, title, ttStyles)); + subtitle.Header = sb.ToString(); + } + else + { + sb.AppendLine(string.Format(header, title)); + } + + // Set correct style on paragraphs + foreach (Paragraph p in subtitle.Paragraphs) + { + if (p.Extra != null && p.Extra.Contains('/')) + { + p.Extra = p.Extra.Split('/')[0].Trim(); + } + } + } + catch + { + sb.AppendLine(string.Format(header, title)); + } + } + + public static void LoadStylesFromTimedTextTimedDraft2006Oct(Subtitle subtitle, string title, string header, string headerNoStyles, StringBuilder sb) + { + foreach (Paragraph p in subtitle.Paragraphs) + { + p.Effect = null; + } + + try + { + var lines = subtitle.Header.SplitToLines(); + var sb2 = new StringBuilder(); + lines.ForEach(line => sb2.AppendLine(line)); + var xml = new XmlDocument { XmlResolver = null }; + xml.LoadXml(sb2.ToString().Replace(" & ", " & ").Replace("Q&A", "Q&A").RemoveControlCharactersButWhiteSpace().Trim()); + subtitle.Header = xml.OuterXml; + var nsmgr = new XmlNamespaceManager(xml.NameTable); + nsmgr.AddNamespace("ttaf1", xml.DocumentElement.NamespaceURI); + int styleCount = 0; + var ttStyles = new StringBuilder(); + var styleNames = new List(); + foreach (XmlNode node in xml.DocumentElement.SelectNodes("//ttaf1:style", nsmgr)) + { + string name = null; + if (node.Attributes["xml:id"] != null) + { + name = node.Attributes["xml:id"].Value; + } + else if (node.Attributes["id"] != null) + { + name = node.Attributes["id"].Value; + } + + if (name != null) + { + styleCount++; + + string fontFamily = "Arial"; + if (node.Attributes["tts:fontFamily"]?.Value != null) + { + fontFamily = node.Attributes["tts:fontFamily"].Value; + if (fontFamily.Contains(",")) + { + fontFamily = fontFamily.Split(',')[0]; + } + } + + string fontWeight = "normal"; + if (node.Attributes["tts:fontWeight"] != null) + { + fontWeight = node.Attributes["tts:fontWeight"].Value; + } + + string fontStyle = "normal"; + if (node.Attributes["tts:fontStyle"] != null) + { + fontStyle = node.Attributes["tts:fontStyle"].Value; + } + + string color = "#ffffff"; + if (node.Attributes["tts:color"] != null) + { + color = node.Attributes["tts:color"].Value.Trim(); + } + + Color c = Color.White; + try + { + if (color.StartsWith("rgb(", StringComparison.Ordinal)) + { + string[] arr = color.Remove(0, 4).TrimEnd(')').Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + c = Color.FromArgb(int.Parse(arr[0]), int.Parse(arr[1]), int.Parse(arr[2])); + } + else + { + c = ColorTranslator.FromHtml(color); + } + } + catch + { + // ignored + } + + string fontSize = "20"; + if (node.Attributes["tts:fontSize"] != null) + { + fontSize = node.Attributes["tts:fontSize"].Value.Replace("px", string.Empty).Replace("em", string.Empty); + } + + if (!float.TryParse(fontSize, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var fSize)) + { + fSize = 20; + } + + string italic = "0"; + if (fontStyle == "italic") + { + italic = "-1"; + } + + string bold = "0"; + if (fontWeight == "bold") + { + bold = "-1"; + } + + const string styleFormat = "Style: {0},{1},{2},{3},&H0300FFFF,&H00000000,&H02000000,{4},{5},0,0,100,100,0,0,1,2,2,2,10,10,10,1"; + ttStyles.AppendLine(string.Format(styleFormat, name, fontFamily, fSize, GetSsaColorString(c), bold, italic)); + styleNames.Add(name); + } + } + + if (styleCount > 0) + { + if (!styleNames.Contains("Default") && !styleNames.Contains("default") && subtitle.Paragraphs.Any(pa => string.IsNullOrEmpty(pa.Extra))) + { + ttStyles = new StringBuilder(DefaultStyle + Environment.NewLine + ttStyles); + foreach (var paragraph in subtitle.Paragraphs) + { + if (string.IsNullOrEmpty(paragraph.Extra)) + { + paragraph.Extra = "Default"; + } + } + } + sb.AppendLine(string.Format(headerNoStyles, title, ttStyles)); + subtitle.Header = sb.ToString(); + } + else + { + sb.AppendLine(string.Format(header, title)); + } + + // Set correct style on paragraphs + foreach (Paragraph p in subtitle.Paragraphs) + { + if (p.Extra != null && p.Extra.Contains('/')) + { + p.Extra = p.Extra.Split('/')[0].Trim(); + } + } + } + catch + { + sb.AppendLine(string.Format(header, title)); + } + } + + public static List GetStylesFromHeader(string headerLines) + { + var list = new List(); + + if (headerLines == null) + { + headerLines = DefaultStyle; + } + + if (headerLines.Contains("http://www.w3.org/ns/ttml")) + { + var subtitle = new Subtitle { Header = headerLines }; + LoadStylesFromTimedText10(subtitle, string.Empty, headerLines, HeaderNoStyles, new StringBuilder()); + headerLines = subtitle.Header; + } + + foreach (string line in headerLines.SplitToLines()) + { + if (line.StartsWith("style:", StringComparison.OrdinalIgnoreCase)) + { + int end = line.IndexOf(','); + if (end > 0) + { + list.Add(line.Substring(6, end - 6).Trim()); + } + } + } + return list; + } + + public static string FormatText(Paragraph p) + { + string text = p.Text.Replace(Environment.NewLine, "\\N"); + + if (!text.Contains('<')) + { + return text; + } + + text = text.Replace("", @"{\i1}"); + text = text.Replace("", @"{\i0}"); + text = text.Replace("", @"{\i}"); + text = text.Replace("", @"{\u1}"); + text = text.Replace("", @"{\u0}"); + text = text.Replace("", @"{\u}"); + text = text.Replace("", @"{\b1}"); + text = text.Replace("", @"{\b0}"); + text = text.Replace("", @"{\b}"); + int count = 0; + while (text.Contains("', start); + if (end > 0) + { + string fontTag = text.Substring(start + 5, end - (start + 4)); + text = text.Remove(start, end - start + 1); + int indexOfEndFont = text.IndexOf("", start, StringComparison.Ordinal); + if (indexOfEndFont > 0) + { + text = text.Remove(indexOfEndFont, 7); + if (indexOfEndFont < text.Length) + { + if (fontTag.Contains(" size=")) + { + text = text.Insert(indexOfEndFont, "{\\fs}"); + } + if (fontTag.Contains(" face=")) + { + text = text.Insert(indexOfEndFont, "{\\fn}"); + } + if (fontTag.Contains(" color=")) + { + text = text.Insert(indexOfEndFont, "{\\c}"); + } + } + } + + fontTag = FormatTag(ref text, start, fontTag, "face=\"", "fn", "}"); + fontTag = FormatTag(ref text, start, fontTag, "face='", "fn", "}"); + fontTag = FormatTag(ref text, start, fontTag, "face=", "fn", "}"); + + fontTag = FormatTag(ref text, start, fontTag, "size=\"", "fs", "}"); + fontTag = FormatTag(ref text, start, fontTag, "size='", "fs", "}"); + fontTag = FormatTag(ref text, start, fontTag, "size=", "fs", "}"); + + fontTag = FormatTag(ref text, start, fontTag, "color=\"", "c&H", "&}"); + fontTag = FormatTag(ref text, start, fontTag, "color='", "c&H", "&}"); + FormatTag(ref text, start, fontTag, "color=", "c&H", "&}"); + } + count++; + } + text = text.Replace("{\\c}", "@___@@").Replace("}{", string.Empty).Replace("@___@@", "{\\c}").Replace("{\\c}{\\c&", "{\\c&"); + while (text.EndsWith("{\\c}", StringComparison.Ordinal)) + { + text = text.Remove(text.Length - 4); + } + while (text.Contains("\\fs\\fs", StringComparison.Ordinal)) + { + text = text.Replace("\\fs\\fs", "\\fs"); + } + while (text.Contains("\\fn\\fn", StringComparison.Ordinal)) + { + text = text.Replace("\\fn\\fn", "\\fn"); + } + while (text.Contains("\\c\\c&H", StringComparison.Ordinal)) + { + text = text.Replace("\\c\\c&H", "\\c&H"); + } + return text; + } + + private static string FormatTag(ref string text, int start, string fontTag, string tag, string ssaTagName, string endSsaTag) + { + if (fontTag.Contains(tag)) + { + int fontStart = fontTag.IndexOf(tag, StringComparison.Ordinal); + + int fontEnd = fontTag.IndexOfAny(new[] { '"', '\'' }, fontStart + tag.Length); + if (fontEnd < 0) + { + fontEnd = fontTag.IndexOfAny(new[] { ' ', '>' }, fontStart + tag.Length); + } + + if (fontEnd > 0) + { + string subTag = fontTag.Substring(fontStart + tag.Length, fontEnd - (fontStart + tag.Length)); + if (tag.Contains("color")) + { + Color c; + try + { + c = ColorTranslator.FromHtml(subTag); + } + catch + { + c = Color.White; + } + subTag = (c.B.ToString("X2") + c.G.ToString("X2") + c.R.ToString("X2")).ToLowerInvariant(); // use bbggrr + } + fontTag = fontTag.Remove(fontStart, fontEnd - fontStart + 1); + if (start < text.Length) + { + text = text.Insert(start, @"{\" + ssaTagName + subTag + endSsaTag); + } + } + } + return fontTag; + } + + public static string GetFormattedText(string input) + { + var text = input.Replace("\\N", Environment.NewLine).Replace("\\n", Environment.NewLine); + + var tooComplex = ContainsUnsupportedTags(text); + + if (!tooComplex) + { + for (int i = 0; i < 10; i++) // just look ten times... + { + bool italic; + if (text.Contains(@"{\fn")) + { + int start = text.IndexOf(@"{\fn", StringComparison.Ordinal); + int end = text.IndexOf('}', start); + if (end > 0 && !text.Substring(start).StartsWith("{\\fn}", StringComparison.Ordinal)) + { + string fontName = text.Substring(start + 4, end - (start + 4)); + string extraTags = string.Empty; + CheckAndAddSubTags(ref fontName, ref extraTags, out var unknownTags, out italic); + text = text.Remove(start, end - start + 1); + if (italic) + { + text = text.Insert(start, "" + unknownTags + ""); + } + else + { + text = text.Insert(start, "" + unknownTags); + } + + int indexOfEndTag = text.IndexOf("{\\fn}", start, StringComparison.Ordinal); + if (indexOfEndTag > 0) + { + text = text.Remove(indexOfEndTag, "{\\fn}".Length).Insert(indexOfEndTag, ""); + } + else + { + int indexOfNextTag1 = text.IndexOf("{\\fn", start, StringComparison.Ordinal); + int indexOfNextTag2 = text.IndexOf("{\\c}", start, StringComparison.Ordinal); + if (indexOfNextTag1 > 0) + { + text = text.Insert(indexOfNextTag1, ""); + } + else if (indexOfNextTag2 > 0 && text.IndexOf("{\\", start, StringComparison.Ordinal) >= indexOfNextTag2) + { + text = text.Insert(indexOfNextTag2, ""); + } + else + { + text += ""; + } + } + } + } + + if (text.Contains(@"{\fs")) + { + int start = text.IndexOf(@"{\fs", StringComparison.Ordinal); + int end = text.IndexOf('}', start); + if (end > 0 && !text.Substring(start).StartsWith("{\\fs}", StringComparison.Ordinal)) + { + string fontSize = text.Substring(start + 4, end - (start + 4)); + string extraTags = string.Empty; + CheckAndAddSubTags(ref fontSize, ref extraTags, out var unknownTags, out italic); + if (float.TryParse(fontSize, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out _)) + { + text = text.Remove(start, end - start + 1); + if (italic) + { + text = text.Insert(start, "" + unknownTags + ""); + } + else + { + text = text.Insert(start, "" + unknownTags); + } + + int indexOfEndTag = text.IndexOf("{\\fs}", start, StringComparison.Ordinal); + if (indexOfEndTag > 0) + { + text = text.Remove(indexOfEndTag, "{\\fs}".Length).Insert(indexOfEndTag, ""); + } + else + { + int indexOfNextTag1 = text.IndexOf("{\\fs", start, StringComparison.Ordinal); + int indexOfNextTag2 = text.IndexOf("{\\c}", start, StringComparison.Ordinal); + if (indexOfNextTag1 > 0) + { + text = text.Insert(indexOfNextTag1, ""); + } + else if (indexOfNextTag2 > 0 && text.IndexOf("{\\", start, StringComparison.Ordinal) >= indexOfNextTag2) + { + text = text.Insert(indexOfNextTag2, ""); + } + else + { + text += ""; + } + } + } + } + } + + if (text.Contains(@"{\c")) + { + int start = text.IndexOf(@"{\c", StringComparison.Ordinal); + int end = text.IndexOf('}', start); + if (end > 0 && !text.Substring(start).StartsWith("{\\c}", StringComparison.Ordinal) && !text.Substring(start).StartsWith("{\\clip", StringComparison.Ordinal)) + { + string color = text.Substring(start + 4, end - (start + 4)); + string extraTags = string.Empty; + CheckAndAddSubTags(ref color, ref extraTags, out var unknownTags, out italic); + + color = color.RemoveChar('&').TrimStart('H'); + color = color.PadLeft(6, '0'); + + // switch to rrggbb from bbggrr + color = "#" + color.Remove(color.Length - 6) + color.Substring(color.Length - 2, 2) + color.Substring(color.Length - 4, 2) + color.Substring(color.Length - 6, 2); + color = color.ToLowerInvariant(); + + text = text.Remove(start, end - start + 1); + if (italic) + { + text = text.Insert(start, "" + unknownTags + ""); + } + else + { + text = text.Insert(start, "" + unknownTags); + } + + int indexOfEndTag = text.IndexOf("{\\c}", start, StringComparison.Ordinal); + int indexOfNextColorTag = text.IndexOf("{\\c&", start, StringComparison.Ordinal); + if (indexOfNextColorTag > 0 && (indexOfNextColorTag < indexOfEndTag || indexOfEndTag == -1)) + { + text = text.Insert(indexOfNextColorTag, ""); + } + else if (indexOfEndTag > 0) + { + text = text.Remove(indexOfEndTag, "{\\c}".Length).Insert(indexOfEndTag, ""); + } + else + { + text += ""; + } + } + } + + if (text.Contains(@"{\1c")) // "1" specifices primary color + { + int start = text.IndexOf(@"{\1c", StringComparison.Ordinal); + int end = text.IndexOf('}', start); + if (end > 0 && !text.Substring(start).StartsWith("{\\1c}", StringComparison.Ordinal)) + { + string color = text.Substring(start + 5, end - (start + 5)); + string extraTags = string.Empty; + CheckAndAddSubTags(ref color, ref extraTags, out var unknownTags, out italic); + + color = color.RemoveChar('&').TrimStart('H'); + color = color.PadLeft(6, '0'); + + // switch to rrggbb from bbggrr + color = "#" + color.Remove(color.Length - 6) + color.Substring(color.Length - 2, 2) + color.Substring(color.Length - 4, 2) + color.Substring(color.Length - 6, 2); + color = color.ToLowerInvariant(); + + text = text.Remove(start, end - start + 1); + if (italic) + { + text = text.Insert(start, "" + unknownTags + ""); + } + else + { + text = text.Insert(start, "" + unknownTags); + } + + text += ""; + } + } + } + } + + text = text.Replace(@"{\i1}", ""); + text = text.Replace(@"{\i0}", ""); + text = text.Replace(@"{\i}", ""); + if (Utilities.CountTagInText(text, "") > Utilities.CountTagInText(text, "")) + { + text += ""; + } + + text = text.Replace(@"{\u1}", ""); + text = text.Replace(@"{\u0}", ""); + text = text.Replace(@"{\u}", ""); + if (Utilities.CountTagInText(text, "") > Utilities.CountTagInText(text, "")) + { + text += ""; + } + + text = text.Replace(@"{\b1}", ""); + text = text.Replace(@"{\b0}", ""); + text = text.Replace(@"{\b}", ""); + if (Utilities.CountTagInText(text, "") > Utilities.CountTagInText(text, "")) + { + text += ""; + } + + return text; + } + + private static bool ContainsUnsupportedTags(string text) + { + if (string.IsNullOrEmpty(text) || !text.Contains("{\\", StringComparison.OrdinalIgnoreCase)) + { + return false; + } + + var unsupportedTags = new List + { + "\\alpha", + "\\be0", + "\\be1", + "\\bord", + "\\blur", + "\\clip", + "\\fad", + "\\fa", + "\\fade", + "\\fscx", + "\\fscy", + "\\fr", + "\\iclip", + "\\k", + "\\K", + "\\kf", + "\\ko", + "\\move", + "\\org", + "\\p", + "\\pos", + "\\s0", + "\\s1", + "\\t(", + "\\xbord", + "\\ybord", + "\\xshad", + "\\yshad" + }; + + foreach (var unsupportedTag in unsupportedTags) + { + if (text.Contains(unsupportedTag, StringComparison.Ordinal)) + { + return true; + } + } + + return false; + } + + private static void CheckAndAddSubTags(ref string tagName, ref string extraTags, out string unknownTags, out bool italic) + { + italic = false; + unknownTags = string.Empty; + int indexOfSPlit = tagName.IndexOf('\\'); + if (indexOfSPlit > 0) + { + string rest = tagName.Substring(indexOfSPlit).TrimStart('\\'); + tagName = tagName.Remove(indexOfSPlit); + + for (int i = 0; i < 10; i++) + { + if (rest.StartsWith("fs", StringComparison.Ordinal) && rest.Length > 2) + { + indexOfSPlit = rest.IndexOf('\\'); + string fontSize = rest; + if (indexOfSPlit > 0) + { + fontSize = rest.Substring(0, indexOfSPlit); + rest = rest.Substring(indexOfSPlit).TrimStart('\\'); + } + else + { + rest = string.Empty; + } + extraTags += " size=\"" + fontSize.Substring(2) + "\""; + } + else if (rest.StartsWith("fn", StringComparison.Ordinal) && rest.Length > 2) + { + indexOfSPlit = rest.IndexOf('\\'); + string fontName = rest; + if (indexOfSPlit > 0) + { + fontName = rest.Substring(0, indexOfSPlit); + rest = rest.Substring(indexOfSPlit).TrimStart('\\'); + } + else + { + rest = string.Empty; + } + extraTags += " face=\"" + fontName.Substring(2) + "\""; + } + else if (rest.StartsWith('c') && rest.Length > 2) + { + indexOfSPlit = rest.IndexOf('\\'); + string fontColor = rest; + if (indexOfSPlit > 0) + { + fontColor = rest.Substring(0, indexOfSPlit); + rest = rest.Substring(indexOfSPlit).TrimStart('\\'); + } + else + { + rest = string.Empty; + } + + string color = fontColor.Substring(2); + color = color.RemoveChar('&').TrimStart('H'); + color = color.PadLeft(6, '0'); + // switch to rrggbb from bbggrr + color = "#" + color.Remove(color.Length - 6) + color.Substring(color.Length - 2, 2) + color.Substring(color.Length - 4, 2) + color.Substring(color.Length - 6, 2); + color = color.ToLowerInvariant(); + + extraTags += " color=\"" + color + "\""; + } + else if (rest.StartsWith("i1", StringComparison.Ordinal) && rest.Length > 1) + { + indexOfSPlit = rest.IndexOf('\\'); + italic = true; + if (indexOfSPlit > 0) + { + rest = rest.Substring(indexOfSPlit).TrimStart('\\'); + } + else + { + rest = string.Empty; + } + } + else if (rest.Length > 0 && rest.Contains("\\")) + { + indexOfSPlit = rest.IndexOf('\\'); + var unknowntag = rest.Substring(0, indexOfSPlit); + unknownTags += "\\" + unknowntag; + rest = rest.Substring(indexOfSPlit).TrimStart('\\'); + } + else if (!string.IsNullOrEmpty(rest)) + { + unknownTags += "\\" + rest; + rest = string.Empty; + } + } + } + if (!string.IsNullOrEmpty(unknownTags)) + { + unknownTags = "{" + unknownTags + "}"; + } + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + Errors = null; + bool eventsStarted = false; + bool fontsStarted = false; + bool graphicsStarted = false; + subtitle.Paragraphs.Clear(); + + // Layer, Start, End, Style, Actor, MarginL, MarginR, MarginV, Effect, Text + int indexLayer = 0; + int indexStart = 1; + int indexEnd = 2; + int indexStyle = 3; + int indexActor = -1; // convert "Actor" to "Nam" (if no "Name") + int indexName = 4; + int indexMarginL = 5; + int indexMarginR = 6; + int indexMarginV = 7; + int indexEffect = 8; + int indexText = 9; + var errors = new StringBuilder(); + int lineNumber = 0; + + var header = new StringBuilder(); + var footer = new StringBuilder(); + foreach (string line in lines) + { + lineNumber++; + if (!eventsStarted && !fontsStarted && !graphicsStarted && + !line.Trim().Equals("[fonts]", StringComparison.InvariantCultureIgnoreCase) && + !line.Trim().Equals("[graphics]", StringComparison.InvariantCultureIgnoreCase)) + { + header.AppendLine(line); + } + + if (string.IsNullOrWhiteSpace(line) || line.TrimStart().StartsWith(';')) + { + // skip empty and comment lines + } + else if (line.TrimStart().StartsWith("dialog:", StringComparison.OrdinalIgnoreCase) || line.TrimStart().StartsWith("dialogue:", StringComparison.OrdinalIgnoreCase)) // fix faulty font tags... + { + eventsStarted = true; + fontsStarted = false; + graphicsStarted = false; + } + + if (line.Trim().Equals("[events]", StringComparison.OrdinalIgnoreCase)) + { + if (header.ToString().IndexOf(Environment.NewLine + "[events]", StringComparison.OrdinalIgnoreCase) < 0) + { + var h = header.ToString().TrimEnd(); + header.Clear(); + header.AppendLine(h); + header.AppendLine(); + header.AppendLine("[Events]"); + } + eventsStarted = true; + fontsStarted = false; + graphicsStarted = false; + } + else if (line.Trim().Equals("[fonts]", StringComparison.OrdinalIgnoreCase)) + { + eventsStarted = false; + fontsStarted = true; + graphicsStarted = false; + footer.AppendLine(); + footer.AppendLine("[Fonts]"); + } + else if (line.Trim().Equals("[graphics]", StringComparison.OrdinalIgnoreCase)) + { + eventsStarted = false; + fontsStarted = false; + graphicsStarted = true; + footer.AppendLine(); + footer.AppendLine("[Graphics]"); + } + else if (line.Trim().Equals("[Aegisub Extradata]", StringComparison.OrdinalIgnoreCase)) + { + eventsStarted = false; + fontsStarted = false; + graphicsStarted = true; + footer.AppendLine(); + footer.AppendLine("[Aegisub Extradata]"); + } + else if (fontsStarted) + { + footer.AppendLine(line); + } + else if (graphicsStarted) + { + footer.AppendLine(line); + } + else if (eventsStarted) + { + string s = line.Trim().ToLowerInvariant(); + if (line.Length > 10 && s.StartsWith("format:", StringComparison.Ordinal)) + { + indexLayer = -1; + indexStart = -1; + indexEnd = -1; + indexStyle = -1; + indexActor = -1; + indexName = -1; + indexMarginL = -1; + indexMarginR = -1; + indexMarginV = -1; + indexEffect = -1; + indexText = -1; + + var format = s.Substring(8).Split(','); + for (int i = 0; i < format.Length; i++) + { + var formatTrimmed = format[i].Trim(); + if (formatTrimmed.Equals("start", StringComparison.Ordinal)) + { + indexStart = i; + } + else if (formatTrimmed.Equals("end", StringComparison.Ordinal)) + { + indexEnd = i; + } + else if (formatTrimmed.Equals("text", StringComparison.Ordinal)) + { + indexText = i; + } + else if (formatTrimmed.Equals("style", StringComparison.Ordinal)) + { + indexStyle = i; + } + else if (formatTrimmed.Equals("actor", StringComparison.Ordinal)) + { + indexActor = i; + } + else if (formatTrimmed.Equals("name", StringComparison.Ordinal)) + { + indexName = i; + } + else if (formatTrimmed.Equals("marginl", StringComparison.Ordinal)) + { + indexMarginL = i; + } + else if (formatTrimmed.Equals("marginr", StringComparison.Ordinal)) + { + indexMarginR = i; + } + else if (formatTrimmed.Equals("marginv", StringComparison.Ordinal)) + { + indexMarginV = i; + } + else if (formatTrimmed.Equals("effect", StringComparison.Ordinal)) + { + indexEffect = i; + } + else if (formatTrimmed.Equals("layer", StringComparison.Ordinal)) + { + indexLayer = i; + } + } + } + else if (!string.IsNullOrEmpty(s)) + { + var text = string.Empty; + var start = string.Empty; + var end = string.Empty; + var style = string.Empty; + var actor = string.Empty; + var marginL = string.Empty; + var marginR = string.Empty; + var marginV = string.Empty; + var effect = string.Empty; + var layer = 0; + + string[] splittedLine; + if (s.StartsWith("dialog:", StringComparison.Ordinal)) + { + splittedLine = line.Remove(0, 7).Split(','); + } + else if (s.StartsWith("dialogue:", StringComparison.Ordinal)) + { + splittedLine = line.Remove(0, 9).Split(','); + } + else + { + splittedLine = line.Split(','); + } + + for (int i = 0; i < splittedLine.Length; i++) + { + if (i == indexStart) + { + start = splittedLine[i].Trim(); + } + else if (i == indexEnd) + { + end = splittedLine[i].Trim(); + } + else if (i == indexStyle) + { + style = splittedLine[i].Trim(); + } + else if (i == indexActor && indexName == -1) + { + actor = splittedLine[i].Trim(); + } + else if (i == indexName) + { + actor = splittedLine[i].Trim(); + } + else if (i == indexMarginL) + { + marginL = splittedLine[i].Trim(); + } + else if (i == indexMarginR) + { + marginR = splittedLine[i].Trim(); + } + else if (i == indexMarginV) + { + marginV = splittedLine[i].Trim(); + } + else if (i == indexEffect) + { + effect = splittedLine[i].Trim(); + } + else if (i == indexLayer) + { + int.TryParse(splittedLine[i].Replace("Comment:", string.Empty).Trim(), out layer); + } + else if (i == indexText) + { + text = splittedLine[i]; + } + else if (i > indexText) + { + text += "," + splittedLine[i]; + } + } + + try + { + var p = new Paragraph + { + StartTime = GetTimeCodeFromString(start), + EndTime = GetTimeCodeFromString(end), + Text = GetFormattedText(text) + }; + + if (!string.IsNullOrEmpty(style)) + { + p.Extra = style; + } + + if (!string.IsNullOrEmpty(actor)) + { + p.Actor = actor; + } + + if (!string.IsNullOrEmpty(marginL)) + { + p.MarginL = marginL; + } + + if (!string.IsNullOrEmpty(marginR)) + { + p.MarginR = marginR; + } + + if (!string.IsNullOrEmpty(marginV)) + { + p.MarginV = marginV; + } + + if (!string.IsNullOrEmpty(effect)) + { + p.Effect = effect; + } + + p.Layer = layer; + p.IsComment = s.StartsWith("comment:", StringComparison.Ordinal); + subtitle.Paragraphs.Add(p); + } + catch + { + _errorCount++; + if (errors.Length < 2000) + { + errors.AppendLine(string.Format(Configuration.Settings.Language.Main.LineNumberXErrorReadingTimeCodeFromSourceLineY, lineNumber, line)); + } + else if (subtitle.Paragraphs.Count == 0) + { + break; + } + } + } + } + } + if (header.Length > 0) + { + subtitle.Header = header.ToString(); + } + + if (footer.Length > 0) + { + subtitle.Footer = footer.ToString().Trim(); + } + + subtitle.Renumber(); + Errors = errors.ToString(); + } + + private static TimeCode GetTimeCodeFromString(string time) + { + // h:mm:ss.cc + string[] timeCode = time.Split(':', '.'); + return new TimeCode(int.Parse(timeCode[0]), + int.Parse(timeCode[1]), + int.Parse(timeCode[2]), + int.Parse(timeCode[3]) * 10); + } + + public override void RemoveNativeFormatting(Subtitle subtitle, SubtitleFormat newFormat) + { + if (newFormat != null && newFormat.Name == SubStationAlpha.NameOfFormat) + { + foreach (var p in subtitle.Paragraphs) + { + string s = p.Text; + + if (s.Contains('{') && s.Contains('}')) + { + var p1Index = s.IndexOf("\\p1", StringComparison.Ordinal); + var p0Index = s.IndexOf("{\\p0}", StringComparison.Ordinal); + if (p1Index > 0 && (p0Index > p1Index || p0Index == -1)) + { + var startTagIndex = s.Substring(0, p1Index).LastIndexOf('{'); + if (startTagIndex >= 0) + { + if (p0Index > p1Index) + { + s = s.Remove(startTagIndex, p0Index - startTagIndex + "{\\p0}".Length); + } + else + { + s = s.Remove(startTagIndex); + } + } + } + + var karaokeStart = s.IndexOf("{Kara Effector", StringComparison.Ordinal); + if (karaokeStart >= 0) + { + int l = s.IndexOf('}', karaokeStart + 1); + if (l < karaokeStart) + { + break; + } + + s = s.Remove(karaokeStart, l - karaokeStart + 1); + } + + s = s.Replace(@"\u0", string.Empty); + s = s.Replace(@"\u1", string.Empty); + s = s.Replace(@"\s0", string.Empty); + s = s.Replace(@"\s1", string.Empty); + s = s.Replace(@"\be0", string.Empty); + s = s.Replace(@"\be1", string.Empty); + + s = RemoveTag(s, "shad"); + s = RemoveTag(s, "fsc"); + s = RemoveTag(s, "fsp"); + s = RemoveTag(s, "fr"); + + s = RemoveTag(s, "t("); + s = RemoveTag(s, "move("); + s = RemoveTag(s, "Position("); + s = RemoveTag(s, "org("); + s = RemoveTag(s, "fade("); + s = RemoveTag(s, "fad("); + s = RemoveTag(s, "clip("); + s = RemoveTag(s, "iclip("); + s = RemoveTag(s, "pbo("); + s = RemoveTag(s, "bord"); + s = RemoveTag(s, "pos"); + + // TODO: Alignment tags + + s = s.Replace("{}", string.Empty); + + p.Text = s; + } + } + } + else + { + foreach (var p in subtitle.Paragraphs) + { + var noTags = Utilities.RemoveSsaTags(p.Text).Trim(); + if (noTags.Length == 0) + { + p.Text = string.Empty; + continue; + } + + p.Text = p.Text.Replace("\\n", Environment.NewLine); // Soft line break + p.Text = p.Text.Replace("\\N", Environment.NewLine); // Hard line break + p.Text = p.Text.Replace("\\h", " "); // Hard space + + if (noTags.StartsWith("m ", StringComparison.Ordinal)) + { + var test = noTags.Remove(0, 2) + .RemoveChar('0') + .RemoveChar('1') + .RemoveChar('2') + .RemoveChar('3') + .RemoveChar('4') + .RemoveChar('5') + .RemoveChar('6') + .RemoveChar('7') + .RemoveChar('8') + .RemoveChar('9') + .RemoveChar('-') + .RemoveChar('l') + .RemoveChar('m') + .RemoveChar(' ') + .RemoveChar('.'); + if (test.Length == 0) + { + p.Text = string.Empty; + continue; + } + } + + int indexOfBegin = p.Text.IndexOf('{'); + string pre = string.Empty; + while (indexOfBegin >= 0 && p.Text.IndexOf('}') > indexOfBegin) + { + string s = p.Text.Substring(indexOfBegin); + if (s.StartsWith("{\\an1}", StringComparison.Ordinal) || + s.StartsWith("{\\an2}", StringComparison.Ordinal) || + s.StartsWith("{\\an3}", StringComparison.Ordinal) || + s.StartsWith("{\\an4}", StringComparison.Ordinal) || + s.StartsWith("{\\an5}", StringComparison.Ordinal) || + s.StartsWith("{\\an6}", StringComparison.Ordinal) || + s.StartsWith("{\\an7}", StringComparison.Ordinal) || + s.StartsWith("{\\an8}", StringComparison.Ordinal) || + s.StartsWith("{\\an9}", StringComparison.Ordinal)) + { + pre = s.Substring(0, 6); + } + else if (s.StartsWith("{\\an1\\", StringComparison.Ordinal) || + s.StartsWith("{\\an2\\", StringComparison.Ordinal) || + s.StartsWith("{\\an3\\", StringComparison.Ordinal) || + s.StartsWith("{\\an4\\", StringComparison.Ordinal) || + s.StartsWith("{\\an5\\", StringComparison.Ordinal) || + s.StartsWith("{\\an6\\", StringComparison.Ordinal) || + s.StartsWith("{\\an7\\", StringComparison.Ordinal) || + s.StartsWith("{\\an8\\", StringComparison.Ordinal) || + s.StartsWith("{\\an9\\", StringComparison.Ordinal)) + { + pre = s.Substring(0, 5) + "}"; + } + int indexOfEnd = p.Text.IndexOf('}'); + p.Text = p.Text.Remove(indexOfBegin, indexOfEnd - indexOfBegin + 1); + + indexOfBegin = p.Text.IndexOf('{'); + } + p.Text = pre + p.Text; + } + } + } + + private static string RemoveTag(string s, string tag) + { + int indexOfTag = s.IndexOf(@"\" + tag, StringComparison.Ordinal); + if (indexOfTag > 0) + { + var endIndex1 = s.IndexOf('\\', indexOfTag + 1); + var endIndex2 = s.IndexOf('}', indexOfTag + 1); + endIndex1 = Math.Min(endIndex1, endIndex2); + if (endIndex1 > 0) + { + return s.Remove(indexOfTag, endIndex1 - indexOfTag); + } + } + return s; + } + + /// + /// BGR color like this: &HBBGGRR& (where BB, GG, and RR are hex values in uppercase) + /// + /// Input string + /// Default color + /// Input string as color, or default color if problems + public static Color GetSsaColor(string f, Color defaultColor) + { + //Red = &H0000FF& + //Green = &H00FF00& + //Blue = &HFF0000& + //White = &HFFFFFF& + //Black = &H000000& + string s = f.Trim().Trim('&'); + + if (s.StartsWith('h') && s.Length < 7) + { + while (s.Length < 7) + { + s = s.Insert(1, "0"); + } + } + + if (s.StartsWith('h') && s.Length == 7) + { + s = s.Substring(1); + string hexColor = "#" + s.Substring(4, 2) + s.Substring(2, 2) + s.Substring(0, 2); + try + { + return ColorTranslator.FromHtml(hexColor); + } + catch + { + return defaultColor; + } + } + if (s.StartsWith('h') && s.Length == 9) + { + if (int.TryParse(s.Substring(1, 2), NumberStyles.HexNumber, null, out var alpha)) + { + alpha = 255 - alpha; // ASS stores alpha in reverse (0=full itentity and 255=fully transparent) + } + else + { + alpha = 255; // full color + } + s = s.Substring(3); + string hexColor = "#" + s.Substring(4, 2) + s.Substring(2, 2) + s.Substring(0, 2); + try + { + var c = ColorTranslator.FromHtml(hexColor); + return Color.FromArgb(alpha, c); + } + catch + { + return defaultColor; + } + } + + if (int.TryParse(f, out var number)) + { + var temp = Color.FromArgb(number); + return Color.FromArgb(255, temp.B, temp.G, temp.R); + } + return defaultColor; + } + + public static string GetSsaColorString(Color c) + { + return $"&H{255 - c.A:X2}{c.B:X2}{c.G:X2}{c.R:X2}"; // ASS stores alpha in reverse (0=full itentity and 255=fully transparent) + } + + public static string CheckForErrors(string header) + { + if (string.IsNullOrEmpty(header)) + { + return string.Empty; + } + + var sb = new StringBuilder(); + + int styleCount = -1; + + int nameIndex = -1; + int fontNameIndex = -1; + int fontsizeIndex = -1; + int primaryColourIndex = -1; + int secondaryColourIndex = -1; + int outlineColourIndex = -1; + int backColourIndex = -1; + int boldIndex = -1; + int italicIndex = -1; + int underlineIndex = -1; + int outlineIndex = -1; + int shadowIndex = -1; + int alignmentIndex = -1; + int marginLIndex = -1; + int marginRIndex = -1; + int marginVIndex = -1; + int borderStyleIndex = -1; + + foreach (string line in header.SplitToLines()) + { + string s = line.Trim().ToLowerInvariant(); + if (s.StartsWith("format:", StringComparison.Ordinal)) + { + if (line.Length > 10) + { + var format = line.Substring(8).ToLowerInvariant().Split(','); + styleCount = format.Length; + for (int i = 0; i < format.Length; i++) + { + string f = format[i].Trim(); + if (f == "name") + { + nameIndex = i; + } + else if (f == "fontname") + { + fontNameIndex = i; + } + else if (f == "fontsize") + { + fontsizeIndex = i; + } + else if (f == "primarycolour") + { + primaryColourIndex = i; + } + else if (f == "secondarycolour") + { + secondaryColourIndex = i; + } + else if (f == "outlinecolour") + { + outlineColourIndex = i; + } + else if (f == "backcolour") + { + backColourIndex = i; + } + else if (f == "bold") + { + boldIndex = i; + } + else if (f == "italic") + { + italicIndex = i; + } + else if (f == "underline") + { + underlineIndex = i; + } + else if (f == "outline") + { + outlineIndex = i; + } + else if (f == "shadow") + { + shadowIndex = i; + } + else if (f == "alignment") + { + alignmentIndex = i; + } + else if (f == "marginl") + { + marginLIndex = i; + } + else if (f == "marginr") + { + marginRIndex = i; + } + else if (f == "marginv") + { + marginVIndex = i; + } + else if (f == "borderstyle") + { + borderStyleIndex = i; + } + } + } + } + else if (s.RemoveChar(' ').StartsWith("style:", StringComparison.Ordinal)) + { + if (line.Length > 10) + { + string rawLine = line; + var format = line.Substring(6).Split(','); + + if (format.Length != styleCount) + { + sb.AppendLine("Number of expected Style elements do not match number of Format elements: " + rawLine); + sb.AppendLine(); + } + else + { + var dummyColor = Color.FromArgb(9, 14, 16, 26); + for (int i = 0; i < format.Length; i++) + { + string f = format[i].Trim().ToLowerInvariant(); + if (i == nameIndex) + { + if (f.Length == 0) + { + sb.AppendLine("'Name' is empty: " + rawLine); + sb.AppendLine(); + } + } + else if (i == fontNameIndex) + { + if (f.Length == 0) + { + sb.AppendLine("'Fontname' is empty: " + rawLine); + sb.AppendLine(); + } + } + else if (i == fontsizeIndex) + { + if (!float.TryParse(f, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out _) || f.StartsWith('-')) + { + sb.AppendLine("'Fontsize' incorrect: " + rawLine); + sb.AppendLine(); + } + } + else if (i == primaryColourIndex) + { + if (GetSsaColor(f, dummyColor) == dummyColor || f == "&h") + { + sb.AppendLine("'PrimaryColour' incorrect: " + rawLine); + sb.AppendLine(); + } + } + else if (i == secondaryColourIndex) + { + if (GetSsaColor(f, dummyColor) == dummyColor) + { + sb.AppendLine("'SecondaryColour' incorrect: " + rawLine); + sb.AppendLine(); + } + } + else if (i == outlineColourIndex) + { + if (GetSsaColor(f, dummyColor) == dummyColor) + { + sb.AppendLine("'OutlineColour' incorrect: " + rawLine); + sb.AppendLine(); + } + } + else if (i == backColourIndex) + { + if (GetSsaColor(f, dummyColor) == dummyColor) + { + sb.AppendLine("'BackColour' incorrect: " + rawLine); + sb.AppendLine(); + } + } + else if (i == boldIndex) + { + if (Utilities.AllLetters.Contains(f)) + { + sb.AppendLine("'Bold' incorrect: " + rawLine); + sb.AppendLine(); + } + } + else if (i == italicIndex) + { + if (Utilities.AllLetters.Contains(f)) + { + sb.AppendLine("'Italic' incorrect: " + rawLine); + sb.AppendLine(); + } + } + else if (i == underlineIndex) + { + if (Utilities.AllLetters.Contains(f)) + { + sb.AppendLine("'Underline' incorrect: " + rawLine); + sb.AppendLine(); + } + } + else if (i == outlineIndex) + { + if (!float.TryParse(f, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out _) || f.StartsWith('-')) + { + sb.AppendLine("'Outline' (width) incorrect: " + rawLine); + sb.AppendLine(); + } + } + else if (i == shadowIndex) + { + if (!float.TryParse(f, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out _) || f.StartsWith('-')) + { + sb.AppendLine("'Shadow' (width) incorrect: " + rawLine); + sb.AppendLine(); + } + } + else if (i == alignmentIndex) + { + if (!"101123456789 ".Contains(f)) + { + sb.AppendLine("'Alignment' incorrect: " + rawLine); + sb.AppendLine(); + } + } + else if (i == marginLIndex) + { + if (!int.TryParse(f, out _) || f.StartsWith('-')) + { + sb.AppendLine("'MarginL' incorrect: " + rawLine); + sb.AppendLine(); + } + } + else if (i == marginRIndex) + { + if (!int.TryParse(f, out _) || f.StartsWith('-')) + { + sb.AppendLine("'MarginR' incorrect: " + rawLine); + sb.AppendLine(); + } + } + else if (i == marginVIndex) + { + if (!int.TryParse(f, out _) || f.StartsWith('-')) + { + sb.AppendLine("'MarginV' incorrect: " + rawLine); + sb.AppendLine(); + } + } + else if (i == borderStyleIndex) + { + if (f.Length != 0 && !"123".Contains(f)) + { + sb.AppendLine("'BorderStyle' incorrect: " + rawLine); + sb.AppendLine(); + } + } + } + } + } + } + } + return sb.ToString(); + } + + /// + /// Add new style to ASS header + /// + /// Header with new style + public static string AddSsaStyle(SsaStyle style, string inputHeader) + { + var header = inputHeader; + if (string.IsNullOrEmpty(header)) + { + header = DefaultHeader; + } + + var sb = new StringBuilder(); + bool stylesStarted = false; + bool styleAdded = false; + string styleFormat = "Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding"; + foreach (string line in header.SplitToLines()) + { + if (line.Equals("[V4+ Styles]", StringComparison.OrdinalIgnoreCase) || line.Equals("[V4 Styles]", StringComparison.OrdinalIgnoreCase)) + { + stylesStarted = true; + } + + if (line.StartsWith("format:", StringComparison.OrdinalIgnoreCase)) + { + styleFormat = line; + } + + if (!line.StartsWith("Style: " + style.Name + ",", StringComparison.Ordinal)) // overwrite existing style + { + sb.AppendLine(line); + } + + if (!styleAdded && stylesStarted && line.TrimStart().StartsWith("style:", StringComparison.OrdinalIgnoreCase)) + { + sb.AppendLine(style.ToRawAss(styleFormat)); + styleAdded = true; + } + } + return sb.ToString(); + } + + public static SsaStyle GetSsaStyle(string styleName, string header) + { + var style = new SsaStyle { Name = styleName }; + + int nameIndex = -1; + int fontNameIndex = -1; + int fontsizeIndex = -1; + int primaryColourIndex = -1; + int secondaryColourIndex = -1; + int tertiaryColourIndex = -1; + int outlineColourIndex = -1; + int backColourIndex = -1; + int boldIndex = -1; + int italicIndex = -1; + int underlineIndex = -1; + int outlineIndex = -1; + int shadowIndex = -1; + int alignmentIndex = -1; + int marginLIndex = -1; + int marginRIndex = -1; + int marginVIndex = -1; + int borderStyleIndex = -1; + + if (header == null) + { + header = DefaultHeader; + } + + foreach (string line in header.SplitToLines()) + { + string s = line.Trim().ToLowerInvariant(); + if (s.StartsWith("format:", StringComparison.Ordinal)) + { + if (line.Length > 10) + { + var format = line.ToLowerInvariant().Substring(8).Split(','); + for (int i = 0; i < format.Length; i++) + { + string f = format[i].Trim().ToLowerInvariant(); + if (f == "name") + { + nameIndex = i; + } + else if (f == "fontname") + { + fontNameIndex = i; + } + else if (f == "fontsize") + { + fontsizeIndex = i; + } + else if (f == "primarycolour") + { + primaryColourIndex = i; + } + else if (f == "secondarycolour") + { + secondaryColourIndex = i; + } + else if (f == "tertiarycolour") + { + tertiaryColourIndex = i; + } + else if (f == "outlinecolour") + { + outlineColourIndex = i; + } + else if (f == "backcolour") + { + backColourIndex = i; + } + else if (f == "bold") + { + boldIndex = i; + } + else if (f == "italic") + { + italicIndex = i; + } + else if (f == "underline") + { + underlineIndex = i; + } + else if (f == "outline") + { + outlineIndex = i; + } + else if (f == "shadow") + { + shadowIndex = i; + } + else if (f == "alignment") + { + alignmentIndex = i; + } + else if (f == "marginl") + { + marginLIndex = i; + } + else if (f == "marginr") + { + marginRIndex = i; + } + else if (f == "marginv") + { + marginVIndex = i; + } + else if (f == "borderstyle") + { + borderStyleIndex = i; + } + } + } + } + else if (s.RemoveChar(' ').StartsWith("style:", StringComparison.Ordinal)) + { + if (line.Length > 10) + { + style.RawLine = line; + var format = line.Substring(6).Split(','); + for (int i = 0; i < format.Length; i++) + { + string f = format[i].Trim().ToLowerInvariant(); + if (i == nameIndex) + { + style.Name = format[i].Trim(); + } + else if (i == fontNameIndex) + { + style.FontName = f; + } + else if (i == fontsizeIndex) + { + if (float.TryParse(f, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var fOut)) + { + style.FontSize = fOut; + } + } + else if (i == primaryColourIndex) + { + style.Primary = GetSsaColor(f, Color.White); + } + else if (i == secondaryColourIndex) + { + style.Secondary = GetSsaColor(f, Color.Yellow); + } + else if (i == tertiaryColourIndex) + { + style.Tertiary = GetSsaColor(f, Color.Yellow); + } + else if (i == outlineColourIndex) + { + style.Outline = GetSsaColor(f, Color.Black); + } + else if (i == backColourIndex) + { + style.Background = GetSsaColor(f, Color.Black); + } + else if (i == boldIndex) + { + style.Bold = f == "-1" || f == "1"; + } + else if (i == italicIndex) + { + style.Italic = f == "-1" || f == "1"; + } + else if (i == underlineIndex) + { + style.Underline = f == "-1" || f == "1"; + } + else if (i == outlineIndex) + { + if (decimal.TryParse(f, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var number)) + { + style.OutlineWidth = number; + } + } + else if (i == shadowIndex) + { + if (decimal.TryParse(f, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var number)) + { + style.ShadowWidth = number; + } + } + else if (i == alignmentIndex) + { + style.Alignment = f; + } + else if (i == marginLIndex) + { + if (int.TryParse(f, out var number)) + { + style.MarginLeft = number; + } + } + else if (i == marginRIndex) + { + if (int.TryParse(f, out var number)) + { + style.MarginRight = number; + } + } + else if (i == marginVIndex) + { + if (int.TryParse(f, out var number)) + { + style.MarginVertical = number; + } + } + else if (i == borderStyleIndex) + { + style.BorderStyle = f; + } + } + } + if (styleName != null && style.Name != null && (styleName.Equals(style.Name, StringComparison.OrdinalIgnoreCase) || + styleName.Equals("*Default", StringComparison.OrdinalIgnoreCase) && + style.Name.Equals("Default", StringComparison.OrdinalIgnoreCase))) + { + style.LoadedFromHeader = true; + return style; + } + } + } + return new SsaStyle { Name = styleName }; + } + + public override bool HasStyleSupport => true; + } } \ No newline at end of file diff --git a/libse/SubtitleFormats/AribB24Decoder.cs b/src/libse/SubtitleFormats/AribB24Decoder.cs similarity index 100% rename from libse/SubtitleFormats/AribB24Decoder.cs rename to src/libse/SubtitleFormats/AribB24Decoder.cs diff --git a/libse/SubtitleFormats/AribB36.cs b/src/libse/SubtitleFormats/AribB36.cs similarity index 100% rename from libse/SubtitleFormats/AribB36.cs rename to src/libse/SubtitleFormats/AribB36.cs diff --git a/libse/SubtitleFormats/AvidCaption.cs b/src/libse/SubtitleFormats/AvidCaption.cs similarity index 97% rename from libse/SubtitleFormats/AvidCaption.cs rename to src/libse/SubtitleFormats/AvidCaption.cs index 24478613d..877f74463 100644 --- a/libse/SubtitleFormats/AvidCaption.cs +++ b/src/libse/SubtitleFormats/AvidCaption.cs @@ -1,127 +1,127 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class AvidCaption : SubtitleFormat - { - private static readonly Regex RegexTimeCodes = new Regex(@"^\d\d:\d\d:\d\d:\d\d \d\d:\d\d:\d\d:\d\d$", RegexOptions.Compiled); - - public override string Extension => ".txt"; - - public override string Name => "Avid Caption"; - - public override string ToText(Subtitle subtitle, string title) - { - var sb = new StringBuilder(); - sb.AppendLine("@ This file written with the Avid Caption plugin, version 1"); - sb.AppendLine(); - sb.AppendLine(""); - const string writeFormat = "{0} {1}{2}{3}{2}"; - foreach (Paragraph p in subtitle.Paragraphs) - { - sb.AppendLine(string.Format(writeFormat, p.StartTime.ToHHMMSSFF(), EncodeEndTimeCode(p.EndTime), Environment.NewLine, HtmlUtil.RemoveHtmlTags(p.Text, true))); - //00:50:34:22 00:50:39:13 - //Ich muss dafür sorgen, - //dass die Epsteins weiterleben - } - sb.AppendLine(""); - return sb.ToString(); - } - - private static string EncodeEndTimeCode(TimeCode time) - { - //00:50:39:13 (last is frame) - - //Bugfix for Avid - On 23.976 FPS and 24 FPS projects, when the End time of a subtitle ends in 02, 07, 12, 17, 22, 27 frames, the subtitle won't import. - if (Math.Abs(Configuration.Settings.General.CurrentFrameRate - 23.976) < 0.01 || - Math.Abs(Configuration.Settings.General.CurrentFrameRate - 24) < 0.01) - { - var frames = MillisecondsToFramesMaxFrameRate(time.Milliseconds); - if (frames == 2 || frames == 7 || frames == 12 || frames == 17 || frames == 22 || frames == 27) - { - frames--; - } - - return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}:{frames:00}"; - } - else - { - return time.ToHHMMSSFF(); - } - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - //00:03:15:22 00:03:23:10 This is line one. - //This is line two. - Paragraph p = null; - subtitle.Paragraphs.Clear(); - _errorCount = 0; - bool beginFound = false; - bool endFound = false; - foreach (string line in lines) - { - string tline = line.Trim(); - if (tline.Equals("", StringComparison.OrdinalIgnoreCase)) - { - beginFound = true; - } - else if (tline.Equals("", StringComparison.OrdinalIgnoreCase)) - { - endFound = true; - break; - } - - if (line.IndexOf(':') == 2 && RegexTimeCodes.IsMatch(line)) - { - string temp = line.Substring(0, RegexTimeCodes.Match(line).Length); - string start = temp.Substring(0, 11); - string end = temp.Substring(12, 11); - - string[] startParts = start.Split(SplitCharColon, StringSplitOptions.RemoveEmptyEntries); - string[] endParts = end.Split(SplitCharColon, StringSplitOptions.RemoveEmptyEntries); - if (startParts.Length == 4 && endParts.Length == 4) - { - p = new Paragraph(DecodeTimeCodeFramesFourParts(startParts), DecodeTimeCodeFramesFourParts(endParts), string.Empty); - subtitle.Paragraphs.Add(p); - } - } - else if (tline.Length == 0 || tline[0] == '@') - { - // skip these lines - } - else if (tline.Length > 0 && p != null) - { - if (string.IsNullOrEmpty(p.Text)) - { - p.Text = line; - } - else - { - if (Utilities.IsInteger(line)) - { - _errorCount++; - } - p.Text = p.Text.TrimEnd() + Environment.NewLine + line; - } - } - } - if (!beginFound) - { - _errorCount++; - } - - if (!endFound) - { - _errorCount++; - } - - subtitle.Renumber(); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class AvidCaption : SubtitleFormat + { + private static readonly Regex RegexTimeCodes = new Regex(@"^\d\d:\d\d:\d\d:\d\d \d\d:\d\d:\d\d:\d\d$", RegexOptions.Compiled); + + public override string Extension => ".txt"; + + public override string Name => "Avid Caption"; + + public override string ToText(Subtitle subtitle, string title) + { + var sb = new StringBuilder(); + sb.AppendLine("@ This file written with the Avid Caption plugin, version 1"); + sb.AppendLine(); + sb.AppendLine(""); + const string writeFormat = "{0} {1}{2}{3}{2}"; + foreach (Paragraph p in subtitle.Paragraphs) + { + sb.AppendLine(string.Format(writeFormat, p.StartTime.ToHHMMSSFF(), EncodeEndTimeCode(p.EndTime), Environment.NewLine, HtmlUtil.RemoveHtmlTags(p.Text, true))); + //00:50:34:22 00:50:39:13 + //Ich muss dafür sorgen, + //dass die Epsteins weiterleben + } + sb.AppendLine(""); + return sb.ToString(); + } + + private static string EncodeEndTimeCode(TimeCode time) + { + //00:50:39:13 (last is frame) + + //Bugfix for Avid - On 23.976 FPS and 24 FPS projects, when the End time of a subtitle ends in 02, 07, 12, 17, 22, 27 frames, the subtitle won't import. + if (Math.Abs(Configuration.Settings.General.CurrentFrameRate - 23.976) < 0.01 || + Math.Abs(Configuration.Settings.General.CurrentFrameRate - 24) < 0.01) + { + var frames = MillisecondsToFramesMaxFrameRate(time.Milliseconds); + if (frames == 2 || frames == 7 || frames == 12 || frames == 17 || frames == 22 || frames == 27) + { + frames--; + } + + return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}:{frames:00}"; + } + else + { + return time.ToHHMMSSFF(); + } + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + //00:03:15:22 00:03:23:10 This is line one. + //This is line two. + Paragraph p = null; + subtitle.Paragraphs.Clear(); + _errorCount = 0; + bool beginFound = false; + bool endFound = false; + foreach (string line in lines) + { + string tline = line.Trim(); + if (tline.Equals("", StringComparison.OrdinalIgnoreCase)) + { + beginFound = true; + } + else if (tline.Equals("", StringComparison.OrdinalIgnoreCase)) + { + endFound = true; + break; + } + + if (line.IndexOf(':') == 2 && RegexTimeCodes.IsMatch(line)) + { + string temp = line.Substring(0, RegexTimeCodes.Match(line).Length); + string start = temp.Substring(0, 11); + string end = temp.Substring(12, 11); + + string[] startParts = start.Split(SplitCharColon, StringSplitOptions.RemoveEmptyEntries); + string[] endParts = end.Split(SplitCharColon, StringSplitOptions.RemoveEmptyEntries); + if (startParts.Length == 4 && endParts.Length == 4) + { + p = new Paragraph(DecodeTimeCodeFramesFourParts(startParts), DecodeTimeCodeFramesFourParts(endParts), string.Empty); + subtitle.Paragraphs.Add(p); + } + } + else if (tline.Length == 0 || tline[0] == '@') + { + // skip these lines + } + else if (tline.Length > 0 && p != null) + { + if (string.IsNullOrEmpty(p.Text)) + { + p.Text = line; + } + else + { + if (Utilities.IsInteger(line)) + { + _errorCount++; + } + p.Text = p.Text.TrimEnd() + Environment.NewLine + line; + } + } + } + if (!beginFound) + { + _errorCount++; + } + + if (!endFound) + { + _errorCount++; + } + + subtitle.Renumber(); + } + + } +} diff --git a/libse/SubtitleFormats/AvidDvd.cs b/src/libse/SubtitleFormats/AvidDvd.cs similarity index 97% rename from libse/SubtitleFormats/AvidDvd.cs rename to src/libse/SubtitleFormats/AvidDvd.cs index b053c51f5..87e455d48 100644 --- a/libse/SubtitleFormats/AvidDvd.cs +++ b/src/libse/SubtitleFormats/AvidDvd.cs @@ -1,155 +1,155 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class AvidDvd : SubtitleFormat - { - //25 10:03:20:23 10:03:23:05 some text - //I see, on my way.|New line also. - // - //26 10:03:31:18 10:03:34:00 even more text - //Panessa, why didn't they give them - //an escape route ? - - private static readonly Regex RegexTimeCode = new Regex(@"^\d+\t\d\d:\d\d:\d\d:\d\d\t\d\d:\d\d:\d\d:\d\d\t.+$", RegexOptions.Compiled); - - public override string Extension => ".txt"; - - public override string Name => "Avid DVD"; - - public override bool IsMine(List lines, string fileName) - { - if (fileName != null) - { - if (fileName.EndsWith(".dost", StringComparison.OrdinalIgnoreCase)) - { - return false; - } - - if (fileName.EndsWith(".sst", StringComparison.OrdinalIgnoreCase) && new SonicScenaristBitmaps().IsMine(lines, fileName)) - { - return false; - } - } - - return base.IsMine(lines, fileName); - } - - private static string MakeTimeCode(TimeCode tc) - { - return tc.ToHHMMSSFF(); - } - - public override string ToText(Subtitle subtitle, string title) - { - var sb = new StringBuilder(); - int count = 1; - bool italic = false; - for (int i = 0; i < subtitle.Paragraphs.Count; i++) - { - Paragraph p = subtitle.Paragraphs[i]; - string text = p.Text; - if (text.StartsWith('{') && text.Length > 6 && text[6] == '}') - { - text = text.Remove(0, 6); - } - - if (text.StartsWith("", StringComparison.Ordinal) && text.EndsWith("", StringComparison.Ordinal)) - { - if (!italic) - { - italic = true; - sb.AppendLine("$Italic = TRUE"); - } - } - else if (italic) - { - italic = false; - sb.AppendLine("$Italic = FALSE"); - } - - text = HtmlUtil.RemoveHtmlTags(text, true); - sb.AppendLine($"{count}\t{MakeTimeCode(p.StartTime)}\t{MakeTimeCode(p.EndTime)}\t{text.Replace(Environment.NewLine, "|")}"); - sb.AppendLine(); - count++; - } - - return sb.ToString(); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - Paragraph p = null; - var sb = new StringBuilder(); - bool italic = false; - foreach (string line in lines) - { - string s = line.TrimEnd(); - if (RegexTimeCode.IsMatch(s)) - { - try - { - if (p != null) - { - p.Text = sb.ToString().Replace("|", Environment.NewLine).Trim(); - subtitle.Paragraphs.Add(p); - } - sb.Clear(); - string[] arr = s.Split('\t'); - if (arr.Length >= 3) - { - string text = s.Remove(0, arr[0].Length + arr[1].Length + arr[2].Length + 2).Trim(); - - if (string.IsNullOrWhiteSpace(text.Replace("0", string.Empty).Replace("1", string.Empty).Replace("2", string.Empty).Replace("3", string.Empty).Replace("4", string.Empty).Replace("5", string.Empty). - Replace("6", string.Empty).Replace("7", string.Empty).Replace("8", string.Empty).Replace("9", string.Empty).RemoveChar('.').RemoveChar(':').RemoveChar(','))) - { - _errorCount++; - } - - if (italic) - { - text = "" + text + ""; - } - - sb.AppendLine(text); - char[] splitChars = { ',', '.', ':' }; - p = new Paragraph(DecodeTimeCodeFrames(arr[1], splitChars), DecodeTimeCodeFrames(arr[2], splitChars), string.Empty); - } - } - catch - { - _errorCount++; - p = null; - } - } - else if (s.StartsWith('$')) - { - if (s.RemoveChar(' ').Equals("$italic=true", StringComparison.OrdinalIgnoreCase)) - { - italic = true; - } - else if (s.RemoveChar(' ').Equals("$italic=false", StringComparison.OrdinalIgnoreCase)) - { - italic = false; - } - } - else if (!string.IsNullOrWhiteSpace(s)) - { - sb.AppendLine(s); - } - } - if (p != null) - { - p.Text = sb.ToString().Replace("|", Environment.NewLine).Trim(); - subtitle.Paragraphs.Add(p); - } - subtitle.Renumber(); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class AvidDvd : SubtitleFormat + { + //25 10:03:20:23 10:03:23:05 some text + //I see, on my way.|New line also. + // + //26 10:03:31:18 10:03:34:00 even more text + //Panessa, why didn't they give them + //an escape route ? + + private static readonly Regex RegexTimeCode = new Regex(@"^\d+\t\d\d:\d\d:\d\d:\d\d\t\d\d:\d\d:\d\d:\d\d\t.+$", RegexOptions.Compiled); + + public override string Extension => ".txt"; + + public override string Name => "Avid DVD"; + + public override bool IsMine(List lines, string fileName) + { + if (fileName != null) + { + if (fileName.EndsWith(".dost", StringComparison.OrdinalIgnoreCase)) + { + return false; + } + + if (fileName.EndsWith(".sst", StringComparison.OrdinalIgnoreCase) && new SonicScenaristBitmaps().IsMine(lines, fileName)) + { + return false; + } + } + + return base.IsMine(lines, fileName); + } + + private static string MakeTimeCode(TimeCode tc) + { + return tc.ToHHMMSSFF(); + } + + public override string ToText(Subtitle subtitle, string title) + { + var sb = new StringBuilder(); + int count = 1; + bool italic = false; + for (int i = 0; i < subtitle.Paragraphs.Count; i++) + { + Paragraph p = subtitle.Paragraphs[i]; + string text = p.Text; + if (text.StartsWith('{') && text.Length > 6 && text[6] == '}') + { + text = text.Remove(0, 6); + } + + if (text.StartsWith("", StringComparison.Ordinal) && text.EndsWith("", StringComparison.Ordinal)) + { + if (!italic) + { + italic = true; + sb.AppendLine("$Italic = TRUE"); + } + } + else if (italic) + { + italic = false; + sb.AppendLine("$Italic = FALSE"); + } + + text = HtmlUtil.RemoveHtmlTags(text, true); + sb.AppendLine($"{count}\t{MakeTimeCode(p.StartTime)}\t{MakeTimeCode(p.EndTime)}\t{text.Replace(Environment.NewLine, "|")}"); + sb.AppendLine(); + count++; + } + + return sb.ToString(); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + Paragraph p = null; + var sb = new StringBuilder(); + bool italic = false; + foreach (string line in lines) + { + string s = line.TrimEnd(); + if (RegexTimeCode.IsMatch(s)) + { + try + { + if (p != null) + { + p.Text = sb.ToString().Replace("|", Environment.NewLine).Trim(); + subtitle.Paragraphs.Add(p); + } + sb.Clear(); + string[] arr = s.Split('\t'); + if (arr.Length >= 3) + { + string text = s.Remove(0, arr[0].Length + arr[1].Length + arr[2].Length + 2).Trim(); + + if (string.IsNullOrWhiteSpace(text.Replace("0", string.Empty).Replace("1", string.Empty).Replace("2", string.Empty).Replace("3", string.Empty).Replace("4", string.Empty).Replace("5", string.Empty). + Replace("6", string.Empty).Replace("7", string.Empty).Replace("8", string.Empty).Replace("9", string.Empty).RemoveChar('.').RemoveChar(':').RemoveChar(','))) + { + _errorCount++; + } + + if (italic) + { + text = "" + text + ""; + } + + sb.AppendLine(text); + char[] splitChars = { ',', '.', ':' }; + p = new Paragraph(DecodeTimeCodeFrames(arr[1], splitChars), DecodeTimeCodeFrames(arr[2], splitChars), string.Empty); + } + } + catch + { + _errorCount++; + p = null; + } + } + else if (s.StartsWith('$')) + { + if (s.RemoveChar(' ').Equals("$italic=true", StringComparison.OrdinalIgnoreCase)) + { + italic = true; + } + else if (s.RemoveChar(' ').Equals("$italic=false", StringComparison.OrdinalIgnoreCase)) + { + italic = false; + } + } + else if (!string.IsNullOrWhiteSpace(s)) + { + sb.AppendLine(s); + } + } + if (p != null) + { + p.Text = sb.ToString().Replace("|", Environment.NewLine).Trim(); + subtitle.Paragraphs.Add(p); + } + subtitle.Renumber(); + } + + } +} diff --git a/libse/SubtitleFormats/AvidStl.cs b/src/libse/SubtitleFormats/AvidStl.cs similarity index 97% rename from libse/SubtitleFormats/AvidStl.cs rename to src/libse/SubtitleFormats/AvidStl.cs index db141dea9..5f97022d5 100644 --- a/libse/SubtitleFormats/AvidStl.cs +++ b/src/libse/SubtitleFormats/AvidStl.cs @@ -1,194 +1,194 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class AvidStl : SubtitleFormat - { - private const int TextLength = 112; - - private static Paragraph ReadSubtitleBlock(byte[] buffer, int index) - { - index += 5; - var p = new Paragraph { StartTime = ReadTimeCode(buffer, ref index), EndTime = ReadTimeCode(buffer, ref index) }; - index += 3; - for (int i = index; i < index + TextLength; i++) - { - if (buffer[i] == 0x8f || buffer[i] == 0) - { - buffer[i] = 32; - } - else if (buffer[i] == 0x8a) - { - buffer[i] = 0xa; - } - } - p.Text = Encoding.GetEncoding(1252).GetString(buffer, index, TextLength).Trim(); - p.Text = p.Text.Replace("\n", Environment.NewLine); - return p; - } - - private static TimeCode ReadTimeCode(byte[] buffer, ref int index) - { - int hours = buffer[index]; - int minutes = buffer[index + 1]; - int seconds = buffer[index + 2]; - int milliseconds = FramesToMillisecondsMax999(buffer[index + 3]); - index += 4; - return new TimeCode(hours, minutes, seconds, milliseconds); - } - - public static void WriteSubtitleBlock(FileStream fs, Paragraph p, int number) - { - fs.WriteByte(0); - fs.WriteByte((byte)(number % 256)); // number - low byte - fs.WriteByte((byte)(number / 256)); // number - high byte - fs.WriteByte(0xff); - fs.WriteByte(0); - WriteTimeCode(fs, p.StartTime); - WriteTimeCode(fs, p.EndTime); - fs.WriteByte(1); - fs.WriteByte(2); - fs.WriteByte(0); - var buffer = Encoding.GetEncoding(1252).GetBytes(p.Text.Replace(Environment.NewLine, "Š")); - if (buffer.Length <= 128) - { - fs.Write(buffer, 0, buffer.Length); - for (int i = buffer.Length; i < TextLength; i++) - { - fs.WriteByte(0x8f); - } - } - else - { - for (int i = 0; i < TextLength; i++) - { - fs.WriteByte(buffer[i]); - } - } - } - - private static void WriteTimeCode(FileStream fs, TimeCode tc) - { - fs.WriteByte((byte)(tc.Hours)); - fs.WriteByte((byte)(tc.Minutes)); - fs.WriteByte((byte)(tc.Seconds)); - fs.WriteByte((byte)(MillisecondsToFramesMaxFrameRate(tc.Milliseconds))); - } - - public override string Extension => ".stl"; - - public const string NameOfFormat = "Avid STL"; - - public override string Name => NameOfFormat; - - public static void Save(string fileName, Subtitle subtitle) - { - using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write)) - { - byte[] buffer = { 0x38, 0x35, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30, 0x30, 0x30, 0x39 }; - fs.Write(buffer, 0, buffer.Length); - for (int i = 0; i < 0xde; i++) - { - fs.WriteByte(0); - } - - string numberOfLines = subtitle.Paragraphs.Count.ToString("D5"); - - buffer = Encoding.ASCII.GetBytes(numberOfLines + numberOfLines + "001"); - fs.Write(buffer, 0, buffer.Length); - for (int i = 0; i < 0x15; i++) - { - fs.WriteByte(0); - } - - buffer = Encoding.ASCII.GetBytes("11"); - fs.Write(buffer, 0, buffer.Length); - while (fs.Length < 1024) - { - fs.WriteByte(0); - } - - int subtitleNumber = 0; - foreach (Paragraph p in subtitle.Paragraphs) - { - WriteSubtitleBlock(fs, p, subtitleNumber); - subtitleNumber++; - } - } - } - - public override bool IsMine(List lines, string fileName) - { - if (!string.IsNullOrEmpty(fileName) && File.Exists(fileName)) - { - try - { - var fi = new FileInfo(fileName); - if (fi.Length > 1150 && fi.Length < 1024000) // not too small or too big - { - byte[] buffer = FileUtil.ReadAllBytesShared(fileName); - if (buffer[0] == 0x38 && - buffer[1] == 0x35 && - buffer[2] == 0x30 && - buffer[1024] == 0 && - buffer[1025] == 0 && - buffer[1026] == 0 && - buffer[1027] == 0xff) - { - return true; - } - - if (fileName.EndsWith(".stl", StringComparison.OrdinalIgnoreCase) && - buffer.Length > 1283 && - buffer[1024] == 0 && - buffer[1025] == 1 && - buffer[1026] == 0 && - buffer[1027] == 0xff && - buffer[1152] == 0 && - buffer[1153] == 2 && - buffer[1154] == 0 && - buffer[1155] == 0xff && - buffer[1280] == 0 && - buffer[1281] == 3 && - buffer[1282] == 0 && - buffer[1283] == 0xff) - { - return true; - } - } - } - catch - { - return false; - } - } - return false; - } - - public override string ToText(Subtitle subtitle, string title) - { - return "Not supported!"; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - subtitle.Paragraphs.Clear(); - subtitle.Header = null; - byte[] buffer = FileUtil.ReadAllBytesShared(fileName); - - int index = 1024; - while (index <= buffer.Length - 128) - { - Paragraph p = ReadSubtitleBlock(buffer, index); - subtitle.Paragraphs.Add(p); - index += 128; - } - subtitle.Renumber(); - } - - } -} +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class AvidStl : SubtitleFormat + { + private const int TextLength = 112; + + private static Paragraph ReadSubtitleBlock(byte[] buffer, int index) + { + index += 5; + var p = new Paragraph { StartTime = ReadTimeCode(buffer, ref index), EndTime = ReadTimeCode(buffer, ref index) }; + index += 3; + for (int i = index; i < index + TextLength; i++) + { + if (buffer[i] == 0x8f || buffer[i] == 0) + { + buffer[i] = 32; + } + else if (buffer[i] == 0x8a) + { + buffer[i] = 0xa; + } + } + p.Text = Encoding.GetEncoding(1252).GetString(buffer, index, TextLength).Trim(); + p.Text = p.Text.Replace("\n", Environment.NewLine); + return p; + } + + private static TimeCode ReadTimeCode(byte[] buffer, ref int index) + { + int hours = buffer[index]; + int minutes = buffer[index + 1]; + int seconds = buffer[index + 2]; + int milliseconds = FramesToMillisecondsMax999(buffer[index + 3]); + index += 4; + return new TimeCode(hours, minutes, seconds, milliseconds); + } + + public static void WriteSubtitleBlock(FileStream fs, Paragraph p, int number) + { + fs.WriteByte(0); + fs.WriteByte((byte)(number % 256)); // number - low byte + fs.WriteByte((byte)(number / 256)); // number - high byte + fs.WriteByte(0xff); + fs.WriteByte(0); + WriteTimeCode(fs, p.StartTime); + WriteTimeCode(fs, p.EndTime); + fs.WriteByte(1); + fs.WriteByte(2); + fs.WriteByte(0); + var buffer = Encoding.GetEncoding(1252).GetBytes(p.Text.Replace(Environment.NewLine, "Š")); + if (buffer.Length <= 128) + { + fs.Write(buffer, 0, buffer.Length); + for (int i = buffer.Length; i < TextLength; i++) + { + fs.WriteByte(0x8f); + } + } + else + { + for (int i = 0; i < TextLength; i++) + { + fs.WriteByte(buffer[i]); + } + } + } + + private static void WriteTimeCode(FileStream fs, TimeCode tc) + { + fs.WriteByte((byte)(tc.Hours)); + fs.WriteByte((byte)(tc.Minutes)); + fs.WriteByte((byte)(tc.Seconds)); + fs.WriteByte((byte)(MillisecondsToFramesMaxFrameRate(tc.Milliseconds))); + } + + public override string Extension => ".stl"; + + public const string NameOfFormat = "Avid STL"; + + public override string Name => NameOfFormat; + + public static void Save(string fileName, Subtitle subtitle) + { + using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write)) + { + byte[] buffer = { 0x38, 0x35, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30, 0x30, 0x30, 0x39 }; + fs.Write(buffer, 0, buffer.Length); + for (int i = 0; i < 0xde; i++) + { + fs.WriteByte(0); + } + + string numberOfLines = subtitle.Paragraphs.Count.ToString("D5"); + + buffer = Encoding.ASCII.GetBytes(numberOfLines + numberOfLines + "001"); + fs.Write(buffer, 0, buffer.Length); + for (int i = 0; i < 0x15; i++) + { + fs.WriteByte(0); + } + + buffer = Encoding.ASCII.GetBytes("11"); + fs.Write(buffer, 0, buffer.Length); + while (fs.Length < 1024) + { + fs.WriteByte(0); + } + + int subtitleNumber = 0; + foreach (Paragraph p in subtitle.Paragraphs) + { + WriteSubtitleBlock(fs, p, subtitleNumber); + subtitleNumber++; + } + } + } + + public override bool IsMine(List lines, string fileName) + { + if (!string.IsNullOrEmpty(fileName) && File.Exists(fileName)) + { + try + { + var fi = new FileInfo(fileName); + if (fi.Length > 1150 && fi.Length < 1024000) // not too small or too big + { + byte[] buffer = FileUtil.ReadAllBytesShared(fileName); + if (buffer[0] == 0x38 && + buffer[1] == 0x35 && + buffer[2] == 0x30 && + buffer[1024] == 0 && + buffer[1025] == 0 && + buffer[1026] == 0 && + buffer[1027] == 0xff) + { + return true; + } + + if (fileName.EndsWith(".stl", StringComparison.OrdinalIgnoreCase) && + buffer.Length > 1283 && + buffer[1024] == 0 && + buffer[1025] == 1 && + buffer[1026] == 0 && + buffer[1027] == 0xff && + buffer[1152] == 0 && + buffer[1153] == 2 && + buffer[1154] == 0 && + buffer[1155] == 0xff && + buffer[1280] == 0 && + buffer[1281] == 3 && + buffer[1282] == 0 && + buffer[1283] == 0xff) + { + return true; + } + } + } + catch + { + return false; + } + } + return false; + } + + public override string ToText(Subtitle subtitle, string title) + { + return "Not supported!"; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + subtitle.Paragraphs.Clear(); + subtitle.Header = null; + byte[] buffer = FileUtil.ReadAllBytesShared(fileName); + + int index = 1024; + while (index <= buffer.Length - 128) + { + Paragraph p = ReadSubtitleBlock(buffer, index); + subtitle.Paragraphs.Add(p); + index += 128; + } + subtitle.Renumber(); + } + + } +} diff --git a/libse/SubtitleFormats/AwsTranscribeJson.cs b/src/libse/SubtitleFormats/AwsTranscribeJson.cs similarity index 100% rename from libse/SubtitleFormats/AwsTranscribeJson.cs rename to src/libse/SubtitleFormats/AwsTranscribeJson.cs diff --git a/libse/SubtitleFormats/Ayato.cs b/src/libse/SubtitleFormats/Ayato.cs similarity index 97% rename from libse/SubtitleFormats/Ayato.cs rename to src/libse/SubtitleFormats/Ayato.cs index 7c972c637..4563d19ff 100644 --- a/libse/SubtitleFormats/Ayato.cs +++ b/src/libse/SubtitleFormats/Ayato.cs @@ -1,366 +1,366 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class Ayato : SubtitleFormat - { - public override string Extension => ".aya"; - - public override string Name => "Ayato"; - - public override bool IsMine(List lines, string fileName) - { - if (!string.IsNullOrEmpty(fileName) && File.Exists(fileName)) - { - var fi = new FileInfo(fileName); - if (fi.Length >= 3000 && fi.Length < 1024000) // not too small or too big - { - if (!fileName.EndsWith(Extension, StringComparison.OrdinalIgnoreCase)) - { - return false; - } - - return base.IsMine(lines, fileName); - } - } - return false; - } - - public override string ToText(Subtitle subtitle, string title) - { - throw new NotImplementedException(); - } - - public void Save(string fileName, string videoFileName, Subtitle subtitle) - { - using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write)) - { - // header - var header = new byte[2713]; - header[00] = 0x05; - header[01] = 0x30; - header[02] = 0x32; - header[03] = 0x2E; - header[04] = 0x30; - header[05] = 0x33; - header[06] = 0x05; - header[07] = 0x41; - header[08] = 0x79; - header[09] = 0x61; - header[10] = 0x74; - header[11] = 0x6F; - header[12] = 0x02; - header[77] = 0x01; - header[81] = 0x01; - header[608] = 0x3b; - header[609] = 0x32; - header[613] = 0x58; - header[614] = 0x02; - header[615] = 0xE8; - header[616] = 0x03; - header[617] = 0xE8; - header[618] = 0x03; - header[619] = 0xE8; - header[620] = 0x03; - header[621] = 0xE8; - header[622] = 0x03; - header[639] = 0x02; - - header[682] = (byte)(subtitle.Paragraphs.Count & 0xff); - header[683] = (byte)((subtitle.Paragraphs.Count >> 8) & 0xff); - - header[686] = 0x09; - header[687] = 0x04; - - header[751] = 0x08; - - header[760] = 0x01; - header[761] = 0x0a; - - header[830] = 0x58; - header[831] = 0x48; - - header[2048] = 0x99; - header[2049] = 0x02; - - header[2050] = (byte)(subtitle.Paragraphs.Count & 0xff); - header[2051] = (byte)((subtitle.Paragraphs.Count >> 8) & 0xff); - - header[2069] = 0x17; - header[2071] = 0x17; - header[2073] = 0x02; - header[2075] = 0x27; - header[2077] = 0x0c; - header[2079] = 0x04; - - header[2082] = 0x01; - header[2085] = 0x01; - - // Microsoft Sans Serif - header[2088] = 0x4d; - header[2089] = 0x69; - header[2090] = 0x63; - header[2091] = 0x72; - header[2092] = 0x6f; - header[2093] = 0x73; - header[2094] = 0x6f; - header[2095] = 0x66; - header[2096] = 0x74; - header[2097] = 0x20; - header[2098] = 0x53; - header[2099] = 0x61; - header[2100] = 0x6e; - header[2101] = 0x73; - header[2102] = 0x20; - header[2103] = 0x53; - header[2104] = 0x65; - header[2105] = 0x72; - header[2106] = 0x69; - header[2107] = 0x66; - - header[2120] = 0x1f; - header[2123] = 0x01; - header[2124] = 0x02; - - header[2128] = 0xff; - header[2136] = 0x02; - header[2176] = 0x01; - header[2193] = 0x02; - header[2194] = 0x02; - - header[2197] = 0x0C; - header[2198] = 0x14; - header[2199] = 0x0C; - header[2200] = 0x01; - header[2201] = 0xe8; - header[2202] = 0x03; - header[2203] = 0xe8; - header[2204] = 0x03; - header[2205] = 0xe8; - header[2206] = 0x03; - header[2207] = 0xe8; - header[2208] = 0x03; - - header[2225] = 0x13; - header[2226] = 0x08; - header[2227] = 0xdf; - header[2228] = 0x07; - header[2229] = 0x13; - header[2230] = 0x08; - header[2231] = 0xdf; - header[2232] = 0x07; - - fs.Write(header, 0, header.Length); - - // paragraphs - var sub = new Subtitle(subtitle); - int number = 1; - foreach (Paragraph p in sub.Paragraphs) - { - WriteParagraph(fs, p, number); - number++; - } - } - } - - private static void WriteParagraph(Stream stream, Paragraph paragraph, int number) - { - // subtitle number - stream.WriteByte((byte)(number & 0xff)); - stream.WriteByte((byte)((number >> 8) & 0xff)); - - stream.WriteByte(0); - stream.WriteByte(0); - WriteFrames(stream, paragraph.StartTime); - stream.WriteByte(0); - WriteFrames(stream, paragraph.EndTime); - stream.WriteByte(0); - - stream.WriteByte(0x17); - stream.WriteByte(0); - stream.WriteByte(2); - stream.WriteByte(0); - - WriteText(stream, paragraph.Text); - } - - private static void WriteFrames(Stream stream, TimeCode timeCode) - { - var frames = (uint)Math.Round((double)MillisecondsToFrames(timeCode.TotalMilliseconds)); - stream.WriteByte((byte)(frames & 0xff)); - stream.WriteByte((byte)((frames >> 8) & 0xff)); - stream.WriteByte((byte)((frames >> 16) & 0xff)); - } - - private static void WriteText(Stream stream, string text) - { - var bytes = MakeBytes(text); - - stream.WriteByte((byte)(bytes.Length + 1)); // text length - - for (int i = 0; i < 55; i++) // 55 bytes zero padding - { - stream.WriteByte(0); - } - - stream.WriteByte(7); - stream.Write(bytes, 0, bytes.Length); - } - - private static byte[] MakeBytes(string text) - { - var bytesList = new List(); - int count = 0; - foreach (var line in HtmlUtil.RemoveHtmlTags(text, true).SplitToLines()) - { - if (count > 0) - { - bytesList.Add(0x1f); - bytesList.Add(0x7); - } - bytesList.AddRange(Encoding.UTF8.GetBytes(line)); - count++; - } - return bytesList.ToArray(); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - const int startPosition = 0xa99; - const int textPosition = 72; - - _errorCount = 0; - subtitle.Paragraphs.Clear(); - subtitle.Header = null; - var buffer = FileUtil.ReadAllBytesShared(fileName); - int index = startPosition; - if (buffer[index] != 1) - { - return; - } - - while (index + textPosition < buffer.Length) - { - int textLength = buffer[index + 16]; - if (textLength > 0 && index + textPosition + textLength < buffer.Length) - { - string text = GetText(index + textPosition, textLength, buffer); - if (!string.IsNullOrWhiteSpace(text)) - { - int startFrames = GetFrames(index + 4, buffer); - int endFrames = GetFrames(index + 8, buffer); - subtitle.Paragraphs.Add(new Paragraph(text, FramesToMilliseconds(startFrames), FramesToMilliseconds(endFrames))); - } - } - index += textPosition + textLength; - } - subtitle.Renumber(); - } - - private static string GetText(int index, int length, byte[] buffer) - { - if (length < 1) - { - return string.Empty; - } - - int offset = 0; - if (buffer[index] == 7) - { - offset = 1; - } - else if (buffer[index + 1] == 7) - { - offset = 2; - } - else if (buffer[index + 2] == 7) - { - offset = 3; - } - - if (buffer[index + offset] < 32) - { - offset++; - } - - if (length - offset < 1) - { - return string.Empty; - } - - var sb = new StringBuilder(); - var textBytes = new List(); - int i = index + offset; - int max = i + length - offset; - while (i < max) - { - if (i + 3 < max && buffer[i] < 32 && buffer[i + 1] < 32 && buffer[i + 2] < 32 && buffer[i + 3] == 7) - { - AddToLine(textBytes, sb); - sb.AppendLine(); - if (i + 4 < max && buffer[i + 4] < 32) - { - i++; - } - i += 3; - } - else if (i + 2 < max && buffer[i] < 32 && buffer[i + 1] < 32 && buffer[i + 2] == 7) - { - AddToLine(textBytes, sb); - sb.AppendLine(); - if (i + 3 < max && buffer[i + 3] < 32) - { - i++; - } - i += 2; - } - else if (i + 1 < max && buffer[i] < 32 && buffer[i + 1] == 7) - { - AddToLine(textBytes, sb); - sb.AppendLine(); - if (i + 2 < max && buffer[i + 2] < 32) - { - i++; - } - i++; - } - else if (buffer[i] == 7) - { - AddToLine(textBytes, sb); - sb.AppendLine(); - if (i + 1 < max && buffer[i + 1] < 32) - { - i++; - } - } - else - { - textBytes.Add(buffer[i]); - } - i++; - } - AddToLine(textBytes, sb); - return sb.ToString(); - } - - private static void AddToLine(List textBytes, StringBuilder sb) - { - if (textBytes.Count > 0) - { - var lineBuffer = textBytes.ToArray(); - sb.Append(Encoding.UTF8.GetString(lineBuffer, 0, lineBuffer.Length)); - textBytes.Clear(); - } - } - - private static int GetFrames(int index, byte[] buffer) - { - return (buffer[index + 2] << 16) + (buffer[index + 1] << 8) + buffer[index]; - } - - } -} +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class Ayato : SubtitleFormat + { + public override string Extension => ".aya"; + + public override string Name => "Ayato"; + + public override bool IsMine(List lines, string fileName) + { + if (!string.IsNullOrEmpty(fileName) && File.Exists(fileName)) + { + var fi = new FileInfo(fileName); + if (fi.Length >= 3000 && fi.Length < 1024000) // not too small or too big + { + if (!fileName.EndsWith(Extension, StringComparison.OrdinalIgnoreCase)) + { + return false; + } + + return base.IsMine(lines, fileName); + } + } + return false; + } + + public override string ToText(Subtitle subtitle, string title) + { + throw new NotImplementedException(); + } + + public void Save(string fileName, string videoFileName, Subtitle subtitle) + { + using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write)) + { + // header + var header = new byte[2713]; + header[00] = 0x05; + header[01] = 0x30; + header[02] = 0x32; + header[03] = 0x2E; + header[04] = 0x30; + header[05] = 0x33; + header[06] = 0x05; + header[07] = 0x41; + header[08] = 0x79; + header[09] = 0x61; + header[10] = 0x74; + header[11] = 0x6F; + header[12] = 0x02; + header[77] = 0x01; + header[81] = 0x01; + header[608] = 0x3b; + header[609] = 0x32; + header[613] = 0x58; + header[614] = 0x02; + header[615] = 0xE8; + header[616] = 0x03; + header[617] = 0xE8; + header[618] = 0x03; + header[619] = 0xE8; + header[620] = 0x03; + header[621] = 0xE8; + header[622] = 0x03; + header[639] = 0x02; + + header[682] = (byte)(subtitle.Paragraphs.Count & 0xff); + header[683] = (byte)((subtitle.Paragraphs.Count >> 8) & 0xff); + + header[686] = 0x09; + header[687] = 0x04; + + header[751] = 0x08; + + header[760] = 0x01; + header[761] = 0x0a; + + header[830] = 0x58; + header[831] = 0x48; + + header[2048] = 0x99; + header[2049] = 0x02; + + header[2050] = (byte)(subtitle.Paragraphs.Count & 0xff); + header[2051] = (byte)((subtitle.Paragraphs.Count >> 8) & 0xff); + + header[2069] = 0x17; + header[2071] = 0x17; + header[2073] = 0x02; + header[2075] = 0x27; + header[2077] = 0x0c; + header[2079] = 0x04; + + header[2082] = 0x01; + header[2085] = 0x01; + + // Microsoft Sans Serif + header[2088] = 0x4d; + header[2089] = 0x69; + header[2090] = 0x63; + header[2091] = 0x72; + header[2092] = 0x6f; + header[2093] = 0x73; + header[2094] = 0x6f; + header[2095] = 0x66; + header[2096] = 0x74; + header[2097] = 0x20; + header[2098] = 0x53; + header[2099] = 0x61; + header[2100] = 0x6e; + header[2101] = 0x73; + header[2102] = 0x20; + header[2103] = 0x53; + header[2104] = 0x65; + header[2105] = 0x72; + header[2106] = 0x69; + header[2107] = 0x66; + + header[2120] = 0x1f; + header[2123] = 0x01; + header[2124] = 0x02; + + header[2128] = 0xff; + header[2136] = 0x02; + header[2176] = 0x01; + header[2193] = 0x02; + header[2194] = 0x02; + + header[2197] = 0x0C; + header[2198] = 0x14; + header[2199] = 0x0C; + header[2200] = 0x01; + header[2201] = 0xe8; + header[2202] = 0x03; + header[2203] = 0xe8; + header[2204] = 0x03; + header[2205] = 0xe8; + header[2206] = 0x03; + header[2207] = 0xe8; + header[2208] = 0x03; + + header[2225] = 0x13; + header[2226] = 0x08; + header[2227] = 0xdf; + header[2228] = 0x07; + header[2229] = 0x13; + header[2230] = 0x08; + header[2231] = 0xdf; + header[2232] = 0x07; + + fs.Write(header, 0, header.Length); + + // paragraphs + var sub = new Subtitle(subtitle); + int number = 1; + foreach (Paragraph p in sub.Paragraphs) + { + WriteParagraph(fs, p, number); + number++; + } + } + } + + private static void WriteParagraph(Stream stream, Paragraph paragraph, int number) + { + // subtitle number + stream.WriteByte((byte)(number & 0xff)); + stream.WriteByte((byte)((number >> 8) & 0xff)); + + stream.WriteByte(0); + stream.WriteByte(0); + WriteFrames(stream, paragraph.StartTime); + stream.WriteByte(0); + WriteFrames(stream, paragraph.EndTime); + stream.WriteByte(0); + + stream.WriteByte(0x17); + stream.WriteByte(0); + stream.WriteByte(2); + stream.WriteByte(0); + + WriteText(stream, paragraph.Text); + } + + private static void WriteFrames(Stream stream, TimeCode timeCode) + { + var frames = (uint)Math.Round((double)MillisecondsToFrames(timeCode.TotalMilliseconds)); + stream.WriteByte((byte)(frames & 0xff)); + stream.WriteByte((byte)((frames >> 8) & 0xff)); + stream.WriteByte((byte)((frames >> 16) & 0xff)); + } + + private static void WriteText(Stream stream, string text) + { + var bytes = MakeBytes(text); + + stream.WriteByte((byte)(bytes.Length + 1)); // text length + + for (int i = 0; i < 55; i++) // 55 bytes zero padding + { + stream.WriteByte(0); + } + + stream.WriteByte(7); + stream.Write(bytes, 0, bytes.Length); + } + + private static byte[] MakeBytes(string text) + { + var bytesList = new List(); + int count = 0; + foreach (var line in HtmlUtil.RemoveHtmlTags(text, true).SplitToLines()) + { + if (count > 0) + { + bytesList.Add(0x1f); + bytesList.Add(0x7); + } + bytesList.AddRange(Encoding.UTF8.GetBytes(line)); + count++; + } + return bytesList.ToArray(); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + const int startPosition = 0xa99; + const int textPosition = 72; + + _errorCount = 0; + subtitle.Paragraphs.Clear(); + subtitle.Header = null; + var buffer = FileUtil.ReadAllBytesShared(fileName); + int index = startPosition; + if (buffer[index] != 1) + { + return; + } + + while (index + textPosition < buffer.Length) + { + int textLength = buffer[index + 16]; + if (textLength > 0 && index + textPosition + textLength < buffer.Length) + { + string text = GetText(index + textPosition, textLength, buffer); + if (!string.IsNullOrWhiteSpace(text)) + { + int startFrames = GetFrames(index + 4, buffer); + int endFrames = GetFrames(index + 8, buffer); + subtitle.Paragraphs.Add(new Paragraph(text, FramesToMilliseconds(startFrames), FramesToMilliseconds(endFrames))); + } + } + index += textPosition + textLength; + } + subtitle.Renumber(); + } + + private static string GetText(int index, int length, byte[] buffer) + { + if (length < 1) + { + return string.Empty; + } + + int offset = 0; + if (buffer[index] == 7) + { + offset = 1; + } + else if (buffer[index + 1] == 7) + { + offset = 2; + } + else if (buffer[index + 2] == 7) + { + offset = 3; + } + + if (buffer[index + offset] < 32) + { + offset++; + } + + if (length - offset < 1) + { + return string.Empty; + } + + var sb = new StringBuilder(); + var textBytes = new List(); + int i = index + offset; + int max = i + length - offset; + while (i < max) + { + if (i + 3 < max && buffer[i] < 32 && buffer[i + 1] < 32 && buffer[i + 2] < 32 && buffer[i + 3] == 7) + { + AddToLine(textBytes, sb); + sb.AppendLine(); + if (i + 4 < max && buffer[i + 4] < 32) + { + i++; + } + i += 3; + } + else if (i + 2 < max && buffer[i] < 32 && buffer[i + 1] < 32 && buffer[i + 2] == 7) + { + AddToLine(textBytes, sb); + sb.AppendLine(); + if (i + 3 < max && buffer[i + 3] < 32) + { + i++; + } + i += 2; + } + else if (i + 1 < max && buffer[i] < 32 && buffer[i + 1] == 7) + { + AddToLine(textBytes, sb); + sb.AppendLine(); + if (i + 2 < max && buffer[i + 2] < 32) + { + i++; + } + i++; + } + else if (buffer[i] == 7) + { + AddToLine(textBytes, sb); + sb.AppendLine(); + if (i + 1 < max && buffer[i + 1] < 32) + { + i++; + } + } + else + { + textBytes.Add(buffer[i]); + } + i++; + } + AddToLine(textBytes, sb); + return sb.ToString(); + } + + private static void AddToLine(List textBytes, StringBuilder sb) + { + if (textBytes.Count > 0) + { + var lineBuffer = textBytes.ToArray(); + sb.Append(Encoding.UTF8.GetString(lineBuffer, 0, lineBuffer.Length)); + textBytes.Clear(); + } + } + + private static int GetFrames(int index, byte[] buffer) + { + return (buffer[index + 2] << 16) + (buffer[index + 1] << 8) + buffer[index]; + } + + } +} diff --git a/libse/SubtitleFormats/BdnXml.cs b/src/libse/SubtitleFormats/BdnXml.cs similarity index 97% rename from libse/SubtitleFormats/BdnXml.cs rename to src/libse/SubtitleFormats/BdnXml.cs index 3bb7fdc17..5b6d1ccc9 100644 --- a/libse/SubtitleFormats/BdnXml.cs +++ b/src/libse/SubtitleFormats/BdnXml.cs @@ -1,112 +1,112 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Text; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class BdnXml : SubtitleFormat - { - public override string Extension => ".xml"; - - public override string Name => "BDN Xml"; - - public override string ToText(Subtitle subtitle, string title) - { - string xmlStructure = - "" + Environment.NewLine + - ""; - - var xml = new XmlDocument { XmlResolver = null }; - xml.LoadXml(xmlStructure); - - foreach (Paragraph p in subtitle.Paragraphs) - { - XmlNode paragraph = xml.CreateElement("Paragraph"); - - XmlNode number = xml.CreateElement("Number"); - number.InnerText = p.Number.ToString(CultureInfo.InvariantCulture); - paragraph.AppendChild(number); - - XmlNode start = xml.CreateElement("StartMilliseconds"); - start.InnerText = p.StartTime.TotalMilliseconds.ToString(CultureInfo.InvariantCulture); - paragraph.AppendChild(start); - - XmlNode end = xml.CreateElement("EndMilliseconds"); - end.InnerText = p.EndTime.TotalMilliseconds.ToString(CultureInfo.InvariantCulture); - paragraph.AppendChild(end); - - XmlNode text = xml.CreateElement("Text"); - text.InnerText = HtmlUtil.RemoveHtmlTags(p.Text, true); - paragraph.AppendChild(text); - - xml.DocumentElement.AppendChild(paragraph); - } - string textUtf8; - using (var ms = new MemoryStream()) - { - var writer = new XmlTextWriter(ms, Encoding.UTF8) { Formatting = Formatting.Indented }; - xml.Save(writer); - textUtf8 = Encoding.UTF8.GetString(ms.ToArray()); - } - return textUtf8.Trim(); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - - string xmlString = sb.ToString(); - if (!xmlString.Contains(" ".xml"; + + public override string Name => "BDN Xml"; + + public override string ToText(Subtitle subtitle, string title) + { + string xmlStructure = + "" + Environment.NewLine + + ""; + + var xml = new XmlDocument { XmlResolver = null }; + xml.LoadXml(xmlStructure); + + foreach (Paragraph p in subtitle.Paragraphs) + { + XmlNode paragraph = xml.CreateElement("Paragraph"); + + XmlNode number = xml.CreateElement("Number"); + number.InnerText = p.Number.ToString(CultureInfo.InvariantCulture); + paragraph.AppendChild(number); + + XmlNode start = xml.CreateElement("StartMilliseconds"); + start.InnerText = p.StartTime.TotalMilliseconds.ToString(CultureInfo.InvariantCulture); + paragraph.AppendChild(start); + + XmlNode end = xml.CreateElement("EndMilliseconds"); + end.InnerText = p.EndTime.TotalMilliseconds.ToString(CultureInfo.InvariantCulture); + paragraph.AppendChild(end); + + XmlNode text = xml.CreateElement("Text"); + text.InnerText = HtmlUtil.RemoveHtmlTags(p.Text, true); + paragraph.AppendChild(text); + + xml.DocumentElement.AppendChild(paragraph); + } + string textUtf8; + using (var ms = new MemoryStream()) + { + var writer = new XmlTextWriter(ms, Encoding.UTF8) { Formatting = Formatting.Indented }; + xml.Save(writer); + textUtf8 = Encoding.UTF8.GetString(ms.ToArray()); + } + return textUtf8.Trim(); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + + string xmlString = sb.ToString(); + if (!xmlString.Contains(" ".stp"; - - public override string Name => "Belle Nuit Subtitler"; - - public override string ToText(Subtitle subtitle, string title) - { - const string paragraphWriteFormat = "/tc {0} {1}{2}{3}{2}"; - - var sb = new StringBuilder(); - foreach (Paragraph p in subtitle.Paragraphs) - { - sb.AppendLine(string.Format(paragraphWriteFormat, EncodeTimeCode(p.StartTime), EncodeTimeCode(p.EndTime), Environment.NewLine, EncodeText(p.Text))); - } - - var doc = new XmlDocument { XmlResolver = null }; - doc.LoadXml("" + Environment.NewLine + @" - document - - creator - SICT - type - STLI - version - 1.4 - applicationversion - Belle Nuit Subtitler 1.7.8 - creationdate - 2012-03-13 16:30:32 - modificationdate - 2012-03-13 16:30:32 - - mainleft - 40 - maintop - 48 - mainwidth - 825 - mainheight - 886 - styledt - - exportdt - - previewdt - - moviedt - - exportformat - TIFF - style - - font - Geneva - size - 26 - spacing - 1 - leading - 7 - bold - - italic - - underline - - vertical - 486 - halin - 1 - valign - 2 - standard - PAL - height - 576 - width - 720 - widthreal - 768 - antialiasing - 4 - left - 40 - right - 680 - wrapmethod - 2 - interlaced - - textcolor - #FBFFF2 - textalpha - 1 - textsoft - 0 - bordercolor - #F0F10 - borderalpha - 1 - bordersoft - 0 - borderwidth - 6 - rectcolor - #0 - rectalpha - 0 - rectsoft - 0 - rectform - 1 - shadowcolor - #7F7F7F - shadowalpha - 0 - shadowsoft - 0 - shadowx - 2 - shadowy - 2 - framerate - 25 - - folderpath - - prefix - - moviepath - - movieoffset - 00:00:00:00 - moviesyncoption - - pagesetup - - titlelist -"); - XmlNode node = doc.CreateElement("string"); - node.InnerText = sb.ToString().Trim() + Environment.NewLine + Environment.NewLine; - doc.DocumentElement.AppendChild(node); - - return ToUtf8XmlString(doc).Replace("\r\n", "\n"); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - var sb = new StringBuilder(); - foreach (var line in lines) - { - sb.AppendLine(line); - } - var doc = new XmlDocument { XmlResolver = null }; - try - { - doc.LoadXml(sb.ToString()); - if (doc.DocumentElement == null || doc.DocumentElement.Name != "xmldict" || doc.DocumentElement.SelectSingleNode("string") == null) - { - return; - } - } - catch (Exception) - { - _errorCount = 1; - return; - } - - string text = null; - string keyName = string.Empty; - foreach (XmlNode node in doc.DocumentElement.ChildNodes) - { - if (node.Name == "key") - { - keyName = node.InnerText; - } - else if (node.Name == "string" && keyName == "titlelist") - { - text = node.InnerText; - break; - } - } - if (text == null) - { - return; - } - - subtitle.Paragraphs.Clear(); - Paragraph paragraph = null; - sb.Clear(); - foreach (string line in text.Split(Utilities.NewLineChars)) - { - if (RegexTimeCode.IsMatch(line)) - { - string[] parts = line.Substring(4, 11).Split(SplitCharColon, StringSplitOptions.RemoveEmptyEntries); - if (parts.Length == 4) - { - try - { - if (paragraph != null && !string.IsNullOrWhiteSpace(sb.ToString())) - { - paragraph.Text = DecodeText(sb); - } - - var start = DecodeTimeCodeFramesFourParts(parts); - parts = line.Substring(16, 11).Split(SplitCharColon, StringSplitOptions.RemoveEmptyEntries); - var end = DecodeTimeCodeFramesFourParts(parts); - paragraph = new Paragraph { StartTime = start, EndTime = end }; - subtitle.Paragraphs.Add(paragraph); - sb.Clear(); - } - catch - { - _errorCount++; - } - } - } - else if (RegexFileNum.IsMatch(line)) - { - continue; // skip Belle-Nuit's numbering lines ("/file 0001") - } - else if (paragraph != null) - { - sb.AppendLine(line); - } - else - { - _errorCount++; - } - } - if (paragraph != null && !string.IsNullOrWhiteSpace(sb.ToString())) - { - paragraph.Text = DecodeText(sb); - } - subtitle.Renumber(); - } - - private static string EncodeText(string s) - { - s = HtmlUtil.RemoveOpenCloseTags(s, HtmlUtil.TagBold, HtmlUtil.TagUnderline, HtmlUtil.TagFont); - if (s.StartsWith("{\\an3}", StringComparison.Ordinal) || s.StartsWith("{\\an6}", StringComparison.Ordinal)) - { - s = "/STYLE RIGHT" + Environment.NewLine + s.Remove(0, 6).Trim(); - } - - if (s.StartsWith("{\\an1}", StringComparison.Ordinal) || s.StartsWith("{\\an4}", StringComparison.Ordinal)) - { - s = "/STYLE LEFT" + Environment.NewLine + s.Remove(0, 6).Trim(); - } - - if (s.StartsWith("{\\an7}", StringComparison.Ordinal) || s.StartsWith("{\\an8}", StringComparison.Ordinal) || s.StartsWith("{\\an9}", StringComparison.Ordinal)) - { - s = "/STYLE VERTICAL(-25)" + Environment.NewLine + s.Remove(0, 6).Trim(); - } - - if (s.StartsWith("{\\an2}", StringComparison.Ordinal) || s.StartsWith("{\\an5}", StringComparison.Ordinal)) - { - s = s.Remove(0, 6).Trim(); - } - - return s; - } - - private static string DecodeText(StringBuilder sb) - { - var s = sb.ToString().Trim(); - s = s.Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine).Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); - if (s.StartsWith("/STYLE RIGHT" + Environment.NewLine, StringComparison.Ordinal)) - { - s = "{\\an3}" + s.Remove(0, 12).Trim(); - } - - if (s.StartsWith("/STYLE LEFT" + Environment.NewLine, StringComparison.Ordinal)) - { - s = "{\\an1}" + s.Remove(0, 11).Trim(); - } - - if (s.StartsWith("/STYLE TOP" + Environment.NewLine, StringComparison.Ordinal)) - { - s = "{\\an8}" + s.Remove(0, 10).Trim(); - } - - if (s.StartsWith("/STYLE VERTICAL(-25)" + Environment.NewLine, StringComparison.Ordinal)) - { - s = "{\\an8}" + s.Remove(0, 20).Trim(); - } - - if (s.StartsWith("/STYLE VERTICAL(-24)" + Environment.NewLine, StringComparison.Ordinal)) - { - s = "{\\an8}" + s.Remove(0, 20).Trim(); - } - - if (s.StartsWith("/STYLE VERTICAL(-23)" + Environment.NewLine, StringComparison.Ordinal)) - { - s = "{\\an8}" + s.Remove(0, 20).Trim(); - } - - if (s.StartsWith("/STYLE VERTICAL(-22)" + Environment.NewLine, StringComparison.Ordinal)) - { - s = "{\\an8}" + s.Remove(0, 20).Trim(); - } - - if (s.StartsWith("/STYLE VERTICAL(-21)" + Environment.NewLine, StringComparison.Ordinal)) - { - s = "{\\an8}" + s.Remove(0, 20).Trim(); - } - - if (s.StartsWith("/STYLE VERTICAL(-20)" + Environment.NewLine, StringComparison.Ordinal)) - { - s = "{\\an8}" + s.Remove(0, 20).Trim(); - } - - if (s.StartsWith("/STYLE VERTICAL(-19)" + Environment.NewLine, StringComparison.Ordinal)) - { - s = "{\\an8}" + s.Remove(0, 20).Trim(); - } - - if (s.StartsWith("/STYLE VERTICAL(-18)" + Environment.NewLine, StringComparison.Ordinal)) - { - s = "{\\an5}" + s.Remove(0, 20).Trim(); - } - - if (s.StartsWith("/STYLE VERTICAL(-17)" + Environment.NewLine, StringComparison.Ordinal)) - { - s = "{\\an5}" + s.Remove(0, 20).Trim(); - } - - if (s.StartsWith("/STYLE VERTICAL(-16)" + Environment.NewLine, StringComparison.Ordinal)) - { - s = "{\\an5}" + s.Remove(0, 20).Trim(); - } - - if (s.StartsWith("/STYLE VERTICAL(-15)" + Environment.NewLine, StringComparison.Ordinal)) - { - s = "{\\an5}" + s.Remove(0, 20).Trim(); - } - - if (s.StartsWith("/STYLE VERTICAL(-14)" + Environment.NewLine, StringComparison.Ordinal)) - { - s = "{\\an5}" + s.Remove(0, 20).Trim(); - } - - if (s.StartsWith("/STYLE VERTICAL(-13)" + Environment.NewLine, StringComparison.Ordinal)) - { - s = "{\\an5}" + s.Remove(0, 20).Trim(); - } - - if (s.StartsWith("/STYLE VERTICAL(-12)" + Environment.NewLine, StringComparison.Ordinal)) - { - s = "{\\an5}" + s.Remove(0, 20).Trim(); - } - - if (s.StartsWith("/STYLE VERTICAL(-11)" + Environment.NewLine, StringComparison.Ordinal)) - { - s = "{\\an5}" + s.Remove(0, 20).Trim(); - } - - if (s.StartsWith("/STYLE VERTICAL(-10)" + Environment.NewLine, StringComparison.Ordinal)) - { - s = "{\\an5}" + s.Remove(0, 20).Trim(); - } - - s = HtmlUtil.FixInvalidItalicTags(s); - return s; - } - - private static string EncodeTimeCode(TimeCode time) - { - return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}:{MillisecondsToFramesMaxFrameRate(time.Milliseconds):00}"; - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class BelleNuitSubtitler : SubtitleFormat + { + ///tc 00:00:35:09 00:00:38:05 + private static readonly Regex RegexTimeCode = new Regex(@"^\/tc \d\d:\d\d:\d\d:\d\d \d\d:\d\d:\d\d:\d\d", RegexOptions.Compiled); + private static readonly Regex RegexFileNum = new Regex(@"^\/file\s+\d+$", RegexOptions.Compiled); + + public override string Extension => ".stp"; + + public override string Name => "Belle Nuit Subtitler"; + + public override string ToText(Subtitle subtitle, string title) + { + const string paragraphWriteFormat = "/tc {0} {1}{2}{3}{2}"; + + var sb = new StringBuilder(); + foreach (Paragraph p in subtitle.Paragraphs) + { + sb.AppendLine(string.Format(paragraphWriteFormat, EncodeTimeCode(p.StartTime), EncodeTimeCode(p.EndTime), Environment.NewLine, EncodeText(p.Text))); + } + + var doc = new XmlDocument { XmlResolver = null }; + doc.LoadXml("" + Environment.NewLine + @" + document + + creator + SICT + type + STLI + version + 1.4 + applicationversion + Belle Nuit Subtitler 1.7.8 + creationdate + 2012-03-13 16:30:32 + modificationdate + 2012-03-13 16:30:32 + + mainleft + 40 + maintop + 48 + mainwidth + 825 + mainheight + 886 + styledt + + exportdt + + previewdt + + moviedt + + exportformat + TIFF + style + + font + Geneva + size + 26 + spacing + 1 + leading + 7 + bold + + italic + + underline + + vertical + 486 + halin + 1 + valign + 2 + standard + PAL + height + 576 + width + 720 + widthreal + 768 + antialiasing + 4 + left + 40 + right + 680 + wrapmethod + 2 + interlaced + + textcolor + #FBFFF2 + textalpha + 1 + textsoft + 0 + bordercolor + #F0F10 + borderalpha + 1 + bordersoft + 0 + borderwidth + 6 + rectcolor + #0 + rectalpha + 0 + rectsoft + 0 + rectform + 1 + shadowcolor + #7F7F7F + shadowalpha + 0 + shadowsoft + 0 + shadowx + 2 + shadowy + 2 + framerate + 25 + + folderpath + + prefix + + moviepath + + movieoffset + 00:00:00:00 + moviesyncoption + + pagesetup + + titlelist +"); + XmlNode node = doc.CreateElement("string"); + node.InnerText = sb.ToString().Trim() + Environment.NewLine + Environment.NewLine; + doc.DocumentElement.AppendChild(node); + + return ToUtf8XmlString(doc).Replace("\r\n", "\n"); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + var sb = new StringBuilder(); + foreach (var line in lines) + { + sb.AppendLine(line); + } + var doc = new XmlDocument { XmlResolver = null }; + try + { + doc.LoadXml(sb.ToString()); + if (doc.DocumentElement == null || doc.DocumentElement.Name != "xmldict" || doc.DocumentElement.SelectSingleNode("string") == null) + { + return; + } + } + catch (Exception) + { + _errorCount = 1; + return; + } + + string text = null; + string keyName = string.Empty; + foreach (XmlNode node in doc.DocumentElement.ChildNodes) + { + if (node.Name == "key") + { + keyName = node.InnerText; + } + else if (node.Name == "string" && keyName == "titlelist") + { + text = node.InnerText; + break; + } + } + if (text == null) + { + return; + } + + subtitle.Paragraphs.Clear(); + Paragraph paragraph = null; + sb.Clear(); + foreach (string line in text.Split(Utilities.NewLineChars)) + { + if (RegexTimeCode.IsMatch(line)) + { + string[] parts = line.Substring(4, 11).Split(SplitCharColon, StringSplitOptions.RemoveEmptyEntries); + if (parts.Length == 4) + { + try + { + if (paragraph != null && !string.IsNullOrWhiteSpace(sb.ToString())) + { + paragraph.Text = DecodeText(sb); + } + + var start = DecodeTimeCodeFramesFourParts(parts); + parts = line.Substring(16, 11).Split(SplitCharColon, StringSplitOptions.RemoveEmptyEntries); + var end = DecodeTimeCodeFramesFourParts(parts); + paragraph = new Paragraph { StartTime = start, EndTime = end }; + subtitle.Paragraphs.Add(paragraph); + sb.Clear(); + } + catch + { + _errorCount++; + } + } + } + else if (RegexFileNum.IsMatch(line)) + { + continue; // skip Belle-Nuit's numbering lines ("/file 0001") + } + else if (paragraph != null) + { + sb.AppendLine(line); + } + else + { + _errorCount++; + } + } + if (paragraph != null && !string.IsNullOrWhiteSpace(sb.ToString())) + { + paragraph.Text = DecodeText(sb); + } + subtitle.Renumber(); + } + + private static string EncodeText(string s) + { + s = HtmlUtil.RemoveOpenCloseTags(s, HtmlUtil.TagBold, HtmlUtil.TagUnderline, HtmlUtil.TagFont); + if (s.StartsWith("{\\an3}", StringComparison.Ordinal) || s.StartsWith("{\\an6}", StringComparison.Ordinal)) + { + s = "/STYLE RIGHT" + Environment.NewLine + s.Remove(0, 6).Trim(); + } + + if (s.StartsWith("{\\an1}", StringComparison.Ordinal) || s.StartsWith("{\\an4}", StringComparison.Ordinal)) + { + s = "/STYLE LEFT" + Environment.NewLine + s.Remove(0, 6).Trim(); + } + + if (s.StartsWith("{\\an7}", StringComparison.Ordinal) || s.StartsWith("{\\an8}", StringComparison.Ordinal) || s.StartsWith("{\\an9}", StringComparison.Ordinal)) + { + s = "/STYLE VERTICAL(-25)" + Environment.NewLine + s.Remove(0, 6).Trim(); + } + + if (s.StartsWith("{\\an2}", StringComparison.Ordinal) || s.StartsWith("{\\an5}", StringComparison.Ordinal)) + { + s = s.Remove(0, 6).Trim(); + } + + return s; + } + + private static string DecodeText(StringBuilder sb) + { + var s = sb.ToString().Trim(); + s = s.Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine).Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); + if (s.StartsWith("/STYLE RIGHT" + Environment.NewLine, StringComparison.Ordinal)) + { + s = "{\\an3}" + s.Remove(0, 12).Trim(); + } + + if (s.StartsWith("/STYLE LEFT" + Environment.NewLine, StringComparison.Ordinal)) + { + s = "{\\an1}" + s.Remove(0, 11).Trim(); + } + + if (s.StartsWith("/STYLE TOP" + Environment.NewLine, StringComparison.Ordinal)) + { + s = "{\\an8}" + s.Remove(0, 10).Trim(); + } + + if (s.StartsWith("/STYLE VERTICAL(-25)" + Environment.NewLine, StringComparison.Ordinal)) + { + s = "{\\an8}" + s.Remove(0, 20).Trim(); + } + + if (s.StartsWith("/STYLE VERTICAL(-24)" + Environment.NewLine, StringComparison.Ordinal)) + { + s = "{\\an8}" + s.Remove(0, 20).Trim(); + } + + if (s.StartsWith("/STYLE VERTICAL(-23)" + Environment.NewLine, StringComparison.Ordinal)) + { + s = "{\\an8}" + s.Remove(0, 20).Trim(); + } + + if (s.StartsWith("/STYLE VERTICAL(-22)" + Environment.NewLine, StringComparison.Ordinal)) + { + s = "{\\an8}" + s.Remove(0, 20).Trim(); + } + + if (s.StartsWith("/STYLE VERTICAL(-21)" + Environment.NewLine, StringComparison.Ordinal)) + { + s = "{\\an8}" + s.Remove(0, 20).Trim(); + } + + if (s.StartsWith("/STYLE VERTICAL(-20)" + Environment.NewLine, StringComparison.Ordinal)) + { + s = "{\\an8}" + s.Remove(0, 20).Trim(); + } + + if (s.StartsWith("/STYLE VERTICAL(-19)" + Environment.NewLine, StringComparison.Ordinal)) + { + s = "{\\an8}" + s.Remove(0, 20).Trim(); + } + + if (s.StartsWith("/STYLE VERTICAL(-18)" + Environment.NewLine, StringComparison.Ordinal)) + { + s = "{\\an5}" + s.Remove(0, 20).Trim(); + } + + if (s.StartsWith("/STYLE VERTICAL(-17)" + Environment.NewLine, StringComparison.Ordinal)) + { + s = "{\\an5}" + s.Remove(0, 20).Trim(); + } + + if (s.StartsWith("/STYLE VERTICAL(-16)" + Environment.NewLine, StringComparison.Ordinal)) + { + s = "{\\an5}" + s.Remove(0, 20).Trim(); + } + + if (s.StartsWith("/STYLE VERTICAL(-15)" + Environment.NewLine, StringComparison.Ordinal)) + { + s = "{\\an5}" + s.Remove(0, 20).Trim(); + } + + if (s.StartsWith("/STYLE VERTICAL(-14)" + Environment.NewLine, StringComparison.Ordinal)) + { + s = "{\\an5}" + s.Remove(0, 20).Trim(); + } + + if (s.StartsWith("/STYLE VERTICAL(-13)" + Environment.NewLine, StringComparison.Ordinal)) + { + s = "{\\an5}" + s.Remove(0, 20).Trim(); + } + + if (s.StartsWith("/STYLE VERTICAL(-12)" + Environment.NewLine, StringComparison.Ordinal)) + { + s = "{\\an5}" + s.Remove(0, 20).Trim(); + } + + if (s.StartsWith("/STYLE VERTICAL(-11)" + Environment.NewLine, StringComparison.Ordinal)) + { + s = "{\\an5}" + s.Remove(0, 20).Trim(); + } + + if (s.StartsWith("/STYLE VERTICAL(-10)" + Environment.NewLine, StringComparison.Ordinal)) + { + s = "{\\an5}" + s.Remove(0, 20).Trim(); + } + + s = HtmlUtil.FixInvalidItalicTags(s); + return s; + } + + private static string EncodeTimeCode(TimeCode time) + { + return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}:{MillisecondsToFramesMaxFrameRate(time.Milliseconds):00}"; + } + + } +} diff --git a/libse/SubtitleFormats/Bilibili.cs b/src/libse/SubtitleFormats/Bilibili.cs similarity index 100% rename from libse/SubtitleFormats/Bilibili.cs rename to src/libse/SubtitleFormats/Bilibili.cs diff --git a/libse/SubtitleFormats/CapMakerPlus.cs b/src/libse/SubtitleFormats/CapMakerPlus.cs similarity index 98% rename from libse/SubtitleFormats/CapMakerPlus.cs rename to src/libse/SubtitleFormats/CapMakerPlus.cs index aaa0123b8..c501c7653 100644 --- a/libse/SubtitleFormats/CapMakerPlus.cs +++ b/src/libse/SubtitleFormats/CapMakerPlus.cs @@ -1,277 +1,277 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class CapMakerPlus : SubtitleFormat - { - private static readonly Regex RegexTimeCodes = new Regex(@"^\d\d:\d\d:\d\d:\d\d$", RegexOptions.Compiled); - - public override string Extension => ".cap"; - - public const string NameOfFormat = "CapMaker Plus"; - - public override string Name => NameOfFormat; - - public static void Save(string fileName, Subtitle subtitle) - { - Paragraph p; - int gridDataCount = subtitle.Paragraphs.Count; - for (int i = 0; i < subtitle.Paragraphs.Count; i++) - { - p = subtitle.Paragraphs[i]; - Paragraph next = subtitle.GetParagraphOrDefault(i + 1); - if (next != null && next.StartTime.TotalMilliseconds - p.EndTime.TotalMilliseconds > 100) - { - gridDataCount++; - } - } - - var buffer = new byte[] { 0x2B, 0x27, 0xF, 0x3C, 0x43, 0x61, 0x70, 0x4D, 0x61, 0x6B, 0x65, 0x72, 0x20, 0x50, 0x6C, 0x75, 0x73, 0x3E, 0x3, 0x2, 0x1, 0, 0, 0, 0, 0, 0, 0, 0x21, 0, 0, 0, 0, 0, 0, 0, 0x7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1, 0, 0, 0, 0x1, 0, 0, 0, 0x5, 0, 0, 0, 0x5, 0, 0, 0, 0x5, 0, 0, 0, 0x5, 0, 0, 0, 0x1, 0, 0, 0, 0x5E, 0x1, 0, 0, 0x1E, 0, 0, 0, 0x20, 0, 0, 0, 0x2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x7D, 0, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0, 0, 0x80, 0x80, 0x80, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0x1, 0, 0, 0, 0x1, 0, 0, 0, 0x48, 0, 0, 0, 0x30, 0, 0, 0, 0x48, 0, 0, 0, 0x30, 0, 0, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x80, 0, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0, 0, 0x80, 0x80, 0x80, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0x1, 0, 0, 0, 0x1, 0, 0, 0, 0x42, 0, 0, 0, 0x30, 0, 0, 0, 0x42, 0, 0, 0, 0x30, 0, 0, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x80, 0, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0, 0, 0x80, 0x80, 0x80, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0x1, 0, 0, 0, 0x1, 0, 0, 0, 0x48, 0, 0, 0, 0x30, 0, 0, 0, 0x48, 0, 0, 0, 0x30, 0, 0, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0x20, 0, 0x80, 0x80, 0x80, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0x1, 0, 0, 0, 0x2, 0, 0, 0, 0x48, 0, 0, 0, 0x30, 0, 0, 0, 0x48, 0, 0, 0, 0x30, 0, 0, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10, 0x10, 0x10, 0, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0, 0, 0x80, 0x80, 0x80, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0x1, 0, 0, 0, 0x1, 0, 0, 0, 0x48, 0, 0, 0, 0x30, 0, 0, 0, 0x48, 0, 0, 0, 0x30, 0, 0, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x80, 0, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0, 0, 0x80, 0x80, 0x80, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0x1, 0, 0, 0, 0x1, 0, 0, 0, 0x48, 0, 0, 0, 0x30, 0, 0, 0, 0x48, 0, 0, 0, 0x30, 0, 0, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0, 0, 0x80, 0x80, 0x80, 0, 0x1, 0, 0, 0, 0xFF, 0, 0, 0, 0x1, 0, 0, 0, 0x1, 0, 0, 0, 0x48, 0, 0, 0, 0x30, 0, 0, 0, 0x48, 0, 0, 0, 0x30, 0, 0, 0, 0x1, 0, 0, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x40, 0x40, 0x40, 0, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0, 0, 0x80, 0x80, 0x80, 0, 0x1, 0, 0, 0, 0xFF, 0, 0, 0, 0x1, 0, 0, 0, 0x2, 0, 0, 0, 0x48, 0, 0, 0, 0x30, 0, 0, 0, 0x48, 0, 0, 0, 0x30, 0, 0, 0, 0x1, 0, 0, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0x1, 0, 0x9, 0, 0x43, 0x47, 0x72, 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, 0x3, 0x2, 0x25, 0, 0, 0, 0, 0, 0, 0, 0x9, 0x4C, 0x61, 0x6E, 0x67, 0x75, 0x61, 0x67, 0x65, 0x31, 0x1, 0, 0xFF, 0, 0x1, 0, 0, 0, 0, 0, 0, 0x80, 0xBF, 0, 0, 0, 0xC0, 0x2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x9, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x2E, 0x63, 0x61, 0x70, 0x9, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x2E, 0x63, 0x61, 0x70, 0x1F, 0x44, 0x3A, 0x5C, 0x43, 0x70, 0x63, 0x57, 0x69, 0x6E, 0x5C, 0x37, 0x30, 0x30, 0x5C, 0x53, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x73, 0x5C, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x2E, 0x74, 0x78, 0x74, 0x3C, 0, 0, 0, 0x5, 0x41, 0x72, 0x69, 0x61, 0x6C, 0, 0, 0, 0x40, 0xE0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3C, 0, 0, 0, 0xB, 0x43, 0x6F, 0x75, 0x72, 0x69, 0x65, 0x72, 0x20, 0x4E, 0x65, 0x77, 0, 0, 0, 0x40, 0xB4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1, 0, 0, 0, 0x1, 0, 0, 0, 0x1, 0, 0, 0, 0x1, 0, 0, 0, 0xF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFB, 0xFF, 0x4, 0, 0xC, 0, 0, 0, 0x1E, 0, 0x1E, 0, 0x1E, 0, 0x1E, 0, 0x1E, 0, 0x1E, 0, 0x1E, 0, 0x1E, 0, 0x1E, 0, 0x1E, 0, 0x1E, 0, 0x1E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3, 0, 0, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x40, 0x1, 0, 0, 0xF0, 0, 0, 0, 0x1, 0, 0, 0, 0x1, 0, 0, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0x14, 0, 0, 0, 0xA, 0, 0, 0, 0x14, 0, 0, 0, 0xA, 0, 0, 0, 0, 0, 0, 0x9, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x2E, 0x63, 0x61, 0x70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0 }; - buffer[1400] = (byte)(gridDataCount % 256); // paragraphs - low byte - buffer[1401] = (byte)(gridDataCount / 256); // paragraphs - high byte - - using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write)) - { - fs.Write(buffer, 0, buffer.Length); - - p = null; - for (int i = 0; i < subtitle.Paragraphs.Count; i++) - { - p = subtitle.Paragraphs[i]; - Paragraph next = subtitle.GetParagraphOrDefault(i + 1); - - WriteTime(fs, p.StartTime); - - buffer = new byte[] { - // styles 00 00 80 BF 00 00 00 C0 02 00 01 00 - 0, - 0, - 0x80, //horizontal align, 0x80BF= center, 0x0000=left, 0x00c0=right - 0xBF, - 0, - 0, - 0, - 0xC0, // vertical Position: C0=bottom, 0=top - 2, //justification, 1=left, 2=center - 0, - 1, //1=normal font, 3=italic - 0 - }; - - string text = p.Text; - if (text.StartsWith("{\\a6}", StringComparison.Ordinal)) - { - text = p.Text.Remove(0, 5); - buffer[7] = 0; // align top - } - else if (text.StartsWith("{\\a1}", StringComparison.Ordinal)) - { - text = p.Text.Remove(0, 5); - buffer[2] = 0; // align left - buffer[3] = 0; // align left - } - else if (text.StartsWith("{\\a3}", StringComparison.Ordinal)) - { - text = p.Text.Remove(0, 5); - buffer[2] = 0; // align right - buffer[3] = 0xc0; // align right - } - else if (text.StartsWith("{\\a5}", StringComparison.Ordinal)) - { - text = p.Text.Remove(0, 5); - buffer[7] = 0; // align top - buffer[2] = 0; // align left - buffer[3] = 0; // align left - } - else if (text.StartsWith("{\\a7}", StringComparison.Ordinal)) - { - text = p.Text.Remove(0, 5); - buffer[7] = 0; // align top - buffer[2] = 0; // align right - buffer[3] = 0xc0; // align right - } - - if (text.StartsWith("", StringComparison.Ordinal) && text.EndsWith("", StringComparison.Ordinal)) - { - buffer[10] = 3; - } - - fs.Write(buffer, 0, buffer.Length); - - text = HtmlUtil.RemoveHtmlTags(text); - if (text.Length > 118) - { - text = text.Substring(0, 118); - } - - fs.WriteByte((byte)(text.Length)); - buffer = Encoding.GetEncoding(1252).GetBytes(text); - fs.Write(buffer, 0, buffer.Length); - - for (int j = 0; j < 74; j++) - { - fs.WriteByte(0); - } - - if (next != null && next.StartTime.TotalMilliseconds - p.EndTime.TotalMilliseconds > 100) - { - // write empty end - WriteTime(fs, p.EndTime); - buffer = new byte[] { 0, 0, 0, 0xC0, 0, 0, 0, 0, 0x01, 0, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - fs.Write(buffer, 0, buffer.Length); - } - } - if (p != null) - { - WriteTime(fs, p.EndTime); - buffer = new byte[] { 0, 0, 0x80, 0xBF, 0, 0, 0, 0xC0, 0x02, 0, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x40, 0x40, 0x40, 0, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0, 0, 0x80, 0x80, 0x80, 0, 0x01, 0, 0, 0, 0xFF, 0, 0, 0, 0x01, 0, 0, 0, 0x02, 0, 0, 0, 0x48, 0, 0, 0, 0x30, 0, 0, 0, 0x48, 0, 0, 0, 0x30, 0, 0, 0, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - fs.Write(buffer, 0, buffer.Length); - } - } - } - - private static void WriteTime(FileStream fs, TimeCode timeCode) - { - fs.WriteByte(0xb); - byte[] buffer = Encoding.ASCII.GetBytes(timeCode.ToHHMMSSFF()); - fs.Write(buffer, 0, buffer.Length); - } - - public override bool IsMine(List lines, string fileName) - { - if (!string.IsNullOrEmpty(fileName) && File.Exists(fileName)) - { - var fi = new FileInfo(fileName); - if (fi.Length >= 640 && fi.Length < 1024000) // not too small or too big - { - if (fileName.EndsWith(".cap", StringComparison.OrdinalIgnoreCase)) - { - byte[] buffer = FileUtil.ReadAllBytesShared(fileName); - if (buffer[0] == 0x2b) // "+" - { - return true; - } - } - } - } - return false; - } - - public override string ToText(Subtitle subtitle, string title) - { - return "Not supported!"; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - subtitle.Paragraphs.Clear(); - subtitle.Header = null; - byte[] buffer = FileUtil.ReadAllBytesShared(fileName); - - int i = 128; - Paragraph last = null; - while (i < buffer.Length - 20) - { - if (buffer[i] == 0x0b) - { - string timeCode = Encoding.ASCII.GetString(buffer, i + 1, 11); - if (timeCode != "00:00:00:00" && RegexTimeCodes.IsMatch(timeCode)) - { - var p = new Paragraph { StartTime = DecodeTimeCodeFramesFourParts(timeCode.Split(':')) }; - bool italic = buffer[i + 22] == 3; // 3=italic, 1=normal - int textStart = i + 25; // text starts 25 chars after time code - int textLength = 0; - while (textStart + textLength < buffer.Length && buffer[textStart + textLength] != 0) - { - textLength++; - } - if (textLength > 0) - { - p.Text = Encoding.GetEncoding(1252).GetString(buffer, textStart, textLength); - int rtIndex = p.Text.IndexOf("{\\rtf1", StringComparison.Ordinal); - if (rtIndex >= 0 && rtIndex < 10) - { - p.Text = p.Text.Substring(rtIndex).FromRtf(); - } - else if (italic) - { - p.Text = "" + p.Text + ""; - } - } - else - { - p.Text = string.Empty; - } - last = p; - subtitle.Paragraphs.Add(p); - } - } - i++; - } - if (last != null) - { - last.EndTime.TotalMilliseconds = last.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(last.Text); - } - - for (i = 0; i < subtitle.Paragraphs.Count - 1; i++) - { - subtitle.Paragraphs[i].EndTime.TotalMilliseconds = subtitle.Paragraphs[i + 1].StartTime.TotalMilliseconds; - } - for (i = subtitle.Paragraphs.Count - 1; i >= 0; i--) - { - if (string.IsNullOrEmpty(subtitle.Paragraphs[i].Text)) - { - subtitle.Paragraphs.RemoveAt(i); - } - } - - var deletes = new List(); - for (i = 0; i < subtitle.Paragraphs.Count - 1; i++) - { - if (subtitle.Paragraphs[i].StartTime.TotalMilliseconds == subtitle.Paragraphs[i + 1].StartTime.TotalMilliseconds) - { - subtitle.Paragraphs[i].Text += Environment.NewLine + subtitle.Paragraphs[i + 1].Text; - subtitle.Paragraphs[i].EndTime = subtitle.Paragraphs[i + 1].EndTime; - deletes.Add(i + 1); - } - } - subtitle.RemoveParagraphsByIndices(deletes); - - for (i = 0; i < subtitle.Paragraphs.Count - 1; i++) - { - if (subtitle.Paragraphs[i].StartTime.TotalMilliseconds == subtitle.Paragraphs[i + 1].StartTime.TotalMilliseconds) - { - } - else if (subtitle.Paragraphs[i].EndTime.TotalMilliseconds == subtitle.Paragraphs[i + 1].StartTime.TotalMilliseconds) - { - subtitle.Paragraphs[i].EndTime.TotalMilliseconds = subtitle.Paragraphs[i + 1].StartTime.TotalMilliseconds - 1; - } - } - subtitle.Renumber(); - - // adjust all times - if (buffer.Length > 1364) - { - try - { - string adjust = Encoding.GetEncoding(1252).GetString(buffer, 1354, 11); // 00:59:59:28 - TimeCode tc = DecodeTimeCodeFramesFourParts(adjust.Split(':')); - if (tc.TotalMilliseconds > 0) - { - subtitle.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(-tc.TotalMilliseconds)); - } - } - catch - { - // ignored - } - } - } - - } -} +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class CapMakerPlus : SubtitleFormat + { + private static readonly Regex RegexTimeCodes = new Regex(@"^\d\d:\d\d:\d\d:\d\d$", RegexOptions.Compiled); + + public override string Extension => ".cap"; + + public const string NameOfFormat = "CapMaker Plus"; + + public override string Name => NameOfFormat; + + public static void Save(string fileName, Subtitle subtitle) + { + Paragraph p; + int gridDataCount = subtitle.Paragraphs.Count; + for (int i = 0; i < subtitle.Paragraphs.Count; i++) + { + p = subtitle.Paragraphs[i]; + Paragraph next = subtitle.GetParagraphOrDefault(i + 1); + if (next != null && next.StartTime.TotalMilliseconds - p.EndTime.TotalMilliseconds > 100) + { + gridDataCount++; + } + } + + var buffer = new byte[] { 0x2B, 0x27, 0xF, 0x3C, 0x43, 0x61, 0x70, 0x4D, 0x61, 0x6B, 0x65, 0x72, 0x20, 0x50, 0x6C, 0x75, 0x73, 0x3E, 0x3, 0x2, 0x1, 0, 0, 0, 0, 0, 0, 0, 0x21, 0, 0, 0, 0, 0, 0, 0, 0x7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1, 0, 0, 0, 0x1, 0, 0, 0, 0x5, 0, 0, 0, 0x5, 0, 0, 0, 0x5, 0, 0, 0, 0x5, 0, 0, 0, 0x1, 0, 0, 0, 0x5E, 0x1, 0, 0, 0x1E, 0, 0, 0, 0x20, 0, 0, 0, 0x2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x7D, 0, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0, 0, 0x80, 0x80, 0x80, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0x1, 0, 0, 0, 0x1, 0, 0, 0, 0x48, 0, 0, 0, 0x30, 0, 0, 0, 0x48, 0, 0, 0, 0x30, 0, 0, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x80, 0, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0, 0, 0x80, 0x80, 0x80, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0x1, 0, 0, 0, 0x1, 0, 0, 0, 0x42, 0, 0, 0, 0x30, 0, 0, 0, 0x42, 0, 0, 0, 0x30, 0, 0, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x80, 0, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0, 0, 0x80, 0x80, 0x80, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0x1, 0, 0, 0, 0x1, 0, 0, 0, 0x48, 0, 0, 0, 0x30, 0, 0, 0, 0x48, 0, 0, 0, 0x30, 0, 0, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0x20, 0, 0x80, 0x80, 0x80, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0x1, 0, 0, 0, 0x2, 0, 0, 0, 0x48, 0, 0, 0, 0x30, 0, 0, 0, 0x48, 0, 0, 0, 0x30, 0, 0, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10, 0x10, 0x10, 0, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0, 0, 0x80, 0x80, 0x80, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0x1, 0, 0, 0, 0x1, 0, 0, 0, 0x48, 0, 0, 0, 0x30, 0, 0, 0, 0x48, 0, 0, 0, 0x30, 0, 0, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x80, 0, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0, 0, 0x80, 0x80, 0x80, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0x1, 0, 0, 0, 0x1, 0, 0, 0, 0x48, 0, 0, 0, 0x30, 0, 0, 0, 0x48, 0, 0, 0, 0x30, 0, 0, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0, 0, 0x80, 0x80, 0x80, 0, 0x1, 0, 0, 0, 0xFF, 0, 0, 0, 0x1, 0, 0, 0, 0x1, 0, 0, 0, 0x48, 0, 0, 0, 0x30, 0, 0, 0, 0x48, 0, 0, 0, 0x30, 0, 0, 0, 0x1, 0, 0, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x40, 0x40, 0x40, 0, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0, 0, 0x80, 0x80, 0x80, 0, 0x1, 0, 0, 0, 0xFF, 0, 0, 0, 0x1, 0, 0, 0, 0x2, 0, 0, 0, 0x48, 0, 0, 0, 0x30, 0, 0, 0, 0x48, 0, 0, 0, 0x30, 0, 0, 0, 0x1, 0, 0, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0x1, 0, 0x9, 0, 0x43, 0x47, 0x72, 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, 0x3, 0x2, 0x25, 0, 0, 0, 0, 0, 0, 0, 0x9, 0x4C, 0x61, 0x6E, 0x67, 0x75, 0x61, 0x67, 0x65, 0x31, 0x1, 0, 0xFF, 0, 0x1, 0, 0, 0, 0, 0, 0, 0x80, 0xBF, 0, 0, 0, 0xC0, 0x2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x9, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x2E, 0x63, 0x61, 0x70, 0x9, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x2E, 0x63, 0x61, 0x70, 0x1F, 0x44, 0x3A, 0x5C, 0x43, 0x70, 0x63, 0x57, 0x69, 0x6E, 0x5C, 0x37, 0x30, 0x30, 0x5C, 0x53, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x73, 0x5C, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x2E, 0x74, 0x78, 0x74, 0x3C, 0, 0, 0, 0x5, 0x41, 0x72, 0x69, 0x61, 0x6C, 0, 0, 0, 0x40, 0xE0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3C, 0, 0, 0, 0xB, 0x43, 0x6F, 0x75, 0x72, 0x69, 0x65, 0x72, 0x20, 0x4E, 0x65, 0x77, 0, 0, 0, 0x40, 0xB4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1, 0, 0, 0, 0x1, 0, 0, 0, 0x1, 0, 0, 0, 0x1, 0, 0, 0, 0xF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFB, 0xFF, 0x4, 0, 0xC, 0, 0, 0, 0x1E, 0, 0x1E, 0, 0x1E, 0, 0x1E, 0, 0x1E, 0, 0x1E, 0, 0x1E, 0, 0x1E, 0, 0x1E, 0, 0x1E, 0, 0x1E, 0, 0x1E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3, 0, 0, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x40, 0x1, 0, 0, 0xF0, 0, 0, 0, 0x1, 0, 0, 0, 0x1, 0, 0, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0x14, 0, 0, 0, 0xA, 0, 0, 0, 0x14, 0, 0, 0, 0xA, 0, 0, 0, 0, 0, 0, 0x9, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x2E, 0x63, 0x61, 0x70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xB, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0, 0, 0, 0 }; + buffer[1400] = (byte)(gridDataCount % 256); // paragraphs - low byte + buffer[1401] = (byte)(gridDataCount / 256); // paragraphs - high byte + + using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write)) + { + fs.Write(buffer, 0, buffer.Length); + + p = null; + for (int i = 0; i < subtitle.Paragraphs.Count; i++) + { + p = subtitle.Paragraphs[i]; + Paragraph next = subtitle.GetParagraphOrDefault(i + 1); + + WriteTime(fs, p.StartTime); + + buffer = new byte[] { + // styles 00 00 80 BF 00 00 00 C0 02 00 01 00 + 0, + 0, + 0x80, //horizontal align, 0x80BF= center, 0x0000=left, 0x00c0=right + 0xBF, + 0, + 0, + 0, + 0xC0, // vertical Position: C0=bottom, 0=top + 2, //justification, 1=left, 2=center + 0, + 1, //1=normal font, 3=italic + 0 + }; + + string text = p.Text; + if (text.StartsWith("{\\a6}", StringComparison.Ordinal)) + { + text = p.Text.Remove(0, 5); + buffer[7] = 0; // align top + } + else if (text.StartsWith("{\\a1}", StringComparison.Ordinal)) + { + text = p.Text.Remove(0, 5); + buffer[2] = 0; // align left + buffer[3] = 0; // align left + } + else if (text.StartsWith("{\\a3}", StringComparison.Ordinal)) + { + text = p.Text.Remove(0, 5); + buffer[2] = 0; // align right + buffer[3] = 0xc0; // align right + } + else if (text.StartsWith("{\\a5}", StringComparison.Ordinal)) + { + text = p.Text.Remove(0, 5); + buffer[7] = 0; // align top + buffer[2] = 0; // align left + buffer[3] = 0; // align left + } + else if (text.StartsWith("{\\a7}", StringComparison.Ordinal)) + { + text = p.Text.Remove(0, 5); + buffer[7] = 0; // align top + buffer[2] = 0; // align right + buffer[3] = 0xc0; // align right + } + + if (text.StartsWith("", StringComparison.Ordinal) && text.EndsWith("", StringComparison.Ordinal)) + { + buffer[10] = 3; + } + + fs.Write(buffer, 0, buffer.Length); + + text = HtmlUtil.RemoveHtmlTags(text); + if (text.Length > 118) + { + text = text.Substring(0, 118); + } + + fs.WriteByte((byte)(text.Length)); + buffer = Encoding.GetEncoding(1252).GetBytes(text); + fs.Write(buffer, 0, buffer.Length); + + for (int j = 0; j < 74; j++) + { + fs.WriteByte(0); + } + + if (next != null && next.StartTime.TotalMilliseconds - p.EndTime.TotalMilliseconds > 100) + { + // write empty end + WriteTime(fs, p.EndTime); + buffer = new byte[] { 0, 0, 0, 0xC0, 0, 0, 0, 0, 0x01, 0, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + fs.Write(buffer, 0, buffer.Length); + } + } + if (p != null) + { + WriteTime(fs, p.EndTime); + buffer = new byte[] { 0, 0, 0x80, 0xBF, 0, 0, 0, 0xC0, 0x02, 0, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x40, 0x40, 0x40, 0, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0, 0, 0x80, 0x80, 0x80, 0, 0x01, 0, 0, 0, 0xFF, 0, 0, 0, 0x01, 0, 0, 0, 0x02, 0, 0, 0, 0x48, 0, 0, 0, 0x30, 0, 0, 0, 0x48, 0, 0, 0, 0x30, 0, 0, 0, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + fs.Write(buffer, 0, buffer.Length); + } + } + } + + private static void WriteTime(FileStream fs, TimeCode timeCode) + { + fs.WriteByte(0xb); + byte[] buffer = Encoding.ASCII.GetBytes(timeCode.ToHHMMSSFF()); + fs.Write(buffer, 0, buffer.Length); + } + + public override bool IsMine(List lines, string fileName) + { + if (!string.IsNullOrEmpty(fileName) && File.Exists(fileName)) + { + var fi = new FileInfo(fileName); + if (fi.Length >= 640 && fi.Length < 1024000) // not too small or too big + { + if (fileName.EndsWith(".cap", StringComparison.OrdinalIgnoreCase)) + { + byte[] buffer = FileUtil.ReadAllBytesShared(fileName); + if (buffer[0] == 0x2b) // "+" + { + return true; + } + } + } + } + return false; + } + + public override string ToText(Subtitle subtitle, string title) + { + return "Not supported!"; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + subtitle.Paragraphs.Clear(); + subtitle.Header = null; + byte[] buffer = FileUtil.ReadAllBytesShared(fileName); + + int i = 128; + Paragraph last = null; + while (i < buffer.Length - 20) + { + if (buffer[i] == 0x0b) + { + string timeCode = Encoding.ASCII.GetString(buffer, i + 1, 11); + if (timeCode != "00:00:00:00" && RegexTimeCodes.IsMatch(timeCode)) + { + var p = new Paragraph { StartTime = DecodeTimeCodeFramesFourParts(timeCode.Split(':')) }; + bool italic = buffer[i + 22] == 3; // 3=italic, 1=normal + int textStart = i + 25; // text starts 25 chars after time code + int textLength = 0; + while (textStart + textLength < buffer.Length && buffer[textStart + textLength] != 0) + { + textLength++; + } + if (textLength > 0) + { + p.Text = Encoding.GetEncoding(1252).GetString(buffer, textStart, textLength); + int rtIndex = p.Text.IndexOf("{\\rtf1", StringComparison.Ordinal); + if (rtIndex >= 0 && rtIndex < 10) + { + p.Text = p.Text.Substring(rtIndex).FromRtf(); + } + else if (italic) + { + p.Text = "" + p.Text + ""; + } + } + else + { + p.Text = string.Empty; + } + last = p; + subtitle.Paragraphs.Add(p); + } + } + i++; + } + if (last != null) + { + last.EndTime.TotalMilliseconds = last.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(last.Text); + } + + for (i = 0; i < subtitle.Paragraphs.Count - 1; i++) + { + subtitle.Paragraphs[i].EndTime.TotalMilliseconds = subtitle.Paragraphs[i + 1].StartTime.TotalMilliseconds; + } + for (i = subtitle.Paragraphs.Count - 1; i >= 0; i--) + { + if (string.IsNullOrEmpty(subtitle.Paragraphs[i].Text)) + { + subtitle.Paragraphs.RemoveAt(i); + } + } + + var deletes = new List(); + for (i = 0; i < subtitle.Paragraphs.Count - 1; i++) + { + if (subtitle.Paragraphs[i].StartTime.TotalMilliseconds == subtitle.Paragraphs[i + 1].StartTime.TotalMilliseconds) + { + subtitle.Paragraphs[i].Text += Environment.NewLine + subtitle.Paragraphs[i + 1].Text; + subtitle.Paragraphs[i].EndTime = subtitle.Paragraphs[i + 1].EndTime; + deletes.Add(i + 1); + } + } + subtitle.RemoveParagraphsByIndices(deletes); + + for (i = 0; i < subtitle.Paragraphs.Count - 1; i++) + { + if (subtitle.Paragraphs[i].StartTime.TotalMilliseconds == subtitle.Paragraphs[i + 1].StartTime.TotalMilliseconds) + { + } + else if (subtitle.Paragraphs[i].EndTime.TotalMilliseconds == subtitle.Paragraphs[i + 1].StartTime.TotalMilliseconds) + { + subtitle.Paragraphs[i].EndTime.TotalMilliseconds = subtitle.Paragraphs[i + 1].StartTime.TotalMilliseconds - 1; + } + } + subtitle.Renumber(); + + // adjust all times + if (buffer.Length > 1364) + { + try + { + string adjust = Encoding.GetEncoding(1252).GetString(buffer, 1354, 11); // 00:59:59:28 + TimeCode tc = DecodeTimeCodeFramesFourParts(adjust.Split(':')); + if (tc.TotalMilliseconds > 0) + { + subtitle.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(-tc.TotalMilliseconds)); + } + } + catch + { + // ignored + } + } + } + + } +} diff --git a/libse/SubtitleFormats/Cappella.cs b/src/libse/SubtitleFormats/Cappella.cs similarity index 100% rename from libse/SubtitleFormats/Cappella.cs rename to src/libse/SubtitleFormats/Cappella.cs diff --git a/libse/SubtitleFormats/CaptionAssistant.cs b/src/libse/SubtitleFormats/CaptionAssistant.cs similarity index 97% rename from libse/SubtitleFormats/CaptionAssistant.cs rename to src/libse/SubtitleFormats/CaptionAssistant.cs index ad33004a1..47dc9c78a 100644 --- a/libse/SubtitleFormats/CaptionAssistant.cs +++ b/src/libse/SubtitleFormats/CaptionAssistant.cs @@ -1,156 +1,156 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class CaptionAssistant : SubtitleFormat - { - public override string Extension => ".cac"; - - public override string Name => "Caption Assistant"; - - private static string ToTimeCode(TimeCode time) - { - return time.ToHHMMSSFF(); - } - - private static TimeCode DecodeTimeCode(string s) - { - var parts = s.Split(new[] { ':', ';' }, StringSplitOptions.RemoveEmptyEntries); - var hour = int.Parse(parts[0]); - var minutes = int.Parse(parts[1]); - var seconds = int.Parse(parts[2]); - var frames = int.Parse(parts[3]); - - int milliseconds = (int)Math.Round(((TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate) * frames)); - if (milliseconds > 999) - { - milliseconds = 999; - } - - return new TimeCode(hour, minutes, seconds, milliseconds); - } - - public override string ToText(Subtitle subtitle, string title) - { - string xmlStructure = - "" + Environment.NewLine + - ""; - - var xml = new XmlDocument(); - xml.LoadXml(xmlStructure); - xml.XmlResolver = null; - var cd = xml.DocumentElement.SelectSingleNode("CaptionData"); - foreach (Paragraph p in subtitle.Paragraphs) - { - XmlNode paragraph = xml.CreateElement("CaptionDetail"); - - XmlAttribute start = xml.CreateAttribute("PositionIn"); - start.InnerText = ToTimeCode(p.StartTime); - paragraph.Attributes.Append(start); - - XmlAttribute end = xml.CreateAttribute("PositionOut"); - end.InnerText = ToTimeCode(p.EndTime); - paragraph.Attributes.Append(end); - - XmlAttribute text = xml.CreateAttribute("CaptionText"); - text.InnerText = HtmlUtil.RemoveHtmlTags(p.Text, true); - paragraph.Attributes.Append(text); - - XmlAttribute align = xml.CreateAttribute("Align"); - if (p.Text.StartsWith("{\\an1}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an4}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an7}", StringComparison.Ordinal)) - { - align.InnerText = "Left"; - } - else if (p.Text.StartsWith("{\\an3}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an6}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an9}", StringComparison.Ordinal)) - { - align.InnerText = "Right"; - } - else - { - align.InnerText = "Center"; - } - - paragraph.Attributes.Append(align); - - XmlAttribute captionType = xml.CreateAttribute("CaptionType"); - captionType.InnerText = "608CC1"; - paragraph.Attributes.Append(captionType); - - cd.AppendChild(paragraph); - } - - return ToUtf8XmlString(xml); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - - string allText = sb.ToString(); - if (!allText.Contains("") || !allText.Contains("")) - { - return; - } - - var xml = new XmlDocument { XmlResolver = null }; - try - { - xml.LoadXml(allText); - } - catch (Exception exception) - { - System.Diagnostics.Debug.WriteLine(exception.Message); - _errorCount = 1; - return; - } - - if (xml.DocumentElement == null) - { - _errorCount = 1; - return; - } - - foreach (XmlNode node in xml.DocumentElement.SelectNodes("CaptionData/CaptionDetail")) - { - try - { - if (node.Attributes != null) - { - string text = node.Attributes.GetNamedItem("CaptionText").InnerText.Trim(); - - if (node.Attributes.GetNamedItem("Align") != null) - { - string align = node.Attributes.GetNamedItem("Align").InnerText.Trim(); - if (align.Equals("left", StringComparison.OrdinalIgnoreCase)) - { - text = "{\\an1}" + text; - } - else if (align.Equals("right", StringComparison.OrdinalIgnoreCase)) - { - text = "{\\an3}" + text; - } - } - - string start = node.Attributes.GetNamedItem("PositionIn").InnerText; - string end = node.Attributes.GetNamedItem("PositionOut").InnerText; - subtitle.Paragraphs.Add(new Paragraph(DecodeTimeCode(start), DecodeTimeCode(end), text)); - } - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine(ex.Message); - _errorCount++; - } - } - subtitle.Renumber(); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class CaptionAssistant : SubtitleFormat + { + public override string Extension => ".cac"; + + public override string Name => "Caption Assistant"; + + private static string ToTimeCode(TimeCode time) + { + return time.ToHHMMSSFF(); + } + + private static TimeCode DecodeTimeCode(string s) + { + var parts = s.Split(new[] { ':', ';' }, StringSplitOptions.RemoveEmptyEntries); + var hour = int.Parse(parts[0]); + var minutes = int.Parse(parts[1]); + var seconds = int.Parse(parts[2]); + var frames = int.Parse(parts[3]); + + int milliseconds = (int)Math.Round(((TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate) * frames)); + if (milliseconds > 999) + { + milliseconds = 999; + } + + return new TimeCode(hour, minutes, seconds, milliseconds); + } + + public override string ToText(Subtitle subtitle, string title) + { + string xmlStructure = + "" + Environment.NewLine + + ""; + + var xml = new XmlDocument(); + xml.LoadXml(xmlStructure); + xml.XmlResolver = null; + var cd = xml.DocumentElement.SelectSingleNode("CaptionData"); + foreach (Paragraph p in subtitle.Paragraphs) + { + XmlNode paragraph = xml.CreateElement("CaptionDetail"); + + XmlAttribute start = xml.CreateAttribute("PositionIn"); + start.InnerText = ToTimeCode(p.StartTime); + paragraph.Attributes.Append(start); + + XmlAttribute end = xml.CreateAttribute("PositionOut"); + end.InnerText = ToTimeCode(p.EndTime); + paragraph.Attributes.Append(end); + + XmlAttribute text = xml.CreateAttribute("CaptionText"); + text.InnerText = HtmlUtil.RemoveHtmlTags(p.Text, true); + paragraph.Attributes.Append(text); + + XmlAttribute align = xml.CreateAttribute("Align"); + if (p.Text.StartsWith("{\\an1}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an4}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an7}", StringComparison.Ordinal)) + { + align.InnerText = "Left"; + } + else if (p.Text.StartsWith("{\\an3}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an6}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an9}", StringComparison.Ordinal)) + { + align.InnerText = "Right"; + } + else + { + align.InnerText = "Center"; + } + + paragraph.Attributes.Append(align); + + XmlAttribute captionType = xml.CreateAttribute("CaptionType"); + captionType.InnerText = "608CC1"; + paragraph.Attributes.Append(captionType); + + cd.AppendChild(paragraph); + } + + return ToUtf8XmlString(xml); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + + string allText = sb.ToString(); + if (!allText.Contains("") || !allText.Contains("")) + { + return; + } + + var xml = new XmlDocument { XmlResolver = null }; + try + { + xml.LoadXml(allText); + } + catch (Exception exception) + { + System.Diagnostics.Debug.WriteLine(exception.Message); + _errorCount = 1; + return; + } + + if (xml.DocumentElement == null) + { + _errorCount = 1; + return; + } + + foreach (XmlNode node in xml.DocumentElement.SelectNodes("CaptionData/CaptionDetail")) + { + try + { + if (node.Attributes != null) + { + string text = node.Attributes.GetNamedItem("CaptionText").InnerText.Trim(); + + if (node.Attributes.GetNamedItem("Align") != null) + { + string align = node.Attributes.GetNamedItem("Align").InnerText.Trim(); + if (align.Equals("left", StringComparison.OrdinalIgnoreCase)) + { + text = "{\\an1}" + text; + } + else if (align.Equals("right", StringComparison.OrdinalIgnoreCase)) + { + text = "{\\an3}" + text; + } + } + + string start = node.Attributes.GetNamedItem("PositionIn").InnerText; + string end = node.Attributes.GetNamedItem("PositionOut").InnerText; + subtitle.Paragraphs.Add(new Paragraph(DecodeTimeCode(start), DecodeTimeCode(end), text)); + } + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine(ex.Message); + _errorCount++; + } + } + subtitle.Renumber(); + } + + } +} diff --git a/libse/SubtitleFormats/Captionate.cs b/src/libse/SubtitleFormats/Captionate.cs similarity index 97% rename from libse/SubtitleFormats/Captionate.cs rename to src/libse/SubtitleFormats/Captionate.cs index 319fece29..970e69ba3 100644 --- a/libse/SubtitleFormats/Captionate.cs +++ b/src/libse/SubtitleFormats/Captionate.cs @@ -1,165 +1,165 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class Captionate : SubtitleFormat - { - public override string Extension => ".xml"; - - public const string NameOfFormat = "Captionate"; - - public override string Name => NameOfFormat; - - public override string ToText(Subtitle subtitle, string title) - { - const string xmlStructure = @" -hh:mm:ss:ff/30 -namesareprefixed - - - -Default - - -140 - - - - - - -"; - - var xml = new XmlDocument(); - xml.LoadXml(xmlStructure); - - Paragraph last = null; - foreach (Paragraph p in subtitle.Paragraphs) - { - if (last != null) - { - if (last.EndTime.TotalMilliseconds + 500 < p.StartTime.TotalMilliseconds) - { - var blank = new Paragraph { StartTime = { TotalMilliseconds = last.EndTime.TotalMilliseconds } }; - AddParagraph(xml, blank); - } - } - - AddParagraph(xml, p); - last = p; - } - - return ToUtf8XmlString(xml, true); - } - - private static void AddParagraph(XmlDocument xml, Paragraph p) - { - XmlNode paragraph = xml.CreateElement("caption"); - - XmlAttribute start = xml.CreateAttribute("time"); - start.InnerText = EncodeTime(p.StartTime); - paragraph.Attributes.Append(start); - - if (!string.IsNullOrWhiteSpace(p.Text)) - { - XmlNode tracks = xml.CreateElement("tracks"); - paragraph.AppendChild(tracks); - - XmlNode track0 = xml.CreateElement("track0"); - track0.InnerText = HtmlUtil.RemoveHtmlTags(p.Text, true); - track0.InnerXml = track0.InnerXml.Replace(Environment.NewLine, "
"); - tracks.AppendChild(track0); - } - xml.DocumentElement.SelectSingleNode("captions").AppendChild(paragraph); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - string xmlString; - - if (lines == null && fileName != null) - { - xmlString = File.ReadAllText(fileName); - } - else if (lines != null) - { - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - xmlString = sb.ToString(); - } - else - { - return; - } - - if (!xmlString.Contains("") || !xmlString.Contains("")) - { - return; - } - - var xml = new XmlDocument { XmlResolver = null }; - try - { - xml.LoadXml(xmlString); - } - catch - { - _errorCount = 1; - return; - } - - Paragraph p = null; - foreach (XmlNode node in xml.DocumentElement.SelectNodes("captions/caption")) - { - try - { - if (node.Attributes["time"] != null) - { - string start = node.Attributes["time"].InnerText; - double startMilliseconds = DecodeTimeToMilliseconds(start); - if (p != null) - { - p.EndTime.TotalMilliseconds = startMilliseconds - 1; - } - - if (node.SelectSingleNode("tracks/track0") != null) - { - string text = node.SelectSingleNode("tracks/track0").InnerText; - text = HtmlUtil.RemoveHtmlTags(text); - text = text.Replace("
", Environment.NewLine).Replace("
", Environment.NewLine).Replace("
", Environment.NewLine); - p = new Paragraph(text, startMilliseconds, startMilliseconds + 3000); - if (!string.IsNullOrWhiteSpace(text)) - { - subtitle.Paragraphs.Add(p); - } - } - } - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine(ex.Message); - _errorCount++; - } - } - subtitle.Renumber(); - } - - private static double DecodeTimeToMilliseconds(string time) - { - string[] parts = time.Split(SplitCharColon, StringSplitOptions.RemoveEmptyEntries); - return new TimeSpan(0, int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2]), (int)(int.Parse(parts[3]) * 10.0)).TotalMilliseconds; - } - - private static string EncodeTime(TimeCode time) - { - return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}:{time.Milliseconds / 10.0:00}"; - } - - } -} +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class Captionate : SubtitleFormat + { + public override string Extension => ".xml"; + + public const string NameOfFormat = "Captionate"; + + public override string Name => NameOfFormat; + + public override string ToText(Subtitle subtitle, string title) + { + const string xmlStructure = @" +hh:mm:ss:ff/30 +namesareprefixed + + + +Default + + +140 + + + + + + +"; + + var xml = new XmlDocument(); + xml.LoadXml(xmlStructure); + + Paragraph last = null; + foreach (Paragraph p in subtitle.Paragraphs) + { + if (last != null) + { + if (last.EndTime.TotalMilliseconds + 500 < p.StartTime.TotalMilliseconds) + { + var blank = new Paragraph { StartTime = { TotalMilliseconds = last.EndTime.TotalMilliseconds } }; + AddParagraph(xml, blank); + } + } + + AddParagraph(xml, p); + last = p; + } + + return ToUtf8XmlString(xml, true); + } + + private static void AddParagraph(XmlDocument xml, Paragraph p) + { + XmlNode paragraph = xml.CreateElement("caption"); + + XmlAttribute start = xml.CreateAttribute("time"); + start.InnerText = EncodeTime(p.StartTime); + paragraph.Attributes.Append(start); + + if (!string.IsNullOrWhiteSpace(p.Text)) + { + XmlNode tracks = xml.CreateElement("tracks"); + paragraph.AppendChild(tracks); + + XmlNode track0 = xml.CreateElement("track0"); + track0.InnerText = HtmlUtil.RemoveHtmlTags(p.Text, true); + track0.InnerXml = track0.InnerXml.Replace(Environment.NewLine, "
"); + tracks.AppendChild(track0); + } + xml.DocumentElement.SelectSingleNode("captions").AppendChild(paragraph); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + string xmlString; + + if (lines == null && fileName != null) + { + xmlString = File.ReadAllText(fileName); + } + else if (lines != null) + { + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + xmlString = sb.ToString(); + } + else + { + return; + } + + if (!xmlString.Contains("") || !xmlString.Contains("")) + { + return; + } + + var xml = new XmlDocument { XmlResolver = null }; + try + { + xml.LoadXml(xmlString); + } + catch + { + _errorCount = 1; + return; + } + + Paragraph p = null; + foreach (XmlNode node in xml.DocumentElement.SelectNodes("captions/caption")) + { + try + { + if (node.Attributes["time"] != null) + { + string start = node.Attributes["time"].InnerText; + double startMilliseconds = DecodeTimeToMilliseconds(start); + if (p != null) + { + p.EndTime.TotalMilliseconds = startMilliseconds - 1; + } + + if (node.SelectSingleNode("tracks/track0") != null) + { + string text = node.SelectSingleNode("tracks/track0").InnerText; + text = HtmlUtil.RemoveHtmlTags(text); + text = text.Replace("
", Environment.NewLine).Replace("
", Environment.NewLine).Replace("
", Environment.NewLine); + p = new Paragraph(text, startMilliseconds, startMilliseconds + 3000); + if (!string.IsNullOrWhiteSpace(text)) + { + subtitle.Paragraphs.Add(p); + } + } + } + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine(ex.Message); + _errorCount++; + } + } + subtitle.Renumber(); + } + + private static double DecodeTimeToMilliseconds(string time) + { + string[] parts = time.Split(SplitCharColon, StringSplitOptions.RemoveEmptyEntries); + return new TimeSpan(0, int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2]), (int)(int.Parse(parts[3]) * 10.0)).TotalMilliseconds; + } + + private static string EncodeTime(TimeCode time) + { + return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}:{time.Milliseconds / 10.0:00}"; + } + + } +} diff --git a/libse/SubtitleFormats/CaptionateMs.cs b/src/libse/SubtitleFormats/CaptionateMs.cs similarity index 97% rename from libse/SubtitleFormats/CaptionateMs.cs rename to src/libse/SubtitleFormats/CaptionateMs.cs index a57982704..300978750 100644 --- a/libse/SubtitleFormats/CaptionateMs.cs +++ b/src/libse/SubtitleFormats/CaptionateMs.cs @@ -1,145 +1,145 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Text; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class CaptionateMs : SubtitleFormat - { - public override string Extension => ".xml"; - - public override string Name => "Captionate MS"; - - public override string ToText(Subtitle subtitle, string title) - { - const string xmlStructure = @" -ms -namesareprefixed - - - -Default - - -140 - - - - - - -"; - - var xml = new XmlDocument(); - xml.LoadXml(xmlStructure); - - Paragraph last = null; - foreach (Paragraph p in subtitle.Paragraphs) - { - if (last != null) - { - if (last.EndTime.TotalMilliseconds + 500 < p.StartTime.TotalMilliseconds) - { - var blank = new Paragraph { StartTime = { TotalMilliseconds = last.EndTime.TotalMilliseconds } }; - AddParagraph(xml, blank); - } - } - - AddParagraph(xml, p); - last = p; - } - - return ToUtf8XmlString(xml, true); - } - - private static void AddParagraph(XmlDocument xml, Paragraph p) - { - XmlNode paragraph = xml.CreateElement("caption"); - - XmlAttribute start = xml.CreateAttribute("time"); - start.InnerText = EncodeTime(p.StartTime); - paragraph.Attributes.Append(start); - - if (!string.IsNullOrWhiteSpace(p.Text)) - { - XmlNode tracks = xml.CreateElement("tracks"); - paragraph.AppendChild(tracks); - - XmlNode track0 = xml.CreateElement("track0"); - track0.InnerText = HtmlUtil.RemoveHtmlTags(p.Text, true); - track0.InnerXml = track0.InnerXml.Replace(Environment.NewLine, "
"); - tracks.AppendChild(track0); - } - xml.DocumentElement.SelectSingleNode("captions").AppendChild(paragraph); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - - string xmlString = sb.ToString(); - if (!xmlString.Contains("") || !xmlString.Contains("")) - { - return; - } - - var xml = new XmlDocument { XmlResolver = null }; - try - { - xml.LoadXml(xmlString); - } - catch - { - _errorCount = 1; - return; - } - - Paragraph p = null; - foreach (XmlNode node in xml.DocumentElement.SelectNodes("captions/caption")) - { - try - { - if (node.Attributes["time"] != null) - { - string start = node.Attributes["time"].InnerText; - double startMilliseconds = double.Parse(start); - if (p != null) - { - p.EndTime.TotalMilliseconds = startMilliseconds - 1; - } - - if (node.SelectSingleNode("tracks/track0") != null) - { - string text = node.SelectSingleNode("tracks/track0").InnerText; - text = HtmlUtil.RemoveHtmlTags(text); - text = text.Replace("
", Environment.NewLine).Replace("
", Environment.NewLine).Replace("
", Environment.NewLine); - p = new Paragraph(text, startMilliseconds, startMilliseconds + 3000); - if (!string.IsNullOrWhiteSpace(text)) - { - subtitle.Paragraphs.Add(p); - } - } - } - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine(ex.Message); - _errorCount++; - } - } - subtitle.Renumber(); - } - - private static string EncodeTime(TimeCode time) - { - return time.TotalMilliseconds.ToString(CultureInfo.InvariantCulture); - } - - } -} +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class CaptionateMs : SubtitleFormat + { + public override string Extension => ".xml"; + + public override string Name => "Captionate MS"; + + public override string ToText(Subtitle subtitle, string title) + { + const string xmlStructure = @" +ms +namesareprefixed + + + +Default + + +140 + + + + + + +"; + + var xml = new XmlDocument(); + xml.LoadXml(xmlStructure); + + Paragraph last = null; + foreach (Paragraph p in subtitle.Paragraphs) + { + if (last != null) + { + if (last.EndTime.TotalMilliseconds + 500 < p.StartTime.TotalMilliseconds) + { + var blank = new Paragraph { StartTime = { TotalMilliseconds = last.EndTime.TotalMilliseconds } }; + AddParagraph(xml, blank); + } + } + + AddParagraph(xml, p); + last = p; + } + + return ToUtf8XmlString(xml, true); + } + + private static void AddParagraph(XmlDocument xml, Paragraph p) + { + XmlNode paragraph = xml.CreateElement("caption"); + + XmlAttribute start = xml.CreateAttribute("time"); + start.InnerText = EncodeTime(p.StartTime); + paragraph.Attributes.Append(start); + + if (!string.IsNullOrWhiteSpace(p.Text)) + { + XmlNode tracks = xml.CreateElement("tracks"); + paragraph.AppendChild(tracks); + + XmlNode track0 = xml.CreateElement("track0"); + track0.InnerText = HtmlUtil.RemoveHtmlTags(p.Text, true); + track0.InnerXml = track0.InnerXml.Replace(Environment.NewLine, "
"); + tracks.AppendChild(track0); + } + xml.DocumentElement.SelectSingleNode("captions").AppendChild(paragraph); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + + string xmlString = sb.ToString(); + if (!xmlString.Contains("") || !xmlString.Contains("")) + { + return; + } + + var xml = new XmlDocument { XmlResolver = null }; + try + { + xml.LoadXml(xmlString); + } + catch + { + _errorCount = 1; + return; + } + + Paragraph p = null; + foreach (XmlNode node in xml.DocumentElement.SelectNodes("captions/caption")) + { + try + { + if (node.Attributes["time"] != null) + { + string start = node.Attributes["time"].InnerText; + double startMilliseconds = double.Parse(start); + if (p != null) + { + p.EndTime.TotalMilliseconds = startMilliseconds - 1; + } + + if (node.SelectSingleNode("tracks/track0") != null) + { + string text = node.SelectSingleNode("tracks/track0").InnerText; + text = HtmlUtil.RemoveHtmlTags(text); + text = text.Replace("
", Environment.NewLine).Replace("
", Environment.NewLine).Replace("
", Environment.NewLine); + p = new Paragraph(text, startMilliseconds, startMilliseconds + 3000); + if (!string.IsNullOrWhiteSpace(text)) + { + subtitle.Paragraphs.Add(p); + } + } + } + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine(ex.Message); + _errorCount++; + } + } + subtitle.Renumber(); + } + + private static string EncodeTime(TimeCode time) + { + return time.TotalMilliseconds.ToString(CultureInfo.InvariantCulture); + } + + } +} diff --git a/libse/SubtitleFormats/CaptionsInc.cs b/src/libse/SubtitleFormats/CaptionsInc.cs similarity index 97% rename from libse/SubtitleFormats/CaptionsInc.cs rename to src/libse/SubtitleFormats/CaptionsInc.cs index 2a5ec45d7..c852662ff 100644 --- a/libse/SubtitleFormats/CaptionsInc.cs +++ b/src/libse/SubtitleFormats/CaptionsInc.cs @@ -1,264 +1,264 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class CaptionsInc : SubtitleFormat - { - public override string Extension => ".cin"; - - public override string Name => "Caption Inc"; - - public static void Save(string fileName, Subtitle subtitle) - { - using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write)) - { - string name = Path.GetFileNameWithoutExtension(fileName); - byte[] buffer = Encoding.ASCII.GetBytes(name); - for (int i = 0; i < buffer.Length && i < 8; i++) - { - fs.WriteByte(buffer[i]); - } - - while (fs.Length < 8) - { - fs.WriteByte(0x20); - } - - WriteTime(fs, subtitle.Paragraphs[0].StartTime, false); // first start time - WriteTime(fs, subtitle.Paragraphs[subtitle.Paragraphs.Count - 1].EndTime, false); // last end time - - buffer = Encoding.ASCII.GetBytes("Generic Unknown Unknown \"\" Unknown Unknown Unknown".PadRight(230, ' ')); - fs.Write(buffer, 0, buffer.Length); - - // paragraphs - foreach (Paragraph p in subtitle.Paragraphs) - { - buffer = new byte[] { 0x0D, 0x0A, 0xFE }; // header - fs.Write(buffer, 0, buffer.Length); - - // styles - var text = new List { 0x14, 0x20, 0x14, 0x2E, 0x14, 0x54, 0x17 }; - int noOfLines = Utilities.GetNumberOfLines(p.Text); - text.Add(noOfLines == 1 ? (byte)0x22 : (byte)0x21); - - var lines = p.Text.Split(Utilities.NewLineChars, StringSplitOptions.None); - foreach (string line in lines) - { - foreach (char ch in line) - { - text.Add(Encoding.GetEncoding(1252).GetBytes(new[] { ch })[0]); - } - text.Add(0x14); - text.Add(0x74); - } - - // codes+text length - buffer = Encoding.ASCII.GetBytes($"{text.Count:000}"); - fs.Write(buffer, 0, buffer.Length); - - WriteTime(fs, p.StartTime, true); - - // write codes + text - foreach (byte b in text) - { - fs.WriteByte(b); - } - - buffer = new byte[] { 0x14, 0x2F, 0x0D, 0x0A, 0xFE, 0x30, 0x30, 0x32, 0x30 }; - fs.Write(buffer, 0, buffer.Length); - WriteTime(fs, p.EndTime, true); - } - } - } - - private static void WriteTime(FileStream fs, TimeCode timeCode, bool addEndBytes) - { - var time = timeCode.ToHHMMSSFF(); - var buffer = Encoding.ASCII.GetBytes(time); - fs.Write(buffer, 0, buffer.Length); - if (addEndBytes) - { - fs.WriteByte(0xd); - fs.WriteByte(0xa); - } - } - - public override bool IsMine(List lines, string fileName) - { - if (!string.IsNullOrEmpty(fileName) && File.Exists(fileName)) - { - if (!fileName.EndsWith(".cin", StringComparison.OrdinalIgnoreCase)) - { - return false; - } - - return base.IsMine(lines, fileName); - } - return false; - } - - public override string ToText(Subtitle subtitle, string title) - { - return "Not supported!"; - } - - private static TimeCode DecodeTimestamp(string timeCode) - { - try - { - return new TimeCode(int.Parse(timeCode.Substring(0, 2)), int.Parse(timeCode.Substring(2, 2)), int.Parse(timeCode.Substring(4, 2)), FramesToMillisecondsMax999(int.Parse(timeCode.Substring(6, 2)))); - } - catch (Exception exception) - { - System.Diagnostics.Debug.WriteLine(exception.Message); - return new TimeCode(); - } - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - subtitle.Paragraphs.Clear(); - subtitle.Header = null; - byte[] buffer = FileUtil.ReadAllBytesShared(fileName); - - int i = 256; - Paragraph last = null; - while (i < buffer.Length - 20) - { - var p = new Paragraph(); - - while (buffer[i] != 0xfe && i < buffer.Length - 20) - { - i++; - } - if (buffer[i] == 0xfe) - { - i += 4; - string startTime = Encoding.ASCII.GetString(buffer, i, 8); - i += 8; - if (Utilities.IsInteger(startTime)) - { - p.StartTime = DecodeTimestamp(startTime); - } - } - - bool startFound = false; - bool textEnd = false; - while (!startFound && !textEnd && i < buffer.Length - 20) - { - bool skip = false; - if (buffer[i] == 0x0d) - { - i++; - } - else if (buffer[i] == 0x0a) - { - skip = true; - } - else if (buffer[i] == 0x14 && buffer[i + 1] == 0x2c) // text end - { - textEnd = true; - } - else if (buffer[i] <= 0x20) // text start - { - i++; - } - else - { - startFound = true; - } - - if (!skip) - { - i++; - } - } - i++; - - if (!textEnd) - { - i -= 2; - var sb = new StringBuilder(); - while (!textEnd && i < buffer.Length - 20) - { - if (buffer[i] == 0x14 && buffer[i + 1] == 0x2c) // text end - { - textEnd = true; - } - else if (buffer[i] == 0xd && buffer[i + 1] == 0xa) // text end - { - textEnd = true; - } - else if (buffer[i] <= 0x17) - { - if (!sb.ToString().EndsWith(Environment.NewLine, StringComparison.Ordinal)) - { - sb.Append(Environment.NewLine); - } - - i++; - } - else - { - sb.Append(Encoding.GetEncoding(1252).GetString(buffer, i, 1)); - } - - i++; - } - i++; - if (sb.Length > 0) - { - string text = sb.ToString().Trim(); - p.Text = text; - subtitle.Paragraphs.Add(p); - last = p; - } - } - - if (buffer[i] == 0xFE) - { - string endTime = Encoding.ASCII.GetString(buffer, i + 4, 8); - if (Utilities.IsInteger(endTime)) - { - p.EndTime = DecodeTimestamp(endTime); - } - while (i < buffer.Length && buffer[i] != 0xa) - { - i++; - } - - i++; - } - else - { - while (i < buffer.Length && buffer[i] != 0xa) - { - i++; - } - - i++; - - if (buffer[i] == 0xfe) - { - string endTime = Encoding.ASCII.GetString(buffer, i + 4, 8); - if (Utilities.IsInteger(endTime)) - { - p.EndTime = DecodeTimestamp(endTime); - } - } - } - } - if (last != null && last.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) - { - last.EndTime.TotalMilliseconds = last.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(last.Text); - } - - subtitle.Renumber(); - } - - } -} +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class CaptionsInc : SubtitleFormat + { + public override string Extension => ".cin"; + + public override string Name => "Caption Inc"; + + public static void Save(string fileName, Subtitle subtitle) + { + using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write)) + { + string name = Path.GetFileNameWithoutExtension(fileName); + byte[] buffer = Encoding.ASCII.GetBytes(name); + for (int i = 0; i < buffer.Length && i < 8; i++) + { + fs.WriteByte(buffer[i]); + } + + while (fs.Length < 8) + { + fs.WriteByte(0x20); + } + + WriteTime(fs, subtitle.Paragraphs[0].StartTime, false); // first start time + WriteTime(fs, subtitle.Paragraphs[subtitle.Paragraphs.Count - 1].EndTime, false); // last end time + + buffer = Encoding.ASCII.GetBytes("Generic Unknown Unknown \"\" Unknown Unknown Unknown".PadRight(230, ' ')); + fs.Write(buffer, 0, buffer.Length); + + // paragraphs + foreach (Paragraph p in subtitle.Paragraphs) + { + buffer = new byte[] { 0x0D, 0x0A, 0xFE }; // header + fs.Write(buffer, 0, buffer.Length); + + // styles + var text = new List { 0x14, 0x20, 0x14, 0x2E, 0x14, 0x54, 0x17 }; + int noOfLines = Utilities.GetNumberOfLines(p.Text); + text.Add(noOfLines == 1 ? (byte)0x22 : (byte)0x21); + + var lines = p.Text.Split(Utilities.NewLineChars, StringSplitOptions.None); + foreach (string line in lines) + { + foreach (char ch in line) + { + text.Add(Encoding.GetEncoding(1252).GetBytes(new[] { ch })[0]); + } + text.Add(0x14); + text.Add(0x74); + } + + // codes+text length + buffer = Encoding.ASCII.GetBytes($"{text.Count:000}"); + fs.Write(buffer, 0, buffer.Length); + + WriteTime(fs, p.StartTime, true); + + // write codes + text + foreach (byte b in text) + { + fs.WriteByte(b); + } + + buffer = new byte[] { 0x14, 0x2F, 0x0D, 0x0A, 0xFE, 0x30, 0x30, 0x32, 0x30 }; + fs.Write(buffer, 0, buffer.Length); + WriteTime(fs, p.EndTime, true); + } + } + } + + private static void WriteTime(FileStream fs, TimeCode timeCode, bool addEndBytes) + { + var time = timeCode.ToHHMMSSFF(); + var buffer = Encoding.ASCII.GetBytes(time); + fs.Write(buffer, 0, buffer.Length); + if (addEndBytes) + { + fs.WriteByte(0xd); + fs.WriteByte(0xa); + } + } + + public override bool IsMine(List lines, string fileName) + { + if (!string.IsNullOrEmpty(fileName) && File.Exists(fileName)) + { + if (!fileName.EndsWith(".cin", StringComparison.OrdinalIgnoreCase)) + { + return false; + } + + return base.IsMine(lines, fileName); + } + return false; + } + + public override string ToText(Subtitle subtitle, string title) + { + return "Not supported!"; + } + + private static TimeCode DecodeTimestamp(string timeCode) + { + try + { + return new TimeCode(int.Parse(timeCode.Substring(0, 2)), int.Parse(timeCode.Substring(2, 2)), int.Parse(timeCode.Substring(4, 2)), FramesToMillisecondsMax999(int.Parse(timeCode.Substring(6, 2)))); + } + catch (Exception exception) + { + System.Diagnostics.Debug.WriteLine(exception.Message); + return new TimeCode(); + } + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + subtitle.Paragraphs.Clear(); + subtitle.Header = null; + byte[] buffer = FileUtil.ReadAllBytesShared(fileName); + + int i = 256; + Paragraph last = null; + while (i < buffer.Length - 20) + { + var p = new Paragraph(); + + while (buffer[i] != 0xfe && i < buffer.Length - 20) + { + i++; + } + if (buffer[i] == 0xfe) + { + i += 4; + string startTime = Encoding.ASCII.GetString(buffer, i, 8); + i += 8; + if (Utilities.IsInteger(startTime)) + { + p.StartTime = DecodeTimestamp(startTime); + } + } + + bool startFound = false; + bool textEnd = false; + while (!startFound && !textEnd && i < buffer.Length - 20) + { + bool skip = false; + if (buffer[i] == 0x0d) + { + i++; + } + else if (buffer[i] == 0x0a) + { + skip = true; + } + else if (buffer[i] == 0x14 && buffer[i + 1] == 0x2c) // text end + { + textEnd = true; + } + else if (buffer[i] <= 0x20) // text start + { + i++; + } + else + { + startFound = true; + } + + if (!skip) + { + i++; + } + } + i++; + + if (!textEnd) + { + i -= 2; + var sb = new StringBuilder(); + while (!textEnd && i < buffer.Length - 20) + { + if (buffer[i] == 0x14 && buffer[i + 1] == 0x2c) // text end + { + textEnd = true; + } + else if (buffer[i] == 0xd && buffer[i + 1] == 0xa) // text end + { + textEnd = true; + } + else if (buffer[i] <= 0x17) + { + if (!sb.ToString().EndsWith(Environment.NewLine, StringComparison.Ordinal)) + { + sb.Append(Environment.NewLine); + } + + i++; + } + else + { + sb.Append(Encoding.GetEncoding(1252).GetString(buffer, i, 1)); + } + + i++; + } + i++; + if (sb.Length > 0) + { + string text = sb.ToString().Trim(); + p.Text = text; + subtitle.Paragraphs.Add(p); + last = p; + } + } + + if (buffer[i] == 0xFE) + { + string endTime = Encoding.ASCII.GetString(buffer, i + 4, 8); + if (Utilities.IsInteger(endTime)) + { + p.EndTime = DecodeTimestamp(endTime); + } + while (i < buffer.Length && buffer[i] != 0xa) + { + i++; + } + + i++; + } + else + { + while (i < buffer.Length && buffer[i] != 0xa) + { + i++; + } + + i++; + + if (buffer[i] == 0xfe) + { + string endTime = Encoding.ASCII.GetString(buffer, i + 4, 8); + if (Utilities.IsInteger(endTime)) + { + p.EndTime = DecodeTimestamp(endTime); + } + } + } + } + if (last != null && last.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) + { + last.EndTime.TotalMilliseconds = last.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(last.Text); + } + + subtitle.Renumber(); + } + + } +} diff --git a/libse/SubtitleFormats/CaraokeXml.cs b/src/libse/SubtitleFormats/CaraokeXml.cs similarity index 97% rename from libse/SubtitleFormats/CaraokeXml.cs rename to src/libse/SubtitleFormats/CaraokeXml.cs index 3ecc28bce..714799d71 100644 --- a/libse/SubtitleFormats/CaraokeXml.cs +++ b/src/libse/SubtitleFormats/CaraokeXml.cs @@ -1,96 +1,96 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class CaraokeXml : SubtitleFormat - { - public override string Extension => ".crk"; - - public override string Name => "Caraoke Xml"; - - public override string ToText(Subtitle subtitle, string title) - { - string xmlStructure = - "" + Environment.NewLine + - ""; - - var xml = new XmlDocument(); - xml.LoadXml(xmlStructure); - var paragraph = xml.DocumentElement.SelectSingleNode("paragraph"); - foreach (Paragraph p in subtitle.Paragraphs) - { - XmlNode item = xml.CreateElement("item"); - - var start = xml.CreateAttribute("tc1"); - start.InnerText = p.StartTime.TotalMilliseconds.ToString(System.Globalization.CultureInfo.InvariantCulture); - item.Attributes.Append(start); - - var end = xml.CreateAttribute("tc2"); - end.InnerText = p.EndTime.TotalMilliseconds.ToString(System.Globalization.CultureInfo.InvariantCulture); - item.Attributes.Append(end); - - var attr = xml.CreateAttribute("attr"); - attr.InnerText = string.Empty; - item.Attributes.Append(attr); - - item.InnerText = p.Text; - - paragraph.AppendChild(item); - } - - return ToUtf8XmlString(xml); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - - string xmlAsText = sb.ToString(); - - if (!xmlAsText.Contains(" ".crk"; + + public override string Name => "Caraoke Xml"; + + public override string ToText(Subtitle subtitle, string title) + { + string xmlStructure = + "" + Environment.NewLine + + ""; + + var xml = new XmlDocument(); + xml.LoadXml(xmlStructure); + var paragraph = xml.DocumentElement.SelectSingleNode("paragraph"); + foreach (Paragraph p in subtitle.Paragraphs) + { + XmlNode item = xml.CreateElement("item"); + + var start = xml.CreateAttribute("tc1"); + start.InnerText = p.StartTime.TotalMilliseconds.ToString(System.Globalization.CultureInfo.InvariantCulture); + item.Attributes.Append(start); + + var end = xml.CreateAttribute("tc2"); + end.InnerText = p.EndTime.TotalMilliseconds.ToString(System.Globalization.CultureInfo.InvariantCulture); + item.Attributes.Append(end); + + var attr = xml.CreateAttribute("attr"); + attr.InnerText = string.Empty; + item.Attributes.Append(attr); + + item.InnerText = p.Text; + + paragraph.AppendChild(item); + } + + return ToUtf8XmlString(xml); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + + string xmlAsText = sb.ToString(); + + if (!xmlAsText.Contains(" ArabicDictionary = new Dictionary - { - { 0x58, "م" }, - { 0x41, "ا" }, - { 0x4e, "ص" }, - { 0x42, "ب" }, - { 0x46, "ح" }, - { 0x57, "ل" }, - { 0x47, "خ" }, - { 0x5d, "ي" }, - { 0x4a, "ر" }, - { 0x2c, "،" }, - { 0x59, "ن" }, - { 0x5a, "و" }, - { 0x43, "ت" }, - { 0x1d, "-" }, - { 0x49, "ذ" }, - { 0x45, "ج" }, - { 0x5b, "ه" }, - { 0x56, "ك" }, - { 0x21, "؟" }, - { 0x4c, "س" }, - { 0x52, "ع" }, - { 0x5c, "ة" }, - { 0x5e, "ى" }, - { 0x61, "أ" }, - { 0x48, "د" }, - { 0x4d, "ش" }, - { 0x60, "ء" }, - { 0x68, "ﻷ" }, - { 0x54, "ف" }, - { 0x55, "ق" }, - { 0x22, "!" }, - { 0x67, "ﻻ" }, - { 0x66, "ؤ" }, - { 0x64, "آ" }, - { 0x50, "ط" }, - { 0x6a, "ﻵ" }, - { 0x4f, "ض" }, - { 0x6b, "ﺋ" }, - { 0x44, "ث" }, - { 0x51, "ظ" }, - { 0x53, "غ" }, - { 0x4b, "ز" }, - { 0x23, "\"" }, - { 0x6c, "ـ" }, - }; - - private static readonly List HebrewCodes = new List - { - 0x40, // א - 0x41, // ב - 0x42, // ג - 0x43, // ד - 0x44, // ה - 0x45, // ו - 0x46, // ז - 0x47, // ח - 0x49, // י - 0x4c, // ל - 0x4d, // ם - 0x4e, // מ - 0x4f, // ן - 0x50, // נ - 0x51, // ס - 0x52, // ע - 0x54, // פ - 0x56, // צ - 0x57, // ק - 0x58, // ר - 0x59, // ש - 0x5A, // ת - 0x4b, // כ - 0x4a, // ך - 0x48, // ט - 0x53, // ף - 0x55, // ץ - - 0xB1, // "a" - 0xB2, // "b" - 0xB3, // "c" - 0xB4, // "d" - 0xB5, // "e" - 0xB6, // "f" - 0xB7, // "g" - 0xB8, // "h" - 0xB9, // "i" - 0xBA, // "j" - 0xBB, // "k" - 0xBC, // "l" - 0xBD, // "m" - 0xBE, // "n" - 0xBF, // "o" - 0xC0, // "p" - 0xC1, // "q" - 0xC2, // "r" - 0xC3, // "s" - 0xC4, // "t" - 0xC5, // "u" - 0xC6, // "v" - 0xC7, // "w" - 0xC8, // "x" - 0xC9, // "y" - 0xCA, // "z" - - 0x91, // "A" - 0xDB, // "B" -- weird - 0x93, // "C" - 0xDC, // "D" -- weird - 0x95, // "E" - 0x96, // "F" - 0x97, // "G" - 0xAB, // "H" -- weird - 0x99, // "I" - 0x9A, // "J" - 0x9B, // "K" - 0x9C, // "L" - 0xDD, // "M" - 0xDE, // "N" - 0x9F, // "O" - 0xA0, // "P" - 0xA1, // "Q" - 0xA2, // "R" - 0xA3, // "S" - 0xA4, // "T" - 0xA5, // "U" - 0xA6, // "V" - 0xA7, // "W" - 0xA8, // "X" - weird - 0xA9, // "Y" - 0xAA, // "Z" - weird - }; - - private static readonly List HebrewLetters = new List - { - "א", - "ב", - "ג", - "ד", - "ה", - "ו", - "ז", - "ח", - "י", - "ל", - "ם", - "מ", - "ן", - "נ", - "ס", - "ע", - "פ", - "צ", - "ק", - "ר", - "ש", - "ת", - "כ", - "ך", - "ט", - "ף", - "ץ", - - "a", // 0xB1 - "b", // 0xB2 - "c", // 0xB3 - "d", // 0xB4 - "e", // 0xB5 - "f", // 0xB6 - "g", // 0xB7 - "h", // 0xB8 - "i", // 0xB9 - "j", // 0xBA - "k", // 0xBB - "l", // 0xBC - "m", // 0xBD - "n", // 0xBE - "o", // 0xBF - "p", // 0xC0 - "q", // 0xC1 - "r", // 0xC2 - "s", // 0xC3 - "t", // 0xC4 - "u", // 0xC5 - "v", // 0xC6 - "w", // 0xC7 - "x", // 0xC8 - "y", // 0xC9 - "z", // 0xCA - - "A", // 0x91, - "B", // 0xDB, - "C", // 0x93, - "D", // 0xDC, - "E", // 0x95, - "F", // 0x96, - "G", // 0x97, - "H", // 0xAB, - "I", // 0x99, - "J", // 0x9A, - "K", // 0x9B, - "L", // 0x9C, - "M", // 0xDD, - "N", // 0xDE, - "O", // 0x9F, - "P", // 0xA0, - "Q", // 0xA1, - "R", // 0xA2, - "S", // 0xA3, - "T", // 0xA4, - "U", // 0xA5, - "V", // 0xA6, - "W", // 0xA7, - "X", // 0xA8, - "Y", // 0xA9, - "Z", // 0xAA, - }; - - private static readonly List RussianCodes = new List - { - 0x42, // Б - 0x45, // Е - 0x5A, // З - 0x56, // В - 0x49, // И - 0x4E, // Н - 0x58, // Ы - 0x51, // Я - 0x56, // V - 0x53, // С - 0x72, // р - 0x69, // и - 0x71, // я - 0x6E, // н - 0x74, // т - 0x5C, // Э - 0x77, // ю - 0x46, // Ф - 0x5E, // Ч - 0x44, // Д - 0x62, // б - 0x73, // с - 0x75, // у - 0x64, // д - 0x60, // ж - 0x6A, // й - 0x6C, // л - 0x47, // Г - 0x78, // ы - 0x7A, // з - 0x7E, // ч - 0x6D, // м - 0x67, // г - 0x79, // ь - 0x70, // п - 0x76, // в - 0x55, // У - 0x7D, // щ - 0x66, // ф - 0x7C, // э - 0x7B, // ш - 0x50, // П - 0x52, // П - 0x68, // П - }; - - private static readonly List RussianLetters = new List - { - "Б", - "Е", - "З", - "В", - "И", - "Н", - "Ы", - "Я", - "V", - "С", - "р", - "и", - "я", - "н", - "т", - "Э", - "ю", - "Ф", - "Ч", - "Д", - "б", - "с", - "у", - "д", - "ж", - "й", - "л", - "Г", - "ы", - "з", - "ч", - "м", - "г", - "ь", - "п", - "в", - "У", - "щ", - "ф", - "э", - "ш", - "П", - "Р", - "х", - }; - - public override string Extension => ".890"; - - public const string NameOfFormat = "Cavena 890"; - - public override string Name => NameOfFormat; - - public override bool IsTimeBased => false; - - private int _languageIdLine1 = LanguageIdEnglish; - private int _languageIdLine2 = LanguageIdEnglish; - - public bool Save(string fileName, Subtitle subtitle, bool batchMode = false) - { - using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write)) - { - return Save(fileName, fs, subtitle, batchMode); - } - } - - public bool Save(string fileName, Stream stream, Subtitle subtitle, bool batchMode) - { - int russianCount = 0; - char[] logoGrams = { '的', '是', '啊', '吧', '好', '吧', '亲', '爱', '的', '早', '上' }; - char[] russianChars = { 'я', 'д', 'й', 'л', 'щ', 'ж', 'ц', 'ф', 'ы' }; - foreach (Paragraph p in subtitle.Paragraphs) - { - if (p.Text.Contains(logoGrams)) - { - _languageIdLine1 = LanguageIdChineseSimplified; - _languageIdLine2 = LanguageIdChineseSimplified; - break; - } - if (p.Text.Contains(russianChars)) - { - russianCount++; - if (russianCount > 10) - { - _languageIdLine1 = LanguageIdRussian; - _languageIdLine2 = LanguageIdRussian; // or 0x09? - break; - } - } - } - - if (Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId > 0) - { - _languageIdLine1 = Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId; - _languageIdLine2 = Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId; - } - else - { - var language = LanguageAutoDetect.AutoDetectGoogleLanguage(subtitle); - switch (language) - { - case "he": - _languageIdLine1 = LanguageIdHebrew; - _languageIdLine2 = LanguageIdHebrew; // or 0x09 - break; - case "ru": - _languageIdLine1 = LanguageIdRussian; - _languageIdLine2 = LanguageIdRussian; // or 0x09? - break; - case "zh": - _languageIdLine1 = LanguageIdChineseSimplified; - _languageIdLine2 = LanguageIdChineseSimplified; - break; - case "da": - _languageIdLine1 = LanguageIdDanish; - _languageIdLine2 = LanguageIdDanish; - break; - } - } - - // prompt??? - //if (Configuration.Settings.SubtitleSettings.CurrentCavena890LanguageIdLine1 >= 0) - // _languageIdLine1 = Configuration.Settings.SubtitleSettings.CurrentCavena890LanguageIdLine1; - //if (Configuration.Settings.SubtitleSettings.CurrentCavena890LanguageIdLine2 >= 0) - // _languageIdLine2 = Configuration.Settings.SubtitleSettings.CurrentCavena890LanguageIdLine2; - - // write file header (some fields are known, some are not...) - - stream.WriteByte(0); // ? - stream.WriteByte(0); // ? - - // tape number (20 bytes) - for (int i = 0; i < 20; i++) - { - stream.WriteByte(0); - } - - // ? - for (int i = 0; i < 18; i++) - { - stream.WriteByte(0); - } - - // translated programme title (28 bytes) - string title = Path.GetFileNameWithoutExtension(fileName) ?? string.Empty; - if (title.Length > 28) - { - title = title.Substring(0, 28); - } - - if (!string.IsNullOrWhiteSpace(Configuration.Settings.SubtitleSettings.CurrentCavena89Title) && Configuration.Settings.SubtitleSettings.CurrentCavena89Title.Length <= 28) - { - title = Configuration.Settings.SubtitleSettings.CurrentCavena89Title; - } - - var buffer = Encoding.ASCII.GetBytes(title); - stream.Write(buffer, 0, buffer.Length); - for (int i = 0; i < 28 - buffer.Length; i++) - { - stream.WriteByte(0); - } - - // translator (28 bytes) - if (!string.IsNullOrWhiteSpace(Configuration.Settings.SubtitleSettings.CurrentCavena890Translator) && Configuration.Settings.SubtitleSettings.CurrentCavena890Translator.Length <= 28) - { - buffer = Encoding.ASCII.GetBytes(Configuration.Settings.SubtitleSettings.CurrentCavena890Translator); - stream.Write(buffer, 0, buffer.Length); - for (int i = 0; i < 28 - buffer.Length; i++) - { - stream.WriteByte(0); - } - } - else - { - for (int i = 0; i < 28; i++) - { - stream.WriteByte(0); - } - } - - // ? - for (int i = 0; i < 9; i++) - { - stream.WriteByte(0); - } - - // translated episode title (11 bytes) - for (int i = 0; i < 11; i++) - { - stream.WriteByte(0); - } - - // ? - for (int i = 0; i < 18; i++) - { - stream.WriteByte(0); - } - - // ? + language codes - buffer = new byte[] { 0xA0, 0x05, 0x04, 0x03, 0x06, 0x06, 0x08, 0x90, 0x00, 0x00, 0x00, 0x00, (byte)_languageIdLine1, (byte)_languageIdLine2 }; - stream.Write(buffer, 0, buffer.Length); - - // comments (24 bytes) - buffer = Encoding.ASCII.GetBytes(""); - if (!string.IsNullOrWhiteSpace(Configuration.Settings.SubtitleSettings.CurrentCavena89Comment) && Configuration.Settings.SubtitleSettings.CurrentCavena89Comment.Length <= 24) - { - buffer = Encoding.ASCII.GetBytes(Configuration.Settings.SubtitleSettings.CurrentCavena89Comment); - } - - stream.Write(buffer, 0, buffer.Length); - for (int i = 0; i < 24 - buffer.Length; i++) - { - stream.WriteByte(0); - } - - // ?? - buffer = new byte[] { 0x08, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00 }; - stream.Write(buffer, 0, buffer.Length); - - // number of subtitles - stream.WriteByte((byte)(subtitle.Paragraphs.Count % 256)); - stream.WriteByte((byte)(subtitle.Paragraphs.Count / 256)); - - // write font - prefix with binary zeroes - buffer = GetFontBytesFromLanguageId(_languageIdLine1); // also TBX308VFONTL.V for english... - for (int i = 0; i < 14 - buffer.Length; i++) - { - stream.WriteByte(0); - } - - stream.Write(buffer, 0, buffer.Length); - - // ? - for (int i = 0; i < 13; i++) - { - stream.WriteByte(0); - } - - // number of subtitles again - stream.WriteByte((byte)(subtitle.Paragraphs.Count % 256)); - stream.WriteByte((byte)(subtitle.Paragraphs.Count / 256)); - - - // number of subtitles again again - stream.WriteByte((byte)(subtitle.Paragraphs.Count % 256)); - stream.WriteByte((byte)(subtitle.Paragraphs.Count / 256)); - - // ? - for (int i = 0; i < 6; i++) - { - stream.WriteByte(0); - } - - // original programme title (28 chars) - if (!string.IsNullOrWhiteSpace(Configuration.Settings.SubtitleSettings.CurrentCavena890riginalTitle) && Configuration.Settings.SubtitleSettings.CurrentCavena890riginalTitle.Length <= 28) - { - buffer = Encoding.ASCII.GetBytes(Configuration.Settings.SubtitleSettings.CurrentCavena890riginalTitle); - stream.Write(buffer, 0, buffer.Length); - for (int i = 0; i < 28 - buffer.Length; i++) - { - stream.WriteByte(0); - } - } - else - { - for (int i = 0; i < 28; i++) - { - stream.WriteByte(0); - } - } - - // write font (use same font id from line 1) - buffer = GetFontBytesFromLanguageId(_languageIdLine1); - stream.Write(buffer, 0, buffer.Length); - - // ? - stream.WriteByte(0x3d); - stream.WriteByte(0x8d); - - // start of message time - string startOfMessage = "10:00:00:00"; - if (Configuration.Settings.SubtitleSettings.Cavena890StartOfMessage != null && - Configuration.Settings.SubtitleSettings.Cavena890StartOfMessage.Length == startOfMessage.Length) - { - startOfMessage = Configuration.Settings.SubtitleSettings.Cavena890StartOfMessage; - } - - buffer = Encoding.ASCII.GetBytes(startOfMessage); - stream.Write(buffer, 0, buffer.Length); - - buffer = new byte[] - { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x54, 0x44 - }; - stream.Write(buffer, 0, buffer.Length); - - for (int i = 0; i < 92; i++) - { - stream.WriteByte(0); - } - - // paragraphs - int number = 16; - foreach (Paragraph p in subtitle.Paragraphs) - { - // number - stream.WriteByte((byte)(number / 256)); - stream.WriteByte((byte)(number % 256)); - - WriteTime(stream, p.StartTime); - WriteTime(stream, p.EndTime); - - if (p.Text.StartsWith("{\\an1}")) - { - stream.WriteByte(0x50); // left - } - else if (p.Text.StartsWith("{\\an3}")) - { - stream.WriteByte(0x52); // left - } - else - { - stream.WriteByte(0x54); // center - } - - buffer = new byte[] { 0, 0, 0, 0, 0, 0, 0 }; // 0x16 }; -- the last two bytes might be something with vertical alignment... - stream.Write(buffer, 0, buffer.Length); - - bool hasBox = Utilities.RemoveSsaTags(p.Text).StartsWith(""); - var text = p.Text.Replace("", string.Empty).Replace("", string.Empty); - text = HtmlUtil.RemoveOpenCloseTags(Utilities.RemoveSsaTags(text), HtmlUtil.TagBold, HtmlUtil.TagFont, HtmlUtil.TagBold); - WriteText(stream, text, p == subtitle.Paragraphs[subtitle.Paragraphs.Count - 1], _languageIdLine1, hasBox); - - number += 16; - } - return true; - } - - private static byte[] GetFontBytesFromLanguageId(int languageId) - { - var buffer = Encoding.ASCII.GetBytes("HLV23N.V"); - if (languageId == LanguageIdChineseTraditional || languageId == LanguageIdChineseSimplified) - { - buffer = Encoding.ASCII.GetBytes("CCKM44.V"); - } - else if (languageId == LanguageIdArabic) - { - buffer = Encoding.ASCII.GetBytes("ARA19N.V"); - } - else if (languageId == LanguageIdRussian) - { - buffer = Encoding.ASCII.GetBytes("KYRIL4.V"); - } - else if (languageId == LanguageIdHebrew) - { - buffer = Encoding.ASCII.GetBytes("HEBNOA.V"); - } - else if (languageId == LanguageIdDanish) - { - buffer = Encoding.ASCII.GetBytes("VFONTL.V"); - } - - return buffer; - } - - private static void WriteText(Stream fs, string text, bool isLast, int languageIdLine, bool useBox) - { - var lines = text.SplitToLines(); - if (lines.Count > 2) - { - lines = Utilities.AutoBreakLine(text).SplitToLines(); - } - - string line1 = string.Empty; - string line2; - if (lines.Count > 1) - { - line1 = lines[0]; - line2 = lines[1]; - } - else - { - line2 = lines[0]; - } - - var buffer = GetTextAsBytes(line1, languageIdLine); - fs.Write(buffer, 0, buffer.Length); - - buffer = new byte[] { 00, 00, 00, 00, 00, 00 }; - if (useBox) - { - buffer[3] = 0xa0; - } - - fs.Write(buffer, 0, buffer.Length); - - buffer = GetTextAsBytes(line2, languageIdLine); - fs.Write(buffer, 0, buffer.Length); - - buffer = new byte[] { 00, 00, 00, 00 }; - if (!isLast) - { - fs.Write(buffer, 0, buffer.Length); - } - } - - private static byte[] GetTextAsBytes(string text, int languageId) - { - var buffer = new byte[51]; - int skipCount = 0; - for (int i = 0; i < buffer.Length; i++) - { - buffer[i] = 0x7F; - } - - if (languageId == LanguageIdChineseTraditional || languageId == LanguageIdChineseSimplified) - { - for (int i = 0; i < buffer.Length; i++) - { - buffer[i] = 0; - } - } - else if (languageId == LanguageIdHebrew) - { - text = Utilities.ReverseNumbers(text); - if (!Configuration.Settings.General.RightToLeftMode) - { - text = Utilities.ReverseStartAndEndingForRightToLeft(text); - } - } - - var encoding = Encoding.Default; - int index = 0; - - if (languageId == LanguageIdHebrew) - { - text = ReverseAnsi(text); - } - - for (int i = 0; i < text.Length; i++) - { - var current = text[i]; - if (skipCount > 0) - { - skipCount--; - } - else if (languageId == LanguageIdHebrew) - { - int letterIndex = HebrewLetters.IndexOf(current.ToString(CultureInfo.InvariantCulture)); - if (letterIndex >= 0) - { - buffer[index] = (byte)HebrewCodes[letterIndex]; - } - else if (i + 3 < text.Length && text.Substring(i, 3) == "") - { - buffer[index] = 0x88; - skipCount = 2; - } - else if (i + 4 <= text.Length && text.Substring(i, 4) == "") - { - buffer[index] = 0x98; - skipCount = 2; - } - else - { - buffer[index] = encoding.GetBytes(new[] { current })[0]; - } - index++; - } - else if (languageId == LanguageIdChineseTraditional || languageId == LanguageIdChineseSimplified) - { - encoding = Encoding.GetEncoding(1201); - if (index < 49) - { - if (i + 3 < text.Length && text.Substring(i, 3) == "") - { - buffer[index] = 0x88; - skipCount = 2; - } - else if (i + 4 <= text.Length && text.Substring(i, 4) == "") - { - buffer[index] = 0x98; - skipCount = 3; - } - else - { - buffer[index] = encoding.GetBytes(new[] { current })[0]; - index++; - } - } - } - else - { - if (index < 50) - { - if (current == 'æ') - { - buffer[index] = 0x1B; - } - else if (current == 'ø') - { - buffer[index] = 0x1C; - } - else if (current == 'å') - { - buffer[index] = 0x1D; - } - else if (current == 'Æ') - { - buffer[index] = 0x5B; - } - else if (current == 'Ø') - { - buffer[index] = 0x5C; - } - else if (current == 'Å') - { - buffer[index] = 0x5D; - } - - // ăĂ şŞ ţŢ (romanian) - else if (current == 'ă') - { - AddTwo(buffer, ref index, 0x89, 0x61); - } - else if (current == 'Ă') - { - AddTwo(buffer, ref index, 0x89, 0x41); - } - else if (current == 'ş') - { - AddTwo(buffer, ref index, 0x87, 0x73); - } - else if (current == 'Ş') - { - AddTwo(buffer, ref index, 0x87, 0x53); - } - else if (current == 'ţ') - { - AddTwo(buffer, ref index, 0x87, 0x74); - } - else if (current == 'Ţ') - { - AddTwo(buffer, ref index, 0x87, 0x54); - } - - // Next mapping of diacritics is reverse engineered, - // and currently only maps characters from latin alphabets according to https://en.wikipedia.org/wiki/Latin_alphabets - - // capitals with accent grave - else if (current == 'À') - { - AddTwo(buffer, ref index, 0x81, 0x41); - } - else if (current == 'È') - { - AddTwo(buffer, ref index, 0x81, 0x45); - } - else if (current == 'Ì') - { - AddTwo(buffer, ref index, 0x81, 0x49); - } - else if (current == 'Ò') - { - AddTwo(buffer, ref index, 0x81, 0x4F); - } - else if (current == 'Ù') - { - AddTwo(buffer, ref index, 0x81, 0x55); - } - else if (current == 'Ẁ') - { - AddTwo(buffer, ref index, 0x81, 0x57); - } - - // lowercase with accent grave - else if (current == 'à') - { - AddTwo(buffer, ref index, 0x81, 0x61); - } - else if (current == 'è') - { - AddTwo(buffer, ref index, 0x81, 0x65); - } - else if (current == 'ì') - { - AddTwo(buffer, ref index, 0x81, 0x69); - } - else if (current == 'ò') - { - AddTwo(buffer, ref index, 0x81, 0x6F); - } - else if (current == 'ù') - { - AddTwo(buffer, ref index, 0x81, 0x75); - } - else if (current == 'ẁ') - { - AddTwo(buffer, ref index, 0x81, 0x75); - } - - // capitals with accent aigu - else if (current == 'Á') - { - AddTwo(buffer, ref index, 0x82, 0x41); - } - else if (current == 'Ć') - { - AddTwo(buffer, ref index, 0x82, 0x43); - } - else if (current == 'É') - { - AddTwo(buffer, ref index, 0x82, 0x45); - } - else if (current == 'Í') - { - AddTwo(buffer, ref index, 0x82, 0x49); - } - else if (current == 'Ĺ') - { - AddTwo(buffer, ref index, 0x82, 0x4C); - } - else if (current == 'Ń') - { - AddTwo(buffer, ref index, 0x82, 0x4E); - } - else if (current == 'Ó') - { - AddTwo(buffer, ref index, 0x82, 0x4F); - } - else if (current == 'Ŕ') - { - AddTwo(buffer, ref index, 0x82, 0x52); - } - else if (current == 'Ś') - { - AddTwo(buffer, ref index, 0x82, 0x53); - } - else if (current == 'Ú') - { - AddTwo(buffer, ref index, 0x82, 0x55); - } - else if (current == 'Ẃ') - { - AddTwo(buffer, ref index, 0x82, 0x57); - } - else if (current == 'Ý') - { - AddTwo(buffer, ref index, 0x82, 0x59); - } - else if (current == 'Ź') - { - AddTwo(buffer, ref index, 0x82, 0x5A); - } - - // lowercase with accent aigu - else if (current == 'á') - { - AddTwo(buffer, ref index, 0x82, 0x61); - } - else if (current == 'ć') - { - AddTwo(buffer, ref index, 0x82, 0x63); - } - else if (current == 'é') - { - AddTwo(buffer, ref index, 0x82, 0x65); - } - else if (current == 'í') - { - AddTwo(buffer, ref index, 0x82, 0x69); - } - else if (current == 'ĺ') - { - AddTwo(buffer, ref index, 0x82, 0x6C); - } - else if (current == 'ń') - { - AddTwo(buffer, ref index, 0x82, 0x6E); - } - else if (current == 'ó') - { - AddTwo(buffer, ref index, 0x82, 0x6F); - } - else if (current == 'ŕ') - { - AddTwo(buffer, ref index, 0x82, 0x72); - } - else if (current == 'ś') - { - AddTwo(buffer, ref index, 0x82, 0x73); - } - else if (current == 'ú') - { - AddTwo(buffer, ref index, 0x82, 0x75); - } - else if (current == 'ẃ') - { - AddTwo(buffer, ref index, 0x82, 0x77); - } - else if (current == 'ý') - { - AddTwo(buffer, ref index, 0x82, 0x79); - } - else if (current == 'ź') - { - AddTwo(buffer, ref index, 0x82, 0x7A); - } - - // capitals with accent circonflexe - else if (current == 'Â') - { - AddTwo(buffer, ref index, 0x83, 0x41); - } - else if (current == 'Ĉ') - { - AddTwo(buffer, ref index, 0x83, 0x43); - } - else if (current == 'Ê') - { - AddTwo(buffer, ref index, 0x83, 0x45); - } - else if (current == 'Ĝ') - { - AddTwo(buffer, ref index, 0x83, 0x47); - } - else if (current == 'Ĥ') - { - AddTwo(buffer, ref index, 0x83, 0x48); - } - else if (current == 'Î') - { - AddTwo(buffer, ref index, 0x83, 0x49); - } - else if (current == 'Ĵ') - { - AddTwo(buffer, ref index, 0x83, 0x4A); - } - else if (current == 'Ô') - { - AddTwo(buffer, ref index, 0x83, 0x4F); - } - else if (current == 'Ŝ') - { - AddTwo(buffer, ref index, 0x83, 0x53); - } - else if (current == 'Û') - { - AddTwo(buffer, ref index, 0x83, 0x55); - } - else if (current == 'Ŵ') - { - AddTwo(buffer, ref index, 0x83, 0x57); - } - else if (current == 'Ŷ') - { - AddTwo(buffer, ref index, 0x83, 0x59); - } - - // lowercase with accent circonflexe - else if (current == 'â') - { - AddTwo(buffer, ref index, 0x83, 0x61); - } - else if (current == 'ĉ') - { - AddTwo(buffer, ref index, 0x83, 0x63); - } - else if (current == 'ê') - { - AddTwo(buffer, ref index, 0x83, 0x65); - } - else if (current == 'ĝ') - { - AddTwo(buffer, ref index, 0x83, 0x67); - } - else if (current == 'ĥ') - { - AddTwo(buffer, ref index, 0x83, 0x68); - } - else if (current == 'î') - { - AddTwo(buffer, ref index, 0x83, 0x69); - } - else if (current == 'ĵ') - { - AddTwo(buffer, ref index, 0x83, 0x6A); - } - else if (current == 'ô') - { - AddTwo(buffer, ref index, 0x83, 0x6F); - } - else if (current == 'ŝ') - { - AddTwo(buffer, ref index, 0x83, 0x73); - } - else if (current == 'û') - { - AddTwo(buffer, ref index, 0x83, 0x75); - } - else if (current == 'ŵ') - { - AddTwo(buffer, ref index, 0x83, 0x77); - } - else if (current == 'ŷ') - { - AddTwo(buffer, ref index, 0x83, 0x79); - } - - // capitals with caron - else if (current == 'Ǎ') - { - AddTwo(buffer, ref index, 0x84, 0x41); - } - else if (current == 'Č') - { - AddTwo(buffer, ref index, 0x84, 0x43); - } - else if (current == 'Ď') - { - AddTwo(buffer, ref index, 0x84, 0x44); - } - else if (current == 'Ě') - { - AddTwo(buffer, ref index, 0x84, 0x45); - } - else if (current == 'Ǧ') - { - AddTwo(buffer, ref index, 0x84, 0x47); - } - else if (current == 'Ǐ') - { - AddTwo(buffer, ref index, 0x84, 0x49); - } - else if (current == 'Ľ') - { - AddTwo(buffer, ref index, 0x84, 0x4C); - } - else if (current == 'Ň') - { - AddTwo(buffer, ref index, 0x84, 0x4E); - } - else if (current == 'Ř') - { - AddTwo(buffer, ref index, 0x84, 0x52); - } - else if (current == 'Š') - { - AddTwo(buffer, ref index, 0x84, 0x53); - } - else if (current == 'Ť') - { - AddTwo(buffer, ref index, 0x84, 0x54); - } - else if (current == 'Ž') - { - AddTwo(buffer, ref index, 0x84, 0x5A); - } - - // lowercase with caron - else if (current == 'ǎ') - { - AddTwo(buffer, ref index, 0x84, 0x61); - } - else if (current == 'č') - { - AddTwo(buffer, ref index, 0x84, 0x63); - } - else if (current == 'ď') - { - AddTwo(buffer, ref index, 0x84, 0x64); - } - else if (current == 'ě') - { - AddTwo(buffer, ref index, 0x84, 0x65); - } - else if (current == 'ǧ') - { - AddTwo(buffer, ref index, 0x84, 0x67); - } - else if (current == 'ǐ') - { - AddTwo(buffer, ref index, 0x84, 0x69); - } - else if (current == 'ľ') - { - AddTwo(buffer, ref index, 0x84, 0x6C); - } - else if (current == 'ň') - { - AddTwo(buffer, ref index, 0x84, 0x6E); - } - else if (current == 'ř') - { - AddTwo(buffer, ref index, 0x84, 0x72); - } - else if (current == 'š') - { - AddTwo(buffer, ref index, 0x84, 0x73); - } - else if (current == 'ť') - { - AddTwo(buffer, ref index, 0x84, 0x74); - } - else if (current == 'ž') - { - AddTwo(buffer, ref index, 0x84, 0x7A); - } - - // capitals with tilde - else if (current == 'Ã') - { - AddTwo(buffer, ref index, 0x85, 0x41); - } - else if (current == 'Ĩ') - { - AddTwo(buffer, ref index, 0x85, 0x49); - } - else if (current == 'Ñ') - { - AddTwo(buffer, ref index, 0x85, 0x4E); - } - else if (current == 'Õ') - { - AddTwo(buffer, ref index, 0x85, 0x4F); - } - else if (current == 'Ũ') - { - AddTwo(buffer, ref index, 0x85, 0x55); - } - - // lowercase with tilde - else if (current == 'ã') - { - AddTwo(buffer, ref index, 0x85, 0x61); - } - else if (current == 'ĩ') - { - AddTwo(buffer, ref index, 0x85, 0x69); - } - else if (current == 'ñ') - { - AddTwo(buffer, ref index, 0x85, 0x6E); - } - else if (current == 'õ') - { - AddTwo(buffer, ref index, 0x85, 0x6F); - } - else if (current == 'ũ') - { - AddTwo(buffer, ref index, 0x85, 0x75); - } - - // capitals with trema - else if (current == 'Ä') - { - AddTwo(buffer, ref index, 0x86, 0x41); - } - else if (current == 'Ë') - { - AddTwo(buffer, ref index, 0x86, 0x45); - } - else if (current == 'Ï') - { - AddTwo(buffer, ref index, 0x86, 0x49); - } - else if (current == 'Ö') - { - AddTwo(buffer, ref index, 0x86, 0x4F); - } - else if (current == 'Ü') - { - AddTwo(buffer, ref index, 0x86, 0x55); - } - else if (current == 'Ẅ') - { - AddTwo(buffer, ref index, 0x86, 0x57); - } - else if (current == 'Ÿ') - { - AddTwo(buffer, ref index, 0x86, 0x59); - } - - // lowercase with trema - else if (current == 'ä') - { - AddTwo(buffer, ref index, 0x86, 0x61); - } - else if (current == 'ë') - { - AddTwo(buffer, ref index, 0x86, 0x65); - } - else if (current == 'ï') - { - AddTwo(buffer, ref index, 0x86, 0x69); - } - else if (current == 'ö') - { - AddTwo(buffer, ref index, 0x86, 0x6F); - } - else if (current == 'ü') - { - AddTwo(buffer, ref index, 0x86, 0x75); - } - else if (current == 'ẅ') - { - AddTwo(buffer, ref index, 0x86, 0x77); - } - else if (current == 'ÿ') - { - AddTwo(buffer, ref index, 0x86, 0x79); - } - else if (i + 3 < text.Length && text.Substring(i, 3) == "") - { - buffer[index] = 0x88; - skipCount = 2; - } - else if (i + 4 <= text.Length && text.Substring(i, 4) == "") - { - buffer[index] = 0x98; - skipCount = 3; - } - else - { - buffer[index] = encoding.GetBytes(new[] { current })[0]; - } - index++; - } - } - } - - return buffer; - } - - private static string ReverseAnsi(string text) - { - var sb = new StringBuilder(); - var ansi = new StringBuilder(); - foreach (var ch in text) - { - if (ch > 255) - { - if (ansi.Length > 0) - { - sb.Append(Utilities.ReverseString(ansi.ToString())); - ansi.Clear(); - } - sb.Append(ch); - } - else - { - ansi.Append(ch); - } - } - if (ansi.Length > 0) - { - sb.Append(Utilities.ReverseString(ansi.ToString())); - } - - return sb.ToString(); - } - - private static void AddTwo(byte[] buffer, ref int index, byte b1, byte b2) - { - buffer[index] = b1; - index++; - buffer[index] = b2; - } - - private static void WriteTime(Stream fs, TimeCode timeCode) - { - double totalMilliseconds = timeCode.TotalMilliseconds; - int frames = (int)Math.Round(totalMilliseconds / (TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate)); - fs.WriteByte((byte)(frames / 256 / 256)); - fs.WriteByte((byte)(frames / 256)); - fs.WriteByte((byte)(frames % 256)); - } - - public override bool IsMine(List lines, string fileName) - { - if (!string.IsNullOrEmpty(fileName) && File.Exists(fileName)) - { - var fi = new FileInfo(fileName); - if (fi.Length >= 512 && fi.Length < 1024000) // not too small or too big - { - if (!fileName.EndsWith(".890", StringComparison.Ordinal)) - { - return false; - } - - return base.IsMine(lines, fileName); - } - } - return false; - } - - public override string ToText(Subtitle subtitle, string title) - { - return "Not supported!"; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - const int textLength = 51; - - subtitle.Paragraphs.Clear(); - subtitle.Header = null; - byte[] buffer = FileUtil.ReadAllBytesShared(fileName); - - _languageIdLine1 = buffer[146]; - if (_languageIdLine1 == 0) - { - _languageIdLine1 = LanguageIdEnglish; - } - - Configuration.Settings.SubtitleSettings.CurrentCavena890LanguageIdLine1 = _languageIdLine1; - - _languageIdLine2 = buffer[147]; - if (_languageIdLine2 == 0) - { - _languageIdLine2 = LanguageIdEnglish; - } - - Configuration.Settings.SubtitleSettings.CurrentCavena890LanguageIdLine2 = _languageIdLine2; - - var fontNameLine1 = Encoding.ASCII.GetString(buffer, 187, 6); - var fontNameLine2 = Encoding.ASCII.GetString(buffer, 246, 6); - - // Hebrew - if (_languageIdLine1 == LanguageIdHebrew || fontNameLine1 == "HEBNOA" || fontNameLine2 == "HEBNOA") - { - _languageIdLine1 = LanguageIdHebrew; - _languageIdLine2 = LanguageIdHebrew; - } - - // Arabic - if (_languageIdLine2 == LanguageIdArabic || fontNameLine1 == "ARABIC") - { - _languageIdLine1 = LanguageIdArabic; - _languageIdLine2 = LanguageIdArabic; - } - - // Russian - else if (_languageIdLine1 == LanguageIdRussian || fontNameLine1.StartsWith("KYRIL", StringComparison.Ordinal) || fontNameLine2.StartsWith("KYRIL", StringComparison.Ordinal)) - { - _languageIdLine1 = LanguageIdRussian; - _languageIdLine2 = LanguageIdRussian; - } - - // Chinese - else if (_languageIdLine1 == LanguageIdChineseSimplified) - { - _languageIdLine1 = LanguageIdChineseSimplified; - _languageIdLine2 = LanguageIdChineseSimplified; - } - else if (_languageIdLine1 == LanguageIdChineseTraditional || fontNameLine1 == "CCKM44" || fontNameLine2 == "CCKM44") - { - _languageIdLine1 = LanguageIdChineseTraditional; - _languageIdLine2 = LanguageIdChineseTraditional; - } - - int i = 455; - int lastNumber = -1; - while (i < buffer.Length - 20) - { - int start = i - textLength; - - int number = buffer[start - 16] * 256 + buffer[start - 15]; - - var p = new Paragraph(); - double startFrame = buffer[start - 14] * 256 * 256 + buffer[start - 13] * 256 + buffer[start - 12]; - double endFrame = buffer[start - 11] * 256 * 256 + buffer[start - 10] * 256 + buffer[start - 9]; - - byte boxType = buffer[start + textLength + 3]; - - string line1 = FixText(buffer, start, textLength, _languageIdLine1); - string line2 = FixText(buffer, start + textLength + 6, textLength, _languageIdLine2); - - if (lastNumber == number) - { - p = subtitle.Paragraphs[subtitle.Paragraphs.Count - 1]; - string temp = (line1.TrimEnd() + Environment.NewLine + line2).TrimEnd(); - if (temp.Length > 0) - { - p.Text = temp; - } - } - else - { - subtitle.Paragraphs.Add(p); - p.StartTime.TotalMilliseconds = (TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate) * startFrame; - p.EndTime.TotalMilliseconds = (TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate) * endFrame; - p.Text = (line1.TrimEnd() + Environment.NewLine + line2).TrimEnd(); - } - if (boxType >= 0xa0 && boxType <= 0xa9 && !string.IsNullOrEmpty(p.Text)) // box - { - if (p.Text.StartsWith("{\\") && p.Text.Contains("}")) - { - p.Text = p.Text.Insert(p.Text.IndexOf('}', 3) + 1, "") + ""; - } - else - { - p.Text = "" + p.Text + ""; - } - } - - lastNumber = number; - - i += 128; - } - - subtitle.Renumber(); - } - - private static string FixText(byte[] buffer, int start, int textLength, int languageId) - { - string text; - - if (languageId == LanguageIdRussian) - { - var encoding = Encoding.GetEncoding(1252); - var sb = new StringBuilder(); - for (int i = 0; i < textLength; i++) - { - int b = buffer[start + i]; - int idx = RussianCodes.IndexOf(b); - if (idx >= 0) - { - sb.Append(RussianLetters[idx]); - } - else - { - sb.Append(encoding.GetString(buffer, start + i, 1)); - } - } - - text = sb.ToString(); - - text = text.Replace(encoding.GetString(new byte[] { 0x7F }), string.Empty); // Used to fill empty space upto 51 bytes - text = text.Replace(encoding.GetString(new byte[] { 0xBE }), string.Empty); // Unknown? - text = FixColors(text); - - if (text.Contains("")) - { - text = text.Replace("", ""); - } - - if (text.Contains("") && !text.Contains("")) - { - text += ""; - } - } - else if (languageId == LanguageIdHebrew) // (_language == "HEBNOA") - { - var encoding = Encoding.GetEncoding(1252); - var sb = new StringBuilder(); - for (int i = 0; i < textLength; i++) - { - int b = buffer[start + i]; - int idx = HebrewCodes.IndexOf(b); - if (idx >= 0) - { - sb.Append(HebrewLetters[idx]); - } - else - { - sb.Append(encoding.GetString(buffer, start + i, 1)); - } - } - - text = sb.ToString(); - - text = text.Replace(encoding.GetString(new byte[] { 0x7F }), string.Empty); // Used to fill empty space upto 51 bytes - text = text.Replace(encoding.GetString(new byte[] { 0xBE }), string.Empty); // Unknown? - text = FixColors(text); - - text = ReverseAnsi(text); - text = Utilities.ReverseStartAndEndingForRightToLeft(text); - } - else if (languageId == LanguageIdArabic) - { - var encoding = Encoding.GetEncoding(1252); - var sb = new StringBuilder(); - for (int i = 0; i < textLength; i++) - { - int b = buffer[start + i]; - if (ArabicDictionary.TryGetValue(b, out var v)) - { - sb.Append(v); - } - else if (b != 0x7F) // filler (decimal 127) - { - sb.Append(encoding.GetString(buffer, start + i, 1)); - } - } - - text = sb.ToString(); - text = text.Replace(encoding.GetString(new byte[] { 0xBE }), string.Empty); // Unknown? - text = FixColors(text).Trim(); - } - else if (languageId == LanguageIdChineseTraditional || languageId == LanguageIdChineseSimplified) // (_language == "CCKM44" || _language == "TVB000") - { - int index = start; - - while (textLength >= 1 && index + textLength < buffer.Length && (buffer[index + textLength - 1] == 0)) - { - textLength--; - } - - if (textLength > 0) - { - text = Encoding.GetEncoding(1201).GetString(buffer, index, textLength).Replace("\0", string.Empty); - } - else - { - text = string.Empty; - } - - var encoding = Encoding.Default; // which encoding?? Encoding.GetEncoding("ISO-8859-5") - text = text.Replace(encoding.GetString(new byte[] { 0x7F }), string.Empty); // Used to fill empty space upto 51 bytes - text = text.Replace(encoding.GetString(new byte[] { 0xBE }), string.Empty); // Unknown? - text = FixColors(text); - text = text.Replace(encoding.GetString(new byte[] { 0x88 }), ""); - text = text.Replace(encoding.GetString(new byte[] { 0x98 }), ""); - - if (text.Contains("")) - { - text = text.Replace("", ""); - } - - if (text.Contains("") && !text.Contains("")) - { - text += ""; - } - } - else - { - var encoding = Encoding.GetEncoding(1252); - text = encoding.GetString(buffer, start, textLength).Replace("\0", string.Empty); - - text = text.Replace(encoding.GetString(new byte[] { 0x7F }), string.Empty); // Used to fill empty space upto 51 bytes - text = text.Replace(encoding.GetString(new byte[] { 0xBE }), string.Empty); // Unknown? - text = FixColors(text); - - text = text.Replace(encoding.GetString(new byte[] { 0x1B }), "æ"); - text = text.Replace(encoding.GetString(new byte[] { 0x1C }), "ø"); - text = text.Replace(encoding.GetString(new byte[] { 0x1D }), "å"); - text = text.Replace(encoding.GetString(new byte[] { 0x1E }), "Æ"); - text = text.Replace(encoding.GetString(new byte[] { 0x1F }), "Ø"); - - text = text.Replace(encoding.GetString(new byte[] { 0x5B }), "Æ"); - text = text.Replace(encoding.GetString(new byte[] { 0x5C }), "Ø"); - text = text.Replace(encoding.GetString(new byte[] { 0x5D }), "Å"); - - // capitals with accent grave - text = text.Replace(encoding.GetString(new byte[] { 0x81, 0x41 }), "À"); - text = text.Replace(encoding.GetString(new byte[] { 0x81, 0x45 }), "È"); - text = text.Replace(encoding.GetString(new byte[] { 0x81, 0x49 }), "Ì"); - text = text.Replace(encoding.GetString(new byte[] { 0x81, 0x4f }), "Ò"); - text = text.Replace(encoding.GetString(new byte[] { 0x81, 0x55 }), "Ù"); - - // lowercase with accent grave - text = text.Replace(encoding.GetString(new byte[] { 0x81, 0x61 }), "à"); - text = text.Replace(encoding.GetString(new byte[] { 0x81, 0x65 }), "è"); - text = text.Replace(encoding.GetString(new byte[] { 0x81, 0x69 }), "ì"); - text = text.Replace(encoding.GetString(new byte[] { 0x81, 0x6F }), "ò"); - text = text.Replace(encoding.GetString(new byte[] { 0x81, 0x75 }), "ù"); - - // capitals with accent aigu - text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x41 }), "Á"); - text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x43 }), "Ć"); - text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x45 }), "É"); - text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x49 }), "Í"); - text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x4C }), "Ĺ"); - text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x4E }), "Ń"); - text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x4F }), "Ó"); - text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x52 }), "Ŕ"); - text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x53 }), "Ś"); - text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x55 }), "Ú"); - text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x57 }), "Ẃ"); - text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x59 }), "Ý"); - text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x5A }), "Ź"); - - // lowercase with accent aigu - text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x61 }), "á"); - text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x63 }), "ć"); - text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x65 }), "é"); - text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x69 }), "í"); - text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x6C }), "ĺ"); - text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x6E }), "ń"); - text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x6F }), "ó"); - text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x72 }), "ŕ"); - text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x73 }), "ś"); - text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x75 }), "ú"); - text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x77 }), "ẃ"); - text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x79 }), "ý"); - text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x7A }), "ź"); - - // capitals with accent circonflexe - text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x41 }), "Â"); - text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x43 }), "Ĉ"); - text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x45 }), "Ê"); - text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x47 }), "Ĝ"); - text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x48 }), "Ĥ"); - text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x49 }), "Î"); - text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x4A }), "Ĵ"); - text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x4F }), "Ô"); - text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x53 }), "Ŝ"); - text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x55 }), "Û"); - text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x57 }), "Ŵ"); - text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x59 }), "Ŷ"); - - // lowercase with accent circonflexe - text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x61 }), "â"); - text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x63 }), "ĉ"); - text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x65 }), "ê"); - text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x67 }), "ĝ"); - text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x68 }), "ĥ"); - text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x69 }), "î"); - text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x6A }), "ĵ"); - text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x6F }), "ô"); - text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x73 }), "ŝ"); - text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x75 }), "û"); - text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x77 }), "ŵ"); - text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x79 }), "ŷ"); - - // capitals with caron - text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x41 }), "Ǎ"); - text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x43 }), "Č"); - text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x44 }), "Ď"); - text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x45 }), "Ě"); - text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x47 }), "Ǧ"); - text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x49 }), "Ǐ"); - text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x4C }), "Ľ"); - text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x4E }), "Ň"); - text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x52 }), "Ř"); - text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x53 }), "Š"); - text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x54 }), "Ť"); - text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x5A }), "Ž"); - - // lowercase with caron - text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x61 }), "ǎ"); - text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x63 }), "č"); - text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x64 }), "ď"); - text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x65 }), "ě"); - text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x67 }), "ǧ"); - text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x69 }), "ǐ"); - text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x6C }), "ľ"); - text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x6E }), "ň"); - text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x72 }), "ř"); - text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x73 }), "š"); - text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x74 }), "ť"); - text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x7A }), "ž"); - - // capitals with tilde - text = text.Replace(encoding.GetString(new byte[] { 0x85, 0x41 }), "Ã"); - text = text.Replace(encoding.GetString(new byte[] { 0x85, 0x49 }), "Ĩ"); - text = text.Replace(encoding.GetString(new byte[] { 0x85, 0x4E }), "Ñ"); - text = text.Replace(encoding.GetString(new byte[] { 0x85, 0x4F }), "Õ"); - text = text.Replace(encoding.GetString(new byte[] { 0x85, 0x55 }), "Ũ"); - - // lowercase with tilde - text = text.Replace(encoding.GetString(new byte[] { 0x85, 0x61 }), "ã"); - text = text.Replace(encoding.GetString(new byte[] { 0x85, 0x69 }), "ĩ"); - text = text.Replace(encoding.GetString(new byte[] { 0x85, 0x6E }), "ñ"); - text = text.Replace(encoding.GetString(new byte[] { 0x85, 0x6F }), "õ"); - text = text.Replace(encoding.GetString(new byte[] { 0x85, 0x75 }), "ũ"); - - // capitals with trema - text = text.Replace(encoding.GetString(new byte[] { 0x86, 0x41 }), "Ä"); - text = text.Replace(encoding.GetString(new byte[] { 0x86, 0x45 }), "Ë"); - text = text.Replace(encoding.GetString(new byte[] { 0x86, 0x49 }), "Ï"); - text = text.Replace(encoding.GetString(new byte[] { 0x86, 0x4F }), "Ö"); - text = text.Replace(encoding.GetString(new byte[] { 0x86, 0x55 }), "Ü"); - text = text.Replace(encoding.GetString(new byte[] { 0x86, 0x59 }), "Ÿ"); - - // lowercase with trema - text = text.Replace(encoding.GetString(new byte[] { 0x86, 0x61 }), "ä"); - text = text.Replace(encoding.GetString(new byte[] { 0x86, 0x65 }), "ë"); - text = text.Replace(encoding.GetString(new byte[] { 0x86, 0x69 }), "ï"); - text = text.Replace(encoding.GetString(new byte[] { 0x86, 0x6F }), "ö"); - text = text.Replace(encoding.GetString(new byte[] { 0x86, 0x75 }), "ü"); - text = text.Replace(encoding.GetString(new byte[] { 0x86, 0x79 }), "ÿ"); - - // with ring - text = text.Replace(encoding.GetString(new byte[] { 0x8C, 0x61 }), "å"); - text = text.Replace(encoding.GetString(new byte[] { 0x8C, 0x41 }), "Å"); - - text = text.Replace(encoding.GetString(new byte[] { 0x88 }), ""); - text = text.Replace(encoding.GetString(new byte[] { 0x98 }), ""); - - // ăĂ şŞ ţŢ (romanian) - text = text.Replace(encoding.GetString(new byte[] { 0x89, 0x61 }), "ă"); - text = text.Replace(encoding.GetString(new byte[] { 0x89, 0x41 }), "Ă"); - text = text.Replace(encoding.GetString(new byte[] { 0x87, 0x73 }), "ş"); - text = text.Replace(encoding.GetString(new byte[] { 0x87, 0x53 }), "Ş"); - text = text.Replace(encoding.GetString(new byte[] { 0x87, 0x74 }), "ţ"); - text = text.Replace(encoding.GetString(new byte[] { 0x87, 0x54 }), "Ţ"); - - if (text.Contains("")) - { - text = text.Replace("", ""); - } - - if (text.Contains("") && !text.Contains("")) - { - text += ""; - } - } - return text; - } - - private static string FixColors(string text) - { - Encoding encoding = Encoding.GetEncoding(1252); - bool fontColorOn = false; - var sb = new StringBuilder(); - for (int i = 0; i < text.Length; i++) - { - var s = text.Substring(i, 1); - if (s == encoding.GetString(new byte[] { 0xf1 })) - { - if (fontColorOn) - { - sb.Append("
"); // white - } - sb.Append(""); // red - fontColorOn = true; - } - else if (s == encoding.GetString(new byte[] { 0xf2 })) - { - if (fontColorOn) - { - sb.Append(""); // white - } - sb.Append(""); // green - fontColorOn = true; - } - else if (s == encoding.GetString(new byte[] { 0xf3 })) - { - if (fontColorOn) - { - sb.Append(""); // white - } - sb.Append(""); // yellow - fontColorOn = true; - } - else if (s == encoding.GetString(new byte[] { 0xf4 })) - { - if (fontColorOn) - { - sb.Append(""); // white - } - sb.Append(""); // purple - fontColorOn = true; - } - else if (s == encoding.GetString(new byte[] { 0xf5 })) - { - if (fontColorOn) - { - sb.Append(""); // white - } - sb.Append(""); // magenta - fontColorOn = true; - } - else if (s == encoding.GetString(new byte[] { 0xf6 })) - { - if (fontColorOn) - { - sb.Append(""); // white - } - sb.Append(""); // cyan - fontColorOn = true; - } - else if (s == encoding.GetString(new byte[] { 0xf7 })) - { - if (fontColorOn) - { - sb.Append(""); // white - fontColorOn = false; - } - } - else if (s == encoding.GetString(new byte[] { 0xf8 })) - { - sb.Append(""); // orange - fontColorOn = true; - } - else - { - sb.Append(s); - } - } - if (fontColorOn) - { - sb.Append(""); // white - } - return sb.ToString(); - } - - } -} +using Nikse.SubtitleEdit.Core.Interfaces; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Text; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class Cavena890 : SubtitleFormat, IBinaryPersistableSubtitle + { + public const int LanguageIdDanish = 0x07; + public const int LanguageIdEnglish = 0x09; + public const int LanguageIdRussian = 0x56; + public const int LanguageIdArabic = 0x80; + public const int LanguageIdHebrew = 0x8f; + public const int LanguageIdChineseTraditional = 0x90; + public const int LanguageIdChineseSimplified = 0x91; + public const int LanguageIdRomanian = 0x22; + + private static readonly Dictionary ArabicDictionary = new Dictionary + { + { 0x58, "م" }, + { 0x41, "ا" }, + { 0x4e, "ص" }, + { 0x42, "ب" }, + { 0x46, "ح" }, + { 0x57, "ل" }, + { 0x47, "خ" }, + { 0x5d, "ي" }, + { 0x4a, "ر" }, + { 0x2c, "،" }, + { 0x59, "ن" }, + { 0x5a, "و" }, + { 0x43, "ت" }, + { 0x1d, "-" }, + { 0x49, "ذ" }, + { 0x45, "ج" }, + { 0x5b, "ه" }, + { 0x56, "ك" }, + { 0x21, "؟" }, + { 0x4c, "س" }, + { 0x52, "ع" }, + { 0x5c, "ة" }, + { 0x5e, "ى" }, + { 0x61, "أ" }, + { 0x48, "د" }, + { 0x4d, "ش" }, + { 0x60, "ء" }, + { 0x68, "ﻷ" }, + { 0x54, "ف" }, + { 0x55, "ق" }, + { 0x22, "!" }, + { 0x67, "ﻻ" }, + { 0x66, "ؤ" }, + { 0x64, "آ" }, + { 0x50, "ط" }, + { 0x6a, "ﻵ" }, + { 0x4f, "ض" }, + { 0x6b, "ﺋ" }, + { 0x44, "ث" }, + { 0x51, "ظ" }, + { 0x53, "غ" }, + { 0x4b, "ز" }, + { 0x23, "\"" }, + { 0x6c, "ـ" }, + }; + + private static readonly List HebrewCodes = new List + { + 0x40, // א + 0x41, // ב + 0x42, // ג + 0x43, // ד + 0x44, // ה + 0x45, // ו + 0x46, // ז + 0x47, // ח + 0x49, // י + 0x4c, // ל + 0x4d, // ם + 0x4e, // מ + 0x4f, // ן + 0x50, // נ + 0x51, // ס + 0x52, // ע + 0x54, // פ + 0x56, // צ + 0x57, // ק + 0x58, // ר + 0x59, // ש + 0x5A, // ת + 0x4b, // כ + 0x4a, // ך + 0x48, // ט + 0x53, // ף + 0x55, // ץ + + 0xB1, // "a" + 0xB2, // "b" + 0xB3, // "c" + 0xB4, // "d" + 0xB5, // "e" + 0xB6, // "f" + 0xB7, // "g" + 0xB8, // "h" + 0xB9, // "i" + 0xBA, // "j" + 0xBB, // "k" + 0xBC, // "l" + 0xBD, // "m" + 0xBE, // "n" + 0xBF, // "o" + 0xC0, // "p" + 0xC1, // "q" + 0xC2, // "r" + 0xC3, // "s" + 0xC4, // "t" + 0xC5, // "u" + 0xC6, // "v" + 0xC7, // "w" + 0xC8, // "x" + 0xC9, // "y" + 0xCA, // "z" + + 0x91, // "A" + 0xDB, // "B" -- weird + 0x93, // "C" + 0xDC, // "D" -- weird + 0x95, // "E" + 0x96, // "F" + 0x97, // "G" + 0xAB, // "H" -- weird + 0x99, // "I" + 0x9A, // "J" + 0x9B, // "K" + 0x9C, // "L" + 0xDD, // "M" + 0xDE, // "N" + 0x9F, // "O" + 0xA0, // "P" + 0xA1, // "Q" + 0xA2, // "R" + 0xA3, // "S" + 0xA4, // "T" + 0xA5, // "U" + 0xA6, // "V" + 0xA7, // "W" + 0xA8, // "X" - weird + 0xA9, // "Y" + 0xAA, // "Z" - weird + }; + + private static readonly List HebrewLetters = new List + { + "א", + "ב", + "ג", + "ד", + "ה", + "ו", + "ז", + "ח", + "י", + "ל", + "ם", + "מ", + "ן", + "נ", + "ס", + "ע", + "פ", + "צ", + "ק", + "ר", + "ש", + "ת", + "כ", + "ך", + "ט", + "ף", + "ץ", + + "a", // 0xB1 + "b", // 0xB2 + "c", // 0xB3 + "d", // 0xB4 + "e", // 0xB5 + "f", // 0xB6 + "g", // 0xB7 + "h", // 0xB8 + "i", // 0xB9 + "j", // 0xBA + "k", // 0xBB + "l", // 0xBC + "m", // 0xBD + "n", // 0xBE + "o", // 0xBF + "p", // 0xC0 + "q", // 0xC1 + "r", // 0xC2 + "s", // 0xC3 + "t", // 0xC4 + "u", // 0xC5 + "v", // 0xC6 + "w", // 0xC7 + "x", // 0xC8 + "y", // 0xC9 + "z", // 0xCA + + "A", // 0x91, + "B", // 0xDB, + "C", // 0x93, + "D", // 0xDC, + "E", // 0x95, + "F", // 0x96, + "G", // 0x97, + "H", // 0xAB, + "I", // 0x99, + "J", // 0x9A, + "K", // 0x9B, + "L", // 0x9C, + "M", // 0xDD, + "N", // 0xDE, + "O", // 0x9F, + "P", // 0xA0, + "Q", // 0xA1, + "R", // 0xA2, + "S", // 0xA3, + "T", // 0xA4, + "U", // 0xA5, + "V", // 0xA6, + "W", // 0xA7, + "X", // 0xA8, + "Y", // 0xA9, + "Z", // 0xAA, + }; + + private static readonly List RussianCodes = new List + { + 0x42, // Б + 0x45, // Е + 0x5A, // З + 0x56, // В + 0x49, // И + 0x4E, // Н + 0x58, // Ы + 0x51, // Я + 0x56, // V + 0x53, // С + 0x72, // р + 0x69, // и + 0x71, // я + 0x6E, // н + 0x74, // т + 0x5C, // Э + 0x77, // ю + 0x46, // Ф + 0x5E, // Ч + 0x44, // Д + 0x62, // б + 0x73, // с + 0x75, // у + 0x64, // д + 0x60, // ж + 0x6A, // й + 0x6C, // л + 0x47, // Г + 0x78, // ы + 0x7A, // з + 0x7E, // ч + 0x6D, // м + 0x67, // г + 0x79, // ь + 0x70, // п + 0x76, // в + 0x55, // У + 0x7D, // щ + 0x66, // ф + 0x7C, // э + 0x7B, // ш + 0x50, // П + 0x52, // П + 0x68, // П + }; + + private static readonly List RussianLetters = new List + { + "Б", + "Е", + "З", + "В", + "И", + "Н", + "Ы", + "Я", + "V", + "С", + "р", + "и", + "я", + "н", + "т", + "Э", + "ю", + "Ф", + "Ч", + "Д", + "б", + "с", + "у", + "д", + "ж", + "й", + "л", + "Г", + "ы", + "з", + "ч", + "м", + "г", + "ь", + "п", + "в", + "У", + "щ", + "ф", + "э", + "ш", + "П", + "Р", + "х", + }; + + public override string Extension => ".890"; + + public const string NameOfFormat = "Cavena 890"; + + public override string Name => NameOfFormat; + + public override bool IsTimeBased => false; + + private int _languageIdLine1 = LanguageIdEnglish; + private int _languageIdLine2 = LanguageIdEnglish; + + public bool Save(string fileName, Subtitle subtitle, bool batchMode = false) + { + using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write)) + { + return Save(fileName, fs, subtitle, batchMode); + } + } + + public bool Save(string fileName, Stream stream, Subtitle subtitle, bool batchMode) + { + int russianCount = 0; + char[] logoGrams = { '的', '是', '啊', '吧', '好', '吧', '亲', '爱', '的', '早', '上' }; + char[] russianChars = { 'я', 'д', 'й', 'л', 'щ', 'ж', 'ц', 'ф', 'ы' }; + foreach (Paragraph p in subtitle.Paragraphs) + { + if (p.Text.Contains(logoGrams)) + { + _languageIdLine1 = LanguageIdChineseSimplified; + _languageIdLine2 = LanguageIdChineseSimplified; + break; + } + if (p.Text.Contains(russianChars)) + { + russianCount++; + if (russianCount > 10) + { + _languageIdLine1 = LanguageIdRussian; + _languageIdLine2 = LanguageIdRussian; // or 0x09? + break; + } + } + } + + if (Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId > 0) + { + _languageIdLine1 = Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId; + _languageIdLine2 = Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId; + } + else + { + var language = LanguageAutoDetect.AutoDetectGoogleLanguage(subtitle); + switch (language) + { + case "he": + _languageIdLine1 = LanguageIdHebrew; + _languageIdLine2 = LanguageIdHebrew; // or 0x09 + break; + case "ru": + _languageIdLine1 = LanguageIdRussian; + _languageIdLine2 = LanguageIdRussian; // or 0x09? + break; + case "zh": + _languageIdLine1 = LanguageIdChineseSimplified; + _languageIdLine2 = LanguageIdChineseSimplified; + break; + case "da": + _languageIdLine1 = LanguageIdDanish; + _languageIdLine2 = LanguageIdDanish; + break; + } + } + + // prompt??? + //if (Configuration.Settings.SubtitleSettings.CurrentCavena890LanguageIdLine1 >= 0) + // _languageIdLine1 = Configuration.Settings.SubtitleSettings.CurrentCavena890LanguageIdLine1; + //if (Configuration.Settings.SubtitleSettings.CurrentCavena890LanguageIdLine2 >= 0) + // _languageIdLine2 = Configuration.Settings.SubtitleSettings.CurrentCavena890LanguageIdLine2; + + // write file header (some fields are known, some are not...) + + stream.WriteByte(0); // ? + stream.WriteByte(0); // ? + + // tape number (20 bytes) + for (int i = 0; i < 20; i++) + { + stream.WriteByte(0); + } + + // ? + for (int i = 0; i < 18; i++) + { + stream.WriteByte(0); + } + + // translated programme title (28 bytes) + string title = Path.GetFileNameWithoutExtension(fileName) ?? string.Empty; + if (title.Length > 28) + { + title = title.Substring(0, 28); + } + + if (!string.IsNullOrWhiteSpace(Configuration.Settings.SubtitleSettings.CurrentCavena89Title) && Configuration.Settings.SubtitleSettings.CurrentCavena89Title.Length <= 28) + { + title = Configuration.Settings.SubtitleSettings.CurrentCavena89Title; + } + + var buffer = Encoding.ASCII.GetBytes(title); + stream.Write(buffer, 0, buffer.Length); + for (int i = 0; i < 28 - buffer.Length; i++) + { + stream.WriteByte(0); + } + + // translator (28 bytes) + if (!string.IsNullOrWhiteSpace(Configuration.Settings.SubtitleSettings.CurrentCavena890Translator) && Configuration.Settings.SubtitleSettings.CurrentCavena890Translator.Length <= 28) + { + buffer = Encoding.ASCII.GetBytes(Configuration.Settings.SubtitleSettings.CurrentCavena890Translator); + stream.Write(buffer, 0, buffer.Length); + for (int i = 0; i < 28 - buffer.Length; i++) + { + stream.WriteByte(0); + } + } + else + { + for (int i = 0; i < 28; i++) + { + stream.WriteByte(0); + } + } + + // ? + for (int i = 0; i < 9; i++) + { + stream.WriteByte(0); + } + + // translated episode title (11 bytes) + for (int i = 0; i < 11; i++) + { + stream.WriteByte(0); + } + + // ? + for (int i = 0; i < 18; i++) + { + stream.WriteByte(0); + } + + // ? + language codes + buffer = new byte[] { 0xA0, 0x05, 0x04, 0x03, 0x06, 0x06, 0x08, 0x90, 0x00, 0x00, 0x00, 0x00, (byte)_languageIdLine1, (byte)_languageIdLine2 }; + stream.Write(buffer, 0, buffer.Length); + + // comments (24 bytes) + buffer = Encoding.ASCII.GetBytes(""); + if (!string.IsNullOrWhiteSpace(Configuration.Settings.SubtitleSettings.CurrentCavena89Comment) && Configuration.Settings.SubtitleSettings.CurrentCavena89Comment.Length <= 24) + { + buffer = Encoding.ASCII.GetBytes(Configuration.Settings.SubtitleSettings.CurrentCavena89Comment); + } + + stream.Write(buffer, 0, buffer.Length); + for (int i = 0; i < 24 - buffer.Length; i++) + { + stream.WriteByte(0); + } + + // ?? + buffer = new byte[] { 0x08, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00 }; + stream.Write(buffer, 0, buffer.Length); + + // number of subtitles + stream.WriteByte((byte)(subtitle.Paragraphs.Count % 256)); + stream.WriteByte((byte)(subtitle.Paragraphs.Count / 256)); + + // write font - prefix with binary zeroes + buffer = GetFontBytesFromLanguageId(_languageIdLine1); // also TBX308VFONTL.V for english... + for (int i = 0; i < 14 - buffer.Length; i++) + { + stream.WriteByte(0); + } + + stream.Write(buffer, 0, buffer.Length); + + // ? + for (int i = 0; i < 13; i++) + { + stream.WriteByte(0); + } + + // number of subtitles again + stream.WriteByte((byte)(subtitle.Paragraphs.Count % 256)); + stream.WriteByte((byte)(subtitle.Paragraphs.Count / 256)); + + + // number of subtitles again again + stream.WriteByte((byte)(subtitle.Paragraphs.Count % 256)); + stream.WriteByte((byte)(subtitle.Paragraphs.Count / 256)); + + // ? + for (int i = 0; i < 6; i++) + { + stream.WriteByte(0); + } + + // original programme title (28 chars) + if (!string.IsNullOrWhiteSpace(Configuration.Settings.SubtitleSettings.CurrentCavena890riginalTitle) && Configuration.Settings.SubtitleSettings.CurrentCavena890riginalTitle.Length <= 28) + { + buffer = Encoding.ASCII.GetBytes(Configuration.Settings.SubtitleSettings.CurrentCavena890riginalTitle); + stream.Write(buffer, 0, buffer.Length); + for (int i = 0; i < 28 - buffer.Length; i++) + { + stream.WriteByte(0); + } + } + else + { + for (int i = 0; i < 28; i++) + { + stream.WriteByte(0); + } + } + + // write font (use same font id from line 1) + buffer = GetFontBytesFromLanguageId(_languageIdLine1); + stream.Write(buffer, 0, buffer.Length); + + // ? + stream.WriteByte(0x3d); + stream.WriteByte(0x8d); + + // start of message time + string startOfMessage = "10:00:00:00"; + if (Configuration.Settings.SubtitleSettings.Cavena890StartOfMessage != null && + Configuration.Settings.SubtitleSettings.Cavena890StartOfMessage.Length == startOfMessage.Length) + { + startOfMessage = Configuration.Settings.SubtitleSettings.Cavena890StartOfMessage; + } + + buffer = Encoding.ASCII.GetBytes(startOfMessage); + stream.Write(buffer, 0, buffer.Length); + + buffer = new byte[] + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x54, 0x44 + }; + stream.Write(buffer, 0, buffer.Length); + + for (int i = 0; i < 92; i++) + { + stream.WriteByte(0); + } + + // paragraphs + int number = 16; + foreach (Paragraph p in subtitle.Paragraphs) + { + // number + stream.WriteByte((byte)(number / 256)); + stream.WriteByte((byte)(number % 256)); + + WriteTime(stream, p.StartTime); + WriteTime(stream, p.EndTime); + + if (p.Text.StartsWith("{\\an1}")) + { + stream.WriteByte(0x50); // left + } + else if (p.Text.StartsWith("{\\an3}")) + { + stream.WriteByte(0x52); // left + } + else + { + stream.WriteByte(0x54); // center + } + + buffer = new byte[] { 0, 0, 0, 0, 0, 0, 0 }; // 0x16 }; -- the last two bytes might be something with vertical alignment... + stream.Write(buffer, 0, buffer.Length); + + bool hasBox = Utilities.RemoveSsaTags(p.Text).StartsWith(""); + var text = p.Text.Replace("", string.Empty).Replace("", string.Empty); + text = HtmlUtil.RemoveOpenCloseTags(Utilities.RemoveSsaTags(text), HtmlUtil.TagBold, HtmlUtil.TagFont, HtmlUtil.TagBold); + WriteText(stream, text, p == subtitle.Paragraphs[subtitle.Paragraphs.Count - 1], _languageIdLine1, hasBox); + + number += 16; + } + return true; + } + + private static byte[] GetFontBytesFromLanguageId(int languageId) + { + var buffer = Encoding.ASCII.GetBytes("HLV23N.V"); + if (languageId == LanguageIdChineseTraditional || languageId == LanguageIdChineseSimplified) + { + buffer = Encoding.ASCII.GetBytes("CCKM44.V"); + } + else if (languageId == LanguageIdArabic) + { + buffer = Encoding.ASCII.GetBytes("ARA19N.V"); + } + else if (languageId == LanguageIdRussian) + { + buffer = Encoding.ASCII.GetBytes("KYRIL4.V"); + } + else if (languageId == LanguageIdHebrew) + { + buffer = Encoding.ASCII.GetBytes("HEBNOA.V"); + } + else if (languageId == LanguageIdDanish) + { + buffer = Encoding.ASCII.GetBytes("VFONTL.V"); + } + + return buffer; + } + + private static void WriteText(Stream fs, string text, bool isLast, int languageIdLine, bool useBox) + { + var lines = text.SplitToLines(); + if (lines.Count > 2) + { + lines = Utilities.AutoBreakLine(text).SplitToLines(); + } + + string line1 = string.Empty; + string line2; + if (lines.Count > 1) + { + line1 = lines[0]; + line2 = lines[1]; + } + else + { + line2 = lines[0]; + } + + var buffer = GetTextAsBytes(line1, languageIdLine); + fs.Write(buffer, 0, buffer.Length); + + buffer = new byte[] { 00, 00, 00, 00, 00, 00 }; + if (useBox) + { + buffer[3] = 0xa0; + } + + fs.Write(buffer, 0, buffer.Length); + + buffer = GetTextAsBytes(line2, languageIdLine); + fs.Write(buffer, 0, buffer.Length); + + buffer = new byte[] { 00, 00, 00, 00 }; + if (!isLast) + { + fs.Write(buffer, 0, buffer.Length); + } + } + + private static byte[] GetTextAsBytes(string text, int languageId) + { + var buffer = new byte[51]; + int skipCount = 0; + for (int i = 0; i < buffer.Length; i++) + { + buffer[i] = 0x7F; + } + + if (languageId == LanguageIdChineseTraditional || languageId == LanguageIdChineseSimplified) + { + for (int i = 0; i < buffer.Length; i++) + { + buffer[i] = 0; + } + } + else if (languageId == LanguageIdHebrew) + { + text = Utilities.ReverseNumbers(text); + if (!Configuration.Settings.General.RightToLeftMode) + { + text = Utilities.ReverseStartAndEndingForRightToLeft(text); + } + } + + var encoding = Encoding.Default; + int index = 0; + + if (languageId == LanguageIdHebrew) + { + text = ReverseAnsi(text); + } + + for (int i = 0; i < text.Length; i++) + { + var current = text[i]; + if (skipCount > 0) + { + skipCount--; + } + else if (languageId == LanguageIdHebrew) + { + int letterIndex = HebrewLetters.IndexOf(current.ToString(CultureInfo.InvariantCulture)); + if (letterIndex >= 0) + { + buffer[index] = (byte)HebrewCodes[letterIndex]; + } + else if (i + 3 < text.Length && text.Substring(i, 3) == "") + { + buffer[index] = 0x88; + skipCount = 2; + } + else if (i + 4 <= text.Length && text.Substring(i, 4) == "") + { + buffer[index] = 0x98; + skipCount = 2; + } + else + { + buffer[index] = encoding.GetBytes(new[] { current })[0]; + } + index++; + } + else if (languageId == LanguageIdChineseTraditional || languageId == LanguageIdChineseSimplified) + { + encoding = Encoding.GetEncoding(1201); + if (index < 49) + { + if (i + 3 < text.Length && text.Substring(i, 3) == "") + { + buffer[index] = 0x88; + skipCount = 2; + } + else if (i + 4 <= text.Length && text.Substring(i, 4) == "") + { + buffer[index] = 0x98; + skipCount = 3; + } + else + { + buffer[index] = encoding.GetBytes(new[] { current })[0]; + index++; + } + } + } + else + { + if (index < 50) + { + if (current == 'æ') + { + buffer[index] = 0x1B; + } + else if (current == 'ø') + { + buffer[index] = 0x1C; + } + else if (current == 'å') + { + buffer[index] = 0x1D; + } + else if (current == 'Æ') + { + buffer[index] = 0x5B; + } + else if (current == 'Ø') + { + buffer[index] = 0x5C; + } + else if (current == 'Å') + { + buffer[index] = 0x5D; + } + + // ăĂ şŞ ţŢ (romanian) + else if (current == 'ă') + { + AddTwo(buffer, ref index, 0x89, 0x61); + } + else if (current == 'Ă') + { + AddTwo(buffer, ref index, 0x89, 0x41); + } + else if (current == 'ş') + { + AddTwo(buffer, ref index, 0x87, 0x73); + } + else if (current == 'Ş') + { + AddTwo(buffer, ref index, 0x87, 0x53); + } + else if (current == 'ţ') + { + AddTwo(buffer, ref index, 0x87, 0x74); + } + else if (current == 'Ţ') + { + AddTwo(buffer, ref index, 0x87, 0x54); + } + + // Next mapping of diacritics is reverse engineered, + // and currently only maps characters from latin alphabets according to https://en.wikipedia.org/wiki/Latin_alphabets + + // capitals with accent grave + else if (current == 'À') + { + AddTwo(buffer, ref index, 0x81, 0x41); + } + else if (current == 'È') + { + AddTwo(buffer, ref index, 0x81, 0x45); + } + else if (current == 'Ì') + { + AddTwo(buffer, ref index, 0x81, 0x49); + } + else if (current == 'Ò') + { + AddTwo(buffer, ref index, 0x81, 0x4F); + } + else if (current == 'Ù') + { + AddTwo(buffer, ref index, 0x81, 0x55); + } + else if (current == 'Ẁ') + { + AddTwo(buffer, ref index, 0x81, 0x57); + } + + // lowercase with accent grave + else if (current == 'à') + { + AddTwo(buffer, ref index, 0x81, 0x61); + } + else if (current == 'è') + { + AddTwo(buffer, ref index, 0x81, 0x65); + } + else if (current == 'ì') + { + AddTwo(buffer, ref index, 0x81, 0x69); + } + else if (current == 'ò') + { + AddTwo(buffer, ref index, 0x81, 0x6F); + } + else if (current == 'ù') + { + AddTwo(buffer, ref index, 0x81, 0x75); + } + else if (current == 'ẁ') + { + AddTwo(buffer, ref index, 0x81, 0x75); + } + + // capitals with accent aigu + else if (current == 'Á') + { + AddTwo(buffer, ref index, 0x82, 0x41); + } + else if (current == 'Ć') + { + AddTwo(buffer, ref index, 0x82, 0x43); + } + else if (current == 'É') + { + AddTwo(buffer, ref index, 0x82, 0x45); + } + else if (current == 'Í') + { + AddTwo(buffer, ref index, 0x82, 0x49); + } + else if (current == 'Ĺ') + { + AddTwo(buffer, ref index, 0x82, 0x4C); + } + else if (current == 'Ń') + { + AddTwo(buffer, ref index, 0x82, 0x4E); + } + else if (current == 'Ó') + { + AddTwo(buffer, ref index, 0x82, 0x4F); + } + else if (current == 'Ŕ') + { + AddTwo(buffer, ref index, 0x82, 0x52); + } + else if (current == 'Ś') + { + AddTwo(buffer, ref index, 0x82, 0x53); + } + else if (current == 'Ú') + { + AddTwo(buffer, ref index, 0x82, 0x55); + } + else if (current == 'Ẃ') + { + AddTwo(buffer, ref index, 0x82, 0x57); + } + else if (current == 'Ý') + { + AddTwo(buffer, ref index, 0x82, 0x59); + } + else if (current == 'Ź') + { + AddTwo(buffer, ref index, 0x82, 0x5A); + } + + // lowercase with accent aigu + else if (current == 'á') + { + AddTwo(buffer, ref index, 0x82, 0x61); + } + else if (current == 'ć') + { + AddTwo(buffer, ref index, 0x82, 0x63); + } + else if (current == 'é') + { + AddTwo(buffer, ref index, 0x82, 0x65); + } + else if (current == 'í') + { + AddTwo(buffer, ref index, 0x82, 0x69); + } + else if (current == 'ĺ') + { + AddTwo(buffer, ref index, 0x82, 0x6C); + } + else if (current == 'ń') + { + AddTwo(buffer, ref index, 0x82, 0x6E); + } + else if (current == 'ó') + { + AddTwo(buffer, ref index, 0x82, 0x6F); + } + else if (current == 'ŕ') + { + AddTwo(buffer, ref index, 0x82, 0x72); + } + else if (current == 'ś') + { + AddTwo(buffer, ref index, 0x82, 0x73); + } + else if (current == 'ú') + { + AddTwo(buffer, ref index, 0x82, 0x75); + } + else if (current == 'ẃ') + { + AddTwo(buffer, ref index, 0x82, 0x77); + } + else if (current == 'ý') + { + AddTwo(buffer, ref index, 0x82, 0x79); + } + else if (current == 'ź') + { + AddTwo(buffer, ref index, 0x82, 0x7A); + } + + // capitals with accent circonflexe + else if (current == 'Â') + { + AddTwo(buffer, ref index, 0x83, 0x41); + } + else if (current == 'Ĉ') + { + AddTwo(buffer, ref index, 0x83, 0x43); + } + else if (current == 'Ê') + { + AddTwo(buffer, ref index, 0x83, 0x45); + } + else if (current == 'Ĝ') + { + AddTwo(buffer, ref index, 0x83, 0x47); + } + else if (current == 'Ĥ') + { + AddTwo(buffer, ref index, 0x83, 0x48); + } + else if (current == 'Î') + { + AddTwo(buffer, ref index, 0x83, 0x49); + } + else if (current == 'Ĵ') + { + AddTwo(buffer, ref index, 0x83, 0x4A); + } + else if (current == 'Ô') + { + AddTwo(buffer, ref index, 0x83, 0x4F); + } + else if (current == 'Ŝ') + { + AddTwo(buffer, ref index, 0x83, 0x53); + } + else if (current == 'Û') + { + AddTwo(buffer, ref index, 0x83, 0x55); + } + else if (current == 'Ŵ') + { + AddTwo(buffer, ref index, 0x83, 0x57); + } + else if (current == 'Ŷ') + { + AddTwo(buffer, ref index, 0x83, 0x59); + } + + // lowercase with accent circonflexe + else if (current == 'â') + { + AddTwo(buffer, ref index, 0x83, 0x61); + } + else if (current == 'ĉ') + { + AddTwo(buffer, ref index, 0x83, 0x63); + } + else if (current == 'ê') + { + AddTwo(buffer, ref index, 0x83, 0x65); + } + else if (current == 'ĝ') + { + AddTwo(buffer, ref index, 0x83, 0x67); + } + else if (current == 'ĥ') + { + AddTwo(buffer, ref index, 0x83, 0x68); + } + else if (current == 'î') + { + AddTwo(buffer, ref index, 0x83, 0x69); + } + else if (current == 'ĵ') + { + AddTwo(buffer, ref index, 0x83, 0x6A); + } + else if (current == 'ô') + { + AddTwo(buffer, ref index, 0x83, 0x6F); + } + else if (current == 'ŝ') + { + AddTwo(buffer, ref index, 0x83, 0x73); + } + else if (current == 'û') + { + AddTwo(buffer, ref index, 0x83, 0x75); + } + else if (current == 'ŵ') + { + AddTwo(buffer, ref index, 0x83, 0x77); + } + else if (current == 'ŷ') + { + AddTwo(buffer, ref index, 0x83, 0x79); + } + + // capitals with caron + else if (current == 'Ǎ') + { + AddTwo(buffer, ref index, 0x84, 0x41); + } + else if (current == 'Č') + { + AddTwo(buffer, ref index, 0x84, 0x43); + } + else if (current == 'Ď') + { + AddTwo(buffer, ref index, 0x84, 0x44); + } + else if (current == 'Ě') + { + AddTwo(buffer, ref index, 0x84, 0x45); + } + else if (current == 'Ǧ') + { + AddTwo(buffer, ref index, 0x84, 0x47); + } + else if (current == 'Ǐ') + { + AddTwo(buffer, ref index, 0x84, 0x49); + } + else if (current == 'Ľ') + { + AddTwo(buffer, ref index, 0x84, 0x4C); + } + else if (current == 'Ň') + { + AddTwo(buffer, ref index, 0x84, 0x4E); + } + else if (current == 'Ř') + { + AddTwo(buffer, ref index, 0x84, 0x52); + } + else if (current == 'Š') + { + AddTwo(buffer, ref index, 0x84, 0x53); + } + else if (current == 'Ť') + { + AddTwo(buffer, ref index, 0x84, 0x54); + } + else if (current == 'Ž') + { + AddTwo(buffer, ref index, 0x84, 0x5A); + } + + // lowercase with caron + else if (current == 'ǎ') + { + AddTwo(buffer, ref index, 0x84, 0x61); + } + else if (current == 'č') + { + AddTwo(buffer, ref index, 0x84, 0x63); + } + else if (current == 'ď') + { + AddTwo(buffer, ref index, 0x84, 0x64); + } + else if (current == 'ě') + { + AddTwo(buffer, ref index, 0x84, 0x65); + } + else if (current == 'ǧ') + { + AddTwo(buffer, ref index, 0x84, 0x67); + } + else if (current == 'ǐ') + { + AddTwo(buffer, ref index, 0x84, 0x69); + } + else if (current == 'ľ') + { + AddTwo(buffer, ref index, 0x84, 0x6C); + } + else if (current == 'ň') + { + AddTwo(buffer, ref index, 0x84, 0x6E); + } + else if (current == 'ř') + { + AddTwo(buffer, ref index, 0x84, 0x72); + } + else if (current == 'š') + { + AddTwo(buffer, ref index, 0x84, 0x73); + } + else if (current == 'ť') + { + AddTwo(buffer, ref index, 0x84, 0x74); + } + else if (current == 'ž') + { + AddTwo(buffer, ref index, 0x84, 0x7A); + } + + // capitals with tilde + else if (current == 'Ã') + { + AddTwo(buffer, ref index, 0x85, 0x41); + } + else if (current == 'Ĩ') + { + AddTwo(buffer, ref index, 0x85, 0x49); + } + else if (current == 'Ñ') + { + AddTwo(buffer, ref index, 0x85, 0x4E); + } + else if (current == 'Õ') + { + AddTwo(buffer, ref index, 0x85, 0x4F); + } + else if (current == 'Ũ') + { + AddTwo(buffer, ref index, 0x85, 0x55); + } + + // lowercase with tilde + else if (current == 'ã') + { + AddTwo(buffer, ref index, 0x85, 0x61); + } + else if (current == 'ĩ') + { + AddTwo(buffer, ref index, 0x85, 0x69); + } + else if (current == 'ñ') + { + AddTwo(buffer, ref index, 0x85, 0x6E); + } + else if (current == 'õ') + { + AddTwo(buffer, ref index, 0x85, 0x6F); + } + else if (current == 'ũ') + { + AddTwo(buffer, ref index, 0x85, 0x75); + } + + // capitals with trema + else if (current == 'Ä') + { + AddTwo(buffer, ref index, 0x86, 0x41); + } + else if (current == 'Ë') + { + AddTwo(buffer, ref index, 0x86, 0x45); + } + else if (current == 'Ï') + { + AddTwo(buffer, ref index, 0x86, 0x49); + } + else if (current == 'Ö') + { + AddTwo(buffer, ref index, 0x86, 0x4F); + } + else if (current == 'Ü') + { + AddTwo(buffer, ref index, 0x86, 0x55); + } + else if (current == 'Ẅ') + { + AddTwo(buffer, ref index, 0x86, 0x57); + } + else if (current == 'Ÿ') + { + AddTwo(buffer, ref index, 0x86, 0x59); + } + + // lowercase with trema + else if (current == 'ä') + { + AddTwo(buffer, ref index, 0x86, 0x61); + } + else if (current == 'ë') + { + AddTwo(buffer, ref index, 0x86, 0x65); + } + else if (current == 'ï') + { + AddTwo(buffer, ref index, 0x86, 0x69); + } + else if (current == 'ö') + { + AddTwo(buffer, ref index, 0x86, 0x6F); + } + else if (current == 'ü') + { + AddTwo(buffer, ref index, 0x86, 0x75); + } + else if (current == 'ẅ') + { + AddTwo(buffer, ref index, 0x86, 0x77); + } + else if (current == 'ÿ') + { + AddTwo(buffer, ref index, 0x86, 0x79); + } + else if (i + 3 < text.Length && text.Substring(i, 3) == "") + { + buffer[index] = 0x88; + skipCount = 2; + } + else if (i + 4 <= text.Length && text.Substring(i, 4) == "") + { + buffer[index] = 0x98; + skipCount = 3; + } + else + { + buffer[index] = encoding.GetBytes(new[] { current })[0]; + } + index++; + } + } + } + + return buffer; + } + + private static string ReverseAnsi(string text) + { + var sb = new StringBuilder(); + var ansi = new StringBuilder(); + foreach (var ch in text) + { + if (ch > 255) + { + if (ansi.Length > 0) + { + sb.Append(Utilities.ReverseString(ansi.ToString())); + ansi.Clear(); + } + sb.Append(ch); + } + else + { + ansi.Append(ch); + } + } + if (ansi.Length > 0) + { + sb.Append(Utilities.ReverseString(ansi.ToString())); + } + + return sb.ToString(); + } + + private static void AddTwo(byte[] buffer, ref int index, byte b1, byte b2) + { + buffer[index] = b1; + index++; + buffer[index] = b2; + } + + private static void WriteTime(Stream fs, TimeCode timeCode) + { + double totalMilliseconds = timeCode.TotalMilliseconds; + int frames = (int)Math.Round(totalMilliseconds / (TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate)); + fs.WriteByte((byte)(frames / 256 / 256)); + fs.WriteByte((byte)(frames / 256)); + fs.WriteByte((byte)(frames % 256)); + } + + public override bool IsMine(List lines, string fileName) + { + if (!string.IsNullOrEmpty(fileName) && File.Exists(fileName)) + { + var fi = new FileInfo(fileName); + if (fi.Length >= 512 && fi.Length < 1024000) // not too small or too big + { + if (!fileName.EndsWith(".890", StringComparison.Ordinal)) + { + return false; + } + + return base.IsMine(lines, fileName); + } + } + return false; + } + + public override string ToText(Subtitle subtitle, string title) + { + return "Not supported!"; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + const int textLength = 51; + + subtitle.Paragraphs.Clear(); + subtitle.Header = null; + byte[] buffer = FileUtil.ReadAllBytesShared(fileName); + + _languageIdLine1 = buffer[146]; + if (_languageIdLine1 == 0) + { + _languageIdLine1 = LanguageIdEnglish; + } + + Configuration.Settings.SubtitleSettings.CurrentCavena890LanguageIdLine1 = _languageIdLine1; + + _languageIdLine2 = buffer[147]; + if (_languageIdLine2 == 0) + { + _languageIdLine2 = LanguageIdEnglish; + } + + Configuration.Settings.SubtitleSettings.CurrentCavena890LanguageIdLine2 = _languageIdLine2; + + var fontNameLine1 = Encoding.ASCII.GetString(buffer, 187, 6); + var fontNameLine2 = Encoding.ASCII.GetString(buffer, 246, 6); + + // Hebrew + if (_languageIdLine1 == LanguageIdHebrew || fontNameLine1 == "HEBNOA" || fontNameLine2 == "HEBNOA") + { + _languageIdLine1 = LanguageIdHebrew; + _languageIdLine2 = LanguageIdHebrew; + } + + // Arabic + if (_languageIdLine2 == LanguageIdArabic || fontNameLine1 == "ARABIC") + { + _languageIdLine1 = LanguageIdArabic; + _languageIdLine2 = LanguageIdArabic; + } + + // Russian + else if (_languageIdLine1 == LanguageIdRussian || fontNameLine1.StartsWith("KYRIL", StringComparison.Ordinal) || fontNameLine2.StartsWith("KYRIL", StringComparison.Ordinal)) + { + _languageIdLine1 = LanguageIdRussian; + _languageIdLine2 = LanguageIdRussian; + } + + // Chinese + else if (_languageIdLine1 == LanguageIdChineseSimplified) + { + _languageIdLine1 = LanguageIdChineseSimplified; + _languageIdLine2 = LanguageIdChineseSimplified; + } + else if (_languageIdLine1 == LanguageIdChineseTraditional || fontNameLine1 == "CCKM44" || fontNameLine2 == "CCKM44") + { + _languageIdLine1 = LanguageIdChineseTraditional; + _languageIdLine2 = LanguageIdChineseTraditional; + } + + int i = 455; + int lastNumber = -1; + while (i < buffer.Length - 20) + { + int start = i - textLength; + + int number = buffer[start - 16] * 256 + buffer[start - 15]; + + var p = new Paragraph(); + double startFrame = buffer[start - 14] * 256 * 256 + buffer[start - 13] * 256 + buffer[start - 12]; + double endFrame = buffer[start - 11] * 256 * 256 + buffer[start - 10] * 256 + buffer[start - 9]; + + byte boxType = buffer[start + textLength + 3]; + + string line1 = FixText(buffer, start, textLength, _languageIdLine1); + string line2 = FixText(buffer, start + textLength + 6, textLength, _languageIdLine2); + + if (lastNumber == number) + { + p = subtitle.Paragraphs[subtitle.Paragraphs.Count - 1]; + string temp = (line1.TrimEnd() + Environment.NewLine + line2).TrimEnd(); + if (temp.Length > 0) + { + p.Text = temp; + } + } + else + { + subtitle.Paragraphs.Add(p); + p.StartTime.TotalMilliseconds = (TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate) * startFrame; + p.EndTime.TotalMilliseconds = (TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate) * endFrame; + p.Text = (line1.TrimEnd() + Environment.NewLine + line2).TrimEnd(); + } + if (boxType >= 0xa0 && boxType <= 0xa9 && !string.IsNullOrEmpty(p.Text)) // box + { + if (p.Text.StartsWith("{\\") && p.Text.Contains("}")) + { + p.Text = p.Text.Insert(p.Text.IndexOf('}', 3) + 1, "") + ""; + } + else + { + p.Text = "" + p.Text + ""; + } + } + + lastNumber = number; + + i += 128; + } + + subtitle.Renumber(); + } + + private static string FixText(byte[] buffer, int start, int textLength, int languageId) + { + string text; + + if (languageId == LanguageIdRussian) + { + var encoding = Encoding.GetEncoding(1252); + var sb = new StringBuilder(); + for (int i = 0; i < textLength; i++) + { + int b = buffer[start + i]; + int idx = RussianCodes.IndexOf(b); + if (idx >= 0) + { + sb.Append(RussianLetters[idx]); + } + else + { + sb.Append(encoding.GetString(buffer, start + i, 1)); + } + } + + text = sb.ToString(); + + text = text.Replace(encoding.GetString(new byte[] { 0x7F }), string.Empty); // Used to fill empty space upto 51 bytes + text = text.Replace(encoding.GetString(new byte[] { 0xBE }), string.Empty); // Unknown? + text = FixColors(text); + + if (text.Contains("")) + { + text = text.Replace("", ""); + } + + if (text.Contains("") && !text.Contains("")) + { + text += ""; + } + } + else if (languageId == LanguageIdHebrew) // (_language == "HEBNOA") + { + var encoding = Encoding.GetEncoding(1252); + var sb = new StringBuilder(); + for (int i = 0; i < textLength; i++) + { + int b = buffer[start + i]; + int idx = HebrewCodes.IndexOf(b); + if (idx >= 0) + { + sb.Append(HebrewLetters[idx]); + } + else + { + sb.Append(encoding.GetString(buffer, start + i, 1)); + } + } + + text = sb.ToString(); + + text = text.Replace(encoding.GetString(new byte[] { 0x7F }), string.Empty); // Used to fill empty space upto 51 bytes + text = text.Replace(encoding.GetString(new byte[] { 0xBE }), string.Empty); // Unknown? + text = FixColors(text); + + text = ReverseAnsi(text); + text = Utilities.ReverseStartAndEndingForRightToLeft(text); + } + else if (languageId == LanguageIdArabic) + { + var encoding = Encoding.GetEncoding(1252); + var sb = new StringBuilder(); + for (int i = 0; i < textLength; i++) + { + int b = buffer[start + i]; + if (ArabicDictionary.TryGetValue(b, out var v)) + { + sb.Append(v); + } + else if (b != 0x7F) // filler (decimal 127) + { + sb.Append(encoding.GetString(buffer, start + i, 1)); + } + } + + text = sb.ToString(); + text = text.Replace(encoding.GetString(new byte[] { 0xBE }), string.Empty); // Unknown? + text = FixColors(text).Trim(); + } + else if (languageId == LanguageIdChineseTraditional || languageId == LanguageIdChineseSimplified) // (_language == "CCKM44" || _language == "TVB000") + { + int index = start; + + while (textLength >= 1 && index + textLength < buffer.Length && (buffer[index + textLength - 1] == 0)) + { + textLength--; + } + + if (textLength > 0) + { + text = Encoding.GetEncoding(1201).GetString(buffer, index, textLength).Replace("\0", string.Empty); + } + else + { + text = string.Empty; + } + + var encoding = Encoding.Default; // which encoding?? Encoding.GetEncoding("ISO-8859-5") + text = text.Replace(encoding.GetString(new byte[] { 0x7F }), string.Empty); // Used to fill empty space upto 51 bytes + text = text.Replace(encoding.GetString(new byte[] { 0xBE }), string.Empty); // Unknown? + text = FixColors(text); + text = text.Replace(encoding.GetString(new byte[] { 0x88 }), ""); + text = text.Replace(encoding.GetString(new byte[] { 0x98 }), ""); + + if (text.Contains("")) + { + text = text.Replace("", ""); + } + + if (text.Contains("") && !text.Contains("")) + { + text += ""; + } + } + else + { + var encoding = Encoding.GetEncoding(1252); + text = encoding.GetString(buffer, start, textLength).Replace("\0", string.Empty); + + text = text.Replace(encoding.GetString(new byte[] { 0x7F }), string.Empty); // Used to fill empty space upto 51 bytes + text = text.Replace(encoding.GetString(new byte[] { 0xBE }), string.Empty); // Unknown? + text = FixColors(text); + + text = text.Replace(encoding.GetString(new byte[] { 0x1B }), "æ"); + text = text.Replace(encoding.GetString(new byte[] { 0x1C }), "ø"); + text = text.Replace(encoding.GetString(new byte[] { 0x1D }), "å"); + text = text.Replace(encoding.GetString(new byte[] { 0x1E }), "Æ"); + text = text.Replace(encoding.GetString(new byte[] { 0x1F }), "Ø"); + + text = text.Replace(encoding.GetString(new byte[] { 0x5B }), "Æ"); + text = text.Replace(encoding.GetString(new byte[] { 0x5C }), "Ø"); + text = text.Replace(encoding.GetString(new byte[] { 0x5D }), "Å"); + + // capitals with accent grave + text = text.Replace(encoding.GetString(new byte[] { 0x81, 0x41 }), "À"); + text = text.Replace(encoding.GetString(new byte[] { 0x81, 0x45 }), "È"); + text = text.Replace(encoding.GetString(new byte[] { 0x81, 0x49 }), "Ì"); + text = text.Replace(encoding.GetString(new byte[] { 0x81, 0x4f }), "Ò"); + text = text.Replace(encoding.GetString(new byte[] { 0x81, 0x55 }), "Ù"); + + // lowercase with accent grave + text = text.Replace(encoding.GetString(new byte[] { 0x81, 0x61 }), "à"); + text = text.Replace(encoding.GetString(new byte[] { 0x81, 0x65 }), "è"); + text = text.Replace(encoding.GetString(new byte[] { 0x81, 0x69 }), "ì"); + text = text.Replace(encoding.GetString(new byte[] { 0x81, 0x6F }), "ò"); + text = text.Replace(encoding.GetString(new byte[] { 0x81, 0x75 }), "ù"); + + // capitals with accent aigu + text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x41 }), "Á"); + text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x43 }), "Ć"); + text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x45 }), "É"); + text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x49 }), "Í"); + text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x4C }), "Ĺ"); + text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x4E }), "Ń"); + text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x4F }), "Ó"); + text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x52 }), "Ŕ"); + text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x53 }), "Ś"); + text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x55 }), "Ú"); + text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x57 }), "Ẃ"); + text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x59 }), "Ý"); + text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x5A }), "Ź"); + + // lowercase with accent aigu + text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x61 }), "á"); + text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x63 }), "ć"); + text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x65 }), "é"); + text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x69 }), "í"); + text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x6C }), "ĺ"); + text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x6E }), "ń"); + text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x6F }), "ó"); + text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x72 }), "ŕ"); + text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x73 }), "ś"); + text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x75 }), "ú"); + text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x77 }), "ẃ"); + text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x79 }), "ý"); + text = text.Replace(encoding.GetString(new byte[] { 0x82, 0x7A }), "ź"); + + // capitals with accent circonflexe + text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x41 }), "Â"); + text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x43 }), "Ĉ"); + text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x45 }), "Ê"); + text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x47 }), "Ĝ"); + text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x48 }), "Ĥ"); + text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x49 }), "Î"); + text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x4A }), "Ĵ"); + text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x4F }), "Ô"); + text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x53 }), "Ŝ"); + text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x55 }), "Û"); + text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x57 }), "Ŵ"); + text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x59 }), "Ŷ"); + + // lowercase with accent circonflexe + text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x61 }), "â"); + text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x63 }), "ĉ"); + text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x65 }), "ê"); + text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x67 }), "ĝ"); + text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x68 }), "ĥ"); + text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x69 }), "î"); + text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x6A }), "ĵ"); + text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x6F }), "ô"); + text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x73 }), "ŝ"); + text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x75 }), "û"); + text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x77 }), "ŵ"); + text = text.Replace(encoding.GetString(new byte[] { 0x83, 0x79 }), "ŷ"); + + // capitals with caron + text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x41 }), "Ǎ"); + text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x43 }), "Č"); + text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x44 }), "Ď"); + text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x45 }), "Ě"); + text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x47 }), "Ǧ"); + text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x49 }), "Ǐ"); + text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x4C }), "Ľ"); + text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x4E }), "Ň"); + text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x52 }), "Ř"); + text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x53 }), "Š"); + text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x54 }), "Ť"); + text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x5A }), "Ž"); + + // lowercase with caron + text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x61 }), "ǎ"); + text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x63 }), "č"); + text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x64 }), "ď"); + text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x65 }), "ě"); + text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x67 }), "ǧ"); + text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x69 }), "ǐ"); + text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x6C }), "ľ"); + text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x6E }), "ň"); + text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x72 }), "ř"); + text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x73 }), "š"); + text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x74 }), "ť"); + text = text.Replace(encoding.GetString(new byte[] { 0x84, 0x7A }), "ž"); + + // capitals with tilde + text = text.Replace(encoding.GetString(new byte[] { 0x85, 0x41 }), "Ã"); + text = text.Replace(encoding.GetString(new byte[] { 0x85, 0x49 }), "Ĩ"); + text = text.Replace(encoding.GetString(new byte[] { 0x85, 0x4E }), "Ñ"); + text = text.Replace(encoding.GetString(new byte[] { 0x85, 0x4F }), "Õ"); + text = text.Replace(encoding.GetString(new byte[] { 0x85, 0x55 }), "Ũ"); + + // lowercase with tilde + text = text.Replace(encoding.GetString(new byte[] { 0x85, 0x61 }), "ã"); + text = text.Replace(encoding.GetString(new byte[] { 0x85, 0x69 }), "ĩ"); + text = text.Replace(encoding.GetString(new byte[] { 0x85, 0x6E }), "ñ"); + text = text.Replace(encoding.GetString(new byte[] { 0x85, 0x6F }), "õ"); + text = text.Replace(encoding.GetString(new byte[] { 0x85, 0x75 }), "ũ"); + + // capitals with trema + text = text.Replace(encoding.GetString(new byte[] { 0x86, 0x41 }), "Ä"); + text = text.Replace(encoding.GetString(new byte[] { 0x86, 0x45 }), "Ë"); + text = text.Replace(encoding.GetString(new byte[] { 0x86, 0x49 }), "Ï"); + text = text.Replace(encoding.GetString(new byte[] { 0x86, 0x4F }), "Ö"); + text = text.Replace(encoding.GetString(new byte[] { 0x86, 0x55 }), "Ü"); + text = text.Replace(encoding.GetString(new byte[] { 0x86, 0x59 }), "Ÿ"); + + // lowercase with trema + text = text.Replace(encoding.GetString(new byte[] { 0x86, 0x61 }), "ä"); + text = text.Replace(encoding.GetString(new byte[] { 0x86, 0x65 }), "ë"); + text = text.Replace(encoding.GetString(new byte[] { 0x86, 0x69 }), "ï"); + text = text.Replace(encoding.GetString(new byte[] { 0x86, 0x6F }), "ö"); + text = text.Replace(encoding.GetString(new byte[] { 0x86, 0x75 }), "ü"); + text = text.Replace(encoding.GetString(new byte[] { 0x86, 0x79 }), "ÿ"); + + // with ring + text = text.Replace(encoding.GetString(new byte[] { 0x8C, 0x61 }), "å"); + text = text.Replace(encoding.GetString(new byte[] { 0x8C, 0x41 }), "Å"); + + text = text.Replace(encoding.GetString(new byte[] { 0x88 }), ""); + text = text.Replace(encoding.GetString(new byte[] { 0x98 }), ""); + + // ăĂ şŞ ţŢ (romanian) + text = text.Replace(encoding.GetString(new byte[] { 0x89, 0x61 }), "ă"); + text = text.Replace(encoding.GetString(new byte[] { 0x89, 0x41 }), "Ă"); + text = text.Replace(encoding.GetString(new byte[] { 0x87, 0x73 }), "ş"); + text = text.Replace(encoding.GetString(new byte[] { 0x87, 0x53 }), "Ş"); + text = text.Replace(encoding.GetString(new byte[] { 0x87, 0x74 }), "ţ"); + text = text.Replace(encoding.GetString(new byte[] { 0x87, 0x54 }), "Ţ"); + + if (text.Contains("")) + { + text = text.Replace("", ""); + } + + if (text.Contains("") && !text.Contains("")) + { + text += ""; + } + } + return text; + } + + private static string FixColors(string text) + { + Encoding encoding = Encoding.GetEncoding(1252); + bool fontColorOn = false; + var sb = new StringBuilder(); + for (int i = 0; i < text.Length; i++) + { + var s = text.Substring(i, 1); + if (s == encoding.GetString(new byte[] { 0xf1 })) + { + if (fontColorOn) + { + sb.Append(""); // white + } + sb.Append(""); // red + fontColorOn = true; + } + else if (s == encoding.GetString(new byte[] { 0xf2 })) + { + if (fontColorOn) + { + sb.Append(""); // white + } + sb.Append(""); // green + fontColorOn = true; + } + else if (s == encoding.GetString(new byte[] { 0xf3 })) + { + if (fontColorOn) + { + sb.Append(""); // white + } + sb.Append(""); // yellow + fontColorOn = true; + } + else if (s == encoding.GetString(new byte[] { 0xf4 })) + { + if (fontColorOn) + { + sb.Append(""); // white + } + sb.Append(""); // purple + fontColorOn = true; + } + else if (s == encoding.GetString(new byte[] { 0xf5 })) + { + if (fontColorOn) + { + sb.Append(""); // white + } + sb.Append(""); // magenta + fontColorOn = true; + } + else if (s == encoding.GetString(new byte[] { 0xf6 })) + { + if (fontColorOn) + { + sb.Append(""); // white + } + sb.Append(""); // cyan + fontColorOn = true; + } + else if (s == encoding.GetString(new byte[] { 0xf7 })) + { + if (fontColorOn) + { + sb.Append(""); // white + fontColorOn = false; + } + } + else if (s == encoding.GetString(new byte[] { 0xf8 })) + { + sb.Append(""); // orange + fontColorOn = true; + } + else + { + sb.Append(s); + } + } + if (fontColorOn) + { + sb.Append(""); // white + } + return sb.ToString(); + } + + } +} diff --git a/libse/SubtitleFormats/CheetahCaption.cs b/src/libse/SubtitleFormats/CheetahCaption.cs similarity index 97% rename from libse/SubtitleFormats/CheetahCaption.cs rename to src/libse/SubtitleFormats/CheetahCaption.cs index 642f4e5ac..03c334d3f 100644 --- a/libse/SubtitleFormats/CheetahCaption.cs +++ b/src/libse/SubtitleFormats/CheetahCaption.cs @@ -1,367 +1,367 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class CheetahCaption : SubtitleFormat - { - private static readonly Dictionary DicCodeLatin = new Dictionary - { - [0x81] = '♪', - [0x82] = 'á', - [0x83] = 'é', - [0x84] = 'í', - [0x85] = 'ó', - [0x86] = 'ú', - [0x87] = 'â', - [0x88] = 'ê', - [0x89] = 'î', - [0x8A] = 'ô', - [0x8B] = 'û', - [0x8C] = 'à', - [0x8D] = 'è', - [0x8E] = 'Ñ', - [0x8F] = 'ñ', - [0x90] = 'ç', - [0x91] = '¢', - [0x92] = '£', - [0x93] = '¿', - [0x94] = '½', - [0x95] = '®', - }; - - public override string Extension => ".cap"; - - public const string NameOfFormat = "Cheetah Caption"; - - public override string Name => NameOfFormat; - - public static void Save(string fileName, Subtitle subtitle) - { - using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write)) - { - byte[] buffer = { 0xEA, 0x22, 1, 0 }; // header - fs.Write(buffer, 0, buffer.Length); - - int numberOfLines = subtitle.Paragraphs.Count; - fs.WriteByte((byte)(numberOfLines % 256)); // paragraphs - low byte - fs.WriteByte((byte)(numberOfLines / 256)); // paragraphs - high byte - - buffer = new byte[] { 9, 0xA8, 0xAF, 0x4F }; // ? - fs.Write(buffer, 0, buffer.Length); - - for (int i = 0; i < 118; i++) - { - fs.WriteByte(0); - } - - var dictionaryLatinCode = DicCodeLatin.ToLookup(pair => pair.Value, pair => pair.Key); - - // paragraphs - for (int index = 0; index < subtitle.Paragraphs.Count; index++) - { - var p = subtitle.Paragraphs[index]; - var next = subtitle.GetParagraphOrDefault(index + 1); - string text = p.Text; - - var bufferShort = new byte[] - { - 0, - 0, - 3, // justification, 1=left, 2=right, 3=center - 0xE, //horizontal position, 1=top, F=bottom - 0x10 //horizontal position, 3=left, 0x10=center, 0x19=right - }; - - //styles + ? - buffer = new byte[] - { - 0x12, - 1, - 0, - 0, - 0, - 0, - 3, // justification, 1=left, 2=right, 3=center - 0xF, //horizontal position, 1=top, F=bottom - 0x10 //horizontal position, 3=left, 0x10=center, 0x19=right - }; - - //Normal : 12 01 00 00 00 00 03 0F 10 - //Right-top : 12 01 00 00 00 00 03 01 1C - //Top : 12 01 00 00 00 00 03 01 10 - //Left-top : 12 01 00 00 00 00 03 01 05 - //Left : 12 01 00 00 00 00 03 0F 0A - //Right : 12 01 00 00 00 00 03 0F 1E - //Left : 12 03 00 00 00 00 03 0F 07 - - if (text.StartsWith("{\\an7}", StringComparison.Ordinal) || text.StartsWith("{\\an8}", StringComparison.Ordinal) || text.StartsWith("{\\an9}", StringComparison.Ordinal)) - { - buffer[7] = 1; // align top (vertical) - bufferShort[3] = 1; // align top (vertical) - } - else if (text.StartsWith("{\\an4}", StringComparison.Ordinal) || text.StartsWith("{\\an5}", StringComparison.Ordinal) || text.StartsWith("{\\an6}", StringComparison.Ordinal)) - { - buffer[7] = 8; // center (vertical) - bufferShort[3] = 8; // align top (vertical) - } - - if (text.StartsWith("{\\an7}", StringComparison.Ordinal) || text.StartsWith("{\\an4}", StringComparison.Ordinal) || text.StartsWith("{\\an1}", StringComparison.Ordinal)) - { - buffer[8] = 2; // align left (horizontal) - bufferShort[4] = 2; // align left (horizontal) - } - else if (text.StartsWith("{\\an9}", StringComparison.Ordinal) || text.StartsWith("{\\an6}", StringComparison.Ordinal) || text.StartsWith("{\\an3}", StringComparison.Ordinal)) - { - buffer[8] = 0x1e; // align right (vertical) - bufferShort[4] = 0x1e; // align right (vertical) - } - - int startTag = text.IndexOf('}'); - if (text.StartsWith("{\\", StringComparison.Ordinal) && startTag > 0 && startTag < 10) - { - text = text.Remove(0, startTag + 1); - } - - var textBytes = new List(); - var italic = p.Text.StartsWith("", StringComparison.Ordinal) && p.Text.EndsWith("", StringComparison.Ordinal); - text = HtmlUtil.RemoveHtmlTags(text); - int j = 0; - if (italic) - { - textBytes.Add(0xd0); - } - - var encoding = Encoding.GetEncoding(1252); - while (j < text.Length) - { - if (text.Substring(j).StartsWith(Environment.NewLine, StringComparison.Ordinal)) - { - j += Environment.NewLine.Length; - textBytes.Add(0); - textBytes.Add(0); - textBytes.Add(0); - textBytes.Add(0); - if (italic) - { - textBytes.Add(0xd0); - } - } - else - { - if (dictionaryLatinCode.Contains(text[j])) - { - textBytes.AddRange(dictionaryLatinCode[text[j]]); - } - else - { - textBytes.Add(encoding.GetBytes(new[] { text[j] })[0]); - } - - j++; - } - } - - int length = textBytes.Count + 20; - long end = fs.Position + length; - if (Configuration.Settings.SubtitleSettings.CheetahCaptionAlwayWriteEndTime || next == null || next.StartTime.TotalMilliseconds - p.EndTime.TotalMilliseconds >= 1500) - { - fs.WriteByte((byte)length); - - fs.WriteByte(p.Text.Trim().Contains(Environment.NewLine) ? (byte)0x62 : (byte)0x61); - - WriteTime(fs, p.StartTime); - WriteTime(fs, p.EndTime); - fs.Write(buffer, 0, buffer.Length); // styles - } - else - { - length = textBytes.Count + 20 - (buffer.Length - bufferShort.Length); - end = fs.Position + length; - fs.WriteByte((byte)length); - - fs.WriteByte(p.Text.Trim().Contains(Environment.NewLine) ? (byte)0x42 : (byte)0x41); - - WriteTime(fs, p.StartTime); - fs.WriteByte(2); - fs.WriteByte(1); - fs.WriteByte(0); - fs.WriteByte(0); - fs.Write(bufferShort, 0, bufferShort.Length); // styles - } - - foreach (byte b in textBytes) // text - { - fs.WriteByte(b); - } - - while (end > fs.Position) - { - fs.WriteByte(0); - } - } - } - } - - private static void WriteTime(Stream fs, TimeCode timeCode) - { - fs.WriteByte((byte)timeCode.Hours); - fs.WriteByte((byte)timeCode.Minutes); - fs.WriteByte((byte)timeCode.Seconds); - fs.WriteByte((byte)MillisecondsToFramesMaxFrameRate(timeCode.Milliseconds)); - } - - public override bool IsMine(List lines, string fileName) - { - if (!string.IsNullOrEmpty(fileName) && File.Exists(fileName)) - { - var fi = new FileInfo(fileName); - if (fi.Length >= 200 && fi.Length < 1024000) // not too small or too big - { - if (fileName.EndsWith(".cap", StringComparison.OrdinalIgnoreCase)) - { - byte[] buffer = FileUtil.ReadAllBytesShared(fileName); - for (int i = 0; i < buffer.Length - 20; i++) - { - if (buffer[i + 0] == 0xEA && - buffer[i + 1] == 0x22 && - buffer[i + 2] <= 3) - { - return true; - } - } - } - } - } - return false; - } - - public override string ToText(Subtitle subtitle, string title) => "Not supported!"; - - private static TimeCode DecodeTimestamp(byte[] buffer, int index) - { - return new TimeCode(buffer[index], buffer[index + 1], buffer[index + 2], FramesToMillisecondsMax999(buffer[index + 3])); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - subtitle.Paragraphs.Clear(); - subtitle.Header = null; - byte[] buffer = FileUtil.ReadAllBytesShared(fileName); - - int i = 128; - Paragraph last = null; - var sb = new StringBuilder(); - while (i < buffer.Length - 16) - { - var p = new Paragraph(); - int length = buffer[i]; - - int usedBytes = 20; - - p.StartTime = DecodeTimestamp(buffer, i + 2); - p.EndTime = DecodeTimestamp(buffer, i + 6); - if (p.EndTime.Hours == 2 && p.EndTime.Minutes == 1 && p.EndTime.Seconds == 0 && p.EndTime.Milliseconds == 0 && - (p.Duration.TotalMilliseconds < 0 || p.Duration.TotalMilliseconds > 5000)) - { - usedBytes = 20 - 4; - } - - int textLength = length - usedBytes; - int start = usedBytes - 1; - for (int j = 0; j < 4; j++) - { - if (buffer[i + start - 1] > 0x10) - { - start--; - textLength++; - } - } - - if (textLength > 0 && buffer.Length >= i + textLength) - { - if (last != null && last.EndTime.TotalMilliseconds > p.StartTime.TotalMilliseconds) - { - last.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; - } - - sb.Clear(); - int j = 0; - bool italics = false; - var encoding = Encoding.GetEncoding(1252); - while (j < textLength) - { - int index = i + start + j; - if (buffer[index] == 0) - { - if (italics) - { - sb.Append(""); - } - - italics = false; - if (!sb.ToString().EndsWith(Environment.NewLine, StringComparison.Ordinal)) - { - sb.AppendLine(); - } - } - else if (DicCodeLatin.ContainsKey(buffer[index])) - { - sb.Append(DicCodeLatin[buffer[index]]); - } - else if (buffer[index] >= 0xC0 || buffer[index] <= 0x14) // codes/styles? - { - if (buffer[index] == 0xd0) // italics - { - italics = true; - sb.Append(""); - } - } - else - { - sb.Append(encoding.GetString(buffer, index, 1)); - } - j++; - } - if (italics) - { - sb.Append(""); - } - - p.Text = sb.ToString().Trim(); - p.Text = p.Text.Replace("" + Environment.NewLine + "", Environment.NewLine); - - subtitle.Paragraphs.Add(p); - last = p; - } - if (length == 0) - { - length++; - } - - i += length; - } - if (last != null && (last.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds || last.Duration.TotalMilliseconds < Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds)) - { - last.EndTime.TotalMilliseconds = last.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(last.Text); - } - - for (var index = 0; index < subtitle.Paragraphs.Count - 1; index++) - { - var current = subtitle.Paragraphs[index]; - var next = subtitle.Paragraphs[index + 1]; - if (current.EndTime.Hours == 2 && current.EndTime.Minutes == 1 && current.EndTime.Seconds == 0 && current.EndTime.Milliseconds == 0 && - (current.Duration.TotalMilliseconds < 0 || current.Duration.TotalMilliseconds > 5000)) - { - current.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; - } - } - - subtitle.Renumber(); - } - } -} +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class CheetahCaption : SubtitleFormat + { + private static readonly Dictionary DicCodeLatin = new Dictionary + { + [0x81] = '♪', + [0x82] = 'á', + [0x83] = 'é', + [0x84] = 'í', + [0x85] = 'ó', + [0x86] = 'ú', + [0x87] = 'â', + [0x88] = 'ê', + [0x89] = 'î', + [0x8A] = 'ô', + [0x8B] = 'û', + [0x8C] = 'à', + [0x8D] = 'è', + [0x8E] = 'Ñ', + [0x8F] = 'ñ', + [0x90] = 'ç', + [0x91] = '¢', + [0x92] = '£', + [0x93] = '¿', + [0x94] = '½', + [0x95] = '®', + }; + + public override string Extension => ".cap"; + + public const string NameOfFormat = "Cheetah Caption"; + + public override string Name => NameOfFormat; + + public static void Save(string fileName, Subtitle subtitle) + { + using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write)) + { + byte[] buffer = { 0xEA, 0x22, 1, 0 }; // header + fs.Write(buffer, 0, buffer.Length); + + int numberOfLines = subtitle.Paragraphs.Count; + fs.WriteByte((byte)(numberOfLines % 256)); // paragraphs - low byte + fs.WriteByte((byte)(numberOfLines / 256)); // paragraphs - high byte + + buffer = new byte[] { 9, 0xA8, 0xAF, 0x4F }; // ? + fs.Write(buffer, 0, buffer.Length); + + for (int i = 0; i < 118; i++) + { + fs.WriteByte(0); + } + + var dictionaryLatinCode = DicCodeLatin.ToLookup(pair => pair.Value, pair => pair.Key); + + // paragraphs + for (int index = 0; index < subtitle.Paragraphs.Count; index++) + { + var p = subtitle.Paragraphs[index]; + var next = subtitle.GetParagraphOrDefault(index + 1); + string text = p.Text; + + var bufferShort = new byte[] + { + 0, + 0, + 3, // justification, 1=left, 2=right, 3=center + 0xE, //horizontal position, 1=top, F=bottom + 0x10 //horizontal position, 3=left, 0x10=center, 0x19=right + }; + + //styles + ? + buffer = new byte[] + { + 0x12, + 1, + 0, + 0, + 0, + 0, + 3, // justification, 1=left, 2=right, 3=center + 0xF, //horizontal position, 1=top, F=bottom + 0x10 //horizontal position, 3=left, 0x10=center, 0x19=right + }; + + //Normal : 12 01 00 00 00 00 03 0F 10 + //Right-top : 12 01 00 00 00 00 03 01 1C + //Top : 12 01 00 00 00 00 03 01 10 + //Left-top : 12 01 00 00 00 00 03 01 05 + //Left : 12 01 00 00 00 00 03 0F 0A + //Right : 12 01 00 00 00 00 03 0F 1E + //Left : 12 03 00 00 00 00 03 0F 07 + + if (text.StartsWith("{\\an7}", StringComparison.Ordinal) || text.StartsWith("{\\an8}", StringComparison.Ordinal) || text.StartsWith("{\\an9}", StringComparison.Ordinal)) + { + buffer[7] = 1; // align top (vertical) + bufferShort[3] = 1; // align top (vertical) + } + else if (text.StartsWith("{\\an4}", StringComparison.Ordinal) || text.StartsWith("{\\an5}", StringComparison.Ordinal) || text.StartsWith("{\\an6}", StringComparison.Ordinal)) + { + buffer[7] = 8; // center (vertical) + bufferShort[3] = 8; // align top (vertical) + } + + if (text.StartsWith("{\\an7}", StringComparison.Ordinal) || text.StartsWith("{\\an4}", StringComparison.Ordinal) || text.StartsWith("{\\an1}", StringComparison.Ordinal)) + { + buffer[8] = 2; // align left (horizontal) + bufferShort[4] = 2; // align left (horizontal) + } + else if (text.StartsWith("{\\an9}", StringComparison.Ordinal) || text.StartsWith("{\\an6}", StringComparison.Ordinal) || text.StartsWith("{\\an3}", StringComparison.Ordinal)) + { + buffer[8] = 0x1e; // align right (vertical) + bufferShort[4] = 0x1e; // align right (vertical) + } + + int startTag = text.IndexOf('}'); + if (text.StartsWith("{\\", StringComparison.Ordinal) && startTag > 0 && startTag < 10) + { + text = text.Remove(0, startTag + 1); + } + + var textBytes = new List(); + var italic = p.Text.StartsWith("", StringComparison.Ordinal) && p.Text.EndsWith("", StringComparison.Ordinal); + text = HtmlUtil.RemoveHtmlTags(text); + int j = 0; + if (italic) + { + textBytes.Add(0xd0); + } + + var encoding = Encoding.GetEncoding(1252); + while (j < text.Length) + { + if (text.Substring(j).StartsWith(Environment.NewLine, StringComparison.Ordinal)) + { + j += Environment.NewLine.Length; + textBytes.Add(0); + textBytes.Add(0); + textBytes.Add(0); + textBytes.Add(0); + if (italic) + { + textBytes.Add(0xd0); + } + } + else + { + if (dictionaryLatinCode.Contains(text[j])) + { + textBytes.AddRange(dictionaryLatinCode[text[j]]); + } + else + { + textBytes.Add(encoding.GetBytes(new[] { text[j] })[0]); + } + + j++; + } + } + + int length = textBytes.Count + 20; + long end = fs.Position + length; + if (Configuration.Settings.SubtitleSettings.CheetahCaptionAlwayWriteEndTime || next == null || next.StartTime.TotalMilliseconds - p.EndTime.TotalMilliseconds >= 1500) + { + fs.WriteByte((byte)length); + + fs.WriteByte(p.Text.Trim().Contains(Environment.NewLine) ? (byte)0x62 : (byte)0x61); + + WriteTime(fs, p.StartTime); + WriteTime(fs, p.EndTime); + fs.Write(buffer, 0, buffer.Length); // styles + } + else + { + length = textBytes.Count + 20 - (buffer.Length - bufferShort.Length); + end = fs.Position + length; + fs.WriteByte((byte)length); + + fs.WriteByte(p.Text.Trim().Contains(Environment.NewLine) ? (byte)0x42 : (byte)0x41); + + WriteTime(fs, p.StartTime); + fs.WriteByte(2); + fs.WriteByte(1); + fs.WriteByte(0); + fs.WriteByte(0); + fs.Write(bufferShort, 0, bufferShort.Length); // styles + } + + foreach (byte b in textBytes) // text + { + fs.WriteByte(b); + } + + while (end > fs.Position) + { + fs.WriteByte(0); + } + } + } + } + + private static void WriteTime(Stream fs, TimeCode timeCode) + { + fs.WriteByte((byte)timeCode.Hours); + fs.WriteByte((byte)timeCode.Minutes); + fs.WriteByte((byte)timeCode.Seconds); + fs.WriteByte((byte)MillisecondsToFramesMaxFrameRate(timeCode.Milliseconds)); + } + + public override bool IsMine(List lines, string fileName) + { + if (!string.IsNullOrEmpty(fileName) && File.Exists(fileName)) + { + var fi = new FileInfo(fileName); + if (fi.Length >= 200 && fi.Length < 1024000) // not too small or too big + { + if (fileName.EndsWith(".cap", StringComparison.OrdinalIgnoreCase)) + { + byte[] buffer = FileUtil.ReadAllBytesShared(fileName); + for (int i = 0; i < buffer.Length - 20; i++) + { + if (buffer[i + 0] == 0xEA && + buffer[i + 1] == 0x22 && + buffer[i + 2] <= 3) + { + return true; + } + } + } + } + } + return false; + } + + public override string ToText(Subtitle subtitle, string title) => "Not supported!"; + + private static TimeCode DecodeTimestamp(byte[] buffer, int index) + { + return new TimeCode(buffer[index], buffer[index + 1], buffer[index + 2], FramesToMillisecondsMax999(buffer[index + 3])); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + subtitle.Paragraphs.Clear(); + subtitle.Header = null; + byte[] buffer = FileUtil.ReadAllBytesShared(fileName); + + int i = 128; + Paragraph last = null; + var sb = new StringBuilder(); + while (i < buffer.Length - 16) + { + var p = new Paragraph(); + int length = buffer[i]; + + int usedBytes = 20; + + p.StartTime = DecodeTimestamp(buffer, i + 2); + p.EndTime = DecodeTimestamp(buffer, i + 6); + if (p.EndTime.Hours == 2 && p.EndTime.Minutes == 1 && p.EndTime.Seconds == 0 && p.EndTime.Milliseconds == 0 && + (p.Duration.TotalMilliseconds < 0 || p.Duration.TotalMilliseconds > 5000)) + { + usedBytes = 20 - 4; + } + + int textLength = length - usedBytes; + int start = usedBytes - 1; + for (int j = 0; j < 4; j++) + { + if (buffer[i + start - 1] > 0x10) + { + start--; + textLength++; + } + } + + if (textLength > 0 && buffer.Length >= i + textLength) + { + if (last != null && last.EndTime.TotalMilliseconds > p.StartTime.TotalMilliseconds) + { + last.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; + } + + sb.Clear(); + int j = 0; + bool italics = false; + var encoding = Encoding.GetEncoding(1252); + while (j < textLength) + { + int index = i + start + j; + if (buffer[index] == 0) + { + if (italics) + { + sb.Append(""); + } + + italics = false; + if (!sb.ToString().EndsWith(Environment.NewLine, StringComparison.Ordinal)) + { + sb.AppendLine(); + } + } + else if (DicCodeLatin.ContainsKey(buffer[index])) + { + sb.Append(DicCodeLatin[buffer[index]]); + } + else if (buffer[index] >= 0xC0 || buffer[index] <= 0x14) // codes/styles? + { + if (buffer[index] == 0xd0) // italics + { + italics = true; + sb.Append(""); + } + } + else + { + sb.Append(encoding.GetString(buffer, index, 1)); + } + j++; + } + if (italics) + { + sb.Append(""); + } + + p.Text = sb.ToString().Trim(); + p.Text = p.Text.Replace("" + Environment.NewLine + "", Environment.NewLine); + + subtitle.Paragraphs.Add(p); + last = p; + } + if (length == 0) + { + length++; + } + + i += length; + } + if (last != null && (last.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds || last.Duration.TotalMilliseconds < Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds)) + { + last.EndTime.TotalMilliseconds = last.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(last.Text); + } + + for (var index = 0; index < subtitle.Paragraphs.Count - 1; index++) + { + var current = subtitle.Paragraphs[index]; + var next = subtitle.Paragraphs[index + 1]; + if (current.EndTime.Hours == 2 && current.EndTime.Minutes == 1 && current.EndTime.Seconds == 0 && current.EndTime.Milliseconds == 0 && + (current.Duration.TotalMilliseconds < 0 || current.Duration.TotalMilliseconds > 5000)) + { + current.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; + } + } + + subtitle.Renumber(); + } + } +} diff --git a/libse/SubtitleFormats/CheetahCaptionOld.cs b/src/libse/SubtitleFormats/CheetahCaptionOld.cs similarity index 97% rename from libse/SubtitleFormats/CheetahCaptionOld.cs rename to src/libse/SubtitleFormats/CheetahCaptionOld.cs index 3c4a3467a..7152e9bc7 100644 --- a/libse/SubtitleFormats/CheetahCaptionOld.cs +++ b/src/libse/SubtitleFormats/CheetahCaptionOld.cs @@ -1,99 +1,99 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class CheetahCaptionOld : SubtitleFormat - { - - public override string Extension => ".cap"; - - public const string NameOfFormat = "Cheetah Caption Old"; - - public override string Name => NameOfFormat; - - public static void Save(string fileName, Subtitle subtitle) - { - } - - public override bool IsMine(List lines, string fileName) - { - if (!string.IsNullOrEmpty(fileName) && File.Exists(fileName)) - { - var fi = new FileInfo(fileName); - if (fi.Length >= 200 && fi.Length < 1024000) // not too small or too big - { - if (fileName.EndsWith(".cap", StringComparison.OrdinalIgnoreCase)) - { - byte[] buffer = FileUtil.ReadAllBytesShared(fileName); - if (buffer[0] == 0xEA && buffer[1] == 0x10) - { - var subtitle = new Subtitle(); - LoadSubtitle(subtitle, lines, fileName); - return subtitle.Paragraphs.Count > _errorCount || _errorCount > 25; - } - } - } - } - return false; - } - - public override string ToText(Subtitle subtitle, string title) - { - return "Not supported!"; - } - - private static TimeCode DecodeTimestamp(byte[] buffer, int index) - { - return new TimeCode(buffer[index], buffer[index + 1], buffer[index + 2], FramesToMillisecondsMax999(buffer[index + 3])); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - subtitle.Paragraphs.Clear(); - subtitle.Header = null; - byte[] buffer = FileUtil.ReadAllBytesShared(fileName); - int i = 0x80; - var sb = new StringBuilder(); - while (i < buffer.Length - 0xb1) - { - if (buffer[i] > 30) - { - _errorCount++; - } - sb.AppendLine(Encoding.ASCII.GetString(buffer, i + 0x1a, 38).Replace("\0", string.Empty)); - sb.Append(Encoding.ASCII.GetString(buffer, i + 0x40, 38).Replace("\0", string.Empty)); - var p = new Paragraph(DecodeTimestamp(buffer, i), DecodeTimestamp(buffer, i + 4), sb.ToString().Trim()); - subtitle.Paragraphs.Add(p); - sb.Clear(); - i += 0xb2; - } - for (int index = 0; index < subtitle.Paragraphs.Count; index++) - { - var paragraph = subtitle.Paragraphs[index]; - var next = subtitle.GetParagraphOrDefault(index + 1); - if (paragraph.Duration.TotalSeconds > 100) - { - _errorCount++; - } - if (Math.Abs(paragraph.EndTime.TotalMilliseconds) < 0.1 || paragraph.Duration.TotalMilliseconds < 0.1) - { - if (next != null) - { - paragraph.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; - } - if (next == null || paragraph.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) - { - paragraph.EndTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(paragraph.Text); - } - } - } - subtitle.Renumber(); - } - - } -} +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class CheetahCaptionOld : SubtitleFormat + { + + public override string Extension => ".cap"; + + public const string NameOfFormat = "Cheetah Caption Old"; + + public override string Name => NameOfFormat; + + public static void Save(string fileName, Subtitle subtitle) + { + } + + public override bool IsMine(List lines, string fileName) + { + if (!string.IsNullOrEmpty(fileName) && File.Exists(fileName)) + { + var fi = new FileInfo(fileName); + if (fi.Length >= 200 && fi.Length < 1024000) // not too small or too big + { + if (fileName.EndsWith(".cap", StringComparison.OrdinalIgnoreCase)) + { + byte[] buffer = FileUtil.ReadAllBytesShared(fileName); + if (buffer[0] == 0xEA && buffer[1] == 0x10) + { + var subtitle = new Subtitle(); + LoadSubtitle(subtitle, lines, fileName); + return subtitle.Paragraphs.Count > _errorCount || _errorCount > 25; + } + } + } + } + return false; + } + + public override string ToText(Subtitle subtitle, string title) + { + return "Not supported!"; + } + + private static TimeCode DecodeTimestamp(byte[] buffer, int index) + { + return new TimeCode(buffer[index], buffer[index + 1], buffer[index + 2], FramesToMillisecondsMax999(buffer[index + 3])); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + subtitle.Paragraphs.Clear(); + subtitle.Header = null; + byte[] buffer = FileUtil.ReadAllBytesShared(fileName); + int i = 0x80; + var sb = new StringBuilder(); + while (i < buffer.Length - 0xb1) + { + if (buffer[i] > 30) + { + _errorCount++; + } + sb.AppendLine(Encoding.ASCII.GetString(buffer, i + 0x1a, 38).Replace("\0", string.Empty)); + sb.Append(Encoding.ASCII.GetString(buffer, i + 0x40, 38).Replace("\0", string.Empty)); + var p = new Paragraph(DecodeTimestamp(buffer, i), DecodeTimestamp(buffer, i + 4), sb.ToString().Trim()); + subtitle.Paragraphs.Add(p); + sb.Clear(); + i += 0xb2; + } + for (int index = 0; index < subtitle.Paragraphs.Count; index++) + { + var paragraph = subtitle.Paragraphs[index]; + var next = subtitle.GetParagraphOrDefault(index + 1); + if (paragraph.Duration.TotalSeconds > 100) + { + _errorCount++; + } + if (Math.Abs(paragraph.EndTime.TotalMilliseconds) < 0.1 || paragraph.Duration.TotalMilliseconds < 0.1) + { + if (next != null) + { + paragraph.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; + } + if (next == null || paragraph.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) + { + paragraph.EndTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(paragraph.Text); + } + } + } + subtitle.Renumber(); + } + + } +} diff --git a/libse/SubtitleFormats/Chk.cs b/src/libse/SubtitleFormats/Chk.cs similarity index 97% rename from libse/SubtitleFormats/Chk.cs rename to src/libse/SubtitleFormats/Chk.cs index 881cb5514..b2f2dd765 100644 --- a/libse/SubtitleFormats/Chk.cs +++ b/src/libse/SubtitleFormats/Chk.cs @@ -1,313 +1,313 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - /// - /// .CHK subtitle file format - 128 bytes blocks, first byte in block is id (01==text) - /// - public class Chk : SubtitleFormat - { - private readonly Encoding _codePage = Encoding.GetEncoding(850); - // private string _languageId = "DEN"; // English - - public override string Extension => ".chk"; - - public const string NameOfFormat = "CHK"; - - public override string Name => NameOfFormat; - - public override bool IsMine(List lines, string fileName) - { - if (fileName.EndsWith(".chk", StringComparison.OrdinalIgnoreCase)) - { - var buffer = FileUtil.ReadAllBytesShared(fileName); - return buffer.Length > 0 && buffer[0] == 0x1d; - } - return false; - } - - public override string ToText(Subtitle subtitle, string title) - { - return "Not implemented!"; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - var buffer = FileUtil.ReadAllBytesShared(fileName); - int index = 256; - _errorCount = 0; - subtitle.Paragraphs.Clear(); - while (index < buffer.Length) - { - Paragraph p = ReadParagraph(buffer, index); - if (p != null) - { - subtitle.Paragraphs.Add(p); - } - - index += 128; - } - - if (subtitle.Paragraphs.Count > 1) - { - if (string.IsNullOrWhiteSpace(subtitle.Paragraphs[0].Text)) - { - subtitle.Paragraphs.RemoveAt(0); - } - - if (string.IsNullOrWhiteSpace(subtitle.Paragraphs[subtitle.Paragraphs.Count - 1].Text)) - { - subtitle.Paragraphs.RemoveAt(subtitle.Paragraphs.Count - 1); - } - } - - subtitle.Renumber(); - } - - private Queue _timeCodeQueue = new Queue(); - - private Paragraph ReadParagraph(byte[] buffer, int index) - { - if (buffer[index] == 1 && _timeCodeQueue.Count > 0) // text - { - var sb = new StringBuilder(); - int skipCount = 0; - int textLength = buffer[index + 2] - 11; - int start = index + 13; - - for (int i = 0; i <= textLength; i++) - { - if (skipCount > 0) - { - skipCount--; - } - else if (buffer[index + 13 + i] == 0xFE) - { - sb.Append(GetText(buffer, start, index + i + 13)); - start = index + 13 + i + 3; - skipCount = 2; - sb.AppendLine(); - } - else if (buffer[index + 13 + i] == 0) - { - sb.Append(GetText(buffer, start, index + i + 13)); - break; - } - if (i == textLength) - { - sb.Append(GetText(buffer, start, index + i + 13 + 1)); - } - } - - Paragraph p; - if (_timeCodeQueue.Count > 0) - { - p = _timeCodeQueue.Dequeue(); - } - else - { - p = new Paragraph(); - } - - p.Number = buffer[index + 3] * 256 + buffer[index + 4]; // Subtitle number - p.Text = sb.ToString(); - //if (p.Number == 0 && p.Text.StartsWith("LANG:", StringComparison.Ordinal) && p.Text.Length > 8) - //{ - // _languageId = p.Text.Substring(5, 3); - //} - return p; - } - - if (buffer[index] == 0x0a && _timeCodeQueue.Count > 0) - { - // ? - } - else if (buffer[index] == 0x09 && _timeCodeQueue.Count > 0) - { - // ? - } - else // time codes - { - var newTimeCodes = new List(); - for (int i = 0; i < 15; i++) - { - int start = index + 2 + (i * 8); - int totalFrameNumber = (buffer[start + 3] << 16) + (buffer[start + 5] << 8) + buffer[start + 4]; - int durationInFrames = buffer[start + 6]; - var p = new Paragraph(string.Empty, FramesToMilliseconds(totalFrameNumber), FramesToMilliseconds(totalFrameNumber + durationInFrames)); - newTimeCodes.Add(p); - } - - if (_timeCodeQueue.Count != 15 || IsSequential(newTimeCodes)) - { - _timeCodeQueue = new Queue(newTimeCodes); - } - } - return null; - } - - private static bool IsSequential(List newTimeCodes) - { - var lastMs = 0.0; - foreach (var p in newTimeCodes) - { - if (p.StartTime.TotalMilliseconds < lastMs) - { - return false; - } - lastMs = p.StartTime.TotalMilliseconds; - } - return true; - } - - private string GetText(byte[] buffer, int start, int end) - { - string text = string.Empty; - if (buffer[start] == 0x1f && buffer[start + 1] == 0x57 && buffer[start + 2] == 0x31 && buffer[start + 3] == 0x36) // W16 - { - if (end - start > 4) - { - text = Encoding.GetEncoding(950).GetString(buffer, start + 4, end - start - 4); - } - } - else - { - if (end - start > 0) - { - text = _codePage.GetString(buffer, start, end - start); - } - } - if (text.Length > 4 && text[0] == 0x1f && text[1] == 'R' && text[4] == '.' && CharUtils.IsDigit(text[2]) && CharUtils.IsDigit(text[3])) - { - text = text.Remove(0, 5); - } - - // special language codes... - text = text.Replace("ÔA", "Á"); - text = text.Replace("ÔE", "É"); - text = text.Replace("ÔI", "Í"); - text = text.Replace("ÓN", "Ñ"); - text = text.Replace("ÔO", "Ó"); - text = text.Replace("ÔU", "Ú"); - text = text.Replace("Ôa", "á"); - text = text.Replace("Ôe", "é"); - text = text.Replace("Ôi", "í"); - text = text.Replace("Ón", "ñ"); - text = text.Replace("Ôo", "ó"); - text = text.Replace("Ôu", "ú"); - - text = text.Replace("ÒA", "À"); - text = text.Replace("ÒE", "È"); - text = text.Replace("ÒU", "Ù"); - text = text.Replace("Òa", "à"); - text = text.Replace("Òe", "è"); - text = text.Replace("Òu", "ù"); - - text = text.Replace("ÕU", "Ü"); - text = text.Replace("ÕA", "Ä"); - text = text.Replace("ÕO", "Ö"); - text = text.Replace("Õu", "ü"); - text = text.Replace("Õa", "ä"); - text = text.Replace("Õo", "ö"); - - text = text.Replace("õa", "â"); - text = text.Replace("õe", "ê"); - text = text.Replace("õi", "î"); - text = text.Replace("õu", "û"); - text = text.Replace("õA", "Â"); - text = text.Replace("õE", "Ê"); - text = text.Replace("õI", "Î"); - text = text.Replace("õU", "Û"); - - return ApplyFont(text); - } - - private static string ApplyFont(string text) - { - var sb = new StringBuilder(); - string post = string.Empty; - int i = 0; - while (i < text.Length) - { - if (text[i] == 01 && i < text.Length - 4 && text[i + 1] == 0x1D && text[i + 2] == 07) - { - if (post != string.Empty) - { - sb.Append(""); - } - - sb.Append(""); - post = ""; - i += 2; - } - else if (text[i] == 01 && i < text.Length - 4 && text[i + 1] == 06) - { - if (post != string.Empty) - { - sb.Append(""); - } - - sb.Append(""); - post = ""; - i++; - } - else if (text[i] == 2) - { - if (post != string.Empty) - { - sb.Append(""); - } - - sb.Append(""); - post = ""; - } - else if (text[i] == 3) - { - if (post != string.Empty) - { - sb.Append(""); - } - - sb.Append(""); - post = ""; - } - else if (text[i] == 6) - { - if (post != string.Empty) - { - sb.Append(""); - } - - sb.Append(""); - post = ""; - } - else if (text[i] == 7) - { - if (post != string.Empty) - { - sb.Append(""); - } - - sb.Append(""); - post = ""; - } - else - { - sb.Append(text[i]); - } - i++; - } - - text = sb + post; - if (string.IsNullOrWhiteSpace(HtmlUtil.RemoveHtmlTags(text))) - { - return string.Empty; - } - - return text; - } - } -} +using System; +using System.Collections.Generic; +using System.Text; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + /// + /// .CHK subtitle file format - 128 bytes blocks, first byte in block is id (01==text) + /// + public class Chk : SubtitleFormat + { + private readonly Encoding _codePage = Encoding.GetEncoding(850); + // private string _languageId = "DEN"; // English + + public override string Extension => ".chk"; + + public const string NameOfFormat = "CHK"; + + public override string Name => NameOfFormat; + + public override bool IsMine(List lines, string fileName) + { + if (fileName.EndsWith(".chk", StringComparison.OrdinalIgnoreCase)) + { + var buffer = FileUtil.ReadAllBytesShared(fileName); + return buffer.Length > 0 && buffer[0] == 0x1d; + } + return false; + } + + public override string ToText(Subtitle subtitle, string title) + { + return "Not implemented!"; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + var buffer = FileUtil.ReadAllBytesShared(fileName); + int index = 256; + _errorCount = 0; + subtitle.Paragraphs.Clear(); + while (index < buffer.Length) + { + Paragraph p = ReadParagraph(buffer, index); + if (p != null) + { + subtitle.Paragraphs.Add(p); + } + + index += 128; + } + + if (subtitle.Paragraphs.Count > 1) + { + if (string.IsNullOrWhiteSpace(subtitle.Paragraphs[0].Text)) + { + subtitle.Paragraphs.RemoveAt(0); + } + + if (string.IsNullOrWhiteSpace(subtitle.Paragraphs[subtitle.Paragraphs.Count - 1].Text)) + { + subtitle.Paragraphs.RemoveAt(subtitle.Paragraphs.Count - 1); + } + } + + subtitle.Renumber(); + } + + private Queue _timeCodeQueue = new Queue(); + + private Paragraph ReadParagraph(byte[] buffer, int index) + { + if (buffer[index] == 1 && _timeCodeQueue.Count > 0) // text + { + var sb = new StringBuilder(); + int skipCount = 0; + int textLength = buffer[index + 2] - 11; + int start = index + 13; + + for (int i = 0; i <= textLength; i++) + { + if (skipCount > 0) + { + skipCount--; + } + else if (buffer[index + 13 + i] == 0xFE) + { + sb.Append(GetText(buffer, start, index + i + 13)); + start = index + 13 + i + 3; + skipCount = 2; + sb.AppendLine(); + } + else if (buffer[index + 13 + i] == 0) + { + sb.Append(GetText(buffer, start, index + i + 13)); + break; + } + if (i == textLength) + { + sb.Append(GetText(buffer, start, index + i + 13 + 1)); + } + } + + Paragraph p; + if (_timeCodeQueue.Count > 0) + { + p = _timeCodeQueue.Dequeue(); + } + else + { + p = new Paragraph(); + } + + p.Number = buffer[index + 3] * 256 + buffer[index + 4]; // Subtitle number + p.Text = sb.ToString(); + //if (p.Number == 0 && p.Text.StartsWith("LANG:", StringComparison.Ordinal) && p.Text.Length > 8) + //{ + // _languageId = p.Text.Substring(5, 3); + //} + return p; + } + + if (buffer[index] == 0x0a && _timeCodeQueue.Count > 0) + { + // ? + } + else if (buffer[index] == 0x09 && _timeCodeQueue.Count > 0) + { + // ? + } + else // time codes + { + var newTimeCodes = new List(); + for (int i = 0; i < 15; i++) + { + int start = index + 2 + (i * 8); + int totalFrameNumber = (buffer[start + 3] << 16) + (buffer[start + 5] << 8) + buffer[start + 4]; + int durationInFrames = buffer[start + 6]; + var p = new Paragraph(string.Empty, FramesToMilliseconds(totalFrameNumber), FramesToMilliseconds(totalFrameNumber + durationInFrames)); + newTimeCodes.Add(p); + } + + if (_timeCodeQueue.Count != 15 || IsSequential(newTimeCodes)) + { + _timeCodeQueue = new Queue(newTimeCodes); + } + } + return null; + } + + private static bool IsSequential(List newTimeCodes) + { + var lastMs = 0.0; + foreach (var p in newTimeCodes) + { + if (p.StartTime.TotalMilliseconds < lastMs) + { + return false; + } + lastMs = p.StartTime.TotalMilliseconds; + } + return true; + } + + private string GetText(byte[] buffer, int start, int end) + { + string text = string.Empty; + if (buffer[start] == 0x1f && buffer[start + 1] == 0x57 && buffer[start + 2] == 0x31 && buffer[start + 3] == 0x36) // W16 + { + if (end - start > 4) + { + text = Encoding.GetEncoding(950).GetString(buffer, start + 4, end - start - 4); + } + } + else + { + if (end - start > 0) + { + text = _codePage.GetString(buffer, start, end - start); + } + } + if (text.Length > 4 && text[0] == 0x1f && text[1] == 'R' && text[4] == '.' && CharUtils.IsDigit(text[2]) && CharUtils.IsDigit(text[3])) + { + text = text.Remove(0, 5); + } + + // special language codes... + text = text.Replace("ÔA", "Á"); + text = text.Replace("ÔE", "É"); + text = text.Replace("ÔI", "Í"); + text = text.Replace("ÓN", "Ñ"); + text = text.Replace("ÔO", "Ó"); + text = text.Replace("ÔU", "Ú"); + text = text.Replace("Ôa", "á"); + text = text.Replace("Ôe", "é"); + text = text.Replace("Ôi", "í"); + text = text.Replace("Ón", "ñ"); + text = text.Replace("Ôo", "ó"); + text = text.Replace("Ôu", "ú"); + + text = text.Replace("ÒA", "À"); + text = text.Replace("ÒE", "È"); + text = text.Replace("ÒU", "Ù"); + text = text.Replace("Òa", "à"); + text = text.Replace("Òe", "è"); + text = text.Replace("Òu", "ù"); + + text = text.Replace("ÕU", "Ü"); + text = text.Replace("ÕA", "Ä"); + text = text.Replace("ÕO", "Ö"); + text = text.Replace("Õu", "ü"); + text = text.Replace("Õa", "ä"); + text = text.Replace("Õo", "ö"); + + text = text.Replace("õa", "â"); + text = text.Replace("õe", "ê"); + text = text.Replace("õi", "î"); + text = text.Replace("õu", "û"); + text = text.Replace("õA", "Â"); + text = text.Replace("õE", "Ê"); + text = text.Replace("õI", "Î"); + text = text.Replace("õU", "Û"); + + return ApplyFont(text); + } + + private static string ApplyFont(string text) + { + var sb = new StringBuilder(); + string post = string.Empty; + int i = 0; + while (i < text.Length) + { + if (text[i] == 01 && i < text.Length - 4 && text[i + 1] == 0x1D && text[i + 2] == 07) + { + if (post != string.Empty) + { + sb.Append(""); + } + + sb.Append(""); + post = ""; + i += 2; + } + else if (text[i] == 01 && i < text.Length - 4 && text[i + 1] == 06) + { + if (post != string.Empty) + { + sb.Append(""); + } + + sb.Append(""); + post = ""; + i++; + } + else if (text[i] == 2) + { + if (post != string.Empty) + { + sb.Append(""); + } + + sb.Append(""); + post = ""; + } + else if (text[i] == 3) + { + if (post != string.Empty) + { + sb.Append(""); + } + + sb.Append(""); + post = ""; + } + else if (text[i] == 6) + { + if (post != string.Empty) + { + sb.Append(""); + } + + sb.Append(""); + post = ""; + } + else if (text[i] == 7) + { + if (post != string.Empty) + { + sb.Append(""); + } + + sb.Append(""); + post = ""; + } + else + { + sb.Append(text[i]); + } + i++; + } + + text = sb + post; + if (string.IsNullOrWhiteSpace(HtmlUtil.RemoveHtmlTags(text))) + { + return string.Empty; + } + + return text; + } + } +} diff --git a/libse/SubtitleFormats/Cmaft.cs b/src/libse/SubtitleFormats/Cmaft.cs similarity index 100% rename from libse/SubtitleFormats/Cmaft.cs rename to src/libse/SubtitleFormats/Cmaft.cs diff --git a/libse/SubtitleFormats/Csv.cs b/src/libse/SubtitleFormats/Csv.cs similarity index 97% rename from libse/SubtitleFormats/Csv.cs rename to src/libse/SubtitleFormats/Csv.cs index 7c4c747d5..4172c32cf 100644 --- a/libse/SubtitleFormats/Csv.cs +++ b/src/libse/SubtitleFormats/Csv.cs @@ -1,96 +1,96 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class Csv : SubtitleFormat - { - private const string Separator = ";"; - private static readonly Regex CsvLine = new Regex(@"^""?\d+""?" + Separator + @"""?\d+""?" + Separator + @"""?\d+""?" + Separator + @"""?[^""]*""?$", RegexOptions.Compiled); - - public override string Extension => ".csv"; - - public override string Name => "Csv"; - - public override bool IsMine(List lines, string fileName) - { - int fine = 0; - int failed = 0; - foreach (string line in lines) - { - if (CsvLine.IsMatch(line)) - { - fine++; - } - else - { - failed++; - } - } - return fine > failed; - } - - public override string ToText(Subtitle subtitle, string title) - { - const string format = "{1}{0}{2}{0}{3}{0}\"{4}\""; - var sb = new StringBuilder(); - sb.AppendLine(string.Format(format, Separator, "Number", "Start time in milliseconds", "End time in milliseconds", "Text")); - foreach (Paragraph p in subtitle.Paragraphs) - { - sb.AppendLine(string.Format(format, Separator, p.Number, p.StartTime.TotalMilliseconds, p.EndTime.TotalMilliseconds, p.Text.Replace(Environment.NewLine, "\n"))); - } - return sb.ToString().Trim(); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - bool continuation = false; - Paragraph p = null; - foreach (string line in lines) - { - if (CsvLine.IsMatch(line)) - { - string[] parts = line.Split(Separator.ToCharArray(), StringSplitOptions.RemoveEmptyEntries); - if (parts.Length == 4) - { - try - { - int start = Convert.ToInt32(Utilities.FixQuotes(parts[1])); - int end = Convert.ToInt32(Utilities.FixQuotes(parts[2])); - string text = Utilities.FixQuotes(parts[3]); - p = new Paragraph(text, start, end); - subtitle.Paragraphs.Add(p); - continuation = parts[3].StartsWith('"') && !parts[3].EndsWith('"'); - } - catch - { - _errorCount++; - } - } - } - else - { - if (continuation) - { - if (p.Text.Length < 300) - { - p.Text = (p.Text + Environment.NewLine + line.TrimEnd('"')).Trim(); - } - - continuation = !line.TrimEnd().EndsWith('"'); - } - else - { - _errorCount++; - } - } - } - subtitle.Renumber(); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class Csv : SubtitleFormat + { + private const string Separator = ";"; + private static readonly Regex CsvLine = new Regex(@"^""?\d+""?" + Separator + @"""?\d+""?" + Separator + @"""?\d+""?" + Separator + @"""?[^""]*""?$", RegexOptions.Compiled); + + public override string Extension => ".csv"; + + public override string Name => "Csv"; + + public override bool IsMine(List lines, string fileName) + { + int fine = 0; + int failed = 0; + foreach (string line in lines) + { + if (CsvLine.IsMatch(line)) + { + fine++; + } + else + { + failed++; + } + } + return fine > failed; + } + + public override string ToText(Subtitle subtitle, string title) + { + const string format = "{1}{0}{2}{0}{3}{0}\"{4}\""; + var sb = new StringBuilder(); + sb.AppendLine(string.Format(format, Separator, "Number", "Start time in milliseconds", "End time in milliseconds", "Text")); + foreach (Paragraph p in subtitle.Paragraphs) + { + sb.AppendLine(string.Format(format, Separator, p.Number, p.StartTime.TotalMilliseconds, p.EndTime.TotalMilliseconds, p.Text.Replace(Environment.NewLine, "\n"))); + } + return sb.ToString().Trim(); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + bool continuation = false; + Paragraph p = null; + foreach (string line in lines) + { + if (CsvLine.IsMatch(line)) + { + string[] parts = line.Split(Separator.ToCharArray(), StringSplitOptions.RemoveEmptyEntries); + if (parts.Length == 4) + { + try + { + int start = Convert.ToInt32(Utilities.FixQuotes(parts[1])); + int end = Convert.ToInt32(Utilities.FixQuotes(parts[2])); + string text = Utilities.FixQuotes(parts[3]); + p = new Paragraph(text, start, end); + subtitle.Paragraphs.Add(p); + continuation = parts[3].StartsWith('"') && !parts[3].EndsWith('"'); + } + catch + { + _errorCount++; + } + } + } + else + { + if (continuation) + { + if (p.Text.Length < 300) + { + p.Text = (p.Text + Environment.NewLine + line.TrimEnd('"')).Trim(); + } + + continuation = !line.TrimEnd().EndsWith('"'); + } + else + { + _errorCount++; + } + } + } + subtitle.Renumber(); + } + + } +} diff --git a/libse/SubtitleFormats/Csv2.cs b/src/libse/SubtitleFormats/Csv2.cs similarity index 97% rename from libse/SubtitleFormats/Csv2.cs rename to src/libse/SubtitleFormats/Csv2.cs index 8e4fde18a..1c5a41e02 100644 --- a/libse/SubtitleFormats/Csv2.cs +++ b/src/libse/SubtitleFormats/Csv2.cs @@ -1,129 +1,129 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class Csv2 : SubtitleFormat - { - private const string Separator = ","; - - //1,01:00:10:03,01:00:15:25,I thought I should let my sister-in-law know. - private static readonly Regex CsvLine = new Regex(@"^\d+" + Separator + @"\d\d:\d\d:\d\d:\d\d" + Separator + @"\d\d:\d\d:\d\d:\d\d" + Separator, RegexOptions.Compiled); - - public override string Extension => ".csv"; - - public override string Name => "Csv2"; - - public override bool IsMine(List lines, string fileName) - { - int fine = 0; - int failed = 0; - bool continuation = false; - foreach (string line in lines) - { - Match m = CsvLine.Match(line); - if (m.Success) - { - fine++; - string s = line.Remove(0, m.Length); - continuation = s.StartsWith('"'); - } - else if (!string.IsNullOrWhiteSpace(line)) - { - if (continuation) - { - continuation = false; - } - else - { - failed++; - } - } - } - return fine > failed; - } - - public override string ToText(Subtitle subtitle, string title) - { - const string format = "{1}{0}{2}{0}{3}{0}\"{4}\""; - var sb = new StringBuilder(); - sb.AppendLine(string.Format(format, Separator, "Number", "Start time (hh:mm:ss:ff)", "End time (hh:mm:ss:ff)", "Text")); - foreach (Paragraph p in subtitle.Paragraphs) - { - sb.AppendLine(string.Format(format, Separator, p.Number, EncodeTimeCode(p.StartTime), EncodeTimeCode(p.EndTime), p.Text.Replace(Environment.NewLine, "\n"))); - } - return sb.ToString().Trim(); - } - - private static string EncodeTimeCode(TimeCode time) - { - return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}:{MillisecondsToFramesMaxFrameRate(time.Milliseconds):00}"; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - bool continuation = false; - Paragraph p = null; - foreach (string line in lines) - { - Match m = CsvLine.Match(line); - if (m.Success) - { - string[] parts = line.Substring(0, m.Length).Split(Separator.ToCharArray(), StringSplitOptions.RemoveEmptyEntries); - if (parts.Length == 3) - { - try - { - var start = DecodeTimeCode(parts[1]); - var end = DecodeTimeCode(parts[2]); - string text = line.Remove(0, m.Length); - continuation = text.StartsWith('"') && !text.EndsWith('"'); - text = text.Trim('"'); - p = new Paragraph(start, end, text); - subtitle.Paragraphs.Add(p); - } - catch - { - _errorCount++; - } - } - } - else if (!string.IsNullOrWhiteSpace(line)) - { - if (continuation) - { - if (p != null && p.Text.Length < 300) - { - p.Text = (p.Text + Environment.NewLine + line.TrimEnd('"')).Trim(); - } - - continuation = !line.TrimEnd().EndsWith('"'); - } - else - { - _errorCount++; - } - } - } - subtitle.Renumber(); - } - - private static TimeCode DecodeTimeCode(string part) - { - string[] parts = part.Split(new[] { '.', ':' }, StringSplitOptions.RemoveEmptyEntries); - - //00:00:07:12 - string hour = parts[0]; - string minutes = parts[1]; - string seconds = parts[2]; - string frames = parts[3]; - - return new TimeCode(int.Parse(hour), int.Parse(minutes), int.Parse(seconds), FramesToMillisecondsMax999(int.Parse(frames))); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class Csv2 : SubtitleFormat + { + private const string Separator = ","; + + //1,01:00:10:03,01:00:15:25,I thought I should let my sister-in-law know. + private static readonly Regex CsvLine = new Regex(@"^\d+" + Separator + @"\d\d:\d\d:\d\d:\d\d" + Separator + @"\d\d:\d\d:\d\d:\d\d" + Separator, RegexOptions.Compiled); + + public override string Extension => ".csv"; + + public override string Name => "Csv2"; + + public override bool IsMine(List lines, string fileName) + { + int fine = 0; + int failed = 0; + bool continuation = false; + foreach (string line in lines) + { + Match m = CsvLine.Match(line); + if (m.Success) + { + fine++; + string s = line.Remove(0, m.Length); + continuation = s.StartsWith('"'); + } + else if (!string.IsNullOrWhiteSpace(line)) + { + if (continuation) + { + continuation = false; + } + else + { + failed++; + } + } + } + return fine > failed; + } + + public override string ToText(Subtitle subtitle, string title) + { + const string format = "{1}{0}{2}{0}{3}{0}\"{4}\""; + var sb = new StringBuilder(); + sb.AppendLine(string.Format(format, Separator, "Number", "Start time (hh:mm:ss:ff)", "End time (hh:mm:ss:ff)", "Text")); + foreach (Paragraph p in subtitle.Paragraphs) + { + sb.AppendLine(string.Format(format, Separator, p.Number, EncodeTimeCode(p.StartTime), EncodeTimeCode(p.EndTime), p.Text.Replace(Environment.NewLine, "\n"))); + } + return sb.ToString().Trim(); + } + + private static string EncodeTimeCode(TimeCode time) + { + return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}:{MillisecondsToFramesMaxFrameRate(time.Milliseconds):00}"; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + bool continuation = false; + Paragraph p = null; + foreach (string line in lines) + { + Match m = CsvLine.Match(line); + if (m.Success) + { + string[] parts = line.Substring(0, m.Length).Split(Separator.ToCharArray(), StringSplitOptions.RemoveEmptyEntries); + if (parts.Length == 3) + { + try + { + var start = DecodeTimeCode(parts[1]); + var end = DecodeTimeCode(parts[2]); + string text = line.Remove(0, m.Length); + continuation = text.StartsWith('"') && !text.EndsWith('"'); + text = text.Trim('"'); + p = new Paragraph(start, end, text); + subtitle.Paragraphs.Add(p); + } + catch + { + _errorCount++; + } + } + } + else if (!string.IsNullOrWhiteSpace(line)) + { + if (continuation) + { + if (p != null && p.Text.Length < 300) + { + p.Text = (p.Text + Environment.NewLine + line.TrimEnd('"')).Trim(); + } + + continuation = !line.TrimEnd().EndsWith('"'); + } + else + { + _errorCount++; + } + } + } + subtitle.Renumber(); + } + + private static TimeCode DecodeTimeCode(string part) + { + string[] parts = part.Split(new[] { '.', ':' }, StringSplitOptions.RemoveEmptyEntries); + + //00:00:07:12 + string hour = parts[0]; + string minutes = parts[1]; + string seconds = parts[2]; + string frames = parts[3]; + + return new TimeCode(int.Parse(hour), int.Parse(minutes), int.Parse(seconds), FramesToMillisecondsMax999(int.Parse(frames))); + } + + } +} diff --git a/libse/SubtitleFormats/Csv3.cs b/src/libse/SubtitleFormats/Csv3.cs similarity index 97% rename from libse/SubtitleFormats/Csv3.cs rename to src/libse/SubtitleFormats/Csv3.cs index 643e01d20..c538809b1 100644 --- a/libse/SubtitleFormats/Csv3.cs +++ b/src/libse/SubtitleFormats/Csv3.cs @@ -1,195 +1,195 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class Csv3 : SubtitleFormat - { - private const string Separator = ","; - - //01:00:10:03,01:00:15:25,"I thought I should let my sister-in-law know.", "" - private static readonly Regex CsvLine = new Regex(@"^\d\d:\d\d:\d\d:\d\d" + Separator + @"\d\d:\d\d:\d\d:\d\d" + Separator, RegexOptions.Compiled); - - public override string Extension => ".csv"; - - public override string Name => "Csv3"; - - public override bool IsMine(List lines, string fileName) - { - int fine = 0; - int failed = 0; - bool continuation = false; - foreach (string line in lines) - { - if (line.StartsWith("$FontName", StringComparison.Ordinal) || line.StartsWith("$ColorIndex1", StringComparison.Ordinal)) - { - return false; - } - - Match m = null; - if (line.Length > 8 && line[2] == ':') - { - m = CsvLine.Match(line); - } - - if (m != null && m.Success) - { - fine++; - string s = line.Remove(0, m.Length); - continuation = s.StartsWith('"'); - } - else if (!string.IsNullOrWhiteSpace(line)) - { - if (continuation) - { - continuation = false; - } - else - { - failed++; - } - } - } - if (failed > 20) - { - return false; - } - - return fine > failed; - } - - public override string ToText(Subtitle subtitle, string title) - { - const string format = "{1}{0}{2}{0}\"{3}\"{0}\"{4}\""; - var sb = new StringBuilder(); - sb.AppendLine(string.Format(format, Separator, "Start time (hh:mm:ss:ff)", "End time (hh:mm:ss:ff)", "Line 1", "Line 2")); - foreach (Paragraph p in subtitle.Paragraphs) - { - var arr = p.Text.Trim().SplitToLines(); - if (arr.Count > 3) - { - string s = Utilities.AutoBreakLine(p.Text); - arr = s.Trim().SplitToLines(); - } - string line1 = string.Empty; - string line2 = string.Empty; - line1 = arr[0]; - if (arr.Count > 1) - { - line2 = arr[1]; - } - - line1 = line1.Replace("\"", "\"\""); - line2 = line2.Replace("\"", "\"\""); - sb.AppendLine(string.Format(format, Separator, EncodeTimeCode(p.StartTime), EncodeTimeCode(p.EndTime), line1, line2)); - } - return sb.ToString().Trim(); - } - - private static string EncodeTimeCode(TimeCode time) - { - return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}:{MillisecondsToFramesMaxFrameRate(time.Milliseconds):00}"; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - char[] splitChars = { '.', ':' }; - foreach (string line in lines) - { - Match m = CsvLine.Match(line); - if (m.Success) - { - string[] parts = line.Substring(0, m.Length).Split(Separator.ToCharArray(), StringSplitOptions.RemoveEmptyEntries); - if (parts.Length == 2) - { - try - { - var start = DecodeTimeCodeFrames(parts[0], splitChars); - var end = DecodeTimeCodeFrames(parts[1], splitChars); - string text = ReadText(line.Remove(0, m.Length)); - var p = new Paragraph(start, end, text); - subtitle.Paragraphs.Add(p); - } - catch - { - _errorCount++; - } - } - } - else if (!string.IsNullOrWhiteSpace(line)) - { - _errorCount++; - } - } - subtitle.Renumber(); - } - - private static string ReadText(string csv) - { - if (string.IsNullOrEmpty(csv)) - { - return string.Empty; - } - - csv = csv.Replace("\"\"", "\""); - - var sb = new StringBuilder(); - csv = csv.Trim(); - if (csv.StartsWith('"')) - { - csv = csv.Remove(0, 1); - } - - if (csv.EndsWith('"')) - { - csv = csv.Remove(csv.Length - 1, 1); - } - - bool isBreak = false; - for (int i = 0; i < csv.Length; i++) - { - var s = csv[i]; - if (s == '"' && csv.Substring(i).StartsWith("\"\"", StringComparison.Ordinal)) - { - sb.Append('"'); - } - else if (s == '"') - { - if (isBreak) - { - isBreak = false; - } - else if (i == 0 || i == csv.Length - 1 || sb.ToString().EndsWith(Environment.NewLine, StringComparison.Ordinal)) - { - sb.Append('"'); - } - else - { - isBreak = true; - } - } - else - { - if (isBreak && s == ' ') - { - } - else if (isBreak && s == ',') - { - sb.Append(Environment.NewLine); - } - else - { - isBreak = false; - sb.Append(s); - } - } - } - return sb.ToString().Trim(); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class Csv3 : SubtitleFormat + { + private const string Separator = ","; + + //01:00:10:03,01:00:15:25,"I thought I should let my sister-in-law know.", "" + private static readonly Regex CsvLine = new Regex(@"^\d\d:\d\d:\d\d:\d\d" + Separator + @"\d\d:\d\d:\d\d:\d\d" + Separator, RegexOptions.Compiled); + + public override string Extension => ".csv"; + + public override string Name => "Csv3"; + + public override bool IsMine(List lines, string fileName) + { + int fine = 0; + int failed = 0; + bool continuation = false; + foreach (string line in lines) + { + if (line.StartsWith("$FontName", StringComparison.Ordinal) || line.StartsWith("$ColorIndex1", StringComparison.Ordinal)) + { + return false; + } + + Match m = null; + if (line.Length > 8 && line[2] == ':') + { + m = CsvLine.Match(line); + } + + if (m != null && m.Success) + { + fine++; + string s = line.Remove(0, m.Length); + continuation = s.StartsWith('"'); + } + else if (!string.IsNullOrWhiteSpace(line)) + { + if (continuation) + { + continuation = false; + } + else + { + failed++; + } + } + } + if (failed > 20) + { + return false; + } + + return fine > failed; + } + + public override string ToText(Subtitle subtitle, string title) + { + const string format = "{1}{0}{2}{0}\"{3}\"{0}\"{4}\""; + var sb = new StringBuilder(); + sb.AppendLine(string.Format(format, Separator, "Start time (hh:mm:ss:ff)", "End time (hh:mm:ss:ff)", "Line 1", "Line 2")); + foreach (Paragraph p in subtitle.Paragraphs) + { + var arr = p.Text.Trim().SplitToLines(); + if (arr.Count > 3) + { + string s = Utilities.AutoBreakLine(p.Text); + arr = s.Trim().SplitToLines(); + } + string line1 = string.Empty; + string line2 = string.Empty; + line1 = arr[0]; + if (arr.Count > 1) + { + line2 = arr[1]; + } + + line1 = line1.Replace("\"", "\"\""); + line2 = line2.Replace("\"", "\"\""); + sb.AppendLine(string.Format(format, Separator, EncodeTimeCode(p.StartTime), EncodeTimeCode(p.EndTime), line1, line2)); + } + return sb.ToString().Trim(); + } + + private static string EncodeTimeCode(TimeCode time) + { + return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}:{MillisecondsToFramesMaxFrameRate(time.Milliseconds):00}"; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + char[] splitChars = { '.', ':' }; + foreach (string line in lines) + { + Match m = CsvLine.Match(line); + if (m.Success) + { + string[] parts = line.Substring(0, m.Length).Split(Separator.ToCharArray(), StringSplitOptions.RemoveEmptyEntries); + if (parts.Length == 2) + { + try + { + var start = DecodeTimeCodeFrames(parts[0], splitChars); + var end = DecodeTimeCodeFrames(parts[1], splitChars); + string text = ReadText(line.Remove(0, m.Length)); + var p = new Paragraph(start, end, text); + subtitle.Paragraphs.Add(p); + } + catch + { + _errorCount++; + } + } + } + else if (!string.IsNullOrWhiteSpace(line)) + { + _errorCount++; + } + } + subtitle.Renumber(); + } + + private static string ReadText(string csv) + { + if (string.IsNullOrEmpty(csv)) + { + return string.Empty; + } + + csv = csv.Replace("\"\"", "\""); + + var sb = new StringBuilder(); + csv = csv.Trim(); + if (csv.StartsWith('"')) + { + csv = csv.Remove(0, 1); + } + + if (csv.EndsWith('"')) + { + csv = csv.Remove(csv.Length - 1, 1); + } + + bool isBreak = false; + for (int i = 0; i < csv.Length; i++) + { + var s = csv[i]; + if (s == '"' && csv.Substring(i).StartsWith("\"\"", StringComparison.Ordinal)) + { + sb.Append('"'); + } + else if (s == '"') + { + if (isBreak) + { + isBreak = false; + } + else if (i == 0 || i == csv.Length - 1 || sb.ToString().EndsWith(Environment.NewLine, StringComparison.Ordinal)) + { + sb.Append('"'); + } + else + { + isBreak = true; + } + } + else + { + if (isBreak && s == ' ') + { + } + else if (isBreak && s == ',') + { + sb.Append(Environment.NewLine); + } + else + { + isBreak = false; + sb.Append(s); + } + } + } + return sb.ToString().Trim(); + } + + } +} diff --git a/libse/SubtitleFormats/Csv4.cs b/src/libse/SubtitleFormats/Csv4.cs similarity index 100% rename from libse/SubtitleFormats/Csv4.cs rename to src/libse/SubtitleFormats/Csv4.cs diff --git a/libse/SubtitleFormats/Csv5.cs b/src/libse/SubtitleFormats/Csv5.cs similarity index 100% rename from libse/SubtitleFormats/Csv5.cs rename to src/libse/SubtitleFormats/Csv5.cs diff --git a/libse/SubtitleFormats/CsvNuendo.cs b/src/libse/SubtitleFormats/CsvNuendo.cs similarity index 100% rename from libse/SubtitleFormats/CsvNuendo.cs rename to src/libse/SubtitleFormats/CsvNuendo.cs diff --git a/libse/SubtitleFormats/DCinemaInterop.cs b/src/libse/SubtitleFormats/DCinemaInterop.cs similarity index 100% rename from libse/SubtitleFormats/DCinemaInterop.cs rename to src/libse/SubtitleFormats/DCinemaInterop.cs diff --git a/libse/SubtitleFormats/DCinemaSmpte2007.cs b/src/libse/SubtitleFormats/DCinemaSmpte2007.cs similarity index 97% rename from libse/SubtitleFormats/DCinemaSmpte2007.cs rename to src/libse/SubtitleFormats/DCinemaSmpte2007.cs index f085621ac..31f4940ef 100644 --- a/libse/SubtitleFormats/DCinemaSmpte2007.cs +++ b/src/libse/SubtitleFormats/DCinemaSmpte2007.cs @@ -1,841 +1,841 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.IO.Compression; -using System.Text; -using System.Xml; -using System.Xml.Schema; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class DCinemaSmpte2007 : SubtitleFormat - { - // - // - // urn:uuid:7be835a3-cfb4-43d0-bb4b-f0b4c95e962e - // 2001, A Space Odissey - // This is a subtitle file - // 2012-06-26T12:33:59.000-00:00 - // 1 - // fr - // 25 1 - // 25 - // 00:00:00:00 - // urn:uuid:3dec6dc0-39d0-498d-97d0-928d2eb78391 - // - // - // Hallo - // - // - - public string Errors { get; private set; } - - private double _frameRate = 24; - - public int Version { get; set; } - - public override string Extension => ".xml"; - - public override string Name => "D-Cinema SMPTE 2007"; - - public override bool IsMine(List lines, string fileName) - { - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - string xmlAsString = sb.ToString().Trim(); - if (xmlAsString.Contains("http://www.smpte-ra.org/schemas/428-7/2010/DCST") || - xmlAsString.Contains("http://www.smpte-ra.org/schemas/428-7/2014/DCST")) - { - return false; - } - - if (xmlAsString.Contains(" 0; - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine(ex.Message); - return false; - } - } - return false; - } - - public override string ToText(Subtitle subtitle, string title) - { - Errors = null; - var ss = Configuration.Settings.SubtitleSettings; - - if (!string.IsNullOrEmpty(ss.CurrentDCinemaEditRate)) - { - string[] temp = ss.CurrentDCinemaEditRate.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); - double d1, d2; - if (temp.Length == 2 && double.TryParse(temp[0], out d1) && double.TryParse(temp[1], out d2)) - { - _frameRate = d1 / d2; - } - } - - string xmlStructure = - "" + Environment.NewLine + - " urn:uuid:7be835a3-cfb4-43d0-bb4b-f0b4c95e962e" + Environment.NewLine + - " " + Environment.NewLine + - " This is a subtitle file" + Environment.NewLine + - " 2012-06-26T12:33:59.000-00:00" + Environment.NewLine + - " 1" + Environment.NewLine + - " en" + Environment.NewLine + - " 25 1" + Environment.NewLine + - " 25" + Environment.NewLine + - " 00:00:00:00 " + Environment.NewLine + - " urn:uuid:3dec6dc0-39d0-498d-97d0-928d2eb78391" + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - ""; - - var xml = new XmlDocument(); - xml.LoadXml(xmlStructure); - xml.PreserveWhitespace = true; - var nsmgr = new XmlNamespaceManager(xml.NameTable); - nsmgr.AddNamespace("dcst", xml.DocumentElement.NamespaceURI); - - if (string.IsNullOrEmpty(ss.CurrentDCinemaMovieTitle)) - { - ss.CurrentDCinemaMovieTitle = title; - } - - if (ss.CurrentDCinemaFontSize == 0 || string.IsNullOrEmpty(ss.CurrentDCinemaFontEffect)) - { - Configuration.Settings.SubtitleSettings.InitializeDCinameSettings(true); - } - - xml.DocumentElement.SelectSingleNode("dcst:ContentTitleText", nsmgr).InnerText = ss.CurrentDCinemaMovieTitle; - if (string.IsNullOrEmpty(ss.CurrentDCinemaSubtitleId) || !ss.CurrentDCinemaSubtitleId.StartsWith("urn:uuid:")) - { - ss.CurrentDCinemaSubtitleId = "urn:uuid:" + Guid.NewGuid(); - } - - xml.DocumentElement.SelectSingleNode("dcst:Id", nsmgr).InnerText = ss.CurrentDCinemaSubtitleId; - xml.DocumentElement.SelectSingleNode("dcst:ReelNumber", nsmgr).InnerText = ss.CurrentDCinemaReelNumber; - xml.DocumentElement.SelectSingleNode("dcst:IssueDate", nsmgr).InnerText = ss.CurrentDCinemaIssueDate; - if (string.IsNullOrEmpty(ss.CurrentDCinemaLanguage)) - { - ss.CurrentDCinemaLanguage = "en"; - } - - xml.DocumentElement.SelectSingleNode("dcst:Language", nsmgr).InnerText = ss.CurrentDCinemaLanguage; - if (ss.CurrentDCinemaEditRate == null && ss.CurrentDCinemaTimeCodeRate == null) - { - if (Configuration.Settings.General.CurrentFrameRate == 24) - { - ss.CurrentDCinemaEditRate = "24 1"; - ss.CurrentDCinemaTimeCodeRate = "24"; - } - else - { - ss.CurrentDCinemaEditRate = "25 1"; - ss.CurrentDCinemaTimeCodeRate = "25"; - } - } - xml.DocumentElement.SelectSingleNode("dcst:EditRate", nsmgr).InnerText = ss.CurrentDCinemaEditRate; - xml.DocumentElement.SelectSingleNode("dcst:TimeCodeRate", nsmgr).InnerText = ss.CurrentDCinemaTimeCodeRate; - if (string.IsNullOrEmpty(ss.CurrentDCinemaStartTime)) - { - ss.CurrentDCinemaStartTime = "00:00:00:00"; - } - - xml.DocumentElement.SelectSingleNode("dcst:StartTime", nsmgr).InnerText = ss.CurrentDCinemaStartTime; - xml.DocumentElement.SelectSingleNode("dcst:LoadFont", nsmgr).InnerText = ss.CurrentDCinemaFontUri; - int fontSize = ss.CurrentDCinemaFontSize; - string loadedFontId = "Font1"; - if (!string.IsNullOrEmpty(ss.CurrentDCinemaFontId)) - { - loadedFontId = ss.CurrentDCinemaFontId; - } - - xml.DocumentElement.SelectSingleNode("dcst:LoadFont", nsmgr).Attributes["ID"].Value = loadedFontId; - xml.DocumentElement.SelectSingleNode("dcst:SubtitleList/dcst:Font", nsmgr).Attributes["Size"].Value = fontSize.ToString(); - xml.DocumentElement.SelectSingleNode("dcst:SubtitleList/dcst:Font", nsmgr).Attributes["Color"].Value = "FF" + Utilities.ColorToHex(ss.CurrentDCinemaFontColor).TrimStart('#').ToUpperInvariant(); - xml.DocumentElement.SelectSingleNode("dcst:SubtitleList/dcst:Font", nsmgr).Attributes["ID"].Value = loadedFontId; - xml.DocumentElement.SelectSingleNode("dcst:SubtitleList/dcst:Font", nsmgr).Attributes["Effect"].Value = ss.CurrentDCinemaFontEffect; - xml.DocumentElement.SelectSingleNode("dcst:SubtitleList/dcst:Font", nsmgr).Attributes["EffectColor"].Value = "FF" + Utilities.ColorToHex(ss.CurrentDCinemaFontEffectColor).TrimStart('#').ToUpperInvariant(); - - XmlNode mainListFont = xml.DocumentElement.SelectSingleNode("dcst:SubtitleList/dcst:Font", nsmgr); - int no = 0; - foreach (Paragraph p in subtitle.Paragraphs) - { - if (p.Text != null) - { - XmlNode subNode = xml.CreateElement("dcst:Subtitle", "dcst"); - - XmlAttribute id = xml.CreateAttribute("SpotNumber"); - id.InnerText = (no + 1).ToString(); - subNode.Attributes.Append(id); - - XmlAttribute fadeUpTime = xml.CreateAttribute("FadeUpTime"); - fadeUpTime.InnerText = "00:00:00:00"; - subNode.Attributes.Append(fadeUpTime); - - XmlAttribute fadeDownTime = xml.CreateAttribute("FadeDownTime"); - fadeDownTime.InnerText = "00:00:00:00"; - subNode.Attributes.Append(fadeDownTime); - - XmlAttribute start = xml.CreateAttribute("TimeIn"); - start.InnerText = ConvertToTimeString(p.StartTime); - subNode.Attributes.Append(start); - - XmlAttribute end = xml.CreateAttribute("TimeOut"); - end.InnerText = ConvertToTimeString(p.EndTime); - subNode.Attributes.Append(end); - - bool alignLeft = p.Text.StartsWith("{\\a1}", StringComparison.Ordinal) || p.Text.StartsWith("{\\a5}", StringComparison.Ordinal) || p.Text.StartsWith("{\\a9}", StringComparison.Ordinal) || // sub station alpha - p.Text.StartsWith("{\\an1}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an4}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an7}", StringComparison.Ordinal); // advanced sub station alpha - - bool alignRight = p.Text.StartsWith("{\\a3}", StringComparison.Ordinal) || p.Text.StartsWith("{\\a7}", StringComparison.Ordinal) || p.Text.StartsWith("{\\a11}", StringComparison.Ordinal) || // sub station alpha - p.Text.StartsWith("{\\an3}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an6}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an9}", StringComparison.Ordinal); // advanced sub station alpha - - bool alignVTop = p.Text.StartsWith("{\\a5}", StringComparison.Ordinal) || p.Text.StartsWith("{\\a6}", StringComparison.Ordinal) || p.Text.StartsWith("{\\a7}", StringComparison.Ordinal) || // sub station alpha - p.Text.StartsWith("{\\an7}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an8}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an9}", StringComparison.Ordinal); // advanced sub station alpha - - bool alignVCenter = p.Text.StartsWith("{\\a9}", StringComparison.Ordinal) || p.Text.StartsWith("{\\a10}", StringComparison.Ordinal) || p.Text.StartsWith("{\\a11}", StringComparison.Ordinal) || // sub station alpha - p.Text.StartsWith("{\\an4}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an5}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an6}", StringComparison.Ordinal); // advanced sub station alpha - - string text = Utilities.RemoveSsaTags(p.Text); - - var lines = text.SplitToLines(); - int vPos = 1 + lines.Count * 7; - int vPosFactor = (int)Math.Round(fontSize / 7.4); - if (alignVTop) - { - vPos = Configuration.Settings.SubtitleSettings.DCinemaBottomMargin; // Bottom margin is normally 8 - } - else if (alignVCenter) - { - vPos = (int)Math.Round((lines.Count * vPosFactor * -1) / 2.0); - } - else - { - vPos = lines.Count * vPosFactor - vPosFactor + Configuration.Settings.SubtitleSettings.DCinemaBottomMargin; // Bottom margin is normally 8 - } - - bool isItalic = false; - int fontNo = 0; - Stack fontColors = new Stack(); - foreach (string line in lines) - { - XmlNode textNode = xml.CreateElement("dcst:Text", "dcst"); - - XmlAttribute vPosition = xml.CreateAttribute("Vposition"); - vPosition.InnerText = vPos.ToString(); - textNode.Attributes.Append(vPosition); - - XmlAttribute vAlign = xml.CreateAttribute("Valign"); - if (alignVTop) - { - vAlign.InnerText = "top"; - } - else if (alignVCenter) - { - vAlign.InnerText = "center"; - } - else - { - vAlign.InnerText = "bottom"; - } - - textNode.Attributes.Append(vAlign); textNode.Attributes.Append(vAlign); - - XmlAttribute hAlign = xml.CreateAttribute("Halign"); - if (alignLeft) - { - hAlign.InnerText = "left"; - } - else if (alignRight) - { - hAlign.InnerText = "right"; - } - else - { - hAlign.InnerText = "center"; - } - - textNode.Attributes.Append(hAlign); - - XmlAttribute direction = xml.CreateAttribute("Direction"); - direction.InnerText = "ltr"; - textNode.Attributes.Append(direction); - - int i = 0; - var txt = new StringBuilder(); - var html = new StringBuilder(); - XmlNode nodeTemp = xml.CreateElement("temp"); - while (i < line.Length) - { - if (!isItalic && line.Substring(i).StartsWith("")) - { - if (txt.Length > 0) - { - nodeTemp.InnerText = txt.ToString(); - html.Append(nodeTemp.InnerXml); - txt.Clear(); - } - isItalic = true; - i += 2; - } - else if (isItalic && line.Substring(i).StartsWith("")) - { - if (txt.Length > 0) - { - XmlNode fontNode = xml.CreateElement("dcst:Font", "dcst"); - - XmlAttribute italic = xml.CreateAttribute("Italic"); - italic.InnerText = "yes"; - fontNode.Attributes.Append(italic); - - if (line.Length > i + 5 && line.Substring(i + 4).StartsWith("")) - { - XmlAttribute fontColor = xml.CreateAttribute("Color"); - fontColor.InnerText = fontColors.Pop(); - fontNode.Attributes.Append(fontColor); - fontNo--; - i += 7; - } - - fontNode.InnerText = HtmlUtil.RemoveHtmlTags(txt.ToString()); - html.Append(fontNode.OuterXml); - txt.Clear(); - } - isItalic = false; - i += 3; - } - else if (line.Substring(i).StartsWith("")) - { - if (txt.Length > 0) - { - XmlNode fontNode = xml.CreateElement("dcst:Font", "dcst"); - - XmlAttribute fontColor = xml.CreateAttribute("Color"); - fontColor.InnerText = fontColors.Pop(); - fontNode.Attributes.Append(fontColor); - - if (line.Length > i + 9 && line.Substring(i + 7).StartsWith("")) - { - XmlAttribute italic = xml.CreateAttribute("Italic"); - italic.InnerText = "yes"; - fontNode.Attributes.Append(italic); - isItalic = false; - i += 4; - } - - fontNode.InnerText = HtmlUtil.RemoveHtmlTags(txt.ToString()); - html.Append(fontNode.OuterXml); - txt.Clear(); - } - fontNo--; - i += 6; - } - else - { - txt.Append(line[i]); - } - i++; - } - - if (fontNo > 0) - { - if (txt.Length > 0) - { - XmlNode fontNode = xml.CreateElement("dcst:Font", "dcst"); - - XmlAttribute fontColor = xml.CreateAttribute("Color"); - fontColor.InnerText = fontColors.Peek(); - fontNode.Attributes.Append(fontColor); - - if (isItalic) - { - XmlAttribute italic = xml.CreateAttribute("Italic"); - italic.InnerText = "yes"; - fontNode.Attributes.Append(italic); - } - - fontNode.InnerText = HtmlUtil.RemoveHtmlTags(txt.ToString()); - html.Append(fontNode.OuterXml); - } - else if (html.Length > 0 && html.ToString().StartsWith("" + html.ToString().Replace("dcst:Font", "Font") + ""); - XmlNode fontNode = xml.CreateElement("dcst:Font"); - fontNode.InnerXml = temp.DocumentElement.SelectSingleNode("Font").InnerXml; - foreach (XmlAttribute a in temp.DocumentElement.SelectSingleNode("Font").Attributes) - { - XmlAttribute newA = xml.CreateAttribute(a.Name); - newA.InnerText = a.InnerText; - fontNode.Attributes.Append(newA); - } - - XmlAttribute fontColor = xml.CreateAttribute("Color"); - fontColor.InnerText = fontColors.Peek(); - fontNode.Attributes.Append(fontColor); - - html.Clear(); - html.Append(fontNode.OuterXml); - } - } - else if (isItalic) - { - if (txt.Length > 0) - { - XmlNode fontNode = xml.CreateElement("dcst:Font", "dcst"); - - XmlAttribute italic = xml.CreateAttribute("Italic"); - italic.InnerText = "yes"; - fontNode.Attributes.Append(italic); - - fontNode.InnerText = HtmlUtil.RemoveHtmlTags(line); - html.Append(fontNode.OuterXml); - } - } - else - { - if (txt.Length > 0) - { - nodeTemp.InnerText = txt.ToString(); - html.Append(nodeTemp.InnerXml); - } - } - textNode.InnerXml = html.ToString(); - - subNode.AppendChild(textNode); - if (alignVTop) - { - vPos += vPosFactor; - } - else - { - vPos -= vPosFactor; - } - } - if (subNode.InnerXml.Length == 0) - { // Empty text is just one space - XmlNode textNode = xml.CreateElement("dcst:Text", "dcst"); - textNode.InnerXml = " "; - subNode.AppendChild(textNode); - - XmlAttribute vPosition = xml.CreateAttribute("Vposition"); - vPosition.InnerText = vPos.ToString(); - textNode.Attributes.Append(vPosition); - - XmlAttribute vAlign = xml.CreateAttribute("Valign"); - vAlign.InnerText = "bottom"; - textNode.Attributes.Append(vAlign); - } - mainListFont.AppendChild(subNode); - no++; - } - } - string result = ToUtf8XmlString(xml).Replace("encoding=\"utf-8\"", "encoding=\"UTF-8\"").Replace(" xmlns:dcst=\"dcst\"", string.Empty); - - const string res = "Nikse.SubtitleEdit.Resources.SMPTE-428-7-2007-DCST.xsd.gz"; - System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly(); - Stream strm = asm.GetManifestResourceStream(res); - if (strm != null) - { - try - { - var xmld = new XmlDocument(); - var rdr = new StreamReader(strm); - var zip = new GZipStream(rdr.BaseStream, CompressionMode.Decompress); - xmld.LoadXml(result); - using (var xr = XmlReader.Create(zip)) - { - xmld.Schemas.Add(null, xr); - xmld.Validate(ValidationCallBack); - } - } - catch (Exception exception) - { - Errors = "Error validating xml via SMPTE - 428 - 7 - 2007 - DCST.xsd: " + exception.Message; - } - } - return DCinemaSmpte2010.FixDcsTextSameLine(result); - } - - private void ValidationCallBack(object sender, ValidationEventArgs e) - { - throw new Exception(e.Message); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - var xml = new XmlDocument { XmlResolver = null }; - xml.LoadXml(sb.ToString().Replace(" 0 && lastVPosition.Length > 0) - { - pText.AppendLine(); - } - - lastVPosition = vPosition; - } - } - - bool alignLeft = false; - bool alignRight = false; - bool alignVTop = false; - bool alignVCenter = false; - if (innerNode.Attributes["Halign"] != null) - { - string hAlign = innerNode.Attributes["Halign"].InnerText; - if (hAlign == "left") - { - alignLeft = true; - } - else if (hAlign == "right") - { - alignRight = true; - } - } - - if (innerNode.Attributes["Valign"] != null) - { - string hAlign = innerNode.Attributes["Valign"].InnerText; - if (hAlign == "top") - { - alignVTop = true; - } - else if (hAlign == "center") - { - alignVCenter = true; - } - } - - if (alignLeft || alignRight || alignVCenter || alignVTop) - { - if (!pText.ToString().StartsWith("{\\an")) - { - string pre = string.Empty; - if (alignVTop) - { - if (alignLeft) - { - pre = "{\\an7}"; - } - else if (alignRight) - { - pre = "{\\an9}"; - } - else - { - pre = "{\\an8}"; - } - } - else if (alignVCenter) - { - if (alignLeft) - { - pre = "{\\an4}"; - } - else if (alignRight) - { - pre = "{\\an6}"; - } - else - { - pre = "{\\an5}"; - } - } - else - { - if (alignLeft) - { - pre = "{\\an1}"; - } - else if (alignRight) - { - pre = "{\\an3}"; - } - } - - string temp = pre + pText; - pText.Clear(); - pText.Append(temp); - } - } - - if (innerNode.ChildNodes.Count == 0) - { - pText.Append(innerNode.InnerText); - } - else - { - foreach (XmlNode innerInnerNode in innerNode) - { - if (innerInnerNode.Name == "Font" && innerInnerNode.Attributes["Italic"] != null && - innerInnerNode.Attributes["Italic"].InnerText.Equals("yes", StringComparison.OrdinalIgnoreCase)) - { - if (innerInnerNode.Attributes["Color"] != null) - { - pText.Append("" + innerInnerNode.InnerText + ""); - } - else - { - pText.Append("" + innerInnerNode.InnerText + ""); - } - } - else if (innerInnerNode.Name == "Font" && innerInnerNode.Attributes["Color"] != null) - { - if (innerInnerNode.Attributes["Italic"] != null && innerInnerNode.Attributes["Italic"].InnerText.Equals("yes", StringComparison.OrdinalIgnoreCase)) - { - pText.Append("" + innerInnerNode.InnerText + ""); - } - else - { - pText.Append("" + innerInnerNode.InnerText + ""); - } - } - else - { - pText.Append(innerInnerNode.InnerText); - } - } - } - } - else - { - pText.Append(innerNode.InnerText); - } - } - string start = node.Attributes["TimeIn"].InnerText; - string end = node.Attributes["TimeOut"].InnerText; - - if (node.ParentNode.Name == "Font" && node.ParentNode.Attributes["Italic"] != null && node.ParentNode.Attributes["Italic"].InnerText.Equals("yes", StringComparison.OrdinalIgnoreCase) && - !pText.ToString().Contains("")) - { - string text = pText.ToString(); - if (text.StartsWith("{\\an") && text.Length > 6) - { - text = text.Insert(6, "") + ""; - } - else - { - text = "" + text + ""; - } - pText = new StringBuilder(text); - } - - subtitle.Paragraphs.Add(new Paragraph(GetTimeCode(start), GetTimeCode(end), pText.ToString())); - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine(ex.Message); - _errorCount++; - } - } - - if (subtitle.Paragraphs.Count > 0) - { - subtitle.Header = xml.OuterXml; // save id/language/font for later use - } - - subtitle.Renumber(); - } - - private static string GetColorStringFromDCinema(string p) - { - string s = p.ToLowerInvariant().Trim(); - if (s.Replace("#", string.Empty). - Replace("0", string.Empty). - Replace("1", string.Empty). - Replace("2", string.Empty). - Replace("3", string.Empty). - Replace("4", string.Empty). - Replace("5", string.Empty). - Replace("6", string.Empty). - Replace("7", string.Empty). - Replace("8", string.Empty). - Replace("9", string.Empty). - Replace("a", string.Empty). - Replace("b", string.Empty). - Replace("c", string.Empty). - Replace("d", string.Empty). - Replace("e", string.Empty). - Replace("f", string.Empty).Length == 0) - { - if (s.StartsWith('#')) - { - return s; - } - return "#" + s; - } - return p; - } - - private TimeCode GetTimeCode(string s) - { - var parts = s.Split(':', '.', ','); - - int milliseconds = (int)Math.Round(int.Parse(parts[3]) * (TimeCode.BaseUnit / _frameRate)); - if (milliseconds > 999) - { - milliseconds = 999; - } - - return new TimeCode(int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2]), milliseconds); - } - - private string ConvertToTimeString(TimeCode time) - { - return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}:{DCinemaSmpte2010.MsToFramesMaxFrameRate(time.Milliseconds, _frameRate):00}"; - } - - } -} +using System; +using System.Collections.Generic; +using System.IO; +using System.IO.Compression; +using System.Text; +using System.Xml; +using System.Xml.Schema; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class DCinemaSmpte2007 : SubtitleFormat + { + // + // + // urn:uuid:7be835a3-cfb4-43d0-bb4b-f0b4c95e962e + // 2001, A Space Odissey + // This is a subtitle file + // 2012-06-26T12:33:59.000-00:00 + // 1 + // fr + // 25 1 + // 25 + // 00:00:00:00 + // urn:uuid:3dec6dc0-39d0-498d-97d0-928d2eb78391 + // + // + // Hallo + // + // + + public string Errors { get; private set; } + + private double _frameRate = 24; + + public int Version { get; set; } + + public override string Extension => ".xml"; + + public override string Name => "D-Cinema SMPTE 2007"; + + public override bool IsMine(List lines, string fileName) + { + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + string xmlAsString = sb.ToString().Trim(); + if (xmlAsString.Contains("http://www.smpte-ra.org/schemas/428-7/2010/DCST") || + xmlAsString.Contains("http://www.smpte-ra.org/schemas/428-7/2014/DCST")) + { + return false; + } + + if (xmlAsString.Contains(" 0; + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine(ex.Message); + return false; + } + } + return false; + } + + public override string ToText(Subtitle subtitle, string title) + { + Errors = null; + var ss = Configuration.Settings.SubtitleSettings; + + if (!string.IsNullOrEmpty(ss.CurrentDCinemaEditRate)) + { + string[] temp = ss.CurrentDCinemaEditRate.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + double d1, d2; + if (temp.Length == 2 && double.TryParse(temp[0], out d1) && double.TryParse(temp[1], out d2)) + { + _frameRate = d1 / d2; + } + } + + string xmlStructure = + "" + Environment.NewLine + + " urn:uuid:7be835a3-cfb4-43d0-bb4b-f0b4c95e962e" + Environment.NewLine + + " " + Environment.NewLine + + " This is a subtitle file" + Environment.NewLine + + " 2012-06-26T12:33:59.000-00:00" + Environment.NewLine + + " 1" + Environment.NewLine + + " en" + Environment.NewLine + + " 25 1" + Environment.NewLine + + " 25" + Environment.NewLine + + " 00:00:00:00 " + Environment.NewLine + + " urn:uuid:3dec6dc0-39d0-498d-97d0-928d2eb78391" + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + ""; + + var xml = new XmlDocument(); + xml.LoadXml(xmlStructure); + xml.PreserveWhitespace = true; + var nsmgr = new XmlNamespaceManager(xml.NameTable); + nsmgr.AddNamespace("dcst", xml.DocumentElement.NamespaceURI); + + if (string.IsNullOrEmpty(ss.CurrentDCinemaMovieTitle)) + { + ss.CurrentDCinemaMovieTitle = title; + } + + if (ss.CurrentDCinemaFontSize == 0 || string.IsNullOrEmpty(ss.CurrentDCinemaFontEffect)) + { + Configuration.Settings.SubtitleSettings.InitializeDCinameSettings(true); + } + + xml.DocumentElement.SelectSingleNode("dcst:ContentTitleText", nsmgr).InnerText = ss.CurrentDCinemaMovieTitle; + if (string.IsNullOrEmpty(ss.CurrentDCinemaSubtitleId) || !ss.CurrentDCinemaSubtitleId.StartsWith("urn:uuid:")) + { + ss.CurrentDCinemaSubtitleId = "urn:uuid:" + Guid.NewGuid(); + } + + xml.DocumentElement.SelectSingleNode("dcst:Id", nsmgr).InnerText = ss.CurrentDCinemaSubtitleId; + xml.DocumentElement.SelectSingleNode("dcst:ReelNumber", nsmgr).InnerText = ss.CurrentDCinemaReelNumber; + xml.DocumentElement.SelectSingleNode("dcst:IssueDate", nsmgr).InnerText = ss.CurrentDCinemaIssueDate; + if (string.IsNullOrEmpty(ss.CurrentDCinemaLanguage)) + { + ss.CurrentDCinemaLanguage = "en"; + } + + xml.DocumentElement.SelectSingleNode("dcst:Language", nsmgr).InnerText = ss.CurrentDCinemaLanguage; + if (ss.CurrentDCinemaEditRate == null && ss.CurrentDCinemaTimeCodeRate == null) + { + if (Configuration.Settings.General.CurrentFrameRate == 24) + { + ss.CurrentDCinemaEditRate = "24 1"; + ss.CurrentDCinemaTimeCodeRate = "24"; + } + else + { + ss.CurrentDCinemaEditRate = "25 1"; + ss.CurrentDCinemaTimeCodeRate = "25"; + } + } + xml.DocumentElement.SelectSingleNode("dcst:EditRate", nsmgr).InnerText = ss.CurrentDCinemaEditRate; + xml.DocumentElement.SelectSingleNode("dcst:TimeCodeRate", nsmgr).InnerText = ss.CurrentDCinemaTimeCodeRate; + if (string.IsNullOrEmpty(ss.CurrentDCinemaStartTime)) + { + ss.CurrentDCinemaStartTime = "00:00:00:00"; + } + + xml.DocumentElement.SelectSingleNode("dcst:StartTime", nsmgr).InnerText = ss.CurrentDCinemaStartTime; + xml.DocumentElement.SelectSingleNode("dcst:LoadFont", nsmgr).InnerText = ss.CurrentDCinemaFontUri; + int fontSize = ss.CurrentDCinemaFontSize; + string loadedFontId = "Font1"; + if (!string.IsNullOrEmpty(ss.CurrentDCinemaFontId)) + { + loadedFontId = ss.CurrentDCinemaFontId; + } + + xml.DocumentElement.SelectSingleNode("dcst:LoadFont", nsmgr).Attributes["ID"].Value = loadedFontId; + xml.DocumentElement.SelectSingleNode("dcst:SubtitleList/dcst:Font", nsmgr).Attributes["Size"].Value = fontSize.ToString(); + xml.DocumentElement.SelectSingleNode("dcst:SubtitleList/dcst:Font", nsmgr).Attributes["Color"].Value = "FF" + Utilities.ColorToHex(ss.CurrentDCinemaFontColor).TrimStart('#').ToUpperInvariant(); + xml.DocumentElement.SelectSingleNode("dcst:SubtitleList/dcst:Font", nsmgr).Attributes["ID"].Value = loadedFontId; + xml.DocumentElement.SelectSingleNode("dcst:SubtitleList/dcst:Font", nsmgr).Attributes["Effect"].Value = ss.CurrentDCinemaFontEffect; + xml.DocumentElement.SelectSingleNode("dcst:SubtitleList/dcst:Font", nsmgr).Attributes["EffectColor"].Value = "FF" + Utilities.ColorToHex(ss.CurrentDCinemaFontEffectColor).TrimStart('#').ToUpperInvariant(); + + XmlNode mainListFont = xml.DocumentElement.SelectSingleNode("dcst:SubtitleList/dcst:Font", nsmgr); + int no = 0; + foreach (Paragraph p in subtitle.Paragraphs) + { + if (p.Text != null) + { + XmlNode subNode = xml.CreateElement("dcst:Subtitle", "dcst"); + + XmlAttribute id = xml.CreateAttribute("SpotNumber"); + id.InnerText = (no + 1).ToString(); + subNode.Attributes.Append(id); + + XmlAttribute fadeUpTime = xml.CreateAttribute("FadeUpTime"); + fadeUpTime.InnerText = "00:00:00:00"; + subNode.Attributes.Append(fadeUpTime); + + XmlAttribute fadeDownTime = xml.CreateAttribute("FadeDownTime"); + fadeDownTime.InnerText = "00:00:00:00"; + subNode.Attributes.Append(fadeDownTime); + + XmlAttribute start = xml.CreateAttribute("TimeIn"); + start.InnerText = ConvertToTimeString(p.StartTime); + subNode.Attributes.Append(start); + + XmlAttribute end = xml.CreateAttribute("TimeOut"); + end.InnerText = ConvertToTimeString(p.EndTime); + subNode.Attributes.Append(end); + + bool alignLeft = p.Text.StartsWith("{\\a1}", StringComparison.Ordinal) || p.Text.StartsWith("{\\a5}", StringComparison.Ordinal) || p.Text.StartsWith("{\\a9}", StringComparison.Ordinal) || // sub station alpha + p.Text.StartsWith("{\\an1}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an4}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an7}", StringComparison.Ordinal); // advanced sub station alpha + + bool alignRight = p.Text.StartsWith("{\\a3}", StringComparison.Ordinal) || p.Text.StartsWith("{\\a7}", StringComparison.Ordinal) || p.Text.StartsWith("{\\a11}", StringComparison.Ordinal) || // sub station alpha + p.Text.StartsWith("{\\an3}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an6}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an9}", StringComparison.Ordinal); // advanced sub station alpha + + bool alignVTop = p.Text.StartsWith("{\\a5}", StringComparison.Ordinal) || p.Text.StartsWith("{\\a6}", StringComparison.Ordinal) || p.Text.StartsWith("{\\a7}", StringComparison.Ordinal) || // sub station alpha + p.Text.StartsWith("{\\an7}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an8}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an9}", StringComparison.Ordinal); // advanced sub station alpha + + bool alignVCenter = p.Text.StartsWith("{\\a9}", StringComparison.Ordinal) || p.Text.StartsWith("{\\a10}", StringComparison.Ordinal) || p.Text.StartsWith("{\\a11}", StringComparison.Ordinal) || // sub station alpha + p.Text.StartsWith("{\\an4}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an5}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an6}", StringComparison.Ordinal); // advanced sub station alpha + + string text = Utilities.RemoveSsaTags(p.Text); + + var lines = text.SplitToLines(); + int vPos = 1 + lines.Count * 7; + int vPosFactor = (int)Math.Round(fontSize / 7.4); + if (alignVTop) + { + vPos = Configuration.Settings.SubtitleSettings.DCinemaBottomMargin; // Bottom margin is normally 8 + } + else if (alignVCenter) + { + vPos = (int)Math.Round((lines.Count * vPosFactor * -1) / 2.0); + } + else + { + vPos = lines.Count * vPosFactor - vPosFactor + Configuration.Settings.SubtitleSettings.DCinemaBottomMargin; // Bottom margin is normally 8 + } + + bool isItalic = false; + int fontNo = 0; + Stack fontColors = new Stack(); + foreach (string line in lines) + { + XmlNode textNode = xml.CreateElement("dcst:Text", "dcst"); + + XmlAttribute vPosition = xml.CreateAttribute("Vposition"); + vPosition.InnerText = vPos.ToString(); + textNode.Attributes.Append(vPosition); + + XmlAttribute vAlign = xml.CreateAttribute("Valign"); + if (alignVTop) + { + vAlign.InnerText = "top"; + } + else if (alignVCenter) + { + vAlign.InnerText = "center"; + } + else + { + vAlign.InnerText = "bottom"; + } + + textNode.Attributes.Append(vAlign); textNode.Attributes.Append(vAlign); + + XmlAttribute hAlign = xml.CreateAttribute("Halign"); + if (alignLeft) + { + hAlign.InnerText = "left"; + } + else if (alignRight) + { + hAlign.InnerText = "right"; + } + else + { + hAlign.InnerText = "center"; + } + + textNode.Attributes.Append(hAlign); + + XmlAttribute direction = xml.CreateAttribute("Direction"); + direction.InnerText = "ltr"; + textNode.Attributes.Append(direction); + + int i = 0; + var txt = new StringBuilder(); + var html = new StringBuilder(); + XmlNode nodeTemp = xml.CreateElement("temp"); + while (i < line.Length) + { + if (!isItalic && line.Substring(i).StartsWith("")) + { + if (txt.Length > 0) + { + nodeTemp.InnerText = txt.ToString(); + html.Append(nodeTemp.InnerXml); + txt.Clear(); + } + isItalic = true; + i += 2; + } + else if (isItalic && line.Substring(i).StartsWith("")) + { + if (txt.Length > 0) + { + XmlNode fontNode = xml.CreateElement("dcst:Font", "dcst"); + + XmlAttribute italic = xml.CreateAttribute("Italic"); + italic.InnerText = "yes"; + fontNode.Attributes.Append(italic); + + if (line.Length > i + 5 && line.Substring(i + 4).StartsWith("")) + { + XmlAttribute fontColor = xml.CreateAttribute("Color"); + fontColor.InnerText = fontColors.Pop(); + fontNode.Attributes.Append(fontColor); + fontNo--; + i += 7; + } + + fontNode.InnerText = HtmlUtil.RemoveHtmlTags(txt.ToString()); + html.Append(fontNode.OuterXml); + txt.Clear(); + } + isItalic = false; + i += 3; + } + else if (line.Substring(i).StartsWith("")) + { + if (txt.Length > 0) + { + XmlNode fontNode = xml.CreateElement("dcst:Font", "dcst"); + + XmlAttribute fontColor = xml.CreateAttribute("Color"); + fontColor.InnerText = fontColors.Pop(); + fontNode.Attributes.Append(fontColor); + + if (line.Length > i + 9 && line.Substring(i + 7).StartsWith("")) + { + XmlAttribute italic = xml.CreateAttribute("Italic"); + italic.InnerText = "yes"; + fontNode.Attributes.Append(italic); + isItalic = false; + i += 4; + } + + fontNode.InnerText = HtmlUtil.RemoveHtmlTags(txt.ToString()); + html.Append(fontNode.OuterXml); + txt.Clear(); + } + fontNo--; + i += 6; + } + else + { + txt.Append(line[i]); + } + i++; + } + + if (fontNo > 0) + { + if (txt.Length > 0) + { + XmlNode fontNode = xml.CreateElement("dcst:Font", "dcst"); + + XmlAttribute fontColor = xml.CreateAttribute("Color"); + fontColor.InnerText = fontColors.Peek(); + fontNode.Attributes.Append(fontColor); + + if (isItalic) + { + XmlAttribute italic = xml.CreateAttribute("Italic"); + italic.InnerText = "yes"; + fontNode.Attributes.Append(italic); + } + + fontNode.InnerText = HtmlUtil.RemoveHtmlTags(txt.ToString()); + html.Append(fontNode.OuterXml); + } + else if (html.Length > 0 && html.ToString().StartsWith("" + html.ToString().Replace("dcst:Font", "Font") + ""); + XmlNode fontNode = xml.CreateElement("dcst:Font"); + fontNode.InnerXml = temp.DocumentElement.SelectSingleNode("Font").InnerXml; + foreach (XmlAttribute a in temp.DocumentElement.SelectSingleNode("Font").Attributes) + { + XmlAttribute newA = xml.CreateAttribute(a.Name); + newA.InnerText = a.InnerText; + fontNode.Attributes.Append(newA); + } + + XmlAttribute fontColor = xml.CreateAttribute("Color"); + fontColor.InnerText = fontColors.Peek(); + fontNode.Attributes.Append(fontColor); + + html.Clear(); + html.Append(fontNode.OuterXml); + } + } + else if (isItalic) + { + if (txt.Length > 0) + { + XmlNode fontNode = xml.CreateElement("dcst:Font", "dcst"); + + XmlAttribute italic = xml.CreateAttribute("Italic"); + italic.InnerText = "yes"; + fontNode.Attributes.Append(italic); + + fontNode.InnerText = HtmlUtil.RemoveHtmlTags(line); + html.Append(fontNode.OuterXml); + } + } + else + { + if (txt.Length > 0) + { + nodeTemp.InnerText = txt.ToString(); + html.Append(nodeTemp.InnerXml); + } + } + textNode.InnerXml = html.ToString(); + + subNode.AppendChild(textNode); + if (alignVTop) + { + vPos += vPosFactor; + } + else + { + vPos -= vPosFactor; + } + } + if (subNode.InnerXml.Length == 0) + { // Empty text is just one space + XmlNode textNode = xml.CreateElement("dcst:Text", "dcst"); + textNode.InnerXml = " "; + subNode.AppendChild(textNode); + + XmlAttribute vPosition = xml.CreateAttribute("Vposition"); + vPosition.InnerText = vPos.ToString(); + textNode.Attributes.Append(vPosition); + + XmlAttribute vAlign = xml.CreateAttribute("Valign"); + vAlign.InnerText = "bottom"; + textNode.Attributes.Append(vAlign); + } + mainListFont.AppendChild(subNode); + no++; + } + } + string result = ToUtf8XmlString(xml).Replace("encoding=\"utf-8\"", "encoding=\"UTF-8\"").Replace(" xmlns:dcst=\"dcst\"", string.Empty); + + const string res = "Nikse.SubtitleEdit.Resources.SMPTE-428-7-2007-DCST.xsd.gz"; + System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly(); + Stream strm = asm.GetManifestResourceStream(res); + if (strm != null) + { + try + { + var xmld = new XmlDocument(); + var rdr = new StreamReader(strm); + var zip = new GZipStream(rdr.BaseStream, CompressionMode.Decompress); + xmld.LoadXml(result); + using (var xr = XmlReader.Create(zip)) + { + xmld.Schemas.Add(null, xr); + xmld.Validate(ValidationCallBack); + } + } + catch (Exception exception) + { + Errors = "Error validating xml via SMPTE - 428 - 7 - 2007 - DCST.xsd: " + exception.Message; + } + } + return DCinemaSmpte2010.FixDcsTextSameLine(result); + } + + private void ValidationCallBack(object sender, ValidationEventArgs e) + { + throw new Exception(e.Message); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + var xml = new XmlDocument { XmlResolver = null }; + xml.LoadXml(sb.ToString().Replace(" 0 && lastVPosition.Length > 0) + { + pText.AppendLine(); + } + + lastVPosition = vPosition; + } + } + + bool alignLeft = false; + bool alignRight = false; + bool alignVTop = false; + bool alignVCenter = false; + if (innerNode.Attributes["Halign"] != null) + { + string hAlign = innerNode.Attributes["Halign"].InnerText; + if (hAlign == "left") + { + alignLeft = true; + } + else if (hAlign == "right") + { + alignRight = true; + } + } + + if (innerNode.Attributes["Valign"] != null) + { + string hAlign = innerNode.Attributes["Valign"].InnerText; + if (hAlign == "top") + { + alignVTop = true; + } + else if (hAlign == "center") + { + alignVCenter = true; + } + } + + if (alignLeft || alignRight || alignVCenter || alignVTop) + { + if (!pText.ToString().StartsWith("{\\an")) + { + string pre = string.Empty; + if (alignVTop) + { + if (alignLeft) + { + pre = "{\\an7}"; + } + else if (alignRight) + { + pre = "{\\an9}"; + } + else + { + pre = "{\\an8}"; + } + } + else if (alignVCenter) + { + if (alignLeft) + { + pre = "{\\an4}"; + } + else if (alignRight) + { + pre = "{\\an6}"; + } + else + { + pre = "{\\an5}"; + } + } + else + { + if (alignLeft) + { + pre = "{\\an1}"; + } + else if (alignRight) + { + pre = "{\\an3}"; + } + } + + string temp = pre + pText; + pText.Clear(); + pText.Append(temp); + } + } + + if (innerNode.ChildNodes.Count == 0) + { + pText.Append(innerNode.InnerText); + } + else + { + foreach (XmlNode innerInnerNode in innerNode) + { + if (innerInnerNode.Name == "Font" && innerInnerNode.Attributes["Italic"] != null && + innerInnerNode.Attributes["Italic"].InnerText.Equals("yes", StringComparison.OrdinalIgnoreCase)) + { + if (innerInnerNode.Attributes["Color"] != null) + { + pText.Append("" + innerInnerNode.InnerText + ""); + } + else + { + pText.Append("" + innerInnerNode.InnerText + ""); + } + } + else if (innerInnerNode.Name == "Font" && innerInnerNode.Attributes["Color"] != null) + { + if (innerInnerNode.Attributes["Italic"] != null && innerInnerNode.Attributes["Italic"].InnerText.Equals("yes", StringComparison.OrdinalIgnoreCase)) + { + pText.Append("" + innerInnerNode.InnerText + ""); + } + else + { + pText.Append("" + innerInnerNode.InnerText + ""); + } + } + else + { + pText.Append(innerInnerNode.InnerText); + } + } + } + } + else + { + pText.Append(innerNode.InnerText); + } + } + string start = node.Attributes["TimeIn"].InnerText; + string end = node.Attributes["TimeOut"].InnerText; + + if (node.ParentNode.Name == "Font" && node.ParentNode.Attributes["Italic"] != null && node.ParentNode.Attributes["Italic"].InnerText.Equals("yes", StringComparison.OrdinalIgnoreCase) && + !pText.ToString().Contains("")) + { + string text = pText.ToString(); + if (text.StartsWith("{\\an") && text.Length > 6) + { + text = text.Insert(6, "") + ""; + } + else + { + text = "" + text + ""; + } + pText = new StringBuilder(text); + } + + subtitle.Paragraphs.Add(new Paragraph(GetTimeCode(start), GetTimeCode(end), pText.ToString())); + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine(ex.Message); + _errorCount++; + } + } + + if (subtitle.Paragraphs.Count > 0) + { + subtitle.Header = xml.OuterXml; // save id/language/font for later use + } + + subtitle.Renumber(); + } + + private static string GetColorStringFromDCinema(string p) + { + string s = p.ToLowerInvariant().Trim(); + if (s.Replace("#", string.Empty). + Replace("0", string.Empty). + Replace("1", string.Empty). + Replace("2", string.Empty). + Replace("3", string.Empty). + Replace("4", string.Empty). + Replace("5", string.Empty). + Replace("6", string.Empty). + Replace("7", string.Empty). + Replace("8", string.Empty). + Replace("9", string.Empty). + Replace("a", string.Empty). + Replace("b", string.Empty). + Replace("c", string.Empty). + Replace("d", string.Empty). + Replace("e", string.Empty). + Replace("f", string.Empty).Length == 0) + { + if (s.StartsWith('#')) + { + return s; + } + return "#" + s; + } + return p; + } + + private TimeCode GetTimeCode(string s) + { + var parts = s.Split(':', '.', ','); + + int milliseconds = (int)Math.Round(int.Parse(parts[3]) * (TimeCode.BaseUnit / _frameRate)); + if (milliseconds > 999) + { + milliseconds = 999; + } + + return new TimeCode(int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2]), milliseconds); + } + + private string ConvertToTimeString(TimeCode time) + { + return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}:{DCinemaSmpte2010.MsToFramesMaxFrameRate(time.Milliseconds, _frameRate):00}"; + } + + } +} diff --git a/libse/SubtitleFormats/DCinemaSmpte2010.cs b/src/libse/SubtitleFormats/DCinemaSmpte2010.cs similarity index 98% rename from libse/SubtitleFormats/DCinemaSmpte2010.cs rename to src/libse/SubtitleFormats/DCinemaSmpte2010.cs index 129429e3f..f72c8e305 100644 --- a/libse/SubtitleFormats/DCinemaSmpte2010.cs +++ b/src/libse/SubtitleFormats/DCinemaSmpte2010.cs @@ -1,854 +1,854 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.IO.Compression; -using System.Text; -using System.Xml; -using System.Xml.Schema; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class DCinemaSmpte2010 : SubtitleFormat - { - // - // - // urn:uuid:7be835a3-cfb4-43d0-bb4b-f0b4c95e962e - // 2001, A Space Odissey - // This is a subtitle file - // 2012-06-26T12:33:59.000-00:00 - // 1 - // fr - // 25 1 - // 25 - // 00:00:00:00 - // urn:uuid:3dec6dc0-39d0-498d-97d0-928d2eb78391 - // - // - // Hallo - // - // - - public string Errors { get; private set; } - - private double _frameRate = 24; - - public int Version { get; set; } - - public override string Extension => ".xml"; - - public override string Name => "D-Cinema SMPTE 2010"; - - public override bool IsMine(List lines, string fileName) - { - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - string xmlAsString = sb.ToString().Trim(); - - if (xmlAsString.Contains("http://www.smpte-ra.org/schemas/428-7/2007/DCST") || - xmlAsString.Contains("http://www.smpte-ra.org/schemas/428-7/2014/DCST")) - { - return false; - } - - if (xmlAsString.Contains(" 0; - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine(ex.Message); - return false; - } - } - return false; - } - - public override string ToText(Subtitle subtitle, string title) - { - Errors = null; - var ss = Configuration.Settings.SubtitleSettings; - - if (!string.IsNullOrEmpty(ss.CurrentDCinemaEditRate)) - { - string[] temp = ss.CurrentDCinemaEditRate.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); - double d1, d2; - if (temp.Length == 2 && double.TryParse(temp[0], out d1) && double.TryParse(temp[1], out d2)) - { - _frameRate = d1 / d2; - } - } - - string xmlStructure = - "" + Environment.NewLine + - " urn:uuid:7be835a3-cfb4-43d0-bb4b-f0b4c95e962e" + Environment.NewLine + - " " + Environment.NewLine + - " This is a subtitle file" + Environment.NewLine + - " 2012-06-26T12:33:59.000-00:00" + Environment.NewLine + - " 1" + Environment.NewLine + - " en" + Environment.NewLine + - " 25 1" + Environment.NewLine + - " 25" + Environment.NewLine + - " 00:00:00:00 " + Environment.NewLine + - " urn:uuid:3dec6dc0-39d0-498d-97d0-928d2eb78391" + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - ""; - - var xml = new XmlDocument(); - xml.LoadXml(xmlStructure); - xml.PreserveWhitespace = true; - var nsmgr = new XmlNamespaceManager(xml.NameTable); - nsmgr.AddNamespace("dcst", xml.DocumentElement.NamespaceURI); - - if (string.IsNullOrEmpty(ss.CurrentDCinemaMovieTitle)) - { - ss.CurrentDCinemaMovieTitle = title; - } - - if (ss.CurrentDCinemaFontSize == 0 || string.IsNullOrEmpty(ss.CurrentDCinemaFontEffect)) - { - Configuration.Settings.SubtitleSettings.InitializeDCinameSettings(true); - } - - xml.DocumentElement.SelectSingleNode("dcst:ContentTitleText", nsmgr).InnerText = ss.CurrentDCinemaMovieTitle; - if (string.IsNullOrEmpty(ss.CurrentDCinemaSubtitleId) || !ss.CurrentDCinemaSubtitleId.StartsWith("urn:uuid:")) - { - ss.CurrentDCinemaSubtitleId = "urn:uuid:" + Guid.NewGuid(); - } - - xml.DocumentElement.SelectSingleNode("dcst:Id", nsmgr).InnerText = ss.CurrentDCinemaSubtitleId; - xml.DocumentElement.SelectSingleNode("dcst:ReelNumber", nsmgr).InnerText = ss.CurrentDCinemaReelNumber; - xml.DocumentElement.SelectSingleNode("dcst:IssueDate", nsmgr).InnerText = ss.CurrentDCinemaIssueDate; - if (string.IsNullOrEmpty(ss.CurrentDCinemaLanguage)) - { - ss.CurrentDCinemaLanguage = "en"; - } - - xml.DocumentElement.SelectSingleNode("dcst:Language", nsmgr).InnerText = ss.CurrentDCinemaLanguage; - if (ss.CurrentDCinemaEditRate == null && ss.CurrentDCinemaTimeCodeRate == null) - { - if (Math.Abs(Configuration.Settings.General.CurrentFrameRate - 24) < 0.01) - { - ss.CurrentDCinemaEditRate = "24 1"; - ss.CurrentDCinemaTimeCodeRate = "24"; - } - else - { - ss.CurrentDCinemaEditRate = "25 1"; - ss.CurrentDCinemaTimeCodeRate = "25"; - } - } - xml.DocumentElement.SelectSingleNode("dcst:EditRate", nsmgr).InnerText = ss.CurrentDCinemaEditRate; - xml.DocumentElement.SelectSingleNode("dcst:TimeCodeRate", nsmgr).InnerText = ss.CurrentDCinemaTimeCodeRate; - if (string.IsNullOrEmpty(ss.CurrentDCinemaStartTime)) - { - ss.CurrentDCinemaStartTime = "00:00:00:00"; - } - - xml.DocumentElement.SelectSingleNode("dcst:StartTime", nsmgr).InnerText = ss.CurrentDCinemaStartTime; - xml.DocumentElement.SelectSingleNode("dcst:LoadFont", nsmgr).InnerText = ss.CurrentDCinemaFontUri; - int fontSize = ss.CurrentDCinemaFontSize; - string loadedFontId = "Font1"; - if (!string.IsNullOrEmpty(ss.CurrentDCinemaFontId)) - { - loadedFontId = ss.CurrentDCinemaFontId; - } - - xml.DocumentElement.SelectSingleNode("dcst:LoadFont", nsmgr).Attributes["ID"].Value = loadedFontId; - xml.DocumentElement.SelectSingleNode("dcst:SubtitleList/dcst:Font", nsmgr).Attributes["Size"].Value = fontSize.ToString(); - xml.DocumentElement.SelectSingleNode("dcst:SubtitleList/dcst:Font", nsmgr).Attributes["Color"].Value = "FF" + Utilities.ColorToHex(ss.CurrentDCinemaFontColor).TrimStart('#').ToUpperInvariant(); - xml.DocumentElement.SelectSingleNode("dcst:SubtitleList/dcst:Font", nsmgr).Attributes["ID"].Value = loadedFontId; - xml.DocumentElement.SelectSingleNode("dcst:SubtitleList/dcst:Font", nsmgr).Attributes["Effect"].Value = ss.CurrentDCinemaFontEffect; - xml.DocumentElement.SelectSingleNode("dcst:SubtitleList/dcst:Font", nsmgr).Attributes["EffectColor"].Value = "FF" + Utilities.ColorToHex(ss.CurrentDCinemaFontEffectColor).TrimStart('#').ToUpperInvariant(); - - XmlNode mainListFont = xml.DocumentElement.SelectSingleNode("dcst:SubtitleList/dcst:Font", nsmgr); - int no = 0; - foreach (Paragraph p in subtitle.Paragraphs) - { - if (p.Text != null) - { - XmlNode subNode = xml.CreateElement("dcst:Subtitle", "dcst"); - - XmlAttribute id = xml.CreateAttribute("SpotNumber"); - id.InnerText = (no + 1).ToString(); - subNode.Attributes.Append(id); - - XmlAttribute fadeUpTime = xml.CreateAttribute("FadeUpTime"); - fadeUpTime.InnerText = new TimeCode(FramesToMilliseconds(Configuration.Settings.SubtitleSettings.DCinemaFadeUpTime)).ToHHMMSSFF(); - subNode.Attributes.Append(fadeUpTime); - - XmlAttribute fadeDownTime = xml.CreateAttribute("FadeDownTime"); - fadeDownTime.InnerText = new TimeCode(FramesToMilliseconds(Configuration.Settings.SubtitleSettings.DCinemaFadeDownTime)).ToHHMMSSFF(); - subNode.Attributes.Append(fadeDownTime); - - XmlAttribute start = xml.CreateAttribute("TimeIn"); - start.InnerText = ConvertToTimeString(p.StartTime); - subNode.Attributes.Append(start); - - XmlAttribute end = xml.CreateAttribute("TimeOut"); - end.InnerText = ConvertToTimeString(p.EndTime); - subNode.Attributes.Append(end); - - bool alignLeft = p.Text.StartsWith("{\\a1}", StringComparison.Ordinal) || p.Text.StartsWith("{\\a5}", StringComparison.Ordinal) || p.Text.StartsWith("{\\a9}", StringComparison.Ordinal) || // sub station alpha - p.Text.StartsWith("{\\an1}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an4}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an7}", StringComparison.Ordinal); // advanced sub station alpha - - bool alignRight = p.Text.StartsWith("{\\a3}", StringComparison.Ordinal) || p.Text.StartsWith("{\\a7}", StringComparison.Ordinal) || p.Text.StartsWith("{\\a11}", StringComparison.Ordinal) || // sub station alpha - p.Text.StartsWith("{\\an3}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an6}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an9}", StringComparison.Ordinal); // advanced sub station alpha - - bool alignVTop = p.Text.StartsWith("{\\a5}", StringComparison.Ordinal) || p.Text.StartsWith("{\\a6}", StringComparison.Ordinal) || p.Text.StartsWith("{\\a7}", StringComparison.Ordinal) || // sub station alpha - p.Text.StartsWith("{\\an7}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an8}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an9}", StringComparison.Ordinal); // advanced sub station alpha - - bool alignVCenter = p.Text.StartsWith("{\\a9}", StringComparison.Ordinal) || p.Text.StartsWith("{\\a10}", StringComparison.Ordinal) || p.Text.StartsWith("{\\a11}", StringComparison.Ordinal) || // sub station alpha - p.Text.StartsWith("{\\an4}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an5}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an6}", StringComparison.Ordinal); // advanced sub station alpha - - string text = Utilities.RemoveSsaTags(p.Text); - - var lines = text.SplitToLines(); - int vPos = 1 + lines.Count * 7; - int vPosFactor = (int)Math.Round(fontSize / 7.4); - if (alignVTop) - { - vPos = Configuration.Settings.SubtitleSettings.DCinemaBottomMargin; // Bottom margin is normally 8 - } - else if (alignVCenter) - { - vPos = (int)Math.Round((lines.Count * vPosFactor * -1) / 2.0); - } - else - { - vPos = (lines.Count * vPosFactor) - vPosFactor + Configuration.Settings.SubtitleSettings.DCinemaBottomMargin; // Bottom margin is normally 8 - } - - bool isItalic = false; - int fontNo = 0; - Stack fontColors = new Stack(); - foreach (string line in lines) - { - XmlNode textNode = xml.CreateElement("dcst:Text", "dcst"); - - XmlAttribute vPosition = xml.CreateAttribute("Vposition"); - vPosition.InnerText = vPos.ToString(); - textNode.Attributes.Append(vPosition); - - XmlAttribute vAlign = xml.CreateAttribute("Valign"); - if (alignVTop) - { - vAlign.InnerText = "top"; - } - else if (alignVCenter) - { - vAlign.InnerText = "center"; - } - else - { - vAlign.InnerText = "bottom"; - } - - textNode.Attributes.Append(vAlign); textNode.Attributes.Append(vAlign); - - XmlAttribute hAlign = xml.CreateAttribute("Halign"); - if (alignLeft) - { - hAlign.InnerText = "left"; - } - else if (alignRight) - { - hAlign.InnerText = "right"; - } - else - { - hAlign.InnerText = "center"; - } - - textNode.Attributes.Append(hAlign); - - XmlAttribute direction = xml.CreateAttribute("Direction"); - direction.InnerText = "ltr"; - textNode.Attributes.Append(direction); - - int i = 0; - var txt = new StringBuilder(); - var html = new StringBuilder(); - XmlNode nodeTemp = xml.CreateElement("temp"); - while (i < line.Length) - { - if (!isItalic && line.Substring(i).StartsWith("", StringComparison.Ordinal)) - { - if (txt.Length > 0) - { - nodeTemp.InnerText = txt.ToString(); - html.Append(nodeTemp.InnerXml); - txt.Clear(); - } - isItalic = true; - i += 2; - } - else if (isItalic && line.Substring(i).StartsWith("", StringComparison.Ordinal)) - { - if (txt.Length > 0) - { - XmlNode fontNode = xml.CreateElement("dcst:Font", "dcst"); - - XmlAttribute italic = xml.CreateAttribute("Italic"); - italic.InnerText = "yes"; - fontNode.Attributes.Append(italic); - - if (line.Length > i + 5 && line.Substring(i + 4).StartsWith("", StringComparison.Ordinal)) - { - XmlAttribute fontColor = xml.CreateAttribute("Color"); - fontColor.InnerText = fontColors.Pop(); - fontNode.Attributes.Append(fontColor); - fontNo--; - i += 7; - } - - fontNode.InnerText = HtmlUtil.RemoveHtmlTags(txt.ToString()); - html.Append(fontNode.OuterXml); - txt.Clear(); - } - isItalic = false; - i += 3; - } - else if (line.Substring(i).StartsWith("", StringComparison.Ordinal)) - { - if (txt.Length > 0) - { - XmlNode fontNode = xml.CreateElement("dcst:Font", "dcst"); - - XmlAttribute fontColor = xml.CreateAttribute("Color"); - fontColor.InnerText = fontColors.Pop(); - fontNode.Attributes.Append(fontColor); - - if (line.Length > i + 9 && line.Substring(i + 7).StartsWith("", StringComparison.Ordinal)) - { - XmlAttribute italic = xml.CreateAttribute("Italic"); - italic.InnerText = "yes"; - fontNode.Attributes.Append(italic); - isItalic = false; - i += 4; - } - - fontNode.InnerText = HtmlUtil.RemoveHtmlTags(txt.ToString()); - html.Append(fontNode.OuterXml); - txt.Clear(); - } - fontNo--; - i += 6; - } - else - { - txt.Append(line[i]); - } - i++; - } - - if (fontNo > 0) - { - if (txt.Length > 0) - { - XmlNode fontNode = xml.CreateElement("dcst:Font", "dcst"); - - XmlAttribute fontColor = xml.CreateAttribute("Color"); - fontColor.InnerText = fontColors.Peek(); - fontNode.Attributes.Append(fontColor); - - if (isItalic) - { - XmlAttribute italic = xml.CreateAttribute("Italic"); - italic.InnerText = "yes"; - fontNode.Attributes.Append(italic); - } - - fontNode.InnerText = HtmlUtil.RemoveHtmlTags(txt.ToString()); - html.Append(fontNode.OuterXml); - } - else if (html.Length > 0 && html.ToString().StartsWith("" + html.ToString().Replace("dcst:Font", "Font") + ""); - XmlNode fontNode = xml.CreateElement("dcst:Font"); - fontNode.InnerXml = temp.DocumentElement.SelectSingleNode("Font").InnerXml; - foreach (XmlAttribute a in temp.DocumentElement.SelectSingleNode("Font").Attributes) - { - XmlAttribute newA = xml.CreateAttribute(a.Name); - newA.InnerText = a.InnerText; - fontNode.Attributes.Append(newA); - } - - XmlAttribute fontColor = xml.CreateAttribute("Color"); - fontColor.InnerText = fontColors.Peek(); - fontNode.Attributes.Append(fontColor); - - html.Clear(); - html.Append(fontNode.OuterXml); - } - } - else if (isItalic) - { - if (txt.Length > 0) - { - XmlNode fontNode = xml.CreateElement("dcst:Font", "dcst"); - - XmlAttribute italic = xml.CreateAttribute("Italic"); - italic.InnerText = "yes"; - fontNode.Attributes.Append(italic); - - fontNode.InnerText = HtmlUtil.RemoveHtmlTags(line); - html.Append(fontNode.OuterXml); - } - } - else - { - if (txt.Length > 0) - { - nodeTemp.InnerText = txt.ToString(); - html.Append(nodeTemp.InnerXml); - } - } - textNode.InnerXml = html.ToString(); - - subNode.AppendChild(textNode); - if (alignVTop) - { - vPos += vPosFactor; - } - else - { - vPos -= vPosFactor; - } - } - if (subNode.InnerXml.Length == 0) - { // Empty text is just one space - XmlNode textNode = xml.CreateElement("dcst:Text", "dcst"); - textNode.InnerXml = " "; - subNode.AppendChild(textNode); - - XmlAttribute vPosition = xml.CreateAttribute("Vposition"); - vPosition.InnerText = vPos.ToString(); - textNode.Attributes.Append(vPosition); - - XmlAttribute vAlign = xml.CreateAttribute("Valign"); - vAlign.InnerText = "bottom"; - textNode.Attributes.Append(vAlign); - } - mainListFont.AppendChild(subNode); - no++; - } - } - string result = ToUtf8XmlString(xml).Replace("encoding=\"utf-8\"", "encoding=\"UTF-8\"").Replace(" xmlns:dcst=\"dcst\"", string.Empty); - - const string res = "Nikse.SubtitleEdit.Resources.SMPTE-428-7-2010-DCST.xsd.gz"; - System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly(); - Stream strm = asm.GetManifestResourceStream(res); - if (strm != null) - { - try - { - var xmld = new XmlDocument(); - var rdr = new StreamReader(strm); - var zip = new GZipStream(rdr.BaseStream, CompressionMode.Decompress); - xmld.LoadXml(result); - using (var xr = XmlReader.Create(zip)) - { - xmld.Schemas.Add(null, xr); - xmld.Validate(ValidationCallBack); - } - } - catch (Exception exception) - { - Errors = "Error validating xml via SMPTE-428-7-2010-DCST.xsd: " + exception.Message; - } - } - return FixDcsTextSameLine(result); - } - - /// - /// All space characters present inside the content of a Text element shall be rendered - /// - internal static string FixDcsTextSameLine(string xml) - { - int index = xml.IndexOf(" 0 && endIndex > 0) - { - endIndex = xml.IndexOf("", index, StringComparison.Ordinal); - if (endIndex > 0) - { - var part = xml.Substring(index, endIndex - index); - if (part.Contains(Environment.NewLine)) - { - part = part.Replace(Environment.NewLine, " "); - while (part.Contains(" ")) - { - part = part.Replace(" ", " "); - } - part = part.Replace("> <", "><"); - } - xml = xml.Remove(index, endIndex - index).Insert(index, part); - index = xml.IndexOf(" lines, string fileName) - { - _errorCount = 0; - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - var xml = new XmlDocument { XmlResolver = null }; - xml.LoadXml(sb.ToString().Replace(" 0 && lastVPosition.Length > 0) - { - pText.AppendLine(); - } - - lastVPosition = vPosition; - } - } - - bool alignLeft = false; - bool alignRight = false; - bool alignVTop = false; - bool alignVCenter = false; - if (innerNode.Attributes["Halign"] != null) - { - string hAlign = innerNode.Attributes["Halign"].InnerText; - if (hAlign == "left") - { - alignLeft = true; - } - else if (hAlign == "right") - { - alignRight = true; - } - } - - if (innerNode.Attributes["Valign"] != null) - { - string hAlign = innerNode.Attributes["Valign"].InnerText; - if (hAlign == "top") - { - alignVTop = true; - } - else if (hAlign == "center") - { - alignVCenter = true; - } - } - - if (alignLeft || alignRight || alignVCenter || alignVTop) - { - if (!pText.ToString().StartsWith("{\\an", StringComparison.Ordinal)) - { - string pre = string.Empty; - if (alignVTop) - { - if (alignLeft) - { - pre = "{\\an7}"; - } - else if (alignRight) - { - pre = "{\\an9}"; - } - else - { - pre = "{\\an8}"; - } - } - else if (alignVCenter) - { - if (alignLeft) - { - pre = "{\\an4}"; - } - else if (alignRight) - { - pre = "{\\an6}"; - } - else - { - pre = "{\\an5}"; - } - } - else - { - if (alignLeft) - { - pre = "{\\an1}"; - } - else if (alignRight) - { - pre = "{\\an3}"; - } - } - - string temp = pre + pText; - pText.Clear(); - pText.Append(temp); - } - } - - if (innerNode.ChildNodes.Count == 0) - { - pText.Append(innerNode.InnerText); - } - else - { - foreach (XmlNode innerInnerNode in innerNode) - { - if (innerInnerNode.Name == "Font" && innerInnerNode.Attributes["Italic"] != null && - innerInnerNode.Attributes["Italic"].InnerText.Equals("yes", StringComparison.OrdinalIgnoreCase)) - { - if (innerInnerNode.Attributes["Color"] != null) - { - pText.Append("" + innerInnerNode.InnerText + ""); - } - else - { - pText.Append("" + innerInnerNode.InnerText + ""); - } - } - else if (innerInnerNode.Name == "Font" && innerInnerNode.Attributes["Color"] != null) - { - if (innerInnerNode.Attributes["Italic"] != null && innerInnerNode.Attributes["Italic"].InnerText.Equals("yes", StringComparison.OrdinalIgnoreCase)) - { - pText.Append("" + innerInnerNode.InnerText + ""); - } - else - { - pText.Append("" + innerInnerNode.InnerText + ""); - } - } - else - { - pText.Append(innerInnerNode.InnerText); - } - } - } - } - else - { - pText.Append(innerNode.InnerText); - } - } - string start = node.Attributes["TimeIn"].InnerText; - string end = node.Attributes["TimeOut"].InnerText; - - if (node.ParentNode.Name == "Font" && node.ParentNode.Attributes["Italic"] != null && node.ParentNode.Attributes["Italic"].InnerText.Equals("yes", StringComparison.OrdinalIgnoreCase) && - !pText.ToString().Contains("")) - { - string text = pText.ToString(); - if (text.StartsWith("{\\an", StringComparison.Ordinal) && text.Length > 6) - { - text = text.Insert(6, "") + ""; - } - else - { - text = "" + text + ""; - } - - pText = new StringBuilder(text); - } - - subtitle.Paragraphs.Add(new Paragraph(GetTimeCode(start), GetTimeCode(end), pText.ToString())); - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine(ex.Message); - _errorCount++; - } - } - - if (subtitle.Paragraphs.Count > 0) - { - subtitle.Header = xml.OuterXml; // save id/language/font for later use - } - - subtitle.Renumber(); - } - - private TimeCode GetTimeCode(string s) - { - var parts = s.Split(new[] { ':', '.', ',' }); - - int milliseconds = (int)Math.Round(int.Parse(parts[3]) * (TimeCode.BaseUnit / _frameRate)); - if (milliseconds > 999) - { - milliseconds = 999; - } - - return new TimeCode(int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2]), milliseconds); - } - - public static int MsToFramesMaxFrameRate(double milliseconds, double frameRate) - { - int frames = (int)Math.Round(milliseconds / (TimeCode.BaseUnit / frameRate)); - if (frames >= Configuration.Settings.General.CurrentFrameRate) - { - frames = (int)(frameRate - 0.01); - } - - return frames; - } - - private string ConvertToTimeString(TimeCode time) - { - return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}:{MsToFramesMaxFrameRate(time.Milliseconds, _frameRate):00}"; - } - - } -} +using System; +using System.Collections.Generic; +using System.IO; +using System.IO.Compression; +using System.Text; +using System.Xml; +using System.Xml.Schema; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class DCinemaSmpte2010 : SubtitleFormat + { + // + // + // urn:uuid:7be835a3-cfb4-43d0-bb4b-f0b4c95e962e + // 2001, A Space Odissey + // This is a subtitle file + // 2012-06-26T12:33:59.000-00:00 + // 1 + // fr + // 25 1 + // 25 + // 00:00:00:00 + // urn:uuid:3dec6dc0-39d0-498d-97d0-928d2eb78391 + // + // + // Hallo + // + // + + public string Errors { get; private set; } + + private double _frameRate = 24; + + public int Version { get; set; } + + public override string Extension => ".xml"; + + public override string Name => "D-Cinema SMPTE 2010"; + + public override bool IsMine(List lines, string fileName) + { + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + string xmlAsString = sb.ToString().Trim(); + + if (xmlAsString.Contains("http://www.smpte-ra.org/schemas/428-7/2007/DCST") || + xmlAsString.Contains("http://www.smpte-ra.org/schemas/428-7/2014/DCST")) + { + return false; + } + + if (xmlAsString.Contains(" 0; + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine(ex.Message); + return false; + } + } + return false; + } + + public override string ToText(Subtitle subtitle, string title) + { + Errors = null; + var ss = Configuration.Settings.SubtitleSettings; + + if (!string.IsNullOrEmpty(ss.CurrentDCinemaEditRate)) + { + string[] temp = ss.CurrentDCinemaEditRate.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + double d1, d2; + if (temp.Length == 2 && double.TryParse(temp[0], out d1) && double.TryParse(temp[1], out d2)) + { + _frameRate = d1 / d2; + } + } + + string xmlStructure = + "" + Environment.NewLine + + " urn:uuid:7be835a3-cfb4-43d0-bb4b-f0b4c95e962e" + Environment.NewLine + + " " + Environment.NewLine + + " This is a subtitle file" + Environment.NewLine + + " 2012-06-26T12:33:59.000-00:00" + Environment.NewLine + + " 1" + Environment.NewLine + + " en" + Environment.NewLine + + " 25 1" + Environment.NewLine + + " 25" + Environment.NewLine + + " 00:00:00:00 " + Environment.NewLine + + " urn:uuid:3dec6dc0-39d0-498d-97d0-928d2eb78391" + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + ""; + + var xml = new XmlDocument(); + xml.LoadXml(xmlStructure); + xml.PreserveWhitespace = true; + var nsmgr = new XmlNamespaceManager(xml.NameTable); + nsmgr.AddNamespace("dcst", xml.DocumentElement.NamespaceURI); + + if (string.IsNullOrEmpty(ss.CurrentDCinemaMovieTitle)) + { + ss.CurrentDCinemaMovieTitle = title; + } + + if (ss.CurrentDCinemaFontSize == 0 || string.IsNullOrEmpty(ss.CurrentDCinemaFontEffect)) + { + Configuration.Settings.SubtitleSettings.InitializeDCinameSettings(true); + } + + xml.DocumentElement.SelectSingleNode("dcst:ContentTitleText", nsmgr).InnerText = ss.CurrentDCinemaMovieTitle; + if (string.IsNullOrEmpty(ss.CurrentDCinemaSubtitleId) || !ss.CurrentDCinemaSubtitleId.StartsWith("urn:uuid:")) + { + ss.CurrentDCinemaSubtitleId = "urn:uuid:" + Guid.NewGuid(); + } + + xml.DocumentElement.SelectSingleNode("dcst:Id", nsmgr).InnerText = ss.CurrentDCinemaSubtitleId; + xml.DocumentElement.SelectSingleNode("dcst:ReelNumber", nsmgr).InnerText = ss.CurrentDCinemaReelNumber; + xml.DocumentElement.SelectSingleNode("dcst:IssueDate", nsmgr).InnerText = ss.CurrentDCinemaIssueDate; + if (string.IsNullOrEmpty(ss.CurrentDCinemaLanguage)) + { + ss.CurrentDCinemaLanguage = "en"; + } + + xml.DocumentElement.SelectSingleNode("dcst:Language", nsmgr).InnerText = ss.CurrentDCinemaLanguage; + if (ss.CurrentDCinemaEditRate == null && ss.CurrentDCinemaTimeCodeRate == null) + { + if (Math.Abs(Configuration.Settings.General.CurrentFrameRate - 24) < 0.01) + { + ss.CurrentDCinemaEditRate = "24 1"; + ss.CurrentDCinemaTimeCodeRate = "24"; + } + else + { + ss.CurrentDCinemaEditRate = "25 1"; + ss.CurrentDCinemaTimeCodeRate = "25"; + } + } + xml.DocumentElement.SelectSingleNode("dcst:EditRate", nsmgr).InnerText = ss.CurrentDCinemaEditRate; + xml.DocumentElement.SelectSingleNode("dcst:TimeCodeRate", nsmgr).InnerText = ss.CurrentDCinemaTimeCodeRate; + if (string.IsNullOrEmpty(ss.CurrentDCinemaStartTime)) + { + ss.CurrentDCinemaStartTime = "00:00:00:00"; + } + + xml.DocumentElement.SelectSingleNode("dcst:StartTime", nsmgr).InnerText = ss.CurrentDCinemaStartTime; + xml.DocumentElement.SelectSingleNode("dcst:LoadFont", nsmgr).InnerText = ss.CurrentDCinemaFontUri; + int fontSize = ss.CurrentDCinemaFontSize; + string loadedFontId = "Font1"; + if (!string.IsNullOrEmpty(ss.CurrentDCinemaFontId)) + { + loadedFontId = ss.CurrentDCinemaFontId; + } + + xml.DocumentElement.SelectSingleNode("dcst:LoadFont", nsmgr).Attributes["ID"].Value = loadedFontId; + xml.DocumentElement.SelectSingleNode("dcst:SubtitleList/dcst:Font", nsmgr).Attributes["Size"].Value = fontSize.ToString(); + xml.DocumentElement.SelectSingleNode("dcst:SubtitleList/dcst:Font", nsmgr).Attributes["Color"].Value = "FF" + Utilities.ColorToHex(ss.CurrentDCinemaFontColor).TrimStart('#').ToUpperInvariant(); + xml.DocumentElement.SelectSingleNode("dcst:SubtitleList/dcst:Font", nsmgr).Attributes["ID"].Value = loadedFontId; + xml.DocumentElement.SelectSingleNode("dcst:SubtitleList/dcst:Font", nsmgr).Attributes["Effect"].Value = ss.CurrentDCinemaFontEffect; + xml.DocumentElement.SelectSingleNode("dcst:SubtitleList/dcst:Font", nsmgr).Attributes["EffectColor"].Value = "FF" + Utilities.ColorToHex(ss.CurrentDCinemaFontEffectColor).TrimStart('#').ToUpperInvariant(); + + XmlNode mainListFont = xml.DocumentElement.SelectSingleNode("dcst:SubtitleList/dcst:Font", nsmgr); + int no = 0; + foreach (Paragraph p in subtitle.Paragraphs) + { + if (p.Text != null) + { + XmlNode subNode = xml.CreateElement("dcst:Subtitle", "dcst"); + + XmlAttribute id = xml.CreateAttribute("SpotNumber"); + id.InnerText = (no + 1).ToString(); + subNode.Attributes.Append(id); + + XmlAttribute fadeUpTime = xml.CreateAttribute("FadeUpTime"); + fadeUpTime.InnerText = new TimeCode(FramesToMilliseconds(Configuration.Settings.SubtitleSettings.DCinemaFadeUpTime)).ToHHMMSSFF(); + subNode.Attributes.Append(fadeUpTime); + + XmlAttribute fadeDownTime = xml.CreateAttribute("FadeDownTime"); + fadeDownTime.InnerText = new TimeCode(FramesToMilliseconds(Configuration.Settings.SubtitleSettings.DCinemaFadeDownTime)).ToHHMMSSFF(); + subNode.Attributes.Append(fadeDownTime); + + XmlAttribute start = xml.CreateAttribute("TimeIn"); + start.InnerText = ConvertToTimeString(p.StartTime); + subNode.Attributes.Append(start); + + XmlAttribute end = xml.CreateAttribute("TimeOut"); + end.InnerText = ConvertToTimeString(p.EndTime); + subNode.Attributes.Append(end); + + bool alignLeft = p.Text.StartsWith("{\\a1}", StringComparison.Ordinal) || p.Text.StartsWith("{\\a5}", StringComparison.Ordinal) || p.Text.StartsWith("{\\a9}", StringComparison.Ordinal) || // sub station alpha + p.Text.StartsWith("{\\an1}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an4}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an7}", StringComparison.Ordinal); // advanced sub station alpha + + bool alignRight = p.Text.StartsWith("{\\a3}", StringComparison.Ordinal) || p.Text.StartsWith("{\\a7}", StringComparison.Ordinal) || p.Text.StartsWith("{\\a11}", StringComparison.Ordinal) || // sub station alpha + p.Text.StartsWith("{\\an3}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an6}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an9}", StringComparison.Ordinal); // advanced sub station alpha + + bool alignVTop = p.Text.StartsWith("{\\a5}", StringComparison.Ordinal) || p.Text.StartsWith("{\\a6}", StringComparison.Ordinal) || p.Text.StartsWith("{\\a7}", StringComparison.Ordinal) || // sub station alpha + p.Text.StartsWith("{\\an7}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an8}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an9}", StringComparison.Ordinal); // advanced sub station alpha + + bool alignVCenter = p.Text.StartsWith("{\\a9}", StringComparison.Ordinal) || p.Text.StartsWith("{\\a10}", StringComparison.Ordinal) || p.Text.StartsWith("{\\a11}", StringComparison.Ordinal) || // sub station alpha + p.Text.StartsWith("{\\an4}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an5}", StringComparison.Ordinal) || p.Text.StartsWith("{\\an6}", StringComparison.Ordinal); // advanced sub station alpha + + string text = Utilities.RemoveSsaTags(p.Text); + + var lines = text.SplitToLines(); + int vPos = 1 + lines.Count * 7; + int vPosFactor = (int)Math.Round(fontSize / 7.4); + if (alignVTop) + { + vPos = Configuration.Settings.SubtitleSettings.DCinemaBottomMargin; // Bottom margin is normally 8 + } + else if (alignVCenter) + { + vPos = (int)Math.Round((lines.Count * vPosFactor * -1) / 2.0); + } + else + { + vPos = (lines.Count * vPosFactor) - vPosFactor + Configuration.Settings.SubtitleSettings.DCinemaBottomMargin; // Bottom margin is normally 8 + } + + bool isItalic = false; + int fontNo = 0; + Stack fontColors = new Stack(); + foreach (string line in lines) + { + XmlNode textNode = xml.CreateElement("dcst:Text", "dcst"); + + XmlAttribute vPosition = xml.CreateAttribute("Vposition"); + vPosition.InnerText = vPos.ToString(); + textNode.Attributes.Append(vPosition); + + XmlAttribute vAlign = xml.CreateAttribute("Valign"); + if (alignVTop) + { + vAlign.InnerText = "top"; + } + else if (alignVCenter) + { + vAlign.InnerText = "center"; + } + else + { + vAlign.InnerText = "bottom"; + } + + textNode.Attributes.Append(vAlign); textNode.Attributes.Append(vAlign); + + XmlAttribute hAlign = xml.CreateAttribute("Halign"); + if (alignLeft) + { + hAlign.InnerText = "left"; + } + else if (alignRight) + { + hAlign.InnerText = "right"; + } + else + { + hAlign.InnerText = "center"; + } + + textNode.Attributes.Append(hAlign); + + XmlAttribute direction = xml.CreateAttribute("Direction"); + direction.InnerText = "ltr"; + textNode.Attributes.Append(direction); + + int i = 0; + var txt = new StringBuilder(); + var html = new StringBuilder(); + XmlNode nodeTemp = xml.CreateElement("temp"); + while (i < line.Length) + { + if (!isItalic && line.Substring(i).StartsWith("", StringComparison.Ordinal)) + { + if (txt.Length > 0) + { + nodeTemp.InnerText = txt.ToString(); + html.Append(nodeTemp.InnerXml); + txt.Clear(); + } + isItalic = true; + i += 2; + } + else if (isItalic && line.Substring(i).StartsWith("", StringComparison.Ordinal)) + { + if (txt.Length > 0) + { + XmlNode fontNode = xml.CreateElement("dcst:Font", "dcst"); + + XmlAttribute italic = xml.CreateAttribute("Italic"); + italic.InnerText = "yes"; + fontNode.Attributes.Append(italic); + + if (line.Length > i + 5 && line.Substring(i + 4).StartsWith("", StringComparison.Ordinal)) + { + XmlAttribute fontColor = xml.CreateAttribute("Color"); + fontColor.InnerText = fontColors.Pop(); + fontNode.Attributes.Append(fontColor); + fontNo--; + i += 7; + } + + fontNode.InnerText = HtmlUtil.RemoveHtmlTags(txt.ToString()); + html.Append(fontNode.OuterXml); + txt.Clear(); + } + isItalic = false; + i += 3; + } + else if (line.Substring(i).StartsWith("", StringComparison.Ordinal)) + { + if (txt.Length > 0) + { + XmlNode fontNode = xml.CreateElement("dcst:Font", "dcst"); + + XmlAttribute fontColor = xml.CreateAttribute("Color"); + fontColor.InnerText = fontColors.Pop(); + fontNode.Attributes.Append(fontColor); + + if (line.Length > i + 9 && line.Substring(i + 7).StartsWith("", StringComparison.Ordinal)) + { + XmlAttribute italic = xml.CreateAttribute("Italic"); + italic.InnerText = "yes"; + fontNode.Attributes.Append(italic); + isItalic = false; + i += 4; + } + + fontNode.InnerText = HtmlUtil.RemoveHtmlTags(txt.ToString()); + html.Append(fontNode.OuterXml); + txt.Clear(); + } + fontNo--; + i += 6; + } + else + { + txt.Append(line[i]); + } + i++; + } + + if (fontNo > 0) + { + if (txt.Length > 0) + { + XmlNode fontNode = xml.CreateElement("dcst:Font", "dcst"); + + XmlAttribute fontColor = xml.CreateAttribute("Color"); + fontColor.InnerText = fontColors.Peek(); + fontNode.Attributes.Append(fontColor); + + if (isItalic) + { + XmlAttribute italic = xml.CreateAttribute("Italic"); + italic.InnerText = "yes"; + fontNode.Attributes.Append(italic); + } + + fontNode.InnerText = HtmlUtil.RemoveHtmlTags(txt.ToString()); + html.Append(fontNode.OuterXml); + } + else if (html.Length > 0 && html.ToString().StartsWith("" + html.ToString().Replace("dcst:Font", "Font") + ""); + XmlNode fontNode = xml.CreateElement("dcst:Font"); + fontNode.InnerXml = temp.DocumentElement.SelectSingleNode("Font").InnerXml; + foreach (XmlAttribute a in temp.DocumentElement.SelectSingleNode("Font").Attributes) + { + XmlAttribute newA = xml.CreateAttribute(a.Name); + newA.InnerText = a.InnerText; + fontNode.Attributes.Append(newA); + } + + XmlAttribute fontColor = xml.CreateAttribute("Color"); + fontColor.InnerText = fontColors.Peek(); + fontNode.Attributes.Append(fontColor); + + html.Clear(); + html.Append(fontNode.OuterXml); + } + } + else if (isItalic) + { + if (txt.Length > 0) + { + XmlNode fontNode = xml.CreateElement("dcst:Font", "dcst"); + + XmlAttribute italic = xml.CreateAttribute("Italic"); + italic.InnerText = "yes"; + fontNode.Attributes.Append(italic); + + fontNode.InnerText = HtmlUtil.RemoveHtmlTags(line); + html.Append(fontNode.OuterXml); + } + } + else + { + if (txt.Length > 0) + { + nodeTemp.InnerText = txt.ToString(); + html.Append(nodeTemp.InnerXml); + } + } + textNode.InnerXml = html.ToString(); + + subNode.AppendChild(textNode); + if (alignVTop) + { + vPos += vPosFactor; + } + else + { + vPos -= vPosFactor; + } + } + if (subNode.InnerXml.Length == 0) + { // Empty text is just one space + XmlNode textNode = xml.CreateElement("dcst:Text", "dcst"); + textNode.InnerXml = " "; + subNode.AppendChild(textNode); + + XmlAttribute vPosition = xml.CreateAttribute("Vposition"); + vPosition.InnerText = vPos.ToString(); + textNode.Attributes.Append(vPosition); + + XmlAttribute vAlign = xml.CreateAttribute("Valign"); + vAlign.InnerText = "bottom"; + textNode.Attributes.Append(vAlign); + } + mainListFont.AppendChild(subNode); + no++; + } + } + string result = ToUtf8XmlString(xml).Replace("encoding=\"utf-8\"", "encoding=\"UTF-8\"").Replace(" xmlns:dcst=\"dcst\"", string.Empty); + + const string res = "Nikse.SubtitleEdit.Resources.SMPTE-428-7-2010-DCST.xsd.gz"; + System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly(); + Stream strm = asm.GetManifestResourceStream(res); + if (strm != null) + { + try + { + var xmld = new XmlDocument(); + var rdr = new StreamReader(strm); + var zip = new GZipStream(rdr.BaseStream, CompressionMode.Decompress); + xmld.LoadXml(result); + using (var xr = XmlReader.Create(zip)) + { + xmld.Schemas.Add(null, xr); + xmld.Validate(ValidationCallBack); + } + } + catch (Exception exception) + { + Errors = "Error validating xml via SMPTE-428-7-2010-DCST.xsd: " + exception.Message; + } + } + return FixDcsTextSameLine(result); + } + + /// + /// All space characters present inside the content of a Text element shall be rendered + /// + internal static string FixDcsTextSameLine(string xml) + { + int index = xml.IndexOf(" 0 && endIndex > 0) + { + endIndex = xml.IndexOf("", index, StringComparison.Ordinal); + if (endIndex > 0) + { + var part = xml.Substring(index, endIndex - index); + if (part.Contains(Environment.NewLine)) + { + part = part.Replace(Environment.NewLine, " "); + while (part.Contains(" ")) + { + part = part.Replace(" ", " "); + } + part = part.Replace("> <", "><"); + } + xml = xml.Remove(index, endIndex - index).Insert(index, part); + index = xml.IndexOf(" lines, string fileName) + { + _errorCount = 0; + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + var xml = new XmlDocument { XmlResolver = null }; + xml.LoadXml(sb.ToString().Replace(" 0 && lastVPosition.Length > 0) + { + pText.AppendLine(); + } + + lastVPosition = vPosition; + } + } + + bool alignLeft = false; + bool alignRight = false; + bool alignVTop = false; + bool alignVCenter = false; + if (innerNode.Attributes["Halign"] != null) + { + string hAlign = innerNode.Attributes["Halign"].InnerText; + if (hAlign == "left") + { + alignLeft = true; + } + else if (hAlign == "right") + { + alignRight = true; + } + } + + if (innerNode.Attributes["Valign"] != null) + { + string hAlign = innerNode.Attributes["Valign"].InnerText; + if (hAlign == "top") + { + alignVTop = true; + } + else if (hAlign == "center") + { + alignVCenter = true; + } + } + + if (alignLeft || alignRight || alignVCenter || alignVTop) + { + if (!pText.ToString().StartsWith("{\\an", StringComparison.Ordinal)) + { + string pre = string.Empty; + if (alignVTop) + { + if (alignLeft) + { + pre = "{\\an7}"; + } + else if (alignRight) + { + pre = "{\\an9}"; + } + else + { + pre = "{\\an8}"; + } + } + else if (alignVCenter) + { + if (alignLeft) + { + pre = "{\\an4}"; + } + else if (alignRight) + { + pre = "{\\an6}"; + } + else + { + pre = "{\\an5}"; + } + } + else + { + if (alignLeft) + { + pre = "{\\an1}"; + } + else if (alignRight) + { + pre = "{\\an3}"; + } + } + + string temp = pre + pText; + pText.Clear(); + pText.Append(temp); + } + } + + if (innerNode.ChildNodes.Count == 0) + { + pText.Append(innerNode.InnerText); + } + else + { + foreach (XmlNode innerInnerNode in innerNode) + { + if (innerInnerNode.Name == "Font" && innerInnerNode.Attributes["Italic"] != null && + innerInnerNode.Attributes["Italic"].InnerText.Equals("yes", StringComparison.OrdinalIgnoreCase)) + { + if (innerInnerNode.Attributes["Color"] != null) + { + pText.Append("" + innerInnerNode.InnerText + ""); + } + else + { + pText.Append("" + innerInnerNode.InnerText + ""); + } + } + else if (innerInnerNode.Name == "Font" && innerInnerNode.Attributes["Color"] != null) + { + if (innerInnerNode.Attributes["Italic"] != null && innerInnerNode.Attributes["Italic"].InnerText.Equals("yes", StringComparison.OrdinalIgnoreCase)) + { + pText.Append("" + innerInnerNode.InnerText + ""); + } + else + { + pText.Append("" + innerInnerNode.InnerText + ""); + } + } + else + { + pText.Append(innerInnerNode.InnerText); + } + } + } + } + else + { + pText.Append(innerNode.InnerText); + } + } + string start = node.Attributes["TimeIn"].InnerText; + string end = node.Attributes["TimeOut"].InnerText; + + if (node.ParentNode.Name == "Font" && node.ParentNode.Attributes["Italic"] != null && node.ParentNode.Attributes["Italic"].InnerText.Equals("yes", StringComparison.OrdinalIgnoreCase) && + !pText.ToString().Contains("")) + { + string text = pText.ToString(); + if (text.StartsWith("{\\an", StringComparison.Ordinal) && text.Length > 6) + { + text = text.Insert(6, "") + ""; + } + else + { + text = "" + text + ""; + } + + pText = new StringBuilder(text); + } + + subtitle.Paragraphs.Add(new Paragraph(GetTimeCode(start), GetTimeCode(end), pText.ToString())); + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine(ex.Message); + _errorCount++; + } + } + + if (subtitle.Paragraphs.Count > 0) + { + subtitle.Header = xml.OuterXml; // save id/language/font for later use + } + + subtitle.Renumber(); + } + + private TimeCode GetTimeCode(string s) + { + var parts = s.Split(new[] { ':', '.', ',' }); + + int milliseconds = (int)Math.Round(int.Parse(parts[3]) * (TimeCode.BaseUnit / _frameRate)); + if (milliseconds > 999) + { + milliseconds = 999; + } + + return new TimeCode(int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2]), milliseconds); + } + + public static int MsToFramesMaxFrameRate(double milliseconds, double frameRate) + { + int frames = (int)Math.Round(milliseconds / (TimeCode.BaseUnit / frameRate)); + if (frames >= Configuration.Settings.General.CurrentFrameRate) + { + frames = (int)(frameRate - 0.01); + } + + return frames; + } + + private string ConvertToTimeString(TimeCode time) + { + return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}:{MsToFramesMaxFrameRate(time.Milliseconds, _frameRate):00}"; + } + + } +} diff --git a/libse/SubtitleFormats/DCinemaSmpte2014.cs b/src/libse/SubtitleFormats/DCinemaSmpte2014.cs similarity index 100% rename from libse/SubtitleFormats/DCinemaSmpte2014.cs rename to src/libse/SubtitleFormats/DCinemaSmpte2014.cs diff --git a/libse/SubtitleFormats/DigiBeta.cs b/src/libse/SubtitleFormats/DigiBeta.cs similarity index 97% rename from libse/SubtitleFormats/DigiBeta.cs rename to src/libse/SubtitleFormats/DigiBeta.cs index a422891f6..81202a2be 100644 --- a/libse/SubtitleFormats/DigiBeta.cs +++ b/src/libse/SubtitleFormats/DigiBeta.cs @@ -1,72 +1,72 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class DigiBeta : SubtitleFormat - { - private static readonly Regex RegexTimeCode = new Regex(@"^\d\d \d\d \d\d \d\d\t\d\d \d\d \d\d \d\d\t", RegexOptions.Compiled); - - public override string Extension => ".txt"; - - public override string Name => "DigiBeta"; - - public override string ToText(Subtitle subtitle, string title) - { - //10 01 37 23 10 01 42 01 Makkhi (newline is TAB) - const string paragraphWriteFormat = "{0}\t{1}\t{2}"; - - var sb = new StringBuilder(); - foreach (Paragraph p in subtitle.Paragraphs) - { - sb.AppendLine(string.Format(paragraphWriteFormat, EncodeTimeCode(p.StartTime), EncodeTimeCode(p.EndTime), p.Text.Replace(Environment.NewLine, "\t"))); - } - return sb.ToString().Trim(); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - - subtitle.Paragraphs.Clear(); - foreach (string line in lines) - { - if (RegexTimeCode.IsMatch(line) && line.Length > 24) - { - string[] parts = line.Substring(0, 11).Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); - if (parts.Length == 4) - { - try - { - var start = DecodeTimeCodeFramesFourParts(parts); - parts = line.Substring(12, 11).Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); - var end = DecodeTimeCodeFramesFourParts(parts); - var paragraph = new Paragraph - { - StartTime = start, - EndTime = end, - Text = line.Substring(24).Trim().Replace("\t", Environment.NewLine) - }; - - subtitle.Paragraphs.Add(paragraph); - } - catch - { - _errorCount++; - } - } - } - } - subtitle.Renumber(); - } - - private static string EncodeTimeCode(TimeCode time) - { - return $"{time.Hours:00} {time.Minutes:00} {time.Seconds:00} {MillisecondsToFramesMaxFrameRate(time.Milliseconds):00}"; - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class DigiBeta : SubtitleFormat + { + private static readonly Regex RegexTimeCode = new Regex(@"^\d\d \d\d \d\d \d\d\t\d\d \d\d \d\d \d\d\t", RegexOptions.Compiled); + + public override string Extension => ".txt"; + + public override string Name => "DigiBeta"; + + public override string ToText(Subtitle subtitle, string title) + { + //10 01 37 23 10 01 42 01 Makkhi (newline is TAB) + const string paragraphWriteFormat = "{0}\t{1}\t{2}"; + + var sb = new StringBuilder(); + foreach (Paragraph p in subtitle.Paragraphs) + { + sb.AppendLine(string.Format(paragraphWriteFormat, EncodeTimeCode(p.StartTime), EncodeTimeCode(p.EndTime), p.Text.Replace(Environment.NewLine, "\t"))); + } + return sb.ToString().Trim(); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + + subtitle.Paragraphs.Clear(); + foreach (string line in lines) + { + if (RegexTimeCode.IsMatch(line) && line.Length > 24) + { + string[] parts = line.Substring(0, 11).Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + if (parts.Length == 4) + { + try + { + var start = DecodeTimeCodeFramesFourParts(parts); + parts = line.Substring(12, 11).Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + var end = DecodeTimeCodeFramesFourParts(parts); + var paragraph = new Paragraph + { + StartTime = start, + EndTime = end, + Text = line.Substring(24).Trim().Replace("\t", Environment.NewLine) + }; + + subtitle.Paragraphs.Add(paragraph); + } + catch + { + _errorCount++; + } + } + } + } + subtitle.Renumber(); + } + + private static string EncodeTimeCode(TimeCode time) + { + return $"{time.Hours:00} {time.Minutes:00} {time.Seconds:00} {MillisecondsToFramesMaxFrameRate(time.Milliseconds):00}"; + } + + } +} diff --git a/libse/SubtitleFormats/DlDd.cs b/src/libse/SubtitleFormats/DlDd.cs similarity index 100% rename from libse/SubtitleFormats/DlDd.cs rename to src/libse/SubtitleFormats/DlDd.cs diff --git a/libse/SubtitleFormats/Dost.cs b/src/libse/SubtitleFormats/Dost.cs similarity index 97% rename from libse/SubtitleFormats/Dost.cs rename to src/libse/SubtitleFormats/Dost.cs index 9c3db4bbb..1028918d9 100644 --- a/libse/SubtitleFormats/Dost.cs +++ b/src/libse/SubtitleFormats/Dost.cs @@ -1,104 +1,104 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class Dost : SubtitleFormat - { - private static readonly Regex RegexTimeCodes = new Regex(@"^\d\d\d\d\t\d\d:\d\d:\d\d:\d\d\t\d\d:\d\d:\d\d:\d\d\t", RegexOptions.Compiled); - - public override string Extension => ".dost"; - - public override string Name => "DOST"; - - public override bool IsMine(List lines, string fileName) - { - var sb = new StringBuilder(); - foreach (string line in lines) - { - sb.AppendLine(line); - } - - if (!sb.ToString().Contains(Environment.NewLine + "NO\tINTIME")) - { - return false; - } - - if (!sb.ToString().Contains("$FORMAT")) - { - return false; - } - - return base.IsMine(lines, fileName); - } - - public override string ToText(Subtitle subtitle, string title) - { - return "Not implemented"; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - //0001 01:25:59:21 01:26:00:20 0 0 BK02-total_0001.png 0 0 - Paragraph p = null; - subtitle.Paragraphs.Clear(); - _errorCount = 0; - foreach (string line in lines) - { - string s = line; - if (RegexTimeCodes.IsMatch(s)) - { - var temp = s.Split('\t'); - if (temp.Length > 7) - { - string start = temp[1]; - string end = temp[2]; - string text = temp[5]; - try - { - p = new Paragraph(DecodeTimeCodeFramesFourParts(start.Split(':')), DecodeTimeCodeFramesFourParts(end.Split(':')), text); - subtitle.Paragraphs.Add(p); - } - catch (Exception exception) - { - _errorCount++; - System.Diagnostics.Debug.WriteLine(exception.Message); - } - } - } - else if (line.StartsWith("$DROP=", StringComparison.Ordinal)) - { - s = s.Remove(0, "$DROP=".Length); - int frameRate; - if (int.TryParse(s, out frameRate)) - { - double f = frameRate / TimeCode.BaseUnit; - if (f > 10 && f < 500) - { - Configuration.Settings.General.CurrentFrameRate = f; - } - - if (BatchSourceFrameRate.HasValue) - { - Configuration.Settings.General.CurrentFrameRate = BatchSourceFrameRate.Value; - } - } - } - else if (string.IsNullOrWhiteSpace(line) || line.StartsWith('$')) - { - // skip empty lines or lines starting with $ - } - else if (!string.IsNullOrWhiteSpace(line) && p != null) - { - _errorCount++; - } - } - - subtitle.Renumber(); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class Dost : SubtitleFormat + { + private static readonly Regex RegexTimeCodes = new Regex(@"^\d\d\d\d\t\d\d:\d\d:\d\d:\d\d\t\d\d:\d\d:\d\d:\d\d\t", RegexOptions.Compiled); + + public override string Extension => ".dost"; + + public override string Name => "DOST"; + + public override bool IsMine(List lines, string fileName) + { + var sb = new StringBuilder(); + foreach (string line in lines) + { + sb.AppendLine(line); + } + + if (!sb.ToString().Contains(Environment.NewLine + "NO\tINTIME")) + { + return false; + } + + if (!sb.ToString().Contains("$FORMAT")) + { + return false; + } + + return base.IsMine(lines, fileName); + } + + public override string ToText(Subtitle subtitle, string title) + { + return "Not implemented"; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + //0001 01:25:59:21 01:26:00:20 0 0 BK02-total_0001.png 0 0 + Paragraph p = null; + subtitle.Paragraphs.Clear(); + _errorCount = 0; + foreach (string line in lines) + { + string s = line; + if (RegexTimeCodes.IsMatch(s)) + { + var temp = s.Split('\t'); + if (temp.Length > 7) + { + string start = temp[1]; + string end = temp[2]; + string text = temp[5]; + try + { + p = new Paragraph(DecodeTimeCodeFramesFourParts(start.Split(':')), DecodeTimeCodeFramesFourParts(end.Split(':')), text); + subtitle.Paragraphs.Add(p); + } + catch (Exception exception) + { + _errorCount++; + System.Diagnostics.Debug.WriteLine(exception.Message); + } + } + } + else if (line.StartsWith("$DROP=", StringComparison.Ordinal)) + { + s = s.Remove(0, "$DROP=".Length); + int frameRate; + if (int.TryParse(s, out frameRate)) + { + double f = frameRate / TimeCode.BaseUnit; + if (f > 10 && f < 500) + { + Configuration.Settings.General.CurrentFrameRate = f; + } + + if (BatchSourceFrameRate.HasValue) + { + Configuration.Settings.General.CurrentFrameRate = BatchSourceFrameRate.Value; + } + } + } + else if (string.IsNullOrWhiteSpace(line) || line.StartsWith('$')) + { + // skip empty lines or lines starting with $ + } + else if (!string.IsNullOrWhiteSpace(line) && p != null) + { + _errorCount++; + } + } + + subtitle.Renumber(); + } + + } +} diff --git a/libse/SubtitleFormats/DvSubtitle.cs b/src/libse/SubtitleFormats/DvSubtitle.cs similarity index 100% rename from libse/SubtitleFormats/DvSubtitle.cs rename to src/libse/SubtitleFormats/DvSubtitle.cs diff --git a/libse/SubtitleFormats/DvdStudioPro.cs b/src/libse/SubtitleFormats/DvdStudioPro.cs similarity index 97% rename from libse/SubtitleFormats/DvdStudioPro.cs rename to src/libse/SubtitleFormats/DvdStudioPro.cs index 3031aa419..943725f1b 100644 --- a/libse/SubtitleFormats/DvdStudioPro.cs +++ b/src/libse/SubtitleFormats/DvdStudioPro.cs @@ -1,327 +1,327 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class DvdStudioPro : SubtitleFormat - { - private static readonly Regex RegexTimeCodes = new Regex(@"^\d+:\d+:\d+[:;]\d+\t,\t\d+:\d+:\d+[:;]\d+\t,\t.*$", RegexOptions.Compiled); - - public override string Extension => ".STL"; - - public override string Name => "DVD Studio Pro"; - - public override string ToText(Subtitle subtitle, string title) - { - const string paragraphWriteFormat = "{0}\t,\t{1}\t,\t{2}\r\n"; - const string timeFormat = "{0:00}:{1:00}:{2:00}:{3:00}"; - var header = Configuration.Settings.SubtitleSettings.DvdStudioProHeader.TrimEnd() + Environment.NewLine; - - var lastVerticalAlign = "$VertAlign = Bottom"; - var lastHorizontalcalAlign = "$HorzAlign = Center"; - var sb = new StringBuilder(); - sb.AppendLine(header); - foreach (Paragraph p in subtitle.Paragraphs) - { - string startTime = string.Format(timeFormat, p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, MillisecondsToFramesMaxFrameRate(p.StartTime.Milliseconds)); - string endTime = string.Format(timeFormat, p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, MillisecondsToFramesMaxFrameRate(p.EndTime.Milliseconds)); - sb = ToTextAlignment(p, sb, ref lastVerticalAlign, ref lastHorizontalcalAlign); - sb.AppendFormat(paragraphWriteFormat, startTime, endTime, EncodeStyles(p.Text)); - } - return sb.ToString().Trim(); - } - - internal static StringBuilder ToTextAlignment(Paragraph p, StringBuilder sb, ref string lastVerticalAlign, ref string lastHorizontalAlign) - { - string verticalAlign; - string horizontalAlign; - bool verticalTopAlign = p.Text.StartsWith("{\\an7}", StringComparison.Ordinal) || - p.Text.StartsWith("{\\an8}", StringComparison.Ordinal) || - p.Text.StartsWith("{\\an9}", StringComparison.Ordinal); - bool verticalCenterAlign = p.Text.StartsWith("{\\an4}", StringComparison.Ordinal) || - p.Text.StartsWith("{\\an5}", StringComparison.Ordinal) || - p.Text.StartsWith("{\\an6}", StringComparison.Ordinal); - if (verticalTopAlign) - { - verticalAlign = "$VertAlign = Top"; - } - else if (verticalCenterAlign) - { - verticalAlign = "$VertAlign = Center"; - } - else - { - verticalAlign = "$VertAlign = Bottom"; - } - - if (lastVerticalAlign != verticalAlign) - { - sb.AppendLine(verticalAlign); - } - - bool horizontalLeftAlign = p.Text.StartsWith("{\\an1}", StringComparison.Ordinal) || - p.Text.StartsWith("{\\an4}", StringComparison.Ordinal) || - p.Text.StartsWith("{\\an7}", StringComparison.Ordinal); - bool horizontalRightAlign = p.Text.StartsWith("{\\an3}", StringComparison.Ordinal) || - p.Text.StartsWith("{\\an6}", StringComparison.Ordinal) || - p.Text.StartsWith("{\\an9}", StringComparison.Ordinal); - if (horizontalLeftAlign) - { - horizontalAlign = "$HorzAlign = Left"; - } - else if (horizontalRightAlign) - { - horizontalAlign = "$HorzAlign = Right"; - } - else - { - horizontalAlign = "$HorzAlign = Center"; - } - - if (lastHorizontalAlign != horizontalAlign) - { - sb.AppendLine(horizontalAlign); - } - - lastVerticalAlign = verticalAlign; - lastHorizontalAlign = horizontalAlign; - return sb; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - int number = 0; - var verticalAlign = "$VertAlign=Bottom"; - var horizontalAlign = "$HorzAlign=Center"; - bool italicOn = false; - bool boldOn = false; - bool underlineOn = false; - - foreach (string line in lines) - { - if (!string.IsNullOrWhiteSpace(line) && line[0] != '$') - { - if (RegexTimeCodes.Match(line).Success) - { - string[] threePart = line.Split(new[] { "\t,\t" }, StringSplitOptions.None); - var p = new Paragraph(); - if (threePart.Length == 3 && - GetTimeCode(p.StartTime, threePart[0]) && - GetTimeCode(p.EndTime, threePart[1])) - { - number++; - p.Number = number; - p.Text = threePart[2].TrimEnd().Replace(" | ", Environment.NewLine).Replace("|", Environment.NewLine); - p.Text = DecodeStyles(p.Text); - if (italicOn && !p.Text.Contains("")) - { - p.Text = "" + p.Text + ""; - } - if (boldOn && !p.Text.Contains("")) - { - p.Text = "" + p.Text + ""; - } - if (underlineOn && !p.Text.Contains("")) - { - p.Text = "" + p.Text + ""; - } - p.Text = GetAlignment(verticalAlign, horizontalAlign) + p.Text; - subtitle.Paragraphs.Add(p); - } - } - else - { - _errorCount++; - } - } - else if (line != null && line.TrimStart().StartsWith("$VertAlign", StringComparison.OrdinalIgnoreCase)) - { - verticalAlign = line.RemoveChar(' ').RemoveChar('\t'); - } - else if (line != null && line.TrimStart().StartsWith("$HorzAlign", StringComparison.OrdinalIgnoreCase)) - { - horizontalAlign = line.RemoveChar(' ').RemoveChar('\t'); - } - else if (line.Replace(" ", string.Empty).Equals("$Italic=True", StringComparison.OrdinalIgnoreCase)) - { - italicOn = true; - } - else if (line.Replace(" ", string.Empty).Trim().Equals("$Italic=False", StringComparison.OrdinalIgnoreCase)) - { - italicOn = false; - } - else if (line.Replace(" ", string.Empty).Equals("$Bold=True", StringComparison.OrdinalIgnoreCase)) - { - boldOn = true; - } - else if (line.Replace(" ", string.Empty).Trim().Equals("$Bold=False", StringComparison.OrdinalIgnoreCase)) - { - boldOn = false; - } - else if (line.Replace(" ", string.Empty).Equals("$Underlined=True", StringComparison.OrdinalIgnoreCase)) - { - underlineOn = true; - } - else if (line.Replace(" ", string.Empty).Trim().Equals("$Underlined=False", StringComparison.OrdinalIgnoreCase)) - { - underlineOn = false; - } - } - } - - internal static string GetAlignment(string verticalAlign, string horizontalAlign) - { - if (verticalAlign.Equals("$VertAlign=Top", StringComparison.OrdinalIgnoreCase)) - { - if (horizontalAlign.Equals("$HorzAlign=Left", StringComparison.OrdinalIgnoreCase)) - { - return "{\\an7}"; - } - - if (horizontalAlign.Equals("$HorzAlign=Right", StringComparison.OrdinalIgnoreCase)) - { - return "{\\an9}"; - } - - return "{\\an8}"; - } - - if (verticalAlign.Equals("$VertAlign=Center", StringComparison.OrdinalIgnoreCase)) - { - if (horizontalAlign.Equals("$HorzAlign=Left", StringComparison.OrdinalIgnoreCase)) - { - return "{\\an4}"; - } - - if (horizontalAlign.Equals("$HorzAlign=Right", StringComparison.OrdinalIgnoreCase)) - { - return "{\\an6}"; - } - - return "{\\an5}"; - } - - if (horizontalAlign.Equals("$HorzAlign=Left", StringComparison.OrdinalIgnoreCase)) - { - return "{\\an1}"; - } - - if (horizontalAlign.Equals("$HorzAlign=Right", StringComparison.OrdinalIgnoreCase)) - { - return "{\\an3}"; - } - - return string.Empty; - } - - internal static string DecodeStyles(string text) - { - var sb = new StringBuilder(); - bool italicOn = false; - bool boldOn = false; - bool skipNext = false; - for (int i = 0; i < text.Length; i++) - { - if (skipNext) - { - skipNext = false; - } - else - { - if (text.Substring(i).StartsWith("^I", StringComparison.Ordinal)) - { - sb.Append(!italicOn ? "" : ""); - italicOn = !italicOn; - skipNext = true; - } - else if (text.Substring(i).StartsWith("^B", StringComparison.Ordinal)) - { - sb.Append(!boldOn ? "" : ""); - boldOn = !boldOn; - skipNext = true; - } - else - { - sb.Append(text[i]); - } - } - } - return sb.ToString(); - } - - internal static string EncodeStyles(string input) - { - var text = Utilities.RemoveSsaTags(input); - text = text.Replace("", "").Replace("", ""); - bool allItalic = text.StartsWith("", StringComparison.Ordinal) && text.EndsWith("", StringComparison.Ordinal) && Utilities.CountTagInText(text, "") == 1; - bool allBold = text.StartsWith("", StringComparison.Ordinal) && text.EndsWith("", StringComparison.Ordinal) && Utilities.CountTagInText(text, "") == 1; - bool allUnderline = text.StartsWith("", StringComparison.Ordinal) && text.EndsWith("", StringComparison.Ordinal) && Utilities.CountTagInText(text, "") == 1; - bool allUnderlineBoldItalic = text.StartsWith("", StringComparison.Ordinal) && text.EndsWith("", StringComparison.Ordinal) && Utilities.CountTagInText(text, "") == 1; - bool allBoldItalic = text.StartsWith("", StringComparison.Ordinal) && text.EndsWith("", StringComparison.Ordinal) && Utilities.CountTagInText(text, "") == 1 && Utilities.CountTagInText(text, "") == 1; - - text = text.Replace("", "^I"); - text = text.Replace("", "^I"); - text = text.Replace("", "^I"); - text = text.Replace("", "^I"); - - text = text.Replace("", "^B"); - text = text.Replace("", "^B"); - text = text.Replace("", "^B"); - text = text.Replace("", "^B"); - - text = text.Replace("", "^U"); - text = text.Replace("", "^U"); - text = text.Replace("", "^U"); - text = text.Replace("", "^U"); - - if (allUnderlineBoldItalic) - { - return text.Replace(Environment.NewLine, "^U^B^I|^I^B^U"); - } - - if (allBoldItalic) - { - return text.Replace(Environment.NewLine, "^U^B^I|^I^B^U"); - } - - if (allItalic) - { - return text.Replace(Environment.NewLine, "^I|^I"); - } - - if (allBold) - { - return text.Replace(Environment.NewLine, "^B|^B"); - } - - if (allUnderline) - { - return text.Replace(Environment.NewLine, "^U|^U"); - } - - return text.Replace(Environment.NewLine, "|"); - } - - internal static bool GetTimeCode(TimeCode timeCode, string timeString) - { - try - { - var timeParts = timeString.Split(':', ';'); - timeCode.Hours = int.Parse(timeParts[0]); - timeCode.Minutes = int.Parse(timeParts[1]); - timeCode.Seconds = int.Parse(timeParts[2]); - timeCode.Milliseconds = FramesToMillisecondsMax999(int.Parse(timeParts[3])); - return true; - } - catch - { - return false; - } - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class DvdStudioPro : SubtitleFormat + { + private static readonly Regex RegexTimeCodes = new Regex(@"^\d+:\d+:\d+[:;]\d+\t,\t\d+:\d+:\d+[:;]\d+\t,\t.*$", RegexOptions.Compiled); + + public override string Extension => ".STL"; + + public override string Name => "DVD Studio Pro"; + + public override string ToText(Subtitle subtitle, string title) + { + const string paragraphWriteFormat = "{0}\t,\t{1}\t,\t{2}\r\n"; + const string timeFormat = "{0:00}:{1:00}:{2:00}:{3:00}"; + var header = Configuration.Settings.SubtitleSettings.DvdStudioProHeader.TrimEnd() + Environment.NewLine; + + var lastVerticalAlign = "$VertAlign = Bottom"; + var lastHorizontalcalAlign = "$HorzAlign = Center"; + var sb = new StringBuilder(); + sb.AppendLine(header); + foreach (Paragraph p in subtitle.Paragraphs) + { + string startTime = string.Format(timeFormat, p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, MillisecondsToFramesMaxFrameRate(p.StartTime.Milliseconds)); + string endTime = string.Format(timeFormat, p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, MillisecondsToFramesMaxFrameRate(p.EndTime.Milliseconds)); + sb = ToTextAlignment(p, sb, ref lastVerticalAlign, ref lastHorizontalcalAlign); + sb.AppendFormat(paragraphWriteFormat, startTime, endTime, EncodeStyles(p.Text)); + } + return sb.ToString().Trim(); + } + + internal static StringBuilder ToTextAlignment(Paragraph p, StringBuilder sb, ref string lastVerticalAlign, ref string lastHorizontalAlign) + { + string verticalAlign; + string horizontalAlign; + bool verticalTopAlign = p.Text.StartsWith("{\\an7}", StringComparison.Ordinal) || + p.Text.StartsWith("{\\an8}", StringComparison.Ordinal) || + p.Text.StartsWith("{\\an9}", StringComparison.Ordinal); + bool verticalCenterAlign = p.Text.StartsWith("{\\an4}", StringComparison.Ordinal) || + p.Text.StartsWith("{\\an5}", StringComparison.Ordinal) || + p.Text.StartsWith("{\\an6}", StringComparison.Ordinal); + if (verticalTopAlign) + { + verticalAlign = "$VertAlign = Top"; + } + else if (verticalCenterAlign) + { + verticalAlign = "$VertAlign = Center"; + } + else + { + verticalAlign = "$VertAlign = Bottom"; + } + + if (lastVerticalAlign != verticalAlign) + { + sb.AppendLine(verticalAlign); + } + + bool horizontalLeftAlign = p.Text.StartsWith("{\\an1}", StringComparison.Ordinal) || + p.Text.StartsWith("{\\an4}", StringComparison.Ordinal) || + p.Text.StartsWith("{\\an7}", StringComparison.Ordinal); + bool horizontalRightAlign = p.Text.StartsWith("{\\an3}", StringComparison.Ordinal) || + p.Text.StartsWith("{\\an6}", StringComparison.Ordinal) || + p.Text.StartsWith("{\\an9}", StringComparison.Ordinal); + if (horizontalLeftAlign) + { + horizontalAlign = "$HorzAlign = Left"; + } + else if (horizontalRightAlign) + { + horizontalAlign = "$HorzAlign = Right"; + } + else + { + horizontalAlign = "$HorzAlign = Center"; + } + + if (lastHorizontalAlign != horizontalAlign) + { + sb.AppendLine(horizontalAlign); + } + + lastVerticalAlign = verticalAlign; + lastHorizontalAlign = horizontalAlign; + return sb; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + int number = 0; + var verticalAlign = "$VertAlign=Bottom"; + var horizontalAlign = "$HorzAlign=Center"; + bool italicOn = false; + bool boldOn = false; + bool underlineOn = false; + + foreach (string line in lines) + { + if (!string.IsNullOrWhiteSpace(line) && line[0] != '$') + { + if (RegexTimeCodes.Match(line).Success) + { + string[] threePart = line.Split(new[] { "\t,\t" }, StringSplitOptions.None); + var p = new Paragraph(); + if (threePart.Length == 3 && + GetTimeCode(p.StartTime, threePart[0]) && + GetTimeCode(p.EndTime, threePart[1])) + { + number++; + p.Number = number; + p.Text = threePart[2].TrimEnd().Replace(" | ", Environment.NewLine).Replace("|", Environment.NewLine); + p.Text = DecodeStyles(p.Text); + if (italicOn && !p.Text.Contains("")) + { + p.Text = "" + p.Text + ""; + } + if (boldOn && !p.Text.Contains("")) + { + p.Text = "" + p.Text + ""; + } + if (underlineOn && !p.Text.Contains("")) + { + p.Text = "" + p.Text + ""; + } + p.Text = GetAlignment(verticalAlign, horizontalAlign) + p.Text; + subtitle.Paragraphs.Add(p); + } + } + else + { + _errorCount++; + } + } + else if (line != null && line.TrimStart().StartsWith("$VertAlign", StringComparison.OrdinalIgnoreCase)) + { + verticalAlign = line.RemoveChar(' ').RemoveChar('\t'); + } + else if (line != null && line.TrimStart().StartsWith("$HorzAlign", StringComparison.OrdinalIgnoreCase)) + { + horizontalAlign = line.RemoveChar(' ').RemoveChar('\t'); + } + else if (line.Replace(" ", string.Empty).Equals("$Italic=True", StringComparison.OrdinalIgnoreCase)) + { + italicOn = true; + } + else if (line.Replace(" ", string.Empty).Trim().Equals("$Italic=False", StringComparison.OrdinalIgnoreCase)) + { + italicOn = false; + } + else if (line.Replace(" ", string.Empty).Equals("$Bold=True", StringComparison.OrdinalIgnoreCase)) + { + boldOn = true; + } + else if (line.Replace(" ", string.Empty).Trim().Equals("$Bold=False", StringComparison.OrdinalIgnoreCase)) + { + boldOn = false; + } + else if (line.Replace(" ", string.Empty).Equals("$Underlined=True", StringComparison.OrdinalIgnoreCase)) + { + underlineOn = true; + } + else if (line.Replace(" ", string.Empty).Trim().Equals("$Underlined=False", StringComparison.OrdinalIgnoreCase)) + { + underlineOn = false; + } + } + } + + internal static string GetAlignment(string verticalAlign, string horizontalAlign) + { + if (verticalAlign.Equals("$VertAlign=Top", StringComparison.OrdinalIgnoreCase)) + { + if (horizontalAlign.Equals("$HorzAlign=Left", StringComparison.OrdinalIgnoreCase)) + { + return "{\\an7}"; + } + + if (horizontalAlign.Equals("$HorzAlign=Right", StringComparison.OrdinalIgnoreCase)) + { + return "{\\an9}"; + } + + return "{\\an8}"; + } + + if (verticalAlign.Equals("$VertAlign=Center", StringComparison.OrdinalIgnoreCase)) + { + if (horizontalAlign.Equals("$HorzAlign=Left", StringComparison.OrdinalIgnoreCase)) + { + return "{\\an4}"; + } + + if (horizontalAlign.Equals("$HorzAlign=Right", StringComparison.OrdinalIgnoreCase)) + { + return "{\\an6}"; + } + + return "{\\an5}"; + } + + if (horizontalAlign.Equals("$HorzAlign=Left", StringComparison.OrdinalIgnoreCase)) + { + return "{\\an1}"; + } + + if (horizontalAlign.Equals("$HorzAlign=Right", StringComparison.OrdinalIgnoreCase)) + { + return "{\\an3}"; + } + + return string.Empty; + } + + internal static string DecodeStyles(string text) + { + var sb = new StringBuilder(); + bool italicOn = false; + bool boldOn = false; + bool skipNext = false; + for (int i = 0; i < text.Length; i++) + { + if (skipNext) + { + skipNext = false; + } + else + { + if (text.Substring(i).StartsWith("^I", StringComparison.Ordinal)) + { + sb.Append(!italicOn ? "" : ""); + italicOn = !italicOn; + skipNext = true; + } + else if (text.Substring(i).StartsWith("^B", StringComparison.Ordinal)) + { + sb.Append(!boldOn ? "" : ""); + boldOn = !boldOn; + skipNext = true; + } + else + { + sb.Append(text[i]); + } + } + } + return sb.ToString(); + } + + internal static string EncodeStyles(string input) + { + var text = Utilities.RemoveSsaTags(input); + text = text.Replace("", "").Replace("", ""); + bool allItalic = text.StartsWith("", StringComparison.Ordinal) && text.EndsWith("", StringComparison.Ordinal) && Utilities.CountTagInText(text, "") == 1; + bool allBold = text.StartsWith("", StringComparison.Ordinal) && text.EndsWith("", StringComparison.Ordinal) && Utilities.CountTagInText(text, "") == 1; + bool allUnderline = text.StartsWith("", StringComparison.Ordinal) && text.EndsWith("", StringComparison.Ordinal) && Utilities.CountTagInText(text, "") == 1; + bool allUnderlineBoldItalic = text.StartsWith("", StringComparison.Ordinal) && text.EndsWith("", StringComparison.Ordinal) && Utilities.CountTagInText(text, "") == 1; + bool allBoldItalic = text.StartsWith("", StringComparison.Ordinal) && text.EndsWith("", StringComparison.Ordinal) && Utilities.CountTagInText(text, "") == 1 && Utilities.CountTagInText(text, "") == 1; + + text = text.Replace("", "^I"); + text = text.Replace("", "^I"); + text = text.Replace("", "^I"); + text = text.Replace("", "^I"); + + text = text.Replace("", "^B"); + text = text.Replace("", "^B"); + text = text.Replace("", "^B"); + text = text.Replace("", "^B"); + + text = text.Replace("", "^U"); + text = text.Replace("", "^U"); + text = text.Replace("", "^U"); + text = text.Replace("", "^U"); + + if (allUnderlineBoldItalic) + { + return text.Replace(Environment.NewLine, "^U^B^I|^I^B^U"); + } + + if (allBoldItalic) + { + return text.Replace(Environment.NewLine, "^U^B^I|^I^B^U"); + } + + if (allItalic) + { + return text.Replace(Environment.NewLine, "^I|^I"); + } + + if (allBold) + { + return text.Replace(Environment.NewLine, "^B|^B"); + } + + if (allUnderline) + { + return text.Replace(Environment.NewLine, "^U|^U"); + } + + return text.Replace(Environment.NewLine, "|"); + } + + internal static bool GetTimeCode(TimeCode timeCode, string timeString) + { + try + { + var timeParts = timeString.Split(':', ';'); + timeCode.Hours = int.Parse(timeParts[0]); + timeCode.Minutes = int.Parse(timeParts[1]); + timeCode.Seconds = int.Parse(timeParts[2]); + timeCode.Milliseconds = FramesToMillisecondsMax999(int.Parse(timeParts[3])); + return true; + } + catch + { + return false; + } + } + + } +} diff --git a/libse/SubtitleFormats/DvdStudioProSpace.cs b/src/libse/SubtitleFormats/DvdStudioProSpace.cs similarity index 97% rename from libse/SubtitleFormats/DvdStudioProSpace.cs rename to src/libse/SubtitleFormats/DvdStudioProSpace.cs index 62404bc8b..8730d7002 100644 --- a/libse/SubtitleFormats/DvdStudioProSpace.cs +++ b/src/libse/SubtitleFormats/DvdStudioProSpace.cs @@ -1,126 +1,126 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class DvdStudioProSpace : SubtitleFormat - { - private static readonly Regex RegexTimeCodes = new Regex(@"^\d+:\d+:\d+[:;]\d+ , \d+:\d+:\d+[:;]\d+ , .*$", RegexOptions.Compiled); - - public override string Extension => ".STL"; - - public override string Name => "DVD Studio Pro with space"; - - - public override string ToText(Subtitle subtitle, string title) - { - const string paragraphWriteFormat = "{0} , {1} , {2}\r\n"; - const string timeFormat = "{0:00}:{1:00}:{2:00}:{3:00}"; - var header = Configuration.Settings.SubtitleSettings.DvdStudioProHeader.TrimEnd() + Environment.NewLine; - - var lastVerticalAlign = "$VertAlign = Bottom"; - var lastHorizontalcalAlign = "$HorzAlign = Center"; - var sb = new StringBuilder(); - sb.AppendLine(header); - foreach (Paragraph p in subtitle.Paragraphs) - { - string startTime = string.Format(timeFormat, p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, MillisecondsToFramesMaxFrameRate(p.StartTime.Milliseconds)); - string endTime = string.Format(timeFormat, p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, MillisecondsToFramesMaxFrameRate(p.EndTime.Milliseconds)); - DvdStudioPro.ToTextAlignment(p, sb, ref lastVerticalAlign, ref lastHorizontalcalAlign); - sb.AppendFormat(paragraphWriteFormat, startTime, endTime, DvdStudioPro.EncodeStyles(p.Text)); - } - return sb.ToString().Trim(); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - int number = 0; - var verticalAlign = "$VertAlign=Bottom"; - var horizontalAlign = "$HorzAlign=Center"; - bool italicOn = false; - bool boldOn = false; - bool underlineOn = false; - foreach (string line in lines) - { - if (!string.IsNullOrWhiteSpace(line) && line[0] != '$' && !line.StartsWith("//", StringComparison.Ordinal)) - { - if (RegexTimeCodes.Match(line).Success) - { - string[] toPart = line.Substring(0, 25).Split(new[] { " ," }, StringSplitOptions.None); - Paragraph p = new Paragraph(); - if (toPart.Length == 2 && - DvdStudioPro.GetTimeCode(p.StartTime, toPart[0]) && - DvdStudioPro.GetTimeCode(p.EndTime, toPart[1])) - { - number++; - p.Number = number; - string text = line.Substring(27).Trim(); - p.Text = text.Replace(" | ", Environment.NewLine).Replace("|", Environment.NewLine); - p.Text = DvdStudioPro.DecodeStyles(p.Text); - if (p.Text.Trim().StartsWith("<>")) - { - _errorCount++; - } - - if (italicOn && !p.Text.Contains("")) - { - p.Text = "" + p.Text + ""; - } - if (boldOn && !p.Text.Contains("")) - { - p.Text = "" + p.Text + ""; - } - if (underlineOn && !p.Text.Contains("")) - { - p.Text = "" + p.Text + ""; - } - p.Text = DvdStudioPro.GetAlignment(verticalAlign, horizontalAlign) + p.Text; - subtitle.Paragraphs.Add(p); - } - } - else - { - _errorCount++; - } - } - else if (line != null && line.TrimStart().StartsWith("$VertAlign", StringComparison.OrdinalIgnoreCase)) - { - verticalAlign = line.RemoveChar(' ').RemoveChar('\t'); - } - else if (line != null && line.TrimStart().StartsWith("$HorzAlign", StringComparison.OrdinalIgnoreCase)) - { - horizontalAlign = line.RemoveChar(' ').RemoveChar('\t'); - } - else if (line.Replace(" ", string.Empty).Equals("$Italic=True", StringComparison.OrdinalIgnoreCase)) - { - italicOn = true; - } - else if (line.Replace(" ", string.Empty).Trim().Equals("$Italic=False", StringComparison.OrdinalIgnoreCase)) - { - italicOn = false; - } - else if (line.Replace(" ", string.Empty).Equals("$Bold=True", StringComparison.OrdinalIgnoreCase)) - { - boldOn = true; - } - else if (line.Replace(" ", string.Empty).Trim().Equals("$Bold=False", StringComparison.OrdinalIgnoreCase)) - { - boldOn = false; - } - else if (line.Replace(" ", string.Empty).Equals("$Underlined=True", StringComparison.OrdinalIgnoreCase)) - { - underlineOn = true; - } - else if (line.Replace(" ", string.Empty).Trim().Equals("$Underlined=False", StringComparison.OrdinalIgnoreCase)) - { - underlineOn = false; - } - } - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class DvdStudioProSpace : SubtitleFormat + { + private static readonly Regex RegexTimeCodes = new Regex(@"^\d+:\d+:\d+[:;]\d+ , \d+:\d+:\d+[:;]\d+ , .*$", RegexOptions.Compiled); + + public override string Extension => ".STL"; + + public override string Name => "DVD Studio Pro with space"; + + + public override string ToText(Subtitle subtitle, string title) + { + const string paragraphWriteFormat = "{0} , {1} , {2}\r\n"; + const string timeFormat = "{0:00}:{1:00}:{2:00}:{3:00}"; + var header = Configuration.Settings.SubtitleSettings.DvdStudioProHeader.TrimEnd() + Environment.NewLine; + + var lastVerticalAlign = "$VertAlign = Bottom"; + var lastHorizontalcalAlign = "$HorzAlign = Center"; + var sb = new StringBuilder(); + sb.AppendLine(header); + foreach (Paragraph p in subtitle.Paragraphs) + { + string startTime = string.Format(timeFormat, p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, MillisecondsToFramesMaxFrameRate(p.StartTime.Milliseconds)); + string endTime = string.Format(timeFormat, p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, MillisecondsToFramesMaxFrameRate(p.EndTime.Milliseconds)); + DvdStudioPro.ToTextAlignment(p, sb, ref lastVerticalAlign, ref lastHorizontalcalAlign); + sb.AppendFormat(paragraphWriteFormat, startTime, endTime, DvdStudioPro.EncodeStyles(p.Text)); + } + return sb.ToString().Trim(); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + int number = 0; + var verticalAlign = "$VertAlign=Bottom"; + var horizontalAlign = "$HorzAlign=Center"; + bool italicOn = false; + bool boldOn = false; + bool underlineOn = false; + foreach (string line in lines) + { + if (!string.IsNullOrWhiteSpace(line) && line[0] != '$' && !line.StartsWith("//", StringComparison.Ordinal)) + { + if (RegexTimeCodes.Match(line).Success) + { + string[] toPart = line.Substring(0, 25).Split(new[] { " ," }, StringSplitOptions.None); + Paragraph p = new Paragraph(); + if (toPart.Length == 2 && + DvdStudioPro.GetTimeCode(p.StartTime, toPart[0]) && + DvdStudioPro.GetTimeCode(p.EndTime, toPart[1])) + { + number++; + p.Number = number; + string text = line.Substring(27).Trim(); + p.Text = text.Replace(" | ", Environment.NewLine).Replace("|", Environment.NewLine); + p.Text = DvdStudioPro.DecodeStyles(p.Text); + if (p.Text.Trim().StartsWith("<>")) + { + _errorCount++; + } + + if (italicOn && !p.Text.Contains("")) + { + p.Text = "" + p.Text + ""; + } + if (boldOn && !p.Text.Contains("")) + { + p.Text = "" + p.Text + ""; + } + if (underlineOn && !p.Text.Contains("")) + { + p.Text = "" + p.Text + ""; + } + p.Text = DvdStudioPro.GetAlignment(verticalAlign, horizontalAlign) + p.Text; + subtitle.Paragraphs.Add(p); + } + } + else + { + _errorCount++; + } + } + else if (line != null && line.TrimStart().StartsWith("$VertAlign", StringComparison.OrdinalIgnoreCase)) + { + verticalAlign = line.RemoveChar(' ').RemoveChar('\t'); + } + else if (line != null && line.TrimStart().StartsWith("$HorzAlign", StringComparison.OrdinalIgnoreCase)) + { + horizontalAlign = line.RemoveChar(' ').RemoveChar('\t'); + } + else if (line.Replace(" ", string.Empty).Equals("$Italic=True", StringComparison.OrdinalIgnoreCase)) + { + italicOn = true; + } + else if (line.Replace(" ", string.Empty).Trim().Equals("$Italic=False", StringComparison.OrdinalIgnoreCase)) + { + italicOn = false; + } + else if (line.Replace(" ", string.Empty).Equals("$Bold=True", StringComparison.OrdinalIgnoreCase)) + { + boldOn = true; + } + else if (line.Replace(" ", string.Empty).Trim().Equals("$Bold=False", StringComparison.OrdinalIgnoreCase)) + { + boldOn = false; + } + else if (line.Replace(" ", string.Empty).Equals("$Underlined=True", StringComparison.OrdinalIgnoreCase)) + { + underlineOn = true; + } + else if (line.Replace(" ", string.Empty).Trim().Equals("$Underlined=False", StringComparison.OrdinalIgnoreCase)) + { + underlineOn = false; + } + } + } + + } +} diff --git a/libse/SubtitleFormats/DvdStudioProSpaceGraphic.cs b/src/libse/SubtitleFormats/DvdStudioProSpaceGraphic.cs similarity index 100% rename from libse/SubtitleFormats/DvdStudioProSpaceGraphic.cs rename to src/libse/SubtitleFormats/DvdStudioProSpaceGraphic.cs diff --git a/libse/SubtitleFormats/DvdStudioProSpaceOne.cs b/src/libse/SubtitleFormats/DvdStudioProSpaceOne.cs similarity index 97% rename from libse/SubtitleFormats/DvdStudioProSpaceOne.cs rename to src/libse/SubtitleFormats/DvdStudioProSpaceOne.cs index 96082b4c7..42b17b1f7 100644 --- a/libse/SubtitleFormats/DvdStudioProSpaceOne.cs +++ b/src/libse/SubtitleFormats/DvdStudioProSpaceOne.cs @@ -1,125 +1,125 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class DvdStudioProSpaceOne : SubtitleFormat - { - private static readonly Regex RegexTimeCodes = new Regex(@"^\d+:\d+:\d+:\d+,\d+:\d+:\d+:\d+, .*$", RegexOptions.Compiled); - - public override string Extension => ".STL"; - - public override string Name => "DVD Studio Pro with one space"; - - public override string ToText(Subtitle subtitle, string title) - { - const string paragraphWriteFormat = "{0},{1}, {2}\r\n"; - const string timeFormat = "{0:00}:{1:00}:{2:00}:{3:00}"; - var header = Configuration.Settings.SubtitleSettings.DvdStudioProHeader.TrimEnd() + Environment.NewLine; - - var lastVerticalAlign = "$VertAlign = Bottom"; - var lastHorizontalcalAlign = "$HorzAlign = Center"; - var sb = new StringBuilder(); - sb.AppendLine(header); - foreach (Paragraph p in subtitle.Paragraphs) - { - string startTime = string.Format(timeFormat, p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, MillisecondsToFramesMaxFrameRate(p.StartTime.Milliseconds)); - string endTime = string.Format(timeFormat, p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, MillisecondsToFramesMaxFrameRate(p.EndTime.Milliseconds)); - DvdStudioPro.ToTextAlignment(p, sb, ref lastVerticalAlign, ref lastHorizontalcalAlign); - sb.AppendFormat(paragraphWriteFormat, startTime, endTime, DvdStudioPro.EncodeStyles(p.Text)); - } - return sb.ToString().Trim(); - } - - public static byte GetFrameFromMilliseconds(int milliseconds, double frameRate) - { - return (byte)Math.Round(milliseconds / (TimeCode.BaseUnit / frameRate)); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - int number = 0; - var verticalAlign = "$VertAlign=Bottom"; - var horizontalAlign = "$HorzAlign=Center"; - bool italicOn = false; - bool boldOn = false; - bool underlineOn = false; - foreach (string line in lines) - { - if (!string.IsNullOrWhiteSpace(line) && line[0] != '$' && !line.StartsWith("//", StringComparison.Ordinal)) - { - if (RegexTimeCodes.Match(line).Success) - { - string[] toPart = line.Substring(0, 24).Trim(',').Split(','); - var p = new Paragraph(); - if (toPart.Length == 2 && - DvdStudioPro.GetTimeCode(p.StartTime, toPart[0]) && - DvdStudioPro.GetTimeCode(p.EndTime, toPart[1])) - { - number++; - p.Number = number; - string text = line.Substring(25).Trim(); - p.Text = text.Replace(" | ", Environment.NewLine).Replace("|", Environment.NewLine); - p.Text = DvdStudioPro.DecodeStyles(p.Text); - if (italicOn && !p.Text.Contains("")) - { - p.Text = "" + p.Text + ""; - } - if (boldOn && !p.Text.Contains("")) - { - p.Text = "" + p.Text + ""; - } - if (underlineOn && !p.Text.Contains("")) - { - p.Text = "" + p.Text + ""; - } - p.Text = DvdStudioPro.GetAlignment(verticalAlign, horizontalAlign) + p.Text; - subtitle.Paragraphs.Add(p); - } - } - else - { - _errorCount++; - } - } - else if (line != null && line.TrimStart().StartsWith("$VertAlign", StringComparison.OrdinalIgnoreCase)) - { - verticalAlign = line.RemoveChar(' ').RemoveChar('\t'); - } - else if (line != null && line.TrimStart().StartsWith("$HorzAlign", StringComparison.OrdinalIgnoreCase)) - { - horizontalAlign = line.RemoveChar(' ').RemoveChar('\t'); - } - else if (line.Replace(" ", string.Empty).Equals("$Italic=True", StringComparison.OrdinalIgnoreCase)) - { - italicOn = true; - } - else if (line.Replace(" ", string.Empty).Trim().Equals("$Italic=False", StringComparison.OrdinalIgnoreCase)) - { - italicOn = false; - } - else if (line.Replace(" ", string.Empty).Equals("$Bold=True", StringComparison.OrdinalIgnoreCase)) - { - boldOn = true; - } - else if (line.Replace(" ", string.Empty).Trim().Equals("$Bold=False", StringComparison.OrdinalIgnoreCase)) - { - boldOn = false; - } - else if (line.Replace(" ", string.Empty).Equals("$Underlined=True", StringComparison.OrdinalIgnoreCase)) - { - underlineOn = true; - } - else if (line.Replace(" ", string.Empty).Trim().Equals("$Underlined=False", StringComparison.OrdinalIgnoreCase)) - { - underlineOn = false; - } - } - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class DvdStudioProSpaceOne : SubtitleFormat + { + private static readonly Regex RegexTimeCodes = new Regex(@"^\d+:\d+:\d+:\d+,\d+:\d+:\d+:\d+, .*$", RegexOptions.Compiled); + + public override string Extension => ".STL"; + + public override string Name => "DVD Studio Pro with one space"; + + public override string ToText(Subtitle subtitle, string title) + { + const string paragraphWriteFormat = "{0},{1}, {2}\r\n"; + const string timeFormat = "{0:00}:{1:00}:{2:00}:{3:00}"; + var header = Configuration.Settings.SubtitleSettings.DvdStudioProHeader.TrimEnd() + Environment.NewLine; + + var lastVerticalAlign = "$VertAlign = Bottom"; + var lastHorizontalcalAlign = "$HorzAlign = Center"; + var sb = new StringBuilder(); + sb.AppendLine(header); + foreach (Paragraph p in subtitle.Paragraphs) + { + string startTime = string.Format(timeFormat, p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, MillisecondsToFramesMaxFrameRate(p.StartTime.Milliseconds)); + string endTime = string.Format(timeFormat, p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, MillisecondsToFramesMaxFrameRate(p.EndTime.Milliseconds)); + DvdStudioPro.ToTextAlignment(p, sb, ref lastVerticalAlign, ref lastHorizontalcalAlign); + sb.AppendFormat(paragraphWriteFormat, startTime, endTime, DvdStudioPro.EncodeStyles(p.Text)); + } + return sb.ToString().Trim(); + } + + public static byte GetFrameFromMilliseconds(int milliseconds, double frameRate) + { + return (byte)Math.Round(milliseconds / (TimeCode.BaseUnit / frameRate)); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + int number = 0; + var verticalAlign = "$VertAlign=Bottom"; + var horizontalAlign = "$HorzAlign=Center"; + bool italicOn = false; + bool boldOn = false; + bool underlineOn = false; + foreach (string line in lines) + { + if (!string.IsNullOrWhiteSpace(line) && line[0] != '$' && !line.StartsWith("//", StringComparison.Ordinal)) + { + if (RegexTimeCodes.Match(line).Success) + { + string[] toPart = line.Substring(0, 24).Trim(',').Split(','); + var p = new Paragraph(); + if (toPart.Length == 2 && + DvdStudioPro.GetTimeCode(p.StartTime, toPart[0]) && + DvdStudioPro.GetTimeCode(p.EndTime, toPart[1])) + { + number++; + p.Number = number; + string text = line.Substring(25).Trim(); + p.Text = text.Replace(" | ", Environment.NewLine).Replace("|", Environment.NewLine); + p.Text = DvdStudioPro.DecodeStyles(p.Text); + if (italicOn && !p.Text.Contains("")) + { + p.Text = "" + p.Text + ""; + } + if (boldOn && !p.Text.Contains("")) + { + p.Text = "" + p.Text + ""; + } + if (underlineOn && !p.Text.Contains("")) + { + p.Text = "" + p.Text + ""; + } + p.Text = DvdStudioPro.GetAlignment(verticalAlign, horizontalAlign) + p.Text; + subtitle.Paragraphs.Add(p); + } + } + else + { + _errorCount++; + } + } + else if (line != null && line.TrimStart().StartsWith("$VertAlign", StringComparison.OrdinalIgnoreCase)) + { + verticalAlign = line.RemoveChar(' ').RemoveChar('\t'); + } + else if (line != null && line.TrimStart().StartsWith("$HorzAlign", StringComparison.OrdinalIgnoreCase)) + { + horizontalAlign = line.RemoveChar(' ').RemoveChar('\t'); + } + else if (line.Replace(" ", string.Empty).Equals("$Italic=True", StringComparison.OrdinalIgnoreCase)) + { + italicOn = true; + } + else if (line.Replace(" ", string.Empty).Trim().Equals("$Italic=False", StringComparison.OrdinalIgnoreCase)) + { + italicOn = false; + } + else if (line.Replace(" ", string.Empty).Equals("$Bold=True", StringComparison.OrdinalIgnoreCase)) + { + boldOn = true; + } + else if (line.Replace(" ", string.Empty).Trim().Equals("$Bold=False", StringComparison.OrdinalIgnoreCase)) + { + boldOn = false; + } + else if (line.Replace(" ", string.Empty).Equals("$Underlined=True", StringComparison.OrdinalIgnoreCase)) + { + underlineOn = true; + } + else if (line.Replace(" ", string.Empty).Trim().Equals("$Underlined=False", StringComparison.OrdinalIgnoreCase)) + { + underlineOn = false; + } + } + } + + } +} diff --git a/libse/SubtitleFormats/DvdStudioProSpaceOneSemicolon.cs b/src/libse/SubtitleFormats/DvdStudioProSpaceOneSemicolon.cs similarity index 100% rename from libse/SubtitleFormats/DvdStudioProSpaceOneSemicolon.cs rename to src/libse/SubtitleFormats/DvdStudioProSpaceOneSemicolon.cs diff --git a/libse/SubtitleFormats/DvdSubtitle.cs b/src/libse/SubtitleFormats/DvdSubtitle.cs similarity index 97% rename from libse/SubtitleFormats/DvdSubtitle.cs rename to src/libse/SubtitleFormats/DvdSubtitle.cs index 9d3f6bece..eb7580029 100644 --- a/libse/SubtitleFormats/DvdSubtitle.cs +++ b/src/libse/SubtitleFormats/DvdSubtitle.cs @@ -1,139 +1,139 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class DvdSubtitle : SubtitleFormat - { - - private static readonly Regex RegexTimeCodes = new Regex(@"^\{T \d+:\d+:\d+:\d+$", RegexOptions.Compiled); - - public override string Extension => ".sub"; - - public override string Name => "DVDSubtitle"; - - public override string ToText(Subtitle subtitle, string title) - { - const string paragraphWriteFormat = "T {0}\r\n{1}\r\n"; - const string timeFormat = "{0:00}:{1:00}:{2:00}:{3:00}"; - const string header = @"{HEAD -DISCID= -DVDTITLE= -CODEPAGE=1250 -FORMAT=ASCII -LANG= -TITLE=1 -ORIGINAL=ORIGINAL -AUTHOR= -WEB= -INFO= -LICENSE= -}"; - - var sb = new StringBuilder(); - sb.AppendLine(header); - foreach (var p in subtitle.Paragraphs) - { - int milliseconds = p.StartTime.Milliseconds / 10; - string time = string.Format(timeFormat, p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, milliseconds); - sb.AppendLine("{" + string.Format(paragraphWriteFormat, time, p.Text) + "}"); - - milliseconds = p.EndTime.Milliseconds / 10; - time = string.Format(timeFormat, p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, milliseconds); - sb.AppendLine("{" + string.Format(paragraphWriteFormat, time, string.Empty) + "}"); - } - return sb.ToString().Trim(); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - //{T 00:03:14:27 - //Some text - //} - _errorCount = 0; - bool textOn = false; - string text = string.Empty; - var start = new TimeCode(); - var end = new TimeCode(); - foreach (string line in lines) - { - if (textOn) - { - if (line.Trim() == "}") - { - var p = new Paragraph - { - Text = text, - StartTime = new TimeCode(start.TotalMilliseconds), - EndTime = new TimeCode(end.TotalMilliseconds) - }; - - subtitle.Paragraphs.Add(p); - - text = string.Empty; - start = new TimeCode(); - end = new TimeCode(); - textOn = false; - } - else - { - if (text.Length == 0) - { - text = line; - } - else - { - text += Environment.NewLine + line; - } - } - } - else - { - if (RegexTimeCodes.Match(line).Success) - { - try - { - textOn = true; - string[] arr = line.Substring(3).Trim().Split(':'); - if (arr.Length == 4) - { - int hours = int.Parse(arr[0]); - int minutes = int.Parse(arr[1]); - int seconds = int.Parse(arr[2]); - int milliseconds = int.Parse(arr[3]); - if (arr[3].Length == 2) - { - milliseconds *= 10; - } - - start = new TimeCode(hours, minutes, seconds, milliseconds); - } - } - catch - { - textOn = false; - _errorCount++; - } - } - } - } - - int index = 1; - foreach (var p in subtitle.Paragraphs) - { - var next = subtitle.GetParagraphOrDefault(index); - if (next != null) - { - p.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds; - } - index++; - } - - subtitle.RemoveEmptyLines(); - subtitle.Renumber(); - } - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class DvdSubtitle : SubtitleFormat + { + + private static readonly Regex RegexTimeCodes = new Regex(@"^\{T \d+:\d+:\d+:\d+$", RegexOptions.Compiled); + + public override string Extension => ".sub"; + + public override string Name => "DVDSubtitle"; + + public override string ToText(Subtitle subtitle, string title) + { + const string paragraphWriteFormat = "T {0}\r\n{1}\r\n"; + const string timeFormat = "{0:00}:{1:00}:{2:00}:{3:00}"; + const string header = @"{HEAD +DISCID= +DVDTITLE= +CODEPAGE=1250 +FORMAT=ASCII +LANG= +TITLE=1 +ORIGINAL=ORIGINAL +AUTHOR= +WEB= +INFO= +LICENSE= +}"; + + var sb = new StringBuilder(); + sb.AppendLine(header); + foreach (var p in subtitle.Paragraphs) + { + int milliseconds = p.StartTime.Milliseconds / 10; + string time = string.Format(timeFormat, p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, milliseconds); + sb.AppendLine("{" + string.Format(paragraphWriteFormat, time, p.Text) + "}"); + + milliseconds = p.EndTime.Milliseconds / 10; + time = string.Format(timeFormat, p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, milliseconds); + sb.AppendLine("{" + string.Format(paragraphWriteFormat, time, string.Empty) + "}"); + } + return sb.ToString().Trim(); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + //{T 00:03:14:27 + //Some text + //} + _errorCount = 0; + bool textOn = false; + string text = string.Empty; + var start = new TimeCode(); + var end = new TimeCode(); + foreach (string line in lines) + { + if (textOn) + { + if (line.Trim() == "}") + { + var p = new Paragraph + { + Text = text, + StartTime = new TimeCode(start.TotalMilliseconds), + EndTime = new TimeCode(end.TotalMilliseconds) + }; + + subtitle.Paragraphs.Add(p); + + text = string.Empty; + start = new TimeCode(); + end = new TimeCode(); + textOn = false; + } + else + { + if (text.Length == 0) + { + text = line; + } + else + { + text += Environment.NewLine + line; + } + } + } + else + { + if (RegexTimeCodes.Match(line).Success) + { + try + { + textOn = true; + string[] arr = line.Substring(3).Trim().Split(':'); + if (arr.Length == 4) + { + int hours = int.Parse(arr[0]); + int minutes = int.Parse(arr[1]); + int seconds = int.Parse(arr[2]); + int milliseconds = int.Parse(arr[3]); + if (arr[3].Length == 2) + { + milliseconds *= 10; + } + + start = new TimeCode(hours, minutes, seconds, milliseconds); + } + } + catch + { + textOn = false; + _errorCount++; + } + } + } + } + + int index = 1; + foreach (var p in subtitle.Paragraphs) + { + var next = subtitle.GetParagraphOrDefault(index); + if (next != null) + { + p.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds; + } + index++; + } + + subtitle.RemoveEmptyLines(); + subtitle.Renumber(); + } + } +} diff --git a/libse/SubtitleFormats/DvdSubtitleSystem.cs b/src/libse/SubtitleFormats/DvdSubtitleSystem.cs similarity index 97% rename from libse/SubtitleFormats/DvdSubtitleSystem.cs rename to src/libse/SubtitleFormats/DvdSubtitleSystem.cs index 1230edf9b..bb67209d0 100644 --- a/libse/SubtitleFormats/DvdSubtitleSystem.cs +++ b/src/libse/SubtitleFormats/DvdSubtitleSystem.cs @@ -1,87 +1,87 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class DvdSubtitleSystem : SubtitleFormat - { - private static readonly Regex RegexTimeCodes = new Regex(@"^\d\d:\d\d:\d\d:\d\d \d\d:\d\d:\d\d:\d\d ", RegexOptions.Compiled); - - public override string Extension => ".txt"; - - public override string Name => "DVD Subtitle System"; - - public override bool IsMine(List lines, string fileName) - { - var sb = new StringBuilder(); - foreach (string line in lines) - { - sb.AppendLine(line); - } - - if (sb.ToString().Contains("#INPOINT OUTPOINT PATH")) - { - return false; // Pinnacle Impression - } - - return base.IsMine(lines, fileName); - } - - public override string ToText(Subtitle subtitle, string title) - { - var sb = new StringBuilder(); - foreach (Paragraph p in subtitle.Paragraphs) - { - //00:03:15:22 00:03:23:10 This is line one. - //This is line two. - sb.AppendLine($"{EncodeTimeCode(p.StartTime)} {EncodeTimeCode(p.EndTime)} {HtmlUtil.RemoveHtmlTags(p.Text.Replace(Environment.NewLine, "//"), true)}"); - } - return sb.ToString(); - } - - private static string EncodeTimeCode(TimeCode time) - { - //00:03:15:22 (last is ms div 10) - return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}:{MillisecondsToFramesMaxFrameRate(time.Milliseconds):00}"; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - //00:03:15:22 00:03:23:10 This is line one. - //This is line two. - subtitle.Paragraphs.Clear(); - _errorCount = 0; - foreach (string line in lines) - { - // line must contain atleast 24 characters (time-code)... - if (line.Length < 24) - { - _errorCount += 10; - continue; - } - - Match match = RegexTimeCodes.Match(line); - - if (match.Success) - { - string temp = line.Substring(0, match.Length); - string start = temp.Substring(0, 11); - string end = temp.Substring(12, 11); - - string[] startParts = start.Split(SplitCharColon, StringSplitOptions.RemoveEmptyEntries); - string[] endParts = end.Split(SplitCharColon, StringSplitOptions.RemoveEmptyEntries); - string text = line.Substring(match.Length).Trim(); - text = text.Replace("//", Environment.NewLine); - var p = new Paragraph(DecodeTimeCodeFramesFourParts(startParts), DecodeTimeCodeFramesFourParts(endParts), text); - subtitle.Paragraphs.Add(p); - } - } - - subtitle.Renumber(); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class DvdSubtitleSystem : SubtitleFormat + { + private static readonly Regex RegexTimeCodes = new Regex(@"^\d\d:\d\d:\d\d:\d\d \d\d:\d\d:\d\d:\d\d ", RegexOptions.Compiled); + + public override string Extension => ".txt"; + + public override string Name => "DVD Subtitle System"; + + public override bool IsMine(List lines, string fileName) + { + var sb = new StringBuilder(); + foreach (string line in lines) + { + sb.AppendLine(line); + } + + if (sb.ToString().Contains("#INPOINT OUTPOINT PATH")) + { + return false; // Pinnacle Impression + } + + return base.IsMine(lines, fileName); + } + + public override string ToText(Subtitle subtitle, string title) + { + var sb = new StringBuilder(); + foreach (Paragraph p in subtitle.Paragraphs) + { + //00:03:15:22 00:03:23:10 This is line one. + //This is line two. + sb.AppendLine($"{EncodeTimeCode(p.StartTime)} {EncodeTimeCode(p.EndTime)} {HtmlUtil.RemoveHtmlTags(p.Text.Replace(Environment.NewLine, "//"), true)}"); + } + return sb.ToString(); + } + + private static string EncodeTimeCode(TimeCode time) + { + //00:03:15:22 (last is ms div 10) + return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}:{MillisecondsToFramesMaxFrameRate(time.Milliseconds):00}"; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + //00:03:15:22 00:03:23:10 This is line one. + //This is line two. + subtitle.Paragraphs.Clear(); + _errorCount = 0; + foreach (string line in lines) + { + // line must contain atleast 24 characters (time-code)... + if (line.Length < 24) + { + _errorCount += 10; + continue; + } + + Match match = RegexTimeCodes.Match(line); + + if (match.Success) + { + string temp = line.Substring(0, match.Length); + string start = temp.Substring(0, 11); + string end = temp.Substring(12, 11); + + string[] startParts = start.Split(SplitCharColon, StringSplitOptions.RemoveEmptyEntries); + string[] endParts = end.Split(SplitCharColon, StringSplitOptions.RemoveEmptyEntries); + string text = line.Substring(match.Length).Trim(); + text = text.Replace("//", Environment.NewLine); + var p = new Paragraph(DecodeTimeCodeFramesFourParts(startParts), DecodeTimeCodeFramesFourParts(endParts), text); + subtitle.Paragraphs.Add(p); + } + } + + subtitle.Renumber(); + } + + } +} diff --git a/libse/SubtitleFormats/ELRStudioClosedCaption.cs b/src/libse/SubtitleFormats/ELRStudioClosedCaption.cs similarity index 97% rename from libse/SubtitleFormats/ELRStudioClosedCaption.cs rename to src/libse/SubtitleFormats/ELRStudioClosedCaption.cs index f355cb2a4..ef1a7faf6 100644 --- a/libse/SubtitleFormats/ELRStudioClosedCaption.cs +++ b/src/libse/SubtitleFormats/ELRStudioClosedCaption.cs @@ -1,144 +1,144 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class ELRStudioClosedCaption : SubtitleFormat - { - public override string Extension => ".elr"; - - public override string Name => "ELRStudio Closed Caption"; - - public static void Save(string fileName) - { - using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write)) - { - //... - } - } - - public override bool IsMine(List lines, string fileName) - { - if (!string.IsNullOrEmpty(fileName) && File.Exists(fileName)) - { - var fi = new FileInfo(fileName); - if (fi.Length >= 640 && fi.Length < 1024000) // not too small or too big - { - if (fileName.EndsWith(".elr", StringComparison.OrdinalIgnoreCase)) - { - byte[] buffer = FileUtil.ReadAllBytesShared(fileName); - byte[] compareBuffer = { 0x05, 0x01, 0x0D, 0x15, 0x11, 0x00, 0xA9, 0x00, 0x45, 0x00, 0x6C, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x6D, 0x00, 0x20, 0x00, 0x53, 0x00, 0x74, 0x00, 0x75, 0x00, 0x64, 0x00, 0x69, 0x00, 0x6F, 0x00 }; - - for (int i = 6; i < compareBuffer.Length; i++) - { - if (buffer[i] != compareBuffer[i]) - { - return false; - } - } - - var sub = new Subtitle(); - LoadSubtitle(sub, lines, fileName); - return sub.Paragraphs.Count > 0; - } - } - } - return false; - } - - public override string ToText(Subtitle subtitle, string title) - { - return "Not supported!"; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - subtitle.Paragraphs.Clear(); - subtitle.Header = null; - byte[] buffer = FileUtil.ReadAllBytesShared(fileName); - - int i = 128; - while (i < buffer.Length - 40) - { - try - { - if ((buffer[i] == 0xc4 || buffer[i] == 0x5d) && buffer[i + 1] == 9 && buffer[i + 2] == 0 && buffer[i + 3] == 0x10) // start time (hopefully) - { - var p = new Paragraph { StartTime = GetTimeCode(buffer, i + 4) }; - i += 7; - - // seek to endtime - while (i < buffer.Length - 10 && !((buffer[i] == 0xc4 || buffer[i] == 0x5d) && buffer[i + 1] == 9 && buffer[i + 2] == 0 && buffer[i + 3] == 0x10)) - { - i++; - } - if (buffer[i] == 0xc4 && buffer[i + 1] == 9 && buffer[i + 2] == 0 && buffer[i + 3] == 0x10) - { - p.EndTime = GetTimeCode(buffer, i + 4); - i += 7; - } - if (Math.Abs(p.EndTime.TotalMilliseconds) < 0.001) - { - p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + 2000; - } - - // seek to text - var sb = new StringBuilder(); - int min = 4; - while (min > 0 || i < buffer.Length - 10 && !((buffer[i] == 0xc4 || buffer[i] == 0x5d) && buffer[i + 1] == 9 && buffer[i + 2] == 0 && buffer[i + 3] == 0x10)) - { - min--; - if (buffer[i] == 9 && buffer[i + 1] == 0 && buffer[i + 2] == 0x44) - { - var length = buffer[i - 1]; - i += 12; - for (int j = i; j < i + length * 4; j += 4) - { - sb.Append(Encoding.GetEncoding(1252).GetString(buffer, j, 1)); - } - sb.AppendLine(); - } - else - { - i++; - } - } - p.Text = (p.Text + " " + sb).Trim(); - subtitle.Paragraphs.Add(p); - } - else - { - i++; - } - } - catch - { - i += 5; - } - } - subtitle.Renumber(); - } - - private static TimeCode GetTimeCode(byte[] buffer, int idx) - { - try - { - const string format = "X4"; - int frames = int.Parse(buffer[idx].ToString(format)); - int seconds = int.Parse(buffer[idx + 1].ToString(format)); - int minutes = int.Parse(buffer[idx + 2].ToString(format)); - int hours = int.Parse(buffer[idx + 3].ToString(format)); - return new TimeCode(hours, minutes, seconds, FramesToMillisecondsMax999(frames)); - } - catch - { - return new TimeCode(); - } - } - - } -} +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class ELRStudioClosedCaption : SubtitleFormat + { + public override string Extension => ".elr"; + + public override string Name => "ELRStudio Closed Caption"; + + public static void Save(string fileName) + { + using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write)) + { + //... + } + } + + public override bool IsMine(List lines, string fileName) + { + if (!string.IsNullOrEmpty(fileName) && File.Exists(fileName)) + { + var fi = new FileInfo(fileName); + if (fi.Length >= 640 && fi.Length < 1024000) // not too small or too big + { + if (fileName.EndsWith(".elr", StringComparison.OrdinalIgnoreCase)) + { + byte[] buffer = FileUtil.ReadAllBytesShared(fileName); + byte[] compareBuffer = { 0x05, 0x01, 0x0D, 0x15, 0x11, 0x00, 0xA9, 0x00, 0x45, 0x00, 0x6C, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x6D, 0x00, 0x20, 0x00, 0x53, 0x00, 0x74, 0x00, 0x75, 0x00, 0x64, 0x00, 0x69, 0x00, 0x6F, 0x00 }; + + for (int i = 6; i < compareBuffer.Length; i++) + { + if (buffer[i] != compareBuffer[i]) + { + return false; + } + } + + var sub = new Subtitle(); + LoadSubtitle(sub, lines, fileName); + return sub.Paragraphs.Count > 0; + } + } + } + return false; + } + + public override string ToText(Subtitle subtitle, string title) + { + return "Not supported!"; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + subtitle.Paragraphs.Clear(); + subtitle.Header = null; + byte[] buffer = FileUtil.ReadAllBytesShared(fileName); + + int i = 128; + while (i < buffer.Length - 40) + { + try + { + if ((buffer[i] == 0xc4 || buffer[i] == 0x5d) && buffer[i + 1] == 9 && buffer[i + 2] == 0 && buffer[i + 3] == 0x10) // start time (hopefully) + { + var p = new Paragraph { StartTime = GetTimeCode(buffer, i + 4) }; + i += 7; + + // seek to endtime + while (i < buffer.Length - 10 && !((buffer[i] == 0xc4 || buffer[i] == 0x5d) && buffer[i + 1] == 9 && buffer[i + 2] == 0 && buffer[i + 3] == 0x10)) + { + i++; + } + if (buffer[i] == 0xc4 && buffer[i + 1] == 9 && buffer[i + 2] == 0 && buffer[i + 3] == 0x10) + { + p.EndTime = GetTimeCode(buffer, i + 4); + i += 7; + } + if (Math.Abs(p.EndTime.TotalMilliseconds) < 0.001) + { + p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + 2000; + } + + // seek to text + var sb = new StringBuilder(); + int min = 4; + while (min > 0 || i < buffer.Length - 10 && !((buffer[i] == 0xc4 || buffer[i] == 0x5d) && buffer[i + 1] == 9 && buffer[i + 2] == 0 && buffer[i + 3] == 0x10)) + { + min--; + if (buffer[i] == 9 && buffer[i + 1] == 0 && buffer[i + 2] == 0x44) + { + var length = buffer[i - 1]; + i += 12; + for (int j = i; j < i + length * 4; j += 4) + { + sb.Append(Encoding.GetEncoding(1252).GetString(buffer, j, 1)); + } + sb.AppendLine(); + } + else + { + i++; + } + } + p.Text = (p.Text + " " + sb).Trim(); + subtitle.Paragraphs.Add(p); + } + else + { + i++; + } + } + catch + { + i += 5; + } + } + subtitle.Renumber(); + } + + private static TimeCode GetTimeCode(byte[] buffer, int idx) + { + try + { + const string format = "X4"; + int frames = int.Parse(buffer[idx].ToString(format)); + int seconds = int.Parse(buffer[idx + 1].ToString(format)); + int minutes = int.Parse(buffer[idx + 2].ToString(format)); + int hours = int.Parse(buffer[idx + 3].ToString(format)); + return new TimeCode(hours, minutes, seconds, FramesToMillisecondsMax999(frames)); + } + catch + { + return new TimeCode(); + } + } + + } +} diff --git a/libse/SubtitleFormats/ESubXf.cs b/src/libse/SubtitleFormats/ESubXf.cs similarity index 100% rename from libse/SubtitleFormats/ESubXf.cs rename to src/libse/SubtitleFormats/ESubXf.cs diff --git a/libse/SubtitleFormats/EZTSubtitlesProject.cs b/src/libse/SubtitleFormats/EZTSubtitlesProject.cs similarity index 100% rename from libse/SubtitleFormats/EZTSubtitlesProject.cs rename to src/libse/SubtitleFormats/EZTSubtitlesProject.cs diff --git a/libse/SubtitleFormats/Ebu.cs b/src/libse/SubtitleFormats/Ebu.cs similarity index 97% rename from libse/SubtitleFormats/Ebu.cs rename to src/libse/SubtitleFormats/Ebu.cs index 4c04a40fd..9c827671d 100644 --- a/libse/SubtitleFormats/Ebu.cs +++ b/src/libse/SubtitleFormats/Ebu.cs @@ -1,1785 +1,1785 @@ -using Nikse.SubtitleEdit.Core.Interfaces; -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - /// - /// EBU Subtitling data exchange format - /// - public class Ebu : SubtitleFormat, IBinaryPersistableSubtitle - { - private static readonly Regex FontTagsNoSpace1 = new Regex("[a-zA-z.!?][a-zA-Z-]", RegexOptions.Compiled); - private static readonly Regex FontTagsNoSpace2 = new Regex("[a-zA-z.!?][a-zA-Z-]", RegexOptions.Compiled); - - private static readonly Regex FontTagsStartSpace = new Regex("^ ", RegexOptions.Compiled); // " " - private static readonly Regex FontTagsNewLineSpace = new Regex("[\r\n]+ ", RegexOptions.Compiled); // "\r\n " - - private const string LanguageCodeChinese = "75"; - - public interface IEbuUiHelper - { - void Initialize(EbuGeneralSubtitleInformation header, byte justificationCode, string fileName, Subtitle subtitle); - bool ShowDialogOk(); - byte JustificationCode { get; set; } - } - - public static IEbuUiHelper EbuUiHelper { get; set; } - - private static readonly Regex RegExprColor = new Regex(@"^[a-f0-9]{6}$", RegexOptions.Compiled); - - public List VerticalPositions = new List(); - public List JustificationCodes = new List(); - - public EbuGeneralSubtitleInformation Header; - - /// - /// GSI block (1024 bytes) - /// - public class EbuGeneralSubtitleInformation - { - public string CodePageNumber { get; set; } // 0..2 - public string DiskFormatCode { get; set; } // 3..10 - public double FrameRateFromSaveDialog { get; set; } - public string DisplayStandardCode { get; set; } // 11 - public string CharacterCodeTableNumber { get; set; } // 12..13 - public string LanguageCode { get; set; } // 14..15 - public string OriginalProgrammeTitle { get; set; } // 16..47 - public string OriginalEpisodeTitle { get; set; } - public string TranslatedProgrammeTitle { get; set; } - public string TranslatedEpisodeTitle { get; set; } - public string TranslatorsName { get; set; } - public string TranslatorsContactDetails { get; set; } - public string SubtitleListReferenceCode { get; set; } - public string CreationDate { get; set; } - public string RevisionDate { get; set; } - public string RevisionNumber { get; set; } - public string TotalNumberOfTextAndTimingInformationBlocks { get; set; } - public string TotalNumberOfSubtitles { get; set; } - public string TotalNumberOfSubtitleGroups { get; set; } - public string MaximumNumberOfDisplayableCharactersInAnyTextRow { get; set; } - public string MaximumNumberOfDisplayableRows { get; set; } - public string TimeCodeStatus { get; set; } - public string TimeCodeStartOfProgramme { get; set; } - public string TimeCodeFirstInCue { get; set; } - public string TotalNumberOfDisks { get; set; } - public string DiskSequenceNumber { get; set; } - public string CountryOfOrigin { get; set; } - public string Publisher { get; set; } - public string EditorsName { get; set; } - public string EditorsContactDetails { get; set; } - public string SpareBytes { get; set; } - public string UserDefinedArea { get; set; } - - public double FrameRate - { - get - { - if (FrameRateFromSaveDialog > 20) - { - return FrameRateFromSaveDialog; - } - - if (DiskFormatCode.StartsWith("STL23", StringComparison.Ordinal)) - { - return 23.0; - } - - if (DiskFormatCode.StartsWith("STL24", StringComparison.Ordinal)) - { - return 24.0; - } - - if (DiskFormatCode.StartsWith("STL25", StringComparison.Ordinal)) - { - return 25.0; - } - - if (DiskFormatCode.StartsWith("STL29", StringComparison.Ordinal)) - { - return 29.0; - } - - if (DiskFormatCode.StartsWith("STL35", StringComparison.Ordinal)) - { - return 35.0; - } - - if (DiskFormatCode.StartsWith("STL48", StringComparison.Ordinal)) - { - return 48.0; - } - - if (DiskFormatCode.StartsWith("STL50", StringComparison.Ordinal)) - { - return 50.0; - } - - if (DiskFormatCode.StartsWith("STL60", StringComparison.Ordinal)) - { - return 60.0; - } - - return 30.0; // should be DiskFormatcode STL30.01 - } - } - - public EbuGeneralSubtitleInformation() - { - CodePageNumber = "437"; - DiskFormatCode = "STL25.01"; - DisplayStandardCode = "0"; // 0=Open subtitling - CharacterCodeTableNumber = "00"; - LanguageCode = "0A"; - OriginalProgrammeTitle = "No Title "; - OriginalEpisodeTitle = " "; - TranslatedProgrammeTitle = string.Empty.PadLeft(32, ' '); - TranslatedEpisodeTitle = string.Empty.PadLeft(32, ' '); - TranslatorsName = string.Empty.PadLeft(32, ' '); - TranslatorsContactDetails = string.Empty.PadLeft(32, ' '); - SubtitleListReferenceCode = "0 "; - CreationDate = "101021"; - RevisionDate = "101021"; - RevisionNumber = "01"; - TotalNumberOfTextAndTimingInformationBlocks = "00725"; - TotalNumberOfSubtitles = "00725"; - TotalNumberOfSubtitleGroups = "001"; - MaximumNumberOfDisplayableCharactersInAnyTextRow = "40"; - MaximumNumberOfDisplayableRows = "23"; - TimeCodeStatus = "1"; - TimeCodeStartOfProgramme = "00000000"; - TimeCodeFirstInCue = "00000001"; - TotalNumberOfDisks = "1"; - DiskSequenceNumber = "1"; - CountryOfOrigin = "USA"; - Publisher = string.Empty.PadLeft(32, ' '); - EditorsName = string.Empty.PadLeft(32, ' '); - EditorsContactDetails = string.Empty.PadLeft(32, ' '); - SpareBytes = string.Empty.PadLeft(75, ' '); - UserDefinedArea = string.Empty.PadLeft(576, ' '); - } - - public override string ToString() - { - var result = CodePageNumber + - DiskFormatCode + - DisplayStandardCode + - CharacterCodeTableNumber + - LanguageCode + - OriginalProgrammeTitle + - OriginalEpisodeTitle + - TranslatedProgrammeTitle + - TranslatedEpisodeTitle + - TranslatorsName + - TranslatorsContactDetails + - SubtitleListReferenceCode + - CreationDate + - RevisionDate + - RevisionNumber + - TotalNumberOfTextAndTimingInformationBlocks + - TotalNumberOfSubtitles + - TotalNumberOfSubtitleGroups + - MaximumNumberOfDisplayableCharactersInAnyTextRow + - MaximumNumberOfDisplayableRows + - TimeCodeStatus + - TimeCodeStartOfProgramme + - TimeCodeFirstInCue + - TotalNumberOfDisks + - DiskSequenceNumber + - CountryOfOrigin + - Publisher + - EditorsName + - EditorsContactDetails + - SpareBytes + - UserDefinedArea; - - if (result.Length == 1024) - { - return result; - } - - return "Length must be 1024 but is " + result.Length; - } - } - - /// - /// TTI block 128 bytes - /// - private class EbuTextTimingInformation - { - public byte SubtitleGroupNumber { get; set; } - public ushort SubtitleNumber { get; set; } - public byte ExtensionBlockNumber { get; set; } - public byte CumulativeStatus { get; set; } - public int TimeCodeInHours { get; set; } - public int TimeCodeInMinutes { get; set; } - public int TimeCodeInSeconds { get; set; } - public int TimeCodeInMilliseconds { get; set; } - public int TimeCodeOutHours { get; set; } - public int TimeCodeOutMinutes { get; set; } - public int TimeCodeOutSeconds { get; set; } - public int TimeCodeOutMilliseconds { get; set; } - public byte VerticalPosition { get; set; } - public byte JustificationCode { get; set; } - public byte CommentFlag { get; set; } - public string TextField { get; set; } - - public EbuTextTimingInformation() - { - SubtitleGroupNumber = 0; - ExtensionBlockNumber = 255; - CumulativeStatus = 0; - VerticalPosition = 0x16; - JustificationCode = 2; - CommentFlag = 0; - } - - public byte[] GetBytes(EbuGeneralSubtitleInformation header) - { - var buffer = new byte[128]; // Text and Timing Information (TTI) block consists of 128 bytes - - buffer[0] = SubtitleGroupNumber; - var temp = BitConverter.GetBytes(SubtitleNumber); - buffer[1] = temp[0]; - buffer[2] = temp[1]; - buffer[3] = ExtensionBlockNumber; - buffer[4] = CumulativeStatus; - - buffer[5] = (byte)TimeCodeInHours; - buffer[6] = (byte)TimeCodeInMinutes; - var frames = GetFrameFromMilliseconds(TimeCodeInMilliseconds, header.FrameRate, out var extraSeconds); - buffer[7] = (byte)(TimeCodeInSeconds + extraSeconds); - buffer[8] = frames; - - buffer[9] = (byte)TimeCodeOutHours; - buffer[10] = (byte)TimeCodeOutMinutes; - frames = GetFrameFromMilliseconds(TimeCodeOutMilliseconds, header.FrameRate, out extraSeconds); - buffer[11] = (byte)(TimeCodeOutSeconds + extraSeconds); - buffer[12] = frames; - - buffer[13] = VerticalPosition; - buffer[14] = JustificationCode; - buffer[15] = CommentFlag; - - var encoding = GetEncoding(header.CodePageNumber); - if (header.LanguageCode == LanguageCodeChinese) - { - var lines = HtmlUtil.RemoveHtmlTags(TextField, true).SplitToLines(); - var byteList = new List(); - encoding = Encoding.GetEncoding(1200); // 16-bit Unicode - for (var i = 0; i < lines.Count; i++) - { - var l = lines[i]; - if (i > 0) - { // new line - byteList.Add(0); - byteList.Add(138); - } - byteList.AddRange(encoding.GetBytes(l).ToArray()); - } - - for (var i = 0; i < 112; i++) - { - if (i < byteList.Count) - { - buffer[16 + i] = byteList[i]; - } - else - { - buffer[16 + i] = 0x8f; - } - } - - return buffer; - } - - if (header.CharacterCodeTableNumber == "00") - { - encoding = Encoding.GetEncoding(20269); - // 0xC1—0xCF combines characters - http://en.wikipedia.org/wiki/ISO/IEC_6937 - - var sbTwoChar = new StringBuilder(); - bool skipNext = false; - for (var index = 0; index < TextField.Length; index++) - { - var ch = TextField[index]; - if (skipNext) - { - skipNext = false; - } - else if (ch == 'ı' && TextField.Substring(index).StartsWith("ı̂")) // extended unicode char - rewritten as simple 'î' - looks the same as "î" but it's not...) - { - sbTwoChar.Append(encoding.GetString(new byte[] { 0xc3, 0x69 })); // Ãi - simple î - skipNext = true; - } - else if ("ÀÈÌÒÙàèìòù".Contains(ch)) - { - sbTwoChar.Append(ReplaceSpecialCharactersWithTwoByteEncoding(ch, encoding.GetString(new byte[] { 0xc1 }), "ÀÈÌÒÙàèìòù", "AEIOUaeiou")); - } - else if ("ÁĆÉÍĹŃÓŔŚÚÝŹáćéģíĺńóŕśúýź".Contains(ch)) - { - sbTwoChar.Append(ReplaceSpecialCharactersWithTwoByteEncoding(ch, encoding.GetString(new byte[] { 0xc2 }), "ÁĆÉÍĹŃÓŔŚÚÝŹáćéģíĺńóŕśúýź", "ACEILNORSUYZacegilnorsuyz")); - } - else if ("ÂĈÊĜĤÎĴÔŜÛŴŶâĉêĝĥĵôŝûŵŷîı̂".Contains(ch)) - { - sbTwoChar.Append(ReplaceSpecialCharactersWithTwoByteEncoding(ch, encoding.GetString(new byte[] { 0xc3 }), "ÂĈÊĜĤÎĴÔŜÛŴŶâĉêĝĥîĵôŝûŵŷ", "ACEGHIJOSUWYaceghijosuwy")); - } - else if ("ÃĨÑÕŨãĩñõũ".Contains(ch)) - { - sbTwoChar.Append(ReplaceSpecialCharactersWithTwoByteEncoding(ch, encoding.GetString(new byte[] { 0xc4 }), "ÃĨÑÕŨãĩñõũ", "AINOUainou")); - } - else if ("ĀĒĪŌŪāēīōū".Contains(ch)) - { - sbTwoChar.Append(ReplaceSpecialCharactersWithTwoByteEncoding(ch, encoding.GetString(new byte[] { 0xc5 }), "ĀĒĪŌŪāēīōū", "AEIOUaeiou")); - } - else if ("ĂĞŬăğŭ".Contains(ch)) - { - sbTwoChar.Append(ReplaceSpecialCharactersWithTwoByteEncoding(ch, encoding.GetString(new byte[] { 0xc6 }), "ĂĞŬăğŭ", "AGUagu")); - } - else if ("ĊĖĠİŻċėġıż".Contains(ch)) - { - sbTwoChar.Append(ReplaceSpecialCharactersWithTwoByteEncoding(ch, encoding.GetString(new byte[] { 0xc7 }), "ĊĖĠİŻċėġıż", "CEGIZcegiz")); - } - else if ("ÄËÏÖÜŸäëïöüÿ".Contains(ch)) - { - sbTwoChar.Append(ReplaceSpecialCharactersWithTwoByteEncoding(ch, encoding.GetString(new byte[] { 0xc8 }), "ÄËÏÖÜŸäëïöüÿ", "AEIOUYaeiouy")); - } - else if ("ÅŮåů".Contains(ch)) - { - sbTwoChar.Append(ReplaceSpecialCharactersWithTwoByteEncoding(ch, encoding.GetString(new byte[] { 0xca }), "ÅŮåů", "AUau")); - } - else if ("ÇĢĶĻŅŖŞŢçķļņŗşţ".Contains(ch)) - { - sbTwoChar.Append(ReplaceSpecialCharactersWithTwoByteEncoding(ch, encoding.GetString(new byte[] { 0xcb }), "ÇĢĶĻŅŖŞŢçķļņŗşţ", "CGKLNRSTcklnrst")); - } - else if ("ŐŰőű".Contains(ch)) - { - sbTwoChar.Append(ReplaceSpecialCharactersWithTwoByteEncoding(ch, encoding.GetString(new byte[] { 0xcd }), "ŐŰőű", "OUou")); - } - else if ("ĄĘĮŲąęįų".Contains(ch)) - { - sbTwoChar.Append(ReplaceSpecialCharactersWithTwoByteEncoding(ch, encoding.GetString(new byte[] { 0xce }), "ĄĘĮŲąęįų", "AEIUaeiu")); - } - else if ("ČĎĚĽŇŘŠŤŽčďěľňřšťž".Contains(ch)) - { - sbTwoChar.Append(ReplaceSpecialCharactersWithTwoByteEncoding(ch, encoding.GetString(new byte[] { 0xcf }), "ČĎĚĽŇŘŠŤŽčďěľňřšťž", "CDELNRSTZcdelnrstz")); - } - else - { - sbTwoChar.Append(ch); - } - } - - TextField = sbTwoChar.ToString(); - } - else if (header.CharacterCodeTableNumber == "01") // Latin/Cyrillic alphabet - from ISO 8859/5-1988 - { - encoding = Encoding.GetEncoding("ISO-8859-5"); - } - else if (header.CharacterCodeTableNumber == "02") // Latin/Arabic alphabet - from ISO 8859/6-1987 - { - encoding = Encoding.GetEncoding("ISO-8859-6"); - } - else if (header.CharacterCodeTableNumber == "03") // Latin/Greek alphabet - from ISO 8859/7-1987 - { - encoding = Encoding.GetEncoding("ISO-8859-7"); // or ISO-8859-1 ? - } - else if (header.CharacterCodeTableNumber == "04") // Latin/Hebrew alphabet - from ISO 8859/8-1988 - { - encoding = Encoding.GetEncoding("ISO-8859-8"); - } - - // italic/underline - var italicsOn = encoding.GetString(new byte[] { 0x80 }); - var italicsOff = encoding.GetString(new byte[] { 0x81 }); - var underlineOn = encoding.GetString(new byte[] { 0x82 }); - var underlineOff = encoding.GetString(new byte[] { 0x83 }); - var boxingOn = encoding.GetString(new byte[] { 0x84 }); - var boxingOff = encoding.GetString(new byte[] { 0x85 }); - - TextField = FixItalics(TextField); - - TextField = TextField.Replace("", italicsOn); - TextField = TextField.Replace("", italicsOn); - TextField = TextField.Replace("", italicsOff); - TextField = TextField.Replace("", italicsOff); - TextField = TextField.Replace("", underlineOn); - TextField = TextField.Replace("", underlineOn); - TextField = TextField.Replace("", underlineOff); - TextField = TextField.Replace("", underlineOff); - TextField = TextField.Replace("", boxingOn); - TextField = TextField.Replace("", boxingOn); - TextField = TextField.Replace("", boxingOff); - TextField = TextField.Replace("", boxingOff); - if (header.CharacterCodeTableNumber == "00") - { - TextField = TextField.Replace("©", encoding.GetString(new byte[] { 0xd3 })); - TextField = TextField.Replace("™", encoding.GetString(new byte[] { 0xd4 })); - TextField = TextField.Replace("♪", encoding.GetString(new byte[] { 0xd5 })); - } - - TextField = EncodeText(TextField, encoding, header.DisplayStandardCode); - TextField = HtmlUtil.RemoveHtmlTags(TextField, true); - - if (header.DisplayStandardCode != "0") // 0=Open subtitling - { - if (Configuration.Settings.SubtitleSettings.EbuStlTeletextUseBox && Configuration.Settings.SubtitleSettings.EbuStlTeletextUseDoubleHeight) - { - TextField = encoding.GetString(new byte[] { 0x0d, 0x0b, 0x0b }) + TextField; // d=double height, b=start box - } - else if (Configuration.Settings.SubtitleSettings.EbuStlTeletextUseBox) - { - TextField = encoding.GetString(new byte[] { 0x0b, 0x0b }) + TextField; // b=start box - } - else if (Configuration.Settings.SubtitleSettings.EbuStlTeletextUseDoubleHeight) - { - TextField = encoding.GetString(new byte[] { 0x0d }) + TextField; // d=double height - } - } - - // convert text to bytes - var bytes = encoding.GetBytes(TextField); - - // some fixes for bytes - if (bytes.Length == TextField.Length) - { - for (var i = 0; i < bytes.Length; i++) - { - if (TextField[i] == '#') - { - bytes[i] = 0x23; - } - else if (TextField[i] == 'Đ') - { - bytes[i] = 0xe2; - } - else if (TextField[i] == '–') // em dash - { - bytes[i] = 0xd0; - } - } - } - - for (var i = 0; i < 112; i++) - { - if (i < bytes.Length) - { - buffer[16 + i] = bytes[i]; - } - else - { - buffer[16 + i] = 0x8f; - } - } - return buffer; - } - - private static string FixItalics(string text) - { - var italicOn = false; - var sb = new StringBuilder(); - foreach (var line in HtmlUtil.FixInvalidItalicTags(text).SplitToLines()) - { - var s = line; - if (italicOn && !s.TrimStart().StartsWith("", StringComparison.Ordinal)) - { - s = "" + s; - } - - var endTagIndex = s.LastIndexOf("", StringComparison.Ordinal); - if (s.LastIndexOf("", StringComparison.Ordinal) > endTagIndex) - { - italicOn = true; - } - else if (endTagIndex >= 0) - { - italicOn = false; - } - - if (italicOn) - { - sb.AppendLine(s + ""); - } - else - { - sb.AppendLine(s); - } - } - - return sb.ToString().TrimEnd(); - } - - private static string EncodeText(string text, Encoding encoding, string displayStandardCode) - { - // newline - var newline = encoding.GetString(new byte[] { 0x8a, 0x8a }); - if (Configuration.Settings.SubtitleSettings.EbuStlTeletextUseBox && Configuration.Settings.SubtitleSettings.EbuStlTeletextUseDoubleHeight) - { - newline = encoding.GetString(new byte[] { 0x0a, 0x0a, 0x8a, 0x8a, 0x0d, 0x0b, 0x0b }); // 0a==end box, 0d==double height, 0b==start box - } - else if (Configuration.Settings.SubtitleSettings.EbuStlTeletextUseBox) - { - newline = "\u000a\u000a" + - string.Empty.PadLeft(Configuration.Settings.SubtitleSettings.EbuStlNewLineRows, '\u008a') + - encoding.GetString(new byte[] { 0x0b, 0x0b }); // 0a==end box, 0b==start box - } - else if (Configuration.Settings.SubtitleSettings.EbuStlTeletextUseDoubleHeight) - { - newline = encoding.GetString(new byte[] { 0x8a, 0x8a, 0x0d, 0x0d }); // 0d==double height - } - - if (displayStandardCode == "0") // 0=Open subtitling - { - newline = encoding.GetString(new byte[] { 0x8A }); //8Ah=CR/LF - } - - var lastColor = string.Empty; - var sb = new StringBuilder(); - var list = text.SplitToLines(); - for (var index = 0; index < list.Count; index++) - { - if (index > 0) - { - sb.Append(newline); - if (displayStandardCode != "0" && !string.IsNullOrEmpty(lastColor)) - { - sb.Append(lastColor); - } - } - - var line = list[index]; - var i = 0; - while (i < line.Length) - { - var newStart = line.Substring(i); - if (newStart.StartsWith("', i); - if (end > 0) - { - if (displayStandardCode != "0") - { - lastColor = GetColor(encoding, line, i); - sb.Append(lastColor); - } - - i = end + 1; - } - } - else if (newStart == "") - { - i += "".Length; - lastColor = string.Empty; - } - else if (newStart.StartsWith("", StringComparison.OrdinalIgnoreCase)) - { - if (displayStandardCode != "0") - { - sb.Append(encoding.GetString(new byte[] { 0x07 })); // white - } - - i += "".Length; - } - else - { - sb.Append(line.Substring(i, 1)); - i++; - } - } - } - - if (Configuration.Settings.SubtitleSettings.EbuStlTeletextUseBox && displayStandardCode != "0") - { - sb.Append(encoding.GetString(new byte[] { 0x0a, 0x0a })); //a=end box - } - - return sb.ToString(); - } - - private static string GetColor(Encoding encoding, string line, int i) - { - var end = line.IndexOf('>', i); - if (end > 0) - { - string f = line.Substring(i, end - i); - if (f.Contains(" color=", StringComparison.OrdinalIgnoreCase)) - { - var colorStart = f.IndexOf(" color=", StringComparison.OrdinalIgnoreCase); - if (line.IndexOf('"', colorStart + " color=".Length + 1) > 0) - { - var colorEnd = f.IndexOf('"', colorStart + " color=".Length + 1); - if (colorStart > 1) - { - string color = f.Substring(colorStart + 7, colorEnd - (colorStart + 7)); - color = color.Trim('\''); - color = color.Trim('\"'); - color = color.Trim('#'); - return GetNearestEbuColorCode(color, encoding); - } - } - } - } - return string.Empty; - } - - private static string GetNearestEbuColorCode(string color, Encoding encoding) - { - color = color.ToLowerInvariant(); - if (color == "black" || color == "000000") - { - return encoding.GetString(new byte[] { 0x00 }); // black - } - - if (color == "red" || color == "ff0000") - { - return encoding.GetString(new byte[] { 0x01 }); // red - } - - if (color == "green" || color == "00ff00") - { - return encoding.GetString(new byte[] { 0x02 }); // green - } - - if (color == "yellow" || color == "ffff00") - { - return encoding.GetString(new byte[] { 0x03 }); // yellow - } - - if (color == "blue" || color == "0000ff") - { - return encoding.GetString(new byte[] { 0x04 }); // blue - } - - if (color == "magenta" || color == "ff00ff") - { - return encoding.GetString(new byte[] { 0x05 }); // magenta - } - - if (color == "cyan" || color == "00ffff") - { - return encoding.GetString(new byte[] { 0x06 }); // cyan - } - - if (color == "white" || color == "ffffff") - { - return encoding.GetString(new byte[] { 0x07 }); // white - } - - if (color.Length == 6) - { - if (RegExprColor.IsMatch(color)) - { - const int maxDiff = 130; - int r = int.Parse(color.Substring(0, 2), NumberStyles.HexNumber); - int g = int.Parse(color.Substring(2, 2), NumberStyles.HexNumber); - int b = int.Parse(color.Substring(4, 2), NumberStyles.HexNumber); - if (r < maxDiff && g < maxDiff && b < maxDiff) - { - return encoding.GetString(new byte[] { 0x00 }); // black - } - - if (r > 255 - maxDiff && g < maxDiff && b < maxDiff) - { - return encoding.GetString(new byte[] { 0x01 }); // red - } - - if (r < maxDiff && g > 255 - maxDiff && b < maxDiff) - { - return encoding.GetString(new byte[] { 0x02 }); // green - } - - if (r > 255 - maxDiff && g > 255 - maxDiff && b < maxDiff) - { - return encoding.GetString(new byte[] { 0x03 }); // yellow - } - - if (r < maxDiff && g < maxDiff && b > 255 - maxDiff) - { - return encoding.GetString(new byte[] { 0x04 }); // blue - } - - if (r > 255 - maxDiff && g < maxDiff && b > 255 - maxDiff) - { - return encoding.GetString(new byte[] { 0x05 }); // magenta - } - - if (r < maxDiff && g > 255 - maxDiff && b > 255 - maxDiff) - { - return encoding.GetString(new byte[] { 0x06 }); // cyan - } - - if (r > 255 - maxDiff && g > 255 - maxDiff && b > 255 - maxDiff) - { - return encoding.GetString(new byte[] { 0x07 }); // white - } - } - } - return string.Empty; - } - - private static string ReplaceSpecialCharactersWithTwoByteEncoding(char ch, string specialCharacter, string originalCharacters, string newCharacters) - { - if (originalCharacters.Length != newCharacters.Length) - { - throw new ArgumentException("originalCharacters and newCharacters must have equal length"); - } - - for (var i = 0; i < newCharacters.Length; i++) - { - if (originalCharacters[i] == ch) - { - return specialCharacter + newCharacters[i]; - } - } - return ch.ToString(); - } - - public static byte GetFrameFromMilliseconds(int milliseconds, double frameRate, out byte extraSeconds) - { - extraSeconds = 0; - var fr = Math.Round(milliseconds / (TimeCode.BaseUnit / frameRate)); - if (fr >= frameRate) - { - fr = 0; - extraSeconds = 1; - } - - return (byte)fr; - } - } - - public override string Extension => ".stl"; - - public const string NameOfFormat = "EBU STL"; - - public override string Name => NameOfFormat; - - public bool Save(string fileName, Subtitle subtitle) - { - return Save(fileName, subtitle, false); - } - - public bool Save(string fileName, Subtitle subtitle, bool batchMode, EbuGeneralSubtitleInformation header = null) - { - using (var ms = new MemoryStream()) - { - var ok = Save(fileName, ms, subtitle, batchMode, header); - if (ok) - { - ms.Position = 0; - using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write)) - { - ms.CopyTo(fs); - } - } - return ok; - } - } - - public bool Save(string fileName, Stream stream, Subtitle subtitle, bool batchMode, EbuGeneralSubtitleInformation header) - { - if (header == null) - { - header = new EbuGeneralSubtitleInformation { LanguageCode = AutoDetectLanguageCode(subtitle) }; - } - - if (EbuUiHelper == null) - { - return false; - } - - if (subtitle.Header != null && subtitle.Header.Length == 1024 && (subtitle.Header.Contains("STL24") || subtitle.Header.Contains("STL25") || subtitle.Header.Contains("STL29") || subtitle.Header.Contains("STL30"))) - { - header = ReadHeader(GetEncoding(subtitle.Header.Substring(0, 3)).GetBytes(subtitle.Header)); - EbuUiHelper.Initialize(header, EbuUiHelper.JustificationCode, null, subtitle); - } - else - { - EbuUiHelper.Initialize(header, EbuUiHelper.JustificationCode, fileName, subtitle); - } - - if (!batchMode && !EbuUiHelper.ShowDialogOk()) - { - return false; - } - - header.TotalNumberOfSubtitles = subtitle.Paragraphs.Count.ToString("D5"); // seems to be 1 higher than actual number of subtitles - header.TotalNumberOfTextAndTimingInformationBlocks = header.TotalNumberOfSubtitles; - - var today = $"{DateTime.Now:yyMMdd}"; - if (today.Length == 6) - { - header.CreationDate = today; - header.RevisionDate = today; - } - - var firstParagraph = subtitle.GetParagraphOrDefault(0); - if (firstParagraph != null) - { - var tc = firstParagraph.StartTime; - var frames = EbuTextTimingInformation.GetFrameFromMilliseconds(tc.Milliseconds, header.FrameRate, out var extraSeconds); - var firstTimeCode = $"{tc.Hours:00}{tc.Minutes:00}{tc.Seconds + extraSeconds:00}{frames:00}"; - if (firstTimeCode.Length == 8) - { - header.TimeCodeFirstInCue = firstTimeCode; - } - } - - var buffer = GetEncoding(header.CodePageNumber).GetBytes(header.ToString()); - stream.Write(buffer, 0, buffer.Length); - - var subtitleNumber = 0; - foreach (var p in subtitle.Paragraphs) - { - var tti = new EbuTextTimingInformation(); - - if (!int.TryParse(header.MaximumNumberOfDisplayableRows, out var rows)) - { - rows = 23; - } - - if (header.DisplayStandardCode == "1" || header.DisplayStandardCode == "2") // teletext - { - rows = 23; - } - else if (header.DisplayStandardCode == "0" && header.MaximumNumberOfDisplayableRows == "02") // open subtitling - { - rows = 15; - } - - var text = p.Text.Trim(Utilities.NewLineChars); - if (text.StartsWith("{\\an7}", StringComparison.Ordinal) || text.StartsWith("{\\an8}", StringComparison.Ordinal) || text.StartsWith("{\\an9}", StringComparison.Ordinal)) - { - tti.VerticalPosition = (byte)Configuration.Settings.SubtitleSettings.EbuStlMarginTop; // top (vertical) - if (header.DisplayStandardCode == "1" || header.DisplayStandardCode == "2") // teletext - { - tti.VerticalPosition++; - } - } - else if (text.StartsWith("{\\an4}", StringComparison.Ordinal) || text.StartsWith("{\\an5}", StringComparison.Ordinal) || text.StartsWith("{\\an6}", StringComparison.Ordinal)) - { - tti.VerticalPosition = (byte)(rows / 2); // middle (vertical) - } - else - { - var numberOfLineBreaks = Math.Max(0, Utilities.GetNumberOfLines(text) - 1); - var startRow = rows - Configuration.Settings.SubtitleSettings.EbuStlMarginBottom - - numberOfLineBreaks * Configuration.Settings.SubtitleSettings.EbuStlNewLineRows; - if (startRow < 0) - { - startRow = 0; - } - - tti.VerticalPosition = (byte)startRow; // bottom (vertical) - } - - tti.JustificationCode = EbuUiHelper.JustificationCode; // use default justification - if (text.StartsWith("{\\an1}", StringComparison.Ordinal) || text.StartsWith("{\\an4}", StringComparison.Ordinal) || text.StartsWith("{\\an7}", StringComparison.Ordinal)) - { - tti.JustificationCode = 1; // 01h=left-justified text - } - else if (text.StartsWith("{\\an3}", StringComparison.Ordinal) || text.StartsWith("{\\an6}", StringComparison.Ordinal) || text.StartsWith("{\\an9}", StringComparison.Ordinal)) - { - tti.JustificationCode = 3; // 03h=right-justified - } - else if (text.StartsWith("{\\an2}", StringComparison.Ordinal) || text.StartsWith("{\\an5}", StringComparison.Ordinal) || text.StartsWith("{\\an8}", StringComparison.Ordinal)) - { - tti.JustificationCode = 2; // 02h=centred text - } - - // replace some unsupported characters - text = text.Replace("„", "\""); // lower quote - text = text.Replace("‚", "’"); // lower apostrophe - text = text.Replace("♫", "♪"); // only music single note supported - text = text.Replace("…", "..."); // fix Unicode ellipsis - - tti.SubtitleNumber = (ushort)subtitleNumber; - tti.TextField = text; - int startTag = tti.TextField.IndexOf('}'); - if (tti.TextField.StartsWith("{\\", StringComparison.Ordinal) && startTag > 0 && startTag < 10) - { - tti.TextField = tti.TextField.Remove(0, startTag + 1); - } - - if (!p.StartTime.IsMaxTime) - { - tti.TimeCodeInHours = p.StartTime.Hours; - tti.TimeCodeInMinutes = p.StartTime.Minutes; - tti.TimeCodeInSeconds = p.StartTime.Seconds; - tti.TimeCodeInMilliseconds = p.StartTime.Milliseconds; - } - - if (!p.EndTime.IsMaxTime) - { - tti.TimeCodeOutHours = p.EndTime.Hours; - tti.TimeCodeOutMinutes = p.EndTime.Minutes; - tti.TimeCodeOutSeconds = p.EndTime.Seconds; - tti.TimeCodeOutMilliseconds = p.EndTime.Milliseconds; - } - - buffer = tti.GetBytes(header); - stream.Write(buffer, 0, buffer.Length); - subtitleNumber++; - } - return true; - } - - private static string AutoDetectLanguageCode(Subtitle subtitle) - { - if (subtitle == null || subtitle.Paragraphs.Count == 0) - { - return "00"; // Unknown/not applicable - } - - var languageCode = LanguageAutoDetect.AutoDetectGoogleLanguageOrNull(subtitle); - switch (languageCode) - { - case "sq": return "01"; // Albanian - case "br": return "02"; // Breton - case "ca": return "03"; // Catalan - case "hr": return "04"; // Croatian - case "cy": return "05"; // Welsh - case "cs": return "06"; // Czech - case "da": return "07"; // Danish - case "de": return "08"; // German - case "en": return "09"; // English - case "es": return "0A"; // Spanish - case "eo": return "0B"; // Esperanto - case "et": return "0C"; // Estonian - case "eu": return "0D"; // Basque - case "fo": return "0E"; // Faroese - case "fr": return "0F"; // French - case "fy": return "10"; // Frisian - case "ga": return "11"; // Irish - case "gd": return "12"; // Gaelic - case "gl": return "13"; // Galician - case "is": return "14"; // Icelandic - case "it": return "15"; // Italian - case "Lappish": return "16"; // Lappish - case "la": return "17"; // Latin - case "lv": return "18"; // Latvian": - case "lb": return "19"; // Luxembourgi - case "lt": return "1A"; // Lithuanian - case "hu": return "1B"; // Hungarian - case "mt": return "1C"; // Maltese - case "nl": return "1D"; // Dutch - case "nb": return "1E"; // Norwegian - case "oc": return "1F"; // Occitan - case "pl": return "20"; // Polish - case "pt": return "21"; // Portuguese - case "ro": return "22"; // Romanian - case "rm": return "23"; // Romansh - case "sr": return "24"; // Serbian - case "sk": return "25"; // Slovak - case "sl": return "26"; // Slovenian - case "fi": return "27"; // Finnish - case "sv": return "28"; // Swedish - case "tr": return "29"; // Turkish - case "Flemish": return "2A"; // Flemish - case "Wallon": return "2B"; // Wallon - } - - return "09"; // English - default - } - - public override bool IsMine(List lines, string fileName) - { - if (!string.IsNullOrEmpty(fileName) && File.Exists(fileName)) - { - var fi = new FileInfo(fileName); - if (fi.Length >= 1024 + 128 && fi.Length < 2048000) // not too small or too big - { - try - { - byte[] buffer = FileUtil.ReadAllBytesShared(fileName); - EbuGeneralSubtitleInformation header = ReadHeader(buffer); - if (header.DiskFormatCode.StartsWith("STL23", StringComparison.Ordinal) || - header.DiskFormatCode.StartsWith("STL24", StringComparison.Ordinal) || - header.DiskFormatCode.StartsWith("STL25", StringComparison.Ordinal) || - header.DiskFormatCode.StartsWith("STL29", StringComparison.Ordinal) || - header.DiskFormatCode.StartsWith("STL30", StringComparison.Ordinal) || - header.DiskFormatCode.StartsWith("STL35", StringComparison.Ordinal) || - header.DiskFormatCode.StartsWith("STL48", StringComparison.Ordinal) || - header.DiskFormatCode.StartsWith("STL50", StringComparison.Ordinal) || - header.DiskFormatCode.StartsWith("STL60", StringComparison.Ordinal) || - "012 ".Contains(header.DisplayStandardCode) && "437|850|860|863|865".Contains(header.CodePageNumber)) - { - return Utilities.IsInteger(header.CodePageNumber) || fileName.EndsWith(".stl", StringComparison.OrdinalIgnoreCase); - } - } - catch - { - return false; - } - } - } - return false; - } - - public override string ToText(Subtitle subtitle, string title) - { - return "Not supported!"; - } - - public void LoadSubtitle(Subtitle subtitle, byte[] buffer) - { - subtitle.Paragraphs.Clear(); - subtitle.Header = null; - var header = ReadHeader(buffer); - subtitle.Header = Encoding.UTF8.GetString(buffer); - Paragraph last = null; - byte lastExtensionBlockNumber = 0xff; - JustificationCodes = new List(); - VerticalPositions = new List(); - Configuration.Settings.General.CurrentFrameRate = header.FrameRate; - foreach (var tti in ReadTextAndTiming(buffer, header)) - { - if (tti.ExtensionBlockNumber != 0xfe) // FEh : Reserved for User Data - { - var p = new Paragraph - { - Text = tti.TextField, - StartTime = new TimeCode(tti.TimeCodeInHours, tti.TimeCodeInMinutes, tti.TimeCodeInSeconds, tti.TimeCodeInMilliseconds), - EndTime = new TimeCode(tti.TimeCodeOutHours, tti.TimeCodeOutMinutes, tti.TimeCodeOutSeconds, tti.TimeCodeOutMilliseconds), - MarginV = tti.VerticalPosition.ToString(CultureInfo.InvariantCulture) - }; - - if (Math.Abs(p.StartTime.TotalMilliseconds) < 0.01 && Math.Abs(p.EndTime.TotalMilliseconds) < 0.01) - { - p.StartTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; - p.EndTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; - } - - if (lastExtensionBlockNumber != 0xff && last != null) - { - last.Text += p.Text; // merge text - } - else - { - subtitle.Paragraphs.Add(p); - last = p; - } - - p.Text = HtmlUtil.FixInvalidItalicTags(p.Text); - lastExtensionBlockNumber = tti.ExtensionBlockNumber; - } - } - subtitle.Renumber(); - Header = header; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - LoadSubtitle(subtitle, FileUtil.ReadAllBytesShared(fileName)); - } - - public static EbuGeneralSubtitleInformation ReadHeader(byte[] buffer) - { - var enc = GetEncoding(Encoding.ASCII.GetString(buffer, 0, 3)); - var header = new EbuGeneralSubtitleInformation - { - CodePageNumber = enc.GetString(buffer, 0, 3), - DiskFormatCode = enc.GetString(buffer, 3, 8), - DisplayStandardCode = enc.GetString(buffer, 11, 1), - CharacterCodeTableNumber = enc.GetString(buffer, 12, 2), - LanguageCode = enc.GetString(buffer, 14, 2), - OriginalProgrammeTitle = enc.GetString(buffer, 16, 32), - OriginalEpisodeTitle = enc.GetString(buffer, 48, 32), - TranslatedProgrammeTitle = enc.GetString(buffer, 80, 32), - TranslatedEpisodeTitle = enc.GetString(buffer, 112, 32), - TranslatorsName = enc.GetString(buffer, 144, 32), - TranslatorsContactDetails = enc.GetString(buffer, 176, 32), - SubtitleListReferenceCode = enc.GetString(buffer, 208, 16), - CreationDate = enc.GetString(buffer, 224, 6), - RevisionDate = enc.GetString(buffer, 230, 6), - RevisionNumber = enc.GetString(buffer, 236, 2), - TotalNumberOfTextAndTimingInformationBlocks = enc.GetString(buffer, 238, 5), - TotalNumberOfSubtitles = enc.GetString(buffer, 243, 5), - TotalNumberOfSubtitleGroups = enc.GetString(buffer, 248, 3), - MaximumNumberOfDisplayableCharactersInAnyTextRow = enc.GetString(buffer, 251, 2), - MaximumNumberOfDisplayableRows = enc.GetString(buffer, 253, 2), - TimeCodeStatus = enc.GetString(buffer, 255, 1), - TimeCodeStartOfProgramme = enc.GetString(buffer, 256, 8), - CountryOfOrigin = enc.GetString(buffer, 274, 3), - SpareBytes = enc.GetString(buffer, 373, 75), - UserDefinedArea = enc.GetString(buffer, 448, 576) - }; - return header; - } - - private static Encoding GetEncoding(string codePageNumber) - { - try - { - return Encoding.GetEncoding(int.TryParse(codePageNumber, out int cp) ? cp : 437); - } - catch (NotSupportedException) - { - return Encoding.GetEncoding(437); - } - } - - /// - /// Get text with regard code page from header - /// - /// Skip next character - /// EBU header - /// data buffer - /// index to current byte in buffer - /// Character at index - private static string GetCharacter(out bool skipNext, EbuGeneralSubtitleInformation header, byte[] buffer, int index) - { - skipNext = false; - - if (header.LanguageCode == LanguageCodeChinese) - { - skipNext = true; - return Encoding.GetEncoding(1200).GetString(buffer, index, 2); // 16-bit Unicode - } - - if (header.CharacterCodeTableNumber == "00") - { - var b = buffer[index]; - if (b == 0xd3) - { - return "©"; - } - - if (b == 0xd4) - { - return "™"; - } - - if (b == 0xd5) - { - return "♪"; - } - - //note that 0xC1—0xCF combines characters - http://en.wikipedia.org/wiki/ISO/IEC_6937 - var encoding = Encoding.GetEncoding(20269); - if (index + 2 > buffer.Length) - { - return string.Empty; - } - - var next = encoding.GetString(buffer, index + 1, 1); - switch (b) - { - case 0xc1: // Grave - skipNext = @"AEIOUaeiou".Contains(next); - switch (next) - { - case "A": return "À"; - case "E": return "È"; - case "I": return "Ì"; - case "O": return "Ò"; - case "U": return "Ù"; - case "a": return "à"; - case "e": return "è"; - case "i": return "ì"; - case "o": return "ò"; - case "u": return "ù"; - } - return string.Empty; - case 0xc2: // Acute - skipNext = @"ACEILNORSUYZacegilnorsuyz".Contains(next); - switch (next) - { - case "A": return "Á"; - case "C": return "Ć"; - case "E": return "É"; - case "I": return "Í"; - case "L": return "Ĺ"; - case "N": return "Ń"; - case "O": return "Ó"; - case "R": return "Ŕ"; - case "S": return "Ś"; - case "U": return "Ú"; - case "Y": return "Ý"; - case "Z": return "Ź"; - case "a": return "á"; - case "c": return "ć"; - case "e": return "é"; - case "g": return "ģ"; - case "i": return "í"; - case "l": return "ĺ"; - case "n": return "ń"; - case "o": return "ó"; - case "r": return "ŕ"; - case "s": return "ś"; - case "u": return "ú"; - case "y": return "ý"; - case "z": return "ź"; - } - return string.Empty; - case 0xc3: // Circumflex - skipNext = @"ACEGHIJOSUWYaceghjosuwyıi".Contains(next); - switch (next) - { - case "A": return "Â"; - case "C": return "Ĉ"; - case "E": return "Ê"; - case "G": return "Ĝ"; - case "H": return "Ĥ"; - case "I": return "Î"; - case "J": return "Ĵ"; - case "O": return "Ô"; - case "S": return "Ŝ"; - case "U": return "Û"; - case "W": return "Ŵ"; - case "Y": return "Ŷ"; - case "a": return "â"; - case "c": return "ĉ"; - case "e": return "ê"; - case "g": return "ĝ"; - case "h": return "ĥ"; - case "j": return "ĵ"; - case "o": return "ô"; - case "s": return "ŝ"; - case "u": return "û"; - case "w": return "ŵ"; - case "y": return "ŷ"; - case "ı": return "ı̂"; - case "i": return "î"; - } - return string.Empty; - case 0xc4: // Tilde - skipNext = @"AINOUainou".Contains(next); - switch (next) - { - case "A": return "Ã"; - case "I": return "Ĩ"; - case "N": return "Ñ"; - case "O": return "Õ"; - case "U": return "Ũ"; - case "a": return "ã"; - case "i": return "ĩ"; - case "n": return "ñ"; - case "o": return "õ"; - case "u": return "ũ"; - } - return string.Empty; - case 0xc5: // Macron - skipNext = @"AEIOUaeiou".Contains(next); - switch (next) - { - case "A": return "Ā"; - case "E": return "Ē"; - case "I": return "Ī"; - case "O": return "Ō"; - case "U": return "Ū"; - case "a": return "ā"; - case "e": return "ē"; - case "i": return "ī"; - case "o": return "ō"; - case "u": return "ū"; - } - return string.Empty; - case 0xc6: // Breve - skipNext = @"AGUagu".Contains(next); - switch (next) - { - case "A": return "Ă"; - case "G": return "Ğ"; - case "U": return "Ŭ"; - case "a": return "ă"; - case "g": return "ğ"; - case "u": return "ŭ"; - } - return string.Empty; - case 0xc7: // Dot - skipNext = @"CEGIZcegiz".Contains(next); - switch (next) - { - case "C": return "Ċ"; - case "E": return "Ė"; - case "G": return "Ġ"; - case "I": return "İ"; - case "Z": return "Ż"; - case "c": return "ċ"; - case "e": return "ė"; - case "g": return "ġ"; - case "i": return "ı"; - case "z": return "ż"; - } - return string.Empty; - case 0xc8: // Umlaut or diæresis - skipNext = @"AEIOUYaeiouy".Contains(next); - switch (next) - { - case "A": return "Ä"; - case "E": return "Ë"; - case "I": return "Ï"; - case "O": return "Ö"; - case "U": return "Ü"; - case "Y": return "Ÿ"; - case "a": return "ä"; - case "e": return "ë"; - case "i": return "ï"; - case "o": return "ö"; - case "u": return "ü"; - case "y": return "ÿ"; - } - return string.Empty; - case 0xca: // Ring - skipNext = @"AUau".Contains(next); - switch (next) - { - case "A": return "Å"; - case "U": return "Ů"; - case "a": return "å"; - case "u": return "ů"; - } - return string.Empty; - case 0xcb: // Cedilla - skipNext = @"CGKLNRSTcklnrst".Contains(next); - switch (next) - { - case "C": return "Ç"; - case "G": return "Ģ"; - case "K": return "Ķ"; - case "L": return "Ļ"; - case "N": return "Ņ"; - case "R": return "Ŗ"; - case "S": return "Ş"; - case "T": return "Ţ"; - case "c": return "ç"; - case "k": return "ķ"; - case "l": return "ļ"; - case "n": return "ņ"; - case "r": return "ŗ"; - case "s": return "ş"; - case "t": return "ţ"; - } - return string.Empty; - case 0xcd: // DoubleAcute - skipNext = @"OUou".Contains(next); - switch (next) - { - case "O": return "Ő"; - case "U": return "Ű"; - case "o": return "ő"; - case "u": return "ű"; - } - return string.Empty; - case 0xce: // Ogonek - skipNext = @"AEIUaeiu".Contains(next); - switch (next) - { - case "A": return "Ą"; - case "E": return "Ę"; - case "I": return "Į"; - case "U": return "Ų"; - case "a": return "ą"; - case "e": return "ę"; - case "i": return "į"; - case "u": return "ų"; - } - return string.Empty; - case 0xcf: // Caron - skipNext = @"CDELNRSTZcdelnrstz".Contains(next); - switch (next) - { - case "C": return "Č"; - case "D": return "Ď"; - case "E": return "Ě"; - case "L": return "Ľ"; - case "N": return "Ň"; - case "R": return "Ř"; - case "S": return "Š"; - case "T": return "Ť"; - case "Z": return "Ž"; - case "c": return "č"; - case "d": return "ď"; - case "e": return "ě"; - case "l": return "ľ"; - case "n": return "ň"; - case "r": return "ř"; - case "s": return "š"; - case "t": return "ť"; - case "z": return "ž"; - } - return string.Empty; - default: - return encoding.GetString(buffer, index, 1); - } - } - - if (header.CharacterCodeTableNumber == "01") // Latin/Cyrillic alphabet - from ISO 8859/5-1988 - { - return Encoding.GetEncoding("ISO-8859-5").GetString(buffer, index, 1); - } - - if (header.CharacterCodeTableNumber == "02") // Latin/Arabic alphabet - from ISO 8859/6-1987 - { - return Encoding.GetEncoding("ISO-8859-6").GetString(buffer, index, 1); - } - - if (header.CharacterCodeTableNumber == "03") // Latin/Greek alphabet - from ISO 8859/7-1987 - { - return Encoding.GetEncoding("ISO-8859-7").GetString(buffer, index, 1); // or ISO-8859-1 ? - } - - if (header.CharacterCodeTableNumber == "04") // Latin/Hebrew alphabet - from ISO 8859/8-1988 - { - return Encoding.GetEncoding("ISO-8859-8").GetString(buffer, index, 1); - } - - return string.Empty; - } - - /// - /// Read Text and Timing Information (TTI) block. - /// Each Text and Timing Information (TTI) block consists of 128 bytes. - /// - private IEnumerable ReadTextAndTiming(byte[] buffer, EbuGeneralSubtitleInformation header) - { - const int startOfTextAndTimingBlock = 1024; - const int ttiSize = 128; - const byte italicsOn = 0x80; - const byte italicsOff = 0x81; - const byte underlineOn = 0x82; - const byte underlineOff = 0x83; - const byte boxingOn = 0x84; - const byte boxingOff = 0x85; - - var list = new List(); - int index = startOfTextAndTimingBlock; - while (index + ttiSize <= buffer.Length) - { - var tti = new EbuTextTimingInformation - { - SubtitleGroupNumber = buffer[index], - SubtitleNumber = (ushort)(buffer[index + 2] * 256 + buffer[index + 1]), - ExtensionBlockNumber = buffer[index + 3], - CumulativeStatus = buffer[index + 4], - TimeCodeInHours = buffer[index + 5 + 0], - TimeCodeInMinutes = buffer[index + 5 + 1], - TimeCodeInSeconds = buffer[index + 5 + 2], - TimeCodeInMilliseconds = FramesToMillisecondsMax999(buffer[index + 5 + 3]), - TimeCodeOutHours = buffer[index + 9 + 0], - TimeCodeOutMinutes = buffer[index + 9 + 1], - TimeCodeOutSeconds = buffer[index + 9 + 2], - TimeCodeOutMilliseconds = FramesToMillisecondsMax999(buffer[index + 9 + 3]), - VerticalPosition = buffer[index + 13], - JustificationCode = buffer[index + 14], - CommentFlag = buffer[index + 15] - }; - VerticalPositions.Add(tti.VerticalPosition); - JustificationCodes.Add(tti.JustificationCode); - - // Text block - // - has a fixed length of 112 byte - // - 8Ah = new line - // - unused space = 8Fh - int i = index + 16; // text block start at 17th byte (index 16) - var open = header.DisplayStandardCode != "1" && header.DisplayStandardCode != "2"; - var closed = header.DisplayStandardCode != "0"; - int max = i + 112; - var sb = new StringBuilder(); - while (i < max) - { - var b = buffer[i]; - if (b <= 0x1f) // Closed - Teletext control codes - { - if (closed) - { - var tag = GetColorOrTag(b); - if (!string.IsNullOrEmpty(tag)) - { - sb.Append(tag); - } - } - } - else if (b >= 0x20 && b <= 0x7f) // Both - Character codes - { - var ch = GetCharacter(out var skipNext, header, buffer, i); - sb.Append(ch); - if (skipNext) - { - i++; - } - } - else if (b >= 0x80 && b <= 0x85) // Open - italic/underline/boxing - { - if (open) - { - if (b == italicsOn && header.LanguageCode != LanguageCodeChinese) - { - sb.Append(""); - } - else if (b == italicsOff && header.LanguageCode != LanguageCodeChinese) - { - sb.Append(""); - } - else if (b == underlineOn && header.LanguageCode != LanguageCodeChinese) - { - sb.Append(""); - } - else if (b == underlineOff && header.LanguageCode != LanguageCodeChinese) - { - sb.Append(""); - } - else if (b == boxingOn && header.LanguageCode != LanguageCodeChinese) - { - sb.Append(""); - } - else if (b == boxingOff && header.LanguageCode != LanguageCodeChinese) - { - sb.Append(""); - } - } - } - else if (b >= 0x86 && b <= 0x89) // Both - Reserved for future use - { - } - else if (b == 0x8a) // Both - CR/LF - { - sb.AppendLine(); - } - else if (b >= 0x8b && b <= 0x8e) // Both - Reserved for future use - { - } - else if (b == 0x8f) // Both - unused space - { - } - else if (b >= 0x90 && b <= 0x9f) // Both - Reserved for future use - { - } - else if (b >= 0xa1 && b <= 0xff) // Both - Character codes - { - var ch = GetCharacter(out var skipNext, header, buffer, i); - sb.Append(ch); - if (skipNext) - { - i++; - } - } - i++; - } - tti.TextField = FixSpacesAndTags(sb.ToString()); - - if (!int.TryParse(header.MaximumNumberOfDisplayableRows, out var rows)) - { - rows = 23; - } - - if (tti.VerticalPosition < 3) - { - if (tti.JustificationCode == 1) // left - { - tti.TextField = "{\\an7}" + tti.TextField; - } - else if (tti.JustificationCode == 3) // right - { - tti.TextField = "{\\an9}" + tti.TextField; - } - else - { - tti.TextField = "{\\an8}" + tti.TextField; - } - } - else if (tti.VerticalPosition <= rows / 2 + 1) - { - if (tti.JustificationCode == 1) // left - { - tti.TextField = "{\\an4}" + tti.TextField; - } - else if (tti.JustificationCode == 3) // right - { - tti.TextField = "{\\an6}" + tti.TextField; - } - else - { - tti.TextField = "{\\an5}" + tti.TextField; - } - } - else - { - if (tti.JustificationCode == 1) // left - { - tti.TextField = "{\\an1}" + tti.TextField; - } - else if (tti.JustificationCode == 3) // right - { - tti.TextField = "{\\an3}" + tti.TextField; - } - } - index += ttiSize; - list.Add(tti); - } - return list; - } - - private static string GetColorOrTag(byte b) - { - switch (b) - { - case 0x00: - return ""; - case 0x01: - return ""; - case 0x02: - return ""; - case 0x03: - return ""; - case 0x04: - return ""; - case 0x05: - return ""; - case 0x06: - return ""; - case 0x07: - return ""; - //case 0x0a: - // return ""; - //case 0x0b: - // return ""; - } - return null; - } - - private static string FixSpacesAndTags(string text) - { - text = text.Trim(); - while (text.Contains(" ")) - { - text = text.Replace(" ", " "); - } - - var match = FontTagsNoSpace1.Match(text); - while (match.Success) - { - text = text.Remove(match.Index, match.Length).Insert(match.Index, match.Value.Replace(" ", string.Empty).Contains("", string.Empty); - } - - while (text.Contains(Environment.NewLine + Environment.NewLine)) - { - text = text.Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); - } - - var lines = text.SplitToLines(); - - // fix multi font tags, e.g. a color in the middle of a line - for (var index = 0; index < lines.Count; index++) - { - var whiteTag = ""; - var line = lines[index]; - var changed = false; - var count = Utilities.CountTagInText(line, " 1) - { - count = 0; - var endTags = 0; - var idx = line.IndexOf(" 0) - { - count++; - var start = line.Substring(idx); - if (count == 1 && start.StartsWith(whiteTag)) - { - line = line.Remove(idx, whiteTag.Length); - idx--; - changed = true; - lines[index] = line; - } - else if (count > 1 && start.StartsWith(whiteTag)) - { - line = line.Remove(idx, whiteTag.Length).Insert(idx, ""); - changed = true; - lines[index] = line; - endTags++; - count--; - } - else if (count > 1 && count > endTags + 1 && !start.StartsWith(whiteTag)) - { - line = line.Insert(idx, ""); - changed = true; - lines[index] = line; - idx += "".Length; - endTags++; - } - idx = line.IndexOf(" 0) - { - sb.Append(s); - if (count == 1 && !s.Contains("")) - { - sb.Append(""); - } - - sb.AppendLine(); - } - } - - text = sb.ToString().TrimEnd(); - - while (text.Contains(Environment.NewLine + " ")) - { - text = text.Replace(Environment.NewLine + " ", Environment.NewLine); - } - - // remove starting white spaces - match = FontTagsStartSpace.Match(text); - while (match.Success) - { - text = text.Remove(match.Index + match.Length - 1, 1); - match = FontTagsStartSpace.Match(text); - } - - // remove starting white spaces on 2+ line - match = FontTagsNewLineSpace.Match(text); - while (match.Success) - { - text = text.Remove(match.Index + match.Length - 1, 1); - match = FontTagsNewLineSpace.Match(text); - } - - text = text.Replace(" ", " "); - - text = HtmlUtil.FixInvalidItalicTags(text); - - return text; - } - - public override bool IsTextBased => false; - - public bool Save(string fileName, Stream stream, Subtitle subtitle, bool batchMode) - { - return Save(fileName, stream, subtitle, batchMode, null); - } - } -} +using Nikse.SubtitleEdit.Core.Interfaces; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + /// + /// EBU Subtitling data exchange format + /// + public class Ebu : SubtitleFormat, IBinaryPersistableSubtitle + { + private static readonly Regex FontTagsNoSpace1 = new Regex("[a-zA-z.!?][a-zA-Z-]", RegexOptions.Compiled); + private static readonly Regex FontTagsNoSpace2 = new Regex("[a-zA-z.!?][a-zA-Z-]", RegexOptions.Compiled); + + private static readonly Regex FontTagsStartSpace = new Regex("^ ", RegexOptions.Compiled); // " " + private static readonly Regex FontTagsNewLineSpace = new Regex("[\r\n]+ ", RegexOptions.Compiled); // "\r\n " + + private const string LanguageCodeChinese = "75"; + + public interface IEbuUiHelper + { + void Initialize(EbuGeneralSubtitleInformation header, byte justificationCode, string fileName, Subtitle subtitle); + bool ShowDialogOk(); + byte JustificationCode { get; set; } + } + + public static IEbuUiHelper EbuUiHelper { get; set; } + + private static readonly Regex RegExprColor = new Regex(@"^[a-f0-9]{6}$", RegexOptions.Compiled); + + public List VerticalPositions = new List(); + public List JustificationCodes = new List(); + + public EbuGeneralSubtitleInformation Header; + + /// + /// GSI block (1024 bytes) + /// + public class EbuGeneralSubtitleInformation + { + public string CodePageNumber { get; set; } // 0..2 + public string DiskFormatCode { get; set; } // 3..10 + public double FrameRateFromSaveDialog { get; set; } + public string DisplayStandardCode { get; set; } // 11 + public string CharacterCodeTableNumber { get; set; } // 12..13 + public string LanguageCode { get; set; } // 14..15 + public string OriginalProgrammeTitle { get; set; } // 16..47 + public string OriginalEpisodeTitle { get; set; } + public string TranslatedProgrammeTitle { get; set; } + public string TranslatedEpisodeTitle { get; set; } + public string TranslatorsName { get; set; } + public string TranslatorsContactDetails { get; set; } + public string SubtitleListReferenceCode { get; set; } + public string CreationDate { get; set; } + public string RevisionDate { get; set; } + public string RevisionNumber { get; set; } + public string TotalNumberOfTextAndTimingInformationBlocks { get; set; } + public string TotalNumberOfSubtitles { get; set; } + public string TotalNumberOfSubtitleGroups { get; set; } + public string MaximumNumberOfDisplayableCharactersInAnyTextRow { get; set; } + public string MaximumNumberOfDisplayableRows { get; set; } + public string TimeCodeStatus { get; set; } + public string TimeCodeStartOfProgramme { get; set; } + public string TimeCodeFirstInCue { get; set; } + public string TotalNumberOfDisks { get; set; } + public string DiskSequenceNumber { get; set; } + public string CountryOfOrigin { get; set; } + public string Publisher { get; set; } + public string EditorsName { get; set; } + public string EditorsContactDetails { get; set; } + public string SpareBytes { get; set; } + public string UserDefinedArea { get; set; } + + public double FrameRate + { + get + { + if (FrameRateFromSaveDialog > 20) + { + return FrameRateFromSaveDialog; + } + + if (DiskFormatCode.StartsWith("STL23", StringComparison.Ordinal)) + { + return 23.0; + } + + if (DiskFormatCode.StartsWith("STL24", StringComparison.Ordinal)) + { + return 24.0; + } + + if (DiskFormatCode.StartsWith("STL25", StringComparison.Ordinal)) + { + return 25.0; + } + + if (DiskFormatCode.StartsWith("STL29", StringComparison.Ordinal)) + { + return 29.0; + } + + if (DiskFormatCode.StartsWith("STL35", StringComparison.Ordinal)) + { + return 35.0; + } + + if (DiskFormatCode.StartsWith("STL48", StringComparison.Ordinal)) + { + return 48.0; + } + + if (DiskFormatCode.StartsWith("STL50", StringComparison.Ordinal)) + { + return 50.0; + } + + if (DiskFormatCode.StartsWith("STL60", StringComparison.Ordinal)) + { + return 60.0; + } + + return 30.0; // should be DiskFormatcode STL30.01 + } + } + + public EbuGeneralSubtitleInformation() + { + CodePageNumber = "437"; + DiskFormatCode = "STL25.01"; + DisplayStandardCode = "0"; // 0=Open subtitling + CharacterCodeTableNumber = "00"; + LanguageCode = "0A"; + OriginalProgrammeTitle = "No Title "; + OriginalEpisodeTitle = " "; + TranslatedProgrammeTitle = string.Empty.PadLeft(32, ' '); + TranslatedEpisodeTitle = string.Empty.PadLeft(32, ' '); + TranslatorsName = string.Empty.PadLeft(32, ' '); + TranslatorsContactDetails = string.Empty.PadLeft(32, ' '); + SubtitleListReferenceCode = "0 "; + CreationDate = "101021"; + RevisionDate = "101021"; + RevisionNumber = "01"; + TotalNumberOfTextAndTimingInformationBlocks = "00725"; + TotalNumberOfSubtitles = "00725"; + TotalNumberOfSubtitleGroups = "001"; + MaximumNumberOfDisplayableCharactersInAnyTextRow = "40"; + MaximumNumberOfDisplayableRows = "23"; + TimeCodeStatus = "1"; + TimeCodeStartOfProgramme = "00000000"; + TimeCodeFirstInCue = "00000001"; + TotalNumberOfDisks = "1"; + DiskSequenceNumber = "1"; + CountryOfOrigin = "USA"; + Publisher = string.Empty.PadLeft(32, ' '); + EditorsName = string.Empty.PadLeft(32, ' '); + EditorsContactDetails = string.Empty.PadLeft(32, ' '); + SpareBytes = string.Empty.PadLeft(75, ' '); + UserDefinedArea = string.Empty.PadLeft(576, ' '); + } + + public override string ToString() + { + var result = CodePageNumber + + DiskFormatCode + + DisplayStandardCode + + CharacterCodeTableNumber + + LanguageCode + + OriginalProgrammeTitle + + OriginalEpisodeTitle + + TranslatedProgrammeTitle + + TranslatedEpisodeTitle + + TranslatorsName + + TranslatorsContactDetails + + SubtitleListReferenceCode + + CreationDate + + RevisionDate + + RevisionNumber + + TotalNumberOfTextAndTimingInformationBlocks + + TotalNumberOfSubtitles + + TotalNumberOfSubtitleGroups + + MaximumNumberOfDisplayableCharactersInAnyTextRow + + MaximumNumberOfDisplayableRows + + TimeCodeStatus + + TimeCodeStartOfProgramme + + TimeCodeFirstInCue + + TotalNumberOfDisks + + DiskSequenceNumber + + CountryOfOrigin + + Publisher + + EditorsName + + EditorsContactDetails + + SpareBytes + + UserDefinedArea; + + if (result.Length == 1024) + { + return result; + } + + return "Length must be 1024 but is " + result.Length; + } + } + + /// + /// TTI block 128 bytes + /// + private class EbuTextTimingInformation + { + public byte SubtitleGroupNumber { get; set; } + public ushort SubtitleNumber { get; set; } + public byte ExtensionBlockNumber { get; set; } + public byte CumulativeStatus { get; set; } + public int TimeCodeInHours { get; set; } + public int TimeCodeInMinutes { get; set; } + public int TimeCodeInSeconds { get; set; } + public int TimeCodeInMilliseconds { get; set; } + public int TimeCodeOutHours { get; set; } + public int TimeCodeOutMinutes { get; set; } + public int TimeCodeOutSeconds { get; set; } + public int TimeCodeOutMilliseconds { get; set; } + public byte VerticalPosition { get; set; } + public byte JustificationCode { get; set; } + public byte CommentFlag { get; set; } + public string TextField { get; set; } + + public EbuTextTimingInformation() + { + SubtitleGroupNumber = 0; + ExtensionBlockNumber = 255; + CumulativeStatus = 0; + VerticalPosition = 0x16; + JustificationCode = 2; + CommentFlag = 0; + } + + public byte[] GetBytes(EbuGeneralSubtitleInformation header) + { + var buffer = new byte[128]; // Text and Timing Information (TTI) block consists of 128 bytes + + buffer[0] = SubtitleGroupNumber; + var temp = BitConverter.GetBytes(SubtitleNumber); + buffer[1] = temp[0]; + buffer[2] = temp[1]; + buffer[3] = ExtensionBlockNumber; + buffer[4] = CumulativeStatus; + + buffer[5] = (byte)TimeCodeInHours; + buffer[6] = (byte)TimeCodeInMinutes; + var frames = GetFrameFromMilliseconds(TimeCodeInMilliseconds, header.FrameRate, out var extraSeconds); + buffer[7] = (byte)(TimeCodeInSeconds + extraSeconds); + buffer[8] = frames; + + buffer[9] = (byte)TimeCodeOutHours; + buffer[10] = (byte)TimeCodeOutMinutes; + frames = GetFrameFromMilliseconds(TimeCodeOutMilliseconds, header.FrameRate, out extraSeconds); + buffer[11] = (byte)(TimeCodeOutSeconds + extraSeconds); + buffer[12] = frames; + + buffer[13] = VerticalPosition; + buffer[14] = JustificationCode; + buffer[15] = CommentFlag; + + var encoding = GetEncoding(header.CodePageNumber); + if (header.LanguageCode == LanguageCodeChinese) + { + var lines = HtmlUtil.RemoveHtmlTags(TextField, true).SplitToLines(); + var byteList = new List(); + encoding = Encoding.GetEncoding(1200); // 16-bit Unicode + for (var i = 0; i < lines.Count; i++) + { + var l = lines[i]; + if (i > 0) + { // new line + byteList.Add(0); + byteList.Add(138); + } + byteList.AddRange(encoding.GetBytes(l).ToArray()); + } + + for (var i = 0; i < 112; i++) + { + if (i < byteList.Count) + { + buffer[16 + i] = byteList[i]; + } + else + { + buffer[16 + i] = 0x8f; + } + } + + return buffer; + } + + if (header.CharacterCodeTableNumber == "00") + { + encoding = Encoding.GetEncoding(20269); + // 0xC1—0xCF combines characters - http://en.wikipedia.org/wiki/ISO/IEC_6937 + + var sbTwoChar = new StringBuilder(); + bool skipNext = false; + for (var index = 0; index < TextField.Length; index++) + { + var ch = TextField[index]; + if (skipNext) + { + skipNext = false; + } + else if (ch == 'ı' && TextField.Substring(index).StartsWith("ı̂")) // extended unicode char - rewritten as simple 'î' - looks the same as "î" but it's not...) + { + sbTwoChar.Append(encoding.GetString(new byte[] { 0xc3, 0x69 })); // Ãi - simple î + skipNext = true; + } + else if ("ÀÈÌÒÙàèìòù".Contains(ch)) + { + sbTwoChar.Append(ReplaceSpecialCharactersWithTwoByteEncoding(ch, encoding.GetString(new byte[] { 0xc1 }), "ÀÈÌÒÙàèìòù", "AEIOUaeiou")); + } + else if ("ÁĆÉÍĹŃÓŔŚÚÝŹáćéģíĺńóŕśúýź".Contains(ch)) + { + sbTwoChar.Append(ReplaceSpecialCharactersWithTwoByteEncoding(ch, encoding.GetString(new byte[] { 0xc2 }), "ÁĆÉÍĹŃÓŔŚÚÝŹáćéģíĺńóŕśúýź", "ACEILNORSUYZacegilnorsuyz")); + } + else if ("ÂĈÊĜĤÎĴÔŜÛŴŶâĉêĝĥĵôŝûŵŷîı̂".Contains(ch)) + { + sbTwoChar.Append(ReplaceSpecialCharactersWithTwoByteEncoding(ch, encoding.GetString(new byte[] { 0xc3 }), "ÂĈÊĜĤÎĴÔŜÛŴŶâĉêĝĥîĵôŝûŵŷ", "ACEGHIJOSUWYaceghijosuwy")); + } + else if ("ÃĨÑÕŨãĩñõũ".Contains(ch)) + { + sbTwoChar.Append(ReplaceSpecialCharactersWithTwoByteEncoding(ch, encoding.GetString(new byte[] { 0xc4 }), "ÃĨÑÕŨãĩñõũ", "AINOUainou")); + } + else if ("ĀĒĪŌŪāēīōū".Contains(ch)) + { + sbTwoChar.Append(ReplaceSpecialCharactersWithTwoByteEncoding(ch, encoding.GetString(new byte[] { 0xc5 }), "ĀĒĪŌŪāēīōū", "AEIOUaeiou")); + } + else if ("ĂĞŬăğŭ".Contains(ch)) + { + sbTwoChar.Append(ReplaceSpecialCharactersWithTwoByteEncoding(ch, encoding.GetString(new byte[] { 0xc6 }), "ĂĞŬăğŭ", "AGUagu")); + } + else if ("ĊĖĠİŻċėġıż".Contains(ch)) + { + sbTwoChar.Append(ReplaceSpecialCharactersWithTwoByteEncoding(ch, encoding.GetString(new byte[] { 0xc7 }), "ĊĖĠİŻċėġıż", "CEGIZcegiz")); + } + else if ("ÄËÏÖÜŸäëïöüÿ".Contains(ch)) + { + sbTwoChar.Append(ReplaceSpecialCharactersWithTwoByteEncoding(ch, encoding.GetString(new byte[] { 0xc8 }), "ÄËÏÖÜŸäëïöüÿ", "AEIOUYaeiouy")); + } + else if ("ÅŮåů".Contains(ch)) + { + sbTwoChar.Append(ReplaceSpecialCharactersWithTwoByteEncoding(ch, encoding.GetString(new byte[] { 0xca }), "ÅŮåů", "AUau")); + } + else if ("ÇĢĶĻŅŖŞŢçķļņŗşţ".Contains(ch)) + { + sbTwoChar.Append(ReplaceSpecialCharactersWithTwoByteEncoding(ch, encoding.GetString(new byte[] { 0xcb }), "ÇĢĶĻŅŖŞŢçķļņŗşţ", "CGKLNRSTcklnrst")); + } + else if ("ŐŰőű".Contains(ch)) + { + sbTwoChar.Append(ReplaceSpecialCharactersWithTwoByteEncoding(ch, encoding.GetString(new byte[] { 0xcd }), "ŐŰőű", "OUou")); + } + else if ("ĄĘĮŲąęįų".Contains(ch)) + { + sbTwoChar.Append(ReplaceSpecialCharactersWithTwoByteEncoding(ch, encoding.GetString(new byte[] { 0xce }), "ĄĘĮŲąęįų", "AEIUaeiu")); + } + else if ("ČĎĚĽŇŘŠŤŽčďěľňřšťž".Contains(ch)) + { + sbTwoChar.Append(ReplaceSpecialCharactersWithTwoByteEncoding(ch, encoding.GetString(new byte[] { 0xcf }), "ČĎĚĽŇŘŠŤŽčďěľňřšťž", "CDELNRSTZcdelnrstz")); + } + else + { + sbTwoChar.Append(ch); + } + } + + TextField = sbTwoChar.ToString(); + } + else if (header.CharacterCodeTableNumber == "01") // Latin/Cyrillic alphabet - from ISO 8859/5-1988 + { + encoding = Encoding.GetEncoding("ISO-8859-5"); + } + else if (header.CharacterCodeTableNumber == "02") // Latin/Arabic alphabet - from ISO 8859/6-1987 + { + encoding = Encoding.GetEncoding("ISO-8859-6"); + } + else if (header.CharacterCodeTableNumber == "03") // Latin/Greek alphabet - from ISO 8859/7-1987 + { + encoding = Encoding.GetEncoding("ISO-8859-7"); // or ISO-8859-1 ? + } + else if (header.CharacterCodeTableNumber == "04") // Latin/Hebrew alphabet - from ISO 8859/8-1988 + { + encoding = Encoding.GetEncoding("ISO-8859-8"); + } + + // italic/underline + var italicsOn = encoding.GetString(new byte[] { 0x80 }); + var italicsOff = encoding.GetString(new byte[] { 0x81 }); + var underlineOn = encoding.GetString(new byte[] { 0x82 }); + var underlineOff = encoding.GetString(new byte[] { 0x83 }); + var boxingOn = encoding.GetString(new byte[] { 0x84 }); + var boxingOff = encoding.GetString(new byte[] { 0x85 }); + + TextField = FixItalics(TextField); + + TextField = TextField.Replace("", italicsOn); + TextField = TextField.Replace("", italicsOn); + TextField = TextField.Replace("", italicsOff); + TextField = TextField.Replace("", italicsOff); + TextField = TextField.Replace("", underlineOn); + TextField = TextField.Replace("", underlineOn); + TextField = TextField.Replace("", underlineOff); + TextField = TextField.Replace("", underlineOff); + TextField = TextField.Replace("", boxingOn); + TextField = TextField.Replace("", boxingOn); + TextField = TextField.Replace("", boxingOff); + TextField = TextField.Replace("", boxingOff); + if (header.CharacterCodeTableNumber == "00") + { + TextField = TextField.Replace("©", encoding.GetString(new byte[] { 0xd3 })); + TextField = TextField.Replace("™", encoding.GetString(new byte[] { 0xd4 })); + TextField = TextField.Replace("♪", encoding.GetString(new byte[] { 0xd5 })); + } + + TextField = EncodeText(TextField, encoding, header.DisplayStandardCode); + TextField = HtmlUtil.RemoveHtmlTags(TextField, true); + + if (header.DisplayStandardCode != "0") // 0=Open subtitling + { + if (Configuration.Settings.SubtitleSettings.EbuStlTeletextUseBox && Configuration.Settings.SubtitleSettings.EbuStlTeletextUseDoubleHeight) + { + TextField = encoding.GetString(new byte[] { 0x0d, 0x0b, 0x0b }) + TextField; // d=double height, b=start box + } + else if (Configuration.Settings.SubtitleSettings.EbuStlTeletextUseBox) + { + TextField = encoding.GetString(new byte[] { 0x0b, 0x0b }) + TextField; // b=start box + } + else if (Configuration.Settings.SubtitleSettings.EbuStlTeletextUseDoubleHeight) + { + TextField = encoding.GetString(new byte[] { 0x0d }) + TextField; // d=double height + } + } + + // convert text to bytes + var bytes = encoding.GetBytes(TextField); + + // some fixes for bytes + if (bytes.Length == TextField.Length) + { + for (var i = 0; i < bytes.Length; i++) + { + if (TextField[i] == '#') + { + bytes[i] = 0x23; + } + else if (TextField[i] == 'Đ') + { + bytes[i] = 0xe2; + } + else if (TextField[i] == '–') // em dash + { + bytes[i] = 0xd0; + } + } + } + + for (var i = 0; i < 112; i++) + { + if (i < bytes.Length) + { + buffer[16 + i] = bytes[i]; + } + else + { + buffer[16 + i] = 0x8f; + } + } + return buffer; + } + + private static string FixItalics(string text) + { + var italicOn = false; + var sb = new StringBuilder(); + foreach (var line in HtmlUtil.FixInvalidItalicTags(text).SplitToLines()) + { + var s = line; + if (italicOn && !s.TrimStart().StartsWith("", StringComparison.Ordinal)) + { + s = "" + s; + } + + var endTagIndex = s.LastIndexOf("", StringComparison.Ordinal); + if (s.LastIndexOf("", StringComparison.Ordinal) > endTagIndex) + { + italicOn = true; + } + else if (endTagIndex >= 0) + { + italicOn = false; + } + + if (italicOn) + { + sb.AppendLine(s + ""); + } + else + { + sb.AppendLine(s); + } + } + + return sb.ToString().TrimEnd(); + } + + private static string EncodeText(string text, Encoding encoding, string displayStandardCode) + { + // newline + var newline = encoding.GetString(new byte[] { 0x8a, 0x8a }); + if (Configuration.Settings.SubtitleSettings.EbuStlTeletextUseBox && Configuration.Settings.SubtitleSettings.EbuStlTeletextUseDoubleHeight) + { + newline = encoding.GetString(new byte[] { 0x0a, 0x0a, 0x8a, 0x8a, 0x0d, 0x0b, 0x0b }); // 0a==end box, 0d==double height, 0b==start box + } + else if (Configuration.Settings.SubtitleSettings.EbuStlTeletextUseBox) + { + newline = "\u000a\u000a" + + string.Empty.PadLeft(Configuration.Settings.SubtitleSettings.EbuStlNewLineRows, '\u008a') + + encoding.GetString(new byte[] { 0x0b, 0x0b }); // 0a==end box, 0b==start box + } + else if (Configuration.Settings.SubtitleSettings.EbuStlTeletextUseDoubleHeight) + { + newline = encoding.GetString(new byte[] { 0x8a, 0x8a, 0x0d, 0x0d }); // 0d==double height + } + + if (displayStandardCode == "0") // 0=Open subtitling + { + newline = encoding.GetString(new byte[] { 0x8A }); //8Ah=CR/LF + } + + var lastColor = string.Empty; + var sb = new StringBuilder(); + var list = text.SplitToLines(); + for (var index = 0; index < list.Count; index++) + { + if (index > 0) + { + sb.Append(newline); + if (displayStandardCode != "0" && !string.IsNullOrEmpty(lastColor)) + { + sb.Append(lastColor); + } + } + + var line = list[index]; + var i = 0; + while (i < line.Length) + { + var newStart = line.Substring(i); + if (newStart.StartsWith("', i); + if (end > 0) + { + if (displayStandardCode != "0") + { + lastColor = GetColor(encoding, line, i); + sb.Append(lastColor); + } + + i = end + 1; + } + } + else if (newStart == "") + { + i += "".Length; + lastColor = string.Empty; + } + else if (newStart.StartsWith("", StringComparison.OrdinalIgnoreCase)) + { + if (displayStandardCode != "0") + { + sb.Append(encoding.GetString(new byte[] { 0x07 })); // white + } + + i += "".Length; + } + else + { + sb.Append(line.Substring(i, 1)); + i++; + } + } + } + + if (Configuration.Settings.SubtitleSettings.EbuStlTeletextUseBox && displayStandardCode != "0") + { + sb.Append(encoding.GetString(new byte[] { 0x0a, 0x0a })); //a=end box + } + + return sb.ToString(); + } + + private static string GetColor(Encoding encoding, string line, int i) + { + var end = line.IndexOf('>', i); + if (end > 0) + { + string f = line.Substring(i, end - i); + if (f.Contains(" color=", StringComparison.OrdinalIgnoreCase)) + { + var colorStart = f.IndexOf(" color=", StringComparison.OrdinalIgnoreCase); + if (line.IndexOf('"', colorStart + " color=".Length + 1) > 0) + { + var colorEnd = f.IndexOf('"', colorStart + " color=".Length + 1); + if (colorStart > 1) + { + string color = f.Substring(colorStart + 7, colorEnd - (colorStart + 7)); + color = color.Trim('\''); + color = color.Trim('\"'); + color = color.Trim('#'); + return GetNearestEbuColorCode(color, encoding); + } + } + } + } + return string.Empty; + } + + private static string GetNearestEbuColorCode(string color, Encoding encoding) + { + color = color.ToLowerInvariant(); + if (color == "black" || color == "000000") + { + return encoding.GetString(new byte[] { 0x00 }); // black + } + + if (color == "red" || color == "ff0000") + { + return encoding.GetString(new byte[] { 0x01 }); // red + } + + if (color == "green" || color == "00ff00") + { + return encoding.GetString(new byte[] { 0x02 }); // green + } + + if (color == "yellow" || color == "ffff00") + { + return encoding.GetString(new byte[] { 0x03 }); // yellow + } + + if (color == "blue" || color == "0000ff") + { + return encoding.GetString(new byte[] { 0x04 }); // blue + } + + if (color == "magenta" || color == "ff00ff") + { + return encoding.GetString(new byte[] { 0x05 }); // magenta + } + + if (color == "cyan" || color == "00ffff") + { + return encoding.GetString(new byte[] { 0x06 }); // cyan + } + + if (color == "white" || color == "ffffff") + { + return encoding.GetString(new byte[] { 0x07 }); // white + } + + if (color.Length == 6) + { + if (RegExprColor.IsMatch(color)) + { + const int maxDiff = 130; + int r = int.Parse(color.Substring(0, 2), NumberStyles.HexNumber); + int g = int.Parse(color.Substring(2, 2), NumberStyles.HexNumber); + int b = int.Parse(color.Substring(4, 2), NumberStyles.HexNumber); + if (r < maxDiff && g < maxDiff && b < maxDiff) + { + return encoding.GetString(new byte[] { 0x00 }); // black + } + + if (r > 255 - maxDiff && g < maxDiff && b < maxDiff) + { + return encoding.GetString(new byte[] { 0x01 }); // red + } + + if (r < maxDiff && g > 255 - maxDiff && b < maxDiff) + { + return encoding.GetString(new byte[] { 0x02 }); // green + } + + if (r > 255 - maxDiff && g > 255 - maxDiff && b < maxDiff) + { + return encoding.GetString(new byte[] { 0x03 }); // yellow + } + + if (r < maxDiff && g < maxDiff && b > 255 - maxDiff) + { + return encoding.GetString(new byte[] { 0x04 }); // blue + } + + if (r > 255 - maxDiff && g < maxDiff && b > 255 - maxDiff) + { + return encoding.GetString(new byte[] { 0x05 }); // magenta + } + + if (r < maxDiff && g > 255 - maxDiff && b > 255 - maxDiff) + { + return encoding.GetString(new byte[] { 0x06 }); // cyan + } + + if (r > 255 - maxDiff && g > 255 - maxDiff && b > 255 - maxDiff) + { + return encoding.GetString(new byte[] { 0x07 }); // white + } + } + } + return string.Empty; + } + + private static string ReplaceSpecialCharactersWithTwoByteEncoding(char ch, string specialCharacter, string originalCharacters, string newCharacters) + { + if (originalCharacters.Length != newCharacters.Length) + { + throw new ArgumentException("originalCharacters and newCharacters must have equal length"); + } + + for (var i = 0; i < newCharacters.Length; i++) + { + if (originalCharacters[i] == ch) + { + return specialCharacter + newCharacters[i]; + } + } + return ch.ToString(); + } + + public static byte GetFrameFromMilliseconds(int milliseconds, double frameRate, out byte extraSeconds) + { + extraSeconds = 0; + var fr = Math.Round(milliseconds / (TimeCode.BaseUnit / frameRate)); + if (fr >= frameRate) + { + fr = 0; + extraSeconds = 1; + } + + return (byte)fr; + } + } + + public override string Extension => ".stl"; + + public const string NameOfFormat = "EBU STL"; + + public override string Name => NameOfFormat; + + public bool Save(string fileName, Subtitle subtitle) + { + return Save(fileName, subtitle, false); + } + + public bool Save(string fileName, Subtitle subtitle, bool batchMode, EbuGeneralSubtitleInformation header = null) + { + using (var ms = new MemoryStream()) + { + var ok = Save(fileName, ms, subtitle, batchMode, header); + if (ok) + { + ms.Position = 0; + using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write)) + { + ms.CopyTo(fs); + } + } + return ok; + } + } + + public bool Save(string fileName, Stream stream, Subtitle subtitle, bool batchMode, EbuGeneralSubtitleInformation header) + { + if (header == null) + { + header = new EbuGeneralSubtitleInformation { LanguageCode = AutoDetectLanguageCode(subtitle) }; + } + + if (EbuUiHelper == null) + { + return false; + } + + if (subtitle.Header != null && subtitle.Header.Length == 1024 && (subtitle.Header.Contains("STL24") || subtitle.Header.Contains("STL25") || subtitle.Header.Contains("STL29") || subtitle.Header.Contains("STL30"))) + { + header = ReadHeader(GetEncoding(subtitle.Header.Substring(0, 3)).GetBytes(subtitle.Header)); + EbuUiHelper.Initialize(header, EbuUiHelper.JustificationCode, null, subtitle); + } + else + { + EbuUiHelper.Initialize(header, EbuUiHelper.JustificationCode, fileName, subtitle); + } + + if (!batchMode && !EbuUiHelper.ShowDialogOk()) + { + return false; + } + + header.TotalNumberOfSubtitles = subtitle.Paragraphs.Count.ToString("D5"); // seems to be 1 higher than actual number of subtitles + header.TotalNumberOfTextAndTimingInformationBlocks = header.TotalNumberOfSubtitles; + + var today = $"{DateTime.Now:yyMMdd}"; + if (today.Length == 6) + { + header.CreationDate = today; + header.RevisionDate = today; + } + + var firstParagraph = subtitle.GetParagraphOrDefault(0); + if (firstParagraph != null) + { + var tc = firstParagraph.StartTime; + var frames = EbuTextTimingInformation.GetFrameFromMilliseconds(tc.Milliseconds, header.FrameRate, out var extraSeconds); + var firstTimeCode = $"{tc.Hours:00}{tc.Minutes:00}{tc.Seconds + extraSeconds:00}{frames:00}"; + if (firstTimeCode.Length == 8) + { + header.TimeCodeFirstInCue = firstTimeCode; + } + } + + var buffer = GetEncoding(header.CodePageNumber).GetBytes(header.ToString()); + stream.Write(buffer, 0, buffer.Length); + + var subtitleNumber = 0; + foreach (var p in subtitle.Paragraphs) + { + var tti = new EbuTextTimingInformation(); + + if (!int.TryParse(header.MaximumNumberOfDisplayableRows, out var rows)) + { + rows = 23; + } + + if (header.DisplayStandardCode == "1" || header.DisplayStandardCode == "2") // teletext + { + rows = 23; + } + else if (header.DisplayStandardCode == "0" && header.MaximumNumberOfDisplayableRows == "02") // open subtitling + { + rows = 15; + } + + var text = p.Text.Trim(Utilities.NewLineChars); + if (text.StartsWith("{\\an7}", StringComparison.Ordinal) || text.StartsWith("{\\an8}", StringComparison.Ordinal) || text.StartsWith("{\\an9}", StringComparison.Ordinal)) + { + tti.VerticalPosition = (byte)Configuration.Settings.SubtitleSettings.EbuStlMarginTop; // top (vertical) + if (header.DisplayStandardCode == "1" || header.DisplayStandardCode == "2") // teletext + { + tti.VerticalPosition++; + } + } + else if (text.StartsWith("{\\an4}", StringComparison.Ordinal) || text.StartsWith("{\\an5}", StringComparison.Ordinal) || text.StartsWith("{\\an6}", StringComparison.Ordinal)) + { + tti.VerticalPosition = (byte)(rows / 2); // middle (vertical) + } + else + { + var numberOfLineBreaks = Math.Max(0, Utilities.GetNumberOfLines(text) - 1); + var startRow = rows - Configuration.Settings.SubtitleSettings.EbuStlMarginBottom - + numberOfLineBreaks * Configuration.Settings.SubtitleSettings.EbuStlNewLineRows; + if (startRow < 0) + { + startRow = 0; + } + + tti.VerticalPosition = (byte)startRow; // bottom (vertical) + } + + tti.JustificationCode = EbuUiHelper.JustificationCode; // use default justification + if (text.StartsWith("{\\an1}", StringComparison.Ordinal) || text.StartsWith("{\\an4}", StringComparison.Ordinal) || text.StartsWith("{\\an7}", StringComparison.Ordinal)) + { + tti.JustificationCode = 1; // 01h=left-justified text + } + else if (text.StartsWith("{\\an3}", StringComparison.Ordinal) || text.StartsWith("{\\an6}", StringComparison.Ordinal) || text.StartsWith("{\\an9}", StringComparison.Ordinal)) + { + tti.JustificationCode = 3; // 03h=right-justified + } + else if (text.StartsWith("{\\an2}", StringComparison.Ordinal) || text.StartsWith("{\\an5}", StringComparison.Ordinal) || text.StartsWith("{\\an8}", StringComparison.Ordinal)) + { + tti.JustificationCode = 2; // 02h=centred text + } + + // replace some unsupported characters + text = text.Replace("„", "\""); // lower quote + text = text.Replace("‚", "’"); // lower apostrophe + text = text.Replace("♫", "♪"); // only music single note supported + text = text.Replace("…", "..."); // fix Unicode ellipsis + + tti.SubtitleNumber = (ushort)subtitleNumber; + tti.TextField = text; + int startTag = tti.TextField.IndexOf('}'); + if (tti.TextField.StartsWith("{\\", StringComparison.Ordinal) && startTag > 0 && startTag < 10) + { + tti.TextField = tti.TextField.Remove(0, startTag + 1); + } + + if (!p.StartTime.IsMaxTime) + { + tti.TimeCodeInHours = p.StartTime.Hours; + tti.TimeCodeInMinutes = p.StartTime.Minutes; + tti.TimeCodeInSeconds = p.StartTime.Seconds; + tti.TimeCodeInMilliseconds = p.StartTime.Milliseconds; + } + + if (!p.EndTime.IsMaxTime) + { + tti.TimeCodeOutHours = p.EndTime.Hours; + tti.TimeCodeOutMinutes = p.EndTime.Minutes; + tti.TimeCodeOutSeconds = p.EndTime.Seconds; + tti.TimeCodeOutMilliseconds = p.EndTime.Milliseconds; + } + + buffer = tti.GetBytes(header); + stream.Write(buffer, 0, buffer.Length); + subtitleNumber++; + } + return true; + } + + private static string AutoDetectLanguageCode(Subtitle subtitle) + { + if (subtitle == null || subtitle.Paragraphs.Count == 0) + { + return "00"; // Unknown/not applicable + } + + var languageCode = LanguageAutoDetect.AutoDetectGoogleLanguageOrNull(subtitle); + switch (languageCode) + { + case "sq": return "01"; // Albanian + case "br": return "02"; // Breton + case "ca": return "03"; // Catalan + case "hr": return "04"; // Croatian + case "cy": return "05"; // Welsh + case "cs": return "06"; // Czech + case "da": return "07"; // Danish + case "de": return "08"; // German + case "en": return "09"; // English + case "es": return "0A"; // Spanish + case "eo": return "0B"; // Esperanto + case "et": return "0C"; // Estonian + case "eu": return "0D"; // Basque + case "fo": return "0E"; // Faroese + case "fr": return "0F"; // French + case "fy": return "10"; // Frisian + case "ga": return "11"; // Irish + case "gd": return "12"; // Gaelic + case "gl": return "13"; // Galician + case "is": return "14"; // Icelandic + case "it": return "15"; // Italian + case "Lappish": return "16"; // Lappish + case "la": return "17"; // Latin + case "lv": return "18"; // Latvian": + case "lb": return "19"; // Luxembourgi + case "lt": return "1A"; // Lithuanian + case "hu": return "1B"; // Hungarian + case "mt": return "1C"; // Maltese + case "nl": return "1D"; // Dutch + case "nb": return "1E"; // Norwegian + case "oc": return "1F"; // Occitan + case "pl": return "20"; // Polish + case "pt": return "21"; // Portuguese + case "ro": return "22"; // Romanian + case "rm": return "23"; // Romansh + case "sr": return "24"; // Serbian + case "sk": return "25"; // Slovak + case "sl": return "26"; // Slovenian + case "fi": return "27"; // Finnish + case "sv": return "28"; // Swedish + case "tr": return "29"; // Turkish + case "Flemish": return "2A"; // Flemish + case "Wallon": return "2B"; // Wallon + } + + return "09"; // English - default + } + + public override bool IsMine(List lines, string fileName) + { + if (!string.IsNullOrEmpty(fileName) && File.Exists(fileName)) + { + var fi = new FileInfo(fileName); + if (fi.Length >= 1024 + 128 && fi.Length < 2048000) // not too small or too big + { + try + { + byte[] buffer = FileUtil.ReadAllBytesShared(fileName); + EbuGeneralSubtitleInformation header = ReadHeader(buffer); + if (header.DiskFormatCode.StartsWith("STL23", StringComparison.Ordinal) || + header.DiskFormatCode.StartsWith("STL24", StringComparison.Ordinal) || + header.DiskFormatCode.StartsWith("STL25", StringComparison.Ordinal) || + header.DiskFormatCode.StartsWith("STL29", StringComparison.Ordinal) || + header.DiskFormatCode.StartsWith("STL30", StringComparison.Ordinal) || + header.DiskFormatCode.StartsWith("STL35", StringComparison.Ordinal) || + header.DiskFormatCode.StartsWith("STL48", StringComparison.Ordinal) || + header.DiskFormatCode.StartsWith("STL50", StringComparison.Ordinal) || + header.DiskFormatCode.StartsWith("STL60", StringComparison.Ordinal) || + "012 ".Contains(header.DisplayStandardCode) && "437|850|860|863|865".Contains(header.CodePageNumber)) + { + return Utilities.IsInteger(header.CodePageNumber) || fileName.EndsWith(".stl", StringComparison.OrdinalIgnoreCase); + } + } + catch + { + return false; + } + } + } + return false; + } + + public override string ToText(Subtitle subtitle, string title) + { + return "Not supported!"; + } + + public void LoadSubtitle(Subtitle subtitle, byte[] buffer) + { + subtitle.Paragraphs.Clear(); + subtitle.Header = null; + var header = ReadHeader(buffer); + subtitle.Header = Encoding.UTF8.GetString(buffer); + Paragraph last = null; + byte lastExtensionBlockNumber = 0xff; + JustificationCodes = new List(); + VerticalPositions = new List(); + Configuration.Settings.General.CurrentFrameRate = header.FrameRate; + foreach (var tti in ReadTextAndTiming(buffer, header)) + { + if (tti.ExtensionBlockNumber != 0xfe) // FEh : Reserved for User Data + { + var p = new Paragraph + { + Text = tti.TextField, + StartTime = new TimeCode(tti.TimeCodeInHours, tti.TimeCodeInMinutes, tti.TimeCodeInSeconds, tti.TimeCodeInMilliseconds), + EndTime = new TimeCode(tti.TimeCodeOutHours, tti.TimeCodeOutMinutes, tti.TimeCodeOutSeconds, tti.TimeCodeOutMilliseconds), + MarginV = tti.VerticalPosition.ToString(CultureInfo.InvariantCulture) + }; + + if (Math.Abs(p.StartTime.TotalMilliseconds) < 0.01 && Math.Abs(p.EndTime.TotalMilliseconds) < 0.01) + { + p.StartTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; + p.EndTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; + } + + if (lastExtensionBlockNumber != 0xff && last != null) + { + last.Text += p.Text; // merge text + } + else + { + subtitle.Paragraphs.Add(p); + last = p; + } + + p.Text = HtmlUtil.FixInvalidItalicTags(p.Text); + lastExtensionBlockNumber = tti.ExtensionBlockNumber; + } + } + subtitle.Renumber(); + Header = header; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + LoadSubtitle(subtitle, FileUtil.ReadAllBytesShared(fileName)); + } + + public static EbuGeneralSubtitleInformation ReadHeader(byte[] buffer) + { + var enc = GetEncoding(Encoding.ASCII.GetString(buffer, 0, 3)); + var header = new EbuGeneralSubtitleInformation + { + CodePageNumber = enc.GetString(buffer, 0, 3), + DiskFormatCode = enc.GetString(buffer, 3, 8), + DisplayStandardCode = enc.GetString(buffer, 11, 1), + CharacterCodeTableNumber = enc.GetString(buffer, 12, 2), + LanguageCode = enc.GetString(buffer, 14, 2), + OriginalProgrammeTitle = enc.GetString(buffer, 16, 32), + OriginalEpisodeTitle = enc.GetString(buffer, 48, 32), + TranslatedProgrammeTitle = enc.GetString(buffer, 80, 32), + TranslatedEpisodeTitle = enc.GetString(buffer, 112, 32), + TranslatorsName = enc.GetString(buffer, 144, 32), + TranslatorsContactDetails = enc.GetString(buffer, 176, 32), + SubtitleListReferenceCode = enc.GetString(buffer, 208, 16), + CreationDate = enc.GetString(buffer, 224, 6), + RevisionDate = enc.GetString(buffer, 230, 6), + RevisionNumber = enc.GetString(buffer, 236, 2), + TotalNumberOfTextAndTimingInformationBlocks = enc.GetString(buffer, 238, 5), + TotalNumberOfSubtitles = enc.GetString(buffer, 243, 5), + TotalNumberOfSubtitleGroups = enc.GetString(buffer, 248, 3), + MaximumNumberOfDisplayableCharactersInAnyTextRow = enc.GetString(buffer, 251, 2), + MaximumNumberOfDisplayableRows = enc.GetString(buffer, 253, 2), + TimeCodeStatus = enc.GetString(buffer, 255, 1), + TimeCodeStartOfProgramme = enc.GetString(buffer, 256, 8), + CountryOfOrigin = enc.GetString(buffer, 274, 3), + SpareBytes = enc.GetString(buffer, 373, 75), + UserDefinedArea = enc.GetString(buffer, 448, 576) + }; + return header; + } + + private static Encoding GetEncoding(string codePageNumber) + { + try + { + return Encoding.GetEncoding(int.TryParse(codePageNumber, out int cp) ? cp : 437); + } + catch (NotSupportedException) + { + return Encoding.GetEncoding(437); + } + } + + /// + /// Get text with regard code page from header + /// + /// Skip next character + /// EBU header + /// data buffer + /// index to current byte in buffer + /// Character at index + private static string GetCharacter(out bool skipNext, EbuGeneralSubtitleInformation header, byte[] buffer, int index) + { + skipNext = false; + + if (header.LanguageCode == LanguageCodeChinese) + { + skipNext = true; + return Encoding.GetEncoding(1200).GetString(buffer, index, 2); // 16-bit Unicode + } + + if (header.CharacterCodeTableNumber == "00") + { + var b = buffer[index]; + if (b == 0xd3) + { + return "©"; + } + + if (b == 0xd4) + { + return "™"; + } + + if (b == 0xd5) + { + return "♪"; + } + + //note that 0xC1—0xCF combines characters - http://en.wikipedia.org/wiki/ISO/IEC_6937 + var encoding = Encoding.GetEncoding(20269); + if (index + 2 > buffer.Length) + { + return string.Empty; + } + + var next = encoding.GetString(buffer, index + 1, 1); + switch (b) + { + case 0xc1: // Grave + skipNext = @"AEIOUaeiou".Contains(next); + switch (next) + { + case "A": return "À"; + case "E": return "È"; + case "I": return "Ì"; + case "O": return "Ò"; + case "U": return "Ù"; + case "a": return "à"; + case "e": return "è"; + case "i": return "ì"; + case "o": return "ò"; + case "u": return "ù"; + } + return string.Empty; + case 0xc2: // Acute + skipNext = @"ACEILNORSUYZacegilnorsuyz".Contains(next); + switch (next) + { + case "A": return "Á"; + case "C": return "Ć"; + case "E": return "É"; + case "I": return "Í"; + case "L": return "Ĺ"; + case "N": return "Ń"; + case "O": return "Ó"; + case "R": return "Ŕ"; + case "S": return "Ś"; + case "U": return "Ú"; + case "Y": return "Ý"; + case "Z": return "Ź"; + case "a": return "á"; + case "c": return "ć"; + case "e": return "é"; + case "g": return "ģ"; + case "i": return "í"; + case "l": return "ĺ"; + case "n": return "ń"; + case "o": return "ó"; + case "r": return "ŕ"; + case "s": return "ś"; + case "u": return "ú"; + case "y": return "ý"; + case "z": return "ź"; + } + return string.Empty; + case 0xc3: // Circumflex + skipNext = @"ACEGHIJOSUWYaceghjosuwyıi".Contains(next); + switch (next) + { + case "A": return "Â"; + case "C": return "Ĉ"; + case "E": return "Ê"; + case "G": return "Ĝ"; + case "H": return "Ĥ"; + case "I": return "Î"; + case "J": return "Ĵ"; + case "O": return "Ô"; + case "S": return "Ŝ"; + case "U": return "Û"; + case "W": return "Ŵ"; + case "Y": return "Ŷ"; + case "a": return "â"; + case "c": return "ĉ"; + case "e": return "ê"; + case "g": return "ĝ"; + case "h": return "ĥ"; + case "j": return "ĵ"; + case "o": return "ô"; + case "s": return "ŝ"; + case "u": return "û"; + case "w": return "ŵ"; + case "y": return "ŷ"; + case "ı": return "ı̂"; + case "i": return "î"; + } + return string.Empty; + case 0xc4: // Tilde + skipNext = @"AINOUainou".Contains(next); + switch (next) + { + case "A": return "Ã"; + case "I": return "Ĩ"; + case "N": return "Ñ"; + case "O": return "Õ"; + case "U": return "Ũ"; + case "a": return "ã"; + case "i": return "ĩ"; + case "n": return "ñ"; + case "o": return "õ"; + case "u": return "ũ"; + } + return string.Empty; + case 0xc5: // Macron + skipNext = @"AEIOUaeiou".Contains(next); + switch (next) + { + case "A": return "Ā"; + case "E": return "Ē"; + case "I": return "Ī"; + case "O": return "Ō"; + case "U": return "Ū"; + case "a": return "ā"; + case "e": return "ē"; + case "i": return "ī"; + case "o": return "ō"; + case "u": return "ū"; + } + return string.Empty; + case 0xc6: // Breve + skipNext = @"AGUagu".Contains(next); + switch (next) + { + case "A": return "Ă"; + case "G": return "Ğ"; + case "U": return "Ŭ"; + case "a": return "ă"; + case "g": return "ğ"; + case "u": return "ŭ"; + } + return string.Empty; + case 0xc7: // Dot + skipNext = @"CEGIZcegiz".Contains(next); + switch (next) + { + case "C": return "Ċ"; + case "E": return "Ė"; + case "G": return "Ġ"; + case "I": return "İ"; + case "Z": return "Ż"; + case "c": return "ċ"; + case "e": return "ė"; + case "g": return "ġ"; + case "i": return "ı"; + case "z": return "ż"; + } + return string.Empty; + case 0xc8: // Umlaut or diæresis + skipNext = @"AEIOUYaeiouy".Contains(next); + switch (next) + { + case "A": return "Ä"; + case "E": return "Ë"; + case "I": return "Ï"; + case "O": return "Ö"; + case "U": return "Ü"; + case "Y": return "Ÿ"; + case "a": return "ä"; + case "e": return "ë"; + case "i": return "ï"; + case "o": return "ö"; + case "u": return "ü"; + case "y": return "ÿ"; + } + return string.Empty; + case 0xca: // Ring + skipNext = @"AUau".Contains(next); + switch (next) + { + case "A": return "Å"; + case "U": return "Ů"; + case "a": return "å"; + case "u": return "ů"; + } + return string.Empty; + case 0xcb: // Cedilla + skipNext = @"CGKLNRSTcklnrst".Contains(next); + switch (next) + { + case "C": return "Ç"; + case "G": return "Ģ"; + case "K": return "Ķ"; + case "L": return "Ļ"; + case "N": return "Ņ"; + case "R": return "Ŗ"; + case "S": return "Ş"; + case "T": return "Ţ"; + case "c": return "ç"; + case "k": return "ķ"; + case "l": return "ļ"; + case "n": return "ņ"; + case "r": return "ŗ"; + case "s": return "ş"; + case "t": return "ţ"; + } + return string.Empty; + case 0xcd: // DoubleAcute + skipNext = @"OUou".Contains(next); + switch (next) + { + case "O": return "Ő"; + case "U": return "Ű"; + case "o": return "ő"; + case "u": return "ű"; + } + return string.Empty; + case 0xce: // Ogonek + skipNext = @"AEIUaeiu".Contains(next); + switch (next) + { + case "A": return "Ą"; + case "E": return "Ę"; + case "I": return "Į"; + case "U": return "Ų"; + case "a": return "ą"; + case "e": return "ę"; + case "i": return "į"; + case "u": return "ų"; + } + return string.Empty; + case 0xcf: // Caron + skipNext = @"CDELNRSTZcdelnrstz".Contains(next); + switch (next) + { + case "C": return "Č"; + case "D": return "Ď"; + case "E": return "Ě"; + case "L": return "Ľ"; + case "N": return "Ň"; + case "R": return "Ř"; + case "S": return "Š"; + case "T": return "Ť"; + case "Z": return "Ž"; + case "c": return "č"; + case "d": return "ď"; + case "e": return "ě"; + case "l": return "ľ"; + case "n": return "ň"; + case "r": return "ř"; + case "s": return "š"; + case "t": return "ť"; + case "z": return "ž"; + } + return string.Empty; + default: + return encoding.GetString(buffer, index, 1); + } + } + + if (header.CharacterCodeTableNumber == "01") // Latin/Cyrillic alphabet - from ISO 8859/5-1988 + { + return Encoding.GetEncoding("ISO-8859-5").GetString(buffer, index, 1); + } + + if (header.CharacterCodeTableNumber == "02") // Latin/Arabic alphabet - from ISO 8859/6-1987 + { + return Encoding.GetEncoding("ISO-8859-6").GetString(buffer, index, 1); + } + + if (header.CharacterCodeTableNumber == "03") // Latin/Greek alphabet - from ISO 8859/7-1987 + { + return Encoding.GetEncoding("ISO-8859-7").GetString(buffer, index, 1); // or ISO-8859-1 ? + } + + if (header.CharacterCodeTableNumber == "04") // Latin/Hebrew alphabet - from ISO 8859/8-1988 + { + return Encoding.GetEncoding("ISO-8859-8").GetString(buffer, index, 1); + } + + return string.Empty; + } + + /// + /// Read Text and Timing Information (TTI) block. + /// Each Text and Timing Information (TTI) block consists of 128 bytes. + /// + private IEnumerable ReadTextAndTiming(byte[] buffer, EbuGeneralSubtitleInformation header) + { + const int startOfTextAndTimingBlock = 1024; + const int ttiSize = 128; + const byte italicsOn = 0x80; + const byte italicsOff = 0x81; + const byte underlineOn = 0x82; + const byte underlineOff = 0x83; + const byte boxingOn = 0x84; + const byte boxingOff = 0x85; + + var list = new List(); + int index = startOfTextAndTimingBlock; + while (index + ttiSize <= buffer.Length) + { + var tti = new EbuTextTimingInformation + { + SubtitleGroupNumber = buffer[index], + SubtitleNumber = (ushort)(buffer[index + 2] * 256 + buffer[index + 1]), + ExtensionBlockNumber = buffer[index + 3], + CumulativeStatus = buffer[index + 4], + TimeCodeInHours = buffer[index + 5 + 0], + TimeCodeInMinutes = buffer[index + 5 + 1], + TimeCodeInSeconds = buffer[index + 5 + 2], + TimeCodeInMilliseconds = FramesToMillisecondsMax999(buffer[index + 5 + 3]), + TimeCodeOutHours = buffer[index + 9 + 0], + TimeCodeOutMinutes = buffer[index + 9 + 1], + TimeCodeOutSeconds = buffer[index + 9 + 2], + TimeCodeOutMilliseconds = FramesToMillisecondsMax999(buffer[index + 9 + 3]), + VerticalPosition = buffer[index + 13], + JustificationCode = buffer[index + 14], + CommentFlag = buffer[index + 15] + }; + VerticalPositions.Add(tti.VerticalPosition); + JustificationCodes.Add(tti.JustificationCode); + + // Text block + // - has a fixed length of 112 byte + // - 8Ah = new line + // - unused space = 8Fh + int i = index + 16; // text block start at 17th byte (index 16) + var open = header.DisplayStandardCode != "1" && header.DisplayStandardCode != "2"; + var closed = header.DisplayStandardCode != "0"; + int max = i + 112; + var sb = new StringBuilder(); + while (i < max) + { + var b = buffer[i]; + if (b <= 0x1f) // Closed - Teletext control codes + { + if (closed) + { + var tag = GetColorOrTag(b); + if (!string.IsNullOrEmpty(tag)) + { + sb.Append(tag); + } + } + } + else if (b >= 0x20 && b <= 0x7f) // Both - Character codes + { + var ch = GetCharacter(out var skipNext, header, buffer, i); + sb.Append(ch); + if (skipNext) + { + i++; + } + } + else if (b >= 0x80 && b <= 0x85) // Open - italic/underline/boxing + { + if (open) + { + if (b == italicsOn && header.LanguageCode != LanguageCodeChinese) + { + sb.Append(""); + } + else if (b == italicsOff && header.LanguageCode != LanguageCodeChinese) + { + sb.Append(""); + } + else if (b == underlineOn && header.LanguageCode != LanguageCodeChinese) + { + sb.Append(""); + } + else if (b == underlineOff && header.LanguageCode != LanguageCodeChinese) + { + sb.Append(""); + } + else if (b == boxingOn && header.LanguageCode != LanguageCodeChinese) + { + sb.Append(""); + } + else if (b == boxingOff && header.LanguageCode != LanguageCodeChinese) + { + sb.Append(""); + } + } + } + else if (b >= 0x86 && b <= 0x89) // Both - Reserved for future use + { + } + else if (b == 0x8a) // Both - CR/LF + { + sb.AppendLine(); + } + else if (b >= 0x8b && b <= 0x8e) // Both - Reserved for future use + { + } + else if (b == 0x8f) // Both - unused space + { + } + else if (b >= 0x90 && b <= 0x9f) // Both - Reserved for future use + { + } + else if (b >= 0xa1 && b <= 0xff) // Both - Character codes + { + var ch = GetCharacter(out var skipNext, header, buffer, i); + sb.Append(ch); + if (skipNext) + { + i++; + } + } + i++; + } + tti.TextField = FixSpacesAndTags(sb.ToString()); + + if (!int.TryParse(header.MaximumNumberOfDisplayableRows, out var rows)) + { + rows = 23; + } + + if (tti.VerticalPosition < 3) + { + if (tti.JustificationCode == 1) // left + { + tti.TextField = "{\\an7}" + tti.TextField; + } + else if (tti.JustificationCode == 3) // right + { + tti.TextField = "{\\an9}" + tti.TextField; + } + else + { + tti.TextField = "{\\an8}" + tti.TextField; + } + } + else if (tti.VerticalPosition <= rows / 2 + 1) + { + if (tti.JustificationCode == 1) // left + { + tti.TextField = "{\\an4}" + tti.TextField; + } + else if (tti.JustificationCode == 3) // right + { + tti.TextField = "{\\an6}" + tti.TextField; + } + else + { + tti.TextField = "{\\an5}" + tti.TextField; + } + } + else + { + if (tti.JustificationCode == 1) // left + { + tti.TextField = "{\\an1}" + tti.TextField; + } + else if (tti.JustificationCode == 3) // right + { + tti.TextField = "{\\an3}" + tti.TextField; + } + } + index += ttiSize; + list.Add(tti); + } + return list; + } + + private static string GetColorOrTag(byte b) + { + switch (b) + { + case 0x00: + return ""; + case 0x01: + return ""; + case 0x02: + return ""; + case 0x03: + return ""; + case 0x04: + return ""; + case 0x05: + return ""; + case 0x06: + return ""; + case 0x07: + return ""; + //case 0x0a: + // return ""; + //case 0x0b: + // return ""; + } + return null; + } + + private static string FixSpacesAndTags(string text) + { + text = text.Trim(); + while (text.Contains(" ")) + { + text = text.Replace(" ", " "); + } + + var match = FontTagsNoSpace1.Match(text); + while (match.Success) + { + text = text.Remove(match.Index, match.Length).Insert(match.Index, match.Value.Replace(" ", string.Empty).Contains("", string.Empty); + } + + while (text.Contains(Environment.NewLine + Environment.NewLine)) + { + text = text.Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); + } + + var lines = text.SplitToLines(); + + // fix multi font tags, e.g. a color in the middle of a line + for (var index = 0; index < lines.Count; index++) + { + var whiteTag = ""; + var line = lines[index]; + var changed = false; + var count = Utilities.CountTagInText(line, " 1) + { + count = 0; + var endTags = 0; + var idx = line.IndexOf(" 0) + { + count++; + var start = line.Substring(idx); + if (count == 1 && start.StartsWith(whiteTag)) + { + line = line.Remove(idx, whiteTag.Length); + idx--; + changed = true; + lines[index] = line; + } + else if (count > 1 && start.StartsWith(whiteTag)) + { + line = line.Remove(idx, whiteTag.Length).Insert(idx, ""); + changed = true; + lines[index] = line; + endTags++; + count--; + } + else if (count > 1 && count > endTags + 1 && !start.StartsWith(whiteTag)) + { + line = line.Insert(idx, ""); + changed = true; + lines[index] = line; + idx += "".Length; + endTags++; + } + idx = line.IndexOf(" 0) + { + sb.Append(s); + if (count == 1 && !s.Contains("")) + { + sb.Append(""); + } + + sb.AppendLine(); + } + } + + text = sb.ToString().TrimEnd(); + + while (text.Contains(Environment.NewLine + " ")) + { + text = text.Replace(Environment.NewLine + " ", Environment.NewLine); + } + + // remove starting white spaces + match = FontTagsStartSpace.Match(text); + while (match.Success) + { + text = text.Remove(match.Index + match.Length - 1, 1); + match = FontTagsStartSpace.Match(text); + } + + // remove starting white spaces on 2+ line + match = FontTagsNewLineSpace.Match(text); + while (match.Success) + { + text = text.Remove(match.Index + match.Length - 1, 1); + match = FontTagsNewLineSpace.Match(text); + } + + text = text.Replace(" ", " "); + + text = HtmlUtil.FixInvalidItalicTags(text); + + return text; + } + + public override bool IsTextBased => false; + + public bool Save(string fileName, Stream stream, Subtitle subtitle, bool batchMode) + { + return Save(fileName, stream, subtitle, batchMode, null); + } + } +} diff --git a/libse/SubtitleFormats/Edl.cs b/src/libse/SubtitleFormats/Edl.cs similarity index 97% rename from libse/SubtitleFormats/Edl.cs rename to src/libse/SubtitleFormats/Edl.cs index 2bd17831a..4f70b7711 100644 --- a/libse/SubtitleFormats/Edl.cs +++ b/src/libse/SubtitleFormats/Edl.cs @@ -1,142 +1,142 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class Edl : SubtitleFormat - { - private static readonly Regex Regex = new Regex(@"^\d+\s+[A-Z]{2}\s+[A-Z]\s+[A-Z]\s+\d\d:\d\d:\d\d:\d\d\s+\d\d:\d\d:\d\d:\d\d\s+\d\d:\d\d:\d\d:\d\d\s+\d\d:\d\d:\d\d:\d\d$", RegexOptions.Compiled); - private const string TextPrefix = "* FROM CLIP NAME: "; - - public override string Extension => ".edl"; - - public override string Name => "EDL"; - - public override string ToText(Subtitle subtitle, string title) - { - var sb = new StringBuilder(); - sb.AppendLine("TITLE: " + title); - if (Configuration.Settings.General.CurrentFrameRate % 1.0 > 0.01) - { - sb.AppendLine("FCM: NON-DROP FRAME"); - } - else - { - sb.AppendLine("FCM: DROP FRAME"); - } - - sb.AppendLine(); - const string writeFormat = "{0:000000} {1} {2} {3} {4} {5} {6} {7}"; - for (int index = 0; index < subtitle.Paragraphs.Count; index++) - { - int no = index + 1; - var p = subtitle.Paragraphs[index]; - if (index == 0 && p.StartTime.TotalSeconds > 1) - { - var start = new TimeCode(p.StartTime.TotalMilliseconds - 1000.0); - var end = new TimeCode(p.StartTime.TotalMilliseconds - 1); - sb.AppendLine(string.Format(writeFormat, no, "BL", "V", "C", EncodeTimeCode(start), EncodeTimeCode(end), EncodeTimeCode(start), EncodeTimeCode(end))); - sb.AppendLine(); - } - var text = HtmlUtil.RemoveHtmlTags(p.Text, true); - sb.AppendLine(string.Format(writeFormat, no, "AX", "V", "C", EncodeTimeCode(p.StartTime), EncodeTimeCode(p.EndTime), EncodeTimeCode(p.StartTime), EncodeTimeCode(p.EndTime))); - sb.AppendLine(TextPrefix + text); - sb.AppendLine(); - var next = subtitle.GetParagraphOrDefault(no); - if (next != null && next.StartTime.TotalMilliseconds > p.EndTime.TotalMilliseconds + 100) - { - var start = new TimeCode(p.EndTime.TotalMilliseconds + 1); - var end = new TimeCode(start.TotalMilliseconds + 1000); - if (end.TotalMilliseconds >= next.StartTime.TotalMilliseconds) - { - end = new TimeCode(next.StartTime.TotalMilliseconds - 1); - } - sb.AppendLine(string.Format(writeFormat, no, "BL", "V", "C", EncodeTimeCode(start), EncodeTimeCode(end), EncodeTimeCode(start), EncodeTimeCode(end))); - sb.AppendLine(); - } - } - return sb.ToString().Trim() + Environment.NewLine; - } - - private static string EncodeTimeCode(TimeCode timeCode) - { - return $"{timeCode.Hours:00}:{timeCode.Minutes:00}:{timeCode.Seconds:00}:{MillisecondsToFramesMaxFrameRate(timeCode.Milliseconds):00}"; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { //002 AX V C 01:00:01:15 01:00:04:18 00:00:01:15 00:00:04:18 - //000002 AX V C 01:00:04:00 01:00:05:00 00:00:02:05 00:00:03:05 - _errorCount = 0; - Paragraph lastParagraph = null; - int count = 0; - var splitChar = new[] { ' ' }; - foreach (string line in lines) - { - bool isTimeCode = false; - if (line.Length > 0) - { - bool success = false; - if (line.Length > 65 && line.Length < 85 && line.IndexOf(':') > 20) - { - var match = Regex.Match(line); - if (match.Success) - { - isTimeCode = true; - if (lastParagraph != null && Math.Abs(lastParagraph.StartTime.TotalMilliseconds + 1) > 0.001) - { - subtitle.Paragraphs.Add(lastParagraph); - } - - var arr = line.Split(splitChar, StringSplitOptions.RemoveEmptyEntries); - try - { - if (arr.Length == 8 && arr[1] != "BL") - { - var start = DecodeTimeCodeFrames(arr[6], SplitCharColon); - var end = DecodeTimeCodeFrames(arr[7], SplitCharColon); - lastParagraph = new Paragraph(start, end, string.Empty); - success = true; - } - else - { - lastParagraph = new Paragraph(string.Empty, -1, -1); - } - } - catch - { - _errorCount++; - } - } - } - if (!isTimeCode && !string.IsNullOrWhiteSpace(line) && lastParagraph != null && Utilities.GetNumberOfLines(lastParagraph.Text) < 5) - { - lastParagraph.Text = (lastParagraph.Text + Environment.NewLine + line).Trim(); - success = true; - } - if (!success && count > 9) - { - _errorCount++; - } - } - count++; - } - if (lastParagraph != null) - { - subtitle.Paragraphs.Add(lastParagraph); - } - foreach (var paragraph in subtitle.Paragraphs) - { - if (paragraph.Text.StartsWith(TextPrefix, StringComparison.Ordinal)) - { - paragraph.Text = paragraph.Text.Remove(0, TextPrefix.Length).TrimStart(); - } - } - - subtitle.Renumber(); - } - - } +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class Edl : SubtitleFormat + { + private static readonly Regex Regex = new Regex(@"^\d+\s+[A-Z]{2}\s+[A-Z]\s+[A-Z]\s+\d\d:\d\d:\d\d:\d\d\s+\d\d:\d\d:\d\d:\d\d\s+\d\d:\d\d:\d\d:\d\d\s+\d\d:\d\d:\d\d:\d\d$", RegexOptions.Compiled); + private const string TextPrefix = "* FROM CLIP NAME: "; + + public override string Extension => ".edl"; + + public override string Name => "EDL"; + + public override string ToText(Subtitle subtitle, string title) + { + var sb = new StringBuilder(); + sb.AppendLine("TITLE: " + title); + if (Configuration.Settings.General.CurrentFrameRate % 1.0 > 0.01) + { + sb.AppendLine("FCM: NON-DROP FRAME"); + } + else + { + sb.AppendLine("FCM: DROP FRAME"); + } + + sb.AppendLine(); + const string writeFormat = "{0:000000} {1} {2} {3} {4} {5} {6} {7}"; + for (int index = 0; index < subtitle.Paragraphs.Count; index++) + { + int no = index + 1; + var p = subtitle.Paragraphs[index]; + if (index == 0 && p.StartTime.TotalSeconds > 1) + { + var start = new TimeCode(p.StartTime.TotalMilliseconds - 1000.0); + var end = new TimeCode(p.StartTime.TotalMilliseconds - 1); + sb.AppendLine(string.Format(writeFormat, no, "BL", "V", "C", EncodeTimeCode(start), EncodeTimeCode(end), EncodeTimeCode(start), EncodeTimeCode(end))); + sb.AppendLine(); + } + var text = HtmlUtil.RemoveHtmlTags(p.Text, true); + sb.AppendLine(string.Format(writeFormat, no, "AX", "V", "C", EncodeTimeCode(p.StartTime), EncodeTimeCode(p.EndTime), EncodeTimeCode(p.StartTime), EncodeTimeCode(p.EndTime))); + sb.AppendLine(TextPrefix + text); + sb.AppendLine(); + var next = subtitle.GetParagraphOrDefault(no); + if (next != null && next.StartTime.TotalMilliseconds > p.EndTime.TotalMilliseconds + 100) + { + var start = new TimeCode(p.EndTime.TotalMilliseconds + 1); + var end = new TimeCode(start.TotalMilliseconds + 1000); + if (end.TotalMilliseconds >= next.StartTime.TotalMilliseconds) + { + end = new TimeCode(next.StartTime.TotalMilliseconds - 1); + } + sb.AppendLine(string.Format(writeFormat, no, "BL", "V", "C", EncodeTimeCode(start), EncodeTimeCode(end), EncodeTimeCode(start), EncodeTimeCode(end))); + sb.AppendLine(); + } + } + return sb.ToString().Trim() + Environment.NewLine; + } + + private static string EncodeTimeCode(TimeCode timeCode) + { + return $"{timeCode.Hours:00}:{timeCode.Minutes:00}:{timeCode.Seconds:00}:{MillisecondsToFramesMaxFrameRate(timeCode.Milliseconds):00}"; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { //002 AX V C 01:00:01:15 01:00:04:18 00:00:01:15 00:00:04:18 + //000002 AX V C 01:00:04:00 01:00:05:00 00:00:02:05 00:00:03:05 + _errorCount = 0; + Paragraph lastParagraph = null; + int count = 0; + var splitChar = new[] { ' ' }; + foreach (string line in lines) + { + bool isTimeCode = false; + if (line.Length > 0) + { + bool success = false; + if (line.Length > 65 && line.Length < 85 && line.IndexOf(':') > 20) + { + var match = Regex.Match(line); + if (match.Success) + { + isTimeCode = true; + if (lastParagraph != null && Math.Abs(lastParagraph.StartTime.TotalMilliseconds + 1) > 0.001) + { + subtitle.Paragraphs.Add(lastParagraph); + } + + var arr = line.Split(splitChar, StringSplitOptions.RemoveEmptyEntries); + try + { + if (arr.Length == 8 && arr[1] != "BL") + { + var start = DecodeTimeCodeFrames(arr[6], SplitCharColon); + var end = DecodeTimeCodeFrames(arr[7], SplitCharColon); + lastParagraph = new Paragraph(start, end, string.Empty); + success = true; + } + else + { + lastParagraph = new Paragraph(string.Empty, -1, -1); + } + } + catch + { + _errorCount++; + } + } + } + if (!isTimeCode && !string.IsNullOrWhiteSpace(line) && lastParagraph != null && Utilities.GetNumberOfLines(lastParagraph.Text) < 5) + { + lastParagraph.Text = (lastParagraph.Text + Environment.NewLine + line).Trim(); + success = true; + } + if (!success && count > 9) + { + _errorCount++; + } + } + count++; + } + if (lastParagraph != null) + { + subtitle.Paragraphs.Add(lastParagraph); + } + foreach (var paragraph in subtitle.Paragraphs) + { + if (paragraph.Text.StartsWith(TextPrefix, StringComparison.Ordinal)) + { + paragraph.Text = paragraph.Text.Remove(0, TextPrefix.Length).TrimStart(); + } + } + + subtitle.Renumber(); + } + + } } \ No newline at end of file diff --git a/libse/SubtitleFormats/Eeg708.cs b/src/libse/SubtitleFormats/Eeg708.cs similarity index 97% rename from libse/SubtitleFormats/Eeg708.cs rename to src/libse/SubtitleFormats/Eeg708.cs index 9ba402f77..c6fbeaa2b 100644 --- a/libse/SubtitleFormats/Eeg708.cs +++ b/src/libse/SubtitleFormats/Eeg708.cs @@ -1,105 +1,105 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class Eeg708 : SubtitleFormat - { - public override string Extension => ".xml"; - - public override string Name => "EEG 708"; - - public override string ToText(Subtitle subtitle, string title) - { - string xmlStructure = - "" + Environment.NewLine + - ""; - - var xml = new XmlDocument(); - xml.LoadXml(xmlStructure); - - foreach (Paragraph p in subtitle.Paragraphs) - { - XmlNode paragraph = xml.CreateElement("Caption"); - XmlAttribute start = xml.CreateAttribute("timecode"); - start.InnerText = EncodeTimeCode(p.StartTime); - paragraph.Attributes.Append(start); - XmlNode text = xml.CreateElement("Text"); - text.InnerText = p.Text; - paragraph.AppendChild(text); - xml.DocumentElement.AppendChild(paragraph); - - paragraph = xml.CreateElement("Caption"); - start = xml.CreateAttribute("timecode"); - start.InnerText = EncodeTimeCode(p.EndTime); - paragraph.Attributes.Append(start); - xml.DocumentElement.AppendChild(paragraph); - } - - return ToUtf8XmlString(xml); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - - string allText = sb.ToString(); - if (!allText.Contains("", Environment.NewLine).Replace("
", Environment.NewLine); - TimeCode startTime = DecodeTimeCodeFramesFourParts(start.Split(':')); - lastParagraph = new Paragraph(s, startTime.TotalMilliseconds, startTime.TotalMilliseconds + 3000); - subtitle.Paragraphs.Add(lastParagraph); - } - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine(ex.Message); - _errorCount++; - } - } - subtitle.Renumber(); - } - - private static string EncodeTimeCode(TimeCode time) - { - return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}:{MillisecondsToFramesMaxFrameRate(time.Milliseconds):00}"; - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class Eeg708 : SubtitleFormat + { + public override string Extension => ".xml"; + + public override string Name => "EEG 708"; + + public override string ToText(Subtitle subtitle, string title) + { + string xmlStructure = + "" + Environment.NewLine + + ""; + + var xml = new XmlDocument(); + xml.LoadXml(xmlStructure); + + foreach (Paragraph p in subtitle.Paragraphs) + { + XmlNode paragraph = xml.CreateElement("Caption"); + XmlAttribute start = xml.CreateAttribute("timecode"); + start.InnerText = EncodeTimeCode(p.StartTime); + paragraph.Attributes.Append(start); + XmlNode text = xml.CreateElement("Text"); + text.InnerText = p.Text; + paragraph.AppendChild(text); + xml.DocumentElement.AppendChild(paragraph); + + paragraph = xml.CreateElement("Caption"); + start = xml.CreateAttribute("timecode"); + start.InnerText = EncodeTimeCode(p.EndTime); + paragraph.Attributes.Append(start); + xml.DocumentElement.AppendChild(paragraph); + } + + return ToUtf8XmlString(xml); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + + string allText = sb.ToString(); + if (!allText.Contains("", Environment.NewLine).Replace("
", Environment.NewLine); + TimeCode startTime = DecodeTimeCodeFramesFourParts(start.Split(':')); + lastParagraph = new Paragraph(s, startTime.TotalMilliseconds, startTime.TotalMilliseconds + 3000); + subtitle.Paragraphs.Add(lastParagraph); + } + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine(ex.Message); + _errorCount++; + } + } + subtitle.Renumber(); + } + + private static string EncodeTimeCode(TimeCode time) + { + return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}:{MillisecondsToFramesMaxFrameRate(time.Milliseconds):00}"; + } + + } +} diff --git a/libse/SubtitleFormats/ElrPrint.cs b/src/libse/SubtitleFormats/ElrPrint.cs similarity index 100% rename from libse/SubtitleFormats/ElrPrint.cs rename to src/libse/SubtitleFormats/ElrPrint.cs diff --git a/libse/SubtitleFormats/F4Rtf.cs b/src/libse/SubtitleFormats/F4Rtf.cs similarity index 96% rename from libse/SubtitleFormats/F4Rtf.cs rename to src/libse/SubtitleFormats/F4Rtf.cs index 14791a08d..0ef584711 100644 --- a/libse/SubtitleFormats/F4Rtf.cs +++ b/src/libse/SubtitleFormats/F4Rtf.cs @@ -1,48 +1,48 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class F4Rtf : F4Text - { - public override string Extension => ".rtf"; - - public override string Name => "F4 Rich Text Format"; - - public override bool IsMine(List lines, string fileName) - { - if (fileName != null && !fileName.EndsWith(Extension, StringComparison.OrdinalIgnoreCase)) - { - return false; - } - - return base.IsMine(lines, fileName); - } - - public override string ToText(Subtitle subtitle, string title) - { - return ToF4Text(subtitle).ToRtf(); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - var sb = new StringBuilder(); - foreach (string line in lines) - { - sb.AppendLine(line); - } - - string rtf = sb.ToString().Trim(); - if (!rtf.StartsWith("{\\rtf", StringComparison.Ordinal)) - { - return; - } - - LoadF4TextSubtitle(subtitle, rtf.FromRtf()); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class F4Rtf : F4Text + { + public override string Extension => ".rtf"; + + public override string Name => "F4 Rich Text Format"; + + public override bool IsMine(List lines, string fileName) + { + if (fileName != null && !fileName.EndsWith(Extension, StringComparison.OrdinalIgnoreCase)) + { + return false; + } + + return base.IsMine(lines, fileName); + } + + public override string ToText(Subtitle subtitle, string title) + { + return ToF4Text(subtitle).ToRtf(); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + var sb = new StringBuilder(); + foreach (string line in lines) + { + sb.AppendLine(line); + } + + string rtf = sb.ToString().Trim(); + if (!rtf.StartsWith("{\\rtf", StringComparison.Ordinal)) + { + return; + } + + LoadF4TextSubtitle(subtitle, rtf.FromRtf()); + } + + } +} diff --git a/libse/SubtitleFormats/F4Text.cs b/src/libse/SubtitleFormats/F4Text.cs similarity index 97% rename from libse/SubtitleFormats/F4Text.cs rename to src/libse/SubtitleFormats/F4Text.cs index e09f54fa8..30287ca53 100644 --- a/libse/SubtitleFormats/F4Text.cs +++ b/src/libse/SubtitleFormats/F4Text.cs @@ -1,156 +1,156 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - /// - /// #00:00:06-8# - /// http://www.audiotranskription.de - /// - public class F4Text : SubtitleFormat - { - private static readonly Regex RegexTimeCodes = new Regex(@"^\d\d:\d\d:\d\d-\d$", RegexOptions.Compiled); - - public override string Extension => ".txt"; - - public override string Name => "F4 Text"; - - public override bool IsMine(List lines, string fileName) - { - if (fileName != null && !fileName.EndsWith(Extension, StringComparison.OrdinalIgnoreCase)) - { - return false; - } - - return base.IsMine(lines, fileName); - } - - public static string ToF4Text(Subtitle subtitle) - { - var sb = new StringBuilder(); - const string writeFormat = "{0}{1}"; - foreach (Paragraph p in subtitle.Paragraphs) - { - sb.AppendFormat(writeFormat, HtmlUtil.RemoveHtmlTags(p.Text, true), EncodeTimeCode(p.EndTime)); - } - return sb.ToString().Trim(); - } - - public override string ToText(Subtitle subtitle, string title) - { - return ToF4Text(subtitle); - } - - private static string EncodeTimeCode(TimeCode time) - { - return $" #{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}-{Math.Round(time.Milliseconds / 100.0, 0):0}# "; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - var sb = new StringBuilder(); - foreach (string line in lines) - { - sb.AppendLine(line); - } - - string text = sb.ToString(); - if (text.Contains("{\\rtf") || text.Contains("")) - { - return; - } - - LoadF4TextSubtitle(subtitle, text); - } - - protected void LoadF4TextSubtitle(Subtitle subtitle, string text) - { - Paragraph p = null; - subtitle.Paragraphs.Clear(); - var arr = text.Trim().Split(new[] { '#' }, StringSplitOptions.RemoveEmptyEntries); - var currentText = new StringBuilder(); - foreach (string line in arr) - { - if (RegexTimeCodes.IsMatch(line)) - { - if (p == null) - { - p = new Paragraph(); - if (currentText.Length > 0) - { - p.Text = currentText.ToString().Trim().Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); - p.Text = p.Text.Trim('\n', '\r'); - subtitle.Paragraphs.Add(p); - p = new Paragraph(); - } - } - if (Math.Abs(p.StartTime.TotalMilliseconds) < 0.01 || currentText.Length == 0) - { - p.StartTime = DecodeTimeCode(line.Split(new[] { ':', '-' }, StringSplitOptions.RemoveEmptyEntries)); - } - else - { - p.EndTime = DecodeTimeCode(line.Split(new[] { ':', '-' }, StringSplitOptions.RemoveEmptyEntries)); - p.Text = currentText.ToString().Trim().Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); - p.Text = p.Text.Trim('\n', '\r').Trim(); - subtitle.Paragraphs.Add(p); - p = null; - currentText.Clear(); - } - } - else - { - if (p == null && subtitle.Paragraphs.Count > 0) - { - p = new Paragraph { StartTime = { TotalMilliseconds = subtitle.Paragraphs[subtitle.Paragraphs.Count - 1].EndTime.TotalMilliseconds } }; - } - currentText.AppendLine(line.Trim()); - } - } - if (currentText.Length > 0 && subtitle.Paragraphs.Count > 0 && currentText.Length < 1000) - { - if (p == null) - { - p = new Paragraph(); - } - - p.Text = currentText.ToString().Trim().Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); - p.Text = p.Text.Trim('\n', '\r').Trim(); - p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + 3000; - subtitle.Paragraphs.Add(p); - } - subtitle.Renumber(); - } - - private TimeCode DecodeTimeCode(string[] parts) - { - var tc = new TimeCode(); - try - { - int hour = int.Parse(parts[0]); - int minutes = int.Parse(parts[1]); - int seconds = int.Parse(parts[2]); - int millisecond = int.Parse(parts[3]); - - int milliseconds = (int)Math.Round(millisecond * 100.0); - if (milliseconds > 999) - { - milliseconds = 999; - } - - tc = new TimeCode(hour, minutes, seconds, milliseconds); - } - catch (Exception exception) - { - System.Diagnostics.Debug.WriteLine(exception.Message); - _errorCount++; - } - return tc; - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + /// + /// #00:00:06-8# + /// http://www.audiotranskription.de + /// + public class F4Text : SubtitleFormat + { + private static readonly Regex RegexTimeCodes = new Regex(@"^\d\d:\d\d:\d\d-\d$", RegexOptions.Compiled); + + public override string Extension => ".txt"; + + public override string Name => "F4 Text"; + + public override bool IsMine(List lines, string fileName) + { + if (fileName != null && !fileName.EndsWith(Extension, StringComparison.OrdinalIgnoreCase)) + { + return false; + } + + return base.IsMine(lines, fileName); + } + + public static string ToF4Text(Subtitle subtitle) + { + var sb = new StringBuilder(); + const string writeFormat = "{0}{1}"; + foreach (Paragraph p in subtitle.Paragraphs) + { + sb.AppendFormat(writeFormat, HtmlUtil.RemoveHtmlTags(p.Text, true), EncodeTimeCode(p.EndTime)); + } + return sb.ToString().Trim(); + } + + public override string ToText(Subtitle subtitle, string title) + { + return ToF4Text(subtitle); + } + + private static string EncodeTimeCode(TimeCode time) + { + return $" #{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}-{Math.Round(time.Milliseconds / 100.0, 0):0}# "; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + var sb = new StringBuilder(); + foreach (string line in lines) + { + sb.AppendLine(line); + } + + string text = sb.ToString(); + if (text.Contains("{\\rtf") || text.Contains("")) + { + return; + } + + LoadF4TextSubtitle(subtitle, text); + } + + protected void LoadF4TextSubtitle(Subtitle subtitle, string text) + { + Paragraph p = null; + subtitle.Paragraphs.Clear(); + var arr = text.Trim().Split(new[] { '#' }, StringSplitOptions.RemoveEmptyEntries); + var currentText = new StringBuilder(); + foreach (string line in arr) + { + if (RegexTimeCodes.IsMatch(line)) + { + if (p == null) + { + p = new Paragraph(); + if (currentText.Length > 0) + { + p.Text = currentText.ToString().Trim().Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); + p.Text = p.Text.Trim('\n', '\r'); + subtitle.Paragraphs.Add(p); + p = new Paragraph(); + } + } + if (Math.Abs(p.StartTime.TotalMilliseconds) < 0.01 || currentText.Length == 0) + { + p.StartTime = DecodeTimeCode(line.Split(new[] { ':', '-' }, StringSplitOptions.RemoveEmptyEntries)); + } + else + { + p.EndTime = DecodeTimeCode(line.Split(new[] { ':', '-' }, StringSplitOptions.RemoveEmptyEntries)); + p.Text = currentText.ToString().Trim().Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); + p.Text = p.Text.Trim('\n', '\r').Trim(); + subtitle.Paragraphs.Add(p); + p = null; + currentText.Clear(); + } + } + else + { + if (p == null && subtitle.Paragraphs.Count > 0) + { + p = new Paragraph { StartTime = { TotalMilliseconds = subtitle.Paragraphs[subtitle.Paragraphs.Count - 1].EndTime.TotalMilliseconds } }; + } + currentText.AppendLine(line.Trim()); + } + } + if (currentText.Length > 0 && subtitle.Paragraphs.Count > 0 && currentText.Length < 1000) + { + if (p == null) + { + p = new Paragraph(); + } + + p.Text = currentText.ToString().Trim().Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); + p.Text = p.Text.Trim('\n', '\r').Trim(); + p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + 3000; + subtitle.Paragraphs.Add(p); + } + subtitle.Renumber(); + } + + private TimeCode DecodeTimeCode(string[] parts) + { + var tc = new TimeCode(); + try + { + int hour = int.Parse(parts[0]); + int minutes = int.Parse(parts[1]); + int seconds = int.Parse(parts[2]); + int millisecond = int.Parse(parts[3]); + + int milliseconds = (int)Math.Round(millisecond * 100.0); + if (milliseconds > 999) + { + milliseconds = 999; + } + + tc = new TimeCode(hour, minutes, seconds, milliseconds); + } + catch (Exception exception) + { + System.Diagnostics.Debug.WriteLine(exception.Message); + _errorCount++; + } + return tc; + } + + } +} diff --git a/libse/SubtitleFormats/F4Xml.cs b/src/libse/SubtitleFormats/F4Xml.cs similarity index 96% rename from libse/SubtitleFormats/F4Xml.cs rename to src/libse/SubtitleFormats/F4Xml.cs index 6f712dd9f..c8b4c460a 100644 --- a/libse/SubtitleFormats/F4Xml.cs +++ b/src/libse/SubtitleFormats/F4Xml.cs @@ -1,74 +1,74 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class F4Xml : F4Text - { - public override string Extension => ".xml"; - - public override string Name => "F4 Xml"; - - public override bool IsMine(List lines, string fileName) - { - if (fileName != null && !fileName.EndsWith(Extension, StringComparison.OrdinalIgnoreCase)) - { - return false; - } - - return base.IsMine(lines, fileName); - } - - public override string ToText(Subtitle subtitle, string title) - { - var xml = new XmlDocument(); - var template = @" - - - - -".Replace("'", "\""); - xml.LoadXml(template); - xml.DocumentElement.SelectSingleNode("content").Attributes["content"].Value = ToF4Text(subtitle); - - return ToUtf8XmlString(xml); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - var sb = new StringBuilder(); - foreach (string line in lines) - { - sb.AppendLine(line); - } - - string xml = sb.ToString(); - if (!xml.Contains(" ".xml"; + + public override string Name => "F4 Xml"; + + public override bool IsMine(List lines, string fileName) + { + if (fileName != null && !fileName.EndsWith(Extension, StringComparison.OrdinalIgnoreCase)) + { + return false; + } + + return base.IsMine(lines, fileName); + } + + public override string ToText(Subtitle subtitle, string title) + { + var xml = new XmlDocument(); + var template = @" + + + + +".Replace("'", "\""); + xml.LoadXml(template); + xml.DocumentElement.SelectSingleNode("content").Attributes["content"].Value = ToF4Text(subtitle); + + return ToUtf8XmlString(xml); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + var sb = new StringBuilder(); + foreach (string line in lines) + { + sb.AppendLine(line); + } + + string xml = sb.ToString(); + if (!xml.Contains(" ".xml"; - - public override string Name => "FLVCoreCuePoints"; - - public override string ToText(Subtitle subtitle, string title) - { - string xmlStructure = - "" + Environment.NewLine + - ""; - - var xml = new XmlDocument(); - xml.LoadXml(xmlStructure); - - foreach (Paragraph p in subtitle.Paragraphs) - { - XmlNode paragraph = xml.CreateElement("CuePoint"); - - XmlNode startTime = xml.CreateElement("Time"); - startTime.InnerText = p.StartTime.TotalMilliseconds.ToString(); - paragraph.AppendChild(startTime); - - XmlNode paragraphType = xml.CreateElement("Type"); - paragraphType.InnerText = "event"; - paragraph.AppendChild(paragraphType); - - XmlNode name = xml.CreateElement("Name"); - name.InnerText = p.Text; - paragraph.AppendChild(name); - - XmlNode parameters = xml.CreateElement("Parameters"); - - XmlNode parameter = xml.CreateElement("Parameter"); - name = xml.CreateElement("Name"); - name.InnerText = "source"; - XmlNode value = xml.CreateElement("Value"); - value.InnerText = "transcription"; - parameter.AppendChild(name); - parameter.AppendChild(value); - parameters.AppendChild(parameter); - - parameter = xml.CreateElement("Parameter"); - name = xml.CreateElement("Name"); - name.InnerText = "duration"; - value = xml.CreateElement("Value"); - value.InnerText = p.Duration.TotalMilliseconds.ToString(); - parameter.AppendChild(name); - parameter.AppendChild(value); - parameters.AppendChild(parameter); - - parameter = xml.CreateElement("Parameter"); - name = xml.CreateElement("Name"); - name.InnerText = "confidence"; - value = xml.CreateElement("Value"); - value.InnerText = "50"; - parameter.AppendChild(name); - parameter.AppendChild(value); - parameters.AppendChild(parameter); - - paragraph.AppendChild(parameters); - - xml.DocumentElement.AppendChild(paragraph); - } - - return ToUtf8XmlString(xml); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - - string allText = sb.ToString(); - if (!allText.Contains(" next.StartTime.TotalMilliseconds) - { - p.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; - } - } - } - - subtitle.Renumber(); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class FLVCoreCuePoints : SubtitleFormat + { + public override string Extension => ".xml"; + + public override string Name => "FLVCoreCuePoints"; + + public override string ToText(Subtitle subtitle, string title) + { + string xmlStructure = + "" + Environment.NewLine + + ""; + + var xml = new XmlDocument(); + xml.LoadXml(xmlStructure); + + foreach (Paragraph p in subtitle.Paragraphs) + { + XmlNode paragraph = xml.CreateElement("CuePoint"); + + XmlNode startTime = xml.CreateElement("Time"); + startTime.InnerText = p.StartTime.TotalMilliseconds.ToString(); + paragraph.AppendChild(startTime); + + XmlNode paragraphType = xml.CreateElement("Type"); + paragraphType.InnerText = "event"; + paragraph.AppendChild(paragraphType); + + XmlNode name = xml.CreateElement("Name"); + name.InnerText = p.Text; + paragraph.AppendChild(name); + + XmlNode parameters = xml.CreateElement("Parameters"); + + XmlNode parameter = xml.CreateElement("Parameter"); + name = xml.CreateElement("Name"); + name.InnerText = "source"; + XmlNode value = xml.CreateElement("Value"); + value.InnerText = "transcription"; + parameter.AppendChild(name); + parameter.AppendChild(value); + parameters.AppendChild(parameter); + + parameter = xml.CreateElement("Parameter"); + name = xml.CreateElement("Name"); + name.InnerText = "duration"; + value = xml.CreateElement("Value"); + value.InnerText = p.Duration.TotalMilliseconds.ToString(); + parameter.AppendChild(name); + parameter.AppendChild(value); + parameters.AppendChild(parameter); + + parameter = xml.CreateElement("Parameter"); + name = xml.CreateElement("Name"); + name.InnerText = "confidence"; + value = xml.CreateElement("Value"); + value.InnerText = "50"; + parameter.AppendChild(name); + parameter.AppendChild(value); + parameters.AppendChild(parameter); + + paragraph.AppendChild(parameters); + + xml.DocumentElement.AppendChild(paragraph); + } + + return ToUtf8XmlString(xml); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + + string allText = sb.ToString(); + if (!allText.Contains(" next.StartTime.TotalMilliseconds) + { + p.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; + } + } + } + + subtitle.Renumber(); + } + + } +} diff --git a/libse/SubtitleFormats/FabSubtitler.cs b/src/libse/SubtitleFormats/FabSubtitler.cs similarity index 97% rename from libse/SubtitleFormats/FabSubtitler.cs rename to src/libse/SubtitleFormats/FabSubtitler.cs index 8a939e7aa..e9094e524 100644 --- a/libse/SubtitleFormats/FabSubtitler.cs +++ b/src/libse/SubtitleFormats/FabSubtitler.cs @@ -1,80 +1,80 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class FabSubtitler : SubtitleFormat - { - private static readonly Regex RegexTimeCodes = new Regex(@"^\d\d:\d\d:\d\d:\d\d \d\d:\d\d:\d\d:\d\d$", RegexOptions.Compiled); - - public override string Extension => ".txt"; - - public override string Name => "FAB Subtitler"; - - public override string ToText(Subtitle subtitle, string title) - { - var sb = new StringBuilder(); - const string writeFormat = "{0} {1}{2}{3}{2}"; - foreach (Paragraph p in subtitle.Paragraphs) - { - //00:50:34:22 00:50:39:13 - //Ich muss dafür sorgen, - //dass die Epsteins weiterleben - sb.AppendLine(string.Format(writeFormat, EncodeTimeCode(p.StartTime), EncodeTimeCode(p.EndTime), Environment.NewLine, HtmlUtil.RemoveHtmlTags(p.Text))); - } - return sb.ToString(); - } - - private static string EncodeTimeCode(TimeCode time) - { - //00:50:39:13 (last is frame) - return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}:{MillisecondsToFramesMaxFrameRate(time.Milliseconds):00}"; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - //00:03:15:22 00:03:23:10 This is line one. - //This is line two. - Paragraph p = null; - subtitle.Paragraphs.Clear(); - _errorCount = 0; - foreach (string line in lines) - { - if (RegexTimeCodes.IsMatch(line)) - { - string temp = line.Substring(0, RegexTimeCodes.Match(line).Length); - string start = temp.Substring(0, 11); - string end = temp.Substring(13, 11); - - string[] startParts = start.Split(SplitCharColon, StringSplitOptions.RemoveEmptyEntries); - string[] endParts = end.Split(SplitCharColon, StringSplitOptions.RemoveEmptyEntries); - if (startParts.Length == 4 && endParts.Length == 4) - { - p = new Paragraph(DecodeTimeCodeFramesFourParts(startParts), DecodeTimeCodeFramesFourParts(endParts), string.Empty); - subtitle.Paragraphs.Add(p); - } - } - else if (string.IsNullOrWhiteSpace(line)) - { - // skip these lines - } - else if (p != null) - { - if (string.IsNullOrEmpty(p.Text)) - { - p.Text = line; - } - else - { - p.Text = p.Text + Environment.NewLine + line; - } - } - } - - subtitle.Renumber(); - } - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class FabSubtitler : SubtitleFormat + { + private static readonly Regex RegexTimeCodes = new Regex(@"^\d\d:\d\d:\d\d:\d\d \d\d:\d\d:\d\d:\d\d$", RegexOptions.Compiled); + + public override string Extension => ".txt"; + + public override string Name => "FAB Subtitler"; + + public override string ToText(Subtitle subtitle, string title) + { + var sb = new StringBuilder(); + const string writeFormat = "{0} {1}{2}{3}{2}"; + foreach (Paragraph p in subtitle.Paragraphs) + { + //00:50:34:22 00:50:39:13 + //Ich muss dafür sorgen, + //dass die Epsteins weiterleben + sb.AppendLine(string.Format(writeFormat, EncodeTimeCode(p.StartTime), EncodeTimeCode(p.EndTime), Environment.NewLine, HtmlUtil.RemoveHtmlTags(p.Text))); + } + return sb.ToString(); + } + + private static string EncodeTimeCode(TimeCode time) + { + //00:50:39:13 (last is frame) + return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}:{MillisecondsToFramesMaxFrameRate(time.Milliseconds):00}"; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + //00:03:15:22 00:03:23:10 This is line one. + //This is line two. + Paragraph p = null; + subtitle.Paragraphs.Clear(); + _errorCount = 0; + foreach (string line in lines) + { + if (RegexTimeCodes.IsMatch(line)) + { + string temp = line.Substring(0, RegexTimeCodes.Match(line).Length); + string start = temp.Substring(0, 11); + string end = temp.Substring(13, 11); + + string[] startParts = start.Split(SplitCharColon, StringSplitOptions.RemoveEmptyEntries); + string[] endParts = end.Split(SplitCharColon, StringSplitOptions.RemoveEmptyEntries); + if (startParts.Length == 4 && endParts.Length == 4) + { + p = new Paragraph(DecodeTimeCodeFramesFourParts(startParts), DecodeTimeCodeFramesFourParts(endParts), string.Empty); + subtitle.Paragraphs.Add(p); + } + } + else if (string.IsNullOrWhiteSpace(line)) + { + // skip these lines + } + else if (p != null) + { + if (string.IsNullOrEmpty(p.Text)) + { + p.Text = line; + } + else + { + p.Text = p.Text + Environment.NewLine + line; + } + } + } + + subtitle.Renumber(); + } + } +} diff --git a/libse/SubtitleFormats/FilmEditXml.cs b/src/libse/SubtitleFormats/FilmEditXml.cs similarity index 97% rename from libse/SubtitleFormats/FilmEditXml.cs rename to src/libse/SubtitleFormats/FilmEditXml.cs index 35355e786..88eeb8d1b 100644 --- a/libse/SubtitleFormats/FilmEditXml.cs +++ b/src/libse/SubtitleFormats/FilmEditXml.cs @@ -1,155 +1,155 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class FilmEditXml : SubtitleFormat - { - public override string Extension => ".xml"; - - public override string Name => "Film Edit xml"; - - public override bool IsMine(List lines, string fileName) - { - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - string xmlAsString = sb.ToString().Trim(); - if (xmlAsString.Contains("") && xmlAsString.Contains("")) - { - var xml = new XmlDocument { XmlResolver = null }; - try - { - xml.LoadXml(xmlAsString); - var paragraphs = xml.DocumentElement.SelectNodes("subtitle"); - return paragraphs != null && paragraphs.Count > 0 && xml.DocumentElement.Name == "filmeditxml"; - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine(ex.Message); - } - } - return false; - } - - public override string ToText(Subtitle subtitle, string title) - { - string xmlStructure = - "" + Environment.NewLine + - "" + Environment.NewLine + - "Arial" + Environment.NewLine + - "22" + Environment.NewLine + - "720" + Environment.NewLine + - "576" + Environment.NewLine + - "586" + Environment.NewLine + - "330" + Environment.NewLine + - "1420" + Environment.NewLine + - "25" + Environment.NewLine + - "False" + Environment.NewLine + - ""; - - var xml = new XmlDocument(); - xml.LoadXml(xmlStructure); - XmlNode div = xml.DocumentElement; - int no = 0; - foreach (Paragraph p in subtitle.Paragraphs) - { - XmlNode paragraph = xml.CreateElement("subtitle"); - string text = HtmlUtil.RemoveHtmlTags(p.Text); - - XmlNode num = xml.CreateElement("num"); - num.InnerText = no.ToString(); - paragraph.AppendChild(num); - - XmlNode dur = xml.CreateElement("dur"); - dur.InnerText = EncodeDuration(p.Duration); - paragraph.AppendChild(dur); - - XmlNode textNode = xml.CreateElement("text"); - textNode.InnerText = text.Replace(Environment.NewLine, "\\N"); - paragraph.AppendChild(textNode); - - XmlNode timeIn = xml.CreateElement("in"); - timeIn.InnerText = EncodeTimeCode(p.StartTime); - paragraph.AppendChild(timeIn); - - XmlNode timeOut = xml.CreateElement("out"); - timeOut.InnerText = EncodeTimeCode(p.EndTime); - paragraph.AppendChild(timeOut); - - XmlNode align = xml.CreateElement("align"); - align.InnerText = "C"; - paragraph.AppendChild(align); - - XmlNode posx = xml.CreateElement("posx"); - posx.InnerText = "0"; - paragraph.AppendChild(posx); - - XmlNode post = xml.CreateElement("posy"); - post.InnerText = "308"; - paragraph.AppendChild(post); - - XmlNode memo = xml.CreateElement("memo"); - paragraph.AppendChild(memo); - - div.AppendChild(paragraph); - no++; - } - - return ToUtf8XmlString(xml); - } - - private static string EncodeDuration(TimeCode timeCode) - { - return $"{timeCode.Seconds:00}:{MillisecondsToFramesMaxFrameRate(timeCode.Milliseconds):00}"; - } - - private static string EncodeTimeCode(TimeCode timeCode) - { - return $"{timeCode.Hours:00}:{timeCode.Minutes:00}:{timeCode.Seconds:00}:{MillisecondsToFramesMaxFrameRate(timeCode.Milliseconds):00}"; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - var xml = new XmlDocument { XmlResolver = null }; - xml.LoadXml(sb.ToString().Trim()); - foreach (XmlNode node in xml.DocumentElement.SelectNodes("subtitle")) - { - try - { - var p = new Paragraph(); - foreach (XmlNode innerNode in node.ChildNodes) - { - switch (innerNode.Name) - { - case "text": - p.Text = innerNode.InnerText.Replace("\\N", Environment.NewLine); - break; - case "in": - p.StartTime = DecodeTimeCodeFrames(innerNode.InnerText, SplitCharColon); - break; - case "out": - p.EndTime = DecodeTimeCodeFrames(innerNode.InnerText, SplitCharColon); - break; - } - } - if (p.StartTime.TotalSeconds >= 0 && p.EndTime.TotalMilliseconds > 0 && !string.IsNullOrEmpty(p.Text)) - { - subtitle.Paragraphs.Add(p); - } - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine(ex.Message); - _errorCount++; - } - } - subtitle.Renumber(); - } - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class FilmEditXml : SubtitleFormat + { + public override string Extension => ".xml"; + + public override string Name => "Film Edit xml"; + + public override bool IsMine(List lines, string fileName) + { + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + string xmlAsString = sb.ToString().Trim(); + if (xmlAsString.Contains("") && xmlAsString.Contains("")) + { + var xml = new XmlDocument { XmlResolver = null }; + try + { + xml.LoadXml(xmlAsString); + var paragraphs = xml.DocumentElement.SelectNodes("subtitle"); + return paragraphs != null && paragraphs.Count > 0 && xml.DocumentElement.Name == "filmeditxml"; + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine(ex.Message); + } + } + return false; + } + + public override string ToText(Subtitle subtitle, string title) + { + string xmlStructure = + "" + Environment.NewLine + + "" + Environment.NewLine + + "Arial" + Environment.NewLine + + "22" + Environment.NewLine + + "720" + Environment.NewLine + + "576" + Environment.NewLine + + "586" + Environment.NewLine + + "330" + Environment.NewLine + + "1420" + Environment.NewLine + + "25" + Environment.NewLine + + "False" + Environment.NewLine + + ""; + + var xml = new XmlDocument(); + xml.LoadXml(xmlStructure); + XmlNode div = xml.DocumentElement; + int no = 0; + foreach (Paragraph p in subtitle.Paragraphs) + { + XmlNode paragraph = xml.CreateElement("subtitle"); + string text = HtmlUtil.RemoveHtmlTags(p.Text); + + XmlNode num = xml.CreateElement("num"); + num.InnerText = no.ToString(); + paragraph.AppendChild(num); + + XmlNode dur = xml.CreateElement("dur"); + dur.InnerText = EncodeDuration(p.Duration); + paragraph.AppendChild(dur); + + XmlNode textNode = xml.CreateElement("text"); + textNode.InnerText = text.Replace(Environment.NewLine, "\\N"); + paragraph.AppendChild(textNode); + + XmlNode timeIn = xml.CreateElement("in"); + timeIn.InnerText = EncodeTimeCode(p.StartTime); + paragraph.AppendChild(timeIn); + + XmlNode timeOut = xml.CreateElement("out"); + timeOut.InnerText = EncodeTimeCode(p.EndTime); + paragraph.AppendChild(timeOut); + + XmlNode align = xml.CreateElement("align"); + align.InnerText = "C"; + paragraph.AppendChild(align); + + XmlNode posx = xml.CreateElement("posx"); + posx.InnerText = "0"; + paragraph.AppendChild(posx); + + XmlNode post = xml.CreateElement("posy"); + post.InnerText = "308"; + paragraph.AppendChild(post); + + XmlNode memo = xml.CreateElement("memo"); + paragraph.AppendChild(memo); + + div.AppendChild(paragraph); + no++; + } + + return ToUtf8XmlString(xml); + } + + private static string EncodeDuration(TimeCode timeCode) + { + return $"{timeCode.Seconds:00}:{MillisecondsToFramesMaxFrameRate(timeCode.Milliseconds):00}"; + } + + private static string EncodeTimeCode(TimeCode timeCode) + { + return $"{timeCode.Hours:00}:{timeCode.Minutes:00}:{timeCode.Seconds:00}:{MillisecondsToFramesMaxFrameRate(timeCode.Milliseconds):00}"; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + var xml = new XmlDocument { XmlResolver = null }; + xml.LoadXml(sb.ToString().Trim()); + foreach (XmlNode node in xml.DocumentElement.SelectNodes("subtitle")) + { + try + { + var p = new Paragraph(); + foreach (XmlNode innerNode in node.ChildNodes) + { + switch (innerNode.Name) + { + case "text": + p.Text = innerNode.InnerText.Replace("\\N", Environment.NewLine); + break; + case "in": + p.StartTime = DecodeTimeCodeFrames(innerNode.InnerText, SplitCharColon); + break; + case "out": + p.EndTime = DecodeTimeCodeFrames(innerNode.InnerText, SplitCharColon); + break; + } + } + if (p.StartTime.TotalSeconds >= 0 && p.EndTime.TotalMilliseconds > 0 && !string.IsNullOrEmpty(p.Text)) + { + subtitle.Paragraphs.Add(p); + } + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine(ex.Message); + _errorCount++; + } + } + subtitle.Renumber(); + } + } +} diff --git a/libse/SubtitleFormats/FinalCutProImage.cs b/src/libse/SubtitleFormats/FinalCutProImage.cs similarity index 97% rename from libse/SubtitleFormats/FinalCutProImage.cs rename to src/libse/SubtitleFormats/FinalCutProImage.cs index c36999fae..3715e825c 100644 --- a/libse/SubtitleFormats/FinalCutProImage.cs +++ b/src/libse/SubtitleFormats/FinalCutProImage.cs @@ -1,107 +1,107 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class FinalCutProImage : SubtitleFormat - { - public double FrameRate { get; set; } - - public override string Extension => ".xml"; - - public override string Name => "Final Cut Pro Image"; - - public override string ToText(Subtitle subtitle, string title) - { - throw new NotImplementedException(); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - FrameRate = Configuration.Settings.General.CurrentFrameRate; - - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - var xml = new XmlDocument { XmlResolver = null }; - try - { - xml.LoadXml(sb.ToString().Trim()); - - if (xml.DocumentElement.SelectSingleNode("sequence/rate") != null && xml.DocumentElement.SelectSingleNode("sequence/rate/timebase") != null) - { - try - { - var frameRate = double.Parse(xml.DocumentElement.SelectSingleNode("sequence/rate/timebase").InnerText); - if (frameRate > 10 && frameRate < 2000) - { - Configuration.Settings.General.CurrentFrameRate = frameRate; - } - } - catch - { - // ignored - } - } - - - foreach (XmlNode node in xml.DocumentElement.SelectNodes("sequence/media/video/track/clipitem")) - { - try - { - XmlNode fileNode = node.SelectSingleNode("file"); - if (fileNode != null) - { - XmlNode fileNameNode = fileNode.SelectSingleNode("name"); - XmlNode pathurlNode = fileNode.SelectSingleNode("pathurl"); - if (fileNameNode != null) - { - var p = new Paragraph(); - p.Text = fileNameNode.InnerText; - if (pathurlNode != null) - { - p.Extra = pathurlNode.InnerText; - } - - XmlNode inNode = node.SelectSingleNode("in"); - XmlNode startNode = node.SelectSingleNode("start"); - if (startNode != null) - { - p.StartTime.TotalMilliseconds = FramesToMilliseconds(Convert.ToInt32(startNode.InnerText)); - } - else if (inNode != null) - { - p.StartTime.TotalMilliseconds = FramesToMilliseconds(Convert.ToInt32(inNode.InnerText)); - } - XmlNode outNode = node.SelectSingleNode("out"); - XmlNode endNode = node.SelectSingleNode("end"); - if (endNode != null) - { - p.EndTime.TotalMilliseconds = FramesToMilliseconds(Convert.ToInt32(endNode.InnerText)); - } - else if (outNode != null) - { - p.EndTime.TotalMilliseconds = FramesToMilliseconds(Convert.ToInt32(outNode.InnerText)); - } - subtitle.Paragraphs.Add(p); - } - } - } - catch - { - _errorCount++; - } - } - subtitle.Renumber(); - } - catch - { - _errorCount = 1; - } - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class FinalCutProImage : SubtitleFormat + { + public double FrameRate { get; set; } + + public override string Extension => ".xml"; + + public override string Name => "Final Cut Pro Image"; + + public override string ToText(Subtitle subtitle, string title) + { + throw new NotImplementedException(); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + FrameRate = Configuration.Settings.General.CurrentFrameRate; + + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + var xml = new XmlDocument { XmlResolver = null }; + try + { + xml.LoadXml(sb.ToString().Trim()); + + if (xml.DocumentElement.SelectSingleNode("sequence/rate") != null && xml.DocumentElement.SelectSingleNode("sequence/rate/timebase") != null) + { + try + { + var frameRate = double.Parse(xml.DocumentElement.SelectSingleNode("sequence/rate/timebase").InnerText); + if (frameRate > 10 && frameRate < 2000) + { + Configuration.Settings.General.CurrentFrameRate = frameRate; + } + } + catch + { + // ignored + } + } + + + foreach (XmlNode node in xml.DocumentElement.SelectNodes("sequence/media/video/track/clipitem")) + { + try + { + XmlNode fileNode = node.SelectSingleNode("file"); + if (fileNode != null) + { + XmlNode fileNameNode = fileNode.SelectSingleNode("name"); + XmlNode pathurlNode = fileNode.SelectSingleNode("pathurl"); + if (fileNameNode != null) + { + var p = new Paragraph(); + p.Text = fileNameNode.InnerText; + if (pathurlNode != null) + { + p.Extra = pathurlNode.InnerText; + } + + XmlNode inNode = node.SelectSingleNode("in"); + XmlNode startNode = node.SelectSingleNode("start"); + if (startNode != null) + { + p.StartTime.TotalMilliseconds = FramesToMilliseconds(Convert.ToInt32(startNode.InnerText)); + } + else if (inNode != null) + { + p.StartTime.TotalMilliseconds = FramesToMilliseconds(Convert.ToInt32(inNode.InnerText)); + } + XmlNode outNode = node.SelectSingleNode("out"); + XmlNode endNode = node.SelectSingleNode("end"); + if (endNode != null) + { + p.EndTime.TotalMilliseconds = FramesToMilliseconds(Convert.ToInt32(endNode.InnerText)); + } + else if (outNode != null) + { + p.EndTime.TotalMilliseconds = FramesToMilliseconds(Convert.ToInt32(outNode.InnerText)); + } + subtitle.Paragraphs.Add(p); + } + } + } + catch + { + _errorCount++; + } + } + subtitle.Renumber(); + } + catch + { + _errorCount = 1; + } + } + + } +} diff --git a/libse/SubtitleFormats/FinalCutProTest2Xml.cs b/src/libse/SubtitleFormats/FinalCutProTest2Xml.cs similarity index 98% rename from libse/SubtitleFormats/FinalCutProTest2Xml.cs rename to src/libse/SubtitleFormats/FinalCutProTest2Xml.cs index 8c2b6b99a..4659da414 100644 --- a/libse/SubtitleFormats/FinalCutProTest2Xml.cs +++ b/src/libse/SubtitleFormats/FinalCutProTest2Xml.cs @@ -1,313 +1,313 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Text; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - // - Mom, when you were my age what did you want to do? - public class FinalCutProTest2Xml : SubtitleFormat - { - public override string Extension => ".xml"; - - public override string Name => "Final Cut Pro Test2 Xml"; - - public static string GetFrameRateAsString() - { - if (Configuration.Settings.General.CurrentFrameRate < 24) - { - return "24"; // ntsc 23.976 - } - - if (Configuration.Settings.General.CurrentFrameRate < 25) - { - return "24"; - } - - if (Configuration.Settings.General.CurrentFrameRate < 29) - { - return "25"; - } - - if (Configuration.Settings.General.CurrentFrameRate < 30) - { - return "30"; // ntsc 29.97 - } - - if (Configuration.Settings.General.CurrentFrameRate < 40) - { - return "30"; - } - - if (Configuration.Settings.General.CurrentFrameRate < 60) - { - return "60"; // ntsc 59.94 - } - - return "60"; - } - - public static string GetNtsc() - { - if (Configuration.Settings.General.CurrentFrameRate < 24) - { - return "TRUE"; // ntsc 23.976 - } - - if (Configuration.Settings.General.CurrentFrameRate < 25) - { - return "FALSE"; - } - - return "TRUE"; - } - - public override string ToText(Subtitle subtitle, string title) - { - int duration = 0; - if (subtitle.Paragraphs.Count > 0) - { - duration = (int)Math.Round(subtitle.Paragraphs[subtitle.Paragraphs.Count - 1].EndTime.TotalSeconds * Configuration.Settings.General.CurrentFrameRate); - } - - string seString = "Subtitle Edit at " + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString(); - string xmlStructure = - "" + Environment.NewLine + - "" + Environment.NewLine + - " " + Environment.NewLine + - " EC466A7D-8B45-4682-9978-D15D630C882Eadd" + seString + "" + duration + ">" + GetNtsc() + @"" + GetFrameRateAsString() + @"" + GetNtsc() + @"" + GetFrameRateAsString() + @"01:00:00:0090000sourceNDF-1-1"; - - const string xmlTrackStructure = "Text3000FALSE251375148615041615FALSEblackFALSETextTextTextgeneratorvideostrTextA finales de los años sesenta, una joven pareja, Guy y Rosemary, fontnameFontLucida GrandefontsizeSize01000[FONTSIZE]fontstyleStyle14Plain1Bold2Italic3Bold/Italic41fontalignAlignment13Left1Center2Right32fontcolorFont Color255255255255originOrigin00fonttrackTracking-2002001leadingLeading-1001000aspectAspect0.151autokernAuto KerningTRUEsubpixelUse SubpixelTRUEBasic MotionbasicmotionmotionvideoscaleScale01000100rotationRotation-864086400centerCenter0.004709580.396648centerOffsetAnchor Point00video3506ED18-CB4D-41B8-A760-4D42356E4F321E6E96FD-94F6-4975-BDFE-7B360E909111"; - - if (string.IsNullOrEmpty(title)) - { - title = "Subtitle Edit subtitle"; - } - - var xml = new XmlDocument(); - xml.LoadXml(xmlStructure); - xml.DocumentElement.SelectSingleNode("sequence").Attributes["id"].Value = title; - xml.DocumentElement.SelectSingleNode("sequence/name").InnerText = title; - xml.DocumentElement.SelectSingleNode("sequence/uuid").InnerText = Guid.NewGuid().ToString().ToUpperInvariant(); - if (!string.IsNullOrEmpty(subtitle.Header)) - { - var header = new XmlDocument(); - try - { - header.LoadXml(subtitle.Header); - var node = header.DocumentElement.SelectSingleNode("sequence/uuid"); - if (node != null) - { - xml.DocumentElement.SelectSingleNode("sequence/uuid").InnerText = node.InnerText; - } - } - catch - { - } - } - - XmlNode trackNode = xml.DocumentElement.SelectSingleNode("sequence/media/video/track[2]"); - - const string newLine = "_____@___"; - int number = 1; - foreach (Paragraph p in subtitle.Paragraphs) - { - XmlNode generatorItem = xml.CreateElement("generatoritem"); - string fontStyle = "1"; //1==plain - var s = HtmlUtil.RemoveOpenCloseTags(p.Text, HtmlUtil.TagFont).Trim(); - if ((s.StartsWith("") && s.EndsWith("")) || (s.StartsWith("") && s.EndsWith(""))) - { - fontStyle = "4"; //4==bold/italic - } - else if (s.StartsWith("") && s.EndsWith("")) - { - fontStyle = "3"; //3==italic - } - - generatorItem.InnerXml = xmlTrackStructure.Replace("[NUMBER]", number.ToString()).Replace("[FONTSTYLE]", fontStyle).Replace("[FONTSIZE]", Configuration.Settings.SubtitleSettings.FcpFontSize.ToString(CultureInfo.InvariantCulture)); - - double frameRate = Configuration.Settings.General.CurrentFrameRate; - XmlNode start = generatorItem.SelectSingleNode("generatoritem/start"); - start.InnerText = ((int)Math.Round(p.StartTime.TotalSeconds * frameRate)).ToString(); - - XmlNode end = generatorItem.SelectSingleNode("generatoritem/end"); - end.InnerText = ((int)Math.Round(p.EndTime.TotalSeconds * frameRate)).ToString(); - - XmlNode text = generatorItem.SelectSingleNode("generatoritem/effect/parameter[parameterid='str']/value"); - text.InnerText = HtmlUtil.RemoveHtmlTags(p.Text); - text.InnerXml = text.InnerXml.Replace(Environment.NewLine, newLine); - - trackNode.AppendChild(generatorItem.SelectSingleNode("generatoritem")); - number++; - } - - string xmlAsText = ToUtf8XmlString(xml); - xmlAsText = xmlAsText.Replace("xmeml[]", "xmeml"); - xmlAsText = xmlAsText.Replace(newLine, " "); - return xmlAsText; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - var frameRate = Configuration.Settings.General.CurrentFrameRate; - - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - var xml = new XmlDocument { XmlResolver = null }; - try - { - xml.LoadXml(sb.ToString().Trim()); - - var header = new XmlDocument { XmlResolver = null }; - header.LoadXml(sb.ToString()); - if (header.SelectSingleNode("sequence/media/video/track") != null) - { - header.RemoveChild(header.SelectSingleNode("sequence/media/video/track")); - } - - subtitle.Header = header.OuterXml; - - if (xml.DocumentElement.SelectSingleNode("sequence/rate") != null && xml.DocumentElement.SelectSingleNode("sequence/rate/timebase") != null) - { - try - { - frameRate = double.Parse(xml.DocumentElement.SelectSingleNode("sequence/rate/timebase").InnerText); - } - catch - { - frameRate = Configuration.Settings.General.CurrentFrameRate; - } - } - - foreach (XmlNode node in xml.SelectNodes("//video/track")) - { - try - { - foreach (XmlNode generatorItemNode in node.SelectNodes("generatoritem")) - { - XmlNode rate = generatorItemNode.SelectSingleNode("rate"); - XmlNode timebase = rate?.SelectSingleNode("timebase"); - if (timebase != null) - { - frameRate = double.Parse(timebase.InnerText); - } - - double startFrame = 0; - double endFrame = 0; - XmlNode startNode = generatorItemNode.SelectSingleNode("start"); - if (startNode != null) - { - startFrame = double.Parse(startNode.InnerText); - } - - XmlNode endNode = generatorItemNode.SelectSingleNode("end"); - if (endNode != null) - { - endFrame = double.Parse(endNode.InnerText); - } - - string text = string.Empty; - foreach (XmlNode parameterNode in generatorItemNode.SelectNodes("effect/parameter[parameterid='str']")) - { - XmlNode valueNode = parameterNode.SelectSingleNode("value"); - if (valueNode != null) - { - text += valueNode.InnerText; - } - } - - bool italic = false; - bool bold = false; - foreach (XmlNode parameterNode in generatorItemNode.SelectNodes("effect/parameter[parameterid='style']")) - { - XmlNode valueNode = parameterNode.SelectSingleNode("value"); - var valueEntries = parameterNode.SelectNodes("valuelist/valueentry"); - if (valueNode != null) - { - int no; - if (int.TryParse(valueNode.InnerText, out no)) - { - no--; - if (no < valueEntries.Count) - { - var styleNameNode = valueEntries[no].SelectSingleNode("name"); - if (styleNameNode != null) - { - string styleName = styleNameNode.InnerText.ToLowerInvariant().Trim(); - italic = styleName == "italic" || styleName == "bold/italic"; - bold = styleName == "bold" || styleName == "bold/italic"; - } - } - } - } - } - if (!bold && !italic) - { - foreach (XmlNode parameterNode in generatorItemNode.SelectNodes("effect/parameter[parameterid='fontstyle']")) - { - XmlNode valueNode = parameterNode.SelectSingleNode("value"); - var valueEntries = parameterNode.SelectNodes("valuelist/valueentry"); - if (valueNode != null) - { - int no; - if (int.TryParse(valueNode.InnerText, out no)) - { - no--; - if (no < valueEntries.Count) - { - var styleNameNode = valueEntries[no].SelectSingleNode("name"); - if (styleNameNode != null) - { - string styleName = styleNameNode.InnerText.ToLowerInvariant().Trim(); - italic = styleName == "italic" || styleName == "bold/italic"; - bold = styleName == "bold" || styleName == "bold/italic"; - } - } - } - } - } - } - - if (text.Length > 0) - { - if (!text.Contains(Environment.NewLine)) - { - text = text.Replace("\r", Environment.NewLine); - } - - if (bold) - { - text = "" + text + ""; - } - - if (italic) - { - text = "" + text + ""; - } - - subtitle.Paragraphs.Add(new Paragraph(text, Convert.ToDouble((startFrame / frameRate) * 1000), Convert.ToDouble((endFrame / frameRate) * 1000))); - } - } - } - catch - { - _errorCount++; - } - } - subtitle.Renumber(); - } - catch - { - _errorCount = 1; - return; - } - Configuration.Settings.General.CurrentFrameRate = frameRate; - } - - } -} +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + // - Mom, when you were my age what did you want to do? + public class FinalCutProTest2Xml : SubtitleFormat + { + public override string Extension => ".xml"; + + public override string Name => "Final Cut Pro Test2 Xml"; + + public static string GetFrameRateAsString() + { + if (Configuration.Settings.General.CurrentFrameRate < 24) + { + return "24"; // ntsc 23.976 + } + + if (Configuration.Settings.General.CurrentFrameRate < 25) + { + return "24"; + } + + if (Configuration.Settings.General.CurrentFrameRate < 29) + { + return "25"; + } + + if (Configuration.Settings.General.CurrentFrameRate < 30) + { + return "30"; // ntsc 29.97 + } + + if (Configuration.Settings.General.CurrentFrameRate < 40) + { + return "30"; + } + + if (Configuration.Settings.General.CurrentFrameRate < 60) + { + return "60"; // ntsc 59.94 + } + + return "60"; + } + + public static string GetNtsc() + { + if (Configuration.Settings.General.CurrentFrameRate < 24) + { + return "TRUE"; // ntsc 23.976 + } + + if (Configuration.Settings.General.CurrentFrameRate < 25) + { + return "FALSE"; + } + + return "TRUE"; + } + + public override string ToText(Subtitle subtitle, string title) + { + int duration = 0; + if (subtitle.Paragraphs.Count > 0) + { + duration = (int)Math.Round(subtitle.Paragraphs[subtitle.Paragraphs.Count - 1].EndTime.TotalSeconds * Configuration.Settings.General.CurrentFrameRate); + } + + string seString = "Subtitle Edit at " + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString(); + string xmlStructure = + "" + Environment.NewLine + + "" + Environment.NewLine + + " " + Environment.NewLine + + " EC466A7D-8B45-4682-9978-D15D630C882Eadd" + seString + "" + duration + ">" + GetNtsc() + @"" + GetFrameRateAsString() + @"" + GetNtsc() + @"" + GetFrameRateAsString() + @"01:00:00:0090000sourceNDF-1-1"; + + const string xmlTrackStructure = "Text3000FALSE251375148615041615FALSEblackFALSETextTextTextgeneratorvideostrTextA finales de los años sesenta, una joven pareja, Guy y Rosemary, fontnameFontLucida GrandefontsizeSize01000[FONTSIZE]fontstyleStyle14Plain1Bold2Italic3Bold/Italic41fontalignAlignment13Left1Center2Right32fontcolorFont Color255255255255originOrigin00fonttrackTracking-2002001leadingLeading-1001000aspectAspect0.151autokernAuto KerningTRUEsubpixelUse SubpixelTRUEBasic MotionbasicmotionmotionvideoscaleScale01000100rotationRotation-864086400centerCenter0.004709580.396648centerOffsetAnchor Point00video3506ED18-CB4D-41B8-A760-4D42356E4F321E6E96FD-94F6-4975-BDFE-7B360E909111"; + + if (string.IsNullOrEmpty(title)) + { + title = "Subtitle Edit subtitle"; + } + + var xml = new XmlDocument(); + xml.LoadXml(xmlStructure); + xml.DocumentElement.SelectSingleNode("sequence").Attributes["id"].Value = title; + xml.DocumentElement.SelectSingleNode("sequence/name").InnerText = title; + xml.DocumentElement.SelectSingleNode("sequence/uuid").InnerText = Guid.NewGuid().ToString().ToUpperInvariant(); + if (!string.IsNullOrEmpty(subtitle.Header)) + { + var header = new XmlDocument(); + try + { + header.LoadXml(subtitle.Header); + var node = header.DocumentElement.SelectSingleNode("sequence/uuid"); + if (node != null) + { + xml.DocumentElement.SelectSingleNode("sequence/uuid").InnerText = node.InnerText; + } + } + catch + { + } + } + + XmlNode trackNode = xml.DocumentElement.SelectSingleNode("sequence/media/video/track[2]"); + + const string newLine = "_____@___"; + int number = 1; + foreach (Paragraph p in subtitle.Paragraphs) + { + XmlNode generatorItem = xml.CreateElement("generatoritem"); + string fontStyle = "1"; //1==plain + var s = HtmlUtil.RemoveOpenCloseTags(p.Text, HtmlUtil.TagFont).Trim(); + if ((s.StartsWith("") && s.EndsWith("")) || (s.StartsWith("") && s.EndsWith(""))) + { + fontStyle = "4"; //4==bold/italic + } + else if (s.StartsWith("") && s.EndsWith("")) + { + fontStyle = "3"; //3==italic + } + + generatorItem.InnerXml = xmlTrackStructure.Replace("[NUMBER]", number.ToString()).Replace("[FONTSTYLE]", fontStyle).Replace("[FONTSIZE]", Configuration.Settings.SubtitleSettings.FcpFontSize.ToString(CultureInfo.InvariantCulture)); + + double frameRate = Configuration.Settings.General.CurrentFrameRate; + XmlNode start = generatorItem.SelectSingleNode("generatoritem/start"); + start.InnerText = ((int)Math.Round(p.StartTime.TotalSeconds * frameRate)).ToString(); + + XmlNode end = generatorItem.SelectSingleNode("generatoritem/end"); + end.InnerText = ((int)Math.Round(p.EndTime.TotalSeconds * frameRate)).ToString(); + + XmlNode text = generatorItem.SelectSingleNode("generatoritem/effect/parameter[parameterid='str']/value"); + text.InnerText = HtmlUtil.RemoveHtmlTags(p.Text); + text.InnerXml = text.InnerXml.Replace(Environment.NewLine, newLine); + + trackNode.AppendChild(generatorItem.SelectSingleNode("generatoritem")); + number++; + } + + string xmlAsText = ToUtf8XmlString(xml); + xmlAsText = xmlAsText.Replace("xmeml[]", "xmeml"); + xmlAsText = xmlAsText.Replace(newLine, " "); + return xmlAsText; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + var frameRate = Configuration.Settings.General.CurrentFrameRate; + + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + var xml = new XmlDocument { XmlResolver = null }; + try + { + xml.LoadXml(sb.ToString().Trim()); + + var header = new XmlDocument { XmlResolver = null }; + header.LoadXml(sb.ToString()); + if (header.SelectSingleNode("sequence/media/video/track") != null) + { + header.RemoveChild(header.SelectSingleNode("sequence/media/video/track")); + } + + subtitle.Header = header.OuterXml; + + if (xml.DocumentElement.SelectSingleNode("sequence/rate") != null && xml.DocumentElement.SelectSingleNode("sequence/rate/timebase") != null) + { + try + { + frameRate = double.Parse(xml.DocumentElement.SelectSingleNode("sequence/rate/timebase").InnerText); + } + catch + { + frameRate = Configuration.Settings.General.CurrentFrameRate; + } + } + + foreach (XmlNode node in xml.SelectNodes("//video/track")) + { + try + { + foreach (XmlNode generatorItemNode in node.SelectNodes("generatoritem")) + { + XmlNode rate = generatorItemNode.SelectSingleNode("rate"); + XmlNode timebase = rate?.SelectSingleNode("timebase"); + if (timebase != null) + { + frameRate = double.Parse(timebase.InnerText); + } + + double startFrame = 0; + double endFrame = 0; + XmlNode startNode = generatorItemNode.SelectSingleNode("start"); + if (startNode != null) + { + startFrame = double.Parse(startNode.InnerText); + } + + XmlNode endNode = generatorItemNode.SelectSingleNode("end"); + if (endNode != null) + { + endFrame = double.Parse(endNode.InnerText); + } + + string text = string.Empty; + foreach (XmlNode parameterNode in generatorItemNode.SelectNodes("effect/parameter[parameterid='str']")) + { + XmlNode valueNode = parameterNode.SelectSingleNode("value"); + if (valueNode != null) + { + text += valueNode.InnerText; + } + } + + bool italic = false; + bool bold = false; + foreach (XmlNode parameterNode in generatorItemNode.SelectNodes("effect/parameter[parameterid='style']")) + { + XmlNode valueNode = parameterNode.SelectSingleNode("value"); + var valueEntries = parameterNode.SelectNodes("valuelist/valueentry"); + if (valueNode != null) + { + int no; + if (int.TryParse(valueNode.InnerText, out no)) + { + no--; + if (no < valueEntries.Count) + { + var styleNameNode = valueEntries[no].SelectSingleNode("name"); + if (styleNameNode != null) + { + string styleName = styleNameNode.InnerText.ToLowerInvariant().Trim(); + italic = styleName == "italic" || styleName == "bold/italic"; + bold = styleName == "bold" || styleName == "bold/italic"; + } + } + } + } + } + if (!bold && !italic) + { + foreach (XmlNode parameterNode in generatorItemNode.SelectNodes("effect/parameter[parameterid='fontstyle']")) + { + XmlNode valueNode = parameterNode.SelectSingleNode("value"); + var valueEntries = parameterNode.SelectNodes("valuelist/valueentry"); + if (valueNode != null) + { + int no; + if (int.TryParse(valueNode.InnerText, out no)) + { + no--; + if (no < valueEntries.Count) + { + var styleNameNode = valueEntries[no].SelectSingleNode("name"); + if (styleNameNode != null) + { + string styleName = styleNameNode.InnerText.ToLowerInvariant().Trim(); + italic = styleName == "italic" || styleName == "bold/italic"; + bold = styleName == "bold" || styleName == "bold/italic"; + } + } + } + } + } + } + + if (text.Length > 0) + { + if (!text.Contains(Environment.NewLine)) + { + text = text.Replace("\r", Environment.NewLine); + } + + if (bold) + { + text = "" + text + ""; + } + + if (italic) + { + text = "" + text + ""; + } + + subtitle.Paragraphs.Add(new Paragraph(text, Convert.ToDouble((startFrame / frameRate) * 1000), Convert.ToDouble((endFrame / frameRate) * 1000))); + } + } + } + catch + { + _errorCount++; + } + } + subtitle.Renumber(); + } + catch + { + _errorCount = 1; + return; + } + Configuration.Settings.General.CurrentFrameRate = frameRate; + } + + } +} diff --git a/libse/SubtitleFormats/FinalCutProTextXml.cs b/src/libse/SubtitleFormats/FinalCutProTextXml.cs similarity index 97% rename from libse/SubtitleFormats/FinalCutProTextXml.cs rename to src/libse/SubtitleFormats/FinalCutProTextXml.cs index 1c710a023..bd6fd67e9 100644 --- a/libse/SubtitleFormats/FinalCutProTextXml.cs +++ b/src/libse/SubtitleFormats/FinalCutProTextXml.cs @@ -1,398 +1,398 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - // - Mom, when you were my age what did you want to do? - public class FinalCutProTestXml : SubtitleFormat - { - public override string Extension => ".xml"; - - public override string Name => "Final Cut Pro Test Xml"; - - public static string GetFrameRateAsString() - { - if (Configuration.Settings.General.CurrentFrameRate < 24) - { - return "24"; // ntsc 23.976 - } - - if (Configuration.Settings.General.CurrentFrameRate < 25) - { - return "24"; - } - - if (Configuration.Settings.General.CurrentFrameRate < 29) - { - return "25"; - } - - if (Configuration.Settings.General.CurrentFrameRate < 30) - { - return "30"; // ntsc 29.97 - } - - if (Configuration.Settings.General.CurrentFrameRate < 40) - { - return "30"; - } - - if (Configuration.Settings.General.CurrentFrameRate < 60) - { - return "60"; // ntsc 59.94 - } - - return "60"; - } - - public static string GetNtsc() - { - if (Configuration.Settings.General.CurrentFrameRate < 24) - { - return "TRUE"; // ntsc 23.976 - } - - if (Configuration.Settings.General.CurrentFrameRate < 25) - { - return "FALSE"; - } - - return "TRUE"; - //if (Configuration.Settings.General.CurrentFrameRate < 29) - // return "FALSE"; - //if (Configuration.Settings.General.CurrentFrameRate < 29) - // return "FALSE"; - //if (Configuration.Settings.General.CurrentFrameRate < 30) - // return "TRUE"; // ntsc 29.97 - //if (Configuration.Settings.General.CurrentFrameRate < 40) - // return "TRUE"; - //if (Configuration.Settings.General.CurrentFrameRate < 40) - // return "TRUE"; - //if (Configuration.Settings.General.CurrentFrameRate < 60) - // return "TRUE"; // ntsc 59.94 - //return "FALSE"; - } - - public override string ToText(Subtitle subtitle, string title) - { - int duration = 0; - if (subtitle.Paragraphs.Count > 0) - { - duration = (int)Math.Round(subtitle.Paragraphs[subtitle.Paragraphs.Count - 1].EndTime.TotalSeconds * Configuration.Settings.General.CurrentFrameRate); - } - - string xmlStructure = - "" + Environment.NewLine + - "" + Environment.NewLine + - "" + Environment.NewLine + - @" 5B3B0C07-9A9D-42AA-872C-C953923F97D8 - add - X - " + duration + @" - - " + GetNtsc() + @" - " + GetFrameRateAsString() + @" - - - - " + GetNtsc() + @" - " + GetFrameRateAsString() + @" - - 00:00:00:00 - 0 - source - NDF - - 0 - " + duration + @" - - - - -"; - - if (string.IsNullOrEmpty(title)) - { - title = "Subtitle Edit subtitle"; - } - - string xmlTrackStructure = "Text0" + GetNtsc() + @"" + GetFrameRateAsString() + @"046TextTextTextgeneratorvideostrText[TEXT]fontnameFontArialfontsizeSize0100032fontstyleStyle14Plain1Bold2Italic3Bold/Italic1[FONTSTYLE]fontalignAlignment13Left1Center2Right32fontcolorFont Color1255255255originOrigin00.233854"; - var xml = new XmlDocument(); - xml.LoadXml(xmlStructure); - xml.DocumentElement.SelectSingleNode("sequence").Attributes["id"].Value = title; - xml.DocumentElement.SelectSingleNode("sequence/name").InnerText = title; - - xml.DocumentElement.SelectSingleNode("sequence/uuid").InnerText = Guid.NewGuid().ToString().ToUpperInvariant(); - if (!string.IsNullOrEmpty(subtitle.Header)) - { - var header = new XmlDocument(); - try - { - header.LoadXml(subtitle.Header); - var node = header.DocumentElement.SelectSingleNode("sequence/uuid"); - if (node != null) - { - xml.DocumentElement.SelectSingleNode("sequence/uuid").InnerText = node.InnerText; - } - } - catch - { - } - } - - XmlNode trackNode = xml.DocumentElement.SelectSingleNode("sequence/media/video/track"); - - const string newLine = "_____@___"; - int number = 1; - foreach (Paragraph p in subtitle.Paragraphs) - { - XmlNode generatorItem = xml.CreateElement("generatoritem"); - string fontStyle = "1"; //1==plain - var s = HtmlUtil.RemoveOpenCloseTags(p.Text, HtmlUtil.TagFont).Trim(); - if ((s.StartsWith("") && s.EndsWith("")) || (s.StartsWith("") && s.EndsWith(""))) - { - fontStyle = "4"; //4==bold/italic - } - else if (s.StartsWith("") && s.EndsWith("")) - { - fontStyle = "3"; //3==italic - } - - generatorItem.InnerXml = xmlTrackStructure.Replace("[NUMBER]", number.ToString()).Replace("[FONTSTYLE]", fontStyle); - - double frameRate = Configuration.Settings.General.CurrentFrameRate; - XmlNode start = generatorItem.SelectSingleNode("generatoritem/start"); - start.InnerText = ((int)Math.Round(p.StartTime.TotalSeconds * frameRate)).ToString(); - - XmlNode end = generatorItem.SelectSingleNode("generatoritem/end"); - end.InnerText = ((int)Math.Round(p.EndTime.TotalSeconds * frameRate)).ToString(); - - XmlNode text = generatorItem.SelectSingleNode("generatoritem/effect/parameter[parameterid='str']/value"); - text.InnerText = HtmlUtil.RemoveHtmlTags(p.Text); - text.InnerXml = text.InnerXml.Replace(Environment.NewLine, newLine); - - trackNode.AppendChild(generatorItem.SelectSingleNode("generatoritem")); - number++; - } - - string xmlAsText = ToUtf8XmlString(xml); - xmlAsText = xmlAsText.Replace("xmeml[]", "xmeml"); - xmlAsText = xmlAsText.Replace(newLine, " "); - return xmlAsText; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - var frameRate = Configuration.Settings.General.CurrentFrameRate; - - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - var xml = new XmlDocument { XmlResolver = null }; - try - { - xml.LoadXml(sb.ToString().Trim()); - - var header = new XmlDocument { XmlResolver = null }; - header.LoadXml(sb.ToString()); - if (header.SelectSingleNode("sequence/media/video/track") != null) - { - header.RemoveChild(header.SelectSingleNode("sequence/media/video/track")); - } - - subtitle.Header = header.OuterXml; - - if (xml.DocumentElement.SelectSingleNode("sequence/rate") != null && xml.DocumentElement.SelectSingleNode("sequence/rate/timebase") != null) - { - try - { - frameRate = double.Parse(xml.DocumentElement.SelectSingleNode("sequence/rate/timebase").InnerText); - } - catch - { - frameRate = Configuration.Settings.General.CurrentFrameRate; - } - } - - foreach (XmlNode node in xml.SelectNodes("//media/video/track")) - { - try - { - foreach (XmlNode generatorItemNode in node.SelectNodes("generatoritem")) - { - XmlNode rate = generatorItemNode.SelectSingleNode("rate"); - if (rate != null) - { - XmlNode timebase = rate.SelectSingleNode("timebase"); - if (timebase != null) - { - frameRate = double.Parse(timebase.InnerText); - } - } - - double startFrame = 0; - double endFrame = 0; - XmlNode startNode = generatorItemNode.SelectSingleNode("start"); - if (startNode != null) - { - startFrame = double.Parse(startNode.InnerText); - } - - XmlNode endNode = generatorItemNode.SelectSingleNode("end"); - if (endNode != null) - { - endFrame = double.Parse(endNode.InnerText); - } - - string text = string.Empty; - foreach (XmlNode parameterNode in generatorItemNode.SelectNodes("effect/parameter[parameterid='str']")) - { - XmlNode valueNode = parameterNode.SelectSingleNode("value"); - if (valueNode != null) - { - text += valueNode.InnerText; - } - } - - bool italic = false; - bool bold = false; - foreach (XmlNode parameterNode in generatorItemNode.SelectNodes("effect/parameter[parameterid='style']")) - { - XmlNode valueNode = parameterNode.SelectSingleNode("value"); - var valueEntries = parameterNode.SelectNodes("valuelist/valueentry"); - if (valueNode != null) - { - int no; - if (int.TryParse(valueNode.InnerText, out no)) - { - no--; - if (no < valueEntries.Count) - { - var styleNameNode = valueEntries[no].SelectSingleNode("name"); - if (styleNameNode != null) - { - string styleName = styleNameNode.InnerText.ToLowerInvariant().Trim(); - italic = styleName == "italic" || styleName == "bold/italic"; - bold = styleName == "bold" || styleName == "bold/italic"; - } - } - } - } - } - if (!bold && !italic) - { - foreach (XmlNode parameterNode in generatorItemNode.SelectNodes("effect/parameter[parameterid='fontstyle']")) - { - XmlNode valueNode = parameterNode.SelectSingleNode("value"); - var valueEntries = parameterNode.SelectNodes("valuelist/valueentry"); - if (valueNode != null) - { - int no; - if (int.TryParse(valueNode.InnerText, out no)) - { - no--; - if (no < valueEntries.Count) - { - var styleNameNode = valueEntries[no].SelectSingleNode("name"); - if (styleNameNode != null) - { - string styleName = styleNameNode.InnerText.ToLowerInvariant().Trim(); - italic = styleName == "italic" || styleName == "bold/italic"; - bold = styleName == "bold" || styleName == "bold/italic"; - } - } - } - } - } - } - - if (text.Length > 0) - { - if (!text.Contains(Environment.NewLine)) - { - text = text.Replace("\r", Environment.NewLine); - } - - if (bold) - { - text = "" + text + ""; - } - - if (italic) - { - text = "" + text + ""; - } - - subtitle.Paragraphs.Add(new Paragraph(text, Convert.ToDouble((startFrame / frameRate) * 1000), Convert.ToDouble((endFrame / frameRate) * 1000))); - } - } - } - catch - { - _errorCount++; - } - } - subtitle.Renumber(); - } - catch - { - _errorCount = 1; - return; - } - Configuration.Settings.General.CurrentFrameRate = frameRate; - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + // - Mom, when you were my age what did you want to do? + public class FinalCutProTestXml : SubtitleFormat + { + public override string Extension => ".xml"; + + public override string Name => "Final Cut Pro Test Xml"; + + public static string GetFrameRateAsString() + { + if (Configuration.Settings.General.CurrentFrameRate < 24) + { + return "24"; // ntsc 23.976 + } + + if (Configuration.Settings.General.CurrentFrameRate < 25) + { + return "24"; + } + + if (Configuration.Settings.General.CurrentFrameRate < 29) + { + return "25"; + } + + if (Configuration.Settings.General.CurrentFrameRate < 30) + { + return "30"; // ntsc 29.97 + } + + if (Configuration.Settings.General.CurrentFrameRate < 40) + { + return "30"; + } + + if (Configuration.Settings.General.CurrentFrameRate < 60) + { + return "60"; // ntsc 59.94 + } + + return "60"; + } + + public static string GetNtsc() + { + if (Configuration.Settings.General.CurrentFrameRate < 24) + { + return "TRUE"; // ntsc 23.976 + } + + if (Configuration.Settings.General.CurrentFrameRate < 25) + { + return "FALSE"; + } + + return "TRUE"; + //if (Configuration.Settings.General.CurrentFrameRate < 29) + // return "FALSE"; + //if (Configuration.Settings.General.CurrentFrameRate < 29) + // return "FALSE"; + //if (Configuration.Settings.General.CurrentFrameRate < 30) + // return "TRUE"; // ntsc 29.97 + //if (Configuration.Settings.General.CurrentFrameRate < 40) + // return "TRUE"; + //if (Configuration.Settings.General.CurrentFrameRate < 40) + // return "TRUE"; + //if (Configuration.Settings.General.CurrentFrameRate < 60) + // return "TRUE"; // ntsc 59.94 + //return "FALSE"; + } + + public override string ToText(Subtitle subtitle, string title) + { + int duration = 0; + if (subtitle.Paragraphs.Count > 0) + { + duration = (int)Math.Round(subtitle.Paragraphs[subtitle.Paragraphs.Count - 1].EndTime.TotalSeconds * Configuration.Settings.General.CurrentFrameRate); + } + + string xmlStructure = + "" + Environment.NewLine + + "" + Environment.NewLine + + "" + Environment.NewLine + + @" 5B3B0C07-9A9D-42AA-872C-C953923F97D8 + add + X + " + duration + @" + + " + GetNtsc() + @" + " + GetFrameRateAsString() + @" + + + + " + GetNtsc() + @" + " + GetFrameRateAsString() + @" + + 00:00:00:00 + 0 + source + NDF + + 0 + " + duration + @" + + + + +"; + + if (string.IsNullOrEmpty(title)) + { + title = "Subtitle Edit subtitle"; + } + + string xmlTrackStructure = "Text0" + GetNtsc() + @"" + GetFrameRateAsString() + @"046TextTextTextgeneratorvideostrText[TEXT]fontnameFontArialfontsizeSize0100032fontstyleStyle14Plain1Bold2Italic3Bold/Italic1[FONTSTYLE]fontalignAlignment13Left1Center2Right32fontcolorFont Color1255255255originOrigin00.233854"; + var xml = new XmlDocument(); + xml.LoadXml(xmlStructure); + xml.DocumentElement.SelectSingleNode("sequence").Attributes["id"].Value = title; + xml.DocumentElement.SelectSingleNode("sequence/name").InnerText = title; + + xml.DocumentElement.SelectSingleNode("sequence/uuid").InnerText = Guid.NewGuid().ToString().ToUpperInvariant(); + if (!string.IsNullOrEmpty(subtitle.Header)) + { + var header = new XmlDocument(); + try + { + header.LoadXml(subtitle.Header); + var node = header.DocumentElement.SelectSingleNode("sequence/uuid"); + if (node != null) + { + xml.DocumentElement.SelectSingleNode("sequence/uuid").InnerText = node.InnerText; + } + } + catch + { + } + } + + XmlNode trackNode = xml.DocumentElement.SelectSingleNode("sequence/media/video/track"); + + const string newLine = "_____@___"; + int number = 1; + foreach (Paragraph p in subtitle.Paragraphs) + { + XmlNode generatorItem = xml.CreateElement("generatoritem"); + string fontStyle = "1"; //1==plain + var s = HtmlUtil.RemoveOpenCloseTags(p.Text, HtmlUtil.TagFont).Trim(); + if ((s.StartsWith("") && s.EndsWith("")) || (s.StartsWith("") && s.EndsWith(""))) + { + fontStyle = "4"; //4==bold/italic + } + else if (s.StartsWith("") && s.EndsWith("")) + { + fontStyle = "3"; //3==italic + } + + generatorItem.InnerXml = xmlTrackStructure.Replace("[NUMBER]", number.ToString()).Replace("[FONTSTYLE]", fontStyle); + + double frameRate = Configuration.Settings.General.CurrentFrameRate; + XmlNode start = generatorItem.SelectSingleNode("generatoritem/start"); + start.InnerText = ((int)Math.Round(p.StartTime.TotalSeconds * frameRate)).ToString(); + + XmlNode end = generatorItem.SelectSingleNode("generatoritem/end"); + end.InnerText = ((int)Math.Round(p.EndTime.TotalSeconds * frameRate)).ToString(); + + XmlNode text = generatorItem.SelectSingleNode("generatoritem/effect/parameter[parameterid='str']/value"); + text.InnerText = HtmlUtil.RemoveHtmlTags(p.Text); + text.InnerXml = text.InnerXml.Replace(Environment.NewLine, newLine); + + trackNode.AppendChild(generatorItem.SelectSingleNode("generatoritem")); + number++; + } + + string xmlAsText = ToUtf8XmlString(xml); + xmlAsText = xmlAsText.Replace("xmeml[]", "xmeml"); + xmlAsText = xmlAsText.Replace(newLine, " "); + return xmlAsText; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + var frameRate = Configuration.Settings.General.CurrentFrameRate; + + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + var xml = new XmlDocument { XmlResolver = null }; + try + { + xml.LoadXml(sb.ToString().Trim()); + + var header = new XmlDocument { XmlResolver = null }; + header.LoadXml(sb.ToString()); + if (header.SelectSingleNode("sequence/media/video/track") != null) + { + header.RemoveChild(header.SelectSingleNode("sequence/media/video/track")); + } + + subtitle.Header = header.OuterXml; + + if (xml.DocumentElement.SelectSingleNode("sequence/rate") != null && xml.DocumentElement.SelectSingleNode("sequence/rate/timebase") != null) + { + try + { + frameRate = double.Parse(xml.DocumentElement.SelectSingleNode("sequence/rate/timebase").InnerText); + } + catch + { + frameRate = Configuration.Settings.General.CurrentFrameRate; + } + } + + foreach (XmlNode node in xml.SelectNodes("//media/video/track")) + { + try + { + foreach (XmlNode generatorItemNode in node.SelectNodes("generatoritem")) + { + XmlNode rate = generatorItemNode.SelectSingleNode("rate"); + if (rate != null) + { + XmlNode timebase = rate.SelectSingleNode("timebase"); + if (timebase != null) + { + frameRate = double.Parse(timebase.InnerText); + } + } + + double startFrame = 0; + double endFrame = 0; + XmlNode startNode = generatorItemNode.SelectSingleNode("start"); + if (startNode != null) + { + startFrame = double.Parse(startNode.InnerText); + } + + XmlNode endNode = generatorItemNode.SelectSingleNode("end"); + if (endNode != null) + { + endFrame = double.Parse(endNode.InnerText); + } + + string text = string.Empty; + foreach (XmlNode parameterNode in generatorItemNode.SelectNodes("effect/parameter[parameterid='str']")) + { + XmlNode valueNode = parameterNode.SelectSingleNode("value"); + if (valueNode != null) + { + text += valueNode.InnerText; + } + } + + bool italic = false; + bool bold = false; + foreach (XmlNode parameterNode in generatorItemNode.SelectNodes("effect/parameter[parameterid='style']")) + { + XmlNode valueNode = parameterNode.SelectSingleNode("value"); + var valueEntries = parameterNode.SelectNodes("valuelist/valueentry"); + if (valueNode != null) + { + int no; + if (int.TryParse(valueNode.InnerText, out no)) + { + no--; + if (no < valueEntries.Count) + { + var styleNameNode = valueEntries[no].SelectSingleNode("name"); + if (styleNameNode != null) + { + string styleName = styleNameNode.InnerText.ToLowerInvariant().Trim(); + italic = styleName == "italic" || styleName == "bold/italic"; + bold = styleName == "bold" || styleName == "bold/italic"; + } + } + } + } + } + if (!bold && !italic) + { + foreach (XmlNode parameterNode in generatorItemNode.SelectNodes("effect/parameter[parameterid='fontstyle']")) + { + XmlNode valueNode = parameterNode.SelectSingleNode("value"); + var valueEntries = parameterNode.SelectNodes("valuelist/valueentry"); + if (valueNode != null) + { + int no; + if (int.TryParse(valueNode.InnerText, out no)) + { + no--; + if (no < valueEntries.Count) + { + var styleNameNode = valueEntries[no].SelectSingleNode("name"); + if (styleNameNode != null) + { + string styleName = styleNameNode.InnerText.ToLowerInvariant().Trim(); + italic = styleName == "italic" || styleName == "bold/italic"; + bold = styleName == "bold" || styleName == "bold/italic"; + } + } + } + } + } + } + + if (text.Length > 0) + { + if (!text.Contains(Environment.NewLine)) + { + text = text.Replace("\r", Environment.NewLine); + } + + if (bold) + { + text = "" + text + ""; + } + + if (italic) + { + text = "" + text + ""; + } + + subtitle.Paragraphs.Add(new Paragraph(text, Convert.ToDouble((startFrame / frameRate) * 1000), Convert.ToDouble((endFrame / frameRate) * 1000))); + } + } + } + catch + { + _errorCount++; + } + } + subtitle.Renumber(); + } + catch + { + _errorCount = 1; + return; + } + Configuration.Settings.General.CurrentFrameRate = frameRate; + } + + } +} diff --git a/libse/SubtitleFormats/FinalCutProXCM.cs b/src/libse/SubtitleFormats/FinalCutProXCM.cs similarity index 97% rename from libse/SubtitleFormats/FinalCutProXCM.cs rename to src/libse/SubtitleFormats/FinalCutProXCM.cs index e10bb7e68..d19551e02 100644 --- a/libse/SubtitleFormats/FinalCutProXCM.cs +++ b/src/libse/SubtitleFormats/FinalCutProXCM.cs @@ -1,142 +1,142 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class FinalCutProXCM : SubtitleFormat - { - public double FrameRate { get; set; } - - public override string Extension => ".fcpxml"; - - public override string Name => "Final Cut Pro X Chapter Marker"; - - public override string ToText(Subtitle subtitle, string title) - { - if (Configuration.Settings.General.CurrentFrameRate > 26) - { - FrameRate = 30; - } - else - { - FrameRate = 25; - } - - string xmlStructure = - "" + Environment.NewLine + - "" + Environment.NewLine + - Environment.NewLine + - "" + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - ""; - - var xml = new XmlDocument(); - xml.LoadXml(xmlStructure); - - XmlNode videoNode = xml.DocumentElement.SelectSingleNode("project/sequence/spine/clip"); - - int number = 1; - foreach (Paragraph p in subtitle.Paragraphs) - { - XmlNode chapterMarker = xml.CreateElement("chapter-marker"); - - var attr = xml.CreateAttribute("duration"); - attr.Value = Convert.ToInt64(p.Duration.TotalSeconds * 2400000) + "/2400000s"; - chapterMarker.Attributes.Append(attr); - - attr = xml.CreateAttribute("start"); - attr.Value = Convert.ToInt64(p.StartTime.TotalSeconds * 2400000) + "/2400000s"; - chapterMarker.Attributes.Append(attr); - - attr = xml.CreateAttribute("value"); - attr.Value = p.Text.Replace(Environment.NewLine, Convert.ToChar(8232).ToString()); - chapterMarker.Attributes.Append(attr); - - attr = xml.CreateAttribute("posterOffset"); - attr.Value = "11/24s"; - chapterMarker.Attributes.Append(attr); - - videoNode.AppendChild(chapterMarker); - number++; - } - - string xmlAsText = ToUtf8XmlString(xml); - xmlAsText = xmlAsText.Replace("fcpxml[]", "fcpxml"); - xmlAsText = xmlAsText.Replace("fcpxml []", "fcpxml"); - return xmlAsText; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - FrameRate = Configuration.Settings.General.CurrentFrameRate; - - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - var xml = new XmlDocument { XmlResolver = null }; - xml.PreserveWhitespace = true; - try - { - xml.LoadXml(sb.ToString().Trim()); - - foreach (XmlNode node in xml.SelectNodes("fcpxml/project/sequence/spine/clip/chapter-marker")) - { - try - { - var p = new Paragraph(); - p.Text = node.Attributes["value"].InnerText; - p.Text = p.Text.Replace(Convert.ToChar(8232).ToString(), Environment.NewLine); - p.StartTime = DecodeTime(node.Attributes["start"]); - p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + DecodeTime(node.Attributes["duration"]).TotalMilliseconds; - subtitle.Paragraphs.Add(p); - } - catch - { - _errorCount++; - } - } - subtitle.Renumber(); - } - catch - { - _errorCount = 1; - } - } - - private static TimeCode DecodeTime(XmlAttribute duration) - { - // 220220/60000s - if (duration != null) - { - var arr = duration.Value.TrimEnd('s').Split('/'); - if (arr.Length == 2) - { - return TimeCode.FromSeconds(long.Parse(arr[0]) / double.Parse(arr[1])); - } - else if (arr.Length == 1) - { - return TimeCode.FromSeconds(float.Parse(arr[0])); - } - } - return new TimeCode(); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class FinalCutProXCM : SubtitleFormat + { + public double FrameRate { get; set; } + + public override string Extension => ".fcpxml"; + + public override string Name => "Final Cut Pro X Chapter Marker"; + + public override string ToText(Subtitle subtitle, string title) + { + if (Configuration.Settings.General.CurrentFrameRate > 26) + { + FrameRate = 30; + } + else + { + FrameRate = 25; + } + + string xmlStructure = + "" + Environment.NewLine + + "" + Environment.NewLine + + Environment.NewLine + + "" + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + ""; + + var xml = new XmlDocument(); + xml.LoadXml(xmlStructure); + + XmlNode videoNode = xml.DocumentElement.SelectSingleNode("project/sequence/spine/clip"); + + int number = 1; + foreach (Paragraph p in subtitle.Paragraphs) + { + XmlNode chapterMarker = xml.CreateElement("chapter-marker"); + + var attr = xml.CreateAttribute("duration"); + attr.Value = Convert.ToInt64(p.Duration.TotalSeconds * 2400000) + "/2400000s"; + chapterMarker.Attributes.Append(attr); + + attr = xml.CreateAttribute("start"); + attr.Value = Convert.ToInt64(p.StartTime.TotalSeconds * 2400000) + "/2400000s"; + chapterMarker.Attributes.Append(attr); + + attr = xml.CreateAttribute("value"); + attr.Value = p.Text.Replace(Environment.NewLine, Convert.ToChar(8232).ToString()); + chapterMarker.Attributes.Append(attr); + + attr = xml.CreateAttribute("posterOffset"); + attr.Value = "11/24s"; + chapterMarker.Attributes.Append(attr); + + videoNode.AppendChild(chapterMarker); + number++; + } + + string xmlAsText = ToUtf8XmlString(xml); + xmlAsText = xmlAsText.Replace("fcpxml[]", "fcpxml"); + xmlAsText = xmlAsText.Replace("fcpxml []", "fcpxml"); + return xmlAsText; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + FrameRate = Configuration.Settings.General.CurrentFrameRate; + + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + var xml = new XmlDocument { XmlResolver = null }; + xml.PreserveWhitespace = true; + try + { + xml.LoadXml(sb.ToString().Trim()); + + foreach (XmlNode node in xml.SelectNodes("fcpxml/project/sequence/spine/clip/chapter-marker")) + { + try + { + var p = new Paragraph(); + p.Text = node.Attributes["value"].InnerText; + p.Text = p.Text.Replace(Convert.ToChar(8232).ToString(), Environment.NewLine); + p.StartTime = DecodeTime(node.Attributes["start"]); + p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + DecodeTime(node.Attributes["duration"]).TotalMilliseconds; + subtitle.Paragraphs.Add(p); + } + catch + { + _errorCount++; + } + } + subtitle.Renumber(); + } + catch + { + _errorCount = 1; + } + } + + private static TimeCode DecodeTime(XmlAttribute duration) + { + // 220220/60000s + if (duration != null) + { + var arr = duration.Value.TrimEnd('s').Split('/'); + if (arr.Length == 2) + { + return TimeCode.FromSeconds(long.Parse(arr[0]) / double.Parse(arr[1])); + } + else if (arr.Length == 1) + { + return TimeCode.FromSeconds(float.Parse(arr[0])); + } + } + return new TimeCode(); + } + + } +} diff --git a/libse/SubtitleFormats/FinalCutProXXml.cs b/src/libse/SubtitleFormats/FinalCutProXXml.cs similarity index 97% rename from libse/SubtitleFormats/FinalCutProXXml.cs rename to src/libse/SubtitleFormats/FinalCutProXXml.cs index be339edc7..c2a53b3f2 100644 --- a/libse/SubtitleFormats/FinalCutProXXml.cs +++ b/src/libse/SubtitleFormats/FinalCutProXXml.cs @@ -1,176 +1,176 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class FinalCutProXXml : SubtitleFormat - { - public double FrameRate { get; set; } - - public override string Extension => ".fcpxml"; - - public override string Name => "Final Cut Pro X Xml"; - - public override string ToText(Subtitle subtitle, string title) - { - if (Configuration.Settings.General.CurrentFrameRate > 26) - { - FrameRate = 30; - } - else - { - FrameRate = 25; - } - - string xmlStructure = - "" + Environment.NewLine + - "" + Environment.NewLine + - Environment.NewLine + - "" + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - // - // - // - // - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - ""; - - string xmlClipStructure = - " " + Environment.NewLine + - " <adjust-transform position=\"0.267518 -32.3158\"/>" + Environment.NewLine + - " <text></text>" + Environment.NewLine + - " "; - - var xml = new XmlDocument(); - xml.LoadXml(xmlStructure); - - XmlNode videoNode = xml.DocumentElement.SelectSingleNode("project/sequence/spine"); - - int number = 1; - foreach (Paragraph p in subtitle.Paragraphs) - { - XmlNode clip = xml.CreateElement("clip"); - clip.InnerXml = xmlClipStructure; - var attr = xml.CreateAttribute("name"); - attr.Value = title; - clip.Attributes.Append(attr); - - attr = xml.CreateAttribute("duration"); - //attr.Value = "9529520/2400000s"; - attr.Value = Convert.ToInt64(p.Duration.TotalSeconds * 2400000) + "/2400000s"; - clip.Attributes.Append(attr); - - attr = xml.CreateAttribute("start"); - //attr.Value = "1201200/2400000s"; - attr.Value = Convert.ToInt64(p.StartTime.TotalSeconds * 2400000) + "/2400000s"; - clip.Attributes.Append(attr); - - attr = xml.CreateAttribute("audioStart"); - attr.Value = "0s"; - clip.Attributes.Append(attr); - - attr = xml.CreateAttribute("audioDuration"); - attr.Value = Convert.ToInt64(p.Duration.TotalSeconds * 2400000) + "/2400000s"; - clip.Attributes.Append(attr); - - attr = xml.CreateAttribute("tcFormat"); - attr.Value = "NDF"; - clip.Attributes.Append(attr); - - XmlNode titleNode = clip.SelectSingleNode("title"); - titleNode.Attributes["offset"].Value = Convert.ToInt64(p.StartTime.TotalSeconds * 60000) + "/60000s"; - titleNode.Attributes["name"].Value = HtmlUtil.RemoveHtmlTags(p.Text); - titleNode.Attributes["duration"].Value = Convert.ToInt64(p.Duration.TotalSeconds * 60000) + "/60000s"; - titleNode.Attributes["start"].Value = Convert.ToInt64(p.StartTime.TotalSeconds * 60000) + "/60000s"; - - XmlNode text = clip.SelectSingleNode("title/text"); - text.InnerText = HtmlUtil.RemoveHtmlTags(p.Text); - - videoNode.AppendChild(clip); - number++; - } - - string xmlAsText = ToUtf8XmlString(xml); - xmlAsText = xmlAsText.Replace("fcpxml[]", "fcpxml"); - xmlAsText = xmlAsText.Replace("fcpxml []", "fcpxml"); - return xmlAsText; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - FrameRate = Configuration.Settings.General.CurrentFrameRate; - - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - var xml = new XmlDocument { XmlResolver = null }; - try - { - xml.LoadXml(sb.ToString().Trim()); - - foreach (XmlNode node in xml.SelectNodes("fcpxml/project/sequence/spine/clip")) - { - try - { - foreach (XmlNode title in node.SelectNodes("title")) - { - var role = title.Attributes["role"]; - if (role != null && role.InnerText == "Subtitles") - { - var textNode = title.SelectSingleNode("text"); - if (textNode != null && !string.IsNullOrEmpty(textNode.InnerText)) - { - string text = textNode.InnerText; - Paragraph p = new Paragraph(); - p.Text = text.Trim(); - p.StartTime = DecodeTime(title.Attributes["offset"]); - p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + DecodeTime(title.Attributes["duration"]).TotalMilliseconds; - subtitle.Paragraphs.Add(p); - } - } - } - } - catch - { - _errorCount++; - } - } - subtitle.Renumber(); - } - catch - { - _errorCount = 1; - } - } - - private static TimeCode DecodeTime(XmlAttribute duration) - { - // 220220/60000s - if (duration != null) - { - var arr = duration.Value.TrimEnd('s').Split('/'); - if (arr.Length == 2) - { - return TimeCode.FromSeconds(long.Parse(arr[0]) / double.Parse(arr[1])); - } - else if (arr.Length == 1) - { - return TimeCode.FromSeconds(float.Parse(arr[0])); - } - } - return new TimeCode(); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class FinalCutProXXml : SubtitleFormat + { + public double FrameRate { get; set; } + + public override string Extension => ".fcpxml"; + + public override string Name => "Final Cut Pro X Xml"; + + public override string ToText(Subtitle subtitle, string title) + { + if (Configuration.Settings.General.CurrentFrameRate > 26) + { + FrameRate = 30; + } + else + { + FrameRate = 25; + } + + string xmlStructure = + "" + Environment.NewLine + + "" + Environment.NewLine + + Environment.NewLine + + "" + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + // + // + // + // + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + ""; + + string xmlClipStructure = + " " + Environment.NewLine + + " <adjust-transform position=\"0.267518 -32.3158\"/>" + Environment.NewLine + + " <text></text>" + Environment.NewLine + + " "; + + var xml = new XmlDocument(); + xml.LoadXml(xmlStructure); + + XmlNode videoNode = xml.DocumentElement.SelectSingleNode("project/sequence/spine"); + + int number = 1; + foreach (Paragraph p in subtitle.Paragraphs) + { + XmlNode clip = xml.CreateElement("clip"); + clip.InnerXml = xmlClipStructure; + var attr = xml.CreateAttribute("name"); + attr.Value = title; + clip.Attributes.Append(attr); + + attr = xml.CreateAttribute("duration"); + //attr.Value = "9529520/2400000s"; + attr.Value = Convert.ToInt64(p.Duration.TotalSeconds * 2400000) + "/2400000s"; + clip.Attributes.Append(attr); + + attr = xml.CreateAttribute("start"); + //attr.Value = "1201200/2400000s"; + attr.Value = Convert.ToInt64(p.StartTime.TotalSeconds * 2400000) + "/2400000s"; + clip.Attributes.Append(attr); + + attr = xml.CreateAttribute("audioStart"); + attr.Value = "0s"; + clip.Attributes.Append(attr); + + attr = xml.CreateAttribute("audioDuration"); + attr.Value = Convert.ToInt64(p.Duration.TotalSeconds * 2400000) + "/2400000s"; + clip.Attributes.Append(attr); + + attr = xml.CreateAttribute("tcFormat"); + attr.Value = "NDF"; + clip.Attributes.Append(attr); + + XmlNode titleNode = clip.SelectSingleNode("title"); + titleNode.Attributes["offset"].Value = Convert.ToInt64(p.StartTime.TotalSeconds * 60000) + "/60000s"; + titleNode.Attributes["name"].Value = HtmlUtil.RemoveHtmlTags(p.Text); + titleNode.Attributes["duration"].Value = Convert.ToInt64(p.Duration.TotalSeconds * 60000) + "/60000s"; + titleNode.Attributes["start"].Value = Convert.ToInt64(p.StartTime.TotalSeconds * 60000) + "/60000s"; + + XmlNode text = clip.SelectSingleNode("title/text"); + text.InnerText = HtmlUtil.RemoveHtmlTags(p.Text); + + videoNode.AppendChild(clip); + number++; + } + + string xmlAsText = ToUtf8XmlString(xml); + xmlAsText = xmlAsText.Replace("fcpxml[]", "fcpxml"); + xmlAsText = xmlAsText.Replace("fcpxml []", "fcpxml"); + return xmlAsText; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + FrameRate = Configuration.Settings.General.CurrentFrameRate; + + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + var xml = new XmlDocument { XmlResolver = null }; + try + { + xml.LoadXml(sb.ToString().Trim()); + + foreach (XmlNode node in xml.SelectNodes("fcpxml/project/sequence/spine/clip")) + { + try + { + foreach (XmlNode title in node.SelectNodes("title")) + { + var role = title.Attributes["role"]; + if (role != null && role.InnerText == "Subtitles") + { + var textNode = title.SelectSingleNode("text"); + if (textNode != null && !string.IsNullOrEmpty(textNode.InnerText)) + { + string text = textNode.InnerText; + Paragraph p = new Paragraph(); + p.Text = text.Trim(); + p.StartTime = DecodeTime(title.Attributes["offset"]); + p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + DecodeTime(title.Attributes["duration"]).TotalMilliseconds; + subtitle.Paragraphs.Add(p); + } + } + } + } + catch + { + _errorCount++; + } + } + subtitle.Renumber(); + } + catch + { + _errorCount = 1; + } + } + + private static TimeCode DecodeTime(XmlAttribute duration) + { + // 220220/60000s + if (duration != null) + { + var arr = duration.Value.TrimEnd('s').Split('/'); + if (arr.Length == 2) + { + return TimeCode.FromSeconds(long.Parse(arr[0]) / double.Parse(arr[1])); + } + else if (arr.Length == 1) + { + return TimeCode.FromSeconds(float.Parse(arr[0])); + } + } + return new TimeCode(); + } + + } +} diff --git a/libse/SubtitleFormats/FinalCutProXml.cs b/src/libse/SubtitleFormats/FinalCutProXml.cs similarity index 97% rename from libse/SubtitleFormats/FinalCutProXml.cs rename to src/libse/SubtitleFormats/FinalCutProXml.cs index 0b2332574..d8dcd9b1f 100644 --- a/libse/SubtitleFormats/FinalCutProXml.cs +++ b/src/libse/SubtitleFormats/FinalCutProXml.cs @@ -1,657 +1,657 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Text; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - // - Mom, when you were my age what did you want to do? - public class FinalCutProXml : SubtitleFormat - { - public override string Extension => ".xml"; - - public override string Name => "Final Cut Pro Xml"; - - public static string GetFrameRateAsString() - { - if (Configuration.Settings.General.CurrentFrameRate < 24) - { - return "24"; // ntsc 23.976 - } - - if (Configuration.Settings.General.CurrentFrameRate < 25) - { - return "24"; - } - - if (Configuration.Settings.General.CurrentFrameRate < 29) - { - return "25"; - } - - if (Configuration.Settings.General.CurrentFrameRate < 30) - { - return "30"; // ntsc 29.97 - } - - if (Configuration.Settings.General.CurrentFrameRate < 40) - { - return "30"; - } - - if (Configuration.Settings.General.CurrentFrameRate < 60) - { - return "60"; // ntsc 59.94 - } - - return "60"; - } - - public static string GetNtsc() - { - if (Configuration.Settings.General.CurrentFrameRate < 24) - { - return "TRUE"; // ntsc 23.976 - } - - if (Configuration.Settings.General.CurrentFrameRate < 25) - { - return "FALSE"; - } - - return "TRUE"; - } - - public override string ToText(Subtitle subtitle, string title) - { - int duration = 0; - if (subtitle.Paragraphs.Count > 0) - { - duration = (int)Math.Round(subtitle.Paragraphs[subtitle.Paragraphs.Count - 1].EndTime.TotalSeconds * Configuration.Settings.General.CurrentFrameRate); - } - - string xmlStructure = - "" + Environment.NewLine + - "" + Environment.NewLine + - "" + Environment.NewLine + - @" 5B3B0C07-9A9D-42AA-872C-C953923F97D8 - add - X - " + duration + @" - - " + GetNtsc() + @" - " + GetFrameRateAsString() + @" - - - - " + GetNtsc() + @" - " + GetFrameRateAsString() + @" - - 00:00:00:00 - 0 - source - NDF - - 0 - " + duration + @" - - - - -"; - - string xmlTrackStructure = - @" - Outline Text - 3000 - - " + GetNtsc() + @" - " + GetFrameRateAsString() + @" - - 1380 - 1474 - 8228 - 8322 - TRUE - FALSE - black - Outline Text1 - - Outline Text - Outline Text - Text - generator - video - - part1 - Text Settings - - - - str - Text - [TEXT] - - - font - Font - [FONTNAME] - - - style - Style - 1 - 4 - - - Plain - 1 - - - Bold - 2 - - - Italic - 3 - - - Bold/Italic - 4 - - - [FONTSTYLE] - - - align - Alignment - 1 - 3 - - - Left - 1 - - - Center - 2 - - - Right - 3 - - - 2 - - - size - Size - 0 - 200 - [FONTSIZE] - - - track - Tracking - 0 - 100 - 1 - - - lead - Leading - -100 - 100 - 0 - - - aspect - Aspect - 0 - 4 - 1 - - - linewidth - Line Width - 0 - 200 - 20 - - - linesoft - Line Softness - 0 - 100 - 5 - - - textopacity - Text Opacity - 0 - 100 - 100 - - - center - Center - - 0.00833333 - 0.390741 - - - - textcolor - Text Color - - 255 - 255 - 255 - 255 - - - - supertext - Text Graphic - - - linecolor - Line Color - - 255 - 0 - 0 - 0 - - - - part2 - Background Settings - - - - xscale - Horizontal Size - 0 - 200 - 0 - - - yscale - Vertical Size - 0 - 200 - 0 - - - xoffset - Horizontal Offset - -100 - 100 - 0 - - - yoffset - Vertical Offset - -100 - 100 - 0 - - - backcolor - Back Color - - 255 - 255 - 255 - 255 - - - - superback - Back Graphic - - - crop - Crop - FALSE - - - autokern - Auto Kerning - TRUE - - - - video - - "; - - if (string.IsNullOrEmpty(title)) - { - title = "Subtitle Edit subtitle"; - } - - var xml = new XmlDocument(); - xml.LoadXml(xmlStructure); - xml.DocumentElement.SelectSingleNode("sequence").Attributes["id"].Value = title; - xml.DocumentElement.SelectSingleNode("sequence/name").InnerText = title; - xml.DocumentElement.SelectSingleNode("sequence/uuid").InnerText = Guid.NewGuid().ToString().ToUpperInvariant(); - if (!string.IsNullOrEmpty(subtitle.Header)) - { - var header = new XmlDocument(); - try - { - header.LoadXml(subtitle.Header); - var node = header.DocumentElement.SelectSingleNode("sequence/uuid"); - if (node != null) - { - xml.DocumentElement.SelectSingleNode("sequence/uuid").InnerText = node.InnerText; - } - } - catch - { - // ignored - } - } - - XmlNode trackNode = xml.DocumentElement.SelectSingleNode("sequence/media/video/track"); - - const string newLine = "_____@___"; - int number = 1; - foreach (Paragraph p in subtitle.Paragraphs) - { - XmlNode generatorItem = xml.CreateElement("generatoritem"); - string fontStyle = "1"; //1==plain - var s = HtmlUtil.RemoveOpenCloseTags(p.Text, HtmlUtil.TagFont).Trim(); - if ((s.StartsWith("") && s.EndsWith("")) || (s.StartsWith("") && s.EndsWith(""))) - { - fontStyle = "4"; //4==bold/italic - } - else if (s.StartsWith("") && s.EndsWith("")) - { - fontStyle = "3"; //3==italic - } - - generatorItem.InnerXml = xmlTrackStructure.Replace("[NUMBER]", number.ToString()).Replace("[FONTSTYLE]", fontStyle). - Replace("[FONTSIZE]", Configuration.Settings.SubtitleSettings.FcpFontSize.ToString(CultureInfo.InvariantCulture)). - Replace("[FONTNAME]", Configuration.Settings.SubtitleSettings.FcpFontName). - Replace("[NUMBER]", number.ToString(CultureInfo.InvariantCulture)); - - double frameRate = Configuration.Settings.General.CurrentFrameRate; - XmlNode start = generatorItem.SelectSingleNode("generatoritem/start"); - start.InnerText = ((int)Math.Round(p.StartTime.TotalSeconds * frameRate)).ToString(); - - XmlNode end = generatorItem.SelectSingleNode("generatoritem/end"); - end.InnerText = ((int)Math.Round(p.EndTime.TotalSeconds * frameRate)).ToString(); - - XmlNode text = generatorItem.SelectSingleNode("generatoritem/effect/parameter[parameterid='str']/value"); - text.InnerText = HtmlUtil.RemoveHtmlTags(p.Text); - text.InnerXml = text.InnerXml.Replace(Environment.NewLine, newLine); - - trackNode.AppendChild(generatorItem.SelectSingleNode("generatoritem")); - number++; - } - - string xmlAsText = ToUtf8XmlString(xml); - xmlAsText = xmlAsText.Replace("xmeml[]", "xmeml"); - xmlAsText = xmlAsText.Replace(newLine, " "); - return xmlAsText; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - var frameRate = Configuration.Settings.General.CurrentFrameRate; - - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - var xml = new XmlDocument { XmlResolver = null }; - try - { - xml.LoadXml(sb.ToString().Trim()); - var header = new XmlDocument { XmlResolver = null }; - header.LoadXml(sb.ToString()); - if (header.SelectSingleNode("sequence/media/video/track") != null) - { - header.RemoveChild(header.SelectSingleNode("sequence/media/video/track")); - } - - subtitle.Header = header.OuterXml; - - if (xml.DocumentElement.SelectSingleNode("sequence/rate") != null && xml.DocumentElement.SelectSingleNode("sequence/rate/timebase") != null) - { - try - { - frameRate = double.Parse(xml.DocumentElement.SelectSingleNode("sequence/rate/timebase").InnerText); - } - catch - { - frameRate = Configuration.Settings.General.CurrentFrameRate; - } - } - - foreach (XmlNode node in xml.SelectNodes("//video/track")) - { - try - { - foreach (XmlNode generatorItemNode in node.SelectNodes("generatoritem")) - { - XmlNode rate = generatorItemNode.SelectSingleNode("rate"); - if (rate != null) - { - XmlNode timebase = rate.SelectSingleNode("timebase"); - if (timebase != null) - { - frameRate = double.Parse(timebase.InnerText); - } - } - - double startFrame = 0; - double endFrame = 0; - XmlNode startNode = generatorItemNode.SelectSingleNode("start"); - if (startNode != null) - { - startFrame = double.Parse(startNode.InnerText); - } - - XmlNode endNode = generatorItemNode.SelectSingleNode("end"); - if (endNode != null) - { - endFrame = double.Parse(endNode.InnerText); - } - - string text = string.Empty; - foreach (XmlNode parameterNode in generatorItemNode.SelectNodes("effect/parameter[parameterid='str']")) - { - XmlNode valueNode = parameterNode.SelectSingleNode("value"); - if (valueNode != null) - { - text += valueNode.InnerText; - } - } - if (text.Length == 0) - { - foreach (XmlNode parameterNode in generatorItemNode.SelectNodes("effect/parameter[parameterid='str1']")) - { - XmlNode valueNode = parameterNode.SelectSingleNode("value"); - if (valueNode != null) - { - text += valueNode.InnerText; - } - } - } - if (text.Length == 0) - { - foreach (XmlNode parameterNode in generatorItemNode.SelectNodes("effect/parameter[parameterid='str2']")) - { - XmlNode valueNode = parameterNode.SelectSingleNode("value"); - if (valueNode != null) - { - text += valueNode.InnerText; - } - } - } - if (text.Length == 0) - { - foreach (XmlNode parameterNode in generatorItemNode.SelectNodes("effect/parameter[parameterid='sourcetext']")) - { - XmlNode valueNode = parameterNode.SelectSingleNode("value"); - if (valueNode != null) - { - text += valueNode.InnerText; - } - } - } - if (text.Length == 0) - { - foreach (XmlNode parameterNode in generatorItemNode.SelectNodes("effect/parameter[parameterid='text']")) - { - XmlNode valueNode = parameterNode.SelectSingleNode("value"); - if (valueNode != null) - { - text += valueNode.InnerText; - } - } - } - - bool italic = false; - bool bold = false; - foreach (XmlNode parameterNode in generatorItemNode.SelectNodes("effect/parameter[parameterid='style']")) - { - XmlNode valueNode = parameterNode.SelectSingleNode("value"); - var valueEntries = parameterNode.SelectNodes("valuelist/valueentry"); - if (valueNode != null) - { - int no; - if (int.TryParse(valueNode.InnerText, out no)) - { - no--; - if (no < valueEntries.Count) - { - var styleNameNode = valueEntries[no].SelectSingleNode("name"); - if (styleNameNode != null) - { - string styleName = styleNameNode.InnerText.ToLowerInvariant().Trim(); - italic = styleName == "italic" || styleName == "bold/italic"; - bold = styleName == "bold" || styleName == "bold/italic"; - } - } - } - } - } - if (!bold && !italic) - { - foreach (XmlNode parameterNode in generatorItemNode.SelectNodes("effect/parameter[parameterid='fontstyle']")) - { - XmlNode valueNode = parameterNode.SelectSingleNode("value"); - var valueEntries = parameterNode.SelectNodes("valuelist/valueentry"); - if (valueNode != null) - { - int no; - if (int.TryParse(valueNode.InnerText, out no)) - { - no--; - if (no < valueEntries.Count) - { - var styleNameNode = valueEntries[no].SelectSingleNode("name"); - if (styleNameNode != null) - { - string styleName = styleNameNode.InnerText.ToLowerInvariant().Trim(); - italic = styleName == "italic" || styleName == "bold/italic"; - bold = styleName == "bold" || styleName == "bold/italic"; - } - } - } - } - } - } - - if (text.Length > 0) - { - if (!text.Contains(Environment.NewLine)) - { - text = text.Replace("\r", Environment.NewLine); - } - - if (bold) - { - text = "" + text + ""; - } - - if (italic) - { - text = "" + text + ""; - } - - subtitle.Paragraphs.Add(new Paragraph(text, Convert.ToDouble((startFrame / frameRate) * 1000), Convert.ToDouble((endFrame / frameRate) * 1000))); - } - } - } - catch - { - _errorCount++; - } - } - subtitle.Renumber(); - } - catch - { - _errorCount = 1; - return; - } - Configuration.Settings.General.CurrentFrameRate = frameRate; - } - } -} +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + // - Mom, when you were my age what did you want to do? + public class FinalCutProXml : SubtitleFormat + { + public override string Extension => ".xml"; + + public override string Name => "Final Cut Pro Xml"; + + public static string GetFrameRateAsString() + { + if (Configuration.Settings.General.CurrentFrameRate < 24) + { + return "24"; // ntsc 23.976 + } + + if (Configuration.Settings.General.CurrentFrameRate < 25) + { + return "24"; + } + + if (Configuration.Settings.General.CurrentFrameRate < 29) + { + return "25"; + } + + if (Configuration.Settings.General.CurrentFrameRate < 30) + { + return "30"; // ntsc 29.97 + } + + if (Configuration.Settings.General.CurrentFrameRate < 40) + { + return "30"; + } + + if (Configuration.Settings.General.CurrentFrameRate < 60) + { + return "60"; // ntsc 59.94 + } + + return "60"; + } + + public static string GetNtsc() + { + if (Configuration.Settings.General.CurrentFrameRate < 24) + { + return "TRUE"; // ntsc 23.976 + } + + if (Configuration.Settings.General.CurrentFrameRate < 25) + { + return "FALSE"; + } + + return "TRUE"; + } + + public override string ToText(Subtitle subtitle, string title) + { + int duration = 0; + if (subtitle.Paragraphs.Count > 0) + { + duration = (int)Math.Round(subtitle.Paragraphs[subtitle.Paragraphs.Count - 1].EndTime.TotalSeconds * Configuration.Settings.General.CurrentFrameRate); + } + + string xmlStructure = + "" + Environment.NewLine + + "" + Environment.NewLine + + "" + Environment.NewLine + + @" 5B3B0C07-9A9D-42AA-872C-C953923F97D8 + add + X + " + duration + @" + + " + GetNtsc() + @" + " + GetFrameRateAsString() + @" + + + + " + GetNtsc() + @" + " + GetFrameRateAsString() + @" + + 00:00:00:00 + 0 + source + NDF + + 0 + " + duration + @" + + + + +"; + + string xmlTrackStructure = + @" + Outline Text + 3000 + + " + GetNtsc() + @" + " + GetFrameRateAsString() + @" + + 1380 + 1474 + 8228 + 8322 + TRUE + FALSE + black + Outline Text1 + + Outline Text + Outline Text + Text + generator + video + + part1 + Text Settings + + + + str + Text + [TEXT] + + + font + Font + [FONTNAME] + + + style + Style + 1 + 4 + + + Plain + 1 + + + Bold + 2 + + + Italic + 3 + + + Bold/Italic + 4 + + + [FONTSTYLE] + + + align + Alignment + 1 + 3 + + + Left + 1 + + + Center + 2 + + + Right + 3 + + + 2 + + + size + Size + 0 + 200 + [FONTSIZE] + + + track + Tracking + 0 + 100 + 1 + + + lead + Leading + -100 + 100 + 0 + + + aspect + Aspect + 0 + 4 + 1 + + + linewidth + Line Width + 0 + 200 + 20 + + + linesoft + Line Softness + 0 + 100 + 5 + + + textopacity + Text Opacity + 0 + 100 + 100 + + + center + Center + + 0.00833333 + 0.390741 + + + + textcolor + Text Color + + 255 + 255 + 255 + 255 + + + + supertext + Text Graphic + + + linecolor + Line Color + + 255 + 0 + 0 + 0 + + + + part2 + Background Settings + + + + xscale + Horizontal Size + 0 + 200 + 0 + + + yscale + Vertical Size + 0 + 200 + 0 + + + xoffset + Horizontal Offset + -100 + 100 + 0 + + + yoffset + Vertical Offset + -100 + 100 + 0 + + + backcolor + Back Color + + 255 + 255 + 255 + 255 + + + + superback + Back Graphic + + + crop + Crop + FALSE + + + autokern + Auto Kerning + TRUE + + + + video + + "; + + if (string.IsNullOrEmpty(title)) + { + title = "Subtitle Edit subtitle"; + } + + var xml = new XmlDocument(); + xml.LoadXml(xmlStructure); + xml.DocumentElement.SelectSingleNode("sequence").Attributes["id"].Value = title; + xml.DocumentElement.SelectSingleNode("sequence/name").InnerText = title; + xml.DocumentElement.SelectSingleNode("sequence/uuid").InnerText = Guid.NewGuid().ToString().ToUpperInvariant(); + if (!string.IsNullOrEmpty(subtitle.Header)) + { + var header = new XmlDocument(); + try + { + header.LoadXml(subtitle.Header); + var node = header.DocumentElement.SelectSingleNode("sequence/uuid"); + if (node != null) + { + xml.DocumentElement.SelectSingleNode("sequence/uuid").InnerText = node.InnerText; + } + } + catch + { + // ignored + } + } + + XmlNode trackNode = xml.DocumentElement.SelectSingleNode("sequence/media/video/track"); + + const string newLine = "_____@___"; + int number = 1; + foreach (Paragraph p in subtitle.Paragraphs) + { + XmlNode generatorItem = xml.CreateElement("generatoritem"); + string fontStyle = "1"; //1==plain + var s = HtmlUtil.RemoveOpenCloseTags(p.Text, HtmlUtil.TagFont).Trim(); + if ((s.StartsWith("") && s.EndsWith("")) || (s.StartsWith("") && s.EndsWith(""))) + { + fontStyle = "4"; //4==bold/italic + } + else if (s.StartsWith("") && s.EndsWith("")) + { + fontStyle = "3"; //3==italic + } + + generatorItem.InnerXml = xmlTrackStructure.Replace("[NUMBER]", number.ToString()).Replace("[FONTSTYLE]", fontStyle). + Replace("[FONTSIZE]", Configuration.Settings.SubtitleSettings.FcpFontSize.ToString(CultureInfo.InvariantCulture)). + Replace("[FONTNAME]", Configuration.Settings.SubtitleSettings.FcpFontName). + Replace("[NUMBER]", number.ToString(CultureInfo.InvariantCulture)); + + double frameRate = Configuration.Settings.General.CurrentFrameRate; + XmlNode start = generatorItem.SelectSingleNode("generatoritem/start"); + start.InnerText = ((int)Math.Round(p.StartTime.TotalSeconds * frameRate)).ToString(); + + XmlNode end = generatorItem.SelectSingleNode("generatoritem/end"); + end.InnerText = ((int)Math.Round(p.EndTime.TotalSeconds * frameRate)).ToString(); + + XmlNode text = generatorItem.SelectSingleNode("generatoritem/effect/parameter[parameterid='str']/value"); + text.InnerText = HtmlUtil.RemoveHtmlTags(p.Text); + text.InnerXml = text.InnerXml.Replace(Environment.NewLine, newLine); + + trackNode.AppendChild(generatorItem.SelectSingleNode("generatoritem")); + number++; + } + + string xmlAsText = ToUtf8XmlString(xml); + xmlAsText = xmlAsText.Replace("xmeml[]", "xmeml"); + xmlAsText = xmlAsText.Replace(newLine, " "); + return xmlAsText; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + var frameRate = Configuration.Settings.General.CurrentFrameRate; + + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + var xml = new XmlDocument { XmlResolver = null }; + try + { + xml.LoadXml(sb.ToString().Trim()); + var header = new XmlDocument { XmlResolver = null }; + header.LoadXml(sb.ToString()); + if (header.SelectSingleNode("sequence/media/video/track") != null) + { + header.RemoveChild(header.SelectSingleNode("sequence/media/video/track")); + } + + subtitle.Header = header.OuterXml; + + if (xml.DocumentElement.SelectSingleNode("sequence/rate") != null && xml.DocumentElement.SelectSingleNode("sequence/rate/timebase") != null) + { + try + { + frameRate = double.Parse(xml.DocumentElement.SelectSingleNode("sequence/rate/timebase").InnerText); + } + catch + { + frameRate = Configuration.Settings.General.CurrentFrameRate; + } + } + + foreach (XmlNode node in xml.SelectNodes("//video/track")) + { + try + { + foreach (XmlNode generatorItemNode in node.SelectNodes("generatoritem")) + { + XmlNode rate = generatorItemNode.SelectSingleNode("rate"); + if (rate != null) + { + XmlNode timebase = rate.SelectSingleNode("timebase"); + if (timebase != null) + { + frameRate = double.Parse(timebase.InnerText); + } + } + + double startFrame = 0; + double endFrame = 0; + XmlNode startNode = generatorItemNode.SelectSingleNode("start"); + if (startNode != null) + { + startFrame = double.Parse(startNode.InnerText); + } + + XmlNode endNode = generatorItemNode.SelectSingleNode("end"); + if (endNode != null) + { + endFrame = double.Parse(endNode.InnerText); + } + + string text = string.Empty; + foreach (XmlNode parameterNode in generatorItemNode.SelectNodes("effect/parameter[parameterid='str']")) + { + XmlNode valueNode = parameterNode.SelectSingleNode("value"); + if (valueNode != null) + { + text += valueNode.InnerText; + } + } + if (text.Length == 0) + { + foreach (XmlNode parameterNode in generatorItemNode.SelectNodes("effect/parameter[parameterid='str1']")) + { + XmlNode valueNode = parameterNode.SelectSingleNode("value"); + if (valueNode != null) + { + text += valueNode.InnerText; + } + } + } + if (text.Length == 0) + { + foreach (XmlNode parameterNode in generatorItemNode.SelectNodes("effect/parameter[parameterid='str2']")) + { + XmlNode valueNode = parameterNode.SelectSingleNode("value"); + if (valueNode != null) + { + text += valueNode.InnerText; + } + } + } + if (text.Length == 0) + { + foreach (XmlNode parameterNode in generatorItemNode.SelectNodes("effect/parameter[parameterid='sourcetext']")) + { + XmlNode valueNode = parameterNode.SelectSingleNode("value"); + if (valueNode != null) + { + text += valueNode.InnerText; + } + } + } + if (text.Length == 0) + { + foreach (XmlNode parameterNode in generatorItemNode.SelectNodes("effect/parameter[parameterid='text']")) + { + XmlNode valueNode = parameterNode.SelectSingleNode("value"); + if (valueNode != null) + { + text += valueNode.InnerText; + } + } + } + + bool italic = false; + bool bold = false; + foreach (XmlNode parameterNode in generatorItemNode.SelectNodes("effect/parameter[parameterid='style']")) + { + XmlNode valueNode = parameterNode.SelectSingleNode("value"); + var valueEntries = parameterNode.SelectNodes("valuelist/valueentry"); + if (valueNode != null) + { + int no; + if (int.TryParse(valueNode.InnerText, out no)) + { + no--; + if (no < valueEntries.Count) + { + var styleNameNode = valueEntries[no].SelectSingleNode("name"); + if (styleNameNode != null) + { + string styleName = styleNameNode.InnerText.ToLowerInvariant().Trim(); + italic = styleName == "italic" || styleName == "bold/italic"; + bold = styleName == "bold" || styleName == "bold/italic"; + } + } + } + } + } + if (!bold && !italic) + { + foreach (XmlNode parameterNode in generatorItemNode.SelectNodes("effect/parameter[parameterid='fontstyle']")) + { + XmlNode valueNode = parameterNode.SelectSingleNode("value"); + var valueEntries = parameterNode.SelectNodes("valuelist/valueentry"); + if (valueNode != null) + { + int no; + if (int.TryParse(valueNode.InnerText, out no)) + { + no--; + if (no < valueEntries.Count) + { + var styleNameNode = valueEntries[no].SelectSingleNode("name"); + if (styleNameNode != null) + { + string styleName = styleNameNode.InnerText.ToLowerInvariant().Trim(); + italic = styleName == "italic" || styleName == "bold/italic"; + bold = styleName == "bold" || styleName == "bold/italic"; + } + } + } + } + } + } + + if (text.Length > 0) + { + if (!text.Contains(Environment.NewLine)) + { + text = text.Replace("\r", Environment.NewLine); + } + + if (bold) + { + text = "" + text + ""; + } + + if (italic) + { + text = "" + text + ""; + } + + subtitle.Paragraphs.Add(new Paragraph(text, Convert.ToDouble((startFrame / frameRate) * 1000), Convert.ToDouble((endFrame / frameRate) * 1000))); + } + } + } + catch + { + _errorCount++; + } + } + subtitle.Renumber(); + } + catch + { + _errorCount = 1; + return; + } + Configuration.Settings.General.CurrentFrameRate = frameRate; + } + } +} diff --git a/libse/SubtitleFormats/FinalCutProXml13.cs b/src/libse/SubtitleFormats/FinalCutProXml13.cs similarity index 97% rename from libse/SubtitleFormats/FinalCutProXml13.cs rename to src/libse/SubtitleFormats/FinalCutProXml13.cs index f148c15a1..888af8a17 100644 --- a/libse/SubtitleFormats/FinalCutProXml13.cs +++ b/src/libse/SubtitleFormats/FinalCutProXml13.cs @@ -1,200 +1,200 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class FinalCutProXml13 : SubtitleFormat - { - public double FrameRate { get; set; } - - public override string Extension => ".fcpxml"; - - public override string Name => "Final Cut Pro Xml 1.3"; - - public override string ToText(Subtitle subtitle, string title) - { - if (Configuration.Settings.General.CurrentFrameRate > 26) - { - FrameRate = 30; - } - else - { - FrameRate = 25; - } - - string xmlStructure = - "" + Environment.NewLine + - "" + Environment.NewLine + - Environment.NewLine + - "" + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - ""; - - string xmlClipStructure = - " "; - - var xml = new XmlDocument(); - xml.LoadXml(xmlStructure); - - XmlNode videoNode = xml.DocumentElement.SelectSingleNode("project/sequence/spine"); - - int number = 1; - foreach (Paragraph p in subtitle.Paragraphs) - { - XmlNode clip = xml.CreateElement("clip"); - clip.InnerXml = xmlClipStructure; - var attr = xml.CreateAttribute("name"); - attr.Value = title; - clip.Attributes.Append(attr); - - attr = xml.CreateAttribute("duration"); - attr.Value = Convert.ToInt64(p.Duration.TotalSeconds * 2400000) + "/2400000s"; - clip.Attributes.Append(attr); - - attr = xml.CreateAttribute("start"); - attr.Value = Convert.ToInt64(p.StartTime.TotalSeconds * 2400000) + "/2400000s"; - clip.Attributes.Append(attr); - - attr = xml.CreateAttribute("audioStart"); - attr.Value = "0s"; - clip.Attributes.Append(attr); - - attr = xml.CreateAttribute("audioDuration"); - attr.Value = Convert.ToInt64(p.Duration.TotalSeconds * 2400000) + "/2400000s"; - clip.Attributes.Append(attr); - - attr = xml.CreateAttribute("tcFormat"); - attr.Value = "NDF"; - clip.Attributes.Append(attr); - - XmlNode titleNode = clip.SelectSingleNode("video"); - titleNode.Attributes["offset"].Value = Convert.ToInt64(p.StartTime.TotalSeconds * 60000) + "/60000s"; - titleNode.Attributes["name"].Value = HtmlUtil.RemoveHtmlTags(p.Text); - titleNode.Attributes["duration"].Value = Convert.ToInt64(p.Duration.TotalSeconds * 60000) + "/60000s"; - titleNode.Attributes["start"].Value = Convert.ToInt64(p.StartTime.TotalSeconds * 60000) + "/60000s"; - - XmlNode param = clip.SelectSingleNode("video/param"); - param.Attributes["value"].InnerText = HtmlUtil.RemoveHtmlTags(p.Text); - - videoNode.AppendChild(clip); - number++; - } - - string xmlAsText = ToUtf8XmlString(xml); - xmlAsText = xmlAsText.Replace("fcpxml[]", "fcpxml"); - xmlAsText = xmlAsText.Replace("fcpxml []", "fcpxml"); - return xmlAsText; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - FrameRate = Configuration.Settings.General.CurrentFrameRate; - - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - string x = sb.ToString(); - if (!x.Contains(" 0) - { - var prev = subtitle.Paragraphs[subtitle.Paragraphs.Count - 1]; - if (prev.Text == p.Text && prev.StartTime.TotalMilliseconds == p.StartTime.TotalMilliseconds) - { - add = false; - } - } - if (add) - { - subtitle.Paragraphs.Add(p); - } - } - catch - { - _errorCount++; - } - } - } - subtitle.Renumber(); - } - catch (Exception exception) - { - System.Diagnostics.Debug.WriteLine(exception.Message); - _errorCount = 1; - } - } - - private static TimeCode DecodeTime(XmlAttribute duration) - { - // 220220/60000s - if (duration != null) - { - var arr = duration.Value.TrimEnd('s').Split('/'); - if (arr.Length == 2) - { - return TimeCode.FromSeconds(long.Parse(arr[0]) / double.Parse(arr[1])); - } - else if (arr.Length == 1) - { - return TimeCode.FromSeconds(float.Parse(arr[0])); - } - } - return new TimeCode(); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class FinalCutProXml13 : SubtitleFormat + { + public double FrameRate { get; set; } + + public override string Extension => ".fcpxml"; + + public override string Name => "Final Cut Pro Xml 1.3"; + + public override string ToText(Subtitle subtitle, string title) + { + if (Configuration.Settings.General.CurrentFrameRate > 26) + { + FrameRate = 30; + } + else + { + FrameRate = 25; + } + + string xmlStructure = + "" + Environment.NewLine + + "" + Environment.NewLine + + Environment.NewLine + + "" + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + ""; + + string xmlClipStructure = + " "; + + var xml = new XmlDocument(); + xml.LoadXml(xmlStructure); + + XmlNode videoNode = xml.DocumentElement.SelectSingleNode("project/sequence/spine"); + + int number = 1; + foreach (Paragraph p in subtitle.Paragraphs) + { + XmlNode clip = xml.CreateElement("clip"); + clip.InnerXml = xmlClipStructure; + var attr = xml.CreateAttribute("name"); + attr.Value = title; + clip.Attributes.Append(attr); + + attr = xml.CreateAttribute("duration"); + attr.Value = Convert.ToInt64(p.Duration.TotalSeconds * 2400000) + "/2400000s"; + clip.Attributes.Append(attr); + + attr = xml.CreateAttribute("start"); + attr.Value = Convert.ToInt64(p.StartTime.TotalSeconds * 2400000) + "/2400000s"; + clip.Attributes.Append(attr); + + attr = xml.CreateAttribute("audioStart"); + attr.Value = "0s"; + clip.Attributes.Append(attr); + + attr = xml.CreateAttribute("audioDuration"); + attr.Value = Convert.ToInt64(p.Duration.TotalSeconds * 2400000) + "/2400000s"; + clip.Attributes.Append(attr); + + attr = xml.CreateAttribute("tcFormat"); + attr.Value = "NDF"; + clip.Attributes.Append(attr); + + XmlNode titleNode = clip.SelectSingleNode("video"); + titleNode.Attributes["offset"].Value = Convert.ToInt64(p.StartTime.TotalSeconds * 60000) + "/60000s"; + titleNode.Attributes["name"].Value = HtmlUtil.RemoveHtmlTags(p.Text); + titleNode.Attributes["duration"].Value = Convert.ToInt64(p.Duration.TotalSeconds * 60000) + "/60000s"; + titleNode.Attributes["start"].Value = Convert.ToInt64(p.StartTime.TotalSeconds * 60000) + "/60000s"; + + XmlNode param = clip.SelectSingleNode("video/param"); + param.Attributes["value"].InnerText = HtmlUtil.RemoveHtmlTags(p.Text); + + videoNode.AppendChild(clip); + number++; + } + + string xmlAsText = ToUtf8XmlString(xml); + xmlAsText = xmlAsText.Replace("fcpxml[]", "fcpxml"); + xmlAsText = xmlAsText.Replace("fcpxml []", "fcpxml"); + return xmlAsText; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + FrameRate = Configuration.Settings.General.CurrentFrameRate; + + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + string x = sb.ToString(); + if (!x.Contains(" 0) + { + var prev = subtitle.Paragraphs[subtitle.Paragraphs.Count - 1]; + if (prev.Text == p.Text && prev.StartTime.TotalMilliseconds == p.StartTime.TotalMilliseconds) + { + add = false; + } + } + if (add) + { + subtitle.Paragraphs.Add(p); + } + } + catch + { + _errorCount++; + } + } + } + subtitle.Renumber(); + } + catch (Exception exception) + { + System.Diagnostics.Debug.WriteLine(exception.Message); + _errorCount = 1; + } + } + + private static TimeCode DecodeTime(XmlAttribute duration) + { + // 220220/60000s + if (duration != null) + { + var arr = duration.Value.TrimEnd('s').Split('/'); + if (arr.Length == 2) + { + return TimeCode.FromSeconds(long.Parse(arr[0]) / double.Parse(arr[1])); + } + else if (arr.Length == 1) + { + return TimeCode.FromSeconds(float.Parse(arr[0])); + } + } + return new TimeCode(); + } + + } +} diff --git a/libse/SubtitleFormats/FinalCutProXml14.cs b/src/libse/SubtitleFormats/FinalCutProXml14.cs similarity index 98% rename from libse/SubtitleFormats/FinalCutProXml14.cs rename to src/libse/SubtitleFormats/FinalCutProXml14.cs index c2b507cc7..4d233d805 100644 --- a/libse/SubtitleFormats/FinalCutProXml14.cs +++ b/src/libse/SubtitleFormats/FinalCutProXml14.cs @@ -1,188 +1,188 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class FinalCutProXml14 : SubtitleFormat - { - public double FrameRate { get; set; } - - public override string Extension => ".fcpxml"; - - public override string Name => "Final Cut Pro Xml 1.4"; - - public override string ToText(Subtitle subtitle, string title) - { - if (Configuration.Settings.General.CurrentFrameRate > 26) - { - FrameRate = 30; - } - else - { - FrameRate = 25; - } - - string xmlStructure = - "" + Environment.NewLine + - "" + Environment.NewLine + - Environment.NewLine + - "" + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " Apple ProRes 422 Proxy" + Environment.NewLine + - " Linear PCM" + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + // From here down I am unsure how it should be - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - ""; - - string xmlClipStructure = - " "; - - var xml = new XmlDocument(); - xml.LoadXml(xmlStructure); - XmlNode videoNode = xml.DocumentElement.SelectSingleNode("//project/sequence/spine/clip"); - int number = 1; - foreach (Paragraph p in subtitle.Paragraphs) - { - XmlNode video = xml.CreateElement("video"); - video.InnerXml = xmlClipStructure; - - XmlNode generatorNode = video.SelectSingleNode("video"); - generatorNode.Attributes["offset"].Value = Convert.ToInt64(p.StartTime.TotalSeconds * 2400000) + "/2400000s"; - generatorNode.Attributes["duration"].Value = Convert.ToInt64(p.Duration.TotalSeconds * 2400000) + "/2400000s"; - generatorNode.Attributes["start"].Value = Convert.ToInt64(p.StartTime.TotalSeconds * 2400000) + "/2400000s"; - - XmlNode param = video.SelectSingleNode("video/param"); - param.Attributes["value"].InnerText = HtmlUtil.RemoveHtmlTags(p.Text); - - videoNode.AppendChild(generatorNode); - number++; - } - - string xmlAsText = ToUtf8XmlString(xml); - xmlAsText = xmlAsText.Replace("fcpxml[]", "fcpxml"); - xmlAsText = xmlAsText.Replace("fcpxml []", "fcpxml"); - return xmlAsText; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - FrameRate = Configuration.Settings.General.CurrentFrameRate; - - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - string x = sb.ToString(); - if (!x.Contains("") && !x.Contains("")) - { - return; - } - - var xml = new XmlDocument { XmlResolver = null }; - try - { - xml.LoadXml(x.Trim()); - - foreach (XmlNode node in xml.SelectNodes("//project/sequence/spine/clip/video/param[@name='Text']")) - { - try - { - string text = node.Attributes["value"].InnerText; - Paragraph p = new Paragraph(); - p.Text = text.Trim(); - p.StartTime = DecodeTime(node.ParentNode.Attributes["offset"]); - p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + DecodeTime(node.ParentNode.Attributes["duration"]).TotalMilliseconds; - subtitle.Paragraphs.Add(p); - } - catch - { - _errorCount++; - } - } - - if (subtitle.Paragraphs.Count == 0) - { - foreach (XmlNode node in xml.SelectNodes("//project/sequence/spine/clip/video/title/text")) - { - try - { - string text = node.ParentNode.InnerText; - Paragraph p = new Paragraph(); - p.Text = text.Trim(); - p.StartTime = DecodeTime(node.ParentNode.Attributes["offset"]); - p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + DecodeTime(node.ParentNode.Attributes["duration"]).TotalMilliseconds; - bool add = true; - if (subtitle.Paragraphs.Count > 0) - { - var prev = subtitle.Paragraphs[subtitle.Paragraphs.Count - 1]; - if (prev.Text == p.Text && Math.Abs(prev.StartTime.TotalMilliseconds - p.StartTime.TotalMilliseconds) < 0.01) - { - add = false; - } - } - if (add) - { - subtitle.Paragraphs.Add(p); - } - } - catch - { - _errorCount++; - } - } - } - subtitle.Renumber(); - } - catch - { - _errorCount = 1; - } - } - - private static TimeCode DecodeTime(XmlAttribute duration) - { - // 220220/60000s - if (duration != null) - { - var arr = duration.Value.TrimEnd('s').Split('/'); - if (arr.Length == 2) - { - return TimeCode.FromSeconds(long.Parse(arr[0]) / double.Parse(arr[1])); - } - else if (arr.Length == 1) - { - return TimeCode.FromSeconds(float.Parse(arr[0])); - } - } - return new TimeCode(); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class FinalCutProXml14 : SubtitleFormat + { + public double FrameRate { get; set; } + + public override string Extension => ".fcpxml"; + + public override string Name => "Final Cut Pro Xml 1.4"; + + public override string ToText(Subtitle subtitle, string title) + { + if (Configuration.Settings.General.CurrentFrameRate > 26) + { + FrameRate = 30; + } + else + { + FrameRate = 25; + } + + string xmlStructure = + "" + Environment.NewLine + + "" + Environment.NewLine + + Environment.NewLine + + "" + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " Apple ProRes 422 Proxy" + Environment.NewLine + + " Linear PCM" + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + // From here down I am unsure how it should be + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + ""; + + string xmlClipStructure = + " "; + + var xml = new XmlDocument(); + xml.LoadXml(xmlStructure); + XmlNode videoNode = xml.DocumentElement.SelectSingleNode("//project/sequence/spine/clip"); + int number = 1; + foreach (Paragraph p in subtitle.Paragraphs) + { + XmlNode video = xml.CreateElement("video"); + video.InnerXml = xmlClipStructure; + + XmlNode generatorNode = video.SelectSingleNode("video"); + generatorNode.Attributes["offset"].Value = Convert.ToInt64(p.StartTime.TotalSeconds * 2400000) + "/2400000s"; + generatorNode.Attributes["duration"].Value = Convert.ToInt64(p.Duration.TotalSeconds * 2400000) + "/2400000s"; + generatorNode.Attributes["start"].Value = Convert.ToInt64(p.StartTime.TotalSeconds * 2400000) + "/2400000s"; + + XmlNode param = video.SelectSingleNode("video/param"); + param.Attributes["value"].InnerText = HtmlUtil.RemoveHtmlTags(p.Text); + + videoNode.AppendChild(generatorNode); + number++; + } + + string xmlAsText = ToUtf8XmlString(xml); + xmlAsText = xmlAsText.Replace("fcpxml[]", "fcpxml"); + xmlAsText = xmlAsText.Replace("fcpxml []", "fcpxml"); + return xmlAsText; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + FrameRate = Configuration.Settings.General.CurrentFrameRate; + + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + string x = sb.ToString(); + if (!x.Contains("") && !x.Contains("")) + { + return; + } + + var xml = new XmlDocument { XmlResolver = null }; + try + { + xml.LoadXml(x.Trim()); + + foreach (XmlNode node in xml.SelectNodes("//project/sequence/spine/clip/video/param[@name='Text']")) + { + try + { + string text = node.Attributes["value"].InnerText; + Paragraph p = new Paragraph(); + p.Text = text.Trim(); + p.StartTime = DecodeTime(node.ParentNode.Attributes["offset"]); + p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + DecodeTime(node.ParentNode.Attributes["duration"]).TotalMilliseconds; + subtitle.Paragraphs.Add(p); + } + catch + { + _errorCount++; + } + } + + if (subtitle.Paragraphs.Count == 0) + { + foreach (XmlNode node in xml.SelectNodes("//project/sequence/spine/clip/video/title/text")) + { + try + { + string text = node.ParentNode.InnerText; + Paragraph p = new Paragraph(); + p.Text = text.Trim(); + p.StartTime = DecodeTime(node.ParentNode.Attributes["offset"]); + p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + DecodeTime(node.ParentNode.Attributes["duration"]).TotalMilliseconds; + bool add = true; + if (subtitle.Paragraphs.Count > 0) + { + var prev = subtitle.Paragraphs[subtitle.Paragraphs.Count - 1]; + if (prev.Text == p.Text && Math.Abs(prev.StartTime.TotalMilliseconds - p.StartTime.TotalMilliseconds) < 0.01) + { + add = false; + } + } + if (add) + { + subtitle.Paragraphs.Add(p); + } + } + catch + { + _errorCount++; + } + } + } + subtitle.Renumber(); + } + catch + { + _errorCount = 1; + } + } + + private static TimeCode DecodeTime(XmlAttribute duration) + { + // 220220/60000s + if (duration != null) + { + var arr = duration.Value.TrimEnd('s').Split('/'); + if (arr.Length == 2) + { + return TimeCode.FromSeconds(long.Parse(arr[0]) / double.Parse(arr[1])); + } + else if (arr.Length == 1) + { + return TimeCode.FromSeconds(float.Parse(arr[0])); + } + } + return new TimeCode(); + } + + } +} diff --git a/libse/SubtitleFormats/FinalCutProXml14Text.cs b/src/libse/SubtitleFormats/FinalCutProXml14Text.cs similarity index 97% rename from libse/SubtitleFormats/FinalCutProXml14Text.cs rename to src/libse/SubtitleFormats/FinalCutProXml14Text.cs index 4bd5a3fb3..73f89b5dc 100644 --- a/libse/SubtitleFormats/FinalCutProXml14Text.cs +++ b/src/libse/SubtitleFormats/FinalCutProXml14Text.cs @@ -1,209 +1,209 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Text; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class FinalCutProXml14Text : SubtitleFormat - { - public double FrameRate { get; set; } - - public override string Extension => ".fcpxml"; - - public override string Name => "Final Cut Pro Xml 1.4 Text"; - - public override string ToText(Subtitle subtitle, string title) - { - if (Configuration.Settings.General.CurrentFrameRate > 26) - { - FrameRate = 30; - } - else - { - FrameRate = 25; - } - - string xmlStructure = - "" + Environment.NewLine + - "" + Environment.NewLine + - Environment.NewLine + - "" + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - ""; - - string xmlClipStructure = - "" + Environment.NewLine + - " <param name=\"Position\" key=\"9999/999166631/999166633/1/100/101\" value=\"-1.67499 -470.934\"/>" + Environment.NewLine + - " <text>" + Environment.NewLine + - " <text-style ref=\"ts[NUMBER]\">THE NOISEMAKER</text-style>" + Environment.NewLine + - " </text>" + Environment.NewLine + - " <text-style-def id=\"ts[NUMBER]\">" + Environment.NewLine + - " <text-style font=\"Lucida Grande\" fontSize=\"36\" fontFace=\"Regular\" fontColor=\"0.793266 0.793391 0.793221 1\" baseline=\"29\" shadowColor=\"0 0 0 1\" shadowOffset=\"5 315\" alignment=\"center\"/>" + Environment.NewLine + - " </text-style-def>" + Environment.NewLine + - ""; - - var xml = new XmlDocument(); - xml.LoadXml(xmlStructure); - XmlNode videoNode = xml.DocumentElement.SelectSingleNode("//project/sequence/spine/gap"); - int number = 1; - foreach (Paragraph p in subtitle.Paragraphs) - { - XmlNode video = xml.CreateElement("video"); - var trimmedTitle = new StringBuilder(); - foreach (var ch in HtmlUtil.RemoveHtmlTags(p.Text, true)) - { - if (CharUtils.IsEnglishAlphabet(ch) || char.IsDigit(ch)) - { - trimmedTitle.Append(ch); - } - } - string temp = xmlClipStructure.Replace("[NUMBER]", number.ToString(CultureInfo.InvariantCulture)).Replace("[TITLEID]", trimmedTitle.ToString()); - video.InnerXml = temp; - - XmlNode generatorNode = video.SelectSingleNode("title"); - if (IsNearleWholeNumber(p.StartTime.TotalSeconds)) - { - generatorNode.Attributes["offset"].Value = Convert.ToInt64(p.StartTime.TotalSeconds) + "s"; - } - else - { - generatorNode.Attributes["offset"].Value = FinalCutProXml15.GetFrameTime(p.StartTime); - } - - if (IsNearleWholeNumber(p.Duration.TotalSeconds)) - { - generatorNode.Attributes["duration"].Value = Convert.ToInt64(p.Duration.TotalSeconds) + "s"; - } - else - { - generatorNode.Attributes["duration"].Value = FinalCutProXml15.GetFrameTime(p.Duration); - } - - if (IsNearleWholeNumber(p.StartTime.TotalSeconds)) - { - generatorNode.Attributes["start"].Value = Convert.ToInt64(p.StartTime.TotalSeconds) + "s"; - } - else - { - generatorNode.Attributes["start"].Value = FinalCutProXml15.GetFrameTime(p.StartTime); - } - - XmlNode param = video.SelectSingleNode("title/text/text-style"); - param.InnerText = HtmlUtil.RemoveHtmlTags(p.Text); - - videoNode.AppendChild(generatorNode); - number++; - } - - string xmlAsText = ToUtf8XmlString(xml); - xmlAsText = xmlAsText.Replace("fcpxml[]", "fcpxml"); - xmlAsText = xmlAsText.Replace("fcpxml []", "fcpxml"); - return xmlAsText; - } - - private static bool IsNearleWholeNumber(double number) - { - double rest = number - Convert.ToInt64(number); - return rest < 0.001; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - FrameRate = Configuration.Settings.General.CurrentFrameRate; - - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - string x = sb.ToString(); - if (!x.Contains("")) - { - return; - } - - var xml = new XmlDocument(); - try - { - xml.LoadXml(x.Trim()); - - if (subtitle.Paragraphs.Count == 0) - { - var textNodes = xml.SelectNodes("//project/sequence/spine/title/text"); - if (textNodes.Count == 0) - { - textNodes = xml.SelectNodes("//project/sequence/spine/gap/title/text"); - } - foreach (XmlNode node in textNodes) - { - try - { - string text = node.ParentNode.InnerText; - var p = new Paragraph(); - p.Text = text.Trim(); - p.StartTime = DecodeTime(node.ParentNode.Attributes["offset"]); - p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + DecodeTime(node.ParentNode.Attributes["duration"]).TotalMilliseconds; - bool add = true; - if (subtitle.Paragraphs.Count > 0) - { - var prev = subtitle.Paragraphs[subtitle.Paragraphs.Count - 1]; - if (prev.Text == p.Text && prev.StartTime.TotalMilliseconds == p.StartTime.TotalMilliseconds) - { - add = false; - } - } - if (add) - { - subtitle.Paragraphs.Add(p); - } - } - catch - { - _errorCount++; - } - } - } - subtitle.Renumber(); - } - catch - { - _errorCount = 1; - } - } - - private static TimeCode DecodeTime(XmlAttribute duration) - { - // 220220/60000s - if (duration != null) - { - var arr = duration.Value.TrimEnd('s').Split('/'); - if (arr.Length == 2) - { - return TimeCode.FromSeconds(long.Parse(arr[0]) / double.Parse(arr[1])); - } - if (arr.Length == 1) - { - return TimeCode.FromSeconds(float.Parse(arr[0])); - } - } - return new TimeCode(); - } - - } -} +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class FinalCutProXml14Text : SubtitleFormat + { + public double FrameRate { get; set; } + + public override string Extension => ".fcpxml"; + + public override string Name => "Final Cut Pro Xml 1.4 Text"; + + public override string ToText(Subtitle subtitle, string title) + { + if (Configuration.Settings.General.CurrentFrameRate > 26) + { + FrameRate = 30; + } + else + { + FrameRate = 25; + } + + string xmlStructure = + "" + Environment.NewLine + + "" + Environment.NewLine + + Environment.NewLine + + "" + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + ""; + + string xmlClipStructure = + "" + Environment.NewLine + + " <param name=\"Position\" key=\"9999/999166631/999166633/1/100/101\" value=\"-1.67499 -470.934\"/>" + Environment.NewLine + + " <text>" + Environment.NewLine + + " <text-style ref=\"ts[NUMBER]\">THE NOISEMAKER</text-style>" + Environment.NewLine + + " </text>" + Environment.NewLine + + " <text-style-def id=\"ts[NUMBER]\">" + Environment.NewLine + + " <text-style font=\"Lucida Grande\" fontSize=\"36\" fontFace=\"Regular\" fontColor=\"0.793266 0.793391 0.793221 1\" baseline=\"29\" shadowColor=\"0 0 0 1\" shadowOffset=\"5 315\" alignment=\"center\"/>" + Environment.NewLine + + " </text-style-def>" + Environment.NewLine + + ""; + + var xml = new XmlDocument(); + xml.LoadXml(xmlStructure); + XmlNode videoNode = xml.DocumentElement.SelectSingleNode("//project/sequence/spine/gap"); + int number = 1; + foreach (Paragraph p in subtitle.Paragraphs) + { + XmlNode video = xml.CreateElement("video"); + var trimmedTitle = new StringBuilder(); + foreach (var ch in HtmlUtil.RemoveHtmlTags(p.Text, true)) + { + if (CharUtils.IsEnglishAlphabet(ch) || char.IsDigit(ch)) + { + trimmedTitle.Append(ch); + } + } + string temp = xmlClipStructure.Replace("[NUMBER]", number.ToString(CultureInfo.InvariantCulture)).Replace("[TITLEID]", trimmedTitle.ToString()); + video.InnerXml = temp; + + XmlNode generatorNode = video.SelectSingleNode("title"); + if (IsNearleWholeNumber(p.StartTime.TotalSeconds)) + { + generatorNode.Attributes["offset"].Value = Convert.ToInt64(p.StartTime.TotalSeconds) + "s"; + } + else + { + generatorNode.Attributes["offset"].Value = FinalCutProXml15.GetFrameTime(p.StartTime); + } + + if (IsNearleWholeNumber(p.Duration.TotalSeconds)) + { + generatorNode.Attributes["duration"].Value = Convert.ToInt64(p.Duration.TotalSeconds) + "s"; + } + else + { + generatorNode.Attributes["duration"].Value = FinalCutProXml15.GetFrameTime(p.Duration); + } + + if (IsNearleWholeNumber(p.StartTime.TotalSeconds)) + { + generatorNode.Attributes["start"].Value = Convert.ToInt64(p.StartTime.TotalSeconds) + "s"; + } + else + { + generatorNode.Attributes["start"].Value = FinalCutProXml15.GetFrameTime(p.StartTime); + } + + XmlNode param = video.SelectSingleNode("title/text/text-style"); + param.InnerText = HtmlUtil.RemoveHtmlTags(p.Text); + + videoNode.AppendChild(generatorNode); + number++; + } + + string xmlAsText = ToUtf8XmlString(xml); + xmlAsText = xmlAsText.Replace("fcpxml[]", "fcpxml"); + xmlAsText = xmlAsText.Replace("fcpxml []", "fcpxml"); + return xmlAsText; + } + + private static bool IsNearleWholeNumber(double number) + { + double rest = number - Convert.ToInt64(number); + return rest < 0.001; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + FrameRate = Configuration.Settings.General.CurrentFrameRate; + + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + string x = sb.ToString(); + if (!x.Contains("")) + { + return; + } + + var xml = new XmlDocument(); + try + { + xml.LoadXml(x.Trim()); + + if (subtitle.Paragraphs.Count == 0) + { + var textNodes = xml.SelectNodes("//project/sequence/spine/title/text"); + if (textNodes.Count == 0) + { + textNodes = xml.SelectNodes("//project/sequence/spine/gap/title/text"); + } + foreach (XmlNode node in textNodes) + { + try + { + string text = node.ParentNode.InnerText; + var p = new Paragraph(); + p.Text = text.Trim(); + p.StartTime = DecodeTime(node.ParentNode.Attributes["offset"]); + p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + DecodeTime(node.ParentNode.Attributes["duration"]).TotalMilliseconds; + bool add = true; + if (subtitle.Paragraphs.Count > 0) + { + var prev = subtitle.Paragraphs[subtitle.Paragraphs.Count - 1]; + if (prev.Text == p.Text && prev.StartTime.TotalMilliseconds == p.StartTime.TotalMilliseconds) + { + add = false; + } + } + if (add) + { + subtitle.Paragraphs.Add(p); + } + } + catch + { + _errorCount++; + } + } + } + subtitle.Renumber(); + } + catch + { + _errorCount = 1; + } + } + + private static TimeCode DecodeTime(XmlAttribute duration) + { + // 220220/60000s + if (duration != null) + { + var arr = duration.Value.TrimEnd('s').Split('/'); + if (arr.Length == 2) + { + return TimeCode.FromSeconds(long.Parse(arr[0]) / double.Parse(arr[1])); + } + if (arr.Length == 1) + { + return TimeCode.FromSeconds(float.Parse(arr[0])); + } + } + return new TimeCode(); + } + + } +} diff --git a/libse/SubtitleFormats/FinalCutProXml15.cs b/src/libse/SubtitleFormats/FinalCutProXml15.cs similarity index 100% rename from libse/SubtitleFormats/FinalCutProXml15.cs rename to src/libse/SubtitleFormats/FinalCutProXml15.cs diff --git a/libse/SubtitleFormats/FinalCutProXml16.cs b/src/libse/SubtitleFormats/FinalCutProXml16.cs similarity index 100% rename from libse/SubtitleFormats/FinalCutProXml16.cs rename to src/libse/SubtitleFormats/FinalCutProXml16.cs diff --git a/libse/SubtitleFormats/FinalCutProXml17.cs b/src/libse/SubtitleFormats/FinalCutProXml17.cs similarity index 100% rename from libse/SubtitleFormats/FinalCutProXml17.cs rename to src/libse/SubtitleFormats/FinalCutProXml17.cs diff --git a/libse/SubtitleFormats/FinalCutProXml18.cs b/src/libse/SubtitleFormats/FinalCutProXml18.cs similarity index 100% rename from libse/SubtitleFormats/FinalCutProXml18.cs rename to src/libse/SubtitleFormats/FinalCutProXml18.cs diff --git a/libse/SubtitleFormats/FinalCutProXmlGap.cs b/src/libse/SubtitleFormats/FinalCutProXmlGap.cs similarity index 98% rename from libse/SubtitleFormats/FinalCutProXmlGap.cs rename to src/libse/SubtitleFormats/FinalCutProXmlGap.cs index 8f53f125c..9372fd441 100644 --- a/libse/SubtitleFormats/FinalCutProXmlGap.cs +++ b/src/libse/SubtitleFormats/FinalCutProXmlGap.cs @@ -1,149 +1,149 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class FinalCutProXmlGap : SubtitleFormat - { - public double FrameRate { get; set; } - - public override string Extension => ".fcpxml"; - - public override string Name => "Final Cut Xml Gap"; - - public override string ToText(Subtitle subtitle, string title) - { - if (Configuration.Settings.General.CurrentFrameRate > 26) - { - FrameRate = 30; - } - else - { - FrameRate = 25; - } - - string xmlStructure = - "" + Environment.NewLine + - "" + Environment.NewLine + - Environment.NewLine + - "" + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - // - // - // - // - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - ""; - - string xmlClipStructure = - " " + Environment.NewLine + - " <adjust-transform position=\"0.267518 -32.3158\"/>" + Environment.NewLine + - " <text></text>" + Environment.NewLine + - " "; - - var xml = new XmlDocument(); - xml.LoadXml(xmlStructure); - - XmlNode videoNode = xml.DocumentElement.SelectSingleNode("project/sequence/spine/gap"); - - int number = 1; - foreach (Paragraph p in subtitle.Paragraphs) - { - XmlNode titleNode = xml.CreateElement("holder"); - titleNode.InnerXml = xmlClipStructure; - titleNode = titleNode.SelectSingleNode("title"); - titleNode.Attributes["offset"].Value = Convert.ToInt64(p.StartTime.TotalSeconds * 60000) + "/60000s"; - titleNode.Attributes["name"].Value = HtmlUtil.RemoveHtmlTags(p.Text); - titleNode.Attributes["duration"].Value = Convert.ToInt64(p.Duration.TotalSeconds * 60000) + "/60000s"; - titleNode.Attributes["start"].Value = Convert.ToInt64(p.StartTime.TotalSeconds * 60000) + "/60000s"; - titleNode.SelectSingleNode("text").InnerText = HtmlUtil.RemoveHtmlTags(p.Text); - videoNode.AppendChild(titleNode); - number++; - } - - string xmlAsText = ToUtf8XmlString(xml); - xmlAsText = xmlAsText.Replace("fcpxml[]", "fcpxml"); - xmlAsText = xmlAsText.Replace("fcpxml []", "fcpxml"); - return xmlAsText; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - FrameRate = Configuration.Settings.General.CurrentFrameRate; - - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - var xml = new XmlDocument { XmlResolver = null }; - try - { - xml.LoadXml(sb.ToString().Trim()); - - foreach (XmlNode node in xml.SelectNodes("fcpxml/project/sequence/spine/gap")) - { - try - { - foreach (XmlNode title in node.SelectNodes("title")) - { - var textNodes = title.SelectNodes("text"); - if (textNodes != null && textNodes.Count > 0) - { - var p = new Paragraph(); - p.StartTime = DecodeTime(title.Attributes["offset"]); - p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + DecodeTime(title.Attributes["duration"]).TotalMilliseconds; - var text = new StringBuilder(); - foreach (XmlNode textNode in textNodes) - { - text.AppendLine(textNode.InnerText); - } - p.Text = text.ToString().Trim(); - subtitle.Paragraphs.Add(p); - } - } - } - catch - { - _errorCount++; - } - } - subtitle.Renumber(); - } - catch - { - _errorCount = 1; - } - } - - private static TimeCode DecodeTime(XmlAttribute duration) - { - // 220220/60000s - if (duration != null) - { - var arr = duration.Value.TrimEnd('s').Split('/'); - if (arr.Length == 2) - { - return TimeCode.FromSeconds(long.Parse(arr[0]) / double.Parse(arr[1])); - } - - if (arr.Length == 1) - { - return TimeCode.FromSeconds(float.Parse(arr[0])); - } - } - return new TimeCode(); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class FinalCutProXmlGap : SubtitleFormat + { + public double FrameRate { get; set; } + + public override string Extension => ".fcpxml"; + + public override string Name => "Final Cut Xml Gap"; + + public override string ToText(Subtitle subtitle, string title) + { + if (Configuration.Settings.General.CurrentFrameRate > 26) + { + FrameRate = 30; + } + else + { + FrameRate = 25; + } + + string xmlStructure = + "" + Environment.NewLine + + "" + Environment.NewLine + + Environment.NewLine + + "" + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + // + // + // + // + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + ""; + + string xmlClipStructure = + " " + Environment.NewLine + + " <adjust-transform position=\"0.267518 -32.3158\"/>" + Environment.NewLine + + " <text></text>" + Environment.NewLine + + " "; + + var xml = new XmlDocument(); + xml.LoadXml(xmlStructure); + + XmlNode videoNode = xml.DocumentElement.SelectSingleNode("project/sequence/spine/gap"); + + int number = 1; + foreach (Paragraph p in subtitle.Paragraphs) + { + XmlNode titleNode = xml.CreateElement("holder"); + titleNode.InnerXml = xmlClipStructure; + titleNode = titleNode.SelectSingleNode("title"); + titleNode.Attributes["offset"].Value = Convert.ToInt64(p.StartTime.TotalSeconds * 60000) + "/60000s"; + titleNode.Attributes["name"].Value = HtmlUtil.RemoveHtmlTags(p.Text); + titleNode.Attributes["duration"].Value = Convert.ToInt64(p.Duration.TotalSeconds * 60000) + "/60000s"; + titleNode.Attributes["start"].Value = Convert.ToInt64(p.StartTime.TotalSeconds * 60000) + "/60000s"; + titleNode.SelectSingleNode("text").InnerText = HtmlUtil.RemoveHtmlTags(p.Text); + videoNode.AppendChild(titleNode); + number++; + } + + string xmlAsText = ToUtf8XmlString(xml); + xmlAsText = xmlAsText.Replace("fcpxml[]", "fcpxml"); + xmlAsText = xmlAsText.Replace("fcpxml []", "fcpxml"); + return xmlAsText; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + FrameRate = Configuration.Settings.General.CurrentFrameRate; + + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + var xml = new XmlDocument { XmlResolver = null }; + try + { + xml.LoadXml(sb.ToString().Trim()); + + foreach (XmlNode node in xml.SelectNodes("fcpxml/project/sequence/spine/gap")) + { + try + { + foreach (XmlNode title in node.SelectNodes("title")) + { + var textNodes = title.SelectNodes("text"); + if (textNodes != null && textNodes.Count > 0) + { + var p = new Paragraph(); + p.StartTime = DecodeTime(title.Attributes["offset"]); + p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + DecodeTime(title.Attributes["duration"]).TotalMilliseconds; + var text = new StringBuilder(); + foreach (XmlNode textNode in textNodes) + { + text.AppendLine(textNode.InnerText); + } + p.Text = text.ToString().Trim(); + subtitle.Paragraphs.Add(p); + } + } + } + catch + { + _errorCount++; + } + } + subtitle.Renumber(); + } + catch + { + _errorCount = 1; + } + } + + private static TimeCode DecodeTime(XmlAttribute duration) + { + // 220220/60000s + if (duration != null) + { + var arr = duration.Value.TrimEnd('s').Split('/'); + if (arr.Length == 2) + { + return TimeCode.FromSeconds(long.Parse(arr[0]) / double.Parse(arr[1])); + } + + if (arr.Length == 1) + { + return TimeCode.FromSeconds(float.Parse(arr[0])); + } + } + return new TimeCode(); + } + + } +} diff --git a/libse/SubtitleFormats/FinalDraftTemplate2.cs b/src/libse/SubtitleFormats/FinalDraftTemplate2.cs similarity index 100% rename from libse/SubtitleFormats/FinalDraftTemplate2.cs rename to src/libse/SubtitleFormats/FinalDraftTemplate2.cs diff --git a/libse/SubtitleFormats/FlashXml.cs b/src/libse/SubtitleFormats/FlashXml.cs similarity index 97% rename from libse/SubtitleFormats/FlashXml.cs rename to src/libse/SubtitleFormats/FlashXml.cs index 96f1a02e9..d0dc7ae84 100644 --- a/libse/SubtitleFormats/FlashXml.cs +++ b/src/libse/SubtitleFormats/FlashXml.cs @@ -1,176 +1,176 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - - // - // - //
- //

This is fully skinnable through XML
using external images for each button]]>

- //

You can put in any order or enable/disable
the control buttons]]>

- //

Test below some of the customizable
properties this player has]]>

- //

Many other properties related to fonts, sizes, colors
and list properties are in style.css file]]>

- //
- //
- public class FlashXml : SubtitleFormat - { - public override string Extension => ".xml"; - - public override string Name => "Flash Xml"; - - public override bool IsMine(List lines, string fileName) - { - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - string xmlAsString = sb.ToString().Trim(); - if ((xmlAsString.Contains("") || xmlAsString.Contains(""))) - { - var xml = new XmlDocument { XmlResolver = null }; - try - { - xml.LoadXml(xmlAsString); - var paragraphs = xml.DocumentElement.SelectNodes("div/p"); - return paragraphs != null && paragraphs.Count > 0 && xml.DocumentElement.Name == "tt"; - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine(ex.Message); - } - } - return false; - } - - private static string ConvertToTimeString(TimeCode time) - { - return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}.{time.Milliseconds:00}"; - } - - public override string ToText(Subtitle subtitle, string title) - { - string xmlStructure = - "" + Environment.NewLine + - "" + Environment.NewLine + - "
" + Environment.NewLine + - "
" + Environment.NewLine + - "
"; - - var xml = new XmlDocument(); - xml.LoadXml(xmlStructure); - XmlNode div = xml.DocumentElement.SelectSingleNode("div"); - foreach (Paragraph p in subtitle.Paragraphs) - { - XmlNode paragraph = xml.CreateElement("p"); - string text = HtmlUtil.RemoveHtmlTags(p.Text, true); - - paragraph.InnerText = text; - paragraph.InnerXml = "" + paragraph.InnerXml.Replace(Environment.NewLine, "
") + "]]>"; - - XmlAttribute start = xml.CreateAttribute("begin"); - start.InnerText = ConvertToTimeString(p.StartTime); - paragraph.Attributes.Append(start); - - XmlAttribute end = xml.CreateAttribute("end"); - end.InnerText = ConvertToTimeString(p.EndTime); - paragraph.Attributes.Append(end); - - div.AppendChild(paragraph); - } - - return ToUtf8XmlString(xml); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - double startSeconds = 0; - - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - var xml = new XmlDocument { XmlResolver = null }; - xml.LoadXml(sb.ToString().Trim()); - - var pText = new StringBuilder(); - foreach (XmlNode node in xml.DocumentElement.SelectNodes("div/p")) - { - try - { - foreach (XmlNode innerNode in node.ChildNodes) - { - if (innerNode.Name == "br") - { - pText.AppendLine(); - } - else - { - pText.Append(innerNode.InnerText.Trim()); - } - } - - var start = string.Empty; - if (node.Attributes["begin"] != null) - { - start = node.Attributes["begin"].InnerText; - } - - var end = string.Empty; - if (node.Attributes["end"] != null) - { - end = node.Attributes["end"].InnerText; - } - - var dur = string.Empty; - if (node.Attributes["dur"] != null) - { - dur = node.Attributes["dur"].InnerText; - } - - TimeCode startCode = TimeCode.FromSeconds(startSeconds); - if (start.Length > 0) - { - startCode = GetTimeCode(start); - } - - TimeCode endCode; - if (end.Length > 0) - { - endCode = GetTimeCode(end); - } - else if (dur.Length > 0) - { - endCode = new TimeCode(GetTimeCode(dur).TotalMilliseconds + startCode.TotalMilliseconds); - } - else - { - endCode = new TimeCode(startCode.TotalMilliseconds + 3000); - } - startSeconds = endCode.TotalSeconds; - - subtitle.Paragraphs.Add(new Paragraph(startCode, endCode, pText.ToString().Replace("", string.Empty).Replace("", string.Empty))); - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine(ex.Message); - _errorCount++; - } - pText.Clear(); - } - subtitle.Renumber(); - } - - private static TimeCode GetTimeCode(string s) - { - if (s.EndsWith('s')) - { - s = s.TrimEnd('s'); - return TimeCode.FromSeconds(double.Parse(s)); - } - var parts = s.Split(new[] { ':', '.', ',' }); - return new TimeCode(int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2]), int.Parse(parts[3])); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + + // + // + //
+ //

This is fully skinnable through XML
using external images for each button]]>

+ //

You can put in any order or enable/disable
the control buttons]]>

+ //

Test below some of the customizable
properties this player has]]>

+ //

Many other properties related to fonts, sizes, colors
and list properties are in style.css file]]>

+ //
+ //
+ public class FlashXml : SubtitleFormat + { + public override string Extension => ".xml"; + + public override string Name => "Flash Xml"; + + public override bool IsMine(List lines, string fileName) + { + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + string xmlAsString = sb.ToString().Trim(); + if ((xmlAsString.Contains("") || xmlAsString.Contains(""))) + { + var xml = new XmlDocument { XmlResolver = null }; + try + { + xml.LoadXml(xmlAsString); + var paragraphs = xml.DocumentElement.SelectNodes("div/p"); + return paragraphs != null && paragraphs.Count > 0 && xml.DocumentElement.Name == "tt"; + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine(ex.Message); + } + } + return false; + } + + private static string ConvertToTimeString(TimeCode time) + { + return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}.{time.Milliseconds:00}"; + } + + public override string ToText(Subtitle subtitle, string title) + { + string xmlStructure = + "" + Environment.NewLine + + "" + Environment.NewLine + + "
" + Environment.NewLine + + "
" + Environment.NewLine + + "
"; + + var xml = new XmlDocument(); + xml.LoadXml(xmlStructure); + XmlNode div = xml.DocumentElement.SelectSingleNode("div"); + foreach (Paragraph p in subtitle.Paragraphs) + { + XmlNode paragraph = xml.CreateElement("p"); + string text = HtmlUtil.RemoveHtmlTags(p.Text, true); + + paragraph.InnerText = text; + paragraph.InnerXml = "" + paragraph.InnerXml.Replace(Environment.NewLine, "
") + "]]>"; + + XmlAttribute start = xml.CreateAttribute("begin"); + start.InnerText = ConvertToTimeString(p.StartTime); + paragraph.Attributes.Append(start); + + XmlAttribute end = xml.CreateAttribute("end"); + end.InnerText = ConvertToTimeString(p.EndTime); + paragraph.Attributes.Append(end); + + div.AppendChild(paragraph); + } + + return ToUtf8XmlString(xml); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + double startSeconds = 0; + + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + var xml = new XmlDocument { XmlResolver = null }; + xml.LoadXml(sb.ToString().Trim()); + + var pText = new StringBuilder(); + foreach (XmlNode node in xml.DocumentElement.SelectNodes("div/p")) + { + try + { + foreach (XmlNode innerNode in node.ChildNodes) + { + if (innerNode.Name == "br") + { + pText.AppendLine(); + } + else + { + pText.Append(innerNode.InnerText.Trim()); + } + } + + var start = string.Empty; + if (node.Attributes["begin"] != null) + { + start = node.Attributes["begin"].InnerText; + } + + var end = string.Empty; + if (node.Attributes["end"] != null) + { + end = node.Attributes["end"].InnerText; + } + + var dur = string.Empty; + if (node.Attributes["dur"] != null) + { + dur = node.Attributes["dur"].InnerText; + } + + TimeCode startCode = TimeCode.FromSeconds(startSeconds); + if (start.Length > 0) + { + startCode = GetTimeCode(start); + } + + TimeCode endCode; + if (end.Length > 0) + { + endCode = GetTimeCode(end); + } + else if (dur.Length > 0) + { + endCode = new TimeCode(GetTimeCode(dur).TotalMilliseconds + startCode.TotalMilliseconds); + } + else + { + endCode = new TimeCode(startCode.TotalMilliseconds + 3000); + } + startSeconds = endCode.TotalSeconds; + + subtitle.Paragraphs.Add(new Paragraph(startCode, endCode, pText.ToString().Replace("", string.Empty).Replace("", string.Empty))); + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine(ex.Message); + _errorCount++; + } + pText.Clear(); + } + subtitle.Renumber(); + } + + private static TimeCode GetTimeCode(string s) + { + if (s.EndsWith('s')) + { + s = s.TrimEnd('s'); + return TimeCode.FromSeconds(double.Parse(s)); + } + var parts = s.Split(new[] { ':', '.', ',' }); + return new TimeCode(int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2]), int.Parse(parts[3])); + } + + } +} diff --git a/libse/SubtitleFormats/Footage.cs b/src/libse/SubtitleFormats/Footage.cs similarity index 97% rename from libse/SubtitleFormats/Footage.cs rename to src/libse/SubtitleFormats/Footage.cs index a9ca7167a..3cf651803 100644 --- a/libse/SubtitleFormats/Footage.cs +++ b/src/libse/SubtitleFormats/Footage.cs @@ -1,170 +1,170 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class Footage : SubtitleFormat - { - private static readonly Regex RegexTimeCode = new Regex(@"^\s*\d+,\d\d$", RegexOptions.Compiled); - - private enum ExpectingLine - { - Number, - TimeStart, - TimeEnd, - Text - } - - public override string Extension => ".txt"; - - public override string Name => "Footage"; - - public override bool IsMine(List lines, string fileName) - { - var asc = new TimeLineFootageAscii(); - if (fileName != null && asc.IsMine(null, fileName)) - { - return false; - } - - return base.IsMine(lines, fileName); - } - - public override string ToText(Subtitle subtitle, string title) - { - //1. - // 66,13 - // 70,00 - //#Tā nu es sapazinos - //#И так я познакомился - - //2. - // 71,14 - // 78,10 - //#ar dakteri Henriju Gūsu. - //#с доктором Генри Гусом. - - const string paragraphWriteFormat = "{4}.{3}{0}{3}{1}{3}{2}{3}"; - var sb = new StringBuilder(); - int count = 0; - foreach (Paragraph p in subtitle.Paragraphs) - { - count++; - string text = HtmlUtil.RemoveHtmlTags(p.Text); - if (p.Text.StartsWith("", StringComparison.Ordinal) && p.Text.EndsWith("", StringComparison.Ordinal)) - { - text = "#" + text; - } - - sb.AppendLine(string.Format(paragraphWriteFormat, EncodeTimeCode(p.StartTime), EncodeTimeCode(p.EndTime), text, Environment.NewLine, count)); - } - return sb.ToString().Trim(); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - Paragraph paragraph = null; - ExpectingLine expecting = ExpectingLine.Number; - _errorCount = 0; - - subtitle.Paragraphs.Clear(); - char[] splitChar = { ',' }; - foreach (string line in lines) - { - if (line.EndsWith('.') && Utilities.IsInteger(line.TrimEnd('.'))) - { - if (!string.IsNullOrEmpty(paragraph?.Text)) - { - subtitle.Paragraphs.Add(paragraph); - } - - paragraph = new Paragraph(); - expecting = ExpectingLine.TimeStart; - } - else if (paragraph != null && expecting == ExpectingLine.TimeStart && RegexTimeCode.IsMatch(line)) - { - string[] parts = line.Split(splitChar, StringSplitOptions.RemoveEmptyEntries); - if (parts.Length == 2) - { - try - { - var tc = DecodeTimeCode(parts); - paragraph.StartTime = tc; - expecting = ExpectingLine.TimeEnd; - } - catch - { - _errorCount++; - expecting = ExpectingLine.Number; - } - } - } - else if (paragraph != null && expecting == ExpectingLine.TimeEnd && RegexTimeCode.IsMatch(line)) - { - string[] parts = line.Split(splitChar, StringSplitOptions.RemoveEmptyEntries); - if (parts.Length == 2) - { - try - { - var tc = DecodeTimeCode(parts); - paragraph.EndTime = tc; - expecting = ExpectingLine.Text; - } - catch - { - _errorCount++; - expecting = ExpectingLine.Number; - } - } - } - else - { - if (paragraph != null && expecting == ExpectingLine.Text) - { - if (line.Length > 0) - { - string s = line.Trim(); - if (s.StartsWith('#')) - { - s = "" + s.Remove(0, 1) + ""; - } - - paragraph.Text = (paragraph.Text + Environment.NewLine + s).Trim(); - paragraph.Text = paragraph.Text.Replace("
" + Environment.NewLine + "", Environment.NewLine); - if (paragraph.Text.Length > 2000) - { - _errorCount += 100; - return; - } - } - } - } - } - if (paragraph != null && !string.IsNullOrEmpty(paragraph.Text)) - { - subtitle.Paragraphs.Add(paragraph); - } - - subtitle.Renumber(); - } - - private static string EncodeTimeCode(TimeCode time) - { - int frames = MillisecondsToFrames(time.TotalMilliseconds); - int footage = frames / 16; - int rest = (int)Math.Round(frames % 16.0 / 16.0 * 24.0); - return $"{footage:00},{rest:00}".PadLeft(8); - } - - private static TimeCode DecodeTimeCode(string[] parts) - { - int frames16 = int.Parse(parts[0]); - int frames = int.Parse(parts[1]); - return new TimeCode(FramesToMilliseconds(16 * frames16 + (frames * 16.0 / 24.0))); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class Footage : SubtitleFormat + { + private static readonly Regex RegexTimeCode = new Regex(@"^\s*\d+,\d\d$", RegexOptions.Compiled); + + private enum ExpectingLine + { + Number, + TimeStart, + TimeEnd, + Text + } + + public override string Extension => ".txt"; + + public override string Name => "Footage"; + + public override bool IsMine(List lines, string fileName) + { + var asc = new TimeLineFootageAscii(); + if (fileName != null && asc.IsMine(null, fileName)) + { + return false; + } + + return base.IsMine(lines, fileName); + } + + public override string ToText(Subtitle subtitle, string title) + { + //1. + // 66,13 + // 70,00 + //#Tā nu es sapazinos + //#И так я познакомился + + //2. + // 71,14 + // 78,10 + //#ar dakteri Henriju Gūsu. + //#с доктором Генри Гусом. + + const string paragraphWriteFormat = "{4}.{3}{0}{3}{1}{3}{2}{3}"; + var sb = new StringBuilder(); + int count = 0; + foreach (Paragraph p in subtitle.Paragraphs) + { + count++; + string text = HtmlUtil.RemoveHtmlTags(p.Text); + if (p.Text.StartsWith("", StringComparison.Ordinal) && p.Text.EndsWith("", StringComparison.Ordinal)) + { + text = "#" + text; + } + + sb.AppendLine(string.Format(paragraphWriteFormat, EncodeTimeCode(p.StartTime), EncodeTimeCode(p.EndTime), text, Environment.NewLine, count)); + } + return sb.ToString().Trim(); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + Paragraph paragraph = null; + ExpectingLine expecting = ExpectingLine.Number; + _errorCount = 0; + + subtitle.Paragraphs.Clear(); + char[] splitChar = { ',' }; + foreach (string line in lines) + { + if (line.EndsWith('.') && Utilities.IsInteger(line.TrimEnd('.'))) + { + if (!string.IsNullOrEmpty(paragraph?.Text)) + { + subtitle.Paragraphs.Add(paragraph); + } + + paragraph = new Paragraph(); + expecting = ExpectingLine.TimeStart; + } + else if (paragraph != null && expecting == ExpectingLine.TimeStart && RegexTimeCode.IsMatch(line)) + { + string[] parts = line.Split(splitChar, StringSplitOptions.RemoveEmptyEntries); + if (parts.Length == 2) + { + try + { + var tc = DecodeTimeCode(parts); + paragraph.StartTime = tc; + expecting = ExpectingLine.TimeEnd; + } + catch + { + _errorCount++; + expecting = ExpectingLine.Number; + } + } + } + else if (paragraph != null && expecting == ExpectingLine.TimeEnd && RegexTimeCode.IsMatch(line)) + { + string[] parts = line.Split(splitChar, StringSplitOptions.RemoveEmptyEntries); + if (parts.Length == 2) + { + try + { + var tc = DecodeTimeCode(parts); + paragraph.EndTime = tc; + expecting = ExpectingLine.Text; + } + catch + { + _errorCount++; + expecting = ExpectingLine.Number; + } + } + } + else + { + if (paragraph != null && expecting == ExpectingLine.Text) + { + if (line.Length > 0) + { + string s = line.Trim(); + if (s.StartsWith('#')) + { + s = "" + s.Remove(0, 1) + ""; + } + + paragraph.Text = (paragraph.Text + Environment.NewLine + s).Trim(); + paragraph.Text = paragraph.Text.Replace("" + Environment.NewLine + "", Environment.NewLine); + if (paragraph.Text.Length > 2000) + { + _errorCount += 100; + return; + } + } + } + } + } + if (paragraph != null && !string.IsNullOrEmpty(paragraph.Text)) + { + subtitle.Paragraphs.Add(paragraph); + } + + subtitle.Renumber(); + } + + private static string EncodeTimeCode(TimeCode time) + { + int frames = MillisecondsToFrames(time.TotalMilliseconds); + int footage = frames / 16; + int rest = (int)Math.Round(frames % 16.0 / 16.0 * 24.0); + return $"{footage:00},{rest:00}".PadLeft(8); + } + + private static TimeCode DecodeTimeCode(string[] parts) + { + int frames16 = int.Parse(parts[0]); + int frames = int.Parse(parts[1]); + return new TimeCode(FramesToMilliseconds(16 * frames16 + (frames * 16.0 / 24.0))); + } + + } +} diff --git a/libse/SubtitleFormats/GooglePlayJson.cs b/src/libse/SubtitleFormats/GooglePlayJson.cs similarity index 100% rename from libse/SubtitleFormats/GooglePlayJson.cs rename to src/libse/SubtitleFormats/GooglePlayJson.cs diff --git a/libse/SubtitleFormats/GpacTtxt.cs b/src/libse/SubtitleFormats/GpacTtxt.cs similarity index 97% rename from libse/SubtitleFormats/GpacTtxt.cs rename to src/libse/SubtitleFormats/GpacTtxt.cs index 65da69587..3e3dd2b9f 100644 --- a/libse/SubtitleFormats/GpacTtxt.cs +++ b/src/libse/SubtitleFormats/GpacTtxt.cs @@ -1,120 +1,120 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class GpacTtxt : SubtitleFormat - { - public override string Extension => ".ttxt"; - - public override string Name => "GPAC TTXT"; - - public override string ToText(Subtitle subtitle, string title) - { - string xmlStructure = - "" + Environment.NewLine + - "" + Environment.NewLine + - "" + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - ""; - - string xmlTrackStructure = - "" + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " 00:03:57:16" + Environment.NewLine + - ""; - - var xml = new XmlDocument { XmlResolver = null }; - xml.LoadXml(xmlStructure); - // TODO: Set variables... - XmlNode trackNode = xml.DocumentElement.SelectSingleNode("TrackList/Track/StItemList"); - - int number = 1; - foreach (Paragraph p in subtitle.Paragraphs) - { - // starttime + text - XmlNode stItem = xml.CreateElement("StItem"); - stItem.InnerXml = xmlTrackStructure; - - XmlAttribute memo = xml.CreateAttribute("Memo"); - memo.InnerText = string.Empty; - stItem.Attributes.Append(memo); - - XmlAttribute tc = xml.CreateAttribute("TC"); - tc.InnerText = ((int)Math.Round(p.StartTime.TotalMilliseconds)).ToString(); - stItem.Attributes.Append(tc); - - XmlAttribute row = xml.CreateAttribute("Row"); - row.InnerText = number.ToString(); - stItem.Attributes.Append(row); - - XmlNodeList list = stItem.SelectNodes("StTextList/StText"); - list[0].InnerText = p.Text; - list[2].InnerText = p.StartTime.ToHHMMSSFF(); - trackNode.AppendChild(stItem); - number++; - - // endtime - stItem = xml.CreateElement("StItem"); - stItem.InnerXml = xmlTrackStructure; - - memo = xml.CreateAttribute("Memo"); - memo.InnerText = string.Empty; - stItem.Attributes.Append(memo); - - tc = xml.CreateAttribute("TC"); - tc.InnerText = ((int)Math.Round(p.EndTime.TotalMilliseconds)).ToString(); - stItem.Attributes.Append(tc); - - row = xml.CreateAttribute("Row"); - row.InnerText = number.ToString(); - stItem.Attributes.Append(row); - - list = stItem.SelectNodes("StTextList/StText"); - list[0].InnerText = string.Empty; - list[2].InnerText = p.EndTime.ToString(); - trackNode.AppendChild(stItem); - number++; - } - - return ToUtf8XmlString(xml); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - if (!sb.ToString().Contains(" 1) - { - text = (list[0].InnerText + Environment.NewLine + list[1].InnerText).Trim(); - } - else if (list.Count == 1) - { - text = list[0].InnerText.Trim(); - } - - p.Text = text; - subtitle.Paragraphs.Add(p); - } - catch - { - _errorCount++; - } - } - subtitle.Renumber(); - } - catch - { - _errorCount = 1; - return; - } - - int i = 0; - foreach (Paragraph p in subtitle.Paragraphs) - { - i++; - var next = subtitle.GetParagraphOrDefault(i); - if (next != null) - { - p.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds; - } - } - subtitle.RemoveEmptyLines(); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class IssXml : SubtitleFormat + { + private static readonly Regex RegexTimeCodes = new Regex(@"^\d\d:\d\d:\d\d:\d\d$", RegexOptions.Compiled); //00:02:56:02 + + public override string Extension => ".ats"; + + public override string Name => "ATS ISS"; + + public override string ToText(Subtitle subtitle, string title) + { + string xmlStructure = + "" + Environment.NewLine + + "" + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + ""; + + string xmlTrackStructure = + "" + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " 00:03:57:16" + Environment.NewLine + + ""; + + var xml = new XmlDocument { XmlResolver = null }; + xml.LoadXml(xmlStructure); + // TODO: Set variables... + XmlNode trackNode = xml.DocumentElement.SelectSingleNode("TrackList/Track/StItemList"); + + int number = 1; + foreach (Paragraph p in subtitle.Paragraphs) + { + // starttime + text + XmlNode stItem = xml.CreateElement("StItem"); + stItem.InnerXml = xmlTrackStructure; + + XmlAttribute memo = xml.CreateAttribute("Memo"); + memo.InnerText = string.Empty; + stItem.Attributes.Append(memo); + + XmlAttribute tc = xml.CreateAttribute("TC"); + tc.InnerText = ((int)Math.Round(p.StartTime.TotalMilliseconds)).ToString(); + stItem.Attributes.Append(tc); + + XmlAttribute row = xml.CreateAttribute("Row"); + row.InnerText = number.ToString(); + stItem.Attributes.Append(row); + + XmlNodeList list = stItem.SelectNodes("StTextList/StText"); + list[0].InnerText = p.Text; + list[2].InnerText = p.StartTime.ToHHMMSSFF(); + trackNode.AppendChild(stItem); + number++; + + // endtime + stItem = xml.CreateElement("StItem"); + stItem.InnerXml = xmlTrackStructure; + + memo = xml.CreateAttribute("Memo"); + memo.InnerText = string.Empty; + stItem.Attributes.Append(memo); + + tc = xml.CreateAttribute("TC"); + tc.InnerText = ((int)Math.Round(p.EndTime.TotalMilliseconds)).ToString(); + stItem.Attributes.Append(tc); + + row = xml.CreateAttribute("Row"); + row.InnerText = number.ToString(); + stItem.Attributes.Append(row); + + list = stItem.SelectNodes("StTextList/StText"); + list[0].InnerText = string.Empty; + list[2].InnerText = p.EndTime.ToString(); + trackNode.AppendChild(stItem); + number++; + } + + return ToUtf8XmlString(xml); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + if (!sb.ToString().Contains(" 1) + { + text = (list[0].InnerText + Environment.NewLine + list[1].InnerText).Trim(); + } + else if (list.Count == 1) + { + text = list[0].InnerText.Trim(); + } + + p.Text = text; + subtitle.Paragraphs.Add(p); + } + catch + { + _errorCount++; + } + } + subtitle.Renumber(); + } + catch + { + _errorCount = 1; + return; + } + + int i = 0; + foreach (Paragraph p in subtitle.Paragraphs) + { + i++; + var next = subtitle.GetParagraphOrDefault(i); + if (next != null) + { + p.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds; + } + } + subtitle.RemoveEmptyLines(); + } + + } +} diff --git a/libse/SubtitleFormats/ItunesTimedText.cs b/src/libse/SubtitleFormats/ItunesTimedText.cs similarity index 97% rename from libse/SubtitleFormats/ItunesTimedText.cs rename to src/libse/SubtitleFormats/ItunesTimedText.cs index 020307e21..3496ad4bc 100644 --- a/libse/SubtitleFormats/ItunesTimedText.cs +++ b/src/libse/SubtitleFormats/ItunesTimedText.cs @@ -1,377 +1,377 @@ -using System; -using System.Collections.Generic; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - /// - /// Crappy format... should always be saved as UTF-8 without BOM (hacked Main.cs) and
tags should be oldstyle
- ///
- public class ItunesTimedText : TimedText10 - { - public override string Extension => ".itt"; - - public new const string NameOfFormat = "iTunes Timed Text"; - - public override string Name => NameOfFormat; - - public override bool IsMine(List lines, string fileName) - { - if (fileName != null && !fileName.EndsWith(Extension, StringComparison.OrdinalIgnoreCase)) - { - return false; - } - - if (new NetflixTimedText().IsMine(lines, fileName)) - { - return false; - } - - return base.IsMine(lines, fileName); - } - - public override string ToText(Subtitle subtitle, string title) - { - XmlNode styleHead = null; - bool convertedFromSubStationAlpha = false; - if (subtitle.Header != null) - { - try - { - var x = new XmlDocument(); - x.LoadXml(subtitle.Header); - var xnsmgr = new XmlNamespaceManager(x.NameTable); - xnsmgr.AddNamespace("ttml", "http://www.w3.org/ns/ttml"); - styleHead = x.DocumentElement.SelectSingleNode("ttml:head", xnsmgr); - } - catch - { - styleHead = null; - } - if (styleHead == null && (subtitle.Header.Contains("[V4+ Styles]") || subtitle.Header.Contains("[V4 Styles]"))) - { - var x = new XmlDocument(); - x.LoadXml(new ItunesTimedText().ToText(new Subtitle(), "tt")); // load default xml - var xnsmgr = new XmlNamespaceManager(x.NameTable); - xnsmgr.AddNamespace("ttml", "http://www.w3.org/ns/ttml"); - styleHead = x.DocumentElement.SelectSingleNode("ttml:head", xnsmgr); - styleHead.SelectSingleNode("ttml:styling", xnsmgr).RemoveAll(); - foreach (string styleName in AdvancedSubStationAlpha.GetStylesFromHeader(subtitle.Header)) - { - try - { - var ssaStyle = AdvancedSubStationAlpha.GetSsaStyle(styleName, subtitle.Header); - - string fontStyle = "normal"; - if (ssaStyle.Italic) - { - fontStyle = "italic"; - } - - string fontWeight = "normal"; - if (ssaStyle.Bold) - { - fontWeight = "bold"; - } - - AddStyleToXml(x, styleHead, xnsmgr, ssaStyle.Name, ssaStyle.FontName, fontWeight, fontStyle, Utilities.ColorToHex(ssaStyle.Primary), ssaStyle.FontSize.ToString()); - convertedFromSubStationAlpha = true; - - } - catch - { - // ignored - } - } - subtitle.Header = x.OuterXml; // save new xml with styles in header - } - } - - var xml = new XmlDocument { XmlResolver = null }; - var nsmgr = new XmlNamespaceManager(xml.NameTable); - nsmgr.AddNamespace("ttml", "http://www.w3.org/ns/ttml"); - nsmgr.AddNamespace("ttp", "http://www.w3.org/ns/10/ttml#parameter"); - nsmgr.AddNamespace("tts", "http://www.w3.org/ns/ttml#styling"); - nsmgr.AddNamespace("ttm", "http://www.w3.org/ns/10/ttml#metadata"); - - string frameRate = ((int)Math.Round(Configuration.Settings.General.CurrentFrameRate)).ToString(); - string frameRateMultiplier = "999 1000"; - if (Configuration.Settings.General.CurrentFrameRate % 1.0 < 0.01) - { - frameRateMultiplier = "1 1"; - } - string dropMode = "nonDrop"; - if (Math.Abs(Configuration.Settings.General.CurrentFrameRate - 29.97) < 0.01) - { - dropMode = "dropNTSC"; - } - - const string language = "en-US"; - string xmlStructure = "" + Environment.NewLine + - "" + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " - - -<-- Open play menu, choose Captions and Subtiles, On if available --> -<-- Open tools menu, Security, Show local captions when present -->"; - - bool useExtra = false; - if (!string.IsNullOrEmpty(subtitle.Header) && subtitle.Header.StartsWith(" - -_TITLE_ - - Metrics {time:ms;} - Spec {MSFT:1.0;} - -" + subtitle.Header.Trim() + @" - - -<-- Open play menu, choose Captions and Subtiles, On if available --> -<-- Open tools menu, Security, Show local captions when present -->"; - } - - // Example text (start numbers are milliseconds) - //

Let's go! - //


- - string paragraphWriteFormat = @"

{2}" + Environment.NewLine + - @"

 "; - string paragraphWriteFormatOpen = @"

{1}"; - if (Name == new SamiModern().Name) - { - paragraphWriteFormat = "

{2}

" + Environment.NewLine + - "

 

"; - paragraphWriteFormatOpen = "

{1}

"; - } - else if (Name == new SamiYouTube().Name) - { - paragraphWriteFormat = "

{2}

" + Environment.NewLine + - "

"; - paragraphWriteFormatOpen = "

{1}

"; - } - - int count = 1; - var sb = new StringBuilder(); - sb.AppendLine(header.Replace("_TITLE_", title).Replace("_LANGUAGE-STYLE_", languageStyle)); - var totalLine = new StringBuilder(); - var partialLine = new StringBuilder(); - foreach (Paragraph p in subtitle.Paragraphs) - { - Paragraph next = subtitle.GetParagraphOrDefault(count); - string text = p.Text; - - if (text.Contains('<') && text.Contains('>')) - { - bool tagOn = false; - for (int i = 0; i < text.Length; i++) - { - string t = text.Substring(i); - if (t.StartsWith('<') && - (t.StartsWith("') && tagOn) - { - tagOn = false; - totalLine.Append('>'); - } - else if (!tagOn) - { - partialLine.Append(text[i]); - } - else - { - totalLine.Append(text[i]); - } - } - - totalLine.Append(EncodeText(partialLine.ToString())); - text = totalLine.ToString(); - totalLine.Clear(); - partialLine.Clear(); - } - else - { - text = EncodeText(text); - } - - if (Name == new SamiModern().Name) - { - text = text.Replace(Environment.NewLine, "
"); - } - else - { - text = text.Replace(Environment.NewLine, "
"); - } - - string currentClass = languageTag; - if (useExtra && !string.IsNullOrEmpty(p.Extra)) - { - currentClass = p.Extra; - } - - var startMs = (long)(Math.Round(p.StartTime.TotalMilliseconds)); - var endMs = (long)(Math.Round(p.EndTime.TotalMilliseconds)); - if (next != null && Math.Abs(((long)Math.Round(next.StartTime.TotalMilliseconds)) - endMs) < 1) - { - sb.AppendLine(string.Format(paragraphWriteFormatOpen, startMs, text, currentClass)); - } - else - { - sb.AppendLine(string.Format(paragraphWriteFormat, startMs, endMs, text, currentClass)); - } - - count++; - } - sb.AppendLine(""); - sb.AppendLine(""); - return sb.ToString().Trim(); - } - - private static string EncodeText(string text) - { - switch (Configuration.Settings.SubtitleSettings.SamiHtmlEncodeMode) - { - case 1: - return WebUtility.HtmlEncode(text); - case 2: - return HtmlUtil.EncodeNamed(text); - case 3: - return HtmlUtil.EncodeNumeric(text); - } - return text; - } - - public static List GetStylesFromHeader(string header) - { - var list = new List(); - if (!string.IsNullOrEmpty(header) && header.StartsWith(" 2) - { - string name = s.Substring(1, s.IndexOf(' ') - 1); - list.Add(name); - } - } - } - else - { - list.Add("ENUSCC"); - } - return list; - } - - public static List GetStylesFromSubtitle(Subtitle subtitle) - { - string language = LanguageAutoDetect.AutoDetectGoogleLanguage(subtitle); - var ci = CultureInfo.GetCultureInfo(language); - language = CultureInfo.CreateSpecificCulture(ci.Name).Name; - string languageTag = $"{language.Replace("-", string.Empty).ToUpperInvariant()}CC"; - return new List { languageTag }; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - var sb = new StringBuilder(); - foreach (string l in lines) - { - sb.AppendLine(l.Replace(" 0) - { - int styleEnd = allInputLower.IndexOf("", StringComparison.Ordinal); - if (styleEnd > 0) - { - subtitle.Header = allInput.Substring(styleStart, styleEnd - styleStart + 8); - } - } - - const string syncTag = "= 0) - { - string millisecondsAsString = string.Empty; - while (index < allInput.Length && expectedChars.Contains(allInput[index])) - { - if (allInput[index] != '"' && allInput[index] != '\'') - { - millisecondsAsString += allInput[index]; - } - - index++; - } - - while (index < allInput.Length && allInput[index] != '>') - { - index++; - } - - if (index < allInput.Length && allInput[index] == '>') - { - index++; - } - - int syncEndPos = allInputLower.IndexOf(syncTag, index, StringComparison.Ordinal); - if (hasEncryptedTags) - { - int syncEndPosEnc = allInputLower.IndexOf(syncTagEnc, index, StringComparison.Ordinal); - if (syncStartPosEnc >= 0 && syncStartPosEnc < syncStartPos || syncEndPos == -1) - { - syncEndPos = syncEndPosEnc; - } - } - - string text; - if (syncEndPos >= 0) - { - text = allInput.Substring(index, syncEndPos - index); - } - else - { - text = allInput.Substring(index); - } - - string textToLower = text.ToLowerInvariant(); - if (textToLower.Contains(" class=")) - { - var className = new StringBuilder(); - int startClass = textToLower.IndexOf(" class=", StringComparison.Ordinal); - int indexClass = startClass + 7; - while (indexClass < textToLower.Length && (Utilities.LowercaseLettersWithNumbers + @"'""").Contains(textToLower[indexClass])) - { - className.Append(text[indexClass]); - indexClass++; - } - p.Extra = className.ToString().Trim(' ', '\'', '"'); - } - - if (text.Contains("ID=\"Source\"") || text.Contains("ID=Source")) - { - int sourceIndex = text.IndexOf("ID=\"Source\"", StringComparison.Ordinal); - if (sourceIndex < 0) - { - sourceIndex = text.IndexOf("ID=Source", StringComparison.Ordinal); - } - - int st = sourceIndex - 1; - while (st > 0 && text.Substring(st, 2).ToUpperInvariant() != " 0) - { - text = text.Substring(0, st) + text.Substring(sourceIndex); - } - int et = st; - while (et < text.Length - 5 && text.Substring(et, 3).ToUpperInvariant() != "

" && text.Substring(et, 4).ToUpperInvariant() != "

") - { - et++; - } - text = text.Substring(0, st) + text.Substring(et); - } - text = text.Replace(Environment.NewLine, " "); - text = text.Replace(" ", " "); - - text = text.TrimEnd(); - text = Regex.Replace(text, @"
", Environment.NewLine, RegexOptions.IgnoreCase); - - while (text.Contains(" ")) - { - text = text.Replace(" ", " "); - } - - text = text.Replace("", string.Empty).Replace("", string.Empty).TrimEnd(); - text = text.Replace("", string.Empty).Replace("", string.Empty).TrimEnd(); - - int endSyncPos = text.ToUpperInvariant().IndexOf("
", StringComparison.OrdinalIgnoreCase); - if (text.IndexOf('>') > 0 && (text.IndexOf('>') < endSyncPos || endSyncPos == -1)) - { - text = text.Remove(0, text.IndexOf('>') + 1); - } - - text = text.TrimEnd(); - - if (text.EndsWith("
", StringComparison.OrdinalIgnoreCase)) - { - text = text.Substring(0, text.Length - 7).TrimEnd(); - } - - if (text.EndsWith("

", StringComparison.Ordinal) || text.EndsWith("

", StringComparison.OrdinalIgnoreCase)) - { - text = text.Substring(0, text.Length - 4).TrimEnd(); - } - - text = RemoveDiv(text).Trim(); - text = text.Replace(" ", " ").Replace("&NBSP;", " "); - text = text.Replace("

", string.Empty).Replace("", string.Empty).Replace("", string.Empty); - if (string.IsNullOrWhiteSpace(text)) - { - text = string.Empty; - } - - if (text.Contains("")) - { - text += ""; - } - - if (text.StartsWith("") && !text.Contains("")) - { - text += "
"; - } - - if (text.Contains('<') && text.Contains('>')) - { - var total = new StringBuilder(); - var partial = new StringBuilder(); - bool tagOn = false; - for (int i = 0; i < text.Length && i < 999; i++) - { - string tmp = text.Substring(i); - if (tmp.StartsWith('<') && - (tmp.StartsWith("') && tagOn) - { - tagOn = false; - total.Append('>'); - } - else if (!tagOn) - { - partial.Append(text[i]); - } - else - { - total.Append(text[i]); - } - } - total.Append(WebUtility.HtmlDecode(partial.ToString())); - text = total.ToString(); - } - else - { - text = WebUtility.HtmlDecode(text); - } - - var cleanText = text.FixExtraSpaces(); - cleanText = cleanText.Trim(); - - if (!string.IsNullOrEmpty(p.Text) && !string.IsNullOrEmpty(millisecondsAsString)) - { - p.EndTime = new TimeCode(long.Parse(millisecondsAsString)); - subtitle.Paragraphs.Add(p); - p = new Paragraph(); - } - - p.Text = cleanText; - long l; - if (long.TryParse(millisecondsAsString, out l)) - { - p.StartTime = new TimeCode(l); - } - - if (syncEndPos <= 0) - { - syncStartPos = -1; - } - else - { - syncStartPos = allInputLower.IndexOf(syncTag, syncEndPos, StringComparison.Ordinal); - index = syncStartPos + syncTag.Length; - - if (hasEncryptedTags) - { - syncStartPosEnc = allInputLower.IndexOf(syncTagEnc, syncEndPos, StringComparison.Ordinal); - if (syncStartPosEnc >= 0 && syncStartPosEnc < syncStartPos || syncStartPos == -1) - { - syncStartPos = syncStartPosEnc; - index = syncStartPosEnc + syncTagEnc.Length; - } - } - } - } - if (!string.IsNullOrEmpty(p.Text) && !subtitle.Paragraphs.Contains(p)) - { - p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(p.Text); - subtitle.Paragraphs.Add(p); - } - subtitle.Renumber(); - - if (subtitle.Paragraphs.Count > 0 && - (subtitle.Paragraphs[subtitle.Paragraphs.Count - 1].Text.ToUpperInvariant().Trim() == "" || - subtitle.Paragraphs[subtitle.Paragraphs.Count - 1].Text.ToUpperInvariant().Trim() == "")) - { - subtitle.Paragraphs.RemoveAt(subtitle.Paragraphs.Count - 1); - } - - foreach (Paragraph p2 in subtitle.Paragraphs) - { - p2.Text = p2.Text.Replace('\u00A0', ' '); // non-breaking space to normal space - } - } - - private string RemoveDiv(string text) - { - int indexOfDiv = text.IndexOf("
", StringComparison.Ordinal); - } - - int maxLoop = 10; - while (indexOfDiv > 0 && maxLoop >= 0) - { - int indexOfStartEnd = text.IndexOf(">", indexOfDiv + 1, StringComparison.Ordinal); - if (indexOfStartEnd > 0) - { - text = text.Remove(indexOfDiv, indexOfStartEnd - indexOfDiv + 1); - text = text.Replace("
", string.Empty); - - indexOfDiv = text.IndexOf("
", StringComparison.Ordinal); - } - } - maxLoop--; - } - return text; - } - - public override bool HasStyleSupport => true; - } -} +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Net; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class Sami : SubtitleFormat + { + public override string Extension => ".smi"; + + public override string Name => "SAMI"; + + public override bool IsMine(List lines, string fileName) + { + var sb = new StringBuilder(); + foreach (string l in lines) + { + sb.AppendLine(l); + } + + if (Name == "SAMI" && sb.ToString().Contains("")) + { + return false; + } + + return base.IsMine(lines, fileName); + } + + public override string ToText(Subtitle subtitle, string title) + { + var language = LanguageAutoDetect.AutoDetectGoogleLanguage(subtitle); + var ci = CultureInfo.GetCultureInfo(language); + language = CultureInfo.CreateSpecificCulture(ci.Name).Name; + string languageTag = $"{language.Replace("-", string.Empty).ToUpperInvariant()}CC"; + string languageName = ci.EnglishName; + string languageStyle = $".{languageTag} [ name: {languageName}; lang: {language.Replace("_", "-")} ; SAMIType: CC ; ]"; + languageStyle = languageStyle.Replace("[", "{").Replace("]", "}"); + + string header = +@" + +_TITLE_ + + Metrics {time:ms;} + Spec {MSFT:1.0;} + + + + +<-- Open play menu, choose Captions and Subtiles, On if available --> +<-- Open tools menu, Security, Show local captions when present -->"; + + bool useExtra = false; + if (!string.IsNullOrEmpty(subtitle.Header) && subtitle.Header.StartsWith(" + +_TITLE_ + + Metrics {time:ms;} + Spec {MSFT:1.0;} + +" + subtitle.Header.Trim() + @" + + +<-- Open play menu, choose Captions and Subtiles, On if available --> +<-- Open tools menu, Security, Show local captions when present -->"; + } + + // Example text (start numbers are milliseconds) + //

Let's go! + //


+ + string paragraphWriteFormat = @"

{2}" + Environment.NewLine + + @"

 "; + string paragraphWriteFormatOpen = @"

{1}"; + if (Name == new SamiModern().Name) + { + paragraphWriteFormat = "

{2}

" + Environment.NewLine + + "

 

"; + paragraphWriteFormatOpen = "

{1}

"; + } + else if (Name == new SamiYouTube().Name) + { + paragraphWriteFormat = "

{2}

" + Environment.NewLine + + "

"; + paragraphWriteFormatOpen = "

{1}

"; + } + + int count = 1; + var sb = new StringBuilder(); + sb.AppendLine(header.Replace("_TITLE_", title).Replace("_LANGUAGE-STYLE_", languageStyle)); + var totalLine = new StringBuilder(); + var partialLine = new StringBuilder(); + foreach (Paragraph p in subtitle.Paragraphs) + { + Paragraph next = subtitle.GetParagraphOrDefault(count); + string text = p.Text; + + if (text.Contains('<') && text.Contains('>')) + { + bool tagOn = false; + for (int i = 0; i < text.Length; i++) + { + string t = text.Substring(i); + if (t.StartsWith('<') && + (t.StartsWith("') && tagOn) + { + tagOn = false; + totalLine.Append('>'); + } + else if (!tagOn) + { + partialLine.Append(text[i]); + } + else + { + totalLine.Append(text[i]); + } + } + + totalLine.Append(EncodeText(partialLine.ToString())); + text = totalLine.ToString(); + totalLine.Clear(); + partialLine.Clear(); + } + else + { + text = EncodeText(text); + } + + if (Name == new SamiModern().Name) + { + text = text.Replace(Environment.NewLine, "
"); + } + else + { + text = text.Replace(Environment.NewLine, "
"); + } + + string currentClass = languageTag; + if (useExtra && !string.IsNullOrEmpty(p.Extra)) + { + currentClass = p.Extra; + } + + var startMs = (long)(Math.Round(p.StartTime.TotalMilliseconds)); + var endMs = (long)(Math.Round(p.EndTime.TotalMilliseconds)); + if (next != null && Math.Abs(((long)Math.Round(next.StartTime.TotalMilliseconds)) - endMs) < 1) + { + sb.AppendLine(string.Format(paragraphWriteFormatOpen, startMs, text, currentClass)); + } + else + { + sb.AppendLine(string.Format(paragraphWriteFormat, startMs, endMs, text, currentClass)); + } + + count++; + } + sb.AppendLine(""); + sb.AppendLine("
"); + return sb.ToString().Trim(); + } + + private static string EncodeText(string text) + { + switch (Configuration.Settings.SubtitleSettings.SamiHtmlEncodeMode) + { + case 1: + return WebUtility.HtmlEncode(text); + case 2: + return HtmlUtil.EncodeNamed(text); + case 3: + return HtmlUtil.EncodeNumeric(text); + } + return text; + } + + public static List GetStylesFromHeader(string header) + { + var list = new List(); + if (!string.IsNullOrEmpty(header) && header.StartsWith(" 2) + { + string name = s.Substring(1, s.IndexOf(' ') - 1); + list.Add(name); + } + } + } + else + { + list.Add("ENUSCC"); + } + return list; + } + + public static List GetStylesFromSubtitle(Subtitle subtitle) + { + string language = LanguageAutoDetect.AutoDetectGoogleLanguage(subtitle); + var ci = CultureInfo.GetCultureInfo(language); + language = CultureInfo.CreateSpecificCulture(ci.Name).Name; + string languageTag = $"{language.Replace("-", string.Empty).ToUpperInvariant()}CC"; + return new List { languageTag }; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + var sb = new StringBuilder(); + foreach (string l in lines) + { + sb.AppendLine(l.Replace(" 0) + { + int styleEnd = allInputLower.IndexOf("", StringComparison.Ordinal); + if (styleEnd > 0) + { + subtitle.Header = allInput.Substring(styleStart, styleEnd - styleStart + 8); + } + } + + const string syncTag = "= 0) + { + string millisecondsAsString = string.Empty; + while (index < allInput.Length && expectedChars.Contains(allInput[index])) + { + if (allInput[index] != '"' && allInput[index] != '\'') + { + millisecondsAsString += allInput[index]; + } + + index++; + } + + while (index < allInput.Length && allInput[index] != '>') + { + index++; + } + + if (index < allInput.Length && allInput[index] == '>') + { + index++; + } + + int syncEndPos = allInputLower.IndexOf(syncTag, index, StringComparison.Ordinal); + if (hasEncryptedTags) + { + int syncEndPosEnc = allInputLower.IndexOf(syncTagEnc, index, StringComparison.Ordinal); + if (syncStartPosEnc >= 0 && syncStartPosEnc < syncStartPos || syncEndPos == -1) + { + syncEndPos = syncEndPosEnc; + } + } + + string text; + if (syncEndPos >= 0) + { + text = allInput.Substring(index, syncEndPos - index); + } + else + { + text = allInput.Substring(index); + } + + string textToLower = text.ToLowerInvariant(); + if (textToLower.Contains(" class=")) + { + var className = new StringBuilder(); + int startClass = textToLower.IndexOf(" class=", StringComparison.Ordinal); + int indexClass = startClass + 7; + while (indexClass < textToLower.Length && (Utilities.LowercaseLettersWithNumbers + @"'""").Contains(textToLower[indexClass])) + { + className.Append(text[indexClass]); + indexClass++; + } + p.Extra = className.ToString().Trim(' ', '\'', '"'); + } + + if (text.Contains("ID=\"Source\"") || text.Contains("ID=Source")) + { + int sourceIndex = text.IndexOf("ID=\"Source\"", StringComparison.Ordinal); + if (sourceIndex < 0) + { + sourceIndex = text.IndexOf("ID=Source", StringComparison.Ordinal); + } + + int st = sourceIndex - 1; + while (st > 0 && text.Substring(st, 2).ToUpperInvariant() != " 0) + { + text = text.Substring(0, st) + text.Substring(sourceIndex); + } + int et = st; + while (et < text.Length - 5 && text.Substring(et, 3).ToUpperInvariant() != "

" && text.Substring(et, 4).ToUpperInvariant() != "

") + { + et++; + } + text = text.Substring(0, st) + text.Substring(et); + } + text = text.Replace(Environment.NewLine, " "); + text = text.Replace(" ", " "); + + text = text.TrimEnd(); + text = Regex.Replace(text, @"
", Environment.NewLine, RegexOptions.IgnoreCase); + + while (text.Contains(" ")) + { + text = text.Replace(" ", " "); + } + + text = text.Replace("", string.Empty).Replace("", string.Empty).TrimEnd(); + text = text.Replace("", string.Empty).Replace("", string.Empty).TrimEnd(); + + int endSyncPos = text.ToUpperInvariant().IndexOf("
", StringComparison.OrdinalIgnoreCase); + if (text.IndexOf('>') > 0 && (text.IndexOf('>') < endSyncPos || endSyncPos == -1)) + { + text = text.Remove(0, text.IndexOf('>') + 1); + } + + text = text.TrimEnd(); + + if (text.EndsWith("
", StringComparison.OrdinalIgnoreCase)) + { + text = text.Substring(0, text.Length - 7).TrimEnd(); + } + + if (text.EndsWith("

", StringComparison.Ordinal) || text.EndsWith("

", StringComparison.OrdinalIgnoreCase)) + { + text = text.Substring(0, text.Length - 4).TrimEnd(); + } + + text = RemoveDiv(text).Trim(); + text = text.Replace(" ", " ").Replace("&NBSP;", " "); + text = text.Replace("

", string.Empty).Replace("", string.Empty).Replace("", string.Empty); + if (string.IsNullOrWhiteSpace(text)) + { + text = string.Empty; + } + + if (text.Contains("")) + { + text += ""; + } + + if (text.StartsWith("") && !text.Contains("")) + { + text += "
"; + } + + if (text.Contains('<') && text.Contains('>')) + { + var total = new StringBuilder(); + var partial = new StringBuilder(); + bool tagOn = false; + for (int i = 0; i < text.Length && i < 999; i++) + { + string tmp = text.Substring(i); + if (tmp.StartsWith('<') && + (tmp.StartsWith("') && tagOn) + { + tagOn = false; + total.Append('>'); + } + else if (!tagOn) + { + partial.Append(text[i]); + } + else + { + total.Append(text[i]); + } + } + total.Append(WebUtility.HtmlDecode(partial.ToString())); + text = total.ToString(); + } + else + { + text = WebUtility.HtmlDecode(text); + } + + var cleanText = text.FixExtraSpaces(); + cleanText = cleanText.Trim(); + + if (!string.IsNullOrEmpty(p.Text) && !string.IsNullOrEmpty(millisecondsAsString)) + { + p.EndTime = new TimeCode(long.Parse(millisecondsAsString)); + subtitle.Paragraphs.Add(p); + p = new Paragraph(); + } + + p.Text = cleanText; + long l; + if (long.TryParse(millisecondsAsString, out l)) + { + p.StartTime = new TimeCode(l); + } + + if (syncEndPos <= 0) + { + syncStartPos = -1; + } + else + { + syncStartPos = allInputLower.IndexOf(syncTag, syncEndPos, StringComparison.Ordinal); + index = syncStartPos + syncTag.Length; + + if (hasEncryptedTags) + { + syncStartPosEnc = allInputLower.IndexOf(syncTagEnc, syncEndPos, StringComparison.Ordinal); + if (syncStartPosEnc >= 0 && syncStartPosEnc < syncStartPos || syncStartPos == -1) + { + syncStartPos = syncStartPosEnc; + index = syncStartPosEnc + syncTagEnc.Length; + } + } + } + } + if (!string.IsNullOrEmpty(p.Text) && !subtitle.Paragraphs.Contains(p)) + { + p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(p.Text); + subtitle.Paragraphs.Add(p); + } + subtitle.Renumber(); + + if (subtitle.Paragraphs.Count > 0 && + (subtitle.Paragraphs[subtitle.Paragraphs.Count - 1].Text.ToUpperInvariant().Trim() == "" || + subtitle.Paragraphs[subtitle.Paragraphs.Count - 1].Text.ToUpperInvariant().Trim() == "")) + { + subtitle.Paragraphs.RemoveAt(subtitle.Paragraphs.Count - 1); + } + + foreach (Paragraph p2 in subtitle.Paragraphs) + { + p2.Text = p2.Text.Replace('\u00A0', ' '); // non-breaking space to normal space + } + } + + private string RemoveDiv(string text) + { + int indexOfDiv = text.IndexOf("
", StringComparison.Ordinal); + } + + int maxLoop = 10; + while (indexOfDiv > 0 && maxLoop >= 0) + { + int indexOfStartEnd = text.IndexOf(">", indexOfDiv + 1, StringComparison.Ordinal); + if (indexOfStartEnd > 0) + { + text = text.Remove(indexOfDiv, indexOfStartEnd - indexOfDiv + 1); + text = text.Replace("
", string.Empty); + + indexOfDiv = text.IndexOf("
", StringComparison.Ordinal); + } + } + maxLoop--; + } + return text; + } + + public override bool HasStyleSupport => true; + } +} diff --git a/libse/SubtitleFormats/SamiAvDicPlayer.cs b/src/libse/SubtitleFormats/SamiAvDicPlayer.cs similarity index 100% rename from libse/SubtitleFormats/SamiAvDicPlayer.cs rename to src/libse/SubtitleFormats/SamiAvDicPlayer.cs diff --git a/libse/SubtitleFormats/SamiModern.cs b/src/libse/SubtitleFormats/SamiModern.cs similarity index 95% rename from libse/SubtitleFormats/SamiModern.cs rename to src/libse/SubtitleFormats/SamiModern.cs index 0a1b28127..1fbac0739 100644 --- a/libse/SubtitleFormats/SamiModern.cs +++ b/src/libse/SubtitleFormats/SamiModern.cs @@ -1,9 +1,9 @@ -using System.Collections.Generic; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class SamiModern : Sami - { - public override string Name => "SAMI modern"; - } -} +using System.Collections.Generic; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class SamiModern : Sami + { + public override string Name => "SAMI modern"; + } +} diff --git a/libse/SubtitleFormats/SamiYouTube.cs b/src/libse/SubtitleFormats/SamiYouTube.cs similarity index 95% rename from libse/SubtitleFormats/SamiYouTube.cs rename to src/libse/SubtitleFormats/SamiYouTube.cs index 0624c5585..f2bc14af9 100644 --- a/libse/SubtitleFormats/SamiYouTube.cs +++ b/src/libse/SubtitleFormats/SamiYouTube.cs @@ -1,9 +1,9 @@ -using System.Collections.Generic; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class SamiYouTube : Sami - { - public override string Name => "SAMI YouTube"; - } -} +using System.Collections.Generic; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class SamiYouTube : Sami + { + public override string Name => "SAMI YouTube"; + } +} diff --git a/libse/SubtitleFormats/SatBoxPng.cs b/src/libse/SubtitleFormats/SatBoxPng.cs similarity index 97% rename from libse/SubtitleFormats/SatBoxPng.cs rename to src/libse/SubtitleFormats/SatBoxPng.cs index 428a5b1ec..4490296ec 100644 --- a/libse/SubtitleFormats/SatBoxPng.cs +++ b/src/libse/SubtitleFormats/SatBoxPng.cs @@ -1,94 +1,94 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - /// - /// http://forum.videohelp.com/threads/365786-Converting-Subtitles-%28XML-PNG%29-to-idx-sub - /// - public class SatBoxPng : SubtitleFormat - { - public override string Extension => ".txt"; - - public override string Name => "SatBox png"; - - public override string ToText(Subtitle subtitle, string title) - { - return "Not implemented"; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - // - Paragraph p = null; - subtitle.Paragraphs.Clear(); - _errorCount = 0; - if (string.IsNullOrEmpty(fileName)) - { - return; - } - - string path = Path.GetDirectoryName(fileName); - foreach (string line in lines) - { - if (line.Contains(" s=\"") && line.Contains(" e=\"") && line.Contains(" i=\"") && line.Contains(".png") && (line.Contains("= 0 && File.Exists(Path.Combine(path, text.Remove(0, indexOfSlash + 1)))) - { - text = Path.Combine(path, text.Remove(0, indexOfSlash + 1)); - } - } - p = new Paragraph(DecodeTimeCode(start), DecodeTimeCode(end), text); - subtitle.Paragraphs.Add(p); - } - catch (Exception exception) - { - _errorCount++; - System.Diagnostics.Debug.WriteLine(exception.Message); - } - } - else if (!string.IsNullOrWhiteSpace(line) && p != null) - { - _errorCount++; - } - } - subtitle.Renumber(); - } - - private static string GetTagValue(string tag, string line) - { - var start = line.IndexOf(tag + "=\"", StringComparison.Ordinal); - if (start > 0 && line.Length > start + 4) - { - int end = line.IndexOf('"', start + 3); - if (end > 0 && line.Length > end + 3) - { - string value = line.Substring(start + 3, end - start - 3); - return value; - } - } - return string.Empty; - } - - private static TimeCode DecodeTimeCode(string s) - { - return TimeCode.FromSeconds(double.Parse(s, CultureInfo.InvariantCulture)); - } - - } -} +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + /// + /// http://forum.videohelp.com/threads/365786-Converting-Subtitles-%28XML-PNG%29-to-idx-sub + /// + public class SatBoxPng : SubtitleFormat + { + public override string Extension => ".txt"; + + public override string Name => "SatBox png"; + + public override string ToText(Subtitle subtitle, string title) + { + return "Not implemented"; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + // + Paragraph p = null; + subtitle.Paragraphs.Clear(); + _errorCount = 0; + if (string.IsNullOrEmpty(fileName)) + { + return; + } + + string path = Path.GetDirectoryName(fileName); + foreach (string line in lines) + { + if (line.Contains(" s=\"") && line.Contains(" e=\"") && line.Contains(" i=\"") && line.Contains(".png") && (line.Contains("= 0 && File.Exists(Path.Combine(path, text.Remove(0, indexOfSlash + 1)))) + { + text = Path.Combine(path, text.Remove(0, indexOfSlash + 1)); + } + } + p = new Paragraph(DecodeTimeCode(start), DecodeTimeCode(end), text); + subtitle.Paragraphs.Add(p); + } + catch (Exception exception) + { + _errorCount++; + System.Diagnostics.Debug.WriteLine(exception.Message); + } + } + else if (!string.IsNullOrWhiteSpace(line) && p != null) + { + _errorCount++; + } + } + subtitle.Renumber(); + } + + private static string GetTagValue(string tag, string line) + { + var start = line.IndexOf(tag + "=\"", StringComparison.Ordinal); + if (start > 0 && line.Length > start + 4) + { + int end = line.IndexOf('"', start + 3); + if (end > 0 && line.Length > end + 3) + { + string value = line.Substring(start + 3, end - start - 3); + return value; + } + } + return string.Empty; + } + + private static TimeCode DecodeTimeCode(string s) + { + return TimeCode.FromSeconds(double.Parse(s, CultureInfo.InvariantCulture)); + } + + } +} diff --git a/libse/SubtitleFormats/Scenarist.cs b/src/libse/SubtitleFormats/Scenarist.cs similarity index 97% rename from libse/SubtitleFormats/Scenarist.cs rename to src/libse/SubtitleFormats/Scenarist.cs index 0137e7b13..14a2df55c 100644 --- a/libse/SubtitleFormats/Scenarist.cs +++ b/src/libse/SubtitleFormats/Scenarist.cs @@ -1,95 +1,95 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class Scenarist : SubtitleFormat - { - private static readonly Regex RegexTimeCodes = new Regex(@"^\d\d\d\d\t\d\d:\d\d:\d\d:\d\d\t\d\d:\d\d:\d\d:\d\d\t", RegexOptions.Compiled); - - public override string Extension => ".txt"; - - public const string NameOfFormat = "Scenarist"; - - public override string Name => NameOfFormat; - - public override string ToText(Subtitle subtitle, string title) - { - var sb = new StringBuilder(); - int index = 0; - foreach (var p in subtitle.Paragraphs) - { - //0003 00:00:28:16 00:00:31:04 Jeg vil lære jer frygten for HERREN." (newline is \t) - sb.AppendLine($"{index + 1:0000}\t{EncodeTimeCode(p.StartTime)}\t{EncodeTimeCode(p.EndTime)}\t{HtmlUtil.RemoveHtmlTags(p.Text).Replace(Environment.NewLine, "\t")}"); - index++; - } - return sb.ToString(); - } - - private static string EncodeTimeCode(TimeCode time) - { - //00:03:15:22 (last is frame) - return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}:{MillisecondsToFramesMaxFrameRate(time.Milliseconds):00}"; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - //00:03:15:22 00:03:23:10 This is line one. - //This is line two. - Paragraph p = null; - subtitle.Paragraphs.Clear(); - _errorCount = 0; - foreach (var line in lines) - { - if (RegexTimeCodes.IsMatch(line)) - { - var temp = line.Substring(0, RegexTimeCodes.Match(line).Length); - var start = temp.Substring(5, 11); - var end = temp.Substring(12 + 5, 11); - - var startParts = start.Split(SplitCharColon, StringSplitOptions.RemoveEmptyEntries); - var endParts = end.Split(SplitCharColon, StringSplitOptions.RemoveEmptyEntries); - if (startParts.Length == 4 && endParts.Length == 4) - { - var text = line.Remove(0, RegexTimeCodes.Match(line).Length - 1).Trim(); - if (!text.Contains(Environment.NewLine)) - { - text = text.Replace("\t", Environment.NewLine); - } - - p = new Paragraph(DecodeTimeCodeFramesFourParts(startParts), DecodeTimeCodeFramesFourParts(endParts), text); - subtitle.Paragraphs.Add(p); - } - } - else if (string.IsNullOrWhiteSpace(line)) - { - // skip these lines - } - else if (p != null) - { - _errorCount++; - } - } - - for (var index = 0; index < subtitle.Paragraphs.Count - 1; index++) - { - var current = subtitle.Paragraphs[index]; - var next = subtitle.Paragraphs[index + 1]; - if (Math.Abs(current.EndTime.TotalMilliseconds - next.StartTime.TotalMilliseconds) < 0.01) - { - if (current.EndTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines > - current.StartTime.TotalMilliseconds) - { - current.EndTime.TotalMilliseconds -= Configuration.Settings.General.MinimumMillisecondsBetweenLines; - } - } - } - - subtitle.Renumber(); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class Scenarist : SubtitleFormat + { + private static readonly Regex RegexTimeCodes = new Regex(@"^\d\d\d\d\t\d\d:\d\d:\d\d:\d\d\t\d\d:\d\d:\d\d:\d\d\t", RegexOptions.Compiled); + + public override string Extension => ".txt"; + + public const string NameOfFormat = "Scenarist"; + + public override string Name => NameOfFormat; + + public override string ToText(Subtitle subtitle, string title) + { + var sb = new StringBuilder(); + int index = 0; + foreach (var p in subtitle.Paragraphs) + { + //0003 00:00:28:16 00:00:31:04 Jeg vil lære jer frygten for HERREN." (newline is \t) + sb.AppendLine($"{index + 1:0000}\t{EncodeTimeCode(p.StartTime)}\t{EncodeTimeCode(p.EndTime)}\t{HtmlUtil.RemoveHtmlTags(p.Text).Replace(Environment.NewLine, "\t")}"); + index++; + } + return sb.ToString(); + } + + private static string EncodeTimeCode(TimeCode time) + { + //00:03:15:22 (last is frame) + return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}:{MillisecondsToFramesMaxFrameRate(time.Milliseconds):00}"; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + //00:03:15:22 00:03:23:10 This is line one. + //This is line two. + Paragraph p = null; + subtitle.Paragraphs.Clear(); + _errorCount = 0; + foreach (var line in lines) + { + if (RegexTimeCodes.IsMatch(line)) + { + var temp = line.Substring(0, RegexTimeCodes.Match(line).Length); + var start = temp.Substring(5, 11); + var end = temp.Substring(12 + 5, 11); + + var startParts = start.Split(SplitCharColon, StringSplitOptions.RemoveEmptyEntries); + var endParts = end.Split(SplitCharColon, StringSplitOptions.RemoveEmptyEntries); + if (startParts.Length == 4 && endParts.Length == 4) + { + var text = line.Remove(0, RegexTimeCodes.Match(line).Length - 1).Trim(); + if (!text.Contains(Environment.NewLine)) + { + text = text.Replace("\t", Environment.NewLine); + } + + p = new Paragraph(DecodeTimeCodeFramesFourParts(startParts), DecodeTimeCodeFramesFourParts(endParts), text); + subtitle.Paragraphs.Add(p); + } + } + else if (string.IsNullOrWhiteSpace(line)) + { + // skip these lines + } + else if (p != null) + { + _errorCount++; + } + } + + for (var index = 0; index < subtitle.Paragraphs.Count - 1; index++) + { + var current = subtitle.Paragraphs[index]; + var next = subtitle.Paragraphs[index + 1]; + if (Math.Abs(current.EndTime.TotalMilliseconds - next.StartTime.TotalMilliseconds) < 0.01) + { + if (current.EndTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines > + current.StartTime.TotalMilliseconds) + { + current.EndTime.TotalMilliseconds -= Configuration.Settings.General.MinimumMillisecondsBetweenLines; + } + } + } + + subtitle.Renumber(); + } + + } +} diff --git a/libse/SubtitleFormats/ScenaristClosedCaptions.cs b/src/libse/SubtitleFormats/ScenaristClosedCaptions.cs similarity index 97% rename from libse/SubtitleFormats/ScenaristClosedCaptions.cs rename to src/libse/SubtitleFormats/ScenaristClosedCaptions.cs index abaf2fa73..e393dc870 100644 --- a/libse/SubtitleFormats/ScenaristClosedCaptions.cs +++ b/src/libse/SubtitleFormats/ScenaristClosedCaptions.cs @@ -1,1204 +1,1204 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - - /// - /// http://www.theneitherworld.com/mcpoodle/SCC_TOOLS/DOCS/SCC_FORMAT.HTML - /// § 15.119 47 CFR Ch. I (10–1–10 Edition) (pdf) - /// Maximum four lines + max 32 characters on each line - /// - public class ScenaristClosedCaptions : SubtitleFormat - { - //00:01:00:29 9420 9420 94ae 94ae 94d0 94d0 4920 f761 7320 ... semi colon (instead of colon) before frame number is used to indicate drop frame - private const string TimeCodeRegEx = @"^\d+:\d\d:\d\d[:,]\d\d\t"; - private static readonly Regex Regex = new Regex(TimeCodeRegEx, RegexOptions.Compiled); - protected virtual Regex RegexTimeCodes => Regex; - protected bool DropFrame; - - private static readonly List> LetterDictionary = new List> - { - new KeyValuePair("20", " " ), - new KeyValuePair("a1", "!" ), - new KeyValuePair("a2", "\""), - new KeyValuePair("23", "#" ), - new KeyValuePair("a4", "$" ), - new KeyValuePair("25", "%" ), - new KeyValuePair("26", "&" ), - new KeyValuePair("a7", "'" ), - new KeyValuePair("a8", "(" ), - new KeyValuePair("29", ")" ), - new KeyValuePair("2a", "á" ), - new KeyValuePair("ab", "+" ), - new KeyValuePair("2c", "," ), - new KeyValuePair("ad", "-" ), - new KeyValuePair("ae", "." ), - new KeyValuePair("2f", "/" ), - new KeyValuePair("b0", "0" ), - new KeyValuePair("31", "1" ), - new KeyValuePair("32", "2" ), - new KeyValuePair("b3", "3" ), - new KeyValuePair("34", "4" ), - new KeyValuePair("b5", "5" ), - new KeyValuePair("b6", "6" ), - new KeyValuePair("37", "7" ), - new KeyValuePair("38", "8" ), - new KeyValuePair("b9", "9" ), - new KeyValuePair("ba", ":" ), - new KeyValuePair("3b", ";" ), - new KeyValuePair("bc", "<" ), - new KeyValuePair("3d", "=" ), - new KeyValuePair("3e", ">" ), - new KeyValuePair("bf", "?" ), - new KeyValuePair("40", "@" ), - new KeyValuePair("c1", "A" ), - new KeyValuePair("c2", "B" ), - new KeyValuePair("43", "C" ), - new KeyValuePair("c4", "D" ), - new KeyValuePair("45", "E" ), - new KeyValuePair("46", "F" ), - new KeyValuePair("c7", "G" ), - new KeyValuePair("c8", "H" ), - new KeyValuePair("49", "I" ), - new KeyValuePair("4a", "J" ), - new KeyValuePair("cb", "K" ), - new KeyValuePair("4c", "L" ), - new KeyValuePair("cd", "M" ), - new KeyValuePair("ce", "N" ), - new KeyValuePair("4f", "O" ), - new KeyValuePair("d0", "P" ), - new KeyValuePair("51", "Q" ), - new KeyValuePair("52", "R" ), - new KeyValuePair("d3", "S" ), - new KeyValuePair("54", "T" ), - new KeyValuePair("d5", "U" ), - new KeyValuePair("d6", "V" ), - new KeyValuePair("57", "W" ), - new KeyValuePair("58", "X" ), - new KeyValuePair("d9", "Y" ), - new KeyValuePair("da", "Z" ), - new KeyValuePair("5b", "[" ), - new KeyValuePair("dc", "é" ), - new KeyValuePair("5d", "]" ), - new KeyValuePair("5e", "í" ), - new KeyValuePair("df", "ó" ), - new KeyValuePair("e0", "ú" ), - new KeyValuePair("61", "a" ), - new KeyValuePair("62", "b" ), - new KeyValuePair("e3", "c" ), - new KeyValuePair("64", "d" ), - new KeyValuePair("e5", "e" ), - new KeyValuePair("e6", "f" ), - new KeyValuePair("67", "g" ), - new KeyValuePair("68", "h" ), - new KeyValuePair("e9", "i" ), - new KeyValuePair("ea", "j" ), - new KeyValuePair("6b", "k" ), - new KeyValuePair("ec", "l" ), - new KeyValuePair("6d", "m" ), - new KeyValuePair("ef", "o" ), - new KeyValuePair("70", "p" ), - new KeyValuePair("f1", "q" ), - new KeyValuePair("f2", "r" ), - new KeyValuePair("73", "s" ), - new KeyValuePair("f4", "t" ), - new KeyValuePair("75", "u" ), - new KeyValuePair("76", "v" ), - new KeyValuePair("f7", "w" ), - new KeyValuePair("f8", "x" ), - new KeyValuePair("fb", "ç" ), - new KeyValuePair("79", "y" ), - new KeyValuePair("7a", "z" ), - new KeyValuePair("7c", "" ), - new KeyValuePair("fd", "Ñ" ), - new KeyValuePair("fe", "ñ" ), - new KeyValuePair("7f", "■" ), - new KeyValuePair("7b", "ç" ), - new KeyValuePair("63", "c" ), - new KeyValuePair("65", "e" ), - new KeyValuePair("66", "f" ), - new KeyValuePair("69", "i" ), - new KeyValuePair("6a", "j" ), - new KeyValuePair("6c", "l" ), - new KeyValuePair("6e", "n" ), - new KeyValuePair("6f", "o" ), - new KeyValuePair("71", "q" ), - new KeyValuePair("72", "r" ), - new KeyValuePair("74", "t" ), - new KeyValuePair("77", "w" ), - new KeyValuePair("78", "x" ), - new KeyValuePair("91b0", "" ), - new KeyValuePair("91b3", "" ), - new KeyValuePair("91b5", "" ), - new KeyValuePair("91b6", "£" ), - new KeyValuePair("9137", "♪" ), - new KeyValuePair("9138", "à" ), - new KeyValuePair("91b9", "" ), - new KeyValuePair("91ba", "è" ), - new KeyValuePair("913b", "â" ), - new KeyValuePair("91bc", "ê" ), - new KeyValuePair("913d", "î" ), - new KeyValuePair("913e", "ô" ), - new KeyValuePair("91bf", "û" ), - new KeyValuePair("9220", "Á" ), - new KeyValuePair("92a1", "É" ), - new KeyValuePair("92a2", "Ó" ), - new KeyValuePair("9223", "Ú" ), - new KeyValuePair("92a4", "Ü" ), - new KeyValuePair("9225", "ü" ), - new KeyValuePair("9226", "'" ), - new KeyValuePair("92a7", "i" ), - new KeyValuePair("92a8", "*" ), - new KeyValuePair("9229", "'" ), - new KeyValuePair("922a", "-" ), - new KeyValuePair("92ab", "" ), - new KeyValuePair("922c", "" ), - new KeyValuePair("92ad", "\""), - new KeyValuePair("92ae", "\""), - new KeyValuePair("922f", "" ), - new KeyValuePair("92b0", "À" ), - new KeyValuePair("9231", "Â" ), - new KeyValuePair("9232", "Ç" ), - new KeyValuePair("92b3", "È" ), - new KeyValuePair("9234", "Ê" ), - new KeyValuePair("92b5", "Ë" ), - new KeyValuePair("92b6", "ë" ), - new KeyValuePair("9237", "Î" ), - new KeyValuePair("9238", "Ï" ), - new KeyValuePair("92b9", "ï" ), - new KeyValuePair("923b", "Ù" ), - new KeyValuePair("923d", "Û" ), - new KeyValuePair("923e", "" ), - new KeyValuePair("92bf", "" ), - new KeyValuePair("1320", "Ã" ), - new KeyValuePair("c1 1320", "Ã" ), - new KeyValuePair("c180 1320", "Ã" ), - new KeyValuePair("13a1", "ã" ), - new KeyValuePair("80 13a1", "ã" ), - new KeyValuePair("6180 13a1", "ã" ), - new KeyValuePair("13a2", "Í" ), - new KeyValuePair("49 13a2", "Í" ), - new KeyValuePair("4980 13a2", "Í" ), - new KeyValuePair("1323", "Ì" ), - new KeyValuePair("49 1323", "Ì" ), - new KeyValuePair("4980 1323", "Ì" ), - new KeyValuePair("13a4", "ì" ), - new KeyValuePair("e9 13a4", "ì" ), - new KeyValuePair("e980 13a4", "ì" ), - new KeyValuePair("1325", "Ò" ), - new KeyValuePair("4f 1325", "Ò" ), - new KeyValuePair("4f80 1325", "Ò" ), - new KeyValuePair("1326", "ò" ), - new KeyValuePair("ef 1326", "ò" ), - new KeyValuePair("ef80 1326", "ò" ), - new KeyValuePair("13a7", "Õ" ), - new KeyValuePair("4f 13a7", "Õ" ), - new KeyValuePair("4f80 13a7", "Õ" ), - new KeyValuePair("13a8", "õ" ), - new KeyValuePair("ef 13a8", "õ" ), - new KeyValuePair("ef80 13a8", "õ" ), - new KeyValuePair("1329", "{" ), - new KeyValuePair("132a", "}" ), - new KeyValuePair("13ab", "\\"), - new KeyValuePair("132c", "^" ), - new KeyValuePair("13ad", "_" ), - new KeyValuePair("13ae", "|" ), - new KeyValuePair("132f", "~" ), - new KeyValuePair("13b0", "Ä" ), - new KeyValuePair("c180 13b0", "Ä" ), - new KeyValuePair("1331", "ä" ), - new KeyValuePair("6180 1331", "ä" ), - new KeyValuePair("1332", "Ö" ), - new KeyValuePair("4f80 1332", "Ö" ), - new KeyValuePair("13b3", "ö" ), - new KeyValuePair("ef80 13b3", "ö" ), - new KeyValuePair("1334", "" ), - new KeyValuePair("13b5", "" ), - new KeyValuePair("13b6", "" ), - new KeyValuePair("1337", "|" ), - new KeyValuePair("1338", "Å" ), - new KeyValuePair("13b9", "å" ), - new KeyValuePair("4f80 13ba 13ba", "Ø" ), - new KeyValuePair("133b", "ø" ), - new KeyValuePair("133d", "" ), - new KeyValuePair("133e", "" ), - new KeyValuePair("13bf", "" ), - new KeyValuePair("9420", "" ), //9420=RCL, Resume Caption Loading - new KeyValuePair("94ae", "" ), //94ae=Clear Buffer - new KeyValuePair("942c", "" ), //942c=Clear Caption - new KeyValuePair("8080", "" ), //8080=Wait One Frame - new KeyValuePair("942f", "" ), //942f=Display Caption - new KeyValuePair("9440", "" ), //9440=? first sub? - new KeyValuePair("9452", "" ), //? - new KeyValuePair("9454", "" ), //? - new KeyValuePair("9470", "" ), //9470=? - new KeyValuePair("94d0", "" ), //94d0=? - new KeyValuePair("94d6", "" ), //94d6=? - new KeyValuePair("94f2", "" ), - new KeyValuePair("94f4", "" ), - new KeyValuePair("9723", " " ), // ? - new KeyValuePair("97a1", " " ), // ? - new KeyValuePair("97a2", " " ), // ? - new KeyValuePair("1370", "" ), //1370=? - new KeyValuePair("13e0", "" ), //13e0=? - new KeyValuePair("13f2", "" ), //13f2=? - new KeyValuePair("136e", "" ), //136e=? - new KeyValuePair("94ce", "" ), //94ce=? - new KeyValuePair("2c2f", "" ), //? - new KeyValuePair("1130", "®" ), - new KeyValuePair("1131", "°" ), - new KeyValuePair("1132", "½" ), - new KeyValuePair("1133", "¿" ), - new KeyValuePair("1134", "TM"), - new KeyValuePair("1135", "¢" ), - new KeyValuePair("1136", "£" ), - new KeyValuePair("1137", "♪" ), - new KeyValuePair("1138", "à" ), - new KeyValuePair("113a", "è" ), - new KeyValuePair("113b", "â" ), - new KeyValuePair("113c", "ê" ), - new KeyValuePair("113d", "î" ), - new KeyValuePair("113e", "ô" ), - new KeyValuePair("113f", "û" ), - new KeyValuePair("9130", "®" ), - new KeyValuePair("9131", "°" ), - new KeyValuePair("9132", "½" ), - new KeyValuePair("9133", "¿" ), - new KeyValuePair("9134", "TM"), - new KeyValuePair("9135", "¢" ), - new KeyValuePair("9136", "£" ), - new KeyValuePair("913a", "è" ), - new KeyValuePair("913c", "ê" ), - new KeyValuePair("913f", "û" ), - new KeyValuePair("a180 92a7 92a7", "¡" ), - new KeyValuePair("92a7 92a7", "¡" ), - new KeyValuePair("91b3 91b3", "¿" ), - - new KeyValuePair("6180 9138 9138", "à"), //61=a - new KeyValuePair("9138 9138", "à"), - - new KeyValuePair("6180 913b 913b", "â"), - new KeyValuePair("913b 913b", "â"), - - new KeyValuePair("6180 1331 1331", "ä"), - new KeyValuePair("1331 1331", "ä"), - - new KeyValuePair("e580 91ba 91ba", "è"), - new KeyValuePair("6180 91ba 91ba", "è"), - new KeyValuePair("91ba 91ba", "è"), - - new KeyValuePair("e580 91bc 91bc", "ê"), - new KeyValuePair("6180 91bc 91bc", "ê"), - new KeyValuePair("91bc 91bc", "ê"), - - - new KeyValuePair("e580 92b6 92b6", "ë"), //e5=e (+65?) - new KeyValuePair("6580 92b6 92b6", "ë"), - new KeyValuePair("92b6 92b6", "ë"), - - new KeyValuePair("e980 13a4 13a4", "ì"), //e9 = i - new KeyValuePair("13a4 13a4", "ì"), - - new KeyValuePair("e980 913d 913d", "î"), - new KeyValuePair("913d 913d", "î"), - - new KeyValuePair("e980 92b9 92b9", "ï"), - new KeyValuePair("92b9 92b9", "ï"), - - new KeyValuePair("1326 1326", "ò"), //o=ef or 6f - new KeyValuePair("ef80 1326 1326", "ò"), - new KeyValuePair("6f80 1326 1326", "ò"), - - new KeyValuePair("913e 913e", "ô"), - new KeyValuePair("ef80 913e 913e", "ô"), - new KeyValuePair("6f80 913e 913e", "ô"), - - new KeyValuePair("13b3 13b3", "ö"), - new KeyValuePair("ef80 13b3 13b3", "ö"), - new KeyValuePair("6f80 13b3 13b3", "ö"), - - new KeyValuePair("7580 13b3 13b3", "ù"), //u=75 - - new KeyValuePair("7580 92bc 92bc", "ù"), - new KeyValuePair("92bc 92bc", "ù"), - - new KeyValuePair("7580 91bf 91bf", "û"), - new KeyValuePair("91bf 91bf", "û"), - - new KeyValuePair("7580 9225 9225", "ü"), - new KeyValuePair("9225 9225", "ü"), - - new KeyValuePair("4380 9232 9232", "Ç"), //43=C - new KeyValuePair("9232 9232", "Ç"), - - new KeyValuePair("c180 1338 1338", "Å"), //c1=A - new KeyValuePair("1338 1338", "Å"), - - new KeyValuePair("c180 92b0 92b0", "À"), - new KeyValuePair("92b0 92b0", "À"), - - new KeyValuePair("c180 9220 9220", "Á"), - new KeyValuePair("9220 9220", "Á"), - - new KeyValuePair("c180 9231 9231", "Â"), - new KeyValuePair("9231 9231", "Â"), - - new KeyValuePair("c180 1320 1320", "Ã"), - new KeyValuePair("1320 1320", "Ã"), - - new KeyValuePair("c180 13b0 13b0", "Ä"), - new KeyValuePair("13b0 13b0", "Ä"), - - new KeyValuePair("4580 92b3 92b3", "È"), - new KeyValuePair("92b3 92b3", "È"), - - new KeyValuePair("4580 92a1 92a1", "É"), - new KeyValuePair("92a1 92a1", "É"), - - new KeyValuePair("4580 9234 9234", "Ê"), - new KeyValuePair("9234 9234", "Ê"), - - new KeyValuePair("4580 92b5 92b5", "Ë"), - new KeyValuePair("92b5 92b5", "Ë"), - - new KeyValuePair("4980 1323 1323", "Ì"), - new KeyValuePair("1323 1323", "Ì"), - - new KeyValuePair("4980 13a2 13a2", "Í"), - new KeyValuePair("13a2 13a2", "Í"), - - new KeyValuePair("4980 9237 9237", "Î"), - new KeyValuePair("9237 9237", "Î"), - - new KeyValuePair("4980 9238 9238", "Ï"), - new KeyValuePair("9238 9238", "Ï"), - - new KeyValuePair("4f80 92a2 92a2", "Ó"), //4f=O - new KeyValuePair("92a2 92a2", "Ó"), - - new KeyValuePair("4f80 1325 1325", "Ò"), - new KeyValuePair("1325 1325", "Ò"), - - new KeyValuePair("4f80 92ba 92ba", "Ô"), - new KeyValuePair("92ba 92ba", "Ô"), - - new KeyValuePair("4f80 13a7 13a7", "Õ"), - new KeyValuePair("13a7 13a7", "Õ"), - - new KeyValuePair("4f80 1332 1332", "Ö"), - new KeyValuePair("1332 1332", "Ö"), - - new KeyValuePair("d580 9223 9223", "Ú"), - new KeyValuePair("923d 923d", "Û"), - - new KeyValuePair("d580 923b 923b", "Ù"), - new KeyValuePair("9223 9223", "Ú"), - - new KeyValuePair("d580 92a4 92a4", "Ü"), - new KeyValuePair("92a4 92a4", "Ü"), - - new KeyValuePair("d580 923d 923d", "Û"), - }; - - private static readonly Dictionary LettersCodeLookup = LetterDictionary.ToDictionary(p => p.Key, p => p.Value); - - public override string Extension => ".scc"; - - public override string Name => "Scenarist Closed Captions"; - - private static string FixMax4LinesAndMax32CharsPerLine(string text, string language) - { - // fix attempt 1 - var lines = text.Trim().SplitToLines(); - if (IsAllOkay(lines)) - { - return text; - } - - // fix attempt 2 - text = Utilities.AutoBreakLine(text, 1, 4, language); - lines = text.Trim().SplitToLines(); - if (IsAllOkay(lines)) - { - return text; - } - - // fix attempt 3 - text = AutoBreakLineMax4Lines(text, 32); - lines = text.Trim().SplitToLines(); - if (IsAllOkay(lines)) - { - return text; - } - - var sb = new StringBuilder(); - int count = 0; - foreach (var line in lines) - { - if (count < 4) - { - sb.AppendLine(line.Length > 32 ? line.Substring(0, 32) : line); - } - count++; - } - return sb.ToString().Trim(); - } - - private static bool IsAllOkay(List lines) - { - return lines.Count <= 4 && lines.All(line => line.Length <= 32); - } - - private static int GetLastIndexOfSpace(string s, int endCount) - { - var end = Math.Min(endCount, s.Length - 1); - while (end > 0) - { - if (s[end] == ' ') - { - return end; - } - - end--; - } - return -1; - } - - private static string AutoBreakLineMax4Lines(string text, int maxLength) - { - string s = text.Replace(Environment.NewLine, " "); - s = s.Replace(" ", " "); - var sb = new StringBuilder(); - int i = GetLastIndexOfSpace(s, maxLength); - if (i > 0) - { - sb.AppendLine(s.Substring(0, i)); - s = s.Remove(0, i).Trim(); - i = s.Length <= maxLength ? s.Length : GetLastIndexOfSpace(s, maxLength); - - if (i > 0) - { - sb.AppendLine(s.Substring(0, i)); - s = s.Remove(0, i).Trim(); - i = s.Length <= maxLength ? s.Length : GetLastIndexOfSpace(s, maxLength); - - if (i > 0) - { - sb.AppendLine(s.Substring(0, i)); - s = s.Remove(0, i).Trim(); - i = s.Length <= maxLength ? s.Length : GetLastIndexOfSpace(s, maxLength); - - if (i > 0) - { - sb.AppendLine(s.Substring(0, i)); - } - else - { - sb.Append(s); - } - } - else - { - sb.Append(s); - } - } - return sb.ToString().Trim(); - } - return text; - } - - public override string ToText(Subtitle subtitle, string title) - { - var sb = new StringBuilder(); - sb.AppendLine("Scenarist_SCC V1.0"); - sb.AppendLine(); - string language = LanguageAutoDetect.AutoDetectGoogleLanguage(subtitle); - for (int i = 0; i < subtitle.Paragraphs.Count; i++) - { - var p = subtitle.Paragraphs[i]; - sb.AppendLine($"{ToTimeCode(p.StartTime.TotalMilliseconds)}\t94ae 94ae 9420 9420 {ToSccText(p.Text, language)} 942f 942f"); - sb.AppendLine(); - - var next = subtitle.GetParagraphOrDefault(i + 1); - if (next == null || Math.Abs(next.StartTime.TotalMilliseconds - p.EndTime.TotalMilliseconds) > 100) - { - sb.AppendLine($"{ToTimeCode(p.EndTime.TotalMilliseconds)}\t942c 942c"); - sb.AppendLine(); - } - } - return sb.ToString(); - } - - private static string ToSccText(string text, string language) - { - text = FixMax4LinesAndMax32CharsPerLine(text, language); - var topAlign = text.StartsWith("{\\an7}", StringComparison.Ordinal) || - text.StartsWith("{\\an8}", StringComparison.Ordinal) || - text.StartsWith("{\\an9}", StringComparison.Ordinal); - - var leftAlign = text.StartsWith("{\\an7}", StringComparison.Ordinal) || - text.StartsWith("{\\an4}", StringComparison.Ordinal) || - text.StartsWith("{\\an1}", StringComparison.Ordinal); - - var rightAlign = text.StartsWith("{\\an9}", StringComparison.Ordinal) || - text.StartsWith("{\\an6}", StringComparison.Ordinal) || - text.StartsWith("{\\an3}", StringComparison.Ordinal); - - var verticalCenter = text.StartsWith("{\\an4}", StringComparison.Ordinal) || - text.StartsWith("{\\an5}", StringComparison.Ordinal) || - text.StartsWith("{\\an6}", StringComparison.Ordinal); - - text = Utilities.RemoveSsaTags(text); - var lines = text.Trim().SplitToLines(); - int italic = 0; - var sb = new StringBuilder(); - int count = 1; - foreach (var line in lines) - { - text = line.Trim(); - if (count > 0) - { - sb.Append(' '); - } - - var centerCodes = GetCenterCodes(text, count, lines.Count, topAlign, leftAlign, rightAlign, verticalCenter); - sb.Append(centerCodes); - count++; - int i = 0; - string code = string.Empty; - if (italic > 0) - { - sb.Append("91ae 91ae "); // italic - } - - while (i < text.Length) - { - string s = text.Substring(i, 1); - string codeFromLetter = GetCodeFromLetter(s); - string newCode; - if (text.Substring(i).StartsWith("", StringComparison.Ordinal)) - { - newCode = "91ae"; - i += 2; - italic++; - } - else if (text.Substring(i).StartsWith("", StringComparison.Ordinal) && italic > 0) - { - newCode = "9120"; - i += 3; - italic--; - } - else if (text[i] == '’') - { - if (code.Length == 4) - { - sb.Append(code + " "); - code = string.Empty; - } - - if (code.Length == 0) - { - code = "80"; - } - - if (code.Length == 2) - { - code += "a7"; - sb.Append(code + " "); - } - - code = "9229"; - newCode = ""; - } - else if (codeFromLetter == null) - { - newCode = GetCodeFromLetter(" "); - } - else - { - newCode = codeFromLetter; - } - - if (code.Length == 2 && newCode.Length == 4) - { - code += "80"; - } - - if (code.Length == 4) - { - sb.Append(code + " "); - if (code.StartsWith('9') || code.StartsWith('8')) // control codes must be double - { - sb.Append(code + " "); - } - - code = string.Empty; - } - - if (code.Length == 2 && newCode.Length == 2) - { - code += newCode; - newCode = string.Empty; - } - - if (newCode.Length == 4 && code.Length == 0) - { - code = newCode; - } - else if (newCode.Length == 2 && code.Length == 0) - { - code = newCode; - } - else if (newCode.Length > 4) - { - if (code.Length == 2) - { - code += "80"; - sb.Append(code + " "); - if (code.StartsWith('9') || code.StartsWith('8')) // control codes must be double - { - sb.Append(code + " "); - } - - code = string.Empty; - } - else if (code.Length == 4) - { - sb.Append(code + " "); - if (code.StartsWith('9') || code.StartsWith('8')) // control codes must be double - { - sb.Append(code + " "); - } - - code = string.Empty; - } - - sb.Append(newCode.TrimEnd() + " "); - } - - i++; - } - - if (code.Length == 2) - { - code += "80"; - } - - if (code.Length == 4) - { - sb.Append(code); - } - } - - return sb.ToString().Trim(); - } - - private static string GetCodeFromLetter(string letter) - { - var code = LetterDictionary.FirstOrDefault(x => x.Value == letter); - if (code.Equals(new KeyValuePair())) - { - return null; - } - - return code.Key; - } - - private static string GetLetterFromCode(string hexCode) - { - return LettersCodeLookup.TryGetValue(hexCode, out var letter) ? letter : null; - } - - public static string GetCenterCodes(string text, int lineNumber, int totalLines, bool topAlign, bool leftAlign, bool rightAlign, bool verticalCenter) - { - var row = 14 - (totalLines - lineNumber); - if (topAlign) - { - row = lineNumber; - } - else if (verticalCenter) - { - row = 6 - totalLines / 2 + lineNumber; - } - var rowCodes = new List { "91", "91", "92", "92", "15", "15", "16", "16", "97", "97", "10", "13", "13", "94", "94" }; - var rowCode = rowCodes[row]; - - var left = (32 - text.Length) / 2; - if (leftAlign) - { - left = 0; - } - else if (rightAlign) - { - left = 32 - text.Length; - } - int columnRest = left % 4; - int column = left - columnRest; - - List columnCodes; - switch (column) - { - case 0: - columnCodes = new List { "d0", "70", "d0", "70", "d0", "70", "d0", "70", "d0", "70", "d0", "d0", "70", "d0", "70" }; - break; - case 4: - columnCodes = new List { "52", "f2", "52", "f2", "52", "f2", "52", "f2", "52", "f2", "52", "52", "f2", "52", "f2" }; - break; - case 8: - columnCodes = new List { "54", "f4", "54", "f4", "54", "f4", "54", "f4", "54", "f4", "54", "54", "f4", "54", "f4" }; - break; - case 12: - columnCodes = new List { "d6", "76", "d6", "76", "d6", "76", "d6", "76", "d6", "76", "d6", "d6", "76", "d6", "76" }; - break; - case 16: - columnCodes = new List { "58", "f8", "58", "f8", "58", "f8", "58", "f8", "58", "f8", "58", "58", "f8", "58", "f8" }; - break; - case 20: - columnCodes = new List { "da", "7a", "da", "7a", "da", "7a", "da", "7a", "da", "7a", "da", "da", "7a", "da", "7a" }; - break; - case 24: - columnCodes = new List { "dc", "7c", "dc", "7c", "dc", "7c", "dc", "7c", "dc", "7c", "dc", "dc", "7c", "dc", "7c" }; - break; - default: // 28 - columnCodes = new List { "5e", "fe", "5e", "fe", "5e", "fe", "5e", "fe", "5e", "fe", "5e", "5e", "fe", "5e", "fe" }; - break; - } - var code = rowCode + columnCodes[row]; - - if (columnRest == 1) - { - return code + " " + code + " 97a1 97a1 "; - } - - if (columnRest == 2) - { - return code + " " + code + " 97a2 97a2 "; - } - - if (columnRest == 3) - { - return $"{code} {code} 9723 9723 "; - } - - return $"{code} {code} "; - } - - private string ToTimeCode(double totalMilliseconds) - { - var ts = TimeSpan.FromMilliseconds(totalMilliseconds); - if (DropFrame) - { - return $"{ts.Hours:00}:{ts.Minutes:00}:{ts.Seconds:00};{MillisecondsToFramesMaxFrameRate(ts.Milliseconds):00}"; - } - - return $"{ts.Hours:00}:{ts.Minutes:00}:{ts.Seconds:00}:{MillisecondsToFramesMaxFrameRate(ts.Milliseconds):00}"; - } - - private static Dictionary _styleLookup; - public static SccPositionAndStyle GetColorAndPosition(string code) - { - if (_styleLookup == null) - { - _styleLookup = SccPositionAndStyleTable.SccPositionAndStyles.ToDictionary(p => p.Code, p => p); - } - - return _styleLookup.TryGetValue(code, out var style) ? style : null; - } - - public static string GetCodeFromPositionAndColor(int x, int y, FontStyle fontStyle, Color color) - { - var match = SccPositionAndStyleTable.SccPositionAndStyles.FirstOrDefault(p => p.X == x && p.Y == y && p.Style == fontStyle && p.ForeColor == color); - return match == null ? string.Empty : match.Code; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - Paragraph p = null; - foreach (string line in lines) - { - var s = line.Trim(); - var match = RegexTimeCodes.Match(s); - if (match.Success) - { - var startTime = ParseTimeCode(s.Substring(0, match.Length - 1)); - var text = GetSccText(s.Substring(match.Index), ref _errorCount); - - if (text == "942c 942c" || text == "942c") - { - if (p != null) - { - p.EndTime.TotalMilliseconds = startTime.TotalMilliseconds; - } - } - else - { - p = new Paragraph(startTime, new TimeCode(startTime.TotalMilliseconds), text); - subtitle.Paragraphs.Add(p); - } - } - } - for (int i = subtitle.Paragraphs.Count - 2; i >= 0; i--) - { - p = subtitle.GetParagraphOrDefault(i); - var next = subtitle.GetParagraphOrDefault(i + 1); - if (p != null && next != null && Math.Abs(p.EndTime.TotalMilliseconds - p.StartTime.TotalMilliseconds) < 0.001) - { - p.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds; - } - - if (next != null && string.IsNullOrEmpty(next.Text)) - { - subtitle.Paragraphs.Remove(next); - } - } - - p = subtitle.GetParagraphOrDefault(0); - if (p != null && string.IsNullOrEmpty(p.Text)) - { - subtitle.Paragraphs.Remove(p); - } - - for (var index = 0; index < subtitle.Paragraphs.Count - 1; index++) - { - var current = subtitle.Paragraphs[index]; - var next = subtitle.Paragraphs[index + 1]; - if (Math.Abs(current.EndTime.TotalMilliseconds - next.StartTime.TotalMilliseconds) < 0.01) - { - if (current.EndTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines > - current.StartTime.TotalMilliseconds) - { - current.EndTime.TotalMilliseconds -= Configuration.Settings.General.MinimumMillisecondsBetweenLines; - } - } - } - - subtitle.Renumber(); - } - - public static string GetSccText(string s, ref int errorCount) - { - int y = 0; - int x = -1; - string[] parts = s.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries); - var sb = new StringBuilder(); - bool first = true; - bool italicOn = false; - bool fontOn = false; - int k = 0; - var alignment = string.Empty; - - while (k < parts.Length) - { - string part = parts[k]; - if (part.Length == 4) - { - if (part != "94ae" && part != "9420" && part != "94ad" && part != "9426" && part != "946e" && part != "91ce" && part != "13ce" && part != "9425" && part != "9429") - { - - // skewed apostrophe "’" - if (part == "9229" && k < parts.Length - 1 && parts[k + 1] == "9229" && sb.EndsWith('\'')) - { - sb.Remove(sb.Length - 1, 1); - sb.Append("’"); - k += 2; - continue; - } - - // 3 codes - if (k < parts.Length - 2) - { - var letter = GetLetterFromCode(part + " " + parts[k + 1] + " " + parts[k + 2]); - if (letter != null) - { - sb.Append(letter); - k += 3; - continue; - } - } - - // two codes - if (k < parts.Length - 1) - { - var letter = GetLetterFromCode(part + " " + parts[k + 1]); - if (letter != null) - { - sb.Append(letter); - k += 2; - continue; - } - } - - if (part[0] == '9' || part[0] == '8') - { - if (k + 1 < parts.Length && parts[k + 1] == part) - { - k++; - } - } - - var cp = GetColorAndPosition(part); - if (cp != null) - { - if (!string.IsNullOrWhiteSpace(sb.ToString()) && cp.Y > 0 && y >= 0 && cp.Y > y && !sb.ToString().EndsWith(Environment.NewLine, StringComparison.Ordinal)) - { - sb.AppendLine(); - } - - if (cp.Y > 0) - { - y = cp.Y; - } - - x = cp.X; - - if (y < 4) - { - alignment = "{\\an8}"; - } - - if (y >= 7 && y <= 9) - { - alignment = "{\\an5}"; - } - - if (cp.ForeColor == Color.Green) - { - if (fontOn) - { - sb.Append(""); - } - sb.Append(""); - fontOn = true; - } - else if (cp.ForeColor == Color.Blue) - { - if (fontOn) - { - sb.Append(""); - } - sb.Append(""); - fontOn = true; - } - else if (cp.ForeColor == Color.Cyan) - { - if (fontOn) - { - sb.Append(""); - } - sb.Append(""); - fontOn = true; - } - else if (cp.ForeColor == Color.Red) - { - if (fontOn) - { - sb.Append(""); - } - sb.Append(""); - fontOn = true; - } - else if (cp.ForeColor == Color.Yellow) - { - if (fontOn) - { - sb.Append(""); - } - sb.Append(""); - fontOn = true; - } - else if (cp.ForeColor == Color.Magenta) - { - if (fontOn) - { - sb.Append(""); - } - sb.Append(""); - fontOn = true; - } - else if (cp.ForeColor == Color.White && fontOn) - { - sb.Append(""); - sb.Append(""); - fontOn = false; - } - else if (cp.ForeColor == Color.Black && fontOn) - { - sb.Append(""); - fontOn = false; - } - - if ((cp.Style & FontStyle.Italic) == FontStyle.Italic && !italicOn) - { - sb.Append(""); - italicOn = true; - } - else if (cp.Style == FontStyle.Regular && italicOn) - { - sb.Append(""); - italicOn = false; - } - } - else - { - switch (part) - { - case "9440": - case "94e0": - if (!sb.ToString().EndsWith(Environment.NewLine, StringComparison.Ordinal)) - { - sb.AppendLine(); - } - - break; - case "2c75": - case "2cf2": - case "2c6f": - case "2c6e": - case "2c6d": - case "2c6c": - case "2c6b": - case "2c6a": - case "2c69": - case "2c68": - case "2c67": - case "2c66": - case "2c65": - case "2c64": - case "2c63": - case "2c62": - case "2c61": - sb.Append(GetLetterFromCode(part.Substring(2, 2))); - break; - case "2c52": - case "2c94": - break; - default: - var result = GetLetterFromCode(part); - if (result == null) - { - sb.Append(GetLetterFromCode(part.Substring(0, 2))); - var secondPart = part.Substring(2, 2) + "80"; - - // 3 codes - if (k < parts.Length - 2) - { - var letter = GetLetterFromCode(secondPart + " " + parts[k + 1] + " " + parts[k + 2]); - if (letter != null) - { - sb.Append(letter); - k += 3; - continue; - } - } - - // two codes - if (k < parts.Length - 1) - { - var letter = GetLetterFromCode(secondPart + " " + parts[k + 1]); - if (letter != null) - { - sb.Append(letter); - k += 2; - continue; - } - } - - sb.Append(GetLetterFromCode(part.Substring(2, 2))); - } - else - { - sb.Append(result); - } - break; - } - } - } - } - else if (part.Length > 0) - { - if (!first) - { - errorCount++; - } - } - first = false; - k++; - } - - var leftAlign = false; - var rightAlign = false; - if (x >= 0) - { - var text = sb.ToString().Trim().SplitToLines().LastOrDefault(); - text = HtmlUtil.RemoveHtmlTags(text); - if (text != null && !string.IsNullOrEmpty(text)) - { - if (text.Length < 28) - { - if (x < 3) - { - leftAlign = true; - } - else if (x + text.Length > 30) - { - rightAlign = true; - } - } - } - } - - if (alignment == "{\\an8}" && leftAlign) - { - alignment = "{\\an7}"; - } - else if (alignment == "{\\an8}" && rightAlign) - { - alignment = "{\\an9}"; - } - else if (alignment == "{\\an5}" && leftAlign) - { - alignment = "{\\an4}"; - } - else if (alignment == "{\\an5}" && rightAlign) - { - alignment = "{\\an6}"; - } - else if (string.IsNullOrEmpty(alignment) && leftAlign) - { - alignment = "{\\an1}"; - } - else if (string.IsNullOrEmpty(alignment) && rightAlign) - { - alignment = "{\\an3}"; - } - - var res = sb.ToString().Replace("", string.Empty).Replace("", string.Empty); - if (fontOn) - { - res += ""; - } - - res = res.Replace(Environment.NewLine + "", "" + Environment.NewLine); - res = res.Replace(" ", " ").Replace(" ", " ").Replace(Environment.NewLine + " ", Environment.NewLine).Trim(); - if (res.Contains("") && !res.Contains("")) - { - res += ""; - } - - return alignment + HtmlUtil.FixInvalidItalicTags(res); - } - - private static TimeCode ParseTimeCode(string start) - { - var arr = start.Split(new[] { ':', ';', ',' }, StringSplitOptions.RemoveEmptyEntries); - return new TimeCode(int.Parse(arr[0]), int.Parse(arr[1]), int.Parse(arr[2]), FramesToMillisecondsMax999(int.Parse(arr[3]))); - } - } -} +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + + /// + /// http://www.theneitherworld.com/mcpoodle/SCC_TOOLS/DOCS/SCC_FORMAT.HTML + /// § 15.119 47 CFR Ch. I (10–1–10 Edition) (pdf) + /// Maximum four lines + max 32 characters on each line + /// + public class ScenaristClosedCaptions : SubtitleFormat + { + //00:01:00:29 9420 9420 94ae 94ae 94d0 94d0 4920 f761 7320 ... semi colon (instead of colon) before frame number is used to indicate drop frame + private const string TimeCodeRegEx = @"^\d+:\d\d:\d\d[:,]\d\d\t"; + private static readonly Regex Regex = new Regex(TimeCodeRegEx, RegexOptions.Compiled); + protected virtual Regex RegexTimeCodes => Regex; + protected bool DropFrame; + + private static readonly List> LetterDictionary = new List> + { + new KeyValuePair("20", " " ), + new KeyValuePair("a1", "!" ), + new KeyValuePair("a2", "\""), + new KeyValuePair("23", "#" ), + new KeyValuePair("a4", "$" ), + new KeyValuePair("25", "%" ), + new KeyValuePair("26", "&" ), + new KeyValuePair("a7", "'" ), + new KeyValuePair("a8", "(" ), + new KeyValuePair("29", ")" ), + new KeyValuePair("2a", "á" ), + new KeyValuePair("ab", "+" ), + new KeyValuePair("2c", "," ), + new KeyValuePair("ad", "-" ), + new KeyValuePair("ae", "." ), + new KeyValuePair("2f", "/" ), + new KeyValuePair("b0", "0" ), + new KeyValuePair("31", "1" ), + new KeyValuePair("32", "2" ), + new KeyValuePair("b3", "3" ), + new KeyValuePair("34", "4" ), + new KeyValuePair("b5", "5" ), + new KeyValuePair("b6", "6" ), + new KeyValuePair("37", "7" ), + new KeyValuePair("38", "8" ), + new KeyValuePair("b9", "9" ), + new KeyValuePair("ba", ":" ), + new KeyValuePair("3b", ";" ), + new KeyValuePair("bc", "<" ), + new KeyValuePair("3d", "=" ), + new KeyValuePair("3e", ">" ), + new KeyValuePair("bf", "?" ), + new KeyValuePair("40", "@" ), + new KeyValuePair("c1", "A" ), + new KeyValuePair("c2", "B" ), + new KeyValuePair("43", "C" ), + new KeyValuePair("c4", "D" ), + new KeyValuePair("45", "E" ), + new KeyValuePair("46", "F" ), + new KeyValuePair("c7", "G" ), + new KeyValuePair("c8", "H" ), + new KeyValuePair("49", "I" ), + new KeyValuePair("4a", "J" ), + new KeyValuePair("cb", "K" ), + new KeyValuePair("4c", "L" ), + new KeyValuePair("cd", "M" ), + new KeyValuePair("ce", "N" ), + new KeyValuePair("4f", "O" ), + new KeyValuePair("d0", "P" ), + new KeyValuePair("51", "Q" ), + new KeyValuePair("52", "R" ), + new KeyValuePair("d3", "S" ), + new KeyValuePair("54", "T" ), + new KeyValuePair("d5", "U" ), + new KeyValuePair("d6", "V" ), + new KeyValuePair("57", "W" ), + new KeyValuePair("58", "X" ), + new KeyValuePair("d9", "Y" ), + new KeyValuePair("da", "Z" ), + new KeyValuePair("5b", "[" ), + new KeyValuePair("dc", "é" ), + new KeyValuePair("5d", "]" ), + new KeyValuePair("5e", "í" ), + new KeyValuePair("df", "ó" ), + new KeyValuePair("e0", "ú" ), + new KeyValuePair("61", "a" ), + new KeyValuePair("62", "b" ), + new KeyValuePair("e3", "c" ), + new KeyValuePair("64", "d" ), + new KeyValuePair("e5", "e" ), + new KeyValuePair("e6", "f" ), + new KeyValuePair("67", "g" ), + new KeyValuePair("68", "h" ), + new KeyValuePair("e9", "i" ), + new KeyValuePair("ea", "j" ), + new KeyValuePair("6b", "k" ), + new KeyValuePair("ec", "l" ), + new KeyValuePair("6d", "m" ), + new KeyValuePair("ef", "o" ), + new KeyValuePair("70", "p" ), + new KeyValuePair("f1", "q" ), + new KeyValuePair("f2", "r" ), + new KeyValuePair("73", "s" ), + new KeyValuePair("f4", "t" ), + new KeyValuePair("75", "u" ), + new KeyValuePair("76", "v" ), + new KeyValuePair("f7", "w" ), + new KeyValuePair("f8", "x" ), + new KeyValuePair("fb", "ç" ), + new KeyValuePair("79", "y" ), + new KeyValuePair("7a", "z" ), + new KeyValuePair("7c", "" ), + new KeyValuePair("fd", "Ñ" ), + new KeyValuePair("fe", "ñ" ), + new KeyValuePair("7f", "■" ), + new KeyValuePair("7b", "ç" ), + new KeyValuePair("63", "c" ), + new KeyValuePair("65", "e" ), + new KeyValuePair("66", "f" ), + new KeyValuePair("69", "i" ), + new KeyValuePair("6a", "j" ), + new KeyValuePair("6c", "l" ), + new KeyValuePair("6e", "n" ), + new KeyValuePair("6f", "o" ), + new KeyValuePair("71", "q" ), + new KeyValuePair("72", "r" ), + new KeyValuePair("74", "t" ), + new KeyValuePair("77", "w" ), + new KeyValuePair("78", "x" ), + new KeyValuePair("91b0", "" ), + new KeyValuePair("91b3", "" ), + new KeyValuePair("91b5", "" ), + new KeyValuePair("91b6", "£" ), + new KeyValuePair("9137", "♪" ), + new KeyValuePair("9138", "à" ), + new KeyValuePair("91b9", "" ), + new KeyValuePair("91ba", "è" ), + new KeyValuePair("913b", "â" ), + new KeyValuePair("91bc", "ê" ), + new KeyValuePair("913d", "î" ), + new KeyValuePair("913e", "ô" ), + new KeyValuePair("91bf", "û" ), + new KeyValuePair("9220", "Á" ), + new KeyValuePair("92a1", "É" ), + new KeyValuePair("92a2", "Ó" ), + new KeyValuePair("9223", "Ú" ), + new KeyValuePair("92a4", "Ü" ), + new KeyValuePair("9225", "ü" ), + new KeyValuePair("9226", "'" ), + new KeyValuePair("92a7", "i" ), + new KeyValuePair("92a8", "*" ), + new KeyValuePair("9229", "'" ), + new KeyValuePair("922a", "-" ), + new KeyValuePair("92ab", "" ), + new KeyValuePair("922c", "" ), + new KeyValuePair("92ad", "\""), + new KeyValuePair("92ae", "\""), + new KeyValuePair("922f", "" ), + new KeyValuePair("92b0", "À" ), + new KeyValuePair("9231", "Â" ), + new KeyValuePair("9232", "Ç" ), + new KeyValuePair("92b3", "È" ), + new KeyValuePair("9234", "Ê" ), + new KeyValuePair("92b5", "Ë" ), + new KeyValuePair("92b6", "ë" ), + new KeyValuePair("9237", "Î" ), + new KeyValuePair("9238", "Ï" ), + new KeyValuePair("92b9", "ï" ), + new KeyValuePair("923b", "Ù" ), + new KeyValuePair("923d", "Û" ), + new KeyValuePair("923e", "" ), + new KeyValuePair("92bf", "" ), + new KeyValuePair("1320", "Ã" ), + new KeyValuePair("c1 1320", "Ã" ), + new KeyValuePair("c180 1320", "Ã" ), + new KeyValuePair("13a1", "ã" ), + new KeyValuePair("80 13a1", "ã" ), + new KeyValuePair("6180 13a1", "ã" ), + new KeyValuePair("13a2", "Í" ), + new KeyValuePair("49 13a2", "Í" ), + new KeyValuePair("4980 13a2", "Í" ), + new KeyValuePair("1323", "Ì" ), + new KeyValuePair("49 1323", "Ì" ), + new KeyValuePair("4980 1323", "Ì" ), + new KeyValuePair("13a4", "ì" ), + new KeyValuePair("e9 13a4", "ì" ), + new KeyValuePair("e980 13a4", "ì" ), + new KeyValuePair("1325", "Ò" ), + new KeyValuePair("4f 1325", "Ò" ), + new KeyValuePair("4f80 1325", "Ò" ), + new KeyValuePair("1326", "ò" ), + new KeyValuePair("ef 1326", "ò" ), + new KeyValuePair("ef80 1326", "ò" ), + new KeyValuePair("13a7", "Õ" ), + new KeyValuePair("4f 13a7", "Õ" ), + new KeyValuePair("4f80 13a7", "Õ" ), + new KeyValuePair("13a8", "õ" ), + new KeyValuePair("ef 13a8", "õ" ), + new KeyValuePair("ef80 13a8", "õ" ), + new KeyValuePair("1329", "{" ), + new KeyValuePair("132a", "}" ), + new KeyValuePair("13ab", "\\"), + new KeyValuePair("132c", "^" ), + new KeyValuePair("13ad", "_" ), + new KeyValuePair("13ae", "|" ), + new KeyValuePair("132f", "~" ), + new KeyValuePair("13b0", "Ä" ), + new KeyValuePair("c180 13b0", "Ä" ), + new KeyValuePair("1331", "ä" ), + new KeyValuePair("6180 1331", "ä" ), + new KeyValuePair("1332", "Ö" ), + new KeyValuePair("4f80 1332", "Ö" ), + new KeyValuePair("13b3", "ö" ), + new KeyValuePair("ef80 13b3", "ö" ), + new KeyValuePair("1334", "" ), + new KeyValuePair("13b5", "" ), + new KeyValuePair("13b6", "" ), + new KeyValuePair("1337", "|" ), + new KeyValuePair("1338", "Å" ), + new KeyValuePair("13b9", "å" ), + new KeyValuePair("4f80 13ba 13ba", "Ø" ), + new KeyValuePair("133b", "ø" ), + new KeyValuePair("133d", "" ), + new KeyValuePair("133e", "" ), + new KeyValuePair("13bf", "" ), + new KeyValuePair("9420", "" ), //9420=RCL, Resume Caption Loading + new KeyValuePair("94ae", "" ), //94ae=Clear Buffer + new KeyValuePair("942c", "" ), //942c=Clear Caption + new KeyValuePair("8080", "" ), //8080=Wait One Frame + new KeyValuePair("942f", "" ), //942f=Display Caption + new KeyValuePair("9440", "" ), //9440=? first sub? + new KeyValuePair("9452", "" ), //? + new KeyValuePair("9454", "" ), //? + new KeyValuePair("9470", "" ), //9470=? + new KeyValuePair("94d0", "" ), //94d0=? + new KeyValuePair("94d6", "" ), //94d6=? + new KeyValuePair("94f2", "" ), + new KeyValuePair("94f4", "" ), + new KeyValuePair("9723", " " ), // ? + new KeyValuePair("97a1", " " ), // ? + new KeyValuePair("97a2", " " ), // ? + new KeyValuePair("1370", "" ), //1370=? + new KeyValuePair("13e0", "" ), //13e0=? + new KeyValuePair("13f2", "" ), //13f2=? + new KeyValuePair("136e", "" ), //136e=? + new KeyValuePair("94ce", "" ), //94ce=? + new KeyValuePair("2c2f", "" ), //? + new KeyValuePair("1130", "®" ), + new KeyValuePair("1131", "°" ), + new KeyValuePair("1132", "½" ), + new KeyValuePair("1133", "¿" ), + new KeyValuePair("1134", "TM"), + new KeyValuePair("1135", "¢" ), + new KeyValuePair("1136", "£" ), + new KeyValuePair("1137", "♪" ), + new KeyValuePair("1138", "à" ), + new KeyValuePair("113a", "è" ), + new KeyValuePair("113b", "â" ), + new KeyValuePair("113c", "ê" ), + new KeyValuePair("113d", "î" ), + new KeyValuePair("113e", "ô" ), + new KeyValuePair("113f", "û" ), + new KeyValuePair("9130", "®" ), + new KeyValuePair("9131", "°" ), + new KeyValuePair("9132", "½" ), + new KeyValuePair("9133", "¿" ), + new KeyValuePair("9134", "TM"), + new KeyValuePair("9135", "¢" ), + new KeyValuePair("9136", "£" ), + new KeyValuePair("913a", "è" ), + new KeyValuePair("913c", "ê" ), + new KeyValuePair("913f", "û" ), + new KeyValuePair("a180 92a7 92a7", "¡" ), + new KeyValuePair("92a7 92a7", "¡" ), + new KeyValuePair("91b3 91b3", "¿" ), + + new KeyValuePair("6180 9138 9138", "à"), //61=a + new KeyValuePair("9138 9138", "à"), + + new KeyValuePair("6180 913b 913b", "â"), + new KeyValuePair("913b 913b", "â"), + + new KeyValuePair("6180 1331 1331", "ä"), + new KeyValuePair("1331 1331", "ä"), + + new KeyValuePair("e580 91ba 91ba", "è"), + new KeyValuePair("6180 91ba 91ba", "è"), + new KeyValuePair("91ba 91ba", "è"), + + new KeyValuePair("e580 91bc 91bc", "ê"), + new KeyValuePair("6180 91bc 91bc", "ê"), + new KeyValuePair("91bc 91bc", "ê"), + + + new KeyValuePair("e580 92b6 92b6", "ë"), //e5=e (+65?) + new KeyValuePair("6580 92b6 92b6", "ë"), + new KeyValuePair("92b6 92b6", "ë"), + + new KeyValuePair("e980 13a4 13a4", "ì"), //e9 = i + new KeyValuePair("13a4 13a4", "ì"), + + new KeyValuePair("e980 913d 913d", "î"), + new KeyValuePair("913d 913d", "î"), + + new KeyValuePair("e980 92b9 92b9", "ï"), + new KeyValuePair("92b9 92b9", "ï"), + + new KeyValuePair("1326 1326", "ò"), //o=ef or 6f + new KeyValuePair("ef80 1326 1326", "ò"), + new KeyValuePair("6f80 1326 1326", "ò"), + + new KeyValuePair("913e 913e", "ô"), + new KeyValuePair("ef80 913e 913e", "ô"), + new KeyValuePair("6f80 913e 913e", "ô"), + + new KeyValuePair("13b3 13b3", "ö"), + new KeyValuePair("ef80 13b3 13b3", "ö"), + new KeyValuePair("6f80 13b3 13b3", "ö"), + + new KeyValuePair("7580 13b3 13b3", "ù"), //u=75 + + new KeyValuePair("7580 92bc 92bc", "ù"), + new KeyValuePair("92bc 92bc", "ù"), + + new KeyValuePair("7580 91bf 91bf", "û"), + new KeyValuePair("91bf 91bf", "û"), + + new KeyValuePair("7580 9225 9225", "ü"), + new KeyValuePair("9225 9225", "ü"), + + new KeyValuePair("4380 9232 9232", "Ç"), //43=C + new KeyValuePair("9232 9232", "Ç"), + + new KeyValuePair("c180 1338 1338", "Å"), //c1=A + new KeyValuePair("1338 1338", "Å"), + + new KeyValuePair("c180 92b0 92b0", "À"), + new KeyValuePair("92b0 92b0", "À"), + + new KeyValuePair("c180 9220 9220", "Á"), + new KeyValuePair("9220 9220", "Á"), + + new KeyValuePair("c180 9231 9231", "Â"), + new KeyValuePair("9231 9231", "Â"), + + new KeyValuePair("c180 1320 1320", "Ã"), + new KeyValuePair("1320 1320", "Ã"), + + new KeyValuePair("c180 13b0 13b0", "Ä"), + new KeyValuePair("13b0 13b0", "Ä"), + + new KeyValuePair("4580 92b3 92b3", "È"), + new KeyValuePair("92b3 92b3", "È"), + + new KeyValuePair("4580 92a1 92a1", "É"), + new KeyValuePair("92a1 92a1", "É"), + + new KeyValuePair("4580 9234 9234", "Ê"), + new KeyValuePair("9234 9234", "Ê"), + + new KeyValuePair("4580 92b5 92b5", "Ë"), + new KeyValuePair("92b5 92b5", "Ë"), + + new KeyValuePair("4980 1323 1323", "Ì"), + new KeyValuePair("1323 1323", "Ì"), + + new KeyValuePair("4980 13a2 13a2", "Í"), + new KeyValuePair("13a2 13a2", "Í"), + + new KeyValuePair("4980 9237 9237", "Î"), + new KeyValuePair("9237 9237", "Î"), + + new KeyValuePair("4980 9238 9238", "Ï"), + new KeyValuePair("9238 9238", "Ï"), + + new KeyValuePair("4f80 92a2 92a2", "Ó"), //4f=O + new KeyValuePair("92a2 92a2", "Ó"), + + new KeyValuePair("4f80 1325 1325", "Ò"), + new KeyValuePair("1325 1325", "Ò"), + + new KeyValuePair("4f80 92ba 92ba", "Ô"), + new KeyValuePair("92ba 92ba", "Ô"), + + new KeyValuePair("4f80 13a7 13a7", "Õ"), + new KeyValuePair("13a7 13a7", "Õ"), + + new KeyValuePair("4f80 1332 1332", "Ö"), + new KeyValuePair("1332 1332", "Ö"), + + new KeyValuePair("d580 9223 9223", "Ú"), + new KeyValuePair("923d 923d", "Û"), + + new KeyValuePair("d580 923b 923b", "Ù"), + new KeyValuePair("9223 9223", "Ú"), + + new KeyValuePair("d580 92a4 92a4", "Ü"), + new KeyValuePair("92a4 92a4", "Ü"), + + new KeyValuePair("d580 923d 923d", "Û"), + }; + + private static readonly Dictionary LettersCodeLookup = LetterDictionary.ToDictionary(p => p.Key, p => p.Value); + + public override string Extension => ".scc"; + + public override string Name => "Scenarist Closed Captions"; + + private static string FixMax4LinesAndMax32CharsPerLine(string text, string language) + { + // fix attempt 1 + var lines = text.Trim().SplitToLines(); + if (IsAllOkay(lines)) + { + return text; + } + + // fix attempt 2 + text = Utilities.AutoBreakLine(text, 1, 4, language); + lines = text.Trim().SplitToLines(); + if (IsAllOkay(lines)) + { + return text; + } + + // fix attempt 3 + text = AutoBreakLineMax4Lines(text, 32); + lines = text.Trim().SplitToLines(); + if (IsAllOkay(lines)) + { + return text; + } + + var sb = new StringBuilder(); + int count = 0; + foreach (var line in lines) + { + if (count < 4) + { + sb.AppendLine(line.Length > 32 ? line.Substring(0, 32) : line); + } + count++; + } + return sb.ToString().Trim(); + } + + private static bool IsAllOkay(List lines) + { + return lines.Count <= 4 && lines.All(line => line.Length <= 32); + } + + private static int GetLastIndexOfSpace(string s, int endCount) + { + var end = Math.Min(endCount, s.Length - 1); + while (end > 0) + { + if (s[end] == ' ') + { + return end; + } + + end--; + } + return -1; + } + + private static string AutoBreakLineMax4Lines(string text, int maxLength) + { + string s = text.Replace(Environment.NewLine, " "); + s = s.Replace(" ", " "); + var sb = new StringBuilder(); + int i = GetLastIndexOfSpace(s, maxLength); + if (i > 0) + { + sb.AppendLine(s.Substring(0, i)); + s = s.Remove(0, i).Trim(); + i = s.Length <= maxLength ? s.Length : GetLastIndexOfSpace(s, maxLength); + + if (i > 0) + { + sb.AppendLine(s.Substring(0, i)); + s = s.Remove(0, i).Trim(); + i = s.Length <= maxLength ? s.Length : GetLastIndexOfSpace(s, maxLength); + + if (i > 0) + { + sb.AppendLine(s.Substring(0, i)); + s = s.Remove(0, i).Trim(); + i = s.Length <= maxLength ? s.Length : GetLastIndexOfSpace(s, maxLength); + + if (i > 0) + { + sb.AppendLine(s.Substring(0, i)); + } + else + { + sb.Append(s); + } + } + else + { + sb.Append(s); + } + } + return sb.ToString().Trim(); + } + return text; + } + + public override string ToText(Subtitle subtitle, string title) + { + var sb = new StringBuilder(); + sb.AppendLine("Scenarist_SCC V1.0"); + sb.AppendLine(); + string language = LanguageAutoDetect.AutoDetectGoogleLanguage(subtitle); + for (int i = 0; i < subtitle.Paragraphs.Count; i++) + { + var p = subtitle.Paragraphs[i]; + sb.AppendLine($"{ToTimeCode(p.StartTime.TotalMilliseconds)}\t94ae 94ae 9420 9420 {ToSccText(p.Text, language)} 942f 942f"); + sb.AppendLine(); + + var next = subtitle.GetParagraphOrDefault(i + 1); + if (next == null || Math.Abs(next.StartTime.TotalMilliseconds - p.EndTime.TotalMilliseconds) > 100) + { + sb.AppendLine($"{ToTimeCode(p.EndTime.TotalMilliseconds)}\t942c 942c"); + sb.AppendLine(); + } + } + return sb.ToString(); + } + + private static string ToSccText(string text, string language) + { + text = FixMax4LinesAndMax32CharsPerLine(text, language); + var topAlign = text.StartsWith("{\\an7}", StringComparison.Ordinal) || + text.StartsWith("{\\an8}", StringComparison.Ordinal) || + text.StartsWith("{\\an9}", StringComparison.Ordinal); + + var leftAlign = text.StartsWith("{\\an7}", StringComparison.Ordinal) || + text.StartsWith("{\\an4}", StringComparison.Ordinal) || + text.StartsWith("{\\an1}", StringComparison.Ordinal); + + var rightAlign = text.StartsWith("{\\an9}", StringComparison.Ordinal) || + text.StartsWith("{\\an6}", StringComparison.Ordinal) || + text.StartsWith("{\\an3}", StringComparison.Ordinal); + + var verticalCenter = text.StartsWith("{\\an4}", StringComparison.Ordinal) || + text.StartsWith("{\\an5}", StringComparison.Ordinal) || + text.StartsWith("{\\an6}", StringComparison.Ordinal); + + text = Utilities.RemoveSsaTags(text); + var lines = text.Trim().SplitToLines(); + int italic = 0; + var sb = new StringBuilder(); + int count = 1; + foreach (var line in lines) + { + text = line.Trim(); + if (count > 0) + { + sb.Append(' '); + } + + var centerCodes = GetCenterCodes(text, count, lines.Count, topAlign, leftAlign, rightAlign, verticalCenter); + sb.Append(centerCodes); + count++; + int i = 0; + string code = string.Empty; + if (italic > 0) + { + sb.Append("91ae 91ae "); // italic + } + + while (i < text.Length) + { + string s = text.Substring(i, 1); + string codeFromLetter = GetCodeFromLetter(s); + string newCode; + if (text.Substring(i).StartsWith("", StringComparison.Ordinal)) + { + newCode = "91ae"; + i += 2; + italic++; + } + else if (text.Substring(i).StartsWith("", StringComparison.Ordinal) && italic > 0) + { + newCode = "9120"; + i += 3; + italic--; + } + else if (text[i] == '’') + { + if (code.Length == 4) + { + sb.Append(code + " "); + code = string.Empty; + } + + if (code.Length == 0) + { + code = "80"; + } + + if (code.Length == 2) + { + code += "a7"; + sb.Append(code + " "); + } + + code = "9229"; + newCode = ""; + } + else if (codeFromLetter == null) + { + newCode = GetCodeFromLetter(" "); + } + else + { + newCode = codeFromLetter; + } + + if (code.Length == 2 && newCode.Length == 4) + { + code += "80"; + } + + if (code.Length == 4) + { + sb.Append(code + " "); + if (code.StartsWith('9') || code.StartsWith('8')) // control codes must be double + { + sb.Append(code + " "); + } + + code = string.Empty; + } + + if (code.Length == 2 && newCode.Length == 2) + { + code += newCode; + newCode = string.Empty; + } + + if (newCode.Length == 4 && code.Length == 0) + { + code = newCode; + } + else if (newCode.Length == 2 && code.Length == 0) + { + code = newCode; + } + else if (newCode.Length > 4) + { + if (code.Length == 2) + { + code += "80"; + sb.Append(code + " "); + if (code.StartsWith('9') || code.StartsWith('8')) // control codes must be double + { + sb.Append(code + " "); + } + + code = string.Empty; + } + else if (code.Length == 4) + { + sb.Append(code + " "); + if (code.StartsWith('9') || code.StartsWith('8')) // control codes must be double + { + sb.Append(code + " "); + } + + code = string.Empty; + } + + sb.Append(newCode.TrimEnd() + " "); + } + + i++; + } + + if (code.Length == 2) + { + code += "80"; + } + + if (code.Length == 4) + { + sb.Append(code); + } + } + + return sb.ToString().Trim(); + } + + private static string GetCodeFromLetter(string letter) + { + var code = LetterDictionary.FirstOrDefault(x => x.Value == letter); + if (code.Equals(new KeyValuePair())) + { + return null; + } + + return code.Key; + } + + private static string GetLetterFromCode(string hexCode) + { + return LettersCodeLookup.TryGetValue(hexCode, out var letter) ? letter : null; + } + + public static string GetCenterCodes(string text, int lineNumber, int totalLines, bool topAlign, bool leftAlign, bool rightAlign, bool verticalCenter) + { + var row = 14 - (totalLines - lineNumber); + if (topAlign) + { + row = lineNumber; + } + else if (verticalCenter) + { + row = 6 - totalLines / 2 + lineNumber; + } + var rowCodes = new List { "91", "91", "92", "92", "15", "15", "16", "16", "97", "97", "10", "13", "13", "94", "94" }; + var rowCode = rowCodes[row]; + + var left = (32 - text.Length) / 2; + if (leftAlign) + { + left = 0; + } + else if (rightAlign) + { + left = 32 - text.Length; + } + int columnRest = left % 4; + int column = left - columnRest; + + List columnCodes; + switch (column) + { + case 0: + columnCodes = new List { "d0", "70", "d0", "70", "d0", "70", "d0", "70", "d0", "70", "d0", "d0", "70", "d0", "70" }; + break; + case 4: + columnCodes = new List { "52", "f2", "52", "f2", "52", "f2", "52", "f2", "52", "f2", "52", "52", "f2", "52", "f2" }; + break; + case 8: + columnCodes = new List { "54", "f4", "54", "f4", "54", "f4", "54", "f4", "54", "f4", "54", "54", "f4", "54", "f4" }; + break; + case 12: + columnCodes = new List { "d6", "76", "d6", "76", "d6", "76", "d6", "76", "d6", "76", "d6", "d6", "76", "d6", "76" }; + break; + case 16: + columnCodes = new List { "58", "f8", "58", "f8", "58", "f8", "58", "f8", "58", "f8", "58", "58", "f8", "58", "f8" }; + break; + case 20: + columnCodes = new List { "da", "7a", "da", "7a", "da", "7a", "da", "7a", "da", "7a", "da", "da", "7a", "da", "7a" }; + break; + case 24: + columnCodes = new List { "dc", "7c", "dc", "7c", "dc", "7c", "dc", "7c", "dc", "7c", "dc", "dc", "7c", "dc", "7c" }; + break; + default: // 28 + columnCodes = new List { "5e", "fe", "5e", "fe", "5e", "fe", "5e", "fe", "5e", "fe", "5e", "5e", "fe", "5e", "fe" }; + break; + } + var code = rowCode + columnCodes[row]; + + if (columnRest == 1) + { + return code + " " + code + " 97a1 97a1 "; + } + + if (columnRest == 2) + { + return code + " " + code + " 97a2 97a2 "; + } + + if (columnRest == 3) + { + return $"{code} {code} 9723 9723 "; + } + + return $"{code} {code} "; + } + + private string ToTimeCode(double totalMilliseconds) + { + var ts = TimeSpan.FromMilliseconds(totalMilliseconds); + if (DropFrame) + { + return $"{ts.Hours:00}:{ts.Minutes:00}:{ts.Seconds:00};{MillisecondsToFramesMaxFrameRate(ts.Milliseconds):00}"; + } + + return $"{ts.Hours:00}:{ts.Minutes:00}:{ts.Seconds:00}:{MillisecondsToFramesMaxFrameRate(ts.Milliseconds):00}"; + } + + private static Dictionary _styleLookup; + public static SccPositionAndStyle GetColorAndPosition(string code) + { + if (_styleLookup == null) + { + _styleLookup = SccPositionAndStyleTable.SccPositionAndStyles.ToDictionary(p => p.Code, p => p); + } + + return _styleLookup.TryGetValue(code, out var style) ? style : null; + } + + public static string GetCodeFromPositionAndColor(int x, int y, FontStyle fontStyle, Color color) + { + var match = SccPositionAndStyleTable.SccPositionAndStyles.FirstOrDefault(p => p.X == x && p.Y == y && p.Style == fontStyle && p.ForeColor == color); + return match == null ? string.Empty : match.Code; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + Paragraph p = null; + foreach (string line in lines) + { + var s = line.Trim(); + var match = RegexTimeCodes.Match(s); + if (match.Success) + { + var startTime = ParseTimeCode(s.Substring(0, match.Length - 1)); + var text = GetSccText(s.Substring(match.Index), ref _errorCount); + + if (text == "942c 942c" || text == "942c") + { + if (p != null) + { + p.EndTime.TotalMilliseconds = startTime.TotalMilliseconds; + } + } + else + { + p = new Paragraph(startTime, new TimeCode(startTime.TotalMilliseconds), text); + subtitle.Paragraphs.Add(p); + } + } + } + for (int i = subtitle.Paragraphs.Count - 2; i >= 0; i--) + { + p = subtitle.GetParagraphOrDefault(i); + var next = subtitle.GetParagraphOrDefault(i + 1); + if (p != null && next != null && Math.Abs(p.EndTime.TotalMilliseconds - p.StartTime.TotalMilliseconds) < 0.001) + { + p.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds; + } + + if (next != null && string.IsNullOrEmpty(next.Text)) + { + subtitle.Paragraphs.Remove(next); + } + } + + p = subtitle.GetParagraphOrDefault(0); + if (p != null && string.IsNullOrEmpty(p.Text)) + { + subtitle.Paragraphs.Remove(p); + } + + for (var index = 0; index < subtitle.Paragraphs.Count - 1; index++) + { + var current = subtitle.Paragraphs[index]; + var next = subtitle.Paragraphs[index + 1]; + if (Math.Abs(current.EndTime.TotalMilliseconds - next.StartTime.TotalMilliseconds) < 0.01) + { + if (current.EndTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines > + current.StartTime.TotalMilliseconds) + { + current.EndTime.TotalMilliseconds -= Configuration.Settings.General.MinimumMillisecondsBetweenLines; + } + } + } + + subtitle.Renumber(); + } + + public static string GetSccText(string s, ref int errorCount) + { + int y = 0; + int x = -1; + string[] parts = s.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries); + var sb = new StringBuilder(); + bool first = true; + bool italicOn = false; + bool fontOn = false; + int k = 0; + var alignment = string.Empty; + + while (k < parts.Length) + { + string part = parts[k]; + if (part.Length == 4) + { + if (part != "94ae" && part != "9420" && part != "94ad" && part != "9426" && part != "946e" && part != "91ce" && part != "13ce" && part != "9425" && part != "9429") + { + + // skewed apostrophe "’" + if (part == "9229" && k < parts.Length - 1 && parts[k + 1] == "9229" && sb.EndsWith('\'')) + { + sb.Remove(sb.Length - 1, 1); + sb.Append("’"); + k += 2; + continue; + } + + // 3 codes + if (k < parts.Length - 2) + { + var letter = GetLetterFromCode(part + " " + parts[k + 1] + " " + parts[k + 2]); + if (letter != null) + { + sb.Append(letter); + k += 3; + continue; + } + } + + // two codes + if (k < parts.Length - 1) + { + var letter = GetLetterFromCode(part + " " + parts[k + 1]); + if (letter != null) + { + sb.Append(letter); + k += 2; + continue; + } + } + + if (part[0] == '9' || part[0] == '8') + { + if (k + 1 < parts.Length && parts[k + 1] == part) + { + k++; + } + } + + var cp = GetColorAndPosition(part); + if (cp != null) + { + if (!string.IsNullOrWhiteSpace(sb.ToString()) && cp.Y > 0 && y >= 0 && cp.Y > y && !sb.ToString().EndsWith(Environment.NewLine, StringComparison.Ordinal)) + { + sb.AppendLine(); + } + + if (cp.Y > 0) + { + y = cp.Y; + } + + x = cp.X; + + if (y < 4) + { + alignment = "{\\an8}"; + } + + if (y >= 7 && y <= 9) + { + alignment = "{\\an5}"; + } + + if (cp.ForeColor == Color.Green) + { + if (fontOn) + { + sb.Append(""); + } + sb.Append(""); + fontOn = true; + } + else if (cp.ForeColor == Color.Blue) + { + if (fontOn) + { + sb.Append(""); + } + sb.Append(""); + fontOn = true; + } + else if (cp.ForeColor == Color.Cyan) + { + if (fontOn) + { + sb.Append(""); + } + sb.Append(""); + fontOn = true; + } + else if (cp.ForeColor == Color.Red) + { + if (fontOn) + { + sb.Append(""); + } + sb.Append(""); + fontOn = true; + } + else if (cp.ForeColor == Color.Yellow) + { + if (fontOn) + { + sb.Append(""); + } + sb.Append(""); + fontOn = true; + } + else if (cp.ForeColor == Color.Magenta) + { + if (fontOn) + { + sb.Append(""); + } + sb.Append(""); + fontOn = true; + } + else if (cp.ForeColor == Color.White && fontOn) + { + sb.Append(""); + sb.Append(""); + fontOn = false; + } + else if (cp.ForeColor == Color.Black && fontOn) + { + sb.Append(""); + fontOn = false; + } + + if ((cp.Style & FontStyle.Italic) == FontStyle.Italic && !italicOn) + { + sb.Append(""); + italicOn = true; + } + else if (cp.Style == FontStyle.Regular && italicOn) + { + sb.Append(""); + italicOn = false; + } + } + else + { + switch (part) + { + case "9440": + case "94e0": + if (!sb.ToString().EndsWith(Environment.NewLine, StringComparison.Ordinal)) + { + sb.AppendLine(); + } + + break; + case "2c75": + case "2cf2": + case "2c6f": + case "2c6e": + case "2c6d": + case "2c6c": + case "2c6b": + case "2c6a": + case "2c69": + case "2c68": + case "2c67": + case "2c66": + case "2c65": + case "2c64": + case "2c63": + case "2c62": + case "2c61": + sb.Append(GetLetterFromCode(part.Substring(2, 2))); + break; + case "2c52": + case "2c94": + break; + default: + var result = GetLetterFromCode(part); + if (result == null) + { + sb.Append(GetLetterFromCode(part.Substring(0, 2))); + var secondPart = part.Substring(2, 2) + "80"; + + // 3 codes + if (k < parts.Length - 2) + { + var letter = GetLetterFromCode(secondPart + " " + parts[k + 1] + " " + parts[k + 2]); + if (letter != null) + { + sb.Append(letter); + k += 3; + continue; + } + } + + // two codes + if (k < parts.Length - 1) + { + var letter = GetLetterFromCode(secondPart + " " + parts[k + 1]); + if (letter != null) + { + sb.Append(letter); + k += 2; + continue; + } + } + + sb.Append(GetLetterFromCode(part.Substring(2, 2))); + } + else + { + sb.Append(result); + } + break; + } + } + } + } + else if (part.Length > 0) + { + if (!first) + { + errorCount++; + } + } + first = false; + k++; + } + + var leftAlign = false; + var rightAlign = false; + if (x >= 0) + { + var text = sb.ToString().Trim().SplitToLines().LastOrDefault(); + text = HtmlUtil.RemoveHtmlTags(text); + if (text != null && !string.IsNullOrEmpty(text)) + { + if (text.Length < 28) + { + if (x < 3) + { + leftAlign = true; + } + else if (x + text.Length > 30) + { + rightAlign = true; + } + } + } + } + + if (alignment == "{\\an8}" && leftAlign) + { + alignment = "{\\an7}"; + } + else if (alignment == "{\\an8}" && rightAlign) + { + alignment = "{\\an9}"; + } + else if (alignment == "{\\an5}" && leftAlign) + { + alignment = "{\\an4}"; + } + else if (alignment == "{\\an5}" && rightAlign) + { + alignment = "{\\an6}"; + } + else if (string.IsNullOrEmpty(alignment) && leftAlign) + { + alignment = "{\\an1}"; + } + else if (string.IsNullOrEmpty(alignment) && rightAlign) + { + alignment = "{\\an3}"; + } + + var res = sb.ToString().Replace("", string.Empty).Replace("", string.Empty); + if (fontOn) + { + res += ""; + } + + res = res.Replace(Environment.NewLine + "", "" + Environment.NewLine); + res = res.Replace(" ", " ").Replace(" ", " ").Replace(Environment.NewLine + " ", Environment.NewLine).Trim(); + if (res.Contains("") && !res.Contains("")) + { + res += ""; + } + + return alignment + HtmlUtil.FixInvalidItalicTags(res); + } + + private static TimeCode ParseTimeCode(string start) + { + var arr = start.Split(new[] { ':', ';', ',' }, StringSplitOptions.RemoveEmptyEntries); + return new TimeCode(int.Parse(arr[0]), int.Parse(arr[1]), int.Parse(arr[2]), FramesToMillisecondsMax999(int.Parse(arr[3]))); + } + } +} diff --git a/libse/SubtitleFormats/ScenaristClosedCaptionsDropFrame.cs b/src/libse/SubtitleFormats/ScenaristClosedCaptionsDropFrame.cs similarity index 97% rename from libse/SubtitleFormats/ScenaristClosedCaptionsDropFrame.cs rename to src/libse/SubtitleFormats/ScenaristClosedCaptionsDropFrame.cs index 4066616f3..25e03a7fd 100644 --- a/libse/SubtitleFormats/ScenaristClosedCaptionsDropFrame.cs +++ b/src/libse/SubtitleFormats/ScenaristClosedCaptionsDropFrame.cs @@ -1,18 +1,18 @@ -using System.Text.RegularExpressions; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class ScenaristClosedCaptionsDropFrame : ScenaristClosedCaptions - { - //00:01:00:29 9420 9420 94ae 94ae 94d0 94d0 4920 f761 7320 ... semi colon (instead of colon) before frame number is used to indicate drop frame - private const string TimeCodeRegEx = @"^\d+:\d\d:\d\d[;,]\d\d\t"; - private static readonly Regex Regex = new Regex(TimeCodeRegEx, RegexOptions.Compiled); - protected override Regex RegexTimeCodes => Regex; - public override string Name => "Scenarist Closed Captions Drop Frame"; - - public ScenaristClosedCaptionsDropFrame() - { - DropFrame = true; - } - } -} +using System.Text.RegularExpressions; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class ScenaristClosedCaptionsDropFrame : ScenaristClosedCaptions + { + //00:01:00:29 9420 9420 94ae 94ae 94d0 94d0 4920 f761 7320 ... semi colon (instead of colon) before frame number is used to indicate drop frame + private const string TimeCodeRegEx = @"^\d+:\d\d:\d\d[;,]\d\d\t"; + private static readonly Regex Regex = new Regex(TimeCodeRegEx, RegexOptions.Compiled); + protected override Regex RegexTimeCodes => Regex; + public override string Name => "Scenarist Closed Captions Drop Frame"; + + public ScenaristClosedCaptionsDropFrame() + { + DropFrame = true; + } + } +} diff --git a/libse/SubtitleFormats/SeImageHtmlIndex.cs b/src/libse/SubtitleFormats/SeImageHtmlIndex.cs similarity index 97% rename from libse/SubtitleFormats/SeImageHtmlIndex.cs rename to src/libse/SubtitleFormats/SeImageHtmlIndex.cs index 99e684588..9ac3b830d 100644 --- a/libse/SubtitleFormats/SeImageHtmlIndex.cs +++ b/src/libse/SubtitleFormats/SeImageHtmlIndex.cs @@ -1,87 +1,87 @@ -using System; -using System.Collections.Generic; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - /// - /// Export from Subtitle Edit OCR window - /// - public class SeImageHtmlIndex : SubtitleFormat - { - private static readonly Regex RegexTimeCodes = new Regex(@"^#\d+:\d+", RegexOptions.Compiled); - - public override string Extension => ".html"; - - public override string Name => "SE image HTML index"; - - public override bool IsMine(List lines, string fileName) - { - if (fileName != null && !fileName.EndsWith(Extension, StringComparison.OrdinalIgnoreCase)) - { - return false; - } - - return base.IsMine(lines, fileName); - } - - public override string ToText(Subtitle subtitle, string title) - { - throw new NotImplementedException(); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - foreach (string line in lines) - { - if (line.Contains(".png") && RegexTimeCodes.IsMatch(line)) - { - int idx = line.IndexOf(" 0) - { - try - { - var s = line.Replace(">", ">").Substring(0, idx); - s = s.Remove(0, s.IndexOf(':') + 1); - var arr = s.Split(new[] { '-', '>' }, StringSplitOptions.RemoveEmptyEntries); - var p = new Paragraph { StartTime = DecodeTimeCode(arr[0]), EndTime = DecodeTimeCode(arr[1]) }; - int start = line.IndexOf("', ',', '.' }, StringSplitOptions.RemoveEmptyEntries); - int milliseconds = int.Parse(parts[parts.Length - 1]); - int seconds = int.Parse(parts[parts.Length - 2]); - int minutes = 0; - if (parts.Length > 2) - { - minutes = int.Parse(parts[parts.Length - 3]); - } - - int hour = 0; - if (parts.Length > 3) - { - hour = int.Parse(parts[parts.Length - 4]); - } - - return new TimeCode(hour, minutes, seconds, milliseconds); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + /// + /// Export from Subtitle Edit OCR window + /// + public class SeImageHtmlIndex : SubtitleFormat + { + private static readonly Regex RegexTimeCodes = new Regex(@"^#\d+:\d+", RegexOptions.Compiled); + + public override string Extension => ".html"; + + public override string Name => "SE image HTML index"; + + public override bool IsMine(List lines, string fileName) + { + if (fileName != null && !fileName.EndsWith(Extension, StringComparison.OrdinalIgnoreCase)) + { + return false; + } + + return base.IsMine(lines, fileName); + } + + public override string ToText(Subtitle subtitle, string title) + { + throw new NotImplementedException(); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + foreach (string line in lines) + { + if (line.Contains(".png") && RegexTimeCodes.IsMatch(line)) + { + int idx = line.IndexOf(" 0) + { + try + { + var s = line.Replace(">", ">").Substring(0, idx); + s = s.Remove(0, s.IndexOf(':') + 1); + var arr = s.Split(new[] { '-', '>' }, StringSplitOptions.RemoveEmptyEntries); + var p = new Paragraph { StartTime = DecodeTimeCode(arr[0]), EndTime = DecodeTimeCode(arr[1]) }; + int start = line.IndexOf("', ',', '.' }, StringSplitOptions.RemoveEmptyEntries); + int milliseconds = int.Parse(parts[parts.Length - 1]); + int seconds = int.Parse(parts[parts.Length - 2]); + int minutes = 0; + if (parts.Length > 2) + { + minutes = int.Parse(parts[parts.Length - 3]); + } + + int hour = 0; + if (parts.Length > 3) + { + hour = int.Parse(parts[parts.Length - 4]); + } + + return new TimeCode(hour, minutes, seconds, milliseconds); + } + + } +} diff --git a/libse/SubtitleFormats/SmilTimesheetData.cs b/src/libse/SubtitleFormats/SmilTimesheetData.cs similarity index 97% rename from libse/SubtitleFormats/SmilTimesheetData.cs rename to src/libse/SubtitleFormats/SmilTimesheetData.cs index df39e4fd7..dcb50f2f4 100644 --- a/libse/SubtitleFormats/SmilTimesheetData.cs +++ b/src/libse/SubtitleFormats/SmilTimesheetData.cs @@ -1,236 +1,236 @@ -using System; -using System.Collections.Generic; -using System.Net; -using System.Text; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - /// - /// http://wam.inrialpes.fr/timesheets/annotations/video.html - /// - public class SmilTimesheetData : SubtitleFormat - { - public override string Extension => ".html"; - - public override string Name => "SMIL Timesheet"; - - public override bool IsMine(List lines, string fileName) - { - var sb = new StringBuilder(); - foreach (string l in lines) - { - sb.AppendLine(l); - } - - if (!sb.ToString().Contains(" data-begin")) - { - return false; - } - - return base.IsMine(lines, fileName); - } - - public override string ToText(Subtitle subtitle, string title) - { - string header = -@" - -" + Environment.NewLine + -"\t" + Environment.NewLine + -"\tSMIL Timesheet" + @" - -" + Environment.NewLine + -"\t
" + Environment.NewLine + -"\t\t" + Environment.NewLine; - - const string paragraphWriteFormatOpen = "\t\t

\r\n{1}\r\n

"; - const string paragraphWriteFormat = "\t\t

\r\n{2}\r\n

"; - int count = 1; - var sb = new StringBuilder(); - sb.AppendLine(header.Replace("_TITLE_", title)); - foreach (Paragraph p in subtitle.Paragraphs) - { - Paragraph next = subtitle.GetParagraphOrDefault(count); - string text = p.Text; - if (next != null && Math.Abs(next.StartTime.TotalMilliseconds - p.EndTime.TotalMilliseconds) < 100) - { - sb.AppendLine(string.Format(paragraphWriteFormatOpen, EncodeTime(p.StartTime), text)); - } - else - { - sb.AppendLine(string.Format(paragraphWriteFormat, EncodeTime(p.StartTime), EncodeTime(p.EndTime), text)); - } - - count++; - } - sb.AppendLine("\t
"); - sb.AppendLine(""); - sb.AppendLine(""); - return sb.ToString().Trim(); - } - - private static string EncodeTime(TimeCode time) - { - //3:15:22 - if (time.Hours > 0) - { - return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}.{time.Milliseconds / 10:00}"; - } - - if (time.Minutes > 9) - { - return $"{time.Minutes:00}:{time.Seconds:00}.{time.Milliseconds / 10:00}"; - } - - return $"{time.Minutes}:{time.Seconds:00}.{time.Milliseconds / 10:00}"; - } - - private static TimeCode DecodeTimeCode(string[] s) - { - if (s.Length == 3) - { - return new TimeCode(0, int.Parse(s[0]), int.Parse(s[1]), int.Parse(s[2]) * 10); - } - - return new TimeCode(int.Parse(s[0]), int.Parse(s[1]), int.Parse(s[2]), int.Parse(s[3]) * 10); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - var sb = new StringBuilder(); - foreach (string l in lines) - { - sb.AppendLine(l); - } - - string allInput = sb.ToString(); - string allInputLower = allInput.ToLowerInvariant(); - const string syncTag = "

= 0) - { - var syncEndPos = allInputLower.IndexOf("

", index, StringComparison.Ordinal); - if (syncEndPos > 0) - { - string s = allInput.Substring(syncStartPos + 2, syncEndPos - syncStartPos - 2); - int indexOfBegin = s.IndexOf(" data-begin=", StringComparison.Ordinal); - int indexOfAttributesEnd = s.IndexOf('>'); - if (indexOfBegin >= 0 && indexOfAttributesEnd > indexOfBegin) - { - string text = s.Substring(indexOfAttributesEnd + 1).Trim(); - text = text.Replace("
", Environment.NewLine); - text = text.Replace("
", Environment.NewLine); - text = text.Replace("
", Environment.NewLine); - text = text.Replace("\t", " "); - while (text.Contains(" ")) - { - text = text.Replace(" ", " "); - } - - while (text.Contains(Environment.NewLine + " ")) - { - text = text.Replace(Environment.NewLine + " ", Environment.NewLine); - } - - while (text.Contains(Environment.NewLine + Environment.NewLine)) - { - text = text.Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); - } - - string begin = s.Substring(indexOfBegin + " data-begin=".Length); - tcBegin.Clear(); - for (int i = 0; i <= 10; i++) - { - if (begin.Length > i && @"0123456789:.".Contains(begin[i])) - { - tcBegin.Append(begin[i]); - } - } - - tcEnd.Clear(); - var indexOfEnd = s.IndexOf(" data-end=", StringComparison.Ordinal); - if (indexOfEnd >= 0) - { - string end = s.Substring(indexOfEnd + " data-end=".Length); - for (int i = 0; i <= 10; i++) - { - if (end.Length > i && @"0123456789:.".Contains(end[i])) - { - tcEnd.Append(end[i]); - } - } - } - - var arr = tcBegin.ToString().Split(splitChars, StringSplitOptions.RemoveEmptyEntries); - if (arr.Length == 3 || arr.Length == 4) - { - var p = new Paragraph { Text = text }; - try - { - p.StartTime = DecodeTimeCode(arr); - if (tcEnd.Length > 0) - { - arr = tcEnd.ToString().Split(splitChars, StringSplitOptions.RemoveEmptyEntries); - p.EndTime = DecodeTimeCode(arr); - } - subtitle.Paragraphs.Add(p); - } - catch - { - _errorCount++; - } - } - } - } - if (syncEndPos <= 0) - { - syncStartPos = -1; - } - else - { - syncStartPos = allInputLower.IndexOf(syncTag, syncEndPos, StringComparison.Ordinal); - index = syncStartPos + syncTag.Length; - } - } - - index = 1; - foreach (Paragraph paragraph in subtitle.Paragraphs) - { - Paragraph next = subtitle.GetParagraphOrDefault(index); - if (next != null) - { - paragraph.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - 1; - } - else if (paragraph.EndTime.TotalMilliseconds < 50) - { - paragraph.EndTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(paragraph.Text); - } - if (paragraph.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) - { - paragraph.EndTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(paragraph.Text); - } - index++; - } - - foreach (Paragraph p2 in subtitle.Paragraphs) - { - p2.Text = WebUtility.HtmlDecode(p2.Text); - } - - subtitle.Renumber(); - } - - } -} +using System; +using System.Collections.Generic; +using System.Net; +using System.Text; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + /// + /// http://wam.inrialpes.fr/timesheets/annotations/video.html + /// + public class SmilTimesheetData : SubtitleFormat + { + public override string Extension => ".html"; + + public override string Name => "SMIL Timesheet"; + + public override bool IsMine(List lines, string fileName) + { + var sb = new StringBuilder(); + foreach (string l in lines) + { + sb.AppendLine(l); + } + + if (!sb.ToString().Contains(" data-begin")) + { + return false; + } + + return base.IsMine(lines, fileName); + } + + public override string ToText(Subtitle subtitle, string title) + { + string header = +@" + +" + Environment.NewLine + +"\t" + Environment.NewLine + +"\tSMIL Timesheet" + @" + +" + Environment.NewLine + +"\t
" + Environment.NewLine + +"\t\t" + Environment.NewLine; + + const string paragraphWriteFormatOpen = "\t\t

\r\n{1}\r\n

"; + const string paragraphWriteFormat = "\t\t

\r\n{2}\r\n

"; + int count = 1; + var sb = new StringBuilder(); + sb.AppendLine(header.Replace("_TITLE_", title)); + foreach (Paragraph p in subtitle.Paragraphs) + { + Paragraph next = subtitle.GetParagraphOrDefault(count); + string text = p.Text; + if (next != null && Math.Abs(next.StartTime.TotalMilliseconds - p.EndTime.TotalMilliseconds) < 100) + { + sb.AppendLine(string.Format(paragraphWriteFormatOpen, EncodeTime(p.StartTime), text)); + } + else + { + sb.AppendLine(string.Format(paragraphWriteFormat, EncodeTime(p.StartTime), EncodeTime(p.EndTime), text)); + } + + count++; + } + sb.AppendLine("\t
"); + sb.AppendLine(""); + sb.AppendLine(""); + return sb.ToString().Trim(); + } + + private static string EncodeTime(TimeCode time) + { + //3:15:22 + if (time.Hours > 0) + { + return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}.{time.Milliseconds / 10:00}"; + } + + if (time.Minutes > 9) + { + return $"{time.Minutes:00}:{time.Seconds:00}.{time.Milliseconds / 10:00}"; + } + + return $"{time.Minutes}:{time.Seconds:00}.{time.Milliseconds / 10:00}"; + } + + private static TimeCode DecodeTimeCode(string[] s) + { + if (s.Length == 3) + { + return new TimeCode(0, int.Parse(s[0]), int.Parse(s[1]), int.Parse(s[2]) * 10); + } + + return new TimeCode(int.Parse(s[0]), int.Parse(s[1]), int.Parse(s[2]), int.Parse(s[3]) * 10); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + var sb = new StringBuilder(); + foreach (string l in lines) + { + sb.AppendLine(l); + } + + string allInput = sb.ToString(); + string allInputLower = allInput.ToLowerInvariant(); + const string syncTag = "

= 0) + { + var syncEndPos = allInputLower.IndexOf("

", index, StringComparison.Ordinal); + if (syncEndPos > 0) + { + string s = allInput.Substring(syncStartPos + 2, syncEndPos - syncStartPos - 2); + int indexOfBegin = s.IndexOf(" data-begin=", StringComparison.Ordinal); + int indexOfAttributesEnd = s.IndexOf('>'); + if (indexOfBegin >= 0 && indexOfAttributesEnd > indexOfBegin) + { + string text = s.Substring(indexOfAttributesEnd + 1).Trim(); + text = text.Replace("
", Environment.NewLine); + text = text.Replace("
", Environment.NewLine); + text = text.Replace("
", Environment.NewLine); + text = text.Replace("\t", " "); + while (text.Contains(" ")) + { + text = text.Replace(" ", " "); + } + + while (text.Contains(Environment.NewLine + " ")) + { + text = text.Replace(Environment.NewLine + " ", Environment.NewLine); + } + + while (text.Contains(Environment.NewLine + Environment.NewLine)) + { + text = text.Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); + } + + string begin = s.Substring(indexOfBegin + " data-begin=".Length); + tcBegin.Clear(); + for (int i = 0; i <= 10; i++) + { + if (begin.Length > i && @"0123456789:.".Contains(begin[i])) + { + tcBegin.Append(begin[i]); + } + } + + tcEnd.Clear(); + var indexOfEnd = s.IndexOf(" data-end=", StringComparison.Ordinal); + if (indexOfEnd >= 0) + { + string end = s.Substring(indexOfEnd + " data-end=".Length); + for (int i = 0; i <= 10; i++) + { + if (end.Length > i && @"0123456789:.".Contains(end[i])) + { + tcEnd.Append(end[i]); + } + } + } + + var arr = tcBegin.ToString().Split(splitChars, StringSplitOptions.RemoveEmptyEntries); + if (arr.Length == 3 || arr.Length == 4) + { + var p = new Paragraph { Text = text }; + try + { + p.StartTime = DecodeTimeCode(arr); + if (tcEnd.Length > 0) + { + arr = tcEnd.ToString().Split(splitChars, StringSplitOptions.RemoveEmptyEntries); + p.EndTime = DecodeTimeCode(arr); + } + subtitle.Paragraphs.Add(p); + } + catch + { + _errorCount++; + } + } + } + } + if (syncEndPos <= 0) + { + syncStartPos = -1; + } + else + { + syncStartPos = allInputLower.IndexOf(syncTag, syncEndPos, StringComparison.Ordinal); + index = syncStartPos + syncTag.Length; + } + } + + index = 1; + foreach (Paragraph paragraph in subtitle.Paragraphs) + { + Paragraph next = subtitle.GetParagraphOrDefault(index); + if (next != null) + { + paragraph.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - 1; + } + else if (paragraph.EndTime.TotalMilliseconds < 50) + { + paragraph.EndTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(paragraph.Text); + } + if (paragraph.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) + { + paragraph.EndTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(paragraph.Text); + } + index++; + } + + foreach (Paragraph p2 in subtitle.Paragraphs) + { + p2.Text = WebUtility.HtmlDecode(p2.Text); + } + + subtitle.Renumber(); + } + + } +} diff --git a/libse/SubtitleFormats/SmpteTt2052.cs b/src/libse/SubtitleFormats/SmpteTt2052.cs similarity index 100% rename from libse/SubtitleFormats/SmpteTt2052.cs rename to src/libse/SubtitleFormats/SmpteTt2052.cs diff --git a/libse/SubtitleFormats/SoftNiColonSub.cs b/src/libse/SubtitleFormats/SoftNiColonSub.cs similarity index 97% rename from libse/SubtitleFormats/SoftNiColonSub.cs rename to src/libse/SubtitleFormats/SoftNiColonSub.cs index 14ca011ea..4a49a15de 100644 --- a/libse/SubtitleFormats/SoftNiColonSub.cs +++ b/src/libse/SubtitleFormats/SoftNiColonSub.cs @@ -1,229 +1,229 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - /// - /// SoftNi - http://www.softni.com/ - /// - public class SoftNicolonSub : SubtitleFormat - { - private static readonly Regex regexTimeCodes = new Regex(@"^\d\d:\d\d:\d\d:\d\d\\\d\d:\d\d:\d\d:\d\d$", RegexOptions.Compiled); - - public override string Extension => ".sub"; - - public override string Name => "SoftNi colon sub"; - - public override string ToText(Subtitle subtitle, string title) - { - var sb = new StringBuilder(); - var lineSb = new StringBuilder(); - sb.AppendLine("*PART 1*"); - sb.AppendLine("00:00:00:00\\00:00:00:00"); - foreach (Paragraph p in subtitle.Paragraphs) - { - string text = p.Text; - bool positionTop = false; - - // If text starts with {\an8}, subtitle appears at the top - if (text.StartsWith("{\\an8}", StringComparison.Ordinal)) - { - positionTop = true; - // Remove the tag {\an8}. - text = text.Remove(0, 6); - } - - // Split lines (split a subtitle into its lines) - var lines = text.SplitToLines(); - int count = 0; - lineSb.Clear(); - bool nextLineInItalics = false; - foreach (string line in lines) - { - // Append line break in every line except the first one - if (count > 0) - { - lineSb.Append(Environment.NewLine); - } - - var tempLine = line; - - // This line should be in italics (it was detected in previous line) - if (nextLineInItalics) - { - tempLine = "" + tempLine; - nextLineInItalics = false; - } - - if (tempLine.StartsWith("", StringComparison.Ordinal) && tempLine.EndsWith("", StringComparison.Ordinal)) - { - // Whole line is in italics - // Remove from the beginning - tempLine = tempLine.Remove(0, 3); - // Remove from the end - tempLine = tempLine.Remove(tempLine.Length - 4, 4); - // Add new italics tag at the beginning - tempLine = "[" + tempLine; - } - else if (tempLine.StartsWith("", StringComparison.Ordinal) && Utilities.CountTagInText(tempLine, "") > Utilities.CountTagInText(tempLine, "")) - { - // Line starts with but italics are not closed. So the next line should be in italics - nextLineInItalics = true; - } - lineSb.Append(tempLine); - count++; - - text = lineSb.ToString(); - // Replace remaining italics tags - text = text.Replace("", @"["); - text = text.Replace("", @"]"); - text = HtmlUtil.RemoveHtmlTags(text); - } - - // Add top-position SoftNI marker "}" at the beginning of first line. - if (positionTop) - { - text = "}" + text; - } - - sb.AppendLine($"{text}{Environment.NewLine}{p.StartTime.ToHHMMSSPeriodFF().Replace(".", ":")}\\{p.EndTime.ToHHMMSSPeriodFF().Replace(".", ":")}"); - } - sb.AppendLine(@"*END*"); - sb.AppendLine(@"...........\..........."); - sb.AppendLine(@"*CODE*"); - sb.AppendLine(@"0000000000000000"); - sb.AppendLine(@"*CAST*"); - sb.AppendLine(@"*GENERATOR*"); - sb.AppendLine(@"*FONTS*"); - sb.AppendLine(@"*READ*"); - sb.AppendLine(@"0,300 15,000 130,000 100,000 25,000"); - sb.AppendLine(@"*TIMING*"); - sb.AppendLine(@"1 25 0"); - sb.AppendLine(@"*TIMED BACKUP NAME*"); - sb.AppendLine(@"C:\"); - sb.AppendLine(@"*FORMAT SAMPLE ÅåÉéÌìÕõÛûÿ*"); - sb.AppendLine(@"*READ ADVANCED*"); - sb.AppendLine(@"< > 1 1 0,300"); - sb.AppendLine(@"*MARKERS*"); - return sb.ToString(); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - DoLoadSubtitle(subtitle, lines); - } - - private void DoLoadSubtitle(Subtitle subtitle, List lines) - { - //—Peter. - //—Estoy de licencia. - //01:48:50.07\01:48:52.01 - var sb = new StringBuilder(); - var lineSb = new StringBuilder(); - Paragraph p = null; - subtitle.Paragraphs.Clear(); - char[] splitChars = { ':', '.' }; - foreach (string line in lines) - { - string s = line.Trim(); - if (regexTimeCodes.IsMatch(s)) - { - // Start and end time separated by "\" - var temp = s.Split('\\'); - if (temp.Length > 1) - { - string start = temp[0]; - string end = temp[1]; - - string[] startParts = start.Split(splitChars, StringSplitOptions.RemoveEmptyEntries); - string[] endParts = end.Split(splitChars, StringSplitOptions.RemoveEmptyEntries); - if (startParts.Length == 4 && endParts.Length == 4) - { - try - { - p = new Paragraph - { - StartTime = DecodeTimeCodeFramesFourParts(startParts), - EndTime = DecodeTimeCodeFramesFourParts(endParts) - }; - string text = sb.ToString().Trim(); - - bool positionTop = false; - // If text starts with "}", subtitle appears at the top - if (text.StartsWith('}')) - { - positionTop = true; - // Remove the tag "}" - text = text.Remove(0, 1); - } - // Replace tags - text = text.Replace("[", @""); - text = text.Replace("]", @""); - - // Split subtitle lines (one subtitle has one or more lines) - var subtitleLines = text.SplitToLines(); - int count = 0; - lineSb.Clear(); - foreach (string subtitleLine in subtitleLines) - { - // Append line break in every line except the first one - if (count > 0) - { - lineSb.Append(Environment.NewLine); - } - - var tempLine = subtitleLine; - // Close italics in every line (if next line is in italics, SoftNI will use "[" at the beginning) - if (Utilities.CountTagInText(tempLine, "") > Utilities.CountTagInText(tempLine, "")) - { - tempLine = tempLine + ""; - } - - lineSb.Append(tempLine); - count++; - } - text = lineSb.ToString(); - - // Replace "line break" with just a line break (SubRip does not need to close italics and open them again in the next line). - text = text.Replace("" + Environment.NewLine + "", Environment.NewLine); - - // Subtitle appears at the top (add tag) - if (positionTop) - { - text = "{\\an8}" + text; - } - - p.Text = text; - if (text.Length > 0) - { - subtitle.Paragraphs.Add(p); - } - - sb.Clear(); - } - catch (Exception exception) - { - _errorCount++; - System.Diagnostics.Debug.WriteLine(exception.Message); - } - } - } - } - else if (string.IsNullOrWhiteSpace(line) || line.StartsWith('*')) - { - // skip empty lines or start - } - else if (p != null) - { - sb.AppendLine(line); - } - } - - subtitle.Renumber(); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + /// + /// SoftNi - http://www.softni.com/ + /// + public class SoftNicolonSub : SubtitleFormat + { + private static readonly Regex regexTimeCodes = new Regex(@"^\d\d:\d\d:\d\d:\d\d\\\d\d:\d\d:\d\d:\d\d$", RegexOptions.Compiled); + + public override string Extension => ".sub"; + + public override string Name => "SoftNi colon sub"; + + public override string ToText(Subtitle subtitle, string title) + { + var sb = new StringBuilder(); + var lineSb = new StringBuilder(); + sb.AppendLine("*PART 1*"); + sb.AppendLine("00:00:00:00\\00:00:00:00"); + foreach (Paragraph p in subtitle.Paragraphs) + { + string text = p.Text; + bool positionTop = false; + + // If text starts with {\an8}, subtitle appears at the top + if (text.StartsWith("{\\an8}", StringComparison.Ordinal)) + { + positionTop = true; + // Remove the tag {\an8}. + text = text.Remove(0, 6); + } + + // Split lines (split a subtitle into its lines) + var lines = text.SplitToLines(); + int count = 0; + lineSb.Clear(); + bool nextLineInItalics = false; + foreach (string line in lines) + { + // Append line break in every line except the first one + if (count > 0) + { + lineSb.Append(Environment.NewLine); + } + + var tempLine = line; + + // This line should be in italics (it was detected in previous line) + if (nextLineInItalics) + { + tempLine = "" + tempLine; + nextLineInItalics = false; + } + + if (tempLine.StartsWith("", StringComparison.Ordinal) && tempLine.EndsWith("", StringComparison.Ordinal)) + { + // Whole line is in italics + // Remove from the beginning + tempLine = tempLine.Remove(0, 3); + // Remove from the end + tempLine = tempLine.Remove(tempLine.Length - 4, 4); + // Add new italics tag at the beginning + tempLine = "[" + tempLine; + } + else if (tempLine.StartsWith("", StringComparison.Ordinal) && Utilities.CountTagInText(tempLine, "") > Utilities.CountTagInText(tempLine, "")) + { + // Line starts with but italics are not closed. So the next line should be in italics + nextLineInItalics = true; + } + lineSb.Append(tempLine); + count++; + + text = lineSb.ToString(); + // Replace remaining italics tags + text = text.Replace("", @"["); + text = text.Replace("", @"]"); + text = HtmlUtil.RemoveHtmlTags(text); + } + + // Add top-position SoftNI marker "}" at the beginning of first line. + if (positionTop) + { + text = "}" + text; + } + + sb.AppendLine($"{text}{Environment.NewLine}{p.StartTime.ToHHMMSSPeriodFF().Replace(".", ":")}\\{p.EndTime.ToHHMMSSPeriodFF().Replace(".", ":")}"); + } + sb.AppendLine(@"*END*"); + sb.AppendLine(@"...........\..........."); + sb.AppendLine(@"*CODE*"); + sb.AppendLine(@"0000000000000000"); + sb.AppendLine(@"*CAST*"); + sb.AppendLine(@"*GENERATOR*"); + sb.AppendLine(@"*FONTS*"); + sb.AppendLine(@"*READ*"); + sb.AppendLine(@"0,300 15,000 130,000 100,000 25,000"); + sb.AppendLine(@"*TIMING*"); + sb.AppendLine(@"1 25 0"); + sb.AppendLine(@"*TIMED BACKUP NAME*"); + sb.AppendLine(@"C:\"); + sb.AppendLine(@"*FORMAT SAMPLE ÅåÉéÌìÕõÛûÿ*"); + sb.AppendLine(@"*READ ADVANCED*"); + sb.AppendLine(@"< > 1 1 0,300"); + sb.AppendLine(@"*MARKERS*"); + return sb.ToString(); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + DoLoadSubtitle(subtitle, lines); + } + + private void DoLoadSubtitle(Subtitle subtitle, List lines) + { + //—Peter. + //—Estoy de licencia. + //01:48:50.07\01:48:52.01 + var sb = new StringBuilder(); + var lineSb = new StringBuilder(); + Paragraph p = null; + subtitle.Paragraphs.Clear(); + char[] splitChars = { ':', '.' }; + foreach (string line in lines) + { + string s = line.Trim(); + if (regexTimeCodes.IsMatch(s)) + { + // Start and end time separated by "\" + var temp = s.Split('\\'); + if (temp.Length > 1) + { + string start = temp[0]; + string end = temp[1]; + + string[] startParts = start.Split(splitChars, StringSplitOptions.RemoveEmptyEntries); + string[] endParts = end.Split(splitChars, StringSplitOptions.RemoveEmptyEntries); + if (startParts.Length == 4 && endParts.Length == 4) + { + try + { + p = new Paragraph + { + StartTime = DecodeTimeCodeFramesFourParts(startParts), + EndTime = DecodeTimeCodeFramesFourParts(endParts) + }; + string text = sb.ToString().Trim(); + + bool positionTop = false; + // If text starts with "}", subtitle appears at the top + if (text.StartsWith('}')) + { + positionTop = true; + // Remove the tag "}" + text = text.Remove(0, 1); + } + // Replace tags + text = text.Replace("[", @""); + text = text.Replace("]", @""); + + // Split subtitle lines (one subtitle has one or more lines) + var subtitleLines = text.SplitToLines(); + int count = 0; + lineSb.Clear(); + foreach (string subtitleLine in subtitleLines) + { + // Append line break in every line except the first one + if (count > 0) + { + lineSb.Append(Environment.NewLine); + } + + var tempLine = subtitleLine; + // Close italics in every line (if next line is in italics, SoftNI will use "[" at the beginning) + if (Utilities.CountTagInText(tempLine, "") > Utilities.CountTagInText(tempLine, "")) + { + tempLine = tempLine + ""; + } + + lineSb.Append(tempLine); + count++; + } + text = lineSb.ToString(); + + // Replace "line break" with just a line break (SubRip does not need to close italics and open them again in the next line). + text = text.Replace("" + Environment.NewLine + "", Environment.NewLine); + + // Subtitle appears at the top (add tag) + if (positionTop) + { + text = "{\\an8}" + text; + } + + p.Text = text; + if (text.Length > 0) + { + subtitle.Paragraphs.Add(p); + } + + sb.Clear(); + } + catch (Exception exception) + { + _errorCount++; + System.Diagnostics.Debug.WriteLine(exception.Message); + } + } + } + } + else if (string.IsNullOrWhiteSpace(line) || line.StartsWith('*')) + { + // skip empty lines or start + } + else if (p != null) + { + sb.AppendLine(line); + } + } + + subtitle.Renumber(); + } + + } +} diff --git a/libse/SubtitleFormats/SoftNiSub.cs b/src/libse/SubtitleFormats/SoftNiSub.cs similarity index 97% rename from libse/SubtitleFormats/SoftNiSub.cs rename to src/libse/SubtitleFormats/SoftNiSub.cs index d34c8b378..aad4b14e6 100644 --- a/libse/SubtitleFormats/SoftNiSub.cs +++ b/src/libse/SubtitleFormats/SoftNiSub.cs @@ -1,228 +1,228 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - /// - /// SoftNi - http://www.softni.com/ - /// - public class SoftNiSub : SubtitleFormat - { - private static readonly Regex RegexTimeCodes = new Regex(@"^\d\d:\d\d:\d\d\.\d\d\\\d\d:\d\d:\d\d\.\d\d$", RegexOptions.Compiled); - - public override string Extension => ".sub"; - - public override string Name => "SoftNi sub"; - - public override string ToText(Subtitle subtitle, string title) - { - var sb = new StringBuilder(); - var lineSb = new StringBuilder(); - sb.AppendLine("*PART 1*"); - sb.AppendLine("00:00:00.00\\00:00:00.00"); - const string writeFormat = "{0}{1}{2}\\{3}"; - foreach (Paragraph p in subtitle.Paragraphs) - { - string text = p.Text; - bool positionTop = false; - - // If text starts with {\an8}, subtitle appears at the top - if (text.StartsWith("{\\an8}", StringComparison.Ordinal)) - { - positionTop = true; - // Remove the tag {\an8}. - text = text.Remove(0, 6); - } - - // Split lines (split a subtitle into its lines) - var lines = text.SplitToLines(); - int count = 0; - lineSb.Clear(); - bool nextLineInItalics = false; - foreach (string line in lines) - { - // Append line break in every line except the first one - if (count > 0) - { - lineSb.Append(Environment.NewLine); - } - - var tempLine = line; - - // This line should be in italics (it was detected in previous line) - if (nextLineInItalics) - { - tempLine = "" + tempLine; - nextLineInItalics = false; - } - - if (tempLine.StartsWith("", StringComparison.Ordinal) && tempLine.EndsWith("", StringComparison.Ordinal)) - { - // Whole line is in italics - // Remove from the beginning - tempLine = tempLine.Remove(0, 3); - // Remove from the end - tempLine = tempLine.Remove(tempLine.Length - 4, 4); - // Add new italics tag at the beginning - tempLine = "[" + tempLine; - } - else if (tempLine.StartsWith("", StringComparison.Ordinal) && Utilities.CountTagInText(tempLine, "") > Utilities.CountTagInText(tempLine, "")) - { - // Line starts with but italics are not closed. So the next line should be in italics - nextLineInItalics = true; - } - lineSb.Append(tempLine); - count++; - - text = lineSb.ToString(); - // Replace remaining italics tags - text = text.Replace("", @"["); - text = text.Replace("", @"]"); - text = HtmlUtil.RemoveHtmlTags(text); - } - - // Add top-position SoftNI marker "}" at the beginning of first line. - if (positionTop) - { - text = "}" + text; - } - - sb.AppendLine(string.Format(writeFormat, text, Environment.NewLine, p.StartTime.ToHHMMSSPeriodFF(), p.EndTime.ToHHMMSSPeriodFF())); - } - sb.AppendLine(@"*END*"); - sb.AppendLine(@"...........\..........."); - sb.AppendLine(@"*CODE*"); - sb.AppendLine(@"0000000000000000"); - sb.AppendLine(@"*CAST*"); - sb.AppendLine(@"*GENERATOR*"); - sb.AppendLine(@"*FONTS*"); - sb.AppendLine(@"*READ*"); - sb.AppendLine(@"0,300 15,000 130,000 100,000 25,000"); - sb.AppendLine(@"*TIMING*"); - sb.AppendLine(@"1 25 0"); - sb.AppendLine(@"*TIMED BACKUP NAME*"); - sb.AppendLine(@"C:\"); - sb.AppendLine(@"*FORMAT SAMPLE ÅåÉéÌìÕõÛûÿ*"); - sb.AppendLine(@"*READ ADVANCED*"); - sb.AppendLine(@"< > 1 1 0,300"); - sb.AppendLine(@"*MARKERS*"); - return sb.ToString(); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - DoLoadSubtitle(subtitle, lines); - } - - private void DoLoadSubtitle(Subtitle subtitle, List lines) - { - //—Peter. - //—Estoy de licencia. - //01:48:50.07\01:48:52.01 - var sb = new StringBuilder(); - var lineSb = new StringBuilder(); - Paragraph p = null; - subtitle.Paragraphs.Clear(); - char[] splitChars = { ':', '.' }; - foreach (string line in lines) - { - string s = line.Trim(); - if (RegexTimeCodes.IsMatch(s)) - { - // Start and end time separated by "\" - var temp = s.Split('\\'); - if (temp.Length > 1) - { - string start = temp[0]; - string end = temp[1]; - - string[] startParts = start.Split(splitChars, StringSplitOptions.RemoveEmptyEntries); - string[] endParts = end.Split(splitChars, StringSplitOptions.RemoveEmptyEntries); - if (startParts.Length == 4 && endParts.Length == 4) - { - try - { - p = new Paragraph(); - p.StartTime = DecodeTimeCodeFramesFourParts(startParts); - p.EndTime = DecodeTimeCodeFramesFourParts(endParts); - string text = sb.ToString().Trim(); - - bool positionTop = false; - // If text starts with "}", subtitle appears at the top - if (text.StartsWith('}')) - { - positionTop = true; - // Remove the tag "{" - text = text.Remove(0, 1); - } - // Replace tags - text = text.Replace("[", @""); - text = text.Replace("]", @""); - - // Split subtitle lines (one subtitle has one or more lines) - var subtitleLines = text.SplitToLines(); - int count = 0; - lineSb.Clear(); - foreach (string subtitleLine in subtitleLines) - { - // Append line break in every line except the first one - if (count > 0) - { - lineSb.Append(Environment.NewLine); - } - - var tempLine = subtitleLine; - // Close italics in every line (if next line is in italics, SoftNI will use "[" at the beginning) - if (Utilities.CountTagInText(tempLine, "") > Utilities.CountTagInText(tempLine, "")) - { - tempLine = tempLine + ""; - } - - lineSb.Append(tempLine); - count++; - } - text = lineSb.ToString(); - - // Replace "line break" with just a line break (SubRip does not need to close italics and open them again in the next line). - text = text.Replace("" + Environment.NewLine + "", Environment.NewLine); - - // Subtitle appears at the top (add tag) - if (positionTop) - { - text = "{\\an8}" + text; - } - - p.Text = text; - if (text.Length > 0) - { - subtitle.Paragraphs.Add(p); - } - - sb.Clear(); - } - catch (Exception exception) - { - _errorCount++; - System.Diagnostics.Debug.WriteLine(exception.Message); - } - } - } - } - else if (string.IsNullOrWhiteSpace(line) || line.StartsWith('*')) - { - // skip empty lines - } - else if (p != null) - { - sb.AppendLine(line); - } - } - - subtitle.Renumber(); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + /// + /// SoftNi - http://www.softni.com/ + /// + public class SoftNiSub : SubtitleFormat + { + private static readonly Regex RegexTimeCodes = new Regex(@"^\d\d:\d\d:\d\d\.\d\d\\\d\d:\d\d:\d\d\.\d\d$", RegexOptions.Compiled); + + public override string Extension => ".sub"; + + public override string Name => "SoftNi sub"; + + public override string ToText(Subtitle subtitle, string title) + { + var sb = new StringBuilder(); + var lineSb = new StringBuilder(); + sb.AppendLine("*PART 1*"); + sb.AppendLine("00:00:00.00\\00:00:00.00"); + const string writeFormat = "{0}{1}{2}\\{3}"; + foreach (Paragraph p in subtitle.Paragraphs) + { + string text = p.Text; + bool positionTop = false; + + // If text starts with {\an8}, subtitle appears at the top + if (text.StartsWith("{\\an8}", StringComparison.Ordinal)) + { + positionTop = true; + // Remove the tag {\an8}. + text = text.Remove(0, 6); + } + + // Split lines (split a subtitle into its lines) + var lines = text.SplitToLines(); + int count = 0; + lineSb.Clear(); + bool nextLineInItalics = false; + foreach (string line in lines) + { + // Append line break in every line except the first one + if (count > 0) + { + lineSb.Append(Environment.NewLine); + } + + var tempLine = line; + + // This line should be in italics (it was detected in previous line) + if (nextLineInItalics) + { + tempLine = "" + tempLine; + nextLineInItalics = false; + } + + if (tempLine.StartsWith("", StringComparison.Ordinal) && tempLine.EndsWith("", StringComparison.Ordinal)) + { + // Whole line is in italics + // Remove from the beginning + tempLine = tempLine.Remove(0, 3); + // Remove from the end + tempLine = tempLine.Remove(tempLine.Length - 4, 4); + // Add new italics tag at the beginning + tempLine = "[" + tempLine; + } + else if (tempLine.StartsWith("", StringComparison.Ordinal) && Utilities.CountTagInText(tempLine, "") > Utilities.CountTagInText(tempLine, "")) + { + // Line starts with but italics are not closed. So the next line should be in italics + nextLineInItalics = true; + } + lineSb.Append(tempLine); + count++; + + text = lineSb.ToString(); + // Replace remaining italics tags + text = text.Replace("", @"["); + text = text.Replace("", @"]"); + text = HtmlUtil.RemoveHtmlTags(text); + } + + // Add top-position SoftNI marker "}" at the beginning of first line. + if (positionTop) + { + text = "}" + text; + } + + sb.AppendLine(string.Format(writeFormat, text, Environment.NewLine, p.StartTime.ToHHMMSSPeriodFF(), p.EndTime.ToHHMMSSPeriodFF())); + } + sb.AppendLine(@"*END*"); + sb.AppendLine(@"...........\..........."); + sb.AppendLine(@"*CODE*"); + sb.AppendLine(@"0000000000000000"); + sb.AppendLine(@"*CAST*"); + sb.AppendLine(@"*GENERATOR*"); + sb.AppendLine(@"*FONTS*"); + sb.AppendLine(@"*READ*"); + sb.AppendLine(@"0,300 15,000 130,000 100,000 25,000"); + sb.AppendLine(@"*TIMING*"); + sb.AppendLine(@"1 25 0"); + sb.AppendLine(@"*TIMED BACKUP NAME*"); + sb.AppendLine(@"C:\"); + sb.AppendLine(@"*FORMAT SAMPLE ÅåÉéÌìÕõÛûÿ*"); + sb.AppendLine(@"*READ ADVANCED*"); + sb.AppendLine(@"< > 1 1 0,300"); + sb.AppendLine(@"*MARKERS*"); + return sb.ToString(); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + DoLoadSubtitle(subtitle, lines); + } + + private void DoLoadSubtitle(Subtitle subtitle, List lines) + { + //—Peter. + //—Estoy de licencia. + //01:48:50.07\01:48:52.01 + var sb = new StringBuilder(); + var lineSb = new StringBuilder(); + Paragraph p = null; + subtitle.Paragraphs.Clear(); + char[] splitChars = { ':', '.' }; + foreach (string line in lines) + { + string s = line.Trim(); + if (RegexTimeCodes.IsMatch(s)) + { + // Start and end time separated by "\" + var temp = s.Split('\\'); + if (temp.Length > 1) + { + string start = temp[0]; + string end = temp[1]; + + string[] startParts = start.Split(splitChars, StringSplitOptions.RemoveEmptyEntries); + string[] endParts = end.Split(splitChars, StringSplitOptions.RemoveEmptyEntries); + if (startParts.Length == 4 && endParts.Length == 4) + { + try + { + p = new Paragraph(); + p.StartTime = DecodeTimeCodeFramesFourParts(startParts); + p.EndTime = DecodeTimeCodeFramesFourParts(endParts); + string text = sb.ToString().Trim(); + + bool positionTop = false; + // If text starts with "}", subtitle appears at the top + if (text.StartsWith('}')) + { + positionTop = true; + // Remove the tag "{" + text = text.Remove(0, 1); + } + // Replace tags + text = text.Replace("[", @""); + text = text.Replace("]", @""); + + // Split subtitle lines (one subtitle has one or more lines) + var subtitleLines = text.SplitToLines(); + int count = 0; + lineSb.Clear(); + foreach (string subtitleLine in subtitleLines) + { + // Append line break in every line except the first one + if (count > 0) + { + lineSb.Append(Environment.NewLine); + } + + var tempLine = subtitleLine; + // Close italics in every line (if next line is in italics, SoftNI will use "[" at the beginning) + if (Utilities.CountTagInText(tempLine, "") > Utilities.CountTagInText(tempLine, "")) + { + tempLine = tempLine + ""; + } + + lineSb.Append(tempLine); + count++; + } + text = lineSb.ToString(); + + // Replace "line break" with just a line break (SubRip does not need to close italics and open them again in the next line). + text = text.Replace("" + Environment.NewLine + "", Environment.NewLine); + + // Subtitle appears at the top (add tag) + if (positionTop) + { + text = "{\\an8}" + text; + } + + p.Text = text; + if (text.Length > 0) + { + subtitle.Paragraphs.Add(p); + } + + sb.Clear(); + } + catch (Exception exception) + { + _errorCount++; + System.Diagnostics.Debug.WriteLine(exception.Message); + } + } + } + } + else if (string.IsNullOrWhiteSpace(line) || line.StartsWith('*')) + { + // skip empty lines + } + else if (p != null) + { + sb.AppendLine(line); + } + } + + subtitle.Renumber(); + } + + } +} diff --git a/libse/SubtitleFormats/Son.cs b/src/libse/SubtitleFormats/Son.cs similarity index 97% rename from libse/SubtitleFormats/Son.cs rename to src/libse/SubtitleFormats/Son.cs index de02f58b7..2869c2dbf 100644 --- a/libse/SubtitleFormats/Son.cs +++ b/src/libse/SubtitleFormats/Son.cs @@ -1,68 +1,68 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class Son : SubtitleFormat - { - public override string Extension => ".son"; - - public override string Name => "SON"; - - public override string ToText(Subtitle subtitle, string title) - { - const string writeFormat = "{0:0000}\t{1}\t{2}\t{3}"; - var sb = new StringBuilder(); - int index = 0; - foreach (Paragraph p in subtitle.Paragraphs) - { - index++; - sb.AppendLine(string.Format(writeFormat, index, EncodeTimeCode(p.StartTime), EncodeTimeCode(p.EndTime), HtmlUtil.RemoveHtmlTags(p.Text).Replace(Environment.NewLine, "\t"))); - } - return sb.ToString(); - } - - private static string EncodeTimeCode(TimeCode time) - { - //00:03:15:22 (last is frame) - return time.ToHHMMSSFF(); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - //0001 00:00:19:13 00:00:22:10 a_0001.tif - var regexTimeCodes = new Regex(@"^\d\d\d\d\t+(\d\d:\d\d:\d\d:\d\d)\t(\d\d:\d\d:\d\d:\d\d)\t.+\.(?:tif|tiff|png|bmp|TIF|TIFF|PNG|BMP)", RegexOptions.Compiled); - Paragraph p = null; - subtitle.Paragraphs.Clear(); - _errorCount = 0; - int index = 0; - foreach (string line in lines) - { - var match = regexTimeCodes.Match(line); - if (match.Success) - { - var start = DecodeTimeCodeFramesFourParts(match.Groups[1].Value.Split(SplitCharColon, StringSplitOptions.RemoveEmptyEntries)); - var end = DecodeTimeCodeFramesFourParts(match.Groups[2].Value.Split(SplitCharColon, StringSplitOptions.RemoveEmptyEntries)); - var lastTabIndex = line.LastIndexOf('\t'); - var text = line.Substring(lastTabIndex + 1).Trim(); - p = new Paragraph(start, end, text); - subtitle.Paragraphs.Add(p); - } - else if (index < 10 || string.IsNullOrWhiteSpace(line) || line[0] == '#' || line.StartsWith("Display_Area", StringComparison.Ordinal) || line.StartsWith("Color", StringComparison.Ordinal)) - { - // skip these lines - } - else if (p != null) - { - _errorCount++; - } - index++; - } - subtitle.Renumber(); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class Son : SubtitleFormat + { + public override string Extension => ".son"; + + public override string Name => "SON"; + + public override string ToText(Subtitle subtitle, string title) + { + const string writeFormat = "{0:0000}\t{1}\t{2}\t{3}"; + var sb = new StringBuilder(); + int index = 0; + foreach (Paragraph p in subtitle.Paragraphs) + { + index++; + sb.AppendLine(string.Format(writeFormat, index, EncodeTimeCode(p.StartTime), EncodeTimeCode(p.EndTime), HtmlUtil.RemoveHtmlTags(p.Text).Replace(Environment.NewLine, "\t"))); + } + return sb.ToString(); + } + + private static string EncodeTimeCode(TimeCode time) + { + //00:03:15:22 (last is frame) + return time.ToHHMMSSFF(); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + //0001 00:00:19:13 00:00:22:10 a_0001.tif + var regexTimeCodes = new Regex(@"^\d\d\d\d\t+(\d\d:\d\d:\d\d:\d\d)\t(\d\d:\d\d:\d\d:\d\d)\t.+\.(?:tif|tiff|png|bmp|TIF|TIFF|PNG|BMP)", RegexOptions.Compiled); + Paragraph p = null; + subtitle.Paragraphs.Clear(); + _errorCount = 0; + int index = 0; + foreach (string line in lines) + { + var match = regexTimeCodes.Match(line); + if (match.Success) + { + var start = DecodeTimeCodeFramesFourParts(match.Groups[1].Value.Split(SplitCharColon, StringSplitOptions.RemoveEmptyEntries)); + var end = DecodeTimeCodeFramesFourParts(match.Groups[2].Value.Split(SplitCharColon, StringSplitOptions.RemoveEmptyEntries)); + var lastTabIndex = line.LastIndexOf('\t'); + var text = line.Substring(lastTabIndex + 1).Trim(); + p = new Paragraph(start, end, text); + subtitle.Paragraphs.Add(p); + } + else if (index < 10 || string.IsNullOrWhiteSpace(line) || line[0] == '#' || line.StartsWith("Display_Area", StringComparison.Ordinal) || line.StartsWith("Color", StringComparison.Ordinal)) + { + // skip these lines + } + else if (p != null) + { + _errorCount++; + } + index++; + } + subtitle.Renumber(); + } + + } +} diff --git a/libse/SubtitleFormats/SonicScenaristBitmaps.cs b/src/libse/SubtitleFormats/SonicScenaristBitmaps.cs similarity index 97% rename from libse/SubtitleFormats/SonicScenaristBitmaps.cs rename to src/libse/SubtitleFormats/SonicScenaristBitmaps.cs index 353673489..111f59b1e 100644 --- a/libse/SubtitleFormats/SonicScenaristBitmaps.cs +++ b/src/libse/SubtitleFormats/SonicScenaristBitmaps.cs @@ -1,93 +1,93 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class SonicScenaristBitmaps : SubtitleFormat - { - private static readonly Regex RegexTimeCodes = new Regex(@"^\d{1,4}\s+\d\d:\d\d:\d\d:\d\d\s+\d\d:\d\d:\d\d:\d\d\s+.+\.(tif|tiff|png|bmp|TIF|TIFF|PNG|BMP)", RegexOptions.Compiled); - - public override string Extension => ".sst"; - - public override string Name => "Sonic Scenarist Bitmaps"; - - public override bool IsMine(List lines, string fileName) - { - var extension = System.IO.Path.GetExtension(fileName); - if (extension != null && extension.ToLowerInvariant() != ".sst") - { - return false; - } - - return base.IsMine(lines, fileName); - } - - public override string ToText(Subtitle subtitle, string title) - { - var sb = new StringBuilder(); - int index = 0; - const string writeFormat = "{0:0000} {1} {2} {3}"; - foreach (Paragraph p in subtitle.Paragraphs) - { - //0001 00:49:26:22 00:49:27:13 t01_v001c001_22_0001.bmp - sb.AppendLine(string.Format(writeFormat, index + 1, EncodeTimeCode(p.StartTime), EncodeTimeCode(p.EndTime), HtmlUtil.RemoveHtmlTags(p.Text).Replace(Environment.NewLine, "\t"))); - index++; - } - return sb.ToString(); - } - - private static string EncodeTimeCode(TimeCode time) - { - //00:03:15:22 (last is frame) - return time.ToHHMMSSFF(); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - //00:03:15:22 00:03:23:10 This is line one. - //This is line two. - Paragraph p = null; - subtitle.Paragraphs.Clear(); - _errorCount = 0; - int index = 0; - char[] splitChar = { ' ' }; - var sb = new StringBuilder(); - foreach (string line in lines) - { - if (RegexTimeCodes.IsMatch(line)) - { - string temp = line.Substring(0, RegexTimeCodes.Match(line).Length).Replace("\t", " "); - - string[] parts = temp.Split(splitChar, StringSplitOptions.RemoveEmptyEntries); - - if (parts.Length > 3) - { - sb.Clear(); - for (int i = 3; i < parts.Length; i++) - { - sb.Append(parts[i] + " "); - } - - string text = sb.ToString().Trim(); - p = new Paragraph(DecodeTimeCodeFramesFourParts(parts[1].Split(SplitCharColon)), DecodeTimeCodeFramesFourParts(parts[2].Split(SplitCharColon)), text); - subtitle.Paragraphs.Add(p); - } - } - else if (string.IsNullOrWhiteSpace(line) || line.StartsWith("Display_Area", StringComparison.Ordinal) || line.StartsWith('#') || line.StartsWith("Color", StringComparison.Ordinal) || index < 10) - { - // skip these lines - } - else if (p != null) - { - _errorCount++; - } - index++; - } - subtitle.Renumber(); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class SonicScenaristBitmaps : SubtitleFormat + { + private static readonly Regex RegexTimeCodes = new Regex(@"^\d{1,4}\s+\d\d:\d\d:\d\d:\d\d\s+\d\d:\d\d:\d\d:\d\d\s+.+\.(tif|tiff|png|bmp|TIF|TIFF|PNG|BMP)", RegexOptions.Compiled); + + public override string Extension => ".sst"; + + public override string Name => "Sonic Scenarist Bitmaps"; + + public override bool IsMine(List lines, string fileName) + { + var extension = System.IO.Path.GetExtension(fileName); + if (extension != null && extension.ToLowerInvariant() != ".sst") + { + return false; + } + + return base.IsMine(lines, fileName); + } + + public override string ToText(Subtitle subtitle, string title) + { + var sb = new StringBuilder(); + int index = 0; + const string writeFormat = "{0:0000} {1} {2} {3}"; + foreach (Paragraph p in subtitle.Paragraphs) + { + //0001 00:49:26:22 00:49:27:13 t01_v001c001_22_0001.bmp + sb.AppendLine(string.Format(writeFormat, index + 1, EncodeTimeCode(p.StartTime), EncodeTimeCode(p.EndTime), HtmlUtil.RemoveHtmlTags(p.Text).Replace(Environment.NewLine, "\t"))); + index++; + } + return sb.ToString(); + } + + private static string EncodeTimeCode(TimeCode time) + { + //00:03:15:22 (last is frame) + return time.ToHHMMSSFF(); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + //00:03:15:22 00:03:23:10 This is line one. + //This is line two. + Paragraph p = null; + subtitle.Paragraphs.Clear(); + _errorCount = 0; + int index = 0; + char[] splitChar = { ' ' }; + var sb = new StringBuilder(); + foreach (string line in lines) + { + if (RegexTimeCodes.IsMatch(line)) + { + string temp = line.Substring(0, RegexTimeCodes.Match(line).Length).Replace("\t", " "); + + string[] parts = temp.Split(splitChar, StringSplitOptions.RemoveEmptyEntries); + + if (parts.Length > 3) + { + sb.Clear(); + for (int i = 3; i < parts.Length; i++) + { + sb.Append(parts[i] + " "); + } + + string text = sb.ToString().Trim(); + p = new Paragraph(DecodeTimeCodeFramesFourParts(parts[1].Split(SplitCharColon)), DecodeTimeCodeFramesFourParts(parts[2].Split(SplitCharColon)), text); + subtitle.Paragraphs.Add(p); + } + } + else if (string.IsNullOrWhiteSpace(line) || line.StartsWith("Display_Area", StringComparison.Ordinal) || line.StartsWith('#') || line.StartsWith("Color", StringComparison.Ordinal) || index < 10) + { + // skip these lines + } + else if (p != null) + { + _errorCount++; + } + index++; + } + subtitle.Renumber(); + } + + } +} diff --git a/libse/SubtitleFormats/SonyDVDArchitect.cs b/src/libse/SubtitleFormats/SonyDVDArchitect.cs similarity index 97% rename from libse/SubtitleFormats/SonyDVDArchitect.cs rename to src/libse/SubtitleFormats/SonyDVDArchitect.cs index 5f3582260..275aaf93d 100644 --- a/libse/SubtitleFormats/SonyDVDArchitect.cs +++ b/src/libse/SubtitleFormats/SonyDVDArchitect.cs @@ -1,95 +1,95 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class SonyDVDArchitect : SubtitleFormat - { - private static readonly Regex Regex = new Regex(@"^\d\d:\d\d:\d\d:\d\d[ ]+-[ ]+\d\d:\d\d:\d\d:\d\d", RegexOptions.Compiled); - - public override string Extension => ".sub"; - - public override string Name => "Sony DVDArchitect"; - - public override string ToText(Subtitle subtitle, string title) - { - var sb = new StringBuilder(); - const string writeFormat = "{0:00}:{1:00}:{2:00}:{3:00} - {4:00}:{5:00}:{6:00}:{7:00} \t{8}"; - foreach (Paragraph p in subtitle.Paragraphs) - { - var text = HtmlUtil.RemoveHtmlTags(p.Text, true); - text = text.Replace(Environment.NewLine, "\r"); - sb.AppendLine(string.Format(writeFormat, p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, p.StartTime.Milliseconds / 10, - p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, p.EndTime.Milliseconds / 10, - text)); - } - return sb.ToString().Trim() + Environment.NewLine + Environment.NewLine + Environment.NewLine; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - // 00:04:10:92 - 00:04:13:32 Raise Yourself To Help Mankind - // 00:04:27:92 - 00:04:30:92 الجهة المتولية للمسئولية الاجتماعية لشركتنا. - - _errorCount = 0; - Paragraph lastParagraph = null; - foreach (string line in lines) - { - if (string.IsNullOrWhiteSpace(line)) - { - continue; - } - - bool success = false; - - Match match = null; - if (line.Length > 26 && line[2] == ':') - { - match = Regex.Match(line); - } - - if (match != null && match.Success) - { - string s = line.Substring(0, match.Length); - s = s.Replace(" - ", ":"); - s = s.RemoveChar(' '); - string[] parts = s.Split(':'); - if (parts.Length == 8) - { - int hours = int.Parse(parts[0]); - int minutes = int.Parse(parts[1]); - int seconds = int.Parse(parts[2]); - int milliseconds = int.Parse(parts[3]) * 10; - var start = new TimeCode(hours, minutes, seconds, milliseconds); - - hours = int.Parse(parts[4]); - minutes = int.Parse(parts[5]); - seconds = int.Parse(parts[6]); - milliseconds = int.Parse(parts[7]) * 10; - var end = new TimeCode(hours, minutes, seconds, milliseconds); - - string text = line.Substring(match.Length).TrimStart(); - text = text.Replace("|", Environment.NewLine); - - lastParagraph = new Paragraph(start, end, text); - subtitle.Paragraphs.Add(lastParagraph); - success = true; - } - } - else if (lastParagraph != null && Utilities.GetNumberOfLines(lastParagraph.Text) < 5) - { - lastParagraph.Text += Environment.NewLine + line.Trim(); - success = true; - } - if (!success) - { - _errorCount++; - } - } - subtitle.Renumber(); - } - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class SonyDVDArchitect : SubtitleFormat + { + private static readonly Regex Regex = new Regex(@"^\d\d:\d\d:\d\d:\d\d[ ]+-[ ]+\d\d:\d\d:\d\d:\d\d", RegexOptions.Compiled); + + public override string Extension => ".sub"; + + public override string Name => "Sony DVDArchitect"; + + public override string ToText(Subtitle subtitle, string title) + { + var sb = new StringBuilder(); + const string writeFormat = "{0:00}:{1:00}:{2:00}:{3:00} - {4:00}:{5:00}:{6:00}:{7:00} \t{8}"; + foreach (Paragraph p in subtitle.Paragraphs) + { + var text = HtmlUtil.RemoveHtmlTags(p.Text, true); + text = text.Replace(Environment.NewLine, "\r"); + sb.AppendLine(string.Format(writeFormat, p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, p.StartTime.Milliseconds / 10, + p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, p.EndTime.Milliseconds / 10, + text)); + } + return sb.ToString().Trim() + Environment.NewLine + Environment.NewLine + Environment.NewLine; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + // 00:04:10:92 - 00:04:13:32 Raise Yourself To Help Mankind + // 00:04:27:92 - 00:04:30:92 الجهة المتولية للمسئولية الاجتماعية لشركتنا. + + _errorCount = 0; + Paragraph lastParagraph = null; + foreach (string line in lines) + { + if (string.IsNullOrWhiteSpace(line)) + { + continue; + } + + bool success = false; + + Match match = null; + if (line.Length > 26 && line[2] == ':') + { + match = Regex.Match(line); + } + + if (match != null && match.Success) + { + string s = line.Substring(0, match.Length); + s = s.Replace(" - ", ":"); + s = s.RemoveChar(' '); + string[] parts = s.Split(':'); + if (parts.Length == 8) + { + int hours = int.Parse(parts[0]); + int minutes = int.Parse(parts[1]); + int seconds = int.Parse(parts[2]); + int milliseconds = int.Parse(parts[3]) * 10; + var start = new TimeCode(hours, minutes, seconds, milliseconds); + + hours = int.Parse(parts[4]); + minutes = int.Parse(parts[5]); + seconds = int.Parse(parts[6]); + milliseconds = int.Parse(parts[7]) * 10; + var end = new TimeCode(hours, minutes, seconds, milliseconds); + + string text = line.Substring(match.Length).TrimStart(); + text = text.Replace("|", Environment.NewLine); + + lastParagraph = new Paragraph(start, end, text); + subtitle.Paragraphs.Add(lastParagraph); + success = true; + } + } + else if (lastParagraph != null && Utilities.GetNumberOfLines(lastParagraph.Text) < 5) + { + lastParagraph.Text += Environment.NewLine + line.Trim(); + success = true; + } + if (!success) + { + _errorCount++; + } + } + subtitle.Renumber(); + } + } +} diff --git a/libse/SubtitleFormats/SonyDVDArchitectExplicitDuration.cs b/src/libse/SubtitleFormats/SonyDVDArchitectExplicitDuration.cs similarity index 97% rename from libse/SubtitleFormats/SonyDVDArchitectExplicitDuration.cs rename to src/libse/SubtitleFormats/SonyDVDArchitectExplicitDuration.cs index 33b66f69d..013ff912e 100644 --- a/libse/SubtitleFormats/SonyDVDArchitectExplicitDuration.cs +++ b/src/libse/SubtitleFormats/SonyDVDArchitectExplicitDuration.cs @@ -1,99 +1,99 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class SonyDVDArchitectExplicitDuration : SubtitleFormat - { - private static readonly Regex Regex = new Regex(@"^\d\d:\d\d:\d\d\.\d\d\d[ \t]+\d\d:\d\d:\d\d\.\d\d\d[ \t]+\d\d:\d\d:\d\d\.\d\d\d[ \t]+", RegexOptions.Compiled); - - public override string Extension => ".sub"; - - public override string Name => "Sony DVDArchitect Explicit duration"; - - public override string ToText(Subtitle subtitle, string title) - { - var sb = new StringBuilder(); - const string writeFormat = "{0:00}:{1:00}:{2:00}.{3:000}\t{4:00}:{5:00}:{6:00}.{7:000}\t{8:00}:{9:00}:{10:00}.{11:000}\t{12}"; - foreach (Paragraph p in subtitle.Paragraphs) - { - string text = HtmlUtil.RemoveHtmlTags(p.Text); - text = text.Replace(Environment.NewLine, "\r"); - sb.AppendLine(string.Format(writeFormat, p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, p.StartTime.Milliseconds, - p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, p.EndTime.Milliseconds, - p.Duration.Hours, p.Duration.Minutes, p.Duration.Seconds, p.Duration.Milliseconds, - text)); - } - return sb.ToString().Trim() + Environment.NewLine + Environment.NewLine + Environment.NewLine; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { //00:02:10.354 00:02:13.047 00:00:02.693 Her er endnu en tekstfil fra DVD-Architect.Med 2 linier. - //00:02:14.018 00:02:19.018 00:00:05.000 - Prøvetekst 2- Linie 2 - //newline = \r (0D) - - _errorCount = 0; - Paragraph lastParagraph = null; - foreach (string line in lines) - { - if (string.IsNullOrWhiteSpace(line)) - { - continue; - } - - string s = line; - bool success = false; - bool isTimeCode = false; - - if (s.Length > 26 && s.IndexOf(':') == 2) - { - var match = Regex.Match(s); - if (match.Success) - { - isTimeCode = true; - s = s.Substring(0, match.Length); - s = s.Replace('\t', ':'); - s = s.Replace('.', ':'); - s = s.RemoveChar(' '); - s = s.Trim().TrimEnd(':').TrimEnd(); - string[] parts = s.Split(':'); - if (parts.Length == 12) - { - int hours = int.Parse(parts[0]); - int minutes = int.Parse(parts[1]); - int seconds = int.Parse(parts[2]); - int milliseconds = int.Parse(parts[3]); - var start = new TimeCode(hours, minutes, seconds, milliseconds); - - hours = int.Parse(parts[4]); - minutes = int.Parse(parts[5]); - seconds = int.Parse(parts[6]); - milliseconds = int.Parse(parts[7]); - var end = new TimeCode(hours, minutes, seconds, milliseconds); - - string text = line.Substring(match.Length).TrimStart(); - text = text.Replace("|", Environment.NewLine); - - lastParagraph = new Paragraph(start, end, text); - subtitle.Paragraphs.Add(lastParagraph); - success = true; - } - } - } - if (!isTimeCode && lastParagraph != null && Utilities.GetNumberOfLines(lastParagraph.Text) < 5) - { - lastParagraph.Text += Environment.NewLine + line.Trim(); - success = true; - } - if (!success) - { - _errorCount++; - } - } - subtitle.Renumber(); - } - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class SonyDVDArchitectExplicitDuration : SubtitleFormat + { + private static readonly Regex Regex = new Regex(@"^\d\d:\d\d:\d\d\.\d\d\d[ \t]+\d\d:\d\d:\d\d\.\d\d\d[ \t]+\d\d:\d\d:\d\d\.\d\d\d[ \t]+", RegexOptions.Compiled); + + public override string Extension => ".sub"; + + public override string Name => "Sony DVDArchitect Explicit duration"; + + public override string ToText(Subtitle subtitle, string title) + { + var sb = new StringBuilder(); + const string writeFormat = "{0:00}:{1:00}:{2:00}.{3:000}\t{4:00}:{5:00}:{6:00}.{7:000}\t{8:00}:{9:00}:{10:00}.{11:000}\t{12}"; + foreach (Paragraph p in subtitle.Paragraphs) + { + string text = HtmlUtil.RemoveHtmlTags(p.Text); + text = text.Replace(Environment.NewLine, "\r"); + sb.AppendLine(string.Format(writeFormat, p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, p.StartTime.Milliseconds, + p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, p.EndTime.Milliseconds, + p.Duration.Hours, p.Duration.Minutes, p.Duration.Seconds, p.Duration.Milliseconds, + text)); + } + return sb.ToString().Trim() + Environment.NewLine + Environment.NewLine + Environment.NewLine; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { //00:02:10.354 00:02:13.047 00:00:02.693 Her er endnu en tekstfil fra DVD-Architect.Med 2 linier. + //00:02:14.018 00:02:19.018 00:00:05.000 - Prøvetekst 2- Linie 2 + //newline = \r (0D) + + _errorCount = 0; + Paragraph lastParagraph = null; + foreach (string line in lines) + { + if (string.IsNullOrWhiteSpace(line)) + { + continue; + } + + string s = line; + bool success = false; + bool isTimeCode = false; + + if (s.Length > 26 && s.IndexOf(':') == 2) + { + var match = Regex.Match(s); + if (match.Success) + { + isTimeCode = true; + s = s.Substring(0, match.Length); + s = s.Replace('\t', ':'); + s = s.Replace('.', ':'); + s = s.RemoveChar(' '); + s = s.Trim().TrimEnd(':').TrimEnd(); + string[] parts = s.Split(':'); + if (parts.Length == 12) + { + int hours = int.Parse(parts[0]); + int minutes = int.Parse(parts[1]); + int seconds = int.Parse(parts[2]); + int milliseconds = int.Parse(parts[3]); + var start = new TimeCode(hours, minutes, seconds, milliseconds); + + hours = int.Parse(parts[4]); + minutes = int.Parse(parts[5]); + seconds = int.Parse(parts[6]); + milliseconds = int.Parse(parts[7]); + var end = new TimeCode(hours, minutes, seconds, milliseconds); + + string text = line.Substring(match.Length).TrimStart(); + text = text.Replace("|", Environment.NewLine); + + lastParagraph = new Paragraph(start, end, text); + subtitle.Paragraphs.Add(lastParagraph); + success = true; + } + } + } + if (!isTimeCode && lastParagraph != null && Utilities.GetNumberOfLines(lastParagraph.Text) < 5) + { + lastParagraph.Text += Environment.NewLine + line.Trim(); + success = true; + } + if (!success) + { + _errorCount++; + } + } + subtitle.Renumber(); + } + } +} diff --git a/libse/SubtitleFormats/SonyDVDArchitectLineAndDuration.cs b/src/libse/SubtitleFormats/SonyDVDArchitectLineAndDuration.cs similarity index 97% rename from libse/SubtitleFormats/SonyDVDArchitectLineAndDuration.cs rename to src/libse/SubtitleFormats/SonyDVDArchitectLineAndDuration.cs index b8fed4a56..4f1cea498 100644 --- a/libse/SubtitleFormats/SonyDVDArchitectLineAndDuration.cs +++ b/src/libse/SubtitleFormats/SonyDVDArchitectLineAndDuration.cs @@ -1,110 +1,110 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class SonyDVDArchitectLineAndDuration : SubtitleFormat - { - private static readonly Regex Regex = new Regex(@"^\d+\t\d\d:\d\d:\d\d:\d\d\t\d\d:\d\d:\d\d:\d\d\t\d\d:\d\d:\d\d:\d\d$", RegexOptions.Compiled); - - public override string Extension => ".txt"; - - public override string Name => "Sony DVDArchitect line/duration"; - - public override string ToText(Subtitle subtitle, string title) - { - var sb = new StringBuilder(); - sb.AppendLine("Title: " + title); - sb.AppendLine("Translator: No Author"); - sb.AppendLine("Date: " + DateTime.Now.ToString("dd-MM-yyyy").Replace("-", ".")); // 25.08.2011 - double milliseconds = 0; - if (subtitle.Paragraphs.Count > 0) - { - milliseconds = subtitle.Paragraphs[subtitle.Paragraphs.Count - 1].EndTime.TotalMilliseconds; - } - - var tc = new TimeCode(milliseconds); - sb.AppendLine(string.Format("Duration: {0:00}:{1:00}:{2:00}:{3:00}", tc.Hours, tc.Minutes, tc.Seconds, MillisecondsToFramesMaxFrameRate(tc.Milliseconds))); // 01:20:49:12 - sb.AppendLine("Program start: 00:00:00:00"); - sb.AppendLine("Title count: " + subtitle.Paragraphs.Count); - sb.AppendLine(); - sb.AppendLine("#\tIn\tOut\tDuration"); - sb.AppendLine(); - int count = 0; - const string writeFormat = "{13}\t{0:00}:{1:00}:{2:00}:{3:00}\t{4:00}:{5:00}:{6:00}:{7:00}\t{8:00}:{9:00}:{10:00}:{11:00}\r\n{12}"; - foreach (Paragraph p in subtitle.Paragraphs) - { - count++; - var text = HtmlUtil.RemoveHtmlTags(p.Text, true); - - // to avoid rounding errors in duration - var startFrame = MillisecondsToFramesMaxFrameRate(p.StartTime.Milliseconds); - var endFrame = MillisecondsToFramesMaxFrameRate(p.EndTime.Milliseconds); - var durationCalc = new Paragraph( - new TimeCode(p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, FramesToMillisecondsMax999(startFrame)), - new TimeCode(p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, FramesToMillisecondsMax999(endFrame)), - string.Empty); - - sb.AppendLine(string.Format(writeFormat + Environment.NewLine, - p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, startFrame, - p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, endFrame, - durationCalc.Duration.Hours, durationCalc.Duration.Minutes, durationCalc.Duration.Seconds, MillisecondsToFramesMaxFrameRate(durationCalc.Duration.Milliseconds), - text, count)); - } - return sb.ToString().Trim() + Environment.NewLine + Environment.NewLine + Environment.NewLine; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { //22 00:04:19:12 00:04:21:09 00:00:01:21 - _errorCount = 0; - Paragraph lastParagraph = null; - int count = 0; - foreach (string line in lines) - { - bool isTimeCode = false; - if (line.Length > 0) - { - bool success = false; - if (line.Length > 31 && line.IndexOf(':') > 1) - { - var match = Regex.Match(line); - if (match.Success) - { - isTimeCode = true; - if (lastParagraph != null) - { - subtitle.Paragraphs.Add(lastParagraph); - } - - var arr = line.Split('\t'); - TimeCode start = DecodeTimeCodeFrames(arr[1], SplitCharColon); - TimeCode end = DecodeTimeCodeFrames(arr[2], SplitCharColon); - lastParagraph = new Paragraph(start, end, string.Empty); - success = true; - } - } - if (!isTimeCode && !string.IsNullOrWhiteSpace(line) && lastParagraph != null && Utilities.GetNumberOfLines(lastParagraph.Text) < 5) - { - lastParagraph.Text = (lastParagraph.Text + Environment.NewLine + line).Trim(); - success = true; - } - if (!success && count > 9) - { - _errorCount++; - } - } - count++; - } - if (lastParagraph != null) - { - subtitle.Paragraphs.Add(lastParagraph); - } - - subtitle.Renumber(); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class SonyDVDArchitectLineAndDuration : SubtitleFormat + { + private static readonly Regex Regex = new Regex(@"^\d+\t\d\d:\d\d:\d\d:\d\d\t\d\d:\d\d:\d\d:\d\d\t\d\d:\d\d:\d\d:\d\d$", RegexOptions.Compiled); + + public override string Extension => ".txt"; + + public override string Name => "Sony DVDArchitect line/duration"; + + public override string ToText(Subtitle subtitle, string title) + { + var sb = new StringBuilder(); + sb.AppendLine("Title: " + title); + sb.AppendLine("Translator: No Author"); + sb.AppendLine("Date: " + DateTime.Now.ToString("dd-MM-yyyy").Replace("-", ".")); // 25.08.2011 + double milliseconds = 0; + if (subtitle.Paragraphs.Count > 0) + { + milliseconds = subtitle.Paragraphs[subtitle.Paragraphs.Count - 1].EndTime.TotalMilliseconds; + } + + var tc = new TimeCode(milliseconds); + sb.AppendLine(string.Format("Duration: {0:00}:{1:00}:{2:00}:{3:00}", tc.Hours, tc.Minutes, tc.Seconds, MillisecondsToFramesMaxFrameRate(tc.Milliseconds))); // 01:20:49:12 + sb.AppendLine("Program start: 00:00:00:00"); + sb.AppendLine("Title count: " + subtitle.Paragraphs.Count); + sb.AppendLine(); + sb.AppendLine("#\tIn\tOut\tDuration"); + sb.AppendLine(); + int count = 0; + const string writeFormat = "{13}\t{0:00}:{1:00}:{2:00}:{3:00}\t{4:00}:{5:00}:{6:00}:{7:00}\t{8:00}:{9:00}:{10:00}:{11:00}\r\n{12}"; + foreach (Paragraph p in subtitle.Paragraphs) + { + count++; + var text = HtmlUtil.RemoveHtmlTags(p.Text, true); + + // to avoid rounding errors in duration + var startFrame = MillisecondsToFramesMaxFrameRate(p.StartTime.Milliseconds); + var endFrame = MillisecondsToFramesMaxFrameRate(p.EndTime.Milliseconds); + var durationCalc = new Paragraph( + new TimeCode(p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, FramesToMillisecondsMax999(startFrame)), + new TimeCode(p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, FramesToMillisecondsMax999(endFrame)), + string.Empty); + + sb.AppendLine(string.Format(writeFormat + Environment.NewLine, + p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, startFrame, + p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, endFrame, + durationCalc.Duration.Hours, durationCalc.Duration.Minutes, durationCalc.Duration.Seconds, MillisecondsToFramesMaxFrameRate(durationCalc.Duration.Milliseconds), + text, count)); + } + return sb.ToString().Trim() + Environment.NewLine + Environment.NewLine + Environment.NewLine; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { //22 00:04:19:12 00:04:21:09 00:00:01:21 + _errorCount = 0; + Paragraph lastParagraph = null; + int count = 0; + foreach (string line in lines) + { + bool isTimeCode = false; + if (line.Length > 0) + { + bool success = false; + if (line.Length > 31 && line.IndexOf(':') > 1) + { + var match = Regex.Match(line); + if (match.Success) + { + isTimeCode = true; + if (lastParagraph != null) + { + subtitle.Paragraphs.Add(lastParagraph); + } + + var arr = line.Split('\t'); + TimeCode start = DecodeTimeCodeFrames(arr[1], SplitCharColon); + TimeCode end = DecodeTimeCodeFrames(arr[2], SplitCharColon); + lastParagraph = new Paragraph(start, end, string.Empty); + success = true; + } + } + if (!isTimeCode && !string.IsNullOrWhiteSpace(line) && lastParagraph != null && Utilities.GetNumberOfLines(lastParagraph.Text) < 5) + { + lastParagraph.Text = (lastParagraph.Text + Environment.NewLine + line).Trim(); + success = true; + } + if (!success && count > 9) + { + _errorCount++; + } + } + count++; + } + if (lastParagraph != null) + { + subtitle.Paragraphs.Add(lastParagraph); + } + + subtitle.Renumber(); + } + + } +} diff --git a/libse/SubtitleFormats/SonyDVDArchitectLineDurationLength.cs b/src/libse/SubtitleFormats/SonyDVDArchitectLineDurationLength.cs similarity index 97% rename from libse/SubtitleFormats/SonyDVDArchitectLineDurationLength.cs rename to src/libse/SubtitleFormats/SonyDVDArchitectLineDurationLength.cs index c0bf27c0b..a303aa0ff 100644 --- a/libse/SubtitleFormats/SonyDVDArchitectLineDurationLength.cs +++ b/src/libse/SubtitleFormats/SonyDVDArchitectLineDurationLength.cs @@ -1,110 +1,110 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class SonyDVDArchitectLineDurationLength : SubtitleFormat - { - private static readonly Regex Regex = new Regex(@"^\d+\t\d\d:\d\d:\d\d:\d\d\t\d\d:\d\d:\d\d:\d\d\t\d\d:\d\d:\d\d:\d\d\t\d+$", RegexOptions.Compiled); - - public override string Extension => ".txt"; - - public override string Name => "Sony DVDArchitect line/dur/length"; - - public override string ToText(Subtitle subtitle, string title) - { - var sb = new StringBuilder(); - sb.AppendLine("Title: " + title); - sb.AppendLine("Translator: No Author"); - sb.AppendLine("Date: " + DateTime.Now.ToString("dd-MM-yyyy").Replace("-", ".")); // 25.08.2011 - double milliseconds = 0; - if (subtitle.Paragraphs.Count > 0) - { - milliseconds = subtitle.Paragraphs[subtitle.Paragraphs.Count - 1].EndTime.TotalMilliseconds; - } - - var tc = new TimeCode(milliseconds); - sb.AppendLine(string.Format("Duration: {0:00}:{1:00}:{2:00}:{3:00}", tc.Hours, tc.Minutes, tc.Seconds, MillisecondsToFramesMaxFrameRate(tc.Milliseconds))); // 01:20:49:12 - sb.AppendLine("Program start: 00:00:00:00"); - sb.AppendLine("Title count: " + subtitle.Paragraphs.Count); - sb.AppendLine(); - sb.AppendLine("#\tIn\tOut\tDuration\tLength"); - sb.AppendLine(); - int count = 0; - const string writeFormat = "{14}\t{0:00}:{1:00}:{2:00}:{3:00}\t{4:00}:{5:00}:{6:00}:{7:00}\t{8:00}:{9:00}:{10:00}:{11:00}\t{12}\r\n{13}"; - foreach (Paragraph p in subtitle.Paragraphs) - { - count++; - var text = HtmlUtil.RemoveHtmlTags(p.Text, true); - - // to avoid rounding errors in duration - var startFrame = MillisecondsToFramesMaxFrameRate(p.StartTime.Milliseconds); - var endFrame = MillisecondsToFramesMaxFrameRate(p.EndTime.Milliseconds); - var durationCalc = new Paragraph( - new TimeCode(p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, FramesToMillisecondsMax999(startFrame)), - new TimeCode(p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, FramesToMillisecondsMax999(endFrame)), - string.Empty); - - sb.AppendLine(string.Format(writeFormat + Environment.NewLine, - p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, startFrame, - p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, endFrame, - durationCalc.Duration.Hours, durationCalc.Duration.Minutes, durationCalc.Duration.Seconds, MillisecondsToFramesMaxFrameRate(durationCalc.Duration.Milliseconds), - text.Length, text, count)); - } - return sb.ToString().Trim() + Environment.NewLine + Environment.NewLine + Environment.NewLine; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { //22 00:04:19:12 00:04:21:09 00:00:01:21 14 - _errorCount = 0; - Paragraph lastParagraph = null; - int count = 0; - foreach (string line in lines) - { - bool isTimeCode = false; - if (line.Length > 0) - { - bool success = false; - if (line.Length > 33 && line.IndexOf(':') > 1) - { - var match = Regex.Match(line); - if (match.Success) - { - isTimeCode = true; - if (lastParagraph != null) - { - subtitle.Paragraphs.Add(lastParagraph); - } - - var arr = line.Split('\t'); - TimeCode start = DecodeTimeCodeFrames(arr[1], SplitCharColon); - TimeCode end = DecodeTimeCodeFrames(arr[2], SplitCharColon); - lastParagraph = new Paragraph(start, end, string.Empty); - success = true; - } - } - if (!isTimeCode && !string.IsNullOrWhiteSpace(line) && lastParagraph != null && Utilities.GetNumberOfLines(lastParagraph.Text) < 5) - { - lastParagraph.Text = (lastParagraph.Text + Environment.NewLine + line).Trim(); - success = true; - } - if (!success && count > 9) - { - _errorCount++; - } - } - count++; - } - if (lastParagraph != null) - { - subtitle.Paragraphs.Add(lastParagraph); - } - - subtitle.Renumber(); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class SonyDVDArchitectLineDurationLength : SubtitleFormat + { + private static readonly Regex Regex = new Regex(@"^\d+\t\d\d:\d\d:\d\d:\d\d\t\d\d:\d\d:\d\d:\d\d\t\d\d:\d\d:\d\d:\d\d\t\d+$", RegexOptions.Compiled); + + public override string Extension => ".txt"; + + public override string Name => "Sony DVDArchitect line/dur/length"; + + public override string ToText(Subtitle subtitle, string title) + { + var sb = new StringBuilder(); + sb.AppendLine("Title: " + title); + sb.AppendLine("Translator: No Author"); + sb.AppendLine("Date: " + DateTime.Now.ToString("dd-MM-yyyy").Replace("-", ".")); // 25.08.2011 + double milliseconds = 0; + if (subtitle.Paragraphs.Count > 0) + { + milliseconds = subtitle.Paragraphs[subtitle.Paragraphs.Count - 1].EndTime.TotalMilliseconds; + } + + var tc = new TimeCode(milliseconds); + sb.AppendLine(string.Format("Duration: {0:00}:{1:00}:{2:00}:{3:00}", tc.Hours, tc.Minutes, tc.Seconds, MillisecondsToFramesMaxFrameRate(tc.Milliseconds))); // 01:20:49:12 + sb.AppendLine("Program start: 00:00:00:00"); + sb.AppendLine("Title count: " + subtitle.Paragraphs.Count); + sb.AppendLine(); + sb.AppendLine("#\tIn\tOut\tDuration\tLength"); + sb.AppendLine(); + int count = 0; + const string writeFormat = "{14}\t{0:00}:{1:00}:{2:00}:{3:00}\t{4:00}:{5:00}:{6:00}:{7:00}\t{8:00}:{9:00}:{10:00}:{11:00}\t{12}\r\n{13}"; + foreach (Paragraph p in subtitle.Paragraphs) + { + count++; + var text = HtmlUtil.RemoveHtmlTags(p.Text, true); + + // to avoid rounding errors in duration + var startFrame = MillisecondsToFramesMaxFrameRate(p.StartTime.Milliseconds); + var endFrame = MillisecondsToFramesMaxFrameRate(p.EndTime.Milliseconds); + var durationCalc = new Paragraph( + new TimeCode(p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, FramesToMillisecondsMax999(startFrame)), + new TimeCode(p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, FramesToMillisecondsMax999(endFrame)), + string.Empty); + + sb.AppendLine(string.Format(writeFormat + Environment.NewLine, + p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, startFrame, + p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, endFrame, + durationCalc.Duration.Hours, durationCalc.Duration.Minutes, durationCalc.Duration.Seconds, MillisecondsToFramesMaxFrameRate(durationCalc.Duration.Milliseconds), + text.Length, text, count)); + } + return sb.ToString().Trim() + Environment.NewLine + Environment.NewLine + Environment.NewLine; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { //22 00:04:19:12 00:04:21:09 00:00:01:21 14 + _errorCount = 0; + Paragraph lastParagraph = null; + int count = 0; + foreach (string line in lines) + { + bool isTimeCode = false; + if (line.Length > 0) + { + bool success = false; + if (line.Length > 33 && line.IndexOf(':') > 1) + { + var match = Regex.Match(line); + if (match.Success) + { + isTimeCode = true; + if (lastParagraph != null) + { + subtitle.Paragraphs.Add(lastParagraph); + } + + var arr = line.Split('\t'); + TimeCode start = DecodeTimeCodeFrames(arr[1], SplitCharColon); + TimeCode end = DecodeTimeCodeFrames(arr[2], SplitCharColon); + lastParagraph = new Paragraph(start, end, string.Empty); + success = true; + } + } + if (!isTimeCode && !string.IsNullOrWhiteSpace(line) && lastParagraph != null && Utilities.GetNumberOfLines(lastParagraph.Text) < 5) + { + lastParagraph.Text = (lastParagraph.Text + Environment.NewLine + line).Trim(); + success = true; + } + if (!success && count > 9) + { + _errorCount++; + } + } + count++; + } + if (lastParagraph != null) + { + subtitle.Paragraphs.Add(lastParagraph); + } + + subtitle.Renumber(); + } + + } +} diff --git a/libse/SubtitleFormats/SonyDVDArchitectTabs.cs b/src/libse/SubtitleFormats/SonyDVDArchitectTabs.cs similarity index 97% rename from libse/SubtitleFormats/SonyDVDArchitectTabs.cs rename to src/libse/SubtitleFormats/SonyDVDArchitectTabs.cs index e0506d9c2..a33afec78 100644 --- a/libse/SubtitleFormats/SonyDVDArchitectTabs.cs +++ b/src/libse/SubtitleFormats/SonyDVDArchitectTabs.cs @@ -1,95 +1,95 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class SonyDVDArchitectTabs : SubtitleFormat - { - private static readonly Regex Regex = new Regex(@"^\d\d:\d\d:\d\d:\d\d[ \t]+\d\d:\d\d:\d\d:\d\d[ \t]+", RegexOptions.Compiled); - - public override string Extension => ".sub"; - - public override string Name => "Sony DVDArchitect Tabs"; - - public override string ToText(Subtitle subtitle, string title) - { - var sb = new StringBuilder(); - const string writeFormat = "{0:00}:{1:00}:{2:00}:{3:00}\t{4:00}:{5:00}:{6:00}:{7:00}\t{8}"; - foreach (Paragraph p in subtitle.Paragraphs) - { - string text = HtmlUtil.RemoveHtmlTags(p.Text); - text = text.Replace(Environment.NewLine, "\r"); - sb.AppendLine(string.Format(writeFormat, p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, p.StartTime.Milliseconds / 10, - p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, p.EndTime.Milliseconds / 10, - text)); - } - return sb.ToString().Trim() + Environment.NewLine + Environment.NewLine + Environment.NewLine; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { //00:02:09:34 00:02:13:07 - Hvad mener du så om konkurrencen?- Jo, det er helt fint. - //00:02:14:02 00:02:16:41 - Var det den rigtige der vandt?- Ja, bestemt. - //newline = \r (0D) - - _errorCount = 0; - Paragraph lastParagraph = null; - foreach (string line in lines) - { - if (string.IsNullOrWhiteSpace(line)) - { - continue; - } - - bool success = false; - bool isTimeCode = false; - if (line.Length > 26 && line.IndexOf(':') == 2) - { - var match = Regex.Match(line); - if (match.Success) - { - isTimeCode = true; - string s = line.Substring(0, match.Length); - s = s.Replace('\t', ':'); - s = s.RemoveChar(' '); - s = s.Trim().TrimEnd(':').TrimEnd(); - string[] parts = s.Split(':'); - if (parts.Length == 8) - { - int hours = int.Parse(parts[0]); - int minutes = int.Parse(parts[1]); - int seconds = int.Parse(parts[2]); - int milliseconds = int.Parse(parts[3]) * 10; - var start = new TimeCode(hours, minutes, seconds, milliseconds); - - hours = int.Parse(parts[4]); - minutes = int.Parse(parts[5]); - seconds = int.Parse(parts[6]); - milliseconds = int.Parse(parts[7]) * 10; - var end = new TimeCode(hours, minutes, seconds, milliseconds); - - string text = line.Substring(match.Length).TrimStart(); - text = text.Replace("|", Environment.NewLine); - - lastParagraph = new Paragraph(start, end, text); - subtitle.Paragraphs.Add(lastParagraph); - success = true; - } - } - } - if (!isTimeCode && lastParagraph != null && Utilities.GetNumberOfLines(lastParagraph.Text) < 5) - { - lastParagraph.Text += Environment.NewLine + line.Trim(); - success = true; - } - if (!success) - { - _errorCount++; - } - } - subtitle.Renumber(); - } - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class SonyDVDArchitectTabs : SubtitleFormat + { + private static readonly Regex Regex = new Regex(@"^\d\d:\d\d:\d\d:\d\d[ \t]+\d\d:\d\d:\d\d:\d\d[ \t]+", RegexOptions.Compiled); + + public override string Extension => ".sub"; + + public override string Name => "Sony DVDArchitect Tabs"; + + public override string ToText(Subtitle subtitle, string title) + { + var sb = new StringBuilder(); + const string writeFormat = "{0:00}:{1:00}:{2:00}:{3:00}\t{4:00}:{5:00}:{6:00}:{7:00}\t{8}"; + foreach (Paragraph p in subtitle.Paragraphs) + { + string text = HtmlUtil.RemoveHtmlTags(p.Text); + text = text.Replace(Environment.NewLine, "\r"); + sb.AppendLine(string.Format(writeFormat, p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, p.StartTime.Milliseconds / 10, + p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, p.EndTime.Milliseconds / 10, + text)); + } + return sb.ToString().Trim() + Environment.NewLine + Environment.NewLine + Environment.NewLine; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { //00:02:09:34 00:02:13:07 - Hvad mener du så om konkurrencen?- Jo, det er helt fint. + //00:02:14:02 00:02:16:41 - Var det den rigtige der vandt?- Ja, bestemt. + //newline = \r (0D) + + _errorCount = 0; + Paragraph lastParagraph = null; + foreach (string line in lines) + { + if (string.IsNullOrWhiteSpace(line)) + { + continue; + } + + bool success = false; + bool isTimeCode = false; + if (line.Length > 26 && line.IndexOf(':') == 2) + { + var match = Regex.Match(line); + if (match.Success) + { + isTimeCode = true; + string s = line.Substring(0, match.Length); + s = s.Replace('\t', ':'); + s = s.RemoveChar(' '); + s = s.Trim().TrimEnd(':').TrimEnd(); + string[] parts = s.Split(':'); + if (parts.Length == 8) + { + int hours = int.Parse(parts[0]); + int minutes = int.Parse(parts[1]); + int seconds = int.Parse(parts[2]); + int milliseconds = int.Parse(parts[3]) * 10; + var start = new TimeCode(hours, minutes, seconds, milliseconds); + + hours = int.Parse(parts[4]); + minutes = int.Parse(parts[5]); + seconds = int.Parse(parts[6]); + milliseconds = int.Parse(parts[7]) * 10; + var end = new TimeCode(hours, minutes, seconds, milliseconds); + + string text = line.Substring(match.Length).TrimStart(); + text = text.Replace("|", Environment.NewLine); + + lastParagraph = new Paragraph(start, end, text); + subtitle.Paragraphs.Add(lastParagraph); + success = true; + } + } + } + if (!isTimeCode && lastParagraph != null && Utilities.GetNumberOfLines(lastParagraph.Text) < 5) + { + lastParagraph.Text += Environment.NewLine + line.Trim(); + success = true; + } + if (!success) + { + _errorCount++; + } + } + subtitle.Renumber(); + } + } +} diff --git a/libse/SubtitleFormats/SonyDVDArchitectWithLineNumbers.cs b/src/libse/SubtitleFormats/SonyDVDArchitectWithLineNumbers.cs similarity index 97% rename from libse/SubtitleFormats/SonyDVDArchitectWithLineNumbers.cs rename to src/libse/SubtitleFormats/SonyDVDArchitectWithLineNumbers.cs index 8b9d9ed6a..e9e5da856 100644 --- a/libse/SubtitleFormats/SonyDVDArchitectWithLineNumbers.cs +++ b/src/libse/SubtitleFormats/SonyDVDArchitectWithLineNumbers.cs @@ -1,127 +1,127 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class SonyDVDArchitectWithLineNumbers : SubtitleFormat - { - private static readonly Regex RegexTimeCode = new Regex(@"^\d\d\d\d \d\d:\d\d:\d\d:\d\d \d\d:\d\d:\d\d:\d\d", RegexOptions.Compiled); - private static readonly Regex Regex1DigitMilliseconds = new Regex(@"^\d\d\d\d \d\d\d:\d\d:\d\d:\d \d\d\d:\d\d:\d\d:\d", RegexOptions.Compiled); - - public override string Extension => ".sub"; - - public override string Name => "Sony DVDArchitect w. line#"; - - public override string ToText(Subtitle subtitle, string title) - { - var sb = new StringBuilder(); - foreach (Paragraph p in subtitle.Paragraphs) - { - string text = HtmlUtil.RemoveHtmlTags(p.Text); - text = text.Replace(Environment.NewLine, "\r"); - sb.AppendLine(string.Format("{9:0000} {0:00}:{1:00}:{2:00}:{3:00} {4:00}:{5:00}:{6:00}:{7:00} \t{8}" + Environment.NewLine, - p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, p.StartTime.Milliseconds / 10, - p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, p.EndTime.Milliseconds / 10, - text, p.Number)); - } - return sb.ToString().Trim() + Environment.NewLine + Environment.NewLine + Environment.NewLine; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { // 00:04:10:92 - 00:04:13:32 Raise Yourself To Help Mankind - // 00:04:27:92 - 00:04:30:92 الجهة المتولية للمسئولية الاجتماعية لشركتنا. - - _errorCount = 0; - Paragraph lastParagraph = null; - foreach (string line in lines) - { - if (string.IsNullOrWhiteSpace(line)) - { - continue; - } - - bool success = false; - if (line.IndexOf(':') > 0) - { - string s = line; - var match = RegexTimeCode.Match(s); - var match1DigitMilliseconds = Regex1DigitMilliseconds.Match(s); - if (s.Length > 31 && match.Success) - { - s = s.Substring(5, match.Length - 5).TrimStart(); - s = s.Replace(" ", ":"); - s = s.RemoveChar(' '); - string[] parts = s.Split(':'); - if (parts.Length == 8) - { - int hours = int.Parse(parts[0]); - int minutes = int.Parse(parts[1]); - int seconds = int.Parse(parts[2]); - int milliseconds = int.Parse(parts[3]) * 10; - var start = new TimeCode(hours, minutes, seconds, milliseconds); - - hours = int.Parse(parts[4]); - minutes = int.Parse(parts[5]); - seconds = int.Parse(parts[6]); - milliseconds = int.Parse(parts[7]) * 10; - var end = new TimeCode(hours, minutes, seconds, milliseconds); - - string text = line.Replace("\0", string.Empty).Substring(match.Length).TrimStart(); - text = text.Replace("|", Environment.NewLine); - - lastParagraph = new Paragraph(start, end, text); - subtitle.Paragraphs.Add(lastParagraph); - success = true; - } - } - else if (s.Length > 29 && match1DigitMilliseconds.Success) - { - s = s.Substring(5, match1DigitMilliseconds.Length - 5).TrimStart(); - s = s.Replace(" ", ":"); - s = s.RemoveChar(' '); - string[] parts = s.Split(':'); - if (parts.Length == 8) - { - int hours = int.Parse(parts[0]); - int minutes = int.Parse(parts[1]); - int seconds = int.Parse(parts[2]); - int milliseconds = int.Parse(parts[3]) * 10; - var start = new TimeCode(hours, minutes, seconds, milliseconds); - - hours = int.Parse(parts[4]); - minutes = int.Parse(parts[5]); - seconds = int.Parse(parts[6]); - milliseconds = int.Parse(parts[7]) * 10; - var end = new TimeCode(hours, minutes, seconds, milliseconds); - - string text = line.Replace("\0", string.Empty).Substring(match1DigitMilliseconds.Length).TrimStart(); - text = text.Replace("|", Environment.NewLine); - - lastParagraph = new Paragraph(start, end, text); - subtitle.Paragraphs.Add(lastParagraph); - success = true; - } - } - else if (lastParagraph != null && Utilities.GetNumberOfLines(lastParagraph.Text) < 5) - { - lastParagraph.Text += Environment.NewLine + line.Trim(); - success = true; - } - } - else if (lastParagraph != null && Utilities.GetNumberOfLines(lastParagraph.Text) < 5) - { - lastParagraph.Text += Environment.NewLine + line.Trim(); - success = true; - } - if (!success) - { - _errorCount++; - } - } - subtitle.Renumber(); - } - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class SonyDVDArchitectWithLineNumbers : SubtitleFormat + { + private static readonly Regex RegexTimeCode = new Regex(@"^\d\d\d\d \d\d:\d\d:\d\d:\d\d \d\d:\d\d:\d\d:\d\d", RegexOptions.Compiled); + private static readonly Regex Regex1DigitMilliseconds = new Regex(@"^\d\d\d\d \d\d\d:\d\d:\d\d:\d \d\d\d:\d\d:\d\d:\d", RegexOptions.Compiled); + + public override string Extension => ".sub"; + + public override string Name => "Sony DVDArchitect w. line#"; + + public override string ToText(Subtitle subtitle, string title) + { + var sb = new StringBuilder(); + foreach (Paragraph p in subtitle.Paragraphs) + { + string text = HtmlUtil.RemoveHtmlTags(p.Text); + text = text.Replace(Environment.NewLine, "\r"); + sb.AppendLine(string.Format("{9:0000} {0:00}:{1:00}:{2:00}:{3:00} {4:00}:{5:00}:{6:00}:{7:00} \t{8}" + Environment.NewLine, + p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, p.StartTime.Milliseconds / 10, + p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, p.EndTime.Milliseconds / 10, + text, p.Number)); + } + return sb.ToString().Trim() + Environment.NewLine + Environment.NewLine + Environment.NewLine; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { // 00:04:10:92 - 00:04:13:32 Raise Yourself To Help Mankind + // 00:04:27:92 - 00:04:30:92 الجهة المتولية للمسئولية الاجتماعية لشركتنا. + + _errorCount = 0; + Paragraph lastParagraph = null; + foreach (string line in lines) + { + if (string.IsNullOrWhiteSpace(line)) + { + continue; + } + + bool success = false; + if (line.IndexOf(':') > 0) + { + string s = line; + var match = RegexTimeCode.Match(s); + var match1DigitMilliseconds = Regex1DigitMilliseconds.Match(s); + if (s.Length > 31 && match.Success) + { + s = s.Substring(5, match.Length - 5).TrimStart(); + s = s.Replace(" ", ":"); + s = s.RemoveChar(' '); + string[] parts = s.Split(':'); + if (parts.Length == 8) + { + int hours = int.Parse(parts[0]); + int minutes = int.Parse(parts[1]); + int seconds = int.Parse(parts[2]); + int milliseconds = int.Parse(parts[3]) * 10; + var start = new TimeCode(hours, minutes, seconds, milliseconds); + + hours = int.Parse(parts[4]); + minutes = int.Parse(parts[5]); + seconds = int.Parse(parts[6]); + milliseconds = int.Parse(parts[7]) * 10; + var end = new TimeCode(hours, minutes, seconds, milliseconds); + + string text = line.Replace("\0", string.Empty).Substring(match.Length).TrimStart(); + text = text.Replace("|", Environment.NewLine); + + lastParagraph = new Paragraph(start, end, text); + subtitle.Paragraphs.Add(lastParagraph); + success = true; + } + } + else if (s.Length > 29 && match1DigitMilliseconds.Success) + { + s = s.Substring(5, match1DigitMilliseconds.Length - 5).TrimStart(); + s = s.Replace(" ", ":"); + s = s.RemoveChar(' '); + string[] parts = s.Split(':'); + if (parts.Length == 8) + { + int hours = int.Parse(parts[0]); + int minutes = int.Parse(parts[1]); + int seconds = int.Parse(parts[2]); + int milliseconds = int.Parse(parts[3]) * 10; + var start = new TimeCode(hours, minutes, seconds, milliseconds); + + hours = int.Parse(parts[4]); + minutes = int.Parse(parts[5]); + seconds = int.Parse(parts[6]); + milliseconds = int.Parse(parts[7]) * 10; + var end = new TimeCode(hours, minutes, seconds, milliseconds); + + string text = line.Replace("\0", string.Empty).Substring(match1DigitMilliseconds.Length).TrimStart(); + text = text.Replace("|", Environment.NewLine); + + lastParagraph = new Paragraph(start, end, text); + subtitle.Paragraphs.Add(lastParagraph); + success = true; + } + } + else if (lastParagraph != null && Utilities.GetNumberOfLines(lastParagraph.Text) < 5) + { + lastParagraph.Text += Environment.NewLine + line.Trim(); + success = true; + } + } + else if (lastParagraph != null && Utilities.GetNumberOfLines(lastParagraph.Text) < 5) + { + lastParagraph.Text += Environment.NewLine + line.Trim(); + success = true; + } + if (!success) + { + _errorCount++; + } + } + subtitle.Renumber(); + } + } +} diff --git a/libse/SubtitleFormats/Speechmatics.cs b/src/libse/SubtitleFormats/Speechmatics.cs similarity index 100% rename from libse/SubtitleFormats/Speechmatics.cs rename to src/libse/SubtitleFormats/Speechmatics.cs diff --git a/libse/SubtitleFormats/Spruce.cs b/src/libse/SubtitleFormats/Spruce.cs similarity index 97% rename from libse/SubtitleFormats/Spruce.cs rename to src/libse/SubtitleFormats/Spruce.cs index 902179e16..5c8aa6b5a 100644 --- a/libse/SubtitleFormats/Spruce.cs +++ b/src/libse/SubtitleFormats/Spruce.cs @@ -1,215 +1,215 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class Spruce : SubtitleFormat - { - private const string Italic = "^I"; - private const string Bold = "^B"; - private const string Underline = "^U"; - - private static readonly Regex RegexTimeCodes1 = new Regex(@"^\d\d:\d\d:\d\d:\d\d,\d\d:\d\d:\d\d:\d\d,.+", RegexOptions.Compiled); - private static readonly Regex RegexTimeCodes2 = new Regex(@"^\d\d:\d\d:\d\d:\d\d,\d\d:\d\d:\d\d:\d\d,", RegexOptions.Compiled); // Matches time-only. - - public override string Extension => ".stl"; - - public override string Name => "Spruce Subtitle File"; - - public override string ToText(Subtitle subtitle, string title) - { - const string header = @"//Font select and font size -$FontName = Arial -$FontSize = 30 - -//Character attributes (global) -$Bold = FALSE -$UnderLined = FALSE -$Italic = FALSE - -//Position Control -$HorzAlign = Center -$VertAlign = Bottom -$XOffset = 0 -$YOffset = 0 - -//Contrast Control -$TextContrast = 15 -$Outline1Contrast = 8 -$Outline2Contrast = 15 -$BackgroundContrast = 0 - -//Effects Control -$ForceDisplay = FALSE -$FadeIn = 0 -$FadeOut = 0 - -//Other Controls -$TapeOffset = FALSE -//$SetFilePathToken = <<:>> - -//Colors -$ColorIndex1 = 0 -$ColorIndex2 = 1 -$ColorIndex3 = 2 -$ColorIndex4 = 3 - -//Subtitles"; - - var lastVerticalAlign = "$VertAlign = Bottom"; - var lastHorizontalcalAlign = "$HorzAlign = Center"; - var sb = new StringBuilder(); - sb.AppendLine(header); - foreach (Paragraph p in subtitle.Paragraphs) - { - DvdStudioPro.ToTextAlignment(p, sb, ref lastVerticalAlign, ref lastHorizontalcalAlign); - sb.AppendLine($"{EncodeTimeCode(p.StartTime)},{EncodeTimeCode(p.EndTime)},{EncodeText(p.Text)}"); - } - return sb.ToString(); - } - - private static string EncodeText(string input) - { - var text = HtmlUtil.FixUpperTags(input); - bool allItalic = text.StartsWith("", StringComparison.Ordinal) && text.EndsWith("", StringComparison.Ordinal) && Utilities.CountTagInText(text, "") == 1; - text = text.Replace("", Bold); - text = text.Replace("", Bold); - text = text.Replace("", Italic); - text = text.Replace("", Italic); - text = text.Replace("", Underline); - text = text.Replace("", Underline); - text = HtmlUtil.RemoveHtmlTags(text, true); - if (allItalic) - { - return text.Replace(Environment.NewLine, "^I|^I"); - } - - return text.Replace(Environment.NewLine, "|"); - } - - private static string EncodeTimeCode(TimeCode time) - { - //00:01:54:19 - int frames = MillisecondsToFramesMaxFrameRate(time.Milliseconds); - return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}:{frames:00}"; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - //00:01:54:19,00:01:56:17,We should be thankful|they accepted our offer. - _errorCount = 0; - subtitle.Paragraphs.Clear(); - - // Copy reference of static compiled regex (RegexTimeCodes1). - Regex timeCodeRegex = RegexTimeCodes1; - if (fileName != null && fileName.EndsWith(".stl", StringComparison.OrdinalIgnoreCase)) // allow empty text if extension is ".stl"... - { - timeCodeRegex = RegexTimeCodes2; - } - - var verticalAlign = "$VertAlign=Bottom"; - var horizontalAlign = "$HorzAlign=Center"; - foreach (string line in lines) - { - if (line.IndexOf(':') == 2 && timeCodeRegex.IsMatch(line)) - { - string start = line.Substring(0, 11); - string end = line.Substring(12, 11); - - try - { - var text = DecodeText(line.Substring(24)); - text = DvdStudioPro.GetAlignment(verticalAlign, horizontalAlign) + text; - Paragraph p = new Paragraph(DecodeTimeCode(start), DecodeTimeCode(end), text); - subtitle.Paragraphs.Add(p); - } - catch - { - _errorCount++; - } - } - else if (line.TrimStart().StartsWith("$VertAlign", StringComparison.OrdinalIgnoreCase)) - { - verticalAlign = line.RemoveChar(' ').RemoveChar('\t'); - } - else if (line.TrimStart().StartsWith("$HorzAlign", StringComparison.OrdinalIgnoreCase)) - { - horizontalAlign = line.RemoveChar(' ').RemoveChar('\t'); - } - else if (!string.IsNullOrWhiteSpace(line) && !line.StartsWith("//", StringComparison.Ordinal) && !line.StartsWith('$')) - { - _errorCount++; - } - } - subtitle.Renumber(); - } - - private static TimeCode DecodeTimeCode(string time) - { - //00:01:54:19 - string hour = time.Substring(0, 2); - string minutes = time.Substring(3, 2); - string seconds = time.Substring(6, 2); - string frames = time.Substring(9, 2); - - int milliseconds = FramesToMillisecondsMax999(int.Parse(frames)); - return new TimeCode(int.Parse(hour), int.Parse(minutes), int.Parse(seconds), milliseconds); - } - - private static string DecodeText(string input) - { - var text = input.Replace("|", Environment.NewLine); - - //^IBrillstein^I - if (text.Contains(Bold)) - { - text = DecoderTextExtension(text, Bold, ""); - } - if (text.Contains(Italic)) - { - text = DecoderTextExtension(text, Italic, ""); - } - if (text.Contains(Underline)) - { - text = DecoderTextExtension(text, Underline, ""); - } - - return text; - } - - private static string DecoderTextExtension(string input, string spruceTag, string htmlOpenTag) - { - var htmlCloseTag = htmlOpenTag.Insert(1, "/"); - var text = input; - var idx = text.IndexOf(spruceTag, StringComparison.Ordinal); - var c = Utilities.CountTagInText(text, spruceTag); - if (c == 1) - { - var l = idx + spruceTag.Length; - if (l < text.Length) - { - text = text.Replace(spruceTag, htmlOpenTag) + htmlCloseTag; - } - else if (l == text.Length) // Brillstein^I - { - text = text.Remove(text.Length - Italic.Length); - } - } - else if (c > 1) - { - var isOpen = true; - while (idx >= 0) - { - var htmlTag = isOpen ? htmlOpenTag : htmlCloseTag; - text = text.Remove(idx, spruceTag.Length).Insert(idx, htmlTag); - isOpen = !isOpen; - idx = text.IndexOf(spruceTag, idx + htmlTag.Length, StringComparison.Ordinal); - } - } - return text; - } - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class Spruce : SubtitleFormat + { + private const string Italic = "^I"; + private const string Bold = "^B"; + private const string Underline = "^U"; + + private static readonly Regex RegexTimeCodes1 = new Regex(@"^\d\d:\d\d:\d\d:\d\d,\d\d:\d\d:\d\d:\d\d,.+", RegexOptions.Compiled); + private static readonly Regex RegexTimeCodes2 = new Regex(@"^\d\d:\d\d:\d\d:\d\d,\d\d:\d\d:\d\d:\d\d,", RegexOptions.Compiled); // Matches time-only. + + public override string Extension => ".stl"; + + public override string Name => "Spruce Subtitle File"; + + public override string ToText(Subtitle subtitle, string title) + { + const string header = @"//Font select and font size +$FontName = Arial +$FontSize = 30 + +//Character attributes (global) +$Bold = FALSE +$UnderLined = FALSE +$Italic = FALSE + +//Position Control +$HorzAlign = Center +$VertAlign = Bottom +$XOffset = 0 +$YOffset = 0 + +//Contrast Control +$TextContrast = 15 +$Outline1Contrast = 8 +$Outline2Contrast = 15 +$BackgroundContrast = 0 + +//Effects Control +$ForceDisplay = FALSE +$FadeIn = 0 +$FadeOut = 0 + +//Other Controls +$TapeOffset = FALSE +//$SetFilePathToken = <<:>> + +//Colors +$ColorIndex1 = 0 +$ColorIndex2 = 1 +$ColorIndex3 = 2 +$ColorIndex4 = 3 + +//Subtitles"; + + var lastVerticalAlign = "$VertAlign = Bottom"; + var lastHorizontalcalAlign = "$HorzAlign = Center"; + var sb = new StringBuilder(); + sb.AppendLine(header); + foreach (Paragraph p in subtitle.Paragraphs) + { + DvdStudioPro.ToTextAlignment(p, sb, ref lastVerticalAlign, ref lastHorizontalcalAlign); + sb.AppendLine($"{EncodeTimeCode(p.StartTime)},{EncodeTimeCode(p.EndTime)},{EncodeText(p.Text)}"); + } + return sb.ToString(); + } + + private static string EncodeText(string input) + { + var text = HtmlUtil.FixUpperTags(input); + bool allItalic = text.StartsWith("", StringComparison.Ordinal) && text.EndsWith("", StringComparison.Ordinal) && Utilities.CountTagInText(text, "") == 1; + text = text.Replace("", Bold); + text = text.Replace("", Bold); + text = text.Replace("", Italic); + text = text.Replace("", Italic); + text = text.Replace("", Underline); + text = text.Replace("", Underline); + text = HtmlUtil.RemoveHtmlTags(text, true); + if (allItalic) + { + return text.Replace(Environment.NewLine, "^I|^I"); + } + + return text.Replace(Environment.NewLine, "|"); + } + + private static string EncodeTimeCode(TimeCode time) + { + //00:01:54:19 + int frames = MillisecondsToFramesMaxFrameRate(time.Milliseconds); + return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}:{frames:00}"; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + //00:01:54:19,00:01:56:17,We should be thankful|they accepted our offer. + _errorCount = 0; + subtitle.Paragraphs.Clear(); + + // Copy reference of static compiled regex (RegexTimeCodes1). + Regex timeCodeRegex = RegexTimeCodes1; + if (fileName != null && fileName.EndsWith(".stl", StringComparison.OrdinalIgnoreCase)) // allow empty text if extension is ".stl"... + { + timeCodeRegex = RegexTimeCodes2; + } + + var verticalAlign = "$VertAlign=Bottom"; + var horizontalAlign = "$HorzAlign=Center"; + foreach (string line in lines) + { + if (line.IndexOf(':') == 2 && timeCodeRegex.IsMatch(line)) + { + string start = line.Substring(0, 11); + string end = line.Substring(12, 11); + + try + { + var text = DecodeText(line.Substring(24)); + text = DvdStudioPro.GetAlignment(verticalAlign, horizontalAlign) + text; + Paragraph p = new Paragraph(DecodeTimeCode(start), DecodeTimeCode(end), text); + subtitle.Paragraphs.Add(p); + } + catch + { + _errorCount++; + } + } + else if (line.TrimStart().StartsWith("$VertAlign", StringComparison.OrdinalIgnoreCase)) + { + verticalAlign = line.RemoveChar(' ').RemoveChar('\t'); + } + else if (line.TrimStart().StartsWith("$HorzAlign", StringComparison.OrdinalIgnoreCase)) + { + horizontalAlign = line.RemoveChar(' ').RemoveChar('\t'); + } + else if (!string.IsNullOrWhiteSpace(line) && !line.StartsWith("//", StringComparison.Ordinal) && !line.StartsWith('$')) + { + _errorCount++; + } + } + subtitle.Renumber(); + } + + private static TimeCode DecodeTimeCode(string time) + { + //00:01:54:19 + string hour = time.Substring(0, 2); + string minutes = time.Substring(3, 2); + string seconds = time.Substring(6, 2); + string frames = time.Substring(9, 2); + + int milliseconds = FramesToMillisecondsMax999(int.Parse(frames)); + return new TimeCode(int.Parse(hour), int.Parse(minutes), int.Parse(seconds), milliseconds); + } + + private static string DecodeText(string input) + { + var text = input.Replace("|", Environment.NewLine); + + //^IBrillstein^I + if (text.Contains(Bold)) + { + text = DecoderTextExtension(text, Bold, ""); + } + if (text.Contains(Italic)) + { + text = DecoderTextExtension(text, Italic, ""); + } + if (text.Contains(Underline)) + { + text = DecoderTextExtension(text, Underline, ""); + } + + return text; + } + + private static string DecoderTextExtension(string input, string spruceTag, string htmlOpenTag) + { + var htmlCloseTag = htmlOpenTag.Insert(1, "/"); + var text = input; + var idx = text.IndexOf(spruceTag, StringComparison.Ordinal); + var c = Utilities.CountTagInText(text, spruceTag); + if (c == 1) + { + var l = idx + spruceTag.Length; + if (l < text.Length) + { + text = text.Replace(spruceTag, htmlOpenTag) + htmlCloseTag; + } + else if (l == text.Length) // Brillstein^I + { + text = text.Remove(text.Length - Italic.Length); + } + } + else if (c > 1) + { + var isOpen = true; + while (idx >= 0) + { + var htmlTag = isOpen ? htmlOpenTag : htmlCloseTag; + text = text.Remove(idx, spruceTag.Length).Insert(idx, htmlTag); + isOpen = !isOpen; + idx = text.IndexOf(spruceTag, idx + htmlTag.Length, StringComparison.Ordinal); + } + } + return text; + } + } +} diff --git a/libse/SubtitleFormats/SpruceWithSpace.cs b/src/libse/SubtitleFormats/SpruceWithSpace.cs similarity index 97% rename from libse/SubtitleFormats/SpruceWithSpace.cs rename to src/libse/SubtitleFormats/SpruceWithSpace.cs index 8571246b2..98ab7bbc8 100644 --- a/libse/SubtitleFormats/SpruceWithSpace.cs +++ b/src/libse/SubtitleFormats/SpruceWithSpace.cs @@ -1,196 +1,196 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class SpruceWithSpace : SubtitleFormat - { - - private static readonly Regex RegexTimeCodes = new Regex(@"^\d\d:\d\d:\d\d:\d\d, \d\d:\d\d:\d\d:\d\d,.+", RegexOptions.Compiled); - - public override string Extension => ".stl"; - - public override string Name => "Spruce Subtitle With Space"; - - public override string ToText(Subtitle subtitle, string title) - { - const string header = @"$FontName = Arial -$FontSize = 34 -$HorzAlign = Left -$VertAlign = Bottom -$XOffset = 0 -$YOffset = 0 -$Bold = FALSE -$UnderLined = FALSE -$Italic = FALSE -$TextContrast = 15 -$Outline1Contrast = 15 -$Outline2Contrast = 15 -$BackgroundContrast = 0 -$ForceDisplay = FALSE -$FadeIn = 0 -$FadeOut = 0 -$TapeOffset = FALSE - -\\Colour 0 = Black -\\Colour 1 = Red -\\Colour 2 = Green -\\Colour 3 = Yellow -\\Colour 4 = Blue -\\Colour 5 = Magenta -\\Colour 6 = Cyan -\\Colour 7 = White -"; - - var lastVerticalAlign = "$VertAlign = Bottom"; - var lastHorizontalcalAlign = "$HorzAlign = Center"; - var sb = new StringBuilder(); - sb.AppendLine(header); - foreach (Paragraph p in subtitle.Paragraphs) - { - sb = ToTextAlignment(p, sb, ref lastVerticalAlign, ref lastHorizontalcalAlign); - sb.AppendLine($"{EncodeTimeCode(p.StartTime)}, {EncodeTimeCode(p.EndTime)}, {EncodeText(p.Text)}"); - } - return sb.ToString(); - } - - private static StringBuilder ToTextAlignment(Paragraph p, StringBuilder sb, ref string lastVerticalAlign, ref string lastHorizontalAlign) - { - string verticalAlign; - string horizontalAlign; - bool verticalTopAlign = p.Text.StartsWith("{\\an7}", StringComparison.Ordinal) || - p.Text.StartsWith("{\\an8}", StringComparison.Ordinal) || - p.Text.StartsWith("{\\an9}", StringComparison.Ordinal); - bool verticalCenterAlign = p.Text.StartsWith("{\\an4}", StringComparison.Ordinal) || - p.Text.StartsWith("{\\an5}", StringComparison.Ordinal) || - p.Text.StartsWith("{\\an6}", StringComparison.Ordinal); - if (verticalTopAlign) - { - verticalAlign = "$VertAlign = Top"; - } - else if (verticalCenterAlign) - { - verticalAlign = "$VertAlign = Center"; - } - else - { - verticalAlign = "$VertAlign = Bottom"; - } - - if (lastVerticalAlign != verticalAlign) - { - sb.AppendLine(verticalAlign); - } - - bool horizontalLeftAlign = p.Text.StartsWith("{\\an1}", StringComparison.Ordinal) || - p.Text.StartsWith("{\\an4}", StringComparison.Ordinal) || - p.Text.StartsWith("{\\an7}", StringComparison.Ordinal); - bool horizontalRightAlign = p.Text.StartsWith("{\\an3}", StringComparison.Ordinal) || - p.Text.StartsWith("{\\an6}", StringComparison.Ordinal) || - p.Text.StartsWith("{\\an9}", StringComparison.Ordinal); - if (horizontalLeftAlign) - { - horizontalAlign = "$HorzAlign = Left"; - } - else if (horizontalRightAlign) - { - horizontalAlign = "$HorzAlign = Right"; - } - else - { - horizontalAlign = "$HorzAlign = Center"; - } - - sb.AppendLine(horizontalAlign); - - lastVerticalAlign = verticalAlign; - lastHorizontalAlign = horizontalAlign; - return sb; - } - - private static string EncodeText(string input) - { - var text = input.Replace("", "^B") - .Replace("", string.Empty) - .Replace("", "^I") - .Replace("", string.Empty) - .Replace("", "^U") - .Replace("", string.Empty); - return HtmlUtil.RemoveHtmlTags(text, true).Replace(Environment.NewLine, "|"); - } - - private static string EncodeTimeCode(TimeCode time) - { - //00:01:54:19 - return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}:{MillisecondsToFramesMaxFrameRate(time.Milliseconds):00}"; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - //00:01:54:19,00:01:56:17,We should be thankful|they accepted our offer. - _errorCount = 0; - var verticalAlign = "$VertAlign=Bottom"; - var horizontalAlign = "$HorzAlign=Center"; - subtitle.Paragraphs.Clear(); - foreach (string line in lines) - { - if (line.IndexOf(':') == 2 && RegexTimeCodes.IsMatch(line)) - { - string start = line.Substring(0, 11); - string end = line.Substring(13, 11); - - try - { - var text = DecodeText(line.Substring(25).Trim()); - text = DvdStudioPro.GetAlignment(verticalAlign, horizontalAlign) + text; - var startTime = DecodeTimeCodeFramesFourParts(start.Split(SplitCharColon, StringSplitOptions.RemoveEmptyEntries)); - var endTime = DecodeTimeCodeFramesFourParts(end.Split(SplitCharColon, StringSplitOptions.RemoveEmptyEntries)); - var p = new Paragraph(startTime, endTime, text); - subtitle.Paragraphs.Add(p); - } - catch - { - _errorCount++; - } - } - else if (line.TrimStart().StartsWith("$VertAlign", StringComparison.OrdinalIgnoreCase)) - { - verticalAlign = line.RemoveChar(' ').RemoveChar('\t'); - } - else if (line.TrimStart().StartsWith("$HorzAlign", StringComparison.OrdinalIgnoreCase)) - { - horizontalAlign = line.RemoveChar(' ').RemoveChar('\t'); - } - else if (!string.IsNullOrWhiteSpace(line) && !line.StartsWith("//", StringComparison.Ordinal) && !line.StartsWith('$')) - { - _errorCount++; - } - } - subtitle.Renumber(); - } - - private static string DecodeText(string text) - { // TODO: Improve end tags - text = text.Replace("|", Environment.NewLine); - if (text.Contains("^B")) - { - text = text.Replace("^B", "") + ""; - } - - if (text.Contains("^I")) - { - text = text.Replace("^I", "") + ""; - } - - if (text.Contains("^U")) - { - text = text.Replace("^U", "") + ""; - } - - return text; - } - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class SpruceWithSpace : SubtitleFormat + { + + private static readonly Regex RegexTimeCodes = new Regex(@"^\d\d:\d\d:\d\d:\d\d, \d\d:\d\d:\d\d:\d\d,.+", RegexOptions.Compiled); + + public override string Extension => ".stl"; + + public override string Name => "Spruce Subtitle With Space"; + + public override string ToText(Subtitle subtitle, string title) + { + const string header = @"$FontName = Arial +$FontSize = 34 +$HorzAlign = Left +$VertAlign = Bottom +$XOffset = 0 +$YOffset = 0 +$Bold = FALSE +$UnderLined = FALSE +$Italic = FALSE +$TextContrast = 15 +$Outline1Contrast = 15 +$Outline2Contrast = 15 +$BackgroundContrast = 0 +$ForceDisplay = FALSE +$FadeIn = 0 +$FadeOut = 0 +$TapeOffset = FALSE + +\\Colour 0 = Black +\\Colour 1 = Red +\\Colour 2 = Green +\\Colour 3 = Yellow +\\Colour 4 = Blue +\\Colour 5 = Magenta +\\Colour 6 = Cyan +\\Colour 7 = White +"; + + var lastVerticalAlign = "$VertAlign = Bottom"; + var lastHorizontalcalAlign = "$HorzAlign = Center"; + var sb = new StringBuilder(); + sb.AppendLine(header); + foreach (Paragraph p in subtitle.Paragraphs) + { + sb = ToTextAlignment(p, sb, ref lastVerticalAlign, ref lastHorizontalcalAlign); + sb.AppendLine($"{EncodeTimeCode(p.StartTime)}, {EncodeTimeCode(p.EndTime)}, {EncodeText(p.Text)}"); + } + return sb.ToString(); + } + + private static StringBuilder ToTextAlignment(Paragraph p, StringBuilder sb, ref string lastVerticalAlign, ref string lastHorizontalAlign) + { + string verticalAlign; + string horizontalAlign; + bool verticalTopAlign = p.Text.StartsWith("{\\an7}", StringComparison.Ordinal) || + p.Text.StartsWith("{\\an8}", StringComparison.Ordinal) || + p.Text.StartsWith("{\\an9}", StringComparison.Ordinal); + bool verticalCenterAlign = p.Text.StartsWith("{\\an4}", StringComparison.Ordinal) || + p.Text.StartsWith("{\\an5}", StringComparison.Ordinal) || + p.Text.StartsWith("{\\an6}", StringComparison.Ordinal); + if (verticalTopAlign) + { + verticalAlign = "$VertAlign = Top"; + } + else if (verticalCenterAlign) + { + verticalAlign = "$VertAlign = Center"; + } + else + { + verticalAlign = "$VertAlign = Bottom"; + } + + if (lastVerticalAlign != verticalAlign) + { + sb.AppendLine(verticalAlign); + } + + bool horizontalLeftAlign = p.Text.StartsWith("{\\an1}", StringComparison.Ordinal) || + p.Text.StartsWith("{\\an4}", StringComparison.Ordinal) || + p.Text.StartsWith("{\\an7}", StringComparison.Ordinal); + bool horizontalRightAlign = p.Text.StartsWith("{\\an3}", StringComparison.Ordinal) || + p.Text.StartsWith("{\\an6}", StringComparison.Ordinal) || + p.Text.StartsWith("{\\an9}", StringComparison.Ordinal); + if (horizontalLeftAlign) + { + horizontalAlign = "$HorzAlign = Left"; + } + else if (horizontalRightAlign) + { + horizontalAlign = "$HorzAlign = Right"; + } + else + { + horizontalAlign = "$HorzAlign = Center"; + } + + sb.AppendLine(horizontalAlign); + + lastVerticalAlign = verticalAlign; + lastHorizontalAlign = horizontalAlign; + return sb; + } + + private static string EncodeText(string input) + { + var text = input.Replace("", "^B") + .Replace("", string.Empty) + .Replace("", "^I") + .Replace("", string.Empty) + .Replace("", "^U") + .Replace("", string.Empty); + return HtmlUtil.RemoveHtmlTags(text, true).Replace(Environment.NewLine, "|"); + } + + private static string EncodeTimeCode(TimeCode time) + { + //00:01:54:19 + return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}:{MillisecondsToFramesMaxFrameRate(time.Milliseconds):00}"; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + //00:01:54:19,00:01:56:17,We should be thankful|they accepted our offer. + _errorCount = 0; + var verticalAlign = "$VertAlign=Bottom"; + var horizontalAlign = "$HorzAlign=Center"; + subtitle.Paragraphs.Clear(); + foreach (string line in lines) + { + if (line.IndexOf(':') == 2 && RegexTimeCodes.IsMatch(line)) + { + string start = line.Substring(0, 11); + string end = line.Substring(13, 11); + + try + { + var text = DecodeText(line.Substring(25).Trim()); + text = DvdStudioPro.GetAlignment(verticalAlign, horizontalAlign) + text; + var startTime = DecodeTimeCodeFramesFourParts(start.Split(SplitCharColon, StringSplitOptions.RemoveEmptyEntries)); + var endTime = DecodeTimeCodeFramesFourParts(end.Split(SplitCharColon, StringSplitOptions.RemoveEmptyEntries)); + var p = new Paragraph(startTime, endTime, text); + subtitle.Paragraphs.Add(p); + } + catch + { + _errorCount++; + } + } + else if (line.TrimStart().StartsWith("$VertAlign", StringComparison.OrdinalIgnoreCase)) + { + verticalAlign = line.RemoveChar(' ').RemoveChar('\t'); + } + else if (line.TrimStart().StartsWith("$HorzAlign", StringComparison.OrdinalIgnoreCase)) + { + horizontalAlign = line.RemoveChar(' ').RemoveChar('\t'); + } + else if (!string.IsNullOrWhiteSpace(line) && !line.StartsWith("//", StringComparison.Ordinal) && !line.StartsWith('$')) + { + _errorCount++; + } + } + subtitle.Renumber(); + } + + private static string DecodeText(string text) + { // TODO: Improve end tags + text = text.Replace("|", Environment.NewLine); + if (text.Contains("^B")) + { + text = text.Replace("^B", "") + ""; + } + + if (text.Contains("^I")) + { + text = text.Replace("^I", "") + ""; + } + + if (text.Contains("^U")) + { + text = text.Replace("^U", "") + ""; + } + + return text; + } + } +} diff --git a/libse/SubtitleFormats/Spt.cs b/src/libse/SubtitleFormats/Spt.cs similarity index 96% rename from libse/SubtitleFormats/Spt.cs rename to src/libse/SubtitleFormats/Spt.cs index 5cb479ba3..6060f791e 100644 --- a/libse/SubtitleFormats/Spt.cs +++ b/src/libse/SubtitleFormats/Spt.cs @@ -1,177 +1,177 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class Spt : SubtitleFormat - { - public override string Extension => ".spt"; - - public const string NameOfFormat = "spt"; - - public override string Name => NameOfFormat; - - public static void Save(string fileName, Subtitle subtitle) - { - var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write); - - // header - fs.WriteByte(1); - for (int i = 1; i < 23; i++) - { - fs.WriteByte(0); - } - - fs.WriteByte(0x60); - - // paragraphs - foreach (Paragraph p in subtitle.Paragraphs) - { - WriteParagraph(p); - } - - // footer - fs.WriteByte(0xff); - for (int i = 0; i < 11; i++) - { - fs.WriteByte(0); - } - - fs.WriteByte(0x11); - byte[] footerBuffer = Encoding.ASCII.GetBytes("dummy end of file"); - fs.Write(footerBuffer, 0, footerBuffer.Length); - - fs.Close(); - } - - private static void WriteParagraph(Paragraph p) - { - WriteTimeCode(); - WriteTimeCode(); - - string text = p.Text; - if (Utilities.GetNumberOfLines(text) > 2) - { - text = Utilities.AutoBreakLine(p.Text); - } - - var lines = text.SplitToLines(); - int textLengthFirstLine = 0; - int textLengthSecondLine = 0; - if (lines.Count > 0) - { - textLengthFirstLine = lines[0].Length; - if (lines.Count > 1) - { - textLengthSecondLine = lines[1].Length; - } - } - } - - private static void WriteTimeCode() - { - // write 8 bytes time code - } - - public override bool IsMine(List lines, string fileName) - { - if (!string.IsNullOrEmpty(fileName) && File.Exists(fileName)) - { - try - { - FileInfo fi = new FileInfo(fileName); - if (fi.Length > 100 && fi.Length < 1024000) // not too small or too big - { - byte[] buffer = FileUtil.ReadAllBytesShared(fileName); - - if (buffer[00] > 10 && - buffer[01] == 0 && - fileName.EndsWith(Extension, StringComparison.OrdinalIgnoreCase)) - { - return true; - } - } - } - catch - { - return false; - } - } - return false; - } - - public override string ToText(Subtitle subtitle, string title) - { - return "Not supported!"; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - subtitle.Paragraphs.Clear(); - byte[] buffer = FileUtil.ReadAllBytesShared(fileName); - - int index = buffer[0]; // go to first subtitle paragraph - while (index < buffer.Length) - { - Paragraph p = GetSptParagraph(ref index, buffer); - if (p != null) - { - subtitle.Paragraphs.Add(p); - } - } - subtitle.Renumber(); - } - - private Paragraph GetSptParagraph(ref int index, byte[] buffer) - { - if (index + 16 + 20 + 4 >= buffer.Length) - { - index = index + 16 + 20 + 4; - return null; - } - - int textLengthFirstLine = buffer[index + 16 + 20]; - int textLengthSecondLine = buffer[index + 16 + 20 + 4]; - var allItalic = buffer[index + 16 + 4] == 1; - - if (textLengthFirstLine == 0 && textLengthSecondLine == 0) - { - index += 16 + 20 + 16; - _errorCount++; - return null; - } - - try - { - var p = new Paragraph - { - StartTime = Sptx.GetTimeCode(Encoding.Default.GetString(buffer, index, 8)), - EndTime = Sptx.GetTimeCode(Encoding.Default.GetString(buffer, index + 8, 8)), - Text = Sptx.FixItalics(Encoding.Default.GetString(buffer, index + 16 + 20 + 16, textLengthFirstLine)) - }; - - if (textLengthSecondLine > 0) - { - p.Text += Environment.NewLine + Encoding.Default.GetString(buffer, index + 16 + 20 + 16 + textLengthFirstLine, textLengthSecondLine); - } - - if (allItalic) - { - p.Text = "" + p.Text.Trim() + ""; - } - - index += 16 + 20 + 16 + textLengthFirstLine + textLengthSecondLine; - return p; - } - catch - { - index += 16 + 20 + 16 + textLengthFirstLine + textLengthSecondLine; - _errorCount++; - return null; - } - } - } -} +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class Spt : SubtitleFormat + { + public override string Extension => ".spt"; + + public const string NameOfFormat = "spt"; + + public override string Name => NameOfFormat; + + public static void Save(string fileName, Subtitle subtitle) + { + var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write); + + // header + fs.WriteByte(1); + for (int i = 1; i < 23; i++) + { + fs.WriteByte(0); + } + + fs.WriteByte(0x60); + + // paragraphs + foreach (Paragraph p in subtitle.Paragraphs) + { + WriteParagraph(p); + } + + // footer + fs.WriteByte(0xff); + for (int i = 0; i < 11; i++) + { + fs.WriteByte(0); + } + + fs.WriteByte(0x11); + byte[] footerBuffer = Encoding.ASCII.GetBytes("dummy end of file"); + fs.Write(footerBuffer, 0, footerBuffer.Length); + + fs.Close(); + } + + private static void WriteParagraph(Paragraph p) + { + WriteTimeCode(); + WriteTimeCode(); + + string text = p.Text; + if (Utilities.GetNumberOfLines(text) > 2) + { + text = Utilities.AutoBreakLine(p.Text); + } + + var lines = text.SplitToLines(); + int textLengthFirstLine = 0; + int textLengthSecondLine = 0; + if (lines.Count > 0) + { + textLengthFirstLine = lines[0].Length; + if (lines.Count > 1) + { + textLengthSecondLine = lines[1].Length; + } + } + } + + private static void WriteTimeCode() + { + // write 8 bytes time code + } + + public override bool IsMine(List lines, string fileName) + { + if (!string.IsNullOrEmpty(fileName) && File.Exists(fileName)) + { + try + { + FileInfo fi = new FileInfo(fileName); + if (fi.Length > 100 && fi.Length < 1024000) // not too small or too big + { + byte[] buffer = FileUtil.ReadAllBytesShared(fileName); + + if (buffer[00] > 10 && + buffer[01] == 0 && + fileName.EndsWith(Extension, StringComparison.OrdinalIgnoreCase)) + { + return true; + } + } + } + catch + { + return false; + } + } + return false; + } + + public override string ToText(Subtitle subtitle, string title) + { + return "Not supported!"; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + subtitle.Paragraphs.Clear(); + byte[] buffer = FileUtil.ReadAllBytesShared(fileName); + + int index = buffer[0]; // go to first subtitle paragraph + while (index < buffer.Length) + { + Paragraph p = GetSptParagraph(ref index, buffer); + if (p != null) + { + subtitle.Paragraphs.Add(p); + } + } + subtitle.Renumber(); + } + + private Paragraph GetSptParagraph(ref int index, byte[] buffer) + { + if (index + 16 + 20 + 4 >= buffer.Length) + { + index = index + 16 + 20 + 4; + return null; + } + + int textLengthFirstLine = buffer[index + 16 + 20]; + int textLengthSecondLine = buffer[index + 16 + 20 + 4]; + var allItalic = buffer[index + 16 + 4] == 1; + + if (textLengthFirstLine == 0 && textLengthSecondLine == 0) + { + index += 16 + 20 + 16; + _errorCount++; + return null; + } + + try + { + var p = new Paragraph + { + StartTime = Sptx.GetTimeCode(Encoding.Default.GetString(buffer, index, 8)), + EndTime = Sptx.GetTimeCode(Encoding.Default.GetString(buffer, index + 8, 8)), + Text = Sptx.FixItalics(Encoding.Default.GetString(buffer, index + 16 + 20 + 16, textLengthFirstLine)) + }; + + if (textLengthSecondLine > 0) + { + p.Text += Environment.NewLine + Encoding.Default.GetString(buffer, index + 16 + 20 + 16 + textLengthFirstLine, textLengthSecondLine); + } + + if (allItalic) + { + p.Text = "" + p.Text.Trim() + ""; + } + + index += 16 + 20 + 16 + textLengthFirstLine + textLengthSecondLine; + return p; + } + catch + { + index += 16 + 20 + 16 + textLengthFirstLine + textLengthSecondLine; + _errorCount++; + return null; + } + } + } +} diff --git a/libse/SubtitleFormats/Sptx.cs b/src/libse/SubtitleFormats/Sptx.cs similarity index 100% rename from libse/SubtitleFormats/Sptx.cs rename to src/libse/SubtitleFormats/Sptx.cs diff --git a/libse/SubtitleFormats/SpuImage.cs b/src/libse/SubtitleFormats/SpuImage.cs similarity index 100% rename from libse/SubtitleFormats/SpuImage.cs rename to src/libse/SubtitleFormats/SpuImage.cs diff --git a/libse/SubtitleFormats/StructuredTitles.cs b/src/libse/SubtitleFormats/StructuredTitles.cs similarity index 97% rename from libse/SubtitleFormats/StructuredTitles.cs rename to src/libse/SubtitleFormats/StructuredTitles.cs index d60eb8d0f..c9ffc05da 100644 --- a/libse/SubtitleFormats/StructuredTitles.cs +++ b/src/libse/SubtitleFormats/StructuredTitles.cs @@ -1,191 +1,191 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class StructuredTitles : SubtitleFormat - { - private static readonly Regex RegexTimeCodes = new Regex(@"^\d\d\d\d[ a-z]: \d\d:\d\d:\d\d:\d\d,\d\d:\d\d:\d\d:\d\d,\d{1,2}", RegexOptions.Compiled); - private static readonly Regex RegexSomeCodes = new Regex(@"^\d\d \d\d \d\d", RegexOptions.Compiled); - private static readonly Regex RegexText = new Regex(@"^[A-Z]\d[A-Z]\d\d ", RegexOptions.Compiled); - - public override string Extension => ".txt"; - - public override string Name => "Structured titles"; - - public override string ToText(Subtitle subtitle, string title) - { - var sb = new StringBuilder(); - sb.AppendLine("Structured titles"); - int index = 0; - - //0001 : 01:07:25:08,01:07:29:00,10 - //80 80 80 - //C1Y00 Niemand zal je helpen ontsnappen. - //C1Y00 - Een agent heeft me geholpen. - foreach (var p in subtitle.Paragraphs) - { - // 1=first line, 11=bottom line, 10=bottom of two lines subtitle - string verticalAlignment; - if (p.Text.StartsWith("{\\an8}", StringComparison.Ordinal)) - { - verticalAlignment = "1"; // one line - } - else - { - verticalAlignment = (12 - Utilities.GetNumberOfLines(p.Text)).ToString(CultureInfo.InvariantCulture); - } - - sb.AppendLine($"{index + 1:0000} : {EncodeTimeCode(p.StartTime)},{EncodeTimeCode(p.EndTime)},{verticalAlignment}"); - sb.AppendLine("80 80 80"); - var italic = Utilities.RemoveSsaTags(p.Text).StartsWith("", StringComparison.OrdinalIgnoreCase) && - p.Text.EndsWith("", StringComparison.OrdinalIgnoreCase); - var pre = string.Empty; - var post = string.Empty; - if (italic) - { - pre = "<"; - post = ">"; - } - var lines = HtmlUtil.RemoveHtmlTags(p.Text, true).SplitToLines(); - for (int i = 0; i < lines.Count; i++) - { - string line = lines[i]; - sb.AppendLine(GetPositionCode(i, p.Extra) + " " + pre + line.Trim() + post); - } - sb.AppendLine(); - index++; - } - return sb.ToString(); - } - - private static string GetPositionCode(int lineNumber, string extra) - { - if (!string.IsNullOrWhiteSpace(extra)) - { - var arr = extra.Split(':'); - if (lineNumber < arr.Length && arr[lineNumber].Length == 5) - { - return arr[lineNumber]; - } - } - return "C1Y00"; - } - - private static string EncodeTimeCode(TimeCode time) - { - //00:03:15:22 (last is frame) - return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}:{MillisecondsToFramesMaxFrameRate(time.Milliseconds):00}"; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - //0001 : 01:07:25:08,01:07:29:00,10 - _errorCount = 0; - Paragraph p = null; - subtitle.Paragraphs.Clear(); - foreach (string line in lines) - { - if (line.IndexOf(':') == 5 && RegexTimeCodes.IsMatch(line)) - { - if (p != null) - { - subtitle.Paragraphs.Add(p); - } - - string start = line.Substring(7, 11); - string end = line.Substring(19, 11); - - string[] startParts = start.Split(SplitCharColon); - string[] endParts = end.Split(SplitCharColon); - if (startParts.Length == 4 && endParts.Length == 4) - { - p = new Paragraph(DecodeTimeCodeFramesFourParts(startParts), DecodeTimeCodeFramesFourParts(endParts), string.Empty); - if (line.EndsWith(",1", StringComparison.Ordinal) || line.EndsWith(",2", StringComparison.Ordinal)) - { - p.Text = "{\\an8}"; - } - } - } - else if (p != null && RegexText.IsMatch(line)) - { - if (string.IsNullOrEmpty(p.Text)) - { - p.Extra = line.Substring(0, 5); - p.Text = line.Substring(5).Trim(); - } - else if (p.Text == "{\\an8}") - { - p.Extra = line.Substring(0, 5); - p.Text += line.Substring(5).Trim(); - } - else - { - p.Extra += ":" + line.Substring(0, 5); - p.Text += Environment.NewLine + line.Substring(5).Trim(); - } - } - else if (string.IsNullOrWhiteSpace(line) || line.Length < 10 && RegexSomeCodes.IsMatch(line)) - { - // skip these lines - } - else if (p != null) - { - if (p.Text != null && Utilities.GetNumberOfLines(p.Text) > 3) - { - _errorCount++; - } - else - { - if (!line.TrimEnd().EndsWith(": --:--:--:--,--:--:--:--,-1", StringComparison.Ordinal)) - { - if (string.IsNullOrEmpty(p.Text)) - { - p.Text = line.Trim(); - } - else - { - p.Text += Environment.NewLine + line.Trim(); - } - } - } - } - } - if (!string.IsNullOrEmpty(p?.Text)) - { - subtitle.Paragraphs.Add(p); - } - - FixItalics(subtitle); - - subtitle.Renumber(); - } - - private static void FixItalics(Subtitle subtitle) - { - foreach (var p in subtitle.Paragraphs) - { - if (p.Text.Contains('<') && p.Text.Contains('>')) - { - var sb = new StringBuilder(); - foreach (var line in p.Text.SplitToLines()) - { - if (line.StartsWith('<') && line.EndsWith('>')) - { - sb.AppendLine("" + line.TrimStart('<').TrimEnd('>') + ""); - } - else - { - sb.AppendLine(line); - } - } - p.Text = HtmlUtil.FixInvalidItalicTags(sb.ToString().TrimEnd()); - } - } - } - } -} +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class StructuredTitles : SubtitleFormat + { + private static readonly Regex RegexTimeCodes = new Regex(@"^\d\d\d\d[ a-z]: \d\d:\d\d:\d\d:\d\d,\d\d:\d\d:\d\d:\d\d,\d{1,2}", RegexOptions.Compiled); + private static readonly Regex RegexSomeCodes = new Regex(@"^\d\d \d\d \d\d", RegexOptions.Compiled); + private static readonly Regex RegexText = new Regex(@"^[A-Z]\d[A-Z]\d\d ", RegexOptions.Compiled); + + public override string Extension => ".txt"; + + public override string Name => "Structured titles"; + + public override string ToText(Subtitle subtitle, string title) + { + var sb = new StringBuilder(); + sb.AppendLine("Structured titles"); + int index = 0; + + //0001 : 01:07:25:08,01:07:29:00,10 + //80 80 80 + //C1Y00 Niemand zal je helpen ontsnappen. + //C1Y00 - Een agent heeft me geholpen. + foreach (var p in subtitle.Paragraphs) + { + // 1=first line, 11=bottom line, 10=bottom of two lines subtitle + string verticalAlignment; + if (p.Text.StartsWith("{\\an8}", StringComparison.Ordinal)) + { + verticalAlignment = "1"; // one line + } + else + { + verticalAlignment = (12 - Utilities.GetNumberOfLines(p.Text)).ToString(CultureInfo.InvariantCulture); + } + + sb.AppendLine($"{index + 1:0000} : {EncodeTimeCode(p.StartTime)},{EncodeTimeCode(p.EndTime)},{verticalAlignment}"); + sb.AppendLine("80 80 80"); + var italic = Utilities.RemoveSsaTags(p.Text).StartsWith("", StringComparison.OrdinalIgnoreCase) && + p.Text.EndsWith("", StringComparison.OrdinalIgnoreCase); + var pre = string.Empty; + var post = string.Empty; + if (italic) + { + pre = "<"; + post = ">"; + } + var lines = HtmlUtil.RemoveHtmlTags(p.Text, true).SplitToLines(); + for (int i = 0; i < lines.Count; i++) + { + string line = lines[i]; + sb.AppendLine(GetPositionCode(i, p.Extra) + " " + pre + line.Trim() + post); + } + sb.AppendLine(); + index++; + } + return sb.ToString(); + } + + private static string GetPositionCode(int lineNumber, string extra) + { + if (!string.IsNullOrWhiteSpace(extra)) + { + var arr = extra.Split(':'); + if (lineNumber < arr.Length && arr[lineNumber].Length == 5) + { + return arr[lineNumber]; + } + } + return "C1Y00"; + } + + private static string EncodeTimeCode(TimeCode time) + { + //00:03:15:22 (last is frame) + return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}:{MillisecondsToFramesMaxFrameRate(time.Milliseconds):00}"; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + //0001 : 01:07:25:08,01:07:29:00,10 + _errorCount = 0; + Paragraph p = null; + subtitle.Paragraphs.Clear(); + foreach (string line in lines) + { + if (line.IndexOf(':') == 5 && RegexTimeCodes.IsMatch(line)) + { + if (p != null) + { + subtitle.Paragraphs.Add(p); + } + + string start = line.Substring(7, 11); + string end = line.Substring(19, 11); + + string[] startParts = start.Split(SplitCharColon); + string[] endParts = end.Split(SplitCharColon); + if (startParts.Length == 4 && endParts.Length == 4) + { + p = new Paragraph(DecodeTimeCodeFramesFourParts(startParts), DecodeTimeCodeFramesFourParts(endParts), string.Empty); + if (line.EndsWith(",1", StringComparison.Ordinal) || line.EndsWith(",2", StringComparison.Ordinal)) + { + p.Text = "{\\an8}"; + } + } + } + else if (p != null && RegexText.IsMatch(line)) + { + if (string.IsNullOrEmpty(p.Text)) + { + p.Extra = line.Substring(0, 5); + p.Text = line.Substring(5).Trim(); + } + else if (p.Text == "{\\an8}") + { + p.Extra = line.Substring(0, 5); + p.Text += line.Substring(5).Trim(); + } + else + { + p.Extra += ":" + line.Substring(0, 5); + p.Text += Environment.NewLine + line.Substring(5).Trim(); + } + } + else if (string.IsNullOrWhiteSpace(line) || line.Length < 10 && RegexSomeCodes.IsMatch(line)) + { + // skip these lines + } + else if (p != null) + { + if (p.Text != null && Utilities.GetNumberOfLines(p.Text) > 3) + { + _errorCount++; + } + else + { + if (!line.TrimEnd().EndsWith(": --:--:--:--,--:--:--:--,-1", StringComparison.Ordinal)) + { + if (string.IsNullOrEmpty(p.Text)) + { + p.Text = line.Trim(); + } + else + { + p.Text += Environment.NewLine + line.Trim(); + } + } + } + } + } + if (!string.IsNullOrEmpty(p?.Text)) + { + subtitle.Paragraphs.Add(p); + } + + FixItalics(subtitle); + + subtitle.Renumber(); + } + + private static void FixItalics(Subtitle subtitle) + { + foreach (var p in subtitle.Paragraphs) + { + if (p.Text.Contains('<') && p.Text.Contains('>')) + { + var sb = new StringBuilder(); + foreach (var line in p.Text.SplitToLines()) + { + if (line.StartsWith('<') && line.EndsWith('>')) + { + sb.AppendLine("" + line.TrimStart('<').TrimEnd('>') + ""); + } + else + { + sb.AppendLine(line); + } + } + p.Text = HtmlUtil.FixInvalidItalicTags(sb.ToString().TrimEnd()); + } + } + } + } +} diff --git a/libse/SubtitleFormats/SubRip.cs b/src/libse/SubtitleFormats/SubRip.cs similarity index 97% rename from libse/SubtitleFormats/SubRip.cs rename to src/libse/SubtitleFormats/SubRip.cs index e4f34a913..ec8b412fc 100644 --- a/libse/SubtitleFormats/SubRip.cs +++ b/src/libse/SubtitleFormats/SubRip.cs @@ -1,500 +1,500 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Text; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class SubRip : SubtitleFormat - { - public string Errors { get; private set; } - private StringBuilder _errors; - private int _lineNumber; - private bool _isMsFrames; - private bool _isWsrt; - - private enum ExpectingLine - { - Number, - TimeCodes, - Text - } - - private Paragraph _paragraph; - private Paragraph _lastParagraph; - private ExpectingLine _expecting = ExpectingLine.Number; - - public override string Extension => ".srt"; - - public const string NameOfFormat = "SubRip"; - - public override string Name => NameOfFormat; - - public override List AlternateExtensions => new List { ".wsrt" }; - - public override bool IsMine(List lines, string fileName) - { - if (lines.Count > 0 && lines[0].StartsWith("WEBVTT", StringComparison.OrdinalIgnoreCase)) - { - return false; - } - - var subtitle = new Subtitle(); - LoadSubtitle(subtitle, lines, fileName); - Errors = null; - return subtitle.Paragraphs.Count > _errorCount; - } - - public override string ToText(Subtitle subtitle, string title) - { - const string paragraphWriteFormat = "{0}{4}{1} --> {2}{4}{3}{4}{4}"; - - var sb = new StringBuilder(); - foreach (var p in subtitle.Paragraphs) - { - sb.AppendFormat(paragraphWriteFormat, p.Number, p.StartTime, p.EndTime, p.Text, Environment.NewLine); - } - return sb.ToString().Trim() + Environment.NewLine + Environment.NewLine; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - bool doRenumber = false; - _errors = new StringBuilder(); - _lineNumber = 0; - _isMsFrames = true; - _isWsrt = fileName != null && fileName.EndsWith(".wsrt", StringComparison.OrdinalIgnoreCase); - _paragraph = new Paragraph(); - _expecting = ExpectingLine.Number; - _errorCount = 0; - - subtitle.Paragraphs.Clear(); - for (int i = 0; i < lines.Count; i++) - { - _lineNumber++; - string line = lines[i].TrimEnd(); - line = line.Trim('\u007F'); // 127=delete ascii - - string next = string.Empty; - if (i + 1 < lines.Count) - { - next = lines[i + 1]; - } - - string nextNext = string.Empty; - if (i + 2 < lines.Count) - { - nextNext = lines[i + 2]; - } - - string nextNextNext = string.Empty; - if (i + 3 < lines.Count) - { - nextNextNext = lines[i + 3]; - } - - // A new line is missing between two paragraphs or no line number (buggy file) - if (_expecting == ExpectingLine.Text && i + 1 < lines.Count && !string.IsNullOrEmpty(_paragraph?.Text) && - Utilities.IsInteger(line) && TryReadTimeCodesLine(line.Trim(), null, false)) - { - if (!string.IsNullOrEmpty(_paragraph.Text)) - { - subtitle.Paragraphs.Add(_paragraph); - _lastParagraph = _paragraph; - _paragraph = new Paragraph(); - } - _expecting = ExpectingLine.Number; - } - if (_expecting == ExpectingLine.Number && TryReadTimeCodesLine(line.Trim(), null, false)) - { - _expecting = ExpectingLine.TimeCodes; - doRenumber = true; - } - else if (!string.IsNullOrEmpty(_paragraph?.Text) && _expecting == ExpectingLine.Text && TryReadTimeCodesLine(line.Trim(), null, false)) - { - subtitle.Paragraphs.Add(_paragraph); - _lastParagraph = _paragraph; - _paragraph = new Paragraph(); - _expecting = ExpectingLine.TimeCodes; - doRenumber = true; - } - - ReadLine(subtitle, line, next, nextNext, nextNextNext); - } - - if (_paragraph?.IsDefault == false) - { - subtitle.Paragraphs.Add(_paragraph); - } - - if (doRenumber) - { - subtitle.Renumber(); - } - - foreach (var p in subtitle.Paragraphs) - { - if (_isMsFrames) - { - p.StartTime.Milliseconds = FramesToMillisecondsMax999(p.StartTime.Milliseconds); - p.EndTime.Milliseconds = FramesToMillisecondsMax999(p.EndTime.Milliseconds); - } - p.Text = p.Text.TrimEnd(); - } - Errors = _errors.ToString(); - } - - private void ReadLine(Subtitle subtitle, string line, string next, string nextNext, string nextNextNext) - { - switch (_expecting) - { - case ExpectingLine.Number: - if (int.TryParse(line, out var number)) - { - _paragraph.Number = number; - _expecting = ExpectingLine.TimeCodes; - } - else if (!string.IsNullOrWhiteSpace(line)) - { - if (_lastParagraph != null && nextNext != null && (_lastParagraph.Number + 1).ToString(CultureInfo.InvariantCulture) == nextNext) - { - _lastParagraph.Text = (_lastParagraph.Text + Environment.NewLine + line.Trim()).Trim(); - } - else - { - if (_errors.Length < 2000) - { - _errors.AppendLine(string.Format(Configuration.Settings.Language.Main.LineNumberXExpectedNumberFromSourceLineY, _lineNumber, line)); - } - - _errorCount++; - } - } - break; - case ExpectingLine.TimeCodes: - if (TryReadTimeCodesLine(line, _paragraph, true)) - { - _paragraph.Text = string.Empty; - _expecting = ExpectingLine.Text; - } - else if (!string.IsNullOrWhiteSpace(line)) - { - if (_errors.Length < 2000) - { - _errors.AppendLine(string.Format(Configuration.Settings.Language.Main.LineNumberXErrorReadingTimeCodeFromSourceLineY, _lineNumber, line)); - } - - _errorCount++; - _expecting = ExpectingLine.Number; // lets go to next paragraph - } - break; - case ExpectingLine.Text: - if (Utilities.IsInteger(line) && (TryReadTimeCodesLine(next, null, false) || string.IsNullOrEmpty(next) && TryReadTimeCodesLine(nextNext, null, false))) - { - // line is integer and time code follows - could loose a number from text... - subtitle.Paragraphs.Add(_paragraph); - _lastParagraph = _paragraph; - _paragraph = new Paragraph(); - _expecting = ExpectingLine.Number; - if (int.TryParse(line, out var n)) - { - _paragraph.Number = n; - } - if (_errors.Length < 2000 && line.Trim() != GetLastNumber(_paragraph)) - { - _errors.AppendLine(string.Format(Configuration.Settings.Language.Main.LineNumberXExpectedEmptyLine, _lineNumber, line)); - } - } - else if (TryReadTimeCodesLine(line, null, false)) - { - if (_paragraph != null && _paragraph.EndTime.TotalMilliseconds > 0 || - _paragraph != null && !string.IsNullOrEmpty(_paragraph.Text)) - { - subtitle.Paragraphs.Add(_paragraph); - _lastParagraph = _paragraph; - } - _paragraph = new Paragraph(); - TryReadTimeCodesLine(line, _paragraph, false); - _expecting = ExpectingLine.Text; - } - else if (!string.IsNullOrWhiteSpace(line) || IsText(next) || IsText(nextNext) || nextNextNext == GetLastNumber(_paragraph)) - { - if (_isWsrt && !string.IsNullOrEmpty(line)) - { - for (int i = 30; i < 40; i++) - { - line = line.Replace("<" + i + ">", ""); - line = line.Replace("", ""); - } - } - - if (_paragraph.Text.Length > 0) - { - _paragraph.Text += Environment.NewLine; - } - - _paragraph.Text += RemoveBadChars(line).TrimEnd(); - } - else if (string.IsNullOrEmpty(line) && string.IsNullOrEmpty(_paragraph.Text)) - { - _paragraph.Text = string.Empty; - if (!string.IsNullOrEmpty(next) && (Utilities.IsInteger(next) || TryReadTimeCodesLine(next, null, false))) - { - subtitle.Paragraphs.Add(_paragraph); - _lastParagraph = _paragraph; - _paragraph = new Paragraph(); - _expecting = ExpectingLine.Number; - } - } - else if (string.IsNullOrEmpty(line) && string.IsNullOrEmpty(next)) - { - _paragraph.Text += Environment.NewLine + RemoveBadChars(line).TrimEnd(); - } - else - { - subtitle.Paragraphs.Add(_paragraph); - _lastParagraph = _paragraph; - _paragraph = new Paragraph(); - _expecting = ExpectingLine.Number; - } - break; - } - } - - private static string GetLastNumber(Paragraph p) - { - if (p == null) - { - return "1"; - } - return (p.Number + 1).ToString(CultureInfo.InvariantCulture); - } - - private bool IsText(string text) - { - return !(string.IsNullOrWhiteSpace(text) || Utilities.IsInteger(text) || TryReadTimeCodesLine(text.Trim(), null, false)); - } - - private static string RemoveBadChars(string line) - { - return line.Replace('\0', ' '); - } - - private bool TryReadTimeCodesLine(string input, Paragraph paragraph, bool validate) - { - var s = input.TrimStart('-', ' '); - if (s.Length < 10 || !char.IsDigit(s[0])) - { - return false; - } - - const string defaultSeparator = " --> "; - // Fix some badly formatted separator sequences - anything can happen if you manually edit ;) - var line = input.Replace('،', ',') - .Replace('', ',') - .Replace('¡', ',') - .Replace(" -> ", defaultSeparator) - .Replace(" - > ", defaultSeparator) - .Replace(" ->> ", defaultSeparator) - .Replace(" -- > ", defaultSeparator) - .Replace(" - -> ", defaultSeparator) - .Replace(" -->> ", defaultSeparator) - .Replace(" ---> ", defaultSeparator) - .Replace(": ", ":").Trim(); - - // Removed stuff after time codes - like subtitle position - // - example of position info: 00:02:26,407 --> 00:02:31,356 X1:100 X2:100 Y1:100 Y2:100 - if (line.Length > 30) - { - if (line[29] == ' ') - { - line = line.Substring(0, 29); - } - else if (line[28] == ' ') - { - line = line.Substring(0, 28); - } - else if (line[27] == ' ') - { - line = line.Substring(0, 27); - } - } - - // removes all extra spaces - line = line.RemoveChar(' ').Replace("-->", defaultSeparator).Trim(); - - // Fix a few more cases of wrong time codes, seen this: 00.00.02,000 --> 00.00.04,000 - line = line.Replace('.', ':'); - if (line.Length >= 29 && (line[8] == ':' || line[8] == ';')) - { - line = line.Substring(0, 8) + ',' + line.Substring(8 + 1); - } - - if (line.Length >= 29 && line.Length <= 30 && (line[25] == ':' || line[25] == ';')) - { - line = line.Substring(0, 25) + ',' + line.Substring(25 + 1); - } - - // allow missing hours as some (buggy) websites generate these time codes: 04:48,460 --> 04:52,364 - if (line.Length == 23 && line[2] == ':' && line[5] == ',' && line[9] == ' ' && line[12] == '>' && line[13] == ' ' && line[16] == ':' && line[19] == ',') - { - line = "00:" + line.Insert(14, "00:"); - } - - if (IsValidTimeCode(line)) - { - string[] parts = line.Replace("-->", ":").RemoveChar(' ').Split(':', ','); - try - { - int startHours = int.Parse(parts[0]); - int startMinutes = int.Parse(parts[1]); - int startSeconds = int.Parse(parts[2]); - int startMilliseconds = int.Parse(parts[3]); - int endHours = int.Parse(parts[4]); - int endMinutes = int.Parse(parts[5]); - int endSeconds = int.Parse(parts[6]); - int endMilliseconds = int.Parse(parts[7]); - - if (validate && _errors.Length < 2000 && - (startHours > 99 || startMinutes > 99 || startSeconds > 99 || startMilliseconds > 999 || - endHours > 99 || endMinutes > 99 || endSeconds > 99 || endMilliseconds > 999)) - { - _errors.AppendLine(string.Format(Configuration.Settings.Language.Main.LineNumberXErrorReadingTimeCodeFromSourceLineY, _lineNumber, line)); - } - - if (_isMsFrames && (parts[3].Length != 2 || startMilliseconds > 30 || parts[7].Length != 2 || endMilliseconds > 30)) - { - _isMsFrames = false; - } - - if (paragraph != null) - { - paragraph.StartTime = new TimeCode(startHours, startMinutes, startSeconds, startMilliseconds); - if (parts[0].StartsWith('-') && paragraph.StartTime.TotalMilliseconds > 0) - { - paragraph.StartTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds * -1; - } - - paragraph.EndTime = new TimeCode(endHours, endMinutes, endSeconds, endMilliseconds); - if (parts[4].StartsWith('-') && paragraph.EndTime.TotalMilliseconds > 0) - { - paragraph.EndTime.TotalMilliseconds = paragraph.EndTime.TotalMilliseconds * -1; - } - } - return true; - } - catch - { - return false; - } - } - return false; - } - - /// - /// Optimized validation of time codes - /// Old Regex was: - /// - ^-?\d+:-?\d+:-?\d+[:,]-?\d+\s*-->\s*-?\d+:-?\d+:-?\d+[:,]-?\d+$ - /// - ^\d+:\d+:\d+,\d+\s*-->\s*\d+:\d+:\d+,\d+$ - /// True if valid srt time code - /// - private static bool IsValidTimeCode(string line) - { - int step = 0; - var max = line.Length; - for (int i = 0; i < max; i++) - { - var ch = line[i]; - if (char.IsWhiteSpace(ch)) - { - continue; - } - - if (step == 0 || step == 2 || step == 4 || step == 9 || step == 11) // start numbers - { - if (ch == '-' || char.IsDigit(ch)) - { - step++; - } - else - { - return false; - } - } - else if (step == 1 || step == 3 || step == 10 || step == 12) // number - { - if (char.IsDigit(ch)) - { - // ok - } - else if (ch == ':') - { - step++; - } - else - { - return false; - } - } - else if (step == 5 || step == 13) // seconds - { - if (char.IsDigit(ch)) - { - // ok - } - else if (ch == ',' || ch == ':') - { - step++; - } - else - { - return false; - } - } - else if (step == 6 || step == 14) // milliseconds - { - if (char.IsDigit(ch)) - { - // ok - } - else if (ch == '-') - { - step++; - } - else - { - return false; - } - } - else if (step == 7) // separator char 2 - { - if (ch == '-') - { - step++; - } - else - { - return false; - } - } - else if (step == 8) // separator char 3 - { - if (ch == '>') - { - step++; - } - else - { - return false; - } - } - else if (step > 14) - { - return false; - } - } - return true; - } - } +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class SubRip : SubtitleFormat + { + public string Errors { get; private set; } + private StringBuilder _errors; + private int _lineNumber; + private bool _isMsFrames; + private bool _isWsrt; + + private enum ExpectingLine + { + Number, + TimeCodes, + Text + } + + private Paragraph _paragraph; + private Paragraph _lastParagraph; + private ExpectingLine _expecting = ExpectingLine.Number; + + public override string Extension => ".srt"; + + public const string NameOfFormat = "SubRip"; + + public override string Name => NameOfFormat; + + public override List AlternateExtensions => new List { ".wsrt" }; + + public override bool IsMine(List lines, string fileName) + { + if (lines.Count > 0 && lines[0].StartsWith("WEBVTT", StringComparison.OrdinalIgnoreCase)) + { + return false; + } + + var subtitle = new Subtitle(); + LoadSubtitle(subtitle, lines, fileName); + Errors = null; + return subtitle.Paragraphs.Count > _errorCount; + } + + public override string ToText(Subtitle subtitle, string title) + { + const string paragraphWriteFormat = "{0}{4}{1} --> {2}{4}{3}{4}{4}"; + + var sb = new StringBuilder(); + foreach (var p in subtitle.Paragraphs) + { + sb.AppendFormat(paragraphWriteFormat, p.Number, p.StartTime, p.EndTime, p.Text, Environment.NewLine); + } + return sb.ToString().Trim() + Environment.NewLine + Environment.NewLine; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + bool doRenumber = false; + _errors = new StringBuilder(); + _lineNumber = 0; + _isMsFrames = true; + _isWsrt = fileName != null && fileName.EndsWith(".wsrt", StringComparison.OrdinalIgnoreCase); + _paragraph = new Paragraph(); + _expecting = ExpectingLine.Number; + _errorCount = 0; + + subtitle.Paragraphs.Clear(); + for (int i = 0; i < lines.Count; i++) + { + _lineNumber++; + string line = lines[i].TrimEnd(); + line = line.Trim('\u007F'); // 127=delete ascii + + string next = string.Empty; + if (i + 1 < lines.Count) + { + next = lines[i + 1]; + } + + string nextNext = string.Empty; + if (i + 2 < lines.Count) + { + nextNext = lines[i + 2]; + } + + string nextNextNext = string.Empty; + if (i + 3 < lines.Count) + { + nextNextNext = lines[i + 3]; + } + + // A new line is missing between two paragraphs or no line number (buggy file) + if (_expecting == ExpectingLine.Text && i + 1 < lines.Count && !string.IsNullOrEmpty(_paragraph?.Text) && + Utilities.IsInteger(line) && TryReadTimeCodesLine(line.Trim(), null, false)) + { + if (!string.IsNullOrEmpty(_paragraph.Text)) + { + subtitle.Paragraphs.Add(_paragraph); + _lastParagraph = _paragraph; + _paragraph = new Paragraph(); + } + _expecting = ExpectingLine.Number; + } + if (_expecting == ExpectingLine.Number && TryReadTimeCodesLine(line.Trim(), null, false)) + { + _expecting = ExpectingLine.TimeCodes; + doRenumber = true; + } + else if (!string.IsNullOrEmpty(_paragraph?.Text) && _expecting == ExpectingLine.Text && TryReadTimeCodesLine(line.Trim(), null, false)) + { + subtitle.Paragraphs.Add(_paragraph); + _lastParagraph = _paragraph; + _paragraph = new Paragraph(); + _expecting = ExpectingLine.TimeCodes; + doRenumber = true; + } + + ReadLine(subtitle, line, next, nextNext, nextNextNext); + } + + if (_paragraph?.IsDefault == false) + { + subtitle.Paragraphs.Add(_paragraph); + } + + if (doRenumber) + { + subtitle.Renumber(); + } + + foreach (var p in subtitle.Paragraphs) + { + if (_isMsFrames) + { + p.StartTime.Milliseconds = FramesToMillisecondsMax999(p.StartTime.Milliseconds); + p.EndTime.Milliseconds = FramesToMillisecondsMax999(p.EndTime.Milliseconds); + } + p.Text = p.Text.TrimEnd(); + } + Errors = _errors.ToString(); + } + + private void ReadLine(Subtitle subtitle, string line, string next, string nextNext, string nextNextNext) + { + switch (_expecting) + { + case ExpectingLine.Number: + if (int.TryParse(line, out var number)) + { + _paragraph.Number = number; + _expecting = ExpectingLine.TimeCodes; + } + else if (!string.IsNullOrWhiteSpace(line)) + { + if (_lastParagraph != null && nextNext != null && (_lastParagraph.Number + 1).ToString(CultureInfo.InvariantCulture) == nextNext) + { + _lastParagraph.Text = (_lastParagraph.Text + Environment.NewLine + line.Trim()).Trim(); + } + else + { + if (_errors.Length < 2000) + { + _errors.AppendLine(string.Format(Configuration.Settings.Language.Main.LineNumberXExpectedNumberFromSourceLineY, _lineNumber, line)); + } + + _errorCount++; + } + } + break; + case ExpectingLine.TimeCodes: + if (TryReadTimeCodesLine(line, _paragraph, true)) + { + _paragraph.Text = string.Empty; + _expecting = ExpectingLine.Text; + } + else if (!string.IsNullOrWhiteSpace(line)) + { + if (_errors.Length < 2000) + { + _errors.AppendLine(string.Format(Configuration.Settings.Language.Main.LineNumberXErrorReadingTimeCodeFromSourceLineY, _lineNumber, line)); + } + + _errorCount++; + _expecting = ExpectingLine.Number; // lets go to next paragraph + } + break; + case ExpectingLine.Text: + if (Utilities.IsInteger(line) && (TryReadTimeCodesLine(next, null, false) || string.IsNullOrEmpty(next) && TryReadTimeCodesLine(nextNext, null, false))) + { + // line is integer and time code follows - could loose a number from text... + subtitle.Paragraphs.Add(_paragraph); + _lastParagraph = _paragraph; + _paragraph = new Paragraph(); + _expecting = ExpectingLine.Number; + if (int.TryParse(line, out var n)) + { + _paragraph.Number = n; + } + if (_errors.Length < 2000 && line.Trim() != GetLastNumber(_paragraph)) + { + _errors.AppendLine(string.Format(Configuration.Settings.Language.Main.LineNumberXExpectedEmptyLine, _lineNumber, line)); + } + } + else if (TryReadTimeCodesLine(line, null, false)) + { + if (_paragraph != null && _paragraph.EndTime.TotalMilliseconds > 0 || + _paragraph != null && !string.IsNullOrEmpty(_paragraph.Text)) + { + subtitle.Paragraphs.Add(_paragraph); + _lastParagraph = _paragraph; + } + _paragraph = new Paragraph(); + TryReadTimeCodesLine(line, _paragraph, false); + _expecting = ExpectingLine.Text; + } + else if (!string.IsNullOrWhiteSpace(line) || IsText(next) || IsText(nextNext) || nextNextNext == GetLastNumber(_paragraph)) + { + if (_isWsrt && !string.IsNullOrEmpty(line)) + { + for (int i = 30; i < 40; i++) + { + line = line.Replace("<" + i + ">", ""); + line = line.Replace("", ""); + } + } + + if (_paragraph.Text.Length > 0) + { + _paragraph.Text += Environment.NewLine; + } + + _paragraph.Text += RemoveBadChars(line).TrimEnd(); + } + else if (string.IsNullOrEmpty(line) && string.IsNullOrEmpty(_paragraph.Text)) + { + _paragraph.Text = string.Empty; + if (!string.IsNullOrEmpty(next) && (Utilities.IsInteger(next) || TryReadTimeCodesLine(next, null, false))) + { + subtitle.Paragraphs.Add(_paragraph); + _lastParagraph = _paragraph; + _paragraph = new Paragraph(); + _expecting = ExpectingLine.Number; + } + } + else if (string.IsNullOrEmpty(line) && string.IsNullOrEmpty(next)) + { + _paragraph.Text += Environment.NewLine + RemoveBadChars(line).TrimEnd(); + } + else + { + subtitle.Paragraphs.Add(_paragraph); + _lastParagraph = _paragraph; + _paragraph = new Paragraph(); + _expecting = ExpectingLine.Number; + } + break; + } + } + + private static string GetLastNumber(Paragraph p) + { + if (p == null) + { + return "1"; + } + return (p.Number + 1).ToString(CultureInfo.InvariantCulture); + } + + private bool IsText(string text) + { + return !(string.IsNullOrWhiteSpace(text) || Utilities.IsInteger(text) || TryReadTimeCodesLine(text.Trim(), null, false)); + } + + private static string RemoveBadChars(string line) + { + return line.Replace('\0', ' '); + } + + private bool TryReadTimeCodesLine(string input, Paragraph paragraph, bool validate) + { + var s = input.TrimStart('-', ' '); + if (s.Length < 10 || !char.IsDigit(s[0])) + { + return false; + } + + const string defaultSeparator = " --> "; + // Fix some badly formatted separator sequences - anything can happen if you manually edit ;) + var line = input.Replace('،', ',') + .Replace('', ',') + .Replace('¡', ',') + .Replace(" -> ", defaultSeparator) + .Replace(" - > ", defaultSeparator) + .Replace(" ->> ", defaultSeparator) + .Replace(" -- > ", defaultSeparator) + .Replace(" - -> ", defaultSeparator) + .Replace(" -->> ", defaultSeparator) + .Replace(" ---> ", defaultSeparator) + .Replace(": ", ":").Trim(); + + // Removed stuff after time codes - like subtitle position + // - example of position info: 00:02:26,407 --> 00:02:31,356 X1:100 X2:100 Y1:100 Y2:100 + if (line.Length > 30) + { + if (line[29] == ' ') + { + line = line.Substring(0, 29); + } + else if (line[28] == ' ') + { + line = line.Substring(0, 28); + } + else if (line[27] == ' ') + { + line = line.Substring(0, 27); + } + } + + // removes all extra spaces + line = line.RemoveChar(' ').Replace("-->", defaultSeparator).Trim(); + + // Fix a few more cases of wrong time codes, seen this: 00.00.02,000 --> 00.00.04,000 + line = line.Replace('.', ':'); + if (line.Length >= 29 && (line[8] == ':' || line[8] == ';')) + { + line = line.Substring(0, 8) + ',' + line.Substring(8 + 1); + } + + if (line.Length >= 29 && line.Length <= 30 && (line[25] == ':' || line[25] == ';')) + { + line = line.Substring(0, 25) + ',' + line.Substring(25 + 1); + } + + // allow missing hours as some (buggy) websites generate these time codes: 04:48,460 --> 04:52,364 + if (line.Length == 23 && line[2] == ':' && line[5] == ',' && line[9] == ' ' && line[12] == '>' && line[13] == ' ' && line[16] == ':' && line[19] == ',') + { + line = "00:" + line.Insert(14, "00:"); + } + + if (IsValidTimeCode(line)) + { + string[] parts = line.Replace("-->", ":").RemoveChar(' ').Split(':', ','); + try + { + int startHours = int.Parse(parts[0]); + int startMinutes = int.Parse(parts[1]); + int startSeconds = int.Parse(parts[2]); + int startMilliseconds = int.Parse(parts[3]); + int endHours = int.Parse(parts[4]); + int endMinutes = int.Parse(parts[5]); + int endSeconds = int.Parse(parts[6]); + int endMilliseconds = int.Parse(parts[7]); + + if (validate && _errors.Length < 2000 && + (startHours > 99 || startMinutes > 99 || startSeconds > 99 || startMilliseconds > 999 || + endHours > 99 || endMinutes > 99 || endSeconds > 99 || endMilliseconds > 999)) + { + _errors.AppendLine(string.Format(Configuration.Settings.Language.Main.LineNumberXErrorReadingTimeCodeFromSourceLineY, _lineNumber, line)); + } + + if (_isMsFrames && (parts[3].Length != 2 || startMilliseconds > 30 || parts[7].Length != 2 || endMilliseconds > 30)) + { + _isMsFrames = false; + } + + if (paragraph != null) + { + paragraph.StartTime = new TimeCode(startHours, startMinutes, startSeconds, startMilliseconds); + if (parts[0].StartsWith('-') && paragraph.StartTime.TotalMilliseconds > 0) + { + paragraph.StartTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds * -1; + } + + paragraph.EndTime = new TimeCode(endHours, endMinutes, endSeconds, endMilliseconds); + if (parts[4].StartsWith('-') && paragraph.EndTime.TotalMilliseconds > 0) + { + paragraph.EndTime.TotalMilliseconds = paragraph.EndTime.TotalMilliseconds * -1; + } + } + return true; + } + catch + { + return false; + } + } + return false; + } + + /// + /// Optimized validation of time codes + /// Old Regex was: + /// - ^-?\d+:-?\d+:-?\d+[:,]-?\d+\s*-->\s*-?\d+:-?\d+:-?\d+[:,]-?\d+$ + /// - ^\d+:\d+:\d+,\d+\s*-->\s*\d+:\d+:\d+,\d+$ + /// True if valid srt time code + /// + private static bool IsValidTimeCode(string line) + { + int step = 0; + var max = line.Length; + for (int i = 0; i < max; i++) + { + var ch = line[i]; + if (char.IsWhiteSpace(ch)) + { + continue; + } + + if (step == 0 || step == 2 || step == 4 || step == 9 || step == 11) // start numbers + { + if (ch == '-' || char.IsDigit(ch)) + { + step++; + } + else + { + return false; + } + } + else if (step == 1 || step == 3 || step == 10 || step == 12) // number + { + if (char.IsDigit(ch)) + { + // ok + } + else if (ch == ':') + { + step++; + } + else + { + return false; + } + } + else if (step == 5 || step == 13) // seconds + { + if (char.IsDigit(ch)) + { + // ok + } + else if (ch == ',' || ch == ':') + { + step++; + } + else + { + return false; + } + } + else if (step == 6 || step == 14) // milliseconds + { + if (char.IsDigit(ch)) + { + // ok + } + else if (ch == '-') + { + step++; + } + else + { + return false; + } + } + else if (step == 7) // separator char 2 + { + if (ch == '-') + { + step++; + } + else + { + return false; + } + } + else if (step == 8) // separator char 3 + { + if (ch == '>') + { + step++; + } + else + { + return false; + } + } + else if (step > 14) + { + return false; + } + } + return true; + } + } } \ No newline at end of file diff --git a/libse/SubtitleFormats/SubStationAlpha.cs b/src/libse/SubtitleFormats/SubStationAlpha.cs similarity index 97% rename from libse/SubtitleFormats/SubStationAlpha.cs rename to src/libse/SubtitleFormats/SubStationAlpha.cs index ec8b1c2b7..5801cdbc7 100644 --- a/libse/SubtitleFormats/SubStationAlpha.cs +++ b/src/libse/SubtitleFormats/SubStationAlpha.cs @@ -1,738 +1,738 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Globalization; -using System.Text; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class SubStationAlpha : SubtitleFormat - { - public string Errors { get; private set; } - - public override string Extension => ".ssa"; - - public const string NameOfFormat = "Sub Station Alpha"; - - public override string Name => NameOfFormat; - - public override bool IsMine(List lines, string fileName) - { - var subtitle = new Subtitle(); - LoadSubtitle(subtitle, lines, fileName); - Errors = null; - return subtitle.Paragraphs.Count > _errorCount; - } - - const string HeaderNoStyles = - @"[Script Info] -; This is a Sub Station Alpha v4 script. -Title: {0} -ScriptType: v4.00 -Collisions: Normal -PlayDepth: 0 - -[V4 Styles] -Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding -{1} - -[Events] -Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text"; - - public override string ToText(Subtitle subtitle, string title) - { - const string header = -@"[Script Info] -; This is a Sub Station Alpha v4 script. -Title: {0} -ScriptType: v4.00 -Collisions: Normal -PlayDepth: 0 - -[V4 Styles] -Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding -Style: Default,{1},{2},{3},65535,65535,-2147483640,{9},0,1,{4},{5},2,{6},{7},{8},0,1 - -[Events] -Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text"; - - - - const string timeCodeFormat = "{0}:{1:00}:{2:00}.{3:00}"; // h:mm:ss.cc - const string paragraphWriteFormat = "Dialogue: Marked={4},{0},{1},{3},{5},{6},{7},{8},{9},{2}"; - const string commentWriteFormat = "Comment: Marked={4},{0},{1},{3},{5},{6},{7},{8},{9},{2}"; - - var sb = new StringBuilder(); - Color fontColor = Color.FromArgb(Configuration.Settings.SubtitleSettings.SsaFontColorArgb); - bool isValidAssHeader = !string.IsNullOrEmpty(subtitle.Header) && subtitle.Header.Contains("[V4 Styles]"); - var styles = new List(); - if (isValidAssHeader) - { - sb.AppendLine(subtitle.Header.Trim()); - const string formatLine = "Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text"; - if (!subtitle.Header.Contains(formatLine)) - { - sb.AppendLine(formatLine); - } - - styles = AdvancedSubStationAlpha.GetStylesFromHeader(subtitle.Header); - } - else if (!string.IsNullOrEmpty(subtitle.Header) && subtitle.Header.Contains("[V4+ Styles]")) - { - LoadStylesFromAdvancedSubstationAlpha(subtitle, title, subtitle.Header, HeaderNoStyles, sb); - isValidAssHeader = true; - styles = AdvancedSubStationAlpha.GetStylesFromHeader(subtitle.Header); - } - else if (subtitle.Header != null && subtitle.Header.Contains("http://www.w3.org/ns/ttml")) - { - LoadStylesFromTimedText10(subtitle, title, header, HeaderNoStyles, sb); - } - else - { - var ssa = Configuration.Settings.SubtitleSettings; - string boldStyle = "0"; // 0=regular - if (ssa.SsaFontBold) - { - boldStyle = "-1"; // -1 = true, 0 is false - } - - sb.AppendLine(string.Format(header, - title, - ssa.SsaFontName, - (int)ssa.SsaFontSize, - ColorTranslator.ToWin32(fontColor), - ssa.SsaOutline, - ssa.SsaShadow, - ssa.SsaMarginLeft, - ssa.SsaMarginRight, - ssa.SsaMarginTopBottom, - boldStyle - )); - } - foreach (Paragraph p in subtitle.Paragraphs) - { - string start = string.Format(timeCodeFormat, p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, p.StartTime.Milliseconds / 10); - string end = string.Format(timeCodeFormat, p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, p.EndTime.Milliseconds / 10); - string style = "Default"; - - string actor = "NTP"; - if (!string.IsNullOrEmpty(p.Actor)) - { - actor = p.Actor; - } - - string marginL = "0000"; - if (!string.IsNullOrEmpty(p.MarginL) && Utilities.IsInteger(p.MarginL)) - { - marginL = p.MarginL.PadLeft(4, '0'); - } - - string marginR = "0000"; - if (!string.IsNullOrEmpty(p.MarginR) && Utilities.IsInteger(p.MarginR)) - { - marginR = p.MarginR.PadLeft(4, '0'); - } - - string marginV = "0000"; - if (!string.IsNullOrEmpty(p.MarginV) && Utilities.IsInteger(p.MarginV)) - { - marginV = p.MarginV.PadLeft(4, '0'); - } - - string effect = ""; - if (!string.IsNullOrEmpty(p.Effect)) - { - effect = p.Effect; - } - - if (!string.IsNullOrEmpty(p.Extra) && isValidAssHeader && styles.Contains(p.Extra)) - { - style = p.Extra; - } - - if (style == "Default") - { - style = "*Default"; - } - - if (p.IsComment) - { - sb.AppendLine(string.Format(commentWriteFormat, start, end, AdvancedSubStationAlpha.FormatText(p), style, p.Layer, actor, marginL, marginR, marginV, effect)); - } - else - { - sb.AppendLine(string.Format(paragraphWriteFormat, start, end, AdvancedSubStationAlpha.FormatText(p), style, p.Layer, actor, marginL, marginR, marginV, effect)); - } - } - return sb.ToString().Trim() + Environment.NewLine; - } - - private static void LoadStylesFromAdvancedSubstationAlpha(Subtitle subtitle, string title, string header, string headerNoStyles, StringBuilder sb) - { - try - { - var style = GetStyle(subtitle.Header); - if (!string.IsNullOrEmpty(style)) - { - sb.AppendLine(string.Format(headerNoStyles, title, style)); - subtitle.Header = sb.ToString(); - } - else - { - sb.AppendLine(string.Format(header, title)); - } - } - catch - { - sb.AppendLine(string.Format(header, title)); - } - } - - private static string GetStyle(string header) - { - var ttStyles = new StringBuilder(); - foreach (string styleName in AdvancedSubStationAlpha.GetStylesFromHeader(header)) - { - try - { - var ssaStyle = AdvancedSubStationAlpha.GetSsaStyle(styleName, header); - - string bold = "0"; - if (ssaStyle.Bold) - { - bold = "-1"; - } - - string italic = "0"; - if (ssaStyle.Italic) - { - italic = "-1"; - } - - string newAlignment = "2"; - switch (ssaStyle.Alignment) - { - case "1": - newAlignment = "1"; - break; - case "3": - newAlignment = "3"; - break; - case "4": - newAlignment = "9"; - break; - case "5": - newAlignment = "10"; - break; - case "6": - newAlignment = "11"; - break; - case "7": - newAlignment = "5"; - break; - case "8": - newAlignment = "6"; - break; - case "9": - newAlignment = "7"; - break; - } - - //Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding - const string styleFormat = "Style: {0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13},{14},{15},0,1"; - // N FN FS PC SC TC BC Bo It BS O Sh Ali ML MR MV A Encoding - - ttStyles.AppendLine(string.Format(styleFormat, ssaStyle.Name, ssaStyle.FontName, ssaStyle.FontSize, ssaStyle.Primary.ToArgb(), ssaStyle.Secondary.ToArgb(), - ssaStyle.Outline.ToArgb(), ssaStyle.Background.ToArgb(), bold, italic, ssaStyle.BorderStyle, ssaStyle.OutlineWidth.ToString(CultureInfo.InvariantCulture), ssaStyle.ShadowWidth.ToString(CultureInfo.InvariantCulture), - newAlignment, ssaStyle.MarginLeft, ssaStyle.MarginRight, ssaStyle.MarginVertical)); - } - catch - { - // ignored - } - } - - return ttStyles.ToString(); - } - - private static void LoadStylesFromTimedText10(Subtitle subtitle, string title, string header, string headerNoStyles, StringBuilder sb) - { - try - { - var lines = subtitle.Header.SplitToLines(); - var tt = new TimedText10(); - var sub = new Subtitle(); - tt.LoadSubtitle(sub, lines, string.Empty); - - var xml = new XmlDocument(); - xml.LoadXml(subtitle.Header); - var nsmgr = new XmlNamespaceManager(xml.NameTable); - nsmgr.AddNamespace("ttml", "http://www.w3.org/ns/ttml"); - XmlNode head = xml.DocumentElement.SelectSingleNode("ttml:head", nsmgr); - int stylexmlCount = 0; - var ttStyles = new StringBuilder(); - foreach (XmlNode node in head.SelectNodes("//ttml:style", nsmgr)) - { - string name = null; - if (node.Attributes["xml:id"] != null) - { - name = node.Attributes["xml:id"].Value; - } - else if (node.Attributes["id"] != null) - { - name = node.Attributes["id"].Value; - } - - if (name != null) - { - stylexmlCount++; - - string fontFamily = "Arial"; - if (node.Attributes["tts:fontFamily"] != null) - { - fontFamily = node.Attributes["tts:fontFamily"].Value; - } - - string fontWeight = "normal"; - if (node.Attributes["tts:fontWeight"] != null) - { - fontWeight = node.Attributes["tts:fontWeight"].Value; - } - - string fontStyle = "normal"; - if (node.Attributes["tts:fontStyle"] != null) - { - fontStyle = node.Attributes["tts:fontStyle"].Value; - } - - string color = "#ffffff"; - if (node.Attributes["tts:color"] != null) - { - color = node.Attributes["tts:color"].Value.Trim(); - } - - Color c; - try - { - if (color.StartsWith("rgb(", StringComparison.Ordinal)) - { - string[] arr = color.Remove(0, 4).TrimEnd(')').Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); - c = Color.FromArgb(int.Parse(arr[0]), int.Parse(arr[1]), int.Parse(arr[2])); - } - else - { - c = ColorTranslator.FromHtml(color); - } - } - catch - { - c = Color.White; - } - - string fontSize = "20"; - if (node.Attributes["tts:fontSize"] != null) - { - fontSize = node.Attributes["tts:fontSize"].Value.Replace("px", string.Empty).Replace("em", string.Empty); - } - - if (!int.TryParse(fontSize, out var fSize)) - { - fSize = 20; - } - - const string styleFormat = "Style: {0},{1},{2},{3},65535,65535,-2147483640,-1,0,1,3,0,2,10,10,10,0,1"; - - ttStyles.AppendLine(string.Format(styleFormat, name, fontFamily, fSize, c.ToArgb())); - } - } - - if (stylexmlCount > 0) - { - sb.AppendLine(string.Format(headerNoStyles, title, ttStyles)); - subtitle.Header = sb.ToString(); - } - else - { - sb.AppendLine(string.Format(header, title)); - } - } - catch - { - sb.AppendLine(string.Format(header, title)); - } - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - Errors = null; - bool eventsStarted = false; - subtitle.Paragraphs.Clear(); - // "Marked", " Start", " End", " Style", " Name", " MarginL", " MarginR", " MarginV", " Effect", " Text" - int indexLayer = 0; - int indexStart = 1; - int indexEnd = 2; - int indexStyle = 3; - const int indexName = 4; - int indexMarginL = 5; - int indexMarginR = 6; - int indexMarginV = 7; - int indexEffect = 8; - int indexText = 9; - var errors = new StringBuilder(); - int lineNumber = 0; - - var header = new StringBuilder(); - for (int i1 = 0; i1 < lines.Count; i1++) - { - string line = lines[i1]; - lineNumber++; - if (!eventsStarted) - { - header.AppendLine(line); - } - - if (!string.IsNullOrEmpty(line) && line.TrimStart().StartsWith(';')) - { - // skip comment lines - } - else if (line.Trim().Equals("[events]", StringComparison.OrdinalIgnoreCase)) - { - eventsStarted = true; - } - else if (eventsStarted && !string.IsNullOrWhiteSpace(line)) - { - string s = line.Trim().ToLowerInvariant(); - if (line.Length > 10 && s.StartsWith("format:", StringComparison.Ordinal)) - { - var format = s.Substring(8).Split(','); - for (int i = 0; i < format.Length; i++) - { - var formatTrimmed = format[i].Trim(); - if (formatTrimmed.Equals("layer", StringComparison.Ordinal)) - { - indexLayer = i; - } - else if (formatTrimmed.Equals("start", StringComparison.Ordinal)) - { - indexStart = i; - } - else if (formatTrimmed.Equals("end", StringComparison.Ordinal)) - { - indexEnd = i; - } - else if (formatTrimmed.Equals("text", StringComparison.Ordinal)) - { - indexText = i; - } - else if (formatTrimmed.Equals("effect", StringComparison.Ordinal)) - { - indexEffect = i; - } - else if (formatTrimmed.Equals("style", StringComparison.Ordinal)) - { - indexStyle = i; - } - else if (formatTrimmed.Equals("marginl", StringComparison.Ordinal)) - { - indexMarginL = i; - } - else if (formatTrimmed.Equals("marginr", StringComparison.Ordinal)) - { - indexMarginR = i; - } - else if (formatTrimmed.Equals("marginv", StringComparison.Ordinal)) - { - indexMarginV = i; - } - } - } - else if (!string.IsNullOrEmpty(s)) - { - var text = string.Empty; - var start = string.Empty; - var end = string.Empty; - var style = string.Empty; - var marginL = string.Empty; - var marginR = string.Empty; - var marginV = string.Empty; - var layer = 0; - var effect = string.Empty; - var name = string.Empty; - - string[] splittedLine; - if (s.StartsWith("dialog:", StringComparison.Ordinal)) - { - splittedLine = line.Remove(0, 7).Split(','); - } - else if (s.StartsWith("dialogue:", StringComparison.Ordinal)) - { - splittedLine = line.Remove(0, 9).Split(','); - } - else - { - splittedLine = line.Split(','); - } - - for (int i = 0; i < splittedLine.Length; i++) - { - if (i == indexStart) - { - start = splittedLine[i].Trim(); - } - else if (i == indexEnd) - { - end = splittedLine[i].Trim(); - } - else if (i == indexLayer) - { - int.TryParse(splittedLine[i], out layer); - } - else if (i == indexEffect) - { - effect = splittedLine[i]; - } - else if (i == indexText) - { - text = splittedLine[i]; - } - else if (i == indexStyle) - { - style = splittedLine[i]; - } - else if (i == indexMarginL) - { - marginL = splittedLine[i].Trim(); - } - else if (i == indexMarginR) - { - marginR = splittedLine[i].Trim(); - } - else if (i == indexMarginV) - { - marginV = splittedLine[i].Trim(); - } - else if (i == indexName) - { - name = splittedLine[i]; - } - else if (i > indexText) - { - text += "," + splittedLine[i]; - } - } - - try - { - var p = new Paragraph - { - StartTime = GetTimeCodeFromString(start), - EndTime = GetTimeCodeFromString(end), - Text = AdvancedSubStationAlpha.GetFormattedText(text) - }; - - if (!string.IsNullOrEmpty(style)) - { - p.Extra = style; - } - - if (!string.IsNullOrEmpty(marginL)) - { - p.MarginL = marginL; - } - - if (!string.IsNullOrEmpty(marginR)) - { - p.MarginR = marginR; - } - - if (!string.IsNullOrEmpty(marginV)) - { - p.MarginV = marginV; - } - - if (!string.IsNullOrEmpty(effect)) - { - p.Effect = effect; - } - - p.Layer = layer; - if (!string.IsNullOrEmpty(name)) - { - p.Actor = name; - } - - p.IsComment = s.StartsWith("comment:", StringComparison.Ordinal); - subtitle.Paragraphs.Add(p); - } - catch - { - _errorCount++; - if (errors.Length < 2000) - { - errors.AppendLine(string.Format(Configuration.Settings.Language.Main.LineNumberXErrorReadingTimeCodeFromSourceLineY, lineNumber, line)); - } - else if (subtitle.Paragraphs.Count == 0) - { - break; - } - } - } - } - } - if (header.Length > 0) - { - subtitle.Header = header.ToString(); - } - - subtitle.Renumber(); - Errors = errors.ToString(); - } - - private static TimeCode GetTimeCodeFromString(string time) - { - // h:mm:ss.cc - string[] timeCode = time.Split(':', '.'); - return new TimeCode(int.Parse(timeCode[0]), - int.Parse(timeCode[1]), - int.Parse(timeCode[2]), - int.Parse(timeCode[3]) * 10); - } - - public override void RemoveNativeFormatting(Subtitle subtitle, SubtitleFormat newFormat) - { - if (newFormat != null && newFormat.Name == AdvancedSubStationAlpha.NameOfFormat) - { - // do we need any conversion? - } - else - { - foreach (Paragraph p in subtitle.Paragraphs) - { - int indexOfBegin = p.Text.IndexOf('{'); - string pre = string.Empty; - while (indexOfBegin >= 0 && p.Text.IndexOf('}') > indexOfBegin) - { - string s = p.Text.Substring(indexOfBegin); - if (s.StartsWith("{\\an1}", StringComparison.Ordinal) || - s.StartsWith("{\\an2}", StringComparison.Ordinal) || - s.StartsWith("{\\an3}", StringComparison.Ordinal) || - s.StartsWith("{\\an4}", StringComparison.Ordinal) || - s.StartsWith("{\\an5}", StringComparison.Ordinal) || - s.StartsWith("{\\an6}", StringComparison.Ordinal) || - s.StartsWith("{\\an7}", StringComparison.Ordinal) || - s.StartsWith("{\\an8}", StringComparison.Ordinal) || - s.StartsWith("{\\an9}", StringComparison.Ordinal)) - { - pre = s.Substring(0, 6); - } - else if (s.StartsWith("{\\an1\\", StringComparison.Ordinal) || - s.StartsWith("{\\an2\\", StringComparison.Ordinal) || - s.StartsWith("{\\an3\\", StringComparison.Ordinal) || - s.StartsWith("{\\an4\\", StringComparison.Ordinal) || - s.StartsWith("{\\an5\\", StringComparison.Ordinal) || - s.StartsWith("{\\an6\\", StringComparison.Ordinal) || - s.StartsWith("{\\an7\\", StringComparison.Ordinal) || - s.StartsWith("{\\an8\\", StringComparison.Ordinal) || - s.StartsWith("{\\an9\\", StringComparison.Ordinal)) - { - pre = s.Substring(0, 5) + "}"; - } - else if (s.StartsWith("{\\a1}", StringComparison.Ordinal) || s.StartsWith("{\\a1\\", StringComparison.Ordinal) || - s.StartsWith("{\\a3}", StringComparison.Ordinal) || s.StartsWith("{\\a3\\", StringComparison.Ordinal)) - { - pre = s.Substring(0, 4) + "}"; - } - else if (s.StartsWith("{\\a9}", StringComparison.Ordinal) || s.StartsWith("{\\a9\\", StringComparison.Ordinal)) - { - pre = "{\\an4}"; - } - else if (s.StartsWith("{\\a10}", StringComparison.Ordinal) || s.StartsWith("{\\a10\\", StringComparison.Ordinal)) - { - pre = "{\\an5}"; - } - else if (s.StartsWith("{\\a11}", StringComparison.Ordinal) || s.StartsWith("{\\a11\\", StringComparison.Ordinal)) - { - pre = "{\\an6}"; - } - else if (s.StartsWith("{\\a5}", StringComparison.Ordinal) || s.StartsWith("{\\a5\\", StringComparison.Ordinal)) - { - pre = "{\\an7}"; - } - else if (s.StartsWith("{\\a6}", StringComparison.Ordinal) || s.StartsWith("{\\a6\\", StringComparison.Ordinal)) - { - pre = "{\\an8}"; - } - else if (s.StartsWith("{\\a7}", StringComparison.Ordinal) || s.StartsWith("{\\a7\\", StringComparison.Ordinal)) - { - pre = "{\\an9}"; - } - int indexOfEnd = p.Text.IndexOf('}'); - p.Text = p.Text.Remove(indexOfBegin, (indexOfEnd - indexOfBegin) + 1); - - indexOfBegin = p.Text.IndexOf('{'); - } - p.Text = pre + p.Text; - } - } - } - - public override bool HasStyleSupport => true; - - public static string GetHeaderAndStylesFromAdvancedSubStationAlpha(string header, string title) - { - var scriptInfo = string.Empty; - if (header != null && header.Contains("[Script Info]") && header.Contains("ScriptType: v4.00+")) - { - var sb = new StringBuilder(); - var scriptInfoOn = false; - foreach (var line in header.SplitToLines()) - { - if (line.RemoveChar(' ').Contains("Styles]", StringComparison.OrdinalIgnoreCase)) - { - break; - } - - if (line.Equals("[Script Info]", StringComparison.OrdinalIgnoreCase)) - { - scriptInfoOn = true; - } - - if (scriptInfoOn) - { - if (line.StartsWith("ScriptType:", StringComparison.OrdinalIgnoreCase)) - { - sb.AppendLine("ScriptType: v4.00"); - } - else if (line.Equals("; This is an Advanced Sub Station Alpha v4+ script.", StringComparison.OrdinalIgnoreCase)) - { - sb.AppendLine("; This is a Sub Station Alpha v4 script."); - } - else - { - sb.AppendLine(line); - } - } - } - scriptInfo = sb.ToString(); - } - - var style = GetStyle(header); - - if (string.IsNullOrEmpty(scriptInfo) || string.IsNullOrEmpty(style)) - { - var s = new Subtitle { Paragraphs = { new Paragraph("test", 0, 1000) } }; - new SubStationAlpha().ToText(s, string.Empty); - return s.Header; - } - - return string.Format($@"{scriptInfo.Trim() + Environment.NewLine} -[V4 Styles] -Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding -{style.Trim() + Environment.NewLine} -[Events]"); - } - } -} +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Globalization; +using System.Text; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class SubStationAlpha : SubtitleFormat + { + public string Errors { get; private set; } + + public override string Extension => ".ssa"; + + public const string NameOfFormat = "Sub Station Alpha"; + + public override string Name => NameOfFormat; + + public override bool IsMine(List lines, string fileName) + { + var subtitle = new Subtitle(); + LoadSubtitle(subtitle, lines, fileName); + Errors = null; + return subtitle.Paragraphs.Count > _errorCount; + } + + const string HeaderNoStyles = + @"[Script Info] +; This is a Sub Station Alpha v4 script. +Title: {0} +ScriptType: v4.00 +Collisions: Normal +PlayDepth: 0 + +[V4 Styles] +Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding +{1} + +[Events] +Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text"; + + public override string ToText(Subtitle subtitle, string title) + { + const string header = +@"[Script Info] +; This is a Sub Station Alpha v4 script. +Title: {0} +ScriptType: v4.00 +Collisions: Normal +PlayDepth: 0 + +[V4 Styles] +Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding +Style: Default,{1},{2},{3},65535,65535,-2147483640,{9},0,1,{4},{5},2,{6},{7},{8},0,1 + +[Events] +Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text"; + + + + const string timeCodeFormat = "{0}:{1:00}:{2:00}.{3:00}"; // h:mm:ss.cc + const string paragraphWriteFormat = "Dialogue: Marked={4},{0},{1},{3},{5},{6},{7},{8},{9},{2}"; + const string commentWriteFormat = "Comment: Marked={4},{0},{1},{3},{5},{6},{7},{8},{9},{2}"; + + var sb = new StringBuilder(); + Color fontColor = Color.FromArgb(Configuration.Settings.SubtitleSettings.SsaFontColorArgb); + bool isValidAssHeader = !string.IsNullOrEmpty(subtitle.Header) && subtitle.Header.Contains("[V4 Styles]"); + var styles = new List(); + if (isValidAssHeader) + { + sb.AppendLine(subtitle.Header.Trim()); + const string formatLine = "Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text"; + if (!subtitle.Header.Contains(formatLine)) + { + sb.AppendLine(formatLine); + } + + styles = AdvancedSubStationAlpha.GetStylesFromHeader(subtitle.Header); + } + else if (!string.IsNullOrEmpty(subtitle.Header) && subtitle.Header.Contains("[V4+ Styles]")) + { + LoadStylesFromAdvancedSubstationAlpha(subtitle, title, subtitle.Header, HeaderNoStyles, sb); + isValidAssHeader = true; + styles = AdvancedSubStationAlpha.GetStylesFromHeader(subtitle.Header); + } + else if (subtitle.Header != null && subtitle.Header.Contains("http://www.w3.org/ns/ttml")) + { + LoadStylesFromTimedText10(subtitle, title, header, HeaderNoStyles, sb); + } + else + { + var ssa = Configuration.Settings.SubtitleSettings; + string boldStyle = "0"; // 0=regular + if (ssa.SsaFontBold) + { + boldStyle = "-1"; // -1 = true, 0 is false + } + + sb.AppendLine(string.Format(header, + title, + ssa.SsaFontName, + (int)ssa.SsaFontSize, + ColorTranslator.ToWin32(fontColor), + ssa.SsaOutline, + ssa.SsaShadow, + ssa.SsaMarginLeft, + ssa.SsaMarginRight, + ssa.SsaMarginTopBottom, + boldStyle + )); + } + foreach (Paragraph p in subtitle.Paragraphs) + { + string start = string.Format(timeCodeFormat, p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, p.StartTime.Milliseconds / 10); + string end = string.Format(timeCodeFormat, p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, p.EndTime.Milliseconds / 10); + string style = "Default"; + + string actor = "NTP"; + if (!string.IsNullOrEmpty(p.Actor)) + { + actor = p.Actor; + } + + string marginL = "0000"; + if (!string.IsNullOrEmpty(p.MarginL) && Utilities.IsInteger(p.MarginL)) + { + marginL = p.MarginL.PadLeft(4, '0'); + } + + string marginR = "0000"; + if (!string.IsNullOrEmpty(p.MarginR) && Utilities.IsInteger(p.MarginR)) + { + marginR = p.MarginR.PadLeft(4, '0'); + } + + string marginV = "0000"; + if (!string.IsNullOrEmpty(p.MarginV) && Utilities.IsInteger(p.MarginV)) + { + marginV = p.MarginV.PadLeft(4, '0'); + } + + string effect = ""; + if (!string.IsNullOrEmpty(p.Effect)) + { + effect = p.Effect; + } + + if (!string.IsNullOrEmpty(p.Extra) && isValidAssHeader && styles.Contains(p.Extra)) + { + style = p.Extra; + } + + if (style == "Default") + { + style = "*Default"; + } + + if (p.IsComment) + { + sb.AppendLine(string.Format(commentWriteFormat, start, end, AdvancedSubStationAlpha.FormatText(p), style, p.Layer, actor, marginL, marginR, marginV, effect)); + } + else + { + sb.AppendLine(string.Format(paragraphWriteFormat, start, end, AdvancedSubStationAlpha.FormatText(p), style, p.Layer, actor, marginL, marginR, marginV, effect)); + } + } + return sb.ToString().Trim() + Environment.NewLine; + } + + private static void LoadStylesFromAdvancedSubstationAlpha(Subtitle subtitle, string title, string header, string headerNoStyles, StringBuilder sb) + { + try + { + var style = GetStyle(subtitle.Header); + if (!string.IsNullOrEmpty(style)) + { + sb.AppendLine(string.Format(headerNoStyles, title, style)); + subtitle.Header = sb.ToString(); + } + else + { + sb.AppendLine(string.Format(header, title)); + } + } + catch + { + sb.AppendLine(string.Format(header, title)); + } + } + + private static string GetStyle(string header) + { + var ttStyles = new StringBuilder(); + foreach (string styleName in AdvancedSubStationAlpha.GetStylesFromHeader(header)) + { + try + { + var ssaStyle = AdvancedSubStationAlpha.GetSsaStyle(styleName, header); + + string bold = "0"; + if (ssaStyle.Bold) + { + bold = "-1"; + } + + string italic = "0"; + if (ssaStyle.Italic) + { + italic = "-1"; + } + + string newAlignment = "2"; + switch (ssaStyle.Alignment) + { + case "1": + newAlignment = "1"; + break; + case "3": + newAlignment = "3"; + break; + case "4": + newAlignment = "9"; + break; + case "5": + newAlignment = "10"; + break; + case "6": + newAlignment = "11"; + break; + case "7": + newAlignment = "5"; + break; + case "8": + newAlignment = "6"; + break; + case "9": + newAlignment = "7"; + break; + } + + //Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding + const string styleFormat = "Style: {0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13},{14},{15},0,1"; + // N FN FS PC SC TC BC Bo It BS O Sh Ali ML MR MV A Encoding + + ttStyles.AppendLine(string.Format(styleFormat, ssaStyle.Name, ssaStyle.FontName, ssaStyle.FontSize, ssaStyle.Primary.ToArgb(), ssaStyle.Secondary.ToArgb(), + ssaStyle.Outline.ToArgb(), ssaStyle.Background.ToArgb(), bold, italic, ssaStyle.BorderStyle, ssaStyle.OutlineWidth.ToString(CultureInfo.InvariantCulture), ssaStyle.ShadowWidth.ToString(CultureInfo.InvariantCulture), + newAlignment, ssaStyle.MarginLeft, ssaStyle.MarginRight, ssaStyle.MarginVertical)); + } + catch + { + // ignored + } + } + + return ttStyles.ToString(); + } + + private static void LoadStylesFromTimedText10(Subtitle subtitle, string title, string header, string headerNoStyles, StringBuilder sb) + { + try + { + var lines = subtitle.Header.SplitToLines(); + var tt = new TimedText10(); + var sub = new Subtitle(); + tt.LoadSubtitle(sub, lines, string.Empty); + + var xml = new XmlDocument(); + xml.LoadXml(subtitle.Header); + var nsmgr = new XmlNamespaceManager(xml.NameTable); + nsmgr.AddNamespace("ttml", "http://www.w3.org/ns/ttml"); + XmlNode head = xml.DocumentElement.SelectSingleNode("ttml:head", nsmgr); + int stylexmlCount = 0; + var ttStyles = new StringBuilder(); + foreach (XmlNode node in head.SelectNodes("//ttml:style", nsmgr)) + { + string name = null; + if (node.Attributes["xml:id"] != null) + { + name = node.Attributes["xml:id"].Value; + } + else if (node.Attributes["id"] != null) + { + name = node.Attributes["id"].Value; + } + + if (name != null) + { + stylexmlCount++; + + string fontFamily = "Arial"; + if (node.Attributes["tts:fontFamily"] != null) + { + fontFamily = node.Attributes["tts:fontFamily"].Value; + } + + string fontWeight = "normal"; + if (node.Attributes["tts:fontWeight"] != null) + { + fontWeight = node.Attributes["tts:fontWeight"].Value; + } + + string fontStyle = "normal"; + if (node.Attributes["tts:fontStyle"] != null) + { + fontStyle = node.Attributes["tts:fontStyle"].Value; + } + + string color = "#ffffff"; + if (node.Attributes["tts:color"] != null) + { + color = node.Attributes["tts:color"].Value.Trim(); + } + + Color c; + try + { + if (color.StartsWith("rgb(", StringComparison.Ordinal)) + { + string[] arr = color.Remove(0, 4).TrimEnd(')').Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + c = Color.FromArgb(int.Parse(arr[0]), int.Parse(arr[1]), int.Parse(arr[2])); + } + else + { + c = ColorTranslator.FromHtml(color); + } + } + catch + { + c = Color.White; + } + + string fontSize = "20"; + if (node.Attributes["tts:fontSize"] != null) + { + fontSize = node.Attributes["tts:fontSize"].Value.Replace("px", string.Empty).Replace("em", string.Empty); + } + + if (!int.TryParse(fontSize, out var fSize)) + { + fSize = 20; + } + + const string styleFormat = "Style: {0},{1},{2},{3},65535,65535,-2147483640,-1,0,1,3,0,2,10,10,10,0,1"; + + ttStyles.AppendLine(string.Format(styleFormat, name, fontFamily, fSize, c.ToArgb())); + } + } + + if (stylexmlCount > 0) + { + sb.AppendLine(string.Format(headerNoStyles, title, ttStyles)); + subtitle.Header = sb.ToString(); + } + else + { + sb.AppendLine(string.Format(header, title)); + } + } + catch + { + sb.AppendLine(string.Format(header, title)); + } + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + Errors = null; + bool eventsStarted = false; + subtitle.Paragraphs.Clear(); + // "Marked", " Start", " End", " Style", " Name", " MarginL", " MarginR", " MarginV", " Effect", " Text" + int indexLayer = 0; + int indexStart = 1; + int indexEnd = 2; + int indexStyle = 3; + const int indexName = 4; + int indexMarginL = 5; + int indexMarginR = 6; + int indexMarginV = 7; + int indexEffect = 8; + int indexText = 9; + var errors = new StringBuilder(); + int lineNumber = 0; + + var header = new StringBuilder(); + for (int i1 = 0; i1 < lines.Count; i1++) + { + string line = lines[i1]; + lineNumber++; + if (!eventsStarted) + { + header.AppendLine(line); + } + + if (!string.IsNullOrEmpty(line) && line.TrimStart().StartsWith(';')) + { + // skip comment lines + } + else if (line.Trim().Equals("[events]", StringComparison.OrdinalIgnoreCase)) + { + eventsStarted = true; + } + else if (eventsStarted && !string.IsNullOrWhiteSpace(line)) + { + string s = line.Trim().ToLowerInvariant(); + if (line.Length > 10 && s.StartsWith("format:", StringComparison.Ordinal)) + { + var format = s.Substring(8).Split(','); + for (int i = 0; i < format.Length; i++) + { + var formatTrimmed = format[i].Trim(); + if (formatTrimmed.Equals("layer", StringComparison.Ordinal)) + { + indexLayer = i; + } + else if (formatTrimmed.Equals("start", StringComparison.Ordinal)) + { + indexStart = i; + } + else if (formatTrimmed.Equals("end", StringComparison.Ordinal)) + { + indexEnd = i; + } + else if (formatTrimmed.Equals("text", StringComparison.Ordinal)) + { + indexText = i; + } + else if (formatTrimmed.Equals("effect", StringComparison.Ordinal)) + { + indexEffect = i; + } + else if (formatTrimmed.Equals("style", StringComparison.Ordinal)) + { + indexStyle = i; + } + else if (formatTrimmed.Equals("marginl", StringComparison.Ordinal)) + { + indexMarginL = i; + } + else if (formatTrimmed.Equals("marginr", StringComparison.Ordinal)) + { + indexMarginR = i; + } + else if (formatTrimmed.Equals("marginv", StringComparison.Ordinal)) + { + indexMarginV = i; + } + } + } + else if (!string.IsNullOrEmpty(s)) + { + var text = string.Empty; + var start = string.Empty; + var end = string.Empty; + var style = string.Empty; + var marginL = string.Empty; + var marginR = string.Empty; + var marginV = string.Empty; + var layer = 0; + var effect = string.Empty; + var name = string.Empty; + + string[] splittedLine; + if (s.StartsWith("dialog:", StringComparison.Ordinal)) + { + splittedLine = line.Remove(0, 7).Split(','); + } + else if (s.StartsWith("dialogue:", StringComparison.Ordinal)) + { + splittedLine = line.Remove(0, 9).Split(','); + } + else + { + splittedLine = line.Split(','); + } + + for (int i = 0; i < splittedLine.Length; i++) + { + if (i == indexStart) + { + start = splittedLine[i].Trim(); + } + else if (i == indexEnd) + { + end = splittedLine[i].Trim(); + } + else if (i == indexLayer) + { + int.TryParse(splittedLine[i], out layer); + } + else if (i == indexEffect) + { + effect = splittedLine[i]; + } + else if (i == indexText) + { + text = splittedLine[i]; + } + else if (i == indexStyle) + { + style = splittedLine[i]; + } + else if (i == indexMarginL) + { + marginL = splittedLine[i].Trim(); + } + else if (i == indexMarginR) + { + marginR = splittedLine[i].Trim(); + } + else if (i == indexMarginV) + { + marginV = splittedLine[i].Trim(); + } + else if (i == indexName) + { + name = splittedLine[i]; + } + else if (i > indexText) + { + text += "," + splittedLine[i]; + } + } + + try + { + var p = new Paragraph + { + StartTime = GetTimeCodeFromString(start), + EndTime = GetTimeCodeFromString(end), + Text = AdvancedSubStationAlpha.GetFormattedText(text) + }; + + if (!string.IsNullOrEmpty(style)) + { + p.Extra = style; + } + + if (!string.IsNullOrEmpty(marginL)) + { + p.MarginL = marginL; + } + + if (!string.IsNullOrEmpty(marginR)) + { + p.MarginR = marginR; + } + + if (!string.IsNullOrEmpty(marginV)) + { + p.MarginV = marginV; + } + + if (!string.IsNullOrEmpty(effect)) + { + p.Effect = effect; + } + + p.Layer = layer; + if (!string.IsNullOrEmpty(name)) + { + p.Actor = name; + } + + p.IsComment = s.StartsWith("comment:", StringComparison.Ordinal); + subtitle.Paragraphs.Add(p); + } + catch + { + _errorCount++; + if (errors.Length < 2000) + { + errors.AppendLine(string.Format(Configuration.Settings.Language.Main.LineNumberXErrorReadingTimeCodeFromSourceLineY, lineNumber, line)); + } + else if (subtitle.Paragraphs.Count == 0) + { + break; + } + } + } + } + } + if (header.Length > 0) + { + subtitle.Header = header.ToString(); + } + + subtitle.Renumber(); + Errors = errors.ToString(); + } + + private static TimeCode GetTimeCodeFromString(string time) + { + // h:mm:ss.cc + string[] timeCode = time.Split(':', '.'); + return new TimeCode(int.Parse(timeCode[0]), + int.Parse(timeCode[1]), + int.Parse(timeCode[2]), + int.Parse(timeCode[3]) * 10); + } + + public override void RemoveNativeFormatting(Subtitle subtitle, SubtitleFormat newFormat) + { + if (newFormat != null && newFormat.Name == AdvancedSubStationAlpha.NameOfFormat) + { + // do we need any conversion? + } + else + { + foreach (Paragraph p in subtitle.Paragraphs) + { + int indexOfBegin = p.Text.IndexOf('{'); + string pre = string.Empty; + while (indexOfBegin >= 0 && p.Text.IndexOf('}') > indexOfBegin) + { + string s = p.Text.Substring(indexOfBegin); + if (s.StartsWith("{\\an1}", StringComparison.Ordinal) || + s.StartsWith("{\\an2}", StringComparison.Ordinal) || + s.StartsWith("{\\an3}", StringComparison.Ordinal) || + s.StartsWith("{\\an4}", StringComparison.Ordinal) || + s.StartsWith("{\\an5}", StringComparison.Ordinal) || + s.StartsWith("{\\an6}", StringComparison.Ordinal) || + s.StartsWith("{\\an7}", StringComparison.Ordinal) || + s.StartsWith("{\\an8}", StringComparison.Ordinal) || + s.StartsWith("{\\an9}", StringComparison.Ordinal)) + { + pre = s.Substring(0, 6); + } + else if (s.StartsWith("{\\an1\\", StringComparison.Ordinal) || + s.StartsWith("{\\an2\\", StringComparison.Ordinal) || + s.StartsWith("{\\an3\\", StringComparison.Ordinal) || + s.StartsWith("{\\an4\\", StringComparison.Ordinal) || + s.StartsWith("{\\an5\\", StringComparison.Ordinal) || + s.StartsWith("{\\an6\\", StringComparison.Ordinal) || + s.StartsWith("{\\an7\\", StringComparison.Ordinal) || + s.StartsWith("{\\an8\\", StringComparison.Ordinal) || + s.StartsWith("{\\an9\\", StringComparison.Ordinal)) + { + pre = s.Substring(0, 5) + "}"; + } + else if (s.StartsWith("{\\a1}", StringComparison.Ordinal) || s.StartsWith("{\\a1\\", StringComparison.Ordinal) || + s.StartsWith("{\\a3}", StringComparison.Ordinal) || s.StartsWith("{\\a3\\", StringComparison.Ordinal)) + { + pre = s.Substring(0, 4) + "}"; + } + else if (s.StartsWith("{\\a9}", StringComparison.Ordinal) || s.StartsWith("{\\a9\\", StringComparison.Ordinal)) + { + pre = "{\\an4}"; + } + else if (s.StartsWith("{\\a10}", StringComparison.Ordinal) || s.StartsWith("{\\a10\\", StringComparison.Ordinal)) + { + pre = "{\\an5}"; + } + else if (s.StartsWith("{\\a11}", StringComparison.Ordinal) || s.StartsWith("{\\a11\\", StringComparison.Ordinal)) + { + pre = "{\\an6}"; + } + else if (s.StartsWith("{\\a5}", StringComparison.Ordinal) || s.StartsWith("{\\a5\\", StringComparison.Ordinal)) + { + pre = "{\\an7}"; + } + else if (s.StartsWith("{\\a6}", StringComparison.Ordinal) || s.StartsWith("{\\a6\\", StringComparison.Ordinal)) + { + pre = "{\\an8}"; + } + else if (s.StartsWith("{\\a7}", StringComparison.Ordinal) || s.StartsWith("{\\a7\\", StringComparison.Ordinal)) + { + pre = "{\\an9}"; + } + int indexOfEnd = p.Text.IndexOf('}'); + p.Text = p.Text.Remove(indexOfBegin, (indexOfEnd - indexOfBegin) + 1); + + indexOfBegin = p.Text.IndexOf('{'); + } + p.Text = pre + p.Text; + } + } + } + + public override bool HasStyleSupport => true; + + public static string GetHeaderAndStylesFromAdvancedSubStationAlpha(string header, string title) + { + var scriptInfo = string.Empty; + if (header != null && header.Contains("[Script Info]") && header.Contains("ScriptType: v4.00+")) + { + var sb = new StringBuilder(); + var scriptInfoOn = false; + foreach (var line in header.SplitToLines()) + { + if (line.RemoveChar(' ').Contains("Styles]", StringComparison.OrdinalIgnoreCase)) + { + break; + } + + if (line.Equals("[Script Info]", StringComparison.OrdinalIgnoreCase)) + { + scriptInfoOn = true; + } + + if (scriptInfoOn) + { + if (line.StartsWith("ScriptType:", StringComparison.OrdinalIgnoreCase)) + { + sb.AppendLine("ScriptType: v4.00"); + } + else if (line.Equals("; This is an Advanced Sub Station Alpha v4+ script.", StringComparison.OrdinalIgnoreCase)) + { + sb.AppendLine("; This is a Sub Station Alpha v4 script."); + } + else + { + sb.AppendLine(line); + } + } + } + scriptInfo = sb.ToString(); + } + + var style = GetStyle(header); + + if (string.IsNullOrEmpty(scriptInfo) || string.IsNullOrEmpty(style)) + { + var s = new Subtitle { Paragraphs = { new Paragraph("test", 0, 1000) } }; + new SubStationAlpha().ToText(s, string.Empty); + return s.Header; + } + + return string.Format($@"{scriptInfo.Trim() + Environment.NewLine} +[V4 Styles] +Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding +{style.Trim() + Environment.NewLine} +[Events]"); + } + } +} diff --git a/libse/SubtitleFormats/SubUrbia.cs b/src/libse/SubtitleFormats/SubUrbia.cs similarity index 100% rename from libse/SubtitleFormats/SubUrbia.cs rename to src/libse/SubtitleFormats/SubUrbia.cs diff --git a/libse/SubtitleFormats/SubViewer10.cs b/src/libse/SubtitleFormats/SubViewer10.cs similarity index 97% rename from libse/SubtitleFormats/SubViewer10.cs rename to src/libse/SubtitleFormats/SubViewer10.cs index 7461dcb56..11dff345d 100644 --- a/libse/SubtitleFormats/SubViewer10.cs +++ b/src/libse/SubtitleFormats/SubViewer10.cs @@ -1,126 +1,126 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class SubViewer10 : SubtitleFormat - { - private static readonly Regex RegexTimeCode = new Regex(@"^\[\d\d:\d\d:\d\d\]$", RegexOptions.Compiled); - - private enum ExpectingLine - { - TimeStart, - Text, - TimeEnd, - } - - public override string Extension => ".sub"; - - public override string Name => "SubViewer 1.0"; - - public override string ToText(Subtitle subtitle, string title) - { - //[00:02:14] - //Yes a new line|Line number 2 - //[00:02:15] - string paragraphWriteFormat = "[{0:00}:{1:00}:{2:00}]" + Environment.NewLine + - "{3}" + Environment.NewLine + - "[{4:00}:{5:00}:{6:00}]"; - const string header = @"[TITLE] -{0} -[AUTHOR] -[SOURCE] -[PRG] -[FILEPATH] -[DELAY] -0 -[CD TRACK] -0 -[BEGIN] -******** START SCRIPT ******** -"; - const string footer = @"[end] -******** END SCRIPT ******** -"; - var sb = new StringBuilder(); - sb.AppendFormat(header, title); - foreach (Paragraph p in subtitle.Paragraphs) - { - string text = HtmlUtil.RemoveHtmlTags(p.Text.Replace(Environment.NewLine, "|")); - - sb.AppendLine(string.Format(paragraphWriteFormat, - p.StartTime.Hours, - p.StartTime.Minutes, - p.StartTime.Seconds, - text, - p.EndTime.Hours, - p.EndTime.Minutes, - p.EndTime.Seconds)); - sb.AppendLine(); - } - sb.Append(footer); - return sb.ToString().Trim(); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - var paragraph = new Paragraph(); - ExpectingLine expecting = ExpectingLine.TimeStart; - _errorCount = 0; - - subtitle.Paragraphs.Clear(); - char[] splitChars = { ':', ']', '[', ' ' }; - foreach (string line in lines) - { - if (line.StartsWith('[') && RegexTimeCode.IsMatch(line)) - { - string[] parts = line.Split(splitChars, StringSplitOptions.RemoveEmptyEntries); - if (parts.Length == 3) - { - try - { - int startHours = int.Parse(parts[0]); - int startMinutes = int.Parse(parts[1]); - int startSeconds = int.Parse(parts[2]); - var tc = new TimeCode(startHours, startMinutes, startSeconds, 0); - if (expecting == ExpectingLine.TimeStart) - { - paragraph = new Paragraph(); - paragraph.StartTime = tc; - expecting = ExpectingLine.Text; - } - else if (expecting == ExpectingLine.TimeEnd) - { - paragraph.EndTime = tc; - expecting = ExpectingLine.TimeStart; - subtitle.Paragraphs.Add(paragraph); - paragraph = new Paragraph(); - } - } - catch - { - _errorCount++; - expecting = ExpectingLine.TimeStart; - } - } - } - else - { - if (expecting == ExpectingLine.Text) - { - if (line.Length > 0) - { - string text = line.Replace("|", Environment.NewLine); - paragraph.Text = text; - expecting = ExpectingLine.TimeEnd; - } - } - } - } - subtitle.Renumber(); - } - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class SubViewer10 : SubtitleFormat + { + private static readonly Regex RegexTimeCode = new Regex(@"^\[\d\d:\d\d:\d\d\]$", RegexOptions.Compiled); + + private enum ExpectingLine + { + TimeStart, + Text, + TimeEnd, + } + + public override string Extension => ".sub"; + + public override string Name => "SubViewer 1.0"; + + public override string ToText(Subtitle subtitle, string title) + { + //[00:02:14] + //Yes a new line|Line number 2 + //[00:02:15] + string paragraphWriteFormat = "[{0:00}:{1:00}:{2:00}]" + Environment.NewLine + + "{3}" + Environment.NewLine + + "[{4:00}:{5:00}:{6:00}]"; + const string header = @"[TITLE] +{0} +[AUTHOR] +[SOURCE] +[PRG] +[FILEPATH] +[DELAY] +0 +[CD TRACK] +0 +[BEGIN] +******** START SCRIPT ******** +"; + const string footer = @"[end] +******** END SCRIPT ******** +"; + var sb = new StringBuilder(); + sb.AppendFormat(header, title); + foreach (Paragraph p in subtitle.Paragraphs) + { + string text = HtmlUtil.RemoveHtmlTags(p.Text.Replace(Environment.NewLine, "|")); + + sb.AppendLine(string.Format(paragraphWriteFormat, + p.StartTime.Hours, + p.StartTime.Minutes, + p.StartTime.Seconds, + text, + p.EndTime.Hours, + p.EndTime.Minutes, + p.EndTime.Seconds)); + sb.AppendLine(); + } + sb.Append(footer); + return sb.ToString().Trim(); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + var paragraph = new Paragraph(); + ExpectingLine expecting = ExpectingLine.TimeStart; + _errorCount = 0; + + subtitle.Paragraphs.Clear(); + char[] splitChars = { ':', ']', '[', ' ' }; + foreach (string line in lines) + { + if (line.StartsWith('[') && RegexTimeCode.IsMatch(line)) + { + string[] parts = line.Split(splitChars, StringSplitOptions.RemoveEmptyEntries); + if (parts.Length == 3) + { + try + { + int startHours = int.Parse(parts[0]); + int startMinutes = int.Parse(parts[1]); + int startSeconds = int.Parse(parts[2]); + var tc = new TimeCode(startHours, startMinutes, startSeconds, 0); + if (expecting == ExpectingLine.TimeStart) + { + paragraph = new Paragraph(); + paragraph.StartTime = tc; + expecting = ExpectingLine.Text; + } + else if (expecting == ExpectingLine.TimeEnd) + { + paragraph.EndTime = tc; + expecting = ExpectingLine.TimeStart; + subtitle.Paragraphs.Add(paragraph); + paragraph = new Paragraph(); + } + } + catch + { + _errorCount++; + expecting = ExpectingLine.TimeStart; + } + } + } + else + { + if (expecting == ExpectingLine.Text) + { + if (line.Length > 0) + { + string text = line.Replace("|", Environment.NewLine); + paragraph.Text = text; + expecting = ExpectingLine.TimeEnd; + } + } + } + } + subtitle.Renumber(); + } + } +} diff --git a/libse/SubtitleFormats/SubViewer20.cs b/src/libse/SubtitleFormats/SubViewer20.cs similarity index 97% rename from libse/SubtitleFormats/SubViewer20.cs rename to src/libse/SubtitleFormats/SubViewer20.cs index afcba3845..766007213 100644 --- a/libse/SubtitleFormats/SubViewer20.cs +++ b/src/libse/SubtitleFormats/SubViewer20.cs @@ -1,161 +1,161 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class SubViewer20 : SubtitleFormat - { - private enum ExpectingLine - { - TimeCodes, - Text - } - - private static readonly Regex RegexTimeCodes = new Regex(@"^\d\d:\d\d:\d\d.\d+,\d\d:\d\d:\d\d.\d+$", RegexOptions.Compiled); - - public override string Extension => ".sub"; - - public override string Name => "SubViewer 2.0"; - - public override bool IsMine(List lines, string fileName) - { - var sbv = new YouTubeSbv(); - if (sbv.IsMine(lines, fileName) && !string.Join(string.Empty, lines.ToArray()).Contains("[br]")) - { - return false; - } - - return base.IsMine(lines, fileName); - } - - public override string ToText(Subtitle subtitle, string title) - { - const string paragraphWriteFormat = "{0:00}:{1:00}:{2:00}.{3:00},{4:00}:{5:00}:{6:00}.{7:00}{8}{9}"; - const string header = @"[INFORMATION] -[TITLE]{0} -[AUTHOR] -[SOURCE] -[PRG] -[FILEPATH] -[DELAY]0 -[CD TRACK]0 -[COMMENT] -[END INFORMATION] -[SUBTITLE] -[COLF]&H000000,[STYLE]bd,[SIZE]25,[FONT]Arial -"; - //00:00:06.61,00:00:13.75 - //text1[br]text2 - var sb = new StringBuilder(); - if (subtitle.Header != null && subtitle.Header.Contains("[INFORMATION]")) - { - sb.AppendLine(subtitle.Header); - } - else - { - sb.AppendFormat(header, title); - } - foreach (Paragraph p in subtitle.Paragraphs) - { - string text = p.Text.Replace(Environment.NewLine, "[br]"); - text = text.Replace("", "{\\i1}"); - text = text.Replace("", "{\\i0}"); - text = text.Replace("", "{\\b1}"); - text = text.Replace("", "{\\b0}"); - text = text.Replace("", "{\\u1}"); - text = text.Replace("", "{\\u0}"); - - sb.AppendLine(string.Format(paragraphWriteFormat, - p.StartTime.Hours, - p.StartTime.Minutes, - p.StartTime.Seconds, - RoundTo2Cifres(p.StartTime.Milliseconds), - p.EndTime.Hours, - p.EndTime.Minutes, - p.EndTime.Seconds, - RoundTo2Cifres(p.EndTime.Milliseconds), - Environment.NewLine, - text)); - sb.AppendLine(); - } - return sb.ToString().Trim(); - } - - private static int RoundTo2Cifres(int milliseconds) - { - return (int)Math.Round(milliseconds / 10.0); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - var paragraph = new Paragraph(); - var expecting = ExpectingLine.TimeCodes; - _errorCount = 0; - char[] splitChars = { ':', ',', '.' }; - subtitle.Paragraphs.Clear(); - var header = new StringBuilder(); - foreach (string line in lines) - { - if (subtitle.Paragraphs.Count == 0 && expecting == ExpectingLine.TimeCodes && line.StartsWith("[", StringComparison.Ordinal)) - { - header.AppendLine(line); - } - else if (line.Length > 20 && char.IsDigit(line[0]) && RegexTimeCodes.IsMatch(line)) - { - var parts = line.Split(splitChars, StringSplitOptions.RemoveEmptyEntries); - if (parts.Length == 8) - { - try - { - paragraph.StartTime = DecodeTimeCode(parts, 0); - paragraph.EndTime = DecodeTimeCode(parts, 4); - expecting = ExpectingLine.Text; - } - catch - { - _errorCount++; - expecting = ExpectingLine.TimeCodes; - } - } - } - else if (expecting == ExpectingLine.Text && line.Length > 0) - { - string text = line.Replace("[br]", Environment.NewLine); - if (text.Contains("{\\", StringComparison.Ordinal)) - { - text = text.Replace("{\\i1}", ""); - text = text.Replace("{\\i0}", ""); - text = text.Replace("{\\i}", ""); - text = text.Replace("{\\b1}", ""); - text = text.Replace("{\\b0}", ""); - text = text.Replace("{\\b}", ""); - text = text.Replace("{\\u1}", ""); - text = text.Replace("{\\u0}", ""); - text = text.Replace("{\\u}", ""); - } - paragraph.Text = text; - subtitle.Paragraphs.Add(paragraph); - paragraph = new Paragraph(); - expecting = ExpectingLine.TimeCodes; - } - } - subtitle.Renumber(); - if (header.ToString().Contains("[INFORMATION]")) - { - subtitle.Header = header.ToString().TrimEnd(); - } - } - - public static TimeCode DecodeTimeCode(string[] encodedTimeCode, int index) - { - // Hours, Minutes, Seconds, Milliseconds / 10. - return new TimeCode(int.Parse(encodedTimeCode[index]), - int.Parse(encodedTimeCode[index + 1]), - int.Parse(encodedTimeCode[index + 2]), - int.Parse(encodedTimeCode[index + 3]) * 10); - } - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class SubViewer20 : SubtitleFormat + { + private enum ExpectingLine + { + TimeCodes, + Text + } + + private static readonly Regex RegexTimeCodes = new Regex(@"^\d\d:\d\d:\d\d.\d+,\d\d:\d\d:\d\d.\d+$", RegexOptions.Compiled); + + public override string Extension => ".sub"; + + public override string Name => "SubViewer 2.0"; + + public override bool IsMine(List lines, string fileName) + { + var sbv = new YouTubeSbv(); + if (sbv.IsMine(lines, fileName) && !string.Join(string.Empty, lines.ToArray()).Contains("[br]")) + { + return false; + } + + return base.IsMine(lines, fileName); + } + + public override string ToText(Subtitle subtitle, string title) + { + const string paragraphWriteFormat = "{0:00}:{1:00}:{2:00}.{3:00},{4:00}:{5:00}:{6:00}.{7:00}{8}{9}"; + const string header = @"[INFORMATION] +[TITLE]{0} +[AUTHOR] +[SOURCE] +[PRG] +[FILEPATH] +[DELAY]0 +[CD TRACK]0 +[COMMENT] +[END INFORMATION] +[SUBTITLE] +[COLF]&H000000,[STYLE]bd,[SIZE]25,[FONT]Arial +"; + //00:00:06.61,00:00:13.75 + //text1[br]text2 + var sb = new StringBuilder(); + if (subtitle.Header != null && subtitle.Header.Contains("[INFORMATION]")) + { + sb.AppendLine(subtitle.Header); + } + else + { + sb.AppendFormat(header, title); + } + foreach (Paragraph p in subtitle.Paragraphs) + { + string text = p.Text.Replace(Environment.NewLine, "[br]"); + text = text.Replace("", "{\\i1}"); + text = text.Replace("", "{\\i0}"); + text = text.Replace("", "{\\b1}"); + text = text.Replace("", "{\\b0}"); + text = text.Replace("", "{\\u1}"); + text = text.Replace("", "{\\u0}"); + + sb.AppendLine(string.Format(paragraphWriteFormat, + p.StartTime.Hours, + p.StartTime.Minutes, + p.StartTime.Seconds, + RoundTo2Cifres(p.StartTime.Milliseconds), + p.EndTime.Hours, + p.EndTime.Minutes, + p.EndTime.Seconds, + RoundTo2Cifres(p.EndTime.Milliseconds), + Environment.NewLine, + text)); + sb.AppendLine(); + } + return sb.ToString().Trim(); + } + + private static int RoundTo2Cifres(int milliseconds) + { + return (int)Math.Round(milliseconds / 10.0); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + var paragraph = new Paragraph(); + var expecting = ExpectingLine.TimeCodes; + _errorCount = 0; + char[] splitChars = { ':', ',', '.' }; + subtitle.Paragraphs.Clear(); + var header = new StringBuilder(); + foreach (string line in lines) + { + if (subtitle.Paragraphs.Count == 0 && expecting == ExpectingLine.TimeCodes && line.StartsWith("[", StringComparison.Ordinal)) + { + header.AppendLine(line); + } + else if (line.Length > 20 && char.IsDigit(line[0]) && RegexTimeCodes.IsMatch(line)) + { + var parts = line.Split(splitChars, StringSplitOptions.RemoveEmptyEntries); + if (parts.Length == 8) + { + try + { + paragraph.StartTime = DecodeTimeCode(parts, 0); + paragraph.EndTime = DecodeTimeCode(parts, 4); + expecting = ExpectingLine.Text; + } + catch + { + _errorCount++; + expecting = ExpectingLine.TimeCodes; + } + } + } + else if (expecting == ExpectingLine.Text && line.Length > 0) + { + string text = line.Replace("[br]", Environment.NewLine); + if (text.Contains("{\\", StringComparison.Ordinal)) + { + text = text.Replace("{\\i1}", ""); + text = text.Replace("{\\i0}", ""); + text = text.Replace("{\\i}", ""); + text = text.Replace("{\\b1}", ""); + text = text.Replace("{\\b0}", ""); + text = text.Replace("{\\b}", ""); + text = text.Replace("{\\u1}", ""); + text = text.Replace("{\\u0}", ""); + text = text.Replace("{\\u}", ""); + } + paragraph.Text = text; + subtitle.Paragraphs.Add(paragraph); + paragraph = new Paragraph(); + expecting = ExpectingLine.TimeCodes; + } + } + subtitle.Renumber(); + if (header.ToString().Contains("[INFORMATION]")) + { + subtitle.Header = header.ToString().TrimEnd(); + } + } + + public static TimeCode DecodeTimeCode(string[] encodedTimeCode, int index) + { + // Hours, Minutes, Seconds, Milliseconds / 10. + return new TimeCode(int.Parse(encodedTimeCode[index]), + int.Parse(encodedTimeCode[index + 1]), + int.Parse(encodedTimeCode[index + 2]), + int.Parse(encodedTimeCode[index + 3]) * 10); + } + } +} diff --git a/libse/SubtitleFormats/SubtitleEditorProject.cs b/src/libse/SubtitleFormats/SubtitleEditorProject.cs similarity index 97% rename from libse/SubtitleFormats/SubtitleEditorProject.cs rename to src/libse/SubtitleFormats/SubtitleEditorProject.cs index 803f18859..619f366fc 100644 --- a/libse/SubtitleFormats/SubtitleEditorProject.cs +++ b/src/libse/SubtitleFormats/SubtitleEditorProject.cs @@ -1,158 +1,158 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Text; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class SubtitleEditorProject : SubtitleFormat - { - public override string Extension => ".xml"; - - public override string Name => "Subtitle Editor Project"; - - public override bool IsMine(List lines, string fileName) - { - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - string xmlAsString = sb.ToString().Trim(); - if (xmlAsString.Contains(" 0; - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine(ex.Message); - return false; - } - } - return false; - } - - public override string ToText(Subtitle subtitle, string title) - { - string xmlStructure = - "" + Environment.NewLine + - "" + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - ""; - - var xml = new XmlDocument(); - xml.LoadXml(xmlStructure); - - // - XmlNode div = xml.DocumentElement.SelectSingleNode("subtitles"); - foreach (Paragraph p in subtitle.Paragraphs) - { - XmlNode paragraph = xml.CreateElement("subtitle"); - - XmlAttribute duration = xml.CreateAttribute("duration"); - duration.InnerText = ((int)Math.Round(p.Duration.TotalMilliseconds)).ToString(CultureInfo.InvariantCulture); - paragraph.Attributes.Append(duration); - - XmlAttribute effect = xml.CreateAttribute("effect"); - effect.InnerText = string.Empty; - paragraph.Attributes.Append(effect); - - XmlAttribute end = xml.CreateAttribute("end"); - end.InnerText = ((int)Math.Round(p.EndTime.TotalMilliseconds)).ToString(CultureInfo.InvariantCulture); - paragraph.Attributes.Append(end); - - XmlAttribute layer = xml.CreateAttribute("layer"); - layer.InnerText = "0"; - paragraph.Attributes.Append(layer); - - XmlAttribute marginL = xml.CreateAttribute("margin-l"); - marginL.InnerText = "0"; - paragraph.Attributes.Append(marginL); - - XmlAttribute marginR = xml.CreateAttribute("margin-r"); - marginR.InnerText = "0"; - paragraph.Attributes.Append(marginR); - - XmlAttribute marginV = xml.CreateAttribute("margin-v"); - marginV.InnerText = "0"; - paragraph.Attributes.Append(marginV); - - XmlAttribute name = xml.CreateAttribute("name"); - name.InnerText = string.Empty; - paragraph.Attributes.Append(name); - - XmlAttribute note = xml.CreateAttribute("note"); - note.InnerText = string.Empty; - paragraph.Attributes.Append(note); - - XmlAttribute path = xml.CreateAttribute("path"); - path.InnerText = "0"; - paragraph.Attributes.Append(path); - - XmlAttribute start = xml.CreateAttribute("start"); - start.InnerText = ((int)Math.Round(p.StartTime.TotalMilliseconds)).ToString(CultureInfo.InvariantCulture); - paragraph.Attributes.Append(start); - - XmlAttribute style = xml.CreateAttribute("style"); - style.InnerText = "Default"; - paragraph.Attributes.Append(style); - - string text = HtmlUtil.RemoveHtmlTags(p.Text); - XmlAttribute textNode = xml.CreateAttribute("text"); - textNode.InnerText = text; - paragraph.Attributes.Append(textNode); - - XmlAttribute translation = xml.CreateAttribute("translation"); - translation.InnerText = string.Empty; - paragraph.Attributes.Append(translation); - - div.AppendChild(paragraph); - } - - return ToUtf8XmlString(xml); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - var xml = new XmlDocument { XmlResolver = null }; - xml.LoadXml(sb.ToString().Trim()); - - XmlNode div = xml.DocumentElement.SelectSingleNode("subtitles"); - foreach (XmlNode node in div.ChildNodes) - { - try - { - // - var p = new Paragraph { StartTime = { TotalMilliseconds = int.Parse(node.Attributes["start"].Value) } }; - p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + int.Parse(node.Attributes["duration"].Value); - p.Text = node.Attributes["text"].Value; - - subtitle.Paragraphs.Add(p); - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine(ex.Message); - _errorCount++; - } - } - subtitle.Renumber(); - } - - } -} +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class SubtitleEditorProject : SubtitleFormat + { + public override string Extension => ".xml"; + + public override string Name => "Subtitle Editor Project"; + + public override bool IsMine(List lines, string fileName) + { + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + string xmlAsString = sb.ToString().Trim(); + if (xmlAsString.Contains(" 0; + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine(ex.Message); + return false; + } + } + return false; + } + + public override string ToText(Subtitle subtitle, string title) + { + string xmlStructure = + "" + Environment.NewLine + + "" + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + ""; + + var xml = new XmlDocument(); + xml.LoadXml(xmlStructure); + + // + XmlNode div = xml.DocumentElement.SelectSingleNode("subtitles"); + foreach (Paragraph p in subtitle.Paragraphs) + { + XmlNode paragraph = xml.CreateElement("subtitle"); + + XmlAttribute duration = xml.CreateAttribute("duration"); + duration.InnerText = ((int)Math.Round(p.Duration.TotalMilliseconds)).ToString(CultureInfo.InvariantCulture); + paragraph.Attributes.Append(duration); + + XmlAttribute effect = xml.CreateAttribute("effect"); + effect.InnerText = string.Empty; + paragraph.Attributes.Append(effect); + + XmlAttribute end = xml.CreateAttribute("end"); + end.InnerText = ((int)Math.Round(p.EndTime.TotalMilliseconds)).ToString(CultureInfo.InvariantCulture); + paragraph.Attributes.Append(end); + + XmlAttribute layer = xml.CreateAttribute("layer"); + layer.InnerText = "0"; + paragraph.Attributes.Append(layer); + + XmlAttribute marginL = xml.CreateAttribute("margin-l"); + marginL.InnerText = "0"; + paragraph.Attributes.Append(marginL); + + XmlAttribute marginR = xml.CreateAttribute("margin-r"); + marginR.InnerText = "0"; + paragraph.Attributes.Append(marginR); + + XmlAttribute marginV = xml.CreateAttribute("margin-v"); + marginV.InnerText = "0"; + paragraph.Attributes.Append(marginV); + + XmlAttribute name = xml.CreateAttribute("name"); + name.InnerText = string.Empty; + paragraph.Attributes.Append(name); + + XmlAttribute note = xml.CreateAttribute("note"); + note.InnerText = string.Empty; + paragraph.Attributes.Append(note); + + XmlAttribute path = xml.CreateAttribute("path"); + path.InnerText = "0"; + paragraph.Attributes.Append(path); + + XmlAttribute start = xml.CreateAttribute("start"); + start.InnerText = ((int)Math.Round(p.StartTime.TotalMilliseconds)).ToString(CultureInfo.InvariantCulture); + paragraph.Attributes.Append(start); + + XmlAttribute style = xml.CreateAttribute("style"); + style.InnerText = "Default"; + paragraph.Attributes.Append(style); + + string text = HtmlUtil.RemoveHtmlTags(p.Text); + XmlAttribute textNode = xml.CreateAttribute("text"); + textNode.InnerText = text; + paragraph.Attributes.Append(textNode); + + XmlAttribute translation = xml.CreateAttribute("translation"); + translation.InnerText = string.Empty; + paragraph.Attributes.Append(translation); + + div.AppendChild(paragraph); + } + + return ToUtf8XmlString(xml); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + var xml = new XmlDocument { XmlResolver = null }; + xml.LoadXml(sb.ToString().Trim()); + + XmlNode div = xml.DocumentElement.SelectSingleNode("subtitles"); + foreach (XmlNode node in div.ChildNodes) + { + try + { + // + var p = new Paragraph { StartTime = { TotalMilliseconds = int.Parse(node.Attributes["start"].Value) } }; + p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + int.Parse(node.Attributes["duration"].Value); + p.Text = node.Attributes["text"].Value; + + subtitle.Paragraphs.Add(p); + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine(ex.Message); + _errorCount++; + } + } + subtitle.Renumber(); + } + + } +} diff --git a/libse/SubtitleFormats/SubtitleFormat.cs b/src/libse/SubtitleFormats/SubtitleFormat.cs similarity index 97% rename from libse/SubtitleFormats/SubtitleFormat.cs rename to src/libse/SubtitleFormats/SubtitleFormat.cs index 1eb25b1f6..2d0035207 100644 --- a/libse/SubtitleFormats/SubtitleFormat.cs +++ b/src/libse/SubtitleFormats/SubtitleFormat.cs @@ -1,661 +1,661 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; -using Nikse.SubtitleEdit.Core.Interfaces; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public abstract class SubtitleFormat - { - private static IList _allSubtitleFormats; - - protected static readonly char[] SplitCharColon = { ':' }; - - /// - /// Text formats supported by Subtitle Edit - /// - public static IEnumerable AllSubtitleFormats - { - get - { - if (_allSubtitleFormats != null) - { - return _allSubtitleFormats; - } - - _allSubtitleFormats = new List - { - new SubRip(), - new AbcIViewer(), - new AdobeAfterEffectsFTME(), - new AdobeEncore(), - new AdobeEncoreLineTabNewLine(), - new AdobeEncoreTabs(), - new AdobeEncoreWithLineNumbers(), - new AdobeEncoreWithLineNumbersNtsc(), - new AdvancedSubStationAlpha(), - new AQTitle(), - new AvidCaption(), - new AvidDvd(), - new AwsTranscribeJson(), - new BelleNuitSubtitler(), - new Bilibili(), - new Cappella(), - new CaptionAssistant(), - new Captionate(), - new CaptionateMs(), - new CaraokeXml(), - new Csv(), - new Csv2(), - new Csv3(), - new Csv4(), - new Csv5(), - new CsvNuendo(), - new DCinemaInterop(), - new DCinemaSmpte2007(), - new DCinemaSmpte2010(), - new DCinemaSmpte2014(), - new DigiBeta(), - new DvdStudioPro(), - new DvdStudioProSpaceOne(), - new DvdStudioProSpaceOneSemicolon(), - new DvdStudioProSpace(), - new DvdSubtitle(), - new DvdSubtitleSystem(), - new DvSubtitle(), - new Ebu(), - new Edl(), - new Eeg708(), - new ElrPrint(), - new ESubXf(), - new F4Text(), - new EZTSubtitlesProject(), - new F4Rtf(), - new F4Xml(), - new FabSubtitler(), - new FilmEditXml(), - new FinalCutProXml(), - new FinalCutProXXml(), - new FinalCutProXmlGap(), - new FinalCutProXCM(), - new FinalCutProXml13(), - new FinalCutProXml14(), - new FinalCutProXml14Text(), - new FinalCutProXml15(), - new FinalCutProXml16(), - new FinalCutProXml17(), - new FinalCutProXml18(), - new FinalCutProTestXml(), - new FinalCutProTest2Xml(), - new FlashXml(), - new FLVCoreCuePoints(), - new Footage(), - new GooglePlayJson(), - new GpacTtxt(), - new Gremots(), - new HollyStarJson(), - new ImageLogicAutocaption(), - new InqScribe(), - new IssXml(), - new ItunesTimedText(), - new JacoSub(), - new JsonTed(), - new Json(), - new JsonType2(), - new JsonType3(), - new JsonType4(), - new JsonType5(), - new JsonType6(), - new JsonType7(), - new JsonType8(), - new JsonType8b(), - new JsonType9(), - new JsonType10(), - new JsonType11(), - new JsonType12(), - new JsonType13(), - new JsonType14(), - new JsonType15(), - new JsonType16(), - new JsonType17(), - new JsonType18(), - new KanopyHtml(), - new LambdaCap(), - new Lrc(), - new MacSub(), - new MediaTransData(), - new MicroDvd(), - new MidwayInscriberCGX(), - new MPlayer2(), - new MsOfficeWorkbook(), - new NciTimedRollUpCaptions(), - new NetflixImsc11Japanese(), - new NetflixTimedText(), - new OgmChapters(), - new OpenDvt(), - new Oresme(), - new OresmeDocXDocument(), - new OtterAi(), - new Pe2(), - new PhoenixSubtitle(), - new PinnacleImpression(), - new PListCaption(), - new ProjectionSubtitleList(), - new QubeMasterImport(), - new QuickTimeText(), - new RealTime(), - new RhozetHarmonic(), - new Rtf1(), - new Rtf2(), - new Sami(), - new SamiAvDicPlayer(), - new SamiModern(), - new SamiYouTube(), - new Scenarist(), - new ScenaristClosedCaptions(), - new ScenaristClosedCaptionsDropFrame(), - new SmilTimesheetData(), - new SmpteTt2052(), - new SoftNiSub(), - new SoftNicolonSub(), - new SonyDVDArchitect(), - new SonyDVDArchitectExplicitDuration(), - new SonyDVDArchitectLineAndDuration(), - new SonyDVDArchitectLineDurationLength(), - new SonyDVDArchitectTabs(), - new SonyDVDArchitectWithLineNumbers(), - new Speechmatics(), - new Spruce(), - new SpruceWithSpace(), - new StructuredTitles(), - new SubStationAlpha(), - new SubtitleEditorProject(), - new SubUrbia(), - new SubViewer10(), - new SubViewer20(), - new SwiftInterchange2(), - new SwiftText(), - new SwiftTextLineNumber(), - new SwiftTextLineNOAndDur(), - new Tek(), - new TimeXml(), - new TimeXml2(), - new TimedText10(), - new TimedText200604(), - new TimedText200604CData(), - new TimedText200604Ooyala(), - new TimedText(), - new TitleExchangePro(), - new Titra(), - new TmpegEncText(), - new TmpegEncAW5(), - new TmpegEncXml(), - new TMPlayer(), - new TranscriberXml(), - new Tmx14(), - new TurboTitler(), - new TwentyThreeJson(), - new TwentyThreeJsonEmbed(), - new TwentyThreeJsonEmbedWebSrt(), - new UniversalSubtitleFormat(), - new UTSubtitleXml(), - new Utx(), - new UtxFrames(), - new UleadSubtitleFormat(), - new VocapiaSplit(), - new WebVTT(), - new WebVTTFileWithLineNumber(), - new Xif(), - new Xmp(), - new YouTubeAnnotations(), - new YouTubeSbv(), - new YouTubeTranscript(), - new YouTubeTranscriptOneLine(), - new ZeroG(), - // new Idx(), - new UnknownSubtitle1(), - new UnknownSubtitle2(), - new UnknownSubtitle3(), - new UnknownSubtitle4(), - new UnknownSubtitle5(), - new UnknownSubtitle6(), - new UnknownSubtitle7(), - new UnknownSubtitle8(), - new UnknownSubtitle9(), - new UnknownSubtitle10(), - new UnknownSubtitle11(), - new UnknownSubtitle12(), - new UnknownSubtitle13(), - new UnknownSubtitle14(), - new UnknownSubtitle15(), - new UnknownSubtitle16(), - new UnknownSubtitle17(), - new UnknownSubtitle18(), - new UnknownSubtitle19(), - new UnknownSubtitle20(), - new UnknownSubtitle21(), - new UnknownSubtitle22(), - new UnknownSubtitle23(), - new UnknownSubtitle24(), - new UnknownSubtitle25(), - new UnknownSubtitle26(), - new UnknownSubtitle27(), - new UnknownSubtitle28(), - new UnknownSubtitle29(), - new UnknownSubtitle30(), - new UnknownSubtitle31(), - new UnknownSubtitle32(), - new UnknownSubtitle33(), - new UnknownSubtitle34(), - new UnknownSubtitle35(), - new UnknownSubtitle36(), - new UnknownSubtitle37(), - new UnknownSubtitle38(), - new UnknownSubtitle39(), - new UnknownSubtitle40(), - new UnknownSubtitle41(), - new UnknownSubtitle42(), - new UnknownSubtitle43(), - new UnknownSubtitle44(), - new UnknownSubtitle45(), - new UnknownSubtitle46(), - new UnknownSubtitle47(), - new UnknownSubtitle48(), - new UnknownSubtitle49(), - new UnknownSubtitle50(), - new UnknownSubtitle51(), - new UnknownSubtitle52(), - new UnknownSubtitle53(), - new UnknownSubtitle54(), - new UnknownSubtitle55(), - new UnknownSubtitle56(), - new UnknownSubtitle57(), - new UnknownSubtitle58(), - new UnknownSubtitle59(), - new UnknownSubtitle60(), - new UnknownSubtitle61(), - new UnknownSubtitle62(), - new UnknownSubtitle63(), - new UnknownSubtitle64(), - new UnknownSubtitle65(), - new UnknownSubtitle66(), - new UnknownSubtitle67(), - new UnknownSubtitle68(), - new UnknownSubtitle69(), - new UnknownSubtitle70(), - new UnknownSubtitle71(), - new UnknownSubtitle72(), - new UnknownSubtitle73(), - new UnknownSubtitle74(), - new UnknownSubtitle75(), - new UnknownSubtitle76(), - new UnknownSubtitle77(), - new UnknownSubtitle78(), - new UnknownSubtitle79(), - new UnknownSubtitle80(), - new UnknownSubtitle81(), - new UnknownSubtitle82(), - new UnknownSubtitle83(), - new UnknownSubtitle84(), - new UnknownSubtitle85(), - new UnknownSubtitle86(), - new UnknownSubtitle87(), - new UnknownSubtitle88(), - new UnknownSubtitle89(), - new UnknownSubtitle90(), - new UnknownSubtitle91(), - new UnknownSubtitle92(), - new UnknownSubtitle93(), - new UnknownSubtitle94(), - new UnknownSubtitle95(), - new UnknownSubtitle96(), - new UnknownSubtitle97(), - new UnknownSubtitle98(), - new UnknownSubtitle99(), - new UnknownSubtitle100(), - new UnknownSubtitle101(), - }; - - string path = Configuration.PluginsDirectory; - if (Directory.Exists(path)) - { - foreach (string pluginFileName in Directory.EnumerateFiles(path, "*.DLL")) - { - try - { - var assembly = System.Reflection.Assembly.Load(FileUtil.ReadAllBytesShared(pluginFileName)); - foreach (var exportedType in assembly.GetExportedTypes()) - { - try - { - object pluginObject = Activator.CreateInstance(exportedType); - if (pluginObject is SubtitleFormat po) - { - _allSubtitleFormats.Insert(1, po); - } - } - catch - { - // ignored - } - } - } - catch - { - // ignored - } - } - } - - return _allSubtitleFormats; - } - } - - protected int _errorCount; - - public abstract string Extension - { - get; - } - - public abstract string Name - { - get; - } - - public virtual bool IsTimeBased => true; - - public bool IsFrameBased => !IsTimeBased; - - public string FriendlyName => $"{Name} ({Extension})"; - - public int ErrorCount => _errorCount; - - public virtual bool IsMine(List lines, string fileName) - { - var subtitle = new Subtitle(); - var oldFrameRate = Configuration.Settings.General.CurrentFrameRate; - LoadSubtitle(subtitle, lines, fileName); - Configuration.Settings.General.CurrentFrameRate = oldFrameRate; - return subtitle.Paragraphs.Count > _errorCount; - } - - public abstract string ToText(Subtitle subtitle, string title); - - public abstract void LoadSubtitle(Subtitle subtitle, List lines, string fileName); - - public bool IsVobSubIndexFile => Extension.Equals(".idx", StringComparison.Ordinal); - - public virtual void RemoveNativeFormatting(Subtitle subtitle, SubtitleFormat newFormat) - { - } - - public virtual List AlternateExtensions => new List(); - - public static int MillisecondsToFrames(double milliseconds) - { - return MillisecondsToFrames(milliseconds, Configuration.Settings.General.CurrentFrameRate); - } - - public static int MillisecondsToFrames(double milliseconds, double frameRate) - { - return (int)Math.Round(milliseconds / (TimeCode.BaseUnit / GetFrameForCalculation(frameRate))); - } - - public static double GetFrameForCalculation(double frameRate) - { - if (Math.Abs(frameRate - 23.976) < 0.01) - { - return 24000.0 / 1001.0; - } - if (Math.Abs(frameRate - 29.97) < 0.01) - { - return 30000.0 / 1001.0; - } - if (Math.Abs(frameRate - 59.94) < 0.01) - { - return 60000.0 / 1001.0; - } - - return frameRate; - } - - public static int MillisecondsToFramesMaxFrameRate(double milliseconds) - { - int frames = (int)Math.Round(milliseconds / (TimeCode.BaseUnit / GetFrameForCalculation(Configuration.Settings.General.CurrentFrameRate))); - if (frames >= Configuration.Settings.General.CurrentFrameRate) - { - frames = (int)(Configuration.Settings.General.CurrentFrameRate - 0.01); - } - - return frames; - } - - public static int FramesToMilliseconds(double frames) - { - return (int)Math.Round(frames * (TimeCode.BaseUnit / GetFrameForCalculation(Configuration.Settings.General.CurrentFrameRate))); - } - - public static int FramesToMillisecondsMax999(double frames) - { - int ms = (int)Math.Round(frames * (TimeCode.BaseUnit / GetFrameForCalculation(Configuration.Settings.General.CurrentFrameRate))); - return Math.Min(ms, 999); - } - - public virtual bool HasStyleSupport => false; - - public bool BatchMode { get; set; } - public double? BatchSourceFrameRate { get; set; } - - public static string ToUtf8XmlString(XmlDocument xml, bool omitXmlDeclaration = false) - { - var settings = new XmlWriterSettings - { - Indent = true, - OmitXmlDeclaration = omitXmlDeclaration, - }; - var result = new StringBuilder(); - - using (var xmlWriter = XmlWriter.Create(result, settings)) - { - xml.Save(xmlWriter); - } - - return result.ToString().Replace(" encoding=\"utf-16\"", " encoding=\"utf-8\"").Trim(); - } - - public virtual bool IsTextBased => true; - - protected static TimeCode DecodeTimeCodeFramesTwoParts(string[] tokens) - { - if (tokens == null) - { - return new TimeCode(); - } - - if (tokens.Length != 2) - { - throw new InvalidOperationException(); - } - - return new TimeCode(0, 0, int.Parse(tokens[0]), FramesToMillisecondsMax999(int.Parse(tokens[1]))); - } - - protected static TimeCode DecodeTimeCodeFramesFourParts(string[] tokens) - { - if (tokens == null) - { - return new TimeCode(); - } - - if (tokens.Length != 4) - { - throw new InvalidOperationException(); - } - - return new TimeCode(int.Parse(tokens[0]), int.Parse(tokens[1]), int.Parse(tokens[2]), FramesToMillisecondsMax999(int.Parse(tokens[3]))); - } - - protected static TimeCode DecodeTimeCodeMsFourParts(string[] tokens) - { - if (tokens == null) - { - return new TimeCode(); - } - - if (tokens.Length != 4) - { - throw new InvalidOperationException(); - } - - return new TimeCode(int.Parse(tokens[0]), int.Parse(tokens[1]), int.Parse(tokens[2]), int.Parse(tokens[3])); - } - - protected static TimeCode DecodeTimeCodeFrames(string timestamp, char[] splitChars) - { - return DecodeTimeCodeFramesFourParts(timestamp.Split(splitChars, StringSplitOptions.RemoveEmptyEntries)); - } - - /// - /// Load subtitle type of 'formats' from file. - /// - /// List of possible formats - /// Name of subtitle file - /// Subtitle to load file into - /// The format of the file, null of not format match found - public static SubtitleFormat LoadSubtitleFromFile(SubtitleFormat[] formats, string fileName, Subtitle subtitle) - { - if (formats == null || formats.Length == 0 || string.IsNullOrEmpty(fileName)) - { - return null; - } - - var list = new List(File.ReadAllLines(fileName, LanguageAutoDetect.GetEncodingFromFile(fileName))); - foreach (var subtitleFormat in formats) - { - if (subtitleFormat.IsMine(list, fileName)) - { - subtitleFormat.LoadSubtitle(subtitle, list, fileName); - return subtitleFormat; - } - } - return null; - } - - /// - /// Load subtitle from a list of lines and a file name (the last can be null). - /// - /// Text lines from subtitle file - /// Optional file name - /// Subtitle, null if format not recognized - public static Subtitle LoadSubtitleFromLines(List lines, string fileName) - { - if (lines == null || lines.Count == 0) - { - return null; - } - - var subtitle = new Subtitle(); - foreach (var subtitleFormat in AllSubtitleFormats) - { - if (subtitleFormat.IsMine(lines, fileName)) - { - subtitleFormat.LoadSubtitle(subtitle, lines, fileName); - return subtitle; - } - } - - return null; - } - - public static SubtitleFormat[] GetBinaryFormats(bool batchMode) - { - return new SubtitleFormat[] - { - new Ebu { BatchMode = batchMode }, - new Pac { BatchMode = batchMode }, - new PacUnicode(), - new Cavena890 { BatchMode = batchMode }, - new Spt(), - new CheetahCaption(), - new CheetahCaptionOld(), - new TSB4(), - new Chk(), - new Ayato(), - new CapMakerPlus(), - new Ultech130(), - new NciCaption(), - new AvidStl(), - new WinCaps32(), - new IsmtDfxp(), - new Cavena890(), - new Spt(), - new Sptx(), - new IaiSub(), - new ELRStudioClosedCaption(), - new CaptionsInc(), - new TimeLineMvt(), - new Cmaft(), - new Pns(), - new PlayCaptionsFreeEditor(), - }; - } - - public static SubtitleFormat[] GetTextOtherFormats() - { - return new SubtitleFormat[] - { - new DlDd(), - new Ted20(), - new Captionate(), - new TimeLineAscii(), - new TimeLineFootageAscii(), - new TimedTextImage(), - new FinalCutProImage(), - new SpuImage(), - new Dost(), - new SeImageHtmlIndex(), - new BdnXml(), - new Wsb(), - new JsonTypeOnlyLoad1(), - new TranscriptiveJson(), - new KaraokeCdgCreatorText(), - new VidIcelandic(), - }; - } - - public static SubtitleFormat FromName(string formatName, SubtitleFormat defaultFormat) - { - string trimmedFormatName = formatName.Trim(); - foreach (var format in AllSubtitleFormats) - { - if (format.Name.Trim().Equals(trimmedFormatName, StringComparison.OrdinalIgnoreCase) || - format.FriendlyName.Trim().Equals(trimmedFormatName, StringComparison.OrdinalIgnoreCase)) - { - return format; - } - } - - return defaultFormat; - } - - public static SubtitleFormat BinaryPersistableFromName(string formatName, bool batchMode) - { - string trimmedFormatName = formatName.Trim(); - foreach (var format in GetBinaryFormats(batchMode)) - { - if (format is IBinaryPersistableSubtitle && - format.Name.Trim().Equals(trimmedFormatName, StringComparison.OrdinalIgnoreCase) || - format.FriendlyName.Trim().Equals(trimmedFormatName, StringComparison.OrdinalIgnoreCase)) - { - return format; - } - } - - return null; - } - } -} +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Interfaces; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public abstract class SubtitleFormat + { + private static IList _allSubtitleFormats; + + protected static readonly char[] SplitCharColon = { ':' }; + + /// + /// Text formats supported by Subtitle Edit + /// + public static IEnumerable AllSubtitleFormats + { + get + { + if (_allSubtitleFormats != null) + { + return _allSubtitleFormats; + } + + _allSubtitleFormats = new List + { + new SubRip(), + new AbcIViewer(), + new AdobeAfterEffectsFTME(), + new AdobeEncore(), + new AdobeEncoreLineTabNewLine(), + new AdobeEncoreTabs(), + new AdobeEncoreWithLineNumbers(), + new AdobeEncoreWithLineNumbersNtsc(), + new AdvancedSubStationAlpha(), + new AQTitle(), + new AvidCaption(), + new AvidDvd(), + new AwsTranscribeJson(), + new BelleNuitSubtitler(), + new Bilibili(), + new Cappella(), + new CaptionAssistant(), + new Captionate(), + new CaptionateMs(), + new CaraokeXml(), + new Csv(), + new Csv2(), + new Csv3(), + new Csv4(), + new Csv5(), + new CsvNuendo(), + new DCinemaInterop(), + new DCinemaSmpte2007(), + new DCinemaSmpte2010(), + new DCinemaSmpte2014(), + new DigiBeta(), + new DvdStudioPro(), + new DvdStudioProSpaceOne(), + new DvdStudioProSpaceOneSemicolon(), + new DvdStudioProSpace(), + new DvdSubtitle(), + new DvdSubtitleSystem(), + new DvSubtitle(), + new Ebu(), + new Edl(), + new Eeg708(), + new ElrPrint(), + new ESubXf(), + new F4Text(), + new EZTSubtitlesProject(), + new F4Rtf(), + new F4Xml(), + new FabSubtitler(), + new FilmEditXml(), + new FinalCutProXml(), + new FinalCutProXXml(), + new FinalCutProXmlGap(), + new FinalCutProXCM(), + new FinalCutProXml13(), + new FinalCutProXml14(), + new FinalCutProXml14Text(), + new FinalCutProXml15(), + new FinalCutProXml16(), + new FinalCutProXml17(), + new FinalCutProXml18(), + new FinalCutProTestXml(), + new FinalCutProTest2Xml(), + new FlashXml(), + new FLVCoreCuePoints(), + new Footage(), + new GooglePlayJson(), + new GpacTtxt(), + new Gremots(), + new HollyStarJson(), + new ImageLogicAutocaption(), + new InqScribe(), + new IssXml(), + new ItunesTimedText(), + new JacoSub(), + new JsonTed(), + new Json(), + new JsonType2(), + new JsonType3(), + new JsonType4(), + new JsonType5(), + new JsonType6(), + new JsonType7(), + new JsonType8(), + new JsonType8b(), + new JsonType9(), + new JsonType10(), + new JsonType11(), + new JsonType12(), + new JsonType13(), + new JsonType14(), + new JsonType15(), + new JsonType16(), + new JsonType17(), + new JsonType18(), + new KanopyHtml(), + new LambdaCap(), + new Lrc(), + new MacSub(), + new MediaTransData(), + new MicroDvd(), + new MidwayInscriberCGX(), + new MPlayer2(), + new MsOfficeWorkbook(), + new NciTimedRollUpCaptions(), + new NetflixImsc11Japanese(), + new NetflixTimedText(), + new OgmChapters(), + new OpenDvt(), + new Oresme(), + new OresmeDocXDocument(), + new OtterAi(), + new Pe2(), + new PhoenixSubtitle(), + new PinnacleImpression(), + new PListCaption(), + new ProjectionSubtitleList(), + new QubeMasterImport(), + new QuickTimeText(), + new RealTime(), + new RhozetHarmonic(), + new Rtf1(), + new Rtf2(), + new Sami(), + new SamiAvDicPlayer(), + new SamiModern(), + new SamiYouTube(), + new Scenarist(), + new ScenaristClosedCaptions(), + new ScenaristClosedCaptionsDropFrame(), + new SmilTimesheetData(), + new SmpteTt2052(), + new SoftNiSub(), + new SoftNicolonSub(), + new SonyDVDArchitect(), + new SonyDVDArchitectExplicitDuration(), + new SonyDVDArchitectLineAndDuration(), + new SonyDVDArchitectLineDurationLength(), + new SonyDVDArchitectTabs(), + new SonyDVDArchitectWithLineNumbers(), + new Speechmatics(), + new Spruce(), + new SpruceWithSpace(), + new StructuredTitles(), + new SubStationAlpha(), + new SubtitleEditorProject(), + new SubUrbia(), + new SubViewer10(), + new SubViewer20(), + new SwiftInterchange2(), + new SwiftText(), + new SwiftTextLineNumber(), + new SwiftTextLineNOAndDur(), + new Tek(), + new TimeXml(), + new TimeXml2(), + new TimedText10(), + new TimedText200604(), + new TimedText200604CData(), + new TimedText200604Ooyala(), + new TimedText(), + new TitleExchangePro(), + new Titra(), + new TmpegEncText(), + new TmpegEncAW5(), + new TmpegEncXml(), + new TMPlayer(), + new TranscriberXml(), + new Tmx14(), + new TurboTitler(), + new TwentyThreeJson(), + new TwentyThreeJsonEmbed(), + new TwentyThreeJsonEmbedWebSrt(), + new UniversalSubtitleFormat(), + new UTSubtitleXml(), + new Utx(), + new UtxFrames(), + new UleadSubtitleFormat(), + new VocapiaSplit(), + new WebVTT(), + new WebVTTFileWithLineNumber(), + new Xif(), + new Xmp(), + new YouTubeAnnotations(), + new YouTubeSbv(), + new YouTubeTranscript(), + new YouTubeTranscriptOneLine(), + new ZeroG(), + // new Idx(), + new UnknownSubtitle1(), + new UnknownSubtitle2(), + new UnknownSubtitle3(), + new UnknownSubtitle4(), + new UnknownSubtitle5(), + new UnknownSubtitle6(), + new UnknownSubtitle7(), + new UnknownSubtitle8(), + new UnknownSubtitle9(), + new UnknownSubtitle10(), + new UnknownSubtitle11(), + new UnknownSubtitle12(), + new UnknownSubtitle13(), + new UnknownSubtitle14(), + new UnknownSubtitle15(), + new UnknownSubtitle16(), + new UnknownSubtitle17(), + new UnknownSubtitle18(), + new UnknownSubtitle19(), + new UnknownSubtitle20(), + new UnknownSubtitle21(), + new UnknownSubtitle22(), + new UnknownSubtitle23(), + new UnknownSubtitle24(), + new UnknownSubtitle25(), + new UnknownSubtitle26(), + new UnknownSubtitle27(), + new UnknownSubtitle28(), + new UnknownSubtitle29(), + new UnknownSubtitle30(), + new UnknownSubtitle31(), + new UnknownSubtitle32(), + new UnknownSubtitle33(), + new UnknownSubtitle34(), + new UnknownSubtitle35(), + new UnknownSubtitle36(), + new UnknownSubtitle37(), + new UnknownSubtitle38(), + new UnknownSubtitle39(), + new UnknownSubtitle40(), + new UnknownSubtitle41(), + new UnknownSubtitle42(), + new UnknownSubtitle43(), + new UnknownSubtitle44(), + new UnknownSubtitle45(), + new UnknownSubtitle46(), + new UnknownSubtitle47(), + new UnknownSubtitle48(), + new UnknownSubtitle49(), + new UnknownSubtitle50(), + new UnknownSubtitle51(), + new UnknownSubtitle52(), + new UnknownSubtitle53(), + new UnknownSubtitle54(), + new UnknownSubtitle55(), + new UnknownSubtitle56(), + new UnknownSubtitle57(), + new UnknownSubtitle58(), + new UnknownSubtitle59(), + new UnknownSubtitle60(), + new UnknownSubtitle61(), + new UnknownSubtitle62(), + new UnknownSubtitle63(), + new UnknownSubtitle64(), + new UnknownSubtitle65(), + new UnknownSubtitle66(), + new UnknownSubtitle67(), + new UnknownSubtitle68(), + new UnknownSubtitle69(), + new UnknownSubtitle70(), + new UnknownSubtitle71(), + new UnknownSubtitle72(), + new UnknownSubtitle73(), + new UnknownSubtitle74(), + new UnknownSubtitle75(), + new UnknownSubtitle76(), + new UnknownSubtitle77(), + new UnknownSubtitle78(), + new UnknownSubtitle79(), + new UnknownSubtitle80(), + new UnknownSubtitle81(), + new UnknownSubtitle82(), + new UnknownSubtitle83(), + new UnknownSubtitle84(), + new UnknownSubtitle85(), + new UnknownSubtitle86(), + new UnknownSubtitle87(), + new UnknownSubtitle88(), + new UnknownSubtitle89(), + new UnknownSubtitle90(), + new UnknownSubtitle91(), + new UnknownSubtitle92(), + new UnknownSubtitle93(), + new UnknownSubtitle94(), + new UnknownSubtitle95(), + new UnknownSubtitle96(), + new UnknownSubtitle97(), + new UnknownSubtitle98(), + new UnknownSubtitle99(), + new UnknownSubtitle100(), + new UnknownSubtitle101(), + }; + + string path = Configuration.PluginsDirectory; + if (Directory.Exists(path)) + { + foreach (string pluginFileName in Directory.EnumerateFiles(path, "*.DLL")) + { + try + { + var assembly = System.Reflection.Assembly.Load(FileUtil.ReadAllBytesShared(pluginFileName)); + foreach (var exportedType in assembly.GetExportedTypes()) + { + try + { + object pluginObject = Activator.CreateInstance(exportedType); + if (pluginObject is SubtitleFormat po) + { + _allSubtitleFormats.Insert(1, po); + } + } + catch + { + // ignored + } + } + } + catch + { + // ignored + } + } + } + + return _allSubtitleFormats; + } + } + + protected int _errorCount; + + public abstract string Extension + { + get; + } + + public abstract string Name + { + get; + } + + public virtual bool IsTimeBased => true; + + public bool IsFrameBased => !IsTimeBased; + + public string FriendlyName => $"{Name} ({Extension})"; + + public int ErrorCount => _errorCount; + + public virtual bool IsMine(List lines, string fileName) + { + var subtitle = new Subtitle(); + var oldFrameRate = Configuration.Settings.General.CurrentFrameRate; + LoadSubtitle(subtitle, lines, fileName); + Configuration.Settings.General.CurrentFrameRate = oldFrameRate; + return subtitle.Paragraphs.Count > _errorCount; + } + + public abstract string ToText(Subtitle subtitle, string title); + + public abstract void LoadSubtitle(Subtitle subtitle, List lines, string fileName); + + public bool IsVobSubIndexFile => Extension.Equals(".idx", StringComparison.Ordinal); + + public virtual void RemoveNativeFormatting(Subtitle subtitle, SubtitleFormat newFormat) + { + } + + public virtual List AlternateExtensions => new List(); + + public static int MillisecondsToFrames(double milliseconds) + { + return MillisecondsToFrames(milliseconds, Configuration.Settings.General.CurrentFrameRate); + } + + public static int MillisecondsToFrames(double milliseconds, double frameRate) + { + return (int)Math.Round(milliseconds / (TimeCode.BaseUnit / GetFrameForCalculation(frameRate))); + } + + public static double GetFrameForCalculation(double frameRate) + { + if (Math.Abs(frameRate - 23.976) < 0.01) + { + return 24000.0 / 1001.0; + } + if (Math.Abs(frameRate - 29.97) < 0.01) + { + return 30000.0 / 1001.0; + } + if (Math.Abs(frameRate - 59.94) < 0.01) + { + return 60000.0 / 1001.0; + } + + return frameRate; + } + + public static int MillisecondsToFramesMaxFrameRate(double milliseconds) + { + int frames = (int)Math.Round(milliseconds / (TimeCode.BaseUnit / GetFrameForCalculation(Configuration.Settings.General.CurrentFrameRate))); + if (frames >= Configuration.Settings.General.CurrentFrameRate) + { + frames = (int)(Configuration.Settings.General.CurrentFrameRate - 0.01); + } + + return frames; + } + + public static int FramesToMilliseconds(double frames) + { + return (int)Math.Round(frames * (TimeCode.BaseUnit / GetFrameForCalculation(Configuration.Settings.General.CurrentFrameRate))); + } + + public static int FramesToMillisecondsMax999(double frames) + { + int ms = (int)Math.Round(frames * (TimeCode.BaseUnit / GetFrameForCalculation(Configuration.Settings.General.CurrentFrameRate))); + return Math.Min(ms, 999); + } + + public virtual bool HasStyleSupport => false; + + public bool BatchMode { get; set; } + public double? BatchSourceFrameRate { get; set; } + + public static string ToUtf8XmlString(XmlDocument xml, bool omitXmlDeclaration = false) + { + var settings = new XmlWriterSettings + { + Indent = true, + OmitXmlDeclaration = omitXmlDeclaration, + }; + var result = new StringBuilder(); + + using (var xmlWriter = XmlWriter.Create(result, settings)) + { + xml.Save(xmlWriter); + } + + return result.ToString().Replace(" encoding=\"utf-16\"", " encoding=\"utf-8\"").Trim(); + } + + public virtual bool IsTextBased => true; + + protected static TimeCode DecodeTimeCodeFramesTwoParts(string[] tokens) + { + if (tokens == null) + { + return new TimeCode(); + } + + if (tokens.Length != 2) + { + throw new InvalidOperationException(); + } + + return new TimeCode(0, 0, int.Parse(tokens[0]), FramesToMillisecondsMax999(int.Parse(tokens[1]))); + } + + protected static TimeCode DecodeTimeCodeFramesFourParts(string[] tokens) + { + if (tokens == null) + { + return new TimeCode(); + } + + if (tokens.Length != 4) + { + throw new InvalidOperationException(); + } + + return new TimeCode(int.Parse(tokens[0]), int.Parse(tokens[1]), int.Parse(tokens[2]), FramesToMillisecondsMax999(int.Parse(tokens[3]))); + } + + protected static TimeCode DecodeTimeCodeMsFourParts(string[] tokens) + { + if (tokens == null) + { + return new TimeCode(); + } + + if (tokens.Length != 4) + { + throw new InvalidOperationException(); + } + + return new TimeCode(int.Parse(tokens[0]), int.Parse(tokens[1]), int.Parse(tokens[2]), int.Parse(tokens[3])); + } + + protected static TimeCode DecodeTimeCodeFrames(string timestamp, char[] splitChars) + { + return DecodeTimeCodeFramesFourParts(timestamp.Split(splitChars, StringSplitOptions.RemoveEmptyEntries)); + } + + /// + /// Load subtitle type of 'formats' from file. + /// + /// List of possible formats + /// Name of subtitle file + /// Subtitle to load file into + /// The format of the file, null of not format match found + public static SubtitleFormat LoadSubtitleFromFile(SubtitleFormat[] formats, string fileName, Subtitle subtitle) + { + if (formats == null || formats.Length == 0 || string.IsNullOrEmpty(fileName)) + { + return null; + } + + var list = new List(File.ReadAllLines(fileName, LanguageAutoDetect.GetEncodingFromFile(fileName))); + foreach (var subtitleFormat in formats) + { + if (subtitleFormat.IsMine(list, fileName)) + { + subtitleFormat.LoadSubtitle(subtitle, list, fileName); + return subtitleFormat; + } + } + return null; + } + + /// + /// Load subtitle from a list of lines and a file name (the last can be null). + /// + /// Text lines from subtitle file + /// Optional file name + /// Subtitle, null if format not recognized + public static Subtitle LoadSubtitleFromLines(List lines, string fileName) + { + if (lines == null || lines.Count == 0) + { + return null; + } + + var subtitle = new Subtitle(); + foreach (var subtitleFormat in AllSubtitleFormats) + { + if (subtitleFormat.IsMine(lines, fileName)) + { + subtitleFormat.LoadSubtitle(subtitle, lines, fileName); + return subtitle; + } + } + + return null; + } + + public static SubtitleFormat[] GetBinaryFormats(bool batchMode) + { + return new SubtitleFormat[] + { + new Ebu { BatchMode = batchMode }, + new Pac { BatchMode = batchMode }, + new PacUnicode(), + new Cavena890 { BatchMode = batchMode }, + new Spt(), + new CheetahCaption(), + new CheetahCaptionOld(), + new TSB4(), + new Chk(), + new Ayato(), + new CapMakerPlus(), + new Ultech130(), + new NciCaption(), + new AvidStl(), + new WinCaps32(), + new IsmtDfxp(), + new Cavena890(), + new Spt(), + new Sptx(), + new IaiSub(), + new ELRStudioClosedCaption(), + new CaptionsInc(), + new TimeLineMvt(), + new Cmaft(), + new Pns(), + new PlayCaptionsFreeEditor(), + }; + } + + public static SubtitleFormat[] GetTextOtherFormats() + { + return new SubtitleFormat[] + { + new DlDd(), + new Ted20(), + new Captionate(), + new TimeLineAscii(), + new TimeLineFootageAscii(), + new TimedTextImage(), + new FinalCutProImage(), + new SpuImage(), + new Dost(), + new SeImageHtmlIndex(), + new BdnXml(), + new Wsb(), + new JsonTypeOnlyLoad1(), + new TranscriptiveJson(), + new KaraokeCdgCreatorText(), + new VidIcelandic(), + }; + } + + public static SubtitleFormat FromName(string formatName, SubtitleFormat defaultFormat) + { + string trimmedFormatName = formatName.Trim(); + foreach (var format in AllSubtitleFormats) + { + if (format.Name.Trim().Equals(trimmedFormatName, StringComparison.OrdinalIgnoreCase) || + format.FriendlyName.Trim().Equals(trimmedFormatName, StringComparison.OrdinalIgnoreCase)) + { + return format; + } + } + + return defaultFormat; + } + + public static SubtitleFormat BinaryPersistableFromName(string formatName, bool batchMode) + { + string trimmedFormatName = formatName.Trim(); + foreach (var format in GetBinaryFormats(batchMode)) + { + if (format is IBinaryPersistableSubtitle && + format.Name.Trim().Equals(trimmedFormatName, StringComparison.OrdinalIgnoreCase) || + format.FriendlyName.Trim().Equals(trimmedFormatName, StringComparison.OrdinalIgnoreCase)) + { + return format; + } + } + + return null; + } + } +} diff --git a/libse/SubtitleFormats/SwiftInterchange2.cs b/src/libse/SubtitleFormats/SwiftInterchange2.cs similarity index 97% rename from libse/SubtitleFormats/SwiftInterchange2.cs rename to src/libse/SubtitleFormats/SwiftInterchange2.cs index 9e97cb61e..0fbd19f7e 100644 --- a/libse/SubtitleFormats/SwiftInterchange2.cs +++ b/src/libse/SubtitleFormats/SwiftInterchange2.cs @@ -1,226 +1,226 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class SwiftInterchange2 : SubtitleFormat - { - private const string ItalicPrefix = ""; - private string _fileName; - - public override string Extension => ".sif"; - - public override string Name => "Swift Interchange File V2"; - - public override bool IsMine(List lines, string fileName) - { - if (lines.Count > 0 && lines[0] != null && lines[0].StartsWith("{\\rtf1")) - { - return false; - } - - _fileName = fileName; - return base.IsMine(lines, fileName); - } - - private static string GetOriginatingSwift(Subtitle subtitle) - { - string lang = "English (USA)"; - string languageCode = LanguageAutoDetect.AutoDetectGoogleLanguage(subtitle); - if (languageCode == "nl") - { - lang = "Dutch (Netherlands)"; - } - else if (languageCode == "de") - { - lang = "German (German)"; - } - return "Open 25 " + lang; - // examples: - // Line21 30 DROP English (USA) - // Open 25 German (German) - // Open 25 Dutch (Netherlands) - //TODO: Frame rate - } - - private string GetVideoFileName(string title) - { - string fileNameNoExt = null; - if (_fileName != null) - { - fileNameNoExt = _fileName.Substring(0, _fileName.Length - Path.GetExtension(_fileName).Length); - } - foreach (var ext in Utilities.VideoFileExtensions) - { - if (!string.IsNullOrEmpty(fileNameNoExt) && File.Exists(Path.Combine(fileNameNoExt, ext))) - { - return Path.Combine(fileNameNoExt, ext); - } - if (!string.IsNullOrEmpty(title) && File.Exists(Path.Combine(title, ext))) - { - return Path.Combine(title, ext); - } - } - if (string.IsNullOrEmpty(title)) - { - return "Unknown.mpg"; - } - return title + ".mpg"; - } - - public override string ToText(Subtitle subtitle, string title) - { - string date = $"{DateTime.Now.Day:00}/{DateTime.Now.Month:00}/{DateTime.Now.Year}"; - const string header = @"# SWIFT INTERCHANGE FILE V2 -# DO NOT EDIT LINES BEGINNING WITH '#' SIGN -# Originating Swift: [ORIGINATING_SWIFT] -# VIDEO CLIP : [VIDEO_FILE] -# BROADCAST DATE : [DATE] -# REVISION DATE : [DATE] -# CREATION DATE : [DATE] -# COUNTRY OF ORIGIN : ENG -# EPISODE NUMBER : 0 -# DEADLINE DATE : [DATE] -# AUTO TX : false -# CURRENT STYLE : None -# STYLE DATE : None -# STYLE Time : None"; - var sb = new StringBuilder(); - var videoFileName = GetVideoFileName(title); - sb.AppendLine(header.Replace("[DATE]", date).Replace("[VIDEO_FILE]", videoFileName).Replace("[ORIGINATING_SWIFT]", GetOriginatingSwift(subtitle))); - sb.AppendLine(); - sb.AppendLine(); - const string paragraphWriteFormat = @"# SUBTITLE {3} -# TIMEIN {0} -# DURATION {1} AUTO -# TIMEOUT {2} -# START ROW BOTTOM -# ALIGN CENTRE JUSTIFY CENTER"; - int count = 1; - foreach (Paragraph p in subtitle.Paragraphs) - { - string startTime = $"{p.StartTime.Hours:00}:{p.StartTime.Minutes:00}:{p.StartTime.Seconds:00}:{MillisecondsToFramesMaxFrameRate(p.StartTime.Milliseconds):00}"; - string endTime = $"{p.EndTime.Hours:00}:{p.EndTime.Minutes:00}:{p.EndTime.Seconds:00}:{MillisecondsToFramesMaxFrameRate(p.EndTime.Milliseconds):00}"; - string duration = $"{p.Duration.Seconds:00}:{MillisecondsToFramesMaxFrameRate(p.Duration.Milliseconds):00}"; - sb.AppendLine(string.Format(paragraphWriteFormat, startTime, duration, endTime, count)); - string text = HtmlUtil.RemoveHtmlTags(p.Text); - if (p.Text.StartsWith("", StringComparison.Ordinal) && p.Text.EndsWith("", StringComparison.Ordinal)) - { - text = ItalicPrefix + text; - } - var arr = text.SplitToLines(); - for (int rowNo = 0; rowNo < arr.Count; rowNo++) - { - if (rowNo == arr.Count - 1) - { - sb.AppendLine("# ROW " + rowNo); - } - else - { - sb.AppendLine("# ROW " + rowNo + " RETURN"); - } - sb.AppendLine(arr[rowNo]); - } - sb.AppendLine(); - count++; - } - return sb.ToString().Trim(); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - Paragraph p = null; - foreach (string line in lines) - { - if (line.StartsWith("# SUBTITLE", StringComparison.Ordinal)) - { - if (p != null) - { - subtitle.Paragraphs.Add(p); - } - - p = new Paragraph(); - } - else if (p != null && line.StartsWith("# TIMEIN", StringComparison.Ordinal)) - { - string timeCode = line.Remove(0, 8).Trim(); - if (timeCode != "--:--:--:--" && !GetTimeCode(p.StartTime, timeCode)) - { - _errorCount++; - } - } - else if (p != null && line.StartsWith("# DURATION", StringComparison.Ordinal)) - { - // # DURATION 01:17 AUTO - string timeCode = line.Remove(0, 10).Replace("AUTO", string.Empty).Trim(); - if (timeCode != "--:--") - { - var arr = timeCode.Split(':', ' '); - if (arr.Length > 1) - { - if (int.TryParse(arr[0], out var sec) && int.TryParse(arr[1], out var frame)) - { - p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + FramesToMillisecondsMax999(frame); - p.EndTime.TotalSeconds += sec; - } - } - } - } - else if (p != null && line.StartsWith("# TIMEOUT", StringComparison.Ordinal)) - { - string timeCode = line.Remove(0, 9).Trim(); - if (timeCode != "--:--:--:--" && !GetTimeCode(p.EndTime, timeCode)) - { - _errorCount++; - } - } - else if (p != null && !line.StartsWith('#')) - { - if (p.Text.Length > 500) - { - _errorCount += 10; - return; - } - p.Text = (p.Text + Environment.NewLine + line).Trim(); - } - } - if (p != null) - { - subtitle.Paragraphs.Add(p); - } - - subtitle.RemoveEmptyLines(); - subtitle.Renumber(); - - foreach (var paragraph in subtitle.Paragraphs) - { - if (paragraph.Text.StartsWith(ItalicPrefix, StringComparison.Ordinal)) - { - paragraph.Text = "" + paragraph.Text.Remove(0, ItalicPrefix.Length).TrimStart() + ""; - } - } - } - - private static bool GetTimeCode(TimeCode timeCode, string timeString) - { - try - { - string[] timeParts = timeString.Split(':', '.'); - timeCode.Hours = int.Parse(timeParts[0]); - timeCode.Minutes = int.Parse(timeParts[1]); - timeCode.Seconds = int.Parse(timeParts[2]); - timeCode.Milliseconds = FramesToMillisecondsMax999(int.Parse(timeParts[3])); - return true; - } - catch - { - return false; - } - } - - } -} +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class SwiftInterchange2 : SubtitleFormat + { + private const string ItalicPrefix = ""; + private string _fileName; + + public override string Extension => ".sif"; + + public override string Name => "Swift Interchange File V2"; + + public override bool IsMine(List lines, string fileName) + { + if (lines.Count > 0 && lines[0] != null && lines[0].StartsWith("{\\rtf1")) + { + return false; + } + + _fileName = fileName; + return base.IsMine(lines, fileName); + } + + private static string GetOriginatingSwift(Subtitle subtitle) + { + string lang = "English (USA)"; + string languageCode = LanguageAutoDetect.AutoDetectGoogleLanguage(subtitle); + if (languageCode == "nl") + { + lang = "Dutch (Netherlands)"; + } + else if (languageCode == "de") + { + lang = "German (German)"; + } + return "Open 25 " + lang; + // examples: + // Line21 30 DROP English (USA) + // Open 25 German (German) + // Open 25 Dutch (Netherlands) + //TODO: Frame rate + } + + private string GetVideoFileName(string title) + { + string fileNameNoExt = null; + if (_fileName != null) + { + fileNameNoExt = _fileName.Substring(0, _fileName.Length - Path.GetExtension(_fileName).Length); + } + foreach (var ext in Utilities.VideoFileExtensions) + { + if (!string.IsNullOrEmpty(fileNameNoExt) && File.Exists(Path.Combine(fileNameNoExt, ext))) + { + return Path.Combine(fileNameNoExt, ext); + } + if (!string.IsNullOrEmpty(title) && File.Exists(Path.Combine(title, ext))) + { + return Path.Combine(title, ext); + } + } + if (string.IsNullOrEmpty(title)) + { + return "Unknown.mpg"; + } + return title + ".mpg"; + } + + public override string ToText(Subtitle subtitle, string title) + { + string date = $"{DateTime.Now.Day:00}/{DateTime.Now.Month:00}/{DateTime.Now.Year}"; + const string header = @"# SWIFT INTERCHANGE FILE V2 +# DO NOT EDIT LINES BEGINNING WITH '#' SIGN +# Originating Swift: [ORIGINATING_SWIFT] +# VIDEO CLIP : [VIDEO_FILE] +# BROADCAST DATE : [DATE] +# REVISION DATE : [DATE] +# CREATION DATE : [DATE] +# COUNTRY OF ORIGIN : ENG +# EPISODE NUMBER : 0 +# DEADLINE DATE : [DATE] +# AUTO TX : false +# CURRENT STYLE : None +# STYLE DATE : None +# STYLE Time : None"; + var sb = new StringBuilder(); + var videoFileName = GetVideoFileName(title); + sb.AppendLine(header.Replace("[DATE]", date).Replace("[VIDEO_FILE]", videoFileName).Replace("[ORIGINATING_SWIFT]", GetOriginatingSwift(subtitle))); + sb.AppendLine(); + sb.AppendLine(); + const string paragraphWriteFormat = @"# SUBTITLE {3} +# TIMEIN {0} +# DURATION {1} AUTO +# TIMEOUT {2} +# START ROW BOTTOM +# ALIGN CENTRE JUSTIFY CENTER"; + int count = 1; + foreach (Paragraph p in subtitle.Paragraphs) + { + string startTime = $"{p.StartTime.Hours:00}:{p.StartTime.Minutes:00}:{p.StartTime.Seconds:00}:{MillisecondsToFramesMaxFrameRate(p.StartTime.Milliseconds):00}"; + string endTime = $"{p.EndTime.Hours:00}:{p.EndTime.Minutes:00}:{p.EndTime.Seconds:00}:{MillisecondsToFramesMaxFrameRate(p.EndTime.Milliseconds):00}"; + string duration = $"{p.Duration.Seconds:00}:{MillisecondsToFramesMaxFrameRate(p.Duration.Milliseconds):00}"; + sb.AppendLine(string.Format(paragraphWriteFormat, startTime, duration, endTime, count)); + string text = HtmlUtil.RemoveHtmlTags(p.Text); + if (p.Text.StartsWith("", StringComparison.Ordinal) && p.Text.EndsWith("", StringComparison.Ordinal)) + { + text = ItalicPrefix + text; + } + var arr = text.SplitToLines(); + for (int rowNo = 0; rowNo < arr.Count; rowNo++) + { + if (rowNo == arr.Count - 1) + { + sb.AppendLine("# ROW " + rowNo); + } + else + { + sb.AppendLine("# ROW " + rowNo + " RETURN"); + } + sb.AppendLine(arr[rowNo]); + } + sb.AppendLine(); + count++; + } + return sb.ToString().Trim(); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + Paragraph p = null; + foreach (string line in lines) + { + if (line.StartsWith("# SUBTITLE", StringComparison.Ordinal)) + { + if (p != null) + { + subtitle.Paragraphs.Add(p); + } + + p = new Paragraph(); + } + else if (p != null && line.StartsWith("# TIMEIN", StringComparison.Ordinal)) + { + string timeCode = line.Remove(0, 8).Trim(); + if (timeCode != "--:--:--:--" && !GetTimeCode(p.StartTime, timeCode)) + { + _errorCount++; + } + } + else if (p != null && line.StartsWith("# DURATION", StringComparison.Ordinal)) + { + // # DURATION 01:17 AUTO + string timeCode = line.Remove(0, 10).Replace("AUTO", string.Empty).Trim(); + if (timeCode != "--:--") + { + var arr = timeCode.Split(':', ' '); + if (arr.Length > 1) + { + if (int.TryParse(arr[0], out var sec) && int.TryParse(arr[1], out var frame)) + { + p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + FramesToMillisecondsMax999(frame); + p.EndTime.TotalSeconds += sec; + } + } + } + } + else if (p != null && line.StartsWith("# TIMEOUT", StringComparison.Ordinal)) + { + string timeCode = line.Remove(0, 9).Trim(); + if (timeCode != "--:--:--:--" && !GetTimeCode(p.EndTime, timeCode)) + { + _errorCount++; + } + } + else if (p != null && !line.StartsWith('#')) + { + if (p.Text.Length > 500) + { + _errorCount += 10; + return; + } + p.Text = (p.Text + Environment.NewLine + line).Trim(); + } + } + if (p != null) + { + subtitle.Paragraphs.Add(p); + } + + subtitle.RemoveEmptyLines(); + subtitle.Renumber(); + + foreach (var paragraph in subtitle.Paragraphs) + { + if (paragraph.Text.StartsWith(ItalicPrefix, StringComparison.Ordinal)) + { + paragraph.Text = "" + paragraph.Text.Remove(0, ItalicPrefix.Length).TrimStart() + ""; + } + } + } + + private static bool GetTimeCode(TimeCode timeCode, string timeString) + { + try + { + string[] timeParts = timeString.Split(':', '.'); + timeCode.Hours = int.Parse(timeParts[0]); + timeCode.Minutes = int.Parse(timeParts[1]); + timeCode.Seconds = int.Parse(timeParts[2]); + timeCode.Milliseconds = FramesToMillisecondsMax999(int.Parse(timeParts[3])); + return true; + } + catch + { + return false; + } + } + + } +} diff --git a/libse/SubtitleFormats/SwiftText.cs b/src/libse/SubtitleFormats/SwiftText.cs similarity index 97% rename from libse/SubtitleFormats/SwiftText.cs rename to src/libse/SubtitleFormats/SwiftText.cs index 36986935f..4f914cbc2 100644 --- a/libse/SubtitleFormats/SwiftText.cs +++ b/src/libse/SubtitleFormats/SwiftText.cs @@ -1,198 +1,198 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class SwiftText : SubtitleFormat - { - private enum ExpectingLine - { - TimeCodes, - Text - } - - private Paragraph _paragraph; - private StringBuilder _text = new StringBuilder(); - private ExpectingLine _expecting = ExpectingLine.TimeCodes; - - private static readonly Regex RegexTimeCodes = new Regex(@"^TIMEIN:\s*[0123456789-]+:[0123456789-]+:[0123456789-]+:[0123456789-]+\s*DURATION:\s*[0123456789-]+:[0123456789-]+\s*TIMEOUT:\s*[0123456789-]+:[0123456789-]+:[0123456789-]+:[0123456789-]+$", RegexOptions.Compiled); - - public override string Extension => ".txt"; - - public override string Name => "Swift text"; - - public override bool IsMine(List lines, string fileName) - { - if (lines == null || lines.Count > 2 && !string.IsNullOrEmpty(lines[0]) && lines[0].Contains("{QTtext}")) - { - return false; - } - - return base.IsMine(lines, fileName); - } - - public override string ToText(Subtitle subtitle, string title) - { - //TIMEIN: 01:00:01:09 DURATION: 01:20 TIMEOUT: --:--:--:-- - //Broadcasting - //from an undisclosed location... - - //TIMEIN: 01:00:04:12 DURATION: 04:25 TIMEOUT: 01:00:09:07 - - const string paragraphWriteFormat = "TIMEIN: {0}\tDURATION: {1}\tTIMEOUT: {2}\r\n{3}\r\n"; - - var sb = new StringBuilder(); - foreach (Paragraph p in subtitle.Paragraphs) - { - // to avoid rounding errors in duration - var startFrame = MillisecondsToFramesMaxFrameRate(p.StartTime.Milliseconds); - var endFrame = MillisecondsToFramesMaxFrameRate(p.EndTime.Milliseconds); - var durationCalc = new Paragraph( - new TimeCode(p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, FramesToMillisecondsMax999(startFrame)), - new TimeCode(p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, FramesToMillisecondsMax999(endFrame)), - string.Empty); - - string startTime = $"{p.StartTime.Hours:00}:{p.StartTime.Minutes:00}:{p.StartTime.Seconds:00}:{startFrame:00}"; - string timeOut = $"{p.EndTime.Hours:00}:{p.EndTime.Minutes:00}:{p.EndTime.Seconds:00}:{endFrame:00}"; - string timeDuration = $"{durationCalc.Duration.Seconds:00}:{MillisecondsToFramesMaxFrameRate(durationCalc.Duration.Milliseconds):00}"; - sb.AppendLine(string.Format(paragraphWriteFormat, startTime, timeDuration, timeOut, p.Text)); - } - return sb.ToString().Trim(); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _paragraph = new Paragraph(); - _expecting = ExpectingLine.TimeCodes; - _errorCount = 0; - - subtitle.Paragraphs.Clear(); - foreach (string line in lines) - { - ReadLine(subtitle, line); - if (_text.Length > 1000) - { - return; - } - } - if (_text != null && _text.ToString().TrimStart().Length > 0) - { - _paragraph.Text = _text.ToString().Trim(); - subtitle.Paragraphs.Add(_paragraph); - } - - subtitle.Renumber(); - } - - private void ReadLine(Subtitle subtitle, string line) - { - switch (_expecting) - { - case ExpectingLine.TimeCodes: - if (TryReadTimeCodesLine(line, _paragraph)) - { - _text = new StringBuilder(); - _expecting = ExpectingLine.Text; - } - else if (!string.IsNullOrWhiteSpace(line)) - { - _errorCount++; - _expecting = ExpectingLine.Text; // lets go to next paragraph - } - break; - case ExpectingLine.Text: - if (!string.IsNullOrWhiteSpace(line)) - { - _text.AppendLine(line.TrimEnd()); - } - else if (_paragraph != null && _paragraph.EndTime.TotalMilliseconds > 0) - { - _paragraph.Text = _text.ToString().Trim(); - subtitle.Paragraphs.Add(_paragraph); - _paragraph = new Paragraph(); - _expecting = ExpectingLine.TimeCodes; - } - else - { - _errorCount++; - } - break; - } - } - - private static bool TryReadTimeCodesLine(string line, Paragraph paragraph) - { - line = line.Trim(); - if (line.StartsWith("TIMEIN:", StringComparison.Ordinal) && RegexTimeCodes.IsMatch(line)) - { - //TIMEIN: 01:00:04:12 DURATION: 04:25 TIMEOUT: 01:00:09:07 - string s = line.Replace("TIMEIN:", string.Empty).Replace("DURATION", string.Empty).Replace("TIMEOUT", string.Empty).RemoveChar(' ').Replace("\t", string.Empty); - string[] parts = s.Split(':'); - try - { - int startHours = int.Parse(parts[0]); - int startMinutes = int.Parse(parts[1]); - int startSeconds = int.Parse(parts[2]); - int startMilliseconds = FramesToMillisecondsMax999(int.Parse(parts[3])); - - int durationSeconds = 0; - if (parts[4] != "-") - { - durationSeconds = int.Parse(parts[4]); - } - - int durationMilliseconds = 0; - if (parts[5] != "--") - { - durationMilliseconds = FramesToMillisecondsMax999(int.Parse(parts[5])); - } - - int endHours = 0; - if (parts[6] != "--") - { - endHours = int.Parse(parts[6]); - } - - int endMinutes = 0; - if (parts[7] != "--") - { - endMinutes = int.Parse(parts[7]); - } - - int endSeconds = 0; - if (parts[8] != "--") - { - endSeconds = int.Parse(parts[8]); - } - - int endMilliseconds = 0; - if (parts[9] != "--") - { - endMilliseconds = FramesToMillisecondsMax999(int.Parse(parts[9])); - } - - paragraph.StartTime = new TimeCode(startHours, startMinutes, startSeconds, startMilliseconds); - - if (durationSeconds > 0 || durationMilliseconds > 0) - { - paragraph.EndTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds + (durationSeconds * 1000 + durationMilliseconds); - } - else - { - paragraph.EndTime = new TimeCode(endHours, endMinutes, endSeconds, endMilliseconds); - } - - return true; - } - catch - { - return false; - } - } - return false; - } - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class SwiftText : SubtitleFormat + { + private enum ExpectingLine + { + TimeCodes, + Text + } + + private Paragraph _paragraph; + private StringBuilder _text = new StringBuilder(); + private ExpectingLine _expecting = ExpectingLine.TimeCodes; + + private static readonly Regex RegexTimeCodes = new Regex(@"^TIMEIN:\s*[0123456789-]+:[0123456789-]+:[0123456789-]+:[0123456789-]+\s*DURATION:\s*[0123456789-]+:[0123456789-]+\s*TIMEOUT:\s*[0123456789-]+:[0123456789-]+:[0123456789-]+:[0123456789-]+$", RegexOptions.Compiled); + + public override string Extension => ".txt"; + + public override string Name => "Swift text"; + + public override bool IsMine(List lines, string fileName) + { + if (lines == null || lines.Count > 2 && !string.IsNullOrEmpty(lines[0]) && lines[0].Contains("{QTtext}")) + { + return false; + } + + return base.IsMine(lines, fileName); + } + + public override string ToText(Subtitle subtitle, string title) + { + //TIMEIN: 01:00:01:09 DURATION: 01:20 TIMEOUT: --:--:--:-- + //Broadcasting + //from an undisclosed location... + + //TIMEIN: 01:00:04:12 DURATION: 04:25 TIMEOUT: 01:00:09:07 + + const string paragraphWriteFormat = "TIMEIN: {0}\tDURATION: {1}\tTIMEOUT: {2}\r\n{3}\r\n"; + + var sb = new StringBuilder(); + foreach (Paragraph p in subtitle.Paragraphs) + { + // to avoid rounding errors in duration + var startFrame = MillisecondsToFramesMaxFrameRate(p.StartTime.Milliseconds); + var endFrame = MillisecondsToFramesMaxFrameRate(p.EndTime.Milliseconds); + var durationCalc = new Paragraph( + new TimeCode(p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, FramesToMillisecondsMax999(startFrame)), + new TimeCode(p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, FramesToMillisecondsMax999(endFrame)), + string.Empty); + + string startTime = $"{p.StartTime.Hours:00}:{p.StartTime.Minutes:00}:{p.StartTime.Seconds:00}:{startFrame:00}"; + string timeOut = $"{p.EndTime.Hours:00}:{p.EndTime.Minutes:00}:{p.EndTime.Seconds:00}:{endFrame:00}"; + string timeDuration = $"{durationCalc.Duration.Seconds:00}:{MillisecondsToFramesMaxFrameRate(durationCalc.Duration.Milliseconds):00}"; + sb.AppendLine(string.Format(paragraphWriteFormat, startTime, timeDuration, timeOut, p.Text)); + } + return sb.ToString().Trim(); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _paragraph = new Paragraph(); + _expecting = ExpectingLine.TimeCodes; + _errorCount = 0; + + subtitle.Paragraphs.Clear(); + foreach (string line in lines) + { + ReadLine(subtitle, line); + if (_text.Length > 1000) + { + return; + } + } + if (_text != null && _text.ToString().TrimStart().Length > 0) + { + _paragraph.Text = _text.ToString().Trim(); + subtitle.Paragraphs.Add(_paragraph); + } + + subtitle.Renumber(); + } + + private void ReadLine(Subtitle subtitle, string line) + { + switch (_expecting) + { + case ExpectingLine.TimeCodes: + if (TryReadTimeCodesLine(line, _paragraph)) + { + _text = new StringBuilder(); + _expecting = ExpectingLine.Text; + } + else if (!string.IsNullOrWhiteSpace(line)) + { + _errorCount++; + _expecting = ExpectingLine.Text; // lets go to next paragraph + } + break; + case ExpectingLine.Text: + if (!string.IsNullOrWhiteSpace(line)) + { + _text.AppendLine(line.TrimEnd()); + } + else if (_paragraph != null && _paragraph.EndTime.TotalMilliseconds > 0) + { + _paragraph.Text = _text.ToString().Trim(); + subtitle.Paragraphs.Add(_paragraph); + _paragraph = new Paragraph(); + _expecting = ExpectingLine.TimeCodes; + } + else + { + _errorCount++; + } + break; + } + } + + private static bool TryReadTimeCodesLine(string line, Paragraph paragraph) + { + line = line.Trim(); + if (line.StartsWith("TIMEIN:", StringComparison.Ordinal) && RegexTimeCodes.IsMatch(line)) + { + //TIMEIN: 01:00:04:12 DURATION: 04:25 TIMEOUT: 01:00:09:07 + string s = line.Replace("TIMEIN:", string.Empty).Replace("DURATION", string.Empty).Replace("TIMEOUT", string.Empty).RemoveChar(' ').Replace("\t", string.Empty); + string[] parts = s.Split(':'); + try + { + int startHours = int.Parse(parts[0]); + int startMinutes = int.Parse(parts[1]); + int startSeconds = int.Parse(parts[2]); + int startMilliseconds = FramesToMillisecondsMax999(int.Parse(parts[3])); + + int durationSeconds = 0; + if (parts[4] != "-") + { + durationSeconds = int.Parse(parts[4]); + } + + int durationMilliseconds = 0; + if (parts[5] != "--") + { + durationMilliseconds = FramesToMillisecondsMax999(int.Parse(parts[5])); + } + + int endHours = 0; + if (parts[6] != "--") + { + endHours = int.Parse(parts[6]); + } + + int endMinutes = 0; + if (parts[7] != "--") + { + endMinutes = int.Parse(parts[7]); + } + + int endSeconds = 0; + if (parts[8] != "--") + { + endSeconds = int.Parse(parts[8]); + } + + int endMilliseconds = 0; + if (parts[9] != "--") + { + endMilliseconds = FramesToMillisecondsMax999(int.Parse(parts[9])); + } + + paragraph.StartTime = new TimeCode(startHours, startMinutes, startSeconds, startMilliseconds); + + if (durationSeconds > 0 || durationMilliseconds > 0) + { + paragraph.EndTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds + (durationSeconds * 1000 + durationMilliseconds); + } + else + { + paragraph.EndTime = new TimeCode(endHours, endMinutes, endSeconds, endMilliseconds); + } + + return true; + } + catch + { + return false; + } + } + return false; + } + } +} diff --git a/libse/SubtitleFormats/SwiftTextLineNoAndDur.cs b/src/libse/SubtitleFormats/SwiftTextLineNoAndDur.cs similarity index 97% rename from libse/SubtitleFormats/SwiftTextLineNoAndDur.cs rename to src/libse/SubtitleFormats/SwiftTextLineNoAndDur.cs index 47c406a5d..3cc099b16 100644 --- a/libse/SubtitleFormats/SwiftTextLineNoAndDur.cs +++ b/src/libse/SubtitleFormats/SwiftTextLineNoAndDur.cs @@ -1,185 +1,185 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class SwiftTextLineNOAndDur : SubtitleFormat - { - private enum ExpectingLine - { - TimeCodes, - Text - } - - private Paragraph _paragraph; - private StringBuilder _text = new StringBuilder(); - private ExpectingLine _expecting = ExpectingLine.TimeCodes; - - private static readonly Regex RegexTimeCodes = new Regex(@"^SUBTITLE: \d+\s+TIMEIN:\s*[0123456789-]+:[0123456789-]+:[0123456789-]+:[0123456789-]+\s*DURATION:\s*[0123456789-]+:[0123456789-]+\s+TIMEOUT:\s*[0123456789-]+:[0123456789-]+:[0123456789-]+:[0123456789-]+$", RegexOptions.Compiled); - - public override string Extension => ".txt"; - - public override string Name => "Swift text line# +dur"; - - public override bool IsMine(List lines, string fileName) - { - if (lines != null && lines.Count > 2 && !string.IsNullOrEmpty(lines[0]) && lines[0].Contains("{QTtext}")) - { - return false; - } - - return base.IsMine(lines, fileName); - } - - public override string ToText(Subtitle subtitle, string title) - { - //SUBTITLE: 1 TIMEIN: 00:00:07:01 DURATION: 03:11 TIMEOUT: 00:00:10:12 - //Voor de oorlog - - //SUBTITLE: 2 TIMEIN: 00:00:10:16 DURATION: 01:08 TIMEOUT: 00:00:11:24 - //Ik ben Marie Pinhas. Ik ben geboren - //in Thessaloniki in Griekenland, - - //SUBTITLE: 3 TIMEIN: 00:00:12:12 DURATION: 02:10 TIMEOUT: 00:00:14:22 - //op 6 maart '31, - //in een heel oude Griekse familie. - - const string paragraphWriteFormat = "SUBTITLE: {1}\tTIMEIN: {0}\tDURATION: {4}\tTIMEOUT: {2}\r\n{3}\r\n"; - - var sb = new StringBuilder(); - int count = 1; - foreach (Paragraph p in subtitle.Paragraphs) - { - // to avoid rounding errors in duration - var startFrame = MillisecondsToFramesMaxFrameRate(p.StartTime.Milliseconds); - var endFrame = MillisecondsToFramesMaxFrameRate(p.EndTime.Milliseconds); - var durationCalc = new Paragraph( - new TimeCode(p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, FramesToMillisecondsMax999(startFrame)), - new TimeCode(p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, FramesToMillisecondsMax999(endFrame)), - string.Empty); - - string startTime = $"{p.StartTime.Hours:00}:{p.StartTime.Minutes:00}:{p.StartTime.Seconds:00}:{startFrame:00}"; - string timeOut = $"{p.EndTime.Hours:00}:{p.EndTime.Minutes:00}:{p.EndTime.Seconds:00}:{endFrame:00}"; - string timeDuration = $"{durationCalc.Duration.Seconds:00}:{MillisecondsToFramesMaxFrameRate(durationCalc.Duration.Milliseconds):00}"; - sb.AppendLine(string.Format(paragraphWriteFormat, startTime, count, timeOut, p.Text, timeDuration)); - count++; - } - return sb.ToString().Trim(); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _paragraph = new Paragraph(); - _expecting = ExpectingLine.TimeCodes; - _errorCount = 0; - - subtitle.Paragraphs.Clear(); - foreach (string line in lines) - { - ReadLine(subtitle, line); - if (_text.Length > 1000) - { - return; - } - } - if (_text != null && _text.ToString().TrimStart().Length > 0) - { - _paragraph.Text = _text.ToString().Trim(); - subtitle.Paragraphs.Add(_paragraph); - } - - subtitle.Renumber(); - } - - private void ReadLine(Subtitle subtitle, string line) - { - switch (_expecting) - { - case ExpectingLine.TimeCodes: - if (TryReadTimeCodesLine(line, _paragraph)) - { - _text = new StringBuilder(); - _expecting = ExpectingLine.Text; - } - else if (!string.IsNullOrWhiteSpace(line)) - { - _errorCount++; - _expecting = ExpectingLine.Text; // lets go to next paragraph - } - break; - case ExpectingLine.Text: - if (!string.IsNullOrWhiteSpace(line)) - { - _text.AppendLine(line.TrimEnd()); - } - else if (_paragraph != null && _paragraph.EndTime.TotalMilliseconds > 0) - { - _paragraph.Text = _text.ToString().Trim(); - subtitle.Paragraphs.Add(_paragraph); - _paragraph = new Paragraph(); - _expecting = ExpectingLine.TimeCodes; - } - else - { - _errorCount++; - } - break; - } - } - - private static bool TryReadTimeCodesLine(string line, Paragraph paragraph) - { - line = line.Trim(); - if (line.Length > 20 && line.StartsWith("SUBTITLE:", StringComparison.Ordinal) && RegexTimeCodes.IsMatch(line)) - { - //SUBTITLE: 1 TIMEIN: 00:00:07:01 DURATION: 03:11 TIMEOUT: 00:00:10:12 - string s = line.Replace("SUBTITLE:", string.Empty).Replace("TIMEIN", string.Empty).Replace("DURATION", string.Empty).Replace("TIMEOUT", string.Empty).RemoveChar(' ').Replace("\t", string.Empty); - string[] parts = s.Split(':'); - try - { - int startHours = int.Parse(parts[1]); - int startMinutes = int.Parse(parts[2]); - int startSeconds = int.Parse(parts[3]); - int startMilliseconds = FramesToMillisecondsMax999(int.Parse(parts[4])); - - int endHours = 0; - if (parts[5 + 2] != "--") - { - endHours = int.Parse(parts[5 + 2]); - } - - int endMinutes = 0; - if (parts[6 + 2] != "--") - { - endMinutes = int.Parse(parts[6 + 2]); - } - - int endSeconds = 0; - if (parts[7 + 2] != "--") - { - endSeconds = int.Parse(parts[7 + 2]); - } - - int endMilliseconds = 0; - if (parts[8 + 2] != "--") - { - endMilliseconds = FramesToMillisecondsMax999(int.Parse(parts[8 + 2])); - } - - paragraph.StartTime = new TimeCode(startHours, startMinutes, startSeconds, startMilliseconds); - paragraph.EndTime = new TimeCode(endHours, endMinutes, endSeconds, endMilliseconds); - return true; - } - catch - { - return false; - } - } - return false; - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class SwiftTextLineNOAndDur : SubtitleFormat + { + private enum ExpectingLine + { + TimeCodes, + Text + } + + private Paragraph _paragraph; + private StringBuilder _text = new StringBuilder(); + private ExpectingLine _expecting = ExpectingLine.TimeCodes; + + private static readonly Regex RegexTimeCodes = new Regex(@"^SUBTITLE: \d+\s+TIMEIN:\s*[0123456789-]+:[0123456789-]+:[0123456789-]+:[0123456789-]+\s*DURATION:\s*[0123456789-]+:[0123456789-]+\s+TIMEOUT:\s*[0123456789-]+:[0123456789-]+:[0123456789-]+:[0123456789-]+$", RegexOptions.Compiled); + + public override string Extension => ".txt"; + + public override string Name => "Swift text line# +dur"; + + public override bool IsMine(List lines, string fileName) + { + if (lines != null && lines.Count > 2 && !string.IsNullOrEmpty(lines[0]) && lines[0].Contains("{QTtext}")) + { + return false; + } + + return base.IsMine(lines, fileName); + } + + public override string ToText(Subtitle subtitle, string title) + { + //SUBTITLE: 1 TIMEIN: 00:00:07:01 DURATION: 03:11 TIMEOUT: 00:00:10:12 + //Voor de oorlog + + //SUBTITLE: 2 TIMEIN: 00:00:10:16 DURATION: 01:08 TIMEOUT: 00:00:11:24 + //Ik ben Marie Pinhas. Ik ben geboren + //in Thessaloniki in Griekenland, + + //SUBTITLE: 3 TIMEIN: 00:00:12:12 DURATION: 02:10 TIMEOUT: 00:00:14:22 + //op 6 maart '31, + //in een heel oude Griekse familie. + + const string paragraphWriteFormat = "SUBTITLE: {1}\tTIMEIN: {0}\tDURATION: {4}\tTIMEOUT: {2}\r\n{3}\r\n"; + + var sb = new StringBuilder(); + int count = 1; + foreach (Paragraph p in subtitle.Paragraphs) + { + // to avoid rounding errors in duration + var startFrame = MillisecondsToFramesMaxFrameRate(p.StartTime.Milliseconds); + var endFrame = MillisecondsToFramesMaxFrameRate(p.EndTime.Milliseconds); + var durationCalc = new Paragraph( + new TimeCode(p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, FramesToMillisecondsMax999(startFrame)), + new TimeCode(p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, FramesToMillisecondsMax999(endFrame)), + string.Empty); + + string startTime = $"{p.StartTime.Hours:00}:{p.StartTime.Minutes:00}:{p.StartTime.Seconds:00}:{startFrame:00}"; + string timeOut = $"{p.EndTime.Hours:00}:{p.EndTime.Minutes:00}:{p.EndTime.Seconds:00}:{endFrame:00}"; + string timeDuration = $"{durationCalc.Duration.Seconds:00}:{MillisecondsToFramesMaxFrameRate(durationCalc.Duration.Milliseconds):00}"; + sb.AppendLine(string.Format(paragraphWriteFormat, startTime, count, timeOut, p.Text, timeDuration)); + count++; + } + return sb.ToString().Trim(); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _paragraph = new Paragraph(); + _expecting = ExpectingLine.TimeCodes; + _errorCount = 0; + + subtitle.Paragraphs.Clear(); + foreach (string line in lines) + { + ReadLine(subtitle, line); + if (_text.Length > 1000) + { + return; + } + } + if (_text != null && _text.ToString().TrimStart().Length > 0) + { + _paragraph.Text = _text.ToString().Trim(); + subtitle.Paragraphs.Add(_paragraph); + } + + subtitle.Renumber(); + } + + private void ReadLine(Subtitle subtitle, string line) + { + switch (_expecting) + { + case ExpectingLine.TimeCodes: + if (TryReadTimeCodesLine(line, _paragraph)) + { + _text = new StringBuilder(); + _expecting = ExpectingLine.Text; + } + else if (!string.IsNullOrWhiteSpace(line)) + { + _errorCount++; + _expecting = ExpectingLine.Text; // lets go to next paragraph + } + break; + case ExpectingLine.Text: + if (!string.IsNullOrWhiteSpace(line)) + { + _text.AppendLine(line.TrimEnd()); + } + else if (_paragraph != null && _paragraph.EndTime.TotalMilliseconds > 0) + { + _paragraph.Text = _text.ToString().Trim(); + subtitle.Paragraphs.Add(_paragraph); + _paragraph = new Paragraph(); + _expecting = ExpectingLine.TimeCodes; + } + else + { + _errorCount++; + } + break; + } + } + + private static bool TryReadTimeCodesLine(string line, Paragraph paragraph) + { + line = line.Trim(); + if (line.Length > 20 && line.StartsWith("SUBTITLE:", StringComparison.Ordinal) && RegexTimeCodes.IsMatch(line)) + { + //SUBTITLE: 1 TIMEIN: 00:00:07:01 DURATION: 03:11 TIMEOUT: 00:00:10:12 + string s = line.Replace("SUBTITLE:", string.Empty).Replace("TIMEIN", string.Empty).Replace("DURATION", string.Empty).Replace("TIMEOUT", string.Empty).RemoveChar(' ').Replace("\t", string.Empty); + string[] parts = s.Split(':'); + try + { + int startHours = int.Parse(parts[1]); + int startMinutes = int.Parse(parts[2]); + int startSeconds = int.Parse(parts[3]); + int startMilliseconds = FramesToMillisecondsMax999(int.Parse(parts[4])); + + int endHours = 0; + if (parts[5 + 2] != "--") + { + endHours = int.Parse(parts[5 + 2]); + } + + int endMinutes = 0; + if (parts[6 + 2] != "--") + { + endMinutes = int.Parse(parts[6 + 2]); + } + + int endSeconds = 0; + if (parts[7 + 2] != "--") + { + endSeconds = int.Parse(parts[7 + 2]); + } + + int endMilliseconds = 0; + if (parts[8 + 2] != "--") + { + endMilliseconds = FramesToMillisecondsMax999(int.Parse(parts[8 + 2])); + } + + paragraph.StartTime = new TimeCode(startHours, startMinutes, startSeconds, startMilliseconds); + paragraph.EndTime = new TimeCode(endHours, endMinutes, endSeconds, endMilliseconds); + return true; + } + catch + { + return false; + } + } + return false; + } + + } +} diff --git a/libse/SubtitleFormats/SwiftTextLineNumber.cs b/src/libse/SubtitleFormats/SwiftTextLineNumber.cs similarity index 97% rename from libse/SubtitleFormats/SwiftTextLineNumber.cs rename to src/libse/SubtitleFormats/SwiftTextLineNumber.cs index c42e97df1..1f3b93206 100644 --- a/libse/SubtitleFormats/SwiftTextLineNumber.cs +++ b/src/libse/SubtitleFormats/SwiftTextLineNumber.cs @@ -1,175 +1,175 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class SwiftTextLineNumber : SubtitleFormat - { - private enum ExpectingLine - { - TimeCodes, - Text - } - - private Paragraph _paragraph; - private StringBuilder _text = new StringBuilder(); - private ExpectingLine _expecting = ExpectingLine.TimeCodes; - - private static readonly Regex RegexTimeCodes = new Regex(@"^SUBTITLE: \d+\s+TIMEIN:\s*[0123456789-]+:[0123456789-]+:[0123456789-]+:[0123456789-]+\s*TIMEOUT:\s*[0123456789-]+:[0123456789-]+:[0123456789-]+:[0123456789-]+$", RegexOptions.Compiled); - - public override string Extension => ".txt"; - - public override string Name => "Swift text line#"; - - public override bool IsMine(List lines, string fileName) - { - if (lines == null || lines.Count > 2 && !string.IsNullOrEmpty(lines[0]) && lines[0].Contains("{QTtext}")) - { - return false; - } - - return base.IsMine(lines, fileName); - } - - public override string ToText(Subtitle subtitle, string title) - { - //SUBTITLE: 1 TIMEIN: 00:00:00:00 TIMEOUT: 00:00:04:00 - //Voor de oorlog - - //SUBTITLE: 2 TIMEIN: 00:00:05:12 TIMEOUT: 00:00:10:02 - //Ik ben Marie Pinhas. Ik ben geboren - //in Thessaloniki in Griekenland, - - //SUBTITLE: 3 TIMEIN: 00:00:10:06 TIMEOUT: 00:00:15:17 - //op 6 maart '31, - //in een heel oude Griekse familie. - - const string paragraphWriteFormat = "SUBTITLE: {1}\tTIMEIN: {0}\tTIMEOUT: {2}\r\n{3}\r\n"; - - var sb = new StringBuilder(); - int count = 1; - foreach (var p in subtitle.Paragraphs) - { - string startTime = $"{p.StartTime.Hours:00}:{p.StartTime.Minutes:00}:{p.StartTime.Seconds:00}:{MillisecondsToFramesMaxFrameRate(p.StartTime.Milliseconds):00}"; - string timeOut = $"{p.EndTime.Hours:00}:{p.EndTime.Minutes:00}:{p.EndTime.Seconds:00}:{MillisecondsToFramesMaxFrameRate(p.EndTime.Milliseconds):00}"; - sb.AppendLine(string.Format(paragraphWriteFormat, startTime, count, timeOut, p.Text)); - count++; - } - return sb.ToString().Trim(); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _paragraph = new Paragraph(); - _expecting = ExpectingLine.TimeCodes; - _errorCount = 0; - - subtitle.Paragraphs.Clear(); - foreach (string line in lines) - { - ReadLine(subtitle, line); - if (_text.Length > 1000) - { - return; - } - } - if (_text != null && _text.ToString().TrimStart().Length > 0) - { - _paragraph.Text = _text.ToString().Trim(); - subtitle.Paragraphs.Add(_paragraph); - } - - subtitle.Renumber(); - } - - private void ReadLine(Subtitle subtitle, string line) - { - switch (_expecting) - { - case ExpectingLine.TimeCodes: - if (TryReadTimeCodesLine(line, _paragraph)) - { - _text = new StringBuilder(); - _expecting = ExpectingLine.Text; - } - else if (!string.IsNullOrWhiteSpace(line)) - { - _errorCount++; - _expecting = ExpectingLine.Text; // lets go to next paragraph - } - break; - case ExpectingLine.Text: - if (!string.IsNullOrWhiteSpace(line)) - { - _text.AppendLine(line.TrimEnd()); - } - else if (_paragraph != null && _paragraph.EndTime.TotalMilliseconds > 0) - { - _paragraph.Text = _text.ToString().Trim(); - subtitle.Paragraphs.Add(_paragraph); - _paragraph = new Paragraph(); - _expecting = ExpectingLine.TimeCodes; - } - else - { - _errorCount++; - } - break; - } - } - - private static bool TryReadTimeCodesLine(string line, Paragraph paragraph) - { - line = line.Trim(); - if (line.Length > 20 && line.StartsWith("SUBTITLE:", StringComparison.Ordinal) && RegexTimeCodes.IsMatch(line)) - { - //SUBTITLE: 59 TIMEIN: 00:04:28:06 TIMEOUT: 00:04:32:12 - string s = line.Replace("SUBTITLE:", string.Empty).Replace("TIMEIN", string.Empty).Replace("TIMEOUT", string.Empty).RemoveChar(' ').Replace("\t", string.Empty); - string[] parts = s.Split(':'); - try - { - int startHours = int.Parse(parts[1]); - int startMinutes = int.Parse(parts[2]); - int startSeconds = int.Parse(parts[3]); - int startMilliseconds = FramesToMillisecondsMax999(int.Parse(parts[4])); - - int endHours = 0; - if (parts[5] != "--") - { - endHours = int.Parse(parts[5]); - } - - int endMinutes = 0; - if (parts[6] != "--") - { - endMinutes = int.Parse(parts[6]); - } - - int endSeconds = 0; - if (parts[7] != "--") - { - endSeconds = int.Parse(parts[7]); - } - - int endMilliseconds = 0; - if (parts[8] != "--") - { - endMilliseconds = FramesToMillisecondsMax999(int.Parse(parts[8])); - } - - paragraph.StartTime = new TimeCode(startHours, startMinutes, startSeconds, startMilliseconds); - paragraph.EndTime = new TimeCode(endHours, endMinutes, endSeconds, endMilliseconds); - return true; - } - catch - { - return false; - } - } - return false; - } - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class SwiftTextLineNumber : SubtitleFormat + { + private enum ExpectingLine + { + TimeCodes, + Text + } + + private Paragraph _paragraph; + private StringBuilder _text = new StringBuilder(); + private ExpectingLine _expecting = ExpectingLine.TimeCodes; + + private static readonly Regex RegexTimeCodes = new Regex(@"^SUBTITLE: \d+\s+TIMEIN:\s*[0123456789-]+:[0123456789-]+:[0123456789-]+:[0123456789-]+\s*TIMEOUT:\s*[0123456789-]+:[0123456789-]+:[0123456789-]+:[0123456789-]+$", RegexOptions.Compiled); + + public override string Extension => ".txt"; + + public override string Name => "Swift text line#"; + + public override bool IsMine(List lines, string fileName) + { + if (lines == null || lines.Count > 2 && !string.IsNullOrEmpty(lines[0]) && lines[0].Contains("{QTtext}")) + { + return false; + } + + return base.IsMine(lines, fileName); + } + + public override string ToText(Subtitle subtitle, string title) + { + //SUBTITLE: 1 TIMEIN: 00:00:00:00 TIMEOUT: 00:00:04:00 + //Voor de oorlog + + //SUBTITLE: 2 TIMEIN: 00:00:05:12 TIMEOUT: 00:00:10:02 + //Ik ben Marie Pinhas. Ik ben geboren + //in Thessaloniki in Griekenland, + + //SUBTITLE: 3 TIMEIN: 00:00:10:06 TIMEOUT: 00:00:15:17 + //op 6 maart '31, + //in een heel oude Griekse familie. + + const string paragraphWriteFormat = "SUBTITLE: {1}\tTIMEIN: {0}\tTIMEOUT: {2}\r\n{3}\r\n"; + + var sb = new StringBuilder(); + int count = 1; + foreach (var p in subtitle.Paragraphs) + { + string startTime = $"{p.StartTime.Hours:00}:{p.StartTime.Minutes:00}:{p.StartTime.Seconds:00}:{MillisecondsToFramesMaxFrameRate(p.StartTime.Milliseconds):00}"; + string timeOut = $"{p.EndTime.Hours:00}:{p.EndTime.Minutes:00}:{p.EndTime.Seconds:00}:{MillisecondsToFramesMaxFrameRate(p.EndTime.Milliseconds):00}"; + sb.AppendLine(string.Format(paragraphWriteFormat, startTime, count, timeOut, p.Text)); + count++; + } + return sb.ToString().Trim(); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _paragraph = new Paragraph(); + _expecting = ExpectingLine.TimeCodes; + _errorCount = 0; + + subtitle.Paragraphs.Clear(); + foreach (string line in lines) + { + ReadLine(subtitle, line); + if (_text.Length > 1000) + { + return; + } + } + if (_text != null && _text.ToString().TrimStart().Length > 0) + { + _paragraph.Text = _text.ToString().Trim(); + subtitle.Paragraphs.Add(_paragraph); + } + + subtitle.Renumber(); + } + + private void ReadLine(Subtitle subtitle, string line) + { + switch (_expecting) + { + case ExpectingLine.TimeCodes: + if (TryReadTimeCodesLine(line, _paragraph)) + { + _text = new StringBuilder(); + _expecting = ExpectingLine.Text; + } + else if (!string.IsNullOrWhiteSpace(line)) + { + _errorCount++; + _expecting = ExpectingLine.Text; // lets go to next paragraph + } + break; + case ExpectingLine.Text: + if (!string.IsNullOrWhiteSpace(line)) + { + _text.AppendLine(line.TrimEnd()); + } + else if (_paragraph != null && _paragraph.EndTime.TotalMilliseconds > 0) + { + _paragraph.Text = _text.ToString().Trim(); + subtitle.Paragraphs.Add(_paragraph); + _paragraph = new Paragraph(); + _expecting = ExpectingLine.TimeCodes; + } + else + { + _errorCount++; + } + break; + } + } + + private static bool TryReadTimeCodesLine(string line, Paragraph paragraph) + { + line = line.Trim(); + if (line.Length > 20 && line.StartsWith("SUBTITLE:", StringComparison.Ordinal) && RegexTimeCodes.IsMatch(line)) + { + //SUBTITLE: 59 TIMEIN: 00:04:28:06 TIMEOUT: 00:04:32:12 + string s = line.Replace("SUBTITLE:", string.Empty).Replace("TIMEIN", string.Empty).Replace("TIMEOUT", string.Empty).RemoveChar(' ').Replace("\t", string.Empty); + string[] parts = s.Split(':'); + try + { + int startHours = int.Parse(parts[1]); + int startMinutes = int.Parse(parts[2]); + int startSeconds = int.Parse(parts[3]); + int startMilliseconds = FramesToMillisecondsMax999(int.Parse(parts[4])); + + int endHours = 0; + if (parts[5] != "--") + { + endHours = int.Parse(parts[5]); + } + + int endMinutes = 0; + if (parts[6] != "--") + { + endMinutes = int.Parse(parts[6]); + } + + int endSeconds = 0; + if (parts[7] != "--") + { + endSeconds = int.Parse(parts[7]); + } + + int endMilliseconds = 0; + if (parts[8] != "--") + { + endMilliseconds = FramesToMillisecondsMax999(int.Parse(parts[8])); + } + + paragraph.StartTime = new TimeCode(startHours, startMinutes, startSeconds, startMilliseconds); + paragraph.EndTime = new TimeCode(endHours, endMinutes, endSeconds, endMilliseconds); + return true; + } + catch + { + return false; + } + } + return false; + } + } +} diff --git a/libse/SubtitleFormats/TMPlayer.cs b/src/libse/SubtitleFormats/TMPlayer.cs similarity index 97% rename from libse/SubtitleFormats/TMPlayer.cs rename to src/libse/SubtitleFormats/TMPlayer.cs index 92740a29b..19896e214 100644 --- a/libse/SubtitleFormats/TMPlayer.cs +++ b/src/libse/SubtitleFormats/TMPlayer.cs @@ -1,132 +1,132 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class TMPlayer : SubtitleFormat - { - private static readonly Regex RegexTimeCodes = new Regex(@"^\d+:\d\d:\d\d[: ].*$", RegexOptions.Compiled); // accept a " " instead of the last ":" too - - public override string Extension => ".txt"; - - public override string Name => "TMPlayer"; - - public override bool IsMine(List lines, string fileName) - { - var subtitle = new Subtitle(); - LoadSubtitle(subtitle, lines, fileName); - - if (subtitle.Paragraphs.Count > 4) - { - bool allStartWithNumber = true; - foreach (Paragraph p in subtitle.Paragraphs) - { - if (p.Text.Length > 1 && !Utilities.IsInteger(p.Text.Substring(0, 2))) - { - allStartWithNumber = false; - break; - } - } - if (allStartWithNumber) - { - return false; - } - } - if (subtitle.Paragraphs.Count > _errorCount) - { - if (new UnknownSubtitle33().IsMine(lines, fileName) || new UnknownSubtitle36().IsMine(lines, fileName)) - { - return false; - } - - return true; - } - return false; - } - - public override string ToText(Subtitle subtitle, string title) - { - var sb = new StringBuilder(); - foreach (Paragraph p in subtitle.Paragraphs) - { - string text = HtmlUtil.RemoveHtmlTags(p.Text); - text = text.Replace(Environment.NewLine, "|"); - sb.AppendLine($"{p.StartTime.Hours:00}:{p.StartTime.Minutes:00}:{p.StartTime.Seconds:00}:{text}"); - } - return sb.ToString().Trim(); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { // 0:02:36:You've returned to the village|after 2 years, Shekhar. - // 00:00:50:America has made my fortune. - _errorCount = 0; - foreach (string line in lines) - { - bool success = false; - if (line.IndexOf(':') > 0 && RegexTimeCodes.Match(line).Success) - { - try - { - string s = line; - if (line.Length > 9 && line[8] == ' ') - { - s = line.Substring(0, 8) + ":" + line.Substring(9); - } - - string[] parts = s.Split(':'); - if (parts.Length > 3) - { - int hours = int.Parse(parts[0]); - int minutes = int.Parse(parts[1]); - int seconds = int.Parse(parts[2]); - string text = string.Empty; - for (int i = 3; i < parts.Length; i++) - { - if (text.Length == 0) - { - text = parts[i]; - } - else - { - text += ":" + parts[i]; - } - } - text = text.Replace("|", Environment.NewLine); - var start = new TimeCode(hours, minutes, seconds, 0); - double duration = Utilities.GetOptimalDisplayMilliseconds(text); - var end = new TimeCode(start.TotalMilliseconds + duration); - - var p = new Paragraph(start, end, text); - subtitle.Paragraphs.Add(p); - success = true; - } - } - catch - { - _errorCount++; - } - } - if (!success) - { - _errorCount++; - } - } - - int index = 0; - foreach (Paragraph p in subtitle.Paragraphs) - { - Paragraph next = subtitle.GetParagraphOrDefault(index + 1); - if (next != null && next.StartTime.TotalMilliseconds <= p.EndTime.TotalMilliseconds) - { - p.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - 1; - } - - index++; - p.Number = index; - } - } - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class TMPlayer : SubtitleFormat + { + private static readonly Regex RegexTimeCodes = new Regex(@"^\d+:\d\d:\d\d[: ].*$", RegexOptions.Compiled); // accept a " " instead of the last ":" too + + public override string Extension => ".txt"; + + public override string Name => "TMPlayer"; + + public override bool IsMine(List lines, string fileName) + { + var subtitle = new Subtitle(); + LoadSubtitle(subtitle, lines, fileName); + + if (subtitle.Paragraphs.Count > 4) + { + bool allStartWithNumber = true; + foreach (Paragraph p in subtitle.Paragraphs) + { + if (p.Text.Length > 1 && !Utilities.IsInteger(p.Text.Substring(0, 2))) + { + allStartWithNumber = false; + break; + } + } + if (allStartWithNumber) + { + return false; + } + } + if (subtitle.Paragraphs.Count > _errorCount) + { + if (new UnknownSubtitle33().IsMine(lines, fileName) || new UnknownSubtitle36().IsMine(lines, fileName)) + { + return false; + } + + return true; + } + return false; + } + + public override string ToText(Subtitle subtitle, string title) + { + var sb = new StringBuilder(); + foreach (Paragraph p in subtitle.Paragraphs) + { + string text = HtmlUtil.RemoveHtmlTags(p.Text); + text = text.Replace(Environment.NewLine, "|"); + sb.AppendLine($"{p.StartTime.Hours:00}:{p.StartTime.Minutes:00}:{p.StartTime.Seconds:00}:{text}"); + } + return sb.ToString().Trim(); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { // 0:02:36:You've returned to the village|after 2 years, Shekhar. + // 00:00:50:America has made my fortune. + _errorCount = 0; + foreach (string line in lines) + { + bool success = false; + if (line.IndexOf(':') > 0 && RegexTimeCodes.Match(line).Success) + { + try + { + string s = line; + if (line.Length > 9 && line[8] == ' ') + { + s = line.Substring(0, 8) + ":" + line.Substring(9); + } + + string[] parts = s.Split(':'); + if (parts.Length > 3) + { + int hours = int.Parse(parts[0]); + int minutes = int.Parse(parts[1]); + int seconds = int.Parse(parts[2]); + string text = string.Empty; + for (int i = 3; i < parts.Length; i++) + { + if (text.Length == 0) + { + text = parts[i]; + } + else + { + text += ":" + parts[i]; + } + } + text = text.Replace("|", Environment.NewLine); + var start = new TimeCode(hours, minutes, seconds, 0); + double duration = Utilities.GetOptimalDisplayMilliseconds(text); + var end = new TimeCode(start.TotalMilliseconds + duration); + + var p = new Paragraph(start, end, text); + subtitle.Paragraphs.Add(p); + success = true; + } + } + catch + { + _errorCount++; + } + } + if (!success) + { + _errorCount++; + } + } + + int index = 0; + foreach (Paragraph p in subtitle.Paragraphs) + { + Paragraph next = subtitle.GetParagraphOrDefault(index + 1); + if (next != null && next.StartTime.TotalMilliseconds <= p.EndTime.TotalMilliseconds) + { + p.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - 1; + } + + index++; + p.Number = index; + } + } + } +} diff --git a/libse/SubtitleFormats/TSB4.cs b/src/libse/SubtitleFormats/TSB4.cs similarity index 97% rename from libse/SubtitleFormats/TSB4.cs rename to src/libse/SubtitleFormats/TSB4.cs index a6864fd5d..07e8e6f95 100644 --- a/libse/SubtitleFormats/TSB4.cs +++ b/src/libse/SubtitleFormats/TSB4.cs @@ -1,151 +1,151 @@ -using System.Collections.Generic; -using System.Text; -using System; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - /// - /// SubtitleNext - /// - public class TSB4 : SubtitleFormat - { - public override string Extension => ".sub"; - - public override string Name => "TSB4"; - - public override string ToText(Subtitle subtitle, string title) - { - return "Not supported!"; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - var spaceMode = true; - subtitle.Paragraphs.Clear(); - if (string.IsNullOrEmpty(fileName)) - { - return; - } - byte[] array; - try - { - array = FileUtil.ReadAllBytesShared(fileName); - } - catch - { - _errorCount++; - return; - } - if (array.Length < 100 || array[0] != 84 || array[1] != 83 || array[2] != 66 || array[3] != 52) - { - return; - } - - int codePage = 0; // use default code page if not found - - for (int i = 0; i < array.Length - 20; i++) - { - if (array[i] == 67 && array[i + 1] == 80 && array[i + 2] == 65 && array[i + 3] == 71 && array[i + 4] == 4 && array[i + 5] == 0 && array[i + 6] == 0 && array[i + 7] == 0) // CPAG - { - codePage = array[i + 8] + array[i + 9] * 256; - i += 12; - } - if (array[i] == 84 && array[i + 1] == 73 && array[i + 2] == 84 && array[i + 3] == 76 && array[i + 8] == 84 && array[i + 9] == 73 && array[i + 10] == 77 && array[i + 11] == 69) // TITL + TIME - { - if (array[i + 5] != 32) - { - spaceMode = false; - } - - int endOfText = array[i + 4]; - if (!spaceMode) - { - endOfText += array[i + 5] * 256; - } - - int start = array[i + 16] + array[i + 17] * 256; - if (array[i + 18] != 32 || !spaceMode) - { - start += array[i + 18] * 256 * 256; - } - - int end = array[i + 20] + array[i + 21] * 256; - if (array[i + 22] != 32 || !spaceMode) - { - end += array[i + 22] * 256 * 256; - } - - int textStart = i; - while (textStart <= i + endOfText + 4 && !(array[textStart] == 0x4C && array[textStart + 1] == 0x49 && array[textStart + 2] == 0x4E && array[textStart + 3] == 0x45)) // LINE - { - textStart++; - } - int length = array[textStart + 4]; - if (array[textStart + 5] != 32 || !spaceMode) - { - length += array[textStart + 5] * 256; - } - - textStart += 8; - - string text = string.Empty; - if (textStart + length > array.Length) - { - if (textStart < array.Length) - { - text = Encoding.GetEncoding(codePage).GetString(array, textStart, array.Length - textStart); - } - } - else - { - text = Encoding.GetEncoding(codePage).GetString(array, textStart, length); - } - text = FixItalicsAndBinaryZero(text); - text = string.Join(Environment.NewLine, text.SplitToLines()); //conform to CRLF - text = text.Replace(" " + Environment.NewLine, Environment.NewLine).Trim(); - var item = new Paragraph(text, FramesToMilliseconds(start), FramesToMilliseconds(end)); - subtitle.Paragraphs.Add(item); - i += endOfText + 5; - } - } - subtitle.RemoveEmptyLines(); - subtitle.Renumber(); - } - - private static string FixItalicsAndBinaryZero(string text) - { - var sb = new StringBuilder(text.Length + 5); - var italicOn = false; - for (int i = 0; i < text.Length; i++) - { - var ch = text[i]; - switch (ch) - { - case '\u007f': - sb.Append(italicOn ? "
" : ""); - italicOn = !italicOn; - break; - case '\r': - case '\n': - if (italicOn) - { - sb.Append(""); - italicOn = false; - } - sb.Append(ch); - break; - case '\0': - sb.Append(" "); - break; - default: - sb.Append(ch); - break; - } - } - return sb.ToString().Trim(); - } - - } -} +using System.Collections.Generic; +using System.Text; +using System; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + /// + /// SubtitleNext + /// + public class TSB4 : SubtitleFormat + { + public override string Extension => ".sub"; + + public override string Name => "TSB4"; + + public override string ToText(Subtitle subtitle, string title) + { + return "Not supported!"; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + var spaceMode = true; + subtitle.Paragraphs.Clear(); + if (string.IsNullOrEmpty(fileName)) + { + return; + } + byte[] array; + try + { + array = FileUtil.ReadAllBytesShared(fileName); + } + catch + { + _errorCount++; + return; + } + if (array.Length < 100 || array[0] != 84 || array[1] != 83 || array[2] != 66 || array[3] != 52) + { + return; + } + + int codePage = 0; // use default code page if not found + + for (int i = 0; i < array.Length - 20; i++) + { + if (array[i] == 67 && array[i + 1] == 80 && array[i + 2] == 65 && array[i + 3] == 71 && array[i + 4] == 4 && array[i + 5] == 0 && array[i + 6] == 0 && array[i + 7] == 0) // CPAG + { + codePage = array[i + 8] + array[i + 9] * 256; + i += 12; + } + if (array[i] == 84 && array[i + 1] == 73 && array[i + 2] == 84 && array[i + 3] == 76 && array[i + 8] == 84 && array[i + 9] == 73 && array[i + 10] == 77 && array[i + 11] == 69) // TITL + TIME + { + if (array[i + 5] != 32) + { + spaceMode = false; + } + + int endOfText = array[i + 4]; + if (!spaceMode) + { + endOfText += array[i + 5] * 256; + } + + int start = array[i + 16] + array[i + 17] * 256; + if (array[i + 18] != 32 || !spaceMode) + { + start += array[i + 18] * 256 * 256; + } + + int end = array[i + 20] + array[i + 21] * 256; + if (array[i + 22] != 32 || !spaceMode) + { + end += array[i + 22] * 256 * 256; + } + + int textStart = i; + while (textStart <= i + endOfText + 4 && !(array[textStart] == 0x4C && array[textStart + 1] == 0x49 && array[textStart + 2] == 0x4E && array[textStart + 3] == 0x45)) // LINE + { + textStart++; + } + int length = array[textStart + 4]; + if (array[textStart + 5] != 32 || !spaceMode) + { + length += array[textStart + 5] * 256; + } + + textStart += 8; + + string text = string.Empty; + if (textStart + length > array.Length) + { + if (textStart < array.Length) + { + text = Encoding.GetEncoding(codePage).GetString(array, textStart, array.Length - textStart); + } + } + else + { + text = Encoding.GetEncoding(codePage).GetString(array, textStart, length); + } + text = FixItalicsAndBinaryZero(text); + text = string.Join(Environment.NewLine, text.SplitToLines()); //conform to CRLF + text = text.Replace(" " + Environment.NewLine, Environment.NewLine).Trim(); + var item = new Paragraph(text, FramesToMilliseconds(start), FramesToMilliseconds(end)); + subtitle.Paragraphs.Add(item); + i += endOfText + 5; + } + } + subtitle.RemoveEmptyLines(); + subtitle.Renumber(); + } + + private static string FixItalicsAndBinaryZero(string text) + { + var sb = new StringBuilder(text.Length + 5); + var italicOn = false; + for (int i = 0; i < text.Length; i++) + { + var ch = text[i]; + switch (ch) + { + case '\u007f': + sb.Append(italicOn ? "
" : ""); + italicOn = !italicOn; + break; + case '\r': + case '\n': + if (italicOn) + { + sb.Append(""); + italicOn = false; + } + sb.Append(ch); + break; + case '\0': + sb.Append(" "); + break; + default: + sb.Append(ch); + break; + } + } + return sb.ToString().Trim(); + } + + } +} diff --git a/libse/SubtitleFormats/Ted20.cs b/src/libse/SubtitleFormats/Ted20.cs similarity index 100% rename from libse/SubtitleFormats/Ted20.cs rename to src/libse/SubtitleFormats/Ted20.cs diff --git a/libse/SubtitleFormats/Tek.cs b/src/libse/SubtitleFormats/Tek.cs similarity index 97% rename from libse/SubtitleFormats/Tek.cs rename to src/libse/SubtitleFormats/Tek.cs index 04dbf8882..39aedce44 100644 --- a/libse/SubtitleFormats/Tek.cs +++ b/src/libse/SubtitleFormats/Tek.cs @@ -1,107 +1,107 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class Tek : SubtitleFormat - { - private static readonly Regex RegexTimeCode = new Regex(@"^\d+ \d+ \d \d \d$", RegexOptions.Compiled); - - public override string Extension => ".tek"; - - public override string Name => "TEK"; - - public override bool IsTimeBased => false; - - public override string ToText(Subtitle subtitle, string title) - { - //1. - //8.03 - //10.06 - //- Labai aèiû. - //- Jûs rimtai? - - //2. - //16.00 - //19.06 - //Kaip reikalai ðunø grobimo versle? - - const string paragraphWriteFormat = "{0} {1} 1 1 0\r\n{2}"; - var sb = new StringBuilder(); - sb.AppendLine(@"ý Smart Titl Editor / Smart Titler (A)(C)1992-2001. Dragutin Nikolic -ý Serial No: XXXXXXXXXXXXXX -ý Korisnik: Prava i Prevodi - prevodioci -ý -ý KONFIGURACIONI PODACI -ý Dozvoljeno slova u redu: 30 -ý Vremenska korekcija: 1.0000000000E+00 -ý Radjeno vremenskih korekcija: TRUE -ý Slovni raspored ASCIR -ý -ý Kraj info blocka."); - sb.AppendLine(); - foreach (Paragraph p in subtitle.Paragraphs) - { - var text = HtmlUtil.RemoveOpenCloseTags(p.Text, HtmlUtil.TagFont); - sb.AppendLine(string.Format(paragraphWriteFormat, MillisecondsToFrames(p.StartTime.TotalMilliseconds), MillisecondsToFrames(p.EndTime.TotalMilliseconds), text)); - } - return sb.ToString().Trim(); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - Paragraph paragraph = null; - _errorCount = 0; - - subtitle.Paragraphs.Clear(); - foreach (string line in lines) - { - string s = line.Trim(); - if (RegexTimeCode.IsMatch(s)) - { - if (paragraph != null) - { - subtitle.Paragraphs.Add(paragraph); - } - - paragraph = new Paragraph(); - string[] parts = line.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); - if (parts.Length == 5) - { - try - { - paragraph.StartTime.TotalMilliseconds = FramesToMilliseconds(int.Parse(parts[0])); - paragraph.EndTime.TotalMilliseconds = FramesToMilliseconds(int.Parse(parts[1])); - } - catch - { - _errorCount++; - } - } - } - else if (paragraph != null && s.Length > 0) - { - paragraph.Text = (paragraph.Text + Environment.NewLine + s).Trim(); - if (paragraph.Text.Length > 2000) - { - _errorCount += 100; - return; - } - } - else if (s.Length > 0 && !s.StartsWith('ý')) - { - _errorCount++; - } - } - if (paragraph != null) - { - subtitle.Paragraphs.Add(paragraph); - } - - subtitle.Renumber(); - } - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class Tek : SubtitleFormat + { + private static readonly Regex RegexTimeCode = new Regex(@"^\d+ \d+ \d \d \d$", RegexOptions.Compiled); + + public override string Extension => ".tek"; + + public override string Name => "TEK"; + + public override bool IsTimeBased => false; + + public override string ToText(Subtitle subtitle, string title) + { + //1. + //8.03 + //10.06 + //- Labai aèiû. + //- Jûs rimtai? + + //2. + //16.00 + //19.06 + //Kaip reikalai ðunø grobimo versle? + + const string paragraphWriteFormat = "{0} {1} 1 1 0\r\n{2}"; + var sb = new StringBuilder(); + sb.AppendLine(@"ý Smart Titl Editor / Smart Titler (A)(C)1992-2001. Dragutin Nikolic +ý Serial No: XXXXXXXXXXXXXX +ý Korisnik: Prava i Prevodi - prevodioci +ý +ý KONFIGURACIONI PODACI +ý Dozvoljeno slova u redu: 30 +ý Vremenska korekcija: 1.0000000000E+00 +ý Radjeno vremenskih korekcija: TRUE +ý Slovni raspored ASCIR +ý +ý Kraj info blocka."); + sb.AppendLine(); + foreach (Paragraph p in subtitle.Paragraphs) + { + var text = HtmlUtil.RemoveOpenCloseTags(p.Text, HtmlUtil.TagFont); + sb.AppendLine(string.Format(paragraphWriteFormat, MillisecondsToFrames(p.StartTime.TotalMilliseconds), MillisecondsToFrames(p.EndTime.TotalMilliseconds), text)); + } + return sb.ToString().Trim(); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + Paragraph paragraph = null; + _errorCount = 0; + + subtitle.Paragraphs.Clear(); + foreach (string line in lines) + { + string s = line.Trim(); + if (RegexTimeCode.IsMatch(s)) + { + if (paragraph != null) + { + subtitle.Paragraphs.Add(paragraph); + } + + paragraph = new Paragraph(); + string[] parts = line.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + if (parts.Length == 5) + { + try + { + paragraph.StartTime.TotalMilliseconds = FramesToMilliseconds(int.Parse(parts[0])); + paragraph.EndTime.TotalMilliseconds = FramesToMilliseconds(int.Parse(parts[1])); + } + catch + { + _errorCount++; + } + } + } + else if (paragraph != null && s.Length > 0) + { + paragraph.Text = (paragraph.Text + Environment.NewLine + s).Trim(); + if (paragraph.Text.Length > 2000) + { + _errorCount += 100; + return; + } + } + else if (s.Length > 0 && !s.StartsWith('ý')) + { + _errorCount++; + } + } + if (paragraph != null) + { + subtitle.Paragraphs.Add(paragraph); + } + + subtitle.Renumber(); + } + } +} diff --git a/libse/SubtitleFormats/TextST.cs b/src/libse/SubtitleFormats/TextST.cs similarity index 97% rename from libse/SubtitleFormats/TextST.cs rename to src/libse/SubtitleFormats/TextST.cs index 69864a6ed..dce658ae7 100644 --- a/libse/SubtitleFormats/TextST.cs +++ b/src/libse/SubtitleFormats/TextST.cs @@ -1,1189 +1,1189 @@ -using Nikse.SubtitleEdit.Core.BluRaySup; -using Nikse.SubtitleEdit.Core.ContainerFormats.TransportStream; -using Nikse.SubtitleEdit.Core.VobSub; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.IO; -using System.Text; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public static class StreamExtensions - { - - public static void WritePts(this Stream stream, ulong pts) - { - //TODO: check max - var buffer = BitConverter.GetBytes(pts); - if (BitConverter.IsLittleEndian) - { - stream.WriteByte(buffer[4]); - stream.WriteByte(buffer[3]); - stream.WriteByte(buffer[2]); - stream.WriteByte(buffer[1]); - stream.WriteByte(buffer[0]); - } - else - { - stream.WriteByte(buffer[buffer.Length - 1]); - stream.WriteByte(buffer[buffer.Length - 2]); - stream.WriteByte(buffer[buffer.Length - 3]); - stream.WriteByte(buffer[buffer.Length - 4]); - stream.WriteByte(buffer[buffer.Length - 5]); - } - } - - public static void WriteWord(this Stream stream, int value) - { - //TODO: check max - stream.WriteByte((byte)(value / 256)); - stream.WriteByte((byte)(value % 256)); - } - - public static void WriteWord(this Stream stream, int value, int firstBitValue) - { - //TODO: check max - var firstByte = (byte)(value / 256); - if (firstBitValue == 1) - { - firstByte = (byte)(firstByte | 0b10000000); - } - - stream.WriteByte(firstByte); - stream.WriteByte((byte)(value % 256)); - } - - public static void WriteByte(this Stream stream, int value, int firstBitValue) - { - //TODO: check max - var firstByte = (byte)(value); - if (firstBitValue == 1) - { - firstByte = (byte)(firstByte | 0b10000000); - } - - stream.WriteByte(firstByte); - } - } - - public class TextST : SubtitleFormat - { - public class Palette - { - public int PaletteEntryId { get; set; } - public int Y { get; set; } - public int Cr { get; set; } - public int Cb { get; set; } - public int T { get; set; } - - public Color Color - { - get - { - var arr = BluRaySupPalette.YCbCr2Rgb(Y, Cb, Cr, false); - return Color.FromArgb(T, arr[0], arr[1], arr[2]); - } - } - } - - public class RegionStyle - { - public RegionStyle() - { - } - - public RegionStyle(RegionStyle regionStyle) - { - RegionStyleId = regionStyle.RegionStyleId; - RegionHorizontalPosition = regionStyle.RegionHorizontalPosition; - RegionVerticalPosition = regionStyle.RegionVerticalPosition; - RegionWidth = regionStyle.RegionWidth; - RegionHeight = regionStyle.RegionHeight; - RegionBgPaletteEntryIdRef = regionStyle.RegionBgPaletteEntryIdRef; - TextBoxHorizontalPosition = regionStyle.TextBoxHorizontalPosition; - TextBoxVerticalPosition = regionStyle.TextBoxVerticalPosition; - TextBoxWidth = regionStyle.TextBoxWidth; - TextBoxHeight = regionStyle.TextBoxHeight; - TextFlow = regionStyle.TextFlow; - TextHorizontalAlignment = regionStyle.TextHorizontalAlignment; - TextVerticalAlignment = regionStyle.TextVerticalAlignment; - LineSpace = regionStyle.LineSpace; - FontIdRef = regionStyle.FontIdRef; - FontStyle = regionStyle.FontStyle; - FontSize = regionStyle.FontSize; - FontPaletteEntryIdRef = regionStyle.FontPaletteEntryIdRef; - FontOutlinePaletteEntryIdRef = regionStyle.FontOutlinePaletteEntryIdRef; - FontOutlineThickness = regionStyle.FontOutlineThickness; - } - - public int RegionStyleId { get; set; } - public int RegionHorizontalPosition { get; set; } - public int RegionVerticalPosition { get; set; } - public int RegionWidth { get; set; } - public int RegionHeight { get; set; } - public int RegionBgPaletteEntryIdRef { get; set; } - public int TextBoxHorizontalPosition { get; set; } - public int TextBoxVerticalPosition { get; set; } - public int TextBoxWidth { get; set; } - public int TextBoxHeight { get; set; } - public int TextFlow { get; set; } - public int TextHorizontalAlignment { get; set; } - public int TextVerticalAlignment { get; set; } - public int LineSpace { get; set; } - public int FontIdRef { get; set; } - public int FontStyle { get; set; } - public int FontSize { get; set; } - public int FontPaletteEntryIdRef { get; set; } - public int FontOutlinePaletteEntryIdRef { get; set; } - public int FontOutlineThickness { get; set; } - } - - public class UserStyle - { - public int UserStyleId { get; set; } - public int RegionHorizontalPositionDirection { get; set; } - public int RegionHorizontalPositionDelta { get; set; } - public int RegionVerticalPositionDirection { get; set; } - public int RegionVerticalPositionDelta { get; set; } - public int FontSizeIncDec { get; set; } - public int FontSizeDelta { get; set; } - public int TextBoxHorizontalPositionDirection { get; set; } - public int TextBoxHorizontalPositionDelta { get; set; } - public int TextBoxVerticalPositionDirection { get; set; } - public int TextBoxVerticalPositionDelta { get; set; } - public int TextBoxWidthIncDec { get; set; } - public int TextBoxWidthDelta { get; set; } - public int TextBoxHeightIncDec { get; set; } - public int TextBoxHeightDelta { get; set; } - public int LineSpaceIncDec { get; set; } - public int LineSpaceDelta { get; set; } - } - - public class DialogStyleSegment - { - public bool PlayerStyleFlag { get; set; } - public int NumberOfRegionStyles { get; set; } - public int NumberOfUserStyles { get; set; } - public List RegionStyles { get; set; } - public List UserStyles { get; set; } - public List Palettes { get; set; } - public int NumberOfDialogPresentationSegments { get; set; } - - public DialogStyleSegment() - { - PlayerStyleFlag = true; - RegionStyles = new List(); - UserStyles = new List(); - Palettes = new List(); - } - - public DialogStyleSegment(byte[] buffer) - { - PlayerStyleFlag = (buffer[9] & 0b10000000) > 0; - NumberOfRegionStyles = buffer[11]; - NumberOfUserStyles = buffer[12]; - - int idx = 13; - RegionStyles = new List(NumberOfRegionStyles); - for (int i = 0; i < NumberOfRegionStyles; i++) - { - var rs = new RegionStyle - { - RegionStyleId = buffer[idx], - RegionHorizontalPosition = (buffer[idx + 1] << 8) + buffer[idx + 2], - RegionVerticalPosition = (buffer[idx + 3] << 8) + buffer[idx + 4], - RegionWidth = (buffer[idx + 5] << 8) + buffer[idx + 6], - RegionHeight = (buffer[idx + 7] << 8) + buffer[idx + 8], - RegionBgPaletteEntryIdRef = buffer[idx + 9], - TextBoxHorizontalPosition = (buffer[idx + 11] << 8) + buffer[idx + 12], - TextBoxVerticalPosition = (buffer[idx + 13] << 8) + buffer[idx + 14], - TextBoxWidth = (buffer[idx + 15] << 8) + buffer[idx + 16], - TextBoxHeight = (buffer[idx + 17] << 8) + buffer[idx + 18], - TextFlow = buffer[idx + 19], - TextHorizontalAlignment = buffer[idx + 20], - TextVerticalAlignment = buffer[idx + 21], - LineSpace = buffer[idx + 22], - FontIdRef = buffer[idx + 23], - FontStyle = buffer[idx + 24], - FontSize = buffer[idx + 25], - FontPaletteEntryIdRef = buffer[idx + 26], - FontOutlinePaletteEntryIdRef = buffer[idx + 27], - FontOutlineThickness = buffer[idx + 28] - }; - RegionStyles.Add(rs); - idx += 29; - } - - UserStyles = new List(); - for (int j = 0; j < NumberOfUserStyles; j++) - { - var us = new UserStyle - { - UserStyleId = buffer[idx], - RegionHorizontalPositionDirection = buffer[idx + 1] >> 7, - RegionHorizontalPositionDelta = ((buffer[idx + 1] & 0b01111111) << 8) + buffer[idx + 2], - RegionVerticalPositionDirection = buffer[idx + 3] >> 7, - RegionVerticalPositionDelta = ((buffer[idx + 3] & 0b01111111) << 8) + buffer[idx + 4], - FontSizeIncDec = buffer[idx + 5] >> 7, - FontSizeDelta = (buffer[idx + 5] & 0b01111111), - TextBoxHorizontalPositionDirection = buffer[idx + 6] >> 7, - TextBoxHorizontalPositionDelta = ((buffer[idx + 6] & 0b01111111) << 8) + buffer[idx + 7], - TextBoxVerticalPositionDirection = buffer[idx + 8] >> 7, - TextBoxVerticalPositionDelta = ((buffer[idx + 8] & 0b01111111) << 8) + buffer[idx + 9], - TextBoxWidthIncDec = buffer[idx + 10] >> 7, - TextBoxWidthDelta = ((buffer[idx + 10] & 0b01111111) << 8) + buffer[idx + 11], - TextBoxHeightIncDec = buffer[idx + 12] >> 7, - TextBoxHeightDelta = ((buffer[idx + 12] & 0b01111111) << 8) + buffer[idx + 13], - LineSpaceIncDec = buffer[idx + 14] >> 7, - LineSpaceDelta = (buffer[idx + 14] & 0b01111111) - }; - UserStyles.Add(us); - idx += 15; - } - - int numberOfPalettees = ((buffer[idx] << 8) + buffer[idx + 1]) / 5; - Palettes = new List(numberOfPalettees); - idx += 2; - for (int i = 0; i < numberOfPalettees; i++) - { - var palette = new Palette - { - PaletteEntryId = buffer[idx], - Y = buffer[idx + 1], - Cr = buffer[idx + 2], - Cb = buffer[idx + 3], - T = buffer[idx + 4] - }; - Palettes.Add(palette); - idx += 5; - } - NumberOfDialogPresentationSegments = (buffer[idx] << 8) + buffer[idx + 1]; - } - - public void WriteToStream(Stream stream, int numberOfSubtitles) - { - NumberOfRegionStyles = RegionStyles.Count; - NumberOfUserStyles = UserStyles.Count; - - byte[] regionStyle = MakeRegionStyle(); - stream.Write(new byte[] { 0, 0, 1, 0xbf }, 0, 4); // MPEG-2 Private stream 2 - var size = regionStyle.Length + 5; - stream.WriteWord(size); - stream.WriteByte(SegmentTypeDialogStyle); // 0x81 - stream.WriteWord(size - 3); - stream.Write(regionStyle, 0, regionStyle.Length); - stream.WriteWord(numberOfSubtitles); - } - - private byte[] MakeRegionStyle() - { - using (var ms = new MemoryStream()) - { - if (PlayerStyleFlag) - { - ms.WriteByte(0b10000000); - } - else - { - ms.WriteByte(0); - } - - ms.WriteByte(0); // reserved? - ms.WriteByte((byte)NumberOfRegionStyles); - ms.WriteByte((byte)NumberOfUserStyles); - - foreach (var regionStyle in RegionStyles) - { - AddRegionStyle(ms, regionStyle); - } - - foreach (var userStyle in UserStyles) - { - AddUserStyle(ms, userStyle); - } - - ms.WriteWord(Palettes.Count * 5); - foreach (var palette in Palettes) - { - ms.WriteByte((byte)palette.PaletteEntryId); - ms.WriteByte((byte)palette.Y); - ms.WriteByte((byte)palette.Cb); - ms.WriteByte((byte)palette.Cr); - ms.WriteByte((byte)palette.T); - } - - return ms.ToArray(); - } - } - - private void AddUserStyle(Stream stream, UserStyle userStyle) - { - stream.WriteByte((byte)userStyle.UserStyleId); - stream.WriteWord(userStyle.RegionHorizontalPositionDelta, userStyle.RegionHorizontalPositionDirection); - stream.WriteWord(userStyle.RegionVerticalPositionDelta, userStyle.RegionVerticalPositionDirection); - stream.WriteByte(userStyle.FontSizeDelta, userStyle.FontSizeIncDec); - stream.WriteWord(userStyle.TextBoxHorizontalPositionDelta, userStyle.TextBoxHorizontalPositionDirection); - stream.WriteWord(userStyle.TextBoxVerticalPositionDelta, userStyle.TextBoxVerticalPositionDirection); - stream.WriteWord(userStyle.TextBoxWidthDelta, userStyle.TextBoxWidthIncDec); - stream.WriteWord(userStyle.TextBoxHeightDelta, userStyle.TextBoxHeightIncDec); - stream.WriteByte(userStyle.LineSpaceDelta, userStyle.LineSpaceIncDec); - } - - private static void AddRegionStyle(Stream stream, RegionStyle regionStyle) - { - stream.WriteByte((byte)regionStyle.RegionStyleId); - stream.WriteWord(regionStyle.RegionHorizontalPosition); - stream.WriteWord(regionStyle.RegionVerticalPosition); - stream.WriteWord(regionStyle.RegionWidth); - stream.WriteWord(regionStyle.RegionHeight); - stream.WriteByte((byte)regionStyle.RegionBgPaletteEntryIdRef); - stream.WriteByte(0); // reserved - stream.WriteWord(regionStyle.TextBoxHorizontalPosition); - stream.WriteWord(regionStyle.TextBoxVerticalPosition); - stream.WriteWord(regionStyle.TextBoxWidth); - stream.WriteWord(regionStyle.TextBoxHeight); - stream.WriteByte((byte)regionStyle.TextFlow); - stream.WriteByte((byte)regionStyle.TextHorizontalAlignment); - stream.WriteByte((byte)regionStyle.TextVerticalAlignment); - stream.WriteByte((byte)regionStyle.LineSpace); - stream.WriteByte((byte)regionStyle.FontIdRef); - stream.WriteByte((byte)regionStyle.FontStyle); - stream.WriteByte((byte)regionStyle.FontSize); - stream.WriteByte((byte)regionStyle.FontPaletteEntryIdRef); - stream.WriteByte((byte)regionStyle.FontOutlinePaletteEntryIdRef); - stream.WriteByte((byte)regionStyle.FontOutlineThickness); - } - - public static DialogStyleSegment DefaultDialogStyleSegment - { - get - { - var dss = new DialogStyleSegment(); - - dss.RegionStyles.Add(new RegionStyle - { - RegionStyleId = 0, - RegionHorizontalPosition = 100, - RegionVerticalPosition = 880, - RegionWidth = 1720, - RegionHeight = 200, - RegionBgPaletteEntryIdRef = 2, - TextBoxHorizontalPosition = 0, - TextBoxVerticalPosition = 880, - TextBoxWidth = 1719, - TextBoxHeight = 130, - TextFlow = 1, - TextHorizontalAlignment = 2, - TextVerticalAlignment = 1, - LineSpace = 70, - FontIdRef = 0, - FontStyle = 4, - FontSize = 45, - FontPaletteEntryIdRef = 3, - FontOutlinePaletteEntryIdRef = 1, - FontOutlineThickness = 2, - }); - dss.NumberOfRegionStyles = dss.RegionStyles.Count; - - dss.Palettes.Add(new Palette - { - PaletteEntryId = 0, - Y = 235, - Cr = 128, - Cb = 128, - T = 0 - }); - dss.Palettes.Add(new Palette - { - PaletteEntryId = 1, - Y = 16, - Cr = 128, - Cb = 128, - T = 255 - }); - dss.Palettes.Add(new Palette - { - PaletteEntryId = 2, - Y = 235, - Cr = 128, - Cb = 128, - T = 0 - }); - dss.Palettes.Add(new Palette - { - PaletteEntryId = 3, - Y = 235, - Cr = 128, - Cb = 128, - T = 255 - }); - dss.Palettes.Add(new Palette - { - PaletteEntryId = 254, - Y = 16, - Cr = 128, - Cb = 128, - T = 0 - }); - return dss; - } - } - } - - public abstract class SubtitleRegionContent - { - public int EscapeCode { get; set; } - public int DataType { get; set; } - public int DataLength { get; set; } - public string Name { get; set; } - public abstract void WriteExtraToStream(Stream stream); - } - - public class SubtitleRegionContentText : SubtitleRegionContent - { - private string _text; - - public string Text - { - get { return _text; } - set - { - DataLength = Encoding.UTF8.GetBytes(value).Length; - _text = value; - } - } - - public SubtitleRegionContentText() - { - EscapeCode = 27; - DataType = 1; - Name = "Text"; - } - - public override void WriteExtraToStream(Stream stream) - { - var buffer = Encoding.UTF8.GetBytes(Text); - stream.Write(buffer, 0, buffer.Length); - } - } - - public class SubtitleRegionContentChangeFontSet : SubtitleRegionContent - { - public int FontId { get; set; } - - public SubtitleRegionContentChangeFontSet() - { - EscapeCode = 27; - DataType = 2; - DataLength = 1; - Name = "Font set"; - } - - public override void WriteExtraToStream(Stream stream) - { - stream.WriteByte((byte)FontId); - } - } - - public class SubtitleRegionContentChangeFontStyle : SubtitleRegionContent - { - public int FontStyle { get; set; } - public int FontOutlinePaletteId { get; set; } - public int FontOutlineThickness { get; set; } - - public SubtitleRegionContentChangeFontStyle() - { - EscapeCode = 27; - DataType = 3; - DataLength = 3; - Name = "Font style"; - } - - public override void WriteExtraToStream(Stream stream) - { - stream.WriteByte((byte)FontStyle); - stream.WriteByte((byte)FontOutlinePaletteId); - stream.WriteByte((byte)FontOutlineThickness); - } - } - - public class SubtitleRegionContentChangeFontSize : SubtitleRegionContent - { - public int FontSize { get; set; } - - public SubtitleRegionContentChangeFontSize() - { - EscapeCode = 27; - DataType = 4; - DataLength = 1; - Name = "Font size"; - } - public override void WriteExtraToStream(Stream stream) - { - stream.WriteByte((byte)FontSize); - } - } - - public class SubtitleRegionContentChangeFontColor : SubtitleRegionContent - { - public int FontPaletteId { get; set; } - - public SubtitleRegionContentChangeFontColor() - { - EscapeCode = 27; - DataType = 5; - DataLength = 1; - Name = "Font color"; - } - public override void WriteExtraToStream(Stream stream) - { - stream.WriteByte((byte)FontPaletteId); - } - } - - public class SubtitleRegionContentLineBreak : SubtitleRegionContent - { - public SubtitleRegionContentLineBreak() - { - EscapeCode = 27; - DataType = 0x0a; - Name = "Line break"; - } - public override void WriteExtraToStream(Stream stream) - { - } - } - - public class SubtitleRegionContentEndOfInlineStyle : SubtitleRegionContent - { - public SubtitleRegionContentEndOfInlineStyle() - { - EscapeCode = 27; - DataType = 0x0b; - Name = "End of inline style"; - } - public override void WriteExtraToStream(Stream stream) - { - } - } - - public class SubtitleRegion - { - public bool ContinuousPresentation { get; set; } - public bool Forced { get; set; } - public int RegionStyleId { get; set; } - public List Texts { get; set; } - public List Content { get; set; } - } - - public class DialogPresentationSegment - { - public int Length { get; set; } - public UInt64 StartPts { get; set; } - public UInt64 EndPts { get; set; } - public bool PaletteUpdate { get; set; } - public List PaletteUpdates { get; set; } - public List Regions { get; set; } - - public DialogPresentationSegment(Paragraph paragraph, RegionStyle regionStyle) - { - StartPts = (ulong)Math.Round(paragraph.StartTime.TotalMilliseconds * 90.0); - EndPts = (ulong)Math.Round(paragraph.EndTime.TotalMilliseconds * 90.0); - PaletteUpdates = new List(); - Regions = new List - { - new SubtitleRegion - { - ContinuousPresentation = false, - Forced = false, - RegionStyleId = regionStyle.RegionStyleId, - Texts = new List(), - Content = new List() - } - }; - - var content = Regions[0].Content; - var lines = paragraph.Text.SplitToLines(); - var sb = new StringBuilder(); - bool italic = false; - bool bold = false; - for (int lineNumber = 0; lineNumber < lines.Count; lineNumber++) - { - string line = lines[lineNumber]; - if (lineNumber > 0) - { - if (italic || bold) - { - content.Add(new SubtitleRegionContentEndOfInlineStyle()); - } - content.Add(new SubtitleRegionContentLineBreak()); - if (italic && bold) - { - content.Add(new SubtitleRegionContentChangeFontStyle - { - FontStyle = 3, // bold and italic - FontOutlinePaletteId = regionStyle.FontOutlinePaletteEntryIdRef, - FontOutlineThickness = regionStyle.FontOutlineThickness - }); - } - else if (italic) - { - content.Add(new SubtitleRegionContentChangeFontStyle - { - FontStyle = 2, // italic - FontOutlinePaletteId = regionStyle.FontOutlinePaletteEntryIdRef, - FontOutlineThickness = regionStyle.FontOutlineThickness - }); - } - else if (bold) - { - content.Add(new SubtitleRegionContentChangeFontStyle - { - FontStyle = 1, // bold - FontOutlinePaletteId = regionStyle.FontOutlinePaletteEntryIdRef, - FontOutlineThickness = regionStyle.FontOutlineThickness - }); - } - } - int i = 0; - while (i < line.Length) - { - string s = line.Substring(i); - if (s.StartsWith("", StringComparison.OrdinalIgnoreCase)) - { - italic = true; - if (content.Count > 0 && content[content.Count - 1] is SubtitleRegionContentChangeFontStyle) - { - content.RemoveAt(content.Count - 1); // Remove last style tag (italic/bold will be combined) - } - content.Add(new SubtitleRegionContentChangeFontStyle - { - FontStyle = bold ? 3 : 2, // italic - FontOutlinePaletteId = regionStyle.FontOutlinePaletteEntryIdRef, - FontOutlineThickness = regionStyle.FontOutlineThickness - }); - i += 3; - } - else if (s.StartsWith("", StringComparison.OrdinalIgnoreCase)) - { - italic = false; - AddText(sb, content); - if (content.Count > 0 && content[content.Count - 1] is SubtitleRegionContentEndOfInlineStyle) - { - content.RemoveAt(content.Count - 1); // Remove last to avoid duplicated - } - content.Add(new SubtitleRegionContentEndOfInlineStyle()); - i += 4; - } - else if (s.StartsWith("", StringComparison.OrdinalIgnoreCase)) - { - bold = true; - if (content.Count > 0 && content[content.Count - 1] is SubtitleRegionContentChangeFontStyle) - { - content.RemoveAt(content.Count - 1); // Remove last style tag (italic/bold will be combined) - } - content.Add(new SubtitleRegionContentChangeFontStyle - { - FontStyle = italic ? 3 : 1, // bold - FontOutlinePaletteId = regionStyle.FontOutlinePaletteEntryIdRef, - FontOutlineThickness = regionStyle.FontOutlineThickness - }); - i += 3; - } - else if (s.StartsWith("", StringComparison.OrdinalIgnoreCase)) - { - bold = false; - AddText(sb, content); - if (content.Count > 0 && content[content.Count - 1] is SubtitleRegionContentEndOfInlineStyle) - { - content.RemoveAt(content.Count - 1); // Remove last to avoid duplicated - } - content.Add(new SubtitleRegionContentEndOfInlineStyle()); - i += 4; - } - else - { - i++; - sb.Append(s.Substring(0, 1)); - } - } - AddText(sb, content); - } - if (content.Count > 0 && content[content.Count - 1] is SubtitleRegionContentEndOfInlineStyle) - { - content.RemoveAt(content.Count - 1); // last 'end-of-inline-style' not needed - } - } - - private static void AddText(StringBuilder sb, List content) - { - if (sb.Length > 0) - { - string text = HtmlUtil.RemoveHtmlTags(sb.ToString(), true); - content.Add(new SubtitleRegionContentText - { - Text = text, - DataLength = Encoding.UTF8.GetBytes(text).Length - }); - sb.Clear(); - } - } - - public DialogPresentationSegment(byte[] buffer, int index) - { - int idx = index; - StartPts = buffer[idx + 13]; - StartPts += (ulong)buffer[idx + 12] << 8; - StartPts += (ulong)buffer[idx + 11] << 16; - StartPts += (ulong)buffer[idx + 10] << 24; - StartPts += (ulong)(buffer[idx + 9] & 0b00000001) << 32; - - EndPts = buffer[idx + 18]; - EndPts += (ulong)buffer[idx + 17] << 8; - EndPts += (ulong)buffer[idx + 16] << 16; - EndPts += (ulong)buffer[idx + 15] << 24; - EndPts += (ulong)(buffer[idx + 14] & 0b00000001) << 32; - - PaletteUpdate = (buffer[idx + 19] & 0b10000000) > 0; - idx += 20; - PaletteUpdates = new List(); - if (PaletteUpdate) - { - int numberOfPaletteEntries = buffer[idx + 21] + (buffer[idx + 20] << 8); - for (int i = 0; i < numberOfPaletteEntries; i++) - { - PaletteUpdates.Add(new Palette - { - PaletteEntryId = buffer[idx++], - Y = buffer[idx++], - Cr = buffer[idx++], - Cb = buffer[idx++], - T = buffer[idx++] - }); - } - } - - int numberOfRegions = buffer[idx++]; - Regions = new List(numberOfRegions); - for (int i = 0; i < numberOfRegions; i++) - { - var region = new SubtitleRegion { ContinuousPresentation = (buffer[idx] & 0b10000000) > 0, Forced = (buffer[idx] & 0b01000000) > 0 }; - idx++; - region.RegionStyleId = buffer[idx++]; - int regionSubtitleLength = buffer[idx + 1] + (buffer[idx] << 8); - idx += 2; - int processedLength = 0; - region.Texts = new List(); - region.Content = new List(); - string endStyle = string.Empty; - while (processedLength < regionSubtitleLength) - { - byte escapeCode = buffer[idx++]; - byte dataType = buffer[idx++]; - byte dataLength = buffer[idx++]; - processedLength += 3; - if (dataType == 0x01) // Text - { - string text = Encoding.UTF8.GetString(buffer, idx, dataLength); - region.Texts.Add(text); - region.Content.Add(new SubtitleRegionContentText - { - EscapeCode = escapeCode, - DataType = dataType, - DataLength = dataLength, - Text = text - }); - } - else if (dataType == 0x02) // Change a font set - { - region.Content.Add(new SubtitleRegionContentChangeFontSet - { - EscapeCode = escapeCode, - DataType = dataType, - DataLength = dataLength, - FontId = buffer[idx] - }); - } - else if (dataType == 0x03) // Change a font style - { - var fontStyle = buffer[idx]; - var fontOutlinePaletteId = buffer[idx + 1]; - var fontOutlineThickness = buffer[idx + 2]; - switch (fontStyle) - { - case 1: - region.Texts.Add(""); - endStyle = ""; - break; - case 2: - region.Texts.Add(""); - endStyle = ""; - break; - case 3: - region.Texts.Add(""); - endStyle = ""; - break; - case 5: - region.Texts.Add(""); - endStyle = ""; - break; - case 6: - region.Texts.Add(""); - endStyle = ""; - break; - case 7: - region.Texts.Add(""); - endStyle = ""; - break; - } - region.Content.Add(new SubtitleRegionContentChangeFontStyle - { - EscapeCode = escapeCode, - DataType = dataType, - DataLength = dataLength, - FontStyle = fontStyle, - FontOutlinePaletteId = fontOutlinePaletteId, - FontOutlineThickness = fontOutlineThickness - }); - } - else if (dataType == 0x04) // Change a font size - { - region.Content.Add(new SubtitleRegionContentChangeFontSize - { - EscapeCode = escapeCode, - DataType = dataType, - DataLength = dataLength, - FontSize = buffer[idx] - }); - } - else if (dataType == 0x05) // Change a font color - { - region.Content.Add(new SubtitleRegionContentChangeFontColor - { - EscapeCode = escapeCode, - DataType = dataType, - DataLength = dataLength, - FontPaletteId = buffer[idx] - }); - } - else if (dataType == 0x0A) // Line break - { - region.Texts.Add(Environment.NewLine); - region.Content.Add(new SubtitleRegionContentLineBreak - { - EscapeCode = escapeCode, - DataType = dataType, - DataLength = dataLength, - }); - } - else if (dataType == 0x0B) // End of inline style - { - if (!string.IsNullOrEmpty(endStyle)) - { - region.Texts.Add(endStyle); - endStyle = string.Empty; - } - region.Content.Add(new SubtitleRegionContentEndOfInlineStyle - { - EscapeCode = escapeCode, - DataType = dataType, - DataLength = dataLength, - }); - } - processedLength += dataLength; - idx += dataLength; - } - if (!string.IsNullOrEmpty(endStyle)) - { - region.Texts.Add(endStyle); - } - Regions.Add(region); - } - } - - public string Text - { - get - { - var sb = new StringBuilder(); - foreach (var region in Regions) - { - foreach (string text in region.Texts) - { - sb.Append(text); - } - } - return sb.ToString(); - } - } - - public ulong StartPtsMilliseconds => (ulong)Math.Round((StartPts) / 90.0); - - public ulong EndPtsMilliseconds => (ulong)Math.Round((EndPts) / 90.0); - - public void WriteToStream(Stream stream) - { - byte[] regionSubtitle = MakeSubtitleRegions(); - stream.Write(new byte[] { 0, 0, 1, 0xbf }, 0, 4); // MPEG-2 Private stream 2 - int size = regionSubtitle.Length + 15; - stream.WriteWord(size); - stream.WriteByte(SegmentTypeDialogPresentation); // 0x82 - stream.WriteWord(size - 3); - stream.WritePts(StartPts); - stream.WritePts(EndPts); - if (PaletteUpdate) - { - stream.WriteWord(PaletteUpdates.Count); - foreach (var palette in PaletteUpdates) - { - stream.WriteByte((byte)palette.PaletteEntryId); - stream.WriteByte((byte)palette.Y); - stream.WriteByte((byte)palette.Cb); - stream.WriteByte((byte)palette.Cr); - stream.WriteByte((byte)palette.T); - } - } - else - { - stream.WriteByte(0); // 1 bit = palette update (0=no update), next 7 bits reserved - } - stream.WriteByte((byte)Regions.Count); // number of regions - - stream.Write(regionSubtitle, 0, regionSubtitle.Length); - } - - private byte[] MakeSubtitleRegions() - { - using (var ms = new MemoryStream()) - { - foreach (var subtitleRegion in Regions) - { - byte flags = 0; - if (subtitleRegion.ContinuousPresentation) - { - flags = (byte)(flags | 0b10000000); - } - - if (subtitleRegion.Forced) - { - flags = (byte)(flags | 0b01000000); - } - - ms.WriteByte(flags); // first byte=continuous_present_flag, second byte=force, next 6 bits reserved - - ms.WriteByte((byte)subtitleRegion.RegionStyleId); - var contentBuffer = MakeSubtitleRegionContent(subtitleRegion); - ms.WriteWord(contentBuffer.Length); // set region subtitle size field - ms.Write(contentBuffer, 0, contentBuffer.Length); - } - return ms.ToArray(); - } - } - - private static byte[] MakeSubtitleRegionContent(SubtitleRegion subtitleRegion) - { - using (var ms = new MemoryStream()) - { - foreach (var content in subtitleRegion.Content) - { - ms.WriteByte((byte)content.EscapeCode); // escape code (0x1b / 27) - ms.WriteByte((byte)content.DataType); - ms.WriteByte((byte)content.DataLength); - content.WriteExtraToStream(ms); - } - return ms.ToArray(); - } - } - } - - public DialogStyleSegment StyleSegment; - public List PresentationSegments; - - private const int TextSubtitleStreamPid = 0x1800; - private const byte SegmentTypeDialogStyle = 0x81; - private const byte SegmentTypeDialogPresentation = 0x82; - - public override string Extension => ".m2ts"; - - public override string Name => "Blu-ray TextST"; - - public override bool IsMine(List lines, string fileName) - { - if (string.IsNullOrEmpty(fileName)) - { - return false; - } - - if (fileName.EndsWith(".m2ts", StringComparison.OrdinalIgnoreCase) && FileUtil.IsM2TransportStream(fileName) || - fileName.EndsWith(".textst", StringComparison.OrdinalIgnoreCase) && FileUtil.IsMpeg2PrivateStream2(fileName)) - { - return base.IsMine(lines, fileName); - } - return false; - } - - public override string ToText(Subtitle subtitle, string title) - { - throw new NotImplementedException(); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - if (FileUtil.IsMpeg2PrivateStream2(fileName)) - { - using (var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) - { - LoadSubtitleFromMpeg2PesPackets(subtitle, fs); - } - } - else - { - using (var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) - { - LoadSubtitleFromM2Ts(subtitle, fs); - } - } - subtitle.Renumber(); - } - - private void LoadSubtitleFromMpeg2PesPackets(Subtitle subtitle, Stream stream) - { - long position = 0; - stream.Position = 0; - stream.Seek(position, SeekOrigin.Begin); - long streamLength = stream.Length; - var buffer = new byte[512]; - PresentationSegments = new List(); - while (position < streamLength) - { - stream.Seek(position, SeekOrigin.Begin); - int bytesRead = stream.Read(buffer, 0, buffer.Length); - if (bytesRead < 20) - { - break; - } - - int size = (buffer[4] << 8) + buffer[5] + 6; - position += size; - - if (bytesRead > 10 && VobSubParser.IsPrivateStream2(buffer, 0)) - { - if (buffer[6] == SegmentTypeDialogPresentation) - { - var dps = new DialogPresentationSegment(buffer, 0); - PresentationSegments.Add(dps); - subtitle.Paragraphs.Add(new Paragraph(dps.Text.Trim(), dps.StartPtsMilliseconds, dps.EndPtsMilliseconds)); - } - else if (buffer[6] == SegmentTypeDialogStyle) - { - StyleSegment = new DialogStyleSegment(buffer); - } - } - } - } - - private void LoadSubtitleFromM2Ts(Subtitle subtitle, Stream ms) - { - var subtitlePackets = new List(); - const int packetLength = 188; - bool isM2TransportStream = DetectFormat(ms); - var packetBuffer = new byte[packetLength]; - var m2TsTimeCodeBuffer = new byte[4]; - long position = 0; - ms.Position = 0; - - // check for Topfield .rec file - ms.Seek(position, SeekOrigin.Begin); - ms.Read(m2TsTimeCodeBuffer, 0, 3); - if (m2TsTimeCodeBuffer[0] == 0x54 && m2TsTimeCodeBuffer[1] == 0x46 && m2TsTimeCodeBuffer[2] == 0x72) - { - position = 3760; - } - - long transportStreamLength = ms.Length; - ms.Seek(position, SeekOrigin.Begin); - while (position < transportStreamLength) - { - if (isM2TransportStream) - { - var m2TsHeaderBytesRead = ms.Read(m2TsTimeCodeBuffer, 0, m2TsTimeCodeBuffer.Length); - if (m2TsHeaderBytesRead < m2TsTimeCodeBuffer.Length) - { - break; // incomplete m2ts header - } - position += m2TsTimeCodeBuffer.Length; - } - - var packetBytesRead = ms.Read(packetBuffer, 0, packetLength); - if (packetBytesRead < packetLength) - { - break; // incomplete packet - } - - byte syncByte = packetBuffer[0]; - if (syncByte == Packet.SynchronizationByte) - { - var packet = new Packet(packetBuffer); - if (packet.PacketId == TextSubtitleStreamPid) - { - subtitlePackets.Add(packet); - } - position += packetLength; - } - else - { - if (isM2TransportStream) - { - position -= m2TsTimeCodeBuffer.Length; - } - position++; - ms.Seek(position, SeekOrigin.Begin); - } - } - - //TODO: merge ts packets - - PresentationSegments = new List(); - foreach (var item in subtitlePackets) - { - if (item.Payload != null && item.Payload.Length > 10 && VobSubParser.IsPrivateStream2(item.Payload, 0)) - { - if (item.Payload[6] == SegmentTypeDialogPresentation) - { - var dps = new DialogPresentationSegment(item.Payload, 0); - PresentationSegments.Add(dps); - subtitle.Paragraphs.Add(new Paragraph(dps.Text.Trim(), dps.StartPtsMilliseconds, dps.EndPtsMilliseconds)); - } - else if (item.Payload[6] == SegmentTypeDialogStyle) - { - StyleSegment = new DialogStyleSegment(item.Payload); - } - } - } - - subtitle.Renumber(); - } - - private static bool DetectFormat(Stream ms) - { - if (ms.Length > 192 + 192 + 5) - { - ms.Seek(0, SeekOrigin.Begin); - var buffer = new byte[192 + 192 + 5]; - ms.Read(buffer, 0, buffer.Length); - if (buffer[0] == Packet.SynchronizationByte && buffer[188] == Packet.SynchronizationByte) - { - return false; - } - - if (buffer[4] == Packet.SynchronizationByte && buffer[192 + 4] == Packet.SynchronizationByte && buffer[192 + 192 + 4] == Packet.SynchronizationByte) - { - return true; - } - } - return false; - } - } -} +using Nikse.SubtitleEdit.Core.BluRaySup; +using Nikse.SubtitleEdit.Core.ContainerFormats.TransportStream; +using Nikse.SubtitleEdit.Core.VobSub; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Text; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public static class StreamExtensions + { + + public static void WritePts(this Stream stream, ulong pts) + { + //TODO: check max + var buffer = BitConverter.GetBytes(pts); + if (BitConverter.IsLittleEndian) + { + stream.WriteByte(buffer[4]); + stream.WriteByte(buffer[3]); + stream.WriteByte(buffer[2]); + stream.WriteByte(buffer[1]); + stream.WriteByte(buffer[0]); + } + else + { + stream.WriteByte(buffer[buffer.Length - 1]); + stream.WriteByte(buffer[buffer.Length - 2]); + stream.WriteByte(buffer[buffer.Length - 3]); + stream.WriteByte(buffer[buffer.Length - 4]); + stream.WriteByte(buffer[buffer.Length - 5]); + } + } + + public static void WriteWord(this Stream stream, int value) + { + //TODO: check max + stream.WriteByte((byte)(value / 256)); + stream.WriteByte((byte)(value % 256)); + } + + public static void WriteWord(this Stream stream, int value, int firstBitValue) + { + //TODO: check max + var firstByte = (byte)(value / 256); + if (firstBitValue == 1) + { + firstByte = (byte)(firstByte | 0b10000000); + } + + stream.WriteByte(firstByte); + stream.WriteByte((byte)(value % 256)); + } + + public static void WriteByte(this Stream stream, int value, int firstBitValue) + { + //TODO: check max + var firstByte = (byte)(value); + if (firstBitValue == 1) + { + firstByte = (byte)(firstByte | 0b10000000); + } + + stream.WriteByte(firstByte); + } + } + + public class TextST : SubtitleFormat + { + public class Palette + { + public int PaletteEntryId { get; set; } + public int Y { get; set; } + public int Cr { get; set; } + public int Cb { get; set; } + public int T { get; set; } + + public Color Color + { + get + { + var arr = BluRaySupPalette.YCbCr2Rgb(Y, Cb, Cr, false); + return Color.FromArgb(T, arr[0], arr[1], arr[2]); + } + } + } + + public class RegionStyle + { + public RegionStyle() + { + } + + public RegionStyle(RegionStyle regionStyle) + { + RegionStyleId = regionStyle.RegionStyleId; + RegionHorizontalPosition = regionStyle.RegionHorizontalPosition; + RegionVerticalPosition = regionStyle.RegionVerticalPosition; + RegionWidth = regionStyle.RegionWidth; + RegionHeight = regionStyle.RegionHeight; + RegionBgPaletteEntryIdRef = regionStyle.RegionBgPaletteEntryIdRef; + TextBoxHorizontalPosition = regionStyle.TextBoxHorizontalPosition; + TextBoxVerticalPosition = regionStyle.TextBoxVerticalPosition; + TextBoxWidth = regionStyle.TextBoxWidth; + TextBoxHeight = regionStyle.TextBoxHeight; + TextFlow = regionStyle.TextFlow; + TextHorizontalAlignment = regionStyle.TextHorizontalAlignment; + TextVerticalAlignment = regionStyle.TextVerticalAlignment; + LineSpace = regionStyle.LineSpace; + FontIdRef = regionStyle.FontIdRef; + FontStyle = regionStyle.FontStyle; + FontSize = regionStyle.FontSize; + FontPaletteEntryIdRef = regionStyle.FontPaletteEntryIdRef; + FontOutlinePaletteEntryIdRef = regionStyle.FontOutlinePaletteEntryIdRef; + FontOutlineThickness = regionStyle.FontOutlineThickness; + } + + public int RegionStyleId { get; set; } + public int RegionHorizontalPosition { get; set; } + public int RegionVerticalPosition { get; set; } + public int RegionWidth { get; set; } + public int RegionHeight { get; set; } + public int RegionBgPaletteEntryIdRef { get; set; } + public int TextBoxHorizontalPosition { get; set; } + public int TextBoxVerticalPosition { get; set; } + public int TextBoxWidth { get; set; } + public int TextBoxHeight { get; set; } + public int TextFlow { get; set; } + public int TextHorizontalAlignment { get; set; } + public int TextVerticalAlignment { get; set; } + public int LineSpace { get; set; } + public int FontIdRef { get; set; } + public int FontStyle { get; set; } + public int FontSize { get; set; } + public int FontPaletteEntryIdRef { get; set; } + public int FontOutlinePaletteEntryIdRef { get; set; } + public int FontOutlineThickness { get; set; } + } + + public class UserStyle + { + public int UserStyleId { get; set; } + public int RegionHorizontalPositionDirection { get; set; } + public int RegionHorizontalPositionDelta { get; set; } + public int RegionVerticalPositionDirection { get; set; } + public int RegionVerticalPositionDelta { get; set; } + public int FontSizeIncDec { get; set; } + public int FontSizeDelta { get; set; } + public int TextBoxHorizontalPositionDirection { get; set; } + public int TextBoxHorizontalPositionDelta { get; set; } + public int TextBoxVerticalPositionDirection { get; set; } + public int TextBoxVerticalPositionDelta { get; set; } + public int TextBoxWidthIncDec { get; set; } + public int TextBoxWidthDelta { get; set; } + public int TextBoxHeightIncDec { get; set; } + public int TextBoxHeightDelta { get; set; } + public int LineSpaceIncDec { get; set; } + public int LineSpaceDelta { get; set; } + } + + public class DialogStyleSegment + { + public bool PlayerStyleFlag { get; set; } + public int NumberOfRegionStyles { get; set; } + public int NumberOfUserStyles { get; set; } + public List RegionStyles { get; set; } + public List UserStyles { get; set; } + public List Palettes { get; set; } + public int NumberOfDialogPresentationSegments { get; set; } + + public DialogStyleSegment() + { + PlayerStyleFlag = true; + RegionStyles = new List(); + UserStyles = new List(); + Palettes = new List(); + } + + public DialogStyleSegment(byte[] buffer) + { + PlayerStyleFlag = (buffer[9] & 0b10000000) > 0; + NumberOfRegionStyles = buffer[11]; + NumberOfUserStyles = buffer[12]; + + int idx = 13; + RegionStyles = new List(NumberOfRegionStyles); + for (int i = 0; i < NumberOfRegionStyles; i++) + { + var rs = new RegionStyle + { + RegionStyleId = buffer[idx], + RegionHorizontalPosition = (buffer[idx + 1] << 8) + buffer[idx + 2], + RegionVerticalPosition = (buffer[idx + 3] << 8) + buffer[idx + 4], + RegionWidth = (buffer[idx + 5] << 8) + buffer[idx + 6], + RegionHeight = (buffer[idx + 7] << 8) + buffer[idx + 8], + RegionBgPaletteEntryIdRef = buffer[idx + 9], + TextBoxHorizontalPosition = (buffer[idx + 11] << 8) + buffer[idx + 12], + TextBoxVerticalPosition = (buffer[idx + 13] << 8) + buffer[idx + 14], + TextBoxWidth = (buffer[idx + 15] << 8) + buffer[idx + 16], + TextBoxHeight = (buffer[idx + 17] << 8) + buffer[idx + 18], + TextFlow = buffer[idx + 19], + TextHorizontalAlignment = buffer[idx + 20], + TextVerticalAlignment = buffer[idx + 21], + LineSpace = buffer[idx + 22], + FontIdRef = buffer[idx + 23], + FontStyle = buffer[idx + 24], + FontSize = buffer[idx + 25], + FontPaletteEntryIdRef = buffer[idx + 26], + FontOutlinePaletteEntryIdRef = buffer[idx + 27], + FontOutlineThickness = buffer[idx + 28] + }; + RegionStyles.Add(rs); + idx += 29; + } + + UserStyles = new List(); + for (int j = 0; j < NumberOfUserStyles; j++) + { + var us = new UserStyle + { + UserStyleId = buffer[idx], + RegionHorizontalPositionDirection = buffer[idx + 1] >> 7, + RegionHorizontalPositionDelta = ((buffer[idx + 1] & 0b01111111) << 8) + buffer[idx + 2], + RegionVerticalPositionDirection = buffer[idx + 3] >> 7, + RegionVerticalPositionDelta = ((buffer[idx + 3] & 0b01111111) << 8) + buffer[idx + 4], + FontSizeIncDec = buffer[idx + 5] >> 7, + FontSizeDelta = (buffer[idx + 5] & 0b01111111), + TextBoxHorizontalPositionDirection = buffer[idx + 6] >> 7, + TextBoxHorizontalPositionDelta = ((buffer[idx + 6] & 0b01111111) << 8) + buffer[idx + 7], + TextBoxVerticalPositionDirection = buffer[idx + 8] >> 7, + TextBoxVerticalPositionDelta = ((buffer[idx + 8] & 0b01111111) << 8) + buffer[idx + 9], + TextBoxWidthIncDec = buffer[idx + 10] >> 7, + TextBoxWidthDelta = ((buffer[idx + 10] & 0b01111111) << 8) + buffer[idx + 11], + TextBoxHeightIncDec = buffer[idx + 12] >> 7, + TextBoxHeightDelta = ((buffer[idx + 12] & 0b01111111) << 8) + buffer[idx + 13], + LineSpaceIncDec = buffer[idx + 14] >> 7, + LineSpaceDelta = (buffer[idx + 14] & 0b01111111) + }; + UserStyles.Add(us); + idx += 15; + } + + int numberOfPalettees = ((buffer[idx] << 8) + buffer[idx + 1]) / 5; + Palettes = new List(numberOfPalettees); + idx += 2; + for (int i = 0; i < numberOfPalettees; i++) + { + var palette = new Palette + { + PaletteEntryId = buffer[idx], + Y = buffer[idx + 1], + Cr = buffer[idx + 2], + Cb = buffer[idx + 3], + T = buffer[idx + 4] + }; + Palettes.Add(palette); + idx += 5; + } + NumberOfDialogPresentationSegments = (buffer[idx] << 8) + buffer[idx + 1]; + } + + public void WriteToStream(Stream stream, int numberOfSubtitles) + { + NumberOfRegionStyles = RegionStyles.Count; + NumberOfUserStyles = UserStyles.Count; + + byte[] regionStyle = MakeRegionStyle(); + stream.Write(new byte[] { 0, 0, 1, 0xbf }, 0, 4); // MPEG-2 Private stream 2 + var size = regionStyle.Length + 5; + stream.WriteWord(size); + stream.WriteByte(SegmentTypeDialogStyle); // 0x81 + stream.WriteWord(size - 3); + stream.Write(regionStyle, 0, regionStyle.Length); + stream.WriteWord(numberOfSubtitles); + } + + private byte[] MakeRegionStyle() + { + using (var ms = new MemoryStream()) + { + if (PlayerStyleFlag) + { + ms.WriteByte(0b10000000); + } + else + { + ms.WriteByte(0); + } + + ms.WriteByte(0); // reserved? + ms.WriteByte((byte)NumberOfRegionStyles); + ms.WriteByte((byte)NumberOfUserStyles); + + foreach (var regionStyle in RegionStyles) + { + AddRegionStyle(ms, regionStyle); + } + + foreach (var userStyle in UserStyles) + { + AddUserStyle(ms, userStyle); + } + + ms.WriteWord(Palettes.Count * 5); + foreach (var palette in Palettes) + { + ms.WriteByte((byte)palette.PaletteEntryId); + ms.WriteByte((byte)palette.Y); + ms.WriteByte((byte)palette.Cb); + ms.WriteByte((byte)palette.Cr); + ms.WriteByte((byte)palette.T); + } + + return ms.ToArray(); + } + } + + private void AddUserStyle(Stream stream, UserStyle userStyle) + { + stream.WriteByte((byte)userStyle.UserStyleId); + stream.WriteWord(userStyle.RegionHorizontalPositionDelta, userStyle.RegionHorizontalPositionDirection); + stream.WriteWord(userStyle.RegionVerticalPositionDelta, userStyle.RegionVerticalPositionDirection); + stream.WriteByte(userStyle.FontSizeDelta, userStyle.FontSizeIncDec); + stream.WriteWord(userStyle.TextBoxHorizontalPositionDelta, userStyle.TextBoxHorizontalPositionDirection); + stream.WriteWord(userStyle.TextBoxVerticalPositionDelta, userStyle.TextBoxVerticalPositionDirection); + stream.WriteWord(userStyle.TextBoxWidthDelta, userStyle.TextBoxWidthIncDec); + stream.WriteWord(userStyle.TextBoxHeightDelta, userStyle.TextBoxHeightIncDec); + stream.WriteByte(userStyle.LineSpaceDelta, userStyle.LineSpaceIncDec); + } + + private static void AddRegionStyle(Stream stream, RegionStyle regionStyle) + { + stream.WriteByte((byte)regionStyle.RegionStyleId); + stream.WriteWord(regionStyle.RegionHorizontalPosition); + stream.WriteWord(regionStyle.RegionVerticalPosition); + stream.WriteWord(regionStyle.RegionWidth); + stream.WriteWord(regionStyle.RegionHeight); + stream.WriteByte((byte)regionStyle.RegionBgPaletteEntryIdRef); + stream.WriteByte(0); // reserved + stream.WriteWord(regionStyle.TextBoxHorizontalPosition); + stream.WriteWord(regionStyle.TextBoxVerticalPosition); + stream.WriteWord(regionStyle.TextBoxWidth); + stream.WriteWord(regionStyle.TextBoxHeight); + stream.WriteByte((byte)regionStyle.TextFlow); + stream.WriteByte((byte)regionStyle.TextHorizontalAlignment); + stream.WriteByte((byte)regionStyle.TextVerticalAlignment); + stream.WriteByte((byte)regionStyle.LineSpace); + stream.WriteByte((byte)regionStyle.FontIdRef); + stream.WriteByte((byte)regionStyle.FontStyle); + stream.WriteByte((byte)regionStyle.FontSize); + stream.WriteByte((byte)regionStyle.FontPaletteEntryIdRef); + stream.WriteByte((byte)regionStyle.FontOutlinePaletteEntryIdRef); + stream.WriteByte((byte)regionStyle.FontOutlineThickness); + } + + public static DialogStyleSegment DefaultDialogStyleSegment + { + get + { + var dss = new DialogStyleSegment(); + + dss.RegionStyles.Add(new RegionStyle + { + RegionStyleId = 0, + RegionHorizontalPosition = 100, + RegionVerticalPosition = 880, + RegionWidth = 1720, + RegionHeight = 200, + RegionBgPaletteEntryIdRef = 2, + TextBoxHorizontalPosition = 0, + TextBoxVerticalPosition = 880, + TextBoxWidth = 1719, + TextBoxHeight = 130, + TextFlow = 1, + TextHorizontalAlignment = 2, + TextVerticalAlignment = 1, + LineSpace = 70, + FontIdRef = 0, + FontStyle = 4, + FontSize = 45, + FontPaletteEntryIdRef = 3, + FontOutlinePaletteEntryIdRef = 1, + FontOutlineThickness = 2, + }); + dss.NumberOfRegionStyles = dss.RegionStyles.Count; + + dss.Palettes.Add(new Palette + { + PaletteEntryId = 0, + Y = 235, + Cr = 128, + Cb = 128, + T = 0 + }); + dss.Palettes.Add(new Palette + { + PaletteEntryId = 1, + Y = 16, + Cr = 128, + Cb = 128, + T = 255 + }); + dss.Palettes.Add(new Palette + { + PaletteEntryId = 2, + Y = 235, + Cr = 128, + Cb = 128, + T = 0 + }); + dss.Palettes.Add(new Palette + { + PaletteEntryId = 3, + Y = 235, + Cr = 128, + Cb = 128, + T = 255 + }); + dss.Palettes.Add(new Palette + { + PaletteEntryId = 254, + Y = 16, + Cr = 128, + Cb = 128, + T = 0 + }); + return dss; + } + } + } + + public abstract class SubtitleRegionContent + { + public int EscapeCode { get; set; } + public int DataType { get; set; } + public int DataLength { get; set; } + public string Name { get; set; } + public abstract void WriteExtraToStream(Stream stream); + } + + public class SubtitleRegionContentText : SubtitleRegionContent + { + private string _text; + + public string Text + { + get { return _text; } + set + { + DataLength = Encoding.UTF8.GetBytes(value).Length; + _text = value; + } + } + + public SubtitleRegionContentText() + { + EscapeCode = 27; + DataType = 1; + Name = "Text"; + } + + public override void WriteExtraToStream(Stream stream) + { + var buffer = Encoding.UTF8.GetBytes(Text); + stream.Write(buffer, 0, buffer.Length); + } + } + + public class SubtitleRegionContentChangeFontSet : SubtitleRegionContent + { + public int FontId { get; set; } + + public SubtitleRegionContentChangeFontSet() + { + EscapeCode = 27; + DataType = 2; + DataLength = 1; + Name = "Font set"; + } + + public override void WriteExtraToStream(Stream stream) + { + stream.WriteByte((byte)FontId); + } + } + + public class SubtitleRegionContentChangeFontStyle : SubtitleRegionContent + { + public int FontStyle { get; set; } + public int FontOutlinePaletteId { get; set; } + public int FontOutlineThickness { get; set; } + + public SubtitleRegionContentChangeFontStyle() + { + EscapeCode = 27; + DataType = 3; + DataLength = 3; + Name = "Font style"; + } + + public override void WriteExtraToStream(Stream stream) + { + stream.WriteByte((byte)FontStyle); + stream.WriteByte((byte)FontOutlinePaletteId); + stream.WriteByte((byte)FontOutlineThickness); + } + } + + public class SubtitleRegionContentChangeFontSize : SubtitleRegionContent + { + public int FontSize { get; set; } + + public SubtitleRegionContentChangeFontSize() + { + EscapeCode = 27; + DataType = 4; + DataLength = 1; + Name = "Font size"; + } + public override void WriteExtraToStream(Stream stream) + { + stream.WriteByte((byte)FontSize); + } + } + + public class SubtitleRegionContentChangeFontColor : SubtitleRegionContent + { + public int FontPaletteId { get; set; } + + public SubtitleRegionContentChangeFontColor() + { + EscapeCode = 27; + DataType = 5; + DataLength = 1; + Name = "Font color"; + } + public override void WriteExtraToStream(Stream stream) + { + stream.WriteByte((byte)FontPaletteId); + } + } + + public class SubtitleRegionContentLineBreak : SubtitleRegionContent + { + public SubtitleRegionContentLineBreak() + { + EscapeCode = 27; + DataType = 0x0a; + Name = "Line break"; + } + public override void WriteExtraToStream(Stream stream) + { + } + } + + public class SubtitleRegionContentEndOfInlineStyle : SubtitleRegionContent + { + public SubtitleRegionContentEndOfInlineStyle() + { + EscapeCode = 27; + DataType = 0x0b; + Name = "End of inline style"; + } + public override void WriteExtraToStream(Stream stream) + { + } + } + + public class SubtitleRegion + { + public bool ContinuousPresentation { get; set; } + public bool Forced { get; set; } + public int RegionStyleId { get; set; } + public List Texts { get; set; } + public List Content { get; set; } + } + + public class DialogPresentationSegment + { + public int Length { get; set; } + public UInt64 StartPts { get; set; } + public UInt64 EndPts { get; set; } + public bool PaletteUpdate { get; set; } + public List PaletteUpdates { get; set; } + public List Regions { get; set; } + + public DialogPresentationSegment(Paragraph paragraph, RegionStyle regionStyle) + { + StartPts = (ulong)Math.Round(paragraph.StartTime.TotalMilliseconds * 90.0); + EndPts = (ulong)Math.Round(paragraph.EndTime.TotalMilliseconds * 90.0); + PaletteUpdates = new List(); + Regions = new List + { + new SubtitleRegion + { + ContinuousPresentation = false, + Forced = false, + RegionStyleId = regionStyle.RegionStyleId, + Texts = new List(), + Content = new List() + } + }; + + var content = Regions[0].Content; + var lines = paragraph.Text.SplitToLines(); + var sb = new StringBuilder(); + bool italic = false; + bool bold = false; + for (int lineNumber = 0; lineNumber < lines.Count; lineNumber++) + { + string line = lines[lineNumber]; + if (lineNumber > 0) + { + if (italic || bold) + { + content.Add(new SubtitleRegionContentEndOfInlineStyle()); + } + content.Add(new SubtitleRegionContentLineBreak()); + if (italic && bold) + { + content.Add(new SubtitleRegionContentChangeFontStyle + { + FontStyle = 3, // bold and italic + FontOutlinePaletteId = regionStyle.FontOutlinePaletteEntryIdRef, + FontOutlineThickness = regionStyle.FontOutlineThickness + }); + } + else if (italic) + { + content.Add(new SubtitleRegionContentChangeFontStyle + { + FontStyle = 2, // italic + FontOutlinePaletteId = regionStyle.FontOutlinePaletteEntryIdRef, + FontOutlineThickness = regionStyle.FontOutlineThickness + }); + } + else if (bold) + { + content.Add(new SubtitleRegionContentChangeFontStyle + { + FontStyle = 1, // bold + FontOutlinePaletteId = regionStyle.FontOutlinePaletteEntryIdRef, + FontOutlineThickness = regionStyle.FontOutlineThickness + }); + } + } + int i = 0; + while (i < line.Length) + { + string s = line.Substring(i); + if (s.StartsWith("", StringComparison.OrdinalIgnoreCase)) + { + italic = true; + if (content.Count > 0 && content[content.Count - 1] is SubtitleRegionContentChangeFontStyle) + { + content.RemoveAt(content.Count - 1); // Remove last style tag (italic/bold will be combined) + } + content.Add(new SubtitleRegionContentChangeFontStyle + { + FontStyle = bold ? 3 : 2, // italic + FontOutlinePaletteId = regionStyle.FontOutlinePaletteEntryIdRef, + FontOutlineThickness = regionStyle.FontOutlineThickness + }); + i += 3; + } + else if (s.StartsWith("", StringComparison.OrdinalIgnoreCase)) + { + italic = false; + AddText(sb, content); + if (content.Count > 0 && content[content.Count - 1] is SubtitleRegionContentEndOfInlineStyle) + { + content.RemoveAt(content.Count - 1); // Remove last to avoid duplicated + } + content.Add(new SubtitleRegionContentEndOfInlineStyle()); + i += 4; + } + else if (s.StartsWith("", StringComparison.OrdinalIgnoreCase)) + { + bold = true; + if (content.Count > 0 && content[content.Count - 1] is SubtitleRegionContentChangeFontStyle) + { + content.RemoveAt(content.Count - 1); // Remove last style tag (italic/bold will be combined) + } + content.Add(new SubtitleRegionContentChangeFontStyle + { + FontStyle = italic ? 3 : 1, // bold + FontOutlinePaletteId = regionStyle.FontOutlinePaletteEntryIdRef, + FontOutlineThickness = regionStyle.FontOutlineThickness + }); + i += 3; + } + else if (s.StartsWith("", StringComparison.OrdinalIgnoreCase)) + { + bold = false; + AddText(sb, content); + if (content.Count > 0 && content[content.Count - 1] is SubtitleRegionContentEndOfInlineStyle) + { + content.RemoveAt(content.Count - 1); // Remove last to avoid duplicated + } + content.Add(new SubtitleRegionContentEndOfInlineStyle()); + i += 4; + } + else + { + i++; + sb.Append(s.Substring(0, 1)); + } + } + AddText(sb, content); + } + if (content.Count > 0 && content[content.Count - 1] is SubtitleRegionContentEndOfInlineStyle) + { + content.RemoveAt(content.Count - 1); // last 'end-of-inline-style' not needed + } + } + + private static void AddText(StringBuilder sb, List content) + { + if (sb.Length > 0) + { + string text = HtmlUtil.RemoveHtmlTags(sb.ToString(), true); + content.Add(new SubtitleRegionContentText + { + Text = text, + DataLength = Encoding.UTF8.GetBytes(text).Length + }); + sb.Clear(); + } + } + + public DialogPresentationSegment(byte[] buffer, int index) + { + int idx = index; + StartPts = buffer[idx + 13]; + StartPts += (ulong)buffer[idx + 12] << 8; + StartPts += (ulong)buffer[idx + 11] << 16; + StartPts += (ulong)buffer[idx + 10] << 24; + StartPts += (ulong)(buffer[idx + 9] & 0b00000001) << 32; + + EndPts = buffer[idx + 18]; + EndPts += (ulong)buffer[idx + 17] << 8; + EndPts += (ulong)buffer[idx + 16] << 16; + EndPts += (ulong)buffer[idx + 15] << 24; + EndPts += (ulong)(buffer[idx + 14] & 0b00000001) << 32; + + PaletteUpdate = (buffer[idx + 19] & 0b10000000) > 0; + idx += 20; + PaletteUpdates = new List(); + if (PaletteUpdate) + { + int numberOfPaletteEntries = buffer[idx + 21] + (buffer[idx + 20] << 8); + for (int i = 0; i < numberOfPaletteEntries; i++) + { + PaletteUpdates.Add(new Palette + { + PaletteEntryId = buffer[idx++], + Y = buffer[idx++], + Cr = buffer[idx++], + Cb = buffer[idx++], + T = buffer[idx++] + }); + } + } + + int numberOfRegions = buffer[idx++]; + Regions = new List(numberOfRegions); + for (int i = 0; i < numberOfRegions; i++) + { + var region = new SubtitleRegion { ContinuousPresentation = (buffer[idx] & 0b10000000) > 0, Forced = (buffer[idx] & 0b01000000) > 0 }; + idx++; + region.RegionStyleId = buffer[idx++]; + int regionSubtitleLength = buffer[idx + 1] + (buffer[idx] << 8); + idx += 2; + int processedLength = 0; + region.Texts = new List(); + region.Content = new List(); + string endStyle = string.Empty; + while (processedLength < regionSubtitleLength) + { + byte escapeCode = buffer[idx++]; + byte dataType = buffer[idx++]; + byte dataLength = buffer[idx++]; + processedLength += 3; + if (dataType == 0x01) // Text + { + string text = Encoding.UTF8.GetString(buffer, idx, dataLength); + region.Texts.Add(text); + region.Content.Add(new SubtitleRegionContentText + { + EscapeCode = escapeCode, + DataType = dataType, + DataLength = dataLength, + Text = text + }); + } + else if (dataType == 0x02) // Change a font set + { + region.Content.Add(new SubtitleRegionContentChangeFontSet + { + EscapeCode = escapeCode, + DataType = dataType, + DataLength = dataLength, + FontId = buffer[idx] + }); + } + else if (dataType == 0x03) // Change a font style + { + var fontStyle = buffer[idx]; + var fontOutlinePaletteId = buffer[idx + 1]; + var fontOutlineThickness = buffer[idx + 2]; + switch (fontStyle) + { + case 1: + region.Texts.Add(""); + endStyle = ""; + break; + case 2: + region.Texts.Add(""); + endStyle = ""; + break; + case 3: + region.Texts.Add(""); + endStyle = ""; + break; + case 5: + region.Texts.Add(""); + endStyle = ""; + break; + case 6: + region.Texts.Add(""); + endStyle = ""; + break; + case 7: + region.Texts.Add(""); + endStyle = ""; + break; + } + region.Content.Add(new SubtitleRegionContentChangeFontStyle + { + EscapeCode = escapeCode, + DataType = dataType, + DataLength = dataLength, + FontStyle = fontStyle, + FontOutlinePaletteId = fontOutlinePaletteId, + FontOutlineThickness = fontOutlineThickness + }); + } + else if (dataType == 0x04) // Change a font size + { + region.Content.Add(new SubtitleRegionContentChangeFontSize + { + EscapeCode = escapeCode, + DataType = dataType, + DataLength = dataLength, + FontSize = buffer[idx] + }); + } + else if (dataType == 0x05) // Change a font color + { + region.Content.Add(new SubtitleRegionContentChangeFontColor + { + EscapeCode = escapeCode, + DataType = dataType, + DataLength = dataLength, + FontPaletteId = buffer[idx] + }); + } + else if (dataType == 0x0A) // Line break + { + region.Texts.Add(Environment.NewLine); + region.Content.Add(new SubtitleRegionContentLineBreak + { + EscapeCode = escapeCode, + DataType = dataType, + DataLength = dataLength, + }); + } + else if (dataType == 0x0B) // End of inline style + { + if (!string.IsNullOrEmpty(endStyle)) + { + region.Texts.Add(endStyle); + endStyle = string.Empty; + } + region.Content.Add(new SubtitleRegionContentEndOfInlineStyle + { + EscapeCode = escapeCode, + DataType = dataType, + DataLength = dataLength, + }); + } + processedLength += dataLength; + idx += dataLength; + } + if (!string.IsNullOrEmpty(endStyle)) + { + region.Texts.Add(endStyle); + } + Regions.Add(region); + } + } + + public string Text + { + get + { + var sb = new StringBuilder(); + foreach (var region in Regions) + { + foreach (string text in region.Texts) + { + sb.Append(text); + } + } + return sb.ToString(); + } + } + + public ulong StartPtsMilliseconds => (ulong)Math.Round((StartPts) / 90.0); + + public ulong EndPtsMilliseconds => (ulong)Math.Round((EndPts) / 90.0); + + public void WriteToStream(Stream stream) + { + byte[] regionSubtitle = MakeSubtitleRegions(); + stream.Write(new byte[] { 0, 0, 1, 0xbf }, 0, 4); // MPEG-2 Private stream 2 + int size = regionSubtitle.Length + 15; + stream.WriteWord(size); + stream.WriteByte(SegmentTypeDialogPresentation); // 0x82 + stream.WriteWord(size - 3); + stream.WritePts(StartPts); + stream.WritePts(EndPts); + if (PaletteUpdate) + { + stream.WriteWord(PaletteUpdates.Count); + foreach (var palette in PaletteUpdates) + { + stream.WriteByte((byte)palette.PaletteEntryId); + stream.WriteByte((byte)palette.Y); + stream.WriteByte((byte)palette.Cb); + stream.WriteByte((byte)palette.Cr); + stream.WriteByte((byte)palette.T); + } + } + else + { + stream.WriteByte(0); // 1 bit = palette update (0=no update), next 7 bits reserved + } + stream.WriteByte((byte)Regions.Count); // number of regions + + stream.Write(regionSubtitle, 0, regionSubtitle.Length); + } + + private byte[] MakeSubtitleRegions() + { + using (var ms = new MemoryStream()) + { + foreach (var subtitleRegion in Regions) + { + byte flags = 0; + if (subtitleRegion.ContinuousPresentation) + { + flags = (byte)(flags | 0b10000000); + } + + if (subtitleRegion.Forced) + { + flags = (byte)(flags | 0b01000000); + } + + ms.WriteByte(flags); // first byte=continuous_present_flag, second byte=force, next 6 bits reserved + + ms.WriteByte((byte)subtitleRegion.RegionStyleId); + var contentBuffer = MakeSubtitleRegionContent(subtitleRegion); + ms.WriteWord(contentBuffer.Length); // set region subtitle size field + ms.Write(contentBuffer, 0, contentBuffer.Length); + } + return ms.ToArray(); + } + } + + private static byte[] MakeSubtitleRegionContent(SubtitleRegion subtitleRegion) + { + using (var ms = new MemoryStream()) + { + foreach (var content in subtitleRegion.Content) + { + ms.WriteByte((byte)content.EscapeCode); // escape code (0x1b / 27) + ms.WriteByte((byte)content.DataType); + ms.WriteByte((byte)content.DataLength); + content.WriteExtraToStream(ms); + } + return ms.ToArray(); + } + } + } + + public DialogStyleSegment StyleSegment; + public List PresentationSegments; + + private const int TextSubtitleStreamPid = 0x1800; + private const byte SegmentTypeDialogStyle = 0x81; + private const byte SegmentTypeDialogPresentation = 0x82; + + public override string Extension => ".m2ts"; + + public override string Name => "Blu-ray TextST"; + + public override bool IsMine(List lines, string fileName) + { + if (string.IsNullOrEmpty(fileName)) + { + return false; + } + + if (fileName.EndsWith(".m2ts", StringComparison.OrdinalIgnoreCase) && FileUtil.IsM2TransportStream(fileName) || + fileName.EndsWith(".textst", StringComparison.OrdinalIgnoreCase) && FileUtil.IsMpeg2PrivateStream2(fileName)) + { + return base.IsMine(lines, fileName); + } + return false; + } + + public override string ToText(Subtitle subtitle, string title) + { + throw new NotImplementedException(); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + if (FileUtil.IsMpeg2PrivateStream2(fileName)) + { + using (var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + { + LoadSubtitleFromMpeg2PesPackets(subtitle, fs); + } + } + else + { + using (var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + { + LoadSubtitleFromM2Ts(subtitle, fs); + } + } + subtitle.Renumber(); + } + + private void LoadSubtitleFromMpeg2PesPackets(Subtitle subtitle, Stream stream) + { + long position = 0; + stream.Position = 0; + stream.Seek(position, SeekOrigin.Begin); + long streamLength = stream.Length; + var buffer = new byte[512]; + PresentationSegments = new List(); + while (position < streamLength) + { + stream.Seek(position, SeekOrigin.Begin); + int bytesRead = stream.Read(buffer, 0, buffer.Length); + if (bytesRead < 20) + { + break; + } + + int size = (buffer[4] << 8) + buffer[5] + 6; + position += size; + + if (bytesRead > 10 && VobSubParser.IsPrivateStream2(buffer, 0)) + { + if (buffer[6] == SegmentTypeDialogPresentation) + { + var dps = new DialogPresentationSegment(buffer, 0); + PresentationSegments.Add(dps); + subtitle.Paragraphs.Add(new Paragraph(dps.Text.Trim(), dps.StartPtsMilliseconds, dps.EndPtsMilliseconds)); + } + else if (buffer[6] == SegmentTypeDialogStyle) + { + StyleSegment = new DialogStyleSegment(buffer); + } + } + } + } + + private void LoadSubtitleFromM2Ts(Subtitle subtitle, Stream ms) + { + var subtitlePackets = new List(); + const int packetLength = 188; + bool isM2TransportStream = DetectFormat(ms); + var packetBuffer = new byte[packetLength]; + var m2TsTimeCodeBuffer = new byte[4]; + long position = 0; + ms.Position = 0; + + // check for Topfield .rec file + ms.Seek(position, SeekOrigin.Begin); + ms.Read(m2TsTimeCodeBuffer, 0, 3); + if (m2TsTimeCodeBuffer[0] == 0x54 && m2TsTimeCodeBuffer[1] == 0x46 && m2TsTimeCodeBuffer[2] == 0x72) + { + position = 3760; + } + + long transportStreamLength = ms.Length; + ms.Seek(position, SeekOrigin.Begin); + while (position < transportStreamLength) + { + if (isM2TransportStream) + { + var m2TsHeaderBytesRead = ms.Read(m2TsTimeCodeBuffer, 0, m2TsTimeCodeBuffer.Length); + if (m2TsHeaderBytesRead < m2TsTimeCodeBuffer.Length) + { + break; // incomplete m2ts header + } + position += m2TsTimeCodeBuffer.Length; + } + + var packetBytesRead = ms.Read(packetBuffer, 0, packetLength); + if (packetBytesRead < packetLength) + { + break; // incomplete packet + } + + byte syncByte = packetBuffer[0]; + if (syncByte == Packet.SynchronizationByte) + { + var packet = new Packet(packetBuffer); + if (packet.PacketId == TextSubtitleStreamPid) + { + subtitlePackets.Add(packet); + } + position += packetLength; + } + else + { + if (isM2TransportStream) + { + position -= m2TsTimeCodeBuffer.Length; + } + position++; + ms.Seek(position, SeekOrigin.Begin); + } + } + + //TODO: merge ts packets + + PresentationSegments = new List(); + foreach (var item in subtitlePackets) + { + if (item.Payload != null && item.Payload.Length > 10 && VobSubParser.IsPrivateStream2(item.Payload, 0)) + { + if (item.Payload[6] == SegmentTypeDialogPresentation) + { + var dps = new DialogPresentationSegment(item.Payload, 0); + PresentationSegments.Add(dps); + subtitle.Paragraphs.Add(new Paragraph(dps.Text.Trim(), dps.StartPtsMilliseconds, dps.EndPtsMilliseconds)); + } + else if (item.Payload[6] == SegmentTypeDialogStyle) + { + StyleSegment = new DialogStyleSegment(item.Payload); + } + } + } + + subtitle.Renumber(); + } + + private static bool DetectFormat(Stream ms) + { + if (ms.Length > 192 + 192 + 5) + { + ms.Seek(0, SeekOrigin.Begin); + var buffer = new byte[192 + 192 + 5]; + ms.Read(buffer, 0, buffer.Length); + if (buffer[0] == Packet.SynchronizationByte && buffer[188] == Packet.SynchronizationByte) + { + return false; + } + + if (buffer[4] == Packet.SynchronizationByte && buffer[192 + 4] == Packet.SynchronizationByte && buffer[192 + 192 + 4] == Packet.SynchronizationByte) + { + return true; + } + } + return false; + } + } +} diff --git a/libse/SubtitleFormats/TimeCodesOnly1.cs b/src/libse/SubtitleFormats/TimeCodesOnly1.cs similarity index 100% rename from libse/SubtitleFormats/TimeCodesOnly1.cs rename to src/libse/SubtitleFormats/TimeCodesOnly1.cs diff --git a/libse/SubtitleFormats/TimeCodesOnly2.cs b/src/libse/SubtitleFormats/TimeCodesOnly2.cs similarity index 100% rename from libse/SubtitleFormats/TimeCodesOnly2.cs rename to src/libse/SubtitleFormats/TimeCodesOnly2.cs diff --git a/libse/SubtitleFormats/TimeXml.cs b/src/libse/SubtitleFormats/TimeXml.cs similarity index 97% rename from libse/SubtitleFormats/TimeXml.cs rename to src/libse/SubtitleFormats/TimeXml.cs index a95232d8c..81c0c66d3 100644 --- a/libse/SubtitleFormats/TimeXml.cs +++ b/src/libse/SubtitleFormats/TimeXml.cs @@ -1,95 +1,95 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Text; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class TimeXml : SubtitleFormat - { - public override string Extension => ".xml"; - - public override string Name => "Xml"; - - public override string ToText(Subtitle subtitle, string title) - { - string xmlStructure = - "" + Environment.NewLine + - ""; - - var xml = new XmlDocument(); - xml.LoadXml(xmlStructure); - - foreach (Paragraph p in subtitle.Paragraphs) - { - XmlNode paragraph = xml.CreateElement("Paragraph"); - - XmlNode number = xml.CreateElement("Number"); - number.InnerText = p.Number.ToString(CultureInfo.InvariantCulture); - paragraph.AppendChild(number); - - XmlNode start = xml.CreateElement("StartMilliseconds"); - start.InnerText = ((long)(Math.Round(p.StartTime.TotalMilliseconds))).ToString(CultureInfo.InvariantCulture); - paragraph.AppendChild(start); - - XmlNode end = xml.CreateElement("EndMilliseconds"); - end.InnerText = ((long)(Math.Round(p.EndTime.TotalMilliseconds))).ToString(CultureInfo.InvariantCulture); - paragraph.AppendChild(end); - - XmlNode text = xml.CreateElement("Text"); - text.InnerText = HtmlUtil.RemoveHtmlTags(p.Text); - paragraph.AppendChild(text); - - xml.DocumentElement.AppendChild(paragraph); - } - - return ToUtf8XmlString(xml); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - - string xmlString = sb.ToString(); - if (!xmlString.Contains("") || !xmlString.Contains("")) - { - return; - } - - var xml = new XmlDocument { XmlResolver = null }; - try - { - xml.LoadXml(xmlString); - } - catch - { - _errorCount = 1; - return; - } - - foreach (XmlNode node in xml.DocumentElement.SelectNodes("Paragraph")) - { - try - { - string start = node.SelectSingleNode("StartMilliseconds").InnerText; - string end = node.SelectSingleNode("EndMilliseconds").InnerText; - string text = node.SelectSingleNode("Text").InnerText; - - subtitle.Paragraphs.Add(new Paragraph(text, Convert.ToDouble(start, CultureInfo.InvariantCulture), Convert.ToDouble(end, CultureInfo.InvariantCulture))); - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine(ex.Message); - _errorCount++; - } - } - subtitle.Renumber(); - } - - } -} +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class TimeXml : SubtitleFormat + { + public override string Extension => ".xml"; + + public override string Name => "Xml"; + + public override string ToText(Subtitle subtitle, string title) + { + string xmlStructure = + "" + Environment.NewLine + + ""; + + var xml = new XmlDocument(); + xml.LoadXml(xmlStructure); + + foreach (Paragraph p in subtitle.Paragraphs) + { + XmlNode paragraph = xml.CreateElement("Paragraph"); + + XmlNode number = xml.CreateElement("Number"); + number.InnerText = p.Number.ToString(CultureInfo.InvariantCulture); + paragraph.AppendChild(number); + + XmlNode start = xml.CreateElement("StartMilliseconds"); + start.InnerText = ((long)(Math.Round(p.StartTime.TotalMilliseconds))).ToString(CultureInfo.InvariantCulture); + paragraph.AppendChild(start); + + XmlNode end = xml.CreateElement("EndMilliseconds"); + end.InnerText = ((long)(Math.Round(p.EndTime.TotalMilliseconds))).ToString(CultureInfo.InvariantCulture); + paragraph.AppendChild(end); + + XmlNode text = xml.CreateElement("Text"); + text.InnerText = HtmlUtil.RemoveHtmlTags(p.Text); + paragraph.AppendChild(text); + + xml.DocumentElement.AppendChild(paragraph); + } + + return ToUtf8XmlString(xml); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + + string xmlString = sb.ToString(); + if (!xmlString.Contains("") || !xmlString.Contains("")) + { + return; + } + + var xml = new XmlDocument { XmlResolver = null }; + try + { + xml.LoadXml(xmlString); + } + catch + { + _errorCount = 1; + return; + } + + foreach (XmlNode node in xml.DocumentElement.SelectNodes("Paragraph")) + { + try + { + string start = node.SelectSingleNode("StartMilliseconds").InnerText; + string end = node.SelectSingleNode("EndMilliseconds").InnerText; + string text = node.SelectSingleNode("Text").InnerText; + + subtitle.Paragraphs.Add(new Paragraph(text, Convert.ToDouble(start, CultureInfo.InvariantCulture), Convert.ToDouble(end, CultureInfo.InvariantCulture))); + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine(ex.Message); + _errorCount++; + } + } + subtitle.Renumber(); + } + + } +} diff --git a/libse/SubtitleFormats/TimeXml2.cs b/src/libse/SubtitleFormats/TimeXml2.cs similarity index 97% rename from libse/SubtitleFormats/TimeXml2.cs rename to src/libse/SubtitleFormats/TimeXml2.cs index 9d7e71b0c..47117107e 100644 --- a/libse/SubtitleFormats/TimeXml2.cs +++ b/src/libse/SubtitleFormats/TimeXml2.cs @@ -1,109 +1,109 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Text; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class TimeXml2 : SubtitleFormat - { - public override string Extension => ".xml"; - - public override string Name => "Xml 2"; - - public override string ToText(Subtitle subtitle, string title) - { - string xmlStructure = - "" + Environment.NewLine + - ""; - - var xml = new XmlDocument(); - xml.LoadXml(xmlStructure); - - foreach (Paragraph p in subtitle.Paragraphs) - { - XmlNode paragraph = xml.CreateElement("Subtitle"); - - XmlNode number = xml.CreateElement("Number"); - number.InnerText = p.Number.ToString(CultureInfo.InvariantCulture); - paragraph.AppendChild(number); - - XmlNode start = xml.CreateElement("Start"); - start.InnerText = p.StartTime.ToString(); - paragraph.AppendChild(start); - - XmlNode end = xml.CreateElement("End"); - end.InnerText = p.EndTime.ToString(); - paragraph.AppendChild(end); - - XmlNode duration = xml.CreateElement("Duration"); - duration.InnerText = p.Duration.ToShortString(); - paragraph.AppendChild(duration); - - XmlNode text = xml.CreateElement("Text"); - text.InnerText = HtmlUtil.RemoveHtmlTags(p.Text); - paragraph.AppendChild(text); - - xml.DocumentElement.AppendChild(paragraph); - } - - return ToUtf8XmlString(xml); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - - var xmlString = sb.ToString(); - if (!xmlString.Contains("") || !xmlString.Contains("") || !xmlString.Contains("")) - { - return; - } - - var xml = new XmlDocument { XmlResolver = null }; - try - { - xml.LoadXml(xmlString); - } - catch - { - _errorCount = 1; - return; - } - - foreach (XmlNode node in xml.DocumentElement.SelectNodes("Subtitle")) - { - try - { - TimeCode startTimeCode = DecodeTimeCode(node.SelectSingleNode("Start").InnerText); - TimeCode endTimeCode = DecodeTimeCode(node.SelectSingleNode("End").InnerText); - string text = node.SelectSingleNode("Text").InnerText; - subtitle.Paragraphs.Add(new Paragraph(startTimeCode, endTimeCode, text)); - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine(ex.Message); - _errorCount++; - } - } - subtitle.Renumber(); - } - - private static TimeCode DecodeTimeCode(string p) - { - var parts = p.Split(new[] { ';', '.', ':', ',' }); - - string hour = parts[0]; - string minutes = parts[1]; - string seconds = parts[2]; - string ms = parts[3]; - - return new TimeCode(int.Parse(hour), int.Parse(minutes), int.Parse(seconds), (int.Parse(ms))); - } - - } -} +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class TimeXml2 : SubtitleFormat + { + public override string Extension => ".xml"; + + public override string Name => "Xml 2"; + + public override string ToText(Subtitle subtitle, string title) + { + string xmlStructure = + "" + Environment.NewLine + + ""; + + var xml = new XmlDocument(); + xml.LoadXml(xmlStructure); + + foreach (Paragraph p in subtitle.Paragraphs) + { + XmlNode paragraph = xml.CreateElement("Subtitle"); + + XmlNode number = xml.CreateElement("Number"); + number.InnerText = p.Number.ToString(CultureInfo.InvariantCulture); + paragraph.AppendChild(number); + + XmlNode start = xml.CreateElement("Start"); + start.InnerText = p.StartTime.ToString(); + paragraph.AppendChild(start); + + XmlNode end = xml.CreateElement("End"); + end.InnerText = p.EndTime.ToString(); + paragraph.AppendChild(end); + + XmlNode duration = xml.CreateElement("Duration"); + duration.InnerText = p.Duration.ToShortString(); + paragraph.AppendChild(duration); + + XmlNode text = xml.CreateElement("Text"); + text.InnerText = HtmlUtil.RemoveHtmlTags(p.Text); + paragraph.AppendChild(text); + + xml.DocumentElement.AppendChild(paragraph); + } + + return ToUtf8XmlString(xml); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + + var xmlString = sb.ToString(); + if (!xmlString.Contains("") || !xmlString.Contains("") || !xmlString.Contains("")) + { + return; + } + + var xml = new XmlDocument { XmlResolver = null }; + try + { + xml.LoadXml(xmlString); + } + catch + { + _errorCount = 1; + return; + } + + foreach (XmlNode node in xml.DocumentElement.SelectNodes("Subtitle")) + { + try + { + TimeCode startTimeCode = DecodeTimeCode(node.SelectSingleNode("Start").InnerText); + TimeCode endTimeCode = DecodeTimeCode(node.SelectSingleNode("End").InnerText); + string text = node.SelectSingleNode("Text").InnerText; + subtitle.Paragraphs.Add(new Paragraph(startTimeCode, endTimeCode, text)); + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine(ex.Message); + _errorCount++; + } + } + subtitle.Renumber(); + } + + private static TimeCode DecodeTimeCode(string p) + { + var parts = p.Split(new[] { ';', '.', ':', ',' }); + + string hour = parts[0]; + string minutes = parts[1]; + string seconds = parts[2]; + string ms = parts[3]; + + return new TimeCode(int.Parse(hour), int.Parse(minutes), int.Parse(seconds), (int.Parse(ms))); + } + + } +} diff --git a/libse/SubtitleFormats/TimedText.cs b/src/libse/SubtitleFormats/TimedText.cs similarity index 98% rename from libse/SubtitleFormats/TimedText.cs rename to src/libse/SubtitleFormats/TimedText.cs index 2023a7436..b797b51de 100644 --- a/libse/SubtitleFormats/TimedText.cs +++ b/src/libse/SubtitleFormats/TimedText.cs @@ -1,404 +1,404 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Text; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class TimedText : SubtitleFormat - { - public override string Extension => ".xml"; - - public override string Name => "Timed Text draft 2006-10"; - - public override bool IsMine(List lines, string fileName) - { - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - string xmlAsString = sb.ToString().RemoveControlCharactersButWhiteSpace().Trim(); - - if (xmlAsString.Contains("xmlns:tts=\"http://www.w3.org/2006/04")) - { - return false; - } - - if (xmlAsString.Contains("http://www.w3.org/") && - xmlAsString.Contains("/ttaf1")) - { - var xml = new XmlDocument { XmlResolver = null }; - try - { - xml.LoadXml(xmlAsString.Replace(" & ", " & ").Replace("Q&A", "Q&A")); - - var nsmgr = new XmlNamespaceManager(xml.NameTable); - nsmgr.AddNamespace("ttaf1", xml.DocumentElement.NamespaceURI); - var div = xml.DocumentElement.SelectSingleNode("//ttaf1:body", nsmgr).SelectSingleNode("ttaf1:div", nsmgr); - if (div == null) - { - div = xml.DocumentElement.SelectSingleNode("//ttaf1:body", nsmgr).FirstChild; - } - - int numberOfParagraphs = div.ChildNodes.Count; - return numberOfParagraphs > 0; - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine(ex.Message); - return false; - } - } - return false; - } - - private static string ConvertToTimeString(TimeCode time) - { - if (Configuration.Settings.SubtitleSettings.TimedText10TimeCodeFormatSource == "hh:mm:ss.ms-two-digits") - { - return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}.{(int)Math.Round(time.Milliseconds / 10.0):0}"; - } - - return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}.{time.Milliseconds:000}"; - } - - public override string ToText(Subtitle subtitle, string title) - { - string xmlStructure = - "" + Environment.NewLine + - "" + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " " + Environment.NewLine + - " - - - - -"; - xmlStructure = xmlStructure.Replace("[DATE]", DateTime.Now.ToString("yyyy-MM-dd")); - - var xml = new XmlDocument(); - xml.LoadXml(xmlStructure); - xml.DocumentElement.SelectSingleNode("metadata/title").InnerText = title; - var subtitlesNode = xml.DocumentElement.SelectSingleNode("subtitles"); - - foreach (Paragraph p in subtitle.Paragraphs) - { - XmlNode paragraph = xml.CreateElement("subtitle"); - - XmlAttribute start = xml.CreateAttribute("start"); - start.InnerText = p.StartTime.ToString().Replace(",", "."); - paragraph.Attributes.Prepend(start); - - XmlAttribute stop = xml.CreateAttribute("stop"); - stop.InnerText = p.EndTime.ToString().Replace(",", "."); - paragraph.Attributes.Append(stop); - - XmlNode text = xml.CreateElement("text"); - bool first = true; - foreach (string line in HtmlUtil.RemoveHtmlTags(p.Text, true).SplitToLines()) - { - if (!first) - { - XmlNode br = xml.CreateElement("br"); - text.AppendChild(br); - } - first = false; - var t = xml.CreateTextNode(string.Empty); - t.InnerText = line; - text.AppendChild(t); - } - paragraph.AppendChild(text); - - XmlAttribute style = xml.CreateAttribute("style"); - style.InnerText = "Default"; - text.Attributes.Append(style); - - subtitlesNode.AppendChild(paragraph); - } - - return ToUtf8XmlString(xml); - } - - private static TimeCode DecodeTimeCode(string code) - { - string[] parts = code.Split(new[] { ':', '.', ',' }, StringSplitOptions.RemoveEmptyEntries); - - if (parts.Length == 1) - { - return new TimeCode(0, 0, int.Parse(code), 0); // seconds only - } - if (parts.Length == 2) - { - return new TimeCode(0, 0, int.Parse(parts[0]), int.Parse(parts[1])); // seconds + ms - } - - //00:00:07:120 - string hour = parts[0]; - string minutes = parts[1]; - string seconds = parts[2]; - string ms = parts[3]; - return new TimeCode(int.Parse(hour), int.Parse(minutes), int.Parse(seconds), int.Parse(ms)); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - - string xmlString = sb.ToString(); - if (!xmlString.Contains("")) - { - return; - } - - var xml = new XmlDocument { XmlResolver = null }; - try - { - xml.LoadXml(xmlString); - } - catch - { - _errorCount = 1; - return; - } - - foreach (XmlNode node in xml.DocumentElement.SelectNodes("subtitles/subtitle")) - { - try - { - string start = node.Attributes["start"].InnerText; - string stop = node.Attributes["stop"].InnerText; - - var text = new StringBuilder(); - foreach (XmlNode innerNode in node.SelectSingleNode("text").ChildNodes) - { - switch (innerNode.Name.Replace("tt:", string.Empty)) - { - case "br": - text.AppendLine(); - break; - default: - text.Append(innerNode.InnerText); - break; - } - } - - subtitle.Paragraphs.Add(new Paragraph(DecodeTimeCode(start), DecodeTimeCode(stop), text.ToString().Trim())); - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine(ex.Message); - _errorCount++; - } - } - subtitle.Renumber(); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class UniversalSubtitleFormat : SubtitleFormat + { + public override string Extension => ".usf"; + + public override string Name => "Universal Subtitle Format"; + + public override string ToText(Subtitle subtitle, string title) + { + string xmlStructure = + "" + Environment.NewLine + + "" + Environment.NewLine + + @" + Universal Subtitle Format + + SubtitleEdit + nikse.dk@gmail.com + https://www.nikse.dk/ + " + Environment.NewLine + +" English" + Environment.NewLine + +@" [DATE] + This is a USF file + + + " + Environment.NewLine + + " + + + + +"; + xmlStructure = xmlStructure.Replace("[DATE]", DateTime.Now.ToString("yyyy-MM-dd")); + + var xml = new XmlDocument(); + xml.LoadXml(xmlStructure); + xml.DocumentElement.SelectSingleNode("metadata/title").InnerText = title; + var subtitlesNode = xml.DocumentElement.SelectSingleNode("subtitles"); + + foreach (Paragraph p in subtitle.Paragraphs) + { + XmlNode paragraph = xml.CreateElement("subtitle"); + + XmlAttribute start = xml.CreateAttribute("start"); + start.InnerText = p.StartTime.ToString().Replace(",", "."); + paragraph.Attributes.Prepend(start); + + XmlAttribute stop = xml.CreateAttribute("stop"); + stop.InnerText = p.EndTime.ToString().Replace(",", "."); + paragraph.Attributes.Append(stop); + + XmlNode text = xml.CreateElement("text"); + bool first = true; + foreach (string line in HtmlUtil.RemoveHtmlTags(p.Text, true).SplitToLines()) + { + if (!first) + { + XmlNode br = xml.CreateElement("br"); + text.AppendChild(br); + } + first = false; + var t = xml.CreateTextNode(string.Empty); + t.InnerText = line; + text.AppendChild(t); + } + paragraph.AppendChild(text); + + XmlAttribute style = xml.CreateAttribute("style"); + style.InnerText = "Default"; + text.Attributes.Append(style); + + subtitlesNode.AppendChild(paragraph); + } + + return ToUtf8XmlString(xml); + } + + private static TimeCode DecodeTimeCode(string code) + { + string[] parts = code.Split(new[] { ':', '.', ',' }, StringSplitOptions.RemoveEmptyEntries); + + if (parts.Length == 1) + { + return new TimeCode(0, 0, int.Parse(code), 0); // seconds only + } + if (parts.Length == 2) + { + return new TimeCode(0, 0, int.Parse(parts[0]), int.Parse(parts[1])); // seconds + ms + } + + //00:00:07:120 + string hour = parts[0]; + string minutes = parts[1]; + string seconds = parts[2]; + string ms = parts[3]; + return new TimeCode(int.Parse(hour), int.Parse(minutes), int.Parse(seconds), int.Parse(ms)); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + + string xmlString = sb.ToString(); + if (!xmlString.Contains("")) + { + return; + } + + var xml = new XmlDocument { XmlResolver = null }; + try + { + xml.LoadXml(xmlString); + } + catch + { + _errorCount = 1; + return; + } + + foreach (XmlNode node in xml.DocumentElement.SelectNodes("subtitles/subtitle")) + { + try + { + string start = node.Attributes["start"].InnerText; + string stop = node.Attributes["stop"].InnerText; + + var text = new StringBuilder(); + foreach (XmlNode innerNode in node.SelectSingleNode("text").ChildNodes) + { + switch (innerNode.Name.Replace("tt:", string.Empty)) + { + case "br": + text.AppendLine(); + break; + default: + text.Append(innerNode.InnerText); + break; + } + } + + subtitle.Paragraphs.Add(new Paragraph(DecodeTimeCode(start), DecodeTimeCode(stop), text.ToString().Trim())); + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine(ex.Message); + _errorCount++; + } + } + subtitle.Renumber(); + } + + } +} diff --git a/libse/SubtitleFormats/UnknownSubtitle1.cs b/src/libse/SubtitleFormats/UnknownSubtitle1.cs similarity index 97% rename from libse/SubtitleFormats/UnknownSubtitle1.cs rename to src/libse/SubtitleFormats/UnknownSubtitle1.cs index 8092e9278..574f12f6f 100644 --- a/libse/SubtitleFormats/UnknownSubtitle1.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle1.cs @@ -1,112 +1,112 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class UnknownSubtitle1 : SubtitleFormat - { - //0:01 – 0:11 - private static readonly Regex RegexTimeCodes = new Regex(@"^\d+:\d\d – \d+:\d\d ", RegexOptions.Compiled); - - public override string Extension => ".txt"; - - public override string Name => "Unknown 1"; - - public override string ToText(Subtitle subtitle, string title) - { - //0:01 – 0:11 "My vengeance needs blood!" -Marquis De Sade - //[Laughter, thunder] - //0:17 – 0:19 - On this 5th day of December - - //0:19 – 0:22 in the year of our Lord 1648, - - - const string paragraphWriteFormat = "{0} – {1} {2}"; - - var sb = new StringBuilder(); - const string format = "{0:0}:{1:00}"; - foreach (Paragraph p in subtitle.Paragraphs) - { - int seconds = p.StartTime.Seconds; - if (p.StartTime.Milliseconds >= 500) - { - seconds++; - } - - string startTime = string.Format(format, p.StartTime.Minutes + p.StartTime.Hours * 60, seconds); - - seconds = p.EndTime.Seconds; - if (p.EndTime.Milliseconds >= 500) - { - seconds++; - } - - string timeOut = string.Format(format, p.EndTime.Minutes + p.EndTime.Hours * 60, seconds); - - sb.AppendLine(string.Format(paragraphWriteFormat, startTime, timeOut, p.Text)); - } - return sb.ToString().Trim(); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - Paragraph p = null; - _errorCount = 0; - - subtitle.Paragraphs.Clear(); - var sb = new StringBuilder(); - char[] splitChars = { '–', ' ' }; - foreach (string line in lines) - { - Match match; - if (line.Length > 11 && (match = RegexTimeCodes.Match(line)).Success) - { - if (p != null) - { - p.Text = (p.Text + Environment.NewLine + sb).Trim(); - } - - var parts = line.Substring(0, match.Length).Split(splitChars, StringSplitOptions.RemoveEmptyEntries); - try - { - p = new Paragraph { StartTime = DecodeTimeCode(parts[0]), EndTime = DecodeTimeCode(parts[1]) }; - p.Text = line.Substring(match.Length).Trim(); - subtitle.Paragraphs.Add(p); - sb.Clear(); - } - catch - { - p = null; - _errorCount++; - } - } - else if (p == null) - { - _errorCount++; - } - else - { - sb.AppendLine(line); - } - if (_errorCount > 20) - { - return; - } - } - if (p != null) - { - p.Text = (p.Text + Environment.NewLine + sb).Trim(); - } - - subtitle.Renumber(); - } - - private static TimeCode DecodeTimeCode(string code) - { - //68:20 (minutes:seconds) - var parts = code.Trim().Split(':'); - return new TimeCode(0, int.Parse(parts[0]), int.Parse(parts[1]), 0); - } - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class UnknownSubtitle1 : SubtitleFormat + { + //0:01 – 0:11 + private static readonly Regex RegexTimeCodes = new Regex(@"^\d+:\d\d – \d+:\d\d ", RegexOptions.Compiled); + + public override string Extension => ".txt"; + + public override string Name => "Unknown 1"; + + public override string ToText(Subtitle subtitle, string title) + { + //0:01 – 0:11 "My vengeance needs blood!" -Marquis De Sade + //[Laughter, thunder] + //0:17 – 0:19 - On this 5th day of December - + //0:19 – 0:22 in the year of our Lord 1648, - + + const string paragraphWriteFormat = "{0} – {1} {2}"; + + var sb = new StringBuilder(); + const string format = "{0:0}:{1:00}"; + foreach (Paragraph p in subtitle.Paragraphs) + { + int seconds = p.StartTime.Seconds; + if (p.StartTime.Milliseconds >= 500) + { + seconds++; + } + + string startTime = string.Format(format, p.StartTime.Minutes + p.StartTime.Hours * 60, seconds); + + seconds = p.EndTime.Seconds; + if (p.EndTime.Milliseconds >= 500) + { + seconds++; + } + + string timeOut = string.Format(format, p.EndTime.Minutes + p.EndTime.Hours * 60, seconds); + + sb.AppendLine(string.Format(paragraphWriteFormat, startTime, timeOut, p.Text)); + } + return sb.ToString().Trim(); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + Paragraph p = null; + _errorCount = 0; + + subtitle.Paragraphs.Clear(); + var sb = new StringBuilder(); + char[] splitChars = { '–', ' ' }; + foreach (string line in lines) + { + Match match; + if (line.Length > 11 && (match = RegexTimeCodes.Match(line)).Success) + { + if (p != null) + { + p.Text = (p.Text + Environment.NewLine + sb).Trim(); + } + + var parts = line.Substring(0, match.Length).Split(splitChars, StringSplitOptions.RemoveEmptyEntries); + try + { + p = new Paragraph { StartTime = DecodeTimeCode(parts[0]), EndTime = DecodeTimeCode(parts[1]) }; + p.Text = line.Substring(match.Length).Trim(); + subtitle.Paragraphs.Add(p); + sb.Clear(); + } + catch + { + p = null; + _errorCount++; + } + } + else if (p == null) + { + _errorCount++; + } + else + { + sb.AppendLine(line); + } + if (_errorCount > 20) + { + return; + } + } + if (p != null) + { + p.Text = (p.Text + Environment.NewLine + sb).Trim(); + } + + subtitle.Renumber(); + } + + private static TimeCode DecodeTimeCode(string code) + { + //68:20 (minutes:seconds) + var parts = code.Trim().Split(':'); + return new TimeCode(0, int.Parse(parts[0]), int.Parse(parts[1]), 0); + } + } +} diff --git a/libse/SubtitleFormats/UnknownSubtitle10.cs b/src/libse/SubtitleFormats/UnknownSubtitle10.cs similarity index 97% rename from libse/SubtitleFormats/UnknownSubtitle10.cs rename to src/libse/SubtitleFormats/UnknownSubtitle10.cs index 4acb05a69..dfa2f6cf9 100644 --- a/libse/SubtitleFormats/UnknownSubtitle10.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle10.cs @@ -1,120 +1,120 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Text; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class UnknownSubtitle10 : SubtitleFormat - { - public override string Extension => ".txt"; - - public override string Name => "Unknown 10"; - - public override string ToText(Subtitle subtitle, string title) - { - var sb = new StringBuilder(); - sb.Append("{\"language_code\":\"en\",\"subtitles\":["); - int i = 0; - foreach (Paragraph p in subtitle.Paragraphs) - { - if (i > 0) - { - sb.Append(','); - } - - sb.Append('{'); - sb.AppendFormat("\"content\":\"{0}\",\"start_time\":{1},\"end_time\":{2}", p.Text.Replace(Environment.NewLine, "
"), ((long)(Math.Round(p.StartTime.TotalMilliseconds))).ToString(CultureInfo.InvariantCulture), ((long)(Math.Round(p.EndTime.TotalMilliseconds))).ToString(CultureInfo.InvariantCulture)); - sb.Append('}'); - i++; - } - sb.Append("]}"); - return sb.ToString().Trim(); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - var temp = new StringBuilder(); - foreach (string l in lines) - { - temp.Append(l); - } - - string all = temp.ToString(); - if (!all.Contains("{\"content\":\"")) - { - return; - } - - var arr = all.Replace("\n", string.Empty).Replace("{\"content\":\"", "\n").Split('\n'); - - _errorCount = 0; - subtitle.Paragraphs.Clear(); - - // {"content":"La ce se gandeste Oh Ha Ni a noastra
de la inceputul dimineti?","start_time":314071,"end_time":317833}, - for (int i = 0; i < arr.Length; i++) - { - string line = arr[i].Trim(); - - int indexStartTime = line.IndexOf("\"start_time\":", StringComparison.Ordinal); - int indexEndTime = line.IndexOf("\"end_time\":", StringComparison.Ordinal); - if (indexStartTime > 0 && indexEndTime > 0) - { - int indexEndText = indexStartTime; - if (indexStartTime > indexEndTime) - { - indexEndText = indexEndTime; - } - - string text = line.Substring(0, indexEndText - 1).Trim().TrimEnd('\"'); - text = text.Replace("
", Environment.NewLine).Replace("
", Environment.NewLine); - text = text.Replace("
", Environment.NewLine).Replace("
", Environment.NewLine); - text = text.Replace(Environment.NewLine + " ", Environment.NewLine); - text = text.Replace(Environment.NewLine + " ", Environment.NewLine); - text = text.Replace(Environment.NewLine + " ", Environment.NewLine); - text = text.Replace(" " + Environment.NewLine, Environment.NewLine); - text = text.Replace(" " + Environment.NewLine, Environment.NewLine); - text = text.Replace(" " + Environment.NewLine, Environment.NewLine); - try - { - string start = line.Substring(indexStartTime); - string end = line.Substring(indexEndTime); - var paragraph = new Paragraph - { - Text = text, - StartTime = { TotalMilliseconds = GetMilliseconds(start) }, - EndTime = { TotalMilliseconds = GetMilliseconds(end) } - }; - subtitle.Paragraphs.Add(paragraph); - } - catch (Exception exception) - { - System.Diagnostics.Debug.WriteLine(exception.Message); - _errorCount++; - } - } - } - subtitle.Renumber(); - } - - private static double GetMilliseconds(string start) - { - while (start.Length > 1 && !start.StartsWith(':')) - { - start = start.Remove(0, 1); - } - - start = start.Trim().Trim(':').Trim('"').Trim(); - - int i = 0; - while (i < start.Length && char.IsDigit(start[i])) - { - i++; - } - - return int.Parse(start.Substring(0, i)); - } - - } -} +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class UnknownSubtitle10 : SubtitleFormat + { + public override string Extension => ".txt"; + + public override string Name => "Unknown 10"; + + public override string ToText(Subtitle subtitle, string title) + { + var sb = new StringBuilder(); + sb.Append("{\"language_code\":\"en\",\"subtitles\":["); + int i = 0; + foreach (Paragraph p in subtitle.Paragraphs) + { + if (i > 0) + { + sb.Append(','); + } + + sb.Append('{'); + sb.AppendFormat("\"content\":\"{0}\",\"start_time\":{1},\"end_time\":{2}", p.Text.Replace(Environment.NewLine, "
"), ((long)(Math.Round(p.StartTime.TotalMilliseconds))).ToString(CultureInfo.InvariantCulture), ((long)(Math.Round(p.EndTime.TotalMilliseconds))).ToString(CultureInfo.InvariantCulture)); + sb.Append('}'); + i++; + } + sb.Append("]}"); + return sb.ToString().Trim(); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + var temp = new StringBuilder(); + foreach (string l in lines) + { + temp.Append(l); + } + + string all = temp.ToString(); + if (!all.Contains("{\"content\":\"")) + { + return; + } + + var arr = all.Replace("\n", string.Empty).Replace("{\"content\":\"", "\n").Split('\n'); + + _errorCount = 0; + subtitle.Paragraphs.Clear(); + + // {"content":"La ce se gandeste Oh Ha Ni a noastra
de la inceputul dimineti?","start_time":314071,"end_time":317833}, + for (int i = 0; i < arr.Length; i++) + { + string line = arr[i].Trim(); + + int indexStartTime = line.IndexOf("\"start_time\":", StringComparison.Ordinal); + int indexEndTime = line.IndexOf("\"end_time\":", StringComparison.Ordinal); + if (indexStartTime > 0 && indexEndTime > 0) + { + int indexEndText = indexStartTime; + if (indexStartTime > indexEndTime) + { + indexEndText = indexEndTime; + } + + string text = line.Substring(0, indexEndText - 1).Trim().TrimEnd('\"'); + text = text.Replace("
", Environment.NewLine).Replace("
", Environment.NewLine); + text = text.Replace("
", Environment.NewLine).Replace("
", Environment.NewLine); + text = text.Replace(Environment.NewLine + " ", Environment.NewLine); + text = text.Replace(Environment.NewLine + " ", Environment.NewLine); + text = text.Replace(Environment.NewLine + " ", Environment.NewLine); + text = text.Replace(" " + Environment.NewLine, Environment.NewLine); + text = text.Replace(" " + Environment.NewLine, Environment.NewLine); + text = text.Replace(" " + Environment.NewLine, Environment.NewLine); + try + { + string start = line.Substring(indexStartTime); + string end = line.Substring(indexEndTime); + var paragraph = new Paragraph + { + Text = text, + StartTime = { TotalMilliseconds = GetMilliseconds(start) }, + EndTime = { TotalMilliseconds = GetMilliseconds(end) } + }; + subtitle.Paragraphs.Add(paragraph); + } + catch (Exception exception) + { + System.Diagnostics.Debug.WriteLine(exception.Message); + _errorCount++; + } + } + } + subtitle.Renumber(); + } + + private static double GetMilliseconds(string start) + { + while (start.Length > 1 && !start.StartsWith(':')) + { + start = start.Remove(0, 1); + } + + start = start.Trim().Trim(':').Trim('"').Trim(); + + int i = 0; + while (i < start.Length && char.IsDigit(start[i])) + { + i++; + } + + return int.Parse(start.Substring(0, i)); + } + + } +} diff --git a/libse/SubtitleFormats/UnknownSubtitle100.cs b/src/libse/SubtitleFormats/UnknownSubtitle100.cs similarity index 100% rename from libse/SubtitleFormats/UnknownSubtitle100.cs rename to src/libse/SubtitleFormats/UnknownSubtitle100.cs diff --git a/libse/SubtitleFormats/UnknownSubtitle101.cs b/src/libse/SubtitleFormats/UnknownSubtitle101.cs similarity index 100% rename from libse/SubtitleFormats/UnknownSubtitle101.cs rename to src/libse/SubtitleFormats/UnknownSubtitle101.cs diff --git a/libse/SubtitleFormats/UnknownSubtitle11.cs b/src/libse/SubtitleFormats/UnknownSubtitle11.cs similarity index 97% rename from libse/SubtitleFormats/UnknownSubtitle11.cs rename to src/libse/SubtitleFormats/UnknownSubtitle11.cs index 6adaaa110..818de403f 100644 --- a/libse/SubtitleFormats/UnknownSubtitle11.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle11.cs @@ -1,284 +1,284 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - /// - /// MicroDVD with time codes...? - /// - public class UnknownSubtitle11 : SubtitleFormat - { - private static readonly Regex RegexMicroDvdLine = new Regex(@"^\{-?\d+:\d+:\d+}\{-?\d+:\d+:\d+}.*$", RegexOptions.Compiled); - - public override string Extension => ".sub"; - - public override string Name => "Unknown 11"; - - public override bool IsMine(List lines, string fileName) - { - var trimmedLines = new List(); - int errors = 0; - foreach (string line in lines) - { - if (line.Contains('{')) - { - string s = RemoveIllegalSpacesAndFixEmptyCodes(line); - if (RegexMicroDvdLine.IsMatch(s)) - { - trimmedLines.Add(s); - } - else - { - errors++; - } - } - else - { - errors++; - } - } - - return trimmedLines.Count > errors; - } - - private static string RemoveIllegalSpacesAndFixEmptyCodes(string line) - { - int index = line.IndexOf('}'); - if (index >= 0 && index < line.Length) - { - index = line.IndexOf('}', index + 1); - if (index >= 0 && index + 1 < line.Length) - { - var indexOfBrackets = line.IndexOf("{}", StringComparison.Ordinal); - if (indexOfBrackets >= 0 && indexOfBrackets < index) - { - line = line.Insert(indexOfBrackets + 1, "0"); // set empty time codes to zero - index++; - } - - while (line.Contains(' ') && line.IndexOf(' ') < index) - { - line = line.Remove(line.IndexOf(' '), 1); - index--; - } - } - } - return line; - } - - private static string MakeTimeCode(TimeCode tc) - { - return string.Format("{0}:{1:00}:{2:00}", tc.Hours, tc.Minutes, tc.Seconds); - } - - public override string ToText(Subtitle subtitle, string title) - { - var sb = new StringBuilder(); - foreach (Paragraph p in subtitle.Paragraphs) - { - sb.Append('{'); - sb.Append(MakeTimeCode(p.StartTime)); - sb.Append("}{"); - sb.Append(MakeTimeCode(p.EndTime)); - sb.Append('}'); - - //{y:b} is italics for single line - //{Y:b} is italics for both lines - - var parts = p.Text.SplitToLines(); - int count = 0; - bool italicOn = false; - bool boldOn = false; - bool underlineOn = false; - var lineSb = new StringBuilder(); - foreach (string line in parts) - { - if (count > 0) - { - lineSb.Append('|'); - } - - if (line.StartsWith("") || italicOn) - { - italicOn = true; - boldOn = false; - underlineOn = false; - lineSb.Append("{y:i}"); // italic single line - } - else if (line.StartsWith("") || boldOn) - { - italicOn = false; - boldOn = true; - underlineOn = false; - lineSb.Append("{y:b}"); // bold single line - } - else if (line.StartsWith("") || underlineOn) - { - italicOn = false; - boldOn = false; - underlineOn = true; - lineSb.Append("{y:u}"); // underline single line - } - - if (line.Contains("")) - { - italicOn = false; - } - - if (line.Contains("")) - { - boldOn = false; - } - - if (line.Contains("")) - { - underlineOn = false; - } - - lineSb.Append(HtmlUtil.RemoveHtmlTags(line)); - count++; - } - string text = lineSb.ToString(); - int noOfLines = Utilities.CountTagInText(text, '|') + 1; - if (noOfLines > 1 && Utilities.CountTagInText(text, "{y:i}") == noOfLines) - { - text = "{Y:i}" + text.Replace("{y:i}", string.Empty); - } - else if (noOfLines > 1 && Utilities.CountTagInText(text, "{y:b}") == noOfLines) - { - text = "{Y:b}" + text.Replace("{y:b}", string.Empty); - } - else if (noOfLines > 1 && Utilities.CountTagInText(text, "{y:u}") == noOfLines) - { - text = "{Y:u}" + text.Replace("{y:u}", string.Empty); - } - - sb.AppendLine(HtmlUtil.RemoveHtmlTags(text)); - } - return sb.ToString().Trim(); - } - - private static TimeCode DecodeTimeCode(string timeCode) - { - string[] arr = timeCode.Split(SplitCharColon, StringSplitOptions.RemoveEmptyEntries); - return new TimeCode(int.Parse(arr[0]), int.Parse(arr[1]), int.Parse(arr[2]), 0); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - - foreach (string line in lines) - { - string s = RemoveIllegalSpacesAndFixEmptyCodes(line); - if (RegexMicroDvdLine.IsMatch(s)) - { - try - { - int textIndex = GetTextStartIndex(s); - if (textIndex < s.Length) - { - string text = s.Substring(textIndex); - string temp = s.Substring(0, textIndex - 1); - string[] frames = temp.Replace("}{", ";").Replace("{", string.Empty).Replace("}", string.Empty).Split(';'); - - TimeCode startTime = DecodeTimeCode(frames[0]); - TimeCode endTime = DecodeTimeCode(frames[1]); - - string post = string.Empty; - string[] parts = text.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries); - int count = 0; - var lineSb = new StringBuilder(); - foreach (string s2 in parts) - { - if (count > 0) - { - lineSb.AppendLine(); - } - - s = s2.Trim(); - if (s.StartsWith("{Y:i}")) - { - s = "" + s.Replace("{Y:i}", string.Empty); - post += ""; - } - else if (s.StartsWith("{Y:b}")) - { - s = "" + s.Replace("{Y:b}", string.Empty); - post += ""; - } - else if (s.StartsWith("{Y:u}")) - { - s = "" + s.Replace("{Y:u}", string.Empty); - post += ""; - } - else if (s.StartsWith("{y:i}")) - { - s = "" + s.Replace("{y:i}", string.Empty) + ""; - } - else if (s.StartsWith("{y:b}")) - { - s = "" + s.Replace("{y:b}", string.Empty) + ""; - } - else if (s.StartsWith("{y:u}")) - { - s = "" + s.Replace("{y:u}", string.Empty) + ""; - } - s = s.Replace("{Y:i}", string.Empty).Replace("{y:i}", string.Empty); - s = s.Replace("{Y:b}", string.Empty).Replace("{y:b}", string.Empty); - s = s.Replace("{Y:u}", string.Empty).Replace("{y:u}", string.Empty); - lineSb.Append(s); - count++; - } - text = lineSb + post; - subtitle.Paragraphs.Add(new Paragraph(startTime, endTime, text)); - } - } - catch - { - _errorCount++; - } - } - else - { - _errorCount++; - } - } - - int i = 0; - foreach (Paragraph p in subtitle.Paragraphs) - { - Paragraph previous = subtitle.GetParagraphOrDefault(i - 1); - if (p.StartTime.TotalMilliseconds == 0 && previous != null) - { - p.StartTime.TotalMilliseconds = previous.EndTime.TotalMilliseconds + 1; - } - if (p.EndTime.TotalMilliseconds == 0) - { - p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds; - } - i++; - } - - subtitle.Renumber(); - } - - private static int GetTextStartIndex(string line) - { - int i = 0; - int tagCount = 0; - while (i < line.Length && tagCount < 4) - { - if (line[i] == '{' || line[i] == '}') - { - tagCount++; - } - i++; - } - return i; - } - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + /// + /// MicroDVD with time codes...? + /// + public class UnknownSubtitle11 : SubtitleFormat + { + private static readonly Regex RegexMicroDvdLine = new Regex(@"^\{-?\d+:\d+:\d+}\{-?\d+:\d+:\d+}.*$", RegexOptions.Compiled); + + public override string Extension => ".sub"; + + public override string Name => "Unknown 11"; + + public override bool IsMine(List lines, string fileName) + { + var trimmedLines = new List(); + int errors = 0; + foreach (string line in lines) + { + if (line.Contains('{')) + { + string s = RemoveIllegalSpacesAndFixEmptyCodes(line); + if (RegexMicroDvdLine.IsMatch(s)) + { + trimmedLines.Add(s); + } + else + { + errors++; + } + } + else + { + errors++; + } + } + + return trimmedLines.Count > errors; + } + + private static string RemoveIllegalSpacesAndFixEmptyCodes(string line) + { + int index = line.IndexOf('}'); + if (index >= 0 && index < line.Length) + { + index = line.IndexOf('}', index + 1); + if (index >= 0 && index + 1 < line.Length) + { + var indexOfBrackets = line.IndexOf("{}", StringComparison.Ordinal); + if (indexOfBrackets >= 0 && indexOfBrackets < index) + { + line = line.Insert(indexOfBrackets + 1, "0"); // set empty time codes to zero + index++; + } + + while (line.Contains(' ') && line.IndexOf(' ') < index) + { + line = line.Remove(line.IndexOf(' '), 1); + index--; + } + } + } + return line; + } + + private static string MakeTimeCode(TimeCode tc) + { + return string.Format("{0}:{1:00}:{2:00}", tc.Hours, tc.Minutes, tc.Seconds); + } + + public override string ToText(Subtitle subtitle, string title) + { + var sb = new StringBuilder(); + foreach (Paragraph p in subtitle.Paragraphs) + { + sb.Append('{'); + sb.Append(MakeTimeCode(p.StartTime)); + sb.Append("}{"); + sb.Append(MakeTimeCode(p.EndTime)); + sb.Append('}'); + + //{y:b} is italics for single line + //{Y:b} is italics for both lines + + var parts = p.Text.SplitToLines(); + int count = 0; + bool italicOn = false; + bool boldOn = false; + bool underlineOn = false; + var lineSb = new StringBuilder(); + foreach (string line in parts) + { + if (count > 0) + { + lineSb.Append('|'); + } + + if (line.StartsWith("") || italicOn) + { + italicOn = true; + boldOn = false; + underlineOn = false; + lineSb.Append("{y:i}"); // italic single line + } + else if (line.StartsWith("") || boldOn) + { + italicOn = false; + boldOn = true; + underlineOn = false; + lineSb.Append("{y:b}"); // bold single line + } + else if (line.StartsWith("") || underlineOn) + { + italicOn = false; + boldOn = false; + underlineOn = true; + lineSb.Append("{y:u}"); // underline single line + } + + if (line.Contains("")) + { + italicOn = false; + } + + if (line.Contains("")) + { + boldOn = false; + } + + if (line.Contains("")) + { + underlineOn = false; + } + + lineSb.Append(HtmlUtil.RemoveHtmlTags(line)); + count++; + } + string text = lineSb.ToString(); + int noOfLines = Utilities.CountTagInText(text, '|') + 1; + if (noOfLines > 1 && Utilities.CountTagInText(text, "{y:i}") == noOfLines) + { + text = "{Y:i}" + text.Replace("{y:i}", string.Empty); + } + else if (noOfLines > 1 && Utilities.CountTagInText(text, "{y:b}") == noOfLines) + { + text = "{Y:b}" + text.Replace("{y:b}", string.Empty); + } + else if (noOfLines > 1 && Utilities.CountTagInText(text, "{y:u}") == noOfLines) + { + text = "{Y:u}" + text.Replace("{y:u}", string.Empty); + } + + sb.AppendLine(HtmlUtil.RemoveHtmlTags(text)); + } + return sb.ToString().Trim(); + } + + private static TimeCode DecodeTimeCode(string timeCode) + { + string[] arr = timeCode.Split(SplitCharColon, StringSplitOptions.RemoveEmptyEntries); + return new TimeCode(int.Parse(arr[0]), int.Parse(arr[1]), int.Parse(arr[2]), 0); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + + foreach (string line in lines) + { + string s = RemoveIllegalSpacesAndFixEmptyCodes(line); + if (RegexMicroDvdLine.IsMatch(s)) + { + try + { + int textIndex = GetTextStartIndex(s); + if (textIndex < s.Length) + { + string text = s.Substring(textIndex); + string temp = s.Substring(0, textIndex - 1); + string[] frames = temp.Replace("}{", ";").Replace("{", string.Empty).Replace("}", string.Empty).Split(';'); + + TimeCode startTime = DecodeTimeCode(frames[0]); + TimeCode endTime = DecodeTimeCode(frames[1]); + + string post = string.Empty; + string[] parts = text.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries); + int count = 0; + var lineSb = new StringBuilder(); + foreach (string s2 in parts) + { + if (count > 0) + { + lineSb.AppendLine(); + } + + s = s2.Trim(); + if (s.StartsWith("{Y:i}")) + { + s = "" + s.Replace("{Y:i}", string.Empty); + post += ""; + } + else if (s.StartsWith("{Y:b}")) + { + s = "" + s.Replace("{Y:b}", string.Empty); + post += ""; + } + else if (s.StartsWith("{Y:u}")) + { + s = "" + s.Replace("{Y:u}", string.Empty); + post += ""; + } + else if (s.StartsWith("{y:i}")) + { + s = "" + s.Replace("{y:i}", string.Empty) + ""; + } + else if (s.StartsWith("{y:b}")) + { + s = "" + s.Replace("{y:b}", string.Empty) + ""; + } + else if (s.StartsWith("{y:u}")) + { + s = "" + s.Replace("{y:u}", string.Empty) + ""; + } + s = s.Replace("{Y:i}", string.Empty).Replace("{y:i}", string.Empty); + s = s.Replace("{Y:b}", string.Empty).Replace("{y:b}", string.Empty); + s = s.Replace("{Y:u}", string.Empty).Replace("{y:u}", string.Empty); + lineSb.Append(s); + count++; + } + text = lineSb + post; + subtitle.Paragraphs.Add(new Paragraph(startTime, endTime, text)); + } + } + catch + { + _errorCount++; + } + } + else + { + _errorCount++; + } + } + + int i = 0; + foreach (Paragraph p in subtitle.Paragraphs) + { + Paragraph previous = subtitle.GetParagraphOrDefault(i - 1); + if (p.StartTime.TotalMilliseconds == 0 && previous != null) + { + p.StartTime.TotalMilliseconds = previous.EndTime.TotalMilliseconds + 1; + } + if (p.EndTime.TotalMilliseconds == 0) + { + p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds; + } + i++; + } + + subtitle.Renumber(); + } + + private static int GetTextStartIndex(string line) + { + int i = 0; + int tagCount = 0; + while (i < line.Length && tagCount < 4) + { + if (line[i] == '{' || line[i] == '}') + { + tagCount++; + } + i++; + } + return i; + } + } +} diff --git a/libse/SubtitleFormats/UnknownSubtitle12.cs b/src/libse/SubtitleFormats/UnknownSubtitle12.cs similarity index 96% rename from libse/SubtitleFormats/UnknownSubtitle12.cs rename to src/libse/SubtitleFormats/UnknownSubtitle12.cs index 7931d8e65..305be1444 100644 --- a/libse/SubtitleFormats/UnknownSubtitle12.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle12.cs @@ -1,91 +1,91 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - /// - ///4.01 5.12 - ///Dit is de dag. - /// - public class UnknownSubtitle12 : SubtitleFormat - { - private static readonly Regex RegexTimeCode = new Regex(@"^\d+\.\d\d\t\t\d+\.\d\d\t*$", RegexOptions.Compiled); - - public override string Extension => ".txt"; - - public override string Name => "Unknown 12"; - - private static string MakeTimeCode(TimeCode tc) - { - return string.Format(CultureInfo.InvariantCulture, "{0:0.00}", tc.TotalSeconds); - } - - public override string ToText(Subtitle subtitle, string title) - { - var sb = new StringBuilder(); - foreach (Paragraph p in subtitle.Paragraphs) - { - sb.Append(MakeTimeCode(p.StartTime)); - sb.Append("\t\t"); - sb.Append(MakeTimeCode(p.EndTime)); - sb.Append("\t\t\n"); - sb.Append(p.Text.Replace(Environment.NewLine, "\n") + "\n\n"); - } - return sb.ToString().Trim(); - } - - private static TimeCode DecodeTimeCode(string timeCode) - { - return TimeCode.FromSeconds(double.Parse(timeCode.Trim())); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - Paragraph p = null; - var text = new StringBuilder(); - foreach (string line in lines) - { - string s = line.Trim(); - if (RegexTimeCode.IsMatch(s)) - { - try - { - if (p != null) - { - p.Text = text.ToString().Trim(); - subtitle.Paragraphs.Add(p); - } - string[] arr = s.Split(new[] { '\t' }, StringSplitOptions.RemoveEmptyEntries); - text.Clear(); - p = new Paragraph(DecodeTimeCode(arr[0]), DecodeTimeCode(arr[1]), ""); - } - catch - { - _errorCount++; - p = null; - } - } - else if (p != null) - { - text.AppendLine(s); - } - else - { - _errorCount++; - } - } - if (p != null && text.Length > 0) - { - p.Text = text.ToString().Trim(); - subtitle.Paragraphs.Add(p); - } - subtitle.Renumber(); - } - - } -} +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + /// + ///4.01 5.12 + ///Dit is de dag. + /// + public class UnknownSubtitle12 : SubtitleFormat + { + private static readonly Regex RegexTimeCode = new Regex(@"^\d+\.\d\d\t\t\d+\.\d\d\t*$", RegexOptions.Compiled); + + public override string Extension => ".txt"; + + public override string Name => "Unknown 12"; + + private static string MakeTimeCode(TimeCode tc) + { + return string.Format(CultureInfo.InvariantCulture, "{0:0.00}", tc.TotalSeconds); + } + + public override string ToText(Subtitle subtitle, string title) + { + var sb = new StringBuilder(); + foreach (Paragraph p in subtitle.Paragraphs) + { + sb.Append(MakeTimeCode(p.StartTime)); + sb.Append("\t\t"); + sb.Append(MakeTimeCode(p.EndTime)); + sb.Append("\t\t\n"); + sb.Append(p.Text.Replace(Environment.NewLine, "\n") + "\n\n"); + } + return sb.ToString().Trim(); + } + + private static TimeCode DecodeTimeCode(string timeCode) + { + return TimeCode.FromSeconds(double.Parse(timeCode.Trim())); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + Paragraph p = null; + var text = new StringBuilder(); + foreach (string line in lines) + { + string s = line.Trim(); + if (RegexTimeCode.IsMatch(s)) + { + try + { + if (p != null) + { + p.Text = text.ToString().Trim(); + subtitle.Paragraphs.Add(p); + } + string[] arr = s.Split(new[] { '\t' }, StringSplitOptions.RemoveEmptyEntries); + text.Clear(); + p = new Paragraph(DecodeTimeCode(arr[0]), DecodeTimeCode(arr[1]), ""); + } + catch + { + _errorCount++; + p = null; + } + } + else if (p != null) + { + text.AppendLine(s); + } + else + { + _errorCount++; + } + } + if (p != null && text.Length > 0) + { + p.Text = text.ToString().Trim(); + subtitle.Paragraphs.Add(p); + } + subtitle.Renumber(); + } + + } +} diff --git a/libse/SubtitleFormats/UnknownSubtitle13.cs b/src/libse/SubtitleFormats/UnknownSubtitle13.cs similarity index 97% rename from libse/SubtitleFormats/UnknownSubtitle13.cs rename to src/libse/SubtitleFormats/UnknownSubtitle13.cs index 3a29077dd..b8c24599c 100644 --- a/libse/SubtitleFormats/UnknownSubtitle13.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle13.cs @@ -1,120 +1,120 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Text; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class UnknownSubtitle13 : SubtitleFormat - { - public override string Extension => ".xml"; - - public override string Name => "Unknown 13"; - - public override string ToText(Subtitle subtitle, string title) - { - string xmlStructure = - "" + Environment.NewLine + - ""; - - var xml = new XmlDocument(); - xml.LoadXml(xmlStructure); - - int id = 1; - foreach (Paragraph p in subtitle.Paragraphs) - { - XmlNode paragraph = xml.CreateElement("entry"); - - XmlAttribute duration = xml.CreateAttribute("timeOut"); - duration.InnerText = p.EndTime.ToString(); - paragraph.Attributes.Append(duration); - - XmlAttribute start = xml.CreateAttribute("timeIn"); - start.InnerText = p.StartTime.ToString(); - paragraph.Attributes.Append(start); - - XmlAttribute idAttr = xml.CreateAttribute("id"); - idAttr.InnerText = id.ToString(CultureInfo.InvariantCulture); - paragraph.Attributes.Append(idAttr); - - paragraph.InnerText = " lines, string fileName) - { - _errorCount = 0; - - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - - string allText = sb.ToString(); - if (!allText.Contains("") || !allText.Contains("timeIn=")) - { - return; - } - - var xml = new XmlDocument { XmlResolver = null }; - try - { - xml.LoadXml(allText); - } - catch (Exception exception) - { - System.Diagnostics.Debug.WriteLine(exception.Message); - _errorCount = 1; - return; - } - - foreach (XmlNode node in xml.DocumentElement.SelectNodes("entry")) - { - try - { - string start = node.Attributes["timeIn"].InnerText; - string end = node.Attributes["timeOut"].InnerText; - string text = node.InnerText; - if (text.StartsWith("![CDATA[", StringComparison.Ordinal)) - { - text = text.Remove(0, 8); - } - - if (text.StartsWith(" ".xml"; + + public override string Name => "Unknown 13"; + + public override string ToText(Subtitle subtitle, string title) + { + string xmlStructure = + "" + Environment.NewLine + + ""; + + var xml = new XmlDocument(); + xml.LoadXml(xmlStructure); + + int id = 1; + foreach (Paragraph p in subtitle.Paragraphs) + { + XmlNode paragraph = xml.CreateElement("entry"); + + XmlAttribute duration = xml.CreateAttribute("timeOut"); + duration.InnerText = p.EndTime.ToString(); + paragraph.Attributes.Append(duration); + + XmlAttribute start = xml.CreateAttribute("timeIn"); + start.InnerText = p.StartTime.ToString(); + paragraph.Attributes.Append(start); + + XmlAttribute idAttr = xml.CreateAttribute("id"); + idAttr.InnerText = id.ToString(CultureInfo.InvariantCulture); + paragraph.Attributes.Append(idAttr); + + paragraph.InnerText = " lines, string fileName) + { + _errorCount = 0; + + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + + string allText = sb.ToString(); + if (!allText.Contains("") || !allText.Contains("timeIn=")) + { + return; + } + + var xml = new XmlDocument { XmlResolver = null }; + try + { + xml.LoadXml(allText); + } + catch (Exception exception) + { + System.Diagnostics.Debug.WriteLine(exception.Message); + _errorCount = 1; + return; + } + + foreach (XmlNode node in xml.DocumentElement.SelectNodes("entry")) + { + try + { + string start = node.Attributes["timeIn"].InnerText; + string end = node.Attributes["timeOut"].InnerText; + string text = node.InnerText; + if (text.StartsWith("![CDATA[", StringComparison.Ordinal)) + { + text = text.Remove(0, 8); + } + + if (text.StartsWith(" ".xml"; - - public override string Name => "Unknown 14"; - - public override string ToText(Subtitle subtitle, string title) - { - // - // XYZ PRESENTS - // - - string xmlStructure = - "" + Environment.NewLine + - ""; - - var xml = new XmlDocument(); - xml.LoadXml(xmlStructure); - - foreach (Paragraph p in subtitle.Paragraphs) - { - XmlNode paragraph = xml.CreateElement("Phrase"); - - XmlAttribute start = xml.CreateAttribute("TimeStart"); - start.InnerText = ((long)(Math.Round(p.StartTime.TotalMilliseconds))).ToString(CultureInfo.InvariantCulture); - paragraph.Attributes.Append(start); - - XmlAttribute end = xml.CreateAttribute("TimeEnd"); - end.InnerText = ((long)(Math.Round(p.EndTime.TotalMilliseconds))).ToString(CultureInfo.InvariantCulture); - paragraph.Attributes.Append(end); - - XmlNode text = xml.CreateElement("Text"); - text.InnerText = HtmlUtil.RemoveHtmlTags(p.Text).Replace(Environment.NewLine, "\\n"); - paragraph.AppendChild(text); - - xml.DocumentElement.AppendChild(paragraph); - } - - return ToUtf8XmlString(xml); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - - var sb = new StringBuilder(); - lines.ForEach(line => sb.AppendLine(line)); - - string allText = sb.ToString(); - if (!allText.Contains(" ".xml"; + + public override string Name => "Unknown 14"; + + public override string ToText(Subtitle subtitle, string title) + { + // + // XYZ PRESENTS + // + + string xmlStructure = + "" + Environment.NewLine + + ""; + + var xml = new XmlDocument(); + xml.LoadXml(xmlStructure); + + foreach (Paragraph p in subtitle.Paragraphs) + { + XmlNode paragraph = xml.CreateElement("Phrase"); + + XmlAttribute start = xml.CreateAttribute("TimeStart"); + start.InnerText = ((long)(Math.Round(p.StartTime.TotalMilliseconds))).ToString(CultureInfo.InvariantCulture); + paragraph.Attributes.Append(start); + + XmlAttribute end = xml.CreateAttribute("TimeEnd"); + end.InnerText = ((long)(Math.Round(p.EndTime.TotalMilliseconds))).ToString(CultureInfo.InvariantCulture); + paragraph.Attributes.Append(end); + + XmlNode text = xml.CreateElement("Text"); + text.InnerText = HtmlUtil.RemoveHtmlTags(p.Text).Replace(Environment.NewLine, "\\n"); + paragraph.AppendChild(text); + + xml.DocumentElement.AppendChild(paragraph); + } + + return ToUtf8XmlString(xml); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + + string allText = sb.ToString(); + if (!allText.Contains(" ".xml"; - - public override string Name => "Unknown 15"; - - private static string ToTimeCode(TimeCode tc) - { - int last = (int)Math.Round(tc.Milliseconds / 10.0D + 0.5D); - return tc.ToString().Substring(0, 8) + ":" + string.Format("{0:0#}", last); - } - - private static TimeCode DecodeTimeCode(string s) - { - var parts = s.Split(new[] { ';', ':' }, StringSplitOptions.RemoveEmptyEntries); - return new TimeCode(int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2]), int.Parse(parts[3]) * 100); - } - - public override string ToText(Subtitle subtitle, string title) - { - // - //
")) - { - return; - } - - var xml = new XmlDocument { XmlResolver = null }; - try - { - string xmlText = sb.ToString(); - xml.LoadXml(xmlText); - var styles = new List { "speech" }; - - if (_promptForStyles) - { - var stylesWithCount = new Dictionary(); - foreach (XmlNode node in xml.SelectNodes("//annotation")) - { - try - { - if (node.Attributes["style"] != null && node.Attributes["style"].Value != null) - { - string style = node.Attributes["style"].Value; - - XmlNode textNode = node.SelectSingleNode("TEXT"); - XmlNodeList regions = node.SelectNodes("segment/movingRegion/anchoredRegion"); - - if (regions.Count != 2) - { - regions = node.SelectNodes("segment/movingRegion/rectRegion"); - } - - if (textNode != null && regions.Count == 2) - { - if (stylesWithCount.ContainsKey(style)) - { - stylesWithCount[style]++; - } - else - { - stylesWithCount.Add(style, 1); - } - } - } - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine(ex.Message); - } - } - if (stylesWithCount.Count > 1 && GetYouTubeAnnotationStyles != null) - { - styles = GetYouTubeAnnotationStyles.GetYouTubeAnnotationStyles(stylesWithCount); - } - else - { - styles.Clear(); - foreach (var k in stylesWithCount.Keys) - { - styles.Add(k); - } - } - } - else - { - styles.Add("popup"); - styles.Add("anchored"); - } - - foreach (XmlNode node in xml.SelectNodes("//annotation")) - { - try - { - if (node.Attributes["style"] != null && styles.Contains(node.Attributes["style"].Value)) - { - XmlNode textNode = node.SelectSingleNode("TEXT"); - XmlNodeList regions = node.SelectNodes("segment/movingRegion/anchoredRegion"); - - if (regions.Count != 2) - { - regions = node.SelectNodes("segment/movingRegion/rectRegion"); - } - - if (textNode != null && regions.Count == 2) - { - string startTime = regions[0].Attributes["t"].Value; - string endTime = regions[1].Attributes["t"].Value; - var p = new Paragraph(); - p.StartTime = DecodeTimeCode(startTime); - p.EndTime = DecodeTimeCode(endTime); - p.Text = textNode.InnerText; - subtitle.Paragraphs.Add(p); - } - } - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine(ex.Message); - _errorCount++; - } - } - subtitle.Sort(SubtitleSortCriteria.StartTime); // force order by start time - subtitle.Renumber(); - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine(ex.Message); - _errorCount = 1; - } - } - - private static TimeCode DecodeTimeCode(string time) - { - var arr = time.Split(new[] { '.', ':' }, StringSplitOptions.RemoveEmptyEntries); - if (arr.Length == 3) - { - return new TimeCode(0, int.Parse(arr[0]), int.Parse(arr[1]), int.Parse(arr[2])); - } - - return new TimeCode(int.Parse(arr[0]), int.Parse(arr[1]), int.Parse(arr[2]), int.Parse(arr[3])); - } - - private static string EncodeTime(TimeCode timeCode) - { - //0:01:08.0 - return $"{timeCode.Hours}:{timeCode.Minutes:00}:{timeCode.Seconds:00}.{timeCode.Milliseconds}"; - } - } -} +using Nikse.SubtitleEdit.Core.Enums; +using System; +using System.Collections.Generic; +using System.Text; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class YouTubeAnnotations : SubtitleFormat + { + public interface IGetYouTubeAnnotationStyles + { + List GetYouTubeAnnotationStyles(Dictionary stylesWithCount); + } + + public static IGetYouTubeAnnotationStyles GetYouTubeAnnotationStyles { get; set; } + + private bool _promptForStyles = true; + + public override string Extension => ".xml"; + + public static readonly string NameOfFormat = "YouTube Annotations"; + + public override string Name => NameOfFormat; + + public override bool IsMine(List lines, string fileName) + { + var subtitle = new Subtitle(); + _promptForStyles = false; + LoadSubtitle(subtitle, lines, fileName); + _promptForStyles = true; + return subtitle.Paragraphs.Count > 0; + } + + public override string ToText(Subtitle subtitle, string title) + { + string xmlStructure = + "" + Environment.NewLine + + "" + Environment.NewLine + + " " + Environment.NewLine + + " " + Environment.NewLine + + ""; + + var xml = new XmlDocument(); + xml.LoadXml(xmlStructure); + + XmlNode annotations = xml.DocumentElement.SelectSingleNode("annotations"); + + int count = 1; + foreach (Paragraph p in subtitle.Paragraphs) + { + // + // BUT now something inside is BROKEN! + // + // + // + // + // + // + // + + XmlNode annotation = xml.CreateElement("annotation"); + + XmlAttribute att = xml.CreateAttribute("id"); + att.InnerText = "annotation_" + count; + annotation.Attributes.Append(att); + + att = xml.CreateAttribute("author"); + att.InnerText = "Subtitle Edit"; + annotation.Attributes.Append(att); + + att = xml.CreateAttribute("type"); + att.InnerText = "text"; + annotation.Attributes.Append(att); + + att = xml.CreateAttribute("style"); + att.InnerText = "speech"; + annotation.Attributes.Append(att); + + XmlNode text = xml.CreateElement("TEXT"); + text.InnerText = p.Text; + annotation.AppendChild(text); + + XmlNode segment = xml.CreateElement("segment"); + annotation.AppendChild(segment); + + XmlNode movingRegion = xml.CreateElement("movingRegion"); + segment.AppendChild(movingRegion); + + att = xml.CreateAttribute("type"); + att.InnerText = "anchored"; + movingRegion.Attributes.Append(att); + + XmlNode anchoredRegion = xml.CreateElement("anchoredRegion"); + movingRegion.AppendChild(anchoredRegion); + att = xml.CreateAttribute("t"); + att.InnerText = EncodeTime(p.StartTime); + anchoredRegion.Attributes.Append(att); + att = xml.CreateAttribute("d"); + att.InnerText = "0"; + anchoredRegion.Attributes.Append(att); + + anchoredRegion = xml.CreateElement("anchoredRegion"); + movingRegion.AppendChild(anchoredRegion); + att = xml.CreateAttribute("t"); + att.InnerText = EncodeTime(p.EndTime); + anchoredRegion.Attributes.Append(att); + att = xml.CreateAttribute("d"); + att.InnerText = "0"; + anchoredRegion.Attributes.Append(att); + + annotations.AppendChild(annotation); + count++; + } + + return ToUtf8XmlString(xml); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + + var sb = new StringBuilder(); + lines.ForEach(line => sb.AppendLine(line)); + if (!sb.ToString().Contains("") || !sb.ToString().Contains("
")) + { + return; + } + + var xml = new XmlDocument { XmlResolver = null }; + try + { + string xmlText = sb.ToString(); + xml.LoadXml(xmlText); + var styles = new List { "speech" }; + + if (_promptForStyles) + { + var stylesWithCount = new Dictionary(); + foreach (XmlNode node in xml.SelectNodes("//annotation")) + { + try + { + if (node.Attributes["style"] != null && node.Attributes["style"].Value != null) + { + string style = node.Attributes["style"].Value; + + XmlNode textNode = node.SelectSingleNode("TEXT"); + XmlNodeList regions = node.SelectNodes("segment/movingRegion/anchoredRegion"); + + if (regions.Count != 2) + { + regions = node.SelectNodes("segment/movingRegion/rectRegion"); + } + + if (textNode != null && regions.Count == 2) + { + if (stylesWithCount.ContainsKey(style)) + { + stylesWithCount[style]++; + } + else + { + stylesWithCount.Add(style, 1); + } + } + } + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine(ex.Message); + } + } + if (stylesWithCount.Count > 1 && GetYouTubeAnnotationStyles != null) + { + styles = GetYouTubeAnnotationStyles.GetYouTubeAnnotationStyles(stylesWithCount); + } + else + { + styles.Clear(); + foreach (var k in stylesWithCount.Keys) + { + styles.Add(k); + } + } + } + else + { + styles.Add("popup"); + styles.Add("anchored"); + } + + foreach (XmlNode node in xml.SelectNodes("//annotation")) + { + try + { + if (node.Attributes["style"] != null && styles.Contains(node.Attributes["style"].Value)) + { + XmlNode textNode = node.SelectSingleNode("TEXT"); + XmlNodeList regions = node.SelectNodes("segment/movingRegion/anchoredRegion"); + + if (regions.Count != 2) + { + regions = node.SelectNodes("segment/movingRegion/rectRegion"); + } + + if (textNode != null && regions.Count == 2) + { + string startTime = regions[0].Attributes["t"].Value; + string endTime = regions[1].Attributes["t"].Value; + var p = new Paragraph(); + p.StartTime = DecodeTimeCode(startTime); + p.EndTime = DecodeTimeCode(endTime); + p.Text = textNode.InnerText; + subtitle.Paragraphs.Add(p); + } + } + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine(ex.Message); + _errorCount++; + } + } + subtitle.Sort(SubtitleSortCriteria.StartTime); // force order by start time + subtitle.Renumber(); + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine(ex.Message); + _errorCount = 1; + } + } + + private static TimeCode DecodeTimeCode(string time) + { + var arr = time.Split(new[] { '.', ':' }, StringSplitOptions.RemoveEmptyEntries); + if (arr.Length == 3) + { + return new TimeCode(0, int.Parse(arr[0]), int.Parse(arr[1]), int.Parse(arr[2])); + } + + return new TimeCode(int.Parse(arr[0]), int.Parse(arr[1]), int.Parse(arr[2]), int.Parse(arr[3])); + } + + private static string EncodeTime(TimeCode timeCode) + { + //0:01:08.0 + return $"{timeCode.Hours}:{timeCode.Minutes:00}:{timeCode.Seconds:00}.{timeCode.Milliseconds}"; + } + } +} diff --git a/libse/SubtitleFormats/YouTubeSbv.cs b/src/libse/SubtitleFormats/YouTubeSbv.cs similarity index 97% rename from libse/SubtitleFormats/YouTubeSbv.cs rename to src/libse/SubtitleFormats/YouTubeSbv.cs index 85bf3b839..dc8fee3fe 100644 --- a/libse/SubtitleFormats/YouTubeSbv.cs +++ b/src/libse/SubtitleFormats/YouTubeSbv.cs @@ -1,179 +1,179 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - /// - /// YouTube "SubViewer" format... I think YouTube tried to add "SubViewer 2.0" support but instread they created their own format... nice ;) - /// - public class YouTubeSbv : SubtitleFormat - { - private enum ExpectingLine - { - TimeCodes, - Text - } - - private Paragraph _paragraph; - private ExpectingLine _expecting = ExpectingLine.TimeCodes; - private static readonly Regex RegexTimeCodes = new Regex(@"^-?\d+:-?\d+:-?\d+[:,.]-?\d+,\d+:-?\d+:-?\d+[:,.]-?\d+$", RegexOptions.Compiled); - - public override string Extension => ".sbv"; - - public override string Name => "YouTube sbv"; - - public override string ToText(Subtitle subtitle, string title) - { - const string paragraphWriteFormat = "{0},{1}\r\n{2}\r\n\r\n"; - - var sb = new StringBuilder(); - foreach (Paragraph p in subtitle.Paragraphs) - { - sb.AppendFormat(paragraphWriteFormat, FormatTime(p.StartTime), FormatTime(p.EndTime), p.Text); - } - return sb.ToString().Trim(); - } - - private static string FormatTime(TimeCode timeCode) - { - return $"{timeCode.Hours}:{timeCode.Minutes:00}:{timeCode.Seconds:00}.{timeCode.Milliseconds:000}"; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - //0:00:07.500,0:00:13.500 - //In den Bergen über Musanze in Ruanda feiert die Trustbank (Kreditnehmer-Gruppe) "Trususanze" ihren Erfolg. - - //0:00:14.000,0:00:17.000 - //Indem sie ihre Zukunft einander anvertraut haben, haben sie sich - - _paragraph = new Paragraph(); - _expecting = ExpectingLine.TimeCodes; - _errorCount = 0; - - subtitle.Paragraphs.Clear(); - for (int i = 0; i < lines.Count; i++) - { - string line = lines[i].TrimEnd(); - string next = string.Empty; - if (i + 1 < lines.Count) - { - next = lines[i + 1]; - } - - // A new line is missing between two paragraphs (buggy srt file) - if (_expecting == ExpectingLine.Text && i + 1 < lines.Count && - _paragraph != null && !string.IsNullOrEmpty(_paragraph.Text) && - RegexTimeCodes.IsMatch(lines[i])) - { - ReadLine(subtitle, string.Empty, string.Empty); - } - - ReadLine(subtitle, line, next); - } - if (_paragraph != null && !string.IsNullOrWhiteSpace(_paragraph.Text)) - { - subtitle.Paragraphs.Add(_paragraph); - } - - foreach (Paragraph p in subtitle.Paragraphs) - { - p.Text = p.Text.Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); - } - - subtitle.Renumber(); - } - - private void ReadLine(Subtitle subtitle, string line, string next) - { - switch (_expecting) - { - case ExpectingLine.TimeCodes: - if (TryReadTimeCodesLine(line, _paragraph)) - { - _paragraph.Text = string.Empty; - _expecting = ExpectingLine.Text; - } - else if (!string.IsNullOrWhiteSpace(line)) - { - _errorCount++; - } - break; - case ExpectingLine.Text: - if (!string.IsNullOrWhiteSpace(line)) - { - if (_paragraph.Text.Length > 0) - { - _paragraph.Text += Environment.NewLine; - } - - _paragraph.Text += RemoveBadChars(line).TrimEnd(); - } - else if (IsText(next)) - { - if (_paragraph.Text.Length > 0) - { - _paragraph.Text += Environment.NewLine; - } - - _paragraph.Text += RemoveBadChars(line).TrimEnd(); - } - else - { - subtitle.Paragraphs.Add(_paragraph); - _paragraph = new Paragraph(); - _expecting = ExpectingLine.TimeCodes; - } - break; - } - } - - private static bool IsText(string text) - { - if (string.IsNullOrWhiteSpace(text) || Utilities.IsInteger(text) || RegexTimeCodes.IsMatch(text)) - { - return false; - } - - return true; - } - - private static string RemoveBadChars(string line) - { - return line.Replace('\0', ' '); - } - - private static bool TryReadTimeCodesLine(string inputLine, Paragraph paragraph) - { - var line = inputLine.Replace('.', ':').Replace('،', ',').Replace('¡', ':'); - - if (RegexTimeCodes.IsMatch(line)) - { - line = line.Replace(',', ':'); - string[] parts = line.RemoveChar(' ').Split(':', ','); - try - { - int startHours = int.Parse(parts[0]); - int startMinutes = int.Parse(parts[1]); - int startSeconds = int.Parse(parts[2]); - int startMilliseconds = int.Parse(parts[3]); - int endHours = int.Parse(parts[4]); - int endMinutes = int.Parse(parts[5]); - int endSeconds = int.Parse(parts[6]); - int endMilliseconds = int.Parse(parts[7]); - paragraph.StartTime = new TimeCode(startHours, startMinutes, startSeconds, startMilliseconds); - paragraph.EndTime = new TimeCode(endHours, endMinutes, endSeconds, endMilliseconds); - return true; - } - catch - { - return false; - } - } - return false; - } - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + /// + /// YouTube "SubViewer" format... I think YouTube tried to add "SubViewer 2.0" support but instread they created their own format... nice ;) + /// + public class YouTubeSbv : SubtitleFormat + { + private enum ExpectingLine + { + TimeCodes, + Text + } + + private Paragraph _paragraph; + private ExpectingLine _expecting = ExpectingLine.TimeCodes; + private static readonly Regex RegexTimeCodes = new Regex(@"^-?\d+:-?\d+:-?\d+[:,.]-?\d+,\d+:-?\d+:-?\d+[:,.]-?\d+$", RegexOptions.Compiled); + + public override string Extension => ".sbv"; + + public override string Name => "YouTube sbv"; + + public override string ToText(Subtitle subtitle, string title) + { + const string paragraphWriteFormat = "{0},{1}\r\n{2}\r\n\r\n"; + + var sb = new StringBuilder(); + foreach (Paragraph p in subtitle.Paragraphs) + { + sb.AppendFormat(paragraphWriteFormat, FormatTime(p.StartTime), FormatTime(p.EndTime), p.Text); + } + return sb.ToString().Trim(); + } + + private static string FormatTime(TimeCode timeCode) + { + return $"{timeCode.Hours}:{timeCode.Minutes:00}:{timeCode.Seconds:00}.{timeCode.Milliseconds:000}"; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + //0:00:07.500,0:00:13.500 + //In den Bergen über Musanze in Ruanda feiert die Trustbank (Kreditnehmer-Gruppe) "Trususanze" ihren Erfolg. + + //0:00:14.000,0:00:17.000 + //Indem sie ihre Zukunft einander anvertraut haben, haben sie sich + + _paragraph = new Paragraph(); + _expecting = ExpectingLine.TimeCodes; + _errorCount = 0; + + subtitle.Paragraphs.Clear(); + for (int i = 0; i < lines.Count; i++) + { + string line = lines[i].TrimEnd(); + string next = string.Empty; + if (i + 1 < lines.Count) + { + next = lines[i + 1]; + } + + // A new line is missing between two paragraphs (buggy srt file) + if (_expecting == ExpectingLine.Text && i + 1 < lines.Count && + _paragraph != null && !string.IsNullOrEmpty(_paragraph.Text) && + RegexTimeCodes.IsMatch(lines[i])) + { + ReadLine(subtitle, string.Empty, string.Empty); + } + + ReadLine(subtitle, line, next); + } + if (_paragraph != null && !string.IsNullOrWhiteSpace(_paragraph.Text)) + { + subtitle.Paragraphs.Add(_paragraph); + } + + foreach (Paragraph p in subtitle.Paragraphs) + { + p.Text = p.Text.Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); + } + + subtitle.Renumber(); + } + + private void ReadLine(Subtitle subtitle, string line, string next) + { + switch (_expecting) + { + case ExpectingLine.TimeCodes: + if (TryReadTimeCodesLine(line, _paragraph)) + { + _paragraph.Text = string.Empty; + _expecting = ExpectingLine.Text; + } + else if (!string.IsNullOrWhiteSpace(line)) + { + _errorCount++; + } + break; + case ExpectingLine.Text: + if (!string.IsNullOrWhiteSpace(line)) + { + if (_paragraph.Text.Length > 0) + { + _paragraph.Text += Environment.NewLine; + } + + _paragraph.Text += RemoveBadChars(line).TrimEnd(); + } + else if (IsText(next)) + { + if (_paragraph.Text.Length > 0) + { + _paragraph.Text += Environment.NewLine; + } + + _paragraph.Text += RemoveBadChars(line).TrimEnd(); + } + else + { + subtitle.Paragraphs.Add(_paragraph); + _paragraph = new Paragraph(); + _expecting = ExpectingLine.TimeCodes; + } + break; + } + } + + private static bool IsText(string text) + { + if (string.IsNullOrWhiteSpace(text) || Utilities.IsInteger(text) || RegexTimeCodes.IsMatch(text)) + { + return false; + } + + return true; + } + + private static string RemoveBadChars(string line) + { + return line.Replace('\0', ' '); + } + + private static bool TryReadTimeCodesLine(string inputLine, Paragraph paragraph) + { + var line = inputLine.Replace('.', ':').Replace('،', ',').Replace('¡', ':'); + + if (RegexTimeCodes.IsMatch(line)) + { + line = line.Replace(',', ':'); + string[] parts = line.RemoveChar(' ').Split(':', ','); + try + { + int startHours = int.Parse(parts[0]); + int startMinutes = int.Parse(parts[1]); + int startSeconds = int.Parse(parts[2]); + int startMilliseconds = int.Parse(parts[3]); + int endHours = int.Parse(parts[4]); + int endMinutes = int.Parse(parts[5]); + int endSeconds = int.Parse(parts[6]); + int endMilliseconds = int.Parse(parts[7]); + paragraph.StartTime = new TimeCode(startHours, startMinutes, startSeconds, startMilliseconds); + paragraph.EndTime = new TimeCode(endHours, endMinutes, endSeconds, endMilliseconds); + return true; + } + catch + { + return false; + } + } + return false; + } + } +} diff --git a/libse/SubtitleFormats/YouTubeTranscript.cs b/src/libse/SubtitleFormats/YouTubeTranscript.cs similarity index 97% rename from libse/SubtitleFormats/YouTubeTranscript.cs rename to src/libse/SubtitleFormats/YouTubeTranscript.cs index 364936438..0ca65ff2e 100644 --- a/libse/SubtitleFormats/YouTubeTranscript.cs +++ b/src/libse/SubtitleFormats/YouTubeTranscript.cs @@ -1,96 +1,96 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class YouTubeTranscript : SubtitleFormat - { - private static readonly Regex RegexTimeCodes = new Regex(@"^\d{1,3}:\d\d$", RegexOptions.Compiled); - - public override string Extension => ".txt"; - - public override string Name => "YouTube Transcript"; - - public override string ToText(Subtitle subtitle, string title) - { - var sb = new StringBuilder(); - foreach (Paragraph p in subtitle.Paragraphs) - { - sb.AppendLine(string.Format("{0}" + Environment.NewLine + "{1}", EncodeTimeCode(p.StartTime), HtmlUtil.RemoveHtmlTags(p.Text.Replace(Environment.NewLine, " ")))); - } - return sb.ToString(); - } - - public override bool IsMine(List lines, string fileName) - { - if (new UnknownSubtitle88().IsMine(lines, fileName)) - { - return false; - } - - return base.IsMine(lines, fileName); - } - - private static string EncodeTimeCode(TimeCode time) - { - return $"{time.Hours * 60 + time.Minutes}:{time.Seconds:00}"; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - Paragraph p = null; - subtitle.Paragraphs.Clear(); - foreach (string line in lines) - { - var s = line.TrimEnd(); - if (RegexTimeCodes.IsMatch(s)) - { - p = new Paragraph(DecodeTimeCode(s), new TimeCode(), string.Empty); - subtitle.Paragraphs.Add(p); - } - else if (string.IsNullOrWhiteSpace(s)) - { - // skip these lines - } - else if (p != null) - { - if (string.IsNullOrEmpty(p.Text)) - { - p.Text = s; - } - else - { - p.Text = p.Text + Environment.NewLine + s; - } - - if (p.Text.Length > 800) - { - _errorCount++; - return; - } - } - } - foreach (Paragraph p2 in subtitle.Paragraphs) - { - p2.Text = Utilities.AutoBreakLine(p2.Text); - } - subtitle.RecalculateDisplayTimes(Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds, null, Configuration.Settings.General.SubtitleOptimalCharactersPerSeconds); - subtitle.Renumber(); - } - - private static TimeCode DecodeTimeCode(string s) - { - string[] parts = s.Split(':'); - - var minutes = int.Parse(parts[0]); - var seconds = int.Parse(parts[1]); - - return new TimeCode(0, minutes, seconds, 0); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class YouTubeTranscript : SubtitleFormat + { + private static readonly Regex RegexTimeCodes = new Regex(@"^\d{1,3}:\d\d$", RegexOptions.Compiled); + + public override string Extension => ".txt"; + + public override string Name => "YouTube Transcript"; + + public override string ToText(Subtitle subtitle, string title) + { + var sb = new StringBuilder(); + foreach (Paragraph p in subtitle.Paragraphs) + { + sb.AppendLine(string.Format("{0}" + Environment.NewLine + "{1}", EncodeTimeCode(p.StartTime), HtmlUtil.RemoveHtmlTags(p.Text.Replace(Environment.NewLine, " ")))); + } + return sb.ToString(); + } + + public override bool IsMine(List lines, string fileName) + { + if (new UnknownSubtitle88().IsMine(lines, fileName)) + { + return false; + } + + return base.IsMine(lines, fileName); + } + + private static string EncodeTimeCode(TimeCode time) + { + return $"{time.Hours * 60 + time.Minutes}:{time.Seconds:00}"; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + Paragraph p = null; + subtitle.Paragraphs.Clear(); + foreach (string line in lines) + { + var s = line.TrimEnd(); + if (RegexTimeCodes.IsMatch(s)) + { + p = new Paragraph(DecodeTimeCode(s), new TimeCode(), string.Empty); + subtitle.Paragraphs.Add(p); + } + else if (string.IsNullOrWhiteSpace(s)) + { + // skip these lines + } + else if (p != null) + { + if (string.IsNullOrEmpty(p.Text)) + { + p.Text = s; + } + else + { + p.Text = p.Text + Environment.NewLine + s; + } + + if (p.Text.Length > 800) + { + _errorCount++; + return; + } + } + } + foreach (Paragraph p2 in subtitle.Paragraphs) + { + p2.Text = Utilities.AutoBreakLine(p2.Text); + } + subtitle.RecalculateDisplayTimes(Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds, null, Configuration.Settings.General.SubtitleOptimalCharactersPerSeconds); + subtitle.Renumber(); + } + + private static TimeCode DecodeTimeCode(string s) + { + string[] parts = s.Split(':'); + + var minutes = int.Parse(parts[0]); + var seconds = int.Parse(parts[1]); + + return new TimeCode(0, minutes, seconds, 0); + } + + } +} diff --git a/libse/SubtitleFormats/YouTubeTranscriptOneLine.cs b/src/libse/SubtitleFormats/YouTubeTranscriptOneLine.cs similarity index 97% rename from libse/SubtitleFormats/YouTubeTranscriptOneLine.cs rename to src/libse/SubtitleFormats/YouTubeTranscriptOneLine.cs index 2ed4a315f..dc672ee32 100644 --- a/libse/SubtitleFormats/YouTubeTranscriptOneLine.cs +++ b/src/libse/SubtitleFormats/YouTubeTranscriptOneLine.cs @@ -1,76 +1,76 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class YouTubeTranscriptOneLine : SubtitleFormat - { - private static readonly Regex RegexTimeCodes = new Regex(@"^\d{1,3}:\d\d.+$", RegexOptions.Compiled); - - public override string Extension => ".txt"; - - public override string Name => "YouTube Transcript one line"; - - public override string ToText(Subtitle subtitle, string title) - { - var sb = new StringBuilder(); - const string writeFormat = "{0}{1}"; - foreach (Paragraph p in subtitle.Paragraphs) - { - sb.AppendLine(string.Format(writeFormat, EncodeTimeCode(p.StartTime), HtmlUtil.RemoveHtmlTags(p.Text.Replace(Environment.NewLine, " ")))); - } - return sb.ToString(); - } - - private static string EncodeTimeCode(TimeCode time) - { - return $"{time.Hours * 60 + time.Minutes}:{time.Seconds:00}"; - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - subtitle.Paragraphs.Clear(); - char[] trimChars = { '–', '.', ';', ':' }; - foreach (string line in lines) - { - if (RegexTimeCodes.IsMatch(line)) - { - int splitter = line.IndexOf(':') + 3; - string text = line.Remove(0, splitter); - var p = new Paragraph(DecodeTimeCode(line.Substring(0, splitter)), new TimeCode(), text); - subtitle.Paragraphs.Add(p); - text = text.Trim().Trim(trimChars).Trim(); - if (text.Length > 0 && char.IsDigit(text[0])) - { - _errorCount++; - } - } - else - { - _errorCount += 2; - } - } - foreach (Paragraph p2 in subtitle.Paragraphs) - { - p2.Text = Utilities.AutoBreakLine(p2.Text); - } - subtitle.RecalculateDisplayTimes(Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds, null, Configuration.Settings.General.SubtitleOptimalCharactersPerSeconds); - subtitle.Renumber(); - } - - private static TimeCode DecodeTimeCode(string s) - { - string[] parts = s.Split(':'); - - string minutes = parts[0]; - string seconds = parts[1]; - - return new TimeCode(0, int.Parse(minutes), int.Parse(seconds), 0); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class YouTubeTranscriptOneLine : SubtitleFormat + { + private static readonly Regex RegexTimeCodes = new Regex(@"^\d{1,3}:\d\d.+$", RegexOptions.Compiled); + + public override string Extension => ".txt"; + + public override string Name => "YouTube Transcript one line"; + + public override string ToText(Subtitle subtitle, string title) + { + var sb = new StringBuilder(); + const string writeFormat = "{0}{1}"; + foreach (Paragraph p in subtitle.Paragraphs) + { + sb.AppendLine(string.Format(writeFormat, EncodeTimeCode(p.StartTime), HtmlUtil.RemoveHtmlTags(p.Text.Replace(Environment.NewLine, " ")))); + } + return sb.ToString(); + } + + private static string EncodeTimeCode(TimeCode time) + { + return $"{time.Hours * 60 + time.Minutes}:{time.Seconds:00}"; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + subtitle.Paragraphs.Clear(); + char[] trimChars = { '–', '.', ';', ':' }; + foreach (string line in lines) + { + if (RegexTimeCodes.IsMatch(line)) + { + int splitter = line.IndexOf(':') + 3; + string text = line.Remove(0, splitter); + var p = new Paragraph(DecodeTimeCode(line.Substring(0, splitter)), new TimeCode(), text); + subtitle.Paragraphs.Add(p); + text = text.Trim().Trim(trimChars).Trim(); + if (text.Length > 0 && char.IsDigit(text[0])) + { + _errorCount++; + } + } + else + { + _errorCount += 2; + } + } + foreach (Paragraph p2 in subtitle.Paragraphs) + { + p2.Text = Utilities.AutoBreakLine(p2.Text); + } + subtitle.RecalculateDisplayTimes(Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds, null, Configuration.Settings.General.SubtitleOptimalCharactersPerSeconds); + subtitle.Renumber(); + } + + private static TimeCode DecodeTimeCode(string s) + { + string[] parts = s.Split(':'); + + string minutes = parts[0]; + string seconds = parts[1]; + + return new TimeCode(0, int.Parse(minutes), int.Parse(seconds), 0); + } + + } +} diff --git a/libse/SubtitleFormats/ZeroG.cs b/src/libse/SubtitleFormats/ZeroG.cs similarity index 97% rename from libse/SubtitleFormats/ZeroG.cs rename to src/libse/SubtitleFormats/ZeroG.cs index 0771182b5..db327292d 100644 --- a/libse/SubtitleFormats/ZeroG.cs +++ b/src/libse/SubtitleFormats/ZeroG.cs @@ -1,83 +1,83 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Core.SubtitleFormats -{ - public class ZeroG : SubtitleFormat - { - //E 1 0:50:05.42 0:50:10.06 Default NTP - private static readonly Regex RegexTimeCodes = new Regex(@"^E 1 \d:\d\d:\d\d.\d\d \d:\d\d:\d\d.\d\d Default NTP ", RegexOptions.Compiled); - - public override string Extension => ".zeg"; - - public override string Name => "Zero G"; - - public override string ToText(Subtitle subtitle, string title) - { - //% Zero G 1.0 - - //E 1 0:50:20.22 0:50:21.38 Default NTP Die Frage ist: - //E 1 0:50:21.54 0:50:25.86 Default NTP Wieso habe ich überlebt? - //E 1 0:50:27.30 0:50:30.78 Default NTP Was habe ich richtig gemacht? \n Ich weiß es nicht. - const string paragraphWriteFormat = "E 1 {0} {1} Default NTP {2}"; - - var sb = new StringBuilder(); - sb.AppendLine("% Zero G 1.0"); - sb.AppendLine(); - foreach (Paragraph p in subtitle.Paragraphs) - { - string text = p.Text.Replace(Environment.NewLine, " \\n "); - sb.AppendLine(string.Format(paragraphWriteFormat, EncodeTimeCode(p.StartTime), EncodeTimeCode(p.EndTime), text)); - } - return sb.ToString().Trim(); - } - - public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) - { - _errorCount = 0; - subtitle.Paragraphs.Clear(); - foreach (string line in lines) - { - var s = line.Trim(); - if (s.Length > 35 && RegexTimeCodes.IsMatch(s)) - { - try - { - string timePart = s.Substring(4, 10).TrimEnd(); - var start = DecodeTimeCode(timePart); - timePart = s.Substring(15, 10).Trim(); - var end = DecodeTimeCode(timePart); - var paragraph = new Paragraph { StartTime = start, EndTime = end }; - paragraph.Text = s.Substring(38).Replace(" \\n ", Environment.NewLine).Replace("\\n", Environment.NewLine); - subtitle.Paragraphs.Add(paragraph); - } - catch - { - _errorCount++; - } - } - } - subtitle.Renumber(); - } - - private static string EncodeTimeCode(TimeCode time) - { - //0:50:05.42 - return string.Format("{0:0}:{1:00}:{2:00}.{3:00}", time.Hours, time.Minutes, time.Seconds, time.Milliseconds / 10); - } - - private static TimeCode DecodeTimeCode(string timePart) - { - string[] parts = timePart.Split(new[] { ':', '.' }, StringSplitOptions.RemoveEmptyEntries); - int hours = int.Parse(parts[0]); - int minutes = int.Parse(parts[1]); - int seconds = int.Parse(parts[2]); - int milliseconds = int.Parse(parts[3]) * 10; - return new TimeCode(hours, minutes, seconds, milliseconds); - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class ZeroG : SubtitleFormat + { + //E 1 0:50:05.42 0:50:10.06 Default NTP + private static readonly Regex RegexTimeCodes = new Regex(@"^E 1 \d:\d\d:\d\d.\d\d \d:\d\d:\d\d.\d\d Default NTP ", RegexOptions.Compiled); + + public override string Extension => ".zeg"; + + public override string Name => "Zero G"; + + public override string ToText(Subtitle subtitle, string title) + { + //% Zero G 1.0 + + //E 1 0:50:20.22 0:50:21.38 Default NTP Die Frage ist: + //E 1 0:50:21.54 0:50:25.86 Default NTP Wieso habe ich überlebt? + //E 1 0:50:27.30 0:50:30.78 Default NTP Was habe ich richtig gemacht? \n Ich weiß es nicht. + const string paragraphWriteFormat = "E 1 {0} {1} Default NTP {2}"; + + var sb = new StringBuilder(); + sb.AppendLine("% Zero G 1.0"); + sb.AppendLine(); + foreach (Paragraph p in subtitle.Paragraphs) + { + string text = p.Text.Replace(Environment.NewLine, " \\n "); + sb.AppendLine(string.Format(paragraphWriteFormat, EncodeTimeCode(p.StartTime), EncodeTimeCode(p.EndTime), text)); + } + return sb.ToString().Trim(); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + subtitle.Paragraphs.Clear(); + foreach (string line in lines) + { + var s = line.Trim(); + if (s.Length > 35 && RegexTimeCodes.IsMatch(s)) + { + try + { + string timePart = s.Substring(4, 10).TrimEnd(); + var start = DecodeTimeCode(timePart); + timePart = s.Substring(15, 10).Trim(); + var end = DecodeTimeCode(timePart); + var paragraph = new Paragraph { StartTime = start, EndTime = end }; + paragraph.Text = s.Substring(38).Replace(" \\n ", Environment.NewLine).Replace("\\n", Environment.NewLine); + subtitle.Paragraphs.Add(paragraph); + } + catch + { + _errorCount++; + } + } + } + subtitle.Renumber(); + } + + private static string EncodeTimeCode(TimeCode time) + { + //0:50:05.42 + return string.Format("{0:0}:{1:00}:{2:00}.{3:00}", time.Hours, time.Minutes, time.Seconds, time.Milliseconds / 10); + } + + private static TimeCode DecodeTimeCode(string timePart) + { + string[] parts = timePart.Split(new[] { ':', '.' }, StringSplitOptions.RemoveEmptyEntries); + int hours = int.Parse(parts[0]); + int minutes = int.Parse(parts[1]); + int seconds = int.Parse(parts[2]); + int milliseconds = int.Parse(parts[3]) * 10; + return new TimeCode(hours, minutes, seconds, milliseconds); + } + + } +} diff --git a/libse/Translate/Formatting.cs b/src/libse/Translate/Formatting.cs similarity index 100% rename from libse/Translate/Formatting.cs rename to src/libse/Translate/Formatting.cs diff --git a/libse/Translate/GoogleTranslator1.cs b/src/libse/Translate/GoogleTranslator1.cs similarity index 100% rename from libse/Translate/GoogleTranslator1.cs rename to src/libse/Translate/GoogleTranslator1.cs diff --git a/libse/Translate/GoogleTranslator2.cs b/src/libse/Translate/GoogleTranslator2.cs similarity index 100% rename from libse/Translate/GoogleTranslator2.cs rename to src/libse/Translate/GoogleTranslator2.cs diff --git a/libse/Translate/GoogleTranslator3.cs b/src/libse/Translate/GoogleTranslator3.cs similarity index 100% rename from libse/Translate/GoogleTranslator3.cs rename to src/libse/Translate/GoogleTranslator3.cs diff --git a/libse/Translate/ITranslator.cs b/src/libse/Translate/ITranslator.cs similarity index 100% rename from libse/Translate/ITranslator.cs rename to src/libse/Translate/ITranslator.cs diff --git a/libse/Translate/MicrosoftTranslator.cs b/src/libse/Translate/MicrosoftTranslator.cs similarity index 100% rename from libse/Translate/MicrosoftTranslator.cs rename to src/libse/Translate/MicrosoftTranslator.cs diff --git a/libse/Translate/TranslationHelper.cs b/src/libse/Translate/TranslationHelper.cs similarity index 100% rename from libse/Translate/TranslationHelper.cs rename to src/libse/Translate/TranslationHelper.cs diff --git a/libse/Translate/TranslationPair.cs b/src/libse/Translate/TranslationPair.cs similarity index 100% rename from libse/Translate/TranslationPair.cs rename to src/libse/Translate/TranslationPair.cs diff --git a/libse/VobSub/Helper.cs b/src/libse/VobSub/Helper.cs similarity index 100% rename from libse/VobSub/Helper.cs rename to src/libse/VobSub/Helper.cs diff --git a/libse/VobSub/Idx.cs b/src/libse/VobSub/Idx.cs similarity index 100% rename from libse/VobSub/Idx.cs rename to src/libse/VobSub/Idx.cs diff --git a/libse/VobSub/IdxParagraph.cs b/src/libse/VobSub/IdxParagraph.cs similarity index 100% rename from libse/VobSub/IdxParagraph.cs rename to src/libse/VobSub/IdxParagraph.cs diff --git a/libse/VobSub/Mpeg2Header.cs b/src/libse/VobSub/Mpeg2Header.cs similarity index 100% rename from libse/VobSub/Mpeg2Header.cs rename to src/libse/VobSub/Mpeg2Header.cs diff --git a/libse/VobSub/PacketizedElementaryStream.cs b/src/libse/VobSub/PacketizedElementaryStream.cs similarity index 100% rename from libse/VobSub/PacketizedElementaryStream.cs rename to src/libse/VobSub/PacketizedElementaryStream.cs diff --git a/libse/VobSub/SpHeader.cs b/src/libse/VobSub/SpHeader.cs similarity index 100% rename from libse/VobSub/SpHeader.cs rename to src/libse/VobSub/SpHeader.cs diff --git a/libse/VobSub/SubPicture.cs b/src/libse/VobSub/SubPicture.cs similarity index 100% rename from libse/VobSub/SubPicture.cs rename to src/libse/VobSub/SubPicture.cs diff --git a/libse/VobSub/VobSubMergedPack.cs b/src/libse/VobSub/VobSubMergedPack.cs similarity index 100% rename from libse/VobSub/VobSubMergedPack.cs rename to src/libse/VobSub/VobSubMergedPack.cs diff --git a/libse/VobSub/VobSubPack.cs b/src/libse/VobSub/VobSubPack.cs similarity index 100% rename from libse/VobSub/VobSubPack.cs rename to src/libse/VobSub/VobSubPack.cs diff --git a/libse/VobSub/VobSubParser.cs b/src/libse/VobSub/VobSubParser.cs similarity index 100% rename from libse/VobSub/VobSubParser.cs rename to src/libse/VobSub/VobSubParser.cs diff --git a/libse/VobSub/VobSubWriter.cs b/src/libse/VobSub/VobSubWriter.cs similarity index 100% rename from libse/VobSub/VobSubWriter.cs rename to src/libse/VobSub/VobSubWriter.cs diff --git a/src/Controls/AudioVisualizer.Designer.cs b/src/ui/Controls/AudioVisualizer.Designer.cs similarity index 97% rename from src/Controls/AudioVisualizer.Designer.cs rename to src/ui/Controls/AudioVisualizer.Designer.cs index a2d7c6c03..3faed18bc 100644 --- a/src/Controls/AudioVisualizer.Designer.cs +++ b/src/ui/Controls/AudioVisualizer.Designer.cs @@ -1,56 +1,56 @@ -namespace Nikse.SubtitleEdit.Controls -{ - sealed partial class AudioVisualizer - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.SuspendLayout(); - // - // Waveform - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.BackColor = System.Drawing.Color.Black; - this.Name = "Waveform"; - this.Size = new System.Drawing.Size(682, 355); - this.Paint += new System.Windows.Forms.PaintEventHandler(this.WaveformPaint); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.WaveformKeyDown); - this.MouseClick += new System.Windows.Forms.MouseEventHandler(this.WaveformMouseClick); - this.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.WaveformMouseDoubleClick); - this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.WaveformMouseDown); - this.MouseEnter += new System.EventHandler(this.WaveformMouseEnter); - this.MouseLeave += new System.EventHandler(this.WaveformMouseLeave); - this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.WaveformMouseMove); - this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.WaveformMouseUp); - this.ResumeLayout(false); - - } - - #endregion - - } -} +namespace Nikse.SubtitleEdit.Controls +{ + sealed partial class AudioVisualizer + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // Waveform + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.Black; + this.Name = "Waveform"; + this.Size = new System.Drawing.Size(682, 355); + this.Paint += new System.Windows.Forms.PaintEventHandler(this.WaveformPaint); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.WaveformKeyDown); + this.MouseClick += new System.Windows.Forms.MouseEventHandler(this.WaveformMouseClick); + this.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.WaveformMouseDoubleClick); + this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.WaveformMouseDown); + this.MouseEnter += new System.EventHandler(this.WaveformMouseEnter); + this.MouseLeave += new System.EventHandler(this.WaveformMouseLeave); + this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.WaveformMouseMove); + this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.WaveformMouseUp); + this.ResumeLayout(false); + + } + + #endregion + + } +} diff --git a/src/Controls/AudioVisualizer.cs b/src/ui/Controls/AudioVisualizer.cs similarity index 97% rename from src/Controls/AudioVisualizer.cs rename to src/ui/Controls/AudioVisualizer.cs index 1e31aa167..5a57cd1af 100644 --- a/src/Controls/AudioVisualizer.cs +++ b/src/ui/Controls/AudioVisualizer.cs @@ -1,2581 +1,2581 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.ContainerFormats.Matroska; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Globalization; -using System.Linq; -using System.Threading.Tasks; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Controls -{ - public sealed partial class AudioVisualizer : UserControl - { - public enum MouseDownParagraphType - { - None, - Start, - Whole, - End - } - - public class MinMax - { - public double Min { get; set; } - public double Max { get; set; } - public double Avg { get; set; } - } - - public class ParagraphEventArgs : EventArgs - { - public Paragraph Paragraph { get; } - public double Seconds { get; } - public Paragraph BeforeParagraph { get; set; } - public MouseDownParagraphType MouseDownParagraphType { get; set; } - public bool MovePreviousOrNext { get; set; } - public double AdjustMs { get; set; } - public ParagraphEventArgs(Paragraph p) - { - Paragraph = p; - } - public ParagraphEventArgs(double seconds, Paragraph p) - { - Seconds = seconds; - Paragraph = p; - } - public ParagraphEventArgs(double seconds, Paragraph p, Paragraph b) - { - Seconds = seconds; - Paragraph = p; - BeforeParagraph = b; - } - public ParagraphEventArgs(double seconds, Paragraph p, Paragraph b, MouseDownParagraphType mouseDownParagraphType) - { - Seconds = seconds; - Paragraph = p; - BeforeParagraph = b; - MouseDownParagraphType = mouseDownParagraphType; - } - public ParagraphEventArgs(double seconds, Paragraph p, Paragraph b, MouseDownParagraphType mouseDownParagraphType, bool movePreviousOrNext) - { - Seconds = seconds; - Paragraph = p; - BeforeParagraph = b; - MouseDownParagraphType = mouseDownParagraphType; - MovePreviousOrNext = movePreviousOrNext; - } - } - - public int ClosenessForBorderSelection { get; set; } = 15; - private const int MinimumSelectionMilliseconds = 100; - - private long _buttonDownTimeTicks; - private long _lastMouseWheelScroll = -1; - private int _mouseMoveLastX = -1; - private int _mouseMoveStartX = -1; - private double _moveWholeStartDifferenceMilliseconds = -1; - private int _mouseMoveEndX = -1; - private bool _mouseDown; - private Paragraph _oldParagraph; - private Paragraph _mouseDownParagraph; - private MouseDownParagraphType _mouseDownParagraphType = MouseDownParagraphType.Start; - private readonly List _displayableParagraphs; - private readonly List _allSelectedParagraphs; - private Paragraph _prevParagraph; - private Paragraph _nextParagraph; - private bool _firstMove = true; - private double _currentVideoPositionSeconds = -1; - private WavePeakData _wavePeaks; - private Subtitle _subtitle; - private bool _noClear; - private double _gapAtStart = -1; - - private SpectrogramData _spectrogram; - private const int SpectrogramDisplayHeight = 128; - - public delegate void ParagraphEventHandler(object sender, ParagraphEventArgs e); - public event ParagraphEventHandler OnNewSelectionRightClicked; - public event ParagraphEventHandler OnParagraphRightClicked; - public event ParagraphEventHandler OnNonParagraphRightClicked; - public event ParagraphEventHandler OnPositionSelected; - - public event ParagraphEventHandler OnTimeChanged; - public event ParagraphEventHandler OnTimeChangedAndOffsetRest; - - public event ParagraphEventHandler OnSingleClick; - public event ParagraphEventHandler OnDoubleClickNonParagraph; - public event EventHandler OnPause; - public event EventHandler OnZoomedChanged; - public event EventHandler InsertAtVideoPosition; - public event EventHandler PasteAtVideoPosition; - - private double _wholeParagraphMinMilliseconds; - private double _wholeParagraphMaxMilliseconds = double.MaxValue; - public Keys InsertAtVideoPositionShortcut { get; set; } - public Keys Move100MsLeft { get; set; } - public Keys Move100MsRight { get; set; } - public Keys MoveOneSecondLeft { get; set; } - public Keys MoveOneSecondRight { get; set; } - public bool MouseWheelScrollUpIsForward { get; set; } = true; - - public const double ZoomMinimum = 0.1; - public const double ZoomMaximum = 2.5; - private double _zoomFactor = 1.0; // 1.0=no zoom - - public const int SceneChangeSnapPixels = 8; - - public double ZoomFactor - { - get => _zoomFactor; - set - { - if (value < ZoomMinimum) - { - value = ZoomMinimum; - } - - if (value > ZoomMaximum) - { - value = ZoomMaximum; - } - - value = Math.Round(value, 2); // round to prevent accumulated rounding errors - if (Math.Abs(_zoomFactor - value) > 0.01) - { - _zoomFactor = value; - Invalidate(); - } - } - } - - public const double VerticalZoomMinimum = 1.0; - public const double VerticalZoomMaximum = 20.0; - private double _verticalZoomFactor = 1.0; // 1.0=no zoom - - public double VerticalZoomFactor - { - get => _verticalZoomFactor; - set - { - if (value < VerticalZoomMinimum) - { - value = VerticalZoomMinimum; - } - - if (value > VerticalZoomMaximum) - { - value = VerticalZoomMaximum; - } - - value = Math.Round(value, 2); // round to prevent accumulated rounding errors - if (Math.Abs(_verticalZoomFactor - value) > 0.01) - { - _verticalZoomFactor = value; - Invalidate(); - } - } - } - - private List _sceneChanges = new List(); - - /// - /// Scene changes (seconds) - /// - public List SceneChanges - { - get => _sceneChanges; - set - { - _sceneChanges = value; - Invalidate(); - } - } - - private List _chapters = new List(); - - public List Chapters - { - get => _chapters; - set - { - _chapters = value; - Invalidate(); - } - } - - public bool IsSpectrogramAvailable => _spectrogram != null && _spectrogram.Images.Count > 0; - - private bool _showSpectrogram; - - public bool ShowSpectrogram - { - get => _showSpectrogram; - set - { - if (_showSpectrogram != value) - { - _showSpectrogram = value; - Invalidate(); - } - } - } - - public bool AllowOverlap { get; set; } - - private bool _showWaveform; - - public bool ShowWaveform - { - get => _showWaveform; - set - { - if (_showWaveform != value) - { - _showWaveform = value; - Invalidate(); - } - } - } - - private double _startPositionSeconds; - - public double StartPositionSeconds - { - get => _startPositionSeconds; - set - { - if (_wavePeaks != null) - { - double endPositionSeconds = value + ((double)Width / _wavePeaks.SampleRate) / _zoomFactor; - if (endPositionSeconds > _wavePeaks.LengthInSeconds) - { - value -= endPositionSeconds - _wavePeaks.LengthInSeconds; - } - } - if (value < 0) - { - value = 0; - } - - if (Math.Abs(_startPositionSeconds - value) > 0.01) - { - _startPositionSeconds = value; - Invalidate(); - } - } - } - - public Paragraph NewSelectionParagraph { get; set; } - public Paragraph SelectedParagraph { get; private set; } - public Paragraph RightClickedParagraph { get; private set; } - public double RightClickedSeconds { get; private set; } - - public string WaveformNotLoadedText { get; set; } - public Color BackgroundColor { get; set; } - public Color Color { get; set; } - public Color SelectedColor { get; set; } - public Color ParagraphColor { get; set; } - public Color TextColor { get; set; } - public Color CursorColor { get; set; } - public Color ChaptersColor { get; set; } - public float TextSize { get; set; } - public bool TextBold { get; set; } - public Color GridColor { get; set; } - public bool ShowGridLines { get; set; } - public bool AllowNewSelection { get; set; } - - public bool Locked { get; set; } - - public double EndPositionSeconds - { - get - { - if (_wavePeaks == null) - { - return 0; - } - - return RelativeXPositionToSeconds(Width); - } - } - - public WavePeakData WavePeaks - { - get => _wavePeaks; - set - { - _zoomFactor = 1.0; - SelectedParagraph = null; - _buttonDownTimeTicks = 0; - _mouseMoveLastX = -1; - _mouseMoveStartX = -1; - _moveWholeStartDifferenceMilliseconds = -1; - _mouseMoveEndX = -1; - _mouseDown = false; - _mouseDownParagraph = null; - _mouseDownParagraphType = MouseDownParagraphType.Start; - _currentVideoPositionSeconds = -1; - _subtitle = new Subtitle(); - _noClear = false; - _wavePeaks = value; - } - } - - public void SetSpectrogram(SpectrogramData spectrogramData) - { - InitializeSpectrogram(spectrogramData); - } - - public void ClearSelection() - { - _mouseDown = false; - _mouseDownParagraph = null; - _mouseMoveStartX = -1; - _mouseMoveEndX = -1; - Invalidate(); - } - - public AudioVisualizer() - { - AutoScaleMode = AutoScaleMode.Dpi; - Font = UiUtil.GetDefaultFont(); - InitializeComponent(); - UiUtil.FixFonts(this); - - _displayableParagraphs = new List(); - _allSelectedParagraphs = new List(); - - SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.DoubleBuffer, true); - WaveformNotLoadedText = "Click to add waveform/spectrogram"; - MouseWheel += WaveformMouseWheel; - - BackgroundColor = Color.Black; - Color = Color.GreenYellow; - SelectedColor = Color.Red; - ParagraphColor = Color.LimeGreen; - TextColor = Color.Gray; - TextSize = 9; - TextBold = true; - GridColor = Color.FromArgb(255, 20, 20, 18); - ShowGridLines = true; - AllowNewSelection = true; - ShowSpectrogram = true; - ShowWaveform = true; - InsertAtVideoPositionShortcut = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainWaveformInsertAtCurrentPosition); - } - - protected override bool IsInputKey(Keys keyData) - { - Keys key = keyData & Keys.KeyCode; - - switch (key) - { - case Keys.Up: - case Keys.Down: - case Keys.Right: - case Keys.Left: - return true; - - default: - return base.IsInputKey(keyData); - } - } - - private void LoadParagraphs(Subtitle subtitle, int primarySelectedIndex, ListView.SelectedIndexCollection selectedIndexes) - { - _subtitle.Paragraphs.Clear(); - _displayableParagraphs.Clear(); - SelectedParagraph = null; - _allSelectedParagraphs.Clear(); - - if (_wavePeaks == null) - { - return; - } - - const double additionalSeconds = 15.0; // Helps when scrolling - double startThresholdMilliseconds = (_startPositionSeconds - additionalSeconds) * TimeCode.BaseUnit; - double endThresholdMilliseconds = (EndPositionSeconds + additionalSeconds) * TimeCode.BaseUnit; - - for (int i = 0; i < subtitle.Paragraphs.Count; i++) - { - var p = subtitle.Paragraphs[i]; - - if (p.StartTime.IsMaxTime) - { - continue; - } - - _subtitle.Paragraphs.Add(p); - - if (p.EndTime.TotalMilliseconds >= startThresholdMilliseconds && p.StartTime.TotalMilliseconds <= endThresholdMilliseconds) - { - _displayableParagraphs.Add(p); - } - } - - var primaryParagraph = subtitle.GetParagraphOrDefault(primarySelectedIndex); - if (primaryParagraph != null && !primaryParagraph.StartTime.IsMaxTime) - { - SelectedParagraph = primaryParagraph; - _allSelectedParagraphs.Add(primaryParagraph); - } - foreach (int index in selectedIndexes) - { - var p = subtitle.GetParagraphOrDefault(index); - if (p != null && !p.StartTime.IsMaxTime) - { - _allSelectedParagraphs.Add(p); - } - } - } - - public void SetPosition(double startPositionSeconds, Subtitle subtitle, double currentVideoPositionSeconds, int subtitleIndex, ListView.SelectedIndexCollection selectedIndexes) - { - if (TimeSpan.FromTicks(DateTime.UtcNow.Ticks - _lastMouseWheelScroll).TotalSeconds > 0.25) - { // don't set start position when scrolling with mouse wheel as it will make a bad (jumping back) forward scrolling - StartPositionSeconds = startPositionSeconds; - } - _currentVideoPositionSeconds = currentVideoPositionSeconds; - LoadParagraphs(subtitle, subtitleIndex, selectedIndexes); - Invalidate(); - } - - private class IsSelectedHelper - { - private readonly SelectionRange[] _ranges; - private int _lastPosition = int.MaxValue; - private SelectionRange _nextSelection; - - public IsSelectedHelper(List paragraphs, int sampleRate) - { - var count = paragraphs.Count; - _ranges = new SelectionRange[count]; - for (int index = 0; index < count; index++) - { - var p = paragraphs[index]; - int start = (int)Math.Round(p.StartTime.TotalSeconds * sampleRate); - int end = (int)Math.Round(p.EndTime.TotalSeconds * sampleRate); - _ranges[index] = new SelectionRange(start, end); - } - } - - public bool IsSelected(int position) - { - if (position < _lastPosition || position > _nextSelection.End) - { - FindNextSelection(position); - } - - _lastPosition = position; - - return position >= _nextSelection.Start && position <= _nextSelection.End; - } - - private void FindNextSelection(int position) - { - _nextSelection = new SelectionRange(int.MaxValue, int.MaxValue); - for (int index = 0; index < _ranges.Length; index++) - { - var range = _ranges[index]; - if (range.End >= position && (range.Start < _nextSelection.Start || range.Start == _nextSelection.Start && range.End > _nextSelection.End)) - { - _nextSelection = range; - } - } - } - - private struct SelectionRange - { - public readonly int Start; - public readonly int End; - - public SelectionRange(int start, int end) - { - Start = start; - End = end; - } - } - } - - //private Stopwatch _sw; - //private readonly List _ticks = new List(); - internal void WaveformPaint(object sender, PaintEventArgs e) - { - //_sw = Stopwatch.StartNew(); - Graphics graphics = e.Graphics; - if (_wavePeaks != null) - { - bool showSpectrogram = _showSpectrogram && IsSpectrogramAvailable; - bool showSpectrogramOnly = showSpectrogram && !_showWaveform; - int waveformHeight = Height - (showSpectrogram ? SpectrogramDisplayHeight : 0); - - // background - graphics.Clear(BackgroundColor); - - // grid lines - if (ShowGridLines && !showSpectrogramOnly) - { - DrawGridLines(graphics, waveformHeight); - } - - // spectrogram - if (showSpectrogram) - { - DrawSpectrogram(graphics); - } - - // waveform - if (_showWaveform) - { - using (var penNormal = new Pen(Color)) - using (var penSelected = new Pen(SelectedColor)) // selected paragraph - { - var isSelectedHelper = new IsSelectedHelper(_allSelectedParagraphs, _wavePeaks.SampleRate); - int baseHeight = (int)(_wavePeaks.HighestPeak / _verticalZoomFactor); - int halfWaveformHeight = waveformHeight / 2; - Func calculateY = value => - { - var offset = (value / baseHeight) * halfWaveformHeight; - if (offset > halfWaveformHeight) - { - offset = halfWaveformHeight; - } - - if (offset < -halfWaveformHeight) - { - offset = -halfWaveformHeight; - } - - return (float)(halfWaveformHeight - offset); - }; - var div = _wavePeaks.SampleRate * _zoomFactor; - for (int x = 0; x < Width; x++) - { - var pos = (_startPositionSeconds + x / div) * _wavePeaks.SampleRate; - int pos0 = (int)pos; - int pos1 = pos0; - pos1++; - if (pos1 >= _wavePeaks.Peaks.Count) - { - break; - } - - var pos1Weight = pos - pos0; - var pos0Weight = 1F - pos1Weight; - var peak0 = _wavePeaks.Peaks[pos0]; - var peak1 = _wavePeaks.Peaks[pos1]; - var max = peak0.Max * pos0Weight + peak1.Max * pos1Weight; - var min = peak0.Min * pos0Weight + peak1.Min * pos1Weight; - var yMax = calculateY(max); - var yMin = Math.Max(calculateY(min), yMax + 0.1F); - var pen = isSelectedHelper.IsSelected(pos0) ? penSelected : penNormal; - graphics.DrawLine(pen, x, yMax, x, yMin); - } - } - } - - // time line - if (!showSpectrogramOnly) - { - DrawTimeLine(graphics, waveformHeight); - } - - int currentPositionPos = SecondsToXPosition(_currentVideoPositionSeconds - _startPositionSeconds); - bool currentPosDone = false; - - // paragraphs - var startPositionMilliseconds = _startPositionSeconds * 1000.0; - var endPositionMilliseconds = RelativeXPositionToSeconds(Width) * 1000.0; - var paragraphStartList = new List(); - var paragraphEndList = new List(); - foreach (Paragraph p in _displayableParagraphs) - { - if (p.EndTime.TotalMilliseconds >= startPositionMilliseconds && p.StartTime.TotalMilliseconds <= endPositionMilliseconds) - { - paragraphStartList.Add(SecondsToXPosition(p.StartTime.TotalSeconds - _startPositionSeconds)); - paragraphEndList.Add(SecondsToXPosition(p.EndTime.TotalSeconds - _startPositionSeconds)); - DrawParagraph(p, graphics); - } - } - - // scene changes - if (_sceneChanges != null) - { - try - { - int index = 0; - while (index < _sceneChanges.Count) - { - int pos; - try - { - double time = _sceneChanges[index++]; - pos = SecondsToXPosition(time - _startPositionSeconds); - } - catch - { - pos = -1; - } - if (pos > 0 && pos < Width) - { - if (currentPositionPos == pos) - { // scene change and current pos are the same - draw 2 pixels + current pos dotted - currentPosDone = true; - using (var p = new Pen(Color.AntiqueWhite, 2)) - { - graphics.DrawLine(p, pos, 0, pos, Height); - } - - using (var p = new Pen(CursorColor, 2) { DashStyle = DashStyle.Dash }) - { - graphics.DrawLine(p, pos, 0, pos, Height); - } - } - else if (paragraphStartList.Contains(pos)) - { // scene change and start pos are the same - draw 2 pixels + current pos dotted - using (var p = new Pen(Color.AntiqueWhite, 2)) - { - graphics.DrawLine(p, pos, 0, pos, Height); - } - - using (var p = new Pen(Color.FromArgb(175, 0, 100, 0), 2) { DashStyle = DashStyle.Dash }) - { - graphics.DrawLine(p, pos, 0, pos, Height); - } - } - else if (paragraphEndList.Contains(pos)) - { // scene change and end pos are the same - draw 2 pixels + current pos dotted - using (var p = new Pen(Color.AntiqueWhite, 2)) - { - graphics.DrawLine(p, pos, 0, pos, Height); - } - - using (var p = new Pen(Color.FromArgb(175, 110, 10, 10), 2) { DashStyle = DashStyle.Dash }) - { - graphics.DrawLine(p, pos, 0, pos, Height); - } - } - else - { - using (var p = new Pen(Color.AntiqueWhite)) - { - graphics.DrawLine(p, pos, 0, pos, Height); - } - } - } - } - } - catch (Exception) - { - // ignored - } - } - - // chapters - if (_chapters != null) - { - try - { - int index = 0; - while (index < _chapters.Count) - { - int pos; - try - { - double time = _chapters[index].StartTime; - pos = SecondsToXPosition(time - _startPositionSeconds); - } - catch - { - pos = -1; - } - if (pos >= 0 && pos < Width) - { - // draw chapter text - using (var font = new Font(Configuration.Settings.General.SubtitleFontName, TextSize, TextBold ? FontStyle.Bold : FontStyle.Regular)) - using (var brush = new SolidBrush(Color.White)) - { - var name = string.Empty; - var x = pos + 3; - var y = index + 1 < _chapters.Count && _chapters[index].StartTime == _chapters[index + 1].StartTime ? Height / 2 - font.Height - 12 : Height / 2 - 12; - using (var chpaterTextBackBrush = new SolidBrush(ChaptersColor)) - { - name = _chapters[index].Nested ? "+ " + _chapters[index].Name : _chapters[index].Name; - var textSize = graphics.MeasureString(name, font); - graphics.FillRectangle(chpaterTextBackBrush, x, y, textSize.Width + 2, textSize.Height); - } - - x += 2; - graphics.DrawString(name, font, brush, new PointF(x, y)); - } - - // draw chapter line - if (currentPositionPos == pos) - { // chapter and current pos are the same - draw 2 pixels + current pos dotted - currentPosDone = true; - using (var p = new Pen(ChaptersColor, 2)) - { - graphics.DrawLine(p, pos, 0, pos, Height); - } - - using (var p = new Pen(CursorColor, 2) { DashStyle = DashStyle.Dash }) - { - graphics.DrawLine(p, pos, 0, pos, Height); - } - } - else if (paragraphStartList.Contains(pos)) - { // chapter and start pos are the same - draw 2 pixels + current pos dotted - using (var p = new Pen(ChaptersColor, 2)) - { - graphics.DrawLine(p, pos, 0, pos, Height); - } - - using (var p = new Pen(Color.FromArgb(175, 0, 100, 0), 2) { DashStyle = DashStyle.Dash }) - { - graphics.DrawLine(p, pos, 0, pos, Height); - } - } - else if (paragraphEndList.Contains(pos)) - { // chapter and end pos are the same - draw 2 pixels + current pos dotted - using (var p = new Pen(ChaptersColor, 2)) - { - graphics.DrawLine(p, pos, 0, pos, Height); - } - - using (var p = new Pen(Color.FromArgb(175, 110, 10, 10), 2) { DashStyle = DashStyle.Dash }) - { - graphics.DrawLine(p, pos, 0, pos, Height); - } - } - else - { - using (var p = new Pen(ChaptersColor)) - { - graphics.DrawLine(p, pos, 0, pos, Height); - } - } - } - - index++; - } - } - catch (Exception) - { - // ignore - } - } - - // current video position - if (_currentVideoPositionSeconds > 0 && !currentPosDone && currentPositionPos > 0 && currentPositionPos < Width) - { - using (var p = new Pen(CursorColor)) - { - graphics.DrawLine(p, currentPositionPos, 0, currentPositionPos, Height); - } - } - - // current selection - if (NewSelectionParagraph != null) - { - int currentRegionLeft = SecondsToXPosition(NewSelectionParagraph.StartTime.TotalSeconds - _startPositionSeconds); - int currentRegionRight = SecondsToXPosition(NewSelectionParagraph.EndTime.TotalSeconds - _startPositionSeconds); - int currentRegionWidth = currentRegionRight - currentRegionLeft; - if (currentRegionRight >= 0 && currentRegionLeft <= Width) - { - using (var brush = new SolidBrush(Color.FromArgb(128, 255, 255, 255))) - { - graphics.FillRectangle(brush, currentRegionLeft, 0, currentRegionWidth, graphics.VisibleClipBounds.Height); - } - - if (currentRegionWidth > 40) - { - using (var brush = new SolidBrush(CursorColor)) - { - graphics.DrawString($"{(double)currentRegionWidth / _wavePeaks.SampleRate / _zoomFactor:0.###} {Configuration.Settings.Language.Waveform.Seconds}", Font, brush, new PointF(currentRegionLeft + 3, Height - 32)); - } - } - } - } - } - else - { - graphics.Clear(BackgroundColor); - - if (ShowGridLines) - { - DrawGridLines(graphics, Height); - } - - using (var textBrush = new SolidBrush(TextColor)) - using (var textFont = new Font(Font.FontFamily, 8)) - { - if (Width > 90) - { - graphics.DrawString(WaveformNotLoadedText, textFont, textBrush, new PointF(Width / 2.0f - 65, Height / 2.0f - 10)); - } - else - { - using (var stringFormat = new StringFormat(StringFormatFlags.DirectionVertical)) - { - graphics.DrawString(WaveformNotLoadedText, textFont, textBrush, new PointF(1, 10), stringFormat); - } - } - } - } - if (Focused) - { - using (var p = new Pen(SelectedColor)) - { - graphics.DrawRectangle(p, new Rectangle(0, 0, Width - 1, Height - 1)); - } - } - //_sw.Stop(); - //_ticks.Add(_sw.ElapsedMilliseconds); - //e.Graphics.DrawString("X = " + _ticks.Average().ToString(), Font, new SolidBrush(Color.Cyan), 100, 130); - } - - private void DrawGridLines(Graphics graphics, int imageHeight) - { - if (_wavePeaks == null) - { - using (var pen = new Pen(new SolidBrush(GridColor))) - { - for (int i = 0; i < Width; i += 10) - { - graphics.DrawLine(pen, i, 0, i, imageHeight); - graphics.DrawLine(pen, 0, i, Width, i); - } - } - } - else - { - double seconds = Math.Ceiling(_startPositionSeconds) - _startPositionSeconds - 1; - int xPosition = SecondsToXPosition(seconds); - int yPosition = 0; - double yCounter = 0; - double interval = _zoomFactor >= 0.4 ? - 0.1 : // a pixel is 0.1 second - 1.0; // a pixel is 1.0 second - using (var pen = new Pen(GridColor)) - { - while (xPosition < Width) - { - graphics.DrawLine(pen, xPosition, 0, xPosition, imageHeight); - - seconds += interval; - xPosition = SecondsToXPosition(seconds); - } - - while (yPosition < Height) - { - graphics.DrawLine(pen, 0, yPosition, Width, yPosition); - - yCounter += interval; - yPosition = Convert.ToInt32(yCounter * _wavePeaks.SampleRate * _zoomFactor); - } - } - } - } - - private void DrawTimeLine(Graphics graphics, int imageHeight) - { - double seconds = Math.Ceiling(_startPositionSeconds) - _startPositionSeconds; - int position = SecondsToXPosition(seconds); - using (var pen = new Pen(TextColor)) - using (var textBrush = new SolidBrush(TextColor)) - using (var textFont = new Font(Font.FontFamily, 7)) - { - while (position < Width) - { - var n = _zoomFactor * _wavePeaks.SampleRate; - if (n > 38 || (int)Math.Round(_startPositionSeconds + seconds) % 5 == 0) - { - graphics.DrawLine(pen, position, imageHeight, position, imageHeight - 10); - graphics.DrawString(GetDisplayTime(_startPositionSeconds + seconds), textFont, textBrush, new PointF(position + 2, imageHeight - 13)); - } - - seconds += 0.5; - position = SecondsToXPosition(seconds); - - if (n > 64) - { - graphics.DrawLine(pen, position, imageHeight, position, imageHeight - 5); - } - - seconds += 0.5; - position = SecondsToXPosition(seconds); - } - } - } - - private static string GetDisplayTime(double seconds) - { - var ts = TimeSpan.FromSeconds(seconds + Configuration.Settings.General.CurrentVideoOffsetInMs / TimeCode.BaseUnit); - if (ts.Minutes == 0 && ts.Hours == 0) - { - return ts.Seconds.ToString(CultureInfo.InvariantCulture); - } - - if (ts.Hours == 0) - { - return $"{ts.Minutes:00}:{ts.Seconds:00}"; - } - - return $"{ts.Hours:00}:{ts.Minutes:00}:{ts.Seconds:00}"; - } - - private void DrawParagraph(Paragraph paragraph, Graphics graphics) - { - int currentRegionLeft = SecondsToXPosition(paragraph.StartTime.TotalSeconds - _startPositionSeconds); - int currentRegionRight = SecondsToXPosition(paragraph.EndTime.TotalSeconds - _startPositionSeconds); - int currentRegionWidth = currentRegionRight - currentRegionLeft; - - // background - using (var brush = new SolidBrush(Color.FromArgb(42, 255, 255, 255))) - { - graphics.FillRectangle(brush, currentRegionLeft, 0, currentRegionWidth, graphics.VisibleClipBounds.Height); - } - - // left edge - using (var pen = new Pen(new SolidBrush(Color.FromArgb(175, 0, 100, 0))) { DashStyle = DashStyle.Solid, Width = 2 }) - { - graphics.DrawLine(pen, currentRegionLeft, 0, currentRegionLeft, graphics.VisibleClipBounds.Height); - } - - // right edge - using (var pen = new Pen(new SolidBrush(Color.FromArgb(175, 110, 10, 10))) { DashStyle = DashStyle.Dash, Width = 2 }) - { - graphics.DrawLine(pen, currentRegionRight - 1, 0, currentRegionRight - 1, graphics.VisibleClipBounds.Height); - } - - using (var font = new Font(Configuration.Settings.General.SubtitleFontName, TextSize, TextBold ? FontStyle.Bold : FontStyle.Regular)) - using (var textBrush = new SolidBrush(TextColor)) - using (var outlineBrush = new SolidBrush(Color.Black)) - { - Action drawStringOutlined = (text, x, y) => - { - // poor mans outline + text - graphics.DrawString(text, font, outlineBrush, new PointF(x, y - 1)); - graphics.DrawString(text, font, outlineBrush, new PointF(x, y + 1)); - graphics.DrawString(text, font, outlineBrush, new PointF(x - 1, y)); - graphics.DrawString(text, font, outlineBrush, new PointF(x + 1, y)); - graphics.DrawString(text, font, textBrush, new PointF(x, y)); - }; - - const int padding = 3; - double n = _zoomFactor * _wavePeaks.SampleRate; - - // bookmark text - if (paragraph.Bookmark != null) - { - var x = currentRegionLeft + padding; - var y = Height / 2 + (int)graphics.MeasureString("xx", font).Height / 2 + 2; - - using (var bookmarkBackBrush = new SolidBrush(Color.FromArgb(255, 250, 205))) - { - var textSize = graphics.MeasureString(paragraph.Bookmark, font); - if (textSize.Width < 1) - { - textSize = new SizeF(-2, 18); // empty bookmark text - } - - graphics.FillRectangle(bookmarkBackBrush, x, y, textSize.Width + 20, textSize.Height + 10); - } - - x += 2; - graphics.FillPolygon(textBrush, new[] - { - new Point(x, y + 2), - new Point(x + 14, y + 2), - new Point(x + 14, y + 22 + 2), - new Point(x + 7, y + 14 + 2), - new Point(x, y + 22 + 2), - new Point(x, y + 2), - }); - x += 16; - graphics.DrawString(paragraph.Bookmark, font, textBrush, new PointF(x, y)); - } - - // paragraph text - if (n > 80) - { - string text = HtmlUtil.RemoveHtmlTags(paragraph.Text, true); - if (Configuration.Settings.VideoControls.WaveformUnwrapText) - { - text = text.Replace(Environment.NewLine, " "); - } - - DrawParagraphText(graphics, text, font, currentRegionWidth, padding, drawStringOutlined, currentRegionLeft); - } - - // paragraph number - if (n > 25) - { - string text = "#" + paragraph.Number + " " + paragraph.Duration.ToShortDisplayString(); - if (n <= 51 || graphics.MeasureString(text, font).Width >= currentRegionWidth - padding - 1) - { - text = "#" + paragraph.Number; - } - else if (n > 99) - { - if (Configuration.Settings.VideoControls.WaveformHideWpmCpsLabels) - { - if (Configuration.Settings.VideoControls.WaveformDrawWpm) - { - text = $"{paragraph.WordsPerMinute:0.00}" + Environment.NewLine + text; - } - - if (Configuration.Settings.VideoControls.WaveformDrawCps) - { - text = $"{Utilities.GetCharactersPerSecond(paragraph):0.00}" + Environment.NewLine + text; - } - } - else - { - if (Configuration.Settings.VideoControls.WaveformDrawWpm) - { - text = string.Format(Configuration.Settings.Language.Waveform.WordsMinX, paragraph.WordsPerMinute) + Environment.NewLine + text; - } - - if (Configuration.Settings.VideoControls.WaveformDrawCps) - { - text = string.Format(Configuration.Settings.Language.Waveform.CharsSecX, Utilities.GetCharactersPerSecond(paragraph)) + Environment.NewLine + text; - } - } - } - drawStringOutlined(text, currentRegionLeft + padding, Height - 14 - (int)graphics.MeasureString(text, font).Height); - } - } - } - - private void DrawParagraphText(Graphics graphics, string text, Font font, int currentRegionWidth, int padding, Action drawStringOutlined, int currentRegionLeft) - { - if (Configuration.Settings.General.RightToLeftMode && LanguageAutoDetect.CouldBeRightToLeftLanguage(new Subtitle(_displayableParagraphs))) - { - text = Utilities.ReverseStartAndEndingForRightToLeft(text); - } - - if (text.Length > 500) - { - text = text.Substring(0, 500); // don't now allow very long texts as they can make SE unresponsive - see https://github.com/SubtitleEdit/subtitleedit/issues/2536 - } - - int y = padding; - var max = currentRegionWidth - padding - 1; - foreach (var line in text.SplitToLines()) - { - text = line; - int removeLength = 1; - var measureResult = graphics.MeasureString(text, font); - while (text.Length > removeLength && graphics.MeasureString(text, font).Width > max) - { - text = text.Remove(text.Length - removeLength).TrimEnd() + "…"; - if (text.Length > 200) - { - removeLength = 21; - } - else if (text.Length > 100) - { - removeLength = 11; - } - else - { - removeLength = 2; - } - - measureResult = graphics.MeasureString(text, font); - } - drawStringOutlined(text, currentRegionLeft + padding, y); - y += (int)Math.Round(measureResult.Height, MidpointRounding.AwayFromZero); - } - - } - - private double RelativeXPositionToSeconds(int x) - { - return _startPositionSeconds + (double)x / _wavePeaks.SampleRate / _zoomFactor; - } - - private int SecondsToXPosition(double seconds) - { - return (int)Math.Round(seconds * _wavePeaks.SampleRate * _zoomFactor); - } - - private int SecondsToSampleIndex(double seconds) - { - return (int)Math.Round(seconds * _wavePeaks.SampleRate); - } - - private double SampleIndexToSeconds(int index) - { - return (double)index / _wavePeaks.SampleRate; - } - - private void WaveformMouseDown(object sender, MouseEventArgs e) - { - if (_wavePeaks == null) - { - return; - } - - Paragraph oldMouseDownParagraph = null; - _mouseDownParagraphType = MouseDownParagraphType.None; - _gapAtStart = -1; - _firstMove = true; - if (e.Button == MouseButtons.Left) - { - _buttonDownTimeTicks = DateTime.UtcNow.Ticks; - - Cursor = Cursors.VSplit; - double seconds = RelativeXPositionToSeconds(e.X); - var milliseconds = (int)(seconds * TimeCode.BaseUnit); - - if (SetParagraphBorderHit(milliseconds, NewSelectionParagraph)) - { - if (_mouseDownParagraph != null) - { - oldMouseDownParagraph = new Paragraph(_mouseDownParagraph); - } - - if (_mouseDownParagraphType == MouseDownParagraphType.Start) - { - if (_mouseDownParagraph != null) - { - _mouseDownParagraph.StartTime.TotalMilliseconds = milliseconds; - OnTimeChanged?.Invoke(this, new ParagraphEventArgs(seconds, _mouseDownParagraph, _oldParagraph, _mouseDownParagraphType, AllowMovePrevOrNext)); - } - - NewSelectionParagraph.StartTime.TotalMilliseconds = milliseconds; - _mouseMoveStartX = e.X; - _mouseMoveEndX = SecondsToXPosition(NewSelectionParagraph.EndTime.TotalSeconds - _startPositionSeconds); - } - else - { - if (_mouseDownParagraph != null) - { - _mouseDownParagraph.EndTime.TotalMilliseconds = milliseconds; - OnTimeChanged?.Invoke(this, new ParagraphEventArgs(seconds, _mouseDownParagraph, _oldParagraph, _mouseDownParagraphType, AllowMovePrevOrNext)); - } - - NewSelectionParagraph.EndTime.TotalMilliseconds = milliseconds; - _mouseMoveStartX = SecondsToXPosition(NewSelectionParagraph.StartTime.TotalSeconds - _startPositionSeconds); - _mouseMoveEndX = e.X; - } - SetMinMaxViaSeconds(seconds); - } - else if (SetParagraphBorderHit(milliseconds, SelectedParagraph) || SetParagraphBorderHit(milliseconds, _displayableParagraphs)) - { - NewSelectionParagraph = null; - if (_mouseDownParagraph != null) - { - oldMouseDownParagraph = new Paragraph(_mouseDownParagraph); - int curIdx = _subtitle.Paragraphs.IndexOf(_mouseDownParagraph); - if (_mouseDownParagraphType == MouseDownParagraphType.Start) - { - if (curIdx > 0) - { - var prev = _subtitle.Paragraphs[curIdx - 1]; - if (prev.EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines < milliseconds) - { - _mouseDownParagraph.StartTime.TotalMilliseconds = milliseconds; - OnTimeChanged?.Invoke(this, new ParagraphEventArgs(seconds, _mouseDownParagraph, _oldParagraph, _mouseDownParagraphType, AllowMovePrevOrNext)); - } - } - else - { - _mouseDownParagraph.StartTime.TotalMilliseconds = milliseconds; - OnTimeChanged?.Invoke(this, new ParagraphEventArgs(seconds, _mouseDownParagraph, _oldParagraph, _mouseDownParagraphType, AllowMovePrevOrNext)); - } - } - else - { - if (curIdx < _subtitle.Paragraphs.Count - 1) - { - var next = _subtitle.Paragraphs[curIdx + 1]; - if (milliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines < next.StartTime.TotalMilliseconds) - { - _mouseDownParagraph.EndTime.TotalMilliseconds = milliseconds; - OnTimeChanged?.Invoke(this, new ParagraphEventArgs(seconds, _mouseDownParagraph, _oldParagraph, _mouseDownParagraphType, AllowMovePrevOrNext)); - } - } - else - { - _mouseDownParagraph.EndTime.TotalMilliseconds = milliseconds; - OnTimeChanged?.Invoke(this, new ParagraphEventArgs(seconds, _mouseDownParagraph, _oldParagraph, _mouseDownParagraphType, AllowMovePrevOrNext)); - } - } - } - SetMinAndMax(); - } - else - { - Paragraph p = GetParagraphAtMilliseconds(milliseconds); - if (p != null) - { - _oldParagraph = new Paragraph(p); - _mouseDownParagraph = p; - oldMouseDownParagraph = new Paragraph(_mouseDownParagraph); - _mouseDownParagraphType = MouseDownParagraphType.Whole; - _moveWholeStartDifferenceMilliseconds = (RelativeXPositionToSeconds(e.X) * TimeCode.BaseUnit) - p.StartTime.TotalMilliseconds; - Cursor = Cursors.Hand; - SetMinAndMax(); - } - else if (!AllowNewSelection) - { - Cursor = Cursors.Default; - } - if (p == null) - { - SetMinMaxViaSeconds(seconds); - } - - NewSelectionParagraph = null; - _mouseMoveStartX = e.X; - _mouseMoveEndX = e.X; - } - if (_mouseDownParagraphType == MouseDownParagraphType.Start) - { - if (_subtitle != null && _mouseDownParagraph != null) - { - int curIdx = _subtitle.Paragraphs.IndexOf(_mouseDownParagraph); - if (curIdx > 0 && oldMouseDownParagraph != null) - { - _gapAtStart = oldMouseDownParagraph.StartTime.TotalMilliseconds - _subtitle.Paragraphs[curIdx - 1].EndTime.TotalMilliseconds; - } - } - } - else if (_mouseDownParagraphType == MouseDownParagraphType.End) - { - if (_subtitle != null && _mouseDownParagraph != null) - { - int curIdx = _subtitle.Paragraphs.IndexOf(_mouseDownParagraph); - if (curIdx >= 0 && curIdx < _subtitle.Paragraphs.Count - 1 && oldMouseDownParagraph != null) - { - _gapAtStart = _subtitle.Paragraphs[curIdx + 1].StartTime.TotalMilliseconds - oldMouseDownParagraph.EndTime.TotalMilliseconds; - } - } - } - _mouseDown = true; - } - else - { - if (e.Button == MouseButtons.Right) - { - double seconds = RelativeXPositionToSeconds(e.X); - var milliseconds = (int)(seconds * TimeCode.BaseUnit); - - if (OnNewSelectionRightClicked != null && NewSelectionParagraph != null) - { - OnNewSelectionRightClicked.Invoke(this, new ParagraphEventArgs(NewSelectionParagraph)); - RightClickedParagraph = null; - _noClear = true; - } - else - { - Paragraph p = GetParagraphAtMilliseconds(milliseconds); - RightClickedParagraph = p; - RightClickedSeconds = seconds; - if (p != null) - { - if (OnParagraphRightClicked != null) - { - NewSelectionParagraph = null; - OnParagraphRightClicked.Invoke(this, new ParagraphEventArgs(seconds, p)); - } - } - else - { - OnNonParagraphRightClicked?.Invoke(this, new ParagraphEventArgs(seconds, null)); - } - } - } - Cursor = Cursors.Default; - } - } - - private void SetMinMaxViaSeconds(double seconds) - { - _wholeParagraphMinMilliseconds = 0; - _wholeParagraphMaxMilliseconds = double.MaxValue; - if (_subtitle != null) - { - Paragraph prev = null; - Paragraph next = null; - var paragraphs = _subtitle.Paragraphs.OrderBy(p => p.StartTime.TotalMilliseconds).ToList(); - for (int i = 0; i < paragraphs.Count; i++) - { - var p2 = paragraphs[i]; - if (p2.StartTime.TotalSeconds < seconds) - { - prev = p2; - } - else if (p2.EndTime.TotalSeconds > seconds) - { - next = p2; - break; - } - } - if (prev != null) - { - _wholeParagraphMinMilliseconds = prev.EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines; - } - - if (next != null) - { - _wholeParagraphMaxMilliseconds = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; - } - } - } - - private void SetMinAndMax() - { - _wholeParagraphMinMilliseconds = 0; - _wholeParagraphMaxMilliseconds = double.MaxValue; - if (_subtitle != null && _mouseDownParagraph != null) - { - var paragraphs = _subtitle.Paragraphs.OrderBy(p => p.StartTime.TotalMilliseconds).ToList(); - int curIdx = paragraphs.IndexOf(_mouseDownParagraph); - if (curIdx >= 0) - { - if (curIdx > 0) - { - _wholeParagraphMinMilliseconds = paragraphs[curIdx - 1].EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines; - } - if (curIdx < _subtitle.Paragraphs.Count - 1) - { - _wholeParagraphMaxMilliseconds = paragraphs[curIdx + 1].StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; - } - } - } - } - - private void SetMinAndMaxMoveStart() - { - _wholeParagraphMinMilliseconds = 0; - _wholeParagraphMaxMilliseconds = double.MaxValue; - if (_subtitle != null && _mouseDownParagraph != null) - { - var paragraphs = _subtitle.Paragraphs.OrderBy(p => p.StartTime.TotalMilliseconds).ToList(); - int curIdx = paragraphs.IndexOf(_mouseDownParagraph); - if (curIdx >= 0) - { - var gap = Math.Abs(paragraphs[curIdx - 1].EndTime.TotalMilliseconds - paragraphs[curIdx].StartTime.TotalMilliseconds); - _wholeParagraphMinMilliseconds = paragraphs[curIdx - 1].StartTime.TotalMilliseconds + gap + 200; - } - } - } - - private void SetMinAndMaxMoveEnd() - { - _wholeParagraphMinMilliseconds = 0; - _wholeParagraphMaxMilliseconds = double.MaxValue; - if (_subtitle != null && _mouseDownParagraph != null) - { - var paragraphs = _subtitle.Paragraphs.OrderBy(p => p.StartTime.TotalMilliseconds).ToList(); - int curIdx = paragraphs.IndexOf(_mouseDownParagraph); - if (curIdx >= 0) - { - if (curIdx < _subtitle.Paragraphs.Count - 1) - { - var gap = Math.Abs(paragraphs[curIdx].EndTime.TotalMilliseconds - paragraphs[curIdx + 1].StartTime.TotalMilliseconds); - _wholeParagraphMaxMilliseconds = paragraphs[curIdx + 1].EndTime.TotalMilliseconds - gap - 200; - } - } - } - } - - private bool SetParagraphBorderHit(int milliseconds, List paragraphs) - { - foreach (var p in paragraphs) - { - bool hit = SetParagraphBorderHit(milliseconds, p); - if (hit) - { - return true; - } - } - return false; - } - - private Paragraph GetParagraphAtMilliseconds(int milliseconds) - { - Paragraph p = null; - if (IsParagraphHit(milliseconds, SelectedParagraph)) - { - p = SelectedParagraph; - } - - if (p == null) - { - foreach (var pNext in _displayableParagraphs) - { - if (IsParagraphHit(milliseconds, pNext)) - { - p = pNext; - break; - } - } - } - - return p; - } - - private bool SetParagraphBorderHit(int milliseconds, Paragraph paragraph) - { - if (paragraph == null) - { - return false; - } - - if (IsParagraphBorderStartHit(milliseconds, paragraph.StartTime.TotalMilliseconds)) - { - _oldParagraph = new Paragraph(paragraph); - _mouseDownParagraph = paragraph; - _mouseDownParagraphType = MouseDownParagraphType.Start; - return true; - } - if (IsParagraphBorderEndHit(milliseconds, paragraph.EndTime.TotalMilliseconds)) - { - _oldParagraph = new Paragraph(paragraph); - _mouseDownParagraph = paragraph; - _mouseDownParagraphType = MouseDownParagraphType.End; - return true; - } - return false; - } - - private bool PreventOverlap - { - get - { - if (ModifierKeys == Keys.Shift) - { - return AllowOverlap; - } - - return !AllowOverlap; - } - } - - private bool AllowMovePrevOrNext => _gapAtStart >= 0 && _gapAtStart < 500 && ModifierKeys == Keys.Alt; - - private void WaveformMouseMove(object sender, MouseEventArgs e) - { - if (_wavePeaks == null) - { - return; - } - - int oldMouseMoveLastX = _mouseMoveLastX; - if (e.X < 0 && _startPositionSeconds > 0.1 && _mouseDown) - { - if (e.X < _mouseMoveLastX) - { - StartPositionSeconds -= 0.1; - if (_mouseDownParagraph == null) - { - _mouseMoveEndX = 0; - _mouseMoveStartX += (int)(_wavePeaks.SampleRate * 0.1); - OnPositionSelected?.Invoke(this, new ParagraphEventArgs(_startPositionSeconds, null)); - } - } - _mouseMoveLastX = e.X; - Invalidate(); - return; - } - if (e.X > Width && _startPositionSeconds + 0.1 < _wavePeaks.LengthInSeconds && _mouseDown) - { - StartPositionSeconds += 0.1; - if (_mouseDownParagraph == null) - { - _mouseMoveEndX = Width; - _mouseMoveStartX -= (int)(_wavePeaks.SampleRate * 0.1); - OnPositionSelected?.Invoke(this, new ParagraphEventArgs(_startPositionSeconds, null)); - } - _mouseMoveLastX = e.X; - Invalidate(); - return; - } - _mouseMoveLastX = e.X; - - if (e.X < 0 || e.X > Width) - { - return; - } - - if (e.Button == MouseButtons.None) - { - double seconds = RelativeXPositionToSeconds(e.X); - var milliseconds = (int)(seconds * TimeCode.BaseUnit); - - if (IsParagraphBorderHit(milliseconds, NewSelectionParagraph)) - { - Cursor = Cursors.VSplit; - } - else if (IsParagraphBorderHit(milliseconds, SelectedParagraph) || - IsParagraphBorderHit(milliseconds, _displayableParagraphs)) - { - Cursor = Cursors.VSplit; - } - else - { - Cursor = Cursors.Default; - } - } - else if (e.Button == MouseButtons.Left) - { - if (oldMouseMoveLastX == e.X) - { - return; // no horizontal movement - } - - if (_mouseDown) - { - if (_mouseDownParagraph != null) - { - double seconds = RelativeXPositionToSeconds(e.X); - var milliseconds = (int)(seconds * TimeCode.BaseUnit); - var subtitleIndex = _subtitle.GetIndex(_mouseDownParagraph); - _prevParagraph = _subtitle.GetParagraphOrDefault(subtitleIndex - 1); - _nextParagraph = _subtitle.GetParagraphOrDefault(subtitleIndex + 1); - - if (_firstMove && Math.Abs(oldMouseMoveLastX - e.X) < Configuration.Settings.General.MinimumMillisecondsBetweenLines && GetParagraphAtMilliseconds(milliseconds) == null) - { - if (_mouseDownParagraphType == MouseDownParagraphType.Start && _prevParagraph != null && Math.Abs(_mouseDownParagraph.StartTime.TotalMilliseconds - _prevParagraph.EndTime.TotalMilliseconds) <= ClosenessForBorderSelection + 15) - { - return; // do not decide which paragraph to move yet - } - - if (_mouseDownParagraphType == MouseDownParagraphType.End && _nextParagraph != null && Math.Abs(_mouseDownParagraph.EndTime.TotalMilliseconds - _nextParagraph.StartTime.TotalMilliseconds) <= ClosenessForBorderSelection + 15) - { - return; // do not decide which paragraph to move yet - } - } - - if (ModifierKeys != Keys.Alt) - { - // decide which paragraph to move - if (_firstMove && e.X > oldMouseMoveLastX && _nextParagraph != null && _mouseDownParagraphType == MouseDownParagraphType.End) - { - if (milliseconds >= _nextParagraph.StartTime.TotalMilliseconds && milliseconds < _nextParagraph.EndTime.TotalMilliseconds) - { - _mouseDownParagraph = _nextParagraph; - _mouseDownParagraphType = MouseDownParagraphType.Start; - } - } - else if (_firstMove && e.X < oldMouseMoveLastX && _prevParagraph != null && _mouseDownParagraphType == MouseDownParagraphType.Start) - { - if (milliseconds <= _prevParagraph.EndTime.TotalMilliseconds && milliseconds > _prevParagraph.StartTime.TotalMilliseconds) - { - _mouseDownParagraph = _prevParagraph; - _mouseDownParagraphType = MouseDownParagraphType.End; - } - } - } - _firstMove = false; - - if (_mouseDownParagraphType == MouseDownParagraphType.Start) - { - if (_mouseDownParagraph.EndTime.TotalMilliseconds - milliseconds > MinimumSelectionMilliseconds) - { - if (AllowMovePrevOrNext) - { - SetMinAndMaxMoveStart(); - } - else - { - SetMinAndMax(); - } - - _mouseDownParagraph.StartTime.TotalMilliseconds = milliseconds; - - if (Configuration.Settings.VideoControls.WaveformSnapToSceneChanges && ModifierKeys != Keys.Shift) - { - double nearestSceneChange = _sceneChanges.Count > 0 ? _sceneChanges.Aggregate((x, y) => Math.Abs((x * 1000) - milliseconds) < Math.Abs((y * 1000) - milliseconds) ? x : y) : -9999; - if (Math.Abs(e.X - SecondsToXPosition(nearestSceneChange - _startPositionSeconds)) < SceneChangeSnapPixels) - { - _mouseDownParagraph.StartTime.TotalMilliseconds = nearestSceneChange * 1000; - } - } - - if (PreventOverlap && _mouseDownParagraph.StartTime.TotalMilliseconds <= _wholeParagraphMinMilliseconds) - { - _mouseDownParagraph.StartTime.TotalMilliseconds = _wholeParagraphMinMilliseconds + 1; - } - - if (NewSelectionParagraph != null) - { - NewSelectionParagraph.StartTime.TotalMilliseconds = milliseconds; - - if (Configuration.Settings.VideoControls.WaveformSnapToSceneChanges && ModifierKeys != Keys.Shift) - { - double nearestSceneChange = _sceneChanges.Count > 0 ? _sceneChanges.Aggregate((x, y) => Math.Abs((x * 1000) - milliseconds) < Math.Abs((y * 1000) - milliseconds) ? x : y) : -9999; - if (Math.Abs(e.X - SecondsToXPosition(nearestSceneChange - _startPositionSeconds)) < SceneChangeSnapPixels) - { - NewSelectionParagraph.StartTime.TotalMilliseconds = nearestSceneChange * 1000; - } - } - - if (PreventOverlap && NewSelectionParagraph.StartTime.TotalMilliseconds <= _wholeParagraphMinMilliseconds) - { - NewSelectionParagraph.StartTime.TotalMilliseconds = _wholeParagraphMinMilliseconds + 1; - } - - _mouseMoveStartX = e.X; - } - else - { - OnTimeChanged?.Invoke(this, new ParagraphEventArgs(seconds, _mouseDownParagraph, _oldParagraph, _mouseDownParagraphType, AllowMovePrevOrNext)); - Refresh(); - return; - } - } - } - else if (_mouseDownParagraphType == MouseDownParagraphType.End) - { - if (milliseconds - _mouseDownParagraph.StartTime.TotalMilliseconds > MinimumSelectionMilliseconds) - { - if (AllowMovePrevOrNext) - { - SetMinAndMaxMoveEnd(); - } - else - { - SetMinAndMax(); - } - - _mouseDownParagraph.EndTime.TotalMilliseconds = milliseconds; - - if (Configuration.Settings.VideoControls.WaveformSnapToSceneChanges && ModifierKeys != Keys.Shift) - { - double nearestSceneChange = _sceneChanges.Count > 0 ? _sceneChanges.Aggregate((x, y) => Math.Abs((x * 1000) - milliseconds) < Math.Abs((y * 1000) - milliseconds) ? x : y) : -9999; - if (Math.Abs(e.X - SecondsToXPosition(nearestSceneChange - _startPositionSeconds)) < SceneChangeSnapPixels) - { - _mouseDownParagraph.EndTime.TotalMilliseconds = nearestSceneChange * 1000; - } - } - - if (PreventOverlap && _mouseDownParagraph.EndTime.TotalMilliseconds >= _wholeParagraphMaxMilliseconds) - { - _mouseDownParagraph.EndTime.TotalMilliseconds = _wholeParagraphMaxMilliseconds - 1; - } - - if (NewSelectionParagraph != null) - { - NewSelectionParagraph.EndTime.TotalMilliseconds = milliseconds; - - if (Configuration.Settings.VideoControls.WaveformSnapToSceneChanges && ModifierKeys != Keys.Shift) - { - double nearestSceneChange = _sceneChanges.Count > 0 ? _sceneChanges.Aggregate((x, y) => Math.Abs((x * 1000) - milliseconds) < Math.Abs((y * 1000) - milliseconds) ? x : y) : -9999; - if (Math.Abs(e.X - SecondsToXPosition(nearestSceneChange - _startPositionSeconds)) < SceneChangeSnapPixels) - { - NewSelectionParagraph.EndTime.TotalMilliseconds = nearestSceneChange * 1000; - } - } - - if (PreventOverlap && NewSelectionParagraph.EndTime.TotalMilliseconds >= _wholeParagraphMaxMilliseconds) - { - NewSelectionParagraph.EndTime.TotalMilliseconds = _wholeParagraphMaxMilliseconds - 1; - } - - _mouseMoveEndX = e.X; - } - else - { - OnTimeChanged?.Invoke(this, new ParagraphEventArgs(seconds, _mouseDownParagraph, _oldParagraph, _mouseDownParagraphType, AllowMovePrevOrNext)); - Refresh(); - return; - } - } - } - else if (_mouseDownParagraphType == MouseDownParagraphType.Whole) - { - double durationMilliseconds = _mouseDownParagraph.Duration.TotalMilliseconds; - - var oldStart = _mouseDownParagraph.StartTime.TotalMilliseconds; - _mouseDownParagraph.StartTime.TotalMilliseconds = milliseconds - _moveWholeStartDifferenceMilliseconds; - _mouseDownParagraph.EndTime.TotalMilliseconds = _mouseDownParagraph.StartTime.TotalMilliseconds + durationMilliseconds; - - if (Configuration.Settings.VideoControls.WaveformSnapToSceneChanges && ModifierKeys != Keys.Shift) - { - double nearestSceneChangeInFront = _sceneChanges.Count > 0 ? _sceneChanges.Aggregate((x, y) => Math.Abs((x * 1000) - _mouseDownParagraph.StartTime.TotalMilliseconds) < Math.Abs((y * 1000) - _mouseDownParagraph.StartTime.TotalMilliseconds) ? x : y) : -9999; - double nearestSceneChangeInBack = _sceneChanges.Count > 0 ? _sceneChanges.Aggregate((x, y) => Math.Abs((x * 1000) - _mouseDownParagraph.EndTime.TotalMilliseconds) < Math.Abs((y * 1000) - _mouseDownParagraph.EndTime.TotalMilliseconds) ? x : y) : -9999; - - if (Math.Abs(SecondsToXPosition(_mouseDownParagraph.StartTime.TotalSeconds - _startPositionSeconds) - SecondsToXPosition(nearestSceneChangeInFront - _startPositionSeconds)) < SceneChangeSnapPixels) - { - _mouseDownParagraph.StartTime.TotalMilliseconds = nearestSceneChangeInFront * 1000; - _mouseDownParagraph.EndTime.TotalMilliseconds = (nearestSceneChangeInFront * 1000) + durationMilliseconds; - } - else if (Math.Abs(SecondsToXPosition(_mouseDownParagraph.EndTime.TotalSeconds - _startPositionSeconds) - SecondsToXPosition(nearestSceneChangeInBack - _startPositionSeconds)) < SceneChangeSnapPixels) - { - _mouseDownParagraph.EndTime.TotalMilliseconds = nearestSceneChangeInBack * 1000; - _mouseDownParagraph.StartTime.TotalMilliseconds = (nearestSceneChangeInBack * 1000) - durationMilliseconds; - } - } - - if (PreventOverlap && _mouseDownParagraph.EndTime.TotalMilliseconds >= _wholeParagraphMaxMilliseconds) - { - _mouseDownParagraph.EndTime.TotalMilliseconds = _wholeParagraphMaxMilliseconds - 1; - _mouseDownParagraph.StartTime.TotalMilliseconds = _mouseDownParagraph.EndTime.TotalMilliseconds - durationMilliseconds; - } - else if (PreventOverlap && _mouseDownParagraph.StartTime.TotalMilliseconds <= _wholeParagraphMinMilliseconds) - { - _mouseDownParagraph.StartTime.TotalMilliseconds = _wholeParagraphMinMilliseconds + 1; - _mouseDownParagraph.EndTime.TotalMilliseconds = _mouseDownParagraph.StartTime.TotalMilliseconds + durationMilliseconds; - } - - if (PreventOverlap && - (_mouseDownParagraph.StartTime.TotalMilliseconds <= _wholeParagraphMinMilliseconds || - _mouseDownParagraph.EndTime.TotalMilliseconds >= _wholeParagraphMaxMilliseconds)) - { - _mouseDownParagraph.StartTime.TotalMilliseconds = oldStart; - _mouseDownParagraph.EndTime.TotalMilliseconds = oldStart + durationMilliseconds; - return; - } - - OnTimeChanged?.Invoke(this, new ParagraphEventArgs(seconds, _mouseDownParagraph, _oldParagraph, _mouseDownParagraphType) { AdjustMs = _mouseDownParagraph.StartTime.TotalMilliseconds - oldStart }); - } - } - else - { - _mouseMoveEndX = e.X; - if (NewSelectionParagraph == null && Math.Abs(_mouseMoveEndX - _mouseMoveStartX) > 2) - { - if (AllowNewSelection) - { - NewSelectionParagraph = new Paragraph(); - } - } - - if (NewSelectionParagraph != null) - { - int start = Math.Min(_mouseMoveStartX, _mouseMoveEndX); - int end = Math.Max(_mouseMoveStartX, _mouseMoveEndX); - - var startTotalSeconds = RelativeXPositionToSeconds(start); - var endTotalSeconds = RelativeXPositionToSeconds(end); - - NewSelectionParagraph.StartTime.TotalSeconds = startTotalSeconds; - NewSelectionParagraph.EndTime.TotalSeconds = endTotalSeconds; - - if (Configuration.Settings.VideoControls.WaveformSnapToSceneChanges && ModifierKeys != Keys.Shift) - { - double nearestSceneChangeInFront = _sceneChanges.Count > 0 ? _sceneChanges.Aggregate((x, y) => Math.Abs(x - startTotalSeconds) < Math.Abs(y - startTotalSeconds) ? x : y) : -9999; - double nearestSceneChangeInBack = _sceneChanges.Count > 0 ? _sceneChanges.Aggregate((x, y) => Math.Abs(x - endTotalSeconds) < Math.Abs(y - endTotalSeconds) ? x : y) : -9999; - - if (Math.Abs(SecondsToXPosition(NewSelectionParagraph.StartTime.TotalSeconds - _startPositionSeconds) - SecondsToXPosition(nearestSceneChangeInFront - _startPositionSeconds)) < SceneChangeSnapPixels) - { - NewSelectionParagraph.StartTime.TotalMilliseconds = nearestSceneChangeInFront * 1000; - Invalidate(); - } - if (Math.Abs(SecondsToXPosition(NewSelectionParagraph.EndTime.TotalSeconds - _startPositionSeconds) - SecondsToXPosition(nearestSceneChangeInBack - _startPositionSeconds)) < SceneChangeSnapPixels) - { - NewSelectionParagraph.EndTime.TotalMilliseconds = nearestSceneChangeInBack * 1000; - Invalidate(); - } - } - - if (PreventOverlap && endTotalSeconds * TimeCode.BaseUnit >= _wholeParagraphMaxMilliseconds) - { - NewSelectionParagraph.EndTime.TotalMilliseconds = _wholeParagraphMaxMilliseconds - 1; - Invalidate(); - } - if (PreventOverlap && startTotalSeconds * TimeCode.BaseUnit <= _wholeParagraphMinMilliseconds) - { - NewSelectionParagraph.StartTime.TotalMilliseconds = _wholeParagraphMinMilliseconds + 1; - Invalidate(); - } - } - } - Invalidate(); - } - } - } - - private bool IsParagraphBorderHit(int milliseconds, List paragraphs) - { - foreach (Paragraph p in paragraphs) - { - bool hit = IsParagraphBorderHit(milliseconds, p); - if (hit) - { - return true; - } - } - return false; - } - - private bool IsParagraphBorderHit(int milliseconds, Paragraph paragraph) - { - if (paragraph == null) - { - return false; - } - - return IsParagraphBorderStartHit(milliseconds, paragraph.StartTime.TotalMilliseconds) || - IsParagraphBorderEndHit(milliseconds, paragraph.EndTime.TotalMilliseconds); - } - - private bool IsParagraphBorderStartHit(double milliseconds, double startMs) - { - return Math.Abs(milliseconds - (startMs - 5)) - 10 <= ClosenessForBorderSelection; - } - - private bool IsParagraphBorderEndHit(double milliseconds, double endMs) - { - return Math.Abs(milliseconds - (endMs - 22)) - 7 <= ClosenessForBorderSelection; - } - - private void WaveformMouseUp(object sender, MouseEventArgs e) - { - if (e.Button == MouseButtons.Left) - { - if (_mouseDown) - { - if (_mouseDownParagraph != null) - { - _mouseDownParagraph = null; - } - else - { - _mouseMoveEndX = e.X; - } - _mouseDown = false; - } - } - Cursor = Cursors.Default; - } - - private void WaveformMouseLeave(object sender, EventArgs e) - { - Cursor = Cursors.Default; - _mouseDown = false; - Invalidate(); - } - - private void WaveformMouseEnter(object sender, EventArgs e) - { - if (_wavePeaks == null) - { - return; - } - - if (_noClear) - { - _noClear = false; - } - else - { - Cursor = Cursors.Default; - _mouseDown = false; - _mouseDownParagraph = null; - _mouseMoveStartX = -1; - _mouseMoveEndX = -1; - Invalidate(); - } - - if (NewSelectionParagraph != null) - { - _mouseMoveStartX = SecondsToXPosition(NewSelectionParagraph.StartTime.TotalSeconds - _startPositionSeconds); - _mouseMoveEndX = SecondsToXPosition(NewSelectionParagraph.EndTime.TotalSeconds - _startPositionSeconds); - } - } - - private void WaveformMouseDoubleClick(object sender, MouseEventArgs e) - { - if (_wavePeaks == null) - { - return; - } - - _mouseDown = false; - _mouseDownParagraph = null; - _mouseMoveStartX = -1; - _mouseMoveEndX = -1; - - if (e.Button == MouseButtons.Left) - { - OnPause?.Invoke(sender, null); - double seconds = RelativeXPositionToSeconds(e.X); - var milliseconds = (int)(seconds * TimeCode.BaseUnit); - - Paragraph p = GetParagraphAtMilliseconds(milliseconds); - if (p != null) - { - seconds = p.StartTime.TotalSeconds; - double endSeconds = p.EndTime.TotalSeconds; - if (seconds < _startPositionSeconds) - { - _startPositionSeconds = (p.StartTime.TotalSeconds) + 0.1; // move earlier - show whole selected paragraph - } - else if (endSeconds > EndPositionSeconds) - { - double newStartPos = _startPositionSeconds + (endSeconds - EndPositionSeconds); // move later, so whole selected paragraph is visible - if (newStartPos < seconds) // but only if visible screen is wide enough - { - _startPositionSeconds = newStartPos; - } - } - } - - OnDoubleClickNonParagraph?.Invoke(this, new ParagraphEventArgs(seconds, p)); - } - } - - private static bool IsParagraphHit(int milliseconds, Paragraph paragraph) - { - if (paragraph == null) - { - return false; - } - - return milliseconds >= paragraph.StartTime.TotalMilliseconds && milliseconds <= paragraph.EndTime.TotalMilliseconds; - } - - private void WaveformMouseClick(object sender, MouseEventArgs e) - { - if (e.Button == MouseButtons.Left && OnSingleClick != null) - { - int diff = Math.Abs(_mouseMoveStartX - e.X); - if (_mouseMoveStartX == -1 || _mouseMoveEndX == -1 || diff < 10 && TimeSpan.FromTicks(DateTime.UtcNow.Ticks - _buttonDownTimeTicks).TotalSeconds < 0.25) - { - if (ModifierKeys == Keys.Shift && SelectedParagraph != null) - { - double seconds = RelativeXPositionToSeconds(e.X); - var milliseconds = (int)(seconds * TimeCode.BaseUnit); - if (_mouseDownParagraphType == MouseDownParagraphType.None || _mouseDownParagraphType == MouseDownParagraphType.Whole) - { - if (seconds < SelectedParagraph.EndTime.TotalSeconds) - { - _oldParagraph = new Paragraph(SelectedParagraph); - _mouseDownParagraph = SelectedParagraph; - _mouseDownParagraph.StartTime.TotalMilliseconds = milliseconds; - OnTimeChanged?.Invoke(this, new ParagraphEventArgs(seconds, _mouseDownParagraph, _oldParagraph)); - } - } - return; - } - if (ModifierKeys == Keys.Control && SelectedParagraph != null) - { - double seconds = RelativeXPositionToSeconds(e.X); - var milliseconds = (int)(seconds * TimeCode.BaseUnit); - if (_mouseDownParagraphType == MouseDownParagraphType.None || _mouseDownParagraphType == MouseDownParagraphType.Whole) - { - if (seconds > SelectedParagraph.StartTime.TotalSeconds) - { - _oldParagraph = new Paragraph(SelectedParagraph); - _mouseDownParagraph = SelectedParagraph; - _mouseDownParagraph.EndTime.TotalMilliseconds = milliseconds; - OnTimeChanged?.Invoke(this, new ParagraphEventArgs(seconds, _mouseDownParagraph, _oldParagraph)); - } - } - return; - } - if (ModifierKeys == (Keys.Control | Keys.Shift) && SelectedParagraph != null) - { - double seconds = RelativeXPositionToSeconds(e.X); - if (_mouseDownParagraphType == MouseDownParagraphType.None || _mouseDownParagraphType == MouseDownParagraphType.Whole) - { - _oldParagraph = new Paragraph(SelectedParagraph); - _mouseDownParagraph = SelectedParagraph; - OnTimeChangedAndOffsetRest?.Invoke(this, new ParagraphEventArgs(seconds, _mouseDownParagraph)); - } - return; - } - if (ModifierKeys == Keys.Alt && SelectedParagraph != null) - { - double seconds = RelativeXPositionToSeconds(e.X); - var milliseconds = (int)(seconds * TimeCode.BaseUnit); - if (_mouseDownParagraphType == MouseDownParagraphType.None || _mouseDownParagraphType == MouseDownParagraphType.Whole) - { - _oldParagraph = new Paragraph(SelectedParagraph); - _mouseDownParagraph = SelectedParagraph; - double durationMilliseconds = _mouseDownParagraph.Duration.TotalMilliseconds; - _mouseDownParagraph.StartTime.TotalMilliseconds = milliseconds; - _mouseDownParagraph.EndTime.TotalMilliseconds = _mouseDownParagraph.StartTime.TotalMilliseconds + durationMilliseconds; - OnTimeChanged?.Invoke(this, new ParagraphEventArgs(seconds, _mouseDownParagraph, _oldParagraph)); - } - return; - } - - if (_mouseDownParagraphType == MouseDownParagraphType.None || _mouseDownParagraphType == MouseDownParagraphType.Whole) - { - double seconds = RelativeXPositionToSeconds(e.X); - var milliseconds = (int)(seconds * TimeCode.BaseUnit); - Paragraph p = GetParagraphAtMilliseconds(milliseconds); - OnSingleClick.Invoke(this, new ParagraphEventArgs(RelativeXPositionToSeconds(e.X), p)); - } - } - } - } - - private void WaveformKeyDown(object sender, KeyEventArgs e) - { - if (_wavePeaks == null) - { - return; - } - - if (e.Modifiers == Keys.None && e.KeyCode == Keys.Add) - { - ZoomIn(); - e.SuppressKeyPress = true; - } - else if (e.Modifiers == Keys.None && e.KeyCode == Keys.Subtract) - { - ZoomOut(); - e.SuppressKeyPress = true; - } - else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.D0) - { - ZoomFactor = 1.0; - OnZoomedChanged?.Invoke(this, null); - e.SuppressKeyPress = true; - } - else if (e.Modifiers == Keys.None && e.KeyCode == Keys.Z) - { - if (_startPositionSeconds > 0.1) - { - StartPositionSeconds -= 0.1; - OnPositionSelected?.Invoke(this, new ParagraphEventArgs(_startPositionSeconds, null)); - Invalidate(); - e.SuppressKeyPress = true; - } - } - else if (e.Modifiers == Keys.None && e.KeyCode == Keys.X) - { - if (_startPositionSeconds + 0.1 < _wavePeaks.LengthInSeconds) - { - StartPositionSeconds += 0.1; - OnPositionSelected?.Invoke(this, new ParagraphEventArgs(_startPositionSeconds, null)); - Invalidate(); - e.SuppressKeyPress = true; - } - } - else if (e.Modifiers == Keys.Alt && e.KeyCode == Keys.C) - { - Locked = !Locked; - Invalidate(); - e.SuppressKeyPress = true; - } - else if (e.KeyData == InsertAtVideoPositionShortcut) - { - if (InsertAtVideoPosition != null) - { - InsertAtVideoPosition.Invoke(this, null); - e.SuppressKeyPress = true; - } - } - else if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control) //Ctrl+v = Paste from clipboard - { - if (PasteAtVideoPosition != null) - { - PasteAtVideoPosition.Invoke(this, null); - e.SuppressKeyPress = true; - } - } - else if (e.KeyData == Move100MsLeft) - { - var pos = Math.Max(0, _currentVideoPositionSeconds - 0.1); - OnPositionSelected?.Invoke(this, new ParagraphEventArgs(pos, null)); - Invalidate(); - e.SuppressKeyPress = true; - } - else if (e.KeyData == Move100MsRight) - { - var pos = _currentVideoPositionSeconds + 0.1; - OnPositionSelected?.Invoke(this, new ParagraphEventArgs(pos, null)); - Invalidate(); - e.SuppressKeyPress = true; - } - else if (e.KeyData == MoveOneSecondLeft) - { - var pos = Math.Max(0, _currentVideoPositionSeconds - 1); - OnPositionSelected?.Invoke(this, new ParagraphEventArgs(pos, null)); - Invalidate(); - e.SuppressKeyPress = true; - } - else if (e.KeyData == MoveOneSecondRight) - { - var pos = _currentVideoPositionSeconds + 1; - OnPositionSelected?.Invoke(this, new ParagraphEventArgs(pos, null)); - Invalidate(); - e.SuppressKeyPress = true; - } - } - - public void ZoomIn() - { - ZoomFactor += 0.1; - OnZoomedChanged?.Invoke(this, null); - } - - public void ZoomOut() - { - ZoomFactor -= 0.1; - OnZoomedChanged?.Invoke(this, null); - } - - private void VerticalZoomIn() - { - VerticalZoomFactor *= 1.1; - } - - private void VerticalZoomOut() - { - VerticalZoomFactor /= 1.1; - } - - private void WaveformMouseWheel(object sender, MouseEventArgs e) - { - // The scroll wheel could work in theory without the waveform loaded (it would be - // just like dragging the slider, which does work without the waveform), but the - // code below doesn't support it, so bail out until someone feels like fixing it. - if (_wavePeaks == null) - { - return; - } - - if (ModifierKeys == Keys.Control) - { - if (e.Delta > 0) - { - ZoomIn(); - } - else - { - ZoomOut(); - } - - return; - } - - if (ModifierKeys == (Keys.Control | Keys.Shift)) - { - if (e.Delta > 0) - { - VerticalZoomIn(); - } - else - { - VerticalZoomOut(); - } - - return; - } - - int delta = e.Delta; - if (!MouseWheelScrollUpIsForward) - { - delta = delta * -1; - } - - if (Locked) - { - OnPositionSelected?.Invoke(this, new ParagraphEventArgs(_currentVideoPositionSeconds + (delta / 256.0), null)); - } - else - { - StartPositionSeconds += delta / 256.0; - _lastMouseWheelScroll = DateTime.UtcNow.Ticks; - if (_currentVideoPositionSeconds < _startPositionSeconds || _currentVideoPositionSeconds >= EndPositionSeconds) - { - OnPositionSelected?.Invoke(this, new ParagraphEventArgs(_startPositionSeconds, null)); - } - } - Invalidate(); - } - - ///////////////////////////////////////////////// - - private void InitializeSpectrogram(SpectrogramData spectrogram) - { - if (_spectrogram != null) - { - _spectrogram.Dispose(); - _spectrogram = null; - Invalidate(); - } - - if (spectrogram == null) - { - return; - } - - if (spectrogram.IsLoaded) - { - InitializeSpectrogramInternal(spectrogram); - } - else - { - Task.Factory.StartNew(() => - { - spectrogram.Load(); - BeginInvoke((Action)(() => - { - InitializeSpectrogramInternal(spectrogram); - })); - }); - } - } - - private void InitializeSpectrogramInternal(SpectrogramData spectrogram) - { - if (_spectrogram != null) - { - return; - } - - _spectrogram = spectrogram; - Invalidate(); - } - - private void DrawSpectrogram(Graphics graphics) - { - int width = (int)Math.Round((EndPositionSeconds - _startPositionSeconds) / _spectrogram.SampleDuration); - using (var bmpCombined = new Bitmap(width, _spectrogram.FftSize / 2)) - using (var gfxCombined = Graphics.FromImage(bmpCombined)) - { - int left = (int)Math.Round(_startPositionSeconds / _spectrogram.SampleDuration); - int offset = 0; - int imageIndex = left / _spectrogram.ImageWidth; - while (offset < width && imageIndex < _spectrogram.Images.Count) - { - int x = (left + offset) % _spectrogram.ImageWidth; - int w = Math.Min(_spectrogram.ImageWidth - x, width - offset); - gfxCombined.DrawImage(_spectrogram.Images[imageIndex], offset, 0, new Rectangle(x, 0, w, bmpCombined.Height), GraphicsUnit.Pixel); - offset += w; - imageIndex++; - } - int displayHeight = _showWaveform ? SpectrogramDisplayHeight : Height; - graphics.DrawImage(bmpCombined, new Rectangle(0, Height - displayHeight, Width, displayHeight)); - } - } - - private double GetAverageVolumeForNextMilliseconds(int sampleIndex, int milliseconds) - { - // length cannot be less than 9 - int length = Math.Max(SecondsToSampleIndex(milliseconds / TimeCode.BaseUnit), 9); - int max = Math.Min(sampleIndex + length, _wavePeaks.Peaks.Count); - int from = Math.Max(sampleIndex, 1); - - if (from >= max) - { - return 0; - } - - double v = 0; - for (int i = from; i < max; i++) - { - v += _wavePeaks.Peaks[i].Abs; - } - - return v / (max - from); - } - - internal void GenerateTimeCodes(Subtitle subtitle, double startFromSeconds, int blockSizeMilliseconds, int minimumVolumePercent, int maximumVolumePercent, int defaultMilliseconds) - { - int begin = SecondsToSampleIndex(startFromSeconds); - - double average = 0; - for (int k = begin; k < _wavePeaks.Peaks.Count; k++) - { - average += _wavePeaks.Peaks[k].Abs; - } - - average /= _wavePeaks.Peaks.Count - begin; - - var maxThreshold = (int)(_wavePeaks.HighestPeak * (maximumVolumePercent / 100.0)); - var silenceThreshold = (int)(average * (minimumVolumePercent / 100.0)); - - int length50Ms = SecondsToSampleIndex(0.050); - double secondsPerParagraph = defaultMilliseconds / TimeCode.BaseUnit; - int minBetween = SecondsToSampleIndex(Configuration.Settings.General.MinimumMillisecondsBetweenLines / TimeCode.BaseUnit); - bool subtitleOn = false; - int i = begin; - while (i < _wavePeaks.Peaks.Count) - { - if (subtitleOn) - { - var currentLengthInSeconds = SampleIndexToSeconds(i - begin); - if (currentLengthInSeconds > 1.0) - { - subtitleOn = EndParagraphDueToLowVolume(subtitle, blockSizeMilliseconds, silenceThreshold, begin, true, i); - if (!subtitleOn) - { - begin = i + minBetween; - i = begin; - } - } - if (subtitleOn && currentLengthInSeconds >= secondsPerParagraph) - { - for (int j = 0; j < 20; j++) - { - subtitleOn = EndParagraphDueToLowVolume(subtitle, blockSizeMilliseconds, silenceThreshold, begin, true, i + (j * length50Ms)); - if (!subtitleOn) - { - i += (j * length50Ms); - begin = i + minBetween; - i = begin; - break; - } - } - - if (subtitleOn) // force break - { - var p = new Paragraph(string.Empty, SampleIndexToSeconds(begin) * TimeCode.BaseUnit, SampleIndexToSeconds(i) * TimeCode.BaseUnit); - subtitle.Paragraphs.Add(p); - begin = i + minBetween; - i = begin; - } - } - } - else - { - double avgVol = GetAverageVolumeForNextMilliseconds(i, blockSizeMilliseconds); - if (avgVol > silenceThreshold && avgVol < maxThreshold) - { - subtitleOn = true; - begin = i; - } - } - i++; - } - - subtitle.Renumber(); - } - - private bool EndParagraphDueToLowVolume(Subtitle subtitle, int blockSizeMilliseconds, double silenceThreshold, int begin, bool subtitleOn, int i) - { - double avgVol = GetAverageVolumeForNextMilliseconds(i, blockSizeMilliseconds); - if (avgVol < silenceThreshold) - { - var p = new Paragraph(string.Empty, SampleIndexToSeconds(begin) * TimeCode.BaseUnit, SampleIndexToSeconds(i) * TimeCode.BaseUnit); - subtitle.Paragraphs.Add(p); - subtitleOn = false; - } - return subtitleOn; - } - - private MinMax GetMinAndMax(int startIndex, int endIndex) - { - int minPeak = int.MaxValue; - int maxPeak = int.MinValue; - double total = 0; - for (int i = startIndex; i < endIndex; i++) - { - var v = _wavePeaks.Peaks[i].Abs; - total += v; - if (v < minPeak) - { - minPeak = v; - } - if (v > maxPeak) - { - maxPeak = v; - } - } - - return new MinMax { Min = minPeak, Max = maxPeak, Avg = total / (endIndex - startIndex) }; - } - - public double FindDataBelowThreshold(double thresholdPercent, double durationInSeconds) - { - int begin = SecondsToSampleIndex(_currentVideoPositionSeconds + 1); - int length = SecondsToSampleIndex(durationInSeconds); - var threshold = thresholdPercent / 100.0 * _wavePeaks.HighestPeak; - - int hitCount = 0; - for (int i = Math.Max(0, begin); i < _wavePeaks.Peaks.Count; i++) - { - if (_wavePeaks.Peaks[i].Abs <= threshold) - { - hitCount++; - } - else - { - hitCount = 0; - } - - if (hitCount > length) - { - double seconds = SampleIndexToSeconds(i - (length / 2)); - if (seconds >= 0) - { - StartPositionSeconds = seconds; - if (_startPositionSeconds > 1) - { - StartPositionSeconds -= 1; - } - - OnSingleClick?.Invoke(this, new ParagraphEventArgs(seconds, null)); - Invalidate(); - } - return seconds; - } - } - return -1; - } - - /// video position in seconds, -1 if not found - public double FindDataBelowThresholdBack(double thresholdPercent, double durationInSeconds) - { - int begin = SecondsToSampleIndex(_currentVideoPositionSeconds - 1); - int length = SecondsToSampleIndex(durationInSeconds); - var threshold = thresholdPercent / 100.0 * _wavePeaks.HighestPeak; - int hitCount = 0; - for (int i = begin; i > 0; i--) - { - if (i > 0 && i < _wavePeaks.Peaks.Count && _wavePeaks.Peaks[i].Abs <= threshold) - { - hitCount++; - if (hitCount > length) - { - double seconds = SampleIndexToSeconds(i + length / 2); - if (seconds >= 0) - { - StartPositionSeconds = seconds; - if (_startPositionSeconds > 1) - { - StartPositionSeconds -= 1; - } - else - { - StartPositionSeconds = 0; - } - - OnSingleClick?.Invoke(this, new ParagraphEventArgs(seconds, null)); - Invalidate(); - } - return seconds; - } - } - else - { - hitCount = 0; - } - } - return -1; - } - - /// - /// Seeks silence in volume - /// - /// video position in seconds, -1 if not found - public double FindDataBelowThresholdBackForStart(double thresholdPercent, double durationInSeconds, double startSeconds) - { - var min = Math.Max(0, SecondsToSampleIndex(startSeconds - 1)); - var maxShort = Math.Min(_wavePeaks.Peaks.Count, SecondsToSampleIndex(startSeconds + durationInSeconds + 0.01)); - var max = Math.Min(_wavePeaks.Peaks.Count, SecondsToSampleIndex(startSeconds + durationInSeconds + 0.8)); - int length = SecondsToSampleIndex(durationInSeconds); - var threshold = thresholdPercent / 100.0 * _wavePeaks.HighestPeak; - - var minMax = GetMinAndMax(min, max); - const int lowPeakDifference = 4_000; - if (minMax.Max - minMax.Min < lowPeakDifference) - { - return -1; // all audio about the same - } - - // look for start silence in the beginning of subtitle - min = SecondsToSampleIndex(startSeconds); - var hitCount = 0; - int index; - for (index = min; index < max; index++) - { - if (index > 0 && index < _wavePeaks.Peaks.Count && _wavePeaks.Peaks[index].Abs <= threshold) - { - hitCount++; - } - else - { - minMax = GetMinAndMax(min, index); - var currentMinMax = GetMinAndMax(SecondsToSampleIndex(startSeconds), SecondsToSampleIndex(startSeconds + 0.8)); - if (currentMinMax.Avg > minMax.Avg + 300 || currentMinMax.Avg < 1000 && minMax.Avg < 1000 && Math.Abs(currentMinMax.Avg - minMax.Avg) < 500) - { - break; - } - hitCount = length / 2; - } - } - if (hitCount > length) - { - minMax = GetMinAndMax(min, index); - var currentMinMax = GetMinAndMax(SecondsToSampleIndex(startSeconds), SecondsToSampleIndex(startSeconds + 0.8)); - if (currentMinMax.Avg > minMax.Avg + 300 || currentMinMax.Avg < 1000 && minMax.Avg < 1000 && Math.Abs(currentMinMax.Avg - minMax.Avg) < 500) - { - return Math.Max(0, SampleIndexToSeconds(index - 1) - 0.01); - } - } - - // move start left? - min = SecondsToSampleIndex(startSeconds - 1); - hitCount = 0; - for (index = maxShort; index > min; index--) - { - if (index > 0 && index < _wavePeaks.Peaks.Count && _wavePeaks.Peaks[index].Abs <= threshold) - { - hitCount++; - if (hitCount > length) - { - return Math.Max(0, SampleIndexToSeconds(index + length) - 0.01); - } - } - else - { - hitCount = 0; - } - } - return -1; - } - - public double FindLowPercentage(double startSeconds, double endSeconds) - { - var min = Math.Max(0, SecondsToSampleIndex(startSeconds)); - var max = Math.Min(_wavePeaks.Peaks.Count, SecondsToSampleIndex(endSeconds)); - var minMax = GetMinAndMax(min, max); - var threshold = minMax.Min * 100.0 / _wavePeaks.HighestPeak; - return threshold; - } - - public double FindHighPercentage(double startSeconds, double endSeconds) - { - var min = Math.Max(0, SecondsToSampleIndex(startSeconds)); - var max = Math.Min(_wavePeaks.Peaks.Count, SecondsToSampleIndex(endSeconds)); - var minMax = GetMinAndMax(min, max); - var threshold = minMax.Max * 100.0 / _wavePeaks.HighestPeak; - return threshold; - } - - public int GetSceneChangeIndex(double seconds) - { - if (SceneChanges == null) - { - return -1; - } - try - { - for (int index = 0; index < SceneChanges.Count; index++) - { - var sceneChange = SceneChanges[index]; - if (Math.Abs(sceneChange - seconds) < 0.04) - { - return index; - } - } - } - catch - { - // ignored - } - - return -1; - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.ContainerFormats.Matroska; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Globalization; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Controls +{ + public sealed partial class AudioVisualizer : UserControl + { + public enum MouseDownParagraphType + { + None, + Start, + Whole, + End + } + + public class MinMax + { + public double Min { get; set; } + public double Max { get; set; } + public double Avg { get; set; } + } + + public class ParagraphEventArgs : EventArgs + { + public Paragraph Paragraph { get; } + public double Seconds { get; } + public Paragraph BeforeParagraph { get; set; } + public MouseDownParagraphType MouseDownParagraphType { get; set; } + public bool MovePreviousOrNext { get; set; } + public double AdjustMs { get; set; } + public ParagraphEventArgs(Paragraph p) + { + Paragraph = p; + } + public ParagraphEventArgs(double seconds, Paragraph p) + { + Seconds = seconds; + Paragraph = p; + } + public ParagraphEventArgs(double seconds, Paragraph p, Paragraph b) + { + Seconds = seconds; + Paragraph = p; + BeforeParagraph = b; + } + public ParagraphEventArgs(double seconds, Paragraph p, Paragraph b, MouseDownParagraphType mouseDownParagraphType) + { + Seconds = seconds; + Paragraph = p; + BeforeParagraph = b; + MouseDownParagraphType = mouseDownParagraphType; + } + public ParagraphEventArgs(double seconds, Paragraph p, Paragraph b, MouseDownParagraphType mouseDownParagraphType, bool movePreviousOrNext) + { + Seconds = seconds; + Paragraph = p; + BeforeParagraph = b; + MouseDownParagraphType = mouseDownParagraphType; + MovePreviousOrNext = movePreviousOrNext; + } + } + + public int ClosenessForBorderSelection { get; set; } = 15; + private const int MinimumSelectionMilliseconds = 100; + + private long _buttonDownTimeTicks; + private long _lastMouseWheelScroll = -1; + private int _mouseMoveLastX = -1; + private int _mouseMoveStartX = -1; + private double _moveWholeStartDifferenceMilliseconds = -1; + private int _mouseMoveEndX = -1; + private bool _mouseDown; + private Paragraph _oldParagraph; + private Paragraph _mouseDownParagraph; + private MouseDownParagraphType _mouseDownParagraphType = MouseDownParagraphType.Start; + private readonly List _displayableParagraphs; + private readonly List _allSelectedParagraphs; + private Paragraph _prevParagraph; + private Paragraph _nextParagraph; + private bool _firstMove = true; + private double _currentVideoPositionSeconds = -1; + private WavePeakData _wavePeaks; + private Subtitle _subtitle; + private bool _noClear; + private double _gapAtStart = -1; + + private SpectrogramData _spectrogram; + private const int SpectrogramDisplayHeight = 128; + + public delegate void ParagraphEventHandler(object sender, ParagraphEventArgs e); + public event ParagraphEventHandler OnNewSelectionRightClicked; + public event ParagraphEventHandler OnParagraphRightClicked; + public event ParagraphEventHandler OnNonParagraphRightClicked; + public event ParagraphEventHandler OnPositionSelected; + + public event ParagraphEventHandler OnTimeChanged; + public event ParagraphEventHandler OnTimeChangedAndOffsetRest; + + public event ParagraphEventHandler OnSingleClick; + public event ParagraphEventHandler OnDoubleClickNonParagraph; + public event EventHandler OnPause; + public event EventHandler OnZoomedChanged; + public event EventHandler InsertAtVideoPosition; + public event EventHandler PasteAtVideoPosition; + + private double _wholeParagraphMinMilliseconds; + private double _wholeParagraphMaxMilliseconds = double.MaxValue; + public Keys InsertAtVideoPositionShortcut { get; set; } + public Keys Move100MsLeft { get; set; } + public Keys Move100MsRight { get; set; } + public Keys MoveOneSecondLeft { get; set; } + public Keys MoveOneSecondRight { get; set; } + public bool MouseWheelScrollUpIsForward { get; set; } = true; + + public const double ZoomMinimum = 0.1; + public const double ZoomMaximum = 2.5; + private double _zoomFactor = 1.0; // 1.0=no zoom + + public const int SceneChangeSnapPixels = 8; + + public double ZoomFactor + { + get => _zoomFactor; + set + { + if (value < ZoomMinimum) + { + value = ZoomMinimum; + } + + if (value > ZoomMaximum) + { + value = ZoomMaximum; + } + + value = Math.Round(value, 2); // round to prevent accumulated rounding errors + if (Math.Abs(_zoomFactor - value) > 0.01) + { + _zoomFactor = value; + Invalidate(); + } + } + } + + public const double VerticalZoomMinimum = 1.0; + public const double VerticalZoomMaximum = 20.0; + private double _verticalZoomFactor = 1.0; // 1.0=no zoom + + public double VerticalZoomFactor + { + get => _verticalZoomFactor; + set + { + if (value < VerticalZoomMinimum) + { + value = VerticalZoomMinimum; + } + + if (value > VerticalZoomMaximum) + { + value = VerticalZoomMaximum; + } + + value = Math.Round(value, 2); // round to prevent accumulated rounding errors + if (Math.Abs(_verticalZoomFactor - value) > 0.01) + { + _verticalZoomFactor = value; + Invalidate(); + } + } + } + + private List _sceneChanges = new List(); + + /// + /// Scene changes (seconds) + /// + public List SceneChanges + { + get => _sceneChanges; + set + { + _sceneChanges = value; + Invalidate(); + } + } + + private List _chapters = new List(); + + public List Chapters + { + get => _chapters; + set + { + _chapters = value; + Invalidate(); + } + } + + public bool IsSpectrogramAvailable => _spectrogram != null && _spectrogram.Images.Count > 0; + + private bool _showSpectrogram; + + public bool ShowSpectrogram + { + get => _showSpectrogram; + set + { + if (_showSpectrogram != value) + { + _showSpectrogram = value; + Invalidate(); + } + } + } + + public bool AllowOverlap { get; set; } + + private bool _showWaveform; + + public bool ShowWaveform + { + get => _showWaveform; + set + { + if (_showWaveform != value) + { + _showWaveform = value; + Invalidate(); + } + } + } + + private double _startPositionSeconds; + + public double StartPositionSeconds + { + get => _startPositionSeconds; + set + { + if (_wavePeaks != null) + { + double endPositionSeconds = value + ((double)Width / _wavePeaks.SampleRate) / _zoomFactor; + if (endPositionSeconds > _wavePeaks.LengthInSeconds) + { + value -= endPositionSeconds - _wavePeaks.LengthInSeconds; + } + } + if (value < 0) + { + value = 0; + } + + if (Math.Abs(_startPositionSeconds - value) > 0.01) + { + _startPositionSeconds = value; + Invalidate(); + } + } + } + + public Paragraph NewSelectionParagraph { get; set; } + public Paragraph SelectedParagraph { get; private set; } + public Paragraph RightClickedParagraph { get; private set; } + public double RightClickedSeconds { get; private set; } + + public string WaveformNotLoadedText { get; set; } + public Color BackgroundColor { get; set; } + public Color Color { get; set; } + public Color SelectedColor { get; set; } + public Color ParagraphColor { get; set; } + public Color TextColor { get; set; } + public Color CursorColor { get; set; } + public Color ChaptersColor { get; set; } + public float TextSize { get; set; } + public bool TextBold { get; set; } + public Color GridColor { get; set; } + public bool ShowGridLines { get; set; } + public bool AllowNewSelection { get; set; } + + public bool Locked { get; set; } + + public double EndPositionSeconds + { + get + { + if (_wavePeaks == null) + { + return 0; + } + + return RelativeXPositionToSeconds(Width); + } + } + + public WavePeakData WavePeaks + { + get => _wavePeaks; + set + { + _zoomFactor = 1.0; + SelectedParagraph = null; + _buttonDownTimeTicks = 0; + _mouseMoveLastX = -1; + _mouseMoveStartX = -1; + _moveWholeStartDifferenceMilliseconds = -1; + _mouseMoveEndX = -1; + _mouseDown = false; + _mouseDownParagraph = null; + _mouseDownParagraphType = MouseDownParagraphType.Start; + _currentVideoPositionSeconds = -1; + _subtitle = new Subtitle(); + _noClear = false; + _wavePeaks = value; + } + } + + public void SetSpectrogram(SpectrogramData spectrogramData) + { + InitializeSpectrogram(spectrogramData); + } + + public void ClearSelection() + { + _mouseDown = false; + _mouseDownParagraph = null; + _mouseMoveStartX = -1; + _mouseMoveEndX = -1; + Invalidate(); + } + + public AudioVisualizer() + { + AutoScaleMode = AutoScaleMode.Dpi; + Font = UiUtil.GetDefaultFont(); + InitializeComponent(); + UiUtil.FixFonts(this); + + _displayableParagraphs = new List(); + _allSelectedParagraphs = new List(); + + SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.DoubleBuffer, true); + WaveformNotLoadedText = "Click to add waveform/spectrogram"; + MouseWheel += WaveformMouseWheel; + + BackgroundColor = Color.Black; + Color = Color.GreenYellow; + SelectedColor = Color.Red; + ParagraphColor = Color.LimeGreen; + TextColor = Color.Gray; + TextSize = 9; + TextBold = true; + GridColor = Color.FromArgb(255, 20, 20, 18); + ShowGridLines = true; + AllowNewSelection = true; + ShowSpectrogram = true; + ShowWaveform = true; + InsertAtVideoPositionShortcut = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainWaveformInsertAtCurrentPosition); + } + + protected override bool IsInputKey(Keys keyData) + { + Keys key = keyData & Keys.KeyCode; + + switch (key) + { + case Keys.Up: + case Keys.Down: + case Keys.Right: + case Keys.Left: + return true; + + default: + return base.IsInputKey(keyData); + } + } + + private void LoadParagraphs(Subtitle subtitle, int primarySelectedIndex, ListView.SelectedIndexCollection selectedIndexes) + { + _subtitle.Paragraphs.Clear(); + _displayableParagraphs.Clear(); + SelectedParagraph = null; + _allSelectedParagraphs.Clear(); + + if (_wavePeaks == null) + { + return; + } + + const double additionalSeconds = 15.0; // Helps when scrolling + double startThresholdMilliseconds = (_startPositionSeconds - additionalSeconds) * TimeCode.BaseUnit; + double endThresholdMilliseconds = (EndPositionSeconds + additionalSeconds) * TimeCode.BaseUnit; + + for (int i = 0; i < subtitle.Paragraphs.Count; i++) + { + var p = subtitle.Paragraphs[i]; + + if (p.StartTime.IsMaxTime) + { + continue; + } + + _subtitle.Paragraphs.Add(p); + + if (p.EndTime.TotalMilliseconds >= startThresholdMilliseconds && p.StartTime.TotalMilliseconds <= endThresholdMilliseconds) + { + _displayableParagraphs.Add(p); + } + } + + var primaryParagraph = subtitle.GetParagraphOrDefault(primarySelectedIndex); + if (primaryParagraph != null && !primaryParagraph.StartTime.IsMaxTime) + { + SelectedParagraph = primaryParagraph; + _allSelectedParagraphs.Add(primaryParagraph); + } + foreach (int index in selectedIndexes) + { + var p = subtitle.GetParagraphOrDefault(index); + if (p != null && !p.StartTime.IsMaxTime) + { + _allSelectedParagraphs.Add(p); + } + } + } + + public void SetPosition(double startPositionSeconds, Subtitle subtitle, double currentVideoPositionSeconds, int subtitleIndex, ListView.SelectedIndexCollection selectedIndexes) + { + if (TimeSpan.FromTicks(DateTime.UtcNow.Ticks - _lastMouseWheelScroll).TotalSeconds > 0.25) + { // don't set start position when scrolling with mouse wheel as it will make a bad (jumping back) forward scrolling + StartPositionSeconds = startPositionSeconds; + } + _currentVideoPositionSeconds = currentVideoPositionSeconds; + LoadParagraphs(subtitle, subtitleIndex, selectedIndexes); + Invalidate(); + } + + private class IsSelectedHelper + { + private readonly SelectionRange[] _ranges; + private int _lastPosition = int.MaxValue; + private SelectionRange _nextSelection; + + public IsSelectedHelper(List paragraphs, int sampleRate) + { + var count = paragraphs.Count; + _ranges = new SelectionRange[count]; + for (int index = 0; index < count; index++) + { + var p = paragraphs[index]; + int start = (int)Math.Round(p.StartTime.TotalSeconds * sampleRate); + int end = (int)Math.Round(p.EndTime.TotalSeconds * sampleRate); + _ranges[index] = new SelectionRange(start, end); + } + } + + public bool IsSelected(int position) + { + if (position < _lastPosition || position > _nextSelection.End) + { + FindNextSelection(position); + } + + _lastPosition = position; + + return position >= _nextSelection.Start && position <= _nextSelection.End; + } + + private void FindNextSelection(int position) + { + _nextSelection = new SelectionRange(int.MaxValue, int.MaxValue); + for (int index = 0; index < _ranges.Length; index++) + { + var range = _ranges[index]; + if (range.End >= position && (range.Start < _nextSelection.Start || range.Start == _nextSelection.Start && range.End > _nextSelection.End)) + { + _nextSelection = range; + } + } + } + + private struct SelectionRange + { + public readonly int Start; + public readonly int End; + + public SelectionRange(int start, int end) + { + Start = start; + End = end; + } + } + } + + //private Stopwatch _sw; + //private readonly List _ticks = new List(); + internal void WaveformPaint(object sender, PaintEventArgs e) + { + //_sw = Stopwatch.StartNew(); + Graphics graphics = e.Graphics; + if (_wavePeaks != null) + { + bool showSpectrogram = _showSpectrogram && IsSpectrogramAvailable; + bool showSpectrogramOnly = showSpectrogram && !_showWaveform; + int waveformHeight = Height - (showSpectrogram ? SpectrogramDisplayHeight : 0); + + // background + graphics.Clear(BackgroundColor); + + // grid lines + if (ShowGridLines && !showSpectrogramOnly) + { + DrawGridLines(graphics, waveformHeight); + } + + // spectrogram + if (showSpectrogram) + { + DrawSpectrogram(graphics); + } + + // waveform + if (_showWaveform) + { + using (var penNormal = new Pen(Color)) + using (var penSelected = new Pen(SelectedColor)) // selected paragraph + { + var isSelectedHelper = new IsSelectedHelper(_allSelectedParagraphs, _wavePeaks.SampleRate); + int baseHeight = (int)(_wavePeaks.HighestPeak / _verticalZoomFactor); + int halfWaveformHeight = waveformHeight / 2; + Func calculateY = value => + { + var offset = (value / baseHeight) * halfWaveformHeight; + if (offset > halfWaveformHeight) + { + offset = halfWaveformHeight; + } + + if (offset < -halfWaveformHeight) + { + offset = -halfWaveformHeight; + } + + return (float)(halfWaveformHeight - offset); + }; + var div = _wavePeaks.SampleRate * _zoomFactor; + for (int x = 0; x < Width; x++) + { + var pos = (_startPositionSeconds + x / div) * _wavePeaks.SampleRate; + int pos0 = (int)pos; + int pos1 = pos0; + pos1++; + if (pos1 >= _wavePeaks.Peaks.Count) + { + break; + } + + var pos1Weight = pos - pos0; + var pos0Weight = 1F - pos1Weight; + var peak0 = _wavePeaks.Peaks[pos0]; + var peak1 = _wavePeaks.Peaks[pos1]; + var max = peak0.Max * pos0Weight + peak1.Max * pos1Weight; + var min = peak0.Min * pos0Weight + peak1.Min * pos1Weight; + var yMax = calculateY(max); + var yMin = Math.Max(calculateY(min), yMax + 0.1F); + var pen = isSelectedHelper.IsSelected(pos0) ? penSelected : penNormal; + graphics.DrawLine(pen, x, yMax, x, yMin); + } + } + } + + // time line + if (!showSpectrogramOnly) + { + DrawTimeLine(graphics, waveformHeight); + } + + int currentPositionPos = SecondsToXPosition(_currentVideoPositionSeconds - _startPositionSeconds); + bool currentPosDone = false; + + // paragraphs + var startPositionMilliseconds = _startPositionSeconds * 1000.0; + var endPositionMilliseconds = RelativeXPositionToSeconds(Width) * 1000.0; + var paragraphStartList = new List(); + var paragraphEndList = new List(); + foreach (Paragraph p in _displayableParagraphs) + { + if (p.EndTime.TotalMilliseconds >= startPositionMilliseconds && p.StartTime.TotalMilliseconds <= endPositionMilliseconds) + { + paragraphStartList.Add(SecondsToXPosition(p.StartTime.TotalSeconds - _startPositionSeconds)); + paragraphEndList.Add(SecondsToXPosition(p.EndTime.TotalSeconds - _startPositionSeconds)); + DrawParagraph(p, graphics); + } + } + + // scene changes + if (_sceneChanges != null) + { + try + { + int index = 0; + while (index < _sceneChanges.Count) + { + int pos; + try + { + double time = _sceneChanges[index++]; + pos = SecondsToXPosition(time - _startPositionSeconds); + } + catch + { + pos = -1; + } + if (pos > 0 && pos < Width) + { + if (currentPositionPos == pos) + { // scene change and current pos are the same - draw 2 pixels + current pos dotted + currentPosDone = true; + using (var p = new Pen(Color.AntiqueWhite, 2)) + { + graphics.DrawLine(p, pos, 0, pos, Height); + } + + using (var p = new Pen(CursorColor, 2) { DashStyle = DashStyle.Dash }) + { + graphics.DrawLine(p, pos, 0, pos, Height); + } + } + else if (paragraphStartList.Contains(pos)) + { // scene change and start pos are the same - draw 2 pixels + current pos dotted + using (var p = new Pen(Color.AntiqueWhite, 2)) + { + graphics.DrawLine(p, pos, 0, pos, Height); + } + + using (var p = new Pen(Color.FromArgb(175, 0, 100, 0), 2) { DashStyle = DashStyle.Dash }) + { + graphics.DrawLine(p, pos, 0, pos, Height); + } + } + else if (paragraphEndList.Contains(pos)) + { // scene change and end pos are the same - draw 2 pixels + current pos dotted + using (var p = new Pen(Color.AntiqueWhite, 2)) + { + graphics.DrawLine(p, pos, 0, pos, Height); + } + + using (var p = new Pen(Color.FromArgb(175, 110, 10, 10), 2) { DashStyle = DashStyle.Dash }) + { + graphics.DrawLine(p, pos, 0, pos, Height); + } + } + else + { + using (var p = new Pen(Color.AntiqueWhite)) + { + graphics.DrawLine(p, pos, 0, pos, Height); + } + } + } + } + } + catch (Exception) + { + // ignored + } + } + + // chapters + if (_chapters != null) + { + try + { + int index = 0; + while (index < _chapters.Count) + { + int pos; + try + { + double time = _chapters[index].StartTime; + pos = SecondsToXPosition(time - _startPositionSeconds); + } + catch + { + pos = -1; + } + if (pos >= 0 && pos < Width) + { + // draw chapter text + using (var font = new Font(Configuration.Settings.General.SubtitleFontName, TextSize, TextBold ? FontStyle.Bold : FontStyle.Regular)) + using (var brush = new SolidBrush(Color.White)) + { + var name = string.Empty; + var x = pos + 3; + var y = index + 1 < _chapters.Count && _chapters[index].StartTime == _chapters[index + 1].StartTime ? Height / 2 - font.Height - 12 : Height / 2 - 12; + using (var chpaterTextBackBrush = new SolidBrush(ChaptersColor)) + { + name = _chapters[index].Nested ? "+ " + _chapters[index].Name : _chapters[index].Name; + var textSize = graphics.MeasureString(name, font); + graphics.FillRectangle(chpaterTextBackBrush, x, y, textSize.Width + 2, textSize.Height); + } + + x += 2; + graphics.DrawString(name, font, brush, new PointF(x, y)); + } + + // draw chapter line + if (currentPositionPos == pos) + { // chapter and current pos are the same - draw 2 pixels + current pos dotted + currentPosDone = true; + using (var p = new Pen(ChaptersColor, 2)) + { + graphics.DrawLine(p, pos, 0, pos, Height); + } + + using (var p = new Pen(CursorColor, 2) { DashStyle = DashStyle.Dash }) + { + graphics.DrawLine(p, pos, 0, pos, Height); + } + } + else if (paragraphStartList.Contains(pos)) + { // chapter and start pos are the same - draw 2 pixels + current pos dotted + using (var p = new Pen(ChaptersColor, 2)) + { + graphics.DrawLine(p, pos, 0, pos, Height); + } + + using (var p = new Pen(Color.FromArgb(175, 0, 100, 0), 2) { DashStyle = DashStyle.Dash }) + { + graphics.DrawLine(p, pos, 0, pos, Height); + } + } + else if (paragraphEndList.Contains(pos)) + { // chapter and end pos are the same - draw 2 pixels + current pos dotted + using (var p = new Pen(ChaptersColor, 2)) + { + graphics.DrawLine(p, pos, 0, pos, Height); + } + + using (var p = new Pen(Color.FromArgb(175, 110, 10, 10), 2) { DashStyle = DashStyle.Dash }) + { + graphics.DrawLine(p, pos, 0, pos, Height); + } + } + else + { + using (var p = new Pen(ChaptersColor)) + { + graphics.DrawLine(p, pos, 0, pos, Height); + } + } + } + + index++; + } + } + catch (Exception) + { + // ignore + } + } + + // current video position + if (_currentVideoPositionSeconds > 0 && !currentPosDone && currentPositionPos > 0 && currentPositionPos < Width) + { + using (var p = new Pen(CursorColor)) + { + graphics.DrawLine(p, currentPositionPos, 0, currentPositionPos, Height); + } + } + + // current selection + if (NewSelectionParagraph != null) + { + int currentRegionLeft = SecondsToXPosition(NewSelectionParagraph.StartTime.TotalSeconds - _startPositionSeconds); + int currentRegionRight = SecondsToXPosition(NewSelectionParagraph.EndTime.TotalSeconds - _startPositionSeconds); + int currentRegionWidth = currentRegionRight - currentRegionLeft; + if (currentRegionRight >= 0 && currentRegionLeft <= Width) + { + using (var brush = new SolidBrush(Color.FromArgb(128, 255, 255, 255))) + { + graphics.FillRectangle(brush, currentRegionLeft, 0, currentRegionWidth, graphics.VisibleClipBounds.Height); + } + + if (currentRegionWidth > 40) + { + using (var brush = new SolidBrush(CursorColor)) + { + graphics.DrawString($"{(double)currentRegionWidth / _wavePeaks.SampleRate / _zoomFactor:0.###} {Configuration.Settings.Language.Waveform.Seconds}", Font, brush, new PointF(currentRegionLeft + 3, Height - 32)); + } + } + } + } + } + else + { + graphics.Clear(BackgroundColor); + + if (ShowGridLines) + { + DrawGridLines(graphics, Height); + } + + using (var textBrush = new SolidBrush(TextColor)) + using (var textFont = new Font(Font.FontFamily, 8)) + { + if (Width > 90) + { + graphics.DrawString(WaveformNotLoadedText, textFont, textBrush, new PointF(Width / 2.0f - 65, Height / 2.0f - 10)); + } + else + { + using (var stringFormat = new StringFormat(StringFormatFlags.DirectionVertical)) + { + graphics.DrawString(WaveformNotLoadedText, textFont, textBrush, new PointF(1, 10), stringFormat); + } + } + } + } + if (Focused) + { + using (var p = new Pen(SelectedColor)) + { + graphics.DrawRectangle(p, new Rectangle(0, 0, Width - 1, Height - 1)); + } + } + //_sw.Stop(); + //_ticks.Add(_sw.ElapsedMilliseconds); + //e.Graphics.DrawString("X = " + _ticks.Average().ToString(), Font, new SolidBrush(Color.Cyan), 100, 130); + } + + private void DrawGridLines(Graphics graphics, int imageHeight) + { + if (_wavePeaks == null) + { + using (var pen = new Pen(new SolidBrush(GridColor))) + { + for (int i = 0; i < Width; i += 10) + { + graphics.DrawLine(pen, i, 0, i, imageHeight); + graphics.DrawLine(pen, 0, i, Width, i); + } + } + } + else + { + double seconds = Math.Ceiling(_startPositionSeconds) - _startPositionSeconds - 1; + int xPosition = SecondsToXPosition(seconds); + int yPosition = 0; + double yCounter = 0; + double interval = _zoomFactor >= 0.4 ? + 0.1 : // a pixel is 0.1 second + 1.0; // a pixel is 1.0 second + using (var pen = new Pen(GridColor)) + { + while (xPosition < Width) + { + graphics.DrawLine(pen, xPosition, 0, xPosition, imageHeight); + + seconds += interval; + xPosition = SecondsToXPosition(seconds); + } + + while (yPosition < Height) + { + graphics.DrawLine(pen, 0, yPosition, Width, yPosition); + + yCounter += interval; + yPosition = Convert.ToInt32(yCounter * _wavePeaks.SampleRate * _zoomFactor); + } + } + } + } + + private void DrawTimeLine(Graphics graphics, int imageHeight) + { + double seconds = Math.Ceiling(_startPositionSeconds) - _startPositionSeconds; + int position = SecondsToXPosition(seconds); + using (var pen = new Pen(TextColor)) + using (var textBrush = new SolidBrush(TextColor)) + using (var textFont = new Font(Font.FontFamily, 7)) + { + while (position < Width) + { + var n = _zoomFactor * _wavePeaks.SampleRate; + if (n > 38 || (int)Math.Round(_startPositionSeconds + seconds) % 5 == 0) + { + graphics.DrawLine(pen, position, imageHeight, position, imageHeight - 10); + graphics.DrawString(GetDisplayTime(_startPositionSeconds + seconds), textFont, textBrush, new PointF(position + 2, imageHeight - 13)); + } + + seconds += 0.5; + position = SecondsToXPosition(seconds); + + if (n > 64) + { + graphics.DrawLine(pen, position, imageHeight, position, imageHeight - 5); + } + + seconds += 0.5; + position = SecondsToXPosition(seconds); + } + } + } + + private static string GetDisplayTime(double seconds) + { + var ts = TimeSpan.FromSeconds(seconds + Configuration.Settings.General.CurrentVideoOffsetInMs / TimeCode.BaseUnit); + if (ts.Minutes == 0 && ts.Hours == 0) + { + return ts.Seconds.ToString(CultureInfo.InvariantCulture); + } + + if (ts.Hours == 0) + { + return $"{ts.Minutes:00}:{ts.Seconds:00}"; + } + + return $"{ts.Hours:00}:{ts.Minutes:00}:{ts.Seconds:00}"; + } + + private void DrawParagraph(Paragraph paragraph, Graphics graphics) + { + int currentRegionLeft = SecondsToXPosition(paragraph.StartTime.TotalSeconds - _startPositionSeconds); + int currentRegionRight = SecondsToXPosition(paragraph.EndTime.TotalSeconds - _startPositionSeconds); + int currentRegionWidth = currentRegionRight - currentRegionLeft; + + // background + using (var brush = new SolidBrush(Color.FromArgb(42, 255, 255, 255))) + { + graphics.FillRectangle(brush, currentRegionLeft, 0, currentRegionWidth, graphics.VisibleClipBounds.Height); + } + + // left edge + using (var pen = new Pen(new SolidBrush(Color.FromArgb(175, 0, 100, 0))) { DashStyle = DashStyle.Solid, Width = 2 }) + { + graphics.DrawLine(pen, currentRegionLeft, 0, currentRegionLeft, graphics.VisibleClipBounds.Height); + } + + // right edge + using (var pen = new Pen(new SolidBrush(Color.FromArgb(175, 110, 10, 10))) { DashStyle = DashStyle.Dash, Width = 2 }) + { + graphics.DrawLine(pen, currentRegionRight - 1, 0, currentRegionRight - 1, graphics.VisibleClipBounds.Height); + } + + using (var font = new Font(Configuration.Settings.General.SubtitleFontName, TextSize, TextBold ? FontStyle.Bold : FontStyle.Regular)) + using (var textBrush = new SolidBrush(TextColor)) + using (var outlineBrush = new SolidBrush(Color.Black)) + { + Action drawStringOutlined = (text, x, y) => + { + // poor mans outline + text + graphics.DrawString(text, font, outlineBrush, new PointF(x, y - 1)); + graphics.DrawString(text, font, outlineBrush, new PointF(x, y + 1)); + graphics.DrawString(text, font, outlineBrush, new PointF(x - 1, y)); + graphics.DrawString(text, font, outlineBrush, new PointF(x + 1, y)); + graphics.DrawString(text, font, textBrush, new PointF(x, y)); + }; + + const int padding = 3; + double n = _zoomFactor * _wavePeaks.SampleRate; + + // bookmark text + if (paragraph.Bookmark != null) + { + var x = currentRegionLeft + padding; + var y = Height / 2 + (int)graphics.MeasureString("xx", font).Height / 2 + 2; + + using (var bookmarkBackBrush = new SolidBrush(Color.FromArgb(255, 250, 205))) + { + var textSize = graphics.MeasureString(paragraph.Bookmark, font); + if (textSize.Width < 1) + { + textSize = new SizeF(-2, 18); // empty bookmark text + } + + graphics.FillRectangle(bookmarkBackBrush, x, y, textSize.Width + 20, textSize.Height + 10); + } + + x += 2; + graphics.FillPolygon(textBrush, new[] + { + new Point(x, y + 2), + new Point(x + 14, y + 2), + new Point(x + 14, y + 22 + 2), + new Point(x + 7, y + 14 + 2), + new Point(x, y + 22 + 2), + new Point(x, y + 2), + }); + x += 16; + graphics.DrawString(paragraph.Bookmark, font, textBrush, new PointF(x, y)); + } + + // paragraph text + if (n > 80) + { + string text = HtmlUtil.RemoveHtmlTags(paragraph.Text, true); + if (Configuration.Settings.VideoControls.WaveformUnwrapText) + { + text = text.Replace(Environment.NewLine, " "); + } + + DrawParagraphText(graphics, text, font, currentRegionWidth, padding, drawStringOutlined, currentRegionLeft); + } + + // paragraph number + if (n > 25) + { + string text = "#" + paragraph.Number + " " + paragraph.Duration.ToShortDisplayString(); + if (n <= 51 || graphics.MeasureString(text, font).Width >= currentRegionWidth - padding - 1) + { + text = "#" + paragraph.Number; + } + else if (n > 99) + { + if (Configuration.Settings.VideoControls.WaveformHideWpmCpsLabels) + { + if (Configuration.Settings.VideoControls.WaveformDrawWpm) + { + text = $"{paragraph.WordsPerMinute:0.00}" + Environment.NewLine + text; + } + + if (Configuration.Settings.VideoControls.WaveformDrawCps) + { + text = $"{Utilities.GetCharactersPerSecond(paragraph):0.00}" + Environment.NewLine + text; + } + } + else + { + if (Configuration.Settings.VideoControls.WaveformDrawWpm) + { + text = string.Format(Configuration.Settings.Language.Waveform.WordsMinX, paragraph.WordsPerMinute) + Environment.NewLine + text; + } + + if (Configuration.Settings.VideoControls.WaveformDrawCps) + { + text = string.Format(Configuration.Settings.Language.Waveform.CharsSecX, Utilities.GetCharactersPerSecond(paragraph)) + Environment.NewLine + text; + } + } + } + drawStringOutlined(text, currentRegionLeft + padding, Height - 14 - (int)graphics.MeasureString(text, font).Height); + } + } + } + + private void DrawParagraphText(Graphics graphics, string text, Font font, int currentRegionWidth, int padding, Action drawStringOutlined, int currentRegionLeft) + { + if (Configuration.Settings.General.RightToLeftMode && LanguageAutoDetect.CouldBeRightToLeftLanguage(new Subtitle(_displayableParagraphs))) + { + text = Utilities.ReverseStartAndEndingForRightToLeft(text); + } + + if (text.Length > 500) + { + text = text.Substring(0, 500); // don't now allow very long texts as they can make SE unresponsive - see https://github.com/SubtitleEdit/subtitleedit/issues/2536 + } + + int y = padding; + var max = currentRegionWidth - padding - 1; + foreach (var line in text.SplitToLines()) + { + text = line; + int removeLength = 1; + var measureResult = graphics.MeasureString(text, font); + while (text.Length > removeLength && graphics.MeasureString(text, font).Width > max) + { + text = text.Remove(text.Length - removeLength).TrimEnd() + "…"; + if (text.Length > 200) + { + removeLength = 21; + } + else if (text.Length > 100) + { + removeLength = 11; + } + else + { + removeLength = 2; + } + + measureResult = graphics.MeasureString(text, font); + } + drawStringOutlined(text, currentRegionLeft + padding, y); + y += (int)Math.Round(measureResult.Height, MidpointRounding.AwayFromZero); + } + + } + + private double RelativeXPositionToSeconds(int x) + { + return _startPositionSeconds + (double)x / _wavePeaks.SampleRate / _zoomFactor; + } + + private int SecondsToXPosition(double seconds) + { + return (int)Math.Round(seconds * _wavePeaks.SampleRate * _zoomFactor); + } + + private int SecondsToSampleIndex(double seconds) + { + return (int)Math.Round(seconds * _wavePeaks.SampleRate); + } + + private double SampleIndexToSeconds(int index) + { + return (double)index / _wavePeaks.SampleRate; + } + + private void WaveformMouseDown(object sender, MouseEventArgs e) + { + if (_wavePeaks == null) + { + return; + } + + Paragraph oldMouseDownParagraph = null; + _mouseDownParagraphType = MouseDownParagraphType.None; + _gapAtStart = -1; + _firstMove = true; + if (e.Button == MouseButtons.Left) + { + _buttonDownTimeTicks = DateTime.UtcNow.Ticks; + + Cursor = Cursors.VSplit; + double seconds = RelativeXPositionToSeconds(e.X); + var milliseconds = (int)(seconds * TimeCode.BaseUnit); + + if (SetParagraphBorderHit(milliseconds, NewSelectionParagraph)) + { + if (_mouseDownParagraph != null) + { + oldMouseDownParagraph = new Paragraph(_mouseDownParagraph); + } + + if (_mouseDownParagraphType == MouseDownParagraphType.Start) + { + if (_mouseDownParagraph != null) + { + _mouseDownParagraph.StartTime.TotalMilliseconds = milliseconds; + OnTimeChanged?.Invoke(this, new ParagraphEventArgs(seconds, _mouseDownParagraph, _oldParagraph, _mouseDownParagraphType, AllowMovePrevOrNext)); + } + + NewSelectionParagraph.StartTime.TotalMilliseconds = milliseconds; + _mouseMoveStartX = e.X; + _mouseMoveEndX = SecondsToXPosition(NewSelectionParagraph.EndTime.TotalSeconds - _startPositionSeconds); + } + else + { + if (_mouseDownParagraph != null) + { + _mouseDownParagraph.EndTime.TotalMilliseconds = milliseconds; + OnTimeChanged?.Invoke(this, new ParagraphEventArgs(seconds, _mouseDownParagraph, _oldParagraph, _mouseDownParagraphType, AllowMovePrevOrNext)); + } + + NewSelectionParagraph.EndTime.TotalMilliseconds = milliseconds; + _mouseMoveStartX = SecondsToXPosition(NewSelectionParagraph.StartTime.TotalSeconds - _startPositionSeconds); + _mouseMoveEndX = e.X; + } + SetMinMaxViaSeconds(seconds); + } + else if (SetParagraphBorderHit(milliseconds, SelectedParagraph) || SetParagraphBorderHit(milliseconds, _displayableParagraphs)) + { + NewSelectionParagraph = null; + if (_mouseDownParagraph != null) + { + oldMouseDownParagraph = new Paragraph(_mouseDownParagraph); + int curIdx = _subtitle.Paragraphs.IndexOf(_mouseDownParagraph); + if (_mouseDownParagraphType == MouseDownParagraphType.Start) + { + if (curIdx > 0) + { + var prev = _subtitle.Paragraphs[curIdx - 1]; + if (prev.EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines < milliseconds) + { + _mouseDownParagraph.StartTime.TotalMilliseconds = milliseconds; + OnTimeChanged?.Invoke(this, new ParagraphEventArgs(seconds, _mouseDownParagraph, _oldParagraph, _mouseDownParagraphType, AllowMovePrevOrNext)); + } + } + else + { + _mouseDownParagraph.StartTime.TotalMilliseconds = milliseconds; + OnTimeChanged?.Invoke(this, new ParagraphEventArgs(seconds, _mouseDownParagraph, _oldParagraph, _mouseDownParagraphType, AllowMovePrevOrNext)); + } + } + else + { + if (curIdx < _subtitle.Paragraphs.Count - 1) + { + var next = _subtitle.Paragraphs[curIdx + 1]; + if (milliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines < next.StartTime.TotalMilliseconds) + { + _mouseDownParagraph.EndTime.TotalMilliseconds = milliseconds; + OnTimeChanged?.Invoke(this, new ParagraphEventArgs(seconds, _mouseDownParagraph, _oldParagraph, _mouseDownParagraphType, AllowMovePrevOrNext)); + } + } + else + { + _mouseDownParagraph.EndTime.TotalMilliseconds = milliseconds; + OnTimeChanged?.Invoke(this, new ParagraphEventArgs(seconds, _mouseDownParagraph, _oldParagraph, _mouseDownParagraphType, AllowMovePrevOrNext)); + } + } + } + SetMinAndMax(); + } + else + { + Paragraph p = GetParagraphAtMilliseconds(milliseconds); + if (p != null) + { + _oldParagraph = new Paragraph(p); + _mouseDownParagraph = p; + oldMouseDownParagraph = new Paragraph(_mouseDownParagraph); + _mouseDownParagraphType = MouseDownParagraphType.Whole; + _moveWholeStartDifferenceMilliseconds = (RelativeXPositionToSeconds(e.X) * TimeCode.BaseUnit) - p.StartTime.TotalMilliseconds; + Cursor = Cursors.Hand; + SetMinAndMax(); + } + else if (!AllowNewSelection) + { + Cursor = Cursors.Default; + } + if (p == null) + { + SetMinMaxViaSeconds(seconds); + } + + NewSelectionParagraph = null; + _mouseMoveStartX = e.X; + _mouseMoveEndX = e.X; + } + if (_mouseDownParagraphType == MouseDownParagraphType.Start) + { + if (_subtitle != null && _mouseDownParagraph != null) + { + int curIdx = _subtitle.Paragraphs.IndexOf(_mouseDownParagraph); + if (curIdx > 0 && oldMouseDownParagraph != null) + { + _gapAtStart = oldMouseDownParagraph.StartTime.TotalMilliseconds - _subtitle.Paragraphs[curIdx - 1].EndTime.TotalMilliseconds; + } + } + } + else if (_mouseDownParagraphType == MouseDownParagraphType.End) + { + if (_subtitle != null && _mouseDownParagraph != null) + { + int curIdx = _subtitle.Paragraphs.IndexOf(_mouseDownParagraph); + if (curIdx >= 0 && curIdx < _subtitle.Paragraphs.Count - 1 && oldMouseDownParagraph != null) + { + _gapAtStart = _subtitle.Paragraphs[curIdx + 1].StartTime.TotalMilliseconds - oldMouseDownParagraph.EndTime.TotalMilliseconds; + } + } + } + _mouseDown = true; + } + else + { + if (e.Button == MouseButtons.Right) + { + double seconds = RelativeXPositionToSeconds(e.X); + var milliseconds = (int)(seconds * TimeCode.BaseUnit); + + if (OnNewSelectionRightClicked != null && NewSelectionParagraph != null) + { + OnNewSelectionRightClicked.Invoke(this, new ParagraphEventArgs(NewSelectionParagraph)); + RightClickedParagraph = null; + _noClear = true; + } + else + { + Paragraph p = GetParagraphAtMilliseconds(milliseconds); + RightClickedParagraph = p; + RightClickedSeconds = seconds; + if (p != null) + { + if (OnParagraphRightClicked != null) + { + NewSelectionParagraph = null; + OnParagraphRightClicked.Invoke(this, new ParagraphEventArgs(seconds, p)); + } + } + else + { + OnNonParagraphRightClicked?.Invoke(this, new ParagraphEventArgs(seconds, null)); + } + } + } + Cursor = Cursors.Default; + } + } + + private void SetMinMaxViaSeconds(double seconds) + { + _wholeParagraphMinMilliseconds = 0; + _wholeParagraphMaxMilliseconds = double.MaxValue; + if (_subtitle != null) + { + Paragraph prev = null; + Paragraph next = null; + var paragraphs = _subtitle.Paragraphs.OrderBy(p => p.StartTime.TotalMilliseconds).ToList(); + for (int i = 0; i < paragraphs.Count; i++) + { + var p2 = paragraphs[i]; + if (p2.StartTime.TotalSeconds < seconds) + { + prev = p2; + } + else if (p2.EndTime.TotalSeconds > seconds) + { + next = p2; + break; + } + } + if (prev != null) + { + _wholeParagraphMinMilliseconds = prev.EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines; + } + + if (next != null) + { + _wholeParagraphMaxMilliseconds = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; + } + } + } + + private void SetMinAndMax() + { + _wholeParagraphMinMilliseconds = 0; + _wholeParagraphMaxMilliseconds = double.MaxValue; + if (_subtitle != null && _mouseDownParagraph != null) + { + var paragraphs = _subtitle.Paragraphs.OrderBy(p => p.StartTime.TotalMilliseconds).ToList(); + int curIdx = paragraphs.IndexOf(_mouseDownParagraph); + if (curIdx >= 0) + { + if (curIdx > 0) + { + _wholeParagraphMinMilliseconds = paragraphs[curIdx - 1].EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines; + } + if (curIdx < _subtitle.Paragraphs.Count - 1) + { + _wholeParagraphMaxMilliseconds = paragraphs[curIdx + 1].StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; + } + } + } + } + + private void SetMinAndMaxMoveStart() + { + _wholeParagraphMinMilliseconds = 0; + _wholeParagraphMaxMilliseconds = double.MaxValue; + if (_subtitle != null && _mouseDownParagraph != null) + { + var paragraphs = _subtitle.Paragraphs.OrderBy(p => p.StartTime.TotalMilliseconds).ToList(); + int curIdx = paragraphs.IndexOf(_mouseDownParagraph); + if (curIdx >= 0) + { + var gap = Math.Abs(paragraphs[curIdx - 1].EndTime.TotalMilliseconds - paragraphs[curIdx].StartTime.TotalMilliseconds); + _wholeParagraphMinMilliseconds = paragraphs[curIdx - 1].StartTime.TotalMilliseconds + gap + 200; + } + } + } + + private void SetMinAndMaxMoveEnd() + { + _wholeParagraphMinMilliseconds = 0; + _wholeParagraphMaxMilliseconds = double.MaxValue; + if (_subtitle != null && _mouseDownParagraph != null) + { + var paragraphs = _subtitle.Paragraphs.OrderBy(p => p.StartTime.TotalMilliseconds).ToList(); + int curIdx = paragraphs.IndexOf(_mouseDownParagraph); + if (curIdx >= 0) + { + if (curIdx < _subtitle.Paragraphs.Count - 1) + { + var gap = Math.Abs(paragraphs[curIdx].EndTime.TotalMilliseconds - paragraphs[curIdx + 1].StartTime.TotalMilliseconds); + _wholeParagraphMaxMilliseconds = paragraphs[curIdx + 1].EndTime.TotalMilliseconds - gap - 200; + } + } + } + } + + private bool SetParagraphBorderHit(int milliseconds, List paragraphs) + { + foreach (var p in paragraphs) + { + bool hit = SetParagraphBorderHit(milliseconds, p); + if (hit) + { + return true; + } + } + return false; + } + + private Paragraph GetParagraphAtMilliseconds(int milliseconds) + { + Paragraph p = null; + if (IsParagraphHit(milliseconds, SelectedParagraph)) + { + p = SelectedParagraph; + } + + if (p == null) + { + foreach (var pNext in _displayableParagraphs) + { + if (IsParagraphHit(milliseconds, pNext)) + { + p = pNext; + break; + } + } + } + + return p; + } + + private bool SetParagraphBorderHit(int milliseconds, Paragraph paragraph) + { + if (paragraph == null) + { + return false; + } + + if (IsParagraphBorderStartHit(milliseconds, paragraph.StartTime.TotalMilliseconds)) + { + _oldParagraph = new Paragraph(paragraph); + _mouseDownParagraph = paragraph; + _mouseDownParagraphType = MouseDownParagraphType.Start; + return true; + } + if (IsParagraphBorderEndHit(milliseconds, paragraph.EndTime.TotalMilliseconds)) + { + _oldParagraph = new Paragraph(paragraph); + _mouseDownParagraph = paragraph; + _mouseDownParagraphType = MouseDownParagraphType.End; + return true; + } + return false; + } + + private bool PreventOverlap + { + get + { + if (ModifierKeys == Keys.Shift) + { + return AllowOverlap; + } + + return !AllowOverlap; + } + } + + private bool AllowMovePrevOrNext => _gapAtStart >= 0 && _gapAtStart < 500 && ModifierKeys == Keys.Alt; + + private void WaveformMouseMove(object sender, MouseEventArgs e) + { + if (_wavePeaks == null) + { + return; + } + + int oldMouseMoveLastX = _mouseMoveLastX; + if (e.X < 0 && _startPositionSeconds > 0.1 && _mouseDown) + { + if (e.X < _mouseMoveLastX) + { + StartPositionSeconds -= 0.1; + if (_mouseDownParagraph == null) + { + _mouseMoveEndX = 0; + _mouseMoveStartX += (int)(_wavePeaks.SampleRate * 0.1); + OnPositionSelected?.Invoke(this, new ParagraphEventArgs(_startPositionSeconds, null)); + } + } + _mouseMoveLastX = e.X; + Invalidate(); + return; + } + if (e.X > Width && _startPositionSeconds + 0.1 < _wavePeaks.LengthInSeconds && _mouseDown) + { + StartPositionSeconds += 0.1; + if (_mouseDownParagraph == null) + { + _mouseMoveEndX = Width; + _mouseMoveStartX -= (int)(_wavePeaks.SampleRate * 0.1); + OnPositionSelected?.Invoke(this, new ParagraphEventArgs(_startPositionSeconds, null)); + } + _mouseMoveLastX = e.X; + Invalidate(); + return; + } + _mouseMoveLastX = e.X; + + if (e.X < 0 || e.X > Width) + { + return; + } + + if (e.Button == MouseButtons.None) + { + double seconds = RelativeXPositionToSeconds(e.X); + var milliseconds = (int)(seconds * TimeCode.BaseUnit); + + if (IsParagraphBorderHit(milliseconds, NewSelectionParagraph)) + { + Cursor = Cursors.VSplit; + } + else if (IsParagraphBorderHit(milliseconds, SelectedParagraph) || + IsParagraphBorderHit(milliseconds, _displayableParagraphs)) + { + Cursor = Cursors.VSplit; + } + else + { + Cursor = Cursors.Default; + } + } + else if (e.Button == MouseButtons.Left) + { + if (oldMouseMoveLastX == e.X) + { + return; // no horizontal movement + } + + if (_mouseDown) + { + if (_mouseDownParagraph != null) + { + double seconds = RelativeXPositionToSeconds(e.X); + var milliseconds = (int)(seconds * TimeCode.BaseUnit); + var subtitleIndex = _subtitle.GetIndex(_mouseDownParagraph); + _prevParagraph = _subtitle.GetParagraphOrDefault(subtitleIndex - 1); + _nextParagraph = _subtitle.GetParagraphOrDefault(subtitleIndex + 1); + + if (_firstMove && Math.Abs(oldMouseMoveLastX - e.X) < Configuration.Settings.General.MinimumMillisecondsBetweenLines && GetParagraphAtMilliseconds(milliseconds) == null) + { + if (_mouseDownParagraphType == MouseDownParagraphType.Start && _prevParagraph != null && Math.Abs(_mouseDownParagraph.StartTime.TotalMilliseconds - _prevParagraph.EndTime.TotalMilliseconds) <= ClosenessForBorderSelection + 15) + { + return; // do not decide which paragraph to move yet + } + + if (_mouseDownParagraphType == MouseDownParagraphType.End && _nextParagraph != null && Math.Abs(_mouseDownParagraph.EndTime.TotalMilliseconds - _nextParagraph.StartTime.TotalMilliseconds) <= ClosenessForBorderSelection + 15) + { + return; // do not decide which paragraph to move yet + } + } + + if (ModifierKeys != Keys.Alt) + { + // decide which paragraph to move + if (_firstMove && e.X > oldMouseMoveLastX && _nextParagraph != null && _mouseDownParagraphType == MouseDownParagraphType.End) + { + if (milliseconds >= _nextParagraph.StartTime.TotalMilliseconds && milliseconds < _nextParagraph.EndTime.TotalMilliseconds) + { + _mouseDownParagraph = _nextParagraph; + _mouseDownParagraphType = MouseDownParagraphType.Start; + } + } + else if (_firstMove && e.X < oldMouseMoveLastX && _prevParagraph != null && _mouseDownParagraphType == MouseDownParagraphType.Start) + { + if (milliseconds <= _prevParagraph.EndTime.TotalMilliseconds && milliseconds > _prevParagraph.StartTime.TotalMilliseconds) + { + _mouseDownParagraph = _prevParagraph; + _mouseDownParagraphType = MouseDownParagraphType.End; + } + } + } + _firstMove = false; + + if (_mouseDownParagraphType == MouseDownParagraphType.Start) + { + if (_mouseDownParagraph.EndTime.TotalMilliseconds - milliseconds > MinimumSelectionMilliseconds) + { + if (AllowMovePrevOrNext) + { + SetMinAndMaxMoveStart(); + } + else + { + SetMinAndMax(); + } + + _mouseDownParagraph.StartTime.TotalMilliseconds = milliseconds; + + if (Configuration.Settings.VideoControls.WaveformSnapToSceneChanges && ModifierKeys != Keys.Shift) + { + double nearestSceneChange = _sceneChanges.Count > 0 ? _sceneChanges.Aggregate((x, y) => Math.Abs((x * 1000) - milliseconds) < Math.Abs((y * 1000) - milliseconds) ? x : y) : -9999; + if (Math.Abs(e.X - SecondsToXPosition(nearestSceneChange - _startPositionSeconds)) < SceneChangeSnapPixels) + { + _mouseDownParagraph.StartTime.TotalMilliseconds = nearestSceneChange * 1000; + } + } + + if (PreventOverlap && _mouseDownParagraph.StartTime.TotalMilliseconds <= _wholeParagraphMinMilliseconds) + { + _mouseDownParagraph.StartTime.TotalMilliseconds = _wholeParagraphMinMilliseconds + 1; + } + + if (NewSelectionParagraph != null) + { + NewSelectionParagraph.StartTime.TotalMilliseconds = milliseconds; + + if (Configuration.Settings.VideoControls.WaveformSnapToSceneChanges && ModifierKeys != Keys.Shift) + { + double nearestSceneChange = _sceneChanges.Count > 0 ? _sceneChanges.Aggregate((x, y) => Math.Abs((x * 1000) - milliseconds) < Math.Abs((y * 1000) - milliseconds) ? x : y) : -9999; + if (Math.Abs(e.X - SecondsToXPosition(nearestSceneChange - _startPositionSeconds)) < SceneChangeSnapPixels) + { + NewSelectionParagraph.StartTime.TotalMilliseconds = nearestSceneChange * 1000; + } + } + + if (PreventOverlap && NewSelectionParagraph.StartTime.TotalMilliseconds <= _wholeParagraphMinMilliseconds) + { + NewSelectionParagraph.StartTime.TotalMilliseconds = _wholeParagraphMinMilliseconds + 1; + } + + _mouseMoveStartX = e.X; + } + else + { + OnTimeChanged?.Invoke(this, new ParagraphEventArgs(seconds, _mouseDownParagraph, _oldParagraph, _mouseDownParagraphType, AllowMovePrevOrNext)); + Refresh(); + return; + } + } + } + else if (_mouseDownParagraphType == MouseDownParagraphType.End) + { + if (milliseconds - _mouseDownParagraph.StartTime.TotalMilliseconds > MinimumSelectionMilliseconds) + { + if (AllowMovePrevOrNext) + { + SetMinAndMaxMoveEnd(); + } + else + { + SetMinAndMax(); + } + + _mouseDownParagraph.EndTime.TotalMilliseconds = milliseconds; + + if (Configuration.Settings.VideoControls.WaveformSnapToSceneChanges && ModifierKeys != Keys.Shift) + { + double nearestSceneChange = _sceneChanges.Count > 0 ? _sceneChanges.Aggregate((x, y) => Math.Abs((x * 1000) - milliseconds) < Math.Abs((y * 1000) - milliseconds) ? x : y) : -9999; + if (Math.Abs(e.X - SecondsToXPosition(nearestSceneChange - _startPositionSeconds)) < SceneChangeSnapPixels) + { + _mouseDownParagraph.EndTime.TotalMilliseconds = nearestSceneChange * 1000; + } + } + + if (PreventOverlap && _mouseDownParagraph.EndTime.TotalMilliseconds >= _wholeParagraphMaxMilliseconds) + { + _mouseDownParagraph.EndTime.TotalMilliseconds = _wholeParagraphMaxMilliseconds - 1; + } + + if (NewSelectionParagraph != null) + { + NewSelectionParagraph.EndTime.TotalMilliseconds = milliseconds; + + if (Configuration.Settings.VideoControls.WaveformSnapToSceneChanges && ModifierKeys != Keys.Shift) + { + double nearestSceneChange = _sceneChanges.Count > 0 ? _sceneChanges.Aggregate((x, y) => Math.Abs((x * 1000) - milliseconds) < Math.Abs((y * 1000) - milliseconds) ? x : y) : -9999; + if (Math.Abs(e.X - SecondsToXPosition(nearestSceneChange - _startPositionSeconds)) < SceneChangeSnapPixels) + { + NewSelectionParagraph.EndTime.TotalMilliseconds = nearestSceneChange * 1000; + } + } + + if (PreventOverlap && NewSelectionParagraph.EndTime.TotalMilliseconds >= _wholeParagraphMaxMilliseconds) + { + NewSelectionParagraph.EndTime.TotalMilliseconds = _wholeParagraphMaxMilliseconds - 1; + } + + _mouseMoveEndX = e.X; + } + else + { + OnTimeChanged?.Invoke(this, new ParagraphEventArgs(seconds, _mouseDownParagraph, _oldParagraph, _mouseDownParagraphType, AllowMovePrevOrNext)); + Refresh(); + return; + } + } + } + else if (_mouseDownParagraphType == MouseDownParagraphType.Whole) + { + double durationMilliseconds = _mouseDownParagraph.Duration.TotalMilliseconds; + + var oldStart = _mouseDownParagraph.StartTime.TotalMilliseconds; + _mouseDownParagraph.StartTime.TotalMilliseconds = milliseconds - _moveWholeStartDifferenceMilliseconds; + _mouseDownParagraph.EndTime.TotalMilliseconds = _mouseDownParagraph.StartTime.TotalMilliseconds + durationMilliseconds; + + if (Configuration.Settings.VideoControls.WaveformSnapToSceneChanges && ModifierKeys != Keys.Shift) + { + double nearestSceneChangeInFront = _sceneChanges.Count > 0 ? _sceneChanges.Aggregate((x, y) => Math.Abs((x * 1000) - _mouseDownParagraph.StartTime.TotalMilliseconds) < Math.Abs((y * 1000) - _mouseDownParagraph.StartTime.TotalMilliseconds) ? x : y) : -9999; + double nearestSceneChangeInBack = _sceneChanges.Count > 0 ? _sceneChanges.Aggregate((x, y) => Math.Abs((x * 1000) - _mouseDownParagraph.EndTime.TotalMilliseconds) < Math.Abs((y * 1000) - _mouseDownParagraph.EndTime.TotalMilliseconds) ? x : y) : -9999; + + if (Math.Abs(SecondsToXPosition(_mouseDownParagraph.StartTime.TotalSeconds - _startPositionSeconds) - SecondsToXPosition(nearestSceneChangeInFront - _startPositionSeconds)) < SceneChangeSnapPixels) + { + _mouseDownParagraph.StartTime.TotalMilliseconds = nearestSceneChangeInFront * 1000; + _mouseDownParagraph.EndTime.TotalMilliseconds = (nearestSceneChangeInFront * 1000) + durationMilliseconds; + } + else if (Math.Abs(SecondsToXPosition(_mouseDownParagraph.EndTime.TotalSeconds - _startPositionSeconds) - SecondsToXPosition(nearestSceneChangeInBack - _startPositionSeconds)) < SceneChangeSnapPixels) + { + _mouseDownParagraph.EndTime.TotalMilliseconds = nearestSceneChangeInBack * 1000; + _mouseDownParagraph.StartTime.TotalMilliseconds = (nearestSceneChangeInBack * 1000) - durationMilliseconds; + } + } + + if (PreventOverlap && _mouseDownParagraph.EndTime.TotalMilliseconds >= _wholeParagraphMaxMilliseconds) + { + _mouseDownParagraph.EndTime.TotalMilliseconds = _wholeParagraphMaxMilliseconds - 1; + _mouseDownParagraph.StartTime.TotalMilliseconds = _mouseDownParagraph.EndTime.TotalMilliseconds - durationMilliseconds; + } + else if (PreventOverlap && _mouseDownParagraph.StartTime.TotalMilliseconds <= _wholeParagraphMinMilliseconds) + { + _mouseDownParagraph.StartTime.TotalMilliseconds = _wholeParagraphMinMilliseconds + 1; + _mouseDownParagraph.EndTime.TotalMilliseconds = _mouseDownParagraph.StartTime.TotalMilliseconds + durationMilliseconds; + } + + if (PreventOverlap && + (_mouseDownParagraph.StartTime.TotalMilliseconds <= _wholeParagraphMinMilliseconds || + _mouseDownParagraph.EndTime.TotalMilliseconds >= _wholeParagraphMaxMilliseconds)) + { + _mouseDownParagraph.StartTime.TotalMilliseconds = oldStart; + _mouseDownParagraph.EndTime.TotalMilliseconds = oldStart + durationMilliseconds; + return; + } + + OnTimeChanged?.Invoke(this, new ParagraphEventArgs(seconds, _mouseDownParagraph, _oldParagraph, _mouseDownParagraphType) { AdjustMs = _mouseDownParagraph.StartTime.TotalMilliseconds - oldStart }); + } + } + else + { + _mouseMoveEndX = e.X; + if (NewSelectionParagraph == null && Math.Abs(_mouseMoveEndX - _mouseMoveStartX) > 2) + { + if (AllowNewSelection) + { + NewSelectionParagraph = new Paragraph(); + } + } + + if (NewSelectionParagraph != null) + { + int start = Math.Min(_mouseMoveStartX, _mouseMoveEndX); + int end = Math.Max(_mouseMoveStartX, _mouseMoveEndX); + + var startTotalSeconds = RelativeXPositionToSeconds(start); + var endTotalSeconds = RelativeXPositionToSeconds(end); + + NewSelectionParagraph.StartTime.TotalSeconds = startTotalSeconds; + NewSelectionParagraph.EndTime.TotalSeconds = endTotalSeconds; + + if (Configuration.Settings.VideoControls.WaveformSnapToSceneChanges && ModifierKeys != Keys.Shift) + { + double nearestSceneChangeInFront = _sceneChanges.Count > 0 ? _sceneChanges.Aggregate((x, y) => Math.Abs(x - startTotalSeconds) < Math.Abs(y - startTotalSeconds) ? x : y) : -9999; + double nearestSceneChangeInBack = _sceneChanges.Count > 0 ? _sceneChanges.Aggregate((x, y) => Math.Abs(x - endTotalSeconds) < Math.Abs(y - endTotalSeconds) ? x : y) : -9999; + + if (Math.Abs(SecondsToXPosition(NewSelectionParagraph.StartTime.TotalSeconds - _startPositionSeconds) - SecondsToXPosition(nearestSceneChangeInFront - _startPositionSeconds)) < SceneChangeSnapPixels) + { + NewSelectionParagraph.StartTime.TotalMilliseconds = nearestSceneChangeInFront * 1000; + Invalidate(); + } + if (Math.Abs(SecondsToXPosition(NewSelectionParagraph.EndTime.TotalSeconds - _startPositionSeconds) - SecondsToXPosition(nearestSceneChangeInBack - _startPositionSeconds)) < SceneChangeSnapPixels) + { + NewSelectionParagraph.EndTime.TotalMilliseconds = nearestSceneChangeInBack * 1000; + Invalidate(); + } + } + + if (PreventOverlap && endTotalSeconds * TimeCode.BaseUnit >= _wholeParagraphMaxMilliseconds) + { + NewSelectionParagraph.EndTime.TotalMilliseconds = _wholeParagraphMaxMilliseconds - 1; + Invalidate(); + } + if (PreventOverlap && startTotalSeconds * TimeCode.BaseUnit <= _wholeParagraphMinMilliseconds) + { + NewSelectionParagraph.StartTime.TotalMilliseconds = _wholeParagraphMinMilliseconds + 1; + Invalidate(); + } + } + } + Invalidate(); + } + } + } + + private bool IsParagraphBorderHit(int milliseconds, List paragraphs) + { + foreach (Paragraph p in paragraphs) + { + bool hit = IsParagraphBorderHit(milliseconds, p); + if (hit) + { + return true; + } + } + return false; + } + + private bool IsParagraphBorderHit(int milliseconds, Paragraph paragraph) + { + if (paragraph == null) + { + return false; + } + + return IsParagraphBorderStartHit(milliseconds, paragraph.StartTime.TotalMilliseconds) || + IsParagraphBorderEndHit(milliseconds, paragraph.EndTime.TotalMilliseconds); + } + + private bool IsParagraphBorderStartHit(double milliseconds, double startMs) + { + return Math.Abs(milliseconds - (startMs - 5)) - 10 <= ClosenessForBorderSelection; + } + + private bool IsParagraphBorderEndHit(double milliseconds, double endMs) + { + return Math.Abs(milliseconds - (endMs - 22)) - 7 <= ClosenessForBorderSelection; + } + + private void WaveformMouseUp(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + if (_mouseDown) + { + if (_mouseDownParagraph != null) + { + _mouseDownParagraph = null; + } + else + { + _mouseMoveEndX = e.X; + } + _mouseDown = false; + } + } + Cursor = Cursors.Default; + } + + private void WaveformMouseLeave(object sender, EventArgs e) + { + Cursor = Cursors.Default; + _mouseDown = false; + Invalidate(); + } + + private void WaveformMouseEnter(object sender, EventArgs e) + { + if (_wavePeaks == null) + { + return; + } + + if (_noClear) + { + _noClear = false; + } + else + { + Cursor = Cursors.Default; + _mouseDown = false; + _mouseDownParagraph = null; + _mouseMoveStartX = -1; + _mouseMoveEndX = -1; + Invalidate(); + } + + if (NewSelectionParagraph != null) + { + _mouseMoveStartX = SecondsToXPosition(NewSelectionParagraph.StartTime.TotalSeconds - _startPositionSeconds); + _mouseMoveEndX = SecondsToXPosition(NewSelectionParagraph.EndTime.TotalSeconds - _startPositionSeconds); + } + } + + private void WaveformMouseDoubleClick(object sender, MouseEventArgs e) + { + if (_wavePeaks == null) + { + return; + } + + _mouseDown = false; + _mouseDownParagraph = null; + _mouseMoveStartX = -1; + _mouseMoveEndX = -1; + + if (e.Button == MouseButtons.Left) + { + OnPause?.Invoke(sender, null); + double seconds = RelativeXPositionToSeconds(e.X); + var milliseconds = (int)(seconds * TimeCode.BaseUnit); + + Paragraph p = GetParagraphAtMilliseconds(milliseconds); + if (p != null) + { + seconds = p.StartTime.TotalSeconds; + double endSeconds = p.EndTime.TotalSeconds; + if (seconds < _startPositionSeconds) + { + _startPositionSeconds = (p.StartTime.TotalSeconds) + 0.1; // move earlier - show whole selected paragraph + } + else if (endSeconds > EndPositionSeconds) + { + double newStartPos = _startPositionSeconds + (endSeconds - EndPositionSeconds); // move later, so whole selected paragraph is visible + if (newStartPos < seconds) // but only if visible screen is wide enough + { + _startPositionSeconds = newStartPos; + } + } + } + + OnDoubleClickNonParagraph?.Invoke(this, new ParagraphEventArgs(seconds, p)); + } + } + + private static bool IsParagraphHit(int milliseconds, Paragraph paragraph) + { + if (paragraph == null) + { + return false; + } + + return milliseconds >= paragraph.StartTime.TotalMilliseconds && milliseconds <= paragraph.EndTime.TotalMilliseconds; + } + + private void WaveformMouseClick(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left && OnSingleClick != null) + { + int diff = Math.Abs(_mouseMoveStartX - e.X); + if (_mouseMoveStartX == -1 || _mouseMoveEndX == -1 || diff < 10 && TimeSpan.FromTicks(DateTime.UtcNow.Ticks - _buttonDownTimeTicks).TotalSeconds < 0.25) + { + if (ModifierKeys == Keys.Shift && SelectedParagraph != null) + { + double seconds = RelativeXPositionToSeconds(e.X); + var milliseconds = (int)(seconds * TimeCode.BaseUnit); + if (_mouseDownParagraphType == MouseDownParagraphType.None || _mouseDownParagraphType == MouseDownParagraphType.Whole) + { + if (seconds < SelectedParagraph.EndTime.TotalSeconds) + { + _oldParagraph = new Paragraph(SelectedParagraph); + _mouseDownParagraph = SelectedParagraph; + _mouseDownParagraph.StartTime.TotalMilliseconds = milliseconds; + OnTimeChanged?.Invoke(this, new ParagraphEventArgs(seconds, _mouseDownParagraph, _oldParagraph)); + } + } + return; + } + if (ModifierKeys == Keys.Control && SelectedParagraph != null) + { + double seconds = RelativeXPositionToSeconds(e.X); + var milliseconds = (int)(seconds * TimeCode.BaseUnit); + if (_mouseDownParagraphType == MouseDownParagraphType.None || _mouseDownParagraphType == MouseDownParagraphType.Whole) + { + if (seconds > SelectedParagraph.StartTime.TotalSeconds) + { + _oldParagraph = new Paragraph(SelectedParagraph); + _mouseDownParagraph = SelectedParagraph; + _mouseDownParagraph.EndTime.TotalMilliseconds = milliseconds; + OnTimeChanged?.Invoke(this, new ParagraphEventArgs(seconds, _mouseDownParagraph, _oldParagraph)); + } + } + return; + } + if (ModifierKeys == (Keys.Control | Keys.Shift) && SelectedParagraph != null) + { + double seconds = RelativeXPositionToSeconds(e.X); + if (_mouseDownParagraphType == MouseDownParagraphType.None || _mouseDownParagraphType == MouseDownParagraphType.Whole) + { + _oldParagraph = new Paragraph(SelectedParagraph); + _mouseDownParagraph = SelectedParagraph; + OnTimeChangedAndOffsetRest?.Invoke(this, new ParagraphEventArgs(seconds, _mouseDownParagraph)); + } + return; + } + if (ModifierKeys == Keys.Alt && SelectedParagraph != null) + { + double seconds = RelativeXPositionToSeconds(e.X); + var milliseconds = (int)(seconds * TimeCode.BaseUnit); + if (_mouseDownParagraphType == MouseDownParagraphType.None || _mouseDownParagraphType == MouseDownParagraphType.Whole) + { + _oldParagraph = new Paragraph(SelectedParagraph); + _mouseDownParagraph = SelectedParagraph; + double durationMilliseconds = _mouseDownParagraph.Duration.TotalMilliseconds; + _mouseDownParagraph.StartTime.TotalMilliseconds = milliseconds; + _mouseDownParagraph.EndTime.TotalMilliseconds = _mouseDownParagraph.StartTime.TotalMilliseconds + durationMilliseconds; + OnTimeChanged?.Invoke(this, new ParagraphEventArgs(seconds, _mouseDownParagraph, _oldParagraph)); + } + return; + } + + if (_mouseDownParagraphType == MouseDownParagraphType.None || _mouseDownParagraphType == MouseDownParagraphType.Whole) + { + double seconds = RelativeXPositionToSeconds(e.X); + var milliseconds = (int)(seconds * TimeCode.BaseUnit); + Paragraph p = GetParagraphAtMilliseconds(milliseconds); + OnSingleClick.Invoke(this, new ParagraphEventArgs(RelativeXPositionToSeconds(e.X), p)); + } + } + } + } + + private void WaveformKeyDown(object sender, KeyEventArgs e) + { + if (_wavePeaks == null) + { + return; + } + + if (e.Modifiers == Keys.None && e.KeyCode == Keys.Add) + { + ZoomIn(); + e.SuppressKeyPress = true; + } + else if (e.Modifiers == Keys.None && e.KeyCode == Keys.Subtract) + { + ZoomOut(); + e.SuppressKeyPress = true; + } + else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.D0) + { + ZoomFactor = 1.0; + OnZoomedChanged?.Invoke(this, null); + e.SuppressKeyPress = true; + } + else if (e.Modifiers == Keys.None && e.KeyCode == Keys.Z) + { + if (_startPositionSeconds > 0.1) + { + StartPositionSeconds -= 0.1; + OnPositionSelected?.Invoke(this, new ParagraphEventArgs(_startPositionSeconds, null)); + Invalidate(); + e.SuppressKeyPress = true; + } + } + else if (e.Modifiers == Keys.None && e.KeyCode == Keys.X) + { + if (_startPositionSeconds + 0.1 < _wavePeaks.LengthInSeconds) + { + StartPositionSeconds += 0.1; + OnPositionSelected?.Invoke(this, new ParagraphEventArgs(_startPositionSeconds, null)); + Invalidate(); + e.SuppressKeyPress = true; + } + } + else if (e.Modifiers == Keys.Alt && e.KeyCode == Keys.C) + { + Locked = !Locked; + Invalidate(); + e.SuppressKeyPress = true; + } + else if (e.KeyData == InsertAtVideoPositionShortcut) + { + if (InsertAtVideoPosition != null) + { + InsertAtVideoPosition.Invoke(this, null); + e.SuppressKeyPress = true; + } + } + else if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control) //Ctrl+v = Paste from clipboard + { + if (PasteAtVideoPosition != null) + { + PasteAtVideoPosition.Invoke(this, null); + e.SuppressKeyPress = true; + } + } + else if (e.KeyData == Move100MsLeft) + { + var pos = Math.Max(0, _currentVideoPositionSeconds - 0.1); + OnPositionSelected?.Invoke(this, new ParagraphEventArgs(pos, null)); + Invalidate(); + e.SuppressKeyPress = true; + } + else if (e.KeyData == Move100MsRight) + { + var pos = _currentVideoPositionSeconds + 0.1; + OnPositionSelected?.Invoke(this, new ParagraphEventArgs(pos, null)); + Invalidate(); + e.SuppressKeyPress = true; + } + else if (e.KeyData == MoveOneSecondLeft) + { + var pos = Math.Max(0, _currentVideoPositionSeconds - 1); + OnPositionSelected?.Invoke(this, new ParagraphEventArgs(pos, null)); + Invalidate(); + e.SuppressKeyPress = true; + } + else if (e.KeyData == MoveOneSecondRight) + { + var pos = _currentVideoPositionSeconds + 1; + OnPositionSelected?.Invoke(this, new ParagraphEventArgs(pos, null)); + Invalidate(); + e.SuppressKeyPress = true; + } + } + + public void ZoomIn() + { + ZoomFactor += 0.1; + OnZoomedChanged?.Invoke(this, null); + } + + public void ZoomOut() + { + ZoomFactor -= 0.1; + OnZoomedChanged?.Invoke(this, null); + } + + private void VerticalZoomIn() + { + VerticalZoomFactor *= 1.1; + } + + private void VerticalZoomOut() + { + VerticalZoomFactor /= 1.1; + } + + private void WaveformMouseWheel(object sender, MouseEventArgs e) + { + // The scroll wheel could work in theory without the waveform loaded (it would be + // just like dragging the slider, which does work without the waveform), but the + // code below doesn't support it, so bail out until someone feels like fixing it. + if (_wavePeaks == null) + { + return; + } + + if (ModifierKeys == Keys.Control) + { + if (e.Delta > 0) + { + ZoomIn(); + } + else + { + ZoomOut(); + } + + return; + } + + if (ModifierKeys == (Keys.Control | Keys.Shift)) + { + if (e.Delta > 0) + { + VerticalZoomIn(); + } + else + { + VerticalZoomOut(); + } + + return; + } + + int delta = e.Delta; + if (!MouseWheelScrollUpIsForward) + { + delta = delta * -1; + } + + if (Locked) + { + OnPositionSelected?.Invoke(this, new ParagraphEventArgs(_currentVideoPositionSeconds + (delta / 256.0), null)); + } + else + { + StartPositionSeconds += delta / 256.0; + _lastMouseWheelScroll = DateTime.UtcNow.Ticks; + if (_currentVideoPositionSeconds < _startPositionSeconds || _currentVideoPositionSeconds >= EndPositionSeconds) + { + OnPositionSelected?.Invoke(this, new ParagraphEventArgs(_startPositionSeconds, null)); + } + } + Invalidate(); + } + + ///////////////////////////////////////////////// + + private void InitializeSpectrogram(SpectrogramData spectrogram) + { + if (_spectrogram != null) + { + _spectrogram.Dispose(); + _spectrogram = null; + Invalidate(); + } + + if (spectrogram == null) + { + return; + } + + if (spectrogram.IsLoaded) + { + InitializeSpectrogramInternal(spectrogram); + } + else + { + Task.Factory.StartNew(() => + { + spectrogram.Load(); + BeginInvoke((Action)(() => + { + InitializeSpectrogramInternal(spectrogram); + })); + }); + } + } + + private void InitializeSpectrogramInternal(SpectrogramData spectrogram) + { + if (_spectrogram != null) + { + return; + } + + _spectrogram = spectrogram; + Invalidate(); + } + + private void DrawSpectrogram(Graphics graphics) + { + int width = (int)Math.Round((EndPositionSeconds - _startPositionSeconds) / _spectrogram.SampleDuration); + using (var bmpCombined = new Bitmap(width, _spectrogram.FftSize / 2)) + using (var gfxCombined = Graphics.FromImage(bmpCombined)) + { + int left = (int)Math.Round(_startPositionSeconds / _spectrogram.SampleDuration); + int offset = 0; + int imageIndex = left / _spectrogram.ImageWidth; + while (offset < width && imageIndex < _spectrogram.Images.Count) + { + int x = (left + offset) % _spectrogram.ImageWidth; + int w = Math.Min(_spectrogram.ImageWidth - x, width - offset); + gfxCombined.DrawImage(_spectrogram.Images[imageIndex], offset, 0, new Rectangle(x, 0, w, bmpCombined.Height), GraphicsUnit.Pixel); + offset += w; + imageIndex++; + } + int displayHeight = _showWaveform ? SpectrogramDisplayHeight : Height; + graphics.DrawImage(bmpCombined, new Rectangle(0, Height - displayHeight, Width, displayHeight)); + } + } + + private double GetAverageVolumeForNextMilliseconds(int sampleIndex, int milliseconds) + { + // length cannot be less than 9 + int length = Math.Max(SecondsToSampleIndex(milliseconds / TimeCode.BaseUnit), 9); + int max = Math.Min(sampleIndex + length, _wavePeaks.Peaks.Count); + int from = Math.Max(sampleIndex, 1); + + if (from >= max) + { + return 0; + } + + double v = 0; + for (int i = from; i < max; i++) + { + v += _wavePeaks.Peaks[i].Abs; + } + + return v / (max - from); + } + + internal void GenerateTimeCodes(Subtitle subtitle, double startFromSeconds, int blockSizeMilliseconds, int minimumVolumePercent, int maximumVolumePercent, int defaultMilliseconds) + { + int begin = SecondsToSampleIndex(startFromSeconds); + + double average = 0; + for (int k = begin; k < _wavePeaks.Peaks.Count; k++) + { + average += _wavePeaks.Peaks[k].Abs; + } + + average /= _wavePeaks.Peaks.Count - begin; + + var maxThreshold = (int)(_wavePeaks.HighestPeak * (maximumVolumePercent / 100.0)); + var silenceThreshold = (int)(average * (minimumVolumePercent / 100.0)); + + int length50Ms = SecondsToSampleIndex(0.050); + double secondsPerParagraph = defaultMilliseconds / TimeCode.BaseUnit; + int minBetween = SecondsToSampleIndex(Configuration.Settings.General.MinimumMillisecondsBetweenLines / TimeCode.BaseUnit); + bool subtitleOn = false; + int i = begin; + while (i < _wavePeaks.Peaks.Count) + { + if (subtitleOn) + { + var currentLengthInSeconds = SampleIndexToSeconds(i - begin); + if (currentLengthInSeconds > 1.0) + { + subtitleOn = EndParagraphDueToLowVolume(subtitle, blockSizeMilliseconds, silenceThreshold, begin, true, i); + if (!subtitleOn) + { + begin = i + minBetween; + i = begin; + } + } + if (subtitleOn && currentLengthInSeconds >= secondsPerParagraph) + { + for (int j = 0; j < 20; j++) + { + subtitleOn = EndParagraphDueToLowVolume(subtitle, blockSizeMilliseconds, silenceThreshold, begin, true, i + (j * length50Ms)); + if (!subtitleOn) + { + i += (j * length50Ms); + begin = i + minBetween; + i = begin; + break; + } + } + + if (subtitleOn) // force break + { + var p = new Paragraph(string.Empty, SampleIndexToSeconds(begin) * TimeCode.BaseUnit, SampleIndexToSeconds(i) * TimeCode.BaseUnit); + subtitle.Paragraphs.Add(p); + begin = i + minBetween; + i = begin; + } + } + } + else + { + double avgVol = GetAverageVolumeForNextMilliseconds(i, blockSizeMilliseconds); + if (avgVol > silenceThreshold && avgVol < maxThreshold) + { + subtitleOn = true; + begin = i; + } + } + i++; + } + + subtitle.Renumber(); + } + + private bool EndParagraphDueToLowVolume(Subtitle subtitle, int blockSizeMilliseconds, double silenceThreshold, int begin, bool subtitleOn, int i) + { + double avgVol = GetAverageVolumeForNextMilliseconds(i, blockSizeMilliseconds); + if (avgVol < silenceThreshold) + { + var p = new Paragraph(string.Empty, SampleIndexToSeconds(begin) * TimeCode.BaseUnit, SampleIndexToSeconds(i) * TimeCode.BaseUnit); + subtitle.Paragraphs.Add(p); + subtitleOn = false; + } + return subtitleOn; + } + + private MinMax GetMinAndMax(int startIndex, int endIndex) + { + int minPeak = int.MaxValue; + int maxPeak = int.MinValue; + double total = 0; + for (int i = startIndex; i < endIndex; i++) + { + var v = _wavePeaks.Peaks[i].Abs; + total += v; + if (v < minPeak) + { + minPeak = v; + } + if (v > maxPeak) + { + maxPeak = v; + } + } + + return new MinMax { Min = minPeak, Max = maxPeak, Avg = total / (endIndex - startIndex) }; + } + + public double FindDataBelowThreshold(double thresholdPercent, double durationInSeconds) + { + int begin = SecondsToSampleIndex(_currentVideoPositionSeconds + 1); + int length = SecondsToSampleIndex(durationInSeconds); + var threshold = thresholdPercent / 100.0 * _wavePeaks.HighestPeak; + + int hitCount = 0; + for (int i = Math.Max(0, begin); i < _wavePeaks.Peaks.Count; i++) + { + if (_wavePeaks.Peaks[i].Abs <= threshold) + { + hitCount++; + } + else + { + hitCount = 0; + } + + if (hitCount > length) + { + double seconds = SampleIndexToSeconds(i - (length / 2)); + if (seconds >= 0) + { + StartPositionSeconds = seconds; + if (_startPositionSeconds > 1) + { + StartPositionSeconds -= 1; + } + + OnSingleClick?.Invoke(this, new ParagraphEventArgs(seconds, null)); + Invalidate(); + } + return seconds; + } + } + return -1; + } + + /// video position in seconds, -1 if not found + public double FindDataBelowThresholdBack(double thresholdPercent, double durationInSeconds) + { + int begin = SecondsToSampleIndex(_currentVideoPositionSeconds - 1); + int length = SecondsToSampleIndex(durationInSeconds); + var threshold = thresholdPercent / 100.0 * _wavePeaks.HighestPeak; + int hitCount = 0; + for (int i = begin; i > 0; i--) + { + if (i > 0 && i < _wavePeaks.Peaks.Count && _wavePeaks.Peaks[i].Abs <= threshold) + { + hitCount++; + if (hitCount > length) + { + double seconds = SampleIndexToSeconds(i + length / 2); + if (seconds >= 0) + { + StartPositionSeconds = seconds; + if (_startPositionSeconds > 1) + { + StartPositionSeconds -= 1; + } + else + { + StartPositionSeconds = 0; + } + + OnSingleClick?.Invoke(this, new ParagraphEventArgs(seconds, null)); + Invalidate(); + } + return seconds; + } + } + else + { + hitCount = 0; + } + } + return -1; + } + + /// + /// Seeks silence in volume + /// + /// video position in seconds, -1 if not found + public double FindDataBelowThresholdBackForStart(double thresholdPercent, double durationInSeconds, double startSeconds) + { + var min = Math.Max(0, SecondsToSampleIndex(startSeconds - 1)); + var maxShort = Math.Min(_wavePeaks.Peaks.Count, SecondsToSampleIndex(startSeconds + durationInSeconds + 0.01)); + var max = Math.Min(_wavePeaks.Peaks.Count, SecondsToSampleIndex(startSeconds + durationInSeconds + 0.8)); + int length = SecondsToSampleIndex(durationInSeconds); + var threshold = thresholdPercent / 100.0 * _wavePeaks.HighestPeak; + + var minMax = GetMinAndMax(min, max); + const int lowPeakDifference = 4_000; + if (minMax.Max - minMax.Min < lowPeakDifference) + { + return -1; // all audio about the same + } + + // look for start silence in the beginning of subtitle + min = SecondsToSampleIndex(startSeconds); + var hitCount = 0; + int index; + for (index = min; index < max; index++) + { + if (index > 0 && index < _wavePeaks.Peaks.Count && _wavePeaks.Peaks[index].Abs <= threshold) + { + hitCount++; + } + else + { + minMax = GetMinAndMax(min, index); + var currentMinMax = GetMinAndMax(SecondsToSampleIndex(startSeconds), SecondsToSampleIndex(startSeconds + 0.8)); + if (currentMinMax.Avg > minMax.Avg + 300 || currentMinMax.Avg < 1000 && minMax.Avg < 1000 && Math.Abs(currentMinMax.Avg - minMax.Avg) < 500) + { + break; + } + hitCount = length / 2; + } + } + if (hitCount > length) + { + minMax = GetMinAndMax(min, index); + var currentMinMax = GetMinAndMax(SecondsToSampleIndex(startSeconds), SecondsToSampleIndex(startSeconds + 0.8)); + if (currentMinMax.Avg > minMax.Avg + 300 || currentMinMax.Avg < 1000 && minMax.Avg < 1000 && Math.Abs(currentMinMax.Avg - minMax.Avg) < 500) + { + return Math.Max(0, SampleIndexToSeconds(index - 1) - 0.01); + } + } + + // move start left? + min = SecondsToSampleIndex(startSeconds - 1); + hitCount = 0; + for (index = maxShort; index > min; index--) + { + if (index > 0 && index < _wavePeaks.Peaks.Count && _wavePeaks.Peaks[index].Abs <= threshold) + { + hitCount++; + if (hitCount > length) + { + return Math.Max(0, SampleIndexToSeconds(index + length) - 0.01); + } + } + else + { + hitCount = 0; + } + } + return -1; + } + + public double FindLowPercentage(double startSeconds, double endSeconds) + { + var min = Math.Max(0, SecondsToSampleIndex(startSeconds)); + var max = Math.Min(_wavePeaks.Peaks.Count, SecondsToSampleIndex(endSeconds)); + var minMax = GetMinAndMax(min, max); + var threshold = minMax.Min * 100.0 / _wavePeaks.HighestPeak; + return threshold; + } + + public double FindHighPercentage(double startSeconds, double endSeconds) + { + var min = Math.Max(0, SecondsToSampleIndex(startSeconds)); + var max = Math.Min(_wavePeaks.Peaks.Count, SecondsToSampleIndex(endSeconds)); + var minMax = GetMinAndMax(min, max); + var threshold = minMax.Max * 100.0 / _wavePeaks.HighestPeak; + return threshold; + } + + public int GetSceneChangeIndex(double seconds) + { + if (SceneChanges == null) + { + return -1; + } + try + { + for (int index = 0; index < SceneChanges.Count; index++) + { + var sceneChange = SceneChanges[index]; + if (Math.Abs(sceneChange - seconds) < 0.04) + { + return index; + } + } + } + catch + { + // ignored + } + + return -1; + } + + } +} diff --git a/src/Controls/AudioVisualizer.resx b/src/ui/Controls/AudioVisualizer.resx similarity index 97% rename from src/Controls/AudioVisualizer.resx rename to src/ui/Controls/AudioVisualizer.resx index 4f24d55cd..8b2ff64a1 100644 --- a/src/Controls/AudioVisualizer.resx +++ b/src/ui/Controls/AudioVisualizer.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Controls/SETextBox.cs b/src/ui/Controls/SETextBox.cs similarity index 97% rename from src/Controls/SETextBox.cs rename to src/ui/Controls/SETextBox.cs index 4271cf83b..fc30a424b 100644 --- a/src/Controls/SETextBox.cs +++ b/src/ui/Controls/SETextBox.cs @@ -1,1090 +1,1090 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Drawing; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Controls -{ - /// - /// TextBox with drag and drop. - /// - public sealed class SETextBox : Panel - { - public new event EventHandler TextChanged; - public new event KeyEventHandler KeyDown; - public new event MouseEventHandler MouseClick; - public new event EventHandler Enter; - public new event KeyEventHandler KeyUp; - public new event EventHandler Leave; - public new event MouseEventHandler MouseMove; - - private string _dragText = string.Empty; - private int _dragStartFrom; - private long _dragStartTicks; - private bool _dragRemoveOld; - private bool _dragFromThis; - private long _gotFocusTicks; - private bool _checkRtfChange = true; - private RichTextBox _richTextBoxTemp; - private RichTextBox _uiTextBox; - private TextBox _textBox; - private int _mouseMoveSelectionLength; - - public SETextBox() - { - Initialize(Configuration.Settings.General.SubtitleTextBoxSyntaxColor); - } - - public void Initialize(bool useSyntaxColoring) - { - ContextMenuStrip oldContextMenuStrip = null; - var oldEnabled = true; - if (_textBox != null) - { - oldContextMenuStrip = _textBox.ContextMenuStrip; - oldEnabled = _textBox.Enabled; - } - else if (_uiTextBox != null) - { - oldContextMenuStrip = _uiTextBox.ContextMenuStrip; - oldEnabled = _uiTextBox.Enabled; - } - - BorderStyle = BorderStyle.None; - Padding = new Padding(1); - BackColor = SystemColors.WindowFrame; - - Controls.Clear(); - _textBox?.Dispose(); - _richTextBoxTemp?.Dispose(); - _uiTextBox?.Dispose(); - if (useSyntaxColoring) - { - _textBox = null; - _richTextBoxTemp = new RichTextBox(); - _uiTextBox = new RichTextBox { BorderStyle = BorderStyle.None, Multiline = true }; - InitializeBackingControl(_uiTextBox); - - // avoid selection when centered and clicking to the left - _uiTextBox.MouseDown += (sender, args) => - { - var charIndex = _uiTextBox.GetCharIndexFromPosition(args.Location); - if (Configuration.Settings.General.CenterSubtitleInTextBox && - _mouseMoveSelectionLength == 0 && - (charIndex == 0 || charIndex >= 0 && _uiTextBox.Text[charIndex - 1] == '\n')) - { - _uiTextBox.SelectionLength = 0; - } - }; - _uiTextBox.MouseMove += (sender, args) => - { - _mouseMoveSelectionLength = _uiTextBox.SelectionLength; - }; - _uiTextBox.KeyDown += (sender, args) => - { - // fix annoying "beeps" when moving cursor position - if ((args.KeyData == Keys.Left || args.KeyData == Keys.PageUp) && _uiTextBox.SelectionStart == 0) - { - args.SuppressKeyPress = true; - } - else if (args.KeyData == Keys.Up && _uiTextBox.SelectionStart <= _uiTextBox.Text.IndexOf('\n')) - { - args.SuppressKeyPress = true; - } - else if (args.KeyData == Keys.Home && (_uiTextBox.SelectionStart == 0 || _uiTextBox.SelectionStart > 0 && _uiTextBox.Text[_uiTextBox.SelectionStart - 1] == '\n')) - { - args.SuppressKeyPress = true; - } - else if (args.KeyData == (Keys.Home | Keys.Control) && _uiTextBox.SelectionStart == 0) - { - args.SuppressKeyPress = true; - } - else if (args.KeyData == Keys.End && (_uiTextBox.SelectionStart >= _uiTextBox.Text.Length || _uiTextBox.SelectionStart + 1 < _uiTextBox.Text.Length && _uiTextBox.Text[_uiTextBox.SelectionStart] == '\n')) - { - args.SuppressKeyPress = true; - } - else if (args.KeyData == (Keys.End | Keys.Control) && _uiTextBox.SelectionStart >= _uiTextBox.Text.Length) - { - args.SuppressKeyPress = true; - } - else if (args.KeyData == Keys.Right && _uiTextBox.SelectionStart >= _uiTextBox.Text.Length) - { - args.SuppressKeyPress = true; - } - else if (args.KeyData == Keys.Down && _uiTextBox.SelectionStart >= _uiTextBox.Text.Length) - { - args.SuppressKeyPress = true; - } - else if (args.KeyData == Keys.PageDown && _uiTextBox.SelectionStart >= _uiTextBox.Text.Length) - { - args.SuppressKeyPress = true; - } - }; - } - else - { - _textBox = new TextBox { BorderStyle = BorderStyle.None, Multiline = true }; - InitializeBackingControl(_textBox); - } - - UpdateFontAndColors(); - if (oldContextMenuStrip != null) - { - ContextMenuStrip = oldContextMenuStrip; - } - - Enabled = oldEnabled; - } - - private void InitializeBackingControl(Control textBox) - { - textBox.AllowDrop = true; - textBox.DragEnter += SETextBox_DragEnter; - textBox.DragDrop += SETextBox_DragDrop; - textBox.GotFocus += (sender, args) => { _gotFocusTicks = DateTime.UtcNow.Ticks; }; - textBox.MouseDown += SETextBox_MouseDown; - textBox.MouseUp += SETextBox_MouseUp; - textBox.TextChanged += TextChangedHighlight; - Controls.Add(textBox); - textBox.Dock = DockStyle.Fill; - textBox.Enter += (sender, args) => { BackColor = SystemColors.Highlight; }; - textBox.Leave += (sender, args) => { BackColor = SystemColors.WindowFrame; }; - textBox.TextChanged += (sender, args) => { TextChanged?.Invoke(sender, args); }; - textBox.KeyDown += (sender, args) => { KeyDown?.Invoke(sender, args); }; - textBox.MouseClick += (sender, args) => { MouseClick?.Invoke(sender, args); }; - textBox.Enter += (sender, args) => { Enter?.Invoke(sender, args); }; - textBox.KeyUp += (sender, args) => { KeyUp?.Invoke(sender, args); }; - textBox.Leave += (sender, args) => { Leave?.Invoke(sender, args); }; - textBox.MouseMove += (sender, args) => { MouseMove?.Invoke(sender, args); }; - } - - private void UpdateFontAndColors() - { - UpdateFontAndColors(_uiTextBox); - UpdateFontAndColors(_richTextBoxTemp); - UpdateFontAndColors(_textBox); - } - - public void UpdateFontAndColors(Control textBox) - { - if (textBox == null) - { - return; - } - - var gs = Configuration.Settings.General; - if (string.IsNullOrEmpty(gs.SubtitleFontName)) - { - gs.SubtitleFontName = Font.Name; - } - - try - { - textBox.Font = gs.SubtitleTextBoxFontBold ? new Font(gs.SubtitleFontName, gs.SubtitleTextBoxFontSize, FontStyle.Bold) : new Font(gs.SubtitleFontName, gs.SubtitleTextBoxFontSize); - textBox.ForeColor = gs.SubtitleFontColor; - textBox.BackColor = gs.SubtitleBackgroundColor; - } - catch - { - // ignore - } - } - - private bool _fixedArabicComma; - public override string Text - { - get - { - if (_textBox != null) - { - return _textBox.Text; - } - - if (_uiTextBox == null) - { - return string.Empty; - } - - var s = _uiTextBox.Text; - if (_fixedArabicComma) - { - s = s.Replace("\u202A", string.Empty); - } - - return string.Join(Environment.NewLine, s.SplitToLines()); - } - set - { - if (_textBox != null) - { - _textBox.Text = value; - return; - } - - if (_uiTextBox == null) - { - return; - } - - _fixedArabicComma = false; - var s = value; - if (!Configuration.Settings.General.RightToLeftMode && !s.Contains('\u202A')) - { - string textNoTags = HtmlUtil.RemoveHtmlTags(s, true); - if (textNoTags.EndsWith('،')) - { - s = s.Replace("،", "\u202A،"); - } - else if (textNoTags.StartsWith('،')) - { - s = s.Replace("،", "،\u202A"); - } - - _fixedArabicComma = true; - } - - _uiTextBox.Text = string.Join("\n", s.SplitToLines()); - } - } - - public int SelectionStart - { - get - { - if (_textBox == null && _uiTextBox == null) - { - return 0; - } - - return _textBox?.SelectionStart ?? _uiTextBox.SelectionStart; - } - set - { - if (_textBox != null) - { - _textBox.SelectionStart = value; - } - else if (_uiTextBox != null) - { - _uiTextBox.SelectionStart = value; - } - } - } - - public int SelectionLength - { - get - { - if (_textBox == null && _uiTextBox == null) - { - return 0; - } - - return _textBox?.SelectionLength ?? _uiTextBox.SelectionLength; - } - set - { - if (_textBox != null) - { - _textBox.SelectionLength = value; - } - else if (_uiTextBox != null) - { - _uiTextBox.SelectionLength = value; - } - } - } - - public bool HideSelection - { - get - { - if (_textBox == null && _uiTextBox == null) - { - return false; - } - - return _textBox?.HideSelection ?? _uiTextBox.HideSelection; - } - set - { - if (_textBox != null) - { - _textBox.HideSelection = value; - } - else if (_uiTextBox != null) - { - _uiTextBox.HideSelection = value; - } - } - } - - public string SelectedText - { - get - { - if (_textBox == null && _uiTextBox == null) - { - return string.Empty; - } - - return _textBox?.SelectedText ?? _uiTextBox.SelectedText; - } - set - { - if (_textBox != null) - { - _textBox.SelectedText = value; - } - else if (_uiTextBox != null) - { - _uiTextBox.SelectedText = value; - } - } - } - - public bool Multiline - { - get - { - if (_textBox == null && _uiTextBox == null) - { - return false; - } - - return _textBox?.Multiline ?? _uiTextBox.Multiline; - } - set - { - if (_textBox != null) - { - _textBox.Multiline = value; - } - else if (_uiTextBox != null) - { - _uiTextBox.Multiline = value; - } - } - } - - public new bool Enabled - { - get - { - if (_textBox == null && _uiTextBox == null) - { - return true; - } - - return _textBox?.Enabled ?? _uiTextBox.Enabled; - } - set - { - if (_textBox != null) - { - _textBox.Enabled = value; - } - else if (_uiTextBox != null) - { - _uiTextBox.Enabled = value; - } - } - } - - public RichTextBoxScrollBars ScrollBars - { - get - { - if (_textBox == null && _uiTextBox == null) - { - return RichTextBoxScrollBars.None; - } - - if (_textBox != null) - { - if (_textBox.ScrollBars == System.Windows.Forms.ScrollBars.Both) - { - return RichTextBoxScrollBars.Both; - } - - if (_textBox.ScrollBars == System.Windows.Forms.ScrollBars.Horizontal) - { - return RichTextBoxScrollBars.Horizontal; - } - - if (_textBox.ScrollBars == System.Windows.Forms.ScrollBars.Vertical) - { - return RichTextBoxScrollBars.Vertical; - } - - return RichTextBoxScrollBars.None; - } - - return _uiTextBox.ScrollBars; - } - set - { - if (_textBox != null) - { - if (value == RichTextBoxScrollBars.Both || value == RichTextBoxScrollBars.ForcedBoth) - { - _textBox.ScrollBars = System.Windows.Forms.ScrollBars.Both; - } - else if (value == RichTextBoxScrollBars.Horizontal || value == RichTextBoxScrollBars.ForcedHorizontal) - { - _textBox.ScrollBars = System.Windows.Forms.ScrollBars.Horizontal; - } - else if (value == RichTextBoxScrollBars.Vertical || value == RichTextBoxScrollBars.ForcedVertical) - { - _textBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - } - - _textBox.ScrollBars = System.Windows.Forms.ScrollBars.None; - } - else if (_uiTextBox != null) - { - _uiTextBox.ScrollBars = value; - } - } - } - - public override ContextMenuStrip ContextMenuStrip - { - get - { - if (_textBox == null && _uiTextBox == null) - { - return null; - } - - return _textBox?.ContextMenuStrip ?? _uiTextBox.ContextMenuStrip; - } - set - { - if (_textBox != null) - { - _textBox.ContextMenuStrip = value; - return; - } - - if (_uiTextBox != null) - { - _uiTextBox.ContextMenuStrip = value; - } - } - } - - public int GetCharIndexFromPosition(Point pt) - { - if (_textBox != null) - { - return _textBox.GetCharIndexFromPosition(pt); - } - - if (_uiTextBox != null) - { - return _uiTextBox.GetCharIndexFromPosition(pt); - } - - return 0; - } - - public void SelectAll() - { - if (_textBox != null) - { - _textBox.SelectAll(); - } - else - { - _uiTextBox?.SelectAll(); - } - } - - public void Clear() - { - if (_textBox != null) - { - _textBox.Clear(); - } - else - { - _uiTextBox?.Clear(); - } - } - - public void Undo() - { - if (_textBox != null) - { - _textBox.Undo(); - } - else - { - _uiTextBox?.Undo(); - } - } - - public void ClearUndo() - { - if (_textBox != null) - { - _textBox.ClearUndo(); - } - else - { - _uiTextBox?.ClearUndo(); - } - } - - public void Copy() - { - if (_textBox != null) - { - _textBox.Copy(); - } - else - { - _uiTextBox?.Copy(); - } - } - - public void Cut() - { - if (_textBox != null) - { - _textBox.Cut(); - } - else - { - _uiTextBox?.Cut(); - } - } - - public void Paste() - { - if (_textBox != null) - { - _textBox.Paste(); - } - else - { - _uiTextBox?.Paste(); - } - } - - public override bool Focused - { - get - { - if (_textBox == null && _uiTextBox == null) - { - return false; - } - - return _textBox?.Focused ?? _uiTextBox.Focused; - } - } - - public new void Focus() - { - if (_textBox != null) - { - _textBox.Focus(); - } - else - { - _uiTextBox?.Focus(); - } - } - - private void SETextBox_MouseUp(object sender, MouseEventArgs e) - { - _dragRemoveOld = false; - _dragFromThis = false; - } - - private void SETextBox_MouseDown(object sender, MouseEventArgs e) - { - if (MouseButtons == MouseButtons.Left && !string.IsNullOrEmpty(_dragText)) - { - var pt = new Point(e.X, e.Y); - int index = GetCharIndexFromPosition(pt); - if (index >= _dragStartFrom && index <= _dragStartFrom + _dragText.Length) - { - // re-make selection - SelectionStart = _dragStartFrom; - SelectionLength = _dragText.Length; - - try - { - var dataObject = new DataObject(); - dataObject.SetText(_dragText, TextDataFormat.UnicodeText); - dataObject.SetText(_dragText, TextDataFormat.Text); - - _dragFromThis = true; - if (ModifierKeys == Keys.Control) - { - _dragRemoveOld = false; - DoDragDrop(dataObject, DragDropEffects.Copy); - } - else if (ModifierKeys == Keys.None) - { - _dragRemoveOld = true; - DoDragDrop(dataObject, DragDropEffects.Move); - } - } - catch - { - // ignored - } - } - } - } - - private void SETextBox_DragDrop(object sender, DragEventArgs e) - { - var pt = PointToClient(new Point(e.X, e.Y)); - int index = GetCharIndexFromPosition(pt); - - string newText; - if (e.Data.GetDataPresent(DataFormats.UnicodeText)) - { - newText = (string)e.Data.GetData(DataFormats.UnicodeText); - } - else - { - newText = (string)e.Data.GetData(DataFormats.Text); - } - - if (string.IsNullOrWhiteSpace(Text)) - { - Text = newText; - } - else - { - bool justAppend = index == Text.Length - 1 && index > 0; - const string expectedChars = ":;]<.!?؟"; - if (_dragFromThis) - { - _dragFromThis = false; - long milliseconds = (DateTime.UtcNow.Ticks - _dragStartTicks) / 10000; - if (milliseconds < 400) - { - SelectionLength = 0; - if (justAppend) - { - index++; - } - - SelectionStart = index; - return; // too fast - nobody can drag and drop this fast - } - - if (index >= _dragStartFrom && index <= _dragStartFrom + _dragText.Length) - { - return; // don't drop same text at same position - } - - if (_dragRemoveOld) - { - _dragRemoveOld = false; - Text = Text.Remove(_dragStartFrom, _dragText.Length); - - // fix spaces - if (_dragStartFrom == 0 && Text.Length > 0 && Text[0] == ' ') - { - Text = Text.Remove(0, 1); - index--; - } - else if (_dragStartFrom > 1 && Text.Length > _dragStartFrom + 1 && Text[_dragStartFrom] == ' ' && Text[_dragStartFrom - 1] == ' ') - { - Text = Text.Remove(_dragStartFrom, 1); - if (_dragStartFrom < index) - { - index--; - } - } - else if (_dragStartFrom > 0 && Text.Length > _dragStartFrom + 1 && Text[_dragStartFrom] == ' ' && expectedChars.Contains(Text[_dragStartFrom + 1])) - { - Text = Text.Remove(_dragStartFrom, 1); - if (_dragStartFrom < index) - { - index--; - } - } - - // fix index - if (index > _dragStartFrom) - { - index -= _dragText.Length; - } - - if (index < 0) - { - index = 0; - } - } - } - if (justAppend) - { - index = Text.Length; - Text += newText; - } - else - { - Text = Text.Insert(index, newText); - } - - // fix start spaces - int endIndex = index + newText.Length; - if (index > 0 && !newText.StartsWith(' ') && Text[index - 1] != ' ') - { - Text = Text.Insert(index, " "); - endIndex++; - } - else if (index > 0 && newText.StartsWith(' ') && Text[index - 1] == ' ') - { - Text = Text.Remove(index, 1); - endIndex--; - } - - // fix end spaces - if (endIndex < Text.Length && !newText.EndsWith(' ') && Text[endIndex] != ' ') - { - bool lastWord = expectedChars.Contains(Text[endIndex]); - if (!lastWord) - { - Text = Text.Insert(endIndex, " "); - } - } - else if (endIndex < Text.Length && newText.EndsWith(' ') && Text[endIndex] == ' ') - { - Text = Text.Remove(endIndex, 1); - } - - SelectionStart = index + 1; - UiUtil.SelectWordAtCaret(this); - } - - _dragRemoveOld = false; - _dragFromThis = false; - } - - private void SETextBox_DragEnter(object sender, DragEventArgs e) - { - if (e.Data.GetDataPresent(DataFormats.Text) || e.Data.GetDataPresent(DataFormats.UnicodeText)) - { - e.Effect = ModifierKeys == Keys.Control ? DragDropEffects.Copy : DragDropEffects.Move; - } - else - { - e.Effect = DragDropEffects.None; - } - } - - private const int WM_LBUTTONDOWN = 0x0201; - protected override void WndProc(ref Message m) - { - if (m.Msg == WM_LBUTTONDOWN) - { - long milliseconds = (DateTime.UtcNow.Ticks - _gotFocusTicks) / 10000; - if (milliseconds > 10) - { - _dragText = SelectedText; - _dragStartFrom = SelectionStart; - _dragStartTicks = DateTime.UtcNow.Ticks; - } - } - base.WndProc(ref m); - } - - public void HighlightHtmlText() - { - if (Configuration.Settings.General.RightToLeftMode) - { - if (RightToLeft != RightToLeft.Yes) - { - RightToLeft = RightToLeft.Yes; - } - } - else - { - if (RightToLeft != RightToLeft.No) - { - RightToLeft = RightToLeft.No; - } - } - - if (_textBox != null) - { - if (Configuration.Settings.General.CenterSubtitleInTextBox && - _textBox.TextAlign != HorizontalAlignment.Center) - { - _textBox.TextAlign = HorizontalAlignment.Center; - } - - return; - } - - _richTextBoxTemp.RightToLeft = RightToLeft; - - - var text = _uiTextBox.Text; - if (string.IsNullOrWhiteSpace(text) || text.Length > 1000) - { - if (Configuration.Settings.General.CenterSubtitleInTextBox) - { - SuspendLayout(); - _richTextBoxTemp.Text = text; - _richTextBoxTemp.SelectAll(); - _richTextBoxTemp.SelectionAlignment = HorizontalAlignment.Center; - - // fix cursor to start in middle (and not left) - _richTextBoxTemp.Rtf = _richTextBoxTemp.Rtf.Replace("\\pard\\par", "\\par"); - - ResumeLayout(false); - _uiTextBox.Rtf = _richTextBoxTemp.Rtf; - } - - return; - } - - _richTextBoxTemp.SuspendLayout(); - _richTextBoxTemp.Clear(); - _richTextBoxTemp.Text = text; - _richTextBoxTemp.SelectAll(); - _richTextBoxTemp.SelectionFont = _richTextBoxTemp.Font; - _richTextBoxTemp.SelectionColor = _richTextBoxTemp.ForeColor; - - bool htmlTagOn = false; - bool htmlTagFontOn = false; - int htmlTagStart = -1; - bool assaTagOn = false; - bool assaPrimaryColorTagOn = false; - bool assaSecondaryColorTagOn = false; - bool assaBorderColorTagOn = false; - bool assaShadowColorTagOn = false; - var assaTagStart = -1; - int tagOn = -1; - var textLength = text.Length; - int i = 0; - - while (i < textLength) - { - var ch = text[i]; - if (assaTagOn) - { - if (ch == '}' && tagOn >= 0) - { - assaTagOn = false; - _richTextBoxTemp.SelectionStart = assaTagStart; - _richTextBoxTemp.SelectionLength = i - assaTagStart + 1; - _richTextBoxTemp.SelectionColor = Configuration.Settings.General.SubtitleTextBoxAssColor; - if (assaTagStart >= 0) - { - if (assaPrimaryColorTagOn) - { - string colorTag = text.IndexOf("\\c", assaTagStart, StringComparison.OrdinalIgnoreCase) != -1 ? "\\c" : "\\1c"; - - SetAssaColor(text, assaTagStart, colorTag); - assaPrimaryColorTagOn = false; - } - - if (assaSecondaryColorTagOn) - { - SetAssaColor(text, assaTagStart, "\\2c"); - assaSecondaryColorTagOn = false; - } - - if (assaBorderColorTagOn) - { - SetAssaColor(text, assaTagStart, "\\3c"); - assaBorderColorTagOn = false; - } - - if (assaShadowColorTagOn) - { - SetAssaColor(text, assaTagStart, "\\4c"); - assaShadowColorTagOn = false; - } - } - - assaTagStart = -1; - } - } - else if (htmlTagOn) - { - if (ch == '>' && tagOn >= 0) - { - htmlTagOn = false; - _richTextBoxTemp.SelectionStart = htmlTagStart; - _richTextBoxTemp.SelectionLength = i - htmlTagStart + 1; - _richTextBoxTemp.SelectionColor = Configuration.Settings.General.SubtitleTextBoxHtmlColor; - if (htmlTagFontOn && htmlTagStart >= 0) - { - SetHtmlColor(text, htmlTagStart); - htmlTagFontOn = false; - } - htmlTagStart = -1; - } - } - else if (ch == '{' && i < textLength - 1 && text[i + 1] == '\\' && text.IndexOf('}', i) > 0) - { - var s = text.Substring(i); - assaTagOn = true; - tagOn = i; - assaTagStart = i; - assaPrimaryColorTagOn = s.Contains("\\c", StringComparison.OrdinalIgnoreCase) || s.Contains("\\1c", StringComparison.OrdinalIgnoreCase); - assaSecondaryColorTagOn = s.Contains("\\2c", StringComparison.OrdinalIgnoreCase); - assaBorderColorTagOn = s.Contains("\\3c", StringComparison.OrdinalIgnoreCase); - assaShadowColorTagOn = s.Contains("\\4c", StringComparison.OrdinalIgnoreCase); - } - else if (ch == '<') - { - var s = text.Substring(i); - if (s.StartsWith("", StringComparison.OrdinalIgnoreCase) || - s.StartsWith("", StringComparison.OrdinalIgnoreCase) || - s.StartsWith("", StringComparison.OrdinalIgnoreCase) || - s.StartsWith("", StringComparison.OrdinalIgnoreCase) || - s.StartsWith("", StringComparison.OrdinalIgnoreCase) || - s.StartsWith("", StringComparison.OrdinalIgnoreCase) || - s.StartsWith("", StringComparison.OrdinalIgnoreCase) || - s.StartsWith("", StringComparison.OrdinalIgnoreCase) || - s.StartsWith("", StringComparison.OrdinalIgnoreCase) || - (s.StartsWith("", i, StringComparison.OrdinalIgnoreCase) > 0)) - { - htmlTagOn = true; - htmlTagStart = i; - htmlTagFontOn = s.StartsWith(" 0) - { - var color = text.Substring(colorStart, colorEnd - colorStart); - try - { - Color c; - if (color.StartsWith("rgb(", StringComparison.Ordinal)) - { - string[] arr = color.Remove(0, 4).TrimEnd(')').Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); - c = Color.FromArgb(int.Parse(arr[0]), int.Parse(arr[1]), int.Parse(arr[2])); - } - else - { - c = ColorTranslator.FromHtml(color); - } - - SetForeColorAndChangeBackColorIfClose(colorStart, colorEnd, c); - } - catch - { - // ignored - } - } - } - } - - private void SetForeColorAndChangeBackColorIfClose(int colorStart, int colorEnd, Color c) - { - _richTextBoxTemp.SelectionStart = colorStart; - _richTextBoxTemp.SelectionLength = colorEnd - colorStart; - _richTextBoxTemp.SelectionColor = c; - - var diff = Math.Abs(c.R - BackColor.R) + Math.Abs(c.G - BackColor.G) + Math.Abs(c.B - BackColor.B); - if (diff < 60) - { - _richTextBoxTemp.SelectionBackColor = Color.FromArgb(byte.MaxValue - c.R, byte.MaxValue - c.G, byte.MaxValue - c.B, byte.MaxValue - c.R); - } - } - - private void TextChangedHighlight(object sender, EventArgs e) - { - if (_checkRtfChange) - { - _checkRtfChange = false; - HighlightHtmlText(); - _checkRtfChange = true; - } - } - - private void SetAssaColor(string text, int assaTagStart, string colorTag) - { - int colorStart = text.IndexOf(colorTag, assaTagStart, StringComparison.OrdinalIgnoreCase); - if (colorStart > 0) - { - colorStart += colorTag.Length; - if (text[colorStart] == '&') - { - colorStart++; - } - - int colorEnd = text.IndexOf('&', colorStart + 1); - if (colorEnd > 0) - { - var color = text.Substring(colorStart, colorEnd - colorStart); - try - { - if (color.Length == 7) - { - var rgbColor = string.Concat("#", color[5], color[6], color[3], color[4], color[1], color[2]); - var c = ColorTranslator.FromHtml(rgbColor); - SetForeColorAndChangeBackColorIfClose(colorStart, colorEnd, c); - } - } - catch - { - // ignored - } - } - } - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Drawing; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Controls +{ + /// + /// TextBox with drag and drop. + /// + public sealed class SETextBox : Panel + { + public new event EventHandler TextChanged; + public new event KeyEventHandler KeyDown; + public new event MouseEventHandler MouseClick; + public new event EventHandler Enter; + public new event KeyEventHandler KeyUp; + public new event EventHandler Leave; + public new event MouseEventHandler MouseMove; + + private string _dragText = string.Empty; + private int _dragStartFrom; + private long _dragStartTicks; + private bool _dragRemoveOld; + private bool _dragFromThis; + private long _gotFocusTicks; + private bool _checkRtfChange = true; + private RichTextBox _richTextBoxTemp; + private RichTextBox _uiTextBox; + private TextBox _textBox; + private int _mouseMoveSelectionLength; + + public SETextBox() + { + Initialize(Configuration.Settings.General.SubtitleTextBoxSyntaxColor); + } + + public void Initialize(bool useSyntaxColoring) + { + ContextMenuStrip oldContextMenuStrip = null; + var oldEnabled = true; + if (_textBox != null) + { + oldContextMenuStrip = _textBox.ContextMenuStrip; + oldEnabled = _textBox.Enabled; + } + else if (_uiTextBox != null) + { + oldContextMenuStrip = _uiTextBox.ContextMenuStrip; + oldEnabled = _uiTextBox.Enabled; + } + + BorderStyle = BorderStyle.None; + Padding = new Padding(1); + BackColor = SystemColors.WindowFrame; + + Controls.Clear(); + _textBox?.Dispose(); + _richTextBoxTemp?.Dispose(); + _uiTextBox?.Dispose(); + if (useSyntaxColoring) + { + _textBox = null; + _richTextBoxTemp = new RichTextBox(); + _uiTextBox = new RichTextBox { BorderStyle = BorderStyle.None, Multiline = true }; + InitializeBackingControl(_uiTextBox); + + // avoid selection when centered and clicking to the left + _uiTextBox.MouseDown += (sender, args) => + { + var charIndex = _uiTextBox.GetCharIndexFromPosition(args.Location); + if (Configuration.Settings.General.CenterSubtitleInTextBox && + _mouseMoveSelectionLength == 0 && + (charIndex == 0 || charIndex >= 0 && _uiTextBox.Text[charIndex - 1] == '\n')) + { + _uiTextBox.SelectionLength = 0; + } + }; + _uiTextBox.MouseMove += (sender, args) => + { + _mouseMoveSelectionLength = _uiTextBox.SelectionLength; + }; + _uiTextBox.KeyDown += (sender, args) => + { + // fix annoying "beeps" when moving cursor position + if ((args.KeyData == Keys.Left || args.KeyData == Keys.PageUp) && _uiTextBox.SelectionStart == 0) + { + args.SuppressKeyPress = true; + } + else if (args.KeyData == Keys.Up && _uiTextBox.SelectionStart <= _uiTextBox.Text.IndexOf('\n')) + { + args.SuppressKeyPress = true; + } + else if (args.KeyData == Keys.Home && (_uiTextBox.SelectionStart == 0 || _uiTextBox.SelectionStart > 0 && _uiTextBox.Text[_uiTextBox.SelectionStart - 1] == '\n')) + { + args.SuppressKeyPress = true; + } + else if (args.KeyData == (Keys.Home | Keys.Control) && _uiTextBox.SelectionStart == 0) + { + args.SuppressKeyPress = true; + } + else if (args.KeyData == Keys.End && (_uiTextBox.SelectionStart >= _uiTextBox.Text.Length || _uiTextBox.SelectionStart + 1 < _uiTextBox.Text.Length && _uiTextBox.Text[_uiTextBox.SelectionStart] == '\n')) + { + args.SuppressKeyPress = true; + } + else if (args.KeyData == (Keys.End | Keys.Control) && _uiTextBox.SelectionStart >= _uiTextBox.Text.Length) + { + args.SuppressKeyPress = true; + } + else if (args.KeyData == Keys.Right && _uiTextBox.SelectionStart >= _uiTextBox.Text.Length) + { + args.SuppressKeyPress = true; + } + else if (args.KeyData == Keys.Down && _uiTextBox.SelectionStart >= _uiTextBox.Text.Length) + { + args.SuppressKeyPress = true; + } + else if (args.KeyData == Keys.PageDown && _uiTextBox.SelectionStart >= _uiTextBox.Text.Length) + { + args.SuppressKeyPress = true; + } + }; + } + else + { + _textBox = new TextBox { BorderStyle = BorderStyle.None, Multiline = true }; + InitializeBackingControl(_textBox); + } + + UpdateFontAndColors(); + if (oldContextMenuStrip != null) + { + ContextMenuStrip = oldContextMenuStrip; + } + + Enabled = oldEnabled; + } + + private void InitializeBackingControl(Control textBox) + { + textBox.AllowDrop = true; + textBox.DragEnter += SETextBox_DragEnter; + textBox.DragDrop += SETextBox_DragDrop; + textBox.GotFocus += (sender, args) => { _gotFocusTicks = DateTime.UtcNow.Ticks; }; + textBox.MouseDown += SETextBox_MouseDown; + textBox.MouseUp += SETextBox_MouseUp; + textBox.TextChanged += TextChangedHighlight; + Controls.Add(textBox); + textBox.Dock = DockStyle.Fill; + textBox.Enter += (sender, args) => { BackColor = SystemColors.Highlight; }; + textBox.Leave += (sender, args) => { BackColor = SystemColors.WindowFrame; }; + textBox.TextChanged += (sender, args) => { TextChanged?.Invoke(sender, args); }; + textBox.KeyDown += (sender, args) => { KeyDown?.Invoke(sender, args); }; + textBox.MouseClick += (sender, args) => { MouseClick?.Invoke(sender, args); }; + textBox.Enter += (sender, args) => { Enter?.Invoke(sender, args); }; + textBox.KeyUp += (sender, args) => { KeyUp?.Invoke(sender, args); }; + textBox.Leave += (sender, args) => { Leave?.Invoke(sender, args); }; + textBox.MouseMove += (sender, args) => { MouseMove?.Invoke(sender, args); }; + } + + private void UpdateFontAndColors() + { + UpdateFontAndColors(_uiTextBox); + UpdateFontAndColors(_richTextBoxTemp); + UpdateFontAndColors(_textBox); + } + + public void UpdateFontAndColors(Control textBox) + { + if (textBox == null) + { + return; + } + + var gs = Configuration.Settings.General; + if (string.IsNullOrEmpty(gs.SubtitleFontName)) + { + gs.SubtitleFontName = Font.Name; + } + + try + { + textBox.Font = gs.SubtitleTextBoxFontBold ? new Font(gs.SubtitleFontName, gs.SubtitleTextBoxFontSize, FontStyle.Bold) : new Font(gs.SubtitleFontName, gs.SubtitleTextBoxFontSize); + textBox.ForeColor = gs.SubtitleFontColor; + textBox.BackColor = gs.SubtitleBackgroundColor; + } + catch + { + // ignore + } + } + + private bool _fixedArabicComma; + public override string Text + { + get + { + if (_textBox != null) + { + return _textBox.Text; + } + + if (_uiTextBox == null) + { + return string.Empty; + } + + var s = _uiTextBox.Text; + if (_fixedArabicComma) + { + s = s.Replace("\u202A", string.Empty); + } + + return string.Join(Environment.NewLine, s.SplitToLines()); + } + set + { + if (_textBox != null) + { + _textBox.Text = value; + return; + } + + if (_uiTextBox == null) + { + return; + } + + _fixedArabicComma = false; + var s = value; + if (!Configuration.Settings.General.RightToLeftMode && !s.Contains('\u202A')) + { + string textNoTags = HtmlUtil.RemoveHtmlTags(s, true); + if (textNoTags.EndsWith('،')) + { + s = s.Replace("،", "\u202A،"); + } + else if (textNoTags.StartsWith('،')) + { + s = s.Replace("،", "،\u202A"); + } + + _fixedArabicComma = true; + } + + _uiTextBox.Text = string.Join("\n", s.SplitToLines()); + } + } + + public int SelectionStart + { + get + { + if (_textBox == null && _uiTextBox == null) + { + return 0; + } + + return _textBox?.SelectionStart ?? _uiTextBox.SelectionStart; + } + set + { + if (_textBox != null) + { + _textBox.SelectionStart = value; + } + else if (_uiTextBox != null) + { + _uiTextBox.SelectionStart = value; + } + } + } + + public int SelectionLength + { + get + { + if (_textBox == null && _uiTextBox == null) + { + return 0; + } + + return _textBox?.SelectionLength ?? _uiTextBox.SelectionLength; + } + set + { + if (_textBox != null) + { + _textBox.SelectionLength = value; + } + else if (_uiTextBox != null) + { + _uiTextBox.SelectionLength = value; + } + } + } + + public bool HideSelection + { + get + { + if (_textBox == null && _uiTextBox == null) + { + return false; + } + + return _textBox?.HideSelection ?? _uiTextBox.HideSelection; + } + set + { + if (_textBox != null) + { + _textBox.HideSelection = value; + } + else if (_uiTextBox != null) + { + _uiTextBox.HideSelection = value; + } + } + } + + public string SelectedText + { + get + { + if (_textBox == null && _uiTextBox == null) + { + return string.Empty; + } + + return _textBox?.SelectedText ?? _uiTextBox.SelectedText; + } + set + { + if (_textBox != null) + { + _textBox.SelectedText = value; + } + else if (_uiTextBox != null) + { + _uiTextBox.SelectedText = value; + } + } + } + + public bool Multiline + { + get + { + if (_textBox == null && _uiTextBox == null) + { + return false; + } + + return _textBox?.Multiline ?? _uiTextBox.Multiline; + } + set + { + if (_textBox != null) + { + _textBox.Multiline = value; + } + else if (_uiTextBox != null) + { + _uiTextBox.Multiline = value; + } + } + } + + public new bool Enabled + { + get + { + if (_textBox == null && _uiTextBox == null) + { + return true; + } + + return _textBox?.Enabled ?? _uiTextBox.Enabled; + } + set + { + if (_textBox != null) + { + _textBox.Enabled = value; + } + else if (_uiTextBox != null) + { + _uiTextBox.Enabled = value; + } + } + } + + public RichTextBoxScrollBars ScrollBars + { + get + { + if (_textBox == null && _uiTextBox == null) + { + return RichTextBoxScrollBars.None; + } + + if (_textBox != null) + { + if (_textBox.ScrollBars == System.Windows.Forms.ScrollBars.Both) + { + return RichTextBoxScrollBars.Both; + } + + if (_textBox.ScrollBars == System.Windows.Forms.ScrollBars.Horizontal) + { + return RichTextBoxScrollBars.Horizontal; + } + + if (_textBox.ScrollBars == System.Windows.Forms.ScrollBars.Vertical) + { + return RichTextBoxScrollBars.Vertical; + } + + return RichTextBoxScrollBars.None; + } + + return _uiTextBox.ScrollBars; + } + set + { + if (_textBox != null) + { + if (value == RichTextBoxScrollBars.Both || value == RichTextBoxScrollBars.ForcedBoth) + { + _textBox.ScrollBars = System.Windows.Forms.ScrollBars.Both; + } + else if (value == RichTextBoxScrollBars.Horizontal || value == RichTextBoxScrollBars.ForcedHorizontal) + { + _textBox.ScrollBars = System.Windows.Forms.ScrollBars.Horizontal; + } + else if (value == RichTextBoxScrollBars.Vertical || value == RichTextBoxScrollBars.ForcedVertical) + { + _textBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + } + + _textBox.ScrollBars = System.Windows.Forms.ScrollBars.None; + } + else if (_uiTextBox != null) + { + _uiTextBox.ScrollBars = value; + } + } + } + + public override ContextMenuStrip ContextMenuStrip + { + get + { + if (_textBox == null && _uiTextBox == null) + { + return null; + } + + return _textBox?.ContextMenuStrip ?? _uiTextBox.ContextMenuStrip; + } + set + { + if (_textBox != null) + { + _textBox.ContextMenuStrip = value; + return; + } + + if (_uiTextBox != null) + { + _uiTextBox.ContextMenuStrip = value; + } + } + } + + public int GetCharIndexFromPosition(Point pt) + { + if (_textBox != null) + { + return _textBox.GetCharIndexFromPosition(pt); + } + + if (_uiTextBox != null) + { + return _uiTextBox.GetCharIndexFromPosition(pt); + } + + return 0; + } + + public void SelectAll() + { + if (_textBox != null) + { + _textBox.SelectAll(); + } + else + { + _uiTextBox?.SelectAll(); + } + } + + public void Clear() + { + if (_textBox != null) + { + _textBox.Clear(); + } + else + { + _uiTextBox?.Clear(); + } + } + + public void Undo() + { + if (_textBox != null) + { + _textBox.Undo(); + } + else + { + _uiTextBox?.Undo(); + } + } + + public void ClearUndo() + { + if (_textBox != null) + { + _textBox.ClearUndo(); + } + else + { + _uiTextBox?.ClearUndo(); + } + } + + public void Copy() + { + if (_textBox != null) + { + _textBox.Copy(); + } + else + { + _uiTextBox?.Copy(); + } + } + + public void Cut() + { + if (_textBox != null) + { + _textBox.Cut(); + } + else + { + _uiTextBox?.Cut(); + } + } + + public void Paste() + { + if (_textBox != null) + { + _textBox.Paste(); + } + else + { + _uiTextBox?.Paste(); + } + } + + public override bool Focused + { + get + { + if (_textBox == null && _uiTextBox == null) + { + return false; + } + + return _textBox?.Focused ?? _uiTextBox.Focused; + } + } + + public new void Focus() + { + if (_textBox != null) + { + _textBox.Focus(); + } + else + { + _uiTextBox?.Focus(); + } + } + + private void SETextBox_MouseUp(object sender, MouseEventArgs e) + { + _dragRemoveOld = false; + _dragFromThis = false; + } + + private void SETextBox_MouseDown(object sender, MouseEventArgs e) + { + if (MouseButtons == MouseButtons.Left && !string.IsNullOrEmpty(_dragText)) + { + var pt = new Point(e.X, e.Y); + int index = GetCharIndexFromPosition(pt); + if (index >= _dragStartFrom && index <= _dragStartFrom + _dragText.Length) + { + // re-make selection + SelectionStart = _dragStartFrom; + SelectionLength = _dragText.Length; + + try + { + var dataObject = new DataObject(); + dataObject.SetText(_dragText, TextDataFormat.UnicodeText); + dataObject.SetText(_dragText, TextDataFormat.Text); + + _dragFromThis = true; + if (ModifierKeys == Keys.Control) + { + _dragRemoveOld = false; + DoDragDrop(dataObject, DragDropEffects.Copy); + } + else if (ModifierKeys == Keys.None) + { + _dragRemoveOld = true; + DoDragDrop(dataObject, DragDropEffects.Move); + } + } + catch + { + // ignored + } + } + } + } + + private void SETextBox_DragDrop(object sender, DragEventArgs e) + { + var pt = PointToClient(new Point(e.X, e.Y)); + int index = GetCharIndexFromPosition(pt); + + string newText; + if (e.Data.GetDataPresent(DataFormats.UnicodeText)) + { + newText = (string)e.Data.GetData(DataFormats.UnicodeText); + } + else + { + newText = (string)e.Data.GetData(DataFormats.Text); + } + + if (string.IsNullOrWhiteSpace(Text)) + { + Text = newText; + } + else + { + bool justAppend = index == Text.Length - 1 && index > 0; + const string expectedChars = ":;]<.!?؟"; + if (_dragFromThis) + { + _dragFromThis = false; + long milliseconds = (DateTime.UtcNow.Ticks - _dragStartTicks) / 10000; + if (milliseconds < 400) + { + SelectionLength = 0; + if (justAppend) + { + index++; + } + + SelectionStart = index; + return; // too fast - nobody can drag and drop this fast + } + + if (index >= _dragStartFrom && index <= _dragStartFrom + _dragText.Length) + { + return; // don't drop same text at same position + } + + if (_dragRemoveOld) + { + _dragRemoveOld = false; + Text = Text.Remove(_dragStartFrom, _dragText.Length); + + // fix spaces + if (_dragStartFrom == 0 && Text.Length > 0 && Text[0] == ' ') + { + Text = Text.Remove(0, 1); + index--; + } + else if (_dragStartFrom > 1 && Text.Length > _dragStartFrom + 1 && Text[_dragStartFrom] == ' ' && Text[_dragStartFrom - 1] == ' ') + { + Text = Text.Remove(_dragStartFrom, 1); + if (_dragStartFrom < index) + { + index--; + } + } + else if (_dragStartFrom > 0 && Text.Length > _dragStartFrom + 1 && Text[_dragStartFrom] == ' ' && expectedChars.Contains(Text[_dragStartFrom + 1])) + { + Text = Text.Remove(_dragStartFrom, 1); + if (_dragStartFrom < index) + { + index--; + } + } + + // fix index + if (index > _dragStartFrom) + { + index -= _dragText.Length; + } + + if (index < 0) + { + index = 0; + } + } + } + if (justAppend) + { + index = Text.Length; + Text += newText; + } + else + { + Text = Text.Insert(index, newText); + } + + // fix start spaces + int endIndex = index + newText.Length; + if (index > 0 && !newText.StartsWith(' ') && Text[index - 1] != ' ') + { + Text = Text.Insert(index, " "); + endIndex++; + } + else if (index > 0 && newText.StartsWith(' ') && Text[index - 1] == ' ') + { + Text = Text.Remove(index, 1); + endIndex--; + } + + // fix end spaces + if (endIndex < Text.Length && !newText.EndsWith(' ') && Text[endIndex] != ' ') + { + bool lastWord = expectedChars.Contains(Text[endIndex]); + if (!lastWord) + { + Text = Text.Insert(endIndex, " "); + } + } + else if (endIndex < Text.Length && newText.EndsWith(' ') && Text[endIndex] == ' ') + { + Text = Text.Remove(endIndex, 1); + } + + SelectionStart = index + 1; + UiUtil.SelectWordAtCaret(this); + } + + _dragRemoveOld = false; + _dragFromThis = false; + } + + private void SETextBox_DragEnter(object sender, DragEventArgs e) + { + if (e.Data.GetDataPresent(DataFormats.Text) || e.Data.GetDataPresent(DataFormats.UnicodeText)) + { + e.Effect = ModifierKeys == Keys.Control ? DragDropEffects.Copy : DragDropEffects.Move; + } + else + { + e.Effect = DragDropEffects.None; + } + } + + private const int WM_LBUTTONDOWN = 0x0201; + protected override void WndProc(ref Message m) + { + if (m.Msg == WM_LBUTTONDOWN) + { + long milliseconds = (DateTime.UtcNow.Ticks - _gotFocusTicks) / 10000; + if (milliseconds > 10) + { + _dragText = SelectedText; + _dragStartFrom = SelectionStart; + _dragStartTicks = DateTime.UtcNow.Ticks; + } + } + base.WndProc(ref m); + } + + public void HighlightHtmlText() + { + if (Configuration.Settings.General.RightToLeftMode) + { + if (RightToLeft != RightToLeft.Yes) + { + RightToLeft = RightToLeft.Yes; + } + } + else + { + if (RightToLeft != RightToLeft.No) + { + RightToLeft = RightToLeft.No; + } + } + + if (_textBox != null) + { + if (Configuration.Settings.General.CenterSubtitleInTextBox && + _textBox.TextAlign != HorizontalAlignment.Center) + { + _textBox.TextAlign = HorizontalAlignment.Center; + } + + return; + } + + _richTextBoxTemp.RightToLeft = RightToLeft; + + + var text = _uiTextBox.Text; + if (string.IsNullOrWhiteSpace(text) || text.Length > 1000) + { + if (Configuration.Settings.General.CenterSubtitleInTextBox) + { + SuspendLayout(); + _richTextBoxTemp.Text = text; + _richTextBoxTemp.SelectAll(); + _richTextBoxTemp.SelectionAlignment = HorizontalAlignment.Center; + + // fix cursor to start in middle (and not left) + _richTextBoxTemp.Rtf = _richTextBoxTemp.Rtf.Replace("\\pard\\par", "\\par"); + + ResumeLayout(false); + _uiTextBox.Rtf = _richTextBoxTemp.Rtf; + } + + return; + } + + _richTextBoxTemp.SuspendLayout(); + _richTextBoxTemp.Clear(); + _richTextBoxTemp.Text = text; + _richTextBoxTemp.SelectAll(); + _richTextBoxTemp.SelectionFont = _richTextBoxTemp.Font; + _richTextBoxTemp.SelectionColor = _richTextBoxTemp.ForeColor; + + bool htmlTagOn = false; + bool htmlTagFontOn = false; + int htmlTagStart = -1; + bool assaTagOn = false; + bool assaPrimaryColorTagOn = false; + bool assaSecondaryColorTagOn = false; + bool assaBorderColorTagOn = false; + bool assaShadowColorTagOn = false; + var assaTagStart = -1; + int tagOn = -1; + var textLength = text.Length; + int i = 0; + + while (i < textLength) + { + var ch = text[i]; + if (assaTagOn) + { + if (ch == '}' && tagOn >= 0) + { + assaTagOn = false; + _richTextBoxTemp.SelectionStart = assaTagStart; + _richTextBoxTemp.SelectionLength = i - assaTagStart + 1; + _richTextBoxTemp.SelectionColor = Configuration.Settings.General.SubtitleTextBoxAssColor; + if (assaTagStart >= 0) + { + if (assaPrimaryColorTagOn) + { + string colorTag = text.IndexOf("\\c", assaTagStart, StringComparison.OrdinalIgnoreCase) != -1 ? "\\c" : "\\1c"; + + SetAssaColor(text, assaTagStart, colorTag); + assaPrimaryColorTagOn = false; + } + + if (assaSecondaryColorTagOn) + { + SetAssaColor(text, assaTagStart, "\\2c"); + assaSecondaryColorTagOn = false; + } + + if (assaBorderColorTagOn) + { + SetAssaColor(text, assaTagStart, "\\3c"); + assaBorderColorTagOn = false; + } + + if (assaShadowColorTagOn) + { + SetAssaColor(text, assaTagStart, "\\4c"); + assaShadowColorTagOn = false; + } + } + + assaTagStart = -1; + } + } + else if (htmlTagOn) + { + if (ch == '>' && tagOn >= 0) + { + htmlTagOn = false; + _richTextBoxTemp.SelectionStart = htmlTagStart; + _richTextBoxTemp.SelectionLength = i - htmlTagStart + 1; + _richTextBoxTemp.SelectionColor = Configuration.Settings.General.SubtitleTextBoxHtmlColor; + if (htmlTagFontOn && htmlTagStart >= 0) + { + SetHtmlColor(text, htmlTagStart); + htmlTagFontOn = false; + } + htmlTagStart = -1; + } + } + else if (ch == '{' && i < textLength - 1 && text[i + 1] == '\\' && text.IndexOf('}', i) > 0) + { + var s = text.Substring(i); + assaTagOn = true; + tagOn = i; + assaTagStart = i; + assaPrimaryColorTagOn = s.Contains("\\c", StringComparison.OrdinalIgnoreCase) || s.Contains("\\1c", StringComparison.OrdinalIgnoreCase); + assaSecondaryColorTagOn = s.Contains("\\2c", StringComparison.OrdinalIgnoreCase); + assaBorderColorTagOn = s.Contains("\\3c", StringComparison.OrdinalIgnoreCase); + assaShadowColorTagOn = s.Contains("\\4c", StringComparison.OrdinalIgnoreCase); + } + else if (ch == '<') + { + var s = text.Substring(i); + if (s.StartsWith("", StringComparison.OrdinalIgnoreCase) || + s.StartsWith("", StringComparison.OrdinalIgnoreCase) || + s.StartsWith("", StringComparison.OrdinalIgnoreCase) || + s.StartsWith("", StringComparison.OrdinalIgnoreCase) || + s.StartsWith("", StringComparison.OrdinalIgnoreCase) || + s.StartsWith("", StringComparison.OrdinalIgnoreCase) || + s.StartsWith("", StringComparison.OrdinalIgnoreCase) || + s.StartsWith("", StringComparison.OrdinalIgnoreCase) || + s.StartsWith("", StringComparison.OrdinalIgnoreCase) || + (s.StartsWith("", i, StringComparison.OrdinalIgnoreCase) > 0)) + { + htmlTagOn = true; + htmlTagStart = i; + htmlTagFontOn = s.StartsWith(" 0) + { + var color = text.Substring(colorStart, colorEnd - colorStart); + try + { + Color c; + if (color.StartsWith("rgb(", StringComparison.Ordinal)) + { + string[] arr = color.Remove(0, 4).TrimEnd(')').Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + c = Color.FromArgb(int.Parse(arr[0]), int.Parse(arr[1]), int.Parse(arr[2])); + } + else + { + c = ColorTranslator.FromHtml(color); + } + + SetForeColorAndChangeBackColorIfClose(colorStart, colorEnd, c); + } + catch + { + // ignored + } + } + } + } + + private void SetForeColorAndChangeBackColorIfClose(int colorStart, int colorEnd, Color c) + { + _richTextBoxTemp.SelectionStart = colorStart; + _richTextBoxTemp.SelectionLength = colorEnd - colorStart; + _richTextBoxTemp.SelectionColor = c; + + var diff = Math.Abs(c.R - BackColor.R) + Math.Abs(c.G - BackColor.G) + Math.Abs(c.B - BackColor.B); + if (diff < 60) + { + _richTextBoxTemp.SelectionBackColor = Color.FromArgb(byte.MaxValue - c.R, byte.MaxValue - c.G, byte.MaxValue - c.B, byte.MaxValue - c.R); + } + } + + private void TextChangedHighlight(object sender, EventArgs e) + { + if (_checkRtfChange) + { + _checkRtfChange = false; + HighlightHtmlText(); + _checkRtfChange = true; + } + } + + private void SetAssaColor(string text, int assaTagStart, string colorTag) + { + int colorStart = text.IndexOf(colorTag, assaTagStart, StringComparison.OrdinalIgnoreCase); + if (colorStart > 0) + { + colorStart += colorTag.Length; + if (text[colorStart] == '&') + { + colorStart++; + } + + int colorEnd = text.IndexOf('&', colorStart + 1); + if (colorEnd > 0) + { + var color = text.Substring(colorStart, colorEnd - colorStart); + try + { + if (color.Length == 7) + { + var rgbColor = string.Concat("#", color[5], color[6], color[3], color[4], color[1], color[2]); + var c = ColorTranslator.FromHtml(rgbColor); + SetForeColorAndChangeBackColorIfClose(colorStart, colorEnd, c); + } + } + catch + { + // ignored + } + } + } + } + } +} diff --git a/src/Controls/SubtitleListView.cs b/src/ui/Controls/SubtitleListView.cs similarity index 97% rename from src/Controls/SubtitleListView.cs rename to src/ui/Controls/SubtitleListView.cs index 7e881ae46..6d9a3d58d 100644 --- a/src/Controls/SubtitleListView.cs +++ b/src/ui/Controls/SubtitleListView.cs @@ -1,2077 +1,2077 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Globalization; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Controls -{ - public sealed class SubtitleListView : ListView - { - public enum SubtitleColumn - { - Number, - Start, - End, - Duration, - CharactersPerSeconds, - WordsPerMinute, - Gap, - Actor, - Region, - Text, - TextAlternate, - Extra, - Network - } - - private List SubtitleColumns { get; } - - public int GetColumnIndex(SubtitleColumn column) - { - return SubtitleColumns.IndexOf(column); - } - - public int ColumnIndexNumber { get; private set; } - public int ColumnIndexStart { get; private set; } - public int ColumnIndexEnd { get; private set; } - public int ColumnIndexDuration { get; private set; } - public int ColumnIndexWpm { get; private set; } - public int ColumnIndexCps { get; private set; } - public int ColumnIndexGap { get; private set; } - public int ColumnIndexActor { get; private set; } - public int ColumnIndexRegion { get; private set; } - public int ColumnIndexText { get; private set; } - public int ColumnIndexTextAlternate { get; private set; } - public int ColumnIndexExtra { get; private set; } - public int ColumnIndexNetwork { get; private set; } - - public bool IsAlternateTextColumnVisible => ColumnIndexTextAlternate >= 0; - private string _lineSeparatorString = " || "; - - private Font _subtitleFont = new Font("Tahoma", 8.25F); - - private string _subtitleFontName = "Tahoma"; - - public override bool RightToLeftLayout - { - get => base.RightToLeftLayout; - set - { - var hzAlignment = value ? HorizontalAlignment.Left : HorizontalAlignment.Right; - if (ColumnIndexCps >= 0) - { - Columns[ColumnIndexCps].TextAlign = hzAlignment; - } - - if (ColumnIndexWpm >= 0) - { - Columns[ColumnIndexWpm].TextAlign = hzAlignment; - } - - base.RightToLeftLayout = value; - } - } - - public string SubtitleFontName - { - get => _subtitleFontName; - set - { - _subtitleFontName = value; - _subtitleFont = new Font(_subtitleFontName, SubtitleFontSize, GetFontStyle()); - } - } - - private bool _subtitleFontBold; - - public bool SubtitleFontBold - { - get { return _subtitleFontBold; } - set - { - _subtitleFontBold = value; - _subtitleFont = new Font(_subtitleFontName, SubtitleFontSize, GetFontStyle()); - } - } - - private int _subtitleFontSize = 8; - - public int SubtitleFontSize - { - get => _subtitleFontSize; - set - { - _subtitleFontSize = value; - _subtitleFont = new Font(_subtitleFontName, SubtitleFontSize, GetFontStyle()); - } - } - - public bool UseSyntaxColoring { get; set; } - private Settings _settings; - private bool _saveColumnWidthChanges; - - public int FirstVisibleIndex { get; set; } = -1; - - public void InitializeLanguage(LanguageStructure.General general, Settings settings) - { - int idx = GetColumnIndex(SubtitleColumn.Number); - if (idx >= 0) - { - Columns[idx].Text = general.NumberSymbol; - } - - idx = GetColumnIndex(SubtitleColumn.Start); - if (idx >= 0) - { - Columns[idx].Text = general.StartTime; - } - - idx = GetColumnIndex(SubtitleColumn.End); - if (idx >= 0) - { - Columns[idx].Text = general.EndTime; - } - - idx = GetColumnIndex(SubtitleColumn.Duration); - if (idx >= 0) - { - Columns[idx].Text = general.Duration; - } - - idx = GetColumnIndex(SubtitleColumn.CharactersPerSeconds); - if (idx >= 0) - { - Columns[idx].Text = general.CharsPerSec; - } - - idx = GetColumnIndex(SubtitleColumn.WordsPerMinute); - if (idx >= 0) - { - Columns[idx].Text = general.WordsPerMin; - } - - idx = GetColumnIndex(SubtitleColumn.Gap); - if (idx >= 0) - { - Columns[idx].Text = general.Gap; - } - - idx = GetColumnIndex(SubtitleColumn.Actor); - if (idx >= 0) - { - Columns[idx].Text = general.Actor; - } - - idx = GetColumnIndex(SubtitleColumn.Region); - if (idx >= 0) - { - Columns[idx].Text = general.Region; - } - - idx = GetColumnIndex(SubtitleColumn.Text); - if (idx >= 0) - { - Columns[idx].Text = general.Text; - } - - if (settings.General.ListViewLineSeparatorString != null) - { - _lineSeparatorString = settings.General.ListViewLineSeparatorString; - } - - if (!string.IsNullOrEmpty(settings.General.SubtitleFontName)) - { - _subtitleFontName = settings.General.SubtitleFontName; - } - - SubtitleFontBold = settings.General.SubtitleListViewFontBold; - if (settings.General.SubtitleListViewFontSize > 6 && settings.General.SubtitleListViewFontSize < 72) - { - SubtitleFontSize = settings.General.SubtitleListViewFontSize; - } - - ForeColor = settings.General.SubtitleFontColor; - BackColor = settings.General.SubtitleBackgroundColor; - _settings = settings; - } - - public void InitializeTimestampColumnWidths(Control parentForm) - { - if (_settings != null && _settings.General.ListViewColumnsRememberSize && _settings.General.ListViewNumberWidth > 1 && - _settings.General.ListViewStartWidth > 1 && _settings.General.ListViewEndWidth > 1 && _settings.General.ListViewDurationWidth > 1) - { - int idx = GetColumnIndex(SubtitleColumn.Number); - if (idx >= 0) - { - Columns[idx].Width = Configuration.Settings.General.ListViewNumberWidth; - } - - idx = GetColumnIndex(SubtitleColumn.Start); - if (idx >= 0) - { - Columns[idx].Width = _settings.General.ListViewStartWidth; - } - - idx = GetColumnIndex(SubtitleColumn.End); - if (idx >= 0) - { - Columns[idx].Width = _settings.General.ListViewEndWidth; - } - - idx = GetColumnIndex(SubtitleColumn.Duration); - if (idx >= 0) - { - Columns[idx].Width = _settings.General.ListViewDurationWidth; - } - - idx = GetColumnIndex(SubtitleColumn.CharactersPerSeconds); - if (idx >= 0) - { - Columns[idx].Width = _settings.General.ListViewCpsWidth; - } - - idx = GetColumnIndex(SubtitleColumn.WordsPerMinute); - if (idx >= 0) - { - Columns[idx].Width = _settings.General.ListViewWpmWidth; - } - - idx = GetColumnIndex(SubtitleColumn.Gap); - if (idx >= 0) - { - Columns[idx].Width = _settings.General.ListViewGapWidth; - } - - idx = GetColumnIndex(SubtitleColumn.Actor); - if (idx >= 0) - { - Columns[idx].Width = _settings.General.ListViewActorWidth; - } - - idx = GetColumnIndex(SubtitleColumn.Region); - if (idx >= 0) - { - Columns[idx].Width = _settings.General.ListViewRegionWidth; - } - - idx = GetColumnIndex(SubtitleColumn.Text); - if (idx >= 0) - { - Columns[idx].Width = _settings.General.ListViewTextWidth; - } - - _saveColumnWidthChanges = true; - } - else if (parentForm != null) - { - using (var graphics = parentForm.CreateGraphics()) - { - var timestampSizeF = graphics.MeasureString(new TimeCode(0, 0, 33, 527).ToDisplayString(), Font); - var timestampWidth = (int)(timestampSizeF.Width + 0.5) + 11; - - var idx = GetColumnIndex(SubtitleColumn.Start); - if (idx >= 0) - { - Columns[idx].Width = timestampWidth; - } - - idx = GetColumnIndex(SubtitleColumn.End); - if (idx >= 0) - { - Columns[idx].Width = timestampWidth; - } - - idx = GetColumnIndex(SubtitleColumn.Duration); - if (idx >= 0) - { - Columns[idx].Width = (int)(timestampWidth * 0.8); - } - } - } - - SubtitleListViewLastColumnFill(this, null); - } - - public SubtitleListView() - { - DoubleBuffered = true; - UseSyntaxColoring = true; - Font = new Font("Tahoma", 8.25F, FontStyle.Regular, GraphicsUnit.Point, 0); - AllowColumnReorder = true; - HeaderStyle = ColumnHeaderStyle.Nonclickable; - - ColumnIndexNumber = -1; - ColumnIndexStart = -1; - ColumnIndexEnd = -1; - ColumnIndexDuration = -1; - ColumnIndexWpm = -1; - ColumnIndexCps = -1; - ColumnIndexGap = -1; - ColumnIndexActor = -1; - ColumnIndexRegion = -1; - ColumnIndexText = -1; - ColumnIndexTextAlternate = -1; - ColumnIndexExtra = -1; - ColumnIndexNetwork = -1; - - SubtitleColumns = new List - { - SubtitleColumn.Number, - SubtitleColumn.Start, - SubtitleColumn.End, - SubtitleColumn.Duration, - SubtitleColumn.Text - }; - UpdateColumnIndexes(); - - foreach (var c in SubtitleColumns) - { - switch (c) - { - case SubtitleColumn.Number: - Columns.Add(new ColumnHeader { Width = 50 }); - break; - case SubtitleColumn.Start: - Columns.Add(new ColumnHeader { Width = 80 }); - break; - case SubtitleColumn.End: - Columns.Add(new ColumnHeader { Width = 80 }); - break; - case SubtitleColumn.Duration: - Columns.Add(new ColumnHeader { Width = 55 }); - break; - case SubtitleColumn.CharactersPerSeconds: - Columns.Add(new ColumnHeader { Width = 60 }); - break; - case SubtitleColumn.WordsPerMinute: - Columns.Add(new ColumnHeader { Width = 65 }); - break; - case SubtitleColumn.Gap: - Columns.Add(new ColumnHeader { Width = 60 }); - break; - case SubtitleColumn.Actor: - Columns.Add(new ColumnHeader { Width = 80 }); - break; - case SubtitleColumn.Region: - Columns.Add(new ColumnHeader { Width = 60 }); - break; - case SubtitleColumn.Text: - Columns.Add(new ColumnHeader { Width = 300 }); - break; - } - } - - if (Configuration.Settings != null && !Configuration.Settings.Tools.ListViewShowColumnEndTime) - { - HideColumn(SubtitleColumn.End); - } - - if (Configuration.Settings != null && !Configuration.Settings.Tools.ListViewShowColumnDuration) - { - HideColumn(SubtitleColumn.Duration); - } - - if (Configuration.Settings != null && Configuration.Settings.Tools.ListViewShowColumnCharsPerSec) - { - ShowCharsSecColumn(Configuration.Settings.Language.General.CharsPerSec); - } - - if (Configuration.Settings != null && Configuration.Settings.Tools.ListViewShowColumnWordsPerMin) - { - ShowWordsMinColumn(Configuration.Settings.Language.General.WordsPerMin); - } - - if (Configuration.Settings != null && Configuration.Settings.Tools.ListViewShowColumnGap) - { - ShowGapColumn(Configuration.Settings.Language.General.Gap); - } - - SubtitleListViewLastColumnFill(this, null); - - FullRowSelect = true; - View = View.Details; - Resize += SubtitleListViewLastColumnFill; - GridLines = true; - ColumnWidthChanged += SubtitleListViewColumnWidthChanged; - OwnerDraw = true; - DrawItem += SubtitleListView_DrawItem; - DrawSubItem += SubtitleListView_DrawSubItem; - DrawColumnHeader += SubtitleListView_DrawColumnHeader; - } - - private void UpdateColumnIndexes() - { - ColumnIndexNumber = GetColumnIndex(SubtitleColumn.Number); - ColumnIndexStart = GetColumnIndex(SubtitleColumn.Start); - ColumnIndexEnd = GetColumnIndex(SubtitleColumn.End); - ColumnIndexDuration = GetColumnIndex(SubtitleColumn.Duration); - ColumnIndexCps = GetColumnIndex(SubtitleColumn.CharactersPerSeconds); - ColumnIndexWpm = GetColumnIndex(SubtitleColumn.WordsPerMinute); - ColumnIndexGap = GetColumnIndex(SubtitleColumn.Gap); - ColumnIndexActor = GetColumnIndex(SubtitleColumn.Actor); - ColumnIndexRegion = GetColumnIndex(SubtitleColumn.Region); - ColumnIndexText = GetColumnIndex(SubtitleColumn.Text); - ColumnIndexTextAlternate = GetColumnIndex(SubtitleColumn.TextAlternate); - ColumnIndexExtra = GetColumnIndex(SubtitleColumn.Extra); - ColumnIndexNetwork = GetColumnIndex(SubtitleColumn.Network); - } - - private void SubtitleListView_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e) - { - e.DrawDefault = true; - } - - private void SubtitleListView_DrawSubItem(object sender, DrawListViewSubItemEventArgs e) - { - Color backgroundColor = Items[e.ItemIndex].SubItems[e.ColumnIndex].BackColor; - if (Focused && backgroundColor == BackColor || RightToLeftLayout) - { - e.DrawDefault = true; - return; - } - - using (var sf = new StringFormat()) - { - switch (e.Header.TextAlign) - { - case HorizontalAlignment.Center: - sf.Alignment = StringAlignment.Center; - break; - case HorizontalAlignment.Right: - sf.Alignment = StringAlignment.Far; - break; - } - - if (e.Item.Selected) - { - - Rectangle rect = e.Bounds; - if (Configuration.Settings != null) - { - backgroundColor = backgroundColor == BackColor ? Configuration.Settings.Tools.ListViewUnfocusedSelectedColor : GetCustomColor(backgroundColor); - var sb = new SolidBrush(backgroundColor); - e.Graphics.FillRectangle(sb, rect); - } - else - { - e.Graphics.FillRectangle(Brushes.LightBlue, rect); - } - - int addX = 0; - - if (e.ColumnIndex == 0 && StateImageList?.Images.Count > 0) - { - addX = 18; - } - - if (e.ColumnIndex == 0 && e.Item.StateImageIndex >= 0 && StateImageList?.Images.Count > e.Item.StateImageIndex) - { - e.Graphics.DrawImage(StateImageList.Images[e.Item.StateImageIndex], new Rectangle(rect.X + 4, rect.Y + 2, 16, 16)); - } - - if (Columns[e.ColumnIndex].TextAlign == HorizontalAlignment.Right) - { - var stringWidth = (int)e.Graphics.MeasureString(e.Item.SubItems[e.ColumnIndex].Text, _subtitleFont).Width; - TextRenderer.DrawText(e.Graphics, e.Item.SubItems[e.ColumnIndex].Text, _subtitleFont, new Point(e.Bounds.Right - stringWidth - 7, e.Bounds.Top + 2), e.Item.ForeColor, TextFormatFlags.NoPrefix); - } - else - { - TextRenderer.DrawText(e.Graphics, e.Item.SubItems[e.ColumnIndex].Text, _subtitleFont, new Point(e.Bounds.Left + 3 + addX, e.Bounds.Top + 2), e.Item.ForeColor, TextFormatFlags.NoPrefix); - } - } - else - { - e.DrawDefault = true; - } - } - } - - private static Color GetCustomColor(Color color) - { - int r = Math.Max(color.R - 39, 0); - int g = Math.Max(color.G - 39, 0); - int b = Math.Max(color.B - 39, 0); - return Color.FromArgb(color.A, r, g, b); - } - - private void SubtitleListView_DrawItem(object sender, DrawListViewItemEventArgs e) - { - if (!Focused && (e.State & ListViewItemStates.Selected) != 0) - { - if (e.Item.Focused) - { - e.DrawFocusRectangle(); - } - } - else - { - e.DrawDefault = true; - } - } - - private void SubtitleListViewColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e) - { - if (_settings != null && _saveColumnWidthChanges) - { - if (e.ColumnIndex == ColumnIndexNumber) - { - Configuration.Settings.General.ListViewNumberWidth = Columns[ColumnIndexNumber].Width; - } - else if (e.ColumnIndex == ColumnIndexStart) - { - Configuration.Settings.General.ListViewStartWidth = Columns[ColumnIndexStart].Width; - } - else if (e.ColumnIndex == ColumnIndexEnd) - { - Configuration.Settings.General.ListViewEndWidth = Columns[ColumnIndexEnd].Width; - } - else if (e.ColumnIndex == ColumnIndexDuration) - { - Configuration.Settings.General.ListViewDurationWidth = Columns[ColumnIndexDuration].Width; - } - else if (e.ColumnIndex == ColumnIndexCps) - { - Configuration.Settings.General.ListViewCpsWidth = Columns[ColumnIndexCps].Width; - } - else if (e.ColumnIndex == ColumnIndexWpm) - { - Configuration.Settings.General.ListViewWpmWidth = Columns[ColumnIndexWpm].Width; - } - else if (e.ColumnIndex == ColumnIndexGap) - { - Configuration.Settings.General.ListViewGapWidth = Columns[ColumnIndexGap].Width; - } - else if (e.ColumnIndex == ColumnIndexActor) - { - Configuration.Settings.General.ListViewActorWidth = Columns[ColumnIndexActor].Width; - } - else if (e.ColumnIndex == ColumnIndexRegion) - { - Configuration.Settings.General.ListViewRegionWidth = Columns[ColumnIndexRegion].Width; - } - if (e.ColumnIndex == ColumnIndexText) - { - Configuration.Settings.General.ListViewTextWidth = Columns[ColumnIndexText].Width; - } - } - } - - public void AutoSizeColumns() - { - var numberIdx = GetColumnIndex(SubtitleColumn.Number); - if (numberIdx >= 0) - { - Columns[numberIdx].Width = 50; - Columns[numberIdx].Width = 50; - } - - var startIdx = GetColumnIndex(SubtitleColumn.Start); - var endIdx = GetColumnIndex(SubtitleColumn.End); - var durationIdx = GetColumnIndex(SubtitleColumn.Duration); - int timeStampWidth; - try - { - using (var graphics = CreateGraphics()) - { - var timestampSizeF = graphics.MeasureString(new TimeCode(0, 0, 33, 527).ToDisplayString(), Font); - timeStampWidth = (int)(timestampSizeF.Width + 0.5) + 11; - } - } - catch - { - timeStampWidth = 65; - } - if (startIdx >= 0) - { - Columns[startIdx].Width = timeStampWidth; - } - if (endIdx >= 0) - { - Columns[endIdx].Width = timeStampWidth; - } - if (durationIdx >= 0) - { - Columns[durationIdx].Width = (int)(timeStampWidth * 0.8); - } - - var cpsIdx = GetColumnIndex(SubtitleColumn.CharactersPerSeconds); - if (cpsIdx >= 0) - { - Columns[cpsIdx].Width = 60; - Columns[cpsIdx].Width = 60; - } - - var wpmIdx = GetColumnIndex(SubtitleColumn.WordsPerMinute); - if (wpmIdx >= 0) - { - Columns[wpmIdx].Width = 65; - Columns[wpmIdx].Width = 65; - } - - var gapIdx = GetColumnIndex(SubtitleColumn.Gap); - if (gapIdx >= 0) - { - Columns[gapIdx].Width = 60; - Columns[gapIdx].Width = 60; - } - - var actorIdx = GetColumnIndex(SubtitleColumn.Actor); - if (actorIdx >= 0) - { - Columns[actorIdx].Width = 80; - Columns[actorIdx].Width = 80; - } - - var regionIdx = GetColumnIndex(SubtitleColumn.Region); - if (regionIdx >= 0) - { - Columns[regionIdx].Width = 60; - Columns[regionIdx].Width = 60; - } - - int w = 0; - for (int index = 0; index < SubtitleColumns.Count; index++) - { - var column = SubtitleColumns[index]; - int cw = Columns[index].Width; - if (column != SubtitleColumn.Text && column != SubtitleColumn.TextAlternate) - { - w += cw; - } - } - int lengthAvailable = Width - w; - if (ColumnIndexTextAlternate >= 0) - { - lengthAvailable = lengthAvailable / 2; - Columns[ColumnIndexTextAlternate].Width = lengthAvailable; - Columns[ColumnIndexTextAlternate].Width = lengthAvailable; - Columns[ColumnIndexTextAlternate].Width = lengthAvailable; - } - Columns[ColumnIndexText].Width = lengthAvailable; - Columns[ColumnIndexText].Width = lengthAvailable; - Columns[ColumnIndexText].Width = lengthAvailable; - SubtitleListViewLastColumnFill(this, null); - } - - public void AutoSizeAllColumns(Form parentForm) - { - InitializeTimestampColumnWidths(parentForm); - - var numberIdx = GetColumnIndex(SubtitleColumn.Number); - if (numberIdx >= 0) - { - if (_settings != null && _settings.General.ListViewColumnsRememberSize && _settings.General.ListViewNumberWidth > 1) - { - Columns[numberIdx].Width = _settings.General.ListViewNumberWidth; - } - else - { - Columns[numberIdx].Width = 50; - } - } - - var startIdx = GetColumnIndex(SubtitleColumn.Start); - var endIdx = GetColumnIndex(SubtitleColumn.End); - int timeStampWidth; - try - { - using (var graphics = CreateGraphics()) - { - var timestampSizeF = graphics.MeasureString(new TimeCode(0, 0, 33, 527).ToDisplayString(), Font); - timeStampWidth = (int)(timestampSizeF.Width + 0.5) + 11; - } - } - catch - { - timeStampWidth = 65; - } - if (startIdx >= 0) - { - if (_settings != null && _settings.General.ListViewColumnsRememberSize && _settings.General.ListViewStartWidth > 1) - { - Columns[startIdx].Width = _settings.General.ListViewStartWidth; - } - else - { - Columns[startIdx].Width = timeStampWidth; - } - } - if (endIdx >= 0) - { - if (_settings != null && _settings.General.ListViewColumnsRememberSize && _settings.General.ListViewEndWidth > 1) - { - Columns[endIdx].Width = _settings.General.ListViewEndWidth; - } - else - { - Columns[endIdx].Width = timeStampWidth; - } - } - - int w = 0; - for (int index = 0; index < SubtitleColumns.Count; index++) - { - var column = SubtitleColumns[index]; - int cw = Columns[index].Width; - if (cw < 10 || column == SubtitleColumn.Extra || column == SubtitleColumn.Network) - { - cw = 55; - if (column == SubtitleColumn.CharactersPerSeconds) - { - cw = 65; - } - else if (column == SubtitleColumn.WordsPerMinute) - { - cw = 70; - } - else if (column == SubtitleColumn.Gap) - { - cw = 60; - } - else if (column == SubtitleColumn.Actor) - { - cw = 70; - } - else if (column == SubtitleColumn.Region) - { - cw = 60; - } - else if (column != SubtitleColumn.Number) - { - cw = 120; - } - - Columns[index].Width = cw; - Columns[index].Width = cw; - Columns[index].Width = cw; - } - if (column != SubtitleColumn.Text && column != SubtitleColumn.TextAlternate) - { - w += cw; - } - } - - int lengthAvailable = Width - w; - if (ColumnIndexTextAlternate >= 0 && Columns.Count > ColumnIndexTextAlternate) - { - lengthAvailable = lengthAvailable / 2; - Columns[ColumnIndexTextAlternate].Width = lengthAvailable; - Columns[ColumnIndexTextAlternate].Width = lengthAvailable; - Columns[ColumnIndexTextAlternate].Width = lengthAvailable; - } - Columns[ColumnIndexText].Width = lengthAvailable; - Columns[ColumnIndexText].Width = lengthAvailable; - Columns[ColumnIndexText].Width = lengthAvailable; - SubtitleListViewLastColumnFill(this, null); - } - - public void ShowEndColumn(string title) - { - if (GetColumnIndex(SubtitleColumn.End) == -1) - { - var ch = new ColumnHeader { Text = title, TextAlign = RightToLeftLayout ? HorizontalAlignment.Right : HorizontalAlignment.Left }; - if (ColumnIndexStart >= 0) - { - SubtitleColumns.Insert(ColumnIndexStart + 1, SubtitleColumn.End); - Columns.Insert(ColumnIndexStart + 1, ch); - } - else if (ColumnIndexNumber >= 0) - { - SubtitleColumns.Insert(ColumnIndexNumber + 1, SubtitleColumn.End); - Columns.Insert(ColumnIndexStart + 1, ch); - } - else - { - SubtitleColumns.Add(SubtitleColumn.End); - Columns.Insert(0, ch); - } - UpdateColumnIndexes(); - - try - { - using (var graphics = Parent.CreateGraphics()) - { - var timestampSizeF = graphics.MeasureString(new TimeCode(0, 0, 33, 527).ToDisplayString(), Font); - var timestampWidth = (int)(timestampSizeF.Width + 0.5) + 11; - Columns[ColumnIndexEnd].Width = timestampWidth; - } - } - catch - { - Columns[ColumnIndexEnd].Width = 65; - } - - AutoSizeAllColumns(null); - } - } - - public void ShowDurationColumn(string title) - { - if (GetColumnIndex(SubtitleColumn.Duration) == -1) - { - var ch = new ColumnHeader { Text = title, TextAlign = RightToLeftLayout ? HorizontalAlignment.Right : HorizontalAlignment.Left }; - if (ColumnIndexEnd >= 0) - { - SubtitleColumns.Insert(ColumnIndexEnd + 1, SubtitleColumn.Duration); - Columns.Insert(ColumnIndexEnd + 1, ch); - } - else if (ColumnIndexStart >= 0) - { - SubtitleColumns.Insert(ColumnIndexStart + 1, SubtitleColumn.Duration); - Columns.Insert(ColumnIndexStart + 1, ch); - } - else if (ColumnIndexNumber >= 0) - { - SubtitleColumns.Insert(ColumnIndexNumber + 1, SubtitleColumn.Duration); - Columns.Insert(ColumnIndexStart + 1, ch); - } - else - { - SubtitleColumns.Add(SubtitleColumn.Duration); - Columns.Insert(0, ch); - } - UpdateColumnIndexes(); - - try - { - using (var graphics = Parent.CreateGraphics()) - { - var timestampSizeF = graphics.MeasureString(new TimeCode(0, 0, 33, 527).ToDisplayString(), Font); - var timestampWidth = (int)(timestampSizeF.Width + 0.5) + 11; - Columns[ColumnIndexDuration].Width = (int)(timestampWidth * 0.8); - } - } - catch - { - Columns[ColumnIndexDuration].Width = 55; - } - - AutoSizeAllColumns(null); - } - } - - public void ShowAlternateTextColumn(string title) - { - if (GetColumnIndex(SubtitleColumn.TextAlternate) == -1) - { - if (ColumnIndexText >= 0) - { - SubtitleColumns.Insert(ColumnIndexText + 1, SubtitleColumn.TextAlternate); - Columns.Insert(ColumnIndexText + 1, new ColumnHeader { Text = title }); - } - else - { - SubtitleColumns.Add(SubtitleColumn.TextAlternate); - Columns.Add(new ColumnHeader { Text = title }); - } - UpdateColumnIndexes(); - Columns[ColumnIndexTextAlternate].Width = 300; - Columns[ColumnIndexTextAlternate].Width = 300; - Columns[ColumnIndexTextAlternate].Width = 300; - AutoSizeAllColumns(null); - } - else - { - Columns[ColumnIndexTextAlternate].Text = title; - } - } - - public void ShowExtraColumn(string title) - { - if (GetColumnIndex(SubtitleColumn.Extra) == -1) - { - if (ColumnIndexNetwork >= 0) - { - SubtitleColumns.Insert(ColumnIndexNetwork, SubtitleColumn.Extra); - Columns.Insert(ColumnIndexNetwork, new ColumnHeader { Text = title, Width = 120 }); - } - else - { - SubtitleColumns.Add(SubtitleColumn.Extra); - Columns.Add(new ColumnHeader { Text = title, Width = 120 }); - } - UpdateColumnIndexes(); - Columns[ColumnIndexExtra].Width = 120; - Columns[ColumnIndexExtra].Width = 120; - Columns[ColumnIndexExtra].Width = 120; - AutoSizeAllColumns(null); - } - else - { - Columns[ColumnIndexExtra].Text = title; - } - } - - public void ShowNetworkColumn(string title) - { - if (GetColumnIndex(SubtitleColumn.Network) == -1) - { - SubtitleColumns.Add(SubtitleColumn.Network); - Columns.Add(new ColumnHeader { Text = title, Width = 120 }); - UpdateColumnIndexes(); - AutoSizeAllColumns(null); - } - } - - public void ShowCharsSecColumn(string title) - { - if (GetColumnIndex(SubtitleColumn.CharactersPerSeconds) == -1) - { - var ch = new ColumnHeader { Text = title, TextAlign = RightToLeftLayout ? HorizontalAlignment.Left : HorizontalAlignment.Right }; - if (ColumnIndexDuration >= 0) - { - SubtitleColumns.Insert(ColumnIndexDuration + 1, SubtitleColumn.CharactersPerSeconds); - Columns.Insert(ColumnIndexDuration + 1, ch); - } - else if (ColumnIndexEnd >= 0) - { - SubtitleColumns.Insert(ColumnIndexEnd + 1, SubtitleColumn.CharactersPerSeconds); - Columns.Insert(ColumnIndexEnd + 1, ch); - } - else if (ColumnIndexStart >= 0) - { - SubtitleColumns.Insert(ColumnIndexStart + 1, SubtitleColumn.CharactersPerSeconds); - Columns.Insert(ColumnIndexStart + 1, ch); - } - else - { - SubtitleColumns.Add(SubtitleColumn.CharactersPerSeconds); - Columns.Add(ch); - } - UpdateColumnIndexes(); - Columns[ColumnIndexCps].Width = 65; - Columns[ColumnIndexCps].Width = 65; - AutoSizeAllColumns(null); - } - } - - public void ShowWordsMinColumn(string title) - { - if (GetColumnIndex(SubtitleColumn.WordsPerMinute) == -1) - { - var ch = new ColumnHeader { Text = title, TextAlign = RightToLeftLayout ? HorizontalAlignment.Left : HorizontalAlignment.Right }; - if (ColumnIndexCps >= 0) - { - SubtitleColumns.Insert(ColumnIndexCps + 1, SubtitleColumn.WordsPerMinute); - Columns.Insert(ColumnIndexCps + 1, ch); - } - else if (ColumnIndexDuration >= 0) - { - SubtitleColumns.Insert(ColumnIndexDuration + 1, SubtitleColumn.WordsPerMinute); - Columns.Insert(ColumnIndexDuration + 1, ch); - } - else if (ColumnIndexEnd >= 0) - { - SubtitleColumns.Insert(ColumnIndexEnd + 1, SubtitleColumn.WordsPerMinute); - Columns.Insert(ColumnIndexEnd + 1, ch); - } - else if (ColumnIndexStart >= 0) - { - SubtitleColumns.Insert(ColumnIndexStart + 1, SubtitleColumn.WordsPerMinute); - Columns.Insert(ColumnIndexStart + 1, ch); - } - else - { - SubtitleColumns.Add(SubtitleColumn.WordsPerMinute); - Columns.Add(ch); - } - UpdateColumnIndexes(); - Columns[ColumnIndexWpm].Width = 70; - Columns[ColumnIndexWpm].Width = 70; - AutoSizeAllColumns(null); - } - } - - public void ShowGapColumn(string title) - { - if (GetColumnIndex(SubtitleColumn.Gap) == -1) - { - var ch = new ColumnHeader { Text = title }; - if (ColumnIndexWpm >= 0) - { - SubtitleColumns.Insert(ColumnIndexWpm + 1, SubtitleColumn.Gap); - Columns.Insert(ColumnIndexWpm + 1, ch); - } - else if (ColumnIndexCps >= 0) - { - SubtitleColumns.Insert(ColumnIndexCps + 1, SubtitleColumn.Gap); - Columns.Insert(ColumnIndexCps + 1, ch); - } - else if (ColumnIndexDuration >= 0) - { - SubtitleColumns.Insert(ColumnIndexDuration + 1, SubtitleColumn.Gap); - Columns.Insert(ColumnIndexDuration + 1, ch); - } - else if (ColumnIndexEnd >= 0) - { - SubtitleColumns.Insert(ColumnIndexEnd + 1, SubtitleColumn.Gap); - Columns.Insert(ColumnIndexEnd + 1, ch); - } - else if (ColumnIndexStart >= 0) - { - SubtitleColumns.Insert(ColumnIndexStart + 1, SubtitleColumn.Gap); - Columns.Insert(ColumnIndexStart + 1, ch); - } - else - { - SubtitleColumns.Add(SubtitleColumn.Gap); - Columns.Add(ch); - } - UpdateColumnIndexes(); - Columns[ColumnIndexGap].Width = 80; - Columns[ColumnIndexGap].Width = 80; - AutoSizeAllColumns(null); - } - } - - public void ShowActorColumn(string title) - { - if (GetColumnIndex(SubtitleColumn.Actor) == -1) - { - var ch = new ColumnHeader { Text = title }; - if (ColumnIndexGap >= 0) - { - SubtitleColumns.Insert(ColumnIndexGap + 1, SubtitleColumn.Actor); - Columns.Insert(ColumnIndexGap + 1, ch); - } - else if (ColumnIndexWpm >= 0) - { - SubtitleColumns.Insert(ColumnIndexWpm + 1, SubtitleColumn.Actor); - Columns.Insert(ColumnIndexWpm + 1, ch); - } - else if (ColumnIndexCps >= 0) - { - SubtitleColumns.Insert(ColumnIndexCps + 1, SubtitleColumn.Actor); - Columns.Insert(ColumnIndexCps + 1, ch); - } - else if (ColumnIndexDuration >= 0) - { - SubtitleColumns.Insert(ColumnIndexDuration + 1, SubtitleColumn.Actor); - Columns.Insert(ColumnIndexDuration + 1, ch); - } - else if (ColumnIndexEnd >= 0) - { - SubtitleColumns.Insert(ColumnIndexEnd + 1, SubtitleColumn.Actor); - Columns.Insert(ColumnIndexEnd + 1, ch); - } - else if (ColumnIndexStart >= 0) - { - SubtitleColumns.Insert(ColumnIndexStart + 1, SubtitleColumn.Actor); - Columns.Insert(ColumnIndexStart + 1, ch); - } - else - { - SubtitleColumns.Add(SubtitleColumn.Actor); - Columns.Add(ch); - } - UpdateColumnIndexes(); - Columns[ColumnIndexActor].Width = 80; - Columns[ColumnIndexActor].Width = 80; - AutoSizeAllColumns(null); - } - else - { - Columns[GetColumnIndex(SubtitleColumn.Actor)].Text = title; - } - } - - public void ShowRegionColumn(string title) - { - if (GetColumnIndex(SubtitleColumn.Region) == -1) - { - var ch = new ColumnHeader { Text = title }; - if (ColumnIndexActor >= 0) - { - SubtitleColumns.Insert(ColumnIndexActor + 1, SubtitleColumn.Region); - Columns.Insert(ColumnIndexActor + 1, ch); - } - else if (ColumnIndexGap >= 0) - { - SubtitleColumns.Insert(ColumnIndexGap + 1, SubtitleColumn.Region); - Columns.Insert(ColumnIndexGap + 1, ch); - } - else if (ColumnIndexWpm >= 0) - { - SubtitleColumns.Insert(ColumnIndexWpm + 1, SubtitleColumn.Region); - Columns.Insert(ColumnIndexWpm + 1, ch); - } - else if (ColumnIndexCps >= 0) - { - SubtitleColumns.Insert(ColumnIndexCps + 1, SubtitleColumn.Region); - Columns.Insert(ColumnIndexCps + 1, ch); - } - else if (ColumnIndexDuration >= 0) - { - SubtitleColumns.Insert(ColumnIndexDuration + 1, SubtitleColumn.Region); - Columns.Insert(ColumnIndexDuration + 1, ch); - } - else if (ColumnIndexEnd >= 0) - { - SubtitleColumns.Insert(ColumnIndexEnd + 1, SubtitleColumn.Region); - Columns.Insert(ColumnIndexEnd + 1, ch); - } - else if (ColumnIndexStart >= 0) - { - SubtitleColumns.Insert(ColumnIndexStart + 1, SubtitleColumn.Region); - Columns.Insert(ColumnIndexStart + 1, ch); - } - else - { - SubtitleColumns.Add(SubtitleColumn.Region); - Columns.Add(ch); - } - UpdateColumnIndexes(); - Columns[ColumnIndexRegion].Width = 80; - Columns[ColumnIndexRegion].Width = 80; - AutoSizeAllColumns(null); - } - } - - public void HideColumn(SubtitleColumn column) - { - var idx = GetColumnIndex(column); - if (idx >= 0) - { - SubtitleColumns.RemoveAt(idx); - UpdateColumnIndexes(); - Columns.RemoveAt(idx); - AutoSizeAllColumns(null); - } - } - - public void SubtitleListViewLastColumnFill(object sender, EventArgs e) - { - int width = 0; - for (int i = 0; i < Columns.Count - 1; i++) - { - width += Columns[i].Width; - } - if (Columns.Count > 0) - { - Columns[Columns.Count - 1].Width = Width - (width + 25); - } - } - - public void SaveFirstVisibleIndex() - { - if (TopItem != null) - { - FirstVisibleIndex = Items.Count > 0 ? TopItem.Index : -1; - } - } - - private void RestoreFirstVisibleIndex() - { - if (IsValidIndex(FirstVisibleIndex)) - { - if (FirstVisibleIndex + 1 < Items.Count) - { - FirstVisibleIndex++; - } - - Items[Items.Count - 1].EnsureVisible(); - Items[FirstVisibleIndex].EnsureVisible(); - } - } - - internal void Fill(Subtitle subtitle, Subtitle subtitleAlternate = null) - { - if (subtitleAlternate == null || subtitleAlternate.Paragraphs.Count == 0) - { - Fill(subtitle.Paragraphs); - } - else - { - Fill(subtitle.Paragraphs, subtitleAlternate.Paragraphs); - } - } - - internal void Fill(List paragraphs) - { - SaveFirstVisibleIndex(); - BeginUpdate(); - Items.Clear(); - var x = ListViewItemSorter; - ListViewItemSorter = null; - var font = new Font(_subtitleFontName, SubtitleFontSize, GetFontStyle()); - var items = new ListViewItem[paragraphs.Count]; - for (var index = 0; index < paragraphs.Count; index++) - { - var paragraph = paragraphs[index]; - Paragraph next = null; - if (index + 1 < paragraphs.Count) - { - next = paragraphs[index + 1]; - } - items[index] = MakeListViewItem(paragraph, next, null, font); - } - - Items.AddRange(items); - - if (UseSyntaxColoring && _settings != null) - { - for (var index = 0; index < paragraphs.Count; index++) - { - var paragraph = paragraphs[index]; - var item = items[index]; - SyntaxColorListViewItem(paragraphs, index, paragraph, item); - } - } - - ListViewItemSorter = x; - EndUpdate(); - - if (FirstVisibleIndex == 0) - { - FirstVisibleIndex = -1; - } - } - - internal void Fill(List paragraphs, List paragraphsAlternate) - { - SaveFirstVisibleIndex(); - BeginUpdate(); - Items.Clear(); - var x = ListViewItemSorter; - ListViewItemSorter = null; - var items = new ListViewItem[paragraphs.Count]; - var font = new Font(_subtitleFontName, SubtitleFontSize, GetFontStyle()); - for (var index = 0; index < paragraphs.Count; index++) - { - var paragraph = paragraphs[index]; - Paragraph alternate = Utilities.GetOriginalParagraph(index, paragraph, paragraphsAlternate); - Paragraph next = null; - if (index + 1 < paragraphs.Count) - { - next = paragraphs[index + 1]; - } - items[index] = MakeListViewItem(paragraph, next, alternate, font); - } - - Items.AddRange(items); - - if (UseSyntaxColoring && _settings != null) - { - for (var index = 0; index < paragraphs.Count; index++) - { - var paragraph = paragraphs[index]; - var item = items[index]; - SyntaxColorListViewItem(paragraphs, index, paragraph, item); - } - } - - ListViewItemSorter = x; - EndUpdate(); - - if (FirstVisibleIndex == 0) - { - FirstVisibleIndex = -1; - } - } - - public void SyntaxColorAllLines(Subtitle subtitle) - { - if (UseSyntaxColoring && _settings != null) - { - for (int index = 0; index < subtitle.Paragraphs.Count; index++) - { - var paragraph = subtitle.Paragraphs[index]; - SyntaxColorListViewItem(subtitle.Paragraphs, index, paragraph, Items[index]); - } - } - } - - public void SyntaxColorLine(List paragraphs, int i, Paragraph paragraph) - { - if (UseSyntaxColoring && _settings != null && IsValidIndex(i)) - { - var item = Items[i]; - SyntaxColorListViewItem(paragraphs, i, paragraph, item); - } - } - - private void SyntaxColorListViewItem(List paragraphs, int i, Paragraph paragraph, ListViewItem item) - { - if (item.UseItemStyleForSubItems) - { - item.UseItemStyleForSubItems = false; - item.SubItems[ColumnIndexDuration].BackColor = BackColor; - } - if (ColumnIndexCps >= 0) - { - item.SubItems[ColumnIndexCps].BackColor = BackColor; - } - if (ColumnIndexWpm >= 0) - { - item.SubItems[ColumnIndexWpm].BackColor = paragraph.WordsPerMinute > Configuration.Settings.General.SubtitleMaximumWordsPerMinute ? Configuration.Settings.Tools.ListViewSyntaxErrorColor : BackColor; - } - if (ColumnIndexDuration >= 0) - { - item.SubItems[ColumnIndexDuration].BackColor = BackColor; - } - - if (_settings.Tools.ListViewSyntaxColorDurationSmall) - { - double charactersPerSecond = Utilities.GetCharactersPerSecond(paragraph); - if (charactersPerSecond > Configuration.Settings.General.SubtitleMaximumCharactersPerSeconds) - { - if (ColumnIndexCps >= 0) - { - item.SubItems[ColumnIndexCps].BackColor = Configuration.Settings.Tools.ListViewSyntaxErrorColor; - } - else if (ColumnIndexDuration >= 0) - { - item.SubItems[ColumnIndexDuration].BackColor = Configuration.Settings.Tools.ListViewSyntaxErrorColor; - } - } - if (paragraph.Duration.TotalMilliseconds < Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds && ColumnIndexDuration >= 0) - { - item.SubItems[ColumnIndexDuration].BackColor = Configuration.Settings.Tools.ListViewSyntaxErrorColor; - } - } - if (_settings.Tools.ListViewSyntaxColorDurationBig && - paragraph.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds && - ColumnIndexDuration >= 0) - { - item.SubItems[ColumnIndexDuration].BackColor = Configuration.Settings.Tools.ListViewSyntaxErrorColor; - } - - if (_settings.Tools.ListViewSyntaxColorOverlap && i > 0 && i < paragraphs.Count && ColumnIndexEnd >= 0) - { - Paragraph prev = paragraphs[i - 1]; - if (paragraph.StartTime.TotalMilliseconds < prev.EndTime.TotalMilliseconds && !prev.EndTime.IsMaxTime) - { - Items[i - 1].SubItems[ColumnIndexEnd].BackColor = Configuration.Settings.Tools.ListViewSyntaxErrorColor; - item.SubItems[ColumnIndexStart].BackColor = Configuration.Settings.Tools.ListViewSyntaxErrorColor; - } - else - { - Items[i - 1].SubItems[ColumnIndexEnd].BackColor = BackColor; - item.SubItems[ColumnIndexStart].BackColor = BackColor; - } - } - - if (_settings.Tools.ListViewSyntaxColorGap && i >= 0 && i < paragraphs.Count - 1 && ColumnIndexGap >= 0) - { - Paragraph next = paragraphs[i + 1]; - if (next.StartTime.TotalMilliseconds - paragraph.EndTime.TotalMilliseconds < Configuration.Settings.General.MinimumMillisecondsBetweenLines) - { - item.SubItems[ColumnIndexGap].BackColor = Configuration.Settings.Tools.ListViewSyntaxErrorColor; - } - else - { - item.SubItems[ColumnIndexGap].BackColor = BackColor; - } - } - - if (ColumnIndexTextAlternate >= 0 && item.SubItems.Count >= ColumnIndexTextAlternate) - { - item.SubItems[ColumnIndexTextAlternate].BackColor = BackColor; - } - - if (ColumnIndexText >= item.SubItems.Count) - { - return; - } - - if (_settings.Tools.ListViewSyntaxColorLongLines) - { - string s = HtmlUtil.RemoveHtmlTags(paragraph.Text, true); - foreach (string line in s.SplitToLines()) - { - if (line.CountCharacters(false, Configuration.Settings.General.IgnoreArabicDiacritics) > Configuration.Settings.General.SubtitleLineMaximumLength) - { - item.SubItems[ColumnIndexText].BackColor = Configuration.Settings.Tools.ListViewSyntaxErrorColor; - return; - } - } - int noOfLines = paragraph.NumberOfLines; - if (s.CountCharacters(false, Configuration.Settings.General.IgnoreArabicDiacritics) <= Configuration.Settings.General.SubtitleLineMaximumLength * noOfLines) - { - if (noOfLines > Configuration.Settings.General.MaxNumberOfLines && _settings.Tools.ListViewSyntaxMoreThanXLines) - { - item.SubItems[ColumnIndexText].BackColor = Configuration.Settings.Tools.ListViewSyntaxErrorColor; - } - else - { - item.SubItems[ColumnIndexText].BackColor = BackColor; - } - } - else - { - item.SubItems[ColumnIndexText].BackColor = Configuration.Settings.Tools.ListViewSyntaxErrorColor; - } - } - if (_settings.Tools.ListViewSyntaxColorWideLines) - { - string s = HtmlUtil.RemoveHtmlTags(paragraph.Text, true); - foreach (string line in s.SplitToLines()) - { - if (TextWidth.CalcPixelWidth(line) > Configuration.Settings.General.SubtitleLineMaximumPixelWidth) - { - item.SubItems[ColumnIndexText].BackColor = Configuration.Settings.Tools.ListViewSyntaxErrorColor; - return; - } - } - } - if (_settings.Tools.ListViewSyntaxMoreThanXLines && - item.SubItems[ColumnIndexText].BackColor != Configuration.Settings.Tools.ListViewSyntaxErrorColor) - { - if (paragraph.NumberOfLines > Configuration.Settings.General.MaxNumberOfLines) - { - item.SubItems[ColumnIndexText].BackColor = Configuration.Settings.Tools.ListViewSyntaxErrorColor; - } - } - } - - private string GetDisplayTime(TimeCode timeCode) - { - if (Configuration.Settings.General.CurrentVideoOffsetInMs != 0) - { - return new TimeCode(timeCode.TotalMilliseconds + Configuration.Settings.General.CurrentVideoOffsetInMs).ToDisplayString(); - } - - return timeCode.ToDisplayString(); - } - - private ListViewItem MakeListViewItem(Paragraph paragraph, Paragraph next, Paragraph paragraphAlternate, Font font) - { - var item = new ListViewItem(paragraph.Number.ToString(CultureInfo.InvariantCulture)) { Tag = paragraph, UseItemStyleForSubItems = false }; - foreach (var column in SubtitleColumns) - { - switch (column) - { - case SubtitleColumn.Start: - item.SubItems.Add(GetDisplayTime(paragraph.StartTime)); - break; - case SubtitleColumn.End: - item.SubItems.Add(GetDisplayTime(paragraph.EndTime)); - break; - case SubtitleColumn.Duration: - item.SubItems.Add(paragraph.Duration.ToShortDisplayString()); - break; - case SubtitleColumn.CharactersPerSeconds: - item.SubItems.Add($"{Utilities.GetCharactersPerSecond(paragraph):0.00}"); - break; - case SubtitleColumn.WordsPerMinute: - item.SubItems.Add($"{paragraph.WordsPerMinute:0.00}"); - break; - case SubtitleColumn.Gap: - item.SubItems.Add(GetGap(paragraph, next)); - break; - case SubtitleColumn.Actor: - item.SubItems.Add(paragraph.Actor); - break; - case SubtitleColumn.Region: - item.SubItems.Add(paragraph.Region); - break; - case SubtitleColumn.Text: - item.SubItems.Add(paragraph.Text.Replace(Environment.NewLine, _lineSeparatorString)); - break; - case SubtitleColumn.TextAlternate: - var text = paragraphAlternate != null ? paragraphAlternate.Text : string.Empty; - item.SubItems.Add(text.Replace(Environment.NewLine, _lineSeparatorString)); - break; - case SubtitleColumn.Extra: - item.SubItems.Add(paragraph.Extra); - break; - case SubtitleColumn.Network: - item.SubItems.Add(string.Empty); - break; - } - } - - item.StateImageIndex = paragraph.Bookmark != null ? 0 : -1; - item.Font = font; - return item; - } - - public void SelectNone() - { - for (var i = Items.Count - 1; i >= 0; i--) - { - Items[i].Selected = false; - } - } - - public void SelectIndexAndEnsureVisibleFaster(int index) - { - var topItem = TopItem; - if (!IsValidIndex(index) || topItem == null) - { - return; - } - - BeginUpdate(); - foreach (var selectedIndex in GetSelectedIndices()) - { - Items[selectedIndex].Selected = false; - } - - var selectedItem = Items[index]; - selectedItem.Selected = true; - selectedItem.Focused = true; - - var topIndex = topItem.Index; - var numberOfVisibleItems = (Height - 30) / GetItemRect(0).Height; - int bottomIndex = topIndex + numberOfVisibleItems; - if (index >= bottomIndex) - { - Items[Math.Min(Items.Count - 1, index + numberOfVisibleItems / 2)].EnsureVisible(); - } - else if (index < topIndex) - { - Items[Math.Max(0, index - numberOfVisibleItems / 2)].EnsureVisible(); - } - EndUpdate(); - } - - public void SelectIndexAndEnsureVisible(int index, bool focus) - { - if (!IsValidIndex(index)) - { - return; - } - - if (TopItem == null) - { - EnsureVisible(index); - if (focus) - { - Items[index].Focused = true; - } - return; - } - - int bottomIndex = TopItem.Index + (Height - 25) / 16; - int itemsBeforeAfterCount = (bottomIndex - TopItem.Index) / 2 - 1; - if (itemsBeforeAfterCount < 0) - { - itemsBeforeAfterCount = 1; - } - - int beforeIndex = index - itemsBeforeAfterCount; - if (beforeIndex < 0) - { - beforeIndex = 0; - } - - int afterIndex = index + itemsBeforeAfterCount; - if (afterIndex >= Items.Count) - { - afterIndex = Items.Count - 1; - } - - SelectNone(); - if (TopItem.Index <= beforeIndex && bottomIndex > afterIndex) - { - Items[index].Selected = true; - Items[index].EnsureVisible(); - if (focus) - { - Items[index].Focused = true; - } - EnsureVisible(index); - return; - } - - Items[beforeIndex].EnsureVisible(); - EnsureVisible(beforeIndex); - Items[afterIndex].EnsureVisible(); - EnsureVisible(afterIndex); - Items[index].Selected = true; - Items[index].EnsureVisible(); - if (focus) - { - Items[index].Focused = true; - } - EnsureVisible(index); - } - - public void SelectIndexAndEnsureVisible(int index) - { - SelectIndexAndEnsureVisible(index, false); - } - - public void SelectIndexAndEnsureVisible(Paragraph p) - { - SelectNone(); - if (p == null) - { - return; - } - - for (int index = 0; index < Items.Count; index++) - { - ListViewItem item = Items[index]; - if (item.Tag as Paragraph == p || - item.Text == p.Number.ToString(CultureInfo.InvariantCulture) && - (ColumnIndexStart < 0 || item.SubItems[ColumnIndexStart].Text == GetDisplayTime(p.StartTime)) && - (ColumnIndexEnd < 0 || item.SubItems[ColumnIndexEnd].Text == GetDisplayTime(p.EndTime)) && - item.SubItems[ColumnIndexText].Text == p.Text) - { - RestoreFirstVisibleIndex(); - item.Selected = true; - item.EnsureVisible(); - return; - } - } - } - - public Paragraph GetSelectedParagraph(Subtitle subtitle) - { - if (subtitle != null && SelectedItems.Count > 0) - { - return subtitle.GetParagraphOrDefault(SelectedItems[0].Index); - } - - return null; - } - - public string GetText(int index) - { - if (IsValidIndex(index)) - { - return Items[index].SubItems[ColumnIndexText].Text.Replace(_lineSeparatorString, Environment.NewLine); - } - - return null; - } - - public string GetTextAlternate(int index) - { - if (IsValidIndex(index) && ColumnIndexTextAlternate >= 0) - { - return Items[index].SubItems[ColumnIndexTextAlternate].Text.Replace(_lineSeparatorString, Environment.NewLine); - } - - return null; - } - - public void SetText(int index, string text) - { - if (IsValidIndex(index)) - { - ListViewItem item = Items[index]; - if (ColumnIndexText >= 0) - { - item.SubItems[ColumnIndexText].Text = text.Replace(Environment.NewLine, _lineSeparatorString); - } - - if (item.Tag is Paragraph paragraph) - { - UpdateCpsAndWpm(item, paragraph); - } - } - } - - public void SetTimeAndText(int index, Paragraph paragraph, Paragraph next) - { - if (IsValidIndex(index)) - { - ListViewItem item = Items[index]; - if (ColumnIndexStart >= 0) - { - item.SubItems[ColumnIndexStart].Text = GetDisplayTime(paragraph.StartTime); - } - - if (ColumnIndexEnd >= 0) - { - item.SubItems[ColumnIndexEnd].Text = GetDisplayTime(paragraph.EndTime); - } - - if (ColumnIndexDuration >= 0) - { - item.SubItems[ColumnIndexDuration].Text = paragraph.Duration.ToShortDisplayString(); - } - - if (ColumnIndexGap >= 0) - { - item.SubItems[ColumnIndexGap].Text = GetGap(paragraph, next); - } - - if (ColumnIndexActor >= 0) - { - item.SubItems[ColumnIndexActor].Text = paragraph.Actor; - } - - if (ColumnIndexRegion >= 0) - { - item.SubItems[ColumnIndexRegion].Text = paragraph.Region; - } - - if (ColumnIndexText >= 0) - { - item.SubItems[ColumnIndexText].Text = paragraph.Text.Replace(Environment.NewLine, _lineSeparatorString); - } - - UpdateCpsAndWpm(item, paragraph); - } - } - - private void UpdateCpsAndWpm(ListViewItem item, Paragraph paragraph) - { - if (ColumnIndexCps >= 0) - { - item.SubItems[ColumnIndexCps].Text = $"{Utilities.GetCharactersPerSecond(paragraph):0.00}"; - } - if (ColumnIndexWpm >= 0) - { - item.SubItems[ColumnIndexWpm].Text = $"{paragraph.WordsPerMinute:0.00}"; - } - } - - public void SetExtraText(int index, string text, Color color) - { - if (IsValidIndex(index)) - { - if (GetColumnIndex(SubtitleColumn.Extra) == -1) - { - ShowExtraColumn(string.Empty); - } - while (ColumnIndexExtra >= Items[index].SubItems.Count) - { - Items[index].SubItems.Add(string.Empty); - } - - if (ColumnIndexExtra >= 0) - { - Items[index].SubItems[ColumnIndexExtra].Text = text; - Items[index].UseItemStyleForSubItems = false; - Items[index].SubItems[ColumnIndexExtra].BackColor = BackColor; - Items[index].SubItems[ColumnIndexExtra].ForeColor = color; - } - } - } - - public void SetNetworkText(int index, string text, Color color) - { - if (IsValidIndex(index)) - { - if (GetColumnIndex(SubtitleColumn.Network) == -1) - { - ShowNetworkColumn(string.Empty); - } - while (ColumnIndexNetwork >= Items[index].SubItems.Count) - { - Items[index].SubItems.Add(string.Empty); - } - - if (ColumnIndexNetwork >= 0) - { - Items[index].SubItems[ColumnIndexNetwork].Text = text; - Items[index].UseItemStyleForSubItems = false; - Items[index].SubItems[ColumnIndexNetwork].BackColor = Color.AntiqueWhite; - Items[index].SubItems[ColumnIndexNetwork].ForeColor = color; - } - } - } - - public void SetAlternateText(int index, string text) - { - if (IsValidIndex(index) && Columns.Count >= ColumnIndexTextAlternate + 1) - { - if (GetColumnIndex(SubtitleColumn.TextAlternate) == -1) - { - ShowAlternateTextColumn(string.Empty); - } - while (ColumnIndexTextAlternate >= Items[index].SubItems.Count) - { - Items[index].SubItems.Add(string.Empty); - } - - if (ColumnIndexTextAlternate >= 0) - { - Items[index].SubItems[ColumnIndexTextAlternate].Text = text.Replace(Environment.NewLine, _lineSeparatorString); - Items[index].UseItemStyleForSubItems = false; - Items[index].SubItems[ColumnIndexTextAlternate].BackColor = BackColor; - } - } - } - - public void SetDuration(int index, Paragraph paragraph, Paragraph next) - { - if (IsValidIndex(index)) - { - ListViewItem item = Items[index]; - if (ColumnIndexEnd >= 0) - { - item.SubItems[ColumnIndexEnd].Text = GetDisplayTime(paragraph.EndTime); - } - - if (ColumnIndexDuration >= 0) - { - item.SubItems[ColumnIndexDuration].Text = paragraph.Duration.ToShortDisplayString(); - } - - if (ColumnIndexGap >= 0) - { - item.SubItems[ColumnIndexGap].Text = GetGap(paragraph, next); - } - - UpdateCpsAndWpm(item, paragraph); - } - } - - public void SetNumber(int index, string number) - { - if (IsValidIndex(index) && ColumnIndexNumber >= 0) - { - Items[index].SubItems[ColumnIndexNumber].Text = number; - } - } - - public void UpdateFrames(Subtitle subtitle) - { - if (Configuration.Settings?.General.UseTimeFormatHHMMSSFF == true) - { - BeginUpdate(); - for (int i = 0; i < subtitle.Paragraphs.Count; i++) - { - if (IsValidIndex(i)) - { - Paragraph p = subtitle.Paragraphs[i]; - ListViewItem item = Items[i]; - if (ColumnIndexStart >= 0) - { - item.SubItems[ColumnIndexStart].Text = GetDisplayTime(p.StartTime); - } - - if (ColumnIndexEnd >= 0) - { - item.SubItems[ColumnIndexEnd].Text = GetDisplayTime(p.EndTime); - } - - if (ColumnIndexDuration >= 0) - { - item.SubItems[ColumnIndexDuration].Text = p.Duration.ToShortDisplayString(); - } - } - } - EndUpdate(); - } - } - - public void SetStartTimeAndDuration(int index, Paragraph paragraph, Paragraph next, Paragraph prev) - { - if (IsValidIndex(index)) - { - ListViewItem item = Items[index]; - if (ColumnIndexStart >= 0) - { - item.SubItems[ColumnIndexStart].Text = GetDisplayTime(paragraph.StartTime); - } - - if (ColumnIndexEnd >= 0) - { - item.SubItems[ColumnIndexEnd].Text = GetDisplayTime(paragraph.EndTime); - } - - if (ColumnIndexDuration >= 0) - { - item.SubItems[ColumnIndexDuration].Text = paragraph.Duration.ToShortDisplayString(); - } - - if (ColumnIndexGap >= 0) - { - item.SubItems[ColumnIndexGap].Text = GetGap(paragraph, next); - } - - UpdateCpsAndWpm(item, paragraph); - } - SetGap(index - 1, prev, paragraph); - } - - private void SetGap(int index, Paragraph paragraph, Paragraph next) - { - if (IsValidIndex(index)) - { - ListViewItem item = Items[index]; - if (ColumnIndexGap >= 0) - { - item.SubItems[ColumnIndexGap].Text = GetGap(paragraph, next); - } - } - } - - private string GetGap(Paragraph paragraph, Paragraph next) - { - if (next == null || paragraph == null || next.StartTime.IsMaxTime || paragraph.EndTime.IsMaxTime) - { - return string.Empty; - } - - return new TimeCode(next.StartTime.TotalMilliseconds - paragraph.EndTime.TotalMilliseconds).ToShortDisplayString(); - } - - public void SetBackgroundColor(int index, Color color, int columnNumber) - { - if (IsValidIndex(index)) - { - ListViewItem item = Items[index]; - if (item.UseItemStyleForSubItems) - { - item.UseItemStyleForSubItems = false; - } - - if (columnNumber >= 0 && columnNumber < item.SubItems.Count) - { - item.SubItems[columnNumber].BackColor = color; - } - } - } - - public void SetBackgroundColor(int index, Color color) - { - if (IsValidIndex(index)) - { - ListViewItem item = Items[index]; - item.BackColor = color; - if (ColumnIndexStart >= 0) - { - Items[index].SubItems[ColumnIndexStart].BackColor = color; - } - - if (ColumnIndexEnd >= 0) - { - Items[index].SubItems[ColumnIndexEnd].BackColor = color; - } - - if (ColumnIndexDuration >= 0) - { - Items[index].SubItems[ColumnIndexDuration].BackColor = color; - } - - if (ColumnIndexCps >= 0) - { - Items[index].SubItems[ColumnIndexCps].BackColor = color; - } - - if (ColumnIndexWpm >= 0) - { - Items[index].SubItems[ColumnIndexWpm].BackColor = color; - } - - if (ColumnIndexGap >= 0) - { - Items[index].SubItems[ColumnIndexGap].BackColor = color; - } - - if (ColumnIndexText >= 0) - { - Items[index].SubItems[ColumnIndexText].BackColor = color; - } - - if (ColumnIndexTextAlternate >= 0) - { - Items[index].SubItems[ColumnIndexTextAlternate].BackColor = color; - } - } - } - - public Color GetBackgroundColor(int index) - { - if (IsValidIndex(index)) - { - ListViewItem item = Items[index]; - return item.BackColor; - } - return DefaultBackColor; - } - - /// - /// Removes all text and set background color - /// - /// - /// - public void ColorOut(int index, Color color) - { - if (IsValidIndex(index)) - { - ListViewItem item = Items[index]; - item.Text = string.Empty; - if (ColumnIndexStart >= 0) - { - item.SubItems[ColumnIndexStart].Text = string.Empty; - } - - if (ColumnIndexEnd >= 0) - { - item.SubItems[ColumnIndexEnd].Text = string.Empty; - } - - if (ColumnIndexDuration >= 0) - { - item.SubItems[ColumnIndexDuration].Text = string.Empty; - } - - if (ColumnIndexText >= 0) - { - item.SubItems[ColumnIndexText].Text = string.Empty; - } - - if (ColumnIndexGap >= 0) - { - item.SubItems[ColumnIndexGap].Text = string.Empty; - } - - SetBackgroundColor(index, color); - } - } - - public void HideNonVobSubColumns() - { - var numberIdx = GetColumnIndex(SubtitleColumn.Number); - if (numberIdx >= 0) - { - Columns[numberIdx].Width = 0; - } - - HideColumn(SubtitleColumn.End); - HideColumn(SubtitleColumn.Duration); - HideColumn(SubtitleColumn.CharactersPerSeconds); - HideColumn(SubtitleColumn.WordsPerMinute); - } - - public void SetCustomResize(EventHandler handler) - { - if (handler == null) - { - return; - } - - Resize -= SubtitleListViewLastColumnFill; - Resize += handler; - } - - private bool IsValidIndex(int index) - { - return index >= 0 && index < Items.Count; - } - - private FontStyle GetFontStyle() => SubtitleFontBold ? FontStyle.Bold : FontStyle.Regular; - - public void ShowState(int index, Paragraph paragraph) - { - if (IsValidIndex(index)) - { - Items[index].StateImageIndex = paragraph.Bookmark != null ? 0 : -1; - } - } - - /// - /// Get SelectedIndices as array for faster performance. - /// - /// SelectedIndices as int array - public int[] GetSelectedIndices() - { - var selectedIndices = new int[SelectedIndices.Count]; - SelectedIndices.CopyTo(selectedIndices, 0); - return selectedIndices; - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Globalization; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Controls +{ + public sealed class SubtitleListView : ListView + { + public enum SubtitleColumn + { + Number, + Start, + End, + Duration, + CharactersPerSeconds, + WordsPerMinute, + Gap, + Actor, + Region, + Text, + TextAlternate, + Extra, + Network + } + + private List SubtitleColumns { get; } + + public int GetColumnIndex(SubtitleColumn column) + { + return SubtitleColumns.IndexOf(column); + } + + public int ColumnIndexNumber { get; private set; } + public int ColumnIndexStart { get; private set; } + public int ColumnIndexEnd { get; private set; } + public int ColumnIndexDuration { get; private set; } + public int ColumnIndexWpm { get; private set; } + public int ColumnIndexCps { get; private set; } + public int ColumnIndexGap { get; private set; } + public int ColumnIndexActor { get; private set; } + public int ColumnIndexRegion { get; private set; } + public int ColumnIndexText { get; private set; } + public int ColumnIndexTextAlternate { get; private set; } + public int ColumnIndexExtra { get; private set; } + public int ColumnIndexNetwork { get; private set; } + + public bool IsAlternateTextColumnVisible => ColumnIndexTextAlternate >= 0; + private string _lineSeparatorString = " || "; + + private Font _subtitleFont = new Font("Tahoma", 8.25F); + + private string _subtitleFontName = "Tahoma"; + + public override bool RightToLeftLayout + { + get => base.RightToLeftLayout; + set + { + var hzAlignment = value ? HorizontalAlignment.Left : HorizontalAlignment.Right; + if (ColumnIndexCps >= 0) + { + Columns[ColumnIndexCps].TextAlign = hzAlignment; + } + + if (ColumnIndexWpm >= 0) + { + Columns[ColumnIndexWpm].TextAlign = hzAlignment; + } + + base.RightToLeftLayout = value; + } + } + + public string SubtitleFontName + { + get => _subtitleFontName; + set + { + _subtitleFontName = value; + _subtitleFont = new Font(_subtitleFontName, SubtitleFontSize, GetFontStyle()); + } + } + + private bool _subtitleFontBold; + + public bool SubtitleFontBold + { + get { return _subtitleFontBold; } + set + { + _subtitleFontBold = value; + _subtitleFont = new Font(_subtitleFontName, SubtitleFontSize, GetFontStyle()); + } + } + + private int _subtitleFontSize = 8; + + public int SubtitleFontSize + { + get => _subtitleFontSize; + set + { + _subtitleFontSize = value; + _subtitleFont = new Font(_subtitleFontName, SubtitleFontSize, GetFontStyle()); + } + } + + public bool UseSyntaxColoring { get; set; } + private Settings _settings; + private bool _saveColumnWidthChanges; + + public int FirstVisibleIndex { get; set; } = -1; + + public void InitializeLanguage(LanguageStructure.General general, Settings settings) + { + int idx = GetColumnIndex(SubtitleColumn.Number); + if (idx >= 0) + { + Columns[idx].Text = general.NumberSymbol; + } + + idx = GetColumnIndex(SubtitleColumn.Start); + if (idx >= 0) + { + Columns[idx].Text = general.StartTime; + } + + idx = GetColumnIndex(SubtitleColumn.End); + if (idx >= 0) + { + Columns[idx].Text = general.EndTime; + } + + idx = GetColumnIndex(SubtitleColumn.Duration); + if (idx >= 0) + { + Columns[idx].Text = general.Duration; + } + + idx = GetColumnIndex(SubtitleColumn.CharactersPerSeconds); + if (idx >= 0) + { + Columns[idx].Text = general.CharsPerSec; + } + + idx = GetColumnIndex(SubtitleColumn.WordsPerMinute); + if (idx >= 0) + { + Columns[idx].Text = general.WordsPerMin; + } + + idx = GetColumnIndex(SubtitleColumn.Gap); + if (idx >= 0) + { + Columns[idx].Text = general.Gap; + } + + idx = GetColumnIndex(SubtitleColumn.Actor); + if (idx >= 0) + { + Columns[idx].Text = general.Actor; + } + + idx = GetColumnIndex(SubtitleColumn.Region); + if (idx >= 0) + { + Columns[idx].Text = general.Region; + } + + idx = GetColumnIndex(SubtitleColumn.Text); + if (idx >= 0) + { + Columns[idx].Text = general.Text; + } + + if (settings.General.ListViewLineSeparatorString != null) + { + _lineSeparatorString = settings.General.ListViewLineSeparatorString; + } + + if (!string.IsNullOrEmpty(settings.General.SubtitleFontName)) + { + _subtitleFontName = settings.General.SubtitleFontName; + } + + SubtitleFontBold = settings.General.SubtitleListViewFontBold; + if (settings.General.SubtitleListViewFontSize > 6 && settings.General.SubtitleListViewFontSize < 72) + { + SubtitleFontSize = settings.General.SubtitleListViewFontSize; + } + + ForeColor = settings.General.SubtitleFontColor; + BackColor = settings.General.SubtitleBackgroundColor; + _settings = settings; + } + + public void InitializeTimestampColumnWidths(Control parentForm) + { + if (_settings != null && _settings.General.ListViewColumnsRememberSize && _settings.General.ListViewNumberWidth > 1 && + _settings.General.ListViewStartWidth > 1 && _settings.General.ListViewEndWidth > 1 && _settings.General.ListViewDurationWidth > 1) + { + int idx = GetColumnIndex(SubtitleColumn.Number); + if (idx >= 0) + { + Columns[idx].Width = Configuration.Settings.General.ListViewNumberWidth; + } + + idx = GetColumnIndex(SubtitleColumn.Start); + if (idx >= 0) + { + Columns[idx].Width = _settings.General.ListViewStartWidth; + } + + idx = GetColumnIndex(SubtitleColumn.End); + if (idx >= 0) + { + Columns[idx].Width = _settings.General.ListViewEndWidth; + } + + idx = GetColumnIndex(SubtitleColumn.Duration); + if (idx >= 0) + { + Columns[idx].Width = _settings.General.ListViewDurationWidth; + } + + idx = GetColumnIndex(SubtitleColumn.CharactersPerSeconds); + if (idx >= 0) + { + Columns[idx].Width = _settings.General.ListViewCpsWidth; + } + + idx = GetColumnIndex(SubtitleColumn.WordsPerMinute); + if (idx >= 0) + { + Columns[idx].Width = _settings.General.ListViewWpmWidth; + } + + idx = GetColumnIndex(SubtitleColumn.Gap); + if (idx >= 0) + { + Columns[idx].Width = _settings.General.ListViewGapWidth; + } + + idx = GetColumnIndex(SubtitleColumn.Actor); + if (idx >= 0) + { + Columns[idx].Width = _settings.General.ListViewActorWidth; + } + + idx = GetColumnIndex(SubtitleColumn.Region); + if (idx >= 0) + { + Columns[idx].Width = _settings.General.ListViewRegionWidth; + } + + idx = GetColumnIndex(SubtitleColumn.Text); + if (idx >= 0) + { + Columns[idx].Width = _settings.General.ListViewTextWidth; + } + + _saveColumnWidthChanges = true; + } + else if (parentForm != null) + { + using (var graphics = parentForm.CreateGraphics()) + { + var timestampSizeF = graphics.MeasureString(new TimeCode(0, 0, 33, 527).ToDisplayString(), Font); + var timestampWidth = (int)(timestampSizeF.Width + 0.5) + 11; + + var idx = GetColumnIndex(SubtitleColumn.Start); + if (idx >= 0) + { + Columns[idx].Width = timestampWidth; + } + + idx = GetColumnIndex(SubtitleColumn.End); + if (idx >= 0) + { + Columns[idx].Width = timestampWidth; + } + + idx = GetColumnIndex(SubtitleColumn.Duration); + if (idx >= 0) + { + Columns[idx].Width = (int)(timestampWidth * 0.8); + } + } + } + + SubtitleListViewLastColumnFill(this, null); + } + + public SubtitleListView() + { + DoubleBuffered = true; + UseSyntaxColoring = true; + Font = new Font("Tahoma", 8.25F, FontStyle.Regular, GraphicsUnit.Point, 0); + AllowColumnReorder = true; + HeaderStyle = ColumnHeaderStyle.Nonclickable; + + ColumnIndexNumber = -1; + ColumnIndexStart = -1; + ColumnIndexEnd = -1; + ColumnIndexDuration = -1; + ColumnIndexWpm = -1; + ColumnIndexCps = -1; + ColumnIndexGap = -1; + ColumnIndexActor = -1; + ColumnIndexRegion = -1; + ColumnIndexText = -1; + ColumnIndexTextAlternate = -1; + ColumnIndexExtra = -1; + ColumnIndexNetwork = -1; + + SubtitleColumns = new List + { + SubtitleColumn.Number, + SubtitleColumn.Start, + SubtitleColumn.End, + SubtitleColumn.Duration, + SubtitleColumn.Text + }; + UpdateColumnIndexes(); + + foreach (var c in SubtitleColumns) + { + switch (c) + { + case SubtitleColumn.Number: + Columns.Add(new ColumnHeader { Width = 50 }); + break; + case SubtitleColumn.Start: + Columns.Add(new ColumnHeader { Width = 80 }); + break; + case SubtitleColumn.End: + Columns.Add(new ColumnHeader { Width = 80 }); + break; + case SubtitleColumn.Duration: + Columns.Add(new ColumnHeader { Width = 55 }); + break; + case SubtitleColumn.CharactersPerSeconds: + Columns.Add(new ColumnHeader { Width = 60 }); + break; + case SubtitleColumn.WordsPerMinute: + Columns.Add(new ColumnHeader { Width = 65 }); + break; + case SubtitleColumn.Gap: + Columns.Add(new ColumnHeader { Width = 60 }); + break; + case SubtitleColumn.Actor: + Columns.Add(new ColumnHeader { Width = 80 }); + break; + case SubtitleColumn.Region: + Columns.Add(new ColumnHeader { Width = 60 }); + break; + case SubtitleColumn.Text: + Columns.Add(new ColumnHeader { Width = 300 }); + break; + } + } + + if (Configuration.Settings != null && !Configuration.Settings.Tools.ListViewShowColumnEndTime) + { + HideColumn(SubtitleColumn.End); + } + + if (Configuration.Settings != null && !Configuration.Settings.Tools.ListViewShowColumnDuration) + { + HideColumn(SubtitleColumn.Duration); + } + + if (Configuration.Settings != null && Configuration.Settings.Tools.ListViewShowColumnCharsPerSec) + { + ShowCharsSecColumn(Configuration.Settings.Language.General.CharsPerSec); + } + + if (Configuration.Settings != null && Configuration.Settings.Tools.ListViewShowColumnWordsPerMin) + { + ShowWordsMinColumn(Configuration.Settings.Language.General.WordsPerMin); + } + + if (Configuration.Settings != null && Configuration.Settings.Tools.ListViewShowColumnGap) + { + ShowGapColumn(Configuration.Settings.Language.General.Gap); + } + + SubtitleListViewLastColumnFill(this, null); + + FullRowSelect = true; + View = View.Details; + Resize += SubtitleListViewLastColumnFill; + GridLines = true; + ColumnWidthChanged += SubtitleListViewColumnWidthChanged; + OwnerDraw = true; + DrawItem += SubtitleListView_DrawItem; + DrawSubItem += SubtitleListView_DrawSubItem; + DrawColumnHeader += SubtitleListView_DrawColumnHeader; + } + + private void UpdateColumnIndexes() + { + ColumnIndexNumber = GetColumnIndex(SubtitleColumn.Number); + ColumnIndexStart = GetColumnIndex(SubtitleColumn.Start); + ColumnIndexEnd = GetColumnIndex(SubtitleColumn.End); + ColumnIndexDuration = GetColumnIndex(SubtitleColumn.Duration); + ColumnIndexCps = GetColumnIndex(SubtitleColumn.CharactersPerSeconds); + ColumnIndexWpm = GetColumnIndex(SubtitleColumn.WordsPerMinute); + ColumnIndexGap = GetColumnIndex(SubtitleColumn.Gap); + ColumnIndexActor = GetColumnIndex(SubtitleColumn.Actor); + ColumnIndexRegion = GetColumnIndex(SubtitleColumn.Region); + ColumnIndexText = GetColumnIndex(SubtitleColumn.Text); + ColumnIndexTextAlternate = GetColumnIndex(SubtitleColumn.TextAlternate); + ColumnIndexExtra = GetColumnIndex(SubtitleColumn.Extra); + ColumnIndexNetwork = GetColumnIndex(SubtitleColumn.Network); + } + + private void SubtitleListView_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e) + { + e.DrawDefault = true; + } + + private void SubtitleListView_DrawSubItem(object sender, DrawListViewSubItemEventArgs e) + { + Color backgroundColor = Items[e.ItemIndex].SubItems[e.ColumnIndex].BackColor; + if (Focused && backgroundColor == BackColor || RightToLeftLayout) + { + e.DrawDefault = true; + return; + } + + using (var sf = new StringFormat()) + { + switch (e.Header.TextAlign) + { + case HorizontalAlignment.Center: + sf.Alignment = StringAlignment.Center; + break; + case HorizontalAlignment.Right: + sf.Alignment = StringAlignment.Far; + break; + } + + if (e.Item.Selected) + { + + Rectangle rect = e.Bounds; + if (Configuration.Settings != null) + { + backgroundColor = backgroundColor == BackColor ? Configuration.Settings.Tools.ListViewUnfocusedSelectedColor : GetCustomColor(backgroundColor); + var sb = new SolidBrush(backgroundColor); + e.Graphics.FillRectangle(sb, rect); + } + else + { + e.Graphics.FillRectangle(Brushes.LightBlue, rect); + } + + int addX = 0; + + if (e.ColumnIndex == 0 && StateImageList?.Images.Count > 0) + { + addX = 18; + } + + if (e.ColumnIndex == 0 && e.Item.StateImageIndex >= 0 && StateImageList?.Images.Count > e.Item.StateImageIndex) + { + e.Graphics.DrawImage(StateImageList.Images[e.Item.StateImageIndex], new Rectangle(rect.X + 4, rect.Y + 2, 16, 16)); + } + + if (Columns[e.ColumnIndex].TextAlign == HorizontalAlignment.Right) + { + var stringWidth = (int)e.Graphics.MeasureString(e.Item.SubItems[e.ColumnIndex].Text, _subtitleFont).Width; + TextRenderer.DrawText(e.Graphics, e.Item.SubItems[e.ColumnIndex].Text, _subtitleFont, new Point(e.Bounds.Right - stringWidth - 7, e.Bounds.Top + 2), e.Item.ForeColor, TextFormatFlags.NoPrefix); + } + else + { + TextRenderer.DrawText(e.Graphics, e.Item.SubItems[e.ColumnIndex].Text, _subtitleFont, new Point(e.Bounds.Left + 3 + addX, e.Bounds.Top + 2), e.Item.ForeColor, TextFormatFlags.NoPrefix); + } + } + else + { + e.DrawDefault = true; + } + } + } + + private static Color GetCustomColor(Color color) + { + int r = Math.Max(color.R - 39, 0); + int g = Math.Max(color.G - 39, 0); + int b = Math.Max(color.B - 39, 0); + return Color.FromArgb(color.A, r, g, b); + } + + private void SubtitleListView_DrawItem(object sender, DrawListViewItemEventArgs e) + { + if (!Focused && (e.State & ListViewItemStates.Selected) != 0) + { + if (e.Item.Focused) + { + e.DrawFocusRectangle(); + } + } + else + { + e.DrawDefault = true; + } + } + + private void SubtitleListViewColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e) + { + if (_settings != null && _saveColumnWidthChanges) + { + if (e.ColumnIndex == ColumnIndexNumber) + { + Configuration.Settings.General.ListViewNumberWidth = Columns[ColumnIndexNumber].Width; + } + else if (e.ColumnIndex == ColumnIndexStart) + { + Configuration.Settings.General.ListViewStartWidth = Columns[ColumnIndexStart].Width; + } + else if (e.ColumnIndex == ColumnIndexEnd) + { + Configuration.Settings.General.ListViewEndWidth = Columns[ColumnIndexEnd].Width; + } + else if (e.ColumnIndex == ColumnIndexDuration) + { + Configuration.Settings.General.ListViewDurationWidth = Columns[ColumnIndexDuration].Width; + } + else if (e.ColumnIndex == ColumnIndexCps) + { + Configuration.Settings.General.ListViewCpsWidth = Columns[ColumnIndexCps].Width; + } + else if (e.ColumnIndex == ColumnIndexWpm) + { + Configuration.Settings.General.ListViewWpmWidth = Columns[ColumnIndexWpm].Width; + } + else if (e.ColumnIndex == ColumnIndexGap) + { + Configuration.Settings.General.ListViewGapWidth = Columns[ColumnIndexGap].Width; + } + else if (e.ColumnIndex == ColumnIndexActor) + { + Configuration.Settings.General.ListViewActorWidth = Columns[ColumnIndexActor].Width; + } + else if (e.ColumnIndex == ColumnIndexRegion) + { + Configuration.Settings.General.ListViewRegionWidth = Columns[ColumnIndexRegion].Width; + } + if (e.ColumnIndex == ColumnIndexText) + { + Configuration.Settings.General.ListViewTextWidth = Columns[ColumnIndexText].Width; + } + } + } + + public void AutoSizeColumns() + { + var numberIdx = GetColumnIndex(SubtitleColumn.Number); + if (numberIdx >= 0) + { + Columns[numberIdx].Width = 50; + Columns[numberIdx].Width = 50; + } + + var startIdx = GetColumnIndex(SubtitleColumn.Start); + var endIdx = GetColumnIndex(SubtitleColumn.End); + var durationIdx = GetColumnIndex(SubtitleColumn.Duration); + int timeStampWidth; + try + { + using (var graphics = CreateGraphics()) + { + var timestampSizeF = graphics.MeasureString(new TimeCode(0, 0, 33, 527).ToDisplayString(), Font); + timeStampWidth = (int)(timestampSizeF.Width + 0.5) + 11; + } + } + catch + { + timeStampWidth = 65; + } + if (startIdx >= 0) + { + Columns[startIdx].Width = timeStampWidth; + } + if (endIdx >= 0) + { + Columns[endIdx].Width = timeStampWidth; + } + if (durationIdx >= 0) + { + Columns[durationIdx].Width = (int)(timeStampWidth * 0.8); + } + + var cpsIdx = GetColumnIndex(SubtitleColumn.CharactersPerSeconds); + if (cpsIdx >= 0) + { + Columns[cpsIdx].Width = 60; + Columns[cpsIdx].Width = 60; + } + + var wpmIdx = GetColumnIndex(SubtitleColumn.WordsPerMinute); + if (wpmIdx >= 0) + { + Columns[wpmIdx].Width = 65; + Columns[wpmIdx].Width = 65; + } + + var gapIdx = GetColumnIndex(SubtitleColumn.Gap); + if (gapIdx >= 0) + { + Columns[gapIdx].Width = 60; + Columns[gapIdx].Width = 60; + } + + var actorIdx = GetColumnIndex(SubtitleColumn.Actor); + if (actorIdx >= 0) + { + Columns[actorIdx].Width = 80; + Columns[actorIdx].Width = 80; + } + + var regionIdx = GetColumnIndex(SubtitleColumn.Region); + if (regionIdx >= 0) + { + Columns[regionIdx].Width = 60; + Columns[regionIdx].Width = 60; + } + + int w = 0; + for (int index = 0; index < SubtitleColumns.Count; index++) + { + var column = SubtitleColumns[index]; + int cw = Columns[index].Width; + if (column != SubtitleColumn.Text && column != SubtitleColumn.TextAlternate) + { + w += cw; + } + } + int lengthAvailable = Width - w; + if (ColumnIndexTextAlternate >= 0) + { + lengthAvailable = lengthAvailable / 2; + Columns[ColumnIndexTextAlternate].Width = lengthAvailable; + Columns[ColumnIndexTextAlternate].Width = lengthAvailable; + Columns[ColumnIndexTextAlternate].Width = lengthAvailable; + } + Columns[ColumnIndexText].Width = lengthAvailable; + Columns[ColumnIndexText].Width = lengthAvailable; + Columns[ColumnIndexText].Width = lengthAvailable; + SubtitleListViewLastColumnFill(this, null); + } + + public void AutoSizeAllColumns(Form parentForm) + { + InitializeTimestampColumnWidths(parentForm); + + var numberIdx = GetColumnIndex(SubtitleColumn.Number); + if (numberIdx >= 0) + { + if (_settings != null && _settings.General.ListViewColumnsRememberSize && _settings.General.ListViewNumberWidth > 1) + { + Columns[numberIdx].Width = _settings.General.ListViewNumberWidth; + } + else + { + Columns[numberIdx].Width = 50; + } + } + + var startIdx = GetColumnIndex(SubtitleColumn.Start); + var endIdx = GetColumnIndex(SubtitleColumn.End); + int timeStampWidth; + try + { + using (var graphics = CreateGraphics()) + { + var timestampSizeF = graphics.MeasureString(new TimeCode(0, 0, 33, 527).ToDisplayString(), Font); + timeStampWidth = (int)(timestampSizeF.Width + 0.5) + 11; + } + } + catch + { + timeStampWidth = 65; + } + if (startIdx >= 0) + { + if (_settings != null && _settings.General.ListViewColumnsRememberSize && _settings.General.ListViewStartWidth > 1) + { + Columns[startIdx].Width = _settings.General.ListViewStartWidth; + } + else + { + Columns[startIdx].Width = timeStampWidth; + } + } + if (endIdx >= 0) + { + if (_settings != null && _settings.General.ListViewColumnsRememberSize && _settings.General.ListViewEndWidth > 1) + { + Columns[endIdx].Width = _settings.General.ListViewEndWidth; + } + else + { + Columns[endIdx].Width = timeStampWidth; + } + } + + int w = 0; + for (int index = 0; index < SubtitleColumns.Count; index++) + { + var column = SubtitleColumns[index]; + int cw = Columns[index].Width; + if (cw < 10 || column == SubtitleColumn.Extra || column == SubtitleColumn.Network) + { + cw = 55; + if (column == SubtitleColumn.CharactersPerSeconds) + { + cw = 65; + } + else if (column == SubtitleColumn.WordsPerMinute) + { + cw = 70; + } + else if (column == SubtitleColumn.Gap) + { + cw = 60; + } + else if (column == SubtitleColumn.Actor) + { + cw = 70; + } + else if (column == SubtitleColumn.Region) + { + cw = 60; + } + else if (column != SubtitleColumn.Number) + { + cw = 120; + } + + Columns[index].Width = cw; + Columns[index].Width = cw; + Columns[index].Width = cw; + } + if (column != SubtitleColumn.Text && column != SubtitleColumn.TextAlternate) + { + w += cw; + } + } + + int lengthAvailable = Width - w; + if (ColumnIndexTextAlternate >= 0 && Columns.Count > ColumnIndexTextAlternate) + { + lengthAvailable = lengthAvailable / 2; + Columns[ColumnIndexTextAlternate].Width = lengthAvailable; + Columns[ColumnIndexTextAlternate].Width = lengthAvailable; + Columns[ColumnIndexTextAlternate].Width = lengthAvailable; + } + Columns[ColumnIndexText].Width = lengthAvailable; + Columns[ColumnIndexText].Width = lengthAvailable; + Columns[ColumnIndexText].Width = lengthAvailable; + SubtitleListViewLastColumnFill(this, null); + } + + public void ShowEndColumn(string title) + { + if (GetColumnIndex(SubtitleColumn.End) == -1) + { + var ch = new ColumnHeader { Text = title, TextAlign = RightToLeftLayout ? HorizontalAlignment.Right : HorizontalAlignment.Left }; + if (ColumnIndexStart >= 0) + { + SubtitleColumns.Insert(ColumnIndexStart + 1, SubtitleColumn.End); + Columns.Insert(ColumnIndexStart + 1, ch); + } + else if (ColumnIndexNumber >= 0) + { + SubtitleColumns.Insert(ColumnIndexNumber + 1, SubtitleColumn.End); + Columns.Insert(ColumnIndexStart + 1, ch); + } + else + { + SubtitleColumns.Add(SubtitleColumn.End); + Columns.Insert(0, ch); + } + UpdateColumnIndexes(); + + try + { + using (var graphics = Parent.CreateGraphics()) + { + var timestampSizeF = graphics.MeasureString(new TimeCode(0, 0, 33, 527).ToDisplayString(), Font); + var timestampWidth = (int)(timestampSizeF.Width + 0.5) + 11; + Columns[ColumnIndexEnd].Width = timestampWidth; + } + } + catch + { + Columns[ColumnIndexEnd].Width = 65; + } + + AutoSizeAllColumns(null); + } + } + + public void ShowDurationColumn(string title) + { + if (GetColumnIndex(SubtitleColumn.Duration) == -1) + { + var ch = new ColumnHeader { Text = title, TextAlign = RightToLeftLayout ? HorizontalAlignment.Right : HorizontalAlignment.Left }; + if (ColumnIndexEnd >= 0) + { + SubtitleColumns.Insert(ColumnIndexEnd + 1, SubtitleColumn.Duration); + Columns.Insert(ColumnIndexEnd + 1, ch); + } + else if (ColumnIndexStart >= 0) + { + SubtitleColumns.Insert(ColumnIndexStart + 1, SubtitleColumn.Duration); + Columns.Insert(ColumnIndexStart + 1, ch); + } + else if (ColumnIndexNumber >= 0) + { + SubtitleColumns.Insert(ColumnIndexNumber + 1, SubtitleColumn.Duration); + Columns.Insert(ColumnIndexStart + 1, ch); + } + else + { + SubtitleColumns.Add(SubtitleColumn.Duration); + Columns.Insert(0, ch); + } + UpdateColumnIndexes(); + + try + { + using (var graphics = Parent.CreateGraphics()) + { + var timestampSizeF = graphics.MeasureString(new TimeCode(0, 0, 33, 527).ToDisplayString(), Font); + var timestampWidth = (int)(timestampSizeF.Width + 0.5) + 11; + Columns[ColumnIndexDuration].Width = (int)(timestampWidth * 0.8); + } + } + catch + { + Columns[ColumnIndexDuration].Width = 55; + } + + AutoSizeAllColumns(null); + } + } + + public void ShowAlternateTextColumn(string title) + { + if (GetColumnIndex(SubtitleColumn.TextAlternate) == -1) + { + if (ColumnIndexText >= 0) + { + SubtitleColumns.Insert(ColumnIndexText + 1, SubtitleColumn.TextAlternate); + Columns.Insert(ColumnIndexText + 1, new ColumnHeader { Text = title }); + } + else + { + SubtitleColumns.Add(SubtitleColumn.TextAlternate); + Columns.Add(new ColumnHeader { Text = title }); + } + UpdateColumnIndexes(); + Columns[ColumnIndexTextAlternate].Width = 300; + Columns[ColumnIndexTextAlternate].Width = 300; + Columns[ColumnIndexTextAlternate].Width = 300; + AutoSizeAllColumns(null); + } + else + { + Columns[ColumnIndexTextAlternate].Text = title; + } + } + + public void ShowExtraColumn(string title) + { + if (GetColumnIndex(SubtitleColumn.Extra) == -1) + { + if (ColumnIndexNetwork >= 0) + { + SubtitleColumns.Insert(ColumnIndexNetwork, SubtitleColumn.Extra); + Columns.Insert(ColumnIndexNetwork, new ColumnHeader { Text = title, Width = 120 }); + } + else + { + SubtitleColumns.Add(SubtitleColumn.Extra); + Columns.Add(new ColumnHeader { Text = title, Width = 120 }); + } + UpdateColumnIndexes(); + Columns[ColumnIndexExtra].Width = 120; + Columns[ColumnIndexExtra].Width = 120; + Columns[ColumnIndexExtra].Width = 120; + AutoSizeAllColumns(null); + } + else + { + Columns[ColumnIndexExtra].Text = title; + } + } + + public void ShowNetworkColumn(string title) + { + if (GetColumnIndex(SubtitleColumn.Network) == -1) + { + SubtitleColumns.Add(SubtitleColumn.Network); + Columns.Add(new ColumnHeader { Text = title, Width = 120 }); + UpdateColumnIndexes(); + AutoSizeAllColumns(null); + } + } + + public void ShowCharsSecColumn(string title) + { + if (GetColumnIndex(SubtitleColumn.CharactersPerSeconds) == -1) + { + var ch = new ColumnHeader { Text = title, TextAlign = RightToLeftLayout ? HorizontalAlignment.Left : HorizontalAlignment.Right }; + if (ColumnIndexDuration >= 0) + { + SubtitleColumns.Insert(ColumnIndexDuration + 1, SubtitleColumn.CharactersPerSeconds); + Columns.Insert(ColumnIndexDuration + 1, ch); + } + else if (ColumnIndexEnd >= 0) + { + SubtitleColumns.Insert(ColumnIndexEnd + 1, SubtitleColumn.CharactersPerSeconds); + Columns.Insert(ColumnIndexEnd + 1, ch); + } + else if (ColumnIndexStart >= 0) + { + SubtitleColumns.Insert(ColumnIndexStart + 1, SubtitleColumn.CharactersPerSeconds); + Columns.Insert(ColumnIndexStart + 1, ch); + } + else + { + SubtitleColumns.Add(SubtitleColumn.CharactersPerSeconds); + Columns.Add(ch); + } + UpdateColumnIndexes(); + Columns[ColumnIndexCps].Width = 65; + Columns[ColumnIndexCps].Width = 65; + AutoSizeAllColumns(null); + } + } + + public void ShowWordsMinColumn(string title) + { + if (GetColumnIndex(SubtitleColumn.WordsPerMinute) == -1) + { + var ch = new ColumnHeader { Text = title, TextAlign = RightToLeftLayout ? HorizontalAlignment.Left : HorizontalAlignment.Right }; + if (ColumnIndexCps >= 0) + { + SubtitleColumns.Insert(ColumnIndexCps + 1, SubtitleColumn.WordsPerMinute); + Columns.Insert(ColumnIndexCps + 1, ch); + } + else if (ColumnIndexDuration >= 0) + { + SubtitleColumns.Insert(ColumnIndexDuration + 1, SubtitleColumn.WordsPerMinute); + Columns.Insert(ColumnIndexDuration + 1, ch); + } + else if (ColumnIndexEnd >= 0) + { + SubtitleColumns.Insert(ColumnIndexEnd + 1, SubtitleColumn.WordsPerMinute); + Columns.Insert(ColumnIndexEnd + 1, ch); + } + else if (ColumnIndexStart >= 0) + { + SubtitleColumns.Insert(ColumnIndexStart + 1, SubtitleColumn.WordsPerMinute); + Columns.Insert(ColumnIndexStart + 1, ch); + } + else + { + SubtitleColumns.Add(SubtitleColumn.WordsPerMinute); + Columns.Add(ch); + } + UpdateColumnIndexes(); + Columns[ColumnIndexWpm].Width = 70; + Columns[ColumnIndexWpm].Width = 70; + AutoSizeAllColumns(null); + } + } + + public void ShowGapColumn(string title) + { + if (GetColumnIndex(SubtitleColumn.Gap) == -1) + { + var ch = new ColumnHeader { Text = title }; + if (ColumnIndexWpm >= 0) + { + SubtitleColumns.Insert(ColumnIndexWpm + 1, SubtitleColumn.Gap); + Columns.Insert(ColumnIndexWpm + 1, ch); + } + else if (ColumnIndexCps >= 0) + { + SubtitleColumns.Insert(ColumnIndexCps + 1, SubtitleColumn.Gap); + Columns.Insert(ColumnIndexCps + 1, ch); + } + else if (ColumnIndexDuration >= 0) + { + SubtitleColumns.Insert(ColumnIndexDuration + 1, SubtitleColumn.Gap); + Columns.Insert(ColumnIndexDuration + 1, ch); + } + else if (ColumnIndexEnd >= 0) + { + SubtitleColumns.Insert(ColumnIndexEnd + 1, SubtitleColumn.Gap); + Columns.Insert(ColumnIndexEnd + 1, ch); + } + else if (ColumnIndexStart >= 0) + { + SubtitleColumns.Insert(ColumnIndexStart + 1, SubtitleColumn.Gap); + Columns.Insert(ColumnIndexStart + 1, ch); + } + else + { + SubtitleColumns.Add(SubtitleColumn.Gap); + Columns.Add(ch); + } + UpdateColumnIndexes(); + Columns[ColumnIndexGap].Width = 80; + Columns[ColumnIndexGap].Width = 80; + AutoSizeAllColumns(null); + } + } + + public void ShowActorColumn(string title) + { + if (GetColumnIndex(SubtitleColumn.Actor) == -1) + { + var ch = new ColumnHeader { Text = title }; + if (ColumnIndexGap >= 0) + { + SubtitleColumns.Insert(ColumnIndexGap + 1, SubtitleColumn.Actor); + Columns.Insert(ColumnIndexGap + 1, ch); + } + else if (ColumnIndexWpm >= 0) + { + SubtitleColumns.Insert(ColumnIndexWpm + 1, SubtitleColumn.Actor); + Columns.Insert(ColumnIndexWpm + 1, ch); + } + else if (ColumnIndexCps >= 0) + { + SubtitleColumns.Insert(ColumnIndexCps + 1, SubtitleColumn.Actor); + Columns.Insert(ColumnIndexCps + 1, ch); + } + else if (ColumnIndexDuration >= 0) + { + SubtitleColumns.Insert(ColumnIndexDuration + 1, SubtitleColumn.Actor); + Columns.Insert(ColumnIndexDuration + 1, ch); + } + else if (ColumnIndexEnd >= 0) + { + SubtitleColumns.Insert(ColumnIndexEnd + 1, SubtitleColumn.Actor); + Columns.Insert(ColumnIndexEnd + 1, ch); + } + else if (ColumnIndexStart >= 0) + { + SubtitleColumns.Insert(ColumnIndexStart + 1, SubtitleColumn.Actor); + Columns.Insert(ColumnIndexStart + 1, ch); + } + else + { + SubtitleColumns.Add(SubtitleColumn.Actor); + Columns.Add(ch); + } + UpdateColumnIndexes(); + Columns[ColumnIndexActor].Width = 80; + Columns[ColumnIndexActor].Width = 80; + AutoSizeAllColumns(null); + } + else + { + Columns[GetColumnIndex(SubtitleColumn.Actor)].Text = title; + } + } + + public void ShowRegionColumn(string title) + { + if (GetColumnIndex(SubtitleColumn.Region) == -1) + { + var ch = new ColumnHeader { Text = title }; + if (ColumnIndexActor >= 0) + { + SubtitleColumns.Insert(ColumnIndexActor + 1, SubtitleColumn.Region); + Columns.Insert(ColumnIndexActor + 1, ch); + } + else if (ColumnIndexGap >= 0) + { + SubtitleColumns.Insert(ColumnIndexGap + 1, SubtitleColumn.Region); + Columns.Insert(ColumnIndexGap + 1, ch); + } + else if (ColumnIndexWpm >= 0) + { + SubtitleColumns.Insert(ColumnIndexWpm + 1, SubtitleColumn.Region); + Columns.Insert(ColumnIndexWpm + 1, ch); + } + else if (ColumnIndexCps >= 0) + { + SubtitleColumns.Insert(ColumnIndexCps + 1, SubtitleColumn.Region); + Columns.Insert(ColumnIndexCps + 1, ch); + } + else if (ColumnIndexDuration >= 0) + { + SubtitleColumns.Insert(ColumnIndexDuration + 1, SubtitleColumn.Region); + Columns.Insert(ColumnIndexDuration + 1, ch); + } + else if (ColumnIndexEnd >= 0) + { + SubtitleColumns.Insert(ColumnIndexEnd + 1, SubtitleColumn.Region); + Columns.Insert(ColumnIndexEnd + 1, ch); + } + else if (ColumnIndexStart >= 0) + { + SubtitleColumns.Insert(ColumnIndexStart + 1, SubtitleColumn.Region); + Columns.Insert(ColumnIndexStart + 1, ch); + } + else + { + SubtitleColumns.Add(SubtitleColumn.Region); + Columns.Add(ch); + } + UpdateColumnIndexes(); + Columns[ColumnIndexRegion].Width = 80; + Columns[ColumnIndexRegion].Width = 80; + AutoSizeAllColumns(null); + } + } + + public void HideColumn(SubtitleColumn column) + { + var idx = GetColumnIndex(column); + if (idx >= 0) + { + SubtitleColumns.RemoveAt(idx); + UpdateColumnIndexes(); + Columns.RemoveAt(idx); + AutoSizeAllColumns(null); + } + } + + public void SubtitleListViewLastColumnFill(object sender, EventArgs e) + { + int width = 0; + for (int i = 0; i < Columns.Count - 1; i++) + { + width += Columns[i].Width; + } + if (Columns.Count > 0) + { + Columns[Columns.Count - 1].Width = Width - (width + 25); + } + } + + public void SaveFirstVisibleIndex() + { + if (TopItem != null) + { + FirstVisibleIndex = Items.Count > 0 ? TopItem.Index : -1; + } + } + + private void RestoreFirstVisibleIndex() + { + if (IsValidIndex(FirstVisibleIndex)) + { + if (FirstVisibleIndex + 1 < Items.Count) + { + FirstVisibleIndex++; + } + + Items[Items.Count - 1].EnsureVisible(); + Items[FirstVisibleIndex].EnsureVisible(); + } + } + + internal void Fill(Subtitle subtitle, Subtitle subtitleAlternate = null) + { + if (subtitleAlternate == null || subtitleAlternate.Paragraphs.Count == 0) + { + Fill(subtitle.Paragraphs); + } + else + { + Fill(subtitle.Paragraphs, subtitleAlternate.Paragraphs); + } + } + + internal void Fill(List paragraphs) + { + SaveFirstVisibleIndex(); + BeginUpdate(); + Items.Clear(); + var x = ListViewItemSorter; + ListViewItemSorter = null; + var font = new Font(_subtitleFontName, SubtitleFontSize, GetFontStyle()); + var items = new ListViewItem[paragraphs.Count]; + for (var index = 0; index < paragraphs.Count; index++) + { + var paragraph = paragraphs[index]; + Paragraph next = null; + if (index + 1 < paragraphs.Count) + { + next = paragraphs[index + 1]; + } + items[index] = MakeListViewItem(paragraph, next, null, font); + } + + Items.AddRange(items); + + if (UseSyntaxColoring && _settings != null) + { + for (var index = 0; index < paragraphs.Count; index++) + { + var paragraph = paragraphs[index]; + var item = items[index]; + SyntaxColorListViewItem(paragraphs, index, paragraph, item); + } + } + + ListViewItemSorter = x; + EndUpdate(); + + if (FirstVisibleIndex == 0) + { + FirstVisibleIndex = -1; + } + } + + internal void Fill(List paragraphs, List paragraphsAlternate) + { + SaveFirstVisibleIndex(); + BeginUpdate(); + Items.Clear(); + var x = ListViewItemSorter; + ListViewItemSorter = null; + var items = new ListViewItem[paragraphs.Count]; + var font = new Font(_subtitleFontName, SubtitleFontSize, GetFontStyle()); + for (var index = 0; index < paragraphs.Count; index++) + { + var paragraph = paragraphs[index]; + Paragraph alternate = Utilities.GetOriginalParagraph(index, paragraph, paragraphsAlternate); + Paragraph next = null; + if (index + 1 < paragraphs.Count) + { + next = paragraphs[index + 1]; + } + items[index] = MakeListViewItem(paragraph, next, alternate, font); + } + + Items.AddRange(items); + + if (UseSyntaxColoring && _settings != null) + { + for (var index = 0; index < paragraphs.Count; index++) + { + var paragraph = paragraphs[index]; + var item = items[index]; + SyntaxColorListViewItem(paragraphs, index, paragraph, item); + } + } + + ListViewItemSorter = x; + EndUpdate(); + + if (FirstVisibleIndex == 0) + { + FirstVisibleIndex = -1; + } + } + + public void SyntaxColorAllLines(Subtitle subtitle) + { + if (UseSyntaxColoring && _settings != null) + { + for (int index = 0; index < subtitle.Paragraphs.Count; index++) + { + var paragraph = subtitle.Paragraphs[index]; + SyntaxColorListViewItem(subtitle.Paragraphs, index, paragraph, Items[index]); + } + } + } + + public void SyntaxColorLine(List paragraphs, int i, Paragraph paragraph) + { + if (UseSyntaxColoring && _settings != null && IsValidIndex(i)) + { + var item = Items[i]; + SyntaxColorListViewItem(paragraphs, i, paragraph, item); + } + } + + private void SyntaxColorListViewItem(List paragraphs, int i, Paragraph paragraph, ListViewItem item) + { + if (item.UseItemStyleForSubItems) + { + item.UseItemStyleForSubItems = false; + item.SubItems[ColumnIndexDuration].BackColor = BackColor; + } + if (ColumnIndexCps >= 0) + { + item.SubItems[ColumnIndexCps].BackColor = BackColor; + } + if (ColumnIndexWpm >= 0) + { + item.SubItems[ColumnIndexWpm].BackColor = paragraph.WordsPerMinute > Configuration.Settings.General.SubtitleMaximumWordsPerMinute ? Configuration.Settings.Tools.ListViewSyntaxErrorColor : BackColor; + } + if (ColumnIndexDuration >= 0) + { + item.SubItems[ColumnIndexDuration].BackColor = BackColor; + } + + if (_settings.Tools.ListViewSyntaxColorDurationSmall) + { + double charactersPerSecond = Utilities.GetCharactersPerSecond(paragraph); + if (charactersPerSecond > Configuration.Settings.General.SubtitleMaximumCharactersPerSeconds) + { + if (ColumnIndexCps >= 0) + { + item.SubItems[ColumnIndexCps].BackColor = Configuration.Settings.Tools.ListViewSyntaxErrorColor; + } + else if (ColumnIndexDuration >= 0) + { + item.SubItems[ColumnIndexDuration].BackColor = Configuration.Settings.Tools.ListViewSyntaxErrorColor; + } + } + if (paragraph.Duration.TotalMilliseconds < Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds && ColumnIndexDuration >= 0) + { + item.SubItems[ColumnIndexDuration].BackColor = Configuration.Settings.Tools.ListViewSyntaxErrorColor; + } + } + if (_settings.Tools.ListViewSyntaxColorDurationBig && + paragraph.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds && + ColumnIndexDuration >= 0) + { + item.SubItems[ColumnIndexDuration].BackColor = Configuration.Settings.Tools.ListViewSyntaxErrorColor; + } + + if (_settings.Tools.ListViewSyntaxColorOverlap && i > 0 && i < paragraphs.Count && ColumnIndexEnd >= 0) + { + Paragraph prev = paragraphs[i - 1]; + if (paragraph.StartTime.TotalMilliseconds < prev.EndTime.TotalMilliseconds && !prev.EndTime.IsMaxTime) + { + Items[i - 1].SubItems[ColumnIndexEnd].BackColor = Configuration.Settings.Tools.ListViewSyntaxErrorColor; + item.SubItems[ColumnIndexStart].BackColor = Configuration.Settings.Tools.ListViewSyntaxErrorColor; + } + else + { + Items[i - 1].SubItems[ColumnIndexEnd].BackColor = BackColor; + item.SubItems[ColumnIndexStart].BackColor = BackColor; + } + } + + if (_settings.Tools.ListViewSyntaxColorGap && i >= 0 && i < paragraphs.Count - 1 && ColumnIndexGap >= 0) + { + Paragraph next = paragraphs[i + 1]; + if (next.StartTime.TotalMilliseconds - paragraph.EndTime.TotalMilliseconds < Configuration.Settings.General.MinimumMillisecondsBetweenLines) + { + item.SubItems[ColumnIndexGap].BackColor = Configuration.Settings.Tools.ListViewSyntaxErrorColor; + } + else + { + item.SubItems[ColumnIndexGap].BackColor = BackColor; + } + } + + if (ColumnIndexTextAlternate >= 0 && item.SubItems.Count >= ColumnIndexTextAlternate) + { + item.SubItems[ColumnIndexTextAlternate].BackColor = BackColor; + } + + if (ColumnIndexText >= item.SubItems.Count) + { + return; + } + + if (_settings.Tools.ListViewSyntaxColorLongLines) + { + string s = HtmlUtil.RemoveHtmlTags(paragraph.Text, true); + foreach (string line in s.SplitToLines()) + { + if (line.CountCharacters(false, Configuration.Settings.General.IgnoreArabicDiacritics) > Configuration.Settings.General.SubtitleLineMaximumLength) + { + item.SubItems[ColumnIndexText].BackColor = Configuration.Settings.Tools.ListViewSyntaxErrorColor; + return; + } + } + int noOfLines = paragraph.NumberOfLines; + if (s.CountCharacters(false, Configuration.Settings.General.IgnoreArabicDiacritics) <= Configuration.Settings.General.SubtitleLineMaximumLength * noOfLines) + { + if (noOfLines > Configuration.Settings.General.MaxNumberOfLines && _settings.Tools.ListViewSyntaxMoreThanXLines) + { + item.SubItems[ColumnIndexText].BackColor = Configuration.Settings.Tools.ListViewSyntaxErrorColor; + } + else + { + item.SubItems[ColumnIndexText].BackColor = BackColor; + } + } + else + { + item.SubItems[ColumnIndexText].BackColor = Configuration.Settings.Tools.ListViewSyntaxErrorColor; + } + } + if (_settings.Tools.ListViewSyntaxColorWideLines) + { + string s = HtmlUtil.RemoveHtmlTags(paragraph.Text, true); + foreach (string line in s.SplitToLines()) + { + if (TextWidth.CalcPixelWidth(line) > Configuration.Settings.General.SubtitleLineMaximumPixelWidth) + { + item.SubItems[ColumnIndexText].BackColor = Configuration.Settings.Tools.ListViewSyntaxErrorColor; + return; + } + } + } + if (_settings.Tools.ListViewSyntaxMoreThanXLines && + item.SubItems[ColumnIndexText].BackColor != Configuration.Settings.Tools.ListViewSyntaxErrorColor) + { + if (paragraph.NumberOfLines > Configuration.Settings.General.MaxNumberOfLines) + { + item.SubItems[ColumnIndexText].BackColor = Configuration.Settings.Tools.ListViewSyntaxErrorColor; + } + } + } + + private string GetDisplayTime(TimeCode timeCode) + { + if (Configuration.Settings.General.CurrentVideoOffsetInMs != 0) + { + return new TimeCode(timeCode.TotalMilliseconds + Configuration.Settings.General.CurrentVideoOffsetInMs).ToDisplayString(); + } + + return timeCode.ToDisplayString(); + } + + private ListViewItem MakeListViewItem(Paragraph paragraph, Paragraph next, Paragraph paragraphAlternate, Font font) + { + var item = new ListViewItem(paragraph.Number.ToString(CultureInfo.InvariantCulture)) { Tag = paragraph, UseItemStyleForSubItems = false }; + foreach (var column in SubtitleColumns) + { + switch (column) + { + case SubtitleColumn.Start: + item.SubItems.Add(GetDisplayTime(paragraph.StartTime)); + break; + case SubtitleColumn.End: + item.SubItems.Add(GetDisplayTime(paragraph.EndTime)); + break; + case SubtitleColumn.Duration: + item.SubItems.Add(paragraph.Duration.ToShortDisplayString()); + break; + case SubtitleColumn.CharactersPerSeconds: + item.SubItems.Add($"{Utilities.GetCharactersPerSecond(paragraph):0.00}"); + break; + case SubtitleColumn.WordsPerMinute: + item.SubItems.Add($"{paragraph.WordsPerMinute:0.00}"); + break; + case SubtitleColumn.Gap: + item.SubItems.Add(GetGap(paragraph, next)); + break; + case SubtitleColumn.Actor: + item.SubItems.Add(paragraph.Actor); + break; + case SubtitleColumn.Region: + item.SubItems.Add(paragraph.Region); + break; + case SubtitleColumn.Text: + item.SubItems.Add(paragraph.Text.Replace(Environment.NewLine, _lineSeparatorString)); + break; + case SubtitleColumn.TextAlternate: + var text = paragraphAlternate != null ? paragraphAlternate.Text : string.Empty; + item.SubItems.Add(text.Replace(Environment.NewLine, _lineSeparatorString)); + break; + case SubtitleColumn.Extra: + item.SubItems.Add(paragraph.Extra); + break; + case SubtitleColumn.Network: + item.SubItems.Add(string.Empty); + break; + } + } + + item.StateImageIndex = paragraph.Bookmark != null ? 0 : -1; + item.Font = font; + return item; + } + + public void SelectNone() + { + for (var i = Items.Count - 1; i >= 0; i--) + { + Items[i].Selected = false; + } + } + + public void SelectIndexAndEnsureVisibleFaster(int index) + { + var topItem = TopItem; + if (!IsValidIndex(index) || topItem == null) + { + return; + } + + BeginUpdate(); + foreach (var selectedIndex in GetSelectedIndices()) + { + Items[selectedIndex].Selected = false; + } + + var selectedItem = Items[index]; + selectedItem.Selected = true; + selectedItem.Focused = true; + + var topIndex = topItem.Index; + var numberOfVisibleItems = (Height - 30) / GetItemRect(0).Height; + int bottomIndex = topIndex + numberOfVisibleItems; + if (index >= bottomIndex) + { + Items[Math.Min(Items.Count - 1, index + numberOfVisibleItems / 2)].EnsureVisible(); + } + else if (index < topIndex) + { + Items[Math.Max(0, index - numberOfVisibleItems / 2)].EnsureVisible(); + } + EndUpdate(); + } + + public void SelectIndexAndEnsureVisible(int index, bool focus) + { + if (!IsValidIndex(index)) + { + return; + } + + if (TopItem == null) + { + EnsureVisible(index); + if (focus) + { + Items[index].Focused = true; + } + return; + } + + int bottomIndex = TopItem.Index + (Height - 25) / 16; + int itemsBeforeAfterCount = (bottomIndex - TopItem.Index) / 2 - 1; + if (itemsBeforeAfterCount < 0) + { + itemsBeforeAfterCount = 1; + } + + int beforeIndex = index - itemsBeforeAfterCount; + if (beforeIndex < 0) + { + beforeIndex = 0; + } + + int afterIndex = index + itemsBeforeAfterCount; + if (afterIndex >= Items.Count) + { + afterIndex = Items.Count - 1; + } + + SelectNone(); + if (TopItem.Index <= beforeIndex && bottomIndex > afterIndex) + { + Items[index].Selected = true; + Items[index].EnsureVisible(); + if (focus) + { + Items[index].Focused = true; + } + EnsureVisible(index); + return; + } + + Items[beforeIndex].EnsureVisible(); + EnsureVisible(beforeIndex); + Items[afterIndex].EnsureVisible(); + EnsureVisible(afterIndex); + Items[index].Selected = true; + Items[index].EnsureVisible(); + if (focus) + { + Items[index].Focused = true; + } + EnsureVisible(index); + } + + public void SelectIndexAndEnsureVisible(int index) + { + SelectIndexAndEnsureVisible(index, false); + } + + public void SelectIndexAndEnsureVisible(Paragraph p) + { + SelectNone(); + if (p == null) + { + return; + } + + for (int index = 0; index < Items.Count; index++) + { + ListViewItem item = Items[index]; + if (item.Tag as Paragraph == p || + item.Text == p.Number.ToString(CultureInfo.InvariantCulture) && + (ColumnIndexStart < 0 || item.SubItems[ColumnIndexStart].Text == GetDisplayTime(p.StartTime)) && + (ColumnIndexEnd < 0 || item.SubItems[ColumnIndexEnd].Text == GetDisplayTime(p.EndTime)) && + item.SubItems[ColumnIndexText].Text == p.Text) + { + RestoreFirstVisibleIndex(); + item.Selected = true; + item.EnsureVisible(); + return; + } + } + } + + public Paragraph GetSelectedParagraph(Subtitle subtitle) + { + if (subtitle != null && SelectedItems.Count > 0) + { + return subtitle.GetParagraphOrDefault(SelectedItems[0].Index); + } + + return null; + } + + public string GetText(int index) + { + if (IsValidIndex(index)) + { + return Items[index].SubItems[ColumnIndexText].Text.Replace(_lineSeparatorString, Environment.NewLine); + } + + return null; + } + + public string GetTextAlternate(int index) + { + if (IsValidIndex(index) && ColumnIndexTextAlternate >= 0) + { + return Items[index].SubItems[ColumnIndexTextAlternate].Text.Replace(_lineSeparatorString, Environment.NewLine); + } + + return null; + } + + public void SetText(int index, string text) + { + if (IsValidIndex(index)) + { + ListViewItem item = Items[index]; + if (ColumnIndexText >= 0) + { + item.SubItems[ColumnIndexText].Text = text.Replace(Environment.NewLine, _lineSeparatorString); + } + + if (item.Tag is Paragraph paragraph) + { + UpdateCpsAndWpm(item, paragraph); + } + } + } + + public void SetTimeAndText(int index, Paragraph paragraph, Paragraph next) + { + if (IsValidIndex(index)) + { + ListViewItem item = Items[index]; + if (ColumnIndexStart >= 0) + { + item.SubItems[ColumnIndexStart].Text = GetDisplayTime(paragraph.StartTime); + } + + if (ColumnIndexEnd >= 0) + { + item.SubItems[ColumnIndexEnd].Text = GetDisplayTime(paragraph.EndTime); + } + + if (ColumnIndexDuration >= 0) + { + item.SubItems[ColumnIndexDuration].Text = paragraph.Duration.ToShortDisplayString(); + } + + if (ColumnIndexGap >= 0) + { + item.SubItems[ColumnIndexGap].Text = GetGap(paragraph, next); + } + + if (ColumnIndexActor >= 0) + { + item.SubItems[ColumnIndexActor].Text = paragraph.Actor; + } + + if (ColumnIndexRegion >= 0) + { + item.SubItems[ColumnIndexRegion].Text = paragraph.Region; + } + + if (ColumnIndexText >= 0) + { + item.SubItems[ColumnIndexText].Text = paragraph.Text.Replace(Environment.NewLine, _lineSeparatorString); + } + + UpdateCpsAndWpm(item, paragraph); + } + } + + private void UpdateCpsAndWpm(ListViewItem item, Paragraph paragraph) + { + if (ColumnIndexCps >= 0) + { + item.SubItems[ColumnIndexCps].Text = $"{Utilities.GetCharactersPerSecond(paragraph):0.00}"; + } + if (ColumnIndexWpm >= 0) + { + item.SubItems[ColumnIndexWpm].Text = $"{paragraph.WordsPerMinute:0.00}"; + } + } + + public void SetExtraText(int index, string text, Color color) + { + if (IsValidIndex(index)) + { + if (GetColumnIndex(SubtitleColumn.Extra) == -1) + { + ShowExtraColumn(string.Empty); + } + while (ColumnIndexExtra >= Items[index].SubItems.Count) + { + Items[index].SubItems.Add(string.Empty); + } + + if (ColumnIndexExtra >= 0) + { + Items[index].SubItems[ColumnIndexExtra].Text = text; + Items[index].UseItemStyleForSubItems = false; + Items[index].SubItems[ColumnIndexExtra].BackColor = BackColor; + Items[index].SubItems[ColumnIndexExtra].ForeColor = color; + } + } + } + + public void SetNetworkText(int index, string text, Color color) + { + if (IsValidIndex(index)) + { + if (GetColumnIndex(SubtitleColumn.Network) == -1) + { + ShowNetworkColumn(string.Empty); + } + while (ColumnIndexNetwork >= Items[index].SubItems.Count) + { + Items[index].SubItems.Add(string.Empty); + } + + if (ColumnIndexNetwork >= 0) + { + Items[index].SubItems[ColumnIndexNetwork].Text = text; + Items[index].UseItemStyleForSubItems = false; + Items[index].SubItems[ColumnIndexNetwork].BackColor = Color.AntiqueWhite; + Items[index].SubItems[ColumnIndexNetwork].ForeColor = color; + } + } + } + + public void SetAlternateText(int index, string text) + { + if (IsValidIndex(index) && Columns.Count >= ColumnIndexTextAlternate + 1) + { + if (GetColumnIndex(SubtitleColumn.TextAlternate) == -1) + { + ShowAlternateTextColumn(string.Empty); + } + while (ColumnIndexTextAlternate >= Items[index].SubItems.Count) + { + Items[index].SubItems.Add(string.Empty); + } + + if (ColumnIndexTextAlternate >= 0) + { + Items[index].SubItems[ColumnIndexTextAlternate].Text = text.Replace(Environment.NewLine, _lineSeparatorString); + Items[index].UseItemStyleForSubItems = false; + Items[index].SubItems[ColumnIndexTextAlternate].BackColor = BackColor; + } + } + } + + public void SetDuration(int index, Paragraph paragraph, Paragraph next) + { + if (IsValidIndex(index)) + { + ListViewItem item = Items[index]; + if (ColumnIndexEnd >= 0) + { + item.SubItems[ColumnIndexEnd].Text = GetDisplayTime(paragraph.EndTime); + } + + if (ColumnIndexDuration >= 0) + { + item.SubItems[ColumnIndexDuration].Text = paragraph.Duration.ToShortDisplayString(); + } + + if (ColumnIndexGap >= 0) + { + item.SubItems[ColumnIndexGap].Text = GetGap(paragraph, next); + } + + UpdateCpsAndWpm(item, paragraph); + } + } + + public void SetNumber(int index, string number) + { + if (IsValidIndex(index) && ColumnIndexNumber >= 0) + { + Items[index].SubItems[ColumnIndexNumber].Text = number; + } + } + + public void UpdateFrames(Subtitle subtitle) + { + if (Configuration.Settings?.General.UseTimeFormatHHMMSSFF == true) + { + BeginUpdate(); + for (int i = 0; i < subtitle.Paragraphs.Count; i++) + { + if (IsValidIndex(i)) + { + Paragraph p = subtitle.Paragraphs[i]; + ListViewItem item = Items[i]; + if (ColumnIndexStart >= 0) + { + item.SubItems[ColumnIndexStart].Text = GetDisplayTime(p.StartTime); + } + + if (ColumnIndexEnd >= 0) + { + item.SubItems[ColumnIndexEnd].Text = GetDisplayTime(p.EndTime); + } + + if (ColumnIndexDuration >= 0) + { + item.SubItems[ColumnIndexDuration].Text = p.Duration.ToShortDisplayString(); + } + } + } + EndUpdate(); + } + } + + public void SetStartTimeAndDuration(int index, Paragraph paragraph, Paragraph next, Paragraph prev) + { + if (IsValidIndex(index)) + { + ListViewItem item = Items[index]; + if (ColumnIndexStart >= 0) + { + item.SubItems[ColumnIndexStart].Text = GetDisplayTime(paragraph.StartTime); + } + + if (ColumnIndexEnd >= 0) + { + item.SubItems[ColumnIndexEnd].Text = GetDisplayTime(paragraph.EndTime); + } + + if (ColumnIndexDuration >= 0) + { + item.SubItems[ColumnIndexDuration].Text = paragraph.Duration.ToShortDisplayString(); + } + + if (ColumnIndexGap >= 0) + { + item.SubItems[ColumnIndexGap].Text = GetGap(paragraph, next); + } + + UpdateCpsAndWpm(item, paragraph); + } + SetGap(index - 1, prev, paragraph); + } + + private void SetGap(int index, Paragraph paragraph, Paragraph next) + { + if (IsValidIndex(index)) + { + ListViewItem item = Items[index]; + if (ColumnIndexGap >= 0) + { + item.SubItems[ColumnIndexGap].Text = GetGap(paragraph, next); + } + } + } + + private string GetGap(Paragraph paragraph, Paragraph next) + { + if (next == null || paragraph == null || next.StartTime.IsMaxTime || paragraph.EndTime.IsMaxTime) + { + return string.Empty; + } + + return new TimeCode(next.StartTime.TotalMilliseconds - paragraph.EndTime.TotalMilliseconds).ToShortDisplayString(); + } + + public void SetBackgroundColor(int index, Color color, int columnNumber) + { + if (IsValidIndex(index)) + { + ListViewItem item = Items[index]; + if (item.UseItemStyleForSubItems) + { + item.UseItemStyleForSubItems = false; + } + + if (columnNumber >= 0 && columnNumber < item.SubItems.Count) + { + item.SubItems[columnNumber].BackColor = color; + } + } + } + + public void SetBackgroundColor(int index, Color color) + { + if (IsValidIndex(index)) + { + ListViewItem item = Items[index]; + item.BackColor = color; + if (ColumnIndexStart >= 0) + { + Items[index].SubItems[ColumnIndexStart].BackColor = color; + } + + if (ColumnIndexEnd >= 0) + { + Items[index].SubItems[ColumnIndexEnd].BackColor = color; + } + + if (ColumnIndexDuration >= 0) + { + Items[index].SubItems[ColumnIndexDuration].BackColor = color; + } + + if (ColumnIndexCps >= 0) + { + Items[index].SubItems[ColumnIndexCps].BackColor = color; + } + + if (ColumnIndexWpm >= 0) + { + Items[index].SubItems[ColumnIndexWpm].BackColor = color; + } + + if (ColumnIndexGap >= 0) + { + Items[index].SubItems[ColumnIndexGap].BackColor = color; + } + + if (ColumnIndexText >= 0) + { + Items[index].SubItems[ColumnIndexText].BackColor = color; + } + + if (ColumnIndexTextAlternate >= 0) + { + Items[index].SubItems[ColumnIndexTextAlternate].BackColor = color; + } + } + } + + public Color GetBackgroundColor(int index) + { + if (IsValidIndex(index)) + { + ListViewItem item = Items[index]; + return item.BackColor; + } + return DefaultBackColor; + } + + /// + /// Removes all text and set background color + /// + /// + /// + public void ColorOut(int index, Color color) + { + if (IsValidIndex(index)) + { + ListViewItem item = Items[index]; + item.Text = string.Empty; + if (ColumnIndexStart >= 0) + { + item.SubItems[ColumnIndexStart].Text = string.Empty; + } + + if (ColumnIndexEnd >= 0) + { + item.SubItems[ColumnIndexEnd].Text = string.Empty; + } + + if (ColumnIndexDuration >= 0) + { + item.SubItems[ColumnIndexDuration].Text = string.Empty; + } + + if (ColumnIndexText >= 0) + { + item.SubItems[ColumnIndexText].Text = string.Empty; + } + + if (ColumnIndexGap >= 0) + { + item.SubItems[ColumnIndexGap].Text = string.Empty; + } + + SetBackgroundColor(index, color); + } + } + + public void HideNonVobSubColumns() + { + var numberIdx = GetColumnIndex(SubtitleColumn.Number); + if (numberIdx >= 0) + { + Columns[numberIdx].Width = 0; + } + + HideColumn(SubtitleColumn.End); + HideColumn(SubtitleColumn.Duration); + HideColumn(SubtitleColumn.CharactersPerSeconds); + HideColumn(SubtitleColumn.WordsPerMinute); + } + + public void SetCustomResize(EventHandler handler) + { + if (handler == null) + { + return; + } + + Resize -= SubtitleListViewLastColumnFill; + Resize += handler; + } + + private bool IsValidIndex(int index) + { + return index >= 0 && index < Items.Count; + } + + private FontStyle GetFontStyle() => SubtitleFontBold ? FontStyle.Bold : FontStyle.Regular; + + public void ShowState(int index, Paragraph paragraph) + { + if (IsValidIndex(index)) + { + Items[index].StateImageIndex = paragraph.Bookmark != null ? 0 : -1; + } + } + + /// + /// Get SelectedIndices as array for faster performance. + /// + /// SelectedIndices as int array + public int[] GetSelectedIndices() + { + var selectedIndices = new int[SelectedIndices.Count]; + SelectedIndices.CopyTo(selectedIndices, 0); + return selectedIndices; + } + } +} diff --git a/src/Controls/TimeUpDown.Designer.cs b/src/ui/Controls/TimeUpDown.Designer.cs similarity index 97% rename from src/Controls/TimeUpDown.Designer.cs rename to src/ui/Controls/TimeUpDown.Designer.cs index feb28a472..7bb16d1b9 100644 --- a/src/Controls/TimeUpDown.Designer.cs +++ b/src/ui/Controls/TimeUpDown.Designer.cs @@ -1,78 +1,78 @@ -namespace Nikse.SubtitleEdit.Controls -{ - sealed partial class TimeUpDown - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.maskedTextBox1 = new System.Windows.Forms.MaskedTextBox(); - this.numericUpDown1 = new System.Windows.Forms.NumericUpDown(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit(); - this.SuspendLayout(); - // - // maskedTextBox1 - // - this.maskedTextBox1.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.maskedTextBox1.InsertKeyMode = System.Windows.Forms.InsertKeyMode.Overwrite; - this.maskedTextBox1.Location = new System.Drawing.Point(4, 3); - this.maskedTextBox1.Mask = "00:00:00.000"; - this.maskedTextBox1.Name = "maskedTextBox1"; - this.maskedTextBox1.Size = new System.Drawing.Size(71, 13); - this.maskedTextBox1.TabIndex = 21; - this.maskedTextBox1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.MaskedTextBox1KeyDown); - this.maskedTextBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.maskedTextBox1_MouseDown); - // - // numericUpDown1 - // - this.numericUpDown1.Location = new System.Drawing.Point(2, 1); - this.numericUpDown1.Name = "numericUpDown1"; - this.numericUpDown1.Size = new System.Drawing.Size(91, 20); - this.numericUpDown1.TabIndex = 20; - this.numericUpDown1.TabStop = false; - // - // TimeUpDown - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.AutoSize = true; - this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.Controls.Add(this.maskedTextBox1); - this.Controls.Add(this.numericUpDown1); - this.Name = "TimeUpDown"; - this.Size = new System.Drawing.Size(96, 24); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.MaskedTextBox maskedTextBox1; - private System.Windows.Forms.NumericUpDown numericUpDown1; - - } -} +namespace Nikse.SubtitleEdit.Controls +{ + sealed partial class TimeUpDown + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.maskedTextBox1 = new System.Windows.Forms.MaskedTextBox(); + this.numericUpDown1 = new System.Windows.Forms.NumericUpDown(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit(); + this.SuspendLayout(); + // + // maskedTextBox1 + // + this.maskedTextBox1.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.maskedTextBox1.InsertKeyMode = System.Windows.Forms.InsertKeyMode.Overwrite; + this.maskedTextBox1.Location = new System.Drawing.Point(4, 3); + this.maskedTextBox1.Mask = "00:00:00.000"; + this.maskedTextBox1.Name = "maskedTextBox1"; + this.maskedTextBox1.Size = new System.Drawing.Size(71, 13); + this.maskedTextBox1.TabIndex = 21; + this.maskedTextBox1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.MaskedTextBox1KeyDown); + this.maskedTextBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.maskedTextBox1_MouseDown); + // + // numericUpDown1 + // + this.numericUpDown1.Location = new System.Drawing.Point(2, 1); + this.numericUpDown1.Name = "numericUpDown1"; + this.numericUpDown1.Size = new System.Drawing.Size(91, 20); + this.numericUpDown1.TabIndex = 20; + this.numericUpDown1.TabStop = false; + // + // TimeUpDown + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.AutoSize = true; + this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.Controls.Add(this.maskedTextBox1); + this.Controls.Add(this.numericUpDown1); + this.Name = "TimeUpDown"; + this.Size = new System.Drawing.Size(96, 24); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.MaskedTextBox maskedTextBox1; + private System.Windows.Forms.NumericUpDown numericUpDown1; + + } +} diff --git a/src/Controls/TimeUpDown.cs b/src/ui/Controls/TimeUpDown.cs similarity index 97% rename from src/Controls/TimeUpDown.cs rename to src/ui/Controls/TimeUpDown.cs index bd54c7495..ea9704325 100644 --- a/src/Controls/TimeUpDown.cs +++ b/src/ui/Controls/TimeUpDown.cs @@ -1,343 +1,343 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Globalization; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Controls -{ - public sealed partial class TimeUpDown : UserControl - { - public enum TimeMode - { - HHMMSSMS, - HHMMSSFF - } - - private readonly bool _designMode = LicenseManager.UsageMode == LicenseUsageMode.Designtime; - - private const int NumericUpDownValue = 50; - - public EventHandler TimeCodeChanged; - - private bool _forceHHMMSSFF; - - public bool UseVideoOffset { get; set; } - - private static readonly char[] SplitChars = GetSplitChars(); - - private bool _dirty; - double _initialTotalMilliseconds; - - internal void ForceHHMMSSFF() - { - _forceHHMMSSFF = true; - maskedTextBox1.Mask = "00:00:00:00"; - } - - public TimeMode Mode - { - get - { - if (_forceHHMMSSFF || Configuration.Settings?.General.UseTimeFormatHHMMSSFF == true) - { - return TimeMode.HHMMSSFF; - } - - return TimeMode.HHMMSSMS; - } - } - - public void SetAutoWidth() - { - int width; - using (var g = Graphics.FromHwnd(IntPtr.Zero)) - { - var widthOfUpDown = 25; - if (Configuration.IsRunningOnLinux) - { - widthOfUpDown += 20; - } - var actualWidth = g.MeasureString("00:00:00:000", Font).Width; - width = (int)Math.Round(actualWidth + widthOfUpDown); - } - var diff = Width - width; - maskedTextBox1.Width -= diff; - numericUpDown1.Width -= diff; - } - - private static char[] GetSplitChars() - { - var splitChars = new List { ':', ',', '.' }; - string cultureSeparator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator; - if (cultureSeparator.Length == 1) - { - var ch = Convert.ToChar(cultureSeparator); - if (!splitChars.Contains(ch)) - { - splitChars.Add(ch); - } - } - return splitChars.ToArray(); - } - - public TimeUpDown() - { - Font = UiUtil.GetDefaultFont(); - InitializeComponent(); - UiUtil.FixFonts(this); - numericUpDown1.ValueChanged += NumericUpDownValueChanged; - numericUpDown1.Value = NumericUpDownValue; - maskedTextBox1.InsertKeyMode = InsertKeyMode.Overwrite; - } - - private void NumericUpDownValueChanged(object sender, EventArgs e) - { - _dirty = true; - double? milliseconds = GetTotalMilliseconds(); - if (milliseconds.HasValue) - { - if (milliseconds.Value >= TimeCode.MaxTimeTotalMilliseconds - 0.1) - { - milliseconds = 0; - } - - if (Mode == TimeMode.HHMMSSMS) - { - if (numericUpDown1.Value > NumericUpDownValue) - { - SetTotalMilliseconds(milliseconds.Value + 100); - } - else if (numericUpDown1.Value < NumericUpDownValue) - { - SetTotalMilliseconds(milliseconds.Value - 100); - } - } - else - { - if (numericUpDown1.Value > NumericUpDownValue) - { - SetTotalMilliseconds(milliseconds.Value + Core.SubtitleFormats.SubtitleFormat.FramesToMilliseconds(1)); - } - else if (numericUpDown1.Value < NumericUpDownValue) - { - SetTotalMilliseconds(milliseconds.Value - Core.SubtitleFormats.SubtitleFormat.FramesToMilliseconds(1)); - } - } - TimeCodeChanged?.Invoke(this, e); - } - numericUpDown1.Value = NumericUpDownValue; - } - - public MaskedTextBox MaskedTextBox => maskedTextBox1; - - public void SetTotalMilliseconds(double milliseconds) - { - _dirty = false; - _initialTotalMilliseconds = milliseconds; - if (UseVideoOffset) - { - milliseconds += Configuration.Settings.General.CurrentVideoOffsetInMs; - } - if (Mode == TimeMode.HHMMSSMS) - { - maskedTextBox1.Mask = GetMask(milliseconds); - maskedTextBox1.Text = new TimeCode(milliseconds).ToString(); - } - else - { - var tc = new TimeCode(milliseconds); - maskedTextBox1.Mask = GetMaskFrames(milliseconds); - maskedTextBox1.Text = tc.ToString().Substring(0, 9) + $"{Core.SubtitleFormats.SubtitleFormat.MillisecondsToFrames(tc.Milliseconds):00}"; - } - _dirty = false; - } - - public double? GetTotalMilliseconds() - { - return _dirty ? TimeCode?.TotalMilliseconds : _initialTotalMilliseconds; - } - - public TimeCode TimeCode - { - get - { - if (_designMode) - { - return new TimeCode(); - } - - if (string.IsNullOrWhiteSpace(maskedTextBox1.Text.RemoveChar('.').Replace(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, string.Empty).RemoveChar(',').RemoveChar(':'))) - { - return new TimeCode(TimeCode.MaxTimeTotalMilliseconds); - } - - if (!_dirty) - { - return new TimeCode(_initialTotalMilliseconds); - } - - string startTime = maskedTextBox1.Text; - bool isNegative = startTime.StartsWith('-'); - startTime = startTime.TrimStart('-').Replace(' ', '0'); - if (Mode == TimeMode.HHMMSSMS) - { - if (startTime.EndsWith(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, StringComparison.Ordinal)) - { - startTime += "000"; - } - - var times = startTime.Split(SplitChars, StringSplitOptions.RemoveEmptyEntries); - - if (times.Length == 4) - { - int.TryParse(times[0], out var hours); - - int.TryParse(times[1], out var minutes); - if (minutes > 59) - { - minutes = 59; - } - - int.TryParse(times[2], out var seconds); - if (seconds > 59) - { - seconds = 59; - } - - int.TryParse(times[3].PadRight(3, '0'), out var milliseconds); - var tc = new TimeCode(hours, minutes, seconds, milliseconds); - - if (UseVideoOffset) - { - tc.TotalMilliseconds -= Configuration.Settings.General.CurrentVideoOffsetInMs; - } - - if (isNegative) - { - tc.TotalMilliseconds *= -1; - } - - return tc; - } - } - else - { - if (startTime.EndsWith(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, StringComparison.Ordinal) || startTime.EndsWith(':')) - { - startTime += "00"; - } - - string[] times = startTime.Split(SplitChars, StringSplitOptions.RemoveEmptyEntries); - - if (times.Length == 4) - { - int.TryParse(times[0], out var hours); - - int.TryParse(times[1], out var minutes); - - int.TryParse(times[2], out var seconds); - - if (int.TryParse(times[3], out var milliseconds)) - { - milliseconds = Core.SubtitleFormats.SubtitleFormat.FramesToMillisecondsMax999(milliseconds); - } - - var tc = new TimeCode(hours, minutes, seconds, milliseconds); - - if (UseVideoOffset) - { - tc.TotalMilliseconds -= Configuration.Settings.General.CurrentVideoOffsetInMs; - } - - if (isNegative) - { - tc.TotalMilliseconds *= -1; - } - - return tc; - } - } - return null; - } - set - { - if (_designMode) - { - return; - } - - if (value != null) - { - _dirty = false; - _initialTotalMilliseconds = value.TotalMilliseconds; - } - - if (value == null || value.TotalMilliseconds >= TimeCode.MaxTimeTotalMilliseconds - 0.1) - { - maskedTextBox1.Text = string.Empty; - return; - } - - var v = new TimeCode(value.TotalMilliseconds); - if (UseVideoOffset) - { - v.TotalMilliseconds += Configuration.Settings.General.CurrentVideoOffsetInMs; - } - - if (Mode == TimeMode.HHMMSSMS) - { - maskedTextBox1.Mask = GetMask(v.TotalMilliseconds); - maskedTextBox1.Text = v.ToString(); - } - else - { - maskedTextBox1.Mask = GetMaskFrames(v.TotalMilliseconds); - maskedTextBox1.Text = v.ToHHMMSSFF(); - } - } - } - - private void MaskedTextBox1KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyData == Keys.Up) - { - numericUpDown1.UpButton(); - e.SuppressKeyPress = true; - } - else if (e.KeyData == Keys.Down) - { - numericUpDown1.DownButton(); - e.SuppressKeyPress = true; - } - else if (e.KeyData == Keys.Enter) - { - TimeCodeChanged?.Invoke(this, e); - e.SuppressKeyPress = true; - } - else if (e.KeyData != (Keys.Tab | Keys.Shift) && - e.KeyData != Keys.Tab && - e.KeyData != Keys.Left && - e.KeyData != Keys.Right) - { - _dirty = true; - } - } - - private static string GetMask(double val) => val >= 0 ? "00:00:00.000" : "-00:00:00.000"; - - private static string GetMaskFrames(double val) => val >= 0 ? "00:00:00:00" : "-00:00:00:00"; - - private void maskedTextBox1_MouseDown(object sender, MouseEventArgs e) - { - if (e.Button == MouseButtons.Right) - { - _dirty = true; - } - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Globalization; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Controls +{ + public sealed partial class TimeUpDown : UserControl + { + public enum TimeMode + { + HHMMSSMS, + HHMMSSFF + } + + private readonly bool _designMode = LicenseManager.UsageMode == LicenseUsageMode.Designtime; + + private const int NumericUpDownValue = 50; + + public EventHandler TimeCodeChanged; + + private bool _forceHHMMSSFF; + + public bool UseVideoOffset { get; set; } + + private static readonly char[] SplitChars = GetSplitChars(); + + private bool _dirty; + double _initialTotalMilliseconds; + + internal void ForceHHMMSSFF() + { + _forceHHMMSSFF = true; + maskedTextBox1.Mask = "00:00:00:00"; + } + + public TimeMode Mode + { + get + { + if (_forceHHMMSSFF || Configuration.Settings?.General.UseTimeFormatHHMMSSFF == true) + { + return TimeMode.HHMMSSFF; + } + + return TimeMode.HHMMSSMS; + } + } + + public void SetAutoWidth() + { + int width; + using (var g = Graphics.FromHwnd(IntPtr.Zero)) + { + var widthOfUpDown = 25; + if (Configuration.IsRunningOnLinux) + { + widthOfUpDown += 20; + } + var actualWidth = g.MeasureString("00:00:00:000", Font).Width; + width = (int)Math.Round(actualWidth + widthOfUpDown); + } + var diff = Width - width; + maskedTextBox1.Width -= diff; + numericUpDown1.Width -= diff; + } + + private static char[] GetSplitChars() + { + var splitChars = new List { ':', ',', '.' }; + string cultureSeparator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator; + if (cultureSeparator.Length == 1) + { + var ch = Convert.ToChar(cultureSeparator); + if (!splitChars.Contains(ch)) + { + splitChars.Add(ch); + } + } + return splitChars.ToArray(); + } + + public TimeUpDown() + { + Font = UiUtil.GetDefaultFont(); + InitializeComponent(); + UiUtil.FixFonts(this); + numericUpDown1.ValueChanged += NumericUpDownValueChanged; + numericUpDown1.Value = NumericUpDownValue; + maskedTextBox1.InsertKeyMode = InsertKeyMode.Overwrite; + } + + private void NumericUpDownValueChanged(object sender, EventArgs e) + { + _dirty = true; + double? milliseconds = GetTotalMilliseconds(); + if (milliseconds.HasValue) + { + if (milliseconds.Value >= TimeCode.MaxTimeTotalMilliseconds - 0.1) + { + milliseconds = 0; + } + + if (Mode == TimeMode.HHMMSSMS) + { + if (numericUpDown1.Value > NumericUpDownValue) + { + SetTotalMilliseconds(milliseconds.Value + 100); + } + else if (numericUpDown1.Value < NumericUpDownValue) + { + SetTotalMilliseconds(milliseconds.Value - 100); + } + } + else + { + if (numericUpDown1.Value > NumericUpDownValue) + { + SetTotalMilliseconds(milliseconds.Value + Core.SubtitleFormats.SubtitleFormat.FramesToMilliseconds(1)); + } + else if (numericUpDown1.Value < NumericUpDownValue) + { + SetTotalMilliseconds(milliseconds.Value - Core.SubtitleFormats.SubtitleFormat.FramesToMilliseconds(1)); + } + } + TimeCodeChanged?.Invoke(this, e); + } + numericUpDown1.Value = NumericUpDownValue; + } + + public MaskedTextBox MaskedTextBox => maskedTextBox1; + + public void SetTotalMilliseconds(double milliseconds) + { + _dirty = false; + _initialTotalMilliseconds = milliseconds; + if (UseVideoOffset) + { + milliseconds += Configuration.Settings.General.CurrentVideoOffsetInMs; + } + if (Mode == TimeMode.HHMMSSMS) + { + maskedTextBox1.Mask = GetMask(milliseconds); + maskedTextBox1.Text = new TimeCode(milliseconds).ToString(); + } + else + { + var tc = new TimeCode(milliseconds); + maskedTextBox1.Mask = GetMaskFrames(milliseconds); + maskedTextBox1.Text = tc.ToString().Substring(0, 9) + $"{Core.SubtitleFormats.SubtitleFormat.MillisecondsToFrames(tc.Milliseconds):00}"; + } + _dirty = false; + } + + public double? GetTotalMilliseconds() + { + return _dirty ? TimeCode?.TotalMilliseconds : _initialTotalMilliseconds; + } + + public TimeCode TimeCode + { + get + { + if (_designMode) + { + return new TimeCode(); + } + + if (string.IsNullOrWhiteSpace(maskedTextBox1.Text.RemoveChar('.').Replace(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, string.Empty).RemoveChar(',').RemoveChar(':'))) + { + return new TimeCode(TimeCode.MaxTimeTotalMilliseconds); + } + + if (!_dirty) + { + return new TimeCode(_initialTotalMilliseconds); + } + + string startTime = maskedTextBox1.Text; + bool isNegative = startTime.StartsWith('-'); + startTime = startTime.TrimStart('-').Replace(' ', '0'); + if (Mode == TimeMode.HHMMSSMS) + { + if (startTime.EndsWith(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, StringComparison.Ordinal)) + { + startTime += "000"; + } + + var times = startTime.Split(SplitChars, StringSplitOptions.RemoveEmptyEntries); + + if (times.Length == 4) + { + int.TryParse(times[0], out var hours); + + int.TryParse(times[1], out var minutes); + if (minutes > 59) + { + minutes = 59; + } + + int.TryParse(times[2], out var seconds); + if (seconds > 59) + { + seconds = 59; + } + + int.TryParse(times[3].PadRight(3, '0'), out var milliseconds); + var tc = new TimeCode(hours, minutes, seconds, milliseconds); + + if (UseVideoOffset) + { + tc.TotalMilliseconds -= Configuration.Settings.General.CurrentVideoOffsetInMs; + } + + if (isNegative) + { + tc.TotalMilliseconds *= -1; + } + + return tc; + } + } + else + { + if (startTime.EndsWith(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, StringComparison.Ordinal) || startTime.EndsWith(':')) + { + startTime += "00"; + } + + string[] times = startTime.Split(SplitChars, StringSplitOptions.RemoveEmptyEntries); + + if (times.Length == 4) + { + int.TryParse(times[0], out var hours); + + int.TryParse(times[1], out var minutes); + + int.TryParse(times[2], out var seconds); + + if (int.TryParse(times[3], out var milliseconds)) + { + milliseconds = Core.SubtitleFormats.SubtitleFormat.FramesToMillisecondsMax999(milliseconds); + } + + var tc = new TimeCode(hours, minutes, seconds, milliseconds); + + if (UseVideoOffset) + { + tc.TotalMilliseconds -= Configuration.Settings.General.CurrentVideoOffsetInMs; + } + + if (isNegative) + { + tc.TotalMilliseconds *= -1; + } + + return tc; + } + } + return null; + } + set + { + if (_designMode) + { + return; + } + + if (value != null) + { + _dirty = false; + _initialTotalMilliseconds = value.TotalMilliseconds; + } + + if (value == null || value.TotalMilliseconds >= TimeCode.MaxTimeTotalMilliseconds - 0.1) + { + maskedTextBox1.Text = string.Empty; + return; + } + + var v = new TimeCode(value.TotalMilliseconds); + if (UseVideoOffset) + { + v.TotalMilliseconds += Configuration.Settings.General.CurrentVideoOffsetInMs; + } + + if (Mode == TimeMode.HHMMSSMS) + { + maskedTextBox1.Mask = GetMask(v.TotalMilliseconds); + maskedTextBox1.Text = v.ToString(); + } + else + { + maskedTextBox1.Mask = GetMaskFrames(v.TotalMilliseconds); + maskedTextBox1.Text = v.ToHHMMSSFF(); + } + } + } + + private void MaskedTextBox1KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyData == Keys.Up) + { + numericUpDown1.UpButton(); + e.SuppressKeyPress = true; + } + else if (e.KeyData == Keys.Down) + { + numericUpDown1.DownButton(); + e.SuppressKeyPress = true; + } + else if (e.KeyData == Keys.Enter) + { + TimeCodeChanged?.Invoke(this, e); + e.SuppressKeyPress = true; + } + else if (e.KeyData != (Keys.Tab | Keys.Shift) && + e.KeyData != Keys.Tab && + e.KeyData != Keys.Left && + e.KeyData != Keys.Right) + { + _dirty = true; + } + } + + private static string GetMask(double val) => val >= 0 ? "00:00:00.000" : "-00:00:00.000"; + + private static string GetMaskFrames(double val) => val >= 0 ? "00:00:00:00" : "-00:00:00:00"; + + private void maskedTextBox1_MouseDown(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Right) + { + _dirty = true; + } + } + } +} diff --git a/src/Forms/Ocr/VobSubOcrNewFolder.resx b/src/ui/Controls/TimeUpDown.resx similarity index 100% rename from src/Forms/Ocr/VobSubOcrNewFolder.resx rename to src/ui/Controls/TimeUpDown.resx diff --git a/src/Controls/VideoPlayerContainer.cs b/src/ui/Controls/VideoPlayerContainer.cs similarity index 97% rename from src/Controls/VideoPlayerContainer.cs rename to src/ui/Controls/VideoPlayerContainer.cs index ddc734c8f..007bca1ed 100644 --- a/src/Controls/VideoPlayerContainer.cs +++ b/src/ui/Controls/VideoPlayerContainer.cs @@ -1,2111 +1,2111 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.ContainerFormats.Matroska; -using Nikse.SubtitleEdit.Logic.VideoPlayers; -using System; -using System.Drawing; -using System.IO; -using System.Text; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.SubtitleFormats; -using Nikse.SubtitleEdit.Logic; -using System.Collections.Generic; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Controls -{ - public sealed class VideoPlayerContainer : Panel - { - public class RichTextBoxViewOnly : RichTextBox - { - public RichTextBoxViewOnly() - { - ReadOnly = true; - BorderStyle = BorderStyle.None; - TabStop = false; - SetStyle(ControlStyles.Selectable, false); - SetStyle(ControlStyles.UserMouse, true); - MouseEnter += delegate { Cursor = Cursors.Default; }; - ScrollBars = RichTextBoxScrollBars.None; - Margin = new Padding(0); - } - - protected override void WndProc(ref Message m) - { - if (m.Msg == 0x204) - { - return; // WM_RBUTTONDOWN - } - - if (m.Msg == 0x205) - { - return; // WM_RBUTTONUP - } - - base.WndProc(ref m); - } - } - - public event EventHandler OnButtonClicked; - public event EventHandler OnEmptyPlayerClicked; - public Panel PanelPlayer { get; private set; } - private Panel _panelSubtitle; - private string _subtitleText = string.Empty; - private VideoPlayer _videoPlayer; - - public float FontSizeFactor { get; set; } - - public VideoPlayer VideoPlayer - { - get => _videoPlayer; - set - { - _videoPlayer = value; - if (_videoPlayer != null) - { - SetPlayerName(_videoPlayer.PlayerName); - } - - if (_videoPlayer is LibMpvDynamic && Configuration.Settings.General.MpvHandlesPreviewText) - { - _subtitlesHeight = 0; - } - else - { - _subtitlesHeight = 57; - } - DeleteTempMpvFileName(); - VideoPlayerContainerResize(this, null); - } - } - - public RichTextBoxViewOnly TextBox { get; private set; } - - public int VideoWidth { get; set; } - public int VideoHeight { get; set; } - - private bool _isMuted; - private double? _muteOldVolume; - private readonly System.ComponentModel.ComponentResourceManager _resources; - private int _controlsHeight = 47; - private const int OriginalSubtitlesHeight = 57; - private int _subtitlesHeight = OriginalSubtitlesHeight; - private readonly Color _backgroundColor = Color.FromArgb(18, 18, 18); - private Panel _panelControls; - - private PictureBox _pictureBoxBackground; - private PictureBox _pictureBoxReverse; - private PictureBox _pictureBoxReverseOver; - private PictureBox _pictureBoxReverseDown; - private PictureBox _pictureBoxFastForward; - private PictureBox _pictureBoxFastForwardOver; - private PictureBox _pictureBoxFastForwardDown; - private PictureBox _pictureBoxPlay; - private PictureBox _pictureBoxPlayOver; - private PictureBox _pictureBoxPlayDown; - private readonly PictureBox _pictureBoxPause = new PictureBox(); - private readonly PictureBox _pictureBoxPauseOver = new PictureBox(); - private readonly PictureBox _pictureBoxPauseDown = new PictureBox(); - private readonly PictureBox _pictureBoxStop = new PictureBox(); - private readonly PictureBox _pictureBoxStopOver = new PictureBox(); - private readonly PictureBox _pictureBoxStopDown = new PictureBox(); - private readonly PictureBox _pictureBoxFullscreen = new PictureBox(); - private readonly PictureBox _pictureBoxFullscreenOver = new PictureBox(); - private readonly PictureBox _pictureBoxFullscreenDown = new PictureBox(); - private readonly PictureBox _pictureBoxMute = new PictureBox(); - private readonly PictureBox _pictureBoxMuteOver = new PictureBox(); - private readonly PictureBox _pictureBoxMuteDown = new PictureBox(); - private readonly PictureBox _pictureBoxProgressbarBackground = new PictureBox(); - private readonly PictureBox _pictureBoxProgressBar = new PictureBox(); - private readonly PictureBox _pictureBoxVolumeBarBackground = new PictureBox(); - private readonly PictureBox _pictureBoxVolumeBar = new PictureBox(); - private readonly Label _labelTimeCode = new Label(); - private readonly Label _labelVideoPlayerName = new Label(); - private readonly Label _labelVolume = new Label(); - private readonly ToolTip _currentPositionToolTip = new ToolTip(); - private List _chapters; - - public List Chapters - { - get => _chapters; - set - { - _chapters = value; - Invalidate(true); - } - } - - public RightToLeft TextRightToLeft - { - get => TextBox.RightToLeft; - set - { - TextBox.RightToLeft = value; - TextBox.SelectAll(); - TextBox.SelectionAlignment = HorizontalAlignment.Center; - } - } - - public bool ShowStopButton - { - get => _pictureBoxStop.Visible || _pictureBoxStopOver.Visible || _pictureBoxStopDown.Visible; - set - { - if (value) - { - _pictureBoxStop.Visible = true; - _pictureBoxStop.BringToFront(); - } - else - { - HideAllStopImages(); - } - } - } - - public bool ShowMuteButton - { - get => _pictureBoxMute.Visible || _pictureBoxMuteOver.Visible || _pictureBoxMuteDown.Visible; - set - { - if (value) - { - _pictureBoxMute.Visible = true; - _pictureBoxMute.BringToFront(); - } - else - { - HideAllMuteImages(); - } - } - } - - public bool ShowFullscreenButton - { - get => _pictureBoxFullscreen.Visible || _pictureBoxFullscreenOver.Visible || _pictureBoxFullscreenDown.Visible; - set - { - if (value) - { - _pictureBoxFullscreen.Visible = true; - _pictureBoxFullscreen.BringToFront(); - } - else - { - HideAllFullscreenImages(); - } - } - } - - public VideoPlayerContainer() - { - _chapters = new List(); - SmpteMode = false; - FontSizeFactor = 1.0F; - BorderStyle = BorderStyle.None; - _resources = new System.ComponentModel.ComponentResourceManager(typeof(VideoPlayerContainer)); - _labelVolume.Text = Configuration.Settings.General.VideoPlayerDefaultVolume + "%"; - BackColor = _backgroundColor; - Controls.Add(MakePlayerPanel()); - Controls.Add(MakeSubtitlesPanel()); - Controls.Add(MakeControlsPanel()); - _panelControls.BringToFront(); - _pictureBoxProgressBar.Width = 0; - - ShowAllControls(); - if (Configuration.IsRunningOnLinux) - { - System.Threading.SynchronizationContext.Current.Post(TimeSpan.FromMilliseconds(1500), () => - { - if (string.IsNullOrEmpty(_labelVideoPlayerName.Text)) - { - _labelVideoPlayerName.Text = "..."; - } - FontSizeFactor = 1.0F; - SetSubtitleFont(); - _labelTimeCode.Text = $"{new TimeCode().ToDisplayString()} / ?"; - ShowAllControls(); - VideoPlayerContainerResize(this, null); - ShowAllControls(); - Invalidate(); - Refresh(); - }); - } - - VideoPlayerContainerResize(this, null); - Resize += VideoPlayerContainerResize; - PanelPlayer.MouseDown += PanelPlayerMouseDown; - - PictureBoxFastForwardMouseEnter(null, null); - PictureBoxFastForwardOverMouseLeave(null, null); - } - - private void ShowAllControls() - { - HideAllPlayImages(); - HideAllPauseImages(); - _pictureBoxPlay.Visible = true; - _pictureBoxPlay.BringToFront(); - - HideAllStopImages(); - _pictureBoxStop.Visible = true; - _pictureBoxStop.BringToFront(); - - HideAllStopImages(); - _pictureBoxStop.Visible = true; - _pictureBoxStop.BringToFront(); - - HideAllFullscreenImages(); - _pictureBoxFullscreen.Visible = true; - _pictureBoxFullscreen.BringToFront(); - - HideAllMuteImages(); - _pictureBoxMute.Visible = true; - _pictureBoxMute.BringToFront(); - - HideAllReverseImages(); - _pictureBoxReverse.Visible = true; - _pictureBoxReverse.BringToFront(); - - HideAllFastForwardImages(); - _pictureBoxFastForward.Visible = true; - _pictureBoxFastForward.BringToFront(); - - _pictureBoxProgressbarBackground.Visible = true; - _pictureBoxProgressbarBackground.BringToFront(); - _pictureBoxProgressBar.Visible = true; - _pictureBoxProgressBar.BringToFront(); - - _labelTimeCode.Visible = true; - _labelTimeCode.BringToFront(); - } - - public void EnableMouseWheelStep() - { - AddMouseWheelEvent(this); - } - - public void SetPlayerName(string s) - { - _labelVideoPlayerName.Text = s; - _labelVideoPlayerName.Left = Width - _labelVideoPlayerName.Width - 3; - } - - public void UpdatePlayerName() - { - if (_videoPlayer != null) - { - SetPlayerName(_videoPlayer.PlayerName); - } - } - - public void ResetTimeLabel() - { - _labelTimeCode.Text = string.Empty; - } - - private void AddMouseWheelEvent(Control control) - { - control.MouseWheel += ControlMouseWheel; - foreach (Control ctrl in control.Controls) - { - AddMouseWheelEvent(ctrl); - } - } - - private void ControlMouseWheel(object sender, MouseEventArgs e) - { - int delta = e.Delta; - double newPosition = CurrentPosition - delta / 256.0; - if (newPosition < 0) - { - newPosition = 0; - } - else if (newPosition > Duration) - { - newPosition = Duration; - } - - CurrentPosition = newPosition; - } - - private Control MakeSubtitlesPanel() - { - _panelSubtitle = new Panel { BackColor = _backgroundColor, Left = 0, Top = 0, Height = _subtitlesHeight + 1 }; - TextBox = new RichTextBoxViewOnly(); - _panelSubtitle.Controls.Add(TextBox); - TextBox.BackColor = _backgroundColor; - TextBox.ForeColor = Color.White; - TextBox.Dock = DockStyle.Fill; - SetSubtitleFont(); - TextBox.MouseClick += SubtitleTextBoxMouseClick; - return _panelSubtitle; - } - - public void SetSubtitleFont() - { - var gs = Configuration.Settings.General; - if (string.IsNullOrEmpty(gs.SubtitleFontName)) - { - gs.SubtitleFontName = "Tahoma"; - } - - if (gs.VideoPlayerPreviewFontBold) - { - TextBox.Font = new Font(gs.SubtitleFontName, gs.VideoPlayerPreviewFontSize * FontSizeFactor, FontStyle.Bold); - } - else - { - TextBox.Font = new Font(gs.SubtitleFontName, gs.VideoPlayerPreviewFontSize * FontSizeFactor, FontStyle.Regular); - } - - SubtitleText = _subtitleText; - } - - private void SubtitleTextBoxMouseClick(object sender, MouseEventArgs e) - { - TogglePlayPause(); - } - - public Paragraph LastParagraph { get; set; } - - public void SetSubtitleText(string text, Paragraph p, Subtitle subtitle) - { - var mpv = VideoPlayer as LibMpvDynamic; - LastParagraph = p; - if (mpv != null && Configuration.Settings.General.MpvHandlesPreviewText) - { - if (_subtitlesHeight > 0) - { - _subtitlesHeight = 0; - VideoPlayerContainerResize(null, null); - } - _subtitleText = text; - RefreshMpv(mpv, subtitle); - if (TextBox.Text.Length > 0) - { - TextBox.Text = string.Empty; - } - } - else - { - if (!string.IsNullOrEmpty(_mpvTextFileName) || _subtitlesHeight == 0) - { - mpv?.RemoveSubtitle(); - _subtitlesHeight = 57; - VideoPlayerContainerResize(null, null); - DeleteTempMpvFileName(); - } - SubtitleText = text; - } - } - - private Subtitle _subtitlePrev; - private string _mpvTextOld = string.Empty; - private string _mpvTextFileName; - private int _retryCount = 3; - private void RefreshMpv(LibMpvDynamic mpv, Subtitle subtitle) - { - if (subtitle == null) - { - return; - } - - try - { - var format = new AdvancedSubStationAlpha(); - string text; - - if (subtitle.Header != null && subtitle.Header.Contains("lang=\"ja\"", StringComparison.Ordinal) && subtitle.Header.Contains("bouten-", StringComparison.Ordinal)) - { - text = NetflixImsc11JapaneseToAss.Convert(subtitle, 1280, 720); - } - else - { - if (subtitle.Header == null || !subtitle.Header.Contains("[V4+ Styles]")) - { - var oldSub = subtitle; - subtitle = new Subtitle(subtitle); - if (TextBox.RightToLeft == RightToLeft.Yes && LanguageAutoDetect.CouldBeRightToLeftLanguage(subtitle)) - { - for (var index = 0; index < subtitle.Paragraphs.Count; index++) - { - var paragraph = subtitle.Paragraphs[index]; - if (LanguageAutoDetect.ContainsRightToLeftLetter(paragraph.Text)) - { - paragraph.Text = Utilities.FixRtlViaUnicodeChars(paragraph.Text); - } - } - } - - var oldFontSize = Configuration.Settings.SubtitleSettings.SsaFontSize; - var oldFontBold = Configuration.Settings.SubtitleSettings.SsaFontBold; - Configuration.Settings.SubtitleSettings.SsaFontSize = Configuration.Settings.General.VideoPlayerPreviewFontSize; - Configuration.Settings.SubtitleSettings.SsaFontBold = Configuration.Settings.General.VideoPlayerPreviewFontBold; - subtitle.Header = AdvancedSubStationAlpha.DefaultHeader; - Configuration.Settings.SubtitleSettings.SsaFontSize = oldFontSize; - Configuration.Settings.SubtitleSettings.SsaFontBold = oldFontBold; - - if (oldSub.Header != null && oldSub.Header.Length > 20 && oldSub.Header.Substring(3, 3) == "STL") - { - subtitle.Header = subtitle.Header.Replace("Style: Default,", "Style: Box,arial,20,&H00FFFFFF,&H0300FFFF,&H00000000,&H02000000,0,0,0,0,100,100,0,0,3,2,0,2,10,10,10,1" + - Environment.NewLine + "Style: Default,"); - for (var index = 0; index < subtitle.Paragraphs.Count; index++) - { - var p = subtitle.Paragraphs[index]; - if (p.Text.Contains("")) - { - p.Extra = "Box"; - p.Text = p.Text.Replace("", string.Empty).Replace("", string.Empty); - } - } - } - } - text = subtitle.ToText(format); - } - - - if (text != _mpvTextOld || _mpvTextFileName == null || _retryCount > 0) - { - if (_retryCount >= 0 || string.IsNullOrEmpty(_mpvTextFileName) || _subtitlePrev == null || _subtitlePrev.FileName != subtitle.FileName || !_mpvTextFileName.EndsWith(format.Extension, StringComparison.Ordinal)) - { - mpv.RemoveSubtitle(); - DeleteTempMpvFileName(); - _mpvTextFileName = FileUtil.GetTempFileName(format.Extension); - File.WriteAllText(_mpvTextFileName, text); - mpv.LoadSubtitle(_mpvTextFileName); - _retryCount--; - } - else - { - File.WriteAllText(_mpvTextFileName, text); - mpv.ReloadSubtitle(); - } - _mpvTextOld = text; - } - _subtitlePrev = subtitle; - } - catch - { - // ignored - } - } - - private void DeleteTempMpvFileName() - { - try - { - if (File.Exists(_mpvTextFileName)) - { - File.Delete(_mpvTextFileName); - _mpvTextFileName = null; - } - } - catch - { - // ignored - } - } - - public string SubtitleText - { - get => _subtitleText; - set - { - _subtitleText = value; - - bool alignLeft = _subtitleText.StartsWith("{\\a1}", StringComparison.Ordinal) || _subtitleText.StartsWith("{\\a5}", StringComparison.Ordinal) || _subtitleText.StartsWith("{\\a9}", StringComparison.Ordinal) || // sub station alpha - _subtitleText.StartsWith("{\\an1}", StringComparison.Ordinal) || _subtitleText.StartsWith("{\\an4}", StringComparison.Ordinal) || _subtitleText.StartsWith("{\\an7}", StringComparison.Ordinal); // advanced sub station alpha - - bool alignRight = _subtitleText.StartsWith("{\\a3}", StringComparison.Ordinal) || _subtitleText.StartsWith("{\\a7}", StringComparison.Ordinal) || _subtitleText.StartsWith("{\\a11}", StringComparison.Ordinal) || // sub station alpha - _subtitleText.StartsWith("{\\an3}", StringComparison.Ordinal) || _subtitleText.StartsWith("{\\an6}", StringComparison.Ordinal) || _subtitleText.StartsWith("{\\an9}", StringComparison.Ordinal); // advanced sub station alpha - - // remove styles for display text (except italic) - string text = Utilities.RemoveSsaTags(_subtitleText); - text = text.Replace("", string.Empty); - text = text.Replace("", string.Empty); - text = text.Replace("", string.Empty); - - // display italic - var sb = new StringBuilder(); - int i = 0; - bool isItalic = false; - bool isBold = false; - bool isUnderline = false; - bool isFontColor = false; - int fontColorBegin = 0; - TextBox.Text = string.Empty; - int letterCount = 0; - var fontColorLookups = new System.Collections.Generic.Dictionary(); - var styleLookups = new System.Collections.Generic.Dictionary(text.Length); - for (int j = 0; j < text.Length; j++) - { - styleLookups.Add(j, Configuration.Settings.General.VideoPlayerPreviewFontBold ? FontStyle.Bold : FontStyle.Regular); - } - - Color fontColor = Color.White; - while (i < text.Length) - { - if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase)) - { - TextBox.AppendText(sb.ToString()); - sb.Clear(); - isItalic = true; - i += 2; - } - else if (isItalic && text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase)) - { - TextBox.AppendText(sb.ToString()); - sb.Clear(); - isItalic = false; - i += 3; - } - else if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase)) - { - if (!Configuration.Settings.General.VideoPlayerPreviewFontBold) - { - TextBox.AppendText(sb.ToString()); - sb.Clear(); - isBold = true; - } - i += 2; - } - else if (isBold && text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase)) - { - if (!Configuration.Settings.General.VideoPlayerPreviewFontBold) - { - TextBox.AppendText(sb.ToString()); - sb.Clear(); - isBold = false; - } - i += 3; - } - else if (Configuration.Settings.General.VideoPlayerPreviewFontBold && text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase)) - { - i += 3; - } - else if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase)) - { - TextBox.AppendText(sb.ToString()); - sb.Clear(); - isUnderline = true; - i += 2; - } - else if (isUnderline && text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase)) - { - TextBox.AppendText(sb.ToString()); - sb.Clear(); - isUnderline = false; - i += 3; - } - else if (text.Substring(i).StartsWith("'); - if (end > 0) - { - string f = s.Substring(0, end); - int colorStart = f.IndexOf(" color=", StringComparison.OrdinalIgnoreCase); - - if (colorStart > 0) - { - int colorEnd = colorStart + " color=".Length + 1; - if (colorEnd < f.Length) - { - colorEnd = f.IndexOf('"', colorEnd); - if (colorEnd > 0 || colorEnd == -1) - { - if (colorEnd == -1) - { - s = f.Substring(colorStart); - } - else - { - s = f.Substring(colorStart, colorEnd - colorStart); - } - - s = s.Remove(0, " color=".Length); - s = s.Trim('"'); - s = s.Trim('\''); - try - { - fontColor = ColorTranslator.FromHtml(s); - fontFound = true; - } - catch - { - fontFound = false; - if (s.Length > 0) - { - try - { - fontColor = ColorTranslator.FromHtml("#" + s); - fontFound = true; - } - catch - { - fontFound = false; - } - } - } - } - } - } - i += end; - } - if (fontFound) - { - TextBox.AppendText(sb.ToString()); - sb.Clear(); - isFontColor = true; - fontColorBegin = letterCount; - } - } - else if (isFontColor && text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase)) - { - fontColorLookups.Add(new Point(fontColorBegin, TextBox.Text.Length + sb.ToString().Length - fontColorBegin), fontColor); - TextBox.AppendText(sb.ToString()); - sb.Clear(); - isFontColor = false; - i += 6; - } - else if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase)) - { - i += 6; - } - else if (text[i] == '\n') // RichTextBox only count NewLine as one character! - { - sb.Append(text[i]); - } - else if (text[i] == '\r') - { - // skip carriage return (0xd / 13) - } - else - { - var idx = TextBox.TextLength + sb.Length; - if (isBold) - { - styleLookups[idx] |= FontStyle.Bold; - } - - if (isItalic) - { - styleLookups[idx] |= FontStyle.Italic; - } - - if (isUnderline) - { - styleLookups[idx] |= FontStyle.Underline; - } - - sb.Append(text[i]); - letterCount++; - } - i++; - } - TextBox.Text += sb.ToString(); - TextBox.SelectAll(); - - if (alignLeft) - { - TextBox.SelectionAlignment = HorizontalAlignment.Left; - } - else if (alignRight) - { - TextBox.SelectionAlignment = HorizontalAlignment.Right; - } - else - { - TextBox.SelectionAlignment = HorizontalAlignment.Center; - } - - TextBox.DeselectAll(); - - Font currentFont = TextBox.SelectionFont; - for (int k = 0; k < TextBox.TextLength; k++) - { - TextBox.SelectionStart = k; - TextBox.SelectionLength = 1; - TextBox.SelectionFont = new Font(currentFont.FontFamily, currentFont.Size, styleLookups[k]); - TextBox.DeselectAll(); - } - - foreach (var entry in fontColorLookups) - { - TextBox.SelectionStart = entry.Key.X; - TextBox.SelectionLength = entry.Key.Y; - TextBox.SelectionColor = entry.Value; - TextBox.DeselectAll(); - } - } - } - - private void PanelPlayerMouseDown(object sender, MouseEventArgs e) - { - if (VideoPlayer == null) - { - OnEmptyPlayerClicked?.Invoke(sender, e); - } - - TogglePlayPause(); - } - - public void InitializeVolume(double defaultVolume) - { - int maxVolume = _pictureBoxVolumeBarBackground.Width - 18; - _pictureBoxVolumeBar.Width = (int)(maxVolume * defaultVolume / 100.0); - } - - private Control MakePlayerPanel() - { - PanelPlayer = new Panel { BackColor = _backgroundColor, Left = 0, Top = 0 }; - return PanelPlayer; - } - - public void HideControls(bool hideCursor) - { - if (_panelControls.Visible) - { - _panelSubtitle.Height += _controlsHeight; - _panelControls.Visible = false; - } - if (hideCursor) - { - HideCursor(); - } - } - - public void ShowControls() - { - if (!_panelControls.Visible) - { - _panelControls.Visible = true; - _panelControls.BringToFront(); - _panelSubtitle.Height -= _controlsHeight; - } - ShowCursor(); - } - - public void HideCursor() - { - if (_cursorStatus < 0) - { - return; - } - - _cursorStatus--; - if (VideoPlayer != null) - { - var mpv = VideoPlayer as LibMpvDynamic; - mpv?.HideCursor(); - } - Cursor.Hide(); - } - - private int _cursorStatus; - - public void ShowCursor() - { - if (_cursorStatus >= 0) - { - return; - } - - _cursorStatus++; - if (VideoPlayer != null) - { - var mpv = VideoPlayer as LibMpvDynamic; - mpv?.ShowCursor(); - } - Cursor.Show(); - } - - private Control MakeControlsPanel() - { - _panelControls = new Panel { Left = 0, Height = _controlsHeight }; - - _pictureBoxBackground = new PictureBox - { - Image = (Image)_resources.GetObject("pictureBoxBar.Image"), - Location = new Point(0, 0), - Name = "_pictureBoxBackground", - Size = new Size(200, 45), - SizeMode = PictureBoxSizeMode.StretchImage, - TabStop = false - }; - _panelControls.Controls.Add(_pictureBoxBackground); - - _pictureBoxPlay = new PictureBox - { - Image = (Image)_resources.GetObject("pictureBoxPlay.Image"), - Location = new Point(22, 126 - 113), - Name = "_pictureBoxPlay", - Size = new Size(29, 29), - SizeMode = PictureBoxSizeMode.AutoSize, - TabStop = false - }; - _pictureBoxPlay.MouseEnter += PictureBoxPlayMouseEnter; - _panelControls.Controls.Add(_pictureBoxPlay); - - _pictureBoxPlayDown = new PictureBox - { - Image = (Image)_resources.GetObject("pictureBoxPlayDown.Image"), - Location = new Point(22, 127 - 113), - Name = "_pictureBoxPlayDown", - Size = new Size(29, 29), - SizeMode = PictureBoxSizeMode.AutoSize, - TabStop = false - }; - _panelControls.Controls.Add(_pictureBoxPlayDown); - - _pictureBoxPlayOver = new PictureBox - { - Image = (Image)_resources.GetObject("pictureBoxPlayOver.Image"), - Location = new Point(23, 126 - 113), - Name = "_pictureBoxPlayOver", - Size = new Size(29, 29), - SizeMode = PictureBoxSizeMode.AutoSize, - TabStop = false - }; - _pictureBoxPlayOver.MouseLeave += PictureBoxPlayOverMouseLeave; - _pictureBoxPlayOver.MouseDown += PictureBoxPlayOverMouseDown; - _pictureBoxPlayOver.MouseUp += PictureBoxPlayOverMouseUp; - _panelControls.Controls.Add(_pictureBoxPlayOver); - - _pictureBoxPause.Image = (Image)_resources.GetObject("pictureBoxPause.Image"); - _pictureBoxPause.Location = new Point(23, 126 - 113); - _pictureBoxPause.Name = "_pictureBoxPause"; - _pictureBoxPause.Size = new Size(29, 29); - _pictureBoxPause.SizeMode = PictureBoxSizeMode.AutoSize; - _pictureBoxPause.TabStop = false; - _pictureBoxPause.MouseEnter += PictureBoxPauseMouseEnter; - _panelControls.Controls.Add(_pictureBoxPause); - - _pictureBoxPauseDown.Image = (Image)_resources.GetObject("pictureBoxPauseDown.Image"); - _pictureBoxPauseDown.Location = new Point(22, 127 - 113); - _pictureBoxPauseDown.Name = "_pictureBoxPauseDown"; - _pictureBoxPauseDown.Size = new Size(29, 29); - _pictureBoxPauseDown.SizeMode = PictureBoxSizeMode.AutoSize; - _pictureBoxPauseDown.TabStop = false; - _panelControls.Controls.Add(_pictureBoxPauseDown); - - _pictureBoxPauseOver.Image = (Image)_resources.GetObject("pictureBoxPauseOver.Image"); - _pictureBoxPauseOver.Location = new Point(22, 127 - 113); - _pictureBoxPauseOver.Name = "_pictureBoxPauseOver"; - _pictureBoxPauseOver.Size = new Size(29, 29); - _pictureBoxPauseOver.SizeMode = PictureBoxSizeMode.AutoSize; - _pictureBoxPauseOver.TabStop = false; - _pictureBoxPauseOver.MouseLeave += PictureBoxPauseOverMouseLeave; - _pictureBoxPauseOver.MouseDown += PictureBoxPauseOverMouseDown; - _pictureBoxPauseOver.MouseUp += PictureBoxPauseOverMouseUp; - _panelControls.Controls.Add(_pictureBoxPauseOver); - - _pictureBoxStop.Image = (Image)_resources.GetObject("pictureBoxStop.Image"); - _pictureBoxStop.Location = new Point(52, 130 - 113); - _pictureBoxStop.Name = "_pictureBoxStop"; - _pictureBoxStop.Size = new Size(20, 20); - _pictureBoxStop.SizeMode = PictureBoxSizeMode.AutoSize; - _pictureBoxStop.TabStop = false; - _pictureBoxStop.MouseEnter += PictureBoxStopMouseEnter; - _panelControls.Controls.Add(_pictureBoxStop); - - _pictureBoxStopDown.Image = (Image)_resources.GetObject("pictureBoxStopDown.Image"); - _pictureBoxStopDown.Location = new Point(52, 130 - 113); - _pictureBoxStopDown.Name = "_pictureBoxStopDown"; - _pictureBoxStopDown.Size = new Size(20, 20); - _pictureBoxStopDown.SizeMode = PictureBoxSizeMode.AutoSize; - _pictureBoxStopDown.TabStop = false; - _panelControls.Controls.Add(_pictureBoxStopDown); - - _pictureBoxStopOver.Image = (Image)_resources.GetObject("pictureBoxStopOver.Image"); - _pictureBoxStopOver.Location = new Point(52, 130 - 113); - _pictureBoxStopOver.Name = "_pictureBoxStopOver"; - _pictureBoxStopOver.Size = new Size(20, 20); - _pictureBoxStopOver.SizeMode = PictureBoxSizeMode.AutoSize; - _pictureBoxStopOver.TabStop = false; - _pictureBoxStopOver.MouseLeave += PictureBoxStopOverMouseLeave; - _pictureBoxStopOver.MouseDown += PictureBoxStopOverMouseDown; - _pictureBoxStopOver.MouseUp += PictureBoxStopOverMouseUp; - _panelControls.Controls.Add(_pictureBoxStopOver); - - _pictureBoxFullscreen.Image = (Image)_resources.GetObject("pictureBoxFS.Image"); - _pictureBoxFullscreen.Location = new Point(95, 130 - 113); - _pictureBoxFullscreen.Name = "_pictureBoxFullscreen"; - _pictureBoxFullscreen.Size = new Size(20, 20); - _pictureBoxFullscreen.SizeMode = PictureBoxSizeMode.AutoSize; - _pictureBoxFullscreen.TabStop = false; - _pictureBoxFullscreen.MouseEnter += PictureBoxFullscreenMouseEnter; - _panelControls.Controls.Add(_pictureBoxFullscreen); - - _pictureBoxFullscreenDown.Image = (Image)_resources.GetObject("pictureBoxFSDown.Image"); - _pictureBoxFullscreenDown.Location = new Point(95, 130 - 113); - _pictureBoxFullscreenDown.Name = "_pictureBoxFullscreenDown"; - _pictureBoxFullscreenDown.Size = new Size(20, 20); - _pictureBoxFullscreenDown.SizeMode = PictureBoxSizeMode.AutoSize; - _pictureBoxFullscreenDown.TabStop = false; - _panelControls.Controls.Add(_pictureBoxFullscreenDown); - - _pictureBoxFullscreenOver.Image = (Image)_resources.GetObject("pictureBoxFSOver.Image"); - _pictureBoxFullscreenOver.Location = new Point(95, 130 - 113); - _pictureBoxFullscreenOver.Name = "_pictureBoxFullscreenOver"; - _pictureBoxFullscreenOver.Size = new Size(20, 20); - _pictureBoxFullscreenOver.SizeMode = PictureBoxSizeMode.AutoSize; - _pictureBoxFullscreenOver.TabStop = false; - _pictureBoxFullscreenOver.MouseLeave += PictureBoxFullscreenOverMouseLeave; - _pictureBoxFullscreenOver.MouseDown += PictureBoxFullscreenOverMouseDown; - _pictureBoxFullscreenOver.MouseUp += PictureBoxFullscreenOverMouseUp; - _panelControls.Controls.Add(_pictureBoxFullscreenOver); - - _pictureBoxProgressbarBackground.Anchor = AnchorStyles.Top | AnchorStyles.Left; - _pictureBoxProgressbarBackground.BackColor = Color.Transparent; - _pictureBoxProgressbarBackground.Image = (Image)_resources.GetObject("pictureBoxProgressbarBackground.Image"); - _pictureBoxProgressbarBackground.Location = new Point(43, 114 - 113); - _pictureBoxProgressbarBackground.Margin = new Padding(0); - _pictureBoxProgressbarBackground.Name = "_pictureBoxProgressbarBackground"; - _pictureBoxProgressbarBackground.Size = new Size(531, 12); - _pictureBoxProgressbarBackground.SizeMode = PictureBoxSizeMode.StretchImage; - _pictureBoxProgressbarBackground.TabStop = false; - _pictureBoxProgressbarBackground.Paint += PictureBoxProgressbarBackgroundPaint; - _pictureBoxProgressbarBackground.MouseDown += PictureBoxProgressbarBackgroundMouseDown; - _pictureBoxProgressbarBackground.MouseLeave += PictureBoxProgressbarBackgroundMouseLeave; - _pictureBoxProgressbarBackground.MouseMove += PictureBoxProgressbarBackgroundMouseMove; - _panelControls.Controls.Add(_pictureBoxProgressbarBackground); - - _pictureBoxProgressBar.Image = (Image)_resources.GetObject("pictureBoxProgressBar.Image"); - _pictureBoxProgressBar.Location = new Point(47, 118 - 113); - _pictureBoxProgressBar.Name = "_pictureBoxProgressBar"; - _pictureBoxProgressBar.Size = new Size(318, 4); - _pictureBoxProgressBar.SizeMode = PictureBoxSizeMode.StretchImage; - _pictureBoxProgressBar.TabStop = false; - _pictureBoxProgressBar.Paint += PictureBoxProgressBarPaint; - _pictureBoxProgressBar.MouseDown += PictureBoxProgressBarMouseDown; - _pictureBoxProgressBar.MouseLeave += PictureBoxProgressBarMouseLeave; - _pictureBoxProgressBar.MouseMove += PictureBoxProgressBarMouseMove; - _panelControls.Controls.Add(_pictureBoxProgressBar); - _pictureBoxProgressBar.BringToFront(); - - _pictureBoxMute.Image = (Image)_resources.GetObject("pictureBoxMute.Image"); - _pictureBoxMute.Location = new Point(75, 131 - 113); - _pictureBoxMute.Name = "_pictureBoxMute"; - _pictureBoxMute.Size = new Size(19, 19); - _pictureBoxMute.SizeMode = PictureBoxSizeMode.AutoSize; - _pictureBoxMute.TabStop = false; - _pictureBoxMute.MouseEnter += PictureBoxMuteMouseEnter; - _panelControls.Controls.Add(_pictureBoxMute); - - _pictureBoxMuteDown.Image = (Image)_resources.GetObject("pictureBoxMuteDown.Image"); - _pictureBoxMuteDown.Location = new Point(75, 131 - 113); - _pictureBoxMuteDown.Name = "_pictureBoxMuteDown"; - _pictureBoxMuteDown.Size = new Size(19, 19); - _pictureBoxMuteDown.SizeMode = PictureBoxSizeMode.AutoSize; - _pictureBoxMuteDown.TabStop = false; - _pictureBoxMuteDown.Click += PictureBoxMuteDownClick; - _panelControls.Controls.Add(_pictureBoxMuteDown); - - _pictureBoxMuteOver.Image = (Image)_resources.GetObject("pictureBoxMuteOver.Image"); - _pictureBoxMuteOver.Location = new Point(75, 131 - 113); - _pictureBoxMuteOver.Name = "_pictureBoxMuteOver"; - _pictureBoxMuteOver.Size = new Size(19, 19); - _pictureBoxMuteOver.SizeMode = PictureBoxSizeMode.AutoSize; - _pictureBoxMuteOver.TabStop = false; - _pictureBoxMuteOver.MouseLeave += PictureBoxMuteOverMouseLeave; - _pictureBoxMuteOver.MouseDown += PictureBoxMuteOverMouseDown; - _pictureBoxMuteOver.MouseUp += PictureBoxMuteOverMouseUp; - _panelControls.Controls.Add(_pictureBoxMuteOver); - - _pictureBoxVolumeBarBackground.Image = (Image)_resources.GetObject("pictureBoxVolumeBarBackground.Image"); - _pictureBoxVolumeBarBackground.Location = new Point(111, 135 - 113); - _pictureBoxVolumeBarBackground.Name = "_pictureBoxVolumeBarBackground"; - _pictureBoxVolumeBarBackground.Size = new Size(82, 13); - _pictureBoxVolumeBarBackground.SizeMode = PictureBoxSizeMode.AutoSize; - _pictureBoxVolumeBarBackground.TabStop = false; - _pictureBoxVolumeBarBackground.MouseDown += PictureBoxVolumeBarBackgroundMouseDown; - _panelControls.Controls.Add(_pictureBoxVolumeBarBackground); - - _pictureBoxVolumeBar.Image = (Image)_resources.GetObject("pictureBoxVolumeBar.Image"); - _pictureBoxVolumeBar.Location = new Point(120, 139 - 113); - _pictureBoxVolumeBar.Name = "_pictureBoxVolumeBar"; - _pictureBoxVolumeBar.Size = new Size(48, 4); - _pictureBoxVolumeBar.SizeMode = PictureBoxSizeMode.StretchImage; - _pictureBoxVolumeBar.TabStop = false; - _pictureBoxVolumeBar.MouseDown += PictureBoxVolumeBarMouseDown; - _panelControls.Controls.Add(_pictureBoxVolumeBar); - _pictureBoxVolumeBar.BringToFront(); - - _pictureBoxReverse = new PictureBox - { - Image = (Image)_resources.GetObject("pictureBoxReverse.Image"), - Location = new Point(28, 3), - Name = "_pictureBoxReverse", - Size = new Size(16, 8), - SizeMode = PictureBoxSizeMode.AutoSize, - TabStop = false - }; - _panelControls.Controls.Add(_pictureBoxReverse); - _pictureBoxReverse.MouseEnter += PictureBoxReverseMouseEnter; - - _pictureBoxReverseOver = new PictureBox - { - Image = (Image)_resources.GetObject("pictureBoxReverseMouseOver.Image"), - Location = _pictureBoxReverse.Location, - Name = "_pictureBoxReverseOver", - Size = _pictureBoxReverse.Size, - SizeMode = PictureBoxSizeMode.AutoSize, - TabStop = false - }; - _panelControls.Controls.Add(_pictureBoxReverseOver); - _pictureBoxReverseOver.MouseLeave += PictureBoxReverseOverMouseLeave; - _pictureBoxReverseOver.MouseDown += PictureBoxReverseOverMouseDown; - _pictureBoxReverseOver.MouseUp += PictureBoxReverseOverMouseUp; - - _pictureBoxReverseDown = new PictureBox - { - Image = (Image)_resources.GetObject("pictureBoxReverseMouseDown.Image"), - Location = _pictureBoxReverse.Location, - Name = "_pictureBoxReverseOver", - Size = _pictureBoxReverse.Size, - SizeMode = PictureBoxSizeMode.AutoSize, - TabStop = false - }; - _panelControls.Controls.Add(_pictureBoxReverseDown); - - _pictureBoxFastForward = new PictureBox - { - Image = (Image)_resources.GetObject("pictureBoxFastForward.Image"), - Location = new Point(571, 1), - Name = "_pictureBoxFastForward", - Size = new Size(17, 13), - SizeMode = PictureBoxSizeMode.AutoSize, - TabStop = false - }; - _panelControls.Controls.Add(_pictureBoxFastForward); - _pictureBoxFastForward.MouseEnter += PictureBoxFastForwardMouseEnter; - - _pictureBoxFastForwardOver = new PictureBox - { - Image = (Image)_resources.GetObject("pictureBoxFastForwardMouseOver.Image"), - Location = _pictureBoxFastForward.Location, - Name = "_pictureBoxFastForwardOver", - Size = _pictureBoxFastForward.Size, - SizeMode = PictureBoxSizeMode.AutoSize, - TabStop = false - }; - _panelControls.Controls.Add(_pictureBoxFastForwardOver); - _pictureBoxFastForwardOver.MouseLeave += PictureBoxFastForwardOverMouseLeave; - _pictureBoxFastForwardOver.MouseDown += PictureBoxFastForwardOverMouseDown; - _pictureBoxFastForwardOver.MouseUp += PictureBoxFastForwardOverMouseUp; - - _pictureBoxFastForwardDown = new PictureBox - { - Image = (Image)_resources.GetObject("pictureBoxFastForwardMouseDown.Image"), - Location = _pictureBoxFastForward.Location, - Name = "_pictureBoxFastForwardDown", - Size = _pictureBoxFastForward.Size, - SizeMode = PictureBoxSizeMode.AutoSize, - TabStop = false - }; - _panelControls.Controls.Add(_pictureBoxFastForwardDown); - - _labelVolume.Location = new Point(120, 17); - _labelVolume.ForeColor = Color.WhiteSmoke; - _labelVolume.BackColor = Color.FromArgb(67, 75, 93); - _labelVolume.AutoSize = true; - _labelVolume.Font = new Font(_labelTimeCode.Font.FontFamily, 6); - _panelControls.Controls.Add(_labelVolume); - - _labelTimeCode.Location = new Point(280, 28); - _labelTimeCode.ForeColor = Color.WhiteSmoke; - _labelTimeCode.Font = new Font(_labelTimeCode.Font.FontFamily, 8, FontStyle.Bold); - _labelTimeCode.AutoSize = true; - _panelControls.Controls.Add(_labelTimeCode); - - _labelVideoPlayerName.Location = new Point(282, 17); - _labelVideoPlayerName.ForeColor = Color.WhiteSmoke; - _labelVideoPlayerName.BackColor = Color.FromArgb(67, 75, 93); - _labelVideoPlayerName.AutoSize = true; - _labelVideoPlayerName.Font = new Font(_labelTimeCode.Font.FontFamily, 6); - _panelControls.Controls.Add(_labelVideoPlayerName); - - if (Configuration.Settings.General.UseDarkTheme) - { - _labelVolume.ForeColor = Color.Gray; - _labelTimeCode.ForeColor = Color.Gray; - _labelVideoPlayerName.ForeColor = Color.Gray; - } - - - _pictureBoxBackground.SendToBack(); - _pictureBoxFastForwardDown.BringToFront(); - _pictureBoxFastForwardOver.BringToFront(); - _pictureBoxFastForward.BringToFront(); - _pictureBoxPlay.BringToFront(); - - _panelControls.BackColor = _backgroundColor; - _pictureBoxPlayDown.BringToFront(); - _pictureBoxPlayOver.BringToFront(); - _pictureBoxPlay.BringToFront(); - _labelTimeCode.BringToFront(); - _labelVolume.BringToFront(); - return _panelControls; - } - - public void VideoPlayerContainerResize(object sender, EventArgs e) - { - _controlsHeight = _pictureBoxBackground.Height; - PanelPlayer.Height = Height - (_controlsHeight + _subtitlesHeight); - PanelPlayer.Width = Width; - _videoPlayer?.Resize(PanelPlayer.Width, PanelPlayer.Height); - - _panelSubtitle.Top = Height - (_controlsHeight + _subtitlesHeight); - _panelSubtitle.Width = Width; - - _panelControls.Top = Height - _controlsHeight + 2; - _panelControls.Width = Width; - _pictureBoxBackground.Width = Width; - _pictureBoxProgressbarBackground.Width = Width - (_pictureBoxProgressbarBackground.Left * 2); - _pictureBoxFastForward.Left = Width - 48; - _pictureBoxFastForwardDown.Left = _pictureBoxFastForward.Left; - _pictureBoxFastForwardOver.Left = _pictureBoxFastForward.Left; - - ResizeTimeCode(); - - _labelVideoPlayerName.Left = Width - _labelVideoPlayerName.Width - 3; - DeleteTempMpvFileName(); - } - - private void ResizeTimeCode() - { - if (string.IsNullOrEmpty(_labelTimeCode.Text)) - { - var span = TimeCode.FromSeconds(1); - _labelTimeCode.Text = $"{span.ToDisplayString()} / {span.ToDisplayString()}{(SmpteMode ? " SMPTE" : string.Empty)}"; - _labelTimeCode.Left = Width - _labelTimeCode.Width - 9; - if (_labelTimeCode.Top + _labelTimeCode.Height >= _panelControls.Height - 4) - { - _labelTimeCode.Font = new Font(_labelTimeCode.Font.Name, _labelTimeCode.Font.Size - 1); - } - - _labelTimeCode.Text = string.Empty; - } - else - { - _labelTimeCode.Left = Width - _labelTimeCode.Width - 9; - if (_labelTimeCode.Top + _labelTimeCode.Height >= _panelControls.Height - 4) - { - _labelTimeCode.Font = new Font(_labelTimeCode.Font.Name, _labelTimeCode.Font.Size - 1); - } - } - } - - #region PlayPauseButtons - - public void RefreshPlayPauseButtons() - { - if (VideoPlayer != null) - { - if (VideoPlayer.IsPlaying) - { - if (!_pictureBoxPause.Visible && !_pictureBoxPauseDown.Visible && !_pictureBoxPauseOver.Visible) - { - HideAllPauseImages(); - HideAllPlayImages(); - _pictureBoxPause.Visible = true; - _pictureBoxPause.BringToFront(); - } - } - else - { - if (!_pictureBoxPlay.Visible && !_pictureBoxPlayOver.Visible && !_pictureBoxPlayDown.Visible) - { - HideAllPauseImages(); - HideAllPlayImages(); - _pictureBoxPlay.Visible = true; - _pictureBoxPlay.BringToFront(); - } - } - } - } - - private void HideAllPlayImages() - { - _pictureBoxPlayOver.Visible = false; - _pictureBoxPlayDown.Visible = false; - _pictureBoxPlay.Visible = false; - } - - private void PictureBoxPlayMouseEnter(object sender, EventArgs e) - { - if (_pictureBoxPlay.Visible) - { - HideAllPlayImages(); - _pictureBoxPlayOver.Visible = true; - _pictureBoxPlayOver.BringToFront(); - } - } - - private void PictureBoxPlayOverMouseLeave(object sender, EventArgs e) - { - if (_pictureBoxPlayOver.Visible) - { - HideAllPlayImages(); - _pictureBoxPlay.Visible = true; - _pictureBoxPlay.BringToFront(); - } - } - - private void PictureBoxPlayOverMouseDown(object sender, MouseEventArgs e) - { - HideAllPlayImages(); - _pictureBoxPlayDown.Visible = true; - _pictureBoxPlayDown.BringToFront(); - OnButtonClicked?.Invoke(sender, e); - } - - private void PictureBoxPlayOverMouseUp(object sender, MouseEventArgs e) - { - if (IsMouseOverControl((PictureBox)sender, e.Location)) - { - HideAllPlayImages(); - _pictureBoxPause.Visible = true; - _pictureBoxPause.BringToFront(); - Play(); - } - else - { - HideAllPlayImages(); - _pictureBoxPlay.Visible = true; - _pictureBoxPause.BringToFront(); - } - } - - private void HideAllPauseImages() - { - _pictureBoxPauseOver.Visible = false; - _pictureBoxPauseDown.Visible = false; - _pictureBoxPause.Visible = false; - } - - private void PictureBoxPauseMouseEnter(object sender, EventArgs e) - { - if (_pictureBoxPause.Visible) - { - HideAllPauseImages(); - _pictureBoxPauseOver.Visible = true; - _pictureBoxPauseOver.BringToFront(); - } - } - - private void PictureBoxPauseOverMouseLeave(object sender, EventArgs e) - { - if (_pictureBoxPauseOver.Visible) - { - HideAllPauseImages(); - _pictureBoxPause.Visible = true; - _pictureBoxPause.BringToFront(); - } - } - - private void PictureBoxPauseOverMouseDown(object sender, MouseEventArgs e) - { - if (_pictureBoxPauseOver.Visible) - { - HideAllPauseImages(); - _pictureBoxPauseDown.Visible = true; - _pictureBoxPauseDown.BringToFront(); - } - OnButtonClicked?.Invoke(sender, e); - } - - private void PictureBoxPauseOverMouseUp(object sender, MouseEventArgs e) - { - if (IsMouseOverControl((PictureBox)sender, e.Location)) - { - HideAllPauseImages(); - _pictureBoxPlay.Visible = true; - _pictureBoxPlay.BringToFront(); - Pause(); - } - else - { - HideAllPauseImages(); - _pictureBoxPause.Visible = true; - _pictureBoxPause.BringToFront(); - } - } - - #endregion PlayPauseButtons - - #region StopButtons - - private void HideAllStopImages() - { - _pictureBoxStopOver.Visible = false; - _pictureBoxStopDown.Visible = false; - _pictureBoxStop.Visible = false; - } - - private void PictureBoxStopMouseEnter(object sender, EventArgs e) - { - HideAllStopImages(); - _pictureBoxStopOver.Visible = true; - _pictureBoxStopOver.BringToFront(); - } - - private void PictureBoxStopOverMouseLeave(object sender, EventArgs e) - { - if (_pictureBoxStopOver.Visible) - { - HideAllStopImages(); - _pictureBoxStop.Visible = true; - _pictureBoxStop.BringToFront(); - } - } - - private void PictureBoxStopOverMouseDown(object sender, MouseEventArgs e) - { - if (_pictureBoxStopOver.Visible) - { - HideAllStopImages(); - _pictureBoxStopDown.Visible = true; - _pictureBoxStopDown.BringToFront(); - } - OnButtonClicked?.Invoke(sender, e); - } - - private void PictureBoxStopOverMouseUp(object sender, MouseEventArgs e) - { - if (IsMouseOverControl((PictureBox)sender, e.Location)) - { - HideAllStopImages(); - _pictureBoxStop.Visible = true; - _pictureBoxStop.BringToFront(); - Stop(); - } - else - { - HideAllStopImages(); - _pictureBoxStop.Visible = true; - _pictureBoxStop.BringToFront(); - } - } - - #endregion StopButtons - - #region FullscreenButtons - - private void HideAllFullscreenImages() - { - _pictureBoxFullscreenOver.Visible = false; - _pictureBoxFullscreenDown.Visible = false; - _pictureBoxFullscreen.Visible = false; - } - - public void ShowFullScreenControls() - { - _pictureBoxFullscreen.Image = (Image)_resources.GetObject("pictureBoxNoFS.Image"); - _pictureBoxFullscreenDown.Image = (Image)_resources.GetObject("pictureBoxNoFSDown.Image"); - _pictureBoxFullscreenOver.Image = (Image)_resources.GetObject("pictureBoxNoFSOver.Image"); - } - - public void ShowNonFullScreenControls() - { - _pictureBoxFullscreen.Image = (Image)_resources.GetObject("pictureBoxFS.Image"); - _pictureBoxFullscreenDown.Image = (Image)_resources.GetObject("pictureBoxFSDown.Image"); - _pictureBoxFullscreenOver.Image = (Image)_resources.GetObject("pictureBoxFSOver.Image"); - } - - private void PictureBoxFullscreenMouseEnter(object sender, EventArgs e) - { - HideAllFullscreenImages(); - _pictureBoxFullscreenOver.Visible = true; - _pictureBoxFullscreenOver.BringToFront(); - } - - private void PictureBoxFullscreenOverMouseLeave(object sender, EventArgs e) - { - if (_pictureBoxFullscreenOver.Visible) - { - HideAllFullscreenImages(); - _pictureBoxFullscreen.Visible = true; - _pictureBoxFullscreen.BringToFront(); - } - } - - private void PictureBoxFullscreenOverMouseDown(object sender, MouseEventArgs e) - { - HideAllFullscreenImages(); - OnButtonClicked?.Invoke(sender, e); - } - - private void PictureBoxFullscreenOverMouseUp(object sender, MouseEventArgs e) - { - HideAllFullscreenImages(); - _pictureBoxFullscreen.Visible = true; - _pictureBoxFullscreen.BringToFront(); - } - - #endregion FullscreenButtons - - #region Mute buttons - - private void HideAllMuteImages() - { - _pictureBoxMuteOver.Visible = false; - _pictureBoxMuteDown.Visible = false; - _pictureBoxMute.Visible = false; - } - - private void PictureBoxMuteMouseEnter(object sender, EventArgs e) - { - HideAllMuteImages(); - if (Mute) - { - _pictureBoxMuteDown.Visible = true; - _pictureBoxMuteDown.BringToFront(); - } - else - { - _pictureBoxMuteOver.Visible = true; - _pictureBoxMuteOver.BringToFront(); - } - } - - private void PictureBoxMuteOverMouseLeave(object sender, EventArgs e) - { - if (_pictureBoxMuteOver.Visible) - { - HideAllMuteImages(); - _pictureBoxMute.Visible = true; - _pictureBoxMute.BringToFront(); - } - } - - private void PictureBoxMuteOverMouseDown(object sender, MouseEventArgs e) - { - if (_pictureBoxMuteOver.Visible) - { - HideAllMuteImages(); - _pictureBoxMuteDown.Visible = true; - _pictureBoxMuteDown.BringToFront(); - } - OnButtonClicked?.Invoke(sender, e); - } - - private void PictureBoxMuteOverMouseUp(object sender, MouseEventArgs e) - { - if (IsMouseOverControl((PictureBox)sender, e.Location)) - { - HideAllMuteImages(); - _pictureBoxMuteDown.Visible = true; - _pictureBoxMuteDown.BringToFront(); - Mute = true; - } - else - { - HideAllMuteImages(); - _pictureBoxMute.Visible = true; - _pictureBoxMute.BringToFront(); - } - } - - private void PictureBoxMuteDownClick(object sender, EventArgs e) - { - Mute = false; - HideAllMuteImages(); - _pictureBoxMute.Visible = true; - _pictureBoxMute.BringToFront(); - OnButtonClicked?.Invoke(sender, e); - } - - #endregion Mute buttons - - #region Reverse buttons - - private void HideAllReverseImages() - { - _pictureBoxReverseOver.Visible = false; - _pictureBoxReverseDown.Visible = false; - _pictureBoxReverse.Visible = false; - } - - private void PictureBoxReverseMouseEnter(object sender, EventArgs e) - { - HideAllReverseImages(); - _pictureBoxReverseOver.Visible = true; - _pictureBoxReverseOver.BringToFront(); - } - - private void PictureBoxReverseOverMouseLeave(object sender, EventArgs e) - { - HideAllReverseImages(); - _pictureBoxReverse.Visible = true; - _pictureBoxReverse.BringToFront(); - } - - private void PictureBoxReverseOverMouseDown(object sender, MouseEventArgs e) - { - HideAllReverseImages(); - _pictureBoxReverseDown.Visible = true; - _pictureBoxReverseDown.BringToFront(); - if (VideoPlayer != null) - { - var newPosition = CurrentPosition - 3.0; - if (newPosition < 0) - { - newPosition = 0; - } - - CurrentPosition = newPosition; - } - } - - private void PictureBoxReverseOverMouseUp(object sender, MouseEventArgs e) - { - HideAllReverseImages(); - _pictureBoxReverse.Visible = true; - _pictureBoxReverse.BringToFront(); - } - - #endregion Reverse buttons - - #region Fast forward buttons - - private void HideAllFastForwardImages() - { - _pictureBoxFastForwardOver.Visible = false; - _pictureBoxFastForwardDown.Visible = false; - _pictureBoxFastForward.Visible = false; - } - - private void PictureBoxFastForwardMouseEnter(object sender, EventArgs e) - { - HideAllFastForwardImages(); - _pictureBoxFastForwardOver.Visible = true; - _pictureBoxFastForwardOver.BringToFront(); - } - - private void PictureBoxFastForwardOverMouseLeave(object sender, EventArgs e) - { - HideAllFastForwardImages(); - _pictureBoxFastForward.Visible = true; - _pictureBoxFastForward.BringToFront(); - } - - private void PictureBoxFastForwardOverMouseDown(object sender, MouseEventArgs e) - { - HideAllFastForwardImages(); - _pictureBoxFastForwardDown.Visible = true; - _pictureBoxFastForwardDown.BringToFront(); - - if (VideoPlayer != null) - { - var newPosition = CurrentPosition + 3.0; - if (newPosition < 0) - { - newPosition = 0; - } - - CurrentPosition = newPosition; - } - } - - private void PictureBoxFastForwardOverMouseUp(object sender, MouseEventArgs e) - { - HideAllFastForwardImages(); - _pictureBoxFastForward.Visible = true; - _pictureBoxFastForward.BringToFront(); - } - - #endregion Fast forward buttons - - #region Progress bars - - private void SetProgressBarPosition(int mouseX) - { - int max = _pictureBoxProgressbarBackground.Width - 9; - if (mouseX > max) - { - mouseX = max; - } - else if (mouseX < 0) - { - mouseX = 0; - } - - double percent = mouseX * 100.0 / max; - _pictureBoxProgressBar.Width = (int)(max * percent / 100.0); - - CurrentPosition = percent * Duration / 100.0; - } - - private int SecondsToXPosition(double seconds) - { - int max = _pictureBoxProgressbarBackground.Width - 9; - return (int)Math.Round(seconds * max / Duration); - } - - private double CursorVideoPosition(double mouseX) - { - int max = _pictureBoxProgressbarBackground.Width - 9; - if (mouseX > max) - { - mouseX = max; - } - else if (mouseX < 0) - { - mouseX = 0; - } - - double videoPosition = mouseX * Duration / max; - - return videoPosition; - } - - private string CurrentPositionToolTipText(double mouseX) - { - double cursorVideoPosition = CursorVideoPosition(mouseX); - string toolTiptext = TimeCode.FromSeconds(cursorVideoPosition + Configuration.Settings.General.CurrentVideoOffsetInMs / TimeCode.BaseUnit).ToDisplayString(); - - if (_chapters?.Count > 0) - { - toolTiptext += " - "; - - for (int index = 0; index < _chapters.Count; index++) - { - var chapterTime = _chapters[index].StartTime; - var nextChapterTime = index + 1 < _chapters.Count ? _chapters[index + 1].StartTime : Duration; - - if (cursorVideoPosition >= chapterTime && cursorVideoPosition < nextChapterTime) - { - if (_chapters[index].Nested) - { - toolTiptext += "+ "; - } - - toolTiptext += _chapters[index].Name; - break; - } - } - } - - return toolTiptext; - } - - private void DrawChapters(Graphics graphics, int mergin, int startPoint, int endPoint) - { - try - { - int max = _pictureBoxProgressbarBackground.Width - 9; - int index = 0; - while (index < _chapters.Count) - { - int pos; - try - { - double time = _chapters[index++].StartTime; - pos = SecondsToXPosition(time) + mergin; - } - catch - { - pos = -1; - } - if (pos > 0 && pos < max) - { - using (var p = new Pen(Color.LightGray)) - { - graphics.DrawLine(p, pos, startPoint, pos, endPoint); - } - } - } - } - catch (Exception) - { - // ignore - } - } - - private void PictureBoxProgressbarBackgroundMouseDown(object sender, MouseEventArgs e) - { - SetProgressBarPosition(e.X - 4); - OnButtonClicked?.Invoke(sender, e); - } - - private void PictureBoxProgressBarMouseDown(object sender, MouseEventArgs e) - { - SetProgressBarPosition(e.X + 2); - OnButtonClicked?.Invoke(sender, e); - } - - private void PictureBoxProgressbarBackgroundPaint(object sender, PaintEventArgs e) - { - if (_chapters != null) - { - DrawChapters(e.Graphics, 3, _pictureBoxProgressBar.Location.Y, _pictureBoxProgressBar.Location.Y + 3); - } - } - - private void PictureBoxProgressBarPaint(object sender, PaintEventArgs e) - { - if (_chapters != null) - { - DrawChapters(e.Graphics, -1, 1, _pictureBoxProgressBar.Height); - } - } - - private void PictureBoxProgressbarBackgroundMouseMove(object sender, MouseEventArgs e) - { - if (VideoPlayer != null) - { - string toolTiptext = CurrentPositionToolTipText(e.X - 4); - _currentPositionToolTip.Show(toolTiptext, _pictureBoxProgressbarBackground, e.X - 10, e.Y - 25); - } - } - - private void PictureBoxProgressbarBackgroundMouseLeave(object sender, EventArgs e) - { - if (VideoPlayer != null) - { - _currentPositionToolTip.Hide(_pictureBoxProgressbarBackground); - } - } - - private void PictureBoxProgressBarMouseMove(object sender, MouseEventArgs e) - { - if (VideoPlayer != null) - { - string toolTiptext = CurrentPositionToolTipText(e.X + 2); - _currentPositionToolTip.Show(toolTiptext, _pictureBoxProgressBar, e.X - 10, e.Y - 25); - } - } - - private void PictureBoxProgressBarMouseLeave(object sender, EventArgs e) - { - if (VideoPlayer != null) - { - _currentPositionToolTip.Hide(_pictureBoxProgressBar); - } - } - - - /// - /// Use SMPTE time (drop frame mode) - /// See https://blog.frame.io/2017/07/17/timecode-and-frame-rates/ and - /// https://backlothelp.netflix.com/hc/en-us/articles/215131928-How-do-I-know-whether-to-select-SMPTE-or-MEDIA-for-a-timing-reference- - /// - public bool SmpteMode { get; set; } - - public void RefreshProgressBar() - { - if (VideoPlayer == null) - { - _pictureBoxProgressBar.Width = 0; - _labelTimeCode.Text = string.Empty; - } - else - { - int max = _pictureBoxProgressbarBackground.Width - 9; - double percent = (VideoPlayer.CurrentPosition * 100.0) / VideoPlayer.Duration; - _pictureBoxProgressBar.Width = (int)(max * percent / 100.0); - - if (Convert.ToInt64(Duration) == 0) - { - return; - } - - var pos = CurrentPosition; - if (pos > 1000000) - { - pos = 0; - } - - var dur = TimeCode.FromSeconds(Duration + Configuration.Settings.General.CurrentVideoOffsetInMs / TimeCode.BaseUnit); - if (SmpteMode) - { - var span = TimeCode.FromSeconds(pos + 0.017 + Configuration.Settings.General.CurrentVideoOffsetInMs / TimeCode.BaseUnit); - _labelTimeCode.Text = $"{span.ToDisplayString()} / {dur.ToDisplayString()} SMPTE"; - } - else - { - var span = TimeCode.FromSeconds(pos + Configuration.Settings.General.CurrentVideoOffsetInMs / TimeCode.BaseUnit); - _labelTimeCode.Text = $"{span.ToDisplayString()} / {dur.ToDisplayString()}"; - } - ResizeTimeCode(); - - RefreshPlayPauseButtons(); - } - } - - private void SetVolumeBarPosition(int mouseX) - { - int max = _pictureBoxVolumeBarBackground.Width - 18; - if (mouseX > max) - { - mouseX = max; - } - - double percent = (mouseX * 100.0) / max; - _pictureBoxVolumeBar.Width = (int)(max * percent / 100.0); - if (_videoPlayer != null) - { - _videoPlayer.Volume = (int)percent; - } - - _labelVolume.Text = (int)percent + "%"; - Configuration.Settings.General.VideoPlayerDefaultVolume = (int)percent; - } - - private void PictureBoxVolumeBarBackgroundMouseDown(object sender, MouseEventArgs e) - { - SetVolumeBarPosition(e.X - 6); - OnButtonClicked?.Invoke(sender, e); - } - - private void PictureBoxVolumeBarMouseDown(object sender, MouseEventArgs e) - { - SetVolumeBarPosition(e.X + 2); - OnButtonClicked?.Invoke(sender, e); - } - - private void RefreshVolumeBar() - { - if (VideoPlayer == null) - { - _pictureBoxVolumeBar.Width = 0; - } - else - { - int max = _pictureBoxVolumeBarBackground.Width - 18; - _pictureBoxVolumeBar.Width = (int)(max * Volume / 100.0); - } - } - - #endregion Progress bars - - #region VideoPlayer functions - - public void Play() - { - if (VideoPlayer != null) - { - VideoPlayer.Play(); - HideAllPlayImages(); - _pictureBoxPause.Visible = true; - _pictureBoxPause.BringToFront(); - RefreshProgressBar(); - } - OnButtonClicked?.Invoke(null, null); - } - - public void Stop() - { - if (VideoPlayer != null) - { - VideoPlayer.Pause(); - VideoPlayer.CurrentPosition = 0; - HideAllPauseImages(); - _pictureBoxPlay.Visible = true; - _pictureBoxPlay.BringToFront(); - RefreshProgressBar(); - } - OnButtonClicked?.Invoke(null, null); - } - - public void Pause() - { - if (VideoPlayer != null) - { - VideoPlayer.Pause(); - HideAllPauseImages(); - _pictureBoxPlay.Visible = true; - _pictureBoxPlay.BringToFront(); - RefreshProgressBar(); - } - } - - public void TogglePlayPause() - { - if (VideoPlayer != null) - { - if (VideoPlayer.IsPaused) - { - Play(); - } - else - { - Pause(); - } - } - } - - public bool IsPaused => VideoPlayer?.IsPaused == true; - - public double Volume - { - get - { - if (VideoPlayer != null) - { - return VideoPlayer.Volume; - } - - return 0; - } - set - { - if (VideoPlayer != null) - { - if (value > 0) - { - _muteOldVolume = null; - } - - if (value > 100) - { - VideoPlayer.Volume = 100; - } - else if (value < 0) - { - VideoPlayer.Volume = 0; - } - else - { - VideoPlayer.Volume = (int)value; - } - - RefreshVolumeBar(); - } - } - } - - /// - /// Current position in seconds - /// - public double CurrentPosition - { - get - { - if (VideoPlayer != null) - { - if (SmpteMode) - { - return VideoPlayer.CurrentPosition / 1.001; - } - else - { - return VideoPlayer.CurrentPosition; - } - } - return 0; - } - set - { - if (VideoPlayer != null) - { - if (SmpteMode) - { - VideoPlayer.CurrentPosition = value * 1.001; - } - else - { - VideoPlayer.CurrentPosition = value; - } - } - else - { - RefreshProgressBar(); - } - } - } - - /// - /// Total duration in seconds - /// - public double Duration - { - get - { - if (VideoPlayer != null) - { - return VideoPlayer.Duration; - } - - return 0; - } - } - - private bool Mute - { - get - { - if (VideoPlayer != null) - { - return _isMuted; - } - return false; - } - set - { - if (VideoPlayer != null) - { - if (!value && _muteOldVolume != null) - { - Volume = _muteOldVolume.Value; - _labelVolume.Visible = true; - } - else if (value) - { - _muteOldVolume = Volume; - Volume = 0; - _labelVolume.Visible = false; - } - _isMuted = value; - } - } - } - - #endregion VideoPlayer functions - - protected override void Dispose(bool disposing) - { - DeleteTempMpvFileName(); - base.Dispose(disposing); - _retryCount = 3; - SmpteMode = false; - } - - public void PauseAndDisposePlayer() - { - PanelPlayer.Hide(); - Pause(); - SubtitleText = string.Empty; - Chapters = new List(); - var temp = VideoPlayer; - VideoPlayer = null; - Application.DoEvents(); - temp.DisposeVideoPlayer(); - - // to avoid not showing video with libmpv, a new PanelPlayer is made... - PanelPlayer.MouseDown -= PanelPlayerMouseDown; - Controls.Add(MakePlayerPanel()); - PanelPlayer.BringToFront(); - PanelPlayer.MouseDown += PanelPlayerMouseDown; - VideoPlayerContainerResize(this, null); - - DeleteTempMpvFileName(); - _retryCount = 3; - SmpteMode = false; - RefreshProgressBar(); - } - - private bool IsMouseOverControl(Control control, Point cursorLocation) - { - if (control.ClientRectangle.Contains(cursorLocation)) - { - return true; - } - - return false; - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.ContainerFormats.Matroska; +using Nikse.SubtitleEdit.Logic.VideoPlayers; +using System; +using System.Drawing; +using System.IO; +using System.Text; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.SubtitleFormats; +using Nikse.SubtitleEdit.Logic; +using System.Collections.Generic; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Controls +{ + public sealed class VideoPlayerContainer : Panel + { + public class RichTextBoxViewOnly : RichTextBox + { + public RichTextBoxViewOnly() + { + ReadOnly = true; + BorderStyle = BorderStyle.None; + TabStop = false; + SetStyle(ControlStyles.Selectable, false); + SetStyle(ControlStyles.UserMouse, true); + MouseEnter += delegate { Cursor = Cursors.Default; }; + ScrollBars = RichTextBoxScrollBars.None; + Margin = new Padding(0); + } + + protected override void WndProc(ref Message m) + { + if (m.Msg == 0x204) + { + return; // WM_RBUTTONDOWN + } + + if (m.Msg == 0x205) + { + return; // WM_RBUTTONUP + } + + base.WndProc(ref m); + } + } + + public event EventHandler OnButtonClicked; + public event EventHandler OnEmptyPlayerClicked; + public Panel PanelPlayer { get; private set; } + private Panel _panelSubtitle; + private string _subtitleText = string.Empty; + private VideoPlayer _videoPlayer; + + public float FontSizeFactor { get; set; } + + public VideoPlayer VideoPlayer + { + get => _videoPlayer; + set + { + _videoPlayer = value; + if (_videoPlayer != null) + { + SetPlayerName(_videoPlayer.PlayerName); + } + + if (_videoPlayer is LibMpvDynamic && Configuration.Settings.General.MpvHandlesPreviewText) + { + _subtitlesHeight = 0; + } + else + { + _subtitlesHeight = 57; + } + DeleteTempMpvFileName(); + VideoPlayerContainerResize(this, null); + } + } + + public RichTextBoxViewOnly TextBox { get; private set; } + + public int VideoWidth { get; set; } + public int VideoHeight { get; set; } + + private bool _isMuted; + private double? _muteOldVolume; + private readonly System.ComponentModel.ComponentResourceManager _resources; + private int _controlsHeight = 47; + private const int OriginalSubtitlesHeight = 57; + private int _subtitlesHeight = OriginalSubtitlesHeight; + private readonly Color _backgroundColor = Color.FromArgb(18, 18, 18); + private Panel _panelControls; + + private PictureBox _pictureBoxBackground; + private PictureBox _pictureBoxReverse; + private PictureBox _pictureBoxReverseOver; + private PictureBox _pictureBoxReverseDown; + private PictureBox _pictureBoxFastForward; + private PictureBox _pictureBoxFastForwardOver; + private PictureBox _pictureBoxFastForwardDown; + private PictureBox _pictureBoxPlay; + private PictureBox _pictureBoxPlayOver; + private PictureBox _pictureBoxPlayDown; + private readonly PictureBox _pictureBoxPause = new PictureBox(); + private readonly PictureBox _pictureBoxPauseOver = new PictureBox(); + private readonly PictureBox _pictureBoxPauseDown = new PictureBox(); + private readonly PictureBox _pictureBoxStop = new PictureBox(); + private readonly PictureBox _pictureBoxStopOver = new PictureBox(); + private readonly PictureBox _pictureBoxStopDown = new PictureBox(); + private readonly PictureBox _pictureBoxFullscreen = new PictureBox(); + private readonly PictureBox _pictureBoxFullscreenOver = new PictureBox(); + private readonly PictureBox _pictureBoxFullscreenDown = new PictureBox(); + private readonly PictureBox _pictureBoxMute = new PictureBox(); + private readonly PictureBox _pictureBoxMuteOver = new PictureBox(); + private readonly PictureBox _pictureBoxMuteDown = new PictureBox(); + private readonly PictureBox _pictureBoxProgressbarBackground = new PictureBox(); + private readonly PictureBox _pictureBoxProgressBar = new PictureBox(); + private readonly PictureBox _pictureBoxVolumeBarBackground = new PictureBox(); + private readonly PictureBox _pictureBoxVolumeBar = new PictureBox(); + private readonly Label _labelTimeCode = new Label(); + private readonly Label _labelVideoPlayerName = new Label(); + private readonly Label _labelVolume = new Label(); + private readonly ToolTip _currentPositionToolTip = new ToolTip(); + private List _chapters; + + public List Chapters + { + get => _chapters; + set + { + _chapters = value; + Invalidate(true); + } + } + + public RightToLeft TextRightToLeft + { + get => TextBox.RightToLeft; + set + { + TextBox.RightToLeft = value; + TextBox.SelectAll(); + TextBox.SelectionAlignment = HorizontalAlignment.Center; + } + } + + public bool ShowStopButton + { + get => _pictureBoxStop.Visible || _pictureBoxStopOver.Visible || _pictureBoxStopDown.Visible; + set + { + if (value) + { + _pictureBoxStop.Visible = true; + _pictureBoxStop.BringToFront(); + } + else + { + HideAllStopImages(); + } + } + } + + public bool ShowMuteButton + { + get => _pictureBoxMute.Visible || _pictureBoxMuteOver.Visible || _pictureBoxMuteDown.Visible; + set + { + if (value) + { + _pictureBoxMute.Visible = true; + _pictureBoxMute.BringToFront(); + } + else + { + HideAllMuteImages(); + } + } + } + + public bool ShowFullscreenButton + { + get => _pictureBoxFullscreen.Visible || _pictureBoxFullscreenOver.Visible || _pictureBoxFullscreenDown.Visible; + set + { + if (value) + { + _pictureBoxFullscreen.Visible = true; + _pictureBoxFullscreen.BringToFront(); + } + else + { + HideAllFullscreenImages(); + } + } + } + + public VideoPlayerContainer() + { + _chapters = new List(); + SmpteMode = false; + FontSizeFactor = 1.0F; + BorderStyle = BorderStyle.None; + _resources = new System.ComponentModel.ComponentResourceManager(typeof(VideoPlayerContainer)); + _labelVolume.Text = Configuration.Settings.General.VideoPlayerDefaultVolume + "%"; + BackColor = _backgroundColor; + Controls.Add(MakePlayerPanel()); + Controls.Add(MakeSubtitlesPanel()); + Controls.Add(MakeControlsPanel()); + _panelControls.BringToFront(); + _pictureBoxProgressBar.Width = 0; + + ShowAllControls(); + if (Configuration.IsRunningOnLinux) + { + System.Threading.SynchronizationContext.Current.Post(TimeSpan.FromMilliseconds(1500), () => + { + if (string.IsNullOrEmpty(_labelVideoPlayerName.Text)) + { + _labelVideoPlayerName.Text = "..."; + } + FontSizeFactor = 1.0F; + SetSubtitleFont(); + _labelTimeCode.Text = $"{new TimeCode().ToDisplayString()} / ?"; + ShowAllControls(); + VideoPlayerContainerResize(this, null); + ShowAllControls(); + Invalidate(); + Refresh(); + }); + } + + VideoPlayerContainerResize(this, null); + Resize += VideoPlayerContainerResize; + PanelPlayer.MouseDown += PanelPlayerMouseDown; + + PictureBoxFastForwardMouseEnter(null, null); + PictureBoxFastForwardOverMouseLeave(null, null); + } + + private void ShowAllControls() + { + HideAllPlayImages(); + HideAllPauseImages(); + _pictureBoxPlay.Visible = true; + _pictureBoxPlay.BringToFront(); + + HideAllStopImages(); + _pictureBoxStop.Visible = true; + _pictureBoxStop.BringToFront(); + + HideAllStopImages(); + _pictureBoxStop.Visible = true; + _pictureBoxStop.BringToFront(); + + HideAllFullscreenImages(); + _pictureBoxFullscreen.Visible = true; + _pictureBoxFullscreen.BringToFront(); + + HideAllMuteImages(); + _pictureBoxMute.Visible = true; + _pictureBoxMute.BringToFront(); + + HideAllReverseImages(); + _pictureBoxReverse.Visible = true; + _pictureBoxReverse.BringToFront(); + + HideAllFastForwardImages(); + _pictureBoxFastForward.Visible = true; + _pictureBoxFastForward.BringToFront(); + + _pictureBoxProgressbarBackground.Visible = true; + _pictureBoxProgressbarBackground.BringToFront(); + _pictureBoxProgressBar.Visible = true; + _pictureBoxProgressBar.BringToFront(); + + _labelTimeCode.Visible = true; + _labelTimeCode.BringToFront(); + } + + public void EnableMouseWheelStep() + { + AddMouseWheelEvent(this); + } + + public void SetPlayerName(string s) + { + _labelVideoPlayerName.Text = s; + _labelVideoPlayerName.Left = Width - _labelVideoPlayerName.Width - 3; + } + + public void UpdatePlayerName() + { + if (_videoPlayer != null) + { + SetPlayerName(_videoPlayer.PlayerName); + } + } + + public void ResetTimeLabel() + { + _labelTimeCode.Text = string.Empty; + } + + private void AddMouseWheelEvent(Control control) + { + control.MouseWheel += ControlMouseWheel; + foreach (Control ctrl in control.Controls) + { + AddMouseWheelEvent(ctrl); + } + } + + private void ControlMouseWheel(object sender, MouseEventArgs e) + { + int delta = e.Delta; + double newPosition = CurrentPosition - delta / 256.0; + if (newPosition < 0) + { + newPosition = 0; + } + else if (newPosition > Duration) + { + newPosition = Duration; + } + + CurrentPosition = newPosition; + } + + private Control MakeSubtitlesPanel() + { + _panelSubtitle = new Panel { BackColor = _backgroundColor, Left = 0, Top = 0, Height = _subtitlesHeight + 1 }; + TextBox = new RichTextBoxViewOnly(); + _panelSubtitle.Controls.Add(TextBox); + TextBox.BackColor = _backgroundColor; + TextBox.ForeColor = Color.White; + TextBox.Dock = DockStyle.Fill; + SetSubtitleFont(); + TextBox.MouseClick += SubtitleTextBoxMouseClick; + return _panelSubtitle; + } + + public void SetSubtitleFont() + { + var gs = Configuration.Settings.General; + if (string.IsNullOrEmpty(gs.SubtitleFontName)) + { + gs.SubtitleFontName = "Tahoma"; + } + + if (gs.VideoPlayerPreviewFontBold) + { + TextBox.Font = new Font(gs.SubtitleFontName, gs.VideoPlayerPreviewFontSize * FontSizeFactor, FontStyle.Bold); + } + else + { + TextBox.Font = new Font(gs.SubtitleFontName, gs.VideoPlayerPreviewFontSize * FontSizeFactor, FontStyle.Regular); + } + + SubtitleText = _subtitleText; + } + + private void SubtitleTextBoxMouseClick(object sender, MouseEventArgs e) + { + TogglePlayPause(); + } + + public Paragraph LastParagraph { get; set; } + + public void SetSubtitleText(string text, Paragraph p, Subtitle subtitle) + { + var mpv = VideoPlayer as LibMpvDynamic; + LastParagraph = p; + if (mpv != null && Configuration.Settings.General.MpvHandlesPreviewText) + { + if (_subtitlesHeight > 0) + { + _subtitlesHeight = 0; + VideoPlayerContainerResize(null, null); + } + _subtitleText = text; + RefreshMpv(mpv, subtitle); + if (TextBox.Text.Length > 0) + { + TextBox.Text = string.Empty; + } + } + else + { + if (!string.IsNullOrEmpty(_mpvTextFileName) || _subtitlesHeight == 0) + { + mpv?.RemoveSubtitle(); + _subtitlesHeight = 57; + VideoPlayerContainerResize(null, null); + DeleteTempMpvFileName(); + } + SubtitleText = text; + } + } + + private Subtitle _subtitlePrev; + private string _mpvTextOld = string.Empty; + private string _mpvTextFileName; + private int _retryCount = 3; + private void RefreshMpv(LibMpvDynamic mpv, Subtitle subtitle) + { + if (subtitle == null) + { + return; + } + + try + { + var format = new AdvancedSubStationAlpha(); + string text; + + if (subtitle.Header != null && subtitle.Header.Contains("lang=\"ja\"", StringComparison.Ordinal) && subtitle.Header.Contains("bouten-", StringComparison.Ordinal)) + { + text = NetflixImsc11JapaneseToAss.Convert(subtitle, 1280, 720); + } + else + { + if (subtitle.Header == null || !subtitle.Header.Contains("[V4+ Styles]")) + { + var oldSub = subtitle; + subtitle = new Subtitle(subtitle); + if (TextBox.RightToLeft == RightToLeft.Yes && LanguageAutoDetect.CouldBeRightToLeftLanguage(subtitle)) + { + for (var index = 0; index < subtitle.Paragraphs.Count; index++) + { + var paragraph = subtitle.Paragraphs[index]; + if (LanguageAutoDetect.ContainsRightToLeftLetter(paragraph.Text)) + { + paragraph.Text = Utilities.FixRtlViaUnicodeChars(paragraph.Text); + } + } + } + + var oldFontSize = Configuration.Settings.SubtitleSettings.SsaFontSize; + var oldFontBold = Configuration.Settings.SubtitleSettings.SsaFontBold; + Configuration.Settings.SubtitleSettings.SsaFontSize = Configuration.Settings.General.VideoPlayerPreviewFontSize; + Configuration.Settings.SubtitleSettings.SsaFontBold = Configuration.Settings.General.VideoPlayerPreviewFontBold; + subtitle.Header = AdvancedSubStationAlpha.DefaultHeader; + Configuration.Settings.SubtitleSettings.SsaFontSize = oldFontSize; + Configuration.Settings.SubtitleSettings.SsaFontBold = oldFontBold; + + if (oldSub.Header != null && oldSub.Header.Length > 20 && oldSub.Header.Substring(3, 3) == "STL") + { + subtitle.Header = subtitle.Header.Replace("Style: Default,", "Style: Box,arial,20,&H00FFFFFF,&H0300FFFF,&H00000000,&H02000000,0,0,0,0,100,100,0,0,3,2,0,2,10,10,10,1" + + Environment.NewLine + "Style: Default,"); + for (var index = 0; index < subtitle.Paragraphs.Count; index++) + { + var p = subtitle.Paragraphs[index]; + if (p.Text.Contains("")) + { + p.Extra = "Box"; + p.Text = p.Text.Replace("", string.Empty).Replace("", string.Empty); + } + } + } + } + text = subtitle.ToText(format); + } + + + if (text != _mpvTextOld || _mpvTextFileName == null || _retryCount > 0) + { + if (_retryCount >= 0 || string.IsNullOrEmpty(_mpvTextFileName) || _subtitlePrev == null || _subtitlePrev.FileName != subtitle.FileName || !_mpvTextFileName.EndsWith(format.Extension, StringComparison.Ordinal)) + { + mpv.RemoveSubtitle(); + DeleteTempMpvFileName(); + _mpvTextFileName = FileUtil.GetTempFileName(format.Extension); + File.WriteAllText(_mpvTextFileName, text); + mpv.LoadSubtitle(_mpvTextFileName); + _retryCount--; + } + else + { + File.WriteAllText(_mpvTextFileName, text); + mpv.ReloadSubtitle(); + } + _mpvTextOld = text; + } + _subtitlePrev = subtitle; + } + catch + { + // ignored + } + } + + private void DeleteTempMpvFileName() + { + try + { + if (File.Exists(_mpvTextFileName)) + { + File.Delete(_mpvTextFileName); + _mpvTextFileName = null; + } + } + catch + { + // ignored + } + } + + public string SubtitleText + { + get => _subtitleText; + set + { + _subtitleText = value; + + bool alignLeft = _subtitleText.StartsWith("{\\a1}", StringComparison.Ordinal) || _subtitleText.StartsWith("{\\a5}", StringComparison.Ordinal) || _subtitleText.StartsWith("{\\a9}", StringComparison.Ordinal) || // sub station alpha + _subtitleText.StartsWith("{\\an1}", StringComparison.Ordinal) || _subtitleText.StartsWith("{\\an4}", StringComparison.Ordinal) || _subtitleText.StartsWith("{\\an7}", StringComparison.Ordinal); // advanced sub station alpha + + bool alignRight = _subtitleText.StartsWith("{\\a3}", StringComparison.Ordinal) || _subtitleText.StartsWith("{\\a7}", StringComparison.Ordinal) || _subtitleText.StartsWith("{\\a11}", StringComparison.Ordinal) || // sub station alpha + _subtitleText.StartsWith("{\\an3}", StringComparison.Ordinal) || _subtitleText.StartsWith("{\\an6}", StringComparison.Ordinal) || _subtitleText.StartsWith("{\\an9}", StringComparison.Ordinal); // advanced sub station alpha + + // remove styles for display text (except italic) + string text = Utilities.RemoveSsaTags(_subtitleText); + text = text.Replace("", string.Empty); + text = text.Replace("", string.Empty); + text = text.Replace("", string.Empty); + + // display italic + var sb = new StringBuilder(); + int i = 0; + bool isItalic = false; + bool isBold = false; + bool isUnderline = false; + bool isFontColor = false; + int fontColorBegin = 0; + TextBox.Text = string.Empty; + int letterCount = 0; + var fontColorLookups = new System.Collections.Generic.Dictionary(); + var styleLookups = new System.Collections.Generic.Dictionary(text.Length); + for (int j = 0; j < text.Length; j++) + { + styleLookups.Add(j, Configuration.Settings.General.VideoPlayerPreviewFontBold ? FontStyle.Bold : FontStyle.Regular); + } + + Color fontColor = Color.White; + while (i < text.Length) + { + if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase)) + { + TextBox.AppendText(sb.ToString()); + sb.Clear(); + isItalic = true; + i += 2; + } + else if (isItalic && text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase)) + { + TextBox.AppendText(sb.ToString()); + sb.Clear(); + isItalic = false; + i += 3; + } + else if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase)) + { + if (!Configuration.Settings.General.VideoPlayerPreviewFontBold) + { + TextBox.AppendText(sb.ToString()); + sb.Clear(); + isBold = true; + } + i += 2; + } + else if (isBold && text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase)) + { + if (!Configuration.Settings.General.VideoPlayerPreviewFontBold) + { + TextBox.AppendText(sb.ToString()); + sb.Clear(); + isBold = false; + } + i += 3; + } + else if (Configuration.Settings.General.VideoPlayerPreviewFontBold && text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase)) + { + i += 3; + } + else if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase)) + { + TextBox.AppendText(sb.ToString()); + sb.Clear(); + isUnderline = true; + i += 2; + } + else if (isUnderline && text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase)) + { + TextBox.AppendText(sb.ToString()); + sb.Clear(); + isUnderline = false; + i += 3; + } + else if (text.Substring(i).StartsWith("'); + if (end > 0) + { + string f = s.Substring(0, end); + int colorStart = f.IndexOf(" color=", StringComparison.OrdinalIgnoreCase); + + if (colorStart > 0) + { + int colorEnd = colorStart + " color=".Length + 1; + if (colorEnd < f.Length) + { + colorEnd = f.IndexOf('"', colorEnd); + if (colorEnd > 0 || colorEnd == -1) + { + if (colorEnd == -1) + { + s = f.Substring(colorStart); + } + else + { + s = f.Substring(colorStart, colorEnd - colorStart); + } + + s = s.Remove(0, " color=".Length); + s = s.Trim('"'); + s = s.Trim('\''); + try + { + fontColor = ColorTranslator.FromHtml(s); + fontFound = true; + } + catch + { + fontFound = false; + if (s.Length > 0) + { + try + { + fontColor = ColorTranslator.FromHtml("#" + s); + fontFound = true; + } + catch + { + fontFound = false; + } + } + } + } + } + } + i += end; + } + if (fontFound) + { + TextBox.AppendText(sb.ToString()); + sb.Clear(); + isFontColor = true; + fontColorBegin = letterCount; + } + } + else if (isFontColor && text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase)) + { + fontColorLookups.Add(new Point(fontColorBegin, TextBox.Text.Length + sb.ToString().Length - fontColorBegin), fontColor); + TextBox.AppendText(sb.ToString()); + sb.Clear(); + isFontColor = false; + i += 6; + } + else if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase)) + { + i += 6; + } + else if (text[i] == '\n') // RichTextBox only count NewLine as one character! + { + sb.Append(text[i]); + } + else if (text[i] == '\r') + { + // skip carriage return (0xd / 13) + } + else + { + var idx = TextBox.TextLength + sb.Length; + if (isBold) + { + styleLookups[idx] |= FontStyle.Bold; + } + + if (isItalic) + { + styleLookups[idx] |= FontStyle.Italic; + } + + if (isUnderline) + { + styleLookups[idx] |= FontStyle.Underline; + } + + sb.Append(text[i]); + letterCount++; + } + i++; + } + TextBox.Text += sb.ToString(); + TextBox.SelectAll(); + + if (alignLeft) + { + TextBox.SelectionAlignment = HorizontalAlignment.Left; + } + else if (alignRight) + { + TextBox.SelectionAlignment = HorizontalAlignment.Right; + } + else + { + TextBox.SelectionAlignment = HorizontalAlignment.Center; + } + + TextBox.DeselectAll(); + + Font currentFont = TextBox.SelectionFont; + for (int k = 0; k < TextBox.TextLength; k++) + { + TextBox.SelectionStart = k; + TextBox.SelectionLength = 1; + TextBox.SelectionFont = new Font(currentFont.FontFamily, currentFont.Size, styleLookups[k]); + TextBox.DeselectAll(); + } + + foreach (var entry in fontColorLookups) + { + TextBox.SelectionStart = entry.Key.X; + TextBox.SelectionLength = entry.Key.Y; + TextBox.SelectionColor = entry.Value; + TextBox.DeselectAll(); + } + } + } + + private void PanelPlayerMouseDown(object sender, MouseEventArgs e) + { + if (VideoPlayer == null) + { + OnEmptyPlayerClicked?.Invoke(sender, e); + } + + TogglePlayPause(); + } + + public void InitializeVolume(double defaultVolume) + { + int maxVolume = _pictureBoxVolumeBarBackground.Width - 18; + _pictureBoxVolumeBar.Width = (int)(maxVolume * defaultVolume / 100.0); + } + + private Control MakePlayerPanel() + { + PanelPlayer = new Panel { BackColor = _backgroundColor, Left = 0, Top = 0 }; + return PanelPlayer; + } + + public void HideControls(bool hideCursor) + { + if (_panelControls.Visible) + { + _panelSubtitle.Height += _controlsHeight; + _panelControls.Visible = false; + } + if (hideCursor) + { + HideCursor(); + } + } + + public void ShowControls() + { + if (!_panelControls.Visible) + { + _panelControls.Visible = true; + _panelControls.BringToFront(); + _panelSubtitle.Height -= _controlsHeight; + } + ShowCursor(); + } + + public void HideCursor() + { + if (_cursorStatus < 0) + { + return; + } + + _cursorStatus--; + if (VideoPlayer != null) + { + var mpv = VideoPlayer as LibMpvDynamic; + mpv?.HideCursor(); + } + Cursor.Hide(); + } + + private int _cursorStatus; + + public void ShowCursor() + { + if (_cursorStatus >= 0) + { + return; + } + + _cursorStatus++; + if (VideoPlayer != null) + { + var mpv = VideoPlayer as LibMpvDynamic; + mpv?.ShowCursor(); + } + Cursor.Show(); + } + + private Control MakeControlsPanel() + { + _panelControls = new Panel { Left = 0, Height = _controlsHeight }; + + _pictureBoxBackground = new PictureBox + { + Image = (Image)_resources.GetObject("pictureBoxBar.Image"), + Location = new Point(0, 0), + Name = "_pictureBoxBackground", + Size = new Size(200, 45), + SizeMode = PictureBoxSizeMode.StretchImage, + TabStop = false + }; + _panelControls.Controls.Add(_pictureBoxBackground); + + _pictureBoxPlay = new PictureBox + { + Image = (Image)_resources.GetObject("pictureBoxPlay.Image"), + Location = new Point(22, 126 - 113), + Name = "_pictureBoxPlay", + Size = new Size(29, 29), + SizeMode = PictureBoxSizeMode.AutoSize, + TabStop = false + }; + _pictureBoxPlay.MouseEnter += PictureBoxPlayMouseEnter; + _panelControls.Controls.Add(_pictureBoxPlay); + + _pictureBoxPlayDown = new PictureBox + { + Image = (Image)_resources.GetObject("pictureBoxPlayDown.Image"), + Location = new Point(22, 127 - 113), + Name = "_pictureBoxPlayDown", + Size = new Size(29, 29), + SizeMode = PictureBoxSizeMode.AutoSize, + TabStop = false + }; + _panelControls.Controls.Add(_pictureBoxPlayDown); + + _pictureBoxPlayOver = new PictureBox + { + Image = (Image)_resources.GetObject("pictureBoxPlayOver.Image"), + Location = new Point(23, 126 - 113), + Name = "_pictureBoxPlayOver", + Size = new Size(29, 29), + SizeMode = PictureBoxSizeMode.AutoSize, + TabStop = false + }; + _pictureBoxPlayOver.MouseLeave += PictureBoxPlayOverMouseLeave; + _pictureBoxPlayOver.MouseDown += PictureBoxPlayOverMouseDown; + _pictureBoxPlayOver.MouseUp += PictureBoxPlayOverMouseUp; + _panelControls.Controls.Add(_pictureBoxPlayOver); + + _pictureBoxPause.Image = (Image)_resources.GetObject("pictureBoxPause.Image"); + _pictureBoxPause.Location = new Point(23, 126 - 113); + _pictureBoxPause.Name = "_pictureBoxPause"; + _pictureBoxPause.Size = new Size(29, 29); + _pictureBoxPause.SizeMode = PictureBoxSizeMode.AutoSize; + _pictureBoxPause.TabStop = false; + _pictureBoxPause.MouseEnter += PictureBoxPauseMouseEnter; + _panelControls.Controls.Add(_pictureBoxPause); + + _pictureBoxPauseDown.Image = (Image)_resources.GetObject("pictureBoxPauseDown.Image"); + _pictureBoxPauseDown.Location = new Point(22, 127 - 113); + _pictureBoxPauseDown.Name = "_pictureBoxPauseDown"; + _pictureBoxPauseDown.Size = new Size(29, 29); + _pictureBoxPauseDown.SizeMode = PictureBoxSizeMode.AutoSize; + _pictureBoxPauseDown.TabStop = false; + _panelControls.Controls.Add(_pictureBoxPauseDown); + + _pictureBoxPauseOver.Image = (Image)_resources.GetObject("pictureBoxPauseOver.Image"); + _pictureBoxPauseOver.Location = new Point(22, 127 - 113); + _pictureBoxPauseOver.Name = "_pictureBoxPauseOver"; + _pictureBoxPauseOver.Size = new Size(29, 29); + _pictureBoxPauseOver.SizeMode = PictureBoxSizeMode.AutoSize; + _pictureBoxPauseOver.TabStop = false; + _pictureBoxPauseOver.MouseLeave += PictureBoxPauseOverMouseLeave; + _pictureBoxPauseOver.MouseDown += PictureBoxPauseOverMouseDown; + _pictureBoxPauseOver.MouseUp += PictureBoxPauseOverMouseUp; + _panelControls.Controls.Add(_pictureBoxPauseOver); + + _pictureBoxStop.Image = (Image)_resources.GetObject("pictureBoxStop.Image"); + _pictureBoxStop.Location = new Point(52, 130 - 113); + _pictureBoxStop.Name = "_pictureBoxStop"; + _pictureBoxStop.Size = new Size(20, 20); + _pictureBoxStop.SizeMode = PictureBoxSizeMode.AutoSize; + _pictureBoxStop.TabStop = false; + _pictureBoxStop.MouseEnter += PictureBoxStopMouseEnter; + _panelControls.Controls.Add(_pictureBoxStop); + + _pictureBoxStopDown.Image = (Image)_resources.GetObject("pictureBoxStopDown.Image"); + _pictureBoxStopDown.Location = new Point(52, 130 - 113); + _pictureBoxStopDown.Name = "_pictureBoxStopDown"; + _pictureBoxStopDown.Size = new Size(20, 20); + _pictureBoxStopDown.SizeMode = PictureBoxSizeMode.AutoSize; + _pictureBoxStopDown.TabStop = false; + _panelControls.Controls.Add(_pictureBoxStopDown); + + _pictureBoxStopOver.Image = (Image)_resources.GetObject("pictureBoxStopOver.Image"); + _pictureBoxStopOver.Location = new Point(52, 130 - 113); + _pictureBoxStopOver.Name = "_pictureBoxStopOver"; + _pictureBoxStopOver.Size = new Size(20, 20); + _pictureBoxStopOver.SizeMode = PictureBoxSizeMode.AutoSize; + _pictureBoxStopOver.TabStop = false; + _pictureBoxStopOver.MouseLeave += PictureBoxStopOverMouseLeave; + _pictureBoxStopOver.MouseDown += PictureBoxStopOverMouseDown; + _pictureBoxStopOver.MouseUp += PictureBoxStopOverMouseUp; + _panelControls.Controls.Add(_pictureBoxStopOver); + + _pictureBoxFullscreen.Image = (Image)_resources.GetObject("pictureBoxFS.Image"); + _pictureBoxFullscreen.Location = new Point(95, 130 - 113); + _pictureBoxFullscreen.Name = "_pictureBoxFullscreen"; + _pictureBoxFullscreen.Size = new Size(20, 20); + _pictureBoxFullscreen.SizeMode = PictureBoxSizeMode.AutoSize; + _pictureBoxFullscreen.TabStop = false; + _pictureBoxFullscreen.MouseEnter += PictureBoxFullscreenMouseEnter; + _panelControls.Controls.Add(_pictureBoxFullscreen); + + _pictureBoxFullscreenDown.Image = (Image)_resources.GetObject("pictureBoxFSDown.Image"); + _pictureBoxFullscreenDown.Location = new Point(95, 130 - 113); + _pictureBoxFullscreenDown.Name = "_pictureBoxFullscreenDown"; + _pictureBoxFullscreenDown.Size = new Size(20, 20); + _pictureBoxFullscreenDown.SizeMode = PictureBoxSizeMode.AutoSize; + _pictureBoxFullscreenDown.TabStop = false; + _panelControls.Controls.Add(_pictureBoxFullscreenDown); + + _pictureBoxFullscreenOver.Image = (Image)_resources.GetObject("pictureBoxFSOver.Image"); + _pictureBoxFullscreenOver.Location = new Point(95, 130 - 113); + _pictureBoxFullscreenOver.Name = "_pictureBoxFullscreenOver"; + _pictureBoxFullscreenOver.Size = new Size(20, 20); + _pictureBoxFullscreenOver.SizeMode = PictureBoxSizeMode.AutoSize; + _pictureBoxFullscreenOver.TabStop = false; + _pictureBoxFullscreenOver.MouseLeave += PictureBoxFullscreenOverMouseLeave; + _pictureBoxFullscreenOver.MouseDown += PictureBoxFullscreenOverMouseDown; + _pictureBoxFullscreenOver.MouseUp += PictureBoxFullscreenOverMouseUp; + _panelControls.Controls.Add(_pictureBoxFullscreenOver); + + _pictureBoxProgressbarBackground.Anchor = AnchorStyles.Top | AnchorStyles.Left; + _pictureBoxProgressbarBackground.BackColor = Color.Transparent; + _pictureBoxProgressbarBackground.Image = (Image)_resources.GetObject("pictureBoxProgressbarBackground.Image"); + _pictureBoxProgressbarBackground.Location = new Point(43, 114 - 113); + _pictureBoxProgressbarBackground.Margin = new Padding(0); + _pictureBoxProgressbarBackground.Name = "_pictureBoxProgressbarBackground"; + _pictureBoxProgressbarBackground.Size = new Size(531, 12); + _pictureBoxProgressbarBackground.SizeMode = PictureBoxSizeMode.StretchImage; + _pictureBoxProgressbarBackground.TabStop = false; + _pictureBoxProgressbarBackground.Paint += PictureBoxProgressbarBackgroundPaint; + _pictureBoxProgressbarBackground.MouseDown += PictureBoxProgressbarBackgroundMouseDown; + _pictureBoxProgressbarBackground.MouseLeave += PictureBoxProgressbarBackgroundMouseLeave; + _pictureBoxProgressbarBackground.MouseMove += PictureBoxProgressbarBackgroundMouseMove; + _panelControls.Controls.Add(_pictureBoxProgressbarBackground); + + _pictureBoxProgressBar.Image = (Image)_resources.GetObject("pictureBoxProgressBar.Image"); + _pictureBoxProgressBar.Location = new Point(47, 118 - 113); + _pictureBoxProgressBar.Name = "_pictureBoxProgressBar"; + _pictureBoxProgressBar.Size = new Size(318, 4); + _pictureBoxProgressBar.SizeMode = PictureBoxSizeMode.StretchImage; + _pictureBoxProgressBar.TabStop = false; + _pictureBoxProgressBar.Paint += PictureBoxProgressBarPaint; + _pictureBoxProgressBar.MouseDown += PictureBoxProgressBarMouseDown; + _pictureBoxProgressBar.MouseLeave += PictureBoxProgressBarMouseLeave; + _pictureBoxProgressBar.MouseMove += PictureBoxProgressBarMouseMove; + _panelControls.Controls.Add(_pictureBoxProgressBar); + _pictureBoxProgressBar.BringToFront(); + + _pictureBoxMute.Image = (Image)_resources.GetObject("pictureBoxMute.Image"); + _pictureBoxMute.Location = new Point(75, 131 - 113); + _pictureBoxMute.Name = "_pictureBoxMute"; + _pictureBoxMute.Size = new Size(19, 19); + _pictureBoxMute.SizeMode = PictureBoxSizeMode.AutoSize; + _pictureBoxMute.TabStop = false; + _pictureBoxMute.MouseEnter += PictureBoxMuteMouseEnter; + _panelControls.Controls.Add(_pictureBoxMute); + + _pictureBoxMuteDown.Image = (Image)_resources.GetObject("pictureBoxMuteDown.Image"); + _pictureBoxMuteDown.Location = new Point(75, 131 - 113); + _pictureBoxMuteDown.Name = "_pictureBoxMuteDown"; + _pictureBoxMuteDown.Size = new Size(19, 19); + _pictureBoxMuteDown.SizeMode = PictureBoxSizeMode.AutoSize; + _pictureBoxMuteDown.TabStop = false; + _pictureBoxMuteDown.Click += PictureBoxMuteDownClick; + _panelControls.Controls.Add(_pictureBoxMuteDown); + + _pictureBoxMuteOver.Image = (Image)_resources.GetObject("pictureBoxMuteOver.Image"); + _pictureBoxMuteOver.Location = new Point(75, 131 - 113); + _pictureBoxMuteOver.Name = "_pictureBoxMuteOver"; + _pictureBoxMuteOver.Size = new Size(19, 19); + _pictureBoxMuteOver.SizeMode = PictureBoxSizeMode.AutoSize; + _pictureBoxMuteOver.TabStop = false; + _pictureBoxMuteOver.MouseLeave += PictureBoxMuteOverMouseLeave; + _pictureBoxMuteOver.MouseDown += PictureBoxMuteOverMouseDown; + _pictureBoxMuteOver.MouseUp += PictureBoxMuteOverMouseUp; + _panelControls.Controls.Add(_pictureBoxMuteOver); + + _pictureBoxVolumeBarBackground.Image = (Image)_resources.GetObject("pictureBoxVolumeBarBackground.Image"); + _pictureBoxVolumeBarBackground.Location = new Point(111, 135 - 113); + _pictureBoxVolumeBarBackground.Name = "_pictureBoxVolumeBarBackground"; + _pictureBoxVolumeBarBackground.Size = new Size(82, 13); + _pictureBoxVolumeBarBackground.SizeMode = PictureBoxSizeMode.AutoSize; + _pictureBoxVolumeBarBackground.TabStop = false; + _pictureBoxVolumeBarBackground.MouseDown += PictureBoxVolumeBarBackgroundMouseDown; + _panelControls.Controls.Add(_pictureBoxVolumeBarBackground); + + _pictureBoxVolumeBar.Image = (Image)_resources.GetObject("pictureBoxVolumeBar.Image"); + _pictureBoxVolumeBar.Location = new Point(120, 139 - 113); + _pictureBoxVolumeBar.Name = "_pictureBoxVolumeBar"; + _pictureBoxVolumeBar.Size = new Size(48, 4); + _pictureBoxVolumeBar.SizeMode = PictureBoxSizeMode.StretchImage; + _pictureBoxVolumeBar.TabStop = false; + _pictureBoxVolumeBar.MouseDown += PictureBoxVolumeBarMouseDown; + _panelControls.Controls.Add(_pictureBoxVolumeBar); + _pictureBoxVolumeBar.BringToFront(); + + _pictureBoxReverse = new PictureBox + { + Image = (Image)_resources.GetObject("pictureBoxReverse.Image"), + Location = new Point(28, 3), + Name = "_pictureBoxReverse", + Size = new Size(16, 8), + SizeMode = PictureBoxSizeMode.AutoSize, + TabStop = false + }; + _panelControls.Controls.Add(_pictureBoxReverse); + _pictureBoxReverse.MouseEnter += PictureBoxReverseMouseEnter; + + _pictureBoxReverseOver = new PictureBox + { + Image = (Image)_resources.GetObject("pictureBoxReverseMouseOver.Image"), + Location = _pictureBoxReverse.Location, + Name = "_pictureBoxReverseOver", + Size = _pictureBoxReverse.Size, + SizeMode = PictureBoxSizeMode.AutoSize, + TabStop = false + }; + _panelControls.Controls.Add(_pictureBoxReverseOver); + _pictureBoxReverseOver.MouseLeave += PictureBoxReverseOverMouseLeave; + _pictureBoxReverseOver.MouseDown += PictureBoxReverseOverMouseDown; + _pictureBoxReverseOver.MouseUp += PictureBoxReverseOverMouseUp; + + _pictureBoxReverseDown = new PictureBox + { + Image = (Image)_resources.GetObject("pictureBoxReverseMouseDown.Image"), + Location = _pictureBoxReverse.Location, + Name = "_pictureBoxReverseOver", + Size = _pictureBoxReverse.Size, + SizeMode = PictureBoxSizeMode.AutoSize, + TabStop = false + }; + _panelControls.Controls.Add(_pictureBoxReverseDown); + + _pictureBoxFastForward = new PictureBox + { + Image = (Image)_resources.GetObject("pictureBoxFastForward.Image"), + Location = new Point(571, 1), + Name = "_pictureBoxFastForward", + Size = new Size(17, 13), + SizeMode = PictureBoxSizeMode.AutoSize, + TabStop = false + }; + _panelControls.Controls.Add(_pictureBoxFastForward); + _pictureBoxFastForward.MouseEnter += PictureBoxFastForwardMouseEnter; + + _pictureBoxFastForwardOver = new PictureBox + { + Image = (Image)_resources.GetObject("pictureBoxFastForwardMouseOver.Image"), + Location = _pictureBoxFastForward.Location, + Name = "_pictureBoxFastForwardOver", + Size = _pictureBoxFastForward.Size, + SizeMode = PictureBoxSizeMode.AutoSize, + TabStop = false + }; + _panelControls.Controls.Add(_pictureBoxFastForwardOver); + _pictureBoxFastForwardOver.MouseLeave += PictureBoxFastForwardOverMouseLeave; + _pictureBoxFastForwardOver.MouseDown += PictureBoxFastForwardOverMouseDown; + _pictureBoxFastForwardOver.MouseUp += PictureBoxFastForwardOverMouseUp; + + _pictureBoxFastForwardDown = new PictureBox + { + Image = (Image)_resources.GetObject("pictureBoxFastForwardMouseDown.Image"), + Location = _pictureBoxFastForward.Location, + Name = "_pictureBoxFastForwardDown", + Size = _pictureBoxFastForward.Size, + SizeMode = PictureBoxSizeMode.AutoSize, + TabStop = false + }; + _panelControls.Controls.Add(_pictureBoxFastForwardDown); + + _labelVolume.Location = new Point(120, 17); + _labelVolume.ForeColor = Color.WhiteSmoke; + _labelVolume.BackColor = Color.FromArgb(67, 75, 93); + _labelVolume.AutoSize = true; + _labelVolume.Font = new Font(_labelTimeCode.Font.FontFamily, 6); + _panelControls.Controls.Add(_labelVolume); + + _labelTimeCode.Location = new Point(280, 28); + _labelTimeCode.ForeColor = Color.WhiteSmoke; + _labelTimeCode.Font = new Font(_labelTimeCode.Font.FontFamily, 8, FontStyle.Bold); + _labelTimeCode.AutoSize = true; + _panelControls.Controls.Add(_labelTimeCode); + + _labelVideoPlayerName.Location = new Point(282, 17); + _labelVideoPlayerName.ForeColor = Color.WhiteSmoke; + _labelVideoPlayerName.BackColor = Color.FromArgb(67, 75, 93); + _labelVideoPlayerName.AutoSize = true; + _labelVideoPlayerName.Font = new Font(_labelTimeCode.Font.FontFamily, 6); + _panelControls.Controls.Add(_labelVideoPlayerName); + + if (Configuration.Settings.General.UseDarkTheme) + { + _labelVolume.ForeColor = Color.Gray; + _labelTimeCode.ForeColor = Color.Gray; + _labelVideoPlayerName.ForeColor = Color.Gray; + } + + + _pictureBoxBackground.SendToBack(); + _pictureBoxFastForwardDown.BringToFront(); + _pictureBoxFastForwardOver.BringToFront(); + _pictureBoxFastForward.BringToFront(); + _pictureBoxPlay.BringToFront(); + + _panelControls.BackColor = _backgroundColor; + _pictureBoxPlayDown.BringToFront(); + _pictureBoxPlayOver.BringToFront(); + _pictureBoxPlay.BringToFront(); + _labelTimeCode.BringToFront(); + _labelVolume.BringToFront(); + return _panelControls; + } + + public void VideoPlayerContainerResize(object sender, EventArgs e) + { + _controlsHeight = _pictureBoxBackground.Height; + PanelPlayer.Height = Height - (_controlsHeight + _subtitlesHeight); + PanelPlayer.Width = Width; + _videoPlayer?.Resize(PanelPlayer.Width, PanelPlayer.Height); + + _panelSubtitle.Top = Height - (_controlsHeight + _subtitlesHeight); + _panelSubtitle.Width = Width; + + _panelControls.Top = Height - _controlsHeight + 2; + _panelControls.Width = Width; + _pictureBoxBackground.Width = Width; + _pictureBoxProgressbarBackground.Width = Width - (_pictureBoxProgressbarBackground.Left * 2); + _pictureBoxFastForward.Left = Width - 48; + _pictureBoxFastForwardDown.Left = _pictureBoxFastForward.Left; + _pictureBoxFastForwardOver.Left = _pictureBoxFastForward.Left; + + ResizeTimeCode(); + + _labelVideoPlayerName.Left = Width - _labelVideoPlayerName.Width - 3; + DeleteTempMpvFileName(); + } + + private void ResizeTimeCode() + { + if (string.IsNullOrEmpty(_labelTimeCode.Text)) + { + var span = TimeCode.FromSeconds(1); + _labelTimeCode.Text = $"{span.ToDisplayString()} / {span.ToDisplayString()}{(SmpteMode ? " SMPTE" : string.Empty)}"; + _labelTimeCode.Left = Width - _labelTimeCode.Width - 9; + if (_labelTimeCode.Top + _labelTimeCode.Height >= _panelControls.Height - 4) + { + _labelTimeCode.Font = new Font(_labelTimeCode.Font.Name, _labelTimeCode.Font.Size - 1); + } + + _labelTimeCode.Text = string.Empty; + } + else + { + _labelTimeCode.Left = Width - _labelTimeCode.Width - 9; + if (_labelTimeCode.Top + _labelTimeCode.Height >= _panelControls.Height - 4) + { + _labelTimeCode.Font = new Font(_labelTimeCode.Font.Name, _labelTimeCode.Font.Size - 1); + } + } + } + + #region PlayPauseButtons + + public void RefreshPlayPauseButtons() + { + if (VideoPlayer != null) + { + if (VideoPlayer.IsPlaying) + { + if (!_pictureBoxPause.Visible && !_pictureBoxPauseDown.Visible && !_pictureBoxPauseOver.Visible) + { + HideAllPauseImages(); + HideAllPlayImages(); + _pictureBoxPause.Visible = true; + _pictureBoxPause.BringToFront(); + } + } + else + { + if (!_pictureBoxPlay.Visible && !_pictureBoxPlayOver.Visible && !_pictureBoxPlayDown.Visible) + { + HideAllPauseImages(); + HideAllPlayImages(); + _pictureBoxPlay.Visible = true; + _pictureBoxPlay.BringToFront(); + } + } + } + } + + private void HideAllPlayImages() + { + _pictureBoxPlayOver.Visible = false; + _pictureBoxPlayDown.Visible = false; + _pictureBoxPlay.Visible = false; + } + + private void PictureBoxPlayMouseEnter(object sender, EventArgs e) + { + if (_pictureBoxPlay.Visible) + { + HideAllPlayImages(); + _pictureBoxPlayOver.Visible = true; + _pictureBoxPlayOver.BringToFront(); + } + } + + private void PictureBoxPlayOverMouseLeave(object sender, EventArgs e) + { + if (_pictureBoxPlayOver.Visible) + { + HideAllPlayImages(); + _pictureBoxPlay.Visible = true; + _pictureBoxPlay.BringToFront(); + } + } + + private void PictureBoxPlayOverMouseDown(object sender, MouseEventArgs e) + { + HideAllPlayImages(); + _pictureBoxPlayDown.Visible = true; + _pictureBoxPlayDown.BringToFront(); + OnButtonClicked?.Invoke(sender, e); + } + + private void PictureBoxPlayOverMouseUp(object sender, MouseEventArgs e) + { + if (IsMouseOverControl((PictureBox)sender, e.Location)) + { + HideAllPlayImages(); + _pictureBoxPause.Visible = true; + _pictureBoxPause.BringToFront(); + Play(); + } + else + { + HideAllPlayImages(); + _pictureBoxPlay.Visible = true; + _pictureBoxPause.BringToFront(); + } + } + + private void HideAllPauseImages() + { + _pictureBoxPauseOver.Visible = false; + _pictureBoxPauseDown.Visible = false; + _pictureBoxPause.Visible = false; + } + + private void PictureBoxPauseMouseEnter(object sender, EventArgs e) + { + if (_pictureBoxPause.Visible) + { + HideAllPauseImages(); + _pictureBoxPauseOver.Visible = true; + _pictureBoxPauseOver.BringToFront(); + } + } + + private void PictureBoxPauseOverMouseLeave(object sender, EventArgs e) + { + if (_pictureBoxPauseOver.Visible) + { + HideAllPauseImages(); + _pictureBoxPause.Visible = true; + _pictureBoxPause.BringToFront(); + } + } + + private void PictureBoxPauseOverMouseDown(object sender, MouseEventArgs e) + { + if (_pictureBoxPauseOver.Visible) + { + HideAllPauseImages(); + _pictureBoxPauseDown.Visible = true; + _pictureBoxPauseDown.BringToFront(); + } + OnButtonClicked?.Invoke(sender, e); + } + + private void PictureBoxPauseOverMouseUp(object sender, MouseEventArgs e) + { + if (IsMouseOverControl((PictureBox)sender, e.Location)) + { + HideAllPauseImages(); + _pictureBoxPlay.Visible = true; + _pictureBoxPlay.BringToFront(); + Pause(); + } + else + { + HideAllPauseImages(); + _pictureBoxPause.Visible = true; + _pictureBoxPause.BringToFront(); + } + } + + #endregion PlayPauseButtons + + #region StopButtons + + private void HideAllStopImages() + { + _pictureBoxStopOver.Visible = false; + _pictureBoxStopDown.Visible = false; + _pictureBoxStop.Visible = false; + } + + private void PictureBoxStopMouseEnter(object sender, EventArgs e) + { + HideAllStopImages(); + _pictureBoxStopOver.Visible = true; + _pictureBoxStopOver.BringToFront(); + } + + private void PictureBoxStopOverMouseLeave(object sender, EventArgs e) + { + if (_pictureBoxStopOver.Visible) + { + HideAllStopImages(); + _pictureBoxStop.Visible = true; + _pictureBoxStop.BringToFront(); + } + } + + private void PictureBoxStopOverMouseDown(object sender, MouseEventArgs e) + { + if (_pictureBoxStopOver.Visible) + { + HideAllStopImages(); + _pictureBoxStopDown.Visible = true; + _pictureBoxStopDown.BringToFront(); + } + OnButtonClicked?.Invoke(sender, e); + } + + private void PictureBoxStopOverMouseUp(object sender, MouseEventArgs e) + { + if (IsMouseOverControl((PictureBox)sender, e.Location)) + { + HideAllStopImages(); + _pictureBoxStop.Visible = true; + _pictureBoxStop.BringToFront(); + Stop(); + } + else + { + HideAllStopImages(); + _pictureBoxStop.Visible = true; + _pictureBoxStop.BringToFront(); + } + } + + #endregion StopButtons + + #region FullscreenButtons + + private void HideAllFullscreenImages() + { + _pictureBoxFullscreenOver.Visible = false; + _pictureBoxFullscreenDown.Visible = false; + _pictureBoxFullscreen.Visible = false; + } + + public void ShowFullScreenControls() + { + _pictureBoxFullscreen.Image = (Image)_resources.GetObject("pictureBoxNoFS.Image"); + _pictureBoxFullscreenDown.Image = (Image)_resources.GetObject("pictureBoxNoFSDown.Image"); + _pictureBoxFullscreenOver.Image = (Image)_resources.GetObject("pictureBoxNoFSOver.Image"); + } + + public void ShowNonFullScreenControls() + { + _pictureBoxFullscreen.Image = (Image)_resources.GetObject("pictureBoxFS.Image"); + _pictureBoxFullscreenDown.Image = (Image)_resources.GetObject("pictureBoxFSDown.Image"); + _pictureBoxFullscreenOver.Image = (Image)_resources.GetObject("pictureBoxFSOver.Image"); + } + + private void PictureBoxFullscreenMouseEnter(object sender, EventArgs e) + { + HideAllFullscreenImages(); + _pictureBoxFullscreenOver.Visible = true; + _pictureBoxFullscreenOver.BringToFront(); + } + + private void PictureBoxFullscreenOverMouseLeave(object sender, EventArgs e) + { + if (_pictureBoxFullscreenOver.Visible) + { + HideAllFullscreenImages(); + _pictureBoxFullscreen.Visible = true; + _pictureBoxFullscreen.BringToFront(); + } + } + + private void PictureBoxFullscreenOverMouseDown(object sender, MouseEventArgs e) + { + HideAllFullscreenImages(); + OnButtonClicked?.Invoke(sender, e); + } + + private void PictureBoxFullscreenOverMouseUp(object sender, MouseEventArgs e) + { + HideAllFullscreenImages(); + _pictureBoxFullscreen.Visible = true; + _pictureBoxFullscreen.BringToFront(); + } + + #endregion FullscreenButtons + + #region Mute buttons + + private void HideAllMuteImages() + { + _pictureBoxMuteOver.Visible = false; + _pictureBoxMuteDown.Visible = false; + _pictureBoxMute.Visible = false; + } + + private void PictureBoxMuteMouseEnter(object sender, EventArgs e) + { + HideAllMuteImages(); + if (Mute) + { + _pictureBoxMuteDown.Visible = true; + _pictureBoxMuteDown.BringToFront(); + } + else + { + _pictureBoxMuteOver.Visible = true; + _pictureBoxMuteOver.BringToFront(); + } + } + + private void PictureBoxMuteOverMouseLeave(object sender, EventArgs e) + { + if (_pictureBoxMuteOver.Visible) + { + HideAllMuteImages(); + _pictureBoxMute.Visible = true; + _pictureBoxMute.BringToFront(); + } + } + + private void PictureBoxMuteOverMouseDown(object sender, MouseEventArgs e) + { + if (_pictureBoxMuteOver.Visible) + { + HideAllMuteImages(); + _pictureBoxMuteDown.Visible = true; + _pictureBoxMuteDown.BringToFront(); + } + OnButtonClicked?.Invoke(sender, e); + } + + private void PictureBoxMuteOverMouseUp(object sender, MouseEventArgs e) + { + if (IsMouseOverControl((PictureBox)sender, e.Location)) + { + HideAllMuteImages(); + _pictureBoxMuteDown.Visible = true; + _pictureBoxMuteDown.BringToFront(); + Mute = true; + } + else + { + HideAllMuteImages(); + _pictureBoxMute.Visible = true; + _pictureBoxMute.BringToFront(); + } + } + + private void PictureBoxMuteDownClick(object sender, EventArgs e) + { + Mute = false; + HideAllMuteImages(); + _pictureBoxMute.Visible = true; + _pictureBoxMute.BringToFront(); + OnButtonClicked?.Invoke(sender, e); + } + + #endregion Mute buttons + + #region Reverse buttons + + private void HideAllReverseImages() + { + _pictureBoxReverseOver.Visible = false; + _pictureBoxReverseDown.Visible = false; + _pictureBoxReverse.Visible = false; + } + + private void PictureBoxReverseMouseEnter(object sender, EventArgs e) + { + HideAllReverseImages(); + _pictureBoxReverseOver.Visible = true; + _pictureBoxReverseOver.BringToFront(); + } + + private void PictureBoxReverseOverMouseLeave(object sender, EventArgs e) + { + HideAllReverseImages(); + _pictureBoxReverse.Visible = true; + _pictureBoxReverse.BringToFront(); + } + + private void PictureBoxReverseOverMouseDown(object sender, MouseEventArgs e) + { + HideAllReverseImages(); + _pictureBoxReverseDown.Visible = true; + _pictureBoxReverseDown.BringToFront(); + if (VideoPlayer != null) + { + var newPosition = CurrentPosition - 3.0; + if (newPosition < 0) + { + newPosition = 0; + } + + CurrentPosition = newPosition; + } + } + + private void PictureBoxReverseOverMouseUp(object sender, MouseEventArgs e) + { + HideAllReverseImages(); + _pictureBoxReverse.Visible = true; + _pictureBoxReverse.BringToFront(); + } + + #endregion Reverse buttons + + #region Fast forward buttons + + private void HideAllFastForwardImages() + { + _pictureBoxFastForwardOver.Visible = false; + _pictureBoxFastForwardDown.Visible = false; + _pictureBoxFastForward.Visible = false; + } + + private void PictureBoxFastForwardMouseEnter(object sender, EventArgs e) + { + HideAllFastForwardImages(); + _pictureBoxFastForwardOver.Visible = true; + _pictureBoxFastForwardOver.BringToFront(); + } + + private void PictureBoxFastForwardOverMouseLeave(object sender, EventArgs e) + { + HideAllFastForwardImages(); + _pictureBoxFastForward.Visible = true; + _pictureBoxFastForward.BringToFront(); + } + + private void PictureBoxFastForwardOverMouseDown(object sender, MouseEventArgs e) + { + HideAllFastForwardImages(); + _pictureBoxFastForwardDown.Visible = true; + _pictureBoxFastForwardDown.BringToFront(); + + if (VideoPlayer != null) + { + var newPosition = CurrentPosition + 3.0; + if (newPosition < 0) + { + newPosition = 0; + } + + CurrentPosition = newPosition; + } + } + + private void PictureBoxFastForwardOverMouseUp(object sender, MouseEventArgs e) + { + HideAllFastForwardImages(); + _pictureBoxFastForward.Visible = true; + _pictureBoxFastForward.BringToFront(); + } + + #endregion Fast forward buttons + + #region Progress bars + + private void SetProgressBarPosition(int mouseX) + { + int max = _pictureBoxProgressbarBackground.Width - 9; + if (mouseX > max) + { + mouseX = max; + } + else if (mouseX < 0) + { + mouseX = 0; + } + + double percent = mouseX * 100.0 / max; + _pictureBoxProgressBar.Width = (int)(max * percent / 100.0); + + CurrentPosition = percent * Duration / 100.0; + } + + private int SecondsToXPosition(double seconds) + { + int max = _pictureBoxProgressbarBackground.Width - 9; + return (int)Math.Round(seconds * max / Duration); + } + + private double CursorVideoPosition(double mouseX) + { + int max = _pictureBoxProgressbarBackground.Width - 9; + if (mouseX > max) + { + mouseX = max; + } + else if (mouseX < 0) + { + mouseX = 0; + } + + double videoPosition = mouseX * Duration / max; + + return videoPosition; + } + + private string CurrentPositionToolTipText(double mouseX) + { + double cursorVideoPosition = CursorVideoPosition(mouseX); + string toolTiptext = TimeCode.FromSeconds(cursorVideoPosition + Configuration.Settings.General.CurrentVideoOffsetInMs / TimeCode.BaseUnit).ToDisplayString(); + + if (_chapters?.Count > 0) + { + toolTiptext += " - "; + + for (int index = 0; index < _chapters.Count; index++) + { + var chapterTime = _chapters[index].StartTime; + var nextChapterTime = index + 1 < _chapters.Count ? _chapters[index + 1].StartTime : Duration; + + if (cursorVideoPosition >= chapterTime && cursorVideoPosition < nextChapterTime) + { + if (_chapters[index].Nested) + { + toolTiptext += "+ "; + } + + toolTiptext += _chapters[index].Name; + break; + } + } + } + + return toolTiptext; + } + + private void DrawChapters(Graphics graphics, int mergin, int startPoint, int endPoint) + { + try + { + int max = _pictureBoxProgressbarBackground.Width - 9; + int index = 0; + while (index < _chapters.Count) + { + int pos; + try + { + double time = _chapters[index++].StartTime; + pos = SecondsToXPosition(time) + mergin; + } + catch + { + pos = -1; + } + if (pos > 0 && pos < max) + { + using (var p = new Pen(Color.LightGray)) + { + graphics.DrawLine(p, pos, startPoint, pos, endPoint); + } + } + } + } + catch (Exception) + { + // ignore + } + } + + private void PictureBoxProgressbarBackgroundMouseDown(object sender, MouseEventArgs e) + { + SetProgressBarPosition(e.X - 4); + OnButtonClicked?.Invoke(sender, e); + } + + private void PictureBoxProgressBarMouseDown(object sender, MouseEventArgs e) + { + SetProgressBarPosition(e.X + 2); + OnButtonClicked?.Invoke(sender, e); + } + + private void PictureBoxProgressbarBackgroundPaint(object sender, PaintEventArgs e) + { + if (_chapters != null) + { + DrawChapters(e.Graphics, 3, _pictureBoxProgressBar.Location.Y, _pictureBoxProgressBar.Location.Y + 3); + } + } + + private void PictureBoxProgressBarPaint(object sender, PaintEventArgs e) + { + if (_chapters != null) + { + DrawChapters(e.Graphics, -1, 1, _pictureBoxProgressBar.Height); + } + } + + private void PictureBoxProgressbarBackgroundMouseMove(object sender, MouseEventArgs e) + { + if (VideoPlayer != null) + { + string toolTiptext = CurrentPositionToolTipText(e.X - 4); + _currentPositionToolTip.Show(toolTiptext, _pictureBoxProgressbarBackground, e.X - 10, e.Y - 25); + } + } + + private void PictureBoxProgressbarBackgroundMouseLeave(object sender, EventArgs e) + { + if (VideoPlayer != null) + { + _currentPositionToolTip.Hide(_pictureBoxProgressbarBackground); + } + } + + private void PictureBoxProgressBarMouseMove(object sender, MouseEventArgs e) + { + if (VideoPlayer != null) + { + string toolTiptext = CurrentPositionToolTipText(e.X + 2); + _currentPositionToolTip.Show(toolTiptext, _pictureBoxProgressBar, e.X - 10, e.Y - 25); + } + } + + private void PictureBoxProgressBarMouseLeave(object sender, EventArgs e) + { + if (VideoPlayer != null) + { + _currentPositionToolTip.Hide(_pictureBoxProgressBar); + } + } + + + /// + /// Use SMPTE time (drop frame mode) + /// See https://blog.frame.io/2017/07/17/timecode-and-frame-rates/ and + /// https://backlothelp.netflix.com/hc/en-us/articles/215131928-How-do-I-know-whether-to-select-SMPTE-or-MEDIA-for-a-timing-reference- + /// + public bool SmpteMode { get; set; } + + public void RefreshProgressBar() + { + if (VideoPlayer == null) + { + _pictureBoxProgressBar.Width = 0; + _labelTimeCode.Text = string.Empty; + } + else + { + int max = _pictureBoxProgressbarBackground.Width - 9; + double percent = (VideoPlayer.CurrentPosition * 100.0) / VideoPlayer.Duration; + _pictureBoxProgressBar.Width = (int)(max * percent / 100.0); + + if (Convert.ToInt64(Duration) == 0) + { + return; + } + + var pos = CurrentPosition; + if (pos > 1000000) + { + pos = 0; + } + + var dur = TimeCode.FromSeconds(Duration + Configuration.Settings.General.CurrentVideoOffsetInMs / TimeCode.BaseUnit); + if (SmpteMode) + { + var span = TimeCode.FromSeconds(pos + 0.017 + Configuration.Settings.General.CurrentVideoOffsetInMs / TimeCode.BaseUnit); + _labelTimeCode.Text = $"{span.ToDisplayString()} / {dur.ToDisplayString()} SMPTE"; + } + else + { + var span = TimeCode.FromSeconds(pos + Configuration.Settings.General.CurrentVideoOffsetInMs / TimeCode.BaseUnit); + _labelTimeCode.Text = $"{span.ToDisplayString()} / {dur.ToDisplayString()}"; + } + ResizeTimeCode(); + + RefreshPlayPauseButtons(); + } + } + + private void SetVolumeBarPosition(int mouseX) + { + int max = _pictureBoxVolumeBarBackground.Width - 18; + if (mouseX > max) + { + mouseX = max; + } + + double percent = (mouseX * 100.0) / max; + _pictureBoxVolumeBar.Width = (int)(max * percent / 100.0); + if (_videoPlayer != null) + { + _videoPlayer.Volume = (int)percent; + } + + _labelVolume.Text = (int)percent + "%"; + Configuration.Settings.General.VideoPlayerDefaultVolume = (int)percent; + } + + private void PictureBoxVolumeBarBackgroundMouseDown(object sender, MouseEventArgs e) + { + SetVolumeBarPosition(e.X - 6); + OnButtonClicked?.Invoke(sender, e); + } + + private void PictureBoxVolumeBarMouseDown(object sender, MouseEventArgs e) + { + SetVolumeBarPosition(e.X + 2); + OnButtonClicked?.Invoke(sender, e); + } + + private void RefreshVolumeBar() + { + if (VideoPlayer == null) + { + _pictureBoxVolumeBar.Width = 0; + } + else + { + int max = _pictureBoxVolumeBarBackground.Width - 18; + _pictureBoxVolumeBar.Width = (int)(max * Volume / 100.0); + } + } + + #endregion Progress bars + + #region VideoPlayer functions + + public void Play() + { + if (VideoPlayer != null) + { + VideoPlayer.Play(); + HideAllPlayImages(); + _pictureBoxPause.Visible = true; + _pictureBoxPause.BringToFront(); + RefreshProgressBar(); + } + OnButtonClicked?.Invoke(null, null); + } + + public void Stop() + { + if (VideoPlayer != null) + { + VideoPlayer.Pause(); + VideoPlayer.CurrentPosition = 0; + HideAllPauseImages(); + _pictureBoxPlay.Visible = true; + _pictureBoxPlay.BringToFront(); + RefreshProgressBar(); + } + OnButtonClicked?.Invoke(null, null); + } + + public void Pause() + { + if (VideoPlayer != null) + { + VideoPlayer.Pause(); + HideAllPauseImages(); + _pictureBoxPlay.Visible = true; + _pictureBoxPlay.BringToFront(); + RefreshProgressBar(); + } + } + + public void TogglePlayPause() + { + if (VideoPlayer != null) + { + if (VideoPlayer.IsPaused) + { + Play(); + } + else + { + Pause(); + } + } + } + + public bool IsPaused => VideoPlayer?.IsPaused == true; + + public double Volume + { + get + { + if (VideoPlayer != null) + { + return VideoPlayer.Volume; + } + + return 0; + } + set + { + if (VideoPlayer != null) + { + if (value > 0) + { + _muteOldVolume = null; + } + + if (value > 100) + { + VideoPlayer.Volume = 100; + } + else if (value < 0) + { + VideoPlayer.Volume = 0; + } + else + { + VideoPlayer.Volume = (int)value; + } + + RefreshVolumeBar(); + } + } + } + + /// + /// Current position in seconds + /// + public double CurrentPosition + { + get + { + if (VideoPlayer != null) + { + if (SmpteMode) + { + return VideoPlayer.CurrentPosition / 1.001; + } + else + { + return VideoPlayer.CurrentPosition; + } + } + return 0; + } + set + { + if (VideoPlayer != null) + { + if (SmpteMode) + { + VideoPlayer.CurrentPosition = value * 1.001; + } + else + { + VideoPlayer.CurrentPosition = value; + } + } + else + { + RefreshProgressBar(); + } + } + } + + /// + /// Total duration in seconds + /// + public double Duration + { + get + { + if (VideoPlayer != null) + { + return VideoPlayer.Duration; + } + + return 0; + } + } + + private bool Mute + { + get + { + if (VideoPlayer != null) + { + return _isMuted; + } + return false; + } + set + { + if (VideoPlayer != null) + { + if (!value && _muteOldVolume != null) + { + Volume = _muteOldVolume.Value; + _labelVolume.Visible = true; + } + else if (value) + { + _muteOldVolume = Volume; + Volume = 0; + _labelVolume.Visible = false; + } + _isMuted = value; + } + } + } + + #endregion VideoPlayer functions + + protected override void Dispose(bool disposing) + { + DeleteTempMpvFileName(); + base.Dispose(disposing); + _retryCount = 3; + SmpteMode = false; + } + + public void PauseAndDisposePlayer() + { + PanelPlayer.Hide(); + Pause(); + SubtitleText = string.Empty; + Chapters = new List(); + var temp = VideoPlayer; + VideoPlayer = null; + Application.DoEvents(); + temp.DisposeVideoPlayer(); + + // to avoid not showing video with libmpv, a new PanelPlayer is made... + PanelPlayer.MouseDown -= PanelPlayerMouseDown; + Controls.Add(MakePlayerPanel()); + PanelPlayer.BringToFront(); + PanelPlayer.MouseDown += PanelPlayerMouseDown; + VideoPlayerContainerResize(this, null); + + DeleteTempMpvFileName(); + _retryCount = 3; + SmpteMode = false; + RefreshProgressBar(); + } + + private bool IsMouseOverControl(Control control, Point cursorLocation) + { + if (control.ClientRectangle.Contains(cursorLocation)) + { + return true; + } + + return false; + } + } +} diff --git a/src/Controls/VideoPlayerContainer.resx b/src/ui/Controls/VideoPlayerContainer.resx similarity index 98% rename from src/Controls/VideoPlayerContainer.resx rename to src/ui/Controls/VideoPlayerContainer.resx index 001cea71c..56334eb7e 100644 --- a/src/Controls/VideoPlayerContainer.resx +++ b/src/ui/Controls/VideoPlayerContainer.resx @@ -1,615 +1,615 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - iVBORw0KGgoAAAANSUhEUgAABXgAAAAtCAMAAAAjrvPmAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFDw8OERER - EhISEhITEhIWEhIXERIcERIdFBorFRssJioxJzBMKDFNPENSPURTPUVUPkZVNUBmNkFnQEdXQUlZQkpb - Q0tdRU1eRk5gR09iSFFkSlNmS1RnTVVpTldrT1htUVpvUltwU1xzVl93WmN8XWaAX2mDXmmFYGqFYWuG - dXyadn2bi5KnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6HRMPQAAAalJREFUeF7t1jVu - RVEQRME2MzMze//rczL+S+ioTvLCkUpXrZdfESBAgEBVIB8iQIAAgapAvqZPESBAgEBFIO8iQIAAgapA - 3kSAAAECVYG8igABAgSqAnkRAQIECFQF8iwCBAgQqArkSQQIECBQFcijCBAgQKAqkAcRIECAQFUg9yJA - gACBqkDuRIAAAQJVgdyKAAECBKoCuREBAgQIVAVyLQIECBCoCuRKBAgQIFAVyKUIECBAoCqQCxEgQIBA - VSDnIkCAAIGqQM5EgAABAlWBnIoAAQIEqgI5EQECBAhUBXIoAgQIEKgK5EAECBAgUBXInggQIECgKrD4 - 490XAQIECFQEsi0CBAgQqApEBAgQIFAWWJ6WRIAAAQIVgfwPry8BAgQIdAQMb8fZFQIECCwEDK/HQIAA - gbKA4S2DO0eAAAHD6w0QIECgLGB4y+DOESBAwPB6AwQIECgLGN4yuHMECBDIyoSCAAECBDoCWZtWRYAA - AQIVgWxM6yJAgACBikC2pk0RIECAQEUgu9OOCBAgQKAikOPpSAQIECBQEcjP9C0CBAgQqAj8AYNKjD+4 - WHt6AAAAAElFTkSuQmCC - - - - - ..\Resources\pictureBoxFastForward.Image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\pictureBoxFastForwardMouseDown.Image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\pictureBoxFastForwardMouseOver.Image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\pictureBoxFS.Image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\pictureBoxFSDown.Image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\pictureBoxFSOver.Image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - - iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAMAAABFjsb+AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFDw8OCwsW - DAwRDw8TDQ0UDQ0VDg4UDg4VERESEBATEhISFhcgGxskGxwhHBwjHyAlICAoIyMtICMuICQuJicxJygy - JioxKis2Kyw1LzA6MTI8NDU+NjpGNDtMNjxNNz5OODlBOTpDOT9POj9ROUBPOEBQOEBRO0JSPENSPENT - PERTPURUPURVPkZVPkZWP0ZXREZPQEZXQEhYQUlZQUlaQUlbQkpbQ0tdRExaRUxcRU1eR09dSktUSkxV - SExdSU1eSU1fTlJeU1VdTFBhUFdnUlhmV1lkU1loWWBuX2RxY2ZvYGRzZGd2Yml2ZmhwZ2pycHN7c3V+ - bHGAcnWBcnaDcneGgoWOgISPg4aPgYaUi46Yio+Zio+ajJCZlpmilZmkmJylm56nmZ6onqGqoKOsoKSs - oaWyp6qyqa23sbW9srW+tbnBuLzDvb/Hv8HGvsPLwcPJwMPLw8XKwcbNw8fPw8jPx8zTy9DXz9HVzNHY - zdLZz9Pd0NXd0tfe09jf1Nng19zj3d7i3OHo3eLp4ODk4uPm5ebp6urt6+zu5uvz7/T78PHy8/P09fX2 - 8vX48PX8+vz//f39/v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgqUuWQAAARJJREFUKFNjsMIE - DOaYgMEMDExBhIkJhMNgDAL6LvrGxpa+HnpGIB6DIRBoh08M0dFxTuwpctcBchl0dXW1XXsn5alZd0fZ - V3R4aurqMmhrqasWTJrULmvo3dpo19Jmoa3NoKGUkTUBCJRjcp37Cn0mxKtoMGjLdfWDQGhQf2Rav0Nn - tbw2g5hQUzMIRMs0JwU3O+bXCIsxMDDV1oGAk02dV1idRFkmEwMDF3NEbD0QcPslS1WlGtQHMnMxcHGy - MCbU15ey8ynmZItnF/NwAsW4ONlEK+vimPnL/EXTS6TZuEBiXBxsbg22nMwCAeUpImycEDGgSkE2Dg5e - BUlWkBBEjIuTE8jmAJIcIB5EDBVgEwMAxe1P5C1jRZkAAAAASUVORK5CYII= - - - - - iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAMAAABFjsb+AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFExMVDBIt - DhQuDxk3DRs9FhouHB8mEBs1FxszEBo4ERw6Fx8/GB45DyA8GiIlFCI7GSA3HSI3GiA7HSI5JiwvIic7 - Ji48Dh9CCSBGDyBDDyFEDyJFDyRGCyRMDiZIDCZODyhJDChPDytNBi1dCilRDCpSDy5RDC9YDDNfEiVB - EiZCFyBAFSJHEyZQFjFfBzRmBzhsBzltCzhnDDtqCDxwKDBKLzZLLjVMLzVOITZXLzVQLzVTLjZXLjdc - LzphLztiLztjLzxjMDphMD1kCUB0CUB2DUBxCkh/FUF4OEJYPUdfPkhdPUtiNEd1QkpaRU1dQ09mSU1g - TFlxTFtwV1xsV11vUmB0VmV2WGJzW2R7Wmh6XGp5XGp6YnB/DEyBDVGHEEiGE1mOE1qPEFCQEVmaF2GT - FmGfFmKgG2ymG2ynInatKH2yZXeIZ3mFbnaIa3yJbniKcHeHdXmDeXyGb4CEcYGMcIKOd4iWeYiUeouV - eIqXe4yWmz0ashwMpDAUvDwuvEE0vEM2s1A4slU/q2NIwQUCxwcHwgsIzgAF2QAIwDwy1CEl1Cov3ycu - 1y0x2Cow4AYR4TM54zY/3XVz3Xd26GZryoV1gI2XhIiWhYqXgY+YiI+eg5GahJGfh5adhJafiJaejZGb - jZGfkZSdjpWhiZiljZqgk5qlmJ2qmZ+tkqCmlaCmk6GpmaaumaavnqaunaywroaCq4qGqIyHqI2Ip6+2 - prC0p7G1rrm/sbrFtr7KtMDEtcHFucTHu8TJzZGY0YuT0Zedw8jQyc7VzNDV0NXd0tfe09jf1Nng19zj - 3OHo3eLp7crG8MTD9MbH4+jv6ezw8PX89vf4+vz//vz8/f3+/v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc6SIIgAAAV5JREFUKFNj8GPj - E0EGfGx+DGIlu/cig90lYgzRe7Zv2w5CELBt+55ohtgNq1atWrZ6GZCEgA2xDDGr5i2YtfXq+jkLIGDe - qhiG8PmVFdMvXTtSWl29Zse+HWsq54czhJXn5x6+fPlCbNm6g5MmTDq4tiqMIThn566LQBA1d39n79SJ - nQeWBjMEeJ86DQKFS3q6O85d6etfHsDgKXrsOAjMXNg++Wzr2Sltiz0ZzFiPnwCBkKKGxitnauu7is0Y - zDlmLAKJCfhvqmue1lS3MdCcwYKHiXHF8eOH2PkjtrTUtGwOFbJgsOLmZDY9enIlr5amT8HsPC8ubSsG - ax1xSZbI80FyakoKcjLSUuI61gw2urLyshKWKkZuxhrqqorysro2DDZ6yvoGJi5xialJ8e6uhvrKejYM - gr4eCckpaRlZ2VmZ6SnJCR6+ggwMwrZOdvYOjs7Ozo4O9nZOtsIMAJnRonErDmY9AAAAAElFTkSuQmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAMAAABFjsb+AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFERIUCAop - CQ03DR9HDxpZDiJNDyxeEylPGytKHStLHS1MGy1VHS9XFjVfHjBYEi5gHytmETFmEjNqEzVqHTRlHTVm - Ezl2Fj1wFDx6Fj55HT14JzRRITZZKDZTLzlULTteNT9YICpmICtoKj5kLD9lF0F1F0R9HUhzH0p0H016 - NUFdJkNqKkNtKkpwLE53NUdtPU1sO1F+RU1eR1FtTVRsT1huSVlzS1t1TlhwV2B1Fy+BFy+CE0SNE0WO - HkSKGEmJGUyJGU2PIUCJIEGMJEOJJkSIJESPK0qPLl6DOVqCN1abJ1ekKWSNLGeOLGufLWyYMHCdM3ab - KmynLW+jKGmpKGmqKm6pN3ykM3KzRWeMT2WFWmuKRmenS2yoQGi5UG+qVXKsW3mxX32xZm6CaXSJbHeI - aXiLaXiScXiLcXuJcXyQc3yRPIWmPoqrQpGtd4GUdISSdIWffIaTfoeXfIuYfY+bbom3Vo/Ie5TAfZbB - g4uehIubhY2fgZCcgJOfgJSfiZOfgZWgiZGhjZSkiJijjp6omZ+ukqKrk6Wulaeul6GymaGwn6a0m6mx - mquznKy0na61oKi2oK21oqu8obK5orO6p7C+prS6p7W7qLe9rbS9qri+rbi/rLXBr7rBr73DsbfCsL/E - tL7Etb/FtrzIuL/Kiszfjc/djdDektHdlNLbltXenNXdntjfg8LhiMvgotnescDFvsTOvcbQwsnPxMnO - wcfRw8rTxMrTx83Vyc7XyNHVyNHWy9DXydLWytPXy9LbzdLa0tbb0dbe09jfyN700NXg1Nng19zj29/i - 3N7h3N/j3OHo3eLp5Obq5ujr6Ort5+z07O3w7+/x7u/y7/T78PHy8fP09fb38PX89Pb69/j5+Pj5+vz/ - /v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYxRxBgAAAW1JREFUKFNjMDIs - q6xAgMoyQyMGw6PXLiODa0cNGZJO7du/f/8eIN63ezeIPJXEkLh14caNs+fM3jh/xqJ5M+dvXLg1kSFh - 0ZSpfYvvzZnQ37vl9slJ/VMWJTDET+9ob79z71BL641ZRaev97ZOj2eI7awrPXTv3pWCkoYL5zLPX6rt - jGWIqd+8/S4QpE3blXprb/HduY0xDF5mV2+CQH7WzZrJNy0uHjP3YnCXPnMWBJoUzrZlnDXZdFjWncGV - 8/ARELA0PZJcfURu5wIuVwYXnqrm40DAkdKjdXCi8fFsPhcGJxFW5u7jx3ewyxgsXSK/ZBu3qBODk5Qg - v/LBI1282rvSVaZt12eTcmJwtpOQFI4+EaWuoVt4YLKOkJidM4Obt62jg6qepo+vR6SnuJq9jbcbg3V5 - RGhYcEB4bl5OoL9fUEhEuRUDU9y69ctWrFy9dsOaVSuXL1u/Lo6JgYGRRUlAQBECBASUWBgZAFBhr6gt - gaHsAAAAAElFTkSuQmCC - - - - - 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 - peH+1vvyAAAAAElFTkSuQmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAAB0AAAAdCAMAAABhTZc9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFDw8ODxAP - DxEWEBERERIREhISERITEhIXEhQUERQVExcXEBEcERIdAAA0AAA9CBEkCxY1EhgoFBkqFRssFx8wGyIm - GyMtHSc6Jy00BABGAABPAgRLAgVMBABIBQBOBwdNCQhPAgBRBQBRBQJSAQJbAAhWAA5XChZeGB9dAwdj - Ag5lABViABZuAB9oABpzFhxjFixYHSZfHzRFACVvACN3ACtxADV6GTF0Jy9MIjpJJj9KKDBNKDdLKzlD - KzlEKDlGKjtFKDtGLTtHLD1JMT9MIy1pJS1zMjx3KUNPLUBMJENWJkVYKkZSLUpXLU9dO0BOMkFRNURS - NkZUN05dPkRSPEZVP0ZWOEpZPkhYPk1dK05kKVdsK1d9O0J2NVVmPlJlO2d4QUhYQUpaQ0tdQ0xeRElY - R0xaRU1eRU5gR09iREt5R1FjRVJkQVRqQ1luSFFkSlJlSlNmSVRoS1RpTFdrTVhtTlN9WF5tR2V8V2Bv - XmZzAC2AADWFAT6NAESIAkqUAFGeA1uoCWGoBmSxFnKuHHCyGXm1IVmWKGWfKGWgPnymDXnEQ0+IRFaL - SVSGTFeITFyOU1yFTW6GQHGERXOJR3qPTHKLTXeRTHSeS3uTVmONXWGGWGqVWnecYWWHYmaIYmuNam+P - Y2+SY3OWYXabY3iUbXGQbneVb3qXaHuec3aHcXWSdXqVcH6bcX2gP4CdN4KyFY3VLozIIpnaNJnTJaTm - LqvmKa/tM7HoNrnyRoGWSYOdQYOhQoShQ4WnRoWjRYijR4umQ4itSIegTIihSIyoTJGuT5W0UpWxUpe3 - UZi5VJu8VZ6+aoGbfICafoScaYWmdYWlc46vfIKjfIeofY2jeo2ofpCnR8v6VdT/dub/goefhoqfhYuq - io+iiYymiY2rg5eqjpGphpiwkpetmZ20jKC2lKG0m6K3nqe7nam8oKK3qrLGtLbGtrvCtLvPwcbNwcLR - xsfVzM3Zz9Tb3eLp6u/26/D3+vz/////AAAAAAAAAAAAAAAAAAAAAAAAzAsMkgAAAylJREFUOE9jKASD - goLi0pwgTw8fXx8Pz6Cc0uKCApAwQz4ElOQ4eyQcOXnq1KmTRxI8nHNKwKIMmSCQXxJoNfn03mgvext7 - r+i9pydbBZbkA8UZMoAgs8jZ78R6y7RV9548eXJvVarl+hN+zkWZGRkM6UBQ5BR3Jjrk3osnd86fP3/7 - 0dM7/tFn4pyK0tMZkpOTswP8znhVvXx0bs3qZcuWrV5z7v6Lcq8zfgHZyQxJSSmRVieiq17eXrNs/mwQ - mLdwzfmnldEnrCJTGBITMxwmr498dXvFgoVvX5eVlb1+u3DB8vPPw9dPdshgCEuM8Djp/fD6igUTP/78 - +SD2/s+fH8sWLL961eukRwRDWJJLwp68Z2sXzcr6/PPnU/dHP39+zpq4YMXj3D0JLgwhEY67Y85eWzyr - PxYo+8T1AVA2tm/W4otLY3Y7MoSEWh2LurRyzoQed7DsXaCse0/vnJUXoo5ZMYSF+hw3ujC3191N/xPQ - XvXLP39+0ndz7517wei4D4OEhM8xfkMNeTlFqY8/ftxVW/fjx0cpRSUFDVf+Yz4MDFweBwR4+WTlVFTf - f/t2RXvdt+/vVVWUZPl4BQ54MLByxR0w4JVUUtHSfvP160XdlV+/vtHWUlGS5DU4EMfAyha8K4ZPWVPH - xPjVly/rTJd8+fLK2ERHU5kvZlcwAyuj3ZQuGS296hqz5x8+rDSb++HDc7Oaaj0t6a4pdgyszKIVB811 - qmvr666/ezejYca7d9fr6murdcwPVogysLKyhk/t0qmtb2xuvzC3qbtp7oX25sb6Wp2uqeGsQFkW0YrD - 7TXN3Ru7W9o2bt7Y1gJkNda0H64QZQHpZbaddrS9YePWbdt27Ny5c8e2bVs3NrQfnWbLDNLLysoRPv1o - Z/P2GzdugsCNG9ubO45OD+dghciycoVPO7yhdfONWyBwY3PrhsPTwrmA4gxsYMDpNGnmgQ0bNm3ZsmXT - hg37Z05y4gQJM7BDAJNY/KSZu/fuO7Rv7+7pk+LFmMCiDDxQwM0tFpBXMWnapIq8ADFubogogzAcCAkK - iYiLi4sAaZgYgzUKsLCwQOYDADNYgx+MsDCLAAAAAElFTkSuQmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAAB0AAAAdCAMAAABhTZc9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFDw8ODxAP - DxEWEBERERIREhISERITEhIXEhQUERQVExcXEBEcERIdEhgoFBkqFRssFx8wGyImGyMtHSc6Jy00Jy9M - Jj9KKDBNKzlEKTtFLTtHLD1JMT9MKENOKkNPLUBMKkZSLEdULUpXLU9dMkFRNURSNkZUN05dPUVTPEZV - OEpZPkhYPkxdMldmO1NlO2Z4QEdXQUlZQkpbQ0tdQ0xeRU1eRU5gR09iR1FjRVJkQVhuSFFkSlJlSlNm - SFRnSlRpS1ZrTFdrTVhtRGR5SWZ+AC7SCiTVDi3TADvNATbXBTbfBjzXADrcDTHXDDPdCD7ZES/OFjXP - GT3RAD3gFDvlP3CEAUbSClXUEkTdHlnOHVLVAEDkAEfpAEjqC0voAlr0GkfmFGrYDGr2DHD2FH33Ik3P - JU7KJVvbJFntLGbQJH7WNGnPMWHdOnfCK2TvJXT4Mm3oO3DoTW6FTm6HRXOJRnmOTXKLTHqSQXPSR3fQ - Rn3jGoT+KIrcNZjcJJP7OKjzRoGWR4KcSoWeSImfRoeiRIetR4qnSIimSI2pS46vQo25T5GvTZK1SpG6 - TZS5T5e9bJKrZZW8eJarc5i/QITeRYneTY3fRJrHTZXAQ5LTQpHWRZPVWoHWUZrBT4rkWI3mXZHqTanH - S7nqUbzgZovZbJLGeJnKdJXTf53UfZnYfZjeYYnlY5XlY5TqbJbobZrpd5Tgd5XldZzofp3jeKXrfKDp - fq/vcqX5S8D9Xs3pesD9aeH5cubze+/8hqC5jKTYmazElqzZgKfqh63tjKTmjazpjbLtjbbwkqfnk6jn - lK7rma7ombHum73vorTOp7nZtrvCoLPqorXroLbupbbrpLfvpLrtqbrkq7ztnsf1g/T+ivD/l///qMbz - ptb8tcXjvMnotMTwtMzzs9b3sv//v/L/wcbNz9TbwMvox9HpztboxNX1wdr3zNT1z9j2ztz20djq19z2 - 2d73yuH4w/r/3eLp2eL46u/26/D3+vz/////AAAAAAAAAAAAAAAAAAAAzS/fsQAAAylJREFUOE9jsAUD - Gxt7J0s1eTlFJUU5eTVLJ3sbG5AwgzUEOFpKy+k39cyYPqOnSV9O2tIRLMpgDgLWDqpiof2zp63ZtHXT - mmmz+0PFVB2sgeIMZkBgbi+t3D1r/tV3nz4CwdvL82d1K0vbm5uZMZgCgZ2U7twpZ769e3jjypUrNx6+ - /XhqylxdKTtTUwZjY2MLFeW5Ux59e3jp9MkjR46cOH3xxvuHU+Yqq1gYMxgZmeiIdU959P7a6SOrNmzc - uHHDqiOnrr2+O6VbTMeEwdDQTCJ01rHP105tXvng+pzVc64/WLn56OU3h2eFSpoxGBhqy/bN+3z36NYl - L3/9Olh18Nevl0s2HT37Zl6frDaDppGM/szjj48dWj/nw69f5yv2//r1Yc66rcceHZ6pL8OgoS3ZOPXx - zcOb1la+AurNBsq+qlyw/tDZu1MbJRk0NMU6qx4f27J2AVg2EyRbMX/tlsP3qjrFGAw0FWbk3Nu2tqog - Emjv/vAVQHsjC6oWbLuZM0OBQUREode3IMrbJ9rjxc+fK8KW//z5wiM62D+90LdXgYGBS7bV3cvVMzgm - 7P737yvCl3//cT8sNtjT1cu9VZaBlUuvKTDE0ycmPvz816/Lwpd+/Xo+PD7WxzMksEWPgZVNvSHNLy42 - Pin83PPnyxKXPn9+LjEpPjYuJK1BnYGVUaIk1y0/Pjkl8cCzZ5OzJj57diAxJTk+3y23RIKBlVnQuSMg - vzqlrmbfhQsTaydeuLCvpi6lOj+gw1mQgZWVVas0129HXX1916QJ0xdNnzCpq76+bodfbqkWK1CWRdCl - OTVj944dixcu3Ll758KFi3fs2J2R2uwiyALSyyxR1hGUd/vW7t179u7du2f37lu384LayiSYQXpZWTm0 - yjtSQ3Y9eXIHBJ482RWS2lGuxcEKkWXl0iprzvXL2H7v6Zen97Zn+OU2l2lxAcUZ2MCAU6qovC03KiIh - ISEiKretvEiKEyTMwA4BTEJ6ReVN7a2tre1N5UV6QkxgUQYeKODmFlKxcikuK3axUhHi5oaIMvDDAR8v - n4CwsLAAkIaJMYijAFFRUWQ+AARqaklCCnVoAAAAAElFTkSuQmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAAB0AAAAdCAMAAABhTZc9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFDw4NDw8O - CgoXDg4SDg4WCQwfEA8PEBAPERERERESEhISEhITEhIXExQUFBUVFRUWEBAbERIdExUZFBUYFhcZFRcb - FhccFxgZFxgbFxgfGBkcGRodBQcuBgc1ChEsEhcnFxkjFRoqFRssGx0gHR8jGiAyICEpISMoIyUrIyYs - JCctJCcuJSkvISU0JysyKy84KzA+LTI8LjM9LzU/MDU/BQVAAwdJBglBAw1OBgtQAwVlBAhwDR5nDS5+ - MDVAMTZBMjdCNDlENTtONjxINz1NOD9NLz9zO0FPO0JSPURTPkVWPkZVP0ZWP0ZaP0deL0BuPkZgNEB1 - QEdXQUlZQkpbQ0tcREtdRU1eRk1gRk5gRk9hR09iR1BiSFBjSFFkSlJlSlNmS1RnS1RoTVZpTVZqTlds - T1hsBgiIAAyaABOdABySDhafARSgABmgAB6iBRqhBhygCRaqCBiqACmQDiOYADWYFTWXACimCyiyADup - ADywFyO1GzStIi6eJjqIJzyLKjqKLDuWAEWdAECvAE+2AEm7ClSgHkSiB2O8GWutIkmNMkCNKk26K1q3 - NUykO1qrOVu4NmCaNnevAFTGAFjHAGHIBWnaCnnYEmPPA3flIVLSLWDYSFemRmS2RWO8RWi+SmKxV2mm - V267VHmiZHK6RWbAS2vEUW3EWW/DU3LHVXbJYHfIYX7MbXzJcX3GGYjWD4vvHJjsGpj0JpPQP5XzLqvq - Kqz2MbX3N7v0O8L7XoSme4yxWZrgVrf3bYLNaInScYbDc4HJcoTOeIPHeoXMcY3TepPVRcv9TND+X+b/ - Y9b/Zuv/fPT/kaO8g43Ph5LJgpTUgp7aiZDQjpXTk5nVmqnLkaDXlaPalajdnKPZn6jbhK3oj7LnmLjo - oqbapKzcqa7dqbLAqLPUtrvCtL/YqLzmsbXggNP8ke7/v8bdtsjrwcbNz9Tbxc3hx87rztPj0dfv2Nrw - 2uDn2+Lt3OHo3+Pv2+Dy6u/27PH38/X5+vv9+vz/////AAAAAAAAAAAA6kUEYQAAAxhJREFUOE9jSISD - 5LTUhMjIyITUtGSYGEMCGMTHJ6WE2msoS0tLK2vYh6YkxceDhBniICApRJNf3c7dL8DP3U6dXzMkCSzK - EA0CsfEmfFpegd1zlqxbMqc70EuLzyQ+FijOEAEE0bHa/K6Bc+5/+PYRCD7cmhPoyq8dGx0RwRAOBDFa - Ur4N17+9e/bg3r1795+9+3CtwVdKKyY8nCEsLDTKkN+34dWHZzevXL506dLlKzcfvHva6MtvGBXKEBIS - 5snnXP/03a0r5w4fXLd27cEj5y7ffPW03pnPM4whODhMXd3twqvrFw6ef7Rk0YoVK1avPXTh2qtjburq - YQxBwe58Ln2vblw4tOj9n59X585btnzF6n3Hrr3qc+FzZ/AO1lfxP/b0wqHVC97/+fPn64EJ85YuB0rf - Peqvos/gGaSiX3f34tE1K/tBsn/+vF00ASR98U6dvgqDp4e4fePdY2tWLYPK/vn1aO78lWuO3mm0F2fw - cRd3qr29f9mEnrK3YL1A8OPAhGX7b9c6iTPoafPrpvfU5OfmZb38DQO/SgpqetJ1+RkYGXlZ0gszMvPK - i598B4MfPz4vzMrMKEpn4WXg4jCUsq7OyS2vLH30BQw+7bYtLs/NqbaWMGTgYjPWsKyuKK9qrbz6BgTO - dpVWNleWV1RbahgzcDHq2Mllz6pqndxy9vXr1w8nNrVMmTK5tWpWtpydDtBkEVdRq9kzJk+bevbxw8Vt - HdNnzpw5bfKM2VairiIMXFwMxkZyJVumzZw+aVdn5/qNGzdu2jBz2pYSOSNjBqAsh0SQinnP3k0bN2/e - vHU7EGzbtGlvj6lKkAQHUJaLQcdHyLT31IkdO3YeP3H8+M6dJ071mgr7AG0FyXIxOAQLy5btPXPm9Ekg - OHNmb5mscLADyFKQLAe7Q4gKq1n7nucvXrx4vqfdlFUlxIGdAyjLDQKcjHrRjiJMMhY2NjYWMkyijtF6 - jJxAcQYeCGCWdA1311cTExNV03cPd5VkBosyCEKBAIuCgUdoRHREqIeBAosARJRBCQ4U5eUVVVVVQRRM - DACG9nnjnRgGhwAAAABJRU5ErkJggg== - - - - - iVBORw0KGgoAAAANSUhEUgAAAB0AAAAdCAMAAABhTZc9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFDw8ODxAP - DxEWEBERERIREhISERITEhIXEhQUERQVExcXEBEcERIdAAA0AAA9CBEkCxY1EhgoFBkqFRssFx8wGyIm - GyMtHSc6Jy00BABGAABOAgRLAgVMBQBJBABNBwdNCQhPAgBQAAdWBQFRAQJbAAxWDRtXEQxSGB9dAwtk - ABRjABVuABhvABxzFhtiFixYHildACZpACN3ATh5HCNhGTF0Jy9MIDdHJj9KKDBNKDdLKzlDKzlEKDlG - KjtFKDtGLTtHLD1JMT9MIy5iJS1zIjprLzt4ND14KUNPLUBMJENWJkVYKkZSLUpXLU9dO0BOMkFRNURS - NkZUN05dPkRSPEZVP0ZWOEpZPkhYPk1dK05kKVdsLl14O0J6NVVmP1NnNlN6O2d4QUhYQUpaQ0tdQ0xe - RElYR0xaRU1eRU5gR09iQ0l6R1FjRVJkQ1luSFFkSlJlSlNmSVRoS1RpTFdrTVhtSlB+WF5tR2V8V2Bv - XmZzAC2AADWFADyDAT6NAEaMAkqUAE+cElOLAFSjB1ygA1uoBWCsB2m3Fnq6HHCyKFGCJVeVLWaaKGWg - PnymCHrLQUqCRFSKTFSCTleJTFyOUViBVlyFTW6GQHGERXOJR3qPTHKLTHqSVmONXWGHVmyUWnWdYWWI - Y2uNbG+ZbXCPY3GVY3iUZ3mdbneVbXuYc3aHcXWScXWedXqVcH6be3+ZaX6hP4CdN4KyG4bFE5DcHprh - LozIIpfYNJnTIZ7jJ6bmKq7tMa/pNLbwN7z0RoGWSYOdQYOhQoShQ4WnRYijRoikR4umQ4itSIagSIig - TIihSIyoTJGuT5W0UpWxUpe3UZi5VJu8VZ6+aoGbfYKbfICcfoWeaYWqeYymR8v6VdT/dub/hImfio+i - iJCmiZaqhpiwkpetjKC2lKC0mqC2nqa8nKm8qK++tbvIwcbNwcPUycvXz9Pb39/o2uDn2+Dr3OHo6u/2 - 7u/z7PH48/P2+vr7+vr9+vz/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAyX1CIwAAAxFJREFUOE9jKASD - goLi0twgTw8fXx8Pz6Dc0uKCApAwQz4ElOQ6eiSeOn/hwoXzpxI9HHNLwKIMWSCQXxJoMePioWgvWytb - r+hDF2dYBJbkA8UZMoEgq8jR79xG8/RVdx8+fHh3VZr5xnN+jkVZmZkMGUBQ5BB3KTrk7pOHd65duXbn - 3pM7/tGX4hyKMjIYUlJScgL8LnlVPb13Ze3qJUuWrF67/t6Tcq9LfgE5KQzJyamRFueiq57eWbtk4cJ5 - 8+YtXLRk7bUnldHnLCJTGZKSMu1mbIx8dm3FoqvPp5VNmjR12rxFK649Dt84wy6TISwpwuO89/17KxdN - ffPjy8Ps7OyySdMWrbhxw+usRwRDWLJT4sG8R+uWzs1+/ePHj7eL3WMnAKVXPog/mOjEEBJhfyDm8o2l - cyfFgmR//Hg1OXbCxLlLbyyLOWDPEBJqcSbqxob5Uya6Q2R/fH06YcKU+cuvR52xYAgL9Tlrfn3BRHcX - Pajsjx+f1rhNXHDd/KwPg4SEzxl+Aw15OUWpV99h4Ju6gokz/xkfBgYujyMCvHySyipKLz6CwefP76fJ - yvLxChzxYGDlijuizwuU1NR6/gEM3l1TU1VRluTVPxLHwMoWvL+LT1lT28jw2RsQeOxqaKiro6nM17U/ - mIGV0WZmn4ymbnWN8eOXL18+TzA0Nq6tqdbRlO6bacPAyixaccxUu7quvv7+i+fzjeubm5sb6+uqtU2P - VYgysLKyhs/q06lraG3rWdDU0t4PBO2tDXXafbPCWYGyLKIVJ7pr2vr7Ozo2b9+5c+fWLVv622q6T1aI - soD0MlvPPt3dvGXXrj179wHB3t07tzR2n55tzQzSy8rKET7ndG/77ps3b4HAzZu723tPzwnnYIXIsnKF - zz7R17n95m0QuLm9s+/E7HAuoDgDGxhwOkyfc3TTpm07duzYtmnTkTnTHThBwgzsEMAkFj99zoFDh48f - PnRgzvR4MSawKAMPFHBziwXkVUyfPb0iL0CMmxsiyiAMB0KCQiLi4uIiQBomxmCJAszMzJD5AKC+iMSu - Me5pAAAAAElFTkSuQmCC - - - - - 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 - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbZ1u+QAAACZJREFUOE9jYGQY - BRSEAAsH5yggOwQYmJlGAfkhwMDKxj4KyA4BANhiFlbMlRkDAAAAAElFTkSuQmCC - - - - - R0lGODlhdgEMAPcAABweIR0eIigsNDA0PjY7SEZOYE1VaU5Wa09YbVBYbVBZblFZb1FablFab1JbcFFa - cVNcc1Rdc1RddFRddVVedVZfdlZfd1dgd1hieVhielpjfFtlfVtlfl1mf11mgF5ogl9pg15phWBqhWFq - hgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - ACwAAAAAdgEMAAAI/wBDCBxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzarw4oqPHjyBDihxJsqTJkyhT - qlzJsqXLlzBjypxJs6ZMEDhBiNjJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp2KNCcIDx0+gLhQoavX - r2DDih1LtqzZs2jTql3Ltq3bt3Djyp1Lty7aCyA+dPCggUMDAQEACB5MuLDhw4gTK17MuLHjx5AjS55M - ubLly5gza24cQEADDhosYBhAYEGC06hTq17NurXr17Bjy55Nu7bt27hz697Nu7fv37IXEBiAwQKEBwUo - TJDAvLnz59CjS59Ovbr169iza9/Ovbv37+DDi7wfT/76BAoFHkBw4EBBBgkR4sufT7++/fv48+vfz7+/ - //8ABijggAQWaOCBCCbInwQZKMBeAww4sMEIVFVo4YUYZqjhhhx26GFRI2zgAAMNIGAiAg2kqOKKLLbo - 4oswxijjjDTWaOONOOao44489ujjj0AGaeOJCBxg5JFIJqnkkkw26eSTUEYp5ZRUVmnllVhmqeWWXHbp - 5ZYGhCnmmGSWaeaZaKap5ppstunmm3DGKeecdNZp55145mlnQAA7 - - - - ..\Resources\pictureBoxReverse.Image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\pictureBoxReverseMouseDown.Image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\pictureBoxReverseMouseOver.Image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - - iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFDw8OCgoW - DAwRDw8TDQ0VDw8UEBATEhISHyMtJioxMjdJMzhKNDxNOkFRPENSPENTPURTPURUPkZVP0ZWQEdXQUlZ - QkpbQ0tdRU1eRk5gm56nyszQ09jf1Nng3eLp8PX8+vz//v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHzqB+wAAAHxJREFUKFONzdkO - gjAQheHDVpBFqVVQcOv7v6SclgmJmRi+u386bXFX4KbAqMCgwFWBCzl7iqxj4kzd7KO5Y6K3i3aded8y - 0R8X9UfUTDgeNW/RhM0DVS9RMRGkD5GGLql4ioL5Z5hN6/Up2zZNnkS52YalEeGL+OaP/cMvDc4aWeQk - 0FYAAAAASUVORK5CYII= - - - - - iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFEBESEhIS - ExMVExMWCBc2CRY3Dxo3CBk5CRo7EhYpEhcuFRoqFhssHB8mEBczExs0FRswFhwxFBw2ERw6Eh48GiIl - GyA3HCAyHSM2HSI3GiA7HSI5JiwvJioyIyk7JCo8Ji48Dh5BDh9CDyFECyRMCydODCZOBi1dCylRCi1X - FyBAFSJHEyZQFjFfBzRmBzltCjRgCzhmKS9BLzZLLjVMLzVOLzVQLzVTLjZXLjdcLzphLztiLztjLzxj - MDphMD1kCUB2Ckh/FUF4N0BVO0JRPENUPERTPkVVP0dXOEJYNEd1QUhZQUlaQkpaQ0tdRU1eQk1hQ05h - Q09mRk5gR1NmTFtwUmB0VmV2XGp5XGp6YXB+Y3F/DVGHEEiGE1qPEFCQEVmaF2GTFmKgG2ynInatKH2y - ZHWFZHWGa36Ob4CEb4GNcoONcIKOeouVeIqXe4yWf42Wgo+YhZObh5adhJafiJaekqCmnaOwnaywprG0 - p7G1tMDEtcHFucTH09jf1tre1Nng19zj3eLp8PX8+vz//v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARsHXsgAAATlJREFUKFNVy+dX - QQEYgPG3SyGyJTTsvZJxqcwWUbj2Di2zMiqU5v/dB+eWfh+fcx7AMCx8Oi+MYXAeWeGtz+OtROBMfDt+ - mTe+FUM4Mxk9j/48jyYZOMk/Df97ysNxdtgbPNzfzdw/DHrDLByl++1uc/o9M2122/00HKQ6jVbuC5dr - NTopOEjeXF2nPnGp66ubJBzGE9FY4AMXiEUTcdgIWja31l5xa1ubliDADp9Ko7zhKDQqfwcQ6yqTtfwb - l1nMVSsQbEIGm/6709kMoQ0Idi2Hu/T4PvO4xOVo7UBw6KQyCXmRSCKTiItkiUyqcwAB1cuVSoVaY942 - a9QKpVKuRwFBDSqjyesrlC5KBZ/XZFQZUFgQhPzFcqVaq1/Wa9VKuegPCWABETndrt29fY/Hs7+363I7 - RcgPYGp9sy9YtQ4AAAAASUVORK5CYII= - - - - - iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFDhAWEhIS - EREWERIUERIaCAopCQ03EiA/JCg2DxpZFSVDFidGEiRIHSlFEihSECtXEixVFClQFixSFC9VEy1cFTFW - FTBeHytmEjBgEjFiEjRrFTdsHzlsFjxzFDx6Hj56ITBMIzJOIzVVLz9cICpmICtoIjdhF0B8OUFVOEBW - OkJXOkJYO0NZPUVbP0hdO0liOlB+Q0tdRU1eRE1fQ01iQ0xjRE1hRk5gR1dxSFlyFy+BFy+CE0WOHkSK - HU6HGU2PGk+NHlCCIUCIIECJIEGMJEOJJkSIJESPK0qPIlWDJluDKF6EN1abJ1ekKGmqK2+rMHasNX2s - M3KzVGaARmenS2yoQGi5UG+qVXKsW3mxX32xZHSHOoSsP4ytQ5KudIWSeIuceY2dbom3Vo/Ie5TAfZbB - hZmkh5qlipqliJ2nk6WulKavl6mwm6S1mKiwmquzn6+3obK5orO6prS6sL/EtL7EiszfjtHfk9Pfl9bf - ntjfg8LhiMvgo9rfscDFxMnOytLWytPX09jfyN701Nng3N7h3ODk3eLp7+/x8PHy8PX8+vz//v7/AAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAasY1UQAAATxJREFUKFNjMDc3 - NzM1QQBTM3NzBiNjg6TUFARITTIwZjA0aO7sQAadzQYMelGtDY3IoKE1ikE3sr6kDhmU1Ecy6ESUFhYV - 5OdBQH5BUWFpBINWeHFWdkZbDwS0ZWRnFYczaITmpKXHQ8V6euLT03JCGTRDMhMSo7thIDoxITOEQdsn - 2MJSvwsG9C0tgn0YODyUFRR522GAV1FB2YOBwU2Ji5u9CQbYubmU3BhYXNUEhXhaYIBHSFDNlYHFSUZE - jA8uyCcmIuPEwOIsLyUtkQvVnishLSXvzMDiYiunLivJLyAsKizALymrLmfrwsDi7mtj72Dn6Onl7eXp - aOdgb+PrzsBknRzk5x8QGBMbFxsTGODvF5RsxcDIFlZdU1ZeUVlVW1VZUV5WUx3GxsDIzMqpKi6uAgHi - 4qqcrMwAl/uGWf27czcAAAAASUVORK5CYII= - - - - - iVBORw0KGgoAAAANSUhEUgAAAT4AAAAECAMAAAAgcKN9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFHB4hHR4i - D0HNGEXCWHiYYnm0a4/ubpb/frjthMX/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbZ1u+QAAACZJREFUOE9jYGQY - BRSEAAsH5yggOwQYmJlGAfkhwMDKxj4KyA4BANhiFlbMlRkDAAAAAElFTkSuQmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAAFIAAAANCAMAAAANKsmLAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFDg0MDw8O - EBAPEREQEREREhISFBQVFRYXFRYYFhcZGBkcGRocIiQpIiQqJSkvJioxKCszLDA5NDpFOUBNO0FPPENS - PUVUPkZVQEdXR09hS1NmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIb5gPgAAAHBJREFUOE/VzjsS - gDAIRdFnFMVPNH6j7n+hFgELW9J4GobmzsOZHWJ2OJQ1/YawJ3FbjbYoKV05N9yacDPLTkyJA/edQc9w - kkKRhMUP3mDwS5AUKBkvuk3oGiWlSVezUe0+SapKo0qKpCv1z3D/kXwApPU2QwRJJE0AAAAASUVORK5C - YII= - - - - - ..\Resources\pictureBoxNoFS.Image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\pictureBoxNoFSDown.Image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\pictureBoxNoFSOver.Image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + iVBORw0KGgoAAAANSUhEUgAABXgAAAAtCAMAAAAjrvPmAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFDw8OERER + EhISEhITEhIWEhIXERIcERIdFBorFRssJioxJzBMKDFNPENSPURTPUVUPkZVNUBmNkFnQEdXQUlZQkpb + Q0tdRU1eRk5gR09iSFFkSlNmS1RnTVVpTldrT1htUVpvUltwU1xzVl93WmN8XWaAX2mDXmmFYGqFYWuG + dXyadn2bi5KnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6HRMPQAAAalJREFUeF7t1jVu + RVEQRME2MzMze//rczL+S+ioTvLCkUpXrZdfESBAgEBVIB8iQIAAgapAvqZPESBAgEBFIO8iQIAAgapA + 3kSAAAECVYG8igABAgSqAnkRAQIECFQF8iwCBAgQqArkSQQIECBQFcijCBAgQKAqkAcRIECAQFUg9yJA + gACBqkDuRIAAAQJVgdyKAAECBKoCuREBAgQIVAVyLQIECBCoCuRKBAgQIFAVyKUIECBAoCqQCxEgQIBA + VSDnIkCAAIGqQM5EgAABAlWBnIoAAQIEqgI5EQECBAhUBXIoAgQIEKgK5EAECBAgUBXInggQIECgKrD4 + 490XAQIECFQEsi0CBAgQqApEBAgQIFAWWJ6WRIAAAQIVgfwPry8BAgQIdAQMb8fZFQIECCwEDK/HQIAA + gbKA4S2DO0eAAAHD6w0QIECgLGB4y+DOESBAwPB6AwQIECgLGN4yuHMECBDIyoSCAAECBDoCWZtWRYAA + AQIVgWxM6yJAgACBikC2pk0RIECAQEUgu9OOCBAgQKAikOPpSAQIECBQEcjP9C0CBAgQqAj8AYNKjD+4 + WHt6AAAAAElFTkSuQmCC + + + + + ..\Resources\pictureBoxFastForward.Image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\pictureBoxFastForwardMouseDown.Image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\pictureBoxFastForwardMouseOver.Image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\pictureBoxFS.Image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\pictureBoxFSDown.Image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\pictureBoxFSOver.Image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + + iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAMAAABFjsb+AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFDw8OCwsW + DAwRDw8TDQ0UDQ0VDg4UDg4VERESEBATEhISFhcgGxskGxwhHBwjHyAlICAoIyMtICMuICQuJicxJygy + JioxKis2Kyw1LzA6MTI8NDU+NjpGNDtMNjxNNz5OODlBOTpDOT9POj9ROUBPOEBQOEBRO0JSPENSPENT + PERTPURUPURVPkZVPkZWP0ZXREZPQEZXQEhYQUlZQUlaQUlbQkpbQ0tdRExaRUxcRU1eR09dSktUSkxV + SExdSU1eSU1fTlJeU1VdTFBhUFdnUlhmV1lkU1loWWBuX2RxY2ZvYGRzZGd2Yml2ZmhwZ2pycHN7c3V+ + bHGAcnWBcnaDcneGgoWOgISPg4aPgYaUi46Yio+Zio+ajJCZlpmilZmkmJylm56nmZ6onqGqoKOsoKSs + oaWyp6qyqa23sbW9srW+tbnBuLzDvb/Hv8HGvsPLwcPJwMPLw8XKwcbNw8fPw8jPx8zTy9DXz9HVzNHY + zdLZz9Pd0NXd0tfe09jf1Nng19zj3d7i3OHo3eLp4ODk4uPm5ebp6urt6+zu5uvz7/T78PHy8/P09fX2 + 8vX48PX8+vz//f39/v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgqUuWQAAARJJREFUKFNjsMIE + DOaYgMEMDExBhIkJhMNgDAL6LvrGxpa+HnpGIB6DIRBoh08M0dFxTuwpctcBchl0dXW1XXsn5alZd0fZ + V3R4aurqMmhrqasWTJrULmvo3dpo19Jmoa3NoKGUkTUBCJRjcp37Cn0mxKtoMGjLdfWDQGhQf2Rav0Nn + tbw2g5hQUzMIRMs0JwU3O+bXCIsxMDDV1oGAk02dV1idRFkmEwMDF3NEbD0QcPslS1WlGtQHMnMxcHGy + MCbU15ey8ynmZItnF/NwAsW4ONlEK+vimPnL/EXTS6TZuEBiXBxsbg22nMwCAeUpImycEDGgSkE2Dg5e + BUlWkBBEjIuTE8jmAJIcIB5EDBVgEwMAxe1P5C1jRZkAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAMAAABFjsb+AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFExMVDBIt + DhQuDxk3DRs9FhouHB8mEBs1FxszEBo4ERw6Fx8/GB45DyA8GiIlFCI7GSA3HSI3GiA7HSI5JiwvIic7 + Ji48Dh9CCSBGDyBDDyFEDyJFDyRGCyRMDiZIDCZODyhJDChPDytNBi1dCilRDCpSDy5RDC9YDDNfEiVB + EiZCFyBAFSJHEyZQFjFfBzRmBzhsBzltCzhnDDtqCDxwKDBKLzZLLjVMLzVOITZXLzVQLzVTLjZXLjdc + LzphLztiLztjLzxjMDphMD1kCUB0CUB2DUBxCkh/FUF4OEJYPUdfPkhdPUtiNEd1QkpaRU1dQ09mSU1g + TFlxTFtwV1xsV11vUmB0VmV2WGJzW2R7Wmh6XGp5XGp6YnB/DEyBDVGHEEiGE1mOE1qPEFCQEVmaF2GT + FmGfFmKgG2ymG2ynInatKH2yZXeIZ3mFbnaIa3yJbniKcHeHdXmDeXyGb4CEcYGMcIKOd4iWeYiUeouV + eIqXe4yWmz0ashwMpDAUvDwuvEE0vEM2s1A4slU/q2NIwQUCxwcHwgsIzgAF2QAIwDwy1CEl1Cov3ycu + 1y0x2Cow4AYR4TM54zY/3XVz3Xd26GZryoV1gI2XhIiWhYqXgY+YiI+eg5GahJGfh5adhJafiJaejZGb + jZGfkZSdjpWhiZiljZqgk5qlmJ2qmZ+tkqCmlaCmk6GpmaaumaavnqaunaywroaCq4qGqIyHqI2Ip6+2 + prC0p7G1rrm/sbrFtr7KtMDEtcHFucTHu8TJzZGY0YuT0Zedw8jQyc7VzNDV0NXd0tfe09jf1Nng19zj + 3OHo3eLp7crG8MTD9MbH4+jv6ezw8PX89vf4+vz//vz8/f3+/v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc6SIIgAAAV5JREFUKFNj8GPj + E0EGfGx+DGIlu/cig90lYgzRe7Zv2w5CELBt+55ohtgNq1atWrZ6GZCEgA2xDDGr5i2YtfXq+jkLIGDe + qhiG8PmVFdMvXTtSWl29Zse+HWsq54czhJXn5x6+fPlCbNm6g5MmTDq4tiqMIThn566LQBA1d39n79SJ + nQeWBjMEeJ86DQKFS3q6O85d6etfHsDgKXrsOAjMXNg++Wzr2Sltiz0ZzFiPnwCBkKKGxitnauu7is0Y + zDlmLAKJCfhvqmue1lS3MdCcwYKHiXHF8eOH2PkjtrTUtGwOFbJgsOLmZDY9enIlr5amT8HsPC8ubSsG + ax1xSZbI80FyakoKcjLSUuI61gw2urLyshKWKkZuxhrqqorysro2DDZ6yvoGJi5xialJ8e6uhvrKejYM + gr4eCckpaRlZ2VmZ6SnJCR6+ggwMwrZOdvYOjs7Ozo4O9nZOtsIMAJnRonErDmY9AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAMAAABFjsb+AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFERIUCAop + CQ03DR9HDxpZDiJNDyxeEylPGytKHStLHS1MGy1VHS9XFjVfHjBYEi5gHytmETFmEjNqEzVqHTRlHTVm + Ezl2Fj1wFDx6Fj55HT14JzRRITZZKDZTLzlULTteNT9YICpmICtoKj5kLD9lF0F1F0R9HUhzH0p0H016 + NUFdJkNqKkNtKkpwLE53NUdtPU1sO1F+RU1eR1FtTVRsT1huSVlzS1t1TlhwV2B1Fy+BFy+CE0SNE0WO + HkSKGEmJGUyJGU2PIUCJIEGMJEOJJkSIJESPK0qPLl6DOVqCN1abJ1ekKWSNLGeOLGufLWyYMHCdM3ab + KmynLW+jKGmpKGmqKm6pN3ykM3KzRWeMT2WFWmuKRmenS2yoQGi5UG+qVXKsW3mxX32xZm6CaXSJbHeI + aXiLaXiScXiLcXuJcXyQc3yRPIWmPoqrQpGtd4GUdISSdIWffIaTfoeXfIuYfY+bbom3Vo/Ie5TAfZbB + g4uehIubhY2fgZCcgJOfgJSfiZOfgZWgiZGhjZSkiJijjp6omZ+ukqKrk6Wulaeul6GymaGwn6a0m6mx + mquznKy0na61oKi2oK21oqu8obK5orO6p7C+prS6p7W7qLe9rbS9qri+rbi/rLXBr7rBr73DsbfCsL/E + tL7Etb/FtrzIuL/Kiszfjc/djdDektHdlNLbltXenNXdntjfg8LhiMvgotnescDFvsTOvcbQwsnPxMnO + wcfRw8rTxMrTx83Vyc7XyNHVyNHWy9DXydLWytPXy9LbzdLa0tbb0dbe09jfyN700NXg1Nng19zj29/i + 3N7h3N/j3OHo3eLp5Obq5ujr6Ort5+z07O3w7+/x7u/y7/T78PHy8fP09fb38PX89Pb69/j5+Pj5+vz/ + /v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYxRxBgAAAW1JREFUKFNjMDIs + q6xAgMoyQyMGw6PXLiODa0cNGZJO7du/f/8eIN63ezeIPJXEkLh14caNs+fM3jh/xqJ5M+dvXLg1kSFh + 0ZSpfYvvzZnQ37vl9slJ/VMWJTDET+9ob79z71BL641ZRaev97ZOj2eI7awrPXTv3pWCkoYL5zLPX6rt + jGWIqd+8/S4QpE3blXprb/HduY0xDF5mV2+CQH7WzZrJNy0uHjP3YnCXPnMWBJoUzrZlnDXZdFjWncGV + 8/ARELA0PZJcfURu5wIuVwYXnqrm40DAkdKjdXCi8fFsPhcGJxFW5u7jx3ewyxgsXSK/ZBu3qBODk5Qg + v/LBI1282rvSVaZt12eTcmJwtpOQFI4+EaWuoVt4YLKOkJidM4Obt62jg6qepo+vR6SnuJq9jbcbg3V5 + RGhYcEB4bl5OoL9fUEhEuRUDU9y69ctWrFy9dsOaVSuXL1u/Lo6JgYGRRUlAQBECBASUWBgZAFBhr6gt + gaHsAAAAAElFTkSuQmCC + + + + + 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 + peH+1vvyAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAAB0AAAAdCAMAAABhTZc9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFDw8ODxAP + DxEWEBERERIREhISERITEhIXEhQUERQVExcXEBEcERIdAAA0AAA9CBEkCxY1EhgoFBkqFRssFx8wGyIm + GyMtHSc6Jy00BABGAABPAgRLAgVMBABIBQBOBwdNCQhPAgBRBQBRBQJSAQJbAAhWAA5XChZeGB9dAwdj + Ag5lABViABZuAB9oABpzFhxjFixYHSZfHzRFACVvACN3ACtxADV6GTF0Jy9MIjpJJj9KKDBNKDdLKzlD + KzlEKDlGKjtFKDtGLTtHLD1JMT9MIy1pJS1zMjx3KUNPLUBMJENWJkVYKkZSLUpXLU9dO0BOMkFRNURS + NkZUN05dPkRSPEZVP0ZWOEpZPkhYPk1dK05kKVdsK1d9O0J2NVVmPlJlO2d4QUhYQUpaQ0tdQ0xeRElY + R0xaRU1eRU5gR09iREt5R1FjRVJkQVRqQ1luSFFkSlJlSlNmSVRoS1RpTFdrTVhtTlN9WF5tR2V8V2Bv + XmZzAC2AADWFAT6NAESIAkqUAFGeA1uoCWGoBmSxFnKuHHCyGXm1IVmWKGWfKGWgPnymDXnEQ0+IRFaL + SVSGTFeITFyOU1yFTW6GQHGERXOJR3qPTHKLTXeRTHSeS3uTVmONXWGGWGqVWnecYWWHYmaIYmuNam+P + Y2+SY3OWYXabY3iUbXGQbneVb3qXaHuec3aHcXWSdXqVcH6bcX2gP4CdN4KyFY3VLozIIpnaNJnTJaTm + LqvmKa/tM7HoNrnyRoGWSYOdQYOhQoShQ4WnRoWjRYijR4umQ4itSIegTIihSIyoTJGuT5W0UpWxUpe3 + UZi5VJu8VZ6+aoGbfICafoScaYWmdYWlc46vfIKjfIeofY2jeo2ofpCnR8v6VdT/dub/goefhoqfhYuq + io+iiYymiY2rg5eqjpGphpiwkpetmZ20jKC2lKG0m6K3nqe7nam8oKK3qrLGtLbGtrvCtLvPwcbNwcLR + xsfVzM3Zz9Tb3eLp6u/26/D3+vz/////AAAAAAAAAAAAAAAAAAAAAAAAzAsMkgAAAylJREFUOE9jKASD + goLi0pwgTw8fXx8Pz6Cc0uKCApAwQz4ElOQ4eyQcOXnq1KmTRxI8nHNKwKIMmSCQXxJoNfn03mgvext7 + r+i9pydbBZbkA8UZMoAgs8jZ78R6y7RV9548eXJvVarl+hN+zkWZGRkM6UBQ5BR3Jjrk3osnd86fP3/7 + 0dM7/tFn4pyK0tMZkpOTswP8znhVvXx0bs3qZcuWrV5z7v6Lcq8zfgHZyQxJSSmRVieiq17eXrNs/mwQ + mLdwzfmnldEnrCJTGBITMxwmr498dXvFgoVvX5eVlb1+u3DB8vPPw9dPdshgCEuM8Djp/fD6igUTP/78 + +SD2/s+fH8sWLL961eukRwRDWJJLwp68Z2sXzcr6/PPnU/dHP39+zpq4YMXj3D0JLgwhEY67Y85eWzyr + PxYo+8T1AVA2tm/W4otLY3Y7MoSEWh2LurRyzoQed7DsXaCse0/vnJUXoo5ZMYSF+hw3ujC3191N/xPQ + XvXLP39+0ndz7517wei4D4OEhM8xfkMNeTlFqY8/ftxVW/fjx0cpRSUFDVf+Yz4MDFweBwR4+WTlVFTf + f/t2RXvdt+/vVVWUZPl4BQ54MLByxR0w4JVUUtHSfvP160XdlV+/vtHWUlGS5DU4EMfAyha8K4ZPWVPH + xPjVly/rTJd8+fLK2ERHU5kvZlcwAyuj3ZQuGS296hqz5x8+rDSb++HDc7Oaaj0t6a4pdgyszKIVB811 + qmvr666/ezejYca7d9fr6murdcwPVogysLKyhk/t0qmtb2xuvzC3qbtp7oX25sb6Wp2uqeGsQFkW0YrD + 7TXN3Ru7W9o2bt7Y1gJkNda0H64QZQHpZbaddrS9YePWbdt27Ny5c8e2bVs3NrQfnWbLDNLLysoRPv1o + Z/P2GzdugsCNG9ubO45OD+dghciycoVPO7yhdfONWyBwY3PrhsPTwrmA4gxsYMDpNGnmgQ0bNm3ZsmXT + hg37Z05y4gQJM7BDAJNY/KSZu/fuO7Rv7+7pk+LFmMCiDDxQwM0tFpBXMWnapIq8ADFubogogzAcCAkK + iYiLi4sAaZgYgzUKsLCwQOYDADNYgx+MsDCLAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAAB0AAAAdCAMAAABhTZc9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFDw8ODxAP + DxEWEBERERIREhISERITEhIXEhQUERQVExcXEBEcERIdEhgoFBkqFRssFx8wGyImGyMtHSc6Jy00Jy9M + Jj9KKDBNKzlEKTtFLTtHLD1JMT9MKENOKkNPLUBMKkZSLEdULUpXLU9dMkFRNURSNkZUN05dPUVTPEZV + OEpZPkhYPkxdMldmO1NlO2Z4QEdXQUlZQkpbQ0tdQ0xeRU1eRU5gR09iR1FjRVJkQVhuSFFkSlJlSlNm + SFRnSlRpS1ZrTFdrTVhtRGR5SWZ+AC7SCiTVDi3TADvNATbXBTbfBjzXADrcDTHXDDPdCD7ZES/OFjXP + GT3RAD3gFDvlP3CEAUbSClXUEkTdHlnOHVLVAEDkAEfpAEjqC0voAlr0GkfmFGrYDGr2DHD2FH33Ik3P + JU7KJVvbJFntLGbQJH7WNGnPMWHdOnfCK2TvJXT4Mm3oO3DoTW6FTm6HRXOJRnmOTXKLTHqSQXPSR3fQ + Rn3jGoT+KIrcNZjcJJP7OKjzRoGWR4KcSoWeSImfRoeiRIetR4qnSIimSI2pS46vQo25T5GvTZK1SpG6 + TZS5T5e9bJKrZZW8eJarc5i/QITeRYneTY3fRJrHTZXAQ5LTQpHWRZPVWoHWUZrBT4rkWI3mXZHqTanH + S7nqUbzgZovZbJLGeJnKdJXTf53UfZnYfZjeYYnlY5XlY5TqbJbobZrpd5Tgd5XldZzofp3jeKXrfKDp + fq/vcqX5S8D9Xs3pesD9aeH5cubze+/8hqC5jKTYmazElqzZgKfqh63tjKTmjazpjbLtjbbwkqfnk6jn + lK7rma7ombHum73vorTOp7nZtrvCoLPqorXroLbupbbrpLfvpLrtqbrkq7ztnsf1g/T+ivD/l///qMbz + ptb8tcXjvMnotMTwtMzzs9b3sv//v/L/wcbNz9TbwMvox9HpztboxNX1wdr3zNT1z9j2ztz20djq19z2 + 2d73yuH4w/r/3eLp2eL46u/26/D3+vz/////AAAAAAAAAAAAAAAAAAAAzS/fsQAAAylJREFUOE9jsAUD + Gxt7J0s1eTlFJUU5eTVLJ3sbG5AwgzUEOFpKy+k39cyYPqOnSV9O2tIRLMpgDgLWDqpiof2zp63ZtHXT + mmmz+0PFVB2sgeIMZkBgbi+t3D1r/tV3nz4CwdvL82d1K0vbm5uZMZgCgZ2U7twpZ769e3jjypUrNx6+ + /XhqylxdKTtTUwZjY2MLFeW5Ux59e3jp9MkjR46cOH3xxvuHU+Yqq1gYMxgZmeiIdU959P7a6SOrNmzc + uHHDqiOnrr2+O6VbTMeEwdDQTCJ01rHP105tXvng+pzVc64/WLn56OU3h2eFSpoxGBhqy/bN+3z36NYl + L3/9Olh18Nevl0s2HT37Zl6frDaDppGM/szjj48dWj/nw69f5yv2//r1Yc66rcceHZ6pL8OgoS3ZOPXx + zcOb1la+AurNBsq+qlyw/tDZu1MbJRk0NMU6qx4f27J2AVg2EyRbMX/tlsP3qjrFGAw0FWbk3Nu2tqog + Emjv/vAVQHsjC6oWbLuZM0OBQUREode3IMrbJ9rjxc+fK8KW//z5wiM62D+90LdXgYGBS7bV3cvVMzgm + 7P737yvCl3//cT8sNtjT1cu9VZaBlUuvKTDE0ycmPvz816/Lwpd+/Xo+PD7WxzMksEWPgZVNvSHNLy42 + Pin83PPnyxKXPn9+LjEpPjYuJK1BnYGVUaIk1y0/Pjkl8cCzZ5OzJj57diAxJTk+3y23RIKBlVnQuSMg + vzqlrmbfhQsTaydeuLCvpi6lOj+gw1mQgZWVVas0129HXX1916QJ0xdNnzCpq76+bodfbqkWK1CWRdCl + OTVj944dixcu3Ll758KFi3fs2J2R2uwiyALSyyxR1hGUd/vW7t179u7du2f37lu384LayiSYQXpZWTm0 + yjtSQ3Y9eXIHBJ482RWS2lGuxcEKkWXl0iprzvXL2H7v6Zen97Zn+OU2l2lxAcUZ2MCAU6qovC03KiIh + ISEiKretvEiKEyTMwA4BTEJ6ReVN7a2tre1N5UV6QkxgUQYeKODmFlKxcikuK3axUhHi5oaIMvDDAR8v + n4CwsLAAkIaJMYijAFFRUWQ+AARqaklCCnVoAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAAB0AAAAdCAMAAABhTZc9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFDw4NDw8O + CgoXDg4SDg4WCQwfEA8PEBAPERERERESEhISEhITEhIXExQUFBUVFRUWEBAbERIdExUZFBUYFhcZFRcb + FhccFxgZFxgbFxgfGBkcGRodBQcuBgc1ChEsEhcnFxkjFRoqFRssGx0gHR8jGiAyICEpISMoIyUrIyYs + JCctJCcuJSkvISU0JysyKy84KzA+LTI8LjM9LzU/MDU/BQVAAwdJBglBAw1OBgtQAwVlBAhwDR5nDS5+ + MDVAMTZBMjdCNDlENTtONjxINz1NOD9NLz9zO0FPO0JSPURTPkVWPkZVP0ZWP0ZaP0deL0BuPkZgNEB1 + QEdXQUlZQkpbQ0tcREtdRU1eRk1gRk5gRk9hR09iR1BiSFBjSFFkSlJlSlNmS1RnS1RoTVZpTVZqTlds + T1hsBgiIAAyaABOdABySDhafARSgABmgAB6iBRqhBhygCRaqCBiqACmQDiOYADWYFTWXACimCyiyADup + ADywFyO1GzStIi6eJjqIJzyLKjqKLDuWAEWdAECvAE+2AEm7ClSgHkSiB2O8GWutIkmNMkCNKk26K1q3 + NUykO1qrOVu4NmCaNnevAFTGAFjHAGHIBWnaCnnYEmPPA3flIVLSLWDYSFemRmS2RWO8RWi+SmKxV2mm + V267VHmiZHK6RWbAS2vEUW3EWW/DU3LHVXbJYHfIYX7MbXzJcX3GGYjWD4vvHJjsGpj0JpPQP5XzLqvq + Kqz2MbX3N7v0O8L7XoSme4yxWZrgVrf3bYLNaInScYbDc4HJcoTOeIPHeoXMcY3TepPVRcv9TND+X+b/ + Y9b/Zuv/fPT/kaO8g43Ph5LJgpTUgp7aiZDQjpXTk5nVmqnLkaDXlaPalajdnKPZn6jbhK3oj7LnmLjo + oqbapKzcqa7dqbLAqLPUtrvCtL/YqLzmsbXggNP8ke7/v8bdtsjrwcbNz9Tbxc3hx87rztPj0dfv2Nrw + 2uDn2+Lt3OHo3+Pv2+Dy6u/27PH38/X5+vv9+vz/////AAAAAAAAAAAA6kUEYQAAAxhJREFUOE9jSISD + 5LTUhMjIyITUtGSYGEMCGMTHJ6WE2msoS0tLK2vYh6YkxceDhBniICApRJNf3c7dL8DP3U6dXzMkCSzK + EA0CsfEmfFpegd1zlqxbMqc70EuLzyQ+FijOEAEE0bHa/K6Bc+5/+PYRCD7cmhPoyq8dGx0RwRAOBDFa + Ur4N17+9e/bg3r1795+9+3CtwVdKKyY8nCEsLDTKkN+34dWHZzevXL506dLlKzcfvHva6MtvGBXKEBIS + 5snnXP/03a0r5w4fXLd27cEj5y7ffPW03pnPM4whODhMXd3twqvrFw6ef7Rk0YoVK1avPXTh2qtjburq + YQxBwe58Ln2vblw4tOj9n59X585btnzF6n3Hrr3qc+FzZ/AO1lfxP/b0wqHVC97/+fPn64EJ85YuB0rf + Peqvos/gGaSiX3f34tE1K/tBsn/+vF00ASR98U6dvgqDp4e4fePdY2tWLYPK/vn1aO78lWuO3mm0F2fw + cRd3qr29f9mEnrK3YL1A8OPAhGX7b9c6iTPoafPrpvfU5OfmZb38DQO/SgpqetJ1+RkYGXlZ0gszMvPK + i598B4MfPz4vzMrMKEpn4WXg4jCUsq7OyS2vLH30BQw+7bYtLs/NqbaWMGTgYjPWsKyuKK9qrbz6BgTO + dpVWNleWV1RbahgzcDHq2Mllz6pqndxy9vXr1w8nNrVMmTK5tWpWtpydDtBkEVdRq9kzJk+bevbxw8Vt + HdNnzpw5bfKM2VairiIMXFwMxkZyJVumzZw+aVdn5/qNGzdu2jBz2pYSOSNjBqAsh0SQinnP3k0bN2/e + vHU7EGzbtGlvj6lKkAQHUJaLQcdHyLT31IkdO3YeP3H8+M6dJ071mgr7AG0FyXIxOAQLy5btPXPm9Ekg + OHNmb5mscLADyFKQLAe7Q4gKq1n7nucvXrx4vqfdlFUlxIGdAyjLDQKcjHrRjiJMMhY2NjYWMkyijtF6 + jJxAcQYeCGCWdA1311cTExNV03cPd5VkBosyCEKBAIuCgUdoRHREqIeBAosARJRBCQ4U5eUVVVVVQRRM + DACG9nnjnRgGhwAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAAB0AAAAdCAMAAABhTZc9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFDw8ODxAP + DxEWEBERERIREhISERITEhIXEhQUERQVExcXEBEcERIdAAA0AAA9CBEkCxY1EhgoFBkqFRssFx8wGyIm + GyMtHSc6Jy00BABGAABOAgRLAgVMBQBJBABNBwdNCQhPAgBQAAdWBQFRAQJbAAxWDRtXEQxSGB9dAwtk + ABRjABVuABhvABxzFhtiFixYHildACZpACN3ATh5HCNhGTF0Jy9MIDdHJj9KKDBNKDdLKzlDKzlEKDlG + KjtFKDtGLTtHLD1JMT9MIy5iJS1zIjprLzt4ND14KUNPLUBMJENWJkVYKkZSLUpXLU9dO0BOMkFRNURS + NkZUN05dPkRSPEZVP0ZWOEpZPkhYPk1dK05kKVdsLl14O0J6NVVmP1NnNlN6O2d4QUhYQUpaQ0tdQ0xe + RElYR0xaRU1eRU5gR09iQ0l6R1FjRVJkQ1luSFFkSlJlSlNmSVRoS1RpTFdrTVhtSlB+WF5tR2V8V2Bv + XmZzAC2AADWFADyDAT6NAEaMAkqUAE+cElOLAFSjB1ygA1uoBWCsB2m3Fnq6HHCyKFGCJVeVLWaaKGWg + PnymCHrLQUqCRFSKTFSCTleJTFyOUViBVlyFTW6GQHGERXOJR3qPTHKLTHqSVmONXWGHVmyUWnWdYWWI + Y2uNbG+ZbXCPY3GVY3iUZ3mdbneVbXuYc3aHcXWScXWedXqVcH6be3+ZaX6hP4CdN4KyG4bFE5DcHprh + LozIIpfYNJnTIZ7jJ6bmKq7tMa/pNLbwN7z0RoGWSYOdQYOhQoShQ4WnRYijRoikR4umQ4itSIagSIig + TIihSIyoTJGuT5W0UpWxUpe3UZi5VJu8VZ6+aoGbfYKbfICcfoWeaYWqeYymR8v6VdT/dub/hImfio+i + iJCmiZaqhpiwkpetjKC2lKC0mqC2nqa8nKm8qK++tbvIwcbNwcPUycvXz9Pb39/o2uDn2+Dr3OHo6u/2 + 7u/z7PH48/P2+vr7+vr9+vz/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAyX1CIwAAAxFJREFUOE9jKASD + goLi0twgTw8fXx8Pz6Dc0uKCApAwQz4ElOQ6eiSeOn/hwoXzpxI9HHNLwKIMWSCQXxJoMePioWgvWytb + r+hDF2dYBJbkA8UZMoEgq8jR79xG8/RVdx8+fHh3VZr5xnN+jkVZmZkMGUBQ5BB3KTrk7pOHd65duXbn + 3pM7/tGX4hyKMjIYUlJScgL8LnlVPb13Ze3qJUuWrF67/t6Tcq9LfgE5KQzJyamRFueiq57eWbtk4cJ5 + 8+YtXLRk7bUnldHnLCJTGZKSMu1mbIx8dm3FoqvPp5VNmjR12rxFK649Dt84wy6TISwpwuO89/17KxdN + ffPjy8Ps7OyySdMWrbhxw+usRwRDWLJT4sG8R+uWzs1+/ePHj7eL3WMnAKVXPog/mOjEEBJhfyDm8o2l + cyfFgmR//Hg1OXbCxLlLbyyLOWDPEBJqcSbqxob5Uya6Q2R/fH06YcKU+cuvR52xYAgL9Tlrfn3BRHcX + Pajsjx+f1rhNXHDd/KwPg4SEzxl+Aw15OUWpV99h4Ju6gokz/xkfBgYujyMCvHySyipKLz6CwefP76fJ + yvLxChzxYGDlijuizwuU1NR6/gEM3l1TU1VRluTVPxLHwMoWvL+LT1lT28jw2RsQeOxqaKiro6nM17U/ + mIGV0WZmn4ymbnWN8eOXL18+TzA0Nq6tqdbRlO6bacPAyixaccxUu7quvv7+i+fzjeubm5sb6+uqtU2P + VYgysLKyhs/q06lraG3rWdDU0t4PBO2tDXXafbPCWYGyLKIVJ7pr2vr7Ozo2b9+5c+fWLVv622q6T1aI + soD0MlvPPt3dvGXXrj179wHB3t07tzR2n55tzQzSy8rKET7ndG/77ps3b4HAzZu723tPzwnnYIXIsnKF + zz7R17n95m0QuLm9s+/E7HAuoDgDGxhwOkyfc3TTpm07duzYtmnTkTnTHThBwgzsEMAkFj99zoFDh48f + PnRgzvR4MSawKAMPFHBziwXkVUyfPb0iL0CMmxsiyiAMB0KCQiLi4uIiQBomxmCJAszMzJD5AKC+iMSu + Me5pAAAAAElFTkSuQmCC + + + + + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbZ1u+QAAACZJREFUOE9jYGQY + BRSEAAsH5yggOwQYmJlGAfkhwMDKxj4KyA4BANhiFlbMlRkDAAAAAElFTkSuQmCC + + + + + R0lGODlhdgEMAPcAABweIR0eIigsNDA0PjY7SEZOYE1VaU5Wa09YbVBYbVBZblFZb1FablFab1JbcFFa + cVNcc1Rdc1RddFRddVVedVZfdlZfd1dgd1hieVhielpjfFtlfVtlfl1mf11mgF5ogl9pg15phWBqhWFq + hgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ACwAAAAAdgEMAAAI/wBDCBxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzarw4oqPHjyBDihxJsqTJkyhT + qlzJsqXLlzBjypxJs6ZMEDhBiNjJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp2KNCcIDx0+gLhQoavX + r2DDih1LtqzZs2jTql3Ltq3bt3Djyp1Lty7aCyA+dPCggUMDAQEACB5MuLDhw4gTK17MuLHjx5AjS55M + ubLly5gza24cQEADDhosYBhAYEGC06hTq17NurXr17Bjy55Nu7bt27hz697Nu7fv37IXEBiAwQKEBwUo + TJDAvLnz59CjS59Ovbr169iza9/Ovbv37+DDi7wfT/76BAoFHkBw4EBBBgkR4sufT7++/fv48+vfz7+/ + //8ABijggAQWaOCBCCbInwQZKMBeAww4sMEIVFVo4YUYZqjhhhx26GFRI2zgAAMNIGAiAg2kqOKKLLbo + 4oswxijjjDTWaOONOOao44489ujjj0AGaeOJCBxg5JFIJqnkkkw26eSTUEYp5ZRUVmnllVhmqeWWXHbp + 5ZYGhCnmmGSWaeaZaKap5ppstunmm3DGKeecdNZp55145mlnQAA7 + + + + ..\Resources\pictureBoxReverse.Image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\pictureBoxReverseMouseDown.Image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\pictureBoxReverseMouseOver.Image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + + iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFDw8OCgoW + DAwRDw8TDQ0VDw8UEBATEhISHyMtJioxMjdJMzhKNDxNOkFRPENSPENTPURTPURUPkZVP0ZWQEdXQUlZ + QkpbQ0tdRU1eRk5gm56nyszQ09jf1Nng3eLp8PX8+vz//v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHzqB+wAAAHxJREFUKFONzdkO + gjAQheHDVpBFqVVQcOv7v6SclgmJmRi+u386bXFX4KbAqMCgwFWBCzl7iqxj4kzd7KO5Y6K3i3aded8y + 0R8X9UfUTDgeNW/RhM0DVS9RMRGkD5GGLql4ioL5Z5hN6/Up2zZNnkS52YalEeGL+OaP/cMvDc4aWeQk + 0FYAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFEBESEhIS + ExMVExMWCBc2CRY3Dxo3CBk5CRo7EhYpEhcuFRoqFhssHB8mEBczExs0FRswFhwxFBw2ERw6Eh48GiIl + GyA3HCAyHSM2HSI3GiA7HSI5JiwvJioyIyk7JCo8Ji48Dh5BDh9CDyFECyRMCydODCZOBi1dCylRCi1X + FyBAFSJHEyZQFjFfBzRmBzltCjRgCzhmKS9BLzZLLjVMLzVOLzVQLzVTLjZXLjdcLzphLztiLztjLzxj + MDphMD1kCUB2Ckh/FUF4N0BVO0JRPENUPERTPkVVP0dXOEJYNEd1QUhZQUlaQkpaQ0tdRU1eQk1hQ05h + Q09mRk5gR1NmTFtwUmB0VmV2XGp5XGp6YXB+Y3F/DVGHEEiGE1qPEFCQEVmaF2GTFmKgG2ynInatKH2y + ZHWFZHWGa36Ob4CEb4GNcoONcIKOeouVeIqXe4yWf42Wgo+YhZObh5adhJafiJaekqCmnaOwnaywprG0 + p7G1tMDEtcHFucTH09jf1tre1Nng19zj3eLp8PX8+vz//v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARsHXsgAAATlJREFUKFNVy+dX + QQEYgPG3SyGyJTTsvZJxqcwWUbj2Di2zMiqU5v/dB+eWfh+fcx7AMCx8Oi+MYXAeWeGtz+OtROBMfDt+ + mTe+FUM4Mxk9j/48jyYZOMk/Df97ysNxdtgbPNzfzdw/DHrDLByl++1uc/o9M2122/00HKQ6jVbuC5dr + NTopOEjeXF2nPnGp66ubJBzGE9FY4AMXiEUTcdgIWja31l5xa1ubliDADp9Ko7zhKDQqfwcQ6yqTtfwb + l1nMVSsQbEIGm/6709kMoQ0Idi2Hu/T4PvO4xOVo7UBw6KQyCXmRSCKTiItkiUyqcwAB1cuVSoVaY942 + a9QKpVKuRwFBDSqjyesrlC5KBZ/XZFQZUFgQhPzFcqVaq1/Wa9VKuegPCWABETndrt29fY/Hs7+363I7 + RcgPYGp9sy9YtQ4AAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFDhAWEhIS + EREWERIUERIaCAopCQ03EiA/JCg2DxpZFSVDFidGEiRIHSlFEihSECtXEixVFClQFixSFC9VEy1cFTFW + FTBeHytmEjBgEjFiEjRrFTdsHzlsFjxzFDx6Hj56ITBMIzJOIzVVLz9cICpmICtoIjdhF0B8OUFVOEBW + OkJXOkJYO0NZPUVbP0hdO0liOlB+Q0tdRU1eRE1fQ01iQ0xjRE1hRk5gR1dxSFlyFy+BFy+CE0WOHkSK + HU6HGU2PGk+NHlCCIUCIIECJIEGMJEOJJkSIJESPK0qPIlWDJluDKF6EN1abJ1ekKGmqK2+rMHasNX2s + M3KzVGaARmenS2yoQGi5UG+qVXKsW3mxX32xZHSHOoSsP4ytQ5KudIWSeIuceY2dbom3Vo/Ie5TAfZbB + hZmkh5qlipqliJ2nk6WulKavl6mwm6S1mKiwmquzn6+3obK5orO6prS6sL/EtL7EiszfjtHfk9Pfl9bf + ntjfg8LhiMvgo9rfscDFxMnOytLWytPX09jfyN701Nng3N7h3ODk3eLp7+/x8PHy8PX8+vz//v7/AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAasY1UQAAATxJREFUKFNjMDc3 + NzM1QQBTM3NzBiNjg6TUFARITTIwZjA0aO7sQAadzQYMelGtDY3IoKE1ikE3sr6kDhmU1Ecy6ESUFhYV + 5OdBQH5BUWFpBINWeHFWdkZbDwS0ZWRnFYczaITmpKXHQ8V6euLT03JCGTRDMhMSo7thIDoxITOEQdsn + 2MJSvwsG9C0tgn0YODyUFRR522GAV1FB2YOBwU2Ji5u9CQbYubmU3BhYXNUEhXhaYIBHSFDNlYHFSUZE + jA8uyCcmIuPEwOIsLyUtkQvVnishLSXvzMDiYiunLivJLyAsKizALymrLmfrwsDi7mtj72Dn6Onl7eXp + aOdgb+PrzsBknRzk5x8QGBMbFxsTGODvF5RsxcDIFlZdU1ZeUVlVW1VZUV5WUx3GxsDIzMqpKi6uAgHi + 4qqcrMwAl/uGWf27czcAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAAT4AAAAECAMAAAAgcKN9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFHB4hHR4i + D0HNGEXCWHiYYnm0a4/ubpb/frjthMX/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbZ1u+QAAACZJREFUOE9jYGQY + BRSEAAsH5yggOwQYmJlGAfkhwMDKxj4KyA4BANhiFlbMlRkDAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAAFIAAAANCAMAAAANKsmLAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFDg0MDw8O + EBAPEREQEREREhISFBQVFRYXFRYYFhcZGBkcGRocIiQpIiQqJSkvJioxKCszLDA5NDpFOUBNO0FPPENS + PUVUPkZVQEdXR09hS1NmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIb5gPgAAAHBJREFUOE/VzjsS + gDAIRdFnFMVPNH6j7n+hFgELW9J4GobmzsOZHWJ2OJQ1/YawJ3FbjbYoKV05N9yacDPLTkyJA/edQc9w + kkKRhMUP3mDwS5AUKBkvuk3oGiWlSVezUe0+SapKo0qKpCv1z3D/kXwApPU2QwRJJE0AAAAASUVORK5C + YII= + + + + + ..\Resources\pictureBoxNoFS.Image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\pictureBoxNoFSDown.Image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\pictureBoxNoFSOver.Image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/src/DLLs/Interop.QuartzTypeLib.dll b/src/ui/DLLs/Interop.QuartzTypeLib.dll similarity index 100% rename from src/DLLs/Interop.QuartzTypeLib.dll rename to src/ui/DLLs/Interop.QuartzTypeLib.dll diff --git a/src/DLLs/Voikkox64.dll b/src/ui/DLLs/Voikkox64.dll similarity index 100% rename from src/DLLs/Voikkox64.dll rename to src/ui/DLLs/Voikkox64.dll diff --git a/src/DLLs/Voikkox86.dll b/src/ui/DLLs/Voikkox86.dll similarity index 100% rename from src/DLLs/Voikkox86.dll rename to src/ui/DLLs/Voikkox86.dll diff --git a/src/Forms/About.Designer.cs b/src/ui/Forms/About.Designer.cs similarity index 98% rename from src/Forms/About.Designer.cs rename to src/ui/Forms/About.Designer.cs index 89e6937e2..bb9a61b1d 100644 --- a/src/Forms/About.Designer.cs +++ b/src/ui/Forms/About.Designer.cs @@ -1,157 +1,157 @@ -namespace Nikse.SubtitleEdit.Forms -{ - partial class About - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(About)); - this.okButton = new System.Windows.Forms.Button(); - this.labelProduct = new System.Windows.Forms.Label(); - this.pictureBox1 = new System.Windows.Forms.PictureBox(); - this.richTextBoxAbout1 = new System.Windows.Forms.RichTextBox(); - this.buttonDonate = new System.Windows.Forms.Button(); - this.linkLabelGitBuildHash = new System.Windows.Forms.LinkLabel(); - this.tooltip = new System.Windows.Forms.ToolTip(this.components); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); - this.SuspendLayout(); - // - // okButton - // - this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.okButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.okButton.Location = new System.Drawing.Point(381, 337); - this.okButton.Name = "okButton"; - this.okButton.Size = new System.Drawing.Size(83, 23); - this.okButton.TabIndex = 0; - this.okButton.Text = "&OK"; - this.okButton.Click += new System.EventHandler(this.OkButtonClick); - // - // labelProduct - // - this.labelProduct.AutoSize = true; - this.labelProduct.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelProduct.Location = new System.Drawing.Point(13, 16); - this.labelProduct.Name = "labelProduct"; - this.labelProduct.Size = new System.Drawing.Size(140, 19); - this.labelProduct.TabIndex = 26; - this.labelProduct.Text = "Subtitle Edit 3.2"; - // - // pictureBox1 - // - this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image"))); - this.pictureBox1.Location = new System.Drawing.Point(399, 14); - this.pictureBox1.Name = "pictureBox1"; - this.pictureBox1.Size = new System.Drawing.Size(70, 64); - this.pictureBox1.TabIndex = 27; - this.pictureBox1.TabStop = false; - // - // richTextBoxAbout1 - // - this.richTextBoxAbout1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.richTextBoxAbout1.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.richTextBoxAbout1.Location = new System.Drawing.Point(16, 43); - this.richTextBoxAbout1.Name = "richTextBoxAbout1"; - this.richTextBoxAbout1.ReadOnly = true; - this.richTextBoxAbout1.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.None; - this.richTextBoxAbout1.Size = new System.Drawing.Size(448, 266); - this.richTextBoxAbout1.TabIndex = 40; - this.richTextBoxAbout1.TabStop = false; - this.richTextBoxAbout1.Text = "About..."; - this.richTextBoxAbout1.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.RichTextBoxAbout1LinkClicked); - // - // buttonDonate - // - this.buttonDonate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonDonate.AutoSize = true; - this.buttonDonate.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.buttonDonate.FlatAppearance.BorderSize = 0; - this.buttonDonate.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.buttonDonate.ForeColor = System.Drawing.Color.Transparent; - this.buttonDonate.Image = global::Nikse.SubtitleEdit.Properties.Resources.Donate; - this.buttonDonate.Location = new System.Drawing.Point(16, 328); - this.buttonDonate.Name = "buttonDonate"; - this.buttonDonate.Size = new System.Drawing.Size(98, 32); - this.buttonDonate.TabIndex = 42; - this.buttonDonate.UseVisualStyleBackColor = false; - this.buttonDonate.Click += new System.EventHandler(this.buttonDonate_Click); - // - // linkLabelGitBuildHash - // - this.linkLabelGitBuildHash.AutoSize = true; - this.linkLabelGitBuildHash.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.linkLabelGitBuildHash.LinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(102)))), ((int)(((byte)(204))))); - this.linkLabelGitBuildHash.Location = new System.Drawing.Point(148, 15); - this.linkLabelGitBuildHash.Name = "linkLabelGitBuildHash"; - this.linkLabelGitBuildHash.Size = new System.Drawing.Size(90, 20); - this.linkLabelGitBuildHash.TabIndex = 43; - this.linkLabelGitBuildHash.TabStop = true; - this.linkLabelGitBuildHash.Text = "linkLabel1"; - this.linkLabelGitBuildHash.VisitedLinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(128)))), ((int)(((byte)(128)))), ((int)(((byte)(255))))); - this.linkLabelGitBuildHash.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabelGitBuildHash_LinkClicked); - // - // About - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(476, 372); - this.Controls.Add(this.linkLabelGitBuildHash); - this.Controls.Add(this.buttonDonate); - this.Controls.Add(this.okButton); - this.Controls.Add(this.pictureBox1); - this.Controls.Add(this.richTextBoxAbout1); - this.Controls.Add(this.labelProduct); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "About"; - this.Padding = new System.Windows.Forms.Padding(9); - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "About Subtitle Edit"; - this.Shown += new System.EventHandler(this.About_Shown); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.About_KeyDown); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button okButton; - private System.Windows.Forms.Label labelProduct; - private System.Windows.Forms.PictureBox pictureBox1; - private System.Windows.Forms.RichTextBox richTextBoxAbout1; - private System.Windows.Forms.Button buttonDonate; - private System.Windows.Forms.LinkLabel linkLabelGitBuildHash; - private System.Windows.Forms.ToolTip tooltip; - - } -} +namespace Nikse.SubtitleEdit.Forms +{ + partial class About + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(About)); + this.okButton = new System.Windows.Forms.Button(); + this.labelProduct = new System.Windows.Forms.Label(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.richTextBoxAbout1 = new System.Windows.Forms.RichTextBox(); + this.buttonDonate = new System.Windows.Forms.Button(); + this.linkLabelGitBuildHash = new System.Windows.Forms.LinkLabel(); + this.tooltip = new System.Windows.Forms.ToolTip(this.components); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.SuspendLayout(); + // + // okButton + // + this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.okButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.okButton.Location = new System.Drawing.Point(381, 337); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(83, 23); + this.okButton.TabIndex = 0; + this.okButton.Text = "&OK"; + this.okButton.Click += new System.EventHandler(this.OkButtonClick); + // + // labelProduct + // + this.labelProduct.AutoSize = true; + this.labelProduct.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelProduct.Location = new System.Drawing.Point(13, 16); + this.labelProduct.Name = "labelProduct"; + this.labelProduct.Size = new System.Drawing.Size(140, 19); + this.labelProduct.TabIndex = 26; + this.labelProduct.Text = "Subtitle Edit 3.2"; + // + // pictureBox1 + // + this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image"))); + this.pictureBox1.Location = new System.Drawing.Point(399, 14); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(70, 64); + this.pictureBox1.TabIndex = 27; + this.pictureBox1.TabStop = false; + // + // richTextBoxAbout1 + // + this.richTextBoxAbout1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.richTextBoxAbout1.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.richTextBoxAbout1.Location = new System.Drawing.Point(16, 43); + this.richTextBoxAbout1.Name = "richTextBoxAbout1"; + this.richTextBoxAbout1.ReadOnly = true; + this.richTextBoxAbout1.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.None; + this.richTextBoxAbout1.Size = new System.Drawing.Size(448, 266); + this.richTextBoxAbout1.TabIndex = 40; + this.richTextBoxAbout1.TabStop = false; + this.richTextBoxAbout1.Text = "About..."; + this.richTextBoxAbout1.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.RichTextBoxAbout1LinkClicked); + // + // buttonDonate + // + this.buttonDonate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonDonate.AutoSize = true; + this.buttonDonate.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.buttonDonate.FlatAppearance.BorderSize = 0; + this.buttonDonate.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.buttonDonate.ForeColor = System.Drawing.Color.Transparent; + this.buttonDonate.Image = global::Nikse.SubtitleEdit.Properties.Resources.Donate; + this.buttonDonate.Location = new System.Drawing.Point(16, 328); + this.buttonDonate.Name = "buttonDonate"; + this.buttonDonate.Size = new System.Drawing.Size(98, 32); + this.buttonDonate.TabIndex = 42; + this.buttonDonate.UseVisualStyleBackColor = false; + this.buttonDonate.Click += new System.EventHandler(this.buttonDonate_Click); + // + // linkLabelGitBuildHash + // + this.linkLabelGitBuildHash.AutoSize = true; + this.linkLabelGitBuildHash.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.linkLabelGitBuildHash.LinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(102)))), ((int)(((byte)(204))))); + this.linkLabelGitBuildHash.Location = new System.Drawing.Point(148, 15); + this.linkLabelGitBuildHash.Name = "linkLabelGitBuildHash"; + this.linkLabelGitBuildHash.Size = new System.Drawing.Size(90, 20); + this.linkLabelGitBuildHash.TabIndex = 43; + this.linkLabelGitBuildHash.TabStop = true; + this.linkLabelGitBuildHash.Text = "linkLabel1"; + this.linkLabelGitBuildHash.VisitedLinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(128)))), ((int)(((byte)(128)))), ((int)(((byte)(255))))); + this.linkLabelGitBuildHash.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabelGitBuildHash_LinkClicked); + // + // About + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(476, 372); + this.Controls.Add(this.linkLabelGitBuildHash); + this.Controls.Add(this.buttonDonate); + this.Controls.Add(this.okButton); + this.Controls.Add(this.pictureBox1); + this.Controls.Add(this.richTextBoxAbout1); + this.Controls.Add(this.labelProduct); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "About"; + this.Padding = new System.Windows.Forms.Padding(9); + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "About Subtitle Edit"; + this.Shown += new System.EventHandler(this.About_Shown); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.About_KeyDown); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.Label labelProduct; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.RichTextBox richTextBoxAbout1; + private System.Windows.Forms.Button buttonDonate; + private System.Windows.Forms.LinkLabel linkLabelGitBuildHash; + private System.Windows.Forms.ToolTip tooltip; + + } +} diff --git a/src/Forms/About.cs b/src/ui/Forms/About.cs similarity index 97% rename from src/Forms/About.cs rename to src/ui/Forms/About.cs index efc95d041..983b9e531 100644 --- a/src/Forms/About.cs +++ b/src/ui/Forms/About.cs @@ -1,121 +1,121 @@ -using Nikse.SubtitleEdit.Core; -using System; -using System.Diagnostics; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; -using Nikse.SubtitleEdit.Logic; - -namespace Nikse.SubtitleEdit.Forms -{ - partial class About : PositionAndSizeForm - { - private readonly LanguageStructure.About _language = Configuration.Settings.Language.About; - private readonly LanguageStructure.General _languageGeneral = Configuration.Settings.Language.General; - - public About() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - UiUtil.FixLargeFonts(this, okButton); - } - - public void Initialize() - { - Text = _language.Title + " - " + (IntPtr.Size * 8) + "-bit"; - okButton.Text = _languageGeneral.Ok; - string[] versionInfo = Utilities.AssemblyVersion.Split('.'); - string revisionNumber = "0"; - if (versionInfo.Length >= 4) - { - revisionNumber = versionInfo[3]; - } - - if (revisionNumber == "0" || revisionNumber == "1") // don't append build number for rev 0 - and also 1 in case first build goes wrong - { - labelProduct.Text = $"{_languageGeneral.Title} {versionInfo[0]}.{versionInfo[1]}.{versionInfo[2]}"; - linkLabelGitBuildHash.Hide(); - } - else - { - labelProduct.Text = $"{_languageGeneral.Title} {versionInfo[0]}.{versionInfo[1]}.{versionInfo[2]} NEXT, beta"; - linkLabelGitBuildHash.Left = labelProduct.Left + labelProduct.Width; - linkLabelGitBuildHash.Text = revisionNumber; - tooltip.SetToolTip(linkLabelGitBuildHash, GetGitHubHashLink()); - linkLabelGitBuildHash.Font = labelProduct.Font; - } - - string aboutText = _language.AboutText1.TrimEnd() + Environment.NewLine + - Environment.NewLine + - _languageGeneral.TranslatedBy.Trim(); - while (aboutText.Contains("\n ") || aboutText.Contains("\n\t")) - { - aboutText = aboutText.Replace("\n ", "\n"); - aboutText = aboutText.Replace("\n\t", "\n"); - } - richTextBoxAbout1.Text = aboutText; - - SetHeight(); - } - - private void SetHeight() - { - using (var g = CreateGraphics()) - { - double height = g.MeasureString(richTextBoxAbout1.Text, richTextBoxAbout1.Font).Height + 15; - richTextBoxAbout1.Height = (int)height; - Height = richTextBoxAbout1.Top + richTextBoxAbout1.Height + 90; - } - } - - private void OkButtonClick(object sender, EventArgs e) - { - DialogResult = DialogResult.OK; - } - - private void About_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - else if (e.KeyCode == UiUtil.HelpKeys) - { - Utilities.ShowHelp(null); - e.SuppressKeyPress = true; - } - } - - private void RichTextBoxAbout1LinkClicked(object sender, LinkClickedEventArgs e) - { - UiUtil.OpenURL(e.LinkText); - } - - private void buttonDonate_Click(object sender, EventArgs e) - { - UiUtil.OpenURL("https://www.nikse.dk/Donate"); - } - - private void linkLabelGitBuildHash_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) - { - UiUtil.OpenURL(GetGitHubHashLink()); - } - - private static string GetGitHubHashLink() - { - try - { - return "https://github.com/SubtitleEdit/subtitleedit/commit/" + Utilities.AssemblyDescription.Substring(0, 7); - } - catch - { - return "https://github.com/SubtitleEdit/subtitleedit"; - } - } - - private void About_Shown(object sender, EventArgs e) - { - SetHeight(); - } - } -} +using Nikse.SubtitleEdit.Core; +using System; +using System.Diagnostics; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Logic; + +namespace Nikse.SubtitleEdit.Forms +{ + partial class About : PositionAndSizeForm + { + private readonly LanguageStructure.About _language = Configuration.Settings.Language.About; + private readonly LanguageStructure.General _languageGeneral = Configuration.Settings.Language.General; + + public About() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + UiUtil.FixLargeFonts(this, okButton); + } + + public void Initialize() + { + Text = _language.Title + " - " + (IntPtr.Size * 8) + "-bit"; + okButton.Text = _languageGeneral.Ok; + string[] versionInfo = Utilities.AssemblyVersion.Split('.'); + string revisionNumber = "0"; + if (versionInfo.Length >= 4) + { + revisionNumber = versionInfo[3]; + } + + if (revisionNumber == "0" || revisionNumber == "1") // don't append build number for rev 0 - and also 1 in case first build goes wrong + { + labelProduct.Text = $"{_languageGeneral.Title} {versionInfo[0]}.{versionInfo[1]}.{versionInfo[2]}"; + linkLabelGitBuildHash.Hide(); + } + else + { + labelProduct.Text = $"{_languageGeneral.Title} {versionInfo[0]}.{versionInfo[1]}.{versionInfo[2]} NEXT, beta"; + linkLabelGitBuildHash.Left = labelProduct.Left + labelProduct.Width; + linkLabelGitBuildHash.Text = revisionNumber; + tooltip.SetToolTip(linkLabelGitBuildHash, GetGitHubHashLink()); + linkLabelGitBuildHash.Font = labelProduct.Font; + } + + string aboutText = _language.AboutText1.TrimEnd() + Environment.NewLine + + Environment.NewLine + + _languageGeneral.TranslatedBy.Trim(); + while (aboutText.Contains("\n ") || aboutText.Contains("\n\t")) + { + aboutText = aboutText.Replace("\n ", "\n"); + aboutText = aboutText.Replace("\n\t", "\n"); + } + richTextBoxAbout1.Text = aboutText; + + SetHeight(); + } + + private void SetHeight() + { + using (var g = CreateGraphics()) + { + double height = g.MeasureString(richTextBoxAbout1.Text, richTextBoxAbout1.Font).Height + 15; + richTextBoxAbout1.Height = (int)height; + Height = richTextBoxAbout1.Top + richTextBoxAbout1.Height + 90; + } + } + + private void OkButtonClick(object sender, EventArgs e) + { + DialogResult = DialogResult.OK; + } + + private void About_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + else if (e.KeyCode == UiUtil.HelpKeys) + { + Utilities.ShowHelp(null); + e.SuppressKeyPress = true; + } + } + + private void RichTextBoxAbout1LinkClicked(object sender, LinkClickedEventArgs e) + { + UiUtil.OpenURL(e.LinkText); + } + + private void buttonDonate_Click(object sender, EventArgs e) + { + UiUtil.OpenURL("https://www.nikse.dk/Donate"); + } + + private void linkLabelGitBuildHash_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + UiUtil.OpenURL(GetGitHubHashLink()); + } + + private static string GetGitHubHashLink() + { + try + { + return "https://github.com/SubtitleEdit/subtitleedit/commit/" + Utilities.AssemblyDescription.Substring(0, 7); + } + catch + { + return "https://github.com/SubtitleEdit/subtitleedit"; + } + } + + private void About_Shown(object sender, EventArgs e) + { + SetHeight(); + } + } +} diff --git a/src/Forms/About.resx b/src/ui/Forms/About.resx similarity index 98% rename from src/Forms/About.resx rename to src/ui/Forms/About.resx index 20f7a2beb..f0de7e340 100644 --- a/src/Forms/About.resx +++ b/src/ui/Forms/About.resx @@ -1,195 +1,195 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - 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 - gg== - - - - 17, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + 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 + gg== + + + + 17, 17 + \ No newline at end of file diff --git a/src/Forms/AddToNames.Designer.cs b/src/ui/Forms/AddToNames.Designer.cs similarity index 97% rename from src/Forms/AddToNames.Designer.cs rename to src/ui/Forms/AddToNames.Designer.cs index ffa58ce3c..b6c2364b3 100644 --- a/src/Forms/AddToNames.Designer.cs +++ b/src/ui/Forms/AddToNames.Designer.cs @@ -1,123 +1,123 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class AddToNameList - { - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.buttonOK = new System.Windows.Forms.Button(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.textBoxAddName = new System.Windows.Forms.TextBox(); - this.labelDescription = new System.Windows.Forms.Label(); - this.comboBoxDictionaries = new System.Windows.Forms.ComboBox(); - this.labelLanguage = new System.Windows.Forms.Label(); - this.SuspendLayout(); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(100, 127); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 2; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(181, 127); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 3; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - // - // textBoxAddName - // - this.textBoxAddName.Location = new System.Drawing.Point(15, 26); - this.textBoxAddName.Name = "textBoxAddName"; - this.textBoxAddName.Size = new System.Drawing.Size(221, 21); - this.textBoxAddName.TabIndex = 0; - // - // labelDescription - // - this.labelDescription.AutoSize = true; - this.labelDescription.Location = new System.Drawing.Point(12, 8); - this.labelDescription.Name = "labelDescription"; - this.labelDescription.Size = new System.Drawing.Size(196, 13); - this.labelDescription.TabIndex = 14; - this.labelDescription.Text = "Add to names/noise list (case sensitive)"; - // - // comboBoxDictionaries - // - this.comboBoxDictionaries.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxDictionaries.FormattingEnabled = true; - this.comboBoxDictionaries.Location = new System.Drawing.Point(15, 80); - this.comboBoxDictionaries.Name = "comboBoxDictionaries"; - this.comboBoxDictionaries.Size = new System.Drawing.Size(221, 21); - this.comboBoxDictionaries.TabIndex = 1; - // - // labelLanguage - // - this.labelLanguage.AutoSize = true; - this.labelLanguage.Location = new System.Drawing.Point(15, 64); - this.labelLanguage.Name = "labelLanguage"; - this.labelLanguage.Size = new System.Drawing.Size(54, 13); - this.labelLanguage.TabIndex = 18; - this.labelLanguage.Text = "Language"; - // - // AddToNameList - // - this.AcceptButton = this.buttonOK; - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CancelButton = this.buttonCancel; - this.ClientSize = new System.Drawing.Size(268, 162); - this.Controls.Add(this.comboBoxDictionaries); - this.Controls.Add(this.labelLanguage); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.textBoxAddName); - this.Controls.Add(this.labelDescription); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "AddToNameList"; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Add to Names List"; - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.TextBox textBoxAddName; - private System.Windows.Forms.Label labelDescription; - private System.Windows.Forms.ComboBox comboBoxDictionaries; - private System.Windows.Forms.Label labelLanguage; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class AddToNameList + { + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.buttonOK = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.textBoxAddName = new System.Windows.Forms.TextBox(); + this.labelDescription = new System.Windows.Forms.Label(); + this.comboBoxDictionaries = new System.Windows.Forms.ComboBox(); + this.labelLanguage = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(100, 127); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 2; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(181, 127); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 3; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + // + // textBoxAddName + // + this.textBoxAddName.Location = new System.Drawing.Point(15, 26); + this.textBoxAddName.Name = "textBoxAddName"; + this.textBoxAddName.Size = new System.Drawing.Size(221, 21); + this.textBoxAddName.TabIndex = 0; + // + // labelDescription + // + this.labelDescription.AutoSize = true; + this.labelDescription.Location = new System.Drawing.Point(12, 8); + this.labelDescription.Name = "labelDescription"; + this.labelDescription.Size = new System.Drawing.Size(196, 13); + this.labelDescription.TabIndex = 14; + this.labelDescription.Text = "Add to names/noise list (case sensitive)"; + // + // comboBoxDictionaries + // + this.comboBoxDictionaries.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxDictionaries.FormattingEnabled = true; + this.comboBoxDictionaries.Location = new System.Drawing.Point(15, 80); + this.comboBoxDictionaries.Name = "comboBoxDictionaries"; + this.comboBoxDictionaries.Size = new System.Drawing.Size(221, 21); + this.comboBoxDictionaries.TabIndex = 1; + // + // labelLanguage + // + this.labelLanguage.AutoSize = true; + this.labelLanguage.Location = new System.Drawing.Point(15, 64); + this.labelLanguage.Name = "labelLanguage"; + this.labelLanguage.Size = new System.Drawing.Size(54, 13); + this.labelLanguage.TabIndex = 18; + this.labelLanguage.Text = "Language"; + // + // AddToNameList + // + this.AcceptButton = this.buttonOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.buttonCancel; + this.ClientSize = new System.Drawing.Size(268, 162); + this.Controls.Add(this.comboBoxDictionaries); + this.Controls.Add(this.labelLanguage); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.textBoxAddName); + this.Controls.Add(this.labelDescription); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "AddToNameList"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Add to Names List"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.TextBox textBoxAddName; + private System.Windows.Forms.Label labelDescription; + private System.Windows.Forms.ComboBox comboBoxDictionaries; + private System.Windows.Forms.Label labelLanguage; + } } \ No newline at end of file diff --git a/src/Forms/AddToNames.cs b/src/ui/Forms/AddToNames.cs similarity index 97% rename from src/Forms/AddToNames.cs rename to src/ui/Forms/AddToNames.cs index f7af4faae..fafff3f67 100644 --- a/src/Forms/AddToNames.cs +++ b/src/ui/Forms/AddToNames.cs @@ -1,116 +1,116 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.Dictionaries; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class AddToNameList : PositionAndSizeForm - { - private Subtitle _subtitle; - - public AddToNameList() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - Text = Configuration.Settings.Language.AddToNames.Title; - labelDescription.Text = Configuration.Settings.Language.AddToNames.Description; - labelLanguage.Text = Configuration.Settings.Language.SpellCheck.Language; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - FixLargeFonts(); - } - - public string NewName { get; private set; } - - private void FixLargeFonts() - { - if (labelDescription.Left + labelDescription.Width + 5 > Width) - { - Width = labelDescription.Left + labelDescription.Width + 5; - } - - UiUtil.FixLargeFonts(this, buttonOK); - } - - public void Initialize(Subtitle subtitle, string text) - { - _subtitle = subtitle; - - if (!string.IsNullOrEmpty(text)) - { - textBoxAddName.Text = text.Trim().TrimEnd('.', '!', '?'); - if (textBoxAddName.Text.Length > 1) - { - textBoxAddName.Text = char.ToUpper(textBoxAddName.Text[0]) + textBoxAddName.Text.Substring(1); - } - } - - comboBoxDictionaries.Items.Clear(); - string languageName = LanguageAutoDetect.AutoDetectLanguageName(Configuration.Settings.General.SpellCheckLanguage, _subtitle); - int selIndex = -1; - var dictionaries = Utilities.GetDictionaryLanguagesCultureNeutral(); - for (var index = 0; index < dictionaries.Count; index++) - { - string name = dictionaries[index]; - comboBoxDictionaries.Items.Add(name); - if (selIndex == -1 && languageName.Length > 1 && name.Contains("[" + languageName.Substring(0, 2) + "]")) - { - selIndex = index; - } - } - comboBoxDictionaries.SelectedIndex = selIndex >= 0 ? selIndex : 0; - } - - internal void Initialize(Subtitle subtitle, string hunspellName, string text) - { - _subtitle = subtitle; - - if (!string.IsNullOrEmpty(text)) - { - textBoxAddName.Text = text.Trim().TrimEnd('.', '!', '?'); - if (textBoxAddName.Text.Length > 1) - { - textBoxAddName.Text = char.ToUpper(textBoxAddName.Text[0]) + textBoxAddName.Text.Substring(1); - } - } - - comboBoxDictionaries.Items.Clear(); - foreach (string name in Utilities.GetDictionaryLanguages()) - { - comboBoxDictionaries.Items.Add(name); - if (hunspellName != null && name.Equals(hunspellName, StringComparison.OrdinalIgnoreCase)) - { - comboBoxDictionaries.SelectedIndex = comboBoxDictionaries.Items.Count - 1; - } - } - } - - private void ButtonOkClick(object sender, EventArgs e) - { - if (string.IsNullOrWhiteSpace(textBoxAddName.Text) || comboBoxDictionaries.SelectedIndex < 0) - { - return; - } - - NewName = textBoxAddName.Text.RemoveControlCharacters().Trim(); - string languageName; - try - { - languageName = comboBoxDictionaries.Items[comboBoxDictionaries.SelectedIndex].ToString(); - languageName = languageName.Substring(languageName.LastIndexOf("[", StringComparison.Ordinal)).TrimStart('[').TrimEnd(']'); - } - catch - { - languageName = "en"; - } - - var nameList = new NameList(Configuration.DictionariesDirectory, languageName, Configuration.Settings.WordLists.UseOnlineNames, Configuration.Settings.WordLists.NamesUrl); - DialogResult = nameList.Add(textBoxAddName.Text) ? DialogResult.OK : DialogResult.Cancel; - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.Dictionaries; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class AddToNameList : PositionAndSizeForm + { + private Subtitle _subtitle; + + public AddToNameList() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + Text = Configuration.Settings.Language.AddToNames.Title; + labelDescription.Text = Configuration.Settings.Language.AddToNames.Description; + labelLanguage.Text = Configuration.Settings.Language.SpellCheck.Language; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + FixLargeFonts(); + } + + public string NewName { get; private set; } + + private void FixLargeFonts() + { + if (labelDescription.Left + labelDescription.Width + 5 > Width) + { + Width = labelDescription.Left + labelDescription.Width + 5; + } + + UiUtil.FixLargeFonts(this, buttonOK); + } + + public void Initialize(Subtitle subtitle, string text) + { + _subtitle = subtitle; + + if (!string.IsNullOrEmpty(text)) + { + textBoxAddName.Text = text.Trim().TrimEnd('.', '!', '?'); + if (textBoxAddName.Text.Length > 1) + { + textBoxAddName.Text = char.ToUpper(textBoxAddName.Text[0]) + textBoxAddName.Text.Substring(1); + } + } + + comboBoxDictionaries.Items.Clear(); + string languageName = LanguageAutoDetect.AutoDetectLanguageName(Configuration.Settings.General.SpellCheckLanguage, _subtitle); + int selIndex = -1; + var dictionaries = Utilities.GetDictionaryLanguagesCultureNeutral(); + for (var index = 0; index < dictionaries.Count; index++) + { + string name = dictionaries[index]; + comboBoxDictionaries.Items.Add(name); + if (selIndex == -1 && languageName.Length > 1 && name.Contains("[" + languageName.Substring(0, 2) + "]")) + { + selIndex = index; + } + } + comboBoxDictionaries.SelectedIndex = selIndex >= 0 ? selIndex : 0; + } + + internal void Initialize(Subtitle subtitle, string hunspellName, string text) + { + _subtitle = subtitle; + + if (!string.IsNullOrEmpty(text)) + { + textBoxAddName.Text = text.Trim().TrimEnd('.', '!', '?'); + if (textBoxAddName.Text.Length > 1) + { + textBoxAddName.Text = char.ToUpper(textBoxAddName.Text[0]) + textBoxAddName.Text.Substring(1); + } + } + + comboBoxDictionaries.Items.Clear(); + foreach (string name in Utilities.GetDictionaryLanguages()) + { + comboBoxDictionaries.Items.Add(name); + if (hunspellName != null && name.Equals(hunspellName, StringComparison.OrdinalIgnoreCase)) + { + comboBoxDictionaries.SelectedIndex = comboBoxDictionaries.Items.Count - 1; + } + } + } + + private void ButtonOkClick(object sender, EventArgs e) + { + if (string.IsNullOrWhiteSpace(textBoxAddName.Text) || comboBoxDictionaries.SelectedIndex < 0) + { + return; + } + + NewName = textBoxAddName.Text.RemoveControlCharacters().Trim(); + string languageName; + try + { + languageName = comboBoxDictionaries.Items[comboBoxDictionaries.SelectedIndex].ToString(); + languageName = languageName.Substring(languageName.LastIndexOf("[", StringComparison.Ordinal)).TrimStart('[').TrimEnd(']'); + } + catch + { + languageName = "en"; + } + + var nameList = new NameList(Configuration.DictionariesDirectory, languageName, Configuration.Settings.WordLists.UseOnlineNames, Configuration.Settings.WordLists.NamesUrl); + DialogResult = nameList.Add(textBoxAddName.Text) ? DialogResult.OK : DialogResult.Cancel; + } + + } +} diff --git a/src/Forms/AlignmentPickerJapanese.resx b/src/ui/Forms/AddToNames.resx similarity index 100% rename from src/Forms/AlignmentPickerJapanese.resx rename to src/ui/Forms/AddToNames.resx diff --git a/src/Forms/AddToUserDic.Designer.cs b/src/ui/Forms/AddToUserDic.Designer.cs similarity index 97% rename from src/Forms/AddToUserDic.Designer.cs rename to src/ui/Forms/AddToUserDic.Designer.cs index ecc77e652..83cc4a51f 100644 --- a/src/Forms/AddToUserDic.Designer.cs +++ b/src/ui/Forms/AddToUserDic.Designer.cs @@ -1,133 +1,133 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class AddToUserDic - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.buttonOK = new System.Windows.Forms.Button(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.comboBoxDictionaries = new System.Windows.Forms.ComboBox(); - this.labelLanguage = new System.Windows.Forms.Label(); - this.textBoxAddName = new System.Windows.Forms.TextBox(); - this.labelDescription = new System.Windows.Forms.Label(); - this.SuspendLayout(); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(80, 127); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 4; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(161, 127); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 5; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // comboBoxDictionaries - // - this.comboBoxDictionaries.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxDictionaries.FormattingEnabled = true; - this.comboBoxDictionaries.Location = new System.Drawing.Point(15, 90); - this.comboBoxDictionaries.Name = "comboBoxDictionaries"; - this.comboBoxDictionaries.Size = new System.Drawing.Size(221, 21); - this.comboBoxDictionaries.TabIndex = 20; - // - // labelLanguage - // - this.labelLanguage.AutoSize = true; - this.labelLanguage.Location = new System.Drawing.Point(12, 74); - this.labelLanguage.Name = "labelLanguage"; - this.labelLanguage.Size = new System.Drawing.Size(55, 13); - this.labelLanguage.TabIndex = 22; - this.labelLanguage.Text = "Language"; - // - // textBoxAddName - // - this.textBoxAddName.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.textBoxAddName.Location = new System.Drawing.Point(15, 36); - this.textBoxAddName.Name = "textBoxAddName"; - this.textBoxAddName.Size = new System.Drawing.Size(221, 21); - this.textBoxAddName.TabIndex = 19; - // - // labelDescription - // - this.labelDescription.AutoSize = true; - this.labelDescription.Location = new System.Drawing.Point(12, 18); - this.labelDescription.Name = "labelDescription"; - this.labelDescription.Size = new System.Drawing.Size(109, 13); - this.labelDescription.TabIndex = 21; - this.labelDescription.Text = "Add to user dictionary"; - // - // AddToUserDic - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(248, 160); - this.Controls.Add(this.comboBoxDictionaries); - this.Controls.Add(this.labelLanguage); - this.Controls.Add(this.textBoxAddName); - this.Controls.Add(this.labelDescription); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.buttonCancel); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "AddToUserDic"; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "AddToUserDic"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.AddToUserDic_KeyDown); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.ComboBox comboBoxDictionaries; - private System.Windows.Forms.Label labelLanguage; - private System.Windows.Forms.TextBox textBoxAddName; - private System.Windows.Forms.Label labelDescription; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class AddToUserDic + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.buttonOK = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.comboBoxDictionaries = new System.Windows.Forms.ComboBox(); + this.labelLanguage = new System.Windows.Forms.Label(); + this.textBoxAddName = new System.Windows.Forms.TextBox(); + this.labelDescription = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(80, 127); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 4; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(161, 127); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 5; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // comboBoxDictionaries + // + this.comboBoxDictionaries.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxDictionaries.FormattingEnabled = true; + this.comboBoxDictionaries.Location = new System.Drawing.Point(15, 90); + this.comboBoxDictionaries.Name = "comboBoxDictionaries"; + this.comboBoxDictionaries.Size = new System.Drawing.Size(221, 21); + this.comboBoxDictionaries.TabIndex = 20; + // + // labelLanguage + // + this.labelLanguage.AutoSize = true; + this.labelLanguage.Location = new System.Drawing.Point(12, 74); + this.labelLanguage.Name = "labelLanguage"; + this.labelLanguage.Size = new System.Drawing.Size(55, 13); + this.labelLanguage.TabIndex = 22; + this.labelLanguage.Text = "Language"; + // + // textBoxAddName + // + this.textBoxAddName.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.textBoxAddName.Location = new System.Drawing.Point(15, 36); + this.textBoxAddName.Name = "textBoxAddName"; + this.textBoxAddName.Size = new System.Drawing.Size(221, 21); + this.textBoxAddName.TabIndex = 19; + // + // labelDescription + // + this.labelDescription.AutoSize = true; + this.labelDescription.Location = new System.Drawing.Point(12, 18); + this.labelDescription.Name = "labelDescription"; + this.labelDescription.Size = new System.Drawing.Size(109, 13); + this.labelDescription.TabIndex = 21; + this.labelDescription.Text = "Add to user dictionary"; + // + // AddToUserDic + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(248, 160); + this.Controls.Add(this.comboBoxDictionaries); + this.Controls.Add(this.labelLanguage); + this.Controls.Add(this.textBoxAddName); + this.Controls.Add(this.labelDescription); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.buttonCancel); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "AddToUserDic"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "AddToUserDic"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.AddToUserDic_KeyDown); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.ComboBox comboBoxDictionaries; + private System.Windows.Forms.Label labelLanguage; + private System.Windows.Forms.TextBox textBoxAddName; + private System.Windows.Forms.Label labelDescription; + } } \ No newline at end of file diff --git a/src/Forms/AddToUserDic.cs b/src/ui/Forms/AddToUserDic.cs similarity index 97% rename from src/Forms/AddToUserDic.cs rename to src/ui/Forms/AddToUserDic.cs index 46ac55f86..5d3a19dd0 100644 --- a/src/Forms/AddToUserDic.cs +++ b/src/ui/Forms/AddToUserDic.cs @@ -1,90 +1,90 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class AddToUserDic : Form - { - public AddToUserDic() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - Text = Configuration.Settings.Language.AddToUserDictionary.Title; - labelDescription.Text = Configuration.Settings.Language.AddToUserDictionary.Description; - labelLanguage.Text = Configuration.Settings.General.Language; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - UiUtil.FixLargeFonts(this, buttonOK); - } - - private void AddToUserDic_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private void buttonOK_Click(object sender, EventArgs e) - { - NewWord = textBoxAddName.Text.RemoveControlCharacters().Trim().ToLowerInvariant(); - if (NewWord.Length == 0) - { - DialogResult = DialogResult.Cancel; - return; - } - - string language = comboBoxDictionaries.Text; - if (language.IndexOf('[') >= 0) - { - language = language.Substring(language.IndexOf('[')).TrimStart('['); - } - - if (language.IndexOf(']') > 0) - { - language = language.Substring(0, language.IndexOf(']')); - } - - var userWordList = new List(); - - Utilities.LoadUserWordList(userWordList, language); - if (!string.IsNullOrEmpty(language) && NewWord.Length > 0 && !userWordList.Contains(NewWord)) - { - Utilities.AddToUserDictionary(NewWord, language); - DialogResult = DialogResult.OK; - return; - } - DialogResult = DialogResult.Cancel; - } - - internal void Initialize(string hunspellName, string text) - { - if (!string.IsNullOrEmpty(text)) - { - textBoxAddName.Text = text.Trim().TrimEnd('.', '!', '?'); - } - - comboBoxDictionaries.Items.Clear(); - foreach (string name in Utilities.GetDictionaryLanguages()) - { - comboBoxDictionaries.Items.Add(name); - if (hunspellName != null && name.Equals(hunspellName, StringComparison.OrdinalIgnoreCase)) - { - comboBoxDictionaries.SelectedIndex = comboBoxDictionaries.Items.Count - 1; - } - } - } - - public string NewWord { get; private set; } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class AddToUserDic : Form + { + public AddToUserDic() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + Text = Configuration.Settings.Language.AddToUserDictionary.Title; + labelDescription.Text = Configuration.Settings.Language.AddToUserDictionary.Description; + labelLanguage.Text = Configuration.Settings.General.Language; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + UiUtil.FixLargeFonts(this, buttonOK); + } + + private void AddToUserDic_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void buttonOK_Click(object sender, EventArgs e) + { + NewWord = textBoxAddName.Text.RemoveControlCharacters().Trim().ToLowerInvariant(); + if (NewWord.Length == 0) + { + DialogResult = DialogResult.Cancel; + return; + } + + string language = comboBoxDictionaries.Text; + if (language.IndexOf('[') >= 0) + { + language = language.Substring(language.IndexOf('[')).TrimStart('['); + } + + if (language.IndexOf(']') > 0) + { + language = language.Substring(0, language.IndexOf(']')); + } + + var userWordList = new List(); + + Utilities.LoadUserWordList(userWordList, language); + if (!string.IsNullOrEmpty(language) && NewWord.Length > 0 && !userWordList.Contains(NewWord)) + { + Utilities.AddToUserDictionary(NewWord, language); + DialogResult = DialogResult.OK; + return; + } + DialogResult = DialogResult.Cancel; + } + + internal void Initialize(string hunspellName, string text) + { + if (!string.IsNullOrEmpty(text)) + { + textBoxAddName.Text = text.Trim().TrimEnd('.', '!', '?'); + } + + comboBoxDictionaries.Items.Clear(); + foreach (string name in Utilities.GetDictionaryLanguages()) + { + comboBoxDictionaries.Items.Add(name); + if (hunspellName != null && name.Equals(hunspellName, StringComparison.OrdinalIgnoreCase)) + { + comboBoxDictionaries.SelectedIndex = comboBoxDictionaries.Items.Count - 1; + } + } + } + + public string NewWord { get; private set; } + } +} diff --git a/src/Forms/AudioToText.resx b/src/ui/Forms/AddToUserDic.resx similarity index 100% rename from src/Forms/AudioToText.resx rename to src/ui/Forms/AddToUserDic.resx diff --git a/src/Forms/AddWaveform.Designer.cs b/src/ui/Forms/AddWaveform.Designer.cs similarity index 100% rename from src/Forms/AddWaveform.Designer.cs rename to src/ui/Forms/AddWaveform.Designer.cs diff --git a/src/Forms/AddWaveform.cs b/src/ui/Forms/AddWaveform.cs similarity index 97% rename from src/Forms/AddWaveform.cs rename to src/ui/Forms/AddWaveform.cs index 82b7779de..c7ae1d688 100644 --- a/src/Forms/AddWaveform.cs +++ b/src/ui/Forms/AddWaveform.cs @@ -1,491 +1,491 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.ContainerFormats.Matroska; -using Nikse.SubtitleEdit.Core.ContainerFormats.Mp4; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Drawing; -using System.Globalization; -using System.IO; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; -using Nikse.SubtitleEdit.Logic; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class AddWaveform : Form - { - public int AudioTrackNumber { get; set; } = -1; - public string SourceVideoFileName { get; private set; } - private bool _cancel; - private string _peakWaveFileName; - private string _wavFileName; - private string _spectrogramDirectory; - public WavePeakData Peaks { get; private set; } - public SpectrogramData Spectrogram { get; private set; } - private string _encodeParameters; - private const string RetryEncodeParameters = "acodec=s16l"; - private int _delayInMilliseconds; - private int _numberOfAudioTracks; - - public AddWaveform() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - labelProgress.Text = string.Empty; - buttonCancel.Visible = false; - labelInfo.Text = string.Empty; - UiUtil.FixLargeFonts(this, buttonCancel); - } - - public void Initialize(string videoFile, string peakWaveFileName, string spectrogramDirectory, int audioTrackNumber) - { - _peakWaveFileName = peakWaveFileName; - AudioTrackNumber = audioTrackNumber; - if (AudioTrackNumber < 0) - { - AudioTrackNumber = 0; - } - - Text = Configuration.Settings.Language.AddWaveform.Title; - buttonRipWave.Text = Configuration.Settings.Language.AddWaveform.GenerateWaveformData; - labelPleaseWait.Text = Configuration.Settings.Language.AddWaveform.PleaseWait; - labelVideoFileName.Text = videoFile; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - labelSourcevideoFile.Text = Configuration.Settings.Language.AddWaveform.SourceVideoFile; - _spectrogramDirectory = spectrogramDirectory; - _encodeParameters = Configuration.Settings.General.VlcWaveTranscodeSettings; - } - - public static Process GetCommandLineProcess(string inputVideoFile, int audioTrackNumber, string outWaveFile, string encodeParamters, out string encoderName) - { - encoderName = "VLC"; - string parameters = "\"" + inputVideoFile + "\" -I dummy -vvv --no-random --no-repeat --no-loop --no-sout-video --audio-track-id=" + audioTrackNumber + " --sout=\"#transcode{acodec=s16l,channels=1,ab=128,audio-track-id=" + audioTrackNumber + "}:std{access=file,mux=wav,dst=" + outWaveFile + "}\" vlc://quit"; - string exeFilePath; - if (Configuration.IsRunningOnLinux) - { - exeFilePath = "cvlc"; - parameters = "-vvv --no-random --no-repeat --no-loop --no-sout-video --audio-track-id=" + audioTrackNumber + " --sout '#transcode{" + encodeParamters + ",audio-track-id=" + audioTrackNumber + "}:std{mux=wav,access=file,dst=" + outWaveFile + "}' \"" + inputVideoFile + "\" vlc://quit"; - } - else if (Configuration.IsRunningOnMac) - { - exeFilePath = "VLC.app/Contents/MacOS/VLC"; - } - else // windows - { - exeFilePath = Logic.VideoPlayers.LibVlcDynamic.GetVlcPath("vlc.exe"); - if (!File.Exists(exeFilePath)) - { - if (Configuration.Settings.General.UseFFmpegForWaveExtraction && File.Exists(Configuration.Settings.General.FFmpegLocation)) - { - // We will run FFmpeg - } - else - { - throw new DllNotFoundException("NO_VLC"); - } - } - } - - if (Configuration.Settings.General.UseFFmpegForWaveExtraction && (File.Exists(Configuration.Settings.General.FFmpegLocation)) || !Configuration.IsRunningOnWindows) - { - encoderName = "FFmpeg"; - string audioParameter = string.Empty; - if (audioTrackNumber > 0) - { - audioParameter = $"-map 0:a:{audioTrackNumber}"; - } - - const string fFmpegWaveTranscodeSettings = "-i \"{0}\" -vn -ar 24000 -ac 2 -ab 128 -vol 448 -f wav {2} \"{1}\""; - //-i indicates the input - //-vn means no video ouput - //-ar 44100 indicates the sampling frequency. - //-ab indicates the bit rate (in this example 160kb/s) - //-vol 448 will boot volume... 256 is normal - //-ac 2 means 2 channels - - // "-map 0:a:0" is the first audio stream, "-map 0:a:1" is the second audio stream - - exeFilePath = Configuration.Settings.General.FFmpegLocation; - if (!Configuration.IsRunningOnWindows) - { - exeFilePath = "ffmpeg"; - } - parameters = string.Format(fFmpegWaveTranscodeSettings, inputVideoFile, outWaveFile, audioParameter); - } - return new Process { StartInfo = new ProcessStartInfo(exeFilePath, parameters) { WindowStyle = ProcessWindowStyle.Hidden } }; - } - - private void buttonRipWave_Click(object sender, EventArgs e) - { - buttonRipWave.Enabled = false; - _cancel = false; - SourceVideoFileName = labelVideoFileName.Text; - string targetFile = Path.Combine(Path.GetTempPath(), Guid.NewGuid() + ".wav"); - string targetDriveLetter = null; - if (Configuration.IsRunningOnWindows) - { - var root = Path.GetPathRoot(targetFile); - if (root.Length > 1 && root[1] == ':') - { - targetDriveLetter = root.Remove(1); - } - } - - labelPleaseWait.Visible = true; - string encoderName; - Process process; - try - { - process = GetCommandLineProcess(SourceVideoFileName, AudioTrackNumber, targetFile, _encodeParameters, out encoderName); - labelInfo.Text = encoderName; - } - catch (DllNotFoundException) - { - if (MessageBox.Show(Configuration.Settings.Language.AddWaveform.VlcMediaPlayerNotFound + Environment.NewLine + - Environment.NewLine + Configuration.Settings.Language.AddWaveform.GoToVlcMediaPlayerHomePage, - Configuration.Settings.Language.AddWaveform.VlcMediaPlayerNotFoundTitle, - MessageBoxButtons.YesNo) == DialogResult.Yes) - { - UiUtil.OpenURL("http://www.videolan.org/"); - } - buttonRipWave.Enabled = true; - return; - } - - process.Start(); - progressBar1.Style = ProgressBarStyle.Marquee; - progressBar1.Visible = true; - double seconds = 0; - buttonCancel.Visible = true; - try - { - process.PriorityClass = ProcessPriorityClass.Normal; - } - catch - { - // ignored - } - - while (!process.HasExited) - { - Application.DoEvents(); - System.Threading.Thread.Sleep(100); - seconds += 0.1; - if (seconds < 60) - { - labelProgress.Text = string.Format(Configuration.Settings.Language.AddWaveform.ExtractingSeconds, seconds); - } - else - { - labelProgress.Text = string.Format(Configuration.Settings.Language.AddWaveform.ExtractingMinutes, (int)(seconds / 60), (int)(seconds % 60)); - } - - Refresh(); - if (_cancel) - { - process.Kill(); - progressBar1.Visible = false; - labelPleaseWait.Visible = false; - buttonRipWave.Enabled = true; - buttonCancel.Visible = false; - DialogResult = DialogResult.Cancel; - return; - } - - if (targetDriveLetter != null && seconds > 1 && Convert.ToInt32(seconds) % 10 == 0) - { - try - { - var drive = new DriveInfo(targetDriveLetter); - if (drive.IsReady) - { - if (drive.AvailableFreeSpace < 50 * 1000000) // 50 mb - { - labelInfo.ForeColor = Color.Red; - labelInfo.Text = Configuration.Settings.Language.AddWaveform.LowDiskSpace; - } - else if (labelInfo.ForeColor == Color.Red) - { - labelInfo.Text = string.Format(Configuration.Settings.Language.AddWaveform.FreeDiskSpace, Utilities.FormatBytesToDisplayFileSize(drive.AvailableFreeSpace)); - } - } - } - catch - { - // ignored - } - } - } - buttonCancel.Visible = false; - progressBar1.Visible = false; - progressBar1.Style = ProgressBarStyle.Blocks; - process.Dispose(); - - var targetFileInfo = new FileInfo(targetFile); - if (!targetFileInfo.Exists) - { - if (_encodeParameters != RetryEncodeParameters) - { - _encodeParameters = RetryEncodeParameters; - buttonRipWave_Click(null, null); - return; - } - - if (_numberOfAudioTracks == 0 && MessageBox.Show(Configuration.Settings.Language.AddWaveform.NoAudioTracksFoundGenerateEmptyWaveform, Configuration.Settings.Language.General.Title, MessageBoxButtons.YesNoCancel) == DialogResult.Yes) - { - MakeEmptyWaveFile(); - DialogResult = DialogResult.OK; - return; - } - - MessageBox.Show(string.Format(Configuration.Settings.Language.AddWaveform.WaveFileNotFound, IntPtr.Size * 8, process.StartInfo.FileName, process.StartInfo.Arguments)); - - labelPleaseWait.Visible = false; - labelProgress.Text = string.Empty; - buttonRipWave.Enabled = true; - return; - } - - if (targetFileInfo.Length <= 200) - { - if (_numberOfAudioTracks == 0 && MessageBox.Show(Configuration.Settings.Language.AddWaveform.NoAudioTracksFoundGenerateEmptyWaveform, Configuration.Settings.Language.General.Title, MessageBoxButtons.YesNoCancel) == DialogResult.Yes) - { - MakeEmptyWaveFile(); - DialogResult = DialogResult.OK; - return; - } - - MessageBox.Show(string.Format(Configuration.Settings.Language.AddWaveform.WaveFileMalformed, encoderName, process.StartInfo.FileName, process.StartInfo.Arguments)); - - labelPleaseWait.Visible = false; - labelProgress.Text = string.Empty; - buttonRipWave.Enabled = true; - return; - } - - ReadWaveFile(targetFile, _delayInMilliseconds); - labelProgress.Text = string.Empty; - File.Delete(targetFile); - DialogResult = DialogResult.OK; - } - - private void ReadWaveFile(string targetFile, int delayInMilliseconds) - { - labelProgress.Text = Configuration.Settings.Language.AddWaveform.GeneratingPeakFile; - Refresh(); - - using (var waveFile = new WavePeakGenerator(targetFile)) - { - Peaks = waveFile.GeneratePeaks(delayInMilliseconds, _peakWaveFileName); - - if (Configuration.Settings.VideoControls.GenerateSpectrogram) - { - labelProgress.Text = Configuration.Settings.Language.AddWaveform.GeneratingSpectrogram; - Refresh(); - Spectrogram = waveFile.GenerateSpectrogram(delayInMilliseconds, _spectrogramDirectory); - } - } - - labelPleaseWait.Visible = false; - } - - private void MakeEmptyWaveFile() - { - labelProgress.Text = Configuration.Settings.Language.AddWaveform.GeneratingPeakFile; - Refresh(); - var videoInfo = UiUtil.GetVideoInfo(SourceVideoFileName); - Peaks = WavePeakGenerator.GenerateEmptyPeaks(_peakWaveFileName, (int)videoInfo.TotalMilliseconds / 1000); - labelPleaseWait.Visible = false; - } - - private void AddWaveform_Shown(object sender, EventArgs e) - { - Refresh(); - _numberOfAudioTracks = 0; - var audioTrackNames = new List(); - var mkvAudioTrackNumbers = new Dictionary(); - if (labelVideoFileName.Text.Length > 1 && File.Exists(labelVideoFileName.Text)) - { - if (labelVideoFileName.Text.EndsWith(".mkv", StringComparison.OrdinalIgnoreCase)) - { // Choose for number of audio tracks in matroska files - MatroskaFile matroska = null; - try - { - matroska = new MatroskaFile(labelVideoFileName.Text); - if (matroska.IsValid) - { - foreach (var track in matroska.GetTracks()) - { - if (track.IsAudio) - { - _numberOfAudioTracks++; - if (track.CodecId != null && track.Language != null) - { - audioTrackNames.Add("#" + track.TrackNumber + ": " + track.CodecId.Replace("\0", string.Empty) + " - " + track.Language.Replace("\0", string.Empty)); - } - else - { - audioTrackNames.Add("#" + track.TrackNumber); - } - - mkvAudioTrackNumbers.Add(mkvAudioTrackNumbers.Count, track.TrackNumber); - } - } - } - } - finally - { - matroska?.Dispose(); - } - } - else if (labelVideoFileName.Text.EndsWith(".mp4", StringComparison.OrdinalIgnoreCase) || labelVideoFileName.Text.EndsWith(".m4v", StringComparison.OrdinalIgnoreCase)) - { // Choose for number of audio tracks in mp4 files - try - { - var mp4 = new MP4Parser(labelVideoFileName.Text); - var tracks = mp4.GetAudioTracks(); - int i = 0; - foreach (var track in tracks) - { - i++; - if (track.Name != null && track.Mdia != null && track.Mdia.Mdhd != null && track.Mdia.Mdhd.LanguageString != null) - { - audioTrackNames.Add(i + ": " + track.Name + " - " + track.Mdia.Mdhd.LanguageString); - } - else if (track.Name != null) - { - audioTrackNames.Add(i + ": " + track.Name); - } - else - { - audioTrackNames.Add(i.ToString(CultureInfo.InvariantCulture)); - } - } - _numberOfAudioTracks = tracks.Count; - } - catch - { - // ignored - } - } - - // Choose audio track - if (_numberOfAudioTracks > 1) - { - using (var form = new ChooseAudioTrack(audioTrackNames, AudioTrackNumber)) - { - if (form.ShowDialog(this) == DialogResult.OK) - { - if (AudioTrackNumber != form.SelectedTrack) - { - AudioTrackNumber = form.SelectedTrack; - - var peakWaveFileName = WavePeakGenerator.GetPeakWaveFileName(labelVideoFileName.Text, form.SelectedTrack); - var spectrogramFolder = WavePeakGenerator.SpectrogramDrawer.GetSpectrogramFolder(labelVideoFileName.Text, form.SelectedTrack); - if (File.Exists(peakWaveFileName)) - { - DialogResult = DialogResult.Cancel; - return; - } - - _peakWaveFileName = peakWaveFileName; - _spectrogramDirectory = spectrogramFolder; - } - } - else - { - DialogResult = DialogResult.Cancel; - return; - } - } - } - - // check for delay in matroska files - if (labelVideoFileName.Text.EndsWith(".mkv", StringComparison.OrdinalIgnoreCase)) - { - MatroskaFile matroska = null; - try - { - matroska = new MatroskaFile(labelVideoFileName.Text); - if (matroska.IsValid) - { - _delayInMilliseconds = (int)matroska.GetAudioTrackDelayMilliseconds(mkvAudioTrackNumbers[AudioTrackNumber]); - } - } - catch (Exception exception) - { - SeLogger.Error(exception, $"Error getting delay from mkv: {labelVideoFileName.Text}"); - _delayInMilliseconds = 0; - } - finally - { - matroska?.Dispose(); - } - } - - buttonRipWave_Click(null, null); - } - else if (_wavFileName != null) - { - FixWaveOnly(); - } - } - - private void AddWaveform_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - else if (e.KeyCode == UiUtil.HelpKeys) - { - Utilities.ShowHelp("#waveform"); - e.SuppressKeyPress = true; - } - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - _cancel = true; - } - - internal void InitializeViaWaveFile(string fileName, string peakWaveFileName, string spectrogramFolder) - { - _peakWaveFileName = peakWaveFileName; - _wavFileName = fileName; - _spectrogramDirectory = spectrogramFolder; - } - - private void FixWaveOnly() - { - Text = Configuration.Settings.Language.AddWaveform.Title; - buttonRipWave.Text = Configuration.Settings.Language.AddWaveform.GenerateWaveformData; - labelPleaseWait.Text = Configuration.Settings.Language.AddWaveform.PleaseWait; - labelVideoFileName.Text = string.Empty; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - buttonRipWave.Enabled = false; - _cancel = false; - buttonCancel.Visible = false; - progressBar1.Visible = false; - progressBar1.Style = ProgressBarStyle.Blocks; - - labelProgress.Text = Configuration.Settings.Language.AddWaveform.GeneratingPeakFile; - Refresh(); - labelPleaseWait.Visible = false; - try - { - ReadWaveFile(_wavFileName, _delayInMilliseconds); - labelProgress.Text = string.Empty; - DialogResult = DialogResult.OK; - } - catch (Exception exception) - { - MessageBox.Show(exception.Message + Environment.NewLine + exception.StackTrace); - DialogResult = DialogResult.Cancel; - } - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.ContainerFormats.Matroska; +using Nikse.SubtitleEdit.Core.ContainerFormats.Mp4; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Globalization; +using System.IO; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Logic; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class AddWaveform : Form + { + public int AudioTrackNumber { get; set; } = -1; + public string SourceVideoFileName { get; private set; } + private bool _cancel; + private string _peakWaveFileName; + private string _wavFileName; + private string _spectrogramDirectory; + public WavePeakData Peaks { get; private set; } + public SpectrogramData Spectrogram { get; private set; } + private string _encodeParameters; + private const string RetryEncodeParameters = "acodec=s16l"; + private int _delayInMilliseconds; + private int _numberOfAudioTracks; + + public AddWaveform() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + labelProgress.Text = string.Empty; + buttonCancel.Visible = false; + labelInfo.Text = string.Empty; + UiUtil.FixLargeFonts(this, buttonCancel); + } + + public void Initialize(string videoFile, string peakWaveFileName, string spectrogramDirectory, int audioTrackNumber) + { + _peakWaveFileName = peakWaveFileName; + AudioTrackNumber = audioTrackNumber; + if (AudioTrackNumber < 0) + { + AudioTrackNumber = 0; + } + + Text = Configuration.Settings.Language.AddWaveform.Title; + buttonRipWave.Text = Configuration.Settings.Language.AddWaveform.GenerateWaveformData; + labelPleaseWait.Text = Configuration.Settings.Language.AddWaveform.PleaseWait; + labelVideoFileName.Text = videoFile; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + labelSourcevideoFile.Text = Configuration.Settings.Language.AddWaveform.SourceVideoFile; + _spectrogramDirectory = spectrogramDirectory; + _encodeParameters = Configuration.Settings.General.VlcWaveTranscodeSettings; + } + + public static Process GetCommandLineProcess(string inputVideoFile, int audioTrackNumber, string outWaveFile, string encodeParamters, out string encoderName) + { + encoderName = "VLC"; + string parameters = "\"" + inputVideoFile + "\" -I dummy -vvv --no-random --no-repeat --no-loop --no-sout-video --audio-track-id=" + audioTrackNumber + " --sout=\"#transcode{acodec=s16l,channels=1,ab=128,audio-track-id=" + audioTrackNumber + "}:std{access=file,mux=wav,dst=" + outWaveFile + "}\" vlc://quit"; + string exeFilePath; + if (Configuration.IsRunningOnLinux) + { + exeFilePath = "cvlc"; + parameters = "-vvv --no-random --no-repeat --no-loop --no-sout-video --audio-track-id=" + audioTrackNumber + " --sout '#transcode{" + encodeParamters + ",audio-track-id=" + audioTrackNumber + "}:std{mux=wav,access=file,dst=" + outWaveFile + "}' \"" + inputVideoFile + "\" vlc://quit"; + } + else if (Configuration.IsRunningOnMac) + { + exeFilePath = "VLC.app/Contents/MacOS/VLC"; + } + else // windows + { + exeFilePath = Logic.VideoPlayers.LibVlcDynamic.GetVlcPath("vlc.exe"); + if (!File.Exists(exeFilePath)) + { + if (Configuration.Settings.General.UseFFmpegForWaveExtraction && File.Exists(Configuration.Settings.General.FFmpegLocation)) + { + // We will run FFmpeg + } + else + { + throw new DllNotFoundException("NO_VLC"); + } + } + } + + if (Configuration.Settings.General.UseFFmpegForWaveExtraction && (File.Exists(Configuration.Settings.General.FFmpegLocation)) || !Configuration.IsRunningOnWindows) + { + encoderName = "FFmpeg"; + string audioParameter = string.Empty; + if (audioTrackNumber > 0) + { + audioParameter = $"-map 0:a:{audioTrackNumber}"; + } + + const string fFmpegWaveTranscodeSettings = "-i \"{0}\" -vn -ar 24000 -ac 2 -ab 128 -vol 448 -f wav {2} \"{1}\""; + //-i indicates the input + //-vn means no video ouput + //-ar 44100 indicates the sampling frequency. + //-ab indicates the bit rate (in this example 160kb/s) + //-vol 448 will boot volume... 256 is normal + //-ac 2 means 2 channels + + // "-map 0:a:0" is the first audio stream, "-map 0:a:1" is the second audio stream + + exeFilePath = Configuration.Settings.General.FFmpegLocation; + if (!Configuration.IsRunningOnWindows) + { + exeFilePath = "ffmpeg"; + } + parameters = string.Format(fFmpegWaveTranscodeSettings, inputVideoFile, outWaveFile, audioParameter); + } + return new Process { StartInfo = new ProcessStartInfo(exeFilePath, parameters) { WindowStyle = ProcessWindowStyle.Hidden } }; + } + + private void buttonRipWave_Click(object sender, EventArgs e) + { + buttonRipWave.Enabled = false; + _cancel = false; + SourceVideoFileName = labelVideoFileName.Text; + string targetFile = Path.Combine(Path.GetTempPath(), Guid.NewGuid() + ".wav"); + string targetDriveLetter = null; + if (Configuration.IsRunningOnWindows) + { + var root = Path.GetPathRoot(targetFile); + if (root.Length > 1 && root[1] == ':') + { + targetDriveLetter = root.Remove(1); + } + } + + labelPleaseWait.Visible = true; + string encoderName; + Process process; + try + { + process = GetCommandLineProcess(SourceVideoFileName, AudioTrackNumber, targetFile, _encodeParameters, out encoderName); + labelInfo.Text = encoderName; + } + catch (DllNotFoundException) + { + if (MessageBox.Show(Configuration.Settings.Language.AddWaveform.VlcMediaPlayerNotFound + Environment.NewLine + + Environment.NewLine + Configuration.Settings.Language.AddWaveform.GoToVlcMediaPlayerHomePage, + Configuration.Settings.Language.AddWaveform.VlcMediaPlayerNotFoundTitle, + MessageBoxButtons.YesNo) == DialogResult.Yes) + { + UiUtil.OpenURL("http://www.videolan.org/"); + } + buttonRipWave.Enabled = true; + return; + } + + process.Start(); + progressBar1.Style = ProgressBarStyle.Marquee; + progressBar1.Visible = true; + double seconds = 0; + buttonCancel.Visible = true; + try + { + process.PriorityClass = ProcessPriorityClass.Normal; + } + catch + { + // ignored + } + + while (!process.HasExited) + { + Application.DoEvents(); + System.Threading.Thread.Sleep(100); + seconds += 0.1; + if (seconds < 60) + { + labelProgress.Text = string.Format(Configuration.Settings.Language.AddWaveform.ExtractingSeconds, seconds); + } + else + { + labelProgress.Text = string.Format(Configuration.Settings.Language.AddWaveform.ExtractingMinutes, (int)(seconds / 60), (int)(seconds % 60)); + } + + Refresh(); + if (_cancel) + { + process.Kill(); + progressBar1.Visible = false; + labelPleaseWait.Visible = false; + buttonRipWave.Enabled = true; + buttonCancel.Visible = false; + DialogResult = DialogResult.Cancel; + return; + } + + if (targetDriveLetter != null && seconds > 1 && Convert.ToInt32(seconds) % 10 == 0) + { + try + { + var drive = new DriveInfo(targetDriveLetter); + if (drive.IsReady) + { + if (drive.AvailableFreeSpace < 50 * 1000000) // 50 mb + { + labelInfo.ForeColor = Color.Red; + labelInfo.Text = Configuration.Settings.Language.AddWaveform.LowDiskSpace; + } + else if (labelInfo.ForeColor == Color.Red) + { + labelInfo.Text = string.Format(Configuration.Settings.Language.AddWaveform.FreeDiskSpace, Utilities.FormatBytesToDisplayFileSize(drive.AvailableFreeSpace)); + } + } + } + catch + { + // ignored + } + } + } + buttonCancel.Visible = false; + progressBar1.Visible = false; + progressBar1.Style = ProgressBarStyle.Blocks; + process.Dispose(); + + var targetFileInfo = new FileInfo(targetFile); + if (!targetFileInfo.Exists) + { + if (_encodeParameters != RetryEncodeParameters) + { + _encodeParameters = RetryEncodeParameters; + buttonRipWave_Click(null, null); + return; + } + + if (_numberOfAudioTracks == 0 && MessageBox.Show(Configuration.Settings.Language.AddWaveform.NoAudioTracksFoundGenerateEmptyWaveform, Configuration.Settings.Language.General.Title, MessageBoxButtons.YesNoCancel) == DialogResult.Yes) + { + MakeEmptyWaveFile(); + DialogResult = DialogResult.OK; + return; + } + + MessageBox.Show(string.Format(Configuration.Settings.Language.AddWaveform.WaveFileNotFound, IntPtr.Size * 8, process.StartInfo.FileName, process.StartInfo.Arguments)); + + labelPleaseWait.Visible = false; + labelProgress.Text = string.Empty; + buttonRipWave.Enabled = true; + return; + } + + if (targetFileInfo.Length <= 200) + { + if (_numberOfAudioTracks == 0 && MessageBox.Show(Configuration.Settings.Language.AddWaveform.NoAudioTracksFoundGenerateEmptyWaveform, Configuration.Settings.Language.General.Title, MessageBoxButtons.YesNoCancel) == DialogResult.Yes) + { + MakeEmptyWaveFile(); + DialogResult = DialogResult.OK; + return; + } + + MessageBox.Show(string.Format(Configuration.Settings.Language.AddWaveform.WaveFileMalformed, encoderName, process.StartInfo.FileName, process.StartInfo.Arguments)); + + labelPleaseWait.Visible = false; + labelProgress.Text = string.Empty; + buttonRipWave.Enabled = true; + return; + } + + ReadWaveFile(targetFile, _delayInMilliseconds); + labelProgress.Text = string.Empty; + File.Delete(targetFile); + DialogResult = DialogResult.OK; + } + + private void ReadWaveFile(string targetFile, int delayInMilliseconds) + { + labelProgress.Text = Configuration.Settings.Language.AddWaveform.GeneratingPeakFile; + Refresh(); + + using (var waveFile = new WavePeakGenerator(targetFile)) + { + Peaks = waveFile.GeneratePeaks(delayInMilliseconds, _peakWaveFileName); + + if (Configuration.Settings.VideoControls.GenerateSpectrogram) + { + labelProgress.Text = Configuration.Settings.Language.AddWaveform.GeneratingSpectrogram; + Refresh(); + Spectrogram = waveFile.GenerateSpectrogram(delayInMilliseconds, _spectrogramDirectory); + } + } + + labelPleaseWait.Visible = false; + } + + private void MakeEmptyWaveFile() + { + labelProgress.Text = Configuration.Settings.Language.AddWaveform.GeneratingPeakFile; + Refresh(); + var videoInfo = UiUtil.GetVideoInfo(SourceVideoFileName); + Peaks = WavePeakGenerator.GenerateEmptyPeaks(_peakWaveFileName, (int)videoInfo.TotalMilliseconds / 1000); + labelPleaseWait.Visible = false; + } + + private void AddWaveform_Shown(object sender, EventArgs e) + { + Refresh(); + _numberOfAudioTracks = 0; + var audioTrackNames = new List(); + var mkvAudioTrackNumbers = new Dictionary(); + if (labelVideoFileName.Text.Length > 1 && File.Exists(labelVideoFileName.Text)) + { + if (labelVideoFileName.Text.EndsWith(".mkv", StringComparison.OrdinalIgnoreCase)) + { // Choose for number of audio tracks in matroska files + MatroskaFile matroska = null; + try + { + matroska = new MatroskaFile(labelVideoFileName.Text); + if (matroska.IsValid) + { + foreach (var track in matroska.GetTracks()) + { + if (track.IsAudio) + { + _numberOfAudioTracks++; + if (track.CodecId != null && track.Language != null) + { + audioTrackNames.Add("#" + track.TrackNumber + ": " + track.CodecId.Replace("\0", string.Empty) + " - " + track.Language.Replace("\0", string.Empty)); + } + else + { + audioTrackNames.Add("#" + track.TrackNumber); + } + + mkvAudioTrackNumbers.Add(mkvAudioTrackNumbers.Count, track.TrackNumber); + } + } + } + } + finally + { + matroska?.Dispose(); + } + } + else if (labelVideoFileName.Text.EndsWith(".mp4", StringComparison.OrdinalIgnoreCase) || labelVideoFileName.Text.EndsWith(".m4v", StringComparison.OrdinalIgnoreCase)) + { // Choose for number of audio tracks in mp4 files + try + { + var mp4 = new MP4Parser(labelVideoFileName.Text); + var tracks = mp4.GetAudioTracks(); + int i = 0; + foreach (var track in tracks) + { + i++; + if (track.Name != null && track.Mdia != null && track.Mdia.Mdhd != null && track.Mdia.Mdhd.LanguageString != null) + { + audioTrackNames.Add(i + ": " + track.Name + " - " + track.Mdia.Mdhd.LanguageString); + } + else if (track.Name != null) + { + audioTrackNames.Add(i + ": " + track.Name); + } + else + { + audioTrackNames.Add(i.ToString(CultureInfo.InvariantCulture)); + } + } + _numberOfAudioTracks = tracks.Count; + } + catch + { + // ignored + } + } + + // Choose audio track + if (_numberOfAudioTracks > 1) + { + using (var form = new ChooseAudioTrack(audioTrackNames, AudioTrackNumber)) + { + if (form.ShowDialog(this) == DialogResult.OK) + { + if (AudioTrackNumber != form.SelectedTrack) + { + AudioTrackNumber = form.SelectedTrack; + + var peakWaveFileName = WavePeakGenerator.GetPeakWaveFileName(labelVideoFileName.Text, form.SelectedTrack); + var spectrogramFolder = WavePeakGenerator.SpectrogramDrawer.GetSpectrogramFolder(labelVideoFileName.Text, form.SelectedTrack); + if (File.Exists(peakWaveFileName)) + { + DialogResult = DialogResult.Cancel; + return; + } + + _peakWaveFileName = peakWaveFileName; + _spectrogramDirectory = spectrogramFolder; + } + } + else + { + DialogResult = DialogResult.Cancel; + return; + } + } + } + + // check for delay in matroska files + if (labelVideoFileName.Text.EndsWith(".mkv", StringComparison.OrdinalIgnoreCase)) + { + MatroskaFile matroska = null; + try + { + matroska = new MatroskaFile(labelVideoFileName.Text); + if (matroska.IsValid) + { + _delayInMilliseconds = (int)matroska.GetAudioTrackDelayMilliseconds(mkvAudioTrackNumbers[AudioTrackNumber]); + } + } + catch (Exception exception) + { + SeLogger.Error(exception, $"Error getting delay from mkv: {labelVideoFileName.Text}"); + _delayInMilliseconds = 0; + } + finally + { + matroska?.Dispose(); + } + } + + buttonRipWave_Click(null, null); + } + else if (_wavFileName != null) + { + FixWaveOnly(); + } + } + + private void AddWaveform_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + else if (e.KeyCode == UiUtil.HelpKeys) + { + Utilities.ShowHelp("#waveform"); + e.SuppressKeyPress = true; + } + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + _cancel = true; + } + + internal void InitializeViaWaveFile(string fileName, string peakWaveFileName, string spectrogramFolder) + { + _peakWaveFileName = peakWaveFileName; + _wavFileName = fileName; + _spectrogramDirectory = spectrogramFolder; + } + + private void FixWaveOnly() + { + Text = Configuration.Settings.Language.AddWaveform.Title; + buttonRipWave.Text = Configuration.Settings.Language.AddWaveform.GenerateWaveformData; + labelPleaseWait.Text = Configuration.Settings.Language.AddWaveform.PleaseWait; + labelVideoFileName.Text = string.Empty; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + buttonRipWave.Enabled = false; + _cancel = false; + buttonCancel.Visible = false; + progressBar1.Visible = false; + progressBar1.Style = ProgressBarStyle.Blocks; + + labelProgress.Text = Configuration.Settings.Language.AddWaveform.GeneratingPeakFile; + Refresh(); + labelPleaseWait.Visible = false; + try + { + ReadWaveFile(_wavFileName, _delayInMilliseconds); + labelProgress.Text = string.Empty; + DialogResult = DialogResult.OK; + } + catch (Exception exception) + { + MessageBox.Show(exception.Message + Environment.NewLine + exception.StackTrace); + DialogResult = DialogResult.Cancel; + } + } + + } +} diff --git a/src/Forms/AddWaveform.resx b/src/ui/Forms/AddWaveform.resx similarity index 100% rename from src/Forms/AddWaveform.resx rename to src/ui/Forms/AddWaveform.resx diff --git a/src/Forms/AddWaveformBatch.Designer.cs b/src/ui/Forms/AddWaveformBatch.Designer.cs similarity index 100% rename from src/Forms/AddWaveformBatch.Designer.cs rename to src/ui/Forms/AddWaveformBatch.Designer.cs diff --git a/src/Forms/AddWaveformBatch.cs b/src/ui/Forms/AddWaveformBatch.cs similarity index 100% rename from src/Forms/AddWaveformBatch.cs rename to src/ui/Forms/AddWaveformBatch.cs diff --git a/src/Forms/AddWaveformBatch.resx b/src/ui/Forms/AddWaveformBatch.resx similarity index 100% rename from src/Forms/AddWaveformBatch.resx rename to src/ui/Forms/AddWaveformBatch.resx diff --git a/src/Forms/AdjustDisplayDuration.Designer.cs b/src/ui/Forms/AdjustDisplayDuration.Designer.cs similarity index 98% rename from src/Forms/AdjustDisplayDuration.Designer.cs rename to src/ui/Forms/AdjustDisplayDuration.Designer.cs index f0daddb1a..d42d9d739 100644 --- a/src/Forms/AdjustDisplayDuration.Designer.cs +++ b/src/ui/Forms/AdjustDisplayDuration.Designer.cs @@ -1,399 +1,399 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class AdjustDisplayDuration - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.radioButtonPercent = new System.Windows.Forms.RadioButton(); - this.radioButtonSeconds = new System.Windows.Forms.RadioButton(); - this.groupBoxAdjustVia = new System.Windows.Forms.GroupBox(); - this.radioButtonFixed = new System.Windows.Forms.RadioButton(); - this.radioButtonAutoRecalculate = new System.Windows.Forms.RadioButton(); - this.labelNote = new System.Windows.Forms.Label(); - this.labelAddInPercent = new System.Windows.Forms.Label(); - this.labelAddSeconds = new System.Windows.Forms.Label(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.numericUpDownMaxCharsSec = new System.Windows.Forms.NumericUpDown(); - this.labelMaxCharsPerSecond = new System.Windows.Forms.Label(); - this.numericUpDownSeconds = new System.Windows.Forms.NumericUpDown(); - this.numericUpDownPercent = new System.Windows.Forms.NumericUpDown(); - this.numericUpDownOptimalCharsSec = new System.Windows.Forms.NumericUpDown(); - this.labelOptimalCharsSec = new System.Windows.Forms.Label(); - this.numericUpDownFixedMilliseconds = new System.Windows.Forms.NumericUpDown(); - this.labelMillisecondsFixed = new System.Windows.Forms.Label(); - this.label1 = new System.Windows.Forms.Label(); - this.checkBoxExtendOnly = new System.Windows.Forms.CheckBox(); - this.groupBoxAdjustVia.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxCharsSec)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSeconds)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPercent)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownOptimalCharsSec)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownFixedMilliseconds)).BeginInit(); - this.SuspendLayout(); - // - // radioButtonPercent - // - this.radioButtonPercent.AutoSize = true; - this.radioButtonPercent.Location = new System.Drawing.Point(171, 21); - this.radioButtonPercent.Name = "radioButtonPercent"; - this.radioButtonPercent.Size = new System.Drawing.Size(62, 17); - this.radioButtonPercent.TabIndex = 1; - this.radioButtonPercent.Text = "Percent"; - this.radioButtonPercent.UseVisualStyleBackColor = true; - this.radioButtonPercent.CheckedChanged += new System.EventHandler(this.RadioButtonPercentCheckedChanged); - // - // radioButtonSeconds - // - this.radioButtonSeconds.AutoSize = true; - this.radioButtonSeconds.Checked = true; - this.radioButtonSeconds.Location = new System.Drawing.Point(11, 21); - this.radioButtonSeconds.Name = "radioButtonSeconds"; - this.radioButtonSeconds.Size = new System.Drawing.Size(65, 17); - this.radioButtonSeconds.TabIndex = 0; - this.radioButtonSeconds.TabStop = true; - this.radioButtonSeconds.Text = "Seconds"; - this.radioButtonSeconds.UseVisualStyleBackColor = true; - this.radioButtonSeconds.CheckedChanged += new System.EventHandler(this.RadioButtonSecondsCheckedChanged); - // - // groupBoxAdjustVia - // - this.groupBoxAdjustVia.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxAdjustVia.Controls.Add(this.radioButtonFixed); - this.groupBoxAdjustVia.Controls.Add(this.radioButtonAutoRecalculate); - this.groupBoxAdjustVia.Controls.Add(this.radioButtonPercent); - this.groupBoxAdjustVia.Controls.Add(this.radioButtonSeconds); - this.groupBoxAdjustVia.Location = new System.Drawing.Point(13, 13); - this.groupBoxAdjustVia.Name = "groupBoxAdjustVia"; - this.groupBoxAdjustVia.Size = new System.Drawing.Size(599, 47); - this.groupBoxAdjustVia.TabIndex = 0; - this.groupBoxAdjustVia.TabStop = false; - this.groupBoxAdjustVia.Text = "Adjust via"; - // - // radioButtonFixed - // - this.radioButtonFixed.AutoSize = true; - this.radioButtonFixed.Location = new System.Drawing.Point(491, 21); - this.radioButtonFixed.Name = "radioButtonFixed"; - this.radioButtonFixed.Size = new System.Drawing.Size(51, 17); - this.radioButtonFixed.TabIndex = 3; - this.radioButtonFixed.Text = "Fixed"; - this.radioButtonFixed.UseVisualStyleBackColor = true; - this.radioButtonFixed.CheckedChanged += new System.EventHandler(this.radioButton1_CheckedChanged); - // - // radioButtonAutoRecalculate - // - this.radioButtonAutoRecalculate.AutoSize = true; - this.radioButtonAutoRecalculate.Location = new System.Drawing.Point(344, 21); - this.radioButtonAutoRecalculate.Name = "radioButtonAutoRecalculate"; - this.radioButtonAutoRecalculate.Size = new System.Drawing.Size(80, 17); - this.radioButtonAutoRecalculate.TabIndex = 2; - this.radioButtonAutoRecalculate.Text = "Recalculate"; - this.radioButtonAutoRecalculate.UseVisualStyleBackColor = true; - this.radioButtonAutoRecalculate.CheckedChanged += new System.EventHandler(this.radioButtonAutoRecalculate_CheckedChanged); - // - // labelNote - // - this.labelNote.AutoSize = true; - this.labelNote.Location = new System.Drawing.Point(10, 211); - this.labelNote.Name = "labelNote"; - this.labelNote.Size = new System.Drawing.Size(279, 13); - this.labelNote.TabIndex = 7; - this.labelNote.Text = "Note: Display time will not overlap start time of next text"; - // - // labelAddInPercent - // - this.labelAddInPercent.AutoSize = true; - this.labelAddInPercent.Location = new System.Drawing.Point(179, 70); - this.labelAddInPercent.Name = "labelAddInPercent"; - this.labelAddInPercent.Size = new System.Drawing.Size(89, 13); - this.labelAddInPercent.TabIndex = 3; - this.labelAddInPercent.Text = "Adjust in percent"; - // - // labelAddSeconds - // - this.labelAddSeconds.AutoSize = true; - this.labelAddSeconds.Location = new System.Drawing.Point(10, 70); - this.labelAddSeconds.Name = "labelAddSeconds"; - this.labelAddSeconds.Size = new System.Drawing.Size(68, 13); - this.labelAddSeconds.TabIndex = 1; - this.labelAddSeconds.Text = "Add seconds"; - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(537, 231); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 21; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(456, 231); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 20; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); - // - // numericUpDownMaxCharsSec - // - this.numericUpDownMaxCharsSec.DecimalPlaces = 1; - this.numericUpDownMaxCharsSec.Enabled = false; - this.numericUpDownMaxCharsSec.Increment = new decimal(new int[] { - 1, - 0, - 0, - 65536}); - this.numericUpDownMaxCharsSec.Location = new System.Drawing.Point(357, 89); - this.numericUpDownMaxCharsSec.Minimum = new decimal(new int[] { - 4, - 0, - 0, - 0}); - this.numericUpDownMaxCharsSec.Name = "numericUpDownMaxCharsSec"; - this.numericUpDownMaxCharsSec.Size = new System.Drawing.Size(80, 21); - this.numericUpDownMaxCharsSec.TabIndex = 6; - this.numericUpDownMaxCharsSec.Value = new decimal(new int[] { - 24, - 0, - 0, - 0}); - // - // labelMaxCharsPerSecond - // - this.labelMaxCharsPerSecond.AutoSize = true; - this.labelMaxCharsPerSecond.Location = new System.Drawing.Point(354, 70); - this.labelMaxCharsPerSecond.Name = "labelMaxCharsPerSecond"; - this.labelMaxCharsPerSecond.Size = new System.Drawing.Size(80, 13); - this.labelMaxCharsPerSecond.TabIndex = 5; - this.labelMaxCharsPerSecond.Text = "Max. chars/sec"; - // - // numericUpDownSeconds - // - this.numericUpDownSeconds.DecimalPlaces = 3; - this.numericUpDownSeconds.Increment = new decimal(new int[] { - 1, - 0, - 0, - 131072}); - this.numericUpDownSeconds.Location = new System.Drawing.Point(13, 89); - this.numericUpDownSeconds.Maximum = new decimal(new int[] { - 20, - 0, - 0, - 0}); - this.numericUpDownSeconds.Minimum = new decimal(new int[] { - 10, - 0, - 0, - -2147483648}); - this.numericUpDownSeconds.Name = "numericUpDownSeconds"; - this.numericUpDownSeconds.Size = new System.Drawing.Size(80, 21); - this.numericUpDownSeconds.TabIndex = 3; - this.numericUpDownSeconds.Value = new decimal(new int[] { - 1, - 0, - 0, - 65536}); - // - // numericUpDownPercent - // - this.numericUpDownPercent.Location = new System.Drawing.Point(182, 89); - this.numericUpDownPercent.Maximum = new decimal(new int[] { - 150, - 0, - 0, - 0}); - this.numericUpDownPercent.Minimum = new decimal(new int[] { - 75, - 0, - 0, - 0}); - this.numericUpDownPercent.Name = "numericUpDownPercent"; - this.numericUpDownPercent.Size = new System.Drawing.Size(80, 21); - this.numericUpDownPercent.TabIndex = 4; - this.numericUpDownPercent.Value = new decimal(new int[] { - 110, - 0, - 0, - 0}); - // - // numericUpDownOptimalCharsSec - // - this.numericUpDownOptimalCharsSec.DecimalPlaces = 1; - this.numericUpDownOptimalCharsSec.Enabled = false; - this.numericUpDownOptimalCharsSec.Increment = new decimal(new int[] { - 1, - 0, - 0, - 65536}); - this.numericUpDownOptimalCharsSec.Location = new System.Drawing.Point(357, 147); - this.numericUpDownOptimalCharsSec.Minimum = new decimal(new int[] { - 4, - 0, - 0, - 0}); - this.numericUpDownOptimalCharsSec.Name = "numericUpDownOptimalCharsSec"; - this.numericUpDownOptimalCharsSec.Size = new System.Drawing.Size(80, 21); - this.numericUpDownOptimalCharsSec.TabIndex = 7; - this.numericUpDownOptimalCharsSec.Value = new decimal(new int[] { - 17, - 0, - 0, - 0}); - // - // labelOptimalCharsSec - // - this.labelOptimalCharsSec.AutoSize = true; - this.labelOptimalCharsSec.Location = new System.Drawing.Point(354, 128); - this.labelOptimalCharsSec.Name = "labelOptimalCharsSec"; - this.labelOptimalCharsSec.Size = new System.Drawing.Size(92, 13); - this.labelOptimalCharsSec.TabIndex = 10; - this.labelOptimalCharsSec.Text = "Optimal chars/sec"; - // - // numericUpDownFixedMilliseconds - // - this.numericUpDownFixedMilliseconds.Enabled = false; - this.numericUpDownFixedMilliseconds.Location = new System.Drawing.Point(501, 89); - this.numericUpDownFixedMilliseconds.Maximum = new decimal(new int[] { - 20000, - 0, - 0, - 0}); - this.numericUpDownFixedMilliseconds.Name = "numericUpDownFixedMilliseconds"; - this.numericUpDownFixedMilliseconds.Size = new System.Drawing.Size(80, 21); - this.numericUpDownFixedMilliseconds.TabIndex = 9; - this.numericUpDownFixedMilliseconds.Value = new decimal(new int[] { - 3000, - 0, - 0, - 0}); - // - // labelMillisecondsFixed - // - this.labelMillisecondsFixed.AutoSize = true; - this.labelMillisecondsFixed.Location = new System.Drawing.Point(498, 70); - this.labelMillisecondsFixed.Name = "labelMillisecondsFixed"; - this.labelMillisecondsFixed.Size = new System.Drawing.Size(62, 13); - this.labelMillisecondsFixed.TabIndex = 12; - this.labelMillisecondsFixed.Text = "Milliseconds"; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(264, 93); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(18, 13); - this.label1.TabIndex = 22; - this.label1.Text = "%"; - // - // checkBoxExtendOnly - // - this.checkBoxExtendOnly.AutoSize = true; - this.checkBoxExtendOnly.Location = new System.Drawing.Point(357, 184); - this.checkBoxExtendOnly.Name = "checkBoxExtendOnly"; - this.checkBoxExtendOnly.Size = new System.Drawing.Size(83, 17); - this.checkBoxExtendOnly.TabIndex = 8; - this.checkBoxExtendOnly.Text = "Extend only"; - this.checkBoxExtendOnly.UseVisualStyleBackColor = true; - // - // AdjustDisplayDuration - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(624, 268); - this.Controls.Add(this.checkBoxExtendOnly); - this.Controls.Add(this.label1); - this.Controls.Add(this.numericUpDownFixedMilliseconds); - this.Controls.Add(this.labelMillisecondsFixed); - this.Controls.Add(this.numericUpDownOptimalCharsSec); - this.Controls.Add(this.labelOptimalCharsSec); - this.Controls.Add(this.numericUpDownPercent); - this.Controls.Add(this.numericUpDownSeconds); - this.Controls.Add(this.numericUpDownMaxCharsSec); - this.Controls.Add(this.labelMaxCharsPerSecond); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.labelAddSeconds); - this.Controls.Add(this.labelAddInPercent); - this.Controls.Add(this.labelNote); - this.Controls.Add(this.groupBoxAdjustVia); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "AdjustDisplayDuration"; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Adjust display time"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormAdjustDisplayTime_KeyDown); - this.groupBoxAdjustVia.ResumeLayout(false); - this.groupBoxAdjustVia.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxCharsSec)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSeconds)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPercent)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownOptimalCharsSec)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownFixedMilliseconds)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.RadioButton radioButtonPercent; - private System.Windows.Forms.RadioButton radioButtonSeconds; - private System.Windows.Forms.GroupBox groupBoxAdjustVia; - private System.Windows.Forms.Label labelNote; - private System.Windows.Forms.Label labelAddInPercent; - private System.Windows.Forms.Label labelAddSeconds; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.RadioButton radioButtonAutoRecalculate; - private System.Windows.Forms.NumericUpDown numericUpDownMaxCharsSec; - private System.Windows.Forms.Label labelMaxCharsPerSecond; - private System.Windows.Forms.NumericUpDown numericUpDownSeconds; - private System.Windows.Forms.NumericUpDown numericUpDownPercent; - private System.Windows.Forms.NumericUpDown numericUpDownOptimalCharsSec; - private System.Windows.Forms.Label labelOptimalCharsSec; - private System.Windows.Forms.RadioButton radioButtonFixed; - private System.Windows.Forms.NumericUpDown numericUpDownFixedMilliseconds; - private System.Windows.Forms.Label labelMillisecondsFixed; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.CheckBox checkBoxExtendOnly; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class AdjustDisplayDuration + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.radioButtonPercent = new System.Windows.Forms.RadioButton(); + this.radioButtonSeconds = new System.Windows.Forms.RadioButton(); + this.groupBoxAdjustVia = new System.Windows.Forms.GroupBox(); + this.radioButtonFixed = new System.Windows.Forms.RadioButton(); + this.radioButtonAutoRecalculate = new System.Windows.Forms.RadioButton(); + this.labelNote = new System.Windows.Forms.Label(); + this.labelAddInPercent = new System.Windows.Forms.Label(); + this.labelAddSeconds = new System.Windows.Forms.Label(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.numericUpDownMaxCharsSec = new System.Windows.Forms.NumericUpDown(); + this.labelMaxCharsPerSecond = new System.Windows.Forms.Label(); + this.numericUpDownSeconds = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownPercent = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownOptimalCharsSec = new System.Windows.Forms.NumericUpDown(); + this.labelOptimalCharsSec = new System.Windows.Forms.Label(); + this.numericUpDownFixedMilliseconds = new System.Windows.Forms.NumericUpDown(); + this.labelMillisecondsFixed = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.checkBoxExtendOnly = new System.Windows.Forms.CheckBox(); + this.groupBoxAdjustVia.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxCharsSec)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSeconds)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPercent)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownOptimalCharsSec)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownFixedMilliseconds)).BeginInit(); + this.SuspendLayout(); + // + // radioButtonPercent + // + this.radioButtonPercent.AutoSize = true; + this.radioButtonPercent.Location = new System.Drawing.Point(171, 21); + this.radioButtonPercent.Name = "radioButtonPercent"; + this.radioButtonPercent.Size = new System.Drawing.Size(62, 17); + this.radioButtonPercent.TabIndex = 1; + this.radioButtonPercent.Text = "Percent"; + this.radioButtonPercent.UseVisualStyleBackColor = true; + this.radioButtonPercent.CheckedChanged += new System.EventHandler(this.RadioButtonPercentCheckedChanged); + // + // radioButtonSeconds + // + this.radioButtonSeconds.AutoSize = true; + this.radioButtonSeconds.Checked = true; + this.radioButtonSeconds.Location = new System.Drawing.Point(11, 21); + this.radioButtonSeconds.Name = "radioButtonSeconds"; + this.radioButtonSeconds.Size = new System.Drawing.Size(65, 17); + this.radioButtonSeconds.TabIndex = 0; + this.radioButtonSeconds.TabStop = true; + this.radioButtonSeconds.Text = "Seconds"; + this.radioButtonSeconds.UseVisualStyleBackColor = true; + this.radioButtonSeconds.CheckedChanged += new System.EventHandler(this.RadioButtonSecondsCheckedChanged); + // + // groupBoxAdjustVia + // + this.groupBoxAdjustVia.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxAdjustVia.Controls.Add(this.radioButtonFixed); + this.groupBoxAdjustVia.Controls.Add(this.radioButtonAutoRecalculate); + this.groupBoxAdjustVia.Controls.Add(this.radioButtonPercent); + this.groupBoxAdjustVia.Controls.Add(this.radioButtonSeconds); + this.groupBoxAdjustVia.Location = new System.Drawing.Point(13, 13); + this.groupBoxAdjustVia.Name = "groupBoxAdjustVia"; + this.groupBoxAdjustVia.Size = new System.Drawing.Size(599, 47); + this.groupBoxAdjustVia.TabIndex = 0; + this.groupBoxAdjustVia.TabStop = false; + this.groupBoxAdjustVia.Text = "Adjust via"; + // + // radioButtonFixed + // + this.radioButtonFixed.AutoSize = true; + this.radioButtonFixed.Location = new System.Drawing.Point(491, 21); + this.radioButtonFixed.Name = "radioButtonFixed"; + this.radioButtonFixed.Size = new System.Drawing.Size(51, 17); + this.radioButtonFixed.TabIndex = 3; + this.radioButtonFixed.Text = "Fixed"; + this.radioButtonFixed.UseVisualStyleBackColor = true; + this.radioButtonFixed.CheckedChanged += new System.EventHandler(this.radioButton1_CheckedChanged); + // + // radioButtonAutoRecalculate + // + this.radioButtonAutoRecalculate.AutoSize = true; + this.radioButtonAutoRecalculate.Location = new System.Drawing.Point(344, 21); + this.radioButtonAutoRecalculate.Name = "radioButtonAutoRecalculate"; + this.radioButtonAutoRecalculate.Size = new System.Drawing.Size(80, 17); + this.radioButtonAutoRecalculate.TabIndex = 2; + this.radioButtonAutoRecalculate.Text = "Recalculate"; + this.radioButtonAutoRecalculate.UseVisualStyleBackColor = true; + this.radioButtonAutoRecalculate.CheckedChanged += new System.EventHandler(this.radioButtonAutoRecalculate_CheckedChanged); + // + // labelNote + // + this.labelNote.AutoSize = true; + this.labelNote.Location = new System.Drawing.Point(10, 211); + this.labelNote.Name = "labelNote"; + this.labelNote.Size = new System.Drawing.Size(279, 13); + this.labelNote.TabIndex = 7; + this.labelNote.Text = "Note: Display time will not overlap start time of next text"; + // + // labelAddInPercent + // + this.labelAddInPercent.AutoSize = true; + this.labelAddInPercent.Location = new System.Drawing.Point(179, 70); + this.labelAddInPercent.Name = "labelAddInPercent"; + this.labelAddInPercent.Size = new System.Drawing.Size(89, 13); + this.labelAddInPercent.TabIndex = 3; + this.labelAddInPercent.Text = "Adjust in percent"; + // + // labelAddSeconds + // + this.labelAddSeconds.AutoSize = true; + this.labelAddSeconds.Location = new System.Drawing.Point(10, 70); + this.labelAddSeconds.Name = "labelAddSeconds"; + this.labelAddSeconds.Size = new System.Drawing.Size(68, 13); + this.labelAddSeconds.TabIndex = 1; + this.labelAddSeconds.Text = "Add seconds"; + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(537, 231); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 21; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(456, 231); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 20; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); + // + // numericUpDownMaxCharsSec + // + this.numericUpDownMaxCharsSec.DecimalPlaces = 1; + this.numericUpDownMaxCharsSec.Enabled = false; + this.numericUpDownMaxCharsSec.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.numericUpDownMaxCharsSec.Location = new System.Drawing.Point(357, 89); + this.numericUpDownMaxCharsSec.Minimum = new decimal(new int[] { + 4, + 0, + 0, + 0}); + this.numericUpDownMaxCharsSec.Name = "numericUpDownMaxCharsSec"; + this.numericUpDownMaxCharsSec.Size = new System.Drawing.Size(80, 21); + this.numericUpDownMaxCharsSec.TabIndex = 6; + this.numericUpDownMaxCharsSec.Value = new decimal(new int[] { + 24, + 0, + 0, + 0}); + // + // labelMaxCharsPerSecond + // + this.labelMaxCharsPerSecond.AutoSize = true; + this.labelMaxCharsPerSecond.Location = new System.Drawing.Point(354, 70); + this.labelMaxCharsPerSecond.Name = "labelMaxCharsPerSecond"; + this.labelMaxCharsPerSecond.Size = new System.Drawing.Size(80, 13); + this.labelMaxCharsPerSecond.TabIndex = 5; + this.labelMaxCharsPerSecond.Text = "Max. chars/sec"; + // + // numericUpDownSeconds + // + this.numericUpDownSeconds.DecimalPlaces = 3; + this.numericUpDownSeconds.Increment = new decimal(new int[] { + 1, + 0, + 0, + 131072}); + this.numericUpDownSeconds.Location = new System.Drawing.Point(13, 89); + this.numericUpDownSeconds.Maximum = new decimal(new int[] { + 20, + 0, + 0, + 0}); + this.numericUpDownSeconds.Minimum = new decimal(new int[] { + 10, + 0, + 0, + -2147483648}); + this.numericUpDownSeconds.Name = "numericUpDownSeconds"; + this.numericUpDownSeconds.Size = new System.Drawing.Size(80, 21); + this.numericUpDownSeconds.TabIndex = 3; + this.numericUpDownSeconds.Value = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + // + // numericUpDownPercent + // + this.numericUpDownPercent.Location = new System.Drawing.Point(182, 89); + this.numericUpDownPercent.Maximum = new decimal(new int[] { + 150, + 0, + 0, + 0}); + this.numericUpDownPercent.Minimum = new decimal(new int[] { + 75, + 0, + 0, + 0}); + this.numericUpDownPercent.Name = "numericUpDownPercent"; + this.numericUpDownPercent.Size = new System.Drawing.Size(80, 21); + this.numericUpDownPercent.TabIndex = 4; + this.numericUpDownPercent.Value = new decimal(new int[] { + 110, + 0, + 0, + 0}); + // + // numericUpDownOptimalCharsSec + // + this.numericUpDownOptimalCharsSec.DecimalPlaces = 1; + this.numericUpDownOptimalCharsSec.Enabled = false; + this.numericUpDownOptimalCharsSec.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.numericUpDownOptimalCharsSec.Location = new System.Drawing.Point(357, 147); + this.numericUpDownOptimalCharsSec.Minimum = new decimal(new int[] { + 4, + 0, + 0, + 0}); + this.numericUpDownOptimalCharsSec.Name = "numericUpDownOptimalCharsSec"; + this.numericUpDownOptimalCharsSec.Size = new System.Drawing.Size(80, 21); + this.numericUpDownOptimalCharsSec.TabIndex = 7; + this.numericUpDownOptimalCharsSec.Value = new decimal(new int[] { + 17, + 0, + 0, + 0}); + // + // labelOptimalCharsSec + // + this.labelOptimalCharsSec.AutoSize = true; + this.labelOptimalCharsSec.Location = new System.Drawing.Point(354, 128); + this.labelOptimalCharsSec.Name = "labelOptimalCharsSec"; + this.labelOptimalCharsSec.Size = new System.Drawing.Size(92, 13); + this.labelOptimalCharsSec.TabIndex = 10; + this.labelOptimalCharsSec.Text = "Optimal chars/sec"; + // + // numericUpDownFixedMilliseconds + // + this.numericUpDownFixedMilliseconds.Enabled = false; + this.numericUpDownFixedMilliseconds.Location = new System.Drawing.Point(501, 89); + this.numericUpDownFixedMilliseconds.Maximum = new decimal(new int[] { + 20000, + 0, + 0, + 0}); + this.numericUpDownFixedMilliseconds.Name = "numericUpDownFixedMilliseconds"; + this.numericUpDownFixedMilliseconds.Size = new System.Drawing.Size(80, 21); + this.numericUpDownFixedMilliseconds.TabIndex = 9; + this.numericUpDownFixedMilliseconds.Value = new decimal(new int[] { + 3000, + 0, + 0, + 0}); + // + // labelMillisecondsFixed + // + this.labelMillisecondsFixed.AutoSize = true; + this.labelMillisecondsFixed.Location = new System.Drawing.Point(498, 70); + this.labelMillisecondsFixed.Name = "labelMillisecondsFixed"; + this.labelMillisecondsFixed.Size = new System.Drawing.Size(62, 13); + this.labelMillisecondsFixed.TabIndex = 12; + this.labelMillisecondsFixed.Text = "Milliseconds"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(264, 93); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(18, 13); + this.label1.TabIndex = 22; + this.label1.Text = "%"; + // + // checkBoxExtendOnly + // + this.checkBoxExtendOnly.AutoSize = true; + this.checkBoxExtendOnly.Location = new System.Drawing.Point(357, 184); + this.checkBoxExtendOnly.Name = "checkBoxExtendOnly"; + this.checkBoxExtendOnly.Size = new System.Drawing.Size(83, 17); + this.checkBoxExtendOnly.TabIndex = 8; + this.checkBoxExtendOnly.Text = "Extend only"; + this.checkBoxExtendOnly.UseVisualStyleBackColor = true; + // + // AdjustDisplayDuration + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(624, 268); + this.Controls.Add(this.checkBoxExtendOnly); + this.Controls.Add(this.label1); + this.Controls.Add(this.numericUpDownFixedMilliseconds); + this.Controls.Add(this.labelMillisecondsFixed); + this.Controls.Add(this.numericUpDownOptimalCharsSec); + this.Controls.Add(this.labelOptimalCharsSec); + this.Controls.Add(this.numericUpDownPercent); + this.Controls.Add(this.numericUpDownSeconds); + this.Controls.Add(this.numericUpDownMaxCharsSec); + this.Controls.Add(this.labelMaxCharsPerSecond); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.labelAddSeconds); + this.Controls.Add(this.labelAddInPercent); + this.Controls.Add(this.labelNote); + this.Controls.Add(this.groupBoxAdjustVia); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "AdjustDisplayDuration"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Adjust display time"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormAdjustDisplayTime_KeyDown); + this.groupBoxAdjustVia.ResumeLayout(false); + this.groupBoxAdjustVia.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxCharsSec)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSeconds)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPercent)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownOptimalCharsSec)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownFixedMilliseconds)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.RadioButton radioButtonPercent; + private System.Windows.Forms.RadioButton radioButtonSeconds; + private System.Windows.Forms.GroupBox groupBoxAdjustVia; + private System.Windows.Forms.Label labelNote; + private System.Windows.Forms.Label labelAddInPercent; + private System.Windows.Forms.Label labelAddSeconds; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.RadioButton radioButtonAutoRecalculate; + private System.Windows.Forms.NumericUpDown numericUpDownMaxCharsSec; + private System.Windows.Forms.Label labelMaxCharsPerSecond; + private System.Windows.Forms.NumericUpDown numericUpDownSeconds; + private System.Windows.Forms.NumericUpDown numericUpDownPercent; + private System.Windows.Forms.NumericUpDown numericUpDownOptimalCharsSec; + private System.Windows.Forms.Label labelOptimalCharsSec; + private System.Windows.Forms.RadioButton radioButtonFixed; + private System.Windows.Forms.NumericUpDown numericUpDownFixedMilliseconds; + private System.Windows.Forms.Label labelMillisecondsFixed; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.CheckBox checkBoxExtendOnly; + } } \ No newline at end of file diff --git a/src/Forms/AdjustDisplayDuration.cs b/src/ui/Forms/AdjustDisplayDuration.cs similarity index 97% rename from src/Forms/AdjustDisplayDuration.cs rename to src/ui/Forms/AdjustDisplayDuration.cs index 73f169553..d7a4e4f9d 100644 --- a/src/Forms/AdjustDisplayDuration.cs +++ b/src/ui/Forms/AdjustDisplayDuration.cs @@ -1,198 +1,198 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Globalization; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class AdjustDisplayDuration : PositionAndSizeForm - { - internal const string Sec = "seconds"; - internal const string Per = "percent"; - internal const string Recal = "recalc"; - internal const string Fixed = "fixed"; - - public string AdjustValue - { - get - { - if (radioButtonPercent.Checked) - { - return numericUpDownPercent.Value.ToString(CultureInfo.InvariantCulture); - } - - if (radioButtonAutoRecalculate.Checked) - { - return $"{radioButtonAutoRecalculate.Text}, {labelMaxCharsPerSecond.Text}: {numericUpDownMaxCharsSec.Value}"; - } - - return numericUpDownSeconds.Value.ToString(CultureInfo.InvariantCulture); - } - } - - public bool AdjustUsingPercent => radioButtonPercent.Checked; - - public bool AdjustUsingSeconds => radioButtonSeconds.Checked; - - public bool AdjustUsingRecalc => radioButtonAutoRecalculate.Checked; - - public decimal MaxCharactersPerSecond => numericUpDownMaxCharsSec.Value; - - public decimal OptimalCharactersPerSecond => numericUpDownOptimalCharsSec.Value; - - public int FixedMilliseconds => (int)numericUpDownFixedMilliseconds.Value; - - public bool ExtendOnly => checkBoxExtendOnly.Checked; - - public AdjustDisplayDuration() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - Icon = Properties.Resources.SubtitleEditFormIcon; - - numericUpDownSeconds.Enabled = false; - numericUpDownPercent.Enabled = false; - - decimal adjustSeconds = Configuration.Settings.Tools.AdjustDurationSeconds; - if (adjustSeconds >= numericUpDownSeconds.Minimum && adjustSeconds <= numericUpDownSeconds.Maximum) - { - numericUpDownSeconds.Value = adjustSeconds; - } - - int adjustPercent = Configuration.Settings.Tools.AdjustDurationPercent; - if (adjustPercent >= numericUpDownPercent.Minimum && adjustPercent <= numericUpDownPercent.Maximum) - { - numericUpDownPercent.Value = adjustPercent; - } - - numericUpDownOptimalCharsSec.Value = (decimal)Configuration.Settings.General.SubtitleOptimalCharactersPerSeconds; - numericUpDownMaxCharsSec.Value = (decimal)Configuration.Settings.General.SubtitleMaximumCharactersPerSeconds; - - checkBoxExtendOnly.Checked = Configuration.Settings.Tools.AdjustDurationExtendOnly; - - LanguageStructure.AdjustDisplayDuration language = Configuration.Settings.Language.AdjustDisplayDuration; - Text = language.Title; - groupBoxAdjustVia.Text = language.AdjustVia; - radioButtonSeconds.Text = language.Seconds; - radioButtonPercent.Text = language.Percent; - radioButtonAutoRecalculate.Text = language.Recalculate; - labelOptimalCharsSec.Text = Configuration.Settings.Language.Settings.OptimalCharactersPerSecond; - labelMaxCharsPerSecond.Text = Configuration.Settings.Language.Settings.MaximumCharactersPerSecond; - labelAddSeconds.Text = language.AddSeconds; - labelAddInPercent.Text = language.SetAsPercent; - labelNote.Text = language.Note; - radioButtonFixed.Text = language.Fixed; - labelMillisecondsFixed.Text = language.Milliseconds; - checkBoxExtendOnly.Text = language.ExtendOnly; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - FixLargeFonts(); - - switch (Configuration.Settings.Tools.AdjustDurationLast) - { - case Sec: - radioButtonSeconds.Checked = true; - break; - case Per: - radioButtonPercent.Checked = true; - break; - case Recal: - radioButtonAutoRecalculate.Checked = true; - break; - case Fixed: - radioButtonFixed.Checked = true; - break; - } - FixEnabled(); - } - - private void FixLargeFonts() - { - if (labelNote.Left + labelNote.Width + 5 > Width) - { - Width = labelNote.Left + labelNote.Width + 5; - } - - UiUtil.FixLargeFonts(this, buttonOK); - } - - private void FormAdjustDisplayTime_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - private void RadioButtonPercentCheckedChanged(object sender, EventArgs e) - { - FixEnabled(); - } - - private void FixEnabled() - { - numericUpDownPercent.Enabled = radioButtonPercent.Checked; - numericUpDownSeconds.Enabled = radioButtonSeconds.Checked; - numericUpDownMaxCharsSec.Enabled = radioButtonAutoRecalculate.Checked; - numericUpDownOptimalCharsSec.Enabled = radioButtonAutoRecalculate.Checked; - checkBoxExtendOnly.Enabled = radioButtonAutoRecalculate.Checked; - numericUpDownFixedMilliseconds.Enabled = radioButtonFixed.Checked; - } - - private void RadioButtonSecondsCheckedChanged(object sender, EventArgs e) - { - FixEnabled(); - } - - private void ButtonOkClick(object sender, EventArgs e) - { - Configuration.Settings.Tools.AdjustDurationSeconds = numericUpDownSeconds.Value; - Configuration.Settings.Tools.AdjustDurationPercent = (int)numericUpDownPercent.Value; - Configuration.Settings.Tools.AdjustDurationExtendOnly = checkBoxExtendOnly.Checked; - - if (radioButtonSeconds.Checked) - { - Configuration.Settings.Tools.AdjustDurationLast = Sec; - } - else if (radioButtonPercent.Checked) - { - Configuration.Settings.Tools.AdjustDurationLast = Per; - } - else if (radioButtonAutoRecalculate.Checked) - { - Configuration.Settings.Tools.AdjustDurationLast = Recal; - } - else if (radioButtonFixed.Checked) - { - Configuration.Settings.Tools.AdjustDurationLast = Fixed; - } - - DialogResult = DialogResult.OK; - } - - public void HideRecalculate() - { - if (radioButtonAutoRecalculate.Checked) - { - radioButtonSeconds.Checked = true; - } - - radioButtonAutoRecalculate.Visible = false; - labelMaxCharsPerSecond.Visible = false; - numericUpDownMaxCharsSec.Visible = false; - } - - private void radioButton1_CheckedChanged(object sender, EventArgs e) - { - FixEnabled(); - } - - private void radioButtonAutoRecalculate_CheckedChanged(object sender, EventArgs e) - { - FixEnabled(); - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Globalization; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class AdjustDisplayDuration : PositionAndSizeForm + { + internal const string Sec = "seconds"; + internal const string Per = "percent"; + internal const string Recal = "recalc"; + internal const string Fixed = "fixed"; + + public string AdjustValue + { + get + { + if (radioButtonPercent.Checked) + { + return numericUpDownPercent.Value.ToString(CultureInfo.InvariantCulture); + } + + if (radioButtonAutoRecalculate.Checked) + { + return $"{radioButtonAutoRecalculate.Text}, {labelMaxCharsPerSecond.Text}: {numericUpDownMaxCharsSec.Value}"; + } + + return numericUpDownSeconds.Value.ToString(CultureInfo.InvariantCulture); + } + } + + public bool AdjustUsingPercent => radioButtonPercent.Checked; + + public bool AdjustUsingSeconds => radioButtonSeconds.Checked; + + public bool AdjustUsingRecalc => radioButtonAutoRecalculate.Checked; + + public decimal MaxCharactersPerSecond => numericUpDownMaxCharsSec.Value; + + public decimal OptimalCharactersPerSecond => numericUpDownOptimalCharsSec.Value; + + public int FixedMilliseconds => (int)numericUpDownFixedMilliseconds.Value; + + public bool ExtendOnly => checkBoxExtendOnly.Checked; + + public AdjustDisplayDuration() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + Icon = Properties.Resources.SubtitleEditFormIcon; + + numericUpDownSeconds.Enabled = false; + numericUpDownPercent.Enabled = false; + + decimal adjustSeconds = Configuration.Settings.Tools.AdjustDurationSeconds; + if (adjustSeconds >= numericUpDownSeconds.Minimum && adjustSeconds <= numericUpDownSeconds.Maximum) + { + numericUpDownSeconds.Value = adjustSeconds; + } + + int adjustPercent = Configuration.Settings.Tools.AdjustDurationPercent; + if (adjustPercent >= numericUpDownPercent.Minimum && adjustPercent <= numericUpDownPercent.Maximum) + { + numericUpDownPercent.Value = adjustPercent; + } + + numericUpDownOptimalCharsSec.Value = (decimal)Configuration.Settings.General.SubtitleOptimalCharactersPerSeconds; + numericUpDownMaxCharsSec.Value = (decimal)Configuration.Settings.General.SubtitleMaximumCharactersPerSeconds; + + checkBoxExtendOnly.Checked = Configuration.Settings.Tools.AdjustDurationExtendOnly; + + LanguageStructure.AdjustDisplayDuration language = Configuration.Settings.Language.AdjustDisplayDuration; + Text = language.Title; + groupBoxAdjustVia.Text = language.AdjustVia; + radioButtonSeconds.Text = language.Seconds; + radioButtonPercent.Text = language.Percent; + radioButtonAutoRecalculate.Text = language.Recalculate; + labelOptimalCharsSec.Text = Configuration.Settings.Language.Settings.OptimalCharactersPerSecond; + labelMaxCharsPerSecond.Text = Configuration.Settings.Language.Settings.MaximumCharactersPerSecond; + labelAddSeconds.Text = language.AddSeconds; + labelAddInPercent.Text = language.SetAsPercent; + labelNote.Text = language.Note; + radioButtonFixed.Text = language.Fixed; + labelMillisecondsFixed.Text = language.Milliseconds; + checkBoxExtendOnly.Text = language.ExtendOnly; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + FixLargeFonts(); + + switch (Configuration.Settings.Tools.AdjustDurationLast) + { + case Sec: + radioButtonSeconds.Checked = true; + break; + case Per: + radioButtonPercent.Checked = true; + break; + case Recal: + radioButtonAutoRecalculate.Checked = true; + break; + case Fixed: + radioButtonFixed.Checked = true; + break; + } + FixEnabled(); + } + + private void FixLargeFonts() + { + if (labelNote.Left + labelNote.Width + 5 > Width) + { + Width = labelNote.Left + labelNote.Width + 5; + } + + UiUtil.FixLargeFonts(this, buttonOK); + } + + private void FormAdjustDisplayTime_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + private void RadioButtonPercentCheckedChanged(object sender, EventArgs e) + { + FixEnabled(); + } + + private void FixEnabled() + { + numericUpDownPercent.Enabled = radioButtonPercent.Checked; + numericUpDownSeconds.Enabled = radioButtonSeconds.Checked; + numericUpDownMaxCharsSec.Enabled = radioButtonAutoRecalculate.Checked; + numericUpDownOptimalCharsSec.Enabled = radioButtonAutoRecalculate.Checked; + checkBoxExtendOnly.Enabled = radioButtonAutoRecalculate.Checked; + numericUpDownFixedMilliseconds.Enabled = radioButtonFixed.Checked; + } + + private void RadioButtonSecondsCheckedChanged(object sender, EventArgs e) + { + FixEnabled(); + } + + private void ButtonOkClick(object sender, EventArgs e) + { + Configuration.Settings.Tools.AdjustDurationSeconds = numericUpDownSeconds.Value; + Configuration.Settings.Tools.AdjustDurationPercent = (int)numericUpDownPercent.Value; + Configuration.Settings.Tools.AdjustDurationExtendOnly = checkBoxExtendOnly.Checked; + + if (radioButtonSeconds.Checked) + { + Configuration.Settings.Tools.AdjustDurationLast = Sec; + } + else if (radioButtonPercent.Checked) + { + Configuration.Settings.Tools.AdjustDurationLast = Per; + } + else if (radioButtonAutoRecalculate.Checked) + { + Configuration.Settings.Tools.AdjustDurationLast = Recal; + } + else if (radioButtonFixed.Checked) + { + Configuration.Settings.Tools.AdjustDurationLast = Fixed; + } + + DialogResult = DialogResult.OK; + } + + public void HideRecalculate() + { + if (radioButtonAutoRecalculate.Checked) + { + radioButtonSeconds.Checked = true; + } + + radioButtonAutoRecalculate.Visible = false; + labelMaxCharsPerSecond.Visible = false; + numericUpDownMaxCharsSec.Visible = false; + } + + private void radioButton1_CheckedChanged(object sender, EventArgs e) + { + FixEnabled(); + } + + private void radioButtonAutoRecalculate_CheckedChanged(object sender, EventArgs e) + { + FixEnabled(); + } + } +} diff --git a/src/Forms/AdjustDisplayDuration.resx b/src/ui/Forms/AdjustDisplayDuration.resx similarity index 97% rename from src/Forms/AdjustDisplayDuration.resx rename to src/ui/Forms/AdjustDisplayDuration.resx index c7e0d4bdf..d58980a38 100644 --- a/src/Forms/AdjustDisplayDuration.resx +++ b/src/ui/Forms/AdjustDisplayDuration.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Forms/AlignmentPicker.Designer.cs b/src/ui/Forms/AlignmentPicker.Designer.cs similarity index 97% rename from src/Forms/AlignmentPicker.Designer.cs rename to src/ui/Forms/AlignmentPicker.Designer.cs index 1bd08208b..9e83792ad 100644 --- a/src/Forms/AlignmentPicker.Designer.cs +++ b/src/ui/Forms/AlignmentPicker.Designer.cs @@ -1,178 +1,178 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class AlignmentPicker - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.panel1 = new System.Windows.Forms.Panel(); - this.button9 = new System.Windows.Forms.Button(); - this.button8 = new System.Windows.Forms.Button(); - this.button7 = new System.Windows.Forms.Button(); - this.button6 = new System.Windows.Forms.Button(); - this.button5 = new System.Windows.Forms.Button(); - this.button4 = new System.Windows.Forms.Button(); - this.button3 = new System.Windows.Forms.Button(); - this.button2 = new System.Windows.Forms.Button(); - this.button1 = new System.Windows.Forms.Button(); - this.panel1.SuspendLayout(); - this.SuspendLayout(); - // - // panel1 - // - this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; - this.panel1.Controls.Add(this.button9); - this.panel1.Controls.Add(this.button8); - this.panel1.Controls.Add(this.button7); - this.panel1.Controls.Add(this.button6); - this.panel1.Controls.Add(this.button5); - this.panel1.Controls.Add(this.button4); - this.panel1.Controls.Add(this.button3); - this.panel1.Controls.Add(this.button2); - this.panel1.Controls.Add(this.button1); - this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; - this.panel1.Location = new System.Drawing.Point(0, 0); - this.panel1.Name = "panel1"; - this.panel1.Size = new System.Drawing.Size(309, 106); - this.panel1.TabIndex = 0; - // - // button9 - // - this.button9.Location = new System.Drawing.Point(202, 68); - this.button9.Name = "button9"; - this.button9.Size = new System.Drawing.Size(90, 23); - this.button9.TabIndex = 9; - this.button9.UseVisualStyleBackColor = true; - this.button9.Click += new System.EventHandler(this.button9_Click); - // - // button8 - // - this.button8.Location = new System.Drawing.Point(106, 68); - this.button8.Name = "button8"; - this.button8.Size = new System.Drawing.Size(90, 23); - this.button8.TabIndex = 8; - this.button8.UseVisualStyleBackColor = true; - this.button8.Click += new System.EventHandler(this.button8_Click); - // - // button7 - // - this.button7.Location = new System.Drawing.Point(10, 68); - this.button7.Name = "button7"; - this.button7.Size = new System.Drawing.Size(90, 23); - this.button7.TabIndex = 7; - this.button7.UseVisualStyleBackColor = true; - this.button7.Click += new System.EventHandler(this.button7_Click); - // - // button6 - // - this.button6.Location = new System.Drawing.Point(202, 39); - this.button6.Name = "button6"; - this.button6.Size = new System.Drawing.Size(90, 23); - this.button6.TabIndex = 6; - this.button6.UseVisualStyleBackColor = true; - this.button6.Click += new System.EventHandler(this.button6_Click); - // - // button5 - // - this.button5.Location = new System.Drawing.Point(106, 39); - this.button5.Name = "button5"; - this.button5.Size = new System.Drawing.Size(90, 23); - this.button5.TabIndex = 5; - this.button5.UseVisualStyleBackColor = true; - this.button5.Click += new System.EventHandler(this.button5_Click); - // - // button4 - // - this.button4.Location = new System.Drawing.Point(10, 39); - this.button4.Name = "button4"; - this.button4.Size = new System.Drawing.Size(90, 23); - this.button4.TabIndex = 4; - this.button4.UseVisualStyleBackColor = true; - this.button4.Click += new System.EventHandler(this.button4_Click); - // - // button3 - // - this.button3.Location = new System.Drawing.Point(202, 10); - this.button3.Name = "button3"; - this.button3.Size = new System.Drawing.Size(90, 23); - this.button3.TabIndex = 3; - this.button3.UseVisualStyleBackColor = true; - this.button3.Click += new System.EventHandler(this.button3_Click); - // - // button2 - // - this.button2.Location = new System.Drawing.Point(106, 10); - this.button2.Name = "button2"; - this.button2.Size = new System.Drawing.Size(90, 23); - this.button2.TabIndex = 2; - this.button2.UseVisualStyleBackColor = true; - this.button2.Click += new System.EventHandler(this.button2_Click); - // - // button1 - // - this.button1.Location = new System.Drawing.Point(10, 10); - this.button1.Name = "button1"; - this.button1.Size = new System.Drawing.Size(90, 23); - this.button1.TabIndex = 1; - this.button1.UseVisualStyleBackColor = true; - this.button1.Click += new System.EventHandler(this.button1_Click); - // - // AlignmentPicker - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(309, 106); - this.Controls.Add(this.panel1); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "AlignmentPicker"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.Manual; - this.Text = "Alignment"; - this.Shown += new System.EventHandler(this.AlignmentPicker_Shown); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.AlignmentPicker_KeyDown); - this.panel1.ResumeLayout(false); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Panel panel1; - private System.Windows.Forms.Button button9; - private System.Windows.Forms.Button button8; - private System.Windows.Forms.Button button7; - private System.Windows.Forms.Button button6; - private System.Windows.Forms.Button button5; - private System.Windows.Forms.Button button4; - private System.Windows.Forms.Button button3; - private System.Windows.Forms.Button button2; - private System.Windows.Forms.Button button1; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class AlignmentPicker + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.panel1 = new System.Windows.Forms.Panel(); + this.button9 = new System.Windows.Forms.Button(); + this.button8 = new System.Windows.Forms.Button(); + this.button7 = new System.Windows.Forms.Button(); + this.button6 = new System.Windows.Forms.Button(); + this.button5 = new System.Windows.Forms.Button(); + this.button4 = new System.Windows.Forms.Button(); + this.button3 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.button1 = new System.Windows.Forms.Button(); + this.panel1.SuspendLayout(); + this.SuspendLayout(); + // + // panel1 + // + this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.panel1.Controls.Add(this.button9); + this.panel1.Controls.Add(this.button8); + this.panel1.Controls.Add(this.button7); + this.panel1.Controls.Add(this.button6); + this.panel1.Controls.Add(this.button5); + this.panel1.Controls.Add(this.button4); + this.panel1.Controls.Add(this.button3); + this.panel1.Controls.Add(this.button2); + this.panel1.Controls.Add(this.button1); + this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel1.Location = new System.Drawing.Point(0, 0); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(309, 106); + this.panel1.TabIndex = 0; + // + // button9 + // + this.button9.Location = new System.Drawing.Point(202, 68); + this.button9.Name = "button9"; + this.button9.Size = new System.Drawing.Size(90, 23); + this.button9.TabIndex = 9; + this.button9.UseVisualStyleBackColor = true; + this.button9.Click += new System.EventHandler(this.button9_Click); + // + // button8 + // + this.button8.Location = new System.Drawing.Point(106, 68); + this.button8.Name = "button8"; + this.button8.Size = new System.Drawing.Size(90, 23); + this.button8.TabIndex = 8; + this.button8.UseVisualStyleBackColor = true; + this.button8.Click += new System.EventHandler(this.button8_Click); + // + // button7 + // + this.button7.Location = new System.Drawing.Point(10, 68); + this.button7.Name = "button7"; + this.button7.Size = new System.Drawing.Size(90, 23); + this.button7.TabIndex = 7; + this.button7.UseVisualStyleBackColor = true; + this.button7.Click += new System.EventHandler(this.button7_Click); + // + // button6 + // + this.button6.Location = new System.Drawing.Point(202, 39); + this.button6.Name = "button6"; + this.button6.Size = new System.Drawing.Size(90, 23); + this.button6.TabIndex = 6; + this.button6.UseVisualStyleBackColor = true; + this.button6.Click += new System.EventHandler(this.button6_Click); + // + // button5 + // + this.button5.Location = new System.Drawing.Point(106, 39); + this.button5.Name = "button5"; + this.button5.Size = new System.Drawing.Size(90, 23); + this.button5.TabIndex = 5; + this.button5.UseVisualStyleBackColor = true; + this.button5.Click += new System.EventHandler(this.button5_Click); + // + // button4 + // + this.button4.Location = new System.Drawing.Point(10, 39); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(90, 23); + this.button4.TabIndex = 4; + this.button4.UseVisualStyleBackColor = true; + this.button4.Click += new System.EventHandler(this.button4_Click); + // + // button3 + // + this.button3.Location = new System.Drawing.Point(202, 10); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(90, 23); + this.button3.TabIndex = 3; + this.button3.UseVisualStyleBackColor = true; + this.button3.Click += new System.EventHandler(this.button3_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(106, 10); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(90, 23); + this.button2.TabIndex = 2; + this.button2.UseVisualStyleBackColor = true; + this.button2.Click += new System.EventHandler(this.button2_Click); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(10, 10); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(90, 23); + this.button1.TabIndex = 1; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // AlignmentPicker + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(309, 106); + this.Controls.Add(this.panel1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "AlignmentPicker"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.Manual; + this.Text = "Alignment"; + this.Shown += new System.EventHandler(this.AlignmentPicker_Shown); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.AlignmentPicker_KeyDown); + this.panel1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Button button9; + private System.Windows.Forms.Button button8; + private System.Windows.Forms.Button button7; + private System.Windows.Forms.Button button6; + private System.Windows.Forms.Button button5; + private System.Windows.Forms.Button button4; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button1; + } } \ No newline at end of file diff --git a/src/Forms/AlignmentPicker.cs b/src/ui/Forms/AlignmentPicker.cs similarity index 96% rename from src/Forms/AlignmentPicker.cs rename to src/ui/Forms/AlignmentPicker.cs index 6062c9a76..bf63cc4f8 100644 --- a/src/Forms/AlignmentPicker.cs +++ b/src/ui/Forms/AlignmentPicker.cs @@ -1,145 +1,145 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Drawing; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class AlignmentPicker : Form - { - public ContentAlignment Alignment { get; private set; } - private readonly string _text; - - public AlignmentPicker(string text) - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - Text = Configuration.Settings.Language.SubStationAlphaStyles.Alignment; - - button1.Text = Configuration.Settings.Language.SubStationAlphaStyles.TopLeft; - button2.Text = Configuration.Settings.Language.SubStationAlphaStyles.TopCenter; - button3.Text = Configuration.Settings.Language.SubStationAlphaStyles.TopRight; - - button4.Text = Configuration.Settings.Language.SubStationAlphaStyles.MiddleLeft; - button5.Text = Configuration.Settings.Language.SubStationAlphaStyles.MiddleCenter; - button6.Text = Configuration.Settings.Language.SubStationAlphaStyles.MiddleRight; - - button7.Text = Configuration.Settings.Language.SubStationAlphaStyles.BottomLeft; - button8.Text = Configuration.Settings.Language.SubStationAlphaStyles.BottomCenter; - button9.Text = Configuration.Settings.Language.SubStationAlphaStyles.BottomRight; - - UiUtil.FixLargeFonts(this, button1); - _text = text; - } - - public void Done() - { - DialogResult = DialogResult.OK; - } - - private void button1_Click(object sender, EventArgs e) - { - Alignment = ContentAlignment.TopLeft; - Done(); - } - - private void button2_Click(object sender, EventArgs e) - { - Alignment = ContentAlignment.TopCenter; - Done(); - } - - private void button3_Click(object sender, EventArgs e) - { - Alignment = ContentAlignment.TopRight; - Done(); - } - - private void button4_Click(object sender, EventArgs e) - { - Alignment = ContentAlignment.MiddleLeft; - Done(); - } - - private void button5_Click(object sender, EventArgs e) - { - Alignment = ContentAlignment.MiddleCenter; - Done(); - } - - private void button6_Click(object sender, EventArgs e) - { - Alignment = ContentAlignment.MiddleRight; - Done(); - } - - private void button7_Click(object sender, EventArgs e) - { - Alignment = ContentAlignment.BottomLeft; - Done(); - } - - private void button8_Click(object sender, EventArgs e) - { - Alignment = ContentAlignment.BottomCenter; - Done(); - } - - private void button9_Click(object sender, EventArgs e) - { - Alignment = ContentAlignment.BottomRight; - Done(); - } - - private void AlignmentPicker_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - private void AlignmentPicker_Shown(object sender, EventArgs e) - { - if (_text.StartsWith("{\\an7}", StringComparison.Ordinal)) - { - button1.Focus(); - } - else if (_text.StartsWith("{\\an8}", StringComparison.Ordinal)) - { - button2.Focus(); - } - else if (_text.StartsWith("{\\an9}", StringComparison.Ordinal)) - { - button3.Focus(); - } - else if (_text.StartsWith("{\\an4}", StringComparison.Ordinal)) - { - button4.Focus(); - } - else if (_text.StartsWith("{\\an5}", StringComparison.Ordinal)) - { - button5.Focus(); - } - else if (_text.StartsWith("{\\an6}", StringComparison.Ordinal)) - { - button6.Focus(); - } - else if (_text.StartsWith("{\\an1}", StringComparison.Ordinal)) - { - button7.Focus(); - } - else if (_text.StartsWith("{\\an3}", StringComparison.Ordinal)) - { - button9.Focus(); - } - else - { - button8.Focus(); - } - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Drawing; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class AlignmentPicker : Form + { + public ContentAlignment Alignment { get; private set; } + private readonly string _text; + + public AlignmentPicker(string text) + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + Text = Configuration.Settings.Language.SubStationAlphaStyles.Alignment; + + button1.Text = Configuration.Settings.Language.SubStationAlphaStyles.TopLeft; + button2.Text = Configuration.Settings.Language.SubStationAlphaStyles.TopCenter; + button3.Text = Configuration.Settings.Language.SubStationAlphaStyles.TopRight; + + button4.Text = Configuration.Settings.Language.SubStationAlphaStyles.MiddleLeft; + button5.Text = Configuration.Settings.Language.SubStationAlphaStyles.MiddleCenter; + button6.Text = Configuration.Settings.Language.SubStationAlphaStyles.MiddleRight; + + button7.Text = Configuration.Settings.Language.SubStationAlphaStyles.BottomLeft; + button8.Text = Configuration.Settings.Language.SubStationAlphaStyles.BottomCenter; + button9.Text = Configuration.Settings.Language.SubStationAlphaStyles.BottomRight; + + UiUtil.FixLargeFonts(this, button1); + _text = text; + } + + public void Done() + { + DialogResult = DialogResult.OK; + } + + private void button1_Click(object sender, EventArgs e) + { + Alignment = ContentAlignment.TopLeft; + Done(); + } + + private void button2_Click(object sender, EventArgs e) + { + Alignment = ContentAlignment.TopCenter; + Done(); + } + + private void button3_Click(object sender, EventArgs e) + { + Alignment = ContentAlignment.TopRight; + Done(); + } + + private void button4_Click(object sender, EventArgs e) + { + Alignment = ContentAlignment.MiddleLeft; + Done(); + } + + private void button5_Click(object sender, EventArgs e) + { + Alignment = ContentAlignment.MiddleCenter; + Done(); + } + + private void button6_Click(object sender, EventArgs e) + { + Alignment = ContentAlignment.MiddleRight; + Done(); + } + + private void button7_Click(object sender, EventArgs e) + { + Alignment = ContentAlignment.BottomLeft; + Done(); + } + + private void button8_Click(object sender, EventArgs e) + { + Alignment = ContentAlignment.BottomCenter; + Done(); + } + + private void button9_Click(object sender, EventArgs e) + { + Alignment = ContentAlignment.BottomRight; + Done(); + } + + private void AlignmentPicker_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + private void AlignmentPicker_Shown(object sender, EventArgs e) + { + if (_text.StartsWith("{\\an7}", StringComparison.Ordinal)) + { + button1.Focus(); + } + else if (_text.StartsWith("{\\an8}", StringComparison.Ordinal)) + { + button2.Focus(); + } + else if (_text.StartsWith("{\\an9}", StringComparison.Ordinal)) + { + button3.Focus(); + } + else if (_text.StartsWith("{\\an4}", StringComparison.Ordinal)) + { + button4.Focus(); + } + else if (_text.StartsWith("{\\an5}", StringComparison.Ordinal)) + { + button5.Focus(); + } + else if (_text.StartsWith("{\\an6}", StringComparison.Ordinal)) + { + button6.Focus(); + } + else if (_text.StartsWith("{\\an1}", StringComparison.Ordinal)) + { + button7.Focus(); + } + else if (_text.StartsWith("{\\an3}", StringComparison.Ordinal)) + { + button9.Focus(); + } + else + { + button8.Focus(); + } + } + } +} diff --git a/src/Forms/BatchConvertMkvEnding.resx b/src/ui/Forms/AlignmentPicker.resx similarity index 100% rename from src/Forms/BatchConvertMkvEnding.resx rename to src/ui/Forms/AlignmentPicker.resx diff --git a/src/Forms/AlignmentPickerJapanese.Designer.cs b/src/ui/Forms/AlignmentPickerJapanese.Designer.cs similarity index 100% rename from src/Forms/AlignmentPickerJapanese.Designer.cs rename to src/ui/Forms/AlignmentPickerJapanese.Designer.cs diff --git a/src/Forms/AlignmentPickerJapanese.cs b/src/ui/Forms/AlignmentPickerJapanese.cs similarity index 100% rename from src/Forms/AlignmentPickerJapanese.cs rename to src/ui/Forms/AlignmentPickerJapanese.cs diff --git a/src/Forms/BookmarkAdd.resx b/src/ui/Forms/AlignmentPickerJapanese.resx similarity index 100% rename from src/Forms/BookmarkAdd.resx rename to src/ui/Forms/AlignmentPickerJapanese.resx diff --git a/src/Forms/ApplyDurationLimits.Designer.cs b/src/ui/Forms/ApplyDurationLimits.Designer.cs similarity index 98% rename from src/Forms/ApplyDurationLimits.Designer.cs rename to src/ui/Forms/ApplyDurationLimits.Designer.cs index fc2f40075..3f04f0d9c 100644 --- a/src/Forms/ApplyDurationLimits.Designer.cs +++ b/src/ui/Forms/ApplyDurationLimits.Designer.cs @@ -1,360 +1,360 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class ApplyDurationLimits - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.numericUpDownDurationMax = new System.Windows.Forms.NumericUpDown(); - this.numericUpDownDurationMin = new System.Windows.Forms.NumericUpDown(); - this.labelNote = new System.Windows.Forms.Label(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.groupBoxFixesAvailable = new System.Windows.Forms.GroupBox(); - this.listViewFixes = new System.Windows.Forms.ListView(); - this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader7 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader8 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.groupBoxUnfixable = new System.Windows.Forms.GroupBox(); - this.subtitleListView1 = new Nikse.SubtitleEdit.Controls.SubtitleListView(); - this.splitContainer1 = new System.Windows.Forms.SplitContainer(); - this.checkBoxMinDuration = new System.Windows.Forms.CheckBox(); - this.checkBoxMaxDuration = new System.Windows.Forms.CheckBox(); - this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); - this.toolStripMenuItemSelectAll = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemInverseSelection = new System.Windows.Forms.ToolStripMenuItem(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDurationMax)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDurationMin)).BeginInit(); - this.groupBoxFixesAvailable.SuspendLayout(); - this.groupBoxUnfixable.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); - this.splitContainer1.Panel1.SuspendLayout(); - this.splitContainer1.Panel2.SuspendLayout(); - this.splitContainer1.SuspendLayout(); - this.contextMenuStrip1.SuspendLayout(); - this.SuspendLayout(); - // - // numericUpDownDurationMax - // - this.numericUpDownDurationMax.Location = new System.Drawing.Point(191, 38); - this.numericUpDownDurationMax.Maximum = new decimal(new int[] { - 50000, - 0, - 0, - 0}); - this.numericUpDownDurationMax.Minimum = new decimal(new int[] { - 3000, - 0, - 0, - 0}); - this.numericUpDownDurationMax.Name = "numericUpDownDurationMax"; - this.numericUpDownDurationMax.Size = new System.Drawing.Size(56, 20); - this.numericUpDownDurationMax.TabIndex = 4; - this.numericUpDownDurationMax.Value = new decimal(new int[] { - 50000, - 0, - 0, - 0}); - this.numericUpDownDurationMax.ValueChanged += new System.EventHandler(this.numericUpDownDurationMax_ValueChanged); - this.numericUpDownDurationMax.KeyUp += new System.Windows.Forms.KeyEventHandler(this.numericUpDownDurationMax_KeyUp); - this.numericUpDownDurationMax.MouseUp += new System.Windows.Forms.MouseEventHandler(this.numericUpDownDurationMax_MouseUp); - // - // numericUpDownDurationMin - // - this.numericUpDownDurationMin.Location = new System.Drawing.Point(191, 12); - this.numericUpDownDurationMin.Maximum = new decimal(new int[] { - 3000, - 0, - 0, - 0}); - this.numericUpDownDurationMin.Minimum = new decimal(new int[] { - 100, - 0, - 0, - 0}); - this.numericUpDownDurationMin.Name = "numericUpDownDurationMin"; - this.numericUpDownDurationMin.Size = new System.Drawing.Size(56, 20); - this.numericUpDownDurationMin.TabIndex = 2; - this.numericUpDownDurationMin.Value = new decimal(new int[] { - 100, - 0, - 0, - 0}); - this.numericUpDownDurationMin.ValueChanged += new System.EventHandler(this.numericUpDownDurationMin_ValueChanged); - this.numericUpDownDurationMin.KeyUp += new System.Windows.Forms.KeyEventHandler(this.numericUpDownDurationMin_KeyUp); - this.numericUpDownDurationMin.MouseUp += new System.Windows.Forms.MouseEventHandler(this.numericUpDownDurationMin_MouseUp); - // - // labelNote - // - this.labelNote.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelNote.AutoSize = true; - this.labelNote.Location = new System.Drawing.Point(19, 542); - this.labelNote.Name = "labelNote"; - this.labelNote.Size = new System.Drawing.Size(265, 13); - this.labelNote.TabIndex = 53; - this.labelNote.Text = "Note: Display time will not overlap start time of next text"; - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(874, 538); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 110; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(793, 538); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 100; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // groupBoxFixesAvailable - // - this.groupBoxFixesAvailable.Controls.Add(this.listViewFixes); - this.groupBoxFixesAvailable.Dock = System.Windows.Forms.DockStyle.Fill; - this.groupBoxFixesAvailable.Location = new System.Drawing.Point(0, 0); - this.groupBoxFixesAvailable.Name = "groupBoxFixesAvailable"; - this.groupBoxFixesAvailable.Size = new System.Drawing.Size(931, 302); - this.groupBoxFixesAvailable.TabIndex = 5; - this.groupBoxFixesAvailable.TabStop = false; - this.groupBoxFixesAvailable.Text = "Fixes available: {0}"; - // - // listViewFixes - // - this.listViewFixes.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.listViewFixes.CheckBoxes = true; - this.listViewFixes.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeader4, - this.columnHeader5, - this.columnHeader7, - this.columnHeader8}); - this.listViewFixes.ContextMenuStrip = this.contextMenuStrip1; - this.listViewFixes.FullRowSelect = true; - this.listViewFixes.HideSelection = false; - this.listViewFixes.Location = new System.Drawing.Point(6, 23); - this.listViewFixes.Name = "listViewFixes"; - this.listViewFixes.Size = new System.Drawing.Size(919, 273); - this.listViewFixes.TabIndex = 6; - this.listViewFixes.UseCompatibleStateImageBehavior = false; - this.listViewFixes.View = System.Windows.Forms.View.Details; - this.listViewFixes.SelectedIndexChanged += new System.EventHandler(this.listViewFixes_SelectedIndexChanged); - // - // columnHeader4 - // - this.columnHeader4.Text = "Apply"; - this.columnHeader4.Width = 50; - // - // columnHeader5 - // - this.columnHeader5.Text = "Line#"; - this.columnHeader5.Width = 61; - // - // columnHeader7 - // - this.columnHeader7.Text = "Before"; - this.columnHeader7.Width = 390; - // - // columnHeader8 - // - this.columnHeader8.Text = "After"; - this.columnHeader8.Width = 390; - // - // groupBoxUnfixable - // - this.groupBoxUnfixable.Controls.Add(this.subtitleListView1); - this.groupBoxUnfixable.Dock = System.Windows.Forms.DockStyle.Fill; - this.groupBoxUnfixable.Location = new System.Drawing.Point(0, 0); - this.groupBoxUnfixable.Name = "groupBoxUnfixable"; - this.groupBoxUnfixable.Size = new System.Drawing.Size(931, 154); - this.groupBoxUnfixable.TabIndex = 51; - this.groupBoxUnfixable.TabStop = false; - this.groupBoxUnfixable.Text = "Unable to fix min duration: {0}"; - // - // subtitleListView1 - // - this.subtitleListView1.AllowColumnReorder = true; - this.subtitleListView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.subtitleListView1.FirstVisibleIndex = -1; - this.subtitleListView1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.subtitleListView1.FullRowSelect = true; - this.subtitleListView1.GridLines = true; - this.subtitleListView1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; - this.subtitleListView1.HideSelection = false; - this.subtitleListView1.Location = new System.Drawing.Point(6, 19); - this.subtitleListView1.Name = "subtitleListView1"; - this.subtitleListView1.OwnerDraw = true; - this.subtitleListView1.Size = new System.Drawing.Size(919, 129); - this.subtitleListView1.SubtitleFontBold = false; - this.subtitleListView1.SubtitleFontName = "Tahoma"; - this.subtitleListView1.SubtitleFontSize = 8; - this.subtitleListView1.TabIndex = 52; - this.subtitleListView1.UseCompatibleStateImageBehavior = false; - this.subtitleListView1.UseSyntaxColoring = true; - this.subtitleListView1.View = System.Windows.Forms.View.Details; - // - // splitContainer1 - // - this.splitContainer1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.splitContainer1.Location = new System.Drawing.Point(16, 72); - this.splitContainer1.Name = "splitContainer1"; - this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; - // - // splitContainer1.Panel1 - // - this.splitContainer1.Panel1.Controls.Add(this.groupBoxFixesAvailable); - this.splitContainer1.Panel1MinSize = 100; - // - // splitContainer1.Panel2 - // - this.splitContainer1.Panel2.Controls.Add(this.groupBoxUnfixable); - this.splitContainer1.Panel2MinSize = 100; - this.splitContainer1.Size = new System.Drawing.Size(931, 460); - this.splitContainer1.SplitterDistance = 302; - this.splitContainer1.TabIndex = 54; - this.splitContainer1.TabStop = false; - // - // checkBoxMinDuration - // - this.checkBoxMinDuration.AutoSize = true; - this.checkBoxMinDuration.Location = new System.Drawing.Point(16, 13); - this.checkBoxMinDuration.Name = "checkBoxMinDuration"; - this.checkBoxMinDuration.Size = new System.Drawing.Size(149, 17); - this.checkBoxMinDuration.TabIndex = 1; - this.checkBoxMinDuration.Text = "Min. duration, milliseconds"; - this.checkBoxMinDuration.UseVisualStyleBackColor = true; - this.checkBoxMinDuration.CheckedChanged += new System.EventHandler(this.checkBoxMinDuration_CheckedChanged); - // - // checkBoxMaxDuration - // - this.checkBoxMaxDuration.AutoSize = true; - this.checkBoxMaxDuration.Location = new System.Drawing.Point(16, 39); - this.checkBoxMaxDuration.Name = "checkBoxMaxDuration"; - this.checkBoxMaxDuration.Size = new System.Drawing.Size(152, 17); - this.checkBoxMaxDuration.TabIndex = 3; - this.checkBoxMaxDuration.Text = "Max. duration, milliseconds"; - this.checkBoxMaxDuration.UseVisualStyleBackColor = true; - this.checkBoxMaxDuration.CheckedChanged += new System.EventHandler(this.checkBoxMaxDuration_CheckedChanged); - // - // contextMenuStrip1 - // - this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripMenuItemSelectAll, - this.toolStripMenuItemInverseSelection}); - this.contextMenuStrip1.Name = "contextMenuStrip1"; - this.contextMenuStrip1.Size = new System.Drawing.Size(181, 70); - // - // toolStripMenuItemSelectAll - // - this.toolStripMenuItemSelectAll.Name = "toolStripMenuItemSelectAll"; - this.toolStripMenuItemSelectAll.Size = new System.Drawing.Size(180, 22); - this.toolStripMenuItemSelectAll.Text = "Select all"; - this.toolStripMenuItemSelectAll.Click += new System.EventHandler(this.toolStripMenuItemSelectAll_Click); - // - // toolStripMenuItemInverseSelection - // - this.toolStripMenuItemInverseSelection.Name = "toolStripMenuItemInverseSelection"; - this.toolStripMenuItemInverseSelection.Size = new System.Drawing.Size(180, 22); - this.toolStripMenuItemInverseSelection.Text = "Inverse selection"; - this.toolStripMenuItemInverseSelection.Click += new System.EventHandler(this.toolStripMenuItemInverseSelection_Click); - // - // ApplyDurationLimits - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(961, 571); - this.Controls.Add(this.checkBoxMaxDuration); - this.Controls.Add(this.checkBoxMinDuration); - this.Controls.Add(this.splitContainer1); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.labelNote); - this.Controls.Add(this.numericUpDownDurationMax); - this.Controls.Add(this.numericUpDownDurationMin); - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(620, 440); - this.Name = "ApplyDurationLimits"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Apply duration limits"; - this.Shown += new System.EventHandler(this.ApplyDurationLimits_Shown); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ApplyDurationLimits_KeyDown); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDurationMax)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDurationMin)).EndInit(); - this.groupBoxFixesAvailable.ResumeLayout(false); - this.groupBoxUnfixable.ResumeLayout(false); - this.splitContainer1.Panel1.ResumeLayout(false); - this.splitContainer1.Panel2.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); - this.splitContainer1.ResumeLayout(false); - this.contextMenuStrip1.ResumeLayout(false); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - private System.Windows.Forms.NumericUpDown numericUpDownDurationMax; - private System.Windows.Forms.NumericUpDown numericUpDownDurationMin; - private System.Windows.Forms.Label labelNote; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.GroupBox groupBoxFixesAvailable; - private System.Windows.Forms.ListView listViewFixes; - private System.Windows.Forms.ColumnHeader columnHeader4; - private System.Windows.Forms.ColumnHeader columnHeader5; - private System.Windows.Forms.ColumnHeader columnHeader7; - private System.Windows.Forms.ColumnHeader columnHeader8; - private System.Windows.Forms.GroupBox groupBoxUnfixable; - private Controls.SubtitleListView subtitleListView1; - private System.Windows.Forms.SplitContainer splitContainer1; - private System.Windows.Forms.CheckBox checkBoxMinDuration; - private System.Windows.Forms.CheckBox checkBoxMaxDuration; - private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSelectAll; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInverseSelection; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class ApplyDurationLimits + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.numericUpDownDurationMax = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownDurationMin = new System.Windows.Forms.NumericUpDown(); + this.labelNote = new System.Windows.Forms.Label(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.groupBoxFixesAvailable = new System.Windows.Forms.GroupBox(); + this.listViewFixes = new System.Windows.Forms.ListView(); + this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader7 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader8 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.groupBoxUnfixable = new System.Windows.Forms.GroupBox(); + this.subtitleListView1 = new Nikse.SubtitleEdit.Controls.SubtitleListView(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.checkBoxMinDuration = new System.Windows.Forms.CheckBox(); + this.checkBoxMaxDuration = new System.Windows.Forms.CheckBox(); + this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItemSelectAll = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemInverseSelection = new System.Windows.Forms.ToolStripMenuItem(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDurationMax)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDurationMin)).BeginInit(); + this.groupBoxFixesAvailable.SuspendLayout(); + this.groupBoxUnfixable.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.contextMenuStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // numericUpDownDurationMax + // + this.numericUpDownDurationMax.Location = new System.Drawing.Point(191, 38); + this.numericUpDownDurationMax.Maximum = new decimal(new int[] { + 50000, + 0, + 0, + 0}); + this.numericUpDownDurationMax.Minimum = new decimal(new int[] { + 3000, + 0, + 0, + 0}); + this.numericUpDownDurationMax.Name = "numericUpDownDurationMax"; + this.numericUpDownDurationMax.Size = new System.Drawing.Size(56, 20); + this.numericUpDownDurationMax.TabIndex = 4; + this.numericUpDownDurationMax.Value = new decimal(new int[] { + 50000, + 0, + 0, + 0}); + this.numericUpDownDurationMax.ValueChanged += new System.EventHandler(this.numericUpDownDurationMax_ValueChanged); + this.numericUpDownDurationMax.KeyUp += new System.Windows.Forms.KeyEventHandler(this.numericUpDownDurationMax_KeyUp); + this.numericUpDownDurationMax.MouseUp += new System.Windows.Forms.MouseEventHandler(this.numericUpDownDurationMax_MouseUp); + // + // numericUpDownDurationMin + // + this.numericUpDownDurationMin.Location = new System.Drawing.Point(191, 12); + this.numericUpDownDurationMin.Maximum = new decimal(new int[] { + 3000, + 0, + 0, + 0}); + this.numericUpDownDurationMin.Minimum = new decimal(new int[] { + 100, + 0, + 0, + 0}); + this.numericUpDownDurationMin.Name = "numericUpDownDurationMin"; + this.numericUpDownDurationMin.Size = new System.Drawing.Size(56, 20); + this.numericUpDownDurationMin.TabIndex = 2; + this.numericUpDownDurationMin.Value = new decimal(new int[] { + 100, + 0, + 0, + 0}); + this.numericUpDownDurationMin.ValueChanged += new System.EventHandler(this.numericUpDownDurationMin_ValueChanged); + this.numericUpDownDurationMin.KeyUp += new System.Windows.Forms.KeyEventHandler(this.numericUpDownDurationMin_KeyUp); + this.numericUpDownDurationMin.MouseUp += new System.Windows.Forms.MouseEventHandler(this.numericUpDownDurationMin_MouseUp); + // + // labelNote + // + this.labelNote.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelNote.AutoSize = true; + this.labelNote.Location = new System.Drawing.Point(19, 542); + this.labelNote.Name = "labelNote"; + this.labelNote.Size = new System.Drawing.Size(265, 13); + this.labelNote.TabIndex = 53; + this.labelNote.Text = "Note: Display time will not overlap start time of next text"; + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(874, 538); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 110; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(793, 538); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 100; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // groupBoxFixesAvailable + // + this.groupBoxFixesAvailable.Controls.Add(this.listViewFixes); + this.groupBoxFixesAvailable.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupBoxFixesAvailable.Location = new System.Drawing.Point(0, 0); + this.groupBoxFixesAvailable.Name = "groupBoxFixesAvailable"; + this.groupBoxFixesAvailable.Size = new System.Drawing.Size(931, 302); + this.groupBoxFixesAvailable.TabIndex = 5; + this.groupBoxFixesAvailable.TabStop = false; + this.groupBoxFixesAvailable.Text = "Fixes available: {0}"; + // + // listViewFixes + // + this.listViewFixes.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listViewFixes.CheckBoxes = true; + this.listViewFixes.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader4, + this.columnHeader5, + this.columnHeader7, + this.columnHeader8}); + this.listViewFixes.ContextMenuStrip = this.contextMenuStrip1; + this.listViewFixes.FullRowSelect = true; + this.listViewFixes.HideSelection = false; + this.listViewFixes.Location = new System.Drawing.Point(6, 23); + this.listViewFixes.Name = "listViewFixes"; + this.listViewFixes.Size = new System.Drawing.Size(919, 273); + this.listViewFixes.TabIndex = 6; + this.listViewFixes.UseCompatibleStateImageBehavior = false; + this.listViewFixes.View = System.Windows.Forms.View.Details; + this.listViewFixes.SelectedIndexChanged += new System.EventHandler(this.listViewFixes_SelectedIndexChanged); + // + // columnHeader4 + // + this.columnHeader4.Text = "Apply"; + this.columnHeader4.Width = 50; + // + // columnHeader5 + // + this.columnHeader5.Text = "Line#"; + this.columnHeader5.Width = 61; + // + // columnHeader7 + // + this.columnHeader7.Text = "Before"; + this.columnHeader7.Width = 390; + // + // columnHeader8 + // + this.columnHeader8.Text = "After"; + this.columnHeader8.Width = 390; + // + // groupBoxUnfixable + // + this.groupBoxUnfixable.Controls.Add(this.subtitleListView1); + this.groupBoxUnfixable.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupBoxUnfixable.Location = new System.Drawing.Point(0, 0); + this.groupBoxUnfixable.Name = "groupBoxUnfixable"; + this.groupBoxUnfixable.Size = new System.Drawing.Size(931, 154); + this.groupBoxUnfixable.TabIndex = 51; + this.groupBoxUnfixable.TabStop = false; + this.groupBoxUnfixable.Text = "Unable to fix min duration: {0}"; + // + // subtitleListView1 + // + this.subtitleListView1.AllowColumnReorder = true; + this.subtitleListView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.subtitleListView1.FirstVisibleIndex = -1; + this.subtitleListView1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.subtitleListView1.FullRowSelect = true; + this.subtitleListView1.GridLines = true; + this.subtitleListView1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.subtitleListView1.HideSelection = false; + this.subtitleListView1.Location = new System.Drawing.Point(6, 19); + this.subtitleListView1.Name = "subtitleListView1"; + this.subtitleListView1.OwnerDraw = true; + this.subtitleListView1.Size = new System.Drawing.Size(919, 129); + this.subtitleListView1.SubtitleFontBold = false; + this.subtitleListView1.SubtitleFontName = "Tahoma"; + this.subtitleListView1.SubtitleFontSize = 8; + this.subtitleListView1.TabIndex = 52; + this.subtitleListView1.UseCompatibleStateImageBehavior = false; + this.subtitleListView1.UseSyntaxColoring = true; + this.subtitleListView1.View = System.Windows.Forms.View.Details; + // + // splitContainer1 + // + this.splitContainer1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.splitContainer1.Location = new System.Drawing.Point(16, 72); + this.splitContainer1.Name = "splitContainer1"; + this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.groupBoxFixesAvailable); + this.splitContainer1.Panel1MinSize = 100; + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.groupBoxUnfixable); + this.splitContainer1.Panel2MinSize = 100; + this.splitContainer1.Size = new System.Drawing.Size(931, 460); + this.splitContainer1.SplitterDistance = 302; + this.splitContainer1.TabIndex = 54; + this.splitContainer1.TabStop = false; + // + // checkBoxMinDuration + // + this.checkBoxMinDuration.AutoSize = true; + this.checkBoxMinDuration.Location = new System.Drawing.Point(16, 13); + this.checkBoxMinDuration.Name = "checkBoxMinDuration"; + this.checkBoxMinDuration.Size = new System.Drawing.Size(149, 17); + this.checkBoxMinDuration.TabIndex = 1; + this.checkBoxMinDuration.Text = "Min. duration, milliseconds"; + this.checkBoxMinDuration.UseVisualStyleBackColor = true; + this.checkBoxMinDuration.CheckedChanged += new System.EventHandler(this.checkBoxMinDuration_CheckedChanged); + // + // checkBoxMaxDuration + // + this.checkBoxMaxDuration.AutoSize = true; + this.checkBoxMaxDuration.Location = new System.Drawing.Point(16, 39); + this.checkBoxMaxDuration.Name = "checkBoxMaxDuration"; + this.checkBoxMaxDuration.Size = new System.Drawing.Size(152, 17); + this.checkBoxMaxDuration.TabIndex = 3; + this.checkBoxMaxDuration.Text = "Max. duration, milliseconds"; + this.checkBoxMaxDuration.UseVisualStyleBackColor = true; + this.checkBoxMaxDuration.CheckedChanged += new System.EventHandler(this.checkBoxMaxDuration_CheckedChanged); + // + // contextMenuStrip1 + // + this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItemSelectAll, + this.toolStripMenuItemInverseSelection}); + this.contextMenuStrip1.Name = "contextMenuStrip1"; + this.contextMenuStrip1.Size = new System.Drawing.Size(181, 70); + // + // toolStripMenuItemSelectAll + // + this.toolStripMenuItemSelectAll.Name = "toolStripMenuItemSelectAll"; + this.toolStripMenuItemSelectAll.Size = new System.Drawing.Size(180, 22); + this.toolStripMenuItemSelectAll.Text = "Select all"; + this.toolStripMenuItemSelectAll.Click += new System.EventHandler(this.toolStripMenuItemSelectAll_Click); + // + // toolStripMenuItemInverseSelection + // + this.toolStripMenuItemInverseSelection.Name = "toolStripMenuItemInverseSelection"; + this.toolStripMenuItemInverseSelection.Size = new System.Drawing.Size(180, 22); + this.toolStripMenuItemInverseSelection.Text = "Inverse selection"; + this.toolStripMenuItemInverseSelection.Click += new System.EventHandler(this.toolStripMenuItemInverseSelection_Click); + // + // ApplyDurationLimits + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(961, 571); + this.Controls.Add(this.checkBoxMaxDuration); + this.Controls.Add(this.checkBoxMinDuration); + this.Controls.Add(this.splitContainer1); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.labelNote); + this.Controls.Add(this.numericUpDownDurationMax); + this.Controls.Add(this.numericUpDownDurationMin); + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(620, 440); + this.Name = "ApplyDurationLimits"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Apply duration limits"; + this.Shown += new System.EventHandler(this.ApplyDurationLimits_Shown); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ApplyDurationLimits_KeyDown); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDurationMax)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDurationMin)).EndInit(); + this.groupBoxFixesAvailable.ResumeLayout(false); + this.groupBoxUnfixable.ResumeLayout(false); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + this.contextMenuStrip1.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private System.Windows.Forms.NumericUpDown numericUpDownDurationMax; + private System.Windows.Forms.NumericUpDown numericUpDownDurationMin; + private System.Windows.Forms.Label labelNote; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.GroupBox groupBoxFixesAvailable; + private System.Windows.Forms.ListView listViewFixes; + private System.Windows.Forms.ColumnHeader columnHeader4; + private System.Windows.Forms.ColumnHeader columnHeader5; + private System.Windows.Forms.ColumnHeader columnHeader7; + private System.Windows.Forms.ColumnHeader columnHeader8; + private System.Windows.Forms.GroupBox groupBoxUnfixable; + private Controls.SubtitleListView subtitleListView1; + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.CheckBox checkBoxMinDuration; + private System.Windows.Forms.CheckBox checkBoxMaxDuration; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSelectAll; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInverseSelection; + } } \ No newline at end of file diff --git a/src/Forms/ApplyDurationLimits.cs b/src/ui/Forms/ApplyDurationLimits.cs similarity index 97% rename from src/Forms/ApplyDurationLimits.cs rename to src/ui/Forms/ApplyDurationLimits.cs index 16d8a2c55..258c161a3 100644 --- a/src/Forms/ApplyDurationLimits.cs +++ b/src/ui/Forms/ApplyDurationLimits.cs @@ -1,316 +1,316 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Drawing; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class ApplyDurationLimits : PositionAndSizeForm - { - private int _totalFixes; - private int _totalErrors; - private Subtitle _subtitle; - private Subtitle _working; - private bool _onlyListFixes = true; - private readonly Timer _refreshTimer = new Timer(); - private readonly Color _warningColor = Color.FromArgb(255, 253, 145); - private Subtitle _unfixables = new Subtitle(); - - public ApplyDurationLimits() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - Text = Configuration.Settings.Language.ApplyDurationLimits.Title; - checkBoxMinDuration.Text = Configuration.Settings.Language.Settings.DurationMinimumMilliseconds; - checkBoxMaxDuration.Text = Configuration.Settings.Language.Settings.DurationMaximumMilliseconds; - checkBoxMinDuration.Checked = Configuration.Settings.Tools.ApplyMinimumDurationLimit; - checkBoxMaxDuration.Checked = Configuration.Settings.Tools.ApplyMaximumDurationLimit; - labelNote.Text = Configuration.Settings.Language.AdjustDisplayDuration.Note; - numericUpDownDurationMin.Value = Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds; - numericUpDownDurationMax.Value = Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds; - toolStripMenuItemInverseSelection.Text = Configuration.Settings.Language.Main.Menu.Edit.InverseSelection; - toolStripMenuItemSelectAll.Text = Configuration.Settings.Language.Main.Menu.ContextMenu.SelectAll; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - subtitleListView1.InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings); - UiUtil.InitializeSubtitleFont(subtitleListView1); - subtitleListView1.AutoSizeAllColumns(this); - listViewFixes.Columns[0].Text = Configuration.Settings.Language.General.Apply; - listViewFixes.Columns[1].Text = Configuration.Settings.Language.General.LineNumber; - listViewFixes.Columns[2].Text = Configuration.Settings.Language.General.Before; - listViewFixes.Columns[3].Text = Configuration.Settings.Language.General.After; - numericUpDownDurationMin.Left = checkBoxMinDuration.Left + checkBoxMinDuration.Width + 6; - numericUpDownDurationMax.Left = checkBoxMaxDuration.Left + checkBoxMaxDuration.Width + 6; - if (Math.Abs(numericUpDownDurationMin.Left - numericUpDownDurationMax.Left) < 10) - { - numericUpDownDurationMin.Left = Math.Max(numericUpDownDurationMin.Left, numericUpDownDurationMax.Left); - numericUpDownDurationMax.Left = Math.Max(numericUpDownDurationMin.Left, numericUpDownDurationMax.Left); - } - FixLargeFonts(); - _refreshTimer.Interval = 400; - _refreshTimer.Tick += RefreshTimerTick; - UiUtil.FixLargeFonts(this, buttonOK); - } - - private void RefreshTimerTick(object sender, EventArgs e) - { - _refreshTimer.Stop(); - GeneratePreviewReal(); - } - - private void FixLargeFonts() - { - if (labelNote.Right + 5 > Width) - { - Width = labelNote.Right + 5; - } - - UiUtil.FixLargeFonts(this, buttonOK); - } - - public void Initialize(Subtitle subtitle) - { - _subtitle = subtitle; - GeneratePreview(); - } - - private void GeneratePreview() - { - if (_refreshTimer.Enabled) - { - _refreshTimer.Stop(); - } - _refreshTimer.Start(); - } - - private void GeneratePreviewReal() - { - _totalFixes = 0; - _totalErrors = 0; - _onlyListFixes = true; - - _working = new Subtitle(_subtitle); - listViewFixes.BeginUpdate(); - listViewFixes.Items.Clear(); - if (checkBoxMinDuration.Checked) - { - FixShortDisplayTimes(); - } - if (checkBoxMaxDuration.Checked) - { - FixLongDisplayTimes(); - } - listViewFixes.EndUpdate(); - - groupBoxFixesAvailable.Text = string.Format(Configuration.Settings.Language.ApplyDurationLimits.FixesAvailable, _totalFixes); - groupBoxUnfixable.Text = string.Format(Configuration.Settings.Language.ApplyDurationLimits.UnableToFix, _totalErrors); - } - - private void AddFixToListView(Paragraph p, string before, string after, Color backgroundColor) - { - if (_onlyListFixes) - { - var item = new ListViewItem(string.Empty) { Checked = true, Tag = p, BackColor = backgroundColor }; - item.SubItems.Add(p.Number.ToString()); - item.SubItems.Add(UiUtil.GetListViewTextFromString(before)); - item.SubItems.Add(UiUtil.GetListViewTextFromString(after)); - listViewFixes.Items.Add(item); - } - } - - public bool AllowFix(Paragraph p) - { - if (_onlyListFixes) - { - return true; - } - - string ln = p.Number.ToString(); - foreach (ListViewItem item in listViewFixes.Items) - { - if (item.SubItems[1].Text == ln) - { - return item.Checked; - } - } - return false; - } - - private void FixShortDisplayTimes() - { - _unfixables = new Subtitle(); - double minDisplayTime = (double)numericUpDownDurationMin.Value; - for (int i = 0; i < _working.Paragraphs.Count; i++) - { - Paragraph p = _working.Paragraphs[i]; - double displayTime = p.Duration.TotalMilliseconds; - if (displayTime < minDisplayTime) - { - var next = _working.GetParagraphOrDefault(i + 1); - var wantedEndMs = p.StartTime.TotalMilliseconds + minDisplayTime; - if (next == null || wantedEndMs < next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines && AllowFix(p)) - { - AddFix(p, wantedEndMs, DefaultBackColor); - } - else - { - var nextBestEndMs = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; - if (nextBestEndMs > p.EndTime.TotalMilliseconds) - { - AddFix(p, nextBestEndMs, _warningColor); - _unfixables.Paragraphs.Add(new Paragraph(p) { Extra = "Warning" }); - } - else - { - _unfixables.Paragraphs.Add(new Paragraph(p)); - } - _totalErrors++; - } - } - } - subtitleListView1.Fill(_unfixables); - for (int index = 0; index < _unfixables.Paragraphs.Count; index++) - { - var p = _unfixables.Paragraphs[index]; - subtitleListView1.SetBackgroundColor(index, p.Extra == "Warning" ? _warningColor : Configuration.Settings.Tools.ListViewSyntaxErrorColor); - } - } - - private void AddFix(Paragraph p, double endMs, Color backgroundColor) - { - string before = p.StartTime.ToShortString() + " --> " + p.EndTime.ToShortString() + " - " + p.Duration.ToShortString(); - p.EndTime.TotalMilliseconds = endMs; - string after = p.StartTime.ToShortString() + " --> " + p.EndTime.ToShortString() + " - " + p.Duration.ToShortString(); - _totalFixes++; - AddFixToListView(p, before, after, backgroundColor); - } - - public void FixLongDisplayTimes() - { - double maxDisplayTime = (double)numericUpDownDurationMax.Value; - for (int i = 0; i < _working.Paragraphs.Count; i++) - { - Paragraph p = _working.Paragraphs[i]; - double displayTime = p.Duration.TotalMilliseconds; - if (displayTime > maxDisplayTime && AllowFix(p)) - { - AddFix(p, p.StartTime.TotalMilliseconds + maxDisplayTime, DefaultBackColor); - } - } - } - - private void ApplyDurationLimits_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - private void numericUpDownDurationMin_ValueChanged(object sender, EventArgs e) - { - GeneratePreview(); - } - - private void numericUpDownDurationMax_ValueChanged(object sender, EventArgs e) - { - GeneratePreview(); - } - - private void buttonOK_Click(object sender, EventArgs e) - { - Configuration.Settings.Tools.ApplyMinimumDurationLimit = checkBoxMinDuration.Checked; - Configuration.Settings.Tools.ApplyMaximumDurationLimit = checkBoxMaxDuration.Checked; - - _onlyListFixes = false; - _working = new Subtitle(_subtitle); - if (checkBoxMinDuration.Checked) - { - FixShortDisplayTimes(); - } - if (checkBoxMaxDuration.Checked) - { - FixLongDisplayTimes(); - } - DialogResult = DialogResult.OK; - } - - public Subtitle FixedSubtitle => _working; - - private void numericUpDownDurationMin_KeyUp(object sender, KeyEventArgs e) - { - GeneratePreview(); - } - - private void numericUpDownDurationMax_KeyUp(object sender, KeyEventArgs e) - { - GeneratePreview(); - } - - private void numericUpDownDurationMin_MouseUp(object sender, MouseEventArgs e) - { - GeneratePreview(); - } - - private void numericUpDownDurationMax_MouseUp(object sender, MouseEventArgs e) - { - GeneratePreview(); - } - - private void ApplyDurationLimits_Shown(object sender, EventArgs e) - { - listViewFixes.Focus(); - } - - private void checkBoxMinDuration_CheckedChanged(object sender, EventArgs e) - { - numericUpDownDurationMin.Enabled = checkBoxMinDuration.Checked; - GeneratePreview(); - - } - - private void checkBoxMaxDuration_CheckedChanged(object sender, EventArgs e) - { - numericUpDownDurationMax.Enabled = checkBoxMaxDuration.Checked; - GeneratePreview(); - } - - private void listViewFixes_SelectedIndexChanged(object sender, EventArgs e) - { - if (listViewFixes.SelectedIndices.Count > 0) - { - int index = listViewFixes.SelectedIndices[0]; - ListViewItem item = listViewFixes.Items[index]; - var number = int.Parse(item.SubItems[1].Text); - foreach (var p in _unfixables.Paragraphs) - { - if (p.Number == number) - { - index = _unfixables.GetIndex(p); - subtitleListView1.SelectIndexAndEnsureVisible(index); - return; - } - } - } - } - - private void toolStripMenuItemSelectAll_Click(object sender, EventArgs e) - { - foreach (ListViewItem item in listViewFixes.Items) - { - item.Checked = true; - } - } - - private void toolStripMenuItemInverseSelection_Click(object sender, EventArgs e) - { - foreach (ListViewItem item in listViewFixes.Items) - { - item.Checked = !item.Checked; - } - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Drawing; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class ApplyDurationLimits : PositionAndSizeForm + { + private int _totalFixes; + private int _totalErrors; + private Subtitle _subtitle; + private Subtitle _working; + private bool _onlyListFixes = true; + private readonly Timer _refreshTimer = new Timer(); + private readonly Color _warningColor = Color.FromArgb(255, 253, 145); + private Subtitle _unfixables = new Subtitle(); + + public ApplyDurationLimits() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + Text = Configuration.Settings.Language.ApplyDurationLimits.Title; + checkBoxMinDuration.Text = Configuration.Settings.Language.Settings.DurationMinimumMilliseconds; + checkBoxMaxDuration.Text = Configuration.Settings.Language.Settings.DurationMaximumMilliseconds; + checkBoxMinDuration.Checked = Configuration.Settings.Tools.ApplyMinimumDurationLimit; + checkBoxMaxDuration.Checked = Configuration.Settings.Tools.ApplyMaximumDurationLimit; + labelNote.Text = Configuration.Settings.Language.AdjustDisplayDuration.Note; + numericUpDownDurationMin.Value = Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds; + numericUpDownDurationMax.Value = Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds; + toolStripMenuItemInverseSelection.Text = Configuration.Settings.Language.Main.Menu.Edit.InverseSelection; + toolStripMenuItemSelectAll.Text = Configuration.Settings.Language.Main.Menu.ContextMenu.SelectAll; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + subtitleListView1.InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings); + UiUtil.InitializeSubtitleFont(subtitleListView1); + subtitleListView1.AutoSizeAllColumns(this); + listViewFixes.Columns[0].Text = Configuration.Settings.Language.General.Apply; + listViewFixes.Columns[1].Text = Configuration.Settings.Language.General.LineNumber; + listViewFixes.Columns[2].Text = Configuration.Settings.Language.General.Before; + listViewFixes.Columns[3].Text = Configuration.Settings.Language.General.After; + numericUpDownDurationMin.Left = checkBoxMinDuration.Left + checkBoxMinDuration.Width + 6; + numericUpDownDurationMax.Left = checkBoxMaxDuration.Left + checkBoxMaxDuration.Width + 6; + if (Math.Abs(numericUpDownDurationMin.Left - numericUpDownDurationMax.Left) < 10) + { + numericUpDownDurationMin.Left = Math.Max(numericUpDownDurationMin.Left, numericUpDownDurationMax.Left); + numericUpDownDurationMax.Left = Math.Max(numericUpDownDurationMin.Left, numericUpDownDurationMax.Left); + } + FixLargeFonts(); + _refreshTimer.Interval = 400; + _refreshTimer.Tick += RefreshTimerTick; + UiUtil.FixLargeFonts(this, buttonOK); + } + + private void RefreshTimerTick(object sender, EventArgs e) + { + _refreshTimer.Stop(); + GeneratePreviewReal(); + } + + private void FixLargeFonts() + { + if (labelNote.Right + 5 > Width) + { + Width = labelNote.Right + 5; + } + + UiUtil.FixLargeFonts(this, buttonOK); + } + + public void Initialize(Subtitle subtitle) + { + _subtitle = subtitle; + GeneratePreview(); + } + + private void GeneratePreview() + { + if (_refreshTimer.Enabled) + { + _refreshTimer.Stop(); + } + _refreshTimer.Start(); + } + + private void GeneratePreviewReal() + { + _totalFixes = 0; + _totalErrors = 0; + _onlyListFixes = true; + + _working = new Subtitle(_subtitle); + listViewFixes.BeginUpdate(); + listViewFixes.Items.Clear(); + if (checkBoxMinDuration.Checked) + { + FixShortDisplayTimes(); + } + if (checkBoxMaxDuration.Checked) + { + FixLongDisplayTimes(); + } + listViewFixes.EndUpdate(); + + groupBoxFixesAvailable.Text = string.Format(Configuration.Settings.Language.ApplyDurationLimits.FixesAvailable, _totalFixes); + groupBoxUnfixable.Text = string.Format(Configuration.Settings.Language.ApplyDurationLimits.UnableToFix, _totalErrors); + } + + private void AddFixToListView(Paragraph p, string before, string after, Color backgroundColor) + { + if (_onlyListFixes) + { + var item = new ListViewItem(string.Empty) { Checked = true, Tag = p, BackColor = backgroundColor }; + item.SubItems.Add(p.Number.ToString()); + item.SubItems.Add(UiUtil.GetListViewTextFromString(before)); + item.SubItems.Add(UiUtil.GetListViewTextFromString(after)); + listViewFixes.Items.Add(item); + } + } + + public bool AllowFix(Paragraph p) + { + if (_onlyListFixes) + { + return true; + } + + string ln = p.Number.ToString(); + foreach (ListViewItem item in listViewFixes.Items) + { + if (item.SubItems[1].Text == ln) + { + return item.Checked; + } + } + return false; + } + + private void FixShortDisplayTimes() + { + _unfixables = new Subtitle(); + double minDisplayTime = (double)numericUpDownDurationMin.Value; + for (int i = 0; i < _working.Paragraphs.Count; i++) + { + Paragraph p = _working.Paragraphs[i]; + double displayTime = p.Duration.TotalMilliseconds; + if (displayTime < minDisplayTime) + { + var next = _working.GetParagraphOrDefault(i + 1); + var wantedEndMs = p.StartTime.TotalMilliseconds + minDisplayTime; + if (next == null || wantedEndMs < next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines && AllowFix(p)) + { + AddFix(p, wantedEndMs, DefaultBackColor); + } + else + { + var nextBestEndMs = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; + if (nextBestEndMs > p.EndTime.TotalMilliseconds) + { + AddFix(p, nextBestEndMs, _warningColor); + _unfixables.Paragraphs.Add(new Paragraph(p) { Extra = "Warning" }); + } + else + { + _unfixables.Paragraphs.Add(new Paragraph(p)); + } + _totalErrors++; + } + } + } + subtitleListView1.Fill(_unfixables); + for (int index = 0; index < _unfixables.Paragraphs.Count; index++) + { + var p = _unfixables.Paragraphs[index]; + subtitleListView1.SetBackgroundColor(index, p.Extra == "Warning" ? _warningColor : Configuration.Settings.Tools.ListViewSyntaxErrorColor); + } + } + + private void AddFix(Paragraph p, double endMs, Color backgroundColor) + { + string before = p.StartTime.ToShortString() + " --> " + p.EndTime.ToShortString() + " - " + p.Duration.ToShortString(); + p.EndTime.TotalMilliseconds = endMs; + string after = p.StartTime.ToShortString() + " --> " + p.EndTime.ToShortString() + " - " + p.Duration.ToShortString(); + _totalFixes++; + AddFixToListView(p, before, after, backgroundColor); + } + + public void FixLongDisplayTimes() + { + double maxDisplayTime = (double)numericUpDownDurationMax.Value; + for (int i = 0; i < _working.Paragraphs.Count; i++) + { + Paragraph p = _working.Paragraphs[i]; + double displayTime = p.Duration.TotalMilliseconds; + if (displayTime > maxDisplayTime && AllowFix(p)) + { + AddFix(p, p.StartTime.TotalMilliseconds + maxDisplayTime, DefaultBackColor); + } + } + } + + private void ApplyDurationLimits_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + private void numericUpDownDurationMin_ValueChanged(object sender, EventArgs e) + { + GeneratePreview(); + } + + private void numericUpDownDurationMax_ValueChanged(object sender, EventArgs e) + { + GeneratePreview(); + } + + private void buttonOK_Click(object sender, EventArgs e) + { + Configuration.Settings.Tools.ApplyMinimumDurationLimit = checkBoxMinDuration.Checked; + Configuration.Settings.Tools.ApplyMaximumDurationLimit = checkBoxMaxDuration.Checked; + + _onlyListFixes = false; + _working = new Subtitle(_subtitle); + if (checkBoxMinDuration.Checked) + { + FixShortDisplayTimes(); + } + if (checkBoxMaxDuration.Checked) + { + FixLongDisplayTimes(); + } + DialogResult = DialogResult.OK; + } + + public Subtitle FixedSubtitle => _working; + + private void numericUpDownDurationMin_KeyUp(object sender, KeyEventArgs e) + { + GeneratePreview(); + } + + private void numericUpDownDurationMax_KeyUp(object sender, KeyEventArgs e) + { + GeneratePreview(); + } + + private void numericUpDownDurationMin_MouseUp(object sender, MouseEventArgs e) + { + GeneratePreview(); + } + + private void numericUpDownDurationMax_MouseUp(object sender, MouseEventArgs e) + { + GeneratePreview(); + } + + private void ApplyDurationLimits_Shown(object sender, EventArgs e) + { + listViewFixes.Focus(); + } + + private void checkBoxMinDuration_CheckedChanged(object sender, EventArgs e) + { + numericUpDownDurationMin.Enabled = checkBoxMinDuration.Checked; + GeneratePreview(); + + } + + private void checkBoxMaxDuration_CheckedChanged(object sender, EventArgs e) + { + numericUpDownDurationMax.Enabled = checkBoxMaxDuration.Checked; + GeneratePreview(); + } + + private void listViewFixes_SelectedIndexChanged(object sender, EventArgs e) + { + if (listViewFixes.SelectedIndices.Count > 0) + { + int index = listViewFixes.SelectedIndices[0]; + ListViewItem item = listViewFixes.Items[index]; + var number = int.Parse(item.SubItems[1].Text); + foreach (var p in _unfixables.Paragraphs) + { + if (p.Number == number) + { + index = _unfixables.GetIndex(p); + subtitleListView1.SelectIndexAndEnsureVisible(index); + return; + } + } + } + } + + private void toolStripMenuItemSelectAll_Click(object sender, EventArgs e) + { + foreach (ListViewItem item in listViewFixes.Items) + { + item.Checked = true; + } + } + + private void toolStripMenuItemInverseSelection_Click(object sender, EventArgs e) + { + foreach (ListViewItem item in listViewFixes.Items) + { + item.Checked = !item.Checked; + } + } + } +} diff --git a/src/Forms/MergeTextWithSameTimeCodes.resx b/src/ui/Forms/ApplyDurationLimits.resx similarity index 100% rename from src/Forms/MergeTextWithSameTimeCodes.resx rename to src/ui/Forms/ApplyDurationLimits.resx diff --git a/src/Forms/AudioToText.Designer.cs b/src/ui/Forms/AudioToText.Designer.cs similarity index 100% rename from src/Forms/AudioToText.Designer.cs rename to src/ui/Forms/AudioToText.Designer.cs diff --git a/src/Forms/AudioToText.cs b/src/ui/Forms/AudioToText.cs similarity index 100% rename from src/Forms/AudioToText.cs rename to src/ui/Forms/AudioToText.cs diff --git a/src/Forms/BookmarksGoTo.resx b/src/ui/Forms/AudioToText.resx similarity index 100% rename from src/Forms/BookmarksGoTo.resx rename to src/ui/Forms/AudioToText.resx diff --git a/src/Forms/AutoBreakUnbreakLines.Designer.cs b/src/ui/Forms/AutoBreakUnbreakLines.Designer.cs similarity index 98% rename from src/Forms/AutoBreakUnbreakLines.Designer.cs rename to src/ui/Forms/AutoBreakUnbreakLines.Designer.cs index 05f99bd90..d2a2567fe 100644 --- a/src/Forms/AutoBreakUnbreakLines.Designer.cs +++ b/src/ui/Forms/AutoBreakUnbreakLines.Designer.cs @@ -1,210 +1,210 @@ -namespace Nikse.SubtitleEdit.Forms -{ - partial class AutoBreakUnbreakLines - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.listViewFixes = new System.Windows.Forms.ListView(); - this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader7 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader8 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.groupBoxLinesFound = new System.Windows.Forms.GroupBox(); - this.buttonOK = new System.Windows.Forms.Button(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.comboBoxConditions = new System.Windows.Forms.ComboBox(); - this.labelCondition = new System.Windows.Forms.Label(); - this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); - this.toolStripMenuItemSelectAll = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemInverseSelection = new System.Windows.Forms.ToolStripMenuItem(); - this.groupBoxLinesFound.SuspendLayout(); - this.contextMenuStrip1.SuspendLayout(); - this.SuspendLayout(); - // - // listViewFixes - // - this.listViewFixes.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.listViewFixes.CheckBoxes = true; - this.listViewFixes.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeader4, - this.columnHeader5, - this.columnHeader7, - this.columnHeader8}); - this.listViewFixes.ContextMenuStrip = this.contextMenuStrip1; - this.listViewFixes.FullRowSelect = true; - this.listViewFixes.HideSelection = false; - this.listViewFixes.Location = new System.Drawing.Point(6, 19); - this.listViewFixes.Name = "listViewFixes"; - this.listViewFixes.Size = new System.Drawing.Size(754, 324); - this.listViewFixes.TabIndex = 9; - this.listViewFixes.UseCompatibleStateImageBehavior = false; - this.listViewFixes.View = System.Windows.Forms.View.Details; - this.listViewFixes.Resize += new System.EventHandler(this.listViewFixes_Resize); - // - // columnHeader4 - // - this.columnHeader4.Text = "Apply"; - this.columnHeader4.Width = 45; - // - // columnHeader5 - // - this.columnHeader5.Text = "Line#"; - this.columnHeader5.Width = 61; - // - // columnHeader7 - // - this.columnHeader7.Text = "Before"; - this.columnHeader7.Width = 292; - // - // columnHeader8 - // - this.columnHeader8.Text = "After"; - this.columnHeader8.Width = 292; - // - // groupBoxLinesFound - // - this.groupBoxLinesFound.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxLinesFound.Controls.Add(this.listViewFixes); - this.groupBoxLinesFound.Location = new System.Drawing.Point(2, 70); - this.groupBoxLinesFound.Name = "groupBoxLinesFound"; - this.groupBoxLinesFound.Size = new System.Drawing.Size(766, 349); - this.groupBoxLinesFound.TabIndex = 7; - this.groupBoxLinesFound.TabStop = false; - this.groupBoxLinesFound.Text = "Lines found: {0}"; - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.Location = new System.Drawing.Point(606, 425); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 5; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.Location = new System.Drawing.Point(687, 425); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 6; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - // - // comboBoxConditions - // - this.comboBoxConditions.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxConditions.FormattingEnabled = true; - this.comboBoxConditions.Location = new System.Drawing.Point(12, 30); - this.comboBoxConditions.Name = "comboBoxConditions"; - this.comboBoxConditions.Size = new System.Drawing.Size(150, 21); - this.comboBoxConditions.TabIndex = 8; - // - // labelCondition - // - this.labelCondition.AutoSize = true; - this.labelCondition.Location = new System.Drawing.Point(13, 13); - this.labelCondition.Name = "labelCondition"; - this.labelCondition.Size = new System.Drawing.Size(141, 13); - this.labelCondition.TabIndex = 9; - this.labelCondition.Text = "Only break lines longer than"; - // - // contextMenuStrip1 - // - this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripMenuItemSelectAll, - this.toolStripMenuItemInverseSelection}); - this.contextMenuStrip1.Name = "contextMenuStrip1"; - this.contextMenuStrip1.Size = new System.Drawing.Size(181, 70); - // - // toolStripMenuItemSelectAll - // - this.toolStripMenuItemSelectAll.Name = "toolStripMenuItemSelectAll"; - this.toolStripMenuItemSelectAll.Size = new System.Drawing.Size(180, 22); - this.toolStripMenuItemSelectAll.Text = "Select all"; - this.toolStripMenuItemSelectAll.Click += new System.EventHandler(this.toolStripMenuItemSelectAll_Click); - // - // toolStripMenuItemInverseSelection - // - this.toolStripMenuItemInverseSelection.Name = "toolStripMenuItemInverseSelection"; - this.toolStripMenuItemInverseSelection.Size = new System.Drawing.Size(180, 22); - this.toolStripMenuItemInverseSelection.Text = "Inverse selection"; - this.toolStripMenuItemInverseSelection.Click += new System.EventHandler(this.toolStripMenuItemInverseSelection_Click); - // - // AutoBreakUnbreakLines - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(774, 454); - this.Controls.Add(this.labelCondition); - this.Controls.Add(this.comboBoxConditions); - this.Controls.Add(this.groupBoxLinesFound); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.buttonCancel); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(700, 350); - this.Name = "AutoBreakUnbreakLines"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "AutoBreakUnbreakLines"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.AutoBreakUnbreakLinesKeyDown); - this.groupBoxLinesFound.ResumeLayout(false); - this.contextMenuStrip1.ResumeLayout(false); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.ListView listViewFixes; - private System.Windows.Forms.ColumnHeader columnHeader4; - private System.Windows.Forms.ColumnHeader columnHeader5; - private System.Windows.Forms.ColumnHeader columnHeader7; - private System.Windows.Forms.ColumnHeader columnHeader8; - private System.Windows.Forms.GroupBox groupBoxLinesFound; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.ComboBox comboBoxConditions; - private System.Windows.Forms.Label labelCondition; - private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSelectAll; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInverseSelection; - } +namespace Nikse.SubtitleEdit.Forms +{ + partial class AutoBreakUnbreakLines + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.listViewFixes = new System.Windows.Forms.ListView(); + this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader7 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader8 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.groupBoxLinesFound = new System.Windows.Forms.GroupBox(); + this.buttonOK = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.comboBoxConditions = new System.Windows.Forms.ComboBox(); + this.labelCondition = new System.Windows.Forms.Label(); + this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItemSelectAll = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemInverseSelection = new System.Windows.Forms.ToolStripMenuItem(); + this.groupBoxLinesFound.SuspendLayout(); + this.contextMenuStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // listViewFixes + // + this.listViewFixes.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listViewFixes.CheckBoxes = true; + this.listViewFixes.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader4, + this.columnHeader5, + this.columnHeader7, + this.columnHeader8}); + this.listViewFixes.ContextMenuStrip = this.contextMenuStrip1; + this.listViewFixes.FullRowSelect = true; + this.listViewFixes.HideSelection = false; + this.listViewFixes.Location = new System.Drawing.Point(6, 19); + this.listViewFixes.Name = "listViewFixes"; + this.listViewFixes.Size = new System.Drawing.Size(754, 324); + this.listViewFixes.TabIndex = 9; + this.listViewFixes.UseCompatibleStateImageBehavior = false; + this.listViewFixes.View = System.Windows.Forms.View.Details; + this.listViewFixes.Resize += new System.EventHandler(this.listViewFixes_Resize); + // + // columnHeader4 + // + this.columnHeader4.Text = "Apply"; + this.columnHeader4.Width = 45; + // + // columnHeader5 + // + this.columnHeader5.Text = "Line#"; + this.columnHeader5.Width = 61; + // + // columnHeader7 + // + this.columnHeader7.Text = "Before"; + this.columnHeader7.Width = 292; + // + // columnHeader8 + // + this.columnHeader8.Text = "After"; + this.columnHeader8.Width = 292; + // + // groupBoxLinesFound + // + this.groupBoxLinesFound.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxLinesFound.Controls.Add(this.listViewFixes); + this.groupBoxLinesFound.Location = new System.Drawing.Point(2, 70); + this.groupBoxLinesFound.Name = "groupBoxLinesFound"; + this.groupBoxLinesFound.Size = new System.Drawing.Size(766, 349); + this.groupBoxLinesFound.TabIndex = 7; + this.groupBoxLinesFound.TabStop = false; + this.groupBoxLinesFound.Text = "Lines found: {0}"; + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.Location = new System.Drawing.Point(606, 425); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 5; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.Location = new System.Drawing.Point(687, 425); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 6; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + // + // comboBoxConditions + // + this.comboBoxConditions.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxConditions.FormattingEnabled = true; + this.comboBoxConditions.Location = new System.Drawing.Point(12, 30); + this.comboBoxConditions.Name = "comboBoxConditions"; + this.comboBoxConditions.Size = new System.Drawing.Size(150, 21); + this.comboBoxConditions.TabIndex = 8; + // + // labelCondition + // + this.labelCondition.AutoSize = true; + this.labelCondition.Location = new System.Drawing.Point(13, 13); + this.labelCondition.Name = "labelCondition"; + this.labelCondition.Size = new System.Drawing.Size(141, 13); + this.labelCondition.TabIndex = 9; + this.labelCondition.Text = "Only break lines longer than"; + // + // contextMenuStrip1 + // + this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItemSelectAll, + this.toolStripMenuItemInverseSelection}); + this.contextMenuStrip1.Name = "contextMenuStrip1"; + this.contextMenuStrip1.Size = new System.Drawing.Size(181, 70); + // + // toolStripMenuItemSelectAll + // + this.toolStripMenuItemSelectAll.Name = "toolStripMenuItemSelectAll"; + this.toolStripMenuItemSelectAll.Size = new System.Drawing.Size(180, 22); + this.toolStripMenuItemSelectAll.Text = "Select all"; + this.toolStripMenuItemSelectAll.Click += new System.EventHandler(this.toolStripMenuItemSelectAll_Click); + // + // toolStripMenuItemInverseSelection + // + this.toolStripMenuItemInverseSelection.Name = "toolStripMenuItemInverseSelection"; + this.toolStripMenuItemInverseSelection.Size = new System.Drawing.Size(180, 22); + this.toolStripMenuItemInverseSelection.Text = "Inverse selection"; + this.toolStripMenuItemInverseSelection.Click += new System.EventHandler(this.toolStripMenuItemInverseSelection_Click); + // + // AutoBreakUnbreakLines + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(774, 454); + this.Controls.Add(this.labelCondition); + this.Controls.Add(this.comboBoxConditions); + this.Controls.Add(this.groupBoxLinesFound); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.buttonCancel); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(700, 350); + this.Name = "AutoBreakUnbreakLines"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "AutoBreakUnbreakLines"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.AutoBreakUnbreakLinesKeyDown); + this.groupBoxLinesFound.ResumeLayout(false); + this.contextMenuStrip1.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ListView listViewFixes; + private System.Windows.Forms.ColumnHeader columnHeader4; + private System.Windows.Forms.ColumnHeader columnHeader5; + private System.Windows.Forms.ColumnHeader columnHeader7; + private System.Windows.Forms.ColumnHeader columnHeader8; + private System.Windows.Forms.GroupBox groupBoxLinesFound; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.ComboBox comboBoxConditions; + private System.Windows.Forms.Label labelCondition; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSelectAll; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInverseSelection; + } } \ No newline at end of file diff --git a/src/Forms/AutoBreakUnbreakLines.cs b/src/ui/Forms/AutoBreakUnbreakLines.cs similarity index 97% rename from src/Forms/AutoBreakUnbreakLines.cs rename to src/ui/Forms/AutoBreakUnbreakLines.cs index f8f0b649b..494bed902 100644 --- a/src/Forms/AutoBreakUnbreakLines.cs +++ b/src/ui/Forms/AutoBreakUnbreakLines.cs @@ -1,257 +1,257 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public partial class AutoBreakUnbreakLines : PositionAndSizeForm - { - private List _paragraphs; - private bool _modeAutoBalance; - private HashSet _notAllowedFixes = new HashSet(); - - private Dictionary _fixedText = new Dictionary(); - - private string _language; - - public Dictionary FixedText => _fixedText; - - public AutoBreakUnbreakLines() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - groupBoxLinesFound.Text = string.Empty; - listViewFixes.Columns[2].Width = 290; - listViewFixes.Columns[3].Width = 290; - - listViewFixes.Columns[0].Text = Configuration.Settings.Language.General.Apply; - listViewFixes.Columns[1].Text = Configuration.Settings.Language.General.LineNumber; - listViewFixes.Columns[2].Text = Configuration.Settings.Language.General.Before; - listViewFixes.Columns[3].Text = Configuration.Settings.Language.General.After; - toolStripMenuItemInverseSelection.Text = Configuration.Settings.Language.Main.Menu.Edit.InverseSelection; - toolStripMenuItemSelectAll.Text = Configuration.Settings.Language.Main.Menu.ContextMenu.SelectAll; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - UiUtil.FixLargeFonts(this, buttonOK); - } - - public void Initialize(Subtitle subtitle, bool autoBalance) - { - _language = LanguageAutoDetect.AutoDetectGoogleLanguage(subtitle); - _modeAutoBalance = autoBalance; - _paragraphs = new List(); - - foreach (Paragraph p in subtitle.Paragraphs) - { - _paragraphs.Add(p); - } - - if (autoBalance) - { - labelCondition.Text = Configuration.Settings.Language.AutoBreakUnbreakLines.OnlyBreakLinesLongerThan; - const int start = 10; - const int max = 60; - for (int i = start; i <= max; i++) - { - comboBoxConditions.Items.Add(i.ToString(CultureInfo.InvariantCulture)); - if (i == Configuration.Settings.General.MergeLinesShorterThan - 1) - { - comboBoxConditions.SelectedIndex = comboBoxConditions.Items.Count - 1; - } - } - - if (comboBoxConditions.SelectedIndex < 0) - { - comboBoxConditions.SelectedIndex = 30; - } - - AutoBalance(); - } - else - { - labelCondition.Text = Configuration.Settings.Language.AutoBreakUnbreakLines.OnlyUnbreakLinesLongerThan; - for (int i = 5; i < 51; i++) - { - comboBoxConditions.Items.Add(i.ToString(CultureInfo.InvariantCulture)); - if (i == Configuration.Settings.General.MergeLinesShorterThan - 1) - { - comboBoxConditions.SelectedIndex = comboBoxConditions.Items.Count - 1; - } - } - if (comboBoxConditions.SelectedIndex < 0) - { - comboBoxConditions.SelectedIndex = 5; - } - Unbreak(); - } - comboBoxConditions.SelectedIndexChanged += ComboBoxConditionsSelectedIndexChanged; - } - - public int MinimumLength - { - get - { - return int.Parse(comboBoxConditions.Items[comboBoxConditions.SelectedIndex].ToString()); - } - } - - public int MergeLinesShorterThan - { - get - { - if (Configuration.Settings.General.MergeLinesShorterThan > MinimumLength) - { - return MinimumLength - 1; - } - - return Configuration.Settings.General.MergeLinesShorterThan; - } - } - - private void AutoBalance() - { - listViewFixes.ItemChecked -= listViewFixes_ItemChecked; - _notAllowedFixes = new HashSet(); - _fixedText = new Dictionary(); - int minLength = MinimumLength; - Text = Configuration.Settings.Language.AutoBreakUnbreakLines.TitleAutoBreak; - - - listViewFixes.BeginUpdate(); - listViewFixes.Items.Clear(); - foreach (Paragraph p in _paragraphs) - { - if (HtmlUtil.RemoveHtmlTags(p.Text, true).Length > minLength || p.Text.Contains(Environment.NewLine)) - { - var text = Utilities.AutoBreakLine(p.Text, 5, MergeLinesShorterThan, _language); - if (text != p.Text) - { - AddToListView(p, text); - _fixedText.Add(p.Id, text); - } - } - } - listViewFixes.EndUpdate(); - groupBoxLinesFound.Text = string.Format(Configuration.Settings.Language.AutoBreakUnbreakLines.LinesFoundX, listViewFixes.Items.Count); - listViewFixes.ItemChecked += listViewFixes_ItemChecked; - } - - private void Unbreak() - { - listViewFixes.ItemChecked -= listViewFixes_ItemChecked; - _notAllowedFixes = new HashSet(); - _fixedText = new Dictionary(); - int minLength = int.Parse(comboBoxConditions.Items[comboBoxConditions.SelectedIndex].ToString()); - Text = Configuration.Settings.Language.AutoBreakUnbreakLines.TitleUnbreak; - listViewFixes.BeginUpdate(); - listViewFixes.Items.Clear(); - foreach (Paragraph p in _paragraphs) - { - if (p.Text.Contains(Environment.NewLine) && HtmlUtil.RemoveHtmlTags(p.Text, true).Length > minLength) - { - var text = Utilities.UnbreakLine(p.Text); - if (text != p.Text) - { - AddToListView(p, text); - _fixedText.Add(p.Id, text); - } - } - } - listViewFixes.EndUpdate(); - groupBoxLinesFound.Text = string.Format(Configuration.Settings.Language.AutoBreakUnbreakLines.LinesFoundX, listViewFixes.Items.Count); - listViewFixes.ItemChecked += listViewFixes_ItemChecked; - } - - private void AutoBreakUnbreakLinesKeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - private void AddToListView(Paragraph p, string newText) - { - var item = new ListViewItem(string.Empty) { Tag = p, Checked = true }; - item.SubItems.Add(p.Number.ToString(CultureInfo.InvariantCulture)); - item.SubItems.Add(UiUtil.GetListViewTextFromString(p.Text)); - item.SubItems.Add(UiUtil.GetListViewTextFromString(newText)); - listViewFixes.Items.Add(item); - } - - private void ButtonOkClick(object sender, EventArgs e) - { - for (int i = _paragraphs.Count - 1; i >= 0; i--) - { - var p = _paragraphs[i]; - if (_notAllowedFixes.Contains(p.Id)) - { - _fixedText.Remove(p.Id); - } - } - DialogResult = DialogResult.OK; - } - - private void ComboBoxConditionsSelectedIndexChanged(object sender, EventArgs e) - { - if (_modeAutoBalance) - { - AutoBalance(); - } - else - { - Unbreak(); - } - } - - private void listViewFixes_ItemChecked(object sender, ItemCheckedEventArgs e) - { - if (e.Item == null) - { - return; - } - - var p = e.Item.Tag as Paragraph; - if (p == null) - { - return; - } - - if (e.Item.Checked) - { - _notAllowedFixes.Remove(p.Id); - } - else - { - _notAllowedFixes.Add(p.Id); - } - } - - private void listViewFixes_Resize(object sender, EventArgs e) - { - var newWidth = (listViewFixes.Width - (listViewFixes.Columns[0].Width + listViewFixes.Columns[1].Width)) / 2; - listViewFixes.Columns[3].Width = listViewFixes.Columns[2].Width = newWidth; - } - - private void toolStripMenuItemSelectAll_Click(object sender, EventArgs e) - { - foreach (ListViewItem item in listViewFixes.Items) - { - item.Checked = true; - } - } - - private void toolStripMenuItemInverseSelection_Click(object sender, EventArgs e) - { - foreach (ListViewItem item in listViewFixes.Items) - { - item.Checked = !item.Checked; - } - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public partial class AutoBreakUnbreakLines : PositionAndSizeForm + { + private List _paragraphs; + private bool _modeAutoBalance; + private HashSet _notAllowedFixes = new HashSet(); + + private Dictionary _fixedText = new Dictionary(); + + private string _language; + + public Dictionary FixedText => _fixedText; + + public AutoBreakUnbreakLines() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + groupBoxLinesFound.Text = string.Empty; + listViewFixes.Columns[2].Width = 290; + listViewFixes.Columns[3].Width = 290; + + listViewFixes.Columns[0].Text = Configuration.Settings.Language.General.Apply; + listViewFixes.Columns[1].Text = Configuration.Settings.Language.General.LineNumber; + listViewFixes.Columns[2].Text = Configuration.Settings.Language.General.Before; + listViewFixes.Columns[3].Text = Configuration.Settings.Language.General.After; + toolStripMenuItemInverseSelection.Text = Configuration.Settings.Language.Main.Menu.Edit.InverseSelection; + toolStripMenuItemSelectAll.Text = Configuration.Settings.Language.Main.Menu.ContextMenu.SelectAll; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + UiUtil.FixLargeFonts(this, buttonOK); + } + + public void Initialize(Subtitle subtitle, bool autoBalance) + { + _language = LanguageAutoDetect.AutoDetectGoogleLanguage(subtitle); + _modeAutoBalance = autoBalance; + _paragraphs = new List(); + + foreach (Paragraph p in subtitle.Paragraphs) + { + _paragraphs.Add(p); + } + + if (autoBalance) + { + labelCondition.Text = Configuration.Settings.Language.AutoBreakUnbreakLines.OnlyBreakLinesLongerThan; + const int start = 10; + const int max = 60; + for (int i = start; i <= max; i++) + { + comboBoxConditions.Items.Add(i.ToString(CultureInfo.InvariantCulture)); + if (i == Configuration.Settings.General.MergeLinesShorterThan - 1) + { + comboBoxConditions.SelectedIndex = comboBoxConditions.Items.Count - 1; + } + } + + if (comboBoxConditions.SelectedIndex < 0) + { + comboBoxConditions.SelectedIndex = 30; + } + + AutoBalance(); + } + else + { + labelCondition.Text = Configuration.Settings.Language.AutoBreakUnbreakLines.OnlyUnbreakLinesLongerThan; + for (int i = 5; i < 51; i++) + { + comboBoxConditions.Items.Add(i.ToString(CultureInfo.InvariantCulture)); + if (i == Configuration.Settings.General.MergeLinesShorterThan - 1) + { + comboBoxConditions.SelectedIndex = comboBoxConditions.Items.Count - 1; + } + } + if (comboBoxConditions.SelectedIndex < 0) + { + comboBoxConditions.SelectedIndex = 5; + } + Unbreak(); + } + comboBoxConditions.SelectedIndexChanged += ComboBoxConditionsSelectedIndexChanged; + } + + public int MinimumLength + { + get + { + return int.Parse(comboBoxConditions.Items[comboBoxConditions.SelectedIndex].ToString()); + } + } + + public int MergeLinesShorterThan + { + get + { + if (Configuration.Settings.General.MergeLinesShorterThan > MinimumLength) + { + return MinimumLength - 1; + } + + return Configuration.Settings.General.MergeLinesShorterThan; + } + } + + private void AutoBalance() + { + listViewFixes.ItemChecked -= listViewFixes_ItemChecked; + _notAllowedFixes = new HashSet(); + _fixedText = new Dictionary(); + int minLength = MinimumLength; + Text = Configuration.Settings.Language.AutoBreakUnbreakLines.TitleAutoBreak; + + + listViewFixes.BeginUpdate(); + listViewFixes.Items.Clear(); + foreach (Paragraph p in _paragraphs) + { + if (HtmlUtil.RemoveHtmlTags(p.Text, true).Length > minLength || p.Text.Contains(Environment.NewLine)) + { + var text = Utilities.AutoBreakLine(p.Text, 5, MergeLinesShorterThan, _language); + if (text != p.Text) + { + AddToListView(p, text); + _fixedText.Add(p.Id, text); + } + } + } + listViewFixes.EndUpdate(); + groupBoxLinesFound.Text = string.Format(Configuration.Settings.Language.AutoBreakUnbreakLines.LinesFoundX, listViewFixes.Items.Count); + listViewFixes.ItemChecked += listViewFixes_ItemChecked; + } + + private void Unbreak() + { + listViewFixes.ItemChecked -= listViewFixes_ItemChecked; + _notAllowedFixes = new HashSet(); + _fixedText = new Dictionary(); + int minLength = int.Parse(comboBoxConditions.Items[comboBoxConditions.SelectedIndex].ToString()); + Text = Configuration.Settings.Language.AutoBreakUnbreakLines.TitleUnbreak; + listViewFixes.BeginUpdate(); + listViewFixes.Items.Clear(); + foreach (Paragraph p in _paragraphs) + { + if (p.Text.Contains(Environment.NewLine) && HtmlUtil.RemoveHtmlTags(p.Text, true).Length > minLength) + { + var text = Utilities.UnbreakLine(p.Text); + if (text != p.Text) + { + AddToListView(p, text); + _fixedText.Add(p.Id, text); + } + } + } + listViewFixes.EndUpdate(); + groupBoxLinesFound.Text = string.Format(Configuration.Settings.Language.AutoBreakUnbreakLines.LinesFoundX, listViewFixes.Items.Count); + listViewFixes.ItemChecked += listViewFixes_ItemChecked; + } + + private void AutoBreakUnbreakLinesKeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + private void AddToListView(Paragraph p, string newText) + { + var item = new ListViewItem(string.Empty) { Tag = p, Checked = true }; + item.SubItems.Add(p.Number.ToString(CultureInfo.InvariantCulture)); + item.SubItems.Add(UiUtil.GetListViewTextFromString(p.Text)); + item.SubItems.Add(UiUtil.GetListViewTextFromString(newText)); + listViewFixes.Items.Add(item); + } + + private void ButtonOkClick(object sender, EventArgs e) + { + for (int i = _paragraphs.Count - 1; i >= 0; i--) + { + var p = _paragraphs[i]; + if (_notAllowedFixes.Contains(p.Id)) + { + _fixedText.Remove(p.Id); + } + } + DialogResult = DialogResult.OK; + } + + private void ComboBoxConditionsSelectedIndexChanged(object sender, EventArgs e) + { + if (_modeAutoBalance) + { + AutoBalance(); + } + else + { + Unbreak(); + } + } + + private void listViewFixes_ItemChecked(object sender, ItemCheckedEventArgs e) + { + if (e.Item == null) + { + return; + } + + var p = e.Item.Tag as Paragraph; + if (p == null) + { + return; + } + + if (e.Item.Checked) + { + _notAllowedFixes.Remove(p.Id); + } + else + { + _notAllowedFixes.Add(p.Id); + } + } + + private void listViewFixes_Resize(object sender, EventArgs e) + { + var newWidth = (listViewFixes.Width - (listViewFixes.Columns[0].Width + listViewFixes.Columns[1].Width)) / 2; + listViewFixes.Columns[3].Width = listViewFixes.Columns[2].Width = newWidth; + } + + private void toolStripMenuItemSelectAll_Click(object sender, EventArgs e) + { + foreach (ListViewItem item in listViewFixes.Items) + { + item.Checked = true; + } + } + + private void toolStripMenuItemInverseSelection_Click(object sender, EventArgs e) + { + foreach (ListViewItem item in listViewFixes.Items) + { + item.Checked = !item.Checked; + } + } + } +} diff --git a/src/Forms/Ocr/OCRSpellCheck.resx b/src/ui/Forms/AutoBreakUnbreakLines.resx similarity index 100% rename from src/Forms/Ocr/OCRSpellCheck.resx rename to src/ui/Forms/AutoBreakUnbreakLines.resx diff --git a/src/Forms/BatchConvert.Designer.cs b/src/ui/Forms/BatchConvert.Designer.cs similarity index 98% rename from src/Forms/BatchConvert.Designer.cs rename to src/ui/Forms/BatchConvert.Designer.cs index 237869f53..1989901da 100644 --- a/src/Forms/BatchConvert.Designer.cs +++ b/src/ui/Forms/BatchConvert.Designer.cs @@ -1,1622 +1,1622 @@ -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class BatchConvert - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - TimeCode timeCode1 = new TimeCode(); - this.buttonConvert = new System.Windows.Forms.Button(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.groupBoxConvertOptions = new System.Windows.Forms.GroupBox(); - this.groupBoxDeleteLines = new System.Windows.Forms.GroupBox(); - this.textBoxDeleteContains = new System.Windows.Forms.TextBox(); - this.labelDeleteLinesContaining = new System.Windows.Forms.Label(); - this.numericUpDownDeleteLast = new System.Windows.Forms.NumericUpDown(); - this.labelDeleteLastLines = new System.Windows.Forms.Label(); - this.numericUpDownDeleteFirst = new System.Windows.Forms.NumericUpDown(); - this.labelDeleteFirstLines = new System.Windows.Forms.Label(); - this.groupBoxRemoveStyle = new System.Windows.Forms.GroupBox(); - this.textBoxRemoveStyle = new System.Windows.Forms.TextBox(); - this.labelStyleName = new System.Windows.Forms.Label(); - this.groupBoxOffsetTimeCodes = new System.Windows.Forms.GroupBox(); - this.radioButtonShowLater = new System.Windows.Forms.RadioButton(); - this.radioButtonShowEarlier = new System.Windows.Forms.RadioButton(); - this.timeUpDownAdjust = new Nikse.SubtitleEdit.Controls.TimeUpDown(); - this.labelHourMinSecMilliSecond = new System.Windows.Forms.Label(); - this.buttonConvertOptionsSettings = new System.Windows.Forms.Button(); - this.listViewConvertOptions = new System.Windows.Forms.ListView(); - this.ActionCheckBox = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.Action = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.contextMenuStripOptions = new System.Windows.Forms.ContextMenuStrip(this.components); - this.toolStripMenuItemSelectAll = new System.Windows.Forms.ToolStripMenuItem(); - this.inverseSelectionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.groupBoxChangeFrameRate = new System.Windows.Forms.GroupBox(); - this.buttonSwapFrameRate = new System.Windows.Forms.Button(); - this.comboBoxFrameRateTo = new System.Windows.Forms.ComboBox(); - this.labelToFrameRate = new System.Windows.Forms.Label(); - this.comboBoxFrameRateFrom = new System.Windows.Forms.ComboBox(); - this.labelFromFrameRate = new System.Windows.Forms.Label(); - this.groupBoxFixRtl = new System.Windows.Forms.GroupBox(); - this.radioButtonReverseStartEnd = new System.Windows.Forms.RadioButton(); - this.radioButtonRemoveUnicode = new System.Windows.Forms.RadioButton(); - this.radioButtonAddUnicode = new System.Windows.Forms.RadioButton(); - this.groupBoxSpeed = new System.Windows.Forms.GroupBox(); - this.radioButtonToDropFrame = new System.Windows.Forms.RadioButton(); - this.radioButtonSpeedFromDropFrame = new System.Windows.Forms.RadioButton(); - this.radioButtonSpeedCustom = new System.Windows.Forms.RadioButton(); - this.numericUpDownPercent = new System.Windows.Forms.NumericUpDown(); - this.labelPercent = new System.Windows.Forms.Label(); - this.groupBoxChangeCasing = new System.Windows.Forms.GroupBox(); - this.radioButtonFixOnlyNames = new System.Windows.Forms.RadioButton(); - this.radioButtonLowercase = new System.Windows.Forms.RadioButton(); - this.radioButtonUppercase = new System.Windows.Forms.RadioButton(); - this.radioButtonNormal = new System.Windows.Forms.RadioButton(); - this.groupBoxMergeShortLines = new System.Windows.Forms.GroupBox(); - this.checkBoxOnlyContinuationLines = new System.Windows.Forms.CheckBox(); - this.numericUpDownMaxCharacters = new System.Windows.Forms.NumericUpDown(); - this.numericUpDownMaxMillisecondsBetweenLines = new System.Windows.Forms.NumericUpDown(); - this.labelMaxMillisecondsBetweenLines = new System.Windows.Forms.Label(); - this.labelMaxCharacters = new System.Windows.Forms.Label(); - this.groupBoxAdjustDuration = new System.Windows.Forms.GroupBox(); - this.comboBoxAdjustDurationVia = new System.Windows.Forms.ComboBox(); - this.labelAdjustDurationVia = new System.Windows.Forms.Label(); - this.panelAdjustDurationFixed = new System.Windows.Forms.Panel(); - this.numericUpDownFixedMilliseconds = new System.Windows.Forms.NumericUpDown(); - this.labelMillisecondsFixed = new System.Windows.Forms.Label(); - this.panelAdjustDurationAddPercent = new System.Windows.Forms.Panel(); - this.label1 = new System.Windows.Forms.Label(); - this.numericUpDownAdjustViaPercent = new System.Windows.Forms.NumericUpDown(); - this.labelAdjustViaPercent = new System.Windows.Forms.Label(); - this.panelAdjustDurationAddSeconds = new System.Windows.Forms.Panel(); - this.numericUpDownSeconds = new System.Windows.Forms.NumericUpDown(); - this.labelAddSeconds = new System.Windows.Forms.Label(); - this.panelAdjustDurationRecalc = new System.Windows.Forms.Panel(); - this.checkBoxExtendOnly = new System.Windows.Forms.CheckBox(); - this.numericUpDownOptimalCharsSec = new System.Windows.Forms.NumericUpDown(); - this.labelOptimalCharsSec = new System.Windows.Forms.Label(); - this.numericUpDownMaxCharsSec = new System.Windows.Forms.NumericUpDown(); - this.labelMaxCharsPerSecond = new System.Windows.Forms.Label(); - this.groupBoxOutput = new System.Windows.Forms.GroupBox(); - this.buttonBrowseEncoding = new System.Windows.Forms.Button(); - this.radioButtonSaveInOutputFolder = new System.Windows.Forms.RadioButton(); - this.buttonTransportStreamSettings = new System.Windows.Forms.Button(); - this.linkLabelOpenOutputFolder = new System.Windows.Forms.LinkLabel(); - this.checkBoxUseStyleFromSource = new System.Windows.Forms.CheckBox(); - this.checkBoxOverwrite = new System.Windows.Forms.CheckBox(); - this.buttonStyles = new System.Windows.Forms.Button(); - this.buttonChooseFolder = new System.Windows.Forms.Button(); - this.comboBoxSubtitleFormats = new System.Windows.Forms.ComboBox(); - this.textBoxOutputFolder = new System.Windows.Forms.TextBox(); - this.labelEncoding = new System.Windows.Forms.Label(); - this.radioButtonSaveInSourceFolder = new System.Windows.Forms.RadioButton(); - this.comboBoxEncoding = new System.Windows.Forms.ComboBox(); - this.labelOutputFormat = new System.Windows.Forms.Label(); - this.groupBoxInput = new System.Windows.Forms.GroupBox(); - this.labelNumberOfFiles = new System.Windows.Forms.Label(); - this.textBoxFilter = new System.Windows.Forms.TextBox(); - this.labelFilter = new System.Windows.Forms.Label(); - this.comboBoxFilter = new System.Windows.Forms.ComboBox(); - this.checkBoxScanFolderRecursive = new System.Windows.Forms.CheckBox(); - this.buttonSearchFolder = new System.Windows.Forms.Button(); - this.buttonInputBrowse = new System.Windows.Forms.Button(); - this.labelChooseInputFiles = new System.Windows.Forms.Label(); - this.listViewInputFiles = new System.Windows.Forms.ListView(); - this.columnHeaderFName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderSize = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderFormat = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderStatus = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.contextMenuStripFiles = new System.Windows.Forms.ContextMenuStrip(this.components); - this.addFilesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); - this.removeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.removeAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.openContainingFolderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); - this.convertMkvSettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.folderBrowserDialog1 = new System.Windows.Forms.FolderBrowserDialog(); - this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); - this.progressBar1 = new System.Windows.Forms.ProgressBar(); - this.labelStatus = new System.Windows.Forms.Label(); - this.groupBoxConvertOptions.SuspendLayout(); - this.groupBoxDeleteLines.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDeleteLast)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDeleteFirst)).BeginInit(); - this.groupBoxRemoveStyle.SuspendLayout(); - this.groupBoxOffsetTimeCodes.SuspendLayout(); - this.contextMenuStripOptions.SuspendLayout(); - this.groupBoxChangeFrameRate.SuspendLayout(); - this.groupBoxFixRtl.SuspendLayout(); - this.groupBoxSpeed.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPercent)).BeginInit(); - this.groupBoxChangeCasing.SuspendLayout(); - this.groupBoxMergeShortLines.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxCharacters)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxMillisecondsBetweenLines)).BeginInit(); - this.groupBoxAdjustDuration.SuspendLayout(); - this.panelAdjustDurationFixed.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownFixedMilliseconds)).BeginInit(); - this.panelAdjustDurationAddPercent.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownAdjustViaPercent)).BeginInit(); - this.panelAdjustDurationAddSeconds.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSeconds)).BeginInit(); - this.panelAdjustDurationRecalc.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownOptimalCharsSec)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxCharsSec)).BeginInit(); - this.groupBoxOutput.SuspendLayout(); - this.groupBoxInput.SuspendLayout(); - this.contextMenuStripFiles.SuspendLayout(); - this.SuspendLayout(); - // - // buttonConvert - // - this.buttonConvert.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonConvert.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonConvert.Location = new System.Drawing.Point(844, 618); - this.buttonConvert.Name = "buttonConvert"; - this.buttonConvert.Size = new System.Drawing.Size(98, 23); - this.buttonConvert.TabIndex = 2; - this.buttonConvert.Text = "&Convert"; - this.buttonConvert.UseVisualStyleBackColor = true; - this.buttonConvert.Click += new System.EventHandler(this.buttonConvert_Click); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(948, 618); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 3; - this.buttonCancel.Text = "&Done"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // groupBoxConvertOptions - // - this.groupBoxConvertOptions.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxConvertOptions.Controls.Add(this.groupBoxDeleteLines); - this.groupBoxConvertOptions.Controls.Add(this.groupBoxRemoveStyle); - this.groupBoxConvertOptions.Controls.Add(this.groupBoxOffsetTimeCodes); - this.groupBoxConvertOptions.Controls.Add(this.buttonConvertOptionsSettings); - this.groupBoxConvertOptions.Controls.Add(this.listViewConvertOptions); - this.groupBoxConvertOptions.Controls.Add(this.groupBoxChangeFrameRate); - this.groupBoxConvertOptions.Controls.Add(this.groupBoxFixRtl); - this.groupBoxConvertOptions.Controls.Add(this.groupBoxSpeed); - this.groupBoxConvertOptions.Controls.Add(this.groupBoxChangeCasing); - this.groupBoxConvertOptions.Controls.Add(this.groupBoxMergeShortLines); - this.groupBoxConvertOptions.Controls.Add(this.groupBoxAdjustDuration); - this.groupBoxConvertOptions.Location = new System.Drawing.Point(422, 19); - this.groupBoxConvertOptions.Name = "groupBoxConvertOptions"; - this.groupBoxConvertOptions.Size = new System.Drawing.Size(583, 275); - this.groupBoxConvertOptions.TabIndex = 11; - this.groupBoxConvertOptions.TabStop = false; - this.groupBoxConvertOptions.Text = "Convert options"; - // - // groupBoxDeleteLines - // - this.groupBoxDeleteLines.Controls.Add(this.textBoxDeleteContains); - this.groupBoxDeleteLines.Controls.Add(this.labelDeleteLinesContaining); - this.groupBoxDeleteLines.Controls.Add(this.numericUpDownDeleteLast); - this.groupBoxDeleteLines.Controls.Add(this.labelDeleteLastLines); - this.groupBoxDeleteLines.Controls.Add(this.numericUpDownDeleteFirst); - this.groupBoxDeleteLines.Controls.Add(this.labelDeleteFirstLines); - this.groupBoxDeleteLines.Location = new System.Drawing.Point(305, 94); - this.groupBoxDeleteLines.Name = "groupBoxDeleteLines"; - this.groupBoxDeleteLines.Size = new System.Drawing.Size(271, 140); - this.groupBoxDeleteLines.TabIndex = 308; - this.groupBoxDeleteLines.TabStop = false; - this.groupBoxDeleteLines.Text = "Delete lines"; - this.groupBoxDeleteLines.Visible = false; - // - // textBoxDeleteContains - // - this.textBoxDeleteContains.Location = new System.Drawing.Point(10, 110); - this.textBoxDeleteContains.Name = "textBoxDeleteContains"; - this.textBoxDeleteContains.Size = new System.Drawing.Size(237, 20); - this.textBoxDeleteContains.TabIndex = 5; - // - // labelDeleteLinesContaining - // - this.labelDeleteLinesContaining.AutoSize = true; - this.labelDeleteLinesContaining.Location = new System.Drawing.Point(9, 89); - this.labelDeleteLinesContaining.Name = "labelDeleteLinesContaining"; - this.labelDeleteLinesContaining.Size = new System.Drawing.Size(114, 13); - this.labelDeleteLinesContaining.TabIndex = 4; - this.labelDeleteLinesContaining.Text = "Delete lines containing"; - // - // numericUpDownDeleteLast - // - this.numericUpDownDeleteLast.Location = new System.Drawing.Point(92, 45); - this.numericUpDownDeleteLast.Name = "numericUpDownDeleteLast"; - this.numericUpDownDeleteLast.Size = new System.Drawing.Size(43, 20); - this.numericUpDownDeleteLast.TabIndex = 3; - // - // labelDeleteLastLines - // - this.labelDeleteLastLines.AutoSize = true; - this.labelDeleteLastLines.Location = new System.Drawing.Point(5, 47); - this.labelDeleteLastLines.Name = "labelDeleteLastLines"; - this.labelDeleteLastLines.Size = new System.Drawing.Size(81, 13); - this.labelDeleteLastLines.TabIndex = 2; - this.labelDeleteLastLines.Text = "Delete last lines"; - // - // numericUpDownDeleteFirst - // - this.numericUpDownDeleteFirst.Location = new System.Drawing.Point(93, 19); - this.numericUpDownDeleteFirst.Name = "numericUpDownDeleteFirst"; - this.numericUpDownDeleteFirst.Size = new System.Drawing.Size(43, 20); - this.numericUpDownDeleteFirst.TabIndex = 1; - // - // labelDeleteFirstLines - // - this.labelDeleteFirstLines.AutoSize = true; - this.labelDeleteFirstLines.Location = new System.Drawing.Point(6, 20); - this.labelDeleteFirstLines.Name = "labelDeleteFirstLines"; - this.labelDeleteFirstLines.Size = new System.Drawing.Size(81, 13); - this.labelDeleteFirstLines.TabIndex = 0; - this.labelDeleteFirstLines.Text = "Delete first lines"; - // - // groupBoxRemoveStyle - // - this.groupBoxRemoveStyle.Controls.Add(this.textBoxRemoveStyle); - this.groupBoxRemoveStyle.Controls.Add(this.labelStyleName); - this.groupBoxRemoveStyle.Location = new System.Drawing.Point(307, 12); - this.groupBoxRemoveStyle.Name = "groupBoxRemoveStyle"; - this.groupBoxRemoveStyle.Size = new System.Drawing.Size(271, 76); - this.groupBoxRemoveStyle.TabIndex = 307; - this.groupBoxRemoveStyle.TabStop = false; - this.groupBoxRemoveStyle.Text = "Remove style/actor"; - this.groupBoxRemoveStyle.Visible = false; - // - // textBoxRemoveStyle - // - this.textBoxRemoveStyle.Location = new System.Drawing.Point(6, 35); - this.textBoxRemoveStyle.Name = "textBoxRemoveStyle"; - this.textBoxRemoveStyle.Size = new System.Drawing.Size(257, 20); - this.textBoxRemoveStyle.TabIndex = 8; - // - // labelStyleName - // - this.labelStyleName.AutoSize = true; - this.labelStyleName.Location = new System.Drawing.Point(6, 20); - this.labelStyleName.Name = "labelStyleName"; - this.labelStyleName.Size = new System.Drawing.Size(59, 13); - this.labelStyleName.TabIndex = 0; - this.labelStyleName.Text = "Style/actor"; - // - // groupBoxOffsetTimeCodes - // - this.groupBoxOffsetTimeCodes.Controls.Add(this.radioButtonShowLater); - this.groupBoxOffsetTimeCodes.Controls.Add(this.radioButtonShowEarlier); - this.groupBoxOffsetTimeCodes.Controls.Add(this.timeUpDownAdjust); - this.groupBoxOffsetTimeCodes.Controls.Add(this.labelHourMinSecMilliSecond); - this.groupBoxOffsetTimeCodes.Location = new System.Drawing.Point(305, 19); - this.groupBoxOffsetTimeCodes.Name = "groupBoxOffsetTimeCodes"; - this.groupBoxOffsetTimeCodes.Size = new System.Drawing.Size(271, 119); - this.groupBoxOffsetTimeCodes.TabIndex = 306; - this.groupBoxOffsetTimeCodes.TabStop = false; - this.groupBoxOffsetTimeCodes.Text = "Offset time codes"; - this.groupBoxOffsetTimeCodes.Visible = false; - // - // radioButtonShowLater - // - this.radioButtonShowLater.AutoSize = true; - this.radioButtonShowLater.Checked = true; - this.radioButtonShowLater.Location = new System.Drawing.Point(9, 89); - this.radioButtonShowLater.Name = "radioButtonShowLater"; - this.radioButtonShowLater.Size = new System.Drawing.Size(75, 17); - this.radioButtonShowLater.TabIndex = 3; - this.radioButtonShowLater.TabStop = true; - this.radioButtonShowLater.Text = "Show later"; - this.radioButtonShowLater.UseVisualStyleBackColor = true; - // - // radioButtonShowEarlier - // - this.radioButtonShowEarlier.AutoSize = true; - this.radioButtonShowEarlier.Location = new System.Drawing.Point(9, 66); - this.radioButtonShowEarlier.Name = "radioButtonShowEarlier"; - this.radioButtonShowEarlier.Size = new System.Drawing.Size(83, 17); - this.radioButtonShowEarlier.TabIndex = 2; - this.radioButtonShowEarlier.Text = "Show earlier"; - this.radioButtonShowEarlier.UseVisualStyleBackColor = true; - // - // timeUpDownAdjust - // - this.timeUpDownAdjust.AutoSize = true; - this.timeUpDownAdjust.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.timeUpDownAdjust.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F); - this.timeUpDownAdjust.Location = new System.Drawing.Point(7, 37); - this.timeUpDownAdjust.Margin = new System.Windows.Forms.Padding(4); - this.timeUpDownAdjust.Name = "timeUpDownAdjust"; - this.timeUpDownAdjust.Size = new System.Drawing.Size(111, 27); - this.timeUpDownAdjust.TabIndex = 1; - timeCode1.Hours = 0; - timeCode1.Milliseconds = 0; - timeCode1.Minutes = 0; - timeCode1.Seconds = 0; - timeCode1.TimeSpan = System.TimeSpan.Parse("00:00:00"); - timeCode1.TotalMilliseconds = 0D; - timeCode1.TotalSeconds = 0D; - this.timeUpDownAdjust.TimeCode = timeCode1; - this.timeUpDownAdjust.UseVideoOffset = false; - // - // labelHourMinSecMilliSecond - // - this.labelHourMinSecMilliSecond.AutoSize = true; - this.labelHourMinSecMilliSecond.Location = new System.Drawing.Point(6, 20); - this.labelHourMinSecMilliSecond.Name = "labelHourMinSecMilliSecond"; - this.labelHourMinSecMilliSecond.Size = new System.Drawing.Size(90, 13); - this.labelHourMinSecMilliSecond.TabIndex = 0; - this.labelHourMinSecMilliSecond.Text = "Hours:min:sec.ms"; - // - // buttonConvertOptionsSettings - // - this.buttonConvertOptionsSettings.Location = new System.Drawing.Point(305, 144); - this.buttonConvertOptionsSettings.Name = "buttonConvertOptionsSettings"; - this.buttonConvertOptionsSettings.Size = new System.Drawing.Size(116, 23); - this.buttonConvertOptionsSettings.TabIndex = 302; - this.buttonConvertOptionsSettings.Text = "Settings..."; - this.buttonConvertOptionsSettings.UseVisualStyleBackColor = true; - this.buttonConvertOptionsSettings.Visible = false; - this.buttonConvertOptionsSettings.Click += new System.EventHandler(this.ButtonOptionConvertSettings); - // - // listViewConvertOptions - // - this.listViewConvertOptions.CheckBoxes = true; - this.listViewConvertOptions.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.ActionCheckBox, - this.Action}); - this.listViewConvertOptions.ContextMenuStrip = this.contextMenuStripOptions; - this.listViewConvertOptions.FullRowSelect = true; - this.listViewConvertOptions.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None; - this.listViewConvertOptions.HideSelection = false; - this.listViewConvertOptions.Location = new System.Drawing.Point(6, 17); - this.listViewConvertOptions.MultiSelect = false; - this.listViewConvertOptions.Name = "listViewConvertOptions"; - this.listViewConvertOptions.Size = new System.Drawing.Size(293, 252); - this.listViewConvertOptions.TabIndex = 301; - this.listViewConvertOptions.UseCompatibleStateImageBehavior = false; - this.listViewConvertOptions.View = System.Windows.Forms.View.Details; - this.listViewConvertOptions.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.listViewConvertOptions_ItemChecked); - this.listViewConvertOptions.SelectedIndexChanged += new System.EventHandler(this.listViewConvertOptions_SelectedIndexChanged); - // - // ActionCheckBox - // - this.ActionCheckBox.Width = 30; - // - // Action - // - this.Action.Width = 400; - // - // contextMenuStripOptions - // - this.contextMenuStripOptions.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripMenuItemSelectAll, - this.inverseSelectionToolStripMenuItem}); - this.contextMenuStripOptions.Name = "contextMenuStripOptions"; - this.contextMenuStripOptions.Size = new System.Drawing.Size(162, 48); - // - // toolStripMenuItemSelectAll - // - this.toolStripMenuItemSelectAll.Name = "toolStripMenuItemSelectAll"; - this.toolStripMenuItemSelectAll.Size = new System.Drawing.Size(161, 22); - this.toolStripMenuItemSelectAll.Text = "Select all"; - this.toolStripMenuItemSelectAll.Click += new System.EventHandler(this.toolStripMenuItemSelectAll_Click); - // - // inverseSelectionToolStripMenuItem - // - this.inverseSelectionToolStripMenuItem.Name = "inverseSelectionToolStripMenuItem"; - this.inverseSelectionToolStripMenuItem.Size = new System.Drawing.Size(161, 22); - this.inverseSelectionToolStripMenuItem.Text = "Inverse selection"; - this.inverseSelectionToolStripMenuItem.Click += new System.EventHandler(this.inverseSelectionToolStripMenuItem_Click); - // - // groupBoxChangeFrameRate - // - this.groupBoxChangeFrameRate.Controls.Add(this.buttonSwapFrameRate); - this.groupBoxChangeFrameRate.Controls.Add(this.comboBoxFrameRateTo); - this.groupBoxChangeFrameRate.Controls.Add(this.labelToFrameRate); - this.groupBoxChangeFrameRate.Controls.Add(this.comboBoxFrameRateFrom); - this.groupBoxChangeFrameRate.Controls.Add(this.labelFromFrameRate); - this.groupBoxChangeFrameRate.Location = new System.Drawing.Point(307, 12); - this.groupBoxChangeFrameRate.Name = "groupBoxChangeFrameRate"; - this.groupBoxChangeFrameRate.Size = new System.Drawing.Size(269, 90); - this.groupBoxChangeFrameRate.TabIndex = 305; - this.groupBoxChangeFrameRate.TabStop = false; - this.groupBoxChangeFrameRate.Text = "Change frame rate"; - this.groupBoxChangeFrameRate.Visible = false; - // - // buttonSwapFrameRate - // - this.buttonSwapFrameRate.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.buttonSwapFrameRate.Location = new System.Drawing.Point(207, 28); - this.buttonSwapFrameRate.Name = "buttonSwapFrameRate"; - this.buttonSwapFrameRate.Size = new System.Drawing.Size(27, 28); - this.buttonSwapFrameRate.TabIndex = 9; - this.buttonSwapFrameRate.Text = "<->"; - this.buttonSwapFrameRate.UseVisualStyleBackColor = true; - this.buttonSwapFrameRate.Click += new System.EventHandler(this.buttonSwapFrameRate_Click); - // - // comboBoxFrameRateTo - // - this.comboBoxFrameRateTo.FormattingEnabled = true; - this.comboBoxFrameRateTo.Location = new System.Drawing.Point(130, 46); - this.comboBoxFrameRateTo.Name = "comboBoxFrameRateTo"; - this.comboBoxFrameRateTo.Size = new System.Drawing.Size(71, 21); - this.comboBoxFrameRateTo.TabIndex = 3; - // - // labelToFrameRate - // - this.labelToFrameRate.AutoSize = true; - this.labelToFrameRate.Location = new System.Drawing.Point(6, 50); - this.labelToFrameRate.Name = "labelToFrameRate"; - this.labelToFrameRate.Size = new System.Drawing.Size(70, 13); - this.labelToFrameRate.TabIndex = 2; - this.labelToFrameRate.Text = "To frame rate"; - // - // comboBoxFrameRateFrom - // - this.comboBoxFrameRateFrom.FormattingEnabled = true; - this.comboBoxFrameRateFrom.Location = new System.Drawing.Point(130, 17); - this.comboBoxFrameRateFrom.Name = "comboBoxFrameRateFrom"; - this.comboBoxFrameRateFrom.Size = new System.Drawing.Size(71, 21); - this.comboBoxFrameRateFrom.TabIndex = 1; - // - // labelFromFrameRate - // - this.labelFromFrameRate.AutoSize = true; - this.labelFromFrameRate.Location = new System.Drawing.Point(6, 21); - this.labelFromFrameRate.Name = "labelFromFrameRate"; - this.labelFromFrameRate.Size = new System.Drawing.Size(80, 13); - this.labelFromFrameRate.TabIndex = 0; - this.labelFromFrameRate.Text = "From frame rate"; - // - // groupBoxFixRtl - // - this.groupBoxFixRtl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxFixRtl.Controls.Add(this.radioButtonReverseStartEnd); - this.groupBoxFixRtl.Controls.Add(this.radioButtonRemoveUnicode); - this.groupBoxFixRtl.Controls.Add(this.radioButtonAddUnicode); - this.groupBoxFixRtl.Location = new System.Drawing.Point(305, 17); - this.groupBoxFixRtl.Name = "groupBoxFixRtl"; - this.groupBoxFixRtl.Size = new System.Drawing.Size(271, 115); - this.groupBoxFixRtl.TabIndex = 303; - this.groupBoxFixRtl.TabStop = false; - this.groupBoxFixRtl.Text = "Settings"; - this.groupBoxFixRtl.Visible = false; - // - // radioButtonReverseStartEnd - // - this.radioButtonReverseStartEnd.AutoSize = true; - this.radioButtonReverseStartEnd.Location = new System.Drawing.Point(19, 77); - this.radioButtonReverseStartEnd.Name = "radioButtonReverseStartEnd"; - this.radioButtonReverseStartEnd.Size = new System.Drawing.Size(135, 17); - this.radioButtonReverseStartEnd.TabIndex = 2; - this.radioButtonReverseStartEnd.TabStop = true; - this.radioButtonReverseStartEnd.Text = "Reverse RTL start/end"; - this.radioButtonReverseStartEnd.UseVisualStyleBackColor = true; - // - // radioButtonRemoveUnicode - // - this.radioButtonRemoveUnicode.AutoSize = true; - this.radioButtonRemoveUnicode.Location = new System.Drawing.Point(19, 54); - this.radioButtonRemoveUnicode.Name = "radioButtonRemoveUnicode"; - this.radioButtonRemoveUnicode.Size = new System.Drawing.Size(153, 17); - this.radioButtonRemoveUnicode.TabIndex = 1; - this.radioButtonRemoveUnicode.TabStop = true; - this.radioButtonRemoveUnicode.Text = "Remove RTL unicode tags"; - this.radioButtonRemoveUnicode.UseVisualStyleBackColor = true; - // - // radioButtonAddUnicode - // - this.radioButtonAddUnicode.AutoSize = true; - this.radioButtonAddUnicode.Location = new System.Drawing.Point(19, 31); - this.radioButtonAddUnicode.Name = "radioButtonAddUnicode"; - this.radioButtonAddUnicode.Size = new System.Drawing.Size(145, 17); - this.radioButtonAddUnicode.TabIndex = 0; - this.radioButtonAddUnicode.TabStop = true; - this.radioButtonAddUnicode.Text = "Fix RTL via Unicode tags"; - this.radioButtonAddUnicode.UseVisualStyleBackColor = true; - // - // groupBoxSpeed - // - this.groupBoxSpeed.Controls.Add(this.radioButtonToDropFrame); - this.groupBoxSpeed.Controls.Add(this.radioButtonSpeedFromDropFrame); - this.groupBoxSpeed.Controls.Add(this.radioButtonSpeedCustom); - this.groupBoxSpeed.Controls.Add(this.numericUpDownPercent); - this.groupBoxSpeed.Controls.Add(this.labelPercent); - this.groupBoxSpeed.Location = new System.Drawing.Point(305, 17); - this.groupBoxSpeed.Name = "groupBoxSpeed"; - this.groupBoxSpeed.Size = new System.Drawing.Size(271, 129); - this.groupBoxSpeed.TabIndex = 307; - this.groupBoxSpeed.TabStop = false; - this.groupBoxSpeed.Text = "Change speed"; - this.groupBoxSpeed.Visible = false; - // - // radioButtonToDropFrame - // - this.radioButtonToDropFrame.AutoSize = true; - this.radioButtonToDropFrame.Location = new System.Drawing.Point(6, 91); - this.radioButtonToDropFrame.Name = "radioButtonToDropFrame"; - this.radioButtonToDropFrame.Size = new System.Drawing.Size(91, 17); - this.radioButtonToDropFrame.TabIndex = 3; - this.radioButtonToDropFrame.Text = "To drop frame"; - this.radioButtonToDropFrame.UseVisualStyleBackColor = true; - this.radioButtonToDropFrame.CheckedChanged += new System.EventHandler(this.radioButtonToDropFrame_CheckedChanged); - // - // radioButtonSpeedFromDropFrame - // - this.radioButtonSpeedFromDropFrame.AutoSize = true; - this.radioButtonSpeedFromDropFrame.Location = new System.Drawing.Point(6, 68); - this.radioButtonSpeedFromDropFrame.Name = "radioButtonSpeedFromDropFrame"; - this.radioButtonSpeedFromDropFrame.Size = new System.Drawing.Size(101, 17); - this.radioButtonSpeedFromDropFrame.TabIndex = 2; - this.radioButtonSpeedFromDropFrame.Text = "From drop frame"; - this.radioButtonSpeedFromDropFrame.UseVisualStyleBackColor = true; - this.radioButtonSpeedFromDropFrame.CheckedChanged += new System.EventHandler(this.radioButtonSpeedFromDropFrame_CheckedChanged); - // - // radioButtonSpeedCustom - // - this.radioButtonSpeedCustom.AutoSize = true; - this.radioButtonSpeedCustom.Checked = true; - this.radioButtonSpeedCustom.Location = new System.Drawing.Point(6, 45); - this.radioButtonSpeedCustom.Name = "radioButtonSpeedCustom"; - this.radioButtonSpeedCustom.Size = new System.Drawing.Size(60, 17); - this.radioButtonSpeedCustom.TabIndex = 1; - this.radioButtonSpeedCustom.TabStop = true; - this.radioButtonSpeedCustom.Text = "Custom"; - this.radioButtonSpeedCustom.UseVisualStyleBackColor = true; - this.radioButtonSpeedCustom.CheckedChanged += new System.EventHandler(this.radioButtonSpeedCustom_CheckedChanged); - // - // numericUpDownPercent - // - this.numericUpDownPercent.DecimalPlaces = 5; - this.numericUpDownPercent.Location = new System.Drawing.Point(6, 19); - this.numericUpDownPercent.Maximum = new decimal(new int[] { - 200, - 0, - 0, - 0}); - this.numericUpDownPercent.Minimum = new decimal(new int[] { - 50, - 0, - 0, - 0}); - this.numericUpDownPercent.Name = "numericUpDownPercent"; - this.numericUpDownPercent.Size = new System.Drawing.Size(81, 20); - this.numericUpDownPercent.TabIndex = 0; - this.numericUpDownPercent.Value = new decimal(new int[] { - 100, - 0, - 0, - 0}); - // - // labelPercent - // - this.labelPercent.AutoSize = true; - this.labelPercent.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.labelPercent.Location = new System.Drawing.Point(87, 22); - this.labelPercent.Name = "labelPercent"; - this.labelPercent.Size = new System.Drawing.Size(15, 13); - this.labelPercent.TabIndex = 12; - this.labelPercent.Text = "%"; - // - // groupBoxChangeCasing - // - this.groupBoxChangeCasing.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxChangeCasing.Controls.Add(this.radioButtonFixOnlyNames); - this.groupBoxChangeCasing.Controls.Add(this.radioButtonLowercase); - this.groupBoxChangeCasing.Controls.Add(this.radioButtonUppercase); - this.groupBoxChangeCasing.Controls.Add(this.radioButtonNormal); - this.groupBoxChangeCasing.Location = new System.Drawing.Point(308, 16); - this.groupBoxChangeCasing.Name = "groupBoxChangeCasing"; - this.groupBoxChangeCasing.Size = new System.Drawing.Size(268, 125); - this.groupBoxChangeCasing.TabIndex = 308; - this.groupBoxChangeCasing.TabStop = false; - this.groupBoxChangeCasing.Text = "Change casing to"; - // - // radioButtonFixOnlyNames - // - this.radioButtonFixOnlyNames.AutoSize = true; - this.radioButtonFixOnlyNames.Location = new System.Drawing.Point(11, 43); - this.radioButtonFixOnlyNames.Name = "radioButtonFixOnlyNames"; - this.radioButtonFixOnlyNames.Size = new System.Drawing.Size(263, 17); - this.radioButtonFixOnlyNames.TabIndex = 6; - this.radioButtonFixOnlyNames.Text = "Fix only names casing (via Dictionaries\\names.xml)"; - this.radioButtonFixOnlyNames.UseVisualStyleBackColor = true; - // - // radioButtonLowercase - // - this.radioButtonLowercase.AutoSize = true; - this.radioButtonLowercase.Location = new System.Drawing.Point(11, 89); - this.radioButtonLowercase.Name = "radioButtonLowercase"; - this.radioButtonLowercase.Size = new System.Drawing.Size(86, 17); - this.radioButtonLowercase.TabIndex = 10; - this.radioButtonLowercase.Text = "all lowercase"; - this.radioButtonLowercase.UseVisualStyleBackColor = true; - // - // radioButtonUppercase - // - this.radioButtonUppercase.AutoSize = true; - this.radioButtonUppercase.Location = new System.Drawing.Point(11, 66); - this.radioButtonUppercase.Name = "radioButtonUppercase"; - this.radioButtonUppercase.Size = new System.Drawing.Size(112, 17); - this.radioButtonUppercase.TabIndex = 8; - this.radioButtonUppercase.Text = "ALL UPPERCASE"; - this.radioButtonUppercase.UseVisualStyleBackColor = true; - // - // radioButtonNormal - // - this.radioButtonNormal.AutoSize = true; - this.radioButtonNormal.Checked = true; - this.radioButtonNormal.Location = new System.Drawing.Point(11, 18); - this.radioButtonNormal.Name = "radioButtonNormal"; - this.radioButtonNormal.Size = new System.Drawing.Size(282, 17); - this.radioButtonNormal.TabIndex = 0; - this.radioButtonNormal.TabStop = true; - this.radioButtonNormal.Text = "Normal casing. Sentences begin with uppercase letter."; - this.radioButtonNormal.UseVisualStyleBackColor = true; - // - // groupBoxMergeShortLines - // - this.groupBoxMergeShortLines.Controls.Add(this.checkBoxOnlyContinuationLines); - this.groupBoxMergeShortLines.Controls.Add(this.numericUpDownMaxCharacters); - this.groupBoxMergeShortLines.Controls.Add(this.numericUpDownMaxMillisecondsBetweenLines); - this.groupBoxMergeShortLines.Controls.Add(this.labelMaxMillisecondsBetweenLines); - this.groupBoxMergeShortLines.Controls.Add(this.labelMaxCharacters); - this.groupBoxMergeShortLines.Location = new System.Drawing.Point(308, 23); - this.groupBoxMergeShortLines.Name = "groupBoxMergeShortLines"; - this.groupBoxMergeShortLines.Size = new System.Drawing.Size(268, 149); - this.groupBoxMergeShortLines.TabIndex = 304; - this.groupBoxMergeShortLines.TabStop = false; - this.groupBoxMergeShortLines.Text = "Merge short lines"; - this.groupBoxMergeShortLines.Visible = false; - // - // checkBoxOnlyContinuationLines - // - this.checkBoxOnlyContinuationLines.AutoSize = true; - this.checkBoxOnlyContinuationLines.Checked = true; - this.checkBoxOnlyContinuationLines.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxOnlyContinuationLines.Location = new System.Drawing.Point(16, 127); - this.checkBoxOnlyContinuationLines.Name = "checkBoxOnlyContinuationLines"; - this.checkBoxOnlyContinuationLines.Size = new System.Drawing.Size(164, 17); - this.checkBoxOnlyContinuationLines.TabIndex = 42; - this.checkBoxOnlyContinuationLines.Text = "Only merge continuation lines"; - this.checkBoxOnlyContinuationLines.UseVisualStyleBackColor = true; - // - // numericUpDownMaxCharacters - // - this.numericUpDownMaxCharacters.Location = new System.Drawing.Point(15, 41); - this.numericUpDownMaxCharacters.Maximum = new decimal(new int[] { - 999, - 0, - 0, - 0}); - this.numericUpDownMaxCharacters.Minimum = new decimal(new int[] { - 10, - 0, - 0, - 0}); - this.numericUpDownMaxCharacters.Name = "numericUpDownMaxCharacters"; - this.numericUpDownMaxCharacters.Size = new System.Drawing.Size(64, 20); - this.numericUpDownMaxCharacters.TabIndex = 38; - this.numericUpDownMaxCharacters.Value = new decimal(new int[] { - 65, - 0, - 0, - 0}); - // - // numericUpDownMaxMillisecondsBetweenLines - // - this.numericUpDownMaxMillisecondsBetweenLines.Location = new System.Drawing.Point(15, 90); - this.numericUpDownMaxMillisecondsBetweenLines.Maximum = new decimal(new int[] { - 2000, - 0, - 0, - 0}); - this.numericUpDownMaxMillisecondsBetweenLines.Minimum = new decimal(new int[] { - 1, - 0, - 0, - 0}); - this.numericUpDownMaxMillisecondsBetweenLines.Name = "numericUpDownMaxMillisecondsBetweenLines"; - this.numericUpDownMaxMillisecondsBetweenLines.Size = new System.Drawing.Size(64, 20); - this.numericUpDownMaxMillisecondsBetweenLines.TabIndex = 39; - this.numericUpDownMaxMillisecondsBetweenLines.Value = new decimal(new int[] { - 250, - 0, - 0, - 0}); - // - // labelMaxMillisecondsBetweenLines - // - this.labelMaxMillisecondsBetweenLines.AutoSize = true; - this.labelMaxMillisecondsBetweenLines.Location = new System.Drawing.Point(12, 73); - this.labelMaxMillisecondsBetweenLines.Name = "labelMaxMillisecondsBetweenLines"; - this.labelMaxMillisecondsBetweenLines.Size = new System.Drawing.Size(178, 13); - this.labelMaxMillisecondsBetweenLines.TabIndex = 41; - this.labelMaxMillisecondsBetweenLines.Text = "Maximum milliseconds between lines"; - // - // labelMaxCharacters - // - this.labelMaxCharacters.AutoSize = true; - this.labelMaxCharacters.Location = new System.Drawing.Point(12, 23); - this.labelMaxCharacters.Name = "labelMaxCharacters"; - this.labelMaxCharacters.Size = new System.Drawing.Size(187, 13); - this.labelMaxCharacters.TabIndex = 40; - this.labelMaxCharacters.Text = "Maximum characters in one paragraph"; - // - // groupBoxAdjustDuration - // - this.groupBoxAdjustDuration.Controls.Add(this.comboBoxAdjustDurationVia); - this.groupBoxAdjustDuration.Controls.Add(this.labelAdjustDurationVia); - this.groupBoxAdjustDuration.Controls.Add(this.panelAdjustDurationFixed); - this.groupBoxAdjustDuration.Controls.Add(this.panelAdjustDurationAddPercent); - this.groupBoxAdjustDuration.Controls.Add(this.panelAdjustDurationAddSeconds); - this.groupBoxAdjustDuration.Controls.Add(this.panelAdjustDurationRecalc); - this.groupBoxAdjustDuration.Location = new System.Drawing.Point(305, 16); - this.groupBoxAdjustDuration.Name = "groupBoxAdjustDuration"; - this.groupBoxAdjustDuration.Size = new System.Drawing.Size(271, 251); - this.groupBoxAdjustDuration.TabIndex = 308; - this.groupBoxAdjustDuration.TabStop = false; - this.groupBoxAdjustDuration.Text = "Adjust duration"; - this.groupBoxAdjustDuration.Visible = false; - // - // comboBoxAdjustDurationVia - // - this.comboBoxAdjustDurationVia.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxAdjustDurationVia.FormattingEnabled = true; - this.comboBoxAdjustDurationVia.Location = new System.Drawing.Point(65, 19); - this.comboBoxAdjustDurationVia.Name = "comboBoxAdjustDurationVia"; - this.comboBoxAdjustDurationVia.Size = new System.Drawing.Size(121, 21); - this.comboBoxAdjustDurationVia.TabIndex = 8; - this.comboBoxAdjustDurationVia.SelectedIndexChanged += new System.EventHandler(this.comboBoxAdjustDurationVia_SelectedIndexChanged); - // - // labelAdjustDurationVia - // - this.labelAdjustDurationVia.AutoSize = true; - this.labelAdjustDurationVia.Location = new System.Drawing.Point(8, 22); - this.labelAdjustDurationVia.Name = "labelAdjustDurationVia"; - this.labelAdjustDurationVia.Size = new System.Drawing.Size(51, 13); - this.labelAdjustDurationVia.TabIndex = 7; - this.labelAdjustDurationVia.Text = "AdjustVia"; - // - // panelAdjustDurationFixed - // - this.panelAdjustDurationFixed.Controls.Add(this.numericUpDownFixedMilliseconds); - this.panelAdjustDurationFixed.Controls.Add(this.labelMillisecondsFixed); - this.panelAdjustDurationFixed.Location = new System.Drawing.Point(6, 123); - this.panelAdjustDurationFixed.Name = "panelAdjustDurationFixed"; - this.panelAdjustDurationFixed.Size = new System.Drawing.Size(257, 57); - this.panelAdjustDurationFixed.TabIndex = 15; - // - // numericUpDownFixedMilliseconds - // - this.numericUpDownFixedMilliseconds.Location = new System.Drawing.Point(8, 27); - this.numericUpDownFixedMilliseconds.Maximum = new decimal(new int[] { - 20000, - 0, - 0, - 0}); - this.numericUpDownFixedMilliseconds.Name = "numericUpDownFixedMilliseconds"; - this.numericUpDownFixedMilliseconds.Size = new System.Drawing.Size(80, 20); - this.numericUpDownFixedMilliseconds.TabIndex = 13; - this.numericUpDownFixedMilliseconds.Value = new decimal(new int[] { - 3000, - 0, - 0, - 0}); - // - // labelMillisecondsFixed - // - this.labelMillisecondsFixed.AutoSize = true; - this.labelMillisecondsFixed.Location = new System.Drawing.Point(5, 8); - this.labelMillisecondsFixed.Name = "labelMillisecondsFixed"; - this.labelMillisecondsFixed.Size = new System.Drawing.Size(64, 13); - this.labelMillisecondsFixed.TabIndex = 14; - this.labelMillisecondsFixed.Text = "Milliseconds"; - // - // panelAdjustDurationAddPercent - // - this.panelAdjustDurationAddPercent.Controls.Add(this.label1); - this.panelAdjustDurationAddPercent.Controls.Add(this.numericUpDownAdjustViaPercent); - this.panelAdjustDurationAddPercent.Controls.Add(this.labelAdjustViaPercent); - this.panelAdjustDurationAddPercent.Location = new System.Drawing.Point(7, 79); - this.panelAdjustDurationAddPercent.Name = "panelAdjustDurationAddPercent"; - this.panelAdjustDurationAddPercent.Size = new System.Drawing.Size(257, 63); - this.panelAdjustDurationAddPercent.TabIndex = 14; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(90, 34); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(15, 13); - this.label1.TabIndex = 25; - this.label1.Text = "%"; - // - // numericUpDownAdjustViaPercent - // - this.numericUpDownAdjustViaPercent.Location = new System.Drawing.Point(8, 27); - this.numericUpDownAdjustViaPercent.Maximum = new decimal(new int[] { - 150, - 0, - 0, - 0}); - this.numericUpDownAdjustViaPercent.Minimum = new decimal(new int[] { - 75, - 0, - 0, - 0}); - this.numericUpDownAdjustViaPercent.Name = "numericUpDownAdjustViaPercent"; - this.numericUpDownAdjustViaPercent.Size = new System.Drawing.Size(80, 20); - this.numericUpDownAdjustViaPercent.TabIndex = 24; - this.numericUpDownAdjustViaPercent.Value = new decimal(new int[] { - 110, - 0, - 0, - 0}); - // - // labelAdjustViaPercent - // - this.labelAdjustViaPercent.AutoSize = true; - this.labelAdjustViaPercent.Location = new System.Drawing.Point(5, 8); - this.labelAdjustViaPercent.Name = "labelAdjustViaPercent"; - this.labelAdjustViaPercent.Size = new System.Drawing.Size(86, 13); - this.labelAdjustViaPercent.TabIndex = 23; - this.labelAdjustViaPercent.Text = "Adjust in percent"; - // - // panelAdjustDurationAddSeconds - // - this.panelAdjustDurationAddSeconds.Controls.Add(this.numericUpDownSeconds); - this.panelAdjustDurationAddSeconds.Controls.Add(this.labelAddSeconds); - this.panelAdjustDurationAddSeconds.Location = new System.Drawing.Point(8, 47); - this.panelAdjustDurationAddSeconds.Name = "panelAdjustDurationAddSeconds"; - this.panelAdjustDurationAddSeconds.Size = new System.Drawing.Size(257, 55); - this.panelAdjustDurationAddSeconds.TabIndex = 13; - // - // numericUpDownSeconds - // - this.numericUpDownSeconds.DecimalPlaces = 3; - this.numericUpDownSeconds.Increment = new decimal(new int[] { - 1, - 0, - 0, - 131072}); - this.numericUpDownSeconds.Location = new System.Drawing.Point(8, 27); - this.numericUpDownSeconds.Maximum = new decimal(new int[] { - 20, - 0, - 0, - 0}); - this.numericUpDownSeconds.Minimum = new decimal(new int[] { - 10, - 0, - 0, - -2147483648}); - this.numericUpDownSeconds.Name = "numericUpDownSeconds"; - this.numericUpDownSeconds.Size = new System.Drawing.Size(80, 20); - this.numericUpDownSeconds.TabIndex = 12; - this.numericUpDownSeconds.Value = new decimal(new int[] { - 1, - 0, - 0, - 65536}); - // - // labelAddSeconds - // - this.labelAddSeconds.AutoSize = true; - this.labelAddSeconds.Location = new System.Drawing.Point(5, 8); - this.labelAddSeconds.Name = "labelAddSeconds"; - this.labelAddSeconds.Size = new System.Drawing.Size(69, 13); - this.labelAddSeconds.TabIndex = 11; - this.labelAddSeconds.Text = "Add seconds"; - // - // panelAdjustDurationRecalc - // - this.panelAdjustDurationRecalc.Controls.Add(this.checkBoxExtendOnly); - this.panelAdjustDurationRecalc.Controls.Add(this.numericUpDownOptimalCharsSec); - this.panelAdjustDurationRecalc.Controls.Add(this.labelOptimalCharsSec); - this.panelAdjustDurationRecalc.Controls.Add(this.numericUpDownMaxCharsSec); - this.panelAdjustDurationRecalc.Controls.Add(this.labelMaxCharsPerSecond); - this.panelAdjustDurationRecalc.Location = new System.Drawing.Point(6, 66); - this.panelAdjustDurationRecalc.Name = "panelAdjustDurationRecalc"; - this.panelAdjustDurationRecalc.Size = new System.Drawing.Size(257, 170); - this.panelAdjustDurationRecalc.TabIndex = 16; - // - // checkBoxExtendOnly - // - this.checkBoxExtendOnly.AutoSize = true; - this.checkBoxExtendOnly.Location = new System.Drawing.Point(8, 122); - this.checkBoxExtendOnly.Name = "checkBoxExtendOnly"; - this.checkBoxExtendOnly.Size = new System.Drawing.Size(81, 17); - this.checkBoxExtendOnly.TabIndex = 14; - this.checkBoxExtendOnly.Text = "Extend only"; - this.checkBoxExtendOnly.UseVisualStyleBackColor = true; - // - // numericUpDownOptimalCharsSec - // - this.numericUpDownOptimalCharsSec.DecimalPlaces = 1; - this.numericUpDownOptimalCharsSec.Increment = new decimal(new int[] { - 1, - 0, - 0, - 65536}); - this.numericUpDownOptimalCharsSec.Location = new System.Drawing.Point(8, 85); - this.numericUpDownOptimalCharsSec.Minimum = new decimal(new int[] { - 4, - 0, - 0, - 0}); - this.numericUpDownOptimalCharsSec.Name = "numericUpDownOptimalCharsSec"; - this.numericUpDownOptimalCharsSec.Size = new System.Drawing.Size(80, 20); - this.numericUpDownOptimalCharsSec.TabIndex = 13; - this.numericUpDownOptimalCharsSec.Value = new decimal(new int[] { - 17, - 0, - 0, - 0}); - // - // labelOptimalCharsSec - // - this.labelOptimalCharsSec.AutoSize = true; - this.labelOptimalCharsSec.Location = new System.Drawing.Point(5, 66); - this.labelOptimalCharsSec.Name = "labelOptimalCharsSec"; - this.labelOptimalCharsSec.Size = new System.Drawing.Size(93, 13); - this.labelOptimalCharsSec.TabIndex = 15; - this.labelOptimalCharsSec.Text = "Optimal chars/sec"; - // - // numericUpDownMaxCharsSec - // - this.numericUpDownMaxCharsSec.DecimalPlaces = 1; - this.numericUpDownMaxCharsSec.Increment = new decimal(new int[] { - 1, - 0, - 0, - 65536}); - this.numericUpDownMaxCharsSec.Location = new System.Drawing.Point(8, 27); - this.numericUpDownMaxCharsSec.Minimum = new decimal(new int[] { - 4, - 0, - 0, - 0}); - this.numericUpDownMaxCharsSec.Name = "numericUpDownMaxCharsSec"; - this.numericUpDownMaxCharsSec.Size = new System.Drawing.Size(80, 20); - this.numericUpDownMaxCharsSec.TabIndex = 12; - this.numericUpDownMaxCharsSec.Value = new decimal(new int[] { - 24, - 0, - 0, - 0}); - // - // labelMaxCharsPerSecond - // - this.labelMaxCharsPerSecond.AutoSize = true; - this.labelMaxCharsPerSecond.Location = new System.Drawing.Point(5, 8); - this.labelMaxCharsPerSecond.Name = "labelMaxCharsPerSecond"; - this.labelMaxCharsPerSecond.Size = new System.Drawing.Size(81, 13); - this.labelMaxCharsPerSecond.TabIndex = 11; - this.labelMaxCharsPerSecond.Text = "Max. chars/sec"; - // - // groupBoxOutput - // - this.groupBoxOutput.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxOutput.Controls.Add(this.buttonBrowseEncoding); - this.groupBoxOutput.Controls.Add(this.radioButtonSaveInOutputFolder); - this.groupBoxOutput.Controls.Add(this.buttonTransportStreamSettings); - this.groupBoxOutput.Controls.Add(this.linkLabelOpenOutputFolder); - this.groupBoxOutput.Controls.Add(this.checkBoxUseStyleFromSource); - this.groupBoxOutput.Controls.Add(this.checkBoxOverwrite); - this.groupBoxOutput.Controls.Add(this.buttonStyles); - this.groupBoxOutput.Controls.Add(this.buttonChooseFolder); - this.groupBoxOutput.Controls.Add(this.comboBoxSubtitleFormats); - this.groupBoxOutput.Controls.Add(this.textBoxOutputFolder); - this.groupBoxOutput.Controls.Add(this.labelEncoding); - this.groupBoxOutput.Controls.Add(this.radioButtonSaveInSourceFolder); - this.groupBoxOutput.Controls.Add(this.comboBoxEncoding); - this.groupBoxOutput.Controls.Add(this.labelOutputFormat); - this.groupBoxOutput.Controls.Add(this.groupBoxConvertOptions); - this.groupBoxOutput.Location = new System.Drawing.Point(12, 305); - this.groupBoxOutput.Name = "groupBoxOutput"; - this.groupBoxOutput.Size = new System.Drawing.Size(1014, 300); - this.groupBoxOutput.TabIndex = 1; - this.groupBoxOutput.TabStop = false; - this.groupBoxOutput.Text = "Output"; - // - // buttonBrowseEncoding - // - this.buttonBrowseEncoding.Location = new System.Drawing.Point(300, 263); - this.buttonBrowseEncoding.Name = "buttonBrowseEncoding"; - this.buttonBrowseEncoding.Size = new System.Drawing.Size(26, 23); - this.buttonBrowseEncoding.TabIndex = 12; - this.buttonBrowseEncoding.Text = "..."; - this.buttonBrowseEncoding.UseVisualStyleBackColor = true; - this.buttonBrowseEncoding.Click += new System.EventHandler(this.buttonBrowseEncoding_Click); - // - // radioButtonSaveInOutputFolder - // - this.radioButtonSaveInOutputFolder.AutoSize = true; - this.radioButtonSaveInOutputFolder.Location = new System.Drawing.Point(10, 56); - this.radioButtonSaveInOutputFolder.Name = "radioButtonSaveInOutputFolder"; - this.radioButtonSaveInOutputFolder.Size = new System.Drawing.Size(154, 17); - this.radioButtonSaveInOutputFolder.TabIndex = 11; - this.radioButtonSaveInOutputFolder.Text = "Save in output folder below"; - this.radioButtonSaveInOutputFolder.UseVisualStyleBackColor = true; - this.radioButtonSaveInOutputFolder.CheckedChanged += new System.EventHandler(this.radioButtonSaveInOutputFolder_CheckedChanged); - // - // buttonTransportStreamSettings - // - this.buttonTransportStreamSettings.Location = new System.Drawing.Point(300, 236); - this.buttonTransportStreamSettings.Name = "buttonTransportStreamSettings"; - this.buttonTransportStreamSettings.Size = new System.Drawing.Size(116, 23); - this.buttonTransportStreamSettings.TabIndex = 10; - this.buttonTransportStreamSettings.Text = "TS settings..."; - this.buttonTransportStreamSettings.UseVisualStyleBackColor = true; - this.buttonTransportStreamSettings.Visible = false; - this.buttonTransportStreamSettings.Click += new System.EventHandler(this.buttonTransportStreamSettings_Click); - // - // linkLabelOpenOutputFolder - // - this.linkLabelOpenOutputFolder.AutoSize = true; - this.linkLabelOpenOutputFolder.Location = new System.Drawing.Point(357, 81); - this.linkLabelOpenOutputFolder.Name = "linkLabelOpenOutputFolder"; - this.linkLabelOpenOutputFolder.Size = new System.Drawing.Size(42, 13); - this.linkLabelOpenOutputFolder.TabIndex = 9; - this.linkLabelOpenOutputFolder.TabStop = true; - this.linkLabelOpenOutputFolder.Text = "Open..."; - this.linkLabelOpenOutputFolder.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabelOpenOutputFolder_LinkClicked); - // - // checkBoxUseStyleFromSource - // - this.checkBoxUseStyleFromSource.AutoSize = true; - this.checkBoxUseStyleFromSource.Location = new System.Drawing.Point(80, 236); - this.checkBoxUseStyleFromSource.Name = "checkBoxUseStyleFromSource"; - this.checkBoxUseStyleFromSource.Size = new System.Drawing.Size(127, 17); - this.checkBoxUseStyleFromSource.TabIndex = 9; - this.checkBoxUseStyleFromSource.Text = "Use style from source"; - this.checkBoxUseStyleFromSource.UseVisualStyleBackColor = true; - this.checkBoxUseStyleFromSource.Visible = false; - // - // checkBoxOverwrite - // - this.checkBoxOverwrite.AutoSize = true; - this.checkBoxOverwrite.Location = new System.Drawing.Point(10, 122); - this.checkBoxOverwrite.Name = "checkBoxOverwrite"; - this.checkBoxOverwrite.Size = new System.Drawing.Size(125, 17); - this.checkBoxOverwrite.TabIndex = 10; - this.checkBoxOverwrite.Text = "Overwrite exiting files"; - this.checkBoxOverwrite.UseVisualStyleBackColor = true; - // - // buttonStyles - // - this.buttonStyles.Location = new System.Drawing.Point(300, 207); - this.buttonStyles.Name = "buttonStyles"; - this.buttonStyles.Size = new System.Drawing.Size(116, 23); - this.buttonStyles.TabIndex = 8; - this.buttonStyles.Text = "Style..."; - this.buttonStyles.UseVisualStyleBackColor = true; - this.buttonStyles.Visible = false; - this.buttonStyles.Click += new System.EventHandler(this.ButtonStylesClick); - // - // buttonChooseFolder - // - this.buttonChooseFolder.Enabled = false; - this.buttonChooseFolder.Location = new System.Drawing.Point(325, 76); - this.buttonChooseFolder.Name = "buttonChooseFolder"; - this.buttonChooseFolder.Size = new System.Drawing.Size(26, 23); - this.buttonChooseFolder.TabIndex = 8; - this.buttonChooseFolder.Text = "..."; - this.buttonChooseFolder.UseVisualStyleBackColor = true; - this.buttonChooseFolder.Click += new System.EventHandler(this.buttonChooseFolder_Click); - // - // comboBoxSubtitleFormats - // - this.comboBoxSubtitleFormats.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxSubtitleFormats.FormattingEnabled = true; - this.comboBoxSubtitleFormats.Location = new System.Drawing.Point(80, 209); - this.comboBoxSubtitleFormats.Name = "comboBoxSubtitleFormats"; - this.comboBoxSubtitleFormats.Size = new System.Drawing.Size(214, 21); - this.comboBoxSubtitleFormats.TabIndex = 7; - this.comboBoxSubtitleFormats.SelectedIndexChanged += new System.EventHandler(this.ComboBoxSubtitleFormatsSelectedIndexChanged); - // - // textBoxOutputFolder - // - this.textBoxOutputFolder.Enabled = false; - this.textBoxOutputFolder.Location = new System.Drawing.Point(17, 79); - this.textBoxOutputFolder.Name = "textBoxOutputFolder"; - this.textBoxOutputFolder.Size = new System.Drawing.Size(302, 20); - this.textBoxOutputFolder.TabIndex = 7; - // - // labelEncoding - // - this.labelEncoding.AutoSize = true; - this.labelEncoding.Location = new System.Drawing.Point(10, 267); - this.labelEncoding.Name = "labelEncoding"; - this.labelEncoding.Size = new System.Drawing.Size(52, 13); - this.labelEncoding.TabIndex = 9; - this.labelEncoding.Text = "Encoding"; - // - // radioButtonSaveInSourceFolder - // - this.radioButtonSaveInSourceFolder.AutoSize = true; - this.radioButtonSaveInSourceFolder.Checked = true; - this.radioButtonSaveInSourceFolder.Location = new System.Drawing.Point(10, 27); - this.radioButtonSaveInSourceFolder.Name = "radioButtonSaveInSourceFolder"; - this.radioButtonSaveInSourceFolder.Size = new System.Drawing.Size(141, 17); - this.radioButtonSaveInSourceFolder.TabIndex = 0; - this.radioButtonSaveInSourceFolder.TabStop = true; - this.radioButtonSaveInSourceFolder.Text = "Save in source file folder"; - this.radioButtonSaveInSourceFolder.UseVisualStyleBackColor = true; - this.radioButtonSaveInSourceFolder.CheckedChanged += new System.EventHandler(this.radioButtonSaveInSourceFolder_CheckedChanged); - // - // comboBoxEncoding - // - this.comboBoxEncoding.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxEncoding.FormattingEnabled = true; - this.comboBoxEncoding.Location = new System.Drawing.Point(80, 264); - this.comboBoxEncoding.Name = "comboBoxEncoding"; - this.comboBoxEncoding.Size = new System.Drawing.Size(214, 21); - this.comboBoxEncoding.TabIndex = 11; - // - // labelOutputFormat - // - this.labelOutputFormat.AutoSize = true; - this.labelOutputFormat.Location = new System.Drawing.Point(10, 212); - this.labelOutputFormat.Name = "labelOutputFormat"; - this.labelOutputFormat.Size = new System.Drawing.Size(39, 13); - this.labelOutputFormat.TabIndex = 6; - this.labelOutputFormat.Text = "Format"; - // - // groupBoxInput - // - this.groupBoxInput.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxInput.Controls.Add(this.labelNumberOfFiles); - this.groupBoxInput.Controls.Add(this.textBoxFilter); - this.groupBoxInput.Controls.Add(this.labelFilter); - this.groupBoxInput.Controls.Add(this.comboBoxFilter); - this.groupBoxInput.Controls.Add(this.checkBoxScanFolderRecursive); - this.groupBoxInput.Controls.Add(this.buttonSearchFolder); - this.groupBoxInput.Controls.Add(this.buttonInputBrowse); - this.groupBoxInput.Controls.Add(this.labelChooseInputFiles); - this.groupBoxInput.Controls.Add(this.listViewInputFiles); - this.groupBoxInput.Location = new System.Drawing.Point(12, 12); - this.groupBoxInput.Name = "groupBoxInput"; - this.groupBoxInput.Size = new System.Drawing.Size(1014, 287); - this.groupBoxInput.TabIndex = 0; - this.groupBoxInput.TabStop = false; - this.groupBoxInput.Text = "Input"; - // - // labelNumberOfFiles - // - this.labelNumberOfFiles.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.labelNumberOfFiles.Location = new System.Drawing.Point(872, 258); - this.labelNumberOfFiles.Name = "labelNumberOfFiles"; - this.labelNumberOfFiles.Size = new System.Drawing.Size(100, 16); - this.labelNumberOfFiles.TabIndex = 14; - this.labelNumberOfFiles.Text = "labelNumberOfFiles"; - this.labelNumberOfFiles.TextAlign = System.Drawing.ContentAlignment.TopRight; - // - // textBoxFilter - // - this.textBoxFilter.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.textBoxFilter.Location = new System.Drawing.Point(422, 258); - this.textBoxFilter.Name = "textBoxFilter"; - this.textBoxFilter.Size = new System.Drawing.Size(158, 20); - this.textBoxFilter.TabIndex = 13; - // - // labelFilter - // - this.labelFilter.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelFilter.AutoSize = true; - this.labelFilter.Location = new System.Drawing.Point(11, 261); - this.labelFilter.Name = "labelFilter"; - this.labelFilter.Size = new System.Drawing.Size(29, 13); - this.labelFilter.TabIndex = 11; - this.labelFilter.Text = "Filter"; - // - // comboBoxFilter - // - this.comboBoxFilter.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.comboBoxFilter.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxFilter.FormattingEnabled = true; - this.comboBoxFilter.Items.AddRange(new object[] { - "All files", - "SubRip .srt files without BOM header", - "Files with subtitle with more than two lines", - "Files that contains...", - "File name cotains...", - "Mkv language code contains..."}); - this.comboBoxFilter.Location = new System.Drawing.Point(81, 258); - this.comboBoxFilter.Name = "comboBoxFilter"; - this.comboBoxFilter.Size = new System.Drawing.Size(335, 21); - this.comboBoxFilter.TabIndex = 12; - this.comboBoxFilter.SelectedIndexChanged += new System.EventHandler(this.comboBoxFilter_SelectedIndexChanged); - // - // checkBoxScanFolderRecursive - // - this.checkBoxScanFolderRecursive.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.checkBoxScanFolderRecursive.AutoSize = true; - this.checkBoxScanFolderRecursive.Checked = true; - this.checkBoxScanFolderRecursive.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxScanFolderRecursive.Location = new System.Drawing.Point(778, 16); - this.checkBoxScanFolderRecursive.Name = "checkBoxScanFolderRecursive"; - this.checkBoxScanFolderRecursive.Size = new System.Drawing.Size(74, 17); - this.checkBoxScanFolderRecursive.TabIndex = 0; - this.checkBoxScanFolderRecursive.Text = "Recursive"; - this.checkBoxScanFolderRecursive.UseVisualStyleBackColor = true; - // - // buttonSearchFolder - // - this.buttonSearchFolder.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonSearchFolder.Location = new System.Drawing.Point(858, 12); - this.buttonSearchFolder.Name = "buttonSearchFolder"; - this.buttonSearchFolder.Size = new System.Drawing.Size(116, 23); - this.buttonSearchFolder.TabIndex = 1; - this.buttonSearchFolder.Text = "Search folder..."; - this.buttonSearchFolder.UseVisualStyleBackColor = true; - this.buttonSearchFolder.Click += new System.EventHandler(this.buttonSearchFolder_Click); - // - // buttonInputBrowse - // - this.buttonInputBrowse.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonInputBrowse.Location = new System.Drawing.Point(979, 41); - this.buttonInputBrowse.Name = "buttonInputBrowse"; - this.buttonInputBrowse.Size = new System.Drawing.Size(26, 23); - this.buttonInputBrowse.TabIndex = 3; - this.buttonInputBrowse.Text = "..."; - this.buttonInputBrowse.UseVisualStyleBackColor = true; - this.buttonInputBrowse.Click += new System.EventHandler(this.buttonInputBrowse_Click); - // - // labelChooseInputFiles - // - this.labelChooseInputFiles.AutoSize = true; - this.labelChooseInputFiles.Location = new System.Drawing.Point(5, 25); - this.labelChooseInputFiles.Name = "labelChooseInputFiles"; - this.labelChooseInputFiles.Size = new System.Drawing.Size(202, 13); - this.labelChooseInputFiles.TabIndex = 0; - this.labelChooseInputFiles.Text = "Choose input files (browse or drag-n-drop)"; - // - // listViewInputFiles - // - this.listViewInputFiles.AllowDrop = true; - this.listViewInputFiles.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.listViewInputFiles.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeaderFName, - this.columnHeaderSize, - this.columnHeaderFormat, - this.columnHeaderStatus}); - this.listViewInputFiles.ContextMenuStrip = this.contextMenuStripFiles; - this.listViewInputFiles.FullRowSelect = true; - this.listViewInputFiles.HideSelection = false; - this.listViewInputFiles.Location = new System.Drawing.Point(6, 41); - this.listViewInputFiles.Name = "listViewInputFiles"; - this.listViewInputFiles.Size = new System.Drawing.Size(968, 211); - this.listViewInputFiles.TabIndex = 2; - this.listViewInputFiles.UseCompatibleStateImageBehavior = false; - this.listViewInputFiles.View = System.Windows.Forms.View.Details; - this.listViewInputFiles.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.listViewInputFiles_ColumnClick); - this.listViewInputFiles.DragDrop += new System.Windows.Forms.DragEventHandler(this.listViewInputFiles_DragDrop); - this.listViewInputFiles.DragEnter += new System.Windows.Forms.DragEventHandler(this.listViewInputFiles_DragEnter); - this.listViewInputFiles.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ListViewInputFilesKeyDown); - // - // columnHeaderFName - // - this.columnHeaderFName.Text = "File name"; - this.columnHeaderFName.Width = 500; - // - // columnHeaderSize - // - this.columnHeaderSize.Text = "Size"; - this.columnHeaderSize.Width = 75; - // - // columnHeaderFormat - // - this.columnHeaderFormat.Text = "Format"; - this.columnHeaderFormat.Width = 200; - // - // columnHeaderStatus - // - this.columnHeaderStatus.Text = "Status"; - this.columnHeaderStatus.Width = 124; - // - // contextMenuStripFiles - // - this.contextMenuStripFiles.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.addFilesToolStripMenuItem, - this.toolStripSeparator2, - this.removeToolStripMenuItem, - this.removeAllToolStripMenuItem, - this.openContainingFolderToolStripMenuItem, - this.toolStripSeparator1, - this.convertMkvSettingsToolStripMenuItem}); - this.contextMenuStripFiles.Name = "contextMenuStripStyles"; - this.contextMenuStripFiles.Size = new System.Drawing.Size(400, 126); - this.contextMenuStripFiles.Opening += new System.ComponentModel.CancelEventHandler(this.ContextMenuStripFilesOpening); - // - // addFilesToolStripMenuItem - // - this.addFilesToolStripMenuItem.Name = "addFilesToolStripMenuItem"; - this.addFilesToolStripMenuItem.Size = new System.Drawing.Size(399, 22); - this.addFilesToolStripMenuItem.Text = "Add files"; - this.addFilesToolStripMenuItem.Click += new System.EventHandler(this.addFilesToolStripMenuItem_Click); - // - // toolStripSeparator2 - // - this.toolStripSeparator2.Name = "toolStripSeparator2"; - this.toolStripSeparator2.Size = new System.Drawing.Size(396, 6); - // - // removeToolStripMenuItem - // - this.removeToolStripMenuItem.Name = "removeToolStripMenuItem"; - this.removeToolStripMenuItem.Size = new System.Drawing.Size(399, 22); - this.removeToolStripMenuItem.Text = "Remove"; - this.removeToolStripMenuItem.Click += new System.EventHandler(this.RemoveToolStripMenuItemClick); - // - // removeAllToolStripMenuItem - // - this.removeAllToolStripMenuItem.Name = "removeAllToolStripMenuItem"; - this.removeAllToolStripMenuItem.Size = new System.Drawing.Size(399, 22); - this.removeAllToolStripMenuItem.Text = "Remove all"; - this.removeAllToolStripMenuItem.Click += new System.EventHandler(this.RemoveAllToolStripMenuItemClick); - // - // openContainingFolderToolStripMenuItem - // - this.openContainingFolderToolStripMenuItem.Name = "openContainingFolderToolStripMenuItem"; - this.openContainingFolderToolStripMenuItem.Size = new System.Drawing.Size(399, 22); - this.openContainingFolderToolStripMenuItem.Text = "Open containing folder"; - this.openContainingFolderToolStripMenuItem.Click += new System.EventHandler(this.openContainingFolderToolStripMenuItem_Click); - // - // toolStripSeparator1 - // - this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(396, 6); - // - // convertMkvSettingsToolStripMenuItem - // - this.convertMkvSettingsToolStripMenuItem.Name = "convertMkvSettingsToolStripMenuItem"; - this.convertMkvSettingsToolStripMenuItem.Size = new System.Drawing.Size(399, 22); - this.convertMkvSettingsToolStripMenuItem.Text = "Mkv language in output file name: Three letter language code"; - this.convertMkvSettingsToolStripMenuItem.Click += new System.EventHandler(this.convertMkvThreeLetterLanguageCodesToTwoLettersToolStripMenuItem_Click); - // - // openFileDialog1 - // - this.openFileDialog1.FileName = "openFileDialog1"; - // - // progressBar1 - // - this.progressBar1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.progressBar1.Location = new System.Drawing.Point(15, 627); - this.progressBar1.Name = "progressBar1"; - this.progressBar1.Size = new System.Drawing.Size(820, 10); - this.progressBar1.TabIndex = 8; - // - // labelStatus - // - this.labelStatus.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelStatus.AutoSize = true; - this.labelStatus.Location = new System.Drawing.Point(12, 611); - this.labelStatus.Name = "labelStatus"; - this.labelStatus.Size = new System.Drawing.Size(59, 13); - this.labelStatus.TabIndex = 9; - this.labelStatus.Text = "labelStatus"; - // - // BatchConvert - // - this.AllowDrop = true; - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(1035, 651); - this.Controls.Add(this.labelStatus); - this.Controls.Add(this.progressBar1); - this.Controls.Add(this.groupBoxOutput); - this.Controls.Add(this.groupBoxInput); - this.Controls.Add(this.buttonConvert); - this.Controls.Add(this.buttonCancel); - this.KeyPreview = true; - this.MinimumSize = new System.Drawing.Size(1024, 578); - this.Name = "BatchConvert"; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Batch convert"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.BatchConvert_FormClosing); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.BatchConvert_KeyDown); - this.groupBoxConvertOptions.ResumeLayout(false); - this.groupBoxDeleteLines.ResumeLayout(false); - this.groupBoxDeleteLines.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDeleteLast)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDeleteFirst)).EndInit(); - this.groupBoxRemoveStyle.ResumeLayout(false); - this.groupBoxRemoveStyle.PerformLayout(); - this.groupBoxOffsetTimeCodes.ResumeLayout(false); - this.groupBoxOffsetTimeCodes.PerformLayout(); - this.contextMenuStripOptions.ResumeLayout(false); - this.groupBoxChangeFrameRate.ResumeLayout(false); - this.groupBoxChangeFrameRate.PerformLayout(); - this.groupBoxFixRtl.ResumeLayout(false); - this.groupBoxFixRtl.PerformLayout(); - this.groupBoxSpeed.ResumeLayout(false); - this.groupBoxSpeed.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPercent)).EndInit(); - this.groupBoxChangeCasing.ResumeLayout(false); - this.groupBoxChangeCasing.PerformLayout(); - this.groupBoxMergeShortLines.ResumeLayout(false); - this.groupBoxMergeShortLines.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxCharacters)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxMillisecondsBetweenLines)).EndInit(); - this.groupBoxAdjustDuration.ResumeLayout(false); - this.groupBoxAdjustDuration.PerformLayout(); - this.panelAdjustDurationFixed.ResumeLayout(false); - this.panelAdjustDurationFixed.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownFixedMilliseconds)).EndInit(); - this.panelAdjustDurationAddPercent.ResumeLayout(false); - this.panelAdjustDurationAddPercent.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownAdjustViaPercent)).EndInit(); - this.panelAdjustDurationAddSeconds.ResumeLayout(false); - this.panelAdjustDurationAddSeconds.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSeconds)).EndInit(); - this.panelAdjustDurationRecalc.ResumeLayout(false); - this.panelAdjustDurationRecalc.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownOptimalCharsSec)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxCharsSec)).EndInit(); - this.groupBoxOutput.ResumeLayout(false); - this.groupBoxOutput.PerformLayout(); - this.groupBoxInput.ResumeLayout(false); - this.groupBoxInput.PerformLayout(); - this.contextMenuStripFiles.ResumeLayout(false); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button buttonConvert; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.GroupBox groupBoxConvertOptions; - private System.Windows.Forms.GroupBox groupBoxOutput; - private System.Windows.Forms.ComboBox comboBoxSubtitleFormats; - private System.Windows.Forms.Label labelEncoding; - private System.Windows.Forms.ComboBox comboBoxEncoding; - private System.Windows.Forms.Label labelOutputFormat; - private System.Windows.Forms.GroupBox groupBoxInput; - private System.Windows.Forms.Button buttonInputBrowse; - private System.Windows.Forms.Label labelChooseInputFiles; - private System.Windows.Forms.ListView listViewInputFiles; - private System.Windows.Forms.ColumnHeader columnHeaderFName; - private System.Windows.Forms.ColumnHeader columnHeaderSize; - private System.Windows.Forms.ColumnHeader columnHeaderFormat; - private System.Windows.Forms.FolderBrowserDialog folderBrowserDialog1; - private System.Windows.Forms.OpenFileDialog openFileDialog1; - private System.Windows.Forms.ColumnHeader columnHeaderStatus; - private System.Windows.Forms.Button buttonStyles; - private System.Windows.Forms.GroupBox groupBoxOffsetTimeCodes; - private System.Windows.Forms.GroupBox groupBoxChangeFrameRate; - private Controls.TimeUpDown timeUpDownAdjust; - private System.Windows.Forms.Label labelHourMinSecMilliSecond; - private System.Windows.Forms.ComboBox comboBoxFrameRateTo; - private System.Windows.Forms.Label labelToFrameRate; - private System.Windows.Forms.ComboBox comboBoxFrameRateFrom; - private System.Windows.Forms.Label labelFromFrameRate; - private System.Windows.Forms.ContextMenuStrip contextMenuStripFiles; - private System.Windows.Forms.ToolStripMenuItem removeToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem removeAllToolStripMenuItem; - private System.Windows.Forms.ProgressBar progressBar1; - private System.Windows.Forms.Label labelStatus; - private System.Windows.Forms.RadioButton radioButtonShowLater; - private System.Windows.Forms.RadioButton radioButtonShowEarlier; - private System.Windows.Forms.Button buttonSearchFolder; - private System.Windows.Forms.CheckBox checkBoxScanFolderRecursive; - private System.Windows.Forms.Label labelFilter; - private System.Windows.Forms.ComboBox comboBoxFilter; - private System.Windows.Forms.TextBox textBoxFilter; - private System.Windows.Forms.GroupBox groupBoxSpeed; - private System.Windows.Forms.NumericUpDown numericUpDownPercent; - private System.Windows.Forms.Label labelPercent; - private System.Windows.Forms.RadioButton radioButtonToDropFrame; - private System.Windows.Forms.RadioButton radioButtonSpeedFromDropFrame; - private System.Windows.Forms.RadioButton radioButtonSpeedCustom; - private System.Windows.Forms.CheckBox checkBoxUseStyleFromSource; - private System.Windows.Forms.Button buttonTransportStreamSettings; - private System.Windows.Forms.RadioButton radioButtonSaveInOutputFolder; - private System.Windows.Forms.LinkLabel linkLabelOpenOutputFolder; - private System.Windows.Forms.CheckBox checkBoxOverwrite; - private System.Windows.Forms.Button buttonChooseFolder; - private System.Windows.Forms.TextBox textBoxOutputFolder; - private System.Windows.Forms.RadioButton radioButtonSaveInSourceFolder; - private System.Windows.Forms.ListView listViewConvertOptions; - private System.Windows.Forms.ColumnHeader ActionCheckBox; - private System.Windows.Forms.ColumnHeader Action; - private System.Windows.Forms.Button buttonConvertOptionsSettings; - private System.Windows.Forms.GroupBox groupBoxFixRtl; - private System.Windows.Forms.RadioButton radioButtonReverseStartEnd; - private System.Windows.Forms.RadioButton radioButtonRemoveUnicode; - private System.Windows.Forms.RadioButton radioButtonAddUnicode; - private System.Windows.Forms.GroupBox groupBoxMergeShortLines; - private System.Windows.Forms.CheckBox checkBoxOnlyContinuationLines; - private System.Windows.Forms.NumericUpDown numericUpDownMaxCharacters; - private System.Windows.Forms.NumericUpDown numericUpDownMaxMillisecondsBetweenLines; - private System.Windows.Forms.Label labelMaxMillisecondsBetweenLines; - private System.Windows.Forms.Label labelMaxCharacters; - private System.Windows.Forms.Button buttonSwapFrameRate; - private System.Windows.Forms.GroupBox groupBoxChangeCasing; - private System.Windows.Forms.RadioButton radioButtonFixOnlyNames; - private System.Windows.Forms.RadioButton radioButtonLowercase; - private System.Windows.Forms.RadioButton radioButtonUppercase; - private System.Windows.Forms.RadioButton radioButtonNormal; - private System.Windows.Forms.ContextMenuStrip contextMenuStripOptions; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSelectAll; - private System.Windows.Forms.ToolStripMenuItem inverseSelectionToolStripMenuItem; - private System.Windows.Forms.Button buttonBrowseEncoding; - private System.Windows.Forms.Label labelNumberOfFiles; - private System.Windows.Forms.ToolStripMenuItem openContainingFolderToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; - private System.Windows.Forms.ToolStripMenuItem convertMkvSettingsToolStripMenuItem; - private System.Windows.Forms.GroupBox groupBoxRemoveStyle; - private System.Windows.Forms.TextBox textBoxRemoveStyle; - private System.Windows.Forms.Label labelStyleName; - private System.Windows.Forms.GroupBox groupBoxAdjustDuration; - private System.Windows.Forms.Label labelAdjustDurationVia; - private System.Windows.Forms.ComboBox comboBoxAdjustDurationVia; - private System.Windows.Forms.Panel panelAdjustDurationAddPercent; - private System.Windows.Forms.Panel panelAdjustDurationAddSeconds; - private System.Windows.Forms.NumericUpDown numericUpDownSeconds; - private System.Windows.Forms.Label labelAddSeconds; - private System.Windows.Forms.Panel panelAdjustDurationFixed; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.NumericUpDown numericUpDownAdjustViaPercent; - private System.Windows.Forms.Label labelAdjustViaPercent; - private System.Windows.Forms.NumericUpDown numericUpDownFixedMilliseconds; - private System.Windows.Forms.Label labelMillisecondsFixed; - private System.Windows.Forms.Panel panelAdjustDurationRecalc; - private System.Windows.Forms.CheckBox checkBoxExtendOnly; - private System.Windows.Forms.NumericUpDown numericUpDownOptimalCharsSec; - private System.Windows.Forms.Label labelOptimalCharsSec; - private System.Windows.Forms.NumericUpDown numericUpDownMaxCharsSec; - private System.Windows.Forms.Label labelMaxCharsPerSecond; - private System.Windows.Forms.ToolStripMenuItem addFilesToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; - private System.Windows.Forms.GroupBox groupBoxDeleteLines; - private System.Windows.Forms.TextBox textBoxDeleteContains; - private System.Windows.Forms.Label labelDeleteLinesContaining; - private System.Windows.Forms.NumericUpDown numericUpDownDeleteLast; - private System.Windows.Forms.Label labelDeleteLastLines; - private System.Windows.Forms.NumericUpDown numericUpDownDeleteFirst; - private System.Windows.Forms.Label labelDeleteFirstLines; - } +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class BatchConvert + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + TimeCode timeCode1 = new TimeCode(); + this.buttonConvert = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.groupBoxConvertOptions = new System.Windows.Forms.GroupBox(); + this.groupBoxDeleteLines = new System.Windows.Forms.GroupBox(); + this.textBoxDeleteContains = new System.Windows.Forms.TextBox(); + this.labelDeleteLinesContaining = new System.Windows.Forms.Label(); + this.numericUpDownDeleteLast = new System.Windows.Forms.NumericUpDown(); + this.labelDeleteLastLines = new System.Windows.Forms.Label(); + this.numericUpDownDeleteFirst = new System.Windows.Forms.NumericUpDown(); + this.labelDeleteFirstLines = new System.Windows.Forms.Label(); + this.groupBoxRemoveStyle = new System.Windows.Forms.GroupBox(); + this.textBoxRemoveStyle = new System.Windows.Forms.TextBox(); + this.labelStyleName = new System.Windows.Forms.Label(); + this.groupBoxOffsetTimeCodes = new System.Windows.Forms.GroupBox(); + this.radioButtonShowLater = new System.Windows.Forms.RadioButton(); + this.radioButtonShowEarlier = new System.Windows.Forms.RadioButton(); + this.timeUpDownAdjust = new Nikse.SubtitleEdit.Controls.TimeUpDown(); + this.labelHourMinSecMilliSecond = new System.Windows.Forms.Label(); + this.buttonConvertOptionsSettings = new System.Windows.Forms.Button(); + this.listViewConvertOptions = new System.Windows.Forms.ListView(); + this.ActionCheckBox = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.Action = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.contextMenuStripOptions = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItemSelectAll = new System.Windows.Forms.ToolStripMenuItem(); + this.inverseSelectionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.groupBoxChangeFrameRate = new System.Windows.Forms.GroupBox(); + this.buttonSwapFrameRate = new System.Windows.Forms.Button(); + this.comboBoxFrameRateTo = new System.Windows.Forms.ComboBox(); + this.labelToFrameRate = new System.Windows.Forms.Label(); + this.comboBoxFrameRateFrom = new System.Windows.Forms.ComboBox(); + this.labelFromFrameRate = new System.Windows.Forms.Label(); + this.groupBoxFixRtl = new System.Windows.Forms.GroupBox(); + this.radioButtonReverseStartEnd = new System.Windows.Forms.RadioButton(); + this.radioButtonRemoveUnicode = new System.Windows.Forms.RadioButton(); + this.radioButtonAddUnicode = new System.Windows.Forms.RadioButton(); + this.groupBoxSpeed = new System.Windows.Forms.GroupBox(); + this.radioButtonToDropFrame = new System.Windows.Forms.RadioButton(); + this.radioButtonSpeedFromDropFrame = new System.Windows.Forms.RadioButton(); + this.radioButtonSpeedCustom = new System.Windows.Forms.RadioButton(); + this.numericUpDownPercent = new System.Windows.Forms.NumericUpDown(); + this.labelPercent = new System.Windows.Forms.Label(); + this.groupBoxChangeCasing = new System.Windows.Forms.GroupBox(); + this.radioButtonFixOnlyNames = new System.Windows.Forms.RadioButton(); + this.radioButtonLowercase = new System.Windows.Forms.RadioButton(); + this.radioButtonUppercase = new System.Windows.Forms.RadioButton(); + this.radioButtonNormal = new System.Windows.Forms.RadioButton(); + this.groupBoxMergeShortLines = new System.Windows.Forms.GroupBox(); + this.checkBoxOnlyContinuationLines = new System.Windows.Forms.CheckBox(); + this.numericUpDownMaxCharacters = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownMaxMillisecondsBetweenLines = new System.Windows.Forms.NumericUpDown(); + this.labelMaxMillisecondsBetweenLines = new System.Windows.Forms.Label(); + this.labelMaxCharacters = new System.Windows.Forms.Label(); + this.groupBoxAdjustDuration = new System.Windows.Forms.GroupBox(); + this.comboBoxAdjustDurationVia = new System.Windows.Forms.ComboBox(); + this.labelAdjustDurationVia = new System.Windows.Forms.Label(); + this.panelAdjustDurationFixed = new System.Windows.Forms.Panel(); + this.numericUpDownFixedMilliseconds = new System.Windows.Forms.NumericUpDown(); + this.labelMillisecondsFixed = new System.Windows.Forms.Label(); + this.panelAdjustDurationAddPercent = new System.Windows.Forms.Panel(); + this.label1 = new System.Windows.Forms.Label(); + this.numericUpDownAdjustViaPercent = new System.Windows.Forms.NumericUpDown(); + this.labelAdjustViaPercent = new System.Windows.Forms.Label(); + this.panelAdjustDurationAddSeconds = new System.Windows.Forms.Panel(); + this.numericUpDownSeconds = new System.Windows.Forms.NumericUpDown(); + this.labelAddSeconds = new System.Windows.Forms.Label(); + this.panelAdjustDurationRecalc = new System.Windows.Forms.Panel(); + this.checkBoxExtendOnly = new System.Windows.Forms.CheckBox(); + this.numericUpDownOptimalCharsSec = new System.Windows.Forms.NumericUpDown(); + this.labelOptimalCharsSec = new System.Windows.Forms.Label(); + this.numericUpDownMaxCharsSec = new System.Windows.Forms.NumericUpDown(); + this.labelMaxCharsPerSecond = new System.Windows.Forms.Label(); + this.groupBoxOutput = new System.Windows.Forms.GroupBox(); + this.buttonBrowseEncoding = new System.Windows.Forms.Button(); + this.radioButtonSaveInOutputFolder = new System.Windows.Forms.RadioButton(); + this.buttonTransportStreamSettings = new System.Windows.Forms.Button(); + this.linkLabelOpenOutputFolder = new System.Windows.Forms.LinkLabel(); + this.checkBoxUseStyleFromSource = new System.Windows.Forms.CheckBox(); + this.checkBoxOverwrite = new System.Windows.Forms.CheckBox(); + this.buttonStyles = new System.Windows.Forms.Button(); + this.buttonChooseFolder = new System.Windows.Forms.Button(); + this.comboBoxSubtitleFormats = new System.Windows.Forms.ComboBox(); + this.textBoxOutputFolder = new System.Windows.Forms.TextBox(); + this.labelEncoding = new System.Windows.Forms.Label(); + this.radioButtonSaveInSourceFolder = new System.Windows.Forms.RadioButton(); + this.comboBoxEncoding = new System.Windows.Forms.ComboBox(); + this.labelOutputFormat = new System.Windows.Forms.Label(); + this.groupBoxInput = new System.Windows.Forms.GroupBox(); + this.labelNumberOfFiles = new System.Windows.Forms.Label(); + this.textBoxFilter = new System.Windows.Forms.TextBox(); + this.labelFilter = new System.Windows.Forms.Label(); + this.comboBoxFilter = new System.Windows.Forms.ComboBox(); + this.checkBoxScanFolderRecursive = new System.Windows.Forms.CheckBox(); + this.buttonSearchFolder = new System.Windows.Forms.Button(); + this.buttonInputBrowse = new System.Windows.Forms.Button(); + this.labelChooseInputFiles = new System.Windows.Forms.Label(); + this.listViewInputFiles = new System.Windows.Forms.ListView(); + this.columnHeaderFName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderSize = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderFormat = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderStatus = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.contextMenuStripFiles = new System.Windows.Forms.ContextMenuStrip(this.components); + this.addFilesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.removeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.removeAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.openContainingFolderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.convertMkvSettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.folderBrowserDialog1 = new System.Windows.Forms.FolderBrowserDialog(); + this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); + this.progressBar1 = new System.Windows.Forms.ProgressBar(); + this.labelStatus = new System.Windows.Forms.Label(); + this.groupBoxConvertOptions.SuspendLayout(); + this.groupBoxDeleteLines.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDeleteLast)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDeleteFirst)).BeginInit(); + this.groupBoxRemoveStyle.SuspendLayout(); + this.groupBoxOffsetTimeCodes.SuspendLayout(); + this.contextMenuStripOptions.SuspendLayout(); + this.groupBoxChangeFrameRate.SuspendLayout(); + this.groupBoxFixRtl.SuspendLayout(); + this.groupBoxSpeed.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPercent)).BeginInit(); + this.groupBoxChangeCasing.SuspendLayout(); + this.groupBoxMergeShortLines.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxCharacters)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxMillisecondsBetweenLines)).BeginInit(); + this.groupBoxAdjustDuration.SuspendLayout(); + this.panelAdjustDurationFixed.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownFixedMilliseconds)).BeginInit(); + this.panelAdjustDurationAddPercent.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownAdjustViaPercent)).BeginInit(); + this.panelAdjustDurationAddSeconds.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSeconds)).BeginInit(); + this.panelAdjustDurationRecalc.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownOptimalCharsSec)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxCharsSec)).BeginInit(); + this.groupBoxOutput.SuspendLayout(); + this.groupBoxInput.SuspendLayout(); + this.contextMenuStripFiles.SuspendLayout(); + this.SuspendLayout(); + // + // buttonConvert + // + this.buttonConvert.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonConvert.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonConvert.Location = new System.Drawing.Point(844, 618); + this.buttonConvert.Name = "buttonConvert"; + this.buttonConvert.Size = new System.Drawing.Size(98, 23); + this.buttonConvert.TabIndex = 2; + this.buttonConvert.Text = "&Convert"; + this.buttonConvert.UseVisualStyleBackColor = true; + this.buttonConvert.Click += new System.EventHandler(this.buttonConvert_Click); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(948, 618); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 3; + this.buttonCancel.Text = "&Done"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // groupBoxConvertOptions + // + this.groupBoxConvertOptions.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxConvertOptions.Controls.Add(this.groupBoxDeleteLines); + this.groupBoxConvertOptions.Controls.Add(this.groupBoxRemoveStyle); + this.groupBoxConvertOptions.Controls.Add(this.groupBoxOffsetTimeCodes); + this.groupBoxConvertOptions.Controls.Add(this.buttonConvertOptionsSettings); + this.groupBoxConvertOptions.Controls.Add(this.listViewConvertOptions); + this.groupBoxConvertOptions.Controls.Add(this.groupBoxChangeFrameRate); + this.groupBoxConvertOptions.Controls.Add(this.groupBoxFixRtl); + this.groupBoxConvertOptions.Controls.Add(this.groupBoxSpeed); + this.groupBoxConvertOptions.Controls.Add(this.groupBoxChangeCasing); + this.groupBoxConvertOptions.Controls.Add(this.groupBoxMergeShortLines); + this.groupBoxConvertOptions.Controls.Add(this.groupBoxAdjustDuration); + this.groupBoxConvertOptions.Location = new System.Drawing.Point(422, 19); + this.groupBoxConvertOptions.Name = "groupBoxConvertOptions"; + this.groupBoxConvertOptions.Size = new System.Drawing.Size(583, 275); + this.groupBoxConvertOptions.TabIndex = 11; + this.groupBoxConvertOptions.TabStop = false; + this.groupBoxConvertOptions.Text = "Convert options"; + // + // groupBoxDeleteLines + // + this.groupBoxDeleteLines.Controls.Add(this.textBoxDeleteContains); + this.groupBoxDeleteLines.Controls.Add(this.labelDeleteLinesContaining); + this.groupBoxDeleteLines.Controls.Add(this.numericUpDownDeleteLast); + this.groupBoxDeleteLines.Controls.Add(this.labelDeleteLastLines); + this.groupBoxDeleteLines.Controls.Add(this.numericUpDownDeleteFirst); + this.groupBoxDeleteLines.Controls.Add(this.labelDeleteFirstLines); + this.groupBoxDeleteLines.Location = new System.Drawing.Point(305, 94); + this.groupBoxDeleteLines.Name = "groupBoxDeleteLines"; + this.groupBoxDeleteLines.Size = new System.Drawing.Size(271, 140); + this.groupBoxDeleteLines.TabIndex = 308; + this.groupBoxDeleteLines.TabStop = false; + this.groupBoxDeleteLines.Text = "Delete lines"; + this.groupBoxDeleteLines.Visible = false; + // + // textBoxDeleteContains + // + this.textBoxDeleteContains.Location = new System.Drawing.Point(10, 110); + this.textBoxDeleteContains.Name = "textBoxDeleteContains"; + this.textBoxDeleteContains.Size = new System.Drawing.Size(237, 20); + this.textBoxDeleteContains.TabIndex = 5; + // + // labelDeleteLinesContaining + // + this.labelDeleteLinesContaining.AutoSize = true; + this.labelDeleteLinesContaining.Location = new System.Drawing.Point(9, 89); + this.labelDeleteLinesContaining.Name = "labelDeleteLinesContaining"; + this.labelDeleteLinesContaining.Size = new System.Drawing.Size(114, 13); + this.labelDeleteLinesContaining.TabIndex = 4; + this.labelDeleteLinesContaining.Text = "Delete lines containing"; + // + // numericUpDownDeleteLast + // + this.numericUpDownDeleteLast.Location = new System.Drawing.Point(92, 45); + this.numericUpDownDeleteLast.Name = "numericUpDownDeleteLast"; + this.numericUpDownDeleteLast.Size = new System.Drawing.Size(43, 20); + this.numericUpDownDeleteLast.TabIndex = 3; + // + // labelDeleteLastLines + // + this.labelDeleteLastLines.AutoSize = true; + this.labelDeleteLastLines.Location = new System.Drawing.Point(5, 47); + this.labelDeleteLastLines.Name = "labelDeleteLastLines"; + this.labelDeleteLastLines.Size = new System.Drawing.Size(81, 13); + this.labelDeleteLastLines.TabIndex = 2; + this.labelDeleteLastLines.Text = "Delete last lines"; + // + // numericUpDownDeleteFirst + // + this.numericUpDownDeleteFirst.Location = new System.Drawing.Point(93, 19); + this.numericUpDownDeleteFirst.Name = "numericUpDownDeleteFirst"; + this.numericUpDownDeleteFirst.Size = new System.Drawing.Size(43, 20); + this.numericUpDownDeleteFirst.TabIndex = 1; + // + // labelDeleteFirstLines + // + this.labelDeleteFirstLines.AutoSize = true; + this.labelDeleteFirstLines.Location = new System.Drawing.Point(6, 20); + this.labelDeleteFirstLines.Name = "labelDeleteFirstLines"; + this.labelDeleteFirstLines.Size = new System.Drawing.Size(81, 13); + this.labelDeleteFirstLines.TabIndex = 0; + this.labelDeleteFirstLines.Text = "Delete first lines"; + // + // groupBoxRemoveStyle + // + this.groupBoxRemoveStyle.Controls.Add(this.textBoxRemoveStyle); + this.groupBoxRemoveStyle.Controls.Add(this.labelStyleName); + this.groupBoxRemoveStyle.Location = new System.Drawing.Point(307, 12); + this.groupBoxRemoveStyle.Name = "groupBoxRemoveStyle"; + this.groupBoxRemoveStyle.Size = new System.Drawing.Size(271, 76); + this.groupBoxRemoveStyle.TabIndex = 307; + this.groupBoxRemoveStyle.TabStop = false; + this.groupBoxRemoveStyle.Text = "Remove style/actor"; + this.groupBoxRemoveStyle.Visible = false; + // + // textBoxRemoveStyle + // + this.textBoxRemoveStyle.Location = new System.Drawing.Point(6, 35); + this.textBoxRemoveStyle.Name = "textBoxRemoveStyle"; + this.textBoxRemoveStyle.Size = new System.Drawing.Size(257, 20); + this.textBoxRemoveStyle.TabIndex = 8; + // + // labelStyleName + // + this.labelStyleName.AutoSize = true; + this.labelStyleName.Location = new System.Drawing.Point(6, 20); + this.labelStyleName.Name = "labelStyleName"; + this.labelStyleName.Size = new System.Drawing.Size(59, 13); + this.labelStyleName.TabIndex = 0; + this.labelStyleName.Text = "Style/actor"; + // + // groupBoxOffsetTimeCodes + // + this.groupBoxOffsetTimeCodes.Controls.Add(this.radioButtonShowLater); + this.groupBoxOffsetTimeCodes.Controls.Add(this.radioButtonShowEarlier); + this.groupBoxOffsetTimeCodes.Controls.Add(this.timeUpDownAdjust); + this.groupBoxOffsetTimeCodes.Controls.Add(this.labelHourMinSecMilliSecond); + this.groupBoxOffsetTimeCodes.Location = new System.Drawing.Point(305, 19); + this.groupBoxOffsetTimeCodes.Name = "groupBoxOffsetTimeCodes"; + this.groupBoxOffsetTimeCodes.Size = new System.Drawing.Size(271, 119); + this.groupBoxOffsetTimeCodes.TabIndex = 306; + this.groupBoxOffsetTimeCodes.TabStop = false; + this.groupBoxOffsetTimeCodes.Text = "Offset time codes"; + this.groupBoxOffsetTimeCodes.Visible = false; + // + // radioButtonShowLater + // + this.radioButtonShowLater.AutoSize = true; + this.radioButtonShowLater.Checked = true; + this.radioButtonShowLater.Location = new System.Drawing.Point(9, 89); + this.radioButtonShowLater.Name = "radioButtonShowLater"; + this.radioButtonShowLater.Size = new System.Drawing.Size(75, 17); + this.radioButtonShowLater.TabIndex = 3; + this.radioButtonShowLater.TabStop = true; + this.radioButtonShowLater.Text = "Show later"; + this.radioButtonShowLater.UseVisualStyleBackColor = true; + // + // radioButtonShowEarlier + // + this.radioButtonShowEarlier.AutoSize = true; + this.radioButtonShowEarlier.Location = new System.Drawing.Point(9, 66); + this.radioButtonShowEarlier.Name = "radioButtonShowEarlier"; + this.radioButtonShowEarlier.Size = new System.Drawing.Size(83, 17); + this.radioButtonShowEarlier.TabIndex = 2; + this.radioButtonShowEarlier.Text = "Show earlier"; + this.radioButtonShowEarlier.UseVisualStyleBackColor = true; + // + // timeUpDownAdjust + // + this.timeUpDownAdjust.AutoSize = true; + this.timeUpDownAdjust.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.timeUpDownAdjust.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F); + this.timeUpDownAdjust.Location = new System.Drawing.Point(7, 37); + this.timeUpDownAdjust.Margin = new System.Windows.Forms.Padding(4); + this.timeUpDownAdjust.Name = "timeUpDownAdjust"; + this.timeUpDownAdjust.Size = new System.Drawing.Size(111, 27); + this.timeUpDownAdjust.TabIndex = 1; + timeCode1.Hours = 0; + timeCode1.Milliseconds = 0; + timeCode1.Minutes = 0; + timeCode1.Seconds = 0; + timeCode1.TimeSpan = System.TimeSpan.Parse("00:00:00"); + timeCode1.TotalMilliseconds = 0D; + timeCode1.TotalSeconds = 0D; + this.timeUpDownAdjust.TimeCode = timeCode1; + this.timeUpDownAdjust.UseVideoOffset = false; + // + // labelHourMinSecMilliSecond + // + this.labelHourMinSecMilliSecond.AutoSize = true; + this.labelHourMinSecMilliSecond.Location = new System.Drawing.Point(6, 20); + this.labelHourMinSecMilliSecond.Name = "labelHourMinSecMilliSecond"; + this.labelHourMinSecMilliSecond.Size = new System.Drawing.Size(90, 13); + this.labelHourMinSecMilliSecond.TabIndex = 0; + this.labelHourMinSecMilliSecond.Text = "Hours:min:sec.ms"; + // + // buttonConvertOptionsSettings + // + this.buttonConvertOptionsSettings.Location = new System.Drawing.Point(305, 144); + this.buttonConvertOptionsSettings.Name = "buttonConvertOptionsSettings"; + this.buttonConvertOptionsSettings.Size = new System.Drawing.Size(116, 23); + this.buttonConvertOptionsSettings.TabIndex = 302; + this.buttonConvertOptionsSettings.Text = "Settings..."; + this.buttonConvertOptionsSettings.UseVisualStyleBackColor = true; + this.buttonConvertOptionsSettings.Visible = false; + this.buttonConvertOptionsSettings.Click += new System.EventHandler(this.ButtonOptionConvertSettings); + // + // listViewConvertOptions + // + this.listViewConvertOptions.CheckBoxes = true; + this.listViewConvertOptions.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.ActionCheckBox, + this.Action}); + this.listViewConvertOptions.ContextMenuStrip = this.contextMenuStripOptions; + this.listViewConvertOptions.FullRowSelect = true; + this.listViewConvertOptions.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None; + this.listViewConvertOptions.HideSelection = false; + this.listViewConvertOptions.Location = new System.Drawing.Point(6, 17); + this.listViewConvertOptions.MultiSelect = false; + this.listViewConvertOptions.Name = "listViewConvertOptions"; + this.listViewConvertOptions.Size = new System.Drawing.Size(293, 252); + this.listViewConvertOptions.TabIndex = 301; + this.listViewConvertOptions.UseCompatibleStateImageBehavior = false; + this.listViewConvertOptions.View = System.Windows.Forms.View.Details; + this.listViewConvertOptions.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.listViewConvertOptions_ItemChecked); + this.listViewConvertOptions.SelectedIndexChanged += new System.EventHandler(this.listViewConvertOptions_SelectedIndexChanged); + // + // ActionCheckBox + // + this.ActionCheckBox.Width = 30; + // + // Action + // + this.Action.Width = 400; + // + // contextMenuStripOptions + // + this.contextMenuStripOptions.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItemSelectAll, + this.inverseSelectionToolStripMenuItem}); + this.contextMenuStripOptions.Name = "contextMenuStripOptions"; + this.contextMenuStripOptions.Size = new System.Drawing.Size(162, 48); + // + // toolStripMenuItemSelectAll + // + this.toolStripMenuItemSelectAll.Name = "toolStripMenuItemSelectAll"; + this.toolStripMenuItemSelectAll.Size = new System.Drawing.Size(161, 22); + this.toolStripMenuItemSelectAll.Text = "Select all"; + this.toolStripMenuItemSelectAll.Click += new System.EventHandler(this.toolStripMenuItemSelectAll_Click); + // + // inverseSelectionToolStripMenuItem + // + this.inverseSelectionToolStripMenuItem.Name = "inverseSelectionToolStripMenuItem"; + this.inverseSelectionToolStripMenuItem.Size = new System.Drawing.Size(161, 22); + this.inverseSelectionToolStripMenuItem.Text = "Inverse selection"; + this.inverseSelectionToolStripMenuItem.Click += new System.EventHandler(this.inverseSelectionToolStripMenuItem_Click); + // + // groupBoxChangeFrameRate + // + this.groupBoxChangeFrameRate.Controls.Add(this.buttonSwapFrameRate); + this.groupBoxChangeFrameRate.Controls.Add(this.comboBoxFrameRateTo); + this.groupBoxChangeFrameRate.Controls.Add(this.labelToFrameRate); + this.groupBoxChangeFrameRate.Controls.Add(this.comboBoxFrameRateFrom); + this.groupBoxChangeFrameRate.Controls.Add(this.labelFromFrameRate); + this.groupBoxChangeFrameRate.Location = new System.Drawing.Point(307, 12); + this.groupBoxChangeFrameRate.Name = "groupBoxChangeFrameRate"; + this.groupBoxChangeFrameRate.Size = new System.Drawing.Size(269, 90); + this.groupBoxChangeFrameRate.TabIndex = 305; + this.groupBoxChangeFrameRate.TabStop = false; + this.groupBoxChangeFrameRate.Text = "Change frame rate"; + this.groupBoxChangeFrameRate.Visible = false; + // + // buttonSwapFrameRate + // + this.buttonSwapFrameRate.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.buttonSwapFrameRate.Location = new System.Drawing.Point(207, 28); + this.buttonSwapFrameRate.Name = "buttonSwapFrameRate"; + this.buttonSwapFrameRate.Size = new System.Drawing.Size(27, 28); + this.buttonSwapFrameRate.TabIndex = 9; + this.buttonSwapFrameRate.Text = "<->"; + this.buttonSwapFrameRate.UseVisualStyleBackColor = true; + this.buttonSwapFrameRate.Click += new System.EventHandler(this.buttonSwapFrameRate_Click); + // + // comboBoxFrameRateTo + // + this.comboBoxFrameRateTo.FormattingEnabled = true; + this.comboBoxFrameRateTo.Location = new System.Drawing.Point(130, 46); + this.comboBoxFrameRateTo.Name = "comboBoxFrameRateTo"; + this.comboBoxFrameRateTo.Size = new System.Drawing.Size(71, 21); + this.comboBoxFrameRateTo.TabIndex = 3; + // + // labelToFrameRate + // + this.labelToFrameRate.AutoSize = true; + this.labelToFrameRate.Location = new System.Drawing.Point(6, 50); + this.labelToFrameRate.Name = "labelToFrameRate"; + this.labelToFrameRate.Size = new System.Drawing.Size(70, 13); + this.labelToFrameRate.TabIndex = 2; + this.labelToFrameRate.Text = "To frame rate"; + // + // comboBoxFrameRateFrom + // + this.comboBoxFrameRateFrom.FormattingEnabled = true; + this.comboBoxFrameRateFrom.Location = new System.Drawing.Point(130, 17); + this.comboBoxFrameRateFrom.Name = "comboBoxFrameRateFrom"; + this.comboBoxFrameRateFrom.Size = new System.Drawing.Size(71, 21); + this.comboBoxFrameRateFrom.TabIndex = 1; + // + // labelFromFrameRate + // + this.labelFromFrameRate.AutoSize = true; + this.labelFromFrameRate.Location = new System.Drawing.Point(6, 21); + this.labelFromFrameRate.Name = "labelFromFrameRate"; + this.labelFromFrameRate.Size = new System.Drawing.Size(80, 13); + this.labelFromFrameRate.TabIndex = 0; + this.labelFromFrameRate.Text = "From frame rate"; + // + // groupBoxFixRtl + // + this.groupBoxFixRtl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxFixRtl.Controls.Add(this.radioButtonReverseStartEnd); + this.groupBoxFixRtl.Controls.Add(this.radioButtonRemoveUnicode); + this.groupBoxFixRtl.Controls.Add(this.radioButtonAddUnicode); + this.groupBoxFixRtl.Location = new System.Drawing.Point(305, 17); + this.groupBoxFixRtl.Name = "groupBoxFixRtl"; + this.groupBoxFixRtl.Size = new System.Drawing.Size(271, 115); + this.groupBoxFixRtl.TabIndex = 303; + this.groupBoxFixRtl.TabStop = false; + this.groupBoxFixRtl.Text = "Settings"; + this.groupBoxFixRtl.Visible = false; + // + // radioButtonReverseStartEnd + // + this.radioButtonReverseStartEnd.AutoSize = true; + this.radioButtonReverseStartEnd.Location = new System.Drawing.Point(19, 77); + this.radioButtonReverseStartEnd.Name = "radioButtonReverseStartEnd"; + this.radioButtonReverseStartEnd.Size = new System.Drawing.Size(135, 17); + this.radioButtonReverseStartEnd.TabIndex = 2; + this.radioButtonReverseStartEnd.TabStop = true; + this.radioButtonReverseStartEnd.Text = "Reverse RTL start/end"; + this.radioButtonReverseStartEnd.UseVisualStyleBackColor = true; + // + // radioButtonRemoveUnicode + // + this.radioButtonRemoveUnicode.AutoSize = true; + this.radioButtonRemoveUnicode.Location = new System.Drawing.Point(19, 54); + this.radioButtonRemoveUnicode.Name = "radioButtonRemoveUnicode"; + this.radioButtonRemoveUnicode.Size = new System.Drawing.Size(153, 17); + this.radioButtonRemoveUnicode.TabIndex = 1; + this.radioButtonRemoveUnicode.TabStop = true; + this.radioButtonRemoveUnicode.Text = "Remove RTL unicode tags"; + this.radioButtonRemoveUnicode.UseVisualStyleBackColor = true; + // + // radioButtonAddUnicode + // + this.radioButtonAddUnicode.AutoSize = true; + this.radioButtonAddUnicode.Location = new System.Drawing.Point(19, 31); + this.radioButtonAddUnicode.Name = "radioButtonAddUnicode"; + this.radioButtonAddUnicode.Size = new System.Drawing.Size(145, 17); + this.radioButtonAddUnicode.TabIndex = 0; + this.radioButtonAddUnicode.TabStop = true; + this.radioButtonAddUnicode.Text = "Fix RTL via Unicode tags"; + this.radioButtonAddUnicode.UseVisualStyleBackColor = true; + // + // groupBoxSpeed + // + this.groupBoxSpeed.Controls.Add(this.radioButtonToDropFrame); + this.groupBoxSpeed.Controls.Add(this.radioButtonSpeedFromDropFrame); + this.groupBoxSpeed.Controls.Add(this.radioButtonSpeedCustom); + this.groupBoxSpeed.Controls.Add(this.numericUpDownPercent); + this.groupBoxSpeed.Controls.Add(this.labelPercent); + this.groupBoxSpeed.Location = new System.Drawing.Point(305, 17); + this.groupBoxSpeed.Name = "groupBoxSpeed"; + this.groupBoxSpeed.Size = new System.Drawing.Size(271, 129); + this.groupBoxSpeed.TabIndex = 307; + this.groupBoxSpeed.TabStop = false; + this.groupBoxSpeed.Text = "Change speed"; + this.groupBoxSpeed.Visible = false; + // + // radioButtonToDropFrame + // + this.radioButtonToDropFrame.AutoSize = true; + this.radioButtonToDropFrame.Location = new System.Drawing.Point(6, 91); + this.radioButtonToDropFrame.Name = "radioButtonToDropFrame"; + this.radioButtonToDropFrame.Size = new System.Drawing.Size(91, 17); + this.radioButtonToDropFrame.TabIndex = 3; + this.radioButtonToDropFrame.Text = "To drop frame"; + this.radioButtonToDropFrame.UseVisualStyleBackColor = true; + this.radioButtonToDropFrame.CheckedChanged += new System.EventHandler(this.radioButtonToDropFrame_CheckedChanged); + // + // radioButtonSpeedFromDropFrame + // + this.radioButtonSpeedFromDropFrame.AutoSize = true; + this.radioButtonSpeedFromDropFrame.Location = new System.Drawing.Point(6, 68); + this.radioButtonSpeedFromDropFrame.Name = "radioButtonSpeedFromDropFrame"; + this.radioButtonSpeedFromDropFrame.Size = new System.Drawing.Size(101, 17); + this.radioButtonSpeedFromDropFrame.TabIndex = 2; + this.radioButtonSpeedFromDropFrame.Text = "From drop frame"; + this.radioButtonSpeedFromDropFrame.UseVisualStyleBackColor = true; + this.radioButtonSpeedFromDropFrame.CheckedChanged += new System.EventHandler(this.radioButtonSpeedFromDropFrame_CheckedChanged); + // + // radioButtonSpeedCustom + // + this.radioButtonSpeedCustom.AutoSize = true; + this.radioButtonSpeedCustom.Checked = true; + this.radioButtonSpeedCustom.Location = new System.Drawing.Point(6, 45); + this.radioButtonSpeedCustom.Name = "radioButtonSpeedCustom"; + this.radioButtonSpeedCustom.Size = new System.Drawing.Size(60, 17); + this.radioButtonSpeedCustom.TabIndex = 1; + this.radioButtonSpeedCustom.TabStop = true; + this.radioButtonSpeedCustom.Text = "Custom"; + this.radioButtonSpeedCustom.UseVisualStyleBackColor = true; + this.radioButtonSpeedCustom.CheckedChanged += new System.EventHandler(this.radioButtonSpeedCustom_CheckedChanged); + // + // numericUpDownPercent + // + this.numericUpDownPercent.DecimalPlaces = 5; + this.numericUpDownPercent.Location = new System.Drawing.Point(6, 19); + this.numericUpDownPercent.Maximum = new decimal(new int[] { + 200, + 0, + 0, + 0}); + this.numericUpDownPercent.Minimum = new decimal(new int[] { + 50, + 0, + 0, + 0}); + this.numericUpDownPercent.Name = "numericUpDownPercent"; + this.numericUpDownPercent.Size = new System.Drawing.Size(81, 20); + this.numericUpDownPercent.TabIndex = 0; + this.numericUpDownPercent.Value = new decimal(new int[] { + 100, + 0, + 0, + 0}); + // + // labelPercent + // + this.labelPercent.AutoSize = true; + this.labelPercent.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.labelPercent.Location = new System.Drawing.Point(87, 22); + this.labelPercent.Name = "labelPercent"; + this.labelPercent.Size = new System.Drawing.Size(15, 13); + this.labelPercent.TabIndex = 12; + this.labelPercent.Text = "%"; + // + // groupBoxChangeCasing + // + this.groupBoxChangeCasing.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxChangeCasing.Controls.Add(this.radioButtonFixOnlyNames); + this.groupBoxChangeCasing.Controls.Add(this.radioButtonLowercase); + this.groupBoxChangeCasing.Controls.Add(this.radioButtonUppercase); + this.groupBoxChangeCasing.Controls.Add(this.radioButtonNormal); + this.groupBoxChangeCasing.Location = new System.Drawing.Point(308, 16); + this.groupBoxChangeCasing.Name = "groupBoxChangeCasing"; + this.groupBoxChangeCasing.Size = new System.Drawing.Size(268, 125); + this.groupBoxChangeCasing.TabIndex = 308; + this.groupBoxChangeCasing.TabStop = false; + this.groupBoxChangeCasing.Text = "Change casing to"; + // + // radioButtonFixOnlyNames + // + this.radioButtonFixOnlyNames.AutoSize = true; + this.radioButtonFixOnlyNames.Location = new System.Drawing.Point(11, 43); + this.radioButtonFixOnlyNames.Name = "radioButtonFixOnlyNames"; + this.radioButtonFixOnlyNames.Size = new System.Drawing.Size(263, 17); + this.radioButtonFixOnlyNames.TabIndex = 6; + this.radioButtonFixOnlyNames.Text = "Fix only names casing (via Dictionaries\\names.xml)"; + this.radioButtonFixOnlyNames.UseVisualStyleBackColor = true; + // + // radioButtonLowercase + // + this.radioButtonLowercase.AutoSize = true; + this.radioButtonLowercase.Location = new System.Drawing.Point(11, 89); + this.radioButtonLowercase.Name = "radioButtonLowercase"; + this.radioButtonLowercase.Size = new System.Drawing.Size(86, 17); + this.radioButtonLowercase.TabIndex = 10; + this.radioButtonLowercase.Text = "all lowercase"; + this.radioButtonLowercase.UseVisualStyleBackColor = true; + // + // radioButtonUppercase + // + this.radioButtonUppercase.AutoSize = true; + this.radioButtonUppercase.Location = new System.Drawing.Point(11, 66); + this.radioButtonUppercase.Name = "radioButtonUppercase"; + this.radioButtonUppercase.Size = new System.Drawing.Size(112, 17); + this.radioButtonUppercase.TabIndex = 8; + this.radioButtonUppercase.Text = "ALL UPPERCASE"; + this.radioButtonUppercase.UseVisualStyleBackColor = true; + // + // radioButtonNormal + // + this.radioButtonNormal.AutoSize = true; + this.radioButtonNormal.Checked = true; + this.radioButtonNormal.Location = new System.Drawing.Point(11, 18); + this.radioButtonNormal.Name = "radioButtonNormal"; + this.radioButtonNormal.Size = new System.Drawing.Size(282, 17); + this.radioButtonNormal.TabIndex = 0; + this.radioButtonNormal.TabStop = true; + this.radioButtonNormal.Text = "Normal casing. Sentences begin with uppercase letter."; + this.radioButtonNormal.UseVisualStyleBackColor = true; + // + // groupBoxMergeShortLines + // + this.groupBoxMergeShortLines.Controls.Add(this.checkBoxOnlyContinuationLines); + this.groupBoxMergeShortLines.Controls.Add(this.numericUpDownMaxCharacters); + this.groupBoxMergeShortLines.Controls.Add(this.numericUpDownMaxMillisecondsBetweenLines); + this.groupBoxMergeShortLines.Controls.Add(this.labelMaxMillisecondsBetweenLines); + this.groupBoxMergeShortLines.Controls.Add(this.labelMaxCharacters); + this.groupBoxMergeShortLines.Location = new System.Drawing.Point(308, 23); + this.groupBoxMergeShortLines.Name = "groupBoxMergeShortLines"; + this.groupBoxMergeShortLines.Size = new System.Drawing.Size(268, 149); + this.groupBoxMergeShortLines.TabIndex = 304; + this.groupBoxMergeShortLines.TabStop = false; + this.groupBoxMergeShortLines.Text = "Merge short lines"; + this.groupBoxMergeShortLines.Visible = false; + // + // checkBoxOnlyContinuationLines + // + this.checkBoxOnlyContinuationLines.AutoSize = true; + this.checkBoxOnlyContinuationLines.Checked = true; + this.checkBoxOnlyContinuationLines.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxOnlyContinuationLines.Location = new System.Drawing.Point(16, 127); + this.checkBoxOnlyContinuationLines.Name = "checkBoxOnlyContinuationLines"; + this.checkBoxOnlyContinuationLines.Size = new System.Drawing.Size(164, 17); + this.checkBoxOnlyContinuationLines.TabIndex = 42; + this.checkBoxOnlyContinuationLines.Text = "Only merge continuation lines"; + this.checkBoxOnlyContinuationLines.UseVisualStyleBackColor = true; + // + // numericUpDownMaxCharacters + // + this.numericUpDownMaxCharacters.Location = new System.Drawing.Point(15, 41); + this.numericUpDownMaxCharacters.Maximum = new decimal(new int[] { + 999, + 0, + 0, + 0}); + this.numericUpDownMaxCharacters.Minimum = new decimal(new int[] { + 10, + 0, + 0, + 0}); + this.numericUpDownMaxCharacters.Name = "numericUpDownMaxCharacters"; + this.numericUpDownMaxCharacters.Size = new System.Drawing.Size(64, 20); + this.numericUpDownMaxCharacters.TabIndex = 38; + this.numericUpDownMaxCharacters.Value = new decimal(new int[] { + 65, + 0, + 0, + 0}); + // + // numericUpDownMaxMillisecondsBetweenLines + // + this.numericUpDownMaxMillisecondsBetweenLines.Location = new System.Drawing.Point(15, 90); + this.numericUpDownMaxMillisecondsBetweenLines.Maximum = new decimal(new int[] { + 2000, + 0, + 0, + 0}); + this.numericUpDownMaxMillisecondsBetweenLines.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownMaxMillisecondsBetweenLines.Name = "numericUpDownMaxMillisecondsBetweenLines"; + this.numericUpDownMaxMillisecondsBetweenLines.Size = new System.Drawing.Size(64, 20); + this.numericUpDownMaxMillisecondsBetweenLines.TabIndex = 39; + this.numericUpDownMaxMillisecondsBetweenLines.Value = new decimal(new int[] { + 250, + 0, + 0, + 0}); + // + // labelMaxMillisecondsBetweenLines + // + this.labelMaxMillisecondsBetweenLines.AutoSize = true; + this.labelMaxMillisecondsBetweenLines.Location = new System.Drawing.Point(12, 73); + this.labelMaxMillisecondsBetweenLines.Name = "labelMaxMillisecondsBetweenLines"; + this.labelMaxMillisecondsBetweenLines.Size = new System.Drawing.Size(178, 13); + this.labelMaxMillisecondsBetweenLines.TabIndex = 41; + this.labelMaxMillisecondsBetweenLines.Text = "Maximum milliseconds between lines"; + // + // labelMaxCharacters + // + this.labelMaxCharacters.AutoSize = true; + this.labelMaxCharacters.Location = new System.Drawing.Point(12, 23); + this.labelMaxCharacters.Name = "labelMaxCharacters"; + this.labelMaxCharacters.Size = new System.Drawing.Size(187, 13); + this.labelMaxCharacters.TabIndex = 40; + this.labelMaxCharacters.Text = "Maximum characters in one paragraph"; + // + // groupBoxAdjustDuration + // + this.groupBoxAdjustDuration.Controls.Add(this.comboBoxAdjustDurationVia); + this.groupBoxAdjustDuration.Controls.Add(this.labelAdjustDurationVia); + this.groupBoxAdjustDuration.Controls.Add(this.panelAdjustDurationFixed); + this.groupBoxAdjustDuration.Controls.Add(this.panelAdjustDurationAddPercent); + this.groupBoxAdjustDuration.Controls.Add(this.panelAdjustDurationAddSeconds); + this.groupBoxAdjustDuration.Controls.Add(this.panelAdjustDurationRecalc); + this.groupBoxAdjustDuration.Location = new System.Drawing.Point(305, 16); + this.groupBoxAdjustDuration.Name = "groupBoxAdjustDuration"; + this.groupBoxAdjustDuration.Size = new System.Drawing.Size(271, 251); + this.groupBoxAdjustDuration.TabIndex = 308; + this.groupBoxAdjustDuration.TabStop = false; + this.groupBoxAdjustDuration.Text = "Adjust duration"; + this.groupBoxAdjustDuration.Visible = false; + // + // comboBoxAdjustDurationVia + // + this.comboBoxAdjustDurationVia.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxAdjustDurationVia.FormattingEnabled = true; + this.comboBoxAdjustDurationVia.Location = new System.Drawing.Point(65, 19); + this.comboBoxAdjustDurationVia.Name = "comboBoxAdjustDurationVia"; + this.comboBoxAdjustDurationVia.Size = new System.Drawing.Size(121, 21); + this.comboBoxAdjustDurationVia.TabIndex = 8; + this.comboBoxAdjustDurationVia.SelectedIndexChanged += new System.EventHandler(this.comboBoxAdjustDurationVia_SelectedIndexChanged); + // + // labelAdjustDurationVia + // + this.labelAdjustDurationVia.AutoSize = true; + this.labelAdjustDurationVia.Location = new System.Drawing.Point(8, 22); + this.labelAdjustDurationVia.Name = "labelAdjustDurationVia"; + this.labelAdjustDurationVia.Size = new System.Drawing.Size(51, 13); + this.labelAdjustDurationVia.TabIndex = 7; + this.labelAdjustDurationVia.Text = "AdjustVia"; + // + // panelAdjustDurationFixed + // + this.panelAdjustDurationFixed.Controls.Add(this.numericUpDownFixedMilliseconds); + this.panelAdjustDurationFixed.Controls.Add(this.labelMillisecondsFixed); + this.panelAdjustDurationFixed.Location = new System.Drawing.Point(6, 123); + this.panelAdjustDurationFixed.Name = "panelAdjustDurationFixed"; + this.panelAdjustDurationFixed.Size = new System.Drawing.Size(257, 57); + this.panelAdjustDurationFixed.TabIndex = 15; + // + // numericUpDownFixedMilliseconds + // + this.numericUpDownFixedMilliseconds.Location = new System.Drawing.Point(8, 27); + this.numericUpDownFixedMilliseconds.Maximum = new decimal(new int[] { + 20000, + 0, + 0, + 0}); + this.numericUpDownFixedMilliseconds.Name = "numericUpDownFixedMilliseconds"; + this.numericUpDownFixedMilliseconds.Size = new System.Drawing.Size(80, 20); + this.numericUpDownFixedMilliseconds.TabIndex = 13; + this.numericUpDownFixedMilliseconds.Value = new decimal(new int[] { + 3000, + 0, + 0, + 0}); + // + // labelMillisecondsFixed + // + this.labelMillisecondsFixed.AutoSize = true; + this.labelMillisecondsFixed.Location = new System.Drawing.Point(5, 8); + this.labelMillisecondsFixed.Name = "labelMillisecondsFixed"; + this.labelMillisecondsFixed.Size = new System.Drawing.Size(64, 13); + this.labelMillisecondsFixed.TabIndex = 14; + this.labelMillisecondsFixed.Text = "Milliseconds"; + // + // panelAdjustDurationAddPercent + // + this.panelAdjustDurationAddPercent.Controls.Add(this.label1); + this.panelAdjustDurationAddPercent.Controls.Add(this.numericUpDownAdjustViaPercent); + this.panelAdjustDurationAddPercent.Controls.Add(this.labelAdjustViaPercent); + this.panelAdjustDurationAddPercent.Location = new System.Drawing.Point(7, 79); + this.panelAdjustDurationAddPercent.Name = "panelAdjustDurationAddPercent"; + this.panelAdjustDurationAddPercent.Size = new System.Drawing.Size(257, 63); + this.panelAdjustDurationAddPercent.TabIndex = 14; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(90, 34); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(15, 13); + this.label1.TabIndex = 25; + this.label1.Text = "%"; + // + // numericUpDownAdjustViaPercent + // + this.numericUpDownAdjustViaPercent.Location = new System.Drawing.Point(8, 27); + this.numericUpDownAdjustViaPercent.Maximum = new decimal(new int[] { + 150, + 0, + 0, + 0}); + this.numericUpDownAdjustViaPercent.Minimum = new decimal(new int[] { + 75, + 0, + 0, + 0}); + this.numericUpDownAdjustViaPercent.Name = "numericUpDownAdjustViaPercent"; + this.numericUpDownAdjustViaPercent.Size = new System.Drawing.Size(80, 20); + this.numericUpDownAdjustViaPercent.TabIndex = 24; + this.numericUpDownAdjustViaPercent.Value = new decimal(new int[] { + 110, + 0, + 0, + 0}); + // + // labelAdjustViaPercent + // + this.labelAdjustViaPercent.AutoSize = true; + this.labelAdjustViaPercent.Location = new System.Drawing.Point(5, 8); + this.labelAdjustViaPercent.Name = "labelAdjustViaPercent"; + this.labelAdjustViaPercent.Size = new System.Drawing.Size(86, 13); + this.labelAdjustViaPercent.TabIndex = 23; + this.labelAdjustViaPercent.Text = "Adjust in percent"; + // + // panelAdjustDurationAddSeconds + // + this.panelAdjustDurationAddSeconds.Controls.Add(this.numericUpDownSeconds); + this.panelAdjustDurationAddSeconds.Controls.Add(this.labelAddSeconds); + this.panelAdjustDurationAddSeconds.Location = new System.Drawing.Point(8, 47); + this.panelAdjustDurationAddSeconds.Name = "panelAdjustDurationAddSeconds"; + this.panelAdjustDurationAddSeconds.Size = new System.Drawing.Size(257, 55); + this.panelAdjustDurationAddSeconds.TabIndex = 13; + // + // numericUpDownSeconds + // + this.numericUpDownSeconds.DecimalPlaces = 3; + this.numericUpDownSeconds.Increment = new decimal(new int[] { + 1, + 0, + 0, + 131072}); + this.numericUpDownSeconds.Location = new System.Drawing.Point(8, 27); + this.numericUpDownSeconds.Maximum = new decimal(new int[] { + 20, + 0, + 0, + 0}); + this.numericUpDownSeconds.Minimum = new decimal(new int[] { + 10, + 0, + 0, + -2147483648}); + this.numericUpDownSeconds.Name = "numericUpDownSeconds"; + this.numericUpDownSeconds.Size = new System.Drawing.Size(80, 20); + this.numericUpDownSeconds.TabIndex = 12; + this.numericUpDownSeconds.Value = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + // + // labelAddSeconds + // + this.labelAddSeconds.AutoSize = true; + this.labelAddSeconds.Location = new System.Drawing.Point(5, 8); + this.labelAddSeconds.Name = "labelAddSeconds"; + this.labelAddSeconds.Size = new System.Drawing.Size(69, 13); + this.labelAddSeconds.TabIndex = 11; + this.labelAddSeconds.Text = "Add seconds"; + // + // panelAdjustDurationRecalc + // + this.panelAdjustDurationRecalc.Controls.Add(this.checkBoxExtendOnly); + this.panelAdjustDurationRecalc.Controls.Add(this.numericUpDownOptimalCharsSec); + this.panelAdjustDurationRecalc.Controls.Add(this.labelOptimalCharsSec); + this.panelAdjustDurationRecalc.Controls.Add(this.numericUpDownMaxCharsSec); + this.panelAdjustDurationRecalc.Controls.Add(this.labelMaxCharsPerSecond); + this.panelAdjustDurationRecalc.Location = new System.Drawing.Point(6, 66); + this.panelAdjustDurationRecalc.Name = "panelAdjustDurationRecalc"; + this.panelAdjustDurationRecalc.Size = new System.Drawing.Size(257, 170); + this.panelAdjustDurationRecalc.TabIndex = 16; + // + // checkBoxExtendOnly + // + this.checkBoxExtendOnly.AutoSize = true; + this.checkBoxExtendOnly.Location = new System.Drawing.Point(8, 122); + this.checkBoxExtendOnly.Name = "checkBoxExtendOnly"; + this.checkBoxExtendOnly.Size = new System.Drawing.Size(81, 17); + this.checkBoxExtendOnly.TabIndex = 14; + this.checkBoxExtendOnly.Text = "Extend only"; + this.checkBoxExtendOnly.UseVisualStyleBackColor = true; + // + // numericUpDownOptimalCharsSec + // + this.numericUpDownOptimalCharsSec.DecimalPlaces = 1; + this.numericUpDownOptimalCharsSec.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.numericUpDownOptimalCharsSec.Location = new System.Drawing.Point(8, 85); + this.numericUpDownOptimalCharsSec.Minimum = new decimal(new int[] { + 4, + 0, + 0, + 0}); + this.numericUpDownOptimalCharsSec.Name = "numericUpDownOptimalCharsSec"; + this.numericUpDownOptimalCharsSec.Size = new System.Drawing.Size(80, 20); + this.numericUpDownOptimalCharsSec.TabIndex = 13; + this.numericUpDownOptimalCharsSec.Value = new decimal(new int[] { + 17, + 0, + 0, + 0}); + // + // labelOptimalCharsSec + // + this.labelOptimalCharsSec.AutoSize = true; + this.labelOptimalCharsSec.Location = new System.Drawing.Point(5, 66); + this.labelOptimalCharsSec.Name = "labelOptimalCharsSec"; + this.labelOptimalCharsSec.Size = new System.Drawing.Size(93, 13); + this.labelOptimalCharsSec.TabIndex = 15; + this.labelOptimalCharsSec.Text = "Optimal chars/sec"; + // + // numericUpDownMaxCharsSec + // + this.numericUpDownMaxCharsSec.DecimalPlaces = 1; + this.numericUpDownMaxCharsSec.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.numericUpDownMaxCharsSec.Location = new System.Drawing.Point(8, 27); + this.numericUpDownMaxCharsSec.Minimum = new decimal(new int[] { + 4, + 0, + 0, + 0}); + this.numericUpDownMaxCharsSec.Name = "numericUpDownMaxCharsSec"; + this.numericUpDownMaxCharsSec.Size = new System.Drawing.Size(80, 20); + this.numericUpDownMaxCharsSec.TabIndex = 12; + this.numericUpDownMaxCharsSec.Value = new decimal(new int[] { + 24, + 0, + 0, + 0}); + // + // labelMaxCharsPerSecond + // + this.labelMaxCharsPerSecond.AutoSize = true; + this.labelMaxCharsPerSecond.Location = new System.Drawing.Point(5, 8); + this.labelMaxCharsPerSecond.Name = "labelMaxCharsPerSecond"; + this.labelMaxCharsPerSecond.Size = new System.Drawing.Size(81, 13); + this.labelMaxCharsPerSecond.TabIndex = 11; + this.labelMaxCharsPerSecond.Text = "Max. chars/sec"; + // + // groupBoxOutput + // + this.groupBoxOutput.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxOutput.Controls.Add(this.buttonBrowseEncoding); + this.groupBoxOutput.Controls.Add(this.radioButtonSaveInOutputFolder); + this.groupBoxOutput.Controls.Add(this.buttonTransportStreamSettings); + this.groupBoxOutput.Controls.Add(this.linkLabelOpenOutputFolder); + this.groupBoxOutput.Controls.Add(this.checkBoxUseStyleFromSource); + this.groupBoxOutput.Controls.Add(this.checkBoxOverwrite); + this.groupBoxOutput.Controls.Add(this.buttonStyles); + this.groupBoxOutput.Controls.Add(this.buttonChooseFolder); + this.groupBoxOutput.Controls.Add(this.comboBoxSubtitleFormats); + this.groupBoxOutput.Controls.Add(this.textBoxOutputFolder); + this.groupBoxOutput.Controls.Add(this.labelEncoding); + this.groupBoxOutput.Controls.Add(this.radioButtonSaveInSourceFolder); + this.groupBoxOutput.Controls.Add(this.comboBoxEncoding); + this.groupBoxOutput.Controls.Add(this.labelOutputFormat); + this.groupBoxOutput.Controls.Add(this.groupBoxConvertOptions); + this.groupBoxOutput.Location = new System.Drawing.Point(12, 305); + this.groupBoxOutput.Name = "groupBoxOutput"; + this.groupBoxOutput.Size = new System.Drawing.Size(1014, 300); + this.groupBoxOutput.TabIndex = 1; + this.groupBoxOutput.TabStop = false; + this.groupBoxOutput.Text = "Output"; + // + // buttonBrowseEncoding + // + this.buttonBrowseEncoding.Location = new System.Drawing.Point(300, 263); + this.buttonBrowseEncoding.Name = "buttonBrowseEncoding"; + this.buttonBrowseEncoding.Size = new System.Drawing.Size(26, 23); + this.buttonBrowseEncoding.TabIndex = 12; + this.buttonBrowseEncoding.Text = "..."; + this.buttonBrowseEncoding.UseVisualStyleBackColor = true; + this.buttonBrowseEncoding.Click += new System.EventHandler(this.buttonBrowseEncoding_Click); + // + // radioButtonSaveInOutputFolder + // + this.radioButtonSaveInOutputFolder.AutoSize = true; + this.radioButtonSaveInOutputFolder.Location = new System.Drawing.Point(10, 56); + this.radioButtonSaveInOutputFolder.Name = "radioButtonSaveInOutputFolder"; + this.radioButtonSaveInOutputFolder.Size = new System.Drawing.Size(154, 17); + this.radioButtonSaveInOutputFolder.TabIndex = 11; + this.radioButtonSaveInOutputFolder.Text = "Save in output folder below"; + this.radioButtonSaveInOutputFolder.UseVisualStyleBackColor = true; + this.radioButtonSaveInOutputFolder.CheckedChanged += new System.EventHandler(this.radioButtonSaveInOutputFolder_CheckedChanged); + // + // buttonTransportStreamSettings + // + this.buttonTransportStreamSettings.Location = new System.Drawing.Point(300, 236); + this.buttonTransportStreamSettings.Name = "buttonTransportStreamSettings"; + this.buttonTransportStreamSettings.Size = new System.Drawing.Size(116, 23); + this.buttonTransportStreamSettings.TabIndex = 10; + this.buttonTransportStreamSettings.Text = "TS settings..."; + this.buttonTransportStreamSettings.UseVisualStyleBackColor = true; + this.buttonTransportStreamSettings.Visible = false; + this.buttonTransportStreamSettings.Click += new System.EventHandler(this.buttonTransportStreamSettings_Click); + // + // linkLabelOpenOutputFolder + // + this.linkLabelOpenOutputFolder.AutoSize = true; + this.linkLabelOpenOutputFolder.Location = new System.Drawing.Point(357, 81); + this.linkLabelOpenOutputFolder.Name = "linkLabelOpenOutputFolder"; + this.linkLabelOpenOutputFolder.Size = new System.Drawing.Size(42, 13); + this.linkLabelOpenOutputFolder.TabIndex = 9; + this.linkLabelOpenOutputFolder.TabStop = true; + this.linkLabelOpenOutputFolder.Text = "Open..."; + this.linkLabelOpenOutputFolder.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabelOpenOutputFolder_LinkClicked); + // + // checkBoxUseStyleFromSource + // + this.checkBoxUseStyleFromSource.AutoSize = true; + this.checkBoxUseStyleFromSource.Location = new System.Drawing.Point(80, 236); + this.checkBoxUseStyleFromSource.Name = "checkBoxUseStyleFromSource"; + this.checkBoxUseStyleFromSource.Size = new System.Drawing.Size(127, 17); + this.checkBoxUseStyleFromSource.TabIndex = 9; + this.checkBoxUseStyleFromSource.Text = "Use style from source"; + this.checkBoxUseStyleFromSource.UseVisualStyleBackColor = true; + this.checkBoxUseStyleFromSource.Visible = false; + // + // checkBoxOverwrite + // + this.checkBoxOverwrite.AutoSize = true; + this.checkBoxOverwrite.Location = new System.Drawing.Point(10, 122); + this.checkBoxOverwrite.Name = "checkBoxOverwrite"; + this.checkBoxOverwrite.Size = new System.Drawing.Size(125, 17); + this.checkBoxOverwrite.TabIndex = 10; + this.checkBoxOverwrite.Text = "Overwrite exiting files"; + this.checkBoxOverwrite.UseVisualStyleBackColor = true; + // + // buttonStyles + // + this.buttonStyles.Location = new System.Drawing.Point(300, 207); + this.buttonStyles.Name = "buttonStyles"; + this.buttonStyles.Size = new System.Drawing.Size(116, 23); + this.buttonStyles.TabIndex = 8; + this.buttonStyles.Text = "Style..."; + this.buttonStyles.UseVisualStyleBackColor = true; + this.buttonStyles.Visible = false; + this.buttonStyles.Click += new System.EventHandler(this.ButtonStylesClick); + // + // buttonChooseFolder + // + this.buttonChooseFolder.Enabled = false; + this.buttonChooseFolder.Location = new System.Drawing.Point(325, 76); + this.buttonChooseFolder.Name = "buttonChooseFolder"; + this.buttonChooseFolder.Size = new System.Drawing.Size(26, 23); + this.buttonChooseFolder.TabIndex = 8; + this.buttonChooseFolder.Text = "..."; + this.buttonChooseFolder.UseVisualStyleBackColor = true; + this.buttonChooseFolder.Click += new System.EventHandler(this.buttonChooseFolder_Click); + // + // comboBoxSubtitleFormats + // + this.comboBoxSubtitleFormats.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxSubtitleFormats.FormattingEnabled = true; + this.comboBoxSubtitleFormats.Location = new System.Drawing.Point(80, 209); + this.comboBoxSubtitleFormats.Name = "comboBoxSubtitleFormats"; + this.comboBoxSubtitleFormats.Size = new System.Drawing.Size(214, 21); + this.comboBoxSubtitleFormats.TabIndex = 7; + this.comboBoxSubtitleFormats.SelectedIndexChanged += new System.EventHandler(this.ComboBoxSubtitleFormatsSelectedIndexChanged); + // + // textBoxOutputFolder + // + this.textBoxOutputFolder.Enabled = false; + this.textBoxOutputFolder.Location = new System.Drawing.Point(17, 79); + this.textBoxOutputFolder.Name = "textBoxOutputFolder"; + this.textBoxOutputFolder.Size = new System.Drawing.Size(302, 20); + this.textBoxOutputFolder.TabIndex = 7; + // + // labelEncoding + // + this.labelEncoding.AutoSize = true; + this.labelEncoding.Location = new System.Drawing.Point(10, 267); + this.labelEncoding.Name = "labelEncoding"; + this.labelEncoding.Size = new System.Drawing.Size(52, 13); + this.labelEncoding.TabIndex = 9; + this.labelEncoding.Text = "Encoding"; + // + // radioButtonSaveInSourceFolder + // + this.radioButtonSaveInSourceFolder.AutoSize = true; + this.radioButtonSaveInSourceFolder.Checked = true; + this.radioButtonSaveInSourceFolder.Location = new System.Drawing.Point(10, 27); + this.radioButtonSaveInSourceFolder.Name = "radioButtonSaveInSourceFolder"; + this.radioButtonSaveInSourceFolder.Size = new System.Drawing.Size(141, 17); + this.radioButtonSaveInSourceFolder.TabIndex = 0; + this.radioButtonSaveInSourceFolder.TabStop = true; + this.radioButtonSaveInSourceFolder.Text = "Save in source file folder"; + this.radioButtonSaveInSourceFolder.UseVisualStyleBackColor = true; + this.radioButtonSaveInSourceFolder.CheckedChanged += new System.EventHandler(this.radioButtonSaveInSourceFolder_CheckedChanged); + // + // comboBoxEncoding + // + this.comboBoxEncoding.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxEncoding.FormattingEnabled = true; + this.comboBoxEncoding.Location = new System.Drawing.Point(80, 264); + this.comboBoxEncoding.Name = "comboBoxEncoding"; + this.comboBoxEncoding.Size = new System.Drawing.Size(214, 21); + this.comboBoxEncoding.TabIndex = 11; + // + // labelOutputFormat + // + this.labelOutputFormat.AutoSize = true; + this.labelOutputFormat.Location = new System.Drawing.Point(10, 212); + this.labelOutputFormat.Name = "labelOutputFormat"; + this.labelOutputFormat.Size = new System.Drawing.Size(39, 13); + this.labelOutputFormat.TabIndex = 6; + this.labelOutputFormat.Text = "Format"; + // + // groupBoxInput + // + this.groupBoxInput.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxInput.Controls.Add(this.labelNumberOfFiles); + this.groupBoxInput.Controls.Add(this.textBoxFilter); + this.groupBoxInput.Controls.Add(this.labelFilter); + this.groupBoxInput.Controls.Add(this.comboBoxFilter); + this.groupBoxInput.Controls.Add(this.checkBoxScanFolderRecursive); + this.groupBoxInput.Controls.Add(this.buttonSearchFolder); + this.groupBoxInput.Controls.Add(this.buttonInputBrowse); + this.groupBoxInput.Controls.Add(this.labelChooseInputFiles); + this.groupBoxInput.Controls.Add(this.listViewInputFiles); + this.groupBoxInput.Location = new System.Drawing.Point(12, 12); + this.groupBoxInput.Name = "groupBoxInput"; + this.groupBoxInput.Size = new System.Drawing.Size(1014, 287); + this.groupBoxInput.TabIndex = 0; + this.groupBoxInput.TabStop = false; + this.groupBoxInput.Text = "Input"; + // + // labelNumberOfFiles + // + this.labelNumberOfFiles.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.labelNumberOfFiles.Location = new System.Drawing.Point(872, 258); + this.labelNumberOfFiles.Name = "labelNumberOfFiles"; + this.labelNumberOfFiles.Size = new System.Drawing.Size(100, 16); + this.labelNumberOfFiles.TabIndex = 14; + this.labelNumberOfFiles.Text = "labelNumberOfFiles"; + this.labelNumberOfFiles.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // textBoxFilter + // + this.textBoxFilter.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.textBoxFilter.Location = new System.Drawing.Point(422, 258); + this.textBoxFilter.Name = "textBoxFilter"; + this.textBoxFilter.Size = new System.Drawing.Size(158, 20); + this.textBoxFilter.TabIndex = 13; + // + // labelFilter + // + this.labelFilter.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelFilter.AutoSize = true; + this.labelFilter.Location = new System.Drawing.Point(11, 261); + this.labelFilter.Name = "labelFilter"; + this.labelFilter.Size = new System.Drawing.Size(29, 13); + this.labelFilter.TabIndex = 11; + this.labelFilter.Text = "Filter"; + // + // comboBoxFilter + // + this.comboBoxFilter.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.comboBoxFilter.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxFilter.FormattingEnabled = true; + this.comboBoxFilter.Items.AddRange(new object[] { + "All files", + "SubRip .srt files without BOM header", + "Files with subtitle with more than two lines", + "Files that contains...", + "File name cotains...", + "Mkv language code contains..."}); + this.comboBoxFilter.Location = new System.Drawing.Point(81, 258); + this.comboBoxFilter.Name = "comboBoxFilter"; + this.comboBoxFilter.Size = new System.Drawing.Size(335, 21); + this.comboBoxFilter.TabIndex = 12; + this.comboBoxFilter.SelectedIndexChanged += new System.EventHandler(this.comboBoxFilter_SelectedIndexChanged); + // + // checkBoxScanFolderRecursive + // + this.checkBoxScanFolderRecursive.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.checkBoxScanFolderRecursive.AutoSize = true; + this.checkBoxScanFolderRecursive.Checked = true; + this.checkBoxScanFolderRecursive.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxScanFolderRecursive.Location = new System.Drawing.Point(778, 16); + this.checkBoxScanFolderRecursive.Name = "checkBoxScanFolderRecursive"; + this.checkBoxScanFolderRecursive.Size = new System.Drawing.Size(74, 17); + this.checkBoxScanFolderRecursive.TabIndex = 0; + this.checkBoxScanFolderRecursive.Text = "Recursive"; + this.checkBoxScanFolderRecursive.UseVisualStyleBackColor = true; + // + // buttonSearchFolder + // + this.buttonSearchFolder.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.buttonSearchFolder.Location = new System.Drawing.Point(858, 12); + this.buttonSearchFolder.Name = "buttonSearchFolder"; + this.buttonSearchFolder.Size = new System.Drawing.Size(116, 23); + this.buttonSearchFolder.TabIndex = 1; + this.buttonSearchFolder.Text = "Search folder..."; + this.buttonSearchFolder.UseVisualStyleBackColor = true; + this.buttonSearchFolder.Click += new System.EventHandler(this.buttonSearchFolder_Click); + // + // buttonInputBrowse + // + this.buttonInputBrowse.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.buttonInputBrowse.Location = new System.Drawing.Point(979, 41); + this.buttonInputBrowse.Name = "buttonInputBrowse"; + this.buttonInputBrowse.Size = new System.Drawing.Size(26, 23); + this.buttonInputBrowse.TabIndex = 3; + this.buttonInputBrowse.Text = "..."; + this.buttonInputBrowse.UseVisualStyleBackColor = true; + this.buttonInputBrowse.Click += new System.EventHandler(this.buttonInputBrowse_Click); + // + // labelChooseInputFiles + // + this.labelChooseInputFiles.AutoSize = true; + this.labelChooseInputFiles.Location = new System.Drawing.Point(5, 25); + this.labelChooseInputFiles.Name = "labelChooseInputFiles"; + this.labelChooseInputFiles.Size = new System.Drawing.Size(202, 13); + this.labelChooseInputFiles.TabIndex = 0; + this.labelChooseInputFiles.Text = "Choose input files (browse or drag-n-drop)"; + // + // listViewInputFiles + // + this.listViewInputFiles.AllowDrop = true; + this.listViewInputFiles.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listViewInputFiles.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeaderFName, + this.columnHeaderSize, + this.columnHeaderFormat, + this.columnHeaderStatus}); + this.listViewInputFiles.ContextMenuStrip = this.contextMenuStripFiles; + this.listViewInputFiles.FullRowSelect = true; + this.listViewInputFiles.HideSelection = false; + this.listViewInputFiles.Location = new System.Drawing.Point(6, 41); + this.listViewInputFiles.Name = "listViewInputFiles"; + this.listViewInputFiles.Size = new System.Drawing.Size(968, 211); + this.listViewInputFiles.TabIndex = 2; + this.listViewInputFiles.UseCompatibleStateImageBehavior = false; + this.listViewInputFiles.View = System.Windows.Forms.View.Details; + this.listViewInputFiles.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.listViewInputFiles_ColumnClick); + this.listViewInputFiles.DragDrop += new System.Windows.Forms.DragEventHandler(this.listViewInputFiles_DragDrop); + this.listViewInputFiles.DragEnter += new System.Windows.Forms.DragEventHandler(this.listViewInputFiles_DragEnter); + this.listViewInputFiles.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ListViewInputFilesKeyDown); + // + // columnHeaderFName + // + this.columnHeaderFName.Text = "File name"; + this.columnHeaderFName.Width = 500; + // + // columnHeaderSize + // + this.columnHeaderSize.Text = "Size"; + this.columnHeaderSize.Width = 75; + // + // columnHeaderFormat + // + this.columnHeaderFormat.Text = "Format"; + this.columnHeaderFormat.Width = 200; + // + // columnHeaderStatus + // + this.columnHeaderStatus.Text = "Status"; + this.columnHeaderStatus.Width = 124; + // + // contextMenuStripFiles + // + this.contextMenuStripFiles.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.addFilesToolStripMenuItem, + this.toolStripSeparator2, + this.removeToolStripMenuItem, + this.removeAllToolStripMenuItem, + this.openContainingFolderToolStripMenuItem, + this.toolStripSeparator1, + this.convertMkvSettingsToolStripMenuItem}); + this.contextMenuStripFiles.Name = "contextMenuStripStyles"; + this.contextMenuStripFiles.Size = new System.Drawing.Size(400, 126); + this.contextMenuStripFiles.Opening += new System.ComponentModel.CancelEventHandler(this.ContextMenuStripFilesOpening); + // + // addFilesToolStripMenuItem + // + this.addFilesToolStripMenuItem.Name = "addFilesToolStripMenuItem"; + this.addFilesToolStripMenuItem.Size = new System.Drawing.Size(399, 22); + this.addFilesToolStripMenuItem.Text = "Add files"; + this.addFilesToolStripMenuItem.Click += new System.EventHandler(this.addFilesToolStripMenuItem_Click); + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(396, 6); + // + // removeToolStripMenuItem + // + this.removeToolStripMenuItem.Name = "removeToolStripMenuItem"; + this.removeToolStripMenuItem.Size = new System.Drawing.Size(399, 22); + this.removeToolStripMenuItem.Text = "Remove"; + this.removeToolStripMenuItem.Click += new System.EventHandler(this.RemoveToolStripMenuItemClick); + // + // removeAllToolStripMenuItem + // + this.removeAllToolStripMenuItem.Name = "removeAllToolStripMenuItem"; + this.removeAllToolStripMenuItem.Size = new System.Drawing.Size(399, 22); + this.removeAllToolStripMenuItem.Text = "Remove all"; + this.removeAllToolStripMenuItem.Click += new System.EventHandler(this.RemoveAllToolStripMenuItemClick); + // + // openContainingFolderToolStripMenuItem + // + this.openContainingFolderToolStripMenuItem.Name = "openContainingFolderToolStripMenuItem"; + this.openContainingFolderToolStripMenuItem.Size = new System.Drawing.Size(399, 22); + this.openContainingFolderToolStripMenuItem.Text = "Open containing folder"; + this.openContainingFolderToolStripMenuItem.Click += new System.EventHandler(this.openContainingFolderToolStripMenuItem_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(396, 6); + // + // convertMkvSettingsToolStripMenuItem + // + this.convertMkvSettingsToolStripMenuItem.Name = "convertMkvSettingsToolStripMenuItem"; + this.convertMkvSettingsToolStripMenuItem.Size = new System.Drawing.Size(399, 22); + this.convertMkvSettingsToolStripMenuItem.Text = "Mkv language in output file name: Three letter language code"; + this.convertMkvSettingsToolStripMenuItem.Click += new System.EventHandler(this.convertMkvThreeLetterLanguageCodesToTwoLettersToolStripMenuItem_Click); + // + // openFileDialog1 + // + this.openFileDialog1.FileName = "openFileDialog1"; + // + // progressBar1 + // + this.progressBar1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.progressBar1.Location = new System.Drawing.Point(15, 627); + this.progressBar1.Name = "progressBar1"; + this.progressBar1.Size = new System.Drawing.Size(820, 10); + this.progressBar1.TabIndex = 8; + // + // labelStatus + // + this.labelStatus.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelStatus.AutoSize = true; + this.labelStatus.Location = new System.Drawing.Point(12, 611); + this.labelStatus.Name = "labelStatus"; + this.labelStatus.Size = new System.Drawing.Size(59, 13); + this.labelStatus.TabIndex = 9; + this.labelStatus.Text = "labelStatus"; + // + // BatchConvert + // + this.AllowDrop = true; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1035, 651); + this.Controls.Add(this.labelStatus); + this.Controls.Add(this.progressBar1); + this.Controls.Add(this.groupBoxOutput); + this.Controls.Add(this.groupBoxInput); + this.Controls.Add(this.buttonConvert); + this.Controls.Add(this.buttonCancel); + this.KeyPreview = true; + this.MinimumSize = new System.Drawing.Size(1024, 578); + this.Name = "BatchConvert"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Batch convert"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.BatchConvert_FormClosing); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.BatchConvert_KeyDown); + this.groupBoxConvertOptions.ResumeLayout(false); + this.groupBoxDeleteLines.ResumeLayout(false); + this.groupBoxDeleteLines.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDeleteLast)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDeleteFirst)).EndInit(); + this.groupBoxRemoveStyle.ResumeLayout(false); + this.groupBoxRemoveStyle.PerformLayout(); + this.groupBoxOffsetTimeCodes.ResumeLayout(false); + this.groupBoxOffsetTimeCodes.PerformLayout(); + this.contextMenuStripOptions.ResumeLayout(false); + this.groupBoxChangeFrameRate.ResumeLayout(false); + this.groupBoxChangeFrameRate.PerformLayout(); + this.groupBoxFixRtl.ResumeLayout(false); + this.groupBoxFixRtl.PerformLayout(); + this.groupBoxSpeed.ResumeLayout(false); + this.groupBoxSpeed.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPercent)).EndInit(); + this.groupBoxChangeCasing.ResumeLayout(false); + this.groupBoxChangeCasing.PerformLayout(); + this.groupBoxMergeShortLines.ResumeLayout(false); + this.groupBoxMergeShortLines.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxCharacters)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxMillisecondsBetweenLines)).EndInit(); + this.groupBoxAdjustDuration.ResumeLayout(false); + this.groupBoxAdjustDuration.PerformLayout(); + this.panelAdjustDurationFixed.ResumeLayout(false); + this.panelAdjustDurationFixed.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownFixedMilliseconds)).EndInit(); + this.panelAdjustDurationAddPercent.ResumeLayout(false); + this.panelAdjustDurationAddPercent.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownAdjustViaPercent)).EndInit(); + this.panelAdjustDurationAddSeconds.ResumeLayout(false); + this.panelAdjustDurationAddSeconds.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSeconds)).EndInit(); + this.panelAdjustDurationRecalc.ResumeLayout(false); + this.panelAdjustDurationRecalc.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownOptimalCharsSec)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxCharsSec)).EndInit(); + this.groupBoxOutput.ResumeLayout(false); + this.groupBoxOutput.PerformLayout(); + this.groupBoxInput.ResumeLayout(false); + this.groupBoxInput.PerformLayout(); + this.contextMenuStripFiles.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonConvert; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.GroupBox groupBoxConvertOptions; + private System.Windows.Forms.GroupBox groupBoxOutput; + private System.Windows.Forms.ComboBox comboBoxSubtitleFormats; + private System.Windows.Forms.Label labelEncoding; + private System.Windows.Forms.ComboBox comboBoxEncoding; + private System.Windows.Forms.Label labelOutputFormat; + private System.Windows.Forms.GroupBox groupBoxInput; + private System.Windows.Forms.Button buttonInputBrowse; + private System.Windows.Forms.Label labelChooseInputFiles; + private System.Windows.Forms.ListView listViewInputFiles; + private System.Windows.Forms.ColumnHeader columnHeaderFName; + private System.Windows.Forms.ColumnHeader columnHeaderSize; + private System.Windows.Forms.ColumnHeader columnHeaderFormat; + private System.Windows.Forms.FolderBrowserDialog folderBrowserDialog1; + private System.Windows.Forms.OpenFileDialog openFileDialog1; + private System.Windows.Forms.ColumnHeader columnHeaderStatus; + private System.Windows.Forms.Button buttonStyles; + private System.Windows.Forms.GroupBox groupBoxOffsetTimeCodes; + private System.Windows.Forms.GroupBox groupBoxChangeFrameRate; + private Controls.TimeUpDown timeUpDownAdjust; + private System.Windows.Forms.Label labelHourMinSecMilliSecond; + private System.Windows.Forms.ComboBox comboBoxFrameRateTo; + private System.Windows.Forms.Label labelToFrameRate; + private System.Windows.Forms.ComboBox comboBoxFrameRateFrom; + private System.Windows.Forms.Label labelFromFrameRate; + private System.Windows.Forms.ContextMenuStrip contextMenuStripFiles; + private System.Windows.Forms.ToolStripMenuItem removeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem removeAllToolStripMenuItem; + private System.Windows.Forms.ProgressBar progressBar1; + private System.Windows.Forms.Label labelStatus; + private System.Windows.Forms.RadioButton radioButtonShowLater; + private System.Windows.Forms.RadioButton radioButtonShowEarlier; + private System.Windows.Forms.Button buttonSearchFolder; + private System.Windows.Forms.CheckBox checkBoxScanFolderRecursive; + private System.Windows.Forms.Label labelFilter; + private System.Windows.Forms.ComboBox comboBoxFilter; + private System.Windows.Forms.TextBox textBoxFilter; + private System.Windows.Forms.GroupBox groupBoxSpeed; + private System.Windows.Forms.NumericUpDown numericUpDownPercent; + private System.Windows.Forms.Label labelPercent; + private System.Windows.Forms.RadioButton radioButtonToDropFrame; + private System.Windows.Forms.RadioButton radioButtonSpeedFromDropFrame; + private System.Windows.Forms.RadioButton radioButtonSpeedCustom; + private System.Windows.Forms.CheckBox checkBoxUseStyleFromSource; + private System.Windows.Forms.Button buttonTransportStreamSettings; + private System.Windows.Forms.RadioButton radioButtonSaveInOutputFolder; + private System.Windows.Forms.LinkLabel linkLabelOpenOutputFolder; + private System.Windows.Forms.CheckBox checkBoxOverwrite; + private System.Windows.Forms.Button buttonChooseFolder; + private System.Windows.Forms.TextBox textBoxOutputFolder; + private System.Windows.Forms.RadioButton radioButtonSaveInSourceFolder; + private System.Windows.Forms.ListView listViewConvertOptions; + private System.Windows.Forms.ColumnHeader ActionCheckBox; + private System.Windows.Forms.ColumnHeader Action; + private System.Windows.Forms.Button buttonConvertOptionsSettings; + private System.Windows.Forms.GroupBox groupBoxFixRtl; + private System.Windows.Forms.RadioButton radioButtonReverseStartEnd; + private System.Windows.Forms.RadioButton radioButtonRemoveUnicode; + private System.Windows.Forms.RadioButton radioButtonAddUnicode; + private System.Windows.Forms.GroupBox groupBoxMergeShortLines; + private System.Windows.Forms.CheckBox checkBoxOnlyContinuationLines; + private System.Windows.Forms.NumericUpDown numericUpDownMaxCharacters; + private System.Windows.Forms.NumericUpDown numericUpDownMaxMillisecondsBetweenLines; + private System.Windows.Forms.Label labelMaxMillisecondsBetweenLines; + private System.Windows.Forms.Label labelMaxCharacters; + private System.Windows.Forms.Button buttonSwapFrameRate; + private System.Windows.Forms.GroupBox groupBoxChangeCasing; + private System.Windows.Forms.RadioButton radioButtonFixOnlyNames; + private System.Windows.Forms.RadioButton radioButtonLowercase; + private System.Windows.Forms.RadioButton radioButtonUppercase; + private System.Windows.Forms.RadioButton radioButtonNormal; + private System.Windows.Forms.ContextMenuStrip contextMenuStripOptions; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSelectAll; + private System.Windows.Forms.ToolStripMenuItem inverseSelectionToolStripMenuItem; + private System.Windows.Forms.Button buttonBrowseEncoding; + private System.Windows.Forms.Label labelNumberOfFiles; + private System.Windows.Forms.ToolStripMenuItem openContainingFolderToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem convertMkvSettingsToolStripMenuItem; + private System.Windows.Forms.GroupBox groupBoxRemoveStyle; + private System.Windows.Forms.TextBox textBoxRemoveStyle; + private System.Windows.Forms.Label labelStyleName; + private System.Windows.Forms.GroupBox groupBoxAdjustDuration; + private System.Windows.Forms.Label labelAdjustDurationVia; + private System.Windows.Forms.ComboBox comboBoxAdjustDurationVia; + private System.Windows.Forms.Panel panelAdjustDurationAddPercent; + private System.Windows.Forms.Panel panelAdjustDurationAddSeconds; + private System.Windows.Forms.NumericUpDown numericUpDownSeconds; + private System.Windows.Forms.Label labelAddSeconds; + private System.Windows.Forms.Panel panelAdjustDurationFixed; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.NumericUpDown numericUpDownAdjustViaPercent; + private System.Windows.Forms.Label labelAdjustViaPercent; + private System.Windows.Forms.NumericUpDown numericUpDownFixedMilliseconds; + private System.Windows.Forms.Label labelMillisecondsFixed; + private System.Windows.Forms.Panel panelAdjustDurationRecalc; + private System.Windows.Forms.CheckBox checkBoxExtendOnly; + private System.Windows.Forms.NumericUpDown numericUpDownOptimalCharsSec; + private System.Windows.Forms.Label labelOptimalCharsSec; + private System.Windows.Forms.NumericUpDown numericUpDownMaxCharsSec; + private System.Windows.Forms.Label labelMaxCharsPerSecond; + private System.Windows.Forms.ToolStripMenuItem addFilesToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.GroupBox groupBoxDeleteLines; + private System.Windows.Forms.TextBox textBoxDeleteContains; + private System.Windows.Forms.Label labelDeleteLinesContaining; + private System.Windows.Forms.NumericUpDown numericUpDownDeleteLast; + private System.Windows.Forms.Label labelDeleteLastLines; + private System.Windows.Forms.NumericUpDown numericUpDownDeleteFirst; + private System.Windows.Forms.Label labelDeleteFirstLines; + } } \ No newline at end of file diff --git a/src/Forms/BatchConvert.cs b/src/ui/Forms/BatchConvert.cs similarity index 97% rename from src/Forms/BatchConvert.cs rename to src/ui/Forms/BatchConvert.cs index dd1668603..f827b078d 100644 --- a/src/Forms/BatchConvert.cs +++ b/src/ui/Forms/BatchConvert.cs @@ -1,2976 +1,2976 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.BluRaySup; -using Nikse.SubtitleEdit.Core.ContainerFormats.Matroska; -using Nikse.SubtitleEdit.Core.ContainerFormats.TransportStream; -using Nikse.SubtitleEdit.Core.Forms; -using Nikse.SubtitleEdit.Core.Interfaces; -using Nikse.SubtitleEdit.Core.SubtitleFormats; -using Nikse.SubtitleEdit.Core.VobSub; -using Nikse.SubtitleEdit.Forms.Ocr; -using Nikse.SubtitleEdit.Forms.Styles; -using Nikse.SubtitleEdit.Logic; -using Nikse.SubtitleEdit.Logic.CommandLineConvert; -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Text; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class BatchConvert : PositionAndSizeForm - { - private const string AddUnicode = "ADD_UNICODE"; - private const string RemoveUnicode = "REMOVE_UNICODE"; - private const string ReverseStartEnd = "REVERSE_START_END"; - - public class ThreadDoWorkParameter - { - public bool FixCommonErrors { get; set; } - public bool MultipleReplaceActive { get; set; } - public bool FixRtl { get; set; } - public bool SplitLongLinesActive { get; set; } - public bool AutoBalanceActive { get; set; } - public bool SetMinDisplayTimeBetweenSubtitles { get; set; } - public ListViewItem Item { get; set; } - public Subtitle Subtitle { get; set; } - public SubtitleFormat Format { get; set; } - public TextEncoding Encoding { get; set; } - public string Language { get; set; } - public string Error { get; set; } - public string FileName { get; set; } - public string ToFormat { get; set; } - public SubtitleFormat SourceFormat { get; set; } - public List BinaryParagraphs { get; set; } - public ThreadDoWorkParameter( - bool fixCommonErrors, - bool multipleReplace, - bool fixRtl, - bool splitLongLinesActive, - bool autoBalance, - bool setMinDisplayTimeBetweenSubtitles, - ListViewItem item, - Subtitle subtitle, - SubtitleFormat format, - TextEncoding encoding, - string language, - string fileName, - string toFormat, - SubtitleFormat sourceFormat, - List binaryParagraphs) - { - FixCommonErrors = fixCommonErrors; - MultipleReplaceActive = multipleReplace; - FixRtl = fixRtl; - SplitLongLinesActive = splitLongLinesActive; - AutoBalanceActive = autoBalance; - SetMinDisplayTimeBetweenSubtitles = setMinDisplayTimeBetweenSubtitles; - Item = item; - Subtitle = subtitle; - Format = format; - Encoding = encoding; - Language = language; - FileName = fileName; - ToFormat = toFormat; - SourceFormat = sourceFormat; - BinaryParagraphs = binaryParagraphs; - } - } - - private string _assStyle; - private string _ssaStyle; - private readonly RemoveTextForHI _removeTextForHearingImpaired; - private readonly ChangeCasing _changeCasing = new ChangeCasing(); - private readonly ChangeCasingNames _changeCasingNames = new ChangeCasingNames(); - private bool _converting; - private int _count; - private int _converted; - private int _errors; - private readonly List _allFormats; - private bool _searching; - private bool _abort; - private Ebu.EbuGeneralSubtitleInformation _ebuGeneralInformation; - public static string BluRaySubtitle => "Blu-ray sup"; - public static string VobSubSubtitle => "VobSub"; - public static string DostImageSubtitle => "Dost-image"; - public static string BdnXmlSubtitle => "BDN-XML"; - public static string FcpImageSubtitle => "FCP-image"; - private string _customTextTemplate; - private readonly DurationsBridgeGaps _bridgeGaps; - private const int ConvertMaxFileSize = 1024 * 1024 * 10; // 10 MB - private Dictionary> _bdLookup = new Dictionary>(); - RemoveTextForHISettings _removeTextForHiSettings; - - public BatchConvert(Icon icon) - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - Icon = (Icon)icon.Clone(); - - progressBar1.Visible = false; - labelStatus.Text = string.Empty; - var l = Configuration.Settings.Language.BatchConvert; - Text = l.Title; - groupBoxInput.Text = l.Input; - labelChooseInputFiles.Text = l.InputDescription; - groupBoxOutput.Text = l.Output; - radioButtonSaveInSourceFolder.Text = l.SaveInSourceFolder; - radioButtonSaveInOutputFolder.Text = l.SaveInOutputFolder; - checkBoxOverwrite.Text = l.OverwriteFiles; - labelOutputFormat.Text = Configuration.Settings.Language.Main.Controls.SubtitleFormat; - labelEncoding.Text = Configuration.Settings.Language.Main.Controls.FileEncoding; - buttonStyles.Text = l.Style; - checkBoxUseStyleFromSource.Text = l.UseStyleFromSource; - groupBoxConvertOptions.Text = l.ConvertOptions; - columnHeaderFName.Text = Configuration.Settings.Language.JoinSubtitles.FileName; - columnHeaderFormat.Text = Configuration.Settings.Language.Main.Controls.SubtitleFormat; - columnHeaderSize.Text = Configuration.Settings.Language.General.Size; - columnHeaderStatus.Text = l.Status; - linkLabelOpenOutputFolder.Text = Configuration.Settings.Language.Main.Menu.File.Open; - buttonSearchFolder.Text = l.ScanFolder; - buttonConvert.Text = l.Convert; - buttonCancel.Text = Configuration.Settings.Language.General.Ok; - checkBoxScanFolderRecursive.Text = l.Recursive; - checkBoxScanFolderRecursive.Left = buttonSearchFolder.Left - checkBoxScanFolderRecursive.Width - 5; - buttonTransportStreamSettings.Text = l.TransportStreamSettingsButton; - groupBoxChangeFrameRate.Text = Configuration.Settings.Language.ChangeFrameRate.Title; - groupBoxOffsetTimeCodes.Text = l.OffsetTimeCodes; - groupBoxSpeed.Text = Configuration.Settings.Language.ChangeSpeedInPercent.TitleShort; - labelFromFrameRate.Text = Configuration.Settings.Language.ChangeFrameRate.FromFrameRate; - labelToFrameRate.Text = Configuration.Settings.Language.ChangeFrameRate.ToFrameRate; - labelHourMinSecMilliSecond.Text = Configuration.Settings.General.UseTimeFormatHHMMSSFF ? Configuration.Settings.Language.General.HourMinutesSecondsFrames : Configuration.Settings.Language.General.HourMinutesSecondsMilliseconds; - openContainingFolderToolStripMenuItem.Text = Configuration.Settings.Language.Main.Menu.File.OpenContainingFolder; - removeToolStripMenuItem.Text = Configuration.Settings.Language.MultipleReplace.Remove; - removeAllToolStripMenuItem.Text = Configuration.Settings.Language.MultipleReplace.RemoveAll; - groupBoxRemoveStyle.Text = l.RemoveStyleActor; - labelStyleName.Text = $"{Configuration.Settings.Language.General.Style}/{Configuration.Settings.Language.General.Actor}"; - labelDeleteFirstLines.Text = l.DeleteFirstLines; - labelDeleteLastLines.Text = l.DeleteLastLines; - labelDeleteLinesContaining.Text = l.DeleteContaining; - numericUpDownDeleteFirst.Left = labelDeleteFirstLines.Left + labelDeleteFirstLines.Width + 5; - numericUpDownDeleteLast.Left = labelDeleteLastLines.Left + labelDeleteLastLines.Width + 5; - groupBoxAdjustDuration.Text = Configuration.Settings.Language.AdjustDisplayDuration.Title; - - comboBoxFrameRateFrom.Left = labelFromFrameRate.Left + labelFromFrameRate.Width + 3; - comboBoxFrameRateTo.Left = labelToFrameRate.Left + labelToFrameRate.Width + 3; - if (comboBoxFrameRateFrom.Left > comboBoxFrameRateTo.Left) - { - comboBoxFrameRateTo.Left = comboBoxFrameRateFrom.Left; - } - else - { - comboBoxFrameRateFrom.Left = comboBoxFrameRateTo.Left; - } - - buttonSwapFrameRate.Left = comboBoxFrameRateFrom.Left + comboBoxFrameRateFrom.Width + 10; - buttonSwapFrameRate.Top = comboBoxFrameRateFrom.Top + ((comboBoxFrameRateTo.Top + comboBoxFrameRateTo.Height - comboBoxFrameRateFrom.Top) / 2) - (buttonSwapFrameRate.Height / 2) + 1; - - comboBoxSubtitleFormats.Left = labelOutputFormat.Left + labelOutputFormat.Width + 3; - comboBoxEncoding.Left = labelEncoding.Left + labelEncoding.Width + 3; - if (comboBoxSubtitleFormats.Left > comboBoxEncoding.Left) - { - comboBoxEncoding.Left = comboBoxSubtitleFormats.Left; - } - else - { - comboBoxSubtitleFormats.Left = comboBoxEncoding.Left; - } - buttonBrowseEncoding.Left = comboBoxEncoding.Left + comboBoxEncoding.Width + 5; - buttonStyles.Left = comboBoxSubtitleFormats.Left + comboBoxSubtitleFormats.Width + 5; - buttonTransportStreamSettings.Left = buttonStyles.Left; - - timeUpDownAdjust.MaskedTextBox.Text = "000000000"; - - comboBoxFrameRateFrom.Items.Add(23.976); - comboBoxFrameRateFrom.Items.Add(24.0); - comboBoxFrameRateFrom.Items.Add(25.0); - comboBoxFrameRateFrom.Items.Add(29.97); - comboBoxFrameRateFrom.Items.Add(30.0); - - comboBoxFrameRateTo.Items.Add(23.976); - comboBoxFrameRateTo.Items.Add(24.0); - comboBoxFrameRateTo.Items.Add(25.0); - comboBoxFrameRateTo.Items.Add(29.97); - comboBoxFrameRateTo.Items.Add(30.0); - - UiUtil.FixLargeFonts(this, buttonCancel); - - _allFormats = new List { new Pac() }; - var formatNames = new List(); - foreach (var format in SubtitleFormat.AllSubtitleFormats) - { - if (!format.IsVobSubIndexFile) - { - formatNames.Add(format.Name); - _allFormats.Add(format); - } - } - formatNames.Add("PAC"); - formatNames.Add(new Ayato().Name); - formatNames.Add(l.PlainText); - formatNames.Add(BluRaySubtitle); - formatNames.Add(VobSubSubtitle); - formatNames.Add(DostImageSubtitle); - formatNames.Add(BdnXmlSubtitle); - formatNames.Add(FcpImageSubtitle); - formatNames.Add(Configuration.Settings.Language.ExportCustomText.Title); - UiUtil.InitializeSubtitleFormatComboBox(comboBoxSubtitleFormats, formatNames, Configuration.Settings.Tools.BatchConvertFormat); - - UiUtil.InitializeTextEncodingComboBox(comboBoxEncoding); - comboBoxEncoding.Items.Add(new TextEncoding(Encoding.UTF8, l.TryToUseSourceEncoding)); - - if (string.IsNullOrEmpty(Configuration.Settings.Tools.BatchConvertOutputFolder) || !Directory.Exists(Configuration.Settings.Tools.BatchConvertOutputFolder)) - { - textBoxOutputFolder.Text = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); - } - else - { - textBoxOutputFolder.Text = Configuration.Settings.Tools.BatchConvertOutputFolder; - } - - checkBoxOverwrite.Checked = Configuration.Settings.Tools.BatchConvertOverwriteExisting; - buttonConvertOptionsSettings.Text = l.Settings; - radioButtonShowEarlier.Text = Configuration.Settings.Language.ShowEarlierLater.ShowEarlier.RemoveChar('&'); - radioButtonShowLater.Text = Configuration.Settings.Language.ShowEarlierLater.ShowLater.RemoveChar('&'); - radioButtonSpeedCustom.Text = Configuration.Settings.Language.ChangeSpeedInPercent.Custom; - radioButtonSpeedFromDropFrame.Text = Configuration.Settings.Language.ChangeSpeedInPercent.FromDropFrame; - radioButtonToDropFrame.Text = Configuration.Settings.Language.ChangeSpeedInPercent.ToDropFrame; - if (Configuration.Settings.Tools.BatchConvertSaveInSourceFolder) - { - radioButtonSaveInSourceFolder.Checked = true; - } - else - { - radioButtonSaveInOutputFolder.Checked = true; - } - - groupBoxChangeCasing.Text = Configuration.Settings.Language.ChangeCasing.ChangeCasingTo; - radioButtonNormal.Text = Configuration.Settings.Language.ChangeCasing.NormalCasing; - radioButtonFixOnlyNames.Text = Configuration.Settings.Language.ChangeCasing.FixOnlyNamesCasing; - radioButtonUppercase.Text = Configuration.Settings.Language.ChangeCasing.AllUppercase; - radioButtonLowercase.Text = Configuration.Settings.Language.ChangeCasing.AllLowercase; - if (Configuration.Settings.Tools.ChangeCasingChoice == "NamesOnly") - { - radioButtonFixOnlyNames.Checked = true; - } - else if (Configuration.Settings.Tools.ChangeCasingChoice == "Uppercase") - { - radioButtonUppercase.Checked = true; - } - else if (Configuration.Settings.Tools.ChangeCasingChoice == "Lowercase") - { - radioButtonLowercase.Checked = true; - } - - _removeTextForHearingImpaired = new RemoveTextForHI(new RemoveTextForHISettings(new Subtitle())); - _removeTextForHiSettings = _removeTextForHearingImpaired.Settings; - - labelFilter.Text = l.Filter; - comboBoxFilter.Items[0] = Configuration.Settings.Language.General.AllFiles; - comboBoxFilter.Items[1] = l.FilterSrtNoUtf8BOM; - comboBoxFilter.Items[2] = l.FilterMoreThanTwoLines; - comboBoxFilter.Items[3] = l.FilterContains; - comboBoxFilter.Items[4] = l.FilterFileNameContains; - comboBoxFilter.Items[5] = l.MkvLanguageCodeContains; - comboBoxFilter.SelectedIndex = 0; - comboBoxFilter.Left = labelFilter.Left + labelFilter.Width + 4; - textBoxFilter.Left = comboBoxFilter.Left + comboBoxFilter.Width + 4; - - _assStyle = Configuration.Settings.Tools.BatchConvertAssStyles; - _ssaStyle = Configuration.Settings.Tools.BatchConvertSsaStyles; - checkBoxUseStyleFromSource.Checked = Configuration.Settings.Tools.BatchConvertUseStyleFromSource; - _customTextTemplate = Configuration.Settings.Tools.BatchConvertExportCustomTextTemplate; - - comboBoxSubtitleFormats.AutoCompleteSource = AutoCompleteSource.ListItems; - comboBoxSubtitleFormats.AutoCompleteMode = AutoCompleteMode.Append; - - _bridgeGaps = new DurationsBridgeGaps(null); - _bridgeGaps.InitializeSettingsOnly(); - buttonTransportStreamSettings.Visible = false; - - groupBoxFixRtl.Text = Configuration.Settings.Language.BatchConvert.Settings; - radioButtonAddUnicode.Text = Configuration.Settings.Language.BatchConvert.FixRtlAddUnicode; - radioButtonRemoveUnicode.Text = Configuration.Settings.Language.BatchConvert.FixRtlRemoveUnicode; - radioButtonReverseStartEnd.Text = Configuration.Settings.Language.BatchConvert.FixRtlReverseStartEnd; - - - labelAdjustDurationVia.Text = Configuration.Settings.Language.AdjustDisplayDuration.AdjustVia; - comboBoxAdjustDurationVia.Left = labelAdjustDurationVia.Left + labelAdjustDurationVia.Width + 5; - comboBoxAdjustDurationVia.Items.Clear(); - comboBoxAdjustDurationVia.Items.Add(Configuration.Settings.Language.AdjustDisplayDuration.AddSeconds); - comboBoxAdjustDurationVia.Items.Add(Configuration.Settings.Language.AdjustDisplayDuration.Percent); - comboBoxAdjustDurationVia.Items.Add(Configuration.Settings.Language.AdjustDisplayDuration.Recalculate); - comboBoxAdjustDurationVia.Items.Add(Configuration.Settings.Language.AdjustDisplayDuration.Fixed); - switch (Configuration.Settings.Tools.AdjustDurationLast) - { - case AdjustDisplayDuration.Sec: - comboBoxAdjustDurationVia.SelectedIndex = 0; - break; - case AdjustDisplayDuration.Per: - comboBoxAdjustDurationVia.SelectedIndex = 1; - break; - case AdjustDisplayDuration.Recal: - comboBoxAdjustDurationVia.SelectedIndex = 2; - break; - case AdjustDisplayDuration.Fixed: - comboBoxAdjustDurationVia.SelectedIndex = 3; - break; - default: - comboBoxAdjustDurationVia.SelectedIndex = 0; - break; - } - decimal adjustSeconds = Configuration.Settings.Tools.AdjustDurationSeconds; - if (adjustSeconds >= numericUpDownSeconds.Minimum && adjustSeconds <= numericUpDownSeconds.Maximum) - { - numericUpDownSeconds.Value = adjustSeconds; - } - - int adjustPercent = Configuration.Settings.Tools.AdjustDurationPercent; - if (adjustPercent >= numericUpDownAdjustViaPercent.Minimum && adjustPercent <= numericUpDownAdjustViaPercent.Maximum) - { - numericUpDownAdjustViaPercent.Value = adjustPercent; - } - - numericUpDownOptimalCharsSec.Value = (decimal)Configuration.Settings.General.SubtitleOptimalCharactersPerSeconds; - numericUpDownMaxCharsSec.Value = (decimal)Configuration.Settings.General.SubtitleMaximumCharactersPerSeconds; - checkBoxExtendOnly.Checked = Configuration.Settings.Tools.AdjustDurationExtendOnly; - - labelOptimalCharsSec.Text = Configuration.Settings.Language.Settings.OptimalCharactersPerSecond; - labelMaxCharsPerSecond.Text = Configuration.Settings.Language.Settings.MaximumCharactersPerSecond; - labelAddSeconds.Text = Configuration.Settings.Language.AdjustDisplayDuration.AddSeconds; - labelMillisecondsFixed.Text = Configuration.Settings.Language.AdjustDisplayDuration.Milliseconds; - checkBoxExtendOnly.Text = Configuration.Settings.Language.AdjustDisplayDuration.ExtendOnly; - labelAdjustViaPercent.Text = Configuration.Settings.Language.AdjustDisplayDuration.SetAsPercent; - - - - var mode = Configuration.Settings.Tools.BatchConvertFixRtlMode; - if (mode == RemoveUnicode) - { - radioButtonRemoveUnicode.Checked = true; - } - else if (mode == ReverseStartEnd) - { - radioButtonReverseStartEnd.Checked = true; - } - else // fix with unicode char - { - radioButtonAddUnicode.Checked = true; - } - - groupBoxMergeShortLines.Text = Configuration.Settings.Language.MergedShortLines.Title; - labelMaxCharacters.Text = Configuration.Settings.Language.MergedShortLines.MaximumCharacters; - labelMaxMillisecondsBetweenLines.Text = Configuration.Settings.Language.MergedShortLines.MaximumMillisecondsBetween; - checkBoxOnlyContinuationLines.Text = Configuration.Settings.Language.MergedShortLines.OnlyMergeContinuationLines; - if (Configuration.Settings.General.SubtitleLineMaximumLength > numericUpDownMaxCharacters.Maximum) - { - numericUpDownMaxCharacters.Value = numericUpDownMaxCharacters.Maximum; - } - else if (Configuration.Settings.General.SubtitleLineMaximumLength < numericUpDownMaxCharacters.Minimum) - { - numericUpDownMaxCharacters.Value = numericUpDownMaxCharacters.Minimum; - } - else - { - numericUpDownMaxCharacters.Value = Configuration.Settings.General.SubtitleLineMaximumLength; - } - numericUpDownMaxMillisecondsBetweenLines.Value = Configuration.Settings.Tools.MergeShortLinesMaxGap; - checkBoxOnlyContinuationLines.Checked = Configuration.Settings.Tools.MergeShortLinesOnlyContinuous; - - inverseSelectionToolStripMenuItem.Text = Configuration.Settings.Language.Main.Menu.Edit.InverseSelection; - toolStripMenuItemSelectAll.Text = Configuration.Settings.Language.Main.Menu.ContextMenu.SelectAll; - UpdateNumberOfFiles(); - - var fixItems = new List - { - new FixActionItem - { - Text = l.RemoveFormatting, - Checked = Configuration.Settings.Tools.BatchConvertRemoveFormatting, - Action = CommandLineConverter.BatchAction.RemoveFormatting - }, - new FixActionItem - { - Text = l.RemoveStyleActor, - Checked = Configuration.Settings.Tools.BatchConvertRemoveStyle, - Action = CommandLineConverter.BatchAction.RemoveStyle, - Control = groupBoxRemoveStyle - }, - new FixActionItem - { - Text = l.RedoCasing, - Checked = Configuration.Settings.Tools.BatchConvertFixCasing, - Action = CommandLineConverter.BatchAction.RedoCasing, - Control = groupBoxChangeCasing - }, - new FixActionItem - { - Text = l.RemoveTextForHI, - Checked = Configuration.Settings.Tools.BatchConvertRemoveTextForHI, - Action = CommandLineConverter.BatchAction.RemoveTextForHI, - Control = buttonConvertOptionsSettings - }, - new FixActionItem - { - Text = l.BridgeGaps, - Checked = Configuration.Settings.Tools.BatchConvertBridgeGaps, - Action = CommandLineConverter.BatchAction.BridgeGaps, - Control = buttonConvertOptionsSettings - }, - new FixActionItem - { - Text = Configuration.Settings.Language.FixCommonErrors.Title, - Checked = Configuration.Settings.Tools.BatchConvertFixCommonErrors, - Action = CommandLineConverter.BatchAction.FixCommonErrors, - Control = buttonConvertOptionsSettings - }, - new FixActionItem - { - Text = Configuration.Settings.Language.MultipleReplace.Title, - Checked = Configuration.Settings.Tools.BatchConvertMultipleReplace, - Action = CommandLineConverter.BatchAction.MultipleReplace, - Control = buttonConvertOptionsSettings - }, - new FixActionItem - { - Text = l.FixRtl, - Checked = Configuration.Settings.Tools.BatchConvertFixRtl, - Action = CommandLineConverter.BatchAction.FixRtl, - Control = groupBoxFixRtl - }, - new FixActionItem - { - Text = l.SplitLongLines, - Checked = Configuration.Settings.Tools.BatchConvertSplitLongLines, - Action = CommandLineConverter.BatchAction.SplitLongLines - }, - new FixActionItem - { - Text = l.AutoBalance, - Checked = Configuration.Settings.Tools.BatchConvertAutoBalance, - Action = CommandLineConverter.BatchAction.BalanceLines - }, - new FixActionItem - { - Text = Configuration.Settings.Language.SetMinimumDisplayTimeBetweenParagraphs.Title, - Checked = Configuration.Settings.Tools.BatchConvertSetMinDisplayTimeBetweenSubtitles, - Action = CommandLineConverter.BatchAction.SetMinGap - }, - new FixActionItem - { - Text = Configuration.Settings.Language.MergedShortLines.Title, - Checked = Configuration.Settings.Tools.BatchConvertMergeShortLines, - Action = CommandLineConverter.BatchAction.MergeShortLines, - Control = groupBoxMergeShortLines - }, - new FixActionItem - { - Text = Configuration.Settings.Language.BatchConvert.RemoveLineBreaks, - Checked = Configuration.Settings.Tools.BatchConvertRemoveLineBreaks, - Action = CommandLineConverter.BatchAction.RemoveLineBreaks - }, - new FixActionItem - { - Text = Configuration.Settings.Language.MergeDoubleLines.Title, - Checked = Configuration.Settings.Tools.BatchConvertMergeSameText, - Action = CommandLineConverter.BatchAction.MergeSameTexts - }, - new FixActionItem - { - Text = Configuration.Settings.Language.MergeTextWithSameTimeCodes.Title, - Checked = Configuration.Settings.Tools.BatchConvertMergeSameTimeCodes, - Action = CommandLineConverter.BatchAction.MergeSameTimeCodes - }, - new FixActionItem - { - Text = Configuration.Settings.Language.ChangeFrameRate.Title, - Checked = Configuration.Settings.Tools.BatchConvertChangeFrameRate, - Action = CommandLineConverter.BatchAction.ChangeFrameRate, - Control = groupBoxChangeFrameRate - }, - new FixActionItem - { - Text = l.OffsetTimeCodes, - Checked = Configuration.Settings.Tools.BatchConvertOffsetTimeCodes, - Action = CommandLineConverter.BatchAction.OffsetTimeCodes, - Control = groupBoxOffsetTimeCodes - }, - new FixActionItem - { - Text = Configuration.Settings.Language.ChangeSpeedInPercent.TitleShort, - Checked = Configuration.Settings.Tools.BatchConvertChangeSpeed, - Action = CommandLineConverter.BatchAction.ChangeSpeed, - Control = groupBoxSpeed - }, - new FixActionItem - { - Text = Configuration.Settings.Language.AdjustDisplayDuration.Title, - Checked = Configuration.Settings.Tools.BatchConvertAdjustDisplayDuration, - Action = CommandLineConverter.BatchAction.AdjustDisplayDuration, - Control = groupBoxAdjustDuration - }, - new FixActionItem - { - Text = Configuration.Settings.Language.ApplyDurationLimits.Title, - Checked = Configuration.Settings.Tools.BatchConvertApplyDurationLimits, - Action = CommandLineConverter.BatchAction.ApplyDurationLimits - }, - new FixActionItem - { - Text = l.DeleteLines, - Checked = Configuration.Settings.Tools.BatchConvertDeleteLines, - Action = CommandLineConverter.BatchAction.DeleteLines, - Control = groupBoxDeleteLines - } - - }; - foreach (var fixItem in fixItems) - { - var listViewItem = new ListViewItem { Tag = fixItem }; - listViewItem.SubItems.Add(fixItem.Text); - listViewItem.Checked = fixItem.Checked; - listViewConvertOptions.Items.Add(listViewItem); - } - - listViewConvertOptions_SelectedIndexChanged(null, null); - - if (Configuration.IsRunningOnWindows) - { - buttonSwapFrameRate.Text = "🡙"; - } - else - { - buttonSwapFrameRate.Text = "<->"; - buttonSwapFrameRate.Width = 35; - buttonSwapFrameRate.Font = new Font(Font.FontFamily, Font.Size); - } - - SetMkvLanguageMenuItem(); - } - - private void SetMkvLanguageMenuItem() - { - var styleName = Configuration.Settings.Language.BatchConvert.MkvLanguageStyleThreeLetter; - if (Configuration.Settings.Tools.BatchConvertMkvLanguageCodeStyle == "2") - { - styleName = Configuration.Settings.Language.BatchConvert.MkvLanguageStyleTwoLetter; - } - else if (Configuration.Settings.Tools.BatchConvertMkvLanguageCodeStyle == "0") - { - styleName = Configuration.Settings.Language.BatchConvert.MkvLanguageStyleEmpty; - } - - convertMkvSettingsToolStripMenuItem.Text = string.Format(Configuration.Settings.Language.BatchConvert.MkvLanguageInOutputFileNameX, styleName); - } - - public class FixActionItem - { - public string Text { get; set; } - public bool Checked { get; set; } - public CommandLineConverter.BatchAction Action { get; set; } - public Control Control { get; set; } - } - - - private void buttonInputBrowse_Click(object sender, EventArgs e) - { - buttonInputBrowse.Enabled = false; - openFileDialog1.Title = Configuration.Settings.Language.General.OpenSubtitle; - openFileDialog1.FileName = string.Empty; - openFileDialog1.Filter = UiUtil.SubtitleExtensionFilter.Value; - openFileDialog1.Multiselect = true; - if (openFileDialog1.ShowDialog(this) == DialogResult.OK) - { - try - { - Cursor = Cursors.WaitCursor; - labelStatus.Text = Configuration.Settings.Language.General.PleaseWait; - listViewInputFiles.BeginUpdate(); - foreach (string fileName in openFileDialog1.FileNames) - { - AddInputFile(fileName); - Application.DoEvents(); - } - } - finally - { - listViewInputFiles.EndUpdate(); - Cursor = Cursors.Default; - labelStatus.Text = string.Empty; - } - } - - buttonInputBrowse.Enabled = true; - } - - private void AddInputFile(string fileName) - { - if (comboBoxFilter.SelectedIndex == 4 && textBoxFilter.Text.Length > 0 && !fileName.Contains(textBoxFilter.Text, StringComparison.OrdinalIgnoreCase)) - { - return; - } - try - { - foreach (ListViewItem lvi in listViewInputFiles.Items) - { - if (lvi.Text.Equals(fileName, StringComparison.OrdinalIgnoreCase)) - { - return; - } - } - - var fi = new FileInfo(fileName); - var ext = fi.Extension.ToLowerInvariant(); - var item = new ListViewItem(fileName); - item.SubItems.Add(Utilities.FormatBytesToDisplayFileSize(fi.Length)); - var isMkv = false; - var mkvPgs = new List(); - var mkvVobSub = new List(); - var mkvSrt = new List(); - var mkvSsa = new List(); - var mkvAss = new List(); - int mkvCount = 0; - var isTs = false; - - SubtitleFormat format = null; - var sub = new Subtitle(); - if (fi.Length < ConvertMaxFileSize) - { - if (!FileUtil.IsBluRaySup(fileName) && !FileUtil.IsVobSub(fileName) && - !((ext == ".mkv" || ext == ".mks") && FileUtil.IsMatroskaFile(fileName))) - { - format = sub.LoadSubtitle(fileName, out _, null); - - if (format == null) - { - foreach (var f in SubtitleFormat.GetBinaryFormats(true)) - { - if (f.IsMine(null, fileName)) - { - f.LoadSubtitle(sub, null, fileName); - format = f; - break; - } - } - } - - if (format == null) - { - var encoding = LanguageAutoDetect.GetEncodingFromFile(fileName); - var lines = FileUtil.ReadAllTextShared(fileName, encoding).SplitToLines(); - foreach (var f in SubtitleFormat.GetTextOtherFormats()) - { - if (f.IsMine(lines, fileName)) - { - f.LoadSubtitle(sub, lines, fileName); - format = f; - break; - } - } - } - } - } - - if (format == null) - { - if (FileUtil.IsBluRaySup(fileName)) - { - item.SubItems.Add("Blu-ray"); - } - else if (FileUtil.IsVobSub(fileName)) - { - item.SubItems.Add("VobSub"); - } - else if (ext == ".mkv" || ext == ".mks") - { - isMkv = true; - using (var matroska = new MatroskaFile(fileName)) - { - if (matroska.IsValid) - { - foreach (var track in matroska.GetTracks(true)) - { - if (track.CodecId.Equals("S_VOBSUB", StringComparison.OrdinalIgnoreCase)) - { - mkvVobSub.Add(MakeMkvTrackInfoString(track)); - } - else if (track.CodecId.Equals("S_HDMV/PGS", StringComparison.OrdinalIgnoreCase)) - { - mkvPgs.Add(MakeMkvTrackInfoString(track)); - } - else if (track.CodecId.Equals("S_TEXT/UTF8", StringComparison.OrdinalIgnoreCase)) - { - mkvSrt.Add(MakeMkvTrackInfoString(track)); - } - else if (track.CodecId.Equals("S_TEXT/SSA", StringComparison.OrdinalIgnoreCase)) - { - mkvSsa.Add(MakeMkvTrackInfoString(track)); - } - else if (track.CodecId.Equals("S_TEXT/ASS", StringComparison.OrdinalIgnoreCase)) - { - mkvAss.Add(MakeMkvTrackInfoString(track)); - } - } - } - } - if (mkvVobSub.Count + mkvPgs.Count + mkvSrt.Count + mkvSsa.Count + mkvAss.Count <= 0) - { - item.SubItems.Add(Configuration.Settings.Language.UnknownSubtitle.Title); - } - } - else if ((ext == ".ts" || ext == ".m2ts" || ext == ".mts" || ext == ".mpg" || ext == ".mpeg") && - (FileUtil.IsTransportStream(fileName) || FileUtil.IsM2TransportStream(fileName))) - { - isTs = true; - } - else - { - item.SubItems.Add(Configuration.Settings.Language.UnknownSubtitle.Title); - } - } - else - { - item.SubItems.Add(format.Name); - } - item.SubItems.Add("-"); - - if (isMkv) - { - if (mkvCount > 0) - { - listViewInputFiles.Items.Add(item); - } - - foreach (var lang in mkvPgs) - { - item = new ListViewItem(fileName); - item.SubItems.Add(Utilities.FormatBytesToDisplayFileSize(fi.Length)); - listViewInputFiles.Items.Add(item); - item.SubItems.Add("Matroska/PGS - " + lang); - item.SubItems.Add("-"); - } - foreach (var lang in mkvVobSub) - { - item = new ListViewItem(fileName); - item.SubItems.Add(Utilities.FormatBytesToDisplayFileSize(fi.Length)); - listViewInputFiles.Items.Add(item); - item.SubItems.Add("Matroska/VobSub - " + lang); - item.SubItems.Add("-"); - } - foreach (var lang in mkvSrt) - { - if (comboBoxFilter.SelectedIndex == 5 && textBoxFilter.Text.Length > 0 && !lang.Contains(textBoxFilter.Text, StringComparison.OrdinalIgnoreCase)) - { - continue; - } - item = new ListViewItem(fileName); - item.SubItems.Add(Utilities.FormatBytesToDisplayFileSize(fi.Length)); - listViewInputFiles.Items.Add(item); - item.SubItems.Add("Matroska/SRT - " + lang); - item.SubItems.Add("-"); - } - foreach (var lang in mkvSsa) - { - item = new ListViewItem(fileName); - item.SubItems.Add(Utilities.FormatBytesToDisplayFileSize(fi.Length)); - listViewInputFiles.Items.Add(item); - item.SubItems.Add("Matroska/SSA - " + lang); - item.SubItems.Add("-"); - } - foreach (var lang in mkvAss) - { - item = new ListViewItem(fileName); - item.SubItems.Add(Utilities.FormatBytesToDisplayFileSize(fi.Length)); - listViewInputFiles.Items.Add(item); - item.SubItems.Add("Matroska/ASS - " + lang); - item.SubItems.Add("-"); - } - } - else if (isTs) - { - item = new ListViewItem(fileName); - item.SubItems.Add(Utilities.FormatBytesToDisplayFileSize(fi.Length)); - listViewInputFiles.Items.Add(item); - item.SubItems.Add("Transport Stream"); - item.SubItems.Add("-"); - } - else - { - listViewInputFiles.Items.Add(item); - } - - if (isTs) - { - buttonTransportStreamSettings.Visible = true; - } - } - catch - { - // ignored - } - UpdateNumberOfFiles(); - } - - private static string MakeMkvTrackInfoString(MatroskaTrackInfo track) - { - return (track.Language ?? "undefined") + (track.IsForced ? " (forced)" : string.Empty) + " #" + track.TrackNumber; - } - - private string GetMkvLanguage(string languageCode) - { - if (Configuration.Settings.Tools.BatchConvertMkvLanguageCodeStyle == "0") - { - return string.Empty; - } - - if (string.IsNullOrEmpty(languageCode)) - { - return "undefined."; - } - - if (Configuration.Settings.Tools.BatchConvertMkvLanguageCodeStyle == "2" && - !string.IsNullOrEmpty(Iso639Dash2LanguageCode.GetTwoLetterCodeFromThreeLetterCode(languageCode))) - { - return Iso639Dash2LanguageCode.GetTwoLetterCodeFromThreeLetterCode(languageCode) + "."; - } - - return string.IsNullOrEmpty(languageCode) ? string.Empty : languageCode.TrimEnd('.') + "."; - } - - private void listViewInputFiles_DragEnter(object sender, DragEventArgs e) - { - if (_converting || _searching) - { - e.Effect = DragDropEffects.None; - return; - } - - if (e.Data.GetDataPresent(DataFormats.FileDrop, false)) - { - e.Effect = DragDropEffects.All; - } - } - - private void listViewInputFiles_DragDrop(object sender, DragEventArgs e) - { - if (_converting || _searching) - { - return; - } - - try - { - var fileNames = (string[])e.Data.GetData(DataFormats.FileDrop); - labelStatus.Text = Configuration.Settings.Language.General.PleaseWait; - listViewInputFiles.BeginUpdate(); - foreach (string fileName in fileNames) - { - if (FileUtil.IsDirectory(fileName)) - { - SearchFolder(fileName); - } - else - { - AddInputFile(fileName); - } - } - } - finally - { - labelStatus.Text = string.Empty; - listViewInputFiles.EndUpdate(); - } - } - - private void radioButtonSpeedCustom_CheckedChanged(object sender, EventArgs e) - { - numericUpDownPercent.Enabled = true; - } - - private void radioButtonSpeedFromDropFrame_CheckedChanged(object sender, EventArgs e) - { - numericUpDownPercent.Value = Convert.ToDecimal(099.98887); - numericUpDownPercent.Enabled = false; - } - - private void radioButtonToDropFrame_CheckedChanged(object sender, EventArgs e) - { - numericUpDownPercent.Value = Convert.ToDecimal(100.1001001); - numericUpDownPercent.Enabled = false; - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private TextEncoding GetCurrentEncoding(string fileName) - { - bool useEncodingFromFile = comboBoxEncoding.SelectedIndex == comboBoxEncoding.Items.Count - 1; - if (useEncodingFromFile) - { - if (string.IsNullOrEmpty(fileName) || !File.Exists(fileName)) - { - if (Configuration.Settings.General.DefaultEncoding == TextEncoding.Utf8WithoutBom) - { - return new TextEncoding(Encoding.UTF8, TextEncoding.Utf8WithoutBom); - } - return new TextEncoding(Encoding.UTF8, TextEncoding.Utf8WithBom); - } - var enc = LanguageAutoDetect.GetEncodingFromFile(fileName); - return new TextEncoding(enc, null); - } - - return UiUtil.GetTextEncodingComboBoxCurrentEncoding(comboBoxEncoding); - } - - private SubtitleFormat GetCurrentSubtitleFormat() - { - var format = Utilities.GetSubtitleFormatByFriendlyName(comboBoxSubtitleFormats.SelectedItem.ToString()); - return format ?? new SubRip(); - } - - private void buttonConvert_Click(object sender, EventArgs e) - { - if (buttonConvert.Text == Configuration.Settings.Language.General.Cancel) - { - _abort = true; - return; - } - - UpdateChangeCasingSettings(); - UpdateRtlSettings(); - UpdateActionEnabledCache(); - if (listViewInputFiles.Items.Count == 0) - { - MessageBox.Show(Configuration.Settings.Language.BatchConvert.NothingToConvert); - return; - } - if (!checkBoxOverwrite.Checked) - { - if (textBoxOutputFolder.Text.Length < 2) - { - MessageBox.Show(Configuration.Settings.Language.BatchConvert.PleaseChooseOutputFolder); - return; - } - if (!Directory.Exists(textBoxOutputFolder.Text)) - { - try - { - Directory.CreateDirectory(textBoxOutputFolder.Text); - } - catch (Exception exception) - { - MessageBox.Show(exception.Message); - return; - } - } - } - _converting = true; - progressBar1.Style = ProgressBarStyle.Blocks; - progressBar1.Maximum = listViewInputFiles.Items.Count; - progressBar1.Value = 0; - progressBar1.Visible = progressBar1.Maximum > 2; - string toFormat = comboBoxSubtitleFormats.Text; - SetControlState(false); - - _count = 0; - _converted = 0; - _errors = 0; - _abort = false; - - var worker1 = SpawnWorker(); - var worker2 = SpawnWorker(); - var worker3 = SpawnWorker(); - - listViewInputFiles.BeginUpdate(); - foreach (ListViewItem item in listViewInputFiles.Items) - { - item.SubItems[3].Text = "-"; - } - - listViewInputFiles.EndUpdate(); - var mkvFileNames = new List(); - Refresh(); - int index = 0; - while (index < listViewInputFiles.Items.Count && !_abort) - { - ListViewItem item = listViewInputFiles.Items[index]; - string fileName = item.Text; - try - { - var binaryParagraphs = new List(); - SubtitleFormat format = null; - var sub = new Subtitle(); - var fi = new FileInfo(fileName); - if (fi.Length < ConvertMaxFileSize && !FileUtil.IsBluRaySup(fileName) && !FileUtil.IsVobSub(fileName)) - { - format = sub.LoadSubtitle(fileName, out _, null); - - if (format == null) - { - foreach (var f in SubtitleFormat.GetBinaryFormats(true)) - { - if (f.IsMine(null, fileName)) - { - f.LoadSubtitle(sub, null, fileName); - format = f; - break; - } - } - } - - if (format == null) - { - var encoding = LanguageAutoDetect.GetEncodingFromFile(fileName); - var lines = FileUtil.ReadAllTextShared(fileName, encoding).SplitToLines(); - foreach (var f in SubtitleFormat.GetTextOtherFormats()) - { - if (f.IsMine(lines, fileName)) - { - f.LoadSubtitle(sub, lines, fileName); - format = f; - break; - } - } - } - - if (format == null) - { - var enc = LanguageAutoDetect.GetEncodingFromFile(fileName); - var s = File.ReadAllText(fileName, enc); - - // check for RTF file - if (fileName.EndsWith(".rtf", StringComparison.OrdinalIgnoreCase) && s.TrimStart().StartsWith("{\\rtf", StringComparison.Ordinal)) - { - using (var rtb = new RichTextBox { Rtf = s }) - { - s = rtb.Text; - } - } - var unknownFormatImporter = new UnknownFormatImporter { UseFrames = true }; - var genericParseSubtitle = unknownFormatImporter.AutoGuessImport(s.SplitToLines()); - if (genericParseSubtitle.Paragraphs.Count > 1) - { - sub = genericParseSubtitle; - format = new SubRip(); - } - } - - if (format != null && format.GetType() == typeof(MicroDvd)) - { - if (sub != null && sub.Paragraphs.Count > 0 && sub.Paragraphs[0].Duration.TotalMilliseconds < 1001) - { - if (sub.Paragraphs[0].Text.StartsWith("29.", StringComparison.Ordinal) || sub.Paragraphs[0].Text.StartsWith("23.", StringComparison.Ordinal) || - sub.Paragraphs[0].Text.StartsWith("29,", StringComparison.Ordinal) || sub.Paragraphs[0].Text.StartsWith("23,", StringComparison.Ordinal) || - sub.Paragraphs[0].Text == "24" || sub.Paragraphs[0].Text == "25" || - sub.Paragraphs[0].Text == "30" || sub.Paragraphs[0].Text == "60") - { - sub.Paragraphs.RemoveAt(0); - } - } - } - } - var bluRaySubtitles = new List(); - bool isVobSub = false; - bool isMatroska = false; - bool isTs = false; - if (format == null && fileName.EndsWith(".sup", StringComparison.OrdinalIgnoreCase) && FileUtil.IsBluRaySup(fileName)) - { - var log = new StringBuilder(); - bluRaySubtitles = BluRaySupParser.ParseBluRaySup(fileName, log); - } - else if (format == null && fileName.EndsWith(".sub", StringComparison.OrdinalIgnoreCase) && FileUtil.IsVobSub(fileName)) - { - isVobSub = true; - } - else if (format == null && (fileName.EndsWith(".mkv", StringComparison.OrdinalIgnoreCase) || fileName.EndsWith(".mks", StringComparison.OrdinalIgnoreCase)) && item.SubItems[2].Text.StartsWith("Matroska", StringComparison.Ordinal)) - { - isMatroska = true; - } - else if (format == null && - (fileName.EndsWith(".ts", StringComparison.OrdinalIgnoreCase) || - fileName.EndsWith(".m2ts", StringComparison.OrdinalIgnoreCase) || - fileName.EndsWith(".mts", StringComparison.OrdinalIgnoreCase) || - fileName.EndsWith(".mpg", StringComparison.OrdinalIgnoreCase) || - fileName.EndsWith(".mpeg", StringComparison.OrdinalIgnoreCase)) && - item.SubItems[2].Text.StartsWith("Transport Stream", StringComparison.Ordinal)) - { - isTs = true; - } - if (format == null && bluRaySubtitles.Count == 0 && !isVobSub && !isMatroska && !isTs) - { - IncrementAndShowProgress(); - } - else - { - if (isMatroska) - { - using (var matroska = new MatroskaFile(fileName)) - { - if (matroska.IsValid) - { - var trackId = item.SubItems[2].Text; - if (trackId.Contains("#")) - { - trackId = trackId.Remove(0, trackId.IndexOf("#", StringComparison.Ordinal) + 1); - } - - foreach (var track in matroska.GetTracks(true)) - { - if (track.CodecId.Equals("S_VOBSUB", StringComparison.OrdinalIgnoreCase)) - { - if (trackId == track.TrackNumber.ToString(CultureInfo.InvariantCulture)) - { - var vobSubs = LoadVobSubFromMatroska(track, matroska, out var idx); - if (vobSubs.Count > 0) - { - item.SubItems[3].Text = Configuration.Settings.Language.BatchConvert.Ocr; - using (var vobSubOcr = new VobSubOcr()) - { - vobSubOcr.ProgressCallback = progress => - { - item.SubItems[3].Text = Configuration.Settings.Language.BatchConvert.Ocr + " " + progress; - listViewInputFiles.Refresh(); - }; - vobSubOcr.FileName = Path.GetFileName(fileName); - vobSubOcr.InitializeBatch(vobSubs, idx.Palette, Configuration.Settings.VobSubOcr, fileName, false, track.Language, null); - sub = vobSubOcr.SubtitleFromOcr; - } - } - - fileName = fileName.Substring(0, fileName.LastIndexOf('.')) + "." + GetMkvLanguage(track.Language).Replace("undefined.", string.Empty) + "mkv"; - if (mkvFileNames.Contains(fileName)) - { - fileName = fileName.Substring(0, fileName.LastIndexOf('.')) + ".#" + trackId + "." + GetMkvLanguage(track.Language) + "mkv"; - } - mkvFileNames.Add(fileName); - - break; - } - } - else if (track.CodecId.Equals("S_HDMV/PGS", StringComparison.OrdinalIgnoreCase)) - { - if (trackId == track.TrackNumber.ToString(CultureInfo.InvariantCulture)) - { - bluRaySubtitles = LoadBluRaySupFromMatroska(track, matroska, Handle); - - fileName = fileName.Substring(0, fileName.LastIndexOf('.')) + "." + GetMkvLanguage(track.Language).Replace("undefined.", string.Empty) + "mkv"; - if (mkvFileNames.Contains(fileName)) - { - fileName = fileName.Substring(0, fileName.LastIndexOf('.')) + ".#" + trackId + "." + GetMkvLanguage(track.Language) + "mkv"; - } - mkvFileNames.Add(fileName); - - if ((toFormat == BdnXmlSubtitle || toFormat == BluRaySubtitle || - toFormat == VobSubSubtitle || toFormat == DostImageSubtitle) && - AllowImageToImage()) - { - foreach (var b in bluRaySubtitles) - { - sub.Paragraphs.Add(new Paragraph(b.StartTimeCode, b.EndTimeCode, string.Empty)); - } - if (!_bdLookup.ContainsKey(fileName)) - { - _bdLookup.Add(fileName, bluRaySubtitles); - } - } - else - { - if (bluRaySubtitles.Count > 0) - { - item.SubItems[3].Text = Configuration.Settings.Language.BatchConvert.Ocr; - using (var vobSubOcr = new VobSubOcr()) - { - vobSubOcr.ProgressCallback = progress => - { - item.SubItems[3].Text = Configuration.Settings.Language.BatchConvert.Ocr + " " + progress; - listViewInputFiles.Refresh(); - }; - vobSubOcr.FileName = Path.GetFileName(fileName); - vobSubOcr.InitializeBatch(bluRaySubtitles, Configuration.Settings.VobSubOcr, fileName, false, track.Language); - sub = vobSubOcr.SubtitleFromOcr; - } - } - } - break; - } - } - else if (track.CodecId.Equals("S_TEXT/UTF8", StringComparison.OrdinalIgnoreCase) || track.CodecId.Equals("S_TEXT/SSA", StringComparison.OrdinalIgnoreCase) || track.CodecId.Equals("S_TEXT/ASS", StringComparison.OrdinalIgnoreCase)) - { - if (trackId == track.TrackNumber.ToString(CultureInfo.InvariantCulture)) - { - var mkvSub = matroska.GetSubtitle(track.TrackNumber, null); - Utilities.LoadMatroskaTextSubtitle(track, matroska, mkvSub, sub); - fileName = fileName.Substring(0, fileName.LastIndexOf('.')) + "." + GetMkvLanguage(track.Language).Replace("undefined.", string.Empty) + "mkv"; - if (mkvFileNames.Contains(fileName)) - { - fileName = fileName.Substring(0, fileName.LastIndexOf('.')) + ".#" + trackId + "." + GetMkvLanguage(track.Language) + "mkv"; - } - mkvFileNames.Add(fileName); - break; - } - } - } - } - } - } - else if (bluRaySubtitles.Count > 0) - { - if ((toFormat == BdnXmlSubtitle || toFormat == BluRaySubtitle || - toFormat == VobSubSubtitle || toFormat == DostImageSubtitle) && - AllowImageToImage()) - { - foreach (var b in bluRaySubtitles) - { - sub.Paragraphs.Add(new Paragraph(b.StartTimeCode, b.EndTimeCode, string.Empty)); - } - } - else - { - item.SubItems[3].Text = Configuration.Settings.Language.BatchConvert.Ocr; - using (var vobSubOcr = new VobSubOcr()) - { - vobSubOcr.ProgressCallback = progress => - { - item.SubItems[3].Text = Configuration.Settings.Language.BatchConvert.Ocr + " " + progress; - listViewInputFiles.Refresh(); - }; - vobSubOcr.FileName = Path.GetFileName(fileName); - vobSubOcr.InitializeBatch(bluRaySubtitles, Configuration.Settings.VobSubOcr, fileName, false); - sub = vobSubOcr.SubtitleFromOcr; - } - } - } - else if (isVobSub) - { - item.SubItems[3].Text = Configuration.Settings.Language.BatchConvert.Ocr; - using (var vobSubOcr = new VobSubOcr()) - { - vobSubOcr.ProgressCallback = progress => - { - item.SubItems[3].Text = Configuration.Settings.Language.BatchConvert.Ocr + " " + progress; - listViewInputFiles.Refresh(); - }; - vobSubOcr.InitializeBatch(fileName, Configuration.Settings.VobSubOcr, false, null); - sub = vobSubOcr.SubtitleFromOcr; - } - } - else if (isTs) - { - int tsConvertedCount = 0; - var programMapTableParser = new ProgramMapTableParser(); - programMapTableParser.Parse(fileName); // get languages - var tsParser = new TransportStreamParser(); - tsParser.Parse(fileName, (position, total) => - { - var percent = (int)Math.Round(position * 100.0 / total); - item.SubItems[3].Text = $"Read: {percent}%"; - listViewInputFiles.Refresh(); - }); - - var outputFolder = textBoxOutputFolder.Text; - var overwrite = checkBoxOverwrite.Checked; - if (radioButtonSaveInSourceFolder.Checked) - { - outputFolder = Path.GetDirectoryName(fileName); - } - - var targetEncoding = GetCurrentEncoding(fileName); - - var targetFrameRate = 0.0; - if (double.TryParse(comboBoxFrameRateTo.Text.Replace(',', '.').Replace(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, "."), NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var toFrameRate)) - { - targetFrameRate = toFrameRate; - } - - // images - if (!Configuration.Settings.Tools.BatchConvertTsOnlyTeletext) - { - foreach (int id in tsParser.SubtitlePacketIds) - { - void ProgressCallback(string progress) - { - item.SubItems[3].Text = progress; - listViewInputFiles.Refresh(); - } - - if (BluRaySubtitle.RemoveChar(' ').Equals(toFormat.RemoveChar(' '), StringComparison.OrdinalIgnoreCase)) - { - TsToBluRaySup.WriteTrack(fileName, outputFolder, overwrite, 0, null, ProgressCallback, null, programMapTableParser, id, tsParser); - tsConvertedCount++; - } - else if (BdnXmlSubtitle.RemoveChar(' ').Equals(toFormat.RemoveChar(' '), StringComparison.OrdinalIgnoreCase)) - { - TsToBdnXml.WriteTrack(fileName, outputFolder, overwrite, null, ProgressCallback, null, programMapTableParser, id, tsParser); - tsConvertedCount++; - } - else - { - var tsBinaryParagraphs = new List(); - var subtitle = new Subtitle(); - foreach (var transportStreamSubtitle in tsParser.GetDvbSubtitles(id)) - { - tsBinaryParagraphs.Add(transportStreamSubtitle); - subtitle.Paragraphs.Add(new Paragraph(string.Empty, transportStreamSubtitle.StartMilliseconds, transportStreamSubtitle.EndMilliseconds)); - } - - using (var vobSubOcr = new VobSubOcr()) - { - vobSubOcr.ProgressCallback = progress => - { - item.SubItems[3].Text = $"OCR: {progress}"; - listViewInputFiles.Refresh(); - }; - var language = programMapTableParser.GetSubtitleLanguage(id); - language = string.IsNullOrEmpty(language) ? null : language; - vobSubOcr.FileName = Path.GetFileName(fileName); - vobSubOcr.InitializeBatch(tsBinaryParagraphs, Configuration.Settings.VobSubOcr, fileName, false, language, null); - subtitle = vobSubOcr.SubtitleFromOcr; - } - - // apply fixes step 1 - subtitle = ApplyFixesStep1(subtitle, null); - - // apply fixes step 2 - var parameter = new ThreadDoWorkParameter( - IsActionEnabled(CommandLineConverter.BatchAction.FixCommonErrors), - IsActionEnabled(CommandLineConverter.BatchAction.MultipleReplace), - IsActionEnabled(CommandLineConverter.BatchAction.FixRtl), - IsActionEnabled(CommandLineConverter.BatchAction.SplitLongLines), - IsActionEnabled(CommandLineConverter.BatchAction.BalanceLines), - IsActionEnabled(CommandLineConverter.BatchAction.SetMinGap), - item, - subtitle, - GetCurrentSubtitleFormat(), - GetCurrentEncoding(fileName), - Configuration.Settings.Tools.BatchConvertLanguage, - fileName, - toFormat, - format, - binaryParagraphs); - ApplyFixesStep2(parameter, Configuration.Settings.Tools.BatchConvertFixRtlMode); - - var preExt = TsToBluRaySup.GetFileNameEnding(programMapTableParser, id); - int dummy = 0; - CommandLineConverter.BatchConvertSave(toFormat, TimeSpan.Zero, targetEncoding, outputFolder, 0, ref dummy, ref dummy, SubtitleFormat.AllSubtitleFormats.ToList(), fileName, parameter.Subtitle, new SubRip(), null, overwrite, 0, targetFrameRate, null, new List(), null, true, null, null, null, preExt); - tsConvertedCount++; - } - } - } - - // teletext - foreach (var program in tsParser.TeletextSubtitlesLookup) - { - foreach (var kvp in program.Value) - { - var subtitle = new Subtitle(kvp.Value); - var preExt = TsToBluRaySup.GetFileNameEnding(programMapTableParser, kvp.Key); - int dummy = 0; - - // apply fixes step 1 - subtitle = ApplyFixesStep1(subtitle, null); - - // apply fixes step 2 - var parameter = new ThreadDoWorkParameter( - IsActionEnabled(CommandLineConverter.BatchAction.FixCommonErrors), - IsActionEnabled(CommandLineConverter.BatchAction.MultipleReplace), - IsActionEnabled(CommandLineConverter.BatchAction.FixRtl), - IsActionEnabled(CommandLineConverter.BatchAction.SplitLongLines), - IsActionEnabled(CommandLineConverter.BatchAction.BalanceLines), - IsActionEnabled(CommandLineConverter.BatchAction.SetMinGap), - item, - subtitle, - GetCurrentSubtitleFormat(), - GetCurrentEncoding(fileName), - Configuration.Settings.Tools.BatchConvertLanguage, - fileName, - toFormat, - format, - binaryParagraphs); - ApplyFixesStep2(parameter, Configuration.Settings.Tools.BatchConvertFixRtlMode); - - CommandLineConverter.BatchConvertSave(toFormat, TimeSpan.Zero, targetEncoding, outputFolder, 0, ref dummy, ref dummy, SubtitleFormat.AllSubtitleFormats.ToList(), fileName, parameter.Subtitle, new SubRip(), null, overwrite, 0, targetFrameRate, null, new List(), null, true, null, null, null, preExt); - tsConvertedCount++; - } - } - - if (tsConvertedCount > 0) - { - item.SubItems[3].Text = Configuration.Settings.Language.BatchConvert.Converted; - } - } - - if (comboBoxSubtitleFormats.Text == AdvancedSubStationAlpha.NameOfFormat && _assStyle != null) - { - if (!string.IsNullOrWhiteSpace(_assStyle) && !checkBoxUseStyleFromSource.Checked) - { - sub.Header = _assStyle; - } - } - else if (comboBoxSubtitleFormats.Text == SubStationAlpha.NameOfFormat && _ssaStyle != null) - { - if (!string.IsNullOrWhiteSpace(_ssaStyle) && !checkBoxUseStyleFromSource.Checked) - { - sub.Header = _ssaStyle; - } - } - - bool skip = CheckSkipFilter(fileName, format, sub); - if (skip) - { - item.SubItems[3].Text = Configuration.Settings.Language.BatchConvert.FilterSkipped; - } - else - { - sub = ApplyFixesStep1(sub, bluRaySubtitles); - - while (worker1.IsBusy && worker2.IsBusy && worker3.IsBusy) - { - Application.DoEvents(); - System.Threading.Thread.Sleep(100); - } - - var parameter = new ThreadDoWorkParameter( - IsActionEnabled(CommandLineConverter.BatchAction.FixCommonErrors), - IsActionEnabled(CommandLineConverter.BatchAction.MultipleReplace), - IsActionEnabled(CommandLineConverter.BatchAction.FixRtl), - IsActionEnabled(CommandLineConverter.BatchAction.SplitLongLines), - IsActionEnabled(CommandLineConverter.BatchAction.BalanceLines), - IsActionEnabled(CommandLineConverter.BatchAction.SetMinGap), - item, - sub, - GetCurrentSubtitleFormat(), - GetCurrentEncoding(fileName), - Configuration.Settings.Tools.BatchConvertLanguage, - fileName, - toFormat, - format, - binaryParagraphs); - - if (!worker1.IsBusy) - { - worker1.RunWorkerAsync(parameter); - } - else if (!worker2.IsBusy) - { - worker2.RunWorkerAsync(parameter); - } - else if (!worker3.IsBusy) - { - worker3.RunWorkerAsync(parameter); - } - } - } - } - catch (Exception exception) - { - System.Diagnostics.Debug.WriteLine(exception); - IncrementAndShowProgress(); - } - index++; - } - while (worker1.IsBusy || worker2.IsBusy || worker3.IsBusy) - { - try - { - Application.DoEvents(); - } - catch - { - // ignored - } - System.Threading.Thread.Sleep(100); - } - - // dispose workers - worker1.Dispose(); - worker2.Dispose(); - worker3.Dispose(); - - _converting = false; - labelStatus.Text = string.Empty; - progressBar1.Visible = false; - TaskbarList.SetProgressState(Handle, TaskbarButtonProgressFlags.NoProgress); - SetControlState(true); - _bdLookup = new Dictionary>(); - } - - private Subtitle ApplyFixesStep1(Subtitle sub, List bluRaySubtitles) - { - if (IsActionEnabled(CommandLineConverter.BatchAction.BridgeGaps)) - { - Core.Forms.DurationsBridgeGaps.BridgeGaps(sub, _bridgeGaps.MinMsBetweenLines, !_bridgeGaps.PreviousSubtitleTakesAllTime, Configuration.Settings.Tools.BridgeGapMilliseconds, null, null, false); - } - - if (IsActionEnabled(CommandLineConverter.BatchAction.ApplyDurationLimits)) - { - var fixDurationLimits = new FixDurationLimits(Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds, Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds); - sub = fixDurationLimits.Fix(sub); - } - - if (IsActionEnabled(CommandLineConverter.BatchAction.DeleteLines)) - { - DeleteLines(sub); - } - - if (IsActionEnabled(CommandLineConverter.BatchAction.RemoveStyle) && !string.IsNullOrEmpty(textBoxRemoveStyle.Text)) - { - sub.Paragraphs.RemoveAll(p => p.Extra == textBoxRemoveStyle.Text || p.Style == textBoxRemoveStyle.Text); - sub.Renumber(); - } - - if (IsActionEnabled(CommandLineConverter.BatchAction.AdjustDisplayDuration)) - { - var adjustmentType = comboBoxAdjustDurationVia.Text; - if (adjustmentType == Configuration.Settings.Language.AdjustDisplayDuration.Percent) - { - sub.AdjustDisplayTimeUsingPercent((double)numericUpDownAdjustViaPercent.Value, null); - } - else if (adjustmentType == Configuration.Settings.Language.AdjustDisplayDuration.Recalculate) - { - sub.RecalculateDisplayTimes((double)numericUpDownMaxCharsSec.Value, null, (double)numericUpDownOptimalCharsSec.Value, checkBoxExtendOnly.Checked); - } - else if (adjustmentType == Configuration.Settings.Language.AdjustDisplayDuration.Fixed) - { - sub.SetFixedDuration(null, (double)numericUpDownFixedMilliseconds.Value); - } - else - { - sub.AdjustDisplayTimeUsingSeconds((double)numericUpDownSeconds.Value, null); - } - } - - var prev = sub.GetParagraphOrDefault(0); - var first = true; - foreach (var p in sub.Paragraphs) - { - if (IsActionEnabled(CommandLineConverter.BatchAction.RemoveTextForHI)) - { - _removeTextForHearingImpaired.Settings = _removeTextForHiSettings; - p.Text = _removeTextForHearingImpaired.RemoveTextFromHearImpaired(p.Text, sub, sub.Paragraphs.IndexOf(p)); - } - - if (IsActionEnabled(CommandLineConverter.BatchAction.RemoveFormatting)) - { - p.Text = HtmlUtil.RemoveHtmlTags(p.Text, true); - } - - if (!numericUpDownPercent.Value.Equals(100) && IsActionEnabled(CommandLineConverter.BatchAction.ChangeSpeed)) - { - var toSpeedPercentage = Convert.ToDouble(numericUpDownPercent.Value) / 100.0; - p.StartTime.TotalMilliseconds = p.StartTime.TotalMilliseconds * toSpeedPercentage; - p.EndTime.TotalMilliseconds = p.EndTime.TotalMilliseconds * toSpeedPercentage; - - if (first) - { - first = false; - } - else - { - if (prev.EndTime.TotalMilliseconds >= p.StartTime.TotalMilliseconds) - { - prev.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds - 1; - } - } - } - - prev = p; - } - - if (bluRaySubtitles == null || bluRaySubtitles.Count == 0) - { - sub.RemoveEmptyLines(); //TODO: only for image export? - } - - if (IsActionEnabled(CommandLineConverter.BatchAction.RedoCasing)) - { - _changeCasing.FixCasing(sub, LanguageAutoDetect.AutoDetectGoogleLanguage(sub)); - _changeCasingNames.Initialize(sub); - _changeCasingNames.FixCasing(); - } - - if (IsActionEnabled(CommandLineConverter.BatchAction.MergeShortLines)) - { - var mergedShortLinesSub = MergeShortLinesUtils.MergeShortLinesInSubtitle(sub, Configuration.Settings.Tools.MergeShortLinesMaxGap, Configuration.Settings.General.SubtitleLineMaximumLength, Configuration.Settings.Tools.MergeShortLinesOnlyContinuous); - if (mergedShortLinesSub.Paragraphs.Count != sub.Paragraphs.Count) - { - sub.Paragraphs.Clear(); - sub.Paragraphs.AddRange(mergedShortLinesSub.Paragraphs); - } - } - - if (IsActionEnabled(CommandLineConverter.BatchAction.RemoveLineBreaks)) - { - foreach (var paragraph in sub.Paragraphs) - { - paragraph.Text = Utilities.UnbreakLine(paragraph.Text); - } - } - - if (IsActionEnabled(CommandLineConverter.BatchAction.MergeSameTexts)) - { - var mergedSameTextsSub = MergeLinesSameTextUtils.MergeLinesWithSameTextInSubtitle(sub, true, 250); - if (mergedSameTextsSub.Paragraphs.Count != sub.Paragraphs.Count) - { - sub.Paragraphs.Clear(); - sub.Paragraphs.AddRange(mergedSameTextsSub.Paragraphs); - } - } - - if (IsActionEnabled(CommandLineConverter.BatchAction.MergeSameTimeCodes)) - { - var mergedSameTimeCodesSub = MergeLinesWithSameTimeCodes.Merge(sub, new List(), out _, true, false, 1000, "en", new List(), new Dictionary(), new Subtitle()); - if (mergedSameTimeCodesSub.Paragraphs.Count != sub.Paragraphs.Count) - { - sub.Paragraphs.Clear(); - sub.Paragraphs.AddRange(mergedSameTimeCodesSub.Paragraphs); - } - } - - if (IsActionEnabled(CommandLineConverter.BatchAction.ChangeFrameRate) && - double.TryParse(comboBoxFrameRateFrom.Text.Replace(',', '.').Replace(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, "."), NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var fromFrameRate) && - double.TryParse(comboBoxFrameRateTo.Text.Replace(',', '.').Replace(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, "."), NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var toFrameRate)) - { - sub.ChangeFrameRate(fromFrameRate, toFrameRate); - } - - if (IsActionEnabled(CommandLineConverter.BatchAction.OffsetTimeCodes) && timeUpDownAdjust.TimeCode.TotalMilliseconds > 0.00001) - { - var totalMilliseconds = timeUpDownAdjust.TimeCode.TotalMilliseconds; - if (radioButtonShowEarlier.Checked) - { - totalMilliseconds *= -1; - } - - sub.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(totalMilliseconds)); - } - - return sub; - } - - private void DeleteLines(Subtitle sub) - { - var skipFirst = (int)numericUpDownDeleteFirst.Value; - var skipLast = (int)numericUpDownDeleteLast.Value; - var deleteContains = textBoxDeleteContains.Text; - if (skipFirst == 0 && skipLast == 0 && string.IsNullOrWhiteSpace(deleteContains)) - { - return; - } - - var paragraphs = sub.Paragraphs.Skip(skipFirst).ToList(); - paragraphs = paragraphs.Take(paragraphs.Count - skipLast).ToList(); - if (!string.IsNullOrWhiteSpace(deleteContains)) - { - paragraphs = paragraphs.Where(p => !p.Text.Contains(deleteContains)).ToList(); - } - - sub.Paragraphs.Clear(); - sub.Paragraphs.AddRange(paragraphs); - sub.Renumber(); - } - - private void UpdateChangeCasingSettings() - { - if (radioButtonNormal.Checked) - { - Configuration.Settings.Tools.ChangeCasingChoice = "Normal"; - } - else if (radioButtonFixOnlyNames.Checked) - { - Configuration.Settings.Tools.ChangeCasingChoice = "NamesOnly"; - } - else if (radioButtonUppercase.Checked) - { - Configuration.Settings.Tools.ChangeCasingChoice = "Uppercase"; - } - else if (radioButtonLowercase.Checked) - { - Configuration.Settings.Tools.ChangeCasingChoice = "Lowercase"; - } - } - - private Dictionary _actionEnabledCache; - - private void UpdateActionEnabledCache() - { - _actionEnabledCache = new Dictionary(); - foreach (ListViewItem item in listViewConvertOptions.Items) - { - var fixItem = item.Tag as FixActionItem; - _actionEnabledCache.Add(fixItem.Action, item.Checked); - } - } - - private bool IsActionEnabled(CommandLineConverter.BatchAction action) - { - if (_actionEnabledCache != null) - { - return _actionEnabledCache[action]; - } - - foreach (ListViewItem item in listViewConvertOptions.Items) - { - if (item.Tag is FixActionItem fixItem && fixItem.Action == action) - { - return item.Checked; - } - } - return false; - } - - private BackgroundWorker SpawnWorker() - { - var worker = new BackgroundWorker(); - worker.DoWork += DoThreadWork; - worker.RunWorkerCompleted += ThreadWorkerCompleted; - return worker; - } - - /// - /// Text based functions requires text, so no image to image convert - /// - /// - private bool AllowImageToImage() - { - return !IsActionEnabled(CommandLineConverter.BatchAction.BalanceLines) && - !IsActionEnabled(CommandLineConverter.BatchAction.RedoCasing) && - !IsActionEnabled(CommandLineConverter.BatchAction.FixCommonErrors) && - !IsActionEnabled(CommandLineConverter.BatchAction.FixRtl) && - !IsActionEnabled(CommandLineConverter.BatchAction.MultipleReplace) && - !IsActionEnabled(CommandLineConverter.BatchAction.RemoveFormatting) && - !IsActionEnabled(CommandLineConverter.BatchAction.SplitLongLines) && - !IsActionEnabled(CommandLineConverter.BatchAction.RemoveTextForHI) && - !IsActionEnabled(CommandLineConverter.BatchAction.MergeSameTexts) && - !IsActionEnabled(CommandLineConverter.BatchAction.MergeSameTimeCodes) && - !IsActionEnabled(CommandLineConverter.BatchAction.MergeShortLines) && - !IsActionEnabled(CommandLineConverter.BatchAction.RemoveLineBreaks); - } - - internal static List LoadVobSubFromMatroska(MatroskaTrackInfo matroskaSubtitleInfo, MatroskaFile matroska, out Core.VobSub.Idx idx) - { - var mergedVobSubPacks = new List(); - if (matroskaSubtitleInfo.ContentEncodingType == 1) - { - idx = null; - return mergedVobSubPacks; - } - - var sub = matroska.GetSubtitle(matroskaSubtitleInfo.TrackNumber, null); - idx = new Core.VobSub.Idx(matroskaSubtitleInfo.GetCodecPrivate().SplitToLines()); - foreach (var p in sub) - { - mergedVobSubPacks.Add(new VobSubMergedPack(p.GetData(matroskaSubtitleInfo), TimeSpan.FromMilliseconds(p.Start), 32, null)); - if (mergedVobSubPacks.Count > 0) - { - mergedVobSubPacks[mergedVobSubPacks.Count - 1].EndTime = TimeSpan.FromMilliseconds(p.End); - } - - // fix overlapping (some versions of Handbrake makes overlapping time codes - thx Hawke) - if (mergedVobSubPacks.Count > 1 && mergedVobSubPacks[mergedVobSubPacks.Count - 2].EndTime > mergedVobSubPacks[mergedVobSubPacks.Count - 1].StartTime) - { - mergedVobSubPacks[mergedVobSubPacks.Count - 2].EndTime = TimeSpan.FromMilliseconds(mergedVobSubPacks[mergedVobSubPacks.Count - 1].StartTime.TotalMilliseconds - 1); - } - } - return mergedVobSubPacks; - } - - internal static List LoadBluRaySupFromMatroska(MatroskaTrackInfo track, MatroskaFile matroska, IntPtr handle) - { - if (track.ContentEncodingType == 1) - { - return new List(); - } - - var sub = matroska.GetSubtitle(track.TrackNumber, null); - TaskbarList.SetProgressState(handle, TaskbarButtonProgressFlags.NoProgress); - var subtitles = new List(); - var log = new StringBuilder(); - var clusterStream = new MemoryStream(); - var lastPalettes = new Dictionary>(); - var lastBitmapObjects = new Dictionary>(); - foreach (var p in sub) - { - byte[] buffer = p.GetData(track); - if (buffer != null && buffer.Length > 2) - { - clusterStream.Write(buffer, 0, buffer.Length); - if (ContainsBluRayStartSegment(buffer)) - { - if (subtitles.Count > 0 && subtitles[subtitles.Count - 1].StartTime == subtitles[subtitles.Count - 1].EndTime) - { - subtitles[subtitles.Count - 1].EndTime = (long)((p.Start - 1) * 90.0); - } - clusterStream.Position = 0; - var list = BluRaySupParser.ParseBluRaySup(clusterStream, log, true, lastPalettes, lastBitmapObjects); - foreach (var sup in list) - { - sup.StartTime = (long)((p.Start - 1) * 90.0); - sup.EndTime = (long)((p.End - 1) * 90.0); - subtitles.Add(sup); - - // fix overlapping - if (subtitles.Count > 1 && sub[subtitles.Count - 2].End > sub[subtitles.Count - 1].Start) - { - subtitles[subtitles.Count - 2].EndTime = subtitles[subtitles.Count - 1].StartTime - 1; - } - } - clusterStream = new MemoryStream(); - } - } - else if (subtitles.Count > 0) - { - var lastSub = subtitles[subtitles.Count - 1]; - if (lastSub.StartTime == lastSub.EndTime) - { - lastSub.EndTime = (long)((p.Start - 1) * 90.0); - if (lastSub.EndTime - lastSub.StartTime > 1000000) - { - lastSub.EndTime = lastSub.StartTime; - } - } - } - } - - clusterStream.Dispose(); - return subtitles; - } - - private static bool ContainsBluRayStartSegment(byte[] buffer) - { - const int epochStart = 0x80; - var position = 0; - while (position + 3 <= buffer.Length) - { - var segmentType = buffer[position]; - if (segmentType == epochStart) - { - return true; - } - - int length = BluRaySupParser.BigEndianInt16(buffer, position + 1) + 3; - position += length; - } - return false; - } - - private bool CheckSkipFilter(string fileName, SubtitleFormat format, Subtitle sub) - { - bool skip = false; - if (comboBoxFilter.SelectedIndex == 1) - { - if (format != null && format.GetType() == typeof(SubRip) && FileUtil.HasUtf8Bom(fileName)) - { - skip = true; - } - } - else if (comboBoxFilter.SelectedIndex == 2) - { - skip = true; - foreach (Paragraph p in sub.Paragraphs) - { - if (p.Text != null && Utilities.GetNumberOfLines(p.Text) > 2) - { - skip = false; - break; - } - } - } - else if (comboBoxFilter.SelectedIndex == 3 && !string.IsNullOrWhiteSpace(textBoxFilter.Text)) - { - skip = true; - foreach (Paragraph p in sub.Paragraphs) - { - if (p.Text != null && p.Text.Contains(textBoxFilter.Text, StringComparison.Ordinal)) - { - skip = false; - break; - } - } - } - return skip; - } - - private void IncrementAndShowProgress() - { - if (progressBar1.Value < progressBar1.Maximum) - { - progressBar1.Value++; - } - else - { - progressBar1.Value = progressBar1.Maximum; - } - progressBar1.Refresh(); - - TaskbarList.SetProgressValue(Handle, progressBar1.Value, progressBar1.Maximum); - labelStatus.Text = progressBar1.Value + " / " + progressBar1.Maximum; - if (progressBar1.Value == progressBar1.Maximum) - { - labelStatus.Text = string.Empty; - } - - Application.DoEvents(); - } - - private static void DoThreadWork(object sender, DoWorkEventArgs e) - { - var p = (ThreadDoWorkParameter)e.Argument; - var mode = Configuration.Settings.Tools.BatchConvertFixRtlMode; - - ApplyFixesStep2(p, mode); - - e.Result = p; - } - - private static void ApplyFixesStep2(ThreadDoWorkParameter p, string mode) - { - if (p.FixRtl && mode == RemoveUnicode) - { - for (int i = 0; i < p.Subtitle.Paragraphs.Count; i++) - { - var paragraph = p.Subtitle.Paragraphs[i]; - paragraph.Text = Utilities.RemoveUnicodeControlChars(paragraph.Text); - } - } - - if (p.FixCommonErrors) - { - try - { - using (var fixCommonErrors = new FixCommonErrors { BatchMode = true }) - { - var l = Configuration.Settings.Tools.BatchConvertLanguage; - if (string.IsNullOrEmpty(l)) - { - l = LanguageAutoDetect.AutoDetectGoogleLanguage(p.Subtitle); - } - - for (int i = 0; i < 3; i++) - { - fixCommonErrors.RunBatch(p.Subtitle, p.Format, p.Encoding.Encoding, l); - p.Subtitle = fixCommonErrors.FixedSubtitle; - } - } - } - catch (Exception exception) - { - p.Error = string.Format(Configuration.Settings.Language.BatchConvert.FixCommonErrorsErrorX, exception.Message); - } - } - - if (p.MultipleReplaceActive) - { - try - { - using (var form = new MultipleReplace()) - { - form.RunFromBatch(p.Subtitle); - p.Subtitle = form.FixedSubtitle; - p.Subtitle.RemoveParagraphsByIndices(form.DeleteIndices); - } - } - catch (Exception exception) - { - p.Error = string.Format(Configuration.Settings.Language.BatchConvert.MultipleReplaceErrorX, exception.Message); - } - } - - if (p.SplitLongLinesActive) - { - try - { - p.Subtitle = SplitLongLinesHelper.SplitLongLinesInSubtitle(p.Subtitle, Configuration.Settings.General.SubtitleLineMaximumLength * 2, Configuration.Settings.General.SubtitleLineMaximumLength); - } - catch (Exception exception) - { - p.Error = string.Format(Configuration.Settings.Language.BatchConvert.AutoBalanceErrorX, exception.Message); - } - } - - if (p.AutoBalanceActive) - { - try - { - var l = LanguageAutoDetect.AutoDetectGoogleLanguageOrNull(p.Subtitle); - foreach (var paragraph in p.Subtitle.Paragraphs) - { - paragraph.Text = Utilities.AutoBreakLine(paragraph.Text, l ?? p.Language); - } - } - catch (Exception exception) - { - p.Error = string.Format(Configuration.Settings.Language.BatchConvert.AutoBalanceErrorX, exception.Message); - } - } - - if (p.SetMinDisplayTimeBetweenSubtitles) - { - double minimumMillisecondsBetweenLines = Configuration.Settings.General.MinimumMillisecondsBetweenLines; - for (int i = 0; i < p.Subtitle.Paragraphs.Count - 1; i++) - { - var current = p.Subtitle.GetParagraphOrDefault(i); - var next = p.Subtitle.GetParagraphOrDefault(i + 1); - var gapsBetween = next.StartTime.TotalMilliseconds - current.EndTime.TotalMilliseconds; - if (gapsBetween < minimumMillisecondsBetweenLines && current.Duration.TotalMilliseconds > minimumMillisecondsBetweenLines) - { - current.EndTime.TotalMilliseconds -= (minimumMillisecondsBetweenLines - gapsBetween); - } - } - } - - if (p.FixRtl && mode == ReverseStartEnd) - { - for (int i = 0; i < p.Subtitle.Paragraphs.Count; i++) - { - var paragraph = p.Subtitle.Paragraphs[i]; - paragraph.Text = Utilities.ReverseStartAndEndingForRightToLeft(paragraph.Text); - } - } - else if (p.FixRtl && mode == AddUnicode) // fix with unicode char - { - for (int i = 0; i < p.Subtitle.Paragraphs.Count; i++) - { - var paragraph = p.Subtitle.Paragraphs[i]; - paragraph.Text = Utilities.FixRtlViaUnicodeChars(paragraph.Text); - } - } - - // always re-number - p.Subtitle.Renumber(); - } - - private void ThreadWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) - { - CommandLineConverter.BatchConvertProgress progressCallback = null; - var p = (ThreadDoWorkParameter)e.Result; - if (p.Item.Index + 2 < listViewInputFiles.Items.Count) - { - listViewInputFiles.EnsureVisible(p.Item.Index + 2); - } - else - { - listViewInputFiles.EnsureVisible(p.Item.Index); - } - - if (!string.IsNullOrEmpty(p.Error)) - { - p.Item.SubItems[3].Text = p.Error; - } - else - { - if (p.SourceFormat == null) - { - var ext = Path.GetExtension(p.FileName); - if (ext != null && - (ext.Equals(".ts", StringComparison.OrdinalIgnoreCase) || - ext.Equals(".m2ts", StringComparison.OrdinalIgnoreCase) || - ext.Equals(".mts", StringComparison.OrdinalIgnoreCase) || - ext.Equals(".mpg", StringComparison.OrdinalIgnoreCase) || - ext.Equals(".mpeg", StringComparison.OrdinalIgnoreCase)) && - (FileUtil.IsTransportStream(p.FileName) || FileUtil.IsM2TransportStream(p.FileName))) - { - IncrementAndShowProgress(); - return; - } - - p.SourceFormat = new SubRip(); - } - - if (p.ToFormat == Ebu.NameOfFormat) - { - p.Subtitle.Header = _ebuGeneralInformation.ToString(); - } - - var targetFormat = p.ToFormat; - if (targetFormat == Configuration.Settings.Language.ExportCustomText.Title) - { - targetFormat = "CustomText:" + _customTextTemplate; - } - - try - { - var binaryParagraphs = new List(); - if (p.FileName != null && !p.Subtitle.Paragraphs.Any(s => !string.IsNullOrEmpty(s.Text)) && - p.FileName.EndsWith(".sup", StringComparison.OrdinalIgnoreCase) && - FileUtil.IsBluRaySup(p.FileName) && AllowImageToImage()) - { - binaryParagraphs = BluRaySupParser.ParseBluRaySup(p.FileName, new StringBuilder()).Cast().ToList(); - } - else if (p.FileName != null && _bdLookup.ContainsKey(p.FileName)) - { - binaryParagraphs = _bdLookup[p.FileName].Cast().ToList(); - } - var dir = textBoxOutputFolder.Text; - var overwrite = checkBoxOverwrite.Checked; - if (radioButtonSaveInSourceFolder.Checked) - { - dir = Path.GetDirectoryName(p.FileName); - } - var success = CommandLineConverter.BatchConvertSave(targetFormat, TimeSpan.Zero, GetCurrentEncoding(p.FileName), dir, _count, ref _converted, ref _errors, _allFormats, p.FileName, p.Subtitle, p.SourceFormat, binaryParagraphs, overwrite, -1, null, null, null, null, false, progressCallback); - if (success) - { - p.Item.SubItems[3].Text = Configuration.Settings.Language.BatchConvert.Converted; - } - else - { - p.Item.SubItems[3].Text = Configuration.Settings.Language.BatchConvert.NotConverted + " " + p.Item.SubItems[3].Text.Trim('-').Trim(); - } - } - catch (Exception exception) - { - p.Error = $"Save: {exception.InnerException?.Message ?? exception.Message}"; - p.Item.SubItems[3].Text = p.Error; - } - - IncrementAndShowProgress(); - } - } - - private void ComboBoxSubtitleFormatsSelectedIndexChanged(object sender, EventArgs e) - { - checkBoxUseStyleFromSource.Visible = false; - if (comboBoxSubtitleFormats.Text == AdvancedSubStationAlpha.NameOfFormat || comboBoxSubtitleFormats.Text == SubStationAlpha.NameOfFormat) - { - buttonStyles.Text = Configuration.Settings.Language.BatchConvert.Style; - buttonStyles.Visible = true; - comboBoxEncoding.Enabled = true; - buttonBrowseEncoding.Visible = true; - checkBoxUseStyleFromSource.Visible = true; - checkBoxUseStyleFromSource.Left = buttonStyles.Left + buttonStyles.Width - checkBoxUseStyleFromSource.Width; - } - else if (comboBoxSubtitleFormats.Text == Ebu.NameOfFormat) - { - buttonStyles.Text = Configuration.Settings.Language.BatchConvert.Settings; - buttonStyles.Visible = true; - if (_ebuGeneralInformation == null) - { - _ebuGeneralInformation = new Ebu.EbuGeneralSubtitleInformation(); - } - - comboBoxEncoding.Enabled = true; - buttonBrowseEncoding.Visible = true; - } - else if (comboBoxSubtitleFormats.Text == BluRaySubtitle || - comboBoxSubtitleFormats.Text == VobSubSubtitle || - comboBoxSubtitleFormats.Text == DostImageSubtitle || - comboBoxSubtitleFormats.Text == BdnXmlSubtitle || - comboBoxSubtitleFormats.Text == FcpImageSubtitle || - comboBoxSubtitleFormats.Text == Configuration.Settings.Language.ExportCustomText.Title) - { - buttonStyles.Text = Configuration.Settings.Language.BatchConvert.Settings; - buttonStyles.Visible = true; - comboBoxEncoding.Enabled = false; - buttonBrowseEncoding.Visible = false; - } - else if (comboBoxSubtitleFormats.Text == Configuration.Settings.Language.BatchConvert.PlainText) - { - buttonStyles.Text = Configuration.Settings.Language.BatchConvert.Settings; - buttonStyles.Visible = true; - comboBoxEncoding.Enabled = true; - buttonBrowseEncoding.Visible = true; - } - else - { - buttonStyles.Visible = false; - comboBoxEncoding.Enabled = true; - buttonBrowseEncoding.Visible = true; - } - } - - private void ButtonStylesClick(object sender, EventArgs e) - { - if (comboBoxSubtitleFormats.Text == AdvancedSubStationAlpha.NameOfFormat || comboBoxSubtitleFormats.Text == SubStationAlpha.NameOfFormat) - { - ShowAssSsaStyles(); - } - else if (comboBoxSubtitleFormats.Text == Ebu.NameOfFormat) - { - ShowEbuSettings(); - } - else if (comboBoxSubtitleFormats.Text == BluRaySubtitle) - { - ImageExportSettings(ExportPngXml.ExportFormats.BluraySup); - } - else if (comboBoxSubtitleFormats.Text == VobSubSubtitle) - { - ImageExportSettings(ExportPngXml.ExportFormats.VobSub); - } - else if (comboBoxSubtitleFormats.Text == DostImageSubtitle) - { - ImageExportSettings(ExportPngXml.ExportFormats.Dost); - } - else if (comboBoxSubtitleFormats.Text == BdnXmlSubtitle) - { - ImageExportSettings(ExportPngXml.ExportFormats.BdnXml); - } - else if (comboBoxSubtitleFormats.Text == FcpImageSubtitle) - { - ImageExportSettings(ExportPngXml.ExportFormats.Fcp); - } - else if (comboBoxSubtitleFormats.Text == Configuration.Settings.Language.BatchConvert.PlainText) - { - using (var form = new ExportText()) - { - var s = new Subtitle(); - s.Paragraphs.Add(new Paragraph("Test 123." + Environment.NewLine + "Test 456.", 0, 4000)); - s.Paragraphs.Add(new Paragraph("Test 789.", 5000, 9000)); - form.Initialize(s, null); - form.PrepareForBatchSettings(); - form.ShowDialog(this); - } - } - else if (comboBoxSubtitleFormats.Text == Configuration.Settings.Language.ExportCustomText.Title) - { - ShowExportCustomTextSettings(); - } - } - - private void ShowExportCustomTextSettings() - { - var s = new Subtitle(); - s.Paragraphs.Add(new Paragraph("Test 123." + Environment.NewLine + "Test 456.", 0, 4000)); - s.Paragraphs.Add(new Paragraph("Test 777." + Environment.NewLine + "Test 888.", 0, 4000)); - using (var properties = new ExportCustomText(s, null, "Test")) - { - properties.InitializeForBatchConvert(_customTextTemplate); - if (properties.ShowDialog(this) == DialogResult.OK) - { - _customTextTemplate = properties.CurrentFormatName; - } - } - } - - private void ImageExportSettings(string format) - { - using (var properties = new ExportPngXml()) - { - var s = new Subtitle(); - s.Paragraphs.Add(new Paragraph("Test 123." + Environment.NewLine + "Test 456.", 0, 4000)); - properties.Initialize(s, new SubRip(), format, null, null, null); - properties.DisableSaveButtonAndCheckBoxes(); - properties.ShowDialog(this); - } - } - - private void ShowEbuSettings() - { - using (var properties = new EbuSaveOptions()) - { - properties.Initialize(_ebuGeneralInformation, 0, null, null); - properties.ShowDialog(this); - } - } - - private void ShowAssSsaStyles() - { - SubStationAlphaStylesBatchConvert form = null; - try - { - var assa = new AdvancedSubStationAlpha(); - var sub = new Subtitle(); - if (comboBoxSubtitleFormats.Text == assa.Name) - { - if (!string.IsNullOrEmpty(_assStyle)) - { - sub.Header = _assStyle; - } - form = new SubStationAlphaStylesBatchConvert(sub, assa); - if (form.ShowDialog(this) == DialogResult.OK) - { - _assStyle = form.Header; - } - } - else - { - if (!string.IsNullOrEmpty(_ssaStyle)) - { - sub.Header = _ssaStyle; - } - var ssa = new SubStationAlpha(); - if (comboBoxSubtitleFormats.Text == ssa.Name) - { - form = new SubStationAlphaStylesBatchConvert(sub, ssa); - if (form.ShowDialog(this) == DialogResult.OK) - { - _ssaStyle = form.Header; - } - } - } - } - finally - { - form?.Dispose(); - } - } - - private void ContextMenuStripFilesOpening(object sender, CancelEventArgs e) - { - if (_converting) - { - e.Cancel = true; - return; - } - removeToolStripMenuItem.Visible = listViewInputFiles.SelectedItems.Count > 0; - openContainingFolderToolStripMenuItem.Visible = listViewInputFiles.SelectedItems.Count == 1; - removeAllToolStripMenuItem.Visible = listViewInputFiles.Items.Count > 0; - toolStripSeparator1.Visible = listViewInputFiles.Items.Count > 0; - } - - private void RemoveAllToolStripMenuItemClick(object sender, EventArgs e) - { - listViewInputFiles.Items.Clear(); - UpdateNumberOfFiles(); - UpdateTransportStreamSettings(); - } - - private void RemoveSelectedFiles() - { - if (_converting) - { - return; - } - - int first = -1; - for (int i = listViewInputFiles.SelectedIndices.Count - 1; i >= 0; i--) - { - if (first < 0) - { - first = listViewInputFiles.SelectedIndices[i]; - } - listViewInputFiles.Items.RemoveAt(listViewInputFiles.SelectedIndices[i]); - } - - // keep an item selected/focused for improved UX - if (first < listViewInputFiles.Items.Count && listViewInputFiles.Items.Count > 0) - { - listViewInputFiles.Items[first].Selected = true; - listViewInputFiles.FocusedItem = listViewInputFiles.Items[first]; - } - else if (listViewInputFiles.Items.Count > 0) - { - listViewInputFiles.Items[listViewInputFiles.Items.Count - 1].Selected = true; - listViewInputFiles.FocusedItem = listViewInputFiles.Items[listViewInputFiles.Items.Count - 1]; - } - UpdateNumberOfFiles(); - UpdateTransportStreamSettings(); - } - - private void RemoveToolStripMenuItemClick(object sender, EventArgs e) - { - RemoveSelectedFiles(); - } - - private void UpdateTransportStreamSettings() - { - bool hasTransportStream = false; - foreach (ListViewItem lvi in listViewInputFiles.Items) - { - if (lvi.SubItems[2].Text.Equals("Transport Stream", StringComparison.OrdinalIgnoreCase)) - { - hasTransportStream = true; - break; - } - } - - buttonTransportStreamSettings.Visible = hasTransportStream; - } - - private void ListViewInputFilesKeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Delete) - { - RemoveSelectedFiles(); - } - else if (e.KeyCode == Keys.A && e.Modifiers == Keys.Control) - { - listViewInputFiles.SelectAll(); - e.SuppressKeyPress = true; - } - else if (e.KeyCode == Keys.D && e.Modifiers == Keys.Control) - { - listViewInputFiles.SelectFirstSelectedItemOnly(); - e.SuppressKeyPress = true; - } - else if (e.KeyCode == Keys.I && e.Modifiers == (Keys.Control | Keys.Shift)) //InverseSelection - { - listViewInputFiles.InverseSelection(); - e.SuppressKeyPress = true; - } - } - - private void BatchConvert_FormClosing(object sender, FormClosingEventArgs e) - { - if (_converting) - { - e.Cancel = true; - return; - } - if (_searching) - { - _abort = true; - } - - Configuration.Settings.Tools.BatchConvertFixCasing = IsActionEnabled(CommandLineConverter.BatchAction.RedoCasing); - Configuration.Settings.Tools.BatchConvertFixCommonErrors = IsActionEnabled(CommandLineConverter.BatchAction.FixCommonErrors); - Configuration.Settings.Tools.BatchConvertMultipleReplace = IsActionEnabled(CommandLineConverter.BatchAction.MultipleReplace); - Configuration.Settings.Tools.BatchConvertFixRtl = IsActionEnabled(CommandLineConverter.BatchAction.FixRtl); - Configuration.Settings.Tools.BatchConvertSplitLongLines = IsActionEnabled(CommandLineConverter.BatchAction.SplitLongLines); - Configuration.Settings.Tools.BatchConvertAutoBalance = IsActionEnabled(CommandLineConverter.BatchAction.BalanceLines); - Configuration.Settings.Tools.BatchConvertRemoveFormatting = IsActionEnabled(CommandLineConverter.BatchAction.RemoveFormatting); - Configuration.Settings.Tools.BatchConvertBridgeGaps = IsActionEnabled(CommandLineConverter.BatchAction.BridgeGaps); - Configuration.Settings.Tools.BatchConvertRemoveTextForHI = IsActionEnabled(CommandLineConverter.BatchAction.RemoveTextForHI); - Configuration.Settings.Tools.BatchConvertSetMinDisplayTimeBetweenSubtitles = IsActionEnabled(CommandLineConverter.BatchAction.SetMinGap); - Configuration.Settings.Tools.BatchConvertOutputFolder = textBoxOutputFolder.Text; - Configuration.Settings.Tools.BatchConvertOverwriteExisting = checkBoxOverwrite.Checked; - Configuration.Settings.Tools.BatchConvertFormat = comboBoxSubtitleFormats.SelectedItem.ToString(); - Configuration.Settings.Tools.BatchConvertAssStyles = _assStyle; - Configuration.Settings.Tools.BatchConvertSsaStyles = _ssaStyle; - Configuration.Settings.Tools.BatchConvertUseStyleFromSource = checkBoxUseStyleFromSource.Checked; - Configuration.Settings.Tools.BatchConvertExportCustomTextTemplate = _customTextTemplate; - Configuration.Settings.Tools.BatchConvertSaveInSourceFolder = radioButtonSaveInSourceFolder.Checked; - Configuration.Settings.Tools.BatchConvertMergeShortLines = IsActionEnabled(CommandLineConverter.BatchAction.MergeShortLines); - Configuration.Settings.Tools.BatchConvertRemoveLineBreaks = IsActionEnabled(CommandLineConverter.BatchAction.RemoveLineBreaks); - Configuration.Settings.Tools.BatchConvertMergeSameText = IsActionEnabled(CommandLineConverter.BatchAction.MergeSameTexts); - Configuration.Settings.Tools.BatchConvertMergeSameTimeCodes = IsActionEnabled(CommandLineConverter.BatchAction.MergeSameTimeCodes); - Configuration.Settings.Tools.BatchConvertChangeSpeed = IsActionEnabled(CommandLineConverter.BatchAction.ChangeSpeed); - Configuration.Settings.Tools.BatchConvertChangeFrameRate = IsActionEnabled(CommandLineConverter.BatchAction.ChangeFrameRate); - Configuration.Settings.Tools.BatchConvertOffsetTimeCodes = IsActionEnabled(CommandLineConverter.BatchAction.OffsetTimeCodes); - Configuration.Settings.Tools.BatchConvertApplyDurationLimits = IsActionEnabled(CommandLineConverter.BatchAction.ApplyDurationLimits); - Configuration.Settings.Tools.MergeShortLinesMaxGap = (int)numericUpDownMaxMillisecondsBetweenLines.Value; - Configuration.Settings.Tools.MergeShortLinesOnlyContinuous = checkBoxOnlyContinuationLines.Checked; - - UpdateRtlSettings(); - } - - private void UpdateRtlSettings() - { - if (radioButtonRemoveUnicode.Checked) - { - Configuration.Settings.Tools.BatchConvertFixRtlMode = RemoveUnicode; - } - else if (radioButtonReverseStartEnd.Checked) - { - Configuration.Settings.Tools.BatchConvertFixRtlMode = ReverseStartEnd; - } - else - { - Configuration.Settings.Tools.BatchConvertFixRtlMode = AddUnicode; - } - } - - private string _rootFolder; - private void buttonSearchFolder_Click(object sender, EventArgs e) - { - folderBrowserDialog1.ShowNewFolderButton = false; - folderBrowserDialog1.SelectedPath = _rootFolder; - if (folderBrowserDialog1.ShowDialog(this) == DialogResult.OK) - { - listViewInputFiles.BeginUpdate(); - progressBar1.Style = ProgressBarStyle.Marquee; - progressBar1.Visible = true; - SetControlState(false); - labelStatus.Text = string.Empty; - - SearchFolder(folderBrowserDialog1.SelectedPath); - _rootFolder = folderBrowserDialog1.SelectedPath; - - labelStatus.Text = string.Empty; - - SetControlState(true); - listViewInputFiles.EndUpdate(); - } - progressBar1.Value = 0; - progressBar1.Visible = false; - UpdateNumberOfFiles(); - } - - private void SetControlState(bool enabled) - { - labelStatus.Text = string.Empty; - buttonCancel.Enabled = enabled; - groupBoxOutput.Enabled = enabled; - groupBoxConvertOptions.Enabled = enabled; - buttonInputBrowse.Enabled = enabled; - buttonSearchFolder.Enabled = enabled; - checkBoxScanFolderRecursive.Enabled = enabled; - comboBoxFilter.Enabled = enabled; - - if (enabled) - { - buttonConvert.Text = Configuration.Settings.Language.BatchConvert.Convert; - } - else - { - buttonConvert.Text = Configuration.Settings.Language.General.Cancel; - } - } - - private void SearchFolder(string path) - { - _abort = false; - _searching = true; - try - { - if (checkBoxScanFolderRecursive.Checked) - { - ScanFiles(Directory.EnumerateFiles(path, "*", SearchOption.AllDirectories)); - } - else - { - ScanFiles(Directory.EnumerateFiles(path)); - } - } - finally - { - _searching = false; - } - } - - private static readonly HashSet SearchExtBlackList = new HashSet - { - ".png", - ".jpg", - ".jpeg", - ".tif", - ".tiff", - ".gif", - ".bmp", - ".clpi", - ".mpls", - ".wav", - ".mp3", - ".avi", - ".mpeg", - ".mpg", - ".tar", - ".docx", - ".pptx", - ".xlsx", - ".odt", - ".tex", - ".pdf", - ".dll", - ".exe", - ".rar", - ".7z", - ".zip", - ".tar" - }; - - private void ScanFiles(IEnumerable fileNames) - { - foreach (string fileName in fileNames) - { - labelStatus.Text = fileName; - try - { - string ext = Path.GetExtension(fileName).ToLowerInvariant(); - if (!SearchExtBlackList.Contains(ext)) - { - labelStatus.Refresh(); - var fi = new FileInfo(fileName); - if (comboBoxFilter.SelectedIndex == 4 && textBoxFilter.Text.Length > 0 && !fileName.Contains(textBoxFilter.Text, StringComparison.OrdinalIgnoreCase)) - { - // skip - } - else if (ext == ".sub" && FileUtil.IsVobSub(fileName)) - { - AddFromSearch(fileName, fi, "VobSub"); - } - else if (ext == ".sup" && FileUtil.IsBluRaySup(fileName)) - { - AddFromSearch(fileName, fi, "Blu-ray"); - } - else if (ext == ".mkv") - { - // skip for now - } - else if (ext == ".mks") - { - // skip for now - } - else if (ext == ".mp4") - { - // skip for now - } - else - { - if (fi.Length < ConvertMaxFileSize) - { - var sub = new Subtitle(); - var enc = LanguageAutoDetect.GetEncodingFromFile(fileName, true); - var format = sub.LoadSubtitle(fileName, out _, enc, true, null, false); - if (format == null) - { - foreach (var f in SubtitleFormat.GetBinaryFormats(true)) - { - if (f.IsMine(null, fileName)) - { - f.LoadSubtitle(sub, null, fileName); - format = f; - break; - } - } - } - - if (format == null) - { - var lines = FileUtil.ReadAllTextShared(fileName, enc).SplitToLines(); - foreach (var f in SubtitleFormat.GetTextOtherFormats()) - { - if (f.IsMine(lines, fileName)) - { - f.LoadSubtitle(sub, lines, fileName); - format = f; - break; - } - } - } - - if (format != null) - { - AddFromSearch(fileName, fi, format.Name); - } - } - } - progressBar1.Refresh(); - Application.DoEvents(); - if (_abort) - { - progressBar1.Value = 0; - progressBar1.Visible = false; - return; - } - } - } - catch - { - // ignored - } - } - } - - private void AddFromSearch(string fileName, FileInfo fi, string nameOfFormat) - { - var item = new ListViewItem(fileName); - item.SubItems.Add(Utilities.FormatBytesToDisplayFileSize(fi.Length)); - item.SubItems.Add(nameOfFormat); - item.SubItems.Add("-"); - listViewInputFiles.Items.Add(item); - UpdateNumberOfFiles(); - } - - private void BatchConvert_KeyDown(object sender, KeyEventArgs e) - { - if (_converting || _searching) - { - if (e.KeyCode == Keys.Escape) - { - _abort = true; - e.SuppressKeyPress = true; - } - } - else if (e.KeyCode == Keys.Escape) - { - Close(); - } - else if (e.KeyData == (Keys.Control | Keys.O)) // Open file/s - { - buttonInputBrowse_Click(null, EventArgs.Empty); - } - } - - private void comboBoxFilter_SelectedIndexChanged(object sender, EventArgs e) - { - textBoxFilter.Visible = comboBoxFilter.SelectedIndex == 3 || comboBoxFilter.SelectedIndex == 4 || comboBoxFilter.SelectedIndex == 5; - } - - private void buttonTransportStreamSettings_Click(object sender, EventArgs e) - { - using (var form = new BatchConvertTsSettings()) - { - form.ShowDialog(this); - } - } - - private void radioButtonSaveInSourceFolder_CheckedChanged(object sender, EventArgs e) - { - textBoxOutputFolder.Enabled = false; - buttonChooseFolder.Enabled = false; - } - - private void radioButtonSaveInOutputFolder_CheckedChanged(object sender, EventArgs e) - { - textBoxOutputFolder.Enabled = true; - buttonChooseFolder.Enabled = true; - } - - private void linkLabelOpenOutputFolder_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) - { - if (Directory.Exists(textBoxOutputFolder.Text)) - { - UiUtil.OpenFolder(textBoxOutputFolder.Text); - } - else - { - MessageBox.Show(string.Format(Configuration.Settings.Language.SplitSubtitle.FolderNotFoundX, textBoxOutputFolder.Text)); - } - } - - private void buttonChooseFolder_Click(object sender, EventArgs e) - { - folderBrowserDialog1.ShowNewFolderButton = true; - if (folderBrowserDialog1.ShowDialog() == DialogResult.OK) - { - textBoxOutputFolder.Text = folderBrowserDialog1.SelectedPath; - } - } - - private void listViewConvertOptions_SelectedIndexChanged(object sender, EventArgs e) - { - groupBoxMergeShortLines.Visible = false; - groupBoxChangeFrameRate.Visible = false; - groupBoxSpeed.Visible = false; - groupBoxOffsetTimeCodes.Visible = false; - buttonConvertOptionsSettings.Visible = false; - groupBoxFixRtl.Visible = false; - groupBoxChangeCasing.Visible = false; - groupBoxRemoveStyle.Visible = false; - groupBoxAdjustDuration.Visible = false; - if (listViewConvertOptions.SelectedIndices.Count != 1) - { - return; - } - - var idx = listViewConvertOptions.SelectedIndices[0]; - var fixItem = listViewConvertOptions.Items[idx].Tag as FixActionItem; - if (fixItem?.Control != null) - { - fixItem.Control.Top = listViewConvertOptions.Top; - fixItem.Control.Visible = true; - fixItem.Control.BringToFront(); - if (fixItem.Control is GroupBox groupBox) - { - groupBox.Height = listViewConvertOptions.Height; - } - } - } - - private void ButtonOptionConvertSettings(object sender, EventArgs e) - { - if (listViewConvertOptions.SelectedIndices.Count != 1) - { - return; - } - var idx = listViewConvertOptions.SelectedIndices[0]; - var fixItem = listViewConvertOptions.Items[idx].Tag as FixActionItem; - if (fixItem.Action == CommandLineConverter.BatchAction.RemoveTextForHI) - { - using (var form = new FormRemoveTextForHearImpaired(null, new Subtitle())) - { - form.InitializeSettingsOnly(); - form.ShowDialog(this); - _removeTextForHiSettings = form.GetSettings(new Subtitle()); - } - } - else if (fixItem.Action == CommandLineConverter.BatchAction.FixCommonErrors) - { - using (var form = new FixCommonErrors { BatchMode = true }) - { - form.RunBatchSettings(new Subtitle(), GetCurrentSubtitleFormat(), GetCurrentEncoding(null), Configuration.Settings.Tools.BatchConvertLanguage); - form.ShowDialog(this); - Configuration.Settings.Tools.BatchConvertLanguage = form.Language; - } - } - else if (fixItem.Action == CommandLineConverter.BatchAction.BridgeGaps) - { - _bridgeGaps.ShowDialog(this); - } - else if (fixItem.Action == CommandLineConverter.BatchAction.MultipleReplace) - { - using (var form = new MultipleReplace()) - { - form.Initialize(new Subtitle()); - form.ShowDialog(this); - } - } - } - - private void buttonSwapFrameRate_Click(object sender, EventArgs e) - { - string oldFrameRate = comboBoxFrameRateFrom.Text; - string newFrameRate = comboBoxFrameRateTo.Text; - - comboBoxFrameRateFrom.Text = newFrameRate; - comboBoxFrameRateTo.Text = oldFrameRate; - } - - private void listViewConvertOptions_ItemChecked(object sender, ItemCheckedEventArgs e) - { - var count = listViewConvertOptions.CheckedItems.Count; - if (count > 0) - { - groupBoxConvertOptions.Text = Configuration.Settings.Language.BatchConvert.ConvertOptions + " " + count; - } - else - { - groupBoxConvertOptions.Text = Configuration.Settings.Language.BatchConvert.ConvertOptions; - } - } - - private void toolStripMenuItemSelectAll_Click(object sender, EventArgs e) - { - foreach (ListViewItem item in listViewConvertOptions.Items) - { - item.Checked = true; - } - } - - private void inverseSelectionToolStripMenuItem_Click(object sender, EventArgs e) - { - foreach (ListViewItem item in listViewConvertOptions.Items) - { - item.Checked = !item.Checked; - } - } - - private void listViewInputFiles_ColumnClick(object sender, ColumnClickEventArgs e) - { - if (_converting) - { - return; - } - - var sorter = (ListViewSorter)listViewInputFiles.ListViewItemSorter; - if (sorter == null) - { - sorter = new ListViewSorter - { - ColumnNumber = e.Column, - IsNumber = false, - IsDisplayFileSize = e.Column == columnHeaderSize.DisplayIndex - }; - listViewInputFiles.ListViewItemSorter = sorter; - } - - if (e.Column == sorter.ColumnNumber) - { - sorter.Descending = !sorter.Descending; // inverse sort direction - } - else - { - sorter.ColumnNumber = e.Column; - sorter.Descending = false; - sorter.IsNumber = false; - sorter.IsDisplayFileSize = e.Column == columnHeaderSize.DisplayIndex; - } - listViewInputFiles.Sort(); - } - - private void buttonBrowseEncoding_Click(object sender, EventArgs e) - { - openFileDialog1.Title = Configuration.Settings.Language.Main.OpenAnsiSubtitle; - openFileDialog1.FileName = string.Empty; - openFileDialog1.Filter = UiUtil.SubtitleExtensionFilter.Value; - if (openFileDialog1.ShowDialog(this) == DialogResult.OK) - { - using (var chooseEncoding = new ChooseEncoding()) - { - chooseEncoding.Initialize(openFileDialog1.FileName); - if (chooseEncoding.ShowDialog(this) == DialogResult.OK) - { - var encoding = chooseEncoding.GetEncoding(); - for (var i = 0; i < comboBoxEncoding.Items.Count; i++) - { - var item = comboBoxEncoding.Items[i]; - if (item is TextEncoding te) - { - if (te.Encoding.WebName == encoding.WebName) - { - comboBoxEncoding.SelectedIndex = i; - break; - } - } - } - } - } - } - } - - private void UpdateNumberOfFiles() - { - if (listViewInputFiles.Items.Count > 0) - { - labelNumberOfFiles.Text = $"{listViewInputFiles.Items.Count:#,###,##0}"; - } - else - { - labelNumberOfFiles.Text = string.Empty; - } - } - - private void openContainingFolderToolStripMenuItem_Click(object sender, EventArgs e) - { - if (_converting || listViewInputFiles.SelectedIndices.Count != 1) - { - return; - } - - int idx = listViewInputFiles.SelectedIndices[0]; - var fileName = listViewInputFiles.Items[idx].Text; - UiUtil.OpenFolderFromFileName(fileName); - } - - private void convertMkvThreeLetterLanguageCodesToTwoLettersToolStripMenuItem_Click(object sender, EventArgs e) - { - using (var form = new BatchConvertMkvEnding { LanguageCodeStyle = Configuration.Settings.Tools.BatchConvertMkvLanguageCodeStyle }) - { - var result = form.ShowDialog(this); - if (result == DialogResult.OK) - { - Configuration.Settings.Tools.BatchConvertMkvLanguageCodeStyle = form.LanguageCodeStyle; - SetMkvLanguageMenuItem(); - } - } - } - - private void comboBoxAdjustDurationVia_SelectedIndexChanged(object sender, EventArgs e) - { - panelAdjustDurationAddSeconds.Visible = false; - panelAdjustDurationAddPercent.Visible = false; - panelAdjustDurationFixed.Visible = false; - panelAdjustDurationRecalc.Visible = false; - - var panel = panelAdjustDurationAddSeconds; - if (comboBoxAdjustDurationVia.SelectedIndex == 1) - { - panel = panelAdjustDurationAddPercent; - } - else if (comboBoxAdjustDurationVia.SelectedIndex == 2) - { - panel = panelAdjustDurationRecalc; - } - else if (comboBoxAdjustDurationVia.SelectedIndex == 3) - { - panel = panelAdjustDurationFixed; - } - - panel.Visible = true; - panel.Left = 2; - panel.Top = labelAdjustDurationVia.Top + labelAdjustDurationVia.Height + 9; - } - - private void addFilesToolStripMenuItem_Click(object sender, EventArgs e) - { - buttonInputBrowse_Click(sender, e); - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.BluRaySup; +using Nikse.SubtitleEdit.Core.ContainerFormats.Matroska; +using Nikse.SubtitleEdit.Core.ContainerFormats.TransportStream; +using Nikse.SubtitleEdit.Core.Forms; +using Nikse.SubtitleEdit.Core.Interfaces; +using Nikse.SubtitleEdit.Core.SubtitleFormats; +using Nikse.SubtitleEdit.Core.VobSub; +using Nikse.SubtitleEdit.Forms.Ocr; +using Nikse.SubtitleEdit.Forms.Styles; +using Nikse.SubtitleEdit.Logic; +using Nikse.SubtitleEdit.Logic.CommandLineConvert; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class BatchConvert : PositionAndSizeForm + { + private const string AddUnicode = "ADD_UNICODE"; + private const string RemoveUnicode = "REMOVE_UNICODE"; + private const string ReverseStartEnd = "REVERSE_START_END"; + + public class ThreadDoWorkParameter + { + public bool FixCommonErrors { get; set; } + public bool MultipleReplaceActive { get; set; } + public bool FixRtl { get; set; } + public bool SplitLongLinesActive { get; set; } + public bool AutoBalanceActive { get; set; } + public bool SetMinDisplayTimeBetweenSubtitles { get; set; } + public ListViewItem Item { get; set; } + public Subtitle Subtitle { get; set; } + public SubtitleFormat Format { get; set; } + public TextEncoding Encoding { get; set; } + public string Language { get; set; } + public string Error { get; set; } + public string FileName { get; set; } + public string ToFormat { get; set; } + public SubtitleFormat SourceFormat { get; set; } + public List BinaryParagraphs { get; set; } + public ThreadDoWorkParameter( + bool fixCommonErrors, + bool multipleReplace, + bool fixRtl, + bool splitLongLinesActive, + bool autoBalance, + bool setMinDisplayTimeBetweenSubtitles, + ListViewItem item, + Subtitle subtitle, + SubtitleFormat format, + TextEncoding encoding, + string language, + string fileName, + string toFormat, + SubtitleFormat sourceFormat, + List binaryParagraphs) + { + FixCommonErrors = fixCommonErrors; + MultipleReplaceActive = multipleReplace; + FixRtl = fixRtl; + SplitLongLinesActive = splitLongLinesActive; + AutoBalanceActive = autoBalance; + SetMinDisplayTimeBetweenSubtitles = setMinDisplayTimeBetweenSubtitles; + Item = item; + Subtitle = subtitle; + Format = format; + Encoding = encoding; + Language = language; + FileName = fileName; + ToFormat = toFormat; + SourceFormat = sourceFormat; + BinaryParagraphs = binaryParagraphs; + } + } + + private string _assStyle; + private string _ssaStyle; + private readonly RemoveTextForHI _removeTextForHearingImpaired; + private readonly ChangeCasing _changeCasing = new ChangeCasing(); + private readonly ChangeCasingNames _changeCasingNames = new ChangeCasingNames(); + private bool _converting; + private int _count; + private int _converted; + private int _errors; + private readonly List _allFormats; + private bool _searching; + private bool _abort; + private Ebu.EbuGeneralSubtitleInformation _ebuGeneralInformation; + public static string BluRaySubtitle => "Blu-ray sup"; + public static string VobSubSubtitle => "VobSub"; + public static string DostImageSubtitle => "Dost-image"; + public static string BdnXmlSubtitle => "BDN-XML"; + public static string FcpImageSubtitle => "FCP-image"; + private string _customTextTemplate; + private readonly DurationsBridgeGaps _bridgeGaps; + private const int ConvertMaxFileSize = 1024 * 1024 * 10; // 10 MB + private Dictionary> _bdLookup = new Dictionary>(); + RemoveTextForHISettings _removeTextForHiSettings; + + public BatchConvert(Icon icon) + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + Icon = (Icon)icon.Clone(); + + progressBar1.Visible = false; + labelStatus.Text = string.Empty; + var l = Configuration.Settings.Language.BatchConvert; + Text = l.Title; + groupBoxInput.Text = l.Input; + labelChooseInputFiles.Text = l.InputDescription; + groupBoxOutput.Text = l.Output; + radioButtonSaveInSourceFolder.Text = l.SaveInSourceFolder; + radioButtonSaveInOutputFolder.Text = l.SaveInOutputFolder; + checkBoxOverwrite.Text = l.OverwriteFiles; + labelOutputFormat.Text = Configuration.Settings.Language.Main.Controls.SubtitleFormat; + labelEncoding.Text = Configuration.Settings.Language.Main.Controls.FileEncoding; + buttonStyles.Text = l.Style; + checkBoxUseStyleFromSource.Text = l.UseStyleFromSource; + groupBoxConvertOptions.Text = l.ConvertOptions; + columnHeaderFName.Text = Configuration.Settings.Language.JoinSubtitles.FileName; + columnHeaderFormat.Text = Configuration.Settings.Language.Main.Controls.SubtitleFormat; + columnHeaderSize.Text = Configuration.Settings.Language.General.Size; + columnHeaderStatus.Text = l.Status; + linkLabelOpenOutputFolder.Text = Configuration.Settings.Language.Main.Menu.File.Open; + buttonSearchFolder.Text = l.ScanFolder; + buttonConvert.Text = l.Convert; + buttonCancel.Text = Configuration.Settings.Language.General.Ok; + checkBoxScanFolderRecursive.Text = l.Recursive; + checkBoxScanFolderRecursive.Left = buttonSearchFolder.Left - checkBoxScanFolderRecursive.Width - 5; + buttonTransportStreamSettings.Text = l.TransportStreamSettingsButton; + groupBoxChangeFrameRate.Text = Configuration.Settings.Language.ChangeFrameRate.Title; + groupBoxOffsetTimeCodes.Text = l.OffsetTimeCodes; + groupBoxSpeed.Text = Configuration.Settings.Language.ChangeSpeedInPercent.TitleShort; + labelFromFrameRate.Text = Configuration.Settings.Language.ChangeFrameRate.FromFrameRate; + labelToFrameRate.Text = Configuration.Settings.Language.ChangeFrameRate.ToFrameRate; + labelHourMinSecMilliSecond.Text = Configuration.Settings.General.UseTimeFormatHHMMSSFF ? Configuration.Settings.Language.General.HourMinutesSecondsFrames : Configuration.Settings.Language.General.HourMinutesSecondsMilliseconds; + openContainingFolderToolStripMenuItem.Text = Configuration.Settings.Language.Main.Menu.File.OpenContainingFolder; + removeToolStripMenuItem.Text = Configuration.Settings.Language.MultipleReplace.Remove; + removeAllToolStripMenuItem.Text = Configuration.Settings.Language.MultipleReplace.RemoveAll; + groupBoxRemoveStyle.Text = l.RemoveStyleActor; + labelStyleName.Text = $"{Configuration.Settings.Language.General.Style}/{Configuration.Settings.Language.General.Actor}"; + labelDeleteFirstLines.Text = l.DeleteFirstLines; + labelDeleteLastLines.Text = l.DeleteLastLines; + labelDeleteLinesContaining.Text = l.DeleteContaining; + numericUpDownDeleteFirst.Left = labelDeleteFirstLines.Left + labelDeleteFirstLines.Width + 5; + numericUpDownDeleteLast.Left = labelDeleteLastLines.Left + labelDeleteLastLines.Width + 5; + groupBoxAdjustDuration.Text = Configuration.Settings.Language.AdjustDisplayDuration.Title; + + comboBoxFrameRateFrom.Left = labelFromFrameRate.Left + labelFromFrameRate.Width + 3; + comboBoxFrameRateTo.Left = labelToFrameRate.Left + labelToFrameRate.Width + 3; + if (comboBoxFrameRateFrom.Left > comboBoxFrameRateTo.Left) + { + comboBoxFrameRateTo.Left = comboBoxFrameRateFrom.Left; + } + else + { + comboBoxFrameRateFrom.Left = comboBoxFrameRateTo.Left; + } + + buttonSwapFrameRate.Left = comboBoxFrameRateFrom.Left + comboBoxFrameRateFrom.Width + 10; + buttonSwapFrameRate.Top = comboBoxFrameRateFrom.Top + ((comboBoxFrameRateTo.Top + comboBoxFrameRateTo.Height - comboBoxFrameRateFrom.Top) / 2) - (buttonSwapFrameRate.Height / 2) + 1; + + comboBoxSubtitleFormats.Left = labelOutputFormat.Left + labelOutputFormat.Width + 3; + comboBoxEncoding.Left = labelEncoding.Left + labelEncoding.Width + 3; + if (comboBoxSubtitleFormats.Left > comboBoxEncoding.Left) + { + comboBoxEncoding.Left = comboBoxSubtitleFormats.Left; + } + else + { + comboBoxSubtitleFormats.Left = comboBoxEncoding.Left; + } + buttonBrowseEncoding.Left = comboBoxEncoding.Left + comboBoxEncoding.Width + 5; + buttonStyles.Left = comboBoxSubtitleFormats.Left + comboBoxSubtitleFormats.Width + 5; + buttonTransportStreamSettings.Left = buttonStyles.Left; + + timeUpDownAdjust.MaskedTextBox.Text = "000000000"; + + comboBoxFrameRateFrom.Items.Add(23.976); + comboBoxFrameRateFrom.Items.Add(24.0); + comboBoxFrameRateFrom.Items.Add(25.0); + comboBoxFrameRateFrom.Items.Add(29.97); + comboBoxFrameRateFrom.Items.Add(30.0); + + comboBoxFrameRateTo.Items.Add(23.976); + comboBoxFrameRateTo.Items.Add(24.0); + comboBoxFrameRateTo.Items.Add(25.0); + comboBoxFrameRateTo.Items.Add(29.97); + comboBoxFrameRateTo.Items.Add(30.0); + + UiUtil.FixLargeFonts(this, buttonCancel); + + _allFormats = new List { new Pac() }; + var formatNames = new List(); + foreach (var format in SubtitleFormat.AllSubtitleFormats) + { + if (!format.IsVobSubIndexFile) + { + formatNames.Add(format.Name); + _allFormats.Add(format); + } + } + formatNames.Add("PAC"); + formatNames.Add(new Ayato().Name); + formatNames.Add(l.PlainText); + formatNames.Add(BluRaySubtitle); + formatNames.Add(VobSubSubtitle); + formatNames.Add(DostImageSubtitle); + formatNames.Add(BdnXmlSubtitle); + formatNames.Add(FcpImageSubtitle); + formatNames.Add(Configuration.Settings.Language.ExportCustomText.Title); + UiUtil.InitializeSubtitleFormatComboBox(comboBoxSubtitleFormats, formatNames, Configuration.Settings.Tools.BatchConvertFormat); + + UiUtil.InitializeTextEncodingComboBox(comboBoxEncoding); + comboBoxEncoding.Items.Add(new TextEncoding(Encoding.UTF8, l.TryToUseSourceEncoding)); + + if (string.IsNullOrEmpty(Configuration.Settings.Tools.BatchConvertOutputFolder) || !Directory.Exists(Configuration.Settings.Tools.BatchConvertOutputFolder)) + { + textBoxOutputFolder.Text = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); + } + else + { + textBoxOutputFolder.Text = Configuration.Settings.Tools.BatchConvertOutputFolder; + } + + checkBoxOverwrite.Checked = Configuration.Settings.Tools.BatchConvertOverwriteExisting; + buttonConvertOptionsSettings.Text = l.Settings; + radioButtonShowEarlier.Text = Configuration.Settings.Language.ShowEarlierLater.ShowEarlier.RemoveChar('&'); + radioButtonShowLater.Text = Configuration.Settings.Language.ShowEarlierLater.ShowLater.RemoveChar('&'); + radioButtonSpeedCustom.Text = Configuration.Settings.Language.ChangeSpeedInPercent.Custom; + radioButtonSpeedFromDropFrame.Text = Configuration.Settings.Language.ChangeSpeedInPercent.FromDropFrame; + radioButtonToDropFrame.Text = Configuration.Settings.Language.ChangeSpeedInPercent.ToDropFrame; + if (Configuration.Settings.Tools.BatchConvertSaveInSourceFolder) + { + radioButtonSaveInSourceFolder.Checked = true; + } + else + { + radioButtonSaveInOutputFolder.Checked = true; + } + + groupBoxChangeCasing.Text = Configuration.Settings.Language.ChangeCasing.ChangeCasingTo; + radioButtonNormal.Text = Configuration.Settings.Language.ChangeCasing.NormalCasing; + radioButtonFixOnlyNames.Text = Configuration.Settings.Language.ChangeCasing.FixOnlyNamesCasing; + radioButtonUppercase.Text = Configuration.Settings.Language.ChangeCasing.AllUppercase; + radioButtonLowercase.Text = Configuration.Settings.Language.ChangeCasing.AllLowercase; + if (Configuration.Settings.Tools.ChangeCasingChoice == "NamesOnly") + { + radioButtonFixOnlyNames.Checked = true; + } + else if (Configuration.Settings.Tools.ChangeCasingChoice == "Uppercase") + { + radioButtonUppercase.Checked = true; + } + else if (Configuration.Settings.Tools.ChangeCasingChoice == "Lowercase") + { + radioButtonLowercase.Checked = true; + } + + _removeTextForHearingImpaired = new RemoveTextForHI(new RemoveTextForHISettings(new Subtitle())); + _removeTextForHiSettings = _removeTextForHearingImpaired.Settings; + + labelFilter.Text = l.Filter; + comboBoxFilter.Items[0] = Configuration.Settings.Language.General.AllFiles; + comboBoxFilter.Items[1] = l.FilterSrtNoUtf8BOM; + comboBoxFilter.Items[2] = l.FilterMoreThanTwoLines; + comboBoxFilter.Items[3] = l.FilterContains; + comboBoxFilter.Items[4] = l.FilterFileNameContains; + comboBoxFilter.Items[5] = l.MkvLanguageCodeContains; + comboBoxFilter.SelectedIndex = 0; + comboBoxFilter.Left = labelFilter.Left + labelFilter.Width + 4; + textBoxFilter.Left = comboBoxFilter.Left + comboBoxFilter.Width + 4; + + _assStyle = Configuration.Settings.Tools.BatchConvertAssStyles; + _ssaStyle = Configuration.Settings.Tools.BatchConvertSsaStyles; + checkBoxUseStyleFromSource.Checked = Configuration.Settings.Tools.BatchConvertUseStyleFromSource; + _customTextTemplate = Configuration.Settings.Tools.BatchConvertExportCustomTextTemplate; + + comboBoxSubtitleFormats.AutoCompleteSource = AutoCompleteSource.ListItems; + comboBoxSubtitleFormats.AutoCompleteMode = AutoCompleteMode.Append; + + _bridgeGaps = new DurationsBridgeGaps(null); + _bridgeGaps.InitializeSettingsOnly(); + buttonTransportStreamSettings.Visible = false; + + groupBoxFixRtl.Text = Configuration.Settings.Language.BatchConvert.Settings; + radioButtonAddUnicode.Text = Configuration.Settings.Language.BatchConvert.FixRtlAddUnicode; + radioButtonRemoveUnicode.Text = Configuration.Settings.Language.BatchConvert.FixRtlRemoveUnicode; + radioButtonReverseStartEnd.Text = Configuration.Settings.Language.BatchConvert.FixRtlReverseStartEnd; + + + labelAdjustDurationVia.Text = Configuration.Settings.Language.AdjustDisplayDuration.AdjustVia; + comboBoxAdjustDurationVia.Left = labelAdjustDurationVia.Left + labelAdjustDurationVia.Width + 5; + comboBoxAdjustDurationVia.Items.Clear(); + comboBoxAdjustDurationVia.Items.Add(Configuration.Settings.Language.AdjustDisplayDuration.AddSeconds); + comboBoxAdjustDurationVia.Items.Add(Configuration.Settings.Language.AdjustDisplayDuration.Percent); + comboBoxAdjustDurationVia.Items.Add(Configuration.Settings.Language.AdjustDisplayDuration.Recalculate); + comboBoxAdjustDurationVia.Items.Add(Configuration.Settings.Language.AdjustDisplayDuration.Fixed); + switch (Configuration.Settings.Tools.AdjustDurationLast) + { + case AdjustDisplayDuration.Sec: + comboBoxAdjustDurationVia.SelectedIndex = 0; + break; + case AdjustDisplayDuration.Per: + comboBoxAdjustDurationVia.SelectedIndex = 1; + break; + case AdjustDisplayDuration.Recal: + comboBoxAdjustDurationVia.SelectedIndex = 2; + break; + case AdjustDisplayDuration.Fixed: + comboBoxAdjustDurationVia.SelectedIndex = 3; + break; + default: + comboBoxAdjustDurationVia.SelectedIndex = 0; + break; + } + decimal adjustSeconds = Configuration.Settings.Tools.AdjustDurationSeconds; + if (adjustSeconds >= numericUpDownSeconds.Minimum && adjustSeconds <= numericUpDownSeconds.Maximum) + { + numericUpDownSeconds.Value = adjustSeconds; + } + + int adjustPercent = Configuration.Settings.Tools.AdjustDurationPercent; + if (adjustPercent >= numericUpDownAdjustViaPercent.Minimum && adjustPercent <= numericUpDownAdjustViaPercent.Maximum) + { + numericUpDownAdjustViaPercent.Value = adjustPercent; + } + + numericUpDownOptimalCharsSec.Value = (decimal)Configuration.Settings.General.SubtitleOptimalCharactersPerSeconds; + numericUpDownMaxCharsSec.Value = (decimal)Configuration.Settings.General.SubtitleMaximumCharactersPerSeconds; + checkBoxExtendOnly.Checked = Configuration.Settings.Tools.AdjustDurationExtendOnly; + + labelOptimalCharsSec.Text = Configuration.Settings.Language.Settings.OptimalCharactersPerSecond; + labelMaxCharsPerSecond.Text = Configuration.Settings.Language.Settings.MaximumCharactersPerSecond; + labelAddSeconds.Text = Configuration.Settings.Language.AdjustDisplayDuration.AddSeconds; + labelMillisecondsFixed.Text = Configuration.Settings.Language.AdjustDisplayDuration.Milliseconds; + checkBoxExtendOnly.Text = Configuration.Settings.Language.AdjustDisplayDuration.ExtendOnly; + labelAdjustViaPercent.Text = Configuration.Settings.Language.AdjustDisplayDuration.SetAsPercent; + + + + var mode = Configuration.Settings.Tools.BatchConvertFixRtlMode; + if (mode == RemoveUnicode) + { + radioButtonRemoveUnicode.Checked = true; + } + else if (mode == ReverseStartEnd) + { + radioButtonReverseStartEnd.Checked = true; + } + else // fix with unicode char + { + radioButtonAddUnicode.Checked = true; + } + + groupBoxMergeShortLines.Text = Configuration.Settings.Language.MergedShortLines.Title; + labelMaxCharacters.Text = Configuration.Settings.Language.MergedShortLines.MaximumCharacters; + labelMaxMillisecondsBetweenLines.Text = Configuration.Settings.Language.MergedShortLines.MaximumMillisecondsBetween; + checkBoxOnlyContinuationLines.Text = Configuration.Settings.Language.MergedShortLines.OnlyMergeContinuationLines; + if (Configuration.Settings.General.SubtitleLineMaximumLength > numericUpDownMaxCharacters.Maximum) + { + numericUpDownMaxCharacters.Value = numericUpDownMaxCharacters.Maximum; + } + else if (Configuration.Settings.General.SubtitleLineMaximumLength < numericUpDownMaxCharacters.Minimum) + { + numericUpDownMaxCharacters.Value = numericUpDownMaxCharacters.Minimum; + } + else + { + numericUpDownMaxCharacters.Value = Configuration.Settings.General.SubtitleLineMaximumLength; + } + numericUpDownMaxMillisecondsBetweenLines.Value = Configuration.Settings.Tools.MergeShortLinesMaxGap; + checkBoxOnlyContinuationLines.Checked = Configuration.Settings.Tools.MergeShortLinesOnlyContinuous; + + inverseSelectionToolStripMenuItem.Text = Configuration.Settings.Language.Main.Menu.Edit.InverseSelection; + toolStripMenuItemSelectAll.Text = Configuration.Settings.Language.Main.Menu.ContextMenu.SelectAll; + UpdateNumberOfFiles(); + + var fixItems = new List + { + new FixActionItem + { + Text = l.RemoveFormatting, + Checked = Configuration.Settings.Tools.BatchConvertRemoveFormatting, + Action = CommandLineConverter.BatchAction.RemoveFormatting + }, + new FixActionItem + { + Text = l.RemoveStyleActor, + Checked = Configuration.Settings.Tools.BatchConvertRemoveStyle, + Action = CommandLineConverter.BatchAction.RemoveStyle, + Control = groupBoxRemoveStyle + }, + new FixActionItem + { + Text = l.RedoCasing, + Checked = Configuration.Settings.Tools.BatchConvertFixCasing, + Action = CommandLineConverter.BatchAction.RedoCasing, + Control = groupBoxChangeCasing + }, + new FixActionItem + { + Text = l.RemoveTextForHI, + Checked = Configuration.Settings.Tools.BatchConvertRemoveTextForHI, + Action = CommandLineConverter.BatchAction.RemoveTextForHI, + Control = buttonConvertOptionsSettings + }, + new FixActionItem + { + Text = l.BridgeGaps, + Checked = Configuration.Settings.Tools.BatchConvertBridgeGaps, + Action = CommandLineConverter.BatchAction.BridgeGaps, + Control = buttonConvertOptionsSettings + }, + new FixActionItem + { + Text = Configuration.Settings.Language.FixCommonErrors.Title, + Checked = Configuration.Settings.Tools.BatchConvertFixCommonErrors, + Action = CommandLineConverter.BatchAction.FixCommonErrors, + Control = buttonConvertOptionsSettings + }, + new FixActionItem + { + Text = Configuration.Settings.Language.MultipleReplace.Title, + Checked = Configuration.Settings.Tools.BatchConvertMultipleReplace, + Action = CommandLineConverter.BatchAction.MultipleReplace, + Control = buttonConvertOptionsSettings + }, + new FixActionItem + { + Text = l.FixRtl, + Checked = Configuration.Settings.Tools.BatchConvertFixRtl, + Action = CommandLineConverter.BatchAction.FixRtl, + Control = groupBoxFixRtl + }, + new FixActionItem + { + Text = l.SplitLongLines, + Checked = Configuration.Settings.Tools.BatchConvertSplitLongLines, + Action = CommandLineConverter.BatchAction.SplitLongLines + }, + new FixActionItem + { + Text = l.AutoBalance, + Checked = Configuration.Settings.Tools.BatchConvertAutoBalance, + Action = CommandLineConverter.BatchAction.BalanceLines + }, + new FixActionItem + { + Text = Configuration.Settings.Language.SetMinimumDisplayTimeBetweenParagraphs.Title, + Checked = Configuration.Settings.Tools.BatchConvertSetMinDisplayTimeBetweenSubtitles, + Action = CommandLineConverter.BatchAction.SetMinGap + }, + new FixActionItem + { + Text = Configuration.Settings.Language.MergedShortLines.Title, + Checked = Configuration.Settings.Tools.BatchConvertMergeShortLines, + Action = CommandLineConverter.BatchAction.MergeShortLines, + Control = groupBoxMergeShortLines + }, + new FixActionItem + { + Text = Configuration.Settings.Language.BatchConvert.RemoveLineBreaks, + Checked = Configuration.Settings.Tools.BatchConvertRemoveLineBreaks, + Action = CommandLineConverter.BatchAction.RemoveLineBreaks + }, + new FixActionItem + { + Text = Configuration.Settings.Language.MergeDoubleLines.Title, + Checked = Configuration.Settings.Tools.BatchConvertMergeSameText, + Action = CommandLineConverter.BatchAction.MergeSameTexts + }, + new FixActionItem + { + Text = Configuration.Settings.Language.MergeTextWithSameTimeCodes.Title, + Checked = Configuration.Settings.Tools.BatchConvertMergeSameTimeCodes, + Action = CommandLineConverter.BatchAction.MergeSameTimeCodes + }, + new FixActionItem + { + Text = Configuration.Settings.Language.ChangeFrameRate.Title, + Checked = Configuration.Settings.Tools.BatchConvertChangeFrameRate, + Action = CommandLineConverter.BatchAction.ChangeFrameRate, + Control = groupBoxChangeFrameRate + }, + new FixActionItem + { + Text = l.OffsetTimeCodes, + Checked = Configuration.Settings.Tools.BatchConvertOffsetTimeCodes, + Action = CommandLineConverter.BatchAction.OffsetTimeCodes, + Control = groupBoxOffsetTimeCodes + }, + new FixActionItem + { + Text = Configuration.Settings.Language.ChangeSpeedInPercent.TitleShort, + Checked = Configuration.Settings.Tools.BatchConvertChangeSpeed, + Action = CommandLineConverter.BatchAction.ChangeSpeed, + Control = groupBoxSpeed + }, + new FixActionItem + { + Text = Configuration.Settings.Language.AdjustDisplayDuration.Title, + Checked = Configuration.Settings.Tools.BatchConvertAdjustDisplayDuration, + Action = CommandLineConverter.BatchAction.AdjustDisplayDuration, + Control = groupBoxAdjustDuration + }, + new FixActionItem + { + Text = Configuration.Settings.Language.ApplyDurationLimits.Title, + Checked = Configuration.Settings.Tools.BatchConvertApplyDurationLimits, + Action = CommandLineConverter.BatchAction.ApplyDurationLimits + }, + new FixActionItem + { + Text = l.DeleteLines, + Checked = Configuration.Settings.Tools.BatchConvertDeleteLines, + Action = CommandLineConverter.BatchAction.DeleteLines, + Control = groupBoxDeleteLines + } + + }; + foreach (var fixItem in fixItems) + { + var listViewItem = new ListViewItem { Tag = fixItem }; + listViewItem.SubItems.Add(fixItem.Text); + listViewItem.Checked = fixItem.Checked; + listViewConvertOptions.Items.Add(listViewItem); + } + + listViewConvertOptions_SelectedIndexChanged(null, null); + + if (Configuration.IsRunningOnWindows) + { + buttonSwapFrameRate.Text = "🡙"; + } + else + { + buttonSwapFrameRate.Text = "<->"; + buttonSwapFrameRate.Width = 35; + buttonSwapFrameRate.Font = new Font(Font.FontFamily, Font.Size); + } + + SetMkvLanguageMenuItem(); + } + + private void SetMkvLanguageMenuItem() + { + var styleName = Configuration.Settings.Language.BatchConvert.MkvLanguageStyleThreeLetter; + if (Configuration.Settings.Tools.BatchConvertMkvLanguageCodeStyle == "2") + { + styleName = Configuration.Settings.Language.BatchConvert.MkvLanguageStyleTwoLetter; + } + else if (Configuration.Settings.Tools.BatchConvertMkvLanguageCodeStyle == "0") + { + styleName = Configuration.Settings.Language.BatchConvert.MkvLanguageStyleEmpty; + } + + convertMkvSettingsToolStripMenuItem.Text = string.Format(Configuration.Settings.Language.BatchConvert.MkvLanguageInOutputFileNameX, styleName); + } + + public class FixActionItem + { + public string Text { get; set; } + public bool Checked { get; set; } + public CommandLineConverter.BatchAction Action { get; set; } + public Control Control { get; set; } + } + + + private void buttonInputBrowse_Click(object sender, EventArgs e) + { + buttonInputBrowse.Enabled = false; + openFileDialog1.Title = Configuration.Settings.Language.General.OpenSubtitle; + openFileDialog1.FileName = string.Empty; + openFileDialog1.Filter = UiUtil.SubtitleExtensionFilter.Value; + openFileDialog1.Multiselect = true; + if (openFileDialog1.ShowDialog(this) == DialogResult.OK) + { + try + { + Cursor = Cursors.WaitCursor; + labelStatus.Text = Configuration.Settings.Language.General.PleaseWait; + listViewInputFiles.BeginUpdate(); + foreach (string fileName in openFileDialog1.FileNames) + { + AddInputFile(fileName); + Application.DoEvents(); + } + } + finally + { + listViewInputFiles.EndUpdate(); + Cursor = Cursors.Default; + labelStatus.Text = string.Empty; + } + } + + buttonInputBrowse.Enabled = true; + } + + private void AddInputFile(string fileName) + { + if (comboBoxFilter.SelectedIndex == 4 && textBoxFilter.Text.Length > 0 && !fileName.Contains(textBoxFilter.Text, StringComparison.OrdinalIgnoreCase)) + { + return; + } + try + { + foreach (ListViewItem lvi in listViewInputFiles.Items) + { + if (lvi.Text.Equals(fileName, StringComparison.OrdinalIgnoreCase)) + { + return; + } + } + + var fi = new FileInfo(fileName); + var ext = fi.Extension.ToLowerInvariant(); + var item = new ListViewItem(fileName); + item.SubItems.Add(Utilities.FormatBytesToDisplayFileSize(fi.Length)); + var isMkv = false; + var mkvPgs = new List(); + var mkvVobSub = new List(); + var mkvSrt = new List(); + var mkvSsa = new List(); + var mkvAss = new List(); + int mkvCount = 0; + var isTs = false; + + SubtitleFormat format = null; + var sub = new Subtitle(); + if (fi.Length < ConvertMaxFileSize) + { + if (!FileUtil.IsBluRaySup(fileName) && !FileUtil.IsVobSub(fileName) && + !((ext == ".mkv" || ext == ".mks") && FileUtil.IsMatroskaFile(fileName))) + { + format = sub.LoadSubtitle(fileName, out _, null); + + if (format == null) + { + foreach (var f in SubtitleFormat.GetBinaryFormats(true)) + { + if (f.IsMine(null, fileName)) + { + f.LoadSubtitle(sub, null, fileName); + format = f; + break; + } + } + } + + if (format == null) + { + var encoding = LanguageAutoDetect.GetEncodingFromFile(fileName); + var lines = FileUtil.ReadAllTextShared(fileName, encoding).SplitToLines(); + foreach (var f in SubtitleFormat.GetTextOtherFormats()) + { + if (f.IsMine(lines, fileName)) + { + f.LoadSubtitle(sub, lines, fileName); + format = f; + break; + } + } + } + } + } + + if (format == null) + { + if (FileUtil.IsBluRaySup(fileName)) + { + item.SubItems.Add("Blu-ray"); + } + else if (FileUtil.IsVobSub(fileName)) + { + item.SubItems.Add("VobSub"); + } + else if (ext == ".mkv" || ext == ".mks") + { + isMkv = true; + using (var matroska = new MatroskaFile(fileName)) + { + if (matroska.IsValid) + { + foreach (var track in matroska.GetTracks(true)) + { + if (track.CodecId.Equals("S_VOBSUB", StringComparison.OrdinalIgnoreCase)) + { + mkvVobSub.Add(MakeMkvTrackInfoString(track)); + } + else if (track.CodecId.Equals("S_HDMV/PGS", StringComparison.OrdinalIgnoreCase)) + { + mkvPgs.Add(MakeMkvTrackInfoString(track)); + } + else if (track.CodecId.Equals("S_TEXT/UTF8", StringComparison.OrdinalIgnoreCase)) + { + mkvSrt.Add(MakeMkvTrackInfoString(track)); + } + else if (track.CodecId.Equals("S_TEXT/SSA", StringComparison.OrdinalIgnoreCase)) + { + mkvSsa.Add(MakeMkvTrackInfoString(track)); + } + else if (track.CodecId.Equals("S_TEXT/ASS", StringComparison.OrdinalIgnoreCase)) + { + mkvAss.Add(MakeMkvTrackInfoString(track)); + } + } + } + } + if (mkvVobSub.Count + mkvPgs.Count + mkvSrt.Count + mkvSsa.Count + mkvAss.Count <= 0) + { + item.SubItems.Add(Configuration.Settings.Language.UnknownSubtitle.Title); + } + } + else if ((ext == ".ts" || ext == ".m2ts" || ext == ".mts" || ext == ".mpg" || ext == ".mpeg") && + (FileUtil.IsTransportStream(fileName) || FileUtil.IsM2TransportStream(fileName))) + { + isTs = true; + } + else + { + item.SubItems.Add(Configuration.Settings.Language.UnknownSubtitle.Title); + } + } + else + { + item.SubItems.Add(format.Name); + } + item.SubItems.Add("-"); + + if (isMkv) + { + if (mkvCount > 0) + { + listViewInputFiles.Items.Add(item); + } + + foreach (var lang in mkvPgs) + { + item = new ListViewItem(fileName); + item.SubItems.Add(Utilities.FormatBytesToDisplayFileSize(fi.Length)); + listViewInputFiles.Items.Add(item); + item.SubItems.Add("Matroska/PGS - " + lang); + item.SubItems.Add("-"); + } + foreach (var lang in mkvVobSub) + { + item = new ListViewItem(fileName); + item.SubItems.Add(Utilities.FormatBytesToDisplayFileSize(fi.Length)); + listViewInputFiles.Items.Add(item); + item.SubItems.Add("Matroska/VobSub - " + lang); + item.SubItems.Add("-"); + } + foreach (var lang in mkvSrt) + { + if (comboBoxFilter.SelectedIndex == 5 && textBoxFilter.Text.Length > 0 && !lang.Contains(textBoxFilter.Text, StringComparison.OrdinalIgnoreCase)) + { + continue; + } + item = new ListViewItem(fileName); + item.SubItems.Add(Utilities.FormatBytesToDisplayFileSize(fi.Length)); + listViewInputFiles.Items.Add(item); + item.SubItems.Add("Matroska/SRT - " + lang); + item.SubItems.Add("-"); + } + foreach (var lang in mkvSsa) + { + item = new ListViewItem(fileName); + item.SubItems.Add(Utilities.FormatBytesToDisplayFileSize(fi.Length)); + listViewInputFiles.Items.Add(item); + item.SubItems.Add("Matroska/SSA - " + lang); + item.SubItems.Add("-"); + } + foreach (var lang in mkvAss) + { + item = new ListViewItem(fileName); + item.SubItems.Add(Utilities.FormatBytesToDisplayFileSize(fi.Length)); + listViewInputFiles.Items.Add(item); + item.SubItems.Add("Matroska/ASS - " + lang); + item.SubItems.Add("-"); + } + } + else if (isTs) + { + item = new ListViewItem(fileName); + item.SubItems.Add(Utilities.FormatBytesToDisplayFileSize(fi.Length)); + listViewInputFiles.Items.Add(item); + item.SubItems.Add("Transport Stream"); + item.SubItems.Add("-"); + } + else + { + listViewInputFiles.Items.Add(item); + } + + if (isTs) + { + buttonTransportStreamSettings.Visible = true; + } + } + catch + { + // ignored + } + UpdateNumberOfFiles(); + } + + private static string MakeMkvTrackInfoString(MatroskaTrackInfo track) + { + return (track.Language ?? "undefined") + (track.IsForced ? " (forced)" : string.Empty) + " #" + track.TrackNumber; + } + + private string GetMkvLanguage(string languageCode) + { + if (Configuration.Settings.Tools.BatchConvertMkvLanguageCodeStyle == "0") + { + return string.Empty; + } + + if (string.IsNullOrEmpty(languageCode)) + { + return "undefined."; + } + + if (Configuration.Settings.Tools.BatchConvertMkvLanguageCodeStyle == "2" && + !string.IsNullOrEmpty(Iso639Dash2LanguageCode.GetTwoLetterCodeFromThreeLetterCode(languageCode))) + { + return Iso639Dash2LanguageCode.GetTwoLetterCodeFromThreeLetterCode(languageCode) + "."; + } + + return string.IsNullOrEmpty(languageCode) ? string.Empty : languageCode.TrimEnd('.') + "."; + } + + private void listViewInputFiles_DragEnter(object sender, DragEventArgs e) + { + if (_converting || _searching) + { + e.Effect = DragDropEffects.None; + return; + } + + if (e.Data.GetDataPresent(DataFormats.FileDrop, false)) + { + e.Effect = DragDropEffects.All; + } + } + + private void listViewInputFiles_DragDrop(object sender, DragEventArgs e) + { + if (_converting || _searching) + { + return; + } + + try + { + var fileNames = (string[])e.Data.GetData(DataFormats.FileDrop); + labelStatus.Text = Configuration.Settings.Language.General.PleaseWait; + listViewInputFiles.BeginUpdate(); + foreach (string fileName in fileNames) + { + if (FileUtil.IsDirectory(fileName)) + { + SearchFolder(fileName); + } + else + { + AddInputFile(fileName); + } + } + } + finally + { + labelStatus.Text = string.Empty; + listViewInputFiles.EndUpdate(); + } + } + + private void radioButtonSpeedCustom_CheckedChanged(object sender, EventArgs e) + { + numericUpDownPercent.Enabled = true; + } + + private void radioButtonSpeedFromDropFrame_CheckedChanged(object sender, EventArgs e) + { + numericUpDownPercent.Value = Convert.ToDecimal(099.98887); + numericUpDownPercent.Enabled = false; + } + + private void radioButtonToDropFrame_CheckedChanged(object sender, EventArgs e) + { + numericUpDownPercent.Value = Convert.ToDecimal(100.1001001); + numericUpDownPercent.Enabled = false; + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private TextEncoding GetCurrentEncoding(string fileName) + { + bool useEncodingFromFile = comboBoxEncoding.SelectedIndex == comboBoxEncoding.Items.Count - 1; + if (useEncodingFromFile) + { + if (string.IsNullOrEmpty(fileName) || !File.Exists(fileName)) + { + if (Configuration.Settings.General.DefaultEncoding == TextEncoding.Utf8WithoutBom) + { + return new TextEncoding(Encoding.UTF8, TextEncoding.Utf8WithoutBom); + } + return new TextEncoding(Encoding.UTF8, TextEncoding.Utf8WithBom); + } + var enc = LanguageAutoDetect.GetEncodingFromFile(fileName); + return new TextEncoding(enc, null); + } + + return UiUtil.GetTextEncodingComboBoxCurrentEncoding(comboBoxEncoding); + } + + private SubtitleFormat GetCurrentSubtitleFormat() + { + var format = Utilities.GetSubtitleFormatByFriendlyName(comboBoxSubtitleFormats.SelectedItem.ToString()); + return format ?? new SubRip(); + } + + private void buttonConvert_Click(object sender, EventArgs e) + { + if (buttonConvert.Text == Configuration.Settings.Language.General.Cancel) + { + _abort = true; + return; + } + + UpdateChangeCasingSettings(); + UpdateRtlSettings(); + UpdateActionEnabledCache(); + if (listViewInputFiles.Items.Count == 0) + { + MessageBox.Show(Configuration.Settings.Language.BatchConvert.NothingToConvert); + return; + } + if (!checkBoxOverwrite.Checked) + { + if (textBoxOutputFolder.Text.Length < 2) + { + MessageBox.Show(Configuration.Settings.Language.BatchConvert.PleaseChooseOutputFolder); + return; + } + if (!Directory.Exists(textBoxOutputFolder.Text)) + { + try + { + Directory.CreateDirectory(textBoxOutputFolder.Text); + } + catch (Exception exception) + { + MessageBox.Show(exception.Message); + return; + } + } + } + _converting = true; + progressBar1.Style = ProgressBarStyle.Blocks; + progressBar1.Maximum = listViewInputFiles.Items.Count; + progressBar1.Value = 0; + progressBar1.Visible = progressBar1.Maximum > 2; + string toFormat = comboBoxSubtitleFormats.Text; + SetControlState(false); + + _count = 0; + _converted = 0; + _errors = 0; + _abort = false; + + var worker1 = SpawnWorker(); + var worker2 = SpawnWorker(); + var worker3 = SpawnWorker(); + + listViewInputFiles.BeginUpdate(); + foreach (ListViewItem item in listViewInputFiles.Items) + { + item.SubItems[3].Text = "-"; + } + + listViewInputFiles.EndUpdate(); + var mkvFileNames = new List(); + Refresh(); + int index = 0; + while (index < listViewInputFiles.Items.Count && !_abort) + { + ListViewItem item = listViewInputFiles.Items[index]; + string fileName = item.Text; + try + { + var binaryParagraphs = new List(); + SubtitleFormat format = null; + var sub = new Subtitle(); + var fi = new FileInfo(fileName); + if (fi.Length < ConvertMaxFileSize && !FileUtil.IsBluRaySup(fileName) && !FileUtil.IsVobSub(fileName)) + { + format = sub.LoadSubtitle(fileName, out _, null); + + if (format == null) + { + foreach (var f in SubtitleFormat.GetBinaryFormats(true)) + { + if (f.IsMine(null, fileName)) + { + f.LoadSubtitle(sub, null, fileName); + format = f; + break; + } + } + } + + if (format == null) + { + var encoding = LanguageAutoDetect.GetEncodingFromFile(fileName); + var lines = FileUtil.ReadAllTextShared(fileName, encoding).SplitToLines(); + foreach (var f in SubtitleFormat.GetTextOtherFormats()) + { + if (f.IsMine(lines, fileName)) + { + f.LoadSubtitle(sub, lines, fileName); + format = f; + break; + } + } + } + + if (format == null) + { + var enc = LanguageAutoDetect.GetEncodingFromFile(fileName); + var s = File.ReadAllText(fileName, enc); + + // check for RTF file + if (fileName.EndsWith(".rtf", StringComparison.OrdinalIgnoreCase) && s.TrimStart().StartsWith("{\\rtf", StringComparison.Ordinal)) + { + using (var rtb = new RichTextBox { Rtf = s }) + { + s = rtb.Text; + } + } + var unknownFormatImporter = new UnknownFormatImporter { UseFrames = true }; + var genericParseSubtitle = unknownFormatImporter.AutoGuessImport(s.SplitToLines()); + if (genericParseSubtitle.Paragraphs.Count > 1) + { + sub = genericParseSubtitle; + format = new SubRip(); + } + } + + if (format != null && format.GetType() == typeof(MicroDvd)) + { + if (sub != null && sub.Paragraphs.Count > 0 && sub.Paragraphs[0].Duration.TotalMilliseconds < 1001) + { + if (sub.Paragraphs[0].Text.StartsWith("29.", StringComparison.Ordinal) || sub.Paragraphs[0].Text.StartsWith("23.", StringComparison.Ordinal) || + sub.Paragraphs[0].Text.StartsWith("29,", StringComparison.Ordinal) || sub.Paragraphs[0].Text.StartsWith("23,", StringComparison.Ordinal) || + sub.Paragraphs[0].Text == "24" || sub.Paragraphs[0].Text == "25" || + sub.Paragraphs[0].Text == "30" || sub.Paragraphs[0].Text == "60") + { + sub.Paragraphs.RemoveAt(0); + } + } + } + } + var bluRaySubtitles = new List(); + bool isVobSub = false; + bool isMatroska = false; + bool isTs = false; + if (format == null && fileName.EndsWith(".sup", StringComparison.OrdinalIgnoreCase) && FileUtil.IsBluRaySup(fileName)) + { + var log = new StringBuilder(); + bluRaySubtitles = BluRaySupParser.ParseBluRaySup(fileName, log); + } + else if (format == null && fileName.EndsWith(".sub", StringComparison.OrdinalIgnoreCase) && FileUtil.IsVobSub(fileName)) + { + isVobSub = true; + } + else if (format == null && (fileName.EndsWith(".mkv", StringComparison.OrdinalIgnoreCase) || fileName.EndsWith(".mks", StringComparison.OrdinalIgnoreCase)) && item.SubItems[2].Text.StartsWith("Matroska", StringComparison.Ordinal)) + { + isMatroska = true; + } + else if (format == null && + (fileName.EndsWith(".ts", StringComparison.OrdinalIgnoreCase) || + fileName.EndsWith(".m2ts", StringComparison.OrdinalIgnoreCase) || + fileName.EndsWith(".mts", StringComparison.OrdinalIgnoreCase) || + fileName.EndsWith(".mpg", StringComparison.OrdinalIgnoreCase) || + fileName.EndsWith(".mpeg", StringComparison.OrdinalIgnoreCase)) && + item.SubItems[2].Text.StartsWith("Transport Stream", StringComparison.Ordinal)) + { + isTs = true; + } + if (format == null && bluRaySubtitles.Count == 0 && !isVobSub && !isMatroska && !isTs) + { + IncrementAndShowProgress(); + } + else + { + if (isMatroska) + { + using (var matroska = new MatroskaFile(fileName)) + { + if (matroska.IsValid) + { + var trackId = item.SubItems[2].Text; + if (trackId.Contains("#")) + { + trackId = trackId.Remove(0, trackId.IndexOf("#", StringComparison.Ordinal) + 1); + } + + foreach (var track in matroska.GetTracks(true)) + { + if (track.CodecId.Equals("S_VOBSUB", StringComparison.OrdinalIgnoreCase)) + { + if (trackId == track.TrackNumber.ToString(CultureInfo.InvariantCulture)) + { + var vobSubs = LoadVobSubFromMatroska(track, matroska, out var idx); + if (vobSubs.Count > 0) + { + item.SubItems[3].Text = Configuration.Settings.Language.BatchConvert.Ocr; + using (var vobSubOcr = new VobSubOcr()) + { + vobSubOcr.ProgressCallback = progress => + { + item.SubItems[3].Text = Configuration.Settings.Language.BatchConvert.Ocr + " " + progress; + listViewInputFiles.Refresh(); + }; + vobSubOcr.FileName = Path.GetFileName(fileName); + vobSubOcr.InitializeBatch(vobSubs, idx.Palette, Configuration.Settings.VobSubOcr, fileName, false, track.Language, null); + sub = vobSubOcr.SubtitleFromOcr; + } + } + + fileName = fileName.Substring(0, fileName.LastIndexOf('.')) + "." + GetMkvLanguage(track.Language).Replace("undefined.", string.Empty) + "mkv"; + if (mkvFileNames.Contains(fileName)) + { + fileName = fileName.Substring(0, fileName.LastIndexOf('.')) + ".#" + trackId + "." + GetMkvLanguage(track.Language) + "mkv"; + } + mkvFileNames.Add(fileName); + + break; + } + } + else if (track.CodecId.Equals("S_HDMV/PGS", StringComparison.OrdinalIgnoreCase)) + { + if (trackId == track.TrackNumber.ToString(CultureInfo.InvariantCulture)) + { + bluRaySubtitles = LoadBluRaySupFromMatroska(track, matroska, Handle); + + fileName = fileName.Substring(0, fileName.LastIndexOf('.')) + "." + GetMkvLanguage(track.Language).Replace("undefined.", string.Empty) + "mkv"; + if (mkvFileNames.Contains(fileName)) + { + fileName = fileName.Substring(0, fileName.LastIndexOf('.')) + ".#" + trackId + "." + GetMkvLanguage(track.Language) + "mkv"; + } + mkvFileNames.Add(fileName); + + if ((toFormat == BdnXmlSubtitle || toFormat == BluRaySubtitle || + toFormat == VobSubSubtitle || toFormat == DostImageSubtitle) && + AllowImageToImage()) + { + foreach (var b in bluRaySubtitles) + { + sub.Paragraphs.Add(new Paragraph(b.StartTimeCode, b.EndTimeCode, string.Empty)); + } + if (!_bdLookup.ContainsKey(fileName)) + { + _bdLookup.Add(fileName, bluRaySubtitles); + } + } + else + { + if (bluRaySubtitles.Count > 0) + { + item.SubItems[3].Text = Configuration.Settings.Language.BatchConvert.Ocr; + using (var vobSubOcr = new VobSubOcr()) + { + vobSubOcr.ProgressCallback = progress => + { + item.SubItems[3].Text = Configuration.Settings.Language.BatchConvert.Ocr + " " + progress; + listViewInputFiles.Refresh(); + }; + vobSubOcr.FileName = Path.GetFileName(fileName); + vobSubOcr.InitializeBatch(bluRaySubtitles, Configuration.Settings.VobSubOcr, fileName, false, track.Language); + sub = vobSubOcr.SubtitleFromOcr; + } + } + } + break; + } + } + else if (track.CodecId.Equals("S_TEXT/UTF8", StringComparison.OrdinalIgnoreCase) || track.CodecId.Equals("S_TEXT/SSA", StringComparison.OrdinalIgnoreCase) || track.CodecId.Equals("S_TEXT/ASS", StringComparison.OrdinalIgnoreCase)) + { + if (trackId == track.TrackNumber.ToString(CultureInfo.InvariantCulture)) + { + var mkvSub = matroska.GetSubtitle(track.TrackNumber, null); + Utilities.LoadMatroskaTextSubtitle(track, matroska, mkvSub, sub); + fileName = fileName.Substring(0, fileName.LastIndexOf('.')) + "." + GetMkvLanguage(track.Language).Replace("undefined.", string.Empty) + "mkv"; + if (mkvFileNames.Contains(fileName)) + { + fileName = fileName.Substring(0, fileName.LastIndexOf('.')) + ".#" + trackId + "." + GetMkvLanguage(track.Language) + "mkv"; + } + mkvFileNames.Add(fileName); + break; + } + } + } + } + } + } + else if (bluRaySubtitles.Count > 0) + { + if ((toFormat == BdnXmlSubtitle || toFormat == BluRaySubtitle || + toFormat == VobSubSubtitle || toFormat == DostImageSubtitle) && + AllowImageToImage()) + { + foreach (var b in bluRaySubtitles) + { + sub.Paragraphs.Add(new Paragraph(b.StartTimeCode, b.EndTimeCode, string.Empty)); + } + } + else + { + item.SubItems[3].Text = Configuration.Settings.Language.BatchConvert.Ocr; + using (var vobSubOcr = new VobSubOcr()) + { + vobSubOcr.ProgressCallback = progress => + { + item.SubItems[3].Text = Configuration.Settings.Language.BatchConvert.Ocr + " " + progress; + listViewInputFiles.Refresh(); + }; + vobSubOcr.FileName = Path.GetFileName(fileName); + vobSubOcr.InitializeBatch(bluRaySubtitles, Configuration.Settings.VobSubOcr, fileName, false); + sub = vobSubOcr.SubtitleFromOcr; + } + } + } + else if (isVobSub) + { + item.SubItems[3].Text = Configuration.Settings.Language.BatchConvert.Ocr; + using (var vobSubOcr = new VobSubOcr()) + { + vobSubOcr.ProgressCallback = progress => + { + item.SubItems[3].Text = Configuration.Settings.Language.BatchConvert.Ocr + " " + progress; + listViewInputFiles.Refresh(); + }; + vobSubOcr.InitializeBatch(fileName, Configuration.Settings.VobSubOcr, false, null); + sub = vobSubOcr.SubtitleFromOcr; + } + } + else if (isTs) + { + int tsConvertedCount = 0; + var programMapTableParser = new ProgramMapTableParser(); + programMapTableParser.Parse(fileName); // get languages + var tsParser = new TransportStreamParser(); + tsParser.Parse(fileName, (position, total) => + { + var percent = (int)Math.Round(position * 100.0 / total); + item.SubItems[3].Text = $"Read: {percent}%"; + listViewInputFiles.Refresh(); + }); + + var outputFolder = textBoxOutputFolder.Text; + var overwrite = checkBoxOverwrite.Checked; + if (radioButtonSaveInSourceFolder.Checked) + { + outputFolder = Path.GetDirectoryName(fileName); + } + + var targetEncoding = GetCurrentEncoding(fileName); + + var targetFrameRate = 0.0; + if (double.TryParse(comboBoxFrameRateTo.Text.Replace(',', '.').Replace(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, "."), NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var toFrameRate)) + { + targetFrameRate = toFrameRate; + } + + // images + if (!Configuration.Settings.Tools.BatchConvertTsOnlyTeletext) + { + foreach (int id in tsParser.SubtitlePacketIds) + { + void ProgressCallback(string progress) + { + item.SubItems[3].Text = progress; + listViewInputFiles.Refresh(); + } + + if (BluRaySubtitle.RemoveChar(' ').Equals(toFormat.RemoveChar(' '), StringComparison.OrdinalIgnoreCase)) + { + TsToBluRaySup.WriteTrack(fileName, outputFolder, overwrite, 0, null, ProgressCallback, null, programMapTableParser, id, tsParser); + tsConvertedCount++; + } + else if (BdnXmlSubtitle.RemoveChar(' ').Equals(toFormat.RemoveChar(' '), StringComparison.OrdinalIgnoreCase)) + { + TsToBdnXml.WriteTrack(fileName, outputFolder, overwrite, null, ProgressCallback, null, programMapTableParser, id, tsParser); + tsConvertedCount++; + } + else + { + var tsBinaryParagraphs = new List(); + var subtitle = new Subtitle(); + foreach (var transportStreamSubtitle in tsParser.GetDvbSubtitles(id)) + { + tsBinaryParagraphs.Add(transportStreamSubtitle); + subtitle.Paragraphs.Add(new Paragraph(string.Empty, transportStreamSubtitle.StartMilliseconds, transportStreamSubtitle.EndMilliseconds)); + } + + using (var vobSubOcr = new VobSubOcr()) + { + vobSubOcr.ProgressCallback = progress => + { + item.SubItems[3].Text = $"OCR: {progress}"; + listViewInputFiles.Refresh(); + }; + var language = programMapTableParser.GetSubtitleLanguage(id); + language = string.IsNullOrEmpty(language) ? null : language; + vobSubOcr.FileName = Path.GetFileName(fileName); + vobSubOcr.InitializeBatch(tsBinaryParagraphs, Configuration.Settings.VobSubOcr, fileName, false, language, null); + subtitle = vobSubOcr.SubtitleFromOcr; + } + + // apply fixes step 1 + subtitle = ApplyFixesStep1(subtitle, null); + + // apply fixes step 2 + var parameter = new ThreadDoWorkParameter( + IsActionEnabled(CommandLineConverter.BatchAction.FixCommonErrors), + IsActionEnabled(CommandLineConverter.BatchAction.MultipleReplace), + IsActionEnabled(CommandLineConverter.BatchAction.FixRtl), + IsActionEnabled(CommandLineConverter.BatchAction.SplitLongLines), + IsActionEnabled(CommandLineConverter.BatchAction.BalanceLines), + IsActionEnabled(CommandLineConverter.BatchAction.SetMinGap), + item, + subtitle, + GetCurrentSubtitleFormat(), + GetCurrentEncoding(fileName), + Configuration.Settings.Tools.BatchConvertLanguage, + fileName, + toFormat, + format, + binaryParagraphs); + ApplyFixesStep2(parameter, Configuration.Settings.Tools.BatchConvertFixRtlMode); + + var preExt = TsToBluRaySup.GetFileNameEnding(programMapTableParser, id); + int dummy = 0; + CommandLineConverter.BatchConvertSave(toFormat, TimeSpan.Zero, targetEncoding, outputFolder, 0, ref dummy, ref dummy, SubtitleFormat.AllSubtitleFormats.ToList(), fileName, parameter.Subtitle, new SubRip(), null, overwrite, 0, targetFrameRate, null, new List(), null, true, null, null, null, preExt); + tsConvertedCount++; + } + } + } + + // teletext + foreach (var program in tsParser.TeletextSubtitlesLookup) + { + foreach (var kvp in program.Value) + { + var subtitle = new Subtitle(kvp.Value); + var preExt = TsToBluRaySup.GetFileNameEnding(programMapTableParser, kvp.Key); + int dummy = 0; + + // apply fixes step 1 + subtitle = ApplyFixesStep1(subtitle, null); + + // apply fixes step 2 + var parameter = new ThreadDoWorkParameter( + IsActionEnabled(CommandLineConverter.BatchAction.FixCommonErrors), + IsActionEnabled(CommandLineConverter.BatchAction.MultipleReplace), + IsActionEnabled(CommandLineConverter.BatchAction.FixRtl), + IsActionEnabled(CommandLineConverter.BatchAction.SplitLongLines), + IsActionEnabled(CommandLineConverter.BatchAction.BalanceLines), + IsActionEnabled(CommandLineConverter.BatchAction.SetMinGap), + item, + subtitle, + GetCurrentSubtitleFormat(), + GetCurrentEncoding(fileName), + Configuration.Settings.Tools.BatchConvertLanguage, + fileName, + toFormat, + format, + binaryParagraphs); + ApplyFixesStep2(parameter, Configuration.Settings.Tools.BatchConvertFixRtlMode); + + CommandLineConverter.BatchConvertSave(toFormat, TimeSpan.Zero, targetEncoding, outputFolder, 0, ref dummy, ref dummy, SubtitleFormat.AllSubtitleFormats.ToList(), fileName, parameter.Subtitle, new SubRip(), null, overwrite, 0, targetFrameRate, null, new List(), null, true, null, null, null, preExt); + tsConvertedCount++; + } + } + + if (tsConvertedCount > 0) + { + item.SubItems[3].Text = Configuration.Settings.Language.BatchConvert.Converted; + } + } + + if (comboBoxSubtitleFormats.Text == AdvancedSubStationAlpha.NameOfFormat && _assStyle != null) + { + if (!string.IsNullOrWhiteSpace(_assStyle) && !checkBoxUseStyleFromSource.Checked) + { + sub.Header = _assStyle; + } + } + else if (comboBoxSubtitleFormats.Text == SubStationAlpha.NameOfFormat && _ssaStyle != null) + { + if (!string.IsNullOrWhiteSpace(_ssaStyle) && !checkBoxUseStyleFromSource.Checked) + { + sub.Header = _ssaStyle; + } + } + + bool skip = CheckSkipFilter(fileName, format, sub); + if (skip) + { + item.SubItems[3].Text = Configuration.Settings.Language.BatchConvert.FilterSkipped; + } + else + { + sub = ApplyFixesStep1(sub, bluRaySubtitles); + + while (worker1.IsBusy && worker2.IsBusy && worker3.IsBusy) + { + Application.DoEvents(); + System.Threading.Thread.Sleep(100); + } + + var parameter = new ThreadDoWorkParameter( + IsActionEnabled(CommandLineConverter.BatchAction.FixCommonErrors), + IsActionEnabled(CommandLineConverter.BatchAction.MultipleReplace), + IsActionEnabled(CommandLineConverter.BatchAction.FixRtl), + IsActionEnabled(CommandLineConverter.BatchAction.SplitLongLines), + IsActionEnabled(CommandLineConverter.BatchAction.BalanceLines), + IsActionEnabled(CommandLineConverter.BatchAction.SetMinGap), + item, + sub, + GetCurrentSubtitleFormat(), + GetCurrentEncoding(fileName), + Configuration.Settings.Tools.BatchConvertLanguage, + fileName, + toFormat, + format, + binaryParagraphs); + + if (!worker1.IsBusy) + { + worker1.RunWorkerAsync(parameter); + } + else if (!worker2.IsBusy) + { + worker2.RunWorkerAsync(parameter); + } + else if (!worker3.IsBusy) + { + worker3.RunWorkerAsync(parameter); + } + } + } + } + catch (Exception exception) + { + System.Diagnostics.Debug.WriteLine(exception); + IncrementAndShowProgress(); + } + index++; + } + while (worker1.IsBusy || worker2.IsBusy || worker3.IsBusy) + { + try + { + Application.DoEvents(); + } + catch + { + // ignored + } + System.Threading.Thread.Sleep(100); + } + + // dispose workers + worker1.Dispose(); + worker2.Dispose(); + worker3.Dispose(); + + _converting = false; + labelStatus.Text = string.Empty; + progressBar1.Visible = false; + TaskbarList.SetProgressState(Handle, TaskbarButtonProgressFlags.NoProgress); + SetControlState(true); + _bdLookup = new Dictionary>(); + } + + private Subtitle ApplyFixesStep1(Subtitle sub, List bluRaySubtitles) + { + if (IsActionEnabled(CommandLineConverter.BatchAction.BridgeGaps)) + { + Core.Forms.DurationsBridgeGaps.BridgeGaps(sub, _bridgeGaps.MinMsBetweenLines, !_bridgeGaps.PreviousSubtitleTakesAllTime, Configuration.Settings.Tools.BridgeGapMilliseconds, null, null, false); + } + + if (IsActionEnabled(CommandLineConverter.BatchAction.ApplyDurationLimits)) + { + var fixDurationLimits = new FixDurationLimits(Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds, Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds); + sub = fixDurationLimits.Fix(sub); + } + + if (IsActionEnabled(CommandLineConverter.BatchAction.DeleteLines)) + { + DeleteLines(sub); + } + + if (IsActionEnabled(CommandLineConverter.BatchAction.RemoveStyle) && !string.IsNullOrEmpty(textBoxRemoveStyle.Text)) + { + sub.Paragraphs.RemoveAll(p => p.Extra == textBoxRemoveStyle.Text || p.Style == textBoxRemoveStyle.Text); + sub.Renumber(); + } + + if (IsActionEnabled(CommandLineConverter.BatchAction.AdjustDisplayDuration)) + { + var adjustmentType = comboBoxAdjustDurationVia.Text; + if (adjustmentType == Configuration.Settings.Language.AdjustDisplayDuration.Percent) + { + sub.AdjustDisplayTimeUsingPercent((double)numericUpDownAdjustViaPercent.Value, null); + } + else if (adjustmentType == Configuration.Settings.Language.AdjustDisplayDuration.Recalculate) + { + sub.RecalculateDisplayTimes((double)numericUpDownMaxCharsSec.Value, null, (double)numericUpDownOptimalCharsSec.Value, checkBoxExtendOnly.Checked); + } + else if (adjustmentType == Configuration.Settings.Language.AdjustDisplayDuration.Fixed) + { + sub.SetFixedDuration(null, (double)numericUpDownFixedMilliseconds.Value); + } + else + { + sub.AdjustDisplayTimeUsingSeconds((double)numericUpDownSeconds.Value, null); + } + } + + var prev = sub.GetParagraphOrDefault(0); + var first = true; + foreach (var p in sub.Paragraphs) + { + if (IsActionEnabled(CommandLineConverter.BatchAction.RemoveTextForHI)) + { + _removeTextForHearingImpaired.Settings = _removeTextForHiSettings; + p.Text = _removeTextForHearingImpaired.RemoveTextFromHearImpaired(p.Text, sub, sub.Paragraphs.IndexOf(p)); + } + + if (IsActionEnabled(CommandLineConverter.BatchAction.RemoveFormatting)) + { + p.Text = HtmlUtil.RemoveHtmlTags(p.Text, true); + } + + if (!numericUpDownPercent.Value.Equals(100) && IsActionEnabled(CommandLineConverter.BatchAction.ChangeSpeed)) + { + var toSpeedPercentage = Convert.ToDouble(numericUpDownPercent.Value) / 100.0; + p.StartTime.TotalMilliseconds = p.StartTime.TotalMilliseconds * toSpeedPercentage; + p.EndTime.TotalMilliseconds = p.EndTime.TotalMilliseconds * toSpeedPercentage; + + if (first) + { + first = false; + } + else + { + if (prev.EndTime.TotalMilliseconds >= p.StartTime.TotalMilliseconds) + { + prev.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds - 1; + } + } + } + + prev = p; + } + + if (bluRaySubtitles == null || bluRaySubtitles.Count == 0) + { + sub.RemoveEmptyLines(); //TODO: only for image export? + } + + if (IsActionEnabled(CommandLineConverter.BatchAction.RedoCasing)) + { + _changeCasing.FixCasing(sub, LanguageAutoDetect.AutoDetectGoogleLanguage(sub)); + _changeCasingNames.Initialize(sub); + _changeCasingNames.FixCasing(); + } + + if (IsActionEnabled(CommandLineConverter.BatchAction.MergeShortLines)) + { + var mergedShortLinesSub = MergeShortLinesUtils.MergeShortLinesInSubtitle(sub, Configuration.Settings.Tools.MergeShortLinesMaxGap, Configuration.Settings.General.SubtitleLineMaximumLength, Configuration.Settings.Tools.MergeShortLinesOnlyContinuous); + if (mergedShortLinesSub.Paragraphs.Count != sub.Paragraphs.Count) + { + sub.Paragraphs.Clear(); + sub.Paragraphs.AddRange(mergedShortLinesSub.Paragraphs); + } + } + + if (IsActionEnabled(CommandLineConverter.BatchAction.RemoveLineBreaks)) + { + foreach (var paragraph in sub.Paragraphs) + { + paragraph.Text = Utilities.UnbreakLine(paragraph.Text); + } + } + + if (IsActionEnabled(CommandLineConverter.BatchAction.MergeSameTexts)) + { + var mergedSameTextsSub = MergeLinesSameTextUtils.MergeLinesWithSameTextInSubtitle(sub, true, 250); + if (mergedSameTextsSub.Paragraphs.Count != sub.Paragraphs.Count) + { + sub.Paragraphs.Clear(); + sub.Paragraphs.AddRange(mergedSameTextsSub.Paragraphs); + } + } + + if (IsActionEnabled(CommandLineConverter.BatchAction.MergeSameTimeCodes)) + { + var mergedSameTimeCodesSub = MergeLinesWithSameTimeCodes.Merge(sub, new List(), out _, true, false, 1000, "en", new List(), new Dictionary(), new Subtitle()); + if (mergedSameTimeCodesSub.Paragraphs.Count != sub.Paragraphs.Count) + { + sub.Paragraphs.Clear(); + sub.Paragraphs.AddRange(mergedSameTimeCodesSub.Paragraphs); + } + } + + if (IsActionEnabled(CommandLineConverter.BatchAction.ChangeFrameRate) && + double.TryParse(comboBoxFrameRateFrom.Text.Replace(',', '.').Replace(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, "."), NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var fromFrameRate) && + double.TryParse(comboBoxFrameRateTo.Text.Replace(',', '.').Replace(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, "."), NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var toFrameRate)) + { + sub.ChangeFrameRate(fromFrameRate, toFrameRate); + } + + if (IsActionEnabled(CommandLineConverter.BatchAction.OffsetTimeCodes) && timeUpDownAdjust.TimeCode.TotalMilliseconds > 0.00001) + { + var totalMilliseconds = timeUpDownAdjust.TimeCode.TotalMilliseconds; + if (radioButtonShowEarlier.Checked) + { + totalMilliseconds *= -1; + } + + sub.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(totalMilliseconds)); + } + + return sub; + } + + private void DeleteLines(Subtitle sub) + { + var skipFirst = (int)numericUpDownDeleteFirst.Value; + var skipLast = (int)numericUpDownDeleteLast.Value; + var deleteContains = textBoxDeleteContains.Text; + if (skipFirst == 0 && skipLast == 0 && string.IsNullOrWhiteSpace(deleteContains)) + { + return; + } + + var paragraphs = sub.Paragraphs.Skip(skipFirst).ToList(); + paragraphs = paragraphs.Take(paragraphs.Count - skipLast).ToList(); + if (!string.IsNullOrWhiteSpace(deleteContains)) + { + paragraphs = paragraphs.Where(p => !p.Text.Contains(deleteContains)).ToList(); + } + + sub.Paragraphs.Clear(); + sub.Paragraphs.AddRange(paragraphs); + sub.Renumber(); + } + + private void UpdateChangeCasingSettings() + { + if (radioButtonNormal.Checked) + { + Configuration.Settings.Tools.ChangeCasingChoice = "Normal"; + } + else if (radioButtonFixOnlyNames.Checked) + { + Configuration.Settings.Tools.ChangeCasingChoice = "NamesOnly"; + } + else if (radioButtonUppercase.Checked) + { + Configuration.Settings.Tools.ChangeCasingChoice = "Uppercase"; + } + else if (radioButtonLowercase.Checked) + { + Configuration.Settings.Tools.ChangeCasingChoice = "Lowercase"; + } + } + + private Dictionary _actionEnabledCache; + + private void UpdateActionEnabledCache() + { + _actionEnabledCache = new Dictionary(); + foreach (ListViewItem item in listViewConvertOptions.Items) + { + var fixItem = item.Tag as FixActionItem; + _actionEnabledCache.Add(fixItem.Action, item.Checked); + } + } + + private bool IsActionEnabled(CommandLineConverter.BatchAction action) + { + if (_actionEnabledCache != null) + { + return _actionEnabledCache[action]; + } + + foreach (ListViewItem item in listViewConvertOptions.Items) + { + if (item.Tag is FixActionItem fixItem && fixItem.Action == action) + { + return item.Checked; + } + } + return false; + } + + private BackgroundWorker SpawnWorker() + { + var worker = new BackgroundWorker(); + worker.DoWork += DoThreadWork; + worker.RunWorkerCompleted += ThreadWorkerCompleted; + return worker; + } + + /// + /// Text based functions requires text, so no image to image convert + /// + /// + private bool AllowImageToImage() + { + return !IsActionEnabled(CommandLineConverter.BatchAction.BalanceLines) && + !IsActionEnabled(CommandLineConverter.BatchAction.RedoCasing) && + !IsActionEnabled(CommandLineConverter.BatchAction.FixCommonErrors) && + !IsActionEnabled(CommandLineConverter.BatchAction.FixRtl) && + !IsActionEnabled(CommandLineConverter.BatchAction.MultipleReplace) && + !IsActionEnabled(CommandLineConverter.BatchAction.RemoveFormatting) && + !IsActionEnabled(CommandLineConverter.BatchAction.SplitLongLines) && + !IsActionEnabled(CommandLineConverter.BatchAction.RemoveTextForHI) && + !IsActionEnabled(CommandLineConverter.BatchAction.MergeSameTexts) && + !IsActionEnabled(CommandLineConverter.BatchAction.MergeSameTimeCodes) && + !IsActionEnabled(CommandLineConverter.BatchAction.MergeShortLines) && + !IsActionEnabled(CommandLineConverter.BatchAction.RemoveLineBreaks); + } + + internal static List LoadVobSubFromMatroska(MatroskaTrackInfo matroskaSubtitleInfo, MatroskaFile matroska, out Core.VobSub.Idx idx) + { + var mergedVobSubPacks = new List(); + if (matroskaSubtitleInfo.ContentEncodingType == 1) + { + idx = null; + return mergedVobSubPacks; + } + + var sub = matroska.GetSubtitle(matroskaSubtitleInfo.TrackNumber, null); + idx = new Core.VobSub.Idx(matroskaSubtitleInfo.GetCodecPrivate().SplitToLines()); + foreach (var p in sub) + { + mergedVobSubPacks.Add(new VobSubMergedPack(p.GetData(matroskaSubtitleInfo), TimeSpan.FromMilliseconds(p.Start), 32, null)); + if (mergedVobSubPacks.Count > 0) + { + mergedVobSubPacks[mergedVobSubPacks.Count - 1].EndTime = TimeSpan.FromMilliseconds(p.End); + } + + // fix overlapping (some versions of Handbrake makes overlapping time codes - thx Hawke) + if (mergedVobSubPacks.Count > 1 && mergedVobSubPacks[mergedVobSubPacks.Count - 2].EndTime > mergedVobSubPacks[mergedVobSubPacks.Count - 1].StartTime) + { + mergedVobSubPacks[mergedVobSubPacks.Count - 2].EndTime = TimeSpan.FromMilliseconds(mergedVobSubPacks[mergedVobSubPacks.Count - 1].StartTime.TotalMilliseconds - 1); + } + } + return mergedVobSubPacks; + } + + internal static List LoadBluRaySupFromMatroska(MatroskaTrackInfo track, MatroskaFile matroska, IntPtr handle) + { + if (track.ContentEncodingType == 1) + { + return new List(); + } + + var sub = matroska.GetSubtitle(track.TrackNumber, null); + TaskbarList.SetProgressState(handle, TaskbarButtonProgressFlags.NoProgress); + var subtitles = new List(); + var log = new StringBuilder(); + var clusterStream = new MemoryStream(); + var lastPalettes = new Dictionary>(); + var lastBitmapObjects = new Dictionary>(); + foreach (var p in sub) + { + byte[] buffer = p.GetData(track); + if (buffer != null && buffer.Length > 2) + { + clusterStream.Write(buffer, 0, buffer.Length); + if (ContainsBluRayStartSegment(buffer)) + { + if (subtitles.Count > 0 && subtitles[subtitles.Count - 1].StartTime == subtitles[subtitles.Count - 1].EndTime) + { + subtitles[subtitles.Count - 1].EndTime = (long)((p.Start - 1) * 90.0); + } + clusterStream.Position = 0; + var list = BluRaySupParser.ParseBluRaySup(clusterStream, log, true, lastPalettes, lastBitmapObjects); + foreach (var sup in list) + { + sup.StartTime = (long)((p.Start - 1) * 90.0); + sup.EndTime = (long)((p.End - 1) * 90.0); + subtitles.Add(sup); + + // fix overlapping + if (subtitles.Count > 1 && sub[subtitles.Count - 2].End > sub[subtitles.Count - 1].Start) + { + subtitles[subtitles.Count - 2].EndTime = subtitles[subtitles.Count - 1].StartTime - 1; + } + } + clusterStream = new MemoryStream(); + } + } + else if (subtitles.Count > 0) + { + var lastSub = subtitles[subtitles.Count - 1]; + if (lastSub.StartTime == lastSub.EndTime) + { + lastSub.EndTime = (long)((p.Start - 1) * 90.0); + if (lastSub.EndTime - lastSub.StartTime > 1000000) + { + lastSub.EndTime = lastSub.StartTime; + } + } + } + } + + clusterStream.Dispose(); + return subtitles; + } + + private static bool ContainsBluRayStartSegment(byte[] buffer) + { + const int epochStart = 0x80; + var position = 0; + while (position + 3 <= buffer.Length) + { + var segmentType = buffer[position]; + if (segmentType == epochStart) + { + return true; + } + + int length = BluRaySupParser.BigEndianInt16(buffer, position + 1) + 3; + position += length; + } + return false; + } + + private bool CheckSkipFilter(string fileName, SubtitleFormat format, Subtitle sub) + { + bool skip = false; + if (comboBoxFilter.SelectedIndex == 1) + { + if (format != null && format.GetType() == typeof(SubRip) && FileUtil.HasUtf8Bom(fileName)) + { + skip = true; + } + } + else if (comboBoxFilter.SelectedIndex == 2) + { + skip = true; + foreach (Paragraph p in sub.Paragraphs) + { + if (p.Text != null && Utilities.GetNumberOfLines(p.Text) > 2) + { + skip = false; + break; + } + } + } + else if (comboBoxFilter.SelectedIndex == 3 && !string.IsNullOrWhiteSpace(textBoxFilter.Text)) + { + skip = true; + foreach (Paragraph p in sub.Paragraphs) + { + if (p.Text != null && p.Text.Contains(textBoxFilter.Text, StringComparison.Ordinal)) + { + skip = false; + break; + } + } + } + return skip; + } + + private void IncrementAndShowProgress() + { + if (progressBar1.Value < progressBar1.Maximum) + { + progressBar1.Value++; + } + else + { + progressBar1.Value = progressBar1.Maximum; + } + progressBar1.Refresh(); + + TaskbarList.SetProgressValue(Handle, progressBar1.Value, progressBar1.Maximum); + labelStatus.Text = progressBar1.Value + " / " + progressBar1.Maximum; + if (progressBar1.Value == progressBar1.Maximum) + { + labelStatus.Text = string.Empty; + } + + Application.DoEvents(); + } + + private static void DoThreadWork(object sender, DoWorkEventArgs e) + { + var p = (ThreadDoWorkParameter)e.Argument; + var mode = Configuration.Settings.Tools.BatchConvertFixRtlMode; + + ApplyFixesStep2(p, mode); + + e.Result = p; + } + + private static void ApplyFixesStep2(ThreadDoWorkParameter p, string mode) + { + if (p.FixRtl && mode == RemoveUnicode) + { + for (int i = 0; i < p.Subtitle.Paragraphs.Count; i++) + { + var paragraph = p.Subtitle.Paragraphs[i]; + paragraph.Text = Utilities.RemoveUnicodeControlChars(paragraph.Text); + } + } + + if (p.FixCommonErrors) + { + try + { + using (var fixCommonErrors = new FixCommonErrors { BatchMode = true }) + { + var l = Configuration.Settings.Tools.BatchConvertLanguage; + if (string.IsNullOrEmpty(l)) + { + l = LanguageAutoDetect.AutoDetectGoogleLanguage(p.Subtitle); + } + + for (int i = 0; i < 3; i++) + { + fixCommonErrors.RunBatch(p.Subtitle, p.Format, p.Encoding.Encoding, l); + p.Subtitle = fixCommonErrors.FixedSubtitle; + } + } + } + catch (Exception exception) + { + p.Error = string.Format(Configuration.Settings.Language.BatchConvert.FixCommonErrorsErrorX, exception.Message); + } + } + + if (p.MultipleReplaceActive) + { + try + { + using (var form = new MultipleReplace()) + { + form.RunFromBatch(p.Subtitle); + p.Subtitle = form.FixedSubtitle; + p.Subtitle.RemoveParagraphsByIndices(form.DeleteIndices); + } + } + catch (Exception exception) + { + p.Error = string.Format(Configuration.Settings.Language.BatchConvert.MultipleReplaceErrorX, exception.Message); + } + } + + if (p.SplitLongLinesActive) + { + try + { + p.Subtitle = SplitLongLinesHelper.SplitLongLinesInSubtitle(p.Subtitle, Configuration.Settings.General.SubtitleLineMaximumLength * 2, Configuration.Settings.General.SubtitleLineMaximumLength); + } + catch (Exception exception) + { + p.Error = string.Format(Configuration.Settings.Language.BatchConvert.AutoBalanceErrorX, exception.Message); + } + } + + if (p.AutoBalanceActive) + { + try + { + var l = LanguageAutoDetect.AutoDetectGoogleLanguageOrNull(p.Subtitle); + foreach (var paragraph in p.Subtitle.Paragraphs) + { + paragraph.Text = Utilities.AutoBreakLine(paragraph.Text, l ?? p.Language); + } + } + catch (Exception exception) + { + p.Error = string.Format(Configuration.Settings.Language.BatchConvert.AutoBalanceErrorX, exception.Message); + } + } + + if (p.SetMinDisplayTimeBetweenSubtitles) + { + double minimumMillisecondsBetweenLines = Configuration.Settings.General.MinimumMillisecondsBetweenLines; + for (int i = 0; i < p.Subtitle.Paragraphs.Count - 1; i++) + { + var current = p.Subtitle.GetParagraphOrDefault(i); + var next = p.Subtitle.GetParagraphOrDefault(i + 1); + var gapsBetween = next.StartTime.TotalMilliseconds - current.EndTime.TotalMilliseconds; + if (gapsBetween < minimumMillisecondsBetweenLines && current.Duration.TotalMilliseconds > minimumMillisecondsBetweenLines) + { + current.EndTime.TotalMilliseconds -= (minimumMillisecondsBetweenLines - gapsBetween); + } + } + } + + if (p.FixRtl && mode == ReverseStartEnd) + { + for (int i = 0; i < p.Subtitle.Paragraphs.Count; i++) + { + var paragraph = p.Subtitle.Paragraphs[i]; + paragraph.Text = Utilities.ReverseStartAndEndingForRightToLeft(paragraph.Text); + } + } + else if (p.FixRtl && mode == AddUnicode) // fix with unicode char + { + for (int i = 0; i < p.Subtitle.Paragraphs.Count; i++) + { + var paragraph = p.Subtitle.Paragraphs[i]; + paragraph.Text = Utilities.FixRtlViaUnicodeChars(paragraph.Text); + } + } + + // always re-number + p.Subtitle.Renumber(); + } + + private void ThreadWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) + { + CommandLineConverter.BatchConvertProgress progressCallback = null; + var p = (ThreadDoWorkParameter)e.Result; + if (p.Item.Index + 2 < listViewInputFiles.Items.Count) + { + listViewInputFiles.EnsureVisible(p.Item.Index + 2); + } + else + { + listViewInputFiles.EnsureVisible(p.Item.Index); + } + + if (!string.IsNullOrEmpty(p.Error)) + { + p.Item.SubItems[3].Text = p.Error; + } + else + { + if (p.SourceFormat == null) + { + var ext = Path.GetExtension(p.FileName); + if (ext != null && + (ext.Equals(".ts", StringComparison.OrdinalIgnoreCase) || + ext.Equals(".m2ts", StringComparison.OrdinalIgnoreCase) || + ext.Equals(".mts", StringComparison.OrdinalIgnoreCase) || + ext.Equals(".mpg", StringComparison.OrdinalIgnoreCase) || + ext.Equals(".mpeg", StringComparison.OrdinalIgnoreCase)) && + (FileUtil.IsTransportStream(p.FileName) || FileUtil.IsM2TransportStream(p.FileName))) + { + IncrementAndShowProgress(); + return; + } + + p.SourceFormat = new SubRip(); + } + + if (p.ToFormat == Ebu.NameOfFormat) + { + p.Subtitle.Header = _ebuGeneralInformation.ToString(); + } + + var targetFormat = p.ToFormat; + if (targetFormat == Configuration.Settings.Language.ExportCustomText.Title) + { + targetFormat = "CustomText:" + _customTextTemplate; + } + + try + { + var binaryParagraphs = new List(); + if (p.FileName != null && !p.Subtitle.Paragraphs.Any(s => !string.IsNullOrEmpty(s.Text)) && + p.FileName.EndsWith(".sup", StringComparison.OrdinalIgnoreCase) && + FileUtil.IsBluRaySup(p.FileName) && AllowImageToImage()) + { + binaryParagraphs = BluRaySupParser.ParseBluRaySup(p.FileName, new StringBuilder()).Cast().ToList(); + } + else if (p.FileName != null && _bdLookup.ContainsKey(p.FileName)) + { + binaryParagraphs = _bdLookup[p.FileName].Cast().ToList(); + } + var dir = textBoxOutputFolder.Text; + var overwrite = checkBoxOverwrite.Checked; + if (radioButtonSaveInSourceFolder.Checked) + { + dir = Path.GetDirectoryName(p.FileName); + } + var success = CommandLineConverter.BatchConvertSave(targetFormat, TimeSpan.Zero, GetCurrentEncoding(p.FileName), dir, _count, ref _converted, ref _errors, _allFormats, p.FileName, p.Subtitle, p.SourceFormat, binaryParagraphs, overwrite, -1, null, null, null, null, false, progressCallback); + if (success) + { + p.Item.SubItems[3].Text = Configuration.Settings.Language.BatchConvert.Converted; + } + else + { + p.Item.SubItems[3].Text = Configuration.Settings.Language.BatchConvert.NotConverted + " " + p.Item.SubItems[3].Text.Trim('-').Trim(); + } + } + catch (Exception exception) + { + p.Error = $"Save: {exception.InnerException?.Message ?? exception.Message}"; + p.Item.SubItems[3].Text = p.Error; + } + + IncrementAndShowProgress(); + } + } + + private void ComboBoxSubtitleFormatsSelectedIndexChanged(object sender, EventArgs e) + { + checkBoxUseStyleFromSource.Visible = false; + if (comboBoxSubtitleFormats.Text == AdvancedSubStationAlpha.NameOfFormat || comboBoxSubtitleFormats.Text == SubStationAlpha.NameOfFormat) + { + buttonStyles.Text = Configuration.Settings.Language.BatchConvert.Style; + buttonStyles.Visible = true; + comboBoxEncoding.Enabled = true; + buttonBrowseEncoding.Visible = true; + checkBoxUseStyleFromSource.Visible = true; + checkBoxUseStyleFromSource.Left = buttonStyles.Left + buttonStyles.Width - checkBoxUseStyleFromSource.Width; + } + else if (comboBoxSubtitleFormats.Text == Ebu.NameOfFormat) + { + buttonStyles.Text = Configuration.Settings.Language.BatchConvert.Settings; + buttonStyles.Visible = true; + if (_ebuGeneralInformation == null) + { + _ebuGeneralInformation = new Ebu.EbuGeneralSubtitleInformation(); + } + + comboBoxEncoding.Enabled = true; + buttonBrowseEncoding.Visible = true; + } + else if (comboBoxSubtitleFormats.Text == BluRaySubtitle || + comboBoxSubtitleFormats.Text == VobSubSubtitle || + comboBoxSubtitleFormats.Text == DostImageSubtitle || + comboBoxSubtitleFormats.Text == BdnXmlSubtitle || + comboBoxSubtitleFormats.Text == FcpImageSubtitle || + comboBoxSubtitleFormats.Text == Configuration.Settings.Language.ExportCustomText.Title) + { + buttonStyles.Text = Configuration.Settings.Language.BatchConvert.Settings; + buttonStyles.Visible = true; + comboBoxEncoding.Enabled = false; + buttonBrowseEncoding.Visible = false; + } + else if (comboBoxSubtitleFormats.Text == Configuration.Settings.Language.BatchConvert.PlainText) + { + buttonStyles.Text = Configuration.Settings.Language.BatchConvert.Settings; + buttonStyles.Visible = true; + comboBoxEncoding.Enabled = true; + buttonBrowseEncoding.Visible = true; + } + else + { + buttonStyles.Visible = false; + comboBoxEncoding.Enabled = true; + buttonBrowseEncoding.Visible = true; + } + } + + private void ButtonStylesClick(object sender, EventArgs e) + { + if (comboBoxSubtitleFormats.Text == AdvancedSubStationAlpha.NameOfFormat || comboBoxSubtitleFormats.Text == SubStationAlpha.NameOfFormat) + { + ShowAssSsaStyles(); + } + else if (comboBoxSubtitleFormats.Text == Ebu.NameOfFormat) + { + ShowEbuSettings(); + } + else if (comboBoxSubtitleFormats.Text == BluRaySubtitle) + { + ImageExportSettings(ExportPngXml.ExportFormats.BluraySup); + } + else if (comboBoxSubtitleFormats.Text == VobSubSubtitle) + { + ImageExportSettings(ExportPngXml.ExportFormats.VobSub); + } + else if (comboBoxSubtitleFormats.Text == DostImageSubtitle) + { + ImageExportSettings(ExportPngXml.ExportFormats.Dost); + } + else if (comboBoxSubtitleFormats.Text == BdnXmlSubtitle) + { + ImageExportSettings(ExportPngXml.ExportFormats.BdnXml); + } + else if (comboBoxSubtitleFormats.Text == FcpImageSubtitle) + { + ImageExportSettings(ExportPngXml.ExportFormats.Fcp); + } + else if (comboBoxSubtitleFormats.Text == Configuration.Settings.Language.BatchConvert.PlainText) + { + using (var form = new ExportText()) + { + var s = new Subtitle(); + s.Paragraphs.Add(new Paragraph("Test 123." + Environment.NewLine + "Test 456.", 0, 4000)); + s.Paragraphs.Add(new Paragraph("Test 789.", 5000, 9000)); + form.Initialize(s, null); + form.PrepareForBatchSettings(); + form.ShowDialog(this); + } + } + else if (comboBoxSubtitleFormats.Text == Configuration.Settings.Language.ExportCustomText.Title) + { + ShowExportCustomTextSettings(); + } + } + + private void ShowExportCustomTextSettings() + { + var s = new Subtitle(); + s.Paragraphs.Add(new Paragraph("Test 123." + Environment.NewLine + "Test 456.", 0, 4000)); + s.Paragraphs.Add(new Paragraph("Test 777." + Environment.NewLine + "Test 888.", 0, 4000)); + using (var properties = new ExportCustomText(s, null, "Test")) + { + properties.InitializeForBatchConvert(_customTextTemplate); + if (properties.ShowDialog(this) == DialogResult.OK) + { + _customTextTemplate = properties.CurrentFormatName; + } + } + } + + private void ImageExportSettings(string format) + { + using (var properties = new ExportPngXml()) + { + var s = new Subtitle(); + s.Paragraphs.Add(new Paragraph("Test 123." + Environment.NewLine + "Test 456.", 0, 4000)); + properties.Initialize(s, new SubRip(), format, null, null, null); + properties.DisableSaveButtonAndCheckBoxes(); + properties.ShowDialog(this); + } + } + + private void ShowEbuSettings() + { + using (var properties = new EbuSaveOptions()) + { + properties.Initialize(_ebuGeneralInformation, 0, null, null); + properties.ShowDialog(this); + } + } + + private void ShowAssSsaStyles() + { + SubStationAlphaStylesBatchConvert form = null; + try + { + var assa = new AdvancedSubStationAlpha(); + var sub = new Subtitle(); + if (comboBoxSubtitleFormats.Text == assa.Name) + { + if (!string.IsNullOrEmpty(_assStyle)) + { + sub.Header = _assStyle; + } + form = new SubStationAlphaStylesBatchConvert(sub, assa); + if (form.ShowDialog(this) == DialogResult.OK) + { + _assStyle = form.Header; + } + } + else + { + if (!string.IsNullOrEmpty(_ssaStyle)) + { + sub.Header = _ssaStyle; + } + var ssa = new SubStationAlpha(); + if (comboBoxSubtitleFormats.Text == ssa.Name) + { + form = new SubStationAlphaStylesBatchConvert(sub, ssa); + if (form.ShowDialog(this) == DialogResult.OK) + { + _ssaStyle = form.Header; + } + } + } + } + finally + { + form?.Dispose(); + } + } + + private void ContextMenuStripFilesOpening(object sender, CancelEventArgs e) + { + if (_converting) + { + e.Cancel = true; + return; + } + removeToolStripMenuItem.Visible = listViewInputFiles.SelectedItems.Count > 0; + openContainingFolderToolStripMenuItem.Visible = listViewInputFiles.SelectedItems.Count == 1; + removeAllToolStripMenuItem.Visible = listViewInputFiles.Items.Count > 0; + toolStripSeparator1.Visible = listViewInputFiles.Items.Count > 0; + } + + private void RemoveAllToolStripMenuItemClick(object sender, EventArgs e) + { + listViewInputFiles.Items.Clear(); + UpdateNumberOfFiles(); + UpdateTransportStreamSettings(); + } + + private void RemoveSelectedFiles() + { + if (_converting) + { + return; + } + + int first = -1; + for (int i = listViewInputFiles.SelectedIndices.Count - 1; i >= 0; i--) + { + if (first < 0) + { + first = listViewInputFiles.SelectedIndices[i]; + } + listViewInputFiles.Items.RemoveAt(listViewInputFiles.SelectedIndices[i]); + } + + // keep an item selected/focused for improved UX + if (first < listViewInputFiles.Items.Count && listViewInputFiles.Items.Count > 0) + { + listViewInputFiles.Items[first].Selected = true; + listViewInputFiles.FocusedItem = listViewInputFiles.Items[first]; + } + else if (listViewInputFiles.Items.Count > 0) + { + listViewInputFiles.Items[listViewInputFiles.Items.Count - 1].Selected = true; + listViewInputFiles.FocusedItem = listViewInputFiles.Items[listViewInputFiles.Items.Count - 1]; + } + UpdateNumberOfFiles(); + UpdateTransportStreamSettings(); + } + + private void RemoveToolStripMenuItemClick(object sender, EventArgs e) + { + RemoveSelectedFiles(); + } + + private void UpdateTransportStreamSettings() + { + bool hasTransportStream = false; + foreach (ListViewItem lvi in listViewInputFiles.Items) + { + if (lvi.SubItems[2].Text.Equals("Transport Stream", StringComparison.OrdinalIgnoreCase)) + { + hasTransportStream = true; + break; + } + } + + buttonTransportStreamSettings.Visible = hasTransportStream; + } + + private void ListViewInputFilesKeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Delete) + { + RemoveSelectedFiles(); + } + else if (e.KeyCode == Keys.A && e.Modifiers == Keys.Control) + { + listViewInputFiles.SelectAll(); + e.SuppressKeyPress = true; + } + else if (e.KeyCode == Keys.D && e.Modifiers == Keys.Control) + { + listViewInputFiles.SelectFirstSelectedItemOnly(); + e.SuppressKeyPress = true; + } + else if (e.KeyCode == Keys.I && e.Modifiers == (Keys.Control | Keys.Shift)) //InverseSelection + { + listViewInputFiles.InverseSelection(); + e.SuppressKeyPress = true; + } + } + + private void BatchConvert_FormClosing(object sender, FormClosingEventArgs e) + { + if (_converting) + { + e.Cancel = true; + return; + } + if (_searching) + { + _abort = true; + } + + Configuration.Settings.Tools.BatchConvertFixCasing = IsActionEnabled(CommandLineConverter.BatchAction.RedoCasing); + Configuration.Settings.Tools.BatchConvertFixCommonErrors = IsActionEnabled(CommandLineConverter.BatchAction.FixCommonErrors); + Configuration.Settings.Tools.BatchConvertMultipleReplace = IsActionEnabled(CommandLineConverter.BatchAction.MultipleReplace); + Configuration.Settings.Tools.BatchConvertFixRtl = IsActionEnabled(CommandLineConverter.BatchAction.FixRtl); + Configuration.Settings.Tools.BatchConvertSplitLongLines = IsActionEnabled(CommandLineConverter.BatchAction.SplitLongLines); + Configuration.Settings.Tools.BatchConvertAutoBalance = IsActionEnabled(CommandLineConverter.BatchAction.BalanceLines); + Configuration.Settings.Tools.BatchConvertRemoveFormatting = IsActionEnabled(CommandLineConverter.BatchAction.RemoveFormatting); + Configuration.Settings.Tools.BatchConvertBridgeGaps = IsActionEnabled(CommandLineConverter.BatchAction.BridgeGaps); + Configuration.Settings.Tools.BatchConvertRemoveTextForHI = IsActionEnabled(CommandLineConverter.BatchAction.RemoveTextForHI); + Configuration.Settings.Tools.BatchConvertSetMinDisplayTimeBetweenSubtitles = IsActionEnabled(CommandLineConverter.BatchAction.SetMinGap); + Configuration.Settings.Tools.BatchConvertOutputFolder = textBoxOutputFolder.Text; + Configuration.Settings.Tools.BatchConvertOverwriteExisting = checkBoxOverwrite.Checked; + Configuration.Settings.Tools.BatchConvertFormat = comboBoxSubtitleFormats.SelectedItem.ToString(); + Configuration.Settings.Tools.BatchConvertAssStyles = _assStyle; + Configuration.Settings.Tools.BatchConvertSsaStyles = _ssaStyle; + Configuration.Settings.Tools.BatchConvertUseStyleFromSource = checkBoxUseStyleFromSource.Checked; + Configuration.Settings.Tools.BatchConvertExportCustomTextTemplate = _customTextTemplate; + Configuration.Settings.Tools.BatchConvertSaveInSourceFolder = radioButtonSaveInSourceFolder.Checked; + Configuration.Settings.Tools.BatchConvertMergeShortLines = IsActionEnabled(CommandLineConverter.BatchAction.MergeShortLines); + Configuration.Settings.Tools.BatchConvertRemoveLineBreaks = IsActionEnabled(CommandLineConverter.BatchAction.RemoveLineBreaks); + Configuration.Settings.Tools.BatchConvertMergeSameText = IsActionEnabled(CommandLineConverter.BatchAction.MergeSameTexts); + Configuration.Settings.Tools.BatchConvertMergeSameTimeCodes = IsActionEnabled(CommandLineConverter.BatchAction.MergeSameTimeCodes); + Configuration.Settings.Tools.BatchConvertChangeSpeed = IsActionEnabled(CommandLineConverter.BatchAction.ChangeSpeed); + Configuration.Settings.Tools.BatchConvertChangeFrameRate = IsActionEnabled(CommandLineConverter.BatchAction.ChangeFrameRate); + Configuration.Settings.Tools.BatchConvertOffsetTimeCodes = IsActionEnabled(CommandLineConverter.BatchAction.OffsetTimeCodes); + Configuration.Settings.Tools.BatchConvertApplyDurationLimits = IsActionEnabled(CommandLineConverter.BatchAction.ApplyDurationLimits); + Configuration.Settings.Tools.MergeShortLinesMaxGap = (int)numericUpDownMaxMillisecondsBetweenLines.Value; + Configuration.Settings.Tools.MergeShortLinesOnlyContinuous = checkBoxOnlyContinuationLines.Checked; + + UpdateRtlSettings(); + } + + private void UpdateRtlSettings() + { + if (radioButtonRemoveUnicode.Checked) + { + Configuration.Settings.Tools.BatchConvertFixRtlMode = RemoveUnicode; + } + else if (radioButtonReverseStartEnd.Checked) + { + Configuration.Settings.Tools.BatchConvertFixRtlMode = ReverseStartEnd; + } + else + { + Configuration.Settings.Tools.BatchConvertFixRtlMode = AddUnicode; + } + } + + private string _rootFolder; + private void buttonSearchFolder_Click(object sender, EventArgs e) + { + folderBrowserDialog1.ShowNewFolderButton = false; + folderBrowserDialog1.SelectedPath = _rootFolder; + if (folderBrowserDialog1.ShowDialog(this) == DialogResult.OK) + { + listViewInputFiles.BeginUpdate(); + progressBar1.Style = ProgressBarStyle.Marquee; + progressBar1.Visible = true; + SetControlState(false); + labelStatus.Text = string.Empty; + + SearchFolder(folderBrowserDialog1.SelectedPath); + _rootFolder = folderBrowserDialog1.SelectedPath; + + labelStatus.Text = string.Empty; + + SetControlState(true); + listViewInputFiles.EndUpdate(); + } + progressBar1.Value = 0; + progressBar1.Visible = false; + UpdateNumberOfFiles(); + } + + private void SetControlState(bool enabled) + { + labelStatus.Text = string.Empty; + buttonCancel.Enabled = enabled; + groupBoxOutput.Enabled = enabled; + groupBoxConvertOptions.Enabled = enabled; + buttonInputBrowse.Enabled = enabled; + buttonSearchFolder.Enabled = enabled; + checkBoxScanFolderRecursive.Enabled = enabled; + comboBoxFilter.Enabled = enabled; + + if (enabled) + { + buttonConvert.Text = Configuration.Settings.Language.BatchConvert.Convert; + } + else + { + buttonConvert.Text = Configuration.Settings.Language.General.Cancel; + } + } + + private void SearchFolder(string path) + { + _abort = false; + _searching = true; + try + { + if (checkBoxScanFolderRecursive.Checked) + { + ScanFiles(Directory.EnumerateFiles(path, "*", SearchOption.AllDirectories)); + } + else + { + ScanFiles(Directory.EnumerateFiles(path)); + } + } + finally + { + _searching = false; + } + } + + private static readonly HashSet SearchExtBlackList = new HashSet + { + ".png", + ".jpg", + ".jpeg", + ".tif", + ".tiff", + ".gif", + ".bmp", + ".clpi", + ".mpls", + ".wav", + ".mp3", + ".avi", + ".mpeg", + ".mpg", + ".tar", + ".docx", + ".pptx", + ".xlsx", + ".odt", + ".tex", + ".pdf", + ".dll", + ".exe", + ".rar", + ".7z", + ".zip", + ".tar" + }; + + private void ScanFiles(IEnumerable fileNames) + { + foreach (string fileName in fileNames) + { + labelStatus.Text = fileName; + try + { + string ext = Path.GetExtension(fileName).ToLowerInvariant(); + if (!SearchExtBlackList.Contains(ext)) + { + labelStatus.Refresh(); + var fi = new FileInfo(fileName); + if (comboBoxFilter.SelectedIndex == 4 && textBoxFilter.Text.Length > 0 && !fileName.Contains(textBoxFilter.Text, StringComparison.OrdinalIgnoreCase)) + { + // skip + } + else if (ext == ".sub" && FileUtil.IsVobSub(fileName)) + { + AddFromSearch(fileName, fi, "VobSub"); + } + else if (ext == ".sup" && FileUtil.IsBluRaySup(fileName)) + { + AddFromSearch(fileName, fi, "Blu-ray"); + } + else if (ext == ".mkv") + { + // skip for now + } + else if (ext == ".mks") + { + // skip for now + } + else if (ext == ".mp4") + { + // skip for now + } + else + { + if (fi.Length < ConvertMaxFileSize) + { + var sub = new Subtitle(); + var enc = LanguageAutoDetect.GetEncodingFromFile(fileName, true); + var format = sub.LoadSubtitle(fileName, out _, enc, true, null, false); + if (format == null) + { + foreach (var f in SubtitleFormat.GetBinaryFormats(true)) + { + if (f.IsMine(null, fileName)) + { + f.LoadSubtitle(sub, null, fileName); + format = f; + break; + } + } + } + + if (format == null) + { + var lines = FileUtil.ReadAllTextShared(fileName, enc).SplitToLines(); + foreach (var f in SubtitleFormat.GetTextOtherFormats()) + { + if (f.IsMine(lines, fileName)) + { + f.LoadSubtitle(sub, lines, fileName); + format = f; + break; + } + } + } + + if (format != null) + { + AddFromSearch(fileName, fi, format.Name); + } + } + } + progressBar1.Refresh(); + Application.DoEvents(); + if (_abort) + { + progressBar1.Value = 0; + progressBar1.Visible = false; + return; + } + } + } + catch + { + // ignored + } + } + } + + private void AddFromSearch(string fileName, FileInfo fi, string nameOfFormat) + { + var item = new ListViewItem(fileName); + item.SubItems.Add(Utilities.FormatBytesToDisplayFileSize(fi.Length)); + item.SubItems.Add(nameOfFormat); + item.SubItems.Add("-"); + listViewInputFiles.Items.Add(item); + UpdateNumberOfFiles(); + } + + private void BatchConvert_KeyDown(object sender, KeyEventArgs e) + { + if (_converting || _searching) + { + if (e.KeyCode == Keys.Escape) + { + _abort = true; + e.SuppressKeyPress = true; + } + } + else if (e.KeyCode == Keys.Escape) + { + Close(); + } + else if (e.KeyData == (Keys.Control | Keys.O)) // Open file/s + { + buttonInputBrowse_Click(null, EventArgs.Empty); + } + } + + private void comboBoxFilter_SelectedIndexChanged(object sender, EventArgs e) + { + textBoxFilter.Visible = comboBoxFilter.SelectedIndex == 3 || comboBoxFilter.SelectedIndex == 4 || comboBoxFilter.SelectedIndex == 5; + } + + private void buttonTransportStreamSettings_Click(object sender, EventArgs e) + { + using (var form = new BatchConvertTsSettings()) + { + form.ShowDialog(this); + } + } + + private void radioButtonSaveInSourceFolder_CheckedChanged(object sender, EventArgs e) + { + textBoxOutputFolder.Enabled = false; + buttonChooseFolder.Enabled = false; + } + + private void radioButtonSaveInOutputFolder_CheckedChanged(object sender, EventArgs e) + { + textBoxOutputFolder.Enabled = true; + buttonChooseFolder.Enabled = true; + } + + private void linkLabelOpenOutputFolder_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + if (Directory.Exists(textBoxOutputFolder.Text)) + { + UiUtil.OpenFolder(textBoxOutputFolder.Text); + } + else + { + MessageBox.Show(string.Format(Configuration.Settings.Language.SplitSubtitle.FolderNotFoundX, textBoxOutputFolder.Text)); + } + } + + private void buttonChooseFolder_Click(object sender, EventArgs e) + { + folderBrowserDialog1.ShowNewFolderButton = true; + if (folderBrowserDialog1.ShowDialog() == DialogResult.OK) + { + textBoxOutputFolder.Text = folderBrowserDialog1.SelectedPath; + } + } + + private void listViewConvertOptions_SelectedIndexChanged(object sender, EventArgs e) + { + groupBoxMergeShortLines.Visible = false; + groupBoxChangeFrameRate.Visible = false; + groupBoxSpeed.Visible = false; + groupBoxOffsetTimeCodes.Visible = false; + buttonConvertOptionsSettings.Visible = false; + groupBoxFixRtl.Visible = false; + groupBoxChangeCasing.Visible = false; + groupBoxRemoveStyle.Visible = false; + groupBoxAdjustDuration.Visible = false; + if (listViewConvertOptions.SelectedIndices.Count != 1) + { + return; + } + + var idx = listViewConvertOptions.SelectedIndices[0]; + var fixItem = listViewConvertOptions.Items[idx].Tag as FixActionItem; + if (fixItem?.Control != null) + { + fixItem.Control.Top = listViewConvertOptions.Top; + fixItem.Control.Visible = true; + fixItem.Control.BringToFront(); + if (fixItem.Control is GroupBox groupBox) + { + groupBox.Height = listViewConvertOptions.Height; + } + } + } + + private void ButtonOptionConvertSettings(object sender, EventArgs e) + { + if (listViewConvertOptions.SelectedIndices.Count != 1) + { + return; + } + var idx = listViewConvertOptions.SelectedIndices[0]; + var fixItem = listViewConvertOptions.Items[idx].Tag as FixActionItem; + if (fixItem.Action == CommandLineConverter.BatchAction.RemoveTextForHI) + { + using (var form = new FormRemoveTextForHearImpaired(null, new Subtitle())) + { + form.InitializeSettingsOnly(); + form.ShowDialog(this); + _removeTextForHiSettings = form.GetSettings(new Subtitle()); + } + } + else if (fixItem.Action == CommandLineConverter.BatchAction.FixCommonErrors) + { + using (var form = new FixCommonErrors { BatchMode = true }) + { + form.RunBatchSettings(new Subtitle(), GetCurrentSubtitleFormat(), GetCurrentEncoding(null), Configuration.Settings.Tools.BatchConvertLanguage); + form.ShowDialog(this); + Configuration.Settings.Tools.BatchConvertLanguage = form.Language; + } + } + else if (fixItem.Action == CommandLineConverter.BatchAction.BridgeGaps) + { + _bridgeGaps.ShowDialog(this); + } + else if (fixItem.Action == CommandLineConverter.BatchAction.MultipleReplace) + { + using (var form = new MultipleReplace()) + { + form.Initialize(new Subtitle()); + form.ShowDialog(this); + } + } + } + + private void buttonSwapFrameRate_Click(object sender, EventArgs e) + { + string oldFrameRate = comboBoxFrameRateFrom.Text; + string newFrameRate = comboBoxFrameRateTo.Text; + + comboBoxFrameRateFrom.Text = newFrameRate; + comboBoxFrameRateTo.Text = oldFrameRate; + } + + private void listViewConvertOptions_ItemChecked(object sender, ItemCheckedEventArgs e) + { + var count = listViewConvertOptions.CheckedItems.Count; + if (count > 0) + { + groupBoxConvertOptions.Text = Configuration.Settings.Language.BatchConvert.ConvertOptions + " " + count; + } + else + { + groupBoxConvertOptions.Text = Configuration.Settings.Language.BatchConvert.ConvertOptions; + } + } + + private void toolStripMenuItemSelectAll_Click(object sender, EventArgs e) + { + foreach (ListViewItem item in listViewConvertOptions.Items) + { + item.Checked = true; + } + } + + private void inverseSelectionToolStripMenuItem_Click(object sender, EventArgs e) + { + foreach (ListViewItem item in listViewConvertOptions.Items) + { + item.Checked = !item.Checked; + } + } + + private void listViewInputFiles_ColumnClick(object sender, ColumnClickEventArgs e) + { + if (_converting) + { + return; + } + + var sorter = (ListViewSorter)listViewInputFiles.ListViewItemSorter; + if (sorter == null) + { + sorter = new ListViewSorter + { + ColumnNumber = e.Column, + IsNumber = false, + IsDisplayFileSize = e.Column == columnHeaderSize.DisplayIndex + }; + listViewInputFiles.ListViewItemSorter = sorter; + } + + if (e.Column == sorter.ColumnNumber) + { + sorter.Descending = !sorter.Descending; // inverse sort direction + } + else + { + sorter.ColumnNumber = e.Column; + sorter.Descending = false; + sorter.IsNumber = false; + sorter.IsDisplayFileSize = e.Column == columnHeaderSize.DisplayIndex; + } + listViewInputFiles.Sort(); + } + + private void buttonBrowseEncoding_Click(object sender, EventArgs e) + { + openFileDialog1.Title = Configuration.Settings.Language.Main.OpenAnsiSubtitle; + openFileDialog1.FileName = string.Empty; + openFileDialog1.Filter = UiUtil.SubtitleExtensionFilter.Value; + if (openFileDialog1.ShowDialog(this) == DialogResult.OK) + { + using (var chooseEncoding = new ChooseEncoding()) + { + chooseEncoding.Initialize(openFileDialog1.FileName); + if (chooseEncoding.ShowDialog(this) == DialogResult.OK) + { + var encoding = chooseEncoding.GetEncoding(); + for (var i = 0; i < comboBoxEncoding.Items.Count; i++) + { + var item = comboBoxEncoding.Items[i]; + if (item is TextEncoding te) + { + if (te.Encoding.WebName == encoding.WebName) + { + comboBoxEncoding.SelectedIndex = i; + break; + } + } + } + } + } + } + } + + private void UpdateNumberOfFiles() + { + if (listViewInputFiles.Items.Count > 0) + { + labelNumberOfFiles.Text = $"{listViewInputFiles.Items.Count:#,###,##0}"; + } + else + { + labelNumberOfFiles.Text = string.Empty; + } + } + + private void openContainingFolderToolStripMenuItem_Click(object sender, EventArgs e) + { + if (_converting || listViewInputFiles.SelectedIndices.Count != 1) + { + return; + } + + int idx = listViewInputFiles.SelectedIndices[0]; + var fileName = listViewInputFiles.Items[idx].Text; + UiUtil.OpenFolderFromFileName(fileName); + } + + private void convertMkvThreeLetterLanguageCodesToTwoLettersToolStripMenuItem_Click(object sender, EventArgs e) + { + using (var form = new BatchConvertMkvEnding { LanguageCodeStyle = Configuration.Settings.Tools.BatchConvertMkvLanguageCodeStyle }) + { + var result = form.ShowDialog(this); + if (result == DialogResult.OK) + { + Configuration.Settings.Tools.BatchConvertMkvLanguageCodeStyle = form.LanguageCodeStyle; + SetMkvLanguageMenuItem(); + } + } + } + + private void comboBoxAdjustDurationVia_SelectedIndexChanged(object sender, EventArgs e) + { + panelAdjustDurationAddSeconds.Visible = false; + panelAdjustDurationAddPercent.Visible = false; + panelAdjustDurationFixed.Visible = false; + panelAdjustDurationRecalc.Visible = false; + + var panel = panelAdjustDurationAddSeconds; + if (comboBoxAdjustDurationVia.SelectedIndex == 1) + { + panel = panelAdjustDurationAddPercent; + } + else if (comboBoxAdjustDurationVia.SelectedIndex == 2) + { + panel = panelAdjustDurationRecalc; + } + else if (comboBoxAdjustDurationVia.SelectedIndex == 3) + { + panel = panelAdjustDurationFixed; + } + + panel.Visible = true; + panel.Left = 2; + panel.Top = labelAdjustDurationVia.Top + labelAdjustDurationVia.Height + 9; + } + + private void addFilesToolStripMenuItem_Click(object sender, EventArgs e) + { + buttonInputBrowse_Click(sender, e); + } + } +} diff --git a/src/Forms/BatchConvert.resx b/src/ui/Forms/BatchConvert.resx similarity index 98% rename from src/Forms/BatchConvert.resx rename to src/ui/Forms/BatchConvert.resx index a1362bcb4..cd4d0f5df 100644 --- a/src/Forms/BatchConvert.resx +++ b/src/ui/Forms/BatchConvert.resx @@ -1,132 +1,132 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 499, 17 - - - 326, 17 - - - 17, 17 - - - 186, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 499, 17 + + + 326, 17 + + + 17, 17 + + + 186, 17 + \ No newline at end of file diff --git a/src/Forms/BatchConvertMkvEnding.Designer.cs b/src/ui/Forms/BatchConvertMkvEnding.Designer.cs similarity index 100% rename from src/Forms/BatchConvertMkvEnding.Designer.cs rename to src/ui/Forms/BatchConvertMkvEnding.Designer.cs diff --git a/src/Forms/BatchConvertMkvEnding.cs b/src/ui/Forms/BatchConvertMkvEnding.cs similarity index 100% rename from src/Forms/BatchConvertMkvEnding.cs rename to src/ui/Forms/BatchConvertMkvEnding.cs diff --git a/src/Forms/ChooseFontName.resx b/src/ui/Forms/BatchConvertMkvEnding.resx similarity index 100% rename from src/Forms/ChooseFontName.resx rename to src/ui/Forms/BatchConvertMkvEnding.resx diff --git a/src/Forms/BatchConvertTsSettings.Designer.cs b/src/ui/Forms/BatchConvertTsSettings.Designer.cs similarity index 100% rename from src/Forms/BatchConvertTsSettings.Designer.cs rename to src/ui/Forms/BatchConvertTsSettings.Designer.cs diff --git a/src/Forms/BatchConvertTsSettings.cs b/src/ui/Forms/BatchConvertTsSettings.cs similarity index 100% rename from src/Forms/BatchConvertTsSettings.cs rename to src/ui/Forms/BatchConvertTsSettings.cs diff --git a/src/Forms/BatchConvertTsSettings.resx b/src/ui/Forms/BatchConvertTsSettings.resx similarity index 100% rename from src/Forms/BatchConvertTsSettings.resx rename to src/ui/Forms/BatchConvertTsSettings.resx diff --git a/src/Forms/Beamer.Designer.cs b/src/ui/Forms/Beamer.Designer.cs similarity index 97% rename from src/Forms/Beamer.Designer.cs rename to src/ui/Forms/Beamer.Designer.cs index 375a0f8ee..5e430ecf6 100644 --- a/src/Forms/Beamer.Designer.cs +++ b/src/ui/Forms/Beamer.Designer.cs @@ -1,363 +1,363 @@ -namespace Nikse.SubtitleEdit.Forms -{ - partial class Beamer - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.groupBoxImageSettings = new System.Windows.Forms.GroupBox(); - this.comboBoxHAlign = new System.Windows.Forms.ComboBox(); - this.labelHorizontalAlign = new System.Windows.Forms.Label(); - this.labelSubtitleFontSize = new System.Windows.Forms.Label(); - this.comboBoxSubtitleFont = new System.Windows.Forms.ComboBox(); - this.comboBoxSubtitleFontSize = new System.Windows.Forms.ComboBox(); - this.labelSubtitleFont = new System.Windows.Forms.Label(); - this.labelBorderWidth = new System.Windows.Forms.Label(); - this.comboBoxBorderWidth = new System.Windows.Forms.ComboBox(); - this.panelBorderColor = new System.Windows.Forms.Panel(); - this.buttonBorderColor = new System.Windows.Forms.Button(); - this.panelColor = new System.Windows.Forms.Panel(); - this.buttonColor = new System.Windows.Forms.Button(); - this.pictureBox1 = new System.Windows.Forms.PictureBox(); - this.buttonStart = new System.Windows.Forms.Button(); - this.colorDialog1 = new System.Windows.Forms.ColorDialog(); - this.timer1 = new System.Windows.Forms.Timer(this.components); - this.groupBoxImageSettings.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); - this.SuspendLayout(); - // - // groupBoxImageSettings - // - this.groupBoxImageSettings.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxImageSettings.Controls.Add(this.comboBoxHAlign); - this.groupBoxImageSettings.Controls.Add(this.labelHorizontalAlign); - this.groupBoxImageSettings.Controls.Add(this.labelSubtitleFontSize); - this.groupBoxImageSettings.Controls.Add(this.comboBoxSubtitleFont); - this.groupBoxImageSettings.Controls.Add(this.comboBoxSubtitleFontSize); - this.groupBoxImageSettings.Controls.Add(this.labelSubtitleFont); - this.groupBoxImageSettings.Controls.Add(this.labelBorderWidth); - this.groupBoxImageSettings.Controls.Add(this.comboBoxBorderWidth); - this.groupBoxImageSettings.Controls.Add(this.panelBorderColor); - this.groupBoxImageSettings.Controls.Add(this.buttonBorderColor); - this.groupBoxImageSettings.Controls.Add(this.panelColor); - this.groupBoxImageSettings.Controls.Add(this.buttonColor); - this.groupBoxImageSettings.Location = new System.Drawing.Point(4, 6); - this.groupBoxImageSettings.Name = "groupBoxImageSettings"; - this.groupBoxImageSettings.Size = new System.Drawing.Size(854, 114); - this.groupBoxImageSettings.TabIndex = 23; - this.groupBoxImageSettings.TabStop = false; - this.groupBoxImageSettings.Text = "Image settings"; - // - // comboBoxHAlign - // - this.comboBoxHAlign.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxHAlign.FormattingEnabled = true; - this.comboBoxHAlign.Items.AddRange(new object[] { - "Left", - "Center", - "Right"}); - this.comboBoxHAlign.Location = new System.Drawing.Point(100, 78); - this.comboBoxHAlign.Name = "comboBoxHAlign"; - this.comboBoxHAlign.Size = new System.Drawing.Size(121, 21); - this.comboBoxHAlign.TabIndex = 25; - this.comboBoxHAlign.SelectedIndexChanged += new System.EventHandler(this.ComboBoxHAlignSelectedIndexChanged); - // - // labelHorizontalAlign - // - this.labelHorizontalAlign.AutoSize = true; - this.labelHorizontalAlign.Location = new System.Drawing.Point(10, 81); - this.labelHorizontalAlign.Name = "labelHorizontalAlign"; - this.labelHorizontalAlign.Size = new System.Drawing.Size(30, 13); - this.labelHorizontalAlign.TabIndex = 24; - this.labelHorizontalAlign.Text = "Align"; - // - // labelSubtitleFontSize - // - this.labelSubtitleFontSize.AutoSize = true; - this.labelSubtitleFontSize.Location = new System.Drawing.Point(10, 54); - this.labelSubtitleFontSize.Name = "labelSubtitleFontSize"; - this.labelSubtitleFontSize.Size = new System.Drawing.Size(84, 13); - this.labelSubtitleFontSize.TabIndex = 20; - this.labelSubtitleFontSize.Text = "Subtitle font size"; - // - // comboBoxSubtitleFont - // - this.comboBoxSubtitleFont.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxSubtitleFont.FormattingEnabled = true; - this.comboBoxSubtitleFont.Location = new System.Drawing.Point(100, 24); - this.comboBoxSubtitleFont.Name = "comboBoxSubtitleFont"; - this.comboBoxSubtitleFont.Size = new System.Drawing.Size(121, 21); - this.comboBoxSubtitleFont.TabIndex = 17; - this.comboBoxSubtitleFont.SelectedIndexChanged += new System.EventHandler(this.ComboBoxSubtitleFontSelectedValueChanged); - // - // comboBoxSubtitleFontSize - // - this.comboBoxSubtitleFontSize.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxSubtitleFontSize.FormattingEnabled = true; - this.comboBoxSubtitleFontSize.Items.AddRange(new object[] { - "10", - "11", - "12", - "13", - "14", - "15", - "16", - "17", - "18", - "19", - "20", - "21", - "22", - "23", - "24", - "25", - "26", - "27", - "28", - "29", - "30", - "31", - "32", - "33", - "34", - "35", - "36", - "37", - "38", - "39", - "40", - "41", - "42", - "43", - "44", - "45", - "46", - "47", - "48", - "49", - "50", - "51", - "52", - "53", - "54", - "55", - "56", - "57", - "58", - "59", - "60", - "61", - "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"}); - this.comboBoxSubtitleFontSize.Location = new System.Drawing.Point(100, 51); - this.comboBoxSubtitleFontSize.Name = "comboBoxSubtitleFontSize"; - this.comboBoxSubtitleFontSize.Size = new System.Drawing.Size(121, 21); - this.comboBoxSubtitleFontSize.TabIndex = 18; - this.comboBoxSubtitleFontSize.SelectedIndexChanged += new System.EventHandler(this.ComboBoxSubtitleFontSizeSelectedIndexChanged); - // - // labelSubtitleFont - // - this.labelSubtitleFont.AutoSize = true; - this.labelSubtitleFont.Location = new System.Drawing.Point(10, 27); - this.labelSubtitleFont.Name = "labelSubtitleFont"; - this.labelSubtitleFont.Size = new System.Drawing.Size(63, 13); - this.labelSubtitleFont.TabIndex = 19; - this.labelSubtitleFont.Text = "Subtitle font"; - // - // labelBorderWidth - // - this.labelBorderWidth.Location = new System.Drawing.Point(426, 56); - this.labelBorderWidth.Name = "labelBorderWidth"; - this.labelBorderWidth.RightToLeft = System.Windows.Forms.RightToLeft.No; - this.labelBorderWidth.Size = new System.Drawing.Size(110, 13); - this.labelBorderWidth.TabIndex = 16; - this.labelBorderWidth.Text = "Border width"; - this.labelBorderWidth.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // comboBoxBorderWidth - // - this.comboBoxBorderWidth.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxBorderWidth.FormattingEnabled = true; - this.comboBoxBorderWidth.Items.AddRange(new object[] { - "0", - "1", - "2", - "3", - "4", - "5"}); - this.comboBoxBorderWidth.Location = new System.Drawing.Point(537, 51); - this.comboBoxBorderWidth.Name = "comboBoxBorderWidth"; - this.comboBoxBorderWidth.Size = new System.Drawing.Size(121, 21); - this.comboBoxBorderWidth.TabIndex = 15; - this.comboBoxBorderWidth.SelectedIndexChanged += new System.EventHandler(this.ComboBoxBorderWidthSelectedIndexChanged); - // - // panelBorderColor - // - this.panelBorderColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.panelBorderColor.Location = new System.Drawing.Point(664, 25); - this.panelBorderColor.Name = "panelBorderColor"; - this.panelBorderColor.Size = new System.Drawing.Size(21, 20); - this.panelBorderColor.TabIndex = 14; - this.panelBorderColor.Click += new System.EventHandler(this.ButtonBorderColorClick); - // - // buttonBorderColor - // - this.buttonBorderColor.Location = new System.Drawing.Point(537, 24); - this.buttonBorderColor.Name = "buttonBorderColor"; - this.buttonBorderColor.Size = new System.Drawing.Size(121, 21); - this.buttonBorderColor.TabIndex = 13; - this.buttonBorderColor.Text = "Border color"; - this.buttonBorderColor.UseVisualStyleBackColor = true; - this.buttonBorderColor.Click += new System.EventHandler(this.ButtonBorderColorClick); - // - // panelColor - // - this.panelColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.panelColor.Location = new System.Drawing.Point(403, 25); - this.panelColor.Name = "panelColor"; - this.panelColor.Size = new System.Drawing.Size(21, 20); - this.panelColor.TabIndex = 12; - this.panelColor.Click += new System.EventHandler(this.ButtonColorClick); - // - // buttonColor - // - this.buttonColor.Location = new System.Drawing.Point(276, 24); - this.buttonColor.Name = "buttonColor"; - this.buttonColor.Size = new System.Drawing.Size(121, 21); - this.buttonColor.TabIndex = 11; - this.buttonColor.Text = "Color"; - this.buttonColor.UseVisualStyleBackColor = true; - this.buttonColor.Click += new System.EventHandler(this.ButtonColorClick); - // - // pictureBox1 - // - this.pictureBox1.Location = new System.Drawing.Point(4, 126); - this.pictureBox1.Name = "pictureBox1"; - this.pictureBox1.Size = new System.Drawing.Size(855, 211); - this.pictureBox1.TabIndex = 22; - this.pictureBox1.TabStop = false; - // - // buttonStart - // - this.buttonStart.Location = new System.Drawing.Point(4, 343); - this.buttonStart.Name = "buttonStart"; - this.buttonStart.Size = new System.Drawing.Size(121, 21); - this.buttonStart.TabIndex = 24; - this.buttonStart.Text = "&Start"; - this.buttonStart.UseVisualStyleBackColor = true; - this.buttonStart.Click += new System.EventHandler(this.ButtonStartClick); - // - // timer1 - // - this.timer1.Interval = 25; - this.timer1.Tick += new System.EventHandler(this.Timer1Tick); - // - // Beamer - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(862, 376); - this.Controls.Add(this.buttonStart); - this.Controls.Add(this.groupBoxImageSettings); - this.Controls.Add(this.pictureBox1); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "Beamer"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Beamer"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.BeamerFormClosing); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.BeamerKeyDown); - this.groupBoxImageSettings.ResumeLayout(false); - this.groupBoxImageSettings.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.GroupBox groupBoxImageSettings; - private System.Windows.Forms.Label labelSubtitleFontSize; - private System.Windows.Forms.ComboBox comboBoxSubtitleFont; - private System.Windows.Forms.ComboBox comboBoxSubtitleFontSize; - private System.Windows.Forms.Label labelSubtitleFont; - private System.Windows.Forms.Label labelBorderWidth; - private System.Windows.Forms.ComboBox comboBoxBorderWidth; - private System.Windows.Forms.Panel panelBorderColor; - private System.Windows.Forms.Button buttonBorderColor; - private System.Windows.Forms.Panel panelColor; - private System.Windows.Forms.Button buttonColor; - private System.Windows.Forms.PictureBox pictureBox1; - private System.Windows.Forms.Button buttonStart; - private System.Windows.Forms.ColorDialog colorDialog1; - private System.Windows.Forms.Timer timer1; - private System.Windows.Forms.ComboBox comboBoxHAlign; - private System.Windows.Forms.Label labelHorizontalAlign; - } +namespace Nikse.SubtitleEdit.Forms +{ + partial class Beamer + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.groupBoxImageSettings = new System.Windows.Forms.GroupBox(); + this.comboBoxHAlign = new System.Windows.Forms.ComboBox(); + this.labelHorizontalAlign = new System.Windows.Forms.Label(); + this.labelSubtitleFontSize = new System.Windows.Forms.Label(); + this.comboBoxSubtitleFont = new System.Windows.Forms.ComboBox(); + this.comboBoxSubtitleFontSize = new System.Windows.Forms.ComboBox(); + this.labelSubtitleFont = new System.Windows.Forms.Label(); + this.labelBorderWidth = new System.Windows.Forms.Label(); + this.comboBoxBorderWidth = new System.Windows.Forms.ComboBox(); + this.panelBorderColor = new System.Windows.Forms.Panel(); + this.buttonBorderColor = new System.Windows.Forms.Button(); + this.panelColor = new System.Windows.Forms.Panel(); + this.buttonColor = new System.Windows.Forms.Button(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.buttonStart = new System.Windows.Forms.Button(); + this.colorDialog1 = new System.Windows.Forms.ColorDialog(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.groupBoxImageSettings.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.SuspendLayout(); + // + // groupBoxImageSettings + // + this.groupBoxImageSettings.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxImageSettings.Controls.Add(this.comboBoxHAlign); + this.groupBoxImageSettings.Controls.Add(this.labelHorizontalAlign); + this.groupBoxImageSettings.Controls.Add(this.labelSubtitleFontSize); + this.groupBoxImageSettings.Controls.Add(this.comboBoxSubtitleFont); + this.groupBoxImageSettings.Controls.Add(this.comboBoxSubtitleFontSize); + this.groupBoxImageSettings.Controls.Add(this.labelSubtitleFont); + this.groupBoxImageSettings.Controls.Add(this.labelBorderWidth); + this.groupBoxImageSettings.Controls.Add(this.comboBoxBorderWidth); + this.groupBoxImageSettings.Controls.Add(this.panelBorderColor); + this.groupBoxImageSettings.Controls.Add(this.buttonBorderColor); + this.groupBoxImageSettings.Controls.Add(this.panelColor); + this.groupBoxImageSettings.Controls.Add(this.buttonColor); + this.groupBoxImageSettings.Location = new System.Drawing.Point(4, 6); + this.groupBoxImageSettings.Name = "groupBoxImageSettings"; + this.groupBoxImageSettings.Size = new System.Drawing.Size(854, 114); + this.groupBoxImageSettings.TabIndex = 23; + this.groupBoxImageSettings.TabStop = false; + this.groupBoxImageSettings.Text = "Image settings"; + // + // comboBoxHAlign + // + this.comboBoxHAlign.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxHAlign.FormattingEnabled = true; + this.comboBoxHAlign.Items.AddRange(new object[] { + "Left", + "Center", + "Right"}); + this.comboBoxHAlign.Location = new System.Drawing.Point(100, 78); + this.comboBoxHAlign.Name = "comboBoxHAlign"; + this.comboBoxHAlign.Size = new System.Drawing.Size(121, 21); + this.comboBoxHAlign.TabIndex = 25; + this.comboBoxHAlign.SelectedIndexChanged += new System.EventHandler(this.ComboBoxHAlignSelectedIndexChanged); + // + // labelHorizontalAlign + // + this.labelHorizontalAlign.AutoSize = true; + this.labelHorizontalAlign.Location = new System.Drawing.Point(10, 81); + this.labelHorizontalAlign.Name = "labelHorizontalAlign"; + this.labelHorizontalAlign.Size = new System.Drawing.Size(30, 13); + this.labelHorizontalAlign.TabIndex = 24; + this.labelHorizontalAlign.Text = "Align"; + // + // labelSubtitleFontSize + // + this.labelSubtitleFontSize.AutoSize = true; + this.labelSubtitleFontSize.Location = new System.Drawing.Point(10, 54); + this.labelSubtitleFontSize.Name = "labelSubtitleFontSize"; + this.labelSubtitleFontSize.Size = new System.Drawing.Size(84, 13); + this.labelSubtitleFontSize.TabIndex = 20; + this.labelSubtitleFontSize.Text = "Subtitle font size"; + // + // comboBoxSubtitleFont + // + this.comboBoxSubtitleFont.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxSubtitleFont.FormattingEnabled = true; + this.comboBoxSubtitleFont.Location = new System.Drawing.Point(100, 24); + this.comboBoxSubtitleFont.Name = "comboBoxSubtitleFont"; + this.comboBoxSubtitleFont.Size = new System.Drawing.Size(121, 21); + this.comboBoxSubtitleFont.TabIndex = 17; + this.comboBoxSubtitleFont.SelectedIndexChanged += new System.EventHandler(this.ComboBoxSubtitleFontSelectedValueChanged); + // + // comboBoxSubtitleFontSize + // + this.comboBoxSubtitleFontSize.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxSubtitleFontSize.FormattingEnabled = true; + this.comboBoxSubtitleFontSize.Items.AddRange(new object[] { + "10", + "11", + "12", + "13", + "14", + "15", + "16", + "17", + "18", + "19", + "20", + "21", + "22", + "23", + "24", + "25", + "26", + "27", + "28", + "29", + "30", + "31", + "32", + "33", + "34", + "35", + "36", + "37", + "38", + "39", + "40", + "41", + "42", + "43", + "44", + "45", + "46", + "47", + "48", + "49", + "50", + "51", + "52", + "53", + "54", + "55", + "56", + "57", + "58", + "59", + "60", + "61", + "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"}); + this.comboBoxSubtitleFontSize.Location = new System.Drawing.Point(100, 51); + this.comboBoxSubtitleFontSize.Name = "comboBoxSubtitleFontSize"; + this.comboBoxSubtitleFontSize.Size = new System.Drawing.Size(121, 21); + this.comboBoxSubtitleFontSize.TabIndex = 18; + this.comboBoxSubtitleFontSize.SelectedIndexChanged += new System.EventHandler(this.ComboBoxSubtitleFontSizeSelectedIndexChanged); + // + // labelSubtitleFont + // + this.labelSubtitleFont.AutoSize = true; + this.labelSubtitleFont.Location = new System.Drawing.Point(10, 27); + this.labelSubtitleFont.Name = "labelSubtitleFont"; + this.labelSubtitleFont.Size = new System.Drawing.Size(63, 13); + this.labelSubtitleFont.TabIndex = 19; + this.labelSubtitleFont.Text = "Subtitle font"; + // + // labelBorderWidth + // + this.labelBorderWidth.Location = new System.Drawing.Point(426, 56); + this.labelBorderWidth.Name = "labelBorderWidth"; + this.labelBorderWidth.RightToLeft = System.Windows.Forms.RightToLeft.No; + this.labelBorderWidth.Size = new System.Drawing.Size(110, 13); + this.labelBorderWidth.TabIndex = 16; + this.labelBorderWidth.Text = "Border width"; + this.labelBorderWidth.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // comboBoxBorderWidth + // + this.comboBoxBorderWidth.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxBorderWidth.FormattingEnabled = true; + this.comboBoxBorderWidth.Items.AddRange(new object[] { + "0", + "1", + "2", + "3", + "4", + "5"}); + this.comboBoxBorderWidth.Location = new System.Drawing.Point(537, 51); + this.comboBoxBorderWidth.Name = "comboBoxBorderWidth"; + this.comboBoxBorderWidth.Size = new System.Drawing.Size(121, 21); + this.comboBoxBorderWidth.TabIndex = 15; + this.comboBoxBorderWidth.SelectedIndexChanged += new System.EventHandler(this.ComboBoxBorderWidthSelectedIndexChanged); + // + // panelBorderColor + // + this.panelBorderColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelBorderColor.Location = new System.Drawing.Point(664, 25); + this.panelBorderColor.Name = "panelBorderColor"; + this.panelBorderColor.Size = new System.Drawing.Size(21, 20); + this.panelBorderColor.TabIndex = 14; + this.panelBorderColor.Click += new System.EventHandler(this.ButtonBorderColorClick); + // + // buttonBorderColor + // + this.buttonBorderColor.Location = new System.Drawing.Point(537, 24); + this.buttonBorderColor.Name = "buttonBorderColor"; + this.buttonBorderColor.Size = new System.Drawing.Size(121, 21); + this.buttonBorderColor.TabIndex = 13; + this.buttonBorderColor.Text = "Border color"; + this.buttonBorderColor.UseVisualStyleBackColor = true; + this.buttonBorderColor.Click += new System.EventHandler(this.ButtonBorderColorClick); + // + // panelColor + // + this.panelColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelColor.Location = new System.Drawing.Point(403, 25); + this.panelColor.Name = "panelColor"; + this.panelColor.Size = new System.Drawing.Size(21, 20); + this.panelColor.TabIndex = 12; + this.panelColor.Click += new System.EventHandler(this.ButtonColorClick); + // + // buttonColor + // + this.buttonColor.Location = new System.Drawing.Point(276, 24); + this.buttonColor.Name = "buttonColor"; + this.buttonColor.Size = new System.Drawing.Size(121, 21); + this.buttonColor.TabIndex = 11; + this.buttonColor.Text = "Color"; + this.buttonColor.UseVisualStyleBackColor = true; + this.buttonColor.Click += new System.EventHandler(this.ButtonColorClick); + // + // pictureBox1 + // + this.pictureBox1.Location = new System.Drawing.Point(4, 126); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(855, 211); + this.pictureBox1.TabIndex = 22; + this.pictureBox1.TabStop = false; + // + // buttonStart + // + this.buttonStart.Location = new System.Drawing.Point(4, 343); + this.buttonStart.Name = "buttonStart"; + this.buttonStart.Size = new System.Drawing.Size(121, 21); + this.buttonStart.TabIndex = 24; + this.buttonStart.Text = "&Start"; + this.buttonStart.UseVisualStyleBackColor = true; + this.buttonStart.Click += new System.EventHandler(this.ButtonStartClick); + // + // timer1 + // + this.timer1.Interval = 25; + this.timer1.Tick += new System.EventHandler(this.Timer1Tick); + // + // Beamer + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(862, 376); + this.Controls.Add(this.buttonStart); + this.Controls.Add(this.groupBoxImageSettings); + this.Controls.Add(this.pictureBox1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "Beamer"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Beamer"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.BeamerFormClosing); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.BeamerKeyDown); + this.groupBoxImageSettings.ResumeLayout(false); + this.groupBoxImageSettings.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBoxImageSettings; + private System.Windows.Forms.Label labelSubtitleFontSize; + private System.Windows.Forms.ComboBox comboBoxSubtitleFont; + private System.Windows.Forms.ComboBox comboBoxSubtitleFontSize; + private System.Windows.Forms.Label labelSubtitleFont; + private System.Windows.Forms.Label labelBorderWidth; + private System.Windows.Forms.ComboBox comboBoxBorderWidth; + private System.Windows.Forms.Panel panelBorderColor; + private System.Windows.Forms.Button buttonBorderColor; + private System.Windows.Forms.Panel panelColor; + private System.Windows.Forms.Button buttonColor; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Button buttonStart; + private System.Windows.Forms.ColorDialog colorDialog1; + private System.Windows.Forms.Timer timer1; + private System.Windows.Forms.ComboBox comboBoxHAlign; + private System.Windows.Forms.Label labelHorizontalAlign; + } } \ No newline at end of file diff --git a/src/Forms/Beamer.cs b/src/ui/Forms/Beamer.cs similarity index 97% rename from src/Forms/Beamer.cs rename to src/ui/Forms/Beamer.cs index fd768be68..3aeb6bae1 100644 --- a/src/Forms/Beamer.cs +++ b/src/ui/Forms/Beamer.cs @@ -1,767 +1,767 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Drawing.Text; -using System.Text; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class Beamer : Form - { - private readonly Subtitle _subtitle; - private int _index; - private bool _fullscreen; - private Color _subtitleColor; - private string _subtitleFontName; - private float _subtitleFontSize; - private Color _borderColor; - private float _borderWidth; - private readonly bool _isLoading; - private int _marginLeft; - private int _marginBottom = 25; - private int _showIndex = -2; - private double _millisecondsFactor = 1.0; - private readonly Main _main; - private bool _noTimerAction; - private long _videoStartTick; - private readonly Keys _mainGeneralGoToPrevSubtitle = UiUtil.GetKeys(Configuration.Settings.Shortcuts.GeneralGoToPrevSubtitle); - - public Beamer(Main main, Subtitle subtitle, int index) - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - _main = main; - _subtitle = subtitle; - _index = index; - _isLoading = true; - _subtitleColor = Color.White; - _subtitleFontName = "Verdana"; - _subtitleFontSize = 75.0f; - _borderColor = Color.Black; - _borderWidth = 2.0f; - - var language = Configuration.Settings.Language.Beamer; - Text = language.Title; - groupBoxImageSettings.Text = Configuration.Settings.Language.ExportPngXml.ImageSettings; - labelSubtitleFont.Text = Configuration.Settings.Language.ExportPngXml.FontFamily; - labelSubtitleFontSize.Text = Configuration.Settings.Language.ExportPngXml.FontSize; - buttonColor.Text = Configuration.Settings.Language.ExportPngXml.FontColor; - buttonBorderColor.Text = Configuration.Settings.Language.ExportPngXml.BorderColor; - labelBorderWidth.Text = Configuration.Settings.Language.ExportPngXml.BorderWidth; - - _subtitleFontName = Configuration.Settings.SubtitleBeaming.FontName; - _subtitleFontSize = Configuration.Settings.SubtitleBeaming.FontSize; - if (_subtitleFontSize > 100 || _subtitleFontSize < 10) - { - _subtitleFontSize = 60; - } - _subtitleColor = Configuration.Settings.SubtitleBeaming.FontColor; - _borderColor = Configuration.Settings.SubtitleBeaming.BorderColor; - _borderWidth = Configuration.Settings.SubtitleBeaming.BorderWidth; - - panelColor.BackColor = _subtitleColor; - panelBorderColor.BackColor = _borderColor; - - if (Configuration.Settings.SubtitleBeaming.BorderWidth > 0 && Configuration.Settings.SubtitleBeaming.BorderWidth < 5) - { - comboBoxBorderWidth.SelectedIndex = (int)_borderWidth; - } - else - { - comboBoxBorderWidth.SelectedIndex = 2; - } - - comboBoxHAlign.SelectedIndexChanged -= ComboBoxHAlignSelectedIndexChanged; - comboBoxHAlign.SelectedIndex = 1; - comboBoxHAlign.SelectedIndexChanged += ComboBoxHAlignSelectedIndexChanged; - - comboBoxSubtitleFont.SelectedIndexChanged -= ComboBoxSubtitleFontSizeSelectedIndexChanged; - foreach (var x in FontFamily.Families) - { - comboBoxSubtitleFont.Items.Add(x.Name); - if (x.Name.Equals(_subtitleFontName, StringComparison.OrdinalIgnoreCase)) - { - comboBoxSubtitleFont.SelectedIndex = comboBoxSubtitleFont.Items.Count - 1; - } - } - comboBoxSubtitleFont.SelectedIndexChanged += ComboBoxSubtitleFontSizeSelectedIndexChanged; - - comboBoxSubtitleFontSize.SelectedIndex = (_subtitleFontSize >= 10 && _subtitleFontSize <= 100) ? (int)(_subtitleFontSize - 10) : 40; - _isLoading = false; - ShowCurrent(); - } - - private void ButtonColorClick(object sender, EventArgs e) - { - colorDialog1.Color = panelColor.BackColor; - if (colorDialog1.ShowDialog() == DialogResult.OK) - { - panelColor.BackColor = colorDialog1.Color; - ShowCurrent(); - } - } - - private void ButtonBorderColorClick(object sender, EventArgs e) - { - colorDialog1.Color = panelBorderColor.BackColor; - if (colorDialog1.ShowDialog() == DialogResult.OK) - { - panelBorderColor.BackColor = colorDialog1.Color; - ShowCurrent(); - } - } - - private void ComboBoxSubtitleFontSelectedValueChanged(object sender, EventArgs e) - { - ShowCurrent(); - } - - private void ComboBoxSubtitleFontSizeSelectedIndexChanged(object sender, EventArgs e) - { - ShowCurrent(); - } - - private void ComboBoxBorderWidthSelectedIndexChanged(object sender, EventArgs e) - { - ShowCurrent(); - } - - private void ShowCurrent() - { - SetupImageParameters(); - if (_fullscreen) - { - if (_index > 0 && _index < _subtitle.Paragraphs.Count) - { - string text = _subtitle.Paragraphs[_index].Text; - var bmp = GenerateImageFromTextWithStyle(text); - pictureBox1.Image = bmp; - pictureBox1.Height = bmp.Height; - pictureBox1.Width = bmp.Width; - pictureBox1.Left = (Width - bmp.Width) / 2 + _marginLeft; - pictureBox1.Top = Height - (pictureBox1.Height + _marginBottom); - _showIndex = _index; - _main.FocusParagraph(_index); - } - else - { - pictureBox1.Image = null; - } - } - else - { - string text = "Testing 123" + Environment.NewLine + "Subtitle Edit"; - if (_index >= 0 && _index < _subtitle.Paragraphs.Count && _subtitle.Paragraphs[_index].Text.Length > 1) - { - text = _subtitle.Paragraphs[_index].Text; - _main.FocusParagraph(_index); - } - var bmp = GenerateImageFromTextWithStyle(text); - pictureBox1.Top = groupBoxImageSettings.Top + groupBoxImageSettings.Height + 5; - // Alignment direction. - switch (comboBoxHAlign.SelectedIndex) - { - case 0: // Left. - pictureBox1.Left = 5; - break; - case 1: // Center. - pictureBox1.Left = ((groupBoxImageSettings.Width - bmp.Width) / 2); - break; - case 2: // Right. - pictureBox1.Left = groupBoxImageSettings.Width - bmp.Width; - break; - } - pictureBox1.Image = bmp; - pictureBox1.Height = bmp.Height; - pictureBox1.Width = bmp.Width; - _showIndex = -2; - } - } - - private void SetupImageParameters() - { - if (_isLoading) - { - return; - } - - _subtitleColor = panelColor.BackColor; - _borderColor = panelBorderColor.BackColor; - _subtitleFontName = comboBoxSubtitleFont.SelectedItem.ToString(); - _subtitleFontSize = float.Parse(comboBoxSubtitleFontSize.SelectedItem.ToString()); - _borderWidth = float.Parse(comboBoxBorderWidth.SelectedItem.ToString()); - } - - private Bitmap GenerateImageFromTextWithStyle(string text) - { - const bool subtitleFontBold = false; - bool subtitleAlignLeft = comboBoxHAlign.SelectedIndex == 0; - - // remove styles for display text (except italic) - text = Utilities.RemoveSsaTags(text); - text = text.Replace("", string.Empty); - text = text.Replace("", string.Empty); - text = text.Replace("", string.Empty); - text = text.Replace("", string.Empty); - text = text.Replace("", string.Empty); - text = text.Replace("", string.Empty); - text = text.Replace("", string.Empty); - text = text.Replace("", string.Empty); - - Font font; - try - { - font = new Font(_subtitleFontName, _subtitleFontSize, FontStyle.Regular); - } - catch (Exception exception) - { - MessageBox.Show(exception.Message); - font = new Font(FontFamily.Families[0].Name, _subtitleFontSize); - } - var bmp = new Bitmap(400, 200); - var g = Graphics.FromImage(bmp); - - SizeF textSize = g.MeasureString("Hj!", font); - var lineHeight = (textSize.Height * 0.64f); - - textSize = g.MeasureString(HtmlUtil.RemoveHtmlTags(text), font); - g.Dispose(); - bmp.Dispose(); - int sizeX = (int)(textSize.Width * 0.8) + 40; - int sizeY = (int)(textSize.Height * 0.8) + 30; - if (sizeX < 1) - { - sizeX = 1; - } - if (sizeY < 1) - { - sizeY = 1; - } - bmp = new Bitmap(sizeX, sizeY); - g = Graphics.FromImage(bmp); - - var lefts = new List(); - foreach (var line in HtmlUtil.RemoveOpenCloseTags(text, HtmlUtil.TagItalic, HtmlUtil.TagFont).SplitToLines()) - { - if (subtitleAlignLeft) - { - lefts.Add(5); - } - else - { - lefts.Add((float)(bmp.Width - g.MeasureString(line, font).Width * 0.8 + 15) / 2); - } - } - - g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; - g.SmoothingMode = SmoothingMode.AntiAlias; - g.CompositingQuality = CompositingQuality.HighQuality; - - var sf = new StringFormat - { - Alignment = StringAlignment.Near, - LineAlignment = StringAlignment.Near - }; - // draw the text to a path - var path = new GraphicsPath(); - - // display italic - var sb = new StringBuilder(); - int i = 0; - bool isItalic = false; - float left = 5; - if (lefts.Count > 0) - { - left = lefts[0]; - } - float top = 5; - bool newLine = false; - int lineNumber = 0; - float leftMargin = left; - int newLinePathPoint = -1; - Color c = _subtitleColor; - var colorStack = new Stack(); - var lastText = new StringBuilder(); - while (i < text.Length) - { - if (text.Substring(i).StartsWith(" 0) - { - TextDraw.DrawText(font, sf, path, sb, isItalic, subtitleFontBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); - } - if (path.PointCount > 0) - { - PointF[] list = (PointF[])path.PathPoints.Clone(); // avoid using very slow path.PathPoints indexer!!! - for (int k = oldPathPointIndex; k < list.Length; k++) - { - if (list[k].X > addLeft) - { - addLeft = list[k].X; - } - } - } - if (Math.Abs(addLeft) < 0.001) - { - addLeft = left + 2; - } - left = addLeft; - - if (_borderWidth > 0) - { - g.DrawPath(new Pen(_borderColor, _borderWidth), path); - } - - g.FillPath(new SolidBrush(c), path); - path.Reset(); - path = new GraphicsPath(); - sb.Clear(); - - int endIndex = text.Substring(i).IndexOf('>'); - if (endIndex < 0) - { - i += 9999; - } - else - { - string fontContent = text.Substring(i, endIndex); - if (fontContent.Contains(" color=", StringComparison.OrdinalIgnoreCase)) - { - var arr = fontContent.Substring(fontContent.IndexOf(" color=", StringComparison.OrdinalIgnoreCase) + 7).Trim().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); - if (arr.Length > 0) - { - string fontColor = arr[0].Trim('\'').Trim('"').Trim('\''); - try - { - colorStack.Push(c); // save old color - if (fontColor.StartsWith("rgb(", StringComparison.OrdinalIgnoreCase)) - { - arr = fontColor.Remove(0, 4).TrimEnd(')').Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); - c = Color.FromArgb(int.Parse(arr[0]), int.Parse(arr[1]), int.Parse(arr[2])); - } - else - { - c = ColorTranslator.FromHtml(fontColor); - } - } - catch - { - c = _subtitleColor; - } - } - } - i += endIndex; - } - } - else if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase)) - { - if (text.Substring(i).ToLowerInvariant().Replace("", string.Empty).Replace("", string.Empty).Length > 0) - { - if (lastText.EndsWith(' ') && !sb.StartsWith(' ')) - { - string t = sb.ToString(); - sb.Clear(); - sb.Append(' '); - sb.Append(t); - } - - float addLeft = 0; - int oldPathPointIndex = path.PointCount - 1; - if (oldPathPointIndex < 0) - { - oldPathPointIndex = 0; - } - if (sb.Length > 0) - { - TextDraw.DrawText(font, sf, path, sb, isItalic, subtitleFontBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); - } - if (path.PointCount > 0) - { - PointF[] list = (PointF[])path.PathPoints.Clone(); // avoid using very slow path.PathPoints indexer!!! - for (int k = oldPathPointIndex; k < list.Length; k++) - { - if (list[k].X > addLeft) - { - addLeft = list[k].X; - } - } - } - if (Math.Abs(addLeft) < 0.001) - { - addLeft = left + 2; - } - left = addLeft; - - if (_borderWidth > 0) - { - g.DrawPath(new Pen(_borderColor, _borderWidth), path); - } - g.FillPath(new SolidBrush(c), path); - path.Reset(); - sb.Clear(); - if (colorStack.Count > 0) - { - c = colorStack.Pop(); - } - } - i += 6; - } - else if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase)) - { - if (sb.Length > 0) - { - TextDraw.DrawText(font, sf, path, sb, isItalic, subtitleFontBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); - } - isItalic = true; - i += 2; - } - else if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase) && isItalic) - { - if (lastText.EndsWith(' ') && !sb.StartsWith(' ')) - { - string t = sb.ToString(); - sb.Clear(); - sb.Append(' '); - sb.Append(t); - } - TextDraw.DrawText(font, sf, path, sb, isItalic, subtitleFontBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); - isItalic = false; - i += 3; - } - else if (text.Substring(i).StartsWith(Environment.NewLine, StringComparison.Ordinal)) - { - TextDraw.DrawText(font, sf, path, sb, isItalic, subtitleFontBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); - top += lineHeight; - newLine = true; - i += Environment.NewLine.Length - 1; - lineNumber++; - if (lineNumber < lefts.Count) - { - leftMargin = lefts[lineNumber]; - left = leftMargin; - } - } - else - { - sb.Append(text[i]); - } - i++; - } - if (sb.Length > 0) - { - TextDraw.DrawText(font, sf, path, sb, isItalic, subtitleFontBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); - } - sf.Dispose(); - - if (_borderWidth > 0) - { - g.DrawPath(new Pen(_borderColor, _borderWidth), path); - } - g.FillPath(new SolidBrush(c), path); - g.Dispose(); - var nbmp = new NikseBitmap(bmp); - nbmp.CropTransparentSidesAndBottom(2, true); - return nbmp.GetBitmap(); - } - - private void Timer1Tick(object sender, EventArgs e) - { - if (_noTimerAction) - { - return; - } - - double positionInMilliseconds = (DateTime.Now.Ticks - _videoStartTick) / 10000.0D; // 10,000 ticks = 1 millisecond - positionInMilliseconds *= _millisecondsFactor; - int index = 0; - foreach (Paragraph p in _subtitle.Paragraphs) - { - if (p.StartTime.TotalMilliseconds <= positionInMilliseconds && - p.EndTime.TotalMilliseconds > positionInMilliseconds) - { - break; - } - index++; - } - if (index == _subtitle.Paragraphs.Count) - { - index = -1; - } - if (index == -1) - { - pictureBox1.Image = null; - } - else if (index != _showIndex) - { - _index = index; - ShowCurrent(); - } - } - - private void ButtonStartClick(object sender, EventArgs e) - { - if (_index >= _subtitle.Paragraphs.Count - 1) - { - _index = -1; - _videoStartTick = DateTime.Now.Ticks; - } - else if (_index >= 0) - { - _videoStartTick = DateTime.Now.Ticks - ((long)(_subtitle.Paragraphs[_index].StartTime.TotalMilliseconds) * 10000); //10,000 ticks = 1 millisecond - } - - groupBoxImageSettings.Hide(); - buttonStart.Hide(); - FormBorderStyle = FormBorderStyle.None; - BackColor = Color.Black; - WindowState = FormWindowState.Maximized; - _fullscreen = true; - pictureBox1.Image = null; - Cursor.Hide(); - _marginBottom = Height - 200; - timer1.Start(); - } - - private void BeamerKeyDown(object sender, KeyEventArgs e) - { - if (e.Modifiers == Keys.Control && e.KeyCode == Keys.Home) - { - _index = 0; - ShowCurrent(); - e.SuppressKeyPress = true; - return; - } - if (e.Modifiers == Keys.Control && e.KeyCode == Keys.End) - { - _index = _subtitle.Paragraphs.Count - 1; - ShowCurrent(); - e.SuppressKeyPress = true; - return; - } - - if (!_fullscreen) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - else if (e.KeyCode == Keys.Space || (e.KeyCode == Keys.Down && e.Modifiers == Keys.Alt) || _mainGeneralGoToPrevSubtitle == e.KeyData) - { - if (_index < _subtitle.Paragraphs.Count - 1) - { - _index++; - } - ShowCurrent(); - e.SuppressKeyPress = true; - } - else if (_mainGeneralGoToPrevSubtitle == e.KeyData || (e.KeyCode == Keys.Up && e.Modifiers == Keys.Alt)) - { - if (_index > 0) - { - _index--; - } - ShowCurrent(); - e.SuppressKeyPress = true; - } - else if (e.Modifiers == Keys.None && e.KeyCode == Keys.PageDown) - { - if (_index < _subtitle.Paragraphs.Count - 21) - { - _index += 20; - } - else - { - _index = _subtitle.Paragraphs.Count - 1; - } - ShowCurrent(); - e.SuppressKeyPress = true; - } - else if (e.Modifiers == Keys.None && e.KeyCode == Keys.PageUp) - { - if (_index > 20) - { - _index -= 20; - } - else - { - _index = 0; - } - ShowCurrent(); - e.SuppressKeyPress = true; - } - return; - } - - if (e.KeyCode == Keys.Escape) - { - groupBoxImageSettings.Show(); - buttonStart.Show(); - timer1.Stop(); - Cursor.Show(); - FormBorderStyle = FormBorderStyle.FixedDialog; - BackColor = DefaultBackColor; - WindowState = FormWindowState.Normal; - _showIndex = -2; - _fullscreen = false; - ShowCurrent(); - e.SuppressKeyPress = true; - } - else if (e.KeyCode == Keys.Pause) - { - timer1.Stop(); - timer1.Enabled = false; - } - else if (e.KeyCode == Keys.Space || (e.KeyCode == Keys.Down && e.Modifiers == Keys.Alt)) - { - bool timer1Enabled = timer1.Enabled; - timer1.Enabled = false; - System.Threading.Thread.Sleep(100); - if (_index < _subtitle.Paragraphs.Count - 1) - { - _index++; - } - _videoStartTick = DateTime.Now.Ticks - ((long)(_subtitle.Paragraphs[_index].StartTime.TotalMilliseconds) * 10000); //10,000 ticks = 1 millisecond - - ShowCurrent(); - _noTimerAction = false; - if (timer1Enabled || _fullscreen) - { - timer1.Start(); - } - - e.SuppressKeyPress = true; - } - else if (e.KeyCode == Keys.Up && e.Modifiers == Keys.Alt) - { - bool timer1Enabled = timer1.Enabled; - timer1.Enabled = false; - System.Threading.Thread.Sleep(100); - if (_index > 0) - { - _index--; - } - _videoStartTick = DateTime.Now.Ticks - ((long)(_subtitle.Paragraphs[_index].StartTime.TotalMilliseconds) * 10000); //10,000 ticks = 1 millisecond - ShowCurrent(); - if (timer1Enabled) - { - timer1.Start(); - } - } - else if (e.Modifiers == Keys.None && e.KeyCode == Keys.PageDown) - { - if (_index < _subtitle.Paragraphs.Count - 21) - { - _index += 20; - } - else - { - _index = _subtitle.Paragraphs.Count - 1; - } - ShowCurrent(); - e.SuppressKeyPress = true; - } - else if (e.Modifiers == Keys.None && e.KeyCode == Keys.PageUp) - { - if (_index > 20) - { - _index -= 20; - } - else - { - _index = 0; - } - ShowCurrent(); - e.SuppressKeyPress = true; - } - else if (e.Modifiers == Keys.None && e.KeyCode == Keys.Add) - { - if (comboBoxSubtitleFontSize.SelectedIndex < comboBoxSubtitleFontSize.Items.Count - 1) - { - comboBoxSubtitleFontSize.SelectedIndex = comboBoxSubtitleFontSize.SelectedIndex + 1; - ShowCurrent(); - } - } - else if (e.Modifiers == Keys.None && e.KeyCode == Keys.Subtract) - { - if (comboBoxSubtitleFontSize.SelectedIndex > 0) - { - comboBoxSubtitleFontSize.SelectedIndex = comboBoxSubtitleFontSize.SelectedIndex - 1; - ShowCurrent(); - } - } - else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.Add) - { - _millisecondsFactor += 0.001; - } - else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.Subtract) - { - _millisecondsFactor -= 0.001; - } - else if (e.KeyCode == Keys.Up) - { - _marginBottom++; - ShowCurrent(); - } - else if (e.KeyCode == Keys.Down) - { - _marginBottom--; - ShowCurrent(); - } - else if (e.KeyCode == Keys.Left) - { - _marginLeft--; - ShowCurrent(); - } - else if (e.KeyCode == Keys.Right) - { - _marginLeft++; - ShowCurrent(); - } - else if (e.KeyCode == Keys.Back || e.KeyCode == Keys.Delete) - { - timer1.Stop(); - int temp = _index; - _index = -1; - try - { - ShowCurrent(); - } - finally - { - _index = temp; - } - } - } - - private void BeamerFormClosing(object sender, FormClosingEventArgs e) - { - Cursor.Show(); - - // Save user-configurations. - Configuration.Settings.SubtitleBeaming.FontName = _subtitleFontName; - Configuration.Settings.SubtitleBeaming.FontSize = (int)_subtitleFontSize; - Configuration.Settings.SubtitleBeaming.FontColor = _subtitleColor; - Configuration.Settings.SubtitleBeaming.BorderColor = _borderColor; - Configuration.Settings.SubtitleBeaming.BorderWidth = (int)_borderWidth; - } - - private void ComboBoxHAlignSelectedIndexChanged(object sender, EventArgs e) - { - ShowCurrent(); - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Drawing.Text; +using System.Text; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class Beamer : Form + { + private readonly Subtitle _subtitle; + private int _index; + private bool _fullscreen; + private Color _subtitleColor; + private string _subtitleFontName; + private float _subtitleFontSize; + private Color _borderColor; + private float _borderWidth; + private readonly bool _isLoading; + private int _marginLeft; + private int _marginBottom = 25; + private int _showIndex = -2; + private double _millisecondsFactor = 1.0; + private readonly Main _main; + private bool _noTimerAction; + private long _videoStartTick; + private readonly Keys _mainGeneralGoToPrevSubtitle = UiUtil.GetKeys(Configuration.Settings.Shortcuts.GeneralGoToPrevSubtitle); + + public Beamer(Main main, Subtitle subtitle, int index) + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + _main = main; + _subtitle = subtitle; + _index = index; + _isLoading = true; + _subtitleColor = Color.White; + _subtitleFontName = "Verdana"; + _subtitleFontSize = 75.0f; + _borderColor = Color.Black; + _borderWidth = 2.0f; + + var language = Configuration.Settings.Language.Beamer; + Text = language.Title; + groupBoxImageSettings.Text = Configuration.Settings.Language.ExportPngXml.ImageSettings; + labelSubtitleFont.Text = Configuration.Settings.Language.ExportPngXml.FontFamily; + labelSubtitleFontSize.Text = Configuration.Settings.Language.ExportPngXml.FontSize; + buttonColor.Text = Configuration.Settings.Language.ExportPngXml.FontColor; + buttonBorderColor.Text = Configuration.Settings.Language.ExportPngXml.BorderColor; + labelBorderWidth.Text = Configuration.Settings.Language.ExportPngXml.BorderWidth; + + _subtitleFontName = Configuration.Settings.SubtitleBeaming.FontName; + _subtitleFontSize = Configuration.Settings.SubtitleBeaming.FontSize; + if (_subtitleFontSize > 100 || _subtitleFontSize < 10) + { + _subtitleFontSize = 60; + } + _subtitleColor = Configuration.Settings.SubtitleBeaming.FontColor; + _borderColor = Configuration.Settings.SubtitleBeaming.BorderColor; + _borderWidth = Configuration.Settings.SubtitleBeaming.BorderWidth; + + panelColor.BackColor = _subtitleColor; + panelBorderColor.BackColor = _borderColor; + + if (Configuration.Settings.SubtitleBeaming.BorderWidth > 0 && Configuration.Settings.SubtitleBeaming.BorderWidth < 5) + { + comboBoxBorderWidth.SelectedIndex = (int)_borderWidth; + } + else + { + comboBoxBorderWidth.SelectedIndex = 2; + } + + comboBoxHAlign.SelectedIndexChanged -= ComboBoxHAlignSelectedIndexChanged; + comboBoxHAlign.SelectedIndex = 1; + comboBoxHAlign.SelectedIndexChanged += ComboBoxHAlignSelectedIndexChanged; + + comboBoxSubtitleFont.SelectedIndexChanged -= ComboBoxSubtitleFontSizeSelectedIndexChanged; + foreach (var x in FontFamily.Families) + { + comboBoxSubtitleFont.Items.Add(x.Name); + if (x.Name.Equals(_subtitleFontName, StringComparison.OrdinalIgnoreCase)) + { + comboBoxSubtitleFont.SelectedIndex = comboBoxSubtitleFont.Items.Count - 1; + } + } + comboBoxSubtitleFont.SelectedIndexChanged += ComboBoxSubtitleFontSizeSelectedIndexChanged; + + comboBoxSubtitleFontSize.SelectedIndex = (_subtitleFontSize >= 10 && _subtitleFontSize <= 100) ? (int)(_subtitleFontSize - 10) : 40; + _isLoading = false; + ShowCurrent(); + } + + private void ButtonColorClick(object sender, EventArgs e) + { + colorDialog1.Color = panelColor.BackColor; + if (colorDialog1.ShowDialog() == DialogResult.OK) + { + panelColor.BackColor = colorDialog1.Color; + ShowCurrent(); + } + } + + private void ButtonBorderColorClick(object sender, EventArgs e) + { + colorDialog1.Color = panelBorderColor.BackColor; + if (colorDialog1.ShowDialog() == DialogResult.OK) + { + panelBorderColor.BackColor = colorDialog1.Color; + ShowCurrent(); + } + } + + private void ComboBoxSubtitleFontSelectedValueChanged(object sender, EventArgs e) + { + ShowCurrent(); + } + + private void ComboBoxSubtitleFontSizeSelectedIndexChanged(object sender, EventArgs e) + { + ShowCurrent(); + } + + private void ComboBoxBorderWidthSelectedIndexChanged(object sender, EventArgs e) + { + ShowCurrent(); + } + + private void ShowCurrent() + { + SetupImageParameters(); + if (_fullscreen) + { + if (_index > 0 && _index < _subtitle.Paragraphs.Count) + { + string text = _subtitle.Paragraphs[_index].Text; + var bmp = GenerateImageFromTextWithStyle(text); + pictureBox1.Image = bmp; + pictureBox1.Height = bmp.Height; + pictureBox1.Width = bmp.Width; + pictureBox1.Left = (Width - bmp.Width) / 2 + _marginLeft; + pictureBox1.Top = Height - (pictureBox1.Height + _marginBottom); + _showIndex = _index; + _main.FocusParagraph(_index); + } + else + { + pictureBox1.Image = null; + } + } + else + { + string text = "Testing 123" + Environment.NewLine + "Subtitle Edit"; + if (_index >= 0 && _index < _subtitle.Paragraphs.Count && _subtitle.Paragraphs[_index].Text.Length > 1) + { + text = _subtitle.Paragraphs[_index].Text; + _main.FocusParagraph(_index); + } + var bmp = GenerateImageFromTextWithStyle(text); + pictureBox1.Top = groupBoxImageSettings.Top + groupBoxImageSettings.Height + 5; + // Alignment direction. + switch (comboBoxHAlign.SelectedIndex) + { + case 0: // Left. + pictureBox1.Left = 5; + break; + case 1: // Center. + pictureBox1.Left = ((groupBoxImageSettings.Width - bmp.Width) / 2); + break; + case 2: // Right. + pictureBox1.Left = groupBoxImageSettings.Width - bmp.Width; + break; + } + pictureBox1.Image = bmp; + pictureBox1.Height = bmp.Height; + pictureBox1.Width = bmp.Width; + _showIndex = -2; + } + } + + private void SetupImageParameters() + { + if (_isLoading) + { + return; + } + + _subtitleColor = panelColor.BackColor; + _borderColor = panelBorderColor.BackColor; + _subtitleFontName = comboBoxSubtitleFont.SelectedItem.ToString(); + _subtitleFontSize = float.Parse(comboBoxSubtitleFontSize.SelectedItem.ToString()); + _borderWidth = float.Parse(comboBoxBorderWidth.SelectedItem.ToString()); + } + + private Bitmap GenerateImageFromTextWithStyle(string text) + { + const bool subtitleFontBold = false; + bool subtitleAlignLeft = comboBoxHAlign.SelectedIndex == 0; + + // remove styles for display text (except italic) + text = Utilities.RemoveSsaTags(text); + text = text.Replace("", string.Empty); + text = text.Replace("", string.Empty); + text = text.Replace("", string.Empty); + text = text.Replace("", string.Empty); + text = text.Replace("", string.Empty); + text = text.Replace("", string.Empty); + text = text.Replace("", string.Empty); + text = text.Replace("", string.Empty); + + Font font; + try + { + font = new Font(_subtitleFontName, _subtitleFontSize, FontStyle.Regular); + } + catch (Exception exception) + { + MessageBox.Show(exception.Message); + font = new Font(FontFamily.Families[0].Name, _subtitleFontSize); + } + var bmp = new Bitmap(400, 200); + var g = Graphics.FromImage(bmp); + + SizeF textSize = g.MeasureString("Hj!", font); + var lineHeight = (textSize.Height * 0.64f); + + textSize = g.MeasureString(HtmlUtil.RemoveHtmlTags(text), font); + g.Dispose(); + bmp.Dispose(); + int sizeX = (int)(textSize.Width * 0.8) + 40; + int sizeY = (int)(textSize.Height * 0.8) + 30; + if (sizeX < 1) + { + sizeX = 1; + } + if (sizeY < 1) + { + sizeY = 1; + } + bmp = new Bitmap(sizeX, sizeY); + g = Graphics.FromImage(bmp); + + var lefts = new List(); + foreach (var line in HtmlUtil.RemoveOpenCloseTags(text, HtmlUtil.TagItalic, HtmlUtil.TagFont).SplitToLines()) + { + if (subtitleAlignLeft) + { + lefts.Add(5); + } + else + { + lefts.Add((float)(bmp.Width - g.MeasureString(line, font).Width * 0.8 + 15) / 2); + } + } + + g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; + g.SmoothingMode = SmoothingMode.AntiAlias; + g.CompositingQuality = CompositingQuality.HighQuality; + + var sf = new StringFormat + { + Alignment = StringAlignment.Near, + LineAlignment = StringAlignment.Near + }; + // draw the text to a path + var path = new GraphicsPath(); + + // display italic + var sb = new StringBuilder(); + int i = 0; + bool isItalic = false; + float left = 5; + if (lefts.Count > 0) + { + left = lefts[0]; + } + float top = 5; + bool newLine = false; + int lineNumber = 0; + float leftMargin = left; + int newLinePathPoint = -1; + Color c = _subtitleColor; + var colorStack = new Stack(); + var lastText = new StringBuilder(); + while (i < text.Length) + { + if (text.Substring(i).StartsWith(" 0) + { + TextDraw.DrawText(font, sf, path, sb, isItalic, subtitleFontBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); + } + if (path.PointCount > 0) + { + PointF[] list = (PointF[])path.PathPoints.Clone(); // avoid using very slow path.PathPoints indexer!!! + for (int k = oldPathPointIndex; k < list.Length; k++) + { + if (list[k].X > addLeft) + { + addLeft = list[k].X; + } + } + } + if (Math.Abs(addLeft) < 0.001) + { + addLeft = left + 2; + } + left = addLeft; + + if (_borderWidth > 0) + { + g.DrawPath(new Pen(_borderColor, _borderWidth), path); + } + + g.FillPath(new SolidBrush(c), path); + path.Reset(); + path = new GraphicsPath(); + sb.Clear(); + + int endIndex = text.Substring(i).IndexOf('>'); + if (endIndex < 0) + { + i += 9999; + } + else + { + string fontContent = text.Substring(i, endIndex); + if (fontContent.Contains(" color=", StringComparison.OrdinalIgnoreCase)) + { + var arr = fontContent.Substring(fontContent.IndexOf(" color=", StringComparison.OrdinalIgnoreCase) + 7).Trim().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + if (arr.Length > 0) + { + string fontColor = arr[0].Trim('\'').Trim('"').Trim('\''); + try + { + colorStack.Push(c); // save old color + if (fontColor.StartsWith("rgb(", StringComparison.OrdinalIgnoreCase)) + { + arr = fontColor.Remove(0, 4).TrimEnd(')').Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + c = Color.FromArgb(int.Parse(arr[0]), int.Parse(arr[1]), int.Parse(arr[2])); + } + else + { + c = ColorTranslator.FromHtml(fontColor); + } + } + catch + { + c = _subtitleColor; + } + } + } + i += endIndex; + } + } + else if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase)) + { + if (text.Substring(i).ToLowerInvariant().Replace("", string.Empty).Replace("", string.Empty).Length > 0) + { + if (lastText.EndsWith(' ') && !sb.StartsWith(' ')) + { + string t = sb.ToString(); + sb.Clear(); + sb.Append(' '); + sb.Append(t); + } + + float addLeft = 0; + int oldPathPointIndex = path.PointCount - 1; + if (oldPathPointIndex < 0) + { + oldPathPointIndex = 0; + } + if (sb.Length > 0) + { + TextDraw.DrawText(font, sf, path, sb, isItalic, subtitleFontBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); + } + if (path.PointCount > 0) + { + PointF[] list = (PointF[])path.PathPoints.Clone(); // avoid using very slow path.PathPoints indexer!!! + for (int k = oldPathPointIndex; k < list.Length; k++) + { + if (list[k].X > addLeft) + { + addLeft = list[k].X; + } + } + } + if (Math.Abs(addLeft) < 0.001) + { + addLeft = left + 2; + } + left = addLeft; + + if (_borderWidth > 0) + { + g.DrawPath(new Pen(_borderColor, _borderWidth), path); + } + g.FillPath(new SolidBrush(c), path); + path.Reset(); + sb.Clear(); + if (colorStack.Count > 0) + { + c = colorStack.Pop(); + } + } + i += 6; + } + else if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase)) + { + if (sb.Length > 0) + { + TextDraw.DrawText(font, sf, path, sb, isItalic, subtitleFontBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); + } + isItalic = true; + i += 2; + } + else if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase) && isItalic) + { + if (lastText.EndsWith(' ') && !sb.StartsWith(' ')) + { + string t = sb.ToString(); + sb.Clear(); + sb.Append(' '); + sb.Append(t); + } + TextDraw.DrawText(font, sf, path, sb, isItalic, subtitleFontBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); + isItalic = false; + i += 3; + } + else if (text.Substring(i).StartsWith(Environment.NewLine, StringComparison.Ordinal)) + { + TextDraw.DrawText(font, sf, path, sb, isItalic, subtitleFontBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); + top += lineHeight; + newLine = true; + i += Environment.NewLine.Length - 1; + lineNumber++; + if (lineNumber < lefts.Count) + { + leftMargin = lefts[lineNumber]; + left = leftMargin; + } + } + else + { + sb.Append(text[i]); + } + i++; + } + if (sb.Length > 0) + { + TextDraw.DrawText(font, sf, path, sb, isItalic, subtitleFontBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); + } + sf.Dispose(); + + if (_borderWidth > 0) + { + g.DrawPath(new Pen(_borderColor, _borderWidth), path); + } + g.FillPath(new SolidBrush(c), path); + g.Dispose(); + var nbmp = new NikseBitmap(bmp); + nbmp.CropTransparentSidesAndBottom(2, true); + return nbmp.GetBitmap(); + } + + private void Timer1Tick(object sender, EventArgs e) + { + if (_noTimerAction) + { + return; + } + + double positionInMilliseconds = (DateTime.Now.Ticks - _videoStartTick) / 10000.0D; // 10,000 ticks = 1 millisecond + positionInMilliseconds *= _millisecondsFactor; + int index = 0; + foreach (Paragraph p in _subtitle.Paragraphs) + { + if (p.StartTime.TotalMilliseconds <= positionInMilliseconds && + p.EndTime.TotalMilliseconds > positionInMilliseconds) + { + break; + } + index++; + } + if (index == _subtitle.Paragraphs.Count) + { + index = -1; + } + if (index == -1) + { + pictureBox1.Image = null; + } + else if (index != _showIndex) + { + _index = index; + ShowCurrent(); + } + } + + private void ButtonStartClick(object sender, EventArgs e) + { + if (_index >= _subtitle.Paragraphs.Count - 1) + { + _index = -1; + _videoStartTick = DateTime.Now.Ticks; + } + else if (_index >= 0) + { + _videoStartTick = DateTime.Now.Ticks - ((long)(_subtitle.Paragraphs[_index].StartTime.TotalMilliseconds) * 10000); //10,000 ticks = 1 millisecond + } + + groupBoxImageSettings.Hide(); + buttonStart.Hide(); + FormBorderStyle = FormBorderStyle.None; + BackColor = Color.Black; + WindowState = FormWindowState.Maximized; + _fullscreen = true; + pictureBox1.Image = null; + Cursor.Hide(); + _marginBottom = Height - 200; + timer1.Start(); + } + + private void BeamerKeyDown(object sender, KeyEventArgs e) + { + if (e.Modifiers == Keys.Control && e.KeyCode == Keys.Home) + { + _index = 0; + ShowCurrent(); + e.SuppressKeyPress = true; + return; + } + if (e.Modifiers == Keys.Control && e.KeyCode == Keys.End) + { + _index = _subtitle.Paragraphs.Count - 1; + ShowCurrent(); + e.SuppressKeyPress = true; + return; + } + + if (!_fullscreen) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + else if (e.KeyCode == Keys.Space || (e.KeyCode == Keys.Down && e.Modifiers == Keys.Alt) || _mainGeneralGoToPrevSubtitle == e.KeyData) + { + if (_index < _subtitle.Paragraphs.Count - 1) + { + _index++; + } + ShowCurrent(); + e.SuppressKeyPress = true; + } + else if (_mainGeneralGoToPrevSubtitle == e.KeyData || (e.KeyCode == Keys.Up && e.Modifiers == Keys.Alt)) + { + if (_index > 0) + { + _index--; + } + ShowCurrent(); + e.SuppressKeyPress = true; + } + else if (e.Modifiers == Keys.None && e.KeyCode == Keys.PageDown) + { + if (_index < _subtitle.Paragraphs.Count - 21) + { + _index += 20; + } + else + { + _index = _subtitle.Paragraphs.Count - 1; + } + ShowCurrent(); + e.SuppressKeyPress = true; + } + else if (e.Modifiers == Keys.None && e.KeyCode == Keys.PageUp) + { + if (_index > 20) + { + _index -= 20; + } + else + { + _index = 0; + } + ShowCurrent(); + e.SuppressKeyPress = true; + } + return; + } + + if (e.KeyCode == Keys.Escape) + { + groupBoxImageSettings.Show(); + buttonStart.Show(); + timer1.Stop(); + Cursor.Show(); + FormBorderStyle = FormBorderStyle.FixedDialog; + BackColor = DefaultBackColor; + WindowState = FormWindowState.Normal; + _showIndex = -2; + _fullscreen = false; + ShowCurrent(); + e.SuppressKeyPress = true; + } + else if (e.KeyCode == Keys.Pause) + { + timer1.Stop(); + timer1.Enabled = false; + } + else if (e.KeyCode == Keys.Space || (e.KeyCode == Keys.Down && e.Modifiers == Keys.Alt)) + { + bool timer1Enabled = timer1.Enabled; + timer1.Enabled = false; + System.Threading.Thread.Sleep(100); + if (_index < _subtitle.Paragraphs.Count - 1) + { + _index++; + } + _videoStartTick = DateTime.Now.Ticks - ((long)(_subtitle.Paragraphs[_index].StartTime.TotalMilliseconds) * 10000); //10,000 ticks = 1 millisecond + + ShowCurrent(); + _noTimerAction = false; + if (timer1Enabled || _fullscreen) + { + timer1.Start(); + } + + e.SuppressKeyPress = true; + } + else if (e.KeyCode == Keys.Up && e.Modifiers == Keys.Alt) + { + bool timer1Enabled = timer1.Enabled; + timer1.Enabled = false; + System.Threading.Thread.Sleep(100); + if (_index > 0) + { + _index--; + } + _videoStartTick = DateTime.Now.Ticks - ((long)(_subtitle.Paragraphs[_index].StartTime.TotalMilliseconds) * 10000); //10,000 ticks = 1 millisecond + ShowCurrent(); + if (timer1Enabled) + { + timer1.Start(); + } + } + else if (e.Modifiers == Keys.None && e.KeyCode == Keys.PageDown) + { + if (_index < _subtitle.Paragraphs.Count - 21) + { + _index += 20; + } + else + { + _index = _subtitle.Paragraphs.Count - 1; + } + ShowCurrent(); + e.SuppressKeyPress = true; + } + else if (e.Modifiers == Keys.None && e.KeyCode == Keys.PageUp) + { + if (_index > 20) + { + _index -= 20; + } + else + { + _index = 0; + } + ShowCurrent(); + e.SuppressKeyPress = true; + } + else if (e.Modifiers == Keys.None && e.KeyCode == Keys.Add) + { + if (comboBoxSubtitleFontSize.SelectedIndex < comboBoxSubtitleFontSize.Items.Count - 1) + { + comboBoxSubtitleFontSize.SelectedIndex = comboBoxSubtitleFontSize.SelectedIndex + 1; + ShowCurrent(); + } + } + else if (e.Modifiers == Keys.None && e.KeyCode == Keys.Subtract) + { + if (comboBoxSubtitleFontSize.SelectedIndex > 0) + { + comboBoxSubtitleFontSize.SelectedIndex = comboBoxSubtitleFontSize.SelectedIndex - 1; + ShowCurrent(); + } + } + else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.Add) + { + _millisecondsFactor += 0.001; + } + else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.Subtract) + { + _millisecondsFactor -= 0.001; + } + else if (e.KeyCode == Keys.Up) + { + _marginBottom++; + ShowCurrent(); + } + else if (e.KeyCode == Keys.Down) + { + _marginBottom--; + ShowCurrent(); + } + else if (e.KeyCode == Keys.Left) + { + _marginLeft--; + ShowCurrent(); + } + else if (e.KeyCode == Keys.Right) + { + _marginLeft++; + ShowCurrent(); + } + else if (e.KeyCode == Keys.Back || e.KeyCode == Keys.Delete) + { + timer1.Stop(); + int temp = _index; + _index = -1; + try + { + ShowCurrent(); + } + finally + { + _index = temp; + } + } + } + + private void BeamerFormClosing(object sender, FormClosingEventArgs e) + { + Cursor.Show(); + + // Save user-configurations. + Configuration.Settings.SubtitleBeaming.FontName = _subtitleFontName; + Configuration.Settings.SubtitleBeaming.FontSize = (int)_subtitleFontSize; + Configuration.Settings.SubtitleBeaming.FontColor = _subtitleColor; + Configuration.Settings.SubtitleBeaming.BorderColor = _borderColor; + Configuration.Settings.SubtitleBeaming.BorderWidth = (int)_borderWidth; + } + + private void ComboBoxHAlignSelectedIndexChanged(object sender, EventArgs e) + { + ShowCurrent(); + } + + } +} diff --git a/src/Forms/Beamer.resx b/src/ui/Forms/Beamer.resx similarity index 97% rename from src/Forms/Beamer.resx rename to src/ui/Forms/Beamer.resx index ea568f77b..21f3cd3ea 100644 --- a/src/Forms/Beamer.resx +++ b/src/ui/Forms/Beamer.resx @@ -1,126 +1,126 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - 138, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 138, 17 + \ No newline at end of file diff --git a/src/Forms/BookmarkAdd.Designer.cs b/src/ui/Forms/BookmarkAdd.Designer.cs similarity index 100% rename from src/Forms/BookmarkAdd.Designer.cs rename to src/ui/Forms/BookmarkAdd.Designer.cs diff --git a/src/Forms/BookmarkAdd.cs b/src/ui/Forms/BookmarkAdd.cs similarity index 100% rename from src/Forms/BookmarkAdd.cs rename to src/ui/Forms/BookmarkAdd.cs diff --git a/src/Forms/DialogDoNotShowAgain.resx b/src/ui/Forms/BookmarkAdd.resx similarity index 100% rename from src/Forms/DialogDoNotShowAgain.resx rename to src/ui/Forms/BookmarkAdd.resx diff --git a/src/Forms/BookmarksGoTo.Designer.cs b/src/ui/Forms/BookmarksGoTo.Designer.cs similarity index 100% rename from src/Forms/BookmarksGoTo.Designer.cs rename to src/ui/Forms/BookmarksGoTo.Designer.cs diff --git a/src/Forms/BookmarksGoTo.cs b/src/ui/Forms/BookmarksGoTo.cs similarity index 100% rename from src/Forms/BookmarksGoTo.cs rename to src/ui/Forms/BookmarksGoTo.cs diff --git a/src/Forms/DownloadFfmpeg.resx b/src/ui/Forms/BookmarksGoTo.resx similarity index 100% rename from src/Forms/DownloadFfmpeg.resx rename to src/ui/Forms/BookmarksGoTo.resx diff --git a/src/Forms/Cavena890SaveOptions.Designer.cs b/src/ui/Forms/Cavena890SaveOptions.Designer.cs similarity index 98% rename from src/Forms/Cavena890SaveOptions.Designer.cs rename to src/ui/Forms/Cavena890SaveOptions.Designer.cs index 31ccb519c..f21e330ea 100644 --- a/src/Forms/Cavena890SaveOptions.Designer.cs +++ b/src/ui/Forms/Cavena890SaveOptions.Designer.cs @@ -1,270 +1,270 @@ -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - partial class Cavena890SaveOptions - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - TimeCode timeCode1 = new TimeCode(); - this.labelTimeCodeStartOfProgramme = new System.Windows.Forms.Label(); - this.buttonOK = new System.Windows.Forms.Button(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonImport = new System.Windows.Forms.Button(); - this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); - this.textBoxComment = new System.Windows.Forms.TextBox(); - this.labelComment = new System.Windows.Forms.Label(); - this.textBoxTranslatedTitle = new System.Windows.Forms.TextBox(); - this.labelTranslatedTitle = new System.Windows.Forms.Label(); - this.textBoxOriginalTitle = new System.Windows.Forms.TextBox(); - this.labelOriginalTitle = new System.Windows.Forms.Label(); - this.textBoxTranslator = new System.Windows.Forms.TextBox(); - this.labelTranslator = new System.Windows.Forms.Label(); - this.timeUpDownStartTime = new Nikse.SubtitleEdit.Controls.TimeUpDown(); - this.comboBoxLanguage = new System.Windows.Forms.ComboBox(); - this.labelLanguage = new System.Windows.Forms.Label(); - this.SuspendLayout(); - // - // labelTimeCodeStartOfProgramme - // - this.labelTimeCodeStartOfProgramme.AutoSize = true; - this.labelTimeCodeStartOfProgramme.Location = new System.Drawing.Point(12, 182); - this.labelTimeCodeStartOfProgramme.Name = "labelTimeCodeStartOfProgramme"; - this.labelTimeCodeStartOfProgramme.Size = new System.Drawing.Size(152, 13); - this.labelTimeCodeStartOfProgramme.TabIndex = 10; - this.labelTimeCodeStartOfProgramme.Text = "Time code: Start of programme"; - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(250, 262); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 12; - this.buttonOK.Text = "Save"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(331, 262); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 13; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // buttonImport - // - this.buttonImport.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonImport.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonImport.Location = new System.Drawing.Point(290, 12); - this.buttonImport.Name = "buttonImport"; - this.buttonImport.Size = new System.Drawing.Size(116, 23); - this.buttonImport.TabIndex = 14; - this.buttonImport.Text = "Import..."; - this.buttonImport.UseVisualStyleBackColor = true; - this.buttonImport.Click += new System.EventHandler(this.buttonImport_Click); - // - // openFileDialog1 - // - this.openFileDialog1.FileName = "openFileDialog1"; - // - // textBoxComment - // - this.textBoxComment.Location = new System.Drawing.Point(185, 119); - this.textBoxComment.MaxLength = 24; - this.textBoxComment.Name = "textBoxComment"; - this.textBoxComment.Size = new System.Drawing.Size(219, 20); - this.textBoxComment.TabIndex = 7; - // - // labelComment - // - this.labelComment.AutoSize = true; - this.labelComment.Location = new System.Drawing.Point(13, 122); - this.labelComment.Name = "labelComment"; - this.labelComment.Size = new System.Drawing.Size(51, 13); - this.labelComment.TabIndex = 6; - this.labelComment.Text = "Comment"; - // - // textBoxTranslatedTitle - // - this.textBoxTranslatedTitle.Location = new System.Drawing.Point(185, 41); - this.textBoxTranslatedTitle.MaxLength = 28; - this.textBoxTranslatedTitle.Name = "textBoxTranslatedTitle"; - this.textBoxTranslatedTitle.Size = new System.Drawing.Size(219, 20); - this.textBoxTranslatedTitle.TabIndex = 1; - // - // labelTranslatedTitle - // - this.labelTranslatedTitle.AutoSize = true; - this.labelTranslatedTitle.Location = new System.Drawing.Point(13, 44); - this.labelTranslatedTitle.Name = "labelTranslatedTitle"; - this.labelTranslatedTitle.Size = new System.Drawing.Size(76, 13); - this.labelTranslatedTitle.TabIndex = 0; - this.labelTranslatedTitle.Text = "Translated title"; - // - // textBoxOriginalTitle - // - this.textBoxOriginalTitle.Location = new System.Drawing.Point(185, 67); - this.textBoxOriginalTitle.MaxLength = 24; - this.textBoxOriginalTitle.Name = "textBoxOriginalTitle"; - this.textBoxOriginalTitle.Size = new System.Drawing.Size(219, 20); - this.textBoxOriginalTitle.TabIndex = 3; - // - // labelOriginalTitle - // - this.labelOriginalTitle.AutoSize = true; - this.labelOriginalTitle.Location = new System.Drawing.Point(13, 70); - this.labelOriginalTitle.Name = "labelOriginalTitle"; - this.labelOriginalTitle.Size = new System.Drawing.Size(61, 13); - this.labelOriginalTitle.TabIndex = 2; - this.labelOriginalTitle.Text = "Original title"; - // - // textBoxTranslator - // - this.textBoxTranslator.Location = new System.Drawing.Point(185, 93); - this.textBoxTranslator.MaxLength = 24; - this.textBoxTranslator.Name = "textBoxTranslator"; - this.textBoxTranslator.Size = new System.Drawing.Size(219, 20); - this.textBoxTranslator.TabIndex = 5; - // - // labelTranslator - // - this.labelTranslator.AutoSize = true; - this.labelTranslator.Location = new System.Drawing.Point(13, 96); - this.labelTranslator.Name = "labelTranslator"; - this.labelTranslator.Size = new System.Drawing.Size(54, 13); - this.labelTranslator.TabIndex = 4; - this.labelTranslator.Text = "Translator"; - // - // timeUpDownStartTime - // - this.timeUpDownStartTime.AutoSize = true; - this.timeUpDownStartTime.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.timeUpDownStartTime.Font = new System.Drawing.Font("Segoe UI", 9F); - this.timeUpDownStartTime.Location = new System.Drawing.Point(183, 177); - this.timeUpDownStartTime.Margin = new System.Windows.Forms.Padding(4); - this.timeUpDownStartTime.Name = "timeUpDownStartTime"; - this.timeUpDownStartTime.Size = new System.Drawing.Size(96, 27); - this.timeUpDownStartTime.TabIndex = 11; - timeCode1.Hours = 0; - timeCode1.Milliseconds = 0; - timeCode1.Minutes = 0; - timeCode1.Seconds = 0; - timeCode1.TimeSpan = System.TimeSpan.Parse("00:00:00"); - timeCode1.TotalMilliseconds = 0D; - timeCode1.TotalSeconds = 0D; - this.timeUpDownStartTime.TimeCode = timeCode1; - this.timeUpDownStartTime.UseVideoOffset = false; - // - // comboBoxLanguage - // - this.comboBoxLanguage.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxLanguage.FormattingEnabled = true; - this.comboBoxLanguage.Items.AddRange(new object[] { - "Arabic", - "Danish", - "Chinese Simplified", - "Chinese Traditional", - "English", - "Hebrew", - "Russian", - "Romanian"}); - this.comboBoxLanguage.Location = new System.Drawing.Point(185, 149); - this.comboBoxLanguage.Name = "comboBoxLanguage"; - this.comboBoxLanguage.Size = new System.Drawing.Size(219, 21); - this.comboBoxLanguage.TabIndex = 9; - // - // labelLanguage - // - this.labelLanguage.AutoSize = true; - this.labelLanguage.Location = new System.Drawing.Point(16, 152); - this.labelLanguage.Name = "labelLanguage"; - this.labelLanguage.Size = new System.Drawing.Size(55, 13); - this.labelLanguage.TabIndex = 8; - this.labelLanguage.Text = "Language"; - // - // Cavena890SaveOptions - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(418, 297); - this.Controls.Add(this.labelLanguage); - this.Controls.Add(this.comboBoxLanguage); - this.Controls.Add(this.textBoxTranslator); - this.Controls.Add(this.labelTranslator); - this.Controls.Add(this.textBoxOriginalTitle); - this.Controls.Add(this.labelOriginalTitle); - this.Controls.Add(this.textBoxComment); - this.Controls.Add(this.labelComment); - this.Controls.Add(this.textBoxTranslatedTitle); - this.Controls.Add(this.labelTranslatedTitle); - this.Controls.Add(this.buttonImport); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.labelTimeCodeStartOfProgramme); - this.Controls.Add(this.timeUpDownStartTime); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "Cavena890SaveOptions"; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Cavena 890 save options"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Cavena890SaveOptions_KeyDown); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Label labelTimeCodeStartOfProgramme; - private Controls.TimeUpDown timeUpDownStartTime; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonImport; - private System.Windows.Forms.OpenFileDialog openFileDialog1; - private System.Windows.Forms.TextBox textBoxComment; - private System.Windows.Forms.Label labelComment; - private System.Windows.Forms.TextBox textBoxTranslatedTitle; - private System.Windows.Forms.Label labelTranslatedTitle; - private System.Windows.Forms.TextBox textBoxOriginalTitle; - private System.Windows.Forms.Label labelOriginalTitle; - private System.Windows.Forms.TextBox textBoxTranslator; - private System.Windows.Forms.Label labelTranslator; - private System.Windows.Forms.ComboBox comboBoxLanguage; - private System.Windows.Forms.Label labelLanguage; - } +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + partial class Cavena890SaveOptions + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + TimeCode timeCode1 = new TimeCode(); + this.labelTimeCodeStartOfProgramme = new System.Windows.Forms.Label(); + this.buttonOK = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonImport = new System.Windows.Forms.Button(); + this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); + this.textBoxComment = new System.Windows.Forms.TextBox(); + this.labelComment = new System.Windows.Forms.Label(); + this.textBoxTranslatedTitle = new System.Windows.Forms.TextBox(); + this.labelTranslatedTitle = new System.Windows.Forms.Label(); + this.textBoxOriginalTitle = new System.Windows.Forms.TextBox(); + this.labelOriginalTitle = new System.Windows.Forms.Label(); + this.textBoxTranslator = new System.Windows.Forms.TextBox(); + this.labelTranslator = new System.Windows.Forms.Label(); + this.timeUpDownStartTime = new Nikse.SubtitleEdit.Controls.TimeUpDown(); + this.comboBoxLanguage = new System.Windows.Forms.ComboBox(); + this.labelLanguage = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // labelTimeCodeStartOfProgramme + // + this.labelTimeCodeStartOfProgramme.AutoSize = true; + this.labelTimeCodeStartOfProgramme.Location = new System.Drawing.Point(12, 182); + this.labelTimeCodeStartOfProgramme.Name = "labelTimeCodeStartOfProgramme"; + this.labelTimeCodeStartOfProgramme.Size = new System.Drawing.Size(152, 13); + this.labelTimeCodeStartOfProgramme.TabIndex = 10; + this.labelTimeCodeStartOfProgramme.Text = "Time code: Start of programme"; + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(250, 262); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 12; + this.buttonOK.Text = "Save"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(331, 262); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 13; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // buttonImport + // + this.buttonImport.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.buttonImport.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonImport.Location = new System.Drawing.Point(290, 12); + this.buttonImport.Name = "buttonImport"; + this.buttonImport.Size = new System.Drawing.Size(116, 23); + this.buttonImport.TabIndex = 14; + this.buttonImport.Text = "Import..."; + this.buttonImport.UseVisualStyleBackColor = true; + this.buttonImport.Click += new System.EventHandler(this.buttonImport_Click); + // + // openFileDialog1 + // + this.openFileDialog1.FileName = "openFileDialog1"; + // + // textBoxComment + // + this.textBoxComment.Location = new System.Drawing.Point(185, 119); + this.textBoxComment.MaxLength = 24; + this.textBoxComment.Name = "textBoxComment"; + this.textBoxComment.Size = new System.Drawing.Size(219, 20); + this.textBoxComment.TabIndex = 7; + // + // labelComment + // + this.labelComment.AutoSize = true; + this.labelComment.Location = new System.Drawing.Point(13, 122); + this.labelComment.Name = "labelComment"; + this.labelComment.Size = new System.Drawing.Size(51, 13); + this.labelComment.TabIndex = 6; + this.labelComment.Text = "Comment"; + // + // textBoxTranslatedTitle + // + this.textBoxTranslatedTitle.Location = new System.Drawing.Point(185, 41); + this.textBoxTranslatedTitle.MaxLength = 28; + this.textBoxTranslatedTitle.Name = "textBoxTranslatedTitle"; + this.textBoxTranslatedTitle.Size = new System.Drawing.Size(219, 20); + this.textBoxTranslatedTitle.TabIndex = 1; + // + // labelTranslatedTitle + // + this.labelTranslatedTitle.AutoSize = true; + this.labelTranslatedTitle.Location = new System.Drawing.Point(13, 44); + this.labelTranslatedTitle.Name = "labelTranslatedTitle"; + this.labelTranslatedTitle.Size = new System.Drawing.Size(76, 13); + this.labelTranslatedTitle.TabIndex = 0; + this.labelTranslatedTitle.Text = "Translated title"; + // + // textBoxOriginalTitle + // + this.textBoxOriginalTitle.Location = new System.Drawing.Point(185, 67); + this.textBoxOriginalTitle.MaxLength = 24; + this.textBoxOriginalTitle.Name = "textBoxOriginalTitle"; + this.textBoxOriginalTitle.Size = new System.Drawing.Size(219, 20); + this.textBoxOriginalTitle.TabIndex = 3; + // + // labelOriginalTitle + // + this.labelOriginalTitle.AutoSize = true; + this.labelOriginalTitle.Location = new System.Drawing.Point(13, 70); + this.labelOriginalTitle.Name = "labelOriginalTitle"; + this.labelOriginalTitle.Size = new System.Drawing.Size(61, 13); + this.labelOriginalTitle.TabIndex = 2; + this.labelOriginalTitle.Text = "Original title"; + // + // textBoxTranslator + // + this.textBoxTranslator.Location = new System.Drawing.Point(185, 93); + this.textBoxTranslator.MaxLength = 24; + this.textBoxTranslator.Name = "textBoxTranslator"; + this.textBoxTranslator.Size = new System.Drawing.Size(219, 20); + this.textBoxTranslator.TabIndex = 5; + // + // labelTranslator + // + this.labelTranslator.AutoSize = true; + this.labelTranslator.Location = new System.Drawing.Point(13, 96); + this.labelTranslator.Name = "labelTranslator"; + this.labelTranslator.Size = new System.Drawing.Size(54, 13); + this.labelTranslator.TabIndex = 4; + this.labelTranslator.Text = "Translator"; + // + // timeUpDownStartTime + // + this.timeUpDownStartTime.AutoSize = true; + this.timeUpDownStartTime.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.timeUpDownStartTime.Font = new System.Drawing.Font("Segoe UI", 9F); + this.timeUpDownStartTime.Location = new System.Drawing.Point(183, 177); + this.timeUpDownStartTime.Margin = new System.Windows.Forms.Padding(4); + this.timeUpDownStartTime.Name = "timeUpDownStartTime"; + this.timeUpDownStartTime.Size = new System.Drawing.Size(96, 27); + this.timeUpDownStartTime.TabIndex = 11; + timeCode1.Hours = 0; + timeCode1.Milliseconds = 0; + timeCode1.Minutes = 0; + timeCode1.Seconds = 0; + timeCode1.TimeSpan = System.TimeSpan.Parse("00:00:00"); + timeCode1.TotalMilliseconds = 0D; + timeCode1.TotalSeconds = 0D; + this.timeUpDownStartTime.TimeCode = timeCode1; + this.timeUpDownStartTime.UseVideoOffset = false; + // + // comboBoxLanguage + // + this.comboBoxLanguage.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxLanguage.FormattingEnabled = true; + this.comboBoxLanguage.Items.AddRange(new object[] { + "Arabic", + "Danish", + "Chinese Simplified", + "Chinese Traditional", + "English", + "Hebrew", + "Russian", + "Romanian"}); + this.comboBoxLanguage.Location = new System.Drawing.Point(185, 149); + this.comboBoxLanguage.Name = "comboBoxLanguage"; + this.comboBoxLanguage.Size = new System.Drawing.Size(219, 21); + this.comboBoxLanguage.TabIndex = 9; + // + // labelLanguage + // + this.labelLanguage.AutoSize = true; + this.labelLanguage.Location = new System.Drawing.Point(16, 152); + this.labelLanguage.Name = "labelLanguage"; + this.labelLanguage.Size = new System.Drawing.Size(55, 13); + this.labelLanguage.TabIndex = 8; + this.labelLanguage.Text = "Language"; + // + // Cavena890SaveOptions + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(418, 297); + this.Controls.Add(this.labelLanguage); + this.Controls.Add(this.comboBoxLanguage); + this.Controls.Add(this.textBoxTranslator); + this.Controls.Add(this.labelTranslator); + this.Controls.Add(this.textBoxOriginalTitle); + this.Controls.Add(this.labelOriginalTitle); + this.Controls.Add(this.textBoxComment); + this.Controls.Add(this.labelComment); + this.Controls.Add(this.textBoxTranslatedTitle); + this.Controls.Add(this.labelTranslatedTitle); + this.Controls.Add(this.buttonImport); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.labelTimeCodeStartOfProgramme); + this.Controls.Add(this.timeUpDownStartTime); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "Cavena890SaveOptions"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Cavena 890 save options"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Cavena890SaveOptions_KeyDown); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label labelTimeCodeStartOfProgramme; + private Controls.TimeUpDown timeUpDownStartTime; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonImport; + private System.Windows.Forms.OpenFileDialog openFileDialog1; + private System.Windows.Forms.TextBox textBoxComment; + private System.Windows.Forms.Label labelComment; + private System.Windows.Forms.TextBox textBoxTranslatedTitle; + private System.Windows.Forms.Label labelTranslatedTitle; + private System.Windows.Forms.TextBox textBoxOriginalTitle; + private System.Windows.Forms.Label labelOriginalTitle; + private System.Windows.Forms.TextBox textBoxTranslator; + private System.Windows.Forms.Label labelTranslator; + private System.Windows.Forms.ComboBox comboBoxLanguage; + private System.Windows.Forms.Label labelLanguage; + } } \ No newline at end of file diff --git a/src/Forms/Cavena890SaveOptions.cs b/src/ui/Forms/Cavena890SaveOptions.cs similarity index 98% rename from src/Forms/Cavena890SaveOptions.cs rename to src/ui/Forms/Cavena890SaveOptions.cs index e7496297d..93ed65736 100644 --- a/src/Forms/Cavena890SaveOptions.cs +++ b/src/ui/Forms/Cavena890SaveOptions.cs @@ -1,183 +1,183 @@ -using System; -using System.IO; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.Common; -using Nikse.SubtitleEdit.Core.SubtitleFormats; -using Nikse.SubtitleEdit.Logic; - -namespace Nikse.SubtitleEdit.Forms -{ - public partial class Cavena890SaveOptions : Form - { - public Cavena890SaveOptions(Subtitle subtitle, string subtitleFileName) - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - - timeUpDownStartTime.ForceHHMMSSFF(); - timeUpDownStartTime.TimeCode = new TimeCode(TimeCode.ParseHHMMSSFFToMilliseconds(Configuration.Settings.SubtitleSettings.Cavena890StartOfMessage)); - textBoxTranslatedTitle.Text = Configuration.Settings.SubtitleSettings.CurrentCavena89Title; - textBoxOriginalTitle.Text = Configuration.Settings.SubtitleSettings.CurrentCavena890riginalTitle; - textBoxTranslator.Text = Configuration.Settings.SubtitleSettings.CurrentCavena890Translator; - textBoxComment.Text = Configuration.Settings.SubtitleSettings.CurrentCavena89Comment; - if (string.IsNullOrWhiteSpace(textBoxComment.Text)) - { - textBoxComment.Text = "Made with Subtitle Edit"; - } - - if (string.IsNullOrWhiteSpace(Configuration.Settings.SubtitleSettings.CurrentCavena89Title)) - { - string title = Path.GetFileNameWithoutExtension(subtitleFileName) ?? string.Empty; - if (title.Length > 28) - { - title = title.Substring(0, 28); - } - - textBoxTranslatedTitle.Text = title; - } - - var language = LanguageAutoDetect.AutoDetectGoogleLanguage(subtitle); - switch (language) - { - case "he": - Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdHebrew; - comboBoxLanguage.SelectedIndex = 5; - break; - case "ru": - Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdRussian; - comboBoxLanguage.SelectedIndex = 6; - break; - case "ro": - Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdRomanian; - comboBoxLanguage.SelectedIndex = 7; - break; - case "zh": - Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdChineseSimplified; - comboBoxLanguage.SelectedIndex = 2; - break; - case "da": - Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdDanish; - comboBoxLanguage.SelectedIndex = 1; - break; - default: - Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdEnglish; - comboBoxLanguage.SelectedIndex = 4; - break; - } - } - - private void Cavena890SaveOptions_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - private void buttonOK_Click(object sender, EventArgs e) - { - Configuration.Settings.SubtitleSettings.Cavena890StartOfMessage = timeUpDownStartTime.TimeCode.ToHHMMSSFF(); - Configuration.Settings.SubtitleSettings.CurrentCavena89Title = textBoxTranslatedTitle.Text; - Configuration.Settings.SubtitleSettings.CurrentCavena890riginalTitle = textBoxOriginalTitle.Text; - Configuration.Settings.SubtitleSettings.CurrentCavena890Translator = textBoxTranslator.Text; - Configuration.Settings.SubtitleSettings.CurrentCavena89Comment = textBoxComment.Text; - - switch (comboBoxLanguage.SelectedIndex) - { - case 0: - Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdArabic; - break; - case 1: - Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdDanish; - break; - case 2: - Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdChineseSimplified; - break; - case 3: - Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdChineseTraditional; - break; - case 5: - Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdHebrew; - break; - case 6: - Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdRussian; - break; - default: - Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdEnglish; - break; - } - - DialogResult = DialogResult.OK; - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private void buttonImport_Click(object sender, EventArgs e) - { - openFileDialog1.Filter = "Cavena 890 (*.890)|*.890"; - openFileDialog1.FileName = string.Empty; - if (openFileDialog1.ShowDialog() == DialogResult.OK) - { - var buffer = FileUtil.ReadAllBytesShared(openFileDialog1.FileName); - if (buffer.Length > 270) - { - var s = System.Text.Encoding.ASCII.GetString(buffer, 40, 28); - textBoxTranslatedTitle.Text = s.Replace("\0", string.Empty); - - s = System.Text.Encoding.ASCII.GetString(buffer, 218, 28); - textBoxOriginalTitle.Text = s.Replace("\0", string.Empty); - - s = System.Text.Encoding.ASCII.GetString(buffer, 68, 28); - textBoxTranslator.Text = s.Replace("\0", string.Empty); - - s = System.Text.Encoding.ASCII.GetString(buffer, 148, 24); - textBoxComment.Text = s.Replace("\0", string.Empty); - - s = System.Text.Encoding.ASCII.GetString(buffer, 256, 11); - timeUpDownStartTime.TimeCode = new TimeCode(TimeCode.ParseHHMMSSFFToMilliseconds(s)); - - switch (buffer[146]) - { - case Cavena890.LanguageIdHebrew: - Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdHebrew; - comboBoxLanguage.SelectedIndex = 5; - break; - case Cavena890.LanguageIdRussian: - Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdRussian; - comboBoxLanguage.SelectedIndex = 6; - break; - case Cavena890.LanguageIdChineseSimplified: - Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdChineseSimplified; - comboBoxLanguage.SelectedIndex = 2; - break; - case Cavena890.LanguageIdChineseTraditional: - Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdChineseSimplified; - comboBoxLanguage.SelectedIndex = 3; - break; - case Cavena890.LanguageIdDanish: - Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdDanish; - comboBoxLanguage.SelectedIndex = 1; - break; - case Cavena890.LanguageIdRomanian: - Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdRomanian; - comboBoxLanguage.SelectedIndex = 7; - break; - default: - Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdEnglish; - comboBoxLanguage.SelectedIndex = 4; - break; - } - } - } - } - - } -} +using System; +using System.IO; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.SubtitleFormats; +using Nikse.SubtitleEdit.Logic; + +namespace Nikse.SubtitleEdit.Forms +{ + public partial class Cavena890SaveOptions : Form + { + public Cavena890SaveOptions(Subtitle subtitle, string subtitleFileName) + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + + timeUpDownStartTime.ForceHHMMSSFF(); + timeUpDownStartTime.TimeCode = new TimeCode(TimeCode.ParseHHMMSSFFToMilliseconds(Configuration.Settings.SubtitleSettings.Cavena890StartOfMessage)); + textBoxTranslatedTitle.Text = Configuration.Settings.SubtitleSettings.CurrentCavena89Title; + textBoxOriginalTitle.Text = Configuration.Settings.SubtitleSettings.CurrentCavena890riginalTitle; + textBoxTranslator.Text = Configuration.Settings.SubtitleSettings.CurrentCavena890Translator; + textBoxComment.Text = Configuration.Settings.SubtitleSettings.CurrentCavena89Comment; + if (string.IsNullOrWhiteSpace(textBoxComment.Text)) + { + textBoxComment.Text = "Made with Subtitle Edit"; + } + + if (string.IsNullOrWhiteSpace(Configuration.Settings.SubtitleSettings.CurrentCavena89Title)) + { + string title = Path.GetFileNameWithoutExtension(subtitleFileName) ?? string.Empty; + if (title.Length > 28) + { + title = title.Substring(0, 28); + } + + textBoxTranslatedTitle.Text = title; + } + + var language = LanguageAutoDetect.AutoDetectGoogleLanguage(subtitle); + switch (language) + { + case "he": + Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdHebrew; + comboBoxLanguage.SelectedIndex = 5; + break; + case "ru": + Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdRussian; + comboBoxLanguage.SelectedIndex = 6; + break; + case "ro": + Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdRomanian; + comboBoxLanguage.SelectedIndex = 7; + break; + case "zh": + Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdChineseSimplified; + comboBoxLanguage.SelectedIndex = 2; + break; + case "da": + Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdDanish; + comboBoxLanguage.SelectedIndex = 1; + break; + default: + Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdEnglish; + comboBoxLanguage.SelectedIndex = 4; + break; + } + } + + private void Cavena890SaveOptions_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + private void buttonOK_Click(object sender, EventArgs e) + { + Configuration.Settings.SubtitleSettings.Cavena890StartOfMessage = timeUpDownStartTime.TimeCode.ToHHMMSSFF(); + Configuration.Settings.SubtitleSettings.CurrentCavena89Title = textBoxTranslatedTitle.Text; + Configuration.Settings.SubtitleSettings.CurrentCavena890riginalTitle = textBoxOriginalTitle.Text; + Configuration.Settings.SubtitleSettings.CurrentCavena890Translator = textBoxTranslator.Text; + Configuration.Settings.SubtitleSettings.CurrentCavena89Comment = textBoxComment.Text; + + switch (comboBoxLanguage.SelectedIndex) + { + case 0: + Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdArabic; + break; + case 1: + Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdDanish; + break; + case 2: + Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdChineseSimplified; + break; + case 3: + Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdChineseTraditional; + break; + case 5: + Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdHebrew; + break; + case 6: + Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdRussian; + break; + default: + Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdEnglish; + break; + } + + DialogResult = DialogResult.OK; + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void buttonImport_Click(object sender, EventArgs e) + { + openFileDialog1.Filter = "Cavena 890 (*.890)|*.890"; + openFileDialog1.FileName = string.Empty; + if (openFileDialog1.ShowDialog() == DialogResult.OK) + { + var buffer = FileUtil.ReadAllBytesShared(openFileDialog1.FileName); + if (buffer.Length > 270) + { + var s = System.Text.Encoding.ASCII.GetString(buffer, 40, 28); + textBoxTranslatedTitle.Text = s.Replace("\0", string.Empty); + + s = System.Text.Encoding.ASCII.GetString(buffer, 218, 28); + textBoxOriginalTitle.Text = s.Replace("\0", string.Empty); + + s = System.Text.Encoding.ASCII.GetString(buffer, 68, 28); + textBoxTranslator.Text = s.Replace("\0", string.Empty); + + s = System.Text.Encoding.ASCII.GetString(buffer, 148, 24); + textBoxComment.Text = s.Replace("\0", string.Empty); + + s = System.Text.Encoding.ASCII.GetString(buffer, 256, 11); + timeUpDownStartTime.TimeCode = new TimeCode(TimeCode.ParseHHMMSSFFToMilliseconds(s)); + + switch (buffer[146]) + { + case Cavena890.LanguageIdHebrew: + Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdHebrew; + comboBoxLanguage.SelectedIndex = 5; + break; + case Cavena890.LanguageIdRussian: + Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdRussian; + comboBoxLanguage.SelectedIndex = 6; + break; + case Cavena890.LanguageIdChineseSimplified: + Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdChineseSimplified; + comboBoxLanguage.SelectedIndex = 2; + break; + case Cavena890.LanguageIdChineseTraditional: + Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdChineseSimplified; + comboBoxLanguage.SelectedIndex = 3; + break; + case Cavena890.LanguageIdDanish: + Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdDanish; + comboBoxLanguage.SelectedIndex = 1; + break; + case Cavena890.LanguageIdRomanian: + Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdRomanian; + comboBoxLanguage.SelectedIndex = 7; + break; + default: + Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdEnglish; + comboBoxLanguage.SelectedIndex = 4; + break; + } + } + } + } + + } +} diff --git a/src/Forms/Cavena890SaveOptions.resx b/src/ui/Forms/Cavena890SaveOptions.resx similarity index 97% rename from src/Forms/Cavena890SaveOptions.resx rename to src/ui/Forms/Cavena890SaveOptions.resx index 3a7d67153..9bad2f599 100644 --- a/src/Forms/Cavena890SaveOptions.resx +++ b/src/ui/Forms/Cavena890SaveOptions.resx @@ -1,123 +1,123 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + \ No newline at end of file diff --git a/src/Forms/ChangeCasing.Designer.cs b/src/ui/Forms/ChangeCasing.Designer.cs similarity index 98% rename from src/Forms/ChangeCasing.Designer.cs rename to src/ui/Forms/ChangeCasing.Designer.cs index 127aecc31..3794d64c3 100644 --- a/src/Forms/ChangeCasing.Designer.cs +++ b/src/ui/Forms/ChangeCasing.Designer.cs @@ -1,190 +1,190 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class ChangeCasing - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.groupBoxChangeCasing = new System.Windows.Forms.GroupBox(); - this.radioButtonFixOnlyNames = new System.Windows.Forms.RadioButton(); - this.checkBoxFixNames = new System.Windows.Forms.CheckBox(); - this.checkBoxOnlyAllUpper = new System.Windows.Forms.CheckBox(); - this.radioButtonLowercase = new System.Windows.Forms.RadioButton(); - this.radioButtonUppercase = new System.Windows.Forms.RadioButton(); - this.radioButtonNormal = new System.Windows.Forms.RadioButton(); - this.groupBoxChangeCasing.SuspendLayout(); - this.SuspendLayout(); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(417, 195); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 14; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(336, 195); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 12; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // groupBoxChangeCasing - // - this.groupBoxChangeCasing.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxChangeCasing.Controls.Add(this.radioButtonFixOnlyNames); - this.groupBoxChangeCasing.Controls.Add(this.checkBoxFixNames); - this.groupBoxChangeCasing.Controls.Add(this.checkBoxOnlyAllUpper); - this.groupBoxChangeCasing.Controls.Add(this.radioButtonLowercase); - this.groupBoxChangeCasing.Controls.Add(this.radioButtonUppercase); - this.groupBoxChangeCasing.Controls.Add(this.radioButtonNormal); - this.groupBoxChangeCasing.Location = new System.Drawing.Point(12, 12); - this.groupBoxChangeCasing.Name = "groupBoxChangeCasing"; - this.groupBoxChangeCasing.Size = new System.Drawing.Size(480, 172); - this.groupBoxChangeCasing.TabIndex = 12; - this.groupBoxChangeCasing.TabStop = false; - this.groupBoxChangeCasing.Text = "Change casing to"; - // - // radioButtonFixOnlyNames - // - this.radioButtonFixOnlyNames.AutoSize = true; - this.radioButtonFixOnlyNames.Location = new System.Drawing.Point(11, 88); - this.radioButtonFixOnlyNames.Name = "radioButtonFixOnlyNames"; - this.radioButtonFixOnlyNames.Size = new System.Drawing.Size(267, 17); - this.radioButtonFixOnlyNames.TabIndex = 6; - this.radioButtonFixOnlyNames.Text = "Fix only names casing (via Dictionaries\\names.xml)"; - this.radioButtonFixOnlyNames.UseVisualStyleBackColor = true; - this.radioButtonFixOnlyNames.CheckedChanged += new System.EventHandler(this.RadioButton_CheckedChanged); - // - // checkBoxFixNames - // - this.checkBoxFixNames.AutoSize = true; - this.checkBoxFixNames.Checked = true; - this.checkBoxFixNames.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxFixNames.Location = new System.Drawing.Point(23, 39); - this.checkBoxFixNames.Name = "checkBoxFixNames"; - this.checkBoxFixNames.Size = new System.Drawing.Size(245, 17); - this.checkBoxFixNames.TabIndex = 2; - this.checkBoxFixNames.Text = "Fix names casing (via Dictionaries\\names.xml)"; - this.checkBoxFixNames.UseVisualStyleBackColor = true; - // - // checkBoxOnlyAllUpper - // - this.checkBoxOnlyAllUpper.AutoSize = true; - this.checkBoxOnlyAllUpper.Location = new System.Drawing.Point(23, 62); - this.checkBoxOnlyAllUpper.Name = "checkBoxOnlyAllUpper"; - this.checkBoxOnlyAllUpper.Size = new System.Drawing.Size(183, 17); - this.checkBoxOnlyAllUpper.TabIndex = 4; - this.checkBoxOnlyAllUpper.Text = "Only change all upper case lines."; - this.checkBoxOnlyAllUpper.UseVisualStyleBackColor = true; - // - // radioButtonLowercase - // - this.radioButtonLowercase.AutoSize = true; - this.radioButtonLowercase.Location = new System.Drawing.Point(11, 142); - this.radioButtonLowercase.Name = "radioButtonLowercase"; - this.radioButtonLowercase.Size = new System.Drawing.Size(86, 17); - this.radioButtonLowercase.TabIndex = 10; - this.radioButtonLowercase.Text = "all lowercase"; - this.radioButtonLowercase.UseVisualStyleBackColor = true; - this.radioButtonLowercase.CheckedChanged += new System.EventHandler(this.RadioButton_CheckedChanged); - // - // radioButtonUppercase - // - this.radioButtonUppercase.AutoSize = true; - this.radioButtonUppercase.Location = new System.Drawing.Point(11, 116); - this.radioButtonUppercase.Name = "radioButtonUppercase"; - this.radioButtonUppercase.Size = new System.Drawing.Size(103, 17); - this.radioButtonUppercase.TabIndex = 8; - this.radioButtonUppercase.Text = "ALL UPPERCASE"; - this.radioButtonUppercase.UseVisualStyleBackColor = true; - this.radioButtonUppercase.CheckedChanged += new System.EventHandler(this.RadioButton_CheckedChanged); - // - // radioButtonNormal - // - this.radioButtonNormal.AutoSize = true; - this.radioButtonNormal.Checked = true; - this.radioButtonNormal.Location = new System.Drawing.Point(11, 18); - this.radioButtonNormal.Name = "radioButtonNormal"; - this.radioButtonNormal.Size = new System.Drawing.Size(286, 17); - this.radioButtonNormal.TabIndex = 0; - this.radioButtonNormal.TabStop = true; - this.radioButtonNormal.Text = "Normal casing. Sentences begin with uppercase letter."; - this.radioButtonNormal.UseVisualStyleBackColor = true; - this.radioButtonNormal.CheckedChanged += new System.EventHandler(this.RadioButton_CheckedChanged); - // - // ChangeCasing - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(504, 228); - this.Controls.Add(this.groupBoxChangeCasing); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "ChangeCasing"; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Change casing"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormChangeCasing_KeyDown); - this.groupBoxChangeCasing.ResumeLayout(false); - this.groupBoxChangeCasing.PerformLayout(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.GroupBox groupBoxChangeCasing; - private System.Windows.Forms.RadioButton radioButtonUppercase; - private System.Windows.Forms.RadioButton radioButtonNormal; - private System.Windows.Forms.RadioButton radioButtonLowercase; - private System.Windows.Forms.CheckBox checkBoxOnlyAllUpper; - private System.Windows.Forms.CheckBox checkBoxFixNames; - private System.Windows.Forms.RadioButton radioButtonFixOnlyNames; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class ChangeCasing + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.groupBoxChangeCasing = new System.Windows.Forms.GroupBox(); + this.radioButtonFixOnlyNames = new System.Windows.Forms.RadioButton(); + this.checkBoxFixNames = new System.Windows.Forms.CheckBox(); + this.checkBoxOnlyAllUpper = new System.Windows.Forms.CheckBox(); + this.radioButtonLowercase = new System.Windows.Forms.RadioButton(); + this.radioButtonUppercase = new System.Windows.Forms.RadioButton(); + this.radioButtonNormal = new System.Windows.Forms.RadioButton(); + this.groupBoxChangeCasing.SuspendLayout(); + this.SuspendLayout(); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(417, 195); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 14; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(336, 195); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 12; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // groupBoxChangeCasing + // + this.groupBoxChangeCasing.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxChangeCasing.Controls.Add(this.radioButtonFixOnlyNames); + this.groupBoxChangeCasing.Controls.Add(this.checkBoxFixNames); + this.groupBoxChangeCasing.Controls.Add(this.checkBoxOnlyAllUpper); + this.groupBoxChangeCasing.Controls.Add(this.radioButtonLowercase); + this.groupBoxChangeCasing.Controls.Add(this.radioButtonUppercase); + this.groupBoxChangeCasing.Controls.Add(this.radioButtonNormal); + this.groupBoxChangeCasing.Location = new System.Drawing.Point(12, 12); + this.groupBoxChangeCasing.Name = "groupBoxChangeCasing"; + this.groupBoxChangeCasing.Size = new System.Drawing.Size(480, 172); + this.groupBoxChangeCasing.TabIndex = 12; + this.groupBoxChangeCasing.TabStop = false; + this.groupBoxChangeCasing.Text = "Change casing to"; + // + // radioButtonFixOnlyNames + // + this.radioButtonFixOnlyNames.AutoSize = true; + this.radioButtonFixOnlyNames.Location = new System.Drawing.Point(11, 88); + this.radioButtonFixOnlyNames.Name = "radioButtonFixOnlyNames"; + this.radioButtonFixOnlyNames.Size = new System.Drawing.Size(267, 17); + this.radioButtonFixOnlyNames.TabIndex = 6; + this.radioButtonFixOnlyNames.Text = "Fix only names casing (via Dictionaries\\names.xml)"; + this.radioButtonFixOnlyNames.UseVisualStyleBackColor = true; + this.radioButtonFixOnlyNames.CheckedChanged += new System.EventHandler(this.RadioButton_CheckedChanged); + // + // checkBoxFixNames + // + this.checkBoxFixNames.AutoSize = true; + this.checkBoxFixNames.Checked = true; + this.checkBoxFixNames.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxFixNames.Location = new System.Drawing.Point(23, 39); + this.checkBoxFixNames.Name = "checkBoxFixNames"; + this.checkBoxFixNames.Size = new System.Drawing.Size(245, 17); + this.checkBoxFixNames.TabIndex = 2; + this.checkBoxFixNames.Text = "Fix names casing (via Dictionaries\\names.xml)"; + this.checkBoxFixNames.UseVisualStyleBackColor = true; + // + // checkBoxOnlyAllUpper + // + this.checkBoxOnlyAllUpper.AutoSize = true; + this.checkBoxOnlyAllUpper.Location = new System.Drawing.Point(23, 62); + this.checkBoxOnlyAllUpper.Name = "checkBoxOnlyAllUpper"; + this.checkBoxOnlyAllUpper.Size = new System.Drawing.Size(183, 17); + this.checkBoxOnlyAllUpper.TabIndex = 4; + this.checkBoxOnlyAllUpper.Text = "Only change all upper case lines."; + this.checkBoxOnlyAllUpper.UseVisualStyleBackColor = true; + // + // radioButtonLowercase + // + this.radioButtonLowercase.AutoSize = true; + this.radioButtonLowercase.Location = new System.Drawing.Point(11, 142); + this.radioButtonLowercase.Name = "radioButtonLowercase"; + this.radioButtonLowercase.Size = new System.Drawing.Size(86, 17); + this.radioButtonLowercase.TabIndex = 10; + this.radioButtonLowercase.Text = "all lowercase"; + this.radioButtonLowercase.UseVisualStyleBackColor = true; + this.radioButtonLowercase.CheckedChanged += new System.EventHandler(this.RadioButton_CheckedChanged); + // + // radioButtonUppercase + // + this.radioButtonUppercase.AutoSize = true; + this.radioButtonUppercase.Location = new System.Drawing.Point(11, 116); + this.radioButtonUppercase.Name = "radioButtonUppercase"; + this.radioButtonUppercase.Size = new System.Drawing.Size(103, 17); + this.radioButtonUppercase.TabIndex = 8; + this.radioButtonUppercase.Text = "ALL UPPERCASE"; + this.radioButtonUppercase.UseVisualStyleBackColor = true; + this.radioButtonUppercase.CheckedChanged += new System.EventHandler(this.RadioButton_CheckedChanged); + // + // radioButtonNormal + // + this.radioButtonNormal.AutoSize = true; + this.radioButtonNormal.Checked = true; + this.radioButtonNormal.Location = new System.Drawing.Point(11, 18); + this.radioButtonNormal.Name = "radioButtonNormal"; + this.radioButtonNormal.Size = new System.Drawing.Size(286, 17); + this.radioButtonNormal.TabIndex = 0; + this.radioButtonNormal.TabStop = true; + this.radioButtonNormal.Text = "Normal casing. Sentences begin with uppercase letter."; + this.radioButtonNormal.UseVisualStyleBackColor = true; + this.radioButtonNormal.CheckedChanged += new System.EventHandler(this.RadioButton_CheckedChanged); + // + // ChangeCasing + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(504, 228); + this.Controls.Add(this.groupBoxChangeCasing); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "ChangeCasing"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Change casing"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormChangeCasing_KeyDown); + this.groupBoxChangeCasing.ResumeLayout(false); + this.groupBoxChangeCasing.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.GroupBox groupBoxChangeCasing; + private System.Windows.Forms.RadioButton radioButtonUppercase; + private System.Windows.Forms.RadioButton radioButtonNormal; + private System.Windows.Forms.RadioButton radioButtonLowercase; + private System.Windows.Forms.CheckBox checkBoxOnlyAllUpper; + private System.Windows.Forms.CheckBox checkBoxFixNames; + private System.Windows.Forms.RadioButton radioButtonFixOnlyNames; + } } \ No newline at end of file diff --git a/src/Forms/ChangeCasing.cs b/src/ui/Forms/ChangeCasing.cs similarity index 97% rename from src/Forms/ChangeCasing.cs rename to src/ui/Forms/ChangeCasing.cs index e064e7166..b39dbaf47 100644 --- a/src/Forms/ChangeCasing.cs +++ b/src/ui/Forms/ChangeCasing.cs @@ -1,111 +1,111 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class ChangeCasing : PositionAndSizeForm - { - public ChangeCasing() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - var language = Configuration.Settings.Language.ChangeCasing; - Text = language.Title; - groupBoxChangeCasing.Text = language.ChangeCasingTo; - radioButtonNormal.Text = language.NormalCasing; - checkBoxFixNames.Text = language.FixNamesCasing; - radioButtonFixOnlyNames.Text = language.FixOnlyNamesCasing; - checkBoxOnlyAllUpper.Text = language.OnlyChangeAllUppercaseLines; - radioButtonUppercase.Text = language.AllUppercase; - radioButtonLowercase.Text = language.AllLowercase; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - FixLargeFonts(); - - if (Configuration.Settings.Tools.ChangeCasingChoice == "NamesOnly") - { - radioButtonFixOnlyNames.Checked = true; - } - else if (Configuration.Settings.Tools.ChangeCasingChoice == "Uppercase") - { - radioButtonUppercase.Checked = true; - } - else if (Configuration.Settings.Tools.ChangeCasingChoice == "Lowercase") - { - radioButtonLowercase.Checked = true; - } - } - - public int LinesChanged { get; private set; } - - public bool ChangeNamesToo => radioButtonFixOnlyNames.Checked || radioButtonNormal.Checked && checkBoxFixNames.Checked; - - public bool OnlyAllUpper => checkBoxOnlyAllUpper.Checked; - - private void FixLargeFonts() - { - if (radioButtonNormal.Left + radioButtonNormal.Width + 40 > Width) - { - Width = radioButtonNormal.Left + radioButtonNormal.Width + 40; - } - - UiUtil.FixLargeFonts(this, buttonOK); - } - - internal void FixCasing(Subtitle subtitle, string language) - { - var fixCasing = new FixCasing(language) - { - FixNormal = radioButtonNormal.Checked, - FixMakeUppercase = radioButtonUppercase.Checked, - FixMakeLowercase = radioButtonLowercase.Checked, - FixNormalOnlyAllUppercase = checkBoxOnlyAllUpper.Checked - }; - fixCasing.Fix(subtitle); - LinesChanged = fixCasing.NoOfLinesChanged; - } - - private void FormChangeCasing_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - private void buttonOK_Click(object sender, EventArgs e) - { - if (radioButtonNormal.Checked) - { - Configuration.Settings.Tools.ChangeCasingChoice = "Normal"; - } - else if (radioButtonFixOnlyNames.Checked) - { - Configuration.Settings.Tools.ChangeCasingChoice = "NamesOnly"; - } - else if (radioButtonUppercase.Checked) - { - Configuration.Settings.Tools.ChangeCasingChoice = "Uppercase"; - } - else if (radioButtonLowercase.Checked) - { - Configuration.Settings.Tools.ChangeCasingChoice = "Lowercase"; - } - - DialogResult = DialogResult.OK; - } - - private void RadioButton_CheckedChanged(object sender, EventArgs e) - { - var isNormalCasing = sender == radioButtonNormal; - checkBoxFixNames.Enabled = isNormalCasing; - checkBoxOnlyAllUpper.Enabled = isNormalCasing; - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class ChangeCasing : PositionAndSizeForm + { + public ChangeCasing() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + var language = Configuration.Settings.Language.ChangeCasing; + Text = language.Title; + groupBoxChangeCasing.Text = language.ChangeCasingTo; + radioButtonNormal.Text = language.NormalCasing; + checkBoxFixNames.Text = language.FixNamesCasing; + radioButtonFixOnlyNames.Text = language.FixOnlyNamesCasing; + checkBoxOnlyAllUpper.Text = language.OnlyChangeAllUppercaseLines; + radioButtonUppercase.Text = language.AllUppercase; + radioButtonLowercase.Text = language.AllLowercase; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + FixLargeFonts(); + + if (Configuration.Settings.Tools.ChangeCasingChoice == "NamesOnly") + { + radioButtonFixOnlyNames.Checked = true; + } + else if (Configuration.Settings.Tools.ChangeCasingChoice == "Uppercase") + { + radioButtonUppercase.Checked = true; + } + else if (Configuration.Settings.Tools.ChangeCasingChoice == "Lowercase") + { + radioButtonLowercase.Checked = true; + } + } + + public int LinesChanged { get; private set; } + + public bool ChangeNamesToo => radioButtonFixOnlyNames.Checked || radioButtonNormal.Checked && checkBoxFixNames.Checked; + + public bool OnlyAllUpper => checkBoxOnlyAllUpper.Checked; + + private void FixLargeFonts() + { + if (radioButtonNormal.Left + radioButtonNormal.Width + 40 > Width) + { + Width = radioButtonNormal.Left + radioButtonNormal.Width + 40; + } + + UiUtil.FixLargeFonts(this, buttonOK); + } + + internal void FixCasing(Subtitle subtitle, string language) + { + var fixCasing = new FixCasing(language) + { + FixNormal = radioButtonNormal.Checked, + FixMakeUppercase = radioButtonUppercase.Checked, + FixMakeLowercase = radioButtonLowercase.Checked, + FixNormalOnlyAllUppercase = checkBoxOnlyAllUpper.Checked + }; + fixCasing.Fix(subtitle); + LinesChanged = fixCasing.NoOfLinesChanged; + } + + private void FormChangeCasing_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + private void buttonOK_Click(object sender, EventArgs e) + { + if (radioButtonNormal.Checked) + { + Configuration.Settings.Tools.ChangeCasingChoice = "Normal"; + } + else if (radioButtonFixOnlyNames.Checked) + { + Configuration.Settings.Tools.ChangeCasingChoice = "NamesOnly"; + } + else if (radioButtonUppercase.Checked) + { + Configuration.Settings.Tools.ChangeCasingChoice = "Uppercase"; + } + else if (radioButtonLowercase.Checked) + { + Configuration.Settings.Tools.ChangeCasingChoice = "Lowercase"; + } + + DialogResult = DialogResult.OK; + } + + private void RadioButton_CheckedChanged(object sender, EventArgs e) + { + var isNormalCasing = sender == radioButtonNormal; + checkBoxFixNames.Enabled = isNormalCasing; + checkBoxOnlyAllUpper.Enabled = isNormalCasing; + } + + } +} diff --git a/src/Forms/ChangeCasing.resx b/src/ui/Forms/ChangeCasing.resx similarity index 97% rename from src/Forms/ChangeCasing.resx rename to src/ui/Forms/ChangeCasing.resx index c7e0d4bdf..d58980a38 100644 --- a/src/Forms/ChangeCasing.resx +++ b/src/ui/Forms/ChangeCasing.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Forms/ChangeCasingNames.Designer.cs b/src/ui/Forms/ChangeCasingNames.Designer.cs similarity index 98% rename from src/Forms/ChangeCasingNames.Designer.cs rename to src/ui/Forms/ChangeCasingNames.Designer.cs index 1cc6df850..df3ab04d4 100644 --- a/src/Forms/ChangeCasingNames.Designer.cs +++ b/src/ui/Forms/ChangeCasingNames.Designer.cs @@ -1,352 +1,352 @@ -namespace Nikse.SubtitleEdit.Forms -{ - partial class ChangeCasingNames - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.buttonOK = new System.Windows.Forms.Button(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.groupBoxNames = new System.Windows.Forms.GroupBox(); - this.buttonAddCustomNames = new System.Windows.Forms.Button(); - this.textBoxExtraNames = new System.Windows.Forms.TextBox(); - this.labelExtraNames = new System.Windows.Forms.Label(); - this.buttonInverseSelection = new System.Windows.Forms.Button(); - this.buttonSelectAll = new System.Windows.Forms.Button(); - this.listViewNames = new System.Windows.Forms.ListView(); - this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.groupBoxLinesFound = new System.Windows.Forms.GroupBox(); - this.listViewFixes = new System.Windows.Forms.ListView(); - this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader7 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader8 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); - this.toolStripMenuItemSelectAll = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemInverseSelection = new System.Windows.Forms.ToolStripMenuItem(); - this.labelXLinesSelected = new System.Windows.Forms.Label(); - this.contextMenuStrip2SelectAll = new System.Windows.Forms.ContextMenuStrip(this.components); - this.toolStripMenuItem1SelectAll = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem2InverseSelection = new System.Windows.Forms.ToolStripMenuItem(); - this.groupBoxNames.SuspendLayout(); - this.groupBoxLinesFound.SuspendLayout(); - this.contextMenuStrip1.SuspendLayout(); - this.contextMenuStrip2SelectAll.SuspendLayout(); - this.SuspendLayout(); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.Location = new System.Drawing.Point(591, 602); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 14; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.Location = new System.Drawing.Point(672, 602); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 15; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - // - // groupBoxNames - // - this.groupBoxNames.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxNames.Controls.Add(this.buttonAddCustomNames); - this.groupBoxNames.Controls.Add(this.textBoxExtraNames); - this.groupBoxNames.Controls.Add(this.labelExtraNames); - this.groupBoxNames.Controls.Add(this.buttonInverseSelection); - this.groupBoxNames.Controls.Add(this.buttonSelectAll); - this.groupBoxNames.Controls.Add(this.listViewNames); - this.groupBoxNames.Location = new System.Drawing.Point(5, 9); - this.groupBoxNames.Name = "groupBoxNames"; - this.groupBoxNames.Size = new System.Drawing.Size(747, 293); - this.groupBoxNames.TabIndex = 12; - this.groupBoxNames.TabStop = false; - this.groupBoxNames.Text = "Names found in subtitle"; - // - // buttonAddCustomNames - // - this.buttonAddCustomNames.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonAddCustomNames.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonAddCustomNames.Location = new System.Drawing.Point(640, 262); - this.buttonAddCustomNames.Name = "buttonAddCustomNames"; - this.buttonAddCustomNames.Size = new System.Drawing.Size(100, 23); - this.buttonAddCustomNames.TabIndex = 11; - this.buttonAddCustomNames.Text = "Add"; - this.buttonAddCustomNames.UseVisualStyleBackColor = true; - this.buttonAddCustomNames.Click += new System.EventHandler(this.buttonAddCustomNames_Click); - // - // textBoxExtraNames - // - this.textBoxExtraNames.Location = new System.Drawing.Point(10, 263); - this.textBoxExtraNames.Name = "textBoxExtraNames"; - this.textBoxExtraNames.Size = new System.Drawing.Size(624, 21); - this.textBoxExtraNames.TabIndex = 10; - // - // labelExtraNames - // - this.labelExtraNames.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelExtraNames.AutoSize = true; - this.labelExtraNames.Location = new System.Drawing.Point(7, 246); - this.labelExtraNames.Name = "labelExtraNames"; - this.labelExtraNames.Size = new System.Drawing.Size(172, 13); - this.labelExtraNames.TabIndex = 17; - this.labelExtraNames.Text = "Extra names (separate by comma)"; - // - // buttonInverseSelection - // - this.buttonInverseSelection.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonInverseSelection.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonInverseSelection.Location = new System.Drawing.Point(88, 202); - this.buttonInverseSelection.Name = "buttonInverseSelection"; - this.buttonInverseSelection.Size = new System.Drawing.Size(100, 23); - this.buttonInverseSelection.TabIndex = 9; - this.buttonInverseSelection.Text = "Inverse selection"; - this.buttonInverseSelection.UseVisualStyleBackColor = true; - this.buttonInverseSelection.Click += new System.EventHandler(this.buttonInverseSelection_Click); - // - // buttonSelectAll - // - this.buttonSelectAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonSelectAll.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonSelectAll.Location = new System.Drawing.Point(7, 202); - this.buttonSelectAll.Name = "buttonSelectAll"; - this.buttonSelectAll.Size = new System.Drawing.Size(75, 23); - this.buttonSelectAll.TabIndex = 8; - this.buttonSelectAll.Text = "Select all"; - this.buttonSelectAll.UseVisualStyleBackColor = true; - this.buttonSelectAll.Click += new System.EventHandler(this.buttonSelectAll_Click); - // - // listViewNames - // - this.listViewNames.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.listViewNames.CheckBoxes = true; - this.listViewNames.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeader1, - this.columnHeader2}); - this.listViewNames.ContextMenuStrip = this.contextMenuStrip2SelectAll; - this.listViewNames.FullRowSelect = true; - this.listViewNames.HideSelection = false; - this.listViewNames.Location = new System.Drawing.Point(6, 19); - this.listViewNames.MultiSelect = false; - this.listViewNames.Name = "listViewNames"; - this.listViewNames.Size = new System.Drawing.Size(735, 177); - this.listViewNames.TabIndex = 7; - this.listViewNames.UseCompatibleStateImageBehavior = false; - this.listViewNames.View = System.Windows.Forms.View.Details; - this.listViewNames.SelectedIndexChanged += new System.EventHandler(this.ListViewNamesSelectedIndexChanged); - // - // columnHeader1 - // - this.columnHeader1.Text = "Enabled"; - this.columnHeader1.Width = 70; - // - // columnHeader2 - // - this.columnHeader2.Text = "Name"; - this.columnHeader2.Width = 620; - // - // groupBoxLinesFound - // - this.groupBoxLinesFound.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxLinesFound.Controls.Add(this.listViewFixes); - this.groupBoxLinesFound.Location = new System.Drawing.Point(5, 308); - this.groupBoxLinesFound.Name = "groupBoxLinesFound"; - this.groupBoxLinesFound.Size = new System.Drawing.Size(747, 286); - this.groupBoxLinesFound.TabIndex = 13; - this.groupBoxLinesFound.TabStop = false; - this.groupBoxLinesFound.Text = "Lines found: {0}"; - // - // listViewFixes - // - this.listViewFixes.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.listViewFixes.CheckBoxes = true; - this.listViewFixes.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeader4, - this.columnHeader5, - this.columnHeader7, - this.columnHeader8}); - this.listViewFixes.ContextMenuStrip = this.contextMenuStrip1; - this.listViewFixes.FullRowSelect = true; - this.listViewFixes.HideSelection = false; - this.listViewFixes.Location = new System.Drawing.Point(6, 23); - this.listViewFixes.Name = "listViewFixes"; - this.listViewFixes.Size = new System.Drawing.Size(735, 257); - this.listViewFixes.TabIndex = 9; - this.listViewFixes.UseCompatibleStateImageBehavior = false; - this.listViewFixes.View = System.Windows.Forms.View.Details; - this.listViewFixes.SelectedIndexChanged += new System.EventHandler(this.listViewFixes_SelectedIndexChanged); - // - // columnHeader4 - // - this.columnHeader4.Text = "Apply"; - this.columnHeader4.Width = 45; - // - // columnHeader5 - // - this.columnHeader5.Text = "Line#"; - this.columnHeader5.Width = 61; - // - // columnHeader7 - // - this.columnHeader7.Text = "Before"; - this.columnHeader7.Width = 292; - // - // columnHeader8 - // - this.columnHeader8.Text = "After"; - this.columnHeader8.Width = 292; - // - // contextMenuStrip1 - // - this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripMenuItemSelectAll, - this.toolStripMenuItemInverseSelection}); - this.contextMenuStrip1.Name = "contextMenuStrip1"; - this.contextMenuStrip1.Size = new System.Drawing.Size(162, 48); - // - // toolStripMenuItemSelectAll - // - this.toolStripMenuItemSelectAll.Name = "toolStripMenuItemSelectAll"; - this.toolStripMenuItemSelectAll.Size = new System.Drawing.Size(161, 22); - this.toolStripMenuItemSelectAll.Text = "Select all"; - this.toolStripMenuItemSelectAll.Click += new System.EventHandler(this.toolStripMenuItemSelectAll_Click); - // - // toolStripMenuItemInverseSelection - // - this.toolStripMenuItemInverseSelection.Name = "toolStripMenuItemInverseSelection"; - this.toolStripMenuItemInverseSelection.Size = new System.Drawing.Size(161, 22); - this.toolStripMenuItemInverseSelection.Text = "Inverse selection"; - this.toolStripMenuItemInverseSelection.Click += new System.EventHandler(this.toolStripMenuItemInverseSelection_Click); - // - // labelXLinesSelected - // - this.labelXLinesSelected.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelXLinesSelected.AutoSize = true; - this.labelXLinesSelected.Location = new System.Drawing.Point(5, 602); - this.labelXLinesSelected.Name = "labelXLinesSelected"; - this.labelXLinesSelected.Size = new System.Drawing.Size(78, 13); - this.labelXLinesSelected.TabIndex = 16; - this.labelXLinesSelected.Text = "XLinesSelected"; - // - // contextMenuStrip2SelectAll - // - this.contextMenuStrip2SelectAll.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripMenuItem1SelectAll, - this.toolStripMenuItem2InverseSelection}); - this.contextMenuStrip2SelectAll.Name = "contextMenuStrip1"; - this.contextMenuStrip2SelectAll.Size = new System.Drawing.Size(181, 70); - // - // toolStripMenuItem1SelectAll - // - this.toolStripMenuItem1SelectAll.Name = "toolStripMenuItem1SelectAll"; - this.toolStripMenuItem1SelectAll.Size = new System.Drawing.Size(180, 22); - this.toolStripMenuItem1SelectAll.Text = "Select all"; - this.toolStripMenuItem1SelectAll.Click += new System.EventHandler(this.toolStripMenuItem1SelectAll_Click); - // - // toolStripMenuItem2InverseSelection - // - this.toolStripMenuItem2InverseSelection.Name = "toolStripMenuItem2InverseSelection"; - this.toolStripMenuItem2InverseSelection.Size = new System.Drawing.Size(180, 22); - this.toolStripMenuItem2InverseSelection.Text = "Inverse selection"; - this.toolStripMenuItem2InverseSelection.Click += new System.EventHandler(this.toolStripMenuItem2InverseSelection_Click); - // - // ChangeCasingNames - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(757, 632); - this.Controls.Add(this.labelXLinesSelected); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.groupBoxNames); - this.Controls.Add(this.groupBoxLinesFound); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(600, 480); - this.Name = "ChangeCasingNames"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Change casing - Names"; - this.Shown += new System.EventHandler(this.ChangeCasingNames_Shown); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ChangeCasingNames_KeyDown); - this.groupBoxNames.ResumeLayout(false); - this.groupBoxNames.PerformLayout(); - this.groupBoxLinesFound.ResumeLayout(false); - this.contextMenuStrip1.ResumeLayout(false); - this.contextMenuStrip2SelectAll.ResumeLayout(false); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.GroupBox groupBoxNames; - private System.Windows.Forms.ListView listViewNames; - private System.Windows.Forms.ColumnHeader columnHeader1; - private System.Windows.Forms.ColumnHeader columnHeader2; - private System.Windows.Forms.GroupBox groupBoxLinesFound; - private System.Windows.Forms.ListView listViewFixes; - private System.Windows.Forms.ColumnHeader columnHeader4; - private System.Windows.Forms.ColumnHeader columnHeader5; - private System.Windows.Forms.ColumnHeader columnHeader7; - private System.Windows.Forms.ColumnHeader columnHeader8; - private System.Windows.Forms.Label labelXLinesSelected; - private System.Windows.Forms.Button buttonInverseSelection; - private System.Windows.Forms.Button buttonSelectAll; - private System.Windows.Forms.Button buttonAddCustomNames; - private System.Windows.Forms.TextBox textBoxExtraNames; - private System.Windows.Forms.Label labelExtraNames; - private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSelectAll; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInverseSelection; - private System.Windows.Forms.ContextMenuStrip contextMenuStrip2SelectAll; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1SelectAll; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem2InverseSelection; - } +namespace Nikse.SubtitleEdit.Forms +{ + partial class ChangeCasingNames + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.buttonOK = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.groupBoxNames = new System.Windows.Forms.GroupBox(); + this.buttonAddCustomNames = new System.Windows.Forms.Button(); + this.textBoxExtraNames = new System.Windows.Forms.TextBox(); + this.labelExtraNames = new System.Windows.Forms.Label(); + this.buttonInverseSelection = new System.Windows.Forms.Button(); + this.buttonSelectAll = new System.Windows.Forms.Button(); + this.listViewNames = new System.Windows.Forms.ListView(); + this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.groupBoxLinesFound = new System.Windows.Forms.GroupBox(); + this.listViewFixes = new System.Windows.Forms.ListView(); + this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader7 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader8 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItemSelectAll = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemInverseSelection = new System.Windows.Forms.ToolStripMenuItem(); + this.labelXLinesSelected = new System.Windows.Forms.Label(); + this.contextMenuStrip2SelectAll = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItem1SelectAll = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem2InverseSelection = new System.Windows.Forms.ToolStripMenuItem(); + this.groupBoxNames.SuspendLayout(); + this.groupBoxLinesFound.SuspendLayout(); + this.contextMenuStrip1.SuspendLayout(); + this.contextMenuStrip2SelectAll.SuspendLayout(); + this.SuspendLayout(); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.Location = new System.Drawing.Point(591, 602); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 14; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.Location = new System.Drawing.Point(672, 602); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 15; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + // + // groupBoxNames + // + this.groupBoxNames.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxNames.Controls.Add(this.buttonAddCustomNames); + this.groupBoxNames.Controls.Add(this.textBoxExtraNames); + this.groupBoxNames.Controls.Add(this.labelExtraNames); + this.groupBoxNames.Controls.Add(this.buttonInverseSelection); + this.groupBoxNames.Controls.Add(this.buttonSelectAll); + this.groupBoxNames.Controls.Add(this.listViewNames); + this.groupBoxNames.Location = new System.Drawing.Point(5, 9); + this.groupBoxNames.Name = "groupBoxNames"; + this.groupBoxNames.Size = new System.Drawing.Size(747, 293); + this.groupBoxNames.TabIndex = 12; + this.groupBoxNames.TabStop = false; + this.groupBoxNames.Text = "Names found in subtitle"; + // + // buttonAddCustomNames + // + this.buttonAddCustomNames.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonAddCustomNames.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonAddCustomNames.Location = new System.Drawing.Point(640, 262); + this.buttonAddCustomNames.Name = "buttonAddCustomNames"; + this.buttonAddCustomNames.Size = new System.Drawing.Size(100, 23); + this.buttonAddCustomNames.TabIndex = 11; + this.buttonAddCustomNames.Text = "Add"; + this.buttonAddCustomNames.UseVisualStyleBackColor = true; + this.buttonAddCustomNames.Click += new System.EventHandler(this.buttonAddCustomNames_Click); + // + // textBoxExtraNames + // + this.textBoxExtraNames.Location = new System.Drawing.Point(10, 263); + this.textBoxExtraNames.Name = "textBoxExtraNames"; + this.textBoxExtraNames.Size = new System.Drawing.Size(624, 21); + this.textBoxExtraNames.TabIndex = 10; + // + // labelExtraNames + // + this.labelExtraNames.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelExtraNames.AutoSize = true; + this.labelExtraNames.Location = new System.Drawing.Point(7, 246); + this.labelExtraNames.Name = "labelExtraNames"; + this.labelExtraNames.Size = new System.Drawing.Size(172, 13); + this.labelExtraNames.TabIndex = 17; + this.labelExtraNames.Text = "Extra names (separate by comma)"; + // + // buttonInverseSelection + // + this.buttonInverseSelection.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonInverseSelection.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonInverseSelection.Location = new System.Drawing.Point(88, 202); + this.buttonInverseSelection.Name = "buttonInverseSelection"; + this.buttonInverseSelection.Size = new System.Drawing.Size(100, 23); + this.buttonInverseSelection.TabIndex = 9; + this.buttonInverseSelection.Text = "Inverse selection"; + this.buttonInverseSelection.UseVisualStyleBackColor = true; + this.buttonInverseSelection.Click += new System.EventHandler(this.buttonInverseSelection_Click); + // + // buttonSelectAll + // + this.buttonSelectAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonSelectAll.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonSelectAll.Location = new System.Drawing.Point(7, 202); + this.buttonSelectAll.Name = "buttonSelectAll"; + this.buttonSelectAll.Size = new System.Drawing.Size(75, 23); + this.buttonSelectAll.TabIndex = 8; + this.buttonSelectAll.Text = "Select all"; + this.buttonSelectAll.UseVisualStyleBackColor = true; + this.buttonSelectAll.Click += new System.EventHandler(this.buttonSelectAll_Click); + // + // listViewNames + // + this.listViewNames.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listViewNames.CheckBoxes = true; + this.listViewNames.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader1, + this.columnHeader2}); + this.listViewNames.ContextMenuStrip = this.contextMenuStrip2SelectAll; + this.listViewNames.FullRowSelect = true; + this.listViewNames.HideSelection = false; + this.listViewNames.Location = new System.Drawing.Point(6, 19); + this.listViewNames.MultiSelect = false; + this.listViewNames.Name = "listViewNames"; + this.listViewNames.Size = new System.Drawing.Size(735, 177); + this.listViewNames.TabIndex = 7; + this.listViewNames.UseCompatibleStateImageBehavior = false; + this.listViewNames.View = System.Windows.Forms.View.Details; + this.listViewNames.SelectedIndexChanged += new System.EventHandler(this.ListViewNamesSelectedIndexChanged); + // + // columnHeader1 + // + this.columnHeader1.Text = "Enabled"; + this.columnHeader1.Width = 70; + // + // columnHeader2 + // + this.columnHeader2.Text = "Name"; + this.columnHeader2.Width = 620; + // + // groupBoxLinesFound + // + this.groupBoxLinesFound.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxLinesFound.Controls.Add(this.listViewFixes); + this.groupBoxLinesFound.Location = new System.Drawing.Point(5, 308); + this.groupBoxLinesFound.Name = "groupBoxLinesFound"; + this.groupBoxLinesFound.Size = new System.Drawing.Size(747, 286); + this.groupBoxLinesFound.TabIndex = 13; + this.groupBoxLinesFound.TabStop = false; + this.groupBoxLinesFound.Text = "Lines found: {0}"; + // + // listViewFixes + // + this.listViewFixes.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listViewFixes.CheckBoxes = true; + this.listViewFixes.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader4, + this.columnHeader5, + this.columnHeader7, + this.columnHeader8}); + this.listViewFixes.ContextMenuStrip = this.contextMenuStrip1; + this.listViewFixes.FullRowSelect = true; + this.listViewFixes.HideSelection = false; + this.listViewFixes.Location = new System.Drawing.Point(6, 23); + this.listViewFixes.Name = "listViewFixes"; + this.listViewFixes.Size = new System.Drawing.Size(735, 257); + this.listViewFixes.TabIndex = 9; + this.listViewFixes.UseCompatibleStateImageBehavior = false; + this.listViewFixes.View = System.Windows.Forms.View.Details; + this.listViewFixes.SelectedIndexChanged += new System.EventHandler(this.listViewFixes_SelectedIndexChanged); + // + // columnHeader4 + // + this.columnHeader4.Text = "Apply"; + this.columnHeader4.Width = 45; + // + // columnHeader5 + // + this.columnHeader5.Text = "Line#"; + this.columnHeader5.Width = 61; + // + // columnHeader7 + // + this.columnHeader7.Text = "Before"; + this.columnHeader7.Width = 292; + // + // columnHeader8 + // + this.columnHeader8.Text = "After"; + this.columnHeader8.Width = 292; + // + // contextMenuStrip1 + // + this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItemSelectAll, + this.toolStripMenuItemInverseSelection}); + this.contextMenuStrip1.Name = "contextMenuStrip1"; + this.contextMenuStrip1.Size = new System.Drawing.Size(162, 48); + // + // toolStripMenuItemSelectAll + // + this.toolStripMenuItemSelectAll.Name = "toolStripMenuItemSelectAll"; + this.toolStripMenuItemSelectAll.Size = new System.Drawing.Size(161, 22); + this.toolStripMenuItemSelectAll.Text = "Select all"; + this.toolStripMenuItemSelectAll.Click += new System.EventHandler(this.toolStripMenuItemSelectAll_Click); + // + // toolStripMenuItemInverseSelection + // + this.toolStripMenuItemInverseSelection.Name = "toolStripMenuItemInverseSelection"; + this.toolStripMenuItemInverseSelection.Size = new System.Drawing.Size(161, 22); + this.toolStripMenuItemInverseSelection.Text = "Inverse selection"; + this.toolStripMenuItemInverseSelection.Click += new System.EventHandler(this.toolStripMenuItemInverseSelection_Click); + // + // labelXLinesSelected + // + this.labelXLinesSelected.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelXLinesSelected.AutoSize = true; + this.labelXLinesSelected.Location = new System.Drawing.Point(5, 602); + this.labelXLinesSelected.Name = "labelXLinesSelected"; + this.labelXLinesSelected.Size = new System.Drawing.Size(78, 13); + this.labelXLinesSelected.TabIndex = 16; + this.labelXLinesSelected.Text = "XLinesSelected"; + // + // contextMenuStrip2SelectAll + // + this.contextMenuStrip2SelectAll.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItem1SelectAll, + this.toolStripMenuItem2InverseSelection}); + this.contextMenuStrip2SelectAll.Name = "contextMenuStrip1"; + this.contextMenuStrip2SelectAll.Size = new System.Drawing.Size(181, 70); + // + // toolStripMenuItem1SelectAll + // + this.toolStripMenuItem1SelectAll.Name = "toolStripMenuItem1SelectAll"; + this.toolStripMenuItem1SelectAll.Size = new System.Drawing.Size(180, 22); + this.toolStripMenuItem1SelectAll.Text = "Select all"; + this.toolStripMenuItem1SelectAll.Click += new System.EventHandler(this.toolStripMenuItem1SelectAll_Click); + // + // toolStripMenuItem2InverseSelection + // + this.toolStripMenuItem2InverseSelection.Name = "toolStripMenuItem2InverseSelection"; + this.toolStripMenuItem2InverseSelection.Size = new System.Drawing.Size(180, 22); + this.toolStripMenuItem2InverseSelection.Text = "Inverse selection"; + this.toolStripMenuItem2InverseSelection.Click += new System.EventHandler(this.toolStripMenuItem2InverseSelection_Click); + // + // ChangeCasingNames + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(757, 632); + this.Controls.Add(this.labelXLinesSelected); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.groupBoxNames); + this.Controls.Add(this.groupBoxLinesFound); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(600, 480); + this.Name = "ChangeCasingNames"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Change casing - Names"; + this.Shown += new System.EventHandler(this.ChangeCasingNames_Shown); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ChangeCasingNames_KeyDown); + this.groupBoxNames.ResumeLayout(false); + this.groupBoxNames.PerformLayout(); + this.groupBoxLinesFound.ResumeLayout(false); + this.contextMenuStrip1.ResumeLayout(false); + this.contextMenuStrip2SelectAll.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.GroupBox groupBoxNames; + private System.Windows.Forms.ListView listViewNames; + private System.Windows.Forms.ColumnHeader columnHeader1; + private System.Windows.Forms.ColumnHeader columnHeader2; + private System.Windows.Forms.GroupBox groupBoxLinesFound; + private System.Windows.Forms.ListView listViewFixes; + private System.Windows.Forms.ColumnHeader columnHeader4; + private System.Windows.Forms.ColumnHeader columnHeader5; + private System.Windows.Forms.ColumnHeader columnHeader7; + private System.Windows.Forms.ColumnHeader columnHeader8; + private System.Windows.Forms.Label labelXLinesSelected; + private System.Windows.Forms.Button buttonInverseSelection; + private System.Windows.Forms.Button buttonSelectAll; + private System.Windows.Forms.Button buttonAddCustomNames; + private System.Windows.Forms.TextBox textBoxExtraNames; + private System.Windows.Forms.Label labelExtraNames; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSelectAll; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInverseSelection; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip2SelectAll; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1SelectAll; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem2InverseSelection; + } } \ No newline at end of file diff --git a/src/Forms/ChangeCasingNames.cs b/src/ui/Forms/ChangeCasingNames.cs similarity index 97% rename from src/Forms/ChangeCasingNames.cs rename to src/ui/Forms/ChangeCasingNames.cs index 12832b5a0..6467b85d4 100644 --- a/src/Forms/ChangeCasingNames.cs +++ b/src/ui/Forms/ChangeCasingNames.cs @@ -1,357 +1,357 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.Dictionaries; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class ChangeCasingNames : Form - { - private readonly HashSet _usedNames = new HashSet(); - private Subtitle _subtitle; - private const string ExpectedEndChars = " ,.!?:;')]<-\"\r\n"; - private NameList _nameList; - private List _nameListInclMulti; - private string _language; - - public ChangeCasingNames() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - labelXLinesSelected.Text = string.Empty; - Text = Configuration.Settings.Language.ChangeCasingNames.Title; - groupBoxNames.Text = string.Empty; - listViewNames.Columns[0].Text = Configuration.Settings.Language.ChangeCasingNames.Enabled; - listViewNames.Columns[1].Text = Configuration.Settings.Language.ChangeCasingNames.Name; - groupBoxLinesFound.Text = string.Empty; - listViewFixes.Columns[0].Text = Configuration.Settings.Language.General.Apply; - listViewFixes.Columns[1].Text = Configuration.Settings.Language.General.LineNumber; - listViewFixes.Columns[2].Text = Configuration.Settings.Language.General.Before; - listViewFixes.Columns[3].Text = Configuration.Settings.Language.General.After; - - buttonSelectAll.Text = Configuration.Settings.Language.FixCommonErrors.SelectAll; - buttonInverseSelection.Text = Configuration.Settings.Language.FixCommonErrors.InverseSelection; - toolStripMenuItem1SelectAll.Text = Configuration.Settings.Language.FixCommonErrors.SelectAll; - toolStripMenuItem2InverseSelection.Text = Configuration.Settings.Language.FixCommonErrors.InverseSelection; - labelExtraNames.Text = Configuration.Settings.Language.ChangeCasingNames.ExtraNames; - buttonAddCustomNames.Text = Configuration.Settings.Language.DvdSubRip.Add; - toolStripMenuItemInverseSelection.Text = Configuration.Settings.Language.Main.Menu.Edit.InverseSelection; - toolStripMenuItemSelectAll.Text = Configuration.Settings.Language.Main.Menu.ContextMenu.SelectAll; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - listViewFixes.Resize += delegate - { - var width = (listViewFixes.Width - (listViewFixes.Columns[0].Width + listViewFixes.Columns[1].Width)) / 2; - listViewFixes.Columns[2].Width = width; - listViewFixes.Columns[3].Width = width; - }; - UiUtil.FixLargeFonts(this, buttonOK); - } - - public int LinesChanged { get; private set; } - - private void ChangeCasingNames_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - private void AddToListViewNames(string name) - { - var item = new ListViewItem(string.Empty) { Checked = true }; - item.SubItems.Add(name); - listViewNames.Items.Add(item); - } - - public void Initialize(Subtitle subtitle) - { - _subtitle = subtitle; - - _language = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle); - if (string.IsNullOrEmpty(_language)) - { - _language = "en_US"; - } - - _nameList = new NameList(Configuration.DictionariesDirectory, _language, Configuration.Settings.WordLists.UseOnlineNames, Configuration.Settings.WordLists.NamesUrl); - _nameListInclMulti = _nameList.GetAllNames(); // Will contains both one word names and multi names - - FindAllNames(); - if (_language.StartsWith("en", StringComparison.OrdinalIgnoreCase)) - { - foreach (ListViewItem item in listViewNames.Items) - { - var name = item.SubItems[1].Text; - if (name == "US") - { - item.Checked = false; - } - } - } - - GeneratePreview(); - } - - private void GeneratePreview() - { - Cursor = Cursors.WaitCursor; - listViewFixes.BeginUpdate(); - listViewFixes.Items.Clear(); - foreach (var p in _subtitle.Paragraphs) - { - string text = p.Text; - foreach (ListViewItem item in listViewNames.Items) - { - string name = item.SubItems[1].Text; - - string textNoTags = HtmlUtil.RemoveHtmlTags(text, true); - if (textNoTags != textNoTags.ToUpperInvariant()) - { - if (item.Checked && text != null && text.Contains(name, StringComparison.OrdinalIgnoreCase) && name.Length > 1 && name != name.ToLowerInvariant()) - { - var st = new StrippableText(text); - st.FixCasing(new List { name }, true, false, false, string.Empty); - text = st.MergedString; - } - } - } - if (text != p.Text) - { - AddToPreviewListView(p, text); - } - } - listViewFixes.EndUpdate(); - groupBoxLinesFound.Text = string.Format(Configuration.Settings.Language.ChangeCasingNames.LinesFoundX, listViewFixes.Items.Count); - Cursor = Cursors.Default; - } - - private void AddToPreviewListView(Paragraph p, string newText) - { - var item = new ListViewItem(string.Empty) { Tag = p, Checked = true }; - item.SubItems.Add(p.Number.ToString(CultureInfo.InvariantCulture)); - item.SubItems.Add(UiUtil.GetListViewTextFromString(p.Text)); - item.SubItems.Add(UiUtil.GetListViewTextFromString(newText)); - listViewFixes.Items.Add(item); - } - - private void AddCustomNames() - { - foreach (var s in textBoxExtraNames.Text.Split(',')) - { - var name = s.Trim(); - if (name.Length > 1 && !_nameListInclMulti.Contains(name)) - { - _nameListInclMulti.Add(name); - } - } - } - - private void FindAllNames() - { - string text = HtmlUtil.RemoveHtmlTags(_subtitle.GetAllTexts()); - string textToLower = text.ToLowerInvariant(); - listViewNames.BeginUpdate(); - foreach (var name in _nameListInclMulti) - { - int startIndex = textToLower.IndexOf(name.ToLowerInvariant(), StringComparison.Ordinal); - if (startIndex >= 0) - { - while (startIndex >= 0 && startIndex < text.Length && - textToLower.Substring(startIndex).Contains(name.ToLowerInvariant()) && name.Length > 1 && name != name.ToLowerInvariant()) - { - bool startOk = startIndex == 0 || "([ --'>\r\n¿¡\"”“„".Contains(text[startIndex - 1]); - if (startOk) - { - int end = startIndex + name.Length; - bool endOk = end <= text.Length; - if (endOk) - { - endOk = end == text.Length || ExpectedEndChars.Contains(text[end]); - } - - if (endOk && text.Substring(startIndex, name.Length) != name) // do not add names where casing already is correct - { - if (!_usedNames.Contains(name)) - { - var isDont = _language.StartsWith("en", StringComparison.OrdinalIgnoreCase) && text.Substring(startIndex).StartsWith("don't", StringComparison.InvariantCultureIgnoreCase); - if (!isDont) - { - _usedNames.Add(name); - AddToListViewNames(name); - break; // break while - } - } - } - } - - startIndex = textToLower.IndexOf(name.ToLowerInvariant(), startIndex + 2, StringComparison.Ordinal); - } - } - } - listViewNames.EndUpdate(); - groupBoxNames.Text = string.Format(Configuration.Settings.Language.ChangeCasingNames.NamesFoundInSubtitleX, listViewNames.Items.Count); - } - - private void ListViewNamesSelectedIndexChanged(object sender, EventArgs e) - { - labelXLinesSelected.Text = string.Empty; - if (listViewNames.SelectedItems.Count != 1) - { - return; - } - - string name = listViewNames.SelectedItems[0].SubItems[1].Text; - listViewFixes.BeginUpdate(); - - foreach (ListViewItem item in listViewFixes.Items) - { - item.Selected = false; - - string text = UiUtil.GetStringFromListViewText(item.SubItems[2].Text); - - string lower = text.ToLowerInvariant(); - if (lower.Contains(name.ToLowerInvariant()) && name.Length > 1 && name != name.ToLowerInvariant()) - { - int start = lower.IndexOf(name.ToLowerInvariant(), StringComparison.Ordinal); - if (start >= 0) - { - bool startOk = start == 0 || lower[start - 1] == ' ' || lower[start - 1] == '-' || lower[start - 1] == '"' || - lower[start - 1] == '\'' || lower[start - 1] == '>' || Environment.NewLine.EndsWith(lower[start - 1]); - - if (startOk) - { - int end = start + name.Length; - bool endOk = end <= lower.Length; - if (endOk) - { - endOk = end == lower.Length || ExpectedEndChars.Contains(lower[end]); - } - - item.Selected = endOk; - } - } - } - } - - listViewFixes.EndUpdate(); - - if (listViewFixes.SelectedItems.Count > 0) - { - listViewFixes.EnsureVisible(listViewFixes.SelectedItems[0].Index); - } - } - - private void ListViewNamesItemChecked(object sender, ItemCheckedEventArgs e) - { - GeneratePreview(); - } - - private void ChangeCasingNames_Shown(object sender, EventArgs e) - { - listViewNames.ItemChecked += ListViewNamesItemChecked; - } - - internal void FixCasing() - { - foreach (ListViewItem item in listViewFixes.Items) - { - if (item.Checked) - { - LinesChanged++; - var p = item.Tag as Paragraph; - if (p != null) - { - p.Text = UiUtil.GetStringFromListViewText(item.SubItems[3].Text); - } - } - } - } - - private void ButtonOkClick(object sender, EventArgs e) - { - DialogResult = DialogResult.OK; - } - - private void listViewFixes_SelectedIndexChanged(object sender, EventArgs e) - { - if (listViewFixes.SelectedItems.Count > 1) - { - labelXLinesSelected.Text = string.Format(Configuration.Settings.Language.Main.XLinesSelected, listViewFixes.SelectedItems.Count); - } - else - { - labelXLinesSelected.Text = string.Empty; - } - } - - private void buttonSelectAll_Click(object sender, EventArgs e) - { - DoSelection(true); - } - - private void buttonInverseSelection_Click(object sender, EventArgs e) - { - DoSelection(false); - } - - private void DoSelection(bool selectAll) - { - listViewNames.ItemChecked -= ListViewNamesItemChecked; - listViewNames.BeginUpdate(); - foreach (ListViewItem item in listViewNames.Items) - { - if (selectAll) - { - item.Checked = true; - } - else - { - item.Checked = !item.Checked; - } - } - listViewNames.EndUpdate(); - listViewNames.ItemChecked += ListViewNamesItemChecked; - GeneratePreview(); - } - - private void buttonAddCustomNames_Click(object sender, EventArgs e) - { - AddCustomNames(); - textBoxExtraNames.Text = string.Empty; - FindAllNames(); - } - - private void toolStripMenuItemSelectAll_Click(object sender, EventArgs e) - { - foreach (ListViewItem item in listViewFixes.Items) - { - item.Checked = true; - } - } - - private void toolStripMenuItemInverseSelection_Click(object sender, EventArgs e) - { - foreach (ListViewItem item in listViewFixes.Items) - { - item.Checked = !item.Checked; - } - } - - private void toolStripMenuItem1SelectAll_Click(object sender, EventArgs e) - { - DoSelection(true); - } - - private void toolStripMenuItem2InverseSelection_Click(object sender, EventArgs e) - { - DoSelection(false); - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.Dictionaries; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class ChangeCasingNames : Form + { + private readonly HashSet _usedNames = new HashSet(); + private Subtitle _subtitle; + private const string ExpectedEndChars = " ,.!?:;')]<-\"\r\n"; + private NameList _nameList; + private List _nameListInclMulti; + private string _language; + + public ChangeCasingNames() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + labelXLinesSelected.Text = string.Empty; + Text = Configuration.Settings.Language.ChangeCasingNames.Title; + groupBoxNames.Text = string.Empty; + listViewNames.Columns[0].Text = Configuration.Settings.Language.ChangeCasingNames.Enabled; + listViewNames.Columns[1].Text = Configuration.Settings.Language.ChangeCasingNames.Name; + groupBoxLinesFound.Text = string.Empty; + listViewFixes.Columns[0].Text = Configuration.Settings.Language.General.Apply; + listViewFixes.Columns[1].Text = Configuration.Settings.Language.General.LineNumber; + listViewFixes.Columns[2].Text = Configuration.Settings.Language.General.Before; + listViewFixes.Columns[3].Text = Configuration.Settings.Language.General.After; + + buttonSelectAll.Text = Configuration.Settings.Language.FixCommonErrors.SelectAll; + buttonInverseSelection.Text = Configuration.Settings.Language.FixCommonErrors.InverseSelection; + toolStripMenuItem1SelectAll.Text = Configuration.Settings.Language.FixCommonErrors.SelectAll; + toolStripMenuItem2InverseSelection.Text = Configuration.Settings.Language.FixCommonErrors.InverseSelection; + labelExtraNames.Text = Configuration.Settings.Language.ChangeCasingNames.ExtraNames; + buttonAddCustomNames.Text = Configuration.Settings.Language.DvdSubRip.Add; + toolStripMenuItemInverseSelection.Text = Configuration.Settings.Language.Main.Menu.Edit.InverseSelection; + toolStripMenuItemSelectAll.Text = Configuration.Settings.Language.Main.Menu.ContextMenu.SelectAll; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + listViewFixes.Resize += delegate + { + var width = (listViewFixes.Width - (listViewFixes.Columns[0].Width + listViewFixes.Columns[1].Width)) / 2; + listViewFixes.Columns[2].Width = width; + listViewFixes.Columns[3].Width = width; + }; + UiUtil.FixLargeFonts(this, buttonOK); + } + + public int LinesChanged { get; private set; } + + private void ChangeCasingNames_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + private void AddToListViewNames(string name) + { + var item = new ListViewItem(string.Empty) { Checked = true }; + item.SubItems.Add(name); + listViewNames.Items.Add(item); + } + + public void Initialize(Subtitle subtitle) + { + _subtitle = subtitle; + + _language = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle); + if (string.IsNullOrEmpty(_language)) + { + _language = "en_US"; + } + + _nameList = new NameList(Configuration.DictionariesDirectory, _language, Configuration.Settings.WordLists.UseOnlineNames, Configuration.Settings.WordLists.NamesUrl); + _nameListInclMulti = _nameList.GetAllNames(); // Will contains both one word names and multi names + + FindAllNames(); + if (_language.StartsWith("en", StringComparison.OrdinalIgnoreCase)) + { + foreach (ListViewItem item in listViewNames.Items) + { + var name = item.SubItems[1].Text; + if (name == "US") + { + item.Checked = false; + } + } + } + + GeneratePreview(); + } + + private void GeneratePreview() + { + Cursor = Cursors.WaitCursor; + listViewFixes.BeginUpdate(); + listViewFixes.Items.Clear(); + foreach (var p in _subtitle.Paragraphs) + { + string text = p.Text; + foreach (ListViewItem item in listViewNames.Items) + { + string name = item.SubItems[1].Text; + + string textNoTags = HtmlUtil.RemoveHtmlTags(text, true); + if (textNoTags != textNoTags.ToUpperInvariant()) + { + if (item.Checked && text != null && text.Contains(name, StringComparison.OrdinalIgnoreCase) && name.Length > 1 && name != name.ToLowerInvariant()) + { + var st = new StrippableText(text); + st.FixCasing(new List { name }, true, false, false, string.Empty); + text = st.MergedString; + } + } + } + if (text != p.Text) + { + AddToPreviewListView(p, text); + } + } + listViewFixes.EndUpdate(); + groupBoxLinesFound.Text = string.Format(Configuration.Settings.Language.ChangeCasingNames.LinesFoundX, listViewFixes.Items.Count); + Cursor = Cursors.Default; + } + + private void AddToPreviewListView(Paragraph p, string newText) + { + var item = new ListViewItem(string.Empty) { Tag = p, Checked = true }; + item.SubItems.Add(p.Number.ToString(CultureInfo.InvariantCulture)); + item.SubItems.Add(UiUtil.GetListViewTextFromString(p.Text)); + item.SubItems.Add(UiUtil.GetListViewTextFromString(newText)); + listViewFixes.Items.Add(item); + } + + private void AddCustomNames() + { + foreach (var s in textBoxExtraNames.Text.Split(',')) + { + var name = s.Trim(); + if (name.Length > 1 && !_nameListInclMulti.Contains(name)) + { + _nameListInclMulti.Add(name); + } + } + } + + private void FindAllNames() + { + string text = HtmlUtil.RemoveHtmlTags(_subtitle.GetAllTexts()); + string textToLower = text.ToLowerInvariant(); + listViewNames.BeginUpdate(); + foreach (var name in _nameListInclMulti) + { + int startIndex = textToLower.IndexOf(name.ToLowerInvariant(), StringComparison.Ordinal); + if (startIndex >= 0) + { + while (startIndex >= 0 && startIndex < text.Length && + textToLower.Substring(startIndex).Contains(name.ToLowerInvariant()) && name.Length > 1 && name != name.ToLowerInvariant()) + { + bool startOk = startIndex == 0 || "([ --'>\r\n¿¡\"”“„".Contains(text[startIndex - 1]); + if (startOk) + { + int end = startIndex + name.Length; + bool endOk = end <= text.Length; + if (endOk) + { + endOk = end == text.Length || ExpectedEndChars.Contains(text[end]); + } + + if (endOk && text.Substring(startIndex, name.Length) != name) // do not add names where casing already is correct + { + if (!_usedNames.Contains(name)) + { + var isDont = _language.StartsWith("en", StringComparison.OrdinalIgnoreCase) && text.Substring(startIndex).StartsWith("don't", StringComparison.InvariantCultureIgnoreCase); + if (!isDont) + { + _usedNames.Add(name); + AddToListViewNames(name); + break; // break while + } + } + } + } + + startIndex = textToLower.IndexOf(name.ToLowerInvariant(), startIndex + 2, StringComparison.Ordinal); + } + } + } + listViewNames.EndUpdate(); + groupBoxNames.Text = string.Format(Configuration.Settings.Language.ChangeCasingNames.NamesFoundInSubtitleX, listViewNames.Items.Count); + } + + private void ListViewNamesSelectedIndexChanged(object sender, EventArgs e) + { + labelXLinesSelected.Text = string.Empty; + if (listViewNames.SelectedItems.Count != 1) + { + return; + } + + string name = listViewNames.SelectedItems[0].SubItems[1].Text; + listViewFixes.BeginUpdate(); + + foreach (ListViewItem item in listViewFixes.Items) + { + item.Selected = false; + + string text = UiUtil.GetStringFromListViewText(item.SubItems[2].Text); + + string lower = text.ToLowerInvariant(); + if (lower.Contains(name.ToLowerInvariant()) && name.Length > 1 && name != name.ToLowerInvariant()) + { + int start = lower.IndexOf(name.ToLowerInvariant(), StringComparison.Ordinal); + if (start >= 0) + { + bool startOk = start == 0 || lower[start - 1] == ' ' || lower[start - 1] == '-' || lower[start - 1] == '"' || + lower[start - 1] == '\'' || lower[start - 1] == '>' || Environment.NewLine.EndsWith(lower[start - 1]); + + if (startOk) + { + int end = start + name.Length; + bool endOk = end <= lower.Length; + if (endOk) + { + endOk = end == lower.Length || ExpectedEndChars.Contains(lower[end]); + } + + item.Selected = endOk; + } + } + } + } + + listViewFixes.EndUpdate(); + + if (listViewFixes.SelectedItems.Count > 0) + { + listViewFixes.EnsureVisible(listViewFixes.SelectedItems[0].Index); + } + } + + private void ListViewNamesItemChecked(object sender, ItemCheckedEventArgs e) + { + GeneratePreview(); + } + + private void ChangeCasingNames_Shown(object sender, EventArgs e) + { + listViewNames.ItemChecked += ListViewNamesItemChecked; + } + + internal void FixCasing() + { + foreach (ListViewItem item in listViewFixes.Items) + { + if (item.Checked) + { + LinesChanged++; + var p = item.Tag as Paragraph; + if (p != null) + { + p.Text = UiUtil.GetStringFromListViewText(item.SubItems[3].Text); + } + } + } + } + + private void ButtonOkClick(object sender, EventArgs e) + { + DialogResult = DialogResult.OK; + } + + private void listViewFixes_SelectedIndexChanged(object sender, EventArgs e) + { + if (listViewFixes.SelectedItems.Count > 1) + { + labelXLinesSelected.Text = string.Format(Configuration.Settings.Language.Main.XLinesSelected, listViewFixes.SelectedItems.Count); + } + else + { + labelXLinesSelected.Text = string.Empty; + } + } + + private void buttonSelectAll_Click(object sender, EventArgs e) + { + DoSelection(true); + } + + private void buttonInverseSelection_Click(object sender, EventArgs e) + { + DoSelection(false); + } + + private void DoSelection(bool selectAll) + { + listViewNames.ItemChecked -= ListViewNamesItemChecked; + listViewNames.BeginUpdate(); + foreach (ListViewItem item in listViewNames.Items) + { + if (selectAll) + { + item.Checked = true; + } + else + { + item.Checked = !item.Checked; + } + } + listViewNames.EndUpdate(); + listViewNames.ItemChecked += ListViewNamesItemChecked; + GeneratePreview(); + } + + private void buttonAddCustomNames_Click(object sender, EventArgs e) + { + AddCustomNames(); + textBoxExtraNames.Text = string.Empty; + FindAllNames(); + } + + private void toolStripMenuItemSelectAll_Click(object sender, EventArgs e) + { + foreach (ListViewItem item in listViewFixes.Items) + { + item.Checked = true; + } + } + + private void toolStripMenuItemInverseSelection_Click(object sender, EventArgs e) + { + foreach (ListViewItem item in listViewFixes.Items) + { + item.Checked = !item.Checked; + } + } + + private void toolStripMenuItem1SelectAll_Click(object sender, EventArgs e) + { + DoSelection(true); + } + + private void toolStripMenuItem2InverseSelection_Click(object sender, EventArgs e) + { + DoSelection(false); + } + } +} diff --git a/src/Forms/ChangeCasingNames.resx b/src/ui/Forms/ChangeCasingNames.resx similarity index 97% rename from src/Forms/ChangeCasingNames.resx rename to src/ui/Forms/ChangeCasingNames.resx index 9292214b5..b52bb6b1c 100644 --- a/src/Forms/ChangeCasingNames.resx +++ b/src/ui/Forms/ChangeCasingNames.resx @@ -1,126 +1,126 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 172, 17 - - - 17, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 172, 17 + + + 17, 17 + \ No newline at end of file diff --git a/src/Forms/ChangeFrameRate.Designer.cs b/src/ui/Forms/ChangeFrameRate.Designer.cs similarity index 98% rename from src/Forms/ChangeFrameRate.Designer.cs rename to src/ui/Forms/ChangeFrameRate.Designer.cs index b4648679d..3637f2001 100644 --- a/src/Forms/ChangeFrameRate.Designer.cs +++ b/src/ui/Forms/ChangeFrameRate.Designer.cs @@ -1,188 +1,188 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class ChangeFrameRate - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.labelInfo = new System.Windows.Forms.Label(); - this.comboBoxFrameRateFrom = new System.Windows.Forms.ComboBox(); - this.labelFromFrameRate = new System.Windows.Forms.Label(); - this.comboBoxFrameRateTo = new System.Windows.Forms.ComboBox(); - this.labelToFrameRate = new System.Windows.Forms.Label(); - this.buttonGetFrameRateFrom = new System.Windows.Forms.Button(); - this.buttonGetFrameRateTo = new System.Windows.Forms.Button(); - this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); - this.buttonSwap = new System.Windows.Forms.Button(); - this.SuspendLayout(); - // - // buttonCancel - // - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(277, 113); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 3; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - // - // buttonOK - // - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(194, 113); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 2; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); - // - // labelInfo - // - this.labelInfo.AllowDrop = true; - this.labelInfo.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.labelInfo.Location = new System.Drawing.Point(12, 9); - this.labelInfo.Name = "labelInfo"; - this.labelInfo.Size = new System.Drawing.Size(284, 26); - this.labelInfo.TabIndex = 3; - this.labelInfo.Text = "Convert frame rate of subtitle"; - // - // comboBoxFrameRateFrom - // - this.comboBoxFrameRateFrom.FormattingEnabled = true; - this.comboBoxFrameRateFrom.Location = new System.Drawing.Point(148, 45); - this.comboBoxFrameRateFrom.Name = "comboBoxFrameRateFrom"; - this.comboBoxFrameRateFrom.Size = new System.Drawing.Size(121, 21); - this.comboBoxFrameRateFrom.TabIndex = 4; - // - // labelFromFrameRate - // - this.labelFromFrameRate.Location = new System.Drawing.Point(3, 45); - this.labelFromFrameRate.Name = "labelFromFrameRate"; - this.labelFromFrameRate.Size = new System.Drawing.Size(145, 21); - this.labelFromFrameRate.TabIndex = 6; - this.labelFromFrameRate.Text = "From frame rate"; - this.labelFromFrameRate.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // comboBoxFrameRateTo - // - this.comboBoxFrameRateTo.FormattingEnabled = true; - this.comboBoxFrameRateTo.Location = new System.Drawing.Point(148, 74); - this.comboBoxFrameRateTo.Name = "comboBoxFrameRateTo"; - this.comboBoxFrameRateTo.Size = new System.Drawing.Size(121, 21); - this.comboBoxFrameRateTo.TabIndex = 6; - // - // labelToFrameRate - // - this.labelToFrameRate.Location = new System.Drawing.Point(6, 74); - this.labelToFrameRate.Name = "labelToFrameRate"; - this.labelToFrameRate.Size = new System.Drawing.Size(142, 17); - this.labelToFrameRate.TabIndex = 8; - this.labelToFrameRate.Text = "To frame rate"; - this.labelToFrameRate.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // buttonGetFrameRateFrom - // - this.buttonGetFrameRateFrom.Location = new System.Drawing.Point(275, 45); - this.buttonGetFrameRateFrom.Name = "buttonGetFrameRateFrom"; - this.buttonGetFrameRateFrom.Size = new System.Drawing.Size(28, 23); - this.buttonGetFrameRateFrom.TabIndex = 5; - this.buttonGetFrameRateFrom.Text = "..."; - this.buttonGetFrameRateFrom.UseVisualStyleBackColor = true; - this.buttonGetFrameRateFrom.Click += new System.EventHandler(this.ButtonGetFrameRateFromClick); - // - // buttonGetFrameRateTo - // - this.buttonGetFrameRateTo.Location = new System.Drawing.Point(275, 73); - this.buttonGetFrameRateTo.Name = "buttonGetFrameRateTo"; - this.buttonGetFrameRateTo.Size = new System.Drawing.Size(28, 23); - this.buttonGetFrameRateTo.TabIndex = 7; - this.buttonGetFrameRateTo.Text = "..."; - this.buttonGetFrameRateTo.UseVisualStyleBackColor = true; - this.buttonGetFrameRateTo.Click += new System.EventHandler(this.ButtonGetFrameRateToClick); - // - // openFileDialog1 - // - this.openFileDialog1.FileName = "openFileDialog1"; - // - // buttonSwap - // - this.buttonSwap.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.buttonSwap.Location = new System.Drawing.Point(312, 57); - this.buttonSwap.Name = "buttonSwap"; - this.buttonSwap.Size = new System.Drawing.Size(25, 28); - this.buttonSwap.TabIndex = 8; - this.buttonSwap.Text = "<->"; - this.buttonSwap.UseVisualStyleBackColor = true; - this.buttonSwap.Click += new System.EventHandler(this.buttonSwap_Click); - // - // ChangeFrameRate - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(364, 148); - this.Controls.Add(this.buttonSwap); - this.Controls.Add(this.buttonGetFrameRateTo); - this.Controls.Add(this.buttonGetFrameRateFrom); - this.Controls.Add(this.comboBoxFrameRateTo); - this.Controls.Add(this.labelToFrameRate); - this.Controls.Add(this.comboBoxFrameRateFrom); - this.Controls.Add(this.labelFromFrameRate); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.labelInfo); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "ChangeFrameRate"; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Change frame rate"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormChangeFrameRate_KeyDown); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Label labelInfo; - private System.Windows.Forms.ComboBox comboBoxFrameRateFrom; - private System.Windows.Forms.Label labelFromFrameRate; - private System.Windows.Forms.ComboBox comboBoxFrameRateTo; - private System.Windows.Forms.Label labelToFrameRate; - private System.Windows.Forms.Button buttonGetFrameRateFrom; - private System.Windows.Forms.Button buttonGetFrameRateTo; - private System.Windows.Forms.OpenFileDialog openFileDialog1; - private System.Windows.Forms.Button buttonSwap; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class ChangeFrameRate + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.labelInfo = new System.Windows.Forms.Label(); + this.comboBoxFrameRateFrom = new System.Windows.Forms.ComboBox(); + this.labelFromFrameRate = new System.Windows.Forms.Label(); + this.comboBoxFrameRateTo = new System.Windows.Forms.ComboBox(); + this.labelToFrameRate = new System.Windows.Forms.Label(); + this.buttonGetFrameRateFrom = new System.Windows.Forms.Button(); + this.buttonGetFrameRateTo = new System.Windows.Forms.Button(); + this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); + this.buttonSwap = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // buttonCancel + // + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(277, 113); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 3; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + // + // buttonOK + // + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(194, 113); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 2; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); + // + // labelInfo + // + this.labelInfo.AllowDrop = true; + this.labelInfo.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.labelInfo.Location = new System.Drawing.Point(12, 9); + this.labelInfo.Name = "labelInfo"; + this.labelInfo.Size = new System.Drawing.Size(284, 26); + this.labelInfo.TabIndex = 3; + this.labelInfo.Text = "Convert frame rate of subtitle"; + // + // comboBoxFrameRateFrom + // + this.comboBoxFrameRateFrom.FormattingEnabled = true; + this.comboBoxFrameRateFrom.Location = new System.Drawing.Point(148, 45); + this.comboBoxFrameRateFrom.Name = "comboBoxFrameRateFrom"; + this.comboBoxFrameRateFrom.Size = new System.Drawing.Size(121, 21); + this.comboBoxFrameRateFrom.TabIndex = 4; + // + // labelFromFrameRate + // + this.labelFromFrameRate.Location = new System.Drawing.Point(3, 45); + this.labelFromFrameRate.Name = "labelFromFrameRate"; + this.labelFromFrameRate.Size = new System.Drawing.Size(145, 21); + this.labelFromFrameRate.TabIndex = 6; + this.labelFromFrameRate.Text = "From frame rate"; + this.labelFromFrameRate.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // comboBoxFrameRateTo + // + this.comboBoxFrameRateTo.FormattingEnabled = true; + this.comboBoxFrameRateTo.Location = new System.Drawing.Point(148, 74); + this.comboBoxFrameRateTo.Name = "comboBoxFrameRateTo"; + this.comboBoxFrameRateTo.Size = new System.Drawing.Size(121, 21); + this.comboBoxFrameRateTo.TabIndex = 6; + // + // labelToFrameRate + // + this.labelToFrameRate.Location = new System.Drawing.Point(6, 74); + this.labelToFrameRate.Name = "labelToFrameRate"; + this.labelToFrameRate.Size = new System.Drawing.Size(142, 17); + this.labelToFrameRate.TabIndex = 8; + this.labelToFrameRate.Text = "To frame rate"; + this.labelToFrameRate.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // buttonGetFrameRateFrom + // + this.buttonGetFrameRateFrom.Location = new System.Drawing.Point(275, 45); + this.buttonGetFrameRateFrom.Name = "buttonGetFrameRateFrom"; + this.buttonGetFrameRateFrom.Size = new System.Drawing.Size(28, 23); + this.buttonGetFrameRateFrom.TabIndex = 5; + this.buttonGetFrameRateFrom.Text = "..."; + this.buttonGetFrameRateFrom.UseVisualStyleBackColor = true; + this.buttonGetFrameRateFrom.Click += new System.EventHandler(this.ButtonGetFrameRateFromClick); + // + // buttonGetFrameRateTo + // + this.buttonGetFrameRateTo.Location = new System.Drawing.Point(275, 73); + this.buttonGetFrameRateTo.Name = "buttonGetFrameRateTo"; + this.buttonGetFrameRateTo.Size = new System.Drawing.Size(28, 23); + this.buttonGetFrameRateTo.TabIndex = 7; + this.buttonGetFrameRateTo.Text = "..."; + this.buttonGetFrameRateTo.UseVisualStyleBackColor = true; + this.buttonGetFrameRateTo.Click += new System.EventHandler(this.ButtonGetFrameRateToClick); + // + // openFileDialog1 + // + this.openFileDialog1.FileName = "openFileDialog1"; + // + // buttonSwap + // + this.buttonSwap.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.buttonSwap.Location = new System.Drawing.Point(312, 57); + this.buttonSwap.Name = "buttonSwap"; + this.buttonSwap.Size = new System.Drawing.Size(25, 28); + this.buttonSwap.TabIndex = 8; + this.buttonSwap.Text = "<->"; + this.buttonSwap.UseVisualStyleBackColor = true; + this.buttonSwap.Click += new System.EventHandler(this.buttonSwap_Click); + // + // ChangeFrameRate + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(364, 148); + this.Controls.Add(this.buttonSwap); + this.Controls.Add(this.buttonGetFrameRateTo); + this.Controls.Add(this.buttonGetFrameRateFrom); + this.Controls.Add(this.comboBoxFrameRateTo); + this.Controls.Add(this.labelToFrameRate); + this.Controls.Add(this.comboBoxFrameRateFrom); + this.Controls.Add(this.labelFromFrameRate); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.labelInfo); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "ChangeFrameRate"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Change frame rate"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormChangeFrameRate_KeyDown); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Label labelInfo; + private System.Windows.Forms.ComboBox comboBoxFrameRateFrom; + private System.Windows.Forms.Label labelFromFrameRate; + private System.Windows.Forms.ComboBox comboBoxFrameRateTo; + private System.Windows.Forms.Label labelToFrameRate; + private System.Windows.Forms.Button buttonGetFrameRateFrom; + private System.Windows.Forms.Button buttonGetFrameRateTo; + private System.Windows.Forms.OpenFileDialog openFileDialog1; + private System.Windows.Forms.Button buttonSwap; + } } \ No newline at end of file diff --git a/src/Forms/ChangeFrameRate.cs b/src/ui/Forms/ChangeFrameRate.cs similarity index 97% rename from src/Forms/ChangeFrameRate.cs rename to src/ui/Forms/ChangeFrameRate.cs index 6b5c60764..7bb58b2a1 100644 --- a/src/Forms/ChangeFrameRate.cs +++ b/src/ui/Forms/ChangeFrameRate.cs @@ -1,124 +1,124 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Drawing; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class ChangeFrameRate : PositionAndSizeForm - { - public ChangeFrameRate() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - InitializeCombobox(comboBoxFrameRateFrom); - InitializeCombobox(comboBoxFrameRateTo); - - var language = Configuration.Settings.Language.ChangeFrameRate; - Text = language.Title; - labelInfo.Text = language.ConvertFrameRateOfSubtitle; - labelFromFrameRate.Text = language.FromFrameRate; - labelToFrameRate.Text = language.ToFrameRate; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - UiUtil.FixLargeFonts(this, buttonOK); - if (Configuration.IsRunningOnWindows) - { - buttonSwap.Text = "🡙"; - } - else - { - buttonSwap.Text = "<->"; - buttonSwap.Width = 35; - buttonSwap.Font = new Font(Font.FontFamily, Font.Size); - } - } - - private void InitializeCombobox(ComboBox comboBox) - { - comboBox.BeginUpdate(); - comboBox.Items.Clear(); - comboBox.Items.Add(23.976); - comboBox.Items.Add(24.0); - comboBox.Items.Add(25.0); - comboBox.Items.Add(29.97); - comboBox.Items.Add(30); - comboBox.EndUpdate(); - } - - private void FormChangeFrameRate_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - public void Initialize(string fromFrameRate) - { - comboBoxFrameRateFrom.Text = fromFrameRate; - } - - private string GetFrameRateFromVideoFile(string oldFrameRate) - { - openFileDialog1.Title = Configuration.Settings.Language.General.OpenVideoFileTitle; - openFileDialog1.FileName = string.Empty; - openFileDialog1.Filter = Utilities.GetVideoFileFilter(false); - openFileDialog1.FileName = string.Empty; - if (openFileDialog1.ShowDialog() == DialogResult.OK) - { - var info = UiUtil.GetVideoInfo(openFileDialog1.FileName); - if (info?.Success == true) - { - return Math.Round(info.FramesPerSecond, 3).ToString(); - } - } - return oldFrameRate; - } - - private void ButtonGetFrameRateFromClick(object sender, EventArgs e) - { - comboBoxFrameRateFrom.Text = GetFrameRateFromVideoFile(comboBoxFrameRateFrom.Text); - } - - private void ButtonGetFrameRateToClick(object sender, EventArgs e) - { - comboBoxFrameRateTo.Text = GetFrameRateFromVideoFile(comboBoxFrameRateTo.Text); - } - - private void ButtonOkClick(object sender, EventArgs e) - { - if (comboBoxFrameRateFrom.Text.Trim() == comboBoxFrameRateTo.Text.Trim()) - { - MessageBox.Show(Configuration.Settings.Language.ChangeFrameRate.FrameRateNotChanged); - return; - } - - if (double.TryParse(comboBoxFrameRateFrom.Text, out _) && double.TryParse(comboBoxFrameRateTo.Text, out _)) - { - DialogResult = DialogResult.OK; - } - else - { - MessageBox.Show(Configuration.Settings.Language.ChangeFrameRate.FrameRateNotCorrect); - } - } - - private void buttonSwap_Click(object sender, EventArgs e) - { - string oldFrameRate = comboBoxFrameRateFrom.Text; - string newFrameRate = comboBoxFrameRateTo.Text; - - comboBoxFrameRateFrom.Text = newFrameRate; - comboBoxFrameRateTo.Text = oldFrameRate; - } - - public double OldFrameRate => double.Parse(comboBoxFrameRateFrom.Text); - - public double NewFrameRate => double.Parse(comboBoxFrameRateTo.Text); - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Drawing; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class ChangeFrameRate : PositionAndSizeForm + { + public ChangeFrameRate() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + InitializeCombobox(comboBoxFrameRateFrom); + InitializeCombobox(comboBoxFrameRateTo); + + var language = Configuration.Settings.Language.ChangeFrameRate; + Text = language.Title; + labelInfo.Text = language.ConvertFrameRateOfSubtitle; + labelFromFrameRate.Text = language.FromFrameRate; + labelToFrameRate.Text = language.ToFrameRate; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + UiUtil.FixLargeFonts(this, buttonOK); + if (Configuration.IsRunningOnWindows) + { + buttonSwap.Text = "🡙"; + } + else + { + buttonSwap.Text = "<->"; + buttonSwap.Width = 35; + buttonSwap.Font = new Font(Font.FontFamily, Font.Size); + } + } + + private void InitializeCombobox(ComboBox comboBox) + { + comboBox.BeginUpdate(); + comboBox.Items.Clear(); + comboBox.Items.Add(23.976); + comboBox.Items.Add(24.0); + comboBox.Items.Add(25.0); + comboBox.Items.Add(29.97); + comboBox.Items.Add(30); + comboBox.EndUpdate(); + } + + private void FormChangeFrameRate_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + public void Initialize(string fromFrameRate) + { + comboBoxFrameRateFrom.Text = fromFrameRate; + } + + private string GetFrameRateFromVideoFile(string oldFrameRate) + { + openFileDialog1.Title = Configuration.Settings.Language.General.OpenVideoFileTitle; + openFileDialog1.FileName = string.Empty; + openFileDialog1.Filter = Utilities.GetVideoFileFilter(false); + openFileDialog1.FileName = string.Empty; + if (openFileDialog1.ShowDialog() == DialogResult.OK) + { + var info = UiUtil.GetVideoInfo(openFileDialog1.FileName); + if (info?.Success == true) + { + return Math.Round(info.FramesPerSecond, 3).ToString(); + } + } + return oldFrameRate; + } + + private void ButtonGetFrameRateFromClick(object sender, EventArgs e) + { + comboBoxFrameRateFrom.Text = GetFrameRateFromVideoFile(comboBoxFrameRateFrom.Text); + } + + private void ButtonGetFrameRateToClick(object sender, EventArgs e) + { + comboBoxFrameRateTo.Text = GetFrameRateFromVideoFile(comboBoxFrameRateTo.Text); + } + + private void ButtonOkClick(object sender, EventArgs e) + { + if (comboBoxFrameRateFrom.Text.Trim() == comboBoxFrameRateTo.Text.Trim()) + { + MessageBox.Show(Configuration.Settings.Language.ChangeFrameRate.FrameRateNotChanged); + return; + } + + if (double.TryParse(comboBoxFrameRateFrom.Text, out _) && double.TryParse(comboBoxFrameRateTo.Text, out _)) + { + DialogResult = DialogResult.OK; + } + else + { + MessageBox.Show(Configuration.Settings.Language.ChangeFrameRate.FrameRateNotCorrect); + } + } + + private void buttonSwap_Click(object sender, EventArgs e) + { + string oldFrameRate = comboBoxFrameRateFrom.Text; + string newFrameRate = comboBoxFrameRateTo.Text; + + comboBoxFrameRateFrom.Text = newFrameRate; + comboBoxFrameRateTo.Text = oldFrameRate; + } + + public double OldFrameRate => double.Parse(comboBoxFrameRateFrom.Text); + + public double NewFrameRate => double.Parse(comboBoxFrameRateTo.Text); + } +} diff --git a/src/Forms/ChangeFrameRate.resx b/src/ui/Forms/ChangeFrameRate.resx similarity index 97% rename from src/Forms/ChangeFrameRate.resx rename to src/ui/Forms/ChangeFrameRate.resx index beddb180c..8b8d2ee1e 100644 --- a/src/Forms/ChangeFrameRate.resx +++ b/src/ui/Forms/ChangeFrameRate.resx @@ -1,123 +1,123 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + \ No newline at end of file diff --git a/src/Forms/ChangeSpeedInPercent.Designer.cs b/src/ui/Forms/ChangeSpeedInPercent.Designer.cs similarity index 98% rename from src/Forms/ChangeSpeedInPercent.Designer.cs rename to src/ui/Forms/ChangeSpeedInPercent.Designer.cs index 4c657228d..a8ad4fbf6 100644 --- a/src/Forms/ChangeSpeedInPercent.Designer.cs +++ b/src/ui/Forms/ChangeSpeedInPercent.Designer.cs @@ -1,215 +1,215 @@ -namespace Nikse.SubtitleEdit.Forms -{ - partial class ChangeSpeedInPercent - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.numericUpDownPercent = new System.Windows.Forms.NumericUpDown(); - this.labelPercent = new System.Windows.Forms.Label(); - this.radioButtonSelectedLinesOnly = new System.Windows.Forms.RadioButton(); - this.radioButtonAllLines = new System.Windows.Forms.RadioButton(); - this.groupBoxInfo = new System.Windows.Forms.GroupBox(); - this.radioButtonToDropFrame = new System.Windows.Forms.RadioButton(); - this.radioButtonSpeedFromDropFrame = new System.Windows.Forms.RadioButton(); - this.radioButtonSpeedCustom = new System.Windows.Forms.RadioButton(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPercent)).BeginInit(); - this.groupBoxInfo.SuspendLayout(); - this.SuspendLayout(); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(295, 158); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 4; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(214, 158); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 3; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // numericUpDownPercent - // - this.numericUpDownPercent.DecimalPlaces = 5; - this.numericUpDownPercent.Location = new System.Drawing.Point(12, 40); - this.numericUpDownPercent.Maximum = new decimal(new int[] { - 200, - 0, - 0, - 0}); - this.numericUpDownPercent.Minimum = new decimal(new int[] { - 50, - 0, - 0, - 0}); - this.numericUpDownPercent.Name = "numericUpDownPercent"; - this.numericUpDownPercent.Size = new System.Drawing.Size(81, 20); - this.numericUpDownPercent.TabIndex = 0; - this.numericUpDownPercent.Value = new decimal(new int[] { - 100, - 0, - 0, - 0}); - // - // labelPercent - // - this.labelPercent.AutoSize = true; - this.labelPercent.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.labelPercent.Location = new System.Drawing.Point(93, 43); - this.labelPercent.Name = "labelPercent"; - this.labelPercent.Size = new System.Drawing.Size(15, 13); - this.labelPercent.TabIndex = 10; - this.labelPercent.Text = "%"; - // - // radioButtonSelectedLinesOnly - // - this.radioButtonSelectedLinesOnly.AutoSize = true; - this.radioButtonSelectedLinesOnly.Location = new System.Drawing.Point(24, 133); - this.radioButtonSelectedLinesOnly.Name = "radioButtonSelectedLinesOnly"; - this.radioButtonSelectedLinesOnly.Size = new System.Drawing.Size(113, 17); - this.radioButtonSelectedLinesOnly.TabIndex = 2; - this.radioButtonSelectedLinesOnly.TabStop = true; - this.radioButtonSelectedLinesOnly.Text = "Selected lines only"; - this.radioButtonSelectedLinesOnly.UseVisualStyleBackColor = true; - // - // radioButtonAllLines - // - this.radioButtonAllLines.AutoSize = true; - this.radioButtonAllLines.Location = new System.Drawing.Point(24, 110); - this.radioButtonAllLines.Name = "radioButtonAllLines"; - this.radioButtonAllLines.Size = new System.Drawing.Size(60, 17); - this.radioButtonAllLines.TabIndex = 1; - this.radioButtonAllLines.TabStop = true; - this.radioButtonAllLines.Text = "All lines"; - this.radioButtonAllLines.UseVisualStyleBackColor = true; - // - // groupBoxInfo - // - this.groupBoxInfo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxInfo.Controls.Add(this.numericUpDownPercent); - this.groupBoxInfo.Controls.Add(this.labelPercent); - this.groupBoxInfo.Controls.Add(this.radioButtonToDropFrame); - this.groupBoxInfo.Controls.Add(this.radioButtonSpeedFromDropFrame); - this.groupBoxInfo.Controls.Add(this.radioButtonSpeedCustom); - this.groupBoxInfo.Location = new System.Drawing.Point(12, 12); - this.groupBoxInfo.Name = "groupBoxInfo"; - this.groupBoxInfo.Size = new System.Drawing.Size(358, 92); - this.groupBoxInfo.TabIndex = 0; - this.groupBoxInfo.TabStop = false; - // - // radioButtonToDropFrame - // - this.radioButtonToDropFrame.AutoSize = true; - this.radioButtonToDropFrame.Location = new System.Drawing.Point(141, 63); - this.radioButtonToDropFrame.Name = "radioButtonToDropFrame"; - this.radioButtonToDropFrame.Size = new System.Drawing.Size(91, 17); - this.radioButtonToDropFrame.TabIndex = 3; - this.radioButtonToDropFrame.Text = "To drop frame"; - this.radioButtonToDropFrame.UseVisualStyleBackColor = true; - this.radioButtonToDropFrame.CheckedChanged += new System.EventHandler(this.radioButtonToDropFrame_CheckedChanged); - // - // radioButtonSpeedFromDropFrame - // - this.radioButtonSpeedFromDropFrame.AutoSize = true; - this.radioButtonSpeedFromDropFrame.Location = new System.Drawing.Point(141, 40); - this.radioButtonSpeedFromDropFrame.Name = "radioButtonSpeedFromDropFrame"; - this.radioButtonSpeedFromDropFrame.Size = new System.Drawing.Size(101, 17); - this.radioButtonSpeedFromDropFrame.TabIndex = 2; - this.radioButtonSpeedFromDropFrame.Text = "From drop frame"; - this.radioButtonSpeedFromDropFrame.UseVisualStyleBackColor = true; - this.radioButtonSpeedFromDropFrame.CheckedChanged += new System.EventHandler(this.radioButtonSpeedFromDropFrame_CheckedChanged); - // - // radioButtonSpeedCustom - // - this.radioButtonSpeedCustom.AutoSize = true; - this.radioButtonSpeedCustom.Checked = true; - this.radioButtonSpeedCustom.Location = new System.Drawing.Point(141, 17); - this.radioButtonSpeedCustom.Name = "radioButtonSpeedCustom"; - this.radioButtonSpeedCustom.Size = new System.Drawing.Size(60, 17); - this.radioButtonSpeedCustom.TabIndex = 1; - this.radioButtonSpeedCustom.TabStop = true; - this.radioButtonSpeedCustom.Text = "Custom"; - this.radioButtonSpeedCustom.UseVisualStyleBackColor = true; - this.radioButtonSpeedCustom.CheckedChanged += new System.EventHandler(this.radioButtonSpeedCustom_CheckedChanged); - // - // ChangeSpeedInPercent - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(382, 191); - this.Controls.Add(this.groupBoxInfo); - this.Controls.Add(this.radioButtonSelectedLinesOnly); - this.Controls.Add(this.radioButtonAllLines); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "ChangeSpeedInPercent"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "ChangeSpeedInPercent"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ChangeSpeedInPercent_KeyDown); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPercent)).EndInit(); - this.groupBoxInfo.ResumeLayout(false); - this.groupBoxInfo.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.NumericUpDown numericUpDownPercent; - private System.Windows.Forms.Label labelPercent; - private System.Windows.Forms.RadioButton radioButtonSelectedLinesOnly; - private System.Windows.Forms.RadioButton radioButtonAllLines; - private System.Windows.Forms.GroupBox groupBoxInfo; - private System.Windows.Forms.RadioButton radioButtonToDropFrame; - private System.Windows.Forms.RadioButton radioButtonSpeedFromDropFrame; - private System.Windows.Forms.RadioButton radioButtonSpeedCustom; - } +namespace Nikse.SubtitleEdit.Forms +{ + partial class ChangeSpeedInPercent + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.numericUpDownPercent = new System.Windows.Forms.NumericUpDown(); + this.labelPercent = new System.Windows.Forms.Label(); + this.radioButtonSelectedLinesOnly = new System.Windows.Forms.RadioButton(); + this.radioButtonAllLines = new System.Windows.Forms.RadioButton(); + this.groupBoxInfo = new System.Windows.Forms.GroupBox(); + this.radioButtonToDropFrame = new System.Windows.Forms.RadioButton(); + this.radioButtonSpeedFromDropFrame = new System.Windows.Forms.RadioButton(); + this.radioButtonSpeedCustom = new System.Windows.Forms.RadioButton(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPercent)).BeginInit(); + this.groupBoxInfo.SuspendLayout(); + this.SuspendLayout(); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(295, 158); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 4; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(214, 158); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 3; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // numericUpDownPercent + // + this.numericUpDownPercent.DecimalPlaces = 5; + this.numericUpDownPercent.Location = new System.Drawing.Point(12, 40); + this.numericUpDownPercent.Maximum = new decimal(new int[] { + 200, + 0, + 0, + 0}); + this.numericUpDownPercent.Minimum = new decimal(new int[] { + 50, + 0, + 0, + 0}); + this.numericUpDownPercent.Name = "numericUpDownPercent"; + this.numericUpDownPercent.Size = new System.Drawing.Size(81, 20); + this.numericUpDownPercent.TabIndex = 0; + this.numericUpDownPercent.Value = new decimal(new int[] { + 100, + 0, + 0, + 0}); + // + // labelPercent + // + this.labelPercent.AutoSize = true; + this.labelPercent.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.labelPercent.Location = new System.Drawing.Point(93, 43); + this.labelPercent.Name = "labelPercent"; + this.labelPercent.Size = new System.Drawing.Size(15, 13); + this.labelPercent.TabIndex = 10; + this.labelPercent.Text = "%"; + // + // radioButtonSelectedLinesOnly + // + this.radioButtonSelectedLinesOnly.AutoSize = true; + this.radioButtonSelectedLinesOnly.Location = new System.Drawing.Point(24, 133); + this.radioButtonSelectedLinesOnly.Name = "radioButtonSelectedLinesOnly"; + this.radioButtonSelectedLinesOnly.Size = new System.Drawing.Size(113, 17); + this.radioButtonSelectedLinesOnly.TabIndex = 2; + this.radioButtonSelectedLinesOnly.TabStop = true; + this.radioButtonSelectedLinesOnly.Text = "Selected lines only"; + this.radioButtonSelectedLinesOnly.UseVisualStyleBackColor = true; + // + // radioButtonAllLines + // + this.radioButtonAllLines.AutoSize = true; + this.radioButtonAllLines.Location = new System.Drawing.Point(24, 110); + this.radioButtonAllLines.Name = "radioButtonAllLines"; + this.radioButtonAllLines.Size = new System.Drawing.Size(60, 17); + this.radioButtonAllLines.TabIndex = 1; + this.radioButtonAllLines.TabStop = true; + this.radioButtonAllLines.Text = "All lines"; + this.radioButtonAllLines.UseVisualStyleBackColor = true; + // + // groupBoxInfo + // + this.groupBoxInfo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxInfo.Controls.Add(this.numericUpDownPercent); + this.groupBoxInfo.Controls.Add(this.labelPercent); + this.groupBoxInfo.Controls.Add(this.radioButtonToDropFrame); + this.groupBoxInfo.Controls.Add(this.radioButtonSpeedFromDropFrame); + this.groupBoxInfo.Controls.Add(this.radioButtonSpeedCustom); + this.groupBoxInfo.Location = new System.Drawing.Point(12, 12); + this.groupBoxInfo.Name = "groupBoxInfo"; + this.groupBoxInfo.Size = new System.Drawing.Size(358, 92); + this.groupBoxInfo.TabIndex = 0; + this.groupBoxInfo.TabStop = false; + // + // radioButtonToDropFrame + // + this.radioButtonToDropFrame.AutoSize = true; + this.radioButtonToDropFrame.Location = new System.Drawing.Point(141, 63); + this.radioButtonToDropFrame.Name = "radioButtonToDropFrame"; + this.radioButtonToDropFrame.Size = new System.Drawing.Size(91, 17); + this.radioButtonToDropFrame.TabIndex = 3; + this.radioButtonToDropFrame.Text = "To drop frame"; + this.radioButtonToDropFrame.UseVisualStyleBackColor = true; + this.radioButtonToDropFrame.CheckedChanged += new System.EventHandler(this.radioButtonToDropFrame_CheckedChanged); + // + // radioButtonSpeedFromDropFrame + // + this.radioButtonSpeedFromDropFrame.AutoSize = true; + this.radioButtonSpeedFromDropFrame.Location = new System.Drawing.Point(141, 40); + this.radioButtonSpeedFromDropFrame.Name = "radioButtonSpeedFromDropFrame"; + this.radioButtonSpeedFromDropFrame.Size = new System.Drawing.Size(101, 17); + this.radioButtonSpeedFromDropFrame.TabIndex = 2; + this.radioButtonSpeedFromDropFrame.Text = "From drop frame"; + this.radioButtonSpeedFromDropFrame.UseVisualStyleBackColor = true; + this.radioButtonSpeedFromDropFrame.CheckedChanged += new System.EventHandler(this.radioButtonSpeedFromDropFrame_CheckedChanged); + // + // radioButtonSpeedCustom + // + this.radioButtonSpeedCustom.AutoSize = true; + this.radioButtonSpeedCustom.Checked = true; + this.radioButtonSpeedCustom.Location = new System.Drawing.Point(141, 17); + this.radioButtonSpeedCustom.Name = "radioButtonSpeedCustom"; + this.radioButtonSpeedCustom.Size = new System.Drawing.Size(60, 17); + this.radioButtonSpeedCustom.TabIndex = 1; + this.radioButtonSpeedCustom.TabStop = true; + this.radioButtonSpeedCustom.Text = "Custom"; + this.radioButtonSpeedCustom.UseVisualStyleBackColor = true; + this.radioButtonSpeedCustom.CheckedChanged += new System.EventHandler(this.radioButtonSpeedCustom_CheckedChanged); + // + // ChangeSpeedInPercent + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(382, 191); + this.Controls.Add(this.groupBoxInfo); + this.Controls.Add(this.radioButtonSelectedLinesOnly); + this.Controls.Add(this.radioButtonAllLines); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "ChangeSpeedInPercent"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "ChangeSpeedInPercent"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ChangeSpeedInPercent_KeyDown); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPercent)).EndInit(); + this.groupBoxInfo.ResumeLayout(false); + this.groupBoxInfo.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.NumericUpDown numericUpDownPercent; + private System.Windows.Forms.Label labelPercent; + private System.Windows.Forms.RadioButton radioButtonSelectedLinesOnly; + private System.Windows.Forms.RadioButton radioButtonAllLines; + private System.Windows.Forms.GroupBox groupBoxInfo; + private System.Windows.Forms.RadioButton radioButtonToDropFrame; + private System.Windows.Forms.RadioButton radioButtonSpeedFromDropFrame; + private System.Windows.Forms.RadioButton radioButtonSpeedCustom; + } } \ No newline at end of file diff --git a/src/Forms/ChangeSpeedInPercent.cs b/src/ui/Forms/ChangeSpeedInPercent.cs similarity index 97% rename from src/Forms/ChangeSpeedInPercent.cs rename to src/ui/Forms/ChangeSpeedInPercent.cs index 8f289e313..c5ee3f71d 100644 --- a/src/Forms/ChangeSpeedInPercent.cs +++ b/src/ui/Forms/ChangeSpeedInPercent.cs @@ -1,120 +1,120 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class ChangeSpeedInPercent : PositionAndSizeForm - { - - public double AdjustFactor { get; private set; } - public bool AdjustAllLines { get; private set; } - - public ChangeSpeedInPercent(int numberOfSelectedLines) - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - Text = Configuration.Settings.Language.ChangeSpeedInPercent.Title; - groupBoxInfo.Text = Configuration.Settings.Language.ChangeSpeedInPercent.Info; - radioButtonAllLines.Text = Configuration.Settings.Language.ShowEarlierLater.AllLines; - radioButtonSelectedLinesOnly.Text = Configuration.Settings.Language.ShowEarlierLater.SelectedLinesOnly; - radioButtonSpeedCustom.Text = Configuration.Settings.Language.ChangeSpeedInPercent.Custom; - radioButtonSpeedFromDropFrame.Text = Configuration.Settings.Language.ChangeSpeedInPercent.FromDropFrame; - radioButtonToDropFrame.Text = Configuration.Settings.Language.ChangeSpeedInPercent.ToDropFrame; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - - if (string.IsNullOrEmpty(Configuration.Settings.Language.ChangeSpeedInPercent.ToDropFrame)) - { - radioButtonSpeedCustom.Visible = false; - radioButtonSpeedFromDropFrame.Visible = false; - radioButtonToDropFrame.Visible = false; - } - - UiUtil.FixLargeFonts(this, buttonOK); - - if (numberOfSelectedLines > 1) - { - radioButtonSelectedLinesOnly.Checked = true; - } - else - { - radioButtonAllLines.Checked = true; - } - } - - private void ChangeSpeedInPercent_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - else if (e.KeyCode == UiUtil.HelpKeys) - { - Utilities.ShowHelp("#sync"); - e.SuppressKeyPress = true; - } - } - - public Subtitle AdjustAllParagraphs(Subtitle subtitle) - { - foreach (Paragraph p in subtitle.Paragraphs) - { - AdjustParagraph(p); - } - - for (int i = 0; i < subtitle.Paragraphs.Count; i++) - { - Paragraph p = subtitle.Paragraphs[i]; - Paragraph next = subtitle.GetParagraphOrDefault(i + 1); - if (next != null) - { - if (p.EndTime.TotalMilliseconds >= next.StartTime.TotalMilliseconds) - { - p.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - 1; - } - } - } - return subtitle; - } - - public void AdjustParagraph(Paragraph p) - { - p.StartTime.TotalMilliseconds = p.StartTime.TotalMilliseconds * AdjustFactor; - p.EndTime.TotalMilliseconds = p.EndTime.TotalMilliseconds * AdjustFactor; - } - - private void buttonOK_Click(object sender, EventArgs e) - { - AdjustFactor = Convert.ToDouble(numericUpDownPercent.Value) / 100.0; - AdjustAllLines = radioButtonAllLines.Checked; - DialogResult = DialogResult.OK; - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private void radioButtonSpeedCustom_CheckedChanged(object sender, EventArgs e) - { - numericUpDownPercent.Enabled = true; - } - - private void radioButtonSpeedFromDropFrame_CheckedChanged(object sender, EventArgs e) - { - numericUpDownPercent.Value = Convert.ToDecimal(099.98887); - numericUpDownPercent.Enabled = false; - } - - private void radioButtonToDropFrame_CheckedChanged(object sender, EventArgs e) - { - numericUpDownPercent.Value = Convert.ToDecimal(100.1001001); - numericUpDownPercent.Enabled = false; - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class ChangeSpeedInPercent : PositionAndSizeForm + { + + public double AdjustFactor { get; private set; } + public bool AdjustAllLines { get; private set; } + + public ChangeSpeedInPercent(int numberOfSelectedLines) + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + Text = Configuration.Settings.Language.ChangeSpeedInPercent.Title; + groupBoxInfo.Text = Configuration.Settings.Language.ChangeSpeedInPercent.Info; + radioButtonAllLines.Text = Configuration.Settings.Language.ShowEarlierLater.AllLines; + radioButtonSelectedLinesOnly.Text = Configuration.Settings.Language.ShowEarlierLater.SelectedLinesOnly; + radioButtonSpeedCustom.Text = Configuration.Settings.Language.ChangeSpeedInPercent.Custom; + radioButtonSpeedFromDropFrame.Text = Configuration.Settings.Language.ChangeSpeedInPercent.FromDropFrame; + radioButtonToDropFrame.Text = Configuration.Settings.Language.ChangeSpeedInPercent.ToDropFrame; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + + if (string.IsNullOrEmpty(Configuration.Settings.Language.ChangeSpeedInPercent.ToDropFrame)) + { + radioButtonSpeedCustom.Visible = false; + radioButtonSpeedFromDropFrame.Visible = false; + radioButtonToDropFrame.Visible = false; + } + + UiUtil.FixLargeFonts(this, buttonOK); + + if (numberOfSelectedLines > 1) + { + radioButtonSelectedLinesOnly.Checked = true; + } + else + { + radioButtonAllLines.Checked = true; + } + } + + private void ChangeSpeedInPercent_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + else if (e.KeyCode == UiUtil.HelpKeys) + { + Utilities.ShowHelp("#sync"); + e.SuppressKeyPress = true; + } + } + + public Subtitle AdjustAllParagraphs(Subtitle subtitle) + { + foreach (Paragraph p in subtitle.Paragraphs) + { + AdjustParagraph(p); + } + + for (int i = 0; i < subtitle.Paragraphs.Count; i++) + { + Paragraph p = subtitle.Paragraphs[i]; + Paragraph next = subtitle.GetParagraphOrDefault(i + 1); + if (next != null) + { + if (p.EndTime.TotalMilliseconds >= next.StartTime.TotalMilliseconds) + { + p.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - 1; + } + } + } + return subtitle; + } + + public void AdjustParagraph(Paragraph p) + { + p.StartTime.TotalMilliseconds = p.StartTime.TotalMilliseconds * AdjustFactor; + p.EndTime.TotalMilliseconds = p.EndTime.TotalMilliseconds * AdjustFactor; + } + + private void buttonOK_Click(object sender, EventArgs e) + { + AdjustFactor = Convert.ToDouble(numericUpDownPercent.Value) / 100.0; + AdjustAllLines = radioButtonAllLines.Checked; + DialogResult = DialogResult.OK; + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void radioButtonSpeedCustom_CheckedChanged(object sender, EventArgs e) + { + numericUpDownPercent.Enabled = true; + } + + private void radioButtonSpeedFromDropFrame_CheckedChanged(object sender, EventArgs e) + { + numericUpDownPercent.Value = Convert.ToDecimal(099.98887); + numericUpDownPercent.Enabled = false; + } + + private void radioButtonToDropFrame_CheckedChanged(object sender, EventArgs e) + { + numericUpDownPercent.Value = Convert.ToDecimal(100.1001001); + numericUpDownPercent.Enabled = false; + } + + } +} diff --git a/src/Forms/DvdStudioProProperties.resx b/src/ui/Forms/ChangeSpeedInPercent.resx similarity index 100% rename from src/Forms/DvdStudioProProperties.resx rename to src/ui/Forms/ChangeSpeedInPercent.resx diff --git a/src/Forms/CheckForUpdates.Designer.cs b/src/ui/Forms/CheckForUpdates.Designer.cs similarity index 100% rename from src/Forms/CheckForUpdates.Designer.cs rename to src/ui/Forms/CheckForUpdates.Designer.cs diff --git a/src/Forms/CheckForUpdates.cs b/src/ui/Forms/CheckForUpdates.cs similarity index 100% rename from src/Forms/CheckForUpdates.cs rename to src/ui/Forms/CheckForUpdates.cs diff --git a/src/Forms/CheckForUpdates.resx b/src/ui/Forms/CheckForUpdates.resx similarity index 100% rename from src/Forms/CheckForUpdates.resx rename to src/ui/Forms/CheckForUpdates.resx diff --git a/src/Forms/ChooseAudioTrack.Designer.cs b/src/ui/Forms/ChooseAudioTrack.Designer.cs similarity index 97% rename from src/Forms/ChooseAudioTrack.Designer.cs rename to src/ui/Forms/ChooseAudioTrack.Designer.cs index ededbbe93..03e625fdb 100644 --- a/src/Forms/ChooseAudioTrack.Designer.cs +++ b/src/ui/Forms/ChooseAudioTrack.Designer.cs @@ -1,111 +1,111 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class ChooseAudioTrack - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.labelDescr = new System.Windows.Forms.Label(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.listBoxTracks = new System.Windows.Forms.ListBox(); - this.SuspendLayout(); - // - // labelDescr - // - this.labelDescr.AutoSize = true; - this.labelDescr.Location = new System.Drawing.Point(10, 14); - this.labelDescr.Name = "labelDescr"; - this.labelDescr.Size = new System.Drawing.Size(99, 13); - this.labelDescr.TabIndex = 19; - this.labelDescr.Text = "Choose audio track"; - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(206, 121); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 18; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(125, 121); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 17; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // listBoxTracks - // - this.listBoxTracks.FormattingEnabled = true; - this.listBoxTracks.Location = new System.Drawing.Point(12, 30); - this.listBoxTracks.Name = "listBoxTracks"; - this.listBoxTracks.Size = new System.Drawing.Size(269, 82); - this.listBoxTracks.TabIndex = 20; - // - // ChooseAudioTrack - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(293, 154); - this.Controls.Add(this.listBoxTracks); - this.Controls.Add(this.labelDescr); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "ChooseAudioTrack"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Choose audio track"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ChooseAudioTrack_KeyDown); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Label labelDescr; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.ListBox listBoxTracks; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class ChooseAudioTrack + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.labelDescr = new System.Windows.Forms.Label(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.listBoxTracks = new System.Windows.Forms.ListBox(); + this.SuspendLayout(); + // + // labelDescr + // + this.labelDescr.AutoSize = true; + this.labelDescr.Location = new System.Drawing.Point(10, 14); + this.labelDescr.Name = "labelDescr"; + this.labelDescr.Size = new System.Drawing.Size(99, 13); + this.labelDescr.TabIndex = 19; + this.labelDescr.Text = "Choose audio track"; + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(206, 121); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 18; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(125, 121); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 17; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // listBoxTracks + // + this.listBoxTracks.FormattingEnabled = true; + this.listBoxTracks.Location = new System.Drawing.Point(12, 30); + this.listBoxTracks.Name = "listBoxTracks"; + this.listBoxTracks.Size = new System.Drawing.Size(269, 82); + this.listBoxTracks.TabIndex = 20; + // + // ChooseAudioTrack + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(293, 154); + this.Controls.Add(this.listBoxTracks); + this.Controls.Add(this.labelDescr); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "ChooseAudioTrack"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Choose audio track"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ChooseAudioTrack_KeyDown); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label labelDescr; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.ListBox listBoxTracks; + } } \ No newline at end of file diff --git a/src/Forms/ChooseAudioTrack.cs b/src/ui/Forms/ChooseAudioTrack.cs similarity index 96% rename from src/Forms/ChooseAudioTrack.cs rename to src/ui/Forms/ChooseAudioTrack.cs index 1d3e85b80..5fa61c4b5 100644 --- a/src/Forms/ChooseAudioTrack.cs +++ b/src/ui/Forms/ChooseAudioTrack.cs @@ -1,54 +1,54 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class ChooseAudioTrack : Form - { - public int SelectedTrack { get; set; } - - public ChooseAudioTrack(List tracks, int selectedTrack) - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - foreach (string track in tracks) - { - listBoxTracks.Items.Add(track); - } - listBoxTracks.SelectedIndex = selectedTrack; - - if (listBoxTracks.SelectedIndex == -1 && listBoxTracks.Items.Count > 0) - { - listBoxTracks.SelectedIndex = 0; - } - - Text = Configuration.Settings.Language.ChooseAudioTrack.Title; - labelDescr.Text = Configuration.Settings.Language.ChooseAudioTrack.Title; - UiUtil.FixLargeFonts(this, buttonOK); - } - - private void ChooseAudioTrack_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - private void buttonOK_Click(object sender, EventArgs e) - { - SelectedTrack = listBoxTracks.SelectedIndex; - DialogResult = DialogResult.OK; - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class ChooseAudioTrack : Form + { + public int SelectedTrack { get; set; } + + public ChooseAudioTrack(List tracks, int selectedTrack) + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + foreach (string track in tracks) + { + listBoxTracks.Items.Add(track); + } + listBoxTracks.SelectedIndex = selectedTrack; + + if (listBoxTracks.SelectedIndex == -1 && listBoxTracks.Items.Count > 0) + { + listBoxTracks.SelectedIndex = 0; + } + + Text = Configuration.Settings.Language.ChooseAudioTrack.Title; + labelDescr.Text = Configuration.Settings.Language.ChooseAudioTrack.Title; + UiUtil.FixLargeFonts(this, buttonOK); + } + + private void ChooseAudioTrack_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + private void buttonOK_Click(object sender, EventArgs e) + { + SelectedTrack = listBoxTracks.SelectedIndex; + DialogResult = DialogResult.OK; + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + } +} diff --git a/src/Forms/EbuColorPicker.resx b/src/ui/Forms/ChooseAudioTrack.resx similarity index 100% rename from src/Forms/EbuColorPicker.resx rename to src/ui/Forms/ChooseAudioTrack.resx diff --git a/src/Forms/ChooseEncoding.Designer.cs b/src/ui/Forms/ChooseEncoding.Designer.cs similarity index 98% rename from src/Forms/ChooseEncoding.Designer.cs rename to src/ui/Forms/ChooseEncoding.Designer.cs index 85896cbb4..c19aa0e5b 100644 --- a/src/Forms/ChooseEncoding.Designer.cs +++ b/src/ui/Forms/ChooseEncoding.Designer.cs @@ -1,194 +1,194 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class ChooseEncoding - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.listView1 = new System.Windows.Forms.ListView(); - this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.textBoxPreview = new System.Windows.Forms.TextBox(); - this.LabelPreview = new System.Windows.Forms.Label(); - this.buttonSearchClear = new System.Windows.Forms.Button(); - this.labelShortcutsSearch = new System.Windows.Forms.Label(); - this.textBoxSearch = new System.Windows.Forms.TextBox(); - this.SuspendLayout(); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.Location = new System.Drawing.Point(542, 473); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 7; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.Location = new System.Drawing.Point(461, 473); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 6; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); - // - // listView1 - // - this.listView1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeader1, - this.columnHeader2, - this.columnHeader3}); - this.listView1.FullRowSelect = true; - this.listView1.GridLines = true; - this.listView1.HideSelection = false; - this.listView1.Location = new System.Drawing.Point(12, 41); - this.listView1.MultiSelect = false; - this.listView1.Name = "listView1"; - this.listView1.Size = new System.Drawing.Size(605, 225); - this.listView1.TabIndex = 8; - this.listView1.UseCompatibleStateImageBehavior = false; - this.listView1.View = System.Windows.Forms.View.Details; - this.listView1.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.listView1_ColumnClick); - this.listView1.SelectedIndexChanged += new System.EventHandler(this.listView1_SelectedIndexChanged); - // - // columnHeader1 - // - this.columnHeader1.Text = "Codepage"; - this.columnHeader1.Width = 75; - // - // columnHeader2 - // - this.columnHeader2.Text = "Name"; - this.columnHeader2.Width = 124; - // - // columnHeader3 - // - this.columnHeader3.Text = "DisplayName"; - this.columnHeader3.Width = 384; - // - // textBoxPreview - // - this.textBoxPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.textBoxPreview.Location = new System.Drawing.Point(13, 301); - this.textBoxPreview.Multiline = true; - this.textBoxPreview.Name = "textBoxPreview"; - this.textBoxPreview.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.textBoxPreview.Size = new System.Drawing.Size(604, 156); - this.textBoxPreview.TabIndex = 9; - // - // LabelPreview - // - this.LabelPreview.AutoSize = true; - this.LabelPreview.Location = new System.Drawing.Point(12, 284); - this.LabelPreview.Name = "LabelPreview"; - this.LabelPreview.Size = new System.Drawing.Size(45, 13); - this.LabelPreview.TabIndex = 10; - this.LabelPreview.Text = "Preview"; - // - // buttonSearchClear - // - this.buttonSearchClear.Enabled = false; - this.buttonSearchClear.Location = new System.Drawing.Point(217, 12); - this.buttonSearchClear.Name = "buttonSearchClear"; - this.buttonSearchClear.Size = new System.Drawing.Size(111, 23); - this.buttonSearchClear.TabIndex = 3; - this.buttonSearchClear.Text = "Clear"; - this.buttonSearchClear.UseVisualStyleBackColor = true; - this.buttonSearchClear.Click += new System.EventHandler(this.buttonSearchClear_Click); - // - // labelShortcutsSearch - // - this.labelShortcutsSearch.AutoSize = true; - this.labelShortcutsSearch.Location = new System.Drawing.Point(14, 17); - this.labelShortcutsSearch.Name = "labelShortcutsSearch"; - this.labelShortcutsSearch.Size = new System.Drawing.Size(40, 13); - this.labelShortcutsSearch.TabIndex = 40; - this.labelShortcutsSearch.Text = "Search"; - // - // textBoxSearch - // - this.textBoxSearch.Location = new System.Drawing.Point(60, 14); - this.textBoxSearch.Name = "textBoxSearch"; - this.textBoxSearch.Size = new System.Drawing.Size(151, 21); - this.textBoxSearch.TabIndex = 2; - this.textBoxSearch.TextChanged += new System.EventHandler(this.textBoxSearch_TextChanged); - // - // ChooseEncoding - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(629, 503); - this.Controls.Add(this.buttonSearchClear); - this.Controls.Add(this.labelShortcutsSearch); - this.Controls.Add(this.textBoxSearch); - this.Controls.Add(this.LabelPreview); - this.Controls.Add(this.textBoxPreview); - this.Controls.Add(this.listView1); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.KeyPreview = true; - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(645, 542); - this.Name = "ChooseEncoding"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Choose encoding"; - this.Load += new System.EventHandler(this.ChooseEncoding_Load); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormChooseEncoding_KeyDown); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.ListView listView1; - private System.Windows.Forms.ColumnHeader columnHeader1; - private System.Windows.Forms.ColumnHeader columnHeader2; - private System.Windows.Forms.ColumnHeader columnHeader3; - private System.Windows.Forms.TextBox textBoxPreview; - private System.Windows.Forms.Label LabelPreview; - private System.Windows.Forms.Button buttonSearchClear; - private System.Windows.Forms.Label labelShortcutsSearch; - private System.Windows.Forms.TextBox textBoxSearch; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class ChooseEncoding + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.listView1 = new System.Windows.Forms.ListView(); + this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.textBoxPreview = new System.Windows.Forms.TextBox(); + this.LabelPreview = new System.Windows.Forms.Label(); + this.buttonSearchClear = new System.Windows.Forms.Button(); + this.labelShortcutsSearch = new System.Windows.Forms.Label(); + this.textBoxSearch = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.Location = new System.Drawing.Point(542, 473); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 7; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.Location = new System.Drawing.Point(461, 473); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 6; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); + // + // listView1 + // + this.listView1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader1, + this.columnHeader2, + this.columnHeader3}); + this.listView1.FullRowSelect = true; + this.listView1.GridLines = true; + this.listView1.HideSelection = false; + this.listView1.Location = new System.Drawing.Point(12, 41); + this.listView1.MultiSelect = false; + this.listView1.Name = "listView1"; + this.listView1.Size = new System.Drawing.Size(605, 225); + this.listView1.TabIndex = 8; + this.listView1.UseCompatibleStateImageBehavior = false; + this.listView1.View = System.Windows.Forms.View.Details; + this.listView1.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.listView1_ColumnClick); + this.listView1.SelectedIndexChanged += new System.EventHandler(this.listView1_SelectedIndexChanged); + // + // columnHeader1 + // + this.columnHeader1.Text = "Codepage"; + this.columnHeader1.Width = 75; + // + // columnHeader2 + // + this.columnHeader2.Text = "Name"; + this.columnHeader2.Width = 124; + // + // columnHeader3 + // + this.columnHeader3.Text = "DisplayName"; + this.columnHeader3.Width = 384; + // + // textBoxPreview + // + this.textBoxPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxPreview.Location = new System.Drawing.Point(13, 301); + this.textBoxPreview.Multiline = true; + this.textBoxPreview.Name = "textBoxPreview"; + this.textBoxPreview.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.textBoxPreview.Size = new System.Drawing.Size(604, 156); + this.textBoxPreview.TabIndex = 9; + // + // LabelPreview + // + this.LabelPreview.AutoSize = true; + this.LabelPreview.Location = new System.Drawing.Point(12, 284); + this.LabelPreview.Name = "LabelPreview"; + this.LabelPreview.Size = new System.Drawing.Size(45, 13); + this.LabelPreview.TabIndex = 10; + this.LabelPreview.Text = "Preview"; + // + // buttonSearchClear + // + this.buttonSearchClear.Enabled = false; + this.buttonSearchClear.Location = new System.Drawing.Point(217, 12); + this.buttonSearchClear.Name = "buttonSearchClear"; + this.buttonSearchClear.Size = new System.Drawing.Size(111, 23); + this.buttonSearchClear.TabIndex = 3; + this.buttonSearchClear.Text = "Clear"; + this.buttonSearchClear.UseVisualStyleBackColor = true; + this.buttonSearchClear.Click += new System.EventHandler(this.buttonSearchClear_Click); + // + // labelShortcutsSearch + // + this.labelShortcutsSearch.AutoSize = true; + this.labelShortcutsSearch.Location = new System.Drawing.Point(14, 17); + this.labelShortcutsSearch.Name = "labelShortcutsSearch"; + this.labelShortcutsSearch.Size = new System.Drawing.Size(40, 13); + this.labelShortcutsSearch.TabIndex = 40; + this.labelShortcutsSearch.Text = "Search"; + // + // textBoxSearch + // + this.textBoxSearch.Location = new System.Drawing.Point(60, 14); + this.textBoxSearch.Name = "textBoxSearch"; + this.textBoxSearch.Size = new System.Drawing.Size(151, 21); + this.textBoxSearch.TabIndex = 2; + this.textBoxSearch.TextChanged += new System.EventHandler(this.textBoxSearch_TextChanged); + // + // ChooseEncoding + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(629, 503); + this.Controls.Add(this.buttonSearchClear); + this.Controls.Add(this.labelShortcutsSearch); + this.Controls.Add(this.textBoxSearch); + this.Controls.Add(this.LabelPreview); + this.Controls.Add(this.textBoxPreview); + this.Controls.Add(this.listView1); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.KeyPreview = true; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(645, 542); + this.Name = "ChooseEncoding"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Choose encoding"; + this.Load += new System.EventHandler(this.ChooseEncoding_Load); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormChooseEncoding_KeyDown); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.ListView listView1; + private System.Windows.Forms.ColumnHeader columnHeader1; + private System.Windows.Forms.ColumnHeader columnHeader2; + private System.Windows.Forms.ColumnHeader columnHeader3; + private System.Windows.Forms.TextBox textBoxPreview; + private System.Windows.Forms.Label LabelPreview; + private System.Windows.Forms.Button buttonSearchClear; + private System.Windows.Forms.Label labelShortcutsSearch; + private System.Windows.Forms.TextBox textBoxSearch; + } } \ No newline at end of file diff --git a/src/Forms/ChooseEncoding.cs b/src/ui/Forms/ChooseEncoding.cs similarity index 97% rename from src/Forms/ChooseEncoding.cs rename to src/ui/Forms/ChooseEncoding.cs index 3b707a498..e17569f33 100644 --- a/src/Forms/ChooseEncoding.cs +++ b/src/ui/Forms/ChooseEncoding.cs @@ -1,168 +1,168 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.IO; -using System.Text; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class ChooseEncoding : Form - { - private Encoding _encoding; - private byte[] _fileBuffer; - - public ChooseEncoding() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - LanguageStructure.ChooseEncoding language = Configuration.Settings.Language.ChooseEncoding; - Text = language.Title; - labelShortcutsSearch.Text = Configuration.Settings.Language.General.Search; - buttonSearchClear.Text = Configuration.Settings.Language.DvdSubRip.Clear; - textBoxSearch.Left = labelShortcutsSearch.Left + labelShortcutsSearch.Width + 5; - buttonSearchClear.Left = textBoxSearch.Left + textBoxSearch.Width + 5; - LabelPreview.Text = Configuration.Settings.Language.General.Preview; - listView1.Columns[0].Text = language.CodePage; - listView1.Columns[1].Text = Configuration.Settings.Language.General.Name; - listView1.Columns[2].Text = language.DisplayName; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - UiUtil.FixLargeFonts(this, buttonOK); - } - - public void Initialize(string fileName) - { - try - { - using (var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) - { - int readCount = (int)Math.Min(100000, fs.Length); - _fileBuffer = new byte[readCount]; - fs.Read(_fileBuffer, 0, readCount); - } - } - catch - { - _fileBuffer = new byte[0]; - } - - Encoding encoding; - if (_fileBuffer.Length > 10 && _fileBuffer[0] == 0xef && _fileBuffer[1] == 0xbb && _fileBuffer[2] == 0xbf) - { - encoding = Encoding.UTF8; - } - else - { - encoding = LanguageAutoDetect.DetectAnsiEncoding(_fileBuffer); - } - - listView1.BeginUpdate(); - foreach (var enc in Configuration.AvailableEncodings) - { - var item = new ListViewItem(new[] { enc.CodePage.ToString(), enc.WebName, enc.EncodingName }); - listView1.Items.Add(item); - if (enc.CodePage == encoding.CodePage) - { - item.Selected = true; - } - } - listView1.ListViewItemSorter = new ListViewSorter { ColumnNumber = 0, IsNumber = true }; - listView1.EndUpdate(); - } - - private void FormChooseEncoding_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - internal Encoding GetEncoding() - { - return _encoding; - } - - private void ButtonOkClick(object sender, EventArgs e) - { - if (listView1.SelectedItems.Count == 0) - { - MessageBox.Show(Configuration.Settings.Language.ChooseEncoding.PleaseSelectAnEncoding); - } - else - { - _encoding = Encoding.GetEncoding(int.Parse(listView1.SelectedItems[0].Text)); - DialogResult = DialogResult.OK; - } - } - - private void listView1_SelectedIndexChanged(object sender, EventArgs e) - { - if (listView1.SelectedItems.Count > 0) - { - Encoding encoding = Encoding.GetEncoding(int.Parse(listView1.SelectedItems[0].Text)); - textBoxPreview.Text = encoding.GetString(_fileBuffer).Replace("\0", " "); - LabelPreview.Text = Configuration.Settings.Language.General.Preview + " - " + encoding.EncodingName; - } - else - { - textBoxPreview.Text = string.Empty; - LabelPreview.Text = string.Empty; - } - } - - private void ChooseEncoding_Load(object sender, EventArgs e) - { - if (listView1.SelectedItems.Count >= 1) - { - listView1.EnsureVisible(listView1.SelectedItems[0].Index); - } - } - - private void listView1_ColumnClick(object sender, ColumnClickEventArgs e) - { - ListViewSorter sorter = (ListViewSorter)listView1.ListViewItemSorter; - - if (e.Column == sorter.ColumnNumber) - { - sorter.Descending = !sorter.Descending; // inverse sort direction - } - else - { - sorter.ColumnNumber = e.Column; - sorter.Descending = false; - sorter.IsNumber = e.Column == 0; // only index 1 is numeric - } - listView1.Sort(); - } - - private void textBoxSearch_TextChanged(object sender, EventArgs e) - { - listView1.BeginUpdate(); - listView1.Items.Clear(); - foreach (var enc in Configuration.AvailableEncodings) - { - if (textBoxSearch.Text.Length < 2 || - enc.CodePage.ToString().Contains(textBoxSearch.Text, StringComparison.OrdinalIgnoreCase) || - enc.WebName.Contains(textBoxSearch.Text, StringComparison.OrdinalIgnoreCase) || - enc.EncodingName.Contains(textBoxSearch.Text, StringComparison.OrdinalIgnoreCase)) - { - var item = new ListViewItem(new[] { enc.CodePage.ToString(), enc.WebName, enc.EncodingName }); - listView1.Items.Add(item); - } - } - listView1.EndUpdate(); - buttonSearchClear.Enabled = textBoxSearch.Text.Length > 0; - listView1_SelectedIndexChanged(null, null); - } - - private void buttonSearchClear_Click(object sender, EventArgs e) - { - textBoxSearch.Text = string.Empty; - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.IO; +using System.Text; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class ChooseEncoding : Form + { + private Encoding _encoding; + private byte[] _fileBuffer; + + public ChooseEncoding() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + LanguageStructure.ChooseEncoding language = Configuration.Settings.Language.ChooseEncoding; + Text = language.Title; + labelShortcutsSearch.Text = Configuration.Settings.Language.General.Search; + buttonSearchClear.Text = Configuration.Settings.Language.DvdSubRip.Clear; + textBoxSearch.Left = labelShortcutsSearch.Left + labelShortcutsSearch.Width + 5; + buttonSearchClear.Left = textBoxSearch.Left + textBoxSearch.Width + 5; + LabelPreview.Text = Configuration.Settings.Language.General.Preview; + listView1.Columns[0].Text = language.CodePage; + listView1.Columns[1].Text = Configuration.Settings.Language.General.Name; + listView1.Columns[2].Text = language.DisplayName; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + UiUtil.FixLargeFonts(this, buttonOK); + } + + public void Initialize(string fileName) + { + try + { + using (var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + { + int readCount = (int)Math.Min(100000, fs.Length); + _fileBuffer = new byte[readCount]; + fs.Read(_fileBuffer, 0, readCount); + } + } + catch + { + _fileBuffer = new byte[0]; + } + + Encoding encoding; + if (_fileBuffer.Length > 10 && _fileBuffer[0] == 0xef && _fileBuffer[1] == 0xbb && _fileBuffer[2] == 0xbf) + { + encoding = Encoding.UTF8; + } + else + { + encoding = LanguageAutoDetect.DetectAnsiEncoding(_fileBuffer); + } + + listView1.BeginUpdate(); + foreach (var enc in Configuration.AvailableEncodings) + { + var item = new ListViewItem(new[] { enc.CodePage.ToString(), enc.WebName, enc.EncodingName }); + listView1.Items.Add(item); + if (enc.CodePage == encoding.CodePage) + { + item.Selected = true; + } + } + listView1.ListViewItemSorter = new ListViewSorter { ColumnNumber = 0, IsNumber = true }; + listView1.EndUpdate(); + } + + private void FormChooseEncoding_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + internal Encoding GetEncoding() + { + return _encoding; + } + + private void ButtonOkClick(object sender, EventArgs e) + { + if (listView1.SelectedItems.Count == 0) + { + MessageBox.Show(Configuration.Settings.Language.ChooseEncoding.PleaseSelectAnEncoding); + } + else + { + _encoding = Encoding.GetEncoding(int.Parse(listView1.SelectedItems[0].Text)); + DialogResult = DialogResult.OK; + } + } + + private void listView1_SelectedIndexChanged(object sender, EventArgs e) + { + if (listView1.SelectedItems.Count > 0) + { + Encoding encoding = Encoding.GetEncoding(int.Parse(listView1.SelectedItems[0].Text)); + textBoxPreview.Text = encoding.GetString(_fileBuffer).Replace("\0", " "); + LabelPreview.Text = Configuration.Settings.Language.General.Preview + " - " + encoding.EncodingName; + } + else + { + textBoxPreview.Text = string.Empty; + LabelPreview.Text = string.Empty; + } + } + + private void ChooseEncoding_Load(object sender, EventArgs e) + { + if (listView1.SelectedItems.Count >= 1) + { + listView1.EnsureVisible(listView1.SelectedItems[0].Index); + } + } + + private void listView1_ColumnClick(object sender, ColumnClickEventArgs e) + { + ListViewSorter sorter = (ListViewSorter)listView1.ListViewItemSorter; + + if (e.Column == sorter.ColumnNumber) + { + sorter.Descending = !sorter.Descending; // inverse sort direction + } + else + { + sorter.ColumnNumber = e.Column; + sorter.Descending = false; + sorter.IsNumber = e.Column == 0; // only index 1 is numeric + } + listView1.Sort(); + } + + private void textBoxSearch_TextChanged(object sender, EventArgs e) + { + listView1.BeginUpdate(); + listView1.Items.Clear(); + foreach (var enc in Configuration.AvailableEncodings) + { + if (textBoxSearch.Text.Length < 2 || + enc.CodePage.ToString().Contains(textBoxSearch.Text, StringComparison.OrdinalIgnoreCase) || + enc.WebName.Contains(textBoxSearch.Text, StringComparison.OrdinalIgnoreCase) || + enc.EncodingName.Contains(textBoxSearch.Text, StringComparison.OrdinalIgnoreCase)) + { + var item = new ListViewItem(new[] { enc.CodePage.ToString(), enc.WebName, enc.EncodingName }); + listView1.Items.Add(item); + } + } + listView1.EndUpdate(); + buttonSearchClear.Enabled = textBoxSearch.Text.Length > 0; + listView1_SelectedIndexChanged(null, null); + } + + private void buttonSearchClear_Click(object sender, EventArgs e) + { + textBoxSearch.Text = string.Empty; + } + } +} diff --git a/src/Forms/ChooseEncoding.resx b/src/ui/Forms/ChooseEncoding.resx similarity index 97% rename from src/Forms/ChooseEncoding.resx rename to src/ui/Forms/ChooseEncoding.resx index c7e0d4bdf..d58980a38 100644 --- a/src/Forms/ChooseEncoding.resx +++ b/src/ui/Forms/ChooseEncoding.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Forms/ChooseFontName.Designer.cs b/src/ui/Forms/ChooseFontName.Designer.cs similarity index 100% rename from src/Forms/ChooseFontName.Designer.cs rename to src/ui/Forms/ChooseFontName.Designer.cs diff --git a/src/Forms/ChooseFontName.cs b/src/ui/Forms/ChooseFontName.cs similarity index 100% rename from src/Forms/ChooseFontName.cs rename to src/ui/Forms/ChooseFontName.cs diff --git a/src/Forms/EbuLanguageCode.resx b/src/ui/Forms/ChooseFontName.resx similarity index 100% rename from src/Forms/EbuLanguageCode.resx rename to src/ui/Forms/ChooseFontName.resx diff --git a/src/Forms/ChooseLanguage.Designer.cs b/src/ui/Forms/ChooseLanguage.Designer.cs similarity index 97% rename from src/Forms/ChooseLanguage.Designer.cs rename to src/ui/Forms/ChooseLanguage.Designer.cs index bfeb9e648..fb7577003 100644 --- a/src/Forms/ChooseLanguage.Designer.cs +++ b/src/ui/Forms/ChooseLanguage.Designer.cs @@ -1,109 +1,109 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class ChooseLanguage - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.labelLanguage = new System.Windows.Forms.Label(); - this.comboBoxLanguages = new System.Windows.Forms.ComboBox(); - this.SuspendLayout(); - // - // buttonCancel - // - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(203, 72); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 2; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - // - // buttonOK - // - this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(122, 72); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 1; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - // - // labelLanguage - // - this.labelLanguage.AutoSize = true; - this.labelLanguage.Location = new System.Drawing.Point(12, 14); - this.labelLanguage.Name = "labelLanguage"; - this.labelLanguage.Size = new System.Drawing.Size(54, 13); - this.labelLanguage.TabIndex = 15; - this.labelLanguage.Text = "Language"; - // - // comboBoxLanguages - // - this.comboBoxLanguages.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxLanguages.FormattingEnabled = true; - this.comboBoxLanguages.Location = new System.Drawing.Point(12, 31); - this.comboBoxLanguages.Name = "comboBoxLanguages"; - this.comboBoxLanguages.Size = new System.Drawing.Size(266, 21); - this.comboBoxLanguages.TabIndex = 0; - // - // ChooseLanguage - // - this.AcceptButton = this.buttonOK; - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(290, 105); - this.Controls.Add(this.labelLanguage); - this.Controls.Add(this.comboBoxLanguages); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "ChooseLanguage"; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Choose language"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ChangeLanguage_KeyDown); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Label labelLanguage; - private System.Windows.Forms.ComboBox comboBoxLanguages; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class ChooseLanguage + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.labelLanguage = new System.Windows.Forms.Label(); + this.comboBoxLanguages = new System.Windows.Forms.ComboBox(); + this.SuspendLayout(); + // + // buttonCancel + // + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(203, 72); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 2; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + // + // buttonOK + // + this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(122, 72); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 1; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + // + // labelLanguage + // + this.labelLanguage.AutoSize = true; + this.labelLanguage.Location = new System.Drawing.Point(12, 14); + this.labelLanguage.Name = "labelLanguage"; + this.labelLanguage.Size = new System.Drawing.Size(54, 13); + this.labelLanguage.TabIndex = 15; + this.labelLanguage.Text = "Language"; + // + // comboBoxLanguages + // + this.comboBoxLanguages.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxLanguages.FormattingEnabled = true; + this.comboBoxLanguages.Location = new System.Drawing.Point(12, 31); + this.comboBoxLanguages.Name = "comboBoxLanguages"; + this.comboBoxLanguages.Size = new System.Drawing.Size(266, 21); + this.comboBoxLanguages.TabIndex = 0; + // + // ChooseLanguage + // + this.AcceptButton = this.buttonOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(290, 105); + this.Controls.Add(this.labelLanguage); + this.Controls.Add(this.comboBoxLanguages); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "ChooseLanguage"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Choose language"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ChangeLanguage_KeyDown); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Label labelLanguage; + private System.Windows.Forms.ComboBox comboBoxLanguages; + } } \ No newline at end of file diff --git a/src/Forms/ChooseLanguage.cs b/src/ui/Forms/ChooseLanguage.cs similarity index 97% rename from src/Forms/ChooseLanguage.cs rename to src/ui/Forms/ChooseLanguage.cs index ab6788525..5c075127e 100644 --- a/src/Forms/ChooseLanguage.cs +++ b/src/ui/Forms/ChooseLanguage.cs @@ -1,144 +1,144 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Windows.Forms; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class ChooseLanguage : PositionAndSizeForm - { - private class TranslationInfo : IEquatable - { - public string CultureName { get; } - - public string DisplayName { get; } - - public TranslationInfo(string cultureName, string displayName) - { - CultureName = cultureName; - try - { - DisplayName = displayName.CapitalizeFirstLetter(CultureInfo.GetCultureInfo(cultureName)); - } - catch - { - DisplayName = displayName.CapitalizeFirstLetter(CultureInfo.InvariantCulture); - } - } - - public bool Equals(TranslationInfo ti) - { - return !ReferenceEquals(ti, null) && CultureName.Equals(ti.CultureName, StringComparison.OrdinalIgnoreCase); - } - - public override bool Equals(object obj) - { - return Equals(obj as TranslationInfo); - } - - public override int GetHashCode() - { - return CultureName.ToUpperInvariant().GetHashCode(); - } - - public override string ToString() - { - return DisplayName; - } - } - - private readonly TranslationInfo _defaultTranslation; - - public string CultureName => !(comboBoxLanguages.SelectedItem is TranslationInfo translation) ? _defaultTranslation.CultureName : translation.CultureName; - - public ChooseLanguage() - { - TranslationInfo currentTranslation; - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - var defaultLanguage = new Language(); - _defaultTranslation = new TranslationInfo(defaultLanguage.General.CultureName, defaultLanguage.Name); - var currentLanguage = Configuration.Settings.Language; - if (currentLanguage == null) - { - currentTranslation = new TranslationInfo(CultureInfo.CurrentUICulture.Name, CultureInfo.CurrentUICulture.NativeName); - Configuration.Settings.Language = defaultLanguage; - } - else - { - currentTranslation = new TranslationInfo(currentLanguage.General.CultureName, currentLanguage.Name); - } - - var translations = new HashSet { _defaultTranslation }; - if (Directory.Exists(Path.Combine(Configuration.BaseDirectory, "Languages"))) - { - var versionInfo = Utilities.AssemblyVersion.Split('.'); - var currentVersion = $"{versionInfo[0]}.{versionInfo[1]}.{versionInfo[2]}"; - var document = new XmlDocument { XmlResolver = null }; - - foreach (var fileName in Directory.GetFiles(Path.Combine(Configuration.BaseDirectory, "Languages"), "*.xml")) - { - document.Load(fileName); - try - { - var version = document.DocumentElement.SelectSingleNode("General/Version").InnerText.Trim(); - if (version == currentVersion) - { - var cultureName = document.DocumentElement.SelectSingleNode("General/CultureName").InnerText.Trim(); - var displayName = document.DocumentElement.Attributes["Name"].Value.Trim(); - if (!string.IsNullOrEmpty(cultureName) && !string.IsNullOrEmpty(displayName)) - { - translations.Add(new TranslationInfo(cultureName, displayName)); - } - } - } - catch - { - // ignored - } - } - } - - int index = -1; - foreach (var translation in translations.OrderBy(ti => ti.DisplayName, StringComparer.CurrentCultureIgnoreCase).ThenBy(ti => ti.CultureName, StringComparer.Ordinal)) - { - int i = comboBoxLanguages.Items.Add(translation); - if (translation.Equals(currentTranslation) || (index < 0 && translation.Equals(_defaultTranslation))) - { - index = i; - } - } - comboBoxLanguages.SelectedIndex = index; - comboBoxLanguages.AutoCompleteSource = AutoCompleteSource.ListItems; - comboBoxLanguages.AutoCompleteMode = AutoCompleteMode.Append; - - Text = Configuration.Settings.Language.ChooseLanguage.Title; - labelLanguage.Text = Configuration.Settings.Language.ChooseLanguage.Language; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - UiUtil.FixLargeFonts(this, buttonOK); - } - - private void ChangeLanguage_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - else if (e.KeyCode == UiUtil.HelpKeys) - { - Utilities.ShowHelp("#translate"); - e.SuppressKeyPress = true; - } - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Windows.Forms; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class ChooseLanguage : PositionAndSizeForm + { + private class TranslationInfo : IEquatable + { + public string CultureName { get; } + + public string DisplayName { get; } + + public TranslationInfo(string cultureName, string displayName) + { + CultureName = cultureName; + try + { + DisplayName = displayName.CapitalizeFirstLetter(CultureInfo.GetCultureInfo(cultureName)); + } + catch + { + DisplayName = displayName.CapitalizeFirstLetter(CultureInfo.InvariantCulture); + } + } + + public bool Equals(TranslationInfo ti) + { + return !ReferenceEquals(ti, null) && CultureName.Equals(ti.CultureName, StringComparison.OrdinalIgnoreCase); + } + + public override bool Equals(object obj) + { + return Equals(obj as TranslationInfo); + } + + public override int GetHashCode() + { + return CultureName.ToUpperInvariant().GetHashCode(); + } + + public override string ToString() + { + return DisplayName; + } + } + + private readonly TranslationInfo _defaultTranslation; + + public string CultureName => !(comboBoxLanguages.SelectedItem is TranslationInfo translation) ? _defaultTranslation.CultureName : translation.CultureName; + + public ChooseLanguage() + { + TranslationInfo currentTranslation; + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + var defaultLanguage = new Language(); + _defaultTranslation = new TranslationInfo(defaultLanguage.General.CultureName, defaultLanguage.Name); + var currentLanguage = Configuration.Settings.Language; + if (currentLanguage == null) + { + currentTranslation = new TranslationInfo(CultureInfo.CurrentUICulture.Name, CultureInfo.CurrentUICulture.NativeName); + Configuration.Settings.Language = defaultLanguage; + } + else + { + currentTranslation = new TranslationInfo(currentLanguage.General.CultureName, currentLanguage.Name); + } + + var translations = new HashSet { _defaultTranslation }; + if (Directory.Exists(Path.Combine(Configuration.BaseDirectory, "Languages"))) + { + var versionInfo = Utilities.AssemblyVersion.Split('.'); + var currentVersion = $"{versionInfo[0]}.{versionInfo[1]}.{versionInfo[2]}"; + var document = new XmlDocument { XmlResolver = null }; + + foreach (var fileName in Directory.GetFiles(Path.Combine(Configuration.BaseDirectory, "Languages"), "*.xml")) + { + document.Load(fileName); + try + { + var version = document.DocumentElement.SelectSingleNode("General/Version").InnerText.Trim(); + if (version == currentVersion) + { + var cultureName = document.DocumentElement.SelectSingleNode("General/CultureName").InnerText.Trim(); + var displayName = document.DocumentElement.Attributes["Name"].Value.Trim(); + if (!string.IsNullOrEmpty(cultureName) && !string.IsNullOrEmpty(displayName)) + { + translations.Add(new TranslationInfo(cultureName, displayName)); + } + } + } + catch + { + // ignored + } + } + } + + int index = -1; + foreach (var translation in translations.OrderBy(ti => ti.DisplayName, StringComparer.CurrentCultureIgnoreCase).ThenBy(ti => ti.CultureName, StringComparer.Ordinal)) + { + int i = comboBoxLanguages.Items.Add(translation); + if (translation.Equals(currentTranslation) || (index < 0 && translation.Equals(_defaultTranslation))) + { + index = i; + } + } + comboBoxLanguages.SelectedIndex = index; + comboBoxLanguages.AutoCompleteSource = AutoCompleteSource.ListItems; + comboBoxLanguages.AutoCompleteMode = AutoCompleteMode.Append; + + Text = Configuration.Settings.Language.ChooseLanguage.Title; + labelLanguage.Text = Configuration.Settings.Language.ChooseLanguage.Language; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + UiUtil.FixLargeFonts(this, buttonOK); + } + + private void ChangeLanguage_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + else if (e.KeyCode == UiUtil.HelpKeys) + { + Utilities.ShowHelp("#translate"); + e.SuppressKeyPress = true; + } + } + + } +} diff --git a/src/Forms/ChooseLanguage.resx b/src/ui/Forms/ChooseLanguage.resx similarity index 97% rename from src/Forms/ChooseLanguage.resx rename to src/ui/Forms/ChooseLanguage.resx index c7e0d4bdf..d58980a38 100644 --- a/src/Forms/ChooseLanguage.resx +++ b/src/ui/Forms/ChooseLanguage.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Forms/ChooseResolution.Designer.cs b/src/ui/Forms/ChooseResolution.Designer.cs similarity index 97% rename from src/Forms/ChooseResolution.Designer.cs rename to src/ui/Forms/ChooseResolution.Designer.cs index 207e0fcb3..215a98d18 100644 --- a/src/Forms/ChooseResolution.Designer.cs +++ b/src/ui/Forms/ChooseResolution.Designer.cs @@ -1,173 +1,173 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class ChooseResolution - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); - this.labelVideoResolution = new System.Windows.Forms.Label(); - this.numericUpDownVideoHeight = new System.Windows.Forms.NumericUpDown(); - this.button1 = new System.Windows.Forms.Button(); - this.labelX = new System.Windows.Forms.Label(); - this.numericUpDownVideoWidth = new System.Windows.Forms.NumericUpDown(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownVideoHeight)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownVideoWidth)).BeginInit(); - this.SuspendLayout(); - // - // openFileDialog1 - // - this.openFileDialog1.FileName = "openFileDialog1"; - // - // labelVideoResolution - // - this.labelVideoResolution.AutoSize = true; - this.labelVideoResolution.Location = new System.Drawing.Point(12, 32); - this.labelVideoResolution.Name = "labelVideoResolution"; - this.labelVideoResolution.Size = new System.Drawing.Size(82, 13); - this.labelVideoResolution.TabIndex = 0; - this.labelVideoResolution.Text = "Video resolution"; - // - // numericUpDownVideoHeight - // - this.numericUpDownVideoHeight.Location = new System.Drawing.Point(205, 29); - this.numericUpDownVideoHeight.Maximum = new decimal(new int[] { - 100000, - 0, - 0, - 0}); - this.numericUpDownVideoHeight.Name = "numericUpDownVideoHeight"; - this.numericUpDownVideoHeight.Size = new System.Drawing.Size(47, 20); - this.numericUpDownVideoHeight.TabIndex = 3; - this.numericUpDownVideoHeight.Value = new decimal(new int[] { - 1080, - 0, - 0, - 0}); - // - // button1 - // - this.button1.Location = new System.Drawing.Point(258, 27); - this.button1.Name = "button1"; - this.button1.Size = new System.Drawing.Size(27, 23); - this.button1.TabIndex = 4; - this.button1.Text = "..."; - this.button1.UseVisualStyleBackColor = true; - this.button1.Click += new System.EventHandler(this.button1_Click); - // - // labelX - // - this.labelX.AutoSize = true; - this.labelX.Location = new System.Drawing.Point(185, 31); - this.labelX.Name = "labelX"; - this.labelX.Size = new System.Drawing.Size(14, 13); - this.labelX.TabIndex = 2; - this.labelX.Text = "X"; - // - // numericUpDownVideoWidth - // - this.numericUpDownVideoWidth.Location = new System.Drawing.Point(132, 29); - this.numericUpDownVideoWidth.Maximum = new decimal(new int[] { - 100000, - 0, - 0, - 0}); - this.numericUpDownVideoWidth.Name = "numericUpDownVideoWidth"; - this.numericUpDownVideoWidth.Size = new System.Drawing.Size(47, 20); - this.numericUpDownVideoWidth.TabIndex = 1; - this.numericUpDownVideoWidth.Value = new decimal(new int[] { - 1920, - 0, - 0, - 0}); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(213, 81); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 6; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(132, 81); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 5; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // ChooseResolution - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(300, 114); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.labelVideoResolution); - this.Controls.Add(this.numericUpDownVideoHeight); - this.Controls.Add(this.button1); - this.Controls.Add(this.labelX); - this.Controls.Add(this.numericUpDownVideoWidth); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "ChooseResolution"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Choose video resolution"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ChooseResolution_KeyDown); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownVideoHeight)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownVideoWidth)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.OpenFileDialog openFileDialog1; - private System.Windows.Forms.Label labelVideoResolution; - private System.Windows.Forms.NumericUpDown numericUpDownVideoHeight; - private System.Windows.Forms.Button button1; - private System.Windows.Forms.Label labelX; - private System.Windows.Forms.NumericUpDown numericUpDownVideoWidth; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonOK; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class ChooseResolution + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); + this.labelVideoResolution = new System.Windows.Forms.Label(); + this.numericUpDownVideoHeight = new System.Windows.Forms.NumericUpDown(); + this.button1 = new System.Windows.Forms.Button(); + this.labelX = new System.Windows.Forms.Label(); + this.numericUpDownVideoWidth = new System.Windows.Forms.NumericUpDown(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownVideoHeight)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownVideoWidth)).BeginInit(); + this.SuspendLayout(); + // + // openFileDialog1 + // + this.openFileDialog1.FileName = "openFileDialog1"; + // + // labelVideoResolution + // + this.labelVideoResolution.AutoSize = true; + this.labelVideoResolution.Location = new System.Drawing.Point(12, 32); + this.labelVideoResolution.Name = "labelVideoResolution"; + this.labelVideoResolution.Size = new System.Drawing.Size(82, 13); + this.labelVideoResolution.TabIndex = 0; + this.labelVideoResolution.Text = "Video resolution"; + // + // numericUpDownVideoHeight + // + this.numericUpDownVideoHeight.Location = new System.Drawing.Point(205, 29); + this.numericUpDownVideoHeight.Maximum = new decimal(new int[] { + 100000, + 0, + 0, + 0}); + this.numericUpDownVideoHeight.Name = "numericUpDownVideoHeight"; + this.numericUpDownVideoHeight.Size = new System.Drawing.Size(47, 20); + this.numericUpDownVideoHeight.TabIndex = 3; + this.numericUpDownVideoHeight.Value = new decimal(new int[] { + 1080, + 0, + 0, + 0}); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(258, 27); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(27, 23); + this.button1.TabIndex = 4; + this.button1.Text = "..."; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // labelX + // + this.labelX.AutoSize = true; + this.labelX.Location = new System.Drawing.Point(185, 31); + this.labelX.Name = "labelX"; + this.labelX.Size = new System.Drawing.Size(14, 13); + this.labelX.TabIndex = 2; + this.labelX.Text = "X"; + // + // numericUpDownVideoWidth + // + this.numericUpDownVideoWidth.Location = new System.Drawing.Point(132, 29); + this.numericUpDownVideoWidth.Maximum = new decimal(new int[] { + 100000, + 0, + 0, + 0}); + this.numericUpDownVideoWidth.Name = "numericUpDownVideoWidth"; + this.numericUpDownVideoWidth.Size = new System.Drawing.Size(47, 20); + this.numericUpDownVideoWidth.TabIndex = 1; + this.numericUpDownVideoWidth.Value = new decimal(new int[] { + 1920, + 0, + 0, + 0}); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(213, 81); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 6; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(132, 81); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 5; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // ChooseResolution + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(300, 114); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.labelVideoResolution); + this.Controls.Add(this.numericUpDownVideoHeight); + this.Controls.Add(this.button1); + this.Controls.Add(this.labelX); + this.Controls.Add(this.numericUpDownVideoWidth); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "ChooseResolution"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Choose video resolution"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ChooseResolution_KeyDown); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownVideoHeight)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownVideoWidth)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.OpenFileDialog openFileDialog1; + private System.Windows.Forms.Label labelVideoResolution; + private System.Windows.Forms.NumericUpDown numericUpDownVideoHeight; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Label labelX; + private System.Windows.Forms.NumericUpDown numericUpDownVideoWidth; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + } } \ No newline at end of file diff --git a/src/Forms/ChooseResolution.cs b/src/ui/Forms/ChooseResolution.cs similarity index 97% rename from src/Forms/ChooseResolution.cs rename to src/ui/Forms/ChooseResolution.cs index 8cf190928..afcc3995a 100644 --- a/src/Forms/ChooseResolution.cs +++ b/src/ui/Forms/ChooseResolution.cs @@ -1,63 +1,63 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class ChooseResolution : Form - { - public int VideoWidth { get; set; } - public int VideoHeight { get; set; } - - public ChooseResolution() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - Text = Configuration.Settings.Language.ExportPngXml.VideoResolution; - labelVideoResolution.Text = Configuration.Settings.Language.ExportPngXml.VideoResolution; - } - - private void button1_Click(object sender, EventArgs e) - { - openFileDialog1.Title = Configuration.Settings.Language.General.OpenVideoFileTitle; - openFileDialog1.FileName = string.Empty; - openFileDialog1.Filter = Utilities.GetVideoFileFilter(false); - openFileDialog1.FileName = string.Empty; - if (openFileDialog1.ShowDialog() == DialogResult.OK) - { - VideoInfo info = UiUtil.GetVideoInfo(openFileDialog1.FileName); - if (info != null && info.Success) - { - numericUpDownVideoWidth.Value = info.Width; - numericUpDownVideoHeight.Value = info.Height; - } - } - } - - private void buttonOK_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.OK; - VideoWidth = (int)numericUpDownVideoWidth.Value; - VideoHeight = (int)numericUpDownVideoHeight.Value; - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private void ChooseResolution_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class ChooseResolution : Form + { + public int VideoWidth { get; set; } + public int VideoHeight { get; set; } + + public ChooseResolution() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + Text = Configuration.Settings.Language.ExportPngXml.VideoResolution; + labelVideoResolution.Text = Configuration.Settings.Language.ExportPngXml.VideoResolution; + } + + private void button1_Click(object sender, EventArgs e) + { + openFileDialog1.Title = Configuration.Settings.Language.General.OpenVideoFileTitle; + openFileDialog1.FileName = string.Empty; + openFileDialog1.Filter = Utilities.GetVideoFileFilter(false); + openFileDialog1.FileName = string.Empty; + if (openFileDialog1.ShowDialog() == DialogResult.OK) + { + VideoInfo info = UiUtil.GetVideoInfo(openFileDialog1.FileName); + if (info != null && info.Success) + { + numericUpDownVideoWidth.Value = info.Width; + numericUpDownVideoHeight.Value = info.Height; + } + } + } + + private void buttonOK_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.OK; + VideoWidth = (int)numericUpDownVideoWidth.Value; + VideoHeight = (int)numericUpDownVideoHeight.Value; + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void ChooseResolution_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + } +} diff --git a/src/Forms/ChooseResolution.resx b/src/ui/Forms/ChooseResolution.resx similarity index 97% rename from src/Forms/ChooseResolution.resx rename to src/ui/Forms/ChooseResolution.resx index 3a7d67153..9bad2f599 100644 --- a/src/Forms/ChooseResolution.resx +++ b/src/ui/Forms/ChooseResolution.resx @@ -1,123 +1,123 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + \ No newline at end of file diff --git a/src/Forms/ChooseStyle.Designer.cs b/src/ui/Forms/ChooseStyle.Designer.cs similarity index 97% rename from src/Forms/ChooseStyle.Designer.cs rename to src/ui/Forms/ChooseStyle.Designer.cs index 2d0c6d80e..594f8b1e8 100644 --- a/src/Forms/ChooseStyle.Designer.cs +++ b/src/ui/Forms/ChooseStyle.Designer.cs @@ -1,167 +1,167 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class ChooseStyle - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.groupBoxStyles = new System.Windows.Forms.GroupBox(); - this.listViewStyles = new System.Windows.Forms.ListView(); - this.columnHeaderName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderFontName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderFontSize = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderUseCount = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderPrimaryColor = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderOutline = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.groupBoxStyles.SuspendLayout(); - this.SuspendLayout(); - // - // groupBoxStyles - // - this.groupBoxStyles.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxStyles.Controls.Add(this.listViewStyles); - this.groupBoxStyles.Location = new System.Drawing.Point(12, 12); - this.groupBoxStyles.Name = "groupBoxStyles"; - this.groupBoxStyles.Size = new System.Drawing.Size(700, 424); - this.groupBoxStyles.TabIndex = 1; - this.groupBoxStyles.TabStop = false; - this.groupBoxStyles.Text = "Styles"; - // - // listViewStyles - // - this.listViewStyles.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.listViewStyles.CheckBoxes = true; - this.listViewStyles.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeaderName, - this.columnHeaderFontName, - this.columnHeaderFontSize, - this.columnHeaderUseCount, - this.columnHeaderPrimaryColor, - this.columnHeaderOutline}); - this.listViewStyles.FullRowSelect = true; - this.listViewStyles.HideSelection = false; - this.listViewStyles.Location = new System.Drawing.Point(6, 19); - this.listViewStyles.MultiSelect = false; - this.listViewStyles.Name = "listViewStyles"; - this.listViewStyles.Size = new System.Drawing.Size(688, 399); - this.listViewStyles.TabIndex = 0; - this.listViewStyles.UseCompatibleStateImageBehavior = false; - this.listViewStyles.View = System.Windows.Forms.View.Details; - // - // columnHeaderName - // - this.columnHeaderName.Text = "Name"; - this.columnHeaderName.Width = 130; - // - // columnHeaderFontName - // - this.columnHeaderFontName.Text = "Font name"; - this.columnHeaderFontName.Width = 128; - // - // columnHeaderFontSize - // - this.columnHeaderFontSize.Text = "Font size"; - this.columnHeaderFontSize.Width = 85; - // - // columnHeaderUseCount - // - this.columnHeaderUseCount.Text = "Used#"; - this.columnHeaderUseCount.Width = 65; - // - // columnHeaderPrimaryColor - // - this.columnHeaderPrimaryColor.Text = "Primary"; - // - // columnHeaderOutline - // - this.columnHeaderOutline.Text = "Outline"; - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(637, 442); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 4; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(556, 442); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 3; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // ChooseStyle - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(724, 475); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.groupBoxStyles); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "ChooseStyle"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Choose style"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ChooseStyle_KeyDown); - this.groupBoxStyles.ResumeLayout(false); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.GroupBox groupBoxStyles; - private System.Windows.Forms.ListView listViewStyles; - private System.Windows.Forms.ColumnHeader columnHeaderName; - private System.Windows.Forms.ColumnHeader columnHeaderFontName; - private System.Windows.Forms.ColumnHeader columnHeaderFontSize; - private System.Windows.Forms.ColumnHeader columnHeaderUseCount; - private System.Windows.Forms.ColumnHeader columnHeaderPrimaryColor; - private System.Windows.Forms.ColumnHeader columnHeaderOutline; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonOK; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class ChooseStyle + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.groupBoxStyles = new System.Windows.Forms.GroupBox(); + this.listViewStyles = new System.Windows.Forms.ListView(); + this.columnHeaderName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderFontName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderFontSize = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderUseCount = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderPrimaryColor = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderOutline = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.groupBoxStyles.SuspendLayout(); + this.SuspendLayout(); + // + // groupBoxStyles + // + this.groupBoxStyles.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxStyles.Controls.Add(this.listViewStyles); + this.groupBoxStyles.Location = new System.Drawing.Point(12, 12); + this.groupBoxStyles.Name = "groupBoxStyles"; + this.groupBoxStyles.Size = new System.Drawing.Size(700, 424); + this.groupBoxStyles.TabIndex = 1; + this.groupBoxStyles.TabStop = false; + this.groupBoxStyles.Text = "Styles"; + // + // listViewStyles + // + this.listViewStyles.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listViewStyles.CheckBoxes = true; + this.listViewStyles.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeaderName, + this.columnHeaderFontName, + this.columnHeaderFontSize, + this.columnHeaderUseCount, + this.columnHeaderPrimaryColor, + this.columnHeaderOutline}); + this.listViewStyles.FullRowSelect = true; + this.listViewStyles.HideSelection = false; + this.listViewStyles.Location = new System.Drawing.Point(6, 19); + this.listViewStyles.MultiSelect = false; + this.listViewStyles.Name = "listViewStyles"; + this.listViewStyles.Size = new System.Drawing.Size(688, 399); + this.listViewStyles.TabIndex = 0; + this.listViewStyles.UseCompatibleStateImageBehavior = false; + this.listViewStyles.View = System.Windows.Forms.View.Details; + // + // columnHeaderName + // + this.columnHeaderName.Text = "Name"; + this.columnHeaderName.Width = 130; + // + // columnHeaderFontName + // + this.columnHeaderFontName.Text = "Font name"; + this.columnHeaderFontName.Width = 128; + // + // columnHeaderFontSize + // + this.columnHeaderFontSize.Text = "Font size"; + this.columnHeaderFontSize.Width = 85; + // + // columnHeaderUseCount + // + this.columnHeaderUseCount.Text = "Used#"; + this.columnHeaderUseCount.Width = 65; + // + // columnHeaderPrimaryColor + // + this.columnHeaderPrimaryColor.Text = "Primary"; + // + // columnHeaderOutline + // + this.columnHeaderOutline.Text = "Outline"; + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(637, 442); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 4; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(556, 442); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 3; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // ChooseStyle + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(724, 475); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.groupBoxStyles); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "ChooseStyle"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Choose style"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ChooseStyle_KeyDown); + this.groupBoxStyles.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBoxStyles; + private System.Windows.Forms.ListView listViewStyles; + private System.Windows.Forms.ColumnHeader columnHeaderName; + private System.Windows.Forms.ColumnHeader columnHeaderFontName; + private System.Windows.Forms.ColumnHeader columnHeaderFontSize; + private System.Windows.Forms.ColumnHeader columnHeaderUseCount; + private System.Windows.Forms.ColumnHeader columnHeaderPrimaryColor; + private System.Windows.Forms.ColumnHeader columnHeaderOutline; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + } } \ No newline at end of file diff --git a/src/Forms/ChooseStyle.cs b/src/ui/Forms/ChooseStyle.cs similarity index 97% rename from src/Forms/ChooseStyle.cs rename to src/ui/Forms/ChooseStyle.cs index 3c971720e..6ace18b5c 100644 --- a/src/Forms/ChooseStyle.cs +++ b/src/ui/Forms/ChooseStyle.cs @@ -1,84 +1,84 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.SubtitleFormats; -using Nikse.SubtitleEdit.Forms.Styles; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class ChooseStyle : Form - { - public List SelectedStyleNames { get; set; } - - private readonly Subtitle _subtitle; - private readonly bool _isSubStationAlpha; - - public ChooseStyle(Subtitle subtitle, bool isSubStationAlpha) - { - SelectedStyleNames = new List(); - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - _subtitle = subtitle; - _isSubStationAlpha = isSubStationAlpha; - - var l = Configuration.Settings.Language.SubStationAlphaStyles; - Text = l.ChooseStyle; - listViewStyles.Columns[0].Text = l.Name; - listViewStyles.Columns[1].Text = l.FontName; - listViewStyles.Columns[2].Text = l.FontSize; - listViewStyles.Columns[3].Text = l.UseCount; - listViewStyles.Columns[4].Text = l.Primary; - listViewStyles.Columns[5].Text = l.Outline; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - - InitializeListView(); - UiUtil.FixLargeFonts(this, buttonOK); - } - - private void ChooseStyle_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - private void buttonOK_Click(object sender, EventArgs e) - { - foreach (ListViewItem item in listViewStyles.Items) - { - if (item.Checked) - { - SelectedStyleNames.Add(item.Text); - } - } - DialogResult = DialogResult.OK; - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private void InitializeListView() - { - var styles = AdvancedSubStationAlpha.GetStylesFromHeader(_subtitle.Header); - listViewStyles.Items.Clear(); - foreach (string style in styles) - { - SsaStyle ssaStyle = AdvancedSubStationAlpha.GetSsaStyle(style, _subtitle.Header); - SubStationAlphaStyles.AddStyle(listViewStyles, ssaStyle, _subtitle, _isSubStationAlpha); - } - if (listViewStyles.Items.Count > 0) - { - listViewStyles.Items[0].Selected = true; - } - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.SubtitleFormats; +using Nikse.SubtitleEdit.Forms.Styles; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class ChooseStyle : Form + { + public List SelectedStyleNames { get; set; } + + private readonly Subtitle _subtitle; + private readonly bool _isSubStationAlpha; + + public ChooseStyle(Subtitle subtitle, bool isSubStationAlpha) + { + SelectedStyleNames = new List(); + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + _subtitle = subtitle; + _isSubStationAlpha = isSubStationAlpha; + + var l = Configuration.Settings.Language.SubStationAlphaStyles; + Text = l.ChooseStyle; + listViewStyles.Columns[0].Text = l.Name; + listViewStyles.Columns[1].Text = l.FontName; + listViewStyles.Columns[2].Text = l.FontSize; + listViewStyles.Columns[3].Text = l.UseCount; + listViewStyles.Columns[4].Text = l.Primary; + listViewStyles.Columns[5].Text = l.Outline; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + + InitializeListView(); + UiUtil.FixLargeFonts(this, buttonOK); + } + + private void ChooseStyle_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + private void buttonOK_Click(object sender, EventArgs e) + { + foreach (ListViewItem item in listViewStyles.Items) + { + if (item.Checked) + { + SelectedStyleNames.Add(item.Text); + } + } + DialogResult = DialogResult.OK; + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void InitializeListView() + { + var styles = AdvancedSubStationAlpha.GetStylesFromHeader(_subtitle.Header); + listViewStyles.Items.Clear(); + foreach (string style in styles) + { + SsaStyle ssaStyle = AdvancedSubStationAlpha.GetSsaStyle(style, _subtitle.Header); + SubStationAlphaStyles.AddStyle(listViewStyles, ssaStyle, _subtitle, _isSubStationAlpha); + } + if (listViewStyles.Items.Count > 0) + { + listViewStyles.Items[0].Selected = true; + } + } + + } +} diff --git a/src/Forms/ExportPngXmlDialogOpenFolder.resx b/src/ui/Forms/ChooseStyle.resx similarity index 100% rename from src/Forms/ExportPngXmlDialogOpenFolder.resx rename to src/ui/Forms/ChooseStyle.resx diff --git a/src/Forms/ColorChooser.cs b/src/ui/Forms/ColorChooser.cs similarity index 100% rename from src/Forms/ColorChooser.cs rename to src/ui/Forms/ColorChooser.cs diff --git a/src/Forms/ColorChooser.resx b/src/ui/Forms/ColorChooser.resx similarity index 100% rename from src/Forms/ColorChooser.resx rename to src/ui/Forms/ColorChooser.resx diff --git a/src/Forms/ColumnPaste.Designer.cs b/src/ui/Forms/ColumnPaste.Designer.cs similarity index 98% rename from src/Forms/ColumnPaste.Designer.cs rename to src/ui/Forms/ColumnPaste.Designer.cs index b5467f607..b84aaf34d 100644 --- a/src/Forms/ColumnPaste.Designer.cs +++ b/src/ui/Forms/ColumnPaste.Designer.cs @@ -1,202 +1,202 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class ColumnPaste - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.radioButtonTextOnly = new System.Windows.Forms.RadioButton(); - this.radioButtonTimeCodes = new System.Windows.Forms.RadioButton(); - this.radioButtonOriginalText = new System.Windows.Forms.RadioButton(); - this.radioButtonAll = new System.Windows.Forms.RadioButton(); - this.groupBoxChooseColumn = new System.Windows.Forms.GroupBox(); - this.groupBoxOverwriteOrInsert = new System.Windows.Forms.GroupBox(); - this.radioButtonShiftCellsDown = new System.Windows.Forms.RadioButton(); - this.radioButtonOverwrite = new System.Windows.Forms.RadioButton(); - this.groupBoxChooseColumn.SuspendLayout(); - this.groupBoxOverwriteOrInsert.SuspendLayout(); - this.SuspendLayout(); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(378, 136); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 4; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(297, 136); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 3; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // radioButtonTextOnly - // - this.radioButtonTextOnly.AutoSize = true; - this.radioButtonTextOnly.Checked = true; - this.radioButtonTextOnly.Location = new System.Drawing.Point(6, 65); - this.radioButtonTextOnly.Name = "radioButtonTextOnly"; - this.radioButtonTextOnly.Size = new System.Drawing.Size(68, 17); - this.radioButtonTextOnly.TabIndex = 5; - this.radioButtonTextOnly.TabStop = true; - this.radioButtonTextOnly.Text = "Text only"; - this.radioButtonTextOnly.UseVisualStyleBackColor = true; - // - // radioButtonTimeCodes - // - this.radioButtonTimeCodes.AutoSize = true; - this.radioButtonTimeCodes.Location = new System.Drawing.Point(6, 42); - this.radioButtonTimeCodes.Name = "radioButtonTimeCodes"; - this.radioButtonTimeCodes.Size = new System.Drawing.Size(102, 17); - this.radioButtonTimeCodes.TabIndex = 6; - this.radioButtonTimeCodes.TabStop = true; - this.radioButtonTimeCodes.Text = "Time codes only"; - this.radioButtonTimeCodes.UseVisualStyleBackColor = true; - // - // radioButtonOriginalText - // - this.radioButtonOriginalText.AutoSize = true; - this.radioButtonOriginalText.Location = new System.Drawing.Point(6, 90); - this.radioButtonOriginalText.Name = "radioButtonOriginalText"; - this.radioButtonOriginalText.Size = new System.Drawing.Size(102, 17); - this.radioButtonOriginalText.TabIndex = 7; - this.radioButtonOriginalText.TabStop = true; - this.radioButtonOriginalText.Text = "Original text only"; - this.radioButtonOriginalText.UseVisualStyleBackColor = true; - // - // radioButtonAll - // - this.radioButtonAll.AutoSize = true; - this.radioButtonAll.Location = new System.Drawing.Point(6, 19); - this.radioButtonAll.Name = "radioButtonAll"; - this.radioButtonAll.Size = new System.Drawing.Size(36, 17); - this.radioButtonAll.TabIndex = 8; - this.radioButtonAll.TabStop = true; - this.radioButtonAll.Text = "All"; - this.radioButtonAll.UseVisualStyleBackColor = true; - // - // groupBoxChooseColumn - // - this.groupBoxChooseColumn.Controls.Add(this.radioButtonAll); - this.groupBoxChooseColumn.Controls.Add(this.radioButtonTextOnly); - this.groupBoxChooseColumn.Controls.Add(this.radioButtonTimeCodes); - this.groupBoxChooseColumn.Controls.Add(this.radioButtonOriginalText); - this.groupBoxChooseColumn.Location = new System.Drawing.Point(12, 12); - this.groupBoxChooseColumn.Name = "groupBoxChooseColumn"; - this.groupBoxChooseColumn.Size = new System.Drawing.Size(237, 116); - this.groupBoxChooseColumn.TabIndex = 9; - this.groupBoxChooseColumn.TabStop = false; - this.groupBoxChooseColumn.Text = "Choose column"; - // - // groupBoxOverwriteOrInsert - // - this.groupBoxOverwriteOrInsert.Controls.Add(this.radioButtonShiftCellsDown); - this.groupBoxOverwriteOrInsert.Controls.Add(this.radioButtonOverwrite); - this.groupBoxOverwriteOrInsert.Location = new System.Drawing.Point(255, 12); - this.groupBoxOverwriteOrInsert.Name = "groupBoxOverwriteOrInsert"; - this.groupBoxOverwriteOrInsert.Size = new System.Drawing.Size(200, 116); - this.groupBoxOverwriteOrInsert.TabIndex = 10; - this.groupBoxOverwriteOrInsert.TabStop = false; - this.groupBoxOverwriteOrInsert.Text = "Overwrite/Shift cells down"; - // - // radioButtonShiftCellsDown - // - this.radioButtonShiftCellsDown.AutoSize = true; - this.radioButtonShiftCellsDown.Location = new System.Drawing.Point(6, 42); - this.radioButtonShiftCellsDown.Name = "radioButtonShiftCellsDown"; - this.radioButtonShiftCellsDown.Size = new System.Drawing.Size(99, 17); - this.radioButtonShiftCellsDown.TabIndex = 10; - this.radioButtonShiftCellsDown.TabStop = true; - this.radioButtonShiftCellsDown.Text = "Shift cells down"; - this.radioButtonShiftCellsDown.UseVisualStyleBackColor = true; - // - // radioButtonOverwrite - // - this.radioButtonOverwrite.AutoSize = true; - this.radioButtonOverwrite.Checked = true; - this.radioButtonOverwrite.Location = new System.Drawing.Point(6, 19); - this.radioButtonOverwrite.Name = "radioButtonOverwrite"; - this.radioButtonOverwrite.Size = new System.Drawing.Size(70, 17); - this.radioButtonOverwrite.TabIndex = 9; - this.radioButtonOverwrite.TabStop = true; - this.radioButtonOverwrite.Text = "Overwrite"; - this.radioButtonOverwrite.UseVisualStyleBackColor = true; - // - // ColumnPaste - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(465, 169); - this.Controls.Add(this.groupBoxOverwriteOrInsert); - this.Controls.Add(this.groupBoxChooseColumn); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "ColumnPaste"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Column paste"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.ColumnPaste_FormClosing); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.PasteSpecial_KeyDown); - this.groupBoxChooseColumn.ResumeLayout(false); - this.groupBoxChooseColumn.PerformLayout(); - this.groupBoxOverwriteOrInsert.ResumeLayout(false); - this.groupBoxOverwriteOrInsert.PerformLayout(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.RadioButton radioButtonTextOnly; - private System.Windows.Forms.RadioButton radioButtonTimeCodes; - private System.Windows.Forms.RadioButton radioButtonOriginalText; - private System.Windows.Forms.RadioButton radioButtonAll; - private System.Windows.Forms.GroupBox groupBoxChooseColumn; - private System.Windows.Forms.GroupBox groupBoxOverwriteOrInsert; - private System.Windows.Forms.RadioButton radioButtonShiftCellsDown; - private System.Windows.Forms.RadioButton radioButtonOverwrite; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class ColumnPaste + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.radioButtonTextOnly = new System.Windows.Forms.RadioButton(); + this.radioButtonTimeCodes = new System.Windows.Forms.RadioButton(); + this.radioButtonOriginalText = new System.Windows.Forms.RadioButton(); + this.radioButtonAll = new System.Windows.Forms.RadioButton(); + this.groupBoxChooseColumn = new System.Windows.Forms.GroupBox(); + this.groupBoxOverwriteOrInsert = new System.Windows.Forms.GroupBox(); + this.radioButtonShiftCellsDown = new System.Windows.Forms.RadioButton(); + this.radioButtonOverwrite = new System.Windows.Forms.RadioButton(); + this.groupBoxChooseColumn.SuspendLayout(); + this.groupBoxOverwriteOrInsert.SuspendLayout(); + this.SuspendLayout(); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(378, 136); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 4; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(297, 136); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 3; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // radioButtonTextOnly + // + this.radioButtonTextOnly.AutoSize = true; + this.radioButtonTextOnly.Checked = true; + this.radioButtonTextOnly.Location = new System.Drawing.Point(6, 65); + this.radioButtonTextOnly.Name = "radioButtonTextOnly"; + this.radioButtonTextOnly.Size = new System.Drawing.Size(68, 17); + this.radioButtonTextOnly.TabIndex = 5; + this.radioButtonTextOnly.TabStop = true; + this.radioButtonTextOnly.Text = "Text only"; + this.radioButtonTextOnly.UseVisualStyleBackColor = true; + // + // radioButtonTimeCodes + // + this.radioButtonTimeCodes.AutoSize = true; + this.radioButtonTimeCodes.Location = new System.Drawing.Point(6, 42); + this.radioButtonTimeCodes.Name = "radioButtonTimeCodes"; + this.radioButtonTimeCodes.Size = new System.Drawing.Size(102, 17); + this.radioButtonTimeCodes.TabIndex = 6; + this.radioButtonTimeCodes.TabStop = true; + this.radioButtonTimeCodes.Text = "Time codes only"; + this.radioButtonTimeCodes.UseVisualStyleBackColor = true; + // + // radioButtonOriginalText + // + this.radioButtonOriginalText.AutoSize = true; + this.radioButtonOriginalText.Location = new System.Drawing.Point(6, 90); + this.radioButtonOriginalText.Name = "radioButtonOriginalText"; + this.radioButtonOriginalText.Size = new System.Drawing.Size(102, 17); + this.radioButtonOriginalText.TabIndex = 7; + this.radioButtonOriginalText.TabStop = true; + this.radioButtonOriginalText.Text = "Original text only"; + this.radioButtonOriginalText.UseVisualStyleBackColor = true; + // + // radioButtonAll + // + this.radioButtonAll.AutoSize = true; + this.radioButtonAll.Location = new System.Drawing.Point(6, 19); + this.radioButtonAll.Name = "radioButtonAll"; + this.radioButtonAll.Size = new System.Drawing.Size(36, 17); + this.radioButtonAll.TabIndex = 8; + this.radioButtonAll.TabStop = true; + this.radioButtonAll.Text = "All"; + this.radioButtonAll.UseVisualStyleBackColor = true; + // + // groupBoxChooseColumn + // + this.groupBoxChooseColumn.Controls.Add(this.radioButtonAll); + this.groupBoxChooseColumn.Controls.Add(this.radioButtonTextOnly); + this.groupBoxChooseColumn.Controls.Add(this.radioButtonTimeCodes); + this.groupBoxChooseColumn.Controls.Add(this.radioButtonOriginalText); + this.groupBoxChooseColumn.Location = new System.Drawing.Point(12, 12); + this.groupBoxChooseColumn.Name = "groupBoxChooseColumn"; + this.groupBoxChooseColumn.Size = new System.Drawing.Size(237, 116); + this.groupBoxChooseColumn.TabIndex = 9; + this.groupBoxChooseColumn.TabStop = false; + this.groupBoxChooseColumn.Text = "Choose column"; + // + // groupBoxOverwriteOrInsert + // + this.groupBoxOverwriteOrInsert.Controls.Add(this.radioButtonShiftCellsDown); + this.groupBoxOverwriteOrInsert.Controls.Add(this.radioButtonOverwrite); + this.groupBoxOverwriteOrInsert.Location = new System.Drawing.Point(255, 12); + this.groupBoxOverwriteOrInsert.Name = "groupBoxOverwriteOrInsert"; + this.groupBoxOverwriteOrInsert.Size = new System.Drawing.Size(200, 116); + this.groupBoxOverwriteOrInsert.TabIndex = 10; + this.groupBoxOverwriteOrInsert.TabStop = false; + this.groupBoxOverwriteOrInsert.Text = "Overwrite/Shift cells down"; + // + // radioButtonShiftCellsDown + // + this.radioButtonShiftCellsDown.AutoSize = true; + this.radioButtonShiftCellsDown.Location = new System.Drawing.Point(6, 42); + this.radioButtonShiftCellsDown.Name = "radioButtonShiftCellsDown"; + this.radioButtonShiftCellsDown.Size = new System.Drawing.Size(99, 17); + this.radioButtonShiftCellsDown.TabIndex = 10; + this.radioButtonShiftCellsDown.TabStop = true; + this.radioButtonShiftCellsDown.Text = "Shift cells down"; + this.radioButtonShiftCellsDown.UseVisualStyleBackColor = true; + // + // radioButtonOverwrite + // + this.radioButtonOverwrite.AutoSize = true; + this.radioButtonOverwrite.Checked = true; + this.radioButtonOverwrite.Location = new System.Drawing.Point(6, 19); + this.radioButtonOverwrite.Name = "radioButtonOverwrite"; + this.radioButtonOverwrite.Size = new System.Drawing.Size(70, 17); + this.radioButtonOverwrite.TabIndex = 9; + this.radioButtonOverwrite.TabStop = true; + this.radioButtonOverwrite.Text = "Overwrite"; + this.radioButtonOverwrite.UseVisualStyleBackColor = true; + // + // ColumnPaste + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(465, 169); + this.Controls.Add(this.groupBoxOverwriteOrInsert); + this.Controls.Add(this.groupBoxChooseColumn); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "ColumnPaste"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Column paste"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.ColumnPaste_FormClosing); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.PasteSpecial_KeyDown); + this.groupBoxChooseColumn.ResumeLayout(false); + this.groupBoxChooseColumn.PerformLayout(); + this.groupBoxOverwriteOrInsert.ResumeLayout(false); + this.groupBoxOverwriteOrInsert.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.RadioButton radioButtonTextOnly; + private System.Windows.Forms.RadioButton radioButtonTimeCodes; + private System.Windows.Forms.RadioButton radioButtonOriginalText; + private System.Windows.Forms.RadioButton radioButtonAll; + private System.Windows.Forms.GroupBox groupBoxChooseColumn; + private System.Windows.Forms.GroupBox groupBoxOverwriteOrInsert; + private System.Windows.Forms.RadioButton radioButtonShiftCellsDown; + private System.Windows.Forms.RadioButton radioButtonOverwrite; + } } \ No newline at end of file diff --git a/src/Forms/ColumnPaste.cs b/src/ui/Forms/ColumnPaste.cs similarity index 97% rename from src/Forms/ColumnPaste.cs rename to src/ui/Forms/ColumnPaste.cs index 7b3ceed03..b46ad32d4 100644 --- a/src/Forms/ColumnPaste.cs +++ b/src/ui/Forms/ColumnPaste.cs @@ -1,120 +1,120 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class ColumnPaste : Form - { - public bool PasteAll { get; set; } - public bool PasteTimeCodesOnly { get; set; } - public bool PasteTextOnly { get; set; } - public bool PasteOriginalTextOnly { get; set; } - - public bool PasteOverwrite { get; set; } - - public ColumnPaste(bool isOriginalAvailable, bool onlyText) - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - UiUtil.FixLargeFonts(this, buttonOK); - - radioButtonAll.Enabled = !onlyText; - radioButtonTimeCodes.Enabled = !onlyText; - radioButtonOriginalText.Visible = isOriginalAvailable; - - Text = Configuration.Settings.Language.ColumnPaste.Title; - groupBoxChooseColumn.Text = Configuration.Settings.Language.ColumnPaste.ChooseColumn; - groupBoxOverwriteOrInsert.Text = Configuration.Settings.Language.ColumnPaste.OverwriteShiftCellsDown; - radioButtonOverwrite.Text = Configuration.Settings.Language.ColumnPaste.Overwrite; - radioButtonShiftCellsDown.Text = Configuration.Settings.Language.ColumnPaste.ShiftCellsDown; - radioButtonAll.Text = Configuration.Settings.Language.General.All; - radioButtonTimeCodes.Text = Configuration.Settings.Language.ColumnPaste.TimeCodesOnly; - radioButtonTextOnly.Text = Configuration.Settings.Language.ColumnPaste.TextOnly; - radioButtonOriginalText.Text = Configuration.Settings.Language.ColumnPaste.OriginalTextOnly; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - - if (Configuration.Settings.Tools.ColumnPasteColumn == "timecodes") - { - radioButtonTimeCodes.Checked = true; - } - else if (Configuration.Settings.Tools.ColumnPasteColumn == "text") - { - radioButtonTextOnly.Checked = true; - } - else if (isOriginalAvailable && Configuration.Settings.Tools.ColumnPasteColumn == "originaltext") - { - radioButtonOriginalText.Checked = true; - } - else - { - radioButtonAll.Checked = true; - } - - if (onlyText) - { - radioButtonTextOnly.Checked = true; - } - - - if (Configuration.Settings.Tools.ColumnPasteOverwriteMode == "shiftdown") - { - radioButtonShiftCellsDown.Checked = true; - } - else - { - radioButtonOverwrite.Checked = true; - } - } - - private void PasteSpecial_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - private void buttonOK_Click(object sender, EventArgs e) - { - PasteAll = radioButtonAll.Checked; - PasteTimeCodesOnly = radioButtonTimeCodes.Checked; - PasteTextOnly = radioButtonTextOnly.Checked; - PasteOriginalTextOnly = radioButtonOriginalText.Checked; - PasteOverwrite = radioButtonOverwrite.Checked; - - DialogResult = DialogResult.OK; - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private void ColumnPaste_FormClosing(object sender, FormClosingEventArgs e) - { - if (radioButtonTimeCodes.Checked) - { - Configuration.Settings.Tools.ColumnPasteColumn = "timecodes"; - } - else if (radioButtonTextOnly.Checked) - { - Configuration.Settings.Tools.ColumnPasteColumn = "text"; - } - else if (radioButtonOriginalText.Checked) - { - Configuration.Settings.Tools.ColumnPasteColumn = "originaltext"; - } - else - { - Configuration.Settings.Tools.ColumnPasteColumn = "all"; - } - - Configuration.Settings.Tools.ColumnPasteOverwriteMode = radioButtonOverwrite.Checked ? "overwrite" : "shiftdown"; - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class ColumnPaste : Form + { + public bool PasteAll { get; set; } + public bool PasteTimeCodesOnly { get; set; } + public bool PasteTextOnly { get; set; } + public bool PasteOriginalTextOnly { get; set; } + + public bool PasteOverwrite { get; set; } + + public ColumnPaste(bool isOriginalAvailable, bool onlyText) + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + UiUtil.FixLargeFonts(this, buttonOK); + + radioButtonAll.Enabled = !onlyText; + radioButtonTimeCodes.Enabled = !onlyText; + radioButtonOriginalText.Visible = isOriginalAvailable; + + Text = Configuration.Settings.Language.ColumnPaste.Title; + groupBoxChooseColumn.Text = Configuration.Settings.Language.ColumnPaste.ChooseColumn; + groupBoxOverwriteOrInsert.Text = Configuration.Settings.Language.ColumnPaste.OverwriteShiftCellsDown; + radioButtonOverwrite.Text = Configuration.Settings.Language.ColumnPaste.Overwrite; + radioButtonShiftCellsDown.Text = Configuration.Settings.Language.ColumnPaste.ShiftCellsDown; + radioButtonAll.Text = Configuration.Settings.Language.General.All; + radioButtonTimeCodes.Text = Configuration.Settings.Language.ColumnPaste.TimeCodesOnly; + radioButtonTextOnly.Text = Configuration.Settings.Language.ColumnPaste.TextOnly; + radioButtonOriginalText.Text = Configuration.Settings.Language.ColumnPaste.OriginalTextOnly; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + + if (Configuration.Settings.Tools.ColumnPasteColumn == "timecodes") + { + radioButtonTimeCodes.Checked = true; + } + else if (Configuration.Settings.Tools.ColumnPasteColumn == "text") + { + radioButtonTextOnly.Checked = true; + } + else if (isOriginalAvailable && Configuration.Settings.Tools.ColumnPasteColumn == "originaltext") + { + radioButtonOriginalText.Checked = true; + } + else + { + radioButtonAll.Checked = true; + } + + if (onlyText) + { + radioButtonTextOnly.Checked = true; + } + + + if (Configuration.Settings.Tools.ColumnPasteOverwriteMode == "shiftdown") + { + radioButtonShiftCellsDown.Checked = true; + } + else + { + radioButtonOverwrite.Checked = true; + } + } + + private void PasteSpecial_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + private void buttonOK_Click(object sender, EventArgs e) + { + PasteAll = radioButtonAll.Checked; + PasteTimeCodesOnly = radioButtonTimeCodes.Checked; + PasteTextOnly = radioButtonTextOnly.Checked; + PasteOriginalTextOnly = radioButtonOriginalText.Checked; + PasteOverwrite = radioButtonOverwrite.Checked; + + DialogResult = DialogResult.OK; + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void ColumnPaste_FormClosing(object sender, FormClosingEventArgs e) + { + if (radioButtonTimeCodes.Checked) + { + Configuration.Settings.Tools.ColumnPasteColumn = "timecodes"; + } + else if (radioButtonTextOnly.Checked) + { + Configuration.Settings.Tools.ColumnPasteColumn = "text"; + } + else if (radioButtonOriginalText.Checked) + { + Configuration.Settings.Tools.ColumnPasteColumn = "originaltext"; + } + else + { + Configuration.Settings.Tools.ColumnPasteColumn = "all"; + } + + Configuration.Settings.Tools.ColumnPasteOverwriteMode = radioButtonOverwrite.Checked ? "overwrite" : "shiftdown"; + } + } +} diff --git a/src/Forms/ExportPngXmlPreview.resx b/src/ui/Forms/ColumnPaste.resx similarity index 100% rename from src/Forms/ExportPngXmlPreview.resx rename to src/ui/Forms/ColumnPaste.resx diff --git a/src/Forms/Compare.Designer.cs b/src/ui/Forms/Compare.Designer.cs similarity index 98% rename from src/Forms/Compare.Designer.cs rename to src/ui/Forms/Compare.Designer.cs index 58d5e0f60..c9922214b 100644 --- a/src/Forms/Compare.Designer.cs +++ b/src/ui/Forms/Compare.Designer.cs @@ -1,392 +1,392 @@ -using Nikse.SubtitleEdit.Controls; - -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class Compare - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.buttonOK = new System.Windows.Forms.Button(); - this.labelSubtitle2 = new System.Windows.Forms.Label(); - this.labelSubtitle1 = new System.Windows.Forms.Label(); - this.buttonOpenSubtitle1 = new System.Windows.Forms.Button(); - this.buttonOpenSubtitle2 = new System.Windows.Forms.Button(); - this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); - this.buttonNextDifference = new System.Windows.Forms.Button(); - this.buttonPreviousDifference = new System.Windows.Forms.Button(); - this.labelStatus = new System.Windows.Forms.Label(); - this.timer1 = new System.Windows.Forms.Timer(this.components); - this.richTextBox1 = new System.Windows.Forms.RichTextBox(); - this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); - this.copyTextToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.richTextBox2 = new System.Windows.Forms.RichTextBox(); - this.contextMenuStrip2 = new System.Windows.Forms.ContextMenuStrip(this.components); - this.copyTextToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.checkBoxShowOnlyDifferences = new System.Windows.Forms.CheckBox(); - this.checkBoxOnlyListDifferencesInText = new System.Windows.Forms.CheckBox(); - this.checkBoxIgnoreLineBreaks = new System.Windows.Forms.CheckBox(); - this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); - this.subtitleListView2 = new Nikse.SubtitleEdit.Controls.SubtitleListView(); - this.subtitleListView1 = new Nikse.SubtitleEdit.Controls.SubtitleListView(); - this.checkBoxIgnoreFormatting = new System.Windows.Forms.CheckBox(); - this.buttonExport = new System.Windows.Forms.Button(); - this.contextMenuStrip1.SuspendLayout(); - this.contextMenuStrip2.SuspendLayout(); - this.SuspendLayout(); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.Location = new System.Drawing.Point(884, 561); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(84, 23); - this.buttonOK.TabIndex = 22; - this.buttonOK.Text = "&Close"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); - // - // labelSubtitle2 - // - this.labelSubtitle2.AutoSize = true; - this.labelSubtitle2.Location = new System.Drawing.Point(491, 36); - this.labelSubtitle2.Name = "labelSubtitle2"; - this.labelSubtitle2.Size = new System.Drawing.Size(30, 13); - this.labelSubtitle2.TabIndex = 3; - this.labelSubtitle2.Text = "sub2"; - this.labelSubtitle2.MouseHover += new System.EventHandler(this.labelSubtitle2_MouseHover); - // - // labelSubtitle1 - // - this.labelSubtitle1.AutoSize = true; - this.labelSubtitle1.Location = new System.Drawing.Point(9, 36); - this.labelSubtitle1.Name = "labelSubtitle1"; - this.labelSubtitle1.Size = new System.Drawing.Size(30, 13); - this.labelSubtitle1.TabIndex = 2; - this.labelSubtitle1.Text = "sub1"; - this.labelSubtitle1.MouseHover += new System.EventHandler(this.labelSubtitle1_MouseHover); - // - // buttonOpenSubtitle1 - // - this.buttonOpenSubtitle1.Location = new System.Drawing.Point(9, 8); - this.buttonOpenSubtitle1.Name = "buttonOpenSubtitle1"; - this.buttonOpenSubtitle1.Size = new System.Drawing.Size(28, 23); - this.buttonOpenSubtitle1.TabIndex = 0; - this.buttonOpenSubtitle1.Text = "..."; - this.buttonOpenSubtitle1.UseVisualStyleBackColor = true; - this.buttonOpenSubtitle1.Click += new System.EventHandler(this.ButtonOpenSubtitle1Click); - // - // buttonOpenSubtitle2 - // - this.buttonOpenSubtitle2.Location = new System.Drawing.Point(491, 8); - this.buttonOpenSubtitle2.Name = "buttonOpenSubtitle2"; - this.buttonOpenSubtitle2.Size = new System.Drawing.Size(28, 23); - this.buttonOpenSubtitle2.TabIndex = 1; - this.buttonOpenSubtitle2.Text = "..."; - this.buttonOpenSubtitle2.UseVisualStyleBackColor = true; - this.buttonOpenSubtitle2.Click += new System.EventHandler(this.ButtonOpenSubtitle2Click); - // - // openFileDialog1 - // - this.openFileDialog1.FileName = "openFileDialog1"; - // - // buttonNextDifference - // - this.buttonNextDifference.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonNextDifference.Enabled = false; - this.buttonNextDifference.Location = new System.Drawing.Point(168, 549); - this.buttonNextDifference.Name = "buttonNextDifference"; - this.buttonNextDifference.Size = new System.Drawing.Size(156, 23); - this.buttonNextDifference.TabIndex = 9; - this.buttonNextDifference.Text = "&Next difference"; - this.buttonNextDifference.UseVisualStyleBackColor = true; - this.buttonNextDifference.Click += new System.EventHandler(this.ButtonNextDifferenceClick); - // - // buttonPreviousDifference - // - this.buttonPreviousDifference.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonPreviousDifference.Enabled = false; - this.buttonPreviousDifference.Location = new System.Drawing.Point(6, 549); - this.buttonPreviousDifference.Name = "buttonPreviousDifference"; - this.buttonPreviousDifference.Size = new System.Drawing.Size(156, 23); - this.buttonPreviousDifference.TabIndex = 8; - this.buttonPreviousDifference.Text = "&Previous difference"; - this.buttonPreviousDifference.UseVisualStyleBackColor = true; - this.buttonPreviousDifference.Click += new System.EventHandler(this.ButtonPreviousDifferenceClick); - // - // labelStatus - // - this.labelStatus.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelStatus.AutoSize = true; - this.labelStatus.Location = new System.Drawing.Point(4, 574); - this.labelStatus.Name = "labelStatus"; - this.labelStatus.Size = new System.Drawing.Size(37, 13); - this.labelStatus.TabIndex = 17; - this.labelStatus.Text = "status"; - // - // timer1 - // - this.timer1.Tick += new System.EventHandler(this.Timer1Tick); - // - // richTextBox1 - // - this.richTextBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.richTextBox1.BackColor = System.Drawing.SystemColors.Control; - this.richTextBox1.ContextMenuStrip = this.contextMenuStrip1; - this.richTextBox1.Location = new System.Drawing.Point(8, 486); - this.richTextBox1.Name = "richTextBox1"; - this.richTextBox1.ReadOnly = true; - this.richTextBox1.Size = new System.Drawing.Size(476, 43); - this.richTextBox1.TabIndex = 6; - this.richTextBox1.Text = ""; - // - // contextMenuStrip1 - // - this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.copyTextToolStripMenuItem}); - this.contextMenuStrip1.Name = "contextMenuStrip1"; - this.contextMenuStrip1.Size = new System.Drawing.Size(168, 26); - // - // copyTextToolStripMenuItem - // - this.copyTextToolStripMenuItem.Name = "copyTextToolStripMenuItem"; - this.copyTextToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.X))); - this.copyTextToolStripMenuItem.Size = new System.Drawing.Size(167, 22); - this.copyTextToolStripMenuItem.Text = "Copy Text"; - this.copyTextToolStripMenuItem.Click += new System.EventHandler(this.copyTextToolStripMenuItem_Click); - // - // richTextBox2 - // - this.richTextBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.richTextBox2.BackColor = System.Drawing.SystemColors.Control; - this.richTextBox2.ContextMenuStrip = this.contextMenuStrip2; - this.richTextBox2.Location = new System.Drawing.Point(490, 485); - this.richTextBox2.Name = "richTextBox2"; - this.richTextBox2.ReadOnly = true; - this.richTextBox2.Size = new System.Drawing.Size(478, 43); - this.richTextBox2.TabIndex = 7; - this.richTextBox2.Text = ""; - // - // contextMenuStrip2 - // - this.contextMenuStrip2.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.copyTextToolStripMenuItem1}); - this.contextMenuStrip2.Name = "contextMenuStrip2"; - this.contextMenuStrip2.Size = new System.Drawing.Size(168, 26); - // - // copyTextToolStripMenuItem1 - // - this.copyTextToolStripMenuItem1.Name = "copyTextToolStripMenuItem1"; - this.copyTextToolStripMenuItem1.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.X))); - this.copyTextToolStripMenuItem1.Size = new System.Drawing.Size(167, 22); - this.copyTextToolStripMenuItem1.Text = "Copy Text"; - this.copyTextToolStripMenuItem1.Click += new System.EventHandler(this.copyTextToolStripMenuItem1_Click); - // - // checkBoxShowOnlyDifferences - // - this.checkBoxShowOnlyDifferences.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.checkBoxShowOnlyDifferences.AutoSize = true; - this.checkBoxShowOnlyDifferences.Location = new System.Drawing.Point(330, 534); - this.checkBoxShowOnlyDifferences.Name = "checkBoxShowOnlyDifferences"; - this.checkBoxShowOnlyDifferences.Size = new System.Drawing.Size(132, 17); - this.checkBoxShowOnlyDifferences.TabIndex = 10; - this.checkBoxShowOnlyDifferences.Text = "Show only differences"; - this.checkBoxShowOnlyDifferences.UseVisualStyleBackColor = true; - this.checkBoxShowOnlyDifferences.CheckedChanged += new System.EventHandler(this.checkBoxShowOnlyDifferences_CheckedChanged); - // - // checkBoxOnlyListDifferencesInText - // - this.checkBoxOnlyListDifferencesInText.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.checkBoxOnlyListDifferencesInText.AutoSize = true; - this.checkBoxOnlyListDifferencesInText.Checked = true; - this.checkBoxOnlyListDifferencesInText.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxOnlyListDifferencesInText.Location = new System.Drawing.Point(330, 552); - this.checkBoxOnlyListDifferencesInText.Name = "checkBoxOnlyListDifferencesInText"; - this.checkBoxOnlyListDifferencesInText.Size = new System.Drawing.Size(197, 17); - this.checkBoxOnlyListDifferencesInText.TabIndex = 11; - this.checkBoxOnlyListDifferencesInText.Text = "Only look for differences in the text"; - this.checkBoxOnlyListDifferencesInText.UseVisualStyleBackColor = true; - this.checkBoxOnlyListDifferencesInText.CheckedChanged += new System.EventHandler(this.checkBoxOnlyListDifferencesInText_CheckedChanged); - // - // checkBoxIgnoreLineBreaks - // - this.checkBoxIgnoreLineBreaks.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.checkBoxIgnoreLineBreaks.AutoSize = true; - this.checkBoxIgnoreLineBreaks.Location = new System.Drawing.Point(582, 534); - this.checkBoxIgnoreLineBreaks.Name = "checkBoxIgnoreLineBreaks"; - this.checkBoxIgnoreLineBreaks.Size = new System.Drawing.Size(112, 17); - this.checkBoxIgnoreLineBreaks.TabIndex = 12; - this.checkBoxIgnoreLineBreaks.Text = "Ignore line breaks"; - this.checkBoxIgnoreLineBreaks.UseVisualStyleBackColor = true; - this.checkBoxIgnoreLineBreaks.CheckedChanged += new System.EventHandler(this.checkBoxIgnoreLineBreaks_CheckedChanged); - // - // toolTip1 - // - this.toolTip1.ToolTipIcon = System.Windows.Forms.ToolTipIcon.Info; - this.toolTip1.ToolTipTitle = "Subtitle name"; - // - // subtitleListView2 - // - this.subtitleListView2.AllowColumnReorder = true; - this.subtitleListView2.AllowDrop = true; - this.subtitleListView2.FirstVisibleIndex = -1; - this.subtitleListView2.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.subtitleListView2.FullRowSelect = true; - this.subtitleListView2.GridLines = true; - this.subtitleListView2.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; - this.subtitleListView2.HideSelection = false; - this.subtitleListView2.Location = new System.Drawing.Point(490, 56); - this.subtitleListView2.Name = "subtitleListView2"; - this.subtitleListView2.OwnerDraw = true; - this.subtitleListView2.Size = new System.Drawing.Size(478, 422); - this.subtitleListView2.SubtitleFontBold = false; - this.subtitleListView2.SubtitleFontName = "Tahoma"; - this.subtitleListView2.SubtitleFontSize = 8; - this.subtitleListView2.TabIndex = 5; - this.subtitleListView2.UseCompatibleStateImageBehavior = false; - this.subtitleListView2.UseSyntaxColoring = true; - this.subtitleListView2.View = System.Windows.Forms.View.Details; - this.subtitleListView2.SelectedIndexChanged += new System.EventHandler(this.SubtitleListView2SelectedIndexChanged); - this.subtitleListView2.DragDrop += new System.Windows.Forms.DragEventHandler(this.subtitleListView2_DragDrop); - this.subtitleListView2.DragEnter += new System.Windows.Forms.DragEventHandler(this.subtitleListView2_DragEnter); - // - // subtitleListView1 - // - this.subtitleListView1.AllowColumnReorder = true; - this.subtitleListView1.AllowDrop = true; - this.subtitleListView1.FirstVisibleIndex = -1; - this.subtitleListView1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.subtitleListView1.FullRowSelect = true; - this.subtitleListView1.GridLines = true; - this.subtitleListView1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; - this.subtitleListView1.HideSelection = false; - this.subtitleListView1.Location = new System.Drawing.Point(8, 56); - this.subtitleListView1.Name = "subtitleListView1"; - this.subtitleListView1.OwnerDraw = true; - this.subtitleListView1.Size = new System.Drawing.Size(476, 422); - this.subtitleListView1.SubtitleFontBold = false; - this.subtitleListView1.SubtitleFontName = "Tahoma"; - this.subtitleListView1.SubtitleFontSize = 8; - this.subtitleListView1.TabIndex = 4; - this.subtitleListView1.UseCompatibleStateImageBehavior = false; - this.subtitleListView1.UseSyntaxColoring = true; - this.subtitleListView1.View = System.Windows.Forms.View.Details; - this.subtitleListView1.SelectedIndexChanged += new System.EventHandler(this.SubtitleListView1SelectedIndexChanged); - this.subtitleListView1.DragDrop += new System.Windows.Forms.DragEventHandler(this.subtitleListView1_DragDrop); - this.subtitleListView1.DragEnter += new System.Windows.Forms.DragEventHandler(this.subtitleListView1_DragEnter); - // - // checkBoxIgnoreFormatting - // - this.checkBoxIgnoreFormatting.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.checkBoxIgnoreFormatting.AutoSize = true; - this.checkBoxIgnoreFormatting.Location = new System.Drawing.Point(582, 552); - this.checkBoxIgnoreFormatting.Name = "checkBoxIgnoreFormatting"; - this.checkBoxIgnoreFormatting.Size = new System.Drawing.Size(111, 17); - this.checkBoxIgnoreFormatting.TabIndex = 14; - this.checkBoxIgnoreFormatting.Text = "Ignore formatting"; - this.checkBoxIgnoreFormatting.UseVisualStyleBackColor = true; - this.checkBoxIgnoreFormatting.CheckedChanged += new System.EventHandler(this.checkBoxIgnoreFormatting_CheckedChanged); - // - // buttonExport - // - this.buttonExport.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonExport.Location = new System.Drawing.Point(774, 561); - this.buttonExport.Name = "buttonExport"; - this.buttonExport.Size = new System.Drawing.Size(104, 23); - this.buttonExport.TabIndex = 20; - this.buttonExport.Text = "Export"; - this.buttonExport.UseVisualStyleBackColor = true; - this.buttonExport.Click += new System.EventHandler(this.buttonExport_Click); - // - // Compare - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(974, 591); - this.Controls.Add(this.buttonExport); - this.Controls.Add(this.checkBoxIgnoreFormatting); - this.Controls.Add(this.checkBoxIgnoreLineBreaks); - this.Controls.Add(this.checkBoxOnlyListDifferencesInText); - this.Controls.Add(this.checkBoxShowOnlyDifferences); - this.Controls.Add(this.richTextBox2); - this.Controls.Add(this.richTextBox1); - this.Controls.Add(this.labelStatus); - this.Controls.Add(this.buttonPreviousDifference); - this.Controls.Add(this.buttonNextDifference); - this.Controls.Add(this.buttonOpenSubtitle2); - this.Controls.Add(this.buttonOpenSubtitle1); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.subtitleListView2); - this.Controls.Add(this.labelSubtitle2); - this.Controls.Add(this.subtitleListView1); - this.Controls.Add(this.labelSubtitle1); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.KeyPreview = true; - this.MinimumSize = new System.Drawing.Size(800, 400); - this.Name = "Compare"; - this.ShowIcon = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Compare subtitles"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Compare_FormClosing); - this.Shown += new System.EventHandler(this.Compare_Shown); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Compare_KeyDown); - this.Resize += new System.EventHandler(this.Compare_Resize); - this.contextMenuStrip1.ResumeLayout(false); - this.contextMenuStrip2.ResumeLayout(false); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Label labelSubtitle2; - private SubtitleListView subtitleListView2; - private SubtitleListView subtitleListView1; - private System.Windows.Forms.Label labelSubtitle1; - private System.Windows.Forms.Button buttonOpenSubtitle1; - private System.Windows.Forms.Button buttonOpenSubtitle2; - private System.Windows.Forms.OpenFileDialog openFileDialog1; - private System.Windows.Forms.Button buttonNextDifference; - private System.Windows.Forms.Button buttonPreviousDifference; - private System.Windows.Forms.Label labelStatus; - private System.Windows.Forms.Timer timer1; - private System.Windows.Forms.RichTextBox richTextBox1; - private System.Windows.Forms.RichTextBox richTextBox2; - private System.Windows.Forms.CheckBox checkBoxShowOnlyDifferences; - private System.Windows.Forms.CheckBox checkBoxOnlyListDifferencesInText; - private System.Windows.Forms.CheckBox checkBoxIgnoreLineBreaks; - private System.Windows.Forms.ToolTip toolTip1; - private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; - private System.Windows.Forms.ToolStripMenuItem copyTextToolStripMenuItem; - private System.Windows.Forms.ContextMenuStrip contextMenuStrip2; - private System.Windows.Forms.ToolStripMenuItem copyTextToolStripMenuItem1; - private System.Windows.Forms.CheckBox checkBoxIgnoreFormatting; - private System.Windows.Forms.Button buttonExport; - } +using Nikse.SubtitleEdit.Controls; + +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class Compare + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.buttonOK = new System.Windows.Forms.Button(); + this.labelSubtitle2 = new System.Windows.Forms.Label(); + this.labelSubtitle1 = new System.Windows.Forms.Label(); + this.buttonOpenSubtitle1 = new System.Windows.Forms.Button(); + this.buttonOpenSubtitle2 = new System.Windows.Forms.Button(); + this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); + this.buttonNextDifference = new System.Windows.Forms.Button(); + this.buttonPreviousDifference = new System.Windows.Forms.Button(); + this.labelStatus = new System.Windows.Forms.Label(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.richTextBox1 = new System.Windows.Forms.RichTextBox(); + this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); + this.copyTextToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.richTextBox2 = new System.Windows.Forms.RichTextBox(); + this.contextMenuStrip2 = new System.Windows.Forms.ContextMenuStrip(this.components); + this.copyTextToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.checkBoxShowOnlyDifferences = new System.Windows.Forms.CheckBox(); + this.checkBoxOnlyListDifferencesInText = new System.Windows.Forms.CheckBox(); + this.checkBoxIgnoreLineBreaks = new System.Windows.Forms.CheckBox(); + this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); + this.subtitleListView2 = new Nikse.SubtitleEdit.Controls.SubtitleListView(); + this.subtitleListView1 = new Nikse.SubtitleEdit.Controls.SubtitleListView(); + this.checkBoxIgnoreFormatting = new System.Windows.Forms.CheckBox(); + this.buttonExport = new System.Windows.Forms.Button(); + this.contextMenuStrip1.SuspendLayout(); + this.contextMenuStrip2.SuspendLayout(); + this.SuspendLayout(); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.Location = new System.Drawing.Point(884, 561); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(84, 23); + this.buttonOK.TabIndex = 22; + this.buttonOK.Text = "&Close"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); + // + // labelSubtitle2 + // + this.labelSubtitle2.AutoSize = true; + this.labelSubtitle2.Location = new System.Drawing.Point(491, 36); + this.labelSubtitle2.Name = "labelSubtitle2"; + this.labelSubtitle2.Size = new System.Drawing.Size(30, 13); + this.labelSubtitle2.TabIndex = 3; + this.labelSubtitle2.Text = "sub2"; + this.labelSubtitle2.MouseHover += new System.EventHandler(this.labelSubtitle2_MouseHover); + // + // labelSubtitle1 + // + this.labelSubtitle1.AutoSize = true; + this.labelSubtitle1.Location = new System.Drawing.Point(9, 36); + this.labelSubtitle1.Name = "labelSubtitle1"; + this.labelSubtitle1.Size = new System.Drawing.Size(30, 13); + this.labelSubtitle1.TabIndex = 2; + this.labelSubtitle1.Text = "sub1"; + this.labelSubtitle1.MouseHover += new System.EventHandler(this.labelSubtitle1_MouseHover); + // + // buttonOpenSubtitle1 + // + this.buttonOpenSubtitle1.Location = new System.Drawing.Point(9, 8); + this.buttonOpenSubtitle1.Name = "buttonOpenSubtitle1"; + this.buttonOpenSubtitle1.Size = new System.Drawing.Size(28, 23); + this.buttonOpenSubtitle1.TabIndex = 0; + this.buttonOpenSubtitle1.Text = "..."; + this.buttonOpenSubtitle1.UseVisualStyleBackColor = true; + this.buttonOpenSubtitle1.Click += new System.EventHandler(this.ButtonOpenSubtitle1Click); + // + // buttonOpenSubtitle2 + // + this.buttonOpenSubtitle2.Location = new System.Drawing.Point(491, 8); + this.buttonOpenSubtitle2.Name = "buttonOpenSubtitle2"; + this.buttonOpenSubtitle2.Size = new System.Drawing.Size(28, 23); + this.buttonOpenSubtitle2.TabIndex = 1; + this.buttonOpenSubtitle2.Text = "..."; + this.buttonOpenSubtitle2.UseVisualStyleBackColor = true; + this.buttonOpenSubtitle2.Click += new System.EventHandler(this.ButtonOpenSubtitle2Click); + // + // openFileDialog1 + // + this.openFileDialog1.FileName = "openFileDialog1"; + // + // buttonNextDifference + // + this.buttonNextDifference.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonNextDifference.Enabled = false; + this.buttonNextDifference.Location = new System.Drawing.Point(168, 549); + this.buttonNextDifference.Name = "buttonNextDifference"; + this.buttonNextDifference.Size = new System.Drawing.Size(156, 23); + this.buttonNextDifference.TabIndex = 9; + this.buttonNextDifference.Text = "&Next difference"; + this.buttonNextDifference.UseVisualStyleBackColor = true; + this.buttonNextDifference.Click += new System.EventHandler(this.ButtonNextDifferenceClick); + // + // buttonPreviousDifference + // + this.buttonPreviousDifference.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonPreviousDifference.Enabled = false; + this.buttonPreviousDifference.Location = new System.Drawing.Point(6, 549); + this.buttonPreviousDifference.Name = "buttonPreviousDifference"; + this.buttonPreviousDifference.Size = new System.Drawing.Size(156, 23); + this.buttonPreviousDifference.TabIndex = 8; + this.buttonPreviousDifference.Text = "&Previous difference"; + this.buttonPreviousDifference.UseVisualStyleBackColor = true; + this.buttonPreviousDifference.Click += new System.EventHandler(this.ButtonPreviousDifferenceClick); + // + // labelStatus + // + this.labelStatus.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelStatus.AutoSize = true; + this.labelStatus.Location = new System.Drawing.Point(4, 574); + this.labelStatus.Name = "labelStatus"; + this.labelStatus.Size = new System.Drawing.Size(37, 13); + this.labelStatus.TabIndex = 17; + this.labelStatus.Text = "status"; + // + // timer1 + // + this.timer1.Tick += new System.EventHandler(this.Timer1Tick); + // + // richTextBox1 + // + this.richTextBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.richTextBox1.BackColor = System.Drawing.SystemColors.Control; + this.richTextBox1.ContextMenuStrip = this.contextMenuStrip1; + this.richTextBox1.Location = new System.Drawing.Point(8, 486); + this.richTextBox1.Name = "richTextBox1"; + this.richTextBox1.ReadOnly = true; + this.richTextBox1.Size = new System.Drawing.Size(476, 43); + this.richTextBox1.TabIndex = 6; + this.richTextBox1.Text = ""; + // + // contextMenuStrip1 + // + this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.copyTextToolStripMenuItem}); + this.contextMenuStrip1.Name = "contextMenuStrip1"; + this.contextMenuStrip1.Size = new System.Drawing.Size(168, 26); + // + // copyTextToolStripMenuItem + // + this.copyTextToolStripMenuItem.Name = "copyTextToolStripMenuItem"; + this.copyTextToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.X))); + this.copyTextToolStripMenuItem.Size = new System.Drawing.Size(167, 22); + this.copyTextToolStripMenuItem.Text = "Copy Text"; + this.copyTextToolStripMenuItem.Click += new System.EventHandler(this.copyTextToolStripMenuItem_Click); + // + // richTextBox2 + // + this.richTextBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.richTextBox2.BackColor = System.Drawing.SystemColors.Control; + this.richTextBox2.ContextMenuStrip = this.contextMenuStrip2; + this.richTextBox2.Location = new System.Drawing.Point(490, 485); + this.richTextBox2.Name = "richTextBox2"; + this.richTextBox2.ReadOnly = true; + this.richTextBox2.Size = new System.Drawing.Size(478, 43); + this.richTextBox2.TabIndex = 7; + this.richTextBox2.Text = ""; + // + // contextMenuStrip2 + // + this.contextMenuStrip2.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.copyTextToolStripMenuItem1}); + this.contextMenuStrip2.Name = "contextMenuStrip2"; + this.contextMenuStrip2.Size = new System.Drawing.Size(168, 26); + // + // copyTextToolStripMenuItem1 + // + this.copyTextToolStripMenuItem1.Name = "copyTextToolStripMenuItem1"; + this.copyTextToolStripMenuItem1.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.X))); + this.copyTextToolStripMenuItem1.Size = new System.Drawing.Size(167, 22); + this.copyTextToolStripMenuItem1.Text = "Copy Text"; + this.copyTextToolStripMenuItem1.Click += new System.EventHandler(this.copyTextToolStripMenuItem1_Click); + // + // checkBoxShowOnlyDifferences + // + this.checkBoxShowOnlyDifferences.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.checkBoxShowOnlyDifferences.AutoSize = true; + this.checkBoxShowOnlyDifferences.Location = new System.Drawing.Point(330, 534); + this.checkBoxShowOnlyDifferences.Name = "checkBoxShowOnlyDifferences"; + this.checkBoxShowOnlyDifferences.Size = new System.Drawing.Size(132, 17); + this.checkBoxShowOnlyDifferences.TabIndex = 10; + this.checkBoxShowOnlyDifferences.Text = "Show only differences"; + this.checkBoxShowOnlyDifferences.UseVisualStyleBackColor = true; + this.checkBoxShowOnlyDifferences.CheckedChanged += new System.EventHandler(this.checkBoxShowOnlyDifferences_CheckedChanged); + // + // checkBoxOnlyListDifferencesInText + // + this.checkBoxOnlyListDifferencesInText.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.checkBoxOnlyListDifferencesInText.AutoSize = true; + this.checkBoxOnlyListDifferencesInText.Checked = true; + this.checkBoxOnlyListDifferencesInText.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxOnlyListDifferencesInText.Location = new System.Drawing.Point(330, 552); + this.checkBoxOnlyListDifferencesInText.Name = "checkBoxOnlyListDifferencesInText"; + this.checkBoxOnlyListDifferencesInText.Size = new System.Drawing.Size(197, 17); + this.checkBoxOnlyListDifferencesInText.TabIndex = 11; + this.checkBoxOnlyListDifferencesInText.Text = "Only look for differences in the text"; + this.checkBoxOnlyListDifferencesInText.UseVisualStyleBackColor = true; + this.checkBoxOnlyListDifferencesInText.CheckedChanged += new System.EventHandler(this.checkBoxOnlyListDifferencesInText_CheckedChanged); + // + // checkBoxIgnoreLineBreaks + // + this.checkBoxIgnoreLineBreaks.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.checkBoxIgnoreLineBreaks.AutoSize = true; + this.checkBoxIgnoreLineBreaks.Location = new System.Drawing.Point(582, 534); + this.checkBoxIgnoreLineBreaks.Name = "checkBoxIgnoreLineBreaks"; + this.checkBoxIgnoreLineBreaks.Size = new System.Drawing.Size(112, 17); + this.checkBoxIgnoreLineBreaks.TabIndex = 12; + this.checkBoxIgnoreLineBreaks.Text = "Ignore line breaks"; + this.checkBoxIgnoreLineBreaks.UseVisualStyleBackColor = true; + this.checkBoxIgnoreLineBreaks.CheckedChanged += new System.EventHandler(this.checkBoxIgnoreLineBreaks_CheckedChanged); + // + // toolTip1 + // + this.toolTip1.ToolTipIcon = System.Windows.Forms.ToolTipIcon.Info; + this.toolTip1.ToolTipTitle = "Subtitle name"; + // + // subtitleListView2 + // + this.subtitleListView2.AllowColumnReorder = true; + this.subtitleListView2.AllowDrop = true; + this.subtitleListView2.FirstVisibleIndex = -1; + this.subtitleListView2.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.subtitleListView2.FullRowSelect = true; + this.subtitleListView2.GridLines = true; + this.subtitleListView2.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.subtitleListView2.HideSelection = false; + this.subtitleListView2.Location = new System.Drawing.Point(490, 56); + this.subtitleListView2.Name = "subtitleListView2"; + this.subtitleListView2.OwnerDraw = true; + this.subtitleListView2.Size = new System.Drawing.Size(478, 422); + this.subtitleListView2.SubtitleFontBold = false; + this.subtitleListView2.SubtitleFontName = "Tahoma"; + this.subtitleListView2.SubtitleFontSize = 8; + this.subtitleListView2.TabIndex = 5; + this.subtitleListView2.UseCompatibleStateImageBehavior = false; + this.subtitleListView2.UseSyntaxColoring = true; + this.subtitleListView2.View = System.Windows.Forms.View.Details; + this.subtitleListView2.SelectedIndexChanged += new System.EventHandler(this.SubtitleListView2SelectedIndexChanged); + this.subtitleListView2.DragDrop += new System.Windows.Forms.DragEventHandler(this.subtitleListView2_DragDrop); + this.subtitleListView2.DragEnter += new System.Windows.Forms.DragEventHandler(this.subtitleListView2_DragEnter); + // + // subtitleListView1 + // + this.subtitleListView1.AllowColumnReorder = true; + this.subtitleListView1.AllowDrop = true; + this.subtitleListView1.FirstVisibleIndex = -1; + this.subtitleListView1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.subtitleListView1.FullRowSelect = true; + this.subtitleListView1.GridLines = true; + this.subtitleListView1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.subtitleListView1.HideSelection = false; + this.subtitleListView1.Location = new System.Drawing.Point(8, 56); + this.subtitleListView1.Name = "subtitleListView1"; + this.subtitleListView1.OwnerDraw = true; + this.subtitleListView1.Size = new System.Drawing.Size(476, 422); + this.subtitleListView1.SubtitleFontBold = false; + this.subtitleListView1.SubtitleFontName = "Tahoma"; + this.subtitleListView1.SubtitleFontSize = 8; + this.subtitleListView1.TabIndex = 4; + this.subtitleListView1.UseCompatibleStateImageBehavior = false; + this.subtitleListView1.UseSyntaxColoring = true; + this.subtitleListView1.View = System.Windows.Forms.View.Details; + this.subtitleListView1.SelectedIndexChanged += new System.EventHandler(this.SubtitleListView1SelectedIndexChanged); + this.subtitleListView1.DragDrop += new System.Windows.Forms.DragEventHandler(this.subtitleListView1_DragDrop); + this.subtitleListView1.DragEnter += new System.Windows.Forms.DragEventHandler(this.subtitleListView1_DragEnter); + // + // checkBoxIgnoreFormatting + // + this.checkBoxIgnoreFormatting.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.checkBoxIgnoreFormatting.AutoSize = true; + this.checkBoxIgnoreFormatting.Location = new System.Drawing.Point(582, 552); + this.checkBoxIgnoreFormatting.Name = "checkBoxIgnoreFormatting"; + this.checkBoxIgnoreFormatting.Size = new System.Drawing.Size(111, 17); + this.checkBoxIgnoreFormatting.TabIndex = 14; + this.checkBoxIgnoreFormatting.Text = "Ignore formatting"; + this.checkBoxIgnoreFormatting.UseVisualStyleBackColor = true; + this.checkBoxIgnoreFormatting.CheckedChanged += new System.EventHandler(this.checkBoxIgnoreFormatting_CheckedChanged); + // + // buttonExport + // + this.buttonExport.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonExport.Location = new System.Drawing.Point(774, 561); + this.buttonExport.Name = "buttonExport"; + this.buttonExport.Size = new System.Drawing.Size(104, 23); + this.buttonExport.TabIndex = 20; + this.buttonExport.Text = "Export"; + this.buttonExport.UseVisualStyleBackColor = true; + this.buttonExport.Click += new System.EventHandler(this.buttonExport_Click); + // + // Compare + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(974, 591); + this.Controls.Add(this.buttonExport); + this.Controls.Add(this.checkBoxIgnoreFormatting); + this.Controls.Add(this.checkBoxIgnoreLineBreaks); + this.Controls.Add(this.checkBoxOnlyListDifferencesInText); + this.Controls.Add(this.checkBoxShowOnlyDifferences); + this.Controls.Add(this.richTextBox2); + this.Controls.Add(this.richTextBox1); + this.Controls.Add(this.labelStatus); + this.Controls.Add(this.buttonPreviousDifference); + this.Controls.Add(this.buttonNextDifference); + this.Controls.Add(this.buttonOpenSubtitle2); + this.Controls.Add(this.buttonOpenSubtitle1); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.subtitleListView2); + this.Controls.Add(this.labelSubtitle2); + this.Controls.Add(this.subtitleListView1); + this.Controls.Add(this.labelSubtitle1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.KeyPreview = true; + this.MinimumSize = new System.Drawing.Size(800, 400); + this.Name = "Compare"; + this.ShowIcon = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Compare subtitles"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Compare_FormClosing); + this.Shown += new System.EventHandler(this.Compare_Shown); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Compare_KeyDown); + this.Resize += new System.EventHandler(this.Compare_Resize); + this.contextMenuStrip1.ResumeLayout(false); + this.contextMenuStrip2.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Label labelSubtitle2; + private SubtitleListView subtitleListView2; + private SubtitleListView subtitleListView1; + private System.Windows.Forms.Label labelSubtitle1; + private System.Windows.Forms.Button buttonOpenSubtitle1; + private System.Windows.Forms.Button buttonOpenSubtitle2; + private System.Windows.Forms.OpenFileDialog openFileDialog1; + private System.Windows.Forms.Button buttonNextDifference; + private System.Windows.Forms.Button buttonPreviousDifference; + private System.Windows.Forms.Label labelStatus; + private System.Windows.Forms.Timer timer1; + private System.Windows.Forms.RichTextBox richTextBox1; + private System.Windows.Forms.RichTextBox richTextBox2; + private System.Windows.Forms.CheckBox checkBoxShowOnlyDifferences; + private System.Windows.Forms.CheckBox checkBoxOnlyListDifferencesInText; + private System.Windows.Forms.CheckBox checkBoxIgnoreLineBreaks; + private System.Windows.Forms.ToolTip toolTip1; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; + private System.Windows.Forms.ToolStripMenuItem copyTextToolStripMenuItem; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip2; + private System.Windows.Forms.ToolStripMenuItem copyTextToolStripMenuItem1; + private System.Windows.Forms.CheckBox checkBoxIgnoreFormatting; + private System.Windows.Forms.Button buttonExport; + } } \ No newline at end of file diff --git a/src/Forms/Compare.cs b/src/ui/Forms/Compare.cs similarity index 97% rename from src/Forms/Compare.cs rename to src/ui/Forms/Compare.cs index 84b6cffa3..a69f0665a 100644 --- a/src/Forms/Compare.cs +++ b/src/ui/Forms/Compare.cs @@ -1,1156 +1,1156 @@ -using Nikse.SubtitleEdit.Controls; -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.SubtitleFormats; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.IO; -using System.Text; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class Compare : Form - { - private Subtitle _subtitle1; - private Subtitle _subtitle2; - private List _differences; - private readonly Keys _mainGeneralGoToNextSubtitle = UiUtil.GetKeys(Configuration.Settings.Shortcuts.GeneralGoToNextSubtitle); - private readonly Keys _mainGeneralGoToPrevSubtitle = UiUtil.GetKeys(Configuration.Settings.Shortcuts.GeneralGoToPrevSubtitle); - private string _language1; - private readonly Color _backDifferenceColor = Color.FromArgb(255, 90, 90); - private readonly Color _foregroundDifferenceColor = Color.FromArgb(225, 0, 0); - private bool _loadingConfig = true; - - public Compare() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - labelSubtitle2.Text = string.Empty; - Text = Configuration.Settings.Language.CompareSubtitles.Title; - buttonPreviousDifference.Text = Configuration.Settings.Language.CompareSubtitles.PreviousDifference; - buttonNextDifference.Text = Configuration.Settings.Language.CompareSubtitles.NextDifference; - checkBoxShowOnlyDifferences.Text = Configuration.Settings.Language.CompareSubtitles.ShowOnlyDifferences; - checkBoxIgnoreLineBreaks.Text = Configuration.Settings.Language.CompareSubtitles.IgnoreLineBreaks; - checkBoxIgnoreFormatting.Text = Configuration.Settings.Language.CompareSubtitles.IgnoreFormatting; - checkBoxOnlyListDifferencesInText.Text = Configuration.Settings.Language.CompareSubtitles.OnlyLookForDifferencesInText; - buttonExport.Text = Configuration.Settings.Language.Statistics.Export; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - copyTextToolStripMenuItem.Text = Configuration.Settings.Language.Main.Menu.ContextMenu.Copy; - copyTextToolStripMenuItem1.Text = Configuration.Settings.Language.Main.Menu.ContextMenu.Copy; - subtitleListView1.InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings); - subtitleListView2.InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings); - UiUtil.InitializeSubtitleFont(subtitleListView1); - subtitleListView1.HideColumn(SubtitleListView.SubtitleColumn.CharactersPerSeconds); - subtitleListView1.HideColumn(SubtitleListView.SubtitleColumn.WordsPerMinute); - UiUtil.InitializeSubtitleFont(subtitleListView2); - subtitleListView2.HideColumn(SubtitleListView.SubtitleColumn.CharactersPerSeconds); - subtitleListView2.HideColumn(SubtitleListView.SubtitleColumn.WordsPerMinute); - UiUtil.FixLargeFonts(this, buttonOK); - subtitleListView1.UseSyntaxColoring = false; - subtitleListView2.UseSyntaxColoring = false; - openFileDialog1.Filter = UiUtil.SubtitleExtensionFilter.Value; - LoadConfigurations(); - buttonExport.Enabled = false; - } - - public void Initialize(Subtitle subtitle1, string subtitleFileName1, string title) - { - Compare_Resize(null, null); - labelStatus.Text = string.Empty; - _subtitle1 = subtitle1; - labelSubtitle1.Text = subtitleFileName1; - if (string.IsNullOrEmpty(subtitleFileName1)) - { - labelSubtitle1.Text = title; - } - - subtitleListView1.Fill(subtitle1); - - if (!string.IsNullOrEmpty(subtitleFileName1)) - { - try - { - openFileDialog1.InitialDirectory = Path.GetDirectoryName(subtitleFileName1); - } - catch - { - // ignored - } - } - subtitleListView1.SelectIndexAndEnsureVisible(0); - _language1 = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle1); - } - - public void Initialize(Subtitle subtitle1, string subtitleFileName1, Subtitle subtitle2, string subtitleFileName2) - { - Compare_Resize(null, null); - labelStatus.Text = string.Empty; - _subtitle1 = subtitle1; - labelSubtitle1.Text = subtitleFileName1; - - _subtitle2 = subtitle2; - labelSubtitle2.Text = subtitleFileName2; - - _language1 = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle1); - CompareSubtitles(); - - if (!string.IsNullOrEmpty(subtitleFileName1) && File.Exists(subtitleFileName1)) - { - openFileDialog1.InitialDirectory = Path.GetDirectoryName(subtitleFileName1); - } - - subtitleListView1.SelectIndexAndEnsureVisible(0); - subtitleListView2.SelectIndexAndEnsureVisible(0); - } - - private void ButtonOpenSubtitle1Click(object sender, EventArgs e) - { - openFileDialog1.FileName = string.Empty; - - if (openFileDialog1.ShowDialog() == DialogResult.OK) - { - if (FileUtil.IsVobSub(openFileDialog1.FileName) || FileUtil.IsBluRaySup(openFileDialog1.FileName)) - { - MessageBox.Show(Configuration.Settings.Language.CompareSubtitles.CannotCompareWithImageBasedSubtitles); - return; - } - _subtitle1 = LoadSubtitle(openFileDialog1.FileName); - - subtitleListView1.Fill(_subtitle1); - subtitleListView1.SelectIndexAndEnsureVisible(0); - subtitleListView2.SelectIndexAndEnsureVisible(0); - labelSubtitle1.Text = openFileDialog1.FileName; - _language1 = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle1); - if (_subtitle1.Paragraphs.Count > 0 && _subtitle2?.Paragraphs.Count > 0) - { - CompareSubtitles(); - } - } - } - - private static Subtitle LoadSubtitle(string fileName) - { - var subtitle = new Subtitle(); - var format = subtitle.LoadSubtitle(fileName, out _, null); - if (format == null) - { - foreach (var f in SubtitleFormat.GetBinaryFormats(false)) - { - if (f.IsMine(null, fileName)) - { - f.LoadSubtitle(subtitle, null, fileName); - break; // format found, exit the loop - } - } - } - return subtitle; - } - - private void ButtonOpenSubtitle2Click(object sender, EventArgs e) - { - openFileDialog1.FileName = string.Empty; - - if (openFileDialog1.ShowDialog() == DialogResult.OK) - { - if (FileUtil.IsVobSub(openFileDialog1.FileName) || FileUtil.IsBluRaySup(openFileDialog1.FileName)) - { - MessageBox.Show(Configuration.Settings.Language.CompareSubtitles.CannotCompareWithImageBasedSubtitles); - return; - } - - _subtitle2 = LoadSubtitle(openFileDialog1.FileName); - - subtitleListView2.Fill(_subtitle2); - subtitleListView1.SelectIndexAndEnsureVisible(0); - subtitleListView2.SelectIndexAndEnsureVisible(0); - labelSubtitle2.Text = openFileDialog1.FileName; - if (_subtitle2.Paragraphs.Count > 0 && _subtitle1?.Paragraphs.Count > 0) - { - CompareSubtitles(); - } - } - } - - private void CompareSubtitles() - { - if (_loadingConfig || _subtitle2 == null || _subtitle2.Paragraphs.Count == 0) - { - return; - } - buttonExport.Enabled = true; - timer1.Stop(); - var sub1 = new Subtitle(_subtitle1); - var sub2 = new Subtitle(_subtitle2); - - int index = 0; - Paragraph p1 = sub1.GetParagraphOrDefault(index); - Paragraph p2 = sub2.GetParagraphOrDefault(index); - int max = Math.Max(sub1.Paragraphs.Count, sub2.Paragraphs.Count); - while (index < max) - { - if (p1 != null && p2 != null && GetColumnsEqualExceptNumberAndDuration(p1, p2) == 0) - { - for (int i = index + 1; i < max; i++) - { - // Try to find atleast two matching properties - if (GetColumnsEqualExceptNumber(sub1.GetParagraphOrDefault(i), p2) > 1) - { - for (int j = index; j < i; j++) - { - sub2.Paragraphs.Insert(index++, new Paragraph()); - } - break; - } - if (GetColumnsEqualExceptNumber(p1, sub2.GetParagraphOrDefault(i)) > 1) - { - for (int j = index; j < i; j++) - { - sub1.Paragraphs.Insert(index++, new Paragraph()); - } - break; - } - } - } - index++; - p1 = sub1.GetParagraphOrDefault(index); - p2 = sub2.GetParagraphOrDefault(index); - } - - var minSub = sub1.Paragraphs.Count < sub2.Paragraphs.Count ? sub1 : sub2; - for (var idx = minSub.Paragraphs.Count; idx < max; idx++) - { - minSub.Paragraphs.Insert(idx, new Paragraph()); - } - - subtitleListView1.Fill(sub1); - subtitleListView2.Fill(sub2); - - // coloring + differences index list - _differences = new List(); - index = 0; - p1 = sub1.GetParagraphOrDefault(index); - p2 = sub2.GetParagraphOrDefault(index); - int totalWords = 0; - int wordsChanged = 0; - max = Math.Max(sub1.Paragraphs.Count, sub2.Paragraphs.Count); - int min = Math.Min(sub1.Paragraphs.Count, sub2.Paragraphs.Count); - var onlyTextDiff = checkBoxOnlyListDifferencesInText.Checked; - - if (onlyTextDiff) - { - while (index < min) - { - bool addIndexToDifferences = false; - Utilities.GetTotalAndChangedWords(p1.Text, p2.Text, ref totalWords, ref wordsChanged, checkBoxIgnoreLineBreaks.Checked, checkBoxIgnoreFormatting.Checked, ShouldBreakToLetter()); - if (p1.IsDefault) - { - addIndexToDifferences = true; - subtitleListView1.ColorOut(index, Color.Salmon); - } - else if (p2.IsDefault) - { - addIndexToDifferences = true; - subtitleListView2.ColorOut(index, Color.Salmon); - } - else if (FixWhitespace(p1.Text) != FixWhitespace(p2.Text)) - { - addIndexToDifferences = true; - subtitleListView1.SetBackgroundColor(index, Color.LightGreen, subtitleListView1.ColumnIndexText); - subtitleListView2.SetBackgroundColor(index, Color.LightGreen, subtitleListView2.ColumnIndexText); - } - if (addIndexToDifferences) - { - _differences.Add(index); - } - index++; - p1 = sub1.GetParagraphOrDefault(index); - p2 = sub2.GetParagraphOrDefault(index); - } - } - else - { - const double tolerance = 0.1; - while (index < min) - { - Utilities.GetTotalAndChangedWords(p1.Text, p2.Text, ref totalWords, ref wordsChanged, checkBoxIgnoreLineBreaks.Checked, checkBoxIgnoreFormatting.Checked, ShouldBreakToLetter()); - bool addIndexToDifferences = false; - if (p1.IsDefault) - { - addIndexToDifferences = true; - subtitleListView1.ColorOut(index, Color.Salmon); - } - else if (p2.IsDefault) - { - addIndexToDifferences = true; - subtitleListView2.ColorOut(index, Color.Salmon); - } - else - { - int columnsAlike = GetColumnsEqualExceptNumber(p1, p2); - // Not alike paragraphs - if (columnsAlike == 0) - { - addIndexToDifferences = true; - subtitleListView1.SetBackgroundColor(index, Color.LightGreen); - subtitleListView2.SetBackgroundColor(index, Color.LightGreen); - subtitleListView1.SetBackgroundColor(index, subtitleListView1.BackColor, subtitleListView1.ColumnIndexNumber); - subtitleListView2.SetBackgroundColor(index, subtitleListView2.BackColor, subtitleListView2.ColumnIndexNumber); - } - else if (columnsAlike < 4) - { - addIndexToDifferences = true; - // Start time - if (Math.Abs(p1.StartTime.TotalMilliseconds - p2.StartTime.TotalMilliseconds) > tolerance) - { - subtitleListView1.SetBackgroundColor(index, Color.LightGreen, subtitleListView1.ColumnIndexStart); - subtitleListView2.SetBackgroundColor(index, Color.LightGreen, subtitleListView2.ColumnIndexStart); - } - // End time - if (Math.Abs(p1.EndTime.TotalMilliseconds - p2.EndTime.TotalMilliseconds) > tolerance) - { - subtitleListView1.SetBackgroundColor(index, Color.LightGreen, subtitleListView1.ColumnIndexEnd); - subtitleListView2.SetBackgroundColor(index, Color.LightGreen, subtitleListView2.ColumnIndexEnd); - } - // Duration - if (Math.Abs(p1.Duration.TotalMilliseconds - p2.Duration.TotalMilliseconds) > tolerance) - { - subtitleListView1.SetBackgroundColor(index, Color.LightGreen, subtitleListView1.ColumnIndexDuration); - subtitleListView2.SetBackgroundColor(index, Color.LightGreen, subtitleListView2.ColumnIndexDuration); - } - // Text - if (FixWhitespace(p1.Text.Trim()) != FixWhitespace(p2.Text.Trim())) - { - subtitleListView1.SetBackgroundColor(index, Color.LightGreen, subtitleListView1.ColumnIndexText); - subtitleListView2.SetBackgroundColor(index, Color.LightGreen, subtitleListView2.ColumnIndexText); - } - } - // Number - if (p1.Number != p2.Number) - { - addIndexToDifferences = true; - subtitleListView1.SetBackgroundColor(index, Color.FromArgb(255, 200, 100), subtitleListView1.ColumnIndexNumber); - subtitleListView2.SetBackgroundColor(index, Color.FromArgb(255, 200, 100), subtitleListView2.ColumnIndexNumber); - } - } - if (addIndexToDifferences) - { - _differences.Add(index); - } - index++; - p1 = sub1.GetParagraphOrDefault(index); - p2 = sub2.GetParagraphOrDefault(index); - } - } - UpdatePreviousAndNextButtons(); - - if (max > min) // color extra lines as has-difference - { - var listView = subtitleListView1.Items.Count > subtitleListView2.Items.Count ? subtitleListView1 : subtitleListView2; - for (int i = min; i < max; i++) - { - if (!onlyTextDiff) - { - listView.SetBackgroundColor(i, Color.FromArgb(255, 200, 100), listView.ColumnIndexNumber); - listView.SetBackgroundColor(i, Color.LightGreen, listView.ColumnIndexStart); - listView.SetBackgroundColor(i, Color.LightGreen, listView.ColumnIndexEnd); - listView.SetBackgroundColor(i, Color.LightGreen, listView.ColumnIndexDuration); - } - listView.SetBackgroundColor(i, Color.LightGreen, listView.ColumnIndexText); - } - } - - if (_differences.Count >= min) - { - labelStatus.Text = Configuration.Settings.Language.CompareSubtitles.SubtitlesNotAlike; - labelStatus.Font = new Font(labelStatus.Font.FontFamily, labelStatus.Font.Size, FontStyle.Bold); - } - else - { - if (wordsChanged != totalWords && wordsChanged > 0) - { - string formatString = Configuration.Settings.Language.CompareSubtitles.XNumberOfDifferenceAndPercentChanged; - if (ShouldBreakToLetter()) - { - formatString = Configuration.Settings.Language.CompareSubtitles.XNumberOfDifferenceAndPercentLettersChanged; - } - - labelStatus.Text = string.Format(formatString, _differences.Count, wordsChanged * 100.00 / totalWords); - } - else - { - labelStatus.Text = string.Format(Configuration.Settings.Language.CompareSubtitles.XNumberOfDifference, _differences.Count); - } - labelStatus.Font = new Font(labelStatus.Font.FontFamily, labelStatus.Font.Size); - } - - if (checkBoxShowOnlyDifferences.Checked) - { // Remove all lines with no difference - subtitleListView1.BeginUpdate(); - subtitleListView2.BeginUpdate(); - if (_differences.Count < min) - { - for (index = Math.Max(subtitleListView1.Items.Count, subtitleListView2.Items.Count) - 1; index >= 0; index--) - { - if (!_differences.Contains(index)) - { - if (subtitleListView1.Items.Count > index) - { - subtitleListView1.Items.RemoveAt(index); - } - - if (subtitleListView2.Items.Count > index) - { - subtitleListView2.Items.RemoveAt(index); - } - } - } - } - subtitleListView1.EndUpdate(); - subtitleListView2.EndUpdate(); - _differences = new List(); - max = Math.Max(subtitleListView1.Items.Count, subtitleListView2.Items.Count); - for (index = 0; index < max; index++) - { - _differences.Add(index); - } - } - timer1.Start(); - subtitleListView1.FirstVisibleIndex = -1; - subtitleListView1.SelectIndexAndEnsureVisible(0); - } - - private bool ShouldBreakToLetter() => _language1 != null && (_language1 == "ja" || _language1 == "zh"); - - private string FixWhitespace(string p) - { - if (checkBoxIgnoreLineBreaks.Checked) - { - p = p.Replace(Environment.NewLine, " "); - while (p.Contains(" ")) - { - p = p.Replace(" ", " "); - } - } - - if (checkBoxIgnoreFormatting.Checked) - { - p = HtmlUtil.RemoveHtmlTags(p, true); - } - - return p; - } - - private int GetColumnsEqualExceptNumber(Paragraph p1, Paragraph p2) - { - if (p1 == null || p2 == null) - { - return 0; - } - - const double tolerance = 0.1; - - int columnsEqual = 0; - if (Math.Abs(p1.StartTime.TotalMilliseconds - p2.StartTime.TotalMilliseconds) < tolerance) - { - columnsEqual++; - } - - if (Math.Abs(p1.EndTime.TotalMilliseconds - p2.EndTime.TotalMilliseconds) < tolerance) - { - columnsEqual++; - } - - if (Math.Abs(p1.Duration.TotalMilliseconds - p2.Duration.TotalMilliseconds) < tolerance) - { - columnsEqual++; - } - - if (p1.Text.Trim() == p2.Text.Trim() || - checkBoxIgnoreFormatting.Checked && HtmlUtil.RemoveHtmlTags(p1.Text.Trim()) == HtmlUtil.RemoveHtmlTags(p2.Text.Trim())) - { - columnsEqual++; - } - - return columnsEqual; - } - - private int GetColumnsEqualExceptNumberAndDuration(Paragraph p1, Paragraph p2) - { - if (p1 == null || p2 == null) - { - return 0; - } - - const double tolerance = 0.1; - - int columnsEqual = 0; - if (Math.Abs(p1.StartTime.TotalMilliseconds - p2.StartTime.TotalMilliseconds) < tolerance) - { - columnsEqual++; - } - - if (Math.Abs(p1.EndTime.TotalMilliseconds - p2.EndTime.TotalMilliseconds) < tolerance) - { - columnsEqual++; - } - - if (p1.Text.Trim() == p2.Text.Trim() || - checkBoxIgnoreFormatting.Checked && HtmlUtil.RemoveHtmlTags(p1.Text.Trim()) == HtmlUtil.RemoveHtmlTags(p2.Text.Trim())) - { - columnsEqual++; - } - - return columnsEqual; - } - - private void ButtonOkClick(object sender, EventArgs e) - { - Close(); - } - - private void Compare_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - Close(); - } - else if (e.KeyCode == Keys.Enter && buttonNextDifference.Enabled) - { - ButtonNextDifferenceClick(null, null); - } - else if (e.KeyCode == Keys.Right && buttonNextDifference.Enabled) - { - ButtonNextDifferenceClick(null, null); - } - else if (e.KeyCode == Keys.Left && buttonPreviousDifference.Enabled) - { - ButtonPreviousDifferenceClick(null, null); - } - else if (_mainGeneralGoToNextSubtitle == e.KeyData || (e.KeyCode == Keys.Down && e.Modifiers == Keys.Alt)) - { - SubtitleListView lv = subtitleListView1; - if (subtitleListView2.Focused) - { - lv = subtitleListView2; - } - - int selectedIndex = 0; - if (lv.SelectedItems.Count > 0) - { - selectedIndex = lv.SelectedItems[0].Index; - selectedIndex++; - } - lv.SelectIndexAndEnsureVisible(selectedIndex); - } - else if (_mainGeneralGoToPrevSubtitle == e.KeyData || (e.KeyCode == Keys.Up && e.Modifiers == Keys.Alt)) - { - SubtitleListView lv = subtitleListView1; - if (subtitleListView2.Focused) - { - lv = subtitleListView2; - } - - int selectedIndex = 0; - if (lv.SelectedItems.Count > 0) - { - selectedIndex = lv.SelectedItems[0].Index; - selectedIndex--; - } - lv.SelectIndexAndEnsureVisible(selectedIndex); - } - } - - private void SubtitleListView1SelectedIndexChanged(object sender, EventArgs e) - { - UpdatePreviousAndNextButtons(); - ShowText(); - } - - private void ShowText() - { - string text1 = string.Empty; - string text2 = string.Empty; - - if (subtitleListView1.SelectedItems.Count == 1) - { - text1 = subtitleListView1.GetText(subtitleListView1.SelectedItems[0].Index); - - if (subtitleListView2.Items.Count > subtitleListView1.SelectedItems[0].Index) - { - text2 = subtitleListView2.GetText(subtitleListView1.SelectedItems[0].Index); - } - } - richTextBox1.Text = text1; - richTextBox2.Text = text2; - - // show diff - if (string.IsNullOrWhiteSpace(text1) || string.IsNullOrWhiteSpace(text2) || text1 == text2) - { - return; - } - - ShowTextDifference(); - } - - private void ShowTextDifference() - { - // from start - int minLength = Math.Min(richTextBox1.Text.Length, richTextBox2.Text.Length); - int startCharactersOk = 0; - for (int i = 0; i < minLength; i++) - { - if (richTextBox1.Text[i] == richTextBox2.Text[i]) - { - startCharactersOk++; - } - else - { - if (richTextBox1.Text.Length > i + 4 && richTextBox2.Text.Length > i + 4 && - richTextBox1.Text[i + 1] == richTextBox2.Text[i + 1] && - richTextBox1.Text[i + 2] == richTextBox2.Text[i + 2] && - richTextBox1.Text[i + 3] == richTextBox2.Text[i + 3] && - richTextBox1.Text[i + 4] == richTextBox2.Text[i + 4]) - { - startCharactersOk++; - - richTextBox1.SelectionStart = i; - richTextBox1.SelectionLength = 1; - richTextBox1.SelectionColor = _foregroundDifferenceColor; - if (" .,".Contains(richTextBox1.SelectedText)) - { - richTextBox1.SelectionBackColor = _backDifferenceColor; - richTextBox1.SelectionColor = DefaultForeColor; - } - - richTextBox2.SelectionStart = i; - richTextBox2.SelectionLength = 1; - richTextBox2.SelectionColor = _foregroundDifferenceColor; - if (" .,".Contains(richTextBox2.SelectedText)) - { - richTextBox2.SelectionBackColor = _backDifferenceColor; - richTextBox2.SelectionColor = DefaultForeColor; - } - } - else - { - break; - } - } - } - - int maxLength = Math.Max(richTextBox1.Text.Length, richTextBox2.Text.Length); - for (int i = startCharactersOk; i < maxLength; i++) - { - if (i < richTextBox1.Text.Length) - { - richTextBox1.SelectionStart = i; - richTextBox1.SelectionLength = 1; - richTextBox1.SelectionColor = _backDifferenceColor; - if (" .,".Contains(richTextBox1.SelectedText)) - { - richTextBox1.SelectionBackColor = _backDifferenceColor; - richTextBox1.SelectionColor = DefaultForeColor; - } - } - if (i < richTextBox2.Text.Length) - { - richTextBox2.SelectionStart = i; - richTextBox2.SelectionLength = 1; - richTextBox2.SelectionColor = _foregroundDifferenceColor; - if (" .,".Contains(richTextBox2.SelectedText)) - { - richTextBox2.SelectionBackColor = _backDifferenceColor; - richTextBox2.SelectionColor = DefaultForeColor; - } - } - } - - // from end - for (int i = 1; i < minLength; i++) - { - if (richTextBox1.Text.Length - i < startCharactersOk || richTextBox2.Text.Length - i < startCharactersOk) - { - break; - } - - if (richTextBox1.Text[richTextBox1.Text.Length - i] == richTextBox2.Text[richTextBox2.Text.Length - i]) - { - richTextBox1.SelectionStart = richTextBox1.Text.Length - i; - richTextBox1.SelectionLength = 1; - richTextBox1.SelectionColor = Color.Black; - richTextBox1.SelectionBackColor = richTextBox1.BackColor; - - richTextBox2.SelectionStart = richTextBox2.Text.Length - i; - richTextBox2.SelectionLength = 1; - richTextBox2.SelectionColor = Color.Black; - richTextBox2.SelectionBackColor = richTextBox1.BackColor; - } - else - { - break; - } - } - - // special situation - equal, but one has more chars - if (richTextBox1.Text.Length > richTextBox2.Text.Length) - { - if (richTextBox1.Text.StartsWith(richTextBox2.Text, StringComparison.Ordinal)) - { - richTextBox1.SelectionStart = richTextBox2.Text.Length; - richTextBox1.SelectionLength = richTextBox1.Text.Length - richTextBox2.Text.Length; - richTextBox1.SelectionBackColor = _backDifferenceColor; - } - } - else if (richTextBox2.Text.Length > richTextBox1.Text.Length) - { - if (richTextBox2.Text.StartsWith(richTextBox1.Text, StringComparison.Ordinal)) - { - richTextBox2.SelectionStart = richTextBox1.Text.Length; - richTextBox2.SelectionLength = richTextBox2.Text.Length - richTextBox1.Text.Length; - richTextBox2.SelectionColor = _foregroundDifferenceColor; - } - } - } - - private void UpdatePreviousAndNextButtons() - { - if (subtitleListView1.Items.Count > 0 && subtitleListView2.Items.Count > 0 && - _differences != null && _differences.Count > 0) - { - if (subtitleListView1.SelectedItems.Count == 0) - { - buttonPreviousDifference.Enabled = false; - buttonNextDifference.Enabled = true; - } - else - { - int index = subtitleListView1.SelectedItems[0].Index; - buttonPreviousDifference.Enabled = _differences[0] < index; - buttonNextDifference.Enabled = _differences[_differences.Count - 1] > index; - } - } - else - { - buttonPreviousDifference.Enabled = false; - buttonNextDifference.Enabled = false; - } - } - - private void SubtitleListView2SelectedIndexChanged(object sender, EventArgs e) - { - UpdatePreviousAndNextButtons(); - } - - private void Compare_Resize(object sender, EventArgs e) - { - subtitleListView1.Width = (Width / 2) - 20; - - subtitleListView2.Left = (Width / 2) - 3; - subtitleListView2.Width = (Width / 2) - 20; - labelSubtitle2.Left = subtitleListView2.Left; - buttonOpenSubtitle2.Left = subtitleListView2.Left; - - subtitleListView1.Height = Height - (subtitleListView1.Top + 140); - subtitleListView2.Height = Height - (subtitleListView2.Top + 140); - - richTextBox1.Width = subtitleListView1.Width; - richTextBox2.Width = subtitleListView2.Width; - richTextBox2.Left = subtitleListView2.Left; - } - - private void ButtonPreviousDifferenceClick(object sender, EventArgs e) - { - if (_differences != null && _differences.Count > 0) - { - if (subtitleListView1.SelectedItems.Count == 0) - { - subtitleListView1.SelectIndexAndEnsureVisible(_differences[0]); - } - else - { - for (int i = subtitleListView1.SelectedItems[0].Index - 1; i >= 0; i--) - { - if (_differences.Contains(i)) - { - subtitleListView1.SelectIndexAndEnsureVisible(i - 2); - subtitleListView1.SelectIndexAndEnsureVisible(i + 2); - subtitleListView1.SelectIndexAndEnsureVisible(i); - break; - } - } - } - } - } - - private void ButtonNextDifferenceClick(object sender, EventArgs e) - { - if (_differences != null && _differences.Count > 0) - { - if (subtitleListView1.SelectedItems.Count == 0) - { - subtitleListView1.SelectIndexAndEnsureVisible(_differences[0]); - } - else - { - for (int i = subtitleListView1.SelectedItems[0].Index + 1; i < subtitleListView1.Items.Count; i++) - { - if (_differences.Contains(i)) - { - subtitleListView1.SelectIndexAndEnsureVisible(i - 2); - subtitleListView1.SelectIndexAndEnsureVisible(i + 2); - subtitleListView1.SelectIndexAndEnsureVisible(i); - subtitleListView1.Focus(); - break; - } - } - } - } - } - - private void Timer1Tick(object sender, EventArgs e) - { - if (subtitleListView1.TopItem == null || subtitleListView2.TopItem == null) - { - return; - } - - char activeListView; - var p = PointToClient(MousePosition); - if (p.X >= subtitleListView1.Left && p.X <= subtitleListView1.Left + subtitleListView1.Width + 2) - { - activeListView = 'L'; - } - else if (p.X >= subtitleListView2.Left && p.X <= subtitleListView2.Left + subtitleListView2.Width + 2) - { - activeListView = 'R'; - } - else - { - return; - } - - if (subtitleListView1.SelectedItems.Count > 0 && activeListView == 'L') - { - if (subtitleListView2.SelectedItems.Count > 0 && - subtitleListView1.SelectedItems[0].Index == subtitleListView2.SelectedItems[0].Index) - { - if (subtitleListView1.TopItem.Index != subtitleListView2.TopItem.Index && - subtitleListView2.Items.Count > subtitleListView1.TopItem.Index) - { - subtitleListView2.TopItem = subtitleListView2.Items[subtitleListView1.TopItem.Index]; - } - - return; - } - subtitleListView2.SelectedIndexChanged -= SubtitleListView2SelectedIndexChanged; - subtitleListView2.SelectIndexAndEnsureVisible(subtitleListView1.SelectedItems[0].Index); - if (subtitleListView1.TopItem.Index != subtitleListView2.TopItem.Index && - subtitleListView2.Items.Count > subtitleListView1.TopItem.Index) - { - subtitleListView2.TopItem = subtitleListView2.Items[subtitleListView1.TopItem.Index]; - } - - subtitleListView2.SelectedIndexChanged += SubtitleListView2SelectedIndexChanged; - } - else if (subtitleListView2.SelectedItems.Count > 0 && activeListView == 'R') - { - if (subtitleListView1.SelectedItems.Count > 0 && - subtitleListView2.SelectedItems[0].Index == subtitleListView1.SelectedItems[0].Index) - { - if (subtitleListView2.TopItem.Index != subtitleListView1.TopItem.Index && - subtitleListView1.Items.Count > subtitleListView2.TopItem.Index) - { - subtitleListView1.TopItem = subtitleListView1.Items[subtitleListView2.TopItem.Index]; - } - - return; - } - subtitleListView1.SelectIndexAndEnsureVisible(subtitleListView2.SelectedItems[0].Index); - if (subtitleListView2.TopItem.Index != subtitleListView1.TopItem.Index && - subtitleListView1.Items.Count > subtitleListView2.TopItem.Index) - { - subtitleListView1.TopItem = subtitleListView1.Items[subtitleListView2.TopItem.Index]; - } - } - } - - private void Compare_FormClosing(object sender, FormClosingEventArgs e) - { - timer1.Stop(); - SaveConfigurations(); - } - - private void checkBoxShowOnlyDifferences_CheckedChanged(object sender, EventArgs e) - { - CompareSubtitles(); - } - - private void checkBoxOnlyListDifferencesInText_CheckedChanged(object sender, EventArgs e) - { - CompareSubtitles(); - } - - private void checkBoxIgnoreLineBreaks_CheckedChanged(object sender, EventArgs e) - { - CompareSubtitles(); - } - - private void labelSubtitle1_MouseHover(object sender, EventArgs e) - { - ShowTip(labelSubtitle1); - } - - private void labelSubtitle2_MouseHover(object sender, EventArgs e) - { - ShowTip(labelSubtitle2); - } - - private void ShowTip(Control control) - { - var text = control.Text; - if (!string.IsNullOrEmpty(text)) - { - try - { - text = Path.GetFileName(text); - } - catch - { - // not a path - } - toolTip1.Show(text, control); - } - } - - private void subtitleListView1_DragEnter(object sender, DragEventArgs e) - { - VerifyDragEnter(e); - } - - private void subtitleListView2_DragEnter(object sender, DragEventArgs e) - { - VerifyDragEnter(e); - } - - private static void VerifyDragEnter(DragEventArgs e) - { - e.Effect = e.Data.GetDataPresent(DataFormats.FileDrop) ? DragDropEffects.Copy : DragDropEffects.None; - } - - private void subtitleListView1_DragDrop(object sender, DragEventArgs e) - { - VerifyDragDrop((sender as ListView), e); - } - - private void subtitleListView2_DragDrop(object sender, DragEventArgs e) - { - VerifyDragDrop((sender as ListView), e); - } - - private void VerifyDragDrop(ListView listView, DragEventArgs e) - { - var files = e.Data.GetData(DataFormats.FileDrop) as string[]; - if (files == null) - { - return; - } - if (files.Length > 1) - { - MessageBox.Show(Configuration.Settings.Language.Main.DropOnlyOneFile, - string.Empty, MessageBoxButtons.OK, MessageBoxIcon.Error); - return; - } - string filePath = files[0]; - if (FileUtil.IsDirectory(filePath)) - { - MessageBox.Show(Configuration.Settings.Language.Main.ErrorDirectoryDropNotAllowed, - string.Empty, MessageBoxButtons.OK, MessageBoxIcon.Error); - return; - } - - var listExt = new List(); - foreach (var s in UiUtil.SubtitleExtensionFilter.Value.Split(new[] { '*' }, StringSplitOptions.RemoveEmptyEntries)) - { - if (s.EndsWith(';')) - { - listExt.Add(s.Trim(';')); - } - } - if (!listExt.Contains(Path.GetExtension(filePath))) - { - return; - } - - if (FileUtil.IsVobSub(filePath) || FileUtil.IsBluRaySup(filePath)) - { - MessageBox.Show(Configuration.Settings.Language.CompareSubtitles.CannotCompareWithImageBasedSubtitles); - return; - } - - if (listView.Name == "subtitleListView1") - { - _subtitle1 = new Subtitle(); - _subtitle1.LoadSubtitle(filePath, out _, null); - subtitleListView1.Fill(_subtitle1); - subtitleListView1.SelectIndexAndEnsureVisible(0); - subtitleListView2.SelectIndexAndEnsureVisible(0); - labelSubtitle1.Text = filePath; - _language1 = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle1); - if (_subtitle1.Paragraphs.Count > 0) - { - CompareSubtitles(); - } - } - else - { - _subtitle2 = new Subtitle(); - _subtitle2.LoadSubtitle(filePath, out _, null); - subtitleListView2.Fill(_subtitle2); - subtitleListView1.SelectIndexAndEnsureVisible(0); - subtitleListView2.SelectIndexAndEnsureVisible(0); - labelSubtitle2.Text = filePath; - if (_subtitle2.Paragraphs.Count > 0) - { - CompareSubtitles(); - } - } - } - - private void copyTextToolStripMenuItem_Click(object sender, EventArgs e) - { - CopyTextToClipboard(richTextBox1); - } - - private void copyTextToolStripMenuItem1_Click(object sender, EventArgs e) - { - CopyTextToClipboard(richTextBox2); - } - - private static void CopyTextToClipboard(RichTextBox sender) - { - if (string.IsNullOrWhiteSpace(sender.Text)) - { - return; - } - - if (sender.SelectedText.Length > 0) - { - Clipboard.SetText(sender.SelectedText); - return; - } - Clipboard.SetText(sender.Text); - } - - private void LoadConfigurations() - { - var config = Configuration.Settings.Compare; - checkBoxShowOnlyDifferences.Checked = config.ShowOnlyDifferences; - checkBoxOnlyListDifferencesInText.Checked = config.OnlyLookForDifferenceInText; - checkBoxIgnoreLineBreaks.Checked = config.IgnoreLineBreaks; - checkBoxIgnoreFormatting.Checked = config.IgnoreFormatting; - _loadingConfig = false; - } - - private void SaveConfigurations() - { - var config = Configuration.Settings.Compare; - config.ShowOnlyDifferences = checkBoxShowOnlyDifferences.Checked; - config.OnlyLookForDifferenceInText = checkBoxOnlyListDifferencesInText.Checked; - config.IgnoreLineBreaks = checkBoxIgnoreLineBreaks.Checked; - config.IgnoreFormatting = checkBoxIgnoreFormatting.Checked; - } - - private void checkBoxIgnoreFormatting_CheckedChanged(object sender, EventArgs e) - { - CompareSubtitles(); - } - - private void Compare_Shown(object sender, EventArgs e) - { - Activate(); - } - - private void buttonExport_Click(object sender, EventArgs e) - { - using (var saveFile = new SaveFileDialog { Filter = "Html files|*.html" }) - { - if (saveFile.ShowDialog() == DialogResult.OK) - { - string fileName = saveFile.FileName; - var sb = new StringBuilder(); - sb.AppendLine(""); - sb.AppendLine(""); - sb.AppendLine(" "); - sb.AppendLine(" Subtitle Edit compare"); - sb.AppendLine(" "); - sb.AppendLine(" "); - sb.AppendLine(" "); - sb.AppendLine("

Subtitle Edit compare

"); - sb.AppendLine(" "); - sb.AppendLine(" "); - sb.AppendLine(" "); - sb.AppendLine(" "); - sb.AppendLine(" "); - sb.AppendLine(" "); - for (int i = 0; i < subtitleListView1.Items.Count; i++) - { - var itemLeft = subtitleListView1.Items[i].Tag as Paragraph; - var itemRight = subtitleListView2.Items[i].Tag as Paragraph; - if (itemLeft != null && itemRight != null) - { - sb.AppendLine(" "); - sb.AppendLine(" " + GetHtmlText(itemLeft, itemLeft.Number.ToString()) + ""); - sb.AppendLine(" " + GetHtmlText(itemLeft, itemLeft.StartTime.ToShortDisplayString()) + ""); - if (subtitleListView1.ColumnIndexEnd >= 0) - { - sb.AppendLine(" " + GetHtmlText(itemLeft, itemLeft.EndTime.ToShortDisplayString()) + ""); - } - sb.AppendLine(" " + GetHtmlText(itemLeft, itemLeft.Text) + ""); - sb.AppendLine(" "); - sb.AppendLine(" " + GetHtmlText(itemRight, itemRight.Number.ToString()) + ""); - sb.AppendLine(" " + GetHtmlText(itemRight, itemRight.StartTime.ToShortDisplayString()) + ""); - if (subtitleListView2.ColumnIndexEnd >= 0) - { - sb.AppendLine(" " + GetHtmlText(itemRight, itemRight.EndTime.ToShortDisplayString()) + ""); - } - sb.AppendLine(" " + GetHtmlText(itemRight, itemRight.Text) + ""); - sb.AppendLine(" "); - } - } - sb.AppendLine(" "); - sb.AppendLine(" "); - sb.AppendLine(" "); - sb.AppendLine("
" + labelSubtitle1.Text + " " + labelSubtitle2.Text + "
 

" + labelStatus.Text + "
"); - sb.AppendLine(" "); - sb.AppendLine(""); - File.WriteAllText(fileName, sb.ToString()); - } - } - } - - private string GetHtmlText(Paragraph p, string text) - { - if (p.IsDefault) - { - return string.Empty; - } - return HtmlUtil.EncodeNamed(text); - } - - private string GetHtmlBackgroundColor(ListViewItem.ListViewSubItem item) - { - if (item.BackColor == DefaultBackColor) - { - return string.Empty; - } - return " style='background-color:" + ColorTranslator.ToHtml(item.BackColor) + "'"; - } - } -} +using Nikse.SubtitleEdit.Controls; +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.SubtitleFormats; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Text; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class Compare : Form + { + private Subtitle _subtitle1; + private Subtitle _subtitle2; + private List _differences; + private readonly Keys _mainGeneralGoToNextSubtitle = UiUtil.GetKeys(Configuration.Settings.Shortcuts.GeneralGoToNextSubtitle); + private readonly Keys _mainGeneralGoToPrevSubtitle = UiUtil.GetKeys(Configuration.Settings.Shortcuts.GeneralGoToPrevSubtitle); + private string _language1; + private readonly Color _backDifferenceColor = Color.FromArgb(255, 90, 90); + private readonly Color _foregroundDifferenceColor = Color.FromArgb(225, 0, 0); + private bool _loadingConfig = true; + + public Compare() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + labelSubtitle2.Text = string.Empty; + Text = Configuration.Settings.Language.CompareSubtitles.Title; + buttonPreviousDifference.Text = Configuration.Settings.Language.CompareSubtitles.PreviousDifference; + buttonNextDifference.Text = Configuration.Settings.Language.CompareSubtitles.NextDifference; + checkBoxShowOnlyDifferences.Text = Configuration.Settings.Language.CompareSubtitles.ShowOnlyDifferences; + checkBoxIgnoreLineBreaks.Text = Configuration.Settings.Language.CompareSubtitles.IgnoreLineBreaks; + checkBoxIgnoreFormatting.Text = Configuration.Settings.Language.CompareSubtitles.IgnoreFormatting; + checkBoxOnlyListDifferencesInText.Text = Configuration.Settings.Language.CompareSubtitles.OnlyLookForDifferencesInText; + buttonExport.Text = Configuration.Settings.Language.Statistics.Export; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + copyTextToolStripMenuItem.Text = Configuration.Settings.Language.Main.Menu.ContextMenu.Copy; + copyTextToolStripMenuItem1.Text = Configuration.Settings.Language.Main.Menu.ContextMenu.Copy; + subtitleListView1.InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings); + subtitleListView2.InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings); + UiUtil.InitializeSubtitleFont(subtitleListView1); + subtitleListView1.HideColumn(SubtitleListView.SubtitleColumn.CharactersPerSeconds); + subtitleListView1.HideColumn(SubtitleListView.SubtitleColumn.WordsPerMinute); + UiUtil.InitializeSubtitleFont(subtitleListView2); + subtitleListView2.HideColumn(SubtitleListView.SubtitleColumn.CharactersPerSeconds); + subtitleListView2.HideColumn(SubtitleListView.SubtitleColumn.WordsPerMinute); + UiUtil.FixLargeFonts(this, buttonOK); + subtitleListView1.UseSyntaxColoring = false; + subtitleListView2.UseSyntaxColoring = false; + openFileDialog1.Filter = UiUtil.SubtitleExtensionFilter.Value; + LoadConfigurations(); + buttonExport.Enabled = false; + } + + public void Initialize(Subtitle subtitle1, string subtitleFileName1, string title) + { + Compare_Resize(null, null); + labelStatus.Text = string.Empty; + _subtitle1 = subtitle1; + labelSubtitle1.Text = subtitleFileName1; + if (string.IsNullOrEmpty(subtitleFileName1)) + { + labelSubtitle1.Text = title; + } + + subtitleListView1.Fill(subtitle1); + + if (!string.IsNullOrEmpty(subtitleFileName1)) + { + try + { + openFileDialog1.InitialDirectory = Path.GetDirectoryName(subtitleFileName1); + } + catch + { + // ignored + } + } + subtitleListView1.SelectIndexAndEnsureVisible(0); + _language1 = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle1); + } + + public void Initialize(Subtitle subtitle1, string subtitleFileName1, Subtitle subtitle2, string subtitleFileName2) + { + Compare_Resize(null, null); + labelStatus.Text = string.Empty; + _subtitle1 = subtitle1; + labelSubtitle1.Text = subtitleFileName1; + + _subtitle2 = subtitle2; + labelSubtitle2.Text = subtitleFileName2; + + _language1 = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle1); + CompareSubtitles(); + + if (!string.IsNullOrEmpty(subtitleFileName1) && File.Exists(subtitleFileName1)) + { + openFileDialog1.InitialDirectory = Path.GetDirectoryName(subtitleFileName1); + } + + subtitleListView1.SelectIndexAndEnsureVisible(0); + subtitleListView2.SelectIndexAndEnsureVisible(0); + } + + private void ButtonOpenSubtitle1Click(object sender, EventArgs e) + { + openFileDialog1.FileName = string.Empty; + + if (openFileDialog1.ShowDialog() == DialogResult.OK) + { + if (FileUtil.IsVobSub(openFileDialog1.FileName) || FileUtil.IsBluRaySup(openFileDialog1.FileName)) + { + MessageBox.Show(Configuration.Settings.Language.CompareSubtitles.CannotCompareWithImageBasedSubtitles); + return; + } + _subtitle1 = LoadSubtitle(openFileDialog1.FileName); + + subtitleListView1.Fill(_subtitle1); + subtitleListView1.SelectIndexAndEnsureVisible(0); + subtitleListView2.SelectIndexAndEnsureVisible(0); + labelSubtitle1.Text = openFileDialog1.FileName; + _language1 = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle1); + if (_subtitle1.Paragraphs.Count > 0 && _subtitle2?.Paragraphs.Count > 0) + { + CompareSubtitles(); + } + } + } + + private static Subtitle LoadSubtitle(string fileName) + { + var subtitle = new Subtitle(); + var format = subtitle.LoadSubtitle(fileName, out _, null); + if (format == null) + { + foreach (var f in SubtitleFormat.GetBinaryFormats(false)) + { + if (f.IsMine(null, fileName)) + { + f.LoadSubtitle(subtitle, null, fileName); + break; // format found, exit the loop + } + } + } + return subtitle; + } + + private void ButtonOpenSubtitle2Click(object sender, EventArgs e) + { + openFileDialog1.FileName = string.Empty; + + if (openFileDialog1.ShowDialog() == DialogResult.OK) + { + if (FileUtil.IsVobSub(openFileDialog1.FileName) || FileUtil.IsBluRaySup(openFileDialog1.FileName)) + { + MessageBox.Show(Configuration.Settings.Language.CompareSubtitles.CannotCompareWithImageBasedSubtitles); + return; + } + + _subtitle2 = LoadSubtitle(openFileDialog1.FileName); + + subtitleListView2.Fill(_subtitle2); + subtitleListView1.SelectIndexAndEnsureVisible(0); + subtitleListView2.SelectIndexAndEnsureVisible(0); + labelSubtitle2.Text = openFileDialog1.FileName; + if (_subtitle2.Paragraphs.Count > 0 && _subtitle1?.Paragraphs.Count > 0) + { + CompareSubtitles(); + } + } + } + + private void CompareSubtitles() + { + if (_loadingConfig || _subtitle2 == null || _subtitle2.Paragraphs.Count == 0) + { + return; + } + buttonExport.Enabled = true; + timer1.Stop(); + var sub1 = new Subtitle(_subtitle1); + var sub2 = new Subtitle(_subtitle2); + + int index = 0; + Paragraph p1 = sub1.GetParagraphOrDefault(index); + Paragraph p2 = sub2.GetParagraphOrDefault(index); + int max = Math.Max(sub1.Paragraphs.Count, sub2.Paragraphs.Count); + while (index < max) + { + if (p1 != null && p2 != null && GetColumnsEqualExceptNumberAndDuration(p1, p2) == 0) + { + for (int i = index + 1; i < max; i++) + { + // Try to find atleast two matching properties + if (GetColumnsEqualExceptNumber(sub1.GetParagraphOrDefault(i), p2) > 1) + { + for (int j = index; j < i; j++) + { + sub2.Paragraphs.Insert(index++, new Paragraph()); + } + break; + } + if (GetColumnsEqualExceptNumber(p1, sub2.GetParagraphOrDefault(i)) > 1) + { + for (int j = index; j < i; j++) + { + sub1.Paragraphs.Insert(index++, new Paragraph()); + } + break; + } + } + } + index++; + p1 = sub1.GetParagraphOrDefault(index); + p2 = sub2.GetParagraphOrDefault(index); + } + + var minSub = sub1.Paragraphs.Count < sub2.Paragraphs.Count ? sub1 : sub2; + for (var idx = minSub.Paragraphs.Count; idx < max; idx++) + { + minSub.Paragraphs.Insert(idx, new Paragraph()); + } + + subtitleListView1.Fill(sub1); + subtitleListView2.Fill(sub2); + + // coloring + differences index list + _differences = new List(); + index = 0; + p1 = sub1.GetParagraphOrDefault(index); + p2 = sub2.GetParagraphOrDefault(index); + int totalWords = 0; + int wordsChanged = 0; + max = Math.Max(sub1.Paragraphs.Count, sub2.Paragraphs.Count); + int min = Math.Min(sub1.Paragraphs.Count, sub2.Paragraphs.Count); + var onlyTextDiff = checkBoxOnlyListDifferencesInText.Checked; + + if (onlyTextDiff) + { + while (index < min) + { + bool addIndexToDifferences = false; + Utilities.GetTotalAndChangedWords(p1.Text, p2.Text, ref totalWords, ref wordsChanged, checkBoxIgnoreLineBreaks.Checked, checkBoxIgnoreFormatting.Checked, ShouldBreakToLetter()); + if (p1.IsDefault) + { + addIndexToDifferences = true; + subtitleListView1.ColorOut(index, Color.Salmon); + } + else if (p2.IsDefault) + { + addIndexToDifferences = true; + subtitleListView2.ColorOut(index, Color.Salmon); + } + else if (FixWhitespace(p1.Text) != FixWhitespace(p2.Text)) + { + addIndexToDifferences = true; + subtitleListView1.SetBackgroundColor(index, Color.LightGreen, subtitleListView1.ColumnIndexText); + subtitleListView2.SetBackgroundColor(index, Color.LightGreen, subtitleListView2.ColumnIndexText); + } + if (addIndexToDifferences) + { + _differences.Add(index); + } + index++; + p1 = sub1.GetParagraphOrDefault(index); + p2 = sub2.GetParagraphOrDefault(index); + } + } + else + { + const double tolerance = 0.1; + while (index < min) + { + Utilities.GetTotalAndChangedWords(p1.Text, p2.Text, ref totalWords, ref wordsChanged, checkBoxIgnoreLineBreaks.Checked, checkBoxIgnoreFormatting.Checked, ShouldBreakToLetter()); + bool addIndexToDifferences = false; + if (p1.IsDefault) + { + addIndexToDifferences = true; + subtitleListView1.ColorOut(index, Color.Salmon); + } + else if (p2.IsDefault) + { + addIndexToDifferences = true; + subtitleListView2.ColorOut(index, Color.Salmon); + } + else + { + int columnsAlike = GetColumnsEqualExceptNumber(p1, p2); + // Not alike paragraphs + if (columnsAlike == 0) + { + addIndexToDifferences = true; + subtitleListView1.SetBackgroundColor(index, Color.LightGreen); + subtitleListView2.SetBackgroundColor(index, Color.LightGreen); + subtitleListView1.SetBackgroundColor(index, subtitleListView1.BackColor, subtitleListView1.ColumnIndexNumber); + subtitleListView2.SetBackgroundColor(index, subtitleListView2.BackColor, subtitleListView2.ColumnIndexNumber); + } + else if (columnsAlike < 4) + { + addIndexToDifferences = true; + // Start time + if (Math.Abs(p1.StartTime.TotalMilliseconds - p2.StartTime.TotalMilliseconds) > tolerance) + { + subtitleListView1.SetBackgroundColor(index, Color.LightGreen, subtitleListView1.ColumnIndexStart); + subtitleListView2.SetBackgroundColor(index, Color.LightGreen, subtitleListView2.ColumnIndexStart); + } + // End time + if (Math.Abs(p1.EndTime.TotalMilliseconds - p2.EndTime.TotalMilliseconds) > tolerance) + { + subtitleListView1.SetBackgroundColor(index, Color.LightGreen, subtitleListView1.ColumnIndexEnd); + subtitleListView2.SetBackgroundColor(index, Color.LightGreen, subtitleListView2.ColumnIndexEnd); + } + // Duration + if (Math.Abs(p1.Duration.TotalMilliseconds - p2.Duration.TotalMilliseconds) > tolerance) + { + subtitleListView1.SetBackgroundColor(index, Color.LightGreen, subtitleListView1.ColumnIndexDuration); + subtitleListView2.SetBackgroundColor(index, Color.LightGreen, subtitleListView2.ColumnIndexDuration); + } + // Text + if (FixWhitespace(p1.Text.Trim()) != FixWhitespace(p2.Text.Trim())) + { + subtitleListView1.SetBackgroundColor(index, Color.LightGreen, subtitleListView1.ColumnIndexText); + subtitleListView2.SetBackgroundColor(index, Color.LightGreen, subtitleListView2.ColumnIndexText); + } + } + // Number + if (p1.Number != p2.Number) + { + addIndexToDifferences = true; + subtitleListView1.SetBackgroundColor(index, Color.FromArgb(255, 200, 100), subtitleListView1.ColumnIndexNumber); + subtitleListView2.SetBackgroundColor(index, Color.FromArgb(255, 200, 100), subtitleListView2.ColumnIndexNumber); + } + } + if (addIndexToDifferences) + { + _differences.Add(index); + } + index++; + p1 = sub1.GetParagraphOrDefault(index); + p2 = sub2.GetParagraphOrDefault(index); + } + } + UpdatePreviousAndNextButtons(); + + if (max > min) // color extra lines as has-difference + { + var listView = subtitleListView1.Items.Count > subtitleListView2.Items.Count ? subtitleListView1 : subtitleListView2; + for (int i = min; i < max; i++) + { + if (!onlyTextDiff) + { + listView.SetBackgroundColor(i, Color.FromArgb(255, 200, 100), listView.ColumnIndexNumber); + listView.SetBackgroundColor(i, Color.LightGreen, listView.ColumnIndexStart); + listView.SetBackgroundColor(i, Color.LightGreen, listView.ColumnIndexEnd); + listView.SetBackgroundColor(i, Color.LightGreen, listView.ColumnIndexDuration); + } + listView.SetBackgroundColor(i, Color.LightGreen, listView.ColumnIndexText); + } + } + + if (_differences.Count >= min) + { + labelStatus.Text = Configuration.Settings.Language.CompareSubtitles.SubtitlesNotAlike; + labelStatus.Font = new Font(labelStatus.Font.FontFamily, labelStatus.Font.Size, FontStyle.Bold); + } + else + { + if (wordsChanged != totalWords && wordsChanged > 0) + { + string formatString = Configuration.Settings.Language.CompareSubtitles.XNumberOfDifferenceAndPercentChanged; + if (ShouldBreakToLetter()) + { + formatString = Configuration.Settings.Language.CompareSubtitles.XNumberOfDifferenceAndPercentLettersChanged; + } + + labelStatus.Text = string.Format(formatString, _differences.Count, wordsChanged * 100.00 / totalWords); + } + else + { + labelStatus.Text = string.Format(Configuration.Settings.Language.CompareSubtitles.XNumberOfDifference, _differences.Count); + } + labelStatus.Font = new Font(labelStatus.Font.FontFamily, labelStatus.Font.Size); + } + + if (checkBoxShowOnlyDifferences.Checked) + { // Remove all lines with no difference + subtitleListView1.BeginUpdate(); + subtitleListView2.BeginUpdate(); + if (_differences.Count < min) + { + for (index = Math.Max(subtitleListView1.Items.Count, subtitleListView2.Items.Count) - 1; index >= 0; index--) + { + if (!_differences.Contains(index)) + { + if (subtitleListView1.Items.Count > index) + { + subtitleListView1.Items.RemoveAt(index); + } + + if (subtitleListView2.Items.Count > index) + { + subtitleListView2.Items.RemoveAt(index); + } + } + } + } + subtitleListView1.EndUpdate(); + subtitleListView2.EndUpdate(); + _differences = new List(); + max = Math.Max(subtitleListView1.Items.Count, subtitleListView2.Items.Count); + for (index = 0; index < max; index++) + { + _differences.Add(index); + } + } + timer1.Start(); + subtitleListView1.FirstVisibleIndex = -1; + subtitleListView1.SelectIndexAndEnsureVisible(0); + } + + private bool ShouldBreakToLetter() => _language1 != null && (_language1 == "ja" || _language1 == "zh"); + + private string FixWhitespace(string p) + { + if (checkBoxIgnoreLineBreaks.Checked) + { + p = p.Replace(Environment.NewLine, " "); + while (p.Contains(" ")) + { + p = p.Replace(" ", " "); + } + } + + if (checkBoxIgnoreFormatting.Checked) + { + p = HtmlUtil.RemoveHtmlTags(p, true); + } + + return p; + } + + private int GetColumnsEqualExceptNumber(Paragraph p1, Paragraph p2) + { + if (p1 == null || p2 == null) + { + return 0; + } + + const double tolerance = 0.1; + + int columnsEqual = 0; + if (Math.Abs(p1.StartTime.TotalMilliseconds - p2.StartTime.TotalMilliseconds) < tolerance) + { + columnsEqual++; + } + + if (Math.Abs(p1.EndTime.TotalMilliseconds - p2.EndTime.TotalMilliseconds) < tolerance) + { + columnsEqual++; + } + + if (Math.Abs(p1.Duration.TotalMilliseconds - p2.Duration.TotalMilliseconds) < tolerance) + { + columnsEqual++; + } + + if (p1.Text.Trim() == p2.Text.Trim() || + checkBoxIgnoreFormatting.Checked && HtmlUtil.RemoveHtmlTags(p1.Text.Trim()) == HtmlUtil.RemoveHtmlTags(p2.Text.Trim())) + { + columnsEqual++; + } + + return columnsEqual; + } + + private int GetColumnsEqualExceptNumberAndDuration(Paragraph p1, Paragraph p2) + { + if (p1 == null || p2 == null) + { + return 0; + } + + const double tolerance = 0.1; + + int columnsEqual = 0; + if (Math.Abs(p1.StartTime.TotalMilliseconds - p2.StartTime.TotalMilliseconds) < tolerance) + { + columnsEqual++; + } + + if (Math.Abs(p1.EndTime.TotalMilliseconds - p2.EndTime.TotalMilliseconds) < tolerance) + { + columnsEqual++; + } + + if (p1.Text.Trim() == p2.Text.Trim() || + checkBoxIgnoreFormatting.Checked && HtmlUtil.RemoveHtmlTags(p1.Text.Trim()) == HtmlUtil.RemoveHtmlTags(p2.Text.Trim())) + { + columnsEqual++; + } + + return columnsEqual; + } + + private void ButtonOkClick(object sender, EventArgs e) + { + Close(); + } + + private void Compare_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + Close(); + } + else if (e.KeyCode == Keys.Enter && buttonNextDifference.Enabled) + { + ButtonNextDifferenceClick(null, null); + } + else if (e.KeyCode == Keys.Right && buttonNextDifference.Enabled) + { + ButtonNextDifferenceClick(null, null); + } + else if (e.KeyCode == Keys.Left && buttonPreviousDifference.Enabled) + { + ButtonPreviousDifferenceClick(null, null); + } + else if (_mainGeneralGoToNextSubtitle == e.KeyData || (e.KeyCode == Keys.Down && e.Modifiers == Keys.Alt)) + { + SubtitleListView lv = subtitleListView1; + if (subtitleListView2.Focused) + { + lv = subtitleListView2; + } + + int selectedIndex = 0; + if (lv.SelectedItems.Count > 0) + { + selectedIndex = lv.SelectedItems[0].Index; + selectedIndex++; + } + lv.SelectIndexAndEnsureVisible(selectedIndex); + } + else if (_mainGeneralGoToPrevSubtitle == e.KeyData || (e.KeyCode == Keys.Up && e.Modifiers == Keys.Alt)) + { + SubtitleListView lv = subtitleListView1; + if (subtitleListView2.Focused) + { + lv = subtitleListView2; + } + + int selectedIndex = 0; + if (lv.SelectedItems.Count > 0) + { + selectedIndex = lv.SelectedItems[0].Index; + selectedIndex--; + } + lv.SelectIndexAndEnsureVisible(selectedIndex); + } + } + + private void SubtitleListView1SelectedIndexChanged(object sender, EventArgs e) + { + UpdatePreviousAndNextButtons(); + ShowText(); + } + + private void ShowText() + { + string text1 = string.Empty; + string text2 = string.Empty; + + if (subtitleListView1.SelectedItems.Count == 1) + { + text1 = subtitleListView1.GetText(subtitleListView1.SelectedItems[0].Index); + + if (subtitleListView2.Items.Count > subtitleListView1.SelectedItems[0].Index) + { + text2 = subtitleListView2.GetText(subtitleListView1.SelectedItems[0].Index); + } + } + richTextBox1.Text = text1; + richTextBox2.Text = text2; + + // show diff + if (string.IsNullOrWhiteSpace(text1) || string.IsNullOrWhiteSpace(text2) || text1 == text2) + { + return; + } + + ShowTextDifference(); + } + + private void ShowTextDifference() + { + // from start + int minLength = Math.Min(richTextBox1.Text.Length, richTextBox2.Text.Length); + int startCharactersOk = 0; + for (int i = 0; i < minLength; i++) + { + if (richTextBox1.Text[i] == richTextBox2.Text[i]) + { + startCharactersOk++; + } + else + { + if (richTextBox1.Text.Length > i + 4 && richTextBox2.Text.Length > i + 4 && + richTextBox1.Text[i + 1] == richTextBox2.Text[i + 1] && + richTextBox1.Text[i + 2] == richTextBox2.Text[i + 2] && + richTextBox1.Text[i + 3] == richTextBox2.Text[i + 3] && + richTextBox1.Text[i + 4] == richTextBox2.Text[i + 4]) + { + startCharactersOk++; + + richTextBox1.SelectionStart = i; + richTextBox1.SelectionLength = 1; + richTextBox1.SelectionColor = _foregroundDifferenceColor; + if (" .,".Contains(richTextBox1.SelectedText)) + { + richTextBox1.SelectionBackColor = _backDifferenceColor; + richTextBox1.SelectionColor = DefaultForeColor; + } + + richTextBox2.SelectionStart = i; + richTextBox2.SelectionLength = 1; + richTextBox2.SelectionColor = _foregroundDifferenceColor; + if (" .,".Contains(richTextBox2.SelectedText)) + { + richTextBox2.SelectionBackColor = _backDifferenceColor; + richTextBox2.SelectionColor = DefaultForeColor; + } + } + else + { + break; + } + } + } + + int maxLength = Math.Max(richTextBox1.Text.Length, richTextBox2.Text.Length); + for (int i = startCharactersOk; i < maxLength; i++) + { + if (i < richTextBox1.Text.Length) + { + richTextBox1.SelectionStart = i; + richTextBox1.SelectionLength = 1; + richTextBox1.SelectionColor = _backDifferenceColor; + if (" .,".Contains(richTextBox1.SelectedText)) + { + richTextBox1.SelectionBackColor = _backDifferenceColor; + richTextBox1.SelectionColor = DefaultForeColor; + } + } + if (i < richTextBox2.Text.Length) + { + richTextBox2.SelectionStart = i; + richTextBox2.SelectionLength = 1; + richTextBox2.SelectionColor = _foregroundDifferenceColor; + if (" .,".Contains(richTextBox2.SelectedText)) + { + richTextBox2.SelectionBackColor = _backDifferenceColor; + richTextBox2.SelectionColor = DefaultForeColor; + } + } + } + + // from end + for (int i = 1; i < minLength; i++) + { + if (richTextBox1.Text.Length - i < startCharactersOk || richTextBox2.Text.Length - i < startCharactersOk) + { + break; + } + + if (richTextBox1.Text[richTextBox1.Text.Length - i] == richTextBox2.Text[richTextBox2.Text.Length - i]) + { + richTextBox1.SelectionStart = richTextBox1.Text.Length - i; + richTextBox1.SelectionLength = 1; + richTextBox1.SelectionColor = Color.Black; + richTextBox1.SelectionBackColor = richTextBox1.BackColor; + + richTextBox2.SelectionStart = richTextBox2.Text.Length - i; + richTextBox2.SelectionLength = 1; + richTextBox2.SelectionColor = Color.Black; + richTextBox2.SelectionBackColor = richTextBox1.BackColor; + } + else + { + break; + } + } + + // special situation - equal, but one has more chars + if (richTextBox1.Text.Length > richTextBox2.Text.Length) + { + if (richTextBox1.Text.StartsWith(richTextBox2.Text, StringComparison.Ordinal)) + { + richTextBox1.SelectionStart = richTextBox2.Text.Length; + richTextBox1.SelectionLength = richTextBox1.Text.Length - richTextBox2.Text.Length; + richTextBox1.SelectionBackColor = _backDifferenceColor; + } + } + else if (richTextBox2.Text.Length > richTextBox1.Text.Length) + { + if (richTextBox2.Text.StartsWith(richTextBox1.Text, StringComparison.Ordinal)) + { + richTextBox2.SelectionStart = richTextBox1.Text.Length; + richTextBox2.SelectionLength = richTextBox2.Text.Length - richTextBox1.Text.Length; + richTextBox2.SelectionColor = _foregroundDifferenceColor; + } + } + } + + private void UpdatePreviousAndNextButtons() + { + if (subtitleListView1.Items.Count > 0 && subtitleListView2.Items.Count > 0 && + _differences != null && _differences.Count > 0) + { + if (subtitleListView1.SelectedItems.Count == 0) + { + buttonPreviousDifference.Enabled = false; + buttonNextDifference.Enabled = true; + } + else + { + int index = subtitleListView1.SelectedItems[0].Index; + buttonPreviousDifference.Enabled = _differences[0] < index; + buttonNextDifference.Enabled = _differences[_differences.Count - 1] > index; + } + } + else + { + buttonPreviousDifference.Enabled = false; + buttonNextDifference.Enabled = false; + } + } + + private void SubtitleListView2SelectedIndexChanged(object sender, EventArgs e) + { + UpdatePreviousAndNextButtons(); + } + + private void Compare_Resize(object sender, EventArgs e) + { + subtitleListView1.Width = (Width / 2) - 20; + + subtitleListView2.Left = (Width / 2) - 3; + subtitleListView2.Width = (Width / 2) - 20; + labelSubtitle2.Left = subtitleListView2.Left; + buttonOpenSubtitle2.Left = subtitleListView2.Left; + + subtitleListView1.Height = Height - (subtitleListView1.Top + 140); + subtitleListView2.Height = Height - (subtitleListView2.Top + 140); + + richTextBox1.Width = subtitleListView1.Width; + richTextBox2.Width = subtitleListView2.Width; + richTextBox2.Left = subtitleListView2.Left; + } + + private void ButtonPreviousDifferenceClick(object sender, EventArgs e) + { + if (_differences != null && _differences.Count > 0) + { + if (subtitleListView1.SelectedItems.Count == 0) + { + subtitleListView1.SelectIndexAndEnsureVisible(_differences[0]); + } + else + { + for (int i = subtitleListView1.SelectedItems[0].Index - 1; i >= 0; i--) + { + if (_differences.Contains(i)) + { + subtitleListView1.SelectIndexAndEnsureVisible(i - 2); + subtitleListView1.SelectIndexAndEnsureVisible(i + 2); + subtitleListView1.SelectIndexAndEnsureVisible(i); + break; + } + } + } + } + } + + private void ButtonNextDifferenceClick(object sender, EventArgs e) + { + if (_differences != null && _differences.Count > 0) + { + if (subtitleListView1.SelectedItems.Count == 0) + { + subtitleListView1.SelectIndexAndEnsureVisible(_differences[0]); + } + else + { + for (int i = subtitleListView1.SelectedItems[0].Index + 1; i < subtitleListView1.Items.Count; i++) + { + if (_differences.Contains(i)) + { + subtitleListView1.SelectIndexAndEnsureVisible(i - 2); + subtitleListView1.SelectIndexAndEnsureVisible(i + 2); + subtitleListView1.SelectIndexAndEnsureVisible(i); + subtitleListView1.Focus(); + break; + } + } + } + } + } + + private void Timer1Tick(object sender, EventArgs e) + { + if (subtitleListView1.TopItem == null || subtitleListView2.TopItem == null) + { + return; + } + + char activeListView; + var p = PointToClient(MousePosition); + if (p.X >= subtitleListView1.Left && p.X <= subtitleListView1.Left + subtitleListView1.Width + 2) + { + activeListView = 'L'; + } + else if (p.X >= subtitleListView2.Left && p.X <= subtitleListView2.Left + subtitleListView2.Width + 2) + { + activeListView = 'R'; + } + else + { + return; + } + + if (subtitleListView1.SelectedItems.Count > 0 && activeListView == 'L') + { + if (subtitleListView2.SelectedItems.Count > 0 && + subtitleListView1.SelectedItems[0].Index == subtitleListView2.SelectedItems[0].Index) + { + if (subtitleListView1.TopItem.Index != subtitleListView2.TopItem.Index && + subtitleListView2.Items.Count > subtitleListView1.TopItem.Index) + { + subtitleListView2.TopItem = subtitleListView2.Items[subtitleListView1.TopItem.Index]; + } + + return; + } + subtitleListView2.SelectedIndexChanged -= SubtitleListView2SelectedIndexChanged; + subtitleListView2.SelectIndexAndEnsureVisible(subtitleListView1.SelectedItems[0].Index); + if (subtitleListView1.TopItem.Index != subtitleListView2.TopItem.Index && + subtitleListView2.Items.Count > subtitleListView1.TopItem.Index) + { + subtitleListView2.TopItem = subtitleListView2.Items[subtitleListView1.TopItem.Index]; + } + + subtitleListView2.SelectedIndexChanged += SubtitleListView2SelectedIndexChanged; + } + else if (subtitleListView2.SelectedItems.Count > 0 && activeListView == 'R') + { + if (subtitleListView1.SelectedItems.Count > 0 && + subtitleListView2.SelectedItems[0].Index == subtitleListView1.SelectedItems[0].Index) + { + if (subtitleListView2.TopItem.Index != subtitleListView1.TopItem.Index && + subtitleListView1.Items.Count > subtitleListView2.TopItem.Index) + { + subtitleListView1.TopItem = subtitleListView1.Items[subtitleListView2.TopItem.Index]; + } + + return; + } + subtitleListView1.SelectIndexAndEnsureVisible(subtitleListView2.SelectedItems[0].Index); + if (subtitleListView2.TopItem.Index != subtitleListView1.TopItem.Index && + subtitleListView1.Items.Count > subtitleListView2.TopItem.Index) + { + subtitleListView1.TopItem = subtitleListView1.Items[subtitleListView2.TopItem.Index]; + } + } + } + + private void Compare_FormClosing(object sender, FormClosingEventArgs e) + { + timer1.Stop(); + SaveConfigurations(); + } + + private void checkBoxShowOnlyDifferences_CheckedChanged(object sender, EventArgs e) + { + CompareSubtitles(); + } + + private void checkBoxOnlyListDifferencesInText_CheckedChanged(object sender, EventArgs e) + { + CompareSubtitles(); + } + + private void checkBoxIgnoreLineBreaks_CheckedChanged(object sender, EventArgs e) + { + CompareSubtitles(); + } + + private void labelSubtitle1_MouseHover(object sender, EventArgs e) + { + ShowTip(labelSubtitle1); + } + + private void labelSubtitle2_MouseHover(object sender, EventArgs e) + { + ShowTip(labelSubtitle2); + } + + private void ShowTip(Control control) + { + var text = control.Text; + if (!string.IsNullOrEmpty(text)) + { + try + { + text = Path.GetFileName(text); + } + catch + { + // not a path + } + toolTip1.Show(text, control); + } + } + + private void subtitleListView1_DragEnter(object sender, DragEventArgs e) + { + VerifyDragEnter(e); + } + + private void subtitleListView2_DragEnter(object sender, DragEventArgs e) + { + VerifyDragEnter(e); + } + + private static void VerifyDragEnter(DragEventArgs e) + { + e.Effect = e.Data.GetDataPresent(DataFormats.FileDrop) ? DragDropEffects.Copy : DragDropEffects.None; + } + + private void subtitleListView1_DragDrop(object sender, DragEventArgs e) + { + VerifyDragDrop((sender as ListView), e); + } + + private void subtitleListView2_DragDrop(object sender, DragEventArgs e) + { + VerifyDragDrop((sender as ListView), e); + } + + private void VerifyDragDrop(ListView listView, DragEventArgs e) + { + var files = e.Data.GetData(DataFormats.FileDrop) as string[]; + if (files == null) + { + return; + } + if (files.Length > 1) + { + MessageBox.Show(Configuration.Settings.Language.Main.DropOnlyOneFile, + string.Empty, MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + string filePath = files[0]; + if (FileUtil.IsDirectory(filePath)) + { + MessageBox.Show(Configuration.Settings.Language.Main.ErrorDirectoryDropNotAllowed, + string.Empty, MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + var listExt = new List(); + foreach (var s in UiUtil.SubtitleExtensionFilter.Value.Split(new[] { '*' }, StringSplitOptions.RemoveEmptyEntries)) + { + if (s.EndsWith(';')) + { + listExt.Add(s.Trim(';')); + } + } + if (!listExt.Contains(Path.GetExtension(filePath))) + { + return; + } + + if (FileUtil.IsVobSub(filePath) || FileUtil.IsBluRaySup(filePath)) + { + MessageBox.Show(Configuration.Settings.Language.CompareSubtitles.CannotCompareWithImageBasedSubtitles); + return; + } + + if (listView.Name == "subtitleListView1") + { + _subtitle1 = new Subtitle(); + _subtitle1.LoadSubtitle(filePath, out _, null); + subtitleListView1.Fill(_subtitle1); + subtitleListView1.SelectIndexAndEnsureVisible(0); + subtitleListView2.SelectIndexAndEnsureVisible(0); + labelSubtitle1.Text = filePath; + _language1 = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle1); + if (_subtitle1.Paragraphs.Count > 0) + { + CompareSubtitles(); + } + } + else + { + _subtitle2 = new Subtitle(); + _subtitle2.LoadSubtitle(filePath, out _, null); + subtitleListView2.Fill(_subtitle2); + subtitleListView1.SelectIndexAndEnsureVisible(0); + subtitleListView2.SelectIndexAndEnsureVisible(0); + labelSubtitle2.Text = filePath; + if (_subtitle2.Paragraphs.Count > 0) + { + CompareSubtitles(); + } + } + } + + private void copyTextToolStripMenuItem_Click(object sender, EventArgs e) + { + CopyTextToClipboard(richTextBox1); + } + + private void copyTextToolStripMenuItem1_Click(object sender, EventArgs e) + { + CopyTextToClipboard(richTextBox2); + } + + private static void CopyTextToClipboard(RichTextBox sender) + { + if (string.IsNullOrWhiteSpace(sender.Text)) + { + return; + } + + if (sender.SelectedText.Length > 0) + { + Clipboard.SetText(sender.SelectedText); + return; + } + Clipboard.SetText(sender.Text); + } + + private void LoadConfigurations() + { + var config = Configuration.Settings.Compare; + checkBoxShowOnlyDifferences.Checked = config.ShowOnlyDifferences; + checkBoxOnlyListDifferencesInText.Checked = config.OnlyLookForDifferenceInText; + checkBoxIgnoreLineBreaks.Checked = config.IgnoreLineBreaks; + checkBoxIgnoreFormatting.Checked = config.IgnoreFormatting; + _loadingConfig = false; + } + + private void SaveConfigurations() + { + var config = Configuration.Settings.Compare; + config.ShowOnlyDifferences = checkBoxShowOnlyDifferences.Checked; + config.OnlyLookForDifferenceInText = checkBoxOnlyListDifferencesInText.Checked; + config.IgnoreLineBreaks = checkBoxIgnoreLineBreaks.Checked; + config.IgnoreFormatting = checkBoxIgnoreFormatting.Checked; + } + + private void checkBoxIgnoreFormatting_CheckedChanged(object sender, EventArgs e) + { + CompareSubtitles(); + } + + private void Compare_Shown(object sender, EventArgs e) + { + Activate(); + } + + private void buttonExport_Click(object sender, EventArgs e) + { + using (var saveFile = new SaveFileDialog { Filter = "Html files|*.html" }) + { + if (saveFile.ShowDialog() == DialogResult.OK) + { + string fileName = saveFile.FileName; + var sb = new StringBuilder(); + sb.AppendLine(""); + sb.AppendLine(""); + sb.AppendLine(" "); + sb.AppendLine(" Subtitle Edit compare"); + sb.AppendLine(" "); + sb.AppendLine(" "); + sb.AppendLine(" "); + sb.AppendLine("

Subtitle Edit compare

"); + sb.AppendLine(" "); + sb.AppendLine(" "); + sb.AppendLine(" "); + sb.AppendLine(" "); + sb.AppendLine(" "); + sb.AppendLine(" "); + for (int i = 0; i < subtitleListView1.Items.Count; i++) + { + var itemLeft = subtitleListView1.Items[i].Tag as Paragraph; + var itemRight = subtitleListView2.Items[i].Tag as Paragraph; + if (itemLeft != null && itemRight != null) + { + sb.AppendLine(" "); + sb.AppendLine(" " + GetHtmlText(itemLeft, itemLeft.Number.ToString()) + ""); + sb.AppendLine(" " + GetHtmlText(itemLeft, itemLeft.StartTime.ToShortDisplayString()) + ""); + if (subtitleListView1.ColumnIndexEnd >= 0) + { + sb.AppendLine(" " + GetHtmlText(itemLeft, itemLeft.EndTime.ToShortDisplayString()) + ""); + } + sb.AppendLine(" " + GetHtmlText(itemLeft, itemLeft.Text) + ""); + sb.AppendLine(" "); + sb.AppendLine(" " + GetHtmlText(itemRight, itemRight.Number.ToString()) + ""); + sb.AppendLine(" " + GetHtmlText(itemRight, itemRight.StartTime.ToShortDisplayString()) + ""); + if (subtitleListView2.ColumnIndexEnd >= 0) + { + sb.AppendLine(" " + GetHtmlText(itemRight, itemRight.EndTime.ToShortDisplayString()) + ""); + } + sb.AppendLine(" " + GetHtmlText(itemRight, itemRight.Text) + ""); + sb.AppendLine(" "); + } + } + sb.AppendLine(" "); + sb.AppendLine(" "); + sb.AppendLine(" "); + sb.AppendLine("
" + labelSubtitle1.Text + " " + labelSubtitle2.Text + "
 

" + labelStatus.Text + "
"); + sb.AppendLine(" "); + sb.AppendLine(""); + File.WriteAllText(fileName, sb.ToString()); + } + } + } + + private string GetHtmlText(Paragraph p, string text) + { + if (p.IsDefault) + { + return string.Empty; + } + return HtmlUtil.EncodeNamed(text); + } + + private string GetHtmlBackgroundColor(ListViewItem.ListViewSubItem item) + { + if (item.BackColor == DefaultBackColor) + { + return string.Empty; + } + return " style='background-color:" + ColorTranslator.ToHtml(item.BackColor) + "'"; + } + } +} diff --git a/src/Forms/Compare.resx b/src/ui/Forms/Compare.resx similarity index 98% rename from src/Forms/Compare.resx rename to src/ui/Forms/Compare.resx index 3683cb38d..56ba09b05 100644 --- a/src/Forms/Compare.resx +++ b/src/ui/Forms/Compare.resx @@ -1,135 +1,135 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - 147, 17 - - - 331, 17 - - - 486, 17 - - - 234, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 147, 17 + + + 331, 17 + + + 486, 17 + + + 234, 17 + \ No newline at end of file diff --git a/src/Forms/DCinema/DCinemaPropertiesInterop.Designer.cs b/src/ui/Forms/DCinema/DCinemaPropertiesInterop.Designer.cs similarity index 100% rename from src/Forms/DCinema/DCinemaPropertiesInterop.Designer.cs rename to src/ui/Forms/DCinema/DCinemaPropertiesInterop.Designer.cs diff --git a/src/Forms/DCinema/DCinemaPropertiesInterop.cs b/src/ui/Forms/DCinema/DCinemaPropertiesInterop.cs similarity index 100% rename from src/Forms/DCinema/DCinemaPropertiesInterop.cs rename to src/ui/Forms/DCinema/DCinemaPropertiesInterop.cs diff --git a/src/Forms/DCinema/DCinemaPropertiesInterop.resx b/src/ui/Forms/DCinema/DCinemaPropertiesInterop.resx similarity index 100% rename from src/Forms/DCinema/DCinemaPropertiesInterop.resx rename to src/ui/Forms/DCinema/DCinemaPropertiesInterop.resx diff --git a/src/Forms/DCinema/DCinemaPropertiesSmpte.Designer.cs b/src/ui/Forms/DCinema/DCinemaPropertiesSmpte.Designer.cs similarity index 100% rename from src/Forms/DCinema/DCinemaPropertiesSmpte.Designer.cs rename to src/ui/Forms/DCinema/DCinemaPropertiesSmpte.Designer.cs diff --git a/src/Forms/DCinema/DCinemaPropertiesSmpte.cs b/src/ui/Forms/DCinema/DCinemaPropertiesSmpte.cs similarity index 100% rename from src/Forms/DCinema/DCinemaPropertiesSmpte.cs rename to src/ui/Forms/DCinema/DCinemaPropertiesSmpte.cs diff --git a/src/Forms/DCinema/DCinemaPropertiesSmpte.resx b/src/ui/Forms/DCinema/DCinemaPropertiesSmpte.resx similarity index 100% rename from src/Forms/DCinema/DCinemaPropertiesSmpte.resx rename to src/ui/Forms/DCinema/DCinemaPropertiesSmpte.resx diff --git a/src/Forms/DialogDoNotShowAgain.Designer.cs b/src/ui/Forms/DialogDoNotShowAgain.Designer.cs similarity index 100% rename from src/Forms/DialogDoNotShowAgain.Designer.cs rename to src/ui/Forms/DialogDoNotShowAgain.Designer.cs diff --git a/src/Forms/DialogDoNotShowAgain.cs b/src/ui/Forms/DialogDoNotShowAgain.cs similarity index 100% rename from src/Forms/DialogDoNotShowAgain.cs rename to src/ui/Forms/DialogDoNotShowAgain.cs diff --git a/src/Forms/ImportFinalDraft.resx b/src/ui/Forms/DialogDoNotShowAgain.resx similarity index 100% rename from src/Forms/ImportFinalDraft.resx rename to src/ui/Forms/DialogDoNotShowAgain.resx diff --git a/src/Forms/DoNotBreakAfterListEdit.Designer.cs b/src/ui/Forms/DoNotBreakAfterListEdit.Designer.cs similarity index 98% rename from src/Forms/DoNotBreakAfterListEdit.Designer.cs rename to src/ui/Forms/DoNotBreakAfterListEdit.Designer.cs index 0252200b5..29f7a0ab0 100644 --- a/src/Forms/DoNotBreakAfterListEdit.Designer.cs +++ b/src/ui/Forms/DoNotBreakAfterListEdit.Designer.cs @@ -1,214 +1,214 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class DoNotBreakAfterListEdit - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.groupBoxNamesIgonoreLists = new System.Windows.Forms.GroupBox(); - this.radioButtonRegEx = new System.Windows.Forms.RadioButton(); - this.radioButtonText = new System.Windows.Forms.RadioButton(); - this.buttonRemoveNoBreakAfter = new System.Windows.Forms.Button(); - this.listBoxNoBreakAfter = new System.Windows.Forms.ListBox(); - this.textBoxNoBreakAfter = new System.Windows.Forms.TextBox(); - this.buttonAddNoBreakAfter = new System.Windows.Forms.Button(); - this.comboBoxDictionaries = new System.Windows.Forms.ComboBox(); - this.labelLanguage = new System.Windows.Forms.Label(); - this.buttonOK = new System.Windows.Forms.Button(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.groupBoxNamesIgonoreLists.SuspendLayout(); - this.SuspendLayout(); - // - // groupBoxNamesIgonoreLists - // - this.groupBoxNamesIgonoreLists.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxNamesIgonoreLists.Controls.Add(this.radioButtonRegEx); - this.groupBoxNamesIgonoreLists.Controls.Add(this.radioButtonText); - this.groupBoxNamesIgonoreLists.Controls.Add(this.buttonRemoveNoBreakAfter); - this.groupBoxNamesIgonoreLists.Controls.Add(this.listBoxNoBreakAfter); - this.groupBoxNamesIgonoreLists.Controls.Add(this.textBoxNoBreakAfter); - this.groupBoxNamesIgonoreLists.Controls.Add(this.buttonAddNoBreakAfter); - this.groupBoxNamesIgonoreLists.Location = new System.Drawing.Point(12, 54); - this.groupBoxNamesIgonoreLists.Name = "groupBoxNamesIgonoreLists"; - this.groupBoxNamesIgonoreLists.Size = new System.Drawing.Size(313, 304); - this.groupBoxNamesIgonoreLists.TabIndex = 2; - this.groupBoxNamesIgonoreLists.TabStop = false; - // - // radioButtonRegEx - // - this.radioButtonRegEx.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.radioButtonRegEx.AutoSize = true; - this.radioButtonRegEx.Location = new System.Drawing.Point(83, 279); - this.radioButtonRegEx.Name = "radioButtonRegEx"; - this.radioButtonRegEx.Size = new System.Drawing.Size(115, 17); - this.radioButtonRegEx.TabIndex = 5; - this.radioButtonRegEx.Text = "Regular expression"; - this.radioButtonRegEx.UseVisualStyleBackColor = true; - this.radioButtonRegEx.CheckedChanged += new System.EventHandler(this.RadioButtonCheckedChanged); - // - // radioButtonText - // - this.radioButtonText.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.radioButtonText.AutoSize = true; - this.radioButtonText.Checked = true; - this.radioButtonText.Location = new System.Drawing.Point(6, 279); - this.radioButtonText.Name = "radioButtonText"; - this.radioButtonText.Size = new System.Drawing.Size(46, 17); - this.radioButtonText.TabIndex = 4; - this.radioButtonText.TabStop = true; - this.radioButtonText.Text = "Text"; - this.radioButtonText.UseVisualStyleBackColor = true; - this.radioButtonText.CheckedChanged += new System.EventHandler(this.RadioButtonCheckedChanged); - // - // buttonRemoveNoBreakAfter - // - this.buttonRemoveNoBreakAfter.Location = new System.Drawing.Point(230, 19); - this.buttonRemoveNoBreakAfter.Name = "buttonRemoveNoBreakAfter"; - this.buttonRemoveNoBreakAfter.Size = new System.Drawing.Size(75, 23); - this.buttonRemoveNoBreakAfter.TabIndex = 1; - this.buttonRemoveNoBreakAfter.Text = "Remove"; - this.buttonRemoveNoBreakAfter.UseVisualStyleBackColor = true; - this.buttonRemoveNoBreakAfter.Click += new System.EventHandler(this.buttonRemoveNameEtc_Click); - // - // listBoxNoBreakAfter - // - this.listBoxNoBreakAfter.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left))); - this.listBoxNoBreakAfter.FormattingEnabled = true; - this.listBoxNoBreakAfter.Location = new System.Drawing.Point(6, 19); - this.listBoxNoBreakAfter.Name = "listBoxNoBreakAfter"; - this.listBoxNoBreakAfter.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended; - this.listBoxNoBreakAfter.Size = new System.Drawing.Size(218, 225); - this.listBoxNoBreakAfter.TabIndex = 0; - this.listBoxNoBreakAfter.SelectedIndexChanged += new System.EventHandler(this.listBoxNames_SelectedIndexChanged); - // - // textBoxNoBreakAfter - // - this.textBoxNoBreakAfter.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.textBoxNoBreakAfter.Location = new System.Drawing.Point(6, 250); - this.textBoxNoBreakAfter.Name = "textBoxNoBreakAfter"; - this.textBoxNoBreakAfter.Size = new System.Drawing.Size(218, 20); - this.textBoxNoBreakAfter.TabIndex = 2; - this.textBoxNoBreakAfter.KeyDown += new System.Windows.Forms.KeyEventHandler(this.textBoxNoBreakAfter_KeyDown); - // - // buttonAddNoBreakAfter - // - this.buttonAddNoBreakAfter.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonAddNoBreakAfter.Location = new System.Drawing.Point(230, 248); - this.buttonAddNoBreakAfter.Name = "buttonAddNoBreakAfter"; - this.buttonAddNoBreakAfter.Size = new System.Drawing.Size(75, 23); - this.buttonAddNoBreakAfter.TabIndex = 3; - this.buttonAddNoBreakAfter.Text = "Add"; - this.buttonAddNoBreakAfter.UseVisualStyleBackColor = true; - this.buttonAddNoBreakAfter.Click += new System.EventHandler(this.buttonAddNames_Click); - // - // comboBoxDictionaries - // - this.comboBoxDictionaries.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxDictionaries.FormattingEnabled = true; - this.comboBoxDictionaries.Location = new System.Drawing.Point(12, 27); - this.comboBoxDictionaries.Name = "comboBoxDictionaries"; - this.comboBoxDictionaries.Size = new System.Drawing.Size(224, 21); - this.comboBoxDictionaries.TabIndex = 1; - this.comboBoxDictionaries.SelectedIndexChanged += new System.EventHandler(this.comboBoxDictionaries_SelectedIndexChanged); - // - // labelLanguage - // - this.labelLanguage.AutoSize = true; - this.labelLanguage.Location = new System.Drawing.Point(12, 11); - this.labelLanguage.Name = "labelLanguage"; - this.labelLanguage.Size = new System.Drawing.Size(55, 13); - this.labelLanguage.TabIndex = 0; - this.labelLanguage.Text = "Language"; - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(166, 369); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 3; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(250, 369); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 4; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - // - // DoNotBreakAfterListEdit - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(337, 402); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.comboBoxDictionaries); - this.Controls.Add(this.labelLanguage); - this.Controls.Add(this.groupBoxNamesIgonoreLists); - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(350, 340); - this.Name = "DoNotBreakAfterListEdit"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Do not break after list - edit"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.DoNotBreakAfterListEdit_KeyDown); - this.groupBoxNamesIgonoreLists.ResumeLayout(false); - this.groupBoxNamesIgonoreLists.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.GroupBox groupBoxNamesIgonoreLists; - private System.Windows.Forms.Button buttonRemoveNoBreakAfter; - private System.Windows.Forms.ListBox listBoxNoBreakAfter; - private System.Windows.Forms.TextBox textBoxNoBreakAfter; - private System.Windows.Forms.Button buttonAddNoBreakAfter; - private System.Windows.Forms.ComboBox comboBoxDictionaries; - private System.Windows.Forms.Label labelLanguage; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.RadioButton radioButtonRegEx; - private System.Windows.Forms.RadioButton radioButtonText; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class DoNotBreakAfterListEdit + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.groupBoxNamesIgonoreLists = new System.Windows.Forms.GroupBox(); + this.radioButtonRegEx = new System.Windows.Forms.RadioButton(); + this.radioButtonText = new System.Windows.Forms.RadioButton(); + this.buttonRemoveNoBreakAfter = new System.Windows.Forms.Button(); + this.listBoxNoBreakAfter = new System.Windows.Forms.ListBox(); + this.textBoxNoBreakAfter = new System.Windows.Forms.TextBox(); + this.buttonAddNoBreakAfter = new System.Windows.Forms.Button(); + this.comboBoxDictionaries = new System.Windows.Forms.ComboBox(); + this.labelLanguage = new System.Windows.Forms.Label(); + this.buttonOK = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.groupBoxNamesIgonoreLists.SuspendLayout(); + this.SuspendLayout(); + // + // groupBoxNamesIgonoreLists + // + this.groupBoxNamesIgonoreLists.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxNamesIgonoreLists.Controls.Add(this.radioButtonRegEx); + this.groupBoxNamesIgonoreLists.Controls.Add(this.radioButtonText); + this.groupBoxNamesIgonoreLists.Controls.Add(this.buttonRemoveNoBreakAfter); + this.groupBoxNamesIgonoreLists.Controls.Add(this.listBoxNoBreakAfter); + this.groupBoxNamesIgonoreLists.Controls.Add(this.textBoxNoBreakAfter); + this.groupBoxNamesIgonoreLists.Controls.Add(this.buttonAddNoBreakAfter); + this.groupBoxNamesIgonoreLists.Location = new System.Drawing.Point(12, 54); + this.groupBoxNamesIgonoreLists.Name = "groupBoxNamesIgonoreLists"; + this.groupBoxNamesIgonoreLists.Size = new System.Drawing.Size(313, 304); + this.groupBoxNamesIgonoreLists.TabIndex = 2; + this.groupBoxNamesIgonoreLists.TabStop = false; + // + // radioButtonRegEx + // + this.radioButtonRegEx.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.radioButtonRegEx.AutoSize = true; + this.radioButtonRegEx.Location = new System.Drawing.Point(83, 279); + this.radioButtonRegEx.Name = "radioButtonRegEx"; + this.radioButtonRegEx.Size = new System.Drawing.Size(115, 17); + this.radioButtonRegEx.TabIndex = 5; + this.radioButtonRegEx.Text = "Regular expression"; + this.radioButtonRegEx.UseVisualStyleBackColor = true; + this.radioButtonRegEx.CheckedChanged += new System.EventHandler(this.RadioButtonCheckedChanged); + // + // radioButtonText + // + this.radioButtonText.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.radioButtonText.AutoSize = true; + this.radioButtonText.Checked = true; + this.radioButtonText.Location = new System.Drawing.Point(6, 279); + this.radioButtonText.Name = "radioButtonText"; + this.radioButtonText.Size = new System.Drawing.Size(46, 17); + this.radioButtonText.TabIndex = 4; + this.radioButtonText.TabStop = true; + this.radioButtonText.Text = "Text"; + this.radioButtonText.UseVisualStyleBackColor = true; + this.radioButtonText.CheckedChanged += new System.EventHandler(this.RadioButtonCheckedChanged); + // + // buttonRemoveNoBreakAfter + // + this.buttonRemoveNoBreakAfter.Location = new System.Drawing.Point(230, 19); + this.buttonRemoveNoBreakAfter.Name = "buttonRemoveNoBreakAfter"; + this.buttonRemoveNoBreakAfter.Size = new System.Drawing.Size(75, 23); + this.buttonRemoveNoBreakAfter.TabIndex = 1; + this.buttonRemoveNoBreakAfter.Text = "Remove"; + this.buttonRemoveNoBreakAfter.UseVisualStyleBackColor = true; + this.buttonRemoveNoBreakAfter.Click += new System.EventHandler(this.buttonRemoveNameEtc_Click); + // + // listBoxNoBreakAfter + // + this.listBoxNoBreakAfter.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.listBoxNoBreakAfter.FormattingEnabled = true; + this.listBoxNoBreakAfter.Location = new System.Drawing.Point(6, 19); + this.listBoxNoBreakAfter.Name = "listBoxNoBreakAfter"; + this.listBoxNoBreakAfter.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended; + this.listBoxNoBreakAfter.Size = new System.Drawing.Size(218, 225); + this.listBoxNoBreakAfter.TabIndex = 0; + this.listBoxNoBreakAfter.SelectedIndexChanged += new System.EventHandler(this.listBoxNames_SelectedIndexChanged); + // + // textBoxNoBreakAfter + // + this.textBoxNoBreakAfter.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.textBoxNoBreakAfter.Location = new System.Drawing.Point(6, 250); + this.textBoxNoBreakAfter.Name = "textBoxNoBreakAfter"; + this.textBoxNoBreakAfter.Size = new System.Drawing.Size(218, 20); + this.textBoxNoBreakAfter.TabIndex = 2; + this.textBoxNoBreakAfter.KeyDown += new System.Windows.Forms.KeyEventHandler(this.textBoxNoBreakAfter_KeyDown); + // + // buttonAddNoBreakAfter + // + this.buttonAddNoBreakAfter.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonAddNoBreakAfter.Location = new System.Drawing.Point(230, 248); + this.buttonAddNoBreakAfter.Name = "buttonAddNoBreakAfter"; + this.buttonAddNoBreakAfter.Size = new System.Drawing.Size(75, 23); + this.buttonAddNoBreakAfter.TabIndex = 3; + this.buttonAddNoBreakAfter.Text = "Add"; + this.buttonAddNoBreakAfter.UseVisualStyleBackColor = true; + this.buttonAddNoBreakAfter.Click += new System.EventHandler(this.buttonAddNames_Click); + // + // comboBoxDictionaries + // + this.comboBoxDictionaries.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxDictionaries.FormattingEnabled = true; + this.comboBoxDictionaries.Location = new System.Drawing.Point(12, 27); + this.comboBoxDictionaries.Name = "comboBoxDictionaries"; + this.comboBoxDictionaries.Size = new System.Drawing.Size(224, 21); + this.comboBoxDictionaries.TabIndex = 1; + this.comboBoxDictionaries.SelectedIndexChanged += new System.EventHandler(this.comboBoxDictionaries_SelectedIndexChanged); + // + // labelLanguage + // + this.labelLanguage.AutoSize = true; + this.labelLanguage.Location = new System.Drawing.Point(12, 11); + this.labelLanguage.Name = "labelLanguage"; + this.labelLanguage.Size = new System.Drawing.Size(55, 13); + this.labelLanguage.TabIndex = 0; + this.labelLanguage.Text = "Language"; + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(166, 369); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 3; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(250, 369); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 4; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + // + // DoNotBreakAfterListEdit + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(337, 402); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.comboBoxDictionaries); + this.Controls.Add(this.labelLanguage); + this.Controls.Add(this.groupBoxNamesIgonoreLists); + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(350, 340); + this.Name = "DoNotBreakAfterListEdit"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Do not break after list - edit"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.DoNotBreakAfterListEdit_KeyDown); + this.groupBoxNamesIgonoreLists.ResumeLayout(false); + this.groupBoxNamesIgonoreLists.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBoxNamesIgonoreLists; + private System.Windows.Forms.Button buttonRemoveNoBreakAfter; + private System.Windows.Forms.ListBox listBoxNoBreakAfter; + private System.Windows.Forms.TextBox textBoxNoBreakAfter; + private System.Windows.Forms.Button buttonAddNoBreakAfter; + private System.Windows.Forms.ComboBox comboBoxDictionaries; + private System.Windows.Forms.Label labelLanguage; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.RadioButton radioButtonRegEx; + private System.Windows.Forms.RadioButton radioButtonText; + } } \ No newline at end of file diff --git a/src/Forms/DoNotBreakAfterListEdit.cs b/src/ui/Forms/DoNotBreakAfterListEdit.cs similarity index 97% rename from src/Forms/DoNotBreakAfterListEdit.cs rename to src/ui/Forms/DoNotBreakAfterListEdit.cs index 82315fa54..eaef309e6 100644 --- a/src/Forms/DoNotBreakAfterListEdit.cs +++ b/src/ui/Forms/DoNotBreakAfterListEdit.cs @@ -1,246 +1,246 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Text.RegularExpressions; -using System.Windows.Forms; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class DoNotBreakAfterListEdit : Form - { - private readonly List _languages = new List(); - private List _noBreakAfterList = new List(); - - public DoNotBreakAfterListEdit() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - Text = Configuration.Settings.Language.Settings.UseDoNotBreakAfterList; - labelLanguage.Text = Configuration.Settings.Language.ChooseLanguage.Language; - buttonRemoveNoBreakAfter.Text = Configuration.Settings.Language.DvdSubRip.Remove; - buttonAddNoBreakAfter.Text = Configuration.Settings.Language.DvdSubRip.Add; - radioButtonText.Text = Configuration.Settings.Language.General.Text; - radioButtonRegEx.Text = Configuration.Settings.Language.MultipleReplace.RegularExpression; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - - radioButtonRegEx.Left = radioButtonText.Left + radioButtonText.Width + 10; - var idx = 0; - foreach (string fileName in Directory.GetFiles(Configuration.DictionariesDirectory, "*_NoBreakAfterList.xml")) - { - try - { - string s = Path.GetFileName(fileName); - string languageId = s.Substring(0, s.IndexOf('_')); - var ci = CultureInfo.GetCultureInfoByIetfLanguageTag(languageId); - comboBoxDictionaries.Items.Add(ci.EnglishName + " (" + ci.NativeName + ")"); - if ((Configuration.Settings.WordLists.LastLanguage ?? "en-US").StartsWith(languageId, StringComparison.OrdinalIgnoreCase)) - { - idx = _languages.Count; - } - _languages.Add(fileName); - } - catch - { - // ignored - } - } - if (comboBoxDictionaries.Items.Count > 0 && idx < comboBoxDictionaries.Items.Count) - { - comboBoxDictionaries.SelectedIndex = idx; - } - } - - private void DoNotBreakAfterListEdit_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - private void comboBoxDictionaries_SelectedIndexChanged(object sender, EventArgs e) - { - int idx = comboBoxDictionaries.SelectedIndex; - if (idx >= 0) - { - _noBreakAfterList = new List(); - var doc = new XmlDocument(); - doc.Load(_languages[idx]); - foreach (XmlNode node in doc.DocumentElement.SelectNodes("Item")) - { - if (!string.IsNullOrEmpty(node.InnerText)) - { - if (node.Attributes["RegEx"] != null && node.Attributes["RegEx"].InnerText.Equals("true", StringComparison.OrdinalIgnoreCase)) - { - var r = new Regex(node.InnerText, RegexOptions.Compiled); - _noBreakAfterList.Add(new NoBreakAfterItem(r, node.InnerText)); - } - else - { - _noBreakAfterList.Add(new NoBreakAfterItem(node.InnerText)); - } - } - } - _noBreakAfterList.Sort(); - ShowBreakAfterList(_noBreakAfterList); - } - } - - private void ShowBreakAfterList(List noBreakAfterList) - { - listBoxNoBreakAfter.Items.Clear(); - foreach (var item in noBreakAfterList) - { - if (item.Text != null) - { - listBoxNoBreakAfter.Items.Add(item); - } - } - } - - private void buttonRemoveNameEtc_Click(object sender, EventArgs e) - { - int first = 0; - var list = new List(); - foreach (int i in listBoxNoBreakAfter.SelectedIndices) - { - list.Add(i); - } - - if (list.Count > 0) - { - first = list[0]; - } - - list.Sort(); - for (int i = list.Count - 1; i >= 0; i--) - { - _noBreakAfterList.RemoveAt(list[i]); - } - ShowBreakAfterList(_noBreakAfterList); - if (first >= _noBreakAfterList.Count) - { - first = _noBreakAfterList.Count - 1; - } - - if (first >= 0) - { - listBoxNoBreakAfter.SelectedIndex = first; - } - comboBoxDictionaries.Enabled = false; - } - - private void buttonOK_Click(object sender, EventArgs e) - { - Utilities.ResetNoBreakAfterList(); - int idx = comboBoxDictionaries.SelectedIndex; - if (idx >= 0) - { - var doc = new XmlDocument(); - doc.LoadXml(""); - foreach (NoBreakAfterItem item in _noBreakAfterList) - { - XmlNode node = doc.CreateElement("Item"); - node.InnerText = item.Text; - if (item.Regex != null) - { - XmlAttribute attribute = doc.CreateAttribute("RegEx"); - attribute.InnerText = true.ToString(); - node.Attributes.Append(attribute); - } - doc.DocumentElement.AppendChild(node); - } - doc.Save(_languages[idx]); - } - DialogResult = DialogResult.OK; - } - - private void buttonAddNames_Click(object sender, EventArgs e) - { - if (string.IsNullOrWhiteSpace(textBoxNoBreakAfter.Text)) - { - return; - } - - NoBreakAfterItem item; - if (radioButtonText.Checked) - { - item = new NoBreakAfterItem(textBoxNoBreakAfter.Text); - } - else - { - if (!RegexUtils.IsValidRegex(textBoxNoBreakAfter.Text)) - { - MessageBox.Show(Configuration.Settings.Language.General.RegularExpressionIsNotValid); - return; - } - item = new NoBreakAfterItem(new Regex(textBoxNoBreakAfter.Text), textBoxNoBreakAfter.Text); - } - - foreach (NoBreakAfterItem nbai in _noBreakAfterList) - { - if ((nbai.Regex == null && item.Regex == null || nbai.Regex != null && item.Regex != null) && nbai.Text == item.Text) - { - MessageBox.Show("Text already defined"); - textBoxNoBreakAfter.Focus(); - textBoxNoBreakAfter.SelectAll(); - return; - } - } - _noBreakAfterList.Add(item); - comboBoxDictionaries.Enabled = false; - ShowBreakAfterList(_noBreakAfterList); - for (int i = 0; i < listBoxNoBreakAfter.Items.Count; i++) - { - if (listBoxNoBreakAfter.Items[i].ToString() == item.Text) - { - listBoxNoBreakAfter.SelectedIndex = i; - return; - } - } - textBoxNoBreakAfter.Text = string.Empty; - } - - private void RadioButtonCheckedChanged(object sender, EventArgs e) - { - if (sender == radioButtonRegEx) - { - textBoxNoBreakAfter.ContextMenu = FindReplaceDialogHelper.GetRegExContextMenu(textBoxNoBreakAfter); - } - else - { - textBoxNoBreakAfter.ContextMenuStrip = null; - } - } - - private void listBoxNames_SelectedIndexChanged(object sender, EventArgs e) - { - int idx = listBoxNoBreakAfter.SelectedIndex; - if (idx >= 0 && idx < _noBreakAfterList.Count) - { - NoBreakAfterItem item = _noBreakAfterList[idx]; - textBoxNoBreakAfter.Text = item.Text; - bool isRegEx = item.Regex != null; - radioButtonRegEx.Checked = isRegEx; - radioButtonText.Checked = !isRegEx; - } - } - - private void textBoxNoBreakAfter_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Enter) - { - buttonAddNames_Click(sender, e); - } - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Text.RegularExpressions; +using System.Windows.Forms; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class DoNotBreakAfterListEdit : Form + { + private readonly List _languages = new List(); + private List _noBreakAfterList = new List(); + + public DoNotBreakAfterListEdit() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + Text = Configuration.Settings.Language.Settings.UseDoNotBreakAfterList; + labelLanguage.Text = Configuration.Settings.Language.ChooseLanguage.Language; + buttonRemoveNoBreakAfter.Text = Configuration.Settings.Language.DvdSubRip.Remove; + buttonAddNoBreakAfter.Text = Configuration.Settings.Language.DvdSubRip.Add; + radioButtonText.Text = Configuration.Settings.Language.General.Text; + radioButtonRegEx.Text = Configuration.Settings.Language.MultipleReplace.RegularExpression; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + + radioButtonRegEx.Left = radioButtonText.Left + radioButtonText.Width + 10; + var idx = 0; + foreach (string fileName in Directory.GetFiles(Configuration.DictionariesDirectory, "*_NoBreakAfterList.xml")) + { + try + { + string s = Path.GetFileName(fileName); + string languageId = s.Substring(0, s.IndexOf('_')); + var ci = CultureInfo.GetCultureInfoByIetfLanguageTag(languageId); + comboBoxDictionaries.Items.Add(ci.EnglishName + " (" + ci.NativeName + ")"); + if ((Configuration.Settings.WordLists.LastLanguage ?? "en-US").StartsWith(languageId, StringComparison.OrdinalIgnoreCase)) + { + idx = _languages.Count; + } + _languages.Add(fileName); + } + catch + { + // ignored + } + } + if (comboBoxDictionaries.Items.Count > 0 && idx < comboBoxDictionaries.Items.Count) + { + comboBoxDictionaries.SelectedIndex = idx; + } + } + + private void DoNotBreakAfterListEdit_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + private void comboBoxDictionaries_SelectedIndexChanged(object sender, EventArgs e) + { + int idx = comboBoxDictionaries.SelectedIndex; + if (idx >= 0) + { + _noBreakAfterList = new List(); + var doc = new XmlDocument(); + doc.Load(_languages[idx]); + foreach (XmlNode node in doc.DocumentElement.SelectNodes("Item")) + { + if (!string.IsNullOrEmpty(node.InnerText)) + { + if (node.Attributes["RegEx"] != null && node.Attributes["RegEx"].InnerText.Equals("true", StringComparison.OrdinalIgnoreCase)) + { + var r = new Regex(node.InnerText, RegexOptions.Compiled); + _noBreakAfterList.Add(new NoBreakAfterItem(r, node.InnerText)); + } + else + { + _noBreakAfterList.Add(new NoBreakAfterItem(node.InnerText)); + } + } + } + _noBreakAfterList.Sort(); + ShowBreakAfterList(_noBreakAfterList); + } + } + + private void ShowBreakAfterList(List noBreakAfterList) + { + listBoxNoBreakAfter.Items.Clear(); + foreach (var item in noBreakAfterList) + { + if (item.Text != null) + { + listBoxNoBreakAfter.Items.Add(item); + } + } + } + + private void buttonRemoveNameEtc_Click(object sender, EventArgs e) + { + int first = 0; + var list = new List(); + foreach (int i in listBoxNoBreakAfter.SelectedIndices) + { + list.Add(i); + } + + if (list.Count > 0) + { + first = list[0]; + } + + list.Sort(); + for (int i = list.Count - 1; i >= 0; i--) + { + _noBreakAfterList.RemoveAt(list[i]); + } + ShowBreakAfterList(_noBreakAfterList); + if (first >= _noBreakAfterList.Count) + { + first = _noBreakAfterList.Count - 1; + } + + if (first >= 0) + { + listBoxNoBreakAfter.SelectedIndex = first; + } + comboBoxDictionaries.Enabled = false; + } + + private void buttonOK_Click(object sender, EventArgs e) + { + Utilities.ResetNoBreakAfterList(); + int idx = comboBoxDictionaries.SelectedIndex; + if (idx >= 0) + { + var doc = new XmlDocument(); + doc.LoadXml(""); + foreach (NoBreakAfterItem item in _noBreakAfterList) + { + XmlNode node = doc.CreateElement("Item"); + node.InnerText = item.Text; + if (item.Regex != null) + { + XmlAttribute attribute = doc.CreateAttribute("RegEx"); + attribute.InnerText = true.ToString(); + node.Attributes.Append(attribute); + } + doc.DocumentElement.AppendChild(node); + } + doc.Save(_languages[idx]); + } + DialogResult = DialogResult.OK; + } + + private void buttonAddNames_Click(object sender, EventArgs e) + { + if (string.IsNullOrWhiteSpace(textBoxNoBreakAfter.Text)) + { + return; + } + + NoBreakAfterItem item; + if (radioButtonText.Checked) + { + item = new NoBreakAfterItem(textBoxNoBreakAfter.Text); + } + else + { + if (!RegexUtils.IsValidRegex(textBoxNoBreakAfter.Text)) + { + MessageBox.Show(Configuration.Settings.Language.General.RegularExpressionIsNotValid); + return; + } + item = new NoBreakAfterItem(new Regex(textBoxNoBreakAfter.Text), textBoxNoBreakAfter.Text); + } + + foreach (NoBreakAfterItem nbai in _noBreakAfterList) + { + if ((nbai.Regex == null && item.Regex == null || nbai.Regex != null && item.Regex != null) && nbai.Text == item.Text) + { + MessageBox.Show("Text already defined"); + textBoxNoBreakAfter.Focus(); + textBoxNoBreakAfter.SelectAll(); + return; + } + } + _noBreakAfterList.Add(item); + comboBoxDictionaries.Enabled = false; + ShowBreakAfterList(_noBreakAfterList); + for (int i = 0; i < listBoxNoBreakAfter.Items.Count; i++) + { + if (listBoxNoBreakAfter.Items[i].ToString() == item.Text) + { + listBoxNoBreakAfter.SelectedIndex = i; + return; + } + } + textBoxNoBreakAfter.Text = string.Empty; + } + + private void RadioButtonCheckedChanged(object sender, EventArgs e) + { + if (sender == radioButtonRegEx) + { + textBoxNoBreakAfter.ContextMenu = FindReplaceDialogHelper.GetRegExContextMenu(textBoxNoBreakAfter); + } + else + { + textBoxNoBreakAfter.ContextMenuStrip = null; + } + } + + private void listBoxNames_SelectedIndexChanged(object sender, EventArgs e) + { + int idx = listBoxNoBreakAfter.SelectedIndex; + if (idx >= 0 && idx < _noBreakAfterList.Count) + { + NoBreakAfterItem item = _noBreakAfterList[idx]; + textBoxNoBreakAfter.Text = item.Text; + bool isRegEx = item.Regex != null; + radioButtonRegEx.Checked = isRegEx; + radioButtonText.Checked = !isRegEx; + } + } + + private void textBoxNoBreakAfter_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + buttonAddNames_Click(sender, e); + } + } + + } +} diff --git a/src/Forms/MultipleReplaceNewGroup.resx b/src/ui/Forms/DoNotBreakAfterListEdit.resx similarity index 100% rename from src/Forms/MultipleReplaceNewGroup.resx rename to src/ui/Forms/DoNotBreakAfterListEdit.resx diff --git a/src/Forms/DownloadFfmpeg.Designer.cs b/src/ui/Forms/DownloadFfmpeg.Designer.cs similarity index 100% rename from src/Forms/DownloadFfmpeg.Designer.cs rename to src/ui/Forms/DownloadFfmpeg.Designer.cs diff --git a/src/Forms/DownloadFfmpeg.cs b/src/ui/Forms/DownloadFfmpeg.cs similarity index 100% rename from src/Forms/DownloadFfmpeg.cs rename to src/ui/Forms/DownloadFfmpeg.cs diff --git a/src/Forms/NetflixFixErrors.resx b/src/ui/Forms/DownloadFfmpeg.resx similarity index 100% rename from src/Forms/NetflixFixErrors.resx rename to src/ui/Forms/DownloadFfmpeg.resx diff --git a/src/Forms/DurationsBridgeGaps.Designer.cs b/src/ui/Forms/DurationsBridgeGaps.Designer.cs similarity index 98% rename from src/Forms/DurationsBridgeGaps.Designer.cs rename to src/ui/Forms/DurationsBridgeGaps.Designer.cs index 0e16ab72e..593a54900 100644 --- a/src/Forms/DurationsBridgeGaps.Designer.cs +++ b/src/ui/Forms/DurationsBridgeGaps.Designer.cs @@ -1,261 +1,261 @@ -namespace Nikse.SubtitleEdit.Forms -{ - partial class DurationsBridgeGaps - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.labelMilliseconds = new System.Windows.Forms.Label(); - this.groupBoxLinesFound = new System.Windows.Forms.GroupBox(); - this.SubtitleListview1 = new Nikse.SubtitleEdit.Controls.SubtitleListView(); - this.numericUpDownMaxMs = new System.Windows.Forms.NumericUpDown(); - this.labelBridgePart1 = new System.Windows.Forms.Label(); - this.buttonOK = new System.Windows.Forms.Button(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.radioButtonProlongEndTime = new System.Windows.Forms.RadioButton(); - this.radioButtonDivideEven = new System.Windows.Forms.RadioButton(); - this.labelMinMsBetweenLines = new System.Windows.Forms.Label(); - this.numericUpDownMinMsBetweenLines = new System.Windows.Forms.NumericUpDown(); - this.groupBoxLinesFound.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxMs)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinMsBetweenLines)).BeginInit(); - this.SuspendLayout(); - // - // labelMilliseconds - // - this.labelMilliseconds.AutoSize = true; - this.labelMilliseconds.Location = new System.Drawing.Point(196, 12); - this.labelMilliseconds.Name = "labelMilliseconds"; - this.labelMilliseconds.Size = new System.Drawing.Size(63, 13); - this.labelMilliseconds.TabIndex = 2; - this.labelMilliseconds.Text = "milliseconds"; - // - // groupBoxLinesFound - // - this.groupBoxLinesFound.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxLinesFound.Controls.Add(this.SubtitleListview1); - this.groupBoxLinesFound.Location = new System.Drawing.Point(15, 65); - this.groupBoxLinesFound.Name = "groupBoxLinesFound"; - this.groupBoxLinesFound.Size = new System.Drawing.Size(871, 484); - this.groupBoxLinesFound.TabIndex = 7; - this.groupBoxLinesFound.TabStop = false; - this.groupBoxLinesFound.Text = "Lines that will be bridged"; - // - // SubtitleListview1 - // - this.SubtitleListview1.AllowColumnReorder = true; - this.SubtitleListview1.AllowDrop = true; - this.SubtitleListview1.Dock = System.Windows.Forms.DockStyle.Fill; - this.SubtitleListview1.FirstVisibleIndex = -1; - this.SubtitleListview1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.SubtitleListview1.FullRowSelect = true; - this.SubtitleListview1.GridLines = true; - this.SubtitleListview1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; - this.SubtitleListview1.HideSelection = false; - this.SubtitleListview1.Location = new System.Drawing.Point(3, 16); - this.SubtitleListview1.Name = "SubtitleListview1"; - this.SubtitleListview1.OwnerDraw = true; - this.SubtitleListview1.Size = new System.Drawing.Size(865, 465); - this.SubtitleListview1.SubtitleFontBold = false; - this.SubtitleListview1.SubtitleFontName = "Tahoma"; - this.SubtitleListview1.SubtitleFontSize = 8; - this.SubtitleListview1.TabIndex = 0; - this.SubtitleListview1.UseCompatibleStateImageBehavior = false; - this.SubtitleListview1.UseSyntaxColoring = true; - this.SubtitleListview1.View = System.Windows.Forms.View.Details; - // - // numericUpDownMaxMs - // - this.numericUpDownMaxMs.Increment = new decimal(new int[] { - 25, - 0, - 0, - 0}); - this.numericUpDownMaxMs.Location = new System.Drawing.Point(140, 10); - this.numericUpDownMaxMs.Maximum = new decimal(new int[] { - 2000, - 0, - 0, - 0}); - this.numericUpDownMaxMs.Minimum = new decimal(new int[] { - 1, - 0, - 0, - 0}); - this.numericUpDownMaxMs.Name = "numericUpDownMaxMs"; - this.numericUpDownMaxMs.Size = new System.Drawing.Size(50, 20); - this.numericUpDownMaxMs.TabIndex = 1; - this.numericUpDownMaxMs.Value = new decimal(new int[] { - 100, - 0, - 0, - 0}); - this.numericUpDownMaxMs.ValueChanged += new System.EventHandler(this.numericUpDownMaxMs_ValueChanged); - this.numericUpDownMaxMs.KeyUp += new System.Windows.Forms.KeyEventHandler(this.numericUpDownMaxMs_KeyUp); - this.numericUpDownMaxMs.Validated += new System.EventHandler(this.numericUpDownMaxMs_Validated); - // - // labelBridgePart1 - // - this.labelBridgePart1.AutoSize = true; - this.labelBridgePart1.Location = new System.Drawing.Point(12, 12); - this.labelBridgePart1.Name = "labelBridgePart1"; - this.labelBridgePart1.Size = new System.Drawing.Size(122, 13); - this.labelBridgePart1.TabIndex = 0; - this.labelBridgePart1.Text = "Bridge gaps smaller than"; - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(730, 555); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 8; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(811, 555); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 9; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // radioButtonProlongEndTime - // - this.radioButtonProlongEndTime.AutoSize = true; - this.radioButtonProlongEndTime.Checked = true; - this.radioButtonProlongEndTime.Location = new System.Drawing.Point(586, 17); - this.radioButtonProlongEndTime.Name = "radioButtonProlongEndTime"; - this.radioButtonProlongEndTime.Size = new System.Drawing.Size(171, 17); - this.radioButtonProlongEndTime.TabIndex = 5; - this.radioButtonProlongEndTime.TabStop = true; - this.radioButtonProlongEndTime.Text = "Previous text takes all gap time"; - this.radioButtonProlongEndTime.UseVisualStyleBackColor = true; - this.radioButtonProlongEndTime.CheckedChanged += new System.EventHandler(this.numericUpDownMaxMs_ValueChanged); - // - // radioButtonDivideEven - // - this.radioButtonDivideEven.AutoSize = true; - this.radioButtonDivideEven.Location = new System.Drawing.Point(586, 40); - this.radioButtonDivideEven.Name = "radioButtonDivideEven"; - this.radioButtonDivideEven.Size = new System.Drawing.Size(125, 17); - this.radioButtonDivideEven.TabIndex = 6; - this.radioButtonDivideEven.Text = "Texts divide gap time"; - this.radioButtonDivideEven.UseVisualStyleBackColor = true; - this.radioButtonDivideEven.CheckedChanged += new System.EventHandler(this.numericUpDownMaxMs_ValueChanged); - // - // labelMinMsBetweenLines - // - this.labelMinMsBetweenLines.AutoSize = true; - this.labelMinMsBetweenLines.Location = new System.Drawing.Point(15, 40); - this.labelMinMsBetweenLines.Name = "labelMinMsBetweenLines"; - this.labelMinMsBetweenLines.Size = new System.Drawing.Size(154, 13); - this.labelMinMsBetweenLines.TabIndex = 3; - this.labelMinMsBetweenLines.Text = "Min. milliseconds between lines"; - // - // numericUpDownMinMsBetweenLines - // - this.numericUpDownMinMsBetweenLines.Increment = new decimal(new int[] { - 5, - 0, - 0, - 0}); - this.numericUpDownMinMsBetweenLines.Location = new System.Drawing.Point(175, 38); - this.numericUpDownMinMsBetweenLines.Maximum = new decimal(new int[] { - 1000, - 0, - 0, - 0}); - this.numericUpDownMinMsBetweenLines.Name = "numericUpDownMinMsBetweenLines"; - this.numericUpDownMinMsBetweenLines.Size = new System.Drawing.Size(50, 20); - this.numericUpDownMinMsBetweenLines.TabIndex = 4; - this.numericUpDownMinMsBetweenLines.Value = new decimal(new int[] { - 40, - 0, - 0, - 0}); - this.numericUpDownMinMsBetweenLines.ValueChanged += new System.EventHandler(this.numericUpDownMinMsBetweenLines_ValueChanged); - this.numericUpDownMinMsBetweenLines.KeyUp += new System.Windows.Forms.KeyEventHandler(this.numericUpDownMinMsBetweenLines_KeyUp); - this.numericUpDownMinMsBetweenLines.Validated += new System.EventHandler(this.numericUpDownMinMsBetweenLines_Validated); - // - // DurationsBridgeGaps - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(898, 588); - this.Controls.Add(this.numericUpDownMinMsBetweenLines); - this.Controls.Add(this.labelMinMsBetweenLines); - this.Controls.Add(this.radioButtonDivideEven); - this.Controls.Add(this.radioButtonProlongEndTime); - this.Controls.Add(this.labelMilliseconds); - this.Controls.Add(this.groupBoxLinesFound); - this.Controls.Add(this.numericUpDownMaxMs); - this.Controls.Add(this.labelBridgePart1); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.buttonCancel); - this.KeyPreview = true; - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(850, 400); - this.Name = "DurationsBridgeGaps"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "DurationsBridgeGaps"; - this.Shown += new System.EventHandler(this.DurationsBridgeGaps_Shown); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.DurationsBridgeGaps_KeyDown); - this.groupBoxLinesFound.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxMs)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinMsBetweenLines)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Label labelMilliseconds; - private System.Windows.Forms.GroupBox groupBoxLinesFound; - private System.Windows.Forms.NumericUpDown numericUpDownMaxMs; - private System.Windows.Forms.Label labelBridgePart1; - private Controls.SubtitleListView SubtitleListview1; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.RadioButton radioButtonProlongEndTime; - private System.Windows.Forms.RadioButton radioButtonDivideEven; - private System.Windows.Forms.Label labelMinMsBetweenLines; - private System.Windows.Forms.NumericUpDown numericUpDownMinMsBetweenLines; - } +namespace Nikse.SubtitleEdit.Forms +{ + partial class DurationsBridgeGaps + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.labelMilliseconds = new System.Windows.Forms.Label(); + this.groupBoxLinesFound = new System.Windows.Forms.GroupBox(); + this.SubtitleListview1 = new Nikse.SubtitleEdit.Controls.SubtitleListView(); + this.numericUpDownMaxMs = new System.Windows.Forms.NumericUpDown(); + this.labelBridgePart1 = new System.Windows.Forms.Label(); + this.buttonOK = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.radioButtonProlongEndTime = new System.Windows.Forms.RadioButton(); + this.radioButtonDivideEven = new System.Windows.Forms.RadioButton(); + this.labelMinMsBetweenLines = new System.Windows.Forms.Label(); + this.numericUpDownMinMsBetweenLines = new System.Windows.Forms.NumericUpDown(); + this.groupBoxLinesFound.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxMs)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinMsBetweenLines)).BeginInit(); + this.SuspendLayout(); + // + // labelMilliseconds + // + this.labelMilliseconds.AutoSize = true; + this.labelMilliseconds.Location = new System.Drawing.Point(196, 12); + this.labelMilliseconds.Name = "labelMilliseconds"; + this.labelMilliseconds.Size = new System.Drawing.Size(63, 13); + this.labelMilliseconds.TabIndex = 2; + this.labelMilliseconds.Text = "milliseconds"; + // + // groupBoxLinesFound + // + this.groupBoxLinesFound.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxLinesFound.Controls.Add(this.SubtitleListview1); + this.groupBoxLinesFound.Location = new System.Drawing.Point(15, 65); + this.groupBoxLinesFound.Name = "groupBoxLinesFound"; + this.groupBoxLinesFound.Size = new System.Drawing.Size(871, 484); + this.groupBoxLinesFound.TabIndex = 7; + this.groupBoxLinesFound.TabStop = false; + this.groupBoxLinesFound.Text = "Lines that will be bridged"; + // + // SubtitleListview1 + // + this.SubtitleListview1.AllowColumnReorder = true; + this.SubtitleListview1.AllowDrop = true; + this.SubtitleListview1.Dock = System.Windows.Forms.DockStyle.Fill; + this.SubtitleListview1.FirstVisibleIndex = -1; + this.SubtitleListview1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.SubtitleListview1.FullRowSelect = true; + this.SubtitleListview1.GridLines = true; + this.SubtitleListview1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.SubtitleListview1.HideSelection = false; + this.SubtitleListview1.Location = new System.Drawing.Point(3, 16); + this.SubtitleListview1.Name = "SubtitleListview1"; + this.SubtitleListview1.OwnerDraw = true; + this.SubtitleListview1.Size = new System.Drawing.Size(865, 465); + this.SubtitleListview1.SubtitleFontBold = false; + this.SubtitleListview1.SubtitleFontName = "Tahoma"; + this.SubtitleListview1.SubtitleFontSize = 8; + this.SubtitleListview1.TabIndex = 0; + this.SubtitleListview1.UseCompatibleStateImageBehavior = false; + this.SubtitleListview1.UseSyntaxColoring = true; + this.SubtitleListview1.View = System.Windows.Forms.View.Details; + // + // numericUpDownMaxMs + // + this.numericUpDownMaxMs.Increment = new decimal(new int[] { + 25, + 0, + 0, + 0}); + this.numericUpDownMaxMs.Location = new System.Drawing.Point(140, 10); + this.numericUpDownMaxMs.Maximum = new decimal(new int[] { + 2000, + 0, + 0, + 0}); + this.numericUpDownMaxMs.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownMaxMs.Name = "numericUpDownMaxMs"; + this.numericUpDownMaxMs.Size = new System.Drawing.Size(50, 20); + this.numericUpDownMaxMs.TabIndex = 1; + this.numericUpDownMaxMs.Value = new decimal(new int[] { + 100, + 0, + 0, + 0}); + this.numericUpDownMaxMs.ValueChanged += new System.EventHandler(this.numericUpDownMaxMs_ValueChanged); + this.numericUpDownMaxMs.KeyUp += new System.Windows.Forms.KeyEventHandler(this.numericUpDownMaxMs_KeyUp); + this.numericUpDownMaxMs.Validated += new System.EventHandler(this.numericUpDownMaxMs_Validated); + // + // labelBridgePart1 + // + this.labelBridgePart1.AutoSize = true; + this.labelBridgePart1.Location = new System.Drawing.Point(12, 12); + this.labelBridgePart1.Name = "labelBridgePart1"; + this.labelBridgePart1.Size = new System.Drawing.Size(122, 13); + this.labelBridgePart1.TabIndex = 0; + this.labelBridgePart1.Text = "Bridge gaps smaller than"; + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(730, 555); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 8; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(811, 555); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 9; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // radioButtonProlongEndTime + // + this.radioButtonProlongEndTime.AutoSize = true; + this.radioButtonProlongEndTime.Checked = true; + this.radioButtonProlongEndTime.Location = new System.Drawing.Point(586, 17); + this.radioButtonProlongEndTime.Name = "radioButtonProlongEndTime"; + this.radioButtonProlongEndTime.Size = new System.Drawing.Size(171, 17); + this.radioButtonProlongEndTime.TabIndex = 5; + this.radioButtonProlongEndTime.TabStop = true; + this.radioButtonProlongEndTime.Text = "Previous text takes all gap time"; + this.radioButtonProlongEndTime.UseVisualStyleBackColor = true; + this.radioButtonProlongEndTime.CheckedChanged += new System.EventHandler(this.numericUpDownMaxMs_ValueChanged); + // + // radioButtonDivideEven + // + this.radioButtonDivideEven.AutoSize = true; + this.radioButtonDivideEven.Location = new System.Drawing.Point(586, 40); + this.radioButtonDivideEven.Name = "radioButtonDivideEven"; + this.radioButtonDivideEven.Size = new System.Drawing.Size(125, 17); + this.radioButtonDivideEven.TabIndex = 6; + this.radioButtonDivideEven.Text = "Texts divide gap time"; + this.radioButtonDivideEven.UseVisualStyleBackColor = true; + this.radioButtonDivideEven.CheckedChanged += new System.EventHandler(this.numericUpDownMaxMs_ValueChanged); + // + // labelMinMsBetweenLines + // + this.labelMinMsBetweenLines.AutoSize = true; + this.labelMinMsBetweenLines.Location = new System.Drawing.Point(15, 40); + this.labelMinMsBetweenLines.Name = "labelMinMsBetweenLines"; + this.labelMinMsBetweenLines.Size = new System.Drawing.Size(154, 13); + this.labelMinMsBetweenLines.TabIndex = 3; + this.labelMinMsBetweenLines.Text = "Min. milliseconds between lines"; + // + // numericUpDownMinMsBetweenLines + // + this.numericUpDownMinMsBetweenLines.Increment = new decimal(new int[] { + 5, + 0, + 0, + 0}); + this.numericUpDownMinMsBetweenLines.Location = new System.Drawing.Point(175, 38); + this.numericUpDownMinMsBetweenLines.Maximum = new decimal(new int[] { + 1000, + 0, + 0, + 0}); + this.numericUpDownMinMsBetweenLines.Name = "numericUpDownMinMsBetweenLines"; + this.numericUpDownMinMsBetweenLines.Size = new System.Drawing.Size(50, 20); + this.numericUpDownMinMsBetweenLines.TabIndex = 4; + this.numericUpDownMinMsBetweenLines.Value = new decimal(new int[] { + 40, + 0, + 0, + 0}); + this.numericUpDownMinMsBetweenLines.ValueChanged += new System.EventHandler(this.numericUpDownMinMsBetweenLines_ValueChanged); + this.numericUpDownMinMsBetweenLines.KeyUp += new System.Windows.Forms.KeyEventHandler(this.numericUpDownMinMsBetweenLines_KeyUp); + this.numericUpDownMinMsBetweenLines.Validated += new System.EventHandler(this.numericUpDownMinMsBetweenLines_Validated); + // + // DurationsBridgeGaps + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(898, 588); + this.Controls.Add(this.numericUpDownMinMsBetweenLines); + this.Controls.Add(this.labelMinMsBetweenLines); + this.Controls.Add(this.radioButtonDivideEven); + this.Controls.Add(this.radioButtonProlongEndTime); + this.Controls.Add(this.labelMilliseconds); + this.Controls.Add(this.groupBoxLinesFound); + this.Controls.Add(this.numericUpDownMaxMs); + this.Controls.Add(this.labelBridgePart1); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.buttonCancel); + this.KeyPreview = true; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(850, 400); + this.Name = "DurationsBridgeGaps"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "DurationsBridgeGaps"; + this.Shown += new System.EventHandler(this.DurationsBridgeGaps_Shown); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.DurationsBridgeGaps_KeyDown); + this.groupBoxLinesFound.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxMs)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinMsBetweenLines)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label labelMilliseconds; + private System.Windows.Forms.GroupBox groupBoxLinesFound; + private System.Windows.Forms.NumericUpDown numericUpDownMaxMs; + private System.Windows.Forms.Label labelBridgePart1; + private Controls.SubtitleListView SubtitleListview1; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.RadioButton radioButtonProlongEndTime; + private System.Windows.Forms.RadioButton radioButtonDivideEven; + private System.Windows.Forms.Label labelMinMsBetweenLines; + private System.Windows.Forms.NumericUpDown numericUpDownMinMsBetweenLines; + } } \ No newline at end of file diff --git a/src/Forms/DurationsBridgeGaps.cs b/src/ui/Forms/DurationsBridgeGaps.cs similarity index 97% rename from src/Forms/DurationsBridgeGaps.cs rename to src/ui/Forms/DurationsBridgeGaps.cs index db8c9fac4..899620d8f 100644 --- a/src/Forms/DurationsBridgeGaps.cs +++ b/src/ui/Forms/DurationsBridgeGaps.cs @@ -1,255 +1,255 @@ -using Nikse.SubtitleEdit.Controls; -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; -using Nikse.SubtitleEdit.Core.SubtitleFormats; - -namespace Nikse.SubtitleEdit.Forms -{ - public partial class DurationsBridgeGaps : PositionAndSizeForm - { - private readonly Subtitle _subtitle; - private Dictionary _dic; - private readonly Timer _refreshTimer = new Timer(); - public Subtitle FixedSubtitle { get; private set; } - public int FixedCount { get; private set; } - public int MinMsBetweenLines - { - get => (int)numericUpDownMinMsBetweenLines.Value; - set => numericUpDownMinMsBetweenLines.Value = value; - } - - public bool PreviousSubtitleTakesAllTime => radioButtonProlongEndTime.Checked; - - public DurationsBridgeGaps(Subtitle subtitle) - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - UiUtil.FixLargeFonts(this, buttonOK); - - SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.CharactersPerSeconds); - SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.WordsPerMinute); - SubtitleListview1.SetCustomResize(SubtitleListView1_Resize); - - Text = Configuration.Settings.Language.DurationsBridgeGaps.Title; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - SubtitleListview1.InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings); - UiUtil.InitializeSubtitleFont(SubtitleListview1); - SubtitleListview1.ShowExtraColumn(Configuration.Settings.General.UseTimeFormatHHMMSSFF ? Configuration.Settings.Language.DurationsBridgeGaps.GapToNextFrames : Configuration.Settings.Language.DurationsBridgeGaps.GapToNext); - SubtitleListview1.AutoSizeAllColumns(this); - - labelBridgePart1.Text = Configuration.Settings.Language.DurationsBridgeGaps.BridgeGapsSmallerThanXPart1; - labelMilliseconds.Text = Configuration.Settings.Language.DurationsBridgeGaps.BridgeGapsSmallerThanXPart2; - labelMinMsBetweenLines.Text = Configuration.Settings.Language.DurationsBridgeGaps.MinMillisecondsBetweenLines; - radioButtonProlongEndTime.Text = Configuration.Settings.Language.DurationsBridgeGaps.ProlongEndTime; - radioButtonDivideEven.Text = Configuration.Settings.Language.DurationsBridgeGaps.DivideEven; - groupBoxLinesFound.Text = string.Empty; - - _subtitle = subtitle; - try - { - numericUpDownMaxMs.Value = Configuration.Settings.Tools.BridgeGapMilliseconds; - } - catch - { - numericUpDownMaxMs.Value = 100; - } - if (Configuration.Settings.General.MinimumMillisecondsBetweenLines >= 1 && Configuration.Settings.General.MinimumMillisecondsBetweenLines <= numericUpDownMinMsBetweenLines.Maximum) - { - numericUpDownMinMsBetweenLines.Value = Configuration.Settings.General.MinimumMillisecondsBetweenLines; - } - - if (Configuration.Settings.General.UseTimeFormatHHMMSSFF) - { - labelBridgePart1.Text = Configuration.Settings.Language.DurationsBridgeGaps.BridgeGapsSmallerThanXPart1Frames; - labelMilliseconds.Text = Configuration.Settings.Language.DurationsBridgeGaps.BridgeGapsSmallerThanXPart2Frames; - - labelMinMsBetweenLines.Text = Configuration.Settings.Language.DurationsBridgeGaps.MinFramesBetweenLines; - - numericUpDownMaxMs.Value = SubtitleFormat.MillisecondsToFrames((double)numericUpDownMaxMs.Value); - numericUpDownMaxMs.Increment = 1; - numericUpDownMinMsBetweenLines.Value = SubtitleFormat.MillisecondsToFrames((double)numericUpDownMinMsBetweenLines.Value); - numericUpDownMinMsBetweenLines.Increment = 1; - } - - numericUpDownMinMsBetweenLines.Left = labelMinMsBetweenLines.Left + labelMinMsBetweenLines.Width + 4; - numericUpDownMaxMs.Left = labelBridgePart1.Left + labelBridgePart1.Width + 4; - labelMilliseconds.Left = numericUpDownMaxMs.Left + numericUpDownMaxMs.Width + 4; - - if (subtitle != null) - { - _refreshTimer.Interval = 400; - _refreshTimer.Tick += RefreshTimerTick; - GeneratePreview(); - } - } - - private void RefreshTimerTick(object sender, EventArgs e) - { - _refreshTimer.Stop(); - GeneratePreviewReal(); - } - - public sealed override string Text - { - get => base.Text; - set => base.Text = value; - } - - private void buttonOK_Click(object sender, EventArgs e) - { - Configuration.Settings.Tools.BridgeGapMilliseconds = (int)numericUpDownMaxMs.Value; - if (Configuration.Settings.General.UseTimeFormatHHMMSSFF) - { - Configuration.Settings.Tools.BridgeGapMilliseconds = SubtitleFormat.FramesToMilliseconds((double)numericUpDownMaxMs.Value); - } - - DialogResult = DialogResult.OK; - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private void GeneratePreview() - { - if (_refreshTimer.Enabled) - { - _refreshTimer.Stop(); - } - _refreshTimer.Start(); - } - - private void GeneratePreviewReal() - { - groupBoxLinesFound.Text = string.Empty; - if (_subtitle == null) - { - return; - } - - Cursor = Cursors.WaitCursor; - SubtitleListview1.Items.Clear(); - SubtitleListview1.BeginUpdate(); - FixedSubtitle = new Subtitle(_subtitle); - _dic = new Dictionary(); - var fixedIndexes = new List(FixedSubtitle.Paragraphs.Count); - var minMsBetweenLines = (int)numericUpDownMinMsBetweenLines.Value; - var maxMs = (double)numericUpDownMaxMs.Value; - if (Configuration.Settings.General.UseTimeFormatHHMMSSFF) - { - minMsBetweenLines = SubtitleFormat.FramesToMilliseconds(minMsBetweenLines); - maxMs = SubtitleFormat.FramesToMilliseconds(maxMs); - } - - FixedCount = Core.Forms.DurationsBridgeGaps.BridgeGaps(FixedSubtitle, minMsBetweenLines, radioButtonDivideEven.Checked, maxMs, fixedIndexes, _dic, Configuration.Settings.General.UseTimeFormatHHMMSSFF); - SubtitleListview1.Fill(FixedSubtitle); - for (int i = 0; i < FixedSubtitle.Paragraphs.Count; i++) - { - var cur = FixedSubtitle.Paragraphs[i]; - if (_dic.ContainsKey(cur.Id)) - { - SubtitleListview1.SetExtraText(i, _dic[cur.Id], SubtitleListview1.ForeColor); - } - else - { - var info = string.Empty; - var next = FixedSubtitle.GetParagraphOrDefault(i + 1); - if (next != null) - { - var gap = next.StartTime.TotalMilliseconds - cur.EndTime.TotalMilliseconds; - info = $"{ gap / TimeCode.BaseUnit:0.000}"; - if (Configuration.Settings.General.UseTimeFormatHHMMSSFF) - { - info = $"{ SubtitleFormat.MillisecondsToFrames(gap)}"; - } - } - SubtitleListview1.SetExtraText(i, info, SubtitleListview1.ForeColor); - } - - SubtitleListview1.SetBackgroundColor(i, SubtitleListview1.BackColor); - } - - foreach (var index in fixedIndexes) - { - SubtitleListview1.SetBackgroundColor(index, Color.LightGreen); - } - - SubtitleListview1.EndUpdate(); - groupBoxLinesFound.Text = string.Format(Configuration.Settings.Language.DurationsBridgeGaps.GapsBridgedX, FixedCount); - - Cursor = Cursors.Default; - } - - private void numericUpDownMaxMs_ValueChanged(object sender, EventArgs e) - { - GeneratePreview(); - } - - private void numericUpDownMinMsBetweenLines_ValueChanged(object sender, EventArgs e) - { - GeneratePreview(); - } - - private void DurationsBridgeGaps_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - private void DurationsBridgeGaps_Shown(object sender, EventArgs e) - { - SubtitleListview1.Focus(); - } - - private void numericUpDownMaxMs_Validated(object sender, EventArgs e) - { - GeneratePreview(); - } - - private void numericUpDownMaxMs_KeyUp(object sender, KeyEventArgs e) - { - GeneratePreview(); - } - - private void numericUpDownMinMsBetweenLines_Validated(object sender, EventArgs e) - { - GeneratePreview(); - } - - private void numericUpDownMinMsBetweenLines_KeyUp(object sender, KeyEventArgs e) - { - GeneratePreview(); - } - - private void SubtitleListView1_Resize(object sender, EventArgs e) - { - const int lastColumnWidth = 165; - var columnsCount = SubtitleListview1.Columns.Count - 1; - var width = 0; - for (int i = 0; i < columnsCount - 1; i++) - { - width += SubtitleListview1.Columns[i].Width; - } - SubtitleListview1.Columns[columnsCount - 1].Width = SubtitleListview1.Width - (width + lastColumnWidth); - SubtitleListview1.Columns[columnsCount].Width = -2; - } - - public void InitializeSettingsOnly() - { - groupBoxLinesFound.Enabled = false; - Height = MinimumSize.Height; - MaximizeBox = false; - MinimizeBox = false; - } - } -} +using Nikse.SubtitleEdit.Controls; +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.SubtitleFormats; + +namespace Nikse.SubtitleEdit.Forms +{ + public partial class DurationsBridgeGaps : PositionAndSizeForm + { + private readonly Subtitle _subtitle; + private Dictionary _dic; + private readonly Timer _refreshTimer = new Timer(); + public Subtitle FixedSubtitle { get; private set; } + public int FixedCount { get; private set; } + public int MinMsBetweenLines + { + get => (int)numericUpDownMinMsBetweenLines.Value; + set => numericUpDownMinMsBetweenLines.Value = value; + } + + public bool PreviousSubtitleTakesAllTime => radioButtonProlongEndTime.Checked; + + public DurationsBridgeGaps(Subtitle subtitle) + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + UiUtil.FixLargeFonts(this, buttonOK); + + SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.CharactersPerSeconds); + SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.WordsPerMinute); + SubtitleListview1.SetCustomResize(SubtitleListView1_Resize); + + Text = Configuration.Settings.Language.DurationsBridgeGaps.Title; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + SubtitleListview1.InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings); + UiUtil.InitializeSubtitleFont(SubtitleListview1); + SubtitleListview1.ShowExtraColumn(Configuration.Settings.General.UseTimeFormatHHMMSSFF ? Configuration.Settings.Language.DurationsBridgeGaps.GapToNextFrames : Configuration.Settings.Language.DurationsBridgeGaps.GapToNext); + SubtitleListview1.AutoSizeAllColumns(this); + + labelBridgePart1.Text = Configuration.Settings.Language.DurationsBridgeGaps.BridgeGapsSmallerThanXPart1; + labelMilliseconds.Text = Configuration.Settings.Language.DurationsBridgeGaps.BridgeGapsSmallerThanXPart2; + labelMinMsBetweenLines.Text = Configuration.Settings.Language.DurationsBridgeGaps.MinMillisecondsBetweenLines; + radioButtonProlongEndTime.Text = Configuration.Settings.Language.DurationsBridgeGaps.ProlongEndTime; + radioButtonDivideEven.Text = Configuration.Settings.Language.DurationsBridgeGaps.DivideEven; + groupBoxLinesFound.Text = string.Empty; + + _subtitle = subtitle; + try + { + numericUpDownMaxMs.Value = Configuration.Settings.Tools.BridgeGapMilliseconds; + } + catch + { + numericUpDownMaxMs.Value = 100; + } + if (Configuration.Settings.General.MinimumMillisecondsBetweenLines >= 1 && Configuration.Settings.General.MinimumMillisecondsBetweenLines <= numericUpDownMinMsBetweenLines.Maximum) + { + numericUpDownMinMsBetweenLines.Value = Configuration.Settings.General.MinimumMillisecondsBetweenLines; + } + + if (Configuration.Settings.General.UseTimeFormatHHMMSSFF) + { + labelBridgePart1.Text = Configuration.Settings.Language.DurationsBridgeGaps.BridgeGapsSmallerThanXPart1Frames; + labelMilliseconds.Text = Configuration.Settings.Language.DurationsBridgeGaps.BridgeGapsSmallerThanXPart2Frames; + + labelMinMsBetweenLines.Text = Configuration.Settings.Language.DurationsBridgeGaps.MinFramesBetweenLines; + + numericUpDownMaxMs.Value = SubtitleFormat.MillisecondsToFrames((double)numericUpDownMaxMs.Value); + numericUpDownMaxMs.Increment = 1; + numericUpDownMinMsBetweenLines.Value = SubtitleFormat.MillisecondsToFrames((double)numericUpDownMinMsBetweenLines.Value); + numericUpDownMinMsBetweenLines.Increment = 1; + } + + numericUpDownMinMsBetweenLines.Left = labelMinMsBetweenLines.Left + labelMinMsBetweenLines.Width + 4; + numericUpDownMaxMs.Left = labelBridgePart1.Left + labelBridgePart1.Width + 4; + labelMilliseconds.Left = numericUpDownMaxMs.Left + numericUpDownMaxMs.Width + 4; + + if (subtitle != null) + { + _refreshTimer.Interval = 400; + _refreshTimer.Tick += RefreshTimerTick; + GeneratePreview(); + } + } + + private void RefreshTimerTick(object sender, EventArgs e) + { + _refreshTimer.Stop(); + GeneratePreviewReal(); + } + + public sealed override string Text + { + get => base.Text; + set => base.Text = value; + } + + private void buttonOK_Click(object sender, EventArgs e) + { + Configuration.Settings.Tools.BridgeGapMilliseconds = (int)numericUpDownMaxMs.Value; + if (Configuration.Settings.General.UseTimeFormatHHMMSSFF) + { + Configuration.Settings.Tools.BridgeGapMilliseconds = SubtitleFormat.FramesToMilliseconds((double)numericUpDownMaxMs.Value); + } + + DialogResult = DialogResult.OK; + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void GeneratePreview() + { + if (_refreshTimer.Enabled) + { + _refreshTimer.Stop(); + } + _refreshTimer.Start(); + } + + private void GeneratePreviewReal() + { + groupBoxLinesFound.Text = string.Empty; + if (_subtitle == null) + { + return; + } + + Cursor = Cursors.WaitCursor; + SubtitleListview1.Items.Clear(); + SubtitleListview1.BeginUpdate(); + FixedSubtitle = new Subtitle(_subtitle); + _dic = new Dictionary(); + var fixedIndexes = new List(FixedSubtitle.Paragraphs.Count); + var minMsBetweenLines = (int)numericUpDownMinMsBetweenLines.Value; + var maxMs = (double)numericUpDownMaxMs.Value; + if (Configuration.Settings.General.UseTimeFormatHHMMSSFF) + { + minMsBetweenLines = SubtitleFormat.FramesToMilliseconds(minMsBetweenLines); + maxMs = SubtitleFormat.FramesToMilliseconds(maxMs); + } + + FixedCount = Core.Forms.DurationsBridgeGaps.BridgeGaps(FixedSubtitle, minMsBetweenLines, radioButtonDivideEven.Checked, maxMs, fixedIndexes, _dic, Configuration.Settings.General.UseTimeFormatHHMMSSFF); + SubtitleListview1.Fill(FixedSubtitle); + for (int i = 0; i < FixedSubtitle.Paragraphs.Count; i++) + { + var cur = FixedSubtitle.Paragraphs[i]; + if (_dic.ContainsKey(cur.Id)) + { + SubtitleListview1.SetExtraText(i, _dic[cur.Id], SubtitleListview1.ForeColor); + } + else + { + var info = string.Empty; + var next = FixedSubtitle.GetParagraphOrDefault(i + 1); + if (next != null) + { + var gap = next.StartTime.TotalMilliseconds - cur.EndTime.TotalMilliseconds; + info = $"{ gap / TimeCode.BaseUnit:0.000}"; + if (Configuration.Settings.General.UseTimeFormatHHMMSSFF) + { + info = $"{ SubtitleFormat.MillisecondsToFrames(gap)}"; + } + } + SubtitleListview1.SetExtraText(i, info, SubtitleListview1.ForeColor); + } + + SubtitleListview1.SetBackgroundColor(i, SubtitleListview1.BackColor); + } + + foreach (var index in fixedIndexes) + { + SubtitleListview1.SetBackgroundColor(index, Color.LightGreen); + } + + SubtitleListview1.EndUpdate(); + groupBoxLinesFound.Text = string.Format(Configuration.Settings.Language.DurationsBridgeGaps.GapsBridgedX, FixedCount); + + Cursor = Cursors.Default; + } + + private void numericUpDownMaxMs_ValueChanged(object sender, EventArgs e) + { + GeneratePreview(); + } + + private void numericUpDownMinMsBetweenLines_ValueChanged(object sender, EventArgs e) + { + GeneratePreview(); + } + + private void DurationsBridgeGaps_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + private void DurationsBridgeGaps_Shown(object sender, EventArgs e) + { + SubtitleListview1.Focus(); + } + + private void numericUpDownMaxMs_Validated(object sender, EventArgs e) + { + GeneratePreview(); + } + + private void numericUpDownMaxMs_KeyUp(object sender, KeyEventArgs e) + { + GeneratePreview(); + } + + private void numericUpDownMinMsBetweenLines_Validated(object sender, EventArgs e) + { + GeneratePreview(); + } + + private void numericUpDownMinMsBetweenLines_KeyUp(object sender, KeyEventArgs e) + { + GeneratePreview(); + } + + private void SubtitleListView1_Resize(object sender, EventArgs e) + { + const int lastColumnWidth = 165; + var columnsCount = SubtitleListview1.Columns.Count - 1; + var width = 0; + for (int i = 0; i < columnsCount - 1; i++) + { + width += SubtitleListview1.Columns[i].Width; + } + SubtitleListview1.Columns[columnsCount - 1].Width = SubtitleListview1.Width - (width + lastColumnWidth); + SubtitleListview1.Columns[columnsCount].Width = -2; + } + + public void InitializeSettingsOnly() + { + groupBoxLinesFound.Enabled = false; + Height = MinimumSize.Height; + MaximizeBox = false; + MinimizeBox = false; + } + } +} diff --git a/src/Forms/Networking/NetworkJoin.resx b/src/ui/Forms/DurationsBridgeGaps.resx similarity index 100% rename from src/Forms/Networking/NetworkJoin.resx rename to src/ui/Forms/DurationsBridgeGaps.resx diff --git a/src/Forms/DvdStudioProProperties.Designer.cs b/src/ui/Forms/DvdStudioProProperties.Designer.cs similarity index 100% rename from src/Forms/DvdStudioProProperties.Designer.cs rename to src/ui/Forms/DvdStudioProProperties.Designer.cs diff --git a/src/Forms/DvdStudioProProperties.cs b/src/ui/Forms/DvdStudioProProperties.cs similarity index 100% rename from src/Forms/DvdStudioProProperties.cs rename to src/ui/Forms/DvdStudioProProperties.cs diff --git a/src/Forms/Networking/NetworkLogAndInfo.resx b/src/ui/Forms/DvdStudioProProperties.resx similarity index 100% rename from src/Forms/Networking/NetworkLogAndInfo.resx rename to src/ui/Forms/DvdStudioProProperties.resx diff --git a/src/Forms/DvdSubRip.Designer.cs b/src/ui/Forms/DvdSubRip.Designer.cs similarity index 98% rename from src/Forms/DvdSubRip.Designer.cs rename to src/ui/Forms/DvdSubRip.Designer.cs index 431c1cc3b..a5c3c9ef4 100644 --- a/src/Forms/DvdSubRip.Designer.cs +++ b/src/ui/Forms/DvdSubRip.Designer.cs @@ -1,327 +1,327 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class DvdSubRip - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.buttonOpenIfo = new System.Windows.Forms.Button(); - this.textBoxIfoFileName = new System.Windows.Forms.TextBox(); - this.labelIfoFile = new System.Windows.Forms.Label(); - this.groupBoxDvd = new System.Windows.Forms.GroupBox(); - this.buttonClear = new System.Windows.Forms.Button(); - this.groupBoxLanguages = new System.Windows.Forms.GroupBox(); - this.comboBoxLanguages = new System.Windows.Forms.ComboBox(); - this.groupBoxPalNtsc = new System.Windows.Forms.GroupBox(); - this.radioButtonNtsc = new System.Windows.Forms.RadioButton(); - this.radioButtonPal = new System.Windows.Forms.RadioButton(); - this.ButtonRemoveVob = new System.Windows.Forms.Button(); - this.ButtonMoveVobDown = new System.Windows.Forms.Button(); - this.ButtonMoveVobUp = new System.Windows.Forms.Button(); - this.buttonAddVobFile = new System.Windows.Forms.Button(); - this.labelVobFiles = new System.Windows.Forms.Label(); - this.listBoxVobFiles = new System.Windows.Forms.ListBox(); - this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); - this.progressBarRip = new System.Windows.Forms.ProgressBar(); - this.labelStatus = new System.Windows.Forms.Label(); - this.buttonStartRipping = new System.Windows.Forms.Button(); - this.groupBoxDvd.SuspendLayout(); - this.groupBoxLanguages.SuspendLayout(); - this.groupBoxPalNtsc.SuspendLayout(); - this.SuspendLayout(); - // - // buttonOpenIfo - // - this.buttonOpenIfo.Location = new System.Drawing.Point(447, 32); - this.buttonOpenIfo.Name = "buttonOpenIfo"; - this.buttonOpenIfo.Size = new System.Drawing.Size(29, 23); - this.buttonOpenIfo.TabIndex = 1; - this.buttonOpenIfo.Text = "..."; - this.buttonOpenIfo.UseVisualStyleBackColor = true; - this.buttonOpenIfo.Click += new System.EventHandler(this.ButtonOpenIfoClick); - // - // textBoxIfoFileName - // - this.textBoxIfoFileName.AllowDrop = true; - this.textBoxIfoFileName.Location = new System.Drawing.Point(6, 34); - this.textBoxIfoFileName.Name = "textBoxIfoFileName"; - this.textBoxIfoFileName.ReadOnly = true; - this.textBoxIfoFileName.Size = new System.Drawing.Size(435, 21); - this.textBoxIfoFileName.TabIndex = 0; - this.textBoxIfoFileName.DragDrop += new System.Windows.Forms.DragEventHandler(this.TextBoxIfoFileNameDragDrop); - this.textBoxIfoFileName.DragEnter += new System.Windows.Forms.DragEventHandler(this.TextBoxIfoFileNameDragEnter); - // - // labelIfoFile - // - this.labelIfoFile.AutoSize = true; - this.labelIfoFile.Location = new System.Drawing.Point(6, 17); - this.labelIfoFile.Name = "labelIfoFile"; - this.labelIfoFile.Size = new System.Drawing.Size(42, 13); - this.labelIfoFile.TabIndex = 2; - this.labelIfoFile.Text = "IFO file"; - // - // groupBoxDvd - // - this.groupBoxDvd.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxDvd.Controls.Add(this.buttonClear); - this.groupBoxDvd.Controls.Add(this.groupBoxLanguages); - this.groupBoxDvd.Controls.Add(this.groupBoxPalNtsc); - this.groupBoxDvd.Controls.Add(this.ButtonRemoveVob); - this.groupBoxDvd.Controls.Add(this.ButtonMoveVobDown); - this.groupBoxDvd.Controls.Add(this.ButtonMoveVobUp); - this.groupBoxDvd.Controls.Add(this.buttonAddVobFile); - this.groupBoxDvd.Controls.Add(this.labelVobFiles); - this.groupBoxDvd.Controls.Add(this.listBoxVobFiles); - this.groupBoxDvd.Controls.Add(this.labelIfoFile); - this.groupBoxDvd.Controls.Add(this.buttonOpenIfo); - this.groupBoxDvd.Controls.Add(this.textBoxIfoFileName); - this.groupBoxDvd.Location = new System.Drawing.Point(4, 4); - this.groupBoxDvd.Name = "groupBoxDvd"; - this.groupBoxDvd.Size = new System.Drawing.Size(544, 276); - this.groupBoxDvd.TabIndex = 3; - this.groupBoxDvd.TabStop = false; - this.groupBoxDvd.Text = "DVD files/info"; - // - // buttonClear - // - this.buttonClear.Location = new System.Drawing.Point(446, 133); - this.buttonClear.Name = "buttonClear"; - this.buttonClear.Size = new System.Drawing.Size(92, 23); - this.buttonClear.TabIndex = 9; - this.buttonClear.Text = "Clear"; - this.buttonClear.UseVisualStyleBackColor = true; - this.buttonClear.Click += new System.EventHandler(this.ButtonClearClick); - // - // groupBoxLanguages - // - this.groupBoxLanguages.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxLanguages.Controls.Add(this.comboBoxLanguages); - this.groupBoxLanguages.Location = new System.Drawing.Point(6, 218); - this.groupBoxLanguages.Name = "groupBoxLanguages"; - this.groupBoxLanguages.Size = new System.Drawing.Size(242, 52); - this.groupBoxLanguages.TabIndex = 14; - this.groupBoxLanguages.TabStop = false; - this.groupBoxLanguages.Text = "Languages"; - // - // comboBoxLanguages - // - this.comboBoxLanguages.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxLanguages.FormattingEnabled = true; - this.comboBoxLanguages.Location = new System.Drawing.Point(6, 18); - this.comboBoxLanguages.Name = "comboBoxLanguages"; - this.comboBoxLanguages.Size = new System.Drawing.Size(230, 21); - this.comboBoxLanguages.TabIndex = 14; - // - // groupBoxPalNtsc - // - this.groupBoxPalNtsc.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxPalNtsc.Controls.Add(this.radioButtonNtsc); - this.groupBoxPalNtsc.Controls.Add(this.radioButtonPal); - this.groupBoxPalNtsc.Location = new System.Drawing.Point(254, 218); - this.groupBoxPalNtsc.Name = "groupBoxPalNtsc"; - this.groupBoxPalNtsc.Size = new System.Drawing.Size(284, 52); - this.groupBoxPalNtsc.TabIndex = 20; - this.groupBoxPalNtsc.TabStop = false; - this.groupBoxPalNtsc.Text = "PAL/NTSC"; - // - // radioButtonNtsc - // - this.radioButtonNtsc.AutoSize = true; - this.radioButtonNtsc.Location = new System.Drawing.Point(104, 18); - this.radioButtonNtsc.Name = "radioButtonNtsc"; - this.radioButtonNtsc.Size = new System.Drawing.Size(105, 17); - this.radioButtonNtsc.TabIndex = 1; - this.radioButtonNtsc.TabStop = true; - this.radioButtonNtsc.Text = "NTSC (29.97fps)"; - this.radioButtonNtsc.UseVisualStyleBackColor = true; - // - // radioButtonPal - // - this.radioButtonPal.AutoSize = true; - this.radioButtonPal.Checked = true; - this.radioButtonPal.Location = new System.Drawing.Point(6, 19); - this.radioButtonPal.Name = "radioButtonPal"; - this.radioButtonPal.Size = new System.Drawing.Size(81, 17); - this.radioButtonPal.TabIndex = 0; - this.radioButtonPal.TabStop = true; - this.radioButtonPal.Text = "PAL (25fps)"; - this.radioButtonPal.UseVisualStyleBackColor = true; - // - // ButtonRemoveVob - // - this.ButtonRemoveVob.Location = new System.Drawing.Point(447, 105); - this.ButtonRemoveVob.Name = "ButtonRemoveVob"; - this.ButtonRemoveVob.Size = new System.Drawing.Size(91, 23); - this.ButtonRemoveVob.TabIndex = 8; - this.ButtonRemoveVob.Text = "Remove"; - this.ButtonRemoveVob.UseVisualStyleBackColor = true; - this.ButtonRemoveVob.Click += new System.EventHandler(this.ButtonRemoveVob_Click); - // - // ButtonMoveVobDown - // - this.ButtonMoveVobDown.Location = new System.Drawing.Point(446, 189); - this.ButtonMoveVobDown.Name = "ButtonMoveVobDown"; - this.ButtonMoveVobDown.Size = new System.Drawing.Size(92, 23); - this.ButtonMoveVobDown.TabIndex = 12; - this.ButtonMoveVobDown.Text = "Move down"; - this.ButtonMoveVobDown.UseVisualStyleBackColor = true; - this.ButtonMoveVobDown.Click += new System.EventHandler(this.ButtonMoveVobDown_Click); - // - // ButtonMoveVobUp - // - this.ButtonMoveVobUp.Location = new System.Drawing.Point(447, 161); - this.ButtonMoveVobUp.Name = "ButtonMoveVobUp"; - this.ButtonMoveVobUp.Size = new System.Drawing.Size(91, 23); - this.ButtonMoveVobUp.TabIndex = 10; - this.ButtonMoveVobUp.Text = "Move up"; - this.ButtonMoveVobUp.UseVisualStyleBackColor = true; - this.ButtonMoveVobUp.Click += new System.EventHandler(this.ButtonMoveVobUp_Click); - // - // buttonAddVobFile - // - this.buttonAddVobFile.Location = new System.Drawing.Point(447, 77); - this.buttonAddVobFile.Name = "buttonAddVobFile"; - this.buttonAddVobFile.Size = new System.Drawing.Size(91, 23); - this.buttonAddVobFile.TabIndex = 5; - this.buttonAddVobFile.Text = "Add..."; - this.buttonAddVobFile.UseVisualStyleBackColor = true; - this.buttonAddVobFile.Click += new System.EventHandler(this.ButtonAddVobFileClick); - // - // labelVobFiles - // - this.labelVobFiles.AutoSize = true; - this.labelVobFiles.Location = new System.Drawing.Point(6, 60); - this.labelVobFiles.Name = "labelVobFiles"; - this.labelVobFiles.Size = new System.Drawing.Size(49, 13); - this.labelVobFiles.TabIndex = 4; - this.labelVobFiles.Text = "VOB files"; - // - // listBoxVobFiles - // - this.listBoxVobFiles.AllowDrop = true; - this.listBoxVobFiles.FormattingEnabled = true; - this.listBoxVobFiles.Location = new System.Drawing.Point(6, 77); - this.listBoxVobFiles.Name = "listBoxVobFiles"; - this.listBoxVobFiles.Size = new System.Drawing.Size(435, 134); - this.listBoxVobFiles.TabIndex = 3; - this.listBoxVobFiles.DragDrop += new System.Windows.Forms.DragEventHandler(this.ListBoxVobFilesDragDrop); - this.listBoxVobFiles.DragEnter += new System.Windows.Forms.DragEventHandler(this.ListBoxVobFilesDragEnter); - // - // openFileDialog1 - // - this.openFileDialog1.FileName = "openFileDialog1"; - // - // progressBarRip - // - this.progressBarRip.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.progressBarRip.Location = new System.Drawing.Point(133, 301); - this.progressBarRip.Name = "progressBarRip"; - this.progressBarRip.Size = new System.Drawing.Size(415, 15); - this.progressBarRip.TabIndex = 4; - this.progressBarRip.Visible = false; - // - // labelStatus - // - this.labelStatus.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelStatus.AutoSize = true; - this.labelStatus.Location = new System.Drawing.Point(130, 284); - this.labelStatus.Name = "labelStatus"; - this.labelStatus.Size = new System.Drawing.Size(38, 13); - this.labelStatus.TabIndex = 5; - this.labelStatus.Text = "Status"; - // - // buttonStartRipping - // - this.buttonStartRipping.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonStartRipping.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.buttonStartRipping.Location = new System.Drawing.Point(4, 287); - this.buttonStartRipping.Name = "buttonStartRipping"; - this.buttonStartRipping.Size = new System.Drawing.Size(120, 31); - this.buttonStartRipping.TabIndex = 25; - this.buttonStartRipping.Text = "Start ripping"; - this.buttonStartRipping.UseVisualStyleBackColor = true; - this.buttonStartRipping.Click += new System.EventHandler(this.ButtonStartRippingClick); - // - // DvdSubRip - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(554, 326); - this.Controls.Add(this.progressBarRip); - this.Controls.Add(this.buttonStartRipping); - this.Controls.Add(this.labelStatus); - this.Controls.Add(this.groupBoxDvd); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "DvdSubRip"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Rip subtitles from IFO/VOBs (DVD)"; - this.Shown += new System.EventHandler(this.DvdSubRip_Shown); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.DvdSubRip_KeyDown); - this.groupBoxDvd.ResumeLayout(false); - this.groupBoxDvd.PerformLayout(); - this.groupBoxLanguages.ResumeLayout(false); - this.groupBoxPalNtsc.ResumeLayout(false); - this.groupBoxPalNtsc.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button buttonOpenIfo; - private System.Windows.Forms.TextBox textBoxIfoFileName; - private System.Windows.Forms.Label labelIfoFile; - private System.Windows.Forms.GroupBox groupBoxDvd; - private System.Windows.Forms.ListBox listBoxVobFiles; - private System.Windows.Forms.OpenFileDialog openFileDialog1; - private System.Windows.Forms.Button ButtonRemoveVob; - private System.Windows.Forms.Button ButtonMoveVobDown; - private System.Windows.Forms.Button ButtonMoveVobUp; - private System.Windows.Forms.Button buttonAddVobFile; - private System.Windows.Forms.Label labelVobFiles; - private System.Windows.Forms.ProgressBar progressBarRip; - private System.Windows.Forms.Label labelStatus; - private System.Windows.Forms.Button buttonStartRipping; - private System.Windows.Forms.ComboBox comboBoxLanguages; - private System.Windows.Forms.GroupBox groupBoxLanguages; - private System.Windows.Forms.GroupBox groupBoxPalNtsc; - private System.Windows.Forms.RadioButton radioButtonNtsc; - private System.Windows.Forms.RadioButton radioButtonPal; - private System.Windows.Forms.Button buttonClear; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class DvdSubRip + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.buttonOpenIfo = new System.Windows.Forms.Button(); + this.textBoxIfoFileName = new System.Windows.Forms.TextBox(); + this.labelIfoFile = new System.Windows.Forms.Label(); + this.groupBoxDvd = new System.Windows.Forms.GroupBox(); + this.buttonClear = new System.Windows.Forms.Button(); + this.groupBoxLanguages = new System.Windows.Forms.GroupBox(); + this.comboBoxLanguages = new System.Windows.Forms.ComboBox(); + this.groupBoxPalNtsc = new System.Windows.Forms.GroupBox(); + this.radioButtonNtsc = new System.Windows.Forms.RadioButton(); + this.radioButtonPal = new System.Windows.Forms.RadioButton(); + this.ButtonRemoveVob = new System.Windows.Forms.Button(); + this.ButtonMoveVobDown = new System.Windows.Forms.Button(); + this.ButtonMoveVobUp = new System.Windows.Forms.Button(); + this.buttonAddVobFile = new System.Windows.Forms.Button(); + this.labelVobFiles = new System.Windows.Forms.Label(); + this.listBoxVobFiles = new System.Windows.Forms.ListBox(); + this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); + this.progressBarRip = new System.Windows.Forms.ProgressBar(); + this.labelStatus = new System.Windows.Forms.Label(); + this.buttonStartRipping = new System.Windows.Forms.Button(); + this.groupBoxDvd.SuspendLayout(); + this.groupBoxLanguages.SuspendLayout(); + this.groupBoxPalNtsc.SuspendLayout(); + this.SuspendLayout(); + // + // buttonOpenIfo + // + this.buttonOpenIfo.Location = new System.Drawing.Point(447, 32); + this.buttonOpenIfo.Name = "buttonOpenIfo"; + this.buttonOpenIfo.Size = new System.Drawing.Size(29, 23); + this.buttonOpenIfo.TabIndex = 1; + this.buttonOpenIfo.Text = "..."; + this.buttonOpenIfo.UseVisualStyleBackColor = true; + this.buttonOpenIfo.Click += new System.EventHandler(this.ButtonOpenIfoClick); + // + // textBoxIfoFileName + // + this.textBoxIfoFileName.AllowDrop = true; + this.textBoxIfoFileName.Location = new System.Drawing.Point(6, 34); + this.textBoxIfoFileName.Name = "textBoxIfoFileName"; + this.textBoxIfoFileName.ReadOnly = true; + this.textBoxIfoFileName.Size = new System.Drawing.Size(435, 21); + this.textBoxIfoFileName.TabIndex = 0; + this.textBoxIfoFileName.DragDrop += new System.Windows.Forms.DragEventHandler(this.TextBoxIfoFileNameDragDrop); + this.textBoxIfoFileName.DragEnter += new System.Windows.Forms.DragEventHandler(this.TextBoxIfoFileNameDragEnter); + // + // labelIfoFile + // + this.labelIfoFile.AutoSize = true; + this.labelIfoFile.Location = new System.Drawing.Point(6, 17); + this.labelIfoFile.Name = "labelIfoFile"; + this.labelIfoFile.Size = new System.Drawing.Size(42, 13); + this.labelIfoFile.TabIndex = 2; + this.labelIfoFile.Text = "IFO file"; + // + // groupBoxDvd + // + this.groupBoxDvd.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxDvd.Controls.Add(this.buttonClear); + this.groupBoxDvd.Controls.Add(this.groupBoxLanguages); + this.groupBoxDvd.Controls.Add(this.groupBoxPalNtsc); + this.groupBoxDvd.Controls.Add(this.ButtonRemoveVob); + this.groupBoxDvd.Controls.Add(this.ButtonMoveVobDown); + this.groupBoxDvd.Controls.Add(this.ButtonMoveVobUp); + this.groupBoxDvd.Controls.Add(this.buttonAddVobFile); + this.groupBoxDvd.Controls.Add(this.labelVobFiles); + this.groupBoxDvd.Controls.Add(this.listBoxVobFiles); + this.groupBoxDvd.Controls.Add(this.labelIfoFile); + this.groupBoxDvd.Controls.Add(this.buttonOpenIfo); + this.groupBoxDvd.Controls.Add(this.textBoxIfoFileName); + this.groupBoxDvd.Location = new System.Drawing.Point(4, 4); + this.groupBoxDvd.Name = "groupBoxDvd"; + this.groupBoxDvd.Size = new System.Drawing.Size(544, 276); + this.groupBoxDvd.TabIndex = 3; + this.groupBoxDvd.TabStop = false; + this.groupBoxDvd.Text = "DVD files/info"; + // + // buttonClear + // + this.buttonClear.Location = new System.Drawing.Point(446, 133); + this.buttonClear.Name = "buttonClear"; + this.buttonClear.Size = new System.Drawing.Size(92, 23); + this.buttonClear.TabIndex = 9; + this.buttonClear.Text = "Clear"; + this.buttonClear.UseVisualStyleBackColor = true; + this.buttonClear.Click += new System.EventHandler(this.ButtonClearClick); + // + // groupBoxLanguages + // + this.groupBoxLanguages.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxLanguages.Controls.Add(this.comboBoxLanguages); + this.groupBoxLanguages.Location = new System.Drawing.Point(6, 218); + this.groupBoxLanguages.Name = "groupBoxLanguages"; + this.groupBoxLanguages.Size = new System.Drawing.Size(242, 52); + this.groupBoxLanguages.TabIndex = 14; + this.groupBoxLanguages.TabStop = false; + this.groupBoxLanguages.Text = "Languages"; + // + // comboBoxLanguages + // + this.comboBoxLanguages.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxLanguages.FormattingEnabled = true; + this.comboBoxLanguages.Location = new System.Drawing.Point(6, 18); + this.comboBoxLanguages.Name = "comboBoxLanguages"; + this.comboBoxLanguages.Size = new System.Drawing.Size(230, 21); + this.comboBoxLanguages.TabIndex = 14; + // + // groupBoxPalNtsc + // + this.groupBoxPalNtsc.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxPalNtsc.Controls.Add(this.radioButtonNtsc); + this.groupBoxPalNtsc.Controls.Add(this.radioButtonPal); + this.groupBoxPalNtsc.Location = new System.Drawing.Point(254, 218); + this.groupBoxPalNtsc.Name = "groupBoxPalNtsc"; + this.groupBoxPalNtsc.Size = new System.Drawing.Size(284, 52); + this.groupBoxPalNtsc.TabIndex = 20; + this.groupBoxPalNtsc.TabStop = false; + this.groupBoxPalNtsc.Text = "PAL/NTSC"; + // + // radioButtonNtsc + // + this.radioButtonNtsc.AutoSize = true; + this.radioButtonNtsc.Location = new System.Drawing.Point(104, 18); + this.radioButtonNtsc.Name = "radioButtonNtsc"; + this.radioButtonNtsc.Size = new System.Drawing.Size(105, 17); + this.radioButtonNtsc.TabIndex = 1; + this.radioButtonNtsc.TabStop = true; + this.radioButtonNtsc.Text = "NTSC (29.97fps)"; + this.radioButtonNtsc.UseVisualStyleBackColor = true; + // + // radioButtonPal + // + this.radioButtonPal.AutoSize = true; + this.radioButtonPal.Checked = true; + this.radioButtonPal.Location = new System.Drawing.Point(6, 19); + this.radioButtonPal.Name = "radioButtonPal"; + this.radioButtonPal.Size = new System.Drawing.Size(81, 17); + this.radioButtonPal.TabIndex = 0; + this.radioButtonPal.TabStop = true; + this.radioButtonPal.Text = "PAL (25fps)"; + this.radioButtonPal.UseVisualStyleBackColor = true; + // + // ButtonRemoveVob + // + this.ButtonRemoveVob.Location = new System.Drawing.Point(447, 105); + this.ButtonRemoveVob.Name = "ButtonRemoveVob"; + this.ButtonRemoveVob.Size = new System.Drawing.Size(91, 23); + this.ButtonRemoveVob.TabIndex = 8; + this.ButtonRemoveVob.Text = "Remove"; + this.ButtonRemoveVob.UseVisualStyleBackColor = true; + this.ButtonRemoveVob.Click += new System.EventHandler(this.ButtonRemoveVob_Click); + // + // ButtonMoveVobDown + // + this.ButtonMoveVobDown.Location = new System.Drawing.Point(446, 189); + this.ButtonMoveVobDown.Name = "ButtonMoveVobDown"; + this.ButtonMoveVobDown.Size = new System.Drawing.Size(92, 23); + this.ButtonMoveVobDown.TabIndex = 12; + this.ButtonMoveVobDown.Text = "Move down"; + this.ButtonMoveVobDown.UseVisualStyleBackColor = true; + this.ButtonMoveVobDown.Click += new System.EventHandler(this.ButtonMoveVobDown_Click); + // + // ButtonMoveVobUp + // + this.ButtonMoveVobUp.Location = new System.Drawing.Point(447, 161); + this.ButtonMoveVobUp.Name = "ButtonMoveVobUp"; + this.ButtonMoveVobUp.Size = new System.Drawing.Size(91, 23); + this.ButtonMoveVobUp.TabIndex = 10; + this.ButtonMoveVobUp.Text = "Move up"; + this.ButtonMoveVobUp.UseVisualStyleBackColor = true; + this.ButtonMoveVobUp.Click += new System.EventHandler(this.ButtonMoveVobUp_Click); + // + // buttonAddVobFile + // + this.buttonAddVobFile.Location = new System.Drawing.Point(447, 77); + this.buttonAddVobFile.Name = "buttonAddVobFile"; + this.buttonAddVobFile.Size = new System.Drawing.Size(91, 23); + this.buttonAddVobFile.TabIndex = 5; + this.buttonAddVobFile.Text = "Add..."; + this.buttonAddVobFile.UseVisualStyleBackColor = true; + this.buttonAddVobFile.Click += new System.EventHandler(this.ButtonAddVobFileClick); + // + // labelVobFiles + // + this.labelVobFiles.AutoSize = true; + this.labelVobFiles.Location = new System.Drawing.Point(6, 60); + this.labelVobFiles.Name = "labelVobFiles"; + this.labelVobFiles.Size = new System.Drawing.Size(49, 13); + this.labelVobFiles.TabIndex = 4; + this.labelVobFiles.Text = "VOB files"; + // + // listBoxVobFiles + // + this.listBoxVobFiles.AllowDrop = true; + this.listBoxVobFiles.FormattingEnabled = true; + this.listBoxVobFiles.Location = new System.Drawing.Point(6, 77); + this.listBoxVobFiles.Name = "listBoxVobFiles"; + this.listBoxVobFiles.Size = new System.Drawing.Size(435, 134); + this.listBoxVobFiles.TabIndex = 3; + this.listBoxVobFiles.DragDrop += new System.Windows.Forms.DragEventHandler(this.ListBoxVobFilesDragDrop); + this.listBoxVobFiles.DragEnter += new System.Windows.Forms.DragEventHandler(this.ListBoxVobFilesDragEnter); + // + // openFileDialog1 + // + this.openFileDialog1.FileName = "openFileDialog1"; + // + // progressBarRip + // + this.progressBarRip.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.progressBarRip.Location = new System.Drawing.Point(133, 301); + this.progressBarRip.Name = "progressBarRip"; + this.progressBarRip.Size = new System.Drawing.Size(415, 15); + this.progressBarRip.TabIndex = 4; + this.progressBarRip.Visible = false; + // + // labelStatus + // + this.labelStatus.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelStatus.AutoSize = true; + this.labelStatus.Location = new System.Drawing.Point(130, 284); + this.labelStatus.Name = "labelStatus"; + this.labelStatus.Size = new System.Drawing.Size(38, 13); + this.labelStatus.TabIndex = 5; + this.labelStatus.Text = "Status"; + // + // buttonStartRipping + // + this.buttonStartRipping.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonStartRipping.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.buttonStartRipping.Location = new System.Drawing.Point(4, 287); + this.buttonStartRipping.Name = "buttonStartRipping"; + this.buttonStartRipping.Size = new System.Drawing.Size(120, 31); + this.buttonStartRipping.TabIndex = 25; + this.buttonStartRipping.Text = "Start ripping"; + this.buttonStartRipping.UseVisualStyleBackColor = true; + this.buttonStartRipping.Click += new System.EventHandler(this.ButtonStartRippingClick); + // + // DvdSubRip + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(554, 326); + this.Controls.Add(this.progressBarRip); + this.Controls.Add(this.buttonStartRipping); + this.Controls.Add(this.labelStatus); + this.Controls.Add(this.groupBoxDvd); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "DvdSubRip"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Rip subtitles from IFO/VOBs (DVD)"; + this.Shown += new System.EventHandler(this.DvdSubRip_Shown); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.DvdSubRip_KeyDown); + this.groupBoxDvd.ResumeLayout(false); + this.groupBoxDvd.PerformLayout(); + this.groupBoxLanguages.ResumeLayout(false); + this.groupBoxPalNtsc.ResumeLayout(false); + this.groupBoxPalNtsc.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonOpenIfo; + private System.Windows.Forms.TextBox textBoxIfoFileName; + private System.Windows.Forms.Label labelIfoFile; + private System.Windows.Forms.GroupBox groupBoxDvd; + private System.Windows.Forms.ListBox listBoxVobFiles; + private System.Windows.Forms.OpenFileDialog openFileDialog1; + private System.Windows.Forms.Button ButtonRemoveVob; + private System.Windows.Forms.Button ButtonMoveVobDown; + private System.Windows.Forms.Button ButtonMoveVobUp; + private System.Windows.Forms.Button buttonAddVobFile; + private System.Windows.Forms.Label labelVobFiles; + private System.Windows.Forms.ProgressBar progressBarRip; + private System.Windows.Forms.Label labelStatus; + private System.Windows.Forms.Button buttonStartRipping; + private System.Windows.Forms.ComboBox comboBoxLanguages; + private System.Windows.Forms.GroupBox groupBoxLanguages; + private System.Windows.Forms.GroupBox groupBoxPalNtsc; + private System.Windows.Forms.RadioButton radioButtonNtsc; + private System.Windows.Forms.RadioButton radioButtonPal; + private System.Windows.Forms.Button buttonClear; + } } \ No newline at end of file diff --git a/src/Forms/DvdSubRip.cs b/src/ui/Forms/DvdSubRip.cs similarity index 97% rename from src/Forms/DvdSubRip.cs rename to src/ui/Forms/DvdSubRip.cs index a44d46e97..dd3dc27d6 100644 --- a/src/Forms/DvdSubRip.cs +++ b/src/ui/Forms/DvdSubRip.cs @@ -1,601 +1,601 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.VobSub; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Globalization; -using System.IO; -using System.Text; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class DvdSubRip : Form - { - private volatile bool _abort; - public List MergedVobSubPacks; - public List Palette; - public List Languages; - private readonly LanguageStructure.DvdSubRip _language; - private long _lastPresentationTimestamp; - private long _lastVobPresentationTimestamp; - private long _lastNavEndPts; - private long _accumulatedPresentationTimestamp; - private readonly IntPtr _taskbarFormHandle; - private string _initialFileName; - - public string SelectedLanguage - { - get - { - if (comboBoxLanguages.SelectedIndex >= 0) - { - return $"{comboBoxLanguages.Items[comboBoxLanguages.SelectedIndex]} (0x{comboBoxLanguages.SelectedIndex + 32:x})"; - } - - return string.Empty; - } - } - - public DvdSubRip(IntPtr taskbarFormHandle, string initialFileName) - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - _taskbarFormHandle = taskbarFormHandle; - _initialFileName = initialFileName; - labelStatus.Text = string.Empty; - buttonStartRipping.Enabled = false; - - _language = Configuration.Settings.Language.DvdSubRip; - Text = _language.Title; - groupBoxDvd.Text = _language.DvdGroupTitle; - labelIfoFile.Text = _language.IfoFile; - labelVobFiles.Text = _language.VobFiles; - groupBoxLanguages.Text = _language.Languages; - groupBoxPalNtsc.Text = _language.PalNtsc; - radioButtonPal.Text = _language.Pal; - radioButtonNtsc.Text = _language.Ntsc; - buttonStartRipping.Text = _language.StartRipping; - buttonAddVobFile.Text = _language.Add; - ButtonRemoveVob.Text = _language.Remove; - buttonClear.Text = _language.Clear; - ButtonMoveVobDown.Text = _language.MoveDown; - ButtonMoveVobUp.Text = _language.MoveUp; - - if (System.Threading.Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName == "en") - { - radioButtonNtsc.Checked = true; - } - else - { - radioButtonPal.Checked = true; - } - - UiUtil.FixLargeFonts(this, buttonAddVobFile); - } - - private void ButtonOpenIfoClick(object sender, EventArgs e) - { - openFileDialog1.Multiselect = false; - openFileDialog1.Filter = _language.IfoFiles + "|*.IFO"; - openFileDialog1.FileName = string.Empty; - if (openFileDialog1.ShowDialog() == DialogResult.OK && File.Exists(openFileDialog1.FileName)) - { - OpenIfoFile(openFileDialog1.FileName); - } - } - - private void OpenIfoFile(string fileName) - { - Clear(); - textBoxIfoFileName.Text = fileName; - - // List vob files - string path = Path.GetDirectoryName(fileName); - string onlyFileName = Path.GetFileNameWithoutExtension(fileName); - string searchPattern = onlyFileName.Substring(0, onlyFileName.Length - 1) + "?.VOB"; - listBoxVobFiles.Items.Clear(); - for (int i = 1; i < 30; i++) - { - string vobFileName = searchPattern.Replace("?", i.ToString(CultureInfo.InvariantCulture)); - if (File.Exists(Path.Combine(path, vobFileName))) - { - listBoxVobFiles.Items.Add(Path.Combine(path, vobFileName)); - } - } - - if (listBoxVobFiles.Items.Count == 0) - { - searchPattern = onlyFileName.Substring(0, onlyFileName.Length - 1) + "PGC_01_?.VOB"; - for (int i = 1; i < 30; i++) - { - string vobFileName = searchPattern.Replace("?", i.ToString(CultureInfo.InvariantCulture)); - if (File.Exists(Path.Combine(path, vobFileName))) - { - listBoxVobFiles.Items.Add(Path.Combine(path, vobFileName)); - } - } - } - - using (var ifoParser = new IfoParser(fileName)) - { - if (!string.IsNullOrEmpty(ifoParser.ErrorMessage)) - { - Clear(); - MessageBox.Show(ifoParser.ErrorMessage); - return; - } - - // List info - labelIfoFile.Text = _language.IfoFile + ": " + ifoParser.VideoTitleSetVobs.VideoStream.Resolution; - bool isPal = ifoParser.VideoTitleSetVobs.VideoStream.Standard.Equals("PAL", StringComparison.OrdinalIgnoreCase); - if (isPal) - { - radioButtonPal.Checked = true; - } - else - { - radioButtonNtsc.Checked = true; - } - - // List languages - comboBoxLanguages.Items.Clear(); - foreach (string s in ifoParser.VideoTitleSetVobs.GetAllLanguages()) - { - comboBoxLanguages.Items.Add(s); - } - - if (comboBoxLanguages.Items.Count > 0) - { - comboBoxLanguages.SelectedIndex = 0; - } - - // Save palette (Color LookUp Table) - if (ifoParser.VideoTitleSetProgramChainTable.ProgramChains.Count > 0) - { - Palette = ifoParser.VideoTitleSetProgramChainTable.ProgramChains[0].ColorLookupTable; - } - - ifoParser.Dispose(); - } - buttonStartRipping.Enabled = listBoxVobFiles.Items.Count > 0; - } - - private void ButtonStartRippingClick(object sender, EventArgs e) - { - if (buttonStartRipping.Text == _language.Abort) - { - _abort = true; - buttonStartRipping.Text = _language.StartRipping; - return; - } - _abort = false; - buttonStartRipping.Text = _language.Abort; - _lastPresentationTimestamp = 0; - _lastVobPresentationTimestamp = 0; - _lastNavEndPts = 0; - _accumulatedPresentationTimestamp = 0; - - progressBarRip.Visible = true; - var ms = new MemoryStream(); - int i = 0; - foreach (string vobFileName in listBoxVobFiles.Items) - { - i++; - labelStatus.Text = string.Format(_language.RippingVobFileXofYZ, Path.GetFileName(vobFileName), i, listBoxVobFiles.Items.Count); - Refresh(); - Application.DoEvents(); - - if (!_abort) - { - RipSubtitles(vobFileName, ms, i - 1); // Rip/demux subtitle vob packs - } - } - progressBarRip.Visible = false; - TaskbarList.SetProgressState(_taskbarFormHandle, TaskbarButtonProgressFlags.NoProgress); - buttonStartRipping.Enabled = false; - if (_abort) - { - labelStatus.Text = _language.AbortedByUser; - buttonStartRipping.Text = _language.StartRipping; - buttonStartRipping.Enabled = true; - return; - } - - labelStatus.Text = string.Format(_language.ReadingSubtitleData); - Refresh(); - Application.DoEvents(); - var vobSub = new VobSubParser(radioButtonPal.Checked); - vobSub.Open(ms); - ms.Close(); - labelStatus.Text = string.Empty; - - MergedVobSubPacks = vobSub.MergeVobSubPacks(); // Merge splitted-packs to whole-packs - if (MergedVobSubPacks.Count == 0) - { - MessageBox.Show(Configuration.Settings.Language.Main.NoSubtitlesFound); - buttonStartRipping.Text = _language.StartRipping; - buttonStartRipping.Enabled = true; - return; - } - Languages = new List(); - for (int k = 0; k < comboBoxLanguages.Items.Count; k++) - { - Languages.Add(comboBoxLanguages.Items[k].ToString()); - } - - buttonStartRipping.Text = _language.StartRipping; - buttonStartRipping.Enabled = true; - DialogResult = DialogResult.OK; - } - - /// - /// Opens an existing file for reading, and allow the user to retry if it fails. - /// - /// The file to be opened for reading. - /// A read-only on the specified path. - public static FileStream RetryOpenRead(string path) - { - FileStream fs = null; - while (fs == null) - { - try - { - fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); - } - catch (IOException ex) - { - var result = MessageBox.Show(string.Format("An error occured while opening file: {0}", ex.Message), string.Empty, MessageBoxButtons.RetryCancel); - if (result == DialogResult.Cancel) - { - return null; - } - } - } - return fs; - } - - private void RipSubtitles(string vobFileName, MemoryStream stream, int vobNumber) - { - long firstNavStartPts = 0; - - using (var fs = RetryOpenRead(vobFileName)) - { - var buffer = new byte[0x800]; - long position = 0; - progressBarRip.Maximum = 100; - progressBarRip.Value = 0; - int lba = 0; - long length = fs.Length; - while (position < length && !_abort) - { - int bytesRead = 0; - - // Reading and test for IO errors... and allow abort/retry/ignore - var tryAgain = true; - while (tryAgain && position < length) - { - tryAgain = false; - try - { - fs.Seek(position, SeekOrigin.Begin); - bytesRead = fs.Read(buffer, 0, 0x800); - } - catch (IOException exception) - { - var result = MessageBox.Show(string.Format("An error occured while reading file: {0}", exception.Message), "", MessageBoxButtons.AbortRetryIgnore); - if (result == DialogResult.Abort) - { - return; - } - - if (result == DialogResult.Retry) - { - tryAgain = true; - } - - if (result == DialogResult.Ignore) - { - position += 0x800; - tryAgain = true; - } - } - } - - if (VobSubParser.IsMpeg2PackHeader(buffer)) - { - var vsp = new VobSubPack(buffer, null); - if (IsSubtitlePack(buffer)) - { - if (vsp.PacketizedElementaryStream.PresentationTimestamp.HasValue && _accumulatedPresentationTimestamp != 0) - { - UpdatePresentationTimestamp(buffer, _accumulatedPresentationTimestamp, vsp); - } - - stream.Write(buffer, 0, 0x800); - if (bytesRead < 0x800) - { - stream.Write(Encoding.ASCII.GetBytes(new string(' ', 0x800 - bytesRead)), 0, 0x800 - bytesRead); - } - } - else if (IsPrivateStream2(buffer, 0x26)) - { - if (Helper.GetEndian(buffer, 0x0026, 4) == 0x1bf && Helper.GetEndian(buffer, 0x0400, 4) == 0x1bf) - { - uint vobuSPtm = Helper.GetEndian(buffer, 0x0039, 4); - uint vobuEPtm = Helper.GetEndian(buffer, 0x003d, 4); - - _lastPresentationTimestamp = vobuEPtm; - - if (firstNavStartPts == 0) - { - firstNavStartPts = vobuSPtm; - if (vobNumber == 0) - { - _accumulatedPresentationTimestamp = -vobuSPtm; - } - } - if (vobuSPtm + firstNavStartPts + _accumulatedPresentationTimestamp < _lastVobPresentationTimestamp) - { - _accumulatedPresentationTimestamp += _lastNavEndPts - vobuSPtm; - } - else if (_lastNavEndPts > vobuEPtm) - { - _accumulatedPresentationTimestamp += _lastNavEndPts - vobuSPtm; - } - _lastNavEndPts = vobuEPtm; - } - } - } - position += 0x800; - - var progress = (int)((position * 100) / length); - if (progress != progressBarRip.Value) - { - progressBarRip.Value = progress; - TaskbarList.SetProgressValue(_taskbarFormHandle, (vobNumber * 100) + progressBarRip.Value, progressBarRip.Maximum * listBoxVobFiles.Items.Count); - Application.DoEvents(); - } - lba++; - } - } - _lastVobPresentationTimestamp = _lastPresentationTimestamp; - } - - /// - /// Write the 5 PTS bytes to buffer - /// - private static void UpdatePresentationTimestamp(byte[] buffer, long addPresentationTimestamp, VobSubPack vsp) - { - const int presentationTimestampIndex = 23; - long newPts = addPresentationTimestamp + ((long)vsp.PacketizedElementaryStream.PresentationTimestamp.Value); - - var buffer5B = BitConverter.GetBytes((UInt64)newPts); - if (BitConverter.IsLittleEndian) - { - buffer[presentationTimestampIndex + 4] = (byte)(buffer5B[0] << 1 | 0b00000001); // last 7 bits + '1' - buffer[presentationTimestampIndex + 3] = (byte)((buffer5B[0] >> 7) + (buffer5B[1] << 1)); // the next 8 bits (1 from last byte, 7 from next) - buffer[presentationTimestampIndex + 2] = (byte)((buffer5B[1] >> 6 | 0b00000001) + (buffer5B[2] << 2)); // the next 7 bits (1 from 2nd last byte, 6 from 3rd last byte) - buffer[presentationTimestampIndex + 1] = (byte)((buffer5B[2] >> 6) + (buffer5B[3] << 2)); // the next 8 bits (2 from 3rd last byte, 6 from 2rd last byte) - buffer[presentationTimestampIndex] = (byte)((buffer5B[3] >> 6 | 0b00000001) + (buffer5B[4] << 2)); - } - else - { - buffer[presentationTimestampIndex + 4] = (byte)(buffer5B[7] << 1 | 0b00000001); // last 7 bits + '1' - buffer[presentationTimestampIndex + 3] = (byte)((buffer5B[7] >> 7) + (buffer5B[6] << 1)); // the next 8 bits (1 from last byte, 7 from next) - buffer[presentationTimestampIndex + 2] = (byte)((buffer5B[6] >> 6 | 0b00000001) + (buffer5B[5] << 2)); // the next 7 bits (1 from 2nd last byte, 6 from 3rd last byte) - buffer[presentationTimestampIndex + 1] = (byte)((buffer5B[5] >> 6) + (buffer5B[4] << 2)); // the next 8 bits (2 from 3rd last byte, 6 from 2rd last byte) - buffer[presentationTimestampIndex] = (byte)((buffer5B[4] >> 6 | 0b00000001) + (buffer5B[3] << 2)); - } - if (vsp.PacketizedElementaryStream.PresentationTimestampDecodeTimestampFlags == 0b00000010) - { - buffer[presentationTimestampIndex] += 0b00100000; - } - else - { - buffer[presentationTimestampIndex] += 0b00110000; - } - } - - internal static bool IsPrivateStream2(byte[] buffer, int index) - { - return buffer.Length > index + 3 && - buffer[index + 0] == 0 && - buffer[index + 1] == 0 && - buffer[index + 2] == 1 && - buffer[index + 3] == 0xbf; - } - - private static bool IsSubtitlePack(byte[] buffer) - { - const int mpeg2HeaderLength = 14; - if (buffer[0] == 0 && - buffer[1] == 0 && - buffer[2] == 1 && - buffer[3] == 0xba) // 186 - MPEG-2 Pack Header - { - if (buffer[mpeg2HeaderLength + 0] == 0 && - buffer[mpeg2HeaderLength + 1] == 0 && - buffer[mpeg2HeaderLength + 2] == 1 && - buffer[mpeg2HeaderLength + 3] == 0xbd) // 189 - Private stream 1 (non MPEG audio, subpictures) - { - int pesHeaderDataLength = buffer[mpeg2HeaderLength + 8]; - int streamId = buffer[mpeg2HeaderLength + 8 + 1 + pesHeaderDataLength]; - if (streamId >= 0x20 && streamId <= 0x3f) // Subtitle IDs allowed (or x3f to x40?) - { - return true; - } - } - } - return false; - } - - private void ButtonAddVobFileClick(object sender, EventArgs e) - { - openFileDialog1.Filter = _language.VobFiles + "|*.VOB"; - openFileDialog1.FileName = string.Empty; - openFileDialog1.Multiselect = true; - if (openFileDialog1.ShowDialog() == DialogResult.OK && File.Exists(openFileDialog1.FileName)) - { - foreach (var fileName in openFileDialog1.FileNames) - { - listBoxVobFiles.Items.Add(fileName); - } - } - buttonStartRipping.Enabled = listBoxVobFiles.Items.Count > 0; - } - - private void ButtonMoveVobUp_Click(object sender, EventArgs e) - { - if (listBoxVobFiles.SelectedIndex > 0) - { - int index = listBoxVobFiles.SelectedIndex; - string old = listBoxVobFiles.Items[index].ToString(); - listBoxVobFiles.Items.RemoveAt(index); - listBoxVobFiles.Items.Insert(index - 1, old); - listBoxVobFiles.SelectedIndex = index - 1; - } - } - - private void ButtonMoveVobDown_Click(object sender, EventArgs e) - { - if (listBoxVobFiles.SelectedIndex >= 0 && listBoxVobFiles.SelectedIndex < listBoxVobFiles.Items.Count - 1) - { - int index = listBoxVobFiles.SelectedIndex; - string old = listBoxVobFiles.Items[index].ToString(); - listBoxVobFiles.Items.RemoveAt(index); - listBoxVobFiles.Items.Insert(index + 1, old); - listBoxVobFiles.SelectedIndex = index + 1; - } - } - - private void ButtonRemoveVob_Click(object sender, EventArgs e) - { - if (listBoxVobFiles.SelectedIndex >= 0) - { - int index = listBoxVobFiles.SelectedIndex; - listBoxVobFiles.Items.RemoveAt(index); - if (index < listBoxVobFiles.Items.Count) - { - listBoxVobFiles.SelectedIndex = index; - } - else if (index > 0) - { - listBoxVobFiles.SelectedIndex = index - 1; - } - - buttonStartRipping.Enabled = listBoxVobFiles.Items.Count > 0; - - if (listBoxVobFiles.Items.Count == 0) - { - Clear(); - } - } - } - - private void TextBoxIfoFileNameDragEnter(object sender, DragEventArgs e) - { - if (e.Data.GetDataPresent(DataFormats.FileDrop, false)) - { - e.Effect = DragDropEffects.All; - } - } - - private void TextBoxIfoFileNameDragDrop(object sender, DragEventArgs e) - { - var files = (string[])e.Data.GetData(DataFormats.FileDrop); - if (files.Length >= 1) - { - string fileName = files[0]; - - var fi = new FileInfo(fileName); - if (fi.Length < 1024 * 1024 * 2) // max 2 mb - { - if (fi.Extension.ToLowerInvariant() == ".ifo") - { - OpenIfoFile(fileName); - } - } - } - } - - private void ListBoxVobFilesDragEnter(object sender, DragEventArgs e) - { - if (e.Data.GetDataPresent(DataFormats.FileDrop, false)) - { - e.Effect = DragDropEffects.All; - } - } - - private void ListBoxVobFilesDragDrop(object sender, DragEventArgs e) - { - if (e.Data.GetDataPresent(DataFormats.FileDrop, false)) - { - e.Effect = DragDropEffects.All; - } - - var files = (string[])e.Data.GetData(DataFormats.FileDrop); - foreach (string fileName in files) - { - if (fileName.EndsWith(".vob", StringComparison.InvariantCultureIgnoreCase)) - { - listBoxVobFiles.Items.Add(fileName); - } - } - buttonStartRipping.Enabled = listBoxVobFiles.Items.Count > 0; - } - - private void ButtonClearClick(object sender, EventArgs e) - { - Clear(); - } - - private void Clear() - { - textBoxIfoFileName.Text = string.Empty; - listBoxVobFiles.Items.Clear(); - buttonStartRipping.Enabled = false; - comboBoxLanguages.Items.Clear(); - labelIfoFile.Text = _language.IfoFile; - } - - private void DvdSubRip_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - if (buttonStartRipping.Text == _language.Abort) - { - ButtonStartRippingClick(sender, e); - } - else - { - e.SuppressKeyPress = true; - DialogResult = DialogResult.Cancel; - } - } - } - - private void DvdSubRip_Shown(object sender, EventArgs e) - { - if (string.IsNullOrEmpty(_initialFileName)) - { - return; - } - - if (_initialFileName.EndsWith(".ifo", StringComparison.InvariantCultureIgnoreCase)) - { - OpenIfoFile(_initialFileName); - } - else if (_initialFileName.EndsWith(".vob", StringComparison.InvariantCultureIgnoreCase)) - { - listBoxVobFiles.Items.Add(_initialFileName); - buttonStartRipping.Enabled = true; - } - _initialFileName = null; - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.VobSub; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Globalization; +using System.IO; +using System.Text; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class DvdSubRip : Form + { + private volatile bool _abort; + public List MergedVobSubPacks; + public List Palette; + public List Languages; + private readonly LanguageStructure.DvdSubRip _language; + private long _lastPresentationTimestamp; + private long _lastVobPresentationTimestamp; + private long _lastNavEndPts; + private long _accumulatedPresentationTimestamp; + private readonly IntPtr _taskbarFormHandle; + private string _initialFileName; + + public string SelectedLanguage + { + get + { + if (comboBoxLanguages.SelectedIndex >= 0) + { + return $"{comboBoxLanguages.Items[comboBoxLanguages.SelectedIndex]} (0x{comboBoxLanguages.SelectedIndex + 32:x})"; + } + + return string.Empty; + } + } + + public DvdSubRip(IntPtr taskbarFormHandle, string initialFileName) + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + _taskbarFormHandle = taskbarFormHandle; + _initialFileName = initialFileName; + labelStatus.Text = string.Empty; + buttonStartRipping.Enabled = false; + + _language = Configuration.Settings.Language.DvdSubRip; + Text = _language.Title; + groupBoxDvd.Text = _language.DvdGroupTitle; + labelIfoFile.Text = _language.IfoFile; + labelVobFiles.Text = _language.VobFiles; + groupBoxLanguages.Text = _language.Languages; + groupBoxPalNtsc.Text = _language.PalNtsc; + radioButtonPal.Text = _language.Pal; + radioButtonNtsc.Text = _language.Ntsc; + buttonStartRipping.Text = _language.StartRipping; + buttonAddVobFile.Text = _language.Add; + ButtonRemoveVob.Text = _language.Remove; + buttonClear.Text = _language.Clear; + ButtonMoveVobDown.Text = _language.MoveDown; + ButtonMoveVobUp.Text = _language.MoveUp; + + if (System.Threading.Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName == "en") + { + radioButtonNtsc.Checked = true; + } + else + { + radioButtonPal.Checked = true; + } + + UiUtil.FixLargeFonts(this, buttonAddVobFile); + } + + private void ButtonOpenIfoClick(object sender, EventArgs e) + { + openFileDialog1.Multiselect = false; + openFileDialog1.Filter = _language.IfoFiles + "|*.IFO"; + openFileDialog1.FileName = string.Empty; + if (openFileDialog1.ShowDialog() == DialogResult.OK && File.Exists(openFileDialog1.FileName)) + { + OpenIfoFile(openFileDialog1.FileName); + } + } + + private void OpenIfoFile(string fileName) + { + Clear(); + textBoxIfoFileName.Text = fileName; + + // List vob files + string path = Path.GetDirectoryName(fileName); + string onlyFileName = Path.GetFileNameWithoutExtension(fileName); + string searchPattern = onlyFileName.Substring(0, onlyFileName.Length - 1) + "?.VOB"; + listBoxVobFiles.Items.Clear(); + for (int i = 1; i < 30; i++) + { + string vobFileName = searchPattern.Replace("?", i.ToString(CultureInfo.InvariantCulture)); + if (File.Exists(Path.Combine(path, vobFileName))) + { + listBoxVobFiles.Items.Add(Path.Combine(path, vobFileName)); + } + } + + if (listBoxVobFiles.Items.Count == 0) + { + searchPattern = onlyFileName.Substring(0, onlyFileName.Length - 1) + "PGC_01_?.VOB"; + for (int i = 1; i < 30; i++) + { + string vobFileName = searchPattern.Replace("?", i.ToString(CultureInfo.InvariantCulture)); + if (File.Exists(Path.Combine(path, vobFileName))) + { + listBoxVobFiles.Items.Add(Path.Combine(path, vobFileName)); + } + } + } + + using (var ifoParser = new IfoParser(fileName)) + { + if (!string.IsNullOrEmpty(ifoParser.ErrorMessage)) + { + Clear(); + MessageBox.Show(ifoParser.ErrorMessage); + return; + } + + // List info + labelIfoFile.Text = _language.IfoFile + ": " + ifoParser.VideoTitleSetVobs.VideoStream.Resolution; + bool isPal = ifoParser.VideoTitleSetVobs.VideoStream.Standard.Equals("PAL", StringComparison.OrdinalIgnoreCase); + if (isPal) + { + radioButtonPal.Checked = true; + } + else + { + radioButtonNtsc.Checked = true; + } + + // List languages + comboBoxLanguages.Items.Clear(); + foreach (string s in ifoParser.VideoTitleSetVobs.GetAllLanguages()) + { + comboBoxLanguages.Items.Add(s); + } + + if (comboBoxLanguages.Items.Count > 0) + { + comboBoxLanguages.SelectedIndex = 0; + } + + // Save palette (Color LookUp Table) + if (ifoParser.VideoTitleSetProgramChainTable.ProgramChains.Count > 0) + { + Palette = ifoParser.VideoTitleSetProgramChainTable.ProgramChains[0].ColorLookupTable; + } + + ifoParser.Dispose(); + } + buttonStartRipping.Enabled = listBoxVobFiles.Items.Count > 0; + } + + private void ButtonStartRippingClick(object sender, EventArgs e) + { + if (buttonStartRipping.Text == _language.Abort) + { + _abort = true; + buttonStartRipping.Text = _language.StartRipping; + return; + } + _abort = false; + buttonStartRipping.Text = _language.Abort; + _lastPresentationTimestamp = 0; + _lastVobPresentationTimestamp = 0; + _lastNavEndPts = 0; + _accumulatedPresentationTimestamp = 0; + + progressBarRip.Visible = true; + var ms = new MemoryStream(); + int i = 0; + foreach (string vobFileName in listBoxVobFiles.Items) + { + i++; + labelStatus.Text = string.Format(_language.RippingVobFileXofYZ, Path.GetFileName(vobFileName), i, listBoxVobFiles.Items.Count); + Refresh(); + Application.DoEvents(); + + if (!_abort) + { + RipSubtitles(vobFileName, ms, i - 1); // Rip/demux subtitle vob packs + } + } + progressBarRip.Visible = false; + TaskbarList.SetProgressState(_taskbarFormHandle, TaskbarButtonProgressFlags.NoProgress); + buttonStartRipping.Enabled = false; + if (_abort) + { + labelStatus.Text = _language.AbortedByUser; + buttonStartRipping.Text = _language.StartRipping; + buttonStartRipping.Enabled = true; + return; + } + + labelStatus.Text = string.Format(_language.ReadingSubtitleData); + Refresh(); + Application.DoEvents(); + var vobSub = new VobSubParser(radioButtonPal.Checked); + vobSub.Open(ms); + ms.Close(); + labelStatus.Text = string.Empty; + + MergedVobSubPacks = vobSub.MergeVobSubPacks(); // Merge splitted-packs to whole-packs + if (MergedVobSubPacks.Count == 0) + { + MessageBox.Show(Configuration.Settings.Language.Main.NoSubtitlesFound); + buttonStartRipping.Text = _language.StartRipping; + buttonStartRipping.Enabled = true; + return; + } + Languages = new List(); + for (int k = 0; k < comboBoxLanguages.Items.Count; k++) + { + Languages.Add(comboBoxLanguages.Items[k].ToString()); + } + + buttonStartRipping.Text = _language.StartRipping; + buttonStartRipping.Enabled = true; + DialogResult = DialogResult.OK; + } + + /// + /// Opens an existing file for reading, and allow the user to retry if it fails. + /// + /// The file to be opened for reading. + /// A read-only on the specified path. + public static FileStream RetryOpenRead(string path) + { + FileStream fs = null; + while (fs == null) + { + try + { + fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + } + catch (IOException ex) + { + var result = MessageBox.Show(string.Format("An error occured while opening file: {0}", ex.Message), string.Empty, MessageBoxButtons.RetryCancel); + if (result == DialogResult.Cancel) + { + return null; + } + } + } + return fs; + } + + private void RipSubtitles(string vobFileName, MemoryStream stream, int vobNumber) + { + long firstNavStartPts = 0; + + using (var fs = RetryOpenRead(vobFileName)) + { + var buffer = new byte[0x800]; + long position = 0; + progressBarRip.Maximum = 100; + progressBarRip.Value = 0; + int lba = 0; + long length = fs.Length; + while (position < length && !_abort) + { + int bytesRead = 0; + + // Reading and test for IO errors... and allow abort/retry/ignore + var tryAgain = true; + while (tryAgain && position < length) + { + tryAgain = false; + try + { + fs.Seek(position, SeekOrigin.Begin); + bytesRead = fs.Read(buffer, 0, 0x800); + } + catch (IOException exception) + { + var result = MessageBox.Show(string.Format("An error occured while reading file: {0}", exception.Message), "", MessageBoxButtons.AbortRetryIgnore); + if (result == DialogResult.Abort) + { + return; + } + + if (result == DialogResult.Retry) + { + tryAgain = true; + } + + if (result == DialogResult.Ignore) + { + position += 0x800; + tryAgain = true; + } + } + } + + if (VobSubParser.IsMpeg2PackHeader(buffer)) + { + var vsp = new VobSubPack(buffer, null); + if (IsSubtitlePack(buffer)) + { + if (vsp.PacketizedElementaryStream.PresentationTimestamp.HasValue && _accumulatedPresentationTimestamp != 0) + { + UpdatePresentationTimestamp(buffer, _accumulatedPresentationTimestamp, vsp); + } + + stream.Write(buffer, 0, 0x800); + if (bytesRead < 0x800) + { + stream.Write(Encoding.ASCII.GetBytes(new string(' ', 0x800 - bytesRead)), 0, 0x800 - bytesRead); + } + } + else if (IsPrivateStream2(buffer, 0x26)) + { + if (Helper.GetEndian(buffer, 0x0026, 4) == 0x1bf && Helper.GetEndian(buffer, 0x0400, 4) == 0x1bf) + { + uint vobuSPtm = Helper.GetEndian(buffer, 0x0039, 4); + uint vobuEPtm = Helper.GetEndian(buffer, 0x003d, 4); + + _lastPresentationTimestamp = vobuEPtm; + + if (firstNavStartPts == 0) + { + firstNavStartPts = vobuSPtm; + if (vobNumber == 0) + { + _accumulatedPresentationTimestamp = -vobuSPtm; + } + } + if (vobuSPtm + firstNavStartPts + _accumulatedPresentationTimestamp < _lastVobPresentationTimestamp) + { + _accumulatedPresentationTimestamp += _lastNavEndPts - vobuSPtm; + } + else if (_lastNavEndPts > vobuEPtm) + { + _accumulatedPresentationTimestamp += _lastNavEndPts - vobuSPtm; + } + _lastNavEndPts = vobuEPtm; + } + } + } + position += 0x800; + + var progress = (int)((position * 100) / length); + if (progress != progressBarRip.Value) + { + progressBarRip.Value = progress; + TaskbarList.SetProgressValue(_taskbarFormHandle, (vobNumber * 100) + progressBarRip.Value, progressBarRip.Maximum * listBoxVobFiles.Items.Count); + Application.DoEvents(); + } + lba++; + } + } + _lastVobPresentationTimestamp = _lastPresentationTimestamp; + } + + /// + /// Write the 5 PTS bytes to buffer + /// + private static void UpdatePresentationTimestamp(byte[] buffer, long addPresentationTimestamp, VobSubPack vsp) + { + const int presentationTimestampIndex = 23; + long newPts = addPresentationTimestamp + ((long)vsp.PacketizedElementaryStream.PresentationTimestamp.Value); + + var buffer5B = BitConverter.GetBytes((UInt64)newPts); + if (BitConverter.IsLittleEndian) + { + buffer[presentationTimestampIndex + 4] = (byte)(buffer5B[0] << 1 | 0b00000001); // last 7 bits + '1' + buffer[presentationTimestampIndex + 3] = (byte)((buffer5B[0] >> 7) + (buffer5B[1] << 1)); // the next 8 bits (1 from last byte, 7 from next) + buffer[presentationTimestampIndex + 2] = (byte)((buffer5B[1] >> 6 | 0b00000001) + (buffer5B[2] << 2)); // the next 7 bits (1 from 2nd last byte, 6 from 3rd last byte) + buffer[presentationTimestampIndex + 1] = (byte)((buffer5B[2] >> 6) + (buffer5B[3] << 2)); // the next 8 bits (2 from 3rd last byte, 6 from 2rd last byte) + buffer[presentationTimestampIndex] = (byte)((buffer5B[3] >> 6 | 0b00000001) + (buffer5B[4] << 2)); + } + else + { + buffer[presentationTimestampIndex + 4] = (byte)(buffer5B[7] << 1 | 0b00000001); // last 7 bits + '1' + buffer[presentationTimestampIndex + 3] = (byte)((buffer5B[7] >> 7) + (buffer5B[6] << 1)); // the next 8 bits (1 from last byte, 7 from next) + buffer[presentationTimestampIndex + 2] = (byte)((buffer5B[6] >> 6 | 0b00000001) + (buffer5B[5] << 2)); // the next 7 bits (1 from 2nd last byte, 6 from 3rd last byte) + buffer[presentationTimestampIndex + 1] = (byte)((buffer5B[5] >> 6) + (buffer5B[4] << 2)); // the next 8 bits (2 from 3rd last byte, 6 from 2rd last byte) + buffer[presentationTimestampIndex] = (byte)((buffer5B[4] >> 6 | 0b00000001) + (buffer5B[3] << 2)); + } + if (vsp.PacketizedElementaryStream.PresentationTimestampDecodeTimestampFlags == 0b00000010) + { + buffer[presentationTimestampIndex] += 0b00100000; + } + else + { + buffer[presentationTimestampIndex] += 0b00110000; + } + } + + internal static bool IsPrivateStream2(byte[] buffer, int index) + { + return buffer.Length > index + 3 && + buffer[index + 0] == 0 && + buffer[index + 1] == 0 && + buffer[index + 2] == 1 && + buffer[index + 3] == 0xbf; + } + + private static bool IsSubtitlePack(byte[] buffer) + { + const int mpeg2HeaderLength = 14; + if (buffer[0] == 0 && + buffer[1] == 0 && + buffer[2] == 1 && + buffer[3] == 0xba) // 186 - MPEG-2 Pack Header + { + if (buffer[mpeg2HeaderLength + 0] == 0 && + buffer[mpeg2HeaderLength + 1] == 0 && + buffer[mpeg2HeaderLength + 2] == 1 && + buffer[mpeg2HeaderLength + 3] == 0xbd) // 189 - Private stream 1 (non MPEG audio, subpictures) + { + int pesHeaderDataLength = buffer[mpeg2HeaderLength + 8]; + int streamId = buffer[mpeg2HeaderLength + 8 + 1 + pesHeaderDataLength]; + if (streamId >= 0x20 && streamId <= 0x3f) // Subtitle IDs allowed (or x3f to x40?) + { + return true; + } + } + } + return false; + } + + private void ButtonAddVobFileClick(object sender, EventArgs e) + { + openFileDialog1.Filter = _language.VobFiles + "|*.VOB"; + openFileDialog1.FileName = string.Empty; + openFileDialog1.Multiselect = true; + if (openFileDialog1.ShowDialog() == DialogResult.OK && File.Exists(openFileDialog1.FileName)) + { + foreach (var fileName in openFileDialog1.FileNames) + { + listBoxVobFiles.Items.Add(fileName); + } + } + buttonStartRipping.Enabled = listBoxVobFiles.Items.Count > 0; + } + + private void ButtonMoveVobUp_Click(object sender, EventArgs e) + { + if (listBoxVobFiles.SelectedIndex > 0) + { + int index = listBoxVobFiles.SelectedIndex; + string old = listBoxVobFiles.Items[index].ToString(); + listBoxVobFiles.Items.RemoveAt(index); + listBoxVobFiles.Items.Insert(index - 1, old); + listBoxVobFiles.SelectedIndex = index - 1; + } + } + + private void ButtonMoveVobDown_Click(object sender, EventArgs e) + { + if (listBoxVobFiles.SelectedIndex >= 0 && listBoxVobFiles.SelectedIndex < listBoxVobFiles.Items.Count - 1) + { + int index = listBoxVobFiles.SelectedIndex; + string old = listBoxVobFiles.Items[index].ToString(); + listBoxVobFiles.Items.RemoveAt(index); + listBoxVobFiles.Items.Insert(index + 1, old); + listBoxVobFiles.SelectedIndex = index + 1; + } + } + + private void ButtonRemoveVob_Click(object sender, EventArgs e) + { + if (listBoxVobFiles.SelectedIndex >= 0) + { + int index = listBoxVobFiles.SelectedIndex; + listBoxVobFiles.Items.RemoveAt(index); + if (index < listBoxVobFiles.Items.Count) + { + listBoxVobFiles.SelectedIndex = index; + } + else if (index > 0) + { + listBoxVobFiles.SelectedIndex = index - 1; + } + + buttonStartRipping.Enabled = listBoxVobFiles.Items.Count > 0; + + if (listBoxVobFiles.Items.Count == 0) + { + Clear(); + } + } + } + + private void TextBoxIfoFileNameDragEnter(object sender, DragEventArgs e) + { + if (e.Data.GetDataPresent(DataFormats.FileDrop, false)) + { + e.Effect = DragDropEffects.All; + } + } + + private void TextBoxIfoFileNameDragDrop(object sender, DragEventArgs e) + { + var files = (string[])e.Data.GetData(DataFormats.FileDrop); + if (files.Length >= 1) + { + string fileName = files[0]; + + var fi = new FileInfo(fileName); + if (fi.Length < 1024 * 1024 * 2) // max 2 mb + { + if (fi.Extension.ToLowerInvariant() == ".ifo") + { + OpenIfoFile(fileName); + } + } + } + } + + private void ListBoxVobFilesDragEnter(object sender, DragEventArgs e) + { + if (e.Data.GetDataPresent(DataFormats.FileDrop, false)) + { + e.Effect = DragDropEffects.All; + } + } + + private void ListBoxVobFilesDragDrop(object sender, DragEventArgs e) + { + if (e.Data.GetDataPresent(DataFormats.FileDrop, false)) + { + e.Effect = DragDropEffects.All; + } + + var files = (string[])e.Data.GetData(DataFormats.FileDrop); + foreach (string fileName in files) + { + if (fileName.EndsWith(".vob", StringComparison.InvariantCultureIgnoreCase)) + { + listBoxVobFiles.Items.Add(fileName); + } + } + buttonStartRipping.Enabled = listBoxVobFiles.Items.Count > 0; + } + + private void ButtonClearClick(object sender, EventArgs e) + { + Clear(); + } + + private void Clear() + { + textBoxIfoFileName.Text = string.Empty; + listBoxVobFiles.Items.Clear(); + buttonStartRipping.Enabled = false; + comboBoxLanguages.Items.Clear(); + labelIfoFile.Text = _language.IfoFile; + } + + private void DvdSubRip_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + if (buttonStartRipping.Text == _language.Abort) + { + ButtonStartRippingClick(sender, e); + } + else + { + e.SuppressKeyPress = true; + DialogResult = DialogResult.Cancel; + } + } + } + + private void DvdSubRip_Shown(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(_initialFileName)) + { + return; + } + + if (_initialFileName.EndsWith(".ifo", StringComparison.InvariantCultureIgnoreCase)) + { + OpenIfoFile(_initialFileName); + } + else if (_initialFileName.EndsWith(".vob", StringComparison.InvariantCultureIgnoreCase)) + { + listBoxVobFiles.Items.Add(_initialFileName); + buttonStartRipping.Enabled = true; + } + _initialFileName = null; + } + + } +} diff --git a/src/Forms/DvdSubRip.resx b/src/ui/Forms/DvdSubRip.resx similarity index 97% rename from src/Forms/DvdSubRip.resx rename to src/ui/Forms/DvdSubRip.resx index 3a7d67153..9bad2f599 100644 --- a/src/Forms/DvdSubRip.resx +++ b/src/ui/Forms/DvdSubRip.resx @@ -1,123 +1,123 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + \ No newline at end of file diff --git a/src/Forms/DvdSubRipChooseLanguage.Designer.cs b/src/ui/Forms/DvdSubRipChooseLanguage.Designer.cs similarity index 98% rename from src/Forms/DvdSubRipChooseLanguage.Designer.cs rename to src/ui/Forms/DvdSubRipChooseLanguage.Designer.cs index bb9009b3b..ba5183452 100644 --- a/src/Forms/DvdSubRipChooseLanguage.Designer.cs +++ b/src/ui/Forms/DvdSubRipChooseLanguage.Designer.cs @@ -1,176 +1,176 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class DvdSubRipChooseLanguage - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.listBox1 = new System.Windows.Forms.ListBox(); - this.pictureBoxImage = new System.Windows.Forms.PictureBox(); - this.comboBoxLanguages = new System.Windows.Forms.ComboBox(); - this.labelChooseLanguage = new System.Windows.Forms.Label(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.groupBoxImage = new System.Windows.Forms.GroupBox(); - this.buttonSaveAs = new System.Windows.Forms.Button(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxImage)).BeginInit(); - this.groupBoxImage.SuspendLayout(); - this.SuspendLayout(); - // - // listBox1 - // - this.listBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left))); - this.listBox1.FormattingEnabled = true; - this.listBox1.Location = new System.Drawing.Point(5, 57); - this.listBox1.Name = "listBox1"; - this.listBox1.Size = new System.Drawing.Size(298, 212); - this.listBox1.TabIndex = 1; - this.listBox1.SelectedIndexChanged += new System.EventHandler(this.ListBox1SelectedIndexChanged); - // - // pictureBoxImage - // - this.pictureBoxImage.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.pictureBoxImage.Location = new System.Drawing.Point(6, 19); - this.pictureBoxImage.Name = "pictureBoxImage"; - this.pictureBoxImage.Size = new System.Drawing.Size(452, 214); - this.pictureBoxImage.TabIndex = 1; - this.pictureBoxImage.TabStop = false; - // - // comboBoxLanguages - // - this.comboBoxLanguages.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxLanguages.FormattingEnabled = true; - this.comboBoxLanguages.Location = new System.Drawing.Point(6, 30); - this.comboBoxLanguages.Name = "comboBoxLanguages"; - this.comboBoxLanguages.Size = new System.Drawing.Size(297, 21); - this.comboBoxLanguages.TabIndex = 0; - this.comboBoxLanguages.SelectedIndexChanged += new System.EventHandler(this.ComboBoxLanguagesSelectedIndexChanged); - // - // labelChooseLanguage - // - this.labelChooseLanguage.AutoSize = true; - this.labelChooseLanguage.Location = new System.Drawing.Point(6, 11); - this.labelChooseLanguage.Name = "labelChooseLanguage"; - this.labelChooseLanguage.Size = new System.Drawing.Size(146, 13); - this.labelChooseLanguage.TabIndex = 3; - this.labelChooseLanguage.Text = "Choose language (stream-id)"; - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(692, 281); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 5; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.ButtonCancelClick); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(487, 281); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 3; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); - // - // groupBoxImage - // - this.groupBoxImage.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxImage.Controls.Add(this.pictureBoxImage); - this.groupBoxImage.Location = new System.Drawing.Point(309, 30); - this.groupBoxImage.Name = "groupBoxImage"; - this.groupBoxImage.Size = new System.Drawing.Size(464, 239); - this.groupBoxImage.TabIndex = 2; - this.groupBoxImage.TabStop = false; - this.groupBoxImage.Text = "Subtitle image"; - // - // buttonSaveAs - // - this.buttonSaveAs.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonSaveAs.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonSaveAs.Location = new System.Drawing.Point(568, 281); - this.buttonSaveAs.Name = "buttonSaveAs"; - this.buttonSaveAs.Size = new System.Drawing.Size(118, 23); - this.buttonSaveAs.TabIndex = 4; - this.buttonSaveAs.Text = "Save as..."; - this.buttonSaveAs.UseVisualStyleBackColor = true; - this.buttonSaveAs.Click += new System.EventHandler(this.buttonSaveAs_Click); - // - // DvdSubRipChooseLanguage - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(779, 314); - this.Controls.Add(this.buttonSaveAs); - this.Controls.Add(this.groupBoxImage); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.labelChooseLanguage); - this.Controls.Add(this.comboBoxLanguages); - this.Controls.Add(this.listBox1); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(700, 350); - this.Name = "DvdSubRipChooseLanguage"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Choose language"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.DvdSubRipShowSubtitles_KeyDown); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxImage)).EndInit(); - this.groupBoxImage.ResumeLayout(false); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.ListBox listBox1; - private System.Windows.Forms.PictureBox pictureBoxImage; - private System.Windows.Forms.ComboBox comboBoxLanguages; - private System.Windows.Forms.Label labelChooseLanguage; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.GroupBox groupBoxImage; - private System.Windows.Forms.Button buttonSaveAs; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class DvdSubRipChooseLanguage + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.listBox1 = new System.Windows.Forms.ListBox(); + this.pictureBoxImage = new System.Windows.Forms.PictureBox(); + this.comboBoxLanguages = new System.Windows.Forms.ComboBox(); + this.labelChooseLanguage = new System.Windows.Forms.Label(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.groupBoxImage = new System.Windows.Forms.GroupBox(); + this.buttonSaveAs = new System.Windows.Forms.Button(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxImage)).BeginInit(); + this.groupBoxImage.SuspendLayout(); + this.SuspendLayout(); + // + // listBox1 + // + this.listBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.listBox1.FormattingEnabled = true; + this.listBox1.Location = new System.Drawing.Point(5, 57); + this.listBox1.Name = "listBox1"; + this.listBox1.Size = new System.Drawing.Size(298, 212); + this.listBox1.TabIndex = 1; + this.listBox1.SelectedIndexChanged += new System.EventHandler(this.ListBox1SelectedIndexChanged); + // + // pictureBoxImage + // + this.pictureBoxImage.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pictureBoxImage.Location = new System.Drawing.Point(6, 19); + this.pictureBoxImage.Name = "pictureBoxImage"; + this.pictureBoxImage.Size = new System.Drawing.Size(452, 214); + this.pictureBoxImage.TabIndex = 1; + this.pictureBoxImage.TabStop = false; + // + // comboBoxLanguages + // + this.comboBoxLanguages.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxLanguages.FormattingEnabled = true; + this.comboBoxLanguages.Location = new System.Drawing.Point(6, 30); + this.comboBoxLanguages.Name = "comboBoxLanguages"; + this.comboBoxLanguages.Size = new System.Drawing.Size(297, 21); + this.comboBoxLanguages.TabIndex = 0; + this.comboBoxLanguages.SelectedIndexChanged += new System.EventHandler(this.ComboBoxLanguagesSelectedIndexChanged); + // + // labelChooseLanguage + // + this.labelChooseLanguage.AutoSize = true; + this.labelChooseLanguage.Location = new System.Drawing.Point(6, 11); + this.labelChooseLanguage.Name = "labelChooseLanguage"; + this.labelChooseLanguage.Size = new System.Drawing.Size(146, 13); + this.labelChooseLanguage.TabIndex = 3; + this.labelChooseLanguage.Text = "Choose language (stream-id)"; + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(692, 281); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 5; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.ButtonCancelClick); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(487, 281); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 3; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); + // + // groupBoxImage + // + this.groupBoxImage.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxImage.Controls.Add(this.pictureBoxImage); + this.groupBoxImage.Location = new System.Drawing.Point(309, 30); + this.groupBoxImage.Name = "groupBoxImage"; + this.groupBoxImage.Size = new System.Drawing.Size(464, 239); + this.groupBoxImage.TabIndex = 2; + this.groupBoxImage.TabStop = false; + this.groupBoxImage.Text = "Subtitle image"; + // + // buttonSaveAs + // + this.buttonSaveAs.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonSaveAs.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonSaveAs.Location = new System.Drawing.Point(568, 281); + this.buttonSaveAs.Name = "buttonSaveAs"; + this.buttonSaveAs.Size = new System.Drawing.Size(118, 23); + this.buttonSaveAs.TabIndex = 4; + this.buttonSaveAs.Text = "Save as..."; + this.buttonSaveAs.UseVisualStyleBackColor = true; + this.buttonSaveAs.Click += new System.EventHandler(this.buttonSaveAs_Click); + // + // DvdSubRipChooseLanguage + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(779, 314); + this.Controls.Add(this.buttonSaveAs); + this.Controls.Add(this.groupBoxImage); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.labelChooseLanguage); + this.Controls.Add(this.comboBoxLanguages); + this.Controls.Add(this.listBox1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(700, 350); + this.Name = "DvdSubRipChooseLanguage"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Choose language"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.DvdSubRipShowSubtitles_KeyDown); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxImage)).EndInit(); + this.groupBoxImage.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ListBox listBox1; + private System.Windows.Forms.PictureBox pictureBoxImage; + private System.Windows.Forms.ComboBox comboBoxLanguages; + private System.Windows.Forms.Label labelChooseLanguage; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.GroupBox groupBoxImage; + private System.Windows.Forms.Button buttonSaveAs; + } } \ No newline at end of file diff --git a/src/Forms/DvdSubRipChooseLanguage.cs b/src/ui/Forms/DvdSubRipChooseLanguage.cs similarity index 97% rename from src/Forms/DvdSubRipChooseLanguage.cs rename to src/ui/Forms/DvdSubRipChooseLanguage.cs index 1b21ebea0..77b418446 100644 --- a/src/Forms/DvdSubRipChooseLanguage.cs +++ b/src/ui/Forms/DvdSubRipChooseLanguage.cs @@ -1,222 +1,222 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.VobSub; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; -using Nikse.SubtitleEdit.Forms.Ocr; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class DvdSubRipChooseLanguage : Form - { - private class SubListBoxItem - { - public string Name { get; } - public VobSubMergedPack SubPack { get; } - public override string ToString() - { - return Name; - } - - public SubListBoxItem(string name, VobSubMergedPack subPack) - { - Name = name; - SubPack = subPack; - } - } - - private List _mergedVobSubPacks; - private List _palette; - private List _languages; - - public List SelectedVobSubMergedPacks { get; private set; } - public string SelectedLanguageString { get; private set; } - - public DvdSubRipChooseLanguage() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - Text = Configuration.Settings.Language.DvdSubRipChooseLanguage.Title; - labelChooseLanguage.Text = Configuration.Settings.Language.DvdSubRipChooseLanguage.ChooseLanguageStreamId; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - buttonSaveAs.Text = Configuration.Settings.Language.Main.Menu.File.SaveAs; - groupBoxImage.Text = Configuration.Settings.Language.DvdSubRipChooseLanguage.SubtitleImage; - UiUtil.FixLargeFonts(this, buttonOK); - } - - internal void Initialize(List mergedVobSubPacks, List palette, List languages, string selectedLanguage) - { - _mergedVobSubPacks = mergedVobSubPacks; - _palette = palette; - - var uniqueLanguageStreamIds = new List(); - foreach (var pack in mergedVobSubPacks) - { - if (!uniqueLanguageStreamIds.Contains(pack.StreamId)) - { - uniqueLanguageStreamIds.Add(pack.StreamId); - } - } - - comboBoxLanguages.Items.Clear(); - foreach (string languageName in languages) - { - if (uniqueLanguageStreamIds.Contains(GetLanguageIdFromString(languageName))) // only list languages actually found in vob - { - comboBoxLanguages.Items.Add(languageName); - if (languageName == selectedLanguage) - { - comboBoxLanguages.SelectedIndex = comboBoxLanguages.Items.Count - 1; - } - - uniqueLanguageStreamIds.Remove(GetLanguageIdFromString(languageName)); - } - } - - foreach (var existingLanguageId in uniqueLanguageStreamIds) // subtitle tracks not supplied from IFO - { - // Use U+200E (LEFT-TO-RIGHT MARK) to support right-to-left scripts - comboBoxLanguages.Items.Add(string.Format("{0} \x200E(0x{1:x})", Configuration.Settings.Language.DvdSubRipChooseLanguage.UnknownLanguage, existingLanguageId)); - } - - if (comboBoxLanguages.Items.Count > 0 && comboBoxLanguages.SelectedIndex < 0) - { - comboBoxLanguages.SelectedIndex = 0; - } - - _languages = languages; - } - - private static string ShowInSrtFormat(TimeSpan ts) - { - return $"{ts.Hours:00}:{ts.Minutes:00}:{ts.Seconds:00},{ts.Milliseconds:000}"; - } - - private void ListBox1SelectedIndexChanged(object sender, EventArgs e) - { - var x = listBox1.Items[listBox1.SelectedIndex] as SubListBoxItem; - - Bitmap bmp = x.SubPack.SubPicture.GetBitmap(_palette, Color.Transparent, Color.Wheat, Color.Black, Color.DarkGray, false); - if (bmp.Width > pictureBoxImage.Width || bmp.Height > pictureBoxImage.Height) - { - float width = bmp.Width; - float height = bmp.Height; - while (width > pictureBoxImage.Width || height > pictureBoxImage.Height) - { - width = width * 95 / 100; - height = height * 95 / 100; - } - - var temp = new Bitmap((int)width, (int)height); - using (var g = Graphics.FromImage(temp)) - { - g.DrawImage(bmp, 0, 0, (int)width, (int)height); - } - - bmp = temp; - } - pictureBoxImage.Image = bmp; - groupBoxImage.Text = string.Format(Configuration.Settings.Language.DvdSubRipChooseLanguage.SubtitleImageXofYAndWidthXHeight, listBox1.SelectedIndex + 1, listBox1.Items.Count, bmp.Width, bmp.Height); - } - - private static int GetLanguageIdFromString(string currentLanguage) - { - currentLanguage = currentLanguage.Substring(currentLanguage.IndexOf("0x", StringComparison.Ordinal) + 2).TrimEnd(')'); - return Convert.ToInt32(currentLanguage, 16); - } - - private void ComboBoxLanguagesSelectedIndexChanged(object sender, EventArgs e) - { - int chosenStreamId = GetLanguageIdFromString(comboBoxLanguages.Items[comboBoxLanguages.SelectedIndex].ToString()); - - listBox1.Items.Clear(); - for (int i = 0; i < _mergedVobSubPacks.Count; i++) - { - var x = _mergedVobSubPacks[i]; - if (x.StreamId == chosenStreamId) - { - string s = $"#{i:000}: Stream-id=0X{x.StreamId:X} - {ShowInSrtFormat(x.StartTime)} --> {ShowInSrtFormat(x.EndTime)}"; - listBox1.Items.Add(new SubListBoxItem(s, x)); - } - } - if (listBox1.Items.Count > 0) - { - listBox1.SelectedIndex = 0; - } - } - - private void ButtonOkClick(object sender, EventArgs e) - { - SelectActive(); - } - - internal void SelectActive() - { - if (_languages != null && comboBoxLanguages.SelectedIndex >= 0 && comboBoxLanguages.SelectedIndex < _languages.Count) - { - SelectedLanguageString = _languages[comboBoxLanguages.SelectedIndex]; - } - else - { - SelectedLanguageString = null; - } - - SelectedVobSubMergedPacks = new List(); - foreach (var x in listBox1.Items) - { - SelectedVobSubMergedPacks.Add((x as SubListBoxItem).SubPack); - } - DialogResult = DialogResult.OK; - } - - private void ButtonCancelClick(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private void DvdSubRipShowSubtitles_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - e.SuppressKeyPress = true; - DialogResult = DialogResult.Cancel; - } - } - - private void buttonSaveAs_Click(object sender, EventArgs e) - { - if (_languages != null && comboBoxLanguages.SelectedIndex >= 0 && comboBoxLanguages.SelectedIndex < _languages.Count) - { - SelectedLanguageString = _languages[comboBoxLanguages.SelectedIndex]; - } - else - { - SelectedLanguageString = null; - } - - var subs = new List(); - foreach (var x in listBox1.Items) - { - subs.Add((x as SubListBoxItem).SubPack); - } - - using (var formSubOcr = new VobSubOcr()) - { - formSubOcr.InitializeQuick(subs, _palette, Configuration.Settings.VobSubOcr, SelectedLanguageString); - var subtitle = formSubOcr.ReadyVobSubRip(); - - using (var exportBdnXmlPng = new ExportPngXml()) - { - exportBdnXmlPng.InitializeFromVobSubOcr(subtitle, new Core.SubtitleFormats.SubRip(), ExportPngXml.ExportFormats.VobSub, "DVD", formSubOcr, SelectedLanguageString); - exportBdnXmlPng.ShowDialog(this); - } - } - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.VobSub; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Forms.Ocr; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class DvdSubRipChooseLanguage : Form + { + private class SubListBoxItem + { + public string Name { get; } + public VobSubMergedPack SubPack { get; } + public override string ToString() + { + return Name; + } + + public SubListBoxItem(string name, VobSubMergedPack subPack) + { + Name = name; + SubPack = subPack; + } + } + + private List _mergedVobSubPacks; + private List _palette; + private List _languages; + + public List SelectedVobSubMergedPacks { get; private set; } + public string SelectedLanguageString { get; private set; } + + public DvdSubRipChooseLanguage() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + Text = Configuration.Settings.Language.DvdSubRipChooseLanguage.Title; + labelChooseLanguage.Text = Configuration.Settings.Language.DvdSubRipChooseLanguage.ChooseLanguageStreamId; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + buttonSaveAs.Text = Configuration.Settings.Language.Main.Menu.File.SaveAs; + groupBoxImage.Text = Configuration.Settings.Language.DvdSubRipChooseLanguage.SubtitleImage; + UiUtil.FixLargeFonts(this, buttonOK); + } + + internal void Initialize(List mergedVobSubPacks, List palette, List languages, string selectedLanguage) + { + _mergedVobSubPacks = mergedVobSubPacks; + _palette = palette; + + var uniqueLanguageStreamIds = new List(); + foreach (var pack in mergedVobSubPacks) + { + if (!uniqueLanguageStreamIds.Contains(pack.StreamId)) + { + uniqueLanguageStreamIds.Add(pack.StreamId); + } + } + + comboBoxLanguages.Items.Clear(); + foreach (string languageName in languages) + { + if (uniqueLanguageStreamIds.Contains(GetLanguageIdFromString(languageName))) // only list languages actually found in vob + { + comboBoxLanguages.Items.Add(languageName); + if (languageName == selectedLanguage) + { + comboBoxLanguages.SelectedIndex = comboBoxLanguages.Items.Count - 1; + } + + uniqueLanguageStreamIds.Remove(GetLanguageIdFromString(languageName)); + } + } + + foreach (var existingLanguageId in uniqueLanguageStreamIds) // subtitle tracks not supplied from IFO + { + // Use U+200E (LEFT-TO-RIGHT MARK) to support right-to-left scripts + comboBoxLanguages.Items.Add(string.Format("{0} \x200E(0x{1:x})", Configuration.Settings.Language.DvdSubRipChooseLanguage.UnknownLanguage, existingLanguageId)); + } + + if (comboBoxLanguages.Items.Count > 0 && comboBoxLanguages.SelectedIndex < 0) + { + comboBoxLanguages.SelectedIndex = 0; + } + + _languages = languages; + } + + private static string ShowInSrtFormat(TimeSpan ts) + { + return $"{ts.Hours:00}:{ts.Minutes:00}:{ts.Seconds:00},{ts.Milliseconds:000}"; + } + + private void ListBox1SelectedIndexChanged(object sender, EventArgs e) + { + var x = listBox1.Items[listBox1.SelectedIndex] as SubListBoxItem; + + Bitmap bmp = x.SubPack.SubPicture.GetBitmap(_palette, Color.Transparent, Color.Wheat, Color.Black, Color.DarkGray, false); + if (bmp.Width > pictureBoxImage.Width || bmp.Height > pictureBoxImage.Height) + { + float width = bmp.Width; + float height = bmp.Height; + while (width > pictureBoxImage.Width || height > pictureBoxImage.Height) + { + width = width * 95 / 100; + height = height * 95 / 100; + } + + var temp = new Bitmap((int)width, (int)height); + using (var g = Graphics.FromImage(temp)) + { + g.DrawImage(bmp, 0, 0, (int)width, (int)height); + } + + bmp = temp; + } + pictureBoxImage.Image = bmp; + groupBoxImage.Text = string.Format(Configuration.Settings.Language.DvdSubRipChooseLanguage.SubtitleImageXofYAndWidthXHeight, listBox1.SelectedIndex + 1, listBox1.Items.Count, bmp.Width, bmp.Height); + } + + private static int GetLanguageIdFromString(string currentLanguage) + { + currentLanguage = currentLanguage.Substring(currentLanguage.IndexOf("0x", StringComparison.Ordinal) + 2).TrimEnd(')'); + return Convert.ToInt32(currentLanguage, 16); + } + + private void ComboBoxLanguagesSelectedIndexChanged(object sender, EventArgs e) + { + int chosenStreamId = GetLanguageIdFromString(comboBoxLanguages.Items[comboBoxLanguages.SelectedIndex].ToString()); + + listBox1.Items.Clear(); + for (int i = 0; i < _mergedVobSubPacks.Count; i++) + { + var x = _mergedVobSubPacks[i]; + if (x.StreamId == chosenStreamId) + { + string s = $"#{i:000}: Stream-id=0X{x.StreamId:X} - {ShowInSrtFormat(x.StartTime)} --> {ShowInSrtFormat(x.EndTime)}"; + listBox1.Items.Add(new SubListBoxItem(s, x)); + } + } + if (listBox1.Items.Count > 0) + { + listBox1.SelectedIndex = 0; + } + } + + private void ButtonOkClick(object sender, EventArgs e) + { + SelectActive(); + } + + internal void SelectActive() + { + if (_languages != null && comboBoxLanguages.SelectedIndex >= 0 && comboBoxLanguages.SelectedIndex < _languages.Count) + { + SelectedLanguageString = _languages[comboBoxLanguages.SelectedIndex]; + } + else + { + SelectedLanguageString = null; + } + + SelectedVobSubMergedPacks = new List(); + foreach (var x in listBox1.Items) + { + SelectedVobSubMergedPacks.Add((x as SubListBoxItem).SubPack); + } + DialogResult = DialogResult.OK; + } + + private void ButtonCancelClick(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void DvdSubRipShowSubtitles_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + e.SuppressKeyPress = true; + DialogResult = DialogResult.Cancel; + } + } + + private void buttonSaveAs_Click(object sender, EventArgs e) + { + if (_languages != null && comboBoxLanguages.SelectedIndex >= 0 && comboBoxLanguages.SelectedIndex < _languages.Count) + { + SelectedLanguageString = _languages[comboBoxLanguages.SelectedIndex]; + } + else + { + SelectedLanguageString = null; + } + + var subs = new List(); + foreach (var x in listBox1.Items) + { + subs.Add((x as SubListBoxItem).SubPack); + } + + using (var formSubOcr = new VobSubOcr()) + { + formSubOcr.InitializeQuick(subs, _palette, Configuration.Settings.VobSubOcr, SelectedLanguageString); + var subtitle = formSubOcr.ReadyVobSubRip(); + + using (var exportBdnXmlPng = new ExportPngXml()) + { + exportBdnXmlPng.InitializeFromVobSubOcr(subtitle, new Core.SubtitleFormats.SubRip(), ExportPngXml.ExportFormats.VobSub, "DVD", formSubOcr, SelectedLanguageString); + exportBdnXmlPng.ShowDialog(this); + } + } + } + + } +} diff --git a/src/Forms/Networking/NetworkStart.resx b/src/ui/Forms/DvdSubRipChooseLanguage.resx similarity index 100% rename from src/Forms/Networking/NetworkStart.resx rename to src/ui/Forms/DvdSubRipChooseLanguage.resx diff --git a/src/Forms/EbuColorPicker.Designer.cs b/src/ui/Forms/EbuColorPicker.Designer.cs similarity index 100% rename from src/Forms/EbuColorPicker.Designer.cs rename to src/ui/Forms/EbuColorPicker.Designer.cs diff --git a/src/Forms/EbuColorPicker.cs b/src/ui/Forms/EbuColorPicker.cs similarity index 100% rename from src/Forms/EbuColorPicker.cs rename to src/ui/Forms/EbuColorPicker.cs diff --git a/src/Forms/Ocr/AddBeterMultiMatch.resx b/src/ui/Forms/EbuColorPicker.resx similarity index 100% rename from src/Forms/Ocr/AddBeterMultiMatch.resx rename to src/ui/Forms/EbuColorPicker.resx diff --git a/src/Forms/EbuLanguageCode.Designer.cs b/src/ui/Forms/EbuLanguageCode.Designer.cs similarity index 100% rename from src/Forms/EbuLanguageCode.Designer.cs rename to src/ui/Forms/EbuLanguageCode.Designer.cs diff --git a/src/Forms/EbuLanguageCode.cs b/src/ui/Forms/EbuLanguageCode.cs similarity index 100% rename from src/Forms/EbuLanguageCode.cs rename to src/ui/Forms/EbuLanguageCode.cs diff --git a/src/Forms/Ocr/AddBetterMultiMatchNOcr.resx b/src/ui/Forms/EbuLanguageCode.resx similarity index 100% rename from src/Forms/Ocr/AddBetterMultiMatchNOcr.resx rename to src/ui/Forms/EbuLanguageCode.resx diff --git a/src/Forms/EbuSaveOptions.Designer.cs b/src/ui/Forms/EbuSaveOptions.Designer.cs similarity index 98% rename from src/Forms/EbuSaveOptions.Designer.cs rename to src/ui/Forms/EbuSaveOptions.Designer.cs index f93b12565..3862b9af0 100644 --- a/src/Forms/EbuSaveOptions.Designer.cs +++ b/src/ui/Forms/EbuSaveOptions.Designer.cs @@ -1,1041 +1,1041 @@ -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - partial class EbuSaveOptions - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - TimeCode timeCode1 = new TimeCode(); - this.buttonOK = new System.Windows.Forms.Button(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); - this.tabControl1 = new System.Windows.Forms.TabControl(); - this.tabPageHeader = new System.Windows.Forms.TabPage(); - this.labelMaxCharsPerRow38ForTeletext = new System.Windows.Forms.Label(); - this.labelLanguageCodeFriendlyName = new System.Windows.Forms.Label(); - this.buttonChooseLanguageCode = new System.Windows.Forms.Button(); - this.timeUpDownStartTime = new Nikse.SubtitleEdit.Controls.TimeUpDown(); - this.labelDisplayStandardCodeWarning = new System.Windows.Forms.Label(); - this.labelFrameRate = new System.Windows.Forms.Label(); - this.comboBoxFrameRate = new System.Windows.Forms.ComboBox(); - this.labelTimeCodeStartOfProgramme = new System.Windows.Forms.Label(); - this.labelTimeCodeStatus = new System.Windows.Forms.Label(); - this.comboBoxTimeCodeStatus = new System.Windows.Forms.ComboBox(); - this.comboBoxDisplayStandardCode = new System.Windows.Forms.ComboBox(); - this.labelDisplayStandardCode = new System.Windows.Forms.Label(); - this.textBoxCountryOfOrigin = new System.Windows.Forms.TextBox(); - this.labelCountryOfOrigin = new System.Windows.Forms.Label(); - this.textBoxCodePageNumber = new System.Windows.Forms.TextBox(); - this.contextMenuStripCodeTable = new System.Windows.Forms.ContextMenuStrip(this.components); - this.unitedStatesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.multilingualToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.portugalToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.canadaFrenchToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.nordicToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.numericUpDownMaxRows = new System.Windows.Forms.NumericUpDown(); - this.labelMaxNumberOfDisplayableRows = new System.Windows.Forms.Label(); - this.comboBoxDiscFormatCode = new System.Windows.Forms.ComboBox(); - this.labelDiskFormatCode = new System.Windows.Forms.Label(); - this.labelCodePageNumber = new System.Windows.Forms.Label(); - this.textBoxLanguageCode = new System.Windows.Forms.TextBox(); - this.labelLanguageCode = new System.Windows.Forms.Label(); - this.numericUpDownMaxCharacters = new System.Windows.Forms.NumericUpDown(); - this.labelMaxNoOfDisplayableChars = new System.Windows.Forms.Label(); - this.numericUpDownDiskSequenceNumber = new System.Windows.Forms.NumericUpDown(); - this.numericUpDownTotalNumberOfDiscs = new System.Windows.Forms.NumericUpDown(); - this.numericUpDownRevisionNumber = new System.Windows.Forms.NumericUpDown(); - this.labelDiskSequenceNumber = new System.Windows.Forms.Label(); - this.labelTotalNumberOfDisks = new System.Windows.Forms.Label(); - this.labelRevisionNumber = new System.Windows.Forms.Label(); - this.textBoxTranslatorsName = new System.Windows.Forms.TextBox(); - this.labelTranslatorsName = new System.Windows.Forms.Label(); - this.textBoxSubtitleListReferenceCode = new System.Windows.Forms.TextBox(); - this.labelSubtitleListReferenceCode = new System.Windows.Forms.Label(); - this.comboBoxCharacterCodeTable = new System.Windows.Forms.ComboBox(); - this.buttonImport = new System.Windows.Forms.Button(); - this.labelCharacterCodeTable = new System.Windows.Forms.Label(); - this.textBoxTranslatedProgramTitle = new System.Windows.Forms.TextBox(); - this.textBoxTranslatedEpisodeTitle = new System.Windows.Forms.TextBox(); - this.textBoxOriginalEpisodeTitle = new System.Windows.Forms.TextBox(); - this.labelTranslatedEpisodeTitle = new System.Windows.Forms.Label(); - this.labelTranslatedProgramTitle = new System.Windows.Forms.Label(); - this.labelOriginalEpisodeTitle = new System.Windows.Forms.Label(); - this.textBoxOriginalProgramTitle = new System.Windows.Forms.TextBox(); - this.labelOriginalProgramTitle = new System.Windows.Forms.Label(); - this.tabPageTextAndTiming = new System.Windows.Forms.TabPage(); - this.groupBoxVerticalPosition = new System.Windows.Forms.GroupBox(); - this.labelUseBox = new System.Windows.Forms.Label(); - this.numericUpDownNewLineRows = new System.Windows.Forms.NumericUpDown(); - this.labelNewLineRows = new System.Windows.Forms.Label(); - this.labelMarginTop = new System.Windows.Forms.Label(); - this.numericUpDownMarginBottom = new System.Windows.Forms.NumericUpDown(); - this.numericUpDownMarginTop = new System.Windows.Forms.NumericUpDown(); - this.labelMarginBottom = new System.Windows.Forms.Label(); - this.groupBoxTeletext = new System.Windows.Forms.GroupBox(); - this.checkBoxTeletextDoubleHeight = new System.Windows.Forms.CheckBox(); - this.checkBoxTeletextBox = new System.Windows.Forms.CheckBox(); - this.comboBoxJustificationCode = new System.Windows.Forms.ComboBox(); - this.labelJustificationCode = new System.Windows.Forms.Label(); - this.tabPageErrors = new System.Windows.Forms.TabPage(); - this.textBoxErrors = new System.Windows.Forms.TextBox(); - this.labelErrors = new System.Windows.Forms.Label(); - this.tabControl1.SuspendLayout(); - this.tabPageHeader.SuspendLayout(); - this.contextMenuStripCodeTable.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxRows)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxCharacters)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDiskSequenceNumber)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownTotalNumberOfDiscs)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRevisionNumber)).BeginInit(); - this.tabPageTextAndTiming.SuspendLayout(); - this.groupBoxVerticalPosition.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownNewLineRows)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMarginBottom)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMarginTop)).BeginInit(); - this.groupBoxTeletext.SuspendLayout(); - this.tabPageErrors.SuspendLayout(); - this.SuspendLayout(); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(607, 510); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 1; - this.buttonOK.Text = "Save"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(688, 510); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 2; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // openFileDialog1 - // - this.openFileDialog1.FileName = "openFileDialog1"; - // - // tabControl1 - // - this.tabControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.tabControl1.Controls.Add(this.tabPageHeader); - this.tabControl1.Controls.Add(this.tabPageTextAndTiming); - this.tabControl1.Controls.Add(this.tabPageErrors); - this.tabControl1.Location = new System.Drawing.Point(12, 12); - this.tabControl1.Name = "tabControl1"; - this.tabControl1.SelectedIndex = 0; - this.tabControl1.Size = new System.Drawing.Size(758, 487); - this.tabControl1.TabIndex = 0; - // - // tabPageHeader - // - this.tabPageHeader.Controls.Add(this.labelMaxCharsPerRow38ForTeletext); - this.tabPageHeader.Controls.Add(this.labelLanguageCodeFriendlyName); - this.tabPageHeader.Controls.Add(this.buttonChooseLanguageCode); - this.tabPageHeader.Controls.Add(this.timeUpDownStartTime); - this.tabPageHeader.Controls.Add(this.labelDisplayStandardCodeWarning); - this.tabPageHeader.Controls.Add(this.labelFrameRate); - this.tabPageHeader.Controls.Add(this.comboBoxFrameRate); - this.tabPageHeader.Controls.Add(this.labelTimeCodeStartOfProgramme); - this.tabPageHeader.Controls.Add(this.labelTimeCodeStatus); - this.tabPageHeader.Controls.Add(this.comboBoxTimeCodeStatus); - this.tabPageHeader.Controls.Add(this.comboBoxDisplayStandardCode); - this.tabPageHeader.Controls.Add(this.labelDisplayStandardCode); - this.tabPageHeader.Controls.Add(this.textBoxCountryOfOrigin); - this.tabPageHeader.Controls.Add(this.labelCountryOfOrigin); - this.tabPageHeader.Controls.Add(this.textBoxCodePageNumber); - this.tabPageHeader.Controls.Add(this.numericUpDownMaxRows); - this.tabPageHeader.Controls.Add(this.labelMaxNumberOfDisplayableRows); - this.tabPageHeader.Controls.Add(this.comboBoxDiscFormatCode); - this.tabPageHeader.Controls.Add(this.labelDiskFormatCode); - this.tabPageHeader.Controls.Add(this.labelCodePageNumber); - this.tabPageHeader.Controls.Add(this.textBoxLanguageCode); - this.tabPageHeader.Controls.Add(this.labelLanguageCode); - this.tabPageHeader.Controls.Add(this.numericUpDownMaxCharacters); - this.tabPageHeader.Controls.Add(this.labelMaxNoOfDisplayableChars); - this.tabPageHeader.Controls.Add(this.numericUpDownDiskSequenceNumber); - this.tabPageHeader.Controls.Add(this.numericUpDownTotalNumberOfDiscs); - this.tabPageHeader.Controls.Add(this.numericUpDownRevisionNumber); - this.tabPageHeader.Controls.Add(this.labelDiskSequenceNumber); - this.tabPageHeader.Controls.Add(this.labelTotalNumberOfDisks); - this.tabPageHeader.Controls.Add(this.labelRevisionNumber); - this.tabPageHeader.Controls.Add(this.textBoxTranslatorsName); - this.tabPageHeader.Controls.Add(this.labelTranslatorsName); - this.tabPageHeader.Controls.Add(this.textBoxSubtitleListReferenceCode); - this.tabPageHeader.Controls.Add(this.labelSubtitleListReferenceCode); - this.tabPageHeader.Controls.Add(this.comboBoxCharacterCodeTable); - this.tabPageHeader.Controls.Add(this.buttonImport); - this.tabPageHeader.Controls.Add(this.labelCharacterCodeTable); - this.tabPageHeader.Controls.Add(this.textBoxTranslatedProgramTitle); - this.tabPageHeader.Controls.Add(this.textBoxTranslatedEpisodeTitle); - this.tabPageHeader.Controls.Add(this.textBoxOriginalEpisodeTitle); - this.tabPageHeader.Controls.Add(this.labelTranslatedEpisodeTitle); - this.tabPageHeader.Controls.Add(this.labelTranslatedProgramTitle); - this.tabPageHeader.Controls.Add(this.labelOriginalEpisodeTitle); - this.tabPageHeader.Controls.Add(this.textBoxOriginalProgramTitle); - this.tabPageHeader.Controls.Add(this.labelOriginalProgramTitle); - this.tabPageHeader.Location = new System.Drawing.Point(4, 22); - this.tabPageHeader.Name = "tabPageHeader"; - this.tabPageHeader.Padding = new System.Windows.Forms.Padding(3); - this.tabPageHeader.Size = new System.Drawing.Size(750, 461); - this.tabPageHeader.TabIndex = 0; - this.tabPageHeader.Text = "General subtitle information"; - this.tabPageHeader.UseVisualStyleBackColor = true; - // - // labelMaxCharsPerRow38ForTeletext - // - this.labelMaxCharsPerRow38ForTeletext.AutoSize = true; - this.labelMaxCharsPerRow38ForTeletext.ForeColor = System.Drawing.Color.Red; - this.labelMaxCharsPerRow38ForTeletext.Location = new System.Drawing.Point(443, 347); - this.labelMaxCharsPerRow38ForTeletext.Name = "labelMaxCharsPerRow38ForTeletext"; - this.labelMaxCharsPerRow38ForTeletext.Size = new System.Drawing.Size(198, 13); - this.labelMaxCharsPerRow38ForTeletext.TabIndex = 74; - this.labelMaxCharsPerRow38ForTeletext.Text = "Use 38 in \'Max chars per row\' for teletext"; - // - // labelLanguageCodeFriendlyName - // - this.labelLanguageCodeFriendlyName.AutoSize = true; - this.labelLanguageCodeFriendlyName.ForeColor = System.Drawing.SystemColors.GrayText; - this.labelLanguageCodeFriendlyName.Location = new System.Drawing.Point(440, 157); - this.labelLanguageCodeFriendlyName.Name = "labelLanguageCodeFriendlyName"; - this.labelLanguageCodeFriendlyName.Size = new System.Drawing.Size(166, 13); - this.labelLanguageCodeFriendlyName.TabIndex = 73; - this.labelLanguageCodeFriendlyName.Text = "labelLanguageCodeFriendlyName"; - // - // buttonChooseLanguageCode - // - this.buttonChooseLanguageCode.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonChooseLanguageCode.Location = new System.Drawing.Point(405, 153); - this.buttonChooseLanguageCode.Name = "buttonChooseLanguageCode"; - this.buttonChooseLanguageCode.Size = new System.Drawing.Size(31, 21); - this.buttonChooseLanguageCode.TabIndex = 6; - this.buttonChooseLanguageCode.Text = "..."; - this.buttonChooseLanguageCode.UseVisualStyleBackColor = true; - this.buttonChooseLanguageCode.Click += new System.EventHandler(this.buttonChooseLanguageCode_Click); - // - // timeUpDownStartTime - // - this.timeUpDownStartTime.AutoSize = true; - this.timeUpDownStartTime.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.timeUpDownStartTime.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F); - this.timeUpDownStartTime.Location = new System.Drawing.Point(179, 411); - this.timeUpDownStartTime.Margin = new System.Windows.Forms.Padding(4); - this.timeUpDownStartTime.Name = "timeUpDownStartTime"; - this.timeUpDownStartTime.Size = new System.Drawing.Size(111, 27); - this.timeUpDownStartTime.TabIndex = 14; - timeCode1.Hours = 0; - timeCode1.Milliseconds = 0; - timeCode1.Minutes = 0; - timeCode1.Seconds = 0; - timeCode1.TimeSpan = System.TimeSpan.Parse("00:00:00"); - timeCode1.TotalMilliseconds = 0D; - timeCode1.TotalSeconds = 0D; - this.timeUpDownStartTime.TimeCode = timeCode1; - this.timeUpDownStartTime.UseVideoOffset = false; - // - // labelDisplayStandardCodeWarning - // - this.labelDisplayStandardCodeWarning.AutoSize = true; - this.labelDisplayStandardCodeWarning.ForeColor = System.Drawing.Color.Red; - this.labelDisplayStandardCodeWarning.Location = new System.Drawing.Point(406, 102); - this.labelDisplayStandardCodeWarning.Name = "labelDisplayStandardCodeWarning"; - this.labelDisplayStandardCodeWarning.Size = new System.Drawing.Size(146, 13); - this.labelDisplayStandardCodeWarning.TabIndex = 72; - this.labelDisplayStandardCodeWarning.Text = "Use teletext to include colors!"; - // - // labelFrameRate - // - this.labelFrameRate.AutoSize = true; - this.labelFrameRate.Location = new System.Drawing.Point(6, 72); - this.labelFrameRate.Name = "labelFrameRate"; - this.labelFrameRate.Size = new System.Drawing.Size(57, 13); - this.labelFrameRate.TabIndex = 71; - this.labelFrameRate.Text = "Frame rate"; - // - // comboBoxFrameRate - // - this.comboBoxFrameRate.FormattingEnabled = true; - this.comboBoxFrameRate.Location = new System.Drawing.Point(181, 69); - this.comboBoxFrameRate.Name = "comboBoxFrameRate"; - this.comboBoxFrameRate.Size = new System.Drawing.Size(219, 21); - this.comboBoxFrameRate.TabIndex = 2; - // - // labelTimeCodeStartOfProgramme - // - this.labelTimeCodeStartOfProgramme.AutoSize = true; - this.labelTimeCodeStartOfProgramme.Location = new System.Drawing.Point(5, 416); - this.labelTimeCodeStartOfProgramme.Name = "labelTimeCodeStartOfProgramme"; - this.labelTimeCodeStartOfProgramme.Size = new System.Drawing.Size(152, 13); - this.labelTimeCodeStartOfProgramme.TabIndex = 69; - this.labelTimeCodeStartOfProgramme.Text = "Time code: Start of programme"; - // - // labelTimeCodeStatus - // - this.labelTimeCodeStatus.AutoSize = true; - this.labelTimeCodeStatus.Location = new System.Drawing.Point(6, 386); - this.labelTimeCodeStatus.Name = "labelTimeCodeStatus"; - this.labelTimeCodeStatus.Size = new System.Drawing.Size(88, 13); - this.labelTimeCodeStatus.TabIndex = 68; - this.labelTimeCodeStatus.Text = "Time code status"; - // - // comboBoxTimeCodeStatus - // - this.comboBoxTimeCodeStatus.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxTimeCodeStatus.FormattingEnabled = true; - this.comboBoxTimeCodeStatus.Items.AddRange(new object[] { - "Not intended for use", - "Intended for use"}); - this.comboBoxTimeCodeStatus.Location = new System.Drawing.Point(181, 383); - this.comboBoxTimeCodeStatus.Name = "comboBoxTimeCodeStatus"; - this.comboBoxTimeCodeStatus.Size = new System.Drawing.Size(219, 21); - this.comboBoxTimeCodeStatus.TabIndex = 13; - // - // comboBoxDisplayStandardCode - // - this.comboBoxDisplayStandardCode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxDisplayStandardCode.FormattingEnabled = true; - this.comboBoxDisplayStandardCode.Items.AddRange(new object[] { - "0 Open subtitling", - "1 Level-1 teletext", - "2 Level-2 teletext", - "Undefined"}); - this.comboBoxDisplayStandardCode.Location = new System.Drawing.Point(181, 99); - this.comboBoxDisplayStandardCode.Name = "comboBoxDisplayStandardCode"; - this.comboBoxDisplayStandardCode.Size = new System.Drawing.Size(219, 21); - this.comboBoxDisplayStandardCode.TabIndex = 3; - this.comboBoxDisplayStandardCode.SelectedIndexChanged += new System.EventHandler(this.comboBoxDisplayStandardCode_SelectedIndexChanged); - // - // labelDisplayStandardCode - // - this.labelDisplayStandardCode.AutoSize = true; - this.labelDisplayStandardCode.Location = new System.Drawing.Point(6, 102); - this.labelDisplayStandardCode.Name = "labelDisplayStandardCode"; - this.labelDisplayStandardCode.Size = new System.Drawing.Size(112, 13); - this.labelDisplayStandardCode.TabIndex = 65; - this.labelDisplayStandardCode.Text = "Display standard code"; - // - // textBoxCountryOfOrigin - // - this.textBoxCountryOfOrigin.Location = new System.Drawing.Point(181, 340); - this.textBoxCountryOfOrigin.MaxLength = 3; - this.textBoxCountryOfOrigin.Name = "textBoxCountryOfOrigin"; - this.textBoxCountryOfOrigin.Size = new System.Drawing.Size(219, 20); - this.textBoxCountryOfOrigin.TabIndex = 12; - // - // labelCountryOfOrigin - // - this.labelCountryOfOrigin.AutoSize = true; - this.labelCountryOfOrigin.Location = new System.Drawing.Point(6, 343); - this.labelCountryOfOrigin.Name = "labelCountryOfOrigin"; - this.labelCountryOfOrigin.Size = new System.Drawing.Size(83, 13); - this.labelCountryOfOrigin.TabIndex = 63; - this.labelCountryOfOrigin.Text = "Country of origin"; - // - // textBoxCodePageNumber - // - this.textBoxCodePageNumber.ContextMenuStrip = this.contextMenuStripCodeTable; - this.textBoxCodePageNumber.Location = new System.Drawing.Point(181, 12); - this.textBoxCodePageNumber.MaxLength = 3; - this.textBoxCodePageNumber.Name = "textBoxCodePageNumber"; - this.textBoxCodePageNumber.Size = new System.Drawing.Size(219, 20); - this.textBoxCodePageNumber.TabIndex = 0; - // - // contextMenuStripCodeTable - // - this.contextMenuStripCodeTable.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.unitedStatesToolStripMenuItem, - this.multilingualToolStripMenuItem, - this.portugalToolStripMenuItem, - this.canadaFrenchToolStripMenuItem, - this.nordicToolStripMenuItem}); - this.contextMenuStripCodeTable.Name = "contextMenuStripCodeTable"; - this.contextMenuStripCodeTable.Size = new System.Drawing.Size(185, 114); - // - // unitedStatesToolStripMenuItem - // - this.unitedStatesToolStripMenuItem.Name = "unitedStatesToolStripMenuItem"; - this.unitedStatesToolStripMenuItem.Size = new System.Drawing.Size(184, 22); - this.unitedStatesToolStripMenuItem.Text = "United States (437)"; - this.unitedStatesToolStripMenuItem.Click += new System.EventHandler(this.unitedStatesToolStripMenuItem_Click); - // - // multilingualToolStripMenuItem - // - this.multilingualToolStripMenuItem.Name = "multilingualToolStripMenuItem"; - this.multilingualToolStripMenuItem.Size = new System.Drawing.Size(184, 22); - this.multilingualToolStripMenuItem.Text = "Multilingual (850)"; - this.multilingualToolStripMenuItem.Click += new System.EventHandler(this.multilingualToolStripMenuItem_Click); - // - // portugalToolStripMenuItem - // - this.portugalToolStripMenuItem.Name = "portugalToolStripMenuItem"; - this.portugalToolStripMenuItem.Size = new System.Drawing.Size(184, 22); - this.portugalToolStripMenuItem.Text = "Portugal (860)"; - this.portugalToolStripMenuItem.Click += new System.EventHandler(this.portugalToolStripMenuItem_Click); - // - // canadaFrenchToolStripMenuItem - // - this.canadaFrenchToolStripMenuItem.Name = "canadaFrenchToolStripMenuItem"; - this.canadaFrenchToolStripMenuItem.Size = new System.Drawing.Size(184, 22); - this.canadaFrenchToolStripMenuItem.Text = "Canada-French (863)"; - this.canadaFrenchToolStripMenuItem.Click += new System.EventHandler(this.canadaFrenchToolStripMenuItem_Click); - // - // nordicToolStripMenuItem - // - this.nordicToolStripMenuItem.Name = "nordicToolStripMenuItem"; - this.nordicToolStripMenuItem.Size = new System.Drawing.Size(184, 22); - this.nordicToolStripMenuItem.Text = "Nordic (865)"; - this.nordicToolStripMenuItem.Click += new System.EventHandler(this.nordicToolStripMenuItem_Click); - // - // numericUpDownMaxRows - // - this.numericUpDownMaxRows.Location = new System.Drawing.Point(613, 251); - this.numericUpDownMaxRows.Maximum = new decimal(new int[] { - 99, - 0, - 0, - 0}); - this.numericUpDownMaxRows.Name = "numericUpDownMaxRows"; - this.numericUpDownMaxRows.Size = new System.Drawing.Size(120, 20); - this.numericUpDownMaxRows.TabIndex = 17; - // - // labelMaxNumberOfDisplayableRows - // - this.labelMaxNumberOfDisplayableRows.AutoSize = true; - this.labelMaxNumberOfDisplayableRows.Location = new System.Drawing.Point(473, 253); - this.labelMaxNumberOfDisplayableRows.Name = "labelMaxNumberOfDisplayableRows"; - this.labelMaxNumberOfDisplayableRows.Size = new System.Drawing.Size(126, 13); - this.labelMaxNumberOfDisplayableRows.TabIndex = 60; - this.labelMaxNumberOfDisplayableRows.Text = "Max# of displayable rows"; - // - // comboBoxDiscFormatCode - // - this.comboBoxDiscFormatCode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxDiscFormatCode.FormattingEnabled = true; - this.comboBoxDiscFormatCode.Items.AddRange(new object[] { - "STL23.01 (non-standard)", - "STL24.01 (non-standard)", - "STL25.01", - "STL29.01 (non-standard)", - "STL30.01"}); - this.comboBoxDiscFormatCode.Location = new System.Drawing.Point(181, 39); - this.comboBoxDiscFormatCode.Name = "comboBoxDiscFormatCode"; - this.comboBoxDiscFormatCode.Size = new System.Drawing.Size(219, 21); - this.comboBoxDiscFormatCode.TabIndex = 1; - this.comboBoxDiscFormatCode.SelectedIndexChanged += new System.EventHandler(this.comboBoxDiscFormatCode_SelectedIndexChanged); - // - // labelDiskFormatCode - // - this.labelDiskFormatCode.AutoSize = true; - this.labelDiskFormatCode.Location = new System.Drawing.Point(6, 42); - this.labelDiskFormatCode.Name = "labelDiskFormatCode"; - this.labelDiskFormatCode.Size = new System.Drawing.Size(87, 13); - this.labelDiskFormatCode.TabIndex = 58; - this.labelDiskFormatCode.Text = "Disk format code"; - // - // labelCodePageNumber - // - this.labelCodePageNumber.AutoSize = true; - this.labelCodePageNumber.Location = new System.Drawing.Point(6, 15); - this.labelCodePageNumber.Name = "labelCodePageNumber"; - this.labelCodePageNumber.Size = new System.Drawing.Size(97, 13); - this.labelCodePageNumber.TabIndex = 56; - this.labelCodePageNumber.Text = "Code page number"; - // - // textBoxLanguageCode - // - this.textBoxLanguageCode.Location = new System.Drawing.Point(181, 154); - this.textBoxLanguageCode.MaxLength = 32; - this.textBoxLanguageCode.Name = "textBoxLanguageCode"; - this.textBoxLanguageCode.Size = new System.Drawing.Size(219, 20); - this.textBoxLanguageCode.TabIndex = 5; - this.textBoxLanguageCode.TextChanged += new System.EventHandler(this.textBoxLanguageCode_TextChanged); - // - // labelLanguageCode - // - this.labelLanguageCode.AutoSize = true; - this.labelLanguageCode.Location = new System.Drawing.Point(6, 157); - this.labelLanguageCode.Name = "labelLanguageCode"; - this.labelLanguageCode.Size = new System.Drawing.Size(82, 13); - this.labelLanguageCode.TabIndex = 54; - this.labelLanguageCode.Text = "Language code"; - // - // numericUpDownMaxCharacters - // - this.numericUpDownMaxCharacters.Location = new System.Drawing.Point(613, 225); - this.numericUpDownMaxCharacters.Maximum = new decimal(new int[] { - 99, - 0, - 0, - 0}); - this.numericUpDownMaxCharacters.Name = "numericUpDownMaxCharacters"; - this.numericUpDownMaxCharacters.Size = new System.Drawing.Size(120, 20); - this.numericUpDownMaxCharacters.TabIndex = 16; - this.numericUpDownMaxCharacters.ValueChanged += new System.EventHandler(this.numericUpDownMaxCharacters_ValueChanged); - // - // labelMaxNoOfDisplayableChars - // - this.labelMaxNoOfDisplayableChars.AutoSize = true; - this.labelMaxNoOfDisplayableChars.Location = new System.Drawing.Point(473, 227); - this.labelMaxNoOfDisplayableChars.Name = "labelMaxNoOfDisplayableChars"; - this.labelMaxNoOfDisplayableChars.Size = new System.Drawing.Size(133, 13); - this.labelMaxNoOfDisplayableChars.TabIndex = 51; - this.labelMaxNoOfDisplayableChars.Text = "Max# of displayable chars "; - // - // numericUpDownDiskSequenceNumber - // - this.numericUpDownDiskSequenceNumber.Location = new System.Drawing.Point(613, 277); - this.numericUpDownDiskSequenceNumber.Maximum = new decimal(new int[] { - 9, - 0, - 0, - 0}); - this.numericUpDownDiskSequenceNumber.Name = "numericUpDownDiskSequenceNumber"; - this.numericUpDownDiskSequenceNumber.Size = new System.Drawing.Size(120, 20); - this.numericUpDownDiskSequenceNumber.TabIndex = 18; - // - // numericUpDownTotalNumberOfDiscs - // - this.numericUpDownTotalNumberOfDiscs.Location = new System.Drawing.Point(613, 303); - this.numericUpDownTotalNumberOfDiscs.Maximum = new decimal(new int[] { - 9, - 0, - 0, - 0}); - this.numericUpDownTotalNumberOfDiscs.Name = "numericUpDownTotalNumberOfDiscs"; - this.numericUpDownTotalNumberOfDiscs.Size = new System.Drawing.Size(120, 20); - this.numericUpDownTotalNumberOfDiscs.TabIndex = 19; - // - // numericUpDownRevisionNumber - // - this.numericUpDownRevisionNumber.Location = new System.Drawing.Point(613, 199); - this.numericUpDownRevisionNumber.Maximum = new decimal(new int[] { - 99, - 0, - 0, - 0}); - this.numericUpDownRevisionNumber.Name = "numericUpDownRevisionNumber"; - this.numericUpDownRevisionNumber.Size = new System.Drawing.Size(120, 20); - this.numericUpDownRevisionNumber.TabIndex = 15; - // - // labelDiskSequenceNumber - // - this.labelDiskSequenceNumber.AutoSize = true; - this.labelDiskSequenceNumber.Location = new System.Drawing.Point(473, 279); - this.labelDiskSequenceNumber.Name = "labelDiskSequenceNumber"; - this.labelDiskSequenceNumber.Size = new System.Drawing.Size(116, 13); - this.labelDiskSequenceNumber.TabIndex = 49; - this.labelDiskSequenceNumber.Text = "Disk sequence number"; - // - // labelTotalNumberOfDisks - // - this.labelTotalNumberOfDisks.AutoSize = true; - this.labelTotalNumberOfDisks.Location = new System.Drawing.Point(473, 305); - this.labelTotalNumberOfDisks.Name = "labelTotalNumberOfDisks"; - this.labelTotalNumberOfDisks.Size = new System.Drawing.Size(108, 13); - this.labelTotalNumberOfDisks.TabIndex = 48; - this.labelTotalNumberOfDisks.Text = "Total number of disks"; - // - // labelRevisionNumber - // - this.labelRevisionNumber.AutoSize = true; - this.labelRevisionNumber.Location = new System.Drawing.Point(473, 201); - this.labelRevisionNumber.Name = "labelRevisionNumber"; - this.labelRevisionNumber.Size = new System.Drawing.Size(86, 13); - this.labelRevisionNumber.TabIndex = 47; - this.labelRevisionNumber.Text = "Revision number"; - // - // textBoxTranslatorsName - // - this.textBoxTranslatorsName.Location = new System.Drawing.Point(181, 284); - this.textBoxTranslatorsName.MaxLength = 32; - this.textBoxTranslatorsName.Name = "textBoxTranslatorsName"; - this.textBoxTranslatorsName.Size = new System.Drawing.Size(219, 20); - this.textBoxTranslatorsName.TabIndex = 10; - // - // labelTranslatorsName - // - this.labelTranslatorsName.AutoSize = true; - this.labelTranslatorsName.Location = new System.Drawing.Point(6, 287); - this.labelTranslatorsName.Name = "labelTranslatorsName"; - this.labelTranslatorsName.Size = new System.Drawing.Size(90, 13); - this.labelTranslatorsName.TabIndex = 45; - this.labelTranslatorsName.Text = "Translator\'s name"; - // - // textBoxSubtitleListReferenceCode - // - this.textBoxSubtitleListReferenceCode.Location = new System.Drawing.Point(181, 314); - this.textBoxSubtitleListReferenceCode.MaxLength = 16; - this.textBoxSubtitleListReferenceCode.Name = "textBoxSubtitleListReferenceCode"; - this.textBoxSubtitleListReferenceCode.Size = new System.Drawing.Size(219, 20); - this.textBoxSubtitleListReferenceCode.TabIndex = 11; - // - // labelSubtitleListReferenceCode - // - this.labelSubtitleListReferenceCode.AutoSize = true; - this.labelSubtitleListReferenceCode.Location = new System.Drawing.Point(6, 317); - this.labelSubtitleListReferenceCode.Name = "labelSubtitleListReferenceCode"; - this.labelSubtitleListReferenceCode.Size = new System.Drawing.Size(132, 13); - this.labelSubtitleListReferenceCode.TabIndex = 43; - this.labelSubtitleListReferenceCode.Text = "Subtitle list reference code"; - // - // comboBoxCharacterCodeTable - // - this.comboBoxCharacterCodeTable.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxCharacterCodeTable.FormattingEnabled = true; - this.comboBoxCharacterCodeTable.Items.AddRange(new object[] { - "Latin", - "Latin/Cyrillic", - "Latin/Arabic", - "Latin/Greek", - "Latin/Hebrew"}); - this.comboBoxCharacterCodeTable.Location = new System.Drawing.Point(181, 126); - this.comboBoxCharacterCodeTable.Name = "comboBoxCharacterCodeTable"; - this.comboBoxCharacterCodeTable.Size = new System.Drawing.Size(219, 21); - this.comboBoxCharacterCodeTable.TabIndex = 4; - // - // buttonImport - // - this.buttonImport.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonImport.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonImport.Location = new System.Drawing.Point(613, 6); - this.buttonImport.Name = "buttonImport"; - this.buttonImport.Size = new System.Drawing.Size(134, 23); - this.buttonImport.TabIndex = 20; - this.buttonImport.Text = "Import..."; - this.buttonImport.UseVisualStyleBackColor = true; - this.buttonImport.Click += new System.EventHandler(this.buttonImport_Click); - // - // labelCharacterCodeTable - // - this.labelCharacterCodeTable.AutoSize = true; - this.labelCharacterCodeTable.Location = new System.Drawing.Point(6, 129); - this.labelCharacterCodeTable.Name = "labelCharacterCodeTable"; - this.labelCharacterCodeTable.Size = new System.Drawing.Size(106, 13); - this.labelCharacterCodeTable.TabIndex = 40; - this.labelCharacterCodeTable.Text = "Character code table"; - // - // textBoxTranslatedProgramTitle - // - this.textBoxTranslatedProgramTitle.Location = new System.Drawing.Point(181, 232); - this.textBoxTranslatedProgramTitle.MaxLength = 32; - this.textBoxTranslatedProgramTitle.Name = "textBoxTranslatedProgramTitle"; - this.textBoxTranslatedProgramTitle.Size = new System.Drawing.Size(219, 20); - this.textBoxTranslatedProgramTitle.TabIndex = 8; - // - // textBoxTranslatedEpisodeTitle - // - this.textBoxTranslatedEpisodeTitle.Location = new System.Drawing.Point(181, 258); - this.textBoxTranslatedEpisodeTitle.MaxLength = 32; - this.textBoxTranslatedEpisodeTitle.Name = "textBoxTranslatedEpisodeTitle"; - this.textBoxTranslatedEpisodeTitle.Size = new System.Drawing.Size(219, 20); - this.textBoxTranslatedEpisodeTitle.TabIndex = 9; - // - // textBoxOriginalEpisodeTitle - // - this.textBoxOriginalEpisodeTitle.Location = new System.Drawing.Point(181, 206); - this.textBoxOriginalEpisodeTitle.MaxLength = 32; - this.textBoxOriginalEpisodeTitle.Name = "textBoxOriginalEpisodeTitle"; - this.textBoxOriginalEpisodeTitle.Size = new System.Drawing.Size(219, 20); - this.textBoxOriginalEpisodeTitle.TabIndex = 7; - // - // labelTranslatedEpisodeTitle - // - this.labelTranslatedEpisodeTitle.AutoSize = true; - this.labelTranslatedEpisodeTitle.Location = new System.Drawing.Point(6, 261); - this.labelTranslatedEpisodeTitle.Name = "labelTranslatedEpisodeTitle"; - this.labelTranslatedEpisodeTitle.Size = new System.Drawing.Size(116, 13); - this.labelTranslatedEpisodeTitle.TabIndex = 36; - this.labelTranslatedEpisodeTitle.Text = "Translated episode title"; - // - // labelTranslatedProgramTitle - // - this.labelTranslatedProgramTitle.AutoSize = true; - this.labelTranslatedProgramTitle.Location = new System.Drawing.Point(6, 235); - this.labelTranslatedProgramTitle.Name = "labelTranslatedProgramTitle"; - this.labelTranslatedProgramTitle.Size = new System.Drawing.Size(117, 13); - this.labelTranslatedProgramTitle.TabIndex = 35; - this.labelTranslatedProgramTitle.Text = "Translated program title"; - // - // labelOriginalEpisodeTitle - // - this.labelOriginalEpisodeTitle.AutoSize = true; - this.labelOriginalEpisodeTitle.Location = new System.Drawing.Point(6, 209); - this.labelOriginalEpisodeTitle.Name = "labelOriginalEpisodeTitle"; - this.labelOriginalEpisodeTitle.Size = new System.Drawing.Size(101, 13); - this.labelOriginalEpisodeTitle.TabIndex = 34; - this.labelOriginalEpisodeTitle.Text = "Original episode title"; - // - // textBoxOriginalProgramTitle - // - this.textBoxOriginalProgramTitle.Location = new System.Drawing.Point(181, 180); - this.textBoxOriginalProgramTitle.MaxLength = 32; - this.textBoxOriginalProgramTitle.Name = "textBoxOriginalProgramTitle"; - this.textBoxOriginalProgramTitle.Size = new System.Drawing.Size(219, 20); - this.textBoxOriginalProgramTitle.TabIndex = 6; - // - // labelOriginalProgramTitle - // - this.labelOriginalProgramTitle.AutoSize = true; - this.labelOriginalProgramTitle.Location = new System.Drawing.Point(6, 183); - this.labelOriginalProgramTitle.Name = "labelOriginalProgramTitle"; - this.labelOriginalProgramTitle.Size = new System.Drawing.Size(102, 13); - this.labelOriginalProgramTitle.TabIndex = 32; - this.labelOriginalProgramTitle.Text = "Original program title"; - // - // tabPageTextAndTiming - // - this.tabPageTextAndTiming.Controls.Add(this.groupBoxVerticalPosition); - this.tabPageTextAndTiming.Controls.Add(this.groupBoxTeletext); - this.tabPageTextAndTiming.Controls.Add(this.comboBoxJustificationCode); - this.tabPageTextAndTiming.Controls.Add(this.labelJustificationCode); - this.tabPageTextAndTiming.Location = new System.Drawing.Point(4, 22); - this.tabPageTextAndTiming.Name = "tabPageTextAndTiming"; - this.tabPageTextAndTiming.Size = new System.Drawing.Size(750, 461); - this.tabPageTextAndTiming.TabIndex = 2; - this.tabPageTextAndTiming.Text = "Text and timing information"; - this.tabPageTextAndTiming.UseVisualStyleBackColor = true; - // - // groupBoxVerticalPosition - // - this.groupBoxVerticalPosition.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxVerticalPosition.Controls.Add(this.labelUseBox); - this.groupBoxVerticalPosition.Controls.Add(this.numericUpDownNewLineRows); - this.groupBoxVerticalPosition.Controls.Add(this.labelNewLineRows); - this.groupBoxVerticalPosition.Controls.Add(this.labelMarginTop); - this.groupBoxVerticalPosition.Controls.Add(this.numericUpDownMarginBottom); - this.groupBoxVerticalPosition.Controls.Add(this.numericUpDownMarginTop); - this.groupBoxVerticalPosition.Controls.Add(this.labelMarginBottom); - this.groupBoxVerticalPosition.Location = new System.Drawing.Point(9, 49); - this.groupBoxVerticalPosition.Name = "groupBoxVerticalPosition"; - this.groupBoxVerticalPosition.Size = new System.Drawing.Size(727, 201); - this.groupBoxVerticalPosition.TabIndex = 46; - this.groupBoxVerticalPosition.TabStop = false; - this.groupBoxVerticalPosition.Text = "Vertical position"; - // - // labelUseBox - // - this.labelUseBox.AutoSize = true; - this.labelUseBox.ForeColor = System.Drawing.Color.Red; - this.labelUseBox.Location = new System.Drawing.Point(318, 80); - this.labelUseBox.Name = "labelUseBox"; - this.labelUseBox.Size = new System.Drawing.Size(240, 13); - this.labelUseBox.TabIndex = 73; - this.labelUseBox.Text = "Check \'Use box around text\' for only one new-line"; - this.labelUseBox.Visible = false; - // - // numericUpDownNewLineRows - // - this.numericUpDownNewLineRows.Location = new System.Drawing.Point(256, 78); - this.numericUpDownNewLineRows.Maximum = new decimal(new int[] { - 10, - 0, - 0, - 0}); - this.numericUpDownNewLineRows.Name = "numericUpDownNewLineRows"; - this.numericUpDownNewLineRows.Size = new System.Drawing.Size(56, 20); - this.numericUpDownNewLineRows.TabIndex = 54; - this.numericUpDownNewLineRows.Value = new decimal(new int[] { - 2, - 0, - 0, - 0}); - this.numericUpDownNewLineRows.ValueChanged += new System.EventHandler(this.numericUpDownNewLineRows_ValueChanged); - // - // labelNewLineRows - // - this.labelNewLineRows.AutoSize = true; - this.labelNewLineRows.Location = new System.Drawing.Point(13, 80); - this.labelNewLineRows.Name = "labelNewLineRows"; - this.labelNewLineRows.Size = new System.Drawing.Size(179, 13); - this.labelNewLineRows.TabIndex = 53; - this.labelNewLineRows.Text = "Number of rows added by a new line"; - // - // labelMarginTop - // - this.labelMarginTop.AutoSize = true; - this.labelMarginTop.Location = new System.Drawing.Point(13, 28); - this.labelMarginTop.Name = "labelMarginTop"; - this.labelMarginTop.Size = new System.Drawing.Size(174, 13); - this.labelMarginTop.TabIndex = 49; - this.labelMarginTop.Text = "Margin top (for top aligned subtitles)"; - // - // numericUpDownMarginBottom - // - this.numericUpDownMarginBottom.Location = new System.Drawing.Point(256, 52); - this.numericUpDownMarginBottom.Maximum = new decimal(new int[] { - 50, - 0, - 0, - 0}); - this.numericUpDownMarginBottom.Name = "numericUpDownMarginBottom"; - this.numericUpDownMarginBottom.Size = new System.Drawing.Size(56, 20); - this.numericUpDownMarginBottom.TabIndex = 52; - // - // numericUpDownMarginTop - // - this.numericUpDownMarginTop.Location = new System.Drawing.Point(256, 26); - this.numericUpDownMarginTop.Maximum = new decimal(new int[] { - 50, - 0, - 0, - 0}); - this.numericUpDownMarginTop.Name = "numericUpDownMarginTop"; - this.numericUpDownMarginTop.Size = new System.Drawing.Size(56, 20); - this.numericUpDownMarginTop.TabIndex = 48; - // - // labelMarginBottom - // - this.labelMarginBottom.AutoSize = true; - this.labelMarginBottom.Location = new System.Drawing.Point(13, 54); - this.labelMarginBottom.Name = "labelMarginBottom"; - this.labelMarginBottom.Size = new System.Drawing.Size(208, 13); - this.labelMarginBottom.TabIndex = 51; - this.labelMarginBottom.Text = "Margin bottom (for bottom aligned subtitles)"; - // - // groupBoxTeletext - // - this.groupBoxTeletext.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxTeletext.Controls.Add(this.checkBoxTeletextDoubleHeight); - this.groupBoxTeletext.Controls.Add(this.checkBoxTeletextBox); - this.groupBoxTeletext.Location = new System.Drawing.Point(9, 256); - this.groupBoxTeletext.Name = "groupBoxTeletext"; - this.groupBoxTeletext.Size = new System.Drawing.Size(727, 190); - this.groupBoxTeletext.TabIndex = 45; - this.groupBoxTeletext.TabStop = false; - this.groupBoxTeletext.Text = "Teletext"; - // - // checkBoxTeletextDoubleHeight - // - this.checkBoxTeletextDoubleHeight.AutoSize = true; - this.checkBoxTeletextDoubleHeight.Location = new System.Drawing.Point(16, 57); - this.checkBoxTeletextDoubleHeight.Name = "checkBoxTeletextDoubleHeight"; - this.checkBoxTeletextDoubleHeight.Size = new System.Drawing.Size(124, 17); - this.checkBoxTeletextDoubleHeight.TabIndex = 1; - this.checkBoxTeletextDoubleHeight.Text = "Text is double height"; - this.checkBoxTeletextDoubleHeight.UseVisualStyleBackColor = true; - // - // checkBoxTeletextBox - // - this.checkBoxTeletextBox.AutoSize = true; - this.checkBoxTeletextBox.Location = new System.Drawing.Point(16, 34); - this.checkBoxTeletextBox.Name = "checkBoxTeletextBox"; - this.checkBoxTeletextBox.Size = new System.Drawing.Size(121, 17); - this.checkBoxTeletextBox.TabIndex = 0; - this.checkBoxTeletextBox.Text = "Use box around text"; - this.checkBoxTeletextBox.UseVisualStyleBackColor = true; - this.checkBoxTeletextBox.CheckedChanged += new System.EventHandler(this.checkBoxTeletextBox_CheckedChanged); - // - // comboBoxJustificationCode - // - this.comboBoxJustificationCode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxJustificationCode.FormattingEnabled = true; - this.comboBoxJustificationCode.Items.AddRange(new object[] { - "unchanged presentation", - "left-justified text", - "centred text", - "right-justified text"}); - this.comboBoxJustificationCode.Location = new System.Drawing.Point(145, 11); - this.comboBoxJustificationCode.Name = "comboBoxJustificationCode"; - this.comboBoxJustificationCode.Size = new System.Drawing.Size(219, 21); - this.comboBoxJustificationCode.TabIndex = 43; - // - // labelJustificationCode - // - this.labelJustificationCode.AutoSize = true; - this.labelJustificationCode.Location = new System.Drawing.Point(6, 14); - this.labelJustificationCode.Name = "labelJustificationCode"; - this.labelJustificationCode.Size = new System.Drawing.Size(89, 13); - this.labelJustificationCode.TabIndex = 44; - this.labelJustificationCode.Text = "Justification code"; - // - // tabPageErrors - // - this.tabPageErrors.Controls.Add(this.textBoxErrors); - this.tabPageErrors.Controls.Add(this.labelErrors); - this.tabPageErrors.Location = new System.Drawing.Point(4, 22); - this.tabPageErrors.Name = "tabPageErrors"; - this.tabPageErrors.Padding = new System.Windows.Forms.Padding(3); - this.tabPageErrors.Size = new System.Drawing.Size(750, 461); - this.tabPageErrors.TabIndex = 1; - this.tabPageErrors.Text = "Errors"; - this.tabPageErrors.UseVisualStyleBackColor = true; - // - // textBoxErrors - // - this.textBoxErrors.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.textBoxErrors.Location = new System.Drawing.Point(6, 26); - this.textBoxErrors.Multiline = true; - this.textBoxErrors.Name = "textBoxErrors"; - this.textBoxErrors.ReadOnly = true; - this.textBoxErrors.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.textBoxErrors.Size = new System.Drawing.Size(729, 386); - this.textBoxErrors.TabIndex = 13; - // - // labelErrors - // - this.labelErrors.AutoSize = true; - this.labelErrors.Location = new System.Drawing.Point(3, 10); - this.labelErrors.Name = "labelErrors"; - this.labelErrors.Size = new System.Drawing.Size(34, 13); - this.labelErrors.TabIndex = 12; - this.labelErrors.Text = "Errors"; - // - // EbuSaveOptions - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(775, 542); - this.Controls.Add(this.tabControl1); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.buttonCancel); - this.MinimumSize = new System.Drawing.Size(785, 570); - this.Name = "EbuSaveOptions"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "EbuSaveOptions"; - this.tabControl1.ResumeLayout(false); - this.tabPageHeader.ResumeLayout(false); - this.tabPageHeader.PerformLayout(); - this.contextMenuStripCodeTable.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxRows)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxCharacters)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDiskSequenceNumber)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownTotalNumberOfDiscs)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRevisionNumber)).EndInit(); - this.tabPageTextAndTiming.ResumeLayout(false); - this.tabPageTextAndTiming.PerformLayout(); - this.groupBoxVerticalPosition.ResumeLayout(false); - this.groupBoxVerticalPosition.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownNewLineRows)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMarginBottom)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMarginTop)).EndInit(); - this.groupBoxTeletext.ResumeLayout(false); - this.groupBoxTeletext.PerformLayout(); - this.tabPageErrors.ResumeLayout(false); - this.tabPageErrors.PerformLayout(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.OpenFileDialog openFileDialog1; - private System.Windows.Forms.TabControl tabControl1; - private System.Windows.Forms.TabPage tabPageHeader; - private System.Windows.Forms.NumericUpDown numericUpDownDiskSequenceNumber; - private System.Windows.Forms.NumericUpDown numericUpDownTotalNumberOfDiscs; - private System.Windows.Forms.NumericUpDown numericUpDownRevisionNumber; - private System.Windows.Forms.Label labelDiskSequenceNumber; - private System.Windows.Forms.Label labelTotalNumberOfDisks; - private System.Windows.Forms.Label labelRevisionNumber; - private System.Windows.Forms.TextBox textBoxTranslatorsName; - private System.Windows.Forms.Label labelTranslatorsName; - private System.Windows.Forms.TextBox textBoxSubtitleListReferenceCode; - private System.Windows.Forms.Label labelSubtitleListReferenceCode; - private System.Windows.Forms.ComboBox comboBoxCharacterCodeTable; - private System.Windows.Forms.Button buttonImport; - private System.Windows.Forms.Label labelCharacterCodeTable; - private System.Windows.Forms.TextBox textBoxTranslatedProgramTitle; - private System.Windows.Forms.TextBox textBoxTranslatedEpisodeTitle; - private System.Windows.Forms.TextBox textBoxOriginalEpisodeTitle; - private System.Windows.Forms.Label labelTranslatedEpisodeTitle; - private System.Windows.Forms.Label labelTranslatedProgramTitle; - private System.Windows.Forms.Label labelOriginalEpisodeTitle; - private System.Windows.Forms.TextBox textBoxOriginalProgramTitle; - private System.Windows.Forms.Label labelOriginalProgramTitle; - private System.Windows.Forms.TabPage tabPageTextAndTiming; - private System.Windows.Forms.TabPage tabPageErrors; - private System.Windows.Forms.TextBox textBoxErrors; - private System.Windows.Forms.Label labelErrors; - private System.Windows.Forms.ComboBox comboBoxJustificationCode; - private System.Windows.Forms.Label labelJustificationCode; - private System.Windows.Forms.NumericUpDown numericUpDownMaxCharacters; - private System.Windows.Forms.Label labelMaxNoOfDisplayableChars; - private System.Windows.Forms.TextBox textBoxLanguageCode; - private System.Windows.Forms.Label labelLanguageCode; - private System.Windows.Forms.Label labelCodePageNumber; - private System.Windows.Forms.ComboBox comboBoxDiscFormatCode; - private System.Windows.Forms.Label labelDiskFormatCode; - private System.Windows.Forms.NumericUpDown numericUpDownMaxRows; - private System.Windows.Forms.Label labelMaxNumberOfDisplayableRows; - private System.Windows.Forms.TextBox textBoxCodePageNumber; - private System.Windows.Forms.ContextMenuStrip contextMenuStripCodeTable; - private System.Windows.Forms.ToolStripMenuItem unitedStatesToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem multilingualToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem portugalToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem canadaFrenchToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem nordicToolStripMenuItem; - private System.Windows.Forms.TextBox textBoxCountryOfOrigin; - private System.Windows.Forms.Label labelCountryOfOrigin; - private System.Windows.Forms.ComboBox comboBoxDisplayStandardCode; - private System.Windows.Forms.Label labelDisplayStandardCode; - private System.Windows.Forms.Label labelTimeCodeStartOfProgramme; - private System.Windows.Forms.Label labelTimeCodeStatus; - private System.Windows.Forms.ComboBox comboBoxTimeCodeStatus; - private Controls.TimeUpDown timeUpDownStartTime; - private System.Windows.Forms.Label labelFrameRate; - private System.Windows.Forms.ComboBox comboBoxFrameRate; - private System.Windows.Forms.GroupBox groupBoxTeletext; - private System.Windows.Forms.CheckBox checkBoxTeletextDoubleHeight; - private System.Windows.Forms.CheckBox checkBoxTeletextBox; - private System.Windows.Forms.GroupBox groupBoxVerticalPosition; - private System.Windows.Forms.Label labelMarginBottom; - private System.Windows.Forms.NumericUpDown numericUpDownMarginTop; - private System.Windows.Forms.Label labelMarginTop; - private System.Windows.Forms.NumericUpDown numericUpDownNewLineRows; - private System.Windows.Forms.Label labelNewLineRows; - private System.Windows.Forms.NumericUpDown numericUpDownMarginBottom; - private System.Windows.Forms.Label labelDisplayStandardCodeWarning; - private System.Windows.Forms.Button buttonChooseLanguageCode; - private System.Windows.Forms.Label labelLanguageCodeFriendlyName; - private System.Windows.Forms.Label labelUseBox; - private System.Windows.Forms.Label labelMaxCharsPerRow38ForTeletext; - } +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + partial class EbuSaveOptions + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + TimeCode timeCode1 = new TimeCode(); + this.buttonOK = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); + this.tabControl1 = new System.Windows.Forms.TabControl(); + this.tabPageHeader = new System.Windows.Forms.TabPage(); + this.labelMaxCharsPerRow38ForTeletext = new System.Windows.Forms.Label(); + this.labelLanguageCodeFriendlyName = new System.Windows.Forms.Label(); + this.buttonChooseLanguageCode = new System.Windows.Forms.Button(); + this.timeUpDownStartTime = new Nikse.SubtitleEdit.Controls.TimeUpDown(); + this.labelDisplayStandardCodeWarning = new System.Windows.Forms.Label(); + this.labelFrameRate = new System.Windows.Forms.Label(); + this.comboBoxFrameRate = new System.Windows.Forms.ComboBox(); + this.labelTimeCodeStartOfProgramme = new System.Windows.Forms.Label(); + this.labelTimeCodeStatus = new System.Windows.Forms.Label(); + this.comboBoxTimeCodeStatus = new System.Windows.Forms.ComboBox(); + this.comboBoxDisplayStandardCode = new System.Windows.Forms.ComboBox(); + this.labelDisplayStandardCode = new System.Windows.Forms.Label(); + this.textBoxCountryOfOrigin = new System.Windows.Forms.TextBox(); + this.labelCountryOfOrigin = new System.Windows.Forms.Label(); + this.textBoxCodePageNumber = new System.Windows.Forms.TextBox(); + this.contextMenuStripCodeTable = new System.Windows.Forms.ContextMenuStrip(this.components); + this.unitedStatesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.multilingualToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.portugalToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.canadaFrenchToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.nordicToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.numericUpDownMaxRows = new System.Windows.Forms.NumericUpDown(); + this.labelMaxNumberOfDisplayableRows = new System.Windows.Forms.Label(); + this.comboBoxDiscFormatCode = new System.Windows.Forms.ComboBox(); + this.labelDiskFormatCode = new System.Windows.Forms.Label(); + this.labelCodePageNumber = new System.Windows.Forms.Label(); + this.textBoxLanguageCode = new System.Windows.Forms.TextBox(); + this.labelLanguageCode = new System.Windows.Forms.Label(); + this.numericUpDownMaxCharacters = new System.Windows.Forms.NumericUpDown(); + this.labelMaxNoOfDisplayableChars = new System.Windows.Forms.Label(); + this.numericUpDownDiskSequenceNumber = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownTotalNumberOfDiscs = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownRevisionNumber = new System.Windows.Forms.NumericUpDown(); + this.labelDiskSequenceNumber = new System.Windows.Forms.Label(); + this.labelTotalNumberOfDisks = new System.Windows.Forms.Label(); + this.labelRevisionNumber = new System.Windows.Forms.Label(); + this.textBoxTranslatorsName = new System.Windows.Forms.TextBox(); + this.labelTranslatorsName = new System.Windows.Forms.Label(); + this.textBoxSubtitleListReferenceCode = new System.Windows.Forms.TextBox(); + this.labelSubtitleListReferenceCode = new System.Windows.Forms.Label(); + this.comboBoxCharacterCodeTable = new System.Windows.Forms.ComboBox(); + this.buttonImport = new System.Windows.Forms.Button(); + this.labelCharacterCodeTable = new System.Windows.Forms.Label(); + this.textBoxTranslatedProgramTitle = new System.Windows.Forms.TextBox(); + this.textBoxTranslatedEpisodeTitle = new System.Windows.Forms.TextBox(); + this.textBoxOriginalEpisodeTitle = new System.Windows.Forms.TextBox(); + this.labelTranslatedEpisodeTitle = new System.Windows.Forms.Label(); + this.labelTranslatedProgramTitle = new System.Windows.Forms.Label(); + this.labelOriginalEpisodeTitle = new System.Windows.Forms.Label(); + this.textBoxOriginalProgramTitle = new System.Windows.Forms.TextBox(); + this.labelOriginalProgramTitle = new System.Windows.Forms.Label(); + this.tabPageTextAndTiming = new System.Windows.Forms.TabPage(); + this.groupBoxVerticalPosition = new System.Windows.Forms.GroupBox(); + this.labelUseBox = new System.Windows.Forms.Label(); + this.numericUpDownNewLineRows = new System.Windows.Forms.NumericUpDown(); + this.labelNewLineRows = new System.Windows.Forms.Label(); + this.labelMarginTop = new System.Windows.Forms.Label(); + this.numericUpDownMarginBottom = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownMarginTop = new System.Windows.Forms.NumericUpDown(); + this.labelMarginBottom = new System.Windows.Forms.Label(); + this.groupBoxTeletext = new System.Windows.Forms.GroupBox(); + this.checkBoxTeletextDoubleHeight = new System.Windows.Forms.CheckBox(); + this.checkBoxTeletextBox = new System.Windows.Forms.CheckBox(); + this.comboBoxJustificationCode = new System.Windows.Forms.ComboBox(); + this.labelJustificationCode = new System.Windows.Forms.Label(); + this.tabPageErrors = new System.Windows.Forms.TabPage(); + this.textBoxErrors = new System.Windows.Forms.TextBox(); + this.labelErrors = new System.Windows.Forms.Label(); + this.tabControl1.SuspendLayout(); + this.tabPageHeader.SuspendLayout(); + this.contextMenuStripCodeTable.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxRows)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxCharacters)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDiskSequenceNumber)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownTotalNumberOfDiscs)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRevisionNumber)).BeginInit(); + this.tabPageTextAndTiming.SuspendLayout(); + this.groupBoxVerticalPosition.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownNewLineRows)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMarginBottom)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMarginTop)).BeginInit(); + this.groupBoxTeletext.SuspendLayout(); + this.tabPageErrors.SuspendLayout(); + this.SuspendLayout(); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(607, 510); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 1; + this.buttonOK.Text = "Save"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(688, 510); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 2; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // openFileDialog1 + // + this.openFileDialog1.FileName = "openFileDialog1"; + // + // tabControl1 + // + this.tabControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tabControl1.Controls.Add(this.tabPageHeader); + this.tabControl1.Controls.Add(this.tabPageTextAndTiming); + this.tabControl1.Controls.Add(this.tabPageErrors); + this.tabControl1.Location = new System.Drawing.Point(12, 12); + this.tabControl1.Name = "tabControl1"; + this.tabControl1.SelectedIndex = 0; + this.tabControl1.Size = new System.Drawing.Size(758, 487); + this.tabControl1.TabIndex = 0; + // + // tabPageHeader + // + this.tabPageHeader.Controls.Add(this.labelMaxCharsPerRow38ForTeletext); + this.tabPageHeader.Controls.Add(this.labelLanguageCodeFriendlyName); + this.tabPageHeader.Controls.Add(this.buttonChooseLanguageCode); + this.tabPageHeader.Controls.Add(this.timeUpDownStartTime); + this.tabPageHeader.Controls.Add(this.labelDisplayStandardCodeWarning); + this.tabPageHeader.Controls.Add(this.labelFrameRate); + this.tabPageHeader.Controls.Add(this.comboBoxFrameRate); + this.tabPageHeader.Controls.Add(this.labelTimeCodeStartOfProgramme); + this.tabPageHeader.Controls.Add(this.labelTimeCodeStatus); + this.tabPageHeader.Controls.Add(this.comboBoxTimeCodeStatus); + this.tabPageHeader.Controls.Add(this.comboBoxDisplayStandardCode); + this.tabPageHeader.Controls.Add(this.labelDisplayStandardCode); + this.tabPageHeader.Controls.Add(this.textBoxCountryOfOrigin); + this.tabPageHeader.Controls.Add(this.labelCountryOfOrigin); + this.tabPageHeader.Controls.Add(this.textBoxCodePageNumber); + this.tabPageHeader.Controls.Add(this.numericUpDownMaxRows); + this.tabPageHeader.Controls.Add(this.labelMaxNumberOfDisplayableRows); + this.tabPageHeader.Controls.Add(this.comboBoxDiscFormatCode); + this.tabPageHeader.Controls.Add(this.labelDiskFormatCode); + this.tabPageHeader.Controls.Add(this.labelCodePageNumber); + this.tabPageHeader.Controls.Add(this.textBoxLanguageCode); + this.tabPageHeader.Controls.Add(this.labelLanguageCode); + this.tabPageHeader.Controls.Add(this.numericUpDownMaxCharacters); + this.tabPageHeader.Controls.Add(this.labelMaxNoOfDisplayableChars); + this.tabPageHeader.Controls.Add(this.numericUpDownDiskSequenceNumber); + this.tabPageHeader.Controls.Add(this.numericUpDownTotalNumberOfDiscs); + this.tabPageHeader.Controls.Add(this.numericUpDownRevisionNumber); + this.tabPageHeader.Controls.Add(this.labelDiskSequenceNumber); + this.tabPageHeader.Controls.Add(this.labelTotalNumberOfDisks); + this.tabPageHeader.Controls.Add(this.labelRevisionNumber); + this.tabPageHeader.Controls.Add(this.textBoxTranslatorsName); + this.tabPageHeader.Controls.Add(this.labelTranslatorsName); + this.tabPageHeader.Controls.Add(this.textBoxSubtitleListReferenceCode); + this.tabPageHeader.Controls.Add(this.labelSubtitleListReferenceCode); + this.tabPageHeader.Controls.Add(this.comboBoxCharacterCodeTable); + this.tabPageHeader.Controls.Add(this.buttonImport); + this.tabPageHeader.Controls.Add(this.labelCharacterCodeTable); + this.tabPageHeader.Controls.Add(this.textBoxTranslatedProgramTitle); + this.tabPageHeader.Controls.Add(this.textBoxTranslatedEpisodeTitle); + this.tabPageHeader.Controls.Add(this.textBoxOriginalEpisodeTitle); + this.tabPageHeader.Controls.Add(this.labelTranslatedEpisodeTitle); + this.tabPageHeader.Controls.Add(this.labelTranslatedProgramTitle); + this.tabPageHeader.Controls.Add(this.labelOriginalEpisodeTitle); + this.tabPageHeader.Controls.Add(this.textBoxOriginalProgramTitle); + this.tabPageHeader.Controls.Add(this.labelOriginalProgramTitle); + this.tabPageHeader.Location = new System.Drawing.Point(4, 22); + this.tabPageHeader.Name = "tabPageHeader"; + this.tabPageHeader.Padding = new System.Windows.Forms.Padding(3); + this.tabPageHeader.Size = new System.Drawing.Size(750, 461); + this.tabPageHeader.TabIndex = 0; + this.tabPageHeader.Text = "General subtitle information"; + this.tabPageHeader.UseVisualStyleBackColor = true; + // + // labelMaxCharsPerRow38ForTeletext + // + this.labelMaxCharsPerRow38ForTeletext.AutoSize = true; + this.labelMaxCharsPerRow38ForTeletext.ForeColor = System.Drawing.Color.Red; + this.labelMaxCharsPerRow38ForTeletext.Location = new System.Drawing.Point(443, 347); + this.labelMaxCharsPerRow38ForTeletext.Name = "labelMaxCharsPerRow38ForTeletext"; + this.labelMaxCharsPerRow38ForTeletext.Size = new System.Drawing.Size(198, 13); + this.labelMaxCharsPerRow38ForTeletext.TabIndex = 74; + this.labelMaxCharsPerRow38ForTeletext.Text = "Use 38 in \'Max chars per row\' for teletext"; + // + // labelLanguageCodeFriendlyName + // + this.labelLanguageCodeFriendlyName.AutoSize = true; + this.labelLanguageCodeFriendlyName.ForeColor = System.Drawing.SystemColors.GrayText; + this.labelLanguageCodeFriendlyName.Location = new System.Drawing.Point(440, 157); + this.labelLanguageCodeFriendlyName.Name = "labelLanguageCodeFriendlyName"; + this.labelLanguageCodeFriendlyName.Size = new System.Drawing.Size(166, 13); + this.labelLanguageCodeFriendlyName.TabIndex = 73; + this.labelLanguageCodeFriendlyName.Text = "labelLanguageCodeFriendlyName"; + // + // buttonChooseLanguageCode + // + this.buttonChooseLanguageCode.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonChooseLanguageCode.Location = new System.Drawing.Point(405, 153); + this.buttonChooseLanguageCode.Name = "buttonChooseLanguageCode"; + this.buttonChooseLanguageCode.Size = new System.Drawing.Size(31, 21); + this.buttonChooseLanguageCode.TabIndex = 6; + this.buttonChooseLanguageCode.Text = "..."; + this.buttonChooseLanguageCode.UseVisualStyleBackColor = true; + this.buttonChooseLanguageCode.Click += new System.EventHandler(this.buttonChooseLanguageCode_Click); + // + // timeUpDownStartTime + // + this.timeUpDownStartTime.AutoSize = true; + this.timeUpDownStartTime.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.timeUpDownStartTime.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F); + this.timeUpDownStartTime.Location = new System.Drawing.Point(179, 411); + this.timeUpDownStartTime.Margin = new System.Windows.Forms.Padding(4); + this.timeUpDownStartTime.Name = "timeUpDownStartTime"; + this.timeUpDownStartTime.Size = new System.Drawing.Size(111, 27); + this.timeUpDownStartTime.TabIndex = 14; + timeCode1.Hours = 0; + timeCode1.Milliseconds = 0; + timeCode1.Minutes = 0; + timeCode1.Seconds = 0; + timeCode1.TimeSpan = System.TimeSpan.Parse("00:00:00"); + timeCode1.TotalMilliseconds = 0D; + timeCode1.TotalSeconds = 0D; + this.timeUpDownStartTime.TimeCode = timeCode1; + this.timeUpDownStartTime.UseVideoOffset = false; + // + // labelDisplayStandardCodeWarning + // + this.labelDisplayStandardCodeWarning.AutoSize = true; + this.labelDisplayStandardCodeWarning.ForeColor = System.Drawing.Color.Red; + this.labelDisplayStandardCodeWarning.Location = new System.Drawing.Point(406, 102); + this.labelDisplayStandardCodeWarning.Name = "labelDisplayStandardCodeWarning"; + this.labelDisplayStandardCodeWarning.Size = new System.Drawing.Size(146, 13); + this.labelDisplayStandardCodeWarning.TabIndex = 72; + this.labelDisplayStandardCodeWarning.Text = "Use teletext to include colors!"; + // + // labelFrameRate + // + this.labelFrameRate.AutoSize = true; + this.labelFrameRate.Location = new System.Drawing.Point(6, 72); + this.labelFrameRate.Name = "labelFrameRate"; + this.labelFrameRate.Size = new System.Drawing.Size(57, 13); + this.labelFrameRate.TabIndex = 71; + this.labelFrameRate.Text = "Frame rate"; + // + // comboBoxFrameRate + // + this.comboBoxFrameRate.FormattingEnabled = true; + this.comboBoxFrameRate.Location = new System.Drawing.Point(181, 69); + this.comboBoxFrameRate.Name = "comboBoxFrameRate"; + this.comboBoxFrameRate.Size = new System.Drawing.Size(219, 21); + this.comboBoxFrameRate.TabIndex = 2; + // + // labelTimeCodeStartOfProgramme + // + this.labelTimeCodeStartOfProgramme.AutoSize = true; + this.labelTimeCodeStartOfProgramme.Location = new System.Drawing.Point(5, 416); + this.labelTimeCodeStartOfProgramme.Name = "labelTimeCodeStartOfProgramme"; + this.labelTimeCodeStartOfProgramme.Size = new System.Drawing.Size(152, 13); + this.labelTimeCodeStartOfProgramme.TabIndex = 69; + this.labelTimeCodeStartOfProgramme.Text = "Time code: Start of programme"; + // + // labelTimeCodeStatus + // + this.labelTimeCodeStatus.AutoSize = true; + this.labelTimeCodeStatus.Location = new System.Drawing.Point(6, 386); + this.labelTimeCodeStatus.Name = "labelTimeCodeStatus"; + this.labelTimeCodeStatus.Size = new System.Drawing.Size(88, 13); + this.labelTimeCodeStatus.TabIndex = 68; + this.labelTimeCodeStatus.Text = "Time code status"; + // + // comboBoxTimeCodeStatus + // + this.comboBoxTimeCodeStatus.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxTimeCodeStatus.FormattingEnabled = true; + this.comboBoxTimeCodeStatus.Items.AddRange(new object[] { + "Not intended for use", + "Intended for use"}); + this.comboBoxTimeCodeStatus.Location = new System.Drawing.Point(181, 383); + this.comboBoxTimeCodeStatus.Name = "comboBoxTimeCodeStatus"; + this.comboBoxTimeCodeStatus.Size = new System.Drawing.Size(219, 21); + this.comboBoxTimeCodeStatus.TabIndex = 13; + // + // comboBoxDisplayStandardCode + // + this.comboBoxDisplayStandardCode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxDisplayStandardCode.FormattingEnabled = true; + this.comboBoxDisplayStandardCode.Items.AddRange(new object[] { + "0 Open subtitling", + "1 Level-1 teletext", + "2 Level-2 teletext", + "Undefined"}); + this.comboBoxDisplayStandardCode.Location = new System.Drawing.Point(181, 99); + this.comboBoxDisplayStandardCode.Name = "comboBoxDisplayStandardCode"; + this.comboBoxDisplayStandardCode.Size = new System.Drawing.Size(219, 21); + this.comboBoxDisplayStandardCode.TabIndex = 3; + this.comboBoxDisplayStandardCode.SelectedIndexChanged += new System.EventHandler(this.comboBoxDisplayStandardCode_SelectedIndexChanged); + // + // labelDisplayStandardCode + // + this.labelDisplayStandardCode.AutoSize = true; + this.labelDisplayStandardCode.Location = new System.Drawing.Point(6, 102); + this.labelDisplayStandardCode.Name = "labelDisplayStandardCode"; + this.labelDisplayStandardCode.Size = new System.Drawing.Size(112, 13); + this.labelDisplayStandardCode.TabIndex = 65; + this.labelDisplayStandardCode.Text = "Display standard code"; + // + // textBoxCountryOfOrigin + // + this.textBoxCountryOfOrigin.Location = new System.Drawing.Point(181, 340); + this.textBoxCountryOfOrigin.MaxLength = 3; + this.textBoxCountryOfOrigin.Name = "textBoxCountryOfOrigin"; + this.textBoxCountryOfOrigin.Size = new System.Drawing.Size(219, 20); + this.textBoxCountryOfOrigin.TabIndex = 12; + // + // labelCountryOfOrigin + // + this.labelCountryOfOrigin.AutoSize = true; + this.labelCountryOfOrigin.Location = new System.Drawing.Point(6, 343); + this.labelCountryOfOrigin.Name = "labelCountryOfOrigin"; + this.labelCountryOfOrigin.Size = new System.Drawing.Size(83, 13); + this.labelCountryOfOrigin.TabIndex = 63; + this.labelCountryOfOrigin.Text = "Country of origin"; + // + // textBoxCodePageNumber + // + this.textBoxCodePageNumber.ContextMenuStrip = this.contextMenuStripCodeTable; + this.textBoxCodePageNumber.Location = new System.Drawing.Point(181, 12); + this.textBoxCodePageNumber.MaxLength = 3; + this.textBoxCodePageNumber.Name = "textBoxCodePageNumber"; + this.textBoxCodePageNumber.Size = new System.Drawing.Size(219, 20); + this.textBoxCodePageNumber.TabIndex = 0; + // + // contextMenuStripCodeTable + // + this.contextMenuStripCodeTable.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.unitedStatesToolStripMenuItem, + this.multilingualToolStripMenuItem, + this.portugalToolStripMenuItem, + this.canadaFrenchToolStripMenuItem, + this.nordicToolStripMenuItem}); + this.contextMenuStripCodeTable.Name = "contextMenuStripCodeTable"; + this.contextMenuStripCodeTable.Size = new System.Drawing.Size(185, 114); + // + // unitedStatesToolStripMenuItem + // + this.unitedStatesToolStripMenuItem.Name = "unitedStatesToolStripMenuItem"; + this.unitedStatesToolStripMenuItem.Size = new System.Drawing.Size(184, 22); + this.unitedStatesToolStripMenuItem.Text = "United States (437)"; + this.unitedStatesToolStripMenuItem.Click += new System.EventHandler(this.unitedStatesToolStripMenuItem_Click); + // + // multilingualToolStripMenuItem + // + this.multilingualToolStripMenuItem.Name = "multilingualToolStripMenuItem"; + this.multilingualToolStripMenuItem.Size = new System.Drawing.Size(184, 22); + this.multilingualToolStripMenuItem.Text = "Multilingual (850)"; + this.multilingualToolStripMenuItem.Click += new System.EventHandler(this.multilingualToolStripMenuItem_Click); + // + // portugalToolStripMenuItem + // + this.portugalToolStripMenuItem.Name = "portugalToolStripMenuItem"; + this.portugalToolStripMenuItem.Size = new System.Drawing.Size(184, 22); + this.portugalToolStripMenuItem.Text = "Portugal (860)"; + this.portugalToolStripMenuItem.Click += new System.EventHandler(this.portugalToolStripMenuItem_Click); + // + // canadaFrenchToolStripMenuItem + // + this.canadaFrenchToolStripMenuItem.Name = "canadaFrenchToolStripMenuItem"; + this.canadaFrenchToolStripMenuItem.Size = new System.Drawing.Size(184, 22); + this.canadaFrenchToolStripMenuItem.Text = "Canada-French (863)"; + this.canadaFrenchToolStripMenuItem.Click += new System.EventHandler(this.canadaFrenchToolStripMenuItem_Click); + // + // nordicToolStripMenuItem + // + this.nordicToolStripMenuItem.Name = "nordicToolStripMenuItem"; + this.nordicToolStripMenuItem.Size = new System.Drawing.Size(184, 22); + this.nordicToolStripMenuItem.Text = "Nordic (865)"; + this.nordicToolStripMenuItem.Click += new System.EventHandler(this.nordicToolStripMenuItem_Click); + // + // numericUpDownMaxRows + // + this.numericUpDownMaxRows.Location = new System.Drawing.Point(613, 251); + this.numericUpDownMaxRows.Maximum = new decimal(new int[] { + 99, + 0, + 0, + 0}); + this.numericUpDownMaxRows.Name = "numericUpDownMaxRows"; + this.numericUpDownMaxRows.Size = new System.Drawing.Size(120, 20); + this.numericUpDownMaxRows.TabIndex = 17; + // + // labelMaxNumberOfDisplayableRows + // + this.labelMaxNumberOfDisplayableRows.AutoSize = true; + this.labelMaxNumberOfDisplayableRows.Location = new System.Drawing.Point(473, 253); + this.labelMaxNumberOfDisplayableRows.Name = "labelMaxNumberOfDisplayableRows"; + this.labelMaxNumberOfDisplayableRows.Size = new System.Drawing.Size(126, 13); + this.labelMaxNumberOfDisplayableRows.TabIndex = 60; + this.labelMaxNumberOfDisplayableRows.Text = "Max# of displayable rows"; + // + // comboBoxDiscFormatCode + // + this.comboBoxDiscFormatCode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxDiscFormatCode.FormattingEnabled = true; + this.comboBoxDiscFormatCode.Items.AddRange(new object[] { + "STL23.01 (non-standard)", + "STL24.01 (non-standard)", + "STL25.01", + "STL29.01 (non-standard)", + "STL30.01"}); + this.comboBoxDiscFormatCode.Location = new System.Drawing.Point(181, 39); + this.comboBoxDiscFormatCode.Name = "comboBoxDiscFormatCode"; + this.comboBoxDiscFormatCode.Size = new System.Drawing.Size(219, 21); + this.comboBoxDiscFormatCode.TabIndex = 1; + this.comboBoxDiscFormatCode.SelectedIndexChanged += new System.EventHandler(this.comboBoxDiscFormatCode_SelectedIndexChanged); + // + // labelDiskFormatCode + // + this.labelDiskFormatCode.AutoSize = true; + this.labelDiskFormatCode.Location = new System.Drawing.Point(6, 42); + this.labelDiskFormatCode.Name = "labelDiskFormatCode"; + this.labelDiskFormatCode.Size = new System.Drawing.Size(87, 13); + this.labelDiskFormatCode.TabIndex = 58; + this.labelDiskFormatCode.Text = "Disk format code"; + // + // labelCodePageNumber + // + this.labelCodePageNumber.AutoSize = true; + this.labelCodePageNumber.Location = new System.Drawing.Point(6, 15); + this.labelCodePageNumber.Name = "labelCodePageNumber"; + this.labelCodePageNumber.Size = new System.Drawing.Size(97, 13); + this.labelCodePageNumber.TabIndex = 56; + this.labelCodePageNumber.Text = "Code page number"; + // + // textBoxLanguageCode + // + this.textBoxLanguageCode.Location = new System.Drawing.Point(181, 154); + this.textBoxLanguageCode.MaxLength = 32; + this.textBoxLanguageCode.Name = "textBoxLanguageCode"; + this.textBoxLanguageCode.Size = new System.Drawing.Size(219, 20); + this.textBoxLanguageCode.TabIndex = 5; + this.textBoxLanguageCode.TextChanged += new System.EventHandler(this.textBoxLanguageCode_TextChanged); + // + // labelLanguageCode + // + this.labelLanguageCode.AutoSize = true; + this.labelLanguageCode.Location = new System.Drawing.Point(6, 157); + this.labelLanguageCode.Name = "labelLanguageCode"; + this.labelLanguageCode.Size = new System.Drawing.Size(82, 13); + this.labelLanguageCode.TabIndex = 54; + this.labelLanguageCode.Text = "Language code"; + // + // numericUpDownMaxCharacters + // + this.numericUpDownMaxCharacters.Location = new System.Drawing.Point(613, 225); + this.numericUpDownMaxCharacters.Maximum = new decimal(new int[] { + 99, + 0, + 0, + 0}); + this.numericUpDownMaxCharacters.Name = "numericUpDownMaxCharacters"; + this.numericUpDownMaxCharacters.Size = new System.Drawing.Size(120, 20); + this.numericUpDownMaxCharacters.TabIndex = 16; + this.numericUpDownMaxCharacters.ValueChanged += new System.EventHandler(this.numericUpDownMaxCharacters_ValueChanged); + // + // labelMaxNoOfDisplayableChars + // + this.labelMaxNoOfDisplayableChars.AutoSize = true; + this.labelMaxNoOfDisplayableChars.Location = new System.Drawing.Point(473, 227); + this.labelMaxNoOfDisplayableChars.Name = "labelMaxNoOfDisplayableChars"; + this.labelMaxNoOfDisplayableChars.Size = new System.Drawing.Size(133, 13); + this.labelMaxNoOfDisplayableChars.TabIndex = 51; + this.labelMaxNoOfDisplayableChars.Text = "Max# of displayable chars "; + // + // numericUpDownDiskSequenceNumber + // + this.numericUpDownDiskSequenceNumber.Location = new System.Drawing.Point(613, 277); + this.numericUpDownDiskSequenceNumber.Maximum = new decimal(new int[] { + 9, + 0, + 0, + 0}); + this.numericUpDownDiskSequenceNumber.Name = "numericUpDownDiskSequenceNumber"; + this.numericUpDownDiskSequenceNumber.Size = new System.Drawing.Size(120, 20); + this.numericUpDownDiskSequenceNumber.TabIndex = 18; + // + // numericUpDownTotalNumberOfDiscs + // + this.numericUpDownTotalNumberOfDiscs.Location = new System.Drawing.Point(613, 303); + this.numericUpDownTotalNumberOfDiscs.Maximum = new decimal(new int[] { + 9, + 0, + 0, + 0}); + this.numericUpDownTotalNumberOfDiscs.Name = "numericUpDownTotalNumberOfDiscs"; + this.numericUpDownTotalNumberOfDiscs.Size = new System.Drawing.Size(120, 20); + this.numericUpDownTotalNumberOfDiscs.TabIndex = 19; + // + // numericUpDownRevisionNumber + // + this.numericUpDownRevisionNumber.Location = new System.Drawing.Point(613, 199); + this.numericUpDownRevisionNumber.Maximum = new decimal(new int[] { + 99, + 0, + 0, + 0}); + this.numericUpDownRevisionNumber.Name = "numericUpDownRevisionNumber"; + this.numericUpDownRevisionNumber.Size = new System.Drawing.Size(120, 20); + this.numericUpDownRevisionNumber.TabIndex = 15; + // + // labelDiskSequenceNumber + // + this.labelDiskSequenceNumber.AutoSize = true; + this.labelDiskSequenceNumber.Location = new System.Drawing.Point(473, 279); + this.labelDiskSequenceNumber.Name = "labelDiskSequenceNumber"; + this.labelDiskSequenceNumber.Size = new System.Drawing.Size(116, 13); + this.labelDiskSequenceNumber.TabIndex = 49; + this.labelDiskSequenceNumber.Text = "Disk sequence number"; + // + // labelTotalNumberOfDisks + // + this.labelTotalNumberOfDisks.AutoSize = true; + this.labelTotalNumberOfDisks.Location = new System.Drawing.Point(473, 305); + this.labelTotalNumberOfDisks.Name = "labelTotalNumberOfDisks"; + this.labelTotalNumberOfDisks.Size = new System.Drawing.Size(108, 13); + this.labelTotalNumberOfDisks.TabIndex = 48; + this.labelTotalNumberOfDisks.Text = "Total number of disks"; + // + // labelRevisionNumber + // + this.labelRevisionNumber.AutoSize = true; + this.labelRevisionNumber.Location = new System.Drawing.Point(473, 201); + this.labelRevisionNumber.Name = "labelRevisionNumber"; + this.labelRevisionNumber.Size = new System.Drawing.Size(86, 13); + this.labelRevisionNumber.TabIndex = 47; + this.labelRevisionNumber.Text = "Revision number"; + // + // textBoxTranslatorsName + // + this.textBoxTranslatorsName.Location = new System.Drawing.Point(181, 284); + this.textBoxTranslatorsName.MaxLength = 32; + this.textBoxTranslatorsName.Name = "textBoxTranslatorsName"; + this.textBoxTranslatorsName.Size = new System.Drawing.Size(219, 20); + this.textBoxTranslatorsName.TabIndex = 10; + // + // labelTranslatorsName + // + this.labelTranslatorsName.AutoSize = true; + this.labelTranslatorsName.Location = new System.Drawing.Point(6, 287); + this.labelTranslatorsName.Name = "labelTranslatorsName"; + this.labelTranslatorsName.Size = new System.Drawing.Size(90, 13); + this.labelTranslatorsName.TabIndex = 45; + this.labelTranslatorsName.Text = "Translator\'s name"; + // + // textBoxSubtitleListReferenceCode + // + this.textBoxSubtitleListReferenceCode.Location = new System.Drawing.Point(181, 314); + this.textBoxSubtitleListReferenceCode.MaxLength = 16; + this.textBoxSubtitleListReferenceCode.Name = "textBoxSubtitleListReferenceCode"; + this.textBoxSubtitleListReferenceCode.Size = new System.Drawing.Size(219, 20); + this.textBoxSubtitleListReferenceCode.TabIndex = 11; + // + // labelSubtitleListReferenceCode + // + this.labelSubtitleListReferenceCode.AutoSize = true; + this.labelSubtitleListReferenceCode.Location = new System.Drawing.Point(6, 317); + this.labelSubtitleListReferenceCode.Name = "labelSubtitleListReferenceCode"; + this.labelSubtitleListReferenceCode.Size = new System.Drawing.Size(132, 13); + this.labelSubtitleListReferenceCode.TabIndex = 43; + this.labelSubtitleListReferenceCode.Text = "Subtitle list reference code"; + // + // comboBoxCharacterCodeTable + // + this.comboBoxCharacterCodeTable.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxCharacterCodeTable.FormattingEnabled = true; + this.comboBoxCharacterCodeTable.Items.AddRange(new object[] { + "Latin", + "Latin/Cyrillic", + "Latin/Arabic", + "Latin/Greek", + "Latin/Hebrew"}); + this.comboBoxCharacterCodeTable.Location = new System.Drawing.Point(181, 126); + this.comboBoxCharacterCodeTable.Name = "comboBoxCharacterCodeTable"; + this.comboBoxCharacterCodeTable.Size = new System.Drawing.Size(219, 21); + this.comboBoxCharacterCodeTable.TabIndex = 4; + // + // buttonImport + // + this.buttonImport.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.buttonImport.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonImport.Location = new System.Drawing.Point(613, 6); + this.buttonImport.Name = "buttonImport"; + this.buttonImport.Size = new System.Drawing.Size(134, 23); + this.buttonImport.TabIndex = 20; + this.buttonImport.Text = "Import..."; + this.buttonImport.UseVisualStyleBackColor = true; + this.buttonImport.Click += new System.EventHandler(this.buttonImport_Click); + // + // labelCharacterCodeTable + // + this.labelCharacterCodeTable.AutoSize = true; + this.labelCharacterCodeTable.Location = new System.Drawing.Point(6, 129); + this.labelCharacterCodeTable.Name = "labelCharacterCodeTable"; + this.labelCharacterCodeTable.Size = new System.Drawing.Size(106, 13); + this.labelCharacterCodeTable.TabIndex = 40; + this.labelCharacterCodeTable.Text = "Character code table"; + // + // textBoxTranslatedProgramTitle + // + this.textBoxTranslatedProgramTitle.Location = new System.Drawing.Point(181, 232); + this.textBoxTranslatedProgramTitle.MaxLength = 32; + this.textBoxTranslatedProgramTitle.Name = "textBoxTranslatedProgramTitle"; + this.textBoxTranslatedProgramTitle.Size = new System.Drawing.Size(219, 20); + this.textBoxTranslatedProgramTitle.TabIndex = 8; + // + // textBoxTranslatedEpisodeTitle + // + this.textBoxTranslatedEpisodeTitle.Location = new System.Drawing.Point(181, 258); + this.textBoxTranslatedEpisodeTitle.MaxLength = 32; + this.textBoxTranslatedEpisodeTitle.Name = "textBoxTranslatedEpisodeTitle"; + this.textBoxTranslatedEpisodeTitle.Size = new System.Drawing.Size(219, 20); + this.textBoxTranslatedEpisodeTitle.TabIndex = 9; + // + // textBoxOriginalEpisodeTitle + // + this.textBoxOriginalEpisodeTitle.Location = new System.Drawing.Point(181, 206); + this.textBoxOriginalEpisodeTitle.MaxLength = 32; + this.textBoxOriginalEpisodeTitle.Name = "textBoxOriginalEpisodeTitle"; + this.textBoxOriginalEpisodeTitle.Size = new System.Drawing.Size(219, 20); + this.textBoxOriginalEpisodeTitle.TabIndex = 7; + // + // labelTranslatedEpisodeTitle + // + this.labelTranslatedEpisodeTitle.AutoSize = true; + this.labelTranslatedEpisodeTitle.Location = new System.Drawing.Point(6, 261); + this.labelTranslatedEpisodeTitle.Name = "labelTranslatedEpisodeTitle"; + this.labelTranslatedEpisodeTitle.Size = new System.Drawing.Size(116, 13); + this.labelTranslatedEpisodeTitle.TabIndex = 36; + this.labelTranslatedEpisodeTitle.Text = "Translated episode title"; + // + // labelTranslatedProgramTitle + // + this.labelTranslatedProgramTitle.AutoSize = true; + this.labelTranslatedProgramTitle.Location = new System.Drawing.Point(6, 235); + this.labelTranslatedProgramTitle.Name = "labelTranslatedProgramTitle"; + this.labelTranslatedProgramTitle.Size = new System.Drawing.Size(117, 13); + this.labelTranslatedProgramTitle.TabIndex = 35; + this.labelTranslatedProgramTitle.Text = "Translated program title"; + // + // labelOriginalEpisodeTitle + // + this.labelOriginalEpisodeTitle.AutoSize = true; + this.labelOriginalEpisodeTitle.Location = new System.Drawing.Point(6, 209); + this.labelOriginalEpisodeTitle.Name = "labelOriginalEpisodeTitle"; + this.labelOriginalEpisodeTitle.Size = new System.Drawing.Size(101, 13); + this.labelOriginalEpisodeTitle.TabIndex = 34; + this.labelOriginalEpisodeTitle.Text = "Original episode title"; + // + // textBoxOriginalProgramTitle + // + this.textBoxOriginalProgramTitle.Location = new System.Drawing.Point(181, 180); + this.textBoxOriginalProgramTitle.MaxLength = 32; + this.textBoxOriginalProgramTitle.Name = "textBoxOriginalProgramTitle"; + this.textBoxOriginalProgramTitle.Size = new System.Drawing.Size(219, 20); + this.textBoxOriginalProgramTitle.TabIndex = 6; + // + // labelOriginalProgramTitle + // + this.labelOriginalProgramTitle.AutoSize = true; + this.labelOriginalProgramTitle.Location = new System.Drawing.Point(6, 183); + this.labelOriginalProgramTitle.Name = "labelOriginalProgramTitle"; + this.labelOriginalProgramTitle.Size = new System.Drawing.Size(102, 13); + this.labelOriginalProgramTitle.TabIndex = 32; + this.labelOriginalProgramTitle.Text = "Original program title"; + // + // tabPageTextAndTiming + // + this.tabPageTextAndTiming.Controls.Add(this.groupBoxVerticalPosition); + this.tabPageTextAndTiming.Controls.Add(this.groupBoxTeletext); + this.tabPageTextAndTiming.Controls.Add(this.comboBoxJustificationCode); + this.tabPageTextAndTiming.Controls.Add(this.labelJustificationCode); + this.tabPageTextAndTiming.Location = new System.Drawing.Point(4, 22); + this.tabPageTextAndTiming.Name = "tabPageTextAndTiming"; + this.tabPageTextAndTiming.Size = new System.Drawing.Size(750, 461); + this.tabPageTextAndTiming.TabIndex = 2; + this.tabPageTextAndTiming.Text = "Text and timing information"; + this.tabPageTextAndTiming.UseVisualStyleBackColor = true; + // + // groupBoxVerticalPosition + // + this.groupBoxVerticalPosition.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxVerticalPosition.Controls.Add(this.labelUseBox); + this.groupBoxVerticalPosition.Controls.Add(this.numericUpDownNewLineRows); + this.groupBoxVerticalPosition.Controls.Add(this.labelNewLineRows); + this.groupBoxVerticalPosition.Controls.Add(this.labelMarginTop); + this.groupBoxVerticalPosition.Controls.Add(this.numericUpDownMarginBottom); + this.groupBoxVerticalPosition.Controls.Add(this.numericUpDownMarginTop); + this.groupBoxVerticalPosition.Controls.Add(this.labelMarginBottom); + this.groupBoxVerticalPosition.Location = new System.Drawing.Point(9, 49); + this.groupBoxVerticalPosition.Name = "groupBoxVerticalPosition"; + this.groupBoxVerticalPosition.Size = new System.Drawing.Size(727, 201); + this.groupBoxVerticalPosition.TabIndex = 46; + this.groupBoxVerticalPosition.TabStop = false; + this.groupBoxVerticalPosition.Text = "Vertical position"; + // + // labelUseBox + // + this.labelUseBox.AutoSize = true; + this.labelUseBox.ForeColor = System.Drawing.Color.Red; + this.labelUseBox.Location = new System.Drawing.Point(318, 80); + this.labelUseBox.Name = "labelUseBox"; + this.labelUseBox.Size = new System.Drawing.Size(240, 13); + this.labelUseBox.TabIndex = 73; + this.labelUseBox.Text = "Check \'Use box around text\' for only one new-line"; + this.labelUseBox.Visible = false; + // + // numericUpDownNewLineRows + // + this.numericUpDownNewLineRows.Location = new System.Drawing.Point(256, 78); + this.numericUpDownNewLineRows.Maximum = new decimal(new int[] { + 10, + 0, + 0, + 0}); + this.numericUpDownNewLineRows.Name = "numericUpDownNewLineRows"; + this.numericUpDownNewLineRows.Size = new System.Drawing.Size(56, 20); + this.numericUpDownNewLineRows.TabIndex = 54; + this.numericUpDownNewLineRows.Value = new decimal(new int[] { + 2, + 0, + 0, + 0}); + this.numericUpDownNewLineRows.ValueChanged += new System.EventHandler(this.numericUpDownNewLineRows_ValueChanged); + // + // labelNewLineRows + // + this.labelNewLineRows.AutoSize = true; + this.labelNewLineRows.Location = new System.Drawing.Point(13, 80); + this.labelNewLineRows.Name = "labelNewLineRows"; + this.labelNewLineRows.Size = new System.Drawing.Size(179, 13); + this.labelNewLineRows.TabIndex = 53; + this.labelNewLineRows.Text = "Number of rows added by a new line"; + // + // labelMarginTop + // + this.labelMarginTop.AutoSize = true; + this.labelMarginTop.Location = new System.Drawing.Point(13, 28); + this.labelMarginTop.Name = "labelMarginTop"; + this.labelMarginTop.Size = new System.Drawing.Size(174, 13); + this.labelMarginTop.TabIndex = 49; + this.labelMarginTop.Text = "Margin top (for top aligned subtitles)"; + // + // numericUpDownMarginBottom + // + this.numericUpDownMarginBottom.Location = new System.Drawing.Point(256, 52); + this.numericUpDownMarginBottom.Maximum = new decimal(new int[] { + 50, + 0, + 0, + 0}); + this.numericUpDownMarginBottom.Name = "numericUpDownMarginBottom"; + this.numericUpDownMarginBottom.Size = new System.Drawing.Size(56, 20); + this.numericUpDownMarginBottom.TabIndex = 52; + // + // numericUpDownMarginTop + // + this.numericUpDownMarginTop.Location = new System.Drawing.Point(256, 26); + this.numericUpDownMarginTop.Maximum = new decimal(new int[] { + 50, + 0, + 0, + 0}); + this.numericUpDownMarginTop.Name = "numericUpDownMarginTop"; + this.numericUpDownMarginTop.Size = new System.Drawing.Size(56, 20); + this.numericUpDownMarginTop.TabIndex = 48; + // + // labelMarginBottom + // + this.labelMarginBottom.AutoSize = true; + this.labelMarginBottom.Location = new System.Drawing.Point(13, 54); + this.labelMarginBottom.Name = "labelMarginBottom"; + this.labelMarginBottom.Size = new System.Drawing.Size(208, 13); + this.labelMarginBottom.TabIndex = 51; + this.labelMarginBottom.Text = "Margin bottom (for bottom aligned subtitles)"; + // + // groupBoxTeletext + // + this.groupBoxTeletext.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxTeletext.Controls.Add(this.checkBoxTeletextDoubleHeight); + this.groupBoxTeletext.Controls.Add(this.checkBoxTeletextBox); + this.groupBoxTeletext.Location = new System.Drawing.Point(9, 256); + this.groupBoxTeletext.Name = "groupBoxTeletext"; + this.groupBoxTeletext.Size = new System.Drawing.Size(727, 190); + this.groupBoxTeletext.TabIndex = 45; + this.groupBoxTeletext.TabStop = false; + this.groupBoxTeletext.Text = "Teletext"; + // + // checkBoxTeletextDoubleHeight + // + this.checkBoxTeletextDoubleHeight.AutoSize = true; + this.checkBoxTeletextDoubleHeight.Location = new System.Drawing.Point(16, 57); + this.checkBoxTeletextDoubleHeight.Name = "checkBoxTeletextDoubleHeight"; + this.checkBoxTeletextDoubleHeight.Size = new System.Drawing.Size(124, 17); + this.checkBoxTeletextDoubleHeight.TabIndex = 1; + this.checkBoxTeletextDoubleHeight.Text = "Text is double height"; + this.checkBoxTeletextDoubleHeight.UseVisualStyleBackColor = true; + // + // checkBoxTeletextBox + // + this.checkBoxTeletextBox.AutoSize = true; + this.checkBoxTeletextBox.Location = new System.Drawing.Point(16, 34); + this.checkBoxTeletextBox.Name = "checkBoxTeletextBox"; + this.checkBoxTeletextBox.Size = new System.Drawing.Size(121, 17); + this.checkBoxTeletextBox.TabIndex = 0; + this.checkBoxTeletextBox.Text = "Use box around text"; + this.checkBoxTeletextBox.UseVisualStyleBackColor = true; + this.checkBoxTeletextBox.CheckedChanged += new System.EventHandler(this.checkBoxTeletextBox_CheckedChanged); + // + // comboBoxJustificationCode + // + this.comboBoxJustificationCode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxJustificationCode.FormattingEnabled = true; + this.comboBoxJustificationCode.Items.AddRange(new object[] { + "unchanged presentation", + "left-justified text", + "centred text", + "right-justified text"}); + this.comboBoxJustificationCode.Location = new System.Drawing.Point(145, 11); + this.comboBoxJustificationCode.Name = "comboBoxJustificationCode"; + this.comboBoxJustificationCode.Size = new System.Drawing.Size(219, 21); + this.comboBoxJustificationCode.TabIndex = 43; + // + // labelJustificationCode + // + this.labelJustificationCode.AutoSize = true; + this.labelJustificationCode.Location = new System.Drawing.Point(6, 14); + this.labelJustificationCode.Name = "labelJustificationCode"; + this.labelJustificationCode.Size = new System.Drawing.Size(89, 13); + this.labelJustificationCode.TabIndex = 44; + this.labelJustificationCode.Text = "Justification code"; + // + // tabPageErrors + // + this.tabPageErrors.Controls.Add(this.textBoxErrors); + this.tabPageErrors.Controls.Add(this.labelErrors); + this.tabPageErrors.Location = new System.Drawing.Point(4, 22); + this.tabPageErrors.Name = "tabPageErrors"; + this.tabPageErrors.Padding = new System.Windows.Forms.Padding(3); + this.tabPageErrors.Size = new System.Drawing.Size(750, 461); + this.tabPageErrors.TabIndex = 1; + this.tabPageErrors.Text = "Errors"; + this.tabPageErrors.UseVisualStyleBackColor = true; + // + // textBoxErrors + // + this.textBoxErrors.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxErrors.Location = new System.Drawing.Point(6, 26); + this.textBoxErrors.Multiline = true; + this.textBoxErrors.Name = "textBoxErrors"; + this.textBoxErrors.ReadOnly = true; + this.textBoxErrors.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.textBoxErrors.Size = new System.Drawing.Size(729, 386); + this.textBoxErrors.TabIndex = 13; + // + // labelErrors + // + this.labelErrors.AutoSize = true; + this.labelErrors.Location = new System.Drawing.Point(3, 10); + this.labelErrors.Name = "labelErrors"; + this.labelErrors.Size = new System.Drawing.Size(34, 13); + this.labelErrors.TabIndex = 12; + this.labelErrors.Text = "Errors"; + // + // EbuSaveOptions + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(775, 542); + this.Controls.Add(this.tabControl1); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.buttonCancel); + this.MinimumSize = new System.Drawing.Size(785, 570); + this.Name = "EbuSaveOptions"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "EbuSaveOptions"; + this.tabControl1.ResumeLayout(false); + this.tabPageHeader.ResumeLayout(false); + this.tabPageHeader.PerformLayout(); + this.contextMenuStripCodeTable.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxRows)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxCharacters)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDiskSequenceNumber)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownTotalNumberOfDiscs)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRevisionNumber)).EndInit(); + this.tabPageTextAndTiming.ResumeLayout(false); + this.tabPageTextAndTiming.PerformLayout(); + this.groupBoxVerticalPosition.ResumeLayout(false); + this.groupBoxVerticalPosition.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownNewLineRows)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMarginBottom)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMarginTop)).EndInit(); + this.groupBoxTeletext.ResumeLayout(false); + this.groupBoxTeletext.PerformLayout(); + this.tabPageErrors.ResumeLayout(false); + this.tabPageErrors.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.OpenFileDialog openFileDialog1; + private System.Windows.Forms.TabControl tabControl1; + private System.Windows.Forms.TabPage tabPageHeader; + private System.Windows.Forms.NumericUpDown numericUpDownDiskSequenceNumber; + private System.Windows.Forms.NumericUpDown numericUpDownTotalNumberOfDiscs; + private System.Windows.Forms.NumericUpDown numericUpDownRevisionNumber; + private System.Windows.Forms.Label labelDiskSequenceNumber; + private System.Windows.Forms.Label labelTotalNumberOfDisks; + private System.Windows.Forms.Label labelRevisionNumber; + private System.Windows.Forms.TextBox textBoxTranslatorsName; + private System.Windows.Forms.Label labelTranslatorsName; + private System.Windows.Forms.TextBox textBoxSubtitleListReferenceCode; + private System.Windows.Forms.Label labelSubtitleListReferenceCode; + private System.Windows.Forms.ComboBox comboBoxCharacterCodeTable; + private System.Windows.Forms.Button buttonImport; + private System.Windows.Forms.Label labelCharacterCodeTable; + private System.Windows.Forms.TextBox textBoxTranslatedProgramTitle; + private System.Windows.Forms.TextBox textBoxTranslatedEpisodeTitle; + private System.Windows.Forms.TextBox textBoxOriginalEpisodeTitle; + private System.Windows.Forms.Label labelTranslatedEpisodeTitle; + private System.Windows.Forms.Label labelTranslatedProgramTitle; + private System.Windows.Forms.Label labelOriginalEpisodeTitle; + private System.Windows.Forms.TextBox textBoxOriginalProgramTitle; + private System.Windows.Forms.Label labelOriginalProgramTitle; + private System.Windows.Forms.TabPage tabPageTextAndTiming; + private System.Windows.Forms.TabPage tabPageErrors; + private System.Windows.Forms.TextBox textBoxErrors; + private System.Windows.Forms.Label labelErrors; + private System.Windows.Forms.ComboBox comboBoxJustificationCode; + private System.Windows.Forms.Label labelJustificationCode; + private System.Windows.Forms.NumericUpDown numericUpDownMaxCharacters; + private System.Windows.Forms.Label labelMaxNoOfDisplayableChars; + private System.Windows.Forms.TextBox textBoxLanguageCode; + private System.Windows.Forms.Label labelLanguageCode; + private System.Windows.Forms.Label labelCodePageNumber; + private System.Windows.Forms.ComboBox comboBoxDiscFormatCode; + private System.Windows.Forms.Label labelDiskFormatCode; + private System.Windows.Forms.NumericUpDown numericUpDownMaxRows; + private System.Windows.Forms.Label labelMaxNumberOfDisplayableRows; + private System.Windows.Forms.TextBox textBoxCodePageNumber; + private System.Windows.Forms.ContextMenuStrip contextMenuStripCodeTable; + private System.Windows.Forms.ToolStripMenuItem unitedStatesToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem multilingualToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem portugalToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem canadaFrenchToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem nordicToolStripMenuItem; + private System.Windows.Forms.TextBox textBoxCountryOfOrigin; + private System.Windows.Forms.Label labelCountryOfOrigin; + private System.Windows.Forms.ComboBox comboBoxDisplayStandardCode; + private System.Windows.Forms.Label labelDisplayStandardCode; + private System.Windows.Forms.Label labelTimeCodeStartOfProgramme; + private System.Windows.Forms.Label labelTimeCodeStatus; + private System.Windows.Forms.ComboBox comboBoxTimeCodeStatus; + private Controls.TimeUpDown timeUpDownStartTime; + private System.Windows.Forms.Label labelFrameRate; + private System.Windows.Forms.ComboBox comboBoxFrameRate; + private System.Windows.Forms.GroupBox groupBoxTeletext; + private System.Windows.Forms.CheckBox checkBoxTeletextDoubleHeight; + private System.Windows.Forms.CheckBox checkBoxTeletextBox; + private System.Windows.Forms.GroupBox groupBoxVerticalPosition; + private System.Windows.Forms.Label labelMarginBottom; + private System.Windows.Forms.NumericUpDown numericUpDownMarginTop; + private System.Windows.Forms.Label labelMarginTop; + private System.Windows.Forms.NumericUpDown numericUpDownNewLineRows; + private System.Windows.Forms.Label labelNewLineRows; + private System.Windows.Forms.NumericUpDown numericUpDownMarginBottom; + private System.Windows.Forms.Label labelDisplayStandardCodeWarning; + private System.Windows.Forms.Button buttonChooseLanguageCode; + private System.Windows.Forms.Label labelLanguageCodeFriendlyName; + private System.Windows.Forms.Label labelUseBox; + private System.Windows.Forms.Label labelMaxCharsPerRow38ForTeletext; + } } \ No newline at end of file diff --git a/src/Forms/EbuSaveOptions.cs b/src/ui/Forms/EbuSaveOptions.cs similarity index 97% rename from src/Forms/EbuSaveOptions.cs rename to src/ui/Forms/EbuSaveOptions.cs index a425c3830..838e00582 100644 --- a/src/Forms/EbuSaveOptions.cs +++ b/src/ui/Forms/EbuSaveOptions.cs @@ -1,547 +1,547 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.SubtitleFormats; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Globalization; -using System.IO; -using System.Text; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class EbuSaveOptions : PositionAndSizeForm - { - private Ebu.EbuGeneralSubtitleInformation _header; - private Subtitle _subtitle; - - public byte JustificationCode { get; private set; } - - public EbuSaveOptions() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - var language = Configuration.Settings.Language.EbuSaveOptions; - Text = language.Title; - tabPageHeader.Text = language.GeneralSubtitleInformation; - tabPageTextAndTiming.Text = language.TextAndTimingInformation; - tabPageErrors.Text = language.Errors; - - labelCodePageNumber.Text = language.CodePageNumber; - labelDiskFormatCode.Text = language.DiskFormatCode; - labelDisplayStandardCode.Text = language.DisplayStandardCode; - labelDisplayStandardCodeWarning.Text = string.Empty; - labelMaxCharsPerRow38ForTeletext.Text = string.Empty; - labelCharacterCodeTable.Text = language.CharacterCodeTable; - labelLanguageCode.Text = language.LanguageCode; - labelOriginalProgramTitle.Text = language.OriginalProgramTitle; - labelOriginalEpisodeTitle.Text = language.OriginalEpisodeTitle; - labelTranslatedProgramTitle.Text = language.TranslatedProgramTitle; - labelTranslatedEpisodeTitle.Text = language.TranslatedEpisodeTitle; - labelTranslatorsName.Text = language.TranslatorsName; - labelSubtitleListReferenceCode.Text = language.SubtitleListReferenceCode; - labelCountryOfOrigin.Text = language.CountryOfOrigin; - labelTimeCodeStatus.Text = language.TimeCodeStatus; - labelTimeCodeStartOfProgramme.Text = language.TimeCodeStartOfProgramme; - labelFrameRate.Text = Configuration.Settings.Language.General.FrameRate; - - labelRevisionNumber.Text = language.RevisionNumber; - labelMaxNoOfDisplayableChars.Text = language.MaxNoOfDisplayableChars; - labelMaxNumberOfDisplayableRows.Text = language.MaxNumberOfDisplayableRows; - labelDiskSequenceNumber.Text = language.DiskSequenceNumber; - labelTotalNumberOfDisks.Text = language.TotalNumberOfDisks; - - buttonImport.Text = language.Import; - - labelJustificationCode.Text = language.JustificationCode; - comboBoxJustificationCode.Items.Clear(); - comboBoxJustificationCode.Items.Add(language.TextUnchangedPresentation); - comboBoxJustificationCode.Items.Add(language.TextLeftJustifiedText); - comboBoxJustificationCode.Items.Add(language.TextCenteredText); - comboBoxJustificationCode.Items.Add(language.TextRightJustifiedText); - groupBoxTeletext.Text = language.Teletext; - groupBoxVerticalPosition.Text = language.VerticalPosition; - labelMarginTop.Text = language.MarginTop; - labelMarginBottom.Text = language.MarginBottom; - labelNewLineRows.Text = language.NewLineRows; - int tempW = labelMarginTop.Left + 9 + Math.Max(Math.Max(labelMarginTop.Width, labelMarginBottom.Width), labelNewLineRows.Width); - numericUpDownMarginTop.Left = tempW; - numericUpDownMarginBottom.Left = tempW; - numericUpDownNewLineRows.Left = tempW; - labelUseBox.Left = numericUpDownNewLineRows.Left + numericUpDownNewLineRows.Width + 9; - checkBoxTeletextBox.Text = language.UseBox; - checkBoxTeletextDoubleHeight.Text = language.DoubleHeight; - - labelErrors.Text = language.Errors; - labelUseBox.Text = language.UseBoxForOneNewLine; - - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - - labelLanguageCodeFriendlyName.Text = string.Empty; - timeUpDownStartTime.ForceHHMMSSFF(); - - UiUtil.FixLargeFonts(this, buttonOK); - } - - internal void Initialize(Ebu.EbuGeneralSubtitleInformation header, byte justificationCode, string fileName, Subtitle subtitle) - { - _header = header; - _subtitle = subtitle; - - if (_subtitle == null) - { - tabControl1.TabPages.Remove(tabPageErrors); - } - - FillFromHeader(header); - if (!string.IsNullOrEmpty(fileName)) - { - try - { - FillHeaderFromFile(fileName); - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine("EbuOptions unable to read existing file: " + fileName + " - " + ex.Message); - } - string title = Path.GetFileNameWithoutExtension(fileName); - if (title.Length > 32) - { - title = title.Substring(0, 32).Trim(); - } - - textBoxOriginalProgramTitle.Text = title; - } - - comboBoxJustificationCode.SelectedIndex = justificationCode; - numericUpDownMarginTop.Value = Configuration.Settings.SubtitleSettings.EbuStlMarginTop; - numericUpDownMarginBottom.Value = Configuration.Settings.SubtitleSettings.EbuStlMarginBottom; - numericUpDownNewLineRows.Value = Configuration.Settings.SubtitleSettings.EbuStlNewLineRows; - checkBoxTeletextBox.Checked = Configuration.Settings.SubtitleSettings.EbuStlTeletextUseBox; - checkBoxTeletextDoubleHeight.Checked = Configuration.Settings.SubtitleSettings.EbuStlTeletextUseDoubleHeight; - - Text = Configuration.Settings.Language.EbuSaveOptions.Title; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - } - - private void CheckErrors(Subtitle subtitle) - { - if (subtitle == null) - { - return; - } - - textBoxErrors.Text = string.Empty; - var sb = new StringBuilder(); - int errorCount = 0; - int i = 1; - foreach (Paragraph p in subtitle.Paragraphs) - { - var arr = p.Text.SplitToLines(); - foreach (string line in arr) - { - string s = HtmlUtil.RemoveHtmlTags(line, true); - if (s.Length > numericUpDownMaxCharacters.Value) - { - sb.AppendLine(string.Format(Configuration.Settings.Language.EbuSaveOptions.MaxLengthError, i, numericUpDownMaxCharacters.Value, s.Length - numericUpDownMaxCharacters.Value, s)); - errorCount++; - } - } - i++; - } - textBoxErrors.Text = sb.ToString(); - tabPageErrors.Text = string.Format(Configuration.Settings.Language.EbuSaveOptions.ErrorsX, errorCount); - } - - private void FillFromHeader(Ebu.EbuGeneralSubtitleInformation header) - { - textBoxCodePageNumber.Text = header.CodePageNumber; - - comboBoxFrameRate.Items.Clear(); - comboBoxFrameRate.Items.Add(23.976); - comboBoxFrameRate.Items.Add(24.0); - comboBoxFrameRate.Items.Add(25.0); - comboBoxFrameRate.Items.Add(29.97); - comboBoxFrameRate.Items.Add(30.0); - - if (header.DiskFormatCode == "STL30.01") - { - comboBoxDiscFormatCode.SelectedIndex = 4; - comboBoxFrameRate.Text = (30).ToString(CultureInfo.CurrentCulture); - } - else if (header.DiskFormatCode == "STL23.01") - { - comboBoxDiscFormatCode.SelectedIndex = 0; - comboBoxFrameRate.Text = (23.976).ToString(CultureInfo.CurrentCulture); - } - else if (header.DiskFormatCode == "STL24.01") - { - comboBoxDiscFormatCode.SelectedIndex = 1; - comboBoxFrameRate.Text = (24).ToString(CultureInfo.CurrentCulture); - } - else if (header.DiskFormatCode == "STL29.01") - { - comboBoxDiscFormatCode.SelectedIndex = 3; - comboBoxFrameRate.Text = (25).ToString(CultureInfo.CurrentCulture); - } - else - { - comboBoxDiscFormatCode.SelectedIndex = 2; - comboBoxFrameRate.Text = (25).ToString(CultureInfo.CurrentCulture); - } - - if (header.FrameRateFromSaveDialog > 20 && header.FrameRateFromSaveDialog < 200) - { - comboBoxFrameRate.Text = header.FrameRateFromSaveDialog.ToString(CultureInfo.CurrentCulture); - } - - if (header.DisplayStandardCode == "0") - { - comboBoxDisplayStandardCode.SelectedIndex = 0; - } - else if (header.DisplayStandardCode == "1") - { - comboBoxDisplayStandardCode.SelectedIndex = 1; - } - else if (header.DisplayStandardCode == "2") - { - comboBoxDisplayStandardCode.SelectedIndex = 2; - } - else - { - comboBoxDisplayStandardCode.SelectedIndex = 3; - } - - comboBoxCharacterCodeTable.SelectedIndex = int.Parse(header.CharacterCodeTableNumber); - textBoxLanguageCode.Text = header.LanguageCode; - textBoxOriginalProgramTitle.Text = header.OriginalProgrammeTitle.TrimEnd(); - textBoxOriginalEpisodeTitle.Text = header.OriginalEpisodeTitle.TrimEnd(); - textBoxTranslatedProgramTitle.Text = header.TranslatedProgrammeTitle.TrimEnd(); - textBoxTranslatedEpisodeTitle.Text = header.TranslatedEpisodeTitle.TrimEnd(); - textBoxTranslatorsName.Text = header.TranslatorsName.TrimEnd(); - textBoxSubtitleListReferenceCode.Text = header.SubtitleListReferenceCode.TrimEnd(); - textBoxCountryOfOrigin.Text = header.CountryOfOrigin; - - comboBoxTimeCodeStatus.SelectedIndex = 1; - if (header.TimeCodeStatus == "0") - { - comboBoxTimeCodeStatus.SelectedIndex = 0; // 1 == intended for use, 0 == not intended for use - } - - try - { - // HHMMSSFF - int hh = int.Parse(header.TimeCodeStartOfProgramme.Substring(0, 2)); - int mm = int.Parse(header.TimeCodeStartOfProgramme.Substring(2, 2)); - int ss = int.Parse(header.TimeCodeStartOfProgramme.Substring(4, 2)); - int ff = int.Parse(header.TimeCodeStartOfProgramme.Substring(6, 2)); - timeUpDownStartTime.TimeCode = new TimeCode(hh, mm, ss, SubtitleFormat.FramesToMillisecondsMax999(ff)); - } - catch (Exception) - { - timeUpDownStartTime.TimeCode = new TimeCode(); - } - - int number; - if (int.TryParse(header.RevisionNumber, out number)) - { - numericUpDownRevisionNumber.Value = number; - } - else - { - numericUpDownRevisionNumber.Value = 1; - } - - if (int.TryParse(header.MaximumNumberOfDisplayableCharactersInAnyTextRow, out number)) - { - numericUpDownMaxCharacters.Value = number; - } - - numericUpDownMaxRows.Value = 23; - if (int.TryParse(header.MaximumNumberOfDisplayableRows, out number)) - { - numericUpDownMaxRows.Value = number; - } - - if (int.TryParse(header.DiskSequenceNumber, out number)) - { - numericUpDownDiskSequenceNumber.Value = number; - } - else - { - numericUpDownDiskSequenceNumber.Value = 1; - } - - if (int.TryParse(header.TotalNumberOfDisks, out number)) - { - numericUpDownTotalNumberOfDiscs.Value = number; - } - else - { - numericUpDownTotalNumberOfDiscs.Value = 1; - } - } - - private void buttonOK_Click(object sender, EventArgs e) - { - _header.CodePageNumber = textBoxCodePageNumber.Text; - if (_header.CodePageNumber.Length < 3) - { - _header.CodePageNumber = "865"; - } - - if (comboBoxDiscFormatCode.SelectedIndex == 0) - { - _header.DiskFormatCode = "STL23.01"; - } - else if (comboBoxDiscFormatCode.SelectedIndex == 1) - { - _header.DiskFormatCode = "STL24.01"; - } - else if (comboBoxDiscFormatCode.SelectedIndex == 2) - { - _header.DiskFormatCode = "STL25.01"; - } - else if (comboBoxDiscFormatCode.SelectedIndex == 3) - { - _header.DiskFormatCode = "STL29.01"; - } - else - { - _header.DiskFormatCode = "STL30.01"; - } - - double d; - if (double.TryParse(comboBoxFrameRate.Text.Replace(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, "."), out d) && d > 20 && d < 200) - { - _header.FrameRateFromSaveDialog = d; - } - - if (comboBoxDisplayStandardCode.SelectedIndex == 0) - { - _header.DisplayStandardCode = "0"; - } - else if (comboBoxDisplayStandardCode.SelectedIndex == 1) - { - _header.DisplayStandardCode = "1"; - } - else if (comboBoxDisplayStandardCode.SelectedIndex == 2) - { - _header.DisplayStandardCode = "2"; - } - else - { - _header.DisplayStandardCode = " "; - } - - _header.CharacterCodeTableNumber = "0" + comboBoxCharacterCodeTable.SelectedIndex; - _header.LanguageCode = textBoxLanguageCode.Text; - if (_header.LanguageCode.Length != 2) - { - _header.LanguageCode = "0A"; - } - - _header.OriginalProgrammeTitle = textBoxOriginalProgramTitle.Text.PadRight(32, ' '); - _header.OriginalEpisodeTitle = textBoxOriginalEpisodeTitle.Text.PadRight(32, ' '); - _header.TranslatedProgrammeTitle = textBoxTranslatedProgramTitle.Text.PadRight(32, ' '); - _header.TranslatedEpisodeTitle = textBoxTranslatedEpisodeTitle.Text.PadRight(32, ' '); - _header.TranslatorsName = textBoxTranslatorsName.Text.PadRight(32, ' '); - _header.SubtitleListReferenceCode = textBoxSubtitleListReferenceCode.Text.PadRight(16, ' '); - _header.CountryOfOrigin = textBoxCountryOfOrigin.Text; - if (_header.CountryOfOrigin.Length != 3) - { - _header.CountryOfOrigin = "USA"; - } - - _header.TimeCodeStatus = comboBoxTimeCodeStatus.SelectedIndex.ToString(CultureInfo.InvariantCulture); - _header.TimeCodeStartOfProgramme = timeUpDownStartTime.TimeCode.ToHHMMSSFF().RemoveChar(':'); - - _header.RevisionNumber = numericUpDownRevisionNumber.Value.ToString("00"); - _header.MaximumNumberOfDisplayableCharactersInAnyTextRow = numericUpDownMaxCharacters.Value.ToString("00"); - _header.MaximumNumberOfDisplayableRows = numericUpDownMaxRows.Value.ToString("00"); - _header.DiskSequenceNumber = numericUpDownDiskSequenceNumber.Value.ToString(CultureInfo.InvariantCulture); - _header.TotalNumberOfDisks = numericUpDownTotalNumberOfDiscs.Value.ToString(CultureInfo.InvariantCulture); - - JustificationCode = (byte)comboBoxJustificationCode.SelectedIndex; - Configuration.Settings.SubtitleSettings.EbuStlMarginTop = (int)Math.Round(numericUpDownMarginTop.Value); - Configuration.Settings.SubtitleSettings.EbuStlMarginBottom = (int)Math.Round(numericUpDownMarginBottom.Value); - Configuration.Settings.SubtitleSettings.EbuStlNewLineRows = (int)Math.Round(numericUpDownNewLineRows.Value); - Configuration.Settings.SubtitleSettings.EbuStlTeletextUseBox = checkBoxTeletextBox.Checked; - Configuration.Settings.SubtitleSettings.EbuStlTeletextUseDoubleHeight = checkBoxTeletextDoubleHeight.Checked; - - if (_subtitle != null) - { - _subtitle.Header = _header.ToString(); - } - - DialogResult = DialogResult.OK; - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private void buttonImport_Click(object sender, EventArgs e) - { - openFileDialog1.Filter = "EBU STL files (*.stl)|*.stl"; - openFileDialog1.FileName = string.Empty; - if (openFileDialog1.ShowDialog() == DialogResult.OK) - { - FillHeaderFromFile(openFileDialog1.FileName); - } - } - - private void FillHeaderFromFile(string fileName) - { - if (File.Exists(fileName)) - { - var ebu = new Ebu(); - var temp = new Subtitle(); - ebu.LoadSubtitle(temp, null, fileName); - FillFromHeader(ebu.Header); - if (ebu.JustificationCodes.Count > 2 && ebu.JustificationCodes[1] == ebu.JustificationCodes[2]) - { - if (ebu.JustificationCodes[1] >= 0 && ebu.JustificationCodes[1] < 4) - { - comboBoxJustificationCode.SelectedIndex = ebu.JustificationCodes[1]; - } - } - } - } - - private void numericUpDownMaxCharacters_ValueChanged(object sender, EventArgs e) - { - CheckMaxCharsPerRow(); - CheckErrors(_subtitle); - } - - private void unitedStatesToolStripMenuItem_Click(object sender, EventArgs e) - { - textBoxCodePageNumber.Text = "437"; - } - - private void multilingualToolStripMenuItem_Click(object sender, EventArgs e) - { - textBoxCodePageNumber.Text = "850"; - } - - private void portugalToolStripMenuItem_Click(object sender, EventArgs e) - { - textBoxCodePageNumber.Text = "860"; - } - - private void canadaFrenchToolStripMenuItem_Click(object sender, EventArgs e) - { - textBoxCodePageNumber.Text = "863"; - } - - private void nordicToolStripMenuItem_Click(object sender, EventArgs e) - { - textBoxCodePageNumber.Text = "865"; - } - - private void comboBoxDiscFormatCode_SelectedIndexChanged(object sender, EventArgs e) - { - if (comboBoxDiscFormatCode.SelectedIndex == 2) - { - comboBoxFrameRate.Text = (25).ToString(CultureInfo.CurrentCulture); - } - else if (comboBoxDiscFormatCode.SelectedIndex == 4) - { - comboBoxFrameRate.Text = (30).ToString(CultureInfo.CurrentCulture); - } - } - - private void comboBoxDisplayStandardCode_SelectedIndexChanged(object sender, EventArgs e) - { - labelDisplayStandardCodeWarning.Text = string.Empty; - CheckMaxCharsPerRow(); - if (_subtitle == null) - { - return; - } - - var fontColorFound = false; - var alignmentFound = false; - if (comboBoxDisplayStandardCode.SelectedIndex == 0) // open subtitling - { - foreach (var paragraph in _subtitle.Paragraphs) - { - if (!fontColorFound && - paragraph.Text.Contains(" 32) + { + title = title.Substring(0, 32).Trim(); + } + + textBoxOriginalProgramTitle.Text = title; + } + + comboBoxJustificationCode.SelectedIndex = justificationCode; + numericUpDownMarginTop.Value = Configuration.Settings.SubtitleSettings.EbuStlMarginTop; + numericUpDownMarginBottom.Value = Configuration.Settings.SubtitleSettings.EbuStlMarginBottom; + numericUpDownNewLineRows.Value = Configuration.Settings.SubtitleSettings.EbuStlNewLineRows; + checkBoxTeletextBox.Checked = Configuration.Settings.SubtitleSettings.EbuStlTeletextUseBox; + checkBoxTeletextDoubleHeight.Checked = Configuration.Settings.SubtitleSettings.EbuStlTeletextUseDoubleHeight; + + Text = Configuration.Settings.Language.EbuSaveOptions.Title; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + } + + private void CheckErrors(Subtitle subtitle) + { + if (subtitle == null) + { + return; + } + + textBoxErrors.Text = string.Empty; + var sb = new StringBuilder(); + int errorCount = 0; + int i = 1; + foreach (Paragraph p in subtitle.Paragraphs) + { + var arr = p.Text.SplitToLines(); + foreach (string line in arr) + { + string s = HtmlUtil.RemoveHtmlTags(line, true); + if (s.Length > numericUpDownMaxCharacters.Value) + { + sb.AppendLine(string.Format(Configuration.Settings.Language.EbuSaveOptions.MaxLengthError, i, numericUpDownMaxCharacters.Value, s.Length - numericUpDownMaxCharacters.Value, s)); + errorCount++; + } + } + i++; + } + textBoxErrors.Text = sb.ToString(); + tabPageErrors.Text = string.Format(Configuration.Settings.Language.EbuSaveOptions.ErrorsX, errorCount); + } + + private void FillFromHeader(Ebu.EbuGeneralSubtitleInformation header) + { + textBoxCodePageNumber.Text = header.CodePageNumber; + + comboBoxFrameRate.Items.Clear(); + comboBoxFrameRate.Items.Add(23.976); + comboBoxFrameRate.Items.Add(24.0); + comboBoxFrameRate.Items.Add(25.0); + comboBoxFrameRate.Items.Add(29.97); + comboBoxFrameRate.Items.Add(30.0); + + if (header.DiskFormatCode == "STL30.01") + { + comboBoxDiscFormatCode.SelectedIndex = 4; + comboBoxFrameRate.Text = (30).ToString(CultureInfo.CurrentCulture); + } + else if (header.DiskFormatCode == "STL23.01") + { + comboBoxDiscFormatCode.SelectedIndex = 0; + comboBoxFrameRate.Text = (23.976).ToString(CultureInfo.CurrentCulture); + } + else if (header.DiskFormatCode == "STL24.01") + { + comboBoxDiscFormatCode.SelectedIndex = 1; + comboBoxFrameRate.Text = (24).ToString(CultureInfo.CurrentCulture); + } + else if (header.DiskFormatCode == "STL29.01") + { + comboBoxDiscFormatCode.SelectedIndex = 3; + comboBoxFrameRate.Text = (25).ToString(CultureInfo.CurrentCulture); + } + else + { + comboBoxDiscFormatCode.SelectedIndex = 2; + comboBoxFrameRate.Text = (25).ToString(CultureInfo.CurrentCulture); + } + + if (header.FrameRateFromSaveDialog > 20 && header.FrameRateFromSaveDialog < 200) + { + comboBoxFrameRate.Text = header.FrameRateFromSaveDialog.ToString(CultureInfo.CurrentCulture); + } + + if (header.DisplayStandardCode == "0") + { + comboBoxDisplayStandardCode.SelectedIndex = 0; + } + else if (header.DisplayStandardCode == "1") + { + comboBoxDisplayStandardCode.SelectedIndex = 1; + } + else if (header.DisplayStandardCode == "2") + { + comboBoxDisplayStandardCode.SelectedIndex = 2; + } + else + { + comboBoxDisplayStandardCode.SelectedIndex = 3; + } + + comboBoxCharacterCodeTable.SelectedIndex = int.Parse(header.CharacterCodeTableNumber); + textBoxLanguageCode.Text = header.LanguageCode; + textBoxOriginalProgramTitle.Text = header.OriginalProgrammeTitle.TrimEnd(); + textBoxOriginalEpisodeTitle.Text = header.OriginalEpisodeTitle.TrimEnd(); + textBoxTranslatedProgramTitle.Text = header.TranslatedProgrammeTitle.TrimEnd(); + textBoxTranslatedEpisodeTitle.Text = header.TranslatedEpisodeTitle.TrimEnd(); + textBoxTranslatorsName.Text = header.TranslatorsName.TrimEnd(); + textBoxSubtitleListReferenceCode.Text = header.SubtitleListReferenceCode.TrimEnd(); + textBoxCountryOfOrigin.Text = header.CountryOfOrigin; + + comboBoxTimeCodeStatus.SelectedIndex = 1; + if (header.TimeCodeStatus == "0") + { + comboBoxTimeCodeStatus.SelectedIndex = 0; // 1 == intended for use, 0 == not intended for use + } + + try + { + // HHMMSSFF + int hh = int.Parse(header.TimeCodeStartOfProgramme.Substring(0, 2)); + int mm = int.Parse(header.TimeCodeStartOfProgramme.Substring(2, 2)); + int ss = int.Parse(header.TimeCodeStartOfProgramme.Substring(4, 2)); + int ff = int.Parse(header.TimeCodeStartOfProgramme.Substring(6, 2)); + timeUpDownStartTime.TimeCode = new TimeCode(hh, mm, ss, SubtitleFormat.FramesToMillisecondsMax999(ff)); + } + catch (Exception) + { + timeUpDownStartTime.TimeCode = new TimeCode(); + } + + int number; + if (int.TryParse(header.RevisionNumber, out number)) + { + numericUpDownRevisionNumber.Value = number; + } + else + { + numericUpDownRevisionNumber.Value = 1; + } + + if (int.TryParse(header.MaximumNumberOfDisplayableCharactersInAnyTextRow, out number)) + { + numericUpDownMaxCharacters.Value = number; + } + + numericUpDownMaxRows.Value = 23; + if (int.TryParse(header.MaximumNumberOfDisplayableRows, out number)) + { + numericUpDownMaxRows.Value = number; + } + + if (int.TryParse(header.DiskSequenceNumber, out number)) + { + numericUpDownDiskSequenceNumber.Value = number; + } + else + { + numericUpDownDiskSequenceNumber.Value = 1; + } + + if (int.TryParse(header.TotalNumberOfDisks, out number)) + { + numericUpDownTotalNumberOfDiscs.Value = number; + } + else + { + numericUpDownTotalNumberOfDiscs.Value = 1; + } + } + + private void buttonOK_Click(object sender, EventArgs e) + { + _header.CodePageNumber = textBoxCodePageNumber.Text; + if (_header.CodePageNumber.Length < 3) + { + _header.CodePageNumber = "865"; + } + + if (comboBoxDiscFormatCode.SelectedIndex == 0) + { + _header.DiskFormatCode = "STL23.01"; + } + else if (comboBoxDiscFormatCode.SelectedIndex == 1) + { + _header.DiskFormatCode = "STL24.01"; + } + else if (comboBoxDiscFormatCode.SelectedIndex == 2) + { + _header.DiskFormatCode = "STL25.01"; + } + else if (comboBoxDiscFormatCode.SelectedIndex == 3) + { + _header.DiskFormatCode = "STL29.01"; + } + else + { + _header.DiskFormatCode = "STL30.01"; + } + + double d; + if (double.TryParse(comboBoxFrameRate.Text.Replace(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, "."), out d) && d > 20 && d < 200) + { + _header.FrameRateFromSaveDialog = d; + } + + if (comboBoxDisplayStandardCode.SelectedIndex == 0) + { + _header.DisplayStandardCode = "0"; + } + else if (comboBoxDisplayStandardCode.SelectedIndex == 1) + { + _header.DisplayStandardCode = "1"; + } + else if (comboBoxDisplayStandardCode.SelectedIndex == 2) + { + _header.DisplayStandardCode = "2"; + } + else + { + _header.DisplayStandardCode = " "; + } + + _header.CharacterCodeTableNumber = "0" + comboBoxCharacterCodeTable.SelectedIndex; + _header.LanguageCode = textBoxLanguageCode.Text; + if (_header.LanguageCode.Length != 2) + { + _header.LanguageCode = "0A"; + } + + _header.OriginalProgrammeTitle = textBoxOriginalProgramTitle.Text.PadRight(32, ' '); + _header.OriginalEpisodeTitle = textBoxOriginalEpisodeTitle.Text.PadRight(32, ' '); + _header.TranslatedProgrammeTitle = textBoxTranslatedProgramTitle.Text.PadRight(32, ' '); + _header.TranslatedEpisodeTitle = textBoxTranslatedEpisodeTitle.Text.PadRight(32, ' '); + _header.TranslatorsName = textBoxTranslatorsName.Text.PadRight(32, ' '); + _header.SubtitleListReferenceCode = textBoxSubtitleListReferenceCode.Text.PadRight(16, ' '); + _header.CountryOfOrigin = textBoxCountryOfOrigin.Text; + if (_header.CountryOfOrigin.Length != 3) + { + _header.CountryOfOrigin = "USA"; + } + + _header.TimeCodeStatus = comboBoxTimeCodeStatus.SelectedIndex.ToString(CultureInfo.InvariantCulture); + _header.TimeCodeStartOfProgramme = timeUpDownStartTime.TimeCode.ToHHMMSSFF().RemoveChar(':'); + + _header.RevisionNumber = numericUpDownRevisionNumber.Value.ToString("00"); + _header.MaximumNumberOfDisplayableCharactersInAnyTextRow = numericUpDownMaxCharacters.Value.ToString("00"); + _header.MaximumNumberOfDisplayableRows = numericUpDownMaxRows.Value.ToString("00"); + _header.DiskSequenceNumber = numericUpDownDiskSequenceNumber.Value.ToString(CultureInfo.InvariantCulture); + _header.TotalNumberOfDisks = numericUpDownTotalNumberOfDiscs.Value.ToString(CultureInfo.InvariantCulture); + + JustificationCode = (byte)comboBoxJustificationCode.SelectedIndex; + Configuration.Settings.SubtitleSettings.EbuStlMarginTop = (int)Math.Round(numericUpDownMarginTop.Value); + Configuration.Settings.SubtitleSettings.EbuStlMarginBottom = (int)Math.Round(numericUpDownMarginBottom.Value); + Configuration.Settings.SubtitleSettings.EbuStlNewLineRows = (int)Math.Round(numericUpDownNewLineRows.Value); + Configuration.Settings.SubtitleSettings.EbuStlTeletextUseBox = checkBoxTeletextBox.Checked; + Configuration.Settings.SubtitleSettings.EbuStlTeletextUseDoubleHeight = checkBoxTeletextDoubleHeight.Checked; + + if (_subtitle != null) + { + _subtitle.Header = _header.ToString(); + } + + DialogResult = DialogResult.OK; + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void buttonImport_Click(object sender, EventArgs e) + { + openFileDialog1.Filter = "EBU STL files (*.stl)|*.stl"; + openFileDialog1.FileName = string.Empty; + if (openFileDialog1.ShowDialog() == DialogResult.OK) + { + FillHeaderFromFile(openFileDialog1.FileName); + } + } + + private void FillHeaderFromFile(string fileName) + { + if (File.Exists(fileName)) + { + var ebu = new Ebu(); + var temp = new Subtitle(); + ebu.LoadSubtitle(temp, null, fileName); + FillFromHeader(ebu.Header); + if (ebu.JustificationCodes.Count > 2 && ebu.JustificationCodes[1] == ebu.JustificationCodes[2]) + { + if (ebu.JustificationCodes[1] >= 0 && ebu.JustificationCodes[1] < 4) + { + comboBoxJustificationCode.SelectedIndex = ebu.JustificationCodes[1]; + } + } + } + } + + private void numericUpDownMaxCharacters_ValueChanged(object sender, EventArgs e) + { + CheckMaxCharsPerRow(); + CheckErrors(_subtitle); + } + + private void unitedStatesToolStripMenuItem_Click(object sender, EventArgs e) + { + textBoxCodePageNumber.Text = "437"; + } + + private void multilingualToolStripMenuItem_Click(object sender, EventArgs e) + { + textBoxCodePageNumber.Text = "850"; + } + + private void portugalToolStripMenuItem_Click(object sender, EventArgs e) + { + textBoxCodePageNumber.Text = "860"; + } + + private void canadaFrenchToolStripMenuItem_Click(object sender, EventArgs e) + { + textBoxCodePageNumber.Text = "863"; + } + + private void nordicToolStripMenuItem_Click(object sender, EventArgs e) + { + textBoxCodePageNumber.Text = "865"; + } + + private void comboBoxDiscFormatCode_SelectedIndexChanged(object sender, EventArgs e) + { + if (comboBoxDiscFormatCode.SelectedIndex == 2) + { + comboBoxFrameRate.Text = (25).ToString(CultureInfo.CurrentCulture); + } + else if (comboBoxDiscFormatCode.SelectedIndex == 4) + { + comboBoxFrameRate.Text = (30).ToString(CultureInfo.CurrentCulture); + } + } + + private void comboBoxDisplayStandardCode_SelectedIndexChanged(object sender, EventArgs e) + { + labelDisplayStandardCodeWarning.Text = string.Empty; + CheckMaxCharsPerRow(); + if (_subtitle == null) + { + return; + } + + var fontColorFound = false; + var alignmentFound = false; + if (comboBoxDisplayStandardCode.SelectedIndex == 0) // open subtitling + { + foreach (var paragraph in _subtitle.Paragraphs) + { + if (!fontColorFound && + paragraph.Text.Contains(" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - 157, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 157, 17 + \ No newline at end of file diff --git a/src/Forms/EffectKaraoke.Designer.cs b/src/ui/Forms/EffectKaraoke.Designer.cs similarity index 97% rename from src/Forms/EffectKaraoke.Designer.cs rename to src/ui/Forms/EffectKaraoke.Designer.cs index 65b913a8c..68263144c 100644 --- a/src/Forms/EffectKaraoke.Designer.cs +++ b/src/ui/Forms/EffectKaraoke.Designer.cs @@ -1,232 +1,232 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class EffectKaraoke - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.labelTotalMilliseconds = new System.Windows.Forms.Label(); - this.labelTM = new System.Windows.Forms.Label(); - this.numericUpDownDelay = new System.Windows.Forms.NumericUpDown(); - this.labelColor = new System.Windows.Forms.Label(); - this.labelEndDelay = new System.Windows.Forms.Label(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.buttonChooseColor = new System.Windows.Forms.Button(); - this.panelColor = new System.Windows.Forms.Panel(); - this.labelChooseColor = new System.Windows.Forms.Label(); - this.buttonPreview = new System.Windows.Forms.Button(); - this.colorDialog1 = new System.Windows.Forms.ColorDialog(); - this.timer1 = new System.Windows.Forms.Timer(this.components); - this.richTextBoxPreview = new System.Windows.Forms.RichTextBox(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDelay)).BeginInit(); - this.SuspendLayout(); - // - // labelTotalMilliseconds - // - this.labelTotalMilliseconds.AutoSize = true; - this.labelTotalMilliseconds.Location = new System.Drawing.Point(169, 52); - this.labelTotalMilliseconds.Name = "labelTotalMilliseconds"; - this.labelTotalMilliseconds.Size = new System.Drawing.Size(108, 13); - this.labelTotalMilliseconds.TabIndex = 49; - this.labelTotalMilliseconds.Text = "labelTotalMilliseconds"; - // - // labelTM - // - this.labelTM.Location = new System.Drawing.Point(3, 52); - this.labelTM.Name = "labelTM"; - this.labelTM.Size = new System.Drawing.Size(163, 13); - this.labelTM.TabIndex = 48; - this.labelTM.Text = "Total milliseconds:"; - this.labelTM.TextAlign = System.Drawing.ContentAlignment.TopRight; - // - // numericUpDownDelay - // - this.numericUpDownDelay.DecimalPlaces = 3; - this.numericUpDownDelay.Increment = new decimal(new int[] { - 1, - 0, - 0, - 65536}); - this.numericUpDownDelay.Location = new System.Drawing.Point(169, 72); - this.numericUpDownDelay.Maximum = new decimal(new int[] { - 99999, - 0, - 0, - 0}); - this.numericUpDownDelay.Minimum = new decimal(new int[] { - 99999, - 0, - 0, - -2147483648}); - this.numericUpDownDelay.Name = "numericUpDownDelay"; - this.numericUpDownDelay.Size = new System.Drawing.Size(54, 21); - this.numericUpDownDelay.TabIndex = 47; - // - // labelColor - // - this.labelColor.AutoSize = true; - this.labelColor.Location = new System.Drawing.Point(228, 22); - this.labelColor.Name = "labelColor"; - this.labelColor.Size = new System.Drawing.Size(32, 13); - this.labelColor.TabIndex = 46; - this.labelColor.Text = "Color"; - // - // labelEndDelay - // - this.labelEndDelay.Location = new System.Drawing.Point(3, 76); - this.labelEndDelay.Name = "labelEndDelay"; - this.labelEndDelay.Size = new System.Drawing.Size(163, 17); - this.labelEndDelay.TabIndex = 45; - this.labelEndDelay.Text = "End delay in milliseconds:"; - this.labelEndDelay.TextAlign = System.Drawing.ContentAlignment.TopRight; - // - // buttonCancel - // - this.buttonCancel.BackColor = System.Drawing.SystemColors.Control; - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.Location = new System.Drawing.Point(353, 173); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 44; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = false; - // - // buttonOK - // - this.buttonOK.Location = new System.Drawing.Point(272, 173); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 43; - this.buttonOK.Text = "OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); - // - // buttonChooseColor - // - this.buttonChooseColor.Location = new System.Drawing.Point(169, 17); - this.buttonChooseColor.Name = "buttonChooseColor"; - this.buttonChooseColor.Size = new System.Drawing.Size(27, 23); - this.buttonChooseColor.TabIndex = 42; - this.buttonChooseColor.Text = "..."; - this.buttonChooseColor.UseVisualStyleBackColor = true; - this.buttonChooseColor.Click += new System.EventHandler(this.ButtonChooseColorClick); - // - // panelColor - // - this.panelColor.Location = new System.Drawing.Point(202, 19); - this.panelColor.Name = "panelColor"; - this.panelColor.Size = new System.Drawing.Size(20, 20); - this.panelColor.TabIndex = 41; - // - // labelChooseColor - // - this.labelChooseColor.Location = new System.Drawing.Point(0, 22); - this.labelChooseColor.Name = "labelChooseColor"; - this.labelChooseColor.Size = new System.Drawing.Size(166, 13); - this.labelChooseColor.TabIndex = 40; - this.labelChooseColor.Text = "Choose color:"; - this.labelChooseColor.TextAlign = System.Drawing.ContentAlignment.TopRight; - // - // buttonPreview - // - this.buttonPreview.Location = new System.Drawing.Point(12, 154); - this.buttonPreview.Name = "buttonPreview"; - this.buttonPreview.Size = new System.Drawing.Size(100, 23); - this.buttonPreview.TabIndex = 39; - this.buttonPreview.Text = "Preview"; - this.buttonPreview.UseVisualStyleBackColor = true; - this.buttonPreview.Click += new System.EventHandler(this.ButtonPreviewClick); - // - // timer1 - // - this.timer1.Tick += new System.EventHandler(this.Timer1Tick); - // - // richTextBoxPreview - // - this.richTextBoxPreview.BackColor = System.Drawing.Color.Black; - this.richTextBoxPreview.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.richTextBoxPreview.DetectUrls = false; - this.richTextBoxPreview.Location = new System.Drawing.Point(13, 99); - this.richTextBoxPreview.Name = "richTextBoxPreview"; - this.richTextBoxPreview.ReadOnly = true; - this.richTextBoxPreview.Size = new System.Drawing.Size(415, 49); - this.richTextBoxPreview.TabIndex = 50; - this.richTextBoxPreview.TabStop = false; - this.richTextBoxPreview.Text = ""; - // - // EffectKaraoke - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(440, 208); - this.Controls.Add(this.richTextBoxPreview); - this.Controls.Add(this.labelTotalMilliseconds); - this.Controls.Add(this.labelTM); - this.Controls.Add(this.numericUpDownDelay); - this.Controls.Add(this.labelColor); - this.Controls.Add(this.labelEndDelay); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.buttonChooseColor); - this.Controls.Add(this.panelColor); - this.Controls.Add(this.labelChooseColor); - this.Controls.Add(this.buttonPreview); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "EffectKaraoke"; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Karaoke effect"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormEffectkaraoke_KeyDown); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDelay)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Label labelTotalMilliseconds; - private System.Windows.Forms.Label labelTM; - private System.Windows.Forms.NumericUpDown numericUpDownDelay; - private System.Windows.Forms.Label labelColor; - private System.Windows.Forms.Label labelEndDelay; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Button buttonChooseColor; - private System.Windows.Forms.Panel panelColor; - private System.Windows.Forms.Label labelChooseColor; - private System.Windows.Forms.Button buttonPreview; - private System.Windows.Forms.ColorDialog colorDialog1; - private System.Windows.Forms.Timer timer1; - private System.Windows.Forms.RichTextBox richTextBoxPreview; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class EffectKaraoke + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.labelTotalMilliseconds = new System.Windows.Forms.Label(); + this.labelTM = new System.Windows.Forms.Label(); + this.numericUpDownDelay = new System.Windows.Forms.NumericUpDown(); + this.labelColor = new System.Windows.Forms.Label(); + this.labelEndDelay = new System.Windows.Forms.Label(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.buttonChooseColor = new System.Windows.Forms.Button(); + this.panelColor = new System.Windows.Forms.Panel(); + this.labelChooseColor = new System.Windows.Forms.Label(); + this.buttonPreview = new System.Windows.Forms.Button(); + this.colorDialog1 = new System.Windows.Forms.ColorDialog(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.richTextBoxPreview = new System.Windows.Forms.RichTextBox(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDelay)).BeginInit(); + this.SuspendLayout(); + // + // labelTotalMilliseconds + // + this.labelTotalMilliseconds.AutoSize = true; + this.labelTotalMilliseconds.Location = new System.Drawing.Point(169, 52); + this.labelTotalMilliseconds.Name = "labelTotalMilliseconds"; + this.labelTotalMilliseconds.Size = new System.Drawing.Size(108, 13); + this.labelTotalMilliseconds.TabIndex = 49; + this.labelTotalMilliseconds.Text = "labelTotalMilliseconds"; + // + // labelTM + // + this.labelTM.Location = new System.Drawing.Point(3, 52); + this.labelTM.Name = "labelTM"; + this.labelTM.Size = new System.Drawing.Size(163, 13); + this.labelTM.TabIndex = 48; + this.labelTM.Text = "Total milliseconds:"; + this.labelTM.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // numericUpDownDelay + // + this.numericUpDownDelay.DecimalPlaces = 3; + this.numericUpDownDelay.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.numericUpDownDelay.Location = new System.Drawing.Point(169, 72); + this.numericUpDownDelay.Maximum = new decimal(new int[] { + 99999, + 0, + 0, + 0}); + this.numericUpDownDelay.Minimum = new decimal(new int[] { + 99999, + 0, + 0, + -2147483648}); + this.numericUpDownDelay.Name = "numericUpDownDelay"; + this.numericUpDownDelay.Size = new System.Drawing.Size(54, 21); + this.numericUpDownDelay.TabIndex = 47; + // + // labelColor + // + this.labelColor.AutoSize = true; + this.labelColor.Location = new System.Drawing.Point(228, 22); + this.labelColor.Name = "labelColor"; + this.labelColor.Size = new System.Drawing.Size(32, 13); + this.labelColor.TabIndex = 46; + this.labelColor.Text = "Color"; + // + // labelEndDelay + // + this.labelEndDelay.Location = new System.Drawing.Point(3, 76); + this.labelEndDelay.Name = "labelEndDelay"; + this.labelEndDelay.Size = new System.Drawing.Size(163, 17); + this.labelEndDelay.TabIndex = 45; + this.labelEndDelay.Text = "End delay in milliseconds:"; + this.labelEndDelay.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // buttonCancel + // + this.buttonCancel.BackColor = System.Drawing.SystemColors.Control; + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.Location = new System.Drawing.Point(353, 173); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 44; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = false; + // + // buttonOK + // + this.buttonOK.Location = new System.Drawing.Point(272, 173); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 43; + this.buttonOK.Text = "OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); + // + // buttonChooseColor + // + this.buttonChooseColor.Location = new System.Drawing.Point(169, 17); + this.buttonChooseColor.Name = "buttonChooseColor"; + this.buttonChooseColor.Size = new System.Drawing.Size(27, 23); + this.buttonChooseColor.TabIndex = 42; + this.buttonChooseColor.Text = "..."; + this.buttonChooseColor.UseVisualStyleBackColor = true; + this.buttonChooseColor.Click += new System.EventHandler(this.ButtonChooseColorClick); + // + // panelColor + // + this.panelColor.Location = new System.Drawing.Point(202, 19); + this.panelColor.Name = "panelColor"; + this.panelColor.Size = new System.Drawing.Size(20, 20); + this.panelColor.TabIndex = 41; + // + // labelChooseColor + // + this.labelChooseColor.Location = new System.Drawing.Point(0, 22); + this.labelChooseColor.Name = "labelChooseColor"; + this.labelChooseColor.Size = new System.Drawing.Size(166, 13); + this.labelChooseColor.TabIndex = 40; + this.labelChooseColor.Text = "Choose color:"; + this.labelChooseColor.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // buttonPreview + // + this.buttonPreview.Location = new System.Drawing.Point(12, 154); + this.buttonPreview.Name = "buttonPreview"; + this.buttonPreview.Size = new System.Drawing.Size(100, 23); + this.buttonPreview.TabIndex = 39; + this.buttonPreview.Text = "Preview"; + this.buttonPreview.UseVisualStyleBackColor = true; + this.buttonPreview.Click += new System.EventHandler(this.ButtonPreviewClick); + // + // timer1 + // + this.timer1.Tick += new System.EventHandler(this.Timer1Tick); + // + // richTextBoxPreview + // + this.richTextBoxPreview.BackColor = System.Drawing.Color.Black; + this.richTextBoxPreview.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.richTextBoxPreview.DetectUrls = false; + this.richTextBoxPreview.Location = new System.Drawing.Point(13, 99); + this.richTextBoxPreview.Name = "richTextBoxPreview"; + this.richTextBoxPreview.ReadOnly = true; + this.richTextBoxPreview.Size = new System.Drawing.Size(415, 49); + this.richTextBoxPreview.TabIndex = 50; + this.richTextBoxPreview.TabStop = false; + this.richTextBoxPreview.Text = ""; + // + // EffectKaraoke + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(440, 208); + this.Controls.Add(this.richTextBoxPreview); + this.Controls.Add(this.labelTotalMilliseconds); + this.Controls.Add(this.labelTM); + this.Controls.Add(this.numericUpDownDelay); + this.Controls.Add(this.labelColor); + this.Controls.Add(this.labelEndDelay); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.buttonChooseColor); + this.Controls.Add(this.panelColor); + this.Controls.Add(this.labelChooseColor); + this.Controls.Add(this.buttonPreview); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "EffectKaraoke"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Karaoke effect"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormEffectkaraoke_KeyDown); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDelay)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label labelTotalMilliseconds; + private System.Windows.Forms.Label labelTM; + private System.Windows.Forms.NumericUpDown numericUpDownDelay; + private System.Windows.Forms.Label labelColor; + private System.Windows.Forms.Label labelEndDelay; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Button buttonChooseColor; + private System.Windows.Forms.Panel panelColor; + private System.Windows.Forms.Label labelChooseColor; + private System.Windows.Forms.Button buttonPreview; + private System.Windows.Forms.ColorDialog colorDialog1; + private System.Windows.Forms.Timer timer1; + private System.Windows.Forms.RichTextBox richTextBoxPreview; + } } \ No newline at end of file diff --git a/src/Forms/EffectKaraoke.cs b/src/ui/Forms/EffectKaraoke.cs similarity index 97% rename from src/Forms/EffectKaraoke.cs rename to src/ui/Forms/EffectKaraoke.cs index 9bef51736..ed2ecb54d 100644 --- a/src/Forms/EffectKaraoke.cs +++ b/src/ui/Forms/EffectKaraoke.cs @@ -1,455 +1,455 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Text; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class EffectKaraoke : Form - { - private Paragraph _paragraph; - private List _animation; - private int _timerCount; - - public EffectKaraoke() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - Text = Configuration.Settings.Language.EffectKaraoke.Title; - labelChooseColor.Text = Configuration.Settings.Language.EffectKaraoke.ChooseColor; - labelTM.Text = Configuration.Settings.Language.EffectKaraoke.TotalMilliseconds; - labelEndDelay.Text = Configuration.Settings.Language.EffectKaraoke.EndDelayInMilliseconds; - buttonPreview.Text = Configuration.Settings.Language.General.Preview; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - UiUtil.FixLargeFonts(this, buttonOK); - } - - private void FormEffectkaraoke_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - internal void Initialize(Paragraph paragraph) - { - _paragraph = new Paragraph(paragraph); - if (_paragraph.Text.Length > 3) - { - _paragraph.Text = HtmlUtil.FixUpperTags(_paragraph.Text); - } - _animation = new List(); - - colorDialog1.Color = Color.Red; - labelColor.Text = Utilities.ColorToHex(colorDialog1.Color); - panelColor.BackColor = colorDialog1.Color; - - AddToPreview(richTextBoxPreview, paragraph.Text); - RefreshPreview(); - labelTotalMilliseconds.Text = $"{paragraph.Duration.TotalMilliseconds / TimeCode.BaseUnit:#,##0.000}"; - numericUpDownDelay.Maximum = (decimal)((paragraph.Duration.TotalMilliseconds - 500) / TimeCode.BaseUnit); - numericUpDownDelay.Minimum = 0; - - numericUpDownDelay.Left = labelEndDelay.Left + labelEndDelay.Width + 5; - } - - internal struct ColorEntry - { - public int Start { get; set; } - public int Length { get; set; } - public Color Color { get; set; } - } - - internal struct FontEntry - { - public int Start { get; set; } - public int Length { get; set; } - public Font Font { get; set; } - } - - private List _colorList; - private List _fontList; - - private void AddToPreview(RichTextBox rtb, string text) - { - richTextBoxPreview.ForeColor = Color.White; - _colorList = new List(); - _fontList = new List(); - - int bold = 0; - int underline = 0; - int italic = 0; - var fontColors = new Stack(); - string currentColor = string.Empty; - - var sb = new StringBuilder(); - int i = 0; - while (i < text.Length) - { - if (text[i] == '<' && IsTagFollowIndex(text, i)) - { - AddTextToRichTextBox(rtb, bold > 0, italic > 0, underline > 0, currentColor, sb.ToString()); - sb.Clear(); - string tag = GetTag(text.Substring(i)); - if (i + 1 < text.Length && text[i + 1] == '/') - { - if (tag == "
" && italic > 0) - { - italic--; - } - else if (tag == "" && bold > 0) - { - bold--; - } - else if (tag == "" && underline > 0) - { - underline--; - } - else if (tag == "") - { - currentColor = fontColors.Count > 0 ? fontColors.Pop() : string.Empty; - } - } - else - { - if (tag == "") - { - italic++; - } - else if (tag == "") - { - bold++; - } - else if (tag == "") - { - underline++; - } - else if (tag.StartsWith(" 0) - { - AddTextToRichTextBox(rtb, bold > 0, italic > 0, underline > 0, currentColor, sb.ToString()); - } - - foreach (var fontEntry in _fontList) - { - rtb.SelectionStart = fontEntry.Start; - rtb.SelectionLength = fontEntry.Length; - rtb.SelectionFont = fontEntry.Font; - rtb.DeselectAll(); - } - - foreach (var colorEntry in _colorList) - { - rtb.SelectionStart = colorEntry.Start; - rtb.SelectionLength = colorEntry.Length; - rtb.SelectionColor = colorEntry.Color; - rtb.DeselectAll(); - } - } - - private void AddTextToRichTextBox(RichTextBox rtb, bool bold, bool italic, bool underline, string color, string text) - { - if (text.Length > 0) - { - int length = rtb.Text.Length; - richTextBoxPreview.Text += text; - _colorList.Add(new ColorEntry { Start = length, Length = text.Length, Color = string.IsNullOrWhiteSpace(color) ? Color.White : ColorTranslator.FromHtml(color) }); - - var fontStyle = new FontStyle(); - if (underline) - { - fontStyle = FontStyle.Underline; - } - - if (italic) - { - fontStyle |= FontStyle.Italic; - } - - if (bold) - { - fontStyle |= FontStyle.Bold; - } - - _fontList.Add(new FontEntry { Start = length, Length = text.Length, Font = new Font(rtb.Font.FontFamily, rtb.Font.Size, fontStyle) }); - } - } - - private static string GetTag(string text) - { - var sb = new StringBuilder(); - for (int i = 0; i < text.Length; i++) - { - sb.Append(text[i]); - if (text[i] == '>') - { - return sb.ToString(); - } - } - return sb.ToString(); - } - - private void ClearPreview() - { - richTextBoxPreview.Text = string.Empty; - } - - private void RefreshPreview() - { - richTextBoxPreview.SelectAll(); - richTextBoxPreview.SelectionAlignment = HorizontalAlignment.Center; - richTextBoxPreview.Refresh(); - } - - private void ButtonChooseColorClick(object sender, EventArgs e) - { - if (colorDialog1.ShowDialog() == DialogResult.OK) - { - labelColor.Text = Utilities.ColorToHex(colorDialog1.Color); - panelColor.BackColor = colorDialog1.Color; - } - } - - private void ButtonPreviewClick(object sender, EventArgs e) - { - MakeAnimation(); - PlayAnimation(); - } - - private void PlayAnimation() - { - _timerCount = (int)_paragraph.StartTime.TotalMilliseconds; - timer1.Start(); - } - - public static double CalculateStepLength(string text, double duration) - { - // Exclude non displayed characters. - int totalNewLineChars = Utilities.CountTagInText(text, '\n') + Utilities.CountTagInText(text, '\r'); - return duration / (HtmlUtil.RemoveHtmlTags(text, true).Length - totalNewLineChars); - } - - public List MakeAnimation(Paragraph paragraph) - { - _paragraph = paragraph; - MakeAnimation(); - return _animation; - } - - private void MakeAnimation() - { - _animation = new List(); - double duration = _paragraph.Duration.TotalMilliseconds - ((double)numericUpDownDelay.Value * TimeCode.BaseUnit); - double stepsLength = CalculateStepLength(_paragraph.Text, duration); - - double startMilliseconds; - double endMilliseconds; - TimeCode start; - TimeCode end; - int index = 0; - string text = string.Empty; - bool tagOn = false; - string tag = string.Empty; - int i = 0; - string startFontTag = string.Format("", Utilities.ColorToHex(panelColor.BackColor)); - const string endFontTag = ""; - string afterCurrentTag = string.Empty; - string beforeEndTag = string.Empty; - string alignment = string.Empty; - - // Preserve SSA tag if present. - if (_paragraph.Text.StartsWith("{\\", StringComparison.Ordinal) && _paragraph.Text.IndexOf('}') > 2) - { - int idx = _paragraph.Text.IndexOf('}'); - alignment = _paragraph.Text.Substring(0, idx + 1); - i = idx; - } - - while (i < _paragraph.Text.Length) - { - var c = _paragraph.Text[i]; - if (tagOn) - { - tag += c; - if (_paragraph.Text[i] == '>') - { - tagOn = false; - if (tag.StartsWith("") - { - afterCurrentTag = ""; - beforeEndTag = ""; - } - else if (tag == "") - { - afterCurrentTag = ""; - beforeEndTag = ""; - } - else if (tag == "") - { - afterCurrentTag = ""; - beforeEndTag = ""; - } - } - } - else if (_paragraph.Text[i] == '<' && IsTagFollowIndex(_paragraph.Text, i)) - { - afterCurrentTag = string.Empty; - tagOn = true; - tag += c; - beforeEndTag = string.Empty; - } - else - { - text += tag + c; - tag = string.Empty; - // Take next char if current is (\r or \n); - while ((_paragraph.Text[i] == '\r' || _paragraph.Text[i] == '\n') && (i + 1 < _paragraph.Text.Length)) - { - text += _paragraph.Text[++i]; - } - string afterText = string.Empty; - if (i + 1 < _paragraph.Text.Length) - { - afterText = _paragraph.Text.Substring(i + 1); - } - - if (afterText.StartsWith(endFontTag, StringComparison.Ordinal) && afterCurrentTag.StartsWith(" if present. - afterText = afterText.Substring(endFontTag.Length); - // Move pointer to end to avoid redundant loop. - i += endFontTag.Length; - afterCurrentTag = string.Empty; - } - string tempText = alignment + startFontTag + text + beforeEndTag + endFontTag + afterCurrentTag + afterText; - tempText = tempText.Replace("", string.Empty); - tempText = tempText.Replace("", string.Empty); - tempText = tempText.Replace("", string.Empty); - - startMilliseconds = index * stepsLength; - startMilliseconds += _paragraph.StartTime.TotalMilliseconds; - endMilliseconds = ((index + 1) * stepsLength) - 1; - endMilliseconds += _paragraph.StartTime.TotalMilliseconds; - start = new TimeCode(startMilliseconds); - end = new TimeCode(endMilliseconds); - _animation.Add(new Paragraph(start, end, tempText)); - index++; - } - i++; - } - // All remaining time should go to the last paragraph. - if (_animation.Count > 0) - { - _animation[_animation.Count - 1].EndTime.TotalMilliseconds = _paragraph.EndTime.TotalMilliseconds; - } - } - - private void Timer1Tick(object sender, EventArgs e) - { - _timerCount += timer1.Interval; - - string s = GetText(_timerCount, _animation); - ClearPreview(); - AddToPreview(richTextBoxPreview, s); - RefreshPreview(); - - if (_timerCount > _paragraph.EndTime.TotalMilliseconds) - { - timer1.Stop(); - System.Threading.Thread.Sleep(200); - ClearPreview(); - AddToPreview(richTextBoxPreview, _paragraph.Text); - } - } - - private static string GetText(int milliseconds, IEnumerable animation) - { - foreach (Paragraph p in animation) - { - if (p.StartTime.TotalMilliseconds <= milliseconds && - p.EndTime.TotalMilliseconds >= milliseconds) - { - return p.Text; - } - } - return string.Empty; - } - - private void ButtonOkClick(object sender, EventArgs e) - { - MakeAnimation(); - DialogResult = DialogResult.OK; - } - - public static bool IsTagFollowIndex(string text, int index) - { - string tag; - // , , , - if (text.Length >= index + 7) - { - tag = text.Substring(index, 7); - if (tag.StartsWith("= index + 3) - { - tag = text.Substring(index, 3); - int idx = 1; - if ((tag[2] == '>' || tag[idx++] == '/') && (tag[idx] == 'i' || tag[idx] == 'I' || tag[idx] == 'b' || tag[idx] == 'B' || tag[idx] == 'u' || tag[idx] == 'U')) - { - return true; - } - } - return false; - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class EffectKaraoke : Form + { + private Paragraph _paragraph; + private List _animation; + private int _timerCount; + + public EffectKaraoke() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + Text = Configuration.Settings.Language.EffectKaraoke.Title; + labelChooseColor.Text = Configuration.Settings.Language.EffectKaraoke.ChooseColor; + labelTM.Text = Configuration.Settings.Language.EffectKaraoke.TotalMilliseconds; + labelEndDelay.Text = Configuration.Settings.Language.EffectKaraoke.EndDelayInMilliseconds; + buttonPreview.Text = Configuration.Settings.Language.General.Preview; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + UiUtil.FixLargeFonts(this, buttonOK); + } + + private void FormEffectkaraoke_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + internal void Initialize(Paragraph paragraph) + { + _paragraph = new Paragraph(paragraph); + if (_paragraph.Text.Length > 3) + { + _paragraph.Text = HtmlUtil.FixUpperTags(_paragraph.Text); + } + _animation = new List(); + + colorDialog1.Color = Color.Red; + labelColor.Text = Utilities.ColorToHex(colorDialog1.Color); + panelColor.BackColor = colorDialog1.Color; + + AddToPreview(richTextBoxPreview, paragraph.Text); + RefreshPreview(); + labelTotalMilliseconds.Text = $"{paragraph.Duration.TotalMilliseconds / TimeCode.BaseUnit:#,##0.000}"; + numericUpDownDelay.Maximum = (decimal)((paragraph.Duration.TotalMilliseconds - 500) / TimeCode.BaseUnit); + numericUpDownDelay.Minimum = 0; + + numericUpDownDelay.Left = labelEndDelay.Left + labelEndDelay.Width + 5; + } + + internal struct ColorEntry + { + public int Start { get; set; } + public int Length { get; set; } + public Color Color { get; set; } + } + + internal struct FontEntry + { + public int Start { get; set; } + public int Length { get; set; } + public Font Font { get; set; } + } + + private List _colorList; + private List _fontList; + + private void AddToPreview(RichTextBox rtb, string text) + { + richTextBoxPreview.ForeColor = Color.White; + _colorList = new List(); + _fontList = new List(); + + int bold = 0; + int underline = 0; + int italic = 0; + var fontColors = new Stack(); + string currentColor = string.Empty; + + var sb = new StringBuilder(); + int i = 0; + while (i < text.Length) + { + if (text[i] == '<' && IsTagFollowIndex(text, i)) + { + AddTextToRichTextBox(rtb, bold > 0, italic > 0, underline > 0, currentColor, sb.ToString()); + sb.Clear(); + string tag = GetTag(text.Substring(i)); + if (i + 1 < text.Length && text[i + 1] == '/') + { + if (tag == "" && italic > 0) + { + italic--; + } + else if (tag == "" && bold > 0) + { + bold--; + } + else if (tag == "" && underline > 0) + { + underline--; + } + else if (tag == "") + { + currentColor = fontColors.Count > 0 ? fontColors.Pop() : string.Empty; + } + } + else + { + if (tag == "") + { + italic++; + } + else if (tag == "") + { + bold++; + } + else if (tag == "") + { + underline++; + } + else if (tag.StartsWith(" 0) + { + AddTextToRichTextBox(rtb, bold > 0, italic > 0, underline > 0, currentColor, sb.ToString()); + } + + foreach (var fontEntry in _fontList) + { + rtb.SelectionStart = fontEntry.Start; + rtb.SelectionLength = fontEntry.Length; + rtb.SelectionFont = fontEntry.Font; + rtb.DeselectAll(); + } + + foreach (var colorEntry in _colorList) + { + rtb.SelectionStart = colorEntry.Start; + rtb.SelectionLength = colorEntry.Length; + rtb.SelectionColor = colorEntry.Color; + rtb.DeselectAll(); + } + } + + private void AddTextToRichTextBox(RichTextBox rtb, bool bold, bool italic, bool underline, string color, string text) + { + if (text.Length > 0) + { + int length = rtb.Text.Length; + richTextBoxPreview.Text += text; + _colorList.Add(new ColorEntry { Start = length, Length = text.Length, Color = string.IsNullOrWhiteSpace(color) ? Color.White : ColorTranslator.FromHtml(color) }); + + var fontStyle = new FontStyle(); + if (underline) + { + fontStyle = FontStyle.Underline; + } + + if (italic) + { + fontStyle |= FontStyle.Italic; + } + + if (bold) + { + fontStyle |= FontStyle.Bold; + } + + _fontList.Add(new FontEntry { Start = length, Length = text.Length, Font = new Font(rtb.Font.FontFamily, rtb.Font.Size, fontStyle) }); + } + } + + private static string GetTag(string text) + { + var sb = new StringBuilder(); + for (int i = 0; i < text.Length; i++) + { + sb.Append(text[i]); + if (text[i] == '>') + { + return sb.ToString(); + } + } + return sb.ToString(); + } + + private void ClearPreview() + { + richTextBoxPreview.Text = string.Empty; + } + + private void RefreshPreview() + { + richTextBoxPreview.SelectAll(); + richTextBoxPreview.SelectionAlignment = HorizontalAlignment.Center; + richTextBoxPreview.Refresh(); + } + + private void ButtonChooseColorClick(object sender, EventArgs e) + { + if (colorDialog1.ShowDialog() == DialogResult.OK) + { + labelColor.Text = Utilities.ColorToHex(colorDialog1.Color); + panelColor.BackColor = colorDialog1.Color; + } + } + + private void ButtonPreviewClick(object sender, EventArgs e) + { + MakeAnimation(); + PlayAnimation(); + } + + private void PlayAnimation() + { + _timerCount = (int)_paragraph.StartTime.TotalMilliseconds; + timer1.Start(); + } + + public static double CalculateStepLength(string text, double duration) + { + // Exclude non displayed characters. + int totalNewLineChars = Utilities.CountTagInText(text, '\n') + Utilities.CountTagInText(text, '\r'); + return duration / (HtmlUtil.RemoveHtmlTags(text, true).Length - totalNewLineChars); + } + + public List MakeAnimation(Paragraph paragraph) + { + _paragraph = paragraph; + MakeAnimation(); + return _animation; + } + + private void MakeAnimation() + { + _animation = new List(); + double duration = _paragraph.Duration.TotalMilliseconds - ((double)numericUpDownDelay.Value * TimeCode.BaseUnit); + double stepsLength = CalculateStepLength(_paragraph.Text, duration); + + double startMilliseconds; + double endMilliseconds; + TimeCode start; + TimeCode end; + int index = 0; + string text = string.Empty; + bool tagOn = false; + string tag = string.Empty; + int i = 0; + string startFontTag = string.Format("", Utilities.ColorToHex(panelColor.BackColor)); + const string endFontTag = ""; + string afterCurrentTag = string.Empty; + string beforeEndTag = string.Empty; + string alignment = string.Empty; + + // Preserve SSA tag if present. + if (_paragraph.Text.StartsWith("{\\", StringComparison.Ordinal) && _paragraph.Text.IndexOf('}') > 2) + { + int idx = _paragraph.Text.IndexOf('}'); + alignment = _paragraph.Text.Substring(0, idx + 1); + i = idx; + } + + while (i < _paragraph.Text.Length) + { + var c = _paragraph.Text[i]; + if (tagOn) + { + tag += c; + if (_paragraph.Text[i] == '>') + { + tagOn = false; + if (tag.StartsWith("") + { + afterCurrentTag = ""; + beforeEndTag = ""; + } + else if (tag == "") + { + afterCurrentTag = ""; + beforeEndTag = ""; + } + else if (tag == "") + { + afterCurrentTag = ""; + beforeEndTag = ""; + } + } + } + else if (_paragraph.Text[i] == '<' && IsTagFollowIndex(_paragraph.Text, i)) + { + afterCurrentTag = string.Empty; + tagOn = true; + tag += c; + beforeEndTag = string.Empty; + } + else + { + text += tag + c; + tag = string.Empty; + // Take next char if current is (\r or \n); + while ((_paragraph.Text[i] == '\r' || _paragraph.Text[i] == '\n') && (i + 1 < _paragraph.Text.Length)) + { + text += _paragraph.Text[++i]; + } + string afterText = string.Empty; + if (i + 1 < _paragraph.Text.Length) + { + afterText = _paragraph.Text.Substring(i + 1); + } + + if (afterText.StartsWith(endFontTag, StringComparison.Ordinal) && afterCurrentTag.StartsWith(" if present. + afterText = afterText.Substring(endFontTag.Length); + // Move pointer to end to avoid redundant loop. + i += endFontTag.Length; + afterCurrentTag = string.Empty; + } + string tempText = alignment + startFontTag + text + beforeEndTag + endFontTag + afterCurrentTag + afterText; + tempText = tempText.Replace("", string.Empty); + tempText = tempText.Replace("", string.Empty); + tempText = tempText.Replace("", string.Empty); + + startMilliseconds = index * stepsLength; + startMilliseconds += _paragraph.StartTime.TotalMilliseconds; + endMilliseconds = ((index + 1) * stepsLength) - 1; + endMilliseconds += _paragraph.StartTime.TotalMilliseconds; + start = new TimeCode(startMilliseconds); + end = new TimeCode(endMilliseconds); + _animation.Add(new Paragraph(start, end, tempText)); + index++; + } + i++; + } + // All remaining time should go to the last paragraph. + if (_animation.Count > 0) + { + _animation[_animation.Count - 1].EndTime.TotalMilliseconds = _paragraph.EndTime.TotalMilliseconds; + } + } + + private void Timer1Tick(object sender, EventArgs e) + { + _timerCount += timer1.Interval; + + string s = GetText(_timerCount, _animation); + ClearPreview(); + AddToPreview(richTextBoxPreview, s); + RefreshPreview(); + + if (_timerCount > _paragraph.EndTime.TotalMilliseconds) + { + timer1.Stop(); + System.Threading.Thread.Sleep(200); + ClearPreview(); + AddToPreview(richTextBoxPreview, _paragraph.Text); + } + } + + private static string GetText(int milliseconds, IEnumerable animation) + { + foreach (Paragraph p in animation) + { + if (p.StartTime.TotalMilliseconds <= milliseconds && + p.EndTime.TotalMilliseconds >= milliseconds) + { + return p.Text; + } + } + return string.Empty; + } + + private void ButtonOkClick(object sender, EventArgs e) + { + MakeAnimation(); + DialogResult = DialogResult.OK; + } + + public static bool IsTagFollowIndex(string text, int index) + { + string tag; + // , , , + if (text.Length >= index + 7) + { + tag = text.Substring(index, 7); + if (tag.StartsWith("= index + 3) + { + tag = text.Substring(index, 3); + int idx = 1; + if ((tag[2] == '>' || tag[idx++] == '/') && (tag[idx] == 'i' || tag[idx] == 'I' || tag[idx] == 'b' || tag[idx] == 'B' || tag[idx] == 'u' || tag[idx] == 'U')) + { + return true; + } + } + return false; + } + } +} diff --git a/src/Forms/EffectKaraoke.resx b/src/ui/Forms/EffectKaraoke.resx similarity index 97% rename from src/Forms/EffectKaraoke.resx rename to src/ui/Forms/EffectKaraoke.resx index e35a5f29c..296ac3e67 100644 --- a/src/Forms/EffectKaraoke.resx +++ b/src/ui/Forms/EffectKaraoke.resx @@ -1,126 +1,126 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - 130, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 130, 17 + \ No newline at end of file diff --git a/src/Forms/EffectTypewriter.Designer.cs b/src/ui/Forms/EffectTypewriter.Designer.cs similarity index 97% rename from src/Forms/EffectTypewriter.Designer.cs rename to src/ui/Forms/EffectTypewriter.Designer.cs index 3e50699f4..3e244a967 100644 --- a/src/Forms/EffectTypewriter.Designer.cs +++ b/src/ui/Forms/EffectTypewriter.Designer.cs @@ -1,182 +1,182 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class EffectTypewriter - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.buttonPreview = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.timer1 = new System.Windows.Forms.Timer(this.components); - this.labelEndDelay = new System.Windows.Forms.Label(); - this.numericUpDownDelay = new System.Windows.Forms.NumericUpDown(); - this.labelTM = new System.Windows.Forms.Label(); - this.labelTotalMilliseconds = new System.Windows.Forms.Label(); - this.richTextBoxPreview = new System.Windows.Forms.RichTextBox(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDelay)).BeginInit(); - this.SuspendLayout(); - // - // buttonPreview - // - this.buttonPreview.Location = new System.Drawing.Point(12, 119); - this.buttonPreview.Name = "buttonPreview"; - this.buttonPreview.Size = new System.Drawing.Size(100, 23); - this.buttonPreview.TabIndex = 26; - this.buttonPreview.Text = "Preview"; - this.buttonPreview.UseVisualStyleBackColor = true; - this.buttonPreview.Click += new System.EventHandler(this.ButtonPreviewClick); - // - // buttonOK - // - this.buttonOK.Location = new System.Drawing.Point(265, 144); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 30; - this.buttonOK.Text = "OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); - // - // buttonCancel - // - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.Location = new System.Drawing.Point(346, 144); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 31; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - // - // timer1 - // - this.timer1.Tick += new System.EventHandler(this.Timer1Tick); - // - // labelEndDelay - // - this.labelEndDelay.Location = new System.Drawing.Point(5, 45); - this.labelEndDelay.Name = "labelEndDelay"; - this.labelEndDelay.Size = new System.Drawing.Size(161, 19); - this.labelEndDelay.TabIndex = 32; - this.labelEndDelay.Text = "End delay in milliseconds:"; - this.labelEndDelay.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // numericUpDownDelay - // - this.numericUpDownDelay.DecimalPlaces = 3; - this.numericUpDownDelay.Increment = new decimal(new int[] { - 1, - 0, - 0, - 65536}); - this.numericUpDownDelay.Location = new System.Drawing.Point(169, 43); - this.numericUpDownDelay.Maximum = new decimal(new int[] { - 99999, - 0, - 0, - 0}); - this.numericUpDownDelay.Minimum = new decimal(new int[] { - 99999, - 0, - 0, - -2147483648}); - this.numericUpDownDelay.Name = "numericUpDownDelay"; - this.numericUpDownDelay.Size = new System.Drawing.Size(54, 21); - this.numericUpDownDelay.TabIndex = 35; - // - // labelTM - // - this.labelTM.Location = new System.Drawing.Point(2, 23); - this.labelTM.Name = "labelTM"; - this.labelTM.Size = new System.Drawing.Size(164, 13); - this.labelTM.TabIndex = 36; - this.labelTM.Text = "Total milliseconds:"; - this.labelTM.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // labelTotalMilliseconds - // - this.labelTotalMilliseconds.AutoSize = true; - this.labelTotalMilliseconds.Location = new System.Drawing.Point(169, 23); - this.labelTotalMilliseconds.Name = "labelTotalMilliseconds"; - this.labelTotalMilliseconds.Size = new System.Drawing.Size(108, 13); - this.labelTotalMilliseconds.TabIndex = 37; - this.labelTotalMilliseconds.Text = "labelTotalMilliseconds"; - // - // richTextBoxPreview - // - this.richTextBoxPreview.BackColor = System.Drawing.Color.Black; - this.richTextBoxPreview.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.richTextBoxPreview.DetectUrls = false; - this.richTextBoxPreview.Location = new System.Drawing.Point(12, 69); - this.richTextBoxPreview.Name = "richTextBoxPreview"; - this.richTextBoxPreview.ReadOnly = true; - this.richTextBoxPreview.Size = new System.Drawing.Size(409, 44); - this.richTextBoxPreview.TabIndex = 51; - this.richTextBoxPreview.TabStop = false; - this.richTextBoxPreview.Text = ""; - // - // EffectTypewriter - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(433, 179); - this.Controls.Add(this.richTextBoxPreview); - this.Controls.Add(this.labelTotalMilliseconds); - this.Controls.Add(this.labelTM); - this.Controls.Add(this.numericUpDownDelay); - this.Controls.Add(this.labelEndDelay); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.buttonPreview); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "EffectTypewriter"; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Typewriter effect"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormEffectTypewriter_KeyDown); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDelay)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button buttonPreview; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Timer timer1; - private System.Windows.Forms.Label labelEndDelay; - private System.Windows.Forms.NumericUpDown numericUpDownDelay; - private System.Windows.Forms.Label labelTM; - private System.Windows.Forms.Label labelTotalMilliseconds; - private System.Windows.Forms.RichTextBox richTextBoxPreview; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class EffectTypewriter + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.buttonPreview = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.labelEndDelay = new System.Windows.Forms.Label(); + this.numericUpDownDelay = new System.Windows.Forms.NumericUpDown(); + this.labelTM = new System.Windows.Forms.Label(); + this.labelTotalMilliseconds = new System.Windows.Forms.Label(); + this.richTextBoxPreview = new System.Windows.Forms.RichTextBox(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDelay)).BeginInit(); + this.SuspendLayout(); + // + // buttonPreview + // + this.buttonPreview.Location = new System.Drawing.Point(12, 119); + this.buttonPreview.Name = "buttonPreview"; + this.buttonPreview.Size = new System.Drawing.Size(100, 23); + this.buttonPreview.TabIndex = 26; + this.buttonPreview.Text = "Preview"; + this.buttonPreview.UseVisualStyleBackColor = true; + this.buttonPreview.Click += new System.EventHandler(this.ButtonPreviewClick); + // + // buttonOK + // + this.buttonOK.Location = new System.Drawing.Point(265, 144); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 30; + this.buttonOK.Text = "OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); + // + // buttonCancel + // + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.Location = new System.Drawing.Point(346, 144); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 31; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + // + // timer1 + // + this.timer1.Tick += new System.EventHandler(this.Timer1Tick); + // + // labelEndDelay + // + this.labelEndDelay.Location = new System.Drawing.Point(5, 45); + this.labelEndDelay.Name = "labelEndDelay"; + this.labelEndDelay.Size = new System.Drawing.Size(161, 19); + this.labelEndDelay.TabIndex = 32; + this.labelEndDelay.Text = "End delay in milliseconds:"; + this.labelEndDelay.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // numericUpDownDelay + // + this.numericUpDownDelay.DecimalPlaces = 3; + this.numericUpDownDelay.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.numericUpDownDelay.Location = new System.Drawing.Point(169, 43); + this.numericUpDownDelay.Maximum = new decimal(new int[] { + 99999, + 0, + 0, + 0}); + this.numericUpDownDelay.Minimum = new decimal(new int[] { + 99999, + 0, + 0, + -2147483648}); + this.numericUpDownDelay.Name = "numericUpDownDelay"; + this.numericUpDownDelay.Size = new System.Drawing.Size(54, 21); + this.numericUpDownDelay.TabIndex = 35; + // + // labelTM + // + this.labelTM.Location = new System.Drawing.Point(2, 23); + this.labelTM.Name = "labelTM"; + this.labelTM.Size = new System.Drawing.Size(164, 13); + this.labelTM.TabIndex = 36; + this.labelTM.Text = "Total milliseconds:"; + this.labelTM.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // labelTotalMilliseconds + // + this.labelTotalMilliseconds.AutoSize = true; + this.labelTotalMilliseconds.Location = new System.Drawing.Point(169, 23); + this.labelTotalMilliseconds.Name = "labelTotalMilliseconds"; + this.labelTotalMilliseconds.Size = new System.Drawing.Size(108, 13); + this.labelTotalMilliseconds.TabIndex = 37; + this.labelTotalMilliseconds.Text = "labelTotalMilliseconds"; + // + // richTextBoxPreview + // + this.richTextBoxPreview.BackColor = System.Drawing.Color.Black; + this.richTextBoxPreview.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.richTextBoxPreview.DetectUrls = false; + this.richTextBoxPreview.Location = new System.Drawing.Point(12, 69); + this.richTextBoxPreview.Name = "richTextBoxPreview"; + this.richTextBoxPreview.ReadOnly = true; + this.richTextBoxPreview.Size = new System.Drawing.Size(409, 44); + this.richTextBoxPreview.TabIndex = 51; + this.richTextBoxPreview.TabStop = false; + this.richTextBoxPreview.Text = ""; + // + // EffectTypewriter + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(433, 179); + this.Controls.Add(this.richTextBoxPreview); + this.Controls.Add(this.labelTotalMilliseconds); + this.Controls.Add(this.labelTM); + this.Controls.Add(this.numericUpDownDelay); + this.Controls.Add(this.labelEndDelay); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.buttonPreview); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "EffectTypewriter"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Typewriter effect"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormEffectTypewriter_KeyDown); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDelay)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonPreview; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Timer timer1; + private System.Windows.Forms.Label labelEndDelay; + private System.Windows.Forms.NumericUpDown numericUpDownDelay; + private System.Windows.Forms.Label labelTM; + private System.Windows.Forms.Label labelTotalMilliseconds; + private System.Windows.Forms.RichTextBox richTextBoxPreview; + } } \ No newline at end of file diff --git a/src/Forms/EffectTypewriter.cs b/src/ui/Forms/EffectTypewriter.cs similarity index 97% rename from src/Forms/EffectTypewriter.cs rename to src/ui/Forms/EffectTypewriter.cs index 36bb77111..e2865c77d 100644 --- a/src/Forms/EffectTypewriter.cs +++ b/src/ui/Forms/EffectTypewriter.cs @@ -1,408 +1,408 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Text; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class EffectTypewriter : Form - { - private Paragraph _paragraph; - private int _timerCount; - - public EffectTypewriter() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - Text = Configuration.Settings.Language.EffectTypewriter.Title; - labelTM.Text = Configuration.Settings.Language.EffectTypewriter.TotalMilliseconds; - labelEndDelay.Text = Configuration.Settings.Language.EffectTypewriter.EndDelayInMilliseconds; - buttonPreview.Text = Configuration.Settings.Language.General.Preview; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - UiUtil.FixLargeFonts(this, buttonOK); - } - - public List TypewriterParagraphs { get; private set; } - - private void FormEffectTypewriter_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - internal void Initialize(Paragraph paragraph) - { - _paragraph = paragraph; - - AddToPreview(richTextBoxPreview, paragraph.Text); - RefreshPreview(); - - labelTotalMilliseconds.Text = $"{paragraph.Duration.TotalMilliseconds / TimeCode.BaseUnit:#,##0.000}"; - numericUpDownDelay.Maximum = (decimal)((paragraph.Duration.TotalMilliseconds - 500) / TimeCode.BaseUnit); - numericUpDownDelay.Minimum = 0; - - numericUpDownDelay.Left = labelEndDelay.Left + labelEndDelay.Width + 5; - } - - private List _colorList; - private List _fontList; - - private void AddToPreview(RichTextBox rtb, string text) - { - richTextBoxPreview.ForeColor = Color.White; - _colorList = new List(); - _fontList = new List(); - - int bold = 0; - int underline = 0; - int italic = 0; - var fontColors = new Stack(); - string currentColor = string.Empty; - - var sb = new StringBuilder(); - int i = 0; - while (i < text.Length) - { - if (text[i] == '<') - { - AddTextToRichTextBox(rtb, bold > 0, italic > 0, underline > 0, currentColor, sb.ToString()); - sb.Clear(); - string tag = GetTag(text.Substring(i).ToLowerInvariant()); - if (i + 1 < text.Length && text[i + 1] == '/') - { - if (tag == "" && italic > 0) - { - italic--; - } - else if (tag == "" && bold > 0) - { - bold--; - } - else if (tag == "" && underline > 0) - { - underline--; - } - else if (tag == "") - { - currentColor = fontColors.Count > 0 ? fontColors.Pop() : string.Empty; - } - } - else - { - if (tag == "") - { - italic++; - } - else if (tag == "") - { - bold++; - } - else if (tag == "") - { - underline++; - } - else if (tag.StartsWith(" 0) - { - AddTextToRichTextBox(rtb, bold > 0, italic > 0, underline > 0, currentColor, sb.ToString()); - } - - foreach (var fontEntry in _fontList) - { - rtb.SelectionStart = fontEntry.Start; - rtb.SelectionLength = fontEntry.Length; - rtb.SelectionFont = fontEntry.Font; - rtb.DeselectAll(); - } - - foreach (var colorEntry in _colorList) - { - rtb.SelectionStart = colorEntry.Start; - rtb.SelectionLength = colorEntry.Length; - rtb.SelectionColor = colorEntry.Color; - rtb.DeselectAll(); - } - } - - private void AddTextToRichTextBox(RichTextBox rtb, bool bold, bool italic, bool underline, string color, string text) - { - if (text.Length > 0) - { - int length = rtb.Text.Length; - richTextBoxPreview.Text += text; - - var c = Color.White; - if (!string.IsNullOrWhiteSpace(color)) - { - try - { - c = ColorTranslator.FromHtml(color); - } - catch - { - try - { - c = ColorTranslator.FromHtml("#" + color.Trim('#', ' ', '"', '\'')); - } - catch - { - c = Color.White; - } - } - } - - _colorList.Add(new EffectKaraoke.ColorEntry { Start = length, Length = text.Length, Color = c }); - - var fontStyle = new FontStyle(); - if (underline) - { - fontStyle |= FontStyle.Underline; - } - - if (italic) - { - fontStyle |= FontStyle.Italic; - } - - if (bold) - { - fontStyle |= FontStyle.Bold; - } - - _fontList.Add(new EffectKaraoke.FontEntry { Start = length, Length = text.Length, Font = new Font(rtb.Font.FontFamily, rtb.Font.Size, fontStyle) }); - } - } - - private static string GetTag(string text) - { - var sb = new StringBuilder(); - for (int i = 0; i < text.Length; i++) - { - sb.Append(text[i]); - if (text[i] == '>') - { - return sb.ToString(); - } - } - return sb.ToString(); - } - - private void ClearPreview() - { - richTextBoxPreview.Text = string.Empty; - } - - private void RefreshPreview() - { - richTextBoxPreview.SelectAll(); - richTextBoxPreview.SelectionAlignment = HorizontalAlignment.Center; - richTextBoxPreview.Refresh(); - } - - private void ButtonPreviewClick(object sender, EventArgs e) - { - MakeAnimation(); - PlayAnimation(); - } - - private void PlayAnimation() - { - _timerCount = (int)_paragraph.StartTime.TotalMilliseconds; - timer1.Start(); - } - - private static double CalculateStepLength(string text, double duration) - { - if (text.StartsWith("{\\", StringComparison.Ordinal) && text.IndexOf('}') > 2) - { - int i = 0; - while (i < text.Length && - text.Substring(i).StartsWith("{\\", StringComparison.Ordinal) && - text.Substring(i).IndexOf('}', i) > 2) - { - int idx = text.IndexOf('}', i); - i = idx + 1; - } - text = text.Remove(0, i); - } - - text = HtmlUtil.RemoveHtmlTags(text); - return duration / text.Length; - } - - public void MakeAnimation() - { - TypewriterParagraphs = new List(); - double duration = _paragraph.Duration.TotalMilliseconds - (double)numericUpDownDelay.Value * TimeCode.BaseUnit; - double stepsLength = CalculateStepLength(_paragraph.Text, duration); - - double startMilliseconds; - double endMilliseconds; - TimeCode start; - TimeCode end; - int index = 0; - string text = string.Empty; - bool tagOn = false; - string tag = string.Empty; - int i = 0; - string beforeEndTag = string.Empty; - string alignment = string.Empty; - while (i < _paragraph.Text.Length) - { - if (i == 0 && _paragraph.Text.StartsWith("{\\", StringComparison.Ordinal) && _paragraph.Text.IndexOf('}') > 2) - { - int j = i; - while (j < _paragraph.Text.Length && - _paragraph.Text.Substring(j).StartsWith("{\\", StringComparison.Ordinal) && - _paragraph.Text.Substring(j).IndexOf('}', j) > 2) - { - int idx = _paragraph.Text.IndexOf('}', j); - i = idx; - j = i + 1; - } - alignment = _paragraph.Text.Substring(0, j); - } - else if (tagOn) - { - tag += _paragraph.Text[i]; - if (_paragraph.Text[i] == '>') - { - tagOn = false; - if (tag.StartsWith("") - { - beforeEndTag = ""; - } - else if (tag == "") - { - beforeEndTag = ""; - } - else if (tag == "") - { - beforeEndTag = ""; - } - } - } - else if (_paragraph.Text[i] == '<') - { - tagOn = true; - tag += _paragraph.Text[i]; - beforeEndTag = string.Empty; - } - else - { - text += tag + _paragraph.Text[i]; - tag = string.Empty; - - startMilliseconds = index * stepsLength; - startMilliseconds += _paragraph.StartTime.TotalMilliseconds; - endMilliseconds = (index + 1) * stepsLength - 1; - endMilliseconds += _paragraph.StartTime.TotalMilliseconds; - start = new TimeCode(startMilliseconds); - end = new TimeCode(endMilliseconds); - TypewriterParagraphs.Add(new Paragraph(start, end, alignment + text + beforeEndTag) { Extra = _paragraph.Extra }); - index++; - } - i++; - } - - if (numericUpDownDelay.Value > 0) - { - startMilliseconds = index * stepsLength; - startMilliseconds += _paragraph.StartTime.TotalMilliseconds; - endMilliseconds = _paragraph.EndTime.TotalMilliseconds; - start = new TimeCode(startMilliseconds); - end = new TimeCode(endMilliseconds); - TypewriterParagraphs.Add(new Paragraph(start, end, _paragraph.Text) { Extra = _paragraph.Extra }); - } - else if (TypewriterParagraphs.Count > 0) - { - TypewriterParagraphs[TypewriterParagraphs.Count - 1].EndTime.TotalMilliseconds = _paragraph.EndTime.TotalMilliseconds; - } - } - - private void Timer1Tick(object sender, EventArgs e) - { - _timerCount += timer1.Interval; - - string s = GetText(_timerCount, TypewriterParagraphs); - ClearPreview(); - AddToPreview(richTextBoxPreview, s); - RefreshPreview(); - - if (_timerCount > _paragraph.EndTime.TotalMilliseconds) - { - timer1.Stop(); - System.Threading.Thread.Sleep(200); - ClearPreview(); - AddToPreview(richTextBoxPreview, _paragraph.Text); - } - } - - private static string GetText(int milliseconds, IEnumerable animation) - { - foreach (Paragraph p in animation) - { - if (p.StartTime.TotalMilliseconds <= milliseconds && - p.EndTime.TotalMilliseconds >= milliseconds) - { - return p.Text; - } - } - return string.Empty; - } - - private void ButtonOkClick(object sender, EventArgs e) - { - MakeAnimation(); - DialogResult = DialogResult.OK; - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class EffectTypewriter : Form + { + private Paragraph _paragraph; + private int _timerCount; + + public EffectTypewriter() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + Text = Configuration.Settings.Language.EffectTypewriter.Title; + labelTM.Text = Configuration.Settings.Language.EffectTypewriter.TotalMilliseconds; + labelEndDelay.Text = Configuration.Settings.Language.EffectTypewriter.EndDelayInMilliseconds; + buttonPreview.Text = Configuration.Settings.Language.General.Preview; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + UiUtil.FixLargeFonts(this, buttonOK); + } + + public List TypewriterParagraphs { get; private set; } + + private void FormEffectTypewriter_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + internal void Initialize(Paragraph paragraph) + { + _paragraph = paragraph; + + AddToPreview(richTextBoxPreview, paragraph.Text); + RefreshPreview(); + + labelTotalMilliseconds.Text = $"{paragraph.Duration.TotalMilliseconds / TimeCode.BaseUnit:#,##0.000}"; + numericUpDownDelay.Maximum = (decimal)((paragraph.Duration.TotalMilliseconds - 500) / TimeCode.BaseUnit); + numericUpDownDelay.Minimum = 0; + + numericUpDownDelay.Left = labelEndDelay.Left + labelEndDelay.Width + 5; + } + + private List _colorList; + private List _fontList; + + private void AddToPreview(RichTextBox rtb, string text) + { + richTextBoxPreview.ForeColor = Color.White; + _colorList = new List(); + _fontList = new List(); + + int bold = 0; + int underline = 0; + int italic = 0; + var fontColors = new Stack(); + string currentColor = string.Empty; + + var sb = new StringBuilder(); + int i = 0; + while (i < text.Length) + { + if (text[i] == '<') + { + AddTextToRichTextBox(rtb, bold > 0, italic > 0, underline > 0, currentColor, sb.ToString()); + sb.Clear(); + string tag = GetTag(text.Substring(i).ToLowerInvariant()); + if (i + 1 < text.Length && text[i + 1] == '/') + { + if (tag == "
" && italic > 0) + { + italic--; + } + else if (tag == "" && bold > 0) + { + bold--; + } + else if (tag == "" && underline > 0) + { + underline--; + } + else if (tag == "") + { + currentColor = fontColors.Count > 0 ? fontColors.Pop() : string.Empty; + } + } + else + { + if (tag == "") + { + italic++; + } + else if (tag == "") + { + bold++; + } + else if (tag == "") + { + underline++; + } + else if (tag.StartsWith(" 0) + { + AddTextToRichTextBox(rtb, bold > 0, italic > 0, underline > 0, currentColor, sb.ToString()); + } + + foreach (var fontEntry in _fontList) + { + rtb.SelectionStart = fontEntry.Start; + rtb.SelectionLength = fontEntry.Length; + rtb.SelectionFont = fontEntry.Font; + rtb.DeselectAll(); + } + + foreach (var colorEntry in _colorList) + { + rtb.SelectionStart = colorEntry.Start; + rtb.SelectionLength = colorEntry.Length; + rtb.SelectionColor = colorEntry.Color; + rtb.DeselectAll(); + } + } + + private void AddTextToRichTextBox(RichTextBox rtb, bool bold, bool italic, bool underline, string color, string text) + { + if (text.Length > 0) + { + int length = rtb.Text.Length; + richTextBoxPreview.Text += text; + + var c = Color.White; + if (!string.IsNullOrWhiteSpace(color)) + { + try + { + c = ColorTranslator.FromHtml(color); + } + catch + { + try + { + c = ColorTranslator.FromHtml("#" + color.Trim('#', ' ', '"', '\'')); + } + catch + { + c = Color.White; + } + } + } + + _colorList.Add(new EffectKaraoke.ColorEntry { Start = length, Length = text.Length, Color = c }); + + var fontStyle = new FontStyle(); + if (underline) + { + fontStyle |= FontStyle.Underline; + } + + if (italic) + { + fontStyle |= FontStyle.Italic; + } + + if (bold) + { + fontStyle |= FontStyle.Bold; + } + + _fontList.Add(new EffectKaraoke.FontEntry { Start = length, Length = text.Length, Font = new Font(rtb.Font.FontFamily, rtb.Font.Size, fontStyle) }); + } + } + + private static string GetTag(string text) + { + var sb = new StringBuilder(); + for (int i = 0; i < text.Length; i++) + { + sb.Append(text[i]); + if (text[i] == '>') + { + return sb.ToString(); + } + } + return sb.ToString(); + } + + private void ClearPreview() + { + richTextBoxPreview.Text = string.Empty; + } + + private void RefreshPreview() + { + richTextBoxPreview.SelectAll(); + richTextBoxPreview.SelectionAlignment = HorizontalAlignment.Center; + richTextBoxPreview.Refresh(); + } + + private void ButtonPreviewClick(object sender, EventArgs e) + { + MakeAnimation(); + PlayAnimation(); + } + + private void PlayAnimation() + { + _timerCount = (int)_paragraph.StartTime.TotalMilliseconds; + timer1.Start(); + } + + private static double CalculateStepLength(string text, double duration) + { + if (text.StartsWith("{\\", StringComparison.Ordinal) && text.IndexOf('}') > 2) + { + int i = 0; + while (i < text.Length && + text.Substring(i).StartsWith("{\\", StringComparison.Ordinal) && + text.Substring(i).IndexOf('}', i) > 2) + { + int idx = text.IndexOf('}', i); + i = idx + 1; + } + text = text.Remove(0, i); + } + + text = HtmlUtil.RemoveHtmlTags(text); + return duration / text.Length; + } + + public void MakeAnimation() + { + TypewriterParagraphs = new List(); + double duration = _paragraph.Duration.TotalMilliseconds - (double)numericUpDownDelay.Value * TimeCode.BaseUnit; + double stepsLength = CalculateStepLength(_paragraph.Text, duration); + + double startMilliseconds; + double endMilliseconds; + TimeCode start; + TimeCode end; + int index = 0; + string text = string.Empty; + bool tagOn = false; + string tag = string.Empty; + int i = 0; + string beforeEndTag = string.Empty; + string alignment = string.Empty; + while (i < _paragraph.Text.Length) + { + if (i == 0 && _paragraph.Text.StartsWith("{\\", StringComparison.Ordinal) && _paragraph.Text.IndexOf('}') > 2) + { + int j = i; + while (j < _paragraph.Text.Length && + _paragraph.Text.Substring(j).StartsWith("{\\", StringComparison.Ordinal) && + _paragraph.Text.Substring(j).IndexOf('}', j) > 2) + { + int idx = _paragraph.Text.IndexOf('}', j); + i = idx; + j = i + 1; + } + alignment = _paragraph.Text.Substring(0, j); + } + else if (tagOn) + { + tag += _paragraph.Text[i]; + if (_paragraph.Text[i] == '>') + { + tagOn = false; + if (tag.StartsWith("") + { + beforeEndTag = ""; + } + else if (tag == "") + { + beforeEndTag = ""; + } + else if (tag == "") + { + beforeEndTag = ""; + } + } + } + else if (_paragraph.Text[i] == '<') + { + tagOn = true; + tag += _paragraph.Text[i]; + beforeEndTag = string.Empty; + } + else + { + text += tag + _paragraph.Text[i]; + tag = string.Empty; + + startMilliseconds = index * stepsLength; + startMilliseconds += _paragraph.StartTime.TotalMilliseconds; + endMilliseconds = (index + 1) * stepsLength - 1; + endMilliseconds += _paragraph.StartTime.TotalMilliseconds; + start = new TimeCode(startMilliseconds); + end = new TimeCode(endMilliseconds); + TypewriterParagraphs.Add(new Paragraph(start, end, alignment + text + beforeEndTag) { Extra = _paragraph.Extra }); + index++; + } + i++; + } + + if (numericUpDownDelay.Value > 0) + { + startMilliseconds = index * stepsLength; + startMilliseconds += _paragraph.StartTime.TotalMilliseconds; + endMilliseconds = _paragraph.EndTime.TotalMilliseconds; + start = new TimeCode(startMilliseconds); + end = new TimeCode(endMilliseconds); + TypewriterParagraphs.Add(new Paragraph(start, end, _paragraph.Text) { Extra = _paragraph.Extra }); + } + else if (TypewriterParagraphs.Count > 0) + { + TypewriterParagraphs[TypewriterParagraphs.Count - 1].EndTime.TotalMilliseconds = _paragraph.EndTime.TotalMilliseconds; + } + } + + private void Timer1Tick(object sender, EventArgs e) + { + _timerCount += timer1.Interval; + + string s = GetText(_timerCount, TypewriterParagraphs); + ClearPreview(); + AddToPreview(richTextBoxPreview, s); + RefreshPreview(); + + if (_timerCount > _paragraph.EndTime.TotalMilliseconds) + { + timer1.Stop(); + System.Threading.Thread.Sleep(200); + ClearPreview(); + AddToPreview(richTextBoxPreview, _paragraph.Text); + } + } + + private static string GetText(int milliseconds, IEnumerable animation) + { + foreach (Paragraph p in animation) + { + if (p.StartTime.TotalMilliseconds <= milliseconds && + p.EndTime.TotalMilliseconds >= milliseconds) + { + return p.Text; + } + } + return string.Empty; + } + + private void ButtonOkClick(object sender, EventArgs e) + { + MakeAnimation(); + DialogResult = DialogResult.OK; + } + + } +} diff --git a/src/Forms/EffectTypewriter.resx b/src/ui/Forms/EffectTypewriter.resx similarity index 97% rename from src/Forms/EffectTypewriter.resx rename to src/ui/Forms/EffectTypewriter.resx index 5fce07d17..cde41baac 100644 --- a/src/Forms/EffectTypewriter.resx +++ b/src/ui/Forms/EffectTypewriter.resx @@ -1,123 +1,123 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 130, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 130, 17 + \ No newline at end of file diff --git a/src/Forms/ExportCustomText.Designer.cs b/src/ui/Forms/ExportCustomText.Designer.cs similarity index 98% rename from src/Forms/ExportCustomText.Designer.cs rename to src/ui/Forms/ExportCustomText.Designer.cs index f290d6ace..bd75ae7af 100644 --- a/src/Forms/ExportCustomText.Designer.cs +++ b/src/ui/Forms/ExportCustomText.Designer.cs @@ -1,296 +1,296 @@ -namespace Nikse.SubtitleEdit.Forms -{ - partial class ExportCustomText - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.listViewTemplates = new System.Windows.Forms.ListView(); - this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); - this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator(); - this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.groupBoxFormats = new System.Windows.Forms.GroupBox(); - this.buttonDelete = new System.Windows.Forms.Button(); - this.buttonEdit = new System.Windows.Forms.Button(); - this.buttonNew = new System.Windows.Forms.Button(); - this.textBoxPreview = new System.Windows.Forms.TextBox(); - this.groupBoxPreview = new System.Windows.Forms.GroupBox(); - this.labelEncoding = new System.Windows.Forms.Label(); - this.comboBoxEncoding = new System.Windows.Forms.ComboBox(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonSave = new System.Windows.Forms.Button(); - this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog(); - this.contextMenuStrip1.SuspendLayout(); - this.groupBoxFormats.SuspendLayout(); - this.groupBoxPreview.SuspendLayout(); - this.SuspendLayout(); - // - // listViewTemplates - // - this.listViewTemplates.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.listViewTemplates.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeader1, - this.columnHeader2}); - this.listViewTemplates.ContextMenuStrip = this.contextMenuStrip1; - this.listViewTemplates.FullRowSelect = true; - this.listViewTemplates.HideSelection = false; - this.listViewTemplates.Location = new System.Drawing.Point(6, 23); - this.listViewTemplates.MultiSelect = false; - this.listViewTemplates.Name = "listViewTemplates"; - this.listViewTemplates.Size = new System.Drawing.Size(450, 310); - this.listViewTemplates.TabIndex = 0; - this.listViewTemplates.UseCompatibleStateImageBehavior = false; - this.listViewTemplates.View = System.Windows.Forms.View.Details; - this.listViewTemplates.SelectedIndexChanged += new System.EventHandler(this.listViewTemplates_SelectedIndexChanged); - this.listViewTemplates.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.listViewTemplates_MouseDoubleClick); - // - // columnHeader1 - // - this.columnHeader1.Text = "Name"; - this.columnHeader1.Width = 120; - // - // columnHeader2 - // - this.columnHeader2.Text = "Text"; - this.columnHeader2.Width = 326; - // - // contextMenuStrip1 - // - this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.editToolStripMenuItem, - this.deleteToolStripMenuItem, - this.toolStripMenuItem2, - this.newToolStripMenuItem}); - this.contextMenuStrip1.Name = "contextMenuStrip1"; - this.contextMenuStrip1.Size = new System.Drawing.Size(108, 76); - this.contextMenuStrip1.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStrip1_Opening); - // - // editToolStripMenuItem - // - this.editToolStripMenuItem.Name = "editToolStripMenuItem"; - this.editToolStripMenuItem.Size = new System.Drawing.Size(107, 22); - this.editToolStripMenuItem.Text = "Edit"; - this.editToolStripMenuItem.Click += new System.EventHandler(this.editToolStripMenuItem_Click); - // - // deleteToolStripMenuItem - // - this.deleteToolStripMenuItem.Name = "deleteToolStripMenuItem"; - this.deleteToolStripMenuItem.Size = new System.Drawing.Size(107, 22); - this.deleteToolStripMenuItem.Text = "Delete"; - this.deleteToolStripMenuItem.Click += new System.EventHandler(this.deleteToolStripMenuItem_Click); - // - // toolStripMenuItem2 - // - this.toolStripMenuItem2.Name = "toolStripMenuItem2"; - this.toolStripMenuItem2.Size = new System.Drawing.Size(104, 6); - // - // newToolStripMenuItem - // - this.newToolStripMenuItem.Name = "newToolStripMenuItem"; - this.newToolStripMenuItem.Size = new System.Drawing.Size(107, 22); - this.newToolStripMenuItem.Text = "New"; - this.newToolStripMenuItem.Click += new System.EventHandler(this.newToolStripMenuItem_Click); - // - // groupBoxFormats - // - this.groupBoxFormats.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left))); - this.groupBoxFormats.Controls.Add(this.buttonDelete); - this.groupBoxFormats.Controls.Add(this.buttonEdit); - this.groupBoxFormats.Controls.Add(this.buttonNew); - this.groupBoxFormats.Controls.Add(this.listViewTemplates); - this.groupBoxFormats.Location = new System.Drawing.Point(12, 12); - this.groupBoxFormats.Name = "groupBoxFormats"; - this.groupBoxFormats.Size = new System.Drawing.Size(462, 366); - this.groupBoxFormats.TabIndex = 0; - this.groupBoxFormats.TabStop = false; - this.groupBoxFormats.Text = "Formats"; - // - // buttonDelete - // - this.buttonDelete.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonDelete.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonDelete.Location = new System.Drawing.Point(216, 339); - this.buttonDelete.Name = "buttonDelete"; - this.buttonDelete.Size = new System.Drawing.Size(117, 23); - this.buttonDelete.TabIndex = 2; - this.buttonDelete.Text = "Delete"; - this.buttonDelete.UseVisualStyleBackColor = true; - this.buttonDelete.Click += new System.EventHandler(this.buttonDelete_Click); - // - // buttonEdit - // - this.buttonEdit.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonEdit.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonEdit.Location = new System.Drawing.Point(93, 339); - this.buttonEdit.Name = "buttonEdit"; - this.buttonEdit.Size = new System.Drawing.Size(117, 23); - this.buttonEdit.TabIndex = 1; - this.buttonEdit.Text = "&Edit"; - this.buttonEdit.UseVisualStyleBackColor = true; - this.buttonEdit.Click += new System.EventHandler(this.buttonEdit_Click); - // - // buttonNew - // - this.buttonNew.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonNew.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonNew.Location = new System.Drawing.Point(339, 339); - this.buttonNew.Name = "buttonNew"; - this.buttonNew.Size = new System.Drawing.Size(117, 23); - this.buttonNew.TabIndex = 3; - this.buttonNew.Text = "&New"; - this.buttonNew.UseVisualStyleBackColor = true; - this.buttonNew.Click += new System.EventHandler(this.buttonNew_Click); - // - // textBoxPreview - // - this.textBoxPreview.Dock = System.Windows.Forms.DockStyle.Fill; - this.textBoxPreview.Location = new System.Drawing.Point(3, 16); - this.textBoxPreview.Multiline = true; - this.textBoxPreview.Name = "textBoxPreview"; - this.textBoxPreview.ReadOnly = true; - this.textBoxPreview.ScrollBars = System.Windows.Forms.ScrollBars.Both; - this.textBoxPreview.Size = new System.Drawing.Size(445, 346); - this.textBoxPreview.TabIndex = 0; - this.textBoxPreview.KeyDown += new System.Windows.Forms.KeyEventHandler(this.textBoxPreview_KeyDown); - // - // groupBoxPreview - // - this.groupBoxPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxPreview.Controls.Add(this.textBoxPreview); - this.groupBoxPreview.Location = new System.Drawing.Point(480, 13); - this.groupBoxPreview.Name = "groupBoxPreview"; - this.groupBoxPreview.Size = new System.Drawing.Size(451, 365); - this.groupBoxPreview.TabIndex = 1; - this.groupBoxPreview.TabStop = false; - this.groupBoxPreview.Text = "Preview"; - // - // labelEncoding - // - this.labelEncoding.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.labelEncoding.AutoSize = true; - this.labelEncoding.Location = new System.Drawing.Point(482, 415); - this.labelEncoding.Name = "labelEncoding"; - this.labelEncoding.Size = new System.Drawing.Size(52, 13); - this.labelEncoding.TabIndex = 2; - this.labelEncoding.Text = "Encoding"; - // - // comboBoxEncoding - // - this.comboBoxEncoding.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.comboBoxEncoding.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxEncoding.FormattingEnabled = true; - this.comboBoxEncoding.Location = new System.Drawing.Point(540, 411); - this.comboBoxEncoding.Name = "comboBoxEncoding"; - this.comboBoxEncoding.Size = new System.Drawing.Size(183, 21); - this.comboBoxEncoding.TabIndex = 3; - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(852, 410); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 5; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // buttonSave - // - this.buttonSave.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonSave.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonSave.Location = new System.Drawing.Point(729, 410); - this.buttonSave.Name = "buttonSave"; - this.buttonSave.Size = new System.Drawing.Size(117, 23); - this.buttonSave.TabIndex = 4; - this.buttonSave.Text = "&Save as..."; - this.buttonSave.UseVisualStyleBackColor = true; - this.buttonSave.Click += new System.EventHandler(this.buttonSave_Click); - // - // ExportCustomText - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(939, 444); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonSave); - this.Controls.Add(this.labelEncoding); - this.Controls.Add(this.comboBoxEncoding); - this.Controls.Add(this.groupBoxPreview); - this.Controls.Add(this.groupBoxFormats); - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(830, 350); - this.Name = "ExportCustomText"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Export custom text format"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ExportCustomText_KeyDown); - this.contextMenuStrip1.ResumeLayout(false); - this.groupBoxFormats.ResumeLayout(false); - this.groupBoxPreview.ResumeLayout(false); - this.groupBoxPreview.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.ListView listViewTemplates; - private System.Windows.Forms.ColumnHeader columnHeader1; - private System.Windows.Forms.ColumnHeader columnHeader2; - private System.Windows.Forms.GroupBox groupBoxFormats; - private System.Windows.Forms.TextBox textBoxPreview; - private System.Windows.Forms.GroupBox groupBoxPreview; - private System.Windows.Forms.Label labelEncoding; - private System.Windows.Forms.ComboBox comboBoxEncoding; - private System.Windows.Forms.Button buttonNew; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonSave; - private System.Windows.Forms.Button buttonEdit; - private System.Windows.Forms.SaveFileDialog saveFileDialog1; - private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; - private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripMenuItem2; - private System.Windows.Forms.ToolStripMenuItem newToolStripMenuItem; - private System.Windows.Forms.Button buttonDelete; - } +namespace Nikse.SubtitleEdit.Forms +{ + partial class ExportCustomText + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.listViewTemplates = new System.Windows.Forms.ListView(); + this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); + this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator(); + this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.groupBoxFormats = new System.Windows.Forms.GroupBox(); + this.buttonDelete = new System.Windows.Forms.Button(); + this.buttonEdit = new System.Windows.Forms.Button(); + this.buttonNew = new System.Windows.Forms.Button(); + this.textBoxPreview = new System.Windows.Forms.TextBox(); + this.groupBoxPreview = new System.Windows.Forms.GroupBox(); + this.labelEncoding = new System.Windows.Forms.Label(); + this.comboBoxEncoding = new System.Windows.Forms.ComboBox(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonSave = new System.Windows.Forms.Button(); + this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog(); + this.contextMenuStrip1.SuspendLayout(); + this.groupBoxFormats.SuspendLayout(); + this.groupBoxPreview.SuspendLayout(); + this.SuspendLayout(); + // + // listViewTemplates + // + this.listViewTemplates.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listViewTemplates.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader1, + this.columnHeader2}); + this.listViewTemplates.ContextMenuStrip = this.contextMenuStrip1; + this.listViewTemplates.FullRowSelect = true; + this.listViewTemplates.HideSelection = false; + this.listViewTemplates.Location = new System.Drawing.Point(6, 23); + this.listViewTemplates.MultiSelect = false; + this.listViewTemplates.Name = "listViewTemplates"; + this.listViewTemplates.Size = new System.Drawing.Size(450, 310); + this.listViewTemplates.TabIndex = 0; + this.listViewTemplates.UseCompatibleStateImageBehavior = false; + this.listViewTemplates.View = System.Windows.Forms.View.Details; + this.listViewTemplates.SelectedIndexChanged += new System.EventHandler(this.listViewTemplates_SelectedIndexChanged); + this.listViewTemplates.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.listViewTemplates_MouseDoubleClick); + // + // columnHeader1 + // + this.columnHeader1.Text = "Name"; + this.columnHeader1.Width = 120; + // + // columnHeader2 + // + this.columnHeader2.Text = "Text"; + this.columnHeader2.Width = 326; + // + // contextMenuStrip1 + // + this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.editToolStripMenuItem, + this.deleteToolStripMenuItem, + this.toolStripMenuItem2, + this.newToolStripMenuItem}); + this.contextMenuStrip1.Name = "contextMenuStrip1"; + this.contextMenuStrip1.Size = new System.Drawing.Size(108, 76); + this.contextMenuStrip1.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStrip1_Opening); + // + // editToolStripMenuItem + // + this.editToolStripMenuItem.Name = "editToolStripMenuItem"; + this.editToolStripMenuItem.Size = new System.Drawing.Size(107, 22); + this.editToolStripMenuItem.Text = "Edit"; + this.editToolStripMenuItem.Click += new System.EventHandler(this.editToolStripMenuItem_Click); + // + // deleteToolStripMenuItem + // + this.deleteToolStripMenuItem.Name = "deleteToolStripMenuItem"; + this.deleteToolStripMenuItem.Size = new System.Drawing.Size(107, 22); + this.deleteToolStripMenuItem.Text = "Delete"; + this.deleteToolStripMenuItem.Click += new System.EventHandler(this.deleteToolStripMenuItem_Click); + // + // toolStripMenuItem2 + // + this.toolStripMenuItem2.Name = "toolStripMenuItem2"; + this.toolStripMenuItem2.Size = new System.Drawing.Size(104, 6); + // + // newToolStripMenuItem + // + this.newToolStripMenuItem.Name = "newToolStripMenuItem"; + this.newToolStripMenuItem.Size = new System.Drawing.Size(107, 22); + this.newToolStripMenuItem.Text = "New"; + this.newToolStripMenuItem.Click += new System.EventHandler(this.newToolStripMenuItem_Click); + // + // groupBoxFormats + // + this.groupBoxFormats.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.groupBoxFormats.Controls.Add(this.buttonDelete); + this.groupBoxFormats.Controls.Add(this.buttonEdit); + this.groupBoxFormats.Controls.Add(this.buttonNew); + this.groupBoxFormats.Controls.Add(this.listViewTemplates); + this.groupBoxFormats.Location = new System.Drawing.Point(12, 12); + this.groupBoxFormats.Name = "groupBoxFormats"; + this.groupBoxFormats.Size = new System.Drawing.Size(462, 366); + this.groupBoxFormats.TabIndex = 0; + this.groupBoxFormats.TabStop = false; + this.groupBoxFormats.Text = "Formats"; + // + // buttonDelete + // + this.buttonDelete.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonDelete.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonDelete.Location = new System.Drawing.Point(216, 339); + this.buttonDelete.Name = "buttonDelete"; + this.buttonDelete.Size = new System.Drawing.Size(117, 23); + this.buttonDelete.TabIndex = 2; + this.buttonDelete.Text = "Delete"; + this.buttonDelete.UseVisualStyleBackColor = true; + this.buttonDelete.Click += new System.EventHandler(this.buttonDelete_Click); + // + // buttonEdit + // + this.buttonEdit.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonEdit.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonEdit.Location = new System.Drawing.Point(93, 339); + this.buttonEdit.Name = "buttonEdit"; + this.buttonEdit.Size = new System.Drawing.Size(117, 23); + this.buttonEdit.TabIndex = 1; + this.buttonEdit.Text = "&Edit"; + this.buttonEdit.UseVisualStyleBackColor = true; + this.buttonEdit.Click += new System.EventHandler(this.buttonEdit_Click); + // + // buttonNew + // + this.buttonNew.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonNew.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonNew.Location = new System.Drawing.Point(339, 339); + this.buttonNew.Name = "buttonNew"; + this.buttonNew.Size = new System.Drawing.Size(117, 23); + this.buttonNew.TabIndex = 3; + this.buttonNew.Text = "&New"; + this.buttonNew.UseVisualStyleBackColor = true; + this.buttonNew.Click += new System.EventHandler(this.buttonNew_Click); + // + // textBoxPreview + // + this.textBoxPreview.Dock = System.Windows.Forms.DockStyle.Fill; + this.textBoxPreview.Location = new System.Drawing.Point(3, 16); + this.textBoxPreview.Multiline = true; + this.textBoxPreview.Name = "textBoxPreview"; + this.textBoxPreview.ReadOnly = true; + this.textBoxPreview.ScrollBars = System.Windows.Forms.ScrollBars.Both; + this.textBoxPreview.Size = new System.Drawing.Size(445, 346); + this.textBoxPreview.TabIndex = 0; + this.textBoxPreview.KeyDown += new System.Windows.Forms.KeyEventHandler(this.textBoxPreview_KeyDown); + // + // groupBoxPreview + // + this.groupBoxPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxPreview.Controls.Add(this.textBoxPreview); + this.groupBoxPreview.Location = new System.Drawing.Point(480, 13); + this.groupBoxPreview.Name = "groupBoxPreview"; + this.groupBoxPreview.Size = new System.Drawing.Size(451, 365); + this.groupBoxPreview.TabIndex = 1; + this.groupBoxPreview.TabStop = false; + this.groupBoxPreview.Text = "Preview"; + // + // labelEncoding + // + this.labelEncoding.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.labelEncoding.AutoSize = true; + this.labelEncoding.Location = new System.Drawing.Point(482, 415); + this.labelEncoding.Name = "labelEncoding"; + this.labelEncoding.Size = new System.Drawing.Size(52, 13); + this.labelEncoding.TabIndex = 2; + this.labelEncoding.Text = "Encoding"; + // + // comboBoxEncoding + // + this.comboBoxEncoding.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.comboBoxEncoding.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxEncoding.FormattingEnabled = true; + this.comboBoxEncoding.Location = new System.Drawing.Point(540, 411); + this.comboBoxEncoding.Name = "comboBoxEncoding"; + this.comboBoxEncoding.Size = new System.Drawing.Size(183, 21); + this.comboBoxEncoding.TabIndex = 3; + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(852, 410); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 5; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // buttonSave + // + this.buttonSave.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonSave.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonSave.Location = new System.Drawing.Point(729, 410); + this.buttonSave.Name = "buttonSave"; + this.buttonSave.Size = new System.Drawing.Size(117, 23); + this.buttonSave.TabIndex = 4; + this.buttonSave.Text = "&Save as..."; + this.buttonSave.UseVisualStyleBackColor = true; + this.buttonSave.Click += new System.EventHandler(this.buttonSave_Click); + // + // ExportCustomText + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(939, 444); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonSave); + this.Controls.Add(this.labelEncoding); + this.Controls.Add(this.comboBoxEncoding); + this.Controls.Add(this.groupBoxPreview); + this.Controls.Add(this.groupBoxFormats); + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(830, 350); + this.Name = "ExportCustomText"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Export custom text format"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ExportCustomText_KeyDown); + this.contextMenuStrip1.ResumeLayout(false); + this.groupBoxFormats.ResumeLayout(false); + this.groupBoxPreview.ResumeLayout(false); + this.groupBoxPreview.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ListView listViewTemplates; + private System.Windows.Forms.ColumnHeader columnHeader1; + private System.Windows.Forms.ColumnHeader columnHeader2; + private System.Windows.Forms.GroupBox groupBoxFormats; + private System.Windows.Forms.TextBox textBoxPreview; + private System.Windows.Forms.GroupBox groupBoxPreview; + private System.Windows.Forms.Label labelEncoding; + private System.Windows.Forms.ComboBox comboBoxEncoding; + private System.Windows.Forms.Button buttonNew; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonSave; + private System.Windows.Forms.Button buttonEdit; + private System.Windows.Forms.SaveFileDialog saveFileDialog1; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; + private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem2; + private System.Windows.Forms.ToolStripMenuItem newToolStripMenuItem; + private System.Windows.Forms.Button buttonDelete; + } } \ No newline at end of file diff --git a/src/Forms/ExportCustomText.cs b/src/ui/Forms/ExportCustomText.cs similarity index 97% rename from src/Forms/ExportCustomText.cs rename to src/ui/Forms/ExportCustomText.cs index 8497c056d..f4d91a7d1 100644 --- a/src/Forms/ExportCustomText.cs +++ b/src/ui/Forms/ExportCustomText.cs @@ -1,391 +1,391 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public partial class ExportCustomText : PositionAndSizeForm - { - private readonly List _templates = new List(); - private readonly Subtitle _subtitle; - private readonly Subtitle _translated; - private readonly string _title; - private bool _batchConvert; - public string LogMessage { get; set; } - public string CurrentFormatName { get; set; } - - public ExportCustomText(Subtitle subtitle, Subtitle original, string title) - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - if (original?.Paragraphs == null || original.Paragraphs.Count == 0) - { - _subtitle = subtitle; - } - else - { - _subtitle = original; - _translated = subtitle; - } - _title = title; - - UiUtil.InitializeTextEncodingComboBox(comboBoxEncoding); - - if (string.IsNullOrEmpty(Configuration.Settings.Tools.ExportCustomTemplates)) - { - _templates.Add("SubRipÆÆ{number}\r\n{start} --> {end}\r\n{text}\r\n\r\nÆhh:mm:ss,zzzÆ[Do not modify]Æ"); - } - else - { - foreach (string template in Configuration.Settings.Tools.ExportCustomTemplates.Split('æ')) - { - _templates.Add(template); - } - } - ShowTemplates(_templates); - - var l = Configuration.Settings.Language.ExportCustomText; - Text = l.Title; - groupBoxFormats.Text = l.Formats; - buttonSave.Text = l.SaveAs; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - groupBoxPreview.Text = Configuration.Settings.Language.General.Preview; - labelEncoding.Text = Configuration.Settings.Language.Main.Controls.FileEncoding; - columnHeader1.Text = Configuration.Settings.Language.General.Name; - columnHeader2.Text = Configuration.Settings.Language.General.Text; - buttonNew.Text = l.New; - buttonEdit.Text = l.Edit; - buttonDelete.Text = l.Delete; - deleteToolStripMenuItem.Text = l.Delete; - editToolStripMenuItem.Text = l.Edit; - newToolStripMenuItem.Text = l.New; - } - - public sealed override string Text - { - get => base.Text; - set => base.Text = value; - } - - private void ShowTemplates(List templates) - { - listViewTemplates.Items.Clear(); - foreach (string s in templates) - { - var arr = s.Split('Æ'); - if (arr.Length == 6) - { - var lvi = new ListViewItem(arr[0]); - lvi.SubItems.Add(arr[2].Replace(Environment.NewLine, "
")); - listViewTemplates.Items.Add(lvi); - } - } - if (listViewTemplates.Items.Count > 0) - { - listViewTemplates.Items[0].Selected = true; - } - } - - private void buttonNew_Click(object sender, EventArgs e) - { - New(); - } - - private bool NameExists(string name) - { - if (string.IsNullOrEmpty(name)) - { - return true; - } - - for (int i = 0; i < _templates.Count; i++) - { - if (_templates[i].StartsWith(name + "Æ", StringComparison.InvariantCulture)) - { - return true; - } - } - return false; - } - - private void New() - { - using (var form = new ExportCustomTextFormat("NewÆÆ{number}\r\n{start} --> {end}\r\n{text}\r\n\r\nÆhh:mm:ss,zzzÆ[Do not modify]Æ")) - { - if (form.ShowDialog(this) == DialogResult.OK) - { - var arr = form.FormatOk.Split('Æ'); - if (arr.Length == 6) - { - string name = arr[0]; - int i = 1; - while (NameExists(name)) - { - form.FormatOk = form.FormatOk.Remove(0, name.Length); - name = arr[0] + " (" + i + ")"; - form.FormatOk = name + form.FormatOk; - i++; - } - _templates.Add(form.FormatOk); - ShowTemplates(_templates); - listViewTemplates.Items[listViewTemplates.Items.Count - 1].Selected = true; - } - } - } - SaveTemplates(); - } - - private void SaveTemplates() - { - var sb = new StringBuilder(); - foreach (string template in _templates) - { - sb.Append(template + 'æ'); - } - Configuration.Settings.Tools.ExportCustomTemplates = sb.ToString().TrimEnd('æ'); - } - - private void buttonEdit_Click(object sender, EventArgs e) - { - Edit(); - } - - private void Edit() - { - if (listViewTemplates.SelectedItems.Count == 1) - { - int idx = listViewTemplates.SelectedItems[0].Index; - using (var form = new ExportCustomTextFormat(_templates[idx])) - { - if (form.ShowDialog(this) == DialogResult.OK) - { - _templates[idx] = form.FormatOk; - SaveTemplates(); - ShowTemplates(_templates); - if (idx < listViewTemplates.Items.Count) - { - listViewTemplates.Items[idx].Selected = true; - } - } - } - } - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private TextEncoding GetCurrentEncoding() - { - return UiUtil.GetTextEncodingComboBoxCurrentEncoding(comboBoxEncoding); - } - - private void buttonSave_Click(object sender, EventArgs e) - { - if (_batchConvert) - { - if (listViewTemplates.SelectedItems.Count == 1) - { - CurrentFormatName = listViewTemplates.SelectedItems[0].Text; - } - - DialogResult = DialogResult.OK; - return; - } - - saveFileDialog1.Title = Configuration.Settings.Language.ExportCustomText.SaveSubtitleAs; - if (!string.IsNullOrEmpty(_title)) - { - saveFileDialog1.FileName = Path.GetFileNameWithoutExtension(_title) + ".txt"; - } - - saveFileDialog1.Filter = Configuration.Settings.Language.General.AllFiles + "|*.*"; - if (saveFileDialog1.ShowDialog(this) == DialogResult.OK) - { - try - { - FileUtil.WriteAllText(saveFileDialog1.FileName, GenerateText(_subtitle, _translated, _title), GetCurrentEncoding()); - LogMessage = string.Format(Configuration.Settings.Language.ExportCustomText.SubtitleExportedInCustomFormatToX, saveFileDialog1.FileName); - DialogResult = DialogResult.OK; - } - catch (Exception exception) - { - MessageBox.Show(exception.Message); - } - } - } - - private string GenerateText(Subtitle subtitle, Subtitle translation, string title) - { - if (listViewTemplates.SelectedItems.Count != 1) - { - return string.Empty; - } - - title = title == null ? string.Empty : Path.GetFileNameWithoutExtension(title); - - try - { - int idx = listViewTemplates.SelectedItems[0].Index; - return GenerateCustomText(subtitle, translation, title, _templates[idx]); - } - catch (Exception exception) - { - return exception.Message; - } - } - - internal static string GenerateCustomText(Subtitle subtitle, Subtitle translation, string title, string templateString) - { - var arr = templateString.Split('Æ'); - var sb = new StringBuilder(); - sb.Append(ExportCustomTextFormat.GetHeaderOrFooter(title, subtitle, arr[1])); - string template = ExportCustomTextFormat.GetParagraphTemplate(arr[2]); - var isXml = arr[1].Contains("", ">") - .Replace("&", "&"); - } - text = ExportCustomTextFormat.GetText(text, arr[4]); - - string translationText = string.Empty; - if (translation?.Paragraphs != null && translation.Paragraphs.Count > 0) - { - var trans = Utilities.GetOriginalParagraph(i, p, translation.Paragraphs); - if (trans != null) - { - translationText = trans.Text; - } - } - string paragraph = ExportCustomTextFormat.GetParagraph(template, start, end, text, translationText, i, p.Actor, p.Duration, arr[3], Utilities.GetCharactersPerSecond(p)); - sb.Append(paragraph); - } - sb.Append(ExportCustomTextFormat.GetHeaderOrFooter(title, subtitle, arr[5])); - return sb.ToString(); - } - - private void listViewTemplates_SelectedIndexChanged(object sender, EventArgs e) - { - textBoxPreview.Text = GenerateText(_subtitle, _translated, _title); - buttonSave.Enabled = listViewTemplates.SelectedItems.Count == 1; - } - - private void deleteToolStripMenuItem_Click(object sender, EventArgs e) - { - Delete(); - } - - private void Delete() - { - if (listViewTemplates.SelectedItems.Count != 1) - { - return; - } - - int idx = listViewTemplates.SelectedItems[0].Index; - for (int i = listViewTemplates.Items.Count - 1; i >= 0; i--) - { - ListViewItem item = listViewTemplates.Items[i]; - if (item.Selected) - { - string name = item.Text; - for (int j = _templates.Count - 1; j > 0; j--) - { - if (_templates[j].StartsWith(name + "Æ", StringComparison.InvariantCultureIgnoreCase)) - { - _templates.RemoveAt(j); - } - } - item.Remove(); - } - } - if (idx >= listViewTemplates.Items.Count) - { - idx--; - } - - if (idx >= 0) - { - listViewTemplates.Items[idx].Selected = true; - } - - SaveTemplates(); - } - - private void ExportCustomText_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - private void buttonDelete_Click(object sender, EventArgs e) - { - Delete(); - } - - private void editToolStripMenuItem_Click(object sender, EventArgs e) - { - Edit(); - } - - private void newToolStripMenuItem_Click(object sender, EventArgs e) - { - New(); - } - - private void contextMenuStrip1_Opening(object sender, System.ComponentModel.CancelEventArgs e) - { - bool enableVisibility = listViewTemplates.SelectedItems.Count > 0; - toolStripMenuItem2.Visible = enableVisibility; - editToolStripMenuItem.Visible = enableVisibility; - deleteToolStripMenuItem.Visible = enableVisibility; - } - - private void listViewTemplates_MouseDoubleClick(object sender, MouseEventArgs e) - { - Edit(); - } - - public void InitializeForBatchConvert(string customTextTemplate) - { - _batchConvert = true; - buttonSave.Text = Configuration.Settings.Language.General.Ok; - - for (int index = 0; index < _templates.Count; index++) - { - var item = _templates[index]; - if (item.StartsWith(customTextTemplate + "Æ", StringComparison.Ordinal)) - { - listViewTemplates.Items[index].Selected = true; - } - } - } - - private void textBoxPreview_KeyDown(object sender, KeyEventArgs e) - { - if (e.Control && e.KeyCode == Keys.A) - { - textBoxPreview.SelectAll(); - } - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public partial class ExportCustomText : PositionAndSizeForm + { + private readonly List _templates = new List(); + private readonly Subtitle _subtitle; + private readonly Subtitle _translated; + private readonly string _title; + private bool _batchConvert; + public string LogMessage { get; set; } + public string CurrentFormatName { get; set; } + + public ExportCustomText(Subtitle subtitle, Subtitle original, string title) + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + if (original?.Paragraphs == null || original.Paragraphs.Count == 0) + { + _subtitle = subtitle; + } + else + { + _subtitle = original; + _translated = subtitle; + } + _title = title; + + UiUtil.InitializeTextEncodingComboBox(comboBoxEncoding); + + if (string.IsNullOrEmpty(Configuration.Settings.Tools.ExportCustomTemplates)) + { + _templates.Add("SubRipÆÆ{number}\r\n{start} --> {end}\r\n{text}\r\n\r\nÆhh:mm:ss,zzzÆ[Do not modify]Æ"); + } + else + { + foreach (string template in Configuration.Settings.Tools.ExportCustomTemplates.Split('æ')) + { + _templates.Add(template); + } + } + ShowTemplates(_templates); + + var l = Configuration.Settings.Language.ExportCustomText; + Text = l.Title; + groupBoxFormats.Text = l.Formats; + buttonSave.Text = l.SaveAs; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + groupBoxPreview.Text = Configuration.Settings.Language.General.Preview; + labelEncoding.Text = Configuration.Settings.Language.Main.Controls.FileEncoding; + columnHeader1.Text = Configuration.Settings.Language.General.Name; + columnHeader2.Text = Configuration.Settings.Language.General.Text; + buttonNew.Text = l.New; + buttonEdit.Text = l.Edit; + buttonDelete.Text = l.Delete; + deleteToolStripMenuItem.Text = l.Delete; + editToolStripMenuItem.Text = l.Edit; + newToolStripMenuItem.Text = l.New; + } + + public sealed override string Text + { + get => base.Text; + set => base.Text = value; + } + + private void ShowTemplates(List templates) + { + listViewTemplates.Items.Clear(); + foreach (string s in templates) + { + var arr = s.Split('Æ'); + if (arr.Length == 6) + { + var lvi = new ListViewItem(arr[0]); + lvi.SubItems.Add(arr[2].Replace(Environment.NewLine, "
")); + listViewTemplates.Items.Add(lvi); + } + } + if (listViewTemplates.Items.Count > 0) + { + listViewTemplates.Items[0].Selected = true; + } + } + + private void buttonNew_Click(object sender, EventArgs e) + { + New(); + } + + private bool NameExists(string name) + { + if (string.IsNullOrEmpty(name)) + { + return true; + } + + for (int i = 0; i < _templates.Count; i++) + { + if (_templates[i].StartsWith(name + "Æ", StringComparison.InvariantCulture)) + { + return true; + } + } + return false; + } + + private void New() + { + using (var form = new ExportCustomTextFormat("NewÆÆ{number}\r\n{start} --> {end}\r\n{text}\r\n\r\nÆhh:mm:ss,zzzÆ[Do not modify]Æ")) + { + if (form.ShowDialog(this) == DialogResult.OK) + { + var arr = form.FormatOk.Split('Æ'); + if (arr.Length == 6) + { + string name = arr[0]; + int i = 1; + while (NameExists(name)) + { + form.FormatOk = form.FormatOk.Remove(0, name.Length); + name = arr[0] + " (" + i + ")"; + form.FormatOk = name + form.FormatOk; + i++; + } + _templates.Add(form.FormatOk); + ShowTemplates(_templates); + listViewTemplates.Items[listViewTemplates.Items.Count - 1].Selected = true; + } + } + } + SaveTemplates(); + } + + private void SaveTemplates() + { + var sb = new StringBuilder(); + foreach (string template in _templates) + { + sb.Append(template + 'æ'); + } + Configuration.Settings.Tools.ExportCustomTemplates = sb.ToString().TrimEnd('æ'); + } + + private void buttonEdit_Click(object sender, EventArgs e) + { + Edit(); + } + + private void Edit() + { + if (listViewTemplates.SelectedItems.Count == 1) + { + int idx = listViewTemplates.SelectedItems[0].Index; + using (var form = new ExportCustomTextFormat(_templates[idx])) + { + if (form.ShowDialog(this) == DialogResult.OK) + { + _templates[idx] = form.FormatOk; + SaveTemplates(); + ShowTemplates(_templates); + if (idx < listViewTemplates.Items.Count) + { + listViewTemplates.Items[idx].Selected = true; + } + } + } + } + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private TextEncoding GetCurrentEncoding() + { + return UiUtil.GetTextEncodingComboBoxCurrentEncoding(comboBoxEncoding); + } + + private void buttonSave_Click(object sender, EventArgs e) + { + if (_batchConvert) + { + if (listViewTemplates.SelectedItems.Count == 1) + { + CurrentFormatName = listViewTemplates.SelectedItems[0].Text; + } + + DialogResult = DialogResult.OK; + return; + } + + saveFileDialog1.Title = Configuration.Settings.Language.ExportCustomText.SaveSubtitleAs; + if (!string.IsNullOrEmpty(_title)) + { + saveFileDialog1.FileName = Path.GetFileNameWithoutExtension(_title) + ".txt"; + } + + saveFileDialog1.Filter = Configuration.Settings.Language.General.AllFiles + "|*.*"; + if (saveFileDialog1.ShowDialog(this) == DialogResult.OK) + { + try + { + FileUtil.WriteAllText(saveFileDialog1.FileName, GenerateText(_subtitle, _translated, _title), GetCurrentEncoding()); + LogMessage = string.Format(Configuration.Settings.Language.ExportCustomText.SubtitleExportedInCustomFormatToX, saveFileDialog1.FileName); + DialogResult = DialogResult.OK; + } + catch (Exception exception) + { + MessageBox.Show(exception.Message); + } + } + } + + private string GenerateText(Subtitle subtitle, Subtitle translation, string title) + { + if (listViewTemplates.SelectedItems.Count != 1) + { + return string.Empty; + } + + title = title == null ? string.Empty : Path.GetFileNameWithoutExtension(title); + + try + { + int idx = listViewTemplates.SelectedItems[0].Index; + return GenerateCustomText(subtitle, translation, title, _templates[idx]); + } + catch (Exception exception) + { + return exception.Message; + } + } + + internal static string GenerateCustomText(Subtitle subtitle, Subtitle translation, string title, string templateString) + { + var arr = templateString.Split('Æ'); + var sb = new StringBuilder(); + sb.Append(ExportCustomTextFormat.GetHeaderOrFooter(title, subtitle, arr[1])); + string template = ExportCustomTextFormat.GetParagraphTemplate(arr[2]); + var isXml = arr[1].Contains("", ">") + .Replace("&", "&"); + } + text = ExportCustomTextFormat.GetText(text, arr[4]); + + string translationText = string.Empty; + if (translation?.Paragraphs != null && translation.Paragraphs.Count > 0) + { + var trans = Utilities.GetOriginalParagraph(i, p, translation.Paragraphs); + if (trans != null) + { + translationText = trans.Text; + } + } + string paragraph = ExportCustomTextFormat.GetParagraph(template, start, end, text, translationText, i, p.Actor, p.Duration, arr[3], Utilities.GetCharactersPerSecond(p)); + sb.Append(paragraph); + } + sb.Append(ExportCustomTextFormat.GetHeaderOrFooter(title, subtitle, arr[5])); + return sb.ToString(); + } + + private void listViewTemplates_SelectedIndexChanged(object sender, EventArgs e) + { + textBoxPreview.Text = GenerateText(_subtitle, _translated, _title); + buttonSave.Enabled = listViewTemplates.SelectedItems.Count == 1; + } + + private void deleteToolStripMenuItem_Click(object sender, EventArgs e) + { + Delete(); + } + + private void Delete() + { + if (listViewTemplates.SelectedItems.Count != 1) + { + return; + } + + int idx = listViewTemplates.SelectedItems[0].Index; + for (int i = listViewTemplates.Items.Count - 1; i >= 0; i--) + { + ListViewItem item = listViewTemplates.Items[i]; + if (item.Selected) + { + string name = item.Text; + for (int j = _templates.Count - 1; j > 0; j--) + { + if (_templates[j].StartsWith(name + "Æ", StringComparison.InvariantCultureIgnoreCase)) + { + _templates.RemoveAt(j); + } + } + item.Remove(); + } + } + if (idx >= listViewTemplates.Items.Count) + { + idx--; + } + + if (idx >= 0) + { + listViewTemplates.Items[idx].Selected = true; + } + + SaveTemplates(); + } + + private void ExportCustomText_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + private void buttonDelete_Click(object sender, EventArgs e) + { + Delete(); + } + + private void editToolStripMenuItem_Click(object sender, EventArgs e) + { + Edit(); + } + + private void newToolStripMenuItem_Click(object sender, EventArgs e) + { + New(); + } + + private void contextMenuStrip1_Opening(object sender, System.ComponentModel.CancelEventArgs e) + { + bool enableVisibility = listViewTemplates.SelectedItems.Count > 0; + toolStripMenuItem2.Visible = enableVisibility; + editToolStripMenuItem.Visible = enableVisibility; + deleteToolStripMenuItem.Visible = enableVisibility; + } + + private void listViewTemplates_MouseDoubleClick(object sender, MouseEventArgs e) + { + Edit(); + } + + public void InitializeForBatchConvert(string customTextTemplate) + { + _batchConvert = true; + buttonSave.Text = Configuration.Settings.Language.General.Ok; + + for (int index = 0; index < _templates.Count; index++) + { + var item = _templates[index]; + if (item.StartsWith(customTextTemplate + "Æ", StringComparison.Ordinal)) + { + listViewTemplates.Items[index].Selected = true; + } + } + } + + private void textBoxPreview_KeyDown(object sender, KeyEventArgs e) + { + if (e.Control && e.KeyCode == Keys.A) + { + textBoxPreview.SelectAll(); + } + } + } +} diff --git a/src/Forms/ExportCustomText.resx b/src/ui/Forms/ExportCustomText.resx similarity index 97% rename from src/Forms/ExportCustomText.resx rename to src/ui/Forms/ExportCustomText.resx index f36ef2556..84c4692cc 100644 --- a/src/Forms/ExportCustomText.resx +++ b/src/ui/Forms/ExportCustomText.resx @@ -1,126 +1,126 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 153, 17 - - - 17, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 153, 17 + + + 17, 17 + \ No newline at end of file diff --git a/src/Forms/ExportCustomTextFormat.Designer.cs b/src/ui/Forms/ExportCustomTextFormat.Designer.cs similarity index 98% rename from src/Forms/ExportCustomTextFormat.Designer.cs rename to src/ui/Forms/ExportCustomTextFormat.Designer.cs index f6a51a434..dc00d61a2 100644 --- a/src/Forms/ExportCustomTextFormat.Designer.cs +++ b/src/ui/Forms/ExportCustomTextFormat.Designer.cs @@ -1,522 +1,522 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class ExportCustomTextFormat - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.groupBoxTemplate = new System.Windows.Forms.GroupBox(); - this.textBoxName = new System.Windows.Forms.TextBox(); - this.labelName = new System.Windows.Forms.Label(); - this.comboBoxNewLine = new System.Windows.Forms.ComboBox(); - this.comboBoxTimeCode = new System.Windows.Forms.ComboBox(); - this.labelNewLine = new System.Windows.Forms.Label(); - this.labelTimeCode = new System.Windows.Forms.Label(); - this.textBoxFooter = new System.Windows.Forms.TextBox(); - this.contextMenuStripFooter = new System.Windows.Forms.ContextMenuStrip(this.components); - this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem5 = new System.Windows.Forms.ToolStripMenuItem(); - this.labelFooter = new System.Windows.Forms.Label(); - this.labelTextLine = new System.Windows.Forms.Label(); - this.textBoxParagraph = new System.Windows.Forms.TextBox(); - this.contextMenuStripParagraph = new System.Windows.Forms.ContextMenuStrip(this.components); - this.insertHHMMSSMSToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.insertendToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.insertnumberToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.insertdurationToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.textToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.translationToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemActor = new System.Windows.Forms.ToolStripMenuItem(); - this.tabToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.textToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.textline2ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.labelHeader = new System.Windows.Forms.Label(); - this.textBoxHeader = new System.Windows.Forms.TextBox(); - this.contextMenuStripHeader = new System.Windows.Forms.ContextMenuStrip(this.components); - this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem7 = new System.Windows.Forms.ToolStripMenuItem(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.groupBoxPreview = new System.Windows.Forms.GroupBox(); - this.textBoxPreview = new System.Windows.Forms.TextBox(); - this.cpsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.textlengthToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.cpsperiodToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.groupBoxTemplate.SuspendLayout(); - this.contextMenuStripFooter.SuspendLayout(); - this.contextMenuStripParagraph.SuspendLayout(); - this.contextMenuStripHeader.SuspendLayout(); - this.groupBoxPreview.SuspendLayout(); - this.SuspendLayout(); - // - // groupBoxTemplate - // - this.groupBoxTemplate.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left))); - this.groupBoxTemplate.Controls.Add(this.textBoxName); - this.groupBoxTemplate.Controls.Add(this.labelName); - this.groupBoxTemplate.Controls.Add(this.comboBoxNewLine); - this.groupBoxTemplate.Controls.Add(this.comboBoxTimeCode); - this.groupBoxTemplate.Controls.Add(this.labelNewLine); - this.groupBoxTemplate.Controls.Add(this.labelTimeCode); - this.groupBoxTemplate.Controls.Add(this.textBoxFooter); - this.groupBoxTemplate.Controls.Add(this.labelFooter); - this.groupBoxTemplate.Controls.Add(this.labelTextLine); - this.groupBoxTemplate.Controls.Add(this.textBoxParagraph); - this.groupBoxTemplate.Controls.Add(this.labelHeader); - this.groupBoxTemplate.Controls.Add(this.textBoxHeader); - this.groupBoxTemplate.Location = new System.Drawing.Point(12, 12); - this.groupBoxTemplate.Name = "groupBoxTemplate"; - this.groupBoxTemplate.Size = new System.Drawing.Size(346, 393); - this.groupBoxTemplate.TabIndex = 0; - this.groupBoxTemplate.TabStop = false; - this.groupBoxTemplate.Text = "Current template"; - // - // textBoxName - // - this.textBoxName.Location = new System.Drawing.Point(49, 30); - this.textBoxName.Name = "textBoxName"; - this.textBoxName.Size = new System.Drawing.Size(291, 20); - this.textBoxName.TabIndex = 1; - // - // labelName - // - this.labelName.AutoSize = true; - this.labelName.Location = new System.Drawing.Point(8, 33); - this.labelName.Name = "labelName"; - this.labelName.Size = new System.Drawing.Size(35, 13); - this.labelName.TabIndex = 0; - this.labelName.Text = "Name"; - // - // comboBoxNewLine - // - this.comboBoxNewLine.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.comboBoxNewLine.FormattingEnabled = true; - this.comboBoxNewLine.Items.AddRange(new object[] { - "[Do not modify]", - "||", - "[Only newline (hex char 0xd)]"}); - this.comboBoxNewLine.Location = new System.Drawing.Point(241, 266); - this.comboBoxNewLine.Name = "comboBoxNewLine"; - this.comboBoxNewLine.Size = new System.Drawing.Size(99, 21); - this.comboBoxNewLine.TabIndex = 9; - this.comboBoxNewLine.SelectedIndexChanged += new System.EventHandler(this.comboBoxNewLine_SelectedIndexChanged); - this.comboBoxNewLine.TextChanged += new System.EventHandler(this.comboBoxNewLine_TextChanged); - // - // comboBoxTimeCode - // - this.comboBoxTimeCode.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.comboBoxTimeCode.FormattingEnabled = true; - this.comboBoxTimeCode.Items.AddRange(new object[] { - "hh:mm:ss,zzz", - "hh:mm:ss.ff", - "h:mm:ss,zzz", - "h:mm:ss,zz", - "ff", - "zzz", - "ss"}); - this.comboBoxTimeCode.Location = new System.Drawing.Point(69, 266); - this.comboBoxTimeCode.Name = "comboBoxTimeCode"; - this.comboBoxTimeCode.Size = new System.Drawing.Size(92, 21); - this.comboBoxTimeCode.TabIndex = 7; - this.comboBoxTimeCode.SelectedIndexChanged += new System.EventHandler(this.comboBoxTimeCode_SelectedIndexChanged); - this.comboBoxTimeCode.TextChanged += new System.EventHandler(this.comboBoxTimeCode_TextChanged); - // - // labelNewLine - // - this.labelNewLine.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelNewLine.AutoSize = true; - this.labelNewLine.Location = new System.Drawing.Point(185, 267); - this.labelNewLine.Name = "labelNewLine"; - this.labelNewLine.Size = new System.Drawing.Size(48, 13); - this.labelNewLine.TabIndex = 8; - this.labelNewLine.Text = "New line"; - // - // labelTimeCode - // - this.labelTimeCode.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelTimeCode.AutoSize = true; - this.labelTimeCode.Location = new System.Drawing.Point(6, 267); - this.labelTimeCode.Name = "labelTimeCode"; - this.labelTimeCode.Size = new System.Drawing.Size(57, 13); - this.labelTimeCode.TabIndex = 6; - this.labelTimeCode.Text = "Time code"; - // - // textBoxFooter - // - this.textBoxFooter.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.textBoxFooter.ContextMenuStrip = this.contextMenuStripFooter; - this.textBoxFooter.Location = new System.Drawing.Point(6, 313); - this.textBoxFooter.Multiline = true; - this.textBoxFooter.Name = "textBoxFooter"; - this.textBoxFooter.Size = new System.Drawing.Size(334, 70); - this.textBoxFooter.TabIndex = 11; - this.textBoxFooter.TextChanged += new System.EventHandler(this.TextBoxParagraphTextChanged); - // - // contextMenuStripFooter - // - this.contextMenuStripFooter.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripMenuItem3, - this.toolStripMenuItem4, - this.toolStripMenuItem5}); - this.contextMenuStripFooter.Name = "contextMenuStrip1"; - this.contextMenuStripFooter.Size = new System.Drawing.Size(114, 70); - // - // toolStripMenuItem3 - // - this.toolStripMenuItem3.Name = "toolStripMenuItem3"; - this.toolStripMenuItem3.Size = new System.Drawing.Size(113, 22); - this.toolStripMenuItem3.Text = "{title}"; - this.toolStripMenuItem3.Click += new System.EventHandler(this.InsertTagFooter); - // - // toolStripMenuItem4 - // - this.toolStripMenuItem4.Name = "toolStripMenuItem4"; - this.toolStripMenuItem4.Size = new System.Drawing.Size(113, 22); - this.toolStripMenuItem4.Text = "{#lines}"; - this.toolStripMenuItem4.Click += new System.EventHandler(this.InsertTagFooter); - // - // toolStripMenuItem5 - // - this.toolStripMenuItem5.Name = "toolStripMenuItem5"; - this.toolStripMenuItem5.Size = new System.Drawing.Size(113, 22); - this.toolStripMenuItem5.Text = "{tab}"; - this.toolStripMenuItem5.Click += new System.EventHandler(this.InsertTagFooter); - // - // labelFooter - // - this.labelFooter.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelFooter.AutoSize = true; - this.labelFooter.Location = new System.Drawing.Point(6, 297); - this.labelFooter.Name = "labelFooter"; - this.labelFooter.Size = new System.Drawing.Size(37, 13); - this.labelFooter.TabIndex = 10; - this.labelFooter.Text = "Footer"; - // - // labelTextLine - // - this.labelTextLine.AutoSize = true; - this.labelTextLine.Location = new System.Drawing.Point(6, 159); - this.labelTextLine.Name = "labelTextLine"; - this.labelTextLine.Size = new System.Drawing.Size(104, 13); - this.labelTextLine.TabIndex = 4; - this.labelTextLine.Text = "Text line (paragraph)"; - // - // textBoxParagraph - // - this.textBoxParagraph.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left))); - this.textBoxParagraph.ContextMenuStrip = this.contextMenuStripParagraph; - this.textBoxParagraph.Location = new System.Drawing.Point(6, 175); - this.textBoxParagraph.Multiline = true; - this.textBoxParagraph.Name = "textBoxParagraph"; - this.textBoxParagraph.Size = new System.Drawing.Size(334, 85); - this.textBoxParagraph.TabIndex = 5; - this.textBoxParagraph.Text = "{number}\r\n{start} --> {end}\r\n{text}\r\n\r\n"; - this.textBoxParagraph.TextChanged += new System.EventHandler(this.TextBoxParagraphTextChanged); - // - // contextMenuStripParagraph - // - this.contextMenuStripParagraph.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.insertHHMMSSMSToolStripMenuItem, - this.insertendToolStripMenuItem, - this.insertnumberToolStripMenuItem, - this.insertdurationToolStripMenuItem, - this.textToolStripMenuItem, - this.translationToolStripMenuItem, - this.toolStripMenuItemActor, - this.tabToolStripMenuItem, - this.textToolStripMenuItem1, - this.textline2ToolStripMenuItem, - this.cpsperiodToolStripMenuItem, - this.cpsToolStripMenuItem, - this.textlengthToolStripMenuItem}); - this.contextMenuStripParagraph.Name = "contextMenuStrip1"; - this.contextMenuStripParagraph.Size = new System.Drawing.Size(147, 290); - // - // insertHHMMSSMSToolStripMenuItem - // - this.insertHHMMSSMSToolStripMenuItem.Name = "insertHHMMSSMSToolStripMenuItem"; - this.insertHHMMSSMSToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.insertHHMMSSMSToolStripMenuItem.Text = "{start}"; - this.insertHHMMSSMSToolStripMenuItem.Click += new System.EventHandler(this.InsertTag); - // - // insertendToolStripMenuItem - // - this.insertendToolStripMenuItem.Name = "insertendToolStripMenuItem"; - this.insertendToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.insertendToolStripMenuItem.Text = "{end}"; - this.insertendToolStripMenuItem.Click += new System.EventHandler(this.InsertTag); - // - // insertnumberToolStripMenuItem - // - this.insertnumberToolStripMenuItem.Name = "insertnumberToolStripMenuItem"; - this.insertnumberToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.insertnumberToolStripMenuItem.Text = "{number}"; - this.insertnumberToolStripMenuItem.Click += new System.EventHandler(this.InsertTag); - // - // insertdurationToolStripMenuItem - // - this.insertdurationToolStripMenuItem.Name = "insertdurationToolStripMenuItem"; - this.insertdurationToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.insertdurationToolStripMenuItem.Text = "{duration}"; - this.insertdurationToolStripMenuItem.Click += new System.EventHandler(this.InsertTag); - // - // textToolStripMenuItem - // - this.textToolStripMenuItem.Name = "textToolStripMenuItem"; - this.textToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.textToolStripMenuItem.Text = "{text}"; - this.textToolStripMenuItem.Click += new System.EventHandler(this.InsertTag); - // - // translationToolStripMenuItem - // - this.translationToolStripMenuItem.Name = "translationToolStripMenuItem"; - this.translationToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.translationToolStripMenuItem.Text = "{translation}"; - this.translationToolStripMenuItem.Click += new System.EventHandler(this.InsertTag); - // - // toolStripMenuItemActor - // - this.toolStripMenuItemActor.Name = "toolStripMenuItemActor"; - this.toolStripMenuItemActor.Size = new System.Drawing.Size(180, 22); - this.toolStripMenuItemActor.Text = "{actor}"; - this.toolStripMenuItemActor.Click += new System.EventHandler(this.InsertTag); - // - // tabToolStripMenuItem - // - this.tabToolStripMenuItem.Name = "tabToolStripMenuItem"; - this.tabToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.tabToolStripMenuItem.Text = "{tab}"; - this.tabToolStripMenuItem.Click += new System.EventHandler(this.InsertTag); - // - // textToolStripMenuItem1 - // - this.textToolStripMenuItem1.Name = "textToolStripMenuItem1"; - this.textToolStripMenuItem1.Size = new System.Drawing.Size(180, 22); - this.textToolStripMenuItem1.Text = "{text-line-1}"; - this.textToolStripMenuItem1.Click += new System.EventHandler(this.InsertTag); - // - // textline2ToolStripMenuItem - // - this.textline2ToolStripMenuItem.Name = "textline2ToolStripMenuItem"; - this.textline2ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.textline2ToolStripMenuItem.Text = "{text-line-2}"; - this.textline2ToolStripMenuItem.Click += new System.EventHandler(this.InsertTag); - // - // labelHeader - // - this.labelHeader.AutoSize = true; - this.labelHeader.Location = new System.Drawing.Point(6, 64); - this.labelHeader.Name = "labelHeader"; - this.labelHeader.Size = new System.Drawing.Size(42, 13); - this.labelHeader.TabIndex = 2; - this.labelHeader.Text = "Header"; - // - // textBoxHeader - // - this.textBoxHeader.ContextMenuStrip = this.contextMenuStripHeader; - this.textBoxHeader.Location = new System.Drawing.Point(6, 80); - this.textBoxHeader.Multiline = true; - this.textBoxHeader.Name = "textBoxHeader"; - this.textBoxHeader.Size = new System.Drawing.Size(334, 64); - this.textBoxHeader.TabIndex = 3; - this.textBoxHeader.TextChanged += new System.EventHandler(this.TextBoxParagraphTextChanged); - // - // contextMenuStripHeader - // - this.contextMenuStripHeader.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripMenuItem1, - this.toolStripMenuItem2, - this.toolStripMenuItem7}); - this.contextMenuStripHeader.Name = "contextMenuStrip1"; - this.contextMenuStripHeader.Size = new System.Drawing.Size(114, 70); - // - // toolStripMenuItem1 - // - this.toolStripMenuItem1.Name = "toolStripMenuItem1"; - this.toolStripMenuItem1.Size = new System.Drawing.Size(113, 22); - this.toolStripMenuItem1.Text = "{title}"; - this.toolStripMenuItem1.Click += new System.EventHandler(this.InsertTagHeader); - // - // toolStripMenuItem2 - // - this.toolStripMenuItem2.Name = "toolStripMenuItem2"; - this.toolStripMenuItem2.Size = new System.Drawing.Size(113, 22); - this.toolStripMenuItem2.Text = "{#lines}"; - this.toolStripMenuItem2.Click += new System.EventHandler(this.InsertTagHeader); - // - // toolStripMenuItem7 - // - this.toolStripMenuItem7.Name = "toolStripMenuItem7"; - this.toolStripMenuItem7.Size = new System.Drawing.Size(113, 22); - this.toolStripMenuItem7.Text = "{tab}"; - this.toolStripMenuItem7.Click += new System.EventHandler(this.InsertTagHeader); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(628, 412); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 3; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(547, 412); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 2; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // groupBoxPreview - // - this.groupBoxPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxPreview.Controls.Add(this.textBoxPreview); - this.groupBoxPreview.Location = new System.Drawing.Point(364, 12); - this.groupBoxPreview.Name = "groupBoxPreview"; - this.groupBoxPreview.Size = new System.Drawing.Size(346, 393); - this.groupBoxPreview.TabIndex = 1; - this.groupBoxPreview.TabStop = false; - this.groupBoxPreview.Text = "Preview"; - // - // textBoxPreview - // - this.textBoxPreview.Dock = System.Windows.Forms.DockStyle.Fill; - this.textBoxPreview.Location = new System.Drawing.Point(3, 16); - this.textBoxPreview.Multiline = true; - this.textBoxPreview.Name = "textBoxPreview"; - this.textBoxPreview.ReadOnly = true; - this.textBoxPreview.Size = new System.Drawing.Size(340, 374); - this.textBoxPreview.TabIndex = 0; - // - // cpsToolStripMenuItem - // - this.cpsToolStripMenuItem.Name = "cpsToolStripMenuItem"; - this.cpsToolStripMenuItem.Size = new System.Drawing.Size(146, 22); - this.cpsToolStripMenuItem.Text = "{cps-comma}"; - this.cpsToolStripMenuItem.Click += new System.EventHandler(this.InsertTag); - // - // textlengthToolStripMenuItem - // - this.textlengthToolStripMenuItem.Name = "textlengthToolStripMenuItem"; - this.textlengthToolStripMenuItem.Size = new System.Drawing.Size(146, 22); - this.textlengthToolStripMenuItem.Text = "{text-length}"; - this.textlengthToolStripMenuItem.Click += new System.EventHandler(this.InsertTag); - // - // cpsperiodToolStripMenuItem - // - this.cpsperiodToolStripMenuItem.Name = "cpsperiodToolStripMenuItem"; - this.cpsperiodToolStripMenuItem.Size = new System.Drawing.Size(146, 22); - this.cpsperiodToolStripMenuItem.Text = "{cps-period}"; - this.cpsperiodToolStripMenuItem.Click += new System.EventHandler(this.InsertTag); - // - // ExportCustomTextFormat - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(715, 445); - this.Controls.Add(this.groupBoxPreview); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.groupBoxTemplate); - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(600, 450); - this.Name = "ExportCustomTextFormat"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Custom text format"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ExportCustomTextFormatKeyDown); - this.groupBoxTemplate.ResumeLayout(false); - this.groupBoxTemplate.PerformLayout(); - this.contextMenuStripFooter.ResumeLayout(false); - this.contextMenuStripParagraph.ResumeLayout(false); - this.contextMenuStripHeader.ResumeLayout(false); - this.groupBoxPreview.ResumeLayout(false); - this.groupBoxPreview.PerformLayout(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.GroupBox groupBoxTemplate; - private System.Windows.Forms.Label labelHeader; - private System.Windows.Forms.TextBox textBoxHeader; - private System.Windows.Forms.Label labelFooter; - private System.Windows.Forms.Label labelTextLine; - private System.Windows.Forms.TextBox textBoxParagraph; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.TextBox textBoxFooter; - private System.Windows.Forms.ContextMenuStrip contextMenuStripParagraph; - private System.Windows.Forms.ToolStripMenuItem insertHHMMSSMSToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem insertendToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem insertnumberToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem insertdurationToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem textToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem tabToolStripMenuItem; - private System.Windows.Forms.ComboBox comboBoxNewLine; - private System.Windows.Forms.ComboBox comboBoxTimeCode; - private System.Windows.Forms.Label labelNewLine; - private System.Windows.Forms.Label labelTimeCode; - private System.Windows.Forms.GroupBox groupBoxPreview; - private System.Windows.Forms.TextBox textBoxPreview; - private System.Windows.Forms.TextBox textBoxName; - private System.Windows.Forms.Label labelName; - private System.Windows.Forms.ToolStripMenuItem translationToolStripMenuItem; - private System.Windows.Forms.ContextMenuStrip contextMenuStripHeader; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem2; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem7; - private System.Windows.Forms.ContextMenuStrip contextMenuStripFooter; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem3; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem4; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem5; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemActor; - private System.Windows.Forms.ToolStripMenuItem textToolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem textline2ToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem cpsToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem textlengthToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem cpsperiodToolStripMenuItem; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class ExportCustomTextFormat + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.groupBoxTemplate = new System.Windows.Forms.GroupBox(); + this.textBoxName = new System.Windows.Forms.TextBox(); + this.labelName = new System.Windows.Forms.Label(); + this.comboBoxNewLine = new System.Windows.Forms.ComboBox(); + this.comboBoxTimeCode = new System.Windows.Forms.ComboBox(); + this.labelNewLine = new System.Windows.Forms.Label(); + this.labelTimeCode = new System.Windows.Forms.Label(); + this.textBoxFooter = new System.Windows.Forms.TextBox(); + this.contextMenuStripFooter = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem5 = new System.Windows.Forms.ToolStripMenuItem(); + this.labelFooter = new System.Windows.Forms.Label(); + this.labelTextLine = new System.Windows.Forms.Label(); + this.textBoxParagraph = new System.Windows.Forms.TextBox(); + this.contextMenuStripParagraph = new System.Windows.Forms.ContextMenuStrip(this.components); + this.insertHHMMSSMSToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.insertendToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.insertnumberToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.insertdurationToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.textToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.translationToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemActor = new System.Windows.Forms.ToolStripMenuItem(); + this.tabToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.textToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.textline2ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.labelHeader = new System.Windows.Forms.Label(); + this.textBoxHeader = new System.Windows.Forms.TextBox(); + this.contextMenuStripHeader = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem7 = new System.Windows.Forms.ToolStripMenuItem(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.groupBoxPreview = new System.Windows.Forms.GroupBox(); + this.textBoxPreview = new System.Windows.Forms.TextBox(); + this.cpsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.textlengthToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.cpsperiodToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.groupBoxTemplate.SuspendLayout(); + this.contextMenuStripFooter.SuspendLayout(); + this.contextMenuStripParagraph.SuspendLayout(); + this.contextMenuStripHeader.SuspendLayout(); + this.groupBoxPreview.SuspendLayout(); + this.SuspendLayout(); + // + // groupBoxTemplate + // + this.groupBoxTemplate.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.groupBoxTemplate.Controls.Add(this.textBoxName); + this.groupBoxTemplate.Controls.Add(this.labelName); + this.groupBoxTemplate.Controls.Add(this.comboBoxNewLine); + this.groupBoxTemplate.Controls.Add(this.comboBoxTimeCode); + this.groupBoxTemplate.Controls.Add(this.labelNewLine); + this.groupBoxTemplate.Controls.Add(this.labelTimeCode); + this.groupBoxTemplate.Controls.Add(this.textBoxFooter); + this.groupBoxTemplate.Controls.Add(this.labelFooter); + this.groupBoxTemplate.Controls.Add(this.labelTextLine); + this.groupBoxTemplate.Controls.Add(this.textBoxParagraph); + this.groupBoxTemplate.Controls.Add(this.labelHeader); + this.groupBoxTemplate.Controls.Add(this.textBoxHeader); + this.groupBoxTemplate.Location = new System.Drawing.Point(12, 12); + this.groupBoxTemplate.Name = "groupBoxTemplate"; + this.groupBoxTemplate.Size = new System.Drawing.Size(346, 393); + this.groupBoxTemplate.TabIndex = 0; + this.groupBoxTemplate.TabStop = false; + this.groupBoxTemplate.Text = "Current template"; + // + // textBoxName + // + this.textBoxName.Location = new System.Drawing.Point(49, 30); + this.textBoxName.Name = "textBoxName"; + this.textBoxName.Size = new System.Drawing.Size(291, 20); + this.textBoxName.TabIndex = 1; + // + // labelName + // + this.labelName.AutoSize = true; + this.labelName.Location = new System.Drawing.Point(8, 33); + this.labelName.Name = "labelName"; + this.labelName.Size = new System.Drawing.Size(35, 13); + this.labelName.TabIndex = 0; + this.labelName.Text = "Name"; + // + // comboBoxNewLine + // + this.comboBoxNewLine.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.comboBoxNewLine.FormattingEnabled = true; + this.comboBoxNewLine.Items.AddRange(new object[] { + "[Do not modify]", + "||", + "[Only newline (hex char 0xd)]"}); + this.comboBoxNewLine.Location = new System.Drawing.Point(241, 266); + this.comboBoxNewLine.Name = "comboBoxNewLine"; + this.comboBoxNewLine.Size = new System.Drawing.Size(99, 21); + this.comboBoxNewLine.TabIndex = 9; + this.comboBoxNewLine.SelectedIndexChanged += new System.EventHandler(this.comboBoxNewLine_SelectedIndexChanged); + this.comboBoxNewLine.TextChanged += new System.EventHandler(this.comboBoxNewLine_TextChanged); + // + // comboBoxTimeCode + // + this.comboBoxTimeCode.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.comboBoxTimeCode.FormattingEnabled = true; + this.comboBoxTimeCode.Items.AddRange(new object[] { + "hh:mm:ss,zzz", + "hh:mm:ss.ff", + "h:mm:ss,zzz", + "h:mm:ss,zz", + "ff", + "zzz", + "ss"}); + this.comboBoxTimeCode.Location = new System.Drawing.Point(69, 266); + this.comboBoxTimeCode.Name = "comboBoxTimeCode"; + this.comboBoxTimeCode.Size = new System.Drawing.Size(92, 21); + this.comboBoxTimeCode.TabIndex = 7; + this.comboBoxTimeCode.SelectedIndexChanged += new System.EventHandler(this.comboBoxTimeCode_SelectedIndexChanged); + this.comboBoxTimeCode.TextChanged += new System.EventHandler(this.comboBoxTimeCode_TextChanged); + // + // labelNewLine + // + this.labelNewLine.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelNewLine.AutoSize = true; + this.labelNewLine.Location = new System.Drawing.Point(185, 267); + this.labelNewLine.Name = "labelNewLine"; + this.labelNewLine.Size = new System.Drawing.Size(48, 13); + this.labelNewLine.TabIndex = 8; + this.labelNewLine.Text = "New line"; + // + // labelTimeCode + // + this.labelTimeCode.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelTimeCode.AutoSize = true; + this.labelTimeCode.Location = new System.Drawing.Point(6, 267); + this.labelTimeCode.Name = "labelTimeCode"; + this.labelTimeCode.Size = new System.Drawing.Size(57, 13); + this.labelTimeCode.TabIndex = 6; + this.labelTimeCode.Text = "Time code"; + // + // textBoxFooter + // + this.textBoxFooter.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.textBoxFooter.ContextMenuStrip = this.contextMenuStripFooter; + this.textBoxFooter.Location = new System.Drawing.Point(6, 313); + this.textBoxFooter.Multiline = true; + this.textBoxFooter.Name = "textBoxFooter"; + this.textBoxFooter.Size = new System.Drawing.Size(334, 70); + this.textBoxFooter.TabIndex = 11; + this.textBoxFooter.TextChanged += new System.EventHandler(this.TextBoxParagraphTextChanged); + // + // contextMenuStripFooter + // + this.contextMenuStripFooter.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItem3, + this.toolStripMenuItem4, + this.toolStripMenuItem5}); + this.contextMenuStripFooter.Name = "contextMenuStrip1"; + this.contextMenuStripFooter.Size = new System.Drawing.Size(114, 70); + // + // toolStripMenuItem3 + // + this.toolStripMenuItem3.Name = "toolStripMenuItem3"; + this.toolStripMenuItem3.Size = new System.Drawing.Size(113, 22); + this.toolStripMenuItem3.Text = "{title}"; + this.toolStripMenuItem3.Click += new System.EventHandler(this.InsertTagFooter); + // + // toolStripMenuItem4 + // + this.toolStripMenuItem4.Name = "toolStripMenuItem4"; + this.toolStripMenuItem4.Size = new System.Drawing.Size(113, 22); + this.toolStripMenuItem4.Text = "{#lines}"; + this.toolStripMenuItem4.Click += new System.EventHandler(this.InsertTagFooter); + // + // toolStripMenuItem5 + // + this.toolStripMenuItem5.Name = "toolStripMenuItem5"; + this.toolStripMenuItem5.Size = new System.Drawing.Size(113, 22); + this.toolStripMenuItem5.Text = "{tab}"; + this.toolStripMenuItem5.Click += new System.EventHandler(this.InsertTagFooter); + // + // labelFooter + // + this.labelFooter.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelFooter.AutoSize = true; + this.labelFooter.Location = new System.Drawing.Point(6, 297); + this.labelFooter.Name = "labelFooter"; + this.labelFooter.Size = new System.Drawing.Size(37, 13); + this.labelFooter.TabIndex = 10; + this.labelFooter.Text = "Footer"; + // + // labelTextLine + // + this.labelTextLine.AutoSize = true; + this.labelTextLine.Location = new System.Drawing.Point(6, 159); + this.labelTextLine.Name = "labelTextLine"; + this.labelTextLine.Size = new System.Drawing.Size(104, 13); + this.labelTextLine.TabIndex = 4; + this.labelTextLine.Text = "Text line (paragraph)"; + // + // textBoxParagraph + // + this.textBoxParagraph.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.textBoxParagraph.ContextMenuStrip = this.contextMenuStripParagraph; + this.textBoxParagraph.Location = new System.Drawing.Point(6, 175); + this.textBoxParagraph.Multiline = true; + this.textBoxParagraph.Name = "textBoxParagraph"; + this.textBoxParagraph.Size = new System.Drawing.Size(334, 85); + this.textBoxParagraph.TabIndex = 5; + this.textBoxParagraph.Text = "{number}\r\n{start} --> {end}\r\n{text}\r\n\r\n"; + this.textBoxParagraph.TextChanged += new System.EventHandler(this.TextBoxParagraphTextChanged); + // + // contextMenuStripParagraph + // + this.contextMenuStripParagraph.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.insertHHMMSSMSToolStripMenuItem, + this.insertendToolStripMenuItem, + this.insertnumberToolStripMenuItem, + this.insertdurationToolStripMenuItem, + this.textToolStripMenuItem, + this.translationToolStripMenuItem, + this.toolStripMenuItemActor, + this.tabToolStripMenuItem, + this.textToolStripMenuItem1, + this.textline2ToolStripMenuItem, + this.cpsperiodToolStripMenuItem, + this.cpsToolStripMenuItem, + this.textlengthToolStripMenuItem}); + this.contextMenuStripParagraph.Name = "contextMenuStrip1"; + this.contextMenuStripParagraph.Size = new System.Drawing.Size(147, 290); + // + // insertHHMMSSMSToolStripMenuItem + // + this.insertHHMMSSMSToolStripMenuItem.Name = "insertHHMMSSMSToolStripMenuItem"; + this.insertHHMMSSMSToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.insertHHMMSSMSToolStripMenuItem.Text = "{start}"; + this.insertHHMMSSMSToolStripMenuItem.Click += new System.EventHandler(this.InsertTag); + // + // insertendToolStripMenuItem + // + this.insertendToolStripMenuItem.Name = "insertendToolStripMenuItem"; + this.insertendToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.insertendToolStripMenuItem.Text = "{end}"; + this.insertendToolStripMenuItem.Click += new System.EventHandler(this.InsertTag); + // + // insertnumberToolStripMenuItem + // + this.insertnumberToolStripMenuItem.Name = "insertnumberToolStripMenuItem"; + this.insertnumberToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.insertnumberToolStripMenuItem.Text = "{number}"; + this.insertnumberToolStripMenuItem.Click += new System.EventHandler(this.InsertTag); + // + // insertdurationToolStripMenuItem + // + this.insertdurationToolStripMenuItem.Name = "insertdurationToolStripMenuItem"; + this.insertdurationToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.insertdurationToolStripMenuItem.Text = "{duration}"; + this.insertdurationToolStripMenuItem.Click += new System.EventHandler(this.InsertTag); + // + // textToolStripMenuItem + // + this.textToolStripMenuItem.Name = "textToolStripMenuItem"; + this.textToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.textToolStripMenuItem.Text = "{text}"; + this.textToolStripMenuItem.Click += new System.EventHandler(this.InsertTag); + // + // translationToolStripMenuItem + // + this.translationToolStripMenuItem.Name = "translationToolStripMenuItem"; + this.translationToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.translationToolStripMenuItem.Text = "{translation}"; + this.translationToolStripMenuItem.Click += new System.EventHandler(this.InsertTag); + // + // toolStripMenuItemActor + // + this.toolStripMenuItemActor.Name = "toolStripMenuItemActor"; + this.toolStripMenuItemActor.Size = new System.Drawing.Size(180, 22); + this.toolStripMenuItemActor.Text = "{actor}"; + this.toolStripMenuItemActor.Click += new System.EventHandler(this.InsertTag); + // + // tabToolStripMenuItem + // + this.tabToolStripMenuItem.Name = "tabToolStripMenuItem"; + this.tabToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.tabToolStripMenuItem.Text = "{tab}"; + this.tabToolStripMenuItem.Click += new System.EventHandler(this.InsertTag); + // + // textToolStripMenuItem1 + // + this.textToolStripMenuItem1.Name = "textToolStripMenuItem1"; + this.textToolStripMenuItem1.Size = new System.Drawing.Size(180, 22); + this.textToolStripMenuItem1.Text = "{text-line-1}"; + this.textToolStripMenuItem1.Click += new System.EventHandler(this.InsertTag); + // + // textline2ToolStripMenuItem + // + this.textline2ToolStripMenuItem.Name = "textline2ToolStripMenuItem"; + this.textline2ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.textline2ToolStripMenuItem.Text = "{text-line-2}"; + this.textline2ToolStripMenuItem.Click += new System.EventHandler(this.InsertTag); + // + // labelHeader + // + this.labelHeader.AutoSize = true; + this.labelHeader.Location = new System.Drawing.Point(6, 64); + this.labelHeader.Name = "labelHeader"; + this.labelHeader.Size = new System.Drawing.Size(42, 13); + this.labelHeader.TabIndex = 2; + this.labelHeader.Text = "Header"; + // + // textBoxHeader + // + this.textBoxHeader.ContextMenuStrip = this.contextMenuStripHeader; + this.textBoxHeader.Location = new System.Drawing.Point(6, 80); + this.textBoxHeader.Multiline = true; + this.textBoxHeader.Name = "textBoxHeader"; + this.textBoxHeader.Size = new System.Drawing.Size(334, 64); + this.textBoxHeader.TabIndex = 3; + this.textBoxHeader.TextChanged += new System.EventHandler(this.TextBoxParagraphTextChanged); + // + // contextMenuStripHeader + // + this.contextMenuStripHeader.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItem1, + this.toolStripMenuItem2, + this.toolStripMenuItem7}); + this.contextMenuStripHeader.Name = "contextMenuStrip1"; + this.contextMenuStripHeader.Size = new System.Drawing.Size(114, 70); + // + // toolStripMenuItem1 + // + this.toolStripMenuItem1.Name = "toolStripMenuItem1"; + this.toolStripMenuItem1.Size = new System.Drawing.Size(113, 22); + this.toolStripMenuItem1.Text = "{title}"; + this.toolStripMenuItem1.Click += new System.EventHandler(this.InsertTagHeader); + // + // toolStripMenuItem2 + // + this.toolStripMenuItem2.Name = "toolStripMenuItem2"; + this.toolStripMenuItem2.Size = new System.Drawing.Size(113, 22); + this.toolStripMenuItem2.Text = "{#lines}"; + this.toolStripMenuItem2.Click += new System.EventHandler(this.InsertTagHeader); + // + // toolStripMenuItem7 + // + this.toolStripMenuItem7.Name = "toolStripMenuItem7"; + this.toolStripMenuItem7.Size = new System.Drawing.Size(113, 22); + this.toolStripMenuItem7.Text = "{tab}"; + this.toolStripMenuItem7.Click += new System.EventHandler(this.InsertTagHeader); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(628, 412); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 3; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(547, 412); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 2; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // groupBoxPreview + // + this.groupBoxPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxPreview.Controls.Add(this.textBoxPreview); + this.groupBoxPreview.Location = new System.Drawing.Point(364, 12); + this.groupBoxPreview.Name = "groupBoxPreview"; + this.groupBoxPreview.Size = new System.Drawing.Size(346, 393); + this.groupBoxPreview.TabIndex = 1; + this.groupBoxPreview.TabStop = false; + this.groupBoxPreview.Text = "Preview"; + // + // textBoxPreview + // + this.textBoxPreview.Dock = System.Windows.Forms.DockStyle.Fill; + this.textBoxPreview.Location = new System.Drawing.Point(3, 16); + this.textBoxPreview.Multiline = true; + this.textBoxPreview.Name = "textBoxPreview"; + this.textBoxPreview.ReadOnly = true; + this.textBoxPreview.Size = new System.Drawing.Size(340, 374); + this.textBoxPreview.TabIndex = 0; + // + // cpsToolStripMenuItem + // + this.cpsToolStripMenuItem.Name = "cpsToolStripMenuItem"; + this.cpsToolStripMenuItem.Size = new System.Drawing.Size(146, 22); + this.cpsToolStripMenuItem.Text = "{cps-comma}"; + this.cpsToolStripMenuItem.Click += new System.EventHandler(this.InsertTag); + // + // textlengthToolStripMenuItem + // + this.textlengthToolStripMenuItem.Name = "textlengthToolStripMenuItem"; + this.textlengthToolStripMenuItem.Size = new System.Drawing.Size(146, 22); + this.textlengthToolStripMenuItem.Text = "{text-length}"; + this.textlengthToolStripMenuItem.Click += new System.EventHandler(this.InsertTag); + // + // cpsperiodToolStripMenuItem + // + this.cpsperiodToolStripMenuItem.Name = "cpsperiodToolStripMenuItem"; + this.cpsperiodToolStripMenuItem.Size = new System.Drawing.Size(146, 22); + this.cpsperiodToolStripMenuItem.Text = "{cps-period}"; + this.cpsperiodToolStripMenuItem.Click += new System.EventHandler(this.InsertTag); + // + // ExportCustomTextFormat + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(715, 445); + this.Controls.Add(this.groupBoxPreview); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.groupBoxTemplate); + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(600, 450); + this.Name = "ExportCustomTextFormat"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Custom text format"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ExportCustomTextFormatKeyDown); + this.groupBoxTemplate.ResumeLayout(false); + this.groupBoxTemplate.PerformLayout(); + this.contextMenuStripFooter.ResumeLayout(false); + this.contextMenuStripParagraph.ResumeLayout(false); + this.contextMenuStripHeader.ResumeLayout(false); + this.groupBoxPreview.ResumeLayout(false); + this.groupBoxPreview.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBoxTemplate; + private System.Windows.Forms.Label labelHeader; + private System.Windows.Forms.TextBox textBoxHeader; + private System.Windows.Forms.Label labelFooter; + private System.Windows.Forms.Label labelTextLine; + private System.Windows.Forms.TextBox textBoxParagraph; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.TextBox textBoxFooter; + private System.Windows.Forms.ContextMenuStrip contextMenuStripParagraph; + private System.Windows.Forms.ToolStripMenuItem insertHHMMSSMSToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem insertendToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem insertnumberToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem insertdurationToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem textToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem tabToolStripMenuItem; + private System.Windows.Forms.ComboBox comboBoxNewLine; + private System.Windows.Forms.ComboBox comboBoxTimeCode; + private System.Windows.Forms.Label labelNewLine; + private System.Windows.Forms.Label labelTimeCode; + private System.Windows.Forms.GroupBox groupBoxPreview; + private System.Windows.Forms.TextBox textBoxPreview; + private System.Windows.Forms.TextBox textBoxName; + private System.Windows.Forms.Label labelName; + private System.Windows.Forms.ToolStripMenuItem translationToolStripMenuItem; + private System.Windows.Forms.ContextMenuStrip contextMenuStripHeader; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem2; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem7; + private System.Windows.Forms.ContextMenuStrip contextMenuStripFooter; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem3; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem4; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem5; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemActor; + private System.Windows.Forms.ToolStripMenuItem textToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem textline2ToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem cpsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem textlengthToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem cpsperiodToolStripMenuItem; + } } \ No newline at end of file diff --git a/src/Forms/ExportCustomTextFormat.cs b/src/ui/Forms/ExportCustomTextFormat.cs similarity index 97% rename from src/Forms/ExportCustomTextFormat.cs rename to src/ui/Forms/ExportCustomTextFormat.cs index 48fc4db46..ca3f4521c 100644 --- a/src/Forms/ExportCustomTextFormat.cs +++ b/src/ui/Forms/ExportCustomTextFormat.cs @@ -1,401 +1,401 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.SubtitleFormats; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Globalization; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class ExportCustomTextFormat : Form - { - public const string EnglishDoNotModify = "[Do not modify]"; - public string FormatOk { get; set; } - - public ExportCustomTextFormat(string format) - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - var l = Configuration.Settings.Language.ExportCustomTextFormat; - comboBoxNewLine.Items.Clear(); - comboBoxNewLine.Items.Add(l.DoNotModify); - comboBoxNewLine.Items.Add("||"); - comboBoxNewLine.Items.Add(" "); - comboBoxNewLine.Items.Add("{newline}"); - comboBoxNewLine.Items.Add("{tab}"); - comboBoxNewLine.Items.Add("{lf}"); - comboBoxNewLine.Items.Add("{cr}"); - - comboBoxTimeCode.Text = "hh:mm:ss,zzz"; - if (!string.IsNullOrEmpty(format)) - { - var arr = format.Split('Æ'); - if (arr.Length == 6) - { - textBoxName.Text = arr[0]; - textBoxHeader.Text = arr[1]; - if (!comboBoxTimeCode.Items.Contains(arr[3])) - { - comboBoxTimeCode.Items.Add(arr[3]); - } - - comboBoxTimeCode.Text = arr[3]; - textBoxParagraph.Text = arr[2]; - comboBoxNewLine.Text = arr[4].Replace(EnglishDoNotModify, l.DoNotModify); - textBoxFooter.Text = arr[5]; - } - } - GeneratePreview(); - - Text = l.Title; - labelName.Text = Configuration.Settings.Language.General.Name; - groupBoxTemplate.Text = l.Template; - labelTimeCode.Text = l.TimeCode; - labelNewLine.Text = l.NewLine; - labelHeader.Text = l.Header; - labelTextLine.Text = l.TextLine; - labelFooter.Text = l.Footer; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - groupBoxPreview.Text = Configuration.Settings.Language.General.Preview; - } - - private void ExportCustomTextFormatKeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - private void TextBoxParagraphTextChanged(object sender, EventArgs e) - { - GeneratePreview(); - } - - private void GeneratePreview() - { - var subtitle = new Subtitle(); - var p1 = new Paragraph("Line 1a." + Environment.NewLine + "Line 1b.", 1000, 3500) { Actor = "Joe" }; - var start1 = GetTimeCode(p1.StartTime, comboBoxTimeCode.Text); - var end1 = GetTimeCode(p1.EndTime, comboBoxTimeCode.Text); - var p2 = new Paragraph("Line 2a." + Environment.NewLine + "Line 2b.", 1000, 3500) { Actor = "Smith" }; - var start2 = GetTimeCode(p2.StartTime, comboBoxTimeCode.Text); - var end2 = GetTimeCode(p2.EndTime, comboBoxTimeCode.Text); - subtitle.Paragraphs.Add(p1); - subtitle.Paragraphs.Add(p2); - try - { - var newLine = comboBoxNewLine.Text.Replace(Configuration.Settings.Language.ExportCustomTextFormat.DoNotModify, EnglishDoNotModify); - var template = GetParagraphTemplate(textBoxParagraph.Text); - textBoxPreview.Text = GetHeaderOrFooter("Demo", subtitle, textBoxHeader.Text) + - GetParagraph(template, start1, end1, GetText(p1.Text, newLine), GetText("Line 1a." + Environment.NewLine + "Line 1b.", newLine), 0, p1.Actor, p1.Duration, comboBoxTimeCode.Text, Utilities.GetCharactersPerSecond(p1)) + - GetParagraph(template, start2, end2, GetText(p2.Text, newLine), GetText("Line 2a." + Environment.NewLine + "Line 2b.", newLine), 1, p2.Actor, p2.Duration, comboBoxTimeCode.Text, Utilities.GetCharactersPerSecond(p2)) + - GetHeaderOrFooter("Demo", subtitle, textBoxFooter.Text); - } - catch (Exception ex) - { - textBoxPreview.Text = ex.Message; - } - } - - public static string GetParagraphTemplate(string template) - { - var s = template.Replace("{start}", "{0}"); - s = s.Replace("{end}", "{1}"); - s = s.Replace("{text}", "{2}"); - s = s.Replace("{translation}", "{3}"); - s = s.Replace("{number}", "{4}"); - s = s.Replace("{number:", "{4:"); - s = s.Replace("{number-1}", "{5}"); - s = s.Replace("{number-1:", "{5:"); - s = s.Replace("{duration}", "{6}"); - s = s.Replace("{actor}", "{7}"); - s = s.Replace("{text-line-1}", "{8}"); - s = s.Replace("{text-line-2}", "{9}"); - s = s.Replace("{cps-comma}", "{10}"); - s = s.Replace("{cps-period}", "{11}"); - s = s.Replace("{text-length}", "{12}"); - s = s.Replace("{tab}", "\t"); - return s; - } - - public static string GetText(string text, string newLine) - { - if (!string.IsNullOrEmpty(newLine) && newLine != EnglishDoNotModify) - { - newLine = newLine.Replace("{newline}", Environment.NewLine); - newLine = newLine.Replace("{tab}", "\t"); - newLine = newLine.Replace("{lf}", "\n"); - newLine = newLine.Replace("{cr}", "\r"); - return text.Replace(Environment.NewLine, newLine); - } - return text; - } - - public static string GetTimeCode(TimeCode timeCode, string template) - { - var t = template; - var templateTrimmed = t.Trim(); - if (templateTrimmed == "ss") - { - t = t.Replace("ss", $"{timeCode.TotalSeconds:00}"); - } - - if (templateTrimmed == "s") - { - t = t.Replace("s", $"{timeCode.TotalSeconds}"); - } - - if (templateTrimmed == "zzz") - { - t = t.Replace("zzz", $"{timeCode.TotalMilliseconds:000}"); - } - - if (templateTrimmed == "z") - { - t = t.Replace("z", $"{timeCode.TotalMilliseconds}"); - } - - if (templateTrimmed == "ff") - { - t = t.Replace("ff", $"{SubtitleFormat.MillisecondsToFrames(timeCode.TotalMilliseconds)}"); - } - - var totalSeconds = (int)timeCode.TotalSeconds; - if (t.StartsWith("ssssssss", StringComparison.Ordinal)) - { - t = t.Replace("ssssssss", $"{totalSeconds:00000000}"); - } - - if (t.StartsWith("sssssss", StringComparison.Ordinal)) - { - t = t.Replace("sssssss", $"{totalSeconds:0000000}"); - } - - if (t.StartsWith("ssssss", StringComparison.Ordinal)) - { - t = t.Replace("ssssss", $"{totalSeconds:000000}"); - } - - if (t.StartsWith("sssss", StringComparison.Ordinal)) - { - t = t.Replace("sssss", $"{totalSeconds:00000}"); - } - - if (t.StartsWith("ssss", StringComparison.Ordinal)) - { - t = t.Replace("ssss", $"{totalSeconds:0000}"); - } - - if (t.StartsWith("sss", StringComparison.Ordinal)) - { - t = t.Replace("sss", $"{totalSeconds:000}"); - } - - if (t.StartsWith("ss", StringComparison.Ordinal)) - { - t = t.Replace("ss", $"{totalSeconds:00}"); - } - - var totalMilliseconds = (long)timeCode.TotalMilliseconds; - if (t.StartsWith("zzzzzzzz", StringComparison.Ordinal)) - { - t = t.Replace("zzzzzzzz", $"{totalMilliseconds:00000000}"); - } - - if (t.StartsWith("zzzzzzz", StringComparison.Ordinal)) - { - t = t.Replace("zzzzzzz", $"{totalMilliseconds:0000000}"); - } - - if (t.StartsWith("zzzzzz", StringComparison.Ordinal)) - { - t = t.Replace("zzzzzz", $"{totalMilliseconds:000000}"); - } - - if (t.StartsWith("zzzzz", StringComparison.Ordinal)) - { - t = t.Replace("zzzzz", $"{totalMilliseconds:00000}"); - } - - if (t.StartsWith("zzzz", StringComparison.Ordinal)) - { - t = t.Replace("zzzz", $"{totalMilliseconds:0000}"); - } - - if (t.StartsWith("zzz", StringComparison.Ordinal)) - { - t = t.Replace("zzz", $"{totalMilliseconds:000}"); - } - - t = t.Replace("hh", $"{timeCode.Hours:00}"); - t = t.Replace("h", $"{timeCode.Hours}"); - t = t.Replace("mm", $"{timeCode.Minutes:00}"); - t = t.Replace("m", $"{timeCode.Minutes}"); - t = t.Replace("ss", $"{timeCode.Seconds:00}"); - t = t.Replace("s", $"{timeCode.Seconds}"); - t = t.Replace("zzz", $"{timeCode.Milliseconds:000}"); - t = t.Replace("zz", $"{Math.Round(timeCode.Milliseconds / 10.0):00}"); - t = t.Replace("z", $"{Math.Round(timeCode.Milliseconds / 100.0):0}"); - t = t.Replace("ff", $"{SubtitleFormat.MillisecondsToFramesMaxFrameRate(timeCode.Milliseconds):00}"); - t = t.Replace("f", $"{SubtitleFormat.MillisecondsToFramesMaxFrameRate(timeCode.Milliseconds)}"); - return t; - } - - private void InsertTag(object sender, EventArgs e) - { - if (sender is ToolStripItem item) - { - textBoxParagraph.Text = textBoxParagraph.Text.Insert(textBoxParagraph.SelectionStart, item.Text); - } - } - - private void comboBoxTimeCode_SelectedIndexChanged(object sender, EventArgs e) - { - GeneratePreview(); - } - - private void comboBoxNewLine_SelectedIndexChanged(object sender, EventArgs e) - { - GeneratePreview(); - } - - private void comboBoxTimeCode_TextChanged(object sender, EventArgs e) - { - GeneratePreview(); - } - - private void comboBoxNewLine_TextChanged(object sender, EventArgs e) - { - GeneratePreview(); - } - - private void buttonOK_Click(object sender, EventArgs e) - { - FormatOk = textBoxName.Text + "Æ" + textBoxHeader.Text + "Æ" + textBoxParagraph.Text + "Æ" + comboBoxTimeCode.Text + "Æ" + comboBoxNewLine.Text.Replace(Configuration.Settings.Language.ExportCustomTextFormat.DoNotModify, EnglishDoNotModify) + "Æ" + textBoxFooter.Text; - DialogResult = DialogResult.OK; - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private void InsertTagHeader(object sender, EventArgs e) - { - if (sender is ToolStripItem item) - { - string s = item.Text; - textBoxHeader.Text = textBoxHeader.Text.Insert(textBoxHeader.SelectionStart, s); - } - } - - private void InsertTagFooter(object sender, EventArgs e) - { - if (sender is ToolStripItem item) - { - string s = item.Text; - textBoxFooter.Text = textBoxFooter.Text.Insert(textBoxFooter.SelectionStart, s); - } - } - - public static string GetHeaderOrFooter(string title, Subtitle subtitle, string template) - { - template = template.Replace("{title}", title); - template = template.Replace("{#lines}", subtitle.Paragraphs.Count.ToString(CultureInfo.InvariantCulture)); - template = template.Replace("{tab}", "\t"); - return template; - } - - internal static string GetParagraph(string template, string start, string end, string text, string translation, int number, string actor, TimeCode duration, string timeCodeTemplate, double cps) - { - string d = duration.ToString(); - if (timeCodeTemplate == "ff" || timeCodeTemplate == "f") - { - d = SubtitleFormat.MillisecondsToFrames(duration.TotalMilliseconds).ToString(CultureInfo.InvariantCulture); - } - - if (timeCodeTemplate == "zzz" || timeCodeTemplate == "zz" || timeCodeTemplate == "z") - { - d = duration.TotalMilliseconds.ToString(CultureInfo.InvariantCulture); - } - - if (timeCodeTemplate == "sss" || timeCodeTemplate == "ss" || timeCodeTemplate == "s") - { - d = duration.Seconds.ToString(CultureInfo.InvariantCulture); - } - else if (timeCodeTemplate.EndsWith("ss.ff", StringComparison.Ordinal)) - { - d = $"{duration.Seconds:00}.{SubtitleFormat.MillisecondsToFramesMaxFrameRate(duration.Milliseconds):00}"; - } - else if (timeCodeTemplate.EndsWith("ss:ff", StringComparison.Ordinal)) - { - d = $"{duration.Seconds:00}:{SubtitleFormat.MillisecondsToFramesMaxFrameRate(duration.Milliseconds):00}"; - } - else if (timeCodeTemplate.EndsWith("ss,ff", StringComparison.Ordinal)) - { - d = $"{duration.Seconds:00},{SubtitleFormat.MillisecondsToFramesMaxFrameRate(duration.Milliseconds):00}"; - } - else if (timeCodeTemplate.EndsWith("ss;ff", StringComparison.Ordinal)) - { - d = $"{duration.Seconds:00};{SubtitleFormat.MillisecondsToFramesMaxFrameRate(duration.Milliseconds):00}"; - } - else if (timeCodeTemplate.EndsWith("ss.zzz", StringComparison.Ordinal)) - { - d = $"{duration.Seconds:00}.{duration.Milliseconds:000}"; - } - else if (timeCodeTemplate.EndsWith("ss:zzz", StringComparison.Ordinal)) - { - d = $"{duration.Seconds:00}:{duration.Milliseconds:000}"; - } - else if (timeCodeTemplate.EndsWith("ss,zzz", StringComparison.Ordinal)) - { - d = $"{duration.Seconds:00},{duration.Milliseconds:000}"; - } - else if (timeCodeTemplate.EndsWith("ss;zzz", StringComparison.Ordinal)) - { - d = $"{duration.Seconds:00};{duration.Milliseconds:000}"; - } - else if (timeCodeTemplate.EndsWith("ss.zz", StringComparison.Ordinal)) - { - d = $"{duration.Seconds:00}.{Math.Round(duration.Milliseconds / 10.0):00}"; - } - else if (timeCodeTemplate.EndsWith("ss:zz", StringComparison.Ordinal)) - { - d = $"{duration.Seconds:00}:{Math.Round(duration.Milliseconds / 10.0):00}"; - } - else if (timeCodeTemplate.EndsWith("ss,zz", StringComparison.Ordinal)) - { - d = $"{duration.Seconds:00},{Math.Round(duration.Milliseconds / 10.0):00}"; - } - else if (timeCodeTemplate.EndsWith("ss;zz", StringComparison.Ordinal)) - { - d = $"{duration.Seconds:00};{Math.Round(duration.Milliseconds / 10.0):00}"; - } - - var lines = text.SplitToLines(); - var line1 = string.Empty; - var line2 = string.Empty; - if (lines.Count > 0) - { - line1 = lines[0]; - } - - if (lines.Count > 1) - { - line2 = lines[1]; - } - - string s = template; - s = s.Replace("{{", "@@@@_@@@{"); - s = s.Replace("}}", "}@@@_@@@@"); - s = string.Format(s, start, end, text, translation, number + 1, number, d, actor, line1, line2, cps.ToString(CultureInfo.InvariantCulture).Replace(".", ","), cps.ToString(CultureInfo.InvariantCulture), text.Length); - s = s.Replace("@@@@_@@@", "{"); - s = s.Replace("@@@_@@@@", "}"); - return s; - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.SubtitleFormats; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Globalization; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class ExportCustomTextFormat : Form + { + public const string EnglishDoNotModify = "[Do not modify]"; + public string FormatOk { get; set; } + + public ExportCustomTextFormat(string format) + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + var l = Configuration.Settings.Language.ExportCustomTextFormat; + comboBoxNewLine.Items.Clear(); + comboBoxNewLine.Items.Add(l.DoNotModify); + comboBoxNewLine.Items.Add("||"); + comboBoxNewLine.Items.Add(" "); + comboBoxNewLine.Items.Add("{newline}"); + comboBoxNewLine.Items.Add("{tab}"); + comboBoxNewLine.Items.Add("{lf}"); + comboBoxNewLine.Items.Add("{cr}"); + + comboBoxTimeCode.Text = "hh:mm:ss,zzz"; + if (!string.IsNullOrEmpty(format)) + { + var arr = format.Split('Æ'); + if (arr.Length == 6) + { + textBoxName.Text = arr[0]; + textBoxHeader.Text = arr[1]; + if (!comboBoxTimeCode.Items.Contains(arr[3])) + { + comboBoxTimeCode.Items.Add(arr[3]); + } + + comboBoxTimeCode.Text = arr[3]; + textBoxParagraph.Text = arr[2]; + comboBoxNewLine.Text = arr[4].Replace(EnglishDoNotModify, l.DoNotModify); + textBoxFooter.Text = arr[5]; + } + } + GeneratePreview(); + + Text = l.Title; + labelName.Text = Configuration.Settings.Language.General.Name; + groupBoxTemplate.Text = l.Template; + labelTimeCode.Text = l.TimeCode; + labelNewLine.Text = l.NewLine; + labelHeader.Text = l.Header; + labelTextLine.Text = l.TextLine; + labelFooter.Text = l.Footer; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + groupBoxPreview.Text = Configuration.Settings.Language.General.Preview; + } + + private void ExportCustomTextFormatKeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + private void TextBoxParagraphTextChanged(object sender, EventArgs e) + { + GeneratePreview(); + } + + private void GeneratePreview() + { + var subtitle = new Subtitle(); + var p1 = new Paragraph("Line 1a." + Environment.NewLine + "Line 1b.", 1000, 3500) { Actor = "Joe" }; + var start1 = GetTimeCode(p1.StartTime, comboBoxTimeCode.Text); + var end1 = GetTimeCode(p1.EndTime, comboBoxTimeCode.Text); + var p2 = new Paragraph("Line 2a." + Environment.NewLine + "Line 2b.", 1000, 3500) { Actor = "Smith" }; + var start2 = GetTimeCode(p2.StartTime, comboBoxTimeCode.Text); + var end2 = GetTimeCode(p2.EndTime, comboBoxTimeCode.Text); + subtitle.Paragraphs.Add(p1); + subtitle.Paragraphs.Add(p2); + try + { + var newLine = comboBoxNewLine.Text.Replace(Configuration.Settings.Language.ExportCustomTextFormat.DoNotModify, EnglishDoNotModify); + var template = GetParagraphTemplate(textBoxParagraph.Text); + textBoxPreview.Text = GetHeaderOrFooter("Demo", subtitle, textBoxHeader.Text) + + GetParagraph(template, start1, end1, GetText(p1.Text, newLine), GetText("Line 1a." + Environment.NewLine + "Line 1b.", newLine), 0, p1.Actor, p1.Duration, comboBoxTimeCode.Text, Utilities.GetCharactersPerSecond(p1)) + + GetParagraph(template, start2, end2, GetText(p2.Text, newLine), GetText("Line 2a." + Environment.NewLine + "Line 2b.", newLine), 1, p2.Actor, p2.Duration, comboBoxTimeCode.Text, Utilities.GetCharactersPerSecond(p2)) + + GetHeaderOrFooter("Demo", subtitle, textBoxFooter.Text); + } + catch (Exception ex) + { + textBoxPreview.Text = ex.Message; + } + } + + public static string GetParagraphTemplate(string template) + { + var s = template.Replace("{start}", "{0}"); + s = s.Replace("{end}", "{1}"); + s = s.Replace("{text}", "{2}"); + s = s.Replace("{translation}", "{3}"); + s = s.Replace("{number}", "{4}"); + s = s.Replace("{number:", "{4:"); + s = s.Replace("{number-1}", "{5}"); + s = s.Replace("{number-1:", "{5:"); + s = s.Replace("{duration}", "{6}"); + s = s.Replace("{actor}", "{7}"); + s = s.Replace("{text-line-1}", "{8}"); + s = s.Replace("{text-line-2}", "{9}"); + s = s.Replace("{cps-comma}", "{10}"); + s = s.Replace("{cps-period}", "{11}"); + s = s.Replace("{text-length}", "{12}"); + s = s.Replace("{tab}", "\t"); + return s; + } + + public static string GetText(string text, string newLine) + { + if (!string.IsNullOrEmpty(newLine) && newLine != EnglishDoNotModify) + { + newLine = newLine.Replace("{newline}", Environment.NewLine); + newLine = newLine.Replace("{tab}", "\t"); + newLine = newLine.Replace("{lf}", "\n"); + newLine = newLine.Replace("{cr}", "\r"); + return text.Replace(Environment.NewLine, newLine); + } + return text; + } + + public static string GetTimeCode(TimeCode timeCode, string template) + { + var t = template; + var templateTrimmed = t.Trim(); + if (templateTrimmed == "ss") + { + t = t.Replace("ss", $"{timeCode.TotalSeconds:00}"); + } + + if (templateTrimmed == "s") + { + t = t.Replace("s", $"{timeCode.TotalSeconds}"); + } + + if (templateTrimmed == "zzz") + { + t = t.Replace("zzz", $"{timeCode.TotalMilliseconds:000}"); + } + + if (templateTrimmed == "z") + { + t = t.Replace("z", $"{timeCode.TotalMilliseconds}"); + } + + if (templateTrimmed == "ff") + { + t = t.Replace("ff", $"{SubtitleFormat.MillisecondsToFrames(timeCode.TotalMilliseconds)}"); + } + + var totalSeconds = (int)timeCode.TotalSeconds; + if (t.StartsWith("ssssssss", StringComparison.Ordinal)) + { + t = t.Replace("ssssssss", $"{totalSeconds:00000000}"); + } + + if (t.StartsWith("sssssss", StringComparison.Ordinal)) + { + t = t.Replace("sssssss", $"{totalSeconds:0000000}"); + } + + if (t.StartsWith("ssssss", StringComparison.Ordinal)) + { + t = t.Replace("ssssss", $"{totalSeconds:000000}"); + } + + if (t.StartsWith("sssss", StringComparison.Ordinal)) + { + t = t.Replace("sssss", $"{totalSeconds:00000}"); + } + + if (t.StartsWith("ssss", StringComparison.Ordinal)) + { + t = t.Replace("ssss", $"{totalSeconds:0000}"); + } + + if (t.StartsWith("sss", StringComparison.Ordinal)) + { + t = t.Replace("sss", $"{totalSeconds:000}"); + } + + if (t.StartsWith("ss", StringComparison.Ordinal)) + { + t = t.Replace("ss", $"{totalSeconds:00}"); + } + + var totalMilliseconds = (long)timeCode.TotalMilliseconds; + if (t.StartsWith("zzzzzzzz", StringComparison.Ordinal)) + { + t = t.Replace("zzzzzzzz", $"{totalMilliseconds:00000000}"); + } + + if (t.StartsWith("zzzzzzz", StringComparison.Ordinal)) + { + t = t.Replace("zzzzzzz", $"{totalMilliseconds:0000000}"); + } + + if (t.StartsWith("zzzzzz", StringComparison.Ordinal)) + { + t = t.Replace("zzzzzz", $"{totalMilliseconds:000000}"); + } + + if (t.StartsWith("zzzzz", StringComparison.Ordinal)) + { + t = t.Replace("zzzzz", $"{totalMilliseconds:00000}"); + } + + if (t.StartsWith("zzzz", StringComparison.Ordinal)) + { + t = t.Replace("zzzz", $"{totalMilliseconds:0000}"); + } + + if (t.StartsWith("zzz", StringComparison.Ordinal)) + { + t = t.Replace("zzz", $"{totalMilliseconds:000}"); + } + + t = t.Replace("hh", $"{timeCode.Hours:00}"); + t = t.Replace("h", $"{timeCode.Hours}"); + t = t.Replace("mm", $"{timeCode.Minutes:00}"); + t = t.Replace("m", $"{timeCode.Minutes}"); + t = t.Replace("ss", $"{timeCode.Seconds:00}"); + t = t.Replace("s", $"{timeCode.Seconds}"); + t = t.Replace("zzz", $"{timeCode.Milliseconds:000}"); + t = t.Replace("zz", $"{Math.Round(timeCode.Milliseconds / 10.0):00}"); + t = t.Replace("z", $"{Math.Round(timeCode.Milliseconds / 100.0):0}"); + t = t.Replace("ff", $"{SubtitleFormat.MillisecondsToFramesMaxFrameRate(timeCode.Milliseconds):00}"); + t = t.Replace("f", $"{SubtitleFormat.MillisecondsToFramesMaxFrameRate(timeCode.Milliseconds)}"); + return t; + } + + private void InsertTag(object sender, EventArgs e) + { + if (sender is ToolStripItem item) + { + textBoxParagraph.Text = textBoxParagraph.Text.Insert(textBoxParagraph.SelectionStart, item.Text); + } + } + + private void comboBoxTimeCode_SelectedIndexChanged(object sender, EventArgs e) + { + GeneratePreview(); + } + + private void comboBoxNewLine_SelectedIndexChanged(object sender, EventArgs e) + { + GeneratePreview(); + } + + private void comboBoxTimeCode_TextChanged(object sender, EventArgs e) + { + GeneratePreview(); + } + + private void comboBoxNewLine_TextChanged(object sender, EventArgs e) + { + GeneratePreview(); + } + + private void buttonOK_Click(object sender, EventArgs e) + { + FormatOk = textBoxName.Text + "Æ" + textBoxHeader.Text + "Æ" + textBoxParagraph.Text + "Æ" + comboBoxTimeCode.Text + "Æ" + comboBoxNewLine.Text.Replace(Configuration.Settings.Language.ExportCustomTextFormat.DoNotModify, EnglishDoNotModify) + "Æ" + textBoxFooter.Text; + DialogResult = DialogResult.OK; + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void InsertTagHeader(object sender, EventArgs e) + { + if (sender is ToolStripItem item) + { + string s = item.Text; + textBoxHeader.Text = textBoxHeader.Text.Insert(textBoxHeader.SelectionStart, s); + } + } + + private void InsertTagFooter(object sender, EventArgs e) + { + if (sender is ToolStripItem item) + { + string s = item.Text; + textBoxFooter.Text = textBoxFooter.Text.Insert(textBoxFooter.SelectionStart, s); + } + } + + public static string GetHeaderOrFooter(string title, Subtitle subtitle, string template) + { + template = template.Replace("{title}", title); + template = template.Replace("{#lines}", subtitle.Paragraphs.Count.ToString(CultureInfo.InvariantCulture)); + template = template.Replace("{tab}", "\t"); + return template; + } + + internal static string GetParagraph(string template, string start, string end, string text, string translation, int number, string actor, TimeCode duration, string timeCodeTemplate, double cps) + { + string d = duration.ToString(); + if (timeCodeTemplate == "ff" || timeCodeTemplate == "f") + { + d = SubtitleFormat.MillisecondsToFrames(duration.TotalMilliseconds).ToString(CultureInfo.InvariantCulture); + } + + if (timeCodeTemplate == "zzz" || timeCodeTemplate == "zz" || timeCodeTemplate == "z") + { + d = duration.TotalMilliseconds.ToString(CultureInfo.InvariantCulture); + } + + if (timeCodeTemplate == "sss" || timeCodeTemplate == "ss" || timeCodeTemplate == "s") + { + d = duration.Seconds.ToString(CultureInfo.InvariantCulture); + } + else if (timeCodeTemplate.EndsWith("ss.ff", StringComparison.Ordinal)) + { + d = $"{duration.Seconds:00}.{SubtitleFormat.MillisecondsToFramesMaxFrameRate(duration.Milliseconds):00}"; + } + else if (timeCodeTemplate.EndsWith("ss:ff", StringComparison.Ordinal)) + { + d = $"{duration.Seconds:00}:{SubtitleFormat.MillisecondsToFramesMaxFrameRate(duration.Milliseconds):00}"; + } + else if (timeCodeTemplate.EndsWith("ss,ff", StringComparison.Ordinal)) + { + d = $"{duration.Seconds:00},{SubtitleFormat.MillisecondsToFramesMaxFrameRate(duration.Milliseconds):00}"; + } + else if (timeCodeTemplate.EndsWith("ss;ff", StringComparison.Ordinal)) + { + d = $"{duration.Seconds:00};{SubtitleFormat.MillisecondsToFramesMaxFrameRate(duration.Milliseconds):00}"; + } + else if (timeCodeTemplate.EndsWith("ss.zzz", StringComparison.Ordinal)) + { + d = $"{duration.Seconds:00}.{duration.Milliseconds:000}"; + } + else if (timeCodeTemplate.EndsWith("ss:zzz", StringComparison.Ordinal)) + { + d = $"{duration.Seconds:00}:{duration.Milliseconds:000}"; + } + else if (timeCodeTemplate.EndsWith("ss,zzz", StringComparison.Ordinal)) + { + d = $"{duration.Seconds:00},{duration.Milliseconds:000}"; + } + else if (timeCodeTemplate.EndsWith("ss;zzz", StringComparison.Ordinal)) + { + d = $"{duration.Seconds:00};{duration.Milliseconds:000}"; + } + else if (timeCodeTemplate.EndsWith("ss.zz", StringComparison.Ordinal)) + { + d = $"{duration.Seconds:00}.{Math.Round(duration.Milliseconds / 10.0):00}"; + } + else if (timeCodeTemplate.EndsWith("ss:zz", StringComparison.Ordinal)) + { + d = $"{duration.Seconds:00}:{Math.Round(duration.Milliseconds / 10.0):00}"; + } + else if (timeCodeTemplate.EndsWith("ss,zz", StringComparison.Ordinal)) + { + d = $"{duration.Seconds:00},{Math.Round(duration.Milliseconds / 10.0):00}"; + } + else if (timeCodeTemplate.EndsWith("ss;zz", StringComparison.Ordinal)) + { + d = $"{duration.Seconds:00};{Math.Round(duration.Milliseconds / 10.0):00}"; + } + + var lines = text.SplitToLines(); + var line1 = string.Empty; + var line2 = string.Empty; + if (lines.Count > 0) + { + line1 = lines[0]; + } + + if (lines.Count > 1) + { + line2 = lines[1]; + } + + string s = template; + s = s.Replace("{{", "@@@@_@@@{"); + s = s.Replace("}}", "}@@@_@@@@"); + s = string.Format(s, start, end, text, translation, number + 1, number, d, actor, line1, line2, cps.ToString(CultureInfo.InvariantCulture).Replace(".", ","), cps.ToString(CultureInfo.InvariantCulture), text.Length); + s = s.Replace("@@@@_@@@", "{"); + s = s.Replace("@@@_@@@@", "}"); + return s; + } + } +} diff --git a/src/Forms/ExportCustomTextFormat.resx b/src/ui/Forms/ExportCustomTextFormat.resx similarity index 98% rename from src/Forms/ExportCustomTextFormat.resx rename to src/ui/Forms/ExportCustomTextFormat.resx index 0fb26081b..ae1994e22 100644 --- a/src/Forms/ExportCustomTextFormat.resx +++ b/src/ui/Forms/ExportCustomTextFormat.resx @@ -1,129 +1,129 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 327, 17 - - - 17, 17 - - - 172, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 327, 17 + + + 17, 17 + + + 172, 17 + \ No newline at end of file diff --git a/src/Forms/ExportFcpXmlAdvanced.Designer.cs b/src/ui/Forms/ExportFcpXmlAdvanced.Designer.cs similarity index 100% rename from src/Forms/ExportFcpXmlAdvanced.Designer.cs rename to src/ui/Forms/ExportFcpXmlAdvanced.Designer.cs diff --git a/src/Forms/ExportFcpXmlAdvanced.cs b/src/ui/Forms/ExportFcpXmlAdvanced.cs similarity index 100% rename from src/Forms/ExportFcpXmlAdvanced.cs rename to src/ui/Forms/ExportFcpXmlAdvanced.cs diff --git a/src/Forms/ExportFcpXmlAdvanced.resx b/src/ui/Forms/ExportFcpXmlAdvanced.resx similarity index 100% rename from src/Forms/ExportFcpXmlAdvanced.resx rename to src/ui/Forms/ExportFcpXmlAdvanced.resx diff --git a/src/Forms/ExportPngXml.Designer.cs b/src/ui/Forms/ExportPngXml.Designer.cs similarity index 98% rename from src/Forms/ExportPngXml.Designer.cs rename to src/ui/Forms/ExportPngXml.Designer.cs index f0d3247a8..08a63d31f 100644 --- a/src/Forms/ExportPngXml.Designer.cs +++ b/src/ui/Forms/ExportPngXml.Designer.cs @@ -1,1175 +1,1175 @@ -namespace Nikse.SubtitleEdit.Forms -{ - partial class ExportPngXml - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.pictureBox1 = new System.Windows.Forms.PictureBox(); - this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); - this.saveImageAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.buttonExport = new System.Windows.Forms.Button(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.folderBrowserDialog1 = new System.Windows.Forms.FolderBrowserDialog(); - this.progressBar1 = new System.Windows.Forms.ProgressBar(); - this.groupBoxImageSettings = new System.Windows.Forms.GroupBox(); - this.labelResize = new System.Windows.Forms.Label(); - this.comboBoxResizePercentage = new System.Windows.Forms.ComboBox(); - this.comboBoxBottomMarginUnit = new System.Windows.Forms.ComboBox(); - this.comboBoxLeftRightMarginUnit = new System.Windows.Forms.ComboBox(); - this.labelLineHeightStyle = new System.Windows.Forms.Label(); - this.panelFullFrameBackground = new System.Windows.Forms.Panel(); - this.comboBoxLeftRightMargin = new System.Windows.Forms.ComboBox(); - this.checkBoxFullFrameImage = new System.Windows.Forms.CheckBox(); - this.checkBoxTransAntiAliase = new System.Windows.Forms.CheckBox(); - this.labelLineHeight = new System.Windows.Forms.Label(); - this.numericUpDownLineSpacing = new System.Windows.Forms.NumericUpDown(); - this.numericUpDownShadowTransparency = new System.Windows.Forms.NumericUpDown(); - this.labelShadowTransparency = new System.Windows.Forms.Label(); - this.labelShadowWidth = new System.Windows.Forms.Label(); - this.comboBoxShadowWidth = new System.Windows.Forms.ComboBox(); - this.panelShadowColor = new System.Windows.Forms.Panel(); - this.buttonShadowColor = new System.Windows.Forms.Button(); - this.labelDepth = new System.Windows.Forms.Label(); - this.label3D = new System.Windows.Forms.Label(); - this.comboBox3D = new System.Windows.Forms.ComboBox(); - this.numericUpDownDepth3D = new System.Windows.Forms.NumericUpDown(); - this.buttonCustomResolution = new System.Windows.Forms.Button(); - this.comboBoxBottomMargin = new System.Windows.Forms.ComboBox(); - this.labelBottomMargin = new System.Windows.Forms.Label(); - this.labelFrameRate = new System.Windows.Forms.Label(); - this.comboBoxFrameRate = new System.Windows.Forms.ComboBox(); - this.labelLanguage = new System.Windows.Forms.Label(); - this.comboBoxLanguage = new System.Windows.Forms.ComboBox(); - this.labelImageFormat = new System.Windows.Forms.Label(); - this.comboBoxImageFormat = new System.Windows.Forms.ComboBox(); - this.checkBoxBold = new System.Windows.Forms.CheckBox(); - this.labelResolution = new System.Windows.Forms.Label(); - this.comboBoxResolution = new System.Windows.Forms.ComboBox(); - this.comboBoxHAlign = new System.Windows.Forms.ComboBox(); - this.labelHorizontalAlign = new System.Windows.Forms.Label(); - this.checkBoxSimpleRender = new System.Windows.Forms.CheckBox(); - this.labelSubtitleFontSize = new System.Windows.Forms.Label(); - this.comboBoxSubtitleFont = new System.Windows.Forms.ComboBox(); - this.comboBoxSubtitleFontSize = new System.Windows.Forms.ComboBox(); - this.labelSubtitleFont = new System.Windows.Forms.Label(); - this.labelBorderWidth = new System.Windows.Forms.Label(); - this.comboBoxBorderWidth = new System.Windows.Forms.ComboBox(); - this.panelBorderColor = new System.Windows.Forms.Panel(); - this.buttonBorderColor = new System.Windows.Forms.Button(); - this.panelColor = new System.Windows.Forms.Panel(); - this.buttonColor = new System.Windows.Forms.Button(); - this.checkBoxSkipEmptyFrameAtStart = new System.Windows.Forms.CheckBox(); - this.checkBoxFcpFullPathUrl = new System.Windows.Forms.CheckBox(); - this.labelLeftRightMargin = new System.Windows.Forms.Label(); - this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog(); - this.groupBoxExportImage = new System.Windows.Forms.GroupBox(); - this.linkLabelPreview = new System.Windows.Forms.LinkLabel(); - this.panelVlcTemp = new System.Windows.Forms.Panel(); - this.timerPreview = new System.Windows.Forms.Timer(this.components); - this.contextMenuStripListView = new System.Windows.Forms.ContextMenuStrip(this.components); - this.normalToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.italicToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.boxSingleLineToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.boxMultiLineToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparatorAdjust = new System.Windows.Forms.ToolStripSeparator(); - this.adjustDisplayTimeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.adjustTimeCodesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.subtitleListView1 = new System.Windows.Forms.ListView(); - this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); - this.contextMenuStrip1.SuspendLayout(); - this.groupBoxImageSettings.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownLineSpacing)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownShadowTransparency)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDepth3D)).BeginInit(); - this.groupBoxExportImage.SuspendLayout(); - this.contextMenuStripListView.SuspendLayout(); - this.SuspendLayout(); - // - // pictureBox1 - // - this.pictureBox1.ContextMenuStrip = this.contextMenuStrip1; - this.pictureBox1.Location = new System.Drawing.Point(6, 19); - this.pictureBox1.Name = "pictureBox1"; - this.pictureBox1.Size = new System.Drawing.Size(553, 152); - this.pictureBox1.TabIndex = 1; - this.pictureBox1.TabStop = false; - // - // contextMenuStrip1 - // - this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.saveImageAsToolStripMenuItem}); - this.contextMenuStrip1.Name = "contextMenuStrip1"; - this.contextMenuStrip1.Size = new System.Drawing.Size(158, 26); - // - // saveImageAsToolStripMenuItem - // - this.saveImageAsToolStripMenuItem.Name = "saveImageAsToolStripMenuItem"; - this.saveImageAsToolStripMenuItem.Size = new System.Drawing.Size(157, 22); - this.saveImageAsToolStripMenuItem.Text = "Save image as..."; - this.saveImageAsToolStripMenuItem.Click += new System.EventHandler(this.saveImageAsToolStripMenuItem_Click); - // - // buttonExport - // - this.buttonExport.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonExport.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonExport.Location = new System.Drawing.Point(768, 597); - this.buttonExport.Name = "buttonExport"; - this.buttonExport.Size = new System.Drawing.Size(126, 23); - this.buttonExport.TabIndex = 6; - this.buttonExport.Text = "Export all lines..."; - this.buttonExport.UseVisualStyleBackColor = true; - this.buttonExport.Click += new System.EventHandler(this.ButtonExportClick); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(894, 597); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 0; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - // - // progressBar1 - // - this.progressBar1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.progressBar1.Location = new System.Drawing.Point(12, 599); - this.progressBar1.Name = "progressBar1"; - this.progressBar1.Size = new System.Drawing.Size(750, 21); - this.progressBar1.TabIndex = 5; - this.progressBar1.Visible = false; - // - // groupBoxImageSettings - // - this.groupBoxImageSettings.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxImageSettings.Controls.Add(this.labelResize); - this.groupBoxImageSettings.Controls.Add(this.comboBoxResizePercentage); - this.groupBoxImageSettings.Controls.Add(this.comboBoxBottomMarginUnit); - this.groupBoxImageSettings.Controls.Add(this.comboBoxLeftRightMarginUnit); - this.groupBoxImageSettings.Controls.Add(this.labelLineHeightStyle); - this.groupBoxImageSettings.Controls.Add(this.panelFullFrameBackground); - this.groupBoxImageSettings.Controls.Add(this.comboBoxLeftRightMargin); - this.groupBoxImageSettings.Controls.Add(this.checkBoxFullFrameImage); - this.groupBoxImageSettings.Controls.Add(this.checkBoxTransAntiAliase); - this.groupBoxImageSettings.Controls.Add(this.labelLineHeight); - this.groupBoxImageSettings.Controls.Add(this.numericUpDownLineSpacing); - this.groupBoxImageSettings.Controls.Add(this.numericUpDownShadowTransparency); - this.groupBoxImageSettings.Controls.Add(this.labelShadowTransparency); - this.groupBoxImageSettings.Controls.Add(this.labelShadowWidth); - this.groupBoxImageSettings.Controls.Add(this.comboBoxShadowWidth); - this.groupBoxImageSettings.Controls.Add(this.panelShadowColor); - this.groupBoxImageSettings.Controls.Add(this.buttonShadowColor); - this.groupBoxImageSettings.Controls.Add(this.labelDepth); - this.groupBoxImageSettings.Controls.Add(this.label3D); - this.groupBoxImageSettings.Controls.Add(this.comboBox3D); - this.groupBoxImageSettings.Controls.Add(this.numericUpDownDepth3D); - this.groupBoxImageSettings.Controls.Add(this.buttonCustomResolution); - this.groupBoxImageSettings.Controls.Add(this.comboBoxBottomMargin); - this.groupBoxImageSettings.Controls.Add(this.labelBottomMargin); - this.groupBoxImageSettings.Controls.Add(this.labelFrameRate); - this.groupBoxImageSettings.Controls.Add(this.comboBoxFrameRate); - this.groupBoxImageSettings.Controls.Add(this.labelLanguage); - this.groupBoxImageSettings.Controls.Add(this.comboBoxLanguage); - this.groupBoxImageSettings.Controls.Add(this.labelImageFormat); - this.groupBoxImageSettings.Controls.Add(this.comboBoxImageFormat); - this.groupBoxImageSettings.Controls.Add(this.checkBoxBold); - this.groupBoxImageSettings.Controls.Add(this.labelResolution); - this.groupBoxImageSettings.Controls.Add(this.comboBoxResolution); - this.groupBoxImageSettings.Controls.Add(this.comboBoxHAlign); - this.groupBoxImageSettings.Controls.Add(this.labelHorizontalAlign); - this.groupBoxImageSettings.Controls.Add(this.checkBoxSimpleRender); - this.groupBoxImageSettings.Controls.Add(this.labelSubtitleFontSize); - this.groupBoxImageSettings.Controls.Add(this.comboBoxSubtitleFont); - this.groupBoxImageSettings.Controls.Add(this.comboBoxSubtitleFontSize); - this.groupBoxImageSettings.Controls.Add(this.labelSubtitleFont); - this.groupBoxImageSettings.Controls.Add(this.labelBorderWidth); - this.groupBoxImageSettings.Controls.Add(this.comboBoxBorderWidth); - this.groupBoxImageSettings.Controls.Add(this.panelBorderColor); - this.groupBoxImageSettings.Controls.Add(this.buttonBorderColor); - this.groupBoxImageSettings.Controls.Add(this.panelColor); - this.groupBoxImageSettings.Controls.Add(this.buttonColor); - this.groupBoxImageSettings.Controls.Add(this.checkBoxSkipEmptyFrameAtStart); - this.groupBoxImageSettings.Controls.Add(this.checkBoxFcpFullPathUrl); - this.groupBoxImageSettings.Controls.Add(this.labelLeftRightMargin); - this.groupBoxImageSettings.Location = new System.Drawing.Point(12, 218); - this.groupBoxImageSettings.Name = "groupBoxImageSettings"; - this.groupBoxImageSettings.Size = new System.Drawing.Size(963, 191); - this.groupBoxImageSettings.TabIndex = 3; - this.groupBoxImageSettings.TabStop = false; - this.groupBoxImageSettings.Text = "Image settings"; - // - // labelResize - // - this.labelResize.AutoSize = true; - this.labelResize.Location = new System.Drawing.Point(263, 8); - this.labelResize.Name = "labelResize"; - this.labelResize.Size = new System.Drawing.Size(39, 13); - this.labelResize.TabIndex = 61; - this.labelResize.Text = "Resize"; - this.labelResize.Visible = false; - // - // comboBoxResizePercentage - // - this.comboBoxResizePercentage.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxResizePercentage.FormattingEnabled = true; - this.comboBoxResizePercentage.Location = new System.Drawing.Point(308, 5); - this.comboBoxResizePercentage.Name = "comboBoxResizePercentage"; - this.comboBoxResizePercentage.Size = new System.Drawing.Size(77, 21); - this.comboBoxResizePercentage.TabIndex = 18; - this.comboBoxResizePercentage.Visible = false; - this.comboBoxResizePercentage.SelectedIndexChanged += new System.EventHandler(this.comboBoxResizePercentage_SelectedIndexChanged); - // - // comboBoxBottomMarginUnit - // - this.comboBoxBottomMarginUnit.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxBottomMarginUnit.FormattingEnabled = true; - this.comboBoxBottomMarginUnit.Items.AddRange(new object[] { - "%", - "px"}); - this.comboBoxBottomMarginUnit.Location = new System.Drawing.Point(181, 132); - this.comboBoxBottomMarginUnit.Name = "comboBoxBottomMarginUnit"; - this.comboBoxBottomMarginUnit.Size = new System.Drawing.Size(54, 21); - this.comboBoxBottomMarginUnit.TabIndex = 14; - this.comboBoxBottomMarginUnit.SelectedIndexChanged += new System.EventHandler(this.comboBoxBottomMarginUnit_SelectedIndexChanged); - // - // comboBoxLeftRightMarginUnit - // - this.comboBoxLeftRightMarginUnit.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxLeftRightMarginUnit.FormattingEnabled = true; - this.comboBoxLeftRightMarginUnit.Items.AddRange(new object[] { - "%", - "px"}); - this.comboBoxLeftRightMarginUnit.Location = new System.Drawing.Point(181, 159); - this.comboBoxLeftRightMarginUnit.Name = "comboBoxLeftRightMarginUnit"; - this.comboBoxLeftRightMarginUnit.Size = new System.Drawing.Size(54, 21); - this.comboBoxLeftRightMarginUnit.TabIndex = 17; - this.comboBoxLeftRightMarginUnit.SelectedIndexChanged += new System.EventHandler(this.comboBoxLeftRightMarginUnit_SelectedIndexChanged); - // - // labelLineHeightStyle - // - this.labelLineHeightStyle.AutoSize = true; - this.labelLineHeightStyle.Location = new System.Drawing.Point(799, 153); - this.labelLineHeightStyle.Name = "labelLineHeightStyle"; - this.labelLineHeightStyle.Size = new System.Drawing.Size(103, 13); - this.labelLineHeightStyle.TabIndex = 59; - this.labelLineHeightStyle.Text = "labelLineHeightStyle"; - // - // panelFullFrameBackground - // - this.panelFullFrameBackground.BackColor = System.Drawing.Color.Transparent; - this.panelFullFrameBackground.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.panelFullFrameBackground.Location = new System.Drawing.Point(677, 104); - this.panelFullFrameBackground.Name = "panelFullFrameBackground"; - this.panelFullFrameBackground.Size = new System.Drawing.Size(21, 20); - this.panelFullFrameBackground.TabIndex = 36; - this.panelFullFrameBackground.Visible = false; - this.panelFullFrameBackground.Click += new System.EventHandler(this.panelFullFrameBackground_Click); - // - // comboBoxLeftRightMargin - // - this.comboBoxLeftRightMargin.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxLeftRightMargin.FormattingEnabled = true; - this.comboBoxLeftRightMargin.Location = new System.Drawing.Point(112, 159); - this.comboBoxLeftRightMargin.Name = "comboBoxLeftRightMargin"; - this.comboBoxLeftRightMargin.Size = new System.Drawing.Size(63, 21); - this.comboBoxLeftRightMargin.TabIndex = 16; - this.comboBoxLeftRightMargin.SelectedIndexChanged += new System.EventHandler(this.comboBoxLeftRightMargin_SelectedIndexChanged); - // - // checkBoxFullFrameImage - // - this.checkBoxFullFrameImage.AutoSize = true; - this.checkBoxFullFrameImage.Location = new System.Drawing.Point(543, 104); - this.checkBoxFullFrameImage.Name = "checkBoxFullFrameImage"; - this.checkBoxFullFrameImage.Size = new System.Drawing.Size(102, 17); - this.checkBoxFullFrameImage.TabIndex = 34; - this.checkBoxFullFrameImage.Text = "Full frame image"; - this.checkBoxFullFrameImage.UseVisualStyleBackColor = true; - this.checkBoxFullFrameImage.CheckedChanged += new System.EventHandler(this.checkBoxFullFrameImage_CheckedChanged); - // - // checkBoxTransAntiAliase - // - this.checkBoxTransAntiAliase.AutoSize = true; - this.checkBoxTransAntiAliase.Location = new System.Drawing.Point(287, 92); - this.checkBoxTransAntiAliase.Name = "checkBoxTransAntiAliase"; - this.checkBoxTransAntiAliase.Size = new System.Drawing.Size(162, 17); - this.checkBoxTransAntiAliase.TabIndex = 21; - this.checkBoxTransAntiAliase.Text = "Anti-alising with transparency"; - this.checkBoxTransAntiAliase.UseVisualStyleBackColor = true; - this.checkBoxTransAntiAliase.CheckedChanged += new System.EventHandler(this.checkBoxAntiAlias_CheckedChanged); - // - // labelLineHeight - // - this.labelLineHeight.Location = new System.Drawing.Point(686, 132); - this.labelLineHeight.Name = "labelLineHeight"; - this.labelLineHeight.RightToLeft = System.Windows.Forms.RightToLeft.No; - this.labelLineHeight.Size = new System.Drawing.Size(110, 16); - this.labelLineHeight.TabIndex = 54; - this.labelLineHeight.Text = "Line height"; - this.labelLineHeight.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // numericUpDownLineSpacing - // - this.numericUpDownLineSpacing.Location = new System.Drawing.Point(802, 130); - this.numericUpDownLineSpacing.Maximum = new decimal(new int[] { - 500, - 0, - 0, - 0}); - this.numericUpDownLineSpacing.Name = "numericUpDownLineSpacing"; - this.numericUpDownLineSpacing.Size = new System.Drawing.Size(47, 20); - this.numericUpDownLineSpacing.TabIndex = 44; - this.numericUpDownLineSpacing.Value = new decimal(new int[] { - 10, - 0, - 0, - 0}); - this.numericUpDownLineSpacing.ValueChanged += new System.EventHandler(this.numericUpDownLineSpacing_ValueChanged); - this.numericUpDownLineSpacing.KeyUp += new System.Windows.Forms.KeyEventHandler(this.numericUpDownLineSpacing_KeyUp); - // - // numericUpDownShadowTransparency - // - this.numericUpDownShadowTransparency.Location = new System.Drawing.Point(802, 81); - this.numericUpDownShadowTransparency.Maximum = new decimal(new int[] { - 255, - 0, - 0, - 0}); - this.numericUpDownShadowTransparency.Minimum = new decimal(new int[] { - 1, - 0, - 0, - 0}); - this.numericUpDownShadowTransparency.Name = "numericUpDownShadowTransparency"; - this.numericUpDownShadowTransparency.Size = new System.Drawing.Size(47, 20); - this.numericUpDownShadowTransparency.TabIndex = 43; - this.numericUpDownShadowTransparency.Value = new decimal(new int[] { - 200, - 0, - 0, - 0}); - this.numericUpDownShadowTransparency.ValueChanged += new System.EventHandler(this.numericUpDownShadowTransparency_ValueChanged); - // - // labelShadowTransparency - // - this.labelShadowTransparency.Location = new System.Drawing.Point(686, 83); - this.labelShadowTransparency.Name = "labelShadowTransparency"; - this.labelShadowTransparency.RightToLeft = System.Windows.Forms.RightToLeft.No; - this.labelShadowTransparency.Size = new System.Drawing.Size(110, 13); - this.labelShadowTransparency.TabIndex = 39; - this.labelShadowTransparency.Text = "Transparency"; - this.labelShadowTransparency.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // labelShadowWidth - // - this.labelShadowWidth.Location = new System.Drawing.Point(686, 55); - this.labelShadowWidth.Name = "labelShadowWidth"; - this.labelShadowWidth.RightToLeft = System.Windows.Forms.RightToLeft.No; - this.labelShadowWidth.Size = new System.Drawing.Size(110, 13); - this.labelShadowWidth.TabIndex = 35; - this.labelShadowWidth.Text = "Shadow width"; - this.labelShadowWidth.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // comboBoxShadowWidth - // - this.comboBoxShadowWidth.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxShadowWidth.FormattingEnabled = true; - this.comboBoxShadowWidth.Items.AddRange(new object[] { - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "10", - "11", - "12", - "13", - "14", - "15"}); - this.comboBoxShadowWidth.Location = new System.Drawing.Point(802, 52); - this.comboBoxShadowWidth.Name = "comboBoxShadowWidth"; - this.comboBoxShadowWidth.Size = new System.Drawing.Size(121, 21); - this.comboBoxShadowWidth.TabIndex = 42; - this.comboBoxShadowWidth.SelectedIndexChanged += new System.EventHandler(this.comboBoxShadowWidth_SelectedIndexChanged); - // - // panelShadowColor - // - this.panelShadowColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.panelShadowColor.Location = new System.Drawing.Point(929, 26); - this.panelShadowColor.Name = "panelShadowColor"; - this.panelShadowColor.Size = new System.Drawing.Size(21, 20); - this.panelShadowColor.TabIndex = 41; - this.panelShadowColor.MouseClick += new System.Windows.Forms.MouseEventHandler(this.panelShadowColor_MouseClick); - // - // buttonShadowColor - // - this.buttonShadowColor.Location = new System.Drawing.Point(802, 25); - this.buttonShadowColor.Name = "buttonShadowColor"; - this.buttonShadowColor.Size = new System.Drawing.Size(121, 23); - this.buttonShadowColor.TabIndex = 40; - this.buttonShadowColor.Text = "Shadow color"; - this.buttonShadowColor.UseVisualStyleBackColor = true; - this.buttonShadowColor.Click += new System.EventHandler(this.buttonShadowColor_Click); - // - // labelDepth - // - this.labelDepth.Location = new System.Drawing.Point(247, 134); - this.labelDepth.Name = "labelDepth"; - this.labelDepth.Size = new System.Drawing.Size(100, 18); - this.labelDepth.TabIndex = 18; - this.labelDepth.Text = "Depth"; - this.labelDepth.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // label3D - // - this.label3D.AutoSize = true; - this.label3D.Location = new System.Drawing.Point(284, 113); - this.label3D.Name = "label3D"; - this.label3D.Size = new System.Drawing.Size(21, 13); - this.label3D.TabIndex = 16; - this.label3D.Text = "3D"; - // - // comboBox3D - // - this.comboBox3D.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBox3D.FormattingEnabled = true; - this.comboBox3D.Location = new System.Drawing.Point(309, 110); - this.comboBox3D.Name = "comboBox3D"; - this.comboBox3D.Size = new System.Drawing.Size(112, 21); - this.comboBox3D.TabIndex = 22; - this.comboBox3D.SelectedIndexChanged += new System.EventHandler(this.comboBox3D_SelectedIndexChanged); - // - // numericUpDownDepth3D - // - this.numericUpDownDepth3D.Location = new System.Drawing.Point(353, 135); - this.numericUpDownDepth3D.Minimum = new decimal(new int[] { - 100, - 0, - 0, - -2147483648}); - this.numericUpDownDepth3D.Name = "numericUpDownDepth3D"; - this.numericUpDownDepth3D.Size = new System.Drawing.Size(47, 20); - this.numericUpDownDepth3D.TabIndex = 23; - this.numericUpDownDepth3D.ValueChanged += new System.EventHandler(this.numericUpDownDepth3D_ValueChanged); - // - // buttonCustomResolution - // - this.buttonCustomResolution.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCustomResolution.Location = new System.Drawing.Point(238, 78); - this.buttonCustomResolution.Name = "buttonCustomResolution"; - this.buttonCustomResolution.Size = new System.Drawing.Size(24, 21); - this.buttonCustomResolution.TabIndex = 6; - this.buttonCustomResolution.Text = "..."; - this.buttonCustomResolution.UseVisualStyleBackColor = true; - this.buttonCustomResolution.Click += new System.EventHandler(this.buttonCustomResolution_Click); - // - // comboBoxBottomMargin - // - this.comboBoxBottomMargin.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxBottomMargin.FormattingEnabled = true; - this.comboBoxBottomMargin.Location = new System.Drawing.Point(112, 132); - this.comboBoxBottomMargin.Name = "comboBoxBottomMargin"; - this.comboBoxBottomMargin.Size = new System.Drawing.Size(63, 21); - this.comboBoxBottomMargin.TabIndex = 10; - this.comboBoxBottomMargin.SelectedIndexChanged += new System.EventHandler(this.comboBoxBottomMargin_SelectedIndexChanged); - // - // labelBottomMargin - // - this.labelBottomMargin.AutoSize = true; - this.labelBottomMargin.Location = new System.Drawing.Point(6, 135); - this.labelBottomMargin.Name = "labelBottomMargin"; - this.labelBottomMargin.Size = new System.Drawing.Size(74, 13); - this.labelBottomMargin.TabIndex = 9; - this.labelBottomMargin.Text = "Bottom margin"; - // - // labelFrameRate - // - this.labelFrameRate.Location = new System.Drawing.Point(427, 137); - this.labelFrameRate.Name = "labelFrameRate"; - this.labelFrameRate.RightToLeft = System.Windows.Forms.RightToLeft.No; - this.labelFrameRate.Size = new System.Drawing.Size(110, 13); - this.labelFrameRate.TabIndex = 34; - this.labelFrameRate.Text = "Frame rate"; - this.labelFrameRate.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - this.labelFrameRate.Visible = false; - // - // comboBoxFrameRate - // - this.comboBoxFrameRate.FormattingEnabled = true; - this.comboBoxFrameRate.Location = new System.Drawing.Point(543, 134); - this.comboBoxFrameRate.Name = "comboBoxFrameRate"; - this.comboBoxFrameRate.Size = new System.Drawing.Size(128, 21); - this.comboBoxFrameRate.TabIndex = 37; - // - // labelLanguage - // - this.labelLanguage.Location = new System.Drawing.Point(427, 108); - this.labelLanguage.Name = "labelLanguage"; - this.labelLanguage.RightToLeft = System.Windows.Forms.RightToLeft.No; - this.labelLanguage.Size = new System.Drawing.Size(110, 13); - this.labelLanguage.TabIndex = 30; - this.labelLanguage.Text = "Language"; - this.labelLanguage.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - this.labelLanguage.Visible = false; - // - // comboBoxLanguage - // - this.comboBoxLanguage.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxLanguage.FormattingEnabled = true; - this.comboBoxLanguage.Items.AddRange(new object[] { - "Bmp", - "Exif", - "Gif", - "Jpg", - "Png", - "Tiff"}); - this.comboBoxLanguage.Location = new System.Drawing.Point(543, 105); - this.comboBoxLanguage.Name = "comboBoxLanguage"; - this.comboBoxLanguage.Size = new System.Drawing.Size(128, 21); - this.comboBoxLanguage.TabIndex = 35; - this.comboBoxLanguage.Visible = false; - // - // labelImageFormat - // - this.labelImageFormat.Location = new System.Drawing.Point(427, 81); - this.labelImageFormat.Name = "labelImageFormat"; - this.labelImageFormat.RightToLeft = System.Windows.Forms.RightToLeft.No; - this.labelImageFormat.Size = new System.Drawing.Size(110, 13); - this.labelImageFormat.TabIndex = 28; - this.labelImageFormat.Text = "Image format"; - this.labelImageFormat.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // comboBoxImageFormat - // - this.comboBoxImageFormat.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxImageFormat.FormattingEnabled = true; - this.comboBoxImageFormat.Items.AddRange(new object[] { - "Bmp", - "Exif", - "Gif", - "Jpg", - "Png", - "Tiff", - "Tga"}); - this.comboBoxImageFormat.Location = new System.Drawing.Point(543, 78); - this.comboBoxImageFormat.Name = "comboBoxImageFormat"; - this.comboBoxImageFormat.Size = new System.Drawing.Size(128, 21); - this.comboBoxImageFormat.TabIndex = 33; - // - // checkBoxBold - // - this.checkBoxBold.AutoSize = true; - this.checkBoxBold.Location = new System.Drawing.Point(287, 50); - this.checkBoxBold.Name = "checkBoxBold"; - this.checkBoxBold.Size = new System.Drawing.Size(47, 17); - this.checkBoxBold.TabIndex = 19; - this.checkBoxBold.Text = "Bold"; - this.checkBoxBold.UseVisualStyleBackColor = true; - this.checkBoxBold.CheckedChanged += new System.EventHandler(this.checkBoxBold_CheckedChanged); - // - // labelResolution - // - this.labelResolution.AutoSize = true; - this.labelResolution.Location = new System.Drawing.Point(6, 81); - this.labelResolution.Name = "labelResolution"; - this.labelResolution.Size = new System.Drawing.Size(51, 13); - this.labelResolution.TabIndex = 4; - this.labelResolution.Text = "Video res"; - // - // comboBoxResolution - // - this.comboBoxResolution.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxResolution.DropDownWidth = 160; - this.comboBoxResolution.FormattingEnabled = true; - this.comboBoxResolution.Items.AddRange(new object[] { - "4K (4096x2160)", - "UHD (3840x2160)", - "2K (2048x1080)", - "DCI 2K Scope (2048x858)", - "DCI 2K Flat (1998x1080)", - "1080p (1920x1080)", - "1440x1080", - "720p (1280x720)", - "960x720", - "480p (848x480)", - "PAL (720x576)", - "NTSC (720x480)", - "640x352", - "640x272"}); - this.comboBoxResolution.Location = new System.Drawing.Point(112, 78); - this.comboBoxResolution.Name = "comboBoxResolution"; - this.comboBoxResolution.Size = new System.Drawing.Size(123, 21); - this.comboBoxResolution.TabIndex = 5; - this.comboBoxResolution.SelectedIndexChanged += new System.EventHandler(this.comboBoxResolution_SelectedIndexChanged); - // - // comboBoxHAlign - // - this.comboBoxHAlign.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxHAlign.DropDownWidth = 200; - this.comboBoxHAlign.FormattingEnabled = true; - this.comboBoxHAlign.Items.AddRange(new object[] { - "Left", - "Center", - "Right", - "Center - Left justify"}); - this.comboBoxHAlign.Location = new System.Drawing.Point(112, 105); - this.comboBoxHAlign.Name = "comboBoxHAlign"; - this.comboBoxHAlign.Size = new System.Drawing.Size(123, 21); - this.comboBoxHAlign.TabIndex = 8; - this.comboBoxHAlign.SelectedIndexChanged += new System.EventHandler(this.comboBoxHAlign_SelectedIndexChanged); - // - // labelHorizontalAlign - // - this.labelHorizontalAlign.AutoSize = true; - this.labelHorizontalAlign.Location = new System.Drawing.Point(6, 108); - this.labelHorizontalAlign.Name = "labelHorizontalAlign"; - this.labelHorizontalAlign.Size = new System.Drawing.Size(30, 13); - this.labelHorizontalAlign.TabIndex = 7; - this.labelHorizontalAlign.Text = "Align"; - // - // checkBoxSimpleRender - // - this.checkBoxSimpleRender.AutoSize = true; - this.checkBoxSimpleRender.Location = new System.Drawing.Point(287, 71); - this.checkBoxSimpleRender.Name = "checkBoxSimpleRender"; - this.checkBoxSimpleRender.Size = new System.Drawing.Size(104, 17); - this.checkBoxSimpleRender.TabIndex = 20; - this.checkBoxSimpleRender.Text = "Simple rendering"; - this.checkBoxSimpleRender.UseVisualStyleBackColor = true; - this.checkBoxSimpleRender.CheckedChanged += new System.EventHandler(this.checkBoxAntiAlias_CheckedChanged); - // - // labelSubtitleFontSize - // - this.labelSubtitleFontSize.AutoSize = true; - this.labelSubtitleFontSize.Location = new System.Drawing.Point(6, 54); - this.labelSubtitleFontSize.Name = "labelSubtitleFontSize"; - this.labelSubtitleFontSize.Size = new System.Drawing.Size(84, 13); - this.labelSubtitleFontSize.TabIndex = 2; - this.labelSubtitleFontSize.Text = "Subtitle font size"; - // - // comboBoxSubtitleFont - // - this.comboBoxSubtitleFont.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxSubtitleFont.DropDownWidth = 210; - this.comboBoxSubtitleFont.FormattingEnabled = true; - this.comboBoxSubtitleFont.Location = new System.Drawing.Point(112, 24); - this.comboBoxSubtitleFont.Name = "comboBoxSubtitleFont"; - this.comboBoxSubtitleFont.Size = new System.Drawing.Size(123, 21); - this.comboBoxSubtitleFont.TabIndex = 1; - this.comboBoxSubtitleFont.SelectedIndexChanged += new System.EventHandler(this.comboBoxSubtitleFont_SelectedIndexChanged); - this.comboBoxSubtitleFont.SelectedValueChanged += new System.EventHandler(this.comboBoxSubtitleFont_SelectedValueChanged); - // - // comboBoxSubtitleFontSize - // - this.comboBoxSubtitleFontSize.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxSubtitleFontSize.FormattingEnabled = true; - this.comboBoxSubtitleFontSize.Items.AddRange(new object[] { - "15", - "16", - "17", - "18", - "19", - "20", - "21", - "22", - "23", - "24", - "25", - "26", - "27", - "28", - "29", - "30", - "31", - "32", - "33", - "34", - "35", - "36", - "37", - "38", - "39", - "40", - "41", - "42", - "43", - "44", - "45", - "46", - "47", - "48", - "49", - "50", - "51", - "52", - "53", - "54", - "55", - "56", - "57", - "58", - "59", - "60", - "61", - "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", - "110", - "120", - "130", - "140", - "150", - "160", - "170", - "180", - "190", - "200", - "225", - "250", - "275", - "300", - "325", - "350", - "375", - "400", - "425", - "450", - "475", - "500"}); - this.comboBoxSubtitleFontSize.Location = new System.Drawing.Point(112, 51); - this.comboBoxSubtitleFontSize.Name = "comboBoxSubtitleFontSize"; - this.comboBoxSubtitleFontSize.Size = new System.Drawing.Size(123, 21); - this.comboBoxSubtitleFontSize.TabIndex = 3; - this.comboBoxSubtitleFontSize.SelectedIndexChanged += new System.EventHandler(this.comboBoxSubtitleFontSize_SelectedIndexChanged); - // - // labelSubtitleFont - // - this.labelSubtitleFont.AutoSize = true; - this.labelSubtitleFont.Location = new System.Drawing.Point(6, 29); - this.labelSubtitleFont.Name = "labelSubtitleFont"; - this.labelSubtitleFont.Size = new System.Drawing.Size(63, 13); - this.labelSubtitleFont.TabIndex = 0; - this.labelSubtitleFont.Text = "Subtitle font"; - // - // labelBorderWidth - // - this.labelBorderWidth.Location = new System.Drawing.Point(427, 54); - this.labelBorderWidth.Name = "labelBorderWidth"; - this.labelBorderWidth.RightToLeft = System.Windows.Forms.RightToLeft.No; - this.labelBorderWidth.Size = new System.Drawing.Size(110, 13); - this.labelBorderWidth.TabIndex = 16; - this.labelBorderWidth.Text = "Border width"; - this.labelBorderWidth.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // comboBoxBorderWidth - // - this.comboBoxBorderWidth.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxBorderWidth.FormattingEnabled = true; - this.comboBoxBorderWidth.Items.AddRange(new object[] { - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "10", - "11", - "12", - "13", - "14", - "15"}); - this.comboBoxBorderWidth.Location = new System.Drawing.Point(543, 51); - this.comboBoxBorderWidth.Name = "comboBoxBorderWidth"; - this.comboBoxBorderWidth.Size = new System.Drawing.Size(128, 21); - this.comboBoxBorderWidth.TabIndex = 32; - this.comboBoxBorderWidth.SelectedIndexChanged += new System.EventHandler(this.comboBoxBorderWidth_SelectedIndexChanged); - // - // panelBorderColor - // - this.panelBorderColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.panelBorderColor.Location = new System.Drawing.Point(677, 25); - this.panelBorderColor.Name = "panelBorderColor"; - this.panelBorderColor.Size = new System.Drawing.Size(21, 20); - this.panelBorderColor.TabIndex = 31; - this.panelBorderColor.MouseClick += new System.Windows.Forms.MouseEventHandler(this.panelBorderColor_MouseClick); - // - // buttonBorderColor - // - this.buttonBorderColor.Location = new System.Drawing.Point(543, 24); - this.buttonBorderColor.Name = "buttonBorderColor"; - this.buttonBorderColor.Size = new System.Drawing.Size(128, 23); - this.buttonBorderColor.TabIndex = 30; - this.buttonBorderColor.Text = "Border color"; - this.buttonBorderColor.UseVisualStyleBackColor = true; - this.buttonBorderColor.Click += new System.EventHandler(this.buttonBorderColor_Click); - // - // panelColor - // - this.panelColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.panelColor.Location = new System.Drawing.Point(414, 25); - this.panelColor.Name = "panelColor"; - this.panelColor.Size = new System.Drawing.Size(21, 20); - this.panelColor.TabIndex = 12; - this.panelColor.MouseClick += new System.Windows.Forms.MouseEventHandler(this.panelColor_MouseClick); - // - // buttonColor - // - this.buttonColor.Location = new System.Drawing.Point(287, 24); - this.buttonColor.Name = "buttonColor"; - this.buttonColor.Size = new System.Drawing.Size(121, 23); - this.buttonColor.TabIndex = 18; - this.buttonColor.Text = "Color"; - this.buttonColor.UseVisualStyleBackColor = true; - this.buttonColor.Click += new System.EventHandler(this.buttonColor_Click); - // - // checkBoxSkipEmptyFrameAtStart - // - this.checkBoxSkipEmptyFrameAtStart.AutoSize = true; - this.checkBoxSkipEmptyFrameAtStart.Checked = true; - this.checkBoxSkipEmptyFrameAtStart.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxSkipEmptyFrameAtStart.Location = new System.Drawing.Point(287, 92); - this.checkBoxSkipEmptyFrameAtStart.Name = "checkBoxSkipEmptyFrameAtStart"; - this.checkBoxSkipEmptyFrameAtStart.Size = new System.Drawing.Size(147, 17); - this.checkBoxSkipEmptyFrameAtStart.TabIndex = 15; - this.checkBoxSkipEmptyFrameAtStart.Text = "Skip empty frames at start"; - this.checkBoxSkipEmptyFrameAtStart.UseVisualStyleBackColor = true; - // - // checkBoxFcpFullPathUrl - // - this.checkBoxFcpFullPathUrl.AutoSize = true; - this.checkBoxFcpFullPathUrl.Location = new System.Drawing.Point(6, 161); - this.checkBoxFcpFullPathUrl.Name = "checkBoxFcpFullPathUrl"; - this.checkBoxFcpFullPathUrl.Size = new System.Drawing.Size(182, 17); - this.checkBoxFcpFullPathUrl.TabIndex = 62; - this.checkBoxFcpFullPathUrl.Text = "Use full image path url in FCP xml"; - this.checkBoxFcpFullPathUrl.UseVisualStyleBackColor = true; - // - // labelLeftRightMargin - // - this.labelLeftRightMargin.AutoSize = true; - this.labelLeftRightMargin.Location = new System.Drawing.Point(6, 161); - this.labelLeftRightMargin.Name = "labelLeftRightMargin"; - this.labelLeftRightMargin.Size = new System.Drawing.Size(84, 13); - this.labelLeftRightMargin.TabIndex = 56; - this.labelLeftRightMargin.Text = "Left/right margin"; - // - // groupBoxExportImage - // - this.groupBoxExportImage.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxExportImage.Controls.Add(this.linkLabelPreview); - this.groupBoxExportImage.Controls.Add(this.panelVlcTemp); - this.groupBoxExportImage.Controls.Add(this.pictureBox1); - this.groupBoxExportImage.Location = new System.Drawing.Point(13, 415); - this.groupBoxExportImage.Name = "groupBoxExportImage"; - this.groupBoxExportImage.Size = new System.Drawing.Size(962, 178); - this.groupBoxExportImage.TabIndex = 1; - this.groupBoxExportImage.TabStop = false; - // - // linkLabelPreview - // - this.linkLabelPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.linkLabelPreview.AutoSize = true; - this.linkLabelPreview.Location = new System.Drawing.Point(906, 16); - this.linkLabelPreview.Name = "linkLabelPreview"; - this.linkLabelPreview.Size = new System.Drawing.Size(45, 13); - this.linkLabelPreview.TabIndex = 9; - this.linkLabelPreview.TabStop = true; - this.linkLabelPreview.Text = "Preview"; - this.linkLabelPreview.TextAlign = System.Drawing.ContentAlignment.TopRight; - this.linkLabelPreview.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabelPreview_LinkClicked); - // - // panelVlcTemp - // - this.panelVlcTemp.Location = new System.Drawing.Point(642, 52); - this.panelVlcTemp.Name = "panelVlcTemp"; - this.panelVlcTemp.Size = new System.Drawing.Size(200, 100); - this.panelVlcTemp.TabIndex = 10; - this.panelVlcTemp.Visible = false; - // - // timerPreview - // - this.timerPreview.Interval = 500; - this.timerPreview.Tick += new System.EventHandler(this.timerPreview_Tick); - // - // contextMenuStripListView - // - this.contextMenuStripListView.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.normalToolStripMenuItem, - this.italicToolStripMenuItem, - this.boxSingleLineToolStripMenuItem, - this.boxMultiLineToolStripMenuItem, - this.toolStripSeparatorAdjust, - this.adjustDisplayTimeToolStripMenuItem, - this.adjustTimeCodesToolStripMenuItem}); - this.contextMenuStripListView.Name = "contextMenuStripListView"; - this.contextMenuStripListView.Size = new System.Drawing.Size(185, 142); - this.contextMenuStripListView.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStripListView_Opening); - // - // normalToolStripMenuItem - // - this.normalToolStripMenuItem.Name = "normalToolStripMenuItem"; - this.normalToolStripMenuItem.Size = new System.Drawing.Size(184, 22); - this.normalToolStripMenuItem.Text = "Normal"; - this.normalToolStripMenuItem.Click += new System.EventHandler(this.normalToolStripMenuItem_Click); - // - // italicToolStripMenuItem - // - this.italicToolStripMenuItem.Name = "italicToolStripMenuItem"; - this.italicToolStripMenuItem.Size = new System.Drawing.Size(184, 22); - this.italicToolStripMenuItem.Text = "Italic"; - this.italicToolStripMenuItem.Click += new System.EventHandler(this.italicToolStripMenuItem_Click); - // - // boxSingleLineToolStripMenuItem - // - this.boxSingleLineToolStripMenuItem.Name = "boxSingleLineToolStripMenuItem"; - this.boxSingleLineToolStripMenuItem.Size = new System.Drawing.Size(184, 22); - this.boxSingleLineToolStripMenuItem.Text = "Box - single line"; - this.boxSingleLineToolStripMenuItem.Click += new System.EventHandler(this.boxSingleLineToolStripMenuItem_Click); - // - // boxMultiLineToolStripMenuItem - // - this.boxMultiLineToolStripMenuItem.Name = "boxMultiLineToolStripMenuItem"; - this.boxMultiLineToolStripMenuItem.Size = new System.Drawing.Size(184, 22); - this.boxMultiLineToolStripMenuItem.Text = "Box - multi line"; - this.boxMultiLineToolStripMenuItem.Click += new System.EventHandler(this.boxMultiLineToolStripMenuItem_Click); - // - // toolStripSeparatorAdjust - // - this.toolStripSeparatorAdjust.Name = "toolStripSeparatorAdjust"; - this.toolStripSeparatorAdjust.Size = new System.Drawing.Size(181, 6); - // - // adjustDisplayTimeToolStripMenuItem - // - this.adjustDisplayTimeToolStripMenuItem.Name = "adjustDisplayTimeToolStripMenuItem"; - this.adjustDisplayTimeToolStripMenuItem.Size = new System.Drawing.Size(184, 22); - this.adjustDisplayTimeToolStripMenuItem.Text = "Adjust display time..."; - this.adjustDisplayTimeToolStripMenuItem.Click += new System.EventHandler(this.adjustDisplayTimeToolStripMenuItem_Click); - // - // adjustTimeCodesToolStripMenuItem - // - this.adjustTimeCodesToolStripMenuItem.Name = "adjustTimeCodesToolStripMenuItem"; - this.adjustTimeCodesToolStripMenuItem.Size = new System.Drawing.Size(184, 22); - this.adjustTimeCodesToolStripMenuItem.Text = "Adjust time codes..."; - this.adjustTimeCodesToolStripMenuItem.Click += new System.EventHandler(this.adjustTimeCodesToolStripMenuItem_Click); - // - // subtitleListView1 - // - this.subtitleListView1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.subtitleListView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeader1, - this.columnHeader2, - this.columnHeader3, - this.columnHeader4, - this.columnHeader5}); - this.subtitleListView1.ContextMenuStrip = this.contextMenuStripListView; - this.subtitleListView1.FullRowSelect = true; - this.subtitleListView1.GridLines = true; - this.subtitleListView1.HideSelection = false; - this.subtitleListView1.Location = new System.Drawing.Point(13, 13); - this.subtitleListView1.Name = "subtitleListView1"; - this.subtitleListView1.Size = new System.Drawing.Size(962, 199); - this.subtitleListView1.TabIndex = 7; - this.subtitleListView1.UseCompatibleStateImageBehavior = false; - this.subtitleListView1.View = System.Windows.Forms.View.Details; - this.subtitleListView1.SelectedIndexChanged += new System.EventHandler(this.subtitleListView1_SelectedIndexChanged); - this.subtitleListView1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.subtitleListView1_KeyDown); - // - // ExportPngXml - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(981, 632); - this.Controls.Add(this.subtitleListView1); - this.Controls.Add(this.groupBoxExportImage); - this.Controls.Add(this.groupBoxImageSettings); - this.Controls.Add(this.progressBar1); - this.Controls.Add(this.buttonExport); - this.Controls.Add(this.buttonCancel); - this.KeyPreview = true; - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(890, 667); - this.Name = "ExportPngXml"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "ExportPngXml"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.ExportPngXml_FormClosing); - this.Shown += new System.EventHandler(this.ExportPngXml_Shown); - this.ResizeEnd += new System.EventHandler(this.ExportPngXml_ResizeEnd); - this.SizeChanged += new System.EventHandler(this.ExportPngXml_SizeChanged); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ExportPngXml_KeyDown); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); - this.contextMenuStrip1.ResumeLayout(false); - this.groupBoxImageSettings.ResumeLayout(false); - this.groupBoxImageSettings.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownLineSpacing)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownShadowTransparency)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDepth3D)).EndInit(); - this.groupBoxExportImage.ResumeLayout(false); - this.groupBoxExportImage.PerformLayout(); - this.contextMenuStripListView.ResumeLayout(false); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.PictureBox pictureBox1; - private System.Windows.Forms.Button buttonExport; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.FolderBrowserDialog folderBrowserDialog1; - private System.Windows.Forms.ProgressBar progressBar1; - private System.Windows.Forms.GroupBox groupBoxImageSettings; - private System.Windows.Forms.Label labelBorderWidth; - private System.Windows.Forms.ComboBox comboBoxBorderWidth; - private System.Windows.Forms.Panel panelBorderColor; - private System.Windows.Forms.Button buttonBorderColor; - private System.Windows.Forms.Panel panelColor; - private System.Windows.Forms.Button buttonColor; - private System.Windows.Forms.Label labelSubtitleFontSize; - private System.Windows.Forms.ComboBox comboBoxSubtitleFont; - private System.Windows.Forms.ComboBox comboBoxSubtitleFontSize; - private System.Windows.Forms.Label labelSubtitleFont; - private System.Windows.Forms.CheckBox checkBoxSimpleRender; - private System.Windows.Forms.SaveFileDialog saveFileDialog1; - private System.Windows.Forms.ComboBox comboBoxHAlign; - private System.Windows.Forms.Label labelHorizontalAlign; - private System.Windows.Forms.Label labelResolution; - private System.Windows.Forms.ComboBox comboBoxResolution; - private System.Windows.Forms.CheckBox checkBoxBold; - private System.Windows.Forms.Label labelImageFormat; - private System.Windows.Forms.ComboBox comboBoxImageFormat; - private System.Windows.Forms.Label labelLanguage; - private System.Windows.Forms.ComboBox comboBoxLanguage; - private System.Windows.Forms.Label labelFrameRate; - private System.Windows.Forms.ComboBox comboBoxFrameRate; - private System.Windows.Forms.ComboBox comboBoxBottomMargin; - private System.Windows.Forms.Label labelBottomMargin; - private System.Windows.Forms.CheckBox checkBoxSkipEmptyFrameAtStart; - private System.Windows.Forms.Button buttonCustomResolution; - private System.Windows.Forms.GroupBox groupBoxExportImage; - private System.Windows.Forms.NumericUpDown numericUpDownDepth3D; - private System.Windows.Forms.Label labelDepth; - private System.Windows.Forms.Label label3D; - private System.Windows.Forms.ComboBox comboBox3D; - private System.Windows.Forms.Timer timerPreview; - private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; - private System.Windows.Forms.ToolStripMenuItem saveImageAsToolStripMenuItem; - private System.Windows.Forms.Label labelShadowWidth; - private System.Windows.Forms.ComboBox comboBoxShadowWidth; - private System.Windows.Forms.Panel panelShadowColor; - private System.Windows.Forms.Button buttonShadowColor; - private System.Windows.Forms.NumericUpDown numericUpDownShadowTransparency; - private System.Windows.Forms.Label labelShadowTransparency; - private System.Windows.Forms.Label labelLineHeight; - private System.Windows.Forms.NumericUpDown numericUpDownLineSpacing; - private System.Windows.Forms.CheckBox checkBoxTransAntiAliase; - private System.Windows.Forms.ContextMenuStrip contextMenuStripListView; - private System.Windows.Forms.ToolStripMenuItem boxSingleLineToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem boxMultiLineToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem normalToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem italicToolStripMenuItem; - private System.Windows.Forms.ListView subtitleListView1; - private System.Windows.Forms.ColumnHeader columnHeader1; - private System.Windows.Forms.ColumnHeader columnHeader2; - private System.Windows.Forms.ColumnHeader columnHeader3; - private System.Windows.Forms.ColumnHeader columnHeader4; - private System.Windows.Forms.ColumnHeader columnHeader5; - private System.Windows.Forms.LinkLabel linkLabelPreview; - private System.Windows.Forms.Panel panelVlcTemp; - private System.Windows.Forms.CheckBox checkBoxFullFrameImage; - private System.Windows.Forms.ComboBox comboBoxLeftRightMargin; - private System.Windows.Forms.Label labelLeftRightMargin; - private System.Windows.Forms.Panel panelFullFrameBackground; - private System.Windows.Forms.Label labelLineHeightStyle; - private System.Windows.Forms.ComboBox comboBoxBottomMarginUnit; - private System.Windows.Forms.ComboBox comboBoxLeftRightMarginUnit; - private System.Windows.Forms.ComboBox comboBoxResizePercentage; - private System.Windows.Forms.Label labelResize; - private System.Windows.Forms.ToolStripMenuItem adjustTimeCodesToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparatorAdjust; - private System.Windows.Forms.ToolStripMenuItem adjustDisplayTimeToolStripMenuItem; - private System.Windows.Forms.CheckBox checkBoxFcpFullPathUrl; - } +namespace Nikse.SubtitleEdit.Forms +{ + partial class ExportPngXml + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); + this.saveImageAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.buttonExport = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.folderBrowserDialog1 = new System.Windows.Forms.FolderBrowserDialog(); + this.progressBar1 = new System.Windows.Forms.ProgressBar(); + this.groupBoxImageSettings = new System.Windows.Forms.GroupBox(); + this.labelResize = new System.Windows.Forms.Label(); + this.comboBoxResizePercentage = new System.Windows.Forms.ComboBox(); + this.comboBoxBottomMarginUnit = new System.Windows.Forms.ComboBox(); + this.comboBoxLeftRightMarginUnit = new System.Windows.Forms.ComboBox(); + this.labelLineHeightStyle = new System.Windows.Forms.Label(); + this.panelFullFrameBackground = new System.Windows.Forms.Panel(); + this.comboBoxLeftRightMargin = new System.Windows.Forms.ComboBox(); + this.checkBoxFullFrameImage = new System.Windows.Forms.CheckBox(); + this.checkBoxTransAntiAliase = new System.Windows.Forms.CheckBox(); + this.labelLineHeight = new System.Windows.Forms.Label(); + this.numericUpDownLineSpacing = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownShadowTransparency = new System.Windows.Forms.NumericUpDown(); + this.labelShadowTransparency = new System.Windows.Forms.Label(); + this.labelShadowWidth = new System.Windows.Forms.Label(); + this.comboBoxShadowWidth = new System.Windows.Forms.ComboBox(); + this.panelShadowColor = new System.Windows.Forms.Panel(); + this.buttonShadowColor = new System.Windows.Forms.Button(); + this.labelDepth = new System.Windows.Forms.Label(); + this.label3D = new System.Windows.Forms.Label(); + this.comboBox3D = new System.Windows.Forms.ComboBox(); + this.numericUpDownDepth3D = new System.Windows.Forms.NumericUpDown(); + this.buttonCustomResolution = new System.Windows.Forms.Button(); + this.comboBoxBottomMargin = new System.Windows.Forms.ComboBox(); + this.labelBottomMargin = new System.Windows.Forms.Label(); + this.labelFrameRate = new System.Windows.Forms.Label(); + this.comboBoxFrameRate = new System.Windows.Forms.ComboBox(); + this.labelLanguage = new System.Windows.Forms.Label(); + this.comboBoxLanguage = new System.Windows.Forms.ComboBox(); + this.labelImageFormat = new System.Windows.Forms.Label(); + this.comboBoxImageFormat = new System.Windows.Forms.ComboBox(); + this.checkBoxBold = new System.Windows.Forms.CheckBox(); + this.labelResolution = new System.Windows.Forms.Label(); + this.comboBoxResolution = new System.Windows.Forms.ComboBox(); + this.comboBoxHAlign = new System.Windows.Forms.ComboBox(); + this.labelHorizontalAlign = new System.Windows.Forms.Label(); + this.checkBoxSimpleRender = new System.Windows.Forms.CheckBox(); + this.labelSubtitleFontSize = new System.Windows.Forms.Label(); + this.comboBoxSubtitleFont = new System.Windows.Forms.ComboBox(); + this.comboBoxSubtitleFontSize = new System.Windows.Forms.ComboBox(); + this.labelSubtitleFont = new System.Windows.Forms.Label(); + this.labelBorderWidth = new System.Windows.Forms.Label(); + this.comboBoxBorderWidth = new System.Windows.Forms.ComboBox(); + this.panelBorderColor = new System.Windows.Forms.Panel(); + this.buttonBorderColor = new System.Windows.Forms.Button(); + this.panelColor = new System.Windows.Forms.Panel(); + this.buttonColor = new System.Windows.Forms.Button(); + this.checkBoxSkipEmptyFrameAtStart = new System.Windows.Forms.CheckBox(); + this.checkBoxFcpFullPathUrl = new System.Windows.Forms.CheckBox(); + this.labelLeftRightMargin = new System.Windows.Forms.Label(); + this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog(); + this.groupBoxExportImage = new System.Windows.Forms.GroupBox(); + this.linkLabelPreview = new System.Windows.Forms.LinkLabel(); + this.panelVlcTemp = new System.Windows.Forms.Panel(); + this.timerPreview = new System.Windows.Forms.Timer(this.components); + this.contextMenuStripListView = new System.Windows.Forms.ContextMenuStrip(this.components); + this.normalToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.italicToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.boxSingleLineToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.boxMultiLineToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparatorAdjust = new System.Windows.Forms.ToolStripSeparator(); + this.adjustDisplayTimeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.adjustTimeCodesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.subtitleListView1 = new System.Windows.Forms.ListView(); + this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.contextMenuStrip1.SuspendLayout(); + this.groupBoxImageSettings.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownLineSpacing)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownShadowTransparency)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDepth3D)).BeginInit(); + this.groupBoxExportImage.SuspendLayout(); + this.contextMenuStripListView.SuspendLayout(); + this.SuspendLayout(); + // + // pictureBox1 + // + this.pictureBox1.ContextMenuStrip = this.contextMenuStrip1; + this.pictureBox1.Location = new System.Drawing.Point(6, 19); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(553, 152); + this.pictureBox1.TabIndex = 1; + this.pictureBox1.TabStop = false; + // + // contextMenuStrip1 + // + this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.saveImageAsToolStripMenuItem}); + this.contextMenuStrip1.Name = "contextMenuStrip1"; + this.contextMenuStrip1.Size = new System.Drawing.Size(158, 26); + // + // saveImageAsToolStripMenuItem + // + this.saveImageAsToolStripMenuItem.Name = "saveImageAsToolStripMenuItem"; + this.saveImageAsToolStripMenuItem.Size = new System.Drawing.Size(157, 22); + this.saveImageAsToolStripMenuItem.Text = "Save image as..."; + this.saveImageAsToolStripMenuItem.Click += new System.EventHandler(this.saveImageAsToolStripMenuItem_Click); + // + // buttonExport + // + this.buttonExport.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonExport.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonExport.Location = new System.Drawing.Point(768, 597); + this.buttonExport.Name = "buttonExport"; + this.buttonExport.Size = new System.Drawing.Size(126, 23); + this.buttonExport.TabIndex = 6; + this.buttonExport.Text = "Export all lines..."; + this.buttonExport.UseVisualStyleBackColor = true; + this.buttonExport.Click += new System.EventHandler(this.ButtonExportClick); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(894, 597); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 0; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + // + // progressBar1 + // + this.progressBar1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.progressBar1.Location = new System.Drawing.Point(12, 599); + this.progressBar1.Name = "progressBar1"; + this.progressBar1.Size = new System.Drawing.Size(750, 21); + this.progressBar1.TabIndex = 5; + this.progressBar1.Visible = false; + // + // groupBoxImageSettings + // + this.groupBoxImageSettings.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxImageSettings.Controls.Add(this.labelResize); + this.groupBoxImageSettings.Controls.Add(this.comboBoxResizePercentage); + this.groupBoxImageSettings.Controls.Add(this.comboBoxBottomMarginUnit); + this.groupBoxImageSettings.Controls.Add(this.comboBoxLeftRightMarginUnit); + this.groupBoxImageSettings.Controls.Add(this.labelLineHeightStyle); + this.groupBoxImageSettings.Controls.Add(this.panelFullFrameBackground); + this.groupBoxImageSettings.Controls.Add(this.comboBoxLeftRightMargin); + this.groupBoxImageSettings.Controls.Add(this.checkBoxFullFrameImage); + this.groupBoxImageSettings.Controls.Add(this.checkBoxTransAntiAliase); + this.groupBoxImageSettings.Controls.Add(this.labelLineHeight); + this.groupBoxImageSettings.Controls.Add(this.numericUpDownLineSpacing); + this.groupBoxImageSettings.Controls.Add(this.numericUpDownShadowTransparency); + this.groupBoxImageSettings.Controls.Add(this.labelShadowTransparency); + this.groupBoxImageSettings.Controls.Add(this.labelShadowWidth); + this.groupBoxImageSettings.Controls.Add(this.comboBoxShadowWidth); + this.groupBoxImageSettings.Controls.Add(this.panelShadowColor); + this.groupBoxImageSettings.Controls.Add(this.buttonShadowColor); + this.groupBoxImageSettings.Controls.Add(this.labelDepth); + this.groupBoxImageSettings.Controls.Add(this.label3D); + this.groupBoxImageSettings.Controls.Add(this.comboBox3D); + this.groupBoxImageSettings.Controls.Add(this.numericUpDownDepth3D); + this.groupBoxImageSettings.Controls.Add(this.buttonCustomResolution); + this.groupBoxImageSettings.Controls.Add(this.comboBoxBottomMargin); + this.groupBoxImageSettings.Controls.Add(this.labelBottomMargin); + this.groupBoxImageSettings.Controls.Add(this.labelFrameRate); + this.groupBoxImageSettings.Controls.Add(this.comboBoxFrameRate); + this.groupBoxImageSettings.Controls.Add(this.labelLanguage); + this.groupBoxImageSettings.Controls.Add(this.comboBoxLanguage); + this.groupBoxImageSettings.Controls.Add(this.labelImageFormat); + this.groupBoxImageSettings.Controls.Add(this.comboBoxImageFormat); + this.groupBoxImageSettings.Controls.Add(this.checkBoxBold); + this.groupBoxImageSettings.Controls.Add(this.labelResolution); + this.groupBoxImageSettings.Controls.Add(this.comboBoxResolution); + this.groupBoxImageSettings.Controls.Add(this.comboBoxHAlign); + this.groupBoxImageSettings.Controls.Add(this.labelHorizontalAlign); + this.groupBoxImageSettings.Controls.Add(this.checkBoxSimpleRender); + this.groupBoxImageSettings.Controls.Add(this.labelSubtitleFontSize); + this.groupBoxImageSettings.Controls.Add(this.comboBoxSubtitleFont); + this.groupBoxImageSettings.Controls.Add(this.comboBoxSubtitleFontSize); + this.groupBoxImageSettings.Controls.Add(this.labelSubtitleFont); + this.groupBoxImageSettings.Controls.Add(this.labelBorderWidth); + this.groupBoxImageSettings.Controls.Add(this.comboBoxBorderWidth); + this.groupBoxImageSettings.Controls.Add(this.panelBorderColor); + this.groupBoxImageSettings.Controls.Add(this.buttonBorderColor); + this.groupBoxImageSettings.Controls.Add(this.panelColor); + this.groupBoxImageSettings.Controls.Add(this.buttonColor); + this.groupBoxImageSettings.Controls.Add(this.checkBoxSkipEmptyFrameAtStart); + this.groupBoxImageSettings.Controls.Add(this.checkBoxFcpFullPathUrl); + this.groupBoxImageSettings.Controls.Add(this.labelLeftRightMargin); + this.groupBoxImageSettings.Location = new System.Drawing.Point(12, 218); + this.groupBoxImageSettings.Name = "groupBoxImageSettings"; + this.groupBoxImageSettings.Size = new System.Drawing.Size(963, 191); + this.groupBoxImageSettings.TabIndex = 3; + this.groupBoxImageSettings.TabStop = false; + this.groupBoxImageSettings.Text = "Image settings"; + // + // labelResize + // + this.labelResize.AutoSize = true; + this.labelResize.Location = new System.Drawing.Point(263, 8); + this.labelResize.Name = "labelResize"; + this.labelResize.Size = new System.Drawing.Size(39, 13); + this.labelResize.TabIndex = 61; + this.labelResize.Text = "Resize"; + this.labelResize.Visible = false; + // + // comboBoxResizePercentage + // + this.comboBoxResizePercentage.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxResizePercentage.FormattingEnabled = true; + this.comboBoxResizePercentage.Location = new System.Drawing.Point(308, 5); + this.comboBoxResizePercentage.Name = "comboBoxResizePercentage"; + this.comboBoxResizePercentage.Size = new System.Drawing.Size(77, 21); + this.comboBoxResizePercentage.TabIndex = 18; + this.comboBoxResizePercentage.Visible = false; + this.comboBoxResizePercentage.SelectedIndexChanged += new System.EventHandler(this.comboBoxResizePercentage_SelectedIndexChanged); + // + // comboBoxBottomMarginUnit + // + this.comboBoxBottomMarginUnit.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxBottomMarginUnit.FormattingEnabled = true; + this.comboBoxBottomMarginUnit.Items.AddRange(new object[] { + "%", + "px"}); + this.comboBoxBottomMarginUnit.Location = new System.Drawing.Point(181, 132); + this.comboBoxBottomMarginUnit.Name = "comboBoxBottomMarginUnit"; + this.comboBoxBottomMarginUnit.Size = new System.Drawing.Size(54, 21); + this.comboBoxBottomMarginUnit.TabIndex = 14; + this.comboBoxBottomMarginUnit.SelectedIndexChanged += new System.EventHandler(this.comboBoxBottomMarginUnit_SelectedIndexChanged); + // + // comboBoxLeftRightMarginUnit + // + this.comboBoxLeftRightMarginUnit.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxLeftRightMarginUnit.FormattingEnabled = true; + this.comboBoxLeftRightMarginUnit.Items.AddRange(new object[] { + "%", + "px"}); + this.comboBoxLeftRightMarginUnit.Location = new System.Drawing.Point(181, 159); + this.comboBoxLeftRightMarginUnit.Name = "comboBoxLeftRightMarginUnit"; + this.comboBoxLeftRightMarginUnit.Size = new System.Drawing.Size(54, 21); + this.comboBoxLeftRightMarginUnit.TabIndex = 17; + this.comboBoxLeftRightMarginUnit.SelectedIndexChanged += new System.EventHandler(this.comboBoxLeftRightMarginUnit_SelectedIndexChanged); + // + // labelLineHeightStyle + // + this.labelLineHeightStyle.AutoSize = true; + this.labelLineHeightStyle.Location = new System.Drawing.Point(799, 153); + this.labelLineHeightStyle.Name = "labelLineHeightStyle"; + this.labelLineHeightStyle.Size = new System.Drawing.Size(103, 13); + this.labelLineHeightStyle.TabIndex = 59; + this.labelLineHeightStyle.Text = "labelLineHeightStyle"; + // + // panelFullFrameBackground + // + this.panelFullFrameBackground.BackColor = System.Drawing.Color.Transparent; + this.panelFullFrameBackground.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelFullFrameBackground.Location = new System.Drawing.Point(677, 104); + this.panelFullFrameBackground.Name = "panelFullFrameBackground"; + this.panelFullFrameBackground.Size = new System.Drawing.Size(21, 20); + this.panelFullFrameBackground.TabIndex = 36; + this.panelFullFrameBackground.Visible = false; + this.panelFullFrameBackground.Click += new System.EventHandler(this.panelFullFrameBackground_Click); + // + // comboBoxLeftRightMargin + // + this.comboBoxLeftRightMargin.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxLeftRightMargin.FormattingEnabled = true; + this.comboBoxLeftRightMargin.Location = new System.Drawing.Point(112, 159); + this.comboBoxLeftRightMargin.Name = "comboBoxLeftRightMargin"; + this.comboBoxLeftRightMargin.Size = new System.Drawing.Size(63, 21); + this.comboBoxLeftRightMargin.TabIndex = 16; + this.comboBoxLeftRightMargin.SelectedIndexChanged += new System.EventHandler(this.comboBoxLeftRightMargin_SelectedIndexChanged); + // + // checkBoxFullFrameImage + // + this.checkBoxFullFrameImage.AutoSize = true; + this.checkBoxFullFrameImage.Location = new System.Drawing.Point(543, 104); + this.checkBoxFullFrameImage.Name = "checkBoxFullFrameImage"; + this.checkBoxFullFrameImage.Size = new System.Drawing.Size(102, 17); + this.checkBoxFullFrameImage.TabIndex = 34; + this.checkBoxFullFrameImage.Text = "Full frame image"; + this.checkBoxFullFrameImage.UseVisualStyleBackColor = true; + this.checkBoxFullFrameImage.CheckedChanged += new System.EventHandler(this.checkBoxFullFrameImage_CheckedChanged); + // + // checkBoxTransAntiAliase + // + this.checkBoxTransAntiAliase.AutoSize = true; + this.checkBoxTransAntiAliase.Location = new System.Drawing.Point(287, 92); + this.checkBoxTransAntiAliase.Name = "checkBoxTransAntiAliase"; + this.checkBoxTransAntiAliase.Size = new System.Drawing.Size(162, 17); + this.checkBoxTransAntiAliase.TabIndex = 21; + this.checkBoxTransAntiAliase.Text = "Anti-alising with transparency"; + this.checkBoxTransAntiAliase.UseVisualStyleBackColor = true; + this.checkBoxTransAntiAliase.CheckedChanged += new System.EventHandler(this.checkBoxAntiAlias_CheckedChanged); + // + // labelLineHeight + // + this.labelLineHeight.Location = new System.Drawing.Point(686, 132); + this.labelLineHeight.Name = "labelLineHeight"; + this.labelLineHeight.RightToLeft = System.Windows.Forms.RightToLeft.No; + this.labelLineHeight.Size = new System.Drawing.Size(110, 16); + this.labelLineHeight.TabIndex = 54; + this.labelLineHeight.Text = "Line height"; + this.labelLineHeight.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // numericUpDownLineSpacing + // + this.numericUpDownLineSpacing.Location = new System.Drawing.Point(802, 130); + this.numericUpDownLineSpacing.Maximum = new decimal(new int[] { + 500, + 0, + 0, + 0}); + this.numericUpDownLineSpacing.Name = "numericUpDownLineSpacing"; + this.numericUpDownLineSpacing.Size = new System.Drawing.Size(47, 20); + this.numericUpDownLineSpacing.TabIndex = 44; + this.numericUpDownLineSpacing.Value = new decimal(new int[] { + 10, + 0, + 0, + 0}); + this.numericUpDownLineSpacing.ValueChanged += new System.EventHandler(this.numericUpDownLineSpacing_ValueChanged); + this.numericUpDownLineSpacing.KeyUp += new System.Windows.Forms.KeyEventHandler(this.numericUpDownLineSpacing_KeyUp); + // + // numericUpDownShadowTransparency + // + this.numericUpDownShadowTransparency.Location = new System.Drawing.Point(802, 81); + this.numericUpDownShadowTransparency.Maximum = new decimal(new int[] { + 255, + 0, + 0, + 0}); + this.numericUpDownShadowTransparency.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownShadowTransparency.Name = "numericUpDownShadowTransparency"; + this.numericUpDownShadowTransparency.Size = new System.Drawing.Size(47, 20); + this.numericUpDownShadowTransparency.TabIndex = 43; + this.numericUpDownShadowTransparency.Value = new decimal(new int[] { + 200, + 0, + 0, + 0}); + this.numericUpDownShadowTransparency.ValueChanged += new System.EventHandler(this.numericUpDownShadowTransparency_ValueChanged); + // + // labelShadowTransparency + // + this.labelShadowTransparency.Location = new System.Drawing.Point(686, 83); + this.labelShadowTransparency.Name = "labelShadowTransparency"; + this.labelShadowTransparency.RightToLeft = System.Windows.Forms.RightToLeft.No; + this.labelShadowTransparency.Size = new System.Drawing.Size(110, 13); + this.labelShadowTransparency.TabIndex = 39; + this.labelShadowTransparency.Text = "Transparency"; + this.labelShadowTransparency.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // labelShadowWidth + // + this.labelShadowWidth.Location = new System.Drawing.Point(686, 55); + this.labelShadowWidth.Name = "labelShadowWidth"; + this.labelShadowWidth.RightToLeft = System.Windows.Forms.RightToLeft.No; + this.labelShadowWidth.Size = new System.Drawing.Size(110, 13); + this.labelShadowWidth.TabIndex = 35; + this.labelShadowWidth.Text = "Shadow width"; + this.labelShadowWidth.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // comboBoxShadowWidth + // + this.comboBoxShadowWidth.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxShadowWidth.FormattingEnabled = true; + this.comboBoxShadowWidth.Items.AddRange(new object[] { + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15"}); + this.comboBoxShadowWidth.Location = new System.Drawing.Point(802, 52); + this.comboBoxShadowWidth.Name = "comboBoxShadowWidth"; + this.comboBoxShadowWidth.Size = new System.Drawing.Size(121, 21); + this.comboBoxShadowWidth.TabIndex = 42; + this.comboBoxShadowWidth.SelectedIndexChanged += new System.EventHandler(this.comboBoxShadowWidth_SelectedIndexChanged); + // + // panelShadowColor + // + this.panelShadowColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelShadowColor.Location = new System.Drawing.Point(929, 26); + this.panelShadowColor.Name = "panelShadowColor"; + this.panelShadowColor.Size = new System.Drawing.Size(21, 20); + this.panelShadowColor.TabIndex = 41; + this.panelShadowColor.MouseClick += new System.Windows.Forms.MouseEventHandler(this.panelShadowColor_MouseClick); + // + // buttonShadowColor + // + this.buttonShadowColor.Location = new System.Drawing.Point(802, 25); + this.buttonShadowColor.Name = "buttonShadowColor"; + this.buttonShadowColor.Size = new System.Drawing.Size(121, 23); + this.buttonShadowColor.TabIndex = 40; + this.buttonShadowColor.Text = "Shadow color"; + this.buttonShadowColor.UseVisualStyleBackColor = true; + this.buttonShadowColor.Click += new System.EventHandler(this.buttonShadowColor_Click); + // + // labelDepth + // + this.labelDepth.Location = new System.Drawing.Point(247, 134); + this.labelDepth.Name = "labelDepth"; + this.labelDepth.Size = new System.Drawing.Size(100, 18); + this.labelDepth.TabIndex = 18; + this.labelDepth.Text = "Depth"; + this.labelDepth.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // label3D + // + this.label3D.AutoSize = true; + this.label3D.Location = new System.Drawing.Point(284, 113); + this.label3D.Name = "label3D"; + this.label3D.Size = new System.Drawing.Size(21, 13); + this.label3D.TabIndex = 16; + this.label3D.Text = "3D"; + // + // comboBox3D + // + this.comboBox3D.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBox3D.FormattingEnabled = true; + this.comboBox3D.Location = new System.Drawing.Point(309, 110); + this.comboBox3D.Name = "comboBox3D"; + this.comboBox3D.Size = new System.Drawing.Size(112, 21); + this.comboBox3D.TabIndex = 22; + this.comboBox3D.SelectedIndexChanged += new System.EventHandler(this.comboBox3D_SelectedIndexChanged); + // + // numericUpDownDepth3D + // + this.numericUpDownDepth3D.Location = new System.Drawing.Point(353, 135); + this.numericUpDownDepth3D.Minimum = new decimal(new int[] { + 100, + 0, + 0, + -2147483648}); + this.numericUpDownDepth3D.Name = "numericUpDownDepth3D"; + this.numericUpDownDepth3D.Size = new System.Drawing.Size(47, 20); + this.numericUpDownDepth3D.TabIndex = 23; + this.numericUpDownDepth3D.ValueChanged += new System.EventHandler(this.numericUpDownDepth3D_ValueChanged); + // + // buttonCustomResolution + // + this.buttonCustomResolution.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCustomResolution.Location = new System.Drawing.Point(238, 78); + this.buttonCustomResolution.Name = "buttonCustomResolution"; + this.buttonCustomResolution.Size = new System.Drawing.Size(24, 21); + this.buttonCustomResolution.TabIndex = 6; + this.buttonCustomResolution.Text = "..."; + this.buttonCustomResolution.UseVisualStyleBackColor = true; + this.buttonCustomResolution.Click += new System.EventHandler(this.buttonCustomResolution_Click); + // + // comboBoxBottomMargin + // + this.comboBoxBottomMargin.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxBottomMargin.FormattingEnabled = true; + this.comboBoxBottomMargin.Location = new System.Drawing.Point(112, 132); + this.comboBoxBottomMargin.Name = "comboBoxBottomMargin"; + this.comboBoxBottomMargin.Size = new System.Drawing.Size(63, 21); + this.comboBoxBottomMargin.TabIndex = 10; + this.comboBoxBottomMargin.SelectedIndexChanged += new System.EventHandler(this.comboBoxBottomMargin_SelectedIndexChanged); + // + // labelBottomMargin + // + this.labelBottomMargin.AutoSize = true; + this.labelBottomMargin.Location = new System.Drawing.Point(6, 135); + this.labelBottomMargin.Name = "labelBottomMargin"; + this.labelBottomMargin.Size = new System.Drawing.Size(74, 13); + this.labelBottomMargin.TabIndex = 9; + this.labelBottomMargin.Text = "Bottom margin"; + // + // labelFrameRate + // + this.labelFrameRate.Location = new System.Drawing.Point(427, 137); + this.labelFrameRate.Name = "labelFrameRate"; + this.labelFrameRate.RightToLeft = System.Windows.Forms.RightToLeft.No; + this.labelFrameRate.Size = new System.Drawing.Size(110, 13); + this.labelFrameRate.TabIndex = 34; + this.labelFrameRate.Text = "Frame rate"; + this.labelFrameRate.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.labelFrameRate.Visible = false; + // + // comboBoxFrameRate + // + this.comboBoxFrameRate.FormattingEnabled = true; + this.comboBoxFrameRate.Location = new System.Drawing.Point(543, 134); + this.comboBoxFrameRate.Name = "comboBoxFrameRate"; + this.comboBoxFrameRate.Size = new System.Drawing.Size(128, 21); + this.comboBoxFrameRate.TabIndex = 37; + // + // labelLanguage + // + this.labelLanguage.Location = new System.Drawing.Point(427, 108); + this.labelLanguage.Name = "labelLanguage"; + this.labelLanguage.RightToLeft = System.Windows.Forms.RightToLeft.No; + this.labelLanguage.Size = new System.Drawing.Size(110, 13); + this.labelLanguage.TabIndex = 30; + this.labelLanguage.Text = "Language"; + this.labelLanguage.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.labelLanguage.Visible = false; + // + // comboBoxLanguage + // + this.comboBoxLanguage.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxLanguage.FormattingEnabled = true; + this.comboBoxLanguage.Items.AddRange(new object[] { + "Bmp", + "Exif", + "Gif", + "Jpg", + "Png", + "Tiff"}); + this.comboBoxLanguage.Location = new System.Drawing.Point(543, 105); + this.comboBoxLanguage.Name = "comboBoxLanguage"; + this.comboBoxLanguage.Size = new System.Drawing.Size(128, 21); + this.comboBoxLanguage.TabIndex = 35; + this.comboBoxLanguage.Visible = false; + // + // labelImageFormat + // + this.labelImageFormat.Location = new System.Drawing.Point(427, 81); + this.labelImageFormat.Name = "labelImageFormat"; + this.labelImageFormat.RightToLeft = System.Windows.Forms.RightToLeft.No; + this.labelImageFormat.Size = new System.Drawing.Size(110, 13); + this.labelImageFormat.TabIndex = 28; + this.labelImageFormat.Text = "Image format"; + this.labelImageFormat.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // comboBoxImageFormat + // + this.comboBoxImageFormat.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxImageFormat.FormattingEnabled = true; + this.comboBoxImageFormat.Items.AddRange(new object[] { + "Bmp", + "Exif", + "Gif", + "Jpg", + "Png", + "Tiff", + "Tga"}); + this.comboBoxImageFormat.Location = new System.Drawing.Point(543, 78); + this.comboBoxImageFormat.Name = "comboBoxImageFormat"; + this.comboBoxImageFormat.Size = new System.Drawing.Size(128, 21); + this.comboBoxImageFormat.TabIndex = 33; + // + // checkBoxBold + // + this.checkBoxBold.AutoSize = true; + this.checkBoxBold.Location = new System.Drawing.Point(287, 50); + this.checkBoxBold.Name = "checkBoxBold"; + this.checkBoxBold.Size = new System.Drawing.Size(47, 17); + this.checkBoxBold.TabIndex = 19; + this.checkBoxBold.Text = "Bold"; + this.checkBoxBold.UseVisualStyleBackColor = true; + this.checkBoxBold.CheckedChanged += new System.EventHandler(this.checkBoxBold_CheckedChanged); + // + // labelResolution + // + this.labelResolution.AutoSize = true; + this.labelResolution.Location = new System.Drawing.Point(6, 81); + this.labelResolution.Name = "labelResolution"; + this.labelResolution.Size = new System.Drawing.Size(51, 13); + this.labelResolution.TabIndex = 4; + this.labelResolution.Text = "Video res"; + // + // comboBoxResolution + // + this.comboBoxResolution.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxResolution.DropDownWidth = 160; + this.comboBoxResolution.FormattingEnabled = true; + this.comboBoxResolution.Items.AddRange(new object[] { + "4K (4096x2160)", + "UHD (3840x2160)", + "2K (2048x1080)", + "DCI 2K Scope (2048x858)", + "DCI 2K Flat (1998x1080)", + "1080p (1920x1080)", + "1440x1080", + "720p (1280x720)", + "960x720", + "480p (848x480)", + "PAL (720x576)", + "NTSC (720x480)", + "640x352", + "640x272"}); + this.comboBoxResolution.Location = new System.Drawing.Point(112, 78); + this.comboBoxResolution.Name = "comboBoxResolution"; + this.comboBoxResolution.Size = new System.Drawing.Size(123, 21); + this.comboBoxResolution.TabIndex = 5; + this.comboBoxResolution.SelectedIndexChanged += new System.EventHandler(this.comboBoxResolution_SelectedIndexChanged); + // + // comboBoxHAlign + // + this.comboBoxHAlign.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxHAlign.DropDownWidth = 200; + this.comboBoxHAlign.FormattingEnabled = true; + this.comboBoxHAlign.Items.AddRange(new object[] { + "Left", + "Center", + "Right", + "Center - Left justify"}); + this.comboBoxHAlign.Location = new System.Drawing.Point(112, 105); + this.comboBoxHAlign.Name = "comboBoxHAlign"; + this.comboBoxHAlign.Size = new System.Drawing.Size(123, 21); + this.comboBoxHAlign.TabIndex = 8; + this.comboBoxHAlign.SelectedIndexChanged += new System.EventHandler(this.comboBoxHAlign_SelectedIndexChanged); + // + // labelHorizontalAlign + // + this.labelHorizontalAlign.AutoSize = true; + this.labelHorizontalAlign.Location = new System.Drawing.Point(6, 108); + this.labelHorizontalAlign.Name = "labelHorizontalAlign"; + this.labelHorizontalAlign.Size = new System.Drawing.Size(30, 13); + this.labelHorizontalAlign.TabIndex = 7; + this.labelHorizontalAlign.Text = "Align"; + // + // checkBoxSimpleRender + // + this.checkBoxSimpleRender.AutoSize = true; + this.checkBoxSimpleRender.Location = new System.Drawing.Point(287, 71); + this.checkBoxSimpleRender.Name = "checkBoxSimpleRender"; + this.checkBoxSimpleRender.Size = new System.Drawing.Size(104, 17); + this.checkBoxSimpleRender.TabIndex = 20; + this.checkBoxSimpleRender.Text = "Simple rendering"; + this.checkBoxSimpleRender.UseVisualStyleBackColor = true; + this.checkBoxSimpleRender.CheckedChanged += new System.EventHandler(this.checkBoxAntiAlias_CheckedChanged); + // + // labelSubtitleFontSize + // + this.labelSubtitleFontSize.AutoSize = true; + this.labelSubtitleFontSize.Location = new System.Drawing.Point(6, 54); + this.labelSubtitleFontSize.Name = "labelSubtitleFontSize"; + this.labelSubtitleFontSize.Size = new System.Drawing.Size(84, 13); + this.labelSubtitleFontSize.TabIndex = 2; + this.labelSubtitleFontSize.Text = "Subtitle font size"; + // + // comboBoxSubtitleFont + // + this.comboBoxSubtitleFont.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxSubtitleFont.DropDownWidth = 210; + this.comboBoxSubtitleFont.FormattingEnabled = true; + this.comboBoxSubtitleFont.Location = new System.Drawing.Point(112, 24); + this.comboBoxSubtitleFont.Name = "comboBoxSubtitleFont"; + this.comboBoxSubtitleFont.Size = new System.Drawing.Size(123, 21); + this.comboBoxSubtitleFont.TabIndex = 1; + this.comboBoxSubtitleFont.SelectedIndexChanged += new System.EventHandler(this.comboBoxSubtitleFont_SelectedIndexChanged); + this.comboBoxSubtitleFont.SelectedValueChanged += new System.EventHandler(this.comboBoxSubtitleFont_SelectedValueChanged); + // + // comboBoxSubtitleFontSize + // + this.comboBoxSubtitleFontSize.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxSubtitleFontSize.FormattingEnabled = true; + this.comboBoxSubtitleFontSize.Items.AddRange(new object[] { + "15", + "16", + "17", + "18", + "19", + "20", + "21", + "22", + "23", + "24", + "25", + "26", + "27", + "28", + "29", + "30", + "31", + "32", + "33", + "34", + "35", + "36", + "37", + "38", + "39", + "40", + "41", + "42", + "43", + "44", + "45", + "46", + "47", + "48", + "49", + "50", + "51", + "52", + "53", + "54", + "55", + "56", + "57", + "58", + "59", + "60", + "61", + "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", + "110", + "120", + "130", + "140", + "150", + "160", + "170", + "180", + "190", + "200", + "225", + "250", + "275", + "300", + "325", + "350", + "375", + "400", + "425", + "450", + "475", + "500"}); + this.comboBoxSubtitleFontSize.Location = new System.Drawing.Point(112, 51); + this.comboBoxSubtitleFontSize.Name = "comboBoxSubtitleFontSize"; + this.comboBoxSubtitleFontSize.Size = new System.Drawing.Size(123, 21); + this.comboBoxSubtitleFontSize.TabIndex = 3; + this.comboBoxSubtitleFontSize.SelectedIndexChanged += new System.EventHandler(this.comboBoxSubtitleFontSize_SelectedIndexChanged); + // + // labelSubtitleFont + // + this.labelSubtitleFont.AutoSize = true; + this.labelSubtitleFont.Location = new System.Drawing.Point(6, 29); + this.labelSubtitleFont.Name = "labelSubtitleFont"; + this.labelSubtitleFont.Size = new System.Drawing.Size(63, 13); + this.labelSubtitleFont.TabIndex = 0; + this.labelSubtitleFont.Text = "Subtitle font"; + // + // labelBorderWidth + // + this.labelBorderWidth.Location = new System.Drawing.Point(427, 54); + this.labelBorderWidth.Name = "labelBorderWidth"; + this.labelBorderWidth.RightToLeft = System.Windows.Forms.RightToLeft.No; + this.labelBorderWidth.Size = new System.Drawing.Size(110, 13); + this.labelBorderWidth.TabIndex = 16; + this.labelBorderWidth.Text = "Border width"; + this.labelBorderWidth.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // comboBoxBorderWidth + // + this.comboBoxBorderWidth.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxBorderWidth.FormattingEnabled = true; + this.comboBoxBorderWidth.Items.AddRange(new object[] { + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15"}); + this.comboBoxBorderWidth.Location = new System.Drawing.Point(543, 51); + this.comboBoxBorderWidth.Name = "comboBoxBorderWidth"; + this.comboBoxBorderWidth.Size = new System.Drawing.Size(128, 21); + this.comboBoxBorderWidth.TabIndex = 32; + this.comboBoxBorderWidth.SelectedIndexChanged += new System.EventHandler(this.comboBoxBorderWidth_SelectedIndexChanged); + // + // panelBorderColor + // + this.panelBorderColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelBorderColor.Location = new System.Drawing.Point(677, 25); + this.panelBorderColor.Name = "panelBorderColor"; + this.panelBorderColor.Size = new System.Drawing.Size(21, 20); + this.panelBorderColor.TabIndex = 31; + this.panelBorderColor.MouseClick += new System.Windows.Forms.MouseEventHandler(this.panelBorderColor_MouseClick); + // + // buttonBorderColor + // + this.buttonBorderColor.Location = new System.Drawing.Point(543, 24); + this.buttonBorderColor.Name = "buttonBorderColor"; + this.buttonBorderColor.Size = new System.Drawing.Size(128, 23); + this.buttonBorderColor.TabIndex = 30; + this.buttonBorderColor.Text = "Border color"; + this.buttonBorderColor.UseVisualStyleBackColor = true; + this.buttonBorderColor.Click += new System.EventHandler(this.buttonBorderColor_Click); + // + // panelColor + // + this.panelColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelColor.Location = new System.Drawing.Point(414, 25); + this.panelColor.Name = "panelColor"; + this.panelColor.Size = new System.Drawing.Size(21, 20); + this.panelColor.TabIndex = 12; + this.panelColor.MouseClick += new System.Windows.Forms.MouseEventHandler(this.panelColor_MouseClick); + // + // buttonColor + // + this.buttonColor.Location = new System.Drawing.Point(287, 24); + this.buttonColor.Name = "buttonColor"; + this.buttonColor.Size = new System.Drawing.Size(121, 23); + this.buttonColor.TabIndex = 18; + this.buttonColor.Text = "Color"; + this.buttonColor.UseVisualStyleBackColor = true; + this.buttonColor.Click += new System.EventHandler(this.buttonColor_Click); + // + // checkBoxSkipEmptyFrameAtStart + // + this.checkBoxSkipEmptyFrameAtStart.AutoSize = true; + this.checkBoxSkipEmptyFrameAtStart.Checked = true; + this.checkBoxSkipEmptyFrameAtStart.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxSkipEmptyFrameAtStart.Location = new System.Drawing.Point(287, 92); + this.checkBoxSkipEmptyFrameAtStart.Name = "checkBoxSkipEmptyFrameAtStart"; + this.checkBoxSkipEmptyFrameAtStart.Size = new System.Drawing.Size(147, 17); + this.checkBoxSkipEmptyFrameAtStart.TabIndex = 15; + this.checkBoxSkipEmptyFrameAtStart.Text = "Skip empty frames at start"; + this.checkBoxSkipEmptyFrameAtStart.UseVisualStyleBackColor = true; + // + // checkBoxFcpFullPathUrl + // + this.checkBoxFcpFullPathUrl.AutoSize = true; + this.checkBoxFcpFullPathUrl.Location = new System.Drawing.Point(6, 161); + this.checkBoxFcpFullPathUrl.Name = "checkBoxFcpFullPathUrl"; + this.checkBoxFcpFullPathUrl.Size = new System.Drawing.Size(182, 17); + this.checkBoxFcpFullPathUrl.TabIndex = 62; + this.checkBoxFcpFullPathUrl.Text = "Use full image path url in FCP xml"; + this.checkBoxFcpFullPathUrl.UseVisualStyleBackColor = true; + // + // labelLeftRightMargin + // + this.labelLeftRightMargin.AutoSize = true; + this.labelLeftRightMargin.Location = new System.Drawing.Point(6, 161); + this.labelLeftRightMargin.Name = "labelLeftRightMargin"; + this.labelLeftRightMargin.Size = new System.Drawing.Size(84, 13); + this.labelLeftRightMargin.TabIndex = 56; + this.labelLeftRightMargin.Text = "Left/right margin"; + // + // groupBoxExportImage + // + this.groupBoxExportImage.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxExportImage.Controls.Add(this.linkLabelPreview); + this.groupBoxExportImage.Controls.Add(this.panelVlcTemp); + this.groupBoxExportImage.Controls.Add(this.pictureBox1); + this.groupBoxExportImage.Location = new System.Drawing.Point(13, 415); + this.groupBoxExportImage.Name = "groupBoxExportImage"; + this.groupBoxExportImage.Size = new System.Drawing.Size(962, 178); + this.groupBoxExportImage.TabIndex = 1; + this.groupBoxExportImage.TabStop = false; + // + // linkLabelPreview + // + this.linkLabelPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.linkLabelPreview.AutoSize = true; + this.linkLabelPreview.Location = new System.Drawing.Point(906, 16); + this.linkLabelPreview.Name = "linkLabelPreview"; + this.linkLabelPreview.Size = new System.Drawing.Size(45, 13); + this.linkLabelPreview.TabIndex = 9; + this.linkLabelPreview.TabStop = true; + this.linkLabelPreview.Text = "Preview"; + this.linkLabelPreview.TextAlign = System.Drawing.ContentAlignment.TopRight; + this.linkLabelPreview.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabelPreview_LinkClicked); + // + // panelVlcTemp + // + this.panelVlcTemp.Location = new System.Drawing.Point(642, 52); + this.panelVlcTemp.Name = "panelVlcTemp"; + this.panelVlcTemp.Size = new System.Drawing.Size(200, 100); + this.panelVlcTemp.TabIndex = 10; + this.panelVlcTemp.Visible = false; + // + // timerPreview + // + this.timerPreview.Interval = 500; + this.timerPreview.Tick += new System.EventHandler(this.timerPreview_Tick); + // + // contextMenuStripListView + // + this.contextMenuStripListView.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.normalToolStripMenuItem, + this.italicToolStripMenuItem, + this.boxSingleLineToolStripMenuItem, + this.boxMultiLineToolStripMenuItem, + this.toolStripSeparatorAdjust, + this.adjustDisplayTimeToolStripMenuItem, + this.adjustTimeCodesToolStripMenuItem}); + this.contextMenuStripListView.Name = "contextMenuStripListView"; + this.contextMenuStripListView.Size = new System.Drawing.Size(185, 142); + this.contextMenuStripListView.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStripListView_Opening); + // + // normalToolStripMenuItem + // + this.normalToolStripMenuItem.Name = "normalToolStripMenuItem"; + this.normalToolStripMenuItem.Size = new System.Drawing.Size(184, 22); + this.normalToolStripMenuItem.Text = "Normal"; + this.normalToolStripMenuItem.Click += new System.EventHandler(this.normalToolStripMenuItem_Click); + // + // italicToolStripMenuItem + // + this.italicToolStripMenuItem.Name = "italicToolStripMenuItem"; + this.italicToolStripMenuItem.Size = new System.Drawing.Size(184, 22); + this.italicToolStripMenuItem.Text = "Italic"; + this.italicToolStripMenuItem.Click += new System.EventHandler(this.italicToolStripMenuItem_Click); + // + // boxSingleLineToolStripMenuItem + // + this.boxSingleLineToolStripMenuItem.Name = "boxSingleLineToolStripMenuItem"; + this.boxSingleLineToolStripMenuItem.Size = new System.Drawing.Size(184, 22); + this.boxSingleLineToolStripMenuItem.Text = "Box - single line"; + this.boxSingleLineToolStripMenuItem.Click += new System.EventHandler(this.boxSingleLineToolStripMenuItem_Click); + // + // boxMultiLineToolStripMenuItem + // + this.boxMultiLineToolStripMenuItem.Name = "boxMultiLineToolStripMenuItem"; + this.boxMultiLineToolStripMenuItem.Size = new System.Drawing.Size(184, 22); + this.boxMultiLineToolStripMenuItem.Text = "Box - multi line"; + this.boxMultiLineToolStripMenuItem.Click += new System.EventHandler(this.boxMultiLineToolStripMenuItem_Click); + // + // toolStripSeparatorAdjust + // + this.toolStripSeparatorAdjust.Name = "toolStripSeparatorAdjust"; + this.toolStripSeparatorAdjust.Size = new System.Drawing.Size(181, 6); + // + // adjustDisplayTimeToolStripMenuItem + // + this.adjustDisplayTimeToolStripMenuItem.Name = "adjustDisplayTimeToolStripMenuItem"; + this.adjustDisplayTimeToolStripMenuItem.Size = new System.Drawing.Size(184, 22); + this.adjustDisplayTimeToolStripMenuItem.Text = "Adjust display time..."; + this.adjustDisplayTimeToolStripMenuItem.Click += new System.EventHandler(this.adjustDisplayTimeToolStripMenuItem_Click); + // + // adjustTimeCodesToolStripMenuItem + // + this.adjustTimeCodesToolStripMenuItem.Name = "adjustTimeCodesToolStripMenuItem"; + this.adjustTimeCodesToolStripMenuItem.Size = new System.Drawing.Size(184, 22); + this.adjustTimeCodesToolStripMenuItem.Text = "Adjust time codes..."; + this.adjustTimeCodesToolStripMenuItem.Click += new System.EventHandler(this.adjustTimeCodesToolStripMenuItem_Click); + // + // subtitleListView1 + // + this.subtitleListView1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.subtitleListView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader1, + this.columnHeader2, + this.columnHeader3, + this.columnHeader4, + this.columnHeader5}); + this.subtitleListView1.ContextMenuStrip = this.contextMenuStripListView; + this.subtitleListView1.FullRowSelect = true; + this.subtitleListView1.GridLines = true; + this.subtitleListView1.HideSelection = false; + this.subtitleListView1.Location = new System.Drawing.Point(13, 13); + this.subtitleListView1.Name = "subtitleListView1"; + this.subtitleListView1.Size = new System.Drawing.Size(962, 199); + this.subtitleListView1.TabIndex = 7; + this.subtitleListView1.UseCompatibleStateImageBehavior = false; + this.subtitleListView1.View = System.Windows.Forms.View.Details; + this.subtitleListView1.SelectedIndexChanged += new System.EventHandler(this.subtitleListView1_SelectedIndexChanged); + this.subtitleListView1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.subtitleListView1_KeyDown); + // + // ExportPngXml + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(981, 632); + this.Controls.Add(this.subtitleListView1); + this.Controls.Add(this.groupBoxExportImage); + this.Controls.Add(this.groupBoxImageSettings); + this.Controls.Add(this.progressBar1); + this.Controls.Add(this.buttonExport); + this.Controls.Add(this.buttonCancel); + this.KeyPreview = true; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(890, 667); + this.Name = "ExportPngXml"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "ExportPngXml"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.ExportPngXml_FormClosing); + this.Shown += new System.EventHandler(this.ExportPngXml_Shown); + this.ResizeEnd += new System.EventHandler(this.ExportPngXml_ResizeEnd); + this.SizeChanged += new System.EventHandler(this.ExportPngXml_SizeChanged); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ExportPngXml_KeyDown); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.contextMenuStrip1.ResumeLayout(false); + this.groupBoxImageSettings.ResumeLayout(false); + this.groupBoxImageSettings.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownLineSpacing)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownShadowTransparency)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDepth3D)).EndInit(); + this.groupBoxExportImage.ResumeLayout(false); + this.groupBoxExportImage.PerformLayout(); + this.contextMenuStripListView.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Button buttonExport; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.FolderBrowserDialog folderBrowserDialog1; + private System.Windows.Forms.ProgressBar progressBar1; + private System.Windows.Forms.GroupBox groupBoxImageSettings; + private System.Windows.Forms.Label labelBorderWidth; + private System.Windows.Forms.ComboBox comboBoxBorderWidth; + private System.Windows.Forms.Panel panelBorderColor; + private System.Windows.Forms.Button buttonBorderColor; + private System.Windows.Forms.Panel panelColor; + private System.Windows.Forms.Button buttonColor; + private System.Windows.Forms.Label labelSubtitleFontSize; + private System.Windows.Forms.ComboBox comboBoxSubtitleFont; + private System.Windows.Forms.ComboBox comboBoxSubtitleFontSize; + private System.Windows.Forms.Label labelSubtitleFont; + private System.Windows.Forms.CheckBox checkBoxSimpleRender; + private System.Windows.Forms.SaveFileDialog saveFileDialog1; + private System.Windows.Forms.ComboBox comboBoxHAlign; + private System.Windows.Forms.Label labelHorizontalAlign; + private System.Windows.Forms.Label labelResolution; + private System.Windows.Forms.ComboBox comboBoxResolution; + private System.Windows.Forms.CheckBox checkBoxBold; + private System.Windows.Forms.Label labelImageFormat; + private System.Windows.Forms.ComboBox comboBoxImageFormat; + private System.Windows.Forms.Label labelLanguage; + private System.Windows.Forms.ComboBox comboBoxLanguage; + private System.Windows.Forms.Label labelFrameRate; + private System.Windows.Forms.ComboBox comboBoxFrameRate; + private System.Windows.Forms.ComboBox comboBoxBottomMargin; + private System.Windows.Forms.Label labelBottomMargin; + private System.Windows.Forms.CheckBox checkBoxSkipEmptyFrameAtStart; + private System.Windows.Forms.Button buttonCustomResolution; + private System.Windows.Forms.GroupBox groupBoxExportImage; + private System.Windows.Forms.NumericUpDown numericUpDownDepth3D; + private System.Windows.Forms.Label labelDepth; + private System.Windows.Forms.Label label3D; + private System.Windows.Forms.ComboBox comboBox3D; + private System.Windows.Forms.Timer timerPreview; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; + private System.Windows.Forms.ToolStripMenuItem saveImageAsToolStripMenuItem; + private System.Windows.Forms.Label labelShadowWidth; + private System.Windows.Forms.ComboBox comboBoxShadowWidth; + private System.Windows.Forms.Panel panelShadowColor; + private System.Windows.Forms.Button buttonShadowColor; + private System.Windows.Forms.NumericUpDown numericUpDownShadowTransparency; + private System.Windows.Forms.Label labelShadowTransparency; + private System.Windows.Forms.Label labelLineHeight; + private System.Windows.Forms.NumericUpDown numericUpDownLineSpacing; + private System.Windows.Forms.CheckBox checkBoxTransAntiAliase; + private System.Windows.Forms.ContextMenuStrip contextMenuStripListView; + private System.Windows.Forms.ToolStripMenuItem boxSingleLineToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem boxMultiLineToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem normalToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem italicToolStripMenuItem; + private System.Windows.Forms.ListView subtitleListView1; + private System.Windows.Forms.ColumnHeader columnHeader1; + private System.Windows.Forms.ColumnHeader columnHeader2; + private System.Windows.Forms.ColumnHeader columnHeader3; + private System.Windows.Forms.ColumnHeader columnHeader4; + private System.Windows.Forms.ColumnHeader columnHeader5; + private System.Windows.Forms.LinkLabel linkLabelPreview; + private System.Windows.Forms.Panel panelVlcTemp; + private System.Windows.Forms.CheckBox checkBoxFullFrameImage; + private System.Windows.Forms.ComboBox comboBoxLeftRightMargin; + private System.Windows.Forms.Label labelLeftRightMargin; + private System.Windows.Forms.Panel panelFullFrameBackground; + private System.Windows.Forms.Label labelLineHeightStyle; + private System.Windows.Forms.ComboBox comboBoxBottomMarginUnit; + private System.Windows.Forms.ComboBox comboBoxLeftRightMarginUnit; + private System.Windows.Forms.ComboBox comboBoxResizePercentage; + private System.Windows.Forms.Label labelResize; + private System.Windows.Forms.ToolStripMenuItem adjustTimeCodesToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparatorAdjust; + private System.Windows.Forms.ToolStripMenuItem adjustDisplayTimeToolStripMenuItem; + private System.Windows.Forms.CheckBox checkBoxFcpFullPathUrl; + } } \ No newline at end of file diff --git a/src/Forms/ExportPngXml.cs b/src/ui/Forms/ExportPngXml.cs similarity index 97% rename from src/Forms/ExportPngXml.cs rename to src/ui/Forms/ExportPngXml.cs index 00872947c..db007e1df 100644 --- a/src/Forms/ExportPngXml.cs +++ b/src/ui/Forms/ExportPngXml.cs @@ -1,5920 +1,5920 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.BluRaySup; -using Nikse.SubtitleEdit.Core.Enums; -using Nikse.SubtitleEdit.Core.Interfaces; -using Nikse.SubtitleEdit.Core.SubtitleFormats; -using Nikse.SubtitleEdit.Core.VobSub; -using Nikse.SubtitleEdit.Logic; -using Nikse.SubtitleEdit.Logic.VideoPlayers; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Drawing.Imaging; -using System.Drawing.Text; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading; -using System.Windows.Forms; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class ExportPngXml : PositionAndSizeForm - { - internal class ExportFormats - { - internal const string BluraySup = "BLURAYSUP"; - internal const string VobSub = "VOBSUB"; - internal const string Fab = "FAB"; - internal const string Stl = "STL"; - internal const string Fcp = "FCP"; - internal const string Dost = "DOSTIMAGE"; - internal const string DCinemaInterop = "DCINEMA_INTEROP"; - internal const string DCinemaSmpte2014 = "DCINEMA_SMPTE_2014"; - internal const string BdnXml = "BDNXML"; - internal const string Edl = "EDL"; - internal const string EdlClipName = "EDL_CLIPNAME"; - internal const string ImageFrame = "IMAGE/FRAME"; - internal const string Spumux = "SPUMUX"; - } - - internal class MakeBitmapParameter - { - public Bitmap Bitmap { get; set; } - public Paragraph P { get; set; } - public string Type { get; set; } - public Color SubtitleColor { get; set; } - public string SubtitleFontName { get; set; } - public float SubtitleFontSize { get; set; } - public bool SubtitleFontBold { get; set; } - public Color BorderColor { get; set; } - public float BorderWidth { get; set; } - public bool BoxSingleLine { get; set; } - public bool SimpleRendering { get; set; } - public bool AlignLeft { get; set; } - public bool AlignRight { get; set; } - public bool JustifyLeft { get; set; } - public bool JustifyTop { get; set; } - public bool JustifyRight { get; set; } - public byte[] Buffer { get; set; } - public int ScreenWidth { get; set; } - public int ScreenHeight { get; set; } - public string VideoResolution { get; set; } - public int Type3D { get; set; } - public int Depth3D { get; set; } - public double FramesPerSeconds { get; set; } - public int BottomMargin { get; set; } - public int LeftMargin { get; set; } - public int RightMargin { get; set; } - public bool Saved { get; set; } - public ContentAlignment Alignment { get; set; } - public Point? OverridePosition { get; set; } - public Color BackgroundColor { get; set; } - public string SavDialogFileName { get; set; } - public string Error { get; set; } - public string LineJoin { get; set; } - public Color ShadowColor { get; set; } - public float ShadowWidth { get; set; } - public int ShadowAlpha { get; set; } - public Dictionary LineHeight { get; set; } - public bool Forced { get; set; } - public bool FullFrame { get; set; } - public Color FullFrameBackgroundColor { get; set; } - - public MakeBitmapParameter() - { - BackgroundColor = Color.Transparent; - } - } - - private Subtitle _subtitle; - private SubtitleFormat _format; - private static string _formatName; - private Color _subtitleColor; - private string _subtitleFontName = "Verdana"; - private float _subtitleFontSize = 25.0f; - private bool _subtitleFontBold; - private Color _borderColor; - private float _borderWidth = 2.0f; - private bool _isLoading = true; - private string _language = "en"; - private string _exportType = ExportFormats.BdnXml; - private string _fileName; - private string _outputFileName; - private IBinaryParagraphList _vobSubOcr; - private readonly System.Windows.Forms.Timer _previewTimer = new System.Windows.Forms.Timer(); - private string _videoFileName; - private readonly Dictionary _lineHeights; - private static int _boxBorderSize = 8; - - private const string BoxMultiLineText = "BoxMultiLine"; - private const string BoxSingleLineText = "BoxSingleLine"; - - public string GetOutputFileName() - { - return _outputFileName; - } - - public ExportPngXml() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - var toolTip = new ToolTip { ShowAlways = true }; - toolTip.SetToolTip(panelFullFrameBackground, Configuration.Settings.Language.ExportPngXml.ChooseBackgroundColor); - _lineHeights = new Dictionary(); - comboBoxImageFormat.SelectedIndex = 4; - _subtitleColor = Color.FromArgb(byte.MaxValue, Configuration.Settings.Tools.ExportFontColor); - _borderColor = Configuration.Settings.Tools.ExportBorderColor; - _boxBorderSize = Configuration.Settings.Tools.ExportBoxBorderSize; - _previewTimer.Tick += previewTimer_Tick; - _previewTimer.Interval = 100; - labelLineHeightStyle.Text = string.Empty; - } - - private void previewTimer_Tick(object sender, EventArgs e) - { - _previewTimer.Stop(); - GeneratePreview(); - } - - private double FrameRate - { - get - { - if (comboBoxFrameRate.SelectedItem == null) - { - return 25; - } - - string s = comboBoxFrameRate.SelectedItem.ToString(); - s = s.Replace(",", ".").Replace(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, ".").Trim(); - if (double.TryParse(s, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var d)) - { - return d; - } - - return 25; - } - } - - private int MillisecondsToFramesMaxFrameRate(double milliseconds) - { - int frames = (int)Math.Round(milliseconds / (TimeCode.BaseUnit / FrameRate)); - if (frames >= FrameRate) - { - frames = (int)(FrameRate - 0.01); - } - - return frames; - } - - private string ToHHMMSSFF(TimeCode timeCode) - { - return $"{timeCode.Hours:00}:{timeCode.Minutes:00}:{timeCode.Seconds:00}:{MillisecondsToFramesMaxFrameRate(timeCode.Milliseconds):00}"; - } - - private static ContentAlignment GetAlignmentFromParagraph(MakeBitmapParameter p, SubtitleFormat format, Subtitle subtitle) - { - var alignment = ContentAlignment.BottomCenter; - if (p.AlignLeft) - { - alignment = ContentAlignment.BottomLeft; - } - else if (p.AlignRight) - { - alignment = ContentAlignment.BottomRight; - } - - if (format.HasStyleSupport && !string.IsNullOrEmpty(p.P.Extra)) - { - if (format.GetType() == typeof(SubStationAlpha)) - { - var style = AdvancedSubStationAlpha.GetSsaStyle(p.P.Extra, subtitle.Header); - alignment = GetSsaAlignment("{\\a" + style.Alignment + "}", alignment); - } - else if (format.GetType() == typeof(AdvancedSubStationAlpha)) - { - var style = AdvancedSubStationAlpha.GetSsaStyle(p.P.Extra, subtitle.Header); - alignment = GetAssAlignment("{\\an" + style.Alignment + "}", alignment); - } - } - - string text = p.P.Text; - if (format.GetType() == typeof(SubStationAlpha) && text.Length > 5) - { - text = p.P.Text.Substring(0, 6); - alignment = GetSsaAlignment(text, alignment); - } - else if (text.Length > 6) - { - text = p.P.Text.Substring(0, 6); - alignment = GetAssAlignment(text, alignment); - } - return alignment; - } - - private static ContentAlignment GetSsaAlignment(string text, ContentAlignment defaultAlignment) - { - //1: Bottom left - //2: Bottom center - //3: Bottom right - //9: Middle left - //10: Middle center - //11: Middle right - //5: Top left - //6: Top center - //7: Top right - switch (text) - { - case "{\\a1}": - return ContentAlignment.BottomLeft; - case "{\\a2}": - return ContentAlignment.BottomCenter; - case "{\\a3}": - return ContentAlignment.BottomRight; - case "{\\a9}": - return ContentAlignment.MiddleLeft; - case "{\\a10}": - return ContentAlignment.MiddleCenter; - case "{\\a11}": - return ContentAlignment.MiddleRight; - case "{\\a5}": - return ContentAlignment.TopLeft; - case "{\\a6}": - return ContentAlignment.TopCenter; - case "{\\a7}": - return ContentAlignment.TopRight; - } - return defaultAlignment; - } - - private static ContentAlignment GetAssAlignment(string text, ContentAlignment defaultAlignment) - { - //1: Bottom left - //2: Bottom center - //3: Bottom right - //4: Middle left - //5: Middle center - //6: Middle right - //7: Top left - //8: Top center - //9: Top right - switch (text) - { - case "{\\an1}": - return ContentAlignment.BottomLeft; - case "{\\an2}": - return ContentAlignment.BottomCenter; - case "{\\an3}": - return ContentAlignment.BottomRight; - case "{\\an4}": - return ContentAlignment.MiddleLeft; - case "{\\an5}": - return ContentAlignment.MiddleCenter; - case "{\\an6}": - return ContentAlignment.MiddleRight; - case "{\\an7}": - return ContentAlignment.TopLeft; - case "{\\an8}": - return ContentAlignment.TopCenter; - case "{\\an9}": - return ContentAlignment.TopRight; - } - return defaultAlignment; - } - - public static void DoWork(object data) - { - var parameter = (MakeBitmapParameter)data; - - parameter.LineJoin = Configuration.Settings.Tools.ExportPenLineJoin; - parameter.Bitmap = GenerateImageFromTextWithStyle(parameter); - if (parameter.Type == ExportFormats.BluraySup) - { - MakeBluRaySupImage(parameter); - } - } - - internal static void MakeBluRaySupImage(MakeBitmapParameter param) - { - var brSub = new BluRaySupPicture - { - StartTime = (long)param.P.StartTime.TotalMilliseconds, - EndTime = (long)param.P.EndTime.TotalMilliseconds, - Width = param.ScreenWidth, - Height = param.ScreenHeight, - IsForced = param.Forced, - CompositionNumber = param.P.Number * 2 - }; - if (param.FullFrame) - { - var nbmp = new NikseBitmap(param.Bitmap); - nbmp.ReplaceTransparentWith(param.FullFrameBackgroundColor); - using (var bmp = nbmp.GetBitmap()) - { - int top = param.ScreenHeight - (param.Bitmap.Height + param.BottomMargin); - int left = (param.ScreenWidth - param.Bitmap.Width) / 2; - - var b = new NikseBitmap(param.ScreenWidth, param.ScreenHeight); - { - b.Fill(param.FullFrameBackgroundColor); - using (var fullSize = b.GetBitmap()) - { - if (param.Alignment == ContentAlignment.BottomLeft || param.Alignment == ContentAlignment.MiddleLeft || param.Alignment == ContentAlignment.TopLeft) - { - left = param.LeftMargin; - } - else if (param.Alignment == ContentAlignment.BottomRight || param.Alignment == ContentAlignment.MiddleRight || param.Alignment == ContentAlignment.TopRight) - { - left = param.ScreenWidth - param.Bitmap.Width - param.RightMargin; - } - - if (param.Alignment == ContentAlignment.TopLeft || param.Alignment == ContentAlignment.TopCenter || param.Alignment == ContentAlignment.TopRight) - { - top = param.BottomMargin; - } - - if (param.Alignment == ContentAlignment.MiddleLeft || param.Alignment == ContentAlignment.MiddleCenter || param.Alignment == ContentAlignment.MiddleRight) - { - top = param.ScreenHeight - (param.Bitmap.Height / 2); - } - - if (param.OverridePosition != null && - param.OverridePosition.Value.X >= 0 && param.OverridePosition.Value.X < param.ScreenWidth && - param.OverridePosition.Value.Y >= 0 && param.OverridePosition.Value.Y < param.ScreenHeight) - { - left = param.OverridePosition.Value.X; - top = param.OverridePosition.Value.Y; - } - - using (var g = Graphics.FromImage(fullSize)) - { - g.DrawImage(bmp, left, top); - g.Dispose(); - } - param.Buffer = BluRaySupPicture.CreateSupFrame(brSub, fullSize, param.FramesPerSeconds, 0, 0, ContentAlignment.BottomCenter); - } - } - } - } - else - { - if (param.OverridePosition != null && - param.OverridePosition.Value.X >= 0 && param.OverridePosition.Value.X < param.ScreenWidth && - param.OverridePosition.Value.Y >= 0 && param.OverridePosition.Value.Y < param.ScreenHeight) - { - param.LeftMargin = param.OverridePosition.Value.X; - param.BottomMargin = param.ScreenHeight - param.OverridePosition.Value.Y - param.Bitmap.Height; - } - - var margin = (param.Alignment == ContentAlignment.TopRight || - param.Alignment == ContentAlignment.MiddleRight || - param.Alignment == ContentAlignment.BottomRight) - ? param.RightMargin - : param.LeftMargin; - - param.Buffer = BluRaySupPicture.CreateSupFrame(brSub, param.Bitmap, param.FramesPerSeconds, param.BottomMargin, margin, param.Alignment, param.OverridePosition); - } - } - - internal MakeBitmapParameter MakeMakeBitmapParameter(int index, int screenWidth, int screenHeight) - { - var p = _subtitle.GetParagraphOrDefault(index); - var parameter = new MakeBitmapParameter - { - Type = _exportType, - SubtitleColor = _subtitleColor, - SubtitleFontName = _subtitleFontName, - SubtitleFontSize = _subtitleFontSize, - SubtitleFontBold = _subtitleFontBold, - BorderColor = _borderColor, - BorderWidth = _borderWidth, - SimpleRendering = checkBoxSimpleRender.Checked, - AlignLeft = comboBoxHAlign.SelectedIndex == 0, - AlignRight = comboBoxHAlign.SelectedIndex == 2, - JustifyLeft = GetJustifyLeft(p.Text), // center, left justify - JustifyTop = comboBoxHAlign.SelectedIndex == 4, // center, top justify - JustifyRight = comboBoxHAlign.SelectedIndex == 5, // center, right justify - ScreenWidth = screenWidth, - ScreenHeight = screenHeight, - VideoResolution = comboBoxResolution.Text, - Bitmap = null, - FramesPerSeconds = FrameRate, - BottomMargin = GetBottomMarginInPixels(p), - LeftMargin = GetLeftMarginInPixels(p), - RightMargin = GetRightMarginInPixels(p), - Saved = false, - Alignment = ContentAlignment.BottomCenter, - Type3D = comboBox3D.SelectedIndex, - Depth3D = (int)numericUpDownDepth3D.Value, - BackgroundColor = Color.Transparent, - SavDialogFileName = saveFileDialog1.FileName, - ShadowColor = panelShadowColor.BackColor, - ShadowWidth = GetShadowWidth(), - ShadowAlpha = (int)numericUpDownShadowTransparency.Value, - LineHeight = _lineHeights, - FullFrame = checkBoxFullFrameImage.Checked, - FullFrameBackgroundColor = panelFullFrameBackground.BackColor, - }; - if (index < _subtitle.Paragraphs.Count) - { - parameter.P = _subtitle.Paragraphs[index]; - parameter.Alignment = GetAlignmentFromParagraph(parameter, _format, _subtitle); - parameter.OverridePosition = GetAssPoint(parameter.P.Text); - parameter.Forced = subtitleListView1.Items[index].Checked; - - if (_format.HasStyleSupport && !string.IsNullOrEmpty(parameter.P.Extra)) - { - if (_format.GetType() == typeof(SubStationAlpha)) - { - var style = AdvancedSubStationAlpha.GetSsaStyle(parameter.P.Extra, _subtitle.Header); - parameter.SubtitleColor = style.Primary; - parameter.SubtitleFontBold = style.Bold; - parameter.SubtitleFontSize = style.FontSize; - parameter.SubtitleFontName = style.FontName; - parameter.BottomMargin = style.MarginVertical; - if (style.BorderStyle == "3") - { - parameter.BackgroundColor = style.Background; - } - parameter.ShadowColor = style.Outline; - } - else if (_format.GetType() == typeof(AdvancedSubStationAlpha)) - { - var style = AdvancedSubStationAlpha.GetSsaStyle(parameter.P.Extra, _subtitle.Header); - parameter.SubtitleColor = style.Primary; - parameter.SubtitleFontBold = style.Bold; - parameter.SubtitleFontSize = style.FontSize; - parameter.SubtitleFontName = style.FontName; - parameter.BottomMargin = style.MarginVertical; - if (style.BorderStyle == "3") - { - parameter.BackgroundColor = style.Outline; - } - parameter.ShadowAlpha = style.Background.A; - parameter.ShadowColor = style.Background; - } - } - - if (comboBoxBorderWidth.SelectedItem.ToString() == Configuration.Settings.Language.ExportPngXml.BorderStyleBoxForEachLine) - { - parameter.BoxSingleLine = true; - parameter.BackgroundColor = panelBorderColor.BackColor; - parameter.BorderWidth = 0; - } - else if (comboBoxBorderWidth.SelectedItem.ToString() == Configuration.Settings.Language.ExportPngXml.BorderStyleOneBox) - { - parameter.BoxSingleLine = false; - parameter.BackgroundColor = panelBorderColor.BackColor; - parameter.BorderWidth = 0; - } - else - { - _borderWidth = GetBorderWidth(); - } - } - else - { - parameter.P = null; - } - return parameter; - } - - private bool GetJustifyLeft(string text) - { - if (comboBoxHAlign.SelectedIndex == 6 && !string.IsNullOrEmpty(text)) - { - var s = Utilities.RemoveUnneededSpaces(text, _language); - var dialogHelper = new DialogSplitMerge { TwoLetterLanguageCode = _language }; - var lines = s.SplitToLines(); - return dialogHelper.IsDialog(lines) || HasTwoSpeakers(lines); - } - - return comboBoxHAlign.SelectedIndex == 3; - } - - private static bool HasTwoSpeakers(List lines) - { - return lines.Count == 2 && lines[0].HasSentenceEnding() && lines[0].Contains(':') && lines[1].Contains(':'); - } - - private void ButtonExportClick(object sender, EventArgs e) - { - FixStartEndWithSameTimeCode(); - var singleFile = false; - - if (Configuration.Settings.General.CurrentVideoOffsetInMs != 0) - { - _subtitle.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(Configuration.Settings.General.CurrentVideoOffsetInMs)); - } - - var errors = new List(); - buttonExport.Enabled = false; - SetupImageParameters(); - - if (!string.IsNullOrEmpty(_fileName)) - { - saveFileDialog1.FileName = Path.GetFileNameWithoutExtension(_fileName); - } - - if (_exportType == ExportFormats.BluraySup) - { - saveFileDialog1.Title = Configuration.Settings.Language.ExportPngXml.SaveBluRraySupAs; - saveFileDialog1.DefaultExt = "*.sup"; - saveFileDialog1.AddExtension = true; - saveFileDialog1.Filter = "Blu-Ray sup|*.sup"; - singleFile = true; - } - else if (_exportType == ExportFormats.VobSub) - { - saveFileDialog1.Title = Configuration.Settings.Language.ExportPngXml.SaveVobSubAs; - saveFileDialog1.DefaultExt = "*.sub"; - saveFileDialog1.AddExtension = true; - saveFileDialog1.Filter = "VobSub|*.sub"; - singleFile = true; - } - else if (_exportType == ExportFormats.Fab) - { - saveFileDialog1.Title = Configuration.Settings.Language.ExportPngXml.SaveFabImageScriptAs; - saveFileDialog1.DefaultExt = "*.txt"; - saveFileDialog1.AddExtension = true; - saveFileDialog1.Filter = "FAB image scripts|*.txt"; - singleFile = true; - } - else if (_exportType == ExportFormats.Stl) - { - saveFileDialog1.Title = Configuration.Settings.Language.ExportPngXml.SaveDvdStudioProStlAs; - saveFileDialog1.DefaultExt = "*.txt"; - saveFileDialog1.AddExtension = true; - saveFileDialog1.Filter = "DVD Studio Pro STL|*.stl"; - singleFile = true; - } - else if (_exportType == ExportFormats.Fcp) - { - saveFileDialog1.Title = Configuration.Settings.Language.ExportPngXml.SaveFcpAs; - saveFileDialog1.DefaultExt = "*.xml"; - saveFileDialog1.AddExtension = true; - saveFileDialog1.Filter = "Xml files|*.xml"; - singleFile = true; - } - else if (_exportType == ExportFormats.Dost) - { - saveFileDialog1.Title = Configuration.Settings.Language.ExportPngXml.SaveDostAs; - saveFileDialog1.DefaultExt = "*.dost"; - saveFileDialog1.AddExtension = true; - saveFileDialog1.Filter = "Dost files|*.dost"; - singleFile = true; - } - else if (_exportType == ExportFormats.DCinemaInterop) - { - saveFileDialog1.Title = Configuration.Settings.Language.ExportPngXml.SaveDigitalCinemaInteropAs; - saveFileDialog1.DefaultExt = "*.xml"; - saveFileDialog1.AddExtension = true; - saveFileDialog1.Filter = "Xml files|*.xml"; - singleFile = true; - } - else if (_exportType == ExportFormats.DCinemaSmpte2014) - { - saveFileDialog1.Title = Configuration.Settings.Language.ExportPngXml.SaveDigitalCinemaSmpte2014; - saveFileDialog1.DefaultExt = "*.xml"; - saveFileDialog1.AddExtension = true; - saveFileDialog1.Filter = "Xml files|*.xml"; - singleFile = true; - } - else if (_exportType == ExportFormats.Edl || _exportType == ExportFormats.EdlClipName) - { - saveFileDialog1.Title = Configuration.Settings.Language.ExportPngXml.SavePremiereEdlAs; - saveFileDialog1.DefaultExt = "*.edl"; - saveFileDialog1.AddExtension = true; - saveFileDialog1.Filter = "EDL files|*.edl"; - singleFile = true; - } - - if (singleFile && saveFileDialog1.ShowDialog(this) == DialogResult.OK || !singleFile && folderBrowserDialog1.ShowDialog(this) == DialogResult.OK) - { - GetResolution(out var width, out var height); - - _outputFileName = singleFile ? saveFileDialog1.FileName : folderBrowserDialog1.SelectedPath; - - FileStream binarySubtitleFile = null; - VobSubWriter vobSubWriter = null; - Paragraph p = null; - if (subtitleListView1.SelectedItems.Count > 0) - { - p = _subtitle.GetParagraphOrDefault(subtitleListView1.SelectedItems[0].Index); - } - - if (_exportType == ExportFormats.BluraySup) - { - binarySubtitleFile = new FileStream(saveFileDialog1.FileName, FileMode.Create); - } - else if (_exportType == ExportFormats.VobSub) - { - vobSubWriter = new VobSubWriter(saveFileDialog1.FileName, width, height, GetBottomMarginInPixels(p), GetLeftMarginInPixels(p), 32, _subtitleColor, _borderColor, !checkBoxTransAntiAliase.Checked, (DvdSubtitleLanguage)comboBoxLanguage.SelectedItem); - } - - progressBar1.Value = 0; - progressBar1.Maximum = _subtitle.Paragraphs.Count - 1; - progressBar1.Visible = true; - _previewTimer.Tick -= previewTimer_Tick; - - int border = GetBottomMarginInPixels(p); - int imagesSavedCount = 0; - var sb = new StringBuilder(); - if (_exportType == ExportFormats.Stl) - { - sb.AppendLine("$SetFilePathToken =" + folderBrowserDialog1.SelectedPath); - sb.AppendLine(); - } - - if (_vobSubOcr != null) - { - int i = 0; - while (i < _subtitle.Paragraphs.Count) - { - var mp = MakeMakeBitmapParameter(i, width, height); - mp.Bitmap = _vobSubOcr.GetSubtitleBitmap(i++); - var exp = GetResizeScale(); - if (Math.Abs(exp - 1) > 0.01) - { - var resizedBitmap = ResizeBitmap(mp.Bitmap, (int)Math.Round(mp.Bitmap.Width * exp), (int)Math.Round(mp.Bitmap.Height * exp)); - mp.Bitmap.Dispose(); - mp.Bitmap = resizedBitmap; - } - if (_exportType == ExportFormats.BluraySup) - { - MakeBluRaySupImage(mp); - } - imagesSavedCount = WriteParagraph(width, sb, border, height, imagesSavedCount, vobSubWriter, binarySubtitleFile, mp, i); - progressBar1.Refresh(); - Application.DoEvents(); - if (i < progressBar1.Maximum) - { - progressBar1.Value = i; - } - } - } - else - { - var threadEqual = new Thread(DoWork); - var paramEqual = MakeMakeBitmapParameter(0, width, height); - - var threadUnEqual = new Thread(DoWork); - var paramUnEqual = new MakeBitmapParameter(); - if (_subtitle.Paragraphs.Count > 1) - { - MakeMakeBitmapParameter(1, width, height); - } - - threadEqual.Start(paramEqual); - int i = 1; - for (; i < _subtitle.Paragraphs.Count; i++) - { - if (i % 2 == 0) - { - paramEqual = MakeMakeBitmapParameter(i, width, height); - threadEqual = new Thread(DoWork); - threadEqual.Start(paramEqual); - - if (threadUnEqual.ThreadState == ThreadState.Running) - { - threadUnEqual.Join(); - } - - imagesSavedCount = WriteParagraph(width, sb, border, height, imagesSavedCount, vobSubWriter, binarySubtitleFile, paramUnEqual, i); - if (!string.IsNullOrEmpty(paramUnEqual.Error)) - { - errors.Add(paramUnEqual.Error); - } - } - else - { - paramUnEqual = MakeMakeBitmapParameter(i, width, height); - threadUnEqual = new Thread(DoWork); - threadUnEqual.Start(paramUnEqual); - - if (threadEqual.ThreadState == ThreadState.Running) - { - threadEqual.Join(); - } - - imagesSavedCount = WriteParagraph(width, sb, border, height, imagesSavedCount, vobSubWriter, binarySubtitleFile, paramEqual, i); - if (!string.IsNullOrEmpty(paramEqual.Error)) - { - errors.Add(paramEqual.Error); - } - } - progressBar1.Refresh(); - Application.DoEvents(); - progressBar1.Value = i; - } - - if (i % 2 == 0) - { - if (threadEqual.ThreadState == ThreadState.Running) - { - threadEqual.Join(); - } - - imagesSavedCount = WriteParagraph(width, sb, border, height, imagesSavedCount, vobSubWriter, binarySubtitleFile, paramEqual, i); - if (threadUnEqual.ThreadState == ThreadState.Running) - { - threadUnEqual.Join(); - } - - imagesSavedCount = WriteParagraph(width, sb, border, height, imagesSavedCount, vobSubWriter, binarySubtitleFile, paramUnEqual, i); - } - else - { - if (threadUnEqual.ThreadState == ThreadState.Running) - { - threadUnEqual.Join(); - } - - imagesSavedCount = WriteParagraph(width, sb, border, height, imagesSavedCount, vobSubWriter, binarySubtitleFile, paramUnEqual, i); - if (threadEqual.ThreadState == ThreadState.Running) - { - threadEqual.Join(); - } - - imagesSavedCount = WriteParagraph(width, sb, border, height, imagesSavedCount, vobSubWriter, binarySubtitleFile, paramEqual, i); - } - } - - if (errors.Count > 0) - { - var errorSb = new StringBuilder(); - for (int i = 0; i < 20; i++) - { - if (i < errors.Count) - { - errorSb.AppendLine(errors[i]); - } - } - if (errors.Count > 20) - { - errorSb.AppendLine("..."); - } - - MessageBox.Show(string.Format(Configuration.Settings.Language.ExportPngXml.SomeLinesWereTooLongX, errorSb)); - } - - _previewTimer.Tick += previewTimer_Tick; - progressBar1.Visible = false; - if (_exportType == ExportFormats.BluraySup) - { - binarySubtitleFile.Close(); - MessageBox.Show(string.Format(Configuration.Settings.Language.Main.SavedSubtitleX, saveFileDialog1.FileName)); - } - else if (_exportType == ExportFormats.VobSub) - { - vobSubWriter.WriteIdxFile(); - vobSubWriter.Dispose(); - MessageBox.Show(string.Format(Configuration.Settings.Language.Main.SavedSubtitleX, saveFileDialog1.FileName)); - } - else if (_exportType == ExportFormats.Fab) - { - File.WriteAllText(Path.Combine(folderBrowserDialog1.SelectedPath, "Fab_Image_script.txt"), sb.ToString()); - var text = string.Format(Configuration.Settings.Language.ExportPngXml.XImagesSavedInY, imagesSavedCount, folderBrowserDialog1.SelectedPath); - MessageBoxShowWithFolderName(text, folderBrowserDialog1.SelectedPath); - } - else if (_exportType == ExportFormats.ImageFrame) - { - var empty = new Bitmap(width, height); - imagesSavedCount++; - string numberString = $"{imagesSavedCount:00000}"; - string fileName = Path.Combine(folderBrowserDialog1.SelectedPath, numberString + "." + comboBoxImageFormat.Text.ToLowerInvariant()); - SaveImage(empty, fileName, ImageFormat); - var text = string.Format(Configuration.Settings.Language.ExportPngXml.XImagesSavedInY, imagesSavedCount, folderBrowserDialog1.SelectedPath); - MessageBoxShowWithFolderName(text, folderBrowserDialog1.SelectedPath); - } - else if (_exportType == ExportFormats.Stl) - { - File.WriteAllText(Path.Combine(folderBrowserDialog1.SelectedPath, "DVD_Studio_Pro_Image_script.stl"), sb.ToString()); - var text = string.Format(Configuration.Settings.Language.ExportPngXml.XImagesSavedInY, imagesSavedCount, folderBrowserDialog1.SelectedPath); - MessageBoxShowWithFolderName(text, folderBrowserDialog1.SelectedPath); - } - else if (_exportType == ExportFormats.Spumux) - { - string s = "" + Environment.NewLine + - "\t" + Environment.NewLine + - sb + - "\t" + Environment.NewLine + - ""; - File.WriteAllText(Path.Combine(folderBrowserDialog1.SelectedPath, "spu.xml"), s); - var text = string.Format(Configuration.Settings.Language.ExportPngXml.XImagesSavedInY, imagesSavedCount, folderBrowserDialog1.SelectedPath); - MessageBoxShowWithFolderName(text, folderBrowserDialog1.SelectedPath); - } - else if (_exportType == ExportFormats.Fcp) - { - WriteFcpFile(width, height, sb, saveFileDialog1.FileName); - var text = string.Format(Configuration.Settings.Language.ExportPngXml.XImagesSavedInY, imagesSavedCount, Path.GetDirectoryName(saveFileDialog1.FileName)); - MessageBoxShowWithFolderName(text, Path.GetDirectoryName(saveFileDialog1.FileName)); - } - else if (_exportType == ExportFormats.Dost) - { - WriteDostFile(saveFileDialog1.FileName, sb.ToString()); - var text = string.Format(Configuration.Settings.Language.ExportPngXml.XImagesSavedInY, imagesSavedCount, Path.GetDirectoryName(saveFileDialog1.FileName)); - MessageBoxShowWithFolderName(text, Path.GetDirectoryName(saveFileDialog1.FileName)); - } - else if (_exportType == ExportFormats.DCinemaInterop) - { - var doc = new XmlDocument(); - string title = "unknown"; - if (!string.IsNullOrEmpty(_fileName)) - { - title = Path.GetFileNameWithoutExtension(_fileName); - } - - string guid = Guid.NewGuid().ToString().RemoveChar('-').Insert(8, "-").Insert(13, "-").Insert(18, "-").Insert(23, "-"); - doc.LoadXml("" + Environment.NewLine + - "" + Environment.NewLine + - "" + guid + "" + Environment.NewLine + - "" + title + "" + Environment.NewLine + - "1" + Environment.NewLine + - "English" + Environment.NewLine + - sb + - ""); - string fName = saveFileDialog1.FileName; - if (!fName.EndsWith(".xml", StringComparison.OrdinalIgnoreCase)) - { - fName += ".xml"; - } - - File.WriteAllText(fName, SubtitleFormat.ToUtf8XmlString(doc)); - var text = string.Format(Configuration.Settings.Language.ExportPngXml.XImagesSavedInY, imagesSavedCount, Path.GetDirectoryName(fName)); - MessageBoxShowWithFolderName(text, Path.GetDirectoryName(fName)); - } - else if (_exportType == ExportFormats.DCinemaSmpte2014) - { - var doc = new XmlDocument(); - string title = "unknown"; - if (!string.IsNullOrEmpty(_fileName)) - { - title = Path.GetFileNameWithoutExtension(_fileName); - } - - string guid = Guid.NewGuid().ToString().RemoveChar('-').Insert(8, "-").Insert(13, "-").Insert(18, "-").Insert(23, "-"); - string xml = - "" + Environment.NewLine + - " urn:uuid:" + guid + "" + Environment.NewLine + - " " + Environment.NewLine + - " This is a subtitle file" + Environment.NewLine + - " 2014-01-01T00:00:00.000-00:00" + Environment.NewLine + - " 1" + Environment.NewLine + - " en" + Environment.NewLine + - " 25 1" + Environment.NewLine + - " 25" + Environment.NewLine + - " 00:00:00:00 " + Environment.NewLine + - " urn:uuid:3dec6dc0-39d0-498d-97d0-928d2eb78391" + Environment.NewLine + - " " + Environment.NewLine + - sb + - " " + Environment.NewLine + - ""; - - - doc.LoadXml(xml); - string fName = saveFileDialog1.FileName; - if (!fName.EndsWith(".xml", StringComparison.OrdinalIgnoreCase)) - { - fName += ".xml"; - } - - File.WriteAllText(fName, SubtitleFormat.ToUtf8XmlString(doc)); - var text = string.Format(Configuration.Settings.Language.ExportPngXml.XImagesSavedInY, imagesSavedCount, Path.GetDirectoryName(fName)); - MessageBoxShowWithFolderName(text, Path.GetDirectoryName(fName)); - } - else if (_exportType == ExportFormats.Edl || _exportType == ExportFormats.EdlClipName) - { - var title = Path.GetFileNameWithoutExtension(saveFileDialog1.FileName); - if (string.IsNullOrEmpty(title)) - { - title = "( no title )"; - } - - string header = "TITLE: " + title + Environment.NewLine + Environment.NewLine; - File.WriteAllText(saveFileDialog1.FileName, header + sb); - var text = string.Format(Configuration.Settings.Language.ExportPngXml.XImagesSavedInY, imagesSavedCount, Path.GetDirectoryName(saveFileDialog1.FileName)); - MessageBoxShowWithFolderName(text, Path.GetDirectoryName(saveFileDialog1.FileName)); - } - else - { - WriteBdnXmlFile(imagesSavedCount, sb, Path.Combine(folderBrowserDialog1.SelectedPath, "BDN_Index.xml")); - var text = string.Format(Configuration.Settings.Language.ExportPngXml.XImagesSavedInY, imagesSavedCount, folderBrowserDialog1.SelectedPath); - MessageBoxShowWithFolderName(text, folderBrowserDialog1.SelectedPath); - } - } - buttonExport.Enabled = true; - - if (Configuration.Settings.General.CurrentVideoOffsetInMs != 0) - { - _subtitle.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(-Configuration.Settings.General.CurrentVideoOffsetInMs)); - } - } - - private void MessageBoxShowWithFolderName(string text, string folderName) - { - using (var f = new ExportPngXmlDialogOpenFolder(text, folderName)) - { - f.ShowDialog(this); - } - } - - internal void WriteFcpFile(int width, int height, StringBuilder sb, string fileName) - { - string fileNameNoPath = Path.GetFileName(fileName); - string fileNameNoExt = Path.GetFileNameWithoutExtension(fileNameNoPath); - - int duration = 0; - if (_subtitle.Paragraphs.Count > 0) - { - duration = (int)Math.Round(_subtitle.Paragraphs[_subtitle.Paragraphs.Count - 1].EndTime.TotalSeconds * 25.0); - } - - string s = "" + Environment.NewLine + - "" + Environment.NewLine + - "" + Environment.NewLine + - " " + Environment.NewLine + - " add" + Environment.NewLine + - " " + System.Security.SecurityElement.Escape(fileNameNoExt) + @" - " + duration.ToString(CultureInfo.InvariantCulture) + @" - - FALSE - 25 - - - - FALSE - 25 - - 00:00:00:00 - 0 - source - NDF - - 0 - [OUT] - - - - - FALSE - -"; - if (comboBoxFrameRate.Text == "29.97") - { - s = s.Replace("NDF", "DF"); //Non Drop Frame or Drop Frame - s = s.Replace("25", "30"); - s = s.Replace("FALSE", "TRUE"); - } - else if (comboBoxFrameRate.Text == "23.976") - { - s = s.Replace("NDF", "DF"); //Non Drop Frame or Drop Frame - s = s.Replace("25", "24"); - s = s.Replace("FALSE", "TRUE"); - } - else if (comboBoxFrameRate.Text == "59.94") - { - s = s.Replace("NDF", "DF"); //Non Drop Frame or Drop Frame - s = s.Replace("25", "60"); - s = s.Replace("FALSE", "TRUE"); - } - - else - { - s = s.Replace("25", "" + comboBoxFrameRate.Text + ""); - } - - if (_subtitle.Paragraphs.Count > 0) - { - var end = SubtitleFormat.MillisecondsToFrames(_subtitle.Paragraphs[_subtitle.Paragraphs.Count - 1].EndTime.TotalMilliseconds, FrameRate); - end++; - s = s.Replace("[OUT]", end.ToString(CultureInfo.InvariantCulture)); - } - - if (comboBoxLanguage.Text == "NTSC") - { - s = s.Replace("FALSE", "TRUE"); - } - - s = s.Replace("1920", "" + width.ToString(CultureInfo.InvariantCulture) + ""); - s = s.Replace("1080", "" + height.ToString(CultureInfo.InvariantCulture) + ""); - - if (comboBoxImageFormat.Text.Contains("8-bit")) - { - s = s.Replace("32", "8"); - } - - File.WriteAllText(fileName, s); - } - - internal void WriteBdnXmlFile(int imagesSavedCount, StringBuilder sb, string fileName) - { - GetResolution(out var resW, out var resH); - string videoFormat = "1080p"; - if (resW == 1920 && resH == 1080) - { - videoFormat = "1080p"; - } - else if (resW == 1280 && resH == 720) - { - videoFormat = "720p"; - } - else if (resW == 848 && resH == 480) - { - videoFormat = "480p"; - } - else if (resW > 0 && resH > 0) - { - videoFormat = resW + "x" + resH; - } - - var doc = new XmlDocument(); - Paragraph first = _subtitle.Paragraphs[0]; - Paragraph last = _subtitle.Paragraphs[_subtitle.Paragraphs.Count - 1]; - doc.LoadXml("" + Environment.NewLine + - "" + Environment.NewLine + - "" + Environment.NewLine + - "" + Environment.NewLine + - "" + Environment.NewLine + - "" + Environment.NewLine + - "" + Environment.NewLine + - "" + Environment.NewLine + - "" + Environment.NewLine + - "" + Environment.NewLine + - ""); - XmlNode events = doc.DocumentElement.SelectSingleNode("Events"); - doc.PreserveWhitespace = true; - events.InnerXml = sb.ToString(); - File.WriteAllText(fileName, FormatUtf8Xml(doc), Encoding.UTF8); - } - - internal void WriteDostFile(string fileName, string body) - { - string header = @"$FORMAT=480 -$VERSION=1.2 -$ULEAD=TRUE -$DROP=[DROPVALUE]" + Environment.NewLine + Environment.NewLine + - "NO\tINTIME\t\tOUTTIME\t\tXPOS\tYPOS\tFILENAME\tFADEIN\tFADEOUT"; - - string dropValue = "30000"; - if (comboBoxFrameRate.SelectedIndex == -1) - { - var numberAsString = comboBoxFrameRate.Text.Trim().RemoveChar('.').RemoveChar(',').Replace(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, string.Empty); - if (numberAsString.Length > 0 && Utilities.IsInteger(numberAsString)) - { - dropValue = numberAsString; - } - } - else if (comboBoxFrameRate.Items[comboBoxFrameRate.SelectedIndex].ToString() == "23.98") - { - dropValue = "23976"; - } - else if (comboBoxFrameRate.Items[comboBoxFrameRate.SelectedIndex].ToString() == "24") - { - dropValue = "24000"; - } - else if (comboBoxFrameRate.Items[comboBoxFrameRate.SelectedIndex].ToString() == "25") - { - dropValue = "25000"; - } - else if (comboBoxFrameRate.Items[comboBoxFrameRate.SelectedIndex].ToString() == "29.97") - { - dropValue = "29970"; - } - else if (comboBoxFrameRate.Items[comboBoxFrameRate.SelectedIndex].ToString() == "30") - { - dropValue = "30000"; - } - else if (comboBoxFrameRate.Items[comboBoxFrameRate.SelectedIndex].ToString() == "59.94") - { - dropValue = "59940"; - } - - header = header.Replace("[DROPVALUE]", dropValue); - comboBoxFrameRate.SelectedIndex = 0; - - File.WriteAllText(fileName, header + Environment.NewLine + body); - } - - private static string FormatUtf8Xml(XmlDocument doc) - { - var sb = new StringBuilder(); - using (var writer = XmlWriter.Create(sb, new XmlWriterSettings { Indent = true, Encoding = Encoding.UTF8 })) - { - doc.Save(writer); - } - return sb.ToString().Replace(" encoding=\"utf-16\"", " encoding=\"utf-8\"").Trim(); // "replace hack" due to missing encoding (encoding only works if it's the only parameter...) - } - - private void SaveImage(Bitmap bmp, string fileName, ImageFormat imageFormat) - { - if (Equals(imageFormat, ImageFormat.Icon)) - { - var nikseBitmap = new NikseBitmap(bmp); - nikseBitmap.SaveAsTarga(fileName); - } - else - { - bmp.Save(fileName, imageFormat); - } - } - - private void FixStartEndWithSameTimeCode() - { - for (int i = 0; i < _subtitle.Paragraphs.Count - 1; i++) - { - Paragraph p = _subtitle.Paragraphs[i]; - Paragraph next = _subtitle.Paragraphs[i + 1]; - if (Math.Abs(p.EndTime.TotalMilliseconds - next.StartTime.TotalMilliseconds) < 0.1) - { - p.EndTime.TotalMilliseconds--; - } - } - } - - private void SetResolution(string inputXAndY) - { - if (string.IsNullOrEmpty(inputXAndY)) - { - return; - } - - var xAndY = inputXAndY.ToLowerInvariant(); - - if (_exportType == ExportFormats.Fcp) - { - switch (xAndY) - { - case "720x480": - xAndY = "NTSC-601"; - break; - case "720x576": - xAndY = "PAL-601"; - break; - case "640x480": - xAndY = "square"; - break; - case "1280x720": - xAndY = "DVCPROHD-720P"; - break; - case "960x720": - xAndY = "HD-(960x720)"; - break; - case "1920x1080": - xAndY = "FullHD 1920x1080"; - break; - case "1280x1080": - xAndY = "HD-(1280x1080)"; - break; - case "1440x1080": - xAndY = "HD-(1440x1080)"; - break; - } - } - - if (_exportType == ExportFormats.Fcp || Regex.IsMatch(xAndY, @"\d+x\d+", RegexOptions.IgnoreCase)) - { - for (int i = 0; i < comboBoxResolution.Items.Count; i++) - { - if (comboBoxResolution.Items[i].ToString().Contains(xAndY)) - { - comboBoxResolution.SelectedIndex = i; - return; - } - } - comboBoxResolution.Items[comboBoxResolution.Items.Count - 1] = xAndY; - comboBoxResolution.SelectedIndex = comboBoxResolution.Items.Count - 1; - } - } - - private void GetResolution(out int width, out int height) - { - width = 1920; - height = 1080; - if (comboBoxResolution.SelectedIndex < 0) - { - return; - } - - string text = comboBoxResolution.Text.Trim(); - - if (_exportType == ExportFormats.Fcp) - { - if (text == "NTSC-601") - { - width = 720; - height = 480; - return; - } - - if (text == "PAL-601") - { - width = 720; - height = 576; - return; - } - - if (text == "square") - { - width = 640; - height = 480; - return; - } - - if (text == "DVCPROHD-720P") - { - width = 1280; - height = 720; - return; - } - - if (text == "HD-(960x720)") - { - width = 960; - height = 720; - return; - } - - if (text == "FullHD 1920x1080") - { - width = 1920; - height = 1080; - return; - } - - if (text == "DVCPROHD-1080i60") - { - width = 1920; - height = 1080; - return; - } - - if (text == "HD-(1280x1080)") - { - width = 1280; - height = 1080; - return; - } - - if (text == "DVCPROHD-1080i50") - { - width = 1920; - height = 1080; - return; - } - - if (text == "HD-(1440x1080)") - { - width = 1440; - height = 1080; - return; - } - } - - if (text.Contains('(')) - { - text = text.Remove(0, text.IndexOf('(')).Trim(); - } - - text = text.TrimStart('(').TrimEnd(')').Trim(); - string[] arr = text.Split('x'); - width = int.Parse(arr[0]); - height = int.Parse(arr[1]); - } - - private int WriteParagraph(int width, StringBuilder sb, int border, int height, int imagesSavedCount, VobSubWriter vobSubWriter, FileStream binarySubtitleFile, MakeBitmapParameter param, int i) - { - if (param.Bitmap != null) - { - if (_exportType == ExportFormats.BluraySup) - { - if (!param.Saved) - { - binarySubtitleFile.Write(param.Buffer, 0, param.Buffer.Length); - } - param.Saved = true; - } - else if (_exportType == ExportFormats.VobSub) - { - if (!param.Saved) - { - vobSubWriter.WriteParagraph(param.P, param.Bitmap, param.Alignment); - } - - param.Saved = true; - } - else if (_exportType == ExportFormats.Fab) - { - if (!param.Saved) - { - string numberString = $"IMAGE{i:000}"; - string fileName = Path.Combine(folderBrowserDialog1.SelectedPath, numberString + "." + comboBoxImageFormat.Text.ToLowerInvariant()); - - if (checkBoxFullFrameImage.Checked) - { - var nbmp = new NikseBitmap(param.Bitmap); - nbmp.ReplaceTransparentWith(panelFullFrameBackground.BackColor); - using (var bmp = nbmp.GetBitmap()) - { - imagesSavedCount++; - - //RACE001.TIF 00;00;02;02 00;00;03;15 000 000 720 480 - //RACE002.TIF 00;00;05;18 00;00;09;20 000 000 720 480 - int top = param.ScreenHeight - (param.Bitmap.Height + param.BottomMargin); - int left = (param.ScreenWidth - param.Bitmap.Width) / 2; - - var b = new NikseBitmap(param.ScreenWidth, param.ScreenHeight); - { - b.Fill(panelFullFrameBackground.BackColor); - using (var fullSize = b.GetBitmap()) - { - if (param.Alignment == ContentAlignment.BottomLeft || param.Alignment == ContentAlignment.MiddleLeft || param.Alignment == ContentAlignment.TopLeft) - { - left = param.LeftMargin; - } - else if (param.Alignment == ContentAlignment.BottomRight || param.Alignment == ContentAlignment.MiddleRight || param.Alignment == ContentAlignment.TopRight) - { - left = param.ScreenWidth - param.Bitmap.Width - param.RightMargin; - } - - if (param.Alignment == ContentAlignment.TopLeft || param.Alignment == ContentAlignment.TopCenter || param.Alignment == ContentAlignment.TopRight) - { - top = param.BottomMargin; - } - - if (param.Alignment == ContentAlignment.MiddleLeft || param.Alignment == ContentAlignment.MiddleCenter || param.Alignment == ContentAlignment.MiddleRight) - { - top = (param.ScreenHeight - param.Bitmap.Height) / 2; - } - - if (param.OverridePosition.HasValue && - param.OverridePosition.Value.X >= 0 && param.OverridePosition.Value.X < param.Bitmap.Width && - param.OverridePosition.Value.Y >= 0 && param.OverridePosition.Value.Y < param.Bitmap.Height) - { - left = param.OverridePosition.Value.X; - top = param.OverridePosition.Value.Y; - } - - using (var g = Graphics.FromImage(fullSize)) - { - g.DrawImage(bmp, left, top); - g.Dispose(); - } - SaveImage(fullSize, fileName, ImageFormat); - } - } - left = 0; - top = 0; - sb.AppendLine($"{Path.GetFileName(fileName)} {FormatFabTime(param.P.StartTime, param)} {FormatFabTime(param.P.EndTime, param)} {left} {top} {left + param.ScreenWidth} {top + param.ScreenHeight}"); - } - } - else - { - SaveImage(param.Bitmap, fileName, ImageFormat); - - imagesSavedCount++; - - //RACE001.TIF 00;00;02;02 00;00;03;15 000 000 720 480 - //RACE002.TIF 00;00;05;18 00;00;09;20 000 000 720 480 - int top = param.ScreenHeight - (param.Bitmap.Height + param.BottomMargin); - int left = (param.ScreenWidth - param.Bitmap.Width) / 2; - - if (param.Alignment == ContentAlignment.BottomLeft || param.Alignment == ContentAlignment.MiddleLeft || param.Alignment == ContentAlignment.TopLeft) - { - left = param.LeftMargin; - } - else if (param.Alignment == ContentAlignment.BottomRight || param.Alignment == ContentAlignment.MiddleRight || param.Alignment == ContentAlignment.TopRight) - { - left = param.ScreenWidth - param.Bitmap.Width - param.RightMargin; - } - - if (param.Alignment == ContentAlignment.TopLeft || param.Alignment == ContentAlignment.TopCenter || param.Alignment == ContentAlignment.TopRight) - { - top = param.BottomMargin; - } - - if (param.Alignment == ContentAlignment.MiddleLeft || param.Alignment == ContentAlignment.MiddleCenter || param.Alignment == ContentAlignment.MiddleRight) - { - top = (param.ScreenHeight - param.Bitmap.Height) / 2; - } - - if (param.OverridePosition.HasValue && - param.OverridePosition.Value.X >= 0 && param.OverridePosition.Value.X < param.Bitmap.Width && - param.OverridePosition.Value.Y >= 0 && param.OverridePosition.Value.Y < param.Bitmap.Height) - { - left = param.OverridePosition.Value.X; - top = param.OverridePosition.Value.Y; - } - - sb.AppendLine($"{Path.GetFileName(fileName)} {FormatFabTime(param.P.StartTime, param)} {FormatFabTime(param.P.EndTime, param)} {left} {top} {left + param.Bitmap.Width} {top + param.Bitmap.Height}"); - } - param.Saved = true; - } - } - else if (_exportType == ExportFormats.Stl) - { - if (!param.Saved) - { - string numberString = $"IMAGE{i:000}"; - string fileName = Path.Combine(folderBrowserDialog1.SelectedPath, numberString + "." + comboBoxImageFormat.Text.ToLowerInvariant()); - SaveImage(param.Bitmap, fileName, ImageFormat); - - imagesSavedCount++; - - const string paragraphWriteFormat = "{0} , {1} , {2}\r\n"; - const string timeFormat = "{0:00}:{1:00}:{2:00}:{3:00}"; - - double factor = TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate; - string startTime = string.Format(timeFormat, param.P.StartTime.Hours, param.P.StartTime.Minutes, param.P.StartTime.Seconds, (int)Math.Round(param.P.StartTime.Milliseconds / factor)); - string endTime = string.Format(timeFormat, param.P.EndTime.Hours, param.P.EndTime.Minutes, param.P.EndTime.Seconds, (int)Math.Round(param.P.EndTime.Milliseconds / factor)); - sb.AppendFormat(paragraphWriteFormat, startTime, endTime, fileName); - - param.Saved = true; - } - } - else if (_exportType == ExportFormats.Spumux) - { - if (!param.Saved) - { - string numberString = $"IMAGE{i:000}"; - string fileName = Path.Combine(folderBrowserDialog1.SelectedPath, numberString + "." + comboBoxImageFormat.Text.ToLowerInvariant()); - foreach (var encoder in ImageCodecInfo.GetImageEncoders()) - { - if (encoder.FormatID == ImageFormat.Png.Guid) - { - var parameters = new EncoderParameters { Param = { [0] = new EncoderParameter(System.Drawing.Imaging.Encoder.ColorDepth, 4) } }; - - var nbmp = new NikseBitmap(param.Bitmap); - var b = nbmp.ConvertTo8BitsPerPixel(); - b.Save(fileName, encoder, parameters); - b.Dispose(); - - break; - } - } - imagesSavedCount++; - - const string paragraphWriteFormat = "\t\t"; - const string timeFormat = "{0:00}:{1:00}:{2:00}.{3:00}"; - - double factor = TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate; - string startTime = string.Format(timeFormat, param.P.StartTime.Hours, param.P.StartTime.Minutes, param.P.StartTime.Seconds, (int)Math.Round(param.P.StartTime.Milliseconds / factor)); - string endTime = string.Format(timeFormat, param.P.EndTime.Hours, param.P.EndTime.Minutes, param.P.EndTime.Seconds, (int)Math.Round(param.P.EndTime.Milliseconds / factor)); - int left = (param.ScreenWidth - param.Bitmap.Width) / 2; - if (param.Alignment == ContentAlignment.BottomLeft || param.Alignment == ContentAlignment.TopLeft) - { - left = param.LeftMargin; - } - else if (param.Alignment == ContentAlignment.BottomRight || param.Alignment == ContentAlignment.TopRight) - { - left = param.ScreenWidth - param.Bitmap.Width - param.LeftMargin; - } - int top = param.ScreenHeight - (param.Bitmap.Height + param.BottomMargin); - if (param.Alignment == ContentAlignment.TopCenter || param.Alignment == ContentAlignment.TopLeft || param.Alignment == ContentAlignment.TopRight) - { - top = param.BottomMargin; - } - sb.AppendLine(string.Format(paragraphWriteFormat, startTime, endTime, fileName, left, top)); - - param.Saved = true; - } - } - else if (_exportType == ExportFormats.Fcp) - { - if (!param.Saved) - { - imagesSavedCount = WriteFcpParagraph(sb, imagesSavedCount, param, i, saveFileDialog1.FileName); - - param.Saved = true; - } - } - else if (_exportType == ExportFormats.Dost) - { - if (!param.Saved) - { - imagesSavedCount = WriteParagraphDost(sb, imagesSavedCount, param, i, saveFileDialog1.FileName); - param.Saved = true; - } - } - else if (_exportType == ExportFormats.ImageFrame) - { - if (!param.Saved) - { - var imageFormat = ImageFormat; - - int lastFrame = imagesSavedCount; - int startFrame = (int)Math.Round(param.P.StartTime.TotalMilliseconds / (TimeCode.BaseUnit / param.FramesPerSeconds)); - var empty = new Bitmap(param.ScreenWidth, param.ScreenHeight); - - if (imagesSavedCount != 0 || !checkBoxSkipEmptyFrameAtStart.Checked) - { - // Save empty picture for each frame up to start frame - for (int k = lastFrame + 1; k < startFrame; k++) - { - string numberString = $"{k:00000}"; - string fileName = Path.Combine(folderBrowserDialog1.SelectedPath, numberString + "." + comboBoxImageFormat.Text.ToLowerInvariant()); - empty.Save(fileName, imageFormat); - imagesSavedCount++; - } - } - - int endFrame = (int)Math.Round(param.P.EndTime.TotalMilliseconds / (TimeCode.BaseUnit / param.FramesPerSeconds)); - var fullSize = new Bitmap(param.ScreenWidth, param.ScreenHeight); - Graphics g = Graphics.FromImage(fullSize); - g.DrawImage(param.Bitmap, (param.ScreenWidth - param.Bitmap.Width) / 2, param.ScreenHeight - (param.Bitmap.Height + param.BottomMargin)); - g.Dispose(); - - if (imagesSavedCount > startFrame) - { - startFrame = imagesSavedCount; // no overlapping - } - - // Save sub picture for each frame in duration - for (int k = startFrame; k <= endFrame; k++) - { - string numberString = $"{k:00000}"; - string fileName = Path.Combine(folderBrowserDialog1.SelectedPath, numberString + "." + comboBoxImageFormat.Text.ToLowerInvariant()); - fullSize.Save(fileName, imageFormat); - imagesSavedCount++; - } - fullSize.Dispose(); - param.Saved = true; - } - } - else if (_exportType == ExportFormats.DCinemaInterop) - { - if (!param.Saved) - { - string numberString = $"{i:0000}"; - string fileName = Path.Combine(Path.GetDirectoryName(saveFileDialog1.FileName), numberString + ".png"); - param.Bitmap.Save(fileName, ImageFormat.Png); - imagesSavedCount++; - param.Saved = true; - - string verticalAlignment = "bottom"; - string horizontalAlignment = "center"; - string vPos = "9.7"; - string hPos = "0"; - - switch (param.Alignment) - { - case ContentAlignment.BottomLeft: - verticalAlignment = "bottom"; - horizontalAlignment = "left"; - hPos = "10"; - break; - case ContentAlignment.BottomRight: - verticalAlignment = "bottom"; - horizontalAlignment = "right"; - hPos = "10"; - break; - case ContentAlignment.MiddleCenter: - verticalAlignment = "center"; - vPos = "0"; - break; - case ContentAlignment.MiddleLeft: - verticalAlignment = "center"; - horizontalAlignment = "left"; - hPos = "10"; - vPos = "0"; - break; - case ContentAlignment.MiddleRight: - verticalAlignment = "center"; - horizontalAlignment = "right"; - hPos = "10"; - vPos = "0"; - break; - case ContentAlignment.TopCenter: - verticalAlignment = "top"; - break; - case ContentAlignment.TopLeft: - verticalAlignment = "top"; - horizontalAlignment = "left"; - hPos = "10"; - break; - case ContentAlignment.TopRight: - verticalAlignment = "top"; - horizontalAlignment = "right"; - hPos = "10"; - break; - } - - sb.AppendLine(""); - if (param.Depth3D == 0) - { - sb.AppendLine("" + numberString + ".png" + ""); - } - else - { - sb.AppendLine("" + numberString + ".png" + ""); - } - - sb.AppendLine(""); - } - } - else if (_exportType == ExportFormats.DCinemaSmpte2014) - { - if (!param.Saved) - { - string numberString = $"{i:0000}"; - string fileName = Path.Combine(Path.GetDirectoryName(saveFileDialog1.FileName), numberString + ".png"); - param.Bitmap.Save(fileName, ImageFormat.Png); - imagesSavedCount++; - param.Saved = true; - - string verticalAlignment = "bottom"; - string horizontalAlignment = "center"; - string vPos = "9.7"; - string hPos = "0"; - - switch (param.Alignment) - { - case ContentAlignment.BottomLeft: - verticalAlignment = "bottom"; - horizontalAlignment = "left"; - hPos = "10"; - break; - case ContentAlignment.BottomRight: - verticalAlignment = "bottom"; - horizontalAlignment = "right"; - hPos = "10"; - break; - case ContentAlignment.MiddleCenter: - verticalAlignment = "center"; - vPos = "0"; - break; - case ContentAlignment.MiddleLeft: - verticalAlignment = "center"; - horizontalAlignment = "left"; - hPos = "10"; - vPos = "0"; - break; - case ContentAlignment.MiddleRight: - verticalAlignment = "center"; - horizontalAlignment = "right"; - hPos = "10"; - vPos = "0"; - break; - case ContentAlignment.TopCenter: - verticalAlignment = "top"; - break; - case ContentAlignment.TopLeft: - verticalAlignment = "top"; - horizontalAlignment = "left"; - hPos = "10"; - break; - case ContentAlignment.TopRight: - verticalAlignment = "top"; - horizontalAlignment = "right"; - hPos = "10"; - break; - } - - sb.AppendLine(""); - if (param.Depth3D == 0) - { - sb.AppendLine("" + numberString + ".png" + ""); - } - else - { - sb.AppendLine("" + numberString + ".png" + ""); - } - - sb.AppendLine(""); - } - } - else if (_exportType == ExportFormats.Edl || _exportType == ExportFormats.EdlClipName) - { - if (!param.Saved) - { - // 001 7M6C7986 V C 14:14:55:21 14:15:16:24 01:00:10:18 01:00:31:21 - var fileName1 = "IMG" + i.ToString(CultureInfo.InvariantCulture).PadLeft(5, '0'); - - var fullSize = new Bitmap(param.ScreenWidth, param.ScreenHeight); - using (var g = Graphics.FromImage(fullSize)) - { - g.DrawImage(param.Bitmap, (param.ScreenWidth - param.Bitmap.Width) / 2, param.ScreenHeight - (param.Bitmap.Height + param.BottomMargin)); - } - var fileName2 = Path.Combine(Path.GetDirectoryName(param.SavDialogFileName), fileName1 + ".PNG"); - fullSize.Save(fileName2, ImageFormat.Png); - fullSize.Dispose(); - - string line = $"{i:000} {fileName1} V C {new TimeCode().ToHHMMSSFF()} {param.P.Duration.ToHHMMSSFF()} {param.P.StartTime.ToHHMMSSFF()} {param.P.EndTime.ToHHMMSSFF()}"; - sb.AppendLine(line); - if (_exportType == ExportFormats.EdlClipName) - { - sb.AppendLine("* FROM CLIP NAME: " + fileName1 + ".PNG"); - } - sb.AppendLine(); - - imagesSavedCount++; - param.Saved = true; - } - } - else // BDNXML - { - if (!param.Saved) - { - imagesSavedCount = WriteBdnXmlParagraph(width, sb, border, height, imagesSavedCount, param, i, folderBrowserDialog1.SelectedPath); - param.Saved = true; - } - } - } - return imagesSavedCount; - } - - internal int WriteFcpParagraph(StringBuilder sb, int imagesSavedCount, MakeBitmapParameter param, int i, string fileName) - { - string numberString = string.Format(Path.GetFileNameWithoutExtension(Path.GetFileName(fileName)) + "{0:0000}", i).RemoveChar(' '); - var fileNameShort = numberString + "." + comboBoxImageFormat.Text.ToLowerInvariant(); - var targetImageFileName = Path.Combine(Path.GetDirectoryName(fileName), fileNameShort); - string fileNameNoPath = Path.GetFileName(fileNameShort); - string fileNameNoExt = Path.GetFileNameWithoutExtension(fileNameNoPath); - string pathUrl = "file://localhost/" + targetImageFileName.Replace("\\", "/").Replace(" ", "%20"); - if (!checkBoxFcpFullPathUrl.Checked) - { - pathUrl = fileNameShort; - } - - string template = " " + Environment.NewLine + -@" " + System.Security.SecurityElement.Escape(fileNameNoPath) + @" - [DURATION] - - [TIMEBASE] - [NTSC] - - [IN] - [OUT] - [START] - [END] - " + param.VideoResolution + @" - TRUE - FALSE - straight - " + System.Security.SecurityElement.Escape(fileNameNoPath) + @"1" + Environment.NewLine + - " " + @" - " + System.Security.SecurityElement.Escape(fileNameNoPath) + @" - " + pathUrl + @" - - [TIMEBASE] - [NTSC] - - [DURATION] - " + param.ScreenWidth + @" - " + param.ScreenHeight + @" - - - - - - video - - none - "; - - var outBitmap = param.Bitmap; - if (checkBoxFullFrameImage.Checked) - { - var nbmp = new NikseBitmap(param.Bitmap); - nbmp.ReplaceTransparentWith(panelFullFrameBackground.BackColor); - using (var bmp = nbmp.GetBitmap()) - { - int top = param.ScreenHeight - (param.Bitmap.Height + param.BottomMargin); - int left = (param.ScreenWidth - param.Bitmap.Width) / 2; - - var b = new NikseBitmap(param.ScreenWidth, param.ScreenHeight); - { - b.Fill(panelFullFrameBackground.BackColor); - outBitmap = b.GetBitmap(); - { - if (param.Alignment == ContentAlignment.BottomLeft || param.Alignment == ContentAlignment.MiddleLeft || param.Alignment == ContentAlignment.TopLeft) - { - left = param.LeftMargin; - } - else if (param.Alignment == ContentAlignment.BottomRight || param.Alignment == ContentAlignment.MiddleRight || param.Alignment == ContentAlignment.TopRight) - { - left = param.ScreenWidth - param.Bitmap.Width - param.RightMargin; - } - - if (param.Alignment == ContentAlignment.TopLeft || param.Alignment == ContentAlignment.TopCenter || param.Alignment == ContentAlignment.TopRight) - { - top = param.BottomMargin; - } - - if (param.Alignment == ContentAlignment.MiddleLeft || param.Alignment == ContentAlignment.MiddleCenter || param.Alignment == ContentAlignment.MiddleRight) - { - top = (param.ScreenHeight - param.Bitmap.Height) / 2; - } - - if (param.OverridePosition.HasValue && - param.OverridePosition.Value.X >= 0 && param.OverridePosition.Value.X < param.Bitmap.Width && - param.OverridePosition.Value.Y >= 0 && param.OverridePosition.Value.Y < param.Bitmap.Height) - { - left = param.OverridePosition.Value.X; - top = param.OverridePosition.Value.Y; - } - - using (var g = Graphics.FromImage(outBitmap)) - { - g.DrawImage(bmp, left, top); - g.Dispose(); - } - } - } - } - } - - - if (comboBoxImageFormat.Text == "8-bit png") - { - foreach (var encoder in ImageCodecInfo.GetImageEncoders()) - { - if (encoder.FormatID == ImageFormat.Png.Guid) - { - var parameters = new EncoderParameters(); - parameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.ColorDepth, 8); - - var nbmp = new NikseBitmap(outBitmap); - var b = nbmp.ConvertTo8BitsPerPixel(); - b.Save(targetImageFileName, encoder, parameters); - b.Dispose(); - - break; - } - } - } - else - { - SaveImage(outBitmap, targetImageFileName, ImageFormat); - } - imagesSavedCount++; - - int timeBase = 25; - string ntsc = "FALSE"; - if (comboBoxLanguage.SelectedItem.ToString().Equals("NTSC", StringComparison.Ordinal)) - { - ntsc = "TRUE"; - } - - if (Math.Abs(param.FramesPerSeconds - 29.97) < 0.01) - { - timeBase = 30; - ntsc = "TRUE"; - } - else if (Math.Abs(param.FramesPerSeconds - 23.976) < 0.01) - { - timeBase = 24; - ntsc = "TRUE"; - } - else if (Math.Abs(param.FramesPerSeconds - 59.94) < 0.01) - { - timeBase = 60; - ntsc = "TRUE"; - } - - var duration = SubtitleFormat.MillisecondsToFrames(param.P.Duration.TotalMilliseconds, param.FramesPerSeconds); - var start = SubtitleFormat.MillisecondsToFrames(param.P.StartTime.TotalMilliseconds, param.FramesPerSeconds); - var end = SubtitleFormat.MillisecondsToFrames(param.P.EndTime.TotalMilliseconds, param.FramesPerSeconds); - - template = template.Replace("[DURATION]", duration.ToString(CultureInfo.InvariantCulture)); - template = template.Replace("[IN]", start.ToString(CultureInfo.InvariantCulture)); - template = template.Replace("[OUT]", end.ToString(CultureInfo.InvariantCulture)); - template = template.Replace("[START]", start.ToString(CultureInfo.InvariantCulture)); - template = template.Replace("[END]", end.ToString(CultureInfo.InvariantCulture)); - template = template.Replace("[TIMEBASE]", timeBase.ToString(CultureInfo.InvariantCulture)); - template = template.Replace("[NTSC]", ntsc); - sb.AppendLine(template); - return imagesSavedCount; - } - - internal int WriteBdnXmlParagraph(int width, StringBuilder sb, int border, int height, int imagesSavedCount, MakeBitmapParameter param, int i, string path) - { - string numberString = $"{i:0000}"; - string fileName = Path.Combine(path, numberString + ".png"); - - if (comboBoxImageFormat.Text == "Png 8-bit") - { - foreach (var encoder in ImageCodecInfo.GetImageEncoders()) - { - if (encoder.FormatID == ImageFormat.Png.Guid) - { - var parameters = new EncoderParameters(); - parameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.ColorDepth, 8); - - var nbmp = new NikseBitmap(param.Bitmap); - var b = nbmp.ConvertTo8BitsPerPixel(); - b.Save(fileName, encoder, parameters); - b.Dispose(); - - break; - } - } - } - else - { - param.Bitmap.Save(fileName, ImageFormat.Png); - } - - imagesSavedCount++; - - // - // subtitle_exp_0001.png - // - sb.AppendLine(""); - - int x = (width - param.Bitmap.Width) / 2; - int y = height - (param.Bitmap.Height + param.BottomMargin); - switch (param.Alignment) - { - case ContentAlignment.BottomLeft: - x = border; - y = height - (param.Bitmap.Height + param.BottomMargin); - break; - case ContentAlignment.BottomRight: - x = height - param.Bitmap.Width - border; - y = height - (param.Bitmap.Height + param.BottomMargin); - break; - case ContentAlignment.MiddleCenter: - x = (width - param.Bitmap.Width) / 2; - y = (height - param.Bitmap.Height) / 2; - break; - case ContentAlignment.MiddleLeft: - x = border; - y = (height - param.Bitmap.Height) / 2; - break; - case ContentAlignment.MiddleRight: - x = width - param.Bitmap.Width - border; - y = (height - param.Bitmap.Height) / 2; - break; - case ContentAlignment.TopCenter: - x = (width - param.Bitmap.Width) / 2; - y = border; - break; - case ContentAlignment.TopLeft: - x = border; - y = border; - break; - case ContentAlignment.TopRight: - x = width - param.Bitmap.Width - border; - y = border; - break; - } - - if (param.OverridePosition.HasValue && - param.OverridePosition.Value.X >= 0 && param.OverridePosition.Value.X < param.Bitmap.Width && - param.OverridePosition.Value.Y >= 0 && param.OverridePosition.Value.Y < param.Bitmap.Height) - { - x = param.OverridePosition.Value.X; - y = param.OverridePosition.Value.Y; - } - - sb.AppendLine(" " + numberString + ".png"); - sb.AppendLine(""); - return imagesSavedCount; - } - - internal int WriteParagraphDost(StringBuilder sb, int imagesSavedCount, MakeBitmapParameter param, int i, string fileName) - { - string numberString = string.Format("{0:0000}", i); - fileName = Path.Combine(Path.GetDirectoryName(fileName), Path.GetFileNameWithoutExtension(fileName).Replace(" ", "_")) + "_" + numberString + ".png"; - - foreach (var encoder in ImageCodecInfo.GetImageEncoders()) - { - if (encoder.FormatID == ImageFormat.Png.Guid) - { - var parameters = new EncoderParameters(); - parameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.ColorDepth, 8); - - var nbmp = new NikseBitmap(param.Bitmap); - var b = nbmp.ConvertTo8BitsPerPixel(); - b.Save(fileName, encoder, parameters); - b.Dispose(); - - break; - } - } - imagesSavedCount++; - - const string paragraphWriteFormat = "{0}\t{1}\t{2}\t{4}\t{5}\t{3}\t0\t0"; - - int top = param.ScreenHeight - (param.Bitmap.Height + param.BottomMargin); - int left = (param.ScreenWidth - param.Bitmap.Width) / 2; - if (param.Alignment == ContentAlignment.BottomLeft || param.Alignment == ContentAlignment.MiddleLeft || param.Alignment == ContentAlignment.TopLeft) - { - left = param.LeftMargin; - } - else if (param.Alignment == ContentAlignment.BottomRight || param.Alignment == ContentAlignment.MiddleRight || param.Alignment == ContentAlignment.TopRight) - { - left = param.ScreenWidth - param.Bitmap.Width - param.RightMargin; - } - - if (param.Alignment == ContentAlignment.TopLeft || param.Alignment == ContentAlignment.TopCenter || param.Alignment == ContentAlignment.TopRight) - { - top = param.BottomMargin; - } - - if (param.Alignment == ContentAlignment.MiddleLeft || param.Alignment == ContentAlignment.MiddleCenter || param.Alignment == ContentAlignment.MiddleRight) - { - top = param.ScreenHeight - (param.Bitmap.Height / 2); - } - - if (param.OverridePosition.HasValue && - param.OverridePosition.Value.X >= 0 && param.OverridePosition.Value.X < param.Bitmap.Width && - param.OverridePosition.Value.Y >= 0 && param.OverridePosition.Value.Y < param.Bitmap.Height) - { - left = param.OverridePosition.Value.X; - top = param.OverridePosition.Value.Y; - } - - string startTime = ToHHMMSSFF(param.P.StartTime); - string endTime = ToHHMMSSFF(param.P.EndTime); - sb.AppendLine(string.Format(paragraphWriteFormat, numberString, startTime, endTime, Path.GetFileName(fileName), left, top)); - return imagesSavedCount; - } - - private ImageFormat ImageFormat - { - get - { - var imageFormat = ImageFormat.Png; - if (comboBoxImageFormat.SelectedIndex == 0) - { - imageFormat = ImageFormat.Bmp; - } - else if (comboBoxImageFormat.SelectedIndex == 1) - { - imageFormat = ImageFormat.Exif; - } - else if (comboBoxImageFormat.SelectedIndex == 2) - { - imageFormat = ImageFormat.Gif; - } - else if (comboBoxImageFormat.SelectedIndex == 3) - { - imageFormat = ImageFormat.Jpeg; - } - else if (comboBoxImageFormat.SelectedIndex == 4) - { - imageFormat = ImageFormat.Png; - } - else if (comboBoxImageFormat.SelectedIndex == 5) - { - imageFormat = ImageFormat.Tiff; - } - - if (string.Compare(comboBoxImageFormat.Text, "tga", StringComparison.OrdinalIgnoreCase) == 0) - { - return ImageFormat.Icon; - } - - return imageFormat; - } - } - - private static string FormatFabTime(TimeCode time, MakeBitmapParameter param) - { - if (param.Bitmap.Width == 720 && param.Bitmap.Height == 480) // NTSC - { - return $"{time.Hours:00};{time.Minutes:00};{time.Seconds:00};{SubtitleFormat.MillisecondsToFramesMaxFrameRate(time.Milliseconds):00}"; - } - - // drop frame - if (Math.Abs(param.FramesPerSeconds - 24 * (999 / 1000)) < 0.01 || - Math.Abs(param.FramesPerSeconds - 29 * (999 / 1000)) < 0.01 || - Math.Abs(param.FramesPerSeconds - 59 * (999 / 1000)) < 0.01) - { - return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}:{SubtitleFormat.MillisecondsToFramesMaxFrameRate(time.Milliseconds):00}"; - } - - return $"{time.Hours:00};{time.Minutes:00};{time.Seconds:00};{SubtitleFormat.MillisecondsToFramesMaxFrameRate(time.Milliseconds):00}"; - } - - private void SetupImageParameters() - { - if (subtitleListView1.SelectedItems.Count > 0 && _format.HasStyleSupport) - { - Paragraph p = _subtitle.GetParagraphOrDefault(subtitleListView1.SelectedItems[0].Index); - if (p != null && (_format.GetType() == typeof(AdvancedSubStationAlpha) || _format.GetType() == typeof(SubStationAlpha))) - { - if (!string.IsNullOrEmpty(p.Extra)) - { - comboBoxSubtitleFont.Enabled = false; - comboBoxSubtitleFontSize.Enabled = false; - buttonBorderColor.Enabled = false; - comboBoxHAlign.Enabled = false; - panelBorderColor.Enabled = false; - checkBoxBold.Enabled = false; - buttonColor.Enabled = false; - panelColor.Enabled = false; - comboBoxBorderWidth.Enabled = false; - comboBoxBottomMargin.Enabled = false; - comboBoxBottomMarginUnit.Enabled = false; - comboBoxBottomMarginUnit.SelectedIndex = 1; // px - comboBoxLeftRightMargin.Enabled = false; - comboBoxLeftRightMarginUnit.Enabled = false; - comboBoxLeftRightMarginUnit.SelectedIndex = 1; // px - comboBoxShadowWidth.Enabled = false; - buttonShadowColor.Enabled = false; - panelShadowColor.Enabled = false; - numericUpDownShadowTransparency.Enabled = _format.GetType() != typeof(AdvancedSubStationAlpha); - - SsaStyle style = AdvancedSubStationAlpha.GetSsaStyle(p.Extra, _subtitle.Header); - if (style != null) - { - int i; - for (i = 0; i < comboBoxBottomMargin.Items.Count; i++) - { - if (comboBoxBottomMargin.Items[i].ToString().Equals(style.MarginVertical.ToString(CultureInfo.InvariantCulture), StringComparison.OrdinalIgnoreCase)) - { - comboBoxBottomMargin.SelectedIndex = i; - break; - } - } - - for (i = 0; i < comboBoxLeftRightMarginUnit.Items.Count; i++) - { - if (comboBoxLeftRightMarginUnit.Items[i].ToString().Equals(style.MarginLeft.ToString(CultureInfo.InvariantCulture), StringComparison.OrdinalIgnoreCase)) - { - comboBoxLeftRightMarginUnit.SelectedIndex = i; - break; - } - } - - panelColor.BackColor = style.Primary; - panelBorderColor.BackColor = _format.GetType() == typeof(AdvancedSubStationAlpha) ? style.Outline : style.Background; - - for (i = 0; i < comboBoxSubtitleFont.Items.Count; i++) - { - if (comboBoxSubtitleFont.Items[i].ToString().Equals(style.FontName, StringComparison.OrdinalIgnoreCase)) - { - comboBoxSubtitleFont.SelectedIndex = i; - break; - } - } - for (i = 0; i < comboBoxSubtitleFontSize.Items.Count; i++) - { - if (comboBoxSubtitleFontSize.Items[i].ToString().Equals(style.FontSize.ToString(CultureInfo.InvariantCulture), StringComparison.OrdinalIgnoreCase)) - { - comboBoxSubtitleFontSize.SelectedIndex = i; - break; - } - } - checkBoxBold.Checked = style.Bold; - comboBoxBorderWidth.Items.Clear(); - comboBoxBorderWidth.Items.Add(style.OutlineWidth.ToString(CultureInfo.InvariantCulture)); - comboBoxBorderWidth.SelectedIndex = 0; - - comboBoxShadowWidth.Items.Clear(); - comboBoxShadowWidth.Items.Add(style.ShadowWidth.ToString(CultureInfo.InvariantCulture)); - comboBoxShadowWidth.SelectedIndex = 0; - if (_format.GetType() == typeof(AdvancedSubStationAlpha)) - { - panelShadowColor.BackColor = style.Background; - numericUpDownShadowTransparency.Value = style.Background.A; - } - else - { - panelShadowColor.BackColor = style.Outline; - numericUpDownShadowTransparency.Value = style.Outline.A; - } - } - } - } - } - - _subtitleColor = panelColor.BackColor; - _borderColor = panelBorderColor.BackColor; - _subtitleFontName = comboBoxSubtitleFont.SelectedItem.ToString(); - _subtitleFontSize = float.Parse(comboBoxSubtitleFontSize.SelectedItem.ToString()); - _subtitleFontBold = checkBoxBold.Checked; - - _borderWidth = GetBorderWidth(); - } - - private float GetBorderWidth() - { - if (comboBoxBorderWidth.SelectedItem.ToString() == Configuration.Settings.Language.ExportPngXml.BorderStyleBoxForEachLine || - comboBoxBorderWidth.SelectedItem.ToString() == Configuration.Settings.Language.ExportPngXml.BorderStyleOneBox) - { - return 0; - } - - if (float.TryParse(comboBoxBorderWidth.SelectedItem.ToString(), out var f)) - { - return f; - } - - if (float.TryParse(Utilities.RemoveNonNumbers(comboBoxBorderWidth.SelectedItem.ToString()), out f)) - { - return f; - } - - return 0; - } - - private float GetShadowWidth() - { - if (float.TryParse(comboBoxShadowWidth.SelectedItem.ToString(), out var f)) - { - return f; - } - - if (float.TryParse(Utilities.RemoveNonNumbers(comboBoxShadowWidth.SelectedItem.ToString()), out f)) - { - return f; - } - - return 0; - } - - private static Font GetFont(MakeBitmapParameter parameter, float fontSize) - { - Font font; - try - { - var fontStyle = FontStyle.Regular; - if (parameter.SubtitleFontBold) - { - fontStyle = FontStyle.Bold; - } - - font = new Font(parameter.SubtitleFontName, fontSize, fontStyle); - } - catch (Exception exception) - { - try - { - var fontStyle = FontStyle.Regular; - if (!parameter.SubtitleFontBold) - { - fontStyle = FontStyle.Bold; - } - - font = new Font(parameter.SubtitleFontName, fontSize, fontStyle); - } - catch - { - MessageBox.Show(exception.Message); - - if (FontFamily.Families[0].IsStyleAvailable(FontStyle.Regular)) - { - font = new Font(FontFamily.Families[0].Name, fontSize); - } - else if (FontFamily.Families.Length > 1 && FontFamily.Families[1].IsStyleAvailable(FontStyle.Regular)) - { - font = new Font(FontFamily.Families[1].Name, fontSize); - } - else if (FontFamily.Families.Length > 2 && FontFamily.Families[1].IsStyleAvailable(FontStyle.Regular)) - { - font = new Font(FontFamily.Families[2].Name, fontSize); - } - else - { - font = new Font("Arial", fontSize); - } - } - } - return font; - } - - private double GetResizeScale() - { - if (comboBoxResizePercentage.SelectedItem == null) - { - return 1.0; - } - - var p = int.Parse(comboBoxResizePercentage.SelectedItem.ToString().Replace("%", string.Empty)); - return p / 100.0; - } - - private Bitmap GenerateImageFromTextWithStyle(Paragraph p, out MakeBitmapParameter mbp) - { - mbp = new MakeBitmapParameter { P = p }; - - if (_vobSubOcr != null) - { - var index = _subtitle.GetIndex(p); - if (index >= 0) - { - var b = _vobSubOcr.GetSubtitleBitmap(index); - var exp = GetResizeScale(); - if (Math.Abs(exp - 1) > 0.01) - { - var resizedBitmap = ResizeBitmap(b, (int)Math.Round(b.Width * exp), (int)Math.Round(b.Height * exp)); - b.Dispose(); - return resizedBitmap; - } - return b; - } - - } - - mbp.AlignLeft = comboBoxHAlign.SelectedIndex == 0; - mbp.AlignRight = comboBoxHAlign.SelectedIndex == 2; - mbp.JustifyLeft = GetJustifyLeft(p.Text); - mbp.JustifyTop = comboBoxHAlign.SelectedIndex == 4; - mbp.JustifyRight = comboBoxHAlign.SelectedIndex == 5; - mbp.SimpleRendering = checkBoxSimpleRender.Checked; - mbp.BorderWidth = _borderWidth; - mbp.BorderColor = _borderColor; - mbp.SubtitleFontName = _subtitleFontName; - mbp.SubtitleColor = _subtitleColor; - mbp.SubtitleFontSize = _subtitleFontSize; - mbp.SubtitleFontBold = _subtitleFontBold; - mbp.LineHeight = _lineHeights; - mbp.FullFrame = checkBoxFullFrameImage.Checked; - mbp.FullFrameBackgroundColor = panelFullFrameBackground.BackColor; - mbp.OverridePosition = GetAssPoint(p.Text); - - if (_format.HasStyleSupport && !string.IsNullOrEmpty(p.Extra)) - { - if (_format.GetType() == typeof(SubStationAlpha)) - { - var style = AdvancedSubStationAlpha.GetSsaStyle(p.Extra, _subtitle.Header); - mbp.SubtitleColor = style.Primary; - mbp.SubtitleFontBold = style.Bold; - mbp.SubtitleFontSize = style.FontSize; - mbp.BottomMargin = style.MarginVertical; - if (style.BorderStyle == "3") - { - mbp.BackgroundColor = style.Background; - } - mbp.ShadowColor = style.Outline; - } - else if (_format.GetType() == typeof(AdvancedSubStationAlpha)) - { - var style = AdvancedSubStationAlpha.GetSsaStyle(p.Extra, _subtitle.Header); - mbp.SubtitleColor = style.Primary; - mbp.SubtitleFontBold = style.Bold; - mbp.SubtitleFontSize = style.FontSize; - mbp.BottomMargin = style.MarginVertical; - if (style.BorderStyle == "3") - { - mbp.BackgroundColor = style.Outline; - } - mbp.ShadowAlpha = style.Background.A; - mbp.ShadowColor = style.Background; - } - } - - if (comboBoxBorderWidth.SelectedItem.ToString() == Configuration.Settings.Language.ExportPngXml.BorderStyleBoxForEachLine) - { - _borderWidth = 0; - mbp.BackgroundColor = panelBorderColor.BackColor; - mbp.BoxSingleLine = true; - } - else if (comboBoxBorderWidth.SelectedItem.ToString() == Configuration.Settings.Language.ExportPngXml.BorderStyleOneBox) - { - mbp.BoxSingleLine = false; - _borderWidth = 0; - mbp.BackgroundColor = panelBorderColor.BackColor; - } - - GetResolution(out var width, out var height); - mbp.ScreenWidth = width; - mbp.ScreenHeight = height; - mbp.VideoResolution = comboBoxResolution.Text; - mbp.Type3D = comboBox3D.SelectedIndex; - mbp.Depth3D = (int)numericUpDownDepth3D.Value; - mbp.BottomMargin = GetBottomMarginInPixels(p); - mbp.ShadowWidth = GetShadowWidth(); - mbp.ShadowAlpha = (int)numericUpDownShadowTransparency.Value; - mbp.ShadowColor = panelShadowColor.BackColor; - mbp.LineHeight = _lineHeights; - mbp.Forced = subtitleListView1.Items[_subtitle.GetIndex(p)].Checked; - mbp.LineJoin = Configuration.Settings.Tools.ExportPenLineJoin; - var bmp = GenerateImageFromTextWithStyle(mbp); - if (_exportType == ExportFormats.VobSub || _exportType == ExportFormats.Stl || _exportType == ExportFormats.Spumux) - { - var nbmp = new NikseBitmap(bmp); - nbmp.ConvertToFourColors(Color.Transparent, _subtitleColor, _borderColor, !checkBoxTransAntiAliase.Checked); - - if (_exportType == ExportFormats.Spumux) - { - nbmp.EnsureEvenLines(mbp.BoxSingleLine ? Color.Transparent : mbp.BackgroundColor); - } - - var temp = nbmp.GetBitmap(); - bmp.Dispose(); - return temp; - } - return bmp; - } - - private static int CalcWidthViaDraw(string text, MakeBitmapParameter parameter) - { - var nbmp = GenerateBitmapForCalc(text, parameter); - nbmp.CropTransparentSidesAndBottom(0, true); - return nbmp.Width; - } - - private static NikseBitmap GenerateBitmapForCalc(string text, MakeBitmapParameter parameter) - { - text = text.Trim(); - var path = new GraphicsPath(); - var sb = new StringBuilder(); - int i = 0; - bool isItalic = false; - bool isBold = parameter.SubtitleFontBold; - const float top = 5f; - bool newLine = false; - float left = 1.0f; - float leftMargin = left; - int newLinePathPoint = -1; - Color c = parameter.SubtitleColor; - var colorStack = new Stack(); - var lastText = new StringBuilder(); - var sf = new StringFormat { Alignment = StringAlignment.Near, LineAlignment = StringAlignment.Near }; - var bmp = new Bitmap(parameter.ScreenWidth, 200); - var g = Graphics.FromImage(bmp); - - g.CompositingQuality = CompositingQuality.HighSpeed; - g.SmoothingMode = SmoothingMode.HighSpeed; - g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; - - Font font = GetFont(parameter, parameter.SubtitleFontSize); - var fontStack = new Stack(); - while (i < text.Length) - { - if (text.Substring(i).StartsWith(" 0) - { - lastText.Append(sb); - TextDraw.DrawText(font, sf, path, sb, isItalic, parameter.SubtitleFontBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); - } - - addLeft = GetLastPositionFromPath(path, oldPathPointIndex, addLeft); - if (path.PointCount == 0) - { - addLeft = left; - } - else if (addLeft < 0.01) - { - addLeft = left + 2; - } - - left = addLeft; - - DrawShadowAndPath(parameter, g, path); - var p2 = new SolidBrush(c); - g.FillPath(p2, path); - p2.Dispose(); - path.Reset(); - path = new GraphicsPath(); - sb.Clear(); - - int endIndex = text.Substring(i).IndexOf('>'); - if (endIndex < 0) - { - i += 9999; - } - else - { - string fontContent = text.Substring(i, endIndex); - if (fontContent.Contains(" color=", StringComparison.OrdinalIgnoreCase)) - { - string[] arr = fontContent.Substring(fontContent.IndexOf(" color=", StringComparison.OrdinalIgnoreCase) + 7).Trim().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); - if (arr.Length > 0) - { - string fontColor = arr[0].Trim('\'').Trim('"').Trim('\''); - try - { - colorStack.Push(c); // save old color - if (fontColor.StartsWith("rgb(", StringComparison.OrdinalIgnoreCase)) - { - arr = fontColor.Remove(0, 4).TrimEnd(')').Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); - c = Color.FromArgb(int.Parse(arr[0]), int.Parse(arr[1]), int.Parse(arr[2])); - } - else - { - c = ColorTranslator.FromHtml(fontColor); - } - } - catch - { - c = parameter.SubtitleColor; - } - } - } - if (fontContent.Contains(" face=", StringComparison.OrdinalIgnoreCase) || fontContent.Contains(" size=", StringComparison.OrdinalIgnoreCase)) - { - float fontSize = parameter.SubtitleFontSize; - string fontFace = parameter.SubtitleFontName; - - string[] arr = fontContent.Substring(fontContent.IndexOf(" face=", StringComparison.OrdinalIgnoreCase) + 6).Trim().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); - if (arr.Length > 0) - { - fontFace = arr[0].Trim('\'').Trim('"').Trim('\''); - } - - arr = fontContent.Substring(fontContent.IndexOf(" size=", StringComparison.OrdinalIgnoreCase) + 6).Trim().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); - if (arr.Length > 0) - { - string temp = arr[0].Trim('\'').Trim('"').Trim('\''); - if (float.TryParse(temp, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var f)) - { - fontSize = f; - } - } - - try - { - fontStack.Push(font); // save old cfont - var p = new MakeBitmapParameter { SubtitleFontName = fontFace, SubtitleFontSize = fontSize }; - font = GetFont(p, p.SubtitleFontSize); - } - catch - { - font = fontStack.Pop(); - } - } - i += endIndex; - } - } - else if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase)) - { - if (text.Substring(i).ToLowerInvariant().Replace("", string.Empty).Replace("
", string.Empty).Length > 0) - { - if (lastText.EndsWith(' ') && !sb.StartsWith(' ')) - { - string t = sb.ToString(); - sb.Clear(); - sb.Append(' '); - sb.Append(t); - } - - float addLeft = 0; - int oldPathPointIndex = path.PointCount - 1; - if (oldPathPointIndex < 0) - { - oldPathPointIndex = 0; - } - - if (sb.Length > 0) - { - if (lastText.Length > 0 && left > 2) - { - left -= 1.5f; - } - - lastText.Append(sb); - - TextDraw.DrawText(font, sf, path, sb, isItalic, parameter.SubtitleFontBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); - } - - addLeft = GetLastPositionFromPath(path, oldPathPointIndex, addLeft); - if (addLeft < 0.01) - { - addLeft = left + 2; - } - - left = addLeft; - - DrawShadowAndPath(parameter, g, path); - g.FillPath(new SolidBrush(c), path); - path.Reset(); - sb = new StringBuilder(); - if (colorStack.Count > 0) - { - c = colorStack.Pop(); - } - - if (left >= 3) - { - left -= 2.5f; - } - } - if (fontStack.Count > 0) - { - font.Dispose(); - font = fontStack.Pop(); - } - i += 6; - } - else if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase)) - { - if (sb.Length > 0) - { - lastText.Append(sb); - TextDraw.DrawText(font, sf, path, sb, isItalic, parameter.SubtitleFontBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); - } - isItalic = true; - i += 2; - } - else if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase) && isItalic) - { - if (lastText.EndsWith(' ') && !sb.StartsWith(' ')) - { - string t = sb.ToString(); - sb.Clear(); - sb.Append(' '); - sb.Append(t); - } - lastText.Append(sb); - TextDraw.DrawText(font, sf, path, sb, isItalic, parameter.SubtitleFontBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); - isItalic = false; - i += 3; - } - else if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase)) - { - if (sb.Length > 0) - { - lastText.Append(sb); - TextDraw.DrawText(font, sf, path, sb, isItalic, isBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); - } - isBold = true; - i += 2; - } - else if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase) && isBold) - { - if (lastText.EndsWith(' ') && !sb.StartsWith(' ')) - { - string t = sb.ToString(); - sb.Clear(); - sb.Append(' '); - sb.Append(t); - } - lastText.Append(sb); - TextDraw.DrawText(font, sf, path, sb, isItalic, isBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); - isBold = false; - i += 3; - } - else - { - sb.Append(text[i]); - } - i++; - } - if (sb.Length > 0) - { - TextDraw.DrawText(font, sf, path, sb, isItalic, parameter.SubtitleFontBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); - } - - DrawShadowAndPath(parameter, g, path); - g.FillPath(new SolidBrush(c), path); - g.Dispose(); - - var nbmp = new NikseBitmap(bmp); - bmp.Dispose(); - font.Dispose(); - sf.Dispose(); - return nbmp; - } - - internal static Bitmap GenerateImageFromTextWithStyle(MakeBitmapParameter parameter) - { - Bitmap bmp = null; - if (!parameter.SimpleRendering && parameter.P.Text.Contains(Environment.NewLine) && (parameter.BoxSingleLine || parameter.P.Text.Contains(BoxSingleLineText))) - { - string old = parameter.P.Text; - int oldType3D = parameter.Type3D; - if (parameter.Type3D == 2) // Half-Top/Bottom 3D - { - parameter.Type3D = 0; // fix later - } - var oldBackgroundColor = parameter.BackgroundColor; - if (parameter.P.Text.Contains(BoxSingleLineText)) - { - parameter.P.Text = parameter.P.Text.Replace("<" + BoxSingleLineText + ">", string.Empty).Replace("", string.Empty); - parameter.BackgroundColor = parameter.BorderColor; - } - - var italicOn = false; - var boldOn = false; - var fontTag = string.Empty; - var lineWidts = new List(); - foreach (var line in parameter.P.Text.SplitToLines()) - { - parameter.P.Text = line; - - if (italicOn) - { - parameter.P.Text = "" + parameter.P.Text; - } - italicOn = parameter.P.Text.Contains("", StringComparison.OrdinalIgnoreCase) && !parameter.P.Text.Contains("", StringComparison.OrdinalIgnoreCase); - if (italicOn) - { - parameter.P.Text += ""; - } - - if (boldOn) - { - parameter.P.Text = "" + parameter.P.Text; - } - boldOn = parameter.P.Text.Contains("", StringComparison.OrdinalIgnoreCase) && !parameter.P.Text.Contains("", StringComparison.OrdinalIgnoreCase); - if (boldOn) - { - parameter.P.Text += ""; - } - - parameter.P.Text = fontTag + parameter.P.Text; - if (parameter.P.Text.Contains("", StringComparison.OrdinalIgnoreCase)) - { - int start = parameter.P.Text.LastIndexOf("', start); - fontTag = parameter.P.Text.Substring(start, end - start + 1); - } - - var lineImage = GenerateImageFromTextWithStyleInner(parameter); - lineWidts.Add(lineImage.Width); - if (bmp == null) - { - bmp = lineImage; - } - else - { - int w = Math.Max(bmp.Width, lineImage.Width); - int h = bmp.Height + lineImage.Height; - - int l1; - if (parameter.AlignLeft) - { - l1 = 0; - } - else if (parameter.AlignRight) - { - l1 = w - bmp.Width; - } - else - { - l1 = (int)Math.Round((w - bmp.Width) / 2.0); - - if (parameter.JustifyLeft) - { - l1 = 0; - } - else if (parameter.JustifyRight) - { - l1 = w - lineImage.Width; - } - } - - int l2; - if (parameter.AlignLeft) - { - l2 = 0; - } - else if (parameter.AlignRight) - { - l2 = w - lineImage.Width; - } - else - { - l2 = (int)Math.Round((w - lineImage.Width) / 2.0); - - if (parameter.JustifyLeft) - { - l2 = 0; - } - else if (parameter.JustifyRight) - { - l2 = w - lineImage.Width; - if (parameter.BoxSingleLine) - { - l1 = w - lineWidts[0]; - } - } - } - - var style = GetStyleName(parameter.P); - var lineHeight = 25; - if (parameter.LineHeight.ContainsKey(style)) - { - lineHeight = parameter.LineHeight[style]; - } - else if (parameter.LineHeight.Count > 0) - { - lineHeight = parameter.LineHeight.First().Value; - } - - if (lineHeight > lineImage.Height) - { - h += lineHeight - lineImage.Height; - var largeImage = new Bitmap(w, h); - var g = Graphics.FromImage(largeImage); - g.DrawImageUnscaled(bmp, new Point(l1, 0)); - g.DrawImageUnscaled(lineImage, new Point(l2, bmp.Height + lineHeight - lineImage.Height)); - bmp.Dispose(); - bmp = largeImage; - g.Dispose(); - } - else - { - var largeImage = new Bitmap(w, h); - var g = Graphics.FromImage(largeImage); - g.DrawImageUnscaled(bmp, new Point(l1, 0)); - g.DrawImageUnscaled(lineImage, new Point(l2, bmp.Height)); - bmp.Dispose(); - bmp = largeImage; - g.Dispose(); - } - } - } - parameter.P.Text = old; - parameter.Type3D = oldType3D; - parameter.BackgroundColor = oldBackgroundColor; - - if (parameter.Type3D == 2) // Half-side-by-side 3D - due to per line we need to do this after making lines - { - var newBmp = Make3DTopBottom(parameter, new NikseBitmap(bmp)).GetBitmap(); - bmp?.Dispose(); - bmp = newBmp; - } - } - else - { - var oldBackgroundColor = parameter.BackgroundColor; - string oldText = parameter.P.Text; - if (parameter.P.Text.Contains(BoxMultiLineText) || parameter.P.Text.Contains(BoxSingleLineText)) - { - parameter.P.Text = parameter.P.Text.Replace("<" + BoxMultiLineText + ">", string.Empty).Replace("", string.Empty); - parameter.P.Text = parameter.P.Text.Replace("<" + BoxSingleLineText + ">", string.Empty).Replace("", string.Empty); - parameter.BackgroundColor = parameter.BorderColor; - } - bmp = GenerateImageFromTextWithStyleInner(parameter); - parameter.P.Text = oldText; - parameter.BackgroundColor = oldBackgroundColor; - } - return bmp; - } - - private static readonly Dictionary PaddingDictionary = new Dictionary(); - private static Bitmap GenerateImageFromTextWithStyleInner(MakeBitmapParameter parameter) // for UI - { - string text = parameter.P.Text; - - text = AssToHtmlTagsIfKnow(text); - - text = text.Replace("", ""); - text = text.Replace("", ""); - text = HtmlUtil.FixInvalidItalicTags(text); - - text = text.Replace("", ""); - text = text.Replace("", ""); - - // no support for underline - text = HtmlUtil.RemoveOpenCloseTags(text, HtmlUtil.TagUnderline); - - Font font = null; - Bitmap bmp = null; - try - { - font = GetFont(parameter, parameter.SubtitleFontSize); - SizeF textSize; - using (var bmpTemp = new Bitmap(1, 1)) - using (var g = Graphics.FromImage(bmpTemp)) - { - textSize = g.MeasureString(HtmlUtil.RemoveHtmlTags(text), font); - } - int sizeX = (int)(textSize.Width * 1.8) + 150; - int sizeY = (int)(textSize.Height * 0.9) + 50; - if (sizeX < 1) - { - sizeX = 1; - } - - if (sizeY < 1) - { - sizeY = 1; - } - - if (parameter.BackgroundColor != Color.Transparent) - { - var nbmpTemp = new NikseBitmap(sizeX, sizeY + _boxBorderSize * 2); // make room for box border above+under text - nbmpTemp.Fill(parameter.BackgroundColor); - bmp = nbmpTemp.GetBitmap(); - } - else - { - bmp = new Bitmap(sizeX, sizeY); - } - - var paddingKey = font.Name + font.Size.ToString(CultureInfo.InvariantCulture); - int baseLinePadding; - if (PaddingDictionary.ContainsKey(paddingKey)) - { - baseLinePadding = PaddingDictionary[paddingKey]; - } - else - { - baseLinePadding = (int)Math.Round(TextDraw.MeasureTextHeight(font, "yjK)", parameter.SubtitleFontBold) - TextDraw.MeasureTextHeight(font, "ac", parameter.SubtitleFontBold)); - PaddingDictionary.Add(paddingKey, baseLinePadding); - } - - // align lines with "gjpqy,ýęçÇ/()[]" a bit lower - var lines = text.SplitToLines(); - if (lines.Count > 0) - { - var lastLine = lines[lines.Count - 1]; - if (lastLine.Contains(new[] { 'g', 'j', 'p', 'q', 'y', ',', 'ý', 'ę', 'ç', 'Ç', '/', '(', ')', '[', ']' })) - { - var textNoBelow = lastLine.Replace('g', 'a').Replace('j', 'a').Replace('p', 'a').Replace('q', 'a').Replace('y', 'a').Replace(',', 'a').Replace('ý', 'a').Replace('ę', 'a').Replace('ç', 'a').Replace('Ç', 'a').Replace('/', 'a').Replace('(', 'a').Replace(')', 'a').Replace('[', 'a').Replace(']', 'a'); - baseLinePadding -= (int)Math.Round(TextDraw.MeasureTextHeight(font, lastLine, parameter.SubtitleFontBold) - TextDraw.MeasureTextHeight(font, textNoBelow, parameter.SubtitleFontBold)); - } - else - { - baseLinePadding += 1; - } - if (baseLinePadding < 0) - { - baseLinePadding = 0; - } - } - - if (lines.Count == 1 && parameter.JustifyTop) // align top - { - baseLinePadding += (int)Math.Round(TextDraw.MeasureTextHeight(font, "yjK)", parameter.SubtitleFontBold)); - } - - // TODO: Better baseline - test http://bobpowell.net/formattingtext.aspx - //float baselineOffset=font.SizeInPoints/font.FontFamily.GetEmHeight(font.Style)*font.FontFamily.GetCellAscent(font.Style); - //float baselineOffsetPixels = g.DpiY/72f*baselineOffset; - //baseLinePadding = (int)Math.Round(baselineOffsetPixels); - - var lefts = new List(); - var widths = new List(); - if (text.Contains("", StringComparison.OrdinalIgnoreCase) || text.Contains("", StringComparison.OrdinalIgnoreCase)) - { - bool tempItalicOn = false; - bool tempBoldOn = false; - var tempFontOn = string.Empty; - foreach (string line in text.SplitToLines()) - { - var tempLine = line; - - if (tempItalicOn) - { - tempLine = "" + tempLine; - } - - if (tempBoldOn) - { - tempLine = "" + tempLine; - } - - if (!string.IsNullOrEmpty(tempFontOn)) - { - tempLine = tempFontOn + tempLine; - } - - if (tempLine.LastIndexOf("= 0 && - tempLine.LastIndexOf("", StringComparison.Ordinal) < - tempLine.LastIndexOf("', start); - if (end > 0) - { - tempFontOn = tempLine.Substring(start, end - start + 1); - } - } - else if (tempLine.LastIndexOf("", StringComparison.Ordinal) >= 0) - { - tempFontOn = string.Empty; - } - - if (tempLine.Contains("") && !tempLine.Contains("")) - { - tempItalicOn = true; - } - - if (tempLine.Contains("") && !tempLine.Contains("")) - { - tempBoldOn = true; - } - - int w; - if (text.Contains("")) - { - tempItalicOn = false; - } - - if (line.Contains("")) - { - tempBoldOn = false; - } - } - } - else - { - foreach (var line in HtmlUtil.RemoveOpenCloseTags(text, HtmlUtil.TagItalic, HtmlUtil.TagFont).SplitToLines()) - { - if (parameter.JustifyRight) - { - var w = TextDraw.MeasureTextWidth(font, line, parameter.SubtitleFontBold); - widths.Add(w); - } - - if (parameter.AlignLeft) - { - lefts.Add(5); - } - else if (parameter.AlignRight) - { - lefts.Add(bmp.Width - (TextDraw.MeasureTextWidth(font, line, parameter.SubtitleFontBold) + 15)); - } - else - { - lefts.Add((float)((bmp.Width - TextDraw.MeasureTextWidth(font, line, parameter.SubtitleFontBold) + 15) / 2.0)); - } - } - } - - if (parameter.JustifyLeft) - { - // left justify centered lines - var minX = lefts.Min(p => p); - for (var index = 0; index < lefts.Count; index++) - { - lefts[index] = minX; - } - } - else if (parameter.JustifyRight) - { - // right justify centered lines - var maxX = widths.Max(p => p); - var minX = lefts.Min(p => p); - for (var index = 0; index < lefts.Count; index++) - { - lefts[index] = minX + maxX - widths[index]; - } - } - - var sf = new StringFormat { Alignment = StringAlignment.Near, LineAlignment = StringAlignment.Near }; - - using (var g = Graphics.FromImage(bmp)) - { - g.CompositingQuality = CompositingQuality.HighQuality; - g.InterpolationMode = InterpolationMode.HighQualityBicubic; - g.SmoothingMode = SmoothingMode.HighQuality; - g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; - - if (parameter.SimpleRendering) - { - if (text.StartsWith(" 0) - { - left = lefts[0]; - } - - float top = 5; - if (top < _boxBorderSize && parameter.BackgroundColor != Color.Transparent) - { - top = _boxBorderSize; // make text down so box border will be satisfied - } - - bool newLine = false; - int lineNumber = 0; - float leftMargin = left; - int newLinePathPoint = -1; - Color c = parameter.SubtitleColor; - var colorStack = new Stack(); - var fontStack = new Stack(); - var lastText = new StringBuilder(); - for (var i = 0; i < text.Length; i++) - { - if (text.Substring(i).StartsWith(" 0) - { - lastText.Append(sb); - TextDraw.DrawText(font, sf, path, sb, isItalic, isBold || parameter.SubtitleFontBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); - } - - addLeft = GetLastPositionFromPath(path, oldPathPointIndex, addLeft); - if (path.PointCount == 0) - { - addLeft = left; - } - else if (addLeft < 0.01) - { - addLeft = left + 2; - } - - left = addLeft; - - DrawShadowAndPath(parameter, g, path); - var p2 = new SolidBrush(c); - g.FillPath(p2, path); - p2.Dispose(); - path.Reset(); - path = new GraphicsPath(); - sb = new StringBuilder(); - - int endIndex = text.Substring(i).IndexOf('>'); - if (endIndex < 0) - { - i += 9999; - } - else - { - string fontContent = text.Substring(i, endIndex); - if (fontContent.Contains(" color=", StringComparison.OrdinalIgnoreCase)) - { - string[] arr = fontContent.Substring(fontContent.IndexOf(" color=", StringComparison.OrdinalIgnoreCase) + 7).Trim().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); - if (arr.Length > 0) - { - string fontColor = arr[0].Trim('\'').Trim('"').Trim('\''); - try - { - colorStack.Push(c); // save old color - if (fontColor.StartsWith("rgb(", StringComparison.OrdinalIgnoreCase)) - { - arr = fontColor.Remove(0, 4).TrimEnd(')').Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); - c = Color.FromArgb(int.Parse(arr[0]), int.Parse(arr[1]), int.Parse(arr[2])); - } - else - { - c = ColorTranslator.FromHtml(fontColor); - } - } - catch - { - c = parameter.SubtitleColor; - } - } - } - if (fontContent.Contains(" face=", StringComparison.OrdinalIgnoreCase) || fontContent.Contains(" size=", StringComparison.OrdinalIgnoreCase)) - { - float fontSize = parameter.SubtitleFontSize; - string fontFace = parameter.SubtitleFontName; - - string[] arr = fontContent.Substring(fontContent.IndexOf(" face=", StringComparison.OrdinalIgnoreCase) + 6).Trim().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); - if (arr.Length > 0) - { - fontFace = arr[0].Trim('\'').Trim('"').Trim('\''); - } - - arr = fontContent.Substring(fontContent.IndexOf(" size=", StringComparison.OrdinalIgnoreCase) + 6).Trim().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); - if (arr.Length > 0) - { - string temp = arr[0].Trim('\'').Trim('"').Trim('\''); - if (float.TryParse(temp, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var f)) - { - fontSize = f; - } - } - - try - { - fontStack.Push(font); // save old cfont - var p = new MakeBitmapParameter { SubtitleFontName = fontFace, SubtitleFontSize = fontSize }; - font = GetFont(p, p.SubtitleFontSize); - } - catch - { - font = fontStack.Pop(); - } - } - - - i += endIndex; - } - } - else if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase)) - { - if (text.Substring(i).ToLowerInvariant().Replace("", string.Empty).Replace("", string.Empty).Length > 0) - { - if (lastText.EndsWith(' ') && !sb.StartsWith(' ')) - { - string t = sb.ToString(); - sb.Clear(); - sb.Append(' '); - sb.Append(t); - } - - float addLeft = 0; - int oldPathPointIndex = path.PointCount - 1; - if (oldPathPointIndex < 0) - { - oldPathPointIndex = 0; - } - - if (sb.Length > 0) - { - if (lastText.Length > 0 && left > 2) - { - left -= 1.5f; - } - - lastText.Append(sb); - - TextDraw.DrawText(font, sf, path, sb, isItalic, isBold || parameter.SubtitleFontBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); - } - - addLeft = GetLastPositionFromPath(path, oldPathPointIndex, addLeft); - if (addLeft < 0.01) - { - addLeft = left + 2; - } - - left = addLeft; - - DrawShadowAndPath(parameter, g, path); - g.FillPath(new SolidBrush(c), path); - path.Reset(); - sb.Clear(); - if (colorStack.Count > 0) - { - c = colorStack.Pop(); - } - - if (left >= 3) - { - left -= 2.5f; - } - } - if (fontStack.Count > 0) - { - font.Dispose(); - font = fontStack.Pop(); - } - i += 6; - } - else if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase)) - { - if (sb.Length > 0) - { - float addLeft = 0; - int oldPathPointIndex = path.PointCount - 1; - if (oldPathPointIndex < 0) - { - oldPathPointIndex = 0; - } - - lastText.Append(sb); - TextDraw.DrawText(font, sf, path, sb, isItalic, isBold || parameter.SubtitleFontBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); - - addLeft = GetLastPositionFromPath(path, oldPathPointIndex, addLeft); - if (addLeft < 0.01) - { - addLeft = left + 2; - } - - left = addLeft; - } - isItalic = true; - i += 2; - } - else if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase) && isItalic) - { - if (lastText.EndsWith(' ') && !sb.StartsWith(' ')) - { - string t = sb.ToString(); - sb.Clear(); - sb.Append(' '); - sb.Append(t); - } - - if (sb.Length > 0) - { - float addLeft = 0; - int oldPathPointIndex = path.PointCount - 1; - if (oldPathPointIndex < 0) - { - oldPathPointIndex = 0; - } - - if (sb.Length > 0) - { - if (lastText.Length > 0 && left > 2) - { - left -= 1.5f; - } - - lastText.Append(sb); - TextDraw.DrawText(font, sf, path, sb, isItalic, isBold || parameter.SubtitleFontBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); - } - - addLeft = GetLastPositionFromPath(path, oldPathPointIndex, addLeft); - if (addLeft < 0.01) - { - addLeft = left + 2; - } - - left = addLeft; - } - - isItalic = false; - i += 3; - } - else if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase) && !isItalic) - { - i += 3; - } - else if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase)) - { - if (sb.Length > 0) - { - lastText.Append(sb); - TextDraw.DrawText(font, sf, path, sb, isItalic, isBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); - } - isBold = true; - i += 2; - } - else if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase) && isBold) - { - if (lastText.EndsWith(' ') && !sb.StartsWith(' ')) - { - string t = sb.ToString(); - sb.Clear(); - sb.Append(' '); - sb.Append(t); - } - - if (sb.Length > 0) - { - float addLeft = 0; - int oldPathPointIndex = path.PointCount - 1; - if (oldPathPointIndex < 0) - { - oldPathPointIndex = 0; - } - - if (sb.Length > 0) - { - if (lastText.Length > 0 && left > 2) - { - left -= 1.5f; - } - - lastText.Append(sb); - TextDraw.DrawText(font, sf, path, sb, isItalic, isBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); - } - - addLeft = GetLastPositionFromPath(path, oldPathPointIndex, addLeft); - if (addLeft < 0.01) - { - addLeft = left + 2; - } - - left = addLeft; - } - - isBold = false; - i += 3; - } - else if (text.Substring(i).StartsWith(Environment.NewLine, StringComparison.Ordinal)) - { - lastText.Append(sb); - TextDraw.DrawText(font, sf, path, sb, isItalic, isBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); - var style = GetStyleName(parameter.P); - var lineHeight = (int)Math.Round(textSize.Height * 0.64f); - if (parameter.LineHeight.ContainsKey(style)) - { - lineHeight = parameter.LineHeight[style]; - } - - top += lineHeight; - newLine = true; - i += Environment.NewLine.Length - 1; - lineNumber++; - if (lineNumber < lefts.Count) - { - leftMargin = lefts[lineNumber]; - left = leftMargin; - } - } - else - { - sb.Append(text[i]); - } - } - if (sb.Length > 0) - { - TextDraw.DrawText(font, sf, path, sb, isItalic, isBold || parameter.SubtitleFontBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); - } - - DrawShadowAndPath(parameter, g, path); - g.FillPath(new SolidBrush(c), path); - } - } - sf.Dispose(); - - var nbmp = new NikseBitmap(bmp); - if (parameter.BackgroundColor == Color.Transparent) - { - nbmp.CropTransparentSidesAndBottom(baseLinePadding, true); - nbmp.CropTransparentSidesAndBottom(2, false); - } - else - { - nbmp.CropSidesAndBottom(_boxBorderSize, parameter.BackgroundColor, true); - nbmp.CropTop(_boxBorderSize, parameter.BackgroundColor); - } - - if (nbmp.Width > parameter.ScreenWidth) - { - parameter.Error = "#" + parameter.P.Number.ToString(CultureInfo.InvariantCulture) + ": " + nbmp.Width.ToString(CultureInfo.InvariantCulture) + " > " + parameter.ScreenWidth.ToString(CultureInfo.InvariantCulture); - } - - if (parameter.Type3D == 1) // Half-side-by-side 3D - { - Bitmap singleBmp = nbmp.GetBitmap(); - Bitmap singleHalfBmp = ScaleToHalfWidth(singleBmp); - singleBmp.Dispose(); - var sideBySideBmp = new Bitmap(parameter.ScreenWidth, singleHalfBmp.Height); - int singleWidth = parameter.ScreenWidth / 2; - int singleLeftMargin = (singleWidth - singleHalfBmp.Width) / 2; - - using (Graphics gSideBySide = Graphics.FromImage(sideBySideBmp)) - { - gSideBySide.DrawImage(singleHalfBmp, singleLeftMargin + parameter.Depth3D, 0); - gSideBySide.DrawImage(singleHalfBmp, singleWidth + singleLeftMargin - parameter.Depth3D, 0); - } - nbmp = new NikseBitmap(sideBySideBmp); - if (parameter.BackgroundColor == Color.Transparent) - { - nbmp.CropTransparentSidesAndBottom(2, true); - } - else - { - nbmp.CropSidesAndBottom(_boxBorderSize, parameter.BackgroundColor, true); - } - } - else if (parameter.Type3D == 2) // Half-Top/Bottom 3D - { - nbmp = Make3DTopBottom(parameter, nbmp); - } - return nbmp.GetBitmap(); - } - finally - { - font?.Dispose(); - bmp?.Dispose(); - } - } - - private static float GetLastPositionFromPath(GraphicsPath path, int oldPathPointIndex, float addLeft) - { - if (path.PointCount > 0) - { - var list = (PointF[])path.PathPoints.Clone(); // avoid using very slow path.PathPoints indexer!!! - for (int k = oldPathPointIndex + 1; k < list.Length; k++) - { - if (list[k].X > addLeft) - { - addLeft = list[k].X; - } - } - } - return addLeft; - } - - private static Point? GetAssPoint(string s) - { - int k = s.IndexOf("{\\", StringComparison.Ordinal); - while (k >= 0) - { - int l = s.IndexOf('}', k + 1); - if (l < k) - { - break; - } - - var assTags = s.Substring(k + 1, l - k - 1).Split('\\'); - foreach (var assTag in assTags) - { - if (assTag.StartsWith("pos(", StringComparison.Ordinal)) - { - var numbers = assTag.Remove(0, 4).TrimEnd(')').Trim().Split(','); - if (numbers.Length == 2 && Utilities.IsInteger(numbers[0]) && Utilities.IsInteger(numbers[1])) - { - return new Point(int.Parse(numbers[0]), int.Parse(numbers[1])); - } - } - } - k = s.IndexOf("{\\", k + 1, StringComparison.Ordinal); - } - return null; - } - - private static string AssToHtmlTagsIfKnow(string s) - { - int k = s.IndexOf("{\\", StringComparison.Ordinal); - while (k >= 0) - { - int l = s.IndexOf('}', k + 1); - if (l < k) - { - break; - } - - var assTags = s.Substring(k + 1, l - k - 1).Split('\\'); - var sb = new StringBuilder(); - foreach (var assTag in assTags) - { - if (assTag == "i1") - { - sb.Append(""); - } - else if (assTag == "i" || assTag == "i0") - { - sb.Append(""); - } - else if (assTag == "b1" || assTag == "b2" || assTag == "b3" || assTag == "b4") - { - sb.Append(""); - } - else if (assTag == "b" || assTag == "b0") - { - sb.Append(""); - } - } - s = s.Remove(k, l - k + 1); - s = s.Insert(k, sb.ToString()); - k = s.IndexOf("{\\", k, StringComparison.Ordinal); - } - return s; - } - - private static NikseBitmap Make3DTopBottom(MakeBitmapParameter parameter, NikseBitmap nbmp) - { - Bitmap singleBmp = nbmp.GetBitmap(); - Bitmap singleHalfBmp = ScaleToHalfHeight(singleBmp); - singleBmp.Dispose(); - var topBottomBmp = new Bitmap(parameter.ScreenWidth, parameter.ScreenHeight - parameter.BottomMargin); - int singleHeight = parameter.ScreenHeight / 2; - int leftM = (parameter.ScreenWidth / 2) - (singleHalfBmp.Width / 2); - - using (Graphics gTopBottom = Graphics.FromImage(topBottomBmp)) - { - gTopBottom.DrawImage(singleHalfBmp, leftM + parameter.Depth3D, singleHeight - singleHalfBmp.Height - parameter.BottomMargin); - gTopBottom.DrawImage(singleHalfBmp, leftM - parameter.Depth3D, parameter.ScreenHeight - parameter.BottomMargin - singleHalfBmp.Height); - } - nbmp = new NikseBitmap(topBottomBmp); - if (parameter.BackgroundColor == Color.Transparent) - { - nbmp.CropTop(2, Color.Transparent); - nbmp.CropTransparentSidesAndBottom(2, false); - } - else - { - nbmp.CropTop(_boxBorderSize, parameter.BackgroundColor); - nbmp.CropSidesAndBottom(_boxBorderSize, parameter.BackgroundColor, false); - } - return nbmp; - } - - private static void DrawShadowAndPath(MakeBitmapParameter parameter, Graphics g, GraphicsPath path) - { - if (parameter.ShadowWidth > 0) - { - var shadowAlpha = parameter.ShadowAlpha; - if (parameter.ShadowWidth > 1) - { - shadowAlpha = (int)Math.Round(shadowAlpha * 0.8); - } - - var shadowPath = (GraphicsPath)path.Clone(); - for (int k = 0; k < parameter.ShadowWidth; k++) - { - var translateMatrix = new Matrix(); - translateMatrix.Translate(1, 1); - shadowPath.Transform(translateMatrix); - - using (var p1 = new Pen(new SolidBrush(Color.FromArgb(shadowAlpha, parameter.ShadowColor)), parameter.BorderWidth)) - { - SetLineJoin(parameter.LineJoin, p1); - g.DrawPath(p1, shadowPath); - } - } - } - - if (parameter.BorderWidth > 0) - { - var p1 = new Pen(parameter.BorderColor, (float)(parameter.BorderWidth * 1.1)); - SetLineJoin(parameter.LineJoin, p1); - g.DrawPath(p1, path); - p1.Dispose(); - } - } - - private static void SetLineJoin(string lineJoin, Pen pen) - { - if (string.IsNullOrWhiteSpace(lineJoin)) - { - return; - } - - if (string.Compare(lineJoin, "Round", StringComparison.OrdinalIgnoreCase) == 0) - { - pen.LineJoin = LineJoin.Round; - } - else if (string.Compare(lineJoin, "Bevel", StringComparison.OrdinalIgnoreCase) == 0) - { - pen.LineJoin = LineJoin.Bevel; - } - else if (string.Compare(lineJoin, "Miter", StringComparison.OrdinalIgnoreCase) == 0) - { - pen.LineJoin = LineJoin.Miter; - } - else if (string.Compare(lineJoin, "MiterClipped", StringComparison.OrdinalIgnoreCase) == 0) - { - pen.LineJoin = LineJoin.MiterClipped; - } - } - - private static Bitmap ScaleToHalfWidth(Bitmap bmp) - { - int w = bmp.Width / 2; - var newImage = new Bitmap(w, bmp.Height); - using (var gr = Graphics.FromImage(newImage)) - { - gr.SmoothingMode = SmoothingMode.HighQuality; - gr.InterpolationMode = InterpolationMode.HighQualityBicubic; - gr.PixelOffsetMode = PixelOffsetMode.HighQuality; - gr.DrawImage(bmp, new Rectangle(0, 0, w, bmp.Height)); - } - return newImage; - } - - private static Bitmap ScaleToHalfHeight(Bitmap bmp) - { - int h = bmp.Height / 2; - var newImage = new Bitmap(bmp.Width, h); - using (var gr = Graphics.FromImage(newImage)) - { - gr.SmoothingMode = SmoothingMode.HighQuality; - gr.InterpolationMode = InterpolationMode.HighQualityBicubic; - gr.PixelOffsetMode = PixelOffsetMode.HighQuality; - gr.DrawImage(bmp, new Rectangle(0, 0, bmp.Width, h)); - } - return newImage; - } - - private bool _allowCustomBottomMargin; - - internal void Initialize(Subtitle subtitle, SubtitleFormat format, string exportType, string fileName, VideoInfo videoInfo, string videoFileName) - { - checkBoxFullFrameImage.Checked = false; - checkBoxFullFrameImage.Visible = false; - _exportType = exportType; - _fileName = fileName; - _format = format; - _formatName = _format != null ? _format.Name : string.Empty; - if (_formatName == AdvancedSubStationAlpha.NameOfFormat || _formatName == SubStationAlpha.NameOfFormat) - { - CalculateHeights(subtitle); - } - _videoFileName = videoFileName; - if (exportType == ExportFormats.BluraySup) - { - Text = "Blu-ray SUP"; - } - else if (exportType == ExportFormats.VobSub) - { - Text = "VobSub (sub/idx)"; - } - else if (exportType == ExportFormats.Fab) - { - Text = "FAB Image Script"; - } - else if (exportType == ExportFormats.ImageFrame) - { - Text = "Image per frame"; - } - else if (exportType == ExportFormats.Stl) - { - Text = "DVD Studio Pro STL"; - } - else if (exportType == ExportFormats.Fcp) - { - Text = "Final Cut Pro"; - } - else if (exportType == ExportFormats.Dost) - { - Text = ExportFormats.Dost; - } - else if (exportType == ExportFormats.Edl) - { - Text = ExportFormats.Edl; - } - else if (_exportType == ExportFormats.EdlClipName) - { - Text = "EDL/CLIPNAME"; - } - else if (exportType == ExportFormats.DCinemaInterop) - { - Text = "DCinema interop/png"; - } - else if (exportType == ExportFormats.DCinemaSmpte2014) - { - Text = "DCinema SMPTE 2014/png"; - } - else if (exportType == ExportFormats.Spumux) - { - Text = ExportFormats.Spumux; - } - else - { - Text = Configuration.Settings.Language.ExportPngXml.Title; - } - - if (_exportType == ExportFormats.VobSub && !string.IsNullOrEmpty(Configuration.Settings.Tools.ExportVobSubFontName)) - { - _subtitleFontName = Configuration.Settings.Tools.ExportVobSubFontName; - } - else if ((_exportType == ExportFormats.BluraySup || _exportType == ExportFormats.Dost) && !string.IsNullOrEmpty(Configuration.Settings.Tools.ExportBluRayFontName)) - { - _subtitleFontName = Configuration.Settings.Tools.ExportBluRayFontName; - } - else if (_exportType == ExportFormats.Fcp && !string.IsNullOrEmpty(Configuration.Settings.Tools.ExportFcpFontName)) - { - _subtitleFontName = Configuration.Settings.Tools.ExportFcpFontName; - } - else if (!string.IsNullOrEmpty(Configuration.Settings.Tools.ExportFontNameOther)) - { - _subtitleFontName = Configuration.Settings.Tools.ExportFontNameOther; - } - - if (_exportType == ExportFormats.VobSub && Configuration.Settings.Tools.ExportVobSubFontSize > 0) - { - _subtitleFontSize = Configuration.Settings.Tools.ExportVobSubFontSize; - } - else if ((_exportType == ExportFormats.BluraySup || _exportType == ExportFormats.Dost) && Configuration.Settings.Tools.ExportBluRayFontSize > 0) - { - _subtitleFontSize = Configuration.Settings.Tools.ExportBluRayFontSize; - } - else if (_exportType == ExportFormats.Fcp && Configuration.Settings.Tools.ExportFcpFontSize > 0) - { - _subtitleFontSize = Configuration.Settings.Tools.ExportFcpFontSize; - } - else if (Configuration.Settings.Tools.ExportLastFontSize > 0) - { - _subtitleFontSize = Configuration.Settings.Tools.ExportLastFontSize; - } - - if (_exportType == ExportFormats.Fcp) - { - comboBoxImageFormat.Items.Add("8-bit png"); - int i = 0; - foreach (string item in comboBoxImageFormat.Items) - { - if (item == Configuration.Settings.Tools.ExportFcpImageType) - { - comboBoxImageFormat.SelectedIndex = i; - break; - } - i++; - } - } - - if (_exportType == ExportFormats.VobSub) - { - comboBoxSubtitleFontSize.SelectedIndex = 7; - int i = 0; - foreach (string item in comboBoxSubtitleFontSize.Items) - { - if (item == Convert.ToInt32(_subtitleFontSize).ToString(CultureInfo.InvariantCulture)) - { - comboBoxSubtitleFontSize.SelectedIndex = i; - break; - } - i++; - } - checkBoxTransAntiAliase.Checked = Configuration.Settings.Tools.ExportVobAntiAliasingWithTransparency; - } - else if (_exportType == ExportFormats.BluraySup || _exportType == ExportFormats.Dost || _exportType == ExportFormats.Fcp) - { - comboBoxSubtitleFontSize.SelectedIndex = 16; - int i = 0; - foreach (string item in comboBoxSubtitleFontSize.Items) - { - if (item == Convert.ToInt32(_subtitleFontSize).ToString(CultureInfo.InvariantCulture)) - { - comboBoxSubtitleFontSize.SelectedIndex = i; - break; - } - i++; - } - } - else - { - comboBoxSubtitleFontSize.SelectedIndex = 16; - int i = 0; - foreach (string item in comboBoxSubtitleFontSize.Items) - { - if (item == Convert.ToInt32(_subtitleFontSize).ToString(CultureInfo.InvariantCulture)) - { - comboBoxSubtitleFontSize.SelectedIndex = i; - break; - } - i++; - } - } - - groupBoxImageSettings.Text = Configuration.Settings.Language.ExportPngXml.ImageSettings; - labelSubtitleFont.Text = Configuration.Settings.Language.ExportPngXml.FontFamily; - labelSubtitleFontSize.Text = Configuration.Settings.Language.ExportPngXml.FontSize; - labelResolution.Text = Configuration.Settings.Language.ExportPngXml.VideoResolution; - buttonColor.Text = Configuration.Settings.Language.ExportPngXml.FontColor; - checkBoxBold.Text = Configuration.Settings.Language.General.Bold; - checkBoxSimpleRender.Text = Configuration.Settings.Language.ExportPngXml.SimpleRendering; - checkBoxTransAntiAliase.Text = Configuration.Settings.Language.ExportPngXml.AntiAliasingWithTransparency; - labelResize.Text = Configuration.Settings.Language.General.Size; - normalToolStripMenuItem.Text = Configuration.Settings.Language.Main.Menu.ContextMenu.RemoveFormattingAll; - italicToolStripMenuItem.Text = Configuration.Settings.Language.General.Italic; - boxSingleLineToolStripMenuItem.Text = Configuration.Settings.Language.ExportPngXml.BoxSingleLine; - boxMultiLineToolStripMenuItem.Text = Configuration.Settings.Language.ExportPngXml.BoxMultiLine; - adjustTimeCodesToolStripMenuItem.Text = Configuration.Settings.Language.Main.Menu.Synchronization.AdjustAllTimes; - adjustDisplayTimeToolStripMenuItem.Text = Configuration.Settings.Language.Main.Menu.Tools.AdjustDisplayDuration; - - checkBoxFcpFullPathUrl.Text = Configuration.Settings.Language.ExportPngXml.FcpUseFullPathUrl; - checkBoxFcpFullPathUrl.Visible = exportType == ExportFormats.Fcp; - checkBoxFcpFullPathUrl.Checked = Configuration.Settings.Tools.ExportFcpFullPathUrl; - - - comboBox3D.Items.Clear(); - comboBox3D.Items.Add(Configuration.Settings.Language.General.None); - comboBox3D.Items.Add(Configuration.Settings.Language.ExportPngXml.SideBySide3D); - comboBox3D.Items.Add(Configuration.Settings.Language.ExportPngXml.HalfTopBottom3D); - comboBox3D.SelectedIndex = 0; - - labelDepth.Text = Configuration.Settings.Language.ExportPngXml.Depth; - - numericUpDownDepth3D.Left = labelDepth.Left + labelDepth.Width + 3; - - label3D.Text = Configuration.Settings.Language.ExportPngXml.Text3D; - - comboBox3D.Left = label3D.Left + label3D.Width + 3; - - buttonBorderColor.Text = Configuration.Settings.Language.ExportPngXml.BorderColor; - labelBorderWidth.Text = Configuration.Settings.Language.ExportPngXml.BorderStyle; - labelImageFormat.Text = Configuration.Settings.Language.ExportPngXml.ImageFormat; - checkBoxFullFrameImage.Text = Configuration.Settings.Language.ExportPngXml.FullFrameImage; - - buttonExport.Text = Configuration.Settings.Language.ExportPngXml.ExportAllLines; - buttonCancel.Text = Configuration.Settings.Language.General.Ok; - labelLanguage.Text = Configuration.Settings.Language.ChooseLanguage.Language; - labelFrameRate.Text = Configuration.Settings.Language.General.FrameRate; - labelHorizontalAlign.Text = Configuration.Settings.Language.ExportPngXml.Align; - labelBottomMargin.Text = Configuration.Settings.Language.ExportPngXml.BottomMargin; - labelLeftRightMargin.Text = Configuration.Settings.Language.ExportPngXml.LeftRightMargin; - - comboBoxHAlign.Items.Clear(); - comboBoxHAlign.Items.Add(Configuration.Settings.Language.ExportPngXml.Left); - comboBoxHAlign.Items.Add(Configuration.Settings.Language.ExportPngXml.Center); - comboBoxHAlign.Items.Add(Configuration.Settings.Language.ExportPngXml.Right); - comboBoxHAlign.Items.Add(Configuration.Settings.Language.ExportPngXml.CenterLeftJustify); - comboBoxHAlign.Items.Add(Configuration.Settings.Language.ExportPngXml.CenterTopJustify); - comboBoxHAlign.Items.Add(Configuration.Settings.Language.ExportPngXml.CenterRightJustify); - comboBoxHAlign.Items.Add(Configuration.Settings.Language.ExportPngXml.CenterLeftJustifyDialogs); - - buttonShadowColor.Text = Configuration.Settings.Language.ExportPngXml.ShadowColor; - labelShadowWidth.Text = Configuration.Settings.Language.ExportPngXml.ShadowWidth; - labelShadowTransparency.Text = Configuration.Settings.Language.ExportPngXml.Transparency; - labelLineHeight.Text = Configuration.Settings.Language.ExportPngXml.LineHeight; - - linkLabelPreview.Text = Configuration.Settings.Language.General.Preview; - linkLabelPreview.Left = groupBoxExportImage.Width - linkLabelPreview.Width - 3; - - saveImageAsToolStripMenuItem.Text = Configuration.Settings.Language.ExportPngXml.SaveImageAs; - - SubtitleListView1InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings); - UiUtil.InitializeSubtitleFont(subtitleListView1); - SubtitleListView1AutoSizeAllColumns(); - - _subtitle = new Subtitle(subtitle); - - panelColor.BackColor = _subtitleColor; - panelBorderColor.BackColor = _borderColor; - InitBorderStyle(); - comboBoxHAlign.SelectedIndex = 1; - comboBoxResolution.SelectedIndex = 3; - - if (Configuration.Settings.Tools.ExportLastShadowTransparency <= numericUpDownShadowTransparency.Maximum && Configuration.Settings.Tools.ExportLastShadowTransparency > 0) - { - numericUpDownShadowTransparency.Value = Configuration.Settings.Tools.ExportLastShadowTransparency; - } - - if ((_exportType == ExportFormats.BluraySup || _exportType == ExportFormats.Dost) && !string.IsNullOrEmpty(Configuration.Settings.Tools.ExportBluRayVideoResolution)) - { - SetResolution(Configuration.Settings.Tools.ExportBluRayVideoResolution); - } - - _language = LanguageAutoDetect.AutoDetectGoogleLanguageOrNull(subtitle); - if (exportType == ExportFormats.VobSub) - { - comboBoxBorderWidth.SelectedIndex = 6; - if (_exportType == ExportFormats.VobSub && !string.IsNullOrEmpty(Configuration.Settings.Tools.ExportVobSubVideoResolution)) - { - SetResolution(Configuration.Settings.Tools.ExportVobSubVideoResolution); - } - else - { - comboBoxResolution.SelectedIndex = 8; - } - - labelLanguage.Visible = true; - comboBoxLanguage.Visible = true; - comboBoxLanguage.Items.Clear(); - if (_language == null) - { - _language = Configuration.Settings.Tools.ExportVobSubLanguage; - } - - int index = -1; - foreach (var language in DvdSubtitleLanguage.CompliantLanguages) - { - int i = comboBoxLanguage.Items.Add(language); - if (language.Code == _language || index < 0 && language.Code == "en") - { - index = i; - } - } - comboBoxLanguage.SelectedIndex = index; - } - - bool showImageFormat = exportType == ExportFormats.Fab || exportType == ExportFormats.ImageFrame || exportType == ExportFormats.Stl || exportType == ExportFormats.Fcp || exportType == ExportFormats.BdnXml; - if (exportType == ExportFormats.Fab || exportType == ExportFormats.BluraySup || exportType == ExportFormats.Fcp) - { - checkBoxFullFrameImage.Visible = exportType == ExportFormats.Fab || exportType == ExportFormats.BluraySup || exportType == ExportFormats.Fcp; - } - else - { - checkBoxFullFrameImage.Checked = false; - } - - comboBoxImageFormat.Visible = showImageFormat; - labelImageFormat.Visible = showImageFormat; - labelFrameRate.Visible = exportType == ExportFormats.BdnXml || exportType == ExportFormats.BluraySup || exportType == ExportFormats.Dost || exportType == ExportFormats.ImageFrame; - comboBoxFrameRate.Visible = exportType == ExportFormats.BdnXml || exportType == ExportFormats.BluraySup || exportType == ExportFormats.Dost || exportType == ExportFormats.ImageFrame || exportType == ExportFormats.Fab || exportType == ExportFormats.Fcp; - checkBoxTransAntiAliase.Visible = exportType == ExportFormats.VobSub; - if (exportType == ExportFormats.BdnXml) - { - labelFrameRate.Top = labelLanguage.Top; - comboBoxFrameRate.Top = comboBoxLanguage.Top; - comboBoxFrameRate.Items.Add("23.976"); - comboBoxFrameRate.Items.Add("24"); - comboBoxFrameRate.Items.Add("25"); - comboBoxFrameRate.Items.Add("29.97"); - comboBoxFrameRate.Items.Add("30"); - comboBoxFrameRate.Items.Add("50"); - comboBoxFrameRate.Items.Add("59.94"); - comboBoxFrameRate.Items.Add("60"); - comboBoxFrameRate.SelectedIndex = 2; - - comboBoxImageFormat.Items.Clear(); - comboBoxImageFormat.Items.Add("Png 32-bit"); - comboBoxImageFormat.Items.Add("Png 8-bit"); - if (comboBoxImageFormat.Items[1].ToString() == Configuration.Settings.Tools.ExportBdnXmlImageType) - { - comboBoxImageFormat.SelectedIndex = 1; - } - else - { - comboBoxImageFormat.SelectedIndex = 0; - } - } - else if (exportType == ExportFormats.Dost) - { - labelFrameRate.Top = labelLanguage.Top; - comboBoxFrameRate.Top = comboBoxLanguage.Top; - comboBoxFrameRate.Items.Add("23.98"); - comboBoxFrameRate.Items.Add("24"); - comboBoxFrameRate.Items.Add("25"); - comboBoxFrameRate.Items.Add("29.97"); - comboBoxFrameRate.Items.Add("30"); - comboBoxFrameRate.Items.Add("59.94"); - comboBoxFrameRate.Items.Add("60"); - comboBoxFrameRate.SelectedIndex = 2; - } - else if (exportType == ExportFormats.ImageFrame) - { - labelFrameRate.Top = labelLanguage.Top; - comboBoxFrameRate.Top = comboBoxLanguage.Top; - comboBoxFrameRate.Items.Add("23.976"); - comboBoxFrameRate.Items.Add("24"); - comboBoxFrameRate.Items.Add("25"); - comboBoxFrameRate.Items.Add("29.97"); - comboBoxFrameRate.Items.Add("30"); - comboBoxFrameRate.Items.Add("50"); - comboBoxFrameRate.Items.Add("59.94"); - comboBoxFrameRate.Items.Add("60"); - comboBoxFrameRate.SelectedIndex = 2; - } - else if (exportType == ExportFormats.BluraySup) - { - labelFrameRate.Top = labelLanguage.Top; - comboBoxFrameRate.Top = comboBoxLanguage.Top; - comboBoxFrameRate.Items.Add("23.976"); - comboBoxFrameRate.Items.Add("24"); - comboBoxFrameRate.Items.Add("25"); - comboBoxFrameRate.Items.Add("29.97"); - comboBoxFrameRate.Items.Add("30"); - comboBoxFrameRate.Items.Add("50"); - comboBoxFrameRate.Items.Add("59.94"); - comboBoxFrameRate.Items.Add("60"); - comboBoxFrameRate.SelectedIndex = 1; - comboBoxFrameRate.DropDownStyle = ComboBoxStyle.DropDownList; - - checkBoxFullFrameImage.Top = comboBoxImageFormat.Top + 2; - panelFullFrameBackground.Top = checkBoxFullFrameImage.Top; - } - else if (exportType == ExportFormats.Fab) - { - labelFrameRate.Visible = true; - comboBoxFrameRate.Items.Add("23.976"); - comboBoxFrameRate.Items.Add("24"); - comboBoxFrameRate.Items.Add("25"); - comboBoxFrameRate.Items.Add("29.97"); - comboBoxFrameRate.Items.Add("30"); - comboBoxFrameRate.Items.Add("50"); - comboBoxFrameRate.Items.Add("59.94"); - comboBoxFrameRate.Items.Add("60"); - comboBoxFrameRate.SelectedIndex = 1; - comboBoxFrameRate.DropDownStyle = ComboBoxStyle.DropDownList; - } - else if (exportType == ExportFormats.Fcp) - { - labelFrameRate.Visible = true; - comboBoxFrameRate.Items.Add("23.976"); - comboBoxFrameRate.Items.Add("24"); - comboBoxFrameRate.Items.Add("25"); - comboBoxFrameRate.Items.Add("29.97"); - comboBoxFrameRate.Items.Add("30"); - comboBoxFrameRate.Items.Add("50"); - comboBoxFrameRate.Items.Add("59.94"); - comboBoxFrameRate.Items.Add("60"); - comboBoxFrameRate.SelectedIndex = 2; - comboBoxFrameRate.DropDownStyle = ComboBoxStyle.DropDownList; - - checkBoxFullFrameImage.Top = comboBoxFrameRate.Top + comboBoxFrameRate.Height + 5; - panelFullFrameBackground.Top = checkBoxFullFrameImage.Top; - } - if (comboBoxFrameRate.Items.Count >= 2) - { - SetLastFrameRate(Configuration.Settings.Tools.ExportLastFrameRate); - } - checkBoxFullFrameImage.Checked = Configuration.Settings.Tools.ExportFullFrame; - panelShadowColor.BackColor = Configuration.Settings.Tools.ExportShadowColor; - - comboBoxBottomMarginUnit.SelectedIndex = Configuration.Settings.Tools.ExportBottomMarginUnit == "%" ? 0 : 1; - comboBoxLeftRightMarginUnit.SelectedIndex = Configuration.Settings.Tools.ExportLeftRightMarginUnit == "%" ? 0 : 1; - - _allowCustomBottomMargin = _exportType == ExportFormats.BluraySup || _exportType == ExportFormats.VobSub || _exportType == ExportFormats.ImageFrame || _exportType == ExportFormats.BdnXml || _exportType == ExportFormats.Dost || _exportType == ExportFormats.Fab || _exportType == ExportFormats.Edl || _exportType == ExportFormats.EdlClipName; - if (_allowCustomBottomMargin) - { - comboBoxBottomMarginUnit.Visible = true; - comboBoxBottomMargin.Visible = true; - labelBottomMargin.Visible = true; - - comboBoxLeftRightMarginUnit.Visible = true; - comboBoxLeftRightMargin.Visible = true; - labelLeftRightMargin.Visible = true; - comboBoxBottomMarginUnit_SelectedIndexChanged(null, null); - } - else - { - comboBoxBottomMarginUnit.Visible = false; - comboBoxBottomMargin.Visible = false; - labelBottomMargin.Visible = false; - - comboBoxLeftRightMarginUnit.Visible = false; - comboBoxLeftRightMargin.Visible = false; - labelLeftRightMargin.Visible = false; - } - - checkBoxSkipEmptyFrameAtStart.Visible = exportType == ExportFormats.ImageFrame; - - foreach (var x in FontFamily.Families) - { - if (x.IsStyleAvailable(FontStyle.Regular) || x.IsStyleAvailable(FontStyle.Bold)) - { - comboBoxSubtitleFont.Items.Add(x.Name); - if (x.Name.Equals(_subtitleFontName, StringComparison.OrdinalIgnoreCase)) - { - comboBoxSubtitleFont.SelectedIndex = comboBoxSubtitleFont.Items.Count - 1; - } - } - } - if (comboBoxSubtitleFont.SelectedIndex == -1) - { - comboBoxSubtitleFont.SelectedIndex = 0; // take first font if default font was not found (e.g. linux) - } - - if (videoInfo != null && videoInfo.Height > 0 && videoInfo.Width > 0) - { - comboBoxResolution.Items[comboBoxResolution.Items.Count - 1] = videoInfo.Width + "x" + videoInfo.Height; - comboBoxResolution.SelectedIndex = comboBoxResolution.Items.Count - 1; - } - - if (_lineHeights != null && _lineHeights.Count > 0) - { - numericUpDownLineSpacing.Value = _lineHeights.First().Value; - } - else if (Math.Abs(_subtitleFontSize - Configuration.Settings.Tools.ExportLastFontSize) < 0.01 && Configuration.Settings.Tools.ExportLastLineHeight >= numericUpDownLineSpacing.Minimum && - Configuration.Settings.Tools.ExportLastLineHeight <= numericUpDownLineSpacing.Maximum && Configuration.Settings.Tools.ExportLastLineHeight > 0) - { - numericUpDownLineSpacing.Value = Configuration.Settings.Tools.ExportLastLineHeight; - } - else - { - var lineHeight = (int)Math.Round(GetFontHeight() * 0.64f); - if (lineHeight >= numericUpDownLineSpacing.Minimum && - lineHeight <= numericUpDownLineSpacing.Maximum) - { - numericUpDownLineSpacing.Value = lineHeight; - } - } - - if (Configuration.Settings.Tools.ExportLastBorderWidth >= 0 && Configuration.Settings.Tools.ExportLastBorderWidth < comboBoxBorderWidth.Items.Count) - { - try - { - comboBoxBorderWidth.SelectedIndex = Configuration.Settings.Tools.ExportLastBorderWidth; - } - catch - { - // ignore error - } - } - _borderWidth = GetBorderWidth(); - checkBoxBold.Checked = Configuration.Settings.Tools.ExportLastFontBold; - _subtitleFontBold = Configuration.Settings.Tools.ExportLastFontBold; - - if (Configuration.Settings.Tools.Export3DType >= 0 && Configuration.Settings.Tools.Export3DType < comboBox3D.Items.Count) - { - comboBox3D.SelectedIndex = Configuration.Settings.Tools.Export3DType; - } - - if (Configuration.Settings.Tools.Export3DDepth >= numericUpDownDepth3D.Minimum && Configuration.Settings.Tools.Export3DDepth <= numericUpDownDepth3D.Maximum) - { - numericUpDownDepth3D.Value = Configuration.Settings.Tools.Export3DDepth; - } - - if (Configuration.Settings.Tools.ExportHorizontalAlignment >= 0 && Configuration.Settings.Tools.ExportHorizontalAlignment < comboBoxHAlign.Items.Count) - { - comboBoxHAlign.SelectedIndex = Configuration.Settings.Tools.ExportHorizontalAlignment; - } - - if (exportType == ExportFormats.DCinemaInterop || exportType == ExportFormats.DCinemaSmpte2014) - { - comboBox3D.Visible = false; - numericUpDownDepth3D.Enabled = true; - labelDepth.Enabled = true; - labelDepth.Text = Configuration.Settings.Language.DCinemaProperties.ZPosition; - } - - if (_exportType == ExportFormats.Fcp) - { - comboBoxResolution.Items.Clear(); - comboBoxResolution.Items.Add("NTSC-601"); - comboBoxResolution.Items.Add("PAL-601"); - comboBoxResolution.Items.Add("square"); - comboBoxResolution.Items.Add("DVCPROHD-720P"); - comboBoxResolution.Items.Add("HD-(960x720)"); - comboBoxResolution.Items.Add("DVCPROHD-1080i60"); - comboBoxResolution.Items.Add("HD-(1280x1080)"); - comboBoxResolution.Items.Add("FullHD 1920x1080"); - comboBoxResolution.Items.Add("DVCPROHD-1080i50"); - comboBoxResolution.Items.Add("HD-(1440x1080)"); - comboBoxResolution.SelectedIndex = 7; // FullHD - if (_exportType == ExportFormats.Fcp && !string.IsNullOrEmpty(Configuration.Settings.Tools.ExportFcpVideoResolution)) - { - SetResolution(Configuration.Settings.Tools.ExportFcpVideoResolution); - } - - buttonCustomResolution.Visible = true; // we still allow for custom resolutions - - labelLanguage.Text = "NTSC/PAL"; - comboBoxLanguage.Items.Clear(); - comboBoxLanguage.Items.Add("PAL"); - comboBoxLanguage.Items.Add("NTSC"); - comboBoxLanguage.SelectedIndex = 0; - comboBoxLanguage.Visible = true; - labelLanguage.Visible = true; - if (Configuration.Settings.Tools.ExportFcpPalNtsc == "NTSC") - { - comboBoxLanguage.SelectedIndex = 1; - } - } - - comboBoxShadowWidth.SelectedIndex = 0; - bool shadowVisible = _exportType == ExportFormats.BdnXml || _exportType == ExportFormats.BluraySup || _exportType == ExportFormats.Dost || _exportType == ExportFormats.ImageFrame || _exportType == ExportFormats.Fcp || _exportType == ExportFormats.DCinemaInterop || exportType == ExportFormats.DCinemaSmpte2014 || _exportType == ExportFormats.Edl || _exportType == ExportFormats.EdlClipName; - labelShadowWidth.Visible = shadowVisible; - buttonShadowColor.Visible = shadowVisible; - comboBoxShadowWidth.Visible = shadowVisible; - if (shadowVisible && Configuration.Settings.Tools.ExportBluRayShadow < comboBoxShadowWidth.Items.Count) - { - comboBoxShadowWidth.SelectedIndex = Configuration.Settings.Tools.ExportBluRayShadow; - } - - panelShadowColor.Visible = shadowVisible; - labelShadowTransparency.Visible = shadowVisible; - numericUpDownShadowTransparency.Visible = shadowVisible; - - - if (checkBoxSimpleRender.Enabled) - { - checkBoxSimpleRender.Checked = Configuration.Settings.Tools.ExportVobSubSimpleRendering || _language == "ar"; - } - - if (exportType == ExportFormats.BluraySup || exportType == ExportFormats.VobSub || exportType == ExportFormats.BdnXml) - { - subtitleListView1.CheckBoxes = true; - subtitleListView1.Columns.Insert(0, Configuration.Settings.Language.ExportPngXml.Forced); - SubtitleListView1Fill(_subtitle); - if (_vobSubOcr != null) - { - for (int index = 0; index < _subtitle.Paragraphs.Count; index++) - { - if (_vobSubOcr.GetIsForced(index)) - { - subtitleListView1.Items[index].Checked = true; - } - } - } - - SubtitleListView1SelectIndexAndEnsureVisible(0); - } - else - { - SubtitleListView1Fill(_subtitle); - SubtitleListView1SelectIndexAndEnsureVisible(0); - } - } - - private float GetFontHeight() - { - var mbp = new MakeBitmapParameter - { - SubtitleFontName = _subtitleFontName, - SubtitleFontSize = float.Parse(comboBoxSubtitleFontSize.SelectedItem.ToString()), - SubtitleFontBold = _subtitleFontBold - }; - var fontSize = (float)TextDraw.GetFontSize(mbp.SubtitleFontSize); - using (var font = GetFont(mbp, fontSize)) - using (var bmp = new Bitmap(100, 100)) - using (var g = Graphics.FromImage(bmp)) - { - var textSize = g.MeasureString("Hj!", font); - return textSize.Height; - } - } - - private void CalculateHeights(Subtitle subtitle) - { - foreach (var paragraph in subtitle.Paragraphs) - { - var styleName = paragraph.Extra; - if (!string.IsNullOrEmpty(paragraph.Extra) && !_lineHeights.ContainsKey(styleName)) - { - var style = AdvancedSubStationAlpha.GetSsaStyle(paragraph.Extra, subtitle.Header); - using (var bmp = new Bitmap(100, 100)) - { - using (var g = Graphics.FromImage(bmp)) - { - var mbp = new MakeBitmapParameter - { - SubtitleFontName = style.FontName, - SubtitleFontSize = style.FontSize, - SubtitleFontBold = style.Bold - }; - var fontSize = (float)TextDraw.GetFontSize(mbp.SubtitleFontSize); - Font font = GetFont(mbp, fontSize); - SizeF textSize = g.MeasureString("Hj!", font); - int lineHeight = (int)Math.Round(textSize.Height * 0.64f); - if (fontSize < 30) - { - lineHeight = (int)Math.Round(textSize.Height * 0.69f); - } - - _lineHeights.Add(styleName, lineHeight); - } - } - } - } - } - - private void InitBorderStyle() - { - comboBoxBorderWidth.Items.Clear(); - comboBoxBorderWidth.Items.Add(Configuration.Settings.Language.ExportPngXml.BorderStyleBoxForEachLine); - comboBoxBorderWidth.Items.Add(Configuration.Settings.Language.ExportPngXml.BorderStyleOneBox); - for (int i = 0; i < 16; i++) - { - comboBoxBorderWidth.Items.Add(string.Format(Configuration.Settings.Language.ExportPngXml.BorderStyleNormalWidthX, i)); - } - comboBoxBorderWidth.SelectedIndex = 4; - } - - private void SetLastFrameRate(double lastFrameRate) - { - for (int i = 0; i < comboBoxFrameRate.Items.Count; i++) - { - if (double.TryParse(comboBoxFrameRate.Items[i].ToString().Replace(',', '.').Replace(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, "."), NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var d)) - { - if (Math.Abs(lastFrameRate - d) < 0.01) - { - comboBoxFrameRate.SelectedIndex = i; - return; - } - } - } - } - - internal void SetResolution(Point resolution) - { - comboBoxResolution.Items.Add(resolution.X + "x" + resolution.Y); - comboBoxResolution.SelectedIndex = comboBoxResolution.Items.Count - 1; - } - - internal void InitializeFromVobSubOcr(Subtitle subtitle, SubtitleFormat format, string exportType, string fileName, IBinaryParagraphList vobSubOcr, string languageString) - { - _vobSubOcr = vobSubOcr; - if (_vobSubOcr != null && exportType != ExportFormats.VobSub) - { - comboBoxResizePercentage.Items.Clear(); - for (int i = 50; i < 400; i++) - { - comboBoxResizePercentage.Items.Add(i + "%"); - } - comboBoxResizePercentage.Items.Add("500%"); - comboBoxResizePercentage.SelectedIndex = 50; - comboBoxResizePercentage.Visible = true; - labelResize.Visible = true; - labelResize.Left = buttonColor.Left; - labelResize.Top = buttonColor.Top; - comboBoxResizePercentage.Left = labelResize.Left + labelResize.Width + 5; - comboBoxResizePercentage.Top = labelResize.Top - 4; - } - else - { - comboBoxResizePercentage.Visible = false; - labelResize.Visible = false; - } - - Initialize(subtitle, format, exportType, fileName, null, _videoFileName); - - //set language - if (!string.IsNullOrEmpty(languageString)) - { - if (languageString.Contains('(') && languageString[0] != '(') - { - languageString = languageString.Substring(0, languageString.IndexOf('(') - 1).Trim(); - } - - for (int i = 0; i < comboBoxLanguage.Items.Count; i++) - { - string l = comboBoxLanguage.Items[i].ToString(); - if (l == languageString) - { - comboBoxLanguage.SelectedIndex = i; - break; - } - } - } - - //Disable options not available when exporting existing images - comboBoxSubtitleFont.Enabled = false; - comboBoxSubtitleFontSize.Enabled = false; - - buttonColor.Visible = false; - panelColor.Visible = false; - checkBoxBold.Visible = false; - checkBoxSimpleRender.Visible = false; - comboBox3D.Enabled = false; - numericUpDownDepth3D.Enabled = false; - - buttonBorderColor.Visible = false; - panelBorderColor.Visible = false; - labelBorderWidth.Visible = false; - comboBoxBorderWidth.Visible = false; - - buttonShadowColor.Visible = false; - panelShadowColor.Visible = false; - labelShadowWidth.Visible = false; - comboBoxShadowWidth.Visible = false; - labelShadowTransparency.Visible = false; - numericUpDownShadowTransparency.Visible = false; - labelLineHeight.Visible = false; - numericUpDownLineSpacing.Visible = false; - } - - private void subtitleListView1_SelectedIndexChanged(object sender, EventArgs e) - { - if (_isLoading) - { - return; - } - - _previewTimer.Stop(); - UpdateLineSpacing(); - _previewTimer.Start(); - } - - internal int GetBottomMarginInPixels(Paragraph p) - { - if (!_allowCustomBottomMargin) - { - return 20; - } - - if (!string.IsNullOrEmpty(p?.Extra) && (_formatName == AdvancedSubStationAlpha.NameOfFormat || _formatName == SubStationAlpha.NameOfFormat)) - { - var style = AdvancedSubStationAlpha.GetSsaStyle(p.Extra, _subtitle.Header); - return style.MarginVertical; - } - - var s = comboBoxBottomMargin.Text; - if (comboBoxBottomMarginUnit.SelectedIndex == 0) // % - { - GetResolution(out _, out var height); - return (int)Math.Round(int.Parse(s.TrimEnd('%')) / 100.0 * height); - } - - // pixels - return int.Parse(s); - } - - private int GetLeftMarginInPixels(Paragraph p) - { - if (!string.IsNullOrEmpty(p?.Extra) && (_formatName == AdvancedSubStationAlpha.NameOfFormat || _formatName == SubStationAlpha.NameOfFormat)) - { - var style = AdvancedSubStationAlpha.GetSsaStyle(p.Extra, _subtitle.Header); - return style.MarginLeft; - } - - var s = comboBoxLeftRightMargin.Text; - if (comboBoxLeftRightMarginUnit.SelectedIndex == 0) // % - { - GetResolution(out var width, out _); - return (int)Math.Round(int.Parse(s) / 100.0 * width); - } - - // pixels - return int.Parse(s); - } - - private int GetRightMarginInPixels(Paragraph p) - { - if (!string.IsNullOrEmpty(p?.Extra) && (_formatName == AdvancedSubStationAlpha.NameOfFormat || _formatName == SubStationAlpha.NameOfFormat)) - { - var style = AdvancedSubStationAlpha.GetSsaStyle(p.Extra, _subtitle.Header); - return style.MarginRight; - } - return GetLeftMarginInPixels(p); - } - - - - private void GeneratePreview() - { - SetupImageParameters(); - if (subtitleListView1.SelectedItems.Count > 0) - { - var p = _subtitle.GetParagraphOrDefault(subtitleListView1.SelectedItems[0].Index); - if (p == null) - { - return; - } - var bmp = GenerateImageFromTextWithStyle(p, out var mbp); - if (checkBoxFullFrameImage.Checked) - { - var nbmp = new NikseBitmap(bmp); - nbmp.ReplaceTransparentWith(panelFullFrameBackground.BackColor); - bmp.Dispose(); - bmp = nbmp.GetBitmap(); - } - else - { - groupBoxExportImage.BackColor = DefaultBackColor; - } - pictureBox1.Image = bmp; - - int w = groupBoxExportImage.Width - 4; - pictureBox1.Width = bmp.Width; - pictureBox1.Height = bmp.Height; - pictureBox1.Top = groupBoxExportImage.Height - bmp.Height - GetBottomMarginInPixels(p); - pictureBox1.Left = (w - bmp.Width) / 2; - var alignment = GetAlignmentFromParagraph(mbp, _format, _subtitle); - - // fix alignment from UI - if (comboBoxHAlign.Visible && alignment == ContentAlignment.BottomCenter && _format.GetType() != typeof(AdvancedSubStationAlpha) && _format.GetType() != typeof(SubStationAlpha)) - { - if (comboBoxHAlign.SelectedIndex == 0) - { - alignment = ContentAlignment.BottomLeft; - } - else if (comboBoxHAlign.SelectedIndex == 2) - { - alignment = ContentAlignment.BottomRight; - } - } - - if (comboBoxHAlign.Visible) - { - if (comboBoxLeftRightMargin.Visible) - { - if (alignment == ContentAlignment.BottomLeft || alignment == ContentAlignment.MiddleLeft || alignment == ContentAlignment.TopLeft) - { - pictureBox1.Left = GetLeftMarginInPixels(p); - } - else if (alignment == ContentAlignment.BottomRight || alignment == ContentAlignment.MiddleRight || alignment == ContentAlignment.TopRight) - { - pictureBox1.Left = w - bmp.Width - GetRightMarginInPixels(p); - } - } - - if (alignment == ContentAlignment.MiddleLeft || alignment == ContentAlignment.MiddleCenter || alignment == ContentAlignment.MiddleRight) - { - pictureBox1.Top = (groupBoxExportImage.Height - 4 - bmp.Height) / 2; - } - else if (_allowCustomBottomMargin && alignment == ContentAlignment.TopLeft || alignment == ContentAlignment.TopCenter || alignment == ContentAlignment.TopRight) - { - pictureBox1.Top = GetBottomMarginInPixels(p); - } - } - if (bmp.Width > groupBoxExportImage.Width + 20 || bmp.Height > groupBoxExportImage.Height + 20) - { - pictureBox1.Left = 5; - pictureBox1.Top = 20; - pictureBox1.Width = groupBoxExportImage.Width - 10; - pictureBox1.Height = groupBoxExportImage.Height - 30; - pictureBox1.SizeMode = PictureBoxSizeMode.Zoom; - } - else - { - pictureBox1.SizeMode = PictureBoxSizeMode.Normal; - } - groupBoxExportImage.Text = $"{bmp.Width}x{bmp.Height}"; - if (!string.IsNullOrEmpty(mbp.Error)) - { - groupBoxExportImage.BackColor = Color.Red; - groupBoxExportImage.Text = groupBoxExportImage.Text + " - " + mbp.Error; - } - else - { - if (checkBoxFullFrameImage.Checked) - { - groupBoxExportImage.BackColor = panelFullFrameBackground.BackColor; - } - else - { - groupBoxExportImage.BackColor = groupBoxImageSettings.BackColor; - } - } - } - } - - private void buttonColor_Click(object sender, EventArgs e) - { - bool showAlpha = _exportType == ExportFormats.Fab || _exportType == ExportFormats.BdnXml; - using (var colorChooser = new ColorChooser { Color = panelColor.BackColor, ShowAlpha = showAlpha }) - { - if (colorChooser.ShowDialog() == DialogResult.OK) - { - panelColor.BackColor = colorChooser.Color; - subtitleListView1_SelectedIndexChanged(null, null); - } - } - } - - private void panelColor_MouseClick(object sender, MouseEventArgs e) - { - buttonColor_Click(null, null); - } - - private void buttonBorderColor_Click(object sender, EventArgs e) - { - using (var colorChooser = new ColorChooser { Color = panelBorderColor.BackColor }) - { - if (colorChooser.ShowDialog() == DialogResult.OK) - { - panelBorderColor.BackColor = colorChooser.Color; - subtitleListView1_SelectedIndexChanged(null, null); - } - } - } - - private void panelBorderColor_MouseClick(object sender, MouseEventArgs e) - { - buttonBorderColor_Click(null, null); - } - - private void comboBoxSubtitleFont_SelectedValueChanged(object sender, EventArgs e) - { - subtitleListView1_SelectedIndexChanged(null, null); - } - - private void comboBoxSubtitleFontSize_SelectedIndexChanged(object sender, EventArgs e) - { - if (_isLoading) - { - return; - } - - if (_formatName != AdvancedSubStationAlpha.NameOfFormat && _formatName != SubStationAlpha.NameOfFormat && - comboBoxSubtitleFontSize.Enabled) - { - var lineHeight = (int)Math.Round(GetFontHeight() * 0.64f); - if (lineHeight >= numericUpDownLineSpacing.Minimum && - lineHeight <= numericUpDownLineSpacing.Maximum) - { - numericUpDownLineSpacing.Value = lineHeight; - } - } - subtitleListView1_SelectedIndexChanged(null, null); - } - - private void UpdateLineSpacing() - { - var style = string.Empty; - if (subtitleListView1.SelectedIndices.Count > 0) - { - style = GetStyleName(_subtitle.Paragraphs[subtitleListView1.SelectedItems[0].Index]); - if (!string.IsNullOrEmpty(style) && _lineHeights.ContainsKey(style)) - { - numericUpDownLineSpacing.Value = _lineHeights[style]; - } - } - labelLineHeightStyle.Text = style; - } - - private void comboBoxBorderWidth_SelectedIndexChanged(object sender, EventArgs e) - { - subtitleListView1_SelectedIndexChanged(null, null); - } - - private void checkBoxAntiAlias_CheckedChanged(object sender, EventArgs e) - { - subtitleListView1_SelectedIndexChanged(null, null); - } - - private void ExportPngXml_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - else if (e.KeyCode == UiUtil.HelpKeys) - { - Utilities.ShowHelp("#export"); - e.SuppressKeyPress = true; - } - else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.G && subtitleListView1.Items.Count > 1) - { - using (var goToLine = new GoToLine()) - { - goToLine.Initialize(1, subtitleListView1.Items.Count); - if (goToLine.ShowDialog(this) == DialogResult.OK) - { - subtitleListView1.Items[goToLine.LineNumber - 1].Selected = true; - subtitleListView1.Items[goToLine.LineNumber - 1].EnsureVisible(); - subtitleListView1.Items[goToLine.LineNumber - 1].Focused = true; - } - } - } - } - - private void ExportPngXml_Shown(object sender, EventArgs e) - { - _isLoading = false; - subtitleListView1_SelectedIndexChanged(null, null); - } - - private void comboBoxHAlign_SelectedIndexChanged(object sender, EventArgs e) - { - subtitleListView1_SelectedIndexChanged(null, null); - } - - private void checkBoxBold_CheckedChanged(object sender, EventArgs e) - { - subtitleListView1_SelectedIndexChanged(null, null); - } - - private void buttonCustomResolution_Click(object sender, EventArgs e) - { - using (var cr = new ChooseResolution()) - { - if (cr.ShowDialog(this) == DialogResult.OK) - { - comboBoxResolution.Items[comboBoxResolution.Items.Count - 1] = cr.VideoWidth + "x" + cr.VideoHeight; - comboBoxResolution.SelectedIndex = comboBoxResolution.Items.Count - 1; - } - } - } - - private void ExportPngXml_ResizeEnd(object sender, EventArgs e) - { - subtitleListView1_SelectedIndexChanged(null, null); - subtitleListView1.Columns[subtitleListView1.Columns.Count - 1].Width = -2; - } - - private void comboBoxBottomMargin_SelectedIndexChanged(object sender, EventArgs e) - { - subtitleListView1_SelectedIndexChanged(null, null); - } - - private void comboBoxResolution_SelectedIndexChanged(object sender, EventArgs e) - { - subtitleListView1_SelectedIndexChanged(null, null); - } - - private void ExportPngXml_SizeChanged(object sender, EventArgs e) - { - subtitleListView1_SelectedIndexChanged(null, null); - subtitleListView1.Columns[subtitleListView1.Columns.Count - 1].Width = -2; - } - - private void ExportPngXml_FormClosing(object sender, FormClosingEventArgs e) - { - GetResolution(out var width, out var height); - string res = $"{width}x{height}"; - - if (_exportType == ExportFormats.VobSub) - { - Configuration.Settings.Tools.ExportVobSubFontName = _subtitleFontName; - Configuration.Settings.Tools.ExportVobSubFontSize = (int)_subtitleFontSize; - Configuration.Settings.Tools.ExportVobSubVideoResolution = res; - Configuration.Settings.Tools.ExportVobSubLanguage = comboBoxLanguage.Text; - Configuration.Settings.Tools.ExportVobAntiAliasingWithTransparency = checkBoxTransAntiAliase.Checked; - } - else if (_exportType == ExportFormats.BluraySup || _exportType == ExportFormats.Dost) - { - Configuration.Settings.Tools.ExportBluRayFontName = _subtitleFontName; - Configuration.Settings.Tools.ExportBluRayFontSize = (int)_subtitleFontSize; - Configuration.Settings.Tools.ExportBluRayVideoResolution = res; - } - else if (_exportType == ExportFormats.BdnXml || _exportType == ExportFormats.Fcp) - { - Configuration.Settings.Tools.ExportBdnXmlImageType = comboBoxImageFormat.SelectedItem.ToString(); - } - if (_exportType == ExportFormats.Fcp) - { - Configuration.Settings.Tools.ExportFcpFontName = _subtitleFontName; - Configuration.Settings.Tools.ExportFcpFontSize = (int)_subtitleFontSize; - if (comboBoxImageFormat.SelectedItem != null) - { - Configuration.Settings.Tools.ExportFcpImageType = comboBoxImageFormat.SelectedItem.ToString(); - } - - Configuration.Settings.Tools.ExportFcpVideoResolution = res; - Configuration.Settings.Tools.ExportFcpPalNtsc = comboBoxLanguage.SelectedIndex == 0 ? "PAL" : "NTSC"; - } - Configuration.Settings.Tools.ExportFcpFullPathUrl = checkBoxFcpFullPathUrl.Checked; - Configuration.Settings.Tools.ExportLastShadowTransparency = (int)numericUpDownShadowTransparency.Value; - Configuration.Settings.Tools.ExportLastFrameRate = FrameRate; - Configuration.Settings.Tools.ExportFullFrame = checkBoxFullFrameImage.Checked; - Configuration.Settings.Tools.ExportShadowColor = panelShadowColor.BackColor; - Configuration.Settings.Tools.ExportFontColor = _subtitleColor; - Configuration.Settings.Tools.ExportBorderColor = _borderColor; - - if (checkBoxSimpleRender.Enabled) - { - Configuration.Settings.Tools.ExportVobSubSimpleRendering = checkBoxSimpleRender.Checked; - } - - if (_exportType == ExportFormats.BluraySup) - { - if (comboBoxBottomMarginUnit.SelectedIndex == 0) // % - { - Configuration.Settings.Tools.ExportBluRayBottomMarginPercent = comboBoxBottomMargin.SelectedIndex; - } - else // pixels - { - Configuration.Settings.Tools.ExportBluRayBottomMarginPixels = comboBoxBottomMargin.SelectedIndex; - } - } - else if (_allowCustomBottomMargin) - { - if (comboBoxBottomMarginUnit.SelectedIndex == 0) // % - { - Configuration.Settings.Tools.ExportBottomMarginPercent = comboBoxBottomMargin.SelectedIndex; - } - else // pixels - { - Configuration.Settings.Tools.ExportBottomMarginPixels = comboBoxBottomMargin.SelectedIndex; - } - } - - if (comboBoxLeftRightMargin.Visible) - { - if (comboBoxLeftRightMarginUnit.SelectedIndex == 0) // % - { - Configuration.Settings.Tools.ExportLeftRightMarginPercent = comboBoxLeftRightMargin.SelectedIndex; - } - else // pixels - { - Configuration.Settings.Tools.ExportLeftRightMarginPixels = comboBoxLeftRightMargin.SelectedIndex; - } - } - - if (comboBoxBottomMarginUnit.Visible) - { - Configuration.Settings.Tools.ExportBottomMarginUnit = comboBoxBottomMarginUnit.SelectedIndex == 0 ? "%" : "px"; - } - - if (comboBoxLeftRightMarginUnit.Visible) - { - Configuration.Settings.Tools.ExportLeftRightMarginUnit = comboBoxLeftRightMarginUnit.SelectedIndex == 0 ? "%" : "px"; - } - - Configuration.Settings.Tools.ExportHorizontalAlignment = comboBoxHAlign.SelectedIndex; - Configuration.Settings.Tools.Export3DType = comboBox3D.SelectedIndex; - Configuration.Settings.Tools.Export3DDepth = (int)numericUpDownDepth3D.Value; - - if (comboBoxShadowWidth.Visible) - { - Configuration.Settings.Tools.ExportBluRayShadow = comboBoxShadowWidth.SelectedIndex; - } - - Configuration.Settings.Tools.ExportFontNameOther = _subtitleFontName; - Configuration.Settings.Tools.ExportLastFontSize = (int)_subtitleFontSize; - Configuration.Settings.Tools.ExportLastLineHeight = (int)numericUpDownLineSpacing.Value; - Configuration.Settings.Tools.ExportLastBorderWidth = comboBoxBorderWidth.SelectedIndex; - Configuration.Settings.Tools.ExportLastFontBold = checkBoxBold.Checked; - } - - private void numericUpDownDepth3D_ValueChanged(object sender, EventArgs e) - { - if (!timerPreview.Enabled) - { - timerPreview.Start(); - } - } - - private void comboBox3D_SelectedIndexChanged(object sender, EventArgs e) - { - bool enable = comboBox3D.SelectedIndex > 0; - labelDepth.Enabled = enable; - numericUpDownDepth3D.Enabled = enable; - subtitleListView1_SelectedIndexChanged(null, null); - } - - private void timerPreview_Tick(object sender, EventArgs e) - { - timerPreview.Stop(); - subtitleListView1_SelectedIndexChanged(null, null); - } - - private void saveImageAsToolStripMenuItem_Click(object sender, EventArgs e) - { - if (subtitleListView1.SelectedItems.Count != 1) - { - return; - } - - int selectedIndex = subtitleListView1.SelectedItems[0].Index; - - saveFileDialog1.Title = Configuration.Settings.Language.VobSubOcr.SaveSubtitleImageAs; - saveFileDialog1.AddExtension = true; - saveFileDialog1.FileName = "Image" + selectedIndex; - saveFileDialog1.Filter = "PNG image|*.png|BMP image|*.bmp|GIF image|*.gif|TIFF image|*.tiff"; - saveFileDialog1.FilterIndex = 0; - - DialogResult result = saveFileDialog1.ShowDialog(this); - if (result == DialogResult.OK) - { - var bmp = pictureBox1.Image as Bitmap; - if (bmp == null) - { - MessageBox.Show("No image!"); - return; - } - - try - { - if (saveFileDialog1.FilterIndex == 0) - { - bmp.Save(saveFileDialog1.FileName, ImageFormat.Png); - } - else if (saveFileDialog1.FilterIndex == 1) - { - bmp.Save(saveFileDialog1.FileName); - } - else if (saveFileDialog1.FilterIndex == 2) - { - bmp.Save(saveFileDialog1.FileName, ImageFormat.Gif); - } - else - { - bmp.Save(saveFileDialog1.FileName, ImageFormat.Tiff); - } - } - catch (Exception exception) - { - MessageBox.Show(exception.Message); - } - } - } - - private void buttonShadowColor_Click(object sender, EventArgs e) - { - using (var colorChooser = new ColorChooser { Color = panelShadowColor.BackColor }) - { - if (colorChooser.ShowDialog() == DialogResult.OK) - { - panelShadowColor.BackColor = colorChooser.Color; - subtitleListView1_SelectedIndexChanged(null, null); - numericUpDownShadowTransparency.Value = colorChooser.Color.A; - } - } - } - - private void panelShadowColor_MouseClick(object sender, MouseEventArgs e) - { - buttonShadowColor_Click(sender, e); - } - - private void comboBoxShadowWidth_SelectedIndexChanged(object sender, EventArgs e) - { - subtitleListView1_SelectedIndexChanged(null, null); - } - - private void numericUpDownShadowTransparency_ValueChanged(object sender, EventArgs e) - { - subtitleListView1_SelectedIndexChanged(null, null); - } - - private void comboBoxSubtitleFont_SelectedIndexChanged(object sender, EventArgs e) - { - if (_isLoading) - { - return; - } - - if (_formatName == AdvancedSubStationAlpha.NameOfFormat || _formatName == SubStationAlpha.NameOfFormat) - { - return; - } - - var lineHeight = (int)Math.Round(GetFontHeight() * 0.64f); - if (lineHeight >= numericUpDownLineSpacing.Minimum && - lineHeight <= numericUpDownLineSpacing.Maximum) - { - numericUpDownLineSpacing.ValueChanged -= numericUpDownLineSpacing_ValueChanged; - numericUpDownLineSpacing.Value = lineHeight; - numericUpDownLineSpacing.ValueChanged += numericUpDownLineSpacing_ValueChanged; - } - subtitleListView1_SelectedIndexChanged(null, null); - - // change font - if (!comboBoxSubtitleFont.Enabled) - { - return; - } - try - { - var fontName = comboBoxSubtitleFont.SelectedItem.ToString(); - int columnIndexText = 4; - if (subtitleListView1.CheckBoxes) - { - columnIndexText++; - } - - for (int i = 0; i < _subtitle.Paragraphs.Count; i++) - { - - subtitleListView1.Items[i].SubItems[columnIndexText].Font = new Font(fontName, Font.Size); - } - } - catch - { - // ignore unable to set font errors - } - } - - private void numericUpDownLineSpacing_ValueChanged(object sender, EventArgs e) - { - var value = (int)numericUpDownLineSpacing.Value; - var style = string.Empty; - if (subtitleListView1.SelectedIndices.Count > 0) - { - style = GetStyleName(_subtitle.Paragraphs[subtitleListView1.SelectedItems[0].Index]); - } - - if (_lineHeights.ContainsKey(style)) - { - _lineHeights[style] = value; - } - - if (_formatName != AdvancedSubStationAlpha.NameOfFormat && _formatName != SubStationAlpha.NameOfFormat) - { - _lineHeights.Clear(); - _lineHeights.Add(string.Empty, value); - } - subtitleListView1_SelectedIndexChanged(null, null); - } - - private static string GetStyleName(Paragraph paragraph) - { - if ((_formatName == AdvancedSubStationAlpha.NameOfFormat || _formatName == SubStationAlpha.NameOfFormat) && !string.IsNullOrEmpty(paragraph.Extra)) - { - return paragraph.Extra; - } - return string.Empty; - } - - private void ListViewToggleTag(string tag) - { - if (_subtitle.Paragraphs.Count > 0 && subtitleListView1.SelectedItems.Count > 0) - { - var indexes = new List(); - foreach (ListViewItem item in subtitleListView1.SelectedItems) - { - indexes.Add(item.Index); - } - - subtitleListView1.BeginUpdate(); - foreach (int i in indexes) - { - if (tag == BoxMultiLineText) - { - _subtitle.Paragraphs[i].Text = _subtitle.Paragraphs[i].Text.Replace("<" + BoxSingleLineText + ">", string.Empty).Replace("", string.Empty); - } - else if (tag == BoxSingleLineText) - { - _subtitle.Paragraphs[i].Text = _subtitle.Paragraphs[i].Text.Replace("<" + BoxMultiLineText + ">", string.Empty).Replace("", string.Empty); - } - - if (_subtitle.Paragraphs[i].Text.Contains("<" + tag + ">")) - { - _subtitle.Paragraphs[i].Text = _subtitle.Paragraphs[i].Text.Replace("<" + tag + ">", string.Empty); - _subtitle.Paragraphs[i].Text = _subtitle.Paragraphs[i].Text.Replace("", string.Empty); - } - else - { - int indexOfEndBracket = _subtitle.Paragraphs[i].Text.IndexOf('}'); - if (_subtitle.Paragraphs[i].Text.StartsWith("{\\", StringComparison.Ordinal) && indexOfEndBracket > 1 && indexOfEndBracket < 6) - { - _subtitle.Paragraphs[i].Text = string.Format("{2}<{0}>{1}", tag, _subtitle.Paragraphs[i].Text.Remove(0, indexOfEndBracket + 1), _subtitle.Paragraphs[i].Text.Substring(0, indexOfEndBracket + 1)); - } - else - { - _subtitle.Paragraphs[i].Text = string.Format("<{0}>{1}", tag, _subtitle.Paragraphs[i].Text); - } - } - SubtitleListView1SetText(i, _subtitle.Paragraphs[i].Text); - } - subtitleListView1.EndUpdate(); - } - } - - private void boxMultiLineToolStripMenuItem_Click(object sender, EventArgs e) - { - ListViewToggleTag(BoxMultiLineText); - subtitleListView1_SelectedIndexChanged(null, null); - } - - private void boxSingleLineToolStripMenuItem_Click(object sender, EventArgs e) - { - ListViewToggleTag(BoxSingleLineText); - subtitleListView1_SelectedIndexChanged(null, null); - } - - private void italicToolStripMenuItem_Click(object sender, EventArgs e) - { - ListViewToggleTag("i"); - subtitleListView1_SelectedIndexChanged(null, null); - } - - private void normalToolStripMenuItem_Click(object sender, EventArgs e) - { - if (_subtitle.Paragraphs.Count > 0 && subtitleListView1.SelectedItems.Count > 0) - { - bool isSsa = _format.Name == SubStationAlpha.NameOfFormat || - _format.Name == AdvancedSubStationAlpha.NameOfFormat; - - foreach (ListViewItem item in subtitleListView1.SelectedItems) - { - Paragraph p = _subtitle.GetParagraphOrDefault(item.Index); - if (p != null) - { - int indexOfEndBracket = p.Text.IndexOf('}'); - if (p.Text.StartsWith("{\\", StringComparison.Ordinal) && indexOfEndBracket > 1 && indexOfEndBracket < 6) - { - p.Text = p.Text.Remove(0, indexOfEndBracket + 1); - } - - p.Text = HtmlUtil.RemoveHtmlTags(p.Text); - p.Text = p.Text.Replace("<" + BoxSingleLineText + ">", string.Empty).Replace("", string.Empty); - p.Text = p.Text.Replace("<" + BoxMultiLineText + ">", string.Empty).Replace("", string.Empty); - - if (isSsa) - { - p.Text = Utilities.RemoveSsaTags(p.Text); - } - - SubtitleListView1SetText(item.Index, p.Text); - } - } - } - subtitleListView1_SelectedIndexChanged(null, null); - } - - private void subtitleListView1_KeyDown(object sender, KeyEventArgs e) - { - var italicShortCut = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainTextBoxItalic); - if (e.KeyData == italicShortCut) - { - ListViewToggleTag("i"); - subtitleListView1_SelectedIndexChanged(null, null); - } - else if (e.KeyCode == Keys.A && e.Modifiers == Keys.Control) - { - subtitleListView1.SelectAll(); - e.SuppressKeyPress = true; - } - else if (e.KeyCode == Keys.D && e.Modifiers == Keys.Control) - { - subtitleListView1.SelectFirstSelectedItemOnly(); - e.SuppressKeyPress = true; - } - else if (e.KeyCode == Keys.I && e.Modifiers == (Keys.Control | Keys.Shift)) - { - subtitleListView1.InverseSelection(); - e.SuppressKeyPress = true; - } - } - - public void SubtitleListView1SelectNone() - { - foreach (ListViewItem item in subtitleListView1.SelectedItems) - { - item.Selected = false; - } - } - - private void SubtitleListView1SelectIndexAndEnsureVisible(int index) - { - if (index < 0 || index >= subtitleListView1.Items.Count || subtitleListView1.Items.Count == 0) - { - return; - } - - if (subtitleListView1.TopItem == null) - { - return; - } - - int bottomIndex = subtitleListView1.TopItem.Index + (Height - 25) / 16; - int itemsBeforeAfterCount = (bottomIndex - subtitleListView1.TopItem.Index) / 2 - 1; - if (itemsBeforeAfterCount < 0) - { - itemsBeforeAfterCount = 1; - } - - int beforeIndex = index - itemsBeforeAfterCount; - if (beforeIndex < 0) - { - beforeIndex = 0; - } - - int afterIndex = index + itemsBeforeAfterCount; - if (afterIndex >= subtitleListView1.Items.Count) - { - afterIndex = subtitleListView1.Items.Count - 1; - } - - SubtitleListView1SelectNone(); - if (subtitleListView1.TopItem.Index <= beforeIndex && bottomIndex > afterIndex) - { - subtitleListView1.Items[index].Selected = true; - subtitleListView1.Items[index].EnsureVisible(); - return; - } - - subtitleListView1.Items[beforeIndex].EnsureVisible(); - subtitleListView1.EnsureVisible(beforeIndex); - subtitleListView1.Items[afterIndex].EnsureVisible(); - subtitleListView1.EnsureVisible(afterIndex); - subtitleListView1.Items[index].Selected = true; - subtitleListView1.Items[index].EnsureVisible(); - } - - private void SubtitleListView1Add(Paragraph paragraph) - { - var item = new ListViewItem(paragraph.Number.ToString(CultureInfo.InvariantCulture)) { Tag = paragraph, UseItemStyleForSubItems = false }; - ListViewItem.ListViewSubItem subItem; - - if (subtitleListView1.CheckBoxes) - { - item.Text = string.Empty; - subItem = new ListViewItem.ListViewSubItem(item, paragraph.Number.ToString(CultureInfo.InvariantCulture)) { Tag = paragraph }; - item.SubItems.Add(subItem); - } - - subItem = new ListViewItem.ListViewSubItem(item, paragraph.StartTime.ToDisplayString()); - item.SubItems.Add(subItem); - - subItem = new ListViewItem.ListViewSubItem(item, paragraph.EndTime.ToDisplayString()); - item.SubItems.Add(subItem); - - subItem = new ListViewItem.ListViewSubItem(item, paragraph.Duration.ToShortDisplayString()); - item.SubItems.Add(subItem); - - subItem = new ListViewItem.ListViewSubItem(item, UiUtil.GetListViewTextFromString(paragraph.Text)); - try - { - if (_formatName == AdvancedSubStationAlpha.NameOfFormat || _formatName == SubStationAlpha.NameOfFormat) - { - var style = AdvancedSubStationAlpha.GetSsaStyle(paragraph.Extra, _subtitle.Header); - subItem.Font = new Font(style.FontName, Font.Size); - } - else - { - subItem.Font = new Font(_subtitleFontName, Font.Size); - } - } - catch - { - subItem.Font = new Font(_subtitleFontName, Font.Size, FontStyle.Bold); - } - item.SubItems.Add(subItem); - - if (_formatName == AdvancedSubStationAlpha.NameOfFormat || _formatName == SubStationAlpha.NameOfFormat) - { - subItem = new ListViewItem.ListViewSubItem(item, paragraph.Extra); - item.SubItems.Add(subItem); - } - - subtitleListView1.Items.Add(item); - } - - private void SubtitleListView1Fill(Subtitle subtitle) - { - subtitleListView1.BeginUpdate(); - subtitleListView1.Items.Clear(); - foreach (Paragraph paragraph in subtitle.Paragraphs) - { - SubtitleListView1Add(paragraph); - } - subtitleListView1.EndUpdate(); - } - - private void SubtitleListView1AutoSizeAllColumns() - { - int columnIndexNumber = 0; - int columnIndexStart = 1; - int columnIndexEnd = 2; - int columnIndexDuration = 3; - int columnIndexText = 4; - int columnIndexStyle = 5; - - if (subtitleListView1.CheckBoxes) - { - subtitleListView1.Columns[0].Width = 60; - columnIndexNumber++; - columnIndexStart++; - columnIndexEnd++; - columnIndexDuration++; - columnIndexText++; - } - - var settings = Configuration.Settings; - if (settings != null && settings.General.ListViewColumnsRememberSize && settings.General.ListViewNumberWidth > 1) - { - subtitleListView1.Columns[columnIndexNumber].Width = settings.General.ListViewNumberWidth; - } - else - { - subtitleListView1.Columns[columnIndexNumber].Width = 55; - } - - subtitleListView1.Columns[columnIndexStart].Width = 90; - subtitleListView1.Columns[columnIndexEnd].Width = 90; - subtitleListView1.Columns[columnIndexDuration].Width = 60; - if (_formatName == AdvancedSubStationAlpha.NameOfFormat || _formatName == SubStationAlpha.NameOfFormat) - { - subtitleListView1.Columns.Add("style", Configuration.Settings.Language.General.Style, 90); - subtitleListView1.Columns[columnIndexText].Width = subtitleListView1.Width - - subtitleListView1.Columns[columnIndexNumber].Width - - subtitleListView1.Columns[columnIndexStart].Width - - subtitleListView1.Columns[columnIndexEnd].Width - - subtitleListView1.Columns[columnIndexDuration].Width - - 175; - subtitleListView1.Columns[columnIndexStyle].Width = -2; - } - else - { - subtitleListView1.Columns[columnIndexText].Width = -2; - } - } - - private void SubtitleListView1InitializeLanguage(LanguageStructure.General general, Core.Common.Settings settings) - { - int columnIndexNumber = 0; - int columnIndexStart = 1; - int columnIndexEnd = 2; - int columnIndexDuration = 3; - int columnIndexText = 4; - - if (subtitleListView1.CheckBoxes) - { - columnIndexNumber++; - columnIndexStart++; - columnIndexEnd++; - columnIndexDuration++; - columnIndexText++; - } - - subtitleListView1.Columns[columnIndexNumber].Text = general.NumberSymbol; - subtitleListView1.Columns[columnIndexStart].Text = general.StartTime; - subtitleListView1.Columns[columnIndexEnd].Text = general.EndTime; - subtitleListView1.Columns[columnIndexDuration].Text = general.Duration; - subtitleListView1.Columns[columnIndexText].Text = general.Text; - subtitleListView1.ForeColor = settings.General.SubtitleFontColor; - subtitleListView1.BackColor = settings.General.SubtitleBackgroundColor; - } - - private void SubtitleListView1SetText(int index, string text) - { - int columnIndexText = 4; - - if (subtitleListView1.CheckBoxes) - { - columnIndexText++; - } - - subtitleListView1.Items[index].SubItems[columnIndexText].Text = UiUtil.GetListViewTextFromString(text); - } - - private void FillPreviewBackground(Bitmap bmp, Graphics g, Paragraph p) - { - try - { - if (!string.IsNullOrWhiteSpace(_videoFileName) && LibVlcDynamic.IsInstalled) - { - using (var vlc = new LibVlcDynamic()) - { - vlc.Initialize(panelVlcTemp, _videoFileName, null, null); - Application.DoEvents(); - vlc.Volume = 0; - vlc.Pause(); - vlc.CurrentPosition = p.StartTime.TotalSeconds; - Application.DoEvents(); - var fileName = FileUtil.GetTempFileName(".bmp"); - vlc.TakeSnapshot(fileName, (uint)bmp.Width, (uint)bmp.Height); - Application.DoEvents(); - Thread.Sleep(200); - using (var tempBmp = new Bitmap(fileName)) - { - g.DrawImageUnscaled(tempBmp, new Point(0, 0)); - } - } - return; - } - } - catch - { - // Was unable to grap screenshot via vlc - } - - // Draw background with generated image - var rect = new Rectangle(0, 0, bmp.Width - 1, bmp.Height - 1); - using (var br = new LinearGradientBrush(rect, Color.Black, Color.Black, 0, false)) - { - var cb = new ColorBlend - { - Positions = new[] { 0, 1 / 6f, 2 / 6f, 3 / 6f, 4 / 6f, 5 / 6f, 1 }, - Colors = new[] { Color.Black, Color.Black, Color.White, Color.Black, Color.Black, Color.White, Color.Black } - }; - br.InterpolationColors = cb; - br.RotateTransform(0); - g.FillRectangle(br, rect); - } - } - - private void linkLabelPreview_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) - { - linkLabelPreview.Enabled = false; - Cursor = Cursors.WaitCursor; - try - { - GetResolution(out var width, out var height); - using (var bmp = new Bitmap(width, height)) - { - using (var g = Graphics.FromImage(bmp)) - { - var p = _subtitle.Paragraphs[subtitleListView1.SelectedItems[0].Index]; - FillPreviewBackground(bmp, g, p); - - var nBmp = new NikseBitmap(pictureBox1.Image as Bitmap); - nBmp.CropSidesAndBottom(100, Color.Transparent, true); - using (var textBmp = nBmp.GetBitmap()) - { - var bp = MakeMakeBitmapParameter(subtitleListView1.SelectedItems[0].Index, width, height); - var alignment = GetAlignmentFromParagraph(bp, _format, _subtitle); - if (comboBoxHAlign.Visible && alignment == ContentAlignment.BottomCenter && _format.GetType() != typeof(AdvancedSubStationAlpha) && _format.GetType() != typeof(SubStationAlpha)) - { - if (comboBoxHAlign.SelectedIndex == 0) - { - alignment = ContentAlignment.BottomLeft; - } - else if (comboBoxHAlign.SelectedIndex == 2) - { - alignment = ContentAlignment.BottomRight; - } - } - - int x = (bmp.Width - textBmp.Width) / 2; - if (alignment == ContentAlignment.BottomLeft || alignment == ContentAlignment.MiddleLeft || alignment == ContentAlignment.TopLeft) - { - x = GetBottomMarginInPixels(p); - } - else if (alignment == ContentAlignment.BottomRight || alignment == ContentAlignment.MiddleRight || alignment == ContentAlignment.TopRight) - { - x = bmp.Width - textBmp.Width - GetBottomMarginInPixels(p); - } - - int y = bmp.Height - textBmp.Height - GetBottomMarginInPixels(p); - if (alignment == ContentAlignment.BottomLeft || alignment == ContentAlignment.MiddleLeft || alignment == ContentAlignment.TopLeft) - { - x = GetBottomMarginInPixels(p); - } - else if (alignment == ContentAlignment.BottomRight || alignment == ContentAlignment.MiddleRight || alignment == ContentAlignment.TopRight) - { - x = bmp.Width - textBmp.Width - GetBottomMarginInPixels(p); - } - - if (alignment == ContentAlignment.MiddleLeft || alignment == ContentAlignment.MiddleCenter || alignment == ContentAlignment.MiddleRight) - { - y = (groupBoxExportImage.Height - 4 - textBmp.Height) / 2; - } - else if (alignment == ContentAlignment.TopLeft || alignment == ContentAlignment.TopCenter || alignment == ContentAlignment.TopRight) - { - y = GetBottomMarginInPixels(p); - } - - g.DrawImageUnscaled(textBmp, new Point(x, y)); - } - } - - using (var form = new ExportPngXmlPreview(bmp)) - { - Cursor = Cursors.Default; - form.ShowDialog(this); - } - } - } - finally - { - Cursor = Cursors.Default; - linkLabelPreview.Enabled = true; - } - } - - private void comboBoxLeftRightMargin_SelectedIndexChanged(object sender, EventArgs e) - { - subtitleListView1_SelectedIndexChanged(null, null); - } - - private void panelFullFrameBackground_Click(object sender, EventArgs e) - { - using (var colorChooser = new ColorChooser { Color = panelFullFrameBackground.BackColor, Text = Configuration.Settings.Language.ExportPngXml.ChooseBackgroundColor }) - { - if (colorChooser.ShowDialog() == DialogResult.OK) - { - panelFullFrameBackground.BackColor = colorChooser.Color; - subtitleListView1_SelectedIndexChanged(null, null); - } - } - } - - private void checkBoxFullFrameImage_CheckedChanged(object sender, EventArgs e) - { - subtitleListView1_SelectedIndexChanged(null, null); - panelFullFrameBackground.Visible = checkBoxFullFrameImage.Checked; - if (_exportType == ExportFormats.BluraySup || _exportType == ExportFormats.VobSub || _exportType == ExportFormats.ImageFrame || _exportType == ExportFormats.BdnXml || _exportType == ExportFormats.Dost || _exportType == ExportFormats.Fab || _exportType == ExportFormats.Edl || _exportType == ExportFormats.EdlClipName) - { - return; - } - _allowCustomBottomMargin = checkBoxFullFrameImage.Checked; - comboBoxBottomMargin.Visible = checkBoxFullFrameImage.Checked; - labelBottomMargin.Visible = checkBoxFullFrameImage.Checked; - comboBoxBottomMarginUnit.Visible = checkBoxFullFrameImage.Checked; - } - - public void DisableSaveButtonAndCheckBoxes() - { - buttonExport.Visible = false; - subtitleListView1.CheckBoxes = false; - } - - private void comboBoxBottomMarginUnit_SelectedIndexChanged(object sender, EventArgs e) - { - comboBoxBottomMargin.BeginUpdate(); - comboBoxBottomMargin.Items.Clear(); - if (comboBoxBottomMarginUnit.SelectedIndex == 0) - { - for (int i = 0; i <= 95; i++) - { - comboBoxBottomMargin.Items.Add(i); - } - - var exportMarginPercent = _exportType == ExportFormats.BluraySup ? Configuration.Settings.Tools.ExportBluRayBottomMarginPercent : Configuration.Settings.Tools.ExportBottomMarginPercent; - if (exportMarginPercent >= 0 && exportMarginPercent < comboBoxBottomMargin.Items.Count) - { - comboBoxBottomMargin.SelectedIndex = exportMarginPercent; - } - } - else - { - for (int i = 0; i <= 1000; i++) - { - comboBoxBottomMargin.Items.Add(i); - } - - var exportMarginPixels = _exportType == ExportFormats.BluraySup ? Configuration.Settings.Tools.ExportBluRayBottomMarginPixels : Configuration.Settings.Tools.ExportBottomMarginPixels; - if (exportMarginPixels >= 0 && exportMarginPixels < comboBoxBottomMargin.Items.Count) - { - comboBoxBottomMargin.SelectedIndex = exportMarginPixels; - } - } - if (comboBoxBottomMargin.SelectedIndex == -1) - { - comboBoxBottomMargin.SelectedIndex = 0; - } - comboBoxBottomMargin.EndUpdate(); - } - - private void comboBoxLeftRightMarginUnit_SelectedIndexChanged(object sender, EventArgs e) - { - comboBoxLeftRightMargin.BeginUpdate(); - comboBoxLeftRightMargin.Items.Clear(); - if (comboBoxLeftRightMarginUnit.SelectedIndex == 0) - { - for (int i = 0; i < 95; i++) - { - comboBoxLeftRightMargin.Items.Add(i); - } - - if (Configuration.Settings.Tools.ExportLeftRightMarginPercent >= 0 && Configuration.Settings.Tools.ExportLeftRightMarginPercent < comboBoxLeftRightMargin.Items.Count) - { - comboBoxLeftRightMargin.SelectedIndex = Configuration.Settings.Tools.ExportLeftRightMarginPercent; - } - } - else - { - for (int i = 0; i <= 1000; i++) - { - comboBoxLeftRightMargin.Items.Add(i); - } - - if (Configuration.Settings.Tools.ExportLeftRightMarginPixels >= 0 && Configuration.Settings.Tools.ExportLeftRightMarginPixels < comboBoxLeftRightMargin.Items.Count) - { - comboBoxLeftRightMargin.SelectedIndex = Configuration.Settings.Tools.ExportLeftRightMarginPixels; - } - } - if (comboBoxLeftRightMargin.SelectedIndex == -1) - { - comboBoxLeftRightMargin.SelectedIndex = 0; - } - comboBoxLeftRightMargin.EndUpdate(); - } - - private void numericUpDownLineSpacing_KeyUp(object sender, KeyEventArgs e) - { - _previewTimer.Start(); - } - - public static Bitmap ResizeBitmap(Bitmap b, int width, int height) - { - Bitmap newImage = new Bitmap(width, height); - using (var g = Graphics.FromImage(newImage)) - { - g.SmoothingMode = SmoothingMode.HighQuality; - g.InterpolationMode = InterpolationMode.HighQualityBicubic; - g.PixelOffsetMode = PixelOffsetMode.HighQuality; - g.DrawImage(b, new Rectangle(0, 0, width, height)); - } - return newImage; - } - - private void comboBoxResizePercentage_SelectedIndexChanged(object sender, EventArgs e) - { - subtitleListView1_SelectedIndexChanged(null, null); - } - - private void adjustTimeCodesToolStripMenuItem_Click(object sender, EventArgs e) - { - using (var showEarlierOrLater = new ShowEarlierLater()) - { - showEarlierOrLater.Initialize(ShowEarlierOrLater, false); - showEarlierOrLater.ShowDialog(this); - } - } - - public void ShowEarlierOrLater(double adjustMilliseconds, SelectionChoice selection) - { - adjustMilliseconds /= TimeCode.BaseUnit; - subtitleListView1.BeginUpdate(); - int startFrom = 0; - if (selection == SelectionChoice.SelectionAndForward) - { - if (subtitleListView1.SelectedItems.Count > 0) - { - startFrom = subtitleListView1.SelectedItems[0].Index; - } - else - { - startFrom = _subtitle.Paragraphs.Count; - } - } - for (int i = startFrom; i < _subtitle.Paragraphs.Count; i++) - { - switch (selection) - { - case SelectionChoice.SelectionOnly: - if (subtitleListView1.Items[i].Selected) - { - _subtitle.Paragraphs[i].Adjust(1.0, adjustMilliseconds); - ShowTimeInListView(i); - } - break; - case SelectionChoice.AllLines: - case SelectionChoice.SelectionAndForward: - _subtitle.Paragraphs[i].Adjust(1.0, adjustMilliseconds); - ShowTimeInListView(i); - break; - } - } - subtitleListView1.EndUpdate(); - } - - private void ShowTimeInListView(int index) - { - int startIndex = 1; - if (subtitleListView1.CheckBoxes) - { - startIndex++; - } - subtitleListView1.Items[index].SubItems[startIndex].Text = _subtitle.Paragraphs[index].StartTime.ToDisplayString(); - subtitleListView1.Items[index].SubItems[startIndex + 1].Text = _subtitle.Paragraphs[index].EndTime.ToDisplayString(); - subtitleListView1.Items[index].SubItems[startIndex + 2].Text = _subtitle.Paragraphs[index].Duration.ToShortDisplayString(); - } - - private void contextMenuStripListView_Opening(object sender, System.ComponentModel.CancelEventArgs e) - { - bool showImageExportMenuItems = _vobSubOcr != null; - toolStripSeparatorAdjust.Visible = showImageExportMenuItems; - adjustTimeCodesToolStripMenuItem.Visible = showImageExportMenuItems; - adjustDisplayTimeToolStripMenuItem.Visible = showImageExportMenuItems; - } - - private void adjustDisplayTimeToolStripMenuItem_Click(object sender, EventArgs e) - { - using (var adjustDisplayTime = new AdjustDisplayDuration()) - { - adjustDisplayTime.HideRecalculate(); - if (adjustDisplayTime.ShowDialog(this) == DialogResult.OK) - { - if (adjustDisplayTime.AdjustUsingPercent) - { - double percent = double.Parse(adjustDisplayTime.AdjustValue, CultureInfo.InvariantCulture); - _subtitle.AdjustDisplayTimeUsingPercent(percent, null); - } - else if (adjustDisplayTime.AdjustUsingSeconds) - { - double seconds = double.Parse(adjustDisplayTime.AdjustValue, CultureInfo.InvariantCulture); - _subtitle.AdjustDisplayTimeUsingSeconds(seconds, null); - } - else if (adjustDisplayTime.AdjustUsingRecalc) - { - double maxCharSeconds = (double)(adjustDisplayTime.MaxCharactersPerSecond); - _subtitle.RecalculateDisplayTimes(maxCharSeconds, null, (double)adjustDisplayTime.OptimalCharactersPerSecond); - } - else // fixed duration - { - _subtitle.SetFixedDuration(null, adjustDisplayTime.FixedMilliseconds); - } - } - } - subtitleListView1.BeginUpdate(); - for (int i = 0; i < _subtitle.Paragraphs.Count; i++) - { - ShowTimeInListView(i); - } - subtitleListView1.EndUpdate(); - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.BluRaySup; +using Nikse.SubtitleEdit.Core.Enums; +using Nikse.SubtitleEdit.Core.Interfaces; +using Nikse.SubtitleEdit.Core.SubtitleFormats; +using Nikse.SubtitleEdit.Core.VobSub; +using Nikse.SubtitleEdit.Logic; +using Nikse.SubtitleEdit.Logic.VideoPlayers; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Drawing.Imaging; +using System.Drawing.Text; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading; +using System.Windows.Forms; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class ExportPngXml : PositionAndSizeForm + { + internal class ExportFormats + { + internal const string BluraySup = "BLURAYSUP"; + internal const string VobSub = "VOBSUB"; + internal const string Fab = "FAB"; + internal const string Stl = "STL"; + internal const string Fcp = "FCP"; + internal const string Dost = "DOSTIMAGE"; + internal const string DCinemaInterop = "DCINEMA_INTEROP"; + internal const string DCinemaSmpte2014 = "DCINEMA_SMPTE_2014"; + internal const string BdnXml = "BDNXML"; + internal const string Edl = "EDL"; + internal const string EdlClipName = "EDL_CLIPNAME"; + internal const string ImageFrame = "IMAGE/FRAME"; + internal const string Spumux = "SPUMUX"; + } + + internal class MakeBitmapParameter + { + public Bitmap Bitmap { get; set; } + public Paragraph P { get; set; } + public string Type { get; set; } + public Color SubtitleColor { get; set; } + public string SubtitleFontName { get; set; } + public float SubtitleFontSize { get; set; } + public bool SubtitleFontBold { get; set; } + public Color BorderColor { get; set; } + public float BorderWidth { get; set; } + public bool BoxSingleLine { get; set; } + public bool SimpleRendering { get; set; } + public bool AlignLeft { get; set; } + public bool AlignRight { get; set; } + public bool JustifyLeft { get; set; } + public bool JustifyTop { get; set; } + public bool JustifyRight { get; set; } + public byte[] Buffer { get; set; } + public int ScreenWidth { get; set; } + public int ScreenHeight { get; set; } + public string VideoResolution { get; set; } + public int Type3D { get; set; } + public int Depth3D { get; set; } + public double FramesPerSeconds { get; set; } + public int BottomMargin { get; set; } + public int LeftMargin { get; set; } + public int RightMargin { get; set; } + public bool Saved { get; set; } + public ContentAlignment Alignment { get; set; } + public Point? OverridePosition { get; set; } + public Color BackgroundColor { get; set; } + public string SavDialogFileName { get; set; } + public string Error { get; set; } + public string LineJoin { get; set; } + public Color ShadowColor { get; set; } + public float ShadowWidth { get; set; } + public int ShadowAlpha { get; set; } + public Dictionary LineHeight { get; set; } + public bool Forced { get; set; } + public bool FullFrame { get; set; } + public Color FullFrameBackgroundColor { get; set; } + + public MakeBitmapParameter() + { + BackgroundColor = Color.Transparent; + } + } + + private Subtitle _subtitle; + private SubtitleFormat _format; + private static string _formatName; + private Color _subtitleColor; + private string _subtitleFontName = "Verdana"; + private float _subtitleFontSize = 25.0f; + private bool _subtitleFontBold; + private Color _borderColor; + private float _borderWidth = 2.0f; + private bool _isLoading = true; + private string _language = "en"; + private string _exportType = ExportFormats.BdnXml; + private string _fileName; + private string _outputFileName; + private IBinaryParagraphList _vobSubOcr; + private readonly System.Windows.Forms.Timer _previewTimer = new System.Windows.Forms.Timer(); + private string _videoFileName; + private readonly Dictionary _lineHeights; + private static int _boxBorderSize = 8; + + private const string BoxMultiLineText = "BoxMultiLine"; + private const string BoxSingleLineText = "BoxSingleLine"; + + public string GetOutputFileName() + { + return _outputFileName; + } + + public ExportPngXml() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + var toolTip = new ToolTip { ShowAlways = true }; + toolTip.SetToolTip(panelFullFrameBackground, Configuration.Settings.Language.ExportPngXml.ChooseBackgroundColor); + _lineHeights = new Dictionary(); + comboBoxImageFormat.SelectedIndex = 4; + _subtitleColor = Color.FromArgb(byte.MaxValue, Configuration.Settings.Tools.ExportFontColor); + _borderColor = Configuration.Settings.Tools.ExportBorderColor; + _boxBorderSize = Configuration.Settings.Tools.ExportBoxBorderSize; + _previewTimer.Tick += previewTimer_Tick; + _previewTimer.Interval = 100; + labelLineHeightStyle.Text = string.Empty; + } + + private void previewTimer_Tick(object sender, EventArgs e) + { + _previewTimer.Stop(); + GeneratePreview(); + } + + private double FrameRate + { + get + { + if (comboBoxFrameRate.SelectedItem == null) + { + return 25; + } + + string s = comboBoxFrameRate.SelectedItem.ToString(); + s = s.Replace(",", ".").Replace(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, ".").Trim(); + if (double.TryParse(s, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var d)) + { + return d; + } + + return 25; + } + } + + private int MillisecondsToFramesMaxFrameRate(double milliseconds) + { + int frames = (int)Math.Round(milliseconds / (TimeCode.BaseUnit / FrameRate)); + if (frames >= FrameRate) + { + frames = (int)(FrameRate - 0.01); + } + + return frames; + } + + private string ToHHMMSSFF(TimeCode timeCode) + { + return $"{timeCode.Hours:00}:{timeCode.Minutes:00}:{timeCode.Seconds:00}:{MillisecondsToFramesMaxFrameRate(timeCode.Milliseconds):00}"; + } + + private static ContentAlignment GetAlignmentFromParagraph(MakeBitmapParameter p, SubtitleFormat format, Subtitle subtitle) + { + var alignment = ContentAlignment.BottomCenter; + if (p.AlignLeft) + { + alignment = ContentAlignment.BottomLeft; + } + else if (p.AlignRight) + { + alignment = ContentAlignment.BottomRight; + } + + if (format.HasStyleSupport && !string.IsNullOrEmpty(p.P.Extra)) + { + if (format.GetType() == typeof(SubStationAlpha)) + { + var style = AdvancedSubStationAlpha.GetSsaStyle(p.P.Extra, subtitle.Header); + alignment = GetSsaAlignment("{\\a" + style.Alignment + "}", alignment); + } + else if (format.GetType() == typeof(AdvancedSubStationAlpha)) + { + var style = AdvancedSubStationAlpha.GetSsaStyle(p.P.Extra, subtitle.Header); + alignment = GetAssAlignment("{\\an" + style.Alignment + "}", alignment); + } + } + + string text = p.P.Text; + if (format.GetType() == typeof(SubStationAlpha) && text.Length > 5) + { + text = p.P.Text.Substring(0, 6); + alignment = GetSsaAlignment(text, alignment); + } + else if (text.Length > 6) + { + text = p.P.Text.Substring(0, 6); + alignment = GetAssAlignment(text, alignment); + } + return alignment; + } + + private static ContentAlignment GetSsaAlignment(string text, ContentAlignment defaultAlignment) + { + //1: Bottom left + //2: Bottom center + //3: Bottom right + //9: Middle left + //10: Middle center + //11: Middle right + //5: Top left + //6: Top center + //7: Top right + switch (text) + { + case "{\\a1}": + return ContentAlignment.BottomLeft; + case "{\\a2}": + return ContentAlignment.BottomCenter; + case "{\\a3}": + return ContentAlignment.BottomRight; + case "{\\a9}": + return ContentAlignment.MiddleLeft; + case "{\\a10}": + return ContentAlignment.MiddleCenter; + case "{\\a11}": + return ContentAlignment.MiddleRight; + case "{\\a5}": + return ContentAlignment.TopLeft; + case "{\\a6}": + return ContentAlignment.TopCenter; + case "{\\a7}": + return ContentAlignment.TopRight; + } + return defaultAlignment; + } + + private static ContentAlignment GetAssAlignment(string text, ContentAlignment defaultAlignment) + { + //1: Bottom left + //2: Bottom center + //3: Bottom right + //4: Middle left + //5: Middle center + //6: Middle right + //7: Top left + //8: Top center + //9: Top right + switch (text) + { + case "{\\an1}": + return ContentAlignment.BottomLeft; + case "{\\an2}": + return ContentAlignment.BottomCenter; + case "{\\an3}": + return ContentAlignment.BottomRight; + case "{\\an4}": + return ContentAlignment.MiddleLeft; + case "{\\an5}": + return ContentAlignment.MiddleCenter; + case "{\\an6}": + return ContentAlignment.MiddleRight; + case "{\\an7}": + return ContentAlignment.TopLeft; + case "{\\an8}": + return ContentAlignment.TopCenter; + case "{\\an9}": + return ContentAlignment.TopRight; + } + return defaultAlignment; + } + + public static void DoWork(object data) + { + var parameter = (MakeBitmapParameter)data; + + parameter.LineJoin = Configuration.Settings.Tools.ExportPenLineJoin; + parameter.Bitmap = GenerateImageFromTextWithStyle(parameter); + if (parameter.Type == ExportFormats.BluraySup) + { + MakeBluRaySupImage(parameter); + } + } + + internal static void MakeBluRaySupImage(MakeBitmapParameter param) + { + var brSub = new BluRaySupPicture + { + StartTime = (long)param.P.StartTime.TotalMilliseconds, + EndTime = (long)param.P.EndTime.TotalMilliseconds, + Width = param.ScreenWidth, + Height = param.ScreenHeight, + IsForced = param.Forced, + CompositionNumber = param.P.Number * 2 + }; + if (param.FullFrame) + { + var nbmp = new NikseBitmap(param.Bitmap); + nbmp.ReplaceTransparentWith(param.FullFrameBackgroundColor); + using (var bmp = nbmp.GetBitmap()) + { + int top = param.ScreenHeight - (param.Bitmap.Height + param.BottomMargin); + int left = (param.ScreenWidth - param.Bitmap.Width) / 2; + + var b = new NikseBitmap(param.ScreenWidth, param.ScreenHeight); + { + b.Fill(param.FullFrameBackgroundColor); + using (var fullSize = b.GetBitmap()) + { + if (param.Alignment == ContentAlignment.BottomLeft || param.Alignment == ContentAlignment.MiddleLeft || param.Alignment == ContentAlignment.TopLeft) + { + left = param.LeftMargin; + } + else if (param.Alignment == ContentAlignment.BottomRight || param.Alignment == ContentAlignment.MiddleRight || param.Alignment == ContentAlignment.TopRight) + { + left = param.ScreenWidth - param.Bitmap.Width - param.RightMargin; + } + + if (param.Alignment == ContentAlignment.TopLeft || param.Alignment == ContentAlignment.TopCenter || param.Alignment == ContentAlignment.TopRight) + { + top = param.BottomMargin; + } + + if (param.Alignment == ContentAlignment.MiddleLeft || param.Alignment == ContentAlignment.MiddleCenter || param.Alignment == ContentAlignment.MiddleRight) + { + top = param.ScreenHeight - (param.Bitmap.Height / 2); + } + + if (param.OverridePosition != null && + param.OverridePosition.Value.X >= 0 && param.OverridePosition.Value.X < param.ScreenWidth && + param.OverridePosition.Value.Y >= 0 && param.OverridePosition.Value.Y < param.ScreenHeight) + { + left = param.OverridePosition.Value.X; + top = param.OverridePosition.Value.Y; + } + + using (var g = Graphics.FromImage(fullSize)) + { + g.DrawImage(bmp, left, top); + g.Dispose(); + } + param.Buffer = BluRaySupPicture.CreateSupFrame(brSub, fullSize, param.FramesPerSeconds, 0, 0, ContentAlignment.BottomCenter); + } + } + } + } + else + { + if (param.OverridePosition != null && + param.OverridePosition.Value.X >= 0 && param.OverridePosition.Value.X < param.ScreenWidth && + param.OverridePosition.Value.Y >= 0 && param.OverridePosition.Value.Y < param.ScreenHeight) + { + param.LeftMargin = param.OverridePosition.Value.X; + param.BottomMargin = param.ScreenHeight - param.OverridePosition.Value.Y - param.Bitmap.Height; + } + + var margin = (param.Alignment == ContentAlignment.TopRight || + param.Alignment == ContentAlignment.MiddleRight || + param.Alignment == ContentAlignment.BottomRight) + ? param.RightMargin + : param.LeftMargin; + + param.Buffer = BluRaySupPicture.CreateSupFrame(brSub, param.Bitmap, param.FramesPerSeconds, param.BottomMargin, margin, param.Alignment, param.OverridePosition); + } + } + + internal MakeBitmapParameter MakeMakeBitmapParameter(int index, int screenWidth, int screenHeight) + { + var p = _subtitle.GetParagraphOrDefault(index); + var parameter = new MakeBitmapParameter + { + Type = _exportType, + SubtitleColor = _subtitleColor, + SubtitleFontName = _subtitleFontName, + SubtitleFontSize = _subtitleFontSize, + SubtitleFontBold = _subtitleFontBold, + BorderColor = _borderColor, + BorderWidth = _borderWidth, + SimpleRendering = checkBoxSimpleRender.Checked, + AlignLeft = comboBoxHAlign.SelectedIndex == 0, + AlignRight = comboBoxHAlign.SelectedIndex == 2, + JustifyLeft = GetJustifyLeft(p.Text), // center, left justify + JustifyTop = comboBoxHAlign.SelectedIndex == 4, // center, top justify + JustifyRight = comboBoxHAlign.SelectedIndex == 5, // center, right justify + ScreenWidth = screenWidth, + ScreenHeight = screenHeight, + VideoResolution = comboBoxResolution.Text, + Bitmap = null, + FramesPerSeconds = FrameRate, + BottomMargin = GetBottomMarginInPixels(p), + LeftMargin = GetLeftMarginInPixels(p), + RightMargin = GetRightMarginInPixels(p), + Saved = false, + Alignment = ContentAlignment.BottomCenter, + Type3D = comboBox3D.SelectedIndex, + Depth3D = (int)numericUpDownDepth3D.Value, + BackgroundColor = Color.Transparent, + SavDialogFileName = saveFileDialog1.FileName, + ShadowColor = panelShadowColor.BackColor, + ShadowWidth = GetShadowWidth(), + ShadowAlpha = (int)numericUpDownShadowTransparency.Value, + LineHeight = _lineHeights, + FullFrame = checkBoxFullFrameImage.Checked, + FullFrameBackgroundColor = panelFullFrameBackground.BackColor, + }; + if (index < _subtitle.Paragraphs.Count) + { + parameter.P = _subtitle.Paragraphs[index]; + parameter.Alignment = GetAlignmentFromParagraph(parameter, _format, _subtitle); + parameter.OverridePosition = GetAssPoint(parameter.P.Text); + parameter.Forced = subtitleListView1.Items[index].Checked; + + if (_format.HasStyleSupport && !string.IsNullOrEmpty(parameter.P.Extra)) + { + if (_format.GetType() == typeof(SubStationAlpha)) + { + var style = AdvancedSubStationAlpha.GetSsaStyle(parameter.P.Extra, _subtitle.Header); + parameter.SubtitleColor = style.Primary; + parameter.SubtitleFontBold = style.Bold; + parameter.SubtitleFontSize = style.FontSize; + parameter.SubtitleFontName = style.FontName; + parameter.BottomMargin = style.MarginVertical; + if (style.BorderStyle == "3") + { + parameter.BackgroundColor = style.Background; + } + parameter.ShadowColor = style.Outline; + } + else if (_format.GetType() == typeof(AdvancedSubStationAlpha)) + { + var style = AdvancedSubStationAlpha.GetSsaStyle(parameter.P.Extra, _subtitle.Header); + parameter.SubtitleColor = style.Primary; + parameter.SubtitleFontBold = style.Bold; + parameter.SubtitleFontSize = style.FontSize; + parameter.SubtitleFontName = style.FontName; + parameter.BottomMargin = style.MarginVertical; + if (style.BorderStyle == "3") + { + parameter.BackgroundColor = style.Outline; + } + parameter.ShadowAlpha = style.Background.A; + parameter.ShadowColor = style.Background; + } + } + + if (comboBoxBorderWidth.SelectedItem.ToString() == Configuration.Settings.Language.ExportPngXml.BorderStyleBoxForEachLine) + { + parameter.BoxSingleLine = true; + parameter.BackgroundColor = panelBorderColor.BackColor; + parameter.BorderWidth = 0; + } + else if (comboBoxBorderWidth.SelectedItem.ToString() == Configuration.Settings.Language.ExportPngXml.BorderStyleOneBox) + { + parameter.BoxSingleLine = false; + parameter.BackgroundColor = panelBorderColor.BackColor; + parameter.BorderWidth = 0; + } + else + { + _borderWidth = GetBorderWidth(); + } + } + else + { + parameter.P = null; + } + return parameter; + } + + private bool GetJustifyLeft(string text) + { + if (comboBoxHAlign.SelectedIndex == 6 && !string.IsNullOrEmpty(text)) + { + var s = Utilities.RemoveUnneededSpaces(text, _language); + var dialogHelper = new DialogSplitMerge { TwoLetterLanguageCode = _language }; + var lines = s.SplitToLines(); + return dialogHelper.IsDialog(lines) || HasTwoSpeakers(lines); + } + + return comboBoxHAlign.SelectedIndex == 3; + } + + private static bool HasTwoSpeakers(List lines) + { + return lines.Count == 2 && lines[0].HasSentenceEnding() && lines[0].Contains(':') && lines[1].Contains(':'); + } + + private void ButtonExportClick(object sender, EventArgs e) + { + FixStartEndWithSameTimeCode(); + var singleFile = false; + + if (Configuration.Settings.General.CurrentVideoOffsetInMs != 0) + { + _subtitle.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(Configuration.Settings.General.CurrentVideoOffsetInMs)); + } + + var errors = new List(); + buttonExport.Enabled = false; + SetupImageParameters(); + + if (!string.IsNullOrEmpty(_fileName)) + { + saveFileDialog1.FileName = Path.GetFileNameWithoutExtension(_fileName); + } + + if (_exportType == ExportFormats.BluraySup) + { + saveFileDialog1.Title = Configuration.Settings.Language.ExportPngXml.SaveBluRraySupAs; + saveFileDialog1.DefaultExt = "*.sup"; + saveFileDialog1.AddExtension = true; + saveFileDialog1.Filter = "Blu-Ray sup|*.sup"; + singleFile = true; + } + else if (_exportType == ExportFormats.VobSub) + { + saveFileDialog1.Title = Configuration.Settings.Language.ExportPngXml.SaveVobSubAs; + saveFileDialog1.DefaultExt = "*.sub"; + saveFileDialog1.AddExtension = true; + saveFileDialog1.Filter = "VobSub|*.sub"; + singleFile = true; + } + else if (_exportType == ExportFormats.Fab) + { + saveFileDialog1.Title = Configuration.Settings.Language.ExportPngXml.SaveFabImageScriptAs; + saveFileDialog1.DefaultExt = "*.txt"; + saveFileDialog1.AddExtension = true; + saveFileDialog1.Filter = "FAB image scripts|*.txt"; + singleFile = true; + } + else if (_exportType == ExportFormats.Stl) + { + saveFileDialog1.Title = Configuration.Settings.Language.ExportPngXml.SaveDvdStudioProStlAs; + saveFileDialog1.DefaultExt = "*.txt"; + saveFileDialog1.AddExtension = true; + saveFileDialog1.Filter = "DVD Studio Pro STL|*.stl"; + singleFile = true; + } + else if (_exportType == ExportFormats.Fcp) + { + saveFileDialog1.Title = Configuration.Settings.Language.ExportPngXml.SaveFcpAs; + saveFileDialog1.DefaultExt = "*.xml"; + saveFileDialog1.AddExtension = true; + saveFileDialog1.Filter = "Xml files|*.xml"; + singleFile = true; + } + else if (_exportType == ExportFormats.Dost) + { + saveFileDialog1.Title = Configuration.Settings.Language.ExportPngXml.SaveDostAs; + saveFileDialog1.DefaultExt = "*.dost"; + saveFileDialog1.AddExtension = true; + saveFileDialog1.Filter = "Dost files|*.dost"; + singleFile = true; + } + else if (_exportType == ExportFormats.DCinemaInterop) + { + saveFileDialog1.Title = Configuration.Settings.Language.ExportPngXml.SaveDigitalCinemaInteropAs; + saveFileDialog1.DefaultExt = "*.xml"; + saveFileDialog1.AddExtension = true; + saveFileDialog1.Filter = "Xml files|*.xml"; + singleFile = true; + } + else if (_exportType == ExportFormats.DCinemaSmpte2014) + { + saveFileDialog1.Title = Configuration.Settings.Language.ExportPngXml.SaveDigitalCinemaSmpte2014; + saveFileDialog1.DefaultExt = "*.xml"; + saveFileDialog1.AddExtension = true; + saveFileDialog1.Filter = "Xml files|*.xml"; + singleFile = true; + } + else if (_exportType == ExportFormats.Edl || _exportType == ExportFormats.EdlClipName) + { + saveFileDialog1.Title = Configuration.Settings.Language.ExportPngXml.SavePremiereEdlAs; + saveFileDialog1.DefaultExt = "*.edl"; + saveFileDialog1.AddExtension = true; + saveFileDialog1.Filter = "EDL files|*.edl"; + singleFile = true; + } + + if (singleFile && saveFileDialog1.ShowDialog(this) == DialogResult.OK || !singleFile && folderBrowserDialog1.ShowDialog(this) == DialogResult.OK) + { + GetResolution(out var width, out var height); + + _outputFileName = singleFile ? saveFileDialog1.FileName : folderBrowserDialog1.SelectedPath; + + FileStream binarySubtitleFile = null; + VobSubWriter vobSubWriter = null; + Paragraph p = null; + if (subtitleListView1.SelectedItems.Count > 0) + { + p = _subtitle.GetParagraphOrDefault(subtitleListView1.SelectedItems[0].Index); + } + + if (_exportType == ExportFormats.BluraySup) + { + binarySubtitleFile = new FileStream(saveFileDialog1.FileName, FileMode.Create); + } + else if (_exportType == ExportFormats.VobSub) + { + vobSubWriter = new VobSubWriter(saveFileDialog1.FileName, width, height, GetBottomMarginInPixels(p), GetLeftMarginInPixels(p), 32, _subtitleColor, _borderColor, !checkBoxTransAntiAliase.Checked, (DvdSubtitleLanguage)comboBoxLanguage.SelectedItem); + } + + progressBar1.Value = 0; + progressBar1.Maximum = _subtitle.Paragraphs.Count - 1; + progressBar1.Visible = true; + _previewTimer.Tick -= previewTimer_Tick; + + int border = GetBottomMarginInPixels(p); + int imagesSavedCount = 0; + var sb = new StringBuilder(); + if (_exportType == ExportFormats.Stl) + { + sb.AppendLine("$SetFilePathToken =" + folderBrowserDialog1.SelectedPath); + sb.AppendLine(); + } + + if (_vobSubOcr != null) + { + int i = 0; + while (i < _subtitle.Paragraphs.Count) + { + var mp = MakeMakeBitmapParameter(i, width, height); + mp.Bitmap = _vobSubOcr.GetSubtitleBitmap(i++); + var exp = GetResizeScale(); + if (Math.Abs(exp - 1) > 0.01) + { + var resizedBitmap = ResizeBitmap(mp.Bitmap, (int)Math.Round(mp.Bitmap.Width * exp), (int)Math.Round(mp.Bitmap.Height * exp)); + mp.Bitmap.Dispose(); + mp.Bitmap = resizedBitmap; + } + if (_exportType == ExportFormats.BluraySup) + { + MakeBluRaySupImage(mp); + } + imagesSavedCount = WriteParagraph(width, sb, border, height, imagesSavedCount, vobSubWriter, binarySubtitleFile, mp, i); + progressBar1.Refresh(); + Application.DoEvents(); + if (i < progressBar1.Maximum) + { + progressBar1.Value = i; + } + } + } + else + { + var threadEqual = new Thread(DoWork); + var paramEqual = MakeMakeBitmapParameter(0, width, height); + + var threadUnEqual = new Thread(DoWork); + var paramUnEqual = new MakeBitmapParameter(); + if (_subtitle.Paragraphs.Count > 1) + { + MakeMakeBitmapParameter(1, width, height); + } + + threadEqual.Start(paramEqual); + int i = 1; + for (; i < _subtitle.Paragraphs.Count; i++) + { + if (i % 2 == 0) + { + paramEqual = MakeMakeBitmapParameter(i, width, height); + threadEqual = new Thread(DoWork); + threadEqual.Start(paramEqual); + + if (threadUnEqual.ThreadState == ThreadState.Running) + { + threadUnEqual.Join(); + } + + imagesSavedCount = WriteParagraph(width, sb, border, height, imagesSavedCount, vobSubWriter, binarySubtitleFile, paramUnEqual, i); + if (!string.IsNullOrEmpty(paramUnEqual.Error)) + { + errors.Add(paramUnEqual.Error); + } + } + else + { + paramUnEqual = MakeMakeBitmapParameter(i, width, height); + threadUnEqual = new Thread(DoWork); + threadUnEqual.Start(paramUnEqual); + + if (threadEqual.ThreadState == ThreadState.Running) + { + threadEqual.Join(); + } + + imagesSavedCount = WriteParagraph(width, sb, border, height, imagesSavedCount, vobSubWriter, binarySubtitleFile, paramEqual, i); + if (!string.IsNullOrEmpty(paramEqual.Error)) + { + errors.Add(paramEqual.Error); + } + } + progressBar1.Refresh(); + Application.DoEvents(); + progressBar1.Value = i; + } + + if (i % 2 == 0) + { + if (threadEqual.ThreadState == ThreadState.Running) + { + threadEqual.Join(); + } + + imagesSavedCount = WriteParagraph(width, sb, border, height, imagesSavedCount, vobSubWriter, binarySubtitleFile, paramEqual, i); + if (threadUnEqual.ThreadState == ThreadState.Running) + { + threadUnEqual.Join(); + } + + imagesSavedCount = WriteParagraph(width, sb, border, height, imagesSavedCount, vobSubWriter, binarySubtitleFile, paramUnEqual, i); + } + else + { + if (threadUnEqual.ThreadState == ThreadState.Running) + { + threadUnEqual.Join(); + } + + imagesSavedCount = WriteParagraph(width, sb, border, height, imagesSavedCount, vobSubWriter, binarySubtitleFile, paramUnEqual, i); + if (threadEqual.ThreadState == ThreadState.Running) + { + threadEqual.Join(); + } + + imagesSavedCount = WriteParagraph(width, sb, border, height, imagesSavedCount, vobSubWriter, binarySubtitleFile, paramEqual, i); + } + } + + if (errors.Count > 0) + { + var errorSb = new StringBuilder(); + for (int i = 0; i < 20; i++) + { + if (i < errors.Count) + { + errorSb.AppendLine(errors[i]); + } + } + if (errors.Count > 20) + { + errorSb.AppendLine("..."); + } + + MessageBox.Show(string.Format(Configuration.Settings.Language.ExportPngXml.SomeLinesWereTooLongX, errorSb)); + } + + _previewTimer.Tick += previewTimer_Tick; + progressBar1.Visible = false; + if (_exportType == ExportFormats.BluraySup) + { + binarySubtitleFile.Close(); + MessageBox.Show(string.Format(Configuration.Settings.Language.Main.SavedSubtitleX, saveFileDialog1.FileName)); + } + else if (_exportType == ExportFormats.VobSub) + { + vobSubWriter.WriteIdxFile(); + vobSubWriter.Dispose(); + MessageBox.Show(string.Format(Configuration.Settings.Language.Main.SavedSubtitleX, saveFileDialog1.FileName)); + } + else if (_exportType == ExportFormats.Fab) + { + File.WriteAllText(Path.Combine(folderBrowserDialog1.SelectedPath, "Fab_Image_script.txt"), sb.ToString()); + var text = string.Format(Configuration.Settings.Language.ExportPngXml.XImagesSavedInY, imagesSavedCount, folderBrowserDialog1.SelectedPath); + MessageBoxShowWithFolderName(text, folderBrowserDialog1.SelectedPath); + } + else if (_exportType == ExportFormats.ImageFrame) + { + var empty = new Bitmap(width, height); + imagesSavedCount++; + string numberString = $"{imagesSavedCount:00000}"; + string fileName = Path.Combine(folderBrowserDialog1.SelectedPath, numberString + "." + comboBoxImageFormat.Text.ToLowerInvariant()); + SaveImage(empty, fileName, ImageFormat); + var text = string.Format(Configuration.Settings.Language.ExportPngXml.XImagesSavedInY, imagesSavedCount, folderBrowserDialog1.SelectedPath); + MessageBoxShowWithFolderName(text, folderBrowserDialog1.SelectedPath); + } + else if (_exportType == ExportFormats.Stl) + { + File.WriteAllText(Path.Combine(folderBrowserDialog1.SelectedPath, "DVD_Studio_Pro_Image_script.stl"), sb.ToString()); + var text = string.Format(Configuration.Settings.Language.ExportPngXml.XImagesSavedInY, imagesSavedCount, folderBrowserDialog1.SelectedPath); + MessageBoxShowWithFolderName(text, folderBrowserDialog1.SelectedPath); + } + else if (_exportType == ExportFormats.Spumux) + { + string s = "" + Environment.NewLine + + "\t" + Environment.NewLine + + sb + + "\t" + Environment.NewLine + + ""; + File.WriteAllText(Path.Combine(folderBrowserDialog1.SelectedPath, "spu.xml"), s); + var text = string.Format(Configuration.Settings.Language.ExportPngXml.XImagesSavedInY, imagesSavedCount, folderBrowserDialog1.SelectedPath); + MessageBoxShowWithFolderName(text, folderBrowserDialog1.SelectedPath); + } + else if (_exportType == ExportFormats.Fcp) + { + WriteFcpFile(width, height, sb, saveFileDialog1.FileName); + var text = string.Format(Configuration.Settings.Language.ExportPngXml.XImagesSavedInY, imagesSavedCount, Path.GetDirectoryName(saveFileDialog1.FileName)); + MessageBoxShowWithFolderName(text, Path.GetDirectoryName(saveFileDialog1.FileName)); + } + else if (_exportType == ExportFormats.Dost) + { + WriteDostFile(saveFileDialog1.FileName, sb.ToString()); + var text = string.Format(Configuration.Settings.Language.ExportPngXml.XImagesSavedInY, imagesSavedCount, Path.GetDirectoryName(saveFileDialog1.FileName)); + MessageBoxShowWithFolderName(text, Path.GetDirectoryName(saveFileDialog1.FileName)); + } + else if (_exportType == ExportFormats.DCinemaInterop) + { + var doc = new XmlDocument(); + string title = "unknown"; + if (!string.IsNullOrEmpty(_fileName)) + { + title = Path.GetFileNameWithoutExtension(_fileName); + } + + string guid = Guid.NewGuid().ToString().RemoveChar('-').Insert(8, "-").Insert(13, "-").Insert(18, "-").Insert(23, "-"); + doc.LoadXml("" + Environment.NewLine + + "" + Environment.NewLine + + "" + guid + "" + Environment.NewLine + + "" + title + "" + Environment.NewLine + + "1" + Environment.NewLine + + "English" + Environment.NewLine + + sb + + ""); + string fName = saveFileDialog1.FileName; + if (!fName.EndsWith(".xml", StringComparison.OrdinalIgnoreCase)) + { + fName += ".xml"; + } + + File.WriteAllText(fName, SubtitleFormat.ToUtf8XmlString(doc)); + var text = string.Format(Configuration.Settings.Language.ExportPngXml.XImagesSavedInY, imagesSavedCount, Path.GetDirectoryName(fName)); + MessageBoxShowWithFolderName(text, Path.GetDirectoryName(fName)); + } + else if (_exportType == ExportFormats.DCinemaSmpte2014) + { + var doc = new XmlDocument(); + string title = "unknown"; + if (!string.IsNullOrEmpty(_fileName)) + { + title = Path.GetFileNameWithoutExtension(_fileName); + } + + string guid = Guid.NewGuid().ToString().RemoveChar('-').Insert(8, "-").Insert(13, "-").Insert(18, "-").Insert(23, "-"); + string xml = + "" + Environment.NewLine + + " urn:uuid:" + guid + "" + Environment.NewLine + + " " + Environment.NewLine + + " This is a subtitle file" + Environment.NewLine + + " 2014-01-01T00:00:00.000-00:00" + Environment.NewLine + + " 1" + Environment.NewLine + + " en" + Environment.NewLine + + " 25 1" + Environment.NewLine + + " 25" + Environment.NewLine + + " 00:00:00:00 " + Environment.NewLine + + " urn:uuid:3dec6dc0-39d0-498d-97d0-928d2eb78391" + Environment.NewLine + + " " + Environment.NewLine + + sb + + " " + Environment.NewLine + + ""; + + + doc.LoadXml(xml); + string fName = saveFileDialog1.FileName; + if (!fName.EndsWith(".xml", StringComparison.OrdinalIgnoreCase)) + { + fName += ".xml"; + } + + File.WriteAllText(fName, SubtitleFormat.ToUtf8XmlString(doc)); + var text = string.Format(Configuration.Settings.Language.ExportPngXml.XImagesSavedInY, imagesSavedCount, Path.GetDirectoryName(fName)); + MessageBoxShowWithFolderName(text, Path.GetDirectoryName(fName)); + } + else if (_exportType == ExportFormats.Edl || _exportType == ExportFormats.EdlClipName) + { + var title = Path.GetFileNameWithoutExtension(saveFileDialog1.FileName); + if (string.IsNullOrEmpty(title)) + { + title = "( no title )"; + } + + string header = "TITLE: " + title + Environment.NewLine + Environment.NewLine; + File.WriteAllText(saveFileDialog1.FileName, header + sb); + var text = string.Format(Configuration.Settings.Language.ExportPngXml.XImagesSavedInY, imagesSavedCount, Path.GetDirectoryName(saveFileDialog1.FileName)); + MessageBoxShowWithFolderName(text, Path.GetDirectoryName(saveFileDialog1.FileName)); + } + else + { + WriteBdnXmlFile(imagesSavedCount, sb, Path.Combine(folderBrowserDialog1.SelectedPath, "BDN_Index.xml")); + var text = string.Format(Configuration.Settings.Language.ExportPngXml.XImagesSavedInY, imagesSavedCount, folderBrowserDialog1.SelectedPath); + MessageBoxShowWithFolderName(text, folderBrowserDialog1.SelectedPath); + } + } + buttonExport.Enabled = true; + + if (Configuration.Settings.General.CurrentVideoOffsetInMs != 0) + { + _subtitle.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(-Configuration.Settings.General.CurrentVideoOffsetInMs)); + } + } + + private void MessageBoxShowWithFolderName(string text, string folderName) + { + using (var f = new ExportPngXmlDialogOpenFolder(text, folderName)) + { + f.ShowDialog(this); + } + } + + internal void WriteFcpFile(int width, int height, StringBuilder sb, string fileName) + { + string fileNameNoPath = Path.GetFileName(fileName); + string fileNameNoExt = Path.GetFileNameWithoutExtension(fileNameNoPath); + + int duration = 0; + if (_subtitle.Paragraphs.Count > 0) + { + duration = (int)Math.Round(_subtitle.Paragraphs[_subtitle.Paragraphs.Count - 1].EndTime.TotalSeconds * 25.0); + } + + string s = "" + Environment.NewLine + + "" + Environment.NewLine + + "" + Environment.NewLine + + " " + Environment.NewLine + + " add" + Environment.NewLine + + " " + System.Security.SecurityElement.Escape(fileNameNoExt) + @" + " + duration.ToString(CultureInfo.InvariantCulture) + @" + + FALSE + 25 + + + + FALSE + 25 + + 00:00:00:00 + 0 + source + NDF + + 0 + [OUT] + + + + + FALSE + +"; + if (comboBoxFrameRate.Text == "29.97") + { + s = s.Replace("NDF", "DF"); //Non Drop Frame or Drop Frame + s = s.Replace("25", "30"); + s = s.Replace("FALSE", "TRUE"); + } + else if (comboBoxFrameRate.Text == "23.976") + { + s = s.Replace("NDF", "DF"); //Non Drop Frame or Drop Frame + s = s.Replace("25", "24"); + s = s.Replace("FALSE", "TRUE"); + } + else if (comboBoxFrameRate.Text == "59.94") + { + s = s.Replace("NDF", "DF"); //Non Drop Frame or Drop Frame + s = s.Replace("25", "60"); + s = s.Replace("FALSE", "TRUE"); + } + + else + { + s = s.Replace("25", "" + comboBoxFrameRate.Text + ""); + } + + if (_subtitle.Paragraphs.Count > 0) + { + var end = SubtitleFormat.MillisecondsToFrames(_subtitle.Paragraphs[_subtitle.Paragraphs.Count - 1].EndTime.TotalMilliseconds, FrameRate); + end++; + s = s.Replace("[OUT]", end.ToString(CultureInfo.InvariantCulture)); + } + + if (comboBoxLanguage.Text == "NTSC") + { + s = s.Replace("FALSE", "TRUE"); + } + + s = s.Replace("1920", "" + width.ToString(CultureInfo.InvariantCulture) + ""); + s = s.Replace("1080", "" + height.ToString(CultureInfo.InvariantCulture) + ""); + + if (comboBoxImageFormat.Text.Contains("8-bit")) + { + s = s.Replace("32", "8"); + } + + File.WriteAllText(fileName, s); + } + + internal void WriteBdnXmlFile(int imagesSavedCount, StringBuilder sb, string fileName) + { + GetResolution(out var resW, out var resH); + string videoFormat = "1080p"; + if (resW == 1920 && resH == 1080) + { + videoFormat = "1080p"; + } + else if (resW == 1280 && resH == 720) + { + videoFormat = "720p"; + } + else if (resW == 848 && resH == 480) + { + videoFormat = "480p"; + } + else if (resW > 0 && resH > 0) + { + videoFormat = resW + "x" + resH; + } + + var doc = new XmlDocument(); + Paragraph first = _subtitle.Paragraphs[0]; + Paragraph last = _subtitle.Paragraphs[_subtitle.Paragraphs.Count - 1]; + doc.LoadXml("" + Environment.NewLine + + "" + Environment.NewLine + + "" + Environment.NewLine + + "" + Environment.NewLine + + "" + Environment.NewLine + + "" + Environment.NewLine + + "" + Environment.NewLine + + "" + Environment.NewLine + + "" + Environment.NewLine + + "" + Environment.NewLine + + ""); + XmlNode events = doc.DocumentElement.SelectSingleNode("Events"); + doc.PreserveWhitespace = true; + events.InnerXml = sb.ToString(); + File.WriteAllText(fileName, FormatUtf8Xml(doc), Encoding.UTF8); + } + + internal void WriteDostFile(string fileName, string body) + { + string header = @"$FORMAT=480 +$VERSION=1.2 +$ULEAD=TRUE +$DROP=[DROPVALUE]" + Environment.NewLine + Environment.NewLine + + "NO\tINTIME\t\tOUTTIME\t\tXPOS\tYPOS\tFILENAME\tFADEIN\tFADEOUT"; + + string dropValue = "30000"; + if (comboBoxFrameRate.SelectedIndex == -1) + { + var numberAsString = comboBoxFrameRate.Text.Trim().RemoveChar('.').RemoveChar(',').Replace(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, string.Empty); + if (numberAsString.Length > 0 && Utilities.IsInteger(numberAsString)) + { + dropValue = numberAsString; + } + } + else if (comboBoxFrameRate.Items[comboBoxFrameRate.SelectedIndex].ToString() == "23.98") + { + dropValue = "23976"; + } + else if (comboBoxFrameRate.Items[comboBoxFrameRate.SelectedIndex].ToString() == "24") + { + dropValue = "24000"; + } + else if (comboBoxFrameRate.Items[comboBoxFrameRate.SelectedIndex].ToString() == "25") + { + dropValue = "25000"; + } + else if (comboBoxFrameRate.Items[comboBoxFrameRate.SelectedIndex].ToString() == "29.97") + { + dropValue = "29970"; + } + else if (comboBoxFrameRate.Items[comboBoxFrameRate.SelectedIndex].ToString() == "30") + { + dropValue = "30000"; + } + else if (comboBoxFrameRate.Items[comboBoxFrameRate.SelectedIndex].ToString() == "59.94") + { + dropValue = "59940"; + } + + header = header.Replace("[DROPVALUE]", dropValue); + comboBoxFrameRate.SelectedIndex = 0; + + File.WriteAllText(fileName, header + Environment.NewLine + body); + } + + private static string FormatUtf8Xml(XmlDocument doc) + { + var sb = new StringBuilder(); + using (var writer = XmlWriter.Create(sb, new XmlWriterSettings { Indent = true, Encoding = Encoding.UTF8 })) + { + doc.Save(writer); + } + return sb.ToString().Replace(" encoding=\"utf-16\"", " encoding=\"utf-8\"").Trim(); // "replace hack" due to missing encoding (encoding only works if it's the only parameter...) + } + + private void SaveImage(Bitmap bmp, string fileName, ImageFormat imageFormat) + { + if (Equals(imageFormat, ImageFormat.Icon)) + { + var nikseBitmap = new NikseBitmap(bmp); + nikseBitmap.SaveAsTarga(fileName); + } + else + { + bmp.Save(fileName, imageFormat); + } + } + + private void FixStartEndWithSameTimeCode() + { + for (int i = 0; i < _subtitle.Paragraphs.Count - 1; i++) + { + Paragraph p = _subtitle.Paragraphs[i]; + Paragraph next = _subtitle.Paragraphs[i + 1]; + if (Math.Abs(p.EndTime.TotalMilliseconds - next.StartTime.TotalMilliseconds) < 0.1) + { + p.EndTime.TotalMilliseconds--; + } + } + } + + private void SetResolution(string inputXAndY) + { + if (string.IsNullOrEmpty(inputXAndY)) + { + return; + } + + var xAndY = inputXAndY.ToLowerInvariant(); + + if (_exportType == ExportFormats.Fcp) + { + switch (xAndY) + { + case "720x480": + xAndY = "NTSC-601"; + break; + case "720x576": + xAndY = "PAL-601"; + break; + case "640x480": + xAndY = "square"; + break; + case "1280x720": + xAndY = "DVCPROHD-720P"; + break; + case "960x720": + xAndY = "HD-(960x720)"; + break; + case "1920x1080": + xAndY = "FullHD 1920x1080"; + break; + case "1280x1080": + xAndY = "HD-(1280x1080)"; + break; + case "1440x1080": + xAndY = "HD-(1440x1080)"; + break; + } + } + + if (_exportType == ExportFormats.Fcp || Regex.IsMatch(xAndY, @"\d+x\d+", RegexOptions.IgnoreCase)) + { + for (int i = 0; i < comboBoxResolution.Items.Count; i++) + { + if (comboBoxResolution.Items[i].ToString().Contains(xAndY)) + { + comboBoxResolution.SelectedIndex = i; + return; + } + } + comboBoxResolution.Items[comboBoxResolution.Items.Count - 1] = xAndY; + comboBoxResolution.SelectedIndex = comboBoxResolution.Items.Count - 1; + } + } + + private void GetResolution(out int width, out int height) + { + width = 1920; + height = 1080; + if (comboBoxResolution.SelectedIndex < 0) + { + return; + } + + string text = comboBoxResolution.Text.Trim(); + + if (_exportType == ExportFormats.Fcp) + { + if (text == "NTSC-601") + { + width = 720; + height = 480; + return; + } + + if (text == "PAL-601") + { + width = 720; + height = 576; + return; + } + + if (text == "square") + { + width = 640; + height = 480; + return; + } + + if (text == "DVCPROHD-720P") + { + width = 1280; + height = 720; + return; + } + + if (text == "HD-(960x720)") + { + width = 960; + height = 720; + return; + } + + if (text == "FullHD 1920x1080") + { + width = 1920; + height = 1080; + return; + } + + if (text == "DVCPROHD-1080i60") + { + width = 1920; + height = 1080; + return; + } + + if (text == "HD-(1280x1080)") + { + width = 1280; + height = 1080; + return; + } + + if (text == "DVCPROHD-1080i50") + { + width = 1920; + height = 1080; + return; + } + + if (text == "HD-(1440x1080)") + { + width = 1440; + height = 1080; + return; + } + } + + if (text.Contains('(')) + { + text = text.Remove(0, text.IndexOf('(')).Trim(); + } + + text = text.TrimStart('(').TrimEnd(')').Trim(); + string[] arr = text.Split('x'); + width = int.Parse(arr[0]); + height = int.Parse(arr[1]); + } + + private int WriteParagraph(int width, StringBuilder sb, int border, int height, int imagesSavedCount, VobSubWriter vobSubWriter, FileStream binarySubtitleFile, MakeBitmapParameter param, int i) + { + if (param.Bitmap != null) + { + if (_exportType == ExportFormats.BluraySup) + { + if (!param.Saved) + { + binarySubtitleFile.Write(param.Buffer, 0, param.Buffer.Length); + } + param.Saved = true; + } + else if (_exportType == ExportFormats.VobSub) + { + if (!param.Saved) + { + vobSubWriter.WriteParagraph(param.P, param.Bitmap, param.Alignment); + } + + param.Saved = true; + } + else if (_exportType == ExportFormats.Fab) + { + if (!param.Saved) + { + string numberString = $"IMAGE{i:000}"; + string fileName = Path.Combine(folderBrowserDialog1.SelectedPath, numberString + "." + comboBoxImageFormat.Text.ToLowerInvariant()); + + if (checkBoxFullFrameImage.Checked) + { + var nbmp = new NikseBitmap(param.Bitmap); + nbmp.ReplaceTransparentWith(panelFullFrameBackground.BackColor); + using (var bmp = nbmp.GetBitmap()) + { + imagesSavedCount++; + + //RACE001.TIF 00;00;02;02 00;00;03;15 000 000 720 480 + //RACE002.TIF 00;00;05;18 00;00;09;20 000 000 720 480 + int top = param.ScreenHeight - (param.Bitmap.Height + param.BottomMargin); + int left = (param.ScreenWidth - param.Bitmap.Width) / 2; + + var b = new NikseBitmap(param.ScreenWidth, param.ScreenHeight); + { + b.Fill(panelFullFrameBackground.BackColor); + using (var fullSize = b.GetBitmap()) + { + if (param.Alignment == ContentAlignment.BottomLeft || param.Alignment == ContentAlignment.MiddleLeft || param.Alignment == ContentAlignment.TopLeft) + { + left = param.LeftMargin; + } + else if (param.Alignment == ContentAlignment.BottomRight || param.Alignment == ContentAlignment.MiddleRight || param.Alignment == ContentAlignment.TopRight) + { + left = param.ScreenWidth - param.Bitmap.Width - param.RightMargin; + } + + if (param.Alignment == ContentAlignment.TopLeft || param.Alignment == ContentAlignment.TopCenter || param.Alignment == ContentAlignment.TopRight) + { + top = param.BottomMargin; + } + + if (param.Alignment == ContentAlignment.MiddleLeft || param.Alignment == ContentAlignment.MiddleCenter || param.Alignment == ContentAlignment.MiddleRight) + { + top = (param.ScreenHeight - param.Bitmap.Height) / 2; + } + + if (param.OverridePosition.HasValue && + param.OverridePosition.Value.X >= 0 && param.OverridePosition.Value.X < param.Bitmap.Width && + param.OverridePosition.Value.Y >= 0 && param.OverridePosition.Value.Y < param.Bitmap.Height) + { + left = param.OverridePosition.Value.X; + top = param.OverridePosition.Value.Y; + } + + using (var g = Graphics.FromImage(fullSize)) + { + g.DrawImage(bmp, left, top); + g.Dispose(); + } + SaveImage(fullSize, fileName, ImageFormat); + } + } + left = 0; + top = 0; + sb.AppendLine($"{Path.GetFileName(fileName)} {FormatFabTime(param.P.StartTime, param)} {FormatFabTime(param.P.EndTime, param)} {left} {top} {left + param.ScreenWidth} {top + param.ScreenHeight}"); + } + } + else + { + SaveImage(param.Bitmap, fileName, ImageFormat); + + imagesSavedCount++; + + //RACE001.TIF 00;00;02;02 00;00;03;15 000 000 720 480 + //RACE002.TIF 00;00;05;18 00;00;09;20 000 000 720 480 + int top = param.ScreenHeight - (param.Bitmap.Height + param.BottomMargin); + int left = (param.ScreenWidth - param.Bitmap.Width) / 2; + + if (param.Alignment == ContentAlignment.BottomLeft || param.Alignment == ContentAlignment.MiddleLeft || param.Alignment == ContentAlignment.TopLeft) + { + left = param.LeftMargin; + } + else if (param.Alignment == ContentAlignment.BottomRight || param.Alignment == ContentAlignment.MiddleRight || param.Alignment == ContentAlignment.TopRight) + { + left = param.ScreenWidth - param.Bitmap.Width - param.RightMargin; + } + + if (param.Alignment == ContentAlignment.TopLeft || param.Alignment == ContentAlignment.TopCenter || param.Alignment == ContentAlignment.TopRight) + { + top = param.BottomMargin; + } + + if (param.Alignment == ContentAlignment.MiddleLeft || param.Alignment == ContentAlignment.MiddleCenter || param.Alignment == ContentAlignment.MiddleRight) + { + top = (param.ScreenHeight - param.Bitmap.Height) / 2; + } + + if (param.OverridePosition.HasValue && + param.OverridePosition.Value.X >= 0 && param.OverridePosition.Value.X < param.Bitmap.Width && + param.OverridePosition.Value.Y >= 0 && param.OverridePosition.Value.Y < param.Bitmap.Height) + { + left = param.OverridePosition.Value.X; + top = param.OverridePosition.Value.Y; + } + + sb.AppendLine($"{Path.GetFileName(fileName)} {FormatFabTime(param.P.StartTime, param)} {FormatFabTime(param.P.EndTime, param)} {left} {top} {left + param.Bitmap.Width} {top + param.Bitmap.Height}"); + } + param.Saved = true; + } + } + else if (_exportType == ExportFormats.Stl) + { + if (!param.Saved) + { + string numberString = $"IMAGE{i:000}"; + string fileName = Path.Combine(folderBrowserDialog1.SelectedPath, numberString + "." + comboBoxImageFormat.Text.ToLowerInvariant()); + SaveImage(param.Bitmap, fileName, ImageFormat); + + imagesSavedCount++; + + const string paragraphWriteFormat = "{0} , {1} , {2}\r\n"; + const string timeFormat = "{0:00}:{1:00}:{2:00}:{3:00}"; + + double factor = TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate; + string startTime = string.Format(timeFormat, param.P.StartTime.Hours, param.P.StartTime.Minutes, param.P.StartTime.Seconds, (int)Math.Round(param.P.StartTime.Milliseconds / factor)); + string endTime = string.Format(timeFormat, param.P.EndTime.Hours, param.P.EndTime.Minutes, param.P.EndTime.Seconds, (int)Math.Round(param.P.EndTime.Milliseconds / factor)); + sb.AppendFormat(paragraphWriteFormat, startTime, endTime, fileName); + + param.Saved = true; + } + } + else if (_exportType == ExportFormats.Spumux) + { + if (!param.Saved) + { + string numberString = $"IMAGE{i:000}"; + string fileName = Path.Combine(folderBrowserDialog1.SelectedPath, numberString + "." + comboBoxImageFormat.Text.ToLowerInvariant()); + foreach (var encoder in ImageCodecInfo.GetImageEncoders()) + { + if (encoder.FormatID == ImageFormat.Png.Guid) + { + var parameters = new EncoderParameters { Param = { [0] = new EncoderParameter(System.Drawing.Imaging.Encoder.ColorDepth, 4) } }; + + var nbmp = new NikseBitmap(param.Bitmap); + var b = nbmp.ConvertTo8BitsPerPixel(); + b.Save(fileName, encoder, parameters); + b.Dispose(); + + break; + } + } + imagesSavedCount++; + + const string paragraphWriteFormat = "\t\t"; + const string timeFormat = "{0:00}:{1:00}:{2:00}.{3:00}"; + + double factor = TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate; + string startTime = string.Format(timeFormat, param.P.StartTime.Hours, param.P.StartTime.Minutes, param.P.StartTime.Seconds, (int)Math.Round(param.P.StartTime.Milliseconds / factor)); + string endTime = string.Format(timeFormat, param.P.EndTime.Hours, param.P.EndTime.Minutes, param.P.EndTime.Seconds, (int)Math.Round(param.P.EndTime.Milliseconds / factor)); + int left = (param.ScreenWidth - param.Bitmap.Width) / 2; + if (param.Alignment == ContentAlignment.BottomLeft || param.Alignment == ContentAlignment.TopLeft) + { + left = param.LeftMargin; + } + else if (param.Alignment == ContentAlignment.BottomRight || param.Alignment == ContentAlignment.TopRight) + { + left = param.ScreenWidth - param.Bitmap.Width - param.LeftMargin; + } + int top = param.ScreenHeight - (param.Bitmap.Height + param.BottomMargin); + if (param.Alignment == ContentAlignment.TopCenter || param.Alignment == ContentAlignment.TopLeft || param.Alignment == ContentAlignment.TopRight) + { + top = param.BottomMargin; + } + sb.AppendLine(string.Format(paragraphWriteFormat, startTime, endTime, fileName, left, top)); + + param.Saved = true; + } + } + else if (_exportType == ExportFormats.Fcp) + { + if (!param.Saved) + { + imagesSavedCount = WriteFcpParagraph(sb, imagesSavedCount, param, i, saveFileDialog1.FileName); + + param.Saved = true; + } + } + else if (_exportType == ExportFormats.Dost) + { + if (!param.Saved) + { + imagesSavedCount = WriteParagraphDost(sb, imagesSavedCount, param, i, saveFileDialog1.FileName); + param.Saved = true; + } + } + else if (_exportType == ExportFormats.ImageFrame) + { + if (!param.Saved) + { + var imageFormat = ImageFormat; + + int lastFrame = imagesSavedCount; + int startFrame = (int)Math.Round(param.P.StartTime.TotalMilliseconds / (TimeCode.BaseUnit / param.FramesPerSeconds)); + var empty = new Bitmap(param.ScreenWidth, param.ScreenHeight); + + if (imagesSavedCount != 0 || !checkBoxSkipEmptyFrameAtStart.Checked) + { + // Save empty picture for each frame up to start frame + for (int k = lastFrame + 1; k < startFrame; k++) + { + string numberString = $"{k:00000}"; + string fileName = Path.Combine(folderBrowserDialog1.SelectedPath, numberString + "." + comboBoxImageFormat.Text.ToLowerInvariant()); + empty.Save(fileName, imageFormat); + imagesSavedCount++; + } + } + + int endFrame = (int)Math.Round(param.P.EndTime.TotalMilliseconds / (TimeCode.BaseUnit / param.FramesPerSeconds)); + var fullSize = new Bitmap(param.ScreenWidth, param.ScreenHeight); + Graphics g = Graphics.FromImage(fullSize); + g.DrawImage(param.Bitmap, (param.ScreenWidth - param.Bitmap.Width) / 2, param.ScreenHeight - (param.Bitmap.Height + param.BottomMargin)); + g.Dispose(); + + if (imagesSavedCount > startFrame) + { + startFrame = imagesSavedCount; // no overlapping + } + + // Save sub picture for each frame in duration + for (int k = startFrame; k <= endFrame; k++) + { + string numberString = $"{k:00000}"; + string fileName = Path.Combine(folderBrowserDialog1.SelectedPath, numberString + "." + comboBoxImageFormat.Text.ToLowerInvariant()); + fullSize.Save(fileName, imageFormat); + imagesSavedCount++; + } + fullSize.Dispose(); + param.Saved = true; + } + } + else if (_exportType == ExportFormats.DCinemaInterop) + { + if (!param.Saved) + { + string numberString = $"{i:0000}"; + string fileName = Path.Combine(Path.GetDirectoryName(saveFileDialog1.FileName), numberString + ".png"); + param.Bitmap.Save(fileName, ImageFormat.Png); + imagesSavedCount++; + param.Saved = true; + + string verticalAlignment = "bottom"; + string horizontalAlignment = "center"; + string vPos = "9.7"; + string hPos = "0"; + + switch (param.Alignment) + { + case ContentAlignment.BottomLeft: + verticalAlignment = "bottom"; + horizontalAlignment = "left"; + hPos = "10"; + break; + case ContentAlignment.BottomRight: + verticalAlignment = "bottom"; + horizontalAlignment = "right"; + hPos = "10"; + break; + case ContentAlignment.MiddleCenter: + verticalAlignment = "center"; + vPos = "0"; + break; + case ContentAlignment.MiddleLeft: + verticalAlignment = "center"; + horizontalAlignment = "left"; + hPos = "10"; + vPos = "0"; + break; + case ContentAlignment.MiddleRight: + verticalAlignment = "center"; + horizontalAlignment = "right"; + hPos = "10"; + vPos = "0"; + break; + case ContentAlignment.TopCenter: + verticalAlignment = "top"; + break; + case ContentAlignment.TopLeft: + verticalAlignment = "top"; + horizontalAlignment = "left"; + hPos = "10"; + break; + case ContentAlignment.TopRight: + verticalAlignment = "top"; + horizontalAlignment = "right"; + hPos = "10"; + break; + } + + sb.AppendLine(""); + if (param.Depth3D == 0) + { + sb.AppendLine("" + numberString + ".png" + ""); + } + else + { + sb.AppendLine("" + numberString + ".png" + ""); + } + + sb.AppendLine(""); + } + } + else if (_exportType == ExportFormats.DCinemaSmpte2014) + { + if (!param.Saved) + { + string numberString = $"{i:0000}"; + string fileName = Path.Combine(Path.GetDirectoryName(saveFileDialog1.FileName), numberString + ".png"); + param.Bitmap.Save(fileName, ImageFormat.Png); + imagesSavedCount++; + param.Saved = true; + + string verticalAlignment = "bottom"; + string horizontalAlignment = "center"; + string vPos = "9.7"; + string hPos = "0"; + + switch (param.Alignment) + { + case ContentAlignment.BottomLeft: + verticalAlignment = "bottom"; + horizontalAlignment = "left"; + hPos = "10"; + break; + case ContentAlignment.BottomRight: + verticalAlignment = "bottom"; + horizontalAlignment = "right"; + hPos = "10"; + break; + case ContentAlignment.MiddleCenter: + verticalAlignment = "center"; + vPos = "0"; + break; + case ContentAlignment.MiddleLeft: + verticalAlignment = "center"; + horizontalAlignment = "left"; + hPos = "10"; + vPos = "0"; + break; + case ContentAlignment.MiddleRight: + verticalAlignment = "center"; + horizontalAlignment = "right"; + hPos = "10"; + vPos = "0"; + break; + case ContentAlignment.TopCenter: + verticalAlignment = "top"; + break; + case ContentAlignment.TopLeft: + verticalAlignment = "top"; + horizontalAlignment = "left"; + hPos = "10"; + break; + case ContentAlignment.TopRight: + verticalAlignment = "top"; + horizontalAlignment = "right"; + hPos = "10"; + break; + } + + sb.AppendLine(""); + if (param.Depth3D == 0) + { + sb.AppendLine("" + numberString + ".png" + ""); + } + else + { + sb.AppendLine("" + numberString + ".png" + ""); + } + + sb.AppendLine(""); + } + } + else if (_exportType == ExportFormats.Edl || _exportType == ExportFormats.EdlClipName) + { + if (!param.Saved) + { + // 001 7M6C7986 V C 14:14:55:21 14:15:16:24 01:00:10:18 01:00:31:21 + var fileName1 = "IMG" + i.ToString(CultureInfo.InvariantCulture).PadLeft(5, '0'); + + var fullSize = new Bitmap(param.ScreenWidth, param.ScreenHeight); + using (var g = Graphics.FromImage(fullSize)) + { + g.DrawImage(param.Bitmap, (param.ScreenWidth - param.Bitmap.Width) / 2, param.ScreenHeight - (param.Bitmap.Height + param.BottomMargin)); + } + var fileName2 = Path.Combine(Path.GetDirectoryName(param.SavDialogFileName), fileName1 + ".PNG"); + fullSize.Save(fileName2, ImageFormat.Png); + fullSize.Dispose(); + + string line = $"{i:000} {fileName1} V C {new TimeCode().ToHHMMSSFF()} {param.P.Duration.ToHHMMSSFF()} {param.P.StartTime.ToHHMMSSFF()} {param.P.EndTime.ToHHMMSSFF()}"; + sb.AppendLine(line); + if (_exportType == ExportFormats.EdlClipName) + { + sb.AppendLine("* FROM CLIP NAME: " + fileName1 + ".PNG"); + } + sb.AppendLine(); + + imagesSavedCount++; + param.Saved = true; + } + } + else // BDNXML + { + if (!param.Saved) + { + imagesSavedCount = WriteBdnXmlParagraph(width, sb, border, height, imagesSavedCount, param, i, folderBrowserDialog1.SelectedPath); + param.Saved = true; + } + } + } + return imagesSavedCount; + } + + internal int WriteFcpParagraph(StringBuilder sb, int imagesSavedCount, MakeBitmapParameter param, int i, string fileName) + { + string numberString = string.Format(Path.GetFileNameWithoutExtension(Path.GetFileName(fileName)) + "{0:0000}", i).RemoveChar(' '); + var fileNameShort = numberString + "." + comboBoxImageFormat.Text.ToLowerInvariant(); + var targetImageFileName = Path.Combine(Path.GetDirectoryName(fileName), fileNameShort); + string fileNameNoPath = Path.GetFileName(fileNameShort); + string fileNameNoExt = Path.GetFileNameWithoutExtension(fileNameNoPath); + string pathUrl = "file://localhost/" + targetImageFileName.Replace("\\", "/").Replace(" ", "%20"); + if (!checkBoxFcpFullPathUrl.Checked) + { + pathUrl = fileNameShort; + } + + string template = " " + Environment.NewLine + +@" " + System.Security.SecurityElement.Escape(fileNameNoPath) + @" + [DURATION] + + [TIMEBASE] + [NTSC] + + [IN] + [OUT] + [START] + [END] + " + param.VideoResolution + @" + TRUE + FALSE + straight + " + System.Security.SecurityElement.Escape(fileNameNoPath) + @"1" + Environment.NewLine + + " " + @" + " + System.Security.SecurityElement.Escape(fileNameNoPath) + @" + " + pathUrl + @" + + [TIMEBASE] + [NTSC] + + [DURATION] + " + param.ScreenWidth + @" + " + param.ScreenHeight + @" + + + + + + video + + none + "; + + var outBitmap = param.Bitmap; + if (checkBoxFullFrameImage.Checked) + { + var nbmp = new NikseBitmap(param.Bitmap); + nbmp.ReplaceTransparentWith(panelFullFrameBackground.BackColor); + using (var bmp = nbmp.GetBitmap()) + { + int top = param.ScreenHeight - (param.Bitmap.Height + param.BottomMargin); + int left = (param.ScreenWidth - param.Bitmap.Width) / 2; + + var b = new NikseBitmap(param.ScreenWidth, param.ScreenHeight); + { + b.Fill(panelFullFrameBackground.BackColor); + outBitmap = b.GetBitmap(); + { + if (param.Alignment == ContentAlignment.BottomLeft || param.Alignment == ContentAlignment.MiddleLeft || param.Alignment == ContentAlignment.TopLeft) + { + left = param.LeftMargin; + } + else if (param.Alignment == ContentAlignment.BottomRight || param.Alignment == ContentAlignment.MiddleRight || param.Alignment == ContentAlignment.TopRight) + { + left = param.ScreenWidth - param.Bitmap.Width - param.RightMargin; + } + + if (param.Alignment == ContentAlignment.TopLeft || param.Alignment == ContentAlignment.TopCenter || param.Alignment == ContentAlignment.TopRight) + { + top = param.BottomMargin; + } + + if (param.Alignment == ContentAlignment.MiddleLeft || param.Alignment == ContentAlignment.MiddleCenter || param.Alignment == ContentAlignment.MiddleRight) + { + top = (param.ScreenHeight - param.Bitmap.Height) / 2; + } + + if (param.OverridePosition.HasValue && + param.OverridePosition.Value.X >= 0 && param.OverridePosition.Value.X < param.Bitmap.Width && + param.OverridePosition.Value.Y >= 0 && param.OverridePosition.Value.Y < param.Bitmap.Height) + { + left = param.OverridePosition.Value.X; + top = param.OverridePosition.Value.Y; + } + + using (var g = Graphics.FromImage(outBitmap)) + { + g.DrawImage(bmp, left, top); + g.Dispose(); + } + } + } + } + } + + + if (comboBoxImageFormat.Text == "8-bit png") + { + foreach (var encoder in ImageCodecInfo.GetImageEncoders()) + { + if (encoder.FormatID == ImageFormat.Png.Guid) + { + var parameters = new EncoderParameters(); + parameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.ColorDepth, 8); + + var nbmp = new NikseBitmap(outBitmap); + var b = nbmp.ConvertTo8BitsPerPixel(); + b.Save(targetImageFileName, encoder, parameters); + b.Dispose(); + + break; + } + } + } + else + { + SaveImage(outBitmap, targetImageFileName, ImageFormat); + } + imagesSavedCount++; + + int timeBase = 25; + string ntsc = "FALSE"; + if (comboBoxLanguage.SelectedItem.ToString().Equals("NTSC", StringComparison.Ordinal)) + { + ntsc = "TRUE"; + } + + if (Math.Abs(param.FramesPerSeconds - 29.97) < 0.01) + { + timeBase = 30; + ntsc = "TRUE"; + } + else if (Math.Abs(param.FramesPerSeconds - 23.976) < 0.01) + { + timeBase = 24; + ntsc = "TRUE"; + } + else if (Math.Abs(param.FramesPerSeconds - 59.94) < 0.01) + { + timeBase = 60; + ntsc = "TRUE"; + } + + var duration = SubtitleFormat.MillisecondsToFrames(param.P.Duration.TotalMilliseconds, param.FramesPerSeconds); + var start = SubtitleFormat.MillisecondsToFrames(param.P.StartTime.TotalMilliseconds, param.FramesPerSeconds); + var end = SubtitleFormat.MillisecondsToFrames(param.P.EndTime.TotalMilliseconds, param.FramesPerSeconds); + + template = template.Replace("[DURATION]", duration.ToString(CultureInfo.InvariantCulture)); + template = template.Replace("[IN]", start.ToString(CultureInfo.InvariantCulture)); + template = template.Replace("[OUT]", end.ToString(CultureInfo.InvariantCulture)); + template = template.Replace("[START]", start.ToString(CultureInfo.InvariantCulture)); + template = template.Replace("[END]", end.ToString(CultureInfo.InvariantCulture)); + template = template.Replace("[TIMEBASE]", timeBase.ToString(CultureInfo.InvariantCulture)); + template = template.Replace("[NTSC]", ntsc); + sb.AppendLine(template); + return imagesSavedCount; + } + + internal int WriteBdnXmlParagraph(int width, StringBuilder sb, int border, int height, int imagesSavedCount, MakeBitmapParameter param, int i, string path) + { + string numberString = $"{i:0000}"; + string fileName = Path.Combine(path, numberString + ".png"); + + if (comboBoxImageFormat.Text == "Png 8-bit") + { + foreach (var encoder in ImageCodecInfo.GetImageEncoders()) + { + if (encoder.FormatID == ImageFormat.Png.Guid) + { + var parameters = new EncoderParameters(); + parameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.ColorDepth, 8); + + var nbmp = new NikseBitmap(param.Bitmap); + var b = nbmp.ConvertTo8BitsPerPixel(); + b.Save(fileName, encoder, parameters); + b.Dispose(); + + break; + } + } + } + else + { + param.Bitmap.Save(fileName, ImageFormat.Png); + } + + imagesSavedCount++; + + // + // subtitle_exp_0001.png + // + sb.AppendLine(""); + + int x = (width - param.Bitmap.Width) / 2; + int y = height - (param.Bitmap.Height + param.BottomMargin); + switch (param.Alignment) + { + case ContentAlignment.BottomLeft: + x = border; + y = height - (param.Bitmap.Height + param.BottomMargin); + break; + case ContentAlignment.BottomRight: + x = height - param.Bitmap.Width - border; + y = height - (param.Bitmap.Height + param.BottomMargin); + break; + case ContentAlignment.MiddleCenter: + x = (width - param.Bitmap.Width) / 2; + y = (height - param.Bitmap.Height) / 2; + break; + case ContentAlignment.MiddleLeft: + x = border; + y = (height - param.Bitmap.Height) / 2; + break; + case ContentAlignment.MiddleRight: + x = width - param.Bitmap.Width - border; + y = (height - param.Bitmap.Height) / 2; + break; + case ContentAlignment.TopCenter: + x = (width - param.Bitmap.Width) / 2; + y = border; + break; + case ContentAlignment.TopLeft: + x = border; + y = border; + break; + case ContentAlignment.TopRight: + x = width - param.Bitmap.Width - border; + y = border; + break; + } + + if (param.OverridePosition.HasValue && + param.OverridePosition.Value.X >= 0 && param.OverridePosition.Value.X < param.Bitmap.Width && + param.OverridePosition.Value.Y >= 0 && param.OverridePosition.Value.Y < param.Bitmap.Height) + { + x = param.OverridePosition.Value.X; + y = param.OverridePosition.Value.Y; + } + + sb.AppendLine(" " + numberString + ".png"); + sb.AppendLine(""); + return imagesSavedCount; + } + + internal int WriteParagraphDost(StringBuilder sb, int imagesSavedCount, MakeBitmapParameter param, int i, string fileName) + { + string numberString = string.Format("{0:0000}", i); + fileName = Path.Combine(Path.GetDirectoryName(fileName), Path.GetFileNameWithoutExtension(fileName).Replace(" ", "_")) + "_" + numberString + ".png"; + + foreach (var encoder in ImageCodecInfo.GetImageEncoders()) + { + if (encoder.FormatID == ImageFormat.Png.Guid) + { + var parameters = new EncoderParameters(); + parameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.ColorDepth, 8); + + var nbmp = new NikseBitmap(param.Bitmap); + var b = nbmp.ConvertTo8BitsPerPixel(); + b.Save(fileName, encoder, parameters); + b.Dispose(); + + break; + } + } + imagesSavedCount++; + + const string paragraphWriteFormat = "{0}\t{1}\t{2}\t{4}\t{5}\t{3}\t0\t0"; + + int top = param.ScreenHeight - (param.Bitmap.Height + param.BottomMargin); + int left = (param.ScreenWidth - param.Bitmap.Width) / 2; + if (param.Alignment == ContentAlignment.BottomLeft || param.Alignment == ContentAlignment.MiddleLeft || param.Alignment == ContentAlignment.TopLeft) + { + left = param.LeftMargin; + } + else if (param.Alignment == ContentAlignment.BottomRight || param.Alignment == ContentAlignment.MiddleRight || param.Alignment == ContentAlignment.TopRight) + { + left = param.ScreenWidth - param.Bitmap.Width - param.RightMargin; + } + + if (param.Alignment == ContentAlignment.TopLeft || param.Alignment == ContentAlignment.TopCenter || param.Alignment == ContentAlignment.TopRight) + { + top = param.BottomMargin; + } + + if (param.Alignment == ContentAlignment.MiddleLeft || param.Alignment == ContentAlignment.MiddleCenter || param.Alignment == ContentAlignment.MiddleRight) + { + top = param.ScreenHeight - (param.Bitmap.Height / 2); + } + + if (param.OverridePosition.HasValue && + param.OverridePosition.Value.X >= 0 && param.OverridePosition.Value.X < param.Bitmap.Width && + param.OverridePosition.Value.Y >= 0 && param.OverridePosition.Value.Y < param.Bitmap.Height) + { + left = param.OverridePosition.Value.X; + top = param.OverridePosition.Value.Y; + } + + string startTime = ToHHMMSSFF(param.P.StartTime); + string endTime = ToHHMMSSFF(param.P.EndTime); + sb.AppendLine(string.Format(paragraphWriteFormat, numberString, startTime, endTime, Path.GetFileName(fileName), left, top)); + return imagesSavedCount; + } + + private ImageFormat ImageFormat + { + get + { + var imageFormat = ImageFormat.Png; + if (comboBoxImageFormat.SelectedIndex == 0) + { + imageFormat = ImageFormat.Bmp; + } + else if (comboBoxImageFormat.SelectedIndex == 1) + { + imageFormat = ImageFormat.Exif; + } + else if (comboBoxImageFormat.SelectedIndex == 2) + { + imageFormat = ImageFormat.Gif; + } + else if (comboBoxImageFormat.SelectedIndex == 3) + { + imageFormat = ImageFormat.Jpeg; + } + else if (comboBoxImageFormat.SelectedIndex == 4) + { + imageFormat = ImageFormat.Png; + } + else if (comboBoxImageFormat.SelectedIndex == 5) + { + imageFormat = ImageFormat.Tiff; + } + + if (string.Compare(comboBoxImageFormat.Text, "tga", StringComparison.OrdinalIgnoreCase) == 0) + { + return ImageFormat.Icon; + } + + return imageFormat; + } + } + + private static string FormatFabTime(TimeCode time, MakeBitmapParameter param) + { + if (param.Bitmap.Width == 720 && param.Bitmap.Height == 480) // NTSC + { + return $"{time.Hours:00};{time.Minutes:00};{time.Seconds:00};{SubtitleFormat.MillisecondsToFramesMaxFrameRate(time.Milliseconds):00}"; + } + + // drop frame + if (Math.Abs(param.FramesPerSeconds - 24 * (999 / 1000)) < 0.01 || + Math.Abs(param.FramesPerSeconds - 29 * (999 / 1000)) < 0.01 || + Math.Abs(param.FramesPerSeconds - 59 * (999 / 1000)) < 0.01) + { + return $"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}:{SubtitleFormat.MillisecondsToFramesMaxFrameRate(time.Milliseconds):00}"; + } + + return $"{time.Hours:00};{time.Minutes:00};{time.Seconds:00};{SubtitleFormat.MillisecondsToFramesMaxFrameRate(time.Milliseconds):00}"; + } + + private void SetupImageParameters() + { + if (subtitleListView1.SelectedItems.Count > 0 && _format.HasStyleSupport) + { + Paragraph p = _subtitle.GetParagraphOrDefault(subtitleListView1.SelectedItems[0].Index); + if (p != null && (_format.GetType() == typeof(AdvancedSubStationAlpha) || _format.GetType() == typeof(SubStationAlpha))) + { + if (!string.IsNullOrEmpty(p.Extra)) + { + comboBoxSubtitleFont.Enabled = false; + comboBoxSubtitleFontSize.Enabled = false; + buttonBorderColor.Enabled = false; + comboBoxHAlign.Enabled = false; + panelBorderColor.Enabled = false; + checkBoxBold.Enabled = false; + buttonColor.Enabled = false; + panelColor.Enabled = false; + comboBoxBorderWidth.Enabled = false; + comboBoxBottomMargin.Enabled = false; + comboBoxBottomMarginUnit.Enabled = false; + comboBoxBottomMarginUnit.SelectedIndex = 1; // px + comboBoxLeftRightMargin.Enabled = false; + comboBoxLeftRightMarginUnit.Enabled = false; + comboBoxLeftRightMarginUnit.SelectedIndex = 1; // px + comboBoxShadowWidth.Enabled = false; + buttonShadowColor.Enabled = false; + panelShadowColor.Enabled = false; + numericUpDownShadowTransparency.Enabled = _format.GetType() != typeof(AdvancedSubStationAlpha); + + SsaStyle style = AdvancedSubStationAlpha.GetSsaStyle(p.Extra, _subtitle.Header); + if (style != null) + { + int i; + for (i = 0; i < comboBoxBottomMargin.Items.Count; i++) + { + if (comboBoxBottomMargin.Items[i].ToString().Equals(style.MarginVertical.ToString(CultureInfo.InvariantCulture), StringComparison.OrdinalIgnoreCase)) + { + comboBoxBottomMargin.SelectedIndex = i; + break; + } + } + + for (i = 0; i < comboBoxLeftRightMarginUnit.Items.Count; i++) + { + if (comboBoxLeftRightMarginUnit.Items[i].ToString().Equals(style.MarginLeft.ToString(CultureInfo.InvariantCulture), StringComparison.OrdinalIgnoreCase)) + { + comboBoxLeftRightMarginUnit.SelectedIndex = i; + break; + } + } + + panelColor.BackColor = style.Primary; + panelBorderColor.BackColor = _format.GetType() == typeof(AdvancedSubStationAlpha) ? style.Outline : style.Background; + + for (i = 0; i < comboBoxSubtitleFont.Items.Count; i++) + { + if (comboBoxSubtitleFont.Items[i].ToString().Equals(style.FontName, StringComparison.OrdinalIgnoreCase)) + { + comboBoxSubtitleFont.SelectedIndex = i; + break; + } + } + for (i = 0; i < comboBoxSubtitleFontSize.Items.Count; i++) + { + if (comboBoxSubtitleFontSize.Items[i].ToString().Equals(style.FontSize.ToString(CultureInfo.InvariantCulture), StringComparison.OrdinalIgnoreCase)) + { + comboBoxSubtitleFontSize.SelectedIndex = i; + break; + } + } + checkBoxBold.Checked = style.Bold; + comboBoxBorderWidth.Items.Clear(); + comboBoxBorderWidth.Items.Add(style.OutlineWidth.ToString(CultureInfo.InvariantCulture)); + comboBoxBorderWidth.SelectedIndex = 0; + + comboBoxShadowWidth.Items.Clear(); + comboBoxShadowWidth.Items.Add(style.ShadowWidth.ToString(CultureInfo.InvariantCulture)); + comboBoxShadowWidth.SelectedIndex = 0; + if (_format.GetType() == typeof(AdvancedSubStationAlpha)) + { + panelShadowColor.BackColor = style.Background; + numericUpDownShadowTransparency.Value = style.Background.A; + } + else + { + panelShadowColor.BackColor = style.Outline; + numericUpDownShadowTransparency.Value = style.Outline.A; + } + } + } + } + } + + _subtitleColor = panelColor.BackColor; + _borderColor = panelBorderColor.BackColor; + _subtitleFontName = comboBoxSubtitleFont.SelectedItem.ToString(); + _subtitleFontSize = float.Parse(comboBoxSubtitleFontSize.SelectedItem.ToString()); + _subtitleFontBold = checkBoxBold.Checked; + + _borderWidth = GetBorderWidth(); + } + + private float GetBorderWidth() + { + if (comboBoxBorderWidth.SelectedItem.ToString() == Configuration.Settings.Language.ExportPngXml.BorderStyleBoxForEachLine || + comboBoxBorderWidth.SelectedItem.ToString() == Configuration.Settings.Language.ExportPngXml.BorderStyleOneBox) + { + return 0; + } + + if (float.TryParse(comboBoxBorderWidth.SelectedItem.ToString(), out var f)) + { + return f; + } + + if (float.TryParse(Utilities.RemoveNonNumbers(comboBoxBorderWidth.SelectedItem.ToString()), out f)) + { + return f; + } + + return 0; + } + + private float GetShadowWidth() + { + if (float.TryParse(comboBoxShadowWidth.SelectedItem.ToString(), out var f)) + { + return f; + } + + if (float.TryParse(Utilities.RemoveNonNumbers(comboBoxShadowWidth.SelectedItem.ToString()), out f)) + { + return f; + } + + return 0; + } + + private static Font GetFont(MakeBitmapParameter parameter, float fontSize) + { + Font font; + try + { + var fontStyle = FontStyle.Regular; + if (parameter.SubtitleFontBold) + { + fontStyle = FontStyle.Bold; + } + + font = new Font(parameter.SubtitleFontName, fontSize, fontStyle); + } + catch (Exception exception) + { + try + { + var fontStyle = FontStyle.Regular; + if (!parameter.SubtitleFontBold) + { + fontStyle = FontStyle.Bold; + } + + font = new Font(parameter.SubtitleFontName, fontSize, fontStyle); + } + catch + { + MessageBox.Show(exception.Message); + + if (FontFamily.Families[0].IsStyleAvailable(FontStyle.Regular)) + { + font = new Font(FontFamily.Families[0].Name, fontSize); + } + else if (FontFamily.Families.Length > 1 && FontFamily.Families[1].IsStyleAvailable(FontStyle.Regular)) + { + font = new Font(FontFamily.Families[1].Name, fontSize); + } + else if (FontFamily.Families.Length > 2 && FontFamily.Families[1].IsStyleAvailable(FontStyle.Regular)) + { + font = new Font(FontFamily.Families[2].Name, fontSize); + } + else + { + font = new Font("Arial", fontSize); + } + } + } + return font; + } + + private double GetResizeScale() + { + if (comboBoxResizePercentage.SelectedItem == null) + { + return 1.0; + } + + var p = int.Parse(comboBoxResizePercentage.SelectedItem.ToString().Replace("%", string.Empty)); + return p / 100.0; + } + + private Bitmap GenerateImageFromTextWithStyle(Paragraph p, out MakeBitmapParameter mbp) + { + mbp = new MakeBitmapParameter { P = p }; + + if (_vobSubOcr != null) + { + var index = _subtitle.GetIndex(p); + if (index >= 0) + { + var b = _vobSubOcr.GetSubtitleBitmap(index); + var exp = GetResizeScale(); + if (Math.Abs(exp - 1) > 0.01) + { + var resizedBitmap = ResizeBitmap(b, (int)Math.Round(b.Width * exp), (int)Math.Round(b.Height * exp)); + b.Dispose(); + return resizedBitmap; + } + return b; + } + + } + + mbp.AlignLeft = comboBoxHAlign.SelectedIndex == 0; + mbp.AlignRight = comboBoxHAlign.SelectedIndex == 2; + mbp.JustifyLeft = GetJustifyLeft(p.Text); + mbp.JustifyTop = comboBoxHAlign.SelectedIndex == 4; + mbp.JustifyRight = comboBoxHAlign.SelectedIndex == 5; + mbp.SimpleRendering = checkBoxSimpleRender.Checked; + mbp.BorderWidth = _borderWidth; + mbp.BorderColor = _borderColor; + mbp.SubtitleFontName = _subtitleFontName; + mbp.SubtitleColor = _subtitleColor; + mbp.SubtitleFontSize = _subtitleFontSize; + mbp.SubtitleFontBold = _subtitleFontBold; + mbp.LineHeight = _lineHeights; + mbp.FullFrame = checkBoxFullFrameImage.Checked; + mbp.FullFrameBackgroundColor = panelFullFrameBackground.BackColor; + mbp.OverridePosition = GetAssPoint(p.Text); + + if (_format.HasStyleSupport && !string.IsNullOrEmpty(p.Extra)) + { + if (_format.GetType() == typeof(SubStationAlpha)) + { + var style = AdvancedSubStationAlpha.GetSsaStyle(p.Extra, _subtitle.Header); + mbp.SubtitleColor = style.Primary; + mbp.SubtitleFontBold = style.Bold; + mbp.SubtitleFontSize = style.FontSize; + mbp.BottomMargin = style.MarginVertical; + if (style.BorderStyle == "3") + { + mbp.BackgroundColor = style.Background; + } + mbp.ShadowColor = style.Outline; + } + else if (_format.GetType() == typeof(AdvancedSubStationAlpha)) + { + var style = AdvancedSubStationAlpha.GetSsaStyle(p.Extra, _subtitle.Header); + mbp.SubtitleColor = style.Primary; + mbp.SubtitleFontBold = style.Bold; + mbp.SubtitleFontSize = style.FontSize; + mbp.BottomMargin = style.MarginVertical; + if (style.BorderStyle == "3") + { + mbp.BackgroundColor = style.Outline; + } + mbp.ShadowAlpha = style.Background.A; + mbp.ShadowColor = style.Background; + } + } + + if (comboBoxBorderWidth.SelectedItem.ToString() == Configuration.Settings.Language.ExportPngXml.BorderStyleBoxForEachLine) + { + _borderWidth = 0; + mbp.BackgroundColor = panelBorderColor.BackColor; + mbp.BoxSingleLine = true; + } + else if (comboBoxBorderWidth.SelectedItem.ToString() == Configuration.Settings.Language.ExportPngXml.BorderStyleOneBox) + { + mbp.BoxSingleLine = false; + _borderWidth = 0; + mbp.BackgroundColor = panelBorderColor.BackColor; + } + + GetResolution(out var width, out var height); + mbp.ScreenWidth = width; + mbp.ScreenHeight = height; + mbp.VideoResolution = comboBoxResolution.Text; + mbp.Type3D = comboBox3D.SelectedIndex; + mbp.Depth3D = (int)numericUpDownDepth3D.Value; + mbp.BottomMargin = GetBottomMarginInPixels(p); + mbp.ShadowWidth = GetShadowWidth(); + mbp.ShadowAlpha = (int)numericUpDownShadowTransparency.Value; + mbp.ShadowColor = panelShadowColor.BackColor; + mbp.LineHeight = _lineHeights; + mbp.Forced = subtitleListView1.Items[_subtitle.GetIndex(p)].Checked; + mbp.LineJoin = Configuration.Settings.Tools.ExportPenLineJoin; + var bmp = GenerateImageFromTextWithStyle(mbp); + if (_exportType == ExportFormats.VobSub || _exportType == ExportFormats.Stl || _exportType == ExportFormats.Spumux) + { + var nbmp = new NikseBitmap(bmp); + nbmp.ConvertToFourColors(Color.Transparent, _subtitleColor, _borderColor, !checkBoxTransAntiAliase.Checked); + + if (_exportType == ExportFormats.Spumux) + { + nbmp.EnsureEvenLines(mbp.BoxSingleLine ? Color.Transparent : mbp.BackgroundColor); + } + + var temp = nbmp.GetBitmap(); + bmp.Dispose(); + return temp; + } + return bmp; + } + + private static int CalcWidthViaDraw(string text, MakeBitmapParameter parameter) + { + var nbmp = GenerateBitmapForCalc(text, parameter); + nbmp.CropTransparentSidesAndBottom(0, true); + return nbmp.Width; + } + + private static NikseBitmap GenerateBitmapForCalc(string text, MakeBitmapParameter parameter) + { + text = text.Trim(); + var path = new GraphicsPath(); + var sb = new StringBuilder(); + int i = 0; + bool isItalic = false; + bool isBold = parameter.SubtitleFontBold; + const float top = 5f; + bool newLine = false; + float left = 1.0f; + float leftMargin = left; + int newLinePathPoint = -1; + Color c = parameter.SubtitleColor; + var colorStack = new Stack(); + var lastText = new StringBuilder(); + var sf = new StringFormat { Alignment = StringAlignment.Near, LineAlignment = StringAlignment.Near }; + var bmp = new Bitmap(parameter.ScreenWidth, 200); + var g = Graphics.FromImage(bmp); + + g.CompositingQuality = CompositingQuality.HighSpeed; + g.SmoothingMode = SmoothingMode.HighSpeed; + g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; + + Font font = GetFont(parameter, parameter.SubtitleFontSize); + var fontStack = new Stack(); + while (i < text.Length) + { + if (text.Substring(i).StartsWith(" 0) + { + lastText.Append(sb); + TextDraw.DrawText(font, sf, path, sb, isItalic, parameter.SubtitleFontBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); + } + + addLeft = GetLastPositionFromPath(path, oldPathPointIndex, addLeft); + if (path.PointCount == 0) + { + addLeft = left; + } + else if (addLeft < 0.01) + { + addLeft = left + 2; + } + + left = addLeft; + + DrawShadowAndPath(parameter, g, path); + var p2 = new SolidBrush(c); + g.FillPath(p2, path); + p2.Dispose(); + path.Reset(); + path = new GraphicsPath(); + sb.Clear(); + + int endIndex = text.Substring(i).IndexOf('>'); + if (endIndex < 0) + { + i += 9999; + } + else + { + string fontContent = text.Substring(i, endIndex); + if (fontContent.Contains(" color=", StringComparison.OrdinalIgnoreCase)) + { + string[] arr = fontContent.Substring(fontContent.IndexOf(" color=", StringComparison.OrdinalIgnoreCase) + 7).Trim().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + if (arr.Length > 0) + { + string fontColor = arr[0].Trim('\'').Trim('"').Trim('\''); + try + { + colorStack.Push(c); // save old color + if (fontColor.StartsWith("rgb(", StringComparison.OrdinalIgnoreCase)) + { + arr = fontColor.Remove(0, 4).TrimEnd(')').Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + c = Color.FromArgb(int.Parse(arr[0]), int.Parse(arr[1]), int.Parse(arr[2])); + } + else + { + c = ColorTranslator.FromHtml(fontColor); + } + } + catch + { + c = parameter.SubtitleColor; + } + } + } + if (fontContent.Contains(" face=", StringComparison.OrdinalIgnoreCase) || fontContent.Contains(" size=", StringComparison.OrdinalIgnoreCase)) + { + float fontSize = parameter.SubtitleFontSize; + string fontFace = parameter.SubtitleFontName; + + string[] arr = fontContent.Substring(fontContent.IndexOf(" face=", StringComparison.OrdinalIgnoreCase) + 6).Trim().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + if (arr.Length > 0) + { + fontFace = arr[0].Trim('\'').Trim('"').Trim('\''); + } + + arr = fontContent.Substring(fontContent.IndexOf(" size=", StringComparison.OrdinalIgnoreCase) + 6).Trim().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + if (arr.Length > 0) + { + string temp = arr[0].Trim('\'').Trim('"').Trim('\''); + if (float.TryParse(temp, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var f)) + { + fontSize = f; + } + } + + try + { + fontStack.Push(font); // save old cfont + var p = new MakeBitmapParameter { SubtitleFontName = fontFace, SubtitleFontSize = fontSize }; + font = GetFont(p, p.SubtitleFontSize); + } + catch + { + font = fontStack.Pop(); + } + } + i += endIndex; + } + } + else if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase)) + { + if (text.Substring(i).ToLowerInvariant().Replace("", string.Empty).Replace("", string.Empty).Length > 0) + { + if (lastText.EndsWith(' ') && !sb.StartsWith(' ')) + { + string t = sb.ToString(); + sb.Clear(); + sb.Append(' '); + sb.Append(t); + } + + float addLeft = 0; + int oldPathPointIndex = path.PointCount - 1; + if (oldPathPointIndex < 0) + { + oldPathPointIndex = 0; + } + + if (sb.Length > 0) + { + if (lastText.Length > 0 && left > 2) + { + left -= 1.5f; + } + + lastText.Append(sb); + + TextDraw.DrawText(font, sf, path, sb, isItalic, parameter.SubtitleFontBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); + } + + addLeft = GetLastPositionFromPath(path, oldPathPointIndex, addLeft); + if (addLeft < 0.01) + { + addLeft = left + 2; + } + + left = addLeft; + + DrawShadowAndPath(parameter, g, path); + g.FillPath(new SolidBrush(c), path); + path.Reset(); + sb = new StringBuilder(); + if (colorStack.Count > 0) + { + c = colorStack.Pop(); + } + + if (left >= 3) + { + left -= 2.5f; + } + } + if (fontStack.Count > 0) + { + font.Dispose(); + font = fontStack.Pop(); + } + i += 6; + } + else if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase)) + { + if (sb.Length > 0) + { + lastText.Append(sb); + TextDraw.DrawText(font, sf, path, sb, isItalic, parameter.SubtitleFontBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); + } + isItalic = true; + i += 2; + } + else if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase) && isItalic) + { + if (lastText.EndsWith(' ') && !sb.StartsWith(' ')) + { + string t = sb.ToString(); + sb.Clear(); + sb.Append(' '); + sb.Append(t); + } + lastText.Append(sb); + TextDraw.DrawText(font, sf, path, sb, isItalic, parameter.SubtitleFontBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); + isItalic = false; + i += 3; + } + else if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase)) + { + if (sb.Length > 0) + { + lastText.Append(sb); + TextDraw.DrawText(font, sf, path, sb, isItalic, isBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); + } + isBold = true; + i += 2; + } + else if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase) && isBold) + { + if (lastText.EndsWith(' ') && !sb.StartsWith(' ')) + { + string t = sb.ToString(); + sb.Clear(); + sb.Append(' '); + sb.Append(t); + } + lastText.Append(sb); + TextDraw.DrawText(font, sf, path, sb, isItalic, isBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); + isBold = false; + i += 3; + } + else + { + sb.Append(text[i]); + } + i++; + } + if (sb.Length > 0) + { + TextDraw.DrawText(font, sf, path, sb, isItalic, parameter.SubtitleFontBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); + } + + DrawShadowAndPath(parameter, g, path); + g.FillPath(new SolidBrush(c), path); + g.Dispose(); + + var nbmp = new NikseBitmap(bmp); + bmp.Dispose(); + font.Dispose(); + sf.Dispose(); + return nbmp; + } + + internal static Bitmap GenerateImageFromTextWithStyle(MakeBitmapParameter parameter) + { + Bitmap bmp = null; + if (!parameter.SimpleRendering && parameter.P.Text.Contains(Environment.NewLine) && (parameter.BoxSingleLine || parameter.P.Text.Contains(BoxSingleLineText))) + { + string old = parameter.P.Text; + int oldType3D = parameter.Type3D; + if (parameter.Type3D == 2) // Half-Top/Bottom 3D + { + parameter.Type3D = 0; // fix later + } + var oldBackgroundColor = parameter.BackgroundColor; + if (parameter.P.Text.Contains(BoxSingleLineText)) + { + parameter.P.Text = parameter.P.Text.Replace("<" + BoxSingleLineText + ">", string.Empty).Replace("", string.Empty); + parameter.BackgroundColor = parameter.BorderColor; + } + + var italicOn = false; + var boldOn = false; + var fontTag = string.Empty; + var lineWidts = new List(); + foreach (var line in parameter.P.Text.SplitToLines()) + { + parameter.P.Text = line; + + if (italicOn) + { + parameter.P.Text = "" + parameter.P.Text; + } + italicOn = parameter.P.Text.Contains("", StringComparison.OrdinalIgnoreCase) && !parameter.P.Text.Contains("", StringComparison.OrdinalIgnoreCase); + if (italicOn) + { + parameter.P.Text += ""; + } + + if (boldOn) + { + parameter.P.Text = "" + parameter.P.Text; + } + boldOn = parameter.P.Text.Contains("", StringComparison.OrdinalIgnoreCase) && !parameter.P.Text.Contains("", StringComparison.OrdinalIgnoreCase); + if (boldOn) + { + parameter.P.Text += ""; + } + + parameter.P.Text = fontTag + parameter.P.Text; + if (parameter.P.Text.Contains("", StringComparison.OrdinalIgnoreCase)) + { + int start = parameter.P.Text.LastIndexOf("', start); + fontTag = parameter.P.Text.Substring(start, end - start + 1); + } + + var lineImage = GenerateImageFromTextWithStyleInner(parameter); + lineWidts.Add(lineImage.Width); + if (bmp == null) + { + bmp = lineImage; + } + else + { + int w = Math.Max(bmp.Width, lineImage.Width); + int h = bmp.Height + lineImage.Height; + + int l1; + if (parameter.AlignLeft) + { + l1 = 0; + } + else if (parameter.AlignRight) + { + l1 = w - bmp.Width; + } + else + { + l1 = (int)Math.Round((w - bmp.Width) / 2.0); + + if (parameter.JustifyLeft) + { + l1 = 0; + } + else if (parameter.JustifyRight) + { + l1 = w - lineImage.Width; + } + } + + int l2; + if (parameter.AlignLeft) + { + l2 = 0; + } + else if (parameter.AlignRight) + { + l2 = w - lineImage.Width; + } + else + { + l2 = (int)Math.Round((w - lineImage.Width) / 2.0); + + if (parameter.JustifyLeft) + { + l2 = 0; + } + else if (parameter.JustifyRight) + { + l2 = w - lineImage.Width; + if (parameter.BoxSingleLine) + { + l1 = w - lineWidts[0]; + } + } + } + + var style = GetStyleName(parameter.P); + var lineHeight = 25; + if (parameter.LineHeight.ContainsKey(style)) + { + lineHeight = parameter.LineHeight[style]; + } + else if (parameter.LineHeight.Count > 0) + { + lineHeight = parameter.LineHeight.First().Value; + } + + if (lineHeight > lineImage.Height) + { + h += lineHeight - lineImage.Height; + var largeImage = new Bitmap(w, h); + var g = Graphics.FromImage(largeImage); + g.DrawImageUnscaled(bmp, new Point(l1, 0)); + g.DrawImageUnscaled(lineImage, new Point(l2, bmp.Height + lineHeight - lineImage.Height)); + bmp.Dispose(); + bmp = largeImage; + g.Dispose(); + } + else + { + var largeImage = new Bitmap(w, h); + var g = Graphics.FromImage(largeImage); + g.DrawImageUnscaled(bmp, new Point(l1, 0)); + g.DrawImageUnscaled(lineImage, new Point(l2, bmp.Height)); + bmp.Dispose(); + bmp = largeImage; + g.Dispose(); + } + } + } + parameter.P.Text = old; + parameter.Type3D = oldType3D; + parameter.BackgroundColor = oldBackgroundColor; + + if (parameter.Type3D == 2) // Half-side-by-side 3D - due to per line we need to do this after making lines + { + var newBmp = Make3DTopBottom(parameter, new NikseBitmap(bmp)).GetBitmap(); + bmp?.Dispose(); + bmp = newBmp; + } + } + else + { + var oldBackgroundColor = parameter.BackgroundColor; + string oldText = parameter.P.Text; + if (parameter.P.Text.Contains(BoxMultiLineText) || parameter.P.Text.Contains(BoxSingleLineText)) + { + parameter.P.Text = parameter.P.Text.Replace("<" + BoxMultiLineText + ">", string.Empty).Replace("", string.Empty); + parameter.P.Text = parameter.P.Text.Replace("<" + BoxSingleLineText + ">", string.Empty).Replace("", string.Empty); + parameter.BackgroundColor = parameter.BorderColor; + } + bmp = GenerateImageFromTextWithStyleInner(parameter); + parameter.P.Text = oldText; + parameter.BackgroundColor = oldBackgroundColor; + } + return bmp; + } + + private static readonly Dictionary PaddingDictionary = new Dictionary(); + private static Bitmap GenerateImageFromTextWithStyleInner(MakeBitmapParameter parameter) // for UI + { + string text = parameter.P.Text; + + text = AssToHtmlTagsIfKnow(text); + + text = text.Replace("", ""); + text = text.Replace("", ""); + text = HtmlUtil.FixInvalidItalicTags(text); + + text = text.Replace("", ""); + text = text.Replace("", ""); + + // no support for underline + text = HtmlUtil.RemoveOpenCloseTags(text, HtmlUtil.TagUnderline); + + Font font = null; + Bitmap bmp = null; + try + { + font = GetFont(parameter, parameter.SubtitleFontSize); + SizeF textSize; + using (var bmpTemp = new Bitmap(1, 1)) + using (var g = Graphics.FromImage(bmpTemp)) + { + textSize = g.MeasureString(HtmlUtil.RemoveHtmlTags(text), font); + } + int sizeX = (int)(textSize.Width * 1.8) + 150; + int sizeY = (int)(textSize.Height * 0.9) + 50; + if (sizeX < 1) + { + sizeX = 1; + } + + if (sizeY < 1) + { + sizeY = 1; + } + + if (parameter.BackgroundColor != Color.Transparent) + { + var nbmpTemp = new NikseBitmap(sizeX, sizeY + _boxBorderSize * 2); // make room for box border above+under text + nbmpTemp.Fill(parameter.BackgroundColor); + bmp = nbmpTemp.GetBitmap(); + } + else + { + bmp = new Bitmap(sizeX, sizeY); + } + + var paddingKey = font.Name + font.Size.ToString(CultureInfo.InvariantCulture); + int baseLinePadding; + if (PaddingDictionary.ContainsKey(paddingKey)) + { + baseLinePadding = PaddingDictionary[paddingKey]; + } + else + { + baseLinePadding = (int)Math.Round(TextDraw.MeasureTextHeight(font, "yjK)", parameter.SubtitleFontBold) - TextDraw.MeasureTextHeight(font, "ac", parameter.SubtitleFontBold)); + PaddingDictionary.Add(paddingKey, baseLinePadding); + } + + // align lines with "gjpqy,ýęçÇ/()[]" a bit lower + var lines = text.SplitToLines(); + if (lines.Count > 0) + { + var lastLine = lines[lines.Count - 1]; + if (lastLine.Contains(new[] { 'g', 'j', 'p', 'q', 'y', ',', 'ý', 'ę', 'ç', 'Ç', '/', '(', ')', '[', ']' })) + { + var textNoBelow = lastLine.Replace('g', 'a').Replace('j', 'a').Replace('p', 'a').Replace('q', 'a').Replace('y', 'a').Replace(',', 'a').Replace('ý', 'a').Replace('ę', 'a').Replace('ç', 'a').Replace('Ç', 'a').Replace('/', 'a').Replace('(', 'a').Replace(')', 'a').Replace('[', 'a').Replace(']', 'a'); + baseLinePadding -= (int)Math.Round(TextDraw.MeasureTextHeight(font, lastLine, parameter.SubtitleFontBold) - TextDraw.MeasureTextHeight(font, textNoBelow, parameter.SubtitleFontBold)); + } + else + { + baseLinePadding += 1; + } + if (baseLinePadding < 0) + { + baseLinePadding = 0; + } + } + + if (lines.Count == 1 && parameter.JustifyTop) // align top + { + baseLinePadding += (int)Math.Round(TextDraw.MeasureTextHeight(font, "yjK)", parameter.SubtitleFontBold)); + } + + // TODO: Better baseline - test http://bobpowell.net/formattingtext.aspx + //float baselineOffset=font.SizeInPoints/font.FontFamily.GetEmHeight(font.Style)*font.FontFamily.GetCellAscent(font.Style); + //float baselineOffsetPixels = g.DpiY/72f*baselineOffset; + //baseLinePadding = (int)Math.Round(baselineOffsetPixels); + + var lefts = new List(); + var widths = new List(); + if (text.Contains("", StringComparison.OrdinalIgnoreCase) || text.Contains("", StringComparison.OrdinalIgnoreCase)) + { + bool tempItalicOn = false; + bool tempBoldOn = false; + var tempFontOn = string.Empty; + foreach (string line in text.SplitToLines()) + { + var tempLine = line; + + if (tempItalicOn) + { + tempLine = "" + tempLine; + } + + if (tempBoldOn) + { + tempLine = "" + tempLine; + } + + if (!string.IsNullOrEmpty(tempFontOn)) + { + tempLine = tempFontOn + tempLine; + } + + if (tempLine.LastIndexOf("= 0 && + tempLine.LastIndexOf("", StringComparison.Ordinal) < + tempLine.LastIndexOf("', start); + if (end > 0) + { + tempFontOn = tempLine.Substring(start, end - start + 1); + } + } + else if (tempLine.LastIndexOf("", StringComparison.Ordinal) >= 0) + { + tempFontOn = string.Empty; + } + + if (tempLine.Contains("") && !tempLine.Contains("")) + { + tempItalicOn = true; + } + + if (tempLine.Contains("") && !tempLine.Contains("")) + { + tempBoldOn = true; + } + + int w; + if (text.Contains("")) + { + tempItalicOn = false; + } + + if (line.Contains("")) + { + tempBoldOn = false; + } + } + } + else + { + foreach (var line in HtmlUtil.RemoveOpenCloseTags(text, HtmlUtil.TagItalic, HtmlUtil.TagFont).SplitToLines()) + { + if (parameter.JustifyRight) + { + var w = TextDraw.MeasureTextWidth(font, line, parameter.SubtitleFontBold); + widths.Add(w); + } + + if (parameter.AlignLeft) + { + lefts.Add(5); + } + else if (parameter.AlignRight) + { + lefts.Add(bmp.Width - (TextDraw.MeasureTextWidth(font, line, parameter.SubtitleFontBold) + 15)); + } + else + { + lefts.Add((float)((bmp.Width - TextDraw.MeasureTextWidth(font, line, parameter.SubtitleFontBold) + 15) / 2.0)); + } + } + } + + if (parameter.JustifyLeft) + { + // left justify centered lines + var minX = lefts.Min(p => p); + for (var index = 0; index < lefts.Count; index++) + { + lefts[index] = minX; + } + } + else if (parameter.JustifyRight) + { + // right justify centered lines + var maxX = widths.Max(p => p); + var minX = lefts.Min(p => p); + for (var index = 0; index < lefts.Count; index++) + { + lefts[index] = minX + maxX - widths[index]; + } + } + + var sf = new StringFormat { Alignment = StringAlignment.Near, LineAlignment = StringAlignment.Near }; + + using (var g = Graphics.FromImage(bmp)) + { + g.CompositingQuality = CompositingQuality.HighQuality; + g.InterpolationMode = InterpolationMode.HighQualityBicubic; + g.SmoothingMode = SmoothingMode.HighQuality; + g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; + + if (parameter.SimpleRendering) + { + if (text.StartsWith(" 0) + { + left = lefts[0]; + } + + float top = 5; + if (top < _boxBorderSize && parameter.BackgroundColor != Color.Transparent) + { + top = _boxBorderSize; // make text down so box border will be satisfied + } + + bool newLine = false; + int lineNumber = 0; + float leftMargin = left; + int newLinePathPoint = -1; + Color c = parameter.SubtitleColor; + var colorStack = new Stack(); + var fontStack = new Stack(); + var lastText = new StringBuilder(); + for (var i = 0; i < text.Length; i++) + { + if (text.Substring(i).StartsWith(" 0) + { + lastText.Append(sb); + TextDraw.DrawText(font, sf, path, sb, isItalic, isBold || parameter.SubtitleFontBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); + } + + addLeft = GetLastPositionFromPath(path, oldPathPointIndex, addLeft); + if (path.PointCount == 0) + { + addLeft = left; + } + else if (addLeft < 0.01) + { + addLeft = left + 2; + } + + left = addLeft; + + DrawShadowAndPath(parameter, g, path); + var p2 = new SolidBrush(c); + g.FillPath(p2, path); + p2.Dispose(); + path.Reset(); + path = new GraphicsPath(); + sb = new StringBuilder(); + + int endIndex = text.Substring(i).IndexOf('>'); + if (endIndex < 0) + { + i += 9999; + } + else + { + string fontContent = text.Substring(i, endIndex); + if (fontContent.Contains(" color=", StringComparison.OrdinalIgnoreCase)) + { + string[] arr = fontContent.Substring(fontContent.IndexOf(" color=", StringComparison.OrdinalIgnoreCase) + 7).Trim().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + if (arr.Length > 0) + { + string fontColor = arr[0].Trim('\'').Trim('"').Trim('\''); + try + { + colorStack.Push(c); // save old color + if (fontColor.StartsWith("rgb(", StringComparison.OrdinalIgnoreCase)) + { + arr = fontColor.Remove(0, 4).TrimEnd(')').Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + c = Color.FromArgb(int.Parse(arr[0]), int.Parse(arr[1]), int.Parse(arr[2])); + } + else + { + c = ColorTranslator.FromHtml(fontColor); + } + } + catch + { + c = parameter.SubtitleColor; + } + } + } + if (fontContent.Contains(" face=", StringComparison.OrdinalIgnoreCase) || fontContent.Contains(" size=", StringComparison.OrdinalIgnoreCase)) + { + float fontSize = parameter.SubtitleFontSize; + string fontFace = parameter.SubtitleFontName; + + string[] arr = fontContent.Substring(fontContent.IndexOf(" face=", StringComparison.OrdinalIgnoreCase) + 6).Trim().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + if (arr.Length > 0) + { + fontFace = arr[0].Trim('\'').Trim('"').Trim('\''); + } + + arr = fontContent.Substring(fontContent.IndexOf(" size=", StringComparison.OrdinalIgnoreCase) + 6).Trim().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + if (arr.Length > 0) + { + string temp = arr[0].Trim('\'').Trim('"').Trim('\''); + if (float.TryParse(temp, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var f)) + { + fontSize = f; + } + } + + try + { + fontStack.Push(font); // save old cfont + var p = new MakeBitmapParameter { SubtitleFontName = fontFace, SubtitleFontSize = fontSize }; + font = GetFont(p, p.SubtitleFontSize); + } + catch + { + font = fontStack.Pop(); + } + } + + + i += endIndex; + } + } + else if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase)) + { + if (text.Substring(i).ToLowerInvariant().Replace("", string.Empty).Replace("", string.Empty).Length > 0) + { + if (lastText.EndsWith(' ') && !sb.StartsWith(' ')) + { + string t = sb.ToString(); + sb.Clear(); + sb.Append(' '); + sb.Append(t); + } + + float addLeft = 0; + int oldPathPointIndex = path.PointCount - 1; + if (oldPathPointIndex < 0) + { + oldPathPointIndex = 0; + } + + if (sb.Length > 0) + { + if (lastText.Length > 0 && left > 2) + { + left -= 1.5f; + } + + lastText.Append(sb); + + TextDraw.DrawText(font, sf, path, sb, isItalic, isBold || parameter.SubtitleFontBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); + } + + addLeft = GetLastPositionFromPath(path, oldPathPointIndex, addLeft); + if (addLeft < 0.01) + { + addLeft = left + 2; + } + + left = addLeft; + + DrawShadowAndPath(parameter, g, path); + g.FillPath(new SolidBrush(c), path); + path.Reset(); + sb.Clear(); + if (colorStack.Count > 0) + { + c = colorStack.Pop(); + } + + if (left >= 3) + { + left -= 2.5f; + } + } + if (fontStack.Count > 0) + { + font.Dispose(); + font = fontStack.Pop(); + } + i += 6; + } + else if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase)) + { + if (sb.Length > 0) + { + float addLeft = 0; + int oldPathPointIndex = path.PointCount - 1; + if (oldPathPointIndex < 0) + { + oldPathPointIndex = 0; + } + + lastText.Append(sb); + TextDraw.DrawText(font, sf, path, sb, isItalic, isBold || parameter.SubtitleFontBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); + + addLeft = GetLastPositionFromPath(path, oldPathPointIndex, addLeft); + if (addLeft < 0.01) + { + addLeft = left + 2; + } + + left = addLeft; + } + isItalic = true; + i += 2; + } + else if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase) && isItalic) + { + if (lastText.EndsWith(' ') && !sb.StartsWith(' ')) + { + string t = sb.ToString(); + sb.Clear(); + sb.Append(' '); + sb.Append(t); + } + + if (sb.Length > 0) + { + float addLeft = 0; + int oldPathPointIndex = path.PointCount - 1; + if (oldPathPointIndex < 0) + { + oldPathPointIndex = 0; + } + + if (sb.Length > 0) + { + if (lastText.Length > 0 && left > 2) + { + left -= 1.5f; + } + + lastText.Append(sb); + TextDraw.DrawText(font, sf, path, sb, isItalic, isBold || parameter.SubtitleFontBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); + } + + addLeft = GetLastPositionFromPath(path, oldPathPointIndex, addLeft); + if (addLeft < 0.01) + { + addLeft = left + 2; + } + + left = addLeft; + } + + isItalic = false; + i += 3; + } + else if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase) && !isItalic) + { + i += 3; + } + else if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase)) + { + if (sb.Length > 0) + { + lastText.Append(sb); + TextDraw.DrawText(font, sf, path, sb, isItalic, isBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); + } + isBold = true; + i += 2; + } + else if (text.Substring(i).StartsWith("", StringComparison.OrdinalIgnoreCase) && isBold) + { + if (lastText.EndsWith(' ') && !sb.StartsWith(' ')) + { + string t = sb.ToString(); + sb.Clear(); + sb.Append(' '); + sb.Append(t); + } + + if (sb.Length > 0) + { + float addLeft = 0; + int oldPathPointIndex = path.PointCount - 1; + if (oldPathPointIndex < 0) + { + oldPathPointIndex = 0; + } + + if (sb.Length > 0) + { + if (lastText.Length > 0 && left > 2) + { + left -= 1.5f; + } + + lastText.Append(sb); + TextDraw.DrawText(font, sf, path, sb, isItalic, isBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); + } + + addLeft = GetLastPositionFromPath(path, oldPathPointIndex, addLeft); + if (addLeft < 0.01) + { + addLeft = left + 2; + } + + left = addLeft; + } + + isBold = false; + i += 3; + } + else if (text.Substring(i).StartsWith(Environment.NewLine, StringComparison.Ordinal)) + { + lastText.Append(sb); + TextDraw.DrawText(font, sf, path, sb, isItalic, isBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); + var style = GetStyleName(parameter.P); + var lineHeight = (int)Math.Round(textSize.Height * 0.64f); + if (parameter.LineHeight.ContainsKey(style)) + { + lineHeight = parameter.LineHeight[style]; + } + + top += lineHeight; + newLine = true; + i += Environment.NewLine.Length - 1; + lineNumber++; + if (lineNumber < lefts.Count) + { + leftMargin = lefts[lineNumber]; + left = leftMargin; + } + } + else + { + sb.Append(text[i]); + } + } + if (sb.Length > 0) + { + TextDraw.DrawText(font, sf, path, sb, isItalic, isBold || parameter.SubtitleFontBold, false, left, top, ref newLine, leftMargin, ref newLinePathPoint); + } + + DrawShadowAndPath(parameter, g, path); + g.FillPath(new SolidBrush(c), path); + } + } + sf.Dispose(); + + var nbmp = new NikseBitmap(bmp); + if (parameter.BackgroundColor == Color.Transparent) + { + nbmp.CropTransparentSidesAndBottom(baseLinePadding, true); + nbmp.CropTransparentSidesAndBottom(2, false); + } + else + { + nbmp.CropSidesAndBottom(_boxBorderSize, parameter.BackgroundColor, true); + nbmp.CropTop(_boxBorderSize, parameter.BackgroundColor); + } + + if (nbmp.Width > parameter.ScreenWidth) + { + parameter.Error = "#" + parameter.P.Number.ToString(CultureInfo.InvariantCulture) + ": " + nbmp.Width.ToString(CultureInfo.InvariantCulture) + " > " + parameter.ScreenWidth.ToString(CultureInfo.InvariantCulture); + } + + if (parameter.Type3D == 1) // Half-side-by-side 3D + { + Bitmap singleBmp = nbmp.GetBitmap(); + Bitmap singleHalfBmp = ScaleToHalfWidth(singleBmp); + singleBmp.Dispose(); + var sideBySideBmp = new Bitmap(parameter.ScreenWidth, singleHalfBmp.Height); + int singleWidth = parameter.ScreenWidth / 2; + int singleLeftMargin = (singleWidth - singleHalfBmp.Width) / 2; + + using (Graphics gSideBySide = Graphics.FromImage(sideBySideBmp)) + { + gSideBySide.DrawImage(singleHalfBmp, singleLeftMargin + parameter.Depth3D, 0); + gSideBySide.DrawImage(singleHalfBmp, singleWidth + singleLeftMargin - parameter.Depth3D, 0); + } + nbmp = new NikseBitmap(sideBySideBmp); + if (parameter.BackgroundColor == Color.Transparent) + { + nbmp.CropTransparentSidesAndBottom(2, true); + } + else + { + nbmp.CropSidesAndBottom(_boxBorderSize, parameter.BackgroundColor, true); + } + } + else if (parameter.Type3D == 2) // Half-Top/Bottom 3D + { + nbmp = Make3DTopBottom(parameter, nbmp); + } + return nbmp.GetBitmap(); + } + finally + { + font?.Dispose(); + bmp?.Dispose(); + } + } + + private static float GetLastPositionFromPath(GraphicsPath path, int oldPathPointIndex, float addLeft) + { + if (path.PointCount > 0) + { + var list = (PointF[])path.PathPoints.Clone(); // avoid using very slow path.PathPoints indexer!!! + for (int k = oldPathPointIndex + 1; k < list.Length; k++) + { + if (list[k].X > addLeft) + { + addLeft = list[k].X; + } + } + } + return addLeft; + } + + private static Point? GetAssPoint(string s) + { + int k = s.IndexOf("{\\", StringComparison.Ordinal); + while (k >= 0) + { + int l = s.IndexOf('}', k + 1); + if (l < k) + { + break; + } + + var assTags = s.Substring(k + 1, l - k - 1).Split('\\'); + foreach (var assTag in assTags) + { + if (assTag.StartsWith("pos(", StringComparison.Ordinal)) + { + var numbers = assTag.Remove(0, 4).TrimEnd(')').Trim().Split(','); + if (numbers.Length == 2 && Utilities.IsInteger(numbers[0]) && Utilities.IsInteger(numbers[1])) + { + return new Point(int.Parse(numbers[0]), int.Parse(numbers[1])); + } + } + } + k = s.IndexOf("{\\", k + 1, StringComparison.Ordinal); + } + return null; + } + + private static string AssToHtmlTagsIfKnow(string s) + { + int k = s.IndexOf("{\\", StringComparison.Ordinal); + while (k >= 0) + { + int l = s.IndexOf('}', k + 1); + if (l < k) + { + break; + } + + var assTags = s.Substring(k + 1, l - k - 1).Split('\\'); + var sb = new StringBuilder(); + foreach (var assTag in assTags) + { + if (assTag == "i1") + { + sb.Append(""); + } + else if (assTag == "i" || assTag == "i0") + { + sb.Append(""); + } + else if (assTag == "b1" || assTag == "b2" || assTag == "b3" || assTag == "b4") + { + sb.Append(""); + } + else if (assTag == "b" || assTag == "b0") + { + sb.Append(""); + } + } + s = s.Remove(k, l - k + 1); + s = s.Insert(k, sb.ToString()); + k = s.IndexOf("{\\", k, StringComparison.Ordinal); + } + return s; + } + + private static NikseBitmap Make3DTopBottom(MakeBitmapParameter parameter, NikseBitmap nbmp) + { + Bitmap singleBmp = nbmp.GetBitmap(); + Bitmap singleHalfBmp = ScaleToHalfHeight(singleBmp); + singleBmp.Dispose(); + var topBottomBmp = new Bitmap(parameter.ScreenWidth, parameter.ScreenHeight - parameter.BottomMargin); + int singleHeight = parameter.ScreenHeight / 2; + int leftM = (parameter.ScreenWidth / 2) - (singleHalfBmp.Width / 2); + + using (Graphics gTopBottom = Graphics.FromImage(topBottomBmp)) + { + gTopBottom.DrawImage(singleHalfBmp, leftM + parameter.Depth3D, singleHeight - singleHalfBmp.Height - parameter.BottomMargin); + gTopBottom.DrawImage(singleHalfBmp, leftM - parameter.Depth3D, parameter.ScreenHeight - parameter.BottomMargin - singleHalfBmp.Height); + } + nbmp = new NikseBitmap(topBottomBmp); + if (parameter.BackgroundColor == Color.Transparent) + { + nbmp.CropTop(2, Color.Transparent); + nbmp.CropTransparentSidesAndBottom(2, false); + } + else + { + nbmp.CropTop(_boxBorderSize, parameter.BackgroundColor); + nbmp.CropSidesAndBottom(_boxBorderSize, parameter.BackgroundColor, false); + } + return nbmp; + } + + private static void DrawShadowAndPath(MakeBitmapParameter parameter, Graphics g, GraphicsPath path) + { + if (parameter.ShadowWidth > 0) + { + var shadowAlpha = parameter.ShadowAlpha; + if (parameter.ShadowWidth > 1) + { + shadowAlpha = (int)Math.Round(shadowAlpha * 0.8); + } + + var shadowPath = (GraphicsPath)path.Clone(); + for (int k = 0; k < parameter.ShadowWidth; k++) + { + var translateMatrix = new Matrix(); + translateMatrix.Translate(1, 1); + shadowPath.Transform(translateMatrix); + + using (var p1 = new Pen(new SolidBrush(Color.FromArgb(shadowAlpha, parameter.ShadowColor)), parameter.BorderWidth)) + { + SetLineJoin(parameter.LineJoin, p1); + g.DrawPath(p1, shadowPath); + } + } + } + + if (parameter.BorderWidth > 0) + { + var p1 = new Pen(parameter.BorderColor, (float)(parameter.BorderWidth * 1.1)); + SetLineJoin(parameter.LineJoin, p1); + g.DrawPath(p1, path); + p1.Dispose(); + } + } + + private static void SetLineJoin(string lineJoin, Pen pen) + { + if (string.IsNullOrWhiteSpace(lineJoin)) + { + return; + } + + if (string.Compare(lineJoin, "Round", StringComparison.OrdinalIgnoreCase) == 0) + { + pen.LineJoin = LineJoin.Round; + } + else if (string.Compare(lineJoin, "Bevel", StringComparison.OrdinalIgnoreCase) == 0) + { + pen.LineJoin = LineJoin.Bevel; + } + else if (string.Compare(lineJoin, "Miter", StringComparison.OrdinalIgnoreCase) == 0) + { + pen.LineJoin = LineJoin.Miter; + } + else if (string.Compare(lineJoin, "MiterClipped", StringComparison.OrdinalIgnoreCase) == 0) + { + pen.LineJoin = LineJoin.MiterClipped; + } + } + + private static Bitmap ScaleToHalfWidth(Bitmap bmp) + { + int w = bmp.Width / 2; + var newImage = new Bitmap(w, bmp.Height); + using (var gr = Graphics.FromImage(newImage)) + { + gr.SmoothingMode = SmoothingMode.HighQuality; + gr.InterpolationMode = InterpolationMode.HighQualityBicubic; + gr.PixelOffsetMode = PixelOffsetMode.HighQuality; + gr.DrawImage(bmp, new Rectangle(0, 0, w, bmp.Height)); + } + return newImage; + } + + private static Bitmap ScaleToHalfHeight(Bitmap bmp) + { + int h = bmp.Height / 2; + var newImage = new Bitmap(bmp.Width, h); + using (var gr = Graphics.FromImage(newImage)) + { + gr.SmoothingMode = SmoothingMode.HighQuality; + gr.InterpolationMode = InterpolationMode.HighQualityBicubic; + gr.PixelOffsetMode = PixelOffsetMode.HighQuality; + gr.DrawImage(bmp, new Rectangle(0, 0, bmp.Width, h)); + } + return newImage; + } + + private bool _allowCustomBottomMargin; + + internal void Initialize(Subtitle subtitle, SubtitleFormat format, string exportType, string fileName, VideoInfo videoInfo, string videoFileName) + { + checkBoxFullFrameImage.Checked = false; + checkBoxFullFrameImage.Visible = false; + _exportType = exportType; + _fileName = fileName; + _format = format; + _formatName = _format != null ? _format.Name : string.Empty; + if (_formatName == AdvancedSubStationAlpha.NameOfFormat || _formatName == SubStationAlpha.NameOfFormat) + { + CalculateHeights(subtitle); + } + _videoFileName = videoFileName; + if (exportType == ExportFormats.BluraySup) + { + Text = "Blu-ray SUP"; + } + else if (exportType == ExportFormats.VobSub) + { + Text = "VobSub (sub/idx)"; + } + else if (exportType == ExportFormats.Fab) + { + Text = "FAB Image Script"; + } + else if (exportType == ExportFormats.ImageFrame) + { + Text = "Image per frame"; + } + else if (exportType == ExportFormats.Stl) + { + Text = "DVD Studio Pro STL"; + } + else if (exportType == ExportFormats.Fcp) + { + Text = "Final Cut Pro"; + } + else if (exportType == ExportFormats.Dost) + { + Text = ExportFormats.Dost; + } + else if (exportType == ExportFormats.Edl) + { + Text = ExportFormats.Edl; + } + else if (_exportType == ExportFormats.EdlClipName) + { + Text = "EDL/CLIPNAME"; + } + else if (exportType == ExportFormats.DCinemaInterop) + { + Text = "DCinema interop/png"; + } + else if (exportType == ExportFormats.DCinemaSmpte2014) + { + Text = "DCinema SMPTE 2014/png"; + } + else if (exportType == ExportFormats.Spumux) + { + Text = ExportFormats.Spumux; + } + else + { + Text = Configuration.Settings.Language.ExportPngXml.Title; + } + + if (_exportType == ExportFormats.VobSub && !string.IsNullOrEmpty(Configuration.Settings.Tools.ExportVobSubFontName)) + { + _subtitleFontName = Configuration.Settings.Tools.ExportVobSubFontName; + } + else if ((_exportType == ExportFormats.BluraySup || _exportType == ExportFormats.Dost) && !string.IsNullOrEmpty(Configuration.Settings.Tools.ExportBluRayFontName)) + { + _subtitleFontName = Configuration.Settings.Tools.ExportBluRayFontName; + } + else if (_exportType == ExportFormats.Fcp && !string.IsNullOrEmpty(Configuration.Settings.Tools.ExportFcpFontName)) + { + _subtitleFontName = Configuration.Settings.Tools.ExportFcpFontName; + } + else if (!string.IsNullOrEmpty(Configuration.Settings.Tools.ExportFontNameOther)) + { + _subtitleFontName = Configuration.Settings.Tools.ExportFontNameOther; + } + + if (_exportType == ExportFormats.VobSub && Configuration.Settings.Tools.ExportVobSubFontSize > 0) + { + _subtitleFontSize = Configuration.Settings.Tools.ExportVobSubFontSize; + } + else if ((_exportType == ExportFormats.BluraySup || _exportType == ExportFormats.Dost) && Configuration.Settings.Tools.ExportBluRayFontSize > 0) + { + _subtitleFontSize = Configuration.Settings.Tools.ExportBluRayFontSize; + } + else if (_exportType == ExportFormats.Fcp && Configuration.Settings.Tools.ExportFcpFontSize > 0) + { + _subtitleFontSize = Configuration.Settings.Tools.ExportFcpFontSize; + } + else if (Configuration.Settings.Tools.ExportLastFontSize > 0) + { + _subtitleFontSize = Configuration.Settings.Tools.ExportLastFontSize; + } + + if (_exportType == ExportFormats.Fcp) + { + comboBoxImageFormat.Items.Add("8-bit png"); + int i = 0; + foreach (string item in comboBoxImageFormat.Items) + { + if (item == Configuration.Settings.Tools.ExportFcpImageType) + { + comboBoxImageFormat.SelectedIndex = i; + break; + } + i++; + } + } + + if (_exportType == ExportFormats.VobSub) + { + comboBoxSubtitleFontSize.SelectedIndex = 7; + int i = 0; + foreach (string item in comboBoxSubtitleFontSize.Items) + { + if (item == Convert.ToInt32(_subtitleFontSize).ToString(CultureInfo.InvariantCulture)) + { + comboBoxSubtitleFontSize.SelectedIndex = i; + break; + } + i++; + } + checkBoxTransAntiAliase.Checked = Configuration.Settings.Tools.ExportVobAntiAliasingWithTransparency; + } + else if (_exportType == ExportFormats.BluraySup || _exportType == ExportFormats.Dost || _exportType == ExportFormats.Fcp) + { + comboBoxSubtitleFontSize.SelectedIndex = 16; + int i = 0; + foreach (string item in comboBoxSubtitleFontSize.Items) + { + if (item == Convert.ToInt32(_subtitleFontSize).ToString(CultureInfo.InvariantCulture)) + { + comboBoxSubtitleFontSize.SelectedIndex = i; + break; + } + i++; + } + } + else + { + comboBoxSubtitleFontSize.SelectedIndex = 16; + int i = 0; + foreach (string item in comboBoxSubtitleFontSize.Items) + { + if (item == Convert.ToInt32(_subtitleFontSize).ToString(CultureInfo.InvariantCulture)) + { + comboBoxSubtitleFontSize.SelectedIndex = i; + break; + } + i++; + } + } + + groupBoxImageSettings.Text = Configuration.Settings.Language.ExportPngXml.ImageSettings; + labelSubtitleFont.Text = Configuration.Settings.Language.ExportPngXml.FontFamily; + labelSubtitleFontSize.Text = Configuration.Settings.Language.ExportPngXml.FontSize; + labelResolution.Text = Configuration.Settings.Language.ExportPngXml.VideoResolution; + buttonColor.Text = Configuration.Settings.Language.ExportPngXml.FontColor; + checkBoxBold.Text = Configuration.Settings.Language.General.Bold; + checkBoxSimpleRender.Text = Configuration.Settings.Language.ExportPngXml.SimpleRendering; + checkBoxTransAntiAliase.Text = Configuration.Settings.Language.ExportPngXml.AntiAliasingWithTransparency; + labelResize.Text = Configuration.Settings.Language.General.Size; + normalToolStripMenuItem.Text = Configuration.Settings.Language.Main.Menu.ContextMenu.RemoveFormattingAll; + italicToolStripMenuItem.Text = Configuration.Settings.Language.General.Italic; + boxSingleLineToolStripMenuItem.Text = Configuration.Settings.Language.ExportPngXml.BoxSingleLine; + boxMultiLineToolStripMenuItem.Text = Configuration.Settings.Language.ExportPngXml.BoxMultiLine; + adjustTimeCodesToolStripMenuItem.Text = Configuration.Settings.Language.Main.Menu.Synchronization.AdjustAllTimes; + adjustDisplayTimeToolStripMenuItem.Text = Configuration.Settings.Language.Main.Menu.Tools.AdjustDisplayDuration; + + checkBoxFcpFullPathUrl.Text = Configuration.Settings.Language.ExportPngXml.FcpUseFullPathUrl; + checkBoxFcpFullPathUrl.Visible = exportType == ExportFormats.Fcp; + checkBoxFcpFullPathUrl.Checked = Configuration.Settings.Tools.ExportFcpFullPathUrl; + + + comboBox3D.Items.Clear(); + comboBox3D.Items.Add(Configuration.Settings.Language.General.None); + comboBox3D.Items.Add(Configuration.Settings.Language.ExportPngXml.SideBySide3D); + comboBox3D.Items.Add(Configuration.Settings.Language.ExportPngXml.HalfTopBottom3D); + comboBox3D.SelectedIndex = 0; + + labelDepth.Text = Configuration.Settings.Language.ExportPngXml.Depth; + + numericUpDownDepth3D.Left = labelDepth.Left + labelDepth.Width + 3; + + label3D.Text = Configuration.Settings.Language.ExportPngXml.Text3D; + + comboBox3D.Left = label3D.Left + label3D.Width + 3; + + buttonBorderColor.Text = Configuration.Settings.Language.ExportPngXml.BorderColor; + labelBorderWidth.Text = Configuration.Settings.Language.ExportPngXml.BorderStyle; + labelImageFormat.Text = Configuration.Settings.Language.ExportPngXml.ImageFormat; + checkBoxFullFrameImage.Text = Configuration.Settings.Language.ExportPngXml.FullFrameImage; + + buttonExport.Text = Configuration.Settings.Language.ExportPngXml.ExportAllLines; + buttonCancel.Text = Configuration.Settings.Language.General.Ok; + labelLanguage.Text = Configuration.Settings.Language.ChooseLanguage.Language; + labelFrameRate.Text = Configuration.Settings.Language.General.FrameRate; + labelHorizontalAlign.Text = Configuration.Settings.Language.ExportPngXml.Align; + labelBottomMargin.Text = Configuration.Settings.Language.ExportPngXml.BottomMargin; + labelLeftRightMargin.Text = Configuration.Settings.Language.ExportPngXml.LeftRightMargin; + + comboBoxHAlign.Items.Clear(); + comboBoxHAlign.Items.Add(Configuration.Settings.Language.ExportPngXml.Left); + comboBoxHAlign.Items.Add(Configuration.Settings.Language.ExportPngXml.Center); + comboBoxHAlign.Items.Add(Configuration.Settings.Language.ExportPngXml.Right); + comboBoxHAlign.Items.Add(Configuration.Settings.Language.ExportPngXml.CenterLeftJustify); + comboBoxHAlign.Items.Add(Configuration.Settings.Language.ExportPngXml.CenterTopJustify); + comboBoxHAlign.Items.Add(Configuration.Settings.Language.ExportPngXml.CenterRightJustify); + comboBoxHAlign.Items.Add(Configuration.Settings.Language.ExportPngXml.CenterLeftJustifyDialogs); + + buttonShadowColor.Text = Configuration.Settings.Language.ExportPngXml.ShadowColor; + labelShadowWidth.Text = Configuration.Settings.Language.ExportPngXml.ShadowWidth; + labelShadowTransparency.Text = Configuration.Settings.Language.ExportPngXml.Transparency; + labelLineHeight.Text = Configuration.Settings.Language.ExportPngXml.LineHeight; + + linkLabelPreview.Text = Configuration.Settings.Language.General.Preview; + linkLabelPreview.Left = groupBoxExportImage.Width - linkLabelPreview.Width - 3; + + saveImageAsToolStripMenuItem.Text = Configuration.Settings.Language.ExportPngXml.SaveImageAs; + + SubtitleListView1InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings); + UiUtil.InitializeSubtitleFont(subtitleListView1); + SubtitleListView1AutoSizeAllColumns(); + + _subtitle = new Subtitle(subtitle); + + panelColor.BackColor = _subtitleColor; + panelBorderColor.BackColor = _borderColor; + InitBorderStyle(); + comboBoxHAlign.SelectedIndex = 1; + comboBoxResolution.SelectedIndex = 3; + + if (Configuration.Settings.Tools.ExportLastShadowTransparency <= numericUpDownShadowTransparency.Maximum && Configuration.Settings.Tools.ExportLastShadowTransparency > 0) + { + numericUpDownShadowTransparency.Value = Configuration.Settings.Tools.ExportLastShadowTransparency; + } + + if ((_exportType == ExportFormats.BluraySup || _exportType == ExportFormats.Dost) && !string.IsNullOrEmpty(Configuration.Settings.Tools.ExportBluRayVideoResolution)) + { + SetResolution(Configuration.Settings.Tools.ExportBluRayVideoResolution); + } + + _language = LanguageAutoDetect.AutoDetectGoogleLanguageOrNull(subtitle); + if (exportType == ExportFormats.VobSub) + { + comboBoxBorderWidth.SelectedIndex = 6; + if (_exportType == ExportFormats.VobSub && !string.IsNullOrEmpty(Configuration.Settings.Tools.ExportVobSubVideoResolution)) + { + SetResolution(Configuration.Settings.Tools.ExportVobSubVideoResolution); + } + else + { + comboBoxResolution.SelectedIndex = 8; + } + + labelLanguage.Visible = true; + comboBoxLanguage.Visible = true; + comboBoxLanguage.Items.Clear(); + if (_language == null) + { + _language = Configuration.Settings.Tools.ExportVobSubLanguage; + } + + int index = -1; + foreach (var language in DvdSubtitleLanguage.CompliantLanguages) + { + int i = comboBoxLanguage.Items.Add(language); + if (language.Code == _language || index < 0 && language.Code == "en") + { + index = i; + } + } + comboBoxLanguage.SelectedIndex = index; + } + + bool showImageFormat = exportType == ExportFormats.Fab || exportType == ExportFormats.ImageFrame || exportType == ExportFormats.Stl || exportType == ExportFormats.Fcp || exportType == ExportFormats.BdnXml; + if (exportType == ExportFormats.Fab || exportType == ExportFormats.BluraySup || exportType == ExportFormats.Fcp) + { + checkBoxFullFrameImage.Visible = exportType == ExportFormats.Fab || exportType == ExportFormats.BluraySup || exportType == ExportFormats.Fcp; + } + else + { + checkBoxFullFrameImage.Checked = false; + } + + comboBoxImageFormat.Visible = showImageFormat; + labelImageFormat.Visible = showImageFormat; + labelFrameRate.Visible = exportType == ExportFormats.BdnXml || exportType == ExportFormats.BluraySup || exportType == ExportFormats.Dost || exportType == ExportFormats.ImageFrame; + comboBoxFrameRate.Visible = exportType == ExportFormats.BdnXml || exportType == ExportFormats.BluraySup || exportType == ExportFormats.Dost || exportType == ExportFormats.ImageFrame || exportType == ExportFormats.Fab || exportType == ExportFormats.Fcp; + checkBoxTransAntiAliase.Visible = exportType == ExportFormats.VobSub; + if (exportType == ExportFormats.BdnXml) + { + labelFrameRate.Top = labelLanguage.Top; + comboBoxFrameRate.Top = comboBoxLanguage.Top; + comboBoxFrameRate.Items.Add("23.976"); + comboBoxFrameRate.Items.Add("24"); + comboBoxFrameRate.Items.Add("25"); + comboBoxFrameRate.Items.Add("29.97"); + comboBoxFrameRate.Items.Add("30"); + comboBoxFrameRate.Items.Add("50"); + comboBoxFrameRate.Items.Add("59.94"); + comboBoxFrameRate.Items.Add("60"); + comboBoxFrameRate.SelectedIndex = 2; + + comboBoxImageFormat.Items.Clear(); + comboBoxImageFormat.Items.Add("Png 32-bit"); + comboBoxImageFormat.Items.Add("Png 8-bit"); + if (comboBoxImageFormat.Items[1].ToString() == Configuration.Settings.Tools.ExportBdnXmlImageType) + { + comboBoxImageFormat.SelectedIndex = 1; + } + else + { + comboBoxImageFormat.SelectedIndex = 0; + } + } + else if (exportType == ExportFormats.Dost) + { + labelFrameRate.Top = labelLanguage.Top; + comboBoxFrameRate.Top = comboBoxLanguage.Top; + comboBoxFrameRate.Items.Add("23.98"); + comboBoxFrameRate.Items.Add("24"); + comboBoxFrameRate.Items.Add("25"); + comboBoxFrameRate.Items.Add("29.97"); + comboBoxFrameRate.Items.Add("30"); + comboBoxFrameRate.Items.Add("59.94"); + comboBoxFrameRate.Items.Add("60"); + comboBoxFrameRate.SelectedIndex = 2; + } + else if (exportType == ExportFormats.ImageFrame) + { + labelFrameRate.Top = labelLanguage.Top; + comboBoxFrameRate.Top = comboBoxLanguage.Top; + comboBoxFrameRate.Items.Add("23.976"); + comboBoxFrameRate.Items.Add("24"); + comboBoxFrameRate.Items.Add("25"); + comboBoxFrameRate.Items.Add("29.97"); + comboBoxFrameRate.Items.Add("30"); + comboBoxFrameRate.Items.Add("50"); + comboBoxFrameRate.Items.Add("59.94"); + comboBoxFrameRate.Items.Add("60"); + comboBoxFrameRate.SelectedIndex = 2; + } + else if (exportType == ExportFormats.BluraySup) + { + labelFrameRate.Top = labelLanguage.Top; + comboBoxFrameRate.Top = comboBoxLanguage.Top; + comboBoxFrameRate.Items.Add("23.976"); + comboBoxFrameRate.Items.Add("24"); + comboBoxFrameRate.Items.Add("25"); + comboBoxFrameRate.Items.Add("29.97"); + comboBoxFrameRate.Items.Add("30"); + comboBoxFrameRate.Items.Add("50"); + comboBoxFrameRate.Items.Add("59.94"); + comboBoxFrameRate.Items.Add("60"); + comboBoxFrameRate.SelectedIndex = 1; + comboBoxFrameRate.DropDownStyle = ComboBoxStyle.DropDownList; + + checkBoxFullFrameImage.Top = comboBoxImageFormat.Top + 2; + panelFullFrameBackground.Top = checkBoxFullFrameImage.Top; + } + else if (exportType == ExportFormats.Fab) + { + labelFrameRate.Visible = true; + comboBoxFrameRate.Items.Add("23.976"); + comboBoxFrameRate.Items.Add("24"); + comboBoxFrameRate.Items.Add("25"); + comboBoxFrameRate.Items.Add("29.97"); + comboBoxFrameRate.Items.Add("30"); + comboBoxFrameRate.Items.Add("50"); + comboBoxFrameRate.Items.Add("59.94"); + comboBoxFrameRate.Items.Add("60"); + comboBoxFrameRate.SelectedIndex = 1; + comboBoxFrameRate.DropDownStyle = ComboBoxStyle.DropDownList; + } + else if (exportType == ExportFormats.Fcp) + { + labelFrameRate.Visible = true; + comboBoxFrameRate.Items.Add("23.976"); + comboBoxFrameRate.Items.Add("24"); + comboBoxFrameRate.Items.Add("25"); + comboBoxFrameRate.Items.Add("29.97"); + comboBoxFrameRate.Items.Add("30"); + comboBoxFrameRate.Items.Add("50"); + comboBoxFrameRate.Items.Add("59.94"); + comboBoxFrameRate.Items.Add("60"); + comboBoxFrameRate.SelectedIndex = 2; + comboBoxFrameRate.DropDownStyle = ComboBoxStyle.DropDownList; + + checkBoxFullFrameImage.Top = comboBoxFrameRate.Top + comboBoxFrameRate.Height + 5; + panelFullFrameBackground.Top = checkBoxFullFrameImage.Top; + } + if (comboBoxFrameRate.Items.Count >= 2) + { + SetLastFrameRate(Configuration.Settings.Tools.ExportLastFrameRate); + } + checkBoxFullFrameImage.Checked = Configuration.Settings.Tools.ExportFullFrame; + panelShadowColor.BackColor = Configuration.Settings.Tools.ExportShadowColor; + + comboBoxBottomMarginUnit.SelectedIndex = Configuration.Settings.Tools.ExportBottomMarginUnit == "%" ? 0 : 1; + comboBoxLeftRightMarginUnit.SelectedIndex = Configuration.Settings.Tools.ExportLeftRightMarginUnit == "%" ? 0 : 1; + + _allowCustomBottomMargin = _exportType == ExportFormats.BluraySup || _exportType == ExportFormats.VobSub || _exportType == ExportFormats.ImageFrame || _exportType == ExportFormats.BdnXml || _exportType == ExportFormats.Dost || _exportType == ExportFormats.Fab || _exportType == ExportFormats.Edl || _exportType == ExportFormats.EdlClipName; + if (_allowCustomBottomMargin) + { + comboBoxBottomMarginUnit.Visible = true; + comboBoxBottomMargin.Visible = true; + labelBottomMargin.Visible = true; + + comboBoxLeftRightMarginUnit.Visible = true; + comboBoxLeftRightMargin.Visible = true; + labelLeftRightMargin.Visible = true; + comboBoxBottomMarginUnit_SelectedIndexChanged(null, null); + } + else + { + comboBoxBottomMarginUnit.Visible = false; + comboBoxBottomMargin.Visible = false; + labelBottomMargin.Visible = false; + + comboBoxLeftRightMarginUnit.Visible = false; + comboBoxLeftRightMargin.Visible = false; + labelLeftRightMargin.Visible = false; + } + + checkBoxSkipEmptyFrameAtStart.Visible = exportType == ExportFormats.ImageFrame; + + foreach (var x in FontFamily.Families) + { + if (x.IsStyleAvailable(FontStyle.Regular) || x.IsStyleAvailable(FontStyle.Bold)) + { + comboBoxSubtitleFont.Items.Add(x.Name); + if (x.Name.Equals(_subtitleFontName, StringComparison.OrdinalIgnoreCase)) + { + comboBoxSubtitleFont.SelectedIndex = comboBoxSubtitleFont.Items.Count - 1; + } + } + } + if (comboBoxSubtitleFont.SelectedIndex == -1) + { + comboBoxSubtitleFont.SelectedIndex = 0; // take first font if default font was not found (e.g. linux) + } + + if (videoInfo != null && videoInfo.Height > 0 && videoInfo.Width > 0) + { + comboBoxResolution.Items[comboBoxResolution.Items.Count - 1] = videoInfo.Width + "x" + videoInfo.Height; + comboBoxResolution.SelectedIndex = comboBoxResolution.Items.Count - 1; + } + + if (_lineHeights != null && _lineHeights.Count > 0) + { + numericUpDownLineSpacing.Value = _lineHeights.First().Value; + } + else if (Math.Abs(_subtitleFontSize - Configuration.Settings.Tools.ExportLastFontSize) < 0.01 && Configuration.Settings.Tools.ExportLastLineHeight >= numericUpDownLineSpacing.Minimum && + Configuration.Settings.Tools.ExportLastLineHeight <= numericUpDownLineSpacing.Maximum && Configuration.Settings.Tools.ExportLastLineHeight > 0) + { + numericUpDownLineSpacing.Value = Configuration.Settings.Tools.ExportLastLineHeight; + } + else + { + var lineHeight = (int)Math.Round(GetFontHeight() * 0.64f); + if (lineHeight >= numericUpDownLineSpacing.Minimum && + lineHeight <= numericUpDownLineSpacing.Maximum) + { + numericUpDownLineSpacing.Value = lineHeight; + } + } + + if (Configuration.Settings.Tools.ExportLastBorderWidth >= 0 && Configuration.Settings.Tools.ExportLastBorderWidth < comboBoxBorderWidth.Items.Count) + { + try + { + comboBoxBorderWidth.SelectedIndex = Configuration.Settings.Tools.ExportLastBorderWidth; + } + catch + { + // ignore error + } + } + _borderWidth = GetBorderWidth(); + checkBoxBold.Checked = Configuration.Settings.Tools.ExportLastFontBold; + _subtitleFontBold = Configuration.Settings.Tools.ExportLastFontBold; + + if (Configuration.Settings.Tools.Export3DType >= 0 && Configuration.Settings.Tools.Export3DType < comboBox3D.Items.Count) + { + comboBox3D.SelectedIndex = Configuration.Settings.Tools.Export3DType; + } + + if (Configuration.Settings.Tools.Export3DDepth >= numericUpDownDepth3D.Minimum && Configuration.Settings.Tools.Export3DDepth <= numericUpDownDepth3D.Maximum) + { + numericUpDownDepth3D.Value = Configuration.Settings.Tools.Export3DDepth; + } + + if (Configuration.Settings.Tools.ExportHorizontalAlignment >= 0 && Configuration.Settings.Tools.ExportHorizontalAlignment < comboBoxHAlign.Items.Count) + { + comboBoxHAlign.SelectedIndex = Configuration.Settings.Tools.ExportHorizontalAlignment; + } + + if (exportType == ExportFormats.DCinemaInterop || exportType == ExportFormats.DCinemaSmpte2014) + { + comboBox3D.Visible = false; + numericUpDownDepth3D.Enabled = true; + labelDepth.Enabled = true; + labelDepth.Text = Configuration.Settings.Language.DCinemaProperties.ZPosition; + } + + if (_exportType == ExportFormats.Fcp) + { + comboBoxResolution.Items.Clear(); + comboBoxResolution.Items.Add("NTSC-601"); + comboBoxResolution.Items.Add("PAL-601"); + comboBoxResolution.Items.Add("square"); + comboBoxResolution.Items.Add("DVCPROHD-720P"); + comboBoxResolution.Items.Add("HD-(960x720)"); + comboBoxResolution.Items.Add("DVCPROHD-1080i60"); + comboBoxResolution.Items.Add("HD-(1280x1080)"); + comboBoxResolution.Items.Add("FullHD 1920x1080"); + comboBoxResolution.Items.Add("DVCPROHD-1080i50"); + comboBoxResolution.Items.Add("HD-(1440x1080)"); + comboBoxResolution.SelectedIndex = 7; // FullHD + if (_exportType == ExportFormats.Fcp && !string.IsNullOrEmpty(Configuration.Settings.Tools.ExportFcpVideoResolution)) + { + SetResolution(Configuration.Settings.Tools.ExportFcpVideoResolution); + } + + buttonCustomResolution.Visible = true; // we still allow for custom resolutions + + labelLanguage.Text = "NTSC/PAL"; + comboBoxLanguage.Items.Clear(); + comboBoxLanguage.Items.Add("PAL"); + comboBoxLanguage.Items.Add("NTSC"); + comboBoxLanguage.SelectedIndex = 0; + comboBoxLanguage.Visible = true; + labelLanguage.Visible = true; + if (Configuration.Settings.Tools.ExportFcpPalNtsc == "NTSC") + { + comboBoxLanguage.SelectedIndex = 1; + } + } + + comboBoxShadowWidth.SelectedIndex = 0; + bool shadowVisible = _exportType == ExportFormats.BdnXml || _exportType == ExportFormats.BluraySup || _exportType == ExportFormats.Dost || _exportType == ExportFormats.ImageFrame || _exportType == ExportFormats.Fcp || _exportType == ExportFormats.DCinemaInterop || exportType == ExportFormats.DCinemaSmpte2014 || _exportType == ExportFormats.Edl || _exportType == ExportFormats.EdlClipName; + labelShadowWidth.Visible = shadowVisible; + buttonShadowColor.Visible = shadowVisible; + comboBoxShadowWidth.Visible = shadowVisible; + if (shadowVisible && Configuration.Settings.Tools.ExportBluRayShadow < comboBoxShadowWidth.Items.Count) + { + comboBoxShadowWidth.SelectedIndex = Configuration.Settings.Tools.ExportBluRayShadow; + } + + panelShadowColor.Visible = shadowVisible; + labelShadowTransparency.Visible = shadowVisible; + numericUpDownShadowTransparency.Visible = shadowVisible; + + + if (checkBoxSimpleRender.Enabled) + { + checkBoxSimpleRender.Checked = Configuration.Settings.Tools.ExportVobSubSimpleRendering || _language == "ar"; + } + + if (exportType == ExportFormats.BluraySup || exportType == ExportFormats.VobSub || exportType == ExportFormats.BdnXml) + { + subtitleListView1.CheckBoxes = true; + subtitleListView1.Columns.Insert(0, Configuration.Settings.Language.ExportPngXml.Forced); + SubtitleListView1Fill(_subtitle); + if (_vobSubOcr != null) + { + for (int index = 0; index < _subtitle.Paragraphs.Count; index++) + { + if (_vobSubOcr.GetIsForced(index)) + { + subtitleListView1.Items[index].Checked = true; + } + } + } + + SubtitleListView1SelectIndexAndEnsureVisible(0); + } + else + { + SubtitleListView1Fill(_subtitle); + SubtitleListView1SelectIndexAndEnsureVisible(0); + } + } + + private float GetFontHeight() + { + var mbp = new MakeBitmapParameter + { + SubtitleFontName = _subtitleFontName, + SubtitleFontSize = float.Parse(comboBoxSubtitleFontSize.SelectedItem.ToString()), + SubtitleFontBold = _subtitleFontBold + }; + var fontSize = (float)TextDraw.GetFontSize(mbp.SubtitleFontSize); + using (var font = GetFont(mbp, fontSize)) + using (var bmp = new Bitmap(100, 100)) + using (var g = Graphics.FromImage(bmp)) + { + var textSize = g.MeasureString("Hj!", font); + return textSize.Height; + } + } + + private void CalculateHeights(Subtitle subtitle) + { + foreach (var paragraph in subtitle.Paragraphs) + { + var styleName = paragraph.Extra; + if (!string.IsNullOrEmpty(paragraph.Extra) && !_lineHeights.ContainsKey(styleName)) + { + var style = AdvancedSubStationAlpha.GetSsaStyle(paragraph.Extra, subtitle.Header); + using (var bmp = new Bitmap(100, 100)) + { + using (var g = Graphics.FromImage(bmp)) + { + var mbp = new MakeBitmapParameter + { + SubtitleFontName = style.FontName, + SubtitleFontSize = style.FontSize, + SubtitleFontBold = style.Bold + }; + var fontSize = (float)TextDraw.GetFontSize(mbp.SubtitleFontSize); + Font font = GetFont(mbp, fontSize); + SizeF textSize = g.MeasureString("Hj!", font); + int lineHeight = (int)Math.Round(textSize.Height * 0.64f); + if (fontSize < 30) + { + lineHeight = (int)Math.Round(textSize.Height * 0.69f); + } + + _lineHeights.Add(styleName, lineHeight); + } + } + } + } + } + + private void InitBorderStyle() + { + comboBoxBorderWidth.Items.Clear(); + comboBoxBorderWidth.Items.Add(Configuration.Settings.Language.ExportPngXml.BorderStyleBoxForEachLine); + comboBoxBorderWidth.Items.Add(Configuration.Settings.Language.ExportPngXml.BorderStyleOneBox); + for (int i = 0; i < 16; i++) + { + comboBoxBorderWidth.Items.Add(string.Format(Configuration.Settings.Language.ExportPngXml.BorderStyleNormalWidthX, i)); + } + comboBoxBorderWidth.SelectedIndex = 4; + } + + private void SetLastFrameRate(double lastFrameRate) + { + for (int i = 0; i < comboBoxFrameRate.Items.Count; i++) + { + if (double.TryParse(comboBoxFrameRate.Items[i].ToString().Replace(',', '.').Replace(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, "."), NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var d)) + { + if (Math.Abs(lastFrameRate - d) < 0.01) + { + comboBoxFrameRate.SelectedIndex = i; + return; + } + } + } + } + + internal void SetResolution(Point resolution) + { + comboBoxResolution.Items.Add(resolution.X + "x" + resolution.Y); + comboBoxResolution.SelectedIndex = comboBoxResolution.Items.Count - 1; + } + + internal void InitializeFromVobSubOcr(Subtitle subtitle, SubtitleFormat format, string exportType, string fileName, IBinaryParagraphList vobSubOcr, string languageString) + { + _vobSubOcr = vobSubOcr; + if (_vobSubOcr != null && exportType != ExportFormats.VobSub) + { + comboBoxResizePercentage.Items.Clear(); + for (int i = 50; i < 400; i++) + { + comboBoxResizePercentage.Items.Add(i + "%"); + } + comboBoxResizePercentage.Items.Add("500%"); + comboBoxResizePercentage.SelectedIndex = 50; + comboBoxResizePercentage.Visible = true; + labelResize.Visible = true; + labelResize.Left = buttonColor.Left; + labelResize.Top = buttonColor.Top; + comboBoxResizePercentage.Left = labelResize.Left + labelResize.Width + 5; + comboBoxResizePercentage.Top = labelResize.Top - 4; + } + else + { + comboBoxResizePercentage.Visible = false; + labelResize.Visible = false; + } + + Initialize(subtitle, format, exportType, fileName, null, _videoFileName); + + //set language + if (!string.IsNullOrEmpty(languageString)) + { + if (languageString.Contains('(') && languageString[0] != '(') + { + languageString = languageString.Substring(0, languageString.IndexOf('(') - 1).Trim(); + } + + for (int i = 0; i < comboBoxLanguage.Items.Count; i++) + { + string l = comboBoxLanguage.Items[i].ToString(); + if (l == languageString) + { + comboBoxLanguage.SelectedIndex = i; + break; + } + } + } + + //Disable options not available when exporting existing images + comboBoxSubtitleFont.Enabled = false; + comboBoxSubtitleFontSize.Enabled = false; + + buttonColor.Visible = false; + panelColor.Visible = false; + checkBoxBold.Visible = false; + checkBoxSimpleRender.Visible = false; + comboBox3D.Enabled = false; + numericUpDownDepth3D.Enabled = false; + + buttonBorderColor.Visible = false; + panelBorderColor.Visible = false; + labelBorderWidth.Visible = false; + comboBoxBorderWidth.Visible = false; + + buttonShadowColor.Visible = false; + panelShadowColor.Visible = false; + labelShadowWidth.Visible = false; + comboBoxShadowWidth.Visible = false; + labelShadowTransparency.Visible = false; + numericUpDownShadowTransparency.Visible = false; + labelLineHeight.Visible = false; + numericUpDownLineSpacing.Visible = false; + } + + private void subtitleListView1_SelectedIndexChanged(object sender, EventArgs e) + { + if (_isLoading) + { + return; + } + + _previewTimer.Stop(); + UpdateLineSpacing(); + _previewTimer.Start(); + } + + internal int GetBottomMarginInPixels(Paragraph p) + { + if (!_allowCustomBottomMargin) + { + return 20; + } + + if (!string.IsNullOrEmpty(p?.Extra) && (_formatName == AdvancedSubStationAlpha.NameOfFormat || _formatName == SubStationAlpha.NameOfFormat)) + { + var style = AdvancedSubStationAlpha.GetSsaStyle(p.Extra, _subtitle.Header); + return style.MarginVertical; + } + + var s = comboBoxBottomMargin.Text; + if (comboBoxBottomMarginUnit.SelectedIndex == 0) // % + { + GetResolution(out _, out var height); + return (int)Math.Round(int.Parse(s.TrimEnd('%')) / 100.0 * height); + } + + // pixels + return int.Parse(s); + } + + private int GetLeftMarginInPixels(Paragraph p) + { + if (!string.IsNullOrEmpty(p?.Extra) && (_formatName == AdvancedSubStationAlpha.NameOfFormat || _formatName == SubStationAlpha.NameOfFormat)) + { + var style = AdvancedSubStationAlpha.GetSsaStyle(p.Extra, _subtitle.Header); + return style.MarginLeft; + } + + var s = comboBoxLeftRightMargin.Text; + if (comboBoxLeftRightMarginUnit.SelectedIndex == 0) // % + { + GetResolution(out var width, out _); + return (int)Math.Round(int.Parse(s) / 100.0 * width); + } + + // pixels + return int.Parse(s); + } + + private int GetRightMarginInPixels(Paragraph p) + { + if (!string.IsNullOrEmpty(p?.Extra) && (_formatName == AdvancedSubStationAlpha.NameOfFormat || _formatName == SubStationAlpha.NameOfFormat)) + { + var style = AdvancedSubStationAlpha.GetSsaStyle(p.Extra, _subtitle.Header); + return style.MarginRight; + } + return GetLeftMarginInPixels(p); + } + + + + private void GeneratePreview() + { + SetupImageParameters(); + if (subtitleListView1.SelectedItems.Count > 0) + { + var p = _subtitle.GetParagraphOrDefault(subtitleListView1.SelectedItems[0].Index); + if (p == null) + { + return; + } + var bmp = GenerateImageFromTextWithStyle(p, out var mbp); + if (checkBoxFullFrameImage.Checked) + { + var nbmp = new NikseBitmap(bmp); + nbmp.ReplaceTransparentWith(panelFullFrameBackground.BackColor); + bmp.Dispose(); + bmp = nbmp.GetBitmap(); + } + else + { + groupBoxExportImage.BackColor = DefaultBackColor; + } + pictureBox1.Image = bmp; + + int w = groupBoxExportImage.Width - 4; + pictureBox1.Width = bmp.Width; + pictureBox1.Height = bmp.Height; + pictureBox1.Top = groupBoxExportImage.Height - bmp.Height - GetBottomMarginInPixels(p); + pictureBox1.Left = (w - bmp.Width) / 2; + var alignment = GetAlignmentFromParagraph(mbp, _format, _subtitle); + + // fix alignment from UI + if (comboBoxHAlign.Visible && alignment == ContentAlignment.BottomCenter && _format.GetType() != typeof(AdvancedSubStationAlpha) && _format.GetType() != typeof(SubStationAlpha)) + { + if (comboBoxHAlign.SelectedIndex == 0) + { + alignment = ContentAlignment.BottomLeft; + } + else if (comboBoxHAlign.SelectedIndex == 2) + { + alignment = ContentAlignment.BottomRight; + } + } + + if (comboBoxHAlign.Visible) + { + if (comboBoxLeftRightMargin.Visible) + { + if (alignment == ContentAlignment.BottomLeft || alignment == ContentAlignment.MiddleLeft || alignment == ContentAlignment.TopLeft) + { + pictureBox1.Left = GetLeftMarginInPixels(p); + } + else if (alignment == ContentAlignment.BottomRight || alignment == ContentAlignment.MiddleRight || alignment == ContentAlignment.TopRight) + { + pictureBox1.Left = w - bmp.Width - GetRightMarginInPixels(p); + } + } + + if (alignment == ContentAlignment.MiddleLeft || alignment == ContentAlignment.MiddleCenter || alignment == ContentAlignment.MiddleRight) + { + pictureBox1.Top = (groupBoxExportImage.Height - 4 - bmp.Height) / 2; + } + else if (_allowCustomBottomMargin && alignment == ContentAlignment.TopLeft || alignment == ContentAlignment.TopCenter || alignment == ContentAlignment.TopRight) + { + pictureBox1.Top = GetBottomMarginInPixels(p); + } + } + if (bmp.Width > groupBoxExportImage.Width + 20 || bmp.Height > groupBoxExportImage.Height + 20) + { + pictureBox1.Left = 5; + pictureBox1.Top = 20; + pictureBox1.Width = groupBoxExportImage.Width - 10; + pictureBox1.Height = groupBoxExportImage.Height - 30; + pictureBox1.SizeMode = PictureBoxSizeMode.Zoom; + } + else + { + pictureBox1.SizeMode = PictureBoxSizeMode.Normal; + } + groupBoxExportImage.Text = $"{bmp.Width}x{bmp.Height}"; + if (!string.IsNullOrEmpty(mbp.Error)) + { + groupBoxExportImage.BackColor = Color.Red; + groupBoxExportImage.Text = groupBoxExportImage.Text + " - " + mbp.Error; + } + else + { + if (checkBoxFullFrameImage.Checked) + { + groupBoxExportImage.BackColor = panelFullFrameBackground.BackColor; + } + else + { + groupBoxExportImage.BackColor = groupBoxImageSettings.BackColor; + } + } + } + } + + private void buttonColor_Click(object sender, EventArgs e) + { + bool showAlpha = _exportType == ExportFormats.Fab || _exportType == ExportFormats.BdnXml; + using (var colorChooser = new ColorChooser { Color = panelColor.BackColor, ShowAlpha = showAlpha }) + { + if (colorChooser.ShowDialog() == DialogResult.OK) + { + panelColor.BackColor = colorChooser.Color; + subtitleListView1_SelectedIndexChanged(null, null); + } + } + } + + private void panelColor_MouseClick(object sender, MouseEventArgs e) + { + buttonColor_Click(null, null); + } + + private void buttonBorderColor_Click(object sender, EventArgs e) + { + using (var colorChooser = new ColorChooser { Color = panelBorderColor.BackColor }) + { + if (colorChooser.ShowDialog() == DialogResult.OK) + { + panelBorderColor.BackColor = colorChooser.Color; + subtitleListView1_SelectedIndexChanged(null, null); + } + } + } + + private void panelBorderColor_MouseClick(object sender, MouseEventArgs e) + { + buttonBorderColor_Click(null, null); + } + + private void comboBoxSubtitleFont_SelectedValueChanged(object sender, EventArgs e) + { + subtitleListView1_SelectedIndexChanged(null, null); + } + + private void comboBoxSubtitleFontSize_SelectedIndexChanged(object sender, EventArgs e) + { + if (_isLoading) + { + return; + } + + if (_formatName != AdvancedSubStationAlpha.NameOfFormat && _formatName != SubStationAlpha.NameOfFormat && + comboBoxSubtitleFontSize.Enabled) + { + var lineHeight = (int)Math.Round(GetFontHeight() * 0.64f); + if (lineHeight >= numericUpDownLineSpacing.Minimum && + lineHeight <= numericUpDownLineSpacing.Maximum) + { + numericUpDownLineSpacing.Value = lineHeight; + } + } + subtitleListView1_SelectedIndexChanged(null, null); + } + + private void UpdateLineSpacing() + { + var style = string.Empty; + if (subtitleListView1.SelectedIndices.Count > 0) + { + style = GetStyleName(_subtitle.Paragraphs[subtitleListView1.SelectedItems[0].Index]); + if (!string.IsNullOrEmpty(style) && _lineHeights.ContainsKey(style)) + { + numericUpDownLineSpacing.Value = _lineHeights[style]; + } + } + labelLineHeightStyle.Text = style; + } + + private void comboBoxBorderWidth_SelectedIndexChanged(object sender, EventArgs e) + { + subtitleListView1_SelectedIndexChanged(null, null); + } + + private void checkBoxAntiAlias_CheckedChanged(object sender, EventArgs e) + { + subtitleListView1_SelectedIndexChanged(null, null); + } + + private void ExportPngXml_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + else if (e.KeyCode == UiUtil.HelpKeys) + { + Utilities.ShowHelp("#export"); + e.SuppressKeyPress = true; + } + else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.G && subtitleListView1.Items.Count > 1) + { + using (var goToLine = new GoToLine()) + { + goToLine.Initialize(1, subtitleListView1.Items.Count); + if (goToLine.ShowDialog(this) == DialogResult.OK) + { + subtitleListView1.Items[goToLine.LineNumber - 1].Selected = true; + subtitleListView1.Items[goToLine.LineNumber - 1].EnsureVisible(); + subtitleListView1.Items[goToLine.LineNumber - 1].Focused = true; + } + } + } + } + + private void ExportPngXml_Shown(object sender, EventArgs e) + { + _isLoading = false; + subtitleListView1_SelectedIndexChanged(null, null); + } + + private void comboBoxHAlign_SelectedIndexChanged(object sender, EventArgs e) + { + subtitleListView1_SelectedIndexChanged(null, null); + } + + private void checkBoxBold_CheckedChanged(object sender, EventArgs e) + { + subtitleListView1_SelectedIndexChanged(null, null); + } + + private void buttonCustomResolution_Click(object sender, EventArgs e) + { + using (var cr = new ChooseResolution()) + { + if (cr.ShowDialog(this) == DialogResult.OK) + { + comboBoxResolution.Items[comboBoxResolution.Items.Count - 1] = cr.VideoWidth + "x" + cr.VideoHeight; + comboBoxResolution.SelectedIndex = comboBoxResolution.Items.Count - 1; + } + } + } + + private void ExportPngXml_ResizeEnd(object sender, EventArgs e) + { + subtitleListView1_SelectedIndexChanged(null, null); + subtitleListView1.Columns[subtitleListView1.Columns.Count - 1].Width = -2; + } + + private void comboBoxBottomMargin_SelectedIndexChanged(object sender, EventArgs e) + { + subtitleListView1_SelectedIndexChanged(null, null); + } + + private void comboBoxResolution_SelectedIndexChanged(object sender, EventArgs e) + { + subtitleListView1_SelectedIndexChanged(null, null); + } + + private void ExportPngXml_SizeChanged(object sender, EventArgs e) + { + subtitleListView1_SelectedIndexChanged(null, null); + subtitleListView1.Columns[subtitleListView1.Columns.Count - 1].Width = -2; + } + + private void ExportPngXml_FormClosing(object sender, FormClosingEventArgs e) + { + GetResolution(out var width, out var height); + string res = $"{width}x{height}"; + + if (_exportType == ExportFormats.VobSub) + { + Configuration.Settings.Tools.ExportVobSubFontName = _subtitleFontName; + Configuration.Settings.Tools.ExportVobSubFontSize = (int)_subtitleFontSize; + Configuration.Settings.Tools.ExportVobSubVideoResolution = res; + Configuration.Settings.Tools.ExportVobSubLanguage = comboBoxLanguage.Text; + Configuration.Settings.Tools.ExportVobAntiAliasingWithTransparency = checkBoxTransAntiAliase.Checked; + } + else if (_exportType == ExportFormats.BluraySup || _exportType == ExportFormats.Dost) + { + Configuration.Settings.Tools.ExportBluRayFontName = _subtitleFontName; + Configuration.Settings.Tools.ExportBluRayFontSize = (int)_subtitleFontSize; + Configuration.Settings.Tools.ExportBluRayVideoResolution = res; + } + else if (_exportType == ExportFormats.BdnXml || _exportType == ExportFormats.Fcp) + { + Configuration.Settings.Tools.ExportBdnXmlImageType = comboBoxImageFormat.SelectedItem.ToString(); + } + if (_exportType == ExportFormats.Fcp) + { + Configuration.Settings.Tools.ExportFcpFontName = _subtitleFontName; + Configuration.Settings.Tools.ExportFcpFontSize = (int)_subtitleFontSize; + if (comboBoxImageFormat.SelectedItem != null) + { + Configuration.Settings.Tools.ExportFcpImageType = comboBoxImageFormat.SelectedItem.ToString(); + } + + Configuration.Settings.Tools.ExportFcpVideoResolution = res; + Configuration.Settings.Tools.ExportFcpPalNtsc = comboBoxLanguage.SelectedIndex == 0 ? "PAL" : "NTSC"; + } + Configuration.Settings.Tools.ExportFcpFullPathUrl = checkBoxFcpFullPathUrl.Checked; + Configuration.Settings.Tools.ExportLastShadowTransparency = (int)numericUpDownShadowTransparency.Value; + Configuration.Settings.Tools.ExportLastFrameRate = FrameRate; + Configuration.Settings.Tools.ExportFullFrame = checkBoxFullFrameImage.Checked; + Configuration.Settings.Tools.ExportShadowColor = panelShadowColor.BackColor; + Configuration.Settings.Tools.ExportFontColor = _subtitleColor; + Configuration.Settings.Tools.ExportBorderColor = _borderColor; + + if (checkBoxSimpleRender.Enabled) + { + Configuration.Settings.Tools.ExportVobSubSimpleRendering = checkBoxSimpleRender.Checked; + } + + if (_exportType == ExportFormats.BluraySup) + { + if (comboBoxBottomMarginUnit.SelectedIndex == 0) // % + { + Configuration.Settings.Tools.ExportBluRayBottomMarginPercent = comboBoxBottomMargin.SelectedIndex; + } + else // pixels + { + Configuration.Settings.Tools.ExportBluRayBottomMarginPixels = comboBoxBottomMargin.SelectedIndex; + } + } + else if (_allowCustomBottomMargin) + { + if (comboBoxBottomMarginUnit.SelectedIndex == 0) // % + { + Configuration.Settings.Tools.ExportBottomMarginPercent = comboBoxBottomMargin.SelectedIndex; + } + else // pixels + { + Configuration.Settings.Tools.ExportBottomMarginPixels = comboBoxBottomMargin.SelectedIndex; + } + } + + if (comboBoxLeftRightMargin.Visible) + { + if (comboBoxLeftRightMarginUnit.SelectedIndex == 0) // % + { + Configuration.Settings.Tools.ExportLeftRightMarginPercent = comboBoxLeftRightMargin.SelectedIndex; + } + else // pixels + { + Configuration.Settings.Tools.ExportLeftRightMarginPixels = comboBoxLeftRightMargin.SelectedIndex; + } + } + + if (comboBoxBottomMarginUnit.Visible) + { + Configuration.Settings.Tools.ExportBottomMarginUnit = comboBoxBottomMarginUnit.SelectedIndex == 0 ? "%" : "px"; + } + + if (comboBoxLeftRightMarginUnit.Visible) + { + Configuration.Settings.Tools.ExportLeftRightMarginUnit = comboBoxLeftRightMarginUnit.SelectedIndex == 0 ? "%" : "px"; + } + + Configuration.Settings.Tools.ExportHorizontalAlignment = comboBoxHAlign.SelectedIndex; + Configuration.Settings.Tools.Export3DType = comboBox3D.SelectedIndex; + Configuration.Settings.Tools.Export3DDepth = (int)numericUpDownDepth3D.Value; + + if (comboBoxShadowWidth.Visible) + { + Configuration.Settings.Tools.ExportBluRayShadow = comboBoxShadowWidth.SelectedIndex; + } + + Configuration.Settings.Tools.ExportFontNameOther = _subtitleFontName; + Configuration.Settings.Tools.ExportLastFontSize = (int)_subtitleFontSize; + Configuration.Settings.Tools.ExportLastLineHeight = (int)numericUpDownLineSpacing.Value; + Configuration.Settings.Tools.ExportLastBorderWidth = comboBoxBorderWidth.SelectedIndex; + Configuration.Settings.Tools.ExportLastFontBold = checkBoxBold.Checked; + } + + private void numericUpDownDepth3D_ValueChanged(object sender, EventArgs e) + { + if (!timerPreview.Enabled) + { + timerPreview.Start(); + } + } + + private void comboBox3D_SelectedIndexChanged(object sender, EventArgs e) + { + bool enable = comboBox3D.SelectedIndex > 0; + labelDepth.Enabled = enable; + numericUpDownDepth3D.Enabled = enable; + subtitleListView1_SelectedIndexChanged(null, null); + } + + private void timerPreview_Tick(object sender, EventArgs e) + { + timerPreview.Stop(); + subtitleListView1_SelectedIndexChanged(null, null); + } + + private void saveImageAsToolStripMenuItem_Click(object sender, EventArgs e) + { + if (subtitleListView1.SelectedItems.Count != 1) + { + return; + } + + int selectedIndex = subtitleListView1.SelectedItems[0].Index; + + saveFileDialog1.Title = Configuration.Settings.Language.VobSubOcr.SaveSubtitleImageAs; + saveFileDialog1.AddExtension = true; + saveFileDialog1.FileName = "Image" + selectedIndex; + saveFileDialog1.Filter = "PNG image|*.png|BMP image|*.bmp|GIF image|*.gif|TIFF image|*.tiff"; + saveFileDialog1.FilterIndex = 0; + + DialogResult result = saveFileDialog1.ShowDialog(this); + if (result == DialogResult.OK) + { + var bmp = pictureBox1.Image as Bitmap; + if (bmp == null) + { + MessageBox.Show("No image!"); + return; + } + + try + { + if (saveFileDialog1.FilterIndex == 0) + { + bmp.Save(saveFileDialog1.FileName, ImageFormat.Png); + } + else if (saveFileDialog1.FilterIndex == 1) + { + bmp.Save(saveFileDialog1.FileName); + } + else if (saveFileDialog1.FilterIndex == 2) + { + bmp.Save(saveFileDialog1.FileName, ImageFormat.Gif); + } + else + { + bmp.Save(saveFileDialog1.FileName, ImageFormat.Tiff); + } + } + catch (Exception exception) + { + MessageBox.Show(exception.Message); + } + } + } + + private void buttonShadowColor_Click(object sender, EventArgs e) + { + using (var colorChooser = new ColorChooser { Color = panelShadowColor.BackColor }) + { + if (colorChooser.ShowDialog() == DialogResult.OK) + { + panelShadowColor.BackColor = colorChooser.Color; + subtitleListView1_SelectedIndexChanged(null, null); + numericUpDownShadowTransparency.Value = colorChooser.Color.A; + } + } + } + + private void panelShadowColor_MouseClick(object sender, MouseEventArgs e) + { + buttonShadowColor_Click(sender, e); + } + + private void comboBoxShadowWidth_SelectedIndexChanged(object sender, EventArgs e) + { + subtitleListView1_SelectedIndexChanged(null, null); + } + + private void numericUpDownShadowTransparency_ValueChanged(object sender, EventArgs e) + { + subtitleListView1_SelectedIndexChanged(null, null); + } + + private void comboBoxSubtitleFont_SelectedIndexChanged(object sender, EventArgs e) + { + if (_isLoading) + { + return; + } + + if (_formatName == AdvancedSubStationAlpha.NameOfFormat || _formatName == SubStationAlpha.NameOfFormat) + { + return; + } + + var lineHeight = (int)Math.Round(GetFontHeight() * 0.64f); + if (lineHeight >= numericUpDownLineSpacing.Minimum && + lineHeight <= numericUpDownLineSpacing.Maximum) + { + numericUpDownLineSpacing.ValueChanged -= numericUpDownLineSpacing_ValueChanged; + numericUpDownLineSpacing.Value = lineHeight; + numericUpDownLineSpacing.ValueChanged += numericUpDownLineSpacing_ValueChanged; + } + subtitleListView1_SelectedIndexChanged(null, null); + + // change font + if (!comboBoxSubtitleFont.Enabled) + { + return; + } + try + { + var fontName = comboBoxSubtitleFont.SelectedItem.ToString(); + int columnIndexText = 4; + if (subtitleListView1.CheckBoxes) + { + columnIndexText++; + } + + for (int i = 0; i < _subtitle.Paragraphs.Count; i++) + { + + subtitleListView1.Items[i].SubItems[columnIndexText].Font = new Font(fontName, Font.Size); + } + } + catch + { + // ignore unable to set font errors + } + } + + private void numericUpDownLineSpacing_ValueChanged(object sender, EventArgs e) + { + var value = (int)numericUpDownLineSpacing.Value; + var style = string.Empty; + if (subtitleListView1.SelectedIndices.Count > 0) + { + style = GetStyleName(_subtitle.Paragraphs[subtitleListView1.SelectedItems[0].Index]); + } + + if (_lineHeights.ContainsKey(style)) + { + _lineHeights[style] = value; + } + + if (_formatName != AdvancedSubStationAlpha.NameOfFormat && _formatName != SubStationAlpha.NameOfFormat) + { + _lineHeights.Clear(); + _lineHeights.Add(string.Empty, value); + } + subtitleListView1_SelectedIndexChanged(null, null); + } + + private static string GetStyleName(Paragraph paragraph) + { + if ((_formatName == AdvancedSubStationAlpha.NameOfFormat || _formatName == SubStationAlpha.NameOfFormat) && !string.IsNullOrEmpty(paragraph.Extra)) + { + return paragraph.Extra; + } + return string.Empty; + } + + private void ListViewToggleTag(string tag) + { + if (_subtitle.Paragraphs.Count > 0 && subtitleListView1.SelectedItems.Count > 0) + { + var indexes = new List(); + foreach (ListViewItem item in subtitleListView1.SelectedItems) + { + indexes.Add(item.Index); + } + + subtitleListView1.BeginUpdate(); + foreach (int i in indexes) + { + if (tag == BoxMultiLineText) + { + _subtitle.Paragraphs[i].Text = _subtitle.Paragraphs[i].Text.Replace("<" + BoxSingleLineText + ">", string.Empty).Replace("", string.Empty); + } + else if (tag == BoxSingleLineText) + { + _subtitle.Paragraphs[i].Text = _subtitle.Paragraphs[i].Text.Replace("<" + BoxMultiLineText + ">", string.Empty).Replace("", string.Empty); + } + + if (_subtitle.Paragraphs[i].Text.Contains("<" + tag + ">")) + { + _subtitle.Paragraphs[i].Text = _subtitle.Paragraphs[i].Text.Replace("<" + tag + ">", string.Empty); + _subtitle.Paragraphs[i].Text = _subtitle.Paragraphs[i].Text.Replace("", string.Empty); + } + else + { + int indexOfEndBracket = _subtitle.Paragraphs[i].Text.IndexOf('}'); + if (_subtitle.Paragraphs[i].Text.StartsWith("{\\", StringComparison.Ordinal) && indexOfEndBracket > 1 && indexOfEndBracket < 6) + { + _subtitle.Paragraphs[i].Text = string.Format("{2}<{0}>{1}", tag, _subtitle.Paragraphs[i].Text.Remove(0, indexOfEndBracket + 1), _subtitle.Paragraphs[i].Text.Substring(0, indexOfEndBracket + 1)); + } + else + { + _subtitle.Paragraphs[i].Text = string.Format("<{0}>{1}", tag, _subtitle.Paragraphs[i].Text); + } + } + SubtitleListView1SetText(i, _subtitle.Paragraphs[i].Text); + } + subtitleListView1.EndUpdate(); + } + } + + private void boxMultiLineToolStripMenuItem_Click(object sender, EventArgs e) + { + ListViewToggleTag(BoxMultiLineText); + subtitleListView1_SelectedIndexChanged(null, null); + } + + private void boxSingleLineToolStripMenuItem_Click(object sender, EventArgs e) + { + ListViewToggleTag(BoxSingleLineText); + subtitleListView1_SelectedIndexChanged(null, null); + } + + private void italicToolStripMenuItem_Click(object sender, EventArgs e) + { + ListViewToggleTag("i"); + subtitleListView1_SelectedIndexChanged(null, null); + } + + private void normalToolStripMenuItem_Click(object sender, EventArgs e) + { + if (_subtitle.Paragraphs.Count > 0 && subtitleListView1.SelectedItems.Count > 0) + { + bool isSsa = _format.Name == SubStationAlpha.NameOfFormat || + _format.Name == AdvancedSubStationAlpha.NameOfFormat; + + foreach (ListViewItem item in subtitleListView1.SelectedItems) + { + Paragraph p = _subtitle.GetParagraphOrDefault(item.Index); + if (p != null) + { + int indexOfEndBracket = p.Text.IndexOf('}'); + if (p.Text.StartsWith("{\\", StringComparison.Ordinal) && indexOfEndBracket > 1 && indexOfEndBracket < 6) + { + p.Text = p.Text.Remove(0, indexOfEndBracket + 1); + } + + p.Text = HtmlUtil.RemoveHtmlTags(p.Text); + p.Text = p.Text.Replace("<" + BoxSingleLineText + ">", string.Empty).Replace("", string.Empty); + p.Text = p.Text.Replace("<" + BoxMultiLineText + ">", string.Empty).Replace("", string.Empty); + + if (isSsa) + { + p.Text = Utilities.RemoveSsaTags(p.Text); + } + + SubtitleListView1SetText(item.Index, p.Text); + } + } + } + subtitleListView1_SelectedIndexChanged(null, null); + } + + private void subtitleListView1_KeyDown(object sender, KeyEventArgs e) + { + var italicShortCut = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainTextBoxItalic); + if (e.KeyData == italicShortCut) + { + ListViewToggleTag("i"); + subtitleListView1_SelectedIndexChanged(null, null); + } + else if (e.KeyCode == Keys.A && e.Modifiers == Keys.Control) + { + subtitleListView1.SelectAll(); + e.SuppressKeyPress = true; + } + else if (e.KeyCode == Keys.D && e.Modifiers == Keys.Control) + { + subtitleListView1.SelectFirstSelectedItemOnly(); + e.SuppressKeyPress = true; + } + else if (e.KeyCode == Keys.I && e.Modifiers == (Keys.Control | Keys.Shift)) + { + subtitleListView1.InverseSelection(); + e.SuppressKeyPress = true; + } + } + + public void SubtitleListView1SelectNone() + { + foreach (ListViewItem item in subtitleListView1.SelectedItems) + { + item.Selected = false; + } + } + + private void SubtitleListView1SelectIndexAndEnsureVisible(int index) + { + if (index < 0 || index >= subtitleListView1.Items.Count || subtitleListView1.Items.Count == 0) + { + return; + } + + if (subtitleListView1.TopItem == null) + { + return; + } + + int bottomIndex = subtitleListView1.TopItem.Index + (Height - 25) / 16; + int itemsBeforeAfterCount = (bottomIndex - subtitleListView1.TopItem.Index) / 2 - 1; + if (itemsBeforeAfterCount < 0) + { + itemsBeforeAfterCount = 1; + } + + int beforeIndex = index - itemsBeforeAfterCount; + if (beforeIndex < 0) + { + beforeIndex = 0; + } + + int afterIndex = index + itemsBeforeAfterCount; + if (afterIndex >= subtitleListView1.Items.Count) + { + afterIndex = subtitleListView1.Items.Count - 1; + } + + SubtitleListView1SelectNone(); + if (subtitleListView1.TopItem.Index <= beforeIndex && bottomIndex > afterIndex) + { + subtitleListView1.Items[index].Selected = true; + subtitleListView1.Items[index].EnsureVisible(); + return; + } + + subtitleListView1.Items[beforeIndex].EnsureVisible(); + subtitleListView1.EnsureVisible(beforeIndex); + subtitleListView1.Items[afterIndex].EnsureVisible(); + subtitleListView1.EnsureVisible(afterIndex); + subtitleListView1.Items[index].Selected = true; + subtitleListView1.Items[index].EnsureVisible(); + } + + private void SubtitleListView1Add(Paragraph paragraph) + { + var item = new ListViewItem(paragraph.Number.ToString(CultureInfo.InvariantCulture)) { Tag = paragraph, UseItemStyleForSubItems = false }; + ListViewItem.ListViewSubItem subItem; + + if (subtitleListView1.CheckBoxes) + { + item.Text = string.Empty; + subItem = new ListViewItem.ListViewSubItem(item, paragraph.Number.ToString(CultureInfo.InvariantCulture)) { Tag = paragraph }; + item.SubItems.Add(subItem); + } + + subItem = new ListViewItem.ListViewSubItem(item, paragraph.StartTime.ToDisplayString()); + item.SubItems.Add(subItem); + + subItem = new ListViewItem.ListViewSubItem(item, paragraph.EndTime.ToDisplayString()); + item.SubItems.Add(subItem); + + subItem = new ListViewItem.ListViewSubItem(item, paragraph.Duration.ToShortDisplayString()); + item.SubItems.Add(subItem); + + subItem = new ListViewItem.ListViewSubItem(item, UiUtil.GetListViewTextFromString(paragraph.Text)); + try + { + if (_formatName == AdvancedSubStationAlpha.NameOfFormat || _formatName == SubStationAlpha.NameOfFormat) + { + var style = AdvancedSubStationAlpha.GetSsaStyle(paragraph.Extra, _subtitle.Header); + subItem.Font = new Font(style.FontName, Font.Size); + } + else + { + subItem.Font = new Font(_subtitleFontName, Font.Size); + } + } + catch + { + subItem.Font = new Font(_subtitleFontName, Font.Size, FontStyle.Bold); + } + item.SubItems.Add(subItem); + + if (_formatName == AdvancedSubStationAlpha.NameOfFormat || _formatName == SubStationAlpha.NameOfFormat) + { + subItem = new ListViewItem.ListViewSubItem(item, paragraph.Extra); + item.SubItems.Add(subItem); + } + + subtitleListView1.Items.Add(item); + } + + private void SubtitleListView1Fill(Subtitle subtitle) + { + subtitleListView1.BeginUpdate(); + subtitleListView1.Items.Clear(); + foreach (Paragraph paragraph in subtitle.Paragraphs) + { + SubtitleListView1Add(paragraph); + } + subtitleListView1.EndUpdate(); + } + + private void SubtitleListView1AutoSizeAllColumns() + { + int columnIndexNumber = 0; + int columnIndexStart = 1; + int columnIndexEnd = 2; + int columnIndexDuration = 3; + int columnIndexText = 4; + int columnIndexStyle = 5; + + if (subtitleListView1.CheckBoxes) + { + subtitleListView1.Columns[0].Width = 60; + columnIndexNumber++; + columnIndexStart++; + columnIndexEnd++; + columnIndexDuration++; + columnIndexText++; + } + + var settings = Configuration.Settings; + if (settings != null && settings.General.ListViewColumnsRememberSize && settings.General.ListViewNumberWidth > 1) + { + subtitleListView1.Columns[columnIndexNumber].Width = settings.General.ListViewNumberWidth; + } + else + { + subtitleListView1.Columns[columnIndexNumber].Width = 55; + } + + subtitleListView1.Columns[columnIndexStart].Width = 90; + subtitleListView1.Columns[columnIndexEnd].Width = 90; + subtitleListView1.Columns[columnIndexDuration].Width = 60; + if (_formatName == AdvancedSubStationAlpha.NameOfFormat || _formatName == SubStationAlpha.NameOfFormat) + { + subtitleListView1.Columns.Add("style", Configuration.Settings.Language.General.Style, 90); + subtitleListView1.Columns[columnIndexText].Width = subtitleListView1.Width - + subtitleListView1.Columns[columnIndexNumber].Width - + subtitleListView1.Columns[columnIndexStart].Width - + subtitleListView1.Columns[columnIndexEnd].Width - + subtitleListView1.Columns[columnIndexDuration].Width - + 175; + subtitleListView1.Columns[columnIndexStyle].Width = -2; + } + else + { + subtitleListView1.Columns[columnIndexText].Width = -2; + } + } + + private void SubtitleListView1InitializeLanguage(LanguageStructure.General general, Core.Common.Settings settings) + { + int columnIndexNumber = 0; + int columnIndexStart = 1; + int columnIndexEnd = 2; + int columnIndexDuration = 3; + int columnIndexText = 4; + + if (subtitleListView1.CheckBoxes) + { + columnIndexNumber++; + columnIndexStart++; + columnIndexEnd++; + columnIndexDuration++; + columnIndexText++; + } + + subtitleListView1.Columns[columnIndexNumber].Text = general.NumberSymbol; + subtitleListView1.Columns[columnIndexStart].Text = general.StartTime; + subtitleListView1.Columns[columnIndexEnd].Text = general.EndTime; + subtitleListView1.Columns[columnIndexDuration].Text = general.Duration; + subtitleListView1.Columns[columnIndexText].Text = general.Text; + subtitleListView1.ForeColor = settings.General.SubtitleFontColor; + subtitleListView1.BackColor = settings.General.SubtitleBackgroundColor; + } + + private void SubtitleListView1SetText(int index, string text) + { + int columnIndexText = 4; + + if (subtitleListView1.CheckBoxes) + { + columnIndexText++; + } + + subtitleListView1.Items[index].SubItems[columnIndexText].Text = UiUtil.GetListViewTextFromString(text); + } + + private void FillPreviewBackground(Bitmap bmp, Graphics g, Paragraph p) + { + try + { + if (!string.IsNullOrWhiteSpace(_videoFileName) && LibVlcDynamic.IsInstalled) + { + using (var vlc = new LibVlcDynamic()) + { + vlc.Initialize(panelVlcTemp, _videoFileName, null, null); + Application.DoEvents(); + vlc.Volume = 0; + vlc.Pause(); + vlc.CurrentPosition = p.StartTime.TotalSeconds; + Application.DoEvents(); + var fileName = FileUtil.GetTempFileName(".bmp"); + vlc.TakeSnapshot(fileName, (uint)bmp.Width, (uint)bmp.Height); + Application.DoEvents(); + Thread.Sleep(200); + using (var tempBmp = new Bitmap(fileName)) + { + g.DrawImageUnscaled(tempBmp, new Point(0, 0)); + } + } + return; + } + } + catch + { + // Was unable to grap screenshot via vlc + } + + // Draw background with generated image + var rect = new Rectangle(0, 0, bmp.Width - 1, bmp.Height - 1); + using (var br = new LinearGradientBrush(rect, Color.Black, Color.Black, 0, false)) + { + var cb = new ColorBlend + { + Positions = new[] { 0, 1 / 6f, 2 / 6f, 3 / 6f, 4 / 6f, 5 / 6f, 1 }, + Colors = new[] { Color.Black, Color.Black, Color.White, Color.Black, Color.Black, Color.White, Color.Black } + }; + br.InterpolationColors = cb; + br.RotateTransform(0); + g.FillRectangle(br, rect); + } + } + + private void linkLabelPreview_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + linkLabelPreview.Enabled = false; + Cursor = Cursors.WaitCursor; + try + { + GetResolution(out var width, out var height); + using (var bmp = new Bitmap(width, height)) + { + using (var g = Graphics.FromImage(bmp)) + { + var p = _subtitle.Paragraphs[subtitleListView1.SelectedItems[0].Index]; + FillPreviewBackground(bmp, g, p); + + var nBmp = new NikseBitmap(pictureBox1.Image as Bitmap); + nBmp.CropSidesAndBottom(100, Color.Transparent, true); + using (var textBmp = nBmp.GetBitmap()) + { + var bp = MakeMakeBitmapParameter(subtitleListView1.SelectedItems[0].Index, width, height); + var alignment = GetAlignmentFromParagraph(bp, _format, _subtitle); + if (comboBoxHAlign.Visible && alignment == ContentAlignment.BottomCenter && _format.GetType() != typeof(AdvancedSubStationAlpha) && _format.GetType() != typeof(SubStationAlpha)) + { + if (comboBoxHAlign.SelectedIndex == 0) + { + alignment = ContentAlignment.BottomLeft; + } + else if (comboBoxHAlign.SelectedIndex == 2) + { + alignment = ContentAlignment.BottomRight; + } + } + + int x = (bmp.Width - textBmp.Width) / 2; + if (alignment == ContentAlignment.BottomLeft || alignment == ContentAlignment.MiddleLeft || alignment == ContentAlignment.TopLeft) + { + x = GetBottomMarginInPixels(p); + } + else if (alignment == ContentAlignment.BottomRight || alignment == ContentAlignment.MiddleRight || alignment == ContentAlignment.TopRight) + { + x = bmp.Width - textBmp.Width - GetBottomMarginInPixels(p); + } + + int y = bmp.Height - textBmp.Height - GetBottomMarginInPixels(p); + if (alignment == ContentAlignment.BottomLeft || alignment == ContentAlignment.MiddleLeft || alignment == ContentAlignment.TopLeft) + { + x = GetBottomMarginInPixels(p); + } + else if (alignment == ContentAlignment.BottomRight || alignment == ContentAlignment.MiddleRight || alignment == ContentAlignment.TopRight) + { + x = bmp.Width - textBmp.Width - GetBottomMarginInPixels(p); + } + + if (alignment == ContentAlignment.MiddleLeft || alignment == ContentAlignment.MiddleCenter || alignment == ContentAlignment.MiddleRight) + { + y = (groupBoxExportImage.Height - 4 - textBmp.Height) / 2; + } + else if (alignment == ContentAlignment.TopLeft || alignment == ContentAlignment.TopCenter || alignment == ContentAlignment.TopRight) + { + y = GetBottomMarginInPixels(p); + } + + g.DrawImageUnscaled(textBmp, new Point(x, y)); + } + } + + using (var form = new ExportPngXmlPreview(bmp)) + { + Cursor = Cursors.Default; + form.ShowDialog(this); + } + } + } + finally + { + Cursor = Cursors.Default; + linkLabelPreview.Enabled = true; + } + } + + private void comboBoxLeftRightMargin_SelectedIndexChanged(object sender, EventArgs e) + { + subtitleListView1_SelectedIndexChanged(null, null); + } + + private void panelFullFrameBackground_Click(object sender, EventArgs e) + { + using (var colorChooser = new ColorChooser { Color = panelFullFrameBackground.BackColor, Text = Configuration.Settings.Language.ExportPngXml.ChooseBackgroundColor }) + { + if (colorChooser.ShowDialog() == DialogResult.OK) + { + panelFullFrameBackground.BackColor = colorChooser.Color; + subtitleListView1_SelectedIndexChanged(null, null); + } + } + } + + private void checkBoxFullFrameImage_CheckedChanged(object sender, EventArgs e) + { + subtitleListView1_SelectedIndexChanged(null, null); + panelFullFrameBackground.Visible = checkBoxFullFrameImage.Checked; + if (_exportType == ExportFormats.BluraySup || _exportType == ExportFormats.VobSub || _exportType == ExportFormats.ImageFrame || _exportType == ExportFormats.BdnXml || _exportType == ExportFormats.Dost || _exportType == ExportFormats.Fab || _exportType == ExportFormats.Edl || _exportType == ExportFormats.EdlClipName) + { + return; + } + _allowCustomBottomMargin = checkBoxFullFrameImage.Checked; + comboBoxBottomMargin.Visible = checkBoxFullFrameImage.Checked; + labelBottomMargin.Visible = checkBoxFullFrameImage.Checked; + comboBoxBottomMarginUnit.Visible = checkBoxFullFrameImage.Checked; + } + + public void DisableSaveButtonAndCheckBoxes() + { + buttonExport.Visible = false; + subtitleListView1.CheckBoxes = false; + } + + private void comboBoxBottomMarginUnit_SelectedIndexChanged(object sender, EventArgs e) + { + comboBoxBottomMargin.BeginUpdate(); + comboBoxBottomMargin.Items.Clear(); + if (comboBoxBottomMarginUnit.SelectedIndex == 0) + { + for (int i = 0; i <= 95; i++) + { + comboBoxBottomMargin.Items.Add(i); + } + + var exportMarginPercent = _exportType == ExportFormats.BluraySup ? Configuration.Settings.Tools.ExportBluRayBottomMarginPercent : Configuration.Settings.Tools.ExportBottomMarginPercent; + if (exportMarginPercent >= 0 && exportMarginPercent < comboBoxBottomMargin.Items.Count) + { + comboBoxBottomMargin.SelectedIndex = exportMarginPercent; + } + } + else + { + for (int i = 0; i <= 1000; i++) + { + comboBoxBottomMargin.Items.Add(i); + } + + var exportMarginPixels = _exportType == ExportFormats.BluraySup ? Configuration.Settings.Tools.ExportBluRayBottomMarginPixels : Configuration.Settings.Tools.ExportBottomMarginPixels; + if (exportMarginPixels >= 0 && exportMarginPixels < comboBoxBottomMargin.Items.Count) + { + comboBoxBottomMargin.SelectedIndex = exportMarginPixels; + } + } + if (comboBoxBottomMargin.SelectedIndex == -1) + { + comboBoxBottomMargin.SelectedIndex = 0; + } + comboBoxBottomMargin.EndUpdate(); + } + + private void comboBoxLeftRightMarginUnit_SelectedIndexChanged(object sender, EventArgs e) + { + comboBoxLeftRightMargin.BeginUpdate(); + comboBoxLeftRightMargin.Items.Clear(); + if (comboBoxLeftRightMarginUnit.SelectedIndex == 0) + { + for (int i = 0; i < 95; i++) + { + comboBoxLeftRightMargin.Items.Add(i); + } + + if (Configuration.Settings.Tools.ExportLeftRightMarginPercent >= 0 && Configuration.Settings.Tools.ExportLeftRightMarginPercent < comboBoxLeftRightMargin.Items.Count) + { + comboBoxLeftRightMargin.SelectedIndex = Configuration.Settings.Tools.ExportLeftRightMarginPercent; + } + } + else + { + for (int i = 0; i <= 1000; i++) + { + comboBoxLeftRightMargin.Items.Add(i); + } + + if (Configuration.Settings.Tools.ExportLeftRightMarginPixels >= 0 && Configuration.Settings.Tools.ExportLeftRightMarginPixels < comboBoxLeftRightMargin.Items.Count) + { + comboBoxLeftRightMargin.SelectedIndex = Configuration.Settings.Tools.ExportLeftRightMarginPixels; + } + } + if (comboBoxLeftRightMargin.SelectedIndex == -1) + { + comboBoxLeftRightMargin.SelectedIndex = 0; + } + comboBoxLeftRightMargin.EndUpdate(); + } + + private void numericUpDownLineSpacing_KeyUp(object sender, KeyEventArgs e) + { + _previewTimer.Start(); + } + + public static Bitmap ResizeBitmap(Bitmap b, int width, int height) + { + Bitmap newImage = new Bitmap(width, height); + using (var g = Graphics.FromImage(newImage)) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.InterpolationMode = InterpolationMode.HighQualityBicubic; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + g.DrawImage(b, new Rectangle(0, 0, width, height)); + } + return newImage; + } + + private void comboBoxResizePercentage_SelectedIndexChanged(object sender, EventArgs e) + { + subtitleListView1_SelectedIndexChanged(null, null); + } + + private void adjustTimeCodesToolStripMenuItem_Click(object sender, EventArgs e) + { + using (var showEarlierOrLater = new ShowEarlierLater()) + { + showEarlierOrLater.Initialize(ShowEarlierOrLater, false); + showEarlierOrLater.ShowDialog(this); + } + } + + public void ShowEarlierOrLater(double adjustMilliseconds, SelectionChoice selection) + { + adjustMilliseconds /= TimeCode.BaseUnit; + subtitleListView1.BeginUpdate(); + int startFrom = 0; + if (selection == SelectionChoice.SelectionAndForward) + { + if (subtitleListView1.SelectedItems.Count > 0) + { + startFrom = subtitleListView1.SelectedItems[0].Index; + } + else + { + startFrom = _subtitle.Paragraphs.Count; + } + } + for (int i = startFrom; i < _subtitle.Paragraphs.Count; i++) + { + switch (selection) + { + case SelectionChoice.SelectionOnly: + if (subtitleListView1.Items[i].Selected) + { + _subtitle.Paragraphs[i].Adjust(1.0, adjustMilliseconds); + ShowTimeInListView(i); + } + break; + case SelectionChoice.AllLines: + case SelectionChoice.SelectionAndForward: + _subtitle.Paragraphs[i].Adjust(1.0, adjustMilliseconds); + ShowTimeInListView(i); + break; + } + } + subtitleListView1.EndUpdate(); + } + + private void ShowTimeInListView(int index) + { + int startIndex = 1; + if (subtitleListView1.CheckBoxes) + { + startIndex++; + } + subtitleListView1.Items[index].SubItems[startIndex].Text = _subtitle.Paragraphs[index].StartTime.ToDisplayString(); + subtitleListView1.Items[index].SubItems[startIndex + 1].Text = _subtitle.Paragraphs[index].EndTime.ToDisplayString(); + subtitleListView1.Items[index].SubItems[startIndex + 2].Text = _subtitle.Paragraphs[index].Duration.ToShortDisplayString(); + } + + private void contextMenuStripListView_Opening(object sender, System.ComponentModel.CancelEventArgs e) + { + bool showImageExportMenuItems = _vobSubOcr != null; + toolStripSeparatorAdjust.Visible = showImageExportMenuItems; + adjustTimeCodesToolStripMenuItem.Visible = showImageExportMenuItems; + adjustDisplayTimeToolStripMenuItem.Visible = showImageExportMenuItems; + } + + private void adjustDisplayTimeToolStripMenuItem_Click(object sender, EventArgs e) + { + using (var adjustDisplayTime = new AdjustDisplayDuration()) + { + adjustDisplayTime.HideRecalculate(); + if (adjustDisplayTime.ShowDialog(this) == DialogResult.OK) + { + if (adjustDisplayTime.AdjustUsingPercent) + { + double percent = double.Parse(adjustDisplayTime.AdjustValue, CultureInfo.InvariantCulture); + _subtitle.AdjustDisplayTimeUsingPercent(percent, null); + } + else if (adjustDisplayTime.AdjustUsingSeconds) + { + double seconds = double.Parse(adjustDisplayTime.AdjustValue, CultureInfo.InvariantCulture); + _subtitle.AdjustDisplayTimeUsingSeconds(seconds, null); + } + else if (adjustDisplayTime.AdjustUsingRecalc) + { + double maxCharSeconds = (double)(adjustDisplayTime.MaxCharactersPerSecond); + _subtitle.RecalculateDisplayTimes(maxCharSeconds, null, (double)adjustDisplayTime.OptimalCharactersPerSecond); + } + else // fixed duration + { + _subtitle.SetFixedDuration(null, adjustDisplayTime.FixedMilliseconds); + } + } + } + subtitleListView1.BeginUpdate(); + for (int i = 0; i < _subtitle.Paragraphs.Count; i++) + { + ShowTimeInListView(i); + } + subtitleListView1.EndUpdate(); + } + } +} diff --git a/src/Forms/ExportPngXml.resx b/src/ui/Forms/ExportPngXml.resx similarity index 98% rename from src/Forms/ExportPngXml.resx rename to src/ui/Forms/ExportPngXml.resx index 5a84c8588..044fc07f8 100644 --- a/src/Forms/ExportPngXml.resx +++ b/src/ui/Forms/ExportPngXml.resx @@ -1,135 +1,135 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 565, 17 - - - 17, 17 - - - 307, 17 - - - 443, 17 - - - 720, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 565, 17 + + + 17, 17 + + + 307, 17 + + + 443, 17 + + + 720, 17 + \ No newline at end of file diff --git a/src/Forms/ExportPngXmlDialogOpenFolder.Designer.cs b/src/ui/Forms/ExportPngXmlDialogOpenFolder.Designer.cs similarity index 100% rename from src/Forms/ExportPngXmlDialogOpenFolder.Designer.cs rename to src/ui/Forms/ExportPngXmlDialogOpenFolder.Designer.cs diff --git a/src/Forms/ExportPngXmlDialogOpenFolder.cs b/src/ui/Forms/ExportPngXmlDialogOpenFolder.cs similarity index 100% rename from src/Forms/ExportPngXmlDialogOpenFolder.cs rename to src/ui/Forms/ExportPngXmlDialogOpenFolder.cs diff --git a/src/Forms/Ocr/AddToOcrReplaceList.resx b/src/ui/Forms/ExportPngXmlDialogOpenFolder.resx similarity index 100% rename from src/Forms/Ocr/AddToOcrReplaceList.resx rename to src/ui/Forms/ExportPngXmlDialogOpenFolder.resx diff --git a/src/Forms/ExportPngXmlPreview.Designer.cs b/src/ui/Forms/ExportPngXmlPreview.Designer.cs similarity index 100% rename from src/Forms/ExportPngXmlPreview.Designer.cs rename to src/ui/Forms/ExportPngXmlPreview.Designer.cs diff --git a/src/Forms/ExportPngXmlPreview.cs b/src/ui/Forms/ExportPngXmlPreview.cs similarity index 100% rename from src/Forms/ExportPngXmlPreview.cs rename to src/ui/Forms/ExportPngXmlPreview.cs diff --git a/src/Forms/Ocr/BinaryOcrChooseEditDb.resx b/src/ui/Forms/ExportPngXmlPreview.resx similarity index 100% rename from src/Forms/Ocr/BinaryOcrChooseEditDb.resx rename to src/ui/Forms/ExportPngXmlPreview.resx diff --git a/src/Forms/ExportText.Designer.cs b/src/ui/Forms/ExportText.Designer.cs similarity index 98% rename from src/Forms/ExportText.Designer.cs rename to src/ui/Forms/ExportText.Designer.cs index 5034492d7..ef3dd95fc 100644 --- a/src/Forms/ExportText.Designer.cs +++ b/src/ui/Forms/ExportText.Designer.cs @@ -1,411 +1,411 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class ExportText - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.textBoxText = new System.Windows.Forms.TextBox(); - this.groupBoxImportOptions = new System.Windows.Forms.GroupBox(); - this.labelEncoding = new System.Windows.Forms.Label(); - this.comboBoxEncoding = new System.Windows.Forms.ComboBox(); - this.checkBoxAddNewlineAfterTimeCodes = new System.Windows.Forms.CheckBox(); - this.checkBoxAddNewlineAfterLineNumber = new System.Windows.Forms.CheckBox(); - this.checkBoxAddNewLine2 = new System.Windows.Forms.CheckBox(); - this.checkBoxAddAfterText = new System.Windows.Forms.CheckBox(); - this.checkBoxShowLineNumbers = new System.Windows.Forms.CheckBox(); - this.groupBoxTimeCodeFormat = new System.Windows.Forms.GroupBox(); - this.comboBoxTimeCodeSeparator = new System.Windows.Forms.ComboBox(); - this.labelTimeCodeSeparator = new System.Windows.Forms.Label(); - this.radioButtonTimeCodeHHMMSSFF = new System.Windows.Forms.RadioButton(); - this.radioButtonTimeCodeMs = new System.Windows.Forms.RadioButton(); - this.radioButtonTimeCodeSrt = new System.Windows.Forms.RadioButton(); - this.groupBoxFormatText = new System.Windows.Forms.GroupBox(); - this.checkBoxRemoveStyling = new System.Windows.Forms.CheckBox(); - this.radioButtonFormatMergeAll = new System.Windows.Forms.RadioButton(); - this.radioButtonFormatNone = new System.Windows.Forms.RadioButton(); - this.radioButtonFormatUnbreak = new System.Windows.Forms.RadioButton(); - this.checkBoxShowTimeCodes = new System.Windows.Forms.CheckBox(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog(); - this.labelPreview = new System.Windows.Forms.Label(); - this.groupBoxImportOptions.SuspendLayout(); - this.groupBoxTimeCodeFormat.SuspendLayout(); - this.groupBoxFormatText.SuspendLayout(); - this.SuspendLayout(); - // - // textBoxText - // - this.textBoxText.AllowDrop = true; - this.textBoxText.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.textBoxText.Location = new System.Drawing.Point(12, 40); - this.textBoxText.MaxLength = 0; - this.textBoxText.Multiline = true; - this.textBoxText.Name = "textBoxText"; - this.textBoxText.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.textBoxText.Size = new System.Drawing.Size(403, 405); - this.textBoxText.TabIndex = 3; - // - // groupBoxImportOptions - // - this.groupBoxImportOptions.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxImportOptions.Controls.Add(this.labelEncoding); - this.groupBoxImportOptions.Controls.Add(this.comboBoxEncoding); - this.groupBoxImportOptions.Controls.Add(this.checkBoxAddNewlineAfterTimeCodes); - this.groupBoxImportOptions.Controls.Add(this.checkBoxAddNewlineAfterLineNumber); - this.groupBoxImportOptions.Controls.Add(this.checkBoxAddNewLine2); - this.groupBoxImportOptions.Controls.Add(this.checkBoxAddAfterText); - this.groupBoxImportOptions.Controls.Add(this.checkBoxShowLineNumbers); - this.groupBoxImportOptions.Controls.Add(this.groupBoxTimeCodeFormat); - this.groupBoxImportOptions.Controls.Add(this.groupBoxFormatText); - this.groupBoxImportOptions.Controls.Add(this.checkBoxShowTimeCodes); - this.groupBoxImportOptions.Location = new System.Drawing.Point(421, 21); - this.groupBoxImportOptions.Name = "groupBoxImportOptions"; - this.groupBoxImportOptions.Size = new System.Drawing.Size(373, 427); - this.groupBoxImportOptions.TabIndex = 0; - this.groupBoxImportOptions.TabStop = false; - this.groupBoxImportOptions.Text = "Export options"; - // - // labelEncoding - // - this.labelEncoding.AutoSize = true; - this.labelEncoding.Location = new System.Drawing.Point(13, 392); - this.labelEncoding.Name = "labelEncoding"; - this.labelEncoding.Size = new System.Drawing.Size(52, 13); - this.labelEncoding.TabIndex = 8; - this.labelEncoding.Text = "Encoding"; - // - // comboBoxEncoding - // - this.comboBoxEncoding.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxEncoding.FormattingEnabled = true; - this.comboBoxEncoding.Location = new System.Drawing.Point(71, 389); - this.comboBoxEncoding.Name = "comboBoxEncoding"; - this.comboBoxEncoding.Size = new System.Drawing.Size(221, 21); - this.comboBoxEncoding.TabIndex = 9; - // - // checkBoxAddNewlineAfterTimeCodes - // - this.checkBoxAddNewlineAfterTimeCodes.AutoSize = true; - this.checkBoxAddNewlineAfterTimeCodes.Checked = true; - this.checkBoxAddNewlineAfterTimeCodes.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxAddNewlineAfterTimeCodes.Location = new System.Drawing.Point(36, 188); - this.checkBoxAddNewlineAfterTimeCodes.Name = "checkBoxAddNewlineAfterTimeCodes"; - this.checkBoxAddNewlineAfterTimeCodes.Size = new System.Drawing.Size(160, 17); - this.checkBoxAddNewlineAfterTimeCodes.TabIndex = 4; - this.checkBoxAddNewlineAfterTimeCodes.Text = "Add new line after time code"; - this.checkBoxAddNewlineAfterTimeCodes.UseVisualStyleBackColor = true; - this.checkBoxAddNewlineAfterTimeCodes.CheckedChanged += new System.EventHandler(this.radioButtonFormatNone_CheckedChanged); - // - // checkBoxAddNewlineAfterLineNumber - // - this.checkBoxAddNewlineAfterLineNumber.AutoSize = true; - this.checkBoxAddNewlineAfterLineNumber.Checked = true; - this.checkBoxAddNewlineAfterLineNumber.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxAddNewlineAfterLineNumber.Location = new System.Drawing.Point(36, 146); - this.checkBoxAddNewlineAfterLineNumber.Name = "checkBoxAddNewlineAfterLineNumber"; - this.checkBoxAddNewlineAfterLineNumber.Size = new System.Drawing.Size(168, 17); - this.checkBoxAddNewlineAfterLineNumber.TabIndex = 2; - this.checkBoxAddNewlineAfterLineNumber.Text = "Add new line after line number"; - this.checkBoxAddNewlineAfterLineNumber.UseVisualStyleBackColor = true; - this.checkBoxAddNewlineAfterLineNumber.CheckedChanged += new System.EventHandler(this.radioButtonFormatNone_CheckedChanged); - // - // checkBoxAddNewLine2 - // - this.checkBoxAddNewLine2.AutoSize = true; - this.checkBoxAddNewLine2.Checked = true; - this.checkBoxAddNewLine2.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxAddNewLine2.Location = new System.Drawing.Point(19, 234); - this.checkBoxAddNewLine2.Name = "checkBoxAddNewLine2"; - this.checkBoxAddNewLine2.Size = new System.Drawing.Size(172, 17); - this.checkBoxAddNewLine2.TabIndex = 6; - this.checkBoxAddNewLine2.Text = "Add new line between subtitles"; - this.checkBoxAddNewLine2.UseVisualStyleBackColor = true; - this.checkBoxAddNewLine2.CheckedChanged += new System.EventHandler(this.radioButtonFormatNone_CheckedChanged); - // - // checkBoxAddAfterText - // - this.checkBoxAddAfterText.AutoSize = true; - this.checkBoxAddAfterText.Checked = true; - this.checkBoxAddAfterText.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxAddAfterText.Location = new System.Drawing.Point(19, 211); - this.checkBoxAddAfterText.Name = "checkBoxAddAfterText"; - this.checkBoxAddAfterText.Size = new System.Drawing.Size(136, 17); - this.checkBoxAddAfterText.TabIndex = 5; - this.checkBoxAddAfterText.Text = "Add new line after texts"; - this.checkBoxAddAfterText.UseVisualStyleBackColor = true; - this.checkBoxAddAfterText.CheckedChanged += new System.EventHandler(this.radioButtonFormatNone_CheckedChanged); - // - // checkBoxShowLineNumbers - // - this.checkBoxShowLineNumbers.AutoSize = true; - this.checkBoxShowLineNumbers.Location = new System.Drawing.Point(19, 127); - this.checkBoxShowLineNumbers.Name = "checkBoxShowLineNumbers"; - this.checkBoxShowLineNumbers.Size = new System.Drawing.Size(115, 17); - this.checkBoxShowLineNumbers.TabIndex = 1; - this.checkBoxShowLineNumbers.Text = "Show line numbers"; - this.checkBoxShowLineNumbers.UseVisualStyleBackColor = true; - this.checkBoxShowLineNumbers.CheckedChanged += new System.EventHandler(this.radioButtonFormatNone_CheckedChanged); - // - // groupBoxTimeCodeFormat - // - this.groupBoxTimeCodeFormat.Controls.Add(this.comboBoxTimeCodeSeparator); - this.groupBoxTimeCodeFormat.Controls.Add(this.labelTimeCodeSeparator); - this.groupBoxTimeCodeFormat.Controls.Add(this.radioButtonTimeCodeHHMMSSFF); - this.groupBoxTimeCodeFormat.Controls.Add(this.radioButtonTimeCodeMs); - this.groupBoxTimeCodeFormat.Controls.Add(this.radioButtonTimeCodeSrt); - this.groupBoxTimeCodeFormat.Location = new System.Drawing.Point(6, 264); - this.groupBoxTimeCodeFormat.Name = "groupBoxTimeCodeFormat"; - this.groupBoxTimeCodeFormat.Size = new System.Drawing.Size(326, 119); - this.groupBoxTimeCodeFormat.TabIndex = 7; - this.groupBoxTimeCodeFormat.TabStop = false; - this.groupBoxTimeCodeFormat.Text = "Time code format"; - // - // comboBoxTimeCodeSeparator - // - this.comboBoxTimeCodeSeparator.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxTimeCodeSeparator.FormattingEnabled = true; - this.comboBoxTimeCodeSeparator.Items.AddRange(new object[] { - " --> ", - " - ", - " "}); - this.comboBoxTimeCodeSeparator.Location = new System.Drawing.Point(121, 90); - this.comboBoxTimeCodeSeparator.Name = "comboBoxTimeCodeSeparator"; - this.comboBoxTimeCodeSeparator.Size = new System.Drawing.Size(121, 21); - this.comboBoxTimeCodeSeparator.TabIndex = 4; - this.comboBoxTimeCodeSeparator.SelectedIndexChanged += new System.EventHandler(this.radioButtonFormatNone_CheckedChanged); - // - // labelTimeCodeSeparator - // - this.labelTimeCodeSeparator.AutoSize = true; - this.labelTimeCodeSeparator.Location = new System.Drawing.Point(13, 93); - this.labelTimeCodeSeparator.Name = "labelTimeCodeSeparator"; - this.labelTimeCodeSeparator.Size = new System.Drawing.Size(104, 13); - this.labelTimeCodeSeparator.TabIndex = 3; - this.labelTimeCodeSeparator.Text = "Time code separator"; - // - // radioButtonTimeCodeHHMMSSFF - // - this.radioButtonTimeCodeHHMMSSFF.AutoSize = true; - this.radioButtonTimeCodeHHMMSSFF.Location = new System.Drawing.Point(16, 65); - this.radioButtonTimeCodeHHMMSSFF.Name = "radioButtonTimeCodeHHMMSSFF"; - this.radioButtonTimeCodeHHMMSSFF.Size = new System.Drawing.Size(226, 17); - this.radioButtonTimeCodeHHMMSSFF.TabIndex = 2; - this.radioButtonTimeCodeHHMMSSFF.Text = "HH:MM:SS:FF (00:00:00:01 - 00:00:02:05)"; - this.radioButtonTimeCodeHHMMSSFF.UseVisualStyleBackColor = true; - this.radioButtonTimeCodeHHMMSSFF.CheckedChanged += new System.EventHandler(this.radioButtonFormatNone_CheckedChanged); - // - // radioButtonTimeCodeMs - // - this.radioButtonTimeCodeMs.AutoSize = true; - this.radioButtonTimeCodeMs.Location = new System.Drawing.Point(16, 42); - this.radioButtonTimeCodeMs.Name = "radioButtonTimeCodeMs"; - this.radioButtonTimeCodeMs.Size = new System.Drawing.Size(130, 17); - this.radioButtonTimeCodeMs.TabIndex = 1; - this.radioButtonTimeCodeMs.Text = "Milliseconds (0 - 2100)"; - this.radioButtonTimeCodeMs.UseVisualStyleBackColor = true; - this.radioButtonTimeCodeMs.CheckedChanged += new System.EventHandler(this.radioButtonFormatNone_CheckedChanged); - // - // radioButtonTimeCodeSrt - // - this.radioButtonTimeCodeSrt.AutoSize = true; - this.radioButtonTimeCodeSrt.Checked = true; - this.radioButtonTimeCodeSrt.Location = new System.Drawing.Point(16, 19); - this.radioButtonTimeCodeSrt.Name = "radioButtonTimeCodeSrt"; - this.radioButtonTimeCodeSrt.Size = new System.Drawing.Size(191, 17); - this.radioButtonTimeCodeSrt.TabIndex = 0; - this.radioButtonTimeCodeSrt.TabStop = true; - this.radioButtonTimeCodeSrt.Text = "Srt (00:00:00.000 --> 00:00:02.100)"; - this.radioButtonTimeCodeSrt.UseVisualStyleBackColor = true; - this.radioButtonTimeCodeSrt.CheckedChanged += new System.EventHandler(this.radioButtonFormatNone_CheckedChanged); - // - // groupBoxFormatText - // - this.groupBoxFormatText.Controls.Add(this.checkBoxRemoveStyling); - this.groupBoxFormatText.Controls.Add(this.radioButtonFormatMergeAll); - this.groupBoxFormatText.Controls.Add(this.radioButtonFormatNone); - this.groupBoxFormatText.Controls.Add(this.radioButtonFormatUnbreak); - this.groupBoxFormatText.Location = new System.Drawing.Point(6, 19); - this.groupBoxFormatText.Name = "groupBoxFormatText"; - this.groupBoxFormatText.Size = new System.Drawing.Size(326, 91); - this.groupBoxFormatText.TabIndex = 0; - this.groupBoxFormatText.TabStop = false; - this.groupBoxFormatText.Text = "Format text"; - // - // checkBoxRemoveStyling - // - this.checkBoxRemoveStyling.AutoSize = true; - this.checkBoxRemoveStyling.Checked = true; - this.checkBoxRemoveStyling.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxRemoveStyling.Location = new System.Drawing.Point(14, 68); - this.checkBoxRemoveStyling.Name = "checkBoxRemoveStyling"; - this.checkBoxRemoveStyling.Size = new System.Drawing.Size(98, 17); - this.checkBoxRemoveStyling.TabIndex = 3; - this.checkBoxRemoveStyling.Text = "Remove styling"; - this.checkBoxRemoveStyling.UseVisualStyleBackColor = true; - this.checkBoxRemoveStyling.CheckedChanged += new System.EventHandler(this.radioButtonFormatNone_CheckedChanged); - // - // radioButtonFormatMergeAll - // - this.radioButtonFormatMergeAll.AutoSize = true; - this.radioButtonFormatMergeAll.Location = new System.Drawing.Point(159, 19); - this.radioButtonFormatMergeAll.Name = "radioButtonFormatMergeAll"; - this.radioButtonFormatMergeAll.Size = new System.Drawing.Size(92, 17); - this.radioButtonFormatMergeAll.TabIndex = 1; - this.radioButtonFormatMergeAll.Text = "Merge all lines"; - this.radioButtonFormatMergeAll.UseVisualStyleBackColor = true; - this.radioButtonFormatMergeAll.CheckedChanged += new System.EventHandler(this.radioButtonFormatNone_CheckedChanged); - // - // radioButtonFormatNone - // - this.radioButtonFormatNone.AutoSize = true; - this.radioButtonFormatNone.Checked = true; - this.radioButtonFormatNone.Location = new System.Drawing.Point(14, 19); - this.radioButtonFormatNone.Name = "radioButtonFormatNone"; - this.radioButtonFormatNone.Size = new System.Drawing.Size(51, 17); - this.radioButtonFormatNone.TabIndex = 0; - this.radioButtonFormatNone.TabStop = true; - this.radioButtonFormatNone.Text = "None"; - this.radioButtonFormatNone.UseVisualStyleBackColor = true; - this.radioButtonFormatNone.CheckedChanged += new System.EventHandler(this.radioButtonFormatNone_CheckedChanged); - // - // radioButtonFormatUnbreak - // - this.radioButtonFormatUnbreak.AutoSize = true; - this.radioButtonFormatUnbreak.Location = new System.Drawing.Point(14, 42); - this.radioButtonFormatUnbreak.Name = "radioButtonFormatUnbreak"; - this.radioButtonFormatUnbreak.Size = new System.Drawing.Size(90, 17); - this.radioButtonFormatUnbreak.TabIndex = 2; - this.radioButtonFormatUnbreak.Text = "Unbreak lines"; - this.radioButtonFormatUnbreak.UseVisualStyleBackColor = true; - this.radioButtonFormatUnbreak.CheckedChanged += new System.EventHandler(this.radioButtonFormatNone_CheckedChanged); - // - // checkBoxShowTimeCodes - // - this.checkBoxShowTimeCodes.AutoSize = true; - this.checkBoxShowTimeCodes.Location = new System.Drawing.Point(19, 169); - this.checkBoxShowTimeCodes.Name = "checkBoxShowTimeCodes"; - this.checkBoxShowTimeCodes.Size = new System.Drawing.Size(107, 17); - this.checkBoxShowTimeCodes.TabIndex = 3; - this.checkBoxShowTimeCodes.Text = "Show time codes"; - this.checkBoxShowTimeCodes.UseVisualStyleBackColor = true; - this.checkBoxShowTimeCodes.CheckedChanged += new System.EventHandler(this.radioButtonFormatNone_CheckedChanged); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(719, 454); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 2; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(581, 454); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(132, 23); - this.buttonOK.TabIndex = 1; - this.buttonOK.Text = "Save as..."; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // labelPreview - // - this.labelPreview.AutoSize = true; - this.labelPreview.Location = new System.Drawing.Point(13, 21); - this.labelPreview.Name = "labelPreview"; - this.labelPreview.Size = new System.Drawing.Size(45, 13); - this.labelPreview.TabIndex = 3; - this.labelPreview.Text = "Preview"; - // - // ExportText - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(806, 487); - this.Controls.Add(this.labelPreview); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.groupBoxImportOptions); - this.Controls.Add(this.textBoxText); - this.KeyPreview = true; - this.MinimumSize = new System.Drawing.Size(800, 520); - this.Name = "ExportText"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Export plain text"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.ExportText_FormClosing); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ExportText_KeyDown); - this.groupBoxImportOptions.ResumeLayout(false); - this.groupBoxImportOptions.PerformLayout(); - this.groupBoxTimeCodeFormat.ResumeLayout(false); - this.groupBoxTimeCodeFormat.PerformLayout(); - this.groupBoxFormatText.ResumeLayout(false); - this.groupBoxFormatText.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.TextBox textBoxText; - private System.Windows.Forms.GroupBox groupBoxImportOptions; - private System.Windows.Forms.CheckBox checkBoxShowLineNumbers; - private System.Windows.Forms.GroupBox groupBoxTimeCodeFormat; - private System.Windows.Forms.RadioButton radioButtonTimeCodeMs; - private System.Windows.Forms.RadioButton radioButtonTimeCodeSrt; - private System.Windows.Forms.GroupBox groupBoxFormatText; - private System.Windows.Forms.RadioButton radioButtonFormatMergeAll; - private System.Windows.Forms.RadioButton radioButtonFormatNone; - private System.Windows.Forms.RadioButton radioButtonFormatUnbreak; - private System.Windows.Forms.CheckBox checkBoxShowTimeCodes; - private System.Windows.Forms.CheckBox checkBoxAddNewLine2; - private System.Windows.Forms.CheckBox checkBoxAddAfterText; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.SaveFileDialog saveFileDialog1; - private System.Windows.Forms.RadioButton radioButtonTimeCodeHHMMSSFF; - private System.Windows.Forms.CheckBox checkBoxAddNewlineAfterLineNumber; - private System.Windows.Forms.CheckBox checkBoxAddNewlineAfterTimeCodes; - private System.Windows.Forms.ComboBox comboBoxTimeCodeSeparator; - private System.Windows.Forms.Label labelTimeCodeSeparator; - private System.Windows.Forms.Label labelPreview; - private System.Windows.Forms.CheckBox checkBoxRemoveStyling; - private System.Windows.Forms.Label labelEncoding; - private System.Windows.Forms.ComboBox comboBoxEncoding; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class ExportText + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.textBoxText = new System.Windows.Forms.TextBox(); + this.groupBoxImportOptions = new System.Windows.Forms.GroupBox(); + this.labelEncoding = new System.Windows.Forms.Label(); + this.comboBoxEncoding = new System.Windows.Forms.ComboBox(); + this.checkBoxAddNewlineAfterTimeCodes = new System.Windows.Forms.CheckBox(); + this.checkBoxAddNewlineAfterLineNumber = new System.Windows.Forms.CheckBox(); + this.checkBoxAddNewLine2 = new System.Windows.Forms.CheckBox(); + this.checkBoxAddAfterText = new System.Windows.Forms.CheckBox(); + this.checkBoxShowLineNumbers = new System.Windows.Forms.CheckBox(); + this.groupBoxTimeCodeFormat = new System.Windows.Forms.GroupBox(); + this.comboBoxTimeCodeSeparator = new System.Windows.Forms.ComboBox(); + this.labelTimeCodeSeparator = new System.Windows.Forms.Label(); + this.radioButtonTimeCodeHHMMSSFF = new System.Windows.Forms.RadioButton(); + this.radioButtonTimeCodeMs = new System.Windows.Forms.RadioButton(); + this.radioButtonTimeCodeSrt = new System.Windows.Forms.RadioButton(); + this.groupBoxFormatText = new System.Windows.Forms.GroupBox(); + this.checkBoxRemoveStyling = new System.Windows.Forms.CheckBox(); + this.radioButtonFormatMergeAll = new System.Windows.Forms.RadioButton(); + this.radioButtonFormatNone = new System.Windows.Forms.RadioButton(); + this.radioButtonFormatUnbreak = new System.Windows.Forms.RadioButton(); + this.checkBoxShowTimeCodes = new System.Windows.Forms.CheckBox(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog(); + this.labelPreview = new System.Windows.Forms.Label(); + this.groupBoxImportOptions.SuspendLayout(); + this.groupBoxTimeCodeFormat.SuspendLayout(); + this.groupBoxFormatText.SuspendLayout(); + this.SuspendLayout(); + // + // textBoxText + // + this.textBoxText.AllowDrop = true; + this.textBoxText.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxText.Location = new System.Drawing.Point(12, 40); + this.textBoxText.MaxLength = 0; + this.textBoxText.Multiline = true; + this.textBoxText.Name = "textBoxText"; + this.textBoxText.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.textBoxText.Size = new System.Drawing.Size(403, 405); + this.textBoxText.TabIndex = 3; + // + // groupBoxImportOptions + // + this.groupBoxImportOptions.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxImportOptions.Controls.Add(this.labelEncoding); + this.groupBoxImportOptions.Controls.Add(this.comboBoxEncoding); + this.groupBoxImportOptions.Controls.Add(this.checkBoxAddNewlineAfterTimeCodes); + this.groupBoxImportOptions.Controls.Add(this.checkBoxAddNewlineAfterLineNumber); + this.groupBoxImportOptions.Controls.Add(this.checkBoxAddNewLine2); + this.groupBoxImportOptions.Controls.Add(this.checkBoxAddAfterText); + this.groupBoxImportOptions.Controls.Add(this.checkBoxShowLineNumbers); + this.groupBoxImportOptions.Controls.Add(this.groupBoxTimeCodeFormat); + this.groupBoxImportOptions.Controls.Add(this.groupBoxFormatText); + this.groupBoxImportOptions.Controls.Add(this.checkBoxShowTimeCodes); + this.groupBoxImportOptions.Location = new System.Drawing.Point(421, 21); + this.groupBoxImportOptions.Name = "groupBoxImportOptions"; + this.groupBoxImportOptions.Size = new System.Drawing.Size(373, 427); + this.groupBoxImportOptions.TabIndex = 0; + this.groupBoxImportOptions.TabStop = false; + this.groupBoxImportOptions.Text = "Export options"; + // + // labelEncoding + // + this.labelEncoding.AutoSize = true; + this.labelEncoding.Location = new System.Drawing.Point(13, 392); + this.labelEncoding.Name = "labelEncoding"; + this.labelEncoding.Size = new System.Drawing.Size(52, 13); + this.labelEncoding.TabIndex = 8; + this.labelEncoding.Text = "Encoding"; + // + // comboBoxEncoding + // + this.comboBoxEncoding.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxEncoding.FormattingEnabled = true; + this.comboBoxEncoding.Location = new System.Drawing.Point(71, 389); + this.comboBoxEncoding.Name = "comboBoxEncoding"; + this.comboBoxEncoding.Size = new System.Drawing.Size(221, 21); + this.comboBoxEncoding.TabIndex = 9; + // + // checkBoxAddNewlineAfterTimeCodes + // + this.checkBoxAddNewlineAfterTimeCodes.AutoSize = true; + this.checkBoxAddNewlineAfterTimeCodes.Checked = true; + this.checkBoxAddNewlineAfterTimeCodes.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxAddNewlineAfterTimeCodes.Location = new System.Drawing.Point(36, 188); + this.checkBoxAddNewlineAfterTimeCodes.Name = "checkBoxAddNewlineAfterTimeCodes"; + this.checkBoxAddNewlineAfterTimeCodes.Size = new System.Drawing.Size(160, 17); + this.checkBoxAddNewlineAfterTimeCodes.TabIndex = 4; + this.checkBoxAddNewlineAfterTimeCodes.Text = "Add new line after time code"; + this.checkBoxAddNewlineAfterTimeCodes.UseVisualStyleBackColor = true; + this.checkBoxAddNewlineAfterTimeCodes.CheckedChanged += new System.EventHandler(this.radioButtonFormatNone_CheckedChanged); + // + // checkBoxAddNewlineAfterLineNumber + // + this.checkBoxAddNewlineAfterLineNumber.AutoSize = true; + this.checkBoxAddNewlineAfterLineNumber.Checked = true; + this.checkBoxAddNewlineAfterLineNumber.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxAddNewlineAfterLineNumber.Location = new System.Drawing.Point(36, 146); + this.checkBoxAddNewlineAfterLineNumber.Name = "checkBoxAddNewlineAfterLineNumber"; + this.checkBoxAddNewlineAfterLineNumber.Size = new System.Drawing.Size(168, 17); + this.checkBoxAddNewlineAfterLineNumber.TabIndex = 2; + this.checkBoxAddNewlineAfterLineNumber.Text = "Add new line after line number"; + this.checkBoxAddNewlineAfterLineNumber.UseVisualStyleBackColor = true; + this.checkBoxAddNewlineAfterLineNumber.CheckedChanged += new System.EventHandler(this.radioButtonFormatNone_CheckedChanged); + // + // checkBoxAddNewLine2 + // + this.checkBoxAddNewLine2.AutoSize = true; + this.checkBoxAddNewLine2.Checked = true; + this.checkBoxAddNewLine2.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxAddNewLine2.Location = new System.Drawing.Point(19, 234); + this.checkBoxAddNewLine2.Name = "checkBoxAddNewLine2"; + this.checkBoxAddNewLine2.Size = new System.Drawing.Size(172, 17); + this.checkBoxAddNewLine2.TabIndex = 6; + this.checkBoxAddNewLine2.Text = "Add new line between subtitles"; + this.checkBoxAddNewLine2.UseVisualStyleBackColor = true; + this.checkBoxAddNewLine2.CheckedChanged += new System.EventHandler(this.radioButtonFormatNone_CheckedChanged); + // + // checkBoxAddAfterText + // + this.checkBoxAddAfterText.AutoSize = true; + this.checkBoxAddAfterText.Checked = true; + this.checkBoxAddAfterText.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxAddAfterText.Location = new System.Drawing.Point(19, 211); + this.checkBoxAddAfterText.Name = "checkBoxAddAfterText"; + this.checkBoxAddAfterText.Size = new System.Drawing.Size(136, 17); + this.checkBoxAddAfterText.TabIndex = 5; + this.checkBoxAddAfterText.Text = "Add new line after texts"; + this.checkBoxAddAfterText.UseVisualStyleBackColor = true; + this.checkBoxAddAfterText.CheckedChanged += new System.EventHandler(this.radioButtonFormatNone_CheckedChanged); + // + // checkBoxShowLineNumbers + // + this.checkBoxShowLineNumbers.AutoSize = true; + this.checkBoxShowLineNumbers.Location = new System.Drawing.Point(19, 127); + this.checkBoxShowLineNumbers.Name = "checkBoxShowLineNumbers"; + this.checkBoxShowLineNumbers.Size = new System.Drawing.Size(115, 17); + this.checkBoxShowLineNumbers.TabIndex = 1; + this.checkBoxShowLineNumbers.Text = "Show line numbers"; + this.checkBoxShowLineNumbers.UseVisualStyleBackColor = true; + this.checkBoxShowLineNumbers.CheckedChanged += new System.EventHandler(this.radioButtonFormatNone_CheckedChanged); + // + // groupBoxTimeCodeFormat + // + this.groupBoxTimeCodeFormat.Controls.Add(this.comboBoxTimeCodeSeparator); + this.groupBoxTimeCodeFormat.Controls.Add(this.labelTimeCodeSeparator); + this.groupBoxTimeCodeFormat.Controls.Add(this.radioButtonTimeCodeHHMMSSFF); + this.groupBoxTimeCodeFormat.Controls.Add(this.radioButtonTimeCodeMs); + this.groupBoxTimeCodeFormat.Controls.Add(this.radioButtonTimeCodeSrt); + this.groupBoxTimeCodeFormat.Location = new System.Drawing.Point(6, 264); + this.groupBoxTimeCodeFormat.Name = "groupBoxTimeCodeFormat"; + this.groupBoxTimeCodeFormat.Size = new System.Drawing.Size(326, 119); + this.groupBoxTimeCodeFormat.TabIndex = 7; + this.groupBoxTimeCodeFormat.TabStop = false; + this.groupBoxTimeCodeFormat.Text = "Time code format"; + // + // comboBoxTimeCodeSeparator + // + this.comboBoxTimeCodeSeparator.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxTimeCodeSeparator.FormattingEnabled = true; + this.comboBoxTimeCodeSeparator.Items.AddRange(new object[] { + " --> ", + " - ", + " "}); + this.comboBoxTimeCodeSeparator.Location = new System.Drawing.Point(121, 90); + this.comboBoxTimeCodeSeparator.Name = "comboBoxTimeCodeSeparator"; + this.comboBoxTimeCodeSeparator.Size = new System.Drawing.Size(121, 21); + this.comboBoxTimeCodeSeparator.TabIndex = 4; + this.comboBoxTimeCodeSeparator.SelectedIndexChanged += new System.EventHandler(this.radioButtonFormatNone_CheckedChanged); + // + // labelTimeCodeSeparator + // + this.labelTimeCodeSeparator.AutoSize = true; + this.labelTimeCodeSeparator.Location = new System.Drawing.Point(13, 93); + this.labelTimeCodeSeparator.Name = "labelTimeCodeSeparator"; + this.labelTimeCodeSeparator.Size = new System.Drawing.Size(104, 13); + this.labelTimeCodeSeparator.TabIndex = 3; + this.labelTimeCodeSeparator.Text = "Time code separator"; + // + // radioButtonTimeCodeHHMMSSFF + // + this.radioButtonTimeCodeHHMMSSFF.AutoSize = true; + this.radioButtonTimeCodeHHMMSSFF.Location = new System.Drawing.Point(16, 65); + this.radioButtonTimeCodeHHMMSSFF.Name = "radioButtonTimeCodeHHMMSSFF"; + this.radioButtonTimeCodeHHMMSSFF.Size = new System.Drawing.Size(226, 17); + this.radioButtonTimeCodeHHMMSSFF.TabIndex = 2; + this.radioButtonTimeCodeHHMMSSFF.Text = "HH:MM:SS:FF (00:00:00:01 - 00:00:02:05)"; + this.radioButtonTimeCodeHHMMSSFF.UseVisualStyleBackColor = true; + this.radioButtonTimeCodeHHMMSSFF.CheckedChanged += new System.EventHandler(this.radioButtonFormatNone_CheckedChanged); + // + // radioButtonTimeCodeMs + // + this.radioButtonTimeCodeMs.AutoSize = true; + this.radioButtonTimeCodeMs.Location = new System.Drawing.Point(16, 42); + this.radioButtonTimeCodeMs.Name = "radioButtonTimeCodeMs"; + this.radioButtonTimeCodeMs.Size = new System.Drawing.Size(130, 17); + this.radioButtonTimeCodeMs.TabIndex = 1; + this.radioButtonTimeCodeMs.Text = "Milliseconds (0 - 2100)"; + this.radioButtonTimeCodeMs.UseVisualStyleBackColor = true; + this.radioButtonTimeCodeMs.CheckedChanged += new System.EventHandler(this.radioButtonFormatNone_CheckedChanged); + // + // radioButtonTimeCodeSrt + // + this.radioButtonTimeCodeSrt.AutoSize = true; + this.radioButtonTimeCodeSrt.Checked = true; + this.radioButtonTimeCodeSrt.Location = new System.Drawing.Point(16, 19); + this.radioButtonTimeCodeSrt.Name = "radioButtonTimeCodeSrt"; + this.radioButtonTimeCodeSrt.Size = new System.Drawing.Size(191, 17); + this.radioButtonTimeCodeSrt.TabIndex = 0; + this.radioButtonTimeCodeSrt.TabStop = true; + this.radioButtonTimeCodeSrt.Text = "Srt (00:00:00.000 --> 00:00:02.100)"; + this.radioButtonTimeCodeSrt.UseVisualStyleBackColor = true; + this.radioButtonTimeCodeSrt.CheckedChanged += new System.EventHandler(this.radioButtonFormatNone_CheckedChanged); + // + // groupBoxFormatText + // + this.groupBoxFormatText.Controls.Add(this.checkBoxRemoveStyling); + this.groupBoxFormatText.Controls.Add(this.radioButtonFormatMergeAll); + this.groupBoxFormatText.Controls.Add(this.radioButtonFormatNone); + this.groupBoxFormatText.Controls.Add(this.radioButtonFormatUnbreak); + this.groupBoxFormatText.Location = new System.Drawing.Point(6, 19); + this.groupBoxFormatText.Name = "groupBoxFormatText"; + this.groupBoxFormatText.Size = new System.Drawing.Size(326, 91); + this.groupBoxFormatText.TabIndex = 0; + this.groupBoxFormatText.TabStop = false; + this.groupBoxFormatText.Text = "Format text"; + // + // checkBoxRemoveStyling + // + this.checkBoxRemoveStyling.AutoSize = true; + this.checkBoxRemoveStyling.Checked = true; + this.checkBoxRemoveStyling.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxRemoveStyling.Location = new System.Drawing.Point(14, 68); + this.checkBoxRemoveStyling.Name = "checkBoxRemoveStyling"; + this.checkBoxRemoveStyling.Size = new System.Drawing.Size(98, 17); + this.checkBoxRemoveStyling.TabIndex = 3; + this.checkBoxRemoveStyling.Text = "Remove styling"; + this.checkBoxRemoveStyling.UseVisualStyleBackColor = true; + this.checkBoxRemoveStyling.CheckedChanged += new System.EventHandler(this.radioButtonFormatNone_CheckedChanged); + // + // radioButtonFormatMergeAll + // + this.radioButtonFormatMergeAll.AutoSize = true; + this.radioButtonFormatMergeAll.Location = new System.Drawing.Point(159, 19); + this.radioButtonFormatMergeAll.Name = "radioButtonFormatMergeAll"; + this.radioButtonFormatMergeAll.Size = new System.Drawing.Size(92, 17); + this.radioButtonFormatMergeAll.TabIndex = 1; + this.radioButtonFormatMergeAll.Text = "Merge all lines"; + this.radioButtonFormatMergeAll.UseVisualStyleBackColor = true; + this.radioButtonFormatMergeAll.CheckedChanged += new System.EventHandler(this.radioButtonFormatNone_CheckedChanged); + // + // radioButtonFormatNone + // + this.radioButtonFormatNone.AutoSize = true; + this.radioButtonFormatNone.Checked = true; + this.radioButtonFormatNone.Location = new System.Drawing.Point(14, 19); + this.radioButtonFormatNone.Name = "radioButtonFormatNone"; + this.radioButtonFormatNone.Size = new System.Drawing.Size(51, 17); + this.radioButtonFormatNone.TabIndex = 0; + this.radioButtonFormatNone.TabStop = true; + this.radioButtonFormatNone.Text = "None"; + this.radioButtonFormatNone.UseVisualStyleBackColor = true; + this.radioButtonFormatNone.CheckedChanged += new System.EventHandler(this.radioButtonFormatNone_CheckedChanged); + // + // radioButtonFormatUnbreak + // + this.radioButtonFormatUnbreak.AutoSize = true; + this.radioButtonFormatUnbreak.Location = new System.Drawing.Point(14, 42); + this.radioButtonFormatUnbreak.Name = "radioButtonFormatUnbreak"; + this.radioButtonFormatUnbreak.Size = new System.Drawing.Size(90, 17); + this.radioButtonFormatUnbreak.TabIndex = 2; + this.radioButtonFormatUnbreak.Text = "Unbreak lines"; + this.radioButtonFormatUnbreak.UseVisualStyleBackColor = true; + this.radioButtonFormatUnbreak.CheckedChanged += new System.EventHandler(this.radioButtonFormatNone_CheckedChanged); + // + // checkBoxShowTimeCodes + // + this.checkBoxShowTimeCodes.AutoSize = true; + this.checkBoxShowTimeCodes.Location = new System.Drawing.Point(19, 169); + this.checkBoxShowTimeCodes.Name = "checkBoxShowTimeCodes"; + this.checkBoxShowTimeCodes.Size = new System.Drawing.Size(107, 17); + this.checkBoxShowTimeCodes.TabIndex = 3; + this.checkBoxShowTimeCodes.Text = "Show time codes"; + this.checkBoxShowTimeCodes.UseVisualStyleBackColor = true; + this.checkBoxShowTimeCodes.CheckedChanged += new System.EventHandler(this.radioButtonFormatNone_CheckedChanged); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(719, 454); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 2; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(581, 454); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(132, 23); + this.buttonOK.TabIndex = 1; + this.buttonOK.Text = "Save as..."; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // labelPreview + // + this.labelPreview.AutoSize = true; + this.labelPreview.Location = new System.Drawing.Point(13, 21); + this.labelPreview.Name = "labelPreview"; + this.labelPreview.Size = new System.Drawing.Size(45, 13); + this.labelPreview.TabIndex = 3; + this.labelPreview.Text = "Preview"; + // + // ExportText + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(806, 487); + this.Controls.Add(this.labelPreview); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.groupBoxImportOptions); + this.Controls.Add(this.textBoxText); + this.KeyPreview = true; + this.MinimumSize = new System.Drawing.Size(800, 520); + this.Name = "ExportText"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Export plain text"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.ExportText_FormClosing); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ExportText_KeyDown); + this.groupBoxImportOptions.ResumeLayout(false); + this.groupBoxImportOptions.PerformLayout(); + this.groupBoxTimeCodeFormat.ResumeLayout(false); + this.groupBoxTimeCodeFormat.PerformLayout(); + this.groupBoxFormatText.ResumeLayout(false); + this.groupBoxFormatText.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox textBoxText; + private System.Windows.Forms.GroupBox groupBoxImportOptions; + private System.Windows.Forms.CheckBox checkBoxShowLineNumbers; + private System.Windows.Forms.GroupBox groupBoxTimeCodeFormat; + private System.Windows.Forms.RadioButton radioButtonTimeCodeMs; + private System.Windows.Forms.RadioButton radioButtonTimeCodeSrt; + private System.Windows.Forms.GroupBox groupBoxFormatText; + private System.Windows.Forms.RadioButton radioButtonFormatMergeAll; + private System.Windows.Forms.RadioButton radioButtonFormatNone; + private System.Windows.Forms.RadioButton radioButtonFormatUnbreak; + private System.Windows.Forms.CheckBox checkBoxShowTimeCodes; + private System.Windows.Forms.CheckBox checkBoxAddNewLine2; + private System.Windows.Forms.CheckBox checkBoxAddAfterText; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.SaveFileDialog saveFileDialog1; + private System.Windows.Forms.RadioButton radioButtonTimeCodeHHMMSSFF; + private System.Windows.Forms.CheckBox checkBoxAddNewlineAfterLineNumber; + private System.Windows.Forms.CheckBox checkBoxAddNewlineAfterTimeCodes; + private System.Windows.Forms.ComboBox comboBoxTimeCodeSeparator; + private System.Windows.Forms.Label labelTimeCodeSeparator; + private System.Windows.Forms.Label labelPreview; + private System.Windows.Forms.CheckBox checkBoxRemoveStyling; + private System.Windows.Forms.Label labelEncoding; + private System.Windows.Forms.ComboBox comboBoxEncoding; + } } \ No newline at end of file diff --git a/src/Forms/ExportText.cs b/src/ui/Forms/ExportText.cs similarity index 97% rename from src/Forms/ExportText.cs rename to src/ui/Forms/ExportText.cs index 58c99291d..4d85b6938 100644 --- a/src/Forms/ExportText.cs +++ b/src/ui/Forms/ExportText.cs @@ -1,325 +1,325 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.IO; -using System.Text; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class ExportText : Form - { - public class ExportOptions - { - public bool ShowLineNumbers { get; set; } - public bool AddNewlineAfterLineNumber { get; set; } - public bool ShowTimeCodes { get; set; } - public bool TimeCodeSrt { get; set; } - public bool TimeCodeHHMMSSFF { get; set; } - public bool AddNewlineAfterTimeCodes { get; set; } - public string TimeCodeSeparator { get; set; } - public bool RemoveStyling { get; set; } - public bool FormatUnbreak { get; set; } - public bool AddNewAfterText { get; set; } - public bool AddNewAfterText2 { get; set; } - public bool FormatMergeAll { get; set; } - } - - private Subtitle _subtitle; - private string _fileName; - private bool _loading; - - public ExportText() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - var l = Configuration.Settings.Language.ExportText; - Text = l.Title; - labelPreview.Text = l.Preview; - groupBoxImportOptions.Text = l.ExportOptions; - groupBoxFormatText.Text = l.FormatText; - radioButtonFormatNone.Text = l.None; - radioButtonFormatMergeAll.Text = l.MergeAllLines; - radioButtonFormatUnbreak.Text = l.UnbreakLines; - checkBoxRemoveStyling.Text = l.RemoveStyling; - checkBoxShowLineNumbers.Text = l.ShowLineNumbers; - checkBoxAddNewlineAfterLineNumber.Text = l.AddNewLineAfterLineNumber; - checkBoxShowTimeCodes.Text = l.ShowTimeCode; - checkBoxAddAfterText.Text = l.AddNewLineAfterTexts; - checkBoxAddNewlineAfterTimeCodes.Text = l.AddNewLineAfterTimeCode; - checkBoxAddNewLine2.Text = l.AddNewLineBetweenSubtitles; - groupBoxTimeCodeFormat.Text = l.TimeCodeFormat; - radioButtonTimeCodeSrt.Text = l.Srt; - radioButtonTimeCodeMs.Text = l.Milliseconds; - radioButtonTimeCodeHHMMSSFF.Text = l.HHMMSSFF; - labelTimeCodeSeparator.Text = l.TimeCodeSeparator; - comboBoxTimeCodeSeparator.Left = labelTimeCodeSeparator.Left + labelTimeCodeSeparator.Width + 5; - labelEncoding.Text = Configuration.Settings.Language.Main.Controls.FileEncoding; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - buttonOK.Text = Configuration.Settings.Language.Main.Menu.File.SaveAs; - - _loading = true; - } - - internal void Initialize(Subtitle subtitle, string fileName) - { - _subtitle = subtitle; - _fileName = fileName; - textBoxText.ReadOnly = true; - comboBoxTimeCodeSeparator.SelectedIndex = 0; - LoadSettings(); - _loading = false; - GeneratePreview(); - UiUtil.InitializeTextEncodingComboBox(comboBoxEncoding); - } - - private void LoadSettings() - { - if (Configuration.Settings.Tools.ExportTextFormatText == "None") - { - radioButtonFormatNone.Checked = true; - } - else if (Configuration.Settings.Tools.ExportTextFormatText == "Unbreak") - { - radioButtonFormatUnbreak.Checked = true; - } - else - { - radioButtonFormatMergeAll.Checked = true; - } - - checkBoxRemoveStyling.Checked = Configuration.Settings.Tools.ExportTextRemoveStyling; - checkBoxShowLineNumbers.Checked = Configuration.Settings.Tools.ExportTextShowLineNumbers; - checkBoxAddNewlineAfterLineNumber.Checked = Configuration.Settings.Tools.ExportTextShowLineNumbersNewLine; - checkBoxShowTimeCodes.Checked = Configuration.Settings.Tools.ExportTextShowTimeCodes; - checkBoxAddNewlineAfterTimeCodes.Checked = Configuration.Settings.Tools.ExportTextShowTimeCodesNewLine; - checkBoxAddAfterText.Checked = Configuration.Settings.Tools.ExportTextNewLineAfterText; - checkBoxAddNewLine2.Checked = Configuration.Settings.Tools.ExportTextNewLineBetweenSubtitles; - checkBoxShowTimeCodes.Checked = Configuration.Settings.Tools.ExportTextShowTimeCodes; - - if (Configuration.Settings.Tools.ExportTextTimeCodeFormat == "Frames") - { - radioButtonTimeCodeHHMMSSFF.Checked = true; - } - else if (Configuration.Settings.Tools.ExportTextTimeCodeFormat == "Milliseconds") - { - radioButtonTimeCodeMs.Checked = true; - } - else - { - radioButtonTimeCodeSrt.Checked = true; - } - - if (Configuration.Settings.Tools.ExportTextTimeCodeSeparator == comboBoxTimeCodeSeparator.Items[0].ToString()) - { - comboBoxTimeCodeSeparator.SelectedIndex = 0; - } - else if (Configuration.Settings.Tools.ExportTextTimeCodeSeparator == comboBoxTimeCodeSeparator.Items[1].ToString()) - { - comboBoxTimeCodeSeparator.SelectedIndex = 1; - } - } - - private void GeneratePreview() - { - if (_loading) - { - return; - } - - groupBoxTimeCodeFormat.Enabled = checkBoxShowTimeCodes.Checked; - checkBoxAddAfterText.Enabled = !radioButtonFormatMergeAll.Checked; - checkBoxAddNewLine2.Enabled = !radioButtonFormatMergeAll.Checked; - checkBoxAddNewlineAfterLineNumber.Enabled = checkBoxShowLineNumbers.Checked; - checkBoxAddNewlineAfterTimeCodes.Enabled = checkBoxShowTimeCodes.Checked; - - var exportOptions = new ExportOptions - { - ShowLineNumbers = checkBoxShowLineNumbers.Checked, - AddNewlineAfterLineNumber = checkBoxAddNewlineAfterLineNumber.Checked, - ShowTimeCodes = checkBoxShowTimeCodes.Checked, - TimeCodeSrt = radioButtonTimeCodeSrt.Checked, - TimeCodeHHMMSSFF = radioButtonTimeCodeHHMMSSFF.Checked, - AddNewlineAfterTimeCodes = checkBoxAddNewlineAfterTimeCodes.Checked, - TimeCodeSeparator = comboBoxTimeCodeSeparator.Text, - RemoveStyling = checkBoxRemoveStyling.Checked, - FormatUnbreak = radioButtonFormatUnbreak.Checked, - AddNewAfterText = checkBoxAddAfterText.Checked, - AddNewAfterText2 = checkBoxAddNewLine2.Checked, - FormatMergeAll = radioButtonFormatMergeAll.Checked - }; - - string text = GeneratePlainText(_subtitle, exportOptions); - textBoxText.Text = text; - } - - public static string GeneratePlainText(Subtitle subtitle, ExportOptions exportOptions) - { - var sb = new StringBuilder(); - foreach (Paragraph p in subtitle.Paragraphs) - { - if (exportOptions.ShowLineNumbers) - { - sb.Append(p.Number); - if (exportOptions.AddNewlineAfterLineNumber) - { - sb.AppendLine(); - } - else - { - sb.Append(' '); - } - } - if (exportOptions.ShowTimeCodes) - { - if (exportOptions.TimeCodeSrt) - { - sb.Append(p.StartTime + exportOptions.TimeCodeSeparator + p.EndTime); - } - else if (exportOptions.TimeCodeHHMMSSFF) - { - sb.Append(p.StartTime.ToHHMMSSFF() + exportOptions.TimeCodeSeparator + p.EndTime.ToHHMMSSFF()); - } - else - { - sb.Append(p.StartTime.TotalMilliseconds + exportOptions.TimeCodeSeparator + p.EndTime.TotalMilliseconds); - } - - if (exportOptions.AddNewlineAfterTimeCodes) - { - sb.AppendLine(); - } - else - { - sb.Append(' '); - } - } - string s = p.Text; - if (exportOptions.RemoveStyling) - { - s = HtmlUtil.RemoveHtmlTags(s, true); - } - if (exportOptions.FormatUnbreak) - { - sb.Append(Utilities.UnbreakLine(s)); - } - else - { - sb.Append(s); - } - if (exportOptions.AddNewAfterText) - { - sb.AppendLine(); - } - - if (exportOptions.AddNewAfterText2) - { - sb.AppendLine(); - } - - if (!exportOptions.AddNewAfterText && !exportOptions.AddNewAfterText2) - { - sb.Append(' '); - } - } - string text = sb.ToString().Trim(); - if (exportOptions.FormatMergeAll) - { - text = text.Replace(Environment.NewLine, " "); - text = text.FixExtraSpaces(); - } - return text; - } - - private TextEncoding GetCurrentEncoding() - { - return UiUtil.GetTextEncodingComboBoxCurrentEncoding(comboBoxEncoding); - } - - private void buttonOK_Click(object sender, EventArgs e) - { - GeneratePreview(); - saveFileDialog1.Title = Configuration.Settings.Language.Main.ExportPlainTextAs; - saveFileDialog1.Filter = Configuration.Settings.Language.Main.TextFiles + "|*.txt"; - if (!string.IsNullOrEmpty(_fileName)) - { - saveFileDialog1.FileName = Path.GetFileNameWithoutExtension(_fileName); - } - - if (saveFileDialog1.ShowDialog(this) == DialogResult.OK) - { - FileUtil.WriteAllText(saveFileDialog1.FileName, textBoxText.Text, GetCurrentEncoding()); - DialogResult = DialogResult.OK; - } - } - - private void radioButtonFormatNone_CheckedChanged(object sender, EventArgs e) - { - GeneratePreview(); - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private void ExportText_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - private void ExportText_FormClosing(object sender, FormClosingEventArgs e) - { - if (radioButtonFormatNone.Checked) - { - Configuration.Settings.Tools.ExportTextFormatText = "None"; - } - else if (radioButtonFormatUnbreak.Checked) - { - Configuration.Settings.Tools.ExportTextFormatText = "Unbreak"; - } - else - { - Configuration.Settings.Tools.ExportTextFormatText = "MergeAll"; - } - - Configuration.Settings.Tools.ExportTextRemoveStyling = checkBoxRemoveStyling.Checked; - Configuration.Settings.Tools.ExportTextShowLineNumbers = checkBoxShowLineNumbers.Checked; - Configuration.Settings.Tools.ExportTextShowLineNumbersNewLine = checkBoxAddNewlineAfterLineNumber.Checked; - Configuration.Settings.Tools.ExportTextShowTimeCodes = checkBoxShowTimeCodes.Checked; - Configuration.Settings.Tools.ExportTextShowTimeCodesNewLine = checkBoxAddNewlineAfterTimeCodes.Checked; - Configuration.Settings.Tools.ExportTextNewLineAfterText = checkBoxAddAfterText.Checked; - Configuration.Settings.Tools.ExportTextNewLineBetweenSubtitles = checkBoxAddNewLine2.Checked; - - if (radioButtonTimeCodeHHMMSSFF.Checked) - { - Configuration.Settings.Tools.ExportTextTimeCodeFormat = "Frames"; - } - else if (radioButtonTimeCodeMs.Checked) - { - Configuration.Settings.Tools.ExportTextTimeCodeFormat = "Milliseconds"; - } - else - { - Configuration.Settings.Tools.ExportTextTimeCodeFormat = "Srt"; - } - - Configuration.Settings.Tools.ExportTextTimeCodeSeparator = comboBoxTimeCodeSeparator.Items[comboBoxTimeCodeSeparator.SelectedIndex].ToString(); - } - - public void PrepareForBatchSettings() - { - groupBoxTimeCodeFormat.Visible = false; - labelEncoding.Visible = false; - comboBoxEncoding.Visible = false; - buttonOK.Visible = false; - buttonCancel.Text = Configuration.Settings.Language.General.Ok; - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.IO; +using System.Text; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class ExportText : Form + { + public class ExportOptions + { + public bool ShowLineNumbers { get; set; } + public bool AddNewlineAfterLineNumber { get; set; } + public bool ShowTimeCodes { get; set; } + public bool TimeCodeSrt { get; set; } + public bool TimeCodeHHMMSSFF { get; set; } + public bool AddNewlineAfterTimeCodes { get; set; } + public string TimeCodeSeparator { get; set; } + public bool RemoveStyling { get; set; } + public bool FormatUnbreak { get; set; } + public bool AddNewAfterText { get; set; } + public bool AddNewAfterText2 { get; set; } + public bool FormatMergeAll { get; set; } + } + + private Subtitle _subtitle; + private string _fileName; + private bool _loading; + + public ExportText() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + var l = Configuration.Settings.Language.ExportText; + Text = l.Title; + labelPreview.Text = l.Preview; + groupBoxImportOptions.Text = l.ExportOptions; + groupBoxFormatText.Text = l.FormatText; + radioButtonFormatNone.Text = l.None; + radioButtonFormatMergeAll.Text = l.MergeAllLines; + radioButtonFormatUnbreak.Text = l.UnbreakLines; + checkBoxRemoveStyling.Text = l.RemoveStyling; + checkBoxShowLineNumbers.Text = l.ShowLineNumbers; + checkBoxAddNewlineAfterLineNumber.Text = l.AddNewLineAfterLineNumber; + checkBoxShowTimeCodes.Text = l.ShowTimeCode; + checkBoxAddAfterText.Text = l.AddNewLineAfterTexts; + checkBoxAddNewlineAfterTimeCodes.Text = l.AddNewLineAfterTimeCode; + checkBoxAddNewLine2.Text = l.AddNewLineBetweenSubtitles; + groupBoxTimeCodeFormat.Text = l.TimeCodeFormat; + radioButtonTimeCodeSrt.Text = l.Srt; + radioButtonTimeCodeMs.Text = l.Milliseconds; + radioButtonTimeCodeHHMMSSFF.Text = l.HHMMSSFF; + labelTimeCodeSeparator.Text = l.TimeCodeSeparator; + comboBoxTimeCodeSeparator.Left = labelTimeCodeSeparator.Left + labelTimeCodeSeparator.Width + 5; + labelEncoding.Text = Configuration.Settings.Language.Main.Controls.FileEncoding; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + buttonOK.Text = Configuration.Settings.Language.Main.Menu.File.SaveAs; + + _loading = true; + } + + internal void Initialize(Subtitle subtitle, string fileName) + { + _subtitle = subtitle; + _fileName = fileName; + textBoxText.ReadOnly = true; + comboBoxTimeCodeSeparator.SelectedIndex = 0; + LoadSettings(); + _loading = false; + GeneratePreview(); + UiUtil.InitializeTextEncodingComboBox(comboBoxEncoding); + } + + private void LoadSettings() + { + if (Configuration.Settings.Tools.ExportTextFormatText == "None") + { + radioButtonFormatNone.Checked = true; + } + else if (Configuration.Settings.Tools.ExportTextFormatText == "Unbreak") + { + radioButtonFormatUnbreak.Checked = true; + } + else + { + radioButtonFormatMergeAll.Checked = true; + } + + checkBoxRemoveStyling.Checked = Configuration.Settings.Tools.ExportTextRemoveStyling; + checkBoxShowLineNumbers.Checked = Configuration.Settings.Tools.ExportTextShowLineNumbers; + checkBoxAddNewlineAfterLineNumber.Checked = Configuration.Settings.Tools.ExportTextShowLineNumbersNewLine; + checkBoxShowTimeCodes.Checked = Configuration.Settings.Tools.ExportTextShowTimeCodes; + checkBoxAddNewlineAfterTimeCodes.Checked = Configuration.Settings.Tools.ExportTextShowTimeCodesNewLine; + checkBoxAddAfterText.Checked = Configuration.Settings.Tools.ExportTextNewLineAfterText; + checkBoxAddNewLine2.Checked = Configuration.Settings.Tools.ExportTextNewLineBetweenSubtitles; + checkBoxShowTimeCodes.Checked = Configuration.Settings.Tools.ExportTextShowTimeCodes; + + if (Configuration.Settings.Tools.ExportTextTimeCodeFormat == "Frames") + { + radioButtonTimeCodeHHMMSSFF.Checked = true; + } + else if (Configuration.Settings.Tools.ExportTextTimeCodeFormat == "Milliseconds") + { + radioButtonTimeCodeMs.Checked = true; + } + else + { + radioButtonTimeCodeSrt.Checked = true; + } + + if (Configuration.Settings.Tools.ExportTextTimeCodeSeparator == comboBoxTimeCodeSeparator.Items[0].ToString()) + { + comboBoxTimeCodeSeparator.SelectedIndex = 0; + } + else if (Configuration.Settings.Tools.ExportTextTimeCodeSeparator == comboBoxTimeCodeSeparator.Items[1].ToString()) + { + comboBoxTimeCodeSeparator.SelectedIndex = 1; + } + } + + private void GeneratePreview() + { + if (_loading) + { + return; + } + + groupBoxTimeCodeFormat.Enabled = checkBoxShowTimeCodes.Checked; + checkBoxAddAfterText.Enabled = !radioButtonFormatMergeAll.Checked; + checkBoxAddNewLine2.Enabled = !radioButtonFormatMergeAll.Checked; + checkBoxAddNewlineAfterLineNumber.Enabled = checkBoxShowLineNumbers.Checked; + checkBoxAddNewlineAfterTimeCodes.Enabled = checkBoxShowTimeCodes.Checked; + + var exportOptions = new ExportOptions + { + ShowLineNumbers = checkBoxShowLineNumbers.Checked, + AddNewlineAfterLineNumber = checkBoxAddNewlineAfterLineNumber.Checked, + ShowTimeCodes = checkBoxShowTimeCodes.Checked, + TimeCodeSrt = radioButtonTimeCodeSrt.Checked, + TimeCodeHHMMSSFF = radioButtonTimeCodeHHMMSSFF.Checked, + AddNewlineAfterTimeCodes = checkBoxAddNewlineAfterTimeCodes.Checked, + TimeCodeSeparator = comboBoxTimeCodeSeparator.Text, + RemoveStyling = checkBoxRemoveStyling.Checked, + FormatUnbreak = radioButtonFormatUnbreak.Checked, + AddNewAfterText = checkBoxAddAfterText.Checked, + AddNewAfterText2 = checkBoxAddNewLine2.Checked, + FormatMergeAll = radioButtonFormatMergeAll.Checked + }; + + string text = GeneratePlainText(_subtitle, exportOptions); + textBoxText.Text = text; + } + + public static string GeneratePlainText(Subtitle subtitle, ExportOptions exportOptions) + { + var sb = new StringBuilder(); + foreach (Paragraph p in subtitle.Paragraphs) + { + if (exportOptions.ShowLineNumbers) + { + sb.Append(p.Number); + if (exportOptions.AddNewlineAfterLineNumber) + { + sb.AppendLine(); + } + else + { + sb.Append(' '); + } + } + if (exportOptions.ShowTimeCodes) + { + if (exportOptions.TimeCodeSrt) + { + sb.Append(p.StartTime + exportOptions.TimeCodeSeparator + p.EndTime); + } + else if (exportOptions.TimeCodeHHMMSSFF) + { + sb.Append(p.StartTime.ToHHMMSSFF() + exportOptions.TimeCodeSeparator + p.EndTime.ToHHMMSSFF()); + } + else + { + sb.Append(p.StartTime.TotalMilliseconds + exportOptions.TimeCodeSeparator + p.EndTime.TotalMilliseconds); + } + + if (exportOptions.AddNewlineAfterTimeCodes) + { + sb.AppendLine(); + } + else + { + sb.Append(' '); + } + } + string s = p.Text; + if (exportOptions.RemoveStyling) + { + s = HtmlUtil.RemoveHtmlTags(s, true); + } + if (exportOptions.FormatUnbreak) + { + sb.Append(Utilities.UnbreakLine(s)); + } + else + { + sb.Append(s); + } + if (exportOptions.AddNewAfterText) + { + sb.AppendLine(); + } + + if (exportOptions.AddNewAfterText2) + { + sb.AppendLine(); + } + + if (!exportOptions.AddNewAfterText && !exportOptions.AddNewAfterText2) + { + sb.Append(' '); + } + } + string text = sb.ToString().Trim(); + if (exportOptions.FormatMergeAll) + { + text = text.Replace(Environment.NewLine, " "); + text = text.FixExtraSpaces(); + } + return text; + } + + private TextEncoding GetCurrentEncoding() + { + return UiUtil.GetTextEncodingComboBoxCurrentEncoding(comboBoxEncoding); + } + + private void buttonOK_Click(object sender, EventArgs e) + { + GeneratePreview(); + saveFileDialog1.Title = Configuration.Settings.Language.Main.ExportPlainTextAs; + saveFileDialog1.Filter = Configuration.Settings.Language.Main.TextFiles + "|*.txt"; + if (!string.IsNullOrEmpty(_fileName)) + { + saveFileDialog1.FileName = Path.GetFileNameWithoutExtension(_fileName); + } + + if (saveFileDialog1.ShowDialog(this) == DialogResult.OK) + { + FileUtil.WriteAllText(saveFileDialog1.FileName, textBoxText.Text, GetCurrentEncoding()); + DialogResult = DialogResult.OK; + } + } + + private void radioButtonFormatNone_CheckedChanged(object sender, EventArgs e) + { + GeneratePreview(); + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void ExportText_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + private void ExportText_FormClosing(object sender, FormClosingEventArgs e) + { + if (radioButtonFormatNone.Checked) + { + Configuration.Settings.Tools.ExportTextFormatText = "None"; + } + else if (radioButtonFormatUnbreak.Checked) + { + Configuration.Settings.Tools.ExportTextFormatText = "Unbreak"; + } + else + { + Configuration.Settings.Tools.ExportTextFormatText = "MergeAll"; + } + + Configuration.Settings.Tools.ExportTextRemoveStyling = checkBoxRemoveStyling.Checked; + Configuration.Settings.Tools.ExportTextShowLineNumbers = checkBoxShowLineNumbers.Checked; + Configuration.Settings.Tools.ExportTextShowLineNumbersNewLine = checkBoxAddNewlineAfterLineNumber.Checked; + Configuration.Settings.Tools.ExportTextShowTimeCodes = checkBoxShowTimeCodes.Checked; + Configuration.Settings.Tools.ExportTextShowTimeCodesNewLine = checkBoxAddNewlineAfterTimeCodes.Checked; + Configuration.Settings.Tools.ExportTextNewLineAfterText = checkBoxAddAfterText.Checked; + Configuration.Settings.Tools.ExportTextNewLineBetweenSubtitles = checkBoxAddNewLine2.Checked; + + if (radioButtonTimeCodeHHMMSSFF.Checked) + { + Configuration.Settings.Tools.ExportTextTimeCodeFormat = "Frames"; + } + else if (radioButtonTimeCodeMs.Checked) + { + Configuration.Settings.Tools.ExportTextTimeCodeFormat = "Milliseconds"; + } + else + { + Configuration.Settings.Tools.ExportTextTimeCodeFormat = "Srt"; + } + + Configuration.Settings.Tools.ExportTextTimeCodeSeparator = comboBoxTimeCodeSeparator.Items[comboBoxTimeCodeSeparator.SelectedIndex].ToString(); + } + + public void PrepareForBatchSettings() + { + groupBoxTimeCodeFormat.Visible = false; + labelEncoding.Visible = false; + comboBoxEncoding.Visible = false; + buttonOK.Visible = false; + buttonCancel.Text = Configuration.Settings.Language.General.Ok; + } + + } +} diff --git a/src/Forms/ExportText.resx b/src/ui/Forms/ExportText.resx similarity index 97% rename from src/Forms/ExportText.resx rename to src/ui/Forms/ExportText.resx index 83ebf8a69..053da59c9 100644 --- a/src/Forms/ExportText.resx +++ b/src/ui/Forms/ExportText.resx @@ -1,123 +1,123 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + \ No newline at end of file diff --git a/src/Forms/ExportTextST.Designer.cs b/src/ui/Forms/ExportTextST.Designer.cs similarity index 98% rename from src/Forms/ExportTextST.Designer.cs rename to src/ui/Forms/ExportTextST.Designer.cs index dcb0739d7..d91a77e5b 100644 --- a/src/Forms/ExportTextST.Designer.cs +++ b/src/ui/Forms/ExportTextST.Designer.cs @@ -1,2138 +1,2138 @@ -namespace Nikse.SubtitleEdit.Forms -{ - partial class ExportTextST - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.groupBoxPropertiesRoot = new System.Windows.Forms.GroupBox(); - this.textBoxRoot = new System.Windows.Forms.TextBox(); - this.groupBoxTextST = new System.Windows.Forms.GroupBox(); - this.treeView1 = new System.Windows.Forms.TreeView(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonSaveAsPes = new System.Windows.Forms.Button(); - this.buttonImport = new System.Windows.Forms.Button(); - this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); - this.groupBoxPropertiesRegionStyle = new System.Windows.Forms.GroupBox(); - this.numericUpDownRegionStyleFontOutlineThickness = new System.Windows.Forms.NumericUpDown(); - this.labelRegionStyleFontOutlineThickness = new System.Windows.Forms.Label(); - this.numericUpDownRegionStyleFontOutlinePaletteId = new System.Windows.Forms.NumericUpDown(); - this.labelRegionStyleFontOutlinePaletteId = new System.Windows.Forms.Label(); - this.numericUpDownRegionStyleFontPaletteId = new System.Windows.Forms.NumericUpDown(); - this.label39 = new System.Windows.Forms.Label(); - this.numericUpDownRegionStyleFontStyle = new System.Windows.Forms.NumericUpDown(); - this.label38 = new System.Windows.Forms.Label(); - this.numericUpDownRegionStyleFontIdRef = new System.Windows.Forms.NumericUpDown(); - this.label37 = new System.Windows.Forms.Label(); - this.numericUpDownRegionStyleLineSpace = new System.Windows.Forms.NumericUpDown(); - this.label33 = new System.Windows.Forms.Label(); - this.numericUpDownRegionStyleTextVerAlign = new System.Windows.Forms.NumericUpDown(); - this.label34 = new System.Windows.Forms.Label(); - this.numericUpDownRegionStyleTextHorAlign = new System.Windows.Forms.NumericUpDown(); - this.label35 = new System.Windows.Forms.Label(); - this.numericUpDownRegionStyleTextFlow = new System.Windows.Forms.NumericUpDown(); - this.label36 = new System.Windows.Forms.Label(); - this.numericUpDownRegionStyleTBHeight = new System.Windows.Forms.NumericUpDown(); - this.label17 = new System.Windows.Forms.Label(); - this.numericUpDownRegionStyleTBWidth = new System.Windows.Forms.NumericUpDown(); - this.label30 = new System.Windows.Forms.Label(); - this.numericUpDownRegionStyleTBVerPos = new System.Windows.Forms.NumericUpDown(); - this.label31 = new System.Windows.Forms.Label(); - this.numericUpDownRegionStyleTBHorPos = new System.Windows.Forms.NumericUpDown(); - this.label32 = new System.Windows.Forms.Label(); - this.numericUpDownRegionStyleFontSize = new System.Windows.Forms.NumericUpDown(); - this.label12 = new System.Windows.Forms.Label(); - this.numericUpDownRegionStylePaletteEntryId = new System.Windows.Forms.NumericUpDown(); - this.label11 = new System.Windows.Forms.Label(); - this.numericUpDownRegionStyleHeight = new System.Windows.Forms.NumericUpDown(); - this.label9 = new System.Windows.Forms.Label(); - this.numericUpDownRegionStyleWidth = new System.Windows.Forms.NumericUpDown(); - this.label10 = new System.Windows.Forms.Label(); - this.numericUpDownRegionStyleVPos = new System.Windows.Forms.NumericUpDown(); - this.label8 = new System.Windows.Forms.Label(); - this.numericUpDownRegionStyleHPos = new System.Windows.Forms.NumericUpDown(); - this.label7 = new System.Windows.Forms.Label(); - this.numericUpDownRegionStyleId = new System.Windows.Forms.NumericUpDown(); - this.label6 = new System.Windows.Forms.Label(); - this.groupBoxPropertiesPalette = new System.Windows.Forms.GroupBox(); - this.label47 = new System.Windows.Forms.Label(); - this.panelPaletteColor = new System.Windows.Forms.Panel(); - this.buttonColor = new System.Windows.Forms.Button(); - this.numericUpDownPaletteOpacity = new System.Windows.Forms.NumericUpDown(); - this.label5 = new System.Windows.Forms.Label(); - this.numericUpDownPaletteCb = new System.Windows.Forms.NumericUpDown(); - this.label4 = new System.Windows.Forms.Label(); - this.numericUpDownPaletteCr = new System.Windows.Forms.NumericUpDown(); - this.label3 = new System.Windows.Forms.Label(); - this.numericUpDownPaletteY = new System.Windows.Forms.NumericUpDown(); - this.label2 = new System.Windows.Forms.Label(); - this.numericUpDownPaletteEntry = new System.Windows.Forms.NumericUpDown(); - this.label1 = new System.Windows.Forms.Label(); - this.groupBoxPropertiesUserStyle = new System.Windows.Forms.GroupBox(); - this.numericUpDownUserStyleLineSpaceDelta = new System.Windows.Forms.NumericUpDown(); - this.label28 = new System.Windows.Forms.Label(); - this.numericUpDownUserStyleLineSpaceIncDec = new System.Windows.Forms.NumericUpDown(); - this.label29 = new System.Windows.Forms.Label(); - this.numericUpDownUserStyleTBHeightDelta = new System.Windows.Forms.NumericUpDown(); - this.label27 = new System.Windows.Forms.Label(); - this.numericUpDownUserStyleTBHeightIncDec = new System.Windows.Forms.NumericUpDown(); - this.label25 = new System.Windows.Forms.Label(); - this.numericUpDownUserStyleTBWidthDelta = new System.Windows.Forms.NumericUpDown(); - this.label26 = new System.Windows.Forms.Label(); - this.numericUpDownUserStyleTBWidthIncDec = new System.Windows.Forms.NumericUpDown(); - this.label19 = new System.Windows.Forms.Label(); - this.numericUpDownUserStyleTBVerPosDelta = new System.Windows.Forms.NumericUpDown(); - this.label20 = new System.Windows.Forms.Label(); - this.numericUpDownUserStyleTBVerPosDir = new System.Windows.Forms.NumericUpDown(); - this.label21 = new System.Windows.Forms.Label(); - this.numericUpDownUserStyleTBHorPosDelta = new System.Windows.Forms.NumericUpDown(); - this.label22 = new System.Windows.Forms.Label(); - this.numericUpDownUserStyleTBHorPosDir = new System.Windows.Forms.NumericUpDown(); - this.label23 = new System.Windows.Forms.Label(); - this.numericUpDownUserStyleFontSizeDelta = new System.Windows.Forms.NumericUpDown(); - this.label24 = new System.Windows.Forms.Label(); - this.numericUpDownUserStyleFontSizeIncDec = new System.Windows.Forms.NumericUpDown(); - this.label13 = new System.Windows.Forms.Label(); - this.numericUpDownUserStyleVerPosDelta = new System.Windows.Forms.NumericUpDown(); - this.label14 = new System.Windows.Forms.Label(); - this.numericUpDownUserStyleVerPosDir = new System.Windows.Forms.NumericUpDown(); - this.label15 = new System.Windows.Forms.Label(); - this.numericUpDownUserStyleHorPosDelta = new System.Windows.Forms.NumericUpDown(); - this.label16 = new System.Windows.Forms.Label(); - this.numericUpDownUserStyleHorPosDir = new System.Windows.Forms.NumericUpDown(); - this.labelUserStyleHorPosDir = new System.Windows.Forms.Label(); - this.numericUpDownUserStyleId = new System.Windows.Forms.NumericUpDown(); - this.label18 = new System.Windows.Forms.Label(); - this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog(); - this.buttonSaveAsM2ts = new System.Windows.Forms.Button(); - this.groupBoxPresentationSegmentRegion = new System.Windows.Forms.GroupBox(); - this.numericUpDownSubRegionStyleIdRef = new System.Windows.Forms.NumericUpDown(); - this.label40 = new System.Windows.Forms.Label(); - this.checkBoxSubRegionForced = new System.Windows.Forms.CheckBox(); - this.checkBoxSubRegionContinuous = new System.Windows.Forms.CheckBox(); - this.contextMenuStripAddPalette = new System.Windows.Forms.ContextMenuStrip(this.components); - this.addPaletteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.groupBoxFontStyle = new System.Windows.Forms.GroupBox(); - this.label43 = new System.Windows.Forms.Label(); - this.label42 = new System.Windows.Forms.Label(); - this.comboBoxChangeFontStyleOutlineThickness = new System.Windows.Forms.ComboBox(); - this.comboBoxChangeFontStyleFontStyle = new System.Windows.Forms.ComboBox(); - this.numericUpDownChangeFontStyleOutlinePaletteId = new System.Windows.Forms.NumericUpDown(); - this.label41 = new System.Windows.Forms.Label(); - this.groupBoxChangeFontSize = new System.Windows.Forms.GroupBox(); - this.groupBoxChangeFontColor = new System.Windows.Forms.GroupBox(); - this.numericUpDownChangeFontColor = new System.Windows.Forms.NumericUpDown(); - this.label45 = new System.Windows.Forms.Label(); - this.numericUpDownChangeFontSize = new System.Windows.Forms.NumericUpDown(); - this.label46 = new System.Windows.Forms.Label(); - this.groupBoxSubtitleText = new System.Windows.Forms.GroupBox(); - this.textBoxSubtitleText = new System.Windows.Forms.TextBox(); - this.label44 = new System.Windows.Forms.Label(); - this.contextMenuStripAddSubtitleContent = new System.Windows.Forms.ContextMenuStrip(this.components); - this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.addFontSetToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.addFontStyleToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.addFontSizeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.addLineBreakToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.addEndOfInlineStyleToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator(); - this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.contextMenuStripAddSubtitleContentFromSubRegion = new System.Windows.Forms.ContextMenuStrip(this.components); - this.toolStripMenuItemRegionAddText = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemRegionAddFontStyle = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemRegionAddFontSize = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemRegionAddLineBreak = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemRegionAddInlineStyle = new System.Windows.Forms.ToolStripMenuItem(); - this.groupBoxFontSet = new System.Windows.Forms.GroupBox(); - this.numericUpDownFontSetFontId = new System.Windows.Forms.NumericUpDown(); - this.label48 = new System.Windows.Forms.Label(); - this.contextMenuStripRegionStyle = new System.Windows.Forms.ContextMenuStrip(this.components); - this.toolStripMenuItemDuplicateRegionStyle = new System.Windows.Forms.ToolStripMenuItem(); - this.groupBoxPropertiesRoot.SuspendLayout(); - this.groupBoxTextST.SuspendLayout(); - this.groupBoxPropertiesRegionStyle.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleFontOutlineThickness)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleFontOutlinePaletteId)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleFontPaletteId)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleFontStyle)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleFontIdRef)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleLineSpace)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleTextVerAlign)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleTextHorAlign)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleTextFlow)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleTBHeight)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleTBWidth)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleTBVerPos)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleTBHorPos)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleFontSize)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStylePaletteEntryId)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleHeight)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleWidth)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleVPos)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleHPos)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleId)).BeginInit(); - this.groupBoxPropertiesPalette.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPaletteOpacity)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPaletteCb)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPaletteCr)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPaletteY)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPaletteEntry)).BeginInit(); - this.groupBoxPropertiesUserStyle.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleLineSpaceDelta)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleLineSpaceIncDec)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleTBHeightDelta)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleTBHeightIncDec)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleTBWidthDelta)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleTBWidthIncDec)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleTBVerPosDelta)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleTBVerPosDir)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleTBHorPosDelta)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleTBHorPosDir)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleFontSizeDelta)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleFontSizeIncDec)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleVerPosDelta)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleVerPosDir)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleHorPosDelta)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleHorPosDir)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleId)).BeginInit(); - this.groupBoxPresentationSegmentRegion.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSubRegionStyleIdRef)).BeginInit(); - this.contextMenuStripAddPalette.SuspendLayout(); - this.groupBoxFontStyle.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownChangeFontStyleOutlinePaletteId)).BeginInit(); - this.groupBoxChangeFontSize.SuspendLayout(); - this.groupBoxChangeFontColor.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownChangeFontColor)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownChangeFontSize)).BeginInit(); - this.groupBoxSubtitleText.SuspendLayout(); - this.contextMenuStripAddSubtitleContent.SuspendLayout(); - this.contextMenuStripAddSubtitleContentFromSubRegion.SuspendLayout(); - this.groupBoxFontSet.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownFontSetFontId)).BeginInit(); - this.contextMenuStripRegionStyle.SuspendLayout(); - this.SuspendLayout(); - // - // groupBoxPropertiesRoot - // - this.groupBoxPropertiesRoot.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxPropertiesRoot.Controls.Add(this.textBoxRoot); - this.groupBoxPropertiesRoot.Location = new System.Drawing.Point(518, 21); - this.groupBoxPropertiesRoot.Name = "groupBoxPropertiesRoot"; - this.groupBoxPropertiesRoot.Size = new System.Drawing.Size(345, 550); - this.groupBoxPropertiesRoot.TabIndex = 7; - this.groupBoxPropertiesRoot.TabStop = false; - this.groupBoxPropertiesRoot.Text = "Properties"; - // - // textBoxRoot - // - this.textBoxRoot.Dock = System.Windows.Forms.DockStyle.Fill; - this.textBoxRoot.Location = new System.Drawing.Point(3, 16); - this.textBoxRoot.Multiline = true; - this.textBoxRoot.Name = "textBoxRoot"; - this.textBoxRoot.ReadOnly = true; - this.textBoxRoot.Size = new System.Drawing.Size(339, 531); - this.textBoxRoot.TabIndex = 0; - // - // groupBoxTextST - // - this.groupBoxTextST.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxTextST.Controls.Add(this.treeView1); - this.groupBoxTextST.Location = new System.Drawing.Point(7, 21); - this.groupBoxTextST.Name = "groupBoxTextST"; - this.groupBoxTextST.Size = new System.Drawing.Size(505, 550); - this.groupBoxTextST.TabIndex = 6; - this.groupBoxTextST.TabStop = false; - this.groupBoxTextST.Text = "TextST structure"; - // - // treeView1 - // - this.treeView1.Dock = System.Windows.Forms.DockStyle.Fill; - this.treeView1.Location = new System.Drawing.Point(3, 16); - this.treeView1.Name = "treeView1"; - this.treeView1.Size = new System.Drawing.Size(499, 531); - this.treeView1.TabIndex = 0; - this.treeView1.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect); - this.treeView1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.treeView1_MouseUp); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(788, 577); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 9; - this.buttonCancel.Text = "&OK"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // buttonSaveAsPes - // - this.buttonSaveAsPes.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonSaveAsPes.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonSaveAsPes.Location = new System.Drawing.Point(633, 577); - this.buttonSaveAsPes.Name = "buttonSaveAsPes"; - this.buttonSaveAsPes.Size = new System.Drawing.Size(149, 23); - this.buttonSaveAsPes.TabIndex = 8; - this.buttonSaveAsPes.Text = "Write as PES packets..."; - this.buttonSaveAsPes.UseVisualStyleBackColor = true; - this.buttonSaveAsPes.Click += new System.EventHandler(this.buttonSaveAsPes_Click); - // - // buttonImport - // - this.buttonImport.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonImport.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonImport.Location = new System.Drawing.Point(724, 3); - this.buttonImport.Name = "buttonImport"; - this.buttonImport.Size = new System.Drawing.Size(139, 21); - this.buttonImport.TabIndex = 7; - this.buttonImport.Text = "Import TextST..."; - this.buttonImport.UseVisualStyleBackColor = true; - this.buttonImport.Click += new System.EventHandler(this.ButtonImportClick); - // - // groupBoxPropertiesRegionStyle - // - this.groupBoxPropertiesRegionStyle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleFontOutlineThickness); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.labelRegionStyleFontOutlineThickness); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleFontOutlinePaletteId); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.labelRegionStyleFontOutlinePaletteId); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleFontPaletteId); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.label39); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleFontStyle); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.label38); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleFontIdRef); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.label37); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleLineSpace); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.label33); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleTextVerAlign); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.label34); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleTextHorAlign); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.label35); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleTextFlow); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.label36); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleTBHeight); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.label17); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleTBWidth); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.label30); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleTBVerPos); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.label31); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleTBHorPos); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.label32); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleFontSize); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.label12); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStylePaletteEntryId); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.label11); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleHeight); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.label9); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleWidth); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.label10); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleVPos); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.label8); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleHPos); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.label7); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleId); - this.groupBoxPropertiesRegionStyle.Controls.Add(this.label6); - this.groupBoxPropertiesRegionStyle.Location = new System.Drawing.Point(48, 12); - this.groupBoxPropertiesRegionStyle.Name = "groupBoxPropertiesRegionStyle"; - this.groupBoxPropertiesRegionStyle.Size = new System.Drawing.Size(230, 549); - this.groupBoxPropertiesRegionStyle.TabIndex = 8; - this.groupBoxPropertiesRegionStyle.TabStop = false; - this.groupBoxPropertiesRegionStyle.Text = "Properties: Region style"; - this.groupBoxPropertiesRegionStyle.Visible = false; - // - // numericUpDownRegionStyleFontOutlineThickness - // - this.numericUpDownRegionStyleFontOutlineThickness.Location = new System.Drawing.Point(143, 516); - this.numericUpDownRegionStyleFontOutlineThickness.Maximum = new decimal(new int[] { - 3, - 0, - 0, - 0}); - this.numericUpDownRegionStyleFontOutlineThickness.Minimum = new decimal(new int[] { - 1, - 0, - 0, - 0}); - this.numericUpDownRegionStyleFontOutlineThickness.Name = "numericUpDownRegionStyleFontOutlineThickness"; - this.numericUpDownRegionStyleFontOutlineThickness.Size = new System.Drawing.Size(76, 20); - this.numericUpDownRegionStyleFontOutlineThickness.TabIndex = 41; - this.numericUpDownRegionStyleFontOutlineThickness.Value = new decimal(new int[] { - 1, - 0, - 0, - 0}); - this.numericUpDownRegionStyleFontOutlineThickness.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleFontOutlineThickness_ValueChanged); - // - // labelRegionStyleFontOutlineThickness - // - this.labelRegionStyleFontOutlineThickness.AutoSize = true; - this.labelRegionStyleFontOutlineThickness.Location = new System.Drawing.Point(10, 518); - this.labelRegionStyleFontOutlineThickness.Name = "labelRegionStyleFontOutlineThickness"; - this.labelRegionStyleFontOutlineThickness.Size = new System.Drawing.Size(110, 13); - this.labelRegionStyleFontOutlineThickness.TabIndex = 40; - this.labelRegionStyleFontOutlineThickness.Text = "Font outline thickness"; - // - // numericUpDownRegionStyleFontOutlinePaletteId - // - this.numericUpDownRegionStyleFontOutlinePaletteId.Location = new System.Drawing.Point(143, 490); - this.numericUpDownRegionStyleFontOutlinePaletteId.Maximum = new decimal(new int[] { - 254, - 0, - 0, - 0}); - this.numericUpDownRegionStyleFontOutlinePaletteId.Name = "numericUpDownRegionStyleFontOutlinePaletteId"; - this.numericUpDownRegionStyleFontOutlinePaletteId.Size = new System.Drawing.Size(76, 20); - this.numericUpDownRegionStyleFontOutlinePaletteId.TabIndex = 39; - this.numericUpDownRegionStyleFontOutlinePaletteId.Value = new decimal(new int[] { - 8, - 0, - 0, - 0}); - this.numericUpDownRegionStyleFontOutlinePaletteId.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleFontOutlinePaletteId_ValueChanged); - // - // labelRegionStyleFontOutlinePaletteId - // - this.labelRegionStyleFontOutlinePaletteId.AutoSize = true; - this.labelRegionStyleFontOutlinePaletteId.Location = new System.Drawing.Point(10, 492); - this.labelRegionStyleFontOutlinePaletteId.Name = "labelRegionStyleFontOutlinePaletteId"; - this.labelRegionStyleFontOutlinePaletteId.Size = new System.Drawing.Size(108, 13); - this.labelRegionStyleFontOutlinePaletteId.TabIndex = 38; - this.labelRegionStyleFontOutlinePaletteId.Text = "Font outline palette id"; - // - // numericUpDownRegionStyleFontPaletteId - // - this.numericUpDownRegionStyleFontPaletteId.Location = new System.Drawing.Point(143, 464); - this.numericUpDownRegionStyleFontPaletteId.Maximum = new decimal(new int[] { - 254, - 0, - 0, - 0}); - this.numericUpDownRegionStyleFontPaletteId.Name = "numericUpDownRegionStyleFontPaletteId"; - this.numericUpDownRegionStyleFontPaletteId.Size = new System.Drawing.Size(76, 20); - this.numericUpDownRegionStyleFontPaletteId.TabIndex = 37; - this.numericUpDownRegionStyleFontPaletteId.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleFontPaletteId_ValueChanged); - // - // label39 - // - this.label39.AutoSize = true; - this.label39.Location = new System.Drawing.Point(10, 466); - this.label39.Name = "label39"; - this.label39.Size = new System.Drawing.Size(74, 13); - this.label39.TabIndex = 36; - this.label39.Text = "Font palette id"; - // - // numericUpDownRegionStyleFontStyle - // - this.numericUpDownRegionStyleFontStyle.Location = new System.Drawing.Point(143, 412); - this.numericUpDownRegionStyleFontStyle.Maximum = new decimal(new int[] { - 4319, - 0, - 0, - 0}); - this.numericUpDownRegionStyleFontStyle.Name = "numericUpDownRegionStyleFontStyle"; - this.numericUpDownRegionStyleFontStyle.Size = new System.Drawing.Size(76, 20); - this.numericUpDownRegionStyleFontStyle.TabIndex = 35; - this.numericUpDownRegionStyleFontStyle.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleFontStyle_ValueChanged); - // - // label38 - // - this.label38.AutoSize = true; - this.label38.Location = new System.Drawing.Point(10, 414); - this.label38.Name = "label38"; - this.label38.Size = new System.Drawing.Size(52, 13); - this.label38.TabIndex = 34; - this.label38.Text = "Font style"; - // - // numericUpDownRegionStyleFontIdRef - // - this.numericUpDownRegionStyleFontIdRef.Location = new System.Drawing.Point(143, 386); - this.numericUpDownRegionStyleFontIdRef.Maximum = new decimal(new int[] { - 4319, - 0, - 0, - 0}); - this.numericUpDownRegionStyleFontIdRef.Name = "numericUpDownRegionStyleFontIdRef"; - this.numericUpDownRegionStyleFontIdRef.Size = new System.Drawing.Size(76, 20); - this.numericUpDownRegionStyleFontIdRef.TabIndex = 33; - this.numericUpDownRegionStyleFontIdRef.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleFontIdRef_ValueChanged); - // - // label37 - // - this.label37.AutoSize = true; - this.label37.Location = new System.Drawing.Point(10, 388); - this.label37.Name = "label37"; - this.label37.Size = new System.Drawing.Size(54, 13); - this.label37.TabIndex = 32; - this.label37.Text = "Font id ref"; - // - // numericUpDownRegionStyleLineSpace - // - this.numericUpDownRegionStyleLineSpace.Location = new System.Drawing.Point(143, 360); - this.numericUpDownRegionStyleLineSpace.Maximum = new decimal(new int[] { - 4319, - 0, - 0, - 0}); - this.numericUpDownRegionStyleLineSpace.Name = "numericUpDownRegionStyleLineSpace"; - this.numericUpDownRegionStyleLineSpace.Size = new System.Drawing.Size(76, 20); - this.numericUpDownRegionStyleLineSpace.TabIndex = 31; - this.numericUpDownRegionStyleLineSpace.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleLineSpace_ValueChanged); - // - // label33 - // - this.label33.AutoSize = true; - this.label33.Location = new System.Drawing.Point(10, 362); - this.label33.Name = "label33"; - this.label33.Size = new System.Drawing.Size(59, 13); - this.label33.TabIndex = 30; - this.label33.Text = "Line space"; - // - // numericUpDownRegionStyleTextVerAlign - // - this.numericUpDownRegionStyleTextVerAlign.Location = new System.Drawing.Point(143, 334); - this.numericUpDownRegionStyleTextVerAlign.Maximum = new decimal(new int[] { - 7679, - 0, - 0, - 0}); - this.numericUpDownRegionStyleTextVerAlign.Name = "numericUpDownRegionStyleTextVerAlign"; - this.numericUpDownRegionStyleTextVerAlign.Size = new System.Drawing.Size(76, 20); - this.numericUpDownRegionStyleTextVerAlign.TabIndex = 29; - this.numericUpDownRegionStyleTextVerAlign.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleTextVerAlign_ValueChanged); - // - // label34 - // - this.label34.AutoSize = true; - this.label34.Location = new System.Drawing.Point(10, 336); - this.label34.Name = "label34"; - this.label34.Size = new System.Drawing.Size(113, 13); - this.label34.TabIndex = 28; - this.label34.Text = "Text vertical alignment"; - // - // numericUpDownRegionStyleTextHorAlign - // - this.numericUpDownRegionStyleTextHorAlign.Location = new System.Drawing.Point(143, 308); - this.numericUpDownRegionStyleTextHorAlign.Maximum = new decimal(new int[] { - 4319, - 0, - 0, - 0}); - this.numericUpDownRegionStyleTextHorAlign.Name = "numericUpDownRegionStyleTextHorAlign"; - this.numericUpDownRegionStyleTextHorAlign.Size = new System.Drawing.Size(76, 20); - this.numericUpDownRegionStyleTextHorAlign.TabIndex = 27; - this.numericUpDownRegionStyleTextHorAlign.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleTextHorAlign_ValueChanged); - // - // label35 - // - this.label35.AutoSize = true; - this.label35.Location = new System.Drawing.Point(10, 310); - this.label35.Name = "label35"; - this.label35.Size = new System.Drawing.Size(124, 13); - this.label35.TabIndex = 26; - this.label35.Text = "Text horizontal alignment"; - // - // numericUpDownRegionStyleTextFlow - // - this.numericUpDownRegionStyleTextFlow.Location = new System.Drawing.Point(143, 282); - this.numericUpDownRegionStyleTextFlow.Maximum = new decimal(new int[] { - 7679, - 0, - 0, - 0}); - this.numericUpDownRegionStyleTextFlow.Name = "numericUpDownRegionStyleTextFlow"; - this.numericUpDownRegionStyleTextFlow.Size = new System.Drawing.Size(76, 20); - this.numericUpDownRegionStyleTextFlow.TabIndex = 25; - this.numericUpDownRegionStyleTextFlow.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleTextFlow_ValueChanged); - // - // label36 - // - this.label36.AutoSize = true; - this.label36.Location = new System.Drawing.Point(10, 284); - this.label36.Name = "label36"; - this.label36.Size = new System.Drawing.Size(50, 13); - this.label36.TabIndex = 24; - this.label36.Text = "Text flow"; - // - // numericUpDownRegionStyleTBHeight - // - this.numericUpDownRegionStyleTBHeight.Location = new System.Drawing.Point(143, 256); - this.numericUpDownRegionStyleTBHeight.Maximum = new decimal(new int[] { - 4319, - 0, - 0, - 0}); - this.numericUpDownRegionStyleTBHeight.Name = "numericUpDownRegionStyleTBHeight"; - this.numericUpDownRegionStyleTBHeight.Size = new System.Drawing.Size(76, 20); - this.numericUpDownRegionStyleTBHeight.TabIndex = 23; - this.numericUpDownRegionStyleTBHeight.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleTBHeight_ValueChanged); - // - // label17 - // - this.label17.AutoSize = true; - this.label17.Location = new System.Drawing.Point(10, 258); - this.label17.Name = "label17"; - this.label17.Size = new System.Drawing.Size(80, 13); - this.label17.TabIndex = 22; - this.label17.Text = "Text box height"; - // - // numericUpDownRegionStyleTBWidth - // - this.numericUpDownRegionStyleTBWidth.Location = new System.Drawing.Point(143, 230); - this.numericUpDownRegionStyleTBWidth.Maximum = new decimal(new int[] { - 7679, - 0, - 0, - 0}); - this.numericUpDownRegionStyleTBWidth.Name = "numericUpDownRegionStyleTBWidth"; - this.numericUpDownRegionStyleTBWidth.Size = new System.Drawing.Size(76, 20); - this.numericUpDownRegionStyleTBWidth.TabIndex = 21; - this.numericUpDownRegionStyleTBWidth.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleTBWidth_ValueChanged); - // - // label30 - // - this.label30.AutoSize = true; - this.label30.Location = new System.Drawing.Point(10, 232); - this.label30.Name = "label30"; - this.label30.Size = new System.Drawing.Size(76, 13); - this.label30.TabIndex = 20; - this.label30.Text = "Text box width"; - // - // numericUpDownRegionStyleTBVerPos - // - this.numericUpDownRegionStyleTBVerPos.Location = new System.Drawing.Point(143, 204); - this.numericUpDownRegionStyleTBVerPos.Maximum = new decimal(new int[] { - 4319, - 0, - 0, - 0}); - this.numericUpDownRegionStyleTBVerPos.Name = "numericUpDownRegionStyleTBVerPos"; - this.numericUpDownRegionStyleTBVerPos.Size = new System.Drawing.Size(76, 20); - this.numericUpDownRegionStyleTBVerPos.TabIndex = 19; - this.numericUpDownRegionStyleTBVerPos.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleTBVerPos_ValueChanged); - // - // label31 - // - this.label31.AutoSize = true; - this.label31.Location = new System.Drawing.Point(10, 206); - this.label31.Name = "label31"; - this.label31.Size = new System.Drawing.Size(105, 13); - this.label31.TabIndex = 18; - this.label31.Text = "Text box vertical pos"; - // - // numericUpDownRegionStyleTBHorPos - // - this.numericUpDownRegionStyleTBHorPos.Location = new System.Drawing.Point(143, 178); - this.numericUpDownRegionStyleTBHorPos.Maximum = new decimal(new int[] { - 7679, - 0, - 0, - 0}); - this.numericUpDownRegionStyleTBHorPos.Name = "numericUpDownRegionStyleTBHorPos"; - this.numericUpDownRegionStyleTBHorPos.Size = new System.Drawing.Size(76, 20); - this.numericUpDownRegionStyleTBHorPos.TabIndex = 17; - this.numericUpDownRegionStyleTBHorPos.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleTBHorPos_ValueChanged); - // - // label32 - // - this.label32.AutoSize = true; - this.label32.Location = new System.Drawing.Point(10, 180); - this.label32.Name = "label32"; - this.label32.Size = new System.Drawing.Size(116, 13); - this.label32.TabIndex = 16; - this.label32.Text = "Text box horizontal pos"; - // - // numericUpDownRegionStyleFontSize - // - this.numericUpDownRegionStyleFontSize.Location = new System.Drawing.Point(143, 438); - this.numericUpDownRegionStyleFontSize.Maximum = new decimal(new int[] { - 144, - 0, - 0, - 0}); - this.numericUpDownRegionStyleFontSize.Minimum = new decimal(new int[] { - 8, - 0, - 0, - 0}); - this.numericUpDownRegionStyleFontSize.Name = "numericUpDownRegionStyleFontSize"; - this.numericUpDownRegionStyleFontSize.Size = new System.Drawing.Size(76, 20); - this.numericUpDownRegionStyleFontSize.TabIndex = 15; - this.numericUpDownRegionStyleFontSize.Value = new decimal(new int[] { - 8, - 0, - 0, - 0}); - this.numericUpDownRegionStyleFontSize.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleFontSize_ValueChanged); - // - // label12 - // - this.label12.AutoSize = true; - this.label12.Location = new System.Drawing.Point(10, 440); - this.label12.Name = "label12"; - this.label12.Size = new System.Drawing.Size(49, 13); - this.label12.TabIndex = 14; - this.label12.Text = "Font size"; - // - // numericUpDownRegionStylePaletteEntryId - // - this.numericUpDownRegionStylePaletteEntryId.Location = new System.Drawing.Point(143, 152); - this.numericUpDownRegionStylePaletteEntryId.Maximum = new decimal(new int[] { - 254, - 0, - 0, - 0}); - this.numericUpDownRegionStylePaletteEntryId.Name = "numericUpDownRegionStylePaletteEntryId"; - this.numericUpDownRegionStylePaletteEntryId.Size = new System.Drawing.Size(76, 20); - this.numericUpDownRegionStylePaletteEntryId.TabIndex = 13; - this.numericUpDownRegionStylePaletteEntryId.ValueChanged += new System.EventHandler(this.numericUpDownRegionStylePaletteEntryId_ValueChanged); - // - // label11 - // - this.label11.AutoSize = true; - this.label11.Location = new System.Drawing.Point(10, 154); - this.label11.Name = "label11"; - this.label11.Size = new System.Drawing.Size(90, 13); - this.label11.TabIndex = 12; - this.label11.Text = "Bg palette entryId"; - // - // numericUpDownRegionStyleHeight - // - this.numericUpDownRegionStyleHeight.Location = new System.Drawing.Point(143, 126); - this.numericUpDownRegionStyleHeight.Maximum = new decimal(new int[] { - 4319, - 0, - 0, - 0}); - this.numericUpDownRegionStyleHeight.Name = "numericUpDownRegionStyleHeight"; - this.numericUpDownRegionStyleHeight.Size = new System.Drawing.Size(76, 20); - this.numericUpDownRegionStyleHeight.TabIndex = 11; - this.numericUpDownRegionStyleHeight.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleHeight_ValueChanged); - // - // label9 - // - this.label9.AutoSize = true; - this.label9.Location = new System.Drawing.Point(10, 128); - this.label9.Name = "label9"; - this.label9.Size = new System.Drawing.Size(38, 13); - this.label9.TabIndex = 10; - this.label9.Text = "Height"; - // - // numericUpDownRegionStyleWidth - // - this.numericUpDownRegionStyleWidth.Location = new System.Drawing.Point(143, 100); - this.numericUpDownRegionStyleWidth.Maximum = new decimal(new int[] { - 7679, - 0, - 0, - 0}); - this.numericUpDownRegionStyleWidth.Name = "numericUpDownRegionStyleWidth"; - this.numericUpDownRegionStyleWidth.Size = new System.Drawing.Size(76, 20); - this.numericUpDownRegionStyleWidth.TabIndex = 9; - this.numericUpDownRegionStyleWidth.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleWidth_ValueChanged); - // - // label10 - // - this.label10.AutoSize = true; - this.label10.Location = new System.Drawing.Point(10, 102); - this.label10.Name = "label10"; - this.label10.Size = new System.Drawing.Size(35, 13); - this.label10.TabIndex = 8; - this.label10.Text = "Width"; - // - // numericUpDownRegionStyleVPos - // - this.numericUpDownRegionStyleVPos.Location = new System.Drawing.Point(143, 74); - this.numericUpDownRegionStyleVPos.Maximum = new decimal(new int[] { - 4319, - 0, - 0, - 0}); - this.numericUpDownRegionStyleVPos.Name = "numericUpDownRegionStyleVPos"; - this.numericUpDownRegionStyleVPos.Size = new System.Drawing.Size(76, 20); - this.numericUpDownRegionStyleVPos.TabIndex = 7; - this.numericUpDownRegionStyleVPos.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleVPos_ValueChanged); - // - // label8 - // - this.label8.AutoSize = true; - this.label8.Location = new System.Drawing.Point(10, 76); - this.label8.Name = "label8"; - this.label8.Size = new System.Drawing.Size(81, 13); - this.label8.TabIndex = 6; - this.label8.Text = "Vertical position"; - // - // numericUpDownRegionStyleHPos - // - this.numericUpDownRegionStyleHPos.Location = new System.Drawing.Point(143, 48); - this.numericUpDownRegionStyleHPos.Maximum = new decimal(new int[] { - 7679, - 0, - 0, - 0}); - this.numericUpDownRegionStyleHPos.Name = "numericUpDownRegionStyleHPos"; - this.numericUpDownRegionStyleHPos.Size = new System.Drawing.Size(76, 20); - this.numericUpDownRegionStyleHPos.TabIndex = 5; - this.numericUpDownRegionStyleHPos.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleHPos_ValueChanged); - // - // label7 - // - this.label7.AutoSize = true; - this.label7.Location = new System.Drawing.Point(10, 50); - this.label7.Name = "label7"; - this.label7.Size = new System.Drawing.Size(93, 13); - this.label7.TabIndex = 4; - this.label7.Text = "Horizontal position"; - // - // numericUpDownRegionStyleId - // - this.numericUpDownRegionStyleId.Location = new System.Drawing.Point(143, 22); - this.numericUpDownRegionStyleId.Maximum = new decimal(new int[] { - 59, - 0, - 0, - 0}); - this.numericUpDownRegionStyleId.Name = "numericUpDownRegionStyleId"; - this.numericUpDownRegionStyleId.Size = new System.Drawing.Size(76, 20); - this.numericUpDownRegionStyleId.TabIndex = 3; - this.numericUpDownRegionStyleId.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleId_ValueChanged); - // - // label6 - // - this.label6.AutoSize = true; - this.label6.Location = new System.Drawing.Point(10, 24); - this.label6.Name = "label6"; - this.label6.Size = new System.Drawing.Size(39, 13); - this.label6.TabIndex = 2; - this.label6.Text = "StyleId"; - // - // groupBoxPropertiesPalette - // - this.groupBoxPropertiesPalette.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxPropertiesPalette.Controls.Add(this.label47); - this.groupBoxPropertiesPalette.Controls.Add(this.panelPaletteColor); - this.groupBoxPropertiesPalette.Controls.Add(this.buttonColor); - this.groupBoxPropertiesPalette.Controls.Add(this.numericUpDownPaletteOpacity); - this.groupBoxPropertiesPalette.Controls.Add(this.label5); - this.groupBoxPropertiesPalette.Controls.Add(this.numericUpDownPaletteCb); - this.groupBoxPropertiesPalette.Controls.Add(this.label4); - this.groupBoxPropertiesPalette.Controls.Add(this.numericUpDownPaletteCr); - this.groupBoxPropertiesPalette.Controls.Add(this.label3); - this.groupBoxPropertiesPalette.Controls.Add(this.numericUpDownPaletteY); - this.groupBoxPropertiesPalette.Controls.Add(this.label2); - this.groupBoxPropertiesPalette.Controls.Add(this.numericUpDownPaletteEntry); - this.groupBoxPropertiesPalette.Controls.Add(this.label1); - this.groupBoxPropertiesPalette.Location = new System.Drawing.Point(231, 3); - this.groupBoxPropertiesPalette.Name = "groupBoxPropertiesPalette"; - this.groupBoxPropertiesPalette.Size = new System.Drawing.Size(261, 211); - this.groupBoxPropertiesPalette.TabIndex = 9; - this.groupBoxPropertiesPalette.TabStop = false; - this.groupBoxPropertiesPalette.Text = "Properties: Region palette"; - this.groupBoxPropertiesPalette.Visible = false; - // - // label47 - // - this.label47.AutoSize = true; - this.label47.Location = new System.Drawing.Point(164, 133); - this.label47.Name = "label47"; - this.label47.Size = new System.Drawing.Size(137, 13); - this.label47.TabIndex = 15; - this.label47.Text = "0 is transparent, 255 is solid"; - // - // panelPaletteColor - // - this.panelPaletteColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.panelPaletteColor.Location = new System.Drawing.Point(137, 174); - this.panelPaletteColor.Name = "panelPaletteColor"; - this.panelPaletteColor.Size = new System.Drawing.Size(21, 20); - this.panelPaletteColor.TabIndex = 14; - // - // buttonColor - // - this.buttonColor.Location = new System.Drawing.Point(10, 173); - this.buttonColor.Name = "buttonColor"; - this.buttonColor.Size = new System.Drawing.Size(121, 21); - this.buttonColor.TabIndex = 13; - this.buttonColor.Text = "Pick color"; - this.buttonColor.UseVisualStyleBackColor = true; - this.buttonColor.Click += new System.EventHandler(this.buttonColor_Click); - // - // numericUpDownPaletteOpacity - // - this.numericUpDownPaletteOpacity.Location = new System.Drawing.Point(82, 131); - this.numericUpDownPaletteOpacity.Maximum = new decimal(new int[] { - 255, - 0, - 0, - 0}); - this.numericUpDownPaletteOpacity.Name = "numericUpDownPaletteOpacity"; - this.numericUpDownPaletteOpacity.Size = new System.Drawing.Size(76, 20); - this.numericUpDownPaletteOpacity.TabIndex = 9; - this.numericUpDownPaletteOpacity.ValueChanged += new System.EventHandler(this.numericUpDownPaletteOpacity_ValueChanged); - // - // label5 - // - this.label5.AutoSize = true; - this.label5.Location = new System.Drawing.Point(7, 133); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(43, 13); - this.label5.TabIndex = 8; - this.label5.Text = "Opacity"; - // - // numericUpDownPaletteCb - // - this.numericUpDownPaletteCb.Location = new System.Drawing.Point(82, 105); - this.numericUpDownPaletteCb.Maximum = new decimal(new int[] { - 240, - 0, - 0, - 0}); - this.numericUpDownPaletteCb.Name = "numericUpDownPaletteCb"; - this.numericUpDownPaletteCb.Size = new System.Drawing.Size(76, 20); - this.numericUpDownPaletteCb.TabIndex = 7; - this.numericUpDownPaletteCb.ValueChanged += new System.EventHandler(this.numericUpDownPaletteCb_ValueChanged); - // - // label4 - // - this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(7, 107); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(20, 13); - this.label4.TabIndex = 6; - this.label4.Text = "Cb"; - // - // numericUpDownPaletteCr - // - this.numericUpDownPaletteCr.Location = new System.Drawing.Point(82, 79); - this.numericUpDownPaletteCr.Maximum = new decimal(new int[] { - 240, - 0, - 0, - 0}); - this.numericUpDownPaletteCr.Minimum = new decimal(new int[] { - 16, - 0, - 0, - 0}); - this.numericUpDownPaletteCr.Name = "numericUpDownPaletteCr"; - this.numericUpDownPaletteCr.Size = new System.Drawing.Size(76, 20); - this.numericUpDownPaletteCr.TabIndex = 5; - this.numericUpDownPaletteCr.Value = new decimal(new int[] { - 16, - 0, - 0, - 0}); - this.numericUpDownPaletteCr.ValueChanged += new System.EventHandler(this.numericUpDownPaletteCr_ValueChanged); - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(7, 81); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(17, 13); - this.label3.TabIndex = 4; - this.label3.Text = "Cr"; - // - // numericUpDownPaletteY - // - this.numericUpDownPaletteY.Location = new System.Drawing.Point(82, 53); - this.numericUpDownPaletteY.Maximum = new decimal(new int[] { - 235, - 0, - 0, - 0}); - this.numericUpDownPaletteY.Minimum = new decimal(new int[] { - 16, - 0, - 0, - 0}); - this.numericUpDownPaletteY.Name = "numericUpDownPaletteY"; - this.numericUpDownPaletteY.Size = new System.Drawing.Size(76, 20); - this.numericUpDownPaletteY.TabIndex = 3; - this.numericUpDownPaletteY.Value = new decimal(new int[] { - 16, - 0, - 0, - 0}); - this.numericUpDownPaletteY.ValueChanged += new System.EventHandler(this.numericUpDownPaletteY_ValueChanged); - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(7, 55); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(14, 13); - this.label2.TabIndex = 2; - this.label2.Text = "Y"; - // - // numericUpDownPaletteEntry - // - this.numericUpDownPaletteEntry.Location = new System.Drawing.Point(82, 27); - this.numericUpDownPaletteEntry.Maximum = new decimal(new int[] { - 254, - 0, - 0, - 0}); - this.numericUpDownPaletteEntry.Name = "numericUpDownPaletteEntry"; - this.numericUpDownPaletteEntry.Size = new System.Drawing.Size(76, 20); - this.numericUpDownPaletteEntry.TabIndex = 1; - this.numericUpDownPaletteEntry.ValueChanged += new System.EventHandler(this.numericUpDownPaletteEntry_ValueChanged); - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(7, 29); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(40, 13); - this.label1.TabIndex = 0; - this.label1.Text = "EntryId"; - // - // groupBoxPropertiesUserStyle - // - this.groupBoxPropertiesUserStyle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxPropertiesUserStyle.Controls.Add(this.numericUpDownUserStyleLineSpaceDelta); - this.groupBoxPropertiesUserStyle.Controls.Add(this.label28); - this.groupBoxPropertiesUserStyle.Controls.Add(this.numericUpDownUserStyleLineSpaceIncDec); - this.groupBoxPropertiesUserStyle.Controls.Add(this.label29); - this.groupBoxPropertiesUserStyle.Controls.Add(this.numericUpDownUserStyleTBHeightDelta); - this.groupBoxPropertiesUserStyle.Controls.Add(this.label27); - this.groupBoxPropertiesUserStyle.Controls.Add(this.numericUpDownUserStyleTBHeightIncDec); - this.groupBoxPropertiesUserStyle.Controls.Add(this.label25); - this.groupBoxPropertiesUserStyle.Controls.Add(this.numericUpDownUserStyleTBWidthDelta); - this.groupBoxPropertiesUserStyle.Controls.Add(this.label26); - this.groupBoxPropertiesUserStyle.Controls.Add(this.numericUpDownUserStyleTBWidthIncDec); - this.groupBoxPropertiesUserStyle.Controls.Add(this.label19); - this.groupBoxPropertiesUserStyle.Controls.Add(this.numericUpDownUserStyleTBVerPosDelta); - this.groupBoxPropertiesUserStyle.Controls.Add(this.label20); - this.groupBoxPropertiesUserStyle.Controls.Add(this.numericUpDownUserStyleTBVerPosDir); - this.groupBoxPropertiesUserStyle.Controls.Add(this.label21); - this.groupBoxPropertiesUserStyle.Controls.Add(this.numericUpDownUserStyleTBHorPosDelta); - this.groupBoxPropertiesUserStyle.Controls.Add(this.label22); - this.groupBoxPropertiesUserStyle.Controls.Add(this.numericUpDownUserStyleTBHorPosDir); - this.groupBoxPropertiesUserStyle.Controls.Add(this.label23); - this.groupBoxPropertiesUserStyle.Controls.Add(this.numericUpDownUserStyleFontSizeDelta); - this.groupBoxPropertiesUserStyle.Controls.Add(this.label24); - this.groupBoxPropertiesUserStyle.Controls.Add(this.numericUpDownUserStyleFontSizeIncDec); - this.groupBoxPropertiesUserStyle.Controls.Add(this.label13); - this.groupBoxPropertiesUserStyle.Controls.Add(this.numericUpDownUserStyleVerPosDelta); - this.groupBoxPropertiesUserStyle.Controls.Add(this.label14); - this.groupBoxPropertiesUserStyle.Controls.Add(this.numericUpDownUserStyleVerPosDir); - this.groupBoxPropertiesUserStyle.Controls.Add(this.label15); - this.groupBoxPropertiesUserStyle.Controls.Add(this.numericUpDownUserStyleHorPosDelta); - this.groupBoxPropertiesUserStyle.Controls.Add(this.label16); - this.groupBoxPropertiesUserStyle.Controls.Add(this.numericUpDownUserStyleHorPosDir); - this.groupBoxPropertiesUserStyle.Controls.Add(this.labelUserStyleHorPosDir); - this.groupBoxPropertiesUserStyle.Controls.Add(this.numericUpDownUserStyleId); - this.groupBoxPropertiesUserStyle.Controls.Add(this.label18); - this.groupBoxPropertiesUserStyle.Location = new System.Drawing.Point(416, 12); - this.groupBoxPropertiesUserStyle.Name = "groupBoxPropertiesUserStyle"; - this.groupBoxPropertiesUserStyle.Size = new System.Drawing.Size(264, 505); - this.groupBoxPropertiesUserStyle.TabIndex = 10; - this.groupBoxPropertiesUserStyle.TabStop = false; - this.groupBoxPropertiesUserStyle.Text = "Properties: User style"; - this.groupBoxPropertiesUserStyle.Visible = false; - // - // numericUpDownUserStyleLineSpaceDelta - // - this.numericUpDownUserStyleLineSpaceDelta.Location = new System.Drawing.Point(184, 438); - this.numericUpDownUserStyleLineSpaceDelta.Maximum = new decimal(new int[] { - 4319, - 0, - 0, - 0}); - this.numericUpDownUserStyleLineSpaceDelta.Name = "numericUpDownUserStyleLineSpaceDelta"; - this.numericUpDownUserStyleLineSpaceDelta.Size = new System.Drawing.Size(76, 20); - this.numericUpDownUserStyleLineSpaceDelta.TabIndex = 47; - this.numericUpDownUserStyleLineSpaceDelta.ValueChanged += new System.EventHandler(this.numericUpDownUserStyleLineSpaceDelta_ValueChanged); - // - // label28 - // - this.label28.AutoSize = true; - this.label28.Location = new System.Drawing.Point(11, 440); - this.label28.Name = "label28"; - this.label28.Size = new System.Drawing.Size(85, 13); - this.label28.TabIndex = 46; - this.label28.Text = "Line space delta"; - // - // numericUpDownUserStyleLineSpaceIncDec - // - this.numericUpDownUserStyleLineSpaceIncDec.Location = new System.Drawing.Point(184, 412); - this.numericUpDownUserStyleLineSpaceIncDec.Maximum = new decimal(new int[] { - 254, - 0, - 0, - 0}); - this.numericUpDownUserStyleLineSpaceIncDec.Name = "numericUpDownUserStyleLineSpaceIncDec"; - this.numericUpDownUserStyleLineSpaceIncDec.Size = new System.Drawing.Size(76, 20); - this.numericUpDownUserStyleLineSpaceIncDec.TabIndex = 45; - this.numericUpDownUserStyleLineSpaceIncDec.ValueChanged += new System.EventHandler(this.numericUpDownUserStyleLineSpaceIncDec_ValueChanged); - // - // label29 - // - this.label29.AutoSize = true; - this.label29.Location = new System.Drawing.Point(11, 414); - this.label29.Name = "label29"; - this.label29.Size = new System.Drawing.Size(151, 13); - this.label29.TabIndex = 44; - this.label29.Text = "Line space increase/decrease"; - // - // numericUpDownUserStyleTBHeightDelta - // - this.numericUpDownUserStyleTBHeightDelta.Location = new System.Drawing.Point(184, 386); - this.numericUpDownUserStyleTBHeightDelta.Maximum = new decimal(new int[] { - 4319, - 0, - 0, - 0}); - this.numericUpDownUserStyleTBHeightDelta.Name = "numericUpDownUserStyleTBHeightDelta"; - this.numericUpDownUserStyleTBHeightDelta.Size = new System.Drawing.Size(76, 20); - this.numericUpDownUserStyleTBHeightDelta.TabIndex = 43; - this.numericUpDownUserStyleTBHeightDelta.ValueChanged += new System.EventHandler(this.numericUpDownUserStyleTBHeightDelta_ValueChanged); - // - // label27 - // - this.label27.AutoSize = true; - this.label27.Location = new System.Drawing.Point(11, 388); - this.label27.Name = "label27"; - this.label27.Size = new System.Drawing.Size(106, 13); - this.label27.TabIndex = 42; - this.label27.Text = "Text box height delta"; - // - // numericUpDownUserStyleTBHeightIncDec - // - this.numericUpDownUserStyleTBHeightIncDec.Location = new System.Drawing.Point(184, 360); - this.numericUpDownUserStyleTBHeightIncDec.Maximum = new decimal(new int[] { - 254, - 0, - 0, - 0}); - this.numericUpDownUserStyleTBHeightIncDec.Name = "numericUpDownUserStyleTBHeightIncDec"; - this.numericUpDownUserStyleTBHeightIncDec.Size = new System.Drawing.Size(76, 20); - this.numericUpDownUserStyleTBHeightIncDec.TabIndex = 41; - this.numericUpDownUserStyleTBHeightIncDec.ValueChanged += new System.EventHandler(this.numericUpDownUserStyleTBHeightIncDec_ValueChanged); - // - // label25 - // - this.label25.AutoSize = true; - this.label25.Location = new System.Drawing.Point(11, 362); - this.label25.Name = "label25"; - this.label25.Size = new System.Drawing.Size(172, 13); - this.label25.TabIndex = 40; - this.label25.Text = "Text box height increase/decrease"; - // - // numericUpDownUserStyleTBWidthDelta - // - this.numericUpDownUserStyleTBWidthDelta.Location = new System.Drawing.Point(184, 334); - this.numericUpDownUserStyleTBWidthDelta.Maximum = new decimal(new int[] { - 4319, - 0, - 0, - 0}); - this.numericUpDownUserStyleTBWidthDelta.Name = "numericUpDownUserStyleTBWidthDelta"; - this.numericUpDownUserStyleTBWidthDelta.Size = new System.Drawing.Size(76, 20); - this.numericUpDownUserStyleTBWidthDelta.TabIndex = 39; - this.numericUpDownUserStyleTBWidthDelta.ValueChanged += new System.EventHandler(this.numericUpDownUserStyleTBWidthDelta_ValueChanged); - // - // label26 - // - this.label26.AutoSize = true; - this.label26.Location = new System.Drawing.Point(11, 336); - this.label26.Name = "label26"; - this.label26.Size = new System.Drawing.Size(102, 13); - this.label26.TabIndex = 38; - this.label26.Text = "Text box width delta"; - // - // numericUpDownUserStyleTBWidthIncDec - // - this.numericUpDownUserStyleTBWidthIncDec.Location = new System.Drawing.Point(184, 308); - this.numericUpDownUserStyleTBWidthIncDec.Maximum = new decimal(new int[] { - 254, - 0, - 0, - 0}); - this.numericUpDownUserStyleTBWidthIncDec.Name = "numericUpDownUserStyleTBWidthIncDec"; - this.numericUpDownUserStyleTBWidthIncDec.Size = new System.Drawing.Size(76, 20); - this.numericUpDownUserStyleTBWidthIncDec.TabIndex = 37; - this.numericUpDownUserStyleTBWidthIncDec.ValueChanged += new System.EventHandler(this.numericUpDownUserStyleTBWidthIncDec_ValueChanged); - // - // label19 - // - this.label19.AutoSize = true; - this.label19.Location = new System.Drawing.Point(11, 310); - this.label19.Name = "label19"; - this.label19.Size = new System.Drawing.Size(168, 13); - this.label19.TabIndex = 36; - this.label19.Text = "Text box width increase/decrease"; - // - // numericUpDownUserStyleTBVerPosDelta - // - this.numericUpDownUserStyleTBVerPosDelta.Location = new System.Drawing.Point(184, 282); - this.numericUpDownUserStyleTBVerPosDelta.Maximum = new decimal(new int[] { - 4319, - 0, - 0, - 0}); - this.numericUpDownUserStyleTBVerPosDelta.Name = "numericUpDownUserStyleTBVerPosDelta"; - this.numericUpDownUserStyleTBVerPosDelta.Size = new System.Drawing.Size(76, 20); - this.numericUpDownUserStyleTBVerPosDelta.TabIndex = 35; - this.numericUpDownUserStyleTBVerPosDelta.ValueChanged += new System.EventHandler(this.numericUpDownUserStyleTBVerPosDelta_ValueChanged); - // - // label20 - // - this.label20.AutoSize = true; - this.label20.Location = new System.Drawing.Point(11, 284); - this.label20.Name = "label20"; - this.label20.Size = new System.Drawing.Size(131, 13); - this.label20.TabIndex = 34; - this.label20.Text = "Text box vertical pos delta"; - // - // numericUpDownUserStyleTBVerPosDir - // - this.numericUpDownUserStyleTBVerPosDir.Location = new System.Drawing.Point(184, 256); - this.numericUpDownUserStyleTBVerPosDir.Maximum = new decimal(new int[] { - 7679, - 0, - 0, - 0}); - this.numericUpDownUserStyleTBVerPosDir.Name = "numericUpDownUserStyleTBVerPosDir"; - this.numericUpDownUserStyleTBVerPosDir.Size = new System.Drawing.Size(76, 20); - this.numericUpDownUserStyleTBVerPosDir.TabIndex = 33; - this.numericUpDownUserStyleTBVerPosDir.ValueChanged += new System.EventHandler(this.numericUpDownUserStyleTBVerPosDir_ValueChanged); - // - // label21 - // - this.label21.AutoSize = true; - this.label21.Location = new System.Drawing.Point(11, 258); - this.label21.Name = "label21"; - this.label21.Size = new System.Drawing.Size(148, 13); - this.label21.TabIndex = 32; - this.label21.Text = "Text box vertical pos direction"; - // - // numericUpDownUserStyleTBHorPosDelta - // - this.numericUpDownUserStyleTBHorPosDelta.Location = new System.Drawing.Point(184, 230); - this.numericUpDownUserStyleTBHorPosDelta.Maximum = new decimal(new int[] { - 4319, - 0, - 0, - 0}); - this.numericUpDownUserStyleTBHorPosDelta.Name = "numericUpDownUserStyleTBHorPosDelta"; - this.numericUpDownUserStyleTBHorPosDelta.Size = new System.Drawing.Size(76, 20); - this.numericUpDownUserStyleTBHorPosDelta.TabIndex = 31; - this.numericUpDownUserStyleTBHorPosDelta.ValueChanged += new System.EventHandler(this.numericUpDownUserStyleTBHorPosDelta_ValueChanged); - // - // label22 - // - this.label22.AutoSize = true; - this.label22.Location = new System.Drawing.Point(11, 232); - this.label22.Name = "label22"; - this.label22.Size = new System.Drawing.Size(142, 13); - this.label22.TabIndex = 30; - this.label22.Text = "Text box horizontal pos delta"; - // - // numericUpDownUserStyleTBHorPosDir - // - this.numericUpDownUserStyleTBHorPosDir.Location = new System.Drawing.Point(184, 204); - this.numericUpDownUserStyleTBHorPosDir.Maximum = new decimal(new int[] { - 7679, - 0, - 0, - 0}); - this.numericUpDownUserStyleTBHorPosDir.Name = "numericUpDownUserStyleTBHorPosDir"; - this.numericUpDownUserStyleTBHorPosDir.Size = new System.Drawing.Size(76, 20); - this.numericUpDownUserStyleTBHorPosDir.TabIndex = 29; - this.numericUpDownUserStyleTBHorPosDir.ValueChanged += new System.EventHandler(this.numericUpDownUserStyleTBHorPosDir_ValueChanged); - // - // label23 - // - this.label23.AutoSize = true; - this.label23.Location = new System.Drawing.Point(11, 206); - this.label23.Name = "label23"; - this.label23.Size = new System.Drawing.Size(159, 13); - this.label23.TabIndex = 28; - this.label23.Text = "Text box horizontal pos direction"; - // - // numericUpDownUserStyleFontSizeDelta - // - this.numericUpDownUserStyleFontSizeDelta.Location = new System.Drawing.Point(184, 178); - this.numericUpDownUserStyleFontSizeDelta.Maximum = new decimal(new int[] { - 59, - 0, - 0, - 0}); - this.numericUpDownUserStyleFontSizeDelta.Name = "numericUpDownUserStyleFontSizeDelta"; - this.numericUpDownUserStyleFontSizeDelta.Size = new System.Drawing.Size(76, 20); - this.numericUpDownUserStyleFontSizeDelta.TabIndex = 27; - this.numericUpDownUserStyleFontSizeDelta.ValueChanged += new System.EventHandler(this.numericUpDownUserStyleFontSizeDelta_ValueChanged); - // - // label24 - // - this.label24.AutoSize = true; - this.label24.Location = new System.Drawing.Point(11, 180); - this.label24.Name = "label24"; - this.label24.Size = new System.Drawing.Size(75, 13); - this.label24.TabIndex = 26; - this.label24.Text = "Font size delta"; - // - // numericUpDownUserStyleFontSizeIncDec - // - this.numericUpDownUserStyleFontSizeIncDec.Location = new System.Drawing.Point(184, 152); - this.numericUpDownUserStyleFontSizeIncDec.Maximum = new decimal(new int[] { - 254, - 0, - 0, - 0}); - this.numericUpDownUserStyleFontSizeIncDec.Name = "numericUpDownUserStyleFontSizeIncDec"; - this.numericUpDownUserStyleFontSizeIncDec.Size = new System.Drawing.Size(76, 20); - this.numericUpDownUserStyleFontSizeIncDec.TabIndex = 25; - this.numericUpDownUserStyleFontSizeIncDec.ValueChanged += new System.EventHandler(this.numericUpDownUserStyleFontSizeIncDec_ValueChanged); - // - // label13 - // - this.label13.AutoSize = true; - this.label13.Location = new System.Drawing.Point(11, 154); - this.label13.Name = "label13"; - this.label13.Size = new System.Drawing.Size(141, 13); - this.label13.TabIndex = 24; - this.label13.Text = "Font size increase/decrease"; - // - // numericUpDownUserStyleVerPosDelta - // - this.numericUpDownUserStyleVerPosDelta.Location = new System.Drawing.Point(184, 126); - this.numericUpDownUserStyleVerPosDelta.Maximum = new decimal(new int[] { - 4319, - 0, - 0, - 0}); - this.numericUpDownUserStyleVerPosDelta.Name = "numericUpDownUserStyleVerPosDelta"; - this.numericUpDownUserStyleVerPosDelta.Size = new System.Drawing.Size(76, 20); - this.numericUpDownUserStyleVerPosDelta.TabIndex = 23; - this.numericUpDownUserStyleVerPosDelta.ValueChanged += new System.EventHandler(this.numericUpDownUserStyleVerPosDelta_ValueChanged); - // - // label14 - // - this.label14.AutoSize = true; - this.label14.Location = new System.Drawing.Point(11, 128); - this.label14.Name = "label14"; - this.label14.Size = new System.Drawing.Size(107, 13); - this.label14.TabIndex = 22; - this.label14.Text = "Vertical position delta"; - // - // numericUpDownUserStyleVerPosDir - // - this.numericUpDownUserStyleVerPosDir.Location = new System.Drawing.Point(184, 100); - this.numericUpDownUserStyleVerPosDir.Maximum = new decimal(new int[] { - 7679, - 0, - 0, - 0}); - this.numericUpDownUserStyleVerPosDir.Name = "numericUpDownUserStyleVerPosDir"; - this.numericUpDownUserStyleVerPosDir.Size = new System.Drawing.Size(76, 20); - this.numericUpDownUserStyleVerPosDir.TabIndex = 21; - this.numericUpDownUserStyleVerPosDir.ValueChanged += new System.EventHandler(this.numericUpDownUserStyleVerPosDir_ValueChanged); - // - // label15 - // - this.label15.AutoSize = true; - this.label15.Location = new System.Drawing.Point(11, 102); - this.label15.Name = "label15"; - this.label15.Size = new System.Drawing.Size(124, 13); - this.label15.TabIndex = 20; - this.label15.Text = "Vertical position direction"; - // - // numericUpDownUserStyleHorPosDelta - // - this.numericUpDownUserStyleHorPosDelta.Location = new System.Drawing.Point(184, 74); - this.numericUpDownUserStyleHorPosDelta.Maximum = new decimal(new int[] { - 4319, - 0, - 0, - 0}); - this.numericUpDownUserStyleHorPosDelta.Name = "numericUpDownUserStyleHorPosDelta"; - this.numericUpDownUserStyleHorPosDelta.Size = new System.Drawing.Size(76, 20); - this.numericUpDownUserStyleHorPosDelta.TabIndex = 19; - this.numericUpDownUserStyleHorPosDelta.ValueChanged += new System.EventHandler(this.numericUpDownUserStyleHorPosDelta_ValueChanged); - // - // label16 - // - this.label16.AutoSize = true; - this.label16.Location = new System.Drawing.Point(11, 76); - this.label16.Name = "label16"; - this.label16.Size = new System.Drawing.Size(119, 13); - this.label16.TabIndex = 18; - this.label16.Text = "Horizontal position delta"; - // - // numericUpDownUserStyleHorPosDir - // - this.numericUpDownUserStyleHorPosDir.Location = new System.Drawing.Point(184, 48); - this.numericUpDownUserStyleHorPosDir.Maximum = new decimal(new int[] { - 7679, - 0, - 0, - 0}); - this.numericUpDownUserStyleHorPosDir.Name = "numericUpDownUserStyleHorPosDir"; - this.numericUpDownUserStyleHorPosDir.Size = new System.Drawing.Size(76, 20); - this.numericUpDownUserStyleHorPosDir.TabIndex = 17; - this.numericUpDownUserStyleHorPosDir.ValueChanged += new System.EventHandler(this.numericUpDownUserStyleHorPosDir_ValueChanged); - // - // labelUserStyleHorPosDir - // - this.labelUserStyleHorPosDir.AutoSize = true; - this.labelUserStyleHorPosDir.Location = new System.Drawing.Point(11, 50); - this.labelUserStyleHorPosDir.Name = "labelUserStyleHorPosDir"; - this.labelUserStyleHorPosDir.Size = new System.Drawing.Size(136, 13); - this.labelUserStyleHorPosDir.TabIndex = 16; - this.labelUserStyleHorPosDir.Text = "Horizontal position direction"; - // - // numericUpDownUserStyleId - // - this.numericUpDownUserStyleId.Location = new System.Drawing.Point(184, 22); - this.numericUpDownUserStyleId.Maximum = new decimal(new int[] { - 59, - 0, - 0, - 0}); - this.numericUpDownUserStyleId.Name = "numericUpDownUserStyleId"; - this.numericUpDownUserStyleId.Size = new System.Drawing.Size(76, 20); - this.numericUpDownUserStyleId.TabIndex = 15; - this.numericUpDownUserStyleId.ValueChanged += new System.EventHandler(this.numericUpDownUserStyleId_ValueChanged); - // - // label18 - // - this.label18.AutoSize = true; - this.label18.Location = new System.Drawing.Point(11, 24); - this.label18.Name = "label18"; - this.label18.Size = new System.Drawing.Size(39, 13); - this.label18.TabIndex = 14; - this.label18.Text = "StyleId"; - // - // buttonSaveAsM2ts - // - this.buttonSaveAsM2ts.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonSaveAsM2ts.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonSaveAsM2ts.Location = new System.Drawing.Point(478, 577); - this.buttonSaveAsM2ts.Name = "buttonSaveAsM2ts"; - this.buttonSaveAsM2ts.Size = new System.Drawing.Size(149, 23); - this.buttonSaveAsM2ts.TabIndex = 113; - this.buttonSaveAsM2ts.Text = "Write as M2TS packets..."; - this.buttonSaveAsM2ts.UseVisualStyleBackColor = true; - this.buttonSaveAsM2ts.Visible = false; - this.buttonSaveAsM2ts.Click += new System.EventHandler(this.buttonSaveAsM2ts_Click); - // - // groupBoxPresentationSegmentRegion - // - this.groupBoxPresentationSegmentRegion.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxPresentationSegmentRegion.Controls.Add(this.numericUpDownSubRegionStyleIdRef); - this.groupBoxPresentationSegmentRegion.Controls.Add(this.label40); - this.groupBoxPresentationSegmentRegion.Controls.Add(this.checkBoxSubRegionForced); - this.groupBoxPresentationSegmentRegion.Controls.Add(this.checkBoxSubRegionContinuous); - this.groupBoxPresentationSegmentRegion.Location = new System.Drawing.Point(404, 4); - this.groupBoxPresentationSegmentRegion.Name = "groupBoxPresentationSegmentRegion"; - this.groupBoxPresentationSegmentRegion.Size = new System.Drawing.Size(213, 129); - this.groupBoxPresentationSegmentRegion.TabIndex = 15; - this.groupBoxPresentationSegmentRegion.TabStop = false; - this.groupBoxPresentationSegmentRegion.Text = "Properties: Subtitle region"; - this.groupBoxPresentationSegmentRegion.Visible = false; - // - // numericUpDownSubRegionStyleIdRef - // - this.numericUpDownSubRegionStyleIdRef.Location = new System.Drawing.Point(106, 74); - this.numericUpDownSubRegionStyleIdRef.Maximum = new decimal(new int[] { - 4319, - 0, - 0, - 0}); - this.numericUpDownSubRegionStyleIdRef.Name = "numericUpDownSubRegionStyleIdRef"; - this.numericUpDownSubRegionStyleIdRef.Size = new System.Drawing.Size(76, 20); - this.numericUpDownSubRegionStyleIdRef.TabIndex = 35; - this.numericUpDownSubRegionStyleIdRef.ValueChanged += new System.EventHandler(this.numericUpDownSubRegionStyleIdRef_ValueChanged); - // - // label40 - // - this.label40.AutoSize = true; - this.label40.Location = new System.Drawing.Point(8, 76); - this.label40.Name = "label40"; - this.label40.Size = new System.Drawing.Size(91, 13); - this.label40.TabIndex = 34; - this.label40.Text = "Region style id ref"; - // - // checkBoxSubRegionForced - // - this.checkBoxSubRegionForced.AutoSize = true; - this.checkBoxSubRegionForced.Location = new System.Drawing.Point(106, 50); - this.checkBoxSubRegionForced.Name = "checkBoxSubRegionForced"; - this.checkBoxSubRegionForced.Size = new System.Drawing.Size(59, 17); - this.checkBoxSubRegionForced.TabIndex = 11; - this.checkBoxSubRegionForced.Text = "Forced"; - this.checkBoxSubRegionForced.UseVisualStyleBackColor = true; - this.checkBoxSubRegionForced.CheckedChanged += new System.EventHandler(this.checkBoxSubRegionForced_CheckedChanged); - // - // checkBoxSubRegionContinuous - // - this.checkBoxSubRegionContinuous.AutoSize = true; - this.checkBoxSubRegionContinuous.Location = new System.Drawing.Point(106, 27); - this.checkBoxSubRegionContinuous.Name = "checkBoxSubRegionContinuous"; - this.checkBoxSubRegionContinuous.Size = new System.Drawing.Size(126, 17); - this.checkBoxSubRegionContinuous.TabIndex = 10; - this.checkBoxSubRegionContinuous.Text = "Continuous from prev"; - this.checkBoxSubRegionContinuous.UseVisualStyleBackColor = true; - this.checkBoxSubRegionContinuous.CheckedChanged += new System.EventHandler(this.checkBoxSubRegionContinuous_CheckedChanged); - // - // contextMenuStripAddPalette - // - this.contextMenuStripAddPalette.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.addPaletteToolStripMenuItem}); - this.contextMenuStripAddPalette.Name = "contextMenuStripAddPalette"; - this.contextMenuStripAddPalette.Size = new System.Drawing.Size(136, 26); - // - // addPaletteToolStripMenuItem - // - this.addPaletteToolStripMenuItem.Name = "addPaletteToolStripMenuItem"; - this.addPaletteToolStripMenuItem.Size = new System.Drawing.Size(135, 22); - this.addPaletteToolStripMenuItem.Text = "Add palette"; - this.addPaletteToolStripMenuItem.Click += new System.EventHandler(this.addPaletteToolStripMenuItem_Click); - // - // groupBoxFontStyle - // - this.groupBoxFontStyle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxFontStyle.Controls.Add(this.label43); - this.groupBoxFontStyle.Controls.Add(this.label42); - this.groupBoxFontStyle.Controls.Add(this.comboBoxChangeFontStyleOutlineThickness); - this.groupBoxFontStyle.Controls.Add(this.comboBoxChangeFontStyleFontStyle); - this.groupBoxFontStyle.Controls.Add(this.numericUpDownChangeFontStyleOutlinePaletteId); - this.groupBoxFontStyle.Controls.Add(this.label41); - this.groupBoxFontStyle.Location = new System.Drawing.Point(16, 471); - this.groupBoxFontStyle.Name = "groupBoxFontStyle"; - this.groupBoxFontStyle.Size = new System.Drawing.Size(230, 133); - this.groupBoxFontStyle.TabIndex = 36; - this.groupBoxFontStyle.TabStop = false; - this.groupBoxFontStyle.Text = "Properties: Subtitle font style"; - this.groupBoxFontStyle.Visible = false; - // - // label43 - // - this.label43.AutoSize = true; - this.label43.Location = new System.Drawing.Point(6, 79); - this.label43.Name = "label43"; - this.label43.Size = new System.Drawing.Size(110, 13); - this.label43.TabIndex = 39; - this.label43.Text = "Font outline thickness"; - // - // label42 - // - this.label42.AutoSize = true; - this.label42.Location = new System.Drawing.Point(6, 26); - this.label42.Name = "label42"; - this.label42.Size = new System.Drawing.Size(52, 13); - this.label42.TabIndex = 38; - this.label42.Text = "Font style"; - // - // comboBoxChangeFontStyleOutlineThickness - // - this.comboBoxChangeFontStyleOutlineThickness.FormattingEnabled = true; - this.comboBoxChangeFontStyleOutlineThickness.Items.AddRange(new object[] { - "Thin border", - "Medium border", - "Thick border"}); - this.comboBoxChangeFontStyleOutlineThickness.Location = new System.Drawing.Point(129, 76); - this.comboBoxChangeFontStyleOutlineThickness.Name = "comboBoxChangeFontStyleOutlineThickness"; - this.comboBoxChangeFontStyleOutlineThickness.Size = new System.Drawing.Size(186, 21); - this.comboBoxChangeFontStyleOutlineThickness.TabIndex = 37; - // - // comboBoxChangeFontStyleFontStyle - // - this.comboBoxChangeFontStyleFontStyle.FormattingEnabled = true; - this.comboBoxChangeFontStyleFontStyle.Items.AddRange(new object[] { - "Normal", - "Bold", - "Italic", - "Bold and Italic", - "Outline-bordered", - "Bold and Outline-bordered", - "Italic and Outline-bordered", - "Bold and Italic and Outline-bordered"}); - this.comboBoxChangeFontStyleFontStyle.Location = new System.Drawing.Point(129, 23); - this.comboBoxChangeFontStyleFontStyle.Name = "comboBoxChangeFontStyleFontStyle"; - this.comboBoxChangeFontStyleFontStyle.Size = new System.Drawing.Size(186, 21); - this.comboBoxChangeFontStyleFontStyle.TabIndex = 36; - // - // numericUpDownChangeFontStyleOutlinePaletteId - // - this.numericUpDownChangeFontStyleOutlinePaletteId.Location = new System.Drawing.Point(129, 50); - this.numericUpDownChangeFontStyleOutlinePaletteId.Maximum = new decimal(new int[] { - 254, - 0, - 0, - 0}); - this.numericUpDownChangeFontStyleOutlinePaletteId.Name = "numericUpDownChangeFontStyleOutlinePaletteId"; - this.numericUpDownChangeFontStyleOutlinePaletteId.Size = new System.Drawing.Size(76, 20); - this.numericUpDownChangeFontStyleOutlinePaletteId.TabIndex = 35; - // - // label41 - // - this.label41.AutoSize = true; - this.label41.Location = new System.Drawing.Point(7, 52); - this.label41.Name = "label41"; - this.label41.Size = new System.Drawing.Size(108, 13); - this.label41.TabIndex = 34; - this.label41.Text = "Font outline palette id"; - // - // groupBoxChangeFontSize - // - this.groupBoxChangeFontSize.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxChangeFontSize.Controls.Add(this.groupBoxChangeFontColor); - this.groupBoxChangeFontSize.Controls.Add(this.numericUpDownChangeFontSize); - this.groupBoxChangeFontSize.Controls.Add(this.label46); - this.groupBoxChangeFontSize.Location = new System.Drawing.Point(355, 510); - this.groupBoxChangeFontSize.Name = "groupBoxChangeFontSize"; - this.groupBoxChangeFontSize.Size = new System.Drawing.Size(183, 133); - this.groupBoxChangeFontSize.TabIndex = 40; - this.groupBoxChangeFontSize.TabStop = false; - this.groupBoxChangeFontSize.Text = "Properties: Subtitle font size"; - this.groupBoxChangeFontSize.Visible = false; - // - // groupBoxChangeFontColor - // - this.groupBoxChangeFontColor.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxChangeFontColor.Controls.Add(this.numericUpDownChangeFontColor); - this.groupBoxChangeFontColor.Controls.Add(this.label45); - this.groupBoxChangeFontColor.Location = new System.Drawing.Point(30, 12); - this.groupBoxChangeFontColor.Name = "groupBoxChangeFontColor"; - this.groupBoxChangeFontColor.Size = new System.Drawing.Size(183, 133); - this.groupBoxChangeFontColor.TabIndex = 41; - this.groupBoxChangeFontColor.TabStop = false; - this.groupBoxChangeFontColor.Text = "Properties: Subtitle font color"; - this.groupBoxChangeFontColor.Visible = false; - // - // numericUpDownChangeFontColor - // - this.numericUpDownChangeFontColor.Location = new System.Drawing.Point(100, 18); - this.numericUpDownChangeFontColor.Maximum = new decimal(new int[] { - 254, - 0, - 0, - 0}); - this.numericUpDownChangeFontColor.Name = "numericUpDownChangeFontColor"; - this.numericUpDownChangeFontColor.Size = new System.Drawing.Size(76, 20); - this.numericUpDownChangeFontColor.TabIndex = 15; - this.numericUpDownChangeFontColor.ValueChanged += new System.EventHandler(this.numericUpDownChangeFontColor_ValueChanged); - // - // label45 - // - this.label45.AutoSize = true; - this.label45.Location = new System.Drawing.Point(6, 20); - this.label45.Name = "label45"; - this.label45.Size = new System.Drawing.Size(74, 13); - this.label45.TabIndex = 14; - this.label45.Text = "Font palette id"; - // - // numericUpDownChangeFontSize - // - this.numericUpDownChangeFontSize.Location = new System.Drawing.Point(80, 23); - this.numericUpDownChangeFontSize.Maximum = new decimal(new int[] { - 144, - 0, - 0, - 0}); - this.numericUpDownChangeFontSize.Minimum = new decimal(new int[] { - 8, - 0, - 0, - 0}); - this.numericUpDownChangeFontSize.Name = "numericUpDownChangeFontSize"; - this.numericUpDownChangeFontSize.Size = new System.Drawing.Size(76, 20); - this.numericUpDownChangeFontSize.TabIndex = 35; - this.numericUpDownChangeFontSize.Value = new decimal(new int[] { - 8, - 0, - 0, - 0}); - // - // label46 - // - this.label46.AutoSize = true; - this.label46.Location = new System.Drawing.Point(15, 25); - this.label46.Name = "label46"; - this.label46.Size = new System.Drawing.Size(49, 13); - this.label46.TabIndex = 34; - this.label46.Text = "Font size"; - // - // groupBoxSubtitleText - // - this.groupBoxSubtitleText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxSubtitleText.Controls.Add(this.textBoxSubtitleText); - this.groupBoxSubtitleText.Controls.Add(this.label44); - this.groupBoxSubtitleText.Location = new System.Drawing.Point(284, 526); - this.groupBoxSubtitleText.Name = "groupBoxSubtitleText"; - this.groupBoxSubtitleText.Size = new System.Drawing.Size(145, 111); - this.groupBoxSubtitleText.TabIndex = 41; - this.groupBoxSubtitleText.TabStop = false; - this.groupBoxSubtitleText.Text = "Properties: Subtitle text"; - this.groupBoxSubtitleText.Visible = false; - // - // textBoxSubtitleText - // - this.textBoxSubtitleText.Location = new System.Drawing.Point(46, 22); - this.textBoxSubtitleText.MaxLength = 50; - this.textBoxSubtitleText.Name = "textBoxSubtitleText"; - this.textBoxSubtitleText.Size = new System.Drawing.Size(228, 20); - this.textBoxSubtitleText.TabIndex = 36; - this.textBoxSubtitleText.TextChanged += new System.EventHandler(this.textBoxSubtitleText_TextChanged); - // - // label44 - // - this.label44.AutoSize = true; - this.label44.Location = new System.Drawing.Point(15, 25); - this.label44.Name = "label44"; - this.label44.Size = new System.Drawing.Size(28, 13); - this.label44.TabIndex = 34; - this.label44.Text = "Text"; - // - // contextMenuStripAddSubtitleContent - // - this.contextMenuStripAddSubtitleContent.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripMenuItem1, - this.addFontSetToolStripMenuItem, - this.addFontStyleToolStripMenuItem, - this.addFontSizeToolStripMenuItem, - this.addLineBreakToolStripMenuItem, - this.addEndOfInlineStyleToolStripMenuItem, - this.toolStripMenuItem2, - this.deleteToolStripMenuItem}); - this.contextMenuStripAddSubtitleContent.Name = "contextMenuStripAddPalette"; - this.contextMenuStripAddSubtitleContent.Size = new System.Drawing.Size(193, 164); - // - // toolStripMenuItem1 - // - this.toolStripMenuItem1.Name = "toolStripMenuItem1"; - this.toolStripMenuItem1.Size = new System.Drawing.Size(192, 22); - this.toolStripMenuItem1.Text = "Add text"; - this.toolStripMenuItem1.Click += new System.EventHandler(this.toolStripMenuItem1_Click); - // - // addFontSetToolStripMenuItem - // - this.addFontSetToolStripMenuItem.Name = "addFontSetToolStripMenuItem"; - this.addFontSetToolStripMenuItem.Size = new System.Drawing.Size(192, 22); - this.addFontSetToolStripMenuItem.Text = "Add font set"; - this.addFontSetToolStripMenuItem.Click += new System.EventHandler(this.addFontSetToolStripMenuItem_Click); - // - // addFontStyleToolStripMenuItem - // - this.addFontStyleToolStripMenuItem.Name = "addFontStyleToolStripMenuItem"; - this.addFontStyleToolStripMenuItem.Size = new System.Drawing.Size(192, 22); - this.addFontStyleToolStripMenuItem.Text = "Add font style"; - this.addFontStyleToolStripMenuItem.Click += new System.EventHandler(this.addFontStyleToolStripMenuItem_Click); - // - // addFontSizeToolStripMenuItem - // - this.addFontSizeToolStripMenuItem.Name = "addFontSizeToolStripMenuItem"; - this.addFontSizeToolStripMenuItem.Size = new System.Drawing.Size(192, 22); - this.addFontSizeToolStripMenuItem.Text = "Add font size"; - this.addFontSizeToolStripMenuItem.Click += new System.EventHandler(this.addFontSizeToolStripMenuItem_Click); - // - // addLineBreakToolStripMenuItem - // - this.addLineBreakToolStripMenuItem.Name = "addLineBreakToolStripMenuItem"; - this.addLineBreakToolStripMenuItem.Size = new System.Drawing.Size(192, 22); - this.addLineBreakToolStripMenuItem.Text = "Add line break"; - this.addLineBreakToolStripMenuItem.Click += new System.EventHandler(this.addLineBreakToolStripMenuItem_Click); - // - // addEndOfInlineStyleToolStripMenuItem - // - this.addEndOfInlineStyleToolStripMenuItem.Name = "addEndOfInlineStyleToolStripMenuItem"; - this.addEndOfInlineStyleToolStripMenuItem.Size = new System.Drawing.Size(192, 22); - this.addEndOfInlineStyleToolStripMenuItem.Text = "Add end of inline style"; - this.addEndOfInlineStyleToolStripMenuItem.Click += new System.EventHandler(this.addEndOfInlineStyleToolStripMenuItem_Click); - // - // toolStripMenuItem2 - // - this.toolStripMenuItem2.Name = "toolStripMenuItem2"; - this.toolStripMenuItem2.Size = new System.Drawing.Size(189, 6); - // - // deleteToolStripMenuItem - // - this.deleteToolStripMenuItem.Name = "deleteToolStripMenuItem"; - this.deleteToolStripMenuItem.Size = new System.Drawing.Size(192, 22); - this.deleteToolStripMenuItem.Text = "Delete"; - this.deleteToolStripMenuItem.Click += new System.EventHandler(this.deleteToolStripMenuItem_Click); - // - // contextMenuStripAddSubtitleContentFromSubRegion - // - this.contextMenuStripAddSubtitleContentFromSubRegion.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripMenuItemRegionAddText, - this.toolStripMenuItemRegionAddFontStyle, - this.toolStripMenuItemRegionAddFontSize, - this.toolStripMenuItemRegionAddLineBreak, - this.toolStripMenuItemRegionAddInlineStyle}); - this.contextMenuStripAddSubtitleContentFromSubRegion.Name = "contextMenuStripAddPalette"; - this.contextMenuStripAddSubtitleContentFromSubRegion.Size = new System.Drawing.Size(193, 114); - // - // toolStripMenuItemRegionAddText - // - this.toolStripMenuItemRegionAddText.Name = "toolStripMenuItemRegionAddText"; - this.toolStripMenuItemRegionAddText.Size = new System.Drawing.Size(192, 22); - this.toolStripMenuItemRegionAddText.Text = "Add text"; - this.toolStripMenuItemRegionAddText.Click += new System.EventHandler(this.toolStripMenuItemRegionAddText_Click); - // - // toolStripMenuItemRegionAddFontStyle - // - this.toolStripMenuItemRegionAddFontStyle.Name = "toolStripMenuItemRegionAddFontStyle"; - this.toolStripMenuItemRegionAddFontStyle.Size = new System.Drawing.Size(192, 22); - this.toolStripMenuItemRegionAddFontStyle.Text = "Add font style"; - this.toolStripMenuItemRegionAddFontStyle.Click += new System.EventHandler(this.toolStripMenuItemRegionAddFontStyle_Click); - // - // toolStripMenuItemRegionAddFontSize - // - this.toolStripMenuItemRegionAddFontSize.Name = "toolStripMenuItemRegionAddFontSize"; - this.toolStripMenuItemRegionAddFontSize.Size = new System.Drawing.Size(192, 22); - this.toolStripMenuItemRegionAddFontSize.Text = "Add font size"; - this.toolStripMenuItemRegionAddFontSize.Click += new System.EventHandler(this.toolStripMenuItemRegionAddFontSize_Click); - // - // toolStripMenuItemRegionAddLineBreak - // - this.toolStripMenuItemRegionAddLineBreak.Name = "toolStripMenuItemRegionAddLineBreak"; - this.toolStripMenuItemRegionAddLineBreak.Size = new System.Drawing.Size(192, 22); - this.toolStripMenuItemRegionAddLineBreak.Text = "Add line break"; - this.toolStripMenuItemRegionAddLineBreak.Click += new System.EventHandler(this.toolStripMenuItemRegionAddLineBreak_Click); - // - // toolStripMenuItemRegionAddInlineStyle - // - this.toolStripMenuItemRegionAddInlineStyle.Name = "toolStripMenuItemRegionAddInlineStyle"; - this.toolStripMenuItemRegionAddInlineStyle.Size = new System.Drawing.Size(192, 22); - this.toolStripMenuItemRegionAddInlineStyle.Text = "Add end of inline style"; - this.toolStripMenuItemRegionAddInlineStyle.Click += new System.EventHandler(this.toolStripMenuItemRegionAddInlineStyle_Click); - // - // groupBoxFontSet - // - this.groupBoxFontSet.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxFontSet.Controls.Add(this.numericUpDownFontSetFontId); - this.groupBoxFontSet.Controls.Add(this.label48); - this.groupBoxFontSet.Location = new System.Drawing.Point(544, 497); - this.groupBoxFontSet.Name = "groupBoxFontSet"; - this.groupBoxFontSet.Size = new System.Drawing.Size(226, 133); - this.groupBoxFontSet.TabIndex = 42; - this.groupBoxFontSet.TabStop = false; - this.groupBoxFontSet.Text = "Properties: Subtitle font set"; - this.groupBoxFontSet.Visible = false; - // - // numericUpDownFontSetFontId - // - this.numericUpDownFontSetFontId.Location = new System.Drawing.Point(100, 18); - this.numericUpDownFontSetFontId.Maximum = new decimal(new int[] { - 254, - 0, - 0, - 0}); - this.numericUpDownFontSetFontId.Name = "numericUpDownFontSetFontId"; - this.numericUpDownFontSetFontId.Size = new System.Drawing.Size(76, 20); - this.numericUpDownFontSetFontId.TabIndex = 15; - this.numericUpDownFontSetFontId.ValueChanged += new System.EventHandler(this.numericUpDownFontSetFontId_ValueChanged); - // - // label48 - // - this.label48.AutoSize = true; - this.label48.Location = new System.Drawing.Point(6, 20); - this.label48.Name = "label48"; - this.label48.Size = new System.Drawing.Size(81, 13); - this.label48.TabIndex = 14; - this.label48.Text = "Font id from CIF"; - // - // contextMenuStripRegionStyle - // - this.contextMenuStripRegionStyle.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripMenuItemDuplicateRegionStyle}); - this.contextMenuStripRegionStyle.Name = "contextMenuStripAddPalette"; - this.contextMenuStripRegionStyle.Size = new System.Drawing.Size(125, 26); - // - // toolStripMenuItemDuplicateRegionStyle - // - this.toolStripMenuItemDuplicateRegionStyle.Name = "toolStripMenuItemDuplicateRegionStyle"; - this.toolStripMenuItemDuplicateRegionStyle.Size = new System.Drawing.Size(124, 22); - this.toolStripMenuItemDuplicateRegionStyle.Text = "Duplicate"; - this.toolStripMenuItemDuplicateRegionStyle.Click += new System.EventHandler(this.toolStripMenuItemDuplicateRegionStyle_Click); - // - // ExportTextST - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(871, 610); - this.Controls.Add(this.groupBoxPresentationSegmentRegion); - this.Controls.Add(this.groupBoxFontSet); - this.Controls.Add(this.groupBoxPropertiesPalette); - this.Controls.Add(this.groupBoxChangeFontSize); - this.Controls.Add(this.buttonImport); - this.Controls.Add(this.groupBoxSubtitleText); - this.Controls.Add(this.groupBoxFontStyle); - this.Controls.Add(this.groupBoxPropertiesUserStyle); - this.Controls.Add(this.groupBoxPropertiesRegionStyle); - this.Controls.Add(this.buttonSaveAsM2ts); - this.Controls.Add(this.groupBoxPropertiesRoot); - this.Controls.Add(this.groupBoxTextST); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonSaveAsPes); - this.MinimumSize = new System.Drawing.Size(800, 645); - this.Name = "ExportTextST"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Export to TextST"; - this.groupBoxPropertiesRoot.ResumeLayout(false); - this.groupBoxPropertiesRoot.PerformLayout(); - this.groupBoxTextST.ResumeLayout(false); - this.groupBoxPropertiesRegionStyle.ResumeLayout(false); - this.groupBoxPropertiesRegionStyle.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleFontOutlineThickness)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleFontOutlinePaletteId)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleFontPaletteId)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleFontStyle)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleFontIdRef)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleLineSpace)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleTextVerAlign)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleTextHorAlign)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleTextFlow)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleTBHeight)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleTBWidth)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleTBVerPos)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleTBHorPos)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleFontSize)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStylePaletteEntryId)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleHeight)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleWidth)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleVPos)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleHPos)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleId)).EndInit(); - this.groupBoxPropertiesPalette.ResumeLayout(false); - this.groupBoxPropertiesPalette.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPaletteOpacity)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPaletteCb)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPaletteCr)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPaletteY)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPaletteEntry)).EndInit(); - this.groupBoxPropertiesUserStyle.ResumeLayout(false); - this.groupBoxPropertiesUserStyle.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleLineSpaceDelta)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleLineSpaceIncDec)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleTBHeightDelta)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleTBHeightIncDec)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleTBWidthDelta)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleTBWidthIncDec)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleTBVerPosDelta)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleTBVerPosDir)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleTBHorPosDelta)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleTBHorPosDir)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleFontSizeDelta)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleFontSizeIncDec)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleVerPosDelta)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleVerPosDir)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleHorPosDelta)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleHorPosDir)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleId)).EndInit(); - this.groupBoxPresentationSegmentRegion.ResumeLayout(false); - this.groupBoxPresentationSegmentRegion.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSubRegionStyleIdRef)).EndInit(); - this.contextMenuStripAddPalette.ResumeLayout(false); - this.groupBoxFontStyle.ResumeLayout(false); - this.groupBoxFontStyle.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownChangeFontStyleOutlinePaletteId)).EndInit(); - this.groupBoxChangeFontSize.ResumeLayout(false); - this.groupBoxChangeFontSize.PerformLayout(); - this.groupBoxChangeFontColor.ResumeLayout(false); - this.groupBoxChangeFontColor.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownChangeFontColor)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownChangeFontSize)).EndInit(); - this.groupBoxSubtitleText.ResumeLayout(false); - this.groupBoxSubtitleText.PerformLayout(); - this.contextMenuStripAddSubtitleContent.ResumeLayout(false); - this.contextMenuStripAddSubtitleContentFromSubRegion.ResumeLayout(false); - this.groupBoxFontSet.ResumeLayout(false); - this.groupBoxFontSet.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownFontSetFontId)).EndInit(); - this.contextMenuStripRegionStyle.ResumeLayout(false); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.GroupBox groupBoxPropertiesRoot; - private System.Windows.Forms.GroupBox groupBoxTextST; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonSaveAsPes; - private System.Windows.Forms.Button buttonImport; - private System.Windows.Forms.OpenFileDialog openFileDialog1; - private System.Windows.Forms.TreeView treeView1; - private System.Windows.Forms.TextBox textBoxRoot; - private System.Windows.Forms.GroupBox groupBoxPropertiesRegionStyle; - private System.Windows.Forms.GroupBox groupBoxPropertiesPalette; - private System.Windows.Forms.GroupBox groupBoxPropertiesUserStyle; - private System.Windows.Forms.NumericUpDown numericUpDownPaletteOpacity; - private System.Windows.Forms.Label label5; - private System.Windows.Forms.NumericUpDown numericUpDownPaletteCb; - private System.Windows.Forms.Label label4; - private System.Windows.Forms.NumericUpDown numericUpDownPaletteCr; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.NumericUpDown numericUpDownPaletteY; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.NumericUpDown numericUpDownPaletteEntry; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.Panel panelPaletteColor; - private System.Windows.Forms.Button buttonColor; - private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleHeight; - private System.Windows.Forms.Label label9; - private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleWidth; - private System.Windows.Forms.Label label10; - private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleVPos; - private System.Windows.Forms.Label label8; - private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleHPos; - private System.Windows.Forms.Label label7; - private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleId; - private System.Windows.Forms.Label label6; - private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleFontSize; - private System.Windows.Forms.Label label12; - private System.Windows.Forms.NumericUpDown numericUpDownRegionStylePaletteEntryId; - private System.Windows.Forms.Label label11; - private System.Windows.Forms.SaveFileDialog saveFileDialog1; - private System.Windows.Forms.Button buttonSaveAsM2ts; - private System.Windows.Forms.NumericUpDown numericUpDownUserStyleLineSpaceDelta; - private System.Windows.Forms.Label label28; - private System.Windows.Forms.NumericUpDown numericUpDownUserStyleLineSpaceIncDec; - private System.Windows.Forms.Label label29; - private System.Windows.Forms.NumericUpDown numericUpDownUserStyleTBHeightDelta; - private System.Windows.Forms.Label label27; - private System.Windows.Forms.NumericUpDown numericUpDownUserStyleTBHeightIncDec; - private System.Windows.Forms.Label label25; - private System.Windows.Forms.NumericUpDown numericUpDownUserStyleTBWidthDelta; - private System.Windows.Forms.Label label26; - private System.Windows.Forms.NumericUpDown numericUpDownUserStyleTBWidthIncDec; - private System.Windows.Forms.Label label19; - private System.Windows.Forms.NumericUpDown numericUpDownUserStyleTBVerPosDelta; - private System.Windows.Forms.Label label20; - private System.Windows.Forms.NumericUpDown numericUpDownUserStyleTBVerPosDir; - private System.Windows.Forms.Label label21; - private System.Windows.Forms.NumericUpDown numericUpDownUserStyleTBHorPosDelta; - private System.Windows.Forms.Label label22; - private System.Windows.Forms.NumericUpDown numericUpDownUserStyleTBHorPosDir; - private System.Windows.Forms.Label label23; - private System.Windows.Forms.NumericUpDown numericUpDownUserStyleFontSizeDelta; - private System.Windows.Forms.Label label24; - private System.Windows.Forms.NumericUpDown numericUpDownUserStyleFontSizeIncDec; - private System.Windows.Forms.Label label13; - private System.Windows.Forms.NumericUpDown numericUpDownUserStyleVerPosDelta; - private System.Windows.Forms.Label label14; - private System.Windows.Forms.NumericUpDown numericUpDownUserStyleVerPosDir; - private System.Windows.Forms.Label label15; - private System.Windows.Forms.NumericUpDown numericUpDownUserStyleHorPosDelta; - private System.Windows.Forms.Label label16; - private System.Windows.Forms.NumericUpDown numericUpDownUserStyleHorPosDir; - private System.Windows.Forms.Label labelUserStyleHorPosDir; - private System.Windows.Forms.NumericUpDown numericUpDownUserStyleId; - private System.Windows.Forms.Label label18; - private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleFontOutlineThickness; - private System.Windows.Forms.Label labelRegionStyleFontOutlineThickness; - private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleFontOutlinePaletteId; - private System.Windows.Forms.Label labelRegionStyleFontOutlinePaletteId; - private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleFontPaletteId; - private System.Windows.Forms.Label label39; - private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleFontStyle; - private System.Windows.Forms.Label label38; - private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleFontIdRef; - private System.Windows.Forms.Label label37; - private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleLineSpace; - private System.Windows.Forms.Label label33; - private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleTextVerAlign; - private System.Windows.Forms.Label label34; - private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleTextHorAlign; - private System.Windows.Forms.Label label35; - private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleTextFlow; - private System.Windows.Forms.Label label36; - private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleTBHeight; - private System.Windows.Forms.Label label17; - private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleTBWidth; - private System.Windows.Forms.Label label30; - private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleTBVerPos; - private System.Windows.Forms.Label label31; - private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleTBHorPos; - private System.Windows.Forms.Label label32; - private System.Windows.Forms.GroupBox groupBoxPresentationSegmentRegion; - private System.Windows.Forms.NumericUpDown numericUpDownSubRegionStyleIdRef; - private System.Windows.Forms.Label label40; - private System.Windows.Forms.CheckBox checkBoxSubRegionForced; - private System.Windows.Forms.CheckBox checkBoxSubRegionContinuous; - private System.Windows.Forms.ContextMenuStrip contextMenuStripAddPalette; - private System.Windows.Forms.ToolStripMenuItem addPaletteToolStripMenuItem; - private System.Windows.Forms.GroupBox groupBoxFontStyle; - private System.Windows.Forms.Label label43; - private System.Windows.Forms.Label label42; - private System.Windows.Forms.ComboBox comboBoxChangeFontStyleOutlineThickness; - private System.Windows.Forms.ComboBox comboBoxChangeFontStyleFontStyle; - private System.Windows.Forms.NumericUpDown numericUpDownChangeFontStyleOutlinePaletteId; - private System.Windows.Forms.Label label41; - private System.Windows.Forms.GroupBox groupBoxChangeFontSize; - private System.Windows.Forms.NumericUpDown numericUpDownChangeFontSize; - private System.Windows.Forms.Label label46; - private System.Windows.Forms.GroupBox groupBoxSubtitleText; - private System.Windows.Forms.TextBox textBoxSubtitleText; - private System.Windows.Forms.Label label44; - private System.Windows.Forms.GroupBox groupBoxChangeFontColor; - private System.Windows.Forms.NumericUpDown numericUpDownChangeFontColor; - private System.Windows.Forms.Label label45; - private System.Windows.Forms.ContextMenuStrip contextMenuStripAddSubtitleContent; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem addFontStyleToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem addFontSizeToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem addLineBreakToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem addEndOfInlineStyleToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripMenuItem2; - private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem; - private System.Windows.Forms.ContextMenuStrip contextMenuStripAddSubtitleContentFromSubRegion; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemRegionAddText; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemRegionAddFontStyle; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemRegionAddFontSize; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemRegionAddLineBreak; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemRegionAddInlineStyle; - private System.Windows.Forms.Label label47; - private System.Windows.Forms.GroupBox groupBoxFontSet; - private System.Windows.Forms.NumericUpDown numericUpDownFontSetFontId; - private System.Windows.Forms.Label label48; - private System.Windows.Forms.ToolStripMenuItem addFontSetToolStripMenuItem; - private System.Windows.Forms.ContextMenuStrip contextMenuStripRegionStyle; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemDuplicateRegionStyle; - } +namespace Nikse.SubtitleEdit.Forms +{ + partial class ExportTextST + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.groupBoxPropertiesRoot = new System.Windows.Forms.GroupBox(); + this.textBoxRoot = new System.Windows.Forms.TextBox(); + this.groupBoxTextST = new System.Windows.Forms.GroupBox(); + this.treeView1 = new System.Windows.Forms.TreeView(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonSaveAsPes = new System.Windows.Forms.Button(); + this.buttonImport = new System.Windows.Forms.Button(); + this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); + this.groupBoxPropertiesRegionStyle = new System.Windows.Forms.GroupBox(); + this.numericUpDownRegionStyleFontOutlineThickness = new System.Windows.Forms.NumericUpDown(); + this.labelRegionStyleFontOutlineThickness = new System.Windows.Forms.Label(); + this.numericUpDownRegionStyleFontOutlinePaletteId = new System.Windows.Forms.NumericUpDown(); + this.labelRegionStyleFontOutlinePaletteId = new System.Windows.Forms.Label(); + this.numericUpDownRegionStyleFontPaletteId = new System.Windows.Forms.NumericUpDown(); + this.label39 = new System.Windows.Forms.Label(); + this.numericUpDownRegionStyleFontStyle = new System.Windows.Forms.NumericUpDown(); + this.label38 = new System.Windows.Forms.Label(); + this.numericUpDownRegionStyleFontIdRef = new System.Windows.Forms.NumericUpDown(); + this.label37 = new System.Windows.Forms.Label(); + this.numericUpDownRegionStyleLineSpace = new System.Windows.Forms.NumericUpDown(); + this.label33 = new System.Windows.Forms.Label(); + this.numericUpDownRegionStyleTextVerAlign = new System.Windows.Forms.NumericUpDown(); + this.label34 = new System.Windows.Forms.Label(); + this.numericUpDownRegionStyleTextHorAlign = new System.Windows.Forms.NumericUpDown(); + this.label35 = new System.Windows.Forms.Label(); + this.numericUpDownRegionStyleTextFlow = new System.Windows.Forms.NumericUpDown(); + this.label36 = new System.Windows.Forms.Label(); + this.numericUpDownRegionStyleTBHeight = new System.Windows.Forms.NumericUpDown(); + this.label17 = new System.Windows.Forms.Label(); + this.numericUpDownRegionStyleTBWidth = new System.Windows.Forms.NumericUpDown(); + this.label30 = new System.Windows.Forms.Label(); + this.numericUpDownRegionStyleTBVerPos = new System.Windows.Forms.NumericUpDown(); + this.label31 = new System.Windows.Forms.Label(); + this.numericUpDownRegionStyleTBHorPos = new System.Windows.Forms.NumericUpDown(); + this.label32 = new System.Windows.Forms.Label(); + this.numericUpDownRegionStyleFontSize = new System.Windows.Forms.NumericUpDown(); + this.label12 = new System.Windows.Forms.Label(); + this.numericUpDownRegionStylePaletteEntryId = new System.Windows.Forms.NumericUpDown(); + this.label11 = new System.Windows.Forms.Label(); + this.numericUpDownRegionStyleHeight = new System.Windows.Forms.NumericUpDown(); + this.label9 = new System.Windows.Forms.Label(); + this.numericUpDownRegionStyleWidth = new System.Windows.Forms.NumericUpDown(); + this.label10 = new System.Windows.Forms.Label(); + this.numericUpDownRegionStyleVPos = new System.Windows.Forms.NumericUpDown(); + this.label8 = new System.Windows.Forms.Label(); + this.numericUpDownRegionStyleHPos = new System.Windows.Forms.NumericUpDown(); + this.label7 = new System.Windows.Forms.Label(); + this.numericUpDownRegionStyleId = new System.Windows.Forms.NumericUpDown(); + this.label6 = new System.Windows.Forms.Label(); + this.groupBoxPropertiesPalette = new System.Windows.Forms.GroupBox(); + this.label47 = new System.Windows.Forms.Label(); + this.panelPaletteColor = new System.Windows.Forms.Panel(); + this.buttonColor = new System.Windows.Forms.Button(); + this.numericUpDownPaletteOpacity = new System.Windows.Forms.NumericUpDown(); + this.label5 = new System.Windows.Forms.Label(); + this.numericUpDownPaletteCb = new System.Windows.Forms.NumericUpDown(); + this.label4 = new System.Windows.Forms.Label(); + this.numericUpDownPaletteCr = new System.Windows.Forms.NumericUpDown(); + this.label3 = new System.Windows.Forms.Label(); + this.numericUpDownPaletteY = new System.Windows.Forms.NumericUpDown(); + this.label2 = new System.Windows.Forms.Label(); + this.numericUpDownPaletteEntry = new System.Windows.Forms.NumericUpDown(); + this.label1 = new System.Windows.Forms.Label(); + this.groupBoxPropertiesUserStyle = new System.Windows.Forms.GroupBox(); + this.numericUpDownUserStyleLineSpaceDelta = new System.Windows.Forms.NumericUpDown(); + this.label28 = new System.Windows.Forms.Label(); + this.numericUpDownUserStyleLineSpaceIncDec = new System.Windows.Forms.NumericUpDown(); + this.label29 = new System.Windows.Forms.Label(); + this.numericUpDownUserStyleTBHeightDelta = new System.Windows.Forms.NumericUpDown(); + this.label27 = new System.Windows.Forms.Label(); + this.numericUpDownUserStyleTBHeightIncDec = new System.Windows.Forms.NumericUpDown(); + this.label25 = new System.Windows.Forms.Label(); + this.numericUpDownUserStyleTBWidthDelta = new System.Windows.Forms.NumericUpDown(); + this.label26 = new System.Windows.Forms.Label(); + this.numericUpDownUserStyleTBWidthIncDec = new System.Windows.Forms.NumericUpDown(); + this.label19 = new System.Windows.Forms.Label(); + this.numericUpDownUserStyleTBVerPosDelta = new System.Windows.Forms.NumericUpDown(); + this.label20 = new System.Windows.Forms.Label(); + this.numericUpDownUserStyleTBVerPosDir = new System.Windows.Forms.NumericUpDown(); + this.label21 = new System.Windows.Forms.Label(); + this.numericUpDownUserStyleTBHorPosDelta = new System.Windows.Forms.NumericUpDown(); + this.label22 = new System.Windows.Forms.Label(); + this.numericUpDownUserStyleTBHorPosDir = new System.Windows.Forms.NumericUpDown(); + this.label23 = new System.Windows.Forms.Label(); + this.numericUpDownUserStyleFontSizeDelta = new System.Windows.Forms.NumericUpDown(); + this.label24 = new System.Windows.Forms.Label(); + this.numericUpDownUserStyleFontSizeIncDec = new System.Windows.Forms.NumericUpDown(); + this.label13 = new System.Windows.Forms.Label(); + this.numericUpDownUserStyleVerPosDelta = new System.Windows.Forms.NumericUpDown(); + this.label14 = new System.Windows.Forms.Label(); + this.numericUpDownUserStyleVerPosDir = new System.Windows.Forms.NumericUpDown(); + this.label15 = new System.Windows.Forms.Label(); + this.numericUpDownUserStyleHorPosDelta = new System.Windows.Forms.NumericUpDown(); + this.label16 = new System.Windows.Forms.Label(); + this.numericUpDownUserStyleHorPosDir = new System.Windows.Forms.NumericUpDown(); + this.labelUserStyleHorPosDir = new System.Windows.Forms.Label(); + this.numericUpDownUserStyleId = new System.Windows.Forms.NumericUpDown(); + this.label18 = new System.Windows.Forms.Label(); + this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog(); + this.buttonSaveAsM2ts = new System.Windows.Forms.Button(); + this.groupBoxPresentationSegmentRegion = new System.Windows.Forms.GroupBox(); + this.numericUpDownSubRegionStyleIdRef = new System.Windows.Forms.NumericUpDown(); + this.label40 = new System.Windows.Forms.Label(); + this.checkBoxSubRegionForced = new System.Windows.Forms.CheckBox(); + this.checkBoxSubRegionContinuous = new System.Windows.Forms.CheckBox(); + this.contextMenuStripAddPalette = new System.Windows.Forms.ContextMenuStrip(this.components); + this.addPaletteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.groupBoxFontStyle = new System.Windows.Forms.GroupBox(); + this.label43 = new System.Windows.Forms.Label(); + this.label42 = new System.Windows.Forms.Label(); + this.comboBoxChangeFontStyleOutlineThickness = new System.Windows.Forms.ComboBox(); + this.comboBoxChangeFontStyleFontStyle = new System.Windows.Forms.ComboBox(); + this.numericUpDownChangeFontStyleOutlinePaletteId = new System.Windows.Forms.NumericUpDown(); + this.label41 = new System.Windows.Forms.Label(); + this.groupBoxChangeFontSize = new System.Windows.Forms.GroupBox(); + this.groupBoxChangeFontColor = new System.Windows.Forms.GroupBox(); + this.numericUpDownChangeFontColor = new System.Windows.Forms.NumericUpDown(); + this.label45 = new System.Windows.Forms.Label(); + this.numericUpDownChangeFontSize = new System.Windows.Forms.NumericUpDown(); + this.label46 = new System.Windows.Forms.Label(); + this.groupBoxSubtitleText = new System.Windows.Forms.GroupBox(); + this.textBoxSubtitleText = new System.Windows.Forms.TextBox(); + this.label44 = new System.Windows.Forms.Label(); + this.contextMenuStripAddSubtitleContent = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.addFontSetToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.addFontStyleToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.addFontSizeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.addLineBreakToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.addEndOfInlineStyleToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator(); + this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.contextMenuStripAddSubtitleContentFromSubRegion = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItemRegionAddText = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemRegionAddFontStyle = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemRegionAddFontSize = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemRegionAddLineBreak = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemRegionAddInlineStyle = new System.Windows.Forms.ToolStripMenuItem(); + this.groupBoxFontSet = new System.Windows.Forms.GroupBox(); + this.numericUpDownFontSetFontId = new System.Windows.Forms.NumericUpDown(); + this.label48 = new System.Windows.Forms.Label(); + this.contextMenuStripRegionStyle = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItemDuplicateRegionStyle = new System.Windows.Forms.ToolStripMenuItem(); + this.groupBoxPropertiesRoot.SuspendLayout(); + this.groupBoxTextST.SuspendLayout(); + this.groupBoxPropertiesRegionStyle.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleFontOutlineThickness)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleFontOutlinePaletteId)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleFontPaletteId)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleFontStyle)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleFontIdRef)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleLineSpace)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleTextVerAlign)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleTextHorAlign)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleTextFlow)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleTBHeight)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleTBWidth)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleTBVerPos)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleTBHorPos)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleFontSize)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStylePaletteEntryId)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleHeight)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleWidth)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleVPos)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleHPos)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleId)).BeginInit(); + this.groupBoxPropertiesPalette.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPaletteOpacity)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPaletteCb)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPaletteCr)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPaletteY)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPaletteEntry)).BeginInit(); + this.groupBoxPropertiesUserStyle.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleLineSpaceDelta)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleLineSpaceIncDec)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleTBHeightDelta)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleTBHeightIncDec)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleTBWidthDelta)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleTBWidthIncDec)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleTBVerPosDelta)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleTBVerPosDir)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleTBHorPosDelta)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleTBHorPosDir)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleFontSizeDelta)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleFontSizeIncDec)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleVerPosDelta)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleVerPosDir)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleHorPosDelta)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleHorPosDir)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleId)).BeginInit(); + this.groupBoxPresentationSegmentRegion.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSubRegionStyleIdRef)).BeginInit(); + this.contextMenuStripAddPalette.SuspendLayout(); + this.groupBoxFontStyle.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownChangeFontStyleOutlinePaletteId)).BeginInit(); + this.groupBoxChangeFontSize.SuspendLayout(); + this.groupBoxChangeFontColor.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownChangeFontColor)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownChangeFontSize)).BeginInit(); + this.groupBoxSubtitleText.SuspendLayout(); + this.contextMenuStripAddSubtitleContent.SuspendLayout(); + this.contextMenuStripAddSubtitleContentFromSubRegion.SuspendLayout(); + this.groupBoxFontSet.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownFontSetFontId)).BeginInit(); + this.contextMenuStripRegionStyle.SuspendLayout(); + this.SuspendLayout(); + // + // groupBoxPropertiesRoot + // + this.groupBoxPropertiesRoot.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxPropertiesRoot.Controls.Add(this.textBoxRoot); + this.groupBoxPropertiesRoot.Location = new System.Drawing.Point(518, 21); + this.groupBoxPropertiesRoot.Name = "groupBoxPropertiesRoot"; + this.groupBoxPropertiesRoot.Size = new System.Drawing.Size(345, 550); + this.groupBoxPropertiesRoot.TabIndex = 7; + this.groupBoxPropertiesRoot.TabStop = false; + this.groupBoxPropertiesRoot.Text = "Properties"; + // + // textBoxRoot + // + this.textBoxRoot.Dock = System.Windows.Forms.DockStyle.Fill; + this.textBoxRoot.Location = new System.Drawing.Point(3, 16); + this.textBoxRoot.Multiline = true; + this.textBoxRoot.Name = "textBoxRoot"; + this.textBoxRoot.ReadOnly = true; + this.textBoxRoot.Size = new System.Drawing.Size(339, 531); + this.textBoxRoot.TabIndex = 0; + // + // groupBoxTextST + // + this.groupBoxTextST.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxTextST.Controls.Add(this.treeView1); + this.groupBoxTextST.Location = new System.Drawing.Point(7, 21); + this.groupBoxTextST.Name = "groupBoxTextST"; + this.groupBoxTextST.Size = new System.Drawing.Size(505, 550); + this.groupBoxTextST.TabIndex = 6; + this.groupBoxTextST.TabStop = false; + this.groupBoxTextST.Text = "TextST structure"; + // + // treeView1 + // + this.treeView1.Dock = System.Windows.Forms.DockStyle.Fill; + this.treeView1.Location = new System.Drawing.Point(3, 16); + this.treeView1.Name = "treeView1"; + this.treeView1.Size = new System.Drawing.Size(499, 531); + this.treeView1.TabIndex = 0; + this.treeView1.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect); + this.treeView1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.treeView1_MouseUp); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(788, 577); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 9; + this.buttonCancel.Text = "&OK"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // buttonSaveAsPes + // + this.buttonSaveAsPes.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonSaveAsPes.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonSaveAsPes.Location = new System.Drawing.Point(633, 577); + this.buttonSaveAsPes.Name = "buttonSaveAsPes"; + this.buttonSaveAsPes.Size = new System.Drawing.Size(149, 23); + this.buttonSaveAsPes.TabIndex = 8; + this.buttonSaveAsPes.Text = "Write as PES packets..."; + this.buttonSaveAsPes.UseVisualStyleBackColor = true; + this.buttonSaveAsPes.Click += new System.EventHandler(this.buttonSaveAsPes_Click); + // + // buttonImport + // + this.buttonImport.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.buttonImport.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonImport.Location = new System.Drawing.Point(724, 3); + this.buttonImport.Name = "buttonImport"; + this.buttonImport.Size = new System.Drawing.Size(139, 21); + this.buttonImport.TabIndex = 7; + this.buttonImport.Text = "Import TextST..."; + this.buttonImport.UseVisualStyleBackColor = true; + this.buttonImport.Click += new System.EventHandler(this.ButtonImportClick); + // + // groupBoxPropertiesRegionStyle + // + this.groupBoxPropertiesRegionStyle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleFontOutlineThickness); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.labelRegionStyleFontOutlineThickness); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleFontOutlinePaletteId); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.labelRegionStyleFontOutlinePaletteId); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleFontPaletteId); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.label39); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleFontStyle); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.label38); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleFontIdRef); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.label37); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleLineSpace); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.label33); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleTextVerAlign); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.label34); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleTextHorAlign); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.label35); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleTextFlow); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.label36); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleTBHeight); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.label17); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleTBWidth); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.label30); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleTBVerPos); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.label31); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleTBHorPos); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.label32); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleFontSize); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.label12); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStylePaletteEntryId); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.label11); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleHeight); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.label9); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleWidth); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.label10); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleVPos); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.label8); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleHPos); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.label7); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.numericUpDownRegionStyleId); + this.groupBoxPropertiesRegionStyle.Controls.Add(this.label6); + this.groupBoxPropertiesRegionStyle.Location = new System.Drawing.Point(48, 12); + this.groupBoxPropertiesRegionStyle.Name = "groupBoxPropertiesRegionStyle"; + this.groupBoxPropertiesRegionStyle.Size = new System.Drawing.Size(230, 549); + this.groupBoxPropertiesRegionStyle.TabIndex = 8; + this.groupBoxPropertiesRegionStyle.TabStop = false; + this.groupBoxPropertiesRegionStyle.Text = "Properties: Region style"; + this.groupBoxPropertiesRegionStyle.Visible = false; + // + // numericUpDownRegionStyleFontOutlineThickness + // + this.numericUpDownRegionStyleFontOutlineThickness.Location = new System.Drawing.Point(143, 516); + this.numericUpDownRegionStyleFontOutlineThickness.Maximum = new decimal(new int[] { + 3, + 0, + 0, + 0}); + this.numericUpDownRegionStyleFontOutlineThickness.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownRegionStyleFontOutlineThickness.Name = "numericUpDownRegionStyleFontOutlineThickness"; + this.numericUpDownRegionStyleFontOutlineThickness.Size = new System.Drawing.Size(76, 20); + this.numericUpDownRegionStyleFontOutlineThickness.TabIndex = 41; + this.numericUpDownRegionStyleFontOutlineThickness.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownRegionStyleFontOutlineThickness.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleFontOutlineThickness_ValueChanged); + // + // labelRegionStyleFontOutlineThickness + // + this.labelRegionStyleFontOutlineThickness.AutoSize = true; + this.labelRegionStyleFontOutlineThickness.Location = new System.Drawing.Point(10, 518); + this.labelRegionStyleFontOutlineThickness.Name = "labelRegionStyleFontOutlineThickness"; + this.labelRegionStyleFontOutlineThickness.Size = new System.Drawing.Size(110, 13); + this.labelRegionStyleFontOutlineThickness.TabIndex = 40; + this.labelRegionStyleFontOutlineThickness.Text = "Font outline thickness"; + // + // numericUpDownRegionStyleFontOutlinePaletteId + // + this.numericUpDownRegionStyleFontOutlinePaletteId.Location = new System.Drawing.Point(143, 490); + this.numericUpDownRegionStyleFontOutlinePaletteId.Maximum = new decimal(new int[] { + 254, + 0, + 0, + 0}); + this.numericUpDownRegionStyleFontOutlinePaletteId.Name = "numericUpDownRegionStyleFontOutlinePaletteId"; + this.numericUpDownRegionStyleFontOutlinePaletteId.Size = new System.Drawing.Size(76, 20); + this.numericUpDownRegionStyleFontOutlinePaletteId.TabIndex = 39; + this.numericUpDownRegionStyleFontOutlinePaletteId.Value = new decimal(new int[] { + 8, + 0, + 0, + 0}); + this.numericUpDownRegionStyleFontOutlinePaletteId.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleFontOutlinePaletteId_ValueChanged); + // + // labelRegionStyleFontOutlinePaletteId + // + this.labelRegionStyleFontOutlinePaletteId.AutoSize = true; + this.labelRegionStyleFontOutlinePaletteId.Location = new System.Drawing.Point(10, 492); + this.labelRegionStyleFontOutlinePaletteId.Name = "labelRegionStyleFontOutlinePaletteId"; + this.labelRegionStyleFontOutlinePaletteId.Size = new System.Drawing.Size(108, 13); + this.labelRegionStyleFontOutlinePaletteId.TabIndex = 38; + this.labelRegionStyleFontOutlinePaletteId.Text = "Font outline palette id"; + // + // numericUpDownRegionStyleFontPaletteId + // + this.numericUpDownRegionStyleFontPaletteId.Location = new System.Drawing.Point(143, 464); + this.numericUpDownRegionStyleFontPaletteId.Maximum = new decimal(new int[] { + 254, + 0, + 0, + 0}); + this.numericUpDownRegionStyleFontPaletteId.Name = "numericUpDownRegionStyleFontPaletteId"; + this.numericUpDownRegionStyleFontPaletteId.Size = new System.Drawing.Size(76, 20); + this.numericUpDownRegionStyleFontPaletteId.TabIndex = 37; + this.numericUpDownRegionStyleFontPaletteId.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleFontPaletteId_ValueChanged); + // + // label39 + // + this.label39.AutoSize = true; + this.label39.Location = new System.Drawing.Point(10, 466); + this.label39.Name = "label39"; + this.label39.Size = new System.Drawing.Size(74, 13); + this.label39.TabIndex = 36; + this.label39.Text = "Font palette id"; + // + // numericUpDownRegionStyleFontStyle + // + this.numericUpDownRegionStyleFontStyle.Location = new System.Drawing.Point(143, 412); + this.numericUpDownRegionStyleFontStyle.Maximum = new decimal(new int[] { + 4319, + 0, + 0, + 0}); + this.numericUpDownRegionStyleFontStyle.Name = "numericUpDownRegionStyleFontStyle"; + this.numericUpDownRegionStyleFontStyle.Size = new System.Drawing.Size(76, 20); + this.numericUpDownRegionStyleFontStyle.TabIndex = 35; + this.numericUpDownRegionStyleFontStyle.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleFontStyle_ValueChanged); + // + // label38 + // + this.label38.AutoSize = true; + this.label38.Location = new System.Drawing.Point(10, 414); + this.label38.Name = "label38"; + this.label38.Size = new System.Drawing.Size(52, 13); + this.label38.TabIndex = 34; + this.label38.Text = "Font style"; + // + // numericUpDownRegionStyleFontIdRef + // + this.numericUpDownRegionStyleFontIdRef.Location = new System.Drawing.Point(143, 386); + this.numericUpDownRegionStyleFontIdRef.Maximum = new decimal(new int[] { + 4319, + 0, + 0, + 0}); + this.numericUpDownRegionStyleFontIdRef.Name = "numericUpDownRegionStyleFontIdRef"; + this.numericUpDownRegionStyleFontIdRef.Size = new System.Drawing.Size(76, 20); + this.numericUpDownRegionStyleFontIdRef.TabIndex = 33; + this.numericUpDownRegionStyleFontIdRef.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleFontIdRef_ValueChanged); + // + // label37 + // + this.label37.AutoSize = true; + this.label37.Location = new System.Drawing.Point(10, 388); + this.label37.Name = "label37"; + this.label37.Size = new System.Drawing.Size(54, 13); + this.label37.TabIndex = 32; + this.label37.Text = "Font id ref"; + // + // numericUpDownRegionStyleLineSpace + // + this.numericUpDownRegionStyleLineSpace.Location = new System.Drawing.Point(143, 360); + this.numericUpDownRegionStyleLineSpace.Maximum = new decimal(new int[] { + 4319, + 0, + 0, + 0}); + this.numericUpDownRegionStyleLineSpace.Name = "numericUpDownRegionStyleLineSpace"; + this.numericUpDownRegionStyleLineSpace.Size = new System.Drawing.Size(76, 20); + this.numericUpDownRegionStyleLineSpace.TabIndex = 31; + this.numericUpDownRegionStyleLineSpace.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleLineSpace_ValueChanged); + // + // label33 + // + this.label33.AutoSize = true; + this.label33.Location = new System.Drawing.Point(10, 362); + this.label33.Name = "label33"; + this.label33.Size = new System.Drawing.Size(59, 13); + this.label33.TabIndex = 30; + this.label33.Text = "Line space"; + // + // numericUpDownRegionStyleTextVerAlign + // + this.numericUpDownRegionStyleTextVerAlign.Location = new System.Drawing.Point(143, 334); + this.numericUpDownRegionStyleTextVerAlign.Maximum = new decimal(new int[] { + 7679, + 0, + 0, + 0}); + this.numericUpDownRegionStyleTextVerAlign.Name = "numericUpDownRegionStyleTextVerAlign"; + this.numericUpDownRegionStyleTextVerAlign.Size = new System.Drawing.Size(76, 20); + this.numericUpDownRegionStyleTextVerAlign.TabIndex = 29; + this.numericUpDownRegionStyleTextVerAlign.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleTextVerAlign_ValueChanged); + // + // label34 + // + this.label34.AutoSize = true; + this.label34.Location = new System.Drawing.Point(10, 336); + this.label34.Name = "label34"; + this.label34.Size = new System.Drawing.Size(113, 13); + this.label34.TabIndex = 28; + this.label34.Text = "Text vertical alignment"; + // + // numericUpDownRegionStyleTextHorAlign + // + this.numericUpDownRegionStyleTextHorAlign.Location = new System.Drawing.Point(143, 308); + this.numericUpDownRegionStyleTextHorAlign.Maximum = new decimal(new int[] { + 4319, + 0, + 0, + 0}); + this.numericUpDownRegionStyleTextHorAlign.Name = "numericUpDownRegionStyleTextHorAlign"; + this.numericUpDownRegionStyleTextHorAlign.Size = new System.Drawing.Size(76, 20); + this.numericUpDownRegionStyleTextHorAlign.TabIndex = 27; + this.numericUpDownRegionStyleTextHorAlign.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleTextHorAlign_ValueChanged); + // + // label35 + // + this.label35.AutoSize = true; + this.label35.Location = new System.Drawing.Point(10, 310); + this.label35.Name = "label35"; + this.label35.Size = new System.Drawing.Size(124, 13); + this.label35.TabIndex = 26; + this.label35.Text = "Text horizontal alignment"; + // + // numericUpDownRegionStyleTextFlow + // + this.numericUpDownRegionStyleTextFlow.Location = new System.Drawing.Point(143, 282); + this.numericUpDownRegionStyleTextFlow.Maximum = new decimal(new int[] { + 7679, + 0, + 0, + 0}); + this.numericUpDownRegionStyleTextFlow.Name = "numericUpDownRegionStyleTextFlow"; + this.numericUpDownRegionStyleTextFlow.Size = new System.Drawing.Size(76, 20); + this.numericUpDownRegionStyleTextFlow.TabIndex = 25; + this.numericUpDownRegionStyleTextFlow.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleTextFlow_ValueChanged); + // + // label36 + // + this.label36.AutoSize = true; + this.label36.Location = new System.Drawing.Point(10, 284); + this.label36.Name = "label36"; + this.label36.Size = new System.Drawing.Size(50, 13); + this.label36.TabIndex = 24; + this.label36.Text = "Text flow"; + // + // numericUpDownRegionStyleTBHeight + // + this.numericUpDownRegionStyleTBHeight.Location = new System.Drawing.Point(143, 256); + this.numericUpDownRegionStyleTBHeight.Maximum = new decimal(new int[] { + 4319, + 0, + 0, + 0}); + this.numericUpDownRegionStyleTBHeight.Name = "numericUpDownRegionStyleTBHeight"; + this.numericUpDownRegionStyleTBHeight.Size = new System.Drawing.Size(76, 20); + this.numericUpDownRegionStyleTBHeight.TabIndex = 23; + this.numericUpDownRegionStyleTBHeight.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleTBHeight_ValueChanged); + // + // label17 + // + this.label17.AutoSize = true; + this.label17.Location = new System.Drawing.Point(10, 258); + this.label17.Name = "label17"; + this.label17.Size = new System.Drawing.Size(80, 13); + this.label17.TabIndex = 22; + this.label17.Text = "Text box height"; + // + // numericUpDownRegionStyleTBWidth + // + this.numericUpDownRegionStyleTBWidth.Location = new System.Drawing.Point(143, 230); + this.numericUpDownRegionStyleTBWidth.Maximum = new decimal(new int[] { + 7679, + 0, + 0, + 0}); + this.numericUpDownRegionStyleTBWidth.Name = "numericUpDownRegionStyleTBWidth"; + this.numericUpDownRegionStyleTBWidth.Size = new System.Drawing.Size(76, 20); + this.numericUpDownRegionStyleTBWidth.TabIndex = 21; + this.numericUpDownRegionStyleTBWidth.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleTBWidth_ValueChanged); + // + // label30 + // + this.label30.AutoSize = true; + this.label30.Location = new System.Drawing.Point(10, 232); + this.label30.Name = "label30"; + this.label30.Size = new System.Drawing.Size(76, 13); + this.label30.TabIndex = 20; + this.label30.Text = "Text box width"; + // + // numericUpDownRegionStyleTBVerPos + // + this.numericUpDownRegionStyleTBVerPos.Location = new System.Drawing.Point(143, 204); + this.numericUpDownRegionStyleTBVerPos.Maximum = new decimal(new int[] { + 4319, + 0, + 0, + 0}); + this.numericUpDownRegionStyleTBVerPos.Name = "numericUpDownRegionStyleTBVerPos"; + this.numericUpDownRegionStyleTBVerPos.Size = new System.Drawing.Size(76, 20); + this.numericUpDownRegionStyleTBVerPos.TabIndex = 19; + this.numericUpDownRegionStyleTBVerPos.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleTBVerPos_ValueChanged); + // + // label31 + // + this.label31.AutoSize = true; + this.label31.Location = new System.Drawing.Point(10, 206); + this.label31.Name = "label31"; + this.label31.Size = new System.Drawing.Size(105, 13); + this.label31.TabIndex = 18; + this.label31.Text = "Text box vertical pos"; + // + // numericUpDownRegionStyleTBHorPos + // + this.numericUpDownRegionStyleTBHorPos.Location = new System.Drawing.Point(143, 178); + this.numericUpDownRegionStyleTBHorPos.Maximum = new decimal(new int[] { + 7679, + 0, + 0, + 0}); + this.numericUpDownRegionStyleTBHorPos.Name = "numericUpDownRegionStyleTBHorPos"; + this.numericUpDownRegionStyleTBHorPos.Size = new System.Drawing.Size(76, 20); + this.numericUpDownRegionStyleTBHorPos.TabIndex = 17; + this.numericUpDownRegionStyleTBHorPos.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleTBHorPos_ValueChanged); + // + // label32 + // + this.label32.AutoSize = true; + this.label32.Location = new System.Drawing.Point(10, 180); + this.label32.Name = "label32"; + this.label32.Size = new System.Drawing.Size(116, 13); + this.label32.TabIndex = 16; + this.label32.Text = "Text box horizontal pos"; + // + // numericUpDownRegionStyleFontSize + // + this.numericUpDownRegionStyleFontSize.Location = new System.Drawing.Point(143, 438); + this.numericUpDownRegionStyleFontSize.Maximum = new decimal(new int[] { + 144, + 0, + 0, + 0}); + this.numericUpDownRegionStyleFontSize.Minimum = new decimal(new int[] { + 8, + 0, + 0, + 0}); + this.numericUpDownRegionStyleFontSize.Name = "numericUpDownRegionStyleFontSize"; + this.numericUpDownRegionStyleFontSize.Size = new System.Drawing.Size(76, 20); + this.numericUpDownRegionStyleFontSize.TabIndex = 15; + this.numericUpDownRegionStyleFontSize.Value = new decimal(new int[] { + 8, + 0, + 0, + 0}); + this.numericUpDownRegionStyleFontSize.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleFontSize_ValueChanged); + // + // label12 + // + this.label12.AutoSize = true; + this.label12.Location = new System.Drawing.Point(10, 440); + this.label12.Name = "label12"; + this.label12.Size = new System.Drawing.Size(49, 13); + this.label12.TabIndex = 14; + this.label12.Text = "Font size"; + // + // numericUpDownRegionStylePaletteEntryId + // + this.numericUpDownRegionStylePaletteEntryId.Location = new System.Drawing.Point(143, 152); + this.numericUpDownRegionStylePaletteEntryId.Maximum = new decimal(new int[] { + 254, + 0, + 0, + 0}); + this.numericUpDownRegionStylePaletteEntryId.Name = "numericUpDownRegionStylePaletteEntryId"; + this.numericUpDownRegionStylePaletteEntryId.Size = new System.Drawing.Size(76, 20); + this.numericUpDownRegionStylePaletteEntryId.TabIndex = 13; + this.numericUpDownRegionStylePaletteEntryId.ValueChanged += new System.EventHandler(this.numericUpDownRegionStylePaletteEntryId_ValueChanged); + // + // label11 + // + this.label11.AutoSize = true; + this.label11.Location = new System.Drawing.Point(10, 154); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size(90, 13); + this.label11.TabIndex = 12; + this.label11.Text = "Bg palette entryId"; + // + // numericUpDownRegionStyleHeight + // + this.numericUpDownRegionStyleHeight.Location = new System.Drawing.Point(143, 126); + this.numericUpDownRegionStyleHeight.Maximum = new decimal(new int[] { + 4319, + 0, + 0, + 0}); + this.numericUpDownRegionStyleHeight.Name = "numericUpDownRegionStyleHeight"; + this.numericUpDownRegionStyleHeight.Size = new System.Drawing.Size(76, 20); + this.numericUpDownRegionStyleHeight.TabIndex = 11; + this.numericUpDownRegionStyleHeight.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleHeight_ValueChanged); + // + // label9 + // + this.label9.AutoSize = true; + this.label9.Location = new System.Drawing.Point(10, 128); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(38, 13); + this.label9.TabIndex = 10; + this.label9.Text = "Height"; + // + // numericUpDownRegionStyleWidth + // + this.numericUpDownRegionStyleWidth.Location = new System.Drawing.Point(143, 100); + this.numericUpDownRegionStyleWidth.Maximum = new decimal(new int[] { + 7679, + 0, + 0, + 0}); + this.numericUpDownRegionStyleWidth.Name = "numericUpDownRegionStyleWidth"; + this.numericUpDownRegionStyleWidth.Size = new System.Drawing.Size(76, 20); + this.numericUpDownRegionStyleWidth.TabIndex = 9; + this.numericUpDownRegionStyleWidth.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleWidth_ValueChanged); + // + // label10 + // + this.label10.AutoSize = true; + this.label10.Location = new System.Drawing.Point(10, 102); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(35, 13); + this.label10.TabIndex = 8; + this.label10.Text = "Width"; + // + // numericUpDownRegionStyleVPos + // + this.numericUpDownRegionStyleVPos.Location = new System.Drawing.Point(143, 74); + this.numericUpDownRegionStyleVPos.Maximum = new decimal(new int[] { + 4319, + 0, + 0, + 0}); + this.numericUpDownRegionStyleVPos.Name = "numericUpDownRegionStyleVPos"; + this.numericUpDownRegionStyleVPos.Size = new System.Drawing.Size(76, 20); + this.numericUpDownRegionStyleVPos.TabIndex = 7; + this.numericUpDownRegionStyleVPos.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleVPos_ValueChanged); + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Location = new System.Drawing.Point(10, 76); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(81, 13); + this.label8.TabIndex = 6; + this.label8.Text = "Vertical position"; + // + // numericUpDownRegionStyleHPos + // + this.numericUpDownRegionStyleHPos.Location = new System.Drawing.Point(143, 48); + this.numericUpDownRegionStyleHPos.Maximum = new decimal(new int[] { + 7679, + 0, + 0, + 0}); + this.numericUpDownRegionStyleHPos.Name = "numericUpDownRegionStyleHPos"; + this.numericUpDownRegionStyleHPos.Size = new System.Drawing.Size(76, 20); + this.numericUpDownRegionStyleHPos.TabIndex = 5; + this.numericUpDownRegionStyleHPos.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleHPos_ValueChanged); + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(10, 50); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(93, 13); + this.label7.TabIndex = 4; + this.label7.Text = "Horizontal position"; + // + // numericUpDownRegionStyleId + // + this.numericUpDownRegionStyleId.Location = new System.Drawing.Point(143, 22); + this.numericUpDownRegionStyleId.Maximum = new decimal(new int[] { + 59, + 0, + 0, + 0}); + this.numericUpDownRegionStyleId.Name = "numericUpDownRegionStyleId"; + this.numericUpDownRegionStyleId.Size = new System.Drawing.Size(76, 20); + this.numericUpDownRegionStyleId.TabIndex = 3; + this.numericUpDownRegionStyleId.ValueChanged += new System.EventHandler(this.numericUpDownRegionStyleId_ValueChanged); + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(10, 24); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(39, 13); + this.label6.TabIndex = 2; + this.label6.Text = "StyleId"; + // + // groupBoxPropertiesPalette + // + this.groupBoxPropertiesPalette.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxPropertiesPalette.Controls.Add(this.label47); + this.groupBoxPropertiesPalette.Controls.Add(this.panelPaletteColor); + this.groupBoxPropertiesPalette.Controls.Add(this.buttonColor); + this.groupBoxPropertiesPalette.Controls.Add(this.numericUpDownPaletteOpacity); + this.groupBoxPropertiesPalette.Controls.Add(this.label5); + this.groupBoxPropertiesPalette.Controls.Add(this.numericUpDownPaletteCb); + this.groupBoxPropertiesPalette.Controls.Add(this.label4); + this.groupBoxPropertiesPalette.Controls.Add(this.numericUpDownPaletteCr); + this.groupBoxPropertiesPalette.Controls.Add(this.label3); + this.groupBoxPropertiesPalette.Controls.Add(this.numericUpDownPaletteY); + this.groupBoxPropertiesPalette.Controls.Add(this.label2); + this.groupBoxPropertiesPalette.Controls.Add(this.numericUpDownPaletteEntry); + this.groupBoxPropertiesPalette.Controls.Add(this.label1); + this.groupBoxPropertiesPalette.Location = new System.Drawing.Point(231, 3); + this.groupBoxPropertiesPalette.Name = "groupBoxPropertiesPalette"; + this.groupBoxPropertiesPalette.Size = new System.Drawing.Size(261, 211); + this.groupBoxPropertiesPalette.TabIndex = 9; + this.groupBoxPropertiesPalette.TabStop = false; + this.groupBoxPropertiesPalette.Text = "Properties: Region palette"; + this.groupBoxPropertiesPalette.Visible = false; + // + // label47 + // + this.label47.AutoSize = true; + this.label47.Location = new System.Drawing.Point(164, 133); + this.label47.Name = "label47"; + this.label47.Size = new System.Drawing.Size(137, 13); + this.label47.TabIndex = 15; + this.label47.Text = "0 is transparent, 255 is solid"; + // + // panelPaletteColor + // + this.panelPaletteColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelPaletteColor.Location = new System.Drawing.Point(137, 174); + this.panelPaletteColor.Name = "panelPaletteColor"; + this.panelPaletteColor.Size = new System.Drawing.Size(21, 20); + this.panelPaletteColor.TabIndex = 14; + // + // buttonColor + // + this.buttonColor.Location = new System.Drawing.Point(10, 173); + this.buttonColor.Name = "buttonColor"; + this.buttonColor.Size = new System.Drawing.Size(121, 21); + this.buttonColor.TabIndex = 13; + this.buttonColor.Text = "Pick color"; + this.buttonColor.UseVisualStyleBackColor = true; + this.buttonColor.Click += new System.EventHandler(this.buttonColor_Click); + // + // numericUpDownPaletteOpacity + // + this.numericUpDownPaletteOpacity.Location = new System.Drawing.Point(82, 131); + this.numericUpDownPaletteOpacity.Maximum = new decimal(new int[] { + 255, + 0, + 0, + 0}); + this.numericUpDownPaletteOpacity.Name = "numericUpDownPaletteOpacity"; + this.numericUpDownPaletteOpacity.Size = new System.Drawing.Size(76, 20); + this.numericUpDownPaletteOpacity.TabIndex = 9; + this.numericUpDownPaletteOpacity.ValueChanged += new System.EventHandler(this.numericUpDownPaletteOpacity_ValueChanged); + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(7, 133); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(43, 13); + this.label5.TabIndex = 8; + this.label5.Text = "Opacity"; + // + // numericUpDownPaletteCb + // + this.numericUpDownPaletteCb.Location = new System.Drawing.Point(82, 105); + this.numericUpDownPaletteCb.Maximum = new decimal(new int[] { + 240, + 0, + 0, + 0}); + this.numericUpDownPaletteCb.Name = "numericUpDownPaletteCb"; + this.numericUpDownPaletteCb.Size = new System.Drawing.Size(76, 20); + this.numericUpDownPaletteCb.TabIndex = 7; + this.numericUpDownPaletteCb.ValueChanged += new System.EventHandler(this.numericUpDownPaletteCb_ValueChanged); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(7, 107); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(20, 13); + this.label4.TabIndex = 6; + this.label4.Text = "Cb"; + // + // numericUpDownPaletteCr + // + this.numericUpDownPaletteCr.Location = new System.Drawing.Point(82, 79); + this.numericUpDownPaletteCr.Maximum = new decimal(new int[] { + 240, + 0, + 0, + 0}); + this.numericUpDownPaletteCr.Minimum = new decimal(new int[] { + 16, + 0, + 0, + 0}); + this.numericUpDownPaletteCr.Name = "numericUpDownPaletteCr"; + this.numericUpDownPaletteCr.Size = new System.Drawing.Size(76, 20); + this.numericUpDownPaletteCr.TabIndex = 5; + this.numericUpDownPaletteCr.Value = new decimal(new int[] { + 16, + 0, + 0, + 0}); + this.numericUpDownPaletteCr.ValueChanged += new System.EventHandler(this.numericUpDownPaletteCr_ValueChanged); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(7, 81); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(17, 13); + this.label3.TabIndex = 4; + this.label3.Text = "Cr"; + // + // numericUpDownPaletteY + // + this.numericUpDownPaletteY.Location = new System.Drawing.Point(82, 53); + this.numericUpDownPaletteY.Maximum = new decimal(new int[] { + 235, + 0, + 0, + 0}); + this.numericUpDownPaletteY.Minimum = new decimal(new int[] { + 16, + 0, + 0, + 0}); + this.numericUpDownPaletteY.Name = "numericUpDownPaletteY"; + this.numericUpDownPaletteY.Size = new System.Drawing.Size(76, 20); + this.numericUpDownPaletteY.TabIndex = 3; + this.numericUpDownPaletteY.Value = new decimal(new int[] { + 16, + 0, + 0, + 0}); + this.numericUpDownPaletteY.ValueChanged += new System.EventHandler(this.numericUpDownPaletteY_ValueChanged); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(7, 55); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(14, 13); + this.label2.TabIndex = 2; + this.label2.Text = "Y"; + // + // numericUpDownPaletteEntry + // + this.numericUpDownPaletteEntry.Location = new System.Drawing.Point(82, 27); + this.numericUpDownPaletteEntry.Maximum = new decimal(new int[] { + 254, + 0, + 0, + 0}); + this.numericUpDownPaletteEntry.Name = "numericUpDownPaletteEntry"; + this.numericUpDownPaletteEntry.Size = new System.Drawing.Size(76, 20); + this.numericUpDownPaletteEntry.TabIndex = 1; + this.numericUpDownPaletteEntry.ValueChanged += new System.EventHandler(this.numericUpDownPaletteEntry_ValueChanged); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(7, 29); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(40, 13); + this.label1.TabIndex = 0; + this.label1.Text = "EntryId"; + // + // groupBoxPropertiesUserStyle + // + this.groupBoxPropertiesUserStyle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxPropertiesUserStyle.Controls.Add(this.numericUpDownUserStyleLineSpaceDelta); + this.groupBoxPropertiesUserStyle.Controls.Add(this.label28); + this.groupBoxPropertiesUserStyle.Controls.Add(this.numericUpDownUserStyleLineSpaceIncDec); + this.groupBoxPropertiesUserStyle.Controls.Add(this.label29); + this.groupBoxPropertiesUserStyle.Controls.Add(this.numericUpDownUserStyleTBHeightDelta); + this.groupBoxPropertiesUserStyle.Controls.Add(this.label27); + this.groupBoxPropertiesUserStyle.Controls.Add(this.numericUpDownUserStyleTBHeightIncDec); + this.groupBoxPropertiesUserStyle.Controls.Add(this.label25); + this.groupBoxPropertiesUserStyle.Controls.Add(this.numericUpDownUserStyleTBWidthDelta); + this.groupBoxPropertiesUserStyle.Controls.Add(this.label26); + this.groupBoxPropertiesUserStyle.Controls.Add(this.numericUpDownUserStyleTBWidthIncDec); + this.groupBoxPropertiesUserStyle.Controls.Add(this.label19); + this.groupBoxPropertiesUserStyle.Controls.Add(this.numericUpDownUserStyleTBVerPosDelta); + this.groupBoxPropertiesUserStyle.Controls.Add(this.label20); + this.groupBoxPropertiesUserStyle.Controls.Add(this.numericUpDownUserStyleTBVerPosDir); + this.groupBoxPropertiesUserStyle.Controls.Add(this.label21); + this.groupBoxPropertiesUserStyle.Controls.Add(this.numericUpDownUserStyleTBHorPosDelta); + this.groupBoxPropertiesUserStyle.Controls.Add(this.label22); + this.groupBoxPropertiesUserStyle.Controls.Add(this.numericUpDownUserStyleTBHorPosDir); + this.groupBoxPropertiesUserStyle.Controls.Add(this.label23); + this.groupBoxPropertiesUserStyle.Controls.Add(this.numericUpDownUserStyleFontSizeDelta); + this.groupBoxPropertiesUserStyle.Controls.Add(this.label24); + this.groupBoxPropertiesUserStyle.Controls.Add(this.numericUpDownUserStyleFontSizeIncDec); + this.groupBoxPropertiesUserStyle.Controls.Add(this.label13); + this.groupBoxPropertiesUserStyle.Controls.Add(this.numericUpDownUserStyleVerPosDelta); + this.groupBoxPropertiesUserStyle.Controls.Add(this.label14); + this.groupBoxPropertiesUserStyle.Controls.Add(this.numericUpDownUserStyleVerPosDir); + this.groupBoxPropertiesUserStyle.Controls.Add(this.label15); + this.groupBoxPropertiesUserStyle.Controls.Add(this.numericUpDownUserStyleHorPosDelta); + this.groupBoxPropertiesUserStyle.Controls.Add(this.label16); + this.groupBoxPropertiesUserStyle.Controls.Add(this.numericUpDownUserStyleHorPosDir); + this.groupBoxPropertiesUserStyle.Controls.Add(this.labelUserStyleHorPosDir); + this.groupBoxPropertiesUserStyle.Controls.Add(this.numericUpDownUserStyleId); + this.groupBoxPropertiesUserStyle.Controls.Add(this.label18); + this.groupBoxPropertiesUserStyle.Location = new System.Drawing.Point(416, 12); + this.groupBoxPropertiesUserStyle.Name = "groupBoxPropertiesUserStyle"; + this.groupBoxPropertiesUserStyle.Size = new System.Drawing.Size(264, 505); + this.groupBoxPropertiesUserStyle.TabIndex = 10; + this.groupBoxPropertiesUserStyle.TabStop = false; + this.groupBoxPropertiesUserStyle.Text = "Properties: User style"; + this.groupBoxPropertiesUserStyle.Visible = false; + // + // numericUpDownUserStyleLineSpaceDelta + // + this.numericUpDownUserStyleLineSpaceDelta.Location = new System.Drawing.Point(184, 438); + this.numericUpDownUserStyleLineSpaceDelta.Maximum = new decimal(new int[] { + 4319, + 0, + 0, + 0}); + this.numericUpDownUserStyleLineSpaceDelta.Name = "numericUpDownUserStyleLineSpaceDelta"; + this.numericUpDownUserStyleLineSpaceDelta.Size = new System.Drawing.Size(76, 20); + this.numericUpDownUserStyleLineSpaceDelta.TabIndex = 47; + this.numericUpDownUserStyleLineSpaceDelta.ValueChanged += new System.EventHandler(this.numericUpDownUserStyleLineSpaceDelta_ValueChanged); + // + // label28 + // + this.label28.AutoSize = true; + this.label28.Location = new System.Drawing.Point(11, 440); + this.label28.Name = "label28"; + this.label28.Size = new System.Drawing.Size(85, 13); + this.label28.TabIndex = 46; + this.label28.Text = "Line space delta"; + // + // numericUpDownUserStyleLineSpaceIncDec + // + this.numericUpDownUserStyleLineSpaceIncDec.Location = new System.Drawing.Point(184, 412); + this.numericUpDownUserStyleLineSpaceIncDec.Maximum = new decimal(new int[] { + 254, + 0, + 0, + 0}); + this.numericUpDownUserStyleLineSpaceIncDec.Name = "numericUpDownUserStyleLineSpaceIncDec"; + this.numericUpDownUserStyleLineSpaceIncDec.Size = new System.Drawing.Size(76, 20); + this.numericUpDownUserStyleLineSpaceIncDec.TabIndex = 45; + this.numericUpDownUserStyleLineSpaceIncDec.ValueChanged += new System.EventHandler(this.numericUpDownUserStyleLineSpaceIncDec_ValueChanged); + // + // label29 + // + this.label29.AutoSize = true; + this.label29.Location = new System.Drawing.Point(11, 414); + this.label29.Name = "label29"; + this.label29.Size = new System.Drawing.Size(151, 13); + this.label29.TabIndex = 44; + this.label29.Text = "Line space increase/decrease"; + // + // numericUpDownUserStyleTBHeightDelta + // + this.numericUpDownUserStyleTBHeightDelta.Location = new System.Drawing.Point(184, 386); + this.numericUpDownUserStyleTBHeightDelta.Maximum = new decimal(new int[] { + 4319, + 0, + 0, + 0}); + this.numericUpDownUserStyleTBHeightDelta.Name = "numericUpDownUserStyleTBHeightDelta"; + this.numericUpDownUserStyleTBHeightDelta.Size = new System.Drawing.Size(76, 20); + this.numericUpDownUserStyleTBHeightDelta.TabIndex = 43; + this.numericUpDownUserStyleTBHeightDelta.ValueChanged += new System.EventHandler(this.numericUpDownUserStyleTBHeightDelta_ValueChanged); + // + // label27 + // + this.label27.AutoSize = true; + this.label27.Location = new System.Drawing.Point(11, 388); + this.label27.Name = "label27"; + this.label27.Size = new System.Drawing.Size(106, 13); + this.label27.TabIndex = 42; + this.label27.Text = "Text box height delta"; + // + // numericUpDownUserStyleTBHeightIncDec + // + this.numericUpDownUserStyleTBHeightIncDec.Location = new System.Drawing.Point(184, 360); + this.numericUpDownUserStyleTBHeightIncDec.Maximum = new decimal(new int[] { + 254, + 0, + 0, + 0}); + this.numericUpDownUserStyleTBHeightIncDec.Name = "numericUpDownUserStyleTBHeightIncDec"; + this.numericUpDownUserStyleTBHeightIncDec.Size = new System.Drawing.Size(76, 20); + this.numericUpDownUserStyleTBHeightIncDec.TabIndex = 41; + this.numericUpDownUserStyleTBHeightIncDec.ValueChanged += new System.EventHandler(this.numericUpDownUserStyleTBHeightIncDec_ValueChanged); + // + // label25 + // + this.label25.AutoSize = true; + this.label25.Location = new System.Drawing.Point(11, 362); + this.label25.Name = "label25"; + this.label25.Size = new System.Drawing.Size(172, 13); + this.label25.TabIndex = 40; + this.label25.Text = "Text box height increase/decrease"; + // + // numericUpDownUserStyleTBWidthDelta + // + this.numericUpDownUserStyleTBWidthDelta.Location = new System.Drawing.Point(184, 334); + this.numericUpDownUserStyleTBWidthDelta.Maximum = new decimal(new int[] { + 4319, + 0, + 0, + 0}); + this.numericUpDownUserStyleTBWidthDelta.Name = "numericUpDownUserStyleTBWidthDelta"; + this.numericUpDownUserStyleTBWidthDelta.Size = new System.Drawing.Size(76, 20); + this.numericUpDownUserStyleTBWidthDelta.TabIndex = 39; + this.numericUpDownUserStyleTBWidthDelta.ValueChanged += new System.EventHandler(this.numericUpDownUserStyleTBWidthDelta_ValueChanged); + // + // label26 + // + this.label26.AutoSize = true; + this.label26.Location = new System.Drawing.Point(11, 336); + this.label26.Name = "label26"; + this.label26.Size = new System.Drawing.Size(102, 13); + this.label26.TabIndex = 38; + this.label26.Text = "Text box width delta"; + // + // numericUpDownUserStyleTBWidthIncDec + // + this.numericUpDownUserStyleTBWidthIncDec.Location = new System.Drawing.Point(184, 308); + this.numericUpDownUserStyleTBWidthIncDec.Maximum = new decimal(new int[] { + 254, + 0, + 0, + 0}); + this.numericUpDownUserStyleTBWidthIncDec.Name = "numericUpDownUserStyleTBWidthIncDec"; + this.numericUpDownUserStyleTBWidthIncDec.Size = new System.Drawing.Size(76, 20); + this.numericUpDownUserStyleTBWidthIncDec.TabIndex = 37; + this.numericUpDownUserStyleTBWidthIncDec.ValueChanged += new System.EventHandler(this.numericUpDownUserStyleTBWidthIncDec_ValueChanged); + // + // label19 + // + this.label19.AutoSize = true; + this.label19.Location = new System.Drawing.Point(11, 310); + this.label19.Name = "label19"; + this.label19.Size = new System.Drawing.Size(168, 13); + this.label19.TabIndex = 36; + this.label19.Text = "Text box width increase/decrease"; + // + // numericUpDownUserStyleTBVerPosDelta + // + this.numericUpDownUserStyleTBVerPosDelta.Location = new System.Drawing.Point(184, 282); + this.numericUpDownUserStyleTBVerPosDelta.Maximum = new decimal(new int[] { + 4319, + 0, + 0, + 0}); + this.numericUpDownUserStyleTBVerPosDelta.Name = "numericUpDownUserStyleTBVerPosDelta"; + this.numericUpDownUserStyleTBVerPosDelta.Size = new System.Drawing.Size(76, 20); + this.numericUpDownUserStyleTBVerPosDelta.TabIndex = 35; + this.numericUpDownUserStyleTBVerPosDelta.ValueChanged += new System.EventHandler(this.numericUpDownUserStyleTBVerPosDelta_ValueChanged); + // + // label20 + // + this.label20.AutoSize = true; + this.label20.Location = new System.Drawing.Point(11, 284); + this.label20.Name = "label20"; + this.label20.Size = new System.Drawing.Size(131, 13); + this.label20.TabIndex = 34; + this.label20.Text = "Text box vertical pos delta"; + // + // numericUpDownUserStyleTBVerPosDir + // + this.numericUpDownUserStyleTBVerPosDir.Location = new System.Drawing.Point(184, 256); + this.numericUpDownUserStyleTBVerPosDir.Maximum = new decimal(new int[] { + 7679, + 0, + 0, + 0}); + this.numericUpDownUserStyleTBVerPosDir.Name = "numericUpDownUserStyleTBVerPosDir"; + this.numericUpDownUserStyleTBVerPosDir.Size = new System.Drawing.Size(76, 20); + this.numericUpDownUserStyleTBVerPosDir.TabIndex = 33; + this.numericUpDownUserStyleTBVerPosDir.ValueChanged += new System.EventHandler(this.numericUpDownUserStyleTBVerPosDir_ValueChanged); + // + // label21 + // + this.label21.AutoSize = true; + this.label21.Location = new System.Drawing.Point(11, 258); + this.label21.Name = "label21"; + this.label21.Size = new System.Drawing.Size(148, 13); + this.label21.TabIndex = 32; + this.label21.Text = "Text box vertical pos direction"; + // + // numericUpDownUserStyleTBHorPosDelta + // + this.numericUpDownUserStyleTBHorPosDelta.Location = new System.Drawing.Point(184, 230); + this.numericUpDownUserStyleTBHorPosDelta.Maximum = new decimal(new int[] { + 4319, + 0, + 0, + 0}); + this.numericUpDownUserStyleTBHorPosDelta.Name = "numericUpDownUserStyleTBHorPosDelta"; + this.numericUpDownUserStyleTBHorPosDelta.Size = new System.Drawing.Size(76, 20); + this.numericUpDownUserStyleTBHorPosDelta.TabIndex = 31; + this.numericUpDownUserStyleTBHorPosDelta.ValueChanged += new System.EventHandler(this.numericUpDownUserStyleTBHorPosDelta_ValueChanged); + // + // label22 + // + this.label22.AutoSize = true; + this.label22.Location = new System.Drawing.Point(11, 232); + this.label22.Name = "label22"; + this.label22.Size = new System.Drawing.Size(142, 13); + this.label22.TabIndex = 30; + this.label22.Text = "Text box horizontal pos delta"; + // + // numericUpDownUserStyleTBHorPosDir + // + this.numericUpDownUserStyleTBHorPosDir.Location = new System.Drawing.Point(184, 204); + this.numericUpDownUserStyleTBHorPosDir.Maximum = new decimal(new int[] { + 7679, + 0, + 0, + 0}); + this.numericUpDownUserStyleTBHorPosDir.Name = "numericUpDownUserStyleTBHorPosDir"; + this.numericUpDownUserStyleTBHorPosDir.Size = new System.Drawing.Size(76, 20); + this.numericUpDownUserStyleTBHorPosDir.TabIndex = 29; + this.numericUpDownUserStyleTBHorPosDir.ValueChanged += new System.EventHandler(this.numericUpDownUserStyleTBHorPosDir_ValueChanged); + // + // label23 + // + this.label23.AutoSize = true; + this.label23.Location = new System.Drawing.Point(11, 206); + this.label23.Name = "label23"; + this.label23.Size = new System.Drawing.Size(159, 13); + this.label23.TabIndex = 28; + this.label23.Text = "Text box horizontal pos direction"; + // + // numericUpDownUserStyleFontSizeDelta + // + this.numericUpDownUserStyleFontSizeDelta.Location = new System.Drawing.Point(184, 178); + this.numericUpDownUserStyleFontSizeDelta.Maximum = new decimal(new int[] { + 59, + 0, + 0, + 0}); + this.numericUpDownUserStyleFontSizeDelta.Name = "numericUpDownUserStyleFontSizeDelta"; + this.numericUpDownUserStyleFontSizeDelta.Size = new System.Drawing.Size(76, 20); + this.numericUpDownUserStyleFontSizeDelta.TabIndex = 27; + this.numericUpDownUserStyleFontSizeDelta.ValueChanged += new System.EventHandler(this.numericUpDownUserStyleFontSizeDelta_ValueChanged); + // + // label24 + // + this.label24.AutoSize = true; + this.label24.Location = new System.Drawing.Point(11, 180); + this.label24.Name = "label24"; + this.label24.Size = new System.Drawing.Size(75, 13); + this.label24.TabIndex = 26; + this.label24.Text = "Font size delta"; + // + // numericUpDownUserStyleFontSizeIncDec + // + this.numericUpDownUserStyleFontSizeIncDec.Location = new System.Drawing.Point(184, 152); + this.numericUpDownUserStyleFontSizeIncDec.Maximum = new decimal(new int[] { + 254, + 0, + 0, + 0}); + this.numericUpDownUserStyleFontSizeIncDec.Name = "numericUpDownUserStyleFontSizeIncDec"; + this.numericUpDownUserStyleFontSizeIncDec.Size = new System.Drawing.Size(76, 20); + this.numericUpDownUserStyleFontSizeIncDec.TabIndex = 25; + this.numericUpDownUserStyleFontSizeIncDec.ValueChanged += new System.EventHandler(this.numericUpDownUserStyleFontSizeIncDec_ValueChanged); + // + // label13 + // + this.label13.AutoSize = true; + this.label13.Location = new System.Drawing.Point(11, 154); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(141, 13); + this.label13.TabIndex = 24; + this.label13.Text = "Font size increase/decrease"; + // + // numericUpDownUserStyleVerPosDelta + // + this.numericUpDownUserStyleVerPosDelta.Location = new System.Drawing.Point(184, 126); + this.numericUpDownUserStyleVerPosDelta.Maximum = new decimal(new int[] { + 4319, + 0, + 0, + 0}); + this.numericUpDownUserStyleVerPosDelta.Name = "numericUpDownUserStyleVerPosDelta"; + this.numericUpDownUserStyleVerPosDelta.Size = new System.Drawing.Size(76, 20); + this.numericUpDownUserStyleVerPosDelta.TabIndex = 23; + this.numericUpDownUserStyleVerPosDelta.ValueChanged += new System.EventHandler(this.numericUpDownUserStyleVerPosDelta_ValueChanged); + // + // label14 + // + this.label14.AutoSize = true; + this.label14.Location = new System.Drawing.Point(11, 128); + this.label14.Name = "label14"; + this.label14.Size = new System.Drawing.Size(107, 13); + this.label14.TabIndex = 22; + this.label14.Text = "Vertical position delta"; + // + // numericUpDownUserStyleVerPosDir + // + this.numericUpDownUserStyleVerPosDir.Location = new System.Drawing.Point(184, 100); + this.numericUpDownUserStyleVerPosDir.Maximum = new decimal(new int[] { + 7679, + 0, + 0, + 0}); + this.numericUpDownUserStyleVerPosDir.Name = "numericUpDownUserStyleVerPosDir"; + this.numericUpDownUserStyleVerPosDir.Size = new System.Drawing.Size(76, 20); + this.numericUpDownUserStyleVerPosDir.TabIndex = 21; + this.numericUpDownUserStyleVerPosDir.ValueChanged += new System.EventHandler(this.numericUpDownUserStyleVerPosDir_ValueChanged); + // + // label15 + // + this.label15.AutoSize = true; + this.label15.Location = new System.Drawing.Point(11, 102); + this.label15.Name = "label15"; + this.label15.Size = new System.Drawing.Size(124, 13); + this.label15.TabIndex = 20; + this.label15.Text = "Vertical position direction"; + // + // numericUpDownUserStyleHorPosDelta + // + this.numericUpDownUserStyleHorPosDelta.Location = new System.Drawing.Point(184, 74); + this.numericUpDownUserStyleHorPosDelta.Maximum = new decimal(new int[] { + 4319, + 0, + 0, + 0}); + this.numericUpDownUserStyleHorPosDelta.Name = "numericUpDownUserStyleHorPosDelta"; + this.numericUpDownUserStyleHorPosDelta.Size = new System.Drawing.Size(76, 20); + this.numericUpDownUserStyleHorPosDelta.TabIndex = 19; + this.numericUpDownUserStyleHorPosDelta.ValueChanged += new System.EventHandler(this.numericUpDownUserStyleHorPosDelta_ValueChanged); + // + // label16 + // + this.label16.AutoSize = true; + this.label16.Location = new System.Drawing.Point(11, 76); + this.label16.Name = "label16"; + this.label16.Size = new System.Drawing.Size(119, 13); + this.label16.TabIndex = 18; + this.label16.Text = "Horizontal position delta"; + // + // numericUpDownUserStyleHorPosDir + // + this.numericUpDownUserStyleHorPosDir.Location = new System.Drawing.Point(184, 48); + this.numericUpDownUserStyleHorPosDir.Maximum = new decimal(new int[] { + 7679, + 0, + 0, + 0}); + this.numericUpDownUserStyleHorPosDir.Name = "numericUpDownUserStyleHorPosDir"; + this.numericUpDownUserStyleHorPosDir.Size = new System.Drawing.Size(76, 20); + this.numericUpDownUserStyleHorPosDir.TabIndex = 17; + this.numericUpDownUserStyleHorPosDir.ValueChanged += new System.EventHandler(this.numericUpDownUserStyleHorPosDir_ValueChanged); + // + // labelUserStyleHorPosDir + // + this.labelUserStyleHorPosDir.AutoSize = true; + this.labelUserStyleHorPosDir.Location = new System.Drawing.Point(11, 50); + this.labelUserStyleHorPosDir.Name = "labelUserStyleHorPosDir"; + this.labelUserStyleHorPosDir.Size = new System.Drawing.Size(136, 13); + this.labelUserStyleHorPosDir.TabIndex = 16; + this.labelUserStyleHorPosDir.Text = "Horizontal position direction"; + // + // numericUpDownUserStyleId + // + this.numericUpDownUserStyleId.Location = new System.Drawing.Point(184, 22); + this.numericUpDownUserStyleId.Maximum = new decimal(new int[] { + 59, + 0, + 0, + 0}); + this.numericUpDownUserStyleId.Name = "numericUpDownUserStyleId"; + this.numericUpDownUserStyleId.Size = new System.Drawing.Size(76, 20); + this.numericUpDownUserStyleId.TabIndex = 15; + this.numericUpDownUserStyleId.ValueChanged += new System.EventHandler(this.numericUpDownUserStyleId_ValueChanged); + // + // label18 + // + this.label18.AutoSize = true; + this.label18.Location = new System.Drawing.Point(11, 24); + this.label18.Name = "label18"; + this.label18.Size = new System.Drawing.Size(39, 13); + this.label18.TabIndex = 14; + this.label18.Text = "StyleId"; + // + // buttonSaveAsM2ts + // + this.buttonSaveAsM2ts.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonSaveAsM2ts.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonSaveAsM2ts.Location = new System.Drawing.Point(478, 577); + this.buttonSaveAsM2ts.Name = "buttonSaveAsM2ts"; + this.buttonSaveAsM2ts.Size = new System.Drawing.Size(149, 23); + this.buttonSaveAsM2ts.TabIndex = 113; + this.buttonSaveAsM2ts.Text = "Write as M2TS packets..."; + this.buttonSaveAsM2ts.UseVisualStyleBackColor = true; + this.buttonSaveAsM2ts.Visible = false; + this.buttonSaveAsM2ts.Click += new System.EventHandler(this.buttonSaveAsM2ts_Click); + // + // groupBoxPresentationSegmentRegion + // + this.groupBoxPresentationSegmentRegion.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxPresentationSegmentRegion.Controls.Add(this.numericUpDownSubRegionStyleIdRef); + this.groupBoxPresentationSegmentRegion.Controls.Add(this.label40); + this.groupBoxPresentationSegmentRegion.Controls.Add(this.checkBoxSubRegionForced); + this.groupBoxPresentationSegmentRegion.Controls.Add(this.checkBoxSubRegionContinuous); + this.groupBoxPresentationSegmentRegion.Location = new System.Drawing.Point(404, 4); + this.groupBoxPresentationSegmentRegion.Name = "groupBoxPresentationSegmentRegion"; + this.groupBoxPresentationSegmentRegion.Size = new System.Drawing.Size(213, 129); + this.groupBoxPresentationSegmentRegion.TabIndex = 15; + this.groupBoxPresentationSegmentRegion.TabStop = false; + this.groupBoxPresentationSegmentRegion.Text = "Properties: Subtitle region"; + this.groupBoxPresentationSegmentRegion.Visible = false; + // + // numericUpDownSubRegionStyleIdRef + // + this.numericUpDownSubRegionStyleIdRef.Location = new System.Drawing.Point(106, 74); + this.numericUpDownSubRegionStyleIdRef.Maximum = new decimal(new int[] { + 4319, + 0, + 0, + 0}); + this.numericUpDownSubRegionStyleIdRef.Name = "numericUpDownSubRegionStyleIdRef"; + this.numericUpDownSubRegionStyleIdRef.Size = new System.Drawing.Size(76, 20); + this.numericUpDownSubRegionStyleIdRef.TabIndex = 35; + this.numericUpDownSubRegionStyleIdRef.ValueChanged += new System.EventHandler(this.numericUpDownSubRegionStyleIdRef_ValueChanged); + // + // label40 + // + this.label40.AutoSize = true; + this.label40.Location = new System.Drawing.Point(8, 76); + this.label40.Name = "label40"; + this.label40.Size = new System.Drawing.Size(91, 13); + this.label40.TabIndex = 34; + this.label40.Text = "Region style id ref"; + // + // checkBoxSubRegionForced + // + this.checkBoxSubRegionForced.AutoSize = true; + this.checkBoxSubRegionForced.Location = new System.Drawing.Point(106, 50); + this.checkBoxSubRegionForced.Name = "checkBoxSubRegionForced"; + this.checkBoxSubRegionForced.Size = new System.Drawing.Size(59, 17); + this.checkBoxSubRegionForced.TabIndex = 11; + this.checkBoxSubRegionForced.Text = "Forced"; + this.checkBoxSubRegionForced.UseVisualStyleBackColor = true; + this.checkBoxSubRegionForced.CheckedChanged += new System.EventHandler(this.checkBoxSubRegionForced_CheckedChanged); + // + // checkBoxSubRegionContinuous + // + this.checkBoxSubRegionContinuous.AutoSize = true; + this.checkBoxSubRegionContinuous.Location = new System.Drawing.Point(106, 27); + this.checkBoxSubRegionContinuous.Name = "checkBoxSubRegionContinuous"; + this.checkBoxSubRegionContinuous.Size = new System.Drawing.Size(126, 17); + this.checkBoxSubRegionContinuous.TabIndex = 10; + this.checkBoxSubRegionContinuous.Text = "Continuous from prev"; + this.checkBoxSubRegionContinuous.UseVisualStyleBackColor = true; + this.checkBoxSubRegionContinuous.CheckedChanged += new System.EventHandler(this.checkBoxSubRegionContinuous_CheckedChanged); + // + // contextMenuStripAddPalette + // + this.contextMenuStripAddPalette.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.addPaletteToolStripMenuItem}); + this.contextMenuStripAddPalette.Name = "contextMenuStripAddPalette"; + this.contextMenuStripAddPalette.Size = new System.Drawing.Size(136, 26); + // + // addPaletteToolStripMenuItem + // + this.addPaletteToolStripMenuItem.Name = "addPaletteToolStripMenuItem"; + this.addPaletteToolStripMenuItem.Size = new System.Drawing.Size(135, 22); + this.addPaletteToolStripMenuItem.Text = "Add palette"; + this.addPaletteToolStripMenuItem.Click += new System.EventHandler(this.addPaletteToolStripMenuItem_Click); + // + // groupBoxFontStyle + // + this.groupBoxFontStyle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxFontStyle.Controls.Add(this.label43); + this.groupBoxFontStyle.Controls.Add(this.label42); + this.groupBoxFontStyle.Controls.Add(this.comboBoxChangeFontStyleOutlineThickness); + this.groupBoxFontStyle.Controls.Add(this.comboBoxChangeFontStyleFontStyle); + this.groupBoxFontStyle.Controls.Add(this.numericUpDownChangeFontStyleOutlinePaletteId); + this.groupBoxFontStyle.Controls.Add(this.label41); + this.groupBoxFontStyle.Location = new System.Drawing.Point(16, 471); + this.groupBoxFontStyle.Name = "groupBoxFontStyle"; + this.groupBoxFontStyle.Size = new System.Drawing.Size(230, 133); + this.groupBoxFontStyle.TabIndex = 36; + this.groupBoxFontStyle.TabStop = false; + this.groupBoxFontStyle.Text = "Properties: Subtitle font style"; + this.groupBoxFontStyle.Visible = false; + // + // label43 + // + this.label43.AutoSize = true; + this.label43.Location = new System.Drawing.Point(6, 79); + this.label43.Name = "label43"; + this.label43.Size = new System.Drawing.Size(110, 13); + this.label43.TabIndex = 39; + this.label43.Text = "Font outline thickness"; + // + // label42 + // + this.label42.AutoSize = true; + this.label42.Location = new System.Drawing.Point(6, 26); + this.label42.Name = "label42"; + this.label42.Size = new System.Drawing.Size(52, 13); + this.label42.TabIndex = 38; + this.label42.Text = "Font style"; + // + // comboBoxChangeFontStyleOutlineThickness + // + this.comboBoxChangeFontStyleOutlineThickness.FormattingEnabled = true; + this.comboBoxChangeFontStyleOutlineThickness.Items.AddRange(new object[] { + "Thin border", + "Medium border", + "Thick border"}); + this.comboBoxChangeFontStyleOutlineThickness.Location = new System.Drawing.Point(129, 76); + this.comboBoxChangeFontStyleOutlineThickness.Name = "comboBoxChangeFontStyleOutlineThickness"; + this.comboBoxChangeFontStyleOutlineThickness.Size = new System.Drawing.Size(186, 21); + this.comboBoxChangeFontStyleOutlineThickness.TabIndex = 37; + // + // comboBoxChangeFontStyleFontStyle + // + this.comboBoxChangeFontStyleFontStyle.FormattingEnabled = true; + this.comboBoxChangeFontStyleFontStyle.Items.AddRange(new object[] { + "Normal", + "Bold", + "Italic", + "Bold and Italic", + "Outline-bordered", + "Bold and Outline-bordered", + "Italic and Outline-bordered", + "Bold and Italic and Outline-bordered"}); + this.comboBoxChangeFontStyleFontStyle.Location = new System.Drawing.Point(129, 23); + this.comboBoxChangeFontStyleFontStyle.Name = "comboBoxChangeFontStyleFontStyle"; + this.comboBoxChangeFontStyleFontStyle.Size = new System.Drawing.Size(186, 21); + this.comboBoxChangeFontStyleFontStyle.TabIndex = 36; + // + // numericUpDownChangeFontStyleOutlinePaletteId + // + this.numericUpDownChangeFontStyleOutlinePaletteId.Location = new System.Drawing.Point(129, 50); + this.numericUpDownChangeFontStyleOutlinePaletteId.Maximum = new decimal(new int[] { + 254, + 0, + 0, + 0}); + this.numericUpDownChangeFontStyleOutlinePaletteId.Name = "numericUpDownChangeFontStyleOutlinePaletteId"; + this.numericUpDownChangeFontStyleOutlinePaletteId.Size = new System.Drawing.Size(76, 20); + this.numericUpDownChangeFontStyleOutlinePaletteId.TabIndex = 35; + // + // label41 + // + this.label41.AutoSize = true; + this.label41.Location = new System.Drawing.Point(7, 52); + this.label41.Name = "label41"; + this.label41.Size = new System.Drawing.Size(108, 13); + this.label41.TabIndex = 34; + this.label41.Text = "Font outline palette id"; + // + // groupBoxChangeFontSize + // + this.groupBoxChangeFontSize.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxChangeFontSize.Controls.Add(this.groupBoxChangeFontColor); + this.groupBoxChangeFontSize.Controls.Add(this.numericUpDownChangeFontSize); + this.groupBoxChangeFontSize.Controls.Add(this.label46); + this.groupBoxChangeFontSize.Location = new System.Drawing.Point(355, 510); + this.groupBoxChangeFontSize.Name = "groupBoxChangeFontSize"; + this.groupBoxChangeFontSize.Size = new System.Drawing.Size(183, 133); + this.groupBoxChangeFontSize.TabIndex = 40; + this.groupBoxChangeFontSize.TabStop = false; + this.groupBoxChangeFontSize.Text = "Properties: Subtitle font size"; + this.groupBoxChangeFontSize.Visible = false; + // + // groupBoxChangeFontColor + // + this.groupBoxChangeFontColor.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxChangeFontColor.Controls.Add(this.numericUpDownChangeFontColor); + this.groupBoxChangeFontColor.Controls.Add(this.label45); + this.groupBoxChangeFontColor.Location = new System.Drawing.Point(30, 12); + this.groupBoxChangeFontColor.Name = "groupBoxChangeFontColor"; + this.groupBoxChangeFontColor.Size = new System.Drawing.Size(183, 133); + this.groupBoxChangeFontColor.TabIndex = 41; + this.groupBoxChangeFontColor.TabStop = false; + this.groupBoxChangeFontColor.Text = "Properties: Subtitle font color"; + this.groupBoxChangeFontColor.Visible = false; + // + // numericUpDownChangeFontColor + // + this.numericUpDownChangeFontColor.Location = new System.Drawing.Point(100, 18); + this.numericUpDownChangeFontColor.Maximum = new decimal(new int[] { + 254, + 0, + 0, + 0}); + this.numericUpDownChangeFontColor.Name = "numericUpDownChangeFontColor"; + this.numericUpDownChangeFontColor.Size = new System.Drawing.Size(76, 20); + this.numericUpDownChangeFontColor.TabIndex = 15; + this.numericUpDownChangeFontColor.ValueChanged += new System.EventHandler(this.numericUpDownChangeFontColor_ValueChanged); + // + // label45 + // + this.label45.AutoSize = true; + this.label45.Location = new System.Drawing.Point(6, 20); + this.label45.Name = "label45"; + this.label45.Size = new System.Drawing.Size(74, 13); + this.label45.TabIndex = 14; + this.label45.Text = "Font palette id"; + // + // numericUpDownChangeFontSize + // + this.numericUpDownChangeFontSize.Location = new System.Drawing.Point(80, 23); + this.numericUpDownChangeFontSize.Maximum = new decimal(new int[] { + 144, + 0, + 0, + 0}); + this.numericUpDownChangeFontSize.Minimum = new decimal(new int[] { + 8, + 0, + 0, + 0}); + this.numericUpDownChangeFontSize.Name = "numericUpDownChangeFontSize"; + this.numericUpDownChangeFontSize.Size = new System.Drawing.Size(76, 20); + this.numericUpDownChangeFontSize.TabIndex = 35; + this.numericUpDownChangeFontSize.Value = new decimal(new int[] { + 8, + 0, + 0, + 0}); + // + // label46 + // + this.label46.AutoSize = true; + this.label46.Location = new System.Drawing.Point(15, 25); + this.label46.Name = "label46"; + this.label46.Size = new System.Drawing.Size(49, 13); + this.label46.TabIndex = 34; + this.label46.Text = "Font size"; + // + // groupBoxSubtitleText + // + this.groupBoxSubtitleText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxSubtitleText.Controls.Add(this.textBoxSubtitleText); + this.groupBoxSubtitleText.Controls.Add(this.label44); + this.groupBoxSubtitleText.Location = new System.Drawing.Point(284, 526); + this.groupBoxSubtitleText.Name = "groupBoxSubtitleText"; + this.groupBoxSubtitleText.Size = new System.Drawing.Size(145, 111); + this.groupBoxSubtitleText.TabIndex = 41; + this.groupBoxSubtitleText.TabStop = false; + this.groupBoxSubtitleText.Text = "Properties: Subtitle text"; + this.groupBoxSubtitleText.Visible = false; + // + // textBoxSubtitleText + // + this.textBoxSubtitleText.Location = new System.Drawing.Point(46, 22); + this.textBoxSubtitleText.MaxLength = 50; + this.textBoxSubtitleText.Name = "textBoxSubtitleText"; + this.textBoxSubtitleText.Size = new System.Drawing.Size(228, 20); + this.textBoxSubtitleText.TabIndex = 36; + this.textBoxSubtitleText.TextChanged += new System.EventHandler(this.textBoxSubtitleText_TextChanged); + // + // label44 + // + this.label44.AutoSize = true; + this.label44.Location = new System.Drawing.Point(15, 25); + this.label44.Name = "label44"; + this.label44.Size = new System.Drawing.Size(28, 13); + this.label44.TabIndex = 34; + this.label44.Text = "Text"; + // + // contextMenuStripAddSubtitleContent + // + this.contextMenuStripAddSubtitleContent.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItem1, + this.addFontSetToolStripMenuItem, + this.addFontStyleToolStripMenuItem, + this.addFontSizeToolStripMenuItem, + this.addLineBreakToolStripMenuItem, + this.addEndOfInlineStyleToolStripMenuItem, + this.toolStripMenuItem2, + this.deleteToolStripMenuItem}); + this.contextMenuStripAddSubtitleContent.Name = "contextMenuStripAddPalette"; + this.contextMenuStripAddSubtitleContent.Size = new System.Drawing.Size(193, 164); + // + // toolStripMenuItem1 + // + this.toolStripMenuItem1.Name = "toolStripMenuItem1"; + this.toolStripMenuItem1.Size = new System.Drawing.Size(192, 22); + this.toolStripMenuItem1.Text = "Add text"; + this.toolStripMenuItem1.Click += new System.EventHandler(this.toolStripMenuItem1_Click); + // + // addFontSetToolStripMenuItem + // + this.addFontSetToolStripMenuItem.Name = "addFontSetToolStripMenuItem"; + this.addFontSetToolStripMenuItem.Size = new System.Drawing.Size(192, 22); + this.addFontSetToolStripMenuItem.Text = "Add font set"; + this.addFontSetToolStripMenuItem.Click += new System.EventHandler(this.addFontSetToolStripMenuItem_Click); + // + // addFontStyleToolStripMenuItem + // + this.addFontStyleToolStripMenuItem.Name = "addFontStyleToolStripMenuItem"; + this.addFontStyleToolStripMenuItem.Size = new System.Drawing.Size(192, 22); + this.addFontStyleToolStripMenuItem.Text = "Add font style"; + this.addFontStyleToolStripMenuItem.Click += new System.EventHandler(this.addFontStyleToolStripMenuItem_Click); + // + // addFontSizeToolStripMenuItem + // + this.addFontSizeToolStripMenuItem.Name = "addFontSizeToolStripMenuItem"; + this.addFontSizeToolStripMenuItem.Size = new System.Drawing.Size(192, 22); + this.addFontSizeToolStripMenuItem.Text = "Add font size"; + this.addFontSizeToolStripMenuItem.Click += new System.EventHandler(this.addFontSizeToolStripMenuItem_Click); + // + // addLineBreakToolStripMenuItem + // + this.addLineBreakToolStripMenuItem.Name = "addLineBreakToolStripMenuItem"; + this.addLineBreakToolStripMenuItem.Size = new System.Drawing.Size(192, 22); + this.addLineBreakToolStripMenuItem.Text = "Add line break"; + this.addLineBreakToolStripMenuItem.Click += new System.EventHandler(this.addLineBreakToolStripMenuItem_Click); + // + // addEndOfInlineStyleToolStripMenuItem + // + this.addEndOfInlineStyleToolStripMenuItem.Name = "addEndOfInlineStyleToolStripMenuItem"; + this.addEndOfInlineStyleToolStripMenuItem.Size = new System.Drawing.Size(192, 22); + this.addEndOfInlineStyleToolStripMenuItem.Text = "Add end of inline style"; + this.addEndOfInlineStyleToolStripMenuItem.Click += new System.EventHandler(this.addEndOfInlineStyleToolStripMenuItem_Click); + // + // toolStripMenuItem2 + // + this.toolStripMenuItem2.Name = "toolStripMenuItem2"; + this.toolStripMenuItem2.Size = new System.Drawing.Size(189, 6); + // + // deleteToolStripMenuItem + // + this.deleteToolStripMenuItem.Name = "deleteToolStripMenuItem"; + this.deleteToolStripMenuItem.Size = new System.Drawing.Size(192, 22); + this.deleteToolStripMenuItem.Text = "Delete"; + this.deleteToolStripMenuItem.Click += new System.EventHandler(this.deleteToolStripMenuItem_Click); + // + // contextMenuStripAddSubtitleContentFromSubRegion + // + this.contextMenuStripAddSubtitleContentFromSubRegion.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItemRegionAddText, + this.toolStripMenuItemRegionAddFontStyle, + this.toolStripMenuItemRegionAddFontSize, + this.toolStripMenuItemRegionAddLineBreak, + this.toolStripMenuItemRegionAddInlineStyle}); + this.contextMenuStripAddSubtitleContentFromSubRegion.Name = "contextMenuStripAddPalette"; + this.contextMenuStripAddSubtitleContentFromSubRegion.Size = new System.Drawing.Size(193, 114); + // + // toolStripMenuItemRegionAddText + // + this.toolStripMenuItemRegionAddText.Name = "toolStripMenuItemRegionAddText"; + this.toolStripMenuItemRegionAddText.Size = new System.Drawing.Size(192, 22); + this.toolStripMenuItemRegionAddText.Text = "Add text"; + this.toolStripMenuItemRegionAddText.Click += new System.EventHandler(this.toolStripMenuItemRegionAddText_Click); + // + // toolStripMenuItemRegionAddFontStyle + // + this.toolStripMenuItemRegionAddFontStyle.Name = "toolStripMenuItemRegionAddFontStyle"; + this.toolStripMenuItemRegionAddFontStyle.Size = new System.Drawing.Size(192, 22); + this.toolStripMenuItemRegionAddFontStyle.Text = "Add font style"; + this.toolStripMenuItemRegionAddFontStyle.Click += new System.EventHandler(this.toolStripMenuItemRegionAddFontStyle_Click); + // + // toolStripMenuItemRegionAddFontSize + // + this.toolStripMenuItemRegionAddFontSize.Name = "toolStripMenuItemRegionAddFontSize"; + this.toolStripMenuItemRegionAddFontSize.Size = new System.Drawing.Size(192, 22); + this.toolStripMenuItemRegionAddFontSize.Text = "Add font size"; + this.toolStripMenuItemRegionAddFontSize.Click += new System.EventHandler(this.toolStripMenuItemRegionAddFontSize_Click); + // + // toolStripMenuItemRegionAddLineBreak + // + this.toolStripMenuItemRegionAddLineBreak.Name = "toolStripMenuItemRegionAddLineBreak"; + this.toolStripMenuItemRegionAddLineBreak.Size = new System.Drawing.Size(192, 22); + this.toolStripMenuItemRegionAddLineBreak.Text = "Add line break"; + this.toolStripMenuItemRegionAddLineBreak.Click += new System.EventHandler(this.toolStripMenuItemRegionAddLineBreak_Click); + // + // toolStripMenuItemRegionAddInlineStyle + // + this.toolStripMenuItemRegionAddInlineStyle.Name = "toolStripMenuItemRegionAddInlineStyle"; + this.toolStripMenuItemRegionAddInlineStyle.Size = new System.Drawing.Size(192, 22); + this.toolStripMenuItemRegionAddInlineStyle.Text = "Add end of inline style"; + this.toolStripMenuItemRegionAddInlineStyle.Click += new System.EventHandler(this.toolStripMenuItemRegionAddInlineStyle_Click); + // + // groupBoxFontSet + // + this.groupBoxFontSet.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxFontSet.Controls.Add(this.numericUpDownFontSetFontId); + this.groupBoxFontSet.Controls.Add(this.label48); + this.groupBoxFontSet.Location = new System.Drawing.Point(544, 497); + this.groupBoxFontSet.Name = "groupBoxFontSet"; + this.groupBoxFontSet.Size = new System.Drawing.Size(226, 133); + this.groupBoxFontSet.TabIndex = 42; + this.groupBoxFontSet.TabStop = false; + this.groupBoxFontSet.Text = "Properties: Subtitle font set"; + this.groupBoxFontSet.Visible = false; + // + // numericUpDownFontSetFontId + // + this.numericUpDownFontSetFontId.Location = new System.Drawing.Point(100, 18); + this.numericUpDownFontSetFontId.Maximum = new decimal(new int[] { + 254, + 0, + 0, + 0}); + this.numericUpDownFontSetFontId.Name = "numericUpDownFontSetFontId"; + this.numericUpDownFontSetFontId.Size = new System.Drawing.Size(76, 20); + this.numericUpDownFontSetFontId.TabIndex = 15; + this.numericUpDownFontSetFontId.ValueChanged += new System.EventHandler(this.numericUpDownFontSetFontId_ValueChanged); + // + // label48 + // + this.label48.AutoSize = true; + this.label48.Location = new System.Drawing.Point(6, 20); + this.label48.Name = "label48"; + this.label48.Size = new System.Drawing.Size(81, 13); + this.label48.TabIndex = 14; + this.label48.Text = "Font id from CIF"; + // + // contextMenuStripRegionStyle + // + this.contextMenuStripRegionStyle.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItemDuplicateRegionStyle}); + this.contextMenuStripRegionStyle.Name = "contextMenuStripAddPalette"; + this.contextMenuStripRegionStyle.Size = new System.Drawing.Size(125, 26); + // + // toolStripMenuItemDuplicateRegionStyle + // + this.toolStripMenuItemDuplicateRegionStyle.Name = "toolStripMenuItemDuplicateRegionStyle"; + this.toolStripMenuItemDuplicateRegionStyle.Size = new System.Drawing.Size(124, 22); + this.toolStripMenuItemDuplicateRegionStyle.Text = "Duplicate"; + this.toolStripMenuItemDuplicateRegionStyle.Click += new System.EventHandler(this.toolStripMenuItemDuplicateRegionStyle_Click); + // + // ExportTextST + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(871, 610); + this.Controls.Add(this.groupBoxPresentationSegmentRegion); + this.Controls.Add(this.groupBoxFontSet); + this.Controls.Add(this.groupBoxPropertiesPalette); + this.Controls.Add(this.groupBoxChangeFontSize); + this.Controls.Add(this.buttonImport); + this.Controls.Add(this.groupBoxSubtitleText); + this.Controls.Add(this.groupBoxFontStyle); + this.Controls.Add(this.groupBoxPropertiesUserStyle); + this.Controls.Add(this.groupBoxPropertiesRegionStyle); + this.Controls.Add(this.buttonSaveAsM2ts); + this.Controls.Add(this.groupBoxPropertiesRoot); + this.Controls.Add(this.groupBoxTextST); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonSaveAsPes); + this.MinimumSize = new System.Drawing.Size(800, 645); + this.Name = "ExportTextST"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Export to TextST"; + this.groupBoxPropertiesRoot.ResumeLayout(false); + this.groupBoxPropertiesRoot.PerformLayout(); + this.groupBoxTextST.ResumeLayout(false); + this.groupBoxPropertiesRegionStyle.ResumeLayout(false); + this.groupBoxPropertiesRegionStyle.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleFontOutlineThickness)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleFontOutlinePaletteId)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleFontPaletteId)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleFontStyle)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleFontIdRef)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleLineSpace)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleTextVerAlign)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleTextHorAlign)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleTextFlow)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleTBHeight)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleTBWidth)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleTBVerPos)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleTBHorPos)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleFontSize)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStylePaletteEntryId)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleHeight)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleWidth)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleVPos)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleHPos)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRegionStyleId)).EndInit(); + this.groupBoxPropertiesPalette.ResumeLayout(false); + this.groupBoxPropertiesPalette.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPaletteOpacity)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPaletteCb)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPaletteCr)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPaletteY)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPaletteEntry)).EndInit(); + this.groupBoxPropertiesUserStyle.ResumeLayout(false); + this.groupBoxPropertiesUserStyle.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleLineSpaceDelta)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleLineSpaceIncDec)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleTBHeightDelta)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleTBHeightIncDec)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleTBWidthDelta)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleTBWidthIncDec)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleTBVerPosDelta)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleTBVerPosDir)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleTBHorPosDelta)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleTBHorPosDir)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleFontSizeDelta)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleFontSizeIncDec)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleVerPosDelta)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleVerPosDir)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleHorPosDelta)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleHorPosDir)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownUserStyleId)).EndInit(); + this.groupBoxPresentationSegmentRegion.ResumeLayout(false); + this.groupBoxPresentationSegmentRegion.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSubRegionStyleIdRef)).EndInit(); + this.contextMenuStripAddPalette.ResumeLayout(false); + this.groupBoxFontStyle.ResumeLayout(false); + this.groupBoxFontStyle.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownChangeFontStyleOutlinePaletteId)).EndInit(); + this.groupBoxChangeFontSize.ResumeLayout(false); + this.groupBoxChangeFontSize.PerformLayout(); + this.groupBoxChangeFontColor.ResumeLayout(false); + this.groupBoxChangeFontColor.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownChangeFontColor)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownChangeFontSize)).EndInit(); + this.groupBoxSubtitleText.ResumeLayout(false); + this.groupBoxSubtitleText.PerformLayout(); + this.contextMenuStripAddSubtitleContent.ResumeLayout(false); + this.contextMenuStripAddSubtitleContentFromSubRegion.ResumeLayout(false); + this.groupBoxFontSet.ResumeLayout(false); + this.groupBoxFontSet.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownFontSetFontId)).EndInit(); + this.contextMenuStripRegionStyle.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBoxPropertiesRoot; + private System.Windows.Forms.GroupBox groupBoxTextST; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonSaveAsPes; + private System.Windows.Forms.Button buttonImport; + private System.Windows.Forms.OpenFileDialog openFileDialog1; + private System.Windows.Forms.TreeView treeView1; + private System.Windows.Forms.TextBox textBoxRoot; + private System.Windows.Forms.GroupBox groupBoxPropertiesRegionStyle; + private System.Windows.Forms.GroupBox groupBoxPropertiesPalette; + private System.Windows.Forms.GroupBox groupBoxPropertiesUserStyle; + private System.Windows.Forms.NumericUpDown numericUpDownPaletteOpacity; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.NumericUpDown numericUpDownPaletteCb; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.NumericUpDown numericUpDownPaletteCr; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.NumericUpDown numericUpDownPaletteY; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.NumericUpDown numericUpDownPaletteEntry; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Panel panelPaletteColor; + private System.Windows.Forms.Button buttonColor; + private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleHeight; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleWidth; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleVPos; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleHPos; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleId; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleFontSize; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.NumericUpDown numericUpDownRegionStylePaletteEntryId; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.SaveFileDialog saveFileDialog1; + private System.Windows.Forms.Button buttonSaveAsM2ts; + private System.Windows.Forms.NumericUpDown numericUpDownUserStyleLineSpaceDelta; + private System.Windows.Forms.Label label28; + private System.Windows.Forms.NumericUpDown numericUpDownUserStyleLineSpaceIncDec; + private System.Windows.Forms.Label label29; + private System.Windows.Forms.NumericUpDown numericUpDownUserStyleTBHeightDelta; + private System.Windows.Forms.Label label27; + private System.Windows.Forms.NumericUpDown numericUpDownUserStyleTBHeightIncDec; + private System.Windows.Forms.Label label25; + private System.Windows.Forms.NumericUpDown numericUpDownUserStyleTBWidthDelta; + private System.Windows.Forms.Label label26; + private System.Windows.Forms.NumericUpDown numericUpDownUserStyleTBWidthIncDec; + private System.Windows.Forms.Label label19; + private System.Windows.Forms.NumericUpDown numericUpDownUserStyleTBVerPosDelta; + private System.Windows.Forms.Label label20; + private System.Windows.Forms.NumericUpDown numericUpDownUserStyleTBVerPosDir; + private System.Windows.Forms.Label label21; + private System.Windows.Forms.NumericUpDown numericUpDownUserStyleTBHorPosDelta; + private System.Windows.Forms.Label label22; + private System.Windows.Forms.NumericUpDown numericUpDownUserStyleTBHorPosDir; + private System.Windows.Forms.Label label23; + private System.Windows.Forms.NumericUpDown numericUpDownUserStyleFontSizeDelta; + private System.Windows.Forms.Label label24; + private System.Windows.Forms.NumericUpDown numericUpDownUserStyleFontSizeIncDec; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.NumericUpDown numericUpDownUserStyleVerPosDelta; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.NumericUpDown numericUpDownUserStyleVerPosDir; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.NumericUpDown numericUpDownUserStyleHorPosDelta; + private System.Windows.Forms.Label label16; + private System.Windows.Forms.NumericUpDown numericUpDownUserStyleHorPosDir; + private System.Windows.Forms.Label labelUserStyleHorPosDir; + private System.Windows.Forms.NumericUpDown numericUpDownUserStyleId; + private System.Windows.Forms.Label label18; + private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleFontOutlineThickness; + private System.Windows.Forms.Label labelRegionStyleFontOutlineThickness; + private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleFontOutlinePaletteId; + private System.Windows.Forms.Label labelRegionStyleFontOutlinePaletteId; + private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleFontPaletteId; + private System.Windows.Forms.Label label39; + private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleFontStyle; + private System.Windows.Forms.Label label38; + private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleFontIdRef; + private System.Windows.Forms.Label label37; + private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleLineSpace; + private System.Windows.Forms.Label label33; + private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleTextVerAlign; + private System.Windows.Forms.Label label34; + private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleTextHorAlign; + private System.Windows.Forms.Label label35; + private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleTextFlow; + private System.Windows.Forms.Label label36; + private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleTBHeight; + private System.Windows.Forms.Label label17; + private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleTBWidth; + private System.Windows.Forms.Label label30; + private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleTBVerPos; + private System.Windows.Forms.Label label31; + private System.Windows.Forms.NumericUpDown numericUpDownRegionStyleTBHorPos; + private System.Windows.Forms.Label label32; + private System.Windows.Forms.GroupBox groupBoxPresentationSegmentRegion; + private System.Windows.Forms.NumericUpDown numericUpDownSubRegionStyleIdRef; + private System.Windows.Forms.Label label40; + private System.Windows.Forms.CheckBox checkBoxSubRegionForced; + private System.Windows.Forms.CheckBox checkBoxSubRegionContinuous; + private System.Windows.Forms.ContextMenuStrip contextMenuStripAddPalette; + private System.Windows.Forms.ToolStripMenuItem addPaletteToolStripMenuItem; + private System.Windows.Forms.GroupBox groupBoxFontStyle; + private System.Windows.Forms.Label label43; + private System.Windows.Forms.Label label42; + private System.Windows.Forms.ComboBox comboBoxChangeFontStyleOutlineThickness; + private System.Windows.Forms.ComboBox comboBoxChangeFontStyleFontStyle; + private System.Windows.Forms.NumericUpDown numericUpDownChangeFontStyleOutlinePaletteId; + private System.Windows.Forms.Label label41; + private System.Windows.Forms.GroupBox groupBoxChangeFontSize; + private System.Windows.Forms.NumericUpDown numericUpDownChangeFontSize; + private System.Windows.Forms.Label label46; + private System.Windows.Forms.GroupBox groupBoxSubtitleText; + private System.Windows.Forms.TextBox textBoxSubtitleText; + private System.Windows.Forms.Label label44; + private System.Windows.Forms.GroupBox groupBoxChangeFontColor; + private System.Windows.Forms.NumericUpDown numericUpDownChangeFontColor; + private System.Windows.Forms.Label label45; + private System.Windows.Forms.ContextMenuStrip contextMenuStripAddSubtitleContent; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem addFontStyleToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem addFontSizeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem addLineBreakToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem addEndOfInlineStyleToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem2; + private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem; + private System.Windows.Forms.ContextMenuStrip contextMenuStripAddSubtitleContentFromSubRegion; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemRegionAddText; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemRegionAddFontStyle; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemRegionAddFontSize; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemRegionAddLineBreak; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemRegionAddInlineStyle; + private System.Windows.Forms.Label label47; + private System.Windows.Forms.GroupBox groupBoxFontSet; + private System.Windows.Forms.NumericUpDown numericUpDownFontSetFontId; + private System.Windows.Forms.Label label48; + private System.Windows.Forms.ToolStripMenuItem addFontSetToolStripMenuItem; + private System.Windows.Forms.ContextMenuStrip contextMenuStripRegionStyle; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemDuplicateRegionStyle; + } } \ No newline at end of file diff --git a/src/Forms/ExportTextST.cs b/src/ui/Forms/ExportTextST.cs similarity index 97% rename from src/Forms/ExportTextST.cs rename to src/ui/Forms/ExportTextST.cs index a0604fb29..76d966388 100644 --- a/src/Forms/ExportTextST.cs +++ b/src/ui/Forms/ExportTextST.cs @@ -1,830 +1,830 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.SubtitleFormats; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.IO; -using System.Linq; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public partial class ExportTextST : Form - { - private Subtitle _subtitle; - private TreeNode _rootNode; - private TreeNode _palettesNode; - private string _fileName; - private TextST _textST; - private TextST.Palette _currentPalette; - private TextST.RegionStyle _currentRegionStyle; - private TextST.UserStyle _currentUserStyle; - private TextST.SubtitleRegion _currentSubtitleRegion; - private TextST.SubtitleRegionContentChangeFontStyle _currentSubtitleFontStyle; - private TextST.SubtitleRegionContentChangeFontSize _currentSubtitleFontSize; - private TextST.SubtitleRegionContentText _currentSubtitleText; - private TextST.SubtitleRegionContentChangeFontColor _currentSubtitleFontColor; - private TextST.SubtitleRegionContentChangeFontSet _currentSubtitleFontSet; - private TreeNode _currentNode; - - private void SetGroupBoxProperties(GroupBox gb) - { - gb.Left = groupBoxPropertiesRoot.Left; - gb.Top = groupBoxPropertiesRoot.Top; - gb.Size = groupBoxPropertiesRoot.Size; - gb.Anchor = groupBoxPropertiesRoot.Anchor; - } - - public ExportTextST(Subtitle subtitle) - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - SetGroupBoxProperties(groupBoxPropertiesPalette); - SetGroupBoxProperties(groupBoxPropertiesRegionStyle); - SetGroupBoxProperties(groupBoxPropertiesUserStyle); - SetGroupBoxProperties(groupBoxPresentationSegmentRegion); - SetGroupBoxProperties(groupBoxFontStyle); - SetGroupBoxProperties(groupBoxChangeFontSize); - SetGroupBoxProperties(groupBoxSubtitleText); - SetGroupBoxProperties(groupBoxChangeFontColor); - SetGroupBoxProperties(groupBoxFontSet); - - _subtitle = subtitle; - - _textST = new TextST - { - StyleSegment = TextST.DialogStyleSegment.DefaultDialogStyleSegment, - PresentationSegments = new List(), - }; - _textST.StyleSegment.NumberOfDialogPresentationSegments = _subtitle.Paragraphs.Count; - foreach (var paragraph in _subtitle.Paragraphs) - { - var dps = new TextST.DialogPresentationSegment(paragraph, _textST.StyleSegment.RegionStyles[0]); - _textST.PresentationSegments.Add(dps); - } - - UpdateTreeview(); - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private void ButtonImportClick(object sender, EventArgs e) - { - if (openFileDialog1.ShowDialog(this) == DialogResult.OK) - { - _textST = new TextST(); - if (!_textST.IsMine(null, openFileDialog1.FileName)) - { - MessageBox.Show("Not a valid TextST file"); - return; - } - _subtitle = new Subtitle(); - _fileName = openFileDialog1.FileName; - _textST.LoadSubtitle(_subtitle, null, _fileName); - groupBoxTextST.Text = "TextST structure: " + Path.GetFileName(_fileName); - UpdateTreeview(); - } - } - - private void UpdateTreeview() - { - treeView1.Nodes.Clear(); - treeView1.BeginUpdate(); - _rootNode = new TreeNode("TextST"); - treeView1.Nodes.Add(_rootNode); - if (_textST.StyleSegment != null) - { - var styleNode = new TreeNode("Style segment"); - _rootNode.Nodes.Add(styleNode); - - var regionStylesNode = new TreeNode(string.Format("Region styles ({0})", _textST.StyleSegment.RegionStyles.Count)); - styleNode.Nodes.Add(regionStylesNode); - foreach (TextST.RegionStyle regionStyle in _textST.StyleSegment.RegionStyles) - { - var regionStyleNode = new TreeNode("Region style") { Tag = regionStyle }; - regionStylesNode.Nodes.Add(regionStyleNode); - } - - var userStylesNode = new TreeNode(string.Format("User styles ({0})", _textST.StyleSegment.UserStyles.Count)); - styleNode.Nodes.Add(userStylesNode); - foreach (TextST.UserStyle userStyle in _textST.StyleSegment.UserStyles) - { - var regionStyleNode = new TreeNode("User style") { Tag = userStyle }; - userStylesNode.Nodes.Add(regionStyleNode); - } - - _palettesNode = new TreeNode(string.Format("Palettes ({0})", _textST.StyleSegment.Palettes.Count)) { Tag = _textST.StyleSegment.Palettes }; - styleNode.Nodes.Add(_palettesNode); - foreach (TextST.Palette palette in _textST.StyleSegment.Palettes) - { - var paletteNode = new TreeNode("Palette " + palette.PaletteEntryId) { Tag = palette }; - _palettesNode.Nodes.Add(paletteNode); - } - } - - if (_textST.PresentationSegments != null) - { - var presentationSegmentsNode = new TreeNode(string.Format("Presentation segments ({0})", _textST.PresentationSegments.Count)); - _rootNode.Nodes.Add(presentationSegmentsNode); - int count = 0; - foreach (var segment in _textST.PresentationSegments) - { - count++; - var presentationSegmentNode = new TreeNode(string.Format("Segment {0}: {1} -- > {2}", count, - new TimeCode(segment.StartPtsMilliseconds), new TimeCode(segment.EndPtsMilliseconds))) - { Tag = segment }; - presentationSegmentsNode.Nodes.Add(presentationSegmentNode); - - foreach (var subtitleRegion in segment.Regions) - { - var subtitleRegionNode = new TreeNode("Subtitle region") { Tag = subtitleRegion }; - presentationSegmentNode.Nodes.Add(subtitleRegionNode); - - foreach (var content in subtitleRegion.Content) - { - if (content is TextST.SubtitleRegionContentText) - { - var textContent = content as TextST.SubtitleRegionContentText; - var contentNode = new TreeNode(content.Name + ": " + textContent.Text) { Tag = content }; - subtitleRegionNode.Nodes.Add(contentNode); - } - else if (content is TextST.SubtitleRegionContentChangeFontStyle) - { - var fontStyleContent = content as TextST.SubtitleRegionContentChangeFontStyle; - var contentNode = new TreeNode(content.Name + ": " + GetNameFromFrontStyle(fontStyleContent.FontStyle)) { Tag = content }; - subtitleRegionNode.Nodes.Add(contentNode); - } - else - { - var contentNode = new TreeNode(content.Name) { Tag = content }; - subtitleRegionNode.Nodes.Add(contentNode); - } - } - } - } - } - treeView1.ExpandAll(); - treeView1.EndUpdate(); - treeView1.SelectedNode = _rootNode; - } - - private string GetNameFromFrontStyle(int fontStyle) - { - switch (fontStyle) - { - case 0: - return "Normal"; - case 1: - return "Bold"; - case 2: - return "Italic"; - case 3: - return "Bold and italic"; - case 4: - return "Outline-bordered"; - case 5: - return "Bold and outline-bordered"; - case 6: - return "Italic and outline-bordered"; - case 7: - return "Bold and italic and outline-bordered"; - default: - return "Unknown"; - } - } - - private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) - { - groupBoxPropertiesRoot.Visible = false; - groupBoxPropertiesPalette.Visible = false; - groupBoxPropertiesRegionStyle.Visible = false; - groupBoxPropertiesUserStyle.Visible = false; - groupBoxPresentationSegmentRegion.Visible = false; - groupBoxFontStyle.Visible = false; - groupBoxChangeFontSize.Visible = false; - groupBoxSubtitleText.Visible = false; - groupBoxChangeFontColor.Visible = false; - groupBoxFontSet.Visible = false; - if (e.Node != null && _textST != null) - { - _currentNode = e.Node; - if (e.Node == _rootNode) - { - groupBoxPropertiesRoot.Visible = true; - textBoxRoot.Text = "Number of region styles: " + _textST.StyleSegment.RegionStyles.Count + Environment.NewLine + - "Number of user styles: " + _textST.StyleSegment.UserStyles.Count + Environment.NewLine + - "Number of palettes: " + _textST.StyleSegment.Palettes.Count + Environment.NewLine + - "Number of subtitles: " + _textST.StyleSegment.NumberOfDialogPresentationSegments + Environment.NewLine; - } - else if (e.Node.Tag is TextST.Palette) - { - groupBoxPropertiesPalette.Visible = true; - _currentPalette = e.Node.Tag as TextST.Palette; - numericUpDownPaletteEntry.Value = _currentPalette.PaletteEntryId; - numericUpDownPaletteY.Value = _currentPalette.Y; - numericUpDownPaletteCr.Value = _currentPalette.Cr; - numericUpDownPaletteCb.Value = _currentPalette.Cb; - numericUpDownPaletteOpacity.Value = _currentPalette.T; - panelPaletteColor.BackColor = Color.FromArgb(255, _currentPalette.Color); - } - else if (e.Node.Tag is TextST.RegionStyle) - { - groupBoxPropertiesRegionStyle.Visible = true; - _currentRegionStyle = e.Node.Tag as TextST.RegionStyle; - numericUpDownRegionStyleId.Value = _currentRegionStyle.RegionStyleId; - numericUpDownRegionStyleHPos.Value = _currentRegionStyle.RegionHorizontalPosition; - numericUpDownRegionStyleVPos.Value = _currentRegionStyle.RegionVerticalPosition; - numericUpDownRegionStyleWidth.Value = _currentRegionStyle.RegionWidth; - numericUpDownRegionStyleHeight.Value = _currentRegionStyle.RegionHeight; - numericUpDownRegionStylePaletteEntryId.Value = _currentRegionStyle.RegionBgPaletteEntryIdRef; - numericUpDownRegionStyleTBHorPos.Value = _currentRegionStyle.TextBoxHorizontalPosition; - numericUpDownRegionStyleTBVerPos.Value = _currentRegionStyle.RegionVerticalPosition; - numericUpDownRegionStyleTBWidth.Value = _currentRegionStyle.TextBoxWidth; - numericUpDownRegionStyleTBHeight.Value = _currentRegionStyle.TextBoxHeight; - numericUpDownRegionStyleTextFlow.Value = _currentRegionStyle.TextFlow; - numericUpDownRegionStyleTextHorAlign.Value = _currentRegionStyle.TextHorizontalAlignment; - numericUpDownRegionStyleTextVerAlign.Value = _currentRegionStyle.TextVerticalAlignment; - numericUpDownRegionStyleLineSpace.Value = _currentRegionStyle.LineSpace; - numericUpDownRegionStyleFontIdRef.Value = _currentRegionStyle.FontIdRef; - numericUpDownRegionStyleFontStyle.Value = _currentRegionStyle.FontStyle; - numericUpDownRegionStyleFontSize.Value = _currentRegionStyle.FontSize; - numericUpDownRegionStyleFontPaletteId.Value = _currentRegionStyle.FontPaletteEntryIdRef; - numericUpDownRegionStyleFontOutlinePaletteId.Value = _currentRegionStyle.FontOutlinePaletteEntryIdRef; - numericUpDownRegionStyleFontOutlineThickness.Value = _currentRegionStyle.FontOutlineThickness; - } - else if (e.Node.Tag is TextST.UserStyle) - { - groupBoxPropertiesUserStyle.Visible = true; - _currentUserStyle = e.Node.Tag as TextST.UserStyle; - numericUpDownUserStyleId.Value = _currentUserStyle.UserStyleId; - numericUpDownUserStyleHorPosDir.Value = _currentUserStyle.RegionHorizontalPositionDirection; - numericUpDownUserStyleHorPosDelta.Value = _currentUserStyle.RegionHorizontalPositionDelta; - numericUpDownUserStyleVerPosDir.Value = _currentUserStyle.RegionVerticalPositionDirection; - numericUpDownUserStyleVerPosDelta.Value = _currentUserStyle.RegionVerticalPositionDelta; - numericUpDownUserStyleFontSizeIncDec.Value = _currentUserStyle.FontSizeIncDec; - numericUpDownUserStyleFontSizeDelta.Value = _currentUserStyle.FontSizeDelta; - numericUpDownUserStyleTBHorPosDir.Value = _currentUserStyle.TextBoxHorizontalPositionDirection; - numericUpDownUserStyleTBHorPosDelta.Value = _currentUserStyle.TextBoxHorizontalPositionDelta; - numericUpDownUserStyleTBVerPosDir.Value = _currentUserStyle.TextBoxVerticalPositionDirection; - numericUpDownUserStyleTBVerPosDelta.Value = _currentUserStyle.TextBoxVerticalPositionDelta; - numericUpDownUserStyleTBWidthIncDec.Value = _currentUserStyle.TextBoxWidthIncDec; - numericUpDownUserStyleTBWidthDelta.Value = _currentUserStyle.TextBoxWidthDelta; - numericUpDownUserStyleTBHeightIncDec.Value = _currentUserStyle.TextBoxHeightIncDec; - numericUpDownUserStyleTBHeightDelta.Value = _currentUserStyle.TextBoxHeightDelta; - numericUpDownUserStyleLineSpaceIncDec.Value = _currentUserStyle.LineSpaceIncDec; - numericUpDownUserStyleLineSpaceDelta.Value = _currentUserStyle.LineSpaceDelta; - } - else if (e.Node.Tag is TextST.SubtitleRegion) - { - groupBoxPresentationSegmentRegion.Visible = true; - _currentSubtitleRegion = e.Node.Tag as TextST.SubtitleRegion; - checkBoxSubRegionContinuous.Checked = _currentSubtitleRegion.ContinuousPresentation; - checkBoxSubRegionForced.Checked = _currentSubtitleRegion.Forced; - numericUpDownSubRegionStyleIdRef.Value = _currentSubtitleRegion.RegionStyleId; - } - else if (e.Node.Tag is TextST.SubtitleRegionContentChangeFontStyle) - { - groupBoxFontStyle.Visible = true; - _currentSubtitleFontStyle = e.Node.Tag as TextST.SubtitleRegionContentChangeFontStyle; - comboBoxChangeFontStyleFontStyle.SelectedIndex = _currentSubtitleFontStyle.FontStyle; - numericUpDownChangeFontStyleOutlinePaletteId.Value = _currentSubtitleFontStyle.FontOutlinePaletteId; - comboBoxChangeFontStyleOutlineThickness.SelectedIndex = _currentSubtitleFontStyle.FontOutlineThickness - 1; - } - else if (e.Node.Tag is TextST.SubtitleRegionContentChangeFontSize) - { - groupBoxChangeFontSize.Visible = true; - _currentSubtitleFontSize = e.Node.Tag as TextST.SubtitleRegionContentChangeFontSize; - numericUpDownChangeFontSize.Value = _currentSubtitleFontSize.FontSize; - } - else if (e.Node.Tag is TextST.SubtitleRegionContentText) - { - groupBoxSubtitleText.Visible = true; - _currentSubtitleText = e.Node.Tag as TextST.SubtitleRegionContentText; - textBoxSubtitleText.Text = _currentSubtitleText.Text; - } - else if (e.Node.Tag is TextST.SubtitleRegionContentChangeFontColor) - { - groupBoxChangeFontColor.Visible = true; - _currentSubtitleFontColor = e.Node.Tag as TextST.SubtitleRegionContentChangeFontColor; - numericUpDownChangeFontColor.Value = _currentSubtitleFontColor.FontPaletteId; - } - else if (e.Node.Tag is TextST.SubtitleRegionContentChangeFontSet) - { - groupBoxFontSet.Visible = true; - _currentSubtitleFontSet = e.Node.Tag as TextST.SubtitleRegionContentChangeFontSet; - numericUpDownFontSetFontId.Value = _currentSubtitleFontSet.FontId; - } - } - } - - private void buttonColor_Click(object sender, EventArgs e) - { - using (var colorChooser = new ColorChooser { Color = panelPaletteColor.BackColor, ShowAlpha = true }) - { - if (colorChooser.ShowDialog() == DialogResult.OK) - { - panelPaletteColor.BackColor = colorChooser.Color; - } - } - } - - private void buttonSaveAsPes_Click(object sender, EventArgs e) - { - saveFileDialog1.DefaultExt = ".textst"; - saveFileDialog1.FileName = string.Empty; - saveFileDialog1.Filter = "TextST files|*.textst"; - if (saveFileDialog1.ShowDialog(this) == DialogResult.OK) - { - using (var fs = new FileStream(saveFileDialog1.FileName, FileMode.Create)) - { - _textST.StyleSegment.WriteToStream(fs, _subtitle.Paragraphs.Count); - foreach (var presentationSegment in _textST.PresentationSegments) - { - presentationSegment.WriteToStream(fs); - } - } - MessageBox.Show("TextST PES packets saved as " + saveFileDialog1.FileName); - } - } - - private void buttonSaveAsM2ts_Click(object sender, EventArgs e) - { - //saveFileDialog1.DefaultExt = ".m2ts"; - //saveFileDialog1.FileName = string.Empty; - //saveFileDialog1.Filter = "m2ts files|*.m2ts"; - //if (saveFileDialog1.ShowDialog(this) == DialogResult.OK) - //{ - // using (var fs = new FileStream(saveFileDialog1.FileName, FileMode.Create)) - // { - - // } - // MessageBox.Show("TextST M2TS file saved as " + saveFileDialog1.FileName); - //} - } - - private int GetIntFromNumericUpDown(object sender) - { - var numericUpDown = sender as NumericUpDown; - if (numericUpDown != null) - { - return (int)numericUpDown.Value; - } - - return 0; - } - - private void numericUpDownRegionStyleId_ValueChanged(object sender, EventArgs e) - { - _currentRegionStyle.RegionStyleId = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownRegionStyleHPos_ValueChanged(object sender, EventArgs e) - { - _currentRegionStyle.RegionHorizontalPosition = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownRegionStyleVPos_ValueChanged(object sender, EventArgs e) - { - _currentRegionStyle.RegionVerticalPosition = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownRegionStyleWidth_ValueChanged(object sender, EventArgs e) - { - _currentRegionStyle.RegionWidth = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownRegionStyleHeight_ValueChanged(object sender, EventArgs e) - { - _currentRegionStyle.RegionHeight = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownRegionStylePaletteEntryId_ValueChanged(object sender, EventArgs e) - { - _currentRegionStyle.RegionBgPaletteEntryIdRef = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownRegionStyleTBHorPos_ValueChanged(object sender, EventArgs e) - { - _currentRegionStyle.TextBoxHorizontalPosition = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownRegionStyleTBVerPos_ValueChanged(object sender, EventArgs e) - { - _currentRegionStyle.TextBoxVerticalPosition = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownRegionStyleTBWidth_ValueChanged(object sender, EventArgs e) - { - _currentRegionStyle.TextBoxWidth = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownRegionStyleTBHeight_ValueChanged(object sender, EventArgs e) - { - _currentRegionStyle.TextBoxHeight = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownRegionStyleTextFlow_ValueChanged(object sender, EventArgs e) - { - _currentRegionStyle.TextFlow = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownRegionStyleTextHorAlign_ValueChanged(object sender, EventArgs e) - { - _currentRegionStyle.TextHorizontalAlignment = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownRegionStyleTextVerAlign_ValueChanged(object sender, EventArgs e) - { - _currentRegionStyle.TextVerticalAlignment = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownRegionStyleLineSpace_ValueChanged(object sender, EventArgs e) - { - _currentRegionStyle.LineSpace = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownRegionStyleFontIdRef_ValueChanged(object sender, EventArgs e) - { - _currentRegionStyle.FontIdRef = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownRegionStyleFontStyle_ValueChanged(object sender, EventArgs e) - { - _currentRegionStyle.FontStyle = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownRegionStyleFontSize_ValueChanged(object sender, EventArgs e) - { - _currentRegionStyle.FontSize = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownRegionStyleFontPaletteId_ValueChanged(object sender, EventArgs e) - { - _currentRegionStyle.FontPaletteEntryIdRef = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownRegionStyleFontOutlinePaletteId_ValueChanged(object sender, EventArgs e) - { - _currentRegionStyle.FontOutlinePaletteEntryIdRef = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownRegionStyleFontOutlineThickness_ValueChanged(object sender, EventArgs e) - { - _currentRegionStyle.FontOutlineThickness = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownUserStyleId_ValueChanged(object sender, EventArgs e) - { - _currentUserStyle.UserStyleId = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownUserStyleHorPosDir_ValueChanged(object sender, EventArgs e) - { - _currentUserStyle.RegionHorizontalPositionDirection = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownUserStyleHorPosDelta_ValueChanged(object sender, EventArgs e) - { - _currentUserStyle.RegionHorizontalPositionDelta = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownUserStyleVerPosDir_ValueChanged(object sender, EventArgs e) - { - _currentUserStyle.RegionVerticalPositionDirection = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownUserStyleVerPosDelta_ValueChanged(object sender, EventArgs e) - { - _currentUserStyle.RegionVerticalPositionDelta = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownUserStyleFontSizeIncDec_ValueChanged(object sender, EventArgs e) - { - _currentUserStyle.FontSizeIncDec = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownUserStyleFontSizeDelta_ValueChanged(object sender, EventArgs e) - { - _currentUserStyle.FontSizeDelta = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownUserStyleTBHorPosDir_ValueChanged(object sender, EventArgs e) - { - _currentUserStyle.TextBoxHorizontalPositionDirection = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownUserStyleTBHorPosDelta_ValueChanged(object sender, EventArgs e) - { - _currentUserStyle.TextBoxHorizontalPositionDelta = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownUserStyleTBVerPosDir_ValueChanged(object sender, EventArgs e) - { - _currentUserStyle.TextBoxVerticalPositionDirection = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownUserStyleTBVerPosDelta_ValueChanged(object sender, EventArgs e) - { - _currentUserStyle.TextBoxVerticalPositionDelta = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownUserStyleTBWidthIncDec_ValueChanged(object sender, EventArgs e) - { - _currentUserStyle.TextBoxWidthIncDec = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownUserStyleTBWidthDelta_ValueChanged(object sender, EventArgs e) - { - _currentUserStyle.TextBoxWidthDelta = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownUserStyleTBHeightIncDec_ValueChanged(object sender, EventArgs e) - { - _currentUserStyle.TextBoxHeightIncDec = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownUserStyleTBHeightDelta_ValueChanged(object sender, EventArgs e) - { - _currentUserStyle.TextBoxHeightDelta = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownUserStyleLineSpaceIncDec_ValueChanged(object sender, EventArgs e) - { - _currentUserStyle.LineSpaceIncDec = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownUserStyleLineSpaceDelta_ValueChanged(object sender, EventArgs e) - { - _currentUserStyle.LineSpaceDelta = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownPaletteEntry_ValueChanged(object sender, EventArgs e) - { - _currentPalette.PaletteEntryId = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownPaletteY_ValueChanged(object sender, EventArgs e) - { - _currentPalette.Y = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownPaletteCr_ValueChanged(object sender, EventArgs e) - { - _currentPalette.Cr = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownPaletteCb_ValueChanged(object sender, EventArgs e) - { - _currentPalette.Cb = GetIntFromNumericUpDown(sender); - } - - private void numericUpDownPaletteOpacity_ValueChanged(object sender, EventArgs e) - { - _currentPalette.T = GetIntFromNumericUpDown(sender); - } - - private void checkBoxSubRegionContinuous_CheckedChanged(object sender, EventArgs e) - { - _currentSubtitleRegion.ContinuousPresentation = (sender as CheckBox).Checked; - } - - private void checkBoxSubRegionForced_CheckedChanged(object sender, EventArgs e) - { - _currentSubtitleRegion.Forced = (sender as CheckBox).Checked; - } - - private void numericUpDownSubRegionStyleIdRef_ValueChanged(object sender, EventArgs e) - { - _currentSubtitleRegion.RegionStyleId = GetIntFromNumericUpDown(sender); - } - - private void treeView1_MouseUp(object sender, MouseEventArgs e) - { - if (e.Button == MouseButtons.Right) - { - var p = new Point(e.X, e.Y); - TreeNode node = treeView1.GetNodeAt(p); - if (node != null) - { - treeView1.SelectedNode = node; - if (node.Tag is List) - { - contextMenuStripAddPalette.Show(treeView1, p); - } - else if (node.Tag is TextST.SubtitleRegion) - { - contextMenuStripAddSubtitleContentFromSubRegion.Show(treeView1, p); - } - else if (node.Tag is TextST.SubtitleRegionContent) - { - contextMenuStripAddSubtitleContent.Show(treeView1, p); - } - else if (node.Tag is TextST.RegionStyle) - { - contextMenuStripRegionStyle.Show(treeView1, p); - } - } - } - } - - private void addPaletteToolStripMenuItem_Click(object sender, EventArgs e) - { - if (_textST.StyleSegment.Palettes.Count < 254) - { - int id = 1; - while (_textST.StyleSegment.Palettes.Any(p => p.PaletteEntryId == id)) - { - id++; - } - - var palette = new TextST.Palette - { - PaletteEntryId = id, - Y = 235, - Cr = 128, - Cb = 128, - T = 255 - }; - - _textST.StyleSegment.Palettes.Add(palette); - - var paletteNode = new TreeNode("Palette " + id) { Tag = palette }; - _palettesNode.Nodes.Add(paletteNode); - treeView1.SelectedNode = paletteNode; - } - } - - private void textBoxSubtitleText_TextChanged(object sender, EventArgs e) - { - _currentSubtitleText.Text = (sender as TextBox).Text; - _currentNode.Text = "Text: " + _currentSubtitleText.Text; - } - - private void numericUpDownChangeFontColor_ValueChanged(object sender, EventArgs e) - { - _currentSubtitleFontColor.FontPaletteId = GetIntFromNumericUpDown(sender); - } - - private List GetContentList(TextST.SubtitleRegionContent content) - { - foreach (var presentationSegment in _textST.PresentationSegments) - { - foreach (var region in presentationSegment.Regions) - { - if (region.Content.Contains(content)) - { - return region.Content; - } - } - } - return null; - } - - private void AddSubtitleContent(TextST.SubtitleRegionContent newContent, string title) - { - var content = _currentNode.Tag as TextST.SubtitleRegionContent; - if (content != null) - { - var list = GetContentList(content); - if (list != null) - { - var newNode = new TreeNode(title) { Tag = newContent }; - _currentNode.Parent.Nodes.Insert(_currentNode.Parent.Nodes.IndexOf(_currentNode) + 1, newNode); - int index = list.IndexOf(content); - list.Insert(index + 1, newContent); - treeView1.SelectedNode = newNode; - } - } - } - - private void addLineBreakToolStripMenuItem_Click(object sender, EventArgs e) - { - var newContent = new TextST.SubtitleRegionContentLineBreak(); - AddSubtitleContent(newContent, newContent.Name); - } - - private void addEndOfInlineStyleToolStripMenuItem_Click(object sender, EventArgs e) - { - var newContent = new TextST.SubtitleRegionContentEndOfInlineStyle(); - AddSubtitleContent(newContent, newContent.Name); - } - - private void addFontSizeToolStripMenuItem_Click(object sender, EventArgs e) - { - var newContent = new TextST.SubtitleRegionContentChangeFontSize { FontSize = 45 }; - AddSubtitleContent(newContent, newContent.Name); - } - - private void addFontSetToolStripMenuItem_Click(object sender, EventArgs e) - { - var newContent = new TextST.SubtitleRegionContentChangeFontSet(); - AddSubtitleContent(newContent, newContent.Name); - } - - private void addFontStyleToolStripMenuItem_Click(object sender, EventArgs e) - { - var newContent = new TextST.SubtitleRegionContentChangeFontStyle { FontStyle = 0, FontOutlinePaletteId = 0, FontOutlineThickness = 2 }; - AddSubtitleContent(newContent, newContent.Name); - } - - private void toolStripMenuItem1_Click(object sender, EventArgs e) - { - var newContent = new TextST.SubtitleRegionContentText(); - AddSubtitleContent(newContent, newContent.Name + ": "); - } - - private void deleteToolStripMenuItem_Click(object sender, EventArgs e) - { - var content = _currentNode.Tag as TextST.SubtitleRegionContent; - if (content != null) - { - var list = GetContentList(content); - if (list != null) - { - list.Remove(content); - _currentNode.Parent.Nodes.Remove(_currentNode); - } - } - } - - private void AddSubtitleContentFromRoot(TextST.SubtitleRegionContent newContent, string title) - { - var region = _currentNode.Tag as TextST.SubtitleRegion; - if (region != null) - { - var list = region.Content; - if (list != null) - { - var newNode = new TreeNode(title) { Tag = newContent }; - _currentNode.Nodes.Insert(0, newNode); - region.Content.Insert(0, newContent); - treeView1.SelectedNode = newNode; - } - } - } - - private void toolStripMenuItemRegionAddLineBreak_Click(object sender, EventArgs e) - { - var newContent = new TextST.SubtitleRegionContentLineBreak(); - AddSubtitleContentFromRoot(newContent, newContent.Name); - } - - private void toolStripMenuItemRegionAddText_Click(object sender, EventArgs e) - { - var newContent = new TextST.SubtitleRegionContentText(); - AddSubtitleContentFromRoot(newContent, newContent.Name + ": "); - } - - private void toolStripMenuItemRegionAddFontStyle_Click(object sender, EventArgs e) - { - var newContent = new TextST.SubtitleRegionContentChangeFontStyle { FontStyle = 0, FontOutlinePaletteId = 0, FontOutlineThickness = 2 }; - AddSubtitleContentFromRoot(newContent, newContent.Name); - } - - private void toolStripMenuItemRegionAddFontSize_Click(object sender, EventArgs e) - { - var newContent = new TextST.SubtitleRegionContentChangeFontSize { FontSize = 45 }; - AddSubtitleContentFromRoot(newContent, newContent.Name); - } - - private void toolStripMenuItemRegionAddInlineStyle_Click(object sender, EventArgs e) - { - var newContent = new TextST.SubtitleRegionContentEndOfInlineStyle(); - AddSubtitleContentFromRoot(newContent, newContent.Name); - } - - private void numericUpDownFontSetFontId_ValueChanged(object sender, EventArgs e) - { - _currentSubtitleFontSet.FontId = GetIntFromNumericUpDown(sender); - } - - private void toolStripMenuItemDuplicateRegionStyle_Click(object sender, EventArgs e) - { - var regionStyle = _currentNode.Tag as TextST.RegionStyle; - if (regionStyle != null) - { - int regionStyleId = 0; - foreach (var rs in _textST.StyleSegment.RegionStyles) - { - regionStyleId = Math.Max(regionStyleId, rs.RegionStyleId); - } - regionStyleId++; - - var newRegionStyle = new TextST.RegionStyle(regionStyle) { RegionStyleId = regionStyleId }; - _textST.StyleSegment.RegionStyles.Add(newRegionStyle); - var newNode = new TreeNode("Region style") { Tag = newRegionStyle }; - _currentNode.Parent.Nodes.Add(newNode); - _currentNode.Parent.Text = "Region styles (" + _textST.StyleSegment.RegionStyles.Count + ")"; - treeView1.SelectedNode = newNode; - } - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.SubtitleFormats; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public partial class ExportTextST : Form + { + private Subtitle _subtitle; + private TreeNode _rootNode; + private TreeNode _palettesNode; + private string _fileName; + private TextST _textST; + private TextST.Palette _currentPalette; + private TextST.RegionStyle _currentRegionStyle; + private TextST.UserStyle _currentUserStyle; + private TextST.SubtitleRegion _currentSubtitleRegion; + private TextST.SubtitleRegionContentChangeFontStyle _currentSubtitleFontStyle; + private TextST.SubtitleRegionContentChangeFontSize _currentSubtitleFontSize; + private TextST.SubtitleRegionContentText _currentSubtitleText; + private TextST.SubtitleRegionContentChangeFontColor _currentSubtitleFontColor; + private TextST.SubtitleRegionContentChangeFontSet _currentSubtitleFontSet; + private TreeNode _currentNode; + + private void SetGroupBoxProperties(GroupBox gb) + { + gb.Left = groupBoxPropertiesRoot.Left; + gb.Top = groupBoxPropertiesRoot.Top; + gb.Size = groupBoxPropertiesRoot.Size; + gb.Anchor = groupBoxPropertiesRoot.Anchor; + } + + public ExportTextST(Subtitle subtitle) + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + SetGroupBoxProperties(groupBoxPropertiesPalette); + SetGroupBoxProperties(groupBoxPropertiesRegionStyle); + SetGroupBoxProperties(groupBoxPropertiesUserStyle); + SetGroupBoxProperties(groupBoxPresentationSegmentRegion); + SetGroupBoxProperties(groupBoxFontStyle); + SetGroupBoxProperties(groupBoxChangeFontSize); + SetGroupBoxProperties(groupBoxSubtitleText); + SetGroupBoxProperties(groupBoxChangeFontColor); + SetGroupBoxProperties(groupBoxFontSet); + + _subtitle = subtitle; + + _textST = new TextST + { + StyleSegment = TextST.DialogStyleSegment.DefaultDialogStyleSegment, + PresentationSegments = new List(), + }; + _textST.StyleSegment.NumberOfDialogPresentationSegments = _subtitle.Paragraphs.Count; + foreach (var paragraph in _subtitle.Paragraphs) + { + var dps = new TextST.DialogPresentationSegment(paragraph, _textST.StyleSegment.RegionStyles[0]); + _textST.PresentationSegments.Add(dps); + } + + UpdateTreeview(); + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void ButtonImportClick(object sender, EventArgs e) + { + if (openFileDialog1.ShowDialog(this) == DialogResult.OK) + { + _textST = new TextST(); + if (!_textST.IsMine(null, openFileDialog1.FileName)) + { + MessageBox.Show("Not a valid TextST file"); + return; + } + _subtitle = new Subtitle(); + _fileName = openFileDialog1.FileName; + _textST.LoadSubtitle(_subtitle, null, _fileName); + groupBoxTextST.Text = "TextST structure: " + Path.GetFileName(_fileName); + UpdateTreeview(); + } + } + + private void UpdateTreeview() + { + treeView1.Nodes.Clear(); + treeView1.BeginUpdate(); + _rootNode = new TreeNode("TextST"); + treeView1.Nodes.Add(_rootNode); + if (_textST.StyleSegment != null) + { + var styleNode = new TreeNode("Style segment"); + _rootNode.Nodes.Add(styleNode); + + var regionStylesNode = new TreeNode(string.Format("Region styles ({0})", _textST.StyleSegment.RegionStyles.Count)); + styleNode.Nodes.Add(regionStylesNode); + foreach (TextST.RegionStyle regionStyle in _textST.StyleSegment.RegionStyles) + { + var regionStyleNode = new TreeNode("Region style") { Tag = regionStyle }; + regionStylesNode.Nodes.Add(regionStyleNode); + } + + var userStylesNode = new TreeNode(string.Format("User styles ({0})", _textST.StyleSegment.UserStyles.Count)); + styleNode.Nodes.Add(userStylesNode); + foreach (TextST.UserStyle userStyle in _textST.StyleSegment.UserStyles) + { + var regionStyleNode = new TreeNode("User style") { Tag = userStyle }; + userStylesNode.Nodes.Add(regionStyleNode); + } + + _palettesNode = new TreeNode(string.Format("Palettes ({0})", _textST.StyleSegment.Palettes.Count)) { Tag = _textST.StyleSegment.Palettes }; + styleNode.Nodes.Add(_palettesNode); + foreach (TextST.Palette palette in _textST.StyleSegment.Palettes) + { + var paletteNode = new TreeNode("Palette " + palette.PaletteEntryId) { Tag = palette }; + _palettesNode.Nodes.Add(paletteNode); + } + } + + if (_textST.PresentationSegments != null) + { + var presentationSegmentsNode = new TreeNode(string.Format("Presentation segments ({0})", _textST.PresentationSegments.Count)); + _rootNode.Nodes.Add(presentationSegmentsNode); + int count = 0; + foreach (var segment in _textST.PresentationSegments) + { + count++; + var presentationSegmentNode = new TreeNode(string.Format("Segment {0}: {1} -- > {2}", count, + new TimeCode(segment.StartPtsMilliseconds), new TimeCode(segment.EndPtsMilliseconds))) + { Tag = segment }; + presentationSegmentsNode.Nodes.Add(presentationSegmentNode); + + foreach (var subtitleRegion in segment.Regions) + { + var subtitleRegionNode = new TreeNode("Subtitle region") { Tag = subtitleRegion }; + presentationSegmentNode.Nodes.Add(subtitleRegionNode); + + foreach (var content in subtitleRegion.Content) + { + if (content is TextST.SubtitleRegionContentText) + { + var textContent = content as TextST.SubtitleRegionContentText; + var contentNode = new TreeNode(content.Name + ": " + textContent.Text) { Tag = content }; + subtitleRegionNode.Nodes.Add(contentNode); + } + else if (content is TextST.SubtitleRegionContentChangeFontStyle) + { + var fontStyleContent = content as TextST.SubtitleRegionContentChangeFontStyle; + var contentNode = new TreeNode(content.Name + ": " + GetNameFromFrontStyle(fontStyleContent.FontStyle)) { Tag = content }; + subtitleRegionNode.Nodes.Add(contentNode); + } + else + { + var contentNode = new TreeNode(content.Name) { Tag = content }; + subtitleRegionNode.Nodes.Add(contentNode); + } + } + } + } + } + treeView1.ExpandAll(); + treeView1.EndUpdate(); + treeView1.SelectedNode = _rootNode; + } + + private string GetNameFromFrontStyle(int fontStyle) + { + switch (fontStyle) + { + case 0: + return "Normal"; + case 1: + return "Bold"; + case 2: + return "Italic"; + case 3: + return "Bold and italic"; + case 4: + return "Outline-bordered"; + case 5: + return "Bold and outline-bordered"; + case 6: + return "Italic and outline-bordered"; + case 7: + return "Bold and italic and outline-bordered"; + default: + return "Unknown"; + } + } + + private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) + { + groupBoxPropertiesRoot.Visible = false; + groupBoxPropertiesPalette.Visible = false; + groupBoxPropertiesRegionStyle.Visible = false; + groupBoxPropertiesUserStyle.Visible = false; + groupBoxPresentationSegmentRegion.Visible = false; + groupBoxFontStyle.Visible = false; + groupBoxChangeFontSize.Visible = false; + groupBoxSubtitleText.Visible = false; + groupBoxChangeFontColor.Visible = false; + groupBoxFontSet.Visible = false; + if (e.Node != null && _textST != null) + { + _currentNode = e.Node; + if (e.Node == _rootNode) + { + groupBoxPropertiesRoot.Visible = true; + textBoxRoot.Text = "Number of region styles: " + _textST.StyleSegment.RegionStyles.Count + Environment.NewLine + + "Number of user styles: " + _textST.StyleSegment.UserStyles.Count + Environment.NewLine + + "Number of palettes: " + _textST.StyleSegment.Palettes.Count + Environment.NewLine + + "Number of subtitles: " + _textST.StyleSegment.NumberOfDialogPresentationSegments + Environment.NewLine; + } + else if (e.Node.Tag is TextST.Palette) + { + groupBoxPropertiesPalette.Visible = true; + _currentPalette = e.Node.Tag as TextST.Palette; + numericUpDownPaletteEntry.Value = _currentPalette.PaletteEntryId; + numericUpDownPaletteY.Value = _currentPalette.Y; + numericUpDownPaletteCr.Value = _currentPalette.Cr; + numericUpDownPaletteCb.Value = _currentPalette.Cb; + numericUpDownPaletteOpacity.Value = _currentPalette.T; + panelPaletteColor.BackColor = Color.FromArgb(255, _currentPalette.Color); + } + else if (e.Node.Tag is TextST.RegionStyle) + { + groupBoxPropertiesRegionStyle.Visible = true; + _currentRegionStyle = e.Node.Tag as TextST.RegionStyle; + numericUpDownRegionStyleId.Value = _currentRegionStyle.RegionStyleId; + numericUpDownRegionStyleHPos.Value = _currentRegionStyle.RegionHorizontalPosition; + numericUpDownRegionStyleVPos.Value = _currentRegionStyle.RegionVerticalPosition; + numericUpDownRegionStyleWidth.Value = _currentRegionStyle.RegionWidth; + numericUpDownRegionStyleHeight.Value = _currentRegionStyle.RegionHeight; + numericUpDownRegionStylePaletteEntryId.Value = _currentRegionStyle.RegionBgPaletteEntryIdRef; + numericUpDownRegionStyleTBHorPos.Value = _currentRegionStyle.TextBoxHorizontalPosition; + numericUpDownRegionStyleTBVerPos.Value = _currentRegionStyle.RegionVerticalPosition; + numericUpDownRegionStyleTBWidth.Value = _currentRegionStyle.TextBoxWidth; + numericUpDownRegionStyleTBHeight.Value = _currentRegionStyle.TextBoxHeight; + numericUpDownRegionStyleTextFlow.Value = _currentRegionStyle.TextFlow; + numericUpDownRegionStyleTextHorAlign.Value = _currentRegionStyle.TextHorizontalAlignment; + numericUpDownRegionStyleTextVerAlign.Value = _currentRegionStyle.TextVerticalAlignment; + numericUpDownRegionStyleLineSpace.Value = _currentRegionStyle.LineSpace; + numericUpDownRegionStyleFontIdRef.Value = _currentRegionStyle.FontIdRef; + numericUpDownRegionStyleFontStyle.Value = _currentRegionStyle.FontStyle; + numericUpDownRegionStyleFontSize.Value = _currentRegionStyle.FontSize; + numericUpDownRegionStyleFontPaletteId.Value = _currentRegionStyle.FontPaletteEntryIdRef; + numericUpDownRegionStyleFontOutlinePaletteId.Value = _currentRegionStyle.FontOutlinePaletteEntryIdRef; + numericUpDownRegionStyleFontOutlineThickness.Value = _currentRegionStyle.FontOutlineThickness; + } + else if (e.Node.Tag is TextST.UserStyle) + { + groupBoxPropertiesUserStyle.Visible = true; + _currentUserStyle = e.Node.Tag as TextST.UserStyle; + numericUpDownUserStyleId.Value = _currentUserStyle.UserStyleId; + numericUpDownUserStyleHorPosDir.Value = _currentUserStyle.RegionHorizontalPositionDirection; + numericUpDownUserStyleHorPosDelta.Value = _currentUserStyle.RegionHorizontalPositionDelta; + numericUpDownUserStyleVerPosDir.Value = _currentUserStyle.RegionVerticalPositionDirection; + numericUpDownUserStyleVerPosDelta.Value = _currentUserStyle.RegionVerticalPositionDelta; + numericUpDownUserStyleFontSizeIncDec.Value = _currentUserStyle.FontSizeIncDec; + numericUpDownUserStyleFontSizeDelta.Value = _currentUserStyle.FontSizeDelta; + numericUpDownUserStyleTBHorPosDir.Value = _currentUserStyle.TextBoxHorizontalPositionDirection; + numericUpDownUserStyleTBHorPosDelta.Value = _currentUserStyle.TextBoxHorizontalPositionDelta; + numericUpDownUserStyleTBVerPosDir.Value = _currentUserStyle.TextBoxVerticalPositionDirection; + numericUpDownUserStyleTBVerPosDelta.Value = _currentUserStyle.TextBoxVerticalPositionDelta; + numericUpDownUserStyleTBWidthIncDec.Value = _currentUserStyle.TextBoxWidthIncDec; + numericUpDownUserStyleTBWidthDelta.Value = _currentUserStyle.TextBoxWidthDelta; + numericUpDownUserStyleTBHeightIncDec.Value = _currentUserStyle.TextBoxHeightIncDec; + numericUpDownUserStyleTBHeightDelta.Value = _currentUserStyle.TextBoxHeightDelta; + numericUpDownUserStyleLineSpaceIncDec.Value = _currentUserStyle.LineSpaceIncDec; + numericUpDownUserStyleLineSpaceDelta.Value = _currentUserStyle.LineSpaceDelta; + } + else if (e.Node.Tag is TextST.SubtitleRegion) + { + groupBoxPresentationSegmentRegion.Visible = true; + _currentSubtitleRegion = e.Node.Tag as TextST.SubtitleRegion; + checkBoxSubRegionContinuous.Checked = _currentSubtitleRegion.ContinuousPresentation; + checkBoxSubRegionForced.Checked = _currentSubtitleRegion.Forced; + numericUpDownSubRegionStyleIdRef.Value = _currentSubtitleRegion.RegionStyleId; + } + else if (e.Node.Tag is TextST.SubtitleRegionContentChangeFontStyle) + { + groupBoxFontStyle.Visible = true; + _currentSubtitleFontStyle = e.Node.Tag as TextST.SubtitleRegionContentChangeFontStyle; + comboBoxChangeFontStyleFontStyle.SelectedIndex = _currentSubtitleFontStyle.FontStyle; + numericUpDownChangeFontStyleOutlinePaletteId.Value = _currentSubtitleFontStyle.FontOutlinePaletteId; + comboBoxChangeFontStyleOutlineThickness.SelectedIndex = _currentSubtitleFontStyle.FontOutlineThickness - 1; + } + else if (e.Node.Tag is TextST.SubtitleRegionContentChangeFontSize) + { + groupBoxChangeFontSize.Visible = true; + _currentSubtitleFontSize = e.Node.Tag as TextST.SubtitleRegionContentChangeFontSize; + numericUpDownChangeFontSize.Value = _currentSubtitleFontSize.FontSize; + } + else if (e.Node.Tag is TextST.SubtitleRegionContentText) + { + groupBoxSubtitleText.Visible = true; + _currentSubtitleText = e.Node.Tag as TextST.SubtitleRegionContentText; + textBoxSubtitleText.Text = _currentSubtitleText.Text; + } + else if (e.Node.Tag is TextST.SubtitleRegionContentChangeFontColor) + { + groupBoxChangeFontColor.Visible = true; + _currentSubtitleFontColor = e.Node.Tag as TextST.SubtitleRegionContentChangeFontColor; + numericUpDownChangeFontColor.Value = _currentSubtitleFontColor.FontPaletteId; + } + else if (e.Node.Tag is TextST.SubtitleRegionContentChangeFontSet) + { + groupBoxFontSet.Visible = true; + _currentSubtitleFontSet = e.Node.Tag as TextST.SubtitleRegionContentChangeFontSet; + numericUpDownFontSetFontId.Value = _currentSubtitleFontSet.FontId; + } + } + } + + private void buttonColor_Click(object sender, EventArgs e) + { + using (var colorChooser = new ColorChooser { Color = panelPaletteColor.BackColor, ShowAlpha = true }) + { + if (colorChooser.ShowDialog() == DialogResult.OK) + { + panelPaletteColor.BackColor = colorChooser.Color; + } + } + } + + private void buttonSaveAsPes_Click(object sender, EventArgs e) + { + saveFileDialog1.DefaultExt = ".textst"; + saveFileDialog1.FileName = string.Empty; + saveFileDialog1.Filter = "TextST files|*.textst"; + if (saveFileDialog1.ShowDialog(this) == DialogResult.OK) + { + using (var fs = new FileStream(saveFileDialog1.FileName, FileMode.Create)) + { + _textST.StyleSegment.WriteToStream(fs, _subtitle.Paragraphs.Count); + foreach (var presentationSegment in _textST.PresentationSegments) + { + presentationSegment.WriteToStream(fs); + } + } + MessageBox.Show("TextST PES packets saved as " + saveFileDialog1.FileName); + } + } + + private void buttonSaveAsM2ts_Click(object sender, EventArgs e) + { + //saveFileDialog1.DefaultExt = ".m2ts"; + //saveFileDialog1.FileName = string.Empty; + //saveFileDialog1.Filter = "m2ts files|*.m2ts"; + //if (saveFileDialog1.ShowDialog(this) == DialogResult.OK) + //{ + // using (var fs = new FileStream(saveFileDialog1.FileName, FileMode.Create)) + // { + + // } + // MessageBox.Show("TextST M2TS file saved as " + saveFileDialog1.FileName); + //} + } + + private int GetIntFromNumericUpDown(object sender) + { + var numericUpDown = sender as NumericUpDown; + if (numericUpDown != null) + { + return (int)numericUpDown.Value; + } + + return 0; + } + + private void numericUpDownRegionStyleId_ValueChanged(object sender, EventArgs e) + { + _currentRegionStyle.RegionStyleId = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownRegionStyleHPos_ValueChanged(object sender, EventArgs e) + { + _currentRegionStyle.RegionHorizontalPosition = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownRegionStyleVPos_ValueChanged(object sender, EventArgs e) + { + _currentRegionStyle.RegionVerticalPosition = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownRegionStyleWidth_ValueChanged(object sender, EventArgs e) + { + _currentRegionStyle.RegionWidth = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownRegionStyleHeight_ValueChanged(object sender, EventArgs e) + { + _currentRegionStyle.RegionHeight = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownRegionStylePaletteEntryId_ValueChanged(object sender, EventArgs e) + { + _currentRegionStyle.RegionBgPaletteEntryIdRef = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownRegionStyleTBHorPos_ValueChanged(object sender, EventArgs e) + { + _currentRegionStyle.TextBoxHorizontalPosition = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownRegionStyleTBVerPos_ValueChanged(object sender, EventArgs e) + { + _currentRegionStyle.TextBoxVerticalPosition = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownRegionStyleTBWidth_ValueChanged(object sender, EventArgs e) + { + _currentRegionStyle.TextBoxWidth = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownRegionStyleTBHeight_ValueChanged(object sender, EventArgs e) + { + _currentRegionStyle.TextBoxHeight = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownRegionStyleTextFlow_ValueChanged(object sender, EventArgs e) + { + _currentRegionStyle.TextFlow = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownRegionStyleTextHorAlign_ValueChanged(object sender, EventArgs e) + { + _currentRegionStyle.TextHorizontalAlignment = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownRegionStyleTextVerAlign_ValueChanged(object sender, EventArgs e) + { + _currentRegionStyle.TextVerticalAlignment = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownRegionStyleLineSpace_ValueChanged(object sender, EventArgs e) + { + _currentRegionStyle.LineSpace = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownRegionStyleFontIdRef_ValueChanged(object sender, EventArgs e) + { + _currentRegionStyle.FontIdRef = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownRegionStyleFontStyle_ValueChanged(object sender, EventArgs e) + { + _currentRegionStyle.FontStyle = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownRegionStyleFontSize_ValueChanged(object sender, EventArgs e) + { + _currentRegionStyle.FontSize = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownRegionStyleFontPaletteId_ValueChanged(object sender, EventArgs e) + { + _currentRegionStyle.FontPaletteEntryIdRef = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownRegionStyleFontOutlinePaletteId_ValueChanged(object sender, EventArgs e) + { + _currentRegionStyle.FontOutlinePaletteEntryIdRef = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownRegionStyleFontOutlineThickness_ValueChanged(object sender, EventArgs e) + { + _currentRegionStyle.FontOutlineThickness = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownUserStyleId_ValueChanged(object sender, EventArgs e) + { + _currentUserStyle.UserStyleId = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownUserStyleHorPosDir_ValueChanged(object sender, EventArgs e) + { + _currentUserStyle.RegionHorizontalPositionDirection = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownUserStyleHorPosDelta_ValueChanged(object sender, EventArgs e) + { + _currentUserStyle.RegionHorizontalPositionDelta = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownUserStyleVerPosDir_ValueChanged(object sender, EventArgs e) + { + _currentUserStyle.RegionVerticalPositionDirection = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownUserStyleVerPosDelta_ValueChanged(object sender, EventArgs e) + { + _currentUserStyle.RegionVerticalPositionDelta = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownUserStyleFontSizeIncDec_ValueChanged(object sender, EventArgs e) + { + _currentUserStyle.FontSizeIncDec = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownUserStyleFontSizeDelta_ValueChanged(object sender, EventArgs e) + { + _currentUserStyle.FontSizeDelta = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownUserStyleTBHorPosDir_ValueChanged(object sender, EventArgs e) + { + _currentUserStyle.TextBoxHorizontalPositionDirection = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownUserStyleTBHorPosDelta_ValueChanged(object sender, EventArgs e) + { + _currentUserStyle.TextBoxHorizontalPositionDelta = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownUserStyleTBVerPosDir_ValueChanged(object sender, EventArgs e) + { + _currentUserStyle.TextBoxVerticalPositionDirection = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownUserStyleTBVerPosDelta_ValueChanged(object sender, EventArgs e) + { + _currentUserStyle.TextBoxVerticalPositionDelta = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownUserStyleTBWidthIncDec_ValueChanged(object sender, EventArgs e) + { + _currentUserStyle.TextBoxWidthIncDec = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownUserStyleTBWidthDelta_ValueChanged(object sender, EventArgs e) + { + _currentUserStyle.TextBoxWidthDelta = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownUserStyleTBHeightIncDec_ValueChanged(object sender, EventArgs e) + { + _currentUserStyle.TextBoxHeightIncDec = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownUserStyleTBHeightDelta_ValueChanged(object sender, EventArgs e) + { + _currentUserStyle.TextBoxHeightDelta = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownUserStyleLineSpaceIncDec_ValueChanged(object sender, EventArgs e) + { + _currentUserStyle.LineSpaceIncDec = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownUserStyleLineSpaceDelta_ValueChanged(object sender, EventArgs e) + { + _currentUserStyle.LineSpaceDelta = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownPaletteEntry_ValueChanged(object sender, EventArgs e) + { + _currentPalette.PaletteEntryId = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownPaletteY_ValueChanged(object sender, EventArgs e) + { + _currentPalette.Y = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownPaletteCr_ValueChanged(object sender, EventArgs e) + { + _currentPalette.Cr = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownPaletteCb_ValueChanged(object sender, EventArgs e) + { + _currentPalette.Cb = GetIntFromNumericUpDown(sender); + } + + private void numericUpDownPaletteOpacity_ValueChanged(object sender, EventArgs e) + { + _currentPalette.T = GetIntFromNumericUpDown(sender); + } + + private void checkBoxSubRegionContinuous_CheckedChanged(object sender, EventArgs e) + { + _currentSubtitleRegion.ContinuousPresentation = (sender as CheckBox).Checked; + } + + private void checkBoxSubRegionForced_CheckedChanged(object sender, EventArgs e) + { + _currentSubtitleRegion.Forced = (sender as CheckBox).Checked; + } + + private void numericUpDownSubRegionStyleIdRef_ValueChanged(object sender, EventArgs e) + { + _currentSubtitleRegion.RegionStyleId = GetIntFromNumericUpDown(sender); + } + + private void treeView1_MouseUp(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Right) + { + var p = new Point(e.X, e.Y); + TreeNode node = treeView1.GetNodeAt(p); + if (node != null) + { + treeView1.SelectedNode = node; + if (node.Tag is List) + { + contextMenuStripAddPalette.Show(treeView1, p); + } + else if (node.Tag is TextST.SubtitleRegion) + { + contextMenuStripAddSubtitleContentFromSubRegion.Show(treeView1, p); + } + else if (node.Tag is TextST.SubtitleRegionContent) + { + contextMenuStripAddSubtitleContent.Show(treeView1, p); + } + else if (node.Tag is TextST.RegionStyle) + { + contextMenuStripRegionStyle.Show(treeView1, p); + } + } + } + } + + private void addPaletteToolStripMenuItem_Click(object sender, EventArgs e) + { + if (_textST.StyleSegment.Palettes.Count < 254) + { + int id = 1; + while (_textST.StyleSegment.Palettes.Any(p => p.PaletteEntryId == id)) + { + id++; + } + + var palette = new TextST.Palette + { + PaletteEntryId = id, + Y = 235, + Cr = 128, + Cb = 128, + T = 255 + }; + + _textST.StyleSegment.Palettes.Add(palette); + + var paletteNode = new TreeNode("Palette " + id) { Tag = palette }; + _palettesNode.Nodes.Add(paletteNode); + treeView1.SelectedNode = paletteNode; + } + } + + private void textBoxSubtitleText_TextChanged(object sender, EventArgs e) + { + _currentSubtitleText.Text = (sender as TextBox).Text; + _currentNode.Text = "Text: " + _currentSubtitleText.Text; + } + + private void numericUpDownChangeFontColor_ValueChanged(object sender, EventArgs e) + { + _currentSubtitleFontColor.FontPaletteId = GetIntFromNumericUpDown(sender); + } + + private List GetContentList(TextST.SubtitleRegionContent content) + { + foreach (var presentationSegment in _textST.PresentationSegments) + { + foreach (var region in presentationSegment.Regions) + { + if (region.Content.Contains(content)) + { + return region.Content; + } + } + } + return null; + } + + private void AddSubtitleContent(TextST.SubtitleRegionContent newContent, string title) + { + var content = _currentNode.Tag as TextST.SubtitleRegionContent; + if (content != null) + { + var list = GetContentList(content); + if (list != null) + { + var newNode = new TreeNode(title) { Tag = newContent }; + _currentNode.Parent.Nodes.Insert(_currentNode.Parent.Nodes.IndexOf(_currentNode) + 1, newNode); + int index = list.IndexOf(content); + list.Insert(index + 1, newContent); + treeView1.SelectedNode = newNode; + } + } + } + + private void addLineBreakToolStripMenuItem_Click(object sender, EventArgs e) + { + var newContent = new TextST.SubtitleRegionContentLineBreak(); + AddSubtitleContent(newContent, newContent.Name); + } + + private void addEndOfInlineStyleToolStripMenuItem_Click(object sender, EventArgs e) + { + var newContent = new TextST.SubtitleRegionContentEndOfInlineStyle(); + AddSubtitleContent(newContent, newContent.Name); + } + + private void addFontSizeToolStripMenuItem_Click(object sender, EventArgs e) + { + var newContent = new TextST.SubtitleRegionContentChangeFontSize { FontSize = 45 }; + AddSubtitleContent(newContent, newContent.Name); + } + + private void addFontSetToolStripMenuItem_Click(object sender, EventArgs e) + { + var newContent = new TextST.SubtitleRegionContentChangeFontSet(); + AddSubtitleContent(newContent, newContent.Name); + } + + private void addFontStyleToolStripMenuItem_Click(object sender, EventArgs e) + { + var newContent = new TextST.SubtitleRegionContentChangeFontStyle { FontStyle = 0, FontOutlinePaletteId = 0, FontOutlineThickness = 2 }; + AddSubtitleContent(newContent, newContent.Name); + } + + private void toolStripMenuItem1_Click(object sender, EventArgs e) + { + var newContent = new TextST.SubtitleRegionContentText(); + AddSubtitleContent(newContent, newContent.Name + ": "); + } + + private void deleteToolStripMenuItem_Click(object sender, EventArgs e) + { + var content = _currentNode.Tag as TextST.SubtitleRegionContent; + if (content != null) + { + var list = GetContentList(content); + if (list != null) + { + list.Remove(content); + _currentNode.Parent.Nodes.Remove(_currentNode); + } + } + } + + private void AddSubtitleContentFromRoot(TextST.SubtitleRegionContent newContent, string title) + { + var region = _currentNode.Tag as TextST.SubtitleRegion; + if (region != null) + { + var list = region.Content; + if (list != null) + { + var newNode = new TreeNode(title) { Tag = newContent }; + _currentNode.Nodes.Insert(0, newNode); + region.Content.Insert(0, newContent); + treeView1.SelectedNode = newNode; + } + } + } + + private void toolStripMenuItemRegionAddLineBreak_Click(object sender, EventArgs e) + { + var newContent = new TextST.SubtitleRegionContentLineBreak(); + AddSubtitleContentFromRoot(newContent, newContent.Name); + } + + private void toolStripMenuItemRegionAddText_Click(object sender, EventArgs e) + { + var newContent = new TextST.SubtitleRegionContentText(); + AddSubtitleContentFromRoot(newContent, newContent.Name + ": "); + } + + private void toolStripMenuItemRegionAddFontStyle_Click(object sender, EventArgs e) + { + var newContent = new TextST.SubtitleRegionContentChangeFontStyle { FontStyle = 0, FontOutlinePaletteId = 0, FontOutlineThickness = 2 }; + AddSubtitleContentFromRoot(newContent, newContent.Name); + } + + private void toolStripMenuItemRegionAddFontSize_Click(object sender, EventArgs e) + { + var newContent = new TextST.SubtitleRegionContentChangeFontSize { FontSize = 45 }; + AddSubtitleContentFromRoot(newContent, newContent.Name); + } + + private void toolStripMenuItemRegionAddInlineStyle_Click(object sender, EventArgs e) + { + var newContent = new TextST.SubtitleRegionContentEndOfInlineStyle(); + AddSubtitleContentFromRoot(newContent, newContent.Name); + } + + private void numericUpDownFontSetFontId_ValueChanged(object sender, EventArgs e) + { + _currentSubtitleFontSet.FontId = GetIntFromNumericUpDown(sender); + } + + private void toolStripMenuItemDuplicateRegionStyle_Click(object sender, EventArgs e) + { + var regionStyle = _currentNode.Tag as TextST.RegionStyle; + if (regionStyle != null) + { + int regionStyleId = 0; + foreach (var rs in _textST.StyleSegment.RegionStyles) + { + regionStyleId = Math.Max(regionStyleId, rs.RegionStyleId); + } + regionStyleId++; + + var newRegionStyle = new TextST.RegionStyle(regionStyle) { RegionStyleId = regionStyleId }; + _textST.StyleSegment.RegionStyles.Add(newRegionStyle); + var newNode = new TreeNode("Region style") { Tag = newRegionStyle }; + _currentNode.Parent.Nodes.Add(newNode); + _currentNode.Parent.Text = "Region styles (" + _textST.StyleSegment.RegionStyles.Count + ")"; + treeView1.SelectedNode = newNode; + } + } + + } +} diff --git a/src/Forms/ExportTextST.resx b/src/ui/Forms/ExportTextST.resx similarity index 98% rename from src/Forms/ExportTextST.resx rename to src/ui/Forms/ExportTextST.resx index 483d0d6c8..7634b3297 100644 --- a/src/Forms/ExportTextST.resx +++ b/src/ui/Forms/ExportTextST.resx @@ -1,141 +1,141 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - 184, 17 - - - 320, 17 - - - 475, 17 - - - 630, 17 - - - 974, 17 - - - 178 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 184, 17 + + + 320, 17 + + + 475, 17 + + + 630, 17 + + + 974, 17 + + + 178 + \ No newline at end of file diff --git a/src/Forms/ExtractDateTimeInfo.Designer.cs b/src/ui/Forms/ExtractDateTimeInfo.Designer.cs similarity index 98% rename from src/Forms/ExtractDateTimeInfo.Designer.cs rename to src/ui/Forms/ExtractDateTimeInfo.Designer.cs index 56d8818ee..bd831e314 100644 --- a/src/Forms/ExtractDateTimeInfo.Designer.cs +++ b/src/ui/Forms/ExtractDateTimeInfo.Designer.cs @@ -1,274 +1,274 @@ -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class ExtractDateTimeInfo - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - TimeCode timeCode1 = new TimeCode(); - TimeCode timeCode2 = new TimeCode(); - this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); - this.buttonOpenVideo = new System.Windows.Forms.Button(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.labelChooseVideoFile = new System.Windows.Forms.Label(); - this.comboBoxDateTimeFormats = new System.Windows.Forms.ComboBox(); - this.labelWriteFormat = new System.Windows.Forms.Label(); - this.labelVideoFileName = new System.Windows.Forms.Label(); - this.dateTimePicker1 = new System.Windows.Forms.DateTimePicker(); - this.labelStartFrom = new System.Windows.Forms.Label(); - this.labelExample = new System.Windows.Forms.Label(); - this.textBoxExample = new System.Windows.Forms.TextBox(); - this.labelDuration = new System.Windows.Forms.Label(); - this.timeUpDownDuration = new Nikse.SubtitleEdit.Controls.TimeUpDown(); - this.timeUpDownStartTime = new Nikse.SubtitleEdit.Controls.TimeUpDown(); - this.SuspendLayout(); - // - // openFileDialog1 - // - this.openFileDialog1.FileName = "openFileDialog1"; - // - // buttonOpenVideo - // - this.buttonOpenVideo.Location = new System.Drawing.Point(12, 29); - this.buttonOpenVideo.Name = "buttonOpenVideo"; - this.buttonOpenVideo.Size = new System.Drawing.Size(28, 22); - this.buttonOpenVideo.TabIndex = 1; - this.buttonOpenVideo.Text = "..."; - this.buttonOpenVideo.UseVisualStyleBackColor = true; - this.buttonOpenVideo.Click += new System.EventHandler(this.buttonOpenVideo_Click); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(303, 269); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 13; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(130, 269); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(167, 23); - this.buttonOK.TabIndex = 12; - this.buttonOK.Text = "&Generate subtitle"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // labelChooseVideoFile - // - this.labelChooseVideoFile.AutoSize = true; - this.labelChooseVideoFile.Location = new System.Drawing.Point(13, 13); - this.labelChooseVideoFile.Name = "labelChooseVideoFile"; - this.labelChooseVideoFile.Size = new System.Drawing.Size(226, 13); - this.labelChooseVideoFile.TabIndex = 0; - this.labelChooseVideoFile.Text = "Choose video file to extract date/time info from"; - // - // comboBoxDateTimeFormats - // - this.comboBoxDateTimeFormats.FormattingEnabled = true; - this.comboBoxDateTimeFormats.Items.AddRange(new object[] { - "M/d/yyyy hh:mm:ss ", - "M/d/yyyy
hh:mm:ss", - "F (Tuesday, April 10, 2012 9:15:07 PM)", - "dd MMM yyyy, HH:mm:ss (10 Apr 2012 21:15:07)", - "Current culture", - "hh:mm:ss", - "HH:mm:ss"}); - this.comboBoxDateTimeFormats.Location = new System.Drawing.Point(12, 153); - this.comboBoxDateTimeFormats.Name = "comboBoxDateTimeFormats"; - this.comboBoxDateTimeFormats.Size = new System.Drawing.Size(366, 21); - this.comboBoxDateTimeFormats.TabIndex = 9; - this.comboBoxDateTimeFormats.SelectedIndexChanged += new System.EventHandler(this.comboBoxDateTimeFormats_SelectedIndexChanged); - this.comboBoxDateTimeFormats.TextChanged += new System.EventHandler(this.comboBoxDateTimeFormats_TextChanged); - // - // labelWriteFormat - // - this.labelWriteFormat.AutoSize = true; - this.labelWriteFormat.Location = new System.Drawing.Point(12, 137); - this.labelWriteFormat.Name = "labelWriteFormat"; - this.labelWriteFormat.Size = new System.Drawing.Size(143, 13); - this.labelWriteFormat.TabIndex = 8; - this.labelWriteFormat.Text = "Date/time format write format"; - // - // labelVideoFileName - // - this.labelVideoFileName.AutoSize = true; - this.labelVideoFileName.Location = new System.Drawing.Point(44, 34); - this.labelVideoFileName.Name = "labelVideoFileName"; - this.labelVideoFileName.Size = new System.Drawing.Size(100, 13); - this.labelVideoFileName.TabIndex = 2; - this.labelVideoFileName.Text = "labelVideoFileName"; - // - // dateTimePicker1 - // - this.dateTimePicker1.CustomFormat = "yyyy-MM-dd"; - this.dateTimePicker1.Format = System.Windows.Forms.DateTimePickerFormat.Custom; - this.dateTimePicker1.Location = new System.Drawing.Point(12, 87); - this.dateTimePicker1.Name = "dateTimePicker1"; - this.dateTimePicker1.Size = new System.Drawing.Size(101, 20); - this.dateTimePicker1.TabIndex = 4; - // - // labelStartFrom - // - this.labelStartFrom.AutoSize = true; - this.labelStartFrom.Location = new System.Drawing.Point(13, 71); - this.labelStartFrom.Name = "labelStartFrom"; - this.labelStartFrom.Size = new System.Drawing.Size(52, 13); - this.labelStartFrom.TabIndex = 3; - this.labelStartFrom.Text = "Start from"; - // - // labelExample - // - this.labelExample.AutoSize = true; - this.labelExample.Location = new System.Drawing.Point(12, 188); - this.labelExample.Name = "labelExample"; - this.labelExample.Size = new System.Drawing.Size(47, 13); - this.labelExample.TabIndex = 10; - this.labelExample.Text = "Example"; - // - // textBoxExample - // - this.textBoxExample.BackColor = System.Drawing.SystemColors.MenuText; - this.textBoxExample.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.textBoxExample.ForeColor = System.Drawing.Color.White; - this.textBoxExample.Location = new System.Drawing.Point(12, 204); - this.textBoxExample.Multiline = true; - this.textBoxExample.Name = "textBoxExample"; - this.textBoxExample.Size = new System.Drawing.Size(366, 53); - this.textBoxExample.TabIndex = 11; - // - // labelDuration - // - this.labelDuration.AutoSize = true; - this.labelDuration.Location = new System.Drawing.Point(249, 70); - this.labelDuration.Name = "labelDuration"; - this.labelDuration.Size = new System.Drawing.Size(47, 13); - this.labelDuration.TabIndex = 6; - this.labelDuration.Text = "Duration"; - // - // timeUpDownDuration - // - this.timeUpDownDuration.AutoSize = true; - this.timeUpDownDuration.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.timeUpDownDuration.Font = new System.Drawing.Font("Segoe UI", 9F); - this.timeUpDownDuration.Location = new System.Drawing.Point(252, 87); - this.timeUpDownDuration.Margin = new System.Windows.Forms.Padding(4); - this.timeUpDownDuration.Name = "timeUpDownDuration"; - this.timeUpDownDuration.Size = new System.Drawing.Size(96, 27); - this.timeUpDownDuration.TabIndex = 7; - timeCode1.Hours = 0; - timeCode1.Milliseconds = 0; - timeCode1.Minutes = 0; - timeCode1.Seconds = 0; - timeCode1.TimeSpan = System.TimeSpan.Parse("00:00:00"); - timeCode1.TotalMilliseconds = 0D; - timeCode1.TotalSeconds = 0D; - this.timeUpDownDuration.TimeCode = timeCode1; - this.timeUpDownDuration.UseVideoOffset = false; - // - // timeUpDownStartTime - // - this.timeUpDownStartTime.AutoSize = true; - this.timeUpDownStartTime.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.timeUpDownStartTime.Font = new System.Drawing.Font("Segoe UI", 9F); - this.timeUpDownStartTime.Location = new System.Drawing.Point(118, 86); - this.timeUpDownStartTime.Margin = new System.Windows.Forms.Padding(4); - this.timeUpDownStartTime.Name = "timeUpDownStartTime"; - this.timeUpDownStartTime.Size = new System.Drawing.Size(96, 27); - this.timeUpDownStartTime.TabIndex = 5; - timeCode2.Hours = 0; - timeCode2.Milliseconds = 0; - timeCode2.Minutes = 0; - timeCode2.Seconds = 0; - timeCode2.TimeSpan = System.TimeSpan.Parse("00:00:00"); - timeCode2.TotalMilliseconds = 0D; - timeCode2.TotalSeconds = 0D; - this.timeUpDownStartTime.TimeCode = timeCode2; - this.timeUpDownStartTime.UseVideoOffset = false; - // - // ExtractDateTimeInfo - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(390, 302); - this.Controls.Add(this.timeUpDownDuration); - this.Controls.Add(this.labelDuration); - this.Controls.Add(this.timeUpDownStartTime); - this.Controls.Add(this.textBoxExample); - this.Controls.Add(this.labelExample); - this.Controls.Add(this.labelStartFrom); - this.Controls.Add(this.dateTimePicker1); - this.Controls.Add(this.labelVideoFileName); - this.Controls.Add(this.labelWriteFormat); - this.Controls.Add(this.comboBoxDateTimeFormats); - this.Controls.Add(this.labelChooseVideoFile); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.buttonOpenVideo); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "ExtractDateTimeInfo"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Extract date and time information"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ExtractDateTimeInfo_KeyDown); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.OpenFileDialog openFileDialog1; - private System.Windows.Forms.Button buttonOpenVideo; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Label labelChooseVideoFile; - private System.Windows.Forms.ComboBox comboBoxDateTimeFormats; - private System.Windows.Forms.Label labelWriteFormat; - private System.Windows.Forms.Label labelVideoFileName; - private System.Windows.Forms.DateTimePicker dateTimePicker1; - private System.Windows.Forms.Label labelStartFrom; - private System.Windows.Forms.Label labelExample; - private System.Windows.Forms.TextBox textBoxExample; - private Controls.TimeUpDown timeUpDownStartTime; - private System.Windows.Forms.Label labelDuration; - private Controls.TimeUpDown timeUpDownDuration; - } +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class ExtractDateTimeInfo + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + TimeCode timeCode1 = new TimeCode(); + TimeCode timeCode2 = new TimeCode(); + this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); + this.buttonOpenVideo = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.labelChooseVideoFile = new System.Windows.Forms.Label(); + this.comboBoxDateTimeFormats = new System.Windows.Forms.ComboBox(); + this.labelWriteFormat = new System.Windows.Forms.Label(); + this.labelVideoFileName = new System.Windows.Forms.Label(); + this.dateTimePicker1 = new System.Windows.Forms.DateTimePicker(); + this.labelStartFrom = new System.Windows.Forms.Label(); + this.labelExample = new System.Windows.Forms.Label(); + this.textBoxExample = new System.Windows.Forms.TextBox(); + this.labelDuration = new System.Windows.Forms.Label(); + this.timeUpDownDuration = new Nikse.SubtitleEdit.Controls.TimeUpDown(); + this.timeUpDownStartTime = new Nikse.SubtitleEdit.Controls.TimeUpDown(); + this.SuspendLayout(); + // + // openFileDialog1 + // + this.openFileDialog1.FileName = "openFileDialog1"; + // + // buttonOpenVideo + // + this.buttonOpenVideo.Location = new System.Drawing.Point(12, 29); + this.buttonOpenVideo.Name = "buttonOpenVideo"; + this.buttonOpenVideo.Size = new System.Drawing.Size(28, 22); + this.buttonOpenVideo.TabIndex = 1; + this.buttonOpenVideo.Text = "..."; + this.buttonOpenVideo.UseVisualStyleBackColor = true; + this.buttonOpenVideo.Click += new System.EventHandler(this.buttonOpenVideo_Click); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(303, 269); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 13; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(130, 269); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(167, 23); + this.buttonOK.TabIndex = 12; + this.buttonOK.Text = "&Generate subtitle"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // labelChooseVideoFile + // + this.labelChooseVideoFile.AutoSize = true; + this.labelChooseVideoFile.Location = new System.Drawing.Point(13, 13); + this.labelChooseVideoFile.Name = "labelChooseVideoFile"; + this.labelChooseVideoFile.Size = new System.Drawing.Size(226, 13); + this.labelChooseVideoFile.TabIndex = 0; + this.labelChooseVideoFile.Text = "Choose video file to extract date/time info from"; + // + // comboBoxDateTimeFormats + // + this.comboBoxDateTimeFormats.FormattingEnabled = true; + this.comboBoxDateTimeFormats.Items.AddRange(new object[] { + "M/d/yyyy hh:mm:ss ", + "M/d/yyyy
hh:mm:ss", + "F (Tuesday, April 10, 2012 9:15:07 PM)", + "dd MMM yyyy, HH:mm:ss (10 Apr 2012 21:15:07)", + "Current culture", + "hh:mm:ss", + "HH:mm:ss"}); + this.comboBoxDateTimeFormats.Location = new System.Drawing.Point(12, 153); + this.comboBoxDateTimeFormats.Name = "comboBoxDateTimeFormats"; + this.comboBoxDateTimeFormats.Size = new System.Drawing.Size(366, 21); + this.comboBoxDateTimeFormats.TabIndex = 9; + this.comboBoxDateTimeFormats.SelectedIndexChanged += new System.EventHandler(this.comboBoxDateTimeFormats_SelectedIndexChanged); + this.comboBoxDateTimeFormats.TextChanged += new System.EventHandler(this.comboBoxDateTimeFormats_TextChanged); + // + // labelWriteFormat + // + this.labelWriteFormat.AutoSize = true; + this.labelWriteFormat.Location = new System.Drawing.Point(12, 137); + this.labelWriteFormat.Name = "labelWriteFormat"; + this.labelWriteFormat.Size = new System.Drawing.Size(143, 13); + this.labelWriteFormat.TabIndex = 8; + this.labelWriteFormat.Text = "Date/time format write format"; + // + // labelVideoFileName + // + this.labelVideoFileName.AutoSize = true; + this.labelVideoFileName.Location = new System.Drawing.Point(44, 34); + this.labelVideoFileName.Name = "labelVideoFileName"; + this.labelVideoFileName.Size = new System.Drawing.Size(100, 13); + this.labelVideoFileName.TabIndex = 2; + this.labelVideoFileName.Text = "labelVideoFileName"; + // + // dateTimePicker1 + // + this.dateTimePicker1.CustomFormat = "yyyy-MM-dd"; + this.dateTimePicker1.Format = System.Windows.Forms.DateTimePickerFormat.Custom; + this.dateTimePicker1.Location = new System.Drawing.Point(12, 87); + this.dateTimePicker1.Name = "dateTimePicker1"; + this.dateTimePicker1.Size = new System.Drawing.Size(101, 20); + this.dateTimePicker1.TabIndex = 4; + // + // labelStartFrom + // + this.labelStartFrom.AutoSize = true; + this.labelStartFrom.Location = new System.Drawing.Point(13, 71); + this.labelStartFrom.Name = "labelStartFrom"; + this.labelStartFrom.Size = new System.Drawing.Size(52, 13); + this.labelStartFrom.TabIndex = 3; + this.labelStartFrom.Text = "Start from"; + // + // labelExample + // + this.labelExample.AutoSize = true; + this.labelExample.Location = new System.Drawing.Point(12, 188); + this.labelExample.Name = "labelExample"; + this.labelExample.Size = new System.Drawing.Size(47, 13); + this.labelExample.TabIndex = 10; + this.labelExample.Text = "Example"; + // + // textBoxExample + // + this.textBoxExample.BackColor = System.Drawing.SystemColors.MenuText; + this.textBoxExample.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.textBoxExample.ForeColor = System.Drawing.Color.White; + this.textBoxExample.Location = new System.Drawing.Point(12, 204); + this.textBoxExample.Multiline = true; + this.textBoxExample.Name = "textBoxExample"; + this.textBoxExample.Size = new System.Drawing.Size(366, 53); + this.textBoxExample.TabIndex = 11; + // + // labelDuration + // + this.labelDuration.AutoSize = true; + this.labelDuration.Location = new System.Drawing.Point(249, 70); + this.labelDuration.Name = "labelDuration"; + this.labelDuration.Size = new System.Drawing.Size(47, 13); + this.labelDuration.TabIndex = 6; + this.labelDuration.Text = "Duration"; + // + // timeUpDownDuration + // + this.timeUpDownDuration.AutoSize = true; + this.timeUpDownDuration.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.timeUpDownDuration.Font = new System.Drawing.Font("Segoe UI", 9F); + this.timeUpDownDuration.Location = new System.Drawing.Point(252, 87); + this.timeUpDownDuration.Margin = new System.Windows.Forms.Padding(4); + this.timeUpDownDuration.Name = "timeUpDownDuration"; + this.timeUpDownDuration.Size = new System.Drawing.Size(96, 27); + this.timeUpDownDuration.TabIndex = 7; + timeCode1.Hours = 0; + timeCode1.Milliseconds = 0; + timeCode1.Minutes = 0; + timeCode1.Seconds = 0; + timeCode1.TimeSpan = System.TimeSpan.Parse("00:00:00"); + timeCode1.TotalMilliseconds = 0D; + timeCode1.TotalSeconds = 0D; + this.timeUpDownDuration.TimeCode = timeCode1; + this.timeUpDownDuration.UseVideoOffset = false; + // + // timeUpDownStartTime + // + this.timeUpDownStartTime.AutoSize = true; + this.timeUpDownStartTime.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.timeUpDownStartTime.Font = new System.Drawing.Font("Segoe UI", 9F); + this.timeUpDownStartTime.Location = new System.Drawing.Point(118, 86); + this.timeUpDownStartTime.Margin = new System.Windows.Forms.Padding(4); + this.timeUpDownStartTime.Name = "timeUpDownStartTime"; + this.timeUpDownStartTime.Size = new System.Drawing.Size(96, 27); + this.timeUpDownStartTime.TabIndex = 5; + timeCode2.Hours = 0; + timeCode2.Milliseconds = 0; + timeCode2.Minutes = 0; + timeCode2.Seconds = 0; + timeCode2.TimeSpan = System.TimeSpan.Parse("00:00:00"); + timeCode2.TotalMilliseconds = 0D; + timeCode2.TotalSeconds = 0D; + this.timeUpDownStartTime.TimeCode = timeCode2; + this.timeUpDownStartTime.UseVideoOffset = false; + // + // ExtractDateTimeInfo + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(390, 302); + this.Controls.Add(this.timeUpDownDuration); + this.Controls.Add(this.labelDuration); + this.Controls.Add(this.timeUpDownStartTime); + this.Controls.Add(this.textBoxExample); + this.Controls.Add(this.labelExample); + this.Controls.Add(this.labelStartFrom); + this.Controls.Add(this.dateTimePicker1); + this.Controls.Add(this.labelVideoFileName); + this.Controls.Add(this.labelWriteFormat); + this.Controls.Add(this.comboBoxDateTimeFormats); + this.Controls.Add(this.labelChooseVideoFile); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.buttonOpenVideo); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "ExtractDateTimeInfo"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Extract date and time information"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ExtractDateTimeInfo_KeyDown); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.OpenFileDialog openFileDialog1; + private System.Windows.Forms.Button buttonOpenVideo; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Label labelChooseVideoFile; + private System.Windows.Forms.ComboBox comboBoxDateTimeFormats; + private System.Windows.Forms.Label labelWriteFormat; + private System.Windows.Forms.Label labelVideoFileName; + private System.Windows.Forms.DateTimePicker dateTimePicker1; + private System.Windows.Forms.Label labelStartFrom; + private System.Windows.Forms.Label labelExample; + private System.Windows.Forms.TextBox textBoxExample; + private Controls.TimeUpDown timeUpDownStartTime; + private System.Windows.Forms.Label labelDuration; + private Controls.TimeUpDown timeUpDownDuration; + } } \ No newline at end of file diff --git a/src/Forms/ExtractDateTimeInfo.cs b/src/ui/Forms/ExtractDateTimeInfo.cs similarity index 97% rename from src/Forms/ExtractDateTimeInfo.cs rename to src/ui/Forms/ExtractDateTimeInfo.cs index 5d45e1027..7fc93a4f6 100644 --- a/src/Forms/ExtractDateTimeInfo.cs +++ b/src/ui/Forms/ExtractDateTimeInfo.cs @@ -1,150 +1,150 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.ContainerFormats.Mp4; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class ExtractDateTimeInfo : PositionAndSizeForm - { - public Subtitle DateTimeSubtitle { get; private set; } - public string VideoFileName { get; private set; } - private readonly List _formats = new List(); - - public ExtractDateTimeInfo() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - comboBoxDateTimeFormats.SelectedIndex = 0; - labelVideoFileName.Text = string.Empty; - timeUpDownStartTime.TimeCode = new TimeCode(); - timeUpDownDuration.TimeCode = new TimeCode(1, 0, 0, 0); - comboBoxDateTimeFormats.Items.Clear(); - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - foreach (string format in Configuration.Settings.Tools.GenerateTimeCodePatterns.Split(';')) - { - _formats.Add(format); - comboBoxDateTimeFormats.Items.Add(format); - } - if (_formats.Count > 0) - { - comboBoxDateTimeFormats.SelectedIndex = 0; - } - - var l = Configuration.Settings.Language.ExtractDateTimeInfo; - Text = l.Title; - labelChooseVideoFile.Text = l.OpenVideoFile; - labelStartFrom.Text = l.StartFrom; - labelDuration.Text = Configuration.Settings.Language.General.Duration; - labelExample.Text = l.Example; - buttonOK.Text = l.GenerateSubtitle; - labelWriteFormat.Text = l.DateTimeFormat; - } - - private static string DecodeFormat(DateTime dateTime, string format) - { - try - { - var sb = new StringBuilder(); - foreach (string s in format.Replace("
", "|").Replace("
", "|").Replace("
", "|").Replace("
", "|").Replace("
", "|").Replace("
", "|").Split('|')) - { - sb.AppendLine(dateTime.ToString(s)); - } - return sb.ToString().Trim(); - } - catch - { - return "Error"; - } - } - - private void buttonOpenVideo_Click(object sender, EventArgs e) - { - if (openFileDialog1.ShowDialog(this) == DialogResult.OK) - { - VideoFileName = openFileDialog1.FileName; - labelVideoFileName.Text = VideoFileName; - - DateTime start; - double durationInSeconds; - string ext = Path.GetExtension(VideoFileName).ToLowerInvariant(); - if (ext == ".mp4" || ext == ".m4v" || ext == ".3gp") - { - MP4Parser mp4Parser = new MP4Parser(VideoFileName); - start = mp4Parser.CreationDate; - durationInSeconds = mp4Parser.Duration.TotalSeconds; - } - else - { - var fi = new FileInfo(VideoFileName); - start = fi.CreationTime; - VideoInfo vi = UiUtil.GetVideoInfo(VideoFileName); - durationInSeconds = vi.TotalMilliseconds / TimeCode.BaseUnit; - if (durationInSeconds < 1) - { - MessageBox.Show("Unable to get duration"); - durationInSeconds = 60 * 60; - } - } - dateTimePicker1.Value = start; - timeUpDownStartTime.TimeCode = new TimeCode(start.Hour, start.Minute, start.Second, start.Millisecond); - timeUpDownDuration.TimeCode = TimeCode.FromSeconds(durationInSeconds); - } - } - - private DateTime GetStartDateTime() - { - return new DateTime(dateTimePicker1.Value.Year, dateTimePicker1.Value.Month, dateTimePicker1.Value.Day, - timeUpDownStartTime.TimeCode.Hours, timeUpDownStartTime.TimeCode.Minutes, - timeUpDownStartTime.TimeCode.Seconds, timeUpDownStartTime.TimeCode.Milliseconds); - } - - private void buttonOK_Click(object sender, EventArgs e) - { - DateTimeSubtitle = new Subtitle(); - DateTime start = GetStartDateTime(); - double durationInSeconds = timeUpDownDuration.TimeCode.TotalSeconds; - for (int i = 0; i < durationInSeconds; i++) - { - Paragraph p = new Paragraph(); - p.Text = FormatDateTime(start); - start = start.AddSeconds(1); - p.StartTime = TimeCode.FromSeconds(i); - p.EndTime = TimeCode.FromSeconds(i + 0.999); - DateTimeSubtitle.Paragraphs.Add(p); - } - DialogResult = DialogResult.OK; - } - - private string FormatDateTime(DateTime dt) - { - return DecodeFormat(dt, comboBoxDateTimeFormats.Text); - } - - private void comboBoxDateTimeFormats_SelectedIndexChanged(object sender, EventArgs e) - { - textBoxExample.Text = FormatDateTime(DateTime.Now); - } - - private void comboBoxDateTimeFormats_TextChanged(object sender, EventArgs e) - { - textBoxExample.Text = FormatDateTime(DateTime.Now); - } - - private void ExtractDateTimeInfo_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - e.SuppressKeyPress = true; - DialogResult = DialogResult.Cancel; - } - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.ContainerFormats.Mp4; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class ExtractDateTimeInfo : PositionAndSizeForm + { + public Subtitle DateTimeSubtitle { get; private set; } + public string VideoFileName { get; private set; } + private readonly List _formats = new List(); + + public ExtractDateTimeInfo() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + comboBoxDateTimeFormats.SelectedIndex = 0; + labelVideoFileName.Text = string.Empty; + timeUpDownStartTime.TimeCode = new TimeCode(); + timeUpDownDuration.TimeCode = new TimeCode(1, 0, 0, 0); + comboBoxDateTimeFormats.Items.Clear(); + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + foreach (string format in Configuration.Settings.Tools.GenerateTimeCodePatterns.Split(';')) + { + _formats.Add(format); + comboBoxDateTimeFormats.Items.Add(format); + } + if (_formats.Count > 0) + { + comboBoxDateTimeFormats.SelectedIndex = 0; + } + + var l = Configuration.Settings.Language.ExtractDateTimeInfo; + Text = l.Title; + labelChooseVideoFile.Text = l.OpenVideoFile; + labelStartFrom.Text = l.StartFrom; + labelDuration.Text = Configuration.Settings.Language.General.Duration; + labelExample.Text = l.Example; + buttonOK.Text = l.GenerateSubtitle; + labelWriteFormat.Text = l.DateTimeFormat; + } + + private static string DecodeFormat(DateTime dateTime, string format) + { + try + { + var sb = new StringBuilder(); + foreach (string s in format.Replace("
", "|").Replace("
", "|").Replace("
", "|").Replace("
", "|").Replace("
", "|").Replace("
", "|").Split('|')) + { + sb.AppendLine(dateTime.ToString(s)); + } + return sb.ToString().Trim(); + } + catch + { + return "Error"; + } + } + + private void buttonOpenVideo_Click(object sender, EventArgs e) + { + if (openFileDialog1.ShowDialog(this) == DialogResult.OK) + { + VideoFileName = openFileDialog1.FileName; + labelVideoFileName.Text = VideoFileName; + + DateTime start; + double durationInSeconds; + string ext = Path.GetExtension(VideoFileName).ToLowerInvariant(); + if (ext == ".mp4" || ext == ".m4v" || ext == ".3gp") + { + MP4Parser mp4Parser = new MP4Parser(VideoFileName); + start = mp4Parser.CreationDate; + durationInSeconds = mp4Parser.Duration.TotalSeconds; + } + else + { + var fi = new FileInfo(VideoFileName); + start = fi.CreationTime; + VideoInfo vi = UiUtil.GetVideoInfo(VideoFileName); + durationInSeconds = vi.TotalMilliseconds / TimeCode.BaseUnit; + if (durationInSeconds < 1) + { + MessageBox.Show("Unable to get duration"); + durationInSeconds = 60 * 60; + } + } + dateTimePicker1.Value = start; + timeUpDownStartTime.TimeCode = new TimeCode(start.Hour, start.Minute, start.Second, start.Millisecond); + timeUpDownDuration.TimeCode = TimeCode.FromSeconds(durationInSeconds); + } + } + + private DateTime GetStartDateTime() + { + return new DateTime(dateTimePicker1.Value.Year, dateTimePicker1.Value.Month, dateTimePicker1.Value.Day, + timeUpDownStartTime.TimeCode.Hours, timeUpDownStartTime.TimeCode.Minutes, + timeUpDownStartTime.TimeCode.Seconds, timeUpDownStartTime.TimeCode.Milliseconds); + } + + private void buttonOK_Click(object sender, EventArgs e) + { + DateTimeSubtitle = new Subtitle(); + DateTime start = GetStartDateTime(); + double durationInSeconds = timeUpDownDuration.TimeCode.TotalSeconds; + for (int i = 0; i < durationInSeconds; i++) + { + Paragraph p = new Paragraph(); + p.Text = FormatDateTime(start); + start = start.AddSeconds(1); + p.StartTime = TimeCode.FromSeconds(i); + p.EndTime = TimeCode.FromSeconds(i + 0.999); + DateTimeSubtitle.Paragraphs.Add(p); + } + DialogResult = DialogResult.OK; + } + + private string FormatDateTime(DateTime dt) + { + return DecodeFormat(dt, comboBoxDateTimeFormats.Text); + } + + private void comboBoxDateTimeFormats_SelectedIndexChanged(object sender, EventArgs e) + { + textBoxExample.Text = FormatDateTime(DateTime.Now); + } + + private void comboBoxDateTimeFormats_TextChanged(object sender, EventArgs e) + { + textBoxExample.Text = FormatDateTime(DateTime.Now); + } + + private void ExtractDateTimeInfo_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + e.SuppressKeyPress = true; + DialogResult = DialogResult.Cancel; + } + } + + } +} diff --git a/src/Forms/ExtractDateTimeInfo.resx b/src/ui/Forms/ExtractDateTimeInfo.resx similarity index 97% rename from src/Forms/ExtractDateTimeInfo.resx rename to src/ui/Forms/ExtractDateTimeInfo.resx index 3a7d67153..9bad2f599 100644 --- a/src/Forms/ExtractDateTimeInfo.resx +++ b/src/ui/Forms/ExtractDateTimeInfo.resx @@ -1,123 +1,123 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + \ No newline at end of file diff --git a/src/Forms/FcpProperties.Designer.cs b/src/ui/Forms/FcpProperties.Designer.cs similarity index 97% rename from src/Forms/FcpProperties.Designer.cs rename to src/ui/Forms/FcpProperties.Designer.cs index c9ed2caf0..c4a95429d 100644 --- a/src/Forms/FcpProperties.Designer.cs +++ b/src/ui/Forms/FcpProperties.Designer.cs @@ -1,152 +1,152 @@ -namespace Nikse.SubtitleEdit.Forms -{ - partial class FcpProperties - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.groupBoxFont = new System.Windows.Forms.GroupBox(); - this.textBoxFontName = new System.Windows.Forms.TextBox(); - this.labelFontName = new System.Windows.Forms.Label(); - this.numericUpDownFontSize = new System.Windows.Forms.NumericUpDown(); - this.labelFontSize = new System.Windows.Forms.Label(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.groupBoxFont.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownFontSize)).BeginInit(); - this.SuspendLayout(); - // - // groupBoxFont - // - this.groupBoxFont.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxFont.Controls.Add(this.textBoxFontName); - this.groupBoxFont.Controls.Add(this.labelFontName); - this.groupBoxFont.Controls.Add(this.numericUpDownFontSize); - this.groupBoxFont.Controls.Add(this.labelFontSize); - this.groupBoxFont.Location = new System.Drawing.Point(12, 12); - this.groupBoxFont.Name = "groupBoxFont"; - this.groupBoxFont.Size = new System.Drawing.Size(439, 116); - this.groupBoxFont.TabIndex = 0; - this.groupBoxFont.TabStop = false; - this.groupBoxFont.Text = "Font"; - // - // textBoxFontName - // - this.textBoxFontName.Location = new System.Drawing.Point(133, 28); - this.textBoxFontName.Name = "textBoxFontName"; - this.textBoxFontName.Size = new System.Drawing.Size(197, 20); - this.textBoxFontName.TabIndex = 1; - // - // labelFontName - // - this.labelFontName.AutoSize = true; - this.labelFontName.Location = new System.Drawing.Point(9, 35); - this.labelFontName.Name = "labelFontName"; - this.labelFontName.Size = new System.Drawing.Size(35, 13); - this.labelFontName.TabIndex = 0; - this.labelFontName.Text = "Name"; - // - // numericUpDownFontSize - // - this.numericUpDownFontSize.Location = new System.Drawing.Point(133, 54); - this.numericUpDownFontSize.Maximum = new decimal(new int[] { - 200, - 0, - 0, - 0}); - this.numericUpDownFontSize.Name = "numericUpDownFontSize"; - this.numericUpDownFontSize.Size = new System.Drawing.Size(112, 20); - this.numericUpDownFontSize.TabIndex = 3; - // - // labelFontSize - // - this.labelFontSize.AutoSize = true; - this.labelFontSize.Location = new System.Drawing.Point(9, 61); - this.labelFontSize.Name = "labelFontSize"; - this.labelFontSize.Size = new System.Drawing.Size(27, 13); - this.labelFontSize.TabIndex = 2; - this.labelFontSize.Text = "Size"; - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(376, 134); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 2; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(295, 134); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 1; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // FcpProperties - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(463, 167); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.groupBoxFont); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.Name = "FcpProperties"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Fincal Cut Pro XML - Properties"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FcpProperties_KeyDown); - this.groupBoxFont.ResumeLayout(false); - this.groupBoxFont.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownFontSize)).EndInit(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.GroupBox groupBoxFont; - private System.Windows.Forms.NumericUpDown numericUpDownFontSize; - private System.Windows.Forms.Label labelFontSize; - private System.Windows.Forms.TextBox textBoxFontName; - private System.Windows.Forms.Label labelFontName; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonOK; - } +namespace Nikse.SubtitleEdit.Forms +{ + partial class FcpProperties + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.groupBoxFont = new System.Windows.Forms.GroupBox(); + this.textBoxFontName = new System.Windows.Forms.TextBox(); + this.labelFontName = new System.Windows.Forms.Label(); + this.numericUpDownFontSize = new System.Windows.Forms.NumericUpDown(); + this.labelFontSize = new System.Windows.Forms.Label(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.groupBoxFont.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownFontSize)).BeginInit(); + this.SuspendLayout(); + // + // groupBoxFont + // + this.groupBoxFont.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxFont.Controls.Add(this.textBoxFontName); + this.groupBoxFont.Controls.Add(this.labelFontName); + this.groupBoxFont.Controls.Add(this.numericUpDownFontSize); + this.groupBoxFont.Controls.Add(this.labelFontSize); + this.groupBoxFont.Location = new System.Drawing.Point(12, 12); + this.groupBoxFont.Name = "groupBoxFont"; + this.groupBoxFont.Size = new System.Drawing.Size(439, 116); + this.groupBoxFont.TabIndex = 0; + this.groupBoxFont.TabStop = false; + this.groupBoxFont.Text = "Font"; + // + // textBoxFontName + // + this.textBoxFontName.Location = new System.Drawing.Point(133, 28); + this.textBoxFontName.Name = "textBoxFontName"; + this.textBoxFontName.Size = new System.Drawing.Size(197, 20); + this.textBoxFontName.TabIndex = 1; + // + // labelFontName + // + this.labelFontName.AutoSize = true; + this.labelFontName.Location = new System.Drawing.Point(9, 35); + this.labelFontName.Name = "labelFontName"; + this.labelFontName.Size = new System.Drawing.Size(35, 13); + this.labelFontName.TabIndex = 0; + this.labelFontName.Text = "Name"; + // + // numericUpDownFontSize + // + this.numericUpDownFontSize.Location = new System.Drawing.Point(133, 54); + this.numericUpDownFontSize.Maximum = new decimal(new int[] { + 200, + 0, + 0, + 0}); + this.numericUpDownFontSize.Name = "numericUpDownFontSize"; + this.numericUpDownFontSize.Size = new System.Drawing.Size(112, 20); + this.numericUpDownFontSize.TabIndex = 3; + // + // labelFontSize + // + this.labelFontSize.AutoSize = true; + this.labelFontSize.Location = new System.Drawing.Point(9, 61); + this.labelFontSize.Name = "labelFontSize"; + this.labelFontSize.Size = new System.Drawing.Size(27, 13); + this.labelFontSize.TabIndex = 2; + this.labelFontSize.Text = "Size"; + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(376, 134); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 2; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(295, 134); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 1; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // FcpProperties + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(463, 167); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.groupBoxFont); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.Name = "FcpProperties"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Fincal Cut Pro XML - Properties"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FcpProperties_KeyDown); + this.groupBoxFont.ResumeLayout(false); + this.groupBoxFont.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownFontSize)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBoxFont; + private System.Windows.Forms.NumericUpDown numericUpDownFontSize; + private System.Windows.Forms.Label labelFontSize; + private System.Windows.Forms.TextBox textBoxFontName; + private System.Windows.Forms.Label labelFontName; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + } } \ No newline at end of file diff --git a/src/Forms/FcpProperties.cs b/src/ui/Forms/FcpProperties.cs similarity index 96% rename from src/Forms/FcpProperties.cs rename to src/ui/Forms/FcpProperties.cs index f8710975e..57ba02c41 100644 --- a/src/Forms/FcpProperties.cs +++ b/src/ui/Forms/FcpProperties.cs @@ -1,50 +1,50 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public partial class FcpProperties : PositionAndSizeForm - { - public int FcpFontSize { get; set; } - public string FcpFontName { get; set; } - - public FcpProperties() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - textBoxFontName.Text = Configuration.Settings.SubtitleSettings.FcpFontName; - try - { - numericUpDownFontSize.Value = Configuration.Settings.SubtitleSettings.FcpFontSize; - } - catch - { - numericUpDownFontSize.Value = 18; - } - } - - private void buttonOK_Click(object sender, EventArgs e) - { - FcpFontName = textBoxFontName.Text; - FcpFontSize = (int)numericUpDownFontSize.Value; - DialogResult = DialogResult.OK; - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private void FcpProperties_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public partial class FcpProperties : PositionAndSizeForm + { + public int FcpFontSize { get; set; } + public string FcpFontName { get; set; } + + public FcpProperties() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + textBoxFontName.Text = Configuration.Settings.SubtitleSettings.FcpFontName; + try + { + numericUpDownFontSize.Value = Configuration.Settings.SubtitleSettings.FcpFontSize; + } + catch + { + numericUpDownFontSize.Value = 18; + } + } + + private void buttonOK_Click(object sender, EventArgs e) + { + FcpFontName = textBoxFontName.Text; + FcpFontSize = (int)numericUpDownFontSize.Value; + DialogResult = DialogResult.OK; + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void FcpProperties_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + } +} diff --git a/src/Forms/Ocr/DownloadTesseract302.resx b/src/ui/Forms/FcpProperties.resx similarity index 100% rename from src/Forms/Ocr/DownloadTesseract302.resx rename to src/ui/Forms/FcpProperties.resx diff --git a/src/Forms/FindDialog.Designer.cs b/src/ui/Forms/FindDialog.Designer.cs similarity index 98% rename from src/Forms/FindDialog.Designer.cs rename to src/ui/Forms/FindDialog.Designer.cs index e393e3ff4..d0ee2c2ff 100644 --- a/src/Forms/FindDialog.Designer.cs +++ b/src/ui/Forms/FindDialog.Designer.cs @@ -1,190 +1,190 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class FindDialog - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.textBoxFind = new System.Windows.Forms.TextBox(); - this.buttonFind = new System.Windows.Forms.Button(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.radioButtonNormal = new System.Windows.Forms.RadioButton(); - this.radioButtonCaseSensitive = new System.Windows.Forms.RadioButton(); - this.radioButtonRegEx = new System.Windows.Forms.RadioButton(); - this.comboBoxFind = new System.Windows.Forms.ComboBox(); - this.buttonCount = new System.Windows.Forms.Button(); - this.labelCount = new System.Windows.Forms.Label(); - this.checkBoxWholeWord = new System.Windows.Forms.CheckBox(); - this.SuspendLayout(); - // - // textBoxFind - // - this.textBoxFind.Location = new System.Drawing.Point(12, 12); - this.textBoxFind.Name = "textBoxFind"; - this.textBoxFind.Size = new System.Drawing.Size(189, 21); - this.textBoxFind.TabIndex = 0; - this.textBoxFind.TextChanged += new System.EventHandler(this.textBoxFind_TextChanged); - this.textBoxFind.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxFind_KeyDown); - // - // buttonFind - // - this.buttonFind.Location = new System.Drawing.Point(207, 11); - this.buttonFind.Name = "buttonFind"; - this.buttonFind.Size = new System.Drawing.Size(89, 23); - this.buttonFind.TabIndex = 1; - this.buttonFind.Text = "Find"; - this.buttonFind.UseVisualStyleBackColor = true; - this.buttonFind.Click += new System.EventHandler(this.ButtonFind_Click); - // - // buttonCancel - // - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.Location = new System.Drawing.Point(207, 69); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(89, 23); - this.buttonCancel.TabIndex = 3; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - // - // radioButtonNormal - // - this.radioButtonNormal.AutoSize = true; - this.radioButtonNormal.Checked = true; - this.radioButtonNormal.Location = new System.Drawing.Point(12, 63); - this.radioButtonNormal.Name = "radioButtonNormal"; - this.radioButtonNormal.Size = new System.Drawing.Size(58, 17); - this.radioButtonNormal.TabIndex = 5; - this.radioButtonNormal.TabStop = true; - this.radioButtonNormal.Text = "Normal"; - this.radioButtonNormal.UseVisualStyleBackColor = true; - this.radioButtonNormal.CheckedChanged += new System.EventHandler(this.RadioButton_CheckedChanged); - // - // radioButtonCaseSensitive - // - this.radioButtonCaseSensitive.AutoSize = true; - this.radioButtonCaseSensitive.Location = new System.Drawing.Point(12, 86); - this.radioButtonCaseSensitive.Name = "radioButtonCaseSensitive"; - this.radioButtonCaseSensitive.Size = new System.Drawing.Size(94, 17); - this.radioButtonCaseSensitive.TabIndex = 7; - this.radioButtonCaseSensitive.Text = "Case sensitive"; - this.radioButtonCaseSensitive.UseVisualStyleBackColor = true; - this.radioButtonCaseSensitive.CheckedChanged += new System.EventHandler(this.RadioButton_CheckedChanged); - // - // radioButtonRegEx - // - this.radioButtonRegEx.AutoSize = true; - this.radioButtonRegEx.Location = new System.Drawing.Point(12, 109); - this.radioButtonRegEx.Name = "radioButtonRegEx"; - this.radioButtonRegEx.Size = new System.Drawing.Size(56, 17); - this.radioButtonRegEx.TabIndex = 9; - this.radioButtonRegEx.Text = "RegEx"; - this.radioButtonRegEx.UseVisualStyleBackColor = true; - this.radioButtonRegEx.CheckedChanged += new System.EventHandler(this.RadioButton_CheckedChanged); - // - // comboBoxFind - // - this.comboBoxFind.FormattingEnabled = true; - this.comboBoxFind.Location = new System.Drawing.Point(12, 13); - this.comboBoxFind.Name = "comboBoxFind"; - this.comboBoxFind.Size = new System.Drawing.Size(189, 21); - this.comboBoxFind.TabIndex = 0; - this.comboBoxFind.TextChanged += new System.EventHandler(this.comboBoxFind_TextChanged); - this.comboBoxFind.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ComboBoxFind_KeyDown); - // - // buttonCount - // - this.buttonCount.Location = new System.Drawing.Point(207, 40); - this.buttonCount.Name = "buttonCount"; - this.buttonCount.Size = new System.Drawing.Size(89, 23); - this.buttonCount.TabIndex = 2; - this.buttonCount.Text = "Count"; - this.buttonCount.UseVisualStyleBackColor = true; - this.buttonCount.Click += new System.EventHandler(this.buttonCount_Click); - // - // labelCount - // - this.labelCount.AutoSize = true; - this.labelCount.Location = new System.Drawing.Point(204, 113); - this.labelCount.Name = "labelCount"; - this.labelCount.Size = new System.Drawing.Size(40, 13); - this.labelCount.TabIndex = 11; - this.labelCount.Text = "Count:"; - // - // checkBoxWholeWord - // - this.checkBoxWholeWord.AutoSize = true; - this.checkBoxWholeWord.Location = new System.Drawing.Point(12, 40); - this.checkBoxWholeWord.Name = "checkBoxWholeWord"; - this.checkBoxWholeWord.Size = new System.Drawing.Size(83, 17); - this.checkBoxWholeWord.TabIndex = 4; - this.checkBoxWholeWord.Text = "Whole word"; - this.checkBoxWholeWord.UseVisualStyleBackColor = true; - this.checkBoxWholeWord.CheckedChanged += new System.EventHandler(this.checkBoxWholeWord_CheckedChanged); - // - // FindDialog - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(307, 135); - this.Controls.Add(this.checkBoxWholeWord); - this.Controls.Add(this.labelCount); - this.Controls.Add(this.buttonCount); - this.Controls.Add(this.comboBoxFind); - this.Controls.Add(this.radioButtonRegEx); - this.Controls.Add(this.radioButtonCaseSensitive); - this.Controls.Add(this.radioButtonNormal); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonFind); - this.Controls.Add(this.textBoxFind); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "FindDialog"; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Find"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormFindDialog_KeyDown); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.TextBox textBoxFind; - private System.Windows.Forms.Button buttonFind; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.RadioButton radioButtonNormal; - private System.Windows.Forms.RadioButton radioButtonCaseSensitive; - private System.Windows.Forms.RadioButton radioButtonRegEx; - private System.Windows.Forms.ComboBox comboBoxFind; - private System.Windows.Forms.Button buttonCount; - private System.Windows.Forms.Label labelCount; - private System.Windows.Forms.CheckBox checkBoxWholeWord; - } -} +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class FindDialog + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.textBoxFind = new System.Windows.Forms.TextBox(); + this.buttonFind = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.radioButtonNormal = new System.Windows.Forms.RadioButton(); + this.radioButtonCaseSensitive = new System.Windows.Forms.RadioButton(); + this.radioButtonRegEx = new System.Windows.Forms.RadioButton(); + this.comboBoxFind = new System.Windows.Forms.ComboBox(); + this.buttonCount = new System.Windows.Forms.Button(); + this.labelCount = new System.Windows.Forms.Label(); + this.checkBoxWholeWord = new System.Windows.Forms.CheckBox(); + this.SuspendLayout(); + // + // textBoxFind + // + this.textBoxFind.Location = new System.Drawing.Point(12, 12); + this.textBoxFind.Name = "textBoxFind"; + this.textBoxFind.Size = new System.Drawing.Size(189, 21); + this.textBoxFind.TabIndex = 0; + this.textBoxFind.TextChanged += new System.EventHandler(this.textBoxFind_TextChanged); + this.textBoxFind.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxFind_KeyDown); + // + // buttonFind + // + this.buttonFind.Location = new System.Drawing.Point(207, 11); + this.buttonFind.Name = "buttonFind"; + this.buttonFind.Size = new System.Drawing.Size(89, 23); + this.buttonFind.TabIndex = 1; + this.buttonFind.Text = "Find"; + this.buttonFind.UseVisualStyleBackColor = true; + this.buttonFind.Click += new System.EventHandler(this.ButtonFind_Click); + // + // buttonCancel + // + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.Location = new System.Drawing.Point(207, 69); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(89, 23); + this.buttonCancel.TabIndex = 3; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + // + // radioButtonNormal + // + this.radioButtonNormal.AutoSize = true; + this.radioButtonNormal.Checked = true; + this.radioButtonNormal.Location = new System.Drawing.Point(12, 63); + this.radioButtonNormal.Name = "radioButtonNormal"; + this.radioButtonNormal.Size = new System.Drawing.Size(58, 17); + this.radioButtonNormal.TabIndex = 5; + this.radioButtonNormal.TabStop = true; + this.radioButtonNormal.Text = "Normal"; + this.radioButtonNormal.UseVisualStyleBackColor = true; + this.radioButtonNormal.CheckedChanged += new System.EventHandler(this.RadioButton_CheckedChanged); + // + // radioButtonCaseSensitive + // + this.radioButtonCaseSensitive.AutoSize = true; + this.radioButtonCaseSensitive.Location = new System.Drawing.Point(12, 86); + this.radioButtonCaseSensitive.Name = "radioButtonCaseSensitive"; + this.radioButtonCaseSensitive.Size = new System.Drawing.Size(94, 17); + this.radioButtonCaseSensitive.TabIndex = 7; + this.radioButtonCaseSensitive.Text = "Case sensitive"; + this.radioButtonCaseSensitive.UseVisualStyleBackColor = true; + this.radioButtonCaseSensitive.CheckedChanged += new System.EventHandler(this.RadioButton_CheckedChanged); + // + // radioButtonRegEx + // + this.radioButtonRegEx.AutoSize = true; + this.radioButtonRegEx.Location = new System.Drawing.Point(12, 109); + this.radioButtonRegEx.Name = "radioButtonRegEx"; + this.radioButtonRegEx.Size = new System.Drawing.Size(56, 17); + this.radioButtonRegEx.TabIndex = 9; + this.radioButtonRegEx.Text = "RegEx"; + this.radioButtonRegEx.UseVisualStyleBackColor = true; + this.radioButtonRegEx.CheckedChanged += new System.EventHandler(this.RadioButton_CheckedChanged); + // + // comboBoxFind + // + this.comboBoxFind.FormattingEnabled = true; + this.comboBoxFind.Location = new System.Drawing.Point(12, 13); + this.comboBoxFind.Name = "comboBoxFind"; + this.comboBoxFind.Size = new System.Drawing.Size(189, 21); + this.comboBoxFind.TabIndex = 0; + this.comboBoxFind.TextChanged += new System.EventHandler(this.comboBoxFind_TextChanged); + this.comboBoxFind.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ComboBoxFind_KeyDown); + // + // buttonCount + // + this.buttonCount.Location = new System.Drawing.Point(207, 40); + this.buttonCount.Name = "buttonCount"; + this.buttonCount.Size = new System.Drawing.Size(89, 23); + this.buttonCount.TabIndex = 2; + this.buttonCount.Text = "Count"; + this.buttonCount.UseVisualStyleBackColor = true; + this.buttonCount.Click += new System.EventHandler(this.buttonCount_Click); + // + // labelCount + // + this.labelCount.AutoSize = true; + this.labelCount.Location = new System.Drawing.Point(204, 113); + this.labelCount.Name = "labelCount"; + this.labelCount.Size = new System.Drawing.Size(40, 13); + this.labelCount.TabIndex = 11; + this.labelCount.Text = "Count:"; + // + // checkBoxWholeWord + // + this.checkBoxWholeWord.AutoSize = true; + this.checkBoxWholeWord.Location = new System.Drawing.Point(12, 40); + this.checkBoxWholeWord.Name = "checkBoxWholeWord"; + this.checkBoxWholeWord.Size = new System.Drawing.Size(83, 17); + this.checkBoxWholeWord.TabIndex = 4; + this.checkBoxWholeWord.Text = "Whole word"; + this.checkBoxWholeWord.UseVisualStyleBackColor = true; + this.checkBoxWholeWord.CheckedChanged += new System.EventHandler(this.checkBoxWholeWord_CheckedChanged); + // + // FindDialog + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(307, 135); + this.Controls.Add(this.checkBoxWholeWord); + this.Controls.Add(this.labelCount); + this.Controls.Add(this.buttonCount); + this.Controls.Add(this.comboBoxFind); + this.Controls.Add(this.radioButtonRegEx); + this.Controls.Add(this.radioButtonCaseSensitive); + this.Controls.Add(this.radioButtonNormal); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonFind); + this.Controls.Add(this.textBoxFind); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FindDialog"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Find"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormFindDialog_KeyDown); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox textBoxFind; + private System.Windows.Forms.Button buttonFind; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.RadioButton radioButtonNormal; + private System.Windows.Forms.RadioButton radioButtonCaseSensitive; + private System.Windows.Forms.RadioButton radioButtonRegEx; + private System.Windows.Forms.ComboBox comboBoxFind; + private System.Windows.Forms.Button buttonCount; + private System.Windows.Forms.Label labelCount; + private System.Windows.Forms.CheckBox checkBoxWholeWord; + } +} diff --git a/src/Forms/FindDialog.cs b/src/ui/Forms/FindDialog.cs similarity index 97% rename from src/Forms/FindDialog.cs rename to src/ui/Forms/FindDialog.cs index b338381fe..45932391c 100644 --- a/src/Forms/FindDialog.cs +++ b/src/ui/Forms/FindDialog.cs @@ -1,243 +1,243 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.Enums; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Drawing; -using System.Text.RegularExpressions; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class FindDialog : PositionAndSizeForm - { - private Regex _regEx; - private readonly Subtitle _subtitle; - public FindDialog(Subtitle subtitle) - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - Text = Configuration.Settings.Language.FindDialog.Title; - buttonFind.Text = Configuration.Settings.Language.FindDialog.Find; - radioButtonNormal.Text = Configuration.Settings.Language.FindDialog.Normal; - radioButtonCaseSensitive.Text = Configuration.Settings.Language.FindDialog.CaseSensitive; - radioButtonRegEx.Text = Configuration.Settings.Language.FindDialog.RegularExpression; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - checkBoxWholeWord.Text = Configuration.Settings.Language.FindDialog.WholeWord; - buttonCount.Text = Configuration.Settings.Language.FindDialog.Count; - labelCount.Text = string.Empty; - _subtitle = subtitle; - - if (Width < radioButtonRegEx.Right + 5) - { - Width = radioButtonRegEx.Right + 5; - } - - UiUtil.FixLargeFonts(this, buttonCancel); - } - - private ReplaceType FindReplaceType - { - get - { - var result = new ReplaceType(); - if (radioButtonNormal.Checked) - { - result.FindType = FindType.Normal; - } - else if (radioButtonCaseSensitive.Checked) - { - result.FindType = FindType.CaseSensitive; - } - else - { - result.FindType = FindType.RegEx; - } - - result.WholeWord = checkBoxWholeWord.Checked; - return result; - } - set - { - switch (value.FindType) - { - case FindType.Normal: - radioButtonNormal.Checked = true; - break; - case FindType.CaseSensitive: - radioButtonCaseSensitive.Checked = true; - break; - case FindType.RegEx: - radioButtonRegEx.Checked = true; - break; - } - } - } - - private string FindText - { - get - { - if (Configuration.Settings.Tools.FindHistory.Count == 0) - { - return textBoxFind.Text; - } - - return comboBoxFind.Text; - } - } - - public FindReplaceDialogHelper GetFindDialogHelper(int startLineIndex) - { - return new FindReplaceDialogHelper(FindReplaceType, FindText, _regEx, string.Empty, startLineIndex); - } - - private void FormFindDialog_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - private void ButtonFind_Click(object sender, EventArgs e) - { - string searchText = FindText; - textBoxFind.Text = searchText; - - if (searchText.Length == 0) - { - DialogResult = DialogResult.Cancel; - } - else if (radioButtonNormal.Checked) - { - DialogResult = DialogResult.OK; - } - else if (radioButtonCaseSensitive.Checked) - { - DialogResult = DialogResult.OK; - } - else if (radioButtonRegEx.Checked) - { - try - { - _regEx = new Regex(RegexUtils.FixNewLine(searchText), RegexOptions.Compiled); - DialogResult = DialogResult.OK; - } - catch (Exception exception) - { - MessageBox.Show(exception.Message); - } - } - } - - private void TextBoxFind_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Enter) - { - ButtonFind_Click(null, null); - } - } - - private void ComboBoxFind_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Enter) - { - ButtonFind_Click(null, null); - } - } - - private void RadioButton_CheckedChanged(object sender, EventArgs e) - { - if (sender == radioButtonRegEx) - { - if (textBoxFind.Visible) - { - comboBoxFind.ContextMenu = null; - textBoxFind.ContextMenu = FindReplaceDialogHelper.GetRegExContextMenu(textBoxFind); - } - else - { - textBoxFind.ContextMenu = null; - comboBoxFind.ContextMenu = FindReplaceDialogHelper.GetRegExContextMenu(comboBoxFind); - } - } - else - { - textBoxFind.ContextMenu = null; - comboBoxFind.ContextMenu = null; - } - checkBoxWholeWord.Enabled = !radioButtonRegEx.Checked; - labelCount.Text = string.Empty; - } - - internal void Initialize(string selectedText, FindReplaceDialogHelper findHelper) - { - if (Configuration.Settings.Tools.FindHistory.Count > 0) - { - textBoxFind.Visible = false; - comboBoxFind.Visible = true; - comboBoxFind.Text = selectedText; - comboBoxFind.SelectAll(); - comboBoxFind.Items.Clear(); - for (int index = 0; index < Configuration.Settings.Tools.FindHistory.Count; index++) - { - string s = Configuration.Settings.Tools.FindHistory[index]; - comboBoxFind.Items.Add(s); - } - } - else - { - comboBoxFind.Visible = false; - textBoxFind.Visible = true; - textBoxFind.Text = selectedText; - textBoxFind.SelectAll(); - } - - if (findHelper != null) - { - FindReplaceType = findHelper.FindReplaceType; - checkBoxWholeWord.Checked = findHelper.FindReplaceType.WholeWord; - checkBoxWholeWord.Enabled = FindReplaceType.FindType != FindType.RegEx; - } - } - - internal void SetIcon(Bitmap bitmap) - { - if (bitmap != null) - { - Icon = Icon.FromHandle(bitmap.GetHicon()); - } - } - - private void buttonCount_Click(object sender, EventArgs e) - { - if (FindText.Length == 0) - { - labelCount.Text = string.Empty; - return; - } - var count = GetFindDialogHelper(0).FindCount(_subtitle, checkBoxWholeWord.Checked); - labelCount.ForeColor = count > 0 ? Color.Blue : Color.Red; - labelCount.Text = count == 1 ? Configuration.Settings.Language.FindDialog.OneMatch : string.Format(Configuration.Settings.Language.FindDialog.XNumberOfMatches, count); - } - - private void comboBoxFind_TextChanged(object sender, EventArgs e) - { - labelCount.Text = string.Empty; - } - - private void textBoxFind_TextChanged(object sender, EventArgs e) - { - labelCount.Text = string.Empty; - } - - private void checkBoxWholeWord_CheckedChanged(object sender, EventArgs e) - { - labelCount.Text = string.Empty; - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.Enums; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Drawing; +using System.Text.RegularExpressions; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class FindDialog : PositionAndSizeForm + { + private Regex _regEx; + private readonly Subtitle _subtitle; + public FindDialog(Subtitle subtitle) + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + Text = Configuration.Settings.Language.FindDialog.Title; + buttonFind.Text = Configuration.Settings.Language.FindDialog.Find; + radioButtonNormal.Text = Configuration.Settings.Language.FindDialog.Normal; + radioButtonCaseSensitive.Text = Configuration.Settings.Language.FindDialog.CaseSensitive; + radioButtonRegEx.Text = Configuration.Settings.Language.FindDialog.RegularExpression; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + checkBoxWholeWord.Text = Configuration.Settings.Language.FindDialog.WholeWord; + buttonCount.Text = Configuration.Settings.Language.FindDialog.Count; + labelCount.Text = string.Empty; + _subtitle = subtitle; + + if (Width < radioButtonRegEx.Right + 5) + { + Width = radioButtonRegEx.Right + 5; + } + + UiUtil.FixLargeFonts(this, buttonCancel); + } + + private ReplaceType FindReplaceType + { + get + { + var result = new ReplaceType(); + if (radioButtonNormal.Checked) + { + result.FindType = FindType.Normal; + } + else if (radioButtonCaseSensitive.Checked) + { + result.FindType = FindType.CaseSensitive; + } + else + { + result.FindType = FindType.RegEx; + } + + result.WholeWord = checkBoxWholeWord.Checked; + return result; + } + set + { + switch (value.FindType) + { + case FindType.Normal: + radioButtonNormal.Checked = true; + break; + case FindType.CaseSensitive: + radioButtonCaseSensitive.Checked = true; + break; + case FindType.RegEx: + radioButtonRegEx.Checked = true; + break; + } + } + } + + private string FindText + { + get + { + if (Configuration.Settings.Tools.FindHistory.Count == 0) + { + return textBoxFind.Text; + } + + return comboBoxFind.Text; + } + } + + public FindReplaceDialogHelper GetFindDialogHelper(int startLineIndex) + { + return new FindReplaceDialogHelper(FindReplaceType, FindText, _regEx, string.Empty, startLineIndex); + } + + private void FormFindDialog_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + private void ButtonFind_Click(object sender, EventArgs e) + { + string searchText = FindText; + textBoxFind.Text = searchText; + + if (searchText.Length == 0) + { + DialogResult = DialogResult.Cancel; + } + else if (radioButtonNormal.Checked) + { + DialogResult = DialogResult.OK; + } + else if (radioButtonCaseSensitive.Checked) + { + DialogResult = DialogResult.OK; + } + else if (radioButtonRegEx.Checked) + { + try + { + _regEx = new Regex(RegexUtils.FixNewLine(searchText), RegexOptions.Compiled); + DialogResult = DialogResult.OK; + } + catch (Exception exception) + { + MessageBox.Show(exception.Message); + } + } + } + + private void TextBoxFind_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + ButtonFind_Click(null, null); + } + } + + private void ComboBoxFind_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + ButtonFind_Click(null, null); + } + } + + private void RadioButton_CheckedChanged(object sender, EventArgs e) + { + if (sender == radioButtonRegEx) + { + if (textBoxFind.Visible) + { + comboBoxFind.ContextMenu = null; + textBoxFind.ContextMenu = FindReplaceDialogHelper.GetRegExContextMenu(textBoxFind); + } + else + { + textBoxFind.ContextMenu = null; + comboBoxFind.ContextMenu = FindReplaceDialogHelper.GetRegExContextMenu(comboBoxFind); + } + } + else + { + textBoxFind.ContextMenu = null; + comboBoxFind.ContextMenu = null; + } + checkBoxWholeWord.Enabled = !radioButtonRegEx.Checked; + labelCount.Text = string.Empty; + } + + internal void Initialize(string selectedText, FindReplaceDialogHelper findHelper) + { + if (Configuration.Settings.Tools.FindHistory.Count > 0) + { + textBoxFind.Visible = false; + comboBoxFind.Visible = true; + comboBoxFind.Text = selectedText; + comboBoxFind.SelectAll(); + comboBoxFind.Items.Clear(); + for (int index = 0; index < Configuration.Settings.Tools.FindHistory.Count; index++) + { + string s = Configuration.Settings.Tools.FindHistory[index]; + comboBoxFind.Items.Add(s); + } + } + else + { + comboBoxFind.Visible = false; + textBoxFind.Visible = true; + textBoxFind.Text = selectedText; + textBoxFind.SelectAll(); + } + + if (findHelper != null) + { + FindReplaceType = findHelper.FindReplaceType; + checkBoxWholeWord.Checked = findHelper.FindReplaceType.WholeWord; + checkBoxWholeWord.Enabled = FindReplaceType.FindType != FindType.RegEx; + } + } + + internal void SetIcon(Bitmap bitmap) + { + if (bitmap != null) + { + Icon = Icon.FromHandle(bitmap.GetHicon()); + } + } + + private void buttonCount_Click(object sender, EventArgs e) + { + if (FindText.Length == 0) + { + labelCount.Text = string.Empty; + return; + } + var count = GetFindDialogHelper(0).FindCount(_subtitle, checkBoxWholeWord.Checked); + labelCount.ForeColor = count > 0 ? Color.Blue : Color.Red; + labelCount.Text = count == 1 ? Configuration.Settings.Language.FindDialog.OneMatch : string.Format(Configuration.Settings.Language.FindDialog.XNumberOfMatches, count); + } + + private void comboBoxFind_TextChanged(object sender, EventArgs e) + { + labelCount.Text = string.Empty; + } + + private void textBoxFind_TextChanged(object sender, EventArgs e) + { + labelCount.Text = string.Empty; + } + + private void checkBoxWholeWord_CheckedChanged(object sender, EventArgs e) + { + labelCount.Text = string.Empty; + } + + } +} diff --git a/src/Forms/FindDialog.resx b/src/ui/Forms/FindDialog.resx similarity index 97% rename from src/Forms/FindDialog.resx rename to src/ui/Forms/FindDialog.resx index c7e0d4bdf..d58980a38 100644 --- a/src/Forms/FindDialog.resx +++ b/src/ui/Forms/FindDialog.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Forms/FindSubtitleLine.Designer.cs b/src/ui/Forms/FindSubtitleLine.Designer.cs similarity index 98% rename from src/Forms/FindSubtitleLine.Designer.cs rename to src/ui/Forms/FindSubtitleLine.Designer.cs index 44f3f2829..ce0763a07 100644 --- a/src/Forms/FindSubtitleLine.Designer.cs +++ b/src/ui/Forms/FindSubtitleLine.Designer.cs @@ -1,158 +1,158 @@ -using Nikse.SubtitleEdit.Controls; - -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class FindSubtitleLine - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.buttonOK = new System.Windows.Forms.Button(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonFind = new System.Windows.Forms.Button(); - this.textBoxFindText = new System.Windows.Forms.TextBox(); - this.buttonFindNext = new System.Windows.Forms.Button(); - this.subtitleListView1 = new Nikse.SubtitleEdit.Controls.SubtitleListView(); - this.SuspendLayout(); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; - this.buttonOK.Location = new System.Drawing.Point(453, 315); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 4; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.Location = new System.Drawing.Point(534, 315); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 5; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.ButtonCancelClick); - // - // buttonFind - // - this.buttonFind.Location = new System.Drawing.Point(196, 32); - this.buttonFind.Name = "buttonFind"; - this.buttonFind.Size = new System.Drawing.Size(75, 23); - this.buttonFind.TabIndex = 1; - this.buttonFind.Text = "Find"; - this.buttonFind.UseVisualStyleBackColor = true; - this.buttonFind.Click += new System.EventHandler(this.ButtonFindClick); - // - // textBoxFindText - // - this.textBoxFindText.Location = new System.Drawing.Point(12, 32); - this.textBoxFindText.Name = "textBoxFindText"; - this.textBoxFindText.Size = new System.Drawing.Size(178, 21); - this.textBoxFindText.TabIndex = 0; - this.textBoxFindText.TextChanged += new System.EventHandler(this.TextBoxFindTextTextChanged); - this.textBoxFindText.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxFindTextKeyDown); - // - // buttonFindNext - // - this.buttonFindNext.Location = new System.Drawing.Point(277, 32); - this.buttonFindNext.Name = "buttonFindNext"; - this.buttonFindNext.Size = new System.Drawing.Size(75, 23); - this.buttonFindNext.TabIndex = 2; - this.buttonFindNext.Text = "Find next"; - this.buttonFindNext.UseVisualStyleBackColor = true; - this.buttonFindNext.Click += new System.EventHandler(this.ButtonFindNextClick); - // - // subtitleListView1 - // - this.subtitleListView1.AllowColumnReorder = true; - this.subtitleListView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.subtitleListView1.FirstVisibleIndex = -1; - this.subtitleListView1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.subtitleListView1.FullRowSelect = true; - this.subtitleListView1.GridLines = true; - this.subtitleListView1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; - this.subtitleListView1.HideSelection = false; - this.subtitleListView1.Location = new System.Drawing.Point(12, 59); - this.subtitleListView1.MultiSelect = false; - this.subtitleListView1.Name = "subtitleListView1"; - this.subtitleListView1.OwnerDraw = true; - this.subtitleListView1.Size = new System.Drawing.Size(597, 250); - this.subtitleListView1.SubtitleFontBold = false; - this.subtitleListView1.SubtitleFontName = "Tahoma"; - this.subtitleListView1.SubtitleFontSize = 8; - this.subtitleListView1.TabIndex = 3; - this.subtitleListView1.UseCompatibleStateImageBehavior = false; - this.subtitleListView1.UseSyntaxColoring = true; - this.subtitleListView1.View = System.Windows.Forms.View.Details; - this.subtitleListView1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.SubtitleListView1MouseDoubleClick); - // - // FindSubtitleLine - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(621, 345); - this.Controls.Add(this.buttonFindNext); - this.Controls.Add(this.textBoxFindText); - this.Controls.Add(this.buttonFind); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.subtitleListView1); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(630, 370); - this.Name = "FindSubtitleLine"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Find subtitle line"; - this.Load += new System.EventHandler(this.FormFindSubtitleLine_Load); - this.Shown += new System.EventHandler(this.FormFindSubtitleLine_Shown); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormFindSubtitleLine_KeyDown); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private SubtitleListView subtitleListView1; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonFind; - private System.Windows.Forms.TextBox textBoxFindText; - private System.Windows.Forms.Button buttonFindNext; - } +using Nikse.SubtitleEdit.Controls; + +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class FindSubtitleLine + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.buttonOK = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonFind = new System.Windows.Forms.Button(); + this.textBoxFindText = new System.Windows.Forms.TextBox(); + this.buttonFindNext = new System.Windows.Forms.Button(); + this.subtitleListView1 = new Nikse.SubtitleEdit.Controls.SubtitleListView(); + this.SuspendLayout(); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; + this.buttonOK.Location = new System.Drawing.Point(453, 315); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 4; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.Location = new System.Drawing.Point(534, 315); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 5; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.ButtonCancelClick); + // + // buttonFind + // + this.buttonFind.Location = new System.Drawing.Point(196, 32); + this.buttonFind.Name = "buttonFind"; + this.buttonFind.Size = new System.Drawing.Size(75, 23); + this.buttonFind.TabIndex = 1; + this.buttonFind.Text = "Find"; + this.buttonFind.UseVisualStyleBackColor = true; + this.buttonFind.Click += new System.EventHandler(this.ButtonFindClick); + // + // textBoxFindText + // + this.textBoxFindText.Location = new System.Drawing.Point(12, 32); + this.textBoxFindText.Name = "textBoxFindText"; + this.textBoxFindText.Size = new System.Drawing.Size(178, 21); + this.textBoxFindText.TabIndex = 0; + this.textBoxFindText.TextChanged += new System.EventHandler(this.TextBoxFindTextTextChanged); + this.textBoxFindText.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxFindTextKeyDown); + // + // buttonFindNext + // + this.buttonFindNext.Location = new System.Drawing.Point(277, 32); + this.buttonFindNext.Name = "buttonFindNext"; + this.buttonFindNext.Size = new System.Drawing.Size(75, 23); + this.buttonFindNext.TabIndex = 2; + this.buttonFindNext.Text = "Find next"; + this.buttonFindNext.UseVisualStyleBackColor = true; + this.buttonFindNext.Click += new System.EventHandler(this.ButtonFindNextClick); + // + // subtitleListView1 + // + this.subtitleListView1.AllowColumnReorder = true; + this.subtitleListView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.subtitleListView1.FirstVisibleIndex = -1; + this.subtitleListView1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.subtitleListView1.FullRowSelect = true; + this.subtitleListView1.GridLines = true; + this.subtitleListView1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.subtitleListView1.HideSelection = false; + this.subtitleListView1.Location = new System.Drawing.Point(12, 59); + this.subtitleListView1.MultiSelect = false; + this.subtitleListView1.Name = "subtitleListView1"; + this.subtitleListView1.OwnerDraw = true; + this.subtitleListView1.Size = new System.Drawing.Size(597, 250); + this.subtitleListView1.SubtitleFontBold = false; + this.subtitleListView1.SubtitleFontName = "Tahoma"; + this.subtitleListView1.SubtitleFontSize = 8; + this.subtitleListView1.TabIndex = 3; + this.subtitleListView1.UseCompatibleStateImageBehavior = false; + this.subtitleListView1.UseSyntaxColoring = true; + this.subtitleListView1.View = System.Windows.Forms.View.Details; + this.subtitleListView1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.SubtitleListView1MouseDoubleClick); + // + // FindSubtitleLine + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(621, 345); + this.Controls.Add(this.buttonFindNext); + this.Controls.Add(this.textBoxFindText); + this.Controls.Add(this.buttonFind); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.subtitleListView1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(630, 370); + this.Name = "FindSubtitleLine"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Find subtitle line"; + this.Load += new System.EventHandler(this.FormFindSubtitleLine_Load); + this.Shown += new System.EventHandler(this.FormFindSubtitleLine_Shown); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormFindSubtitleLine_KeyDown); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private SubtitleListView subtitleListView1; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonFind; + private System.Windows.Forms.TextBox textBoxFindText; + private System.Windows.Forms.Button buttonFindNext; + } } \ No newline at end of file diff --git a/src/Forms/FindSubtitleLine.cs b/src/ui/Forms/FindSubtitleLine.cs similarity index 97% rename from src/Forms/FindSubtitleLine.cs rename to src/ui/Forms/FindSubtitleLine.cs index 23ac9de52..5f797b37c 100644 --- a/src/Forms/FindSubtitleLine.cs +++ b/src/ui/Forms/FindSubtitleLine.cs @@ -1,207 +1,207 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class FindSubtitleLine : Form - { - private int _startFindIndex = -1; - private List _paragraphs = new List(); - private readonly Keys _mainGeneralGoToNextSubtitle = UiUtil.GetKeys(Configuration.Settings.Shortcuts.GeneralGoToNextSubtitle); - private readonly Keys _mainGeneralGoToPrevSubtitle = UiUtil.GetKeys(Configuration.Settings.Shortcuts.GeneralGoToPrevSubtitle); - - public int SelectedIndex - { - get; - private set; - } - - public FindSubtitleLine() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - Icon = Properties.Resources.SubtitleEditFormIcon; - - Text = Configuration.Settings.Language.FindSubtitleLine.Title; - buttonFind.Text = Configuration.Settings.Language.FindSubtitleLine.Find; - buttonFindNext.Text = Configuration.Settings.Language.FindSubtitleLine.FindNext; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - subtitleListView1.InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings); - UiUtil.InitializeSubtitleFont(subtitleListView1); - subtitleListView1.AutoSizeAllColumns(this); - FixLargeFonts(); - } - - private void FixLargeFonts() - { - using (var graphics = CreateGraphics()) - { - var textSize = graphics.MeasureString(buttonOK.Text, Font); - if (textSize.Height > buttonOK.Height - 4) - { - subtitleListView1.InitializeTimestampColumnWidths(this); - int newButtonHeight = (int)(textSize.Height + 7 + 0.5); - UiUtil.SetButtonHeight(this, newButtonHeight, 1); - } - } - } - - public void Initialize(List paragraphs, string appendTitle) - { - Text += appendTitle; - _paragraphs = paragraphs; - subtitleListView1.Fill(paragraphs); - _startFindIndex = -1; - } - - private void ButtonFindClick(object sender, EventArgs e) - { - _startFindIndex = -1; - FindText(); - } - - private void FindText() - { - if (string.IsNullOrWhiteSpace(textBoxFindText.Text)) - { - return; - } - - for (var index = 0; index < _paragraphs.Count; index++) - { - if (index > _startFindIndex - && _paragraphs[index].Text.Contains(textBoxFindText.Text, StringComparison.OrdinalIgnoreCase)) - { - subtitleListView1.Items[index].Selected = true; - subtitleListView1.HideSelection = false; - subtitleListView1.Items[index].EnsureVisible(); - subtitleListView1.Items[index].Focused = true; - _startFindIndex = index; - return; - } - } - } - - private void ButtonCancelClick(object sender, EventArgs e) - { - SelectedIndex = -1; - } - - private void ButtonOkClick(object sender, EventArgs e) - { - if (subtitleListView1.SelectedItems.Count > 0) - { - SelectedIndex = subtitleListView1.SelectedItems[0].Index; - } - else - { - SelectedIndex = -1; - } - } - - private void TextBoxFindTextKeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Enter) - { - ButtonFindClick(sender, null); - } - } - - private void TextBoxFindTextTextChanged(object sender, EventArgs e) - { - _startFindIndex = -1; - } - - private void ButtonFindNextClick(object sender, EventArgs e) - { - FindText(); - } - - private void FormFindSubtitleLine_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.F3) - { - FindText(); - } - else if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - else if (_mainGeneralGoToNextSubtitle == e.KeyData || (e.KeyCode == Keys.Down && e.Modifiers == Keys.Alt)) - { - int selectedIndex = 0; - if (subtitleListView1.SelectedItems.Count > 0) - { - selectedIndex = subtitleListView1.SelectedItems[0].Index; - selectedIndex++; - } - subtitleListView1.SelectIndexAndEnsureVisible(selectedIndex); - } - else if (_mainGeneralGoToPrevSubtitle == e.KeyData || (e.KeyCode == Keys.Up && e.Modifiers == Keys.Alt)) - { - int selectedIndex = 0; - if (subtitleListView1.SelectedItems.Count > 0) - { - selectedIndex = subtitleListView1.SelectedItems[0].Index; - selectedIndex--; - } - subtitleListView1.SelectIndexAndEnsureVisible(selectedIndex); - } - else if (e.KeyCode == Keys.Home && e.Alt) - { - subtitleListView1.SelectIndexAndEnsureVisible(0); - e.SuppressKeyPress = true; - } - else if (e.KeyCode == Keys.End && e.Alt) - { - subtitleListView1.SelectIndexAndEnsureVisible(subtitleListView1.Items.Count - 1); - e.SuppressKeyPress = true; - } - else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.G && subtitleListView1.Items.Count > 1) - { - using (var goToLine = new GoToLine()) - { - goToLine.Initialize(1, subtitleListView1.Items.Count); - if (goToLine.ShowDialog(this) == DialogResult.OK) - { - subtitleListView1.SelectNone(); - subtitleListView1.Items[goToLine.LineNumber - 1].Selected = true; - subtitleListView1.Items[goToLine.LineNumber - 1].EnsureVisible(); - subtitleListView1.Items[goToLine.LineNumber - 1].Focused = true; - } - } - } - } - - private void FormFindSubtitleLine_Load(object sender, EventArgs e) - { - SetFocus(); - } - - private void FormFindSubtitleLine_Shown(object sender, EventArgs e) - { - SetFocus(); - } - - private void SetFocus() - { - if (textBoxFindText.CanFocus) - { - textBoxFindText.Focus(); - } - } - - private void SubtitleListView1MouseDoubleClick(object sender, MouseEventArgs e) - { - ButtonOkClick(null, null); - Close(); - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class FindSubtitleLine : Form + { + private int _startFindIndex = -1; + private List _paragraphs = new List(); + private readonly Keys _mainGeneralGoToNextSubtitle = UiUtil.GetKeys(Configuration.Settings.Shortcuts.GeneralGoToNextSubtitle); + private readonly Keys _mainGeneralGoToPrevSubtitle = UiUtil.GetKeys(Configuration.Settings.Shortcuts.GeneralGoToPrevSubtitle); + + public int SelectedIndex + { + get; + private set; + } + + public FindSubtitleLine() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + Icon = Properties.Resources.SubtitleEditFormIcon; + + Text = Configuration.Settings.Language.FindSubtitleLine.Title; + buttonFind.Text = Configuration.Settings.Language.FindSubtitleLine.Find; + buttonFindNext.Text = Configuration.Settings.Language.FindSubtitleLine.FindNext; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + subtitleListView1.InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings); + UiUtil.InitializeSubtitleFont(subtitleListView1); + subtitleListView1.AutoSizeAllColumns(this); + FixLargeFonts(); + } + + private void FixLargeFonts() + { + using (var graphics = CreateGraphics()) + { + var textSize = graphics.MeasureString(buttonOK.Text, Font); + if (textSize.Height > buttonOK.Height - 4) + { + subtitleListView1.InitializeTimestampColumnWidths(this); + int newButtonHeight = (int)(textSize.Height + 7 + 0.5); + UiUtil.SetButtonHeight(this, newButtonHeight, 1); + } + } + } + + public void Initialize(List paragraphs, string appendTitle) + { + Text += appendTitle; + _paragraphs = paragraphs; + subtitleListView1.Fill(paragraphs); + _startFindIndex = -1; + } + + private void ButtonFindClick(object sender, EventArgs e) + { + _startFindIndex = -1; + FindText(); + } + + private void FindText() + { + if (string.IsNullOrWhiteSpace(textBoxFindText.Text)) + { + return; + } + + for (var index = 0; index < _paragraphs.Count; index++) + { + if (index > _startFindIndex + && _paragraphs[index].Text.Contains(textBoxFindText.Text, StringComparison.OrdinalIgnoreCase)) + { + subtitleListView1.Items[index].Selected = true; + subtitleListView1.HideSelection = false; + subtitleListView1.Items[index].EnsureVisible(); + subtitleListView1.Items[index].Focused = true; + _startFindIndex = index; + return; + } + } + } + + private void ButtonCancelClick(object sender, EventArgs e) + { + SelectedIndex = -1; + } + + private void ButtonOkClick(object sender, EventArgs e) + { + if (subtitleListView1.SelectedItems.Count > 0) + { + SelectedIndex = subtitleListView1.SelectedItems[0].Index; + } + else + { + SelectedIndex = -1; + } + } + + private void TextBoxFindTextKeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + ButtonFindClick(sender, null); + } + } + + private void TextBoxFindTextTextChanged(object sender, EventArgs e) + { + _startFindIndex = -1; + } + + private void ButtonFindNextClick(object sender, EventArgs e) + { + FindText(); + } + + private void FormFindSubtitleLine_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.F3) + { + FindText(); + } + else if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + else if (_mainGeneralGoToNextSubtitle == e.KeyData || (e.KeyCode == Keys.Down && e.Modifiers == Keys.Alt)) + { + int selectedIndex = 0; + if (subtitleListView1.SelectedItems.Count > 0) + { + selectedIndex = subtitleListView1.SelectedItems[0].Index; + selectedIndex++; + } + subtitleListView1.SelectIndexAndEnsureVisible(selectedIndex); + } + else if (_mainGeneralGoToPrevSubtitle == e.KeyData || (e.KeyCode == Keys.Up && e.Modifiers == Keys.Alt)) + { + int selectedIndex = 0; + if (subtitleListView1.SelectedItems.Count > 0) + { + selectedIndex = subtitleListView1.SelectedItems[0].Index; + selectedIndex--; + } + subtitleListView1.SelectIndexAndEnsureVisible(selectedIndex); + } + else if (e.KeyCode == Keys.Home && e.Alt) + { + subtitleListView1.SelectIndexAndEnsureVisible(0); + e.SuppressKeyPress = true; + } + else if (e.KeyCode == Keys.End && e.Alt) + { + subtitleListView1.SelectIndexAndEnsureVisible(subtitleListView1.Items.Count - 1); + e.SuppressKeyPress = true; + } + else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.G && subtitleListView1.Items.Count > 1) + { + using (var goToLine = new GoToLine()) + { + goToLine.Initialize(1, subtitleListView1.Items.Count); + if (goToLine.ShowDialog(this) == DialogResult.OK) + { + subtitleListView1.SelectNone(); + subtitleListView1.Items[goToLine.LineNumber - 1].Selected = true; + subtitleListView1.Items[goToLine.LineNumber - 1].EnsureVisible(); + subtitleListView1.Items[goToLine.LineNumber - 1].Focused = true; + } + } + } + } + + private void FormFindSubtitleLine_Load(object sender, EventArgs e) + { + SetFocus(); + } + + private void FormFindSubtitleLine_Shown(object sender, EventArgs e) + { + SetFocus(); + } + + private void SetFocus() + { + if (textBoxFindText.CanFocus) + { + textBoxFindText.Focus(); + } + } + + private void SubtitleListView1MouseDoubleClick(object sender, MouseEventArgs e) + { + ButtonOkClick(null, null); + Close(); + } + + } +} diff --git a/src/Forms/FindSubtitleLine.resx b/src/ui/Forms/FindSubtitleLine.resx similarity index 97% rename from src/Forms/FindSubtitleLine.resx rename to src/ui/Forms/FindSubtitleLine.resx index c7e0d4bdf..d58980a38 100644 --- a/src/Forms/FindSubtitleLine.resx +++ b/src/ui/Forms/FindSubtitleLine.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Forms/FixCommonErrors.Designer.cs b/src/ui/Forms/FixCommonErrors.Designer.cs similarity index 98% rename from src/Forms/FixCommonErrors.Designer.cs rename to src/ui/Forms/FixCommonErrors.Designer.cs index 37a17e563..25020270c 100644 --- a/src/Forms/FixCommonErrors.Designer.cs +++ b/src/ui/Forms/FixCommonErrors.Designer.cs @@ -1,890 +1,890 @@ -using Nikse.SubtitleEdit.Controls; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class FixCommonErrors - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - TimeCode timeCode1 = new TimeCode(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonNextFinish = new System.Windows.Forms.Button(); - this.labelStatus = new System.Windows.Forms.Label(); - this.buttonBack = new System.Windows.Forms.Button(); - this.groupBoxStep1 = new System.Windows.Forms.GroupBox(); - this.buttonResetDefault = new System.Windows.Forms.Button(); - this.comboBoxLanguage = new System.Windows.Forms.ComboBox(); - this.labelLanguage = new System.Windows.Forms.Label(); - this.buttonInverseSelection = new System.Windows.Forms.Button(); - this.buttonSelectAll = new System.Windows.Forms.Button(); - this.listView1 = new System.Windows.Forms.ListView(); - this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.contextMenuStripRules = new System.Windows.Forms.ContextMenuStrip(this.components); - this.toolStripMenuItemSelectAllRules = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemInverseRules = new System.Windows.Forms.ToolStripMenuItem(); - this.selectDefaultToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); - this.setCurrentFixesAsDefaultToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.groupBox2 = new System.Windows.Forms.GroupBox(); - this.labelLanguage2 = new System.Windows.Forms.Label(); - this.tabControl1 = new System.Windows.Forms.TabControl(); - this.tabPageFixes = new System.Windows.Forms.TabPage(); - this.splitContainerStep2 = new System.Windows.Forms.SplitContainer(); - this.listViewFixes = new System.Windows.Forms.ListView(); - this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader6 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader7 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader8 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.contextMenuStripFixes = new System.Windows.Forms.ContextMenuStrip(this.components); - this.toolStripMenuItemSelectAll = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemInverseSelection = new System.Windows.Forms.ToolStripMenuItem(); - this.buttonFixesApply = new System.Windows.Forms.Button(); - this.buttonRefreshFixes = new System.Windows.Forms.Button(); - this.buttonFixesSelectAll = new System.Windows.Forms.Button(); - this.buttonFixesInverse = new System.Windows.Forms.Button(); - this.subtitleListView1 = new Nikse.SubtitleEdit.Controls.SubtitleListView(); - this.contextMenuStripListview = new System.Windows.Forms.ContextMenuStrip(this.components); - this.toolStripMenuItemDelete = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); - this.mergeSelectedLinesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.groupBoxEditPanel = new System.Windows.Forms.GroupBox(); - this.buttonSplitLine = new System.Windows.Forms.Button(); - this.labelSingleLine = new System.Windows.Forms.Label(); - this.buttonUnBreak = new System.Windows.Forms.Button(); - this.buttonAutoBreak = new System.Windows.Forms.Button(); - this.labelStartTimeWarning = new System.Windows.Forms.Label(); - this.labelDurationWarning = new System.Windows.Forms.Label(); - this.timeUpDownStartTime = new Nikse.SubtitleEdit.Controls.TimeUpDown(); - this.numericUpDownDuration = new System.Windows.Forms.NumericUpDown(); - this.labelDuration = new System.Windows.Forms.Label(); - this.labelStartTime = new System.Windows.Forms.Label(); - this.labelTextLineTotal = new System.Windows.Forms.Label(); - this.labelTextLineLengths = new System.Windows.Forms.Label(); - this.textBoxListViewText = new System.Windows.Forms.TextBox(); - this.tabPageLog = new System.Windows.Forms.TabPage(); - this.textBoxFixedIssues = new System.Windows.Forms.TextBox(); - this.labelNumberOfImportantLogMessages = new System.Windows.Forms.Label(); - this.groupBoxStep1.SuspendLayout(); - this.contextMenuStripRules.SuspendLayout(); - this.groupBox2.SuspendLayout(); - this.tabControl1.SuspendLayout(); - this.tabPageFixes.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.splitContainerStep2)).BeginInit(); - this.splitContainerStep2.Panel1.SuspendLayout(); - this.splitContainerStep2.Panel2.SuspendLayout(); - this.splitContainerStep2.SuspendLayout(); - this.contextMenuStripFixes.SuspendLayout(); - this.contextMenuStripListview.SuspendLayout(); - this.groupBoxEditPanel.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDuration)).BeginInit(); - this.tabPageLog.SuspendLayout(); - this.SuspendLayout(); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(759, 575); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 10; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.ButtonCancelClick); - // - // buttonNextFinish - // - this.buttonNextFinish.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonNextFinish.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonNextFinish.Location = new System.Drawing.Point(678, 575); - this.buttonNextFinish.Name = "buttonNextFinish"; - this.buttonNextFinish.Size = new System.Drawing.Size(75, 23); - this.buttonNextFinish.TabIndex = 9; - this.buttonNextFinish.Text = "&Next >"; - this.buttonNextFinish.UseVisualStyleBackColor = true; - this.buttonNextFinish.Click += new System.EventHandler(this.ButtonFixClick); - // - // labelStatus - // - this.labelStatus.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelStatus.AutoSize = true; - this.labelStatus.Location = new System.Drawing.Point(12, 577); - this.labelStatus.Name = "labelStatus"; - this.labelStatus.Size = new System.Drawing.Size(60, 13); - this.labelStatus.TabIndex = 5; - this.labelStatus.Text = "labelStatus"; - // - // buttonBack - // - this.buttonBack.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonBack.Enabled = false; - this.buttonBack.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonBack.Location = new System.Drawing.Point(597, 575); - this.buttonBack.Name = "buttonBack"; - this.buttonBack.Size = new System.Drawing.Size(75, 23); - this.buttonBack.TabIndex = 8; - this.buttonBack.Text = "< &Back"; - this.buttonBack.UseVisualStyleBackColor = true; - this.buttonBack.Click += new System.EventHandler(this.ButtonBackClick); - // - // groupBoxStep1 - // - this.groupBoxStep1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxStep1.Controls.Add(this.buttonResetDefault); - this.groupBoxStep1.Controls.Add(this.comboBoxLanguage); - this.groupBoxStep1.Controls.Add(this.labelLanguage); - this.groupBoxStep1.Controls.Add(this.buttonInverseSelection); - this.groupBoxStep1.Controls.Add(this.buttonSelectAll); - this.groupBoxStep1.Controls.Add(this.listView1); - this.groupBoxStep1.Location = new System.Drawing.Point(12, 12); - this.groupBoxStep1.Name = "groupBoxStep1"; - this.groupBoxStep1.Size = new System.Drawing.Size(822, 557); - this.groupBoxStep1.TabIndex = 9; - this.groupBoxStep1.TabStop = false; - this.groupBoxStep1.Text = "Step 1/2 - Choose which errors to fix"; - // - // buttonResetDefault - // - this.buttonResetDefault.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonResetDefault.Location = new System.Drawing.Point(193, 530); - this.buttonResetDefault.Name = "buttonResetDefault"; - this.buttonResetDefault.Size = new System.Drawing.Size(100, 23); - this.buttonResetDefault.TabIndex = 12; - this.buttonResetDefault.Text = "Select default"; - this.buttonResetDefault.UseVisualStyleBackColor = true; - this.buttonResetDefault.Click += new System.EventHandler(this.buttonResetDefault_Click); - // - // comboBoxLanguage - // - this.comboBoxLanguage.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.comboBoxLanguage.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxLanguage.FormattingEnabled = true; - this.comboBoxLanguage.Location = new System.Drawing.Point(619, 17); - this.comboBoxLanguage.Name = "comboBoxLanguage"; - this.comboBoxLanguage.Size = new System.Drawing.Size(196, 21); - this.comboBoxLanguage.TabIndex = 0; - this.comboBoxLanguage.SelectedIndexChanged += new System.EventHandler(this.comboBoxLanguage_SelectedIndexChanged); - this.comboBoxLanguage.Enter += new System.EventHandler(this.comboBoxLanguage_Enter); - // - // labelLanguage - // - this.labelLanguage.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.labelLanguage.Location = new System.Drawing.Point(376, 20); - this.labelLanguage.Name = "labelLanguage"; - this.labelLanguage.Size = new System.Drawing.Size(237, 25); - this.labelLanguage.TabIndex = 11; - this.labelLanguage.Text = "Language"; - this.labelLanguage.TextAlign = System.Drawing.ContentAlignment.TopRight; - // - // buttonInverseSelection - // - this.buttonInverseSelection.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonInverseSelection.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonInverseSelection.Location = new System.Drawing.Point(87, 530); - this.buttonInverseSelection.Name = "buttonInverseSelection"; - this.buttonInverseSelection.Size = new System.Drawing.Size(100, 23); - this.buttonInverseSelection.TabIndex = 3; - this.buttonInverseSelection.Text = "Inverse selection"; - this.buttonInverseSelection.UseVisualStyleBackColor = true; - this.buttonInverseSelection.Click += new System.EventHandler(this.ButtonInverseSelectionClick); - // - // buttonSelectAll - // - this.buttonSelectAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonSelectAll.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonSelectAll.Location = new System.Drawing.Point(6, 530); - this.buttonSelectAll.Name = "buttonSelectAll"; - this.buttonSelectAll.Size = new System.Drawing.Size(75, 23); - this.buttonSelectAll.TabIndex = 2; - this.buttonSelectAll.Text = "Select all"; - this.buttonSelectAll.UseVisualStyleBackColor = true; - this.buttonSelectAll.Click += new System.EventHandler(this.ButtonSelectAllClick); - // - // listView1 - // - this.listView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.listView1.CheckBoxes = true; - this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeader1, - this.columnHeader2, - this.columnHeader3}); - this.listView1.ContextMenuStrip = this.contextMenuStripRules; - this.listView1.FullRowSelect = true; - this.listView1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; - this.listView1.HideSelection = false; - this.listView1.Location = new System.Drawing.Point(6, 48); - this.listView1.Name = "listView1"; - this.listView1.Size = new System.Drawing.Size(810, 477); - this.listView1.TabIndex = 1; - this.listView1.UseCompatibleStateImageBehavior = false; - this.listView1.View = System.Windows.Forms.View.Details; - // - // columnHeader1 - // - this.columnHeader1.Text = "Apply"; - this.columnHeader1.Width = 53; - // - // columnHeader2 - // - this.columnHeader2.Text = "What to fix"; - this.columnHeader2.Width = 99; - // - // columnHeader3 - // - this.columnHeader3.Text = "Example"; - this.columnHeader3.Width = 158; - // - // contextMenuStripRules - // - this.contextMenuStripRules.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripMenuItemSelectAllRules, - this.toolStripMenuItemInverseRules, - this.selectDefaultToolStripMenuItem, - this.toolStripSeparator2, - this.setCurrentFixesAsDefaultToolStripMenuItem}); - this.contextMenuStripRules.Name = "contextMenuStrip1"; - this.contextMenuStripRules.Size = new System.Drawing.Size(213, 98); - // - // toolStripMenuItemSelectAllRules - // - this.toolStripMenuItemSelectAllRules.Name = "toolStripMenuItemSelectAllRules"; - this.toolStripMenuItemSelectAllRules.Size = new System.Drawing.Size(212, 22); - this.toolStripMenuItemSelectAllRules.Text = "Select all"; - this.toolStripMenuItemSelectAllRules.Click += new System.EventHandler(this.ButtonSelectAllClick); - // - // toolStripMenuItemInverseRules - // - this.toolStripMenuItemInverseRules.Name = "toolStripMenuItemInverseRules"; - this.toolStripMenuItemInverseRules.Size = new System.Drawing.Size(212, 22); - this.toolStripMenuItemInverseRules.Text = "Inverse selection"; - this.toolStripMenuItemInverseRules.Click += new System.EventHandler(this.ButtonInverseSelectionClick); - // - // selectDefaultToolStripMenuItem - // - this.selectDefaultToolStripMenuItem.Name = "selectDefaultToolStripMenuItem"; - this.selectDefaultToolStripMenuItem.Size = new System.Drawing.Size(212, 22); - this.selectDefaultToolStripMenuItem.Text = "Select default"; - this.selectDefaultToolStripMenuItem.Click += new System.EventHandler(this.selectDefaultToolStripMenuItem_Click); - // - // toolStripSeparator2 - // - this.toolStripSeparator2.Name = "toolStripSeparator2"; - this.toolStripSeparator2.Size = new System.Drawing.Size(209, 6); - // - // setCurrentFixesAsDefaultToolStripMenuItem - // - this.setCurrentFixesAsDefaultToolStripMenuItem.Name = "setCurrentFixesAsDefaultToolStripMenuItem"; - this.setCurrentFixesAsDefaultToolStripMenuItem.Size = new System.Drawing.Size(212, 22); - this.setCurrentFixesAsDefaultToolStripMenuItem.Text = "Set current fixes as default"; - this.setCurrentFixesAsDefaultToolStripMenuItem.Click += new System.EventHandler(this.setCurrentFixesAsDefaultToolStripMenuItem_Click); - // - // groupBox2 - // - this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBox2.Controls.Add(this.labelLanguage2); - this.groupBox2.Controls.Add(this.tabControl1); - this.groupBox2.Location = new System.Drawing.Point(12, 12); - this.groupBox2.Name = "groupBox2"; - this.groupBox2.Size = new System.Drawing.Size(822, 557); - this.groupBox2.TabIndex = 10; - this.groupBox2.TabStop = false; - this.groupBox2.Text = "Step 2/2 - Verify fixes"; - // - // labelLanguage2 - // - this.labelLanguage2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.labelLanguage2.ForeColor = System.Drawing.SystemColors.GrayText; - this.labelLanguage2.Location = new System.Drawing.Point(650, 14); - this.labelLanguage2.Name = "labelLanguage2"; - this.labelLanguage2.Size = new System.Drawing.Size(160, 13); - this.labelLanguage2.TabIndex = 12; - this.labelLanguage2.Text = "Lang"; - this.labelLanguage2.TextAlign = System.Drawing.ContentAlignment.TopRight; - // - // tabControl1 - // - this.tabControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.tabControl1.Controls.Add(this.tabPageFixes); - this.tabControl1.Controls.Add(this.tabPageLog); - this.tabControl1.Location = new System.Drawing.Point(6, 20); - this.tabControl1.Name = "tabControl1"; - this.tabControl1.SelectedIndex = 0; - this.tabControl1.Size = new System.Drawing.Size(810, 531); - this.tabControl1.TabIndex = 7; - // - // tabPageFixes - // - this.tabPageFixes.Controls.Add(this.splitContainerStep2); - this.tabPageFixes.Location = new System.Drawing.Point(4, 22); - this.tabPageFixes.Name = "tabPageFixes"; - this.tabPageFixes.Padding = new System.Windows.Forms.Padding(3); - this.tabPageFixes.Size = new System.Drawing.Size(802, 505); - this.tabPageFixes.TabIndex = 1; - this.tabPageFixes.Text = "Fixes"; - this.tabPageFixes.UseVisualStyleBackColor = true; - // - // splitContainerStep2 - // - this.splitContainerStep2.Dock = System.Windows.Forms.DockStyle.Fill; - this.splitContainerStep2.Location = new System.Drawing.Point(3, 3); - this.splitContainerStep2.Name = "splitContainerStep2"; - this.splitContainerStep2.Orientation = System.Windows.Forms.Orientation.Horizontal; - // - // splitContainerStep2.Panel1 - // - this.splitContainerStep2.Panel1.Controls.Add(this.listViewFixes); - this.splitContainerStep2.Panel1.Controls.Add(this.buttonFixesApply); - this.splitContainerStep2.Panel1.Controls.Add(this.buttonRefreshFixes); - this.splitContainerStep2.Panel1.Controls.Add(this.buttonFixesSelectAll); - this.splitContainerStep2.Panel1.Controls.Add(this.buttonFixesInverse); - // - // splitContainerStep2.Panel2 - // - this.splitContainerStep2.Panel2.Controls.Add(this.subtitleListView1); - this.splitContainerStep2.Panel2.Controls.Add(this.groupBoxEditPanel); - this.splitContainerStep2.Size = new System.Drawing.Size(796, 499); - this.splitContainerStep2.SplitterDistance = 231; - this.splitContainerStep2.TabIndex = 112; - // - // listViewFixes - // - this.listViewFixes.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.listViewFixes.CheckBoxes = true; - this.listViewFixes.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeader4, - this.columnHeader5, - this.columnHeader6, - this.columnHeader7, - this.columnHeader8}); - this.listViewFixes.ContextMenuStrip = this.contextMenuStripFixes; - this.listViewFixes.FullRowSelect = true; - this.listViewFixes.HideSelection = false; - this.listViewFixes.Location = new System.Drawing.Point(3, 3); - this.listViewFixes.Name = "listViewFixes"; - this.listViewFixes.Size = new System.Drawing.Size(790, 198); - this.listViewFixes.TabIndex = 100; - this.listViewFixes.UseCompatibleStateImageBehavior = false; - this.listViewFixes.View = System.Windows.Forms.View.Details; - this.listViewFixes.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.ListViewFixesColumnClick); - this.listViewFixes.SelectedIndexChanged += new System.EventHandler(this.ListViewFixesSelectedIndexChanged); - // - // columnHeader4 - // - this.columnHeader4.Text = "Apply"; - this.columnHeader4.Width = 50; - // - // columnHeader5 - // - this.columnHeader5.Text = "Line#"; - this.columnHeader5.Width = 61; - // - // columnHeader6 - // - this.columnHeader6.Text = "Function"; - this.columnHeader6.Width = 134; - // - // columnHeader7 - // - this.columnHeader7.Text = "Before"; - this.columnHeader7.Width = 281; - // - // columnHeader8 - // - this.columnHeader8.Text = "After"; - this.columnHeader8.Width = 244; - // - // contextMenuStripFixes - // - this.contextMenuStripFixes.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripMenuItemSelectAll, - this.toolStripMenuItemInverseSelection}); - this.contextMenuStripFixes.Name = "contextMenuStrip1"; - this.contextMenuStripFixes.Size = new System.Drawing.Size(162, 48); - // - // toolStripMenuItemSelectAll - // - this.toolStripMenuItemSelectAll.Name = "toolStripMenuItemSelectAll"; - this.toolStripMenuItemSelectAll.Size = new System.Drawing.Size(161, 22); - this.toolStripMenuItemSelectAll.Text = "Select all"; - this.toolStripMenuItemSelectAll.Click += new System.EventHandler(this.toolStripMenuItemSelectAll_Click); - // - // toolStripMenuItemInverseSelection - // - this.toolStripMenuItemInverseSelection.Name = "toolStripMenuItemInverseSelection"; - this.toolStripMenuItemInverseSelection.Size = new System.Drawing.Size(161, 22); - this.toolStripMenuItemInverseSelection.Text = "Inverse selection"; - this.toolStripMenuItemInverseSelection.Click += new System.EventHandler(this.toolStripMenuItemInverseSelection_Click); - // - // buttonFixesApply - // - this.buttonFixesApply.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonFixesApply.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.buttonFixesApply.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonFixesApply.Location = new System.Drawing.Point(628, 206); - this.buttonFixesApply.Name = "buttonFixesApply"; - this.buttonFixesApply.Size = new System.Drawing.Size(165, 23); - this.buttonFixesApply.TabIndex = 108; - this.buttonFixesApply.Text = "Apply &selected fixes"; - this.buttonFixesApply.UseVisualStyleBackColor = true; - this.buttonFixesApply.Click += new System.EventHandler(this.ButtonFixesApplyClick); - // - // buttonRefreshFixes - // - this.buttonRefreshFixes.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonRefreshFixes.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonRefreshFixes.Location = new System.Drawing.Point(457, 206); - this.buttonRefreshFixes.Name = "buttonRefreshFixes"; - this.buttonRefreshFixes.Size = new System.Drawing.Size(165, 23); - this.buttonRefreshFixes.TabIndex = 106; - this.buttonRefreshFixes.Text = "&Refresh available fixes"; - this.buttonRefreshFixes.UseVisualStyleBackColor = true; - this.buttonRefreshFixes.Click += new System.EventHandler(this.ButtonRefreshFixesClick); - // - // buttonFixesSelectAll - // - this.buttonFixesSelectAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonFixesSelectAll.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonFixesSelectAll.Location = new System.Drawing.Point(3, 206); - this.buttonFixesSelectAll.Name = "buttonFixesSelectAll"; - this.buttonFixesSelectAll.Size = new System.Drawing.Size(75, 23); - this.buttonFixesSelectAll.TabIndex = 102; - this.buttonFixesSelectAll.Text = "Select &all"; - this.buttonFixesSelectAll.UseVisualStyleBackColor = true; - this.buttonFixesSelectAll.Click += new System.EventHandler(this.ButtonFixesSelectAllClick); - // - // buttonFixesInverse - // - this.buttonFixesInverse.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonFixesInverse.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonFixesInverse.Location = new System.Drawing.Point(84, 206); - this.buttonFixesInverse.Name = "buttonFixesInverse"; - this.buttonFixesInverse.Size = new System.Drawing.Size(100, 23); - this.buttonFixesInverse.TabIndex = 104; - this.buttonFixesInverse.Text = "&Inverse selection"; - this.buttonFixesInverse.UseVisualStyleBackColor = true; - this.buttonFixesInverse.Click += new System.EventHandler(this.ButtonFixesInverseClick); - // - // subtitleListView1 - // - this.subtitleListView1.AllowColumnReorder = true; - this.subtitleListView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.subtitleListView1.ContextMenuStrip = this.contextMenuStripListview; - this.subtitleListView1.FirstVisibleIndex = -1; - this.subtitleListView1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.subtitleListView1.FullRowSelect = true; - this.subtitleListView1.GridLines = true; - this.subtitleListView1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; - this.subtitleListView1.HideSelection = false; - this.subtitleListView1.Location = new System.Drawing.Point(3, 5); - this.subtitleListView1.Name = "subtitleListView1"; - this.subtitleListView1.OwnerDraw = true; - this.subtitleListView1.Size = new System.Drawing.Size(785, 158); - this.subtitleListView1.SubtitleFontBold = false; - this.subtitleListView1.SubtitleFontName = "Tahoma"; - this.subtitleListView1.SubtitleFontSize = 8; - this.subtitleListView1.TabIndex = 110; - this.subtitleListView1.UseCompatibleStateImageBehavior = false; - this.subtitleListView1.UseSyntaxColoring = true; - this.subtitleListView1.View = System.Windows.Forms.View.Details; - this.subtitleListView1.SelectedIndexChanged += new System.EventHandler(this.SubtitleListView1SelectedIndexChanged); - this.subtitleListView1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.subtitleListView1_KeyDown); - // - // contextMenuStripListview - // - this.contextMenuStripListview.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripMenuItemDelete, - this.toolStripSeparator1, - this.mergeSelectedLinesToolStripMenuItem}); - this.contextMenuStripListview.Name = "contextMenuStripListview"; - this.contextMenuStripListview.Size = new System.Drawing.Size(182, 54); - this.contextMenuStripListview.Opening += new System.ComponentModel.CancelEventHandler(this.ContextMenuStripListviewOpening); - // - // toolStripMenuItemDelete - // - this.toolStripMenuItemDelete.Name = "toolStripMenuItemDelete"; - this.toolStripMenuItemDelete.Size = new System.Drawing.Size(181, 22); - this.toolStripMenuItemDelete.Text = "Delete"; - this.toolStripMenuItemDelete.Click += new System.EventHandler(this.ToolStripMenuItemDeleteClick); - // - // toolStripSeparator1 - // - this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(178, 6); - // - // mergeSelectedLinesToolStripMenuItem - // - this.mergeSelectedLinesToolStripMenuItem.Name = "mergeSelectedLinesToolStripMenuItem"; - this.mergeSelectedLinesToolStripMenuItem.Size = new System.Drawing.Size(181, 22); - this.mergeSelectedLinesToolStripMenuItem.Text = "Merge selected lines"; - this.mergeSelectedLinesToolStripMenuItem.Click += new System.EventHandler(this.MergeSelectedLinesToolStripMenuItemClick); - // - // groupBoxEditPanel - // - this.groupBoxEditPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxEditPanel.Controls.Add(this.buttonSplitLine); - this.groupBoxEditPanel.Controls.Add(this.labelSingleLine); - this.groupBoxEditPanel.Controls.Add(this.buttonUnBreak); - this.groupBoxEditPanel.Controls.Add(this.buttonAutoBreak); - this.groupBoxEditPanel.Controls.Add(this.labelStartTimeWarning); - this.groupBoxEditPanel.Controls.Add(this.labelDurationWarning); - this.groupBoxEditPanel.Controls.Add(this.timeUpDownStartTime); - this.groupBoxEditPanel.Controls.Add(this.numericUpDownDuration); - this.groupBoxEditPanel.Controls.Add(this.labelDuration); - this.groupBoxEditPanel.Controls.Add(this.labelStartTime); - this.groupBoxEditPanel.Controls.Add(this.labelTextLineTotal); - this.groupBoxEditPanel.Controls.Add(this.labelTextLineLengths); - this.groupBoxEditPanel.Controls.Add(this.textBoxListViewText); - this.groupBoxEditPanel.Location = new System.Drawing.Point(8, 160); - this.groupBoxEditPanel.Name = "groupBoxEditPanel"; - this.groupBoxEditPanel.Size = new System.Drawing.Size(780, 101); - this.groupBoxEditPanel.TabIndex = 111; - this.groupBoxEditPanel.TabStop = false; - // - // buttonSplitLine - // - this.buttonSplitLine.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonSplitLine.ForeColor = System.Drawing.Color.Red; - this.buttonSplitLine.Location = new System.Drawing.Point(627, 62); - this.buttonSplitLine.Name = "buttonSplitLine"; - this.buttonSplitLine.Size = new System.Drawing.Size(96, 23); - this.buttonSplitLine.TabIndex = 124; - this.buttonSplitLine.Text = "Split line"; - this.buttonSplitLine.UseVisualStyleBackColor = true; - this.buttonSplitLine.Click += new System.EventHandler(this.ButtonSplitLineClick); - // - // labelSingleLine - // - this.labelSingleLine.AutoSize = true; - this.labelSingleLine.Location = new System.Drawing.Point(296, 79); - this.labelSingleLine.Name = "labelSingleLine"; - this.labelSingleLine.Size = new System.Drawing.Size(23, 13); - this.labelSingleLine.TabIndex = 123; - this.labelSingleLine.Text = "1/1"; - // - // buttonUnBreak - // - this.buttonUnBreak.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonUnBreak.Location = new System.Drawing.Point(627, 37); - this.buttonUnBreak.Name = "buttonUnBreak"; - this.buttonUnBreak.Size = new System.Drawing.Size(96, 23); - this.buttonUnBreak.TabIndex = 122; - this.buttonUnBreak.Text = "&Unbreak"; - this.buttonUnBreak.UseVisualStyleBackColor = true; - this.buttonUnBreak.Click += new System.EventHandler(this.ButtonUnBreakClick); - // - // buttonAutoBreak - // - this.buttonAutoBreak.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonAutoBreak.Location = new System.Drawing.Point(627, 12); - this.buttonAutoBreak.Name = "buttonAutoBreak"; - this.buttonAutoBreak.Size = new System.Drawing.Size(96, 23); - this.buttonAutoBreak.TabIndex = 120; - this.buttonAutoBreak.Text = "Auto &br"; - this.buttonAutoBreak.UseVisualStyleBackColor = true; - this.buttonAutoBreak.Click += new System.EventHandler(this.ButtonAutoBreakClick); - // - // labelStartTimeWarning - // - this.labelStartTimeWarning.AutoSize = true; - this.labelStartTimeWarning.ForeColor = System.Drawing.Color.Red; - this.labelStartTimeWarning.Location = new System.Drawing.Point(6, 51); - this.labelStartTimeWarning.Name = "labelStartTimeWarning"; - this.labelStartTimeWarning.Size = new System.Drawing.Size(115, 13); - this.labelStartTimeWarning.TabIndex = 32; - this.labelStartTimeWarning.Text = "labelStartTimeWarning"; - // - // labelDurationWarning - // - this.labelDurationWarning.AutoSize = true; - this.labelDurationWarning.ForeColor = System.Drawing.Color.Red; - this.labelDurationWarning.Location = new System.Drawing.Point(57, 64); - this.labelDurationWarning.Name = "labelDurationWarning"; - this.labelDurationWarning.Size = new System.Drawing.Size(110, 13); - this.labelDurationWarning.TabIndex = 31; - this.labelDurationWarning.Text = "labelDurationWarning"; - // - // timeUpDownStartTime - // - this.timeUpDownStartTime.AutoSize = true; - this.timeUpDownStartTime.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.timeUpDownStartTime.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F); - this.timeUpDownStartTime.Location = new System.Drawing.Point(8, 27); - this.timeUpDownStartTime.Margin = new System.Windows.Forms.Padding(4); - this.timeUpDownStartTime.Name = "timeUpDownStartTime"; - this.timeUpDownStartTime.Size = new System.Drawing.Size(111, 27); - this.timeUpDownStartTime.TabIndex = 112; - timeCode1.Hours = 0; - timeCode1.Milliseconds = 0; - timeCode1.Minutes = 0; - timeCode1.Seconds = 0; - timeCode1.TimeSpan = System.TimeSpan.Parse("00:00:00"); - timeCode1.TotalMilliseconds = 0D; - timeCode1.TotalSeconds = 0D; - this.timeUpDownStartTime.TimeCode = timeCode1; - this.timeUpDownStartTime.UseVideoOffset = false; - // - // numericUpDownDuration - // - this.numericUpDownDuration.DecimalPlaces = 3; - this.numericUpDownDuration.Increment = new decimal(new int[] { - 1, - 0, - 0, - 65536}); - this.numericUpDownDuration.Location = new System.Drawing.Point(99, 28); - this.numericUpDownDuration.Maximum = new decimal(new int[] { - 99999, - 0, - 0, - 0}); - this.numericUpDownDuration.Minimum = new decimal(new int[] { - 99999, - 0, - 0, - -2147483648}); - this.numericUpDownDuration.Name = "numericUpDownDuration"; - this.numericUpDownDuration.Size = new System.Drawing.Size(56, 21); - this.numericUpDownDuration.TabIndex = 114; - this.numericUpDownDuration.ValueChanged += new System.EventHandler(this.NumericUpDownDurationValueChanged); - // - // labelDuration - // - this.labelDuration.AutoSize = true; - this.labelDuration.Location = new System.Drawing.Point(97, 12); - this.labelDuration.Name = "labelDuration"; - this.labelDuration.Size = new System.Drawing.Size(48, 13); - this.labelDuration.TabIndex = 28; - this.labelDuration.Text = "Duration"; - // - // labelStartTime - // - this.labelStartTime.AutoSize = true; - this.labelStartTime.Location = new System.Drawing.Point(6, 12); - this.labelStartTime.Name = "labelStartTime"; - this.labelStartTime.Size = new System.Drawing.Size(54, 13); - this.labelStartTime.TabIndex = 27; - this.labelStartTime.Text = "Start time"; - // - // labelTextLineTotal - // - this.labelTextLineTotal.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.labelTextLineTotal.Location = new System.Drawing.Point(444, 79); - this.labelTextLineTotal.Name = "labelTextLineTotal"; - this.labelTextLineTotal.Size = new System.Drawing.Size(177, 16); - this.labelTextLineTotal.TabIndex = 26; - this.labelTextLineTotal.Text = "labelTextLineTotal"; - this.labelTextLineTotal.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // labelTextLineLengths - // - this.labelTextLineLengths.AutoSize = true; - this.labelTextLineLengths.Location = new System.Drawing.Point(191, 79); - this.labelTextLineLengths.Name = "labelTextLineLengths"; - this.labelTextLineLengths.Size = new System.Drawing.Size(108, 13); - this.labelTextLineLengths.TabIndex = 25; - this.labelTextLineLengths.Text = "labelTextLineLengths"; - // - // textBoxListViewText - // - this.textBoxListViewText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.textBoxListViewText.HideSelection = false; - this.textBoxListViewText.Location = new System.Drawing.Point(194, 12); - this.textBoxListViewText.Multiline = true; - this.textBoxListViewText.Name = "textBoxListViewText"; - this.textBoxListViewText.ScrollBars = System.Windows.Forms.ScrollBars.Both; - this.textBoxListViewText.Size = new System.Drawing.Size(427, 64); - this.textBoxListViewText.TabIndex = 118; - this.textBoxListViewText.TextChanged += new System.EventHandler(this.TextBoxListViewTextTextChanged); - this.textBoxListViewText.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxListViewTextKeyDown); - // - // tabPageLog - // - this.tabPageLog.Controls.Add(this.textBoxFixedIssues); - this.tabPageLog.Location = new System.Drawing.Point(4, 22); - this.tabPageLog.Name = "tabPageLog"; - this.tabPageLog.Size = new System.Drawing.Size(802, 505); - this.tabPageLog.TabIndex = 2; - this.tabPageLog.Text = "Log"; - this.tabPageLog.UseVisualStyleBackColor = true; - // - // textBoxFixedIssues - // - this.textBoxFixedIssues.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.textBoxFixedIssues.Location = new System.Drawing.Point(3, 3); - this.textBoxFixedIssues.MaxLength = 65767; - this.textBoxFixedIssues.Multiline = true; - this.textBoxFixedIssues.Name = "textBoxFixedIssues"; - this.textBoxFixedIssues.ReadOnly = true; - this.textBoxFixedIssues.ScrollBars = System.Windows.Forms.ScrollBars.Both; - this.textBoxFixedIssues.Size = new System.Drawing.Size(796, 499); - this.textBoxFixedIssues.TabIndex = 5; - this.textBoxFixedIssues.WordWrap = false; - // - // labelNumberOfImportantLogMessages - // - this.labelNumberOfImportantLogMessages.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelNumberOfImportantLogMessages.AutoSize = true; - this.labelNumberOfImportantLogMessages.ForeColor = System.Drawing.Color.Red; - this.labelNumberOfImportantLogMessages.Location = new System.Drawing.Point(12, 593); - this.labelNumberOfImportantLogMessages.Name = "labelNumberOfImportantLogMessages"; - this.labelNumberOfImportantLogMessages.Size = new System.Drawing.Size(190, 13); - this.labelNumberOfImportantLogMessages.TabIndex = 11; - this.labelNumberOfImportantLogMessages.Text = "labelNumberOfImportantLogMessages"; - // - // FixCommonErrors - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CancelButton = this.buttonCancel; - this.ClientSize = new System.Drawing.Size(846, 608); - this.Controls.Add(this.labelStatus); - this.Controls.Add(this.labelNumberOfImportantLogMessages); - this.Controls.Add(this.buttonBack); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonNextFinish); - this.Controls.Add(this.groupBox2); - this.Controls.Add(this.groupBoxStep1); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.KeyPreview = true; - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(840, 580); - this.Name = "FixCommonErrors"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Fix common errors"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FixCommonErrorsFormClosing); - this.Shown += new System.EventHandler(this.FixCommonErrorsShown); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormFixKeyDown); - this.Resize += new System.EventHandler(this.FixCommonErrorsResize); - this.groupBoxStep1.ResumeLayout(false); - this.contextMenuStripRules.ResumeLayout(false); - this.groupBox2.ResumeLayout(false); - this.tabControl1.ResumeLayout(false); - this.tabPageFixes.ResumeLayout(false); - this.splitContainerStep2.Panel1.ResumeLayout(false); - this.splitContainerStep2.Panel2.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.splitContainerStep2)).EndInit(); - this.splitContainerStep2.ResumeLayout(false); - this.contextMenuStripFixes.ResumeLayout(false); - this.contextMenuStripListview.ResumeLayout(false); - this.groupBoxEditPanel.ResumeLayout(false); - this.groupBoxEditPanel.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDuration)).EndInit(); - this.tabPageLog.ResumeLayout(false); - this.tabPageLog.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonNextFinish; - private System.Windows.Forms.Label labelStatus; - private System.Windows.Forms.Button buttonBack; - private System.Windows.Forms.GroupBox groupBoxStep1; - private System.Windows.Forms.ListView listView1; - private System.Windows.Forms.ColumnHeader columnHeader1; - private System.Windows.Forms.ColumnHeader columnHeader2; - private System.Windows.Forms.ColumnHeader columnHeader3; - private System.Windows.Forms.GroupBox groupBox2; - private System.Windows.Forms.TabControl tabControl1; - private System.Windows.Forms.TabPage tabPageFixes; - private System.Windows.Forms.ListView listViewFixes; - private System.Windows.Forms.ColumnHeader columnHeader4; - private System.Windows.Forms.ColumnHeader columnHeader5; - private System.Windows.Forms.ColumnHeader columnHeader6; - private System.Windows.Forms.ColumnHeader columnHeader7; - private System.Windows.Forms.ColumnHeader columnHeader8; - private System.Windows.Forms.TabPage tabPageLog; - private System.Windows.Forms.TextBox textBoxFixedIssues; - private System.Windows.Forms.Button buttonInverseSelection; - private System.Windows.Forms.Button buttonSelectAll; - private System.Windows.Forms.GroupBox groupBoxEditPanel; - private SubtitleListView subtitleListView1; - private System.Windows.Forms.Label labelTextLineTotal; - private System.Windows.Forms.Label labelTextLineLengths; - private System.Windows.Forms.TextBox textBoxListViewText; - private System.Windows.Forms.Button buttonFixesApply; - private System.Windows.Forms.Button buttonFixesInverse; - private System.Windows.Forms.Button buttonFixesSelectAll; - private System.Windows.Forms.Label labelStartTimeWarning; - private System.Windows.Forms.Label labelDurationWarning; - private Nikse.SubtitleEdit.Controls.TimeUpDown timeUpDownStartTime; - private System.Windows.Forms.NumericUpDown numericUpDownDuration; - private System.Windows.Forms.Label labelDuration; - private System.Windows.Forms.Label labelStartTime; - private System.Windows.Forms.Button buttonRefreshFixes; - private System.Windows.Forms.Button buttonUnBreak; - private System.Windows.Forms.Button buttonAutoBreak; - private System.Windows.Forms.ContextMenuStrip contextMenuStripListview; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemDelete; - private System.Windows.Forms.ToolStripMenuItem mergeSelectedLinesToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; - private System.Windows.Forms.Label labelNumberOfImportantLogMessages; - private System.Windows.Forms.SplitContainer splitContainerStep2; - private System.Windows.Forms.Label labelSingleLine; - private System.Windows.Forms.Button buttonSplitLine; - private System.Windows.Forms.ComboBox comboBoxLanguage; - private System.Windows.Forms.Label labelLanguage; - private System.Windows.Forms.Button buttonResetDefault; - private System.Windows.Forms.ContextMenuStrip contextMenuStripFixes; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSelectAll; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInverseSelection; - private System.Windows.Forms.ContextMenuStrip contextMenuStripRules; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSelectAllRules; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInverseRules; - private System.Windows.Forms.Label labelLanguage2; - private System.Windows.Forms.ToolStripMenuItem selectDefaultToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; - private System.Windows.Forms.ToolStripMenuItem setCurrentFixesAsDefaultToolStripMenuItem; - } +using Nikse.SubtitleEdit.Controls; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class FixCommonErrors + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + TimeCode timeCode1 = new TimeCode(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonNextFinish = new System.Windows.Forms.Button(); + this.labelStatus = new System.Windows.Forms.Label(); + this.buttonBack = new System.Windows.Forms.Button(); + this.groupBoxStep1 = new System.Windows.Forms.GroupBox(); + this.buttonResetDefault = new System.Windows.Forms.Button(); + this.comboBoxLanguage = new System.Windows.Forms.ComboBox(); + this.labelLanguage = new System.Windows.Forms.Label(); + this.buttonInverseSelection = new System.Windows.Forms.Button(); + this.buttonSelectAll = new System.Windows.Forms.Button(); + this.listView1 = new System.Windows.Forms.ListView(); + this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.contextMenuStripRules = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItemSelectAllRules = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemInverseRules = new System.Windows.Forms.ToolStripMenuItem(); + this.selectDefaultToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.setCurrentFixesAsDefaultToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.labelLanguage2 = new System.Windows.Forms.Label(); + this.tabControl1 = new System.Windows.Forms.TabControl(); + this.tabPageFixes = new System.Windows.Forms.TabPage(); + this.splitContainerStep2 = new System.Windows.Forms.SplitContainer(); + this.listViewFixes = new System.Windows.Forms.ListView(); + this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader6 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader7 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader8 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.contextMenuStripFixes = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItemSelectAll = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemInverseSelection = new System.Windows.Forms.ToolStripMenuItem(); + this.buttonFixesApply = new System.Windows.Forms.Button(); + this.buttonRefreshFixes = new System.Windows.Forms.Button(); + this.buttonFixesSelectAll = new System.Windows.Forms.Button(); + this.buttonFixesInverse = new System.Windows.Forms.Button(); + this.subtitleListView1 = new Nikse.SubtitleEdit.Controls.SubtitleListView(); + this.contextMenuStripListview = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItemDelete = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.mergeSelectedLinesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.groupBoxEditPanel = new System.Windows.Forms.GroupBox(); + this.buttonSplitLine = new System.Windows.Forms.Button(); + this.labelSingleLine = new System.Windows.Forms.Label(); + this.buttonUnBreak = new System.Windows.Forms.Button(); + this.buttonAutoBreak = new System.Windows.Forms.Button(); + this.labelStartTimeWarning = new System.Windows.Forms.Label(); + this.labelDurationWarning = new System.Windows.Forms.Label(); + this.timeUpDownStartTime = new Nikse.SubtitleEdit.Controls.TimeUpDown(); + this.numericUpDownDuration = new System.Windows.Forms.NumericUpDown(); + this.labelDuration = new System.Windows.Forms.Label(); + this.labelStartTime = new System.Windows.Forms.Label(); + this.labelTextLineTotal = new System.Windows.Forms.Label(); + this.labelTextLineLengths = new System.Windows.Forms.Label(); + this.textBoxListViewText = new System.Windows.Forms.TextBox(); + this.tabPageLog = new System.Windows.Forms.TabPage(); + this.textBoxFixedIssues = new System.Windows.Forms.TextBox(); + this.labelNumberOfImportantLogMessages = new System.Windows.Forms.Label(); + this.groupBoxStep1.SuspendLayout(); + this.contextMenuStripRules.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.tabControl1.SuspendLayout(); + this.tabPageFixes.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainerStep2)).BeginInit(); + this.splitContainerStep2.Panel1.SuspendLayout(); + this.splitContainerStep2.Panel2.SuspendLayout(); + this.splitContainerStep2.SuspendLayout(); + this.contextMenuStripFixes.SuspendLayout(); + this.contextMenuStripListview.SuspendLayout(); + this.groupBoxEditPanel.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDuration)).BeginInit(); + this.tabPageLog.SuspendLayout(); + this.SuspendLayout(); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(759, 575); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 10; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.ButtonCancelClick); + // + // buttonNextFinish + // + this.buttonNextFinish.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonNextFinish.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonNextFinish.Location = new System.Drawing.Point(678, 575); + this.buttonNextFinish.Name = "buttonNextFinish"; + this.buttonNextFinish.Size = new System.Drawing.Size(75, 23); + this.buttonNextFinish.TabIndex = 9; + this.buttonNextFinish.Text = "&Next >"; + this.buttonNextFinish.UseVisualStyleBackColor = true; + this.buttonNextFinish.Click += new System.EventHandler(this.ButtonFixClick); + // + // labelStatus + // + this.labelStatus.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelStatus.AutoSize = true; + this.labelStatus.Location = new System.Drawing.Point(12, 577); + this.labelStatus.Name = "labelStatus"; + this.labelStatus.Size = new System.Drawing.Size(60, 13); + this.labelStatus.TabIndex = 5; + this.labelStatus.Text = "labelStatus"; + // + // buttonBack + // + this.buttonBack.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonBack.Enabled = false; + this.buttonBack.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonBack.Location = new System.Drawing.Point(597, 575); + this.buttonBack.Name = "buttonBack"; + this.buttonBack.Size = new System.Drawing.Size(75, 23); + this.buttonBack.TabIndex = 8; + this.buttonBack.Text = "< &Back"; + this.buttonBack.UseVisualStyleBackColor = true; + this.buttonBack.Click += new System.EventHandler(this.ButtonBackClick); + // + // groupBoxStep1 + // + this.groupBoxStep1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxStep1.Controls.Add(this.buttonResetDefault); + this.groupBoxStep1.Controls.Add(this.comboBoxLanguage); + this.groupBoxStep1.Controls.Add(this.labelLanguage); + this.groupBoxStep1.Controls.Add(this.buttonInverseSelection); + this.groupBoxStep1.Controls.Add(this.buttonSelectAll); + this.groupBoxStep1.Controls.Add(this.listView1); + this.groupBoxStep1.Location = new System.Drawing.Point(12, 12); + this.groupBoxStep1.Name = "groupBoxStep1"; + this.groupBoxStep1.Size = new System.Drawing.Size(822, 557); + this.groupBoxStep1.TabIndex = 9; + this.groupBoxStep1.TabStop = false; + this.groupBoxStep1.Text = "Step 1/2 - Choose which errors to fix"; + // + // buttonResetDefault + // + this.buttonResetDefault.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonResetDefault.Location = new System.Drawing.Point(193, 530); + this.buttonResetDefault.Name = "buttonResetDefault"; + this.buttonResetDefault.Size = new System.Drawing.Size(100, 23); + this.buttonResetDefault.TabIndex = 12; + this.buttonResetDefault.Text = "Select default"; + this.buttonResetDefault.UseVisualStyleBackColor = true; + this.buttonResetDefault.Click += new System.EventHandler(this.buttonResetDefault_Click); + // + // comboBoxLanguage + // + this.comboBoxLanguage.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.comboBoxLanguage.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxLanguage.FormattingEnabled = true; + this.comboBoxLanguage.Location = new System.Drawing.Point(619, 17); + this.comboBoxLanguage.Name = "comboBoxLanguage"; + this.comboBoxLanguage.Size = new System.Drawing.Size(196, 21); + this.comboBoxLanguage.TabIndex = 0; + this.comboBoxLanguage.SelectedIndexChanged += new System.EventHandler(this.comboBoxLanguage_SelectedIndexChanged); + this.comboBoxLanguage.Enter += new System.EventHandler(this.comboBoxLanguage_Enter); + // + // labelLanguage + // + this.labelLanguage.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.labelLanguage.Location = new System.Drawing.Point(376, 20); + this.labelLanguage.Name = "labelLanguage"; + this.labelLanguage.Size = new System.Drawing.Size(237, 25); + this.labelLanguage.TabIndex = 11; + this.labelLanguage.Text = "Language"; + this.labelLanguage.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // buttonInverseSelection + // + this.buttonInverseSelection.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonInverseSelection.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonInverseSelection.Location = new System.Drawing.Point(87, 530); + this.buttonInverseSelection.Name = "buttonInverseSelection"; + this.buttonInverseSelection.Size = new System.Drawing.Size(100, 23); + this.buttonInverseSelection.TabIndex = 3; + this.buttonInverseSelection.Text = "Inverse selection"; + this.buttonInverseSelection.UseVisualStyleBackColor = true; + this.buttonInverseSelection.Click += new System.EventHandler(this.ButtonInverseSelectionClick); + // + // buttonSelectAll + // + this.buttonSelectAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonSelectAll.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonSelectAll.Location = new System.Drawing.Point(6, 530); + this.buttonSelectAll.Name = "buttonSelectAll"; + this.buttonSelectAll.Size = new System.Drawing.Size(75, 23); + this.buttonSelectAll.TabIndex = 2; + this.buttonSelectAll.Text = "Select all"; + this.buttonSelectAll.UseVisualStyleBackColor = true; + this.buttonSelectAll.Click += new System.EventHandler(this.ButtonSelectAllClick); + // + // listView1 + // + this.listView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listView1.CheckBoxes = true; + this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader1, + this.columnHeader2, + this.columnHeader3}); + this.listView1.ContextMenuStrip = this.contextMenuStripRules; + this.listView1.FullRowSelect = true; + this.listView1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.listView1.HideSelection = false; + this.listView1.Location = new System.Drawing.Point(6, 48); + this.listView1.Name = "listView1"; + this.listView1.Size = new System.Drawing.Size(810, 477); + this.listView1.TabIndex = 1; + this.listView1.UseCompatibleStateImageBehavior = false; + this.listView1.View = System.Windows.Forms.View.Details; + // + // columnHeader1 + // + this.columnHeader1.Text = "Apply"; + this.columnHeader1.Width = 53; + // + // columnHeader2 + // + this.columnHeader2.Text = "What to fix"; + this.columnHeader2.Width = 99; + // + // columnHeader3 + // + this.columnHeader3.Text = "Example"; + this.columnHeader3.Width = 158; + // + // contextMenuStripRules + // + this.contextMenuStripRules.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItemSelectAllRules, + this.toolStripMenuItemInverseRules, + this.selectDefaultToolStripMenuItem, + this.toolStripSeparator2, + this.setCurrentFixesAsDefaultToolStripMenuItem}); + this.contextMenuStripRules.Name = "contextMenuStrip1"; + this.contextMenuStripRules.Size = new System.Drawing.Size(213, 98); + // + // toolStripMenuItemSelectAllRules + // + this.toolStripMenuItemSelectAllRules.Name = "toolStripMenuItemSelectAllRules"; + this.toolStripMenuItemSelectAllRules.Size = new System.Drawing.Size(212, 22); + this.toolStripMenuItemSelectAllRules.Text = "Select all"; + this.toolStripMenuItemSelectAllRules.Click += new System.EventHandler(this.ButtonSelectAllClick); + // + // toolStripMenuItemInverseRules + // + this.toolStripMenuItemInverseRules.Name = "toolStripMenuItemInverseRules"; + this.toolStripMenuItemInverseRules.Size = new System.Drawing.Size(212, 22); + this.toolStripMenuItemInverseRules.Text = "Inverse selection"; + this.toolStripMenuItemInverseRules.Click += new System.EventHandler(this.ButtonInverseSelectionClick); + // + // selectDefaultToolStripMenuItem + // + this.selectDefaultToolStripMenuItem.Name = "selectDefaultToolStripMenuItem"; + this.selectDefaultToolStripMenuItem.Size = new System.Drawing.Size(212, 22); + this.selectDefaultToolStripMenuItem.Text = "Select default"; + this.selectDefaultToolStripMenuItem.Click += new System.EventHandler(this.selectDefaultToolStripMenuItem_Click); + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(209, 6); + // + // setCurrentFixesAsDefaultToolStripMenuItem + // + this.setCurrentFixesAsDefaultToolStripMenuItem.Name = "setCurrentFixesAsDefaultToolStripMenuItem"; + this.setCurrentFixesAsDefaultToolStripMenuItem.Size = new System.Drawing.Size(212, 22); + this.setCurrentFixesAsDefaultToolStripMenuItem.Text = "Set current fixes as default"; + this.setCurrentFixesAsDefaultToolStripMenuItem.Click += new System.EventHandler(this.setCurrentFixesAsDefaultToolStripMenuItem_Click); + // + // groupBox2 + // + this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBox2.Controls.Add(this.labelLanguage2); + this.groupBox2.Controls.Add(this.tabControl1); + this.groupBox2.Location = new System.Drawing.Point(12, 12); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(822, 557); + this.groupBox2.TabIndex = 10; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Step 2/2 - Verify fixes"; + // + // labelLanguage2 + // + this.labelLanguage2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.labelLanguage2.ForeColor = System.Drawing.SystemColors.GrayText; + this.labelLanguage2.Location = new System.Drawing.Point(650, 14); + this.labelLanguage2.Name = "labelLanguage2"; + this.labelLanguage2.Size = new System.Drawing.Size(160, 13); + this.labelLanguage2.TabIndex = 12; + this.labelLanguage2.Text = "Lang"; + this.labelLanguage2.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // tabControl1 + // + this.tabControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tabControl1.Controls.Add(this.tabPageFixes); + this.tabControl1.Controls.Add(this.tabPageLog); + this.tabControl1.Location = new System.Drawing.Point(6, 20); + this.tabControl1.Name = "tabControl1"; + this.tabControl1.SelectedIndex = 0; + this.tabControl1.Size = new System.Drawing.Size(810, 531); + this.tabControl1.TabIndex = 7; + // + // tabPageFixes + // + this.tabPageFixes.Controls.Add(this.splitContainerStep2); + this.tabPageFixes.Location = new System.Drawing.Point(4, 22); + this.tabPageFixes.Name = "tabPageFixes"; + this.tabPageFixes.Padding = new System.Windows.Forms.Padding(3); + this.tabPageFixes.Size = new System.Drawing.Size(802, 505); + this.tabPageFixes.TabIndex = 1; + this.tabPageFixes.Text = "Fixes"; + this.tabPageFixes.UseVisualStyleBackColor = true; + // + // splitContainerStep2 + // + this.splitContainerStep2.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainerStep2.Location = new System.Drawing.Point(3, 3); + this.splitContainerStep2.Name = "splitContainerStep2"; + this.splitContainerStep2.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainerStep2.Panel1 + // + this.splitContainerStep2.Panel1.Controls.Add(this.listViewFixes); + this.splitContainerStep2.Panel1.Controls.Add(this.buttonFixesApply); + this.splitContainerStep2.Panel1.Controls.Add(this.buttonRefreshFixes); + this.splitContainerStep2.Panel1.Controls.Add(this.buttonFixesSelectAll); + this.splitContainerStep2.Panel1.Controls.Add(this.buttonFixesInverse); + // + // splitContainerStep2.Panel2 + // + this.splitContainerStep2.Panel2.Controls.Add(this.subtitleListView1); + this.splitContainerStep2.Panel2.Controls.Add(this.groupBoxEditPanel); + this.splitContainerStep2.Size = new System.Drawing.Size(796, 499); + this.splitContainerStep2.SplitterDistance = 231; + this.splitContainerStep2.TabIndex = 112; + // + // listViewFixes + // + this.listViewFixes.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listViewFixes.CheckBoxes = true; + this.listViewFixes.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader4, + this.columnHeader5, + this.columnHeader6, + this.columnHeader7, + this.columnHeader8}); + this.listViewFixes.ContextMenuStrip = this.contextMenuStripFixes; + this.listViewFixes.FullRowSelect = true; + this.listViewFixes.HideSelection = false; + this.listViewFixes.Location = new System.Drawing.Point(3, 3); + this.listViewFixes.Name = "listViewFixes"; + this.listViewFixes.Size = new System.Drawing.Size(790, 198); + this.listViewFixes.TabIndex = 100; + this.listViewFixes.UseCompatibleStateImageBehavior = false; + this.listViewFixes.View = System.Windows.Forms.View.Details; + this.listViewFixes.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.ListViewFixesColumnClick); + this.listViewFixes.SelectedIndexChanged += new System.EventHandler(this.ListViewFixesSelectedIndexChanged); + // + // columnHeader4 + // + this.columnHeader4.Text = "Apply"; + this.columnHeader4.Width = 50; + // + // columnHeader5 + // + this.columnHeader5.Text = "Line#"; + this.columnHeader5.Width = 61; + // + // columnHeader6 + // + this.columnHeader6.Text = "Function"; + this.columnHeader6.Width = 134; + // + // columnHeader7 + // + this.columnHeader7.Text = "Before"; + this.columnHeader7.Width = 281; + // + // columnHeader8 + // + this.columnHeader8.Text = "After"; + this.columnHeader8.Width = 244; + // + // contextMenuStripFixes + // + this.contextMenuStripFixes.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItemSelectAll, + this.toolStripMenuItemInverseSelection}); + this.contextMenuStripFixes.Name = "contextMenuStrip1"; + this.contextMenuStripFixes.Size = new System.Drawing.Size(162, 48); + // + // toolStripMenuItemSelectAll + // + this.toolStripMenuItemSelectAll.Name = "toolStripMenuItemSelectAll"; + this.toolStripMenuItemSelectAll.Size = new System.Drawing.Size(161, 22); + this.toolStripMenuItemSelectAll.Text = "Select all"; + this.toolStripMenuItemSelectAll.Click += new System.EventHandler(this.toolStripMenuItemSelectAll_Click); + // + // toolStripMenuItemInverseSelection + // + this.toolStripMenuItemInverseSelection.Name = "toolStripMenuItemInverseSelection"; + this.toolStripMenuItemInverseSelection.Size = new System.Drawing.Size(161, 22); + this.toolStripMenuItemInverseSelection.Text = "Inverse selection"; + this.toolStripMenuItemInverseSelection.Click += new System.EventHandler(this.toolStripMenuItemInverseSelection_Click); + // + // buttonFixesApply + // + this.buttonFixesApply.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonFixesApply.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.buttonFixesApply.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonFixesApply.Location = new System.Drawing.Point(628, 206); + this.buttonFixesApply.Name = "buttonFixesApply"; + this.buttonFixesApply.Size = new System.Drawing.Size(165, 23); + this.buttonFixesApply.TabIndex = 108; + this.buttonFixesApply.Text = "Apply &selected fixes"; + this.buttonFixesApply.UseVisualStyleBackColor = true; + this.buttonFixesApply.Click += new System.EventHandler(this.ButtonFixesApplyClick); + // + // buttonRefreshFixes + // + this.buttonRefreshFixes.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonRefreshFixes.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonRefreshFixes.Location = new System.Drawing.Point(457, 206); + this.buttonRefreshFixes.Name = "buttonRefreshFixes"; + this.buttonRefreshFixes.Size = new System.Drawing.Size(165, 23); + this.buttonRefreshFixes.TabIndex = 106; + this.buttonRefreshFixes.Text = "&Refresh available fixes"; + this.buttonRefreshFixes.UseVisualStyleBackColor = true; + this.buttonRefreshFixes.Click += new System.EventHandler(this.ButtonRefreshFixesClick); + // + // buttonFixesSelectAll + // + this.buttonFixesSelectAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonFixesSelectAll.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonFixesSelectAll.Location = new System.Drawing.Point(3, 206); + this.buttonFixesSelectAll.Name = "buttonFixesSelectAll"; + this.buttonFixesSelectAll.Size = new System.Drawing.Size(75, 23); + this.buttonFixesSelectAll.TabIndex = 102; + this.buttonFixesSelectAll.Text = "Select &all"; + this.buttonFixesSelectAll.UseVisualStyleBackColor = true; + this.buttonFixesSelectAll.Click += new System.EventHandler(this.ButtonFixesSelectAllClick); + // + // buttonFixesInverse + // + this.buttonFixesInverse.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonFixesInverse.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonFixesInverse.Location = new System.Drawing.Point(84, 206); + this.buttonFixesInverse.Name = "buttonFixesInverse"; + this.buttonFixesInverse.Size = new System.Drawing.Size(100, 23); + this.buttonFixesInverse.TabIndex = 104; + this.buttonFixesInverse.Text = "&Inverse selection"; + this.buttonFixesInverse.UseVisualStyleBackColor = true; + this.buttonFixesInverse.Click += new System.EventHandler(this.ButtonFixesInverseClick); + // + // subtitleListView1 + // + this.subtitleListView1.AllowColumnReorder = true; + this.subtitleListView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.subtitleListView1.ContextMenuStrip = this.contextMenuStripListview; + this.subtitleListView1.FirstVisibleIndex = -1; + this.subtitleListView1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.subtitleListView1.FullRowSelect = true; + this.subtitleListView1.GridLines = true; + this.subtitleListView1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.subtitleListView1.HideSelection = false; + this.subtitleListView1.Location = new System.Drawing.Point(3, 5); + this.subtitleListView1.Name = "subtitleListView1"; + this.subtitleListView1.OwnerDraw = true; + this.subtitleListView1.Size = new System.Drawing.Size(785, 158); + this.subtitleListView1.SubtitleFontBold = false; + this.subtitleListView1.SubtitleFontName = "Tahoma"; + this.subtitleListView1.SubtitleFontSize = 8; + this.subtitleListView1.TabIndex = 110; + this.subtitleListView1.UseCompatibleStateImageBehavior = false; + this.subtitleListView1.UseSyntaxColoring = true; + this.subtitleListView1.View = System.Windows.Forms.View.Details; + this.subtitleListView1.SelectedIndexChanged += new System.EventHandler(this.SubtitleListView1SelectedIndexChanged); + this.subtitleListView1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.subtitleListView1_KeyDown); + // + // contextMenuStripListview + // + this.contextMenuStripListview.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItemDelete, + this.toolStripSeparator1, + this.mergeSelectedLinesToolStripMenuItem}); + this.contextMenuStripListview.Name = "contextMenuStripListview"; + this.contextMenuStripListview.Size = new System.Drawing.Size(182, 54); + this.contextMenuStripListview.Opening += new System.ComponentModel.CancelEventHandler(this.ContextMenuStripListviewOpening); + // + // toolStripMenuItemDelete + // + this.toolStripMenuItemDelete.Name = "toolStripMenuItemDelete"; + this.toolStripMenuItemDelete.Size = new System.Drawing.Size(181, 22); + this.toolStripMenuItemDelete.Text = "Delete"; + this.toolStripMenuItemDelete.Click += new System.EventHandler(this.ToolStripMenuItemDeleteClick); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(178, 6); + // + // mergeSelectedLinesToolStripMenuItem + // + this.mergeSelectedLinesToolStripMenuItem.Name = "mergeSelectedLinesToolStripMenuItem"; + this.mergeSelectedLinesToolStripMenuItem.Size = new System.Drawing.Size(181, 22); + this.mergeSelectedLinesToolStripMenuItem.Text = "Merge selected lines"; + this.mergeSelectedLinesToolStripMenuItem.Click += new System.EventHandler(this.MergeSelectedLinesToolStripMenuItemClick); + // + // groupBoxEditPanel + // + this.groupBoxEditPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxEditPanel.Controls.Add(this.buttonSplitLine); + this.groupBoxEditPanel.Controls.Add(this.labelSingleLine); + this.groupBoxEditPanel.Controls.Add(this.buttonUnBreak); + this.groupBoxEditPanel.Controls.Add(this.buttonAutoBreak); + this.groupBoxEditPanel.Controls.Add(this.labelStartTimeWarning); + this.groupBoxEditPanel.Controls.Add(this.labelDurationWarning); + this.groupBoxEditPanel.Controls.Add(this.timeUpDownStartTime); + this.groupBoxEditPanel.Controls.Add(this.numericUpDownDuration); + this.groupBoxEditPanel.Controls.Add(this.labelDuration); + this.groupBoxEditPanel.Controls.Add(this.labelStartTime); + this.groupBoxEditPanel.Controls.Add(this.labelTextLineTotal); + this.groupBoxEditPanel.Controls.Add(this.labelTextLineLengths); + this.groupBoxEditPanel.Controls.Add(this.textBoxListViewText); + this.groupBoxEditPanel.Location = new System.Drawing.Point(8, 160); + this.groupBoxEditPanel.Name = "groupBoxEditPanel"; + this.groupBoxEditPanel.Size = new System.Drawing.Size(780, 101); + this.groupBoxEditPanel.TabIndex = 111; + this.groupBoxEditPanel.TabStop = false; + // + // buttonSplitLine + // + this.buttonSplitLine.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.buttonSplitLine.ForeColor = System.Drawing.Color.Red; + this.buttonSplitLine.Location = new System.Drawing.Point(627, 62); + this.buttonSplitLine.Name = "buttonSplitLine"; + this.buttonSplitLine.Size = new System.Drawing.Size(96, 23); + this.buttonSplitLine.TabIndex = 124; + this.buttonSplitLine.Text = "Split line"; + this.buttonSplitLine.UseVisualStyleBackColor = true; + this.buttonSplitLine.Click += new System.EventHandler(this.ButtonSplitLineClick); + // + // labelSingleLine + // + this.labelSingleLine.AutoSize = true; + this.labelSingleLine.Location = new System.Drawing.Point(296, 79); + this.labelSingleLine.Name = "labelSingleLine"; + this.labelSingleLine.Size = new System.Drawing.Size(23, 13); + this.labelSingleLine.TabIndex = 123; + this.labelSingleLine.Text = "1/1"; + // + // buttonUnBreak + // + this.buttonUnBreak.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.buttonUnBreak.Location = new System.Drawing.Point(627, 37); + this.buttonUnBreak.Name = "buttonUnBreak"; + this.buttonUnBreak.Size = new System.Drawing.Size(96, 23); + this.buttonUnBreak.TabIndex = 122; + this.buttonUnBreak.Text = "&Unbreak"; + this.buttonUnBreak.UseVisualStyleBackColor = true; + this.buttonUnBreak.Click += new System.EventHandler(this.ButtonUnBreakClick); + // + // buttonAutoBreak + // + this.buttonAutoBreak.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.buttonAutoBreak.Location = new System.Drawing.Point(627, 12); + this.buttonAutoBreak.Name = "buttonAutoBreak"; + this.buttonAutoBreak.Size = new System.Drawing.Size(96, 23); + this.buttonAutoBreak.TabIndex = 120; + this.buttonAutoBreak.Text = "Auto &br"; + this.buttonAutoBreak.UseVisualStyleBackColor = true; + this.buttonAutoBreak.Click += new System.EventHandler(this.ButtonAutoBreakClick); + // + // labelStartTimeWarning + // + this.labelStartTimeWarning.AutoSize = true; + this.labelStartTimeWarning.ForeColor = System.Drawing.Color.Red; + this.labelStartTimeWarning.Location = new System.Drawing.Point(6, 51); + this.labelStartTimeWarning.Name = "labelStartTimeWarning"; + this.labelStartTimeWarning.Size = new System.Drawing.Size(115, 13); + this.labelStartTimeWarning.TabIndex = 32; + this.labelStartTimeWarning.Text = "labelStartTimeWarning"; + // + // labelDurationWarning + // + this.labelDurationWarning.AutoSize = true; + this.labelDurationWarning.ForeColor = System.Drawing.Color.Red; + this.labelDurationWarning.Location = new System.Drawing.Point(57, 64); + this.labelDurationWarning.Name = "labelDurationWarning"; + this.labelDurationWarning.Size = new System.Drawing.Size(110, 13); + this.labelDurationWarning.TabIndex = 31; + this.labelDurationWarning.Text = "labelDurationWarning"; + // + // timeUpDownStartTime + // + this.timeUpDownStartTime.AutoSize = true; + this.timeUpDownStartTime.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.timeUpDownStartTime.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F); + this.timeUpDownStartTime.Location = new System.Drawing.Point(8, 27); + this.timeUpDownStartTime.Margin = new System.Windows.Forms.Padding(4); + this.timeUpDownStartTime.Name = "timeUpDownStartTime"; + this.timeUpDownStartTime.Size = new System.Drawing.Size(111, 27); + this.timeUpDownStartTime.TabIndex = 112; + timeCode1.Hours = 0; + timeCode1.Milliseconds = 0; + timeCode1.Minutes = 0; + timeCode1.Seconds = 0; + timeCode1.TimeSpan = System.TimeSpan.Parse("00:00:00"); + timeCode1.TotalMilliseconds = 0D; + timeCode1.TotalSeconds = 0D; + this.timeUpDownStartTime.TimeCode = timeCode1; + this.timeUpDownStartTime.UseVideoOffset = false; + // + // numericUpDownDuration + // + this.numericUpDownDuration.DecimalPlaces = 3; + this.numericUpDownDuration.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.numericUpDownDuration.Location = new System.Drawing.Point(99, 28); + this.numericUpDownDuration.Maximum = new decimal(new int[] { + 99999, + 0, + 0, + 0}); + this.numericUpDownDuration.Minimum = new decimal(new int[] { + 99999, + 0, + 0, + -2147483648}); + this.numericUpDownDuration.Name = "numericUpDownDuration"; + this.numericUpDownDuration.Size = new System.Drawing.Size(56, 21); + this.numericUpDownDuration.TabIndex = 114; + this.numericUpDownDuration.ValueChanged += new System.EventHandler(this.NumericUpDownDurationValueChanged); + // + // labelDuration + // + this.labelDuration.AutoSize = true; + this.labelDuration.Location = new System.Drawing.Point(97, 12); + this.labelDuration.Name = "labelDuration"; + this.labelDuration.Size = new System.Drawing.Size(48, 13); + this.labelDuration.TabIndex = 28; + this.labelDuration.Text = "Duration"; + // + // labelStartTime + // + this.labelStartTime.AutoSize = true; + this.labelStartTime.Location = new System.Drawing.Point(6, 12); + this.labelStartTime.Name = "labelStartTime"; + this.labelStartTime.Size = new System.Drawing.Size(54, 13); + this.labelStartTime.TabIndex = 27; + this.labelStartTime.Text = "Start time"; + // + // labelTextLineTotal + // + this.labelTextLineTotal.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.labelTextLineTotal.Location = new System.Drawing.Point(444, 79); + this.labelTextLineTotal.Name = "labelTextLineTotal"; + this.labelTextLineTotal.Size = new System.Drawing.Size(177, 16); + this.labelTextLineTotal.TabIndex = 26; + this.labelTextLineTotal.Text = "labelTextLineTotal"; + this.labelTextLineTotal.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // labelTextLineLengths + // + this.labelTextLineLengths.AutoSize = true; + this.labelTextLineLengths.Location = new System.Drawing.Point(191, 79); + this.labelTextLineLengths.Name = "labelTextLineLengths"; + this.labelTextLineLengths.Size = new System.Drawing.Size(108, 13); + this.labelTextLineLengths.TabIndex = 25; + this.labelTextLineLengths.Text = "labelTextLineLengths"; + // + // textBoxListViewText + // + this.textBoxListViewText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxListViewText.HideSelection = false; + this.textBoxListViewText.Location = new System.Drawing.Point(194, 12); + this.textBoxListViewText.Multiline = true; + this.textBoxListViewText.Name = "textBoxListViewText"; + this.textBoxListViewText.ScrollBars = System.Windows.Forms.ScrollBars.Both; + this.textBoxListViewText.Size = new System.Drawing.Size(427, 64); + this.textBoxListViewText.TabIndex = 118; + this.textBoxListViewText.TextChanged += new System.EventHandler(this.TextBoxListViewTextTextChanged); + this.textBoxListViewText.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxListViewTextKeyDown); + // + // tabPageLog + // + this.tabPageLog.Controls.Add(this.textBoxFixedIssues); + this.tabPageLog.Location = new System.Drawing.Point(4, 22); + this.tabPageLog.Name = "tabPageLog"; + this.tabPageLog.Size = new System.Drawing.Size(802, 505); + this.tabPageLog.TabIndex = 2; + this.tabPageLog.Text = "Log"; + this.tabPageLog.UseVisualStyleBackColor = true; + // + // textBoxFixedIssues + // + this.textBoxFixedIssues.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxFixedIssues.Location = new System.Drawing.Point(3, 3); + this.textBoxFixedIssues.MaxLength = 65767; + this.textBoxFixedIssues.Multiline = true; + this.textBoxFixedIssues.Name = "textBoxFixedIssues"; + this.textBoxFixedIssues.ReadOnly = true; + this.textBoxFixedIssues.ScrollBars = System.Windows.Forms.ScrollBars.Both; + this.textBoxFixedIssues.Size = new System.Drawing.Size(796, 499); + this.textBoxFixedIssues.TabIndex = 5; + this.textBoxFixedIssues.WordWrap = false; + // + // labelNumberOfImportantLogMessages + // + this.labelNumberOfImportantLogMessages.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelNumberOfImportantLogMessages.AutoSize = true; + this.labelNumberOfImportantLogMessages.ForeColor = System.Drawing.Color.Red; + this.labelNumberOfImportantLogMessages.Location = new System.Drawing.Point(12, 593); + this.labelNumberOfImportantLogMessages.Name = "labelNumberOfImportantLogMessages"; + this.labelNumberOfImportantLogMessages.Size = new System.Drawing.Size(190, 13); + this.labelNumberOfImportantLogMessages.TabIndex = 11; + this.labelNumberOfImportantLogMessages.Text = "labelNumberOfImportantLogMessages"; + // + // FixCommonErrors + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.buttonCancel; + this.ClientSize = new System.Drawing.Size(846, 608); + this.Controls.Add(this.labelStatus); + this.Controls.Add(this.labelNumberOfImportantLogMessages); + this.Controls.Add(this.buttonBack); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonNextFinish); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.groupBoxStep1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.KeyPreview = true; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(840, 580); + this.Name = "FixCommonErrors"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Fix common errors"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FixCommonErrorsFormClosing); + this.Shown += new System.EventHandler(this.FixCommonErrorsShown); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormFixKeyDown); + this.Resize += new System.EventHandler(this.FixCommonErrorsResize); + this.groupBoxStep1.ResumeLayout(false); + this.contextMenuStripRules.ResumeLayout(false); + this.groupBox2.ResumeLayout(false); + this.tabControl1.ResumeLayout(false); + this.tabPageFixes.ResumeLayout(false); + this.splitContainerStep2.Panel1.ResumeLayout(false); + this.splitContainerStep2.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainerStep2)).EndInit(); + this.splitContainerStep2.ResumeLayout(false); + this.contextMenuStripFixes.ResumeLayout(false); + this.contextMenuStripListview.ResumeLayout(false); + this.groupBoxEditPanel.ResumeLayout(false); + this.groupBoxEditPanel.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDuration)).EndInit(); + this.tabPageLog.ResumeLayout(false); + this.tabPageLog.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonNextFinish; + private System.Windows.Forms.Label labelStatus; + private System.Windows.Forms.Button buttonBack; + private System.Windows.Forms.GroupBox groupBoxStep1; + private System.Windows.Forms.ListView listView1; + private System.Windows.Forms.ColumnHeader columnHeader1; + private System.Windows.Forms.ColumnHeader columnHeader2; + private System.Windows.Forms.ColumnHeader columnHeader3; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.TabControl tabControl1; + private System.Windows.Forms.TabPage tabPageFixes; + private System.Windows.Forms.ListView listViewFixes; + private System.Windows.Forms.ColumnHeader columnHeader4; + private System.Windows.Forms.ColumnHeader columnHeader5; + private System.Windows.Forms.ColumnHeader columnHeader6; + private System.Windows.Forms.ColumnHeader columnHeader7; + private System.Windows.Forms.ColumnHeader columnHeader8; + private System.Windows.Forms.TabPage tabPageLog; + private System.Windows.Forms.TextBox textBoxFixedIssues; + private System.Windows.Forms.Button buttonInverseSelection; + private System.Windows.Forms.Button buttonSelectAll; + private System.Windows.Forms.GroupBox groupBoxEditPanel; + private SubtitleListView subtitleListView1; + private System.Windows.Forms.Label labelTextLineTotal; + private System.Windows.Forms.Label labelTextLineLengths; + private System.Windows.Forms.TextBox textBoxListViewText; + private System.Windows.Forms.Button buttonFixesApply; + private System.Windows.Forms.Button buttonFixesInverse; + private System.Windows.Forms.Button buttonFixesSelectAll; + private System.Windows.Forms.Label labelStartTimeWarning; + private System.Windows.Forms.Label labelDurationWarning; + private Nikse.SubtitleEdit.Controls.TimeUpDown timeUpDownStartTime; + private System.Windows.Forms.NumericUpDown numericUpDownDuration; + private System.Windows.Forms.Label labelDuration; + private System.Windows.Forms.Label labelStartTime; + private System.Windows.Forms.Button buttonRefreshFixes; + private System.Windows.Forms.Button buttonUnBreak; + private System.Windows.Forms.Button buttonAutoBreak; + private System.Windows.Forms.ContextMenuStrip contextMenuStripListview; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemDelete; + private System.Windows.Forms.ToolStripMenuItem mergeSelectedLinesToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.Label labelNumberOfImportantLogMessages; + private System.Windows.Forms.SplitContainer splitContainerStep2; + private System.Windows.Forms.Label labelSingleLine; + private System.Windows.Forms.Button buttonSplitLine; + private System.Windows.Forms.ComboBox comboBoxLanguage; + private System.Windows.Forms.Label labelLanguage; + private System.Windows.Forms.Button buttonResetDefault; + private System.Windows.Forms.ContextMenuStrip contextMenuStripFixes; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSelectAll; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInverseSelection; + private System.Windows.Forms.ContextMenuStrip contextMenuStripRules; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSelectAllRules; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInverseRules; + private System.Windows.Forms.Label labelLanguage2; + private System.Windows.Forms.ToolStripMenuItem selectDefaultToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripMenuItem setCurrentFixesAsDefaultToolStripMenuItem; + } } \ No newline at end of file diff --git a/src/Forms/FixCommonErrors.cs b/src/ui/Forms/FixCommonErrors.cs similarity index 97% rename from src/Forms/FixCommonErrors.cs rename to src/ui/Forms/FixCommonErrors.cs index 02e96fcb1..a2916379c 100644 --- a/src/Forms/FixCommonErrors.cs +++ b/src/ui/Forms/FixCommonErrors.cs @@ -1,1977 +1,1977 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.Dictionaries; -using Nikse.SubtitleEdit.Core.Enums; -using Nikse.SubtitleEdit.Core.Forms.FixCommonErrors; -using Nikse.SubtitleEdit.Core.Interfaces; -using Nikse.SubtitleEdit.Core.SubtitleFormats; -using Nikse.SubtitleEdit.Logic; -using Nikse.SubtitleEdit.Logic.Ocr; -using Nikse.SubtitleEdit.Logic.SpellCheck; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Text; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class FixCommonErrors : Form, IFixCallbacks - { - private const int IndexRemoveEmptyLines = 0; - private const int IndexOverlappingDisplayTime = 1; - private const int IndexTooShortDisplayTime = 2; - private const int IndexTooLongDisplayTime = 3; - private const int IndexTooShortGap = 4; - private const int IndexInvalidItalicTags = 5; - private const int IndexUnneededSpaces = 6; - private const int IndexMissingSpaces = 7; - private const int IndexUnneededPeriods = 8; - private const int IndexFixCommas = 9; - private const int IndexBreakLongLines = 10; - private const int IndexMergeShortLines = 11; - private const int IndexMergeShortLinesAll = 12; - private const int IndexDoubleApostropheToQuote = 13; - private const int IndexFixMusicNotation = 14; - private const int IndexAddPeriodAfterParagraph = 15; - private const int IndexStartWithUppercaseLetterAfterParagraph = 16; - private const int IndexStartWithUppercaseLetterAfterPeriodInsideParagraph = 17; - private const int IndexStartWithUppercaseLetterAfterColon = 18; - private const int IndexAddMissingQuotes = 19; - private const int IndexFixHyphens = 20; - private const int IndexRemoveHyphensSingleLine = 21; - private const int IndexFix3PlusLines = 22; - private const int IndexFixDoubleDash = 23; - private const int IndexFixDoubleGreaterThan = 24; - private const int IndexFixContinuationStyle = 25; - private const int IndexFixMissingOpenBracket = 26; - private const int IndexFixOcrErrorsViaReplaceList = 27; - private const int IndexUppercaseIInsideLowercaseWord = 28; - private const int IndexRemoveSpaceBetweenNumbers = 29; - private const int IndexDialogsOnOneLine = 30; - private const int IndexNormalizeStrings = 31; - private const int IndexFixEllipsesStart = 32; - private int _indexAloneLowercaseIToUppercaseIEnglish = -1; - private int _turkishAnsiIndex = -1; - private int _danishLetterIIndex = -1; - private int _spanishInvertedQuestionAndExclamationMarksIndex = -1; - - private readonly LanguageStructure.FixCommonErrors _language; - private readonly LanguageStructure.General _languageGeneral; - private bool _hasFixesBeenMade; - - private readonly Keys _goToLine = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainEditGoToLineNumber); - private readonly Keys _preview = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainToolsFixCommonErrorsPreview); - private readonly Keys _mainGeneralGoToNextSubtitle = UiUtil.GetKeys(Configuration.Settings.Shortcuts.GeneralGoToNextSubtitle); - private readonly Keys _mainGeneralGoToPrevSubtitle = UiUtil.GetKeys(Configuration.Settings.Shortcuts.GeneralGoToPrevSubtitle); - private readonly Keys _mainListViewGoToNextError = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewGoToNextError); - - private class FixItem - { - public string Name { get; } - public string Example { get; } - public Action Action { get; } - public bool DefaultChecked { get; } - - public FixItem(string name, string example, Action action, bool selected) - { - Name = name; - Example = example; - Action = action; - DefaultChecked = selected; - } - } - - public class LanguageItem - { - public CultureInfo Code { get; } - public string Name { get; } - - public LanguageItem(CultureInfo code, string name) - { - Code = code; - Name = name; - } - - public override string ToString() - { - return Name; - } - } - - private SubtitleFormat _format; - private int _totalFixes; - private int _totalErrors; - private List _fixActions; - private int _subtitleListViewIndex = -1; - private bool _onlyListFixes = true; - private string _autoDetectGoogleLanguage; - private HashSet _nameList; - private HashSet _abbreviationList; - private readonly StringBuilder _newLog = new StringBuilder(); - private readonly StringBuilder _appliedLog = new StringBuilder(); - private int _numberOfImportantLogMessages; - private HashSet _allowedFixes; - private bool _linesDeletedOrMerged; - private bool _oldFixContinuationStyleTicked; - - public SubtitleFormat Format => _format; - - public Encoding Encoding { get; private set; } - public Subtitle Subtitle { get; private set; } - public Subtitle FixedSubtitle { get; private set; } - - public void AddToTotalErrors(int count) - { - _totalErrors += count; - } - - public void AddToDeleteIndices(int index) - { - } - - private void InitializeLanguageNames(LanguageItem firstItem = null) - { - comboBoxLanguage.BeginUpdate(); - comboBoxLanguage.Items.Clear(); - if (firstItem != null) - { - comboBoxLanguage.Items.Add(firstItem); - } - foreach (var ci in Utilities.GetSubtitleLanguageCultures()) - { - comboBoxLanguage.Items.Add(new LanguageItem(ci, ci.EnglishName)); - } - comboBoxLanguage.Sorted = true; - comboBoxLanguage.EndUpdate(); - } - - public void RunBatchSettings(Subtitle subtitle, SubtitleFormat format, TextEncoding encoding, string language) - { - _autoDetectGoogleLanguage = language; - var ci = CultureInfo.GetCultureInfo(_autoDetectGoogleLanguage); - string threeLetterIsoLanguageName = ci.GetThreeLetterIsoLanguageName(); - - InitializeLanguageNames(new LanguageItem(null, "-Auto-")); - int languageIndex = 0; - int j = 0; - foreach (var x in comboBoxLanguage.Items) - { - if (x is LanguageItem xci) - { - if (xci.Code != null && xci.Code.TwoLetterISOLanguageName == ci.TwoLetterISOLanguageName) - { - languageIndex = j; - break; - } - if (xci.Code != null && xci.Code.TwoLetterISOLanguageName == "en") - { - languageIndex = j; - } - } - j++; - } - if (string.IsNullOrEmpty(language)) - { - languageIndex = 0; - } - - comboBoxLanguage.SelectedIndex = languageIndex; - AddFixActions(threeLetterIsoLanguageName); - FixedSubtitle = new Subtitle(subtitle, false); // copy constructor - Subtitle = new Subtitle(subtitle, false); // copy constructor - _format = format; - Encoding = encoding.Encoding; - _onlyListFixes = false; - InitUserInterface(); - groupBoxStep1.Text = string.Empty; - buttonBack.Visible = false; - buttonNextFinish.Visible = false; - buttonCancel.Text = _languageGeneral.Ok; - } - - public string Language - { - get - { - var ci = comboBoxLanguage.SelectedItem as LanguageItem; - return ci?.Code == null ? string.Empty : ci.Code.TwoLetterISOLanguageName; - } - set - { - for (int index = 0; index < comboBoxLanguage.Items.Count; index++) - { - var item = comboBoxLanguage.Items[index]; - if (item.ToString() == value) - { - comboBoxLanguage.SelectedIndex = index; - } - } - } - } - - public bool BatchMode { get; set; } - - public void RunBatch(Subtitle subtitle, SubtitleFormat format, Encoding encoding, string language) - { - _autoDetectGoogleLanguage = language; - var ci = CultureInfo.GetCultureInfo(_autoDetectGoogleLanguage); - string threeLetterIsoLanguageName = ci.GetThreeLetterIsoLanguageName(); - InitializeLanguageNames(); - int languageIndex = 0; - int j = 0; - foreach (var x in comboBoxLanguage.Items) - { - var xci = (LanguageItem)x; - if (xci.Code.TwoLetterISOLanguageName == ci.TwoLetterISOLanguageName) - { - languageIndex = j; - break; - } - if (xci.Code.TwoLetterISOLanguageName == "en") - { - languageIndex = j; - } - j++; - } - comboBoxLanguage.SelectedIndex = languageIndex; - - AddFixActions(threeLetterIsoLanguageName); - - FixedSubtitle = new Subtitle(subtitle, false); // copy constructor - Subtitle = new Subtitle(subtitle, false); // copy constructor - _format = format; - Encoding = encoding; - _onlyListFixes = true; - _hasFixesBeenMade = true; - _numberOfImportantLogMessages = 0; - _onlyListFixes = false; - _totalFixes = 0; - _totalErrors = 0; - RunSelectedActions(); - FixedSubtitle = Subtitle; - } - - public void Initialize(Subtitle subtitle, SubtitleFormat format, Encoding encoding) - { - _autoDetectGoogleLanguage = LanguageAutoDetect.AutoDetectGoogleLanguage(encoding); // Guess language via encoding - if (string.IsNullOrEmpty(_autoDetectGoogleLanguage)) - { - _autoDetectGoogleLanguage = LanguageAutoDetect.AutoDetectGoogleLanguage(subtitle); // Guess language based on subtitle contents - } - - if (_autoDetectGoogleLanguage.Equals("zh", StringComparison.OrdinalIgnoreCase)) - { - _autoDetectGoogleLanguage = "zh-CHS"; // Note that "zh-CHS" (Simplified Chinese) and "zh-CHT" (Traditional Chinese) are neutral cultures - } - - CultureInfo ci = CultureInfo.GetCultureInfo(_autoDetectGoogleLanguage); - string threeLetterIsoLanguageName = ci.GetThreeLetterIsoLanguageName(); - InitializeLanguageNames(); - int languageIndex = 0; - int j = 0; - foreach (var x in comboBoxLanguage.Items) - { - var xci = (LanguageItem)x; - if (xci.Code.TwoLetterISOLanguageName == ci.TwoLetterISOLanguageName) - { - languageIndex = j; - break; - } - if (xci.Code.TwoLetterISOLanguageName == "en") - { - languageIndex = j; - } - j++; - } - comboBoxLanguage.SelectedIndex = languageIndex; - - AddFixActions(threeLetterIsoLanguageName); - - FixedSubtitle = new Subtitle(subtitle, false); // copy constructor - Subtitle = new Subtitle(subtitle, false); // copy constructor - _format = format; - Encoding = encoding; - InitUserInterface(); - } - - private void InitUserInterface() - { - labelStatus.Text = string.Empty; - labelTextLineLengths.Text = string.Empty; - labelTextLineTotal.Text = string.Empty; - groupBoxStep1.BringToFront(); - groupBox2.Visible = false; - groupBoxStep1.Visible = true; - listView1.Columns[0].Width = 50; - listView1.Columns[1].Width = 310; - listView1.Columns[2].Width = 400; - - UiUtil.InitializeSubtitleFont(textBoxListViewText); - UiUtil.InitializeSubtitleFont(subtitleListView1); - listViewFixes.ListViewItemSorter = new ListViewSorter { ColumnNumber = 1, IsNumber = true }; - - if (!string.IsNullOrEmpty(Configuration.Settings.CommonErrors.StartSize)) - { - StartPosition = FormStartPosition.Manual; - var arr = Configuration.Settings.CommonErrors.StartSize.Split(';'); - if (arr.Length == 2 && int.TryParse(arr[0], out var x) && int.TryParse(arr[1], out var y)) - { - if (x > 10 && x < 10000 && y > 10 && y < 10000) - { - Width = x; - Height = y; - } - } - } - if (!string.IsNullOrEmpty(Configuration.Settings.CommonErrors.StartPosition)) - { - StartPosition = FormStartPosition.Manual; - var arr = Configuration.Settings.CommonErrors.StartPosition.Split(';'); - if (arr.Length == 2 && int.TryParse(arr[0], out var x) && int.TryParse(arr[1], out var y)) - { - var screen = Screen.FromPoint(Cursor.Position); - if (x > 0 && x < screen.WorkingArea.Width && y > 0 && y < screen.WorkingArea.Height) - { - Left = x; - Top = y; - } - else - { - StartPosition = FormStartPosition.CenterParent; - } - } - } - - if (Screen.PrimaryScreen.WorkingArea.Width <= 124) - { - Width = MinimumSize.Width; - Height = MinimumSize.Height; - } - if (Configuration.Settings.Tools.FixCommonErrorsSkipStepOne && !BatchMode) - { - Next(); - } - Activate(); - } - - private void AddFixActions(string threeLetterIsoLanguageName) - { - _turkishAnsiIndex = -1; - _danishLetterIIndex = -1; - _spanishInvertedQuestionAndExclamationMarksIndex = -1; - _indexAloneLowercaseIToUppercaseIEnglish = -1; - - var ce = Configuration.Settings.CommonErrors; - - _oldFixContinuationStyleTicked = ce.FixContinuationStyleTicked; - if (LanguageAutoDetect.IsLanguageWithoutPeriods(Language)) - { - ce.FixContinuationStyleTicked = false; - } - - _fixActions = new List - { - new FixItem(_language.RemovedEmptyLinesUnsedLineBreaks, string.Empty, () => new FixEmptyLines().Fix(Subtitle, this), ce.EmptyLinesTicked), - new FixItem(_language.FixOverlappingDisplayTimes, string.Empty, () => new FixOverlappingDisplayTimes().Fix(Subtitle, this), ce.OverlappingDisplayTimeTicked), - new FixItem(_language.FixShortDisplayTimes, string.Empty, () => new FixShortDisplayTimes().Fix(Subtitle, this), ce.TooShortDisplayTimeTicked), - new FixItem(_language.FixLongDisplayTimes, string.Empty, () => new FixLongDisplayTimes().Fix(Subtitle, this), ce.TooLongDisplayTimeTicked), - new FixItem(_language.FixShortGaps, string.Empty, () => new FixShortGaps().Fix(Subtitle, this), ce.TooShortGapTicked), - new FixItem(_language.FixInvalidItalicTags, _language.FixInvalidItalicTagsExample, () => new FixInvalidItalicTags().Fix(Subtitle, this), ce.InvalidItalicTagsTicked), - new FixItem(_language.RemoveUnneededSpaces, _language.RemoveUnneededSpacesExample, () => new FixUnneededSpaces().Fix(Subtitle, this), ce.UnneededSpacesTicked), - new FixItem(_language.FixMissingSpaces, _language.FixMissingSpacesExample, () => new FixMissingSpaces().Fix(Subtitle, this), ce.MissingSpacesTicked), - new FixItem(_language.RemoveUnneededPeriods, _language.RemoveUnneededPeriodsExample, () => new FixUnneededPeriods().Fix(Subtitle, this), ce.UnneededPeriodsTicked), - new FixItem(_language.FixCommas, ",, -> ,", () => new FixCommas().Fix(Subtitle, this), ce.FixCommasTicked), - new FixItem(_language.BreakLongLines, string.Empty, () => new FixLongLines().Fix(Subtitle, this), ce.BreakLongLinesTicked), - new FixItem(_language.RemoveLineBreaks, string.Empty, () => new FixShortLines().Fix(Subtitle, this), ce.MergeShortLinesTicked), - new FixItem(_language.RemoveLineBreaksAll, string.Empty, () => new FixShortLinesAll().Fix(Subtitle, this), ce.MergeShortLinesAllTicked), - new FixItem(_language.FixDoubleApostrophes, string.Empty, () => new FixDoubleApostrophes().Fix(Subtitle, this), ce.DoubleApostropheToQuoteTicked), - new FixItem(_language.FixMusicNotation, _language.FixMusicNotationExample, () => new FixMusicNotation().Fix(Subtitle, this), ce.FixMusicNotationTicked), - new FixItem(_language.AddPeriods, string.Empty, () => new FixMissingPeriodsAtEndOfLine().Fix(Subtitle, this), ce.AddPeriodAfterParagraphTicked), - new FixItem(_language.StartWithUppercaseLetterAfterParagraph, string.Empty, () => new FixStartWithUppercaseLetterAfterParagraph().Fix(Subtitle, this) , ce.StartWithUppercaseLetterAfterParagraphTicked), - new FixItem(_language.StartWithUppercaseLetterAfterPeriodInsideParagraph, string.Empty, () => new FixStartWithUppercaseLetterAfterPeriodInsideParagraph().Fix(Subtitle, this) , ce.StartWithUppercaseLetterAfterPeriodInsideParagraphTicked), - new FixItem(_language.StartWithUppercaseLetterAfterColon, string.Empty, () => new FixStartWithUppercaseLetterAfterColon().Fix(Subtitle, this), ce.StartWithUppercaseLetterAfterColonTicked), - new FixItem(_language.AddMissingQuotes, _language.AddMissingQuotesExample, () => new AddMissingQuotes().Fix(Subtitle, this), ce.AddMissingQuotesTicked), - new FixItem( string.Format(_language.FixHyphensInDialogs, GetDialogStyle(Configuration.Settings.General.DialogStyle)), string.Empty, () => new FixHyphensInDialog().Fix(Subtitle, this), ce.FixHyphensTicked), - new FixItem( _language.RemoveHyphensSingleLine, string.Empty, () => new FixHyphensRemoveDashSingleLine().Fix(Subtitle, this), ce.FixHyphensRemoveSingleLineTicked), - new FixItem(_language.Fix3PlusLines, string.Empty, () => new Fix3PlusLines().Fix(Subtitle, this), ce.Fix3PlusLinesTicked), - new FixItem(_language.FixDoubleDash, _language.FixDoubleDashExample, () => new FixDoubleDash().Fix(Subtitle, this), ce.FixDoubleDashTicked), - new FixItem(_language.FixDoubleGreaterThan, _language.FixDoubleGreaterThanExample, () => new FixDoubleGreaterThan().Fix(Subtitle, this), ce.FixDoubleGreaterThanTicked), - new FixItem( string.Format(_language.FixContinuationStyleX, ContinuationUtilities.GetContinuationStyleName(Configuration.Settings.General.ContinuationStyle)), string.Empty, () => new FixContinuationStyle().Fix(Subtitle, this), ce.FixContinuationStyleTicked), - new FixItem(_language.FixMissingOpenBracket, _language.FixMissingOpenBracketExample, () => new FixMissingOpenBracket().Fix(Subtitle, this), ce.FixMissingOpenBracketTicked), - new FixItem(_language.FixCommonOcrErrors, _language.FixOcrErrorExample, () => FixOcrErrorsViaReplaceList(threeLetterIsoLanguageName), ce.FixOcrErrorsViaReplaceListTicked), - new FixItem(_language.FixUppercaseIInsindeLowercaseWords, _language.FixUppercaseIInsindeLowercaseWordsExample, () => new FixUppercaseIInsideWords().Fix(Subtitle, this), ce.UppercaseIInsideLowercaseWordTicked), - new FixItem(_language.RemoveSpaceBetweenNumber, _language.FixSpaceBetweenNumbersExample, () => new RemoveSpaceBetweenNumbers().Fix(Subtitle, this), ce.RemoveSpaceBetweenNumberTicked), - new FixItem(_language.FixDialogsOnOneLine, _language.FixDialogsOneLineExample, () => new FixDialogsOnOneLine().Fix(Subtitle, this), ce.FixDialogsOnOneLineTicked), - new FixItem(_language.NormalizeStrings, string.Empty, () => new NormalizeStrings().Fix(Subtitle, this), ce.NormalizeStringsTicked), - }; - - if (Configuration.Settings.General.ContinuationStyle == ContinuationStyle.None) - { - _fixActions.Add(new FixItem(_language.FixEllipsesStart, _language.FixEllipsesStartExample, () => new FixEllipsesStart().Fix(Subtitle, this), ce.FixEllipsesStartTicked)); - } - if (Language == "en") - { - _indexAloneLowercaseIToUppercaseIEnglish = _fixActions.Count; - _fixActions.Add(new FixItem(_language.FixLowercaseIToUppercaseI, _language.FixLowercaseIToUppercaseIExample, () => new FixAloneLowercaseIToUppercaseI().Fix(Subtitle, this), ce.AloneLowercaseIToUppercaseIEnglishTicked)); - } - if (Language == "tr") - { - _turkishAnsiIndex = _fixActions.Count; - _fixActions.Add(new FixItem(_language.FixTurkishAnsi, "Ý > İ, Ð > Ğ, Þ > Ş, ý > ı, ð > ğ, þ > ş", () => new FixTurkishAnsiToUnicode().Fix(Subtitle, this), ce.TurkishAnsiTicked)); - } - - if (Language == "da") - { - _danishLetterIIndex = _fixActions.Count; - _fixActions.Add(new FixItem(_language.FixDanishLetterI, "Jeg synes i er søde. -> Jeg synes I er søde.", () => new FixDanishLetterI().Fix(Subtitle, this), ce.DanishLetterITicked)); - } - - if (Language == "es") - { - _spanishInvertedQuestionAndExclamationMarksIndex = _fixActions.Count; - _fixActions.Add(new FixItem(_language.FixSpanishInvertedQuestionAndExclamationMarks, "Hablas bien castellano? -> ¿Hablas bien castellano?", () => new FixSpanishInvertedQuestionAndExclamationMarks().Fix(Subtitle, this), ce.SpanishInvertedQuestionAndExclamationMarksTicked)); - } - - listView1.Items.Clear(); - foreach (var fi in _fixActions) - { - AddFixActionItemToListView(fi); - } - } - - private static string GetDialogStyle(DialogType dialogStyle) - { - if (dialogStyle == DialogType.DashSecondLineWithoutSpace) - { - return Configuration.Settings.Language.Settings.DialogStyleDashSecondLineWithoutSpace; - } - if (dialogStyle == DialogType.DashSecondLineWithSpace) - { - return Configuration.Settings.Language.Settings.DialogStyleDashSecondLineWithSpace; - } - if (dialogStyle == DialogType.DashBothLinesWithoutSpace) - { - return Configuration.Settings.Language.Settings.DialogStyleDashSecondLineWithSpace; - } - return Configuration.Settings.Language.Settings.DialogStyleDashBothLinesWithSpace; - } - - public FixCommonErrors() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - labelStartTimeWarning.Text = string.Empty; - labelDurationWarning.Text = string.Empty; - labelNumberOfImportantLogMessages.Text = string.Empty; - labelLanguage2.Text = string.Empty; - Encoding = Encoding.UTF8; - _language = Configuration.Settings.Language.FixCommonErrors; - _languageGeneral = Configuration.Settings.Language.General; - Text = _language.Title; - groupBoxStep1.Text = _language.Step1; - groupBox2.Text = _language.Step2; - listView1.Columns[0].Text = _languageGeneral.Apply; - listView1.Columns[1].Text = _language.WhatToFix; - listView1.Columns[2].Text = _language.Example; - buttonSelectAll.Text = _language.SelectAll; - buttonInverseSelection.Text = _language.InverseSelection; - tabControl1.TabPages[0].Text = _language.Fixes; - tabControl1.TabPages[1].Text = _language.Log; - listViewFixes.Columns[0].Text = _languageGeneral.Apply; - listViewFixes.Columns[1].Text = _languageGeneral.LineNumber; - listViewFixes.Columns[2].Text = _language.Function; - listViewFixes.Columns[3].Text = _languageGeneral.Before; - listViewFixes.Columns[4].Text = _languageGeneral.After; - buttonNextFinish.Text = _language.Next; - buttonBack.Text = _language.Back; - buttonCancel.Text = _languageGeneral.Cancel; - buttonFixesSelectAll.Text = _language.SelectAll; - buttonFixesInverse.Text = _language.InverseSelection; - buttonRefreshFixes.Text = _language.RefreshFixes; - buttonFixesApply.Text = _language.ApplyFixes; - labelStartTime.Text = _languageGeneral.StartTime; - labelDuration.Text = _languageGeneral.Duration; - buttonAutoBreak.Text = _language.AutoBreak; - buttonUnBreak.Text = _language.Unbreak; - buttonSplitLine.Text = _languageGeneral.SplitLine; - subtitleListView1.InitializeLanguage(_languageGeneral, Configuration.Settings); - labelLanguage.Text = Configuration.Settings.Language.ChooseLanguage.Language; - toolStripMenuItemDelete.Text = Configuration.Settings.Language.Main.Menu.ContextMenu.Delete; - mergeSelectedLinesToolStripMenuItem.Text = Configuration.Settings.Language.Main.Menu.ContextMenu.MergeSelectedLines; - buttonResetDefault.Text = _language.SelectDefault; - - toolStripMenuItemInverseSelection.Text = Configuration.Settings.Language.Main.Menu.Edit.InverseSelection; - toolStripMenuItemSelectAll.Text = Configuration.Settings.Language.Main.Menu.ContextMenu.SelectAll; - selectDefaultToolStripMenuItem.Text = _language.SelectDefault; - setCurrentFixesAsDefaultToolStripMenuItem.Text = _language.SetDefault; - - toolStripMenuItemInverseRules.Text = Configuration.Settings.Language.Main.Menu.Edit.InverseSelection; - toolStripMenuItemSelectAllRules.Text = Configuration.Settings.Language.Main.Menu.ContextMenu.SelectAll; - - splitContainerStep2.Panel1MinSize = 110; - splitContainerStep2.Panel2MinSize = 160; - - numericUpDownDuration.Left = timeUpDownStartTime.Left + timeUpDownStartTime.Width; - labelDuration.Left = timeUpDownStartTime.Left + timeUpDownStartTime.Width - 3; - FixLargeFonts(); - listView1.Select(); - } - - private void FixLargeFonts() - { - using (var graphics = CreateGraphics()) - { - var textSize = graphics.MeasureString(buttonCancel.Text, Font); - if (textSize.Height > buttonCancel.Height - 4) - { - subtitleListView1.InitializeTimestampColumnWidths(this); - var newButtonHeight = (int)(textSize.Height + 7 + 0.5); - UiUtil.SetButtonHeight(this, newButtonHeight, 1); - } - } - } - - private void AddFixActionItemToListView(FixItem fi) - { - var item = new ListViewItem(string.Empty) { Tag = fi, Checked = fi.DefaultChecked }; - item.SubItems.Add(fi.Name); - item.SubItems.Add(fi.Example); - listView1.Items.Add(item); - } - - public void AddFixToListView(Paragraph p, string action, string before, string after) - { - AddFixToListView(p, action, before, after, true); - } - - public void AddFixToListView(Paragraph p, string action, string before, string after, bool isChecked) - { - if (_onlyListFixes) - { - var item = new ListViewItem(string.Empty) { Checked = isChecked, Tag = p }; - item.SubItems.Add(p.Number.ToString(CultureInfo.InvariantCulture)); - item.SubItems.Add(action); - item.SubItems.Add(UiUtil.GetListViewTextFromString(before)); - item.SubItems.Add(UiUtil.GetListViewTextFromString(after)); - listViewFixes.Items.Add(item); - } - } - - public bool AllowFix(Paragraph p, string action) - { - if (_onlyListFixes || BatchMode) - { - return true; - } - - return _allowedFixes.Contains(p.Number.ToString(CultureInfo.InvariantCulture) + "|" + action); - } - - public void ShowStatus(string message) - { - message = message.Replace(Environment.NewLine, " "); - if (message.Length > 103) - { - message = message.Substring(0, 100) + "..."; - } - - labelStatus.Text = message; - labelStatus.Refresh(); - } - - public void LogStatus(string sender, string message, bool isImportant) - { - if (isImportant) - { - _numberOfImportantLogMessages++; - } - - LogStatus(sender, message); - } - - public void LogStatus(string sender, string message) - { - if (!string.IsNullOrEmpty(message)) - { - message += Environment.NewLine; - if (_onlyListFixes) - { - _newLog.AppendLine(" + " + sender + ": " + message); - } - else - { - _appliedLog.AppendLine(string.Format(_language.FixedOkXY, sender, message)); - } - } - } - - public bool IsName(string candidate) - { - MakeSureNameListIsLoaded(); - return _nameList.Contains(candidate); // O(1) - } - - private void MakeSureNameListIsLoaded() - { - if (_nameList == null) - { - string languageTwoLetterCode = LanguageAutoDetect.AutoDetectGoogleLanguage(Subtitle); - // Will contains both one word names and multi names - var namesList = new NameList(Configuration.DictionariesDirectory, languageTwoLetterCode, Configuration.Settings.WordLists.UseOnlineNames, Configuration.Settings.WordLists.NamesUrl); - _nameList = namesList.GetNames(); - // Multi word names. - foreach (var name in namesList.GetMultiNames()) - { - _nameList.Add(name); - } - } - } - - public HashSet GetAbbreviations() - { - if (_abbreviationList != null) - { - return _abbreviationList; - } - - MakeSureNameListIsLoaded(); - _abbreviationList = new HashSet(); - foreach (string name in _nameList) - { - if (name.EndsWith('.')) - { - _abbreviationList.Add(name); - } - } - return _abbreviationList; - } - - private OcrFixEngine _ocrFixEngine; - private string _ocrFixEngineLanguage; - - public void FixOcrErrorsViaReplaceList(string threeLetterIsoLanguageName) - { - if (_ocrFixEngine == null || _ocrFixEngineLanguage != threeLetterIsoLanguageName) - { - _ocrFixEngine?.Dispose(); - _ocrFixEngineLanguage = threeLetterIsoLanguageName; - _ocrFixEngine = new OcrFixEngine(_ocrFixEngineLanguage, null, this); - } - - string fixAction = _language.FixCommonOcrErrors; - int noOfFixes = 0; - string lastLine = string.Empty; - for (int i = 0; i < Subtitle.Paragraphs.Count; i++) - { - var p = Subtitle.Paragraphs[i]; - string text = _ocrFixEngine.FixOcrErrors(p.Text, i, lastLine, false, OcrFixEngine.AutoGuessLevel.Cautious); - lastLine = text; - if (AllowFix(p, fixAction) && p.Text != text) - { - string oldText = p.Text; - p.Text = text; - noOfFixes++; - AddFixToListView(p, fixAction, oldText, p.Text); - } - Application.DoEvents(); - } - if (noOfFixes > 0) - { - _totalFixes += noOfFixes; - LogStatus(_language.FixCommonOcrErrors, string.Format(_language.CommonOcrErrorsFixed, noOfFixes)); - } - } - - public void UpdateFixStatus(int fixes, string message, string xMessage) - { - if (fixes > 0) - { - _totalFixes += fixes; - LogStatus(message, string.Format(xMessage, fixes)); - } - } - - private void ButtonFixClick(object sender, EventArgs e) - { - if (buttonBack.Enabled) - { - Cursor = Cursors.WaitCursor; - SaveConfiguration(); - Cursor = Cursors.Default; - DialogResult = DialogResult.OK; - } - else - { - Cursor = Cursors.WaitCursor; - Next(); - ShowAvailableFixesStatus(false); - } - Cursor = Cursors.Default; - } - - private void Next() - { - RunSelectedActions(); - - buttonBack.Enabled = true; - buttonNextFinish.Text = _languageGeneral.Ok; - buttonNextFinish.Enabled = _hasFixesBeenMade || _linesDeletedOrMerged; - groupBoxStep1.Visible = false; - groupBox2.Visible = true; - listViewFixes.Sort(); - subtitleListView1.Fill(FixedSubtitle); - if (listViewFixes.Items.Count > 0) - { - listViewFixes.Items[0].Selected = true; - } - else - { - subtitleListView1.SelectIndexAndEnsureVisible(0); - } - } - - private void RunSelectedActions() - { - subtitleListView1.BeginUpdate(); - _newLog.Clear(); - - Subtitle = new Subtitle(FixedSubtitle, false); - if (listView1.Items[IndexFixOcrErrorsViaReplaceList].Checked) - { - var fixItem = (FixItem)listView1.Items[IndexFixOcrErrorsViaReplaceList].Tag; - fixItem.Action.Invoke(); - } - foreach (ListViewItem item in listView1.Items) - { - if (item.Checked && item.Index != IndexRemoveEmptyLines) - { - var fixItem = (FixItem)item.Tag; - fixItem.Action.Invoke(); - } - } - if (listView1.Items[IndexInvalidItalicTags].Checked) - { - var fixItem = (FixItem)listView1.Items[IndexInvalidItalicTags].Tag; - fixItem.Action.Invoke(); - } - if (listView1.Items[IndexRemoveEmptyLines].Checked) - { - var fixItem = (FixItem)listView1.Items[IndexRemoveEmptyLines].Tag; - fixItem.Action.Invoke(); - } - - // build log - textBoxFixedIssues.Text = string.Empty; - if (_newLog.Length >= 0) - { - textBoxFixedIssues.AppendText(_newLog + Environment.NewLine); - } - - textBoxFixedIssues.AppendText(_appliedLog.ToString()); - subtitleListView1.EndUpdate(); - } - - private void FormFixKeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - else if (e.KeyCode == UiUtil.HelpKeys) - { - Utilities.ShowHelp("#fixcommonerrors"); - } - else if (e.KeyCode == Keys.Enter && buttonNextFinish.Text == _language.Next) - { - ButtonFixClick(null, null); - } - else if (subtitleListView1.Visible && subtitleListView1.Items.Count > 0 && e.KeyData == _goToLine) - { - GoToLineNumber(); - } - else if (e.KeyData == _preview && listViewFixes.Items.Count > 0) - { - GenerateDiff(); - } - else if (_mainGeneralGoToNextSubtitle == e.KeyData || (e.KeyCode == Keys.Down && e.Modifiers == Keys.Alt)) - { - int selectedIndex = 0; - if (subtitleListView1.SelectedItems.Count > 0) - { - selectedIndex = subtitleListView1.SelectedItems[0].Index; - selectedIndex++; - } - subtitleListView1.SelectIndexAndEnsureVisible(selectedIndex); - } - else if (_mainGeneralGoToPrevSubtitle == e.KeyData || (e.KeyCode == Keys.Up && e.Modifiers == Keys.Alt)) - { - int selectedIndex = 0; - if (subtitleListView1.SelectedItems.Count > 0) - { - selectedIndex = subtitleListView1.SelectedItems[0].Index; - selectedIndex--; - } - subtitleListView1.SelectIndexAndEnsureVisible(selectedIndex); - } - else if (_mainListViewGoToNextError == e.KeyData) - { - GoToNextSyntaxError(); - e.SuppressKeyPress = true; - } - } - - private void GoToNextSyntaxError() - { - int idx = 0; - try - { - if (listViewFixes.SelectedItems.Count > 0) - { - idx = listViewFixes.SelectedItems[0].Index; - } - - idx++; - if (listViewFixes.Items.Count > idx) - { - listViewFixes.Items[idx].Selected = true; - listViewFixes.Items[idx].EnsureVisible(); - if (idx > 0) - { - listViewFixes.Items[idx - 1].Selected = false; - } - } - } - catch - { - // ignored - } - } - - private void GoToLineNumber() - { - using (var goToLine = new GoToLine()) - { - goToLine.Initialize(1, subtitleListView1.Items.Count); - if (goToLine.ShowDialog(this) == DialogResult.OK) - { - subtitleListView1.SelectNone(); - subtitleListView1.Items[goToLine.LineNumber - 1].Selected = true; - subtitleListView1.Items[goToLine.LineNumber - 1].EnsureVisible(); - subtitleListView1.Items[goToLine.LineNumber - 1].Focused = true; - } - } - } - - private void GenerateDiff() - { - string htmlFileName = FileUtil.GetTempFileName(".html"); - var sb = new StringBuilder(); - sb.Append("Subtitle Edit - Fix common errors preview"); - sb.AppendLine($""); - foreach (ListViewItem item in listViewFixes.Items) - { - if (item.Checked) - { - var p = (Paragraph)item.Tag; - string what = item.SubItems[2].Text; - string before = item.SubItems[3].Text; - string after = item.SubItems[4].Text; - var arr = MakeDiffHtml(before, after); - sb.AppendLine($""); - } - } - sb.Append("
{_languageGeneral.LineNumber}{_language.Function}{_languageGeneral.Before}{_languageGeneral.After}
{p.Number}{what}
{arr[0]}
{arr[1]}
"); - File.WriteAllText(htmlFileName, sb.ToString()); - UiUtil.OpenFile(htmlFileName); - } - - private static string[] MakeDiffHtml(string before, string after) - { - before = before.Replace("
", "↲"); - after = after.Replace("
", "↲"); - before = before.Replace(Environment.NewLine, "↲"); - after = after.Replace(Environment.NewLine, "↲"); - - var beforeColors = new Dictionary(); - var beforeBackgroundColors = new Dictionary(); - var afterColors = new Dictionary(); - var afterBackgroundColors = new Dictionary(); - - // from start - int minLength = Math.Min(before.Length, after.Length); - int startCharactersOk = 0; - for (int i = 0; i < minLength; i++) - { - if (before[i] == after[i]) - { - startCharactersOk++; - } - else - { - if (before.Length > i + 4 && after.Length > i + 4 && - before[i + 1] == after[i + 1] && - before[i + 2] == after[i + 2] && - before[i + 3] == after[i + 3] && - before[i + 4] == after[i + 4]) - { - startCharactersOk++; - - if (char.IsWhiteSpace(before[i])) - { - beforeBackgroundColors.Add(i, Color.Red); - } - else - { - beforeColors.Add(i, Color.Red); - } - - if (char.IsWhiteSpace(after[i])) - { - afterBackgroundColors.Add(i, Color.Red); - } - else - { - afterColors.Add(i, Color.Red); - } - } - else - { - break; - } - } - } - - int maxLength = Math.Max(before.Length, after.Length); - for (int i = startCharactersOk; i <= maxLength; i++) - { - if (i < before.Length) - { - if (char.IsWhiteSpace(before[i])) - { - beforeBackgroundColors.Add(i, Color.Red); - } - else - { - beforeColors.Add(i, Color.Red); - } - } - if (i < after.Length) - { - if (char.IsWhiteSpace(after[i])) - { - afterBackgroundColors.Add(i, Color.Red); - } - else - { - afterColors.Add(i, Color.Red); - } - } - } - - // from end - for (int i = 1; i < minLength; i++) - { - int bLength = before.Length - i; - int aLength = after.Length - i; - if (before[bLength] == after[aLength]) - { - if (beforeColors.ContainsKey(bLength)) - { - beforeColors.Remove(bLength); - } - - if (beforeBackgroundColors.ContainsKey(bLength)) - { - beforeBackgroundColors.Remove(bLength); - } - - if (afterColors.ContainsKey(aLength)) - { - afterColors.Remove(aLength); - } - - if (afterBackgroundColors.ContainsKey(aLength)) - { - afterBackgroundColors.Remove(aLength); - } - } - else - { - break; - } - } - - var sb = new StringBuilder(); - for (int i = 0; i < before.Length; i++) - { - var s = before[i]; - if (beforeColors.ContainsKey(i) && beforeBackgroundColors.ContainsKey(i)) - { - sb.AppendFormat("{2}", ColorTranslator.ToHtml(beforeColors[i]), ColorTranslator.ToHtml(beforeBackgroundColors[i]), s); - } - else if (beforeColors.ContainsKey(i)) - { - sb.AppendFormat("{1}", ColorTranslator.ToHtml(beforeColors[i]), s); - } - else if (beforeBackgroundColors.ContainsKey(i)) - { - sb.AppendFormat("{1}", ColorTranslator.ToHtml(beforeBackgroundColors[i]), s); - } - else - { - sb.Append(s); - } - } - var sb2 = new StringBuilder(); - for (int i = 0; i < after.Length; i++) - { - var s = after[i]; - if (afterColors.ContainsKey(i) && afterBackgroundColors.ContainsKey(i)) - { - sb2.AppendFormat("{2}", ColorTranslator.ToHtml(afterColors[i]), ColorTranslator.ToHtml(afterBackgroundColors[i]), s); - } - else if (afterColors.ContainsKey(i)) - { - sb2.AppendFormat("{1}", ColorTranslator.ToHtml(afterColors[i]), s); - } - else if (afterBackgroundColors.ContainsKey(i)) - { - sb2.AppendFormat("{1}", ColorTranslator.ToHtml(afterBackgroundColors[i]), s); - } - else - { - sb2.Append(s); - } - } - - return new[] { sb.ToString(), sb2.ToString() }; - } - - private void SaveConfiguration() - { - var ce = Configuration.Settings.CommonErrors; - - ce.EmptyLinesTicked = listView1.Items[IndexRemoveEmptyLines].Checked; - ce.OverlappingDisplayTimeTicked = listView1.Items[IndexOverlappingDisplayTime].Checked; - ce.TooShortDisplayTimeTicked = listView1.Items[IndexTooShortDisplayTime].Checked; - ce.TooLongDisplayTimeTicked = listView1.Items[IndexTooLongDisplayTime].Checked; - ce.TooShortGapTicked = listView1.Items[IndexTooShortGap].Checked; - ce.InvalidItalicTagsTicked = listView1.Items[IndexInvalidItalicTags].Checked; - ce.UnneededSpacesTicked = listView1.Items[IndexUnneededSpaces].Checked; - ce.UnneededPeriodsTicked = listView1.Items[IndexUnneededPeriods].Checked; - ce.FixCommasTicked = listView1.Items[IndexFixCommas].Checked; - ce.MissingSpacesTicked = listView1.Items[IndexMissingSpaces].Checked; - ce.BreakLongLinesTicked = listView1.Items[IndexBreakLongLines].Checked; - ce.MergeShortLinesTicked = listView1.Items[IndexMergeShortLines].Checked; - ce.MergeShortLinesAllTicked = listView1.Items[IndexMergeShortLinesAll].Checked; - - ce.UppercaseIInsideLowercaseWordTicked = listView1.Items[IndexUppercaseIInsideLowercaseWord].Checked; - ce.DoubleApostropheToQuoteTicked = listView1.Items[IndexDoubleApostropheToQuote].Checked; - ce.FixMusicNotationTicked = listView1.Items[IndexFixMusicNotation].Checked; - ce.AddPeriodAfterParagraphTicked = listView1.Items[IndexAddPeriodAfterParagraph].Checked; - ce.StartWithUppercaseLetterAfterParagraphTicked = listView1.Items[IndexStartWithUppercaseLetterAfterParagraph].Checked; - ce.StartWithUppercaseLetterAfterPeriodInsideParagraphTicked = listView1.Items[IndexStartWithUppercaseLetterAfterPeriodInsideParagraph].Checked; - ce.StartWithUppercaseLetterAfterColonTicked = listView1.Items[IndexStartWithUppercaseLetterAfterColon].Checked; - ce.AddMissingQuotesTicked = listView1.Items[IndexAddMissingQuotes].Checked; - ce.FixHyphensTicked = listView1.Items[IndexFixHyphens].Checked; - ce.FixHyphensRemoveSingleLineTicked = listView1.Items[IndexRemoveHyphensSingleLine].Checked; - ce.Fix3PlusLinesTicked = listView1.Items[IndexFix3PlusLines].Checked; - ce.FixDoubleDashTicked = listView1.Items[IndexFixDoubleDash].Checked; - ce.FixDoubleGreaterThanTicked = listView1.Items[IndexFixDoubleGreaterThan].Checked; - ce.FixContinuationStyleTicked = listView1.Items[IndexFixContinuationStyle].Checked; - if (LanguageAutoDetect.IsLanguageWithoutPeriods(Language)) - { - ce.FixContinuationStyleTicked = _oldFixContinuationStyleTicked; - } - - if (Configuration.Settings.General.ContinuationStyle == ContinuationStyle.None) - { - ce.FixEllipsesStartTicked = listView1.Items[IndexFixEllipsesStart].Checked; - } - - ce.FixMissingOpenBracketTicked = listView1.Items[IndexFixMissingOpenBracket].Checked; - if (_indexAloneLowercaseIToUppercaseIEnglish >= 0) - { - ce.AloneLowercaseIToUppercaseIEnglishTicked = listView1.Items[_indexAloneLowercaseIToUppercaseIEnglish].Checked; - } - - ce.FixOcrErrorsViaReplaceListTicked = listView1.Items[IndexFixOcrErrorsViaReplaceList].Checked; - ce.RemoveSpaceBetweenNumberTicked = listView1.Items[IndexRemoveSpaceBetweenNumbers].Checked; - ce.FixDialogsOnOneLineTicked = listView1.Items[IndexDialogsOnOneLine].Checked; - ce.NormalizeStringsTicked = listView1.Items[IndexNormalizeStrings].Checked; - if (_danishLetterIIndex >= 0) - { - ce.DanishLetterITicked = listView1.Items[_danishLetterIIndex].Checked; - } - - if (_turkishAnsiIndex >= 0) - { - ce.TurkishAnsiTicked = listView1.Items[_turkishAnsiIndex].Checked; - } - - if (_spanishInvertedQuestionAndExclamationMarksIndex >= 0) - { - ce.SpanishInvertedQuestionAndExclamationMarksTicked = listView1.Items[_spanishInvertedQuestionAndExclamationMarksIndex].Checked; - } - - Configuration.Settings.Save(); - } - - private void ButtonBackClick(object sender, EventArgs e) - { - buttonNextFinish.Enabled = true; - _totalFixes = 0; - _onlyListFixes = true; - buttonBack.Enabled = false; - buttonNextFinish.Text = _language.Next; - groupBox2.Visible = false; - groupBoxStep1.Visible = true; - ShowStatus(string.Empty); - listViewFixes.Items.Clear(); - } - - private void ButtonCancelClick(object sender, EventArgs e) - { - SaveConfiguration(); - } - - private void ListViewFixesColumnClick(object sender, ColumnClickEventArgs e) - { - var sorter = (ListViewSorter)listViewFixes.ListViewItemSorter; - - if (e.Column == sorter.ColumnNumber) - { - sorter.Descending = !sorter.Descending; // inverse sort direction - } - else - { - sorter.ColumnNumber = e.Column; - sorter.Descending = false; - sorter.IsNumber = e.Column == 1; // only index 1 is numeric - } - listViewFixes.Sort(); - } - - private void ButtonSelectAllClick(object sender, EventArgs e) - { - foreach (ListViewItem item in listView1.Items) - { - item.Checked = true; - } - } - - private void ButtonInverseSelectionClick(object sender, EventArgs e) - { - foreach (ListViewItem item in listView1.Items) - { - item.Checked = !item.Checked; - } - } - - private void ListViewFixesSelectedIndexChanged(object sender, EventArgs e) - { - if (listViewFixes.SelectedItems.Count > 0) - { - var p = (Paragraph)listViewFixes.SelectedItems[0].Tag; - - foreach (ListViewItem lvi in subtitleListView1.Items) - { - if (lvi.Tag is Paragraph p2 && p.Id == p2.Id) - { - var index = lvi.Index; - if (index - 1 > 0) - { - subtitleListView1.EnsureVisible(index - 1); - } - - if (index + 1 < subtitleListView1.Items.Count) - { - subtitleListView1.EnsureVisible(index + 1); - } - - subtitleListView1.SelectedIndexChanged -= SubtitleListView1SelectedIndexChanged; - subtitleListView1.SelectNone(); - subtitleListView1.SelectedIndexChanged += SubtitleListView1SelectedIndexChanged; - subtitleListView1.Items[index].Selected = true; - subtitleListView1.EnsureVisible(index); - return; - } - } - } - } - - private void SubtitleListView1SelectedIndexChanged(object sender, EventArgs e) - { - if (FixedSubtitle.Paragraphs.Count > 0) - { - int firstSelectedIndex = 0; - if (subtitleListView1.SelectedItems.Count > 0) - { - firstSelectedIndex = subtitleListView1.SelectedItems[0].Index; - } - - Paragraph p = FixedSubtitle.GetParagraphOrDefault(firstSelectedIndex); - if (p != null) - { - InitializeListViewEditBox(p); - _subtitleListViewIndex = firstSelectedIndex; - UpdateOverlapErrors(); - UpdateListViewTextInfo(p.Text); - } - } - } - - private void TextBoxListViewTextTextChanged(object sender, EventArgs e) - { - if (_subtitleListViewIndex >= 0) - { - string text = textBoxListViewText.Text.TrimEnd(); - UpdateListViewTextInfo(text); - - // update _subtitle + listview - FixedSubtitle.Paragraphs[_subtitleListViewIndex].Text = text; - subtitleListView1.SetText(_subtitleListViewIndex, text); - - EnableOkButton(); - UpdateListSyntaxColoring(); - } - } - - private void EnableOkButton() - { - if (!_hasFixesBeenMade) - { - _hasFixesBeenMade = true; - buttonNextFinish.Enabled = true; - } - } - - private void InitializeListViewEditBox(Paragraph p) - { - textBoxListViewText.TextChanged -= TextBoxListViewTextTextChanged; - textBoxListViewText.Text = p.Text; - textBoxListViewText.TextChanged += TextBoxListViewTextTextChanged; - - timeUpDownStartTime.MaskedTextBox.TextChanged -= MaskedTextBox_TextChanged; - timeUpDownStartTime.TimeCode = p.StartTime; - timeUpDownStartTime.MaskedTextBox.TextChanged += MaskedTextBox_TextChanged; - - numericUpDownDuration.ValueChanged -= NumericUpDownDurationValueChanged; - numericUpDownDuration.Value = (decimal)(p.Duration.TotalMilliseconds / TimeCode.BaseUnit); - numericUpDownDuration.ValueChanged += NumericUpDownDurationValueChanged; - } - - private void NumericUpDownDurationValueChanged(object sender, EventArgs e) - { - if (FixedSubtitle.Paragraphs.Count > 0 && subtitleListView1.SelectedItems.Count > 0) - { - int firstSelectedIndex = subtitleListView1.SelectedItems[0].Index; - - Paragraph currentParagraph = FixedSubtitle.GetParagraphOrDefault(firstSelectedIndex); - if (currentParagraph != null) - { - UpdateOverlapErrors(); - - // update _subtitle + listview - currentParagraph.EndTime.TotalMilliseconds = currentParagraph.StartTime.TotalMilliseconds + ((double)numericUpDownDuration.Value * TimeCode.BaseUnit); - subtitleListView1.SetDuration(firstSelectedIndex, currentParagraph, FixedSubtitle.GetParagraphOrDefault(firstSelectedIndex + 1)); - } - } - } - - private void UpdateOverlapErrors() - { - labelStartTimeWarning.Text = string.Empty; - labelDurationWarning.Text = string.Empty; - - TimeCode startTime = timeUpDownStartTime.TimeCode; - if (FixedSubtitle.Paragraphs.Count > 0 && subtitleListView1.SelectedItems.Count > 0 && startTime != null) - { - int firstSelectedIndex = subtitleListView1.SelectedItems[0].Index; - - Paragraph prevParagraph = FixedSubtitle.GetParagraphOrDefault(firstSelectedIndex - 1); - if (prevParagraph != null && prevParagraph.EndTime.TotalMilliseconds > startTime.TotalMilliseconds) - { - labelStartTimeWarning.Text = string.Format(_languageGeneral.OverlapPreviousLineX, (prevParagraph.EndTime.TotalMilliseconds - startTime.TotalMilliseconds) / TimeCode.BaseUnit); - } - - Paragraph nextParagraph = FixedSubtitle.GetParagraphOrDefault(firstSelectedIndex + 1); - if (nextParagraph != null) - { - double durationMilliseconds = (double)numericUpDownDuration.Value * TimeCode.BaseUnit; - if (startTime.TotalMilliseconds + durationMilliseconds > nextParagraph.StartTime.TotalMilliseconds) - { - labelDurationWarning.Text = string.Format(_languageGeneral.OverlapNextX, ((startTime.TotalMilliseconds + durationMilliseconds) - nextParagraph.StartTime.TotalMilliseconds) / TimeCode.BaseUnit); - } - - if (labelStartTimeWarning.Text.Length == 0 && - startTime.TotalMilliseconds > nextParagraph.StartTime.TotalMilliseconds) - { - double di = (startTime.TotalMilliseconds - nextParagraph.StartTime.TotalMilliseconds) / TimeCode.BaseUnit; - labelStartTimeWarning.Text = string.Format(_languageGeneral.OverlapNextX, di); - } - else if (numericUpDownDuration.Value < 0) - { - labelDurationWarning.Text = _languageGeneral.Negative; - } - } - } - UpdateListSyntaxColoring(); - } - - private void UpdateListSyntaxColoring() - { - if (FixedSubtitle == null || FixedSubtitle.Paragraphs.Count == 0 || _subtitleListViewIndex < 0 || _subtitleListViewIndex >= Subtitle.Paragraphs.Count) - { - return; - } - - subtitleListView1.SyntaxColorLine(FixedSubtitle.Paragraphs, _subtitleListViewIndex, FixedSubtitle.Paragraphs[_subtitleListViewIndex]); - Paragraph next = FixedSubtitle.GetParagraphOrDefault(_subtitleListViewIndex + 1); - if (next != null) - { - subtitleListView1.SyntaxColorLine(FixedSubtitle.Paragraphs, _subtitleListViewIndex + 1, FixedSubtitle.Paragraphs[_subtitleListViewIndex + 1]); - } - } - - private void MaskedTextBox_TextChanged(object sender, EventArgs e) - { - if (_subtitleListViewIndex >= 0 && - timeUpDownStartTime.TimeCode != null && - FixedSubtitle.Paragraphs.Count > 0 && - subtitleListView1.SelectedItems.Count > 0) - { - TimeCode startTime = timeUpDownStartTime.TimeCode; - labelStartTimeWarning.Text = string.Empty; - labelDurationWarning.Text = string.Empty; - - UpdateOverlapErrors(); - - // update _subtitle + listview - FixedSubtitle.Paragraphs[_subtitleListViewIndex].EndTime.TotalMilliseconds += - (startTime.TotalMilliseconds - FixedSubtitle.Paragraphs[_subtitleListViewIndex].StartTime.TotalMilliseconds); - FixedSubtitle.Paragraphs[_subtitleListViewIndex].StartTime = startTime; - subtitleListView1.SetStartTimeAndDuration(_subtitleListViewIndex, FixedSubtitle.Paragraphs[_subtitleListViewIndex], FixedSubtitle.GetParagraphOrDefault(_subtitleListViewIndex + 1), FixedSubtitle.GetParagraphOrDefault(_subtitleListViewIndex - 1)); - } - } - - private void UpdateListViewTextInfo(string text) - { - labelTextLineLengths.Text = _languageGeneral.SingleLineLengths; - labelSingleLine.Left = labelTextLineLengths.Left + labelTextLineLengths.Width - 6; - text = HtmlUtil.RemoveHtmlTags(text, true); - text = NetflixImsc11Japanese.RemoveTags(text); - UiUtil.GetLineLengths(labelSingleLine, text); - - var s = text.Replace(Environment.NewLine, " "); - labelTextLineTotal.ForeColor = Color.Black; - buttonSplitLine.Visible = false; - var abl = Utilities.AutoBreakLine(s, _autoDetectGoogleLanguage).SplitToLines(); - if (abl.Count > Configuration.Settings.General.MaxNumberOfLines || abl.Any(li => li.CountCharacters(false, Configuration.Settings.General.IgnoreArabicDiacritics) > Configuration.Settings.General.SubtitleLineMaximumLength)) - { - buttonSplitLine.Visible = true; - labelTextLineTotal.ForeColor = Color.Red; - } - labelTextLineTotal.Text = string.Format(_languageGeneral.TotalLengthX, text.CountCharacters(false, Configuration.Settings.General.IgnoreArabicDiacritics)); - } - - private void ButtonFixesSelectAllClick(object sender, EventArgs e) - { - foreach (ListViewItem item in listViewFixes.Items) - { - item.Checked = true; - } - } - - private void ButtonFixesInverseClick(object sender, EventArgs e) - { - foreach (ListViewItem item in listViewFixes.Items) - { - item.Checked = !item.Checked; - } - } - - private void ButtonFixesApplyClick(object sender, EventArgs e) - { - buttonFixesApply.Enabled = false; - _hasFixesBeenMade = true; - Cursor = Cursors.WaitCursor; - ShowStatus(_language.Analysing); - - _subtitleListViewIndex = -1; - int firstSelectedIndex = 0; - if (subtitleListView1.SelectedItems.Count > 0) - { - firstSelectedIndex = subtitleListView1.SelectedItems[0].Index; - } - - _allowedFixes = new HashSet(); - foreach (ListViewItem item in listViewFixes.Items) - { - if (item.Checked) - { - string key = item.SubItems[1].Text + "|" + item.SubItems[2].Text; - if (!_allowedFixes.Contains(key)) - { - _allowedFixes.Add(key); - } - } - } - - _numberOfImportantLogMessages = 0; - _onlyListFixes = false; - _totalFixes = 0; - _totalErrors = 0; - RunSelectedActions(); - FixedSubtitle = new Subtitle(Subtitle, false); - subtitleListView1.Fill(FixedSubtitle); - ShowAvailableFixesStatus(true); - RefreshFixes(); - if (listViewFixes.Items.Count == 0) - { - subtitleListView1.SelectIndexAndEnsureVisible(firstSelectedIndex); - } - - Cursor = Cursors.Default; - if (_numberOfImportantLogMessages == 0) - { - labelNumberOfImportantLogMessages.Text = string.Empty; - } - else - { - labelNumberOfImportantLogMessages.Text = string.Format(_language.NumberOfImportantLogMessages, _numberOfImportantLogMessages); - } - - buttonFixesApply.Enabled = true; - } - - private void ButtonRefreshFixesClick(object sender, EventArgs e) - { - Cursor = Cursors.WaitCursor; - ShowStatus(_language.Analysing); - _totalFixes = 0; - RefreshFixes(); - ShowAvailableFixesStatus(false); - Cursor = Cursors.Default; - } - - private void ShowAvailableFixesStatus(bool applied) - { - labelStatus.ForeColor = DefaultForeColor; - if (_totalFixes == 0 && _totalErrors == 0) - { - ShowStatus(_language.NothingToFix); - if (subtitleListView1.SelectedItems.Count == 0) - { - subtitleListView1.SelectIndexAndEnsureVisible(0); - } - } - else if (_totalFixes > 0) - { - if (_totalErrors > 0) - { - labelStatus.ForeColor = Color.Red; - ShowStatus(string.Format(applied ? _language.XFixedBut : _language.XCouldBeFixedBut, _totalFixes)); - } - else - { - ShowStatus(string.Format(applied ? _language.XFixesApplied : _language.FixesFoundX, _totalFixes)); - } - } - else if (_totalErrors > 0) - { - labelStatus.ForeColor = Color.Red; - ShowStatus(_language.NothingFixableBut); - } - - TopMost = true; - BringToFront(); - TopMost = false; - } - - private void RefreshFixes() - { - listViewFixes.BeginUpdate(); - - // save de-selected fixes - var deSelectedFixes = new List(); - foreach (ListViewItem item in listViewFixes.Items) - { - if (!item.Checked) - { - deSelectedFixes.Add(item.SubItems[1].Text + item.SubItems[2].Text + item.SubItems[3].Text); - } - } - - listViewFixes.Items.Clear(); - _onlyListFixes = true; - Next(); - - // restore de-selected fixes - foreach (ListViewItem item in listViewFixes.Items) - { - if (deSelectedFixes.Contains(item.SubItems[1].Text + item.SubItems[2].Text + item.SubItems[3].Text)) - { - item.Checked = false; - } - } - - listViewFixes.EndUpdate(); - } - - private void ButtonAutoBreakClick(object sender, EventArgs e) - { - if (textBoxListViewText.Text.Length > 0) - { - string oldText = textBoxListViewText.Text; - textBoxListViewText.Text = Utilities.AutoBreakLine(textBoxListViewText.Text, Language); - if (oldText != textBoxListViewText.Text) - { - EnableOkButton(); - } - } - } - - private void ButtonUnBreakClick(object sender, EventArgs e) - { - string oldText = textBoxListViewText.Text; - textBoxListViewText.Text = Utilities.UnbreakLine(textBoxListViewText.Text); - if (oldText != textBoxListViewText.Text) - { - EnableOkButton(); - } - } - - private void ToolStripMenuItemDeleteClick(object sender, EventArgs e) - { - if (FixedSubtitle.Paragraphs.Count <= 0 || subtitleListView1.SelectedItems.Count <= 0) - { - return; - } - - var askText = subtitleListView1.SelectedItems.Count > 1 ? string.Format(Configuration.Settings.Language.Main.DeleteXLinesPrompt, subtitleListView1.SelectedItems.Count) : Configuration.Settings.Language.Main.DeleteOneLinePrompt; - if (Configuration.Settings.General.PromptDeleteLines && MessageBox.Show(askText, Configuration.Settings.Language.General.Title, MessageBoxButtons.YesNoCancel) != DialogResult.Yes) - { - return; - } - - _linesDeletedOrMerged = true; - _subtitleListViewIndex = -1; - var indexes = new List(); - foreach (ListViewItem item in subtitleListView1.SelectedItems) - { - indexes.Add(item.Index); - } - - int firstIndex = subtitleListView1.SelectedItems[0].Index; - - // save de-selected fixes - var deSelectedFixes = new List(); - foreach (ListViewItem item in listViewFixes.Items) - { - if (!item.Checked) - { - int number = Convert.ToInt32(item.SubItems[1].Text); - if (number > firstIndex) - { - number -= subtitleListView1.SelectedItems.Count; - } - - if (number >= 0) - { - deSelectedFixes.Add(number + item.SubItems[2].Text + item.SubItems[3].Text); - } - } - } - - FixedSubtitle.RemoveParagraphsByIndices(indexes); - FixedSubtitle.Renumber(); - subtitleListView1.Fill(FixedSubtitle); - - // refresh fixes - listViewFixes.Items.Clear(); - _onlyListFixes = true; - Next(); - - // restore de-selected fixes - if (deSelectedFixes.Count > 0) - { - foreach (ListViewItem item in listViewFixes.Items) - { - if (deSelectedFixes.Contains(item.SubItems[1].Text + item.SubItems[2].Text + item.SubItems[3].Text)) - { - item.Checked = false; - } - } - } - - if (subtitleListView1.Items.Count > firstIndex) - { - subtitleListView1.SelectIndexAndEnsureVisible(firstIndex, true); - } - else if (subtitleListView1.Items.Count > 0) - { - subtitleListView1.SelectIndexAndEnsureVisible(subtitleListView1.Items.Count - 1, true); - } - } - - private void MergeSelectedLinesToolStripMenuItemClick(object sender, EventArgs e) - { - if (FixedSubtitle.Paragraphs.Count > 0 && subtitleListView1.SelectedItems.Count > 0) - { - _linesDeletedOrMerged = true; - int startNumber = FixedSubtitle.Paragraphs[0].Number; - int firstSelectedIndex = subtitleListView1.SelectedItems[0].Index; - - // save de-selected fixes - var deSelectedFixes = new List(); - foreach (ListViewItem item in listViewFixes.Items) - { - if (!item.Checked) - { - int firstSelectedNumber = subtitleListView1.GetSelectedParagraph(FixedSubtitle).Number; - int number = Convert.ToInt32(item.SubItems[1].Text); - if (number > firstSelectedNumber) - { - number--; - } - - deSelectedFixes.Add(number + item.SubItems[2].Text + item.SubItems[3].Text); - } - } - - var currentParagraph = FixedSubtitle.GetParagraphOrDefault(firstSelectedIndex); - var nextParagraph = FixedSubtitle.GetParagraphOrDefault(firstSelectedIndex + 1); - - if (nextParagraph != null && currentParagraph != null) - { - subtitleListView1.SelectedIndexChanged -= SubtitleListView1SelectedIndexChanged; - - currentParagraph.Text = currentParagraph.Text.Replace(Environment.NewLine, " "); - currentParagraph.Text += Environment.NewLine + nextParagraph.Text.Replace(Environment.NewLine, " "); - currentParagraph.EndTime = nextParagraph.EndTime; - - FixedSubtitle.Paragraphs.Remove(nextParagraph); - - FixedSubtitle.Renumber(startNumber); - subtitleListView1.Fill(FixedSubtitle); - subtitleListView1.SelectIndexAndEnsureVisible(firstSelectedIndex); - subtitleListView1.SelectedIndexChanged += SubtitleListView1SelectedIndexChanged; - _subtitleListViewIndex = -1; - SubtitleListView1SelectedIndexChanged(null, null); - } - - // refresh fixes - listViewFixes.Items.Clear(); - _onlyListFixes = true; - Next(); - - // restore de-selected fixes - foreach (ListViewItem item in listViewFixes.Items) - { - if (deSelectedFixes.Contains(item.SubItems[1].Text + item.SubItems[2].Text + item.SubItems[3].Text)) - { - item.Checked = false; - } - } - } - } - - private void ContextMenuStripListviewOpening(object sender, System.ComponentModel.CancelEventArgs e) - { - if (subtitleListView1.SelectedItems.Count == 0) - { - e.Cancel = true; - } - else if (subtitleListView1.SelectedItems.Count == 2 && - subtitleListView1.SelectedItems[0].Index == subtitleListView1.SelectedItems[1].Index - 1) - { - mergeSelectedLinesToolStripMenuItem.Visible = true; - toolStripSeparator1.Visible = true; - } - else - { - mergeSelectedLinesToolStripMenuItem.Visible = false; - toolStripSeparator1.Visible = false; - } - } - - private void FixCommonErrorsResize(object sender, EventArgs e) - { - groupBox2.Width = Width - (groupBox2.Left * 2 + 15); - groupBoxStep1.Width = Width - (groupBoxStep1.Left * 2 + 15); - buttonCancel.Left = Width - (buttonCancel.Width + 26); - buttonNextFinish.Left = buttonCancel.Left - (buttonNextFinish.Width + 6); - buttonBack.Left = buttonNextFinish.Left - (buttonBack.Width + 6); - tabControl1.Width = groupBox2.Width - (tabControl1.Left * 2); - listView1.Width = groupBoxStep1.Width - (listView1.Left * 2); - - ListViewFixesAutoSizeAllColumns(); - subtitleListView1.AutoSizeAllColumns(this); - } - - public void ListViewFixesAutoSizeAllColumns() - { - using (var graphics = CreateGraphics()) - { - var timestampSizeF = graphics.MeasureString(listViewFixes.Columns[0].Text, Font); // Apply - var width = (int)(timestampSizeF.Width + 12); - listViewFixes.Columns[0].Width = width; - - timestampSizeF = graphics.MeasureString(listViewFixes.Columns[1].Text, Font); // line# - width = (int)(timestampSizeF.Width + 12); - listViewFixes.Columns[1].Width = width; - - timestampSizeF = graphics.MeasureString("Auto break all lines and even more stuff", Font); // Function - width = (int)(timestampSizeF.Width + 12); - listViewFixes.Columns[2].Width = width; - - int length = listViewFixes.Columns[0].Width + listViewFixes.Columns[1].Width + listViewFixes.Columns[2].Width; - int lengthAvailable = Width - length; - width = (lengthAvailable - 10) / 2; - listViewFixes.Columns[3].Width = width; // before - listViewFixes.Columns[4].Width = width; // after - } - } - - private void FixCommonErrorsShown(object sender, EventArgs e) - { - FixCommonErrorsResize(null, null); - } - - private void SplitSelectedParagraph(double? splitSeconds) - { - if (FixedSubtitle.Paragraphs.Count > 0 && subtitleListView1.SelectedItems.Count > 0) - { - subtitleListView1.SelectedIndexChanged -= SubtitleListView1SelectedIndexChanged; - int firstSelectedIndex = subtitleListView1.SelectedItems[0].Index; - - // save de-selected fixes - var deSelectedFixes = new List(); - foreach (ListViewItem item in listViewFixes.Items) - { - if (!item.Checked) - { - int number = Convert.ToInt32(item.SubItems[1].Text); - if (number > firstSelectedIndex) - { - number++; - } - - deSelectedFixes.Add(number + item.SubItems[2].Text + item.SubItems[3].Text); - } - } - - Paragraph currentParagraph = FixedSubtitle.GetParagraphOrDefault(firstSelectedIndex); - var newParagraph = new Paragraph(); - - string oldText = currentParagraph.Text; - var lines = currentParagraph.Text.SplitToLines(); - if (lines.Count == 2 && (lines[0].EndsWith('.') || lines[0].EndsWith('!') || lines[0].EndsWith('?'))) - { - currentParagraph.Text = Utilities.AutoBreakLine(lines[0], Language); - newParagraph.Text = Utilities.AutoBreakLine(lines[1], Language); - } - else - { - string s = Utilities.AutoBreakLine(currentParagraph.Text, 5, Configuration.Settings.General.MergeLinesShorterThan, Language); - lines = s.SplitToLines(); - if (lines.Count == 2) - { - currentParagraph.Text = Utilities.AutoBreakLine(lines[0], Language); - newParagraph.Text = Utilities.AutoBreakLine(lines[1], Language); - } - else if (lines.Count > 2) - { - var half = lines.Count / 2; - var sb1 = new StringBuilder(); - for (int i = 0; i < half; i++) - { - sb1.AppendLine(lines[i]); - } - - currentParagraph.Text = Utilities.AutoBreakLine(sb1.ToString(), _autoDetectGoogleLanguage); - sb1 = new StringBuilder(); - for (int i = half; i < lines.Count; i++) - { - sb1.AppendLine(lines[i]); - } - - newParagraph.Text = Utilities.AutoBreakLine(sb1.ToString(), _autoDetectGoogleLanguage); - } - } - - double startFactor = (double)HtmlUtil.RemoveHtmlTags(currentParagraph.Text).Length / HtmlUtil.RemoveHtmlTags(oldText).Length; - if (startFactor < 0.20) - { - startFactor = 0.20; - } - - if (startFactor > 0.80) - { - startFactor = 0.80; - } - - double middle = currentParagraph.StartTime.TotalMilliseconds + (currentParagraph.Duration.TotalMilliseconds * startFactor); - if (splitSeconds.HasValue && splitSeconds.Value > (currentParagraph.StartTime.TotalSeconds + 0.2) && splitSeconds.Value < (currentParagraph.EndTime.TotalSeconds - 0.2)) - { - middle = splitSeconds.Value * TimeCode.BaseUnit; - } - - newParagraph.EndTime.TotalMilliseconds = currentParagraph.EndTime.TotalMilliseconds; - currentParagraph.EndTime.TotalMilliseconds = middle; - newParagraph.StartTime.TotalMilliseconds = currentParagraph.EndTime.TotalMilliseconds + 1; - - FixedSubtitle.Paragraphs.Insert(firstSelectedIndex + 1, newParagraph); - FixedSubtitle.Renumber(); - subtitleListView1.Fill(FixedSubtitle); - textBoxListViewText.Text = currentParagraph.Text; - - subtitleListView1.SelectIndexAndEnsureVisible(firstSelectedIndex); - subtitleListView1.SelectedIndexChanged += SubtitleListView1SelectedIndexChanged; - - // restore de-selected fixes - listViewFixes.Items.Clear(); - _onlyListFixes = true; - Next(); - foreach (ListViewItem item in listViewFixes.Items) - { - if (deSelectedFixes.Contains(item.SubItems[1].Text + item.SubItems[2].Text + item.SubItems[3].Text)) - { - item.Checked = false; - } - } - } - } - - private void ButtonSplitLineClick(object sender, EventArgs e) - { - SplitSelectedParagraph(null); - } - - private void TextBoxListViewTextKeyDown(object sender, KeyEventArgs e) - { - UiUtil.CheckAutoWrap(textBoxListViewText, e, Utilities.GetNumberOfLines(textBoxListViewText.Text)); - } - - private void FixCommonErrorsFormClosing(object sender, FormClosingEventArgs e) - { - if (_ocrFixEngine != null) - { - _ocrFixEngine.Dispose(); - _ocrFixEngine = null; - } - Owner = null; - } - - private void comboBoxLanguage_SelectedIndexChanged(object sender, EventArgs e) - { - if (Subtitle != null) - { - if (comboBoxLanguage.SelectedItem is LanguageItem ci) - { - _autoDetectGoogleLanguage = ci.Code.TwoLetterISOLanguageName; - AddFixActions(ci.Code.GetThreeLetterIsoLanguageName()); - } - } - labelLanguage2.Text = comboBoxLanguage.Text; - } - - private void comboBoxLanguage_Enter(object sender, EventArgs e) - { - SaveConfiguration(); - } - - private void buttonResetDefault_Click(object sender, EventArgs e) - { - Configuration.Settings.CommonErrors.LoadUserDefaultFixes(Configuration.Settings.CommonErrors.DefaultFixes); - AddFixActions(CultureInfo.GetCultureInfo(_autoDetectGoogleLanguage).GetThreeLetterIsoLanguageName()); - } - - private void subtitleListView1_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.A && e.Modifiers == Keys.Control) - { - subtitleListView1.SelectAll(); - e.SuppressKeyPress = true; - } - else if (e.KeyCode == Keys.D && e.Modifiers == Keys.Control) - { - subtitleListView1.SelectFirstSelectedItemOnly(); - e.SuppressKeyPress = true; - } - else if (e.KeyCode == Keys.I && e.Modifiers == (Keys.Control | Keys.Shift)) //InverseSelection - { - subtitleListView1.InverseSelection(); - e.SuppressKeyPress = true; - } - else if (e.KeyCode == Keys.Delete) - { - ToolStripMenuItemDeleteClick(null, null); - } - } - - private Hunspell _hunspell; - - public bool DoSpell(string word) - { - if (_hunspell == null && Language != null) - { - var fileMatches = Directory.GetFiles(Utilities.DictionaryFolder, Language + "*.dic"); - if (fileMatches.Length > 0) - { - var dictionary = fileMatches[0].Substring(0, fileMatches[0].Length - 4); - try - { - _hunspell = Hunspell.GetHunspell(dictionary); - } - catch - { - _hunspell = null; - } - } - } - - if (_hunspell == null) - { - return false; - } - - return _hunspell.Spell(word); - } - - private void toolStripMenuItemSelectAll_Click(object sender, EventArgs e) - { - foreach (ListViewItem item in listViewFixes.Items) - { - item.Checked = true; - } - } - - private void toolStripMenuItemInverseSelection_Click(object sender, EventArgs e) - { - foreach (ListViewItem item in listViewFixes.Items) - { - item.Checked = !item.Checked; - } - } - - private void setCurrentFixesAsDefaultToolStripMenuItem_Click(object sender, EventArgs e) - { - SaveConfiguration(); - Configuration.Settings.CommonErrors.SaveUserDefaultFixes(); - AddFixActions(CultureInfo.GetCultureInfo(_autoDetectGoogleLanguage).GetThreeLetterIsoLanguageName()); - } - - private void selectDefaultToolStripMenuItem_Click(object sender, EventArgs e) - { - buttonResetDefault_Click(null, null); - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.Dictionaries; +using Nikse.SubtitleEdit.Core.Enums; +using Nikse.SubtitleEdit.Core.Forms.FixCommonErrors; +using Nikse.SubtitleEdit.Core.Interfaces; +using Nikse.SubtitleEdit.Core.SubtitleFormats; +using Nikse.SubtitleEdit.Logic; +using Nikse.SubtitleEdit.Logic.Ocr; +using Nikse.SubtitleEdit.Logic.SpellCheck; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class FixCommonErrors : Form, IFixCallbacks + { + private const int IndexRemoveEmptyLines = 0; + private const int IndexOverlappingDisplayTime = 1; + private const int IndexTooShortDisplayTime = 2; + private const int IndexTooLongDisplayTime = 3; + private const int IndexTooShortGap = 4; + private const int IndexInvalidItalicTags = 5; + private const int IndexUnneededSpaces = 6; + private const int IndexMissingSpaces = 7; + private const int IndexUnneededPeriods = 8; + private const int IndexFixCommas = 9; + private const int IndexBreakLongLines = 10; + private const int IndexMergeShortLines = 11; + private const int IndexMergeShortLinesAll = 12; + private const int IndexDoubleApostropheToQuote = 13; + private const int IndexFixMusicNotation = 14; + private const int IndexAddPeriodAfterParagraph = 15; + private const int IndexStartWithUppercaseLetterAfterParagraph = 16; + private const int IndexStartWithUppercaseLetterAfterPeriodInsideParagraph = 17; + private const int IndexStartWithUppercaseLetterAfterColon = 18; + private const int IndexAddMissingQuotes = 19; + private const int IndexFixHyphens = 20; + private const int IndexRemoveHyphensSingleLine = 21; + private const int IndexFix3PlusLines = 22; + private const int IndexFixDoubleDash = 23; + private const int IndexFixDoubleGreaterThan = 24; + private const int IndexFixContinuationStyle = 25; + private const int IndexFixMissingOpenBracket = 26; + private const int IndexFixOcrErrorsViaReplaceList = 27; + private const int IndexUppercaseIInsideLowercaseWord = 28; + private const int IndexRemoveSpaceBetweenNumbers = 29; + private const int IndexDialogsOnOneLine = 30; + private const int IndexNormalizeStrings = 31; + private const int IndexFixEllipsesStart = 32; + private int _indexAloneLowercaseIToUppercaseIEnglish = -1; + private int _turkishAnsiIndex = -1; + private int _danishLetterIIndex = -1; + private int _spanishInvertedQuestionAndExclamationMarksIndex = -1; + + private readonly LanguageStructure.FixCommonErrors _language; + private readonly LanguageStructure.General _languageGeneral; + private bool _hasFixesBeenMade; + + private readonly Keys _goToLine = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainEditGoToLineNumber); + private readonly Keys _preview = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainToolsFixCommonErrorsPreview); + private readonly Keys _mainGeneralGoToNextSubtitle = UiUtil.GetKeys(Configuration.Settings.Shortcuts.GeneralGoToNextSubtitle); + private readonly Keys _mainGeneralGoToPrevSubtitle = UiUtil.GetKeys(Configuration.Settings.Shortcuts.GeneralGoToPrevSubtitle); + private readonly Keys _mainListViewGoToNextError = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewGoToNextError); + + private class FixItem + { + public string Name { get; } + public string Example { get; } + public Action Action { get; } + public bool DefaultChecked { get; } + + public FixItem(string name, string example, Action action, bool selected) + { + Name = name; + Example = example; + Action = action; + DefaultChecked = selected; + } + } + + public class LanguageItem + { + public CultureInfo Code { get; } + public string Name { get; } + + public LanguageItem(CultureInfo code, string name) + { + Code = code; + Name = name; + } + + public override string ToString() + { + return Name; + } + } + + private SubtitleFormat _format; + private int _totalFixes; + private int _totalErrors; + private List _fixActions; + private int _subtitleListViewIndex = -1; + private bool _onlyListFixes = true; + private string _autoDetectGoogleLanguage; + private HashSet _nameList; + private HashSet _abbreviationList; + private readonly StringBuilder _newLog = new StringBuilder(); + private readonly StringBuilder _appliedLog = new StringBuilder(); + private int _numberOfImportantLogMessages; + private HashSet _allowedFixes; + private bool _linesDeletedOrMerged; + private bool _oldFixContinuationStyleTicked; + + public SubtitleFormat Format => _format; + + public Encoding Encoding { get; private set; } + public Subtitle Subtitle { get; private set; } + public Subtitle FixedSubtitle { get; private set; } + + public void AddToTotalErrors(int count) + { + _totalErrors += count; + } + + public void AddToDeleteIndices(int index) + { + } + + private void InitializeLanguageNames(LanguageItem firstItem = null) + { + comboBoxLanguage.BeginUpdate(); + comboBoxLanguage.Items.Clear(); + if (firstItem != null) + { + comboBoxLanguage.Items.Add(firstItem); + } + foreach (var ci in Utilities.GetSubtitleLanguageCultures()) + { + comboBoxLanguage.Items.Add(new LanguageItem(ci, ci.EnglishName)); + } + comboBoxLanguage.Sorted = true; + comboBoxLanguage.EndUpdate(); + } + + public void RunBatchSettings(Subtitle subtitle, SubtitleFormat format, TextEncoding encoding, string language) + { + _autoDetectGoogleLanguage = language; + var ci = CultureInfo.GetCultureInfo(_autoDetectGoogleLanguage); + string threeLetterIsoLanguageName = ci.GetThreeLetterIsoLanguageName(); + + InitializeLanguageNames(new LanguageItem(null, "-Auto-")); + int languageIndex = 0; + int j = 0; + foreach (var x in comboBoxLanguage.Items) + { + if (x is LanguageItem xci) + { + if (xci.Code != null && xci.Code.TwoLetterISOLanguageName == ci.TwoLetterISOLanguageName) + { + languageIndex = j; + break; + } + if (xci.Code != null && xci.Code.TwoLetterISOLanguageName == "en") + { + languageIndex = j; + } + } + j++; + } + if (string.IsNullOrEmpty(language)) + { + languageIndex = 0; + } + + comboBoxLanguage.SelectedIndex = languageIndex; + AddFixActions(threeLetterIsoLanguageName); + FixedSubtitle = new Subtitle(subtitle, false); // copy constructor + Subtitle = new Subtitle(subtitle, false); // copy constructor + _format = format; + Encoding = encoding.Encoding; + _onlyListFixes = false; + InitUserInterface(); + groupBoxStep1.Text = string.Empty; + buttonBack.Visible = false; + buttonNextFinish.Visible = false; + buttonCancel.Text = _languageGeneral.Ok; + } + + public string Language + { + get + { + var ci = comboBoxLanguage.SelectedItem as LanguageItem; + return ci?.Code == null ? string.Empty : ci.Code.TwoLetterISOLanguageName; + } + set + { + for (int index = 0; index < comboBoxLanguage.Items.Count; index++) + { + var item = comboBoxLanguage.Items[index]; + if (item.ToString() == value) + { + comboBoxLanguage.SelectedIndex = index; + } + } + } + } + + public bool BatchMode { get; set; } + + public void RunBatch(Subtitle subtitle, SubtitleFormat format, Encoding encoding, string language) + { + _autoDetectGoogleLanguage = language; + var ci = CultureInfo.GetCultureInfo(_autoDetectGoogleLanguage); + string threeLetterIsoLanguageName = ci.GetThreeLetterIsoLanguageName(); + InitializeLanguageNames(); + int languageIndex = 0; + int j = 0; + foreach (var x in comboBoxLanguage.Items) + { + var xci = (LanguageItem)x; + if (xci.Code.TwoLetterISOLanguageName == ci.TwoLetterISOLanguageName) + { + languageIndex = j; + break; + } + if (xci.Code.TwoLetterISOLanguageName == "en") + { + languageIndex = j; + } + j++; + } + comboBoxLanguage.SelectedIndex = languageIndex; + + AddFixActions(threeLetterIsoLanguageName); + + FixedSubtitle = new Subtitle(subtitle, false); // copy constructor + Subtitle = new Subtitle(subtitle, false); // copy constructor + _format = format; + Encoding = encoding; + _onlyListFixes = true; + _hasFixesBeenMade = true; + _numberOfImportantLogMessages = 0; + _onlyListFixes = false; + _totalFixes = 0; + _totalErrors = 0; + RunSelectedActions(); + FixedSubtitle = Subtitle; + } + + public void Initialize(Subtitle subtitle, SubtitleFormat format, Encoding encoding) + { + _autoDetectGoogleLanguage = LanguageAutoDetect.AutoDetectGoogleLanguage(encoding); // Guess language via encoding + if (string.IsNullOrEmpty(_autoDetectGoogleLanguage)) + { + _autoDetectGoogleLanguage = LanguageAutoDetect.AutoDetectGoogleLanguage(subtitle); // Guess language based on subtitle contents + } + + if (_autoDetectGoogleLanguage.Equals("zh", StringComparison.OrdinalIgnoreCase)) + { + _autoDetectGoogleLanguage = "zh-CHS"; // Note that "zh-CHS" (Simplified Chinese) and "zh-CHT" (Traditional Chinese) are neutral cultures + } + + CultureInfo ci = CultureInfo.GetCultureInfo(_autoDetectGoogleLanguage); + string threeLetterIsoLanguageName = ci.GetThreeLetterIsoLanguageName(); + InitializeLanguageNames(); + int languageIndex = 0; + int j = 0; + foreach (var x in comboBoxLanguage.Items) + { + var xci = (LanguageItem)x; + if (xci.Code.TwoLetterISOLanguageName == ci.TwoLetterISOLanguageName) + { + languageIndex = j; + break; + } + if (xci.Code.TwoLetterISOLanguageName == "en") + { + languageIndex = j; + } + j++; + } + comboBoxLanguage.SelectedIndex = languageIndex; + + AddFixActions(threeLetterIsoLanguageName); + + FixedSubtitle = new Subtitle(subtitle, false); // copy constructor + Subtitle = new Subtitle(subtitle, false); // copy constructor + _format = format; + Encoding = encoding; + InitUserInterface(); + } + + private void InitUserInterface() + { + labelStatus.Text = string.Empty; + labelTextLineLengths.Text = string.Empty; + labelTextLineTotal.Text = string.Empty; + groupBoxStep1.BringToFront(); + groupBox2.Visible = false; + groupBoxStep1.Visible = true; + listView1.Columns[0].Width = 50; + listView1.Columns[1].Width = 310; + listView1.Columns[2].Width = 400; + + UiUtil.InitializeSubtitleFont(textBoxListViewText); + UiUtil.InitializeSubtitleFont(subtitleListView1); + listViewFixes.ListViewItemSorter = new ListViewSorter { ColumnNumber = 1, IsNumber = true }; + + if (!string.IsNullOrEmpty(Configuration.Settings.CommonErrors.StartSize)) + { + StartPosition = FormStartPosition.Manual; + var arr = Configuration.Settings.CommonErrors.StartSize.Split(';'); + if (arr.Length == 2 && int.TryParse(arr[0], out var x) && int.TryParse(arr[1], out var y)) + { + if (x > 10 && x < 10000 && y > 10 && y < 10000) + { + Width = x; + Height = y; + } + } + } + if (!string.IsNullOrEmpty(Configuration.Settings.CommonErrors.StartPosition)) + { + StartPosition = FormStartPosition.Manual; + var arr = Configuration.Settings.CommonErrors.StartPosition.Split(';'); + if (arr.Length == 2 && int.TryParse(arr[0], out var x) && int.TryParse(arr[1], out var y)) + { + var screen = Screen.FromPoint(Cursor.Position); + if (x > 0 && x < screen.WorkingArea.Width && y > 0 && y < screen.WorkingArea.Height) + { + Left = x; + Top = y; + } + else + { + StartPosition = FormStartPosition.CenterParent; + } + } + } + + if (Screen.PrimaryScreen.WorkingArea.Width <= 124) + { + Width = MinimumSize.Width; + Height = MinimumSize.Height; + } + if (Configuration.Settings.Tools.FixCommonErrorsSkipStepOne && !BatchMode) + { + Next(); + } + Activate(); + } + + private void AddFixActions(string threeLetterIsoLanguageName) + { + _turkishAnsiIndex = -1; + _danishLetterIIndex = -1; + _spanishInvertedQuestionAndExclamationMarksIndex = -1; + _indexAloneLowercaseIToUppercaseIEnglish = -1; + + var ce = Configuration.Settings.CommonErrors; + + _oldFixContinuationStyleTicked = ce.FixContinuationStyleTicked; + if (LanguageAutoDetect.IsLanguageWithoutPeriods(Language)) + { + ce.FixContinuationStyleTicked = false; + } + + _fixActions = new List + { + new FixItem(_language.RemovedEmptyLinesUnsedLineBreaks, string.Empty, () => new FixEmptyLines().Fix(Subtitle, this), ce.EmptyLinesTicked), + new FixItem(_language.FixOverlappingDisplayTimes, string.Empty, () => new FixOverlappingDisplayTimes().Fix(Subtitle, this), ce.OverlappingDisplayTimeTicked), + new FixItem(_language.FixShortDisplayTimes, string.Empty, () => new FixShortDisplayTimes().Fix(Subtitle, this), ce.TooShortDisplayTimeTicked), + new FixItem(_language.FixLongDisplayTimes, string.Empty, () => new FixLongDisplayTimes().Fix(Subtitle, this), ce.TooLongDisplayTimeTicked), + new FixItem(_language.FixShortGaps, string.Empty, () => new FixShortGaps().Fix(Subtitle, this), ce.TooShortGapTicked), + new FixItem(_language.FixInvalidItalicTags, _language.FixInvalidItalicTagsExample, () => new FixInvalidItalicTags().Fix(Subtitle, this), ce.InvalidItalicTagsTicked), + new FixItem(_language.RemoveUnneededSpaces, _language.RemoveUnneededSpacesExample, () => new FixUnneededSpaces().Fix(Subtitle, this), ce.UnneededSpacesTicked), + new FixItem(_language.FixMissingSpaces, _language.FixMissingSpacesExample, () => new FixMissingSpaces().Fix(Subtitle, this), ce.MissingSpacesTicked), + new FixItem(_language.RemoveUnneededPeriods, _language.RemoveUnneededPeriodsExample, () => new FixUnneededPeriods().Fix(Subtitle, this), ce.UnneededPeriodsTicked), + new FixItem(_language.FixCommas, ",, -> ,", () => new FixCommas().Fix(Subtitle, this), ce.FixCommasTicked), + new FixItem(_language.BreakLongLines, string.Empty, () => new FixLongLines().Fix(Subtitle, this), ce.BreakLongLinesTicked), + new FixItem(_language.RemoveLineBreaks, string.Empty, () => new FixShortLines().Fix(Subtitle, this), ce.MergeShortLinesTicked), + new FixItem(_language.RemoveLineBreaksAll, string.Empty, () => new FixShortLinesAll().Fix(Subtitle, this), ce.MergeShortLinesAllTicked), + new FixItem(_language.FixDoubleApostrophes, string.Empty, () => new FixDoubleApostrophes().Fix(Subtitle, this), ce.DoubleApostropheToQuoteTicked), + new FixItem(_language.FixMusicNotation, _language.FixMusicNotationExample, () => new FixMusicNotation().Fix(Subtitle, this), ce.FixMusicNotationTicked), + new FixItem(_language.AddPeriods, string.Empty, () => new FixMissingPeriodsAtEndOfLine().Fix(Subtitle, this), ce.AddPeriodAfterParagraphTicked), + new FixItem(_language.StartWithUppercaseLetterAfterParagraph, string.Empty, () => new FixStartWithUppercaseLetterAfterParagraph().Fix(Subtitle, this) , ce.StartWithUppercaseLetterAfterParagraphTicked), + new FixItem(_language.StartWithUppercaseLetterAfterPeriodInsideParagraph, string.Empty, () => new FixStartWithUppercaseLetterAfterPeriodInsideParagraph().Fix(Subtitle, this) , ce.StartWithUppercaseLetterAfterPeriodInsideParagraphTicked), + new FixItem(_language.StartWithUppercaseLetterAfterColon, string.Empty, () => new FixStartWithUppercaseLetterAfterColon().Fix(Subtitle, this), ce.StartWithUppercaseLetterAfterColonTicked), + new FixItem(_language.AddMissingQuotes, _language.AddMissingQuotesExample, () => new AddMissingQuotes().Fix(Subtitle, this), ce.AddMissingQuotesTicked), + new FixItem( string.Format(_language.FixHyphensInDialogs, GetDialogStyle(Configuration.Settings.General.DialogStyle)), string.Empty, () => new FixHyphensInDialog().Fix(Subtitle, this), ce.FixHyphensTicked), + new FixItem( _language.RemoveHyphensSingleLine, string.Empty, () => new FixHyphensRemoveDashSingleLine().Fix(Subtitle, this), ce.FixHyphensRemoveSingleLineTicked), + new FixItem(_language.Fix3PlusLines, string.Empty, () => new Fix3PlusLines().Fix(Subtitle, this), ce.Fix3PlusLinesTicked), + new FixItem(_language.FixDoubleDash, _language.FixDoubleDashExample, () => new FixDoubleDash().Fix(Subtitle, this), ce.FixDoubleDashTicked), + new FixItem(_language.FixDoubleGreaterThan, _language.FixDoubleGreaterThanExample, () => new FixDoubleGreaterThan().Fix(Subtitle, this), ce.FixDoubleGreaterThanTicked), + new FixItem( string.Format(_language.FixContinuationStyleX, ContinuationUtilities.GetContinuationStyleName(Configuration.Settings.General.ContinuationStyle)), string.Empty, () => new FixContinuationStyle().Fix(Subtitle, this), ce.FixContinuationStyleTicked), + new FixItem(_language.FixMissingOpenBracket, _language.FixMissingOpenBracketExample, () => new FixMissingOpenBracket().Fix(Subtitle, this), ce.FixMissingOpenBracketTicked), + new FixItem(_language.FixCommonOcrErrors, _language.FixOcrErrorExample, () => FixOcrErrorsViaReplaceList(threeLetterIsoLanguageName), ce.FixOcrErrorsViaReplaceListTicked), + new FixItem(_language.FixUppercaseIInsindeLowercaseWords, _language.FixUppercaseIInsindeLowercaseWordsExample, () => new FixUppercaseIInsideWords().Fix(Subtitle, this), ce.UppercaseIInsideLowercaseWordTicked), + new FixItem(_language.RemoveSpaceBetweenNumber, _language.FixSpaceBetweenNumbersExample, () => new RemoveSpaceBetweenNumbers().Fix(Subtitle, this), ce.RemoveSpaceBetweenNumberTicked), + new FixItem(_language.FixDialogsOnOneLine, _language.FixDialogsOneLineExample, () => new FixDialogsOnOneLine().Fix(Subtitle, this), ce.FixDialogsOnOneLineTicked), + new FixItem(_language.NormalizeStrings, string.Empty, () => new NormalizeStrings().Fix(Subtitle, this), ce.NormalizeStringsTicked), + }; + + if (Configuration.Settings.General.ContinuationStyle == ContinuationStyle.None) + { + _fixActions.Add(new FixItem(_language.FixEllipsesStart, _language.FixEllipsesStartExample, () => new FixEllipsesStart().Fix(Subtitle, this), ce.FixEllipsesStartTicked)); + } + if (Language == "en") + { + _indexAloneLowercaseIToUppercaseIEnglish = _fixActions.Count; + _fixActions.Add(new FixItem(_language.FixLowercaseIToUppercaseI, _language.FixLowercaseIToUppercaseIExample, () => new FixAloneLowercaseIToUppercaseI().Fix(Subtitle, this), ce.AloneLowercaseIToUppercaseIEnglishTicked)); + } + if (Language == "tr") + { + _turkishAnsiIndex = _fixActions.Count; + _fixActions.Add(new FixItem(_language.FixTurkishAnsi, "Ý > İ, Ð > Ğ, Þ > Ş, ý > ı, ð > ğ, þ > ş", () => new FixTurkishAnsiToUnicode().Fix(Subtitle, this), ce.TurkishAnsiTicked)); + } + + if (Language == "da") + { + _danishLetterIIndex = _fixActions.Count; + _fixActions.Add(new FixItem(_language.FixDanishLetterI, "Jeg synes i er søde. -> Jeg synes I er søde.", () => new FixDanishLetterI().Fix(Subtitle, this), ce.DanishLetterITicked)); + } + + if (Language == "es") + { + _spanishInvertedQuestionAndExclamationMarksIndex = _fixActions.Count; + _fixActions.Add(new FixItem(_language.FixSpanishInvertedQuestionAndExclamationMarks, "Hablas bien castellano? -> ¿Hablas bien castellano?", () => new FixSpanishInvertedQuestionAndExclamationMarks().Fix(Subtitle, this), ce.SpanishInvertedQuestionAndExclamationMarksTicked)); + } + + listView1.Items.Clear(); + foreach (var fi in _fixActions) + { + AddFixActionItemToListView(fi); + } + } + + private static string GetDialogStyle(DialogType dialogStyle) + { + if (dialogStyle == DialogType.DashSecondLineWithoutSpace) + { + return Configuration.Settings.Language.Settings.DialogStyleDashSecondLineWithoutSpace; + } + if (dialogStyle == DialogType.DashSecondLineWithSpace) + { + return Configuration.Settings.Language.Settings.DialogStyleDashSecondLineWithSpace; + } + if (dialogStyle == DialogType.DashBothLinesWithoutSpace) + { + return Configuration.Settings.Language.Settings.DialogStyleDashSecondLineWithSpace; + } + return Configuration.Settings.Language.Settings.DialogStyleDashBothLinesWithSpace; + } + + public FixCommonErrors() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + labelStartTimeWarning.Text = string.Empty; + labelDurationWarning.Text = string.Empty; + labelNumberOfImportantLogMessages.Text = string.Empty; + labelLanguage2.Text = string.Empty; + Encoding = Encoding.UTF8; + _language = Configuration.Settings.Language.FixCommonErrors; + _languageGeneral = Configuration.Settings.Language.General; + Text = _language.Title; + groupBoxStep1.Text = _language.Step1; + groupBox2.Text = _language.Step2; + listView1.Columns[0].Text = _languageGeneral.Apply; + listView1.Columns[1].Text = _language.WhatToFix; + listView1.Columns[2].Text = _language.Example; + buttonSelectAll.Text = _language.SelectAll; + buttonInverseSelection.Text = _language.InverseSelection; + tabControl1.TabPages[0].Text = _language.Fixes; + tabControl1.TabPages[1].Text = _language.Log; + listViewFixes.Columns[0].Text = _languageGeneral.Apply; + listViewFixes.Columns[1].Text = _languageGeneral.LineNumber; + listViewFixes.Columns[2].Text = _language.Function; + listViewFixes.Columns[3].Text = _languageGeneral.Before; + listViewFixes.Columns[4].Text = _languageGeneral.After; + buttonNextFinish.Text = _language.Next; + buttonBack.Text = _language.Back; + buttonCancel.Text = _languageGeneral.Cancel; + buttonFixesSelectAll.Text = _language.SelectAll; + buttonFixesInverse.Text = _language.InverseSelection; + buttonRefreshFixes.Text = _language.RefreshFixes; + buttonFixesApply.Text = _language.ApplyFixes; + labelStartTime.Text = _languageGeneral.StartTime; + labelDuration.Text = _languageGeneral.Duration; + buttonAutoBreak.Text = _language.AutoBreak; + buttonUnBreak.Text = _language.Unbreak; + buttonSplitLine.Text = _languageGeneral.SplitLine; + subtitleListView1.InitializeLanguage(_languageGeneral, Configuration.Settings); + labelLanguage.Text = Configuration.Settings.Language.ChooseLanguage.Language; + toolStripMenuItemDelete.Text = Configuration.Settings.Language.Main.Menu.ContextMenu.Delete; + mergeSelectedLinesToolStripMenuItem.Text = Configuration.Settings.Language.Main.Menu.ContextMenu.MergeSelectedLines; + buttonResetDefault.Text = _language.SelectDefault; + + toolStripMenuItemInverseSelection.Text = Configuration.Settings.Language.Main.Menu.Edit.InverseSelection; + toolStripMenuItemSelectAll.Text = Configuration.Settings.Language.Main.Menu.ContextMenu.SelectAll; + selectDefaultToolStripMenuItem.Text = _language.SelectDefault; + setCurrentFixesAsDefaultToolStripMenuItem.Text = _language.SetDefault; + + toolStripMenuItemInverseRules.Text = Configuration.Settings.Language.Main.Menu.Edit.InverseSelection; + toolStripMenuItemSelectAllRules.Text = Configuration.Settings.Language.Main.Menu.ContextMenu.SelectAll; + + splitContainerStep2.Panel1MinSize = 110; + splitContainerStep2.Panel2MinSize = 160; + + numericUpDownDuration.Left = timeUpDownStartTime.Left + timeUpDownStartTime.Width; + labelDuration.Left = timeUpDownStartTime.Left + timeUpDownStartTime.Width - 3; + FixLargeFonts(); + listView1.Select(); + } + + private void FixLargeFonts() + { + using (var graphics = CreateGraphics()) + { + var textSize = graphics.MeasureString(buttonCancel.Text, Font); + if (textSize.Height > buttonCancel.Height - 4) + { + subtitleListView1.InitializeTimestampColumnWidths(this); + var newButtonHeight = (int)(textSize.Height + 7 + 0.5); + UiUtil.SetButtonHeight(this, newButtonHeight, 1); + } + } + } + + private void AddFixActionItemToListView(FixItem fi) + { + var item = new ListViewItem(string.Empty) { Tag = fi, Checked = fi.DefaultChecked }; + item.SubItems.Add(fi.Name); + item.SubItems.Add(fi.Example); + listView1.Items.Add(item); + } + + public void AddFixToListView(Paragraph p, string action, string before, string after) + { + AddFixToListView(p, action, before, after, true); + } + + public void AddFixToListView(Paragraph p, string action, string before, string after, bool isChecked) + { + if (_onlyListFixes) + { + var item = new ListViewItem(string.Empty) { Checked = isChecked, Tag = p }; + item.SubItems.Add(p.Number.ToString(CultureInfo.InvariantCulture)); + item.SubItems.Add(action); + item.SubItems.Add(UiUtil.GetListViewTextFromString(before)); + item.SubItems.Add(UiUtil.GetListViewTextFromString(after)); + listViewFixes.Items.Add(item); + } + } + + public bool AllowFix(Paragraph p, string action) + { + if (_onlyListFixes || BatchMode) + { + return true; + } + + return _allowedFixes.Contains(p.Number.ToString(CultureInfo.InvariantCulture) + "|" + action); + } + + public void ShowStatus(string message) + { + message = message.Replace(Environment.NewLine, " "); + if (message.Length > 103) + { + message = message.Substring(0, 100) + "..."; + } + + labelStatus.Text = message; + labelStatus.Refresh(); + } + + public void LogStatus(string sender, string message, bool isImportant) + { + if (isImportant) + { + _numberOfImportantLogMessages++; + } + + LogStatus(sender, message); + } + + public void LogStatus(string sender, string message) + { + if (!string.IsNullOrEmpty(message)) + { + message += Environment.NewLine; + if (_onlyListFixes) + { + _newLog.AppendLine(" + " + sender + ": " + message); + } + else + { + _appliedLog.AppendLine(string.Format(_language.FixedOkXY, sender, message)); + } + } + } + + public bool IsName(string candidate) + { + MakeSureNameListIsLoaded(); + return _nameList.Contains(candidate); // O(1) + } + + private void MakeSureNameListIsLoaded() + { + if (_nameList == null) + { + string languageTwoLetterCode = LanguageAutoDetect.AutoDetectGoogleLanguage(Subtitle); + // Will contains both one word names and multi names + var namesList = new NameList(Configuration.DictionariesDirectory, languageTwoLetterCode, Configuration.Settings.WordLists.UseOnlineNames, Configuration.Settings.WordLists.NamesUrl); + _nameList = namesList.GetNames(); + // Multi word names. + foreach (var name in namesList.GetMultiNames()) + { + _nameList.Add(name); + } + } + } + + public HashSet GetAbbreviations() + { + if (_abbreviationList != null) + { + return _abbreviationList; + } + + MakeSureNameListIsLoaded(); + _abbreviationList = new HashSet(); + foreach (string name in _nameList) + { + if (name.EndsWith('.')) + { + _abbreviationList.Add(name); + } + } + return _abbreviationList; + } + + private OcrFixEngine _ocrFixEngine; + private string _ocrFixEngineLanguage; + + public void FixOcrErrorsViaReplaceList(string threeLetterIsoLanguageName) + { + if (_ocrFixEngine == null || _ocrFixEngineLanguage != threeLetterIsoLanguageName) + { + _ocrFixEngine?.Dispose(); + _ocrFixEngineLanguage = threeLetterIsoLanguageName; + _ocrFixEngine = new OcrFixEngine(_ocrFixEngineLanguage, null, this); + } + + string fixAction = _language.FixCommonOcrErrors; + int noOfFixes = 0; + string lastLine = string.Empty; + for (int i = 0; i < Subtitle.Paragraphs.Count; i++) + { + var p = Subtitle.Paragraphs[i]; + string text = _ocrFixEngine.FixOcrErrors(p.Text, i, lastLine, false, OcrFixEngine.AutoGuessLevel.Cautious); + lastLine = text; + if (AllowFix(p, fixAction) && p.Text != text) + { + string oldText = p.Text; + p.Text = text; + noOfFixes++; + AddFixToListView(p, fixAction, oldText, p.Text); + } + Application.DoEvents(); + } + if (noOfFixes > 0) + { + _totalFixes += noOfFixes; + LogStatus(_language.FixCommonOcrErrors, string.Format(_language.CommonOcrErrorsFixed, noOfFixes)); + } + } + + public void UpdateFixStatus(int fixes, string message, string xMessage) + { + if (fixes > 0) + { + _totalFixes += fixes; + LogStatus(message, string.Format(xMessage, fixes)); + } + } + + private void ButtonFixClick(object sender, EventArgs e) + { + if (buttonBack.Enabled) + { + Cursor = Cursors.WaitCursor; + SaveConfiguration(); + Cursor = Cursors.Default; + DialogResult = DialogResult.OK; + } + else + { + Cursor = Cursors.WaitCursor; + Next(); + ShowAvailableFixesStatus(false); + } + Cursor = Cursors.Default; + } + + private void Next() + { + RunSelectedActions(); + + buttonBack.Enabled = true; + buttonNextFinish.Text = _languageGeneral.Ok; + buttonNextFinish.Enabled = _hasFixesBeenMade || _linesDeletedOrMerged; + groupBoxStep1.Visible = false; + groupBox2.Visible = true; + listViewFixes.Sort(); + subtitleListView1.Fill(FixedSubtitle); + if (listViewFixes.Items.Count > 0) + { + listViewFixes.Items[0].Selected = true; + } + else + { + subtitleListView1.SelectIndexAndEnsureVisible(0); + } + } + + private void RunSelectedActions() + { + subtitleListView1.BeginUpdate(); + _newLog.Clear(); + + Subtitle = new Subtitle(FixedSubtitle, false); + if (listView1.Items[IndexFixOcrErrorsViaReplaceList].Checked) + { + var fixItem = (FixItem)listView1.Items[IndexFixOcrErrorsViaReplaceList].Tag; + fixItem.Action.Invoke(); + } + foreach (ListViewItem item in listView1.Items) + { + if (item.Checked && item.Index != IndexRemoveEmptyLines) + { + var fixItem = (FixItem)item.Tag; + fixItem.Action.Invoke(); + } + } + if (listView1.Items[IndexInvalidItalicTags].Checked) + { + var fixItem = (FixItem)listView1.Items[IndexInvalidItalicTags].Tag; + fixItem.Action.Invoke(); + } + if (listView1.Items[IndexRemoveEmptyLines].Checked) + { + var fixItem = (FixItem)listView1.Items[IndexRemoveEmptyLines].Tag; + fixItem.Action.Invoke(); + } + + // build log + textBoxFixedIssues.Text = string.Empty; + if (_newLog.Length >= 0) + { + textBoxFixedIssues.AppendText(_newLog + Environment.NewLine); + } + + textBoxFixedIssues.AppendText(_appliedLog.ToString()); + subtitleListView1.EndUpdate(); + } + + private void FormFixKeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + else if (e.KeyCode == UiUtil.HelpKeys) + { + Utilities.ShowHelp("#fixcommonerrors"); + } + else if (e.KeyCode == Keys.Enter && buttonNextFinish.Text == _language.Next) + { + ButtonFixClick(null, null); + } + else if (subtitleListView1.Visible && subtitleListView1.Items.Count > 0 && e.KeyData == _goToLine) + { + GoToLineNumber(); + } + else if (e.KeyData == _preview && listViewFixes.Items.Count > 0) + { + GenerateDiff(); + } + else if (_mainGeneralGoToNextSubtitle == e.KeyData || (e.KeyCode == Keys.Down && e.Modifiers == Keys.Alt)) + { + int selectedIndex = 0; + if (subtitleListView1.SelectedItems.Count > 0) + { + selectedIndex = subtitleListView1.SelectedItems[0].Index; + selectedIndex++; + } + subtitleListView1.SelectIndexAndEnsureVisible(selectedIndex); + } + else if (_mainGeneralGoToPrevSubtitle == e.KeyData || (e.KeyCode == Keys.Up && e.Modifiers == Keys.Alt)) + { + int selectedIndex = 0; + if (subtitleListView1.SelectedItems.Count > 0) + { + selectedIndex = subtitleListView1.SelectedItems[0].Index; + selectedIndex--; + } + subtitleListView1.SelectIndexAndEnsureVisible(selectedIndex); + } + else if (_mainListViewGoToNextError == e.KeyData) + { + GoToNextSyntaxError(); + e.SuppressKeyPress = true; + } + } + + private void GoToNextSyntaxError() + { + int idx = 0; + try + { + if (listViewFixes.SelectedItems.Count > 0) + { + idx = listViewFixes.SelectedItems[0].Index; + } + + idx++; + if (listViewFixes.Items.Count > idx) + { + listViewFixes.Items[idx].Selected = true; + listViewFixes.Items[idx].EnsureVisible(); + if (idx > 0) + { + listViewFixes.Items[idx - 1].Selected = false; + } + } + } + catch + { + // ignored + } + } + + private void GoToLineNumber() + { + using (var goToLine = new GoToLine()) + { + goToLine.Initialize(1, subtitleListView1.Items.Count); + if (goToLine.ShowDialog(this) == DialogResult.OK) + { + subtitleListView1.SelectNone(); + subtitleListView1.Items[goToLine.LineNumber - 1].Selected = true; + subtitleListView1.Items[goToLine.LineNumber - 1].EnsureVisible(); + subtitleListView1.Items[goToLine.LineNumber - 1].Focused = true; + } + } + } + + private void GenerateDiff() + { + string htmlFileName = FileUtil.GetTempFileName(".html"); + var sb = new StringBuilder(); + sb.Append("Subtitle Edit - Fix common errors preview"); + sb.AppendLine($""); + foreach (ListViewItem item in listViewFixes.Items) + { + if (item.Checked) + { + var p = (Paragraph)item.Tag; + string what = item.SubItems[2].Text; + string before = item.SubItems[3].Text; + string after = item.SubItems[4].Text; + var arr = MakeDiffHtml(before, after); + sb.AppendLine($""); + } + } + sb.Append("
{_languageGeneral.LineNumber}{_language.Function}{_languageGeneral.Before}{_languageGeneral.After}
{p.Number}{what}
{arr[0]}
{arr[1]}
"); + File.WriteAllText(htmlFileName, sb.ToString()); + UiUtil.OpenFile(htmlFileName); + } + + private static string[] MakeDiffHtml(string before, string after) + { + before = before.Replace("
", "↲"); + after = after.Replace("
", "↲"); + before = before.Replace(Environment.NewLine, "↲"); + after = after.Replace(Environment.NewLine, "↲"); + + var beforeColors = new Dictionary(); + var beforeBackgroundColors = new Dictionary(); + var afterColors = new Dictionary(); + var afterBackgroundColors = new Dictionary(); + + // from start + int minLength = Math.Min(before.Length, after.Length); + int startCharactersOk = 0; + for (int i = 0; i < minLength; i++) + { + if (before[i] == after[i]) + { + startCharactersOk++; + } + else + { + if (before.Length > i + 4 && after.Length > i + 4 && + before[i + 1] == after[i + 1] && + before[i + 2] == after[i + 2] && + before[i + 3] == after[i + 3] && + before[i + 4] == after[i + 4]) + { + startCharactersOk++; + + if (char.IsWhiteSpace(before[i])) + { + beforeBackgroundColors.Add(i, Color.Red); + } + else + { + beforeColors.Add(i, Color.Red); + } + + if (char.IsWhiteSpace(after[i])) + { + afterBackgroundColors.Add(i, Color.Red); + } + else + { + afterColors.Add(i, Color.Red); + } + } + else + { + break; + } + } + } + + int maxLength = Math.Max(before.Length, after.Length); + for (int i = startCharactersOk; i <= maxLength; i++) + { + if (i < before.Length) + { + if (char.IsWhiteSpace(before[i])) + { + beforeBackgroundColors.Add(i, Color.Red); + } + else + { + beforeColors.Add(i, Color.Red); + } + } + if (i < after.Length) + { + if (char.IsWhiteSpace(after[i])) + { + afterBackgroundColors.Add(i, Color.Red); + } + else + { + afterColors.Add(i, Color.Red); + } + } + } + + // from end + for (int i = 1; i < minLength; i++) + { + int bLength = before.Length - i; + int aLength = after.Length - i; + if (before[bLength] == after[aLength]) + { + if (beforeColors.ContainsKey(bLength)) + { + beforeColors.Remove(bLength); + } + + if (beforeBackgroundColors.ContainsKey(bLength)) + { + beforeBackgroundColors.Remove(bLength); + } + + if (afterColors.ContainsKey(aLength)) + { + afterColors.Remove(aLength); + } + + if (afterBackgroundColors.ContainsKey(aLength)) + { + afterBackgroundColors.Remove(aLength); + } + } + else + { + break; + } + } + + var sb = new StringBuilder(); + for (int i = 0; i < before.Length; i++) + { + var s = before[i]; + if (beforeColors.ContainsKey(i) && beforeBackgroundColors.ContainsKey(i)) + { + sb.AppendFormat("{2}", ColorTranslator.ToHtml(beforeColors[i]), ColorTranslator.ToHtml(beforeBackgroundColors[i]), s); + } + else if (beforeColors.ContainsKey(i)) + { + sb.AppendFormat("{1}", ColorTranslator.ToHtml(beforeColors[i]), s); + } + else if (beforeBackgroundColors.ContainsKey(i)) + { + sb.AppendFormat("{1}", ColorTranslator.ToHtml(beforeBackgroundColors[i]), s); + } + else + { + sb.Append(s); + } + } + var sb2 = new StringBuilder(); + for (int i = 0; i < after.Length; i++) + { + var s = after[i]; + if (afterColors.ContainsKey(i) && afterBackgroundColors.ContainsKey(i)) + { + sb2.AppendFormat("{2}", ColorTranslator.ToHtml(afterColors[i]), ColorTranslator.ToHtml(afterBackgroundColors[i]), s); + } + else if (afterColors.ContainsKey(i)) + { + sb2.AppendFormat("{1}", ColorTranslator.ToHtml(afterColors[i]), s); + } + else if (afterBackgroundColors.ContainsKey(i)) + { + sb2.AppendFormat("{1}", ColorTranslator.ToHtml(afterBackgroundColors[i]), s); + } + else + { + sb2.Append(s); + } + } + + return new[] { sb.ToString(), sb2.ToString() }; + } + + private void SaveConfiguration() + { + var ce = Configuration.Settings.CommonErrors; + + ce.EmptyLinesTicked = listView1.Items[IndexRemoveEmptyLines].Checked; + ce.OverlappingDisplayTimeTicked = listView1.Items[IndexOverlappingDisplayTime].Checked; + ce.TooShortDisplayTimeTicked = listView1.Items[IndexTooShortDisplayTime].Checked; + ce.TooLongDisplayTimeTicked = listView1.Items[IndexTooLongDisplayTime].Checked; + ce.TooShortGapTicked = listView1.Items[IndexTooShortGap].Checked; + ce.InvalidItalicTagsTicked = listView1.Items[IndexInvalidItalicTags].Checked; + ce.UnneededSpacesTicked = listView1.Items[IndexUnneededSpaces].Checked; + ce.UnneededPeriodsTicked = listView1.Items[IndexUnneededPeriods].Checked; + ce.FixCommasTicked = listView1.Items[IndexFixCommas].Checked; + ce.MissingSpacesTicked = listView1.Items[IndexMissingSpaces].Checked; + ce.BreakLongLinesTicked = listView1.Items[IndexBreakLongLines].Checked; + ce.MergeShortLinesTicked = listView1.Items[IndexMergeShortLines].Checked; + ce.MergeShortLinesAllTicked = listView1.Items[IndexMergeShortLinesAll].Checked; + + ce.UppercaseIInsideLowercaseWordTicked = listView1.Items[IndexUppercaseIInsideLowercaseWord].Checked; + ce.DoubleApostropheToQuoteTicked = listView1.Items[IndexDoubleApostropheToQuote].Checked; + ce.FixMusicNotationTicked = listView1.Items[IndexFixMusicNotation].Checked; + ce.AddPeriodAfterParagraphTicked = listView1.Items[IndexAddPeriodAfterParagraph].Checked; + ce.StartWithUppercaseLetterAfterParagraphTicked = listView1.Items[IndexStartWithUppercaseLetterAfterParagraph].Checked; + ce.StartWithUppercaseLetterAfterPeriodInsideParagraphTicked = listView1.Items[IndexStartWithUppercaseLetterAfterPeriodInsideParagraph].Checked; + ce.StartWithUppercaseLetterAfterColonTicked = listView1.Items[IndexStartWithUppercaseLetterAfterColon].Checked; + ce.AddMissingQuotesTicked = listView1.Items[IndexAddMissingQuotes].Checked; + ce.FixHyphensTicked = listView1.Items[IndexFixHyphens].Checked; + ce.FixHyphensRemoveSingleLineTicked = listView1.Items[IndexRemoveHyphensSingleLine].Checked; + ce.Fix3PlusLinesTicked = listView1.Items[IndexFix3PlusLines].Checked; + ce.FixDoubleDashTicked = listView1.Items[IndexFixDoubleDash].Checked; + ce.FixDoubleGreaterThanTicked = listView1.Items[IndexFixDoubleGreaterThan].Checked; + ce.FixContinuationStyleTicked = listView1.Items[IndexFixContinuationStyle].Checked; + if (LanguageAutoDetect.IsLanguageWithoutPeriods(Language)) + { + ce.FixContinuationStyleTicked = _oldFixContinuationStyleTicked; + } + + if (Configuration.Settings.General.ContinuationStyle == ContinuationStyle.None) + { + ce.FixEllipsesStartTicked = listView1.Items[IndexFixEllipsesStart].Checked; + } + + ce.FixMissingOpenBracketTicked = listView1.Items[IndexFixMissingOpenBracket].Checked; + if (_indexAloneLowercaseIToUppercaseIEnglish >= 0) + { + ce.AloneLowercaseIToUppercaseIEnglishTicked = listView1.Items[_indexAloneLowercaseIToUppercaseIEnglish].Checked; + } + + ce.FixOcrErrorsViaReplaceListTicked = listView1.Items[IndexFixOcrErrorsViaReplaceList].Checked; + ce.RemoveSpaceBetweenNumberTicked = listView1.Items[IndexRemoveSpaceBetweenNumbers].Checked; + ce.FixDialogsOnOneLineTicked = listView1.Items[IndexDialogsOnOneLine].Checked; + ce.NormalizeStringsTicked = listView1.Items[IndexNormalizeStrings].Checked; + if (_danishLetterIIndex >= 0) + { + ce.DanishLetterITicked = listView1.Items[_danishLetterIIndex].Checked; + } + + if (_turkishAnsiIndex >= 0) + { + ce.TurkishAnsiTicked = listView1.Items[_turkishAnsiIndex].Checked; + } + + if (_spanishInvertedQuestionAndExclamationMarksIndex >= 0) + { + ce.SpanishInvertedQuestionAndExclamationMarksTicked = listView1.Items[_spanishInvertedQuestionAndExclamationMarksIndex].Checked; + } + + Configuration.Settings.Save(); + } + + private void ButtonBackClick(object sender, EventArgs e) + { + buttonNextFinish.Enabled = true; + _totalFixes = 0; + _onlyListFixes = true; + buttonBack.Enabled = false; + buttonNextFinish.Text = _language.Next; + groupBox2.Visible = false; + groupBoxStep1.Visible = true; + ShowStatus(string.Empty); + listViewFixes.Items.Clear(); + } + + private void ButtonCancelClick(object sender, EventArgs e) + { + SaveConfiguration(); + } + + private void ListViewFixesColumnClick(object sender, ColumnClickEventArgs e) + { + var sorter = (ListViewSorter)listViewFixes.ListViewItemSorter; + + if (e.Column == sorter.ColumnNumber) + { + sorter.Descending = !sorter.Descending; // inverse sort direction + } + else + { + sorter.ColumnNumber = e.Column; + sorter.Descending = false; + sorter.IsNumber = e.Column == 1; // only index 1 is numeric + } + listViewFixes.Sort(); + } + + private void ButtonSelectAllClick(object sender, EventArgs e) + { + foreach (ListViewItem item in listView1.Items) + { + item.Checked = true; + } + } + + private void ButtonInverseSelectionClick(object sender, EventArgs e) + { + foreach (ListViewItem item in listView1.Items) + { + item.Checked = !item.Checked; + } + } + + private void ListViewFixesSelectedIndexChanged(object sender, EventArgs e) + { + if (listViewFixes.SelectedItems.Count > 0) + { + var p = (Paragraph)listViewFixes.SelectedItems[0].Tag; + + foreach (ListViewItem lvi in subtitleListView1.Items) + { + if (lvi.Tag is Paragraph p2 && p.Id == p2.Id) + { + var index = lvi.Index; + if (index - 1 > 0) + { + subtitleListView1.EnsureVisible(index - 1); + } + + if (index + 1 < subtitleListView1.Items.Count) + { + subtitleListView1.EnsureVisible(index + 1); + } + + subtitleListView1.SelectedIndexChanged -= SubtitleListView1SelectedIndexChanged; + subtitleListView1.SelectNone(); + subtitleListView1.SelectedIndexChanged += SubtitleListView1SelectedIndexChanged; + subtitleListView1.Items[index].Selected = true; + subtitleListView1.EnsureVisible(index); + return; + } + } + } + } + + private void SubtitleListView1SelectedIndexChanged(object sender, EventArgs e) + { + if (FixedSubtitle.Paragraphs.Count > 0) + { + int firstSelectedIndex = 0; + if (subtitleListView1.SelectedItems.Count > 0) + { + firstSelectedIndex = subtitleListView1.SelectedItems[0].Index; + } + + Paragraph p = FixedSubtitle.GetParagraphOrDefault(firstSelectedIndex); + if (p != null) + { + InitializeListViewEditBox(p); + _subtitleListViewIndex = firstSelectedIndex; + UpdateOverlapErrors(); + UpdateListViewTextInfo(p.Text); + } + } + } + + private void TextBoxListViewTextTextChanged(object sender, EventArgs e) + { + if (_subtitleListViewIndex >= 0) + { + string text = textBoxListViewText.Text.TrimEnd(); + UpdateListViewTextInfo(text); + + // update _subtitle + listview + FixedSubtitle.Paragraphs[_subtitleListViewIndex].Text = text; + subtitleListView1.SetText(_subtitleListViewIndex, text); + + EnableOkButton(); + UpdateListSyntaxColoring(); + } + } + + private void EnableOkButton() + { + if (!_hasFixesBeenMade) + { + _hasFixesBeenMade = true; + buttonNextFinish.Enabled = true; + } + } + + private void InitializeListViewEditBox(Paragraph p) + { + textBoxListViewText.TextChanged -= TextBoxListViewTextTextChanged; + textBoxListViewText.Text = p.Text; + textBoxListViewText.TextChanged += TextBoxListViewTextTextChanged; + + timeUpDownStartTime.MaskedTextBox.TextChanged -= MaskedTextBox_TextChanged; + timeUpDownStartTime.TimeCode = p.StartTime; + timeUpDownStartTime.MaskedTextBox.TextChanged += MaskedTextBox_TextChanged; + + numericUpDownDuration.ValueChanged -= NumericUpDownDurationValueChanged; + numericUpDownDuration.Value = (decimal)(p.Duration.TotalMilliseconds / TimeCode.BaseUnit); + numericUpDownDuration.ValueChanged += NumericUpDownDurationValueChanged; + } + + private void NumericUpDownDurationValueChanged(object sender, EventArgs e) + { + if (FixedSubtitle.Paragraphs.Count > 0 && subtitleListView1.SelectedItems.Count > 0) + { + int firstSelectedIndex = subtitleListView1.SelectedItems[0].Index; + + Paragraph currentParagraph = FixedSubtitle.GetParagraphOrDefault(firstSelectedIndex); + if (currentParagraph != null) + { + UpdateOverlapErrors(); + + // update _subtitle + listview + currentParagraph.EndTime.TotalMilliseconds = currentParagraph.StartTime.TotalMilliseconds + ((double)numericUpDownDuration.Value * TimeCode.BaseUnit); + subtitleListView1.SetDuration(firstSelectedIndex, currentParagraph, FixedSubtitle.GetParagraphOrDefault(firstSelectedIndex + 1)); + } + } + } + + private void UpdateOverlapErrors() + { + labelStartTimeWarning.Text = string.Empty; + labelDurationWarning.Text = string.Empty; + + TimeCode startTime = timeUpDownStartTime.TimeCode; + if (FixedSubtitle.Paragraphs.Count > 0 && subtitleListView1.SelectedItems.Count > 0 && startTime != null) + { + int firstSelectedIndex = subtitleListView1.SelectedItems[0].Index; + + Paragraph prevParagraph = FixedSubtitle.GetParagraphOrDefault(firstSelectedIndex - 1); + if (prevParagraph != null && prevParagraph.EndTime.TotalMilliseconds > startTime.TotalMilliseconds) + { + labelStartTimeWarning.Text = string.Format(_languageGeneral.OverlapPreviousLineX, (prevParagraph.EndTime.TotalMilliseconds - startTime.TotalMilliseconds) / TimeCode.BaseUnit); + } + + Paragraph nextParagraph = FixedSubtitle.GetParagraphOrDefault(firstSelectedIndex + 1); + if (nextParagraph != null) + { + double durationMilliseconds = (double)numericUpDownDuration.Value * TimeCode.BaseUnit; + if (startTime.TotalMilliseconds + durationMilliseconds > nextParagraph.StartTime.TotalMilliseconds) + { + labelDurationWarning.Text = string.Format(_languageGeneral.OverlapNextX, ((startTime.TotalMilliseconds + durationMilliseconds) - nextParagraph.StartTime.TotalMilliseconds) / TimeCode.BaseUnit); + } + + if (labelStartTimeWarning.Text.Length == 0 && + startTime.TotalMilliseconds > nextParagraph.StartTime.TotalMilliseconds) + { + double di = (startTime.TotalMilliseconds - nextParagraph.StartTime.TotalMilliseconds) / TimeCode.BaseUnit; + labelStartTimeWarning.Text = string.Format(_languageGeneral.OverlapNextX, di); + } + else if (numericUpDownDuration.Value < 0) + { + labelDurationWarning.Text = _languageGeneral.Negative; + } + } + } + UpdateListSyntaxColoring(); + } + + private void UpdateListSyntaxColoring() + { + if (FixedSubtitle == null || FixedSubtitle.Paragraphs.Count == 0 || _subtitleListViewIndex < 0 || _subtitleListViewIndex >= Subtitle.Paragraphs.Count) + { + return; + } + + subtitleListView1.SyntaxColorLine(FixedSubtitle.Paragraphs, _subtitleListViewIndex, FixedSubtitle.Paragraphs[_subtitleListViewIndex]); + Paragraph next = FixedSubtitle.GetParagraphOrDefault(_subtitleListViewIndex + 1); + if (next != null) + { + subtitleListView1.SyntaxColorLine(FixedSubtitle.Paragraphs, _subtitleListViewIndex + 1, FixedSubtitle.Paragraphs[_subtitleListViewIndex + 1]); + } + } + + private void MaskedTextBox_TextChanged(object sender, EventArgs e) + { + if (_subtitleListViewIndex >= 0 && + timeUpDownStartTime.TimeCode != null && + FixedSubtitle.Paragraphs.Count > 0 && + subtitleListView1.SelectedItems.Count > 0) + { + TimeCode startTime = timeUpDownStartTime.TimeCode; + labelStartTimeWarning.Text = string.Empty; + labelDurationWarning.Text = string.Empty; + + UpdateOverlapErrors(); + + // update _subtitle + listview + FixedSubtitle.Paragraphs[_subtitleListViewIndex].EndTime.TotalMilliseconds += + (startTime.TotalMilliseconds - FixedSubtitle.Paragraphs[_subtitleListViewIndex].StartTime.TotalMilliseconds); + FixedSubtitle.Paragraphs[_subtitleListViewIndex].StartTime = startTime; + subtitleListView1.SetStartTimeAndDuration(_subtitleListViewIndex, FixedSubtitle.Paragraphs[_subtitleListViewIndex], FixedSubtitle.GetParagraphOrDefault(_subtitleListViewIndex + 1), FixedSubtitle.GetParagraphOrDefault(_subtitleListViewIndex - 1)); + } + } + + private void UpdateListViewTextInfo(string text) + { + labelTextLineLengths.Text = _languageGeneral.SingleLineLengths; + labelSingleLine.Left = labelTextLineLengths.Left + labelTextLineLengths.Width - 6; + text = HtmlUtil.RemoveHtmlTags(text, true); + text = NetflixImsc11Japanese.RemoveTags(text); + UiUtil.GetLineLengths(labelSingleLine, text); + + var s = text.Replace(Environment.NewLine, " "); + labelTextLineTotal.ForeColor = Color.Black; + buttonSplitLine.Visible = false; + var abl = Utilities.AutoBreakLine(s, _autoDetectGoogleLanguage).SplitToLines(); + if (abl.Count > Configuration.Settings.General.MaxNumberOfLines || abl.Any(li => li.CountCharacters(false, Configuration.Settings.General.IgnoreArabicDiacritics) > Configuration.Settings.General.SubtitleLineMaximumLength)) + { + buttonSplitLine.Visible = true; + labelTextLineTotal.ForeColor = Color.Red; + } + labelTextLineTotal.Text = string.Format(_languageGeneral.TotalLengthX, text.CountCharacters(false, Configuration.Settings.General.IgnoreArabicDiacritics)); + } + + private void ButtonFixesSelectAllClick(object sender, EventArgs e) + { + foreach (ListViewItem item in listViewFixes.Items) + { + item.Checked = true; + } + } + + private void ButtonFixesInverseClick(object sender, EventArgs e) + { + foreach (ListViewItem item in listViewFixes.Items) + { + item.Checked = !item.Checked; + } + } + + private void ButtonFixesApplyClick(object sender, EventArgs e) + { + buttonFixesApply.Enabled = false; + _hasFixesBeenMade = true; + Cursor = Cursors.WaitCursor; + ShowStatus(_language.Analysing); + + _subtitleListViewIndex = -1; + int firstSelectedIndex = 0; + if (subtitleListView1.SelectedItems.Count > 0) + { + firstSelectedIndex = subtitleListView1.SelectedItems[0].Index; + } + + _allowedFixes = new HashSet(); + foreach (ListViewItem item in listViewFixes.Items) + { + if (item.Checked) + { + string key = item.SubItems[1].Text + "|" + item.SubItems[2].Text; + if (!_allowedFixes.Contains(key)) + { + _allowedFixes.Add(key); + } + } + } + + _numberOfImportantLogMessages = 0; + _onlyListFixes = false; + _totalFixes = 0; + _totalErrors = 0; + RunSelectedActions(); + FixedSubtitle = new Subtitle(Subtitle, false); + subtitleListView1.Fill(FixedSubtitle); + ShowAvailableFixesStatus(true); + RefreshFixes(); + if (listViewFixes.Items.Count == 0) + { + subtitleListView1.SelectIndexAndEnsureVisible(firstSelectedIndex); + } + + Cursor = Cursors.Default; + if (_numberOfImportantLogMessages == 0) + { + labelNumberOfImportantLogMessages.Text = string.Empty; + } + else + { + labelNumberOfImportantLogMessages.Text = string.Format(_language.NumberOfImportantLogMessages, _numberOfImportantLogMessages); + } + + buttonFixesApply.Enabled = true; + } + + private void ButtonRefreshFixesClick(object sender, EventArgs e) + { + Cursor = Cursors.WaitCursor; + ShowStatus(_language.Analysing); + _totalFixes = 0; + RefreshFixes(); + ShowAvailableFixesStatus(false); + Cursor = Cursors.Default; + } + + private void ShowAvailableFixesStatus(bool applied) + { + labelStatus.ForeColor = DefaultForeColor; + if (_totalFixes == 0 && _totalErrors == 0) + { + ShowStatus(_language.NothingToFix); + if (subtitleListView1.SelectedItems.Count == 0) + { + subtitleListView1.SelectIndexAndEnsureVisible(0); + } + } + else if (_totalFixes > 0) + { + if (_totalErrors > 0) + { + labelStatus.ForeColor = Color.Red; + ShowStatus(string.Format(applied ? _language.XFixedBut : _language.XCouldBeFixedBut, _totalFixes)); + } + else + { + ShowStatus(string.Format(applied ? _language.XFixesApplied : _language.FixesFoundX, _totalFixes)); + } + } + else if (_totalErrors > 0) + { + labelStatus.ForeColor = Color.Red; + ShowStatus(_language.NothingFixableBut); + } + + TopMost = true; + BringToFront(); + TopMost = false; + } + + private void RefreshFixes() + { + listViewFixes.BeginUpdate(); + + // save de-selected fixes + var deSelectedFixes = new List(); + foreach (ListViewItem item in listViewFixes.Items) + { + if (!item.Checked) + { + deSelectedFixes.Add(item.SubItems[1].Text + item.SubItems[2].Text + item.SubItems[3].Text); + } + } + + listViewFixes.Items.Clear(); + _onlyListFixes = true; + Next(); + + // restore de-selected fixes + foreach (ListViewItem item in listViewFixes.Items) + { + if (deSelectedFixes.Contains(item.SubItems[1].Text + item.SubItems[2].Text + item.SubItems[3].Text)) + { + item.Checked = false; + } + } + + listViewFixes.EndUpdate(); + } + + private void ButtonAutoBreakClick(object sender, EventArgs e) + { + if (textBoxListViewText.Text.Length > 0) + { + string oldText = textBoxListViewText.Text; + textBoxListViewText.Text = Utilities.AutoBreakLine(textBoxListViewText.Text, Language); + if (oldText != textBoxListViewText.Text) + { + EnableOkButton(); + } + } + } + + private void ButtonUnBreakClick(object sender, EventArgs e) + { + string oldText = textBoxListViewText.Text; + textBoxListViewText.Text = Utilities.UnbreakLine(textBoxListViewText.Text); + if (oldText != textBoxListViewText.Text) + { + EnableOkButton(); + } + } + + private void ToolStripMenuItemDeleteClick(object sender, EventArgs e) + { + if (FixedSubtitle.Paragraphs.Count <= 0 || subtitleListView1.SelectedItems.Count <= 0) + { + return; + } + + var askText = subtitleListView1.SelectedItems.Count > 1 ? string.Format(Configuration.Settings.Language.Main.DeleteXLinesPrompt, subtitleListView1.SelectedItems.Count) : Configuration.Settings.Language.Main.DeleteOneLinePrompt; + if (Configuration.Settings.General.PromptDeleteLines && MessageBox.Show(askText, Configuration.Settings.Language.General.Title, MessageBoxButtons.YesNoCancel) != DialogResult.Yes) + { + return; + } + + _linesDeletedOrMerged = true; + _subtitleListViewIndex = -1; + var indexes = new List(); + foreach (ListViewItem item in subtitleListView1.SelectedItems) + { + indexes.Add(item.Index); + } + + int firstIndex = subtitleListView1.SelectedItems[0].Index; + + // save de-selected fixes + var deSelectedFixes = new List(); + foreach (ListViewItem item in listViewFixes.Items) + { + if (!item.Checked) + { + int number = Convert.ToInt32(item.SubItems[1].Text); + if (number > firstIndex) + { + number -= subtitleListView1.SelectedItems.Count; + } + + if (number >= 0) + { + deSelectedFixes.Add(number + item.SubItems[2].Text + item.SubItems[3].Text); + } + } + } + + FixedSubtitle.RemoveParagraphsByIndices(indexes); + FixedSubtitle.Renumber(); + subtitleListView1.Fill(FixedSubtitle); + + // refresh fixes + listViewFixes.Items.Clear(); + _onlyListFixes = true; + Next(); + + // restore de-selected fixes + if (deSelectedFixes.Count > 0) + { + foreach (ListViewItem item in listViewFixes.Items) + { + if (deSelectedFixes.Contains(item.SubItems[1].Text + item.SubItems[2].Text + item.SubItems[3].Text)) + { + item.Checked = false; + } + } + } + + if (subtitleListView1.Items.Count > firstIndex) + { + subtitleListView1.SelectIndexAndEnsureVisible(firstIndex, true); + } + else if (subtitleListView1.Items.Count > 0) + { + subtitleListView1.SelectIndexAndEnsureVisible(subtitleListView1.Items.Count - 1, true); + } + } + + private void MergeSelectedLinesToolStripMenuItemClick(object sender, EventArgs e) + { + if (FixedSubtitle.Paragraphs.Count > 0 && subtitleListView1.SelectedItems.Count > 0) + { + _linesDeletedOrMerged = true; + int startNumber = FixedSubtitle.Paragraphs[0].Number; + int firstSelectedIndex = subtitleListView1.SelectedItems[0].Index; + + // save de-selected fixes + var deSelectedFixes = new List(); + foreach (ListViewItem item in listViewFixes.Items) + { + if (!item.Checked) + { + int firstSelectedNumber = subtitleListView1.GetSelectedParagraph(FixedSubtitle).Number; + int number = Convert.ToInt32(item.SubItems[1].Text); + if (number > firstSelectedNumber) + { + number--; + } + + deSelectedFixes.Add(number + item.SubItems[2].Text + item.SubItems[3].Text); + } + } + + var currentParagraph = FixedSubtitle.GetParagraphOrDefault(firstSelectedIndex); + var nextParagraph = FixedSubtitle.GetParagraphOrDefault(firstSelectedIndex + 1); + + if (nextParagraph != null && currentParagraph != null) + { + subtitleListView1.SelectedIndexChanged -= SubtitleListView1SelectedIndexChanged; + + currentParagraph.Text = currentParagraph.Text.Replace(Environment.NewLine, " "); + currentParagraph.Text += Environment.NewLine + nextParagraph.Text.Replace(Environment.NewLine, " "); + currentParagraph.EndTime = nextParagraph.EndTime; + + FixedSubtitle.Paragraphs.Remove(nextParagraph); + + FixedSubtitle.Renumber(startNumber); + subtitleListView1.Fill(FixedSubtitle); + subtitleListView1.SelectIndexAndEnsureVisible(firstSelectedIndex); + subtitleListView1.SelectedIndexChanged += SubtitleListView1SelectedIndexChanged; + _subtitleListViewIndex = -1; + SubtitleListView1SelectedIndexChanged(null, null); + } + + // refresh fixes + listViewFixes.Items.Clear(); + _onlyListFixes = true; + Next(); + + // restore de-selected fixes + foreach (ListViewItem item in listViewFixes.Items) + { + if (deSelectedFixes.Contains(item.SubItems[1].Text + item.SubItems[2].Text + item.SubItems[3].Text)) + { + item.Checked = false; + } + } + } + } + + private void ContextMenuStripListviewOpening(object sender, System.ComponentModel.CancelEventArgs e) + { + if (subtitleListView1.SelectedItems.Count == 0) + { + e.Cancel = true; + } + else if (subtitleListView1.SelectedItems.Count == 2 && + subtitleListView1.SelectedItems[0].Index == subtitleListView1.SelectedItems[1].Index - 1) + { + mergeSelectedLinesToolStripMenuItem.Visible = true; + toolStripSeparator1.Visible = true; + } + else + { + mergeSelectedLinesToolStripMenuItem.Visible = false; + toolStripSeparator1.Visible = false; + } + } + + private void FixCommonErrorsResize(object sender, EventArgs e) + { + groupBox2.Width = Width - (groupBox2.Left * 2 + 15); + groupBoxStep1.Width = Width - (groupBoxStep1.Left * 2 + 15); + buttonCancel.Left = Width - (buttonCancel.Width + 26); + buttonNextFinish.Left = buttonCancel.Left - (buttonNextFinish.Width + 6); + buttonBack.Left = buttonNextFinish.Left - (buttonBack.Width + 6); + tabControl1.Width = groupBox2.Width - (tabControl1.Left * 2); + listView1.Width = groupBoxStep1.Width - (listView1.Left * 2); + + ListViewFixesAutoSizeAllColumns(); + subtitleListView1.AutoSizeAllColumns(this); + } + + public void ListViewFixesAutoSizeAllColumns() + { + using (var graphics = CreateGraphics()) + { + var timestampSizeF = graphics.MeasureString(listViewFixes.Columns[0].Text, Font); // Apply + var width = (int)(timestampSizeF.Width + 12); + listViewFixes.Columns[0].Width = width; + + timestampSizeF = graphics.MeasureString(listViewFixes.Columns[1].Text, Font); // line# + width = (int)(timestampSizeF.Width + 12); + listViewFixes.Columns[1].Width = width; + + timestampSizeF = graphics.MeasureString("Auto break all lines and even more stuff", Font); // Function + width = (int)(timestampSizeF.Width + 12); + listViewFixes.Columns[2].Width = width; + + int length = listViewFixes.Columns[0].Width + listViewFixes.Columns[1].Width + listViewFixes.Columns[2].Width; + int lengthAvailable = Width - length; + width = (lengthAvailable - 10) / 2; + listViewFixes.Columns[3].Width = width; // before + listViewFixes.Columns[4].Width = width; // after + } + } + + private void FixCommonErrorsShown(object sender, EventArgs e) + { + FixCommonErrorsResize(null, null); + } + + private void SplitSelectedParagraph(double? splitSeconds) + { + if (FixedSubtitle.Paragraphs.Count > 0 && subtitleListView1.SelectedItems.Count > 0) + { + subtitleListView1.SelectedIndexChanged -= SubtitleListView1SelectedIndexChanged; + int firstSelectedIndex = subtitleListView1.SelectedItems[0].Index; + + // save de-selected fixes + var deSelectedFixes = new List(); + foreach (ListViewItem item in listViewFixes.Items) + { + if (!item.Checked) + { + int number = Convert.ToInt32(item.SubItems[1].Text); + if (number > firstSelectedIndex) + { + number++; + } + + deSelectedFixes.Add(number + item.SubItems[2].Text + item.SubItems[3].Text); + } + } + + Paragraph currentParagraph = FixedSubtitle.GetParagraphOrDefault(firstSelectedIndex); + var newParagraph = new Paragraph(); + + string oldText = currentParagraph.Text; + var lines = currentParagraph.Text.SplitToLines(); + if (lines.Count == 2 && (lines[0].EndsWith('.') || lines[0].EndsWith('!') || lines[0].EndsWith('?'))) + { + currentParagraph.Text = Utilities.AutoBreakLine(lines[0], Language); + newParagraph.Text = Utilities.AutoBreakLine(lines[1], Language); + } + else + { + string s = Utilities.AutoBreakLine(currentParagraph.Text, 5, Configuration.Settings.General.MergeLinesShorterThan, Language); + lines = s.SplitToLines(); + if (lines.Count == 2) + { + currentParagraph.Text = Utilities.AutoBreakLine(lines[0], Language); + newParagraph.Text = Utilities.AutoBreakLine(lines[1], Language); + } + else if (lines.Count > 2) + { + var half = lines.Count / 2; + var sb1 = new StringBuilder(); + for (int i = 0; i < half; i++) + { + sb1.AppendLine(lines[i]); + } + + currentParagraph.Text = Utilities.AutoBreakLine(sb1.ToString(), _autoDetectGoogleLanguage); + sb1 = new StringBuilder(); + for (int i = half; i < lines.Count; i++) + { + sb1.AppendLine(lines[i]); + } + + newParagraph.Text = Utilities.AutoBreakLine(sb1.ToString(), _autoDetectGoogleLanguage); + } + } + + double startFactor = (double)HtmlUtil.RemoveHtmlTags(currentParagraph.Text).Length / HtmlUtil.RemoveHtmlTags(oldText).Length; + if (startFactor < 0.20) + { + startFactor = 0.20; + } + + if (startFactor > 0.80) + { + startFactor = 0.80; + } + + double middle = currentParagraph.StartTime.TotalMilliseconds + (currentParagraph.Duration.TotalMilliseconds * startFactor); + if (splitSeconds.HasValue && splitSeconds.Value > (currentParagraph.StartTime.TotalSeconds + 0.2) && splitSeconds.Value < (currentParagraph.EndTime.TotalSeconds - 0.2)) + { + middle = splitSeconds.Value * TimeCode.BaseUnit; + } + + newParagraph.EndTime.TotalMilliseconds = currentParagraph.EndTime.TotalMilliseconds; + currentParagraph.EndTime.TotalMilliseconds = middle; + newParagraph.StartTime.TotalMilliseconds = currentParagraph.EndTime.TotalMilliseconds + 1; + + FixedSubtitle.Paragraphs.Insert(firstSelectedIndex + 1, newParagraph); + FixedSubtitle.Renumber(); + subtitleListView1.Fill(FixedSubtitle); + textBoxListViewText.Text = currentParagraph.Text; + + subtitleListView1.SelectIndexAndEnsureVisible(firstSelectedIndex); + subtitleListView1.SelectedIndexChanged += SubtitleListView1SelectedIndexChanged; + + // restore de-selected fixes + listViewFixes.Items.Clear(); + _onlyListFixes = true; + Next(); + foreach (ListViewItem item in listViewFixes.Items) + { + if (deSelectedFixes.Contains(item.SubItems[1].Text + item.SubItems[2].Text + item.SubItems[3].Text)) + { + item.Checked = false; + } + } + } + } + + private void ButtonSplitLineClick(object sender, EventArgs e) + { + SplitSelectedParagraph(null); + } + + private void TextBoxListViewTextKeyDown(object sender, KeyEventArgs e) + { + UiUtil.CheckAutoWrap(textBoxListViewText, e, Utilities.GetNumberOfLines(textBoxListViewText.Text)); + } + + private void FixCommonErrorsFormClosing(object sender, FormClosingEventArgs e) + { + if (_ocrFixEngine != null) + { + _ocrFixEngine.Dispose(); + _ocrFixEngine = null; + } + Owner = null; + } + + private void comboBoxLanguage_SelectedIndexChanged(object sender, EventArgs e) + { + if (Subtitle != null) + { + if (comboBoxLanguage.SelectedItem is LanguageItem ci) + { + _autoDetectGoogleLanguage = ci.Code.TwoLetterISOLanguageName; + AddFixActions(ci.Code.GetThreeLetterIsoLanguageName()); + } + } + labelLanguage2.Text = comboBoxLanguage.Text; + } + + private void comboBoxLanguage_Enter(object sender, EventArgs e) + { + SaveConfiguration(); + } + + private void buttonResetDefault_Click(object sender, EventArgs e) + { + Configuration.Settings.CommonErrors.LoadUserDefaultFixes(Configuration.Settings.CommonErrors.DefaultFixes); + AddFixActions(CultureInfo.GetCultureInfo(_autoDetectGoogleLanguage).GetThreeLetterIsoLanguageName()); + } + + private void subtitleListView1_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.A && e.Modifiers == Keys.Control) + { + subtitleListView1.SelectAll(); + e.SuppressKeyPress = true; + } + else if (e.KeyCode == Keys.D && e.Modifiers == Keys.Control) + { + subtitleListView1.SelectFirstSelectedItemOnly(); + e.SuppressKeyPress = true; + } + else if (e.KeyCode == Keys.I && e.Modifiers == (Keys.Control | Keys.Shift)) //InverseSelection + { + subtitleListView1.InverseSelection(); + e.SuppressKeyPress = true; + } + else if (e.KeyCode == Keys.Delete) + { + ToolStripMenuItemDeleteClick(null, null); + } + } + + private Hunspell _hunspell; + + public bool DoSpell(string word) + { + if (_hunspell == null && Language != null) + { + var fileMatches = Directory.GetFiles(Utilities.DictionaryFolder, Language + "*.dic"); + if (fileMatches.Length > 0) + { + var dictionary = fileMatches[0].Substring(0, fileMatches[0].Length - 4); + try + { + _hunspell = Hunspell.GetHunspell(dictionary); + } + catch + { + _hunspell = null; + } + } + } + + if (_hunspell == null) + { + return false; + } + + return _hunspell.Spell(word); + } + + private void toolStripMenuItemSelectAll_Click(object sender, EventArgs e) + { + foreach (ListViewItem item in listViewFixes.Items) + { + item.Checked = true; + } + } + + private void toolStripMenuItemInverseSelection_Click(object sender, EventArgs e) + { + foreach (ListViewItem item in listViewFixes.Items) + { + item.Checked = !item.Checked; + } + } + + private void setCurrentFixesAsDefaultToolStripMenuItem_Click(object sender, EventArgs e) + { + SaveConfiguration(); + Configuration.Settings.CommonErrors.SaveUserDefaultFixes(); + AddFixActions(CultureInfo.GetCultureInfo(_autoDetectGoogleLanguage).GetThreeLetterIsoLanguageName()); + } + + private void selectDefaultToolStripMenuItem_Click(object sender, EventArgs e) + { + buttonResetDefault_Click(null, null); + } + } +} diff --git a/src/Forms/FixCommonErrors.resx b/src/ui/Forms/FixCommonErrors.resx similarity index 98% rename from src/Forms/FixCommonErrors.resx rename to src/ui/Forms/FixCommonErrors.resx index 7791be016..ae2263af6 100644 --- a/src/Forms/FixCommonErrors.resx +++ b/src/ui/Forms/FixCommonErrors.resx @@ -1,129 +1,129 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 327, 17 - - - 172, 17 - - - 17, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 327, 17 + + + 172, 17 + + + 17, 17 + \ No newline at end of file diff --git a/src/Forms/GetDictionaries.Designer.cs b/src/ui/Forms/GetDictionaries.Designer.cs similarity index 98% rename from src/Forms/GetDictionaries.Designer.cs rename to src/ui/Forms/GetDictionaries.Designer.cs index 8328b92c3..b8293e21e 100644 --- a/src/Forms/GetDictionaries.Designer.cs +++ b/src/ui/Forms/GetDictionaries.Designer.cs @@ -1,177 +1,177 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class GetDictionaries - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.buttonOK = new System.Windows.Forms.Button(); - this.labelDescription2 = new System.Windows.Forms.Label(); - this.linkLabelOpenDictionaryFolder = new System.Windows.Forms.LinkLabel(); - this.labelDescription1 = new System.Windows.Forms.Label(); - this.comboBoxDictionaries = new System.Windows.Forms.ComboBox(); - this.buttonDownload = new System.Windows.Forms.Button(); - this.labelChooseLanguageAndClickDownload = new System.Windows.Forms.Label(); - this.labelPleaseWait = new System.Windows.Forms.Label(); - this.buttonDownloadAll = new System.Windows.Forms.Button(); - this.SuspendLayout(); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; - this.buttonOK.Location = new System.Drawing.Point(356, 159); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(104, 23); - this.buttonOK.TabIndex = 20; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - // - // labelDescription2 - // - this.labelDescription2.AutoSize = true; - this.labelDescription2.Location = new System.Drawing.Point(30, 34); - this.labelDescription2.Name = "labelDescription2"; - this.labelDescription2.Size = new System.Drawing.Size(263, 13); - this.labelDescription2.TabIndex = 1; - this.labelDescription2.Text = "uses the spell checking dictionaries from LibreOffice."; - // - // linkLabelOpenDictionaryFolder - // - this.linkLabelOpenDictionaryFolder.AutoSize = true; - this.linkLabelOpenDictionaryFolder.Location = new System.Drawing.Point(30, 164); - this.linkLabelOpenDictionaryFolder.Name = "linkLabelOpenDictionaryFolder"; - this.linkLabelOpenDictionaryFolder.Size = new System.Drawing.Size(126, 13); - this.linkLabelOpenDictionaryFolder.TabIndex = 15; - this.linkLabelOpenDictionaryFolder.TabStop = true; - this.linkLabelOpenDictionaryFolder.Text = "Open \'Dictionaries\' folder"; - this.linkLabelOpenDictionaryFolder.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabel4LinkClicked); - // - // labelDescription1 - // - this.labelDescription1.AutoSize = true; - this.labelDescription1.Location = new System.Drawing.Point(30, 16); - this.labelDescription1.Name = "labelDescription1"; - this.labelDescription1.Size = new System.Drawing.Size(316, 13); - this.labelDescription1.TabIndex = 8; - this.labelDescription1.Text = "Subtitle Edit\'s spell check is based on the NHunspell engine which"; - // - // comboBoxDictionaries - // - this.comboBoxDictionaries.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.comboBoxDictionaries.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxDictionaries.FormattingEnabled = true; - this.comboBoxDictionaries.Location = new System.Drawing.Point(33, 98); - this.comboBoxDictionaries.Name = "comboBoxDictionaries"; - this.comboBoxDictionaries.Size = new System.Drawing.Size(317, 21); - this.comboBoxDictionaries.TabIndex = 0; - this.comboBoxDictionaries.SelectedIndexChanged += new System.EventHandler(this.comboBoxDictionaries_SelectedIndexChanged); - // - // buttonDownload - // - this.buttonDownload.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonDownload.Location = new System.Drawing.Point(356, 97); - this.buttonDownload.Name = "buttonDownload"; - this.buttonDownload.Size = new System.Drawing.Size(104, 25); - this.buttonDownload.TabIndex = 10; - this.buttonDownload.Text = "&Download"; - this.buttonDownload.UseVisualStyleBackColor = true; - this.buttonDownload.Click += new System.EventHandler(this.buttonDownload_Click); - // - // labelChooseLanguageAndClickDownload - // - this.labelChooseLanguageAndClickDownload.AutoSize = true; - this.labelChooseLanguageAndClickDownload.Location = new System.Drawing.Point(30, 79); - this.labelChooseLanguageAndClickDownload.Name = "labelChooseLanguageAndClickDownload"; - this.labelChooseLanguageAndClickDownload.Size = new System.Drawing.Size(207, 13); - this.labelChooseLanguageAndClickDownload.TabIndex = 11; - this.labelChooseLanguageAndClickDownload.Text = "Choose your language and click download"; - // - // labelPleaseWait - // - this.labelPleaseWait.AutoSize = true; - this.labelPleaseWait.Location = new System.Drawing.Point(30, 126); - this.labelPleaseWait.Name = "labelPleaseWait"; - this.labelPleaseWait.Size = new System.Drawing.Size(73, 13); - this.labelPleaseWait.TabIndex = 12; - this.labelPleaseWait.Text = "Please wait..."; - // - // buttonDownloadAll - // - this.buttonDownloadAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonDownloadAll.BackColor = System.Drawing.Color.Yellow; - this.buttonDownloadAll.Location = new System.Drawing.Point(296, 54); - this.buttonDownloadAll.Name = "buttonDownloadAll"; - this.buttonDownloadAll.Size = new System.Drawing.Size(164, 25); - this.buttonDownloadAll.TabIndex = 21; - this.buttonDownloadAll.Text = "Download all [DEBUG ONLY]"; - this.buttonDownloadAll.UseVisualStyleBackColor = false; - this.buttonDownloadAll.Visible = false; - this.buttonDownloadAll.Click += new System.EventHandler(this.buttonDownloadAll_Click); - // - // GetDictionaries - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(472, 195); - this.Controls.Add(this.buttonDownloadAll); - this.Controls.Add(this.comboBoxDictionaries); - this.Controls.Add(this.labelPleaseWait); - this.Controls.Add(this.labelChooseLanguageAndClickDownload); - this.Controls.Add(this.buttonDownload); - this.Controls.Add(this.labelDescription1); - this.Controls.Add(this.linkLabelOpenDictionaryFolder); - this.Controls.Add(this.labelDescription2); - this.Controls.Add(this.buttonOK); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "GetDictionaries"; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Need dictionaries?"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormGetDictionaries_KeyDown); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Label labelDescription2; - private System.Windows.Forms.LinkLabel linkLabelOpenDictionaryFolder; - private System.Windows.Forms.Label labelDescription1; - private System.Windows.Forms.ComboBox comboBoxDictionaries; - private System.Windows.Forms.Button buttonDownload; - private System.Windows.Forms.Label labelChooseLanguageAndClickDownload; - private System.Windows.Forms.Label labelPleaseWait; - private System.Windows.Forms.Button buttonDownloadAll; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class GetDictionaries + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.buttonOK = new System.Windows.Forms.Button(); + this.labelDescription2 = new System.Windows.Forms.Label(); + this.linkLabelOpenDictionaryFolder = new System.Windows.Forms.LinkLabel(); + this.labelDescription1 = new System.Windows.Forms.Label(); + this.comboBoxDictionaries = new System.Windows.Forms.ComboBox(); + this.buttonDownload = new System.Windows.Forms.Button(); + this.labelChooseLanguageAndClickDownload = new System.Windows.Forms.Label(); + this.labelPleaseWait = new System.Windows.Forms.Label(); + this.buttonDownloadAll = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; + this.buttonOK.Location = new System.Drawing.Point(356, 159); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(104, 23); + this.buttonOK.TabIndex = 20; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + // + // labelDescription2 + // + this.labelDescription2.AutoSize = true; + this.labelDescription2.Location = new System.Drawing.Point(30, 34); + this.labelDescription2.Name = "labelDescription2"; + this.labelDescription2.Size = new System.Drawing.Size(263, 13); + this.labelDescription2.TabIndex = 1; + this.labelDescription2.Text = "uses the spell checking dictionaries from LibreOffice."; + // + // linkLabelOpenDictionaryFolder + // + this.linkLabelOpenDictionaryFolder.AutoSize = true; + this.linkLabelOpenDictionaryFolder.Location = new System.Drawing.Point(30, 164); + this.linkLabelOpenDictionaryFolder.Name = "linkLabelOpenDictionaryFolder"; + this.linkLabelOpenDictionaryFolder.Size = new System.Drawing.Size(126, 13); + this.linkLabelOpenDictionaryFolder.TabIndex = 15; + this.linkLabelOpenDictionaryFolder.TabStop = true; + this.linkLabelOpenDictionaryFolder.Text = "Open \'Dictionaries\' folder"; + this.linkLabelOpenDictionaryFolder.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabel4LinkClicked); + // + // labelDescription1 + // + this.labelDescription1.AutoSize = true; + this.labelDescription1.Location = new System.Drawing.Point(30, 16); + this.labelDescription1.Name = "labelDescription1"; + this.labelDescription1.Size = new System.Drawing.Size(316, 13); + this.labelDescription1.TabIndex = 8; + this.labelDescription1.Text = "Subtitle Edit\'s spell check is based on the NHunspell engine which"; + // + // comboBoxDictionaries + // + this.comboBoxDictionaries.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.comboBoxDictionaries.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxDictionaries.FormattingEnabled = true; + this.comboBoxDictionaries.Location = new System.Drawing.Point(33, 98); + this.comboBoxDictionaries.Name = "comboBoxDictionaries"; + this.comboBoxDictionaries.Size = new System.Drawing.Size(317, 21); + this.comboBoxDictionaries.TabIndex = 0; + this.comboBoxDictionaries.SelectedIndexChanged += new System.EventHandler(this.comboBoxDictionaries_SelectedIndexChanged); + // + // buttonDownload + // + this.buttonDownload.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonDownload.Location = new System.Drawing.Point(356, 97); + this.buttonDownload.Name = "buttonDownload"; + this.buttonDownload.Size = new System.Drawing.Size(104, 25); + this.buttonDownload.TabIndex = 10; + this.buttonDownload.Text = "&Download"; + this.buttonDownload.UseVisualStyleBackColor = true; + this.buttonDownload.Click += new System.EventHandler(this.buttonDownload_Click); + // + // labelChooseLanguageAndClickDownload + // + this.labelChooseLanguageAndClickDownload.AutoSize = true; + this.labelChooseLanguageAndClickDownload.Location = new System.Drawing.Point(30, 79); + this.labelChooseLanguageAndClickDownload.Name = "labelChooseLanguageAndClickDownload"; + this.labelChooseLanguageAndClickDownload.Size = new System.Drawing.Size(207, 13); + this.labelChooseLanguageAndClickDownload.TabIndex = 11; + this.labelChooseLanguageAndClickDownload.Text = "Choose your language and click download"; + // + // labelPleaseWait + // + this.labelPleaseWait.AutoSize = true; + this.labelPleaseWait.Location = new System.Drawing.Point(30, 126); + this.labelPleaseWait.Name = "labelPleaseWait"; + this.labelPleaseWait.Size = new System.Drawing.Size(73, 13); + this.labelPleaseWait.TabIndex = 12; + this.labelPleaseWait.Text = "Please wait..."; + // + // buttonDownloadAll + // + this.buttonDownloadAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonDownloadAll.BackColor = System.Drawing.Color.Yellow; + this.buttonDownloadAll.Location = new System.Drawing.Point(296, 54); + this.buttonDownloadAll.Name = "buttonDownloadAll"; + this.buttonDownloadAll.Size = new System.Drawing.Size(164, 25); + this.buttonDownloadAll.TabIndex = 21; + this.buttonDownloadAll.Text = "Download all [DEBUG ONLY]"; + this.buttonDownloadAll.UseVisualStyleBackColor = false; + this.buttonDownloadAll.Visible = false; + this.buttonDownloadAll.Click += new System.EventHandler(this.buttonDownloadAll_Click); + // + // GetDictionaries + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(472, 195); + this.Controls.Add(this.buttonDownloadAll); + this.Controls.Add(this.comboBoxDictionaries); + this.Controls.Add(this.labelPleaseWait); + this.Controls.Add(this.labelChooseLanguageAndClickDownload); + this.Controls.Add(this.buttonDownload); + this.Controls.Add(this.labelDescription1); + this.Controls.Add(this.linkLabelOpenDictionaryFolder); + this.Controls.Add(this.labelDescription2); + this.Controls.Add(this.buttonOK); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "GetDictionaries"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Need dictionaries?"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormGetDictionaries_KeyDown); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Label labelDescription2; + private System.Windows.Forms.LinkLabel linkLabelOpenDictionaryFolder; + private System.Windows.Forms.Label labelDescription1; + private System.Windows.Forms.ComboBox comboBoxDictionaries; + private System.Windows.Forms.Button buttonDownload; + private System.Windows.Forms.Label labelChooseLanguageAndClickDownload; + private System.Windows.Forms.Label labelPleaseWait; + private System.Windows.Forms.Button buttonDownloadAll; + } } \ No newline at end of file diff --git a/src/Forms/GetDictionaries.cs b/src/ui/Forms/GetDictionaries.cs similarity index 97% rename from src/Forms/GetDictionaries.cs rename to src/ui/Forms/GetDictionaries.cs index f4fa65c65..e8b2d431b 100644 --- a/src/Forms/GetDictionaries.cs +++ b/src/ui/Forms/GetDictionaries.cs @@ -1,312 +1,312 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.IO; -using System.IO.Compression; -using System.Net; -using System.Windows.Forms; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class GetDictionaries : Form - { - private List _dictionaryDownloadLinks = new List(); - private List _descriptions = new List(); - private List _englishNames = new List(); - private string _xmlName; - private string _downloadLink; - private int _testAllIndex = -1; - - public string SelectedEnglishName { get; private set; } - public string LastDownload { get; private set; } - - public GetDictionaries() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - Text = Configuration.Settings.Language.GetDictionaries.Title; - labelDescription1.Text = Configuration.Settings.Language.GetDictionaries.DescriptionLine1; - labelDescription2.Text = Configuration.Settings.Language.GetDictionaries.DescriptionLine2; - linkLabelOpenDictionaryFolder.Text = Configuration.Settings.Language.GetDictionaries.OpenDictionariesFolder; - labelChooseLanguageAndClickDownload.Text = Configuration.Settings.Language.GetDictionaries.ChooseLanguageAndClickDownload; - buttonDownload.Text = Configuration.Settings.Language.GetDictionaries.Download; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - labelPleaseWait.Text = string.Empty; - - LoadDictionaryList("Nikse.SubtitleEdit.Resources.HunspellDictionaries.xml.gz"); - FixLargeFonts(); -#if DEBUG - buttonDownloadAll.Visible = true; // For testing all download links -#endif - } - - private void LoadDictionaryList(string xmlResourceName) - { - _dictionaryDownloadLinks = new List(); - _descriptions = new List(); - _englishNames = new List(); - _xmlName = xmlResourceName; - System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly(); - var stream = asm.GetManifestResourceStream(_xmlName); - if (stream != null) - { - comboBoxDictionaries.Items.Clear(); - var doc = new XmlDocument(); - using (var rdr = new StreamReader(stream)) - using (var zip = new GZipStream(rdr.BaseStream, CompressionMode.Decompress)) - using (var reader = XmlReader.Create(zip, new XmlReaderSettings { IgnoreProcessingInstructions = true })) - { - doc.Load(reader); - } - - foreach (XmlNode node in doc.DocumentElement.SelectNodes("Dictionary")) - { - string englishName = node.SelectSingleNode("EnglishName").InnerText; - string nativeName = node.SelectSingleNode("NativeName").InnerText; - string downloadLink = node.SelectSingleNode("DownloadLink").InnerText; - - string description = string.Empty; - if (node.SelectSingleNode("Description") != null) - { - description = node.SelectSingleNode("Description").InnerText; - } - - if (!string.IsNullOrEmpty(downloadLink)) - { - string name = englishName; - if (!string.IsNullOrEmpty(nativeName)) - { - name += " - " + nativeName; - } - - comboBoxDictionaries.Items.Add(name); - _dictionaryDownloadLinks.Add(downloadLink); - _descriptions.Add(description); - _englishNames.Add(englishName); - } - } - comboBoxDictionaries.SelectedIndex = 0; - } - comboBoxDictionaries.AutoCompleteSource = AutoCompleteSource.ListItems; - comboBoxDictionaries.AutoCompleteMode = AutoCompleteMode.Append; - } - - private void FixLargeFonts() - { - if (labelDescription1.Left + labelDescription1.Width + 5 > Width) - { - Width = labelDescription1.Left + labelDescription1.Width + 5; - } - - UiUtil.FixLargeFonts(this, buttonOK); - } - - private void FormGetDictionaries_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - else if (e.KeyCode == UiUtil.HelpKeys) - { - Utilities.ShowHelp("#spellcheck"); - e.SuppressKeyPress = true; - } - } - - private void LinkLabel4LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) - { - string dictionaryFolder = Utilities.DictionaryFolder; - if (!Directory.Exists(dictionaryFolder)) - { - Directory.CreateDirectory(dictionaryFolder); - } - - UiUtil.OpenFolder(dictionaryFolder); - } - - private void buttonDownload_Click(object sender, EventArgs e) - { - try - { - labelPleaseWait.Text = Configuration.Settings.Language.General.PleaseWait; - buttonOK.Enabled = false; - buttonDownload.Enabled = false; - buttonDownloadAll.Enabled = false; - comboBoxDictionaries.Enabled = false; - Refresh(); - Cursor = Cursors.WaitCursor; - - int index = comboBoxDictionaries.SelectedIndex; - _downloadLink = _dictionaryDownloadLinks[index]; - string url = _dictionaryDownloadLinks[index]; - SelectedEnglishName = _englishNames[index]; - - var wc = new WebClient { Proxy = Utilities.GetProxy() }; - wc.DownloadDataCompleted += wc_DownloadDataCompleted; - wc.DownloadProgressChanged += (o, args) => - { - labelPleaseWait.Text = Configuration.Settings.Language.General.PleaseWait + " " + args.ProgressPercentage + "%"; - }; - wc.DownloadDataAsync(new Uri(url)); - } - catch (Exception exception) - { - labelPleaseWait.Text = string.Empty; - buttonOK.Enabled = true; - buttonDownload.Enabled = true; - buttonDownloadAll.Enabled = true; - comboBoxDictionaries.Enabled = true; - Cursor = Cursors.Default; - MessageBox.Show(exception.Message + Environment.NewLine + Environment.NewLine + exception.StackTrace); - } - } - - private void wc_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e) - { - Cursor = Cursors.Default; - if (e.Error != null && _xmlName == "Nikse.SubtitleEdit.Resources.HunspellDictionaries.xml.gz") - { - MessageBox.Show("Unable to download " + _downloadLink + Environment.NewLine + - "Switching host - please re-try!"); - LoadDictionaryList("Nikse.SubtitleEdit.Resources.HunspellBackupDictionaries.xml.gz"); - labelPleaseWait.Text = string.Empty; - buttonOK.Enabled = true; - buttonDownload.Enabled = true; - buttonDownloadAll.Enabled = true; - comboBoxDictionaries.Enabled = true; - Cursor = Cursors.Default; - return; - } - - if (e.Error != null) - { - MessageBox.Show(Configuration.Settings.Language.GetTesseractDictionaries.DownloadFailed + Environment.NewLine + - Environment.NewLine + - e.Error.Message); - DialogResult = DialogResult.Cancel; - return; - } - - string dictionaryFolder = Utilities.DictionaryFolder; - if (!Directory.Exists(dictionaryFolder)) - { - Directory.CreateDirectory(dictionaryFolder); - } - - int index = comboBoxDictionaries.SelectedIndex; - - using (var ms = new MemoryStream(e.Result)) - using (ZipExtractor zip = ZipExtractor.Open(ms)) - { - List dir = zip.ReadCentralDir(); - // Extract dic/aff files in dictionary folder - bool found = false; - ExtractDic(dictionaryFolder, zip, dir, ref found); - - if (!found) // check zip inside zip - { - foreach (ZipExtractor.ZipFileEntry entry in dir) - { - if (entry.FilenameInZip.EndsWith(".zip", StringComparison.OrdinalIgnoreCase)) - { - using (var innerMs = new MemoryStream()) - { - zip.ExtractFile(entry, innerMs); - ZipExtractor innerZip = ZipExtractor.Open(innerMs); - List innerDir = innerZip.ReadCentralDir(); - ExtractDic(dictionaryFolder, innerZip, innerDir, ref found); - } - } - } - } - } - - Cursor = Cursors.Default; - labelPleaseWait.Text = string.Empty; - buttonOK.Enabled = true; - buttonDownload.Enabled = true; - buttonDownloadAll.Enabled = true; - comboBoxDictionaries.Enabled = true; - if (_testAllIndex >= 0) - { - DownloadNext(); - return; - } - MessageBox.Show(string.Format(Configuration.Settings.Language.GetDictionaries.XDownloaded, comboBoxDictionaries.Items[index])); - } - - private void ExtractDic(string dictionaryFolder, ZipExtractor zip, List dir, ref bool found) - { - foreach (ZipExtractor.ZipFileEntry entry in dir) - { - if (entry.FilenameInZip.EndsWith(".dic", StringComparison.OrdinalIgnoreCase) || entry.FilenameInZip.EndsWith(".aff", StringComparison.OrdinalIgnoreCase)) - { - string fileName = Path.GetFileName(entry.FilenameInZip); - - // French fix - if (fileName.StartsWith("fr-moderne", StringComparison.Ordinal)) - { - fileName = fileName.Replace("fr-moderne", "fr_FR"); - } - - // German fix - if (fileName.StartsWith("de_DE_frami", StringComparison.Ordinal)) - { - fileName = fileName.Replace("de_DE_frami", "de_DE"); - } - - // Russian fix - if (fileName.StartsWith("russian-aot", StringComparison.Ordinal)) - { - fileName = fileName.Replace("russian-aot", "ru_RU"); - } - - string path = Path.Combine(dictionaryFolder, fileName); - zip.ExtractFile(entry, path); - - found = true; - - LastDownload = fileName; - } - } - } - - private void comboBoxDictionaries_SelectedIndexChanged(object sender, EventArgs e) - { - int index = comboBoxDictionaries.SelectedIndex; - labelPleaseWait.Text = _descriptions[index]; - } - - private void buttonDownloadAll_Click(object sender, EventArgs e) - { - _testAllIndex = comboBoxDictionaries.SelectedIndex - 1; - if (_testAllIndex < -1) - { - _testAllIndex = -1; - } - - DownloadNext(); - } - - private void DownloadNext() - { - _testAllIndex++; - if (_testAllIndex < comboBoxDictionaries.Items.Count) - { - comboBoxDictionaries.SelectedIndex = _testAllIndex; - buttonDownload_Click(null, null); - } - else - { - LoadDictionaryList("Nikse.SubtitleEdit.Resources.HunspellBackupDictionaries.xml.gz"); - } - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.IO; +using System.IO.Compression; +using System.Net; +using System.Windows.Forms; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class GetDictionaries : Form + { + private List _dictionaryDownloadLinks = new List(); + private List _descriptions = new List(); + private List _englishNames = new List(); + private string _xmlName; + private string _downloadLink; + private int _testAllIndex = -1; + + public string SelectedEnglishName { get; private set; } + public string LastDownload { get; private set; } + + public GetDictionaries() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + Text = Configuration.Settings.Language.GetDictionaries.Title; + labelDescription1.Text = Configuration.Settings.Language.GetDictionaries.DescriptionLine1; + labelDescription2.Text = Configuration.Settings.Language.GetDictionaries.DescriptionLine2; + linkLabelOpenDictionaryFolder.Text = Configuration.Settings.Language.GetDictionaries.OpenDictionariesFolder; + labelChooseLanguageAndClickDownload.Text = Configuration.Settings.Language.GetDictionaries.ChooseLanguageAndClickDownload; + buttonDownload.Text = Configuration.Settings.Language.GetDictionaries.Download; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + labelPleaseWait.Text = string.Empty; + + LoadDictionaryList("Nikse.SubtitleEdit.Resources.HunspellDictionaries.xml.gz"); + FixLargeFonts(); +#if DEBUG + buttonDownloadAll.Visible = true; // For testing all download links +#endif + } + + private void LoadDictionaryList(string xmlResourceName) + { + _dictionaryDownloadLinks = new List(); + _descriptions = new List(); + _englishNames = new List(); + _xmlName = xmlResourceName; + System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly(); + var stream = asm.GetManifestResourceStream(_xmlName); + if (stream != null) + { + comboBoxDictionaries.Items.Clear(); + var doc = new XmlDocument(); + using (var rdr = new StreamReader(stream)) + using (var zip = new GZipStream(rdr.BaseStream, CompressionMode.Decompress)) + using (var reader = XmlReader.Create(zip, new XmlReaderSettings { IgnoreProcessingInstructions = true })) + { + doc.Load(reader); + } + + foreach (XmlNode node in doc.DocumentElement.SelectNodes("Dictionary")) + { + string englishName = node.SelectSingleNode("EnglishName").InnerText; + string nativeName = node.SelectSingleNode("NativeName").InnerText; + string downloadLink = node.SelectSingleNode("DownloadLink").InnerText; + + string description = string.Empty; + if (node.SelectSingleNode("Description") != null) + { + description = node.SelectSingleNode("Description").InnerText; + } + + if (!string.IsNullOrEmpty(downloadLink)) + { + string name = englishName; + if (!string.IsNullOrEmpty(nativeName)) + { + name += " - " + nativeName; + } + + comboBoxDictionaries.Items.Add(name); + _dictionaryDownloadLinks.Add(downloadLink); + _descriptions.Add(description); + _englishNames.Add(englishName); + } + } + comboBoxDictionaries.SelectedIndex = 0; + } + comboBoxDictionaries.AutoCompleteSource = AutoCompleteSource.ListItems; + comboBoxDictionaries.AutoCompleteMode = AutoCompleteMode.Append; + } + + private void FixLargeFonts() + { + if (labelDescription1.Left + labelDescription1.Width + 5 > Width) + { + Width = labelDescription1.Left + labelDescription1.Width + 5; + } + + UiUtil.FixLargeFonts(this, buttonOK); + } + + private void FormGetDictionaries_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + else if (e.KeyCode == UiUtil.HelpKeys) + { + Utilities.ShowHelp("#spellcheck"); + e.SuppressKeyPress = true; + } + } + + private void LinkLabel4LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + string dictionaryFolder = Utilities.DictionaryFolder; + if (!Directory.Exists(dictionaryFolder)) + { + Directory.CreateDirectory(dictionaryFolder); + } + + UiUtil.OpenFolder(dictionaryFolder); + } + + private void buttonDownload_Click(object sender, EventArgs e) + { + try + { + labelPleaseWait.Text = Configuration.Settings.Language.General.PleaseWait; + buttonOK.Enabled = false; + buttonDownload.Enabled = false; + buttonDownloadAll.Enabled = false; + comboBoxDictionaries.Enabled = false; + Refresh(); + Cursor = Cursors.WaitCursor; + + int index = comboBoxDictionaries.SelectedIndex; + _downloadLink = _dictionaryDownloadLinks[index]; + string url = _dictionaryDownloadLinks[index]; + SelectedEnglishName = _englishNames[index]; + + var wc = new WebClient { Proxy = Utilities.GetProxy() }; + wc.DownloadDataCompleted += wc_DownloadDataCompleted; + wc.DownloadProgressChanged += (o, args) => + { + labelPleaseWait.Text = Configuration.Settings.Language.General.PleaseWait + " " + args.ProgressPercentage + "%"; + }; + wc.DownloadDataAsync(new Uri(url)); + } + catch (Exception exception) + { + labelPleaseWait.Text = string.Empty; + buttonOK.Enabled = true; + buttonDownload.Enabled = true; + buttonDownloadAll.Enabled = true; + comboBoxDictionaries.Enabled = true; + Cursor = Cursors.Default; + MessageBox.Show(exception.Message + Environment.NewLine + Environment.NewLine + exception.StackTrace); + } + } + + private void wc_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e) + { + Cursor = Cursors.Default; + if (e.Error != null && _xmlName == "Nikse.SubtitleEdit.Resources.HunspellDictionaries.xml.gz") + { + MessageBox.Show("Unable to download " + _downloadLink + Environment.NewLine + + "Switching host - please re-try!"); + LoadDictionaryList("Nikse.SubtitleEdit.Resources.HunspellBackupDictionaries.xml.gz"); + labelPleaseWait.Text = string.Empty; + buttonOK.Enabled = true; + buttonDownload.Enabled = true; + buttonDownloadAll.Enabled = true; + comboBoxDictionaries.Enabled = true; + Cursor = Cursors.Default; + return; + } + + if (e.Error != null) + { + MessageBox.Show(Configuration.Settings.Language.GetTesseractDictionaries.DownloadFailed + Environment.NewLine + + Environment.NewLine + + e.Error.Message); + DialogResult = DialogResult.Cancel; + return; + } + + string dictionaryFolder = Utilities.DictionaryFolder; + if (!Directory.Exists(dictionaryFolder)) + { + Directory.CreateDirectory(dictionaryFolder); + } + + int index = comboBoxDictionaries.SelectedIndex; + + using (var ms = new MemoryStream(e.Result)) + using (ZipExtractor zip = ZipExtractor.Open(ms)) + { + List dir = zip.ReadCentralDir(); + // Extract dic/aff files in dictionary folder + bool found = false; + ExtractDic(dictionaryFolder, zip, dir, ref found); + + if (!found) // check zip inside zip + { + foreach (ZipExtractor.ZipFileEntry entry in dir) + { + if (entry.FilenameInZip.EndsWith(".zip", StringComparison.OrdinalIgnoreCase)) + { + using (var innerMs = new MemoryStream()) + { + zip.ExtractFile(entry, innerMs); + ZipExtractor innerZip = ZipExtractor.Open(innerMs); + List innerDir = innerZip.ReadCentralDir(); + ExtractDic(dictionaryFolder, innerZip, innerDir, ref found); + } + } + } + } + } + + Cursor = Cursors.Default; + labelPleaseWait.Text = string.Empty; + buttonOK.Enabled = true; + buttonDownload.Enabled = true; + buttonDownloadAll.Enabled = true; + comboBoxDictionaries.Enabled = true; + if (_testAllIndex >= 0) + { + DownloadNext(); + return; + } + MessageBox.Show(string.Format(Configuration.Settings.Language.GetDictionaries.XDownloaded, comboBoxDictionaries.Items[index])); + } + + private void ExtractDic(string dictionaryFolder, ZipExtractor zip, List dir, ref bool found) + { + foreach (ZipExtractor.ZipFileEntry entry in dir) + { + if (entry.FilenameInZip.EndsWith(".dic", StringComparison.OrdinalIgnoreCase) || entry.FilenameInZip.EndsWith(".aff", StringComparison.OrdinalIgnoreCase)) + { + string fileName = Path.GetFileName(entry.FilenameInZip); + + // French fix + if (fileName.StartsWith("fr-moderne", StringComparison.Ordinal)) + { + fileName = fileName.Replace("fr-moderne", "fr_FR"); + } + + // German fix + if (fileName.StartsWith("de_DE_frami", StringComparison.Ordinal)) + { + fileName = fileName.Replace("de_DE_frami", "de_DE"); + } + + // Russian fix + if (fileName.StartsWith("russian-aot", StringComparison.Ordinal)) + { + fileName = fileName.Replace("russian-aot", "ru_RU"); + } + + string path = Path.Combine(dictionaryFolder, fileName); + zip.ExtractFile(entry, path); + + found = true; + + LastDownload = fileName; + } + } + } + + private void comboBoxDictionaries_SelectedIndexChanged(object sender, EventArgs e) + { + int index = comboBoxDictionaries.SelectedIndex; + labelPleaseWait.Text = _descriptions[index]; + } + + private void buttonDownloadAll_Click(object sender, EventArgs e) + { + _testAllIndex = comboBoxDictionaries.SelectedIndex - 1; + if (_testAllIndex < -1) + { + _testAllIndex = -1; + } + + DownloadNext(); + } + + private void DownloadNext() + { + _testAllIndex++; + if (_testAllIndex < comboBoxDictionaries.Items.Count) + { + comboBoxDictionaries.SelectedIndex = _testAllIndex; + buttonDownload_Click(null, null); + } + else + { + LoadDictionaryList("Nikse.SubtitleEdit.Resources.HunspellBackupDictionaries.xml.gz"); + } + } + + } +} diff --git a/src/Forms/GetDictionaries.resx b/src/ui/Forms/GetDictionaries.resx similarity index 97% rename from src/Forms/GetDictionaries.resx rename to src/ui/Forms/GetDictionaries.resx index c7e0d4bdf..d58980a38 100644 --- a/src/Forms/GetDictionaries.resx +++ b/src/ui/Forms/GetDictionaries.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Forms/GoToLine.Designer.cs b/src/ui/Forms/GoToLine.Designer.cs similarity index 97% rename from src/Forms/GoToLine.Designer.cs rename to src/ui/Forms/GoToLine.Designer.cs index 51a8b7258..9b5930987 100644 --- a/src/Forms/GoToLine.Designer.cs +++ b/src/ui/Forms/GoToLine.Designer.cs @@ -1,90 +1,90 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class GoToLine - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(GoToLine)); - this.labelGoToLine = new System.Windows.Forms.Label(); - this.buttonOK = new System.Windows.Forms.Button(); - this.textBox1 = new System.Windows.Forms.TextBox(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.SuspendLayout(); - // - // labelGoToLine - // - resources.ApplyResources(this.labelGoToLine, "labelGoToLine"); - this.labelGoToLine.Name = "labelGoToLine"; - // - // buttonOK - // - resources.ApplyResources(this.buttonOK, "buttonOK"); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); - // - // textBox1 - // - resources.ApplyResources(this.textBox1, "textBox1"); - this.textBox1.Name = "textBox1"; - this.textBox1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBox1KeyDown); - // - // buttonCancel - // - resources.ApplyResources(this.buttonCancel, "buttonCancel"); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.ButtonCancelClick); - // - // GoToLine - // - resources.ApplyResources(this, "$this"); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.textBox1); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.labelGoToLine); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "GoToLine"; - this.ShowInTaskbar = false; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormGoToLine_KeyDown); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Label labelGoToLine; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.TextBox textBox1; - private System.Windows.Forms.Button buttonCancel; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class GoToLine + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(GoToLine)); + this.labelGoToLine = new System.Windows.Forms.Label(); + this.buttonOK = new System.Windows.Forms.Button(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // labelGoToLine + // + resources.ApplyResources(this.labelGoToLine, "labelGoToLine"); + this.labelGoToLine.Name = "labelGoToLine"; + // + // buttonOK + // + resources.ApplyResources(this.buttonOK, "buttonOK"); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); + // + // textBox1 + // + resources.ApplyResources(this.textBox1, "textBox1"); + this.textBox1.Name = "textBox1"; + this.textBox1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBox1KeyDown); + // + // buttonCancel + // + resources.ApplyResources(this.buttonCancel, "buttonCancel"); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.ButtonCancelClick); + // + // GoToLine + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.labelGoToLine); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "GoToLine"; + this.ShowInTaskbar = false; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormGoToLine_KeyDown); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label labelGoToLine; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.Button buttonCancel; + } } \ No newline at end of file diff --git a/src/Forms/GoToLine.cs b/src/ui/Forms/GoToLine.cs similarity index 97% rename from src/Forms/GoToLine.cs rename to src/ui/Forms/GoToLine.cs index bbcc11de3..41f631b0f 100644 --- a/src/Forms/GoToLine.cs +++ b/src/ui/Forms/GoToLine.cs @@ -1,108 +1,108 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class GoToLine : Form - { - private int _max; - private int _min; - private int _lineNumber; - - public GoToLine() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - Icon = Properties.Resources.SubtitleEditFormIcon; - Text = Configuration.Settings.Language.GoToLine.Title; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - UiUtil.FixLargeFonts(this, buttonOK); - } - - public int LineNumber => _lineNumber; - - public void Initialize(int min, int max) - { - _min = min; - _max = max; - labelGoToLine.Text = string.Format(Text + " ({0} - {1})", min, max); - } - - private void FormGoToLine_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - private void TextBox1KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Enter) - { - Validate(textBox1.Text); - } - else - { - if (e.KeyCode == Keys.D0 || - e.KeyCode == Keys.D1 || - e.KeyCode == Keys.D2 || - e.KeyCode == Keys.D3 || - e.KeyCode == Keys.D4 || - e.KeyCode == Keys.D5 || - e.KeyCode == Keys.D6 || - e.KeyCode == Keys.D7 || - e.KeyCode == Keys.D8 || - e.KeyCode == Keys.D9 || - e.KeyCode == Keys.Delete || - e.KeyCode == Keys.Left || - e.KeyCode == Keys.Right || - e.KeyCode == Keys.Back || - e.KeyCode == Keys.Home || - e.KeyCode == Keys.End || - e.KeyValue >= 96 && e.KeyValue <= 105) - { - } - else if (e.KeyData == (Keys.Control | Keys.V) && Clipboard.GetText(TextDataFormat.UnicodeText).Length > 0) - { - string p = Clipboard.GetText(TextDataFormat.UnicodeText); - if (!int.TryParse(p, out _)) - { - e.SuppressKeyPress = true; - } - } - else if (e.Modifiers != Keys.Control && e.Modifiers != Keys.Alt) - { - e.SuppressKeyPress = true; - } - } - } - - private void ButtonOkClick(object sender, EventArgs e) - { - Validate(textBox1.Text); - } - - private void ButtonCancelClick(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private void Validate(string inp) - { - if (int.TryParse(inp, out _lineNumber) && _lineNumber >= _min && _lineNumber <= _max) - { - DialogResult = DialogResult.OK; - } - else - { - MessageBox.Show(string.Format(Configuration.Settings.Language.GoToLine.XIsNotAValidNumber, textBox1.Text)); - } - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class GoToLine : Form + { + private int _max; + private int _min; + private int _lineNumber; + + public GoToLine() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + Icon = Properties.Resources.SubtitleEditFormIcon; + Text = Configuration.Settings.Language.GoToLine.Title; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + UiUtil.FixLargeFonts(this, buttonOK); + } + + public int LineNumber => _lineNumber; + + public void Initialize(int min, int max) + { + _min = min; + _max = max; + labelGoToLine.Text = string.Format(Text + " ({0} - {1})", min, max); + } + + private void FormGoToLine_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + private void TextBox1KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + Validate(textBox1.Text); + } + else + { + if (e.KeyCode == Keys.D0 || + e.KeyCode == Keys.D1 || + e.KeyCode == Keys.D2 || + e.KeyCode == Keys.D3 || + e.KeyCode == Keys.D4 || + e.KeyCode == Keys.D5 || + e.KeyCode == Keys.D6 || + e.KeyCode == Keys.D7 || + e.KeyCode == Keys.D8 || + e.KeyCode == Keys.D9 || + e.KeyCode == Keys.Delete || + e.KeyCode == Keys.Left || + e.KeyCode == Keys.Right || + e.KeyCode == Keys.Back || + e.KeyCode == Keys.Home || + e.KeyCode == Keys.End || + e.KeyValue >= 96 && e.KeyValue <= 105) + { + } + else if (e.KeyData == (Keys.Control | Keys.V) && Clipboard.GetText(TextDataFormat.UnicodeText).Length > 0) + { + string p = Clipboard.GetText(TextDataFormat.UnicodeText); + if (!int.TryParse(p, out _)) + { + e.SuppressKeyPress = true; + } + } + else if (e.Modifiers != Keys.Control && e.Modifiers != Keys.Alt) + { + e.SuppressKeyPress = true; + } + } + } + + private void ButtonOkClick(object sender, EventArgs e) + { + Validate(textBox1.Text); + } + + private void ButtonCancelClick(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void Validate(string inp) + { + if (int.TryParse(inp, out _lineNumber) && _lineNumber >= _min && _lineNumber <= _max) + { + DialogResult = DialogResult.OK; + } + else + { + MessageBox.Show(string.Format(Configuration.Settings.Language.GoToLine.XIsNotAValidNumber, textBox1.Text)); + } + } + } +} diff --git a/src/Forms/GoToLine.resx b/src/ui/Forms/GoToLine.resx similarity index 97% rename from src/Forms/GoToLine.resx rename to src/ui/Forms/GoToLine.resx index bc991d283..5d5fb3e73 100644 --- a/src/Forms/GoToLine.resx +++ b/src/ui/Forms/GoToLine.resx @@ -1,246 +1,246 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - True - - - - 12, 9 - - - 73, 13 - - - 0 - - - labelGoToLine - - - labelGoToLine - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 3 - - - 12, 52 - - - 75, 23 - - - 1 - - - &OK - - - buttonOK - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 2 - - - 15, 25 - - - 100, 21 - - - 0 - - - textBox1 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 1 - - - - NoControl - - - 93, 52 - - - 75, 23 - - - 2 - - - C&ancel - - - buttonCancel - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 0 - - - True - - - 6, 13 - - - 243, 88 - - - Tahoma, 8.25pt - - - CenterParent - - - Go to line - - - GoToLine - - - System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + True + + + + 12, 9 + + + 73, 13 + + + 0 + + + labelGoToLine + + + labelGoToLine + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + 12, 52 + + + 75, 23 + + + 1 + + + &OK + + + buttonOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + 15, 25 + + + 100, 21 + + + 0 + + + textBox1 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + + NoControl + + + 93, 52 + + + 75, 23 + + + 2 + + + C&ancel + + + buttonCancel + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + True + + + 6, 13 + + + 243, 88 + + + Tahoma, 8.25pt + + + CenterParent + + + Go to line + + + GoToLine + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Forms/GoogleOrMicrosoftTranslate.Designer.cs b/src/ui/Forms/GoogleOrMicrosoftTranslate.Designer.cs similarity index 97% rename from src/Forms/GoogleOrMicrosoftTranslate.Designer.cs rename to src/ui/Forms/GoogleOrMicrosoftTranslate.Designer.cs index c8b82d349..2421067d6 100644 --- a/src/Forms/GoogleOrMicrosoftTranslate.Designer.cs +++ b/src/ui/Forms/GoogleOrMicrosoftTranslate.Designer.cs @@ -1,202 +1,202 @@ -namespace Nikse.SubtitleEdit.Forms -{ - partial class GoogleOrMicrosoftTranslate - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.buttonMicrosoft = new System.Windows.Forms.Button(); - this.buttonGoogle = new System.Windows.Forms.Button(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.labelGoogleTranslate = new System.Windows.Forms.Label(); - this.labelMicrosoftTranslate = new System.Windows.Forms.Label(); - this.comboBoxFrom = new System.Windows.Forms.ComboBox(); - this.buttonTranslate = new System.Windows.Forms.Button(); - this.labelTo = new System.Windows.Forms.Label(); - this.comboBoxTo = new System.Windows.Forms.ComboBox(); - this.labelFrom = new System.Windows.Forms.Label(); - this.textBoxSourceText = new System.Windows.Forms.TextBox(); - this.labelSourceText = new System.Windows.Forms.Label(); - this.SuspendLayout(); - // - // buttonMicrosoft - // - this.buttonMicrosoft.Location = new System.Drawing.Point(322, 164); - this.buttonMicrosoft.Name = "buttonMicrosoft"; - this.buttonMicrosoft.Size = new System.Drawing.Size(304, 55); - this.buttonMicrosoft.TabIndex = 5; - this.buttonMicrosoft.UseVisualStyleBackColor = true; - this.buttonMicrosoft.Click += new System.EventHandler(this.buttonMicrosoft_Click); - // - // buttonGoogle - // - this.buttonGoogle.Location = new System.Drawing.Point(12, 164); - this.buttonGoogle.Name = "buttonGoogle"; - this.buttonGoogle.Size = new System.Drawing.Size(304, 55); - this.buttonGoogle.TabIndex = 4; - this.buttonGoogle.UseVisualStyleBackColor = true; - this.buttonGoogle.Click += new System.EventHandler(this.buttonGoogle_Click); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.Location = new System.Drawing.Point(551, 227); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 6; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - // - // labelGoogleTranslate - // - this.labelGoogleTranslate.AutoSize = true; - this.labelGoogleTranslate.Location = new System.Drawing.Point(14, 148); - this.labelGoogleTranslate.Name = "labelGoogleTranslate"; - this.labelGoogleTranslate.Size = new System.Drawing.Size(84, 13); - this.labelGoogleTranslate.TabIndex = 20; - this.labelGoogleTranslate.Text = "Google translate"; - // - // labelMicrosoftTranslate - // - this.labelMicrosoftTranslate.AutoSize = true; - this.labelMicrosoftTranslate.Location = new System.Drawing.Point(319, 148); - this.labelMicrosoftTranslate.Name = "labelMicrosoftTranslate"; - this.labelMicrosoftTranslate.Size = new System.Drawing.Size(93, 13); - this.labelMicrosoftTranslate.TabIndex = 21; - this.labelMicrosoftTranslate.Text = "Microsoft translate"; - // - // comboBoxFrom - // - this.comboBoxFrom.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxFrom.FormattingEnabled = true; - this.comboBoxFrom.Location = new System.Drawing.Point(256, 12); - this.comboBoxFrom.Name = "comboBoxFrom"; - this.comboBoxFrom.Size = new System.Drawing.Size(121, 21); - this.comboBoxFrom.TabIndex = 0; - // - // buttonTranslate - // - this.buttonTranslate.Location = new System.Drawing.Point(553, 12); - this.buttonTranslate.Name = "buttonTranslate"; - this.buttonTranslate.Size = new System.Drawing.Size(75, 23); - this.buttonTranslate.TabIndex = 2; - this.buttonTranslate.Text = "Translate"; - this.buttonTranslate.UseVisualStyleBackColor = true; - this.buttonTranslate.Click += new System.EventHandler(this.buttonTranslate_Click); - // - // labelTo - // - this.labelTo.AutoSize = true; - this.labelTo.Location = new System.Drawing.Point(397, 15); - this.labelTo.Name = "labelTo"; - this.labelTo.Size = new System.Drawing.Size(23, 13); - this.labelTo.TabIndex = 25; - this.labelTo.Text = "To:"; - // - // comboBoxTo - // - this.comboBoxTo.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxTo.FormattingEnabled = true; - this.comboBoxTo.Location = new System.Drawing.Point(426, 12); - this.comboBoxTo.Name = "comboBoxTo"; - this.comboBoxTo.Size = new System.Drawing.Size(121, 21); - this.comboBoxTo.TabIndex = 1; - // - // labelFrom - // - this.labelFrom.AutoSize = true; - this.labelFrom.Location = new System.Drawing.Point(214, 19); - this.labelFrom.Name = "labelFrom"; - this.labelFrom.Size = new System.Drawing.Size(33, 13); - this.labelFrom.TabIndex = 23; - this.labelFrom.Text = "From:"; - // - // textBoxSourceText - // - this.textBoxSourceText.Location = new System.Drawing.Point(17, 71); - this.textBoxSourceText.Multiline = true; - this.textBoxSourceText.Name = "textBoxSourceText"; - this.textBoxSourceText.Size = new System.Drawing.Size(299, 53); - this.textBoxSourceText.TabIndex = 3; - // - // labelSourceText - // - this.labelSourceText.AutoSize = true; - this.labelSourceText.Location = new System.Drawing.Point(14, 55); - this.labelSourceText.Name = "labelSourceText"; - this.labelSourceText.Size = new System.Drawing.Size(61, 13); - this.labelSourceText.TabIndex = 28; - this.labelSourceText.Text = "Source text"; - // - // GoogleOrMicrosoftTranslate - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(638, 260); - this.Controls.Add(this.labelSourceText); - this.Controls.Add(this.textBoxSourceText); - this.Controls.Add(this.comboBoxFrom); - this.Controls.Add(this.buttonTranslate); - this.Controls.Add(this.labelTo); - this.Controls.Add(this.comboBoxTo); - this.Controls.Add(this.labelFrom); - this.Controls.Add(this.labelMicrosoftTranslate); - this.Controls.Add(this.labelGoogleTranslate); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonGoogle); - this.Controls.Add(this.buttonMicrosoft); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "GoogleOrMicrosoftTranslate"; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "GoogleOrMicrosoftTranslate"; - this.Shown += new System.EventHandler(this.GoogleOrMicrosoftTranslate_Shown); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.GoogleOrMicrosoftTranslate_KeyDown); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button buttonMicrosoft; - private System.Windows.Forms.Button buttonGoogle; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Label labelGoogleTranslate; - private System.Windows.Forms.Label labelMicrosoftTranslate; - private System.Windows.Forms.ComboBox comboBoxFrom; - private System.Windows.Forms.Button buttonTranslate; - private System.Windows.Forms.Label labelTo; - private System.Windows.Forms.ComboBox comboBoxTo; - private System.Windows.Forms.Label labelFrom; - private System.Windows.Forms.TextBox textBoxSourceText; - private System.Windows.Forms.Label labelSourceText; - } +namespace Nikse.SubtitleEdit.Forms +{ + partial class GoogleOrMicrosoftTranslate + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.buttonMicrosoft = new System.Windows.Forms.Button(); + this.buttonGoogle = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.labelGoogleTranslate = new System.Windows.Forms.Label(); + this.labelMicrosoftTranslate = new System.Windows.Forms.Label(); + this.comboBoxFrom = new System.Windows.Forms.ComboBox(); + this.buttonTranslate = new System.Windows.Forms.Button(); + this.labelTo = new System.Windows.Forms.Label(); + this.comboBoxTo = new System.Windows.Forms.ComboBox(); + this.labelFrom = new System.Windows.Forms.Label(); + this.textBoxSourceText = new System.Windows.Forms.TextBox(); + this.labelSourceText = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // buttonMicrosoft + // + this.buttonMicrosoft.Location = new System.Drawing.Point(322, 164); + this.buttonMicrosoft.Name = "buttonMicrosoft"; + this.buttonMicrosoft.Size = new System.Drawing.Size(304, 55); + this.buttonMicrosoft.TabIndex = 5; + this.buttonMicrosoft.UseVisualStyleBackColor = true; + this.buttonMicrosoft.Click += new System.EventHandler(this.buttonMicrosoft_Click); + // + // buttonGoogle + // + this.buttonGoogle.Location = new System.Drawing.Point(12, 164); + this.buttonGoogle.Name = "buttonGoogle"; + this.buttonGoogle.Size = new System.Drawing.Size(304, 55); + this.buttonGoogle.TabIndex = 4; + this.buttonGoogle.UseVisualStyleBackColor = true; + this.buttonGoogle.Click += new System.EventHandler(this.buttonGoogle_Click); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.Location = new System.Drawing.Point(551, 227); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 6; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + // + // labelGoogleTranslate + // + this.labelGoogleTranslate.AutoSize = true; + this.labelGoogleTranslate.Location = new System.Drawing.Point(14, 148); + this.labelGoogleTranslate.Name = "labelGoogleTranslate"; + this.labelGoogleTranslate.Size = new System.Drawing.Size(84, 13); + this.labelGoogleTranslate.TabIndex = 20; + this.labelGoogleTranslate.Text = "Google translate"; + // + // labelMicrosoftTranslate + // + this.labelMicrosoftTranslate.AutoSize = true; + this.labelMicrosoftTranslate.Location = new System.Drawing.Point(319, 148); + this.labelMicrosoftTranslate.Name = "labelMicrosoftTranslate"; + this.labelMicrosoftTranslate.Size = new System.Drawing.Size(93, 13); + this.labelMicrosoftTranslate.TabIndex = 21; + this.labelMicrosoftTranslate.Text = "Microsoft translate"; + // + // comboBoxFrom + // + this.comboBoxFrom.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxFrom.FormattingEnabled = true; + this.comboBoxFrom.Location = new System.Drawing.Point(256, 12); + this.comboBoxFrom.Name = "comboBoxFrom"; + this.comboBoxFrom.Size = new System.Drawing.Size(121, 21); + this.comboBoxFrom.TabIndex = 0; + // + // buttonTranslate + // + this.buttonTranslate.Location = new System.Drawing.Point(553, 12); + this.buttonTranslate.Name = "buttonTranslate"; + this.buttonTranslate.Size = new System.Drawing.Size(75, 23); + this.buttonTranslate.TabIndex = 2; + this.buttonTranslate.Text = "Translate"; + this.buttonTranslate.UseVisualStyleBackColor = true; + this.buttonTranslate.Click += new System.EventHandler(this.buttonTranslate_Click); + // + // labelTo + // + this.labelTo.AutoSize = true; + this.labelTo.Location = new System.Drawing.Point(397, 15); + this.labelTo.Name = "labelTo"; + this.labelTo.Size = new System.Drawing.Size(23, 13); + this.labelTo.TabIndex = 25; + this.labelTo.Text = "To:"; + // + // comboBoxTo + // + this.comboBoxTo.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxTo.FormattingEnabled = true; + this.comboBoxTo.Location = new System.Drawing.Point(426, 12); + this.comboBoxTo.Name = "comboBoxTo"; + this.comboBoxTo.Size = new System.Drawing.Size(121, 21); + this.comboBoxTo.TabIndex = 1; + // + // labelFrom + // + this.labelFrom.AutoSize = true; + this.labelFrom.Location = new System.Drawing.Point(214, 19); + this.labelFrom.Name = "labelFrom"; + this.labelFrom.Size = new System.Drawing.Size(33, 13); + this.labelFrom.TabIndex = 23; + this.labelFrom.Text = "From:"; + // + // textBoxSourceText + // + this.textBoxSourceText.Location = new System.Drawing.Point(17, 71); + this.textBoxSourceText.Multiline = true; + this.textBoxSourceText.Name = "textBoxSourceText"; + this.textBoxSourceText.Size = new System.Drawing.Size(299, 53); + this.textBoxSourceText.TabIndex = 3; + // + // labelSourceText + // + this.labelSourceText.AutoSize = true; + this.labelSourceText.Location = new System.Drawing.Point(14, 55); + this.labelSourceText.Name = "labelSourceText"; + this.labelSourceText.Size = new System.Drawing.Size(61, 13); + this.labelSourceText.TabIndex = 28; + this.labelSourceText.Text = "Source text"; + // + // GoogleOrMicrosoftTranslate + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(638, 260); + this.Controls.Add(this.labelSourceText); + this.Controls.Add(this.textBoxSourceText); + this.Controls.Add(this.comboBoxFrom); + this.Controls.Add(this.buttonTranslate); + this.Controls.Add(this.labelTo); + this.Controls.Add(this.comboBoxTo); + this.Controls.Add(this.labelFrom); + this.Controls.Add(this.labelMicrosoftTranslate); + this.Controls.Add(this.labelGoogleTranslate); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonGoogle); + this.Controls.Add(this.buttonMicrosoft); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "GoogleOrMicrosoftTranslate"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "GoogleOrMicrosoftTranslate"; + this.Shown += new System.EventHandler(this.GoogleOrMicrosoftTranslate_Shown); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.GoogleOrMicrosoftTranslate_KeyDown); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonMicrosoft; + private System.Windows.Forms.Button buttonGoogle; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Label labelGoogleTranslate; + private System.Windows.Forms.Label labelMicrosoftTranslate; + private System.Windows.Forms.ComboBox comboBoxFrom; + private System.Windows.Forms.Button buttonTranslate; + private System.Windows.Forms.Label labelTo; + private System.Windows.Forms.ComboBox comboBoxTo; + private System.Windows.Forms.Label labelFrom; + private System.Windows.Forms.TextBox textBoxSourceText; + private System.Windows.Forms.Label labelSourceText; + } } \ No newline at end of file diff --git a/src/Forms/GoogleOrMicrosoftTranslate.cs b/src/ui/Forms/GoogleOrMicrosoftTranslate.cs similarity index 97% rename from src/Forms/GoogleOrMicrosoftTranslate.cs rename to src/ui/Forms/GoogleOrMicrosoftTranslate.cs index 430447352..62381a93e 100644 --- a/src/Forms/GoogleOrMicrosoftTranslate.cs +++ b/src/ui/Forms/GoogleOrMicrosoftTranslate.cs @@ -1,176 +1,176 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; -using Nikse.SubtitleEdit.Core.Translate; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class GoogleOrMicrosoftTranslate : Form - { - public string TranslatedText { get; set; } - - public GoogleOrMicrosoftTranslate() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - using (var gt = new GoogleTranslate()) - { - gt.FillComboWithGoogleLanguages(comboBoxFrom); - gt.FillComboWithGoogleLanguages(comboBoxTo); - } - RemovedLanguagesNotInMicrosoftTranslate(comboBoxFrom); - RemovedLanguagesNotInMicrosoftTranslate(comboBoxTo); - - Text = Configuration.Settings.Language.GoogleOrMicrosoftTranslate.Title; - labelGoogleTranslate.Text = Configuration.Settings.Language.GoogleOrMicrosoftTranslate.GoogleTranslate; - labelMicrosoftTranslate.Text = Configuration.Settings.Language.GoogleOrMicrosoftTranslate.MicrosoftTranslate; - labelFrom.Text = Configuration.Settings.Language.GoogleOrMicrosoftTranslate.From; - labelTo.Text = Configuration.Settings.Language.GoogleOrMicrosoftTranslate.To; - labelSourceText.Text = Configuration.Settings.Language.GoogleOrMicrosoftTranslate.SourceText; - buttonGoogle.Text = Configuration.Settings.Language.GoogleOrMicrosoftTranslate.GoogleTranslate; - buttonMicrosoft.Text = Configuration.Settings.Language.GoogleOrMicrosoftTranslate.MicrosoftTranslate; - buttonTranslate.Text = Configuration.Settings.Language.GoogleOrMicrosoftTranslate.Translate; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - UiUtil.FixLargeFonts(this, buttonCancel); - buttonGoogle.Text = string.Empty; - buttonMicrosoft.Text = string.Empty; - } - - private static void RemovedLanguagesNotInMicrosoftTranslate(ComboBox comboBox) - { - for (int i = comboBox.Items.Count - 1; i > 0; i--) - { - var item = (GoogleTranslate.ComboBoxItem)comboBox.Items[i]; - if (item.Value != FixMsLocale(item.Value)) - { - comboBox.Items.RemoveAt(i); - } - } - } - - internal void InitializeFromLanguage(string defaultFromLanguage) - { - string defaultToLanguage = Configuration.Settings.Tools.GoogleTranslateLastTargetLanguage; - if (defaultToLanguage == defaultFromLanguage) - { - foreach (string s in Utilities.GetDictionaryLanguages()) - { - string temp = s.Replace("[", string.Empty).Replace("]", string.Empty); - if (temp.Length > 4) - { - temp = temp.Substring(temp.Length - 5, 2).ToLowerInvariant(); - - if (temp != defaultToLanguage) - { - defaultToLanguage = temp; - break; - } - } - } - } - - int i = 0; - comboBoxFrom.SelectedIndex = 0; - foreach (GoogleTranslate.ComboBoxItem item in comboBoxFrom.Items) - { - if (item.Value == defaultFromLanguage) - { - comboBoxFrom.SelectedIndex = i; - break; - } - i++; - } - - i = 0; - comboBoxTo.SelectedIndex = 0; - foreach (GoogleTranslate.ComboBoxItem item in comboBoxTo.Items) - { - if (item.Value == defaultToLanguage) - { - comboBoxTo.SelectedIndex = i; - break; - } - i++; - } - } - - internal void Initialize(Paragraph paragraph) - { - textBoxSourceText.Text = paragraph.Text; - } - - private void GoogleOrMicrosoftTranslate_Shown(object sender, EventArgs e) - { - Refresh(); - Translate(); - } - - private void Translate() - { - Cursor = Cursors.WaitCursor; - try - { - string from = ((GoogleTranslate.ComboBoxItem)comboBoxFrom.SelectedItem).Value; - string to = ((GoogleTranslate.ComboBoxItem)comboBoxTo.SelectedItem).Value; - buttonGoogle.Text = string.Empty; - - // google translate - buttonGoogle.Text = new GoogleTranslator1().Translate(from, to, new List { new Paragraph { Text = textBoxSourceText.Text } }, new StringBuilder()).FirstOrDefault(); - - // ms translator - if (!string.IsNullOrEmpty(Configuration.Settings.Tools.MicrosoftTranslatorApiKey) && !string.IsNullOrEmpty(Configuration.Settings.Tools.MicrosoftTranslatorTokenEndpoint)) - { - var translator = new MicrosoftTranslator(Configuration.Settings.Tools.MicrosoftTranslatorApiKey, Configuration.Settings.Tools.MicrosoftTranslatorTokenEndpoint, Configuration.Settings.Tools.MicrosoftTranslatorCategory); - var result = translator.Translate(from, to, new List { new Paragraph { Text = textBoxSourceText.Text } }, new StringBuilder()); - buttonMicrosoft.Text = result[0]; - } - } - finally - { - Cursor = Cursors.Default; - } - } - - private static string FixMsLocale(string from) - { - if ("ar bg zh-CHS zh-CHT cs da nl en et fi fr de el ht he hu id it ja ko lv lt no pl pt ro ru sk sl es sv th tr uk vi".Contains(from)) - { - return from; - } - - return "en"; - } - - private void buttonTranslate_Click(object sender, EventArgs e) - { - Translate(); - } - - private void buttonGoogle_Click(object sender, EventArgs e) - { - TranslatedText = buttonGoogle.Text; - DialogResult = DialogResult.OK; - } - - private void buttonMicrosoft_Click(object sender, EventArgs e) - { - TranslatedText = buttonMicrosoft.Text; - DialogResult = DialogResult.OK; - } - - private void GoogleOrMicrosoftTranslate_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Translate; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class GoogleOrMicrosoftTranslate : Form + { + public string TranslatedText { get; set; } + + public GoogleOrMicrosoftTranslate() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + using (var gt = new GoogleTranslate()) + { + gt.FillComboWithGoogleLanguages(comboBoxFrom); + gt.FillComboWithGoogleLanguages(comboBoxTo); + } + RemovedLanguagesNotInMicrosoftTranslate(comboBoxFrom); + RemovedLanguagesNotInMicrosoftTranslate(comboBoxTo); + + Text = Configuration.Settings.Language.GoogleOrMicrosoftTranslate.Title; + labelGoogleTranslate.Text = Configuration.Settings.Language.GoogleOrMicrosoftTranslate.GoogleTranslate; + labelMicrosoftTranslate.Text = Configuration.Settings.Language.GoogleOrMicrosoftTranslate.MicrosoftTranslate; + labelFrom.Text = Configuration.Settings.Language.GoogleOrMicrosoftTranslate.From; + labelTo.Text = Configuration.Settings.Language.GoogleOrMicrosoftTranslate.To; + labelSourceText.Text = Configuration.Settings.Language.GoogleOrMicrosoftTranslate.SourceText; + buttonGoogle.Text = Configuration.Settings.Language.GoogleOrMicrosoftTranslate.GoogleTranslate; + buttonMicrosoft.Text = Configuration.Settings.Language.GoogleOrMicrosoftTranslate.MicrosoftTranslate; + buttonTranslate.Text = Configuration.Settings.Language.GoogleOrMicrosoftTranslate.Translate; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + UiUtil.FixLargeFonts(this, buttonCancel); + buttonGoogle.Text = string.Empty; + buttonMicrosoft.Text = string.Empty; + } + + private static void RemovedLanguagesNotInMicrosoftTranslate(ComboBox comboBox) + { + for (int i = comboBox.Items.Count - 1; i > 0; i--) + { + var item = (GoogleTranslate.ComboBoxItem)comboBox.Items[i]; + if (item.Value != FixMsLocale(item.Value)) + { + comboBox.Items.RemoveAt(i); + } + } + } + + internal void InitializeFromLanguage(string defaultFromLanguage) + { + string defaultToLanguage = Configuration.Settings.Tools.GoogleTranslateLastTargetLanguage; + if (defaultToLanguage == defaultFromLanguage) + { + foreach (string s in Utilities.GetDictionaryLanguages()) + { + string temp = s.Replace("[", string.Empty).Replace("]", string.Empty); + if (temp.Length > 4) + { + temp = temp.Substring(temp.Length - 5, 2).ToLowerInvariant(); + + if (temp != defaultToLanguage) + { + defaultToLanguage = temp; + break; + } + } + } + } + + int i = 0; + comboBoxFrom.SelectedIndex = 0; + foreach (GoogleTranslate.ComboBoxItem item in comboBoxFrom.Items) + { + if (item.Value == defaultFromLanguage) + { + comboBoxFrom.SelectedIndex = i; + break; + } + i++; + } + + i = 0; + comboBoxTo.SelectedIndex = 0; + foreach (GoogleTranslate.ComboBoxItem item in comboBoxTo.Items) + { + if (item.Value == defaultToLanguage) + { + comboBoxTo.SelectedIndex = i; + break; + } + i++; + } + } + + internal void Initialize(Paragraph paragraph) + { + textBoxSourceText.Text = paragraph.Text; + } + + private void GoogleOrMicrosoftTranslate_Shown(object sender, EventArgs e) + { + Refresh(); + Translate(); + } + + private void Translate() + { + Cursor = Cursors.WaitCursor; + try + { + string from = ((GoogleTranslate.ComboBoxItem)comboBoxFrom.SelectedItem).Value; + string to = ((GoogleTranslate.ComboBoxItem)comboBoxTo.SelectedItem).Value; + buttonGoogle.Text = string.Empty; + + // google translate + buttonGoogle.Text = new GoogleTranslator1().Translate(from, to, new List { new Paragraph { Text = textBoxSourceText.Text } }, new StringBuilder()).FirstOrDefault(); + + // ms translator + if (!string.IsNullOrEmpty(Configuration.Settings.Tools.MicrosoftTranslatorApiKey) && !string.IsNullOrEmpty(Configuration.Settings.Tools.MicrosoftTranslatorTokenEndpoint)) + { + var translator = new MicrosoftTranslator(Configuration.Settings.Tools.MicrosoftTranslatorApiKey, Configuration.Settings.Tools.MicrosoftTranslatorTokenEndpoint, Configuration.Settings.Tools.MicrosoftTranslatorCategory); + var result = translator.Translate(from, to, new List { new Paragraph { Text = textBoxSourceText.Text } }, new StringBuilder()); + buttonMicrosoft.Text = result[0]; + } + } + finally + { + Cursor = Cursors.Default; + } + } + + private static string FixMsLocale(string from) + { + if ("ar bg zh-CHS zh-CHT cs da nl en et fi fr de el ht he hu id it ja ko lv lt no pl pt ro ru sk sl es sv th tr uk vi".Contains(from)) + { + return from; + } + + return "en"; + } + + private void buttonTranslate_Click(object sender, EventArgs e) + { + Translate(); + } + + private void buttonGoogle_Click(object sender, EventArgs e) + { + TranslatedText = buttonGoogle.Text; + DialogResult = DialogResult.OK; + } + + private void buttonMicrosoft_Click(object sender, EventArgs e) + { + TranslatedText = buttonMicrosoft.Text; + DialogResult = DialogResult.OK; + } + + private void GoogleOrMicrosoftTranslate_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + } +} diff --git a/src/Forms/Ocr/DownloadTesseract4.resx b/src/ui/Forms/GoogleOrMicrosoftTranslate.resx similarity index 100% rename from src/Forms/Ocr/DownloadTesseract4.resx rename to src/ui/Forms/GoogleOrMicrosoftTranslate.resx diff --git a/src/Forms/GoogleTranslate.Designer.cs b/src/ui/Forms/GoogleTranslate.Designer.cs similarity index 98% rename from src/Forms/GoogleTranslate.Designer.cs rename to src/ui/Forms/GoogleTranslate.Designer.cs index 0e134f6f0..9452b3305 100644 --- a/src/Forms/GoogleTranslate.Designer.cs +++ b/src/ui/Forms/GoogleTranslate.Designer.cs @@ -1,251 +1,251 @@ -using Nikse.SubtitleEdit.Controls; - -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class GoogleTranslate - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.comboBoxFrom = new System.Windows.Forms.ComboBox(); - this.labelFrom = new System.Windows.Forms.Label(); - this.labelTo = new System.Windows.Forms.Label(); - this.comboBoxTo = new System.Windows.Forms.ComboBox(); - this.buttonTranslate = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.linkLabelPoweredByGoogleTranslate = new System.Windows.Forms.LinkLabel(); - this.labelPleaseWait = new System.Windows.Forms.Label(); - this.progressBar1 = new System.Windows.Forms.ProgressBar(); - this.subtitleListViewTo = new Nikse.SubtitleEdit.Controls.SubtitleListView(); - this.subtitleListViewFrom = new Nikse.SubtitleEdit.Controls.SubtitleListView(); - this.labelApiKeyNotFound = new System.Windows.Forms.Label(); - this.SuspendLayout(); - // - // comboBoxFrom - // - this.comboBoxFrom.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxFrom.FormattingEnabled = true; - this.comboBoxFrom.Location = new System.Drawing.Point(327, 34); - this.comboBoxFrom.Name = "comboBoxFrom"; - this.comboBoxFrom.Size = new System.Drawing.Size(121, 21); - this.comboBoxFrom.TabIndex = 0; - // - // labelFrom - // - this.labelFrom.AutoSize = true; - this.labelFrom.Location = new System.Drawing.Point(285, 41); - this.labelFrom.Name = "labelFrom"; - this.labelFrom.Size = new System.Drawing.Size(35, 13); - this.labelFrom.TabIndex = 1; - this.labelFrom.Text = "From:"; - // - // labelTo - // - this.labelTo.AutoSize = true; - this.labelTo.Location = new System.Drawing.Point(468, 37); - this.labelTo.Name = "labelTo"; - this.labelTo.Size = new System.Drawing.Size(23, 13); - this.labelTo.TabIndex = 4; - this.labelTo.Text = "To:"; - // - // comboBoxTo - // - this.comboBoxTo.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxTo.FormattingEnabled = true; - this.comboBoxTo.Location = new System.Drawing.Point(497, 34); - this.comboBoxTo.Name = "comboBoxTo"; - this.comboBoxTo.Size = new System.Drawing.Size(121, 21); - this.comboBoxTo.TabIndex = 3; - // - // buttonTranslate - // - this.buttonTranslate.Location = new System.Drawing.Point(624, 34); - this.buttonTranslate.Name = "buttonTranslate"; - this.buttonTranslate.Size = new System.Drawing.Size(75, 23); - this.buttonTranslate.TabIndex = 5; - this.buttonTranslate.Text = "Translate"; - this.buttonTranslate.UseVisualStyleBackColor = true; - this.buttonTranslate.Click += new System.EventHandler(this.buttonTranslate_Click); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.Location = new System.Drawing.Point(754, 529); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 6; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.Location = new System.Drawing.Point(835, 529); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 7; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - // - // linkLabelPoweredByGoogleTranslate - // - this.linkLabelPoweredByGoogleTranslate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.linkLabelPoweredByGoogleTranslate.AutoSize = true; - this.linkLabelPoweredByGoogleTranslate.Location = new System.Drawing.Point(15, 529); - this.linkLabelPoweredByGoogleTranslate.Name = "linkLabelPoweredByGoogleTranslate"; - this.linkLabelPoweredByGoogleTranslate.Size = new System.Drawing.Size(146, 13); - this.linkLabelPoweredByGoogleTranslate.TabIndex = 8; - this.linkLabelPoweredByGoogleTranslate.TabStop = true; - this.linkLabelPoweredByGoogleTranslate.Text = "Powered by Google translate"; - this.linkLabelPoweredByGoogleTranslate.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabel1LinkClicked); - // - // labelPleaseWait - // - this.labelPleaseWait.AutoSize = true; - this.labelPleaseWait.Location = new System.Drawing.Point(703, 23); - this.labelPleaseWait.Name = "labelPleaseWait"; - this.labelPleaseWait.Size = new System.Drawing.Size(176, 13); - this.labelPleaseWait.TabIndex = 10; - this.labelPleaseWait.Text = "Please wait... this may take a while"; - // - // progressBar1 - // - this.progressBar1.Location = new System.Drawing.Point(705, 39); - this.progressBar1.Name = "progressBar1"; - this.progressBar1.Size = new System.Drawing.Size(192, 16); - this.progressBar1.TabIndex = 11; - // - // subtitleListViewTo - // - this.subtitleListViewTo.AllowColumnReorder = true; - this.subtitleListViewTo.FirstVisibleIndex = -1; - this.subtitleListViewTo.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.subtitleListViewTo.FullRowSelect = true; - this.subtitleListViewTo.GridLines = true; - this.subtitleListViewTo.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; - this.subtitleListViewTo.HideSelection = false; - this.subtitleListViewTo.Location = new System.Drawing.Point(471, 64); - this.subtitleListViewTo.Name = "subtitleListViewTo"; - this.subtitleListViewTo.OwnerDraw = true; - this.subtitleListViewTo.Size = new System.Drawing.Size(428, 459); - this.subtitleListViewTo.SubtitleFontBold = false; - this.subtitleListViewTo.SubtitleFontName = "Tahoma"; - this.subtitleListViewTo.SubtitleFontSize = 8; - this.subtitleListViewTo.TabIndex = 2; - this.subtitleListViewTo.UseCompatibleStateImageBehavior = false; - this.subtitleListViewTo.UseSyntaxColoring = true; - this.subtitleListViewTo.View = System.Windows.Forms.View.Details; - this.subtitleListViewTo.Click += new System.EventHandler(this.subtitleListViewTo_DoubleClick); - this.subtitleListViewTo.DoubleClick += new System.EventHandler(this.subtitleListViewTo_DoubleClick); - // - // subtitleListViewFrom - // - this.subtitleListViewFrom.AllowColumnReorder = true; - this.subtitleListViewFrom.FirstVisibleIndex = -1; - this.subtitleListViewFrom.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.subtitleListViewFrom.FullRowSelect = true; - this.subtitleListViewFrom.GridLines = true; - this.subtitleListViewFrom.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; - this.subtitleListViewFrom.HideSelection = false; - this.subtitleListViewFrom.Location = new System.Drawing.Point(18, 64); - this.subtitleListViewFrom.Name = "subtitleListViewFrom"; - this.subtitleListViewFrom.OwnerDraw = true; - this.subtitleListViewFrom.Size = new System.Drawing.Size(430, 459); - this.subtitleListViewFrom.SubtitleFontBold = false; - this.subtitleListViewFrom.SubtitleFontName = "Tahoma"; - this.subtitleListViewFrom.SubtitleFontSize = 8; - this.subtitleListViewFrom.TabIndex = 0; - this.subtitleListViewFrom.UseCompatibleStateImageBehavior = false; - this.subtitleListViewFrom.UseSyntaxColoring = true; - this.subtitleListViewFrom.View = System.Windows.Forms.View.Details; - this.subtitleListViewFrom.Click += new System.EventHandler(this.subtitleListViewFrom_DoubleClick); - this.subtitleListViewFrom.DoubleClick += new System.EventHandler(this.subtitleListViewFrom_DoubleClick); - // - // labelApiKeyNotFound - // - this.labelApiKeyNotFound.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelApiKeyNotFound.AutoSize = true; - this.labelApiKeyNotFound.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0))))); - this.labelApiKeyNotFound.Location = new System.Drawing.Point(202, 529); - this.labelApiKeyNotFound.Name = "labelApiKeyNotFound"; - this.labelApiKeyNotFound.Size = new System.Drawing.Size(145, 13); - this.labelApiKeyNotFound.TabIndex = 12; - this.labelApiKeyNotFound.Text = "Warning: API key not found!"; - // - // GoogleTranslate - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(925, 558); - this.Controls.Add(this.labelApiKeyNotFound); - this.Controls.Add(this.comboBoxFrom); - this.Controls.Add(this.progressBar1); - this.Controls.Add(this.labelPleaseWait); - this.Controls.Add(this.linkLabelPoweredByGoogleTranslate); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.buttonTranslate); - this.Controls.Add(this.labelTo); - this.Controls.Add(this.comboBoxTo); - this.Controls.Add(this.subtitleListViewTo); - this.Controls.Add(this.subtitleListViewFrom); - this.Controls.Add(this.labelFrom); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.KeyPreview = true; - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(900, 500); - this.Name = "GoogleTranslate"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Google translate"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormGoogleTranslate_KeyDown); - this.Resize += new System.EventHandler(this.GoogleTranslate_Resize); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.ComboBox comboBoxFrom; - private System.Windows.Forms.Label labelFrom; - private SubtitleListView subtitleListViewFrom; - private SubtitleListView subtitleListViewTo; - private System.Windows.Forms.Label labelTo; - private System.Windows.Forms.ComboBox comboBoxTo; - private System.Windows.Forms.Button buttonTranslate; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.LinkLabel linkLabelPoweredByGoogleTranslate; - private System.Windows.Forms.Label labelPleaseWait; - private System.Windows.Forms.ProgressBar progressBar1; - private System.Windows.Forms.Label labelApiKeyNotFound; - } +using Nikse.SubtitleEdit.Controls; + +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class GoogleTranslate + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.comboBoxFrom = new System.Windows.Forms.ComboBox(); + this.labelFrom = new System.Windows.Forms.Label(); + this.labelTo = new System.Windows.Forms.Label(); + this.comboBoxTo = new System.Windows.Forms.ComboBox(); + this.buttonTranslate = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.linkLabelPoweredByGoogleTranslate = new System.Windows.Forms.LinkLabel(); + this.labelPleaseWait = new System.Windows.Forms.Label(); + this.progressBar1 = new System.Windows.Forms.ProgressBar(); + this.subtitleListViewTo = new Nikse.SubtitleEdit.Controls.SubtitleListView(); + this.subtitleListViewFrom = new Nikse.SubtitleEdit.Controls.SubtitleListView(); + this.labelApiKeyNotFound = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // comboBoxFrom + // + this.comboBoxFrom.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxFrom.FormattingEnabled = true; + this.comboBoxFrom.Location = new System.Drawing.Point(327, 34); + this.comboBoxFrom.Name = "comboBoxFrom"; + this.comboBoxFrom.Size = new System.Drawing.Size(121, 21); + this.comboBoxFrom.TabIndex = 0; + // + // labelFrom + // + this.labelFrom.AutoSize = true; + this.labelFrom.Location = new System.Drawing.Point(285, 41); + this.labelFrom.Name = "labelFrom"; + this.labelFrom.Size = new System.Drawing.Size(35, 13); + this.labelFrom.TabIndex = 1; + this.labelFrom.Text = "From:"; + // + // labelTo + // + this.labelTo.AutoSize = true; + this.labelTo.Location = new System.Drawing.Point(468, 37); + this.labelTo.Name = "labelTo"; + this.labelTo.Size = new System.Drawing.Size(23, 13); + this.labelTo.TabIndex = 4; + this.labelTo.Text = "To:"; + // + // comboBoxTo + // + this.comboBoxTo.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxTo.FormattingEnabled = true; + this.comboBoxTo.Location = new System.Drawing.Point(497, 34); + this.comboBoxTo.Name = "comboBoxTo"; + this.comboBoxTo.Size = new System.Drawing.Size(121, 21); + this.comboBoxTo.TabIndex = 3; + // + // buttonTranslate + // + this.buttonTranslate.Location = new System.Drawing.Point(624, 34); + this.buttonTranslate.Name = "buttonTranslate"; + this.buttonTranslate.Size = new System.Drawing.Size(75, 23); + this.buttonTranslate.TabIndex = 5; + this.buttonTranslate.Text = "Translate"; + this.buttonTranslate.UseVisualStyleBackColor = true; + this.buttonTranslate.Click += new System.EventHandler(this.buttonTranslate_Click); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.Location = new System.Drawing.Point(754, 529); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 6; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.Location = new System.Drawing.Point(835, 529); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 7; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + // + // linkLabelPoweredByGoogleTranslate + // + this.linkLabelPoweredByGoogleTranslate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.linkLabelPoweredByGoogleTranslate.AutoSize = true; + this.linkLabelPoweredByGoogleTranslate.Location = new System.Drawing.Point(15, 529); + this.linkLabelPoweredByGoogleTranslate.Name = "linkLabelPoweredByGoogleTranslate"; + this.linkLabelPoweredByGoogleTranslate.Size = new System.Drawing.Size(146, 13); + this.linkLabelPoweredByGoogleTranslate.TabIndex = 8; + this.linkLabelPoweredByGoogleTranslate.TabStop = true; + this.linkLabelPoweredByGoogleTranslate.Text = "Powered by Google translate"; + this.linkLabelPoweredByGoogleTranslate.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabel1LinkClicked); + // + // labelPleaseWait + // + this.labelPleaseWait.AutoSize = true; + this.labelPleaseWait.Location = new System.Drawing.Point(703, 23); + this.labelPleaseWait.Name = "labelPleaseWait"; + this.labelPleaseWait.Size = new System.Drawing.Size(176, 13); + this.labelPleaseWait.TabIndex = 10; + this.labelPleaseWait.Text = "Please wait... this may take a while"; + // + // progressBar1 + // + this.progressBar1.Location = new System.Drawing.Point(705, 39); + this.progressBar1.Name = "progressBar1"; + this.progressBar1.Size = new System.Drawing.Size(192, 16); + this.progressBar1.TabIndex = 11; + // + // subtitleListViewTo + // + this.subtitleListViewTo.AllowColumnReorder = true; + this.subtitleListViewTo.FirstVisibleIndex = -1; + this.subtitleListViewTo.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.subtitleListViewTo.FullRowSelect = true; + this.subtitleListViewTo.GridLines = true; + this.subtitleListViewTo.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.subtitleListViewTo.HideSelection = false; + this.subtitleListViewTo.Location = new System.Drawing.Point(471, 64); + this.subtitleListViewTo.Name = "subtitleListViewTo"; + this.subtitleListViewTo.OwnerDraw = true; + this.subtitleListViewTo.Size = new System.Drawing.Size(428, 459); + this.subtitleListViewTo.SubtitleFontBold = false; + this.subtitleListViewTo.SubtitleFontName = "Tahoma"; + this.subtitleListViewTo.SubtitleFontSize = 8; + this.subtitleListViewTo.TabIndex = 2; + this.subtitleListViewTo.UseCompatibleStateImageBehavior = false; + this.subtitleListViewTo.UseSyntaxColoring = true; + this.subtitleListViewTo.View = System.Windows.Forms.View.Details; + this.subtitleListViewTo.Click += new System.EventHandler(this.subtitleListViewTo_DoubleClick); + this.subtitleListViewTo.DoubleClick += new System.EventHandler(this.subtitleListViewTo_DoubleClick); + // + // subtitleListViewFrom + // + this.subtitleListViewFrom.AllowColumnReorder = true; + this.subtitleListViewFrom.FirstVisibleIndex = -1; + this.subtitleListViewFrom.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.subtitleListViewFrom.FullRowSelect = true; + this.subtitleListViewFrom.GridLines = true; + this.subtitleListViewFrom.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.subtitleListViewFrom.HideSelection = false; + this.subtitleListViewFrom.Location = new System.Drawing.Point(18, 64); + this.subtitleListViewFrom.Name = "subtitleListViewFrom"; + this.subtitleListViewFrom.OwnerDraw = true; + this.subtitleListViewFrom.Size = new System.Drawing.Size(430, 459); + this.subtitleListViewFrom.SubtitleFontBold = false; + this.subtitleListViewFrom.SubtitleFontName = "Tahoma"; + this.subtitleListViewFrom.SubtitleFontSize = 8; + this.subtitleListViewFrom.TabIndex = 0; + this.subtitleListViewFrom.UseCompatibleStateImageBehavior = false; + this.subtitleListViewFrom.UseSyntaxColoring = true; + this.subtitleListViewFrom.View = System.Windows.Forms.View.Details; + this.subtitleListViewFrom.Click += new System.EventHandler(this.subtitleListViewFrom_DoubleClick); + this.subtitleListViewFrom.DoubleClick += new System.EventHandler(this.subtitleListViewFrom_DoubleClick); + // + // labelApiKeyNotFound + // + this.labelApiKeyNotFound.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelApiKeyNotFound.AutoSize = true; + this.labelApiKeyNotFound.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0))))); + this.labelApiKeyNotFound.Location = new System.Drawing.Point(202, 529); + this.labelApiKeyNotFound.Name = "labelApiKeyNotFound"; + this.labelApiKeyNotFound.Size = new System.Drawing.Size(145, 13); + this.labelApiKeyNotFound.TabIndex = 12; + this.labelApiKeyNotFound.Text = "Warning: API key not found!"; + // + // GoogleTranslate + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(925, 558); + this.Controls.Add(this.labelApiKeyNotFound); + this.Controls.Add(this.comboBoxFrom); + this.Controls.Add(this.progressBar1); + this.Controls.Add(this.labelPleaseWait); + this.Controls.Add(this.linkLabelPoweredByGoogleTranslate); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.buttonTranslate); + this.Controls.Add(this.labelTo); + this.Controls.Add(this.comboBoxTo); + this.Controls.Add(this.subtitleListViewTo); + this.Controls.Add(this.subtitleListViewFrom); + this.Controls.Add(this.labelFrom); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.KeyPreview = true; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(900, 500); + this.Name = "GoogleTranslate"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Google translate"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormGoogleTranslate_KeyDown); + this.Resize += new System.EventHandler(this.GoogleTranslate_Resize); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ComboBox comboBoxFrom; + private System.Windows.Forms.Label labelFrom; + private SubtitleListView subtitleListViewFrom; + private SubtitleListView subtitleListViewTo; + private System.Windows.Forms.Label labelTo; + private System.Windows.Forms.ComboBox comboBoxTo; + private System.Windows.Forms.Button buttonTranslate; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.LinkLabel linkLabelPoweredByGoogleTranslate; + private System.Windows.Forms.Label labelPleaseWait; + private System.Windows.Forms.ProgressBar progressBar1; + private System.Windows.Forms.Label labelApiKeyNotFound; + } } \ No newline at end of file diff --git a/src/Forms/GoogleTranslate.cs b/src/ui/Forms/GoogleTranslate.cs similarity index 97% rename from src/Forms/GoogleTranslate.cs rename to src/ui/Forms/GoogleTranslate.cs index 4b3cfe9b8..6dee72378 100644 --- a/src/Forms/GoogleTranslate.cs +++ b/src/ui/Forms/GoogleTranslate.cs @@ -1,569 +1,569 @@ -using Nikse.SubtitleEdit.Controls; -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.SubtitleFormats; -using Nikse.SubtitleEdit.Core.Translate; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Net; -using System.Text; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class GoogleTranslate : PositionAndSizeForm - { - public Subtitle TranslatedSubtitle { get; private set; } - private Subtitle _subtitle; - private bool _breakTranslation; - private bool _googleTranslate = true; - private const string SplitterString = "+-+"; - private ITranslator _translator; - - private enum FormattingType - { - None, - Italic, - ItalicTwoLines - } - - private static string GoogleTranslateUrl => new GoogleTranslator2(Configuration.Settings.Tools.GoogleApiV2Key).GetUrl(); - - private FormattingType[] _formattingTypes; - private bool[] _autoSplit; - - private string _targetTwoLetterIsoLanguageName; - - public class ComboBoxItem - { - public string Text { get; set; } - public string Value { get; set; } - - public ComboBoxItem(string text, string value) - { - if (text.Length > 1) - { - text = char.ToUpper(text[0]) + text.Substring(1).ToLowerInvariant(); - } - - Text = text; - - Value = value; - } - - public override string ToString() - { - return Text; - } - } - - public GoogleTranslate() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - Text = Configuration.Settings.Language.GoogleTranslate.Title; - labelFrom.Text = Configuration.Settings.Language.GoogleTranslate.From; - labelTo.Text = Configuration.Settings.Language.GoogleTranslate.To; - buttonTranslate.Text = Configuration.Settings.Language.GoogleTranslate.Translate; - labelPleaseWait.Text = Configuration.Settings.Language.GoogleTranslate.PleaseWait; - linkLabelPoweredByGoogleTranslate.Text = Configuration.Settings.Language.GoogleTranslate.PoweredByGoogleTranslate; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - labelApiKeyNotFound.Text = string.Empty; - - subtitleListViewFrom.InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings); - subtitleListViewTo.InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings); - subtitleListViewFrom.HideColumn(SubtitleListView.SubtitleColumn.CharactersPerSeconds); - subtitleListViewFrom.HideColumn(SubtitleListView.SubtitleColumn.WordsPerMinute); - subtitleListViewTo.HideColumn(SubtitleListView.SubtitleColumn.CharactersPerSeconds); - subtitleListViewTo.HideColumn(SubtitleListView.SubtitleColumn.WordsPerMinute); - UiUtil.InitializeSubtitleFont(subtitleListViewFrom); - UiUtil.InitializeSubtitleFont(subtitleListViewTo); - subtitleListViewFrom.AutoSizeColumns(); - subtitleListViewFrom.AutoSizeColumns(); - UiUtil.FixLargeFonts(this, buttonOK); - } - - internal void Initialize(Subtitle subtitle, Subtitle target, string title, bool googleTranslate, Encoding encoding) - { - if (title != null) - { - Text = title; - } - - _googleTranslate = googleTranslate; - if (!_googleTranslate) - { - _translator = new MicrosoftTranslator(Configuration.Settings.Tools.MicrosoftTranslatorApiKey, Configuration.Settings.Tools.MicrosoftTranslatorTokenEndpoint, Configuration.Settings.Tools.MicrosoftTranslatorCategory); - linkLabelPoweredByGoogleTranslate.Text = Configuration.Settings.Language.GoogleTranslate.PoweredByMicrosoftTranslate; - } - - labelPleaseWait.Visible = false; - progressBar1.Visible = false; - _subtitle = subtitle; - - if (target != null) - { - TranslatedSubtitle = new Subtitle(target); - subtitleListViewTo.Fill(TranslatedSubtitle); - } - else - { - TranslatedSubtitle = new Subtitle(subtitle); - foreach (var paragraph in TranslatedSubtitle.Paragraphs) - { - paragraph.Text = string.Empty; - } - } - - - string defaultFromLanguage = LanguageAutoDetect.AutoDetectGoogleLanguage(encoding); // Guess language via encoding - if (string.IsNullOrEmpty(defaultFromLanguage)) - { - defaultFromLanguage = LanguageAutoDetect.AutoDetectGoogleLanguage(subtitle); // Guess language based on subtitle contents - } - - if (defaultFromLanguage == "he") - { - defaultFromLanguage = "iw"; - } - - FillComboWithLanguages(comboBoxFrom); - int i = 0; - foreach (ComboBoxItem item in comboBoxFrom.Items) - { - if (item.Value == defaultFromLanguage) - { - comboBoxFrom.SelectedIndex = i; - break; - } - i++; - } - - var installedLanguages = new List(); - foreach (InputLanguage language in InputLanguage.InstalledInputLanguages) - { - installedLanguages.Add(language); - } - - FillComboWithLanguages(comboBoxTo); - i = 0; - string uiCultureTargetLanguage = Configuration.Settings.Tools.GoogleTranslateLastTargetLanguage; - if (uiCultureTargetLanguage == defaultFromLanguage) - { - foreach (string s in Utilities.GetDictionaryLanguages()) - { - string temp = s.Replace("[", string.Empty).Replace("]", string.Empty); - if (temp.Length > 4) - { - temp = temp.Substring(temp.Length - 5, 2).ToLowerInvariant(); - if (temp != defaultFromLanguage && installedLanguages.Any(p => p.Culture.TwoLetterISOLanguageName.Contains(temp))) - { - uiCultureTargetLanguage = temp; - break; - } - } - } - } - if (uiCultureTargetLanguage == defaultFromLanguage) - { - foreach (InputLanguage language in installedLanguages) - { - if (language.Culture.TwoLetterISOLanguageName != defaultFromLanguage) - { - uiCultureTargetLanguage = language.Culture.TwoLetterISOLanguageName; - break; - } - } - } - - if (uiCultureTargetLanguage == defaultFromLanguage && defaultFromLanguage == "en") - { - uiCultureTargetLanguage = "es"; - } - if (uiCultureTargetLanguage == defaultFromLanguage) - { - uiCultureTargetLanguage = "en"; - } - - comboBoxTo.SelectedIndex = 0; - foreach (ComboBoxItem item in comboBoxTo.Items) - { - if (item.Value == uiCultureTargetLanguage) - { - comboBoxTo.SelectedIndex = i; - break; - } - i++; - } - - subtitleListViewFrom.Fill(subtitle); - GoogleTranslate_Resize(null, null); - - _formattingTypes = new FormattingType[_subtitle.Paragraphs.Count]; - _autoSplit = new bool[_subtitle.Paragraphs.Count]; - } - - private void Translate(string source, string target, ITranslator translator, int maxTextSize, int maximumRequestArrayLength = 100) - { - buttonOK.Enabled = false; - buttonCancel.Enabled = false; - _breakTranslation = false; - buttonTranslate.Text = Configuration.Settings.Language.General.Cancel; - Cursor.Current = Cursors.WaitCursor; - progressBar1.Maximum = _subtitle.Paragraphs.Count; - progressBar1.Value = 0; - progressBar1.Visible = true; - labelPleaseWait.Visible = true; - var sourceParagraphs = new List(); - try - { - var log = new StringBuilder(); - var sourceLength = 0; - var selectedItems = subtitleListViewFrom.SelectedItems; - var startIndex = selectedItems.Count <= 0 ? 0 : selectedItems[0].Index; - var start = startIndex; - int index = startIndex; - for (int i = startIndex; i < _subtitle.Paragraphs.Count; i++) - { - Paragraph p = _subtitle.Paragraphs[i]; - sourceLength += Utilities.UrlEncode(p.Text).Length; - if ((sourceLength >= maxTextSize || sourceParagraphs.Count >= maximumRequestArrayLength) && sourceParagraphs.Count > 0) - { - var result = translator.Translate(source, target, sourceParagraphs, log); - FillTranslatedText(result, start, index - 1); - sourceLength = 0; - sourceParagraphs.Clear(); - progressBar1.Refresh(); - Application.DoEvents(); - start = index; - } - sourceParagraphs.Add(p); - index++; - progressBar1.Value = index; - if (_breakTranslation) - { - break; - } - } - - if (sourceParagraphs.Count > 0) - { - var result = translator.Translate(source, target, sourceParagraphs, log); - FillTranslatedText(result, start, index - 1); - } - } - catch (WebException webException) - { - if (translator.GetType() == typeof(GoogleTranslator1)) - { - MessageBox.Show("Free API quota exceeded?" + Environment.NewLine + - Environment.NewLine + - webException.Source + ": " + webException.Message); - } - else if (translator.GetType() == typeof(GoogleTranslator2) && webException.Message.Contains("(400) Bad Request")) - { - MessageBox.Show("API key invalid (or perhaps billing is not enabled)?" + Environment.NewLine + - Environment.NewLine + - webException.Source + ": " + webException.Message); - } - else if (translator.GetType() == typeof(GoogleTranslator2) && webException.Message.Contains("(403) Forbidden.")) - { - MessageBox.Show("Perhaps billing is not enabled (or API key is invalid)?" + Environment.NewLine + - Environment.NewLine + - webException.Source + ": " + webException.Message); - } - else - { - MessageBox.Show(webException.Source + ": " + webException.Message); - } - } - finally - { - labelPleaseWait.Visible = false; - progressBar1.Visible = false; - Cursor.Current = Cursors.Default; - buttonTranslate.Text = Configuration.Settings.Language.GoogleTranslate.Translate; - buttonTranslate.Enabled = true; - buttonOK.Enabled = true; - buttonCancel.Enabled = true; - - Configuration.Settings.Tools.GoogleTranslateLastTargetLanguage = _targetTwoLetterIsoLanguageName; - } - } - - private void FillTranslatedText(List translatedLines, int start, int end) - { - int index = start; - foreach (string s in translatedLines) - { - if (index < TranslatedSubtitle.Paragraphs.Count) - { - var cleanText = CleanText(s, index); - TranslatedSubtitle.Paragraphs[index].Text = cleanText; - } - index++; - } - subtitleListViewTo.BeginUpdate(); - subtitleListViewTo.Fill(TranslatedSubtitle); - subtitleListViewTo.SelectIndexAndEnsureVisible(end); - subtitleListViewTo.EndUpdate(); - } - - private void buttonTranslate_Click(object sender, EventArgs e) - { - if (buttonTranslate.Text == Configuration.Settings.Language.General.Cancel) - { - buttonTranslate.Enabled = false; - _breakTranslation = true; - buttonOK.Enabled = true; - buttonCancel.Enabled = true; - return; - } - - _targetTwoLetterIsoLanguageName = ((ComboBoxItem)comboBoxTo.SelectedItem).Value; - Configuration.Settings.Tools.GoogleTranslateLastTargetLanguage = _targetTwoLetterIsoLanguageName; - var source = ((ComboBoxItem)comboBoxFrom.SelectedItem).Value; - - var language = Configuration.Settings.Language.GoogleTranslate; - if (_googleTranslate && string.IsNullOrEmpty(Configuration.Settings.Tools.GoogleApiV2Key)) - { - if (Configuration.Settings.Tools.GoogleApiV2KeyInfoShow) - { - using (var form = new DialogDoNotShowAgain("Subtitle Edit", language.GoogleApiKeyNeeded)) - { - form.ShowDialog(this); - Configuration.Settings.Tools.GoogleApiV2KeyInfoShow = !form.DoNoDisplayAgain; - } - } - - if (Configuration.Settings.Tools.GoogleTranslateNoKeyWarningShow) - { - using (var form = new DialogDoNotShowAgain("Subtitle Edit", language.GoogleNoApiKeyWarning)) - { - form.ShowDialog(this); - Configuration.Settings.Tools.GoogleTranslateNoKeyWarningShow = !form.DoNoDisplayAgain; - } - } - - labelApiKeyNotFound.Left = linkLabelPoweredByGoogleTranslate.Left + linkLabelPoweredByGoogleTranslate.Width + 20; - labelApiKeyNotFound.Text = language.GoogleNoApiKeyWarning; - - Translate(source, _targetTwoLetterIsoLanguageName, new GoogleTranslator1(), Configuration.Settings.Tools.GoogleApiV1ChunkSize); - return; - } - - if (!_googleTranslate && string.IsNullOrEmpty(Configuration.Settings.Tools.MicrosoftTranslatorApiKey)) - { - MessageBox.Show(language.MsClientSecretNeeded); - return; - } - - - if (_googleTranslate) - { - Translate(source, _targetTwoLetterIsoLanguageName, new GoogleTranslator2(Configuration.Settings.Tools.GoogleApiV2Key), 1000); - } - else - { - Translate(source, _targetTwoLetterIsoLanguageName, new MicrosoftTranslator(Configuration.Settings.Tools.MicrosoftTranslatorApiKey, Configuration.Settings.Tools.MicrosoftTranslatorTokenEndpoint, Configuration.Settings.Tools.MicrosoftTranslatorCategory), 1000, MicrosoftTranslator.MaximumRequestArrayLength); - } - } - - private string CleanText(string s, int index) - { - string cleanText = s.Replace("

", string.Empty).Trim(); - int indexOfP = cleanText.IndexOf(SplitterString.Trim(), StringComparison.Ordinal); - if (indexOfP >= 0 && indexOfP < 4) - { - cleanText = cleanText.Remove(0, indexOfP); - } - - cleanText = cleanText.Replace(SplitterString, string.Empty).Trim(); - if (cleanText.Contains('\n') && !cleanText.Contains('\r')) - { - cleanText = cleanText.Replace("\n", Environment.NewLine); - } - - cleanText = cleanText.Replace(" ...", "..."); - cleanText = cleanText.Replace("
", Environment.NewLine); - cleanText = cleanText.Replace("
", Environment.NewLine); - cleanText = cleanText.Replace("< br/>", Environment.NewLine); - cleanText = cleanText.Replace("
", Environment.NewLine); - cleanText = cleanText.Replace("
", Environment.NewLine); - cleanText = cleanText.Replace("< br />", Environment.NewLine); - cleanText = cleanText.Replace("< br / >", Environment.NewLine); - cleanText = cleanText.Replace("< br/ >", Environment.NewLine); - cleanText = cleanText.Replace(Environment.NewLine + " ", Environment.NewLine); - cleanText = cleanText.Replace(" " + Environment.NewLine, Environment.NewLine); - cleanText = cleanText.Replace("", ""); - cleanText = cleanText.Replace("< I>", ""); - cleanText = cleanText.Replace("", ""); - cleanText = cleanText.Replace("", ""); - cleanText = cleanText.Replace("", ""); - cleanText = cleanText.Replace("< i >", ""); - if (cleanText.StartsWith(" ", StringComparison.Ordinal)) - { - cleanText = cleanText.Remove(3, 1); - } - - if (cleanText.EndsWith(" ", StringComparison.Ordinal)) - { - cleanText = cleanText.Remove(cleanText.Length - 5, 1); - } - - cleanText = cleanText.Replace(Environment.NewLine + " ", Environment.NewLine + ""); - cleanText = cleanText.Replace(" " + Environment.NewLine, "" + Environment.NewLine); - - if (_autoSplit[index]) - { - cleanText = Utilities.AutoBreakLine(cleanText); - } - - if (Utilities.GetNumberOfLines(cleanText) == 1 && Utilities.GetNumberOfLines(_subtitle.Paragraphs[index].Text) == 2) - { - if (!_autoSplit[index]) - { - cleanText = Utilities.AutoBreakLine(cleanText); - } - } - - if (_formattingTypes[index] == FormattingType.ItalicTwoLines || _formattingTypes[index] == FormattingType.Italic) - { - cleanText = "" + cleanText + ""; - } - - return cleanText; - } - - public void FillComboWithLanguages(ComboBox comboBox) - { - if (!_googleTranslate) - { - foreach (var bingLanguageCode in _translator.GetTranslationPairs()) - { - comboBox.Items.Add(new ComboBoxItem(bingLanguageCode.Name, bingLanguageCode.Code)); - } - return; - } - - FillComboWithGoogleLanguages(comboBox); - } - - public void FillComboWithGoogleLanguages(ComboBox comboBox) - { - var translator = new GoogleTranslator2(Configuration.Settings.Tools.GoogleApiV2Key); - foreach (var pair in translator.GetTranslationPairs()) - { - comboBox.Items.Add(new ComboBoxItem(pair.Name, pair.Code)); - } - } - - private void LinkLabel1LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) - { - UiUtil.OpenURL(_googleTranslate ? GoogleTranslateUrl : _translator.GetUrl()); - } - - private void ButtonOkClick(object sender, EventArgs e) - { - DialogResult = subtitleListViewTo.Items.Count > 0 ? DialogResult.OK : DialogResult.Cancel; - } - - private void FormGoogleTranslate_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape && labelPleaseWait.Visible == false) - { - DialogResult = DialogResult.Cancel; - } - else if (e.KeyCode == Keys.Escape && labelPleaseWait.Visible) - { - _breakTranslation = true; - e.SuppressKeyPress = true; - } - else if (e.KeyCode == UiUtil.HelpKeys) - { - Utilities.ShowHelp("#translation"); - } - } - - private void GoogleTranslate_Resize(object sender, EventArgs e) - { - int width = (Width / 2) - (subtitleListViewFrom.Left * 3) + 19; - subtitleListViewFrom.Width = width; - subtitleListViewTo.Width = width; - - int height = Height - (subtitleListViewFrom.Top + buttonTranslate.Height + 60); - subtitleListViewFrom.Height = height; - subtitleListViewTo.Height = height; - - comboBoxFrom.Left = subtitleListViewFrom.Left + (subtitleListViewFrom.Width - comboBoxFrom.Width); - labelFrom.Left = comboBoxFrom.Left - 5 - labelFrom.Width; - - subtitleListViewTo.Left = width + (subtitleListViewFrom.Left * 2); - labelTo.Left = subtitleListViewTo.Left; - comboBoxTo.Left = labelTo.Left + labelTo.Width + 5; - buttonTranslate.Left = comboBoxTo.Left + comboBoxTo.Width + 9; - labelPleaseWait.Left = buttonTranslate.Left + buttonTranslate.Width + 9; - progressBar1.Left = labelPleaseWait.Left; - progressBar1.Width = subtitleListViewTo.Width - (progressBar1.Left - subtitleListViewTo.Left); - } - - private void SyncListViews(ListView listViewSelected, SubtitleListView listViewOther) - { - if (listViewSelected.SelectedItems.Count > 0) - { - var first = listViewSelected.TopItem.Index; - int index = listViewSelected.SelectedItems[0].Index; - if (index < listViewOther.Items.Count) - { - listViewOther.SelectIndexAndEnsureVisible(index, false); - if (first >= 0) - { - listViewOther.TopItem = listViewOther.Items[first]; - } - } - } - } - - private void subtitleListViewFrom_DoubleClick(object sender, EventArgs e) - { - SyncListViews(subtitleListViewFrom, subtitleListViewTo); - } - - private void subtitleListViewTo_DoubleClick(object sender, EventArgs e) - { - SyncListViews(subtitleListViewTo, subtitleListViewFrom); - } - - public string GetFileNameWithTargetLanguage(string oldFileName, string videoFileName, Subtitle oldSubtitle, SubtitleFormat subtitleFormat) - { - if (!string.IsNullOrEmpty(_targetTwoLetterIsoLanguageName)) - { - if (!string.IsNullOrEmpty(videoFileName)) - { - return Path.GetFileNameWithoutExtension(videoFileName) + "." + _targetTwoLetterIsoLanguageName.ToLowerInvariant() + subtitleFormat.Extension; - } - - if (!string.IsNullOrEmpty(oldFileName)) - { - var s = Path.GetFileNameWithoutExtension(oldFileName); - if (oldSubtitle != null) - { - var lang = "." + LanguageAutoDetect.AutoDetectGoogleLanguage(oldSubtitle); - if (lang.Length == 3 && s.EndsWith(lang, StringComparison.OrdinalIgnoreCase)) - { - s = s.Remove(s.Length - 3); - } - } - return s + "." + _targetTwoLetterIsoLanguageName.ToLowerInvariant() + subtitleFormat.Extension; - } - } - return null; - } - } -} +using Nikse.SubtitleEdit.Controls; +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.SubtitleFormats; +using Nikse.SubtitleEdit.Core.Translate; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Text; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class GoogleTranslate : PositionAndSizeForm + { + public Subtitle TranslatedSubtitle { get; private set; } + private Subtitle _subtitle; + private bool _breakTranslation; + private bool _googleTranslate = true; + private const string SplitterString = "+-+"; + private ITranslator _translator; + + private enum FormattingType + { + None, + Italic, + ItalicTwoLines + } + + private static string GoogleTranslateUrl => new GoogleTranslator2(Configuration.Settings.Tools.GoogleApiV2Key).GetUrl(); + + private FormattingType[] _formattingTypes; + private bool[] _autoSplit; + + private string _targetTwoLetterIsoLanguageName; + + public class ComboBoxItem + { + public string Text { get; set; } + public string Value { get; set; } + + public ComboBoxItem(string text, string value) + { + if (text.Length > 1) + { + text = char.ToUpper(text[0]) + text.Substring(1).ToLowerInvariant(); + } + + Text = text; + + Value = value; + } + + public override string ToString() + { + return Text; + } + } + + public GoogleTranslate() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + Text = Configuration.Settings.Language.GoogleTranslate.Title; + labelFrom.Text = Configuration.Settings.Language.GoogleTranslate.From; + labelTo.Text = Configuration.Settings.Language.GoogleTranslate.To; + buttonTranslate.Text = Configuration.Settings.Language.GoogleTranslate.Translate; + labelPleaseWait.Text = Configuration.Settings.Language.GoogleTranslate.PleaseWait; + linkLabelPoweredByGoogleTranslate.Text = Configuration.Settings.Language.GoogleTranslate.PoweredByGoogleTranslate; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + labelApiKeyNotFound.Text = string.Empty; + + subtitleListViewFrom.InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings); + subtitleListViewTo.InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings); + subtitleListViewFrom.HideColumn(SubtitleListView.SubtitleColumn.CharactersPerSeconds); + subtitleListViewFrom.HideColumn(SubtitleListView.SubtitleColumn.WordsPerMinute); + subtitleListViewTo.HideColumn(SubtitleListView.SubtitleColumn.CharactersPerSeconds); + subtitleListViewTo.HideColumn(SubtitleListView.SubtitleColumn.WordsPerMinute); + UiUtil.InitializeSubtitleFont(subtitleListViewFrom); + UiUtil.InitializeSubtitleFont(subtitleListViewTo); + subtitleListViewFrom.AutoSizeColumns(); + subtitleListViewFrom.AutoSizeColumns(); + UiUtil.FixLargeFonts(this, buttonOK); + } + + internal void Initialize(Subtitle subtitle, Subtitle target, string title, bool googleTranslate, Encoding encoding) + { + if (title != null) + { + Text = title; + } + + _googleTranslate = googleTranslate; + if (!_googleTranslate) + { + _translator = new MicrosoftTranslator(Configuration.Settings.Tools.MicrosoftTranslatorApiKey, Configuration.Settings.Tools.MicrosoftTranslatorTokenEndpoint, Configuration.Settings.Tools.MicrosoftTranslatorCategory); + linkLabelPoweredByGoogleTranslate.Text = Configuration.Settings.Language.GoogleTranslate.PoweredByMicrosoftTranslate; + } + + labelPleaseWait.Visible = false; + progressBar1.Visible = false; + _subtitle = subtitle; + + if (target != null) + { + TranslatedSubtitle = new Subtitle(target); + subtitleListViewTo.Fill(TranslatedSubtitle); + } + else + { + TranslatedSubtitle = new Subtitle(subtitle); + foreach (var paragraph in TranslatedSubtitle.Paragraphs) + { + paragraph.Text = string.Empty; + } + } + + + string defaultFromLanguage = LanguageAutoDetect.AutoDetectGoogleLanguage(encoding); // Guess language via encoding + if (string.IsNullOrEmpty(defaultFromLanguage)) + { + defaultFromLanguage = LanguageAutoDetect.AutoDetectGoogleLanguage(subtitle); // Guess language based on subtitle contents + } + + if (defaultFromLanguage == "he") + { + defaultFromLanguage = "iw"; + } + + FillComboWithLanguages(comboBoxFrom); + int i = 0; + foreach (ComboBoxItem item in comboBoxFrom.Items) + { + if (item.Value == defaultFromLanguage) + { + comboBoxFrom.SelectedIndex = i; + break; + } + i++; + } + + var installedLanguages = new List(); + foreach (InputLanguage language in InputLanguage.InstalledInputLanguages) + { + installedLanguages.Add(language); + } + + FillComboWithLanguages(comboBoxTo); + i = 0; + string uiCultureTargetLanguage = Configuration.Settings.Tools.GoogleTranslateLastTargetLanguage; + if (uiCultureTargetLanguage == defaultFromLanguage) + { + foreach (string s in Utilities.GetDictionaryLanguages()) + { + string temp = s.Replace("[", string.Empty).Replace("]", string.Empty); + if (temp.Length > 4) + { + temp = temp.Substring(temp.Length - 5, 2).ToLowerInvariant(); + if (temp != defaultFromLanguage && installedLanguages.Any(p => p.Culture.TwoLetterISOLanguageName.Contains(temp))) + { + uiCultureTargetLanguage = temp; + break; + } + } + } + } + if (uiCultureTargetLanguage == defaultFromLanguage) + { + foreach (InputLanguage language in installedLanguages) + { + if (language.Culture.TwoLetterISOLanguageName != defaultFromLanguage) + { + uiCultureTargetLanguage = language.Culture.TwoLetterISOLanguageName; + break; + } + } + } + + if (uiCultureTargetLanguage == defaultFromLanguage && defaultFromLanguage == "en") + { + uiCultureTargetLanguage = "es"; + } + if (uiCultureTargetLanguage == defaultFromLanguage) + { + uiCultureTargetLanguage = "en"; + } + + comboBoxTo.SelectedIndex = 0; + foreach (ComboBoxItem item in comboBoxTo.Items) + { + if (item.Value == uiCultureTargetLanguage) + { + comboBoxTo.SelectedIndex = i; + break; + } + i++; + } + + subtitleListViewFrom.Fill(subtitle); + GoogleTranslate_Resize(null, null); + + _formattingTypes = new FormattingType[_subtitle.Paragraphs.Count]; + _autoSplit = new bool[_subtitle.Paragraphs.Count]; + } + + private void Translate(string source, string target, ITranslator translator, int maxTextSize, int maximumRequestArrayLength = 100) + { + buttonOK.Enabled = false; + buttonCancel.Enabled = false; + _breakTranslation = false; + buttonTranslate.Text = Configuration.Settings.Language.General.Cancel; + Cursor.Current = Cursors.WaitCursor; + progressBar1.Maximum = _subtitle.Paragraphs.Count; + progressBar1.Value = 0; + progressBar1.Visible = true; + labelPleaseWait.Visible = true; + var sourceParagraphs = new List(); + try + { + var log = new StringBuilder(); + var sourceLength = 0; + var selectedItems = subtitleListViewFrom.SelectedItems; + var startIndex = selectedItems.Count <= 0 ? 0 : selectedItems[0].Index; + var start = startIndex; + int index = startIndex; + for (int i = startIndex; i < _subtitle.Paragraphs.Count; i++) + { + Paragraph p = _subtitle.Paragraphs[i]; + sourceLength += Utilities.UrlEncode(p.Text).Length; + if ((sourceLength >= maxTextSize || sourceParagraphs.Count >= maximumRequestArrayLength) && sourceParagraphs.Count > 0) + { + var result = translator.Translate(source, target, sourceParagraphs, log); + FillTranslatedText(result, start, index - 1); + sourceLength = 0; + sourceParagraphs.Clear(); + progressBar1.Refresh(); + Application.DoEvents(); + start = index; + } + sourceParagraphs.Add(p); + index++; + progressBar1.Value = index; + if (_breakTranslation) + { + break; + } + } + + if (sourceParagraphs.Count > 0) + { + var result = translator.Translate(source, target, sourceParagraphs, log); + FillTranslatedText(result, start, index - 1); + } + } + catch (WebException webException) + { + if (translator.GetType() == typeof(GoogleTranslator1)) + { + MessageBox.Show("Free API quota exceeded?" + Environment.NewLine + + Environment.NewLine + + webException.Source + ": " + webException.Message); + } + else if (translator.GetType() == typeof(GoogleTranslator2) && webException.Message.Contains("(400) Bad Request")) + { + MessageBox.Show("API key invalid (or perhaps billing is not enabled)?" + Environment.NewLine + + Environment.NewLine + + webException.Source + ": " + webException.Message); + } + else if (translator.GetType() == typeof(GoogleTranslator2) && webException.Message.Contains("(403) Forbidden.")) + { + MessageBox.Show("Perhaps billing is not enabled (or API key is invalid)?" + Environment.NewLine + + Environment.NewLine + + webException.Source + ": " + webException.Message); + } + else + { + MessageBox.Show(webException.Source + ": " + webException.Message); + } + } + finally + { + labelPleaseWait.Visible = false; + progressBar1.Visible = false; + Cursor.Current = Cursors.Default; + buttonTranslate.Text = Configuration.Settings.Language.GoogleTranslate.Translate; + buttonTranslate.Enabled = true; + buttonOK.Enabled = true; + buttonCancel.Enabled = true; + + Configuration.Settings.Tools.GoogleTranslateLastTargetLanguage = _targetTwoLetterIsoLanguageName; + } + } + + private void FillTranslatedText(List translatedLines, int start, int end) + { + int index = start; + foreach (string s in translatedLines) + { + if (index < TranslatedSubtitle.Paragraphs.Count) + { + var cleanText = CleanText(s, index); + TranslatedSubtitle.Paragraphs[index].Text = cleanText; + } + index++; + } + subtitleListViewTo.BeginUpdate(); + subtitleListViewTo.Fill(TranslatedSubtitle); + subtitleListViewTo.SelectIndexAndEnsureVisible(end); + subtitleListViewTo.EndUpdate(); + } + + private void buttonTranslate_Click(object sender, EventArgs e) + { + if (buttonTranslate.Text == Configuration.Settings.Language.General.Cancel) + { + buttonTranslate.Enabled = false; + _breakTranslation = true; + buttonOK.Enabled = true; + buttonCancel.Enabled = true; + return; + } + + _targetTwoLetterIsoLanguageName = ((ComboBoxItem)comboBoxTo.SelectedItem).Value; + Configuration.Settings.Tools.GoogleTranslateLastTargetLanguage = _targetTwoLetterIsoLanguageName; + var source = ((ComboBoxItem)comboBoxFrom.SelectedItem).Value; + + var language = Configuration.Settings.Language.GoogleTranslate; + if (_googleTranslate && string.IsNullOrEmpty(Configuration.Settings.Tools.GoogleApiV2Key)) + { + if (Configuration.Settings.Tools.GoogleApiV2KeyInfoShow) + { + using (var form = new DialogDoNotShowAgain("Subtitle Edit", language.GoogleApiKeyNeeded)) + { + form.ShowDialog(this); + Configuration.Settings.Tools.GoogleApiV2KeyInfoShow = !form.DoNoDisplayAgain; + } + } + + if (Configuration.Settings.Tools.GoogleTranslateNoKeyWarningShow) + { + using (var form = new DialogDoNotShowAgain("Subtitle Edit", language.GoogleNoApiKeyWarning)) + { + form.ShowDialog(this); + Configuration.Settings.Tools.GoogleTranslateNoKeyWarningShow = !form.DoNoDisplayAgain; + } + } + + labelApiKeyNotFound.Left = linkLabelPoweredByGoogleTranslate.Left + linkLabelPoweredByGoogleTranslate.Width + 20; + labelApiKeyNotFound.Text = language.GoogleNoApiKeyWarning; + + Translate(source, _targetTwoLetterIsoLanguageName, new GoogleTranslator1(), Configuration.Settings.Tools.GoogleApiV1ChunkSize); + return; + } + + if (!_googleTranslate && string.IsNullOrEmpty(Configuration.Settings.Tools.MicrosoftTranslatorApiKey)) + { + MessageBox.Show(language.MsClientSecretNeeded); + return; + } + + + if (_googleTranslate) + { + Translate(source, _targetTwoLetterIsoLanguageName, new GoogleTranslator2(Configuration.Settings.Tools.GoogleApiV2Key), 1000); + } + else + { + Translate(source, _targetTwoLetterIsoLanguageName, new MicrosoftTranslator(Configuration.Settings.Tools.MicrosoftTranslatorApiKey, Configuration.Settings.Tools.MicrosoftTranslatorTokenEndpoint, Configuration.Settings.Tools.MicrosoftTranslatorCategory), 1000, MicrosoftTranslator.MaximumRequestArrayLength); + } + } + + private string CleanText(string s, int index) + { + string cleanText = s.Replace("

", string.Empty).Trim(); + int indexOfP = cleanText.IndexOf(SplitterString.Trim(), StringComparison.Ordinal); + if (indexOfP >= 0 && indexOfP < 4) + { + cleanText = cleanText.Remove(0, indexOfP); + } + + cleanText = cleanText.Replace(SplitterString, string.Empty).Trim(); + if (cleanText.Contains('\n') && !cleanText.Contains('\r')) + { + cleanText = cleanText.Replace("\n", Environment.NewLine); + } + + cleanText = cleanText.Replace(" ...", "..."); + cleanText = cleanText.Replace("
", Environment.NewLine); + cleanText = cleanText.Replace("
", Environment.NewLine); + cleanText = cleanText.Replace("< br/>", Environment.NewLine); + cleanText = cleanText.Replace("
", Environment.NewLine); + cleanText = cleanText.Replace("
", Environment.NewLine); + cleanText = cleanText.Replace("< br />", Environment.NewLine); + cleanText = cleanText.Replace("< br / >", Environment.NewLine); + cleanText = cleanText.Replace("< br/ >", Environment.NewLine); + cleanText = cleanText.Replace(Environment.NewLine + " ", Environment.NewLine); + cleanText = cleanText.Replace(" " + Environment.NewLine, Environment.NewLine); + cleanText = cleanText.Replace("", ""); + cleanText = cleanText.Replace("< I>", ""); + cleanText = cleanText.Replace("", ""); + cleanText = cleanText.Replace("", ""); + cleanText = cleanText.Replace("", ""); + cleanText = cleanText.Replace("< i >", ""); + if (cleanText.StartsWith(" ", StringComparison.Ordinal)) + { + cleanText = cleanText.Remove(3, 1); + } + + if (cleanText.EndsWith(" ", StringComparison.Ordinal)) + { + cleanText = cleanText.Remove(cleanText.Length - 5, 1); + } + + cleanText = cleanText.Replace(Environment.NewLine + " ", Environment.NewLine + ""); + cleanText = cleanText.Replace(" " + Environment.NewLine, "" + Environment.NewLine); + + if (_autoSplit[index]) + { + cleanText = Utilities.AutoBreakLine(cleanText); + } + + if (Utilities.GetNumberOfLines(cleanText) == 1 && Utilities.GetNumberOfLines(_subtitle.Paragraphs[index].Text) == 2) + { + if (!_autoSplit[index]) + { + cleanText = Utilities.AutoBreakLine(cleanText); + } + } + + if (_formattingTypes[index] == FormattingType.ItalicTwoLines || _formattingTypes[index] == FormattingType.Italic) + { + cleanText = "" + cleanText + ""; + } + + return cleanText; + } + + public void FillComboWithLanguages(ComboBox comboBox) + { + if (!_googleTranslate) + { + foreach (var bingLanguageCode in _translator.GetTranslationPairs()) + { + comboBox.Items.Add(new ComboBoxItem(bingLanguageCode.Name, bingLanguageCode.Code)); + } + return; + } + + FillComboWithGoogleLanguages(comboBox); + } + + public void FillComboWithGoogleLanguages(ComboBox comboBox) + { + var translator = new GoogleTranslator2(Configuration.Settings.Tools.GoogleApiV2Key); + foreach (var pair in translator.GetTranslationPairs()) + { + comboBox.Items.Add(new ComboBoxItem(pair.Name, pair.Code)); + } + } + + private void LinkLabel1LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + UiUtil.OpenURL(_googleTranslate ? GoogleTranslateUrl : _translator.GetUrl()); + } + + private void ButtonOkClick(object sender, EventArgs e) + { + DialogResult = subtitleListViewTo.Items.Count > 0 ? DialogResult.OK : DialogResult.Cancel; + } + + private void FormGoogleTranslate_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape && labelPleaseWait.Visible == false) + { + DialogResult = DialogResult.Cancel; + } + else if (e.KeyCode == Keys.Escape && labelPleaseWait.Visible) + { + _breakTranslation = true; + e.SuppressKeyPress = true; + } + else if (e.KeyCode == UiUtil.HelpKeys) + { + Utilities.ShowHelp("#translation"); + } + } + + private void GoogleTranslate_Resize(object sender, EventArgs e) + { + int width = (Width / 2) - (subtitleListViewFrom.Left * 3) + 19; + subtitleListViewFrom.Width = width; + subtitleListViewTo.Width = width; + + int height = Height - (subtitleListViewFrom.Top + buttonTranslate.Height + 60); + subtitleListViewFrom.Height = height; + subtitleListViewTo.Height = height; + + comboBoxFrom.Left = subtitleListViewFrom.Left + (subtitleListViewFrom.Width - comboBoxFrom.Width); + labelFrom.Left = comboBoxFrom.Left - 5 - labelFrom.Width; + + subtitleListViewTo.Left = width + (subtitleListViewFrom.Left * 2); + labelTo.Left = subtitleListViewTo.Left; + comboBoxTo.Left = labelTo.Left + labelTo.Width + 5; + buttonTranslate.Left = comboBoxTo.Left + comboBoxTo.Width + 9; + labelPleaseWait.Left = buttonTranslate.Left + buttonTranslate.Width + 9; + progressBar1.Left = labelPleaseWait.Left; + progressBar1.Width = subtitleListViewTo.Width - (progressBar1.Left - subtitleListViewTo.Left); + } + + private void SyncListViews(ListView listViewSelected, SubtitleListView listViewOther) + { + if (listViewSelected.SelectedItems.Count > 0) + { + var first = listViewSelected.TopItem.Index; + int index = listViewSelected.SelectedItems[0].Index; + if (index < listViewOther.Items.Count) + { + listViewOther.SelectIndexAndEnsureVisible(index, false); + if (first >= 0) + { + listViewOther.TopItem = listViewOther.Items[first]; + } + } + } + } + + private void subtitleListViewFrom_DoubleClick(object sender, EventArgs e) + { + SyncListViews(subtitleListViewFrom, subtitleListViewTo); + } + + private void subtitleListViewTo_DoubleClick(object sender, EventArgs e) + { + SyncListViews(subtitleListViewTo, subtitleListViewFrom); + } + + public string GetFileNameWithTargetLanguage(string oldFileName, string videoFileName, Subtitle oldSubtitle, SubtitleFormat subtitleFormat) + { + if (!string.IsNullOrEmpty(_targetTwoLetterIsoLanguageName)) + { + if (!string.IsNullOrEmpty(videoFileName)) + { + return Path.GetFileNameWithoutExtension(videoFileName) + "." + _targetTwoLetterIsoLanguageName.ToLowerInvariant() + subtitleFormat.Extension; + } + + if (!string.IsNullOrEmpty(oldFileName)) + { + var s = Path.GetFileNameWithoutExtension(oldFileName); + if (oldSubtitle != null) + { + var lang = "." + LanguageAutoDetect.AutoDetectGoogleLanguage(oldSubtitle); + if (lang.Length == 3 && s.EndsWith(lang, StringComparison.OrdinalIgnoreCase)) + { + s = s.Remove(s.Length - 3); + } + } + return s + "." + _targetTwoLetterIsoLanguageName.ToLowerInvariant() + subtitleFormat.Extension; + } + } + return null; + } + } +} diff --git a/src/Forms/GoogleTranslate.resx b/src/ui/Forms/GoogleTranslate.resx similarity index 97% rename from src/Forms/GoogleTranslate.resx rename to src/ui/Forms/GoogleTranslate.resx index c7e0d4bdf..d58980a38 100644 --- a/src/Forms/GoogleTranslate.resx +++ b/src/ui/Forms/GoogleTranslate.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Forms/HardSubExtract.Designer.cs b/src/ui/Forms/HardSubExtract.Designer.cs similarity index 98% rename from src/Forms/HardSubExtract.Designer.cs rename to src/ui/Forms/HardSubExtract.Designer.cs index 3f46bbb45..55ac62ef8 100644 --- a/src/Forms/HardSubExtract.Designer.cs +++ b/src/ui/Forms/HardSubExtract.Designer.cs @@ -1,447 +1,447 @@ -namespace Nikse.SubtitleEdit.Forms -{ - partial class HardSubExtract - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.label1 = new System.Windows.Forms.Label(); - this.labelCustomRgb = new System.Windows.Forms.Label(); - this.pictureBoxCustomColor = new System.Windows.Forms.PictureBox(); - this.numericUpDownCustomMaxDiff = new System.Windows.Forms.NumericUpDown(); - this.checkBoxCustomColor = new System.Windows.Forms.CheckBox(); - this.checkBoxYellow = new System.Windows.Forms.CheckBox(); - this.numericUpDownPixelsBottom = new System.Windows.Forms.NumericUpDown(); - this.label4 = new System.Windows.Forms.Label(); - this.pictureBox2 = new System.Windows.Forms.PictureBox(); - this.contextMenuStripScreenshot = new System.Windows.Forms.ContextMenuStrip(this.components); - this.saveImageAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.labelClickOnTextColor = new System.Windows.Forms.Label(); - this.openFileDialogVideo = new System.Windows.Forms.OpenFileDialog(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.labelStatus = new System.Windows.Forms.Label(); - this.groupBox2 = new System.Windows.Forms.GroupBox(); - this.button1 = new System.Windows.Forms.Button(); - this.timerRefreshProgressbar = new System.Windows.Forms.Timer(this.components); - this.label8 = new System.Windows.Forms.Label(); - this.tbBlacks = new System.Windows.Forms.TextBox(); - this.label9 = new System.Windows.Forms.Label(); - this.tbFrameNum = new System.Windows.Forms.TextBox(); - this.tbFileName = new System.Windows.Forms.TextBox(); - this.label10 = new System.Windows.Forms.Label(); - this.StartStop = new System.Windows.Forms.Button(); - this.groupBox3 = new System.Windows.Forms.GroupBox(); - this.colorDialog1 = new System.Windows.Forms.ColorDialog(); - this.buttonStop = new System.Windows.Forms.Button(); - this.mediaPlayer = new Nikse.SubtitleEdit.Controls.VideoPlayerContainer(); - this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog(); - this.groupBox1.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxCustomColor)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownCustomMaxDiff)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPixelsBottom)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); - this.contextMenuStripScreenshot.SuspendLayout(); - this.groupBox2.SuspendLayout(); - this.groupBox3.SuspendLayout(); - this.SuspendLayout(); - // - // groupBox1 - // - this.groupBox1.Controls.Add(this.label1); - this.groupBox1.Controls.Add(this.labelCustomRgb); - this.groupBox1.Controls.Add(this.pictureBoxCustomColor); - this.groupBox1.Controls.Add(this.numericUpDownCustomMaxDiff); - this.groupBox1.Controls.Add(this.checkBoxCustomColor); - this.groupBox1.Controls.Add(this.checkBoxYellow); - this.groupBox1.Location = new System.Drawing.Point(12, 85); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(341, 117); - this.groupBox1.TabIndex = 0; - this.groupBox1.TabStop = false; - this.groupBox1.Text = "Detection options"; - // - // label1 - // - this.label1.Location = new System.Drawing.Point(9, 80); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(101, 16); - this.label1.TabIndex = 31; - this.label1.Text = "Allow diff per RGB"; - // - // labelCustomRgb - // - this.labelCustomRgb.AutoSize = true; - this.labelCustomRgb.Location = new System.Drawing.Point(177, 56); - this.labelCustomRgb.Name = "labelCustomRgb"; - this.labelCustomRgb.Size = new System.Drawing.Size(30, 13); - this.labelCustomRgb.TabIndex = 37; - this.labelCustomRgb.Text = "RGB"; - // - // pictureBoxCustomColor - // - this.pictureBoxCustomColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.pictureBoxCustomColor.Location = new System.Drawing.Point(152, 53); - this.pictureBoxCustomColor.Name = "pictureBoxCustomColor"; - this.pictureBoxCustomColor.Size = new System.Drawing.Size(21, 21); - this.pictureBoxCustomColor.TabIndex = 8; - this.pictureBoxCustomColor.TabStop = false; - this.pictureBoxCustomColor.Click += new System.EventHandler(this.pictureBoxCustomColor_Click); - // - // numericUpDownCustomMaxDiff - // - this.numericUpDownCustomMaxDiff.Location = new System.Drawing.Point(116, 76); - this.numericUpDownCustomMaxDiff.Name = "numericUpDownCustomMaxDiff"; - this.numericUpDownCustomMaxDiff.Size = new System.Drawing.Size(38, 20); - this.numericUpDownCustomMaxDiff.TabIndex = 2; - this.numericUpDownCustomMaxDiff.Value = new decimal(new int[] { - 14, - 0, - 0, - 0}); - // - // checkBoxCustomColor - // - this.checkBoxCustomColor.AutoSize = true; - this.checkBoxCustomColor.Location = new System.Drawing.Point(11, 55); - this.checkBoxCustomColor.Name = "checkBoxCustomColor"; - this.checkBoxCustomColor.Size = new System.Drawing.Size(135, 17); - this.checkBoxCustomColor.TabIndex = 1; - this.checkBoxCustomColor.Text = "Check for custom color"; - this.checkBoxCustomColor.UseVisualStyleBackColor = true; - // - // checkBoxYellow - // - this.checkBoxYellow.AutoSize = true; - this.checkBoxYellow.Checked = true; - this.checkBoxYellow.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxYellow.Location = new System.Drawing.Point(9, 19); - this.checkBoxYellow.Name = "checkBoxYellow"; - this.checkBoxYellow.Size = new System.Drawing.Size(124, 17); - this.checkBoxYellow.TabIndex = 0; - this.checkBoxYellow.Text = "Check for yellow text"; - this.checkBoxYellow.UseVisualStyleBackColor = true; - // - // numericUpDownPixelsBottom - // - this.numericUpDownPixelsBottom.Location = new System.Drawing.Point(192, 16); - this.numericUpDownPixelsBottom.Maximum = new decimal(new int[] { - 2000, - 0, - 0, - 0}); - this.numericUpDownPixelsBottom.Name = "numericUpDownPixelsBottom"; - this.numericUpDownPixelsBottom.Size = new System.Drawing.Size(66, 20); - this.numericUpDownPixelsBottom.TabIndex = 19; - this.numericUpDownPixelsBottom.Value = new decimal(new int[] { - 127, - 0, - 0, - 0}); - this.numericUpDownPixelsBottom.ValueChanged += new System.EventHandler(this.numericUpDownPixelsBottom_ValueChanged); - // - // label4 - // - this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(8, 18); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(178, 13); - this.label4.TabIndex = 18; - this.label4.Text = "Search number of pixels from bottom"; - // - // pictureBox2 - // - this.pictureBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.pictureBox2.ContextMenuStrip = this.contextMenuStripScreenshot; - this.pictureBox2.Cursor = System.Windows.Forms.Cursors.Cross; - this.pictureBox2.Location = new System.Drawing.Point(11, 37); - this.pictureBox2.Name = "pictureBox2"; - this.pictureBox2.Size = new System.Drawing.Size(843, 373); - this.pictureBox2.TabIndex = 4; - this.pictureBox2.TabStop = false; - this.pictureBox2.Paint += new System.Windows.Forms.PaintEventHandler(this.pictureBox2_Paint); - this.pictureBox2.MouseClick += new System.Windows.Forms.MouseEventHandler(this.pictureBox2_MouseClick); - // - // contextMenuStripScreenshot - // - this.contextMenuStripScreenshot.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.saveImageAsToolStripMenuItem}); - this.contextMenuStripScreenshot.Name = "contextMenuStripScreenshot"; - this.contextMenuStripScreenshot.Size = new System.Drawing.Size(158, 26); - // - // saveImageAsToolStripMenuItem - // - this.saveImageAsToolStripMenuItem.Name = "saveImageAsToolStripMenuItem"; - this.saveImageAsToolStripMenuItem.Size = new System.Drawing.Size(157, 22); - this.saveImageAsToolStripMenuItem.Text = "Save image as..."; - this.saveImageAsToolStripMenuItem.Click += new System.EventHandler(this.saveImageAsToolStripMenuItem_Click); - // - // labelClickOnTextColor - // - this.labelClickOnTextColor.AutoSize = true; - this.labelClickOnTextColor.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelClickOnTextColor.ForeColor = System.Drawing.Color.Red; - this.labelClickOnTextColor.Location = new System.Drawing.Point(325, 59); - this.labelClickOnTextColor.Name = "labelClickOnTextColor"; - this.labelClickOnTextColor.Size = new System.Drawing.Size(110, 13); - this.labelClickOnTextColor.TabIndex = 19; - this.labelClickOnTextColor.Text = "Click on text color"; - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(797, 695); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 25; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(716, 695); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 24; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // labelStatus - // - this.labelStatus.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelStatus.AutoSize = true; - this.labelStatus.Location = new System.Drawing.Point(16, 699); - this.labelStatus.Name = "labelStatus"; - this.labelStatus.Size = new System.Drawing.Size(59, 13); - this.labelStatus.TabIndex = 21; - this.labelStatus.Text = "labelStatus"; - // - // groupBox2 - // - this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBox2.Controls.Add(this.button1); - this.groupBox2.Controls.Add(this.pictureBox2); - this.groupBox2.Controls.Add(this.numericUpDownPixelsBottom); - this.groupBox2.Controls.Add(this.label4); - this.groupBox2.Controls.Add(this.labelClickOnTextColor); - this.groupBox2.Location = new System.Drawing.Point(12, 273); - this.groupBox2.Name = "groupBox2"; - this.groupBox2.Size = new System.Drawing.Size(860, 416); - this.groupBox2.TabIndex = 27; - this.groupBox2.TabStop = false; - this.groupBox2.Text = "Subtitle area (red rectangle)"; - // - // button1 - // - this.button1.Location = new System.Drawing.Point(357, 11); - this.button1.Name = "button1"; - this.button1.Size = new System.Drawing.Size(246, 26); - this.button1.TabIndex = 37; - this.button1.Text = "Take screenshot from video player"; - this.button1.Click += new System.EventHandler(this.button1_Click); - // - // timerRefreshProgressbar - // - this.timerRefreshProgressbar.Tick += new System.EventHandler(this.TimerRefreshProgressbarTick); - // - // label8 - // - this.label8.Location = new System.Drawing.Point(125, 236); - this.label8.Name = "label8"; - this.label8.Size = new System.Drawing.Size(96, 23); - this.label8.TabIndex = 34; - this.label8.Text = "# of subtitles"; - // - // tbBlacks - // - this.tbBlacks.Location = new System.Drawing.Point(229, 236); - this.tbBlacks.Name = "tbBlacks"; - this.tbBlacks.ReadOnly = true; - this.tbBlacks.Size = new System.Drawing.Size(48, 20); - this.tbBlacks.TabIndex = 33; - // - // label9 - // - this.label9.Location = new System.Drawing.Point(125, 209); - this.label9.Name = "label9"; - this.label9.Size = new System.Drawing.Size(100, 23); - this.label9.TabIndex = 32; - this.label9.Text = "Scanning Frame #"; - // - // tbFrameNum - // - this.tbFrameNum.Location = new System.Drawing.Point(229, 209); - this.tbFrameNum.Name = "tbFrameNum"; - this.tbFrameNum.ReadOnly = true; - this.tbFrameNum.Size = new System.Drawing.Size(48, 20); - this.tbFrameNum.TabIndex = 31; - // - // tbFileName - // - this.tbFileName.Location = new System.Drawing.Point(6, 35); - this.tbFileName.Name = "tbFileName"; - this.tbFileName.Size = new System.Drawing.Size(285, 20); - this.tbFileName.TabIndex = 30; - this.tbFileName.Text = "c:\\foo.mpg"; - // - // label10 - // - this.label10.Location = new System.Drawing.Point(6, 16); - this.label10.Name = "label10"; - this.label10.Size = new System.Drawing.Size(72, 16); - this.label10.TabIndex = 29; - this.label10.Text = "Source file"; - // - // StartStop - // - this.StartStop.Location = new System.Drawing.Point(16, 209); - this.StartStop.Name = "StartStop"; - this.StartStop.Size = new System.Drawing.Size(75, 26); - this.StartStop.TabIndex = 28; - this.StartStop.Text = "Start"; - this.StartStop.Click += new System.EventHandler(this.StartStop_Click); - // - // groupBox3 - // - this.groupBox3.Controls.Add(this.label10); - this.groupBox3.Controls.Add(this.tbFileName); - this.groupBox3.Location = new System.Drawing.Point(12, 12); - this.groupBox3.Name = "groupBox3"; - this.groupBox3.Size = new System.Drawing.Size(341, 67); - this.groupBox3.TabIndex = 35; - this.groupBox3.TabStop = false; - this.groupBox3.Text = "Input"; - // - // buttonStop - // - this.buttonStop.Location = new System.Drawing.Point(18, 240); - this.buttonStop.Name = "buttonStop"; - this.buttonStop.Size = new System.Drawing.Size(75, 26); - this.buttonStop.TabIndex = 36; - this.buttonStop.Text = "Stop"; - this.buttonStop.Click += new System.EventHandler(this.buttonStop_Click); - // - // mediaPlayer - // - this.mediaPlayer.AllowDrop = true; - this.mediaPlayer.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.mediaPlayer.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(18)))), ((int)(((byte)(18))))); - this.mediaPlayer.CurrentPosition = 0D; - this.mediaPlayer.FontSizeFactor = 1F; - this.mediaPlayer.LastParagraph = null; - this.mediaPlayer.Location = new System.Drawing.Point(369, 19); - this.mediaPlayer.Margin = new System.Windows.Forms.Padding(0); - this.mediaPlayer.Name = "mediaPlayer"; - this.mediaPlayer.ShowFullscreenButton = true; - this.mediaPlayer.ShowMuteButton = true; - this.mediaPlayer.ShowStopButton = true; - this.mediaPlayer.Size = new System.Drawing.Size(503, 247); - this.mediaPlayer.SmpteMode = false; - this.mediaPlayer.SubtitleText = ""; - this.mediaPlayer.TabIndex = 23; - this.mediaPlayer.TextRightToLeft = System.Windows.Forms.RightToLeft.No; - this.mediaPlayer.VideoHeight = 0; - this.mediaPlayer.VideoPlayer = null; - this.mediaPlayer.VideoWidth = 0; - this.mediaPlayer.Volume = 0D; - // - // HardSubExtract - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(884, 728); - this.Controls.Add(this.buttonStop); - this.Controls.Add(this.groupBox3); - this.Controls.Add(this.label8); - this.Controls.Add(this.StartStop); - this.Controls.Add(this.tbBlacks); - this.Controls.Add(this.label9); - this.Controls.Add(this.tbFrameNum); - this.Controls.Add(this.labelStatus); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.mediaPlayer); - this.Controls.Add(this.groupBox1); - this.Controls.Add(this.groupBox2); - this.KeyPreview = true; - this.MinimumSize = new System.Drawing.Size(900, 700); - this.Name = "HardSubExtract"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Import/OCR burned-in subtitles from video file"; - this.Shown += new System.EventHandler(this.HardSubExtract_Shown); - this.groupBox1.ResumeLayout(false); - this.groupBox1.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxCustomColor)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownCustomMaxDiff)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPixelsBottom)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); - this.contextMenuStripScreenshot.ResumeLayout(false); - this.groupBox2.ResumeLayout(false); - this.groupBox2.PerformLayout(); - this.groupBox3.ResumeLayout(false); - this.groupBox3.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.GroupBox groupBox1; - private System.Windows.Forms.Label label4; - private System.Windows.Forms.PictureBox pictureBox2; - private System.Windows.Forms.Label labelClickOnTextColor; - private System.Windows.Forms.NumericUpDown numericUpDownPixelsBottom; - private Controls.VideoPlayerContainer mediaPlayer; - private System.Windows.Forms.OpenFileDialog openFileDialogVideo; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Label labelStatus; - private System.Windows.Forms.GroupBox groupBox2; - private System.Windows.Forms.Timer timerRefreshProgressbar; - private System.Windows.Forms.Label label8; - private System.Windows.Forms.TextBox tbBlacks; - private System.Windows.Forms.Label label9; - private System.Windows.Forms.TextBox tbFrameNum; - private System.Windows.Forms.TextBox tbFileName; - private System.Windows.Forms.Label label10; - private System.Windows.Forms.Button StartStop; - private System.Windows.Forms.GroupBox groupBox3; - private System.Windows.Forms.CheckBox checkBoxCustomColor; - private System.Windows.Forms.CheckBox checkBoxYellow; - private System.Windows.Forms.NumericUpDown numericUpDownCustomMaxDiff; - private System.Windows.Forms.PictureBox pictureBoxCustomColor; - private System.Windows.Forms.ColorDialog colorDialog1; - private System.Windows.Forms.Button buttonStop; - private System.Windows.Forms.Button button1; - private System.Windows.Forms.Label labelCustomRgb; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.ContextMenuStrip contextMenuStripScreenshot; - private System.Windows.Forms.ToolStripMenuItem saveImageAsToolStripMenuItem; - private System.Windows.Forms.SaveFileDialog saveFileDialog1; - } +namespace Nikse.SubtitleEdit.Forms +{ + partial class HardSubExtract + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.label1 = new System.Windows.Forms.Label(); + this.labelCustomRgb = new System.Windows.Forms.Label(); + this.pictureBoxCustomColor = new System.Windows.Forms.PictureBox(); + this.numericUpDownCustomMaxDiff = new System.Windows.Forms.NumericUpDown(); + this.checkBoxCustomColor = new System.Windows.Forms.CheckBox(); + this.checkBoxYellow = new System.Windows.Forms.CheckBox(); + this.numericUpDownPixelsBottom = new System.Windows.Forms.NumericUpDown(); + this.label4 = new System.Windows.Forms.Label(); + this.pictureBox2 = new System.Windows.Forms.PictureBox(); + this.contextMenuStripScreenshot = new System.Windows.Forms.ContextMenuStrip(this.components); + this.saveImageAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.labelClickOnTextColor = new System.Windows.Forms.Label(); + this.openFileDialogVideo = new System.Windows.Forms.OpenFileDialog(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.labelStatus = new System.Windows.Forms.Label(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.button1 = new System.Windows.Forms.Button(); + this.timerRefreshProgressbar = new System.Windows.Forms.Timer(this.components); + this.label8 = new System.Windows.Forms.Label(); + this.tbBlacks = new System.Windows.Forms.TextBox(); + this.label9 = new System.Windows.Forms.Label(); + this.tbFrameNum = new System.Windows.Forms.TextBox(); + this.tbFileName = new System.Windows.Forms.TextBox(); + this.label10 = new System.Windows.Forms.Label(); + this.StartStop = new System.Windows.Forms.Button(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.colorDialog1 = new System.Windows.Forms.ColorDialog(); + this.buttonStop = new System.Windows.Forms.Button(); + this.mediaPlayer = new Nikse.SubtitleEdit.Controls.VideoPlayerContainer(); + this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog(); + this.groupBox1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxCustomColor)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownCustomMaxDiff)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPixelsBottom)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); + this.contextMenuStripScreenshot.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.label1); + this.groupBox1.Controls.Add(this.labelCustomRgb); + this.groupBox1.Controls.Add(this.pictureBoxCustomColor); + this.groupBox1.Controls.Add(this.numericUpDownCustomMaxDiff); + this.groupBox1.Controls.Add(this.checkBoxCustomColor); + this.groupBox1.Controls.Add(this.checkBoxYellow); + this.groupBox1.Location = new System.Drawing.Point(12, 85); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(341, 117); + this.groupBox1.TabIndex = 0; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Detection options"; + // + // label1 + // + this.label1.Location = new System.Drawing.Point(9, 80); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(101, 16); + this.label1.TabIndex = 31; + this.label1.Text = "Allow diff per RGB"; + // + // labelCustomRgb + // + this.labelCustomRgb.AutoSize = true; + this.labelCustomRgb.Location = new System.Drawing.Point(177, 56); + this.labelCustomRgb.Name = "labelCustomRgb"; + this.labelCustomRgb.Size = new System.Drawing.Size(30, 13); + this.labelCustomRgb.TabIndex = 37; + this.labelCustomRgb.Text = "RGB"; + // + // pictureBoxCustomColor + // + this.pictureBoxCustomColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.pictureBoxCustomColor.Location = new System.Drawing.Point(152, 53); + this.pictureBoxCustomColor.Name = "pictureBoxCustomColor"; + this.pictureBoxCustomColor.Size = new System.Drawing.Size(21, 21); + this.pictureBoxCustomColor.TabIndex = 8; + this.pictureBoxCustomColor.TabStop = false; + this.pictureBoxCustomColor.Click += new System.EventHandler(this.pictureBoxCustomColor_Click); + // + // numericUpDownCustomMaxDiff + // + this.numericUpDownCustomMaxDiff.Location = new System.Drawing.Point(116, 76); + this.numericUpDownCustomMaxDiff.Name = "numericUpDownCustomMaxDiff"; + this.numericUpDownCustomMaxDiff.Size = new System.Drawing.Size(38, 20); + this.numericUpDownCustomMaxDiff.TabIndex = 2; + this.numericUpDownCustomMaxDiff.Value = new decimal(new int[] { + 14, + 0, + 0, + 0}); + // + // checkBoxCustomColor + // + this.checkBoxCustomColor.AutoSize = true; + this.checkBoxCustomColor.Location = new System.Drawing.Point(11, 55); + this.checkBoxCustomColor.Name = "checkBoxCustomColor"; + this.checkBoxCustomColor.Size = new System.Drawing.Size(135, 17); + this.checkBoxCustomColor.TabIndex = 1; + this.checkBoxCustomColor.Text = "Check for custom color"; + this.checkBoxCustomColor.UseVisualStyleBackColor = true; + // + // checkBoxYellow + // + this.checkBoxYellow.AutoSize = true; + this.checkBoxYellow.Checked = true; + this.checkBoxYellow.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxYellow.Location = new System.Drawing.Point(9, 19); + this.checkBoxYellow.Name = "checkBoxYellow"; + this.checkBoxYellow.Size = new System.Drawing.Size(124, 17); + this.checkBoxYellow.TabIndex = 0; + this.checkBoxYellow.Text = "Check for yellow text"; + this.checkBoxYellow.UseVisualStyleBackColor = true; + // + // numericUpDownPixelsBottom + // + this.numericUpDownPixelsBottom.Location = new System.Drawing.Point(192, 16); + this.numericUpDownPixelsBottom.Maximum = new decimal(new int[] { + 2000, + 0, + 0, + 0}); + this.numericUpDownPixelsBottom.Name = "numericUpDownPixelsBottom"; + this.numericUpDownPixelsBottom.Size = new System.Drawing.Size(66, 20); + this.numericUpDownPixelsBottom.TabIndex = 19; + this.numericUpDownPixelsBottom.Value = new decimal(new int[] { + 127, + 0, + 0, + 0}); + this.numericUpDownPixelsBottom.ValueChanged += new System.EventHandler(this.numericUpDownPixelsBottom_ValueChanged); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(8, 18); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(178, 13); + this.label4.TabIndex = 18; + this.label4.Text = "Search number of pixels from bottom"; + // + // pictureBox2 + // + this.pictureBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pictureBox2.ContextMenuStrip = this.contextMenuStripScreenshot; + this.pictureBox2.Cursor = System.Windows.Forms.Cursors.Cross; + this.pictureBox2.Location = new System.Drawing.Point(11, 37); + this.pictureBox2.Name = "pictureBox2"; + this.pictureBox2.Size = new System.Drawing.Size(843, 373); + this.pictureBox2.TabIndex = 4; + this.pictureBox2.TabStop = false; + this.pictureBox2.Paint += new System.Windows.Forms.PaintEventHandler(this.pictureBox2_Paint); + this.pictureBox2.MouseClick += new System.Windows.Forms.MouseEventHandler(this.pictureBox2_MouseClick); + // + // contextMenuStripScreenshot + // + this.contextMenuStripScreenshot.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.saveImageAsToolStripMenuItem}); + this.contextMenuStripScreenshot.Name = "contextMenuStripScreenshot"; + this.contextMenuStripScreenshot.Size = new System.Drawing.Size(158, 26); + // + // saveImageAsToolStripMenuItem + // + this.saveImageAsToolStripMenuItem.Name = "saveImageAsToolStripMenuItem"; + this.saveImageAsToolStripMenuItem.Size = new System.Drawing.Size(157, 22); + this.saveImageAsToolStripMenuItem.Text = "Save image as..."; + this.saveImageAsToolStripMenuItem.Click += new System.EventHandler(this.saveImageAsToolStripMenuItem_Click); + // + // labelClickOnTextColor + // + this.labelClickOnTextColor.AutoSize = true; + this.labelClickOnTextColor.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelClickOnTextColor.ForeColor = System.Drawing.Color.Red; + this.labelClickOnTextColor.Location = new System.Drawing.Point(325, 59); + this.labelClickOnTextColor.Name = "labelClickOnTextColor"; + this.labelClickOnTextColor.Size = new System.Drawing.Size(110, 13); + this.labelClickOnTextColor.TabIndex = 19; + this.labelClickOnTextColor.Text = "Click on text color"; + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(797, 695); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 25; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(716, 695); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 24; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // labelStatus + // + this.labelStatus.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelStatus.AutoSize = true; + this.labelStatus.Location = new System.Drawing.Point(16, 699); + this.labelStatus.Name = "labelStatus"; + this.labelStatus.Size = new System.Drawing.Size(59, 13); + this.labelStatus.TabIndex = 21; + this.labelStatus.Text = "labelStatus"; + // + // groupBox2 + // + this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBox2.Controls.Add(this.button1); + this.groupBox2.Controls.Add(this.pictureBox2); + this.groupBox2.Controls.Add(this.numericUpDownPixelsBottom); + this.groupBox2.Controls.Add(this.label4); + this.groupBox2.Controls.Add(this.labelClickOnTextColor); + this.groupBox2.Location = new System.Drawing.Point(12, 273); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(860, 416); + this.groupBox2.TabIndex = 27; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Subtitle area (red rectangle)"; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(357, 11); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(246, 26); + this.button1.TabIndex = 37; + this.button1.Text = "Take screenshot from video player"; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // timerRefreshProgressbar + // + this.timerRefreshProgressbar.Tick += new System.EventHandler(this.TimerRefreshProgressbarTick); + // + // label8 + // + this.label8.Location = new System.Drawing.Point(125, 236); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(96, 23); + this.label8.TabIndex = 34; + this.label8.Text = "# of subtitles"; + // + // tbBlacks + // + this.tbBlacks.Location = new System.Drawing.Point(229, 236); + this.tbBlacks.Name = "tbBlacks"; + this.tbBlacks.ReadOnly = true; + this.tbBlacks.Size = new System.Drawing.Size(48, 20); + this.tbBlacks.TabIndex = 33; + // + // label9 + // + this.label9.Location = new System.Drawing.Point(125, 209); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(100, 23); + this.label9.TabIndex = 32; + this.label9.Text = "Scanning Frame #"; + // + // tbFrameNum + // + this.tbFrameNum.Location = new System.Drawing.Point(229, 209); + this.tbFrameNum.Name = "tbFrameNum"; + this.tbFrameNum.ReadOnly = true; + this.tbFrameNum.Size = new System.Drawing.Size(48, 20); + this.tbFrameNum.TabIndex = 31; + // + // tbFileName + // + this.tbFileName.Location = new System.Drawing.Point(6, 35); + this.tbFileName.Name = "tbFileName"; + this.tbFileName.Size = new System.Drawing.Size(285, 20); + this.tbFileName.TabIndex = 30; + this.tbFileName.Text = "c:\\foo.mpg"; + // + // label10 + // + this.label10.Location = new System.Drawing.Point(6, 16); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(72, 16); + this.label10.TabIndex = 29; + this.label10.Text = "Source file"; + // + // StartStop + // + this.StartStop.Location = new System.Drawing.Point(16, 209); + this.StartStop.Name = "StartStop"; + this.StartStop.Size = new System.Drawing.Size(75, 26); + this.StartStop.TabIndex = 28; + this.StartStop.Text = "Start"; + this.StartStop.Click += new System.EventHandler(this.StartStop_Click); + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.label10); + this.groupBox3.Controls.Add(this.tbFileName); + this.groupBox3.Location = new System.Drawing.Point(12, 12); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(341, 67); + this.groupBox3.TabIndex = 35; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "Input"; + // + // buttonStop + // + this.buttonStop.Location = new System.Drawing.Point(18, 240); + this.buttonStop.Name = "buttonStop"; + this.buttonStop.Size = new System.Drawing.Size(75, 26); + this.buttonStop.TabIndex = 36; + this.buttonStop.Text = "Stop"; + this.buttonStop.Click += new System.EventHandler(this.buttonStop_Click); + // + // mediaPlayer + // + this.mediaPlayer.AllowDrop = true; + this.mediaPlayer.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.mediaPlayer.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(18)))), ((int)(((byte)(18))))); + this.mediaPlayer.CurrentPosition = 0D; + this.mediaPlayer.FontSizeFactor = 1F; + this.mediaPlayer.LastParagraph = null; + this.mediaPlayer.Location = new System.Drawing.Point(369, 19); + this.mediaPlayer.Margin = new System.Windows.Forms.Padding(0); + this.mediaPlayer.Name = "mediaPlayer"; + this.mediaPlayer.ShowFullscreenButton = true; + this.mediaPlayer.ShowMuteButton = true; + this.mediaPlayer.ShowStopButton = true; + this.mediaPlayer.Size = new System.Drawing.Size(503, 247); + this.mediaPlayer.SmpteMode = false; + this.mediaPlayer.SubtitleText = ""; + this.mediaPlayer.TabIndex = 23; + this.mediaPlayer.TextRightToLeft = System.Windows.Forms.RightToLeft.No; + this.mediaPlayer.VideoHeight = 0; + this.mediaPlayer.VideoPlayer = null; + this.mediaPlayer.VideoWidth = 0; + this.mediaPlayer.Volume = 0D; + // + // HardSubExtract + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(884, 728); + this.Controls.Add(this.buttonStop); + this.Controls.Add(this.groupBox3); + this.Controls.Add(this.label8); + this.Controls.Add(this.StartStop); + this.Controls.Add(this.tbBlacks); + this.Controls.Add(this.label9); + this.Controls.Add(this.tbFrameNum); + this.Controls.Add(this.labelStatus); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.mediaPlayer); + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.groupBox2); + this.KeyPreview = true; + this.MinimumSize = new System.Drawing.Size(900, 700); + this.Name = "HardSubExtract"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Import/OCR burned-in subtitles from video file"; + this.Shown += new System.EventHandler(this.HardSubExtract_Shown); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxCustomColor)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownCustomMaxDiff)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPixelsBottom)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); + this.contextMenuStripScreenshot.ResumeLayout(false); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.PictureBox pictureBox2; + private System.Windows.Forms.Label labelClickOnTextColor; + private System.Windows.Forms.NumericUpDown numericUpDownPixelsBottom; + private Controls.VideoPlayerContainer mediaPlayer; + private System.Windows.Forms.OpenFileDialog openFileDialogVideo; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Label labelStatus; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.Timer timerRefreshProgressbar; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.TextBox tbBlacks; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.TextBox tbFrameNum; + private System.Windows.Forms.TextBox tbFileName; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.Button StartStop; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.CheckBox checkBoxCustomColor; + private System.Windows.Forms.CheckBox checkBoxYellow; + private System.Windows.Forms.NumericUpDown numericUpDownCustomMaxDiff; + private System.Windows.Forms.PictureBox pictureBoxCustomColor; + private System.Windows.Forms.ColorDialog colorDialog1; + private System.Windows.Forms.Button buttonStop; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Label labelCustomRgb; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ContextMenuStrip contextMenuStripScreenshot; + private System.Windows.Forms.ToolStripMenuItem saveImageAsToolStripMenuItem; + private System.Windows.Forms.SaveFileDialog saveFileDialog1; + } } \ No newline at end of file diff --git a/src/Forms/HardSubExtract.cs b/src/ui/Forms/HardSubExtract.cs similarity index 97% rename from src/Forms/HardSubExtract.cs rename to src/ui/Forms/HardSubExtract.cs index 1780282e1..a3d26cee2 100644 --- a/src/Forms/HardSubExtract.cs +++ b/src/ui/Forms/HardSubExtract.cs @@ -1,341 +1,341 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using Nikse.SubtitleEdit.Logic.VideoPlayers; -using System; -using System.Drawing; -using System.IO; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -//using Nikse.SubtitleEdit.Logic.DirectShow.Custom; - -namespace Nikse.SubtitleEdit.Forms -{ - public partial class HardSubExtract : Form - { - // HardExtractCapture cam = null; - private string _videoFileName; - private LibVlcDynamic _libVlc; - private VideoInfo _videoInfo; - //long startMilliseconds = 0; - public Subtitle SubtitleFromOcr; - //private System.Windows.Forms.Timer timer1; - private const int lineChecksWidth = 50; - private const int lineChecksHeight = 25; - public string OcrFileName; - - public HardSubExtract(string videoFileName) - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - _videoFileName = videoFileName; - labelClickOnTextColor.Visible = false; - SubtitleFromOcr = new Subtitle(); - labelStatus.Text = string.Empty; - tbFileName.Text = videoFileName; - pictureBoxCustomColor.BackColor = Color.FromArgb(233, 233, 233); - SetCustumRGB(); - } - - private void HardSubExtract_Shown(object sender, EventArgs e) - { - if (openFileDialogVideo.ShowDialog(this) == DialogResult.OK) - { - _videoFileName = openFileDialogVideo.FileName; - tbFileName.Text = openFileDialogVideo.FileName; - _videoInfo = UiUtil.GetVideoInfo(_videoFileName); - var oldPlayer = Configuration.Settings.General.VideoPlayer; - Configuration.Settings.General.VideoPlayer = "VLC"; - UiUtil.InitializeVideoPlayerAndContainer(_videoFileName, _videoInfo, mediaPlayer, VideoLoaded, null); - Configuration.Settings.General.VideoPlayer = oldPlayer; - _libVlc = mediaPlayer.VideoPlayer as LibVlcDynamic; - } - else - { - DialogResult = DialogResult.Cancel; - } - } - - private void VideoLoaded(object sender, EventArgs e) - { - mediaPlayer.Stop(); - mediaPlayer.Volume = Configuration.Settings.General.VideoPlayerDefaultVolume; - // pictureBox2.Image = GetSnapShot(startMilliseconds); - mediaPlayer.Pause(); - timerRefreshProgressbar.Start(); - pictureBox2.Refresh(); - } - - //private Bitmap GetSnapShot(long milliseconds) - //{ - // string fileName = Path.Combine(_folderName, Guid.NewGuid().ToString() + ".png"); - // _libVlc.CurrentPosition = milliseconds / TimeCode.BaseUnit; - // _libVlc.TakeSnapshot(fileName, (uint)_videoInfo.Width, (uint)_videoInfo.Height); - // int i=0; - // while (i < 100 && !File.Exists(fileName)) - // { - // System.Threading.Thread.Sleep(5); - // Application.DoEvents(); - // i++; - // } - // System.Threading.Thread.Sleep(5); - // Application.DoEvents(); - // Bitmap bmp = null; - // try - // { - // using (var ms = new MemoryStream(File.ReadAllBytes(fileName))) - // { - // ms.Position = 0; - // bmp = ((Bitmap)Bitmap.FromStream(ms)); // avoid locking file - // } - // File.Delete(fileName); - // } - // catch - // { - // } - // return bmp; - //} - - private void pictureBox2_MouseClick(object sender, MouseEventArgs e) - { - if (pictureBox2.Image != null) - { - Bitmap bmp = pictureBox2.Image as Bitmap; - if (bmp != null) - { - pictureBoxCustomColor.BackColor = bmp.GetPixel(e.X, e.Y); - SetCustumRGB(); - } - } - } - - private void pictureBox2_Paint(object sender, PaintEventArgs e) - { - Bitmap bmp = pictureBox2.Image as Bitmap; - if (bmp != null) - { - using (Pen p = new Pen(Brushes.Red)) - { - int value = Convert.ToInt32(numericUpDownPixelsBottom.Value); - if (value > bmp.Height) - { - value = bmp.Height - 2; - } - - e.Graphics.DrawRectangle(p, 0, bmp.Height - value, bmp.Width - 1, bmp.Height - (bmp.Height - value) - 1); - } - } - } - - private void TimerRefreshProgressbarTick(object sender, EventArgs e) - { - mediaPlayer.RefreshProgressBar(); - } - - private void numericUpDownPixelsBottom_ValueChanged(object sender, EventArgs e) - { - pictureBox2.Invalidate(); - } - - private void StartStop_Click(object sender, EventArgs e) - { - //Cursor.Current = Cursors.WaitCursor; - //buttonStop.Visible = true; - //StartStop.Enabled = false; - //cam = new HardExtractCapture(tbFileName.Text, (int)numericUpDownPixelsBottom.Value, checkBoxCustomColor.Checked, checkBoxYellow.Checked, pictureBoxCustomColor.BackColor, (int)numericUpDownCustomMaxDiff.Value); - - //// Start displaying statistics - //this.timer1 = new System.Windows.Forms.Timer(this.components); - //this.timer1.Interval = 1000; - //this.timer1.Tick += new System.EventHandler(this.timer1_Tick); - //timer1.Enabled = true; - //cam.Start(); - //cam.WaitUntilDone(); - //timer1.Enabled = false; - - //// Final update - //tbFrameNum.Text = cam.count.ToString(); - //tbBlacks.Text = cam.blacks.ToString(); - - //string fileNameNoExt = Path.GetTempFileName(); - - //Cursor.Current = Cursors.Default; - - //var sub = new Subtitle(); - //for (int i = 0; i < cam.Images.Count; i++) - //{ - // if (cam.StartTimes.Count > i) - // { - // Paragraph p = new Paragraph(); - // p.StartTime.TotalSeconds = cam.StartTimes[i]; - // if (cam.EndTimes.Count > i) - // { - // p.EndTime.TotalSeconds = cam.EndTimes[i]; - // } - // else - // { - // p.EndTime.TotalSeconds = p.StartTime.TotalSeconds + 2.5; - // } - // p.Text = fileNameNoExt + string.Format("{0:0000}", i) + ".bmp"; - // sub.Paragraphs.Add(p); - // var bmp = cam.Images[i].GetBitmap(); - // bmp.Save(p.Text); - // bmp.Dispose(); - // } - //} - //sub.Renumber(); - //if (sub.Paragraphs.Count > 0) - //{ - // OcrFileName = fileNameNoExt + ".srt"; - // File.WriteAllText(OcrFileName, sub.ToText(new SubRip())); - //} - //lock (this) - //{ - // cam.Dispose(); - // cam = null; - //} - //buttonStop.Visible = false; - //StartStop.Enabled = true; - } - - //private void timer1_Tick(object sender, System.EventArgs e) - //{ - //if (cam != null) - //{ - // tbFrameNum.Text = cam.count.ToString(); - // tbBlacks.Text = cam.blacks.ToString(); - // if (cam.Images.Count > 0) - // { - // var old = pictureBox2.Image as Bitmap; - // pictureBox2.Image = cam.Images[cam.Images.Count - 1].GetBitmap(); - // if (old != null) - // old.Dispose(); - // } - //} - //} - - private void pictureBoxCustomColor_Click(object sender, EventArgs e) - { - colorDialog1.Color = pictureBoxCustomColor.BackColor; - if (colorDialog1.ShowDialog(this) == DialogResult.OK) - { - pictureBoxCustomColor.BackColor = colorDialog1.Color; - SetCustumRGB(); - } - } - - private void buttonOK_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.OK; - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private void buttonStop_Click(object sender, EventArgs e) - { - //if (cam != null) - // cam.Cancel = true; - //buttonStop.Visible = false; - //StartStop.Enabled = true; - } - - private void button1_Click(object sender, EventArgs e) - { - var fileName = Path.Combine(Path.GetTempPath(), Guid.NewGuid() + ".bmp"); - try - { - _libVlc.TakeSnapshot(fileName, (uint)_videoInfo.Width, (uint)_videoInfo.Height); - System.Threading.Thread.Sleep(100); - pictureBox2.Image = Image.FromFile(fileName); - System.Threading.Thread.Sleep(50); - } - catch (FileNotFoundException) - { - // the screenshot was not taken - } - catch - { - // TODO: Avoid catching all exceptions - } - finally - { - // whatever happens delete the screenshot if it exists - File.Delete(fileName); - } - } - - private void SetCustumRGB() - { - labelCustomRgb.Text = string.Format("(Red={0},Green={1},Blue={2})", pictureBoxCustomColor.BackColor.R, pictureBoxCustomColor.BackColor.G, pictureBoxCustomColor.BackColor.B); - } - - private void saveImageAsToolStripMenuItem_Click(object sender, EventArgs e) - { - saveFileDialog1.Title = Configuration.Settings.Language.VobSubOcr.SaveSubtitleImageAs; - saveFileDialog1.AddExtension = true; - saveFileDialog1.FileName = "Image"; - saveFileDialog1.Filter = "PNG image|*.png|BMP image|*.bmp|GIF image|*.gif|TIFF image|*.tiff"; - saveFileDialog1.FilterIndex = 0; - - DialogResult result = saveFileDialog1.ShowDialog(this); - if (result == DialogResult.OK) - { - using (var bmp = pictureBox2.Image as Bitmap) - { - if (bmp == null) - { - MessageBox.Show("No image!"); - return; - } - - try - { - if (saveFileDialog1.FilterIndex == 0) - { - bmp.Save(saveFileDialog1.FileName, System.Drawing.Imaging.ImageFormat.Png); - } - else if (saveFileDialog1.FilterIndex == 1) - { - bmp.Save(saveFileDialog1.FileName); - } - else if (saveFileDialog1.FilterIndex == 2) - { - bmp.Save(saveFileDialog1.FileName, System.Drawing.Imaging.ImageFormat.Gif); - } - else - { - bmp.Save(saveFileDialog1.FileName, System.Drawing.Imaging.ImageFormat.Tiff); - } - } - catch (Exception exception) - { - MessageBox.Show(exception.Message); - } - } - } - } - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - if (_libVlc != null) - { - _libVlc.Dispose(); - _libVlc = null; - } - } - base.Dispose(disposing); - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using Nikse.SubtitleEdit.Logic.VideoPlayers; +using System; +using System.Drawing; +using System.IO; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +//using Nikse.SubtitleEdit.Logic.DirectShow.Custom; + +namespace Nikse.SubtitleEdit.Forms +{ + public partial class HardSubExtract : Form + { + // HardExtractCapture cam = null; + private string _videoFileName; + private LibVlcDynamic _libVlc; + private VideoInfo _videoInfo; + //long startMilliseconds = 0; + public Subtitle SubtitleFromOcr; + //private System.Windows.Forms.Timer timer1; + private const int lineChecksWidth = 50; + private const int lineChecksHeight = 25; + public string OcrFileName; + + public HardSubExtract(string videoFileName) + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + _videoFileName = videoFileName; + labelClickOnTextColor.Visible = false; + SubtitleFromOcr = new Subtitle(); + labelStatus.Text = string.Empty; + tbFileName.Text = videoFileName; + pictureBoxCustomColor.BackColor = Color.FromArgb(233, 233, 233); + SetCustumRGB(); + } + + private void HardSubExtract_Shown(object sender, EventArgs e) + { + if (openFileDialogVideo.ShowDialog(this) == DialogResult.OK) + { + _videoFileName = openFileDialogVideo.FileName; + tbFileName.Text = openFileDialogVideo.FileName; + _videoInfo = UiUtil.GetVideoInfo(_videoFileName); + var oldPlayer = Configuration.Settings.General.VideoPlayer; + Configuration.Settings.General.VideoPlayer = "VLC"; + UiUtil.InitializeVideoPlayerAndContainer(_videoFileName, _videoInfo, mediaPlayer, VideoLoaded, null); + Configuration.Settings.General.VideoPlayer = oldPlayer; + _libVlc = mediaPlayer.VideoPlayer as LibVlcDynamic; + } + else + { + DialogResult = DialogResult.Cancel; + } + } + + private void VideoLoaded(object sender, EventArgs e) + { + mediaPlayer.Stop(); + mediaPlayer.Volume = Configuration.Settings.General.VideoPlayerDefaultVolume; + // pictureBox2.Image = GetSnapShot(startMilliseconds); + mediaPlayer.Pause(); + timerRefreshProgressbar.Start(); + pictureBox2.Refresh(); + } + + //private Bitmap GetSnapShot(long milliseconds) + //{ + // string fileName = Path.Combine(_folderName, Guid.NewGuid().ToString() + ".png"); + // _libVlc.CurrentPosition = milliseconds / TimeCode.BaseUnit; + // _libVlc.TakeSnapshot(fileName, (uint)_videoInfo.Width, (uint)_videoInfo.Height); + // int i=0; + // while (i < 100 && !File.Exists(fileName)) + // { + // System.Threading.Thread.Sleep(5); + // Application.DoEvents(); + // i++; + // } + // System.Threading.Thread.Sleep(5); + // Application.DoEvents(); + // Bitmap bmp = null; + // try + // { + // using (var ms = new MemoryStream(File.ReadAllBytes(fileName))) + // { + // ms.Position = 0; + // bmp = ((Bitmap)Bitmap.FromStream(ms)); // avoid locking file + // } + // File.Delete(fileName); + // } + // catch + // { + // } + // return bmp; + //} + + private void pictureBox2_MouseClick(object sender, MouseEventArgs e) + { + if (pictureBox2.Image != null) + { + Bitmap bmp = pictureBox2.Image as Bitmap; + if (bmp != null) + { + pictureBoxCustomColor.BackColor = bmp.GetPixel(e.X, e.Y); + SetCustumRGB(); + } + } + } + + private void pictureBox2_Paint(object sender, PaintEventArgs e) + { + Bitmap bmp = pictureBox2.Image as Bitmap; + if (bmp != null) + { + using (Pen p = new Pen(Brushes.Red)) + { + int value = Convert.ToInt32(numericUpDownPixelsBottom.Value); + if (value > bmp.Height) + { + value = bmp.Height - 2; + } + + e.Graphics.DrawRectangle(p, 0, bmp.Height - value, bmp.Width - 1, bmp.Height - (bmp.Height - value) - 1); + } + } + } + + private void TimerRefreshProgressbarTick(object sender, EventArgs e) + { + mediaPlayer.RefreshProgressBar(); + } + + private void numericUpDownPixelsBottom_ValueChanged(object sender, EventArgs e) + { + pictureBox2.Invalidate(); + } + + private void StartStop_Click(object sender, EventArgs e) + { + //Cursor.Current = Cursors.WaitCursor; + //buttonStop.Visible = true; + //StartStop.Enabled = false; + //cam = new HardExtractCapture(tbFileName.Text, (int)numericUpDownPixelsBottom.Value, checkBoxCustomColor.Checked, checkBoxYellow.Checked, pictureBoxCustomColor.BackColor, (int)numericUpDownCustomMaxDiff.Value); + + //// Start displaying statistics + //this.timer1 = new System.Windows.Forms.Timer(this.components); + //this.timer1.Interval = 1000; + //this.timer1.Tick += new System.EventHandler(this.timer1_Tick); + //timer1.Enabled = true; + //cam.Start(); + //cam.WaitUntilDone(); + //timer1.Enabled = false; + + //// Final update + //tbFrameNum.Text = cam.count.ToString(); + //tbBlacks.Text = cam.blacks.ToString(); + + //string fileNameNoExt = Path.GetTempFileName(); + + //Cursor.Current = Cursors.Default; + + //var sub = new Subtitle(); + //for (int i = 0; i < cam.Images.Count; i++) + //{ + // if (cam.StartTimes.Count > i) + // { + // Paragraph p = new Paragraph(); + // p.StartTime.TotalSeconds = cam.StartTimes[i]; + // if (cam.EndTimes.Count > i) + // { + // p.EndTime.TotalSeconds = cam.EndTimes[i]; + // } + // else + // { + // p.EndTime.TotalSeconds = p.StartTime.TotalSeconds + 2.5; + // } + // p.Text = fileNameNoExt + string.Format("{0:0000}", i) + ".bmp"; + // sub.Paragraphs.Add(p); + // var bmp = cam.Images[i].GetBitmap(); + // bmp.Save(p.Text); + // bmp.Dispose(); + // } + //} + //sub.Renumber(); + //if (sub.Paragraphs.Count > 0) + //{ + // OcrFileName = fileNameNoExt + ".srt"; + // File.WriteAllText(OcrFileName, sub.ToText(new SubRip())); + //} + //lock (this) + //{ + // cam.Dispose(); + // cam = null; + //} + //buttonStop.Visible = false; + //StartStop.Enabled = true; + } + + //private void timer1_Tick(object sender, System.EventArgs e) + //{ + //if (cam != null) + //{ + // tbFrameNum.Text = cam.count.ToString(); + // tbBlacks.Text = cam.blacks.ToString(); + // if (cam.Images.Count > 0) + // { + // var old = pictureBox2.Image as Bitmap; + // pictureBox2.Image = cam.Images[cam.Images.Count - 1].GetBitmap(); + // if (old != null) + // old.Dispose(); + // } + //} + //} + + private void pictureBoxCustomColor_Click(object sender, EventArgs e) + { + colorDialog1.Color = pictureBoxCustomColor.BackColor; + if (colorDialog1.ShowDialog(this) == DialogResult.OK) + { + pictureBoxCustomColor.BackColor = colorDialog1.Color; + SetCustumRGB(); + } + } + + private void buttonOK_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.OK; + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void buttonStop_Click(object sender, EventArgs e) + { + //if (cam != null) + // cam.Cancel = true; + //buttonStop.Visible = false; + //StartStop.Enabled = true; + } + + private void button1_Click(object sender, EventArgs e) + { + var fileName = Path.Combine(Path.GetTempPath(), Guid.NewGuid() + ".bmp"); + try + { + _libVlc.TakeSnapshot(fileName, (uint)_videoInfo.Width, (uint)_videoInfo.Height); + System.Threading.Thread.Sleep(100); + pictureBox2.Image = Image.FromFile(fileName); + System.Threading.Thread.Sleep(50); + } + catch (FileNotFoundException) + { + // the screenshot was not taken + } + catch + { + // TODO: Avoid catching all exceptions + } + finally + { + // whatever happens delete the screenshot if it exists + File.Delete(fileName); + } + } + + private void SetCustumRGB() + { + labelCustomRgb.Text = string.Format("(Red={0},Green={1},Blue={2})", pictureBoxCustomColor.BackColor.R, pictureBoxCustomColor.BackColor.G, pictureBoxCustomColor.BackColor.B); + } + + private void saveImageAsToolStripMenuItem_Click(object sender, EventArgs e) + { + saveFileDialog1.Title = Configuration.Settings.Language.VobSubOcr.SaveSubtitleImageAs; + saveFileDialog1.AddExtension = true; + saveFileDialog1.FileName = "Image"; + saveFileDialog1.Filter = "PNG image|*.png|BMP image|*.bmp|GIF image|*.gif|TIFF image|*.tiff"; + saveFileDialog1.FilterIndex = 0; + + DialogResult result = saveFileDialog1.ShowDialog(this); + if (result == DialogResult.OK) + { + using (var bmp = pictureBox2.Image as Bitmap) + { + if (bmp == null) + { + MessageBox.Show("No image!"); + return; + } + + try + { + if (saveFileDialog1.FilterIndex == 0) + { + bmp.Save(saveFileDialog1.FileName, System.Drawing.Imaging.ImageFormat.Png); + } + else if (saveFileDialog1.FilterIndex == 1) + { + bmp.Save(saveFileDialog1.FileName); + } + else if (saveFileDialog1.FilterIndex == 2) + { + bmp.Save(saveFileDialog1.FileName, System.Drawing.Imaging.ImageFormat.Gif); + } + else + { + bmp.Save(saveFileDialog1.FileName, System.Drawing.Imaging.ImageFormat.Tiff); + } + } + catch (Exception exception) + { + MessageBox.Show(exception.Message); + } + } + } + } + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + if (_libVlc != null) + { + _libVlc.Dispose(); + _libVlc = null; + } + } + base.Dispose(disposing); + } + + } +} diff --git a/src/Forms/HardSubExtract.resx b/src/ui/Forms/HardSubExtract.resx similarity index 98% rename from src/Forms/HardSubExtract.resx rename to src/ui/Forms/HardSubExtract.resx index d3f80ccd3..ca09855a0 100644 --- a/src/Forms/HardSubExtract.resx +++ b/src/ui/Forms/HardSubExtract.resx @@ -1,135 +1,135 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 489, 17 - - - 17, 17 - - - 182, 17 - - - 368, 17 - - - 698, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 489, 17 + + + 17, 17 + + + 182, 17 + + + 368, 17 + + + 698, 17 + \ No newline at end of file diff --git a/src/Forms/ImportCdg.Designer.cs b/src/ui/Forms/ImportCdg.Designer.cs similarity index 100% rename from src/Forms/ImportCdg.Designer.cs rename to src/ui/Forms/ImportCdg.Designer.cs diff --git a/src/Forms/ImportCdg.cs b/src/ui/Forms/ImportCdg.cs similarity index 100% rename from src/Forms/ImportCdg.cs rename to src/ui/Forms/ImportCdg.cs diff --git a/src/Forms/ImportCdg.resx b/src/ui/Forms/ImportCdg.resx similarity index 100% rename from src/Forms/ImportCdg.resx rename to src/ui/Forms/ImportCdg.resx diff --git a/src/Forms/ImportFinalDraft.Designer.cs b/src/ui/Forms/ImportFinalDraft.Designer.cs similarity index 100% rename from src/Forms/ImportFinalDraft.Designer.cs rename to src/ui/Forms/ImportFinalDraft.Designer.cs diff --git a/src/Forms/ImportFinalDraft.cs b/src/ui/Forms/ImportFinalDraft.cs similarity index 100% rename from src/Forms/ImportFinalDraft.cs rename to src/ui/Forms/ImportFinalDraft.cs diff --git a/src/Forms/Ocr/GetTesseract302Dictionaries.resx b/src/ui/Forms/ImportFinalDraft.resx similarity index 100% rename from src/Forms/Ocr/GetTesseract302Dictionaries.resx rename to src/ui/Forms/ImportFinalDraft.resx diff --git a/src/Forms/ImportImages.Designer.cs b/src/ui/Forms/ImportImages.Designer.cs similarity index 98% rename from src/Forms/ImportImages.Designer.cs rename to src/ui/Forms/ImportImages.Designer.cs index 792c6c596..1f2efec2c 100644 --- a/src/Forms/ImportImages.Designer.cs +++ b/src/ui/Forms/ImportImages.Designer.cs @@ -1,225 +1,225 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class ImportImages - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.groupBoxInput = new System.Windows.Forms.GroupBox(); - this.buttonInputBrowse = new System.Windows.Forms.Button(); - this.labelChooseInputFiles = new System.Windows.Forms.Label(); - this.listViewInputFiles = new System.Windows.Forms.ListView(); - this.columnHeaderFName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderSize = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderStartTime = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderEndTime = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderDuration = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); - this.removeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.removeAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.buttonOK = new System.Windows.Forms.Button(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); - this.groupBoxInput.SuspendLayout(); - this.contextMenuStrip1.SuspendLayout(); - this.SuspendLayout(); - // - // groupBoxInput - // - this.groupBoxInput.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxInput.Controls.Add(this.buttonInputBrowse); - this.groupBoxInput.Controls.Add(this.labelChooseInputFiles); - this.groupBoxInput.Controls.Add(this.listViewInputFiles); - this.groupBoxInput.Location = new System.Drawing.Point(12, 12); - this.groupBoxInput.Name = "groupBoxInput"; - this.groupBoxInput.Size = new System.Drawing.Size(1095, 552); - this.groupBoxInput.TabIndex = 1; - this.groupBoxInput.TabStop = false; - this.groupBoxInput.Text = "Input"; - // - // buttonInputBrowse - // - this.buttonInputBrowse.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonInputBrowse.Location = new System.Drawing.Point(1060, 41); - this.buttonInputBrowse.Name = "buttonInputBrowse"; - this.buttonInputBrowse.Size = new System.Drawing.Size(26, 23); - this.buttonInputBrowse.TabIndex = 3; - this.buttonInputBrowse.Text = "..."; - this.buttonInputBrowse.UseVisualStyleBackColor = true; - this.buttonInputBrowse.Click += new System.EventHandler(this.buttonInputBrowse_Click); - // - // labelChooseInputFiles - // - this.labelChooseInputFiles.AutoSize = true; - this.labelChooseInputFiles.Location = new System.Drawing.Point(5, 25); - this.labelChooseInputFiles.Name = "labelChooseInputFiles"; - this.labelChooseInputFiles.Size = new System.Drawing.Size(202, 13); - this.labelChooseInputFiles.TabIndex = 0; - this.labelChooseInputFiles.Text = "Choose input files (browse or drag-n-drop)"; - // - // listViewInputFiles - // - this.listViewInputFiles.AllowDrop = true; - this.listViewInputFiles.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.listViewInputFiles.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeaderFName, - this.columnHeaderSize, - this.columnHeaderStartTime, - this.columnHeaderEndTime, - this.columnHeaderDuration}); - this.listViewInputFiles.ContextMenuStrip = this.contextMenuStrip1; - this.listViewInputFiles.FullRowSelect = true; - this.listViewInputFiles.HideSelection = false; - this.listViewInputFiles.Location = new System.Drawing.Point(8, 41); - this.listViewInputFiles.Name = "listViewInputFiles"; - this.listViewInputFiles.Size = new System.Drawing.Size(1049, 497); - this.listViewInputFiles.TabIndex = 2; - this.listViewInputFiles.UseCompatibleStateImageBehavior = false; - this.listViewInputFiles.View = System.Windows.Forms.View.Details; - this.listViewInputFiles.DragDrop += new System.Windows.Forms.DragEventHandler(this.listViewInputFiles_DragDrop); - this.listViewInputFiles.DragEnter += new System.Windows.Forms.DragEventHandler(this.listViewInputFiles_DragEnter); - // - // columnHeaderFName - // - this.columnHeaderFName.Text = "File name"; - this.columnHeaderFName.Width = 600; - // - // columnHeaderSize - // - this.columnHeaderSize.Text = "Size"; - this.columnHeaderSize.Width = 75; - // - // columnHeaderStartTime - // - this.columnHeaderStartTime.Text = "Start time"; - this.columnHeaderStartTime.Width = 120; - // - // columnHeaderEndTime - // - this.columnHeaderEndTime.Text = "End time"; - this.columnHeaderEndTime.Width = 120; - // - // columnHeaderDuration - // - this.columnHeaderDuration.Text = "Duration"; - this.columnHeaderDuration.Width = 100; - // - // contextMenuStrip1 - // - this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.removeToolStripMenuItem, - this.removeAllToolStripMenuItem}); - this.contextMenuStrip1.Name = "contextMenuStrip1"; - this.contextMenuStrip1.Size = new System.Drawing.Size(133, 48); - this.contextMenuStrip1.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStrip1_Opening); - // - // removeToolStripMenuItem - // - this.removeToolStripMenuItem.Name = "removeToolStripMenuItem"; - this.removeToolStripMenuItem.Size = new System.Drawing.Size(132, 22); - this.removeToolStripMenuItem.Text = "Remove"; - this.removeToolStripMenuItem.Click += new System.EventHandler(this.removeToolStripMenuItem_Click); - // - // removeAllToolStripMenuItem - // - this.removeAllToolStripMenuItem.Name = "removeAllToolStripMenuItem"; - this.removeAllToolStripMenuItem.Size = new System.Drawing.Size(132, 22); - this.removeAllToolStripMenuItem.Text = "Remove all"; - this.removeAllToolStripMenuItem.Click += new System.EventHandler(this.removeAllToolStripMenuItem_Click); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.Location = new System.Drawing.Point(951, 570); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 7; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.Location = new System.Drawing.Point(1032, 570); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 8; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // openFileDialog1 - // - this.openFileDialog1.FileName = "openFileDialog1"; - // - // ImportImages - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(1119, 603); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.groupBoxInput); - this.KeyPreview = true; - this.Name = "ImportImages"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "ImportImages"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ImportImages_KeyDown); - this.groupBoxInput.ResumeLayout(false); - this.groupBoxInput.PerformLayout(); - this.contextMenuStrip1.ResumeLayout(false); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.GroupBox groupBoxInput; - private System.Windows.Forms.Button buttonInputBrowse; - private System.Windows.Forms.Label labelChooseInputFiles; - private System.Windows.Forms.ListView listViewInputFiles; - private System.Windows.Forms.ColumnHeader columnHeaderFName; - private System.Windows.Forms.ColumnHeader columnHeaderSize; - private System.Windows.Forms.ColumnHeader columnHeaderStartTime; - private System.Windows.Forms.ColumnHeader columnHeaderEndTime; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.OpenFileDialog openFileDialog1; - private System.Windows.Forms.ColumnHeader columnHeaderDuration; - private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; - private System.Windows.Forms.ToolStripMenuItem removeToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem removeAllToolStripMenuItem; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class ImportImages + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.groupBoxInput = new System.Windows.Forms.GroupBox(); + this.buttonInputBrowse = new System.Windows.Forms.Button(); + this.labelChooseInputFiles = new System.Windows.Forms.Label(); + this.listViewInputFiles = new System.Windows.Forms.ListView(); + this.columnHeaderFName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderSize = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderStartTime = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderEndTime = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderDuration = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); + this.removeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.removeAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.buttonOK = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); + this.groupBoxInput.SuspendLayout(); + this.contextMenuStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // groupBoxInput + // + this.groupBoxInput.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxInput.Controls.Add(this.buttonInputBrowse); + this.groupBoxInput.Controls.Add(this.labelChooseInputFiles); + this.groupBoxInput.Controls.Add(this.listViewInputFiles); + this.groupBoxInput.Location = new System.Drawing.Point(12, 12); + this.groupBoxInput.Name = "groupBoxInput"; + this.groupBoxInput.Size = new System.Drawing.Size(1095, 552); + this.groupBoxInput.TabIndex = 1; + this.groupBoxInput.TabStop = false; + this.groupBoxInput.Text = "Input"; + // + // buttonInputBrowse + // + this.buttonInputBrowse.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.buttonInputBrowse.Location = new System.Drawing.Point(1060, 41); + this.buttonInputBrowse.Name = "buttonInputBrowse"; + this.buttonInputBrowse.Size = new System.Drawing.Size(26, 23); + this.buttonInputBrowse.TabIndex = 3; + this.buttonInputBrowse.Text = "..."; + this.buttonInputBrowse.UseVisualStyleBackColor = true; + this.buttonInputBrowse.Click += new System.EventHandler(this.buttonInputBrowse_Click); + // + // labelChooseInputFiles + // + this.labelChooseInputFiles.AutoSize = true; + this.labelChooseInputFiles.Location = new System.Drawing.Point(5, 25); + this.labelChooseInputFiles.Name = "labelChooseInputFiles"; + this.labelChooseInputFiles.Size = new System.Drawing.Size(202, 13); + this.labelChooseInputFiles.TabIndex = 0; + this.labelChooseInputFiles.Text = "Choose input files (browse or drag-n-drop)"; + // + // listViewInputFiles + // + this.listViewInputFiles.AllowDrop = true; + this.listViewInputFiles.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listViewInputFiles.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeaderFName, + this.columnHeaderSize, + this.columnHeaderStartTime, + this.columnHeaderEndTime, + this.columnHeaderDuration}); + this.listViewInputFiles.ContextMenuStrip = this.contextMenuStrip1; + this.listViewInputFiles.FullRowSelect = true; + this.listViewInputFiles.HideSelection = false; + this.listViewInputFiles.Location = new System.Drawing.Point(8, 41); + this.listViewInputFiles.Name = "listViewInputFiles"; + this.listViewInputFiles.Size = new System.Drawing.Size(1049, 497); + this.listViewInputFiles.TabIndex = 2; + this.listViewInputFiles.UseCompatibleStateImageBehavior = false; + this.listViewInputFiles.View = System.Windows.Forms.View.Details; + this.listViewInputFiles.DragDrop += new System.Windows.Forms.DragEventHandler(this.listViewInputFiles_DragDrop); + this.listViewInputFiles.DragEnter += new System.Windows.Forms.DragEventHandler(this.listViewInputFiles_DragEnter); + // + // columnHeaderFName + // + this.columnHeaderFName.Text = "File name"; + this.columnHeaderFName.Width = 600; + // + // columnHeaderSize + // + this.columnHeaderSize.Text = "Size"; + this.columnHeaderSize.Width = 75; + // + // columnHeaderStartTime + // + this.columnHeaderStartTime.Text = "Start time"; + this.columnHeaderStartTime.Width = 120; + // + // columnHeaderEndTime + // + this.columnHeaderEndTime.Text = "End time"; + this.columnHeaderEndTime.Width = 120; + // + // columnHeaderDuration + // + this.columnHeaderDuration.Text = "Duration"; + this.columnHeaderDuration.Width = 100; + // + // contextMenuStrip1 + // + this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.removeToolStripMenuItem, + this.removeAllToolStripMenuItem}); + this.contextMenuStrip1.Name = "contextMenuStrip1"; + this.contextMenuStrip1.Size = new System.Drawing.Size(133, 48); + this.contextMenuStrip1.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStrip1_Opening); + // + // removeToolStripMenuItem + // + this.removeToolStripMenuItem.Name = "removeToolStripMenuItem"; + this.removeToolStripMenuItem.Size = new System.Drawing.Size(132, 22); + this.removeToolStripMenuItem.Text = "Remove"; + this.removeToolStripMenuItem.Click += new System.EventHandler(this.removeToolStripMenuItem_Click); + // + // removeAllToolStripMenuItem + // + this.removeAllToolStripMenuItem.Name = "removeAllToolStripMenuItem"; + this.removeAllToolStripMenuItem.Size = new System.Drawing.Size(132, 22); + this.removeAllToolStripMenuItem.Text = "Remove all"; + this.removeAllToolStripMenuItem.Click += new System.EventHandler(this.removeAllToolStripMenuItem_Click); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.Location = new System.Drawing.Point(951, 570); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 7; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.Location = new System.Drawing.Point(1032, 570); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 8; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // openFileDialog1 + // + this.openFileDialog1.FileName = "openFileDialog1"; + // + // ImportImages + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1119, 603); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.groupBoxInput); + this.KeyPreview = true; + this.Name = "ImportImages"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "ImportImages"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ImportImages_KeyDown); + this.groupBoxInput.ResumeLayout(false); + this.groupBoxInput.PerformLayout(); + this.contextMenuStrip1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBoxInput; + private System.Windows.Forms.Button buttonInputBrowse; + private System.Windows.Forms.Label labelChooseInputFiles; + private System.Windows.Forms.ListView listViewInputFiles; + private System.Windows.Forms.ColumnHeader columnHeaderFName; + private System.Windows.Forms.ColumnHeader columnHeaderSize; + private System.Windows.Forms.ColumnHeader columnHeaderStartTime; + private System.Windows.Forms.ColumnHeader columnHeaderEndTime; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.OpenFileDialog openFileDialog1; + private System.Windows.Forms.ColumnHeader columnHeaderDuration; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; + private System.Windows.Forms.ToolStripMenuItem removeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem removeAllToolStripMenuItem; + } } \ No newline at end of file diff --git a/src/Forms/ImportImages.cs b/src/ui/Forms/ImportImages.cs similarity index 97% rename from src/Forms/ImportImages.cs rename to src/ui/Forms/ImportImages.cs index 2cb3ce898..fc170fc70 100644 --- a/src/Forms/ImportImages.cs +++ b/src/ui/Forms/ImportImages.cs @@ -1,215 +1,215 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.IO; -using System.Text.RegularExpressions; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; -using Nikse.SubtitleEdit.Core.Enums; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class ImportImages : PositionAndSizeForm - { - // 0_00_01_042__0_00_03_919_01.jpeg - private static readonly Regex TimeCodeFormat1 = new Regex(@"^\d+_\d+_\d+_\d+__\d+_\d+_\d+_\d+_\d+$", RegexOptions.Compiled); - private static readonly Regex TimeCodeFormat2 = new Regex(@"^\d+_\d+_\d+_\d+__\d+_\d+_\d+_\d+$", RegexOptions.Compiled); - - public Subtitle Subtitle { get; private set; } - private readonly HashSet _filesAlreadyInList; - public ImportImages() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - Subtitle = new Subtitle(); - Text = Configuration.Settings.Language.ImportImages.Title; - groupBoxInput.Text = Configuration.Settings.Language.ImportImages.Input; - labelChooseInputFiles.Text = Configuration.Settings.Language.ImportImages.InputDescription; - removeToolStripMenuItem.Text = Configuration.Settings.Language.ImportImages.Remove; - removeAllToolStripMenuItem.Text = Configuration.Settings.Language.ImportImages.RemoveAll; - columnHeaderFName.Text = Configuration.Settings.Language.JoinSubtitles.FileName; - columnHeaderSize.Text = Configuration.Settings.Language.General.Size; - columnHeaderStartTime.Text = Configuration.Settings.Language.General.StartTime; - columnHeaderEndTime.Text = Configuration.Settings.Language.General.EndTime; - columnHeaderDuration.Text = Configuration.Settings.Language.General.Duration; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - _filesAlreadyInList = new HashSet(); - } - - private void buttonInputBrowse_Click(object sender, EventArgs e) - { - buttonInputBrowse.Enabled = false; - openFileDialog1.FileName = string.Empty; - openFileDialog1.Filter = Configuration.Settings.Language.ImportImages.ImageFiles + "|*.png;*.jpg;*.jpeg;*.bmp;*.gif;*.tif;*.tiff"; - openFileDialog1.Multiselect = true; - if (openFileDialog1.ShowDialog(this) == DialogResult.OK) - { - foreach (string fileName in openFileDialog1.FileNames) - { - if (!_filesAlreadyInList.Contains(fileName)) - { - AddInputFile(fileName); - } - } - } - buttonInputBrowse.Enabled = true; - } - - private void AddInputFile(string fileName) - { - try - { - var fi = new FileInfo(fileName); - var item = new ListViewItem(fileName); - item.SubItems.Add(Utilities.FormatBytesToDisplayFileSize(fi.Length)); - var ext = fi.Extension.ToLowerInvariant(); - if (ext == ".png" || ext == ".jpg" || ext == ".jpeg" || ext == ".bmp" || ext == ".gif" || ext == ".tif" || ext == ".tiff") - { - _filesAlreadyInList.Add(fileName); - SetTimeCodes(fileName, item); - listViewInputFiles.Items.Add(item); - } - } - catch - { - // ignored - } - } - - private static void SetTimeCodes(string fileName, ListViewItem item) - { - string name = Path.GetFileNameWithoutExtension(fileName); - var p = new Paragraph(); - SetEndTimeAndStartTime(name, p); - item.SubItems.Add(p.StartTime.ToString()); - item.SubItems.Add(p.EndTime.ToString()); - item.SubItems.Add(p.Duration.ToShortString()); - } - - public static void SetEndTimeAndStartTime(string name, Paragraph p) - { - if (name.Contains("-to-")) - { - var arr = name.Replace("-to-", "_").Split('_'); - if (arr.Length == 3 && int.TryParse(arr[1], out var startTime) && int.TryParse(arr[2], out var endTime)) - { - p.StartTime.TotalMilliseconds = startTime; - p.EndTime.TotalMilliseconds = endTime; - } - } - else if (TimeCodeFormat1.IsMatch(name) || TimeCodeFormat2.IsMatch(name)) - { - var arr = name.Replace("__", "_").Split('_'); - if (arr.Length >= 8) - { - try - { - p.StartTime = new TimeCode(int.Parse(arr[0]), int.Parse(arr[1]), int.Parse(arr[2]), int.Parse(arr[3])); - p.EndTime = new TimeCode(int.Parse(arr[4]), int.Parse(arr[5]), int.Parse(arr[6]), int.Parse(arr[7])); - } - catch (Exception) - { - // ignored - } - } - } - } - - private void buttonOK_Click(object sender, EventArgs e) - { - foreach (ListViewItem item in listViewInputFiles.Items) - { - var p = new Paragraph { Text = item.Text }; - string name = Path.GetFileNameWithoutExtension(p.Text); - SetEndTimeAndStartTime(name, p); - Subtitle.Paragraphs.Add(p); - } - Subtitle.Sort(SubtitleSortCriteria.StartTime); - DialogResult = DialogResult.OK; - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private void listViewInputFiles_DragEnter(object sender, DragEventArgs e) - { - if (e.Data.GetDataPresent(DataFormats.FileDrop, false)) - { - e.Effect = DragDropEffects.All; - } - } - - private void listViewInputFiles_DragDrop(object sender, DragEventArgs e) - { - var fileNames = (string[])e.Data.GetData(DataFormats.FileDrop); - foreach (string fileName in fileNames) - { - AddInputFile(fileName); - } - } - - private void ImportImages_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - else if (e.KeyData == (Keys.Control | Keys.O)) - { - buttonInputBrowse_Click(null, EventArgs.Empty); - } - } - - private void contextMenuStrip1_Opening(object sender, System.ComponentModel.CancelEventArgs e) - { - if (listViewInputFiles.Items.Count == 0) - { - e.Cancel = true; - } - else - { - removeToolStripMenuItem.Visible = listViewInputFiles.SelectedItems.Count > 0; - } - } - - private void RemoveSelection(bool removeAll = false) - { - if (listViewInputFiles.Items.Count == 0) - { - return; - } - - if (removeAll) - { - foreach (ListViewItem item in listViewInputFiles.Items) - { - item.Remove(); - _filesAlreadyInList.Remove(item.Text); - } - } - else if (listViewInputFiles.SelectedItems.Count > 0) - { - foreach (ListViewItem item in listViewInputFiles.SelectedItems) - { - item.Remove(); - _filesAlreadyInList.Remove(item.Text); - } - } - } - - private void removeToolStripMenuItem_Click(object sender, EventArgs e) - { - RemoveSelection(); - } - - private void removeAllToolStripMenuItem_Click(object sender, EventArgs e) - { - RemoveSelection(true); - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.IO; +using System.Text.RegularExpressions; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Enums; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class ImportImages : PositionAndSizeForm + { + // 0_00_01_042__0_00_03_919_01.jpeg + private static readonly Regex TimeCodeFormat1 = new Regex(@"^\d+_\d+_\d+_\d+__\d+_\d+_\d+_\d+_\d+$", RegexOptions.Compiled); + private static readonly Regex TimeCodeFormat2 = new Regex(@"^\d+_\d+_\d+_\d+__\d+_\d+_\d+_\d+$", RegexOptions.Compiled); + + public Subtitle Subtitle { get; private set; } + private readonly HashSet _filesAlreadyInList; + public ImportImages() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + Subtitle = new Subtitle(); + Text = Configuration.Settings.Language.ImportImages.Title; + groupBoxInput.Text = Configuration.Settings.Language.ImportImages.Input; + labelChooseInputFiles.Text = Configuration.Settings.Language.ImportImages.InputDescription; + removeToolStripMenuItem.Text = Configuration.Settings.Language.ImportImages.Remove; + removeAllToolStripMenuItem.Text = Configuration.Settings.Language.ImportImages.RemoveAll; + columnHeaderFName.Text = Configuration.Settings.Language.JoinSubtitles.FileName; + columnHeaderSize.Text = Configuration.Settings.Language.General.Size; + columnHeaderStartTime.Text = Configuration.Settings.Language.General.StartTime; + columnHeaderEndTime.Text = Configuration.Settings.Language.General.EndTime; + columnHeaderDuration.Text = Configuration.Settings.Language.General.Duration; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + _filesAlreadyInList = new HashSet(); + } + + private void buttonInputBrowse_Click(object sender, EventArgs e) + { + buttonInputBrowse.Enabled = false; + openFileDialog1.FileName = string.Empty; + openFileDialog1.Filter = Configuration.Settings.Language.ImportImages.ImageFiles + "|*.png;*.jpg;*.jpeg;*.bmp;*.gif;*.tif;*.tiff"; + openFileDialog1.Multiselect = true; + if (openFileDialog1.ShowDialog(this) == DialogResult.OK) + { + foreach (string fileName in openFileDialog1.FileNames) + { + if (!_filesAlreadyInList.Contains(fileName)) + { + AddInputFile(fileName); + } + } + } + buttonInputBrowse.Enabled = true; + } + + private void AddInputFile(string fileName) + { + try + { + var fi = new FileInfo(fileName); + var item = new ListViewItem(fileName); + item.SubItems.Add(Utilities.FormatBytesToDisplayFileSize(fi.Length)); + var ext = fi.Extension.ToLowerInvariant(); + if (ext == ".png" || ext == ".jpg" || ext == ".jpeg" || ext == ".bmp" || ext == ".gif" || ext == ".tif" || ext == ".tiff") + { + _filesAlreadyInList.Add(fileName); + SetTimeCodes(fileName, item); + listViewInputFiles.Items.Add(item); + } + } + catch + { + // ignored + } + } + + private static void SetTimeCodes(string fileName, ListViewItem item) + { + string name = Path.GetFileNameWithoutExtension(fileName); + var p = new Paragraph(); + SetEndTimeAndStartTime(name, p); + item.SubItems.Add(p.StartTime.ToString()); + item.SubItems.Add(p.EndTime.ToString()); + item.SubItems.Add(p.Duration.ToShortString()); + } + + public static void SetEndTimeAndStartTime(string name, Paragraph p) + { + if (name.Contains("-to-")) + { + var arr = name.Replace("-to-", "_").Split('_'); + if (arr.Length == 3 && int.TryParse(arr[1], out var startTime) && int.TryParse(arr[2], out var endTime)) + { + p.StartTime.TotalMilliseconds = startTime; + p.EndTime.TotalMilliseconds = endTime; + } + } + else if (TimeCodeFormat1.IsMatch(name) || TimeCodeFormat2.IsMatch(name)) + { + var arr = name.Replace("__", "_").Split('_'); + if (arr.Length >= 8) + { + try + { + p.StartTime = new TimeCode(int.Parse(arr[0]), int.Parse(arr[1]), int.Parse(arr[2]), int.Parse(arr[3])); + p.EndTime = new TimeCode(int.Parse(arr[4]), int.Parse(arr[5]), int.Parse(arr[6]), int.Parse(arr[7])); + } + catch (Exception) + { + // ignored + } + } + } + } + + private void buttonOK_Click(object sender, EventArgs e) + { + foreach (ListViewItem item in listViewInputFiles.Items) + { + var p = new Paragraph { Text = item.Text }; + string name = Path.GetFileNameWithoutExtension(p.Text); + SetEndTimeAndStartTime(name, p); + Subtitle.Paragraphs.Add(p); + } + Subtitle.Sort(SubtitleSortCriteria.StartTime); + DialogResult = DialogResult.OK; + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void listViewInputFiles_DragEnter(object sender, DragEventArgs e) + { + if (e.Data.GetDataPresent(DataFormats.FileDrop, false)) + { + e.Effect = DragDropEffects.All; + } + } + + private void listViewInputFiles_DragDrop(object sender, DragEventArgs e) + { + var fileNames = (string[])e.Data.GetData(DataFormats.FileDrop); + foreach (string fileName in fileNames) + { + AddInputFile(fileName); + } + } + + private void ImportImages_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + else if (e.KeyData == (Keys.Control | Keys.O)) + { + buttonInputBrowse_Click(null, EventArgs.Empty); + } + } + + private void contextMenuStrip1_Opening(object sender, System.ComponentModel.CancelEventArgs e) + { + if (listViewInputFiles.Items.Count == 0) + { + e.Cancel = true; + } + else + { + removeToolStripMenuItem.Visible = listViewInputFiles.SelectedItems.Count > 0; + } + } + + private void RemoveSelection(bool removeAll = false) + { + if (listViewInputFiles.Items.Count == 0) + { + return; + } + + if (removeAll) + { + foreach (ListViewItem item in listViewInputFiles.Items) + { + item.Remove(); + _filesAlreadyInList.Remove(item.Text); + } + } + else if (listViewInputFiles.SelectedItems.Count > 0) + { + foreach (ListViewItem item in listViewInputFiles.SelectedItems) + { + item.Remove(); + _filesAlreadyInList.Remove(item.Text); + } + } + } + + private void removeToolStripMenuItem_Click(object sender, EventArgs e) + { + RemoveSelection(); + } + + private void removeAllToolStripMenuItem_Click(object sender, EventArgs e) + { + RemoveSelection(true); + } + } +} diff --git a/src/Forms/ImportImages.resx b/src/ui/Forms/ImportImages.resx similarity index 97% rename from src/Forms/ImportImages.resx rename to src/ui/Forms/ImportImages.resx index 2bd4597e5..16ec139ae 100644 --- a/src/Forms/ImportImages.resx +++ b/src/ui/Forms/ImportImages.resx @@ -1,126 +1,126 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 157, 17 - - - 17, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 157, 17 + + + 17, 17 + \ No newline at end of file diff --git a/src/Forms/ImportSceneChanges.Designer.cs b/src/ui/Forms/ImportSceneChanges.Designer.cs similarity index 98% rename from src/Forms/ImportSceneChanges.Designer.cs rename to src/ui/Forms/ImportSceneChanges.Designer.cs index a867ae151..d6e8bbcb1 100644 --- a/src/Forms/ImportSceneChanges.Designer.cs +++ b/src/ui/Forms/ImportSceneChanges.Designer.cs @@ -1,365 +1,365 @@ -namespace Nikse.SubtitleEdit.Forms -{ - partial class ImportSceneChanges - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.groupBoxImportText = new System.Windows.Forms.GroupBox(); - this.textBoxIImport = new System.Windows.Forms.TextBox(); - this.groupBoxTimeCodes = new System.Windows.Forms.GroupBox(); - this.radioButtonMilliseconds = new System.Windows.Forms.RadioButton(); - this.radioButtonSeconds = new System.Windows.Forms.RadioButton(); - this.radioButtonFrames = new System.Windows.Forms.RadioButton(); - this.radioButtonHHMMSSMS = new System.Windows.Forms.RadioButton(); - this.buttonOpenText = new System.Windows.Forms.Button(); - this.textBoxLog = new System.Windows.Forms.TextBox(); - this.groupBoxGenerateSceneChanges = new System.Windows.Forms.GroupBox(); - this.labelThresholdDescription = new System.Windows.Forms.Label(); - this.numericUpDownThreshold = new System.Windows.Forms.NumericUpDown(); - this.labelFfmpegThreshold = new System.Windows.Forms.Label(); - this.buttonDownloadFfmpeg = new System.Windows.Forms.Button(); - this.buttonImportWithFfmpeg = new System.Windows.Forms.Button(); - this.textBoxGenerate = new System.Windows.Forms.TextBox(); - this.progressBar1 = new System.Windows.Forms.ProgressBar(); - this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); - this.groupBoxImportText.SuspendLayout(); - this.groupBoxTimeCodes.SuspendLayout(); - this.groupBoxGenerateSceneChanges.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownThreshold)).BeginInit(); - this.SuspendLayout(); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(639, 433); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(87, 23); - this.buttonCancel.TabIndex = 4; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(546, 433); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(87, 23); - this.buttonOK.TabIndex = 3; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // groupBoxImportText - // - this.groupBoxImportText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxImportText.Controls.Add(this.textBoxIImport); - this.groupBoxImportText.Controls.Add(this.groupBoxTimeCodes); - this.groupBoxImportText.Controls.Add(this.buttonOpenText); - this.groupBoxImportText.Controls.Add(this.textBoxLog); - this.groupBoxImportText.Location = new System.Drawing.Point(367, 12); - this.groupBoxImportText.Name = "groupBoxImportText"; - this.groupBoxImportText.Size = new System.Drawing.Size(359, 412); - this.groupBoxImportText.TabIndex = 1; - this.groupBoxImportText.TabStop = false; - this.groupBoxImportText.Text = "Import scene changes"; - // - // textBoxIImport - // - this.textBoxIImport.AllowDrop = true; - this.textBoxIImport.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.textBoxIImport.Location = new System.Drawing.Point(6, 48); - this.textBoxIImport.MaxLength = 0; - this.textBoxIImport.Multiline = true; - this.textBoxIImport.Name = "textBoxIImport"; - this.textBoxIImport.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.textBoxIImport.Size = new System.Drawing.Size(338, 232); - this.textBoxIImport.TabIndex = 1; - // - // groupBoxTimeCodes - // - this.groupBoxTimeCodes.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxTimeCodes.Controls.Add(this.radioButtonMilliseconds); - this.groupBoxTimeCodes.Controls.Add(this.radioButtonSeconds); - this.groupBoxTimeCodes.Controls.Add(this.radioButtonFrames); - this.groupBoxTimeCodes.Controls.Add(this.radioButtonHHMMSSMS); - this.groupBoxTimeCodes.Location = new System.Drawing.Point(6, 286); - this.groupBoxTimeCodes.Name = "groupBoxTimeCodes"; - this.groupBoxTimeCodes.Size = new System.Drawing.Size(338, 120); - this.groupBoxTimeCodes.TabIndex = 2; - this.groupBoxTimeCodes.TabStop = false; - this.groupBoxTimeCodes.Text = "Time codes"; - // - // radioButtonMilliseconds - // - this.radioButtonMilliseconds.AutoSize = true; - this.radioButtonMilliseconds.Location = new System.Drawing.Point(18, 67); - this.radioButtonMilliseconds.Name = "radioButtonMilliseconds"; - this.radioButtonMilliseconds.Size = new System.Drawing.Size(82, 17); - this.radioButtonMilliseconds.TabIndex = 2; - this.radioButtonMilliseconds.Text = "Milliseconds"; - this.radioButtonMilliseconds.UseVisualStyleBackColor = true; - // - // radioButtonSeconds - // - this.radioButtonSeconds.AutoSize = true; - this.radioButtonSeconds.Location = new System.Drawing.Point(18, 44); - this.radioButtonSeconds.Name = "radioButtonSeconds"; - this.radioButtonSeconds.Size = new System.Drawing.Size(67, 17); - this.radioButtonSeconds.TabIndex = 1; - this.radioButtonSeconds.Text = "Seconds"; - this.radioButtonSeconds.UseVisualStyleBackColor = true; - // - // radioButtonFrames - // - this.radioButtonFrames.AutoSize = true; - this.radioButtonFrames.Checked = true; - this.radioButtonFrames.Location = new System.Drawing.Point(18, 21); - this.radioButtonFrames.Name = "radioButtonFrames"; - this.radioButtonFrames.Size = new System.Drawing.Size(59, 17); - this.radioButtonFrames.TabIndex = 0; - this.radioButtonFrames.TabStop = true; - this.radioButtonFrames.Text = "Frames"; - this.radioButtonFrames.UseVisualStyleBackColor = true; - // - // radioButtonHHMMSSMS - // - this.radioButtonHHMMSSMS.AutoSize = true; - this.radioButtonHHMMSSMS.Location = new System.Drawing.Point(19, 90); - this.radioButtonHHMMSSMS.Name = "radioButtonHHMMSSMS"; - this.radioButtonHHMMSSMS.Size = new System.Drawing.Size(167, 17); - this.radioButtonHHMMSSMS.TabIndex = 3; - this.radioButtonHHMMSSMS.Text = "HH:MM:SS.ms (00:00:01.500)"; - this.radioButtonHHMMSSMS.UseVisualStyleBackColor = true; - // - // buttonOpenText - // - this.buttonOpenText.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOpenText.Location = new System.Drawing.Point(189, 21); - this.buttonOpenText.Name = "buttonOpenText"; - this.buttonOpenText.Size = new System.Drawing.Size(153, 23); - this.buttonOpenText.TabIndex = 0; - this.buttonOpenText.Text = "Open file..."; - this.buttonOpenText.UseVisualStyleBackColor = true; - this.buttonOpenText.Click += new System.EventHandler(this.buttonOpenText_Click); - // - // textBoxLog - // - this.textBoxLog.AllowDrop = true; - this.textBoxLog.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.textBoxLog.Location = new System.Drawing.Point(7, 19); - this.textBoxLog.MaxLength = 0; - this.textBoxLog.Multiline = true; - this.textBoxLog.Name = "textBoxLog"; - this.textBoxLog.ReadOnly = true; - this.textBoxLog.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.textBoxLog.Size = new System.Drawing.Size(337, 387); - this.textBoxLog.TabIndex = 6; - // - // groupBoxGenerateSceneChanges - // - this.groupBoxGenerateSceneChanges.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxGenerateSceneChanges.Controls.Add(this.labelThresholdDescription); - this.groupBoxGenerateSceneChanges.Controls.Add(this.numericUpDownThreshold); - this.groupBoxGenerateSceneChanges.Controls.Add(this.labelFfmpegThreshold); - this.groupBoxGenerateSceneChanges.Controls.Add(this.buttonDownloadFfmpeg); - this.groupBoxGenerateSceneChanges.Controls.Add(this.buttonImportWithFfmpeg); - this.groupBoxGenerateSceneChanges.Controls.Add(this.textBoxGenerate); - this.groupBoxGenerateSceneChanges.Location = new System.Drawing.Point(12, 12); - this.groupBoxGenerateSceneChanges.Name = "groupBoxGenerateSceneChanges"; - this.groupBoxGenerateSceneChanges.Size = new System.Drawing.Size(349, 413); - this.groupBoxGenerateSceneChanges.TabIndex = 0; - this.groupBoxGenerateSceneChanges.TabStop = false; - this.groupBoxGenerateSceneChanges.Text = "Generate scene changes"; - // - // labelThressholdDescription - // - this.labelThresholdDescription.AutoSize = true; - this.labelThresholdDescription.ForeColor = System.Drawing.SystemColors.ControlDarkDark; - this.labelThresholdDescription.Location = new System.Drawing.Point(115, 384); - this.labelThresholdDescription.Name = "labelThresholdDescription"; - this.labelThresholdDescription.Size = new System.Drawing.Size(195, 13); - this.labelThresholdDescription.TabIndex = 5; - this.labelThresholdDescription.Text = "Lower value gives more scene changes"; - // - // numericUpDownThreshold - // - this.numericUpDownThreshold.DecimalPlaces = 1; - this.numericUpDownThreshold.Increment = new decimal(new int[] { - 1, - 0, - 0, - 65536}); - this.numericUpDownThreshold.Location = new System.Drawing.Point(66, 382); - this.numericUpDownThreshold.Maximum = new decimal(new int[] { - 9, - 0, - 0, - 65536}); - this.numericUpDownThreshold.Minimum = new decimal(new int[] { - 1, - 0, - 0, - 65536}); - this.numericUpDownThreshold.Name = "numericUpDownThreshold"; - this.numericUpDownThreshold.Size = new System.Drawing.Size(43, 20); - this.numericUpDownThreshold.TabIndex = 4; - this.numericUpDownThreshold.Value = new decimal(new int[] { - 4, - 0, - 0, - 65536}); - // - // labelFfmpegThreshold - // - this.labelFfmpegThreshold.AutoSize = true; - this.labelFfmpegThreshold.Location = new System.Drawing.Point(6, 384); - this.labelFfmpegThreshold.Name = "labelFfmpegThreshold"; - this.labelFfmpegThreshold.Size = new System.Drawing.Size(54, 13); - this.labelFfmpegThreshold.TabIndex = 3; - this.labelFfmpegThreshold.Text = "Sensitivity"; - // - // buttonDownloadFfmpeg - // - this.buttonDownloadFfmpeg.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonDownloadFfmpeg.Location = new System.Drawing.Point(159, 19); - this.buttonDownloadFfmpeg.Name = "buttonDownloadFfmpeg"; - this.buttonDownloadFfmpeg.Size = new System.Drawing.Size(184, 23); - this.buttonDownloadFfmpeg.TabIndex = 0; - this.buttonDownloadFfmpeg.Text = "Download ffmpeg"; - this.buttonDownloadFfmpeg.UseVisualStyleBackColor = true; - this.buttonDownloadFfmpeg.Click += new System.EventHandler(this.buttonDownloadFfmpeg_Click); - // - // buttonImportWithFfmpeg - // - this.buttonImportWithFfmpeg.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.buttonImportWithFfmpeg.Location = new System.Drawing.Point(6, 353); - this.buttonImportWithFfmpeg.Name = "buttonImportWithFfmpeg"; - this.buttonImportWithFfmpeg.Size = new System.Drawing.Size(337, 23); - this.buttonImportWithFfmpeg.TabIndex = 2; - this.buttonImportWithFfmpeg.Text = "Generate scene changes with FFmpeg"; - this.buttonImportWithFfmpeg.UseVisualStyleBackColor = true; - this.buttonImportWithFfmpeg.Click += new System.EventHandler(this.buttonImportWithFfmpeg_Click); - // - // textBoxGenerate - // - this.textBoxGenerate.AllowDrop = true; - this.textBoxGenerate.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.textBoxGenerate.Location = new System.Drawing.Point(6, 48); - this.textBoxGenerate.MaxLength = 0; - this.textBoxGenerate.Multiline = true; - this.textBoxGenerate.Name = "textBoxGenerate"; - this.textBoxGenerate.ReadOnly = true; - this.textBoxGenerate.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.textBoxGenerate.Size = new System.Drawing.Size(337, 299); - this.textBoxGenerate.TabIndex = 1; - // - // progressBar1 - // - this.progressBar1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.progressBar1.Location = new System.Drawing.Point(12, 433); - this.progressBar1.Name = "progressBar1"; - this.progressBar1.Size = new System.Drawing.Size(528, 23); - this.progressBar1.TabIndex = 2; - this.progressBar1.Visible = false; - // - // openFileDialog1 - // - this.openFileDialog1.FileName = "openFileDialog1"; - // - // ImportSceneChanges - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(738, 468); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.progressBar1); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.groupBoxImportText); - this.Controls.Add(this.groupBoxGenerateSceneChanges); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "ImportSceneChanges"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "ImportSceneChanges"; - this.Shown += new System.EventHandler(this.ImportSceneChanges_Shown); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ImportSceneChanges_KeyDown); - this.groupBoxImportText.ResumeLayout(false); - this.groupBoxImportText.PerformLayout(); - this.groupBoxTimeCodes.ResumeLayout(false); - this.groupBoxTimeCodes.PerformLayout(); - this.groupBoxGenerateSceneChanges.ResumeLayout(false); - this.groupBoxGenerateSceneChanges.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownThreshold)).EndInit(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.GroupBox groupBoxImportText; - private System.Windows.Forms.GroupBox groupBoxTimeCodes; - private System.Windows.Forms.RadioButton radioButtonMilliseconds; - private System.Windows.Forms.RadioButton radioButtonSeconds; - private System.Windows.Forms.RadioButton radioButtonFrames; - private System.Windows.Forms.RadioButton radioButtonHHMMSSMS; - private System.Windows.Forms.GroupBox groupBoxGenerateSceneChanges; - private System.Windows.Forms.TextBox textBoxGenerate; - private System.Windows.Forms.Button buttonOpenText; - private System.Windows.Forms.OpenFileDialog openFileDialog1; - private System.Windows.Forms.Button buttonImportWithFfmpeg; - private System.Windows.Forms.ProgressBar progressBar1; - private System.Windows.Forms.Button buttonDownloadFfmpeg; - private System.Windows.Forms.TextBox textBoxIImport; - private System.Windows.Forms.Label labelThresholdDescription; - private System.Windows.Forms.NumericUpDown numericUpDownThreshold; - private System.Windows.Forms.Label labelFfmpegThreshold; - private System.Windows.Forms.TextBox textBoxLog; - } -} +namespace Nikse.SubtitleEdit.Forms +{ + partial class ImportSceneChanges + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.groupBoxImportText = new System.Windows.Forms.GroupBox(); + this.textBoxIImport = new System.Windows.Forms.TextBox(); + this.groupBoxTimeCodes = new System.Windows.Forms.GroupBox(); + this.radioButtonMilliseconds = new System.Windows.Forms.RadioButton(); + this.radioButtonSeconds = new System.Windows.Forms.RadioButton(); + this.radioButtonFrames = new System.Windows.Forms.RadioButton(); + this.radioButtonHHMMSSMS = new System.Windows.Forms.RadioButton(); + this.buttonOpenText = new System.Windows.Forms.Button(); + this.textBoxLog = new System.Windows.Forms.TextBox(); + this.groupBoxGenerateSceneChanges = new System.Windows.Forms.GroupBox(); + this.labelThresholdDescription = new System.Windows.Forms.Label(); + this.numericUpDownThreshold = new System.Windows.Forms.NumericUpDown(); + this.labelFfmpegThreshold = new System.Windows.Forms.Label(); + this.buttonDownloadFfmpeg = new System.Windows.Forms.Button(); + this.buttonImportWithFfmpeg = new System.Windows.Forms.Button(); + this.textBoxGenerate = new System.Windows.Forms.TextBox(); + this.progressBar1 = new System.Windows.Forms.ProgressBar(); + this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); + this.groupBoxImportText.SuspendLayout(); + this.groupBoxTimeCodes.SuspendLayout(); + this.groupBoxGenerateSceneChanges.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownThreshold)).BeginInit(); + this.SuspendLayout(); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(639, 433); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(87, 23); + this.buttonCancel.TabIndex = 4; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(546, 433); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(87, 23); + this.buttonOK.TabIndex = 3; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // groupBoxImportText + // + this.groupBoxImportText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxImportText.Controls.Add(this.textBoxIImport); + this.groupBoxImportText.Controls.Add(this.groupBoxTimeCodes); + this.groupBoxImportText.Controls.Add(this.buttonOpenText); + this.groupBoxImportText.Controls.Add(this.textBoxLog); + this.groupBoxImportText.Location = new System.Drawing.Point(367, 12); + this.groupBoxImportText.Name = "groupBoxImportText"; + this.groupBoxImportText.Size = new System.Drawing.Size(359, 412); + this.groupBoxImportText.TabIndex = 1; + this.groupBoxImportText.TabStop = false; + this.groupBoxImportText.Text = "Import scene changes"; + // + // textBoxIImport + // + this.textBoxIImport.AllowDrop = true; + this.textBoxIImport.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxIImport.Location = new System.Drawing.Point(6, 48); + this.textBoxIImport.MaxLength = 0; + this.textBoxIImport.Multiline = true; + this.textBoxIImport.Name = "textBoxIImport"; + this.textBoxIImport.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.textBoxIImport.Size = new System.Drawing.Size(338, 232); + this.textBoxIImport.TabIndex = 1; + // + // groupBoxTimeCodes + // + this.groupBoxTimeCodes.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxTimeCodes.Controls.Add(this.radioButtonMilliseconds); + this.groupBoxTimeCodes.Controls.Add(this.radioButtonSeconds); + this.groupBoxTimeCodes.Controls.Add(this.radioButtonFrames); + this.groupBoxTimeCodes.Controls.Add(this.radioButtonHHMMSSMS); + this.groupBoxTimeCodes.Location = new System.Drawing.Point(6, 286); + this.groupBoxTimeCodes.Name = "groupBoxTimeCodes"; + this.groupBoxTimeCodes.Size = new System.Drawing.Size(338, 120); + this.groupBoxTimeCodes.TabIndex = 2; + this.groupBoxTimeCodes.TabStop = false; + this.groupBoxTimeCodes.Text = "Time codes"; + // + // radioButtonMilliseconds + // + this.radioButtonMilliseconds.AutoSize = true; + this.radioButtonMilliseconds.Location = new System.Drawing.Point(18, 67); + this.radioButtonMilliseconds.Name = "radioButtonMilliseconds"; + this.radioButtonMilliseconds.Size = new System.Drawing.Size(82, 17); + this.radioButtonMilliseconds.TabIndex = 2; + this.radioButtonMilliseconds.Text = "Milliseconds"; + this.radioButtonMilliseconds.UseVisualStyleBackColor = true; + // + // radioButtonSeconds + // + this.radioButtonSeconds.AutoSize = true; + this.radioButtonSeconds.Location = new System.Drawing.Point(18, 44); + this.radioButtonSeconds.Name = "radioButtonSeconds"; + this.radioButtonSeconds.Size = new System.Drawing.Size(67, 17); + this.radioButtonSeconds.TabIndex = 1; + this.radioButtonSeconds.Text = "Seconds"; + this.radioButtonSeconds.UseVisualStyleBackColor = true; + // + // radioButtonFrames + // + this.radioButtonFrames.AutoSize = true; + this.radioButtonFrames.Checked = true; + this.radioButtonFrames.Location = new System.Drawing.Point(18, 21); + this.radioButtonFrames.Name = "radioButtonFrames"; + this.radioButtonFrames.Size = new System.Drawing.Size(59, 17); + this.radioButtonFrames.TabIndex = 0; + this.radioButtonFrames.TabStop = true; + this.radioButtonFrames.Text = "Frames"; + this.radioButtonFrames.UseVisualStyleBackColor = true; + // + // radioButtonHHMMSSMS + // + this.radioButtonHHMMSSMS.AutoSize = true; + this.radioButtonHHMMSSMS.Location = new System.Drawing.Point(19, 90); + this.radioButtonHHMMSSMS.Name = "radioButtonHHMMSSMS"; + this.radioButtonHHMMSSMS.Size = new System.Drawing.Size(167, 17); + this.radioButtonHHMMSSMS.TabIndex = 3; + this.radioButtonHHMMSSMS.Text = "HH:MM:SS.ms (00:00:01.500)"; + this.radioButtonHHMMSSMS.UseVisualStyleBackColor = true; + // + // buttonOpenText + // + this.buttonOpenText.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOpenText.Location = new System.Drawing.Point(189, 21); + this.buttonOpenText.Name = "buttonOpenText"; + this.buttonOpenText.Size = new System.Drawing.Size(153, 23); + this.buttonOpenText.TabIndex = 0; + this.buttonOpenText.Text = "Open file..."; + this.buttonOpenText.UseVisualStyleBackColor = true; + this.buttonOpenText.Click += new System.EventHandler(this.buttonOpenText_Click); + // + // textBoxLog + // + this.textBoxLog.AllowDrop = true; + this.textBoxLog.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxLog.Location = new System.Drawing.Point(7, 19); + this.textBoxLog.MaxLength = 0; + this.textBoxLog.Multiline = true; + this.textBoxLog.Name = "textBoxLog"; + this.textBoxLog.ReadOnly = true; + this.textBoxLog.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.textBoxLog.Size = new System.Drawing.Size(337, 387); + this.textBoxLog.TabIndex = 6; + // + // groupBoxGenerateSceneChanges + // + this.groupBoxGenerateSceneChanges.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxGenerateSceneChanges.Controls.Add(this.labelThresholdDescription); + this.groupBoxGenerateSceneChanges.Controls.Add(this.numericUpDownThreshold); + this.groupBoxGenerateSceneChanges.Controls.Add(this.labelFfmpegThreshold); + this.groupBoxGenerateSceneChanges.Controls.Add(this.buttonDownloadFfmpeg); + this.groupBoxGenerateSceneChanges.Controls.Add(this.buttonImportWithFfmpeg); + this.groupBoxGenerateSceneChanges.Controls.Add(this.textBoxGenerate); + this.groupBoxGenerateSceneChanges.Location = new System.Drawing.Point(12, 12); + this.groupBoxGenerateSceneChanges.Name = "groupBoxGenerateSceneChanges"; + this.groupBoxGenerateSceneChanges.Size = new System.Drawing.Size(349, 413); + this.groupBoxGenerateSceneChanges.TabIndex = 0; + this.groupBoxGenerateSceneChanges.TabStop = false; + this.groupBoxGenerateSceneChanges.Text = "Generate scene changes"; + // + // labelThressholdDescription + // + this.labelThresholdDescription.AutoSize = true; + this.labelThresholdDescription.ForeColor = System.Drawing.SystemColors.ControlDarkDark; + this.labelThresholdDescription.Location = new System.Drawing.Point(115, 384); + this.labelThresholdDescription.Name = "labelThresholdDescription"; + this.labelThresholdDescription.Size = new System.Drawing.Size(195, 13); + this.labelThresholdDescription.TabIndex = 5; + this.labelThresholdDescription.Text = "Lower value gives more scene changes"; + // + // numericUpDownThreshold + // + this.numericUpDownThreshold.DecimalPlaces = 1; + this.numericUpDownThreshold.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.numericUpDownThreshold.Location = new System.Drawing.Point(66, 382); + this.numericUpDownThreshold.Maximum = new decimal(new int[] { + 9, + 0, + 0, + 65536}); + this.numericUpDownThreshold.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.numericUpDownThreshold.Name = "numericUpDownThreshold"; + this.numericUpDownThreshold.Size = new System.Drawing.Size(43, 20); + this.numericUpDownThreshold.TabIndex = 4; + this.numericUpDownThreshold.Value = new decimal(new int[] { + 4, + 0, + 0, + 65536}); + // + // labelFfmpegThreshold + // + this.labelFfmpegThreshold.AutoSize = true; + this.labelFfmpegThreshold.Location = new System.Drawing.Point(6, 384); + this.labelFfmpegThreshold.Name = "labelFfmpegThreshold"; + this.labelFfmpegThreshold.Size = new System.Drawing.Size(54, 13); + this.labelFfmpegThreshold.TabIndex = 3; + this.labelFfmpegThreshold.Text = "Sensitivity"; + // + // buttonDownloadFfmpeg + // + this.buttonDownloadFfmpeg.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.buttonDownloadFfmpeg.Location = new System.Drawing.Point(159, 19); + this.buttonDownloadFfmpeg.Name = "buttonDownloadFfmpeg"; + this.buttonDownloadFfmpeg.Size = new System.Drawing.Size(184, 23); + this.buttonDownloadFfmpeg.TabIndex = 0; + this.buttonDownloadFfmpeg.Text = "Download ffmpeg"; + this.buttonDownloadFfmpeg.UseVisualStyleBackColor = true; + this.buttonDownloadFfmpeg.Click += new System.EventHandler(this.buttonDownloadFfmpeg_Click); + // + // buttonImportWithFfmpeg + // + this.buttonImportWithFfmpeg.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.buttonImportWithFfmpeg.Location = new System.Drawing.Point(6, 353); + this.buttonImportWithFfmpeg.Name = "buttonImportWithFfmpeg"; + this.buttonImportWithFfmpeg.Size = new System.Drawing.Size(337, 23); + this.buttonImportWithFfmpeg.TabIndex = 2; + this.buttonImportWithFfmpeg.Text = "Generate scene changes with FFmpeg"; + this.buttonImportWithFfmpeg.UseVisualStyleBackColor = true; + this.buttonImportWithFfmpeg.Click += new System.EventHandler(this.buttonImportWithFfmpeg_Click); + // + // textBoxGenerate + // + this.textBoxGenerate.AllowDrop = true; + this.textBoxGenerate.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxGenerate.Location = new System.Drawing.Point(6, 48); + this.textBoxGenerate.MaxLength = 0; + this.textBoxGenerate.Multiline = true; + this.textBoxGenerate.Name = "textBoxGenerate"; + this.textBoxGenerate.ReadOnly = true; + this.textBoxGenerate.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.textBoxGenerate.Size = new System.Drawing.Size(337, 299); + this.textBoxGenerate.TabIndex = 1; + // + // progressBar1 + // + this.progressBar1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.progressBar1.Location = new System.Drawing.Point(12, 433); + this.progressBar1.Name = "progressBar1"; + this.progressBar1.Size = new System.Drawing.Size(528, 23); + this.progressBar1.TabIndex = 2; + this.progressBar1.Visible = false; + // + // openFileDialog1 + // + this.openFileDialog1.FileName = "openFileDialog1"; + // + // ImportSceneChanges + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(738, 468); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.progressBar1); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.groupBoxImportText); + this.Controls.Add(this.groupBoxGenerateSceneChanges); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "ImportSceneChanges"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "ImportSceneChanges"; + this.Shown += new System.EventHandler(this.ImportSceneChanges_Shown); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ImportSceneChanges_KeyDown); + this.groupBoxImportText.ResumeLayout(false); + this.groupBoxImportText.PerformLayout(); + this.groupBoxTimeCodes.ResumeLayout(false); + this.groupBoxTimeCodes.PerformLayout(); + this.groupBoxGenerateSceneChanges.ResumeLayout(false); + this.groupBoxGenerateSceneChanges.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownThreshold)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.GroupBox groupBoxImportText; + private System.Windows.Forms.GroupBox groupBoxTimeCodes; + private System.Windows.Forms.RadioButton radioButtonMilliseconds; + private System.Windows.Forms.RadioButton radioButtonSeconds; + private System.Windows.Forms.RadioButton radioButtonFrames; + private System.Windows.Forms.RadioButton radioButtonHHMMSSMS; + private System.Windows.Forms.GroupBox groupBoxGenerateSceneChanges; + private System.Windows.Forms.TextBox textBoxGenerate; + private System.Windows.Forms.Button buttonOpenText; + private System.Windows.Forms.OpenFileDialog openFileDialog1; + private System.Windows.Forms.Button buttonImportWithFfmpeg; + private System.Windows.Forms.ProgressBar progressBar1; + private System.Windows.Forms.Button buttonDownloadFfmpeg; + private System.Windows.Forms.TextBox textBoxIImport; + private System.Windows.Forms.Label labelThresholdDescription; + private System.Windows.Forms.NumericUpDown numericUpDownThreshold; + private System.Windows.Forms.Label labelFfmpegThreshold; + private System.Windows.Forms.TextBox textBoxLog; + } +} diff --git a/src/Forms/ImportSceneChanges.cs b/src/ui/Forms/ImportSceneChanges.cs similarity index 97% rename from src/Forms/ImportSceneChanges.cs rename to src/ui/Forms/ImportSceneChanges.cs index df6af4fd9..aa3dafb3b 100644 --- a/src/Forms/ImportSceneChanges.cs +++ b/src/ui/Forms/ImportSceneChanges.cs @@ -1,395 +1,395 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.SubtitleFormats; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Text; -using System.Windows.Forms; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public partial class ImportSceneChanges : PositionAndSizeForm - { - public List SceneChangesInSeconds = new List(); - private readonly double _frameRate = 25; - private readonly string _videoFileName; - private bool _abort; - private bool _pause; - private readonly StringBuilder _log; - private SceneChangesGenerator _sceneChangesGenerator; - - public ImportSceneChanges(VideoInfo videoInfo, string videoFileName) - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - if (videoInfo != null && videoInfo.FramesPerSecond > 1) - { - _frameRate = videoInfo.FramesPerSecond; - } - - _videoFileName = videoFileName; - - Text = Configuration.Settings.Language.ImportSceneChanges.Title; - groupBoxGenerateSceneChanges.Text = Configuration.Settings.Language.ImportSceneChanges.Generate; - buttonOpenText.Text = Configuration.Settings.Language.ImportSceneChanges.OpenTextFile; - groupBoxImportText.Text = Configuration.Settings.Language.ImportSceneChanges.Import; - radioButtonFrames.Text = Configuration.Settings.Language.ImportSceneChanges.Frames; - radioButtonSeconds.Text = Configuration.Settings.Language.ImportSceneChanges.Seconds; - radioButtonMilliseconds.Text = Configuration.Settings.Language.ImportSceneChanges.Milliseconds; - groupBoxTimeCodes.Text = Configuration.Settings.Language.ImportSceneChanges.TimeCodes; - buttonDownloadFfmpeg.Text = Configuration.Settings.Language.Settings.DownloadFFmpeg; - buttonImportWithFfmpeg.Text = Configuration.Settings.Language.ImportSceneChanges.GetSceneChangesWithFfmpeg; - labelFfmpegThreshold.Text = Configuration.Settings.Language.ImportSceneChanges.Sensitivity; - labelThresholdDescription.Text = Configuration.Settings.Language.ImportSceneChanges.SensitivityDescription; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - UiUtil.FixLargeFonts(this, buttonOK); - buttonImportWithFfmpeg.Enabled = !string.IsNullOrWhiteSpace(Configuration.Settings.General.FFmpegLocation) && File.Exists(Configuration.Settings.General.FFmpegLocation); - numericUpDownThreshold.Enabled = !string.IsNullOrWhiteSpace(Configuration.Settings.General.FFmpegLocation) && File.Exists(Configuration.Settings.General.FFmpegLocation); - var isFfmpegAvailable = !string.IsNullOrEmpty(Configuration.Settings.General.FFmpegLocation) && File.Exists(Configuration.Settings.General.FFmpegLocation); - buttonDownloadFfmpeg.Visible = !isFfmpegAvailable; - if (decimal.TryParse(Configuration.Settings.General.FFmpegSceneThreshold, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var threshold) && - threshold >= numericUpDownThreshold.Minimum && - threshold <= numericUpDownThreshold.Maximum) - { - numericUpDownThreshold.Value = threshold; - } - _log = new StringBuilder(); - textBoxLog.Visible = false; - if (!Configuration.IsRunningOnWindows) - { - buttonDownloadFfmpeg.Visible = false; - buttonImportWithFfmpeg.Enabled = true; - numericUpDownThreshold.Enabled = true; - } - } - - public sealed override string Text - { - get => base.Text; - set => base.Text = value; - } - - private void buttonOpenText_Click(object sender, EventArgs e) - { - openFileDialog1.Title = buttonOpenText.Text; - openFileDialog1.Filter = Configuration.Settings.Language.ImportText.TextFiles + "|*.txt;*.scenechanges;*.xml;*.json" + - "|Matroska xml chapter file|*.xml" + - "|EZTitles shotchanges XML file|*.xml" + - "|JSON scene changes file|*.json" + - "|" + Configuration.Settings.Language.General.AllFiles + "|*.*"; - openFileDialog1.FileName = string.Empty; - if (openFileDialog1.ShowDialog() == DialogResult.OK) - { - LoadTextFile(openFileDialog1.FileName); - } - } - - private void LoadTextFile(string fileName) - { - try - { - var res = LoadFromMatroskaChapterFile(fileName); - if (!string.IsNullOrEmpty(res)) - { - textBoxIImport.Text = res; - radioButtonHHMMSSMS.Checked = true; - return; - } - - res = LoadFromEZTitlesShotchangesFile(fileName); - if (!string.IsNullOrEmpty(res)) - { - textBoxIImport.Text = res; - radioButtonFrames.Checked = true; - return; - } - - res = LoadFromJsonShotchangesFile(fileName); - if (!string.IsNullOrEmpty(res)) - { - textBoxIImport.Text = res; - radioButtonHHMMSSMS.Checked = true; - return; - } - - var encoding = LanguageAutoDetect.GetEncodingFromFile(fileName); - string s = File.ReadAllText(fileName, encoding).Trim(); - if (s.Contains('.')) - { - radioButtonSeconds.Checked = true; - } - - if (s.Contains('.') && s.Contains(':')) - { - radioButtonHHMMSSMS.Checked = true; - } - - if (!s.Contains(Environment.NewLine) && s.Contains(';')) - { - var sb = new StringBuilder(); - foreach (string line in s.Split(';')) - { - if (!string.IsNullOrWhiteSpace(line)) - { - sb.AppendLine(line.Trim()); - } - } - textBoxIImport.Text = sb.ToString(); - } - else - { - textBoxIImport.Text = s; - } - } - catch (Exception ex) - { - MessageBox.Show(ex.Message); - } - } - - private string LoadFromMatroskaChapterFile(string fileName) - { - try - { - var x = new XmlDocument(); - x.Load(fileName); - var xmlNodeList = x.SelectNodes("//ChapterAtom"); - var sb = new StringBuilder(); - if (xmlNodeList != null) - { - foreach (XmlNode chapter in xmlNodeList) - { - var start = chapter.SelectSingleNode("ChapterTimeStart"); - string[] timeParts = start?.InnerText.Split(SplitChars, StringSplitOptions.RemoveEmptyEntries); - if (timeParts?.Length == 4) - { - if (timeParts[3].Length > 3) - { - timeParts[3] = timeParts[3].Substring(0, 3); - } - - var ts = new TimeSpan(0, Convert.ToInt32(timeParts[0]), Convert.ToInt32(timeParts[1]), Convert.ToInt32(timeParts[2]), Convert.ToInt32(timeParts[3])); - sb.AppendLine(new TimeCode(ts).ToShortStringHHMMSSFF()); - } - } - } - return sb.ToString(); - } - catch - { - return null; - } - } - - private string LoadFromEZTitlesShotchangesFile(string fileName) - { - try - { - var x = new XmlDocument(); - x.Load(fileName); - var xmlNodeList = x.SelectNodes("/shotchanges/shotchanges_list/shotchange"); - var sb = new StringBuilder(); - if (xmlNodeList != null) - { - foreach (XmlNode shotChange in xmlNodeList) - { - sb.AppendLine(shotChange.Attributes["frame"]?.InnerText); - } - } - return sb.ToString(); - } - catch - { - return null; - } - } - - private string LoadFromJsonShotchangesFile(string fileName) - { - try - { - var text = FileUtil.ReadAllTextShared(fileName, Encoding.UTF8); - var list = new List(); - foreach (string line in text.Split(',')) - { - string s = line.Trim() + "}"; - string start = Json.ReadTag(s, "frame_time"); - if (start != null) - { - if (double.TryParse(start, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var startSeconds)) - { - list.Add(startSeconds * 1000.0); - } - } - } - - var sb = new StringBuilder(); - foreach (double ms in list.OrderBy(p => p)) - { - sb.AppendLine(new TimeCode(ms).ToShortStringHHMMSSFF()); - } - return sb.ToString(); - } - catch - { - return null; - } - } - - - private static readonly char[] SplitChars = { ':', '.', ',' }; - - private void buttonOK_Click(object sender, EventArgs e) - { - var lines = string.IsNullOrEmpty(textBoxGenerate.Text) ? textBoxIImport.Lines : textBoxGenerate.Lines; - if (radioButtonHHMMSSMS.Checked) - { - SceneChangesInSeconds = SceneChangesGenerator.GetSeconds(lines); - } - else - { - SceneChangesInSeconds = new List(); - foreach (var line in lines) - { - if (double.TryParse(line, out var d)) - { - if (radioButtonFrames.Checked) - { - SceneChangesInSeconds.Add(d / _frameRate); - } - else if (radioButtonSeconds.Checked) - { - SceneChangesInSeconds.Add(d); - } - else if (radioButtonMilliseconds.Checked) - { - SceneChangesInSeconds.Add(d / TimeCode.BaseUnit); - } - } - } - } - - Configuration.Settings.General.FFmpegSceneThreshold = numericUpDownThreshold.Value.ToString(CultureInfo.InvariantCulture); - if (SceneChangesInSeconds.Count > 0) - { - DialogResult = DialogResult.OK; - } - else - { - MessageBox.Show(Configuration.Settings.Language.ImportSceneChanges.NoSceneChangesFound); - } - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - _abort = true; - DialogResult = DialogResult.Cancel; - } - - private void ImportSceneChanges_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - else if (e.KeyCode == Keys.F8) - { - if (_pause) - { - _pause = false; - textBoxLog.Visible = false; - Cursor = Cursors.WaitCursor; - } - else - { - Cursor = Cursors.Default; - textBoxLog.Text = _log.ToString(); - _pause = true; - textBoxLog.Visible = true; - textBoxLog.BringToFront(); - } - } - } - - private void buttonImportWithFfmpeg_Click(object sender, EventArgs e) - { - _sceneChangesGenerator = new SceneChangesGenerator(); - groupBoxImportText.Enabled = false; - buttonOK.Enabled = false; - progressBar1.Visible = true; - progressBar1.Style = ProgressBarStyle.Marquee; - buttonImportWithFfmpeg.Enabled = false; - numericUpDownThreshold.Enabled = false; - Cursor = Cursors.WaitCursor; - textBoxGenerate.Text = string.Empty; - using (var process = _sceneChangesGenerator.GetProcess(_videoFileName, numericUpDownThreshold.Value)) - { - double lastUpdateSeconds = 0; - radioButtonHHMMSSMS.Checked = true; - while (!process.HasExited) - { - Application.DoEvents(); - System.Threading.Thread.Sleep(100); - - if (_pause && !_abort) - { - continue; - } - - if (_sceneChangesGenerator.LastSeconds > 0.1 && Math.Abs(lastUpdateSeconds - _sceneChangesGenerator.LastSeconds) > 0 - 001) - { - lastUpdateSeconds = _sceneChangesGenerator.LastSeconds; - UpdateImportTextBox(); - } - if (_abort) - { - DialogResult = DialogResult.Cancel; - process.Kill(); - return; - } - } - } - Cursor = Cursors.Default; - UpdateImportTextBox(); - buttonOK.Enabled = true; - if (!_pause) - { - buttonOK_Click(sender, e); - } - } - - private void UpdateImportTextBox() - { - textBoxGenerate.Text = _sceneChangesGenerator.GetTimeCodesString(); - textBoxGenerate.SelectionStart = textBoxGenerate.Text.Length; - textBoxGenerate.ScrollToCaret(); - } - - private void ImportSceneChanges_Shown(object sender, EventArgs e) - { - Activate(); - } - - private void buttonDownloadFfmpeg_Click(object sender, EventArgs e) - { - using (var form = new DownloadFfmpeg()) - { - if (form.ShowDialog(this) == DialogResult.OK && !string.IsNullOrEmpty(form.FFmpegPath)) - { - Configuration.Settings.General.FFmpegLocation = form.FFmpegPath; - buttonDownloadFfmpeg.Visible = false; - buttonImportWithFfmpeg.Enabled = true; - numericUpDownThreshold.Enabled = true; - Configuration.Settings.Save(); - } - } - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.SubtitleFormats; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public partial class ImportSceneChanges : PositionAndSizeForm + { + public List SceneChangesInSeconds = new List(); + private readonly double _frameRate = 25; + private readonly string _videoFileName; + private bool _abort; + private bool _pause; + private readonly StringBuilder _log; + private SceneChangesGenerator _sceneChangesGenerator; + + public ImportSceneChanges(VideoInfo videoInfo, string videoFileName) + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + if (videoInfo != null && videoInfo.FramesPerSecond > 1) + { + _frameRate = videoInfo.FramesPerSecond; + } + + _videoFileName = videoFileName; + + Text = Configuration.Settings.Language.ImportSceneChanges.Title; + groupBoxGenerateSceneChanges.Text = Configuration.Settings.Language.ImportSceneChanges.Generate; + buttonOpenText.Text = Configuration.Settings.Language.ImportSceneChanges.OpenTextFile; + groupBoxImportText.Text = Configuration.Settings.Language.ImportSceneChanges.Import; + radioButtonFrames.Text = Configuration.Settings.Language.ImportSceneChanges.Frames; + radioButtonSeconds.Text = Configuration.Settings.Language.ImportSceneChanges.Seconds; + radioButtonMilliseconds.Text = Configuration.Settings.Language.ImportSceneChanges.Milliseconds; + groupBoxTimeCodes.Text = Configuration.Settings.Language.ImportSceneChanges.TimeCodes; + buttonDownloadFfmpeg.Text = Configuration.Settings.Language.Settings.DownloadFFmpeg; + buttonImportWithFfmpeg.Text = Configuration.Settings.Language.ImportSceneChanges.GetSceneChangesWithFfmpeg; + labelFfmpegThreshold.Text = Configuration.Settings.Language.ImportSceneChanges.Sensitivity; + labelThresholdDescription.Text = Configuration.Settings.Language.ImportSceneChanges.SensitivityDescription; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + UiUtil.FixLargeFonts(this, buttonOK); + buttonImportWithFfmpeg.Enabled = !string.IsNullOrWhiteSpace(Configuration.Settings.General.FFmpegLocation) && File.Exists(Configuration.Settings.General.FFmpegLocation); + numericUpDownThreshold.Enabled = !string.IsNullOrWhiteSpace(Configuration.Settings.General.FFmpegLocation) && File.Exists(Configuration.Settings.General.FFmpegLocation); + var isFfmpegAvailable = !string.IsNullOrEmpty(Configuration.Settings.General.FFmpegLocation) && File.Exists(Configuration.Settings.General.FFmpegLocation); + buttonDownloadFfmpeg.Visible = !isFfmpegAvailable; + if (decimal.TryParse(Configuration.Settings.General.FFmpegSceneThreshold, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var threshold) && + threshold >= numericUpDownThreshold.Minimum && + threshold <= numericUpDownThreshold.Maximum) + { + numericUpDownThreshold.Value = threshold; + } + _log = new StringBuilder(); + textBoxLog.Visible = false; + if (!Configuration.IsRunningOnWindows) + { + buttonDownloadFfmpeg.Visible = false; + buttonImportWithFfmpeg.Enabled = true; + numericUpDownThreshold.Enabled = true; + } + } + + public sealed override string Text + { + get => base.Text; + set => base.Text = value; + } + + private void buttonOpenText_Click(object sender, EventArgs e) + { + openFileDialog1.Title = buttonOpenText.Text; + openFileDialog1.Filter = Configuration.Settings.Language.ImportText.TextFiles + "|*.txt;*.scenechanges;*.xml;*.json" + + "|Matroska xml chapter file|*.xml" + + "|EZTitles shotchanges XML file|*.xml" + + "|JSON scene changes file|*.json" + + "|" + Configuration.Settings.Language.General.AllFiles + "|*.*"; + openFileDialog1.FileName = string.Empty; + if (openFileDialog1.ShowDialog() == DialogResult.OK) + { + LoadTextFile(openFileDialog1.FileName); + } + } + + private void LoadTextFile(string fileName) + { + try + { + var res = LoadFromMatroskaChapterFile(fileName); + if (!string.IsNullOrEmpty(res)) + { + textBoxIImport.Text = res; + radioButtonHHMMSSMS.Checked = true; + return; + } + + res = LoadFromEZTitlesShotchangesFile(fileName); + if (!string.IsNullOrEmpty(res)) + { + textBoxIImport.Text = res; + radioButtonFrames.Checked = true; + return; + } + + res = LoadFromJsonShotchangesFile(fileName); + if (!string.IsNullOrEmpty(res)) + { + textBoxIImport.Text = res; + radioButtonHHMMSSMS.Checked = true; + return; + } + + var encoding = LanguageAutoDetect.GetEncodingFromFile(fileName); + string s = File.ReadAllText(fileName, encoding).Trim(); + if (s.Contains('.')) + { + radioButtonSeconds.Checked = true; + } + + if (s.Contains('.') && s.Contains(':')) + { + radioButtonHHMMSSMS.Checked = true; + } + + if (!s.Contains(Environment.NewLine) && s.Contains(';')) + { + var sb = new StringBuilder(); + foreach (string line in s.Split(';')) + { + if (!string.IsNullOrWhiteSpace(line)) + { + sb.AppendLine(line.Trim()); + } + } + textBoxIImport.Text = sb.ToString(); + } + else + { + textBoxIImport.Text = s; + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + } + } + + private string LoadFromMatroskaChapterFile(string fileName) + { + try + { + var x = new XmlDocument(); + x.Load(fileName); + var xmlNodeList = x.SelectNodes("//ChapterAtom"); + var sb = new StringBuilder(); + if (xmlNodeList != null) + { + foreach (XmlNode chapter in xmlNodeList) + { + var start = chapter.SelectSingleNode("ChapterTimeStart"); + string[] timeParts = start?.InnerText.Split(SplitChars, StringSplitOptions.RemoveEmptyEntries); + if (timeParts?.Length == 4) + { + if (timeParts[3].Length > 3) + { + timeParts[3] = timeParts[3].Substring(0, 3); + } + + var ts = new TimeSpan(0, Convert.ToInt32(timeParts[0]), Convert.ToInt32(timeParts[1]), Convert.ToInt32(timeParts[2]), Convert.ToInt32(timeParts[3])); + sb.AppendLine(new TimeCode(ts).ToShortStringHHMMSSFF()); + } + } + } + return sb.ToString(); + } + catch + { + return null; + } + } + + private string LoadFromEZTitlesShotchangesFile(string fileName) + { + try + { + var x = new XmlDocument(); + x.Load(fileName); + var xmlNodeList = x.SelectNodes("/shotchanges/shotchanges_list/shotchange"); + var sb = new StringBuilder(); + if (xmlNodeList != null) + { + foreach (XmlNode shotChange in xmlNodeList) + { + sb.AppendLine(shotChange.Attributes["frame"]?.InnerText); + } + } + return sb.ToString(); + } + catch + { + return null; + } + } + + private string LoadFromJsonShotchangesFile(string fileName) + { + try + { + var text = FileUtil.ReadAllTextShared(fileName, Encoding.UTF8); + var list = new List(); + foreach (string line in text.Split(',')) + { + string s = line.Trim() + "}"; + string start = Json.ReadTag(s, "frame_time"); + if (start != null) + { + if (double.TryParse(start, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var startSeconds)) + { + list.Add(startSeconds * 1000.0); + } + } + } + + var sb = new StringBuilder(); + foreach (double ms in list.OrderBy(p => p)) + { + sb.AppendLine(new TimeCode(ms).ToShortStringHHMMSSFF()); + } + return sb.ToString(); + } + catch + { + return null; + } + } + + + private static readonly char[] SplitChars = { ':', '.', ',' }; + + private void buttonOK_Click(object sender, EventArgs e) + { + var lines = string.IsNullOrEmpty(textBoxGenerate.Text) ? textBoxIImport.Lines : textBoxGenerate.Lines; + if (radioButtonHHMMSSMS.Checked) + { + SceneChangesInSeconds = SceneChangesGenerator.GetSeconds(lines); + } + else + { + SceneChangesInSeconds = new List(); + foreach (var line in lines) + { + if (double.TryParse(line, out var d)) + { + if (radioButtonFrames.Checked) + { + SceneChangesInSeconds.Add(d / _frameRate); + } + else if (radioButtonSeconds.Checked) + { + SceneChangesInSeconds.Add(d); + } + else if (radioButtonMilliseconds.Checked) + { + SceneChangesInSeconds.Add(d / TimeCode.BaseUnit); + } + } + } + } + + Configuration.Settings.General.FFmpegSceneThreshold = numericUpDownThreshold.Value.ToString(CultureInfo.InvariantCulture); + if (SceneChangesInSeconds.Count > 0) + { + DialogResult = DialogResult.OK; + } + else + { + MessageBox.Show(Configuration.Settings.Language.ImportSceneChanges.NoSceneChangesFound); + } + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + _abort = true; + DialogResult = DialogResult.Cancel; + } + + private void ImportSceneChanges_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + else if (e.KeyCode == Keys.F8) + { + if (_pause) + { + _pause = false; + textBoxLog.Visible = false; + Cursor = Cursors.WaitCursor; + } + else + { + Cursor = Cursors.Default; + textBoxLog.Text = _log.ToString(); + _pause = true; + textBoxLog.Visible = true; + textBoxLog.BringToFront(); + } + } + } + + private void buttonImportWithFfmpeg_Click(object sender, EventArgs e) + { + _sceneChangesGenerator = new SceneChangesGenerator(); + groupBoxImportText.Enabled = false; + buttonOK.Enabled = false; + progressBar1.Visible = true; + progressBar1.Style = ProgressBarStyle.Marquee; + buttonImportWithFfmpeg.Enabled = false; + numericUpDownThreshold.Enabled = false; + Cursor = Cursors.WaitCursor; + textBoxGenerate.Text = string.Empty; + using (var process = _sceneChangesGenerator.GetProcess(_videoFileName, numericUpDownThreshold.Value)) + { + double lastUpdateSeconds = 0; + radioButtonHHMMSSMS.Checked = true; + while (!process.HasExited) + { + Application.DoEvents(); + System.Threading.Thread.Sleep(100); + + if (_pause && !_abort) + { + continue; + } + + if (_sceneChangesGenerator.LastSeconds > 0.1 && Math.Abs(lastUpdateSeconds - _sceneChangesGenerator.LastSeconds) > 0 - 001) + { + lastUpdateSeconds = _sceneChangesGenerator.LastSeconds; + UpdateImportTextBox(); + } + if (_abort) + { + DialogResult = DialogResult.Cancel; + process.Kill(); + return; + } + } + } + Cursor = Cursors.Default; + UpdateImportTextBox(); + buttonOK.Enabled = true; + if (!_pause) + { + buttonOK_Click(sender, e); + } + } + + private void UpdateImportTextBox() + { + textBoxGenerate.Text = _sceneChangesGenerator.GetTimeCodesString(); + textBoxGenerate.SelectionStart = textBoxGenerate.Text.Length; + textBoxGenerate.ScrollToCaret(); + } + + private void ImportSceneChanges_Shown(object sender, EventArgs e) + { + Activate(); + } + + private void buttonDownloadFfmpeg_Click(object sender, EventArgs e) + { + using (var form = new DownloadFfmpeg()) + { + if (form.ShowDialog(this) == DialogResult.OK && !string.IsNullOrEmpty(form.FFmpegPath)) + { + Configuration.Settings.General.FFmpegLocation = form.FFmpegPath; + buttonDownloadFfmpeg.Visible = false; + buttonImportWithFfmpeg.Enabled = true; + numericUpDownThreshold.Enabled = true; + Configuration.Settings.Save(); + } + } + } + } +} diff --git a/src/Forms/ImportSceneChanges.resx b/src/ui/Forms/ImportSceneChanges.resx similarity index 97% rename from src/Forms/ImportSceneChanges.resx rename to src/ui/Forms/ImportSceneChanges.resx index 3a7d67153..9bad2f599 100644 --- a/src/Forms/ImportSceneChanges.resx +++ b/src/ui/Forms/ImportSceneChanges.resx @@ -1,123 +1,123 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + \ No newline at end of file diff --git a/src/Forms/ImportText.Designer.cs b/src/ui/Forms/ImportText.Designer.cs similarity index 98% rename from src/Forms/ImportText.Designer.cs rename to src/ui/Forms/ImportText.Designer.cs index cbb40d855..57fbfac50 100644 --- a/src/Forms/ImportText.Designer.cs +++ b/src/ui/Forms/ImportText.Designer.cs @@ -1,794 +1,794 @@ -namespace Nikse.SubtitleEdit.Forms -{ - partial class ImportText - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.buttonOpenText = new System.Windows.Forms.Button(); - this.groupBoxImportText = new System.Windows.Forms.GroupBox(); - this.checkBoxMultipleFiles = new System.Windows.Forms.CheckBox(); - this.listViewInputFiles = new System.Windows.Forms.ListView(); - this.columnHeaderFName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderSize = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.contextMenuStripListView = new System.Windows.Forms.ContextMenuStrip(this.components); - this.clearToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.textBoxText = new System.Windows.Forms.TextBox(); - this.groupBoxImportOptions = new System.Windows.Forms.GroupBox(); - this.checkBoxTakeTimeFromFileNames = new System.Windows.Forms.CheckBox(); - this.groupBoxAutoSplitSettings = new System.Windows.Forms.GroupBox(); - this.checkBoxAutoSplitAtEnd = new System.Windows.Forms.CheckBox(); - this.labelSubMaxLen = new System.Windows.Forms.Label(); - this.numericUpDownSubtitleLineMaximumLength = new System.Windows.Forms.NumericUpDown(); - this.textBoxAsEnd = new System.Windows.Forms.TextBox(); - this.checkBoxAutoSplitRemoveLinesNoLetters = new System.Windows.Forms.CheckBox(); - this.checkBoxAutoSplitAtBlankLines = new System.Windows.Forms.CheckBox(); - this.numericUpDownAutoSplitMaxLines = new System.Windows.Forms.NumericUpDown(); - this.labelAutoSplitNumberOfLines = new System.Windows.Forms.Label(); - this.checkBoxAutoBreak = new System.Windows.Forms.CheckBox(); - this.checkBoxGenerateTimeCodes = new System.Windows.Forms.CheckBox(); - this.groupBoxTimeCodes = new System.Windows.Forms.GroupBox(); - this.labelGapBetweenSubtitles = new System.Windows.Forms.Label(); - this.numericUpDownGapBetweenLines = new System.Windows.Forms.NumericUpDown(); - this.groupBoxDuration = new System.Windows.Forms.GroupBox(); - this.numericUpDownDurationFixed = new System.Windows.Forms.NumericUpDown(); - this.radioButtonDurationFixed = new System.Windows.Forms.RadioButton(); - this.radioButtonDurationAuto = new System.Windows.Forms.RadioButton(); - this.checkBoxMergeShortLines = new System.Windows.Forms.CheckBox(); - this.checkBoxRemoveLinesWithoutLetters = new System.Windows.Forms.CheckBox(); - this.groupBoxSplitting = new System.Windows.Forms.GroupBox(); - this.comboBoxLineMode = new System.Windows.Forms.ComboBox(); - this.comboBoxLineBreak = new System.Windows.Forms.ComboBox(); - this.labelLineBreak = new System.Windows.Forms.Label(); - this.radioButtonSplitAtBlankLines = new System.Windows.Forms.RadioButton(); - this.radioButtonAutoSplit = new System.Windows.Forms.RadioButton(); - this.radioButtonLineMode = new System.Windows.Forms.RadioButton(); - this.checkBoxRemoveEmptyLines = new System.Windows.Forms.CheckBox(); - this.buttonRefresh = new System.Windows.Forms.Button(); - this.groupBoxImportResult = new System.Windows.Forms.GroupBox(); - this.contextMenuStripPreview = new System.Windows.Forms.ContextMenuStrip(this.components); - this.startNumberingFromToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.SubtitleListview1 = new Nikse.SubtitleEdit.Controls.SubtitleListView(); - this.labelStatus = new System.Windows.Forms.Label(); - this.groupBoxImportText.SuspendLayout(); - this.contextMenuStripListView.SuspendLayout(); - this.groupBoxImportOptions.SuspendLayout(); - this.groupBoxAutoSplitSettings.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSubtitleLineMaximumLength)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownAutoSplitMaxLines)).BeginInit(); - this.groupBoxTimeCodes.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownGapBetweenLines)).BeginInit(); - this.groupBoxDuration.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDurationFixed)).BeginInit(); - this.groupBoxSplitting.SuspendLayout(); - this.groupBoxImportResult.SuspendLayout(); - this.contextMenuStripPreview.SuspendLayout(); - this.SuspendLayout(); - // - // buttonOpenText - // - this.buttonOpenText.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOpenText.Location = new System.Drawing.Point(475, 19); - this.buttonOpenText.Name = "buttonOpenText"; - this.buttonOpenText.Size = new System.Drawing.Size(143, 23); - this.buttonOpenText.TabIndex = 4; - this.buttonOpenText.Text = "Open file..."; - this.buttonOpenText.UseVisualStyleBackColor = true; - this.buttonOpenText.Click += new System.EventHandler(this.ButtonOpenTextClick); - // - // groupBoxImportText - // - this.groupBoxImportText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxImportText.Controls.Add(this.checkBoxMultipleFiles); - this.groupBoxImportText.Controls.Add(this.buttonOpenText); - this.groupBoxImportText.Controls.Add(this.textBoxText); - this.groupBoxImportText.Controls.Add(this.listViewInputFiles); - this.groupBoxImportText.Location = new System.Drawing.Point(12, 12); - this.groupBoxImportText.Name = "groupBoxImportText"; - this.groupBoxImportText.Size = new System.Drawing.Size(624, 410); - this.groupBoxImportText.TabIndex = 0; - this.groupBoxImportText.TabStop = false; - this.groupBoxImportText.Text = "Import text"; - // - // checkBoxMultipleFiles - // - this.checkBoxMultipleFiles.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.checkBoxMultipleFiles.AutoSize = true; - this.checkBoxMultipleFiles.Location = new System.Drawing.Point(271, 22); - this.checkBoxMultipleFiles.Name = "checkBoxMultipleFiles"; - this.checkBoxMultipleFiles.Size = new System.Drawing.Size(198, 17); - this.checkBoxMultipleFiles.TabIndex = 2; - this.checkBoxMultipleFiles.Text = "Multiple files - one file is one subtitle"; - this.checkBoxMultipleFiles.UseVisualStyleBackColor = true; - this.checkBoxMultipleFiles.CheckedChanged += new System.EventHandler(this.checkBoxMultipleFiles_CheckedChanged); - // - // listViewInputFiles - // - this.listViewInputFiles.AllowDrop = true; - this.listViewInputFiles.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.listViewInputFiles.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeaderFName, - this.columnHeaderSize}); - this.listViewInputFiles.ContextMenuStrip = this.contextMenuStripListView; - this.listViewInputFiles.FullRowSelect = true; - this.listViewInputFiles.HideSelection = false; - this.listViewInputFiles.Location = new System.Drawing.Point(6, 48); - this.listViewInputFiles.Name = "listViewInputFiles"; - this.listViewInputFiles.Size = new System.Drawing.Size(612, 356); - this.listViewInputFiles.TabIndex = 6; - this.listViewInputFiles.UseCompatibleStateImageBehavior = false; - this.listViewInputFiles.View = System.Windows.Forms.View.Details; - this.listViewInputFiles.DragDrop += new System.Windows.Forms.DragEventHandler(this.listViewInputFiles_DragDrop); - this.listViewInputFiles.DragEnter += new System.Windows.Forms.DragEventHandler(this.listViewInputFiles_DragEnter); - // - // columnHeaderFName - // - this.columnHeaderFName.Text = "File name"; - this.columnHeaderFName.Width = 420; - // - // columnHeaderSize - // - this.columnHeaderSize.Text = "Size"; - this.columnHeaderSize.Width = 81; - // - // contextMenuStripListView - // - this.contextMenuStripListView.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.clearToolStripMenuItem}); - this.contextMenuStripListView.Name = "contextMenuStripListView"; - this.contextMenuStripListView.Size = new System.Drawing.Size(102, 26); - // - // clearToolStripMenuItem - // - this.clearToolStripMenuItem.Name = "clearToolStripMenuItem"; - this.clearToolStripMenuItem.Size = new System.Drawing.Size(101, 22); - this.clearToolStripMenuItem.Text = "Clear"; - this.clearToolStripMenuItem.Click += new System.EventHandler(this.clearToolStripMenuItem_Click); - // - // textBoxText - // - this.textBoxText.AllowDrop = true; - this.textBoxText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.textBoxText.Location = new System.Drawing.Point(6, 48); - this.textBoxText.MaxLength = 0; - this.textBoxText.Multiline = true; - this.textBoxText.Name = "textBoxText"; - this.textBoxText.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.textBoxText.Size = new System.Drawing.Size(612, 356); - this.textBoxText.TabIndex = 1; - this.textBoxText.TextChanged += new System.EventHandler(this.TextBoxTextTextChanged); - this.textBoxText.DragDrop += new System.Windows.Forms.DragEventHandler(this.TextBoxTextDragDrop); - this.textBoxText.DragEnter += new System.Windows.Forms.DragEventHandler(this.TextBoxTextDragEnter); - // - // groupBoxImportOptions - // - this.groupBoxImportOptions.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxImportOptions.Controls.Add(this.checkBoxTakeTimeFromFileNames); - this.groupBoxImportOptions.Controls.Add(this.groupBoxAutoSplitSettings); - this.groupBoxImportOptions.Controls.Add(this.checkBoxAutoBreak); - this.groupBoxImportOptions.Controls.Add(this.checkBoxGenerateTimeCodes); - this.groupBoxImportOptions.Controls.Add(this.groupBoxTimeCodes); - this.groupBoxImportOptions.Controls.Add(this.checkBoxMergeShortLines); - this.groupBoxImportOptions.Controls.Add(this.checkBoxRemoveLinesWithoutLetters); - this.groupBoxImportOptions.Controls.Add(this.groupBoxSplitting); - this.groupBoxImportOptions.Controls.Add(this.checkBoxRemoveEmptyLines); - this.groupBoxImportOptions.Location = new System.Drawing.Point(642, 12); - this.groupBoxImportOptions.Name = "groupBoxImportOptions"; - this.groupBoxImportOptions.Size = new System.Drawing.Size(402, 410); - this.groupBoxImportOptions.TabIndex = 1; - this.groupBoxImportOptions.TabStop = false; - this.groupBoxImportOptions.Text = "Import options"; - // - // checkBoxTakeTimeFromFileNames - // - this.checkBoxTakeTimeFromFileNames.AutoSize = true; - this.checkBoxTakeTimeFromFileNames.Location = new System.Drawing.Point(157, 250); - this.checkBoxTakeTimeFromFileNames.Name = "checkBoxTakeTimeFromFileNames"; - this.checkBoxTakeTimeFromFileNames.Size = new System.Drawing.Size(143, 17); - this.checkBoxTakeTimeFromFileNames.TabIndex = 5; - this.checkBoxTakeTimeFromFileNames.Text = "Take time from file name"; - this.checkBoxTakeTimeFromFileNames.UseVisualStyleBackColor = true; - // - // groupBoxAutoSplitSettings - // - this.groupBoxAutoSplitSettings.Controls.Add(this.checkBoxAutoSplitAtEnd); - this.groupBoxAutoSplitSettings.Controls.Add(this.labelSubMaxLen); - this.groupBoxAutoSplitSettings.Controls.Add(this.numericUpDownSubtitleLineMaximumLength); - this.groupBoxAutoSplitSettings.Controls.Add(this.textBoxAsEnd); - this.groupBoxAutoSplitSettings.Controls.Add(this.checkBoxAutoSplitRemoveLinesNoLetters); - this.groupBoxAutoSplitSettings.Controls.Add(this.checkBoxAutoSplitAtBlankLines); - this.groupBoxAutoSplitSettings.Controls.Add(this.numericUpDownAutoSplitMaxLines); - this.groupBoxAutoSplitSettings.Controls.Add(this.labelAutoSplitNumberOfLines); - this.groupBoxAutoSplitSettings.Location = new System.Drawing.Point(6, 91); - this.groupBoxAutoSplitSettings.Name = "groupBoxAutoSplitSettings"; - this.groupBoxAutoSplitSettings.Size = new System.Drawing.Size(390, 153); - this.groupBoxAutoSplitSettings.TabIndex = 1; - this.groupBoxAutoSplitSettings.TabStop = false; - this.groupBoxAutoSplitSettings.Text = "Auto split text settings"; - // - // checkBoxAutoSplitAtEnd - // - this.checkBoxAutoSplitAtEnd.AutoSize = true; - this.checkBoxAutoSplitAtEnd.Checked = true; - this.checkBoxAutoSplitAtEnd.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxAutoSplitAtEnd.Location = new System.Drawing.Point(6, 119); - this.checkBoxAutoSplitAtEnd.Name = "checkBoxAutoSplitAtEnd"; - this.checkBoxAutoSplitAtEnd.Size = new System.Drawing.Size(109, 17); - this.checkBoxAutoSplitAtEnd.TabIndex = 50; - this.checkBoxAutoSplitAtEnd.Text = "Split at end chars"; - this.checkBoxAutoSplitAtEnd.UseVisualStyleBackColor = true; - this.checkBoxAutoSplitAtEnd.CheckedChanged += new System.EventHandler(this.checkBoxAutoSplitAtEnd_CheckedChanged); - // - // labelSubMaxLen - // - this.labelSubMaxLen.AutoSize = true; - this.labelSubMaxLen.Location = new System.Drawing.Point(6, 47); - this.labelSubMaxLen.Name = "labelSubMaxLen"; - this.labelSubMaxLen.Size = new System.Drawing.Size(103, 13); - this.labelSubMaxLen.TabIndex = 17; - this.labelSubMaxLen.Text = "Subtitle max. length"; - // - // numericUpDownSubtitleLineMaximumLength - // - this.numericUpDownSubtitleLineMaximumLength.Location = new System.Drawing.Point(112, 44); - this.numericUpDownSubtitleLineMaximumLength.Maximum = new decimal(new int[] { - 999, - 0, - 0, - 0}); - this.numericUpDownSubtitleLineMaximumLength.Minimum = new decimal(new int[] { - 10, - 0, - 0, - 0}); - this.numericUpDownSubtitleLineMaximumLength.Name = "numericUpDownSubtitleLineMaximumLength"; - this.numericUpDownSubtitleLineMaximumLength.Size = new System.Drawing.Size(49, 21); - this.numericUpDownSubtitleLineMaximumLength.TabIndex = 20; - this.numericUpDownSubtitleLineMaximumLength.Value = new decimal(new int[] { - 43, - 0, - 0, - 0}); - this.numericUpDownSubtitleLineMaximumLength.ValueChanged += new System.EventHandler(this.numericUpDownSubtitleLineMaximumLength_ValueChanged); - // - // textBoxAsEnd - // - this.textBoxAsEnd.Location = new System.Drawing.Point(118, 117); - this.textBoxAsEnd.MaxLength = 5; - this.textBoxAsEnd.Name = "textBoxAsEnd"; - this.textBoxAsEnd.Size = new System.Drawing.Size(50, 21); - this.textBoxAsEnd.TabIndex = 51; - this.textBoxAsEnd.TextChanged += new System.EventHandler(this.textBoxAsEnd1_TextChanged); - this.textBoxAsEnd.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.textBoxAsEnd1_KeyPress); - // - // checkBoxAutoSplitRemoveLinesNoLetters - // - this.checkBoxAutoSplitRemoveLinesNoLetters.AutoSize = true; - this.checkBoxAutoSplitRemoveLinesNoLetters.Checked = true; - this.checkBoxAutoSplitRemoveLinesNoLetters.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxAutoSplitRemoveLinesNoLetters.Location = new System.Drawing.Point(6, 96); - this.checkBoxAutoSplitRemoveLinesNoLetters.Name = "checkBoxAutoSplitRemoveLinesNoLetters"; - this.checkBoxAutoSplitRemoveLinesNoLetters.Size = new System.Drawing.Size(162, 17); - this.checkBoxAutoSplitRemoveLinesNoLetters.TabIndex = 40; - this.checkBoxAutoSplitRemoveLinesNoLetters.Text = "Remove lines without letters"; - this.checkBoxAutoSplitRemoveLinesNoLetters.UseVisualStyleBackColor = true; - this.checkBoxAutoSplitRemoveLinesNoLetters.CheckedChanged += new System.EventHandler(this.checkBoxAutoSplitRemoveLinesNoLetters_CheckedChanged); - // - // checkBoxAutoSplitAtBlankLines - // - this.checkBoxAutoSplitAtBlankLines.AutoSize = true; - this.checkBoxAutoSplitAtBlankLines.Checked = true; - this.checkBoxAutoSplitAtBlankLines.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxAutoSplitAtBlankLines.Location = new System.Drawing.Point(6, 73); - this.checkBoxAutoSplitAtBlankLines.Name = "checkBoxAutoSplitAtBlankLines"; - this.checkBoxAutoSplitAtBlankLines.Size = new System.Drawing.Size(111, 17); - this.checkBoxAutoSplitAtBlankLines.TabIndex = 30; - this.checkBoxAutoSplitAtBlankLines.Text = "Split at blank lines"; - this.checkBoxAutoSplitAtBlankLines.UseVisualStyleBackColor = true; - this.checkBoxAutoSplitAtBlankLines.CheckedChanged += new System.EventHandler(this.checkBoxAutoSplitAtBlankLines_CheckedChanged); - // - // numericUpDownAutoSplitMaxLines - // - this.numericUpDownAutoSplitMaxLines.Location = new System.Drawing.Point(115, 17); - this.numericUpDownAutoSplitMaxLines.Maximum = new decimal(new int[] { - 2, - 0, - 0, - 0}); - this.numericUpDownAutoSplitMaxLines.Minimum = new decimal(new int[] { - 1, - 0, - 0, - 0}); - this.numericUpDownAutoSplitMaxLines.Name = "numericUpDownAutoSplitMaxLines"; - this.numericUpDownAutoSplitMaxLines.Size = new System.Drawing.Size(46, 21); - this.numericUpDownAutoSplitMaxLines.TabIndex = 10; - this.numericUpDownAutoSplitMaxLines.Value = new decimal(new int[] { - 2, - 0, - 0, - 0}); - this.numericUpDownAutoSplitMaxLines.ValueChanged += new System.EventHandler(this.numericUpDownAutoSplitMaxLines_ValueChanged); - // - // labelAutoSplitNumberOfLines - // - this.labelAutoSplitNumberOfLines.AutoSize = true; - this.labelAutoSplitNumberOfLines.Location = new System.Drawing.Point(6, 19); - this.labelAutoSplitNumberOfLines.Name = "labelAutoSplitNumberOfLines"; - this.labelAutoSplitNumberOfLines.Size = new System.Drawing.Size(103, 13); - this.labelAutoSplitNumberOfLines.TabIndex = 6; - this.labelAutoSplitNumberOfLines.Text = "Max number of lines"; - // - // checkBoxAutoBreak - // - this.checkBoxAutoBreak.AutoSize = true; - this.checkBoxAutoBreak.Location = new System.Drawing.Point(19, 163); - this.checkBoxAutoBreak.Name = "checkBoxAutoBreak"; - this.checkBoxAutoBreak.Size = new System.Drawing.Size(104, 17); - this.checkBoxAutoBreak.TabIndex = 7; - this.checkBoxAutoBreak.Text = "Auto-break lines"; - this.checkBoxAutoBreak.UseVisualStyleBackColor = true; - this.checkBoxAutoBreak.CheckedChanged += new System.EventHandler(this.checkBoxAutoBreak_CheckedChanged); - // - // checkBoxGenerateTimeCodes - // - this.checkBoxGenerateTimeCodes.AutoSize = true; - this.checkBoxGenerateTimeCodes.Location = new System.Drawing.Point(16, 250); - this.checkBoxGenerateTimeCodes.Name = "checkBoxGenerateTimeCodes"; - this.checkBoxGenerateTimeCodes.Size = new System.Drawing.Size(125, 17); - this.checkBoxGenerateTimeCodes.TabIndex = 4; - this.checkBoxGenerateTimeCodes.Text = "Generate time codes"; - this.checkBoxGenerateTimeCodes.UseVisualStyleBackColor = true; - this.checkBoxGenerateTimeCodes.CheckedChanged += new System.EventHandler(this.checkBoxGenerateTimeCodes_CheckedChanged); - // - // groupBoxTimeCodes - // - this.groupBoxTimeCodes.Controls.Add(this.labelGapBetweenSubtitles); - this.groupBoxTimeCodes.Controls.Add(this.numericUpDownGapBetweenLines); - this.groupBoxTimeCodes.Controls.Add(this.groupBoxDuration); - this.groupBoxTimeCodes.Enabled = false; - this.groupBoxTimeCodes.Location = new System.Drawing.Point(6, 273); - this.groupBoxTimeCodes.Name = "groupBoxTimeCodes"; - this.groupBoxTimeCodes.Size = new System.Drawing.Size(390, 126); - this.groupBoxTimeCodes.TabIndex = 6; - this.groupBoxTimeCodes.TabStop = false; - this.groupBoxTimeCodes.Text = "Time codes"; - // - // labelGapBetweenSubtitles - // - this.labelGapBetweenSubtitles.AutoSize = true; - this.labelGapBetweenSubtitles.Location = new System.Drawing.Point(6, 23); - this.labelGapBetweenSubtitles.Name = "labelGapBetweenSubtitles"; - this.labelGapBetweenSubtitles.Size = new System.Drawing.Size(180, 13); - this.labelGapBetweenSubtitles.TabIndex = 0; - this.labelGapBetweenSubtitles.Text = "Gap between subtitles (milliseconds)"; - // - // numericUpDownGapBetweenLines - // - this.numericUpDownGapBetweenLines.Location = new System.Drawing.Point(192, 20); - this.numericUpDownGapBetweenLines.Maximum = new decimal(new int[] { - 100000, - 0, - 0, - 0}); - this.numericUpDownGapBetweenLines.Name = "numericUpDownGapBetweenLines"; - this.numericUpDownGapBetweenLines.Size = new System.Drawing.Size(64, 21); - this.numericUpDownGapBetweenLines.TabIndex = 1; - this.numericUpDownGapBetweenLines.Value = new decimal(new int[] { - 1000, - 0, - 0, - 0}); - this.numericUpDownGapBetweenLines.ValueChanged += new System.EventHandler(this.NumericUpDownGapBetweenLinesValueChanged); - // - // groupBoxDuration - // - this.groupBoxDuration.Controls.Add(this.numericUpDownDurationFixed); - this.groupBoxDuration.Controls.Add(this.radioButtonDurationFixed); - this.groupBoxDuration.Controls.Add(this.radioButtonDurationAuto); - this.groupBoxDuration.Location = new System.Drawing.Point(9, 47); - this.groupBoxDuration.Name = "groupBoxDuration"; - this.groupBoxDuration.Size = new System.Drawing.Size(247, 70); - this.groupBoxDuration.TabIndex = 2; - this.groupBoxDuration.TabStop = false; - this.groupBoxDuration.Text = "Duration"; - // - // numericUpDownDurationFixed - // - this.numericUpDownDurationFixed.Location = new System.Drawing.Point(111, 42); - this.numericUpDownDurationFixed.Maximum = new decimal(new int[] { - 100000, - 0, - 0, - 0}); - this.numericUpDownDurationFixed.Name = "numericUpDownDurationFixed"; - this.numericUpDownDurationFixed.Size = new System.Drawing.Size(64, 21); - this.numericUpDownDurationFixed.TabIndex = 2; - this.numericUpDownDurationFixed.Value = new decimal(new int[] { - 2000, - 0, - 0, - 0}); - this.numericUpDownDurationFixed.ValueChanged += new System.EventHandler(this.NumericUpDownDurationFixedValueChanged); - // - // radioButtonDurationFixed - // - this.radioButtonDurationFixed.AutoSize = true; - this.radioButtonDurationFixed.Location = new System.Drawing.Point(16, 42); - this.radioButtonDurationFixed.Name = "radioButtonDurationFixed"; - this.radioButtonDurationFixed.Size = new System.Drawing.Size(51, 17); - this.radioButtonDurationFixed.TabIndex = 1; - this.radioButtonDurationFixed.Text = "Fixed"; - this.radioButtonDurationFixed.UseVisualStyleBackColor = true; - this.radioButtonDurationFixed.CheckedChanged += new System.EventHandler(this.RadioButtonDurationFixedCheckedChanged); - // - // radioButtonDurationAuto - // - this.radioButtonDurationAuto.AutoSize = true; - this.radioButtonDurationAuto.Checked = true; - this.radioButtonDurationAuto.Location = new System.Drawing.Point(16, 19); - this.radioButtonDurationAuto.Name = "radioButtonDurationAuto"; - this.radioButtonDurationAuto.Size = new System.Drawing.Size(48, 17); - this.radioButtonDurationAuto.TabIndex = 0; - this.radioButtonDurationAuto.TabStop = true; - this.radioButtonDurationAuto.Text = "Auto"; - this.radioButtonDurationAuto.UseVisualStyleBackColor = true; - this.radioButtonDurationAuto.CheckedChanged += new System.EventHandler(this.RadioButtonDurationAutoCheckedChanged); - // - // checkBoxMergeShortLines - // - this.checkBoxMergeShortLines.AutoSize = true; - this.checkBoxMergeShortLines.Checked = true; - this.checkBoxMergeShortLines.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxMergeShortLines.Location = new System.Drawing.Point(19, 94); - this.checkBoxMergeShortLines.Name = "checkBoxMergeShortLines"; - this.checkBoxMergeShortLines.Size = new System.Drawing.Size(193, 17); - this.checkBoxMergeShortLines.TabIndex = 1; - this.checkBoxMergeShortLines.Text = "Merge short lines with continuation"; - this.checkBoxMergeShortLines.UseVisualStyleBackColor = true; - this.checkBoxMergeShortLines.CheckedChanged += new System.EventHandler(this.CheckBoxMergeShortLinesCheckedChanged); - // - // checkBoxRemoveLinesWithoutLetters - // - this.checkBoxRemoveLinesWithoutLetters.AutoSize = true; - this.checkBoxRemoveLinesWithoutLetters.Checked = true; - this.checkBoxRemoveLinesWithoutLetters.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxRemoveLinesWithoutLetters.Location = new System.Drawing.Point(19, 140); - this.checkBoxRemoveLinesWithoutLetters.Name = "checkBoxRemoveLinesWithoutLetters"; - this.checkBoxRemoveLinesWithoutLetters.Size = new System.Drawing.Size(162, 17); - this.checkBoxRemoveLinesWithoutLetters.TabIndex = 3; - this.checkBoxRemoveLinesWithoutLetters.Text = "Remove lines without letters"; - this.checkBoxRemoveLinesWithoutLetters.UseVisualStyleBackColor = true; - this.checkBoxRemoveLinesWithoutLetters.CheckedChanged += new System.EventHandler(this.CheckBoxRemoveLinesWithoutLettersOrNumbersCheckedChanged); - // - // groupBoxSplitting - // - this.groupBoxSplitting.Controls.Add(this.comboBoxLineMode); - this.groupBoxSplitting.Controls.Add(this.comboBoxLineBreak); - this.groupBoxSplitting.Controls.Add(this.labelLineBreak); - this.groupBoxSplitting.Controls.Add(this.radioButtonSplitAtBlankLines); - this.groupBoxSplitting.Controls.Add(this.radioButtonAutoSplit); - this.groupBoxSplitting.Controls.Add(this.radioButtonLineMode); - this.groupBoxSplitting.Location = new System.Drawing.Point(6, 17); - this.groupBoxSplitting.Name = "groupBoxSplitting"; - this.groupBoxSplitting.Size = new System.Drawing.Size(390, 68); - this.groupBoxSplitting.TabIndex = 0; - this.groupBoxSplitting.TabStop = false; - this.groupBoxSplitting.Text = "Splitting"; - // - // comboBoxLineMode - // - this.comboBoxLineMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxLineMode.FormattingEnabled = true; - this.comboBoxLineMode.Items.AddRange(new object[] { - "One line is a subtitle", - "Two lines is a subtitle"}); - this.comboBoxLineMode.Location = new System.Drawing.Point(31, 41); - this.comboBoxLineMode.Name = "comboBoxLineMode"; - this.comboBoxLineMode.Size = new System.Drawing.Size(144, 21); - this.comboBoxLineMode.TabIndex = 2; - this.comboBoxLineMode.SelectedIndexChanged += new System.EventHandler(this.comboBoxLineMode_SelectedIndexChanged); - // - // comboBoxLineBreak - // - this.comboBoxLineBreak.FormattingEnabled = true; - this.comboBoxLineBreak.Items.AddRange(new object[] { - "|", - "\\N;\\n", - "|;\\N;\\n;//;
;
;
"}); - this.comboBoxLineBreak.Location = new System.Drawing.Point(246, 41); - this.comboBoxLineBreak.Name = "comboBoxLineBreak"; - this.comboBoxLineBreak.Size = new System.Drawing.Size(107, 21); - this.comboBoxLineBreak.TabIndex = 5; - this.comboBoxLineBreak.TextChanged += new System.EventHandler(this.comboBoxLineBreak_TextChanged); - // - // labelLineBreak - // - this.labelLineBreak.AutoSize = true; - this.labelLineBreak.Location = new System.Drawing.Point(184, 44); - this.labelLineBreak.Name = "labelLineBreak"; - this.labelLineBreak.Size = new System.Drawing.Size(56, 13); - this.labelLineBreak.TabIndex = 4; - this.labelLineBreak.Text = "Line break"; - // - // radioButtonSplitAtBlankLines - // - this.radioButtonSplitAtBlankLines.AutoSize = true; - this.radioButtonSplitAtBlankLines.Location = new System.Drawing.Point(183, 19); - this.radioButtonSplitAtBlankLines.Name = "radioButtonSplitAtBlankLines"; - this.radioButtonSplitAtBlankLines.Size = new System.Drawing.Size(110, 17); - this.radioButtonSplitAtBlankLines.TabIndex = 3; - this.radioButtonSplitAtBlankLines.Text = "Split at blank lines"; - this.radioButtonSplitAtBlankLines.UseVisualStyleBackColor = true; - this.radioButtonSplitAtBlankLines.CheckedChanged += new System.EventHandler(this.radioButtonSplitAtBlankLines_CheckedChanged); - // - // radioButtonAutoSplit - // - this.radioButtonAutoSplit.AutoSize = true; - this.radioButtonAutoSplit.Checked = true; - this.radioButtonAutoSplit.Location = new System.Drawing.Point(14, 19); - this.radioButtonAutoSplit.Name = "radioButtonAutoSplit"; - this.radioButtonAutoSplit.Size = new System.Drawing.Size(93, 17); - this.radioButtonAutoSplit.TabIndex = 0; - this.radioButtonAutoSplit.TabStop = true; - this.radioButtonAutoSplit.Text = "Auto split text"; - this.radioButtonAutoSplit.UseVisualStyleBackColor = true; - this.radioButtonAutoSplit.CheckedChanged += new System.EventHandler(this.RadioButtonAutoSplitCheckedChanged); - // - // radioButtonLineMode - // - this.radioButtonLineMode.AutoSize = true; - this.radioButtonLineMode.Location = new System.Drawing.Point(14, 43); - this.radioButtonLineMode.Name = "radioButtonLineMode"; - this.radioButtonLineMode.Size = new System.Drawing.Size(133, 17); - this.radioButtonLineMode.TabIndex = 1; - this.radioButtonLineMode.Text = "One line is one subtitle"; - this.radioButtonLineMode.UseVisualStyleBackColor = true; - this.radioButtonLineMode.CheckedChanged += new System.EventHandler(this.RadioButtonLineModeCheckedChanged); - // - // checkBoxRemoveEmptyLines - // - this.checkBoxRemoveEmptyLines.AutoSize = true; - this.checkBoxRemoveEmptyLines.Checked = true; - this.checkBoxRemoveEmptyLines.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxRemoveEmptyLines.Location = new System.Drawing.Point(19, 117); - this.checkBoxRemoveEmptyLines.Name = "checkBoxRemoveEmptyLines"; - this.checkBoxRemoveEmptyLines.Size = new System.Drawing.Size(122, 17); - this.checkBoxRemoveEmptyLines.TabIndex = 2; - this.checkBoxRemoveEmptyLines.Text = "Remove empty lines"; - this.checkBoxRemoveEmptyLines.UseVisualStyleBackColor = true; - this.checkBoxRemoveEmptyLines.CheckedChanged += new System.EventHandler(this.CheckBoxRemoveEmptyLinesCheckedChanged); - // - // buttonRefresh - // - this.buttonRefresh.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonRefresh.Location = new System.Drawing.Point(774, 735); - this.buttonRefresh.Name = "buttonRefresh"; - this.buttonRefresh.Size = new System.Drawing.Size(102, 23); - this.buttonRefresh.TabIndex = 103; - this.buttonRefresh.Text = "Refresh"; - this.buttonRefresh.UseVisualStyleBackColor = true; - this.buttonRefresh.Click += new System.EventHandler(this.ButtonRefreshClick); - // - // groupBoxImportResult - // - this.groupBoxImportResult.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxImportResult.Controls.Add(this.SubtitleListview1); - this.groupBoxImportResult.Location = new System.Drawing.Point(12, 428); - this.groupBoxImportResult.Name = "groupBoxImportResult"; - this.groupBoxImportResult.Size = new System.Drawing.Size(1032, 299); - this.groupBoxImportResult.TabIndex = 2; - this.groupBoxImportResult.TabStop = false; - this.groupBoxImportResult.Text = "Preview"; - // - // contextMenuStripPreview - // - this.contextMenuStripPreview.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.startNumberingFromToolStripMenuItem}); - this.contextMenuStripPreview.Name = "contextMenuStripPreview"; - this.contextMenuStripPreview.Size = new System.Drawing.Size(199, 26); - // - // startNumberingFromToolStripMenuItem - // - this.startNumberingFromToolStripMenuItem.Name = "startNumberingFromToolStripMenuItem"; - this.startNumberingFromToolStripMenuItem.Size = new System.Drawing.Size(198, 22); - this.startNumberingFromToolStripMenuItem.Text = "Start numbering from..."; - this.startNumberingFromToolStripMenuItem.Click += new System.EventHandler(this.startNumberingFromToolStripMenuItem_Click); - // - // openFileDialog1 - // - this.openFileDialog1.FileName = "openFileDialog1"; - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(963, 735); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 105; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.ButtonCancelClick); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(882, 735); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 104; - this.buttonOK.Text = "&Next >"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); - // - // SubtitleListview1 - // - this.SubtitleListview1.AllowColumnReorder = true; - this.SubtitleListview1.AllowDrop = true; - this.SubtitleListview1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.SubtitleListview1.ContextMenuStrip = this.contextMenuStripPreview; - this.SubtitleListview1.FirstVisibleIndex = -1; - this.SubtitleListview1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.SubtitleListview1.FullRowSelect = true; - this.SubtitleListview1.GridLines = true; - this.SubtitleListview1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; - this.SubtitleListview1.HideSelection = false; - this.SubtitleListview1.Location = new System.Drawing.Point(6, 20); - this.SubtitleListview1.MultiSelect = false; - this.SubtitleListview1.Name = "SubtitleListview1"; - this.SubtitleListview1.OwnerDraw = true; - this.SubtitleListview1.Size = new System.Drawing.Size(1020, 257); - this.SubtitleListview1.SubtitleFontBold = false; - this.SubtitleListview1.SubtitleFontName = "Tahoma"; - this.SubtitleListview1.SubtitleFontSize = 8; - this.SubtitleListview1.TabIndex = 0; - this.SubtitleListview1.UseCompatibleStateImageBehavior = false; - this.SubtitleListview1.UseSyntaxColoring = true; - this.SubtitleListview1.View = System.Windows.Forms.View.Details; - // - // labelStatus - // - this.labelStatus.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelStatus.AutoSize = true; - this.labelStatus.Location = new System.Drawing.Point(12, 734); - this.labelStatus.Name = "labelStatus"; - this.labelStatus.Size = new System.Drawing.Size(35, 13); - this.labelStatus.TabIndex = 106; - this.labelStatus.Text = "label1"; - // - // ImportText - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(1056, 772); - this.Controls.Add(this.labelStatus); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonRefresh); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.groupBoxImportResult); - this.Controls.Add(this.groupBoxImportOptions); - this.Controls.Add(this.groupBoxImportText); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.KeyPreview = true; - this.MinimumSize = new System.Drawing.Size(810, 648); - this.Name = "ImportText"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Import text"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.ImportText_FormClosing); - this.Shown += new System.EventHandler(this.ImportText_Shown); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ImportTextKeyDown); - this.groupBoxImportText.ResumeLayout(false); - this.groupBoxImportText.PerformLayout(); - this.contextMenuStripListView.ResumeLayout(false); - this.groupBoxImportOptions.ResumeLayout(false); - this.groupBoxImportOptions.PerformLayout(); - this.groupBoxAutoSplitSettings.ResumeLayout(false); - this.groupBoxAutoSplitSettings.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSubtitleLineMaximumLength)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownAutoSplitMaxLines)).EndInit(); - this.groupBoxTimeCodes.ResumeLayout(false); - this.groupBoxTimeCodes.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownGapBetweenLines)).EndInit(); - this.groupBoxDuration.ResumeLayout(false); - this.groupBoxDuration.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDurationFixed)).EndInit(); - this.groupBoxSplitting.ResumeLayout(false); - this.groupBoxSplitting.PerformLayout(); - this.groupBoxImportResult.ResumeLayout(false); - this.contextMenuStripPreview.ResumeLayout(false); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button buttonOpenText; - private Controls.SubtitleListView SubtitleListview1; - private System.Windows.Forms.GroupBox groupBoxImportText; - private System.Windows.Forms.TextBox textBoxText; - private System.Windows.Forms.GroupBox groupBoxImportOptions; - private System.Windows.Forms.GroupBox groupBoxImportResult; - private System.Windows.Forms.OpenFileDialog openFileDialog1; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.GroupBox groupBoxSplitting; - private System.Windows.Forms.RadioButton radioButtonAutoSplit; - private System.Windows.Forms.RadioButton radioButtonLineMode; - private System.Windows.Forms.CheckBox checkBoxRemoveEmptyLines; - private System.Windows.Forms.CheckBox checkBoxRemoveLinesWithoutLetters; - private System.Windows.Forms.NumericUpDown numericUpDownGapBetweenLines; - private System.Windows.Forms.Label labelGapBetweenSubtitles; - private System.Windows.Forms.Button buttonRefresh; - private System.Windows.Forms.GroupBox groupBoxDuration; - private System.Windows.Forms.NumericUpDown numericUpDownDurationFixed; - private System.Windows.Forms.RadioButton radioButtonDurationFixed; - private System.Windows.Forms.RadioButton radioButtonDurationAuto; - private System.Windows.Forms.CheckBox checkBoxMergeShortLines; - private System.Windows.Forms.RadioButton radioButtonSplitAtBlankLines; - private System.Windows.Forms.CheckBox checkBoxGenerateTimeCodes; - private System.Windows.Forms.GroupBox groupBoxTimeCodes; - private System.Windows.Forms.Label labelLineBreak; - private System.Windows.Forms.CheckBox checkBoxMultipleFiles; - private System.Windows.Forms.ListView listViewInputFiles; - private System.Windows.Forms.ColumnHeader columnHeaderFName; - private System.Windows.Forms.ColumnHeader columnHeaderSize; - private System.Windows.Forms.CheckBox checkBoxAutoBreak; - private System.Windows.Forms.ComboBox comboBoxLineBreak; - private System.Windows.Forms.ContextMenuStrip contextMenuStripListView; - private System.Windows.Forms.ToolStripMenuItem clearToolStripMenuItem; - private System.Windows.Forms.ContextMenuStrip contextMenuStripPreview; - private System.Windows.Forms.ToolStripMenuItem startNumberingFromToolStripMenuItem; - private System.Windows.Forms.GroupBox groupBoxAutoSplitSettings; - private System.Windows.Forms.TextBox textBoxAsEnd; - private System.Windows.Forms.CheckBox checkBoxAutoSplitRemoveLinesNoLetters; - private System.Windows.Forms.CheckBox checkBoxAutoSplitAtBlankLines; - private System.Windows.Forms.NumericUpDown numericUpDownAutoSplitMaxLines; - private System.Windows.Forms.Label labelAutoSplitNumberOfLines; - private System.Windows.Forms.Label labelSubMaxLen; - private System.Windows.Forms.NumericUpDown numericUpDownSubtitleLineMaximumLength; - private System.Windows.Forms.CheckBox checkBoxAutoSplitAtEnd; - private System.Windows.Forms.ComboBox comboBoxLineMode; - private System.Windows.Forms.CheckBox checkBoxTakeTimeFromFileNames; - private System.Windows.Forms.Label labelStatus; - } +namespace Nikse.SubtitleEdit.Forms +{ + partial class ImportText + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.buttonOpenText = new System.Windows.Forms.Button(); + this.groupBoxImportText = new System.Windows.Forms.GroupBox(); + this.checkBoxMultipleFiles = new System.Windows.Forms.CheckBox(); + this.listViewInputFiles = new System.Windows.Forms.ListView(); + this.columnHeaderFName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderSize = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.contextMenuStripListView = new System.Windows.Forms.ContextMenuStrip(this.components); + this.clearToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.textBoxText = new System.Windows.Forms.TextBox(); + this.groupBoxImportOptions = new System.Windows.Forms.GroupBox(); + this.checkBoxTakeTimeFromFileNames = new System.Windows.Forms.CheckBox(); + this.groupBoxAutoSplitSettings = new System.Windows.Forms.GroupBox(); + this.checkBoxAutoSplitAtEnd = new System.Windows.Forms.CheckBox(); + this.labelSubMaxLen = new System.Windows.Forms.Label(); + this.numericUpDownSubtitleLineMaximumLength = new System.Windows.Forms.NumericUpDown(); + this.textBoxAsEnd = new System.Windows.Forms.TextBox(); + this.checkBoxAutoSplitRemoveLinesNoLetters = new System.Windows.Forms.CheckBox(); + this.checkBoxAutoSplitAtBlankLines = new System.Windows.Forms.CheckBox(); + this.numericUpDownAutoSplitMaxLines = new System.Windows.Forms.NumericUpDown(); + this.labelAutoSplitNumberOfLines = new System.Windows.Forms.Label(); + this.checkBoxAutoBreak = new System.Windows.Forms.CheckBox(); + this.checkBoxGenerateTimeCodes = new System.Windows.Forms.CheckBox(); + this.groupBoxTimeCodes = new System.Windows.Forms.GroupBox(); + this.labelGapBetweenSubtitles = new System.Windows.Forms.Label(); + this.numericUpDownGapBetweenLines = new System.Windows.Forms.NumericUpDown(); + this.groupBoxDuration = new System.Windows.Forms.GroupBox(); + this.numericUpDownDurationFixed = new System.Windows.Forms.NumericUpDown(); + this.radioButtonDurationFixed = new System.Windows.Forms.RadioButton(); + this.radioButtonDurationAuto = new System.Windows.Forms.RadioButton(); + this.checkBoxMergeShortLines = new System.Windows.Forms.CheckBox(); + this.checkBoxRemoveLinesWithoutLetters = new System.Windows.Forms.CheckBox(); + this.groupBoxSplitting = new System.Windows.Forms.GroupBox(); + this.comboBoxLineMode = new System.Windows.Forms.ComboBox(); + this.comboBoxLineBreak = new System.Windows.Forms.ComboBox(); + this.labelLineBreak = new System.Windows.Forms.Label(); + this.radioButtonSplitAtBlankLines = new System.Windows.Forms.RadioButton(); + this.radioButtonAutoSplit = new System.Windows.Forms.RadioButton(); + this.radioButtonLineMode = new System.Windows.Forms.RadioButton(); + this.checkBoxRemoveEmptyLines = new System.Windows.Forms.CheckBox(); + this.buttonRefresh = new System.Windows.Forms.Button(); + this.groupBoxImportResult = new System.Windows.Forms.GroupBox(); + this.contextMenuStripPreview = new System.Windows.Forms.ContextMenuStrip(this.components); + this.startNumberingFromToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.SubtitleListview1 = new Nikse.SubtitleEdit.Controls.SubtitleListView(); + this.labelStatus = new System.Windows.Forms.Label(); + this.groupBoxImportText.SuspendLayout(); + this.contextMenuStripListView.SuspendLayout(); + this.groupBoxImportOptions.SuspendLayout(); + this.groupBoxAutoSplitSettings.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSubtitleLineMaximumLength)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownAutoSplitMaxLines)).BeginInit(); + this.groupBoxTimeCodes.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownGapBetweenLines)).BeginInit(); + this.groupBoxDuration.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDurationFixed)).BeginInit(); + this.groupBoxSplitting.SuspendLayout(); + this.groupBoxImportResult.SuspendLayout(); + this.contextMenuStripPreview.SuspendLayout(); + this.SuspendLayout(); + // + // buttonOpenText + // + this.buttonOpenText.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOpenText.Location = new System.Drawing.Point(475, 19); + this.buttonOpenText.Name = "buttonOpenText"; + this.buttonOpenText.Size = new System.Drawing.Size(143, 23); + this.buttonOpenText.TabIndex = 4; + this.buttonOpenText.Text = "Open file..."; + this.buttonOpenText.UseVisualStyleBackColor = true; + this.buttonOpenText.Click += new System.EventHandler(this.ButtonOpenTextClick); + // + // groupBoxImportText + // + this.groupBoxImportText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxImportText.Controls.Add(this.checkBoxMultipleFiles); + this.groupBoxImportText.Controls.Add(this.buttonOpenText); + this.groupBoxImportText.Controls.Add(this.textBoxText); + this.groupBoxImportText.Controls.Add(this.listViewInputFiles); + this.groupBoxImportText.Location = new System.Drawing.Point(12, 12); + this.groupBoxImportText.Name = "groupBoxImportText"; + this.groupBoxImportText.Size = new System.Drawing.Size(624, 410); + this.groupBoxImportText.TabIndex = 0; + this.groupBoxImportText.TabStop = false; + this.groupBoxImportText.Text = "Import text"; + // + // checkBoxMultipleFiles + // + this.checkBoxMultipleFiles.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.checkBoxMultipleFiles.AutoSize = true; + this.checkBoxMultipleFiles.Location = new System.Drawing.Point(271, 22); + this.checkBoxMultipleFiles.Name = "checkBoxMultipleFiles"; + this.checkBoxMultipleFiles.Size = new System.Drawing.Size(198, 17); + this.checkBoxMultipleFiles.TabIndex = 2; + this.checkBoxMultipleFiles.Text = "Multiple files - one file is one subtitle"; + this.checkBoxMultipleFiles.UseVisualStyleBackColor = true; + this.checkBoxMultipleFiles.CheckedChanged += new System.EventHandler(this.checkBoxMultipleFiles_CheckedChanged); + // + // listViewInputFiles + // + this.listViewInputFiles.AllowDrop = true; + this.listViewInputFiles.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listViewInputFiles.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeaderFName, + this.columnHeaderSize}); + this.listViewInputFiles.ContextMenuStrip = this.contextMenuStripListView; + this.listViewInputFiles.FullRowSelect = true; + this.listViewInputFiles.HideSelection = false; + this.listViewInputFiles.Location = new System.Drawing.Point(6, 48); + this.listViewInputFiles.Name = "listViewInputFiles"; + this.listViewInputFiles.Size = new System.Drawing.Size(612, 356); + this.listViewInputFiles.TabIndex = 6; + this.listViewInputFiles.UseCompatibleStateImageBehavior = false; + this.listViewInputFiles.View = System.Windows.Forms.View.Details; + this.listViewInputFiles.DragDrop += new System.Windows.Forms.DragEventHandler(this.listViewInputFiles_DragDrop); + this.listViewInputFiles.DragEnter += new System.Windows.Forms.DragEventHandler(this.listViewInputFiles_DragEnter); + // + // columnHeaderFName + // + this.columnHeaderFName.Text = "File name"; + this.columnHeaderFName.Width = 420; + // + // columnHeaderSize + // + this.columnHeaderSize.Text = "Size"; + this.columnHeaderSize.Width = 81; + // + // contextMenuStripListView + // + this.contextMenuStripListView.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.clearToolStripMenuItem}); + this.contextMenuStripListView.Name = "contextMenuStripListView"; + this.contextMenuStripListView.Size = new System.Drawing.Size(102, 26); + // + // clearToolStripMenuItem + // + this.clearToolStripMenuItem.Name = "clearToolStripMenuItem"; + this.clearToolStripMenuItem.Size = new System.Drawing.Size(101, 22); + this.clearToolStripMenuItem.Text = "Clear"; + this.clearToolStripMenuItem.Click += new System.EventHandler(this.clearToolStripMenuItem_Click); + // + // textBoxText + // + this.textBoxText.AllowDrop = true; + this.textBoxText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxText.Location = new System.Drawing.Point(6, 48); + this.textBoxText.MaxLength = 0; + this.textBoxText.Multiline = true; + this.textBoxText.Name = "textBoxText"; + this.textBoxText.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.textBoxText.Size = new System.Drawing.Size(612, 356); + this.textBoxText.TabIndex = 1; + this.textBoxText.TextChanged += new System.EventHandler(this.TextBoxTextTextChanged); + this.textBoxText.DragDrop += new System.Windows.Forms.DragEventHandler(this.TextBoxTextDragDrop); + this.textBoxText.DragEnter += new System.Windows.Forms.DragEventHandler(this.TextBoxTextDragEnter); + // + // groupBoxImportOptions + // + this.groupBoxImportOptions.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxImportOptions.Controls.Add(this.checkBoxTakeTimeFromFileNames); + this.groupBoxImportOptions.Controls.Add(this.groupBoxAutoSplitSettings); + this.groupBoxImportOptions.Controls.Add(this.checkBoxAutoBreak); + this.groupBoxImportOptions.Controls.Add(this.checkBoxGenerateTimeCodes); + this.groupBoxImportOptions.Controls.Add(this.groupBoxTimeCodes); + this.groupBoxImportOptions.Controls.Add(this.checkBoxMergeShortLines); + this.groupBoxImportOptions.Controls.Add(this.checkBoxRemoveLinesWithoutLetters); + this.groupBoxImportOptions.Controls.Add(this.groupBoxSplitting); + this.groupBoxImportOptions.Controls.Add(this.checkBoxRemoveEmptyLines); + this.groupBoxImportOptions.Location = new System.Drawing.Point(642, 12); + this.groupBoxImportOptions.Name = "groupBoxImportOptions"; + this.groupBoxImportOptions.Size = new System.Drawing.Size(402, 410); + this.groupBoxImportOptions.TabIndex = 1; + this.groupBoxImportOptions.TabStop = false; + this.groupBoxImportOptions.Text = "Import options"; + // + // checkBoxTakeTimeFromFileNames + // + this.checkBoxTakeTimeFromFileNames.AutoSize = true; + this.checkBoxTakeTimeFromFileNames.Location = new System.Drawing.Point(157, 250); + this.checkBoxTakeTimeFromFileNames.Name = "checkBoxTakeTimeFromFileNames"; + this.checkBoxTakeTimeFromFileNames.Size = new System.Drawing.Size(143, 17); + this.checkBoxTakeTimeFromFileNames.TabIndex = 5; + this.checkBoxTakeTimeFromFileNames.Text = "Take time from file name"; + this.checkBoxTakeTimeFromFileNames.UseVisualStyleBackColor = true; + // + // groupBoxAutoSplitSettings + // + this.groupBoxAutoSplitSettings.Controls.Add(this.checkBoxAutoSplitAtEnd); + this.groupBoxAutoSplitSettings.Controls.Add(this.labelSubMaxLen); + this.groupBoxAutoSplitSettings.Controls.Add(this.numericUpDownSubtitleLineMaximumLength); + this.groupBoxAutoSplitSettings.Controls.Add(this.textBoxAsEnd); + this.groupBoxAutoSplitSettings.Controls.Add(this.checkBoxAutoSplitRemoveLinesNoLetters); + this.groupBoxAutoSplitSettings.Controls.Add(this.checkBoxAutoSplitAtBlankLines); + this.groupBoxAutoSplitSettings.Controls.Add(this.numericUpDownAutoSplitMaxLines); + this.groupBoxAutoSplitSettings.Controls.Add(this.labelAutoSplitNumberOfLines); + this.groupBoxAutoSplitSettings.Location = new System.Drawing.Point(6, 91); + this.groupBoxAutoSplitSettings.Name = "groupBoxAutoSplitSettings"; + this.groupBoxAutoSplitSettings.Size = new System.Drawing.Size(390, 153); + this.groupBoxAutoSplitSettings.TabIndex = 1; + this.groupBoxAutoSplitSettings.TabStop = false; + this.groupBoxAutoSplitSettings.Text = "Auto split text settings"; + // + // checkBoxAutoSplitAtEnd + // + this.checkBoxAutoSplitAtEnd.AutoSize = true; + this.checkBoxAutoSplitAtEnd.Checked = true; + this.checkBoxAutoSplitAtEnd.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxAutoSplitAtEnd.Location = new System.Drawing.Point(6, 119); + this.checkBoxAutoSplitAtEnd.Name = "checkBoxAutoSplitAtEnd"; + this.checkBoxAutoSplitAtEnd.Size = new System.Drawing.Size(109, 17); + this.checkBoxAutoSplitAtEnd.TabIndex = 50; + this.checkBoxAutoSplitAtEnd.Text = "Split at end chars"; + this.checkBoxAutoSplitAtEnd.UseVisualStyleBackColor = true; + this.checkBoxAutoSplitAtEnd.CheckedChanged += new System.EventHandler(this.checkBoxAutoSplitAtEnd_CheckedChanged); + // + // labelSubMaxLen + // + this.labelSubMaxLen.AutoSize = true; + this.labelSubMaxLen.Location = new System.Drawing.Point(6, 47); + this.labelSubMaxLen.Name = "labelSubMaxLen"; + this.labelSubMaxLen.Size = new System.Drawing.Size(103, 13); + this.labelSubMaxLen.TabIndex = 17; + this.labelSubMaxLen.Text = "Subtitle max. length"; + // + // numericUpDownSubtitleLineMaximumLength + // + this.numericUpDownSubtitleLineMaximumLength.Location = new System.Drawing.Point(112, 44); + this.numericUpDownSubtitleLineMaximumLength.Maximum = new decimal(new int[] { + 999, + 0, + 0, + 0}); + this.numericUpDownSubtitleLineMaximumLength.Minimum = new decimal(new int[] { + 10, + 0, + 0, + 0}); + this.numericUpDownSubtitleLineMaximumLength.Name = "numericUpDownSubtitleLineMaximumLength"; + this.numericUpDownSubtitleLineMaximumLength.Size = new System.Drawing.Size(49, 21); + this.numericUpDownSubtitleLineMaximumLength.TabIndex = 20; + this.numericUpDownSubtitleLineMaximumLength.Value = new decimal(new int[] { + 43, + 0, + 0, + 0}); + this.numericUpDownSubtitleLineMaximumLength.ValueChanged += new System.EventHandler(this.numericUpDownSubtitleLineMaximumLength_ValueChanged); + // + // textBoxAsEnd + // + this.textBoxAsEnd.Location = new System.Drawing.Point(118, 117); + this.textBoxAsEnd.MaxLength = 5; + this.textBoxAsEnd.Name = "textBoxAsEnd"; + this.textBoxAsEnd.Size = new System.Drawing.Size(50, 21); + this.textBoxAsEnd.TabIndex = 51; + this.textBoxAsEnd.TextChanged += new System.EventHandler(this.textBoxAsEnd1_TextChanged); + this.textBoxAsEnd.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.textBoxAsEnd1_KeyPress); + // + // checkBoxAutoSplitRemoveLinesNoLetters + // + this.checkBoxAutoSplitRemoveLinesNoLetters.AutoSize = true; + this.checkBoxAutoSplitRemoveLinesNoLetters.Checked = true; + this.checkBoxAutoSplitRemoveLinesNoLetters.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxAutoSplitRemoveLinesNoLetters.Location = new System.Drawing.Point(6, 96); + this.checkBoxAutoSplitRemoveLinesNoLetters.Name = "checkBoxAutoSplitRemoveLinesNoLetters"; + this.checkBoxAutoSplitRemoveLinesNoLetters.Size = new System.Drawing.Size(162, 17); + this.checkBoxAutoSplitRemoveLinesNoLetters.TabIndex = 40; + this.checkBoxAutoSplitRemoveLinesNoLetters.Text = "Remove lines without letters"; + this.checkBoxAutoSplitRemoveLinesNoLetters.UseVisualStyleBackColor = true; + this.checkBoxAutoSplitRemoveLinesNoLetters.CheckedChanged += new System.EventHandler(this.checkBoxAutoSplitRemoveLinesNoLetters_CheckedChanged); + // + // checkBoxAutoSplitAtBlankLines + // + this.checkBoxAutoSplitAtBlankLines.AutoSize = true; + this.checkBoxAutoSplitAtBlankLines.Checked = true; + this.checkBoxAutoSplitAtBlankLines.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxAutoSplitAtBlankLines.Location = new System.Drawing.Point(6, 73); + this.checkBoxAutoSplitAtBlankLines.Name = "checkBoxAutoSplitAtBlankLines"; + this.checkBoxAutoSplitAtBlankLines.Size = new System.Drawing.Size(111, 17); + this.checkBoxAutoSplitAtBlankLines.TabIndex = 30; + this.checkBoxAutoSplitAtBlankLines.Text = "Split at blank lines"; + this.checkBoxAutoSplitAtBlankLines.UseVisualStyleBackColor = true; + this.checkBoxAutoSplitAtBlankLines.CheckedChanged += new System.EventHandler(this.checkBoxAutoSplitAtBlankLines_CheckedChanged); + // + // numericUpDownAutoSplitMaxLines + // + this.numericUpDownAutoSplitMaxLines.Location = new System.Drawing.Point(115, 17); + this.numericUpDownAutoSplitMaxLines.Maximum = new decimal(new int[] { + 2, + 0, + 0, + 0}); + this.numericUpDownAutoSplitMaxLines.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownAutoSplitMaxLines.Name = "numericUpDownAutoSplitMaxLines"; + this.numericUpDownAutoSplitMaxLines.Size = new System.Drawing.Size(46, 21); + this.numericUpDownAutoSplitMaxLines.TabIndex = 10; + this.numericUpDownAutoSplitMaxLines.Value = new decimal(new int[] { + 2, + 0, + 0, + 0}); + this.numericUpDownAutoSplitMaxLines.ValueChanged += new System.EventHandler(this.numericUpDownAutoSplitMaxLines_ValueChanged); + // + // labelAutoSplitNumberOfLines + // + this.labelAutoSplitNumberOfLines.AutoSize = true; + this.labelAutoSplitNumberOfLines.Location = new System.Drawing.Point(6, 19); + this.labelAutoSplitNumberOfLines.Name = "labelAutoSplitNumberOfLines"; + this.labelAutoSplitNumberOfLines.Size = new System.Drawing.Size(103, 13); + this.labelAutoSplitNumberOfLines.TabIndex = 6; + this.labelAutoSplitNumberOfLines.Text = "Max number of lines"; + // + // checkBoxAutoBreak + // + this.checkBoxAutoBreak.AutoSize = true; + this.checkBoxAutoBreak.Location = new System.Drawing.Point(19, 163); + this.checkBoxAutoBreak.Name = "checkBoxAutoBreak"; + this.checkBoxAutoBreak.Size = new System.Drawing.Size(104, 17); + this.checkBoxAutoBreak.TabIndex = 7; + this.checkBoxAutoBreak.Text = "Auto-break lines"; + this.checkBoxAutoBreak.UseVisualStyleBackColor = true; + this.checkBoxAutoBreak.CheckedChanged += new System.EventHandler(this.checkBoxAutoBreak_CheckedChanged); + // + // checkBoxGenerateTimeCodes + // + this.checkBoxGenerateTimeCodes.AutoSize = true; + this.checkBoxGenerateTimeCodes.Location = new System.Drawing.Point(16, 250); + this.checkBoxGenerateTimeCodes.Name = "checkBoxGenerateTimeCodes"; + this.checkBoxGenerateTimeCodes.Size = new System.Drawing.Size(125, 17); + this.checkBoxGenerateTimeCodes.TabIndex = 4; + this.checkBoxGenerateTimeCodes.Text = "Generate time codes"; + this.checkBoxGenerateTimeCodes.UseVisualStyleBackColor = true; + this.checkBoxGenerateTimeCodes.CheckedChanged += new System.EventHandler(this.checkBoxGenerateTimeCodes_CheckedChanged); + // + // groupBoxTimeCodes + // + this.groupBoxTimeCodes.Controls.Add(this.labelGapBetweenSubtitles); + this.groupBoxTimeCodes.Controls.Add(this.numericUpDownGapBetweenLines); + this.groupBoxTimeCodes.Controls.Add(this.groupBoxDuration); + this.groupBoxTimeCodes.Enabled = false; + this.groupBoxTimeCodes.Location = new System.Drawing.Point(6, 273); + this.groupBoxTimeCodes.Name = "groupBoxTimeCodes"; + this.groupBoxTimeCodes.Size = new System.Drawing.Size(390, 126); + this.groupBoxTimeCodes.TabIndex = 6; + this.groupBoxTimeCodes.TabStop = false; + this.groupBoxTimeCodes.Text = "Time codes"; + // + // labelGapBetweenSubtitles + // + this.labelGapBetweenSubtitles.AutoSize = true; + this.labelGapBetweenSubtitles.Location = new System.Drawing.Point(6, 23); + this.labelGapBetweenSubtitles.Name = "labelGapBetweenSubtitles"; + this.labelGapBetweenSubtitles.Size = new System.Drawing.Size(180, 13); + this.labelGapBetweenSubtitles.TabIndex = 0; + this.labelGapBetweenSubtitles.Text = "Gap between subtitles (milliseconds)"; + // + // numericUpDownGapBetweenLines + // + this.numericUpDownGapBetweenLines.Location = new System.Drawing.Point(192, 20); + this.numericUpDownGapBetweenLines.Maximum = new decimal(new int[] { + 100000, + 0, + 0, + 0}); + this.numericUpDownGapBetweenLines.Name = "numericUpDownGapBetweenLines"; + this.numericUpDownGapBetweenLines.Size = new System.Drawing.Size(64, 21); + this.numericUpDownGapBetweenLines.TabIndex = 1; + this.numericUpDownGapBetweenLines.Value = new decimal(new int[] { + 1000, + 0, + 0, + 0}); + this.numericUpDownGapBetweenLines.ValueChanged += new System.EventHandler(this.NumericUpDownGapBetweenLinesValueChanged); + // + // groupBoxDuration + // + this.groupBoxDuration.Controls.Add(this.numericUpDownDurationFixed); + this.groupBoxDuration.Controls.Add(this.radioButtonDurationFixed); + this.groupBoxDuration.Controls.Add(this.radioButtonDurationAuto); + this.groupBoxDuration.Location = new System.Drawing.Point(9, 47); + this.groupBoxDuration.Name = "groupBoxDuration"; + this.groupBoxDuration.Size = new System.Drawing.Size(247, 70); + this.groupBoxDuration.TabIndex = 2; + this.groupBoxDuration.TabStop = false; + this.groupBoxDuration.Text = "Duration"; + // + // numericUpDownDurationFixed + // + this.numericUpDownDurationFixed.Location = new System.Drawing.Point(111, 42); + this.numericUpDownDurationFixed.Maximum = new decimal(new int[] { + 100000, + 0, + 0, + 0}); + this.numericUpDownDurationFixed.Name = "numericUpDownDurationFixed"; + this.numericUpDownDurationFixed.Size = new System.Drawing.Size(64, 21); + this.numericUpDownDurationFixed.TabIndex = 2; + this.numericUpDownDurationFixed.Value = new decimal(new int[] { + 2000, + 0, + 0, + 0}); + this.numericUpDownDurationFixed.ValueChanged += new System.EventHandler(this.NumericUpDownDurationFixedValueChanged); + // + // radioButtonDurationFixed + // + this.radioButtonDurationFixed.AutoSize = true; + this.radioButtonDurationFixed.Location = new System.Drawing.Point(16, 42); + this.radioButtonDurationFixed.Name = "radioButtonDurationFixed"; + this.radioButtonDurationFixed.Size = new System.Drawing.Size(51, 17); + this.radioButtonDurationFixed.TabIndex = 1; + this.radioButtonDurationFixed.Text = "Fixed"; + this.radioButtonDurationFixed.UseVisualStyleBackColor = true; + this.radioButtonDurationFixed.CheckedChanged += new System.EventHandler(this.RadioButtonDurationFixedCheckedChanged); + // + // radioButtonDurationAuto + // + this.radioButtonDurationAuto.AutoSize = true; + this.radioButtonDurationAuto.Checked = true; + this.radioButtonDurationAuto.Location = new System.Drawing.Point(16, 19); + this.radioButtonDurationAuto.Name = "radioButtonDurationAuto"; + this.radioButtonDurationAuto.Size = new System.Drawing.Size(48, 17); + this.radioButtonDurationAuto.TabIndex = 0; + this.radioButtonDurationAuto.TabStop = true; + this.radioButtonDurationAuto.Text = "Auto"; + this.radioButtonDurationAuto.UseVisualStyleBackColor = true; + this.radioButtonDurationAuto.CheckedChanged += new System.EventHandler(this.RadioButtonDurationAutoCheckedChanged); + // + // checkBoxMergeShortLines + // + this.checkBoxMergeShortLines.AutoSize = true; + this.checkBoxMergeShortLines.Checked = true; + this.checkBoxMergeShortLines.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxMergeShortLines.Location = new System.Drawing.Point(19, 94); + this.checkBoxMergeShortLines.Name = "checkBoxMergeShortLines"; + this.checkBoxMergeShortLines.Size = new System.Drawing.Size(193, 17); + this.checkBoxMergeShortLines.TabIndex = 1; + this.checkBoxMergeShortLines.Text = "Merge short lines with continuation"; + this.checkBoxMergeShortLines.UseVisualStyleBackColor = true; + this.checkBoxMergeShortLines.CheckedChanged += new System.EventHandler(this.CheckBoxMergeShortLinesCheckedChanged); + // + // checkBoxRemoveLinesWithoutLetters + // + this.checkBoxRemoveLinesWithoutLetters.AutoSize = true; + this.checkBoxRemoveLinesWithoutLetters.Checked = true; + this.checkBoxRemoveLinesWithoutLetters.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxRemoveLinesWithoutLetters.Location = new System.Drawing.Point(19, 140); + this.checkBoxRemoveLinesWithoutLetters.Name = "checkBoxRemoveLinesWithoutLetters"; + this.checkBoxRemoveLinesWithoutLetters.Size = new System.Drawing.Size(162, 17); + this.checkBoxRemoveLinesWithoutLetters.TabIndex = 3; + this.checkBoxRemoveLinesWithoutLetters.Text = "Remove lines without letters"; + this.checkBoxRemoveLinesWithoutLetters.UseVisualStyleBackColor = true; + this.checkBoxRemoveLinesWithoutLetters.CheckedChanged += new System.EventHandler(this.CheckBoxRemoveLinesWithoutLettersOrNumbersCheckedChanged); + // + // groupBoxSplitting + // + this.groupBoxSplitting.Controls.Add(this.comboBoxLineMode); + this.groupBoxSplitting.Controls.Add(this.comboBoxLineBreak); + this.groupBoxSplitting.Controls.Add(this.labelLineBreak); + this.groupBoxSplitting.Controls.Add(this.radioButtonSplitAtBlankLines); + this.groupBoxSplitting.Controls.Add(this.radioButtonAutoSplit); + this.groupBoxSplitting.Controls.Add(this.radioButtonLineMode); + this.groupBoxSplitting.Location = new System.Drawing.Point(6, 17); + this.groupBoxSplitting.Name = "groupBoxSplitting"; + this.groupBoxSplitting.Size = new System.Drawing.Size(390, 68); + this.groupBoxSplitting.TabIndex = 0; + this.groupBoxSplitting.TabStop = false; + this.groupBoxSplitting.Text = "Splitting"; + // + // comboBoxLineMode + // + this.comboBoxLineMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxLineMode.FormattingEnabled = true; + this.comboBoxLineMode.Items.AddRange(new object[] { + "One line is a subtitle", + "Two lines is a subtitle"}); + this.comboBoxLineMode.Location = new System.Drawing.Point(31, 41); + this.comboBoxLineMode.Name = "comboBoxLineMode"; + this.comboBoxLineMode.Size = new System.Drawing.Size(144, 21); + this.comboBoxLineMode.TabIndex = 2; + this.comboBoxLineMode.SelectedIndexChanged += new System.EventHandler(this.comboBoxLineMode_SelectedIndexChanged); + // + // comboBoxLineBreak + // + this.comboBoxLineBreak.FormattingEnabled = true; + this.comboBoxLineBreak.Items.AddRange(new object[] { + "|", + "\\N;\\n", + "|;\\N;\\n;//;
;
;
"}); + this.comboBoxLineBreak.Location = new System.Drawing.Point(246, 41); + this.comboBoxLineBreak.Name = "comboBoxLineBreak"; + this.comboBoxLineBreak.Size = new System.Drawing.Size(107, 21); + this.comboBoxLineBreak.TabIndex = 5; + this.comboBoxLineBreak.TextChanged += new System.EventHandler(this.comboBoxLineBreak_TextChanged); + // + // labelLineBreak + // + this.labelLineBreak.AutoSize = true; + this.labelLineBreak.Location = new System.Drawing.Point(184, 44); + this.labelLineBreak.Name = "labelLineBreak"; + this.labelLineBreak.Size = new System.Drawing.Size(56, 13); + this.labelLineBreak.TabIndex = 4; + this.labelLineBreak.Text = "Line break"; + // + // radioButtonSplitAtBlankLines + // + this.radioButtonSplitAtBlankLines.AutoSize = true; + this.radioButtonSplitAtBlankLines.Location = new System.Drawing.Point(183, 19); + this.radioButtonSplitAtBlankLines.Name = "radioButtonSplitAtBlankLines"; + this.radioButtonSplitAtBlankLines.Size = new System.Drawing.Size(110, 17); + this.radioButtonSplitAtBlankLines.TabIndex = 3; + this.radioButtonSplitAtBlankLines.Text = "Split at blank lines"; + this.radioButtonSplitAtBlankLines.UseVisualStyleBackColor = true; + this.radioButtonSplitAtBlankLines.CheckedChanged += new System.EventHandler(this.radioButtonSplitAtBlankLines_CheckedChanged); + // + // radioButtonAutoSplit + // + this.radioButtonAutoSplit.AutoSize = true; + this.radioButtonAutoSplit.Checked = true; + this.radioButtonAutoSplit.Location = new System.Drawing.Point(14, 19); + this.radioButtonAutoSplit.Name = "radioButtonAutoSplit"; + this.radioButtonAutoSplit.Size = new System.Drawing.Size(93, 17); + this.radioButtonAutoSplit.TabIndex = 0; + this.radioButtonAutoSplit.TabStop = true; + this.radioButtonAutoSplit.Text = "Auto split text"; + this.radioButtonAutoSplit.UseVisualStyleBackColor = true; + this.radioButtonAutoSplit.CheckedChanged += new System.EventHandler(this.RadioButtonAutoSplitCheckedChanged); + // + // radioButtonLineMode + // + this.radioButtonLineMode.AutoSize = true; + this.radioButtonLineMode.Location = new System.Drawing.Point(14, 43); + this.radioButtonLineMode.Name = "radioButtonLineMode"; + this.radioButtonLineMode.Size = new System.Drawing.Size(133, 17); + this.radioButtonLineMode.TabIndex = 1; + this.radioButtonLineMode.Text = "One line is one subtitle"; + this.radioButtonLineMode.UseVisualStyleBackColor = true; + this.radioButtonLineMode.CheckedChanged += new System.EventHandler(this.RadioButtonLineModeCheckedChanged); + // + // checkBoxRemoveEmptyLines + // + this.checkBoxRemoveEmptyLines.AutoSize = true; + this.checkBoxRemoveEmptyLines.Checked = true; + this.checkBoxRemoveEmptyLines.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxRemoveEmptyLines.Location = new System.Drawing.Point(19, 117); + this.checkBoxRemoveEmptyLines.Name = "checkBoxRemoveEmptyLines"; + this.checkBoxRemoveEmptyLines.Size = new System.Drawing.Size(122, 17); + this.checkBoxRemoveEmptyLines.TabIndex = 2; + this.checkBoxRemoveEmptyLines.Text = "Remove empty lines"; + this.checkBoxRemoveEmptyLines.UseVisualStyleBackColor = true; + this.checkBoxRemoveEmptyLines.CheckedChanged += new System.EventHandler(this.CheckBoxRemoveEmptyLinesCheckedChanged); + // + // buttonRefresh + // + this.buttonRefresh.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonRefresh.Location = new System.Drawing.Point(774, 735); + this.buttonRefresh.Name = "buttonRefresh"; + this.buttonRefresh.Size = new System.Drawing.Size(102, 23); + this.buttonRefresh.TabIndex = 103; + this.buttonRefresh.Text = "Refresh"; + this.buttonRefresh.UseVisualStyleBackColor = true; + this.buttonRefresh.Click += new System.EventHandler(this.ButtonRefreshClick); + // + // groupBoxImportResult + // + this.groupBoxImportResult.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxImportResult.Controls.Add(this.SubtitleListview1); + this.groupBoxImportResult.Location = new System.Drawing.Point(12, 428); + this.groupBoxImportResult.Name = "groupBoxImportResult"; + this.groupBoxImportResult.Size = new System.Drawing.Size(1032, 299); + this.groupBoxImportResult.TabIndex = 2; + this.groupBoxImportResult.TabStop = false; + this.groupBoxImportResult.Text = "Preview"; + // + // contextMenuStripPreview + // + this.contextMenuStripPreview.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.startNumberingFromToolStripMenuItem}); + this.contextMenuStripPreview.Name = "contextMenuStripPreview"; + this.contextMenuStripPreview.Size = new System.Drawing.Size(199, 26); + // + // startNumberingFromToolStripMenuItem + // + this.startNumberingFromToolStripMenuItem.Name = "startNumberingFromToolStripMenuItem"; + this.startNumberingFromToolStripMenuItem.Size = new System.Drawing.Size(198, 22); + this.startNumberingFromToolStripMenuItem.Text = "Start numbering from..."; + this.startNumberingFromToolStripMenuItem.Click += new System.EventHandler(this.startNumberingFromToolStripMenuItem_Click); + // + // openFileDialog1 + // + this.openFileDialog1.FileName = "openFileDialog1"; + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(963, 735); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 105; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.ButtonCancelClick); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(882, 735); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 104; + this.buttonOK.Text = "&Next >"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); + // + // SubtitleListview1 + // + this.SubtitleListview1.AllowColumnReorder = true; + this.SubtitleListview1.AllowDrop = true; + this.SubtitleListview1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.SubtitleListview1.ContextMenuStrip = this.contextMenuStripPreview; + this.SubtitleListview1.FirstVisibleIndex = -1; + this.SubtitleListview1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.SubtitleListview1.FullRowSelect = true; + this.SubtitleListview1.GridLines = true; + this.SubtitleListview1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.SubtitleListview1.HideSelection = false; + this.SubtitleListview1.Location = new System.Drawing.Point(6, 20); + this.SubtitleListview1.MultiSelect = false; + this.SubtitleListview1.Name = "SubtitleListview1"; + this.SubtitleListview1.OwnerDraw = true; + this.SubtitleListview1.Size = new System.Drawing.Size(1020, 257); + this.SubtitleListview1.SubtitleFontBold = false; + this.SubtitleListview1.SubtitleFontName = "Tahoma"; + this.SubtitleListview1.SubtitleFontSize = 8; + this.SubtitleListview1.TabIndex = 0; + this.SubtitleListview1.UseCompatibleStateImageBehavior = false; + this.SubtitleListview1.UseSyntaxColoring = true; + this.SubtitleListview1.View = System.Windows.Forms.View.Details; + // + // labelStatus + // + this.labelStatus.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelStatus.AutoSize = true; + this.labelStatus.Location = new System.Drawing.Point(12, 734); + this.labelStatus.Name = "labelStatus"; + this.labelStatus.Size = new System.Drawing.Size(35, 13); + this.labelStatus.TabIndex = 106; + this.labelStatus.Text = "label1"; + // + // ImportText + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1056, 772); + this.Controls.Add(this.labelStatus); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonRefresh); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.groupBoxImportResult); + this.Controls.Add(this.groupBoxImportOptions); + this.Controls.Add(this.groupBoxImportText); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.KeyPreview = true; + this.MinimumSize = new System.Drawing.Size(810, 648); + this.Name = "ImportText"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Import text"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.ImportText_FormClosing); + this.Shown += new System.EventHandler(this.ImportText_Shown); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ImportTextKeyDown); + this.groupBoxImportText.ResumeLayout(false); + this.groupBoxImportText.PerformLayout(); + this.contextMenuStripListView.ResumeLayout(false); + this.groupBoxImportOptions.ResumeLayout(false); + this.groupBoxImportOptions.PerformLayout(); + this.groupBoxAutoSplitSettings.ResumeLayout(false); + this.groupBoxAutoSplitSettings.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSubtitleLineMaximumLength)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownAutoSplitMaxLines)).EndInit(); + this.groupBoxTimeCodes.ResumeLayout(false); + this.groupBoxTimeCodes.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownGapBetweenLines)).EndInit(); + this.groupBoxDuration.ResumeLayout(false); + this.groupBoxDuration.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDurationFixed)).EndInit(); + this.groupBoxSplitting.ResumeLayout(false); + this.groupBoxSplitting.PerformLayout(); + this.groupBoxImportResult.ResumeLayout(false); + this.contextMenuStripPreview.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonOpenText; + private Controls.SubtitleListView SubtitleListview1; + private System.Windows.Forms.GroupBox groupBoxImportText; + private System.Windows.Forms.TextBox textBoxText; + private System.Windows.Forms.GroupBox groupBoxImportOptions; + private System.Windows.Forms.GroupBox groupBoxImportResult; + private System.Windows.Forms.OpenFileDialog openFileDialog1; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.GroupBox groupBoxSplitting; + private System.Windows.Forms.RadioButton radioButtonAutoSplit; + private System.Windows.Forms.RadioButton radioButtonLineMode; + private System.Windows.Forms.CheckBox checkBoxRemoveEmptyLines; + private System.Windows.Forms.CheckBox checkBoxRemoveLinesWithoutLetters; + private System.Windows.Forms.NumericUpDown numericUpDownGapBetweenLines; + private System.Windows.Forms.Label labelGapBetweenSubtitles; + private System.Windows.Forms.Button buttonRefresh; + private System.Windows.Forms.GroupBox groupBoxDuration; + private System.Windows.Forms.NumericUpDown numericUpDownDurationFixed; + private System.Windows.Forms.RadioButton radioButtonDurationFixed; + private System.Windows.Forms.RadioButton radioButtonDurationAuto; + private System.Windows.Forms.CheckBox checkBoxMergeShortLines; + private System.Windows.Forms.RadioButton radioButtonSplitAtBlankLines; + private System.Windows.Forms.CheckBox checkBoxGenerateTimeCodes; + private System.Windows.Forms.GroupBox groupBoxTimeCodes; + private System.Windows.Forms.Label labelLineBreak; + private System.Windows.Forms.CheckBox checkBoxMultipleFiles; + private System.Windows.Forms.ListView listViewInputFiles; + private System.Windows.Forms.ColumnHeader columnHeaderFName; + private System.Windows.Forms.ColumnHeader columnHeaderSize; + private System.Windows.Forms.CheckBox checkBoxAutoBreak; + private System.Windows.Forms.ComboBox comboBoxLineBreak; + private System.Windows.Forms.ContextMenuStrip contextMenuStripListView; + private System.Windows.Forms.ToolStripMenuItem clearToolStripMenuItem; + private System.Windows.Forms.ContextMenuStrip contextMenuStripPreview; + private System.Windows.Forms.ToolStripMenuItem startNumberingFromToolStripMenuItem; + private System.Windows.Forms.GroupBox groupBoxAutoSplitSettings; + private System.Windows.Forms.TextBox textBoxAsEnd; + private System.Windows.Forms.CheckBox checkBoxAutoSplitRemoveLinesNoLetters; + private System.Windows.Forms.CheckBox checkBoxAutoSplitAtBlankLines; + private System.Windows.Forms.NumericUpDown numericUpDownAutoSplitMaxLines; + private System.Windows.Forms.Label labelAutoSplitNumberOfLines; + private System.Windows.Forms.Label labelSubMaxLen; + private System.Windows.Forms.NumericUpDown numericUpDownSubtitleLineMaximumLength; + private System.Windows.Forms.CheckBox checkBoxAutoSplitAtEnd; + private System.Windows.Forms.ComboBox comboBoxLineMode; + private System.Windows.Forms.CheckBox checkBoxTakeTimeFromFileNames; + private System.Windows.Forms.Label labelStatus; + } } \ No newline at end of file diff --git a/src/Forms/ImportText.cs b/src/ui/Forms/ImportText.cs similarity index 97% rename from src/Forms/ImportText.cs rename to src/ui/Forms/ImportText.cs index c6f740200..9f5601565 100644 --- a/src/Forms/ImportText.cs +++ b/src/ui/Forms/ImportText.cs @@ -1,1400 +1,1400 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.SubtitleFormats; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Net; -using System.Text; -using System.Text.RegularExpressions; -using System.Windows.Forms; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class ImportText : Form - { - private Subtitle _subtitleInput; - private string _fileName; - private readonly Timer _refreshTimer = new Timer(); - private readonly bool _exit; - private int _startFromNumber = 1; - - public Subtitle FixedSubtitle { get; private set; } - public SubtitleFormat Format { get; set; } - public string VideoFileName { get; private set; } - - public ImportText(string fileName = null, Form parentForm = null) - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - Text = Configuration.Settings.Language.ImportText.Title; - groupBoxImportText.Text = Configuration.Settings.Language.ImportText.Title; - buttonOpenText.Text = Configuration.Settings.Language.ImportText.OpenTextFile; - groupBoxImportOptions.Text = Configuration.Settings.Language.ImportText.ImportOptions; - groupBoxSplitting.Text = Configuration.Settings.Language.ImportText.Splitting; - radioButtonAutoSplit.Text = Configuration.Settings.Language.ImportText.AutoSplitText; - radioButtonLineMode.Text = string.Empty; - comboBoxLineMode.Items.Clear(); - comboBoxLineMode.Items.Add(Configuration.Settings.Language.ImportText.OneLineIsOneSubtitle); - comboBoxLineMode.Items.Add(Configuration.Settings.Language.ImportText.TwoLinesAreOneSubtitle); - comboBoxLineMode.SelectedIndex = 0; - labelLineBreak.Text = Configuration.Settings.Language.ImportText.LineBreak; - columnHeaderFName.Text = Configuration.Settings.Language.JoinSubtitles.FileName; - columnHeaderSize.Text = Configuration.Settings.Language.General.Size; - comboBoxLineBreak.Left = labelLineBreak.Left + labelLineBreak.Width + 3; - comboBoxLineBreak.Width = groupBoxSplitting.Width - comboBoxLineBreak.Left - 5; - checkBoxMultipleFiles.AutoSize = true; - checkBoxMultipleFiles.Left = buttonOpenText.Left - checkBoxMultipleFiles.Width - 9; - checkBoxMultipleFiles.Text = Configuration.Settings.Language.ImportText.OneSubtitleIsOneFile; - listViewInputFiles.Visible = false; - labelSubMaxLen.Text = Configuration.Settings.Language.Settings.SubtitleLineMaximumLength; - numericUpDownSubtitleLineMaximumLength.Left = labelSubMaxLen.Left + labelSubMaxLen.Width + 3; - - radioButtonSplitAtBlankLines.Text = Configuration.Settings.Language.ImportText.SplitAtBlankLines; - checkBoxMergeShortLines.Text = Configuration.Settings.Language.ImportText.MergeShortLines; - checkBoxRemoveEmptyLines.Text = Configuration.Settings.Language.ImportText.RemoveEmptyLines; - checkBoxRemoveLinesWithoutLetters.Text = Configuration.Settings.Language.ImportText.RemoveLinesWithoutLetters; - checkBoxAutoSplitRemoveLinesNoLetters.Text = Configuration.Settings.Language.ImportText.RemoveLinesWithoutLetters; - checkBoxGenerateTimeCodes.Text = Configuration.Settings.Language.ImportText.GenerateTimeCodes; - checkBoxTakeTimeFromFileNames.Text = Configuration.Settings.Language.ImportText.TakeTimeFromFileName; - checkBoxTakeTimeFromFileNames.Left = checkBoxGenerateTimeCodes.Left + checkBoxGenerateTimeCodes.Width + 9; - checkBoxAutoBreak.Text = Configuration.Settings.Language.Settings.MainTextBoxAutoBreak; - labelGapBetweenSubtitles.Text = Configuration.Settings.Language.ImportText.GapBetweenSubtitles; - numericUpDownGapBetweenLines.Left = labelGapBetweenSubtitles.Left + labelGapBetweenSubtitles.Width + 3; - groupBoxDuration.Text = Configuration.Settings.Language.General.Duration; - radioButtonDurationAuto.Text = Configuration.Settings.Language.ImportText.Auto; - radioButtonDurationFixed.Text = Configuration.Settings.Language.ImportText.Fixed; - buttonRefresh.Text = Configuration.Settings.Language.ImportText.Refresh; - groupBoxTimeCodes.Text = Configuration.Settings.Language.ImportText.TimeCodes; - groupBoxImportResult.Text = Configuration.Settings.Language.General.Preview; - clearToolStripMenuItem.Text = Configuration.Settings.Language.DvdSubRip.Clear; - startNumberingFromToolStripMenuItem.Text = Configuration.Settings.Language.Main.Menu.Tools.StartNumberingFrom; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - SubtitleListview1.InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings); - UiUtil.InitializeSubtitleFont(SubtitleListview1); - UiUtil.InitializeSubtitleFont(listViewInputFiles); - textBoxText.Font = new System.Drawing.Font(listViewInputFiles.Font.FontFamily, listViewInputFiles.Font.Size, listViewInputFiles.Font.Style); - SubtitleListview1.AutoSizeAllColumns(this); - checkBoxTakeTimeFromFileNames.Visible = false; - - if (string.IsNullOrEmpty(Configuration.Settings.Tools.ImportTextSplitting)) - { - radioButtonAutoSplit.Checked = true; - } - else if (Configuration.Settings.Tools.ImportTextSplitting.Equals("blank lines", StringComparison.OrdinalIgnoreCase)) - { - radioButtonSplitAtBlankLines.Checked = true; - } - else if (Configuration.Settings.Tools.ImportTextSplitting.Equals("line", StringComparison.OrdinalIgnoreCase)) - { - radioButtonLineMode.Checked = true; - } - - comboBoxLineBreak.Text = Configuration.Settings.Tools.ImportTextLineBreak; - checkBoxMergeShortLines.Checked = Configuration.Settings.Tools.ImportTextMergeShortLines; - checkBoxRemoveEmptyLines.Checked = Configuration.Settings.Tools.ImportTextRemoveEmptyLines; - checkBoxAutoSplitAtBlankLines.Checked = Configuration.Settings.Tools.ImportTextAutoSplitAtBlank; - checkBoxRemoveLinesWithoutLetters.Checked = Configuration.Settings.Tools.ImportTextRemoveLinesNoLetters; - checkBoxAutoSplitRemoveLinesNoLetters.Checked = Configuration.Settings.Tools.ImportTextRemoveLinesNoLetters; - checkBoxGenerateTimeCodes.Checked = Configuration.Settings.Tools.ImportTextGenerateTimeCodes; - checkBoxTakeTimeFromFileNames.Checked = Configuration.Settings.Tools.ImportTextTakeTimeCodeFromFileName; - checkBoxAutoBreak.Checked = Configuration.Settings.Tools.ImportTextAutoBreak; - textBoxAsEnd.Text = Configuration.Settings.Tools.ImportTextAutoBreakAtEndMarkerText.Replace(" ", string.Empty); - checkBoxAutoSplitAtEnd.Checked = Configuration.Settings.Tools.ImportTextAutoBreakAtEnd; - checkBoxAutoSplitAtEnd.Text = Configuration.Settings.Language.ImportText.SplitAtEndChars; - textBoxAsEnd.Left = checkBoxAutoSplitAtEnd.Left + checkBoxAutoSplitAtEnd.Width; - checkBoxAutoSplitAtBlankLines.Text = Configuration.Settings.Language.ImportText.SplitAtBlankLines; - - groupBoxAutoSplitSettings.Text = Configuration.Settings.Language.Settings.Title; - labelAutoSplitNumberOfLines.Text = Configuration.Settings.Language.Settings.MaximumLines; - numericUpDownSubtitleLineMaximumLength.Left = labelSubMaxLen.Left + labelSubMaxLen.Width + 3; - numericUpDownSubtitleLineMaximumLength.Value = Configuration.Settings.General.SubtitleLineMaximumLength; - - if (Configuration.Settings.Tools.ImportTextAutoSplitNumberOfLines >= numericUpDownAutoSplitMaxLines.Minimum && - Configuration.Settings.Tools.ImportTextAutoSplitNumberOfLines <= numericUpDownAutoSplitMaxLines.Maximum) - { - numericUpDownAutoSplitMaxLines.Value = Configuration.Settings.Tools.ImportTextAutoSplitNumberOfLines; - } - - if (Configuration.Settings.Tools.ImportTextGap >= numericUpDownGapBetweenLines.Minimum && Configuration.Settings.Tools.ImportTextGap <= numericUpDownGapBetweenLines.Maximum) - { - numericUpDownGapBetweenLines.Value = Configuration.Settings.Tools.ImportTextGap; - } - if (Configuration.Settings.Tools.ImportTextDurationAuto) - { - radioButtonDurationAuto.Checked = true; - } - else - { - radioButtonDurationFixed.Checked = true; - } - numericUpDownDurationFixed.Enabled = radioButtonDurationFixed.Checked; - if (Configuration.Settings.Tools.ImportTextFixedDuration >= numericUpDownDurationFixed.Minimum && - Configuration.Settings.Tools.ImportTextFixedDuration <= numericUpDownDurationFixed.Maximum) - { - numericUpDownDurationFixed.Value = Configuration.Settings.Tools.ImportTextFixedDuration; - } - UiUtil.FixLargeFonts(this, buttonOK); - _refreshTimer.Interval = 400; - _refreshTimer.Tick += RefreshTimerTick; - - if (fileName != null && File.Exists(fileName)) - { - if (!LoadSingleFile(fileName, parentForm)) - { - _exit = true; - } - } - } - - private void RefreshTimerTick(object sender, EventArgs e) - { - _refreshTimer.Stop(); - GeneratePreviewReal(); - } - - private void ButtonOpenTextClick(object sender, EventArgs e) - { - Text = Configuration.Settings.Language.ImportText.Title; - openFileDialog1.Title = buttonOpenText.Text; - if (checkBoxMultipleFiles.Visible && checkBoxMultipleFiles.Checked) - { - openFileDialog1.Filter = Configuration.Settings.Language.ImportText.TextFiles + "|*.txt;*.rtf|" + Configuration.Settings.Language.General.AllFiles + " |*.*"; - } - else - { - openFileDialog1.Filter = Configuration.Settings.Language.ImportText.TextFiles + "|*.txt;*.rtf;*.tx3g;*.astx;*" + new FinalDraftTemplate2().Extension + "|Adobe Story|*.astx|Final Draft Template|*" + new FinalDraftTemplate2().Extension + "|" + Configuration.Settings.Language.General.AllFiles + "|*.*"; - } - - openFileDialog1.FileName = string.Empty; - openFileDialog1.Multiselect = checkBoxMultipleFiles.Visible && checkBoxMultipleFiles.Checked; - if (openFileDialog1.ShowDialog() == DialogResult.OK) - { - groupBoxImportOptions.Visible = true; - _startFromNumber = 1; - if (checkBoxMultipleFiles.Visible && checkBoxMultipleFiles.Checked) - { - foreach (var fileName in openFileDialog1.FileNames) - { - AddInputFile(fileName); - } - } - else - { - LoadSingleFile(openFileDialog1.FileName, this); - } - GeneratePreview(); - } - } - - private bool LoadSingleFile(string fileName, Form parentForm) - { - groupBoxSplitting.Enabled = true; - textBoxText.Enabled = true; - Format = null; - string ext = string.Empty; - var extension = Path.GetExtension(fileName); - _fileName = fileName; - if (extension != null) - { - ext = extension.ToLowerInvariant(); - } - - var fd = new FinalDraftTemplate2(); - var list = new List(FileUtil.ReadAllLinesShared(fileName, LanguageAutoDetect.GetEncodingFromFile(fileName))); - bool isFinalDraft = fd.IsMine(list, fileName); - - if (ext == ".astx") - { - LoadAdobeStory(fileName); - } - else if (isFinalDraft) - { - return LoadFinalDraftTemplate(fileName, parentForm ?? this); - } - else if (ext == ".tx3g" && new Tx3GTextOnly().IsMine(null, fileName)) - { - LoadTx3G(fileName); - } - else if (ext == ".rtf" && FileUtil.IsRtf(fileName)) - { - LoadRtf(fileName); - } - else if (ext == ".html" && IsHtmlIndexExportFromSubtitleEdit(fileName)) - { - textBoxText.Text = FileUtil.ReadAllTextShared(fileName, Encoding.UTF8); - Text = Configuration.Settings.Language.ImportText.Title + " - " + fileName; - GeneratePreview(); - groupBoxImportOptions.Visible = false; - } - else - { - LoadTextFile(fileName); - } - return true; - } - - private static bool IsHtmlIndexExportFromSubtitleEdit(string fileName) - { - if (string.IsNullOrEmpty(fileName)) - { - return false; - } - - var html = FileUtil.ReadAllTextShared(fileName, Encoding.UTF8); - var s = GetSubtitleFromHtmlIndex(html); - return s.Paragraphs.Count > 0; - } - - private static Subtitle GetSubtitleFromHtmlIndex(string html) - { - var lines = html - .Replace($"
{Environment.NewLine}", "
") - .Replace("
\\n", "
") - .SplitToLines(); - - // A line will look like this: #1:4:06,288->4:09,375

My mommy always said
there were no monsters.


- var subtitle = new Subtitle(); - foreach (var line in lines) - { - var indexOfText = line.IndexOf("background-color:", StringComparison.OrdinalIgnoreCase); - if (indexOfText >= 0) - { - indexOfText = line.IndexOf('>', indexOfText); - } - - var indexOfFirstColon = line.IndexOf(':'); - var indexOfTimeSplit = line.IndexOf("->", StringComparison.Ordinal); - var indexOfFirstDiv = line.IndexOf(" 0 && indexOfFirstColon > 0 && indexOfTimeSplit > 0 && indexOfFirstDiv > 0) - { - var start = line.Substring(indexOfFirstColon + 1, indexOfTimeSplit - indexOfFirstColon - 1); - var end = line.Substring(indexOfTimeSplit + 2, indexOfFirstDiv - indexOfTimeSplit - 2); - var text = line.Substring(indexOfText + 1) - .Replace("
", string.Empty) - .Replace("
", string.Empty) - .Replace("
", string.Empty) - .Replace("
", string.Empty) - .Replace("
", Environment.NewLine) - .Replace("
", Environment.NewLine) - .Trim(); - text = WebUtility.HtmlDecode(text); - var p = new Paragraph(text, DecodeTimeCode(start), DecodeTimeCode(end)); - subtitle.Paragraphs.Add(p); - } - } - subtitle.Renumber(); - return subtitle; - } - - private static double DecodeTimeCode(string tc) - { - var parts = tc.Split(',', '.', ':'); - try - { - if (parts.Length == 2) - { - return new TimeCode(0, 0, int.Parse(parts[0]), int.Parse(parts[1])).TotalMilliseconds; - } - if (parts.Length == 3) - { - return new TimeCode(0, int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2])).TotalMilliseconds; - } - if (parts.Length == 4) - { - return new TimeCode(int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2]), int.Parse(parts[3])).TotalMilliseconds; - } - } - catch - { - return 0; - } - return 0; - } - - private void GeneratePreview() - { - if (radioButtonSplitAtBlankLines.Checked || radioButtonLineMode.Checked) - { - groupBoxAutoSplitSettings.Visible = false; - groupBoxAutoSplitSettings.SendToBack(); - checkBoxMergeShortLines.Enabled = true; - checkBoxRemoveEmptyLines.Enabled = true; - checkBoxAutoBreak.Enabled = true; - checkBoxAutoBreak.Text = Configuration.Settings.Language.Settings.MainTextBoxAutoBreak; - } - else // auto split - { - groupBoxAutoSplitSettings.Visible = true; - groupBoxAutoSplitSettings.BringToFront(); - checkBoxMergeShortLines.Enabled = false; - checkBoxRemoveEmptyLines.Enabled = false; - checkBoxAutoBreak.Enabled = true; - } - - if (_refreshTimer.Enabled) - { - _refreshTimer.Stop(); - } - - _refreshTimer.Start(); - } - - private void GeneratePreviewReal() - { - if (IsHtmlIndexExportFromSubtitleEdit(_fileName)) - { - groupBoxImportOptions.Visible = false; - var html = FileUtil.ReadAllTextShared(_fileName, Encoding.UTF8); - FixedSubtitle = GetSubtitleFromHtmlIndex(html); - groupBoxImportResult.Text = string.Format(Configuration.Settings.Language.ImportText.PreviewLinesModifiedX, FixedSubtitle.Paragraphs.Count); - SubtitleListview1.Fill(FixedSubtitle); - SubtitleListview1.SelectIndexAndEnsureVisible(0); - return; - } - - groupBoxImportOptions.Visible = true; - if (Format == null || Format.GetType() != typeof(CsvNuendo)) - { - FixedSubtitle = new Subtitle(); - if (checkBoxMultipleFiles.Visible && checkBoxMultipleFiles.Checked) - { - ImportMultipleFiles(listViewInputFiles.Items); - } - else if (radioButtonLineMode.Checked) - { - ImportLineMode(textBoxText.Lines); - } - else if (radioButtonAutoSplit.Checked) - { - ImportAutoSplit(textBoxText.Lines); - } - else - { - ImportSplitAtBlankLine(textBoxText.Lines); - } - } - else - { - FixedSubtitle = new Subtitle(_subtitleInput); - if (checkBoxAutoBreak.Enabled && checkBoxAutoBreak.Checked) - { - foreach (var p in FixedSubtitle.Paragraphs) - { - p.Text = Utilities.AutoBreakLine(p.Text); - } - } - } - - if (checkBoxMergeShortLines.Checked) - { - MergeLinesWithContinuation(); - } - - FixedSubtitle.Renumber(_startFromNumber); - if (checkBoxGenerateTimeCodes.Checked && checkBoxTakeTimeFromFileNames.Visible && checkBoxTakeTimeFromFileNames.Checked) - { - // time codes already generated - } - else if (checkBoxGenerateTimeCodes.Checked) - { - FixDurations(); - MakePseudoStartTime(); - } - else - { - foreach (var p in FixedSubtitle.Paragraphs) - { - p.StartTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; - p.EndTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; - } - } - - groupBoxImportResult.Text = string.Format(Configuration.Settings.Language.ImportText.PreviewLinesModifiedX, FixedSubtitle.Paragraphs.Count); - SubtitleListview1.Fill(FixedSubtitle); - SubtitleListview1.SelectIndexAndEnsureVisible(0); - } - - private void ImportMultipleFiles(ListView.ListViewItemCollection listViewItemCollection) - { - foreach (ListViewItem item in listViewItemCollection) - { - string line; - try - { - line = GetAllText(item.Text).Trim(); - } - catch - { - line = string.Empty; - } - - line = line.Replace("|", Environment.NewLine); - if (comboBoxLineBreak.Text.Length > 0) - { - foreach (var splitter in comboBoxLineBreak.Text.Split(';')) - { - var tempSplitter = splitter.Trim(); - if (tempSplitter.Length > 0) - { - line = line.Replace(tempSplitter, Environment.NewLine); - } - } - } - - if (string.IsNullOrWhiteSpace(line)) - { - if (!checkBoxRemoveEmptyLines.Checked) - { - FixedSubtitle.Paragraphs.Add(new Paragraph()); - ImportImages.SetEndTimeAndStartTime(Path.GetFileNameWithoutExtension(item.Text), FixedSubtitle.Paragraphs.Last()); - } - } - else if (!PlainTextImporter.ContainsLetters(line)) - { - if (!checkBoxRemoveLinesWithoutLetters.Checked) - { - FixedSubtitle.Paragraphs.Add(new Paragraph(line.Trim(), 0, 0)); - ImportImages.SetEndTimeAndStartTime(Path.GetFileNameWithoutExtension(item.Text), FixedSubtitle.Paragraphs.Last()); - } - } - else - { - FixedSubtitle.Paragraphs.Add(new Paragraph(line.Trim(), 0, 0)); - ImportImages.SetEndTimeAndStartTime(Path.GetFileNameWithoutExtension(item.Text), FixedSubtitle.Paragraphs.Last()); - } - } - } - - private void MergeLinesWithContinuation() - { - var temp = new Subtitle(); - bool skipNext = false; - for (int i = 0; i < FixedSubtitle.Paragraphs.Count; i++) - { - Paragraph p = FixedSubtitle.Paragraphs[i]; - if (!skipNext) - { - Paragraph next = FixedSubtitle.GetParagraphOrDefault(i + 1); - - bool merge = !(p.Text.Contains(Environment.NewLine) || next == null) && Configuration.Settings.General.MaxNumberOfLines > 1; - - if (merge && (p.Text.TrimEnd().EndsWith('!') || p.Text.TrimEnd().EndsWith('.'))) - { - var st = new StrippableText(p.Text); - if (st.StrippedText.Length > 0 && char.IsUpper(st.StrippedText[0])) - { - merge = false; - } - } - - if (merge && (p.Text.Length >= Configuration.Settings.General.SubtitleLineMaximumLength - 5 || next.Text.Length >= Configuration.Settings.General.SubtitleLineMaximumLength - 5)) - { - merge = false; - } - - if (merge) - { - temp.Paragraphs.Add(new Paragraph { Text = p.Text + Environment.NewLine + next.Text }); - skipNext = true; - } - else - { - temp.Paragraphs.Add(new Paragraph(p)); - } - } - else - { - skipNext = false; - } - } - FixedSubtitle = temp; - } - - private void MakePseudoStartTime() - { - var millisecondsInterval = (double)numericUpDownGapBetweenLines.Value; - double millisecondsIndex = millisecondsInterval; - foreach (Paragraph p in FixedSubtitle.Paragraphs) - { - p.EndTime.TotalMilliseconds = millisecondsIndex + p.Duration.TotalMilliseconds; - p.StartTime.TotalMilliseconds = millisecondsIndex; - millisecondsIndex += (p.EndTime.TotalMilliseconds - p.StartTime.TotalMilliseconds) + millisecondsInterval; - } - } - - private void FixDurations() - { - foreach (Paragraph p in FixedSubtitle.Paragraphs) - { - if (p.Text.Length == 0) - { - p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + 2000; - } - else - { - if (radioButtonDurationAuto.Checked) - { - p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + (Utilities.GetOptimalDisplayMilliseconds(p.Text)); - } - else - { - p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + ((double)numericUpDownDurationFixed.Value); - } - } - } - } - - private void ImportLineMode(IEnumerable lines) - { - var item = new List(); - foreach (string loopLine in lines) - { - // Replace user line break character with Environment.NewLine. - string line = loopLine; - if (comboBoxLineBreak.Text.Length > 0) - { - foreach (string splitter in comboBoxLineBreak.Text.Split(';')) - { - var tempSplitter = splitter.Trim(); - if (tempSplitter.Length > 0) - { - line = line.Replace(tempSplitter, Environment.NewLine); - } - } - } - - if (string.IsNullOrWhiteSpace(line)) - { - if (!checkBoxRemoveEmptyLines.Checked) - { - item.Add(string.Empty); - } - } - else if (!PlainTextImporter.ContainsLetters(line)) - { - if (!checkBoxRemoveLinesWithoutLetters.Checked) - { - item.Add(line.Trim()); - } - } - else - { - string text = line.Trim(); - if (checkBoxAutoBreak.Enabled && checkBoxAutoBreak.Checked && comboBoxLineMode.SelectedIndex == 0) - { - text = Utilities.AutoBreakLine(text); - } - - item.Add(text); - } - - if (item.Count >= comboBoxLineMode.SelectedIndex + 1) - { - FixedSubtitle.Paragraphs.Add(new Paragraph { Text = string.Join(Environment.NewLine, item.ToArray()) }); - item.Clear(); - } - } - if (item.Count > 0) - { - FixedSubtitle.Paragraphs.Add(new Paragraph { Text = string.Join(Environment.NewLine, item.ToArray()) }); - } - } - - private void ImportSplitAtBlankLine(IEnumerable lines) - { - var sb = new StringBuilder(); - foreach (string line in lines) - { - if (string.IsNullOrWhiteSpace(line)) - { - if (sb.Length > 0) - { - string text = sb.ToString().Trim(); - if (checkBoxAutoBreak.Enabled && checkBoxAutoBreak.Checked) - { - text = Utilities.AutoBreakLine(text); - } - - FixedSubtitle.Paragraphs.Add(new Paragraph { Text = text }); - sb.Clear(); - } - } - else if (!PlainTextImporter.ContainsLetters(line)) - { - if (!checkBoxRemoveLinesWithoutLetters.Checked) - { - sb.AppendLine(line.Trim()); - } - } - else - { - sb.AppendLine(line.Trim()); - } - } - if (sb.Length > 0) - { - SplitSingle(sb); - } - } - - private static bool CanMakeThreeLiner(out string text, string input) - { - text = string.Empty; - if (input.Length < Configuration.Settings.General.SubtitleLineMaximumLength * 3 && input.Length > Configuration.Settings.General.SubtitleLineMaximumLength * 1.5) - { - var splitLines = Utilities.AutoBreakLine(input).SplitToLines(); - if (splitLines.Count == 2 && (splitLines[0].Length > Configuration.Settings.General.SubtitleLineMaximumLength || splitLines[1].Length > Configuration.Settings.General.SubtitleLineMaximumLength)) - { - var first = new StringBuilder(); - var second = new StringBuilder(); - var third = new StringBuilder(); - foreach (string word in input.Replace(Environment.NewLine, " ").Replace(" ", " ").Split(' ')) - { - if (first.Length + word.Length < Configuration.Settings.General.SubtitleLineMaximumLength) - { - first.Append(' '); - first.Append(word); - } - else if (second.Length + word.Length < Configuration.Settings.General.SubtitleLineMaximumLength) - { - second.Append(' '); - second.Append(word); - } - else - { - third.Append(' '); - third.Append(word); - } - } - if (third.Length <= Configuration.Settings.General.SubtitleLineMaximumLength && third.Length > 10) - { - if (second.Length > 15) - { - string ending = second.ToString().Substring(second.Length - 9); - int splitPos = -1; - if (ending.Contains(". ")) - { - splitPos = ending.IndexOf(". ", StringComparison.Ordinal) + second.Length - 9; - } - else if (ending.Contains("! ")) - { - splitPos = ending.IndexOf("! ", StringComparison.Ordinal) + second.Length - 9; - } - else if (ending.Contains(", ")) - { - splitPos = ending.IndexOf(", ", StringComparison.Ordinal) + second.Length - 9; - } - else if (ending.Contains("? ")) - { - splitPos = ending.IndexOf("? ", StringComparison.Ordinal) + second.Length - 9; - } - - if (splitPos > 0) - { - text = Utilities.AutoBreakLine(first.ToString().Trim() + second.ToString().Substring(0, splitPos + 1)).Trim() + Environment.NewLine + (second.ToString().Substring(splitPos + 1) + third).Trim(); - return true; - } - } - - text = first + Environment.NewLine + second + Environment.NewLine + third; - return true; - } - } - } - return false; - } - - private void SplitSingle(StringBuilder sb) - { - string t = sb.ToString().Trim(); - var tarr = t.SplitToLines(); - if (checkBoxMergeShortLines.Checked == false && tarr.Count == 3 && - tarr[0].Length < Configuration.Settings.General.SubtitleLineMaximumLength && - tarr[1].Length < Configuration.Settings.General.SubtitleLineMaximumLength && - tarr[2].Length < Configuration.Settings.General.SubtitleLineMaximumLength) - { - FixedSubtitle.Paragraphs.Add(new Paragraph { Text = tarr[0] + Environment.NewLine + tarr[1] }); - return; - } - if (checkBoxMergeShortLines.Checked == false && tarr.Count == 2 && - tarr[0].Length < Configuration.Settings.General.SubtitleLineMaximumLength && - tarr[1].Length < Configuration.Settings.General.SubtitleLineMaximumLength) - { - FixedSubtitle.Paragraphs.Add(new Paragraph { Text = tarr[0] + Environment.NewLine + tarr[1] }); - return; - } - if (checkBoxMergeShortLines.Checked == false && tarr.Count == 1 && tarr[0].Length < Configuration.Settings.General.SubtitleLineMaximumLength) - { - FixedSubtitle.Paragraphs.Add(new Paragraph { Text = tarr[0].Trim() }); - return; - } - - Paragraph p = null; - if (CanMakeThreeLiner(out var threeLiner, sb.ToString())) - { - var parts = threeLiner.SplitToLines(); - FixedSubtitle.Paragraphs.Add(new Paragraph { Text = parts[0] + Environment.NewLine + parts[1] }); - FixedSubtitle.Paragraphs.Add(new Paragraph { Text = parts[2].Trim() }); - return; - } - - foreach (string text in Utilities.AutoBreakLineMoreThanTwoLines(sb.ToString(), Configuration.Settings.General.SubtitleLineMaximumLength, Configuration.Settings.General.MergeLinesShorterThan, "en").SplitToLines()) - { - if (p == null) - { - p = new Paragraph { Text = text }; - } - else if (p.Text.Contains(Environment.NewLine)) - { - FixedSubtitle.Paragraphs.Add(p); - p = new Paragraph(); - if (text.Length >= Configuration.Settings.General.SubtitleLineMaximumLength) - { - p.Text = Utilities.AutoBreakLine(text); - } - else - { - p.Text = text; - } - } - else - { - if (checkBoxMergeShortLines.Checked || p.Text.Length > Configuration.Settings.General.SubtitleLineMaximumLength || text.Length > Configuration.Settings.General.SubtitleLineMaximumLength) - { - p.Text = Utilities.AutoBreakLine(p.Text + Environment.NewLine + text.Trim()); - } - else - { - p.Text = p.Text + Environment.NewLine + text.Trim(); - } - } - } - if (p != null) - { - FixedSubtitle.Paragraphs.Add(p); - } - } - - private void ImportAutoSplit(string[] textLines) - { - var sub = new Subtitle(); - foreach (var line in textLines) - { - sub.Paragraphs.Add(new Paragraph(line, 0, 0)); - } - var language = LanguageAutoDetect.AutoDetectGoogleLanguage(sub); - - var plainTextImporter = new PlainTextImporter(checkBoxAutoSplitAtBlankLines.Checked, - checkBoxAutoSplitRemoveLinesNoLetters.Checked, - (int)numericUpDownAutoSplitMaxLines.Value, - checkBoxAutoSplitAtEnd.Checked ? textBoxAsEnd.Text : string.Empty, - (int)numericUpDownSubtitleLineMaximumLength.Value, - language); - - ImportLineMode(plainTextImporter.ImportAutoSplit(textLines)); - } - - private void ButtonOkClick(object sender, EventArgs e) - { - DialogResult = SubtitleListview1.Items.Count > 0 ? DialogResult.OK : DialogResult.Cancel; - } - - private void ButtonCancelClick(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private void CheckBoxRemoveLinesWithoutLettersOrNumbersCheckedChanged(object sender, EventArgs e) - { - GeneratePreview(); - } - - private void CheckBoxRemoveEmptyLinesCheckedChanged(object sender, EventArgs e) - { - GeneratePreview(); - } - - private void RadioButtonLineModeCheckedChanged(object sender, EventArgs e) - { - GeneratePreview(); - // textBoxLineBreak and its label are enabled if radioButtonLineMode is checked. - comboBoxLineBreak.Enabled = radioButtonLineMode.Checked; - labelLineBreak.Enabled = radioButtonLineMode.Checked; - } - - private void RadioButtonAutoSplitCheckedChanged(object sender, EventArgs e) - { - GeneratePreview(); - } - - private void TextBoxTextDragEnter(object sender, DragEventArgs e) - { - if (e.Data.GetDataPresent(DataFormats.FileDrop, false)) - { - e.Effect = DragDropEffects.All; - } - } - - private void TextBoxTextDragDrop(object sender, DragEventArgs e) - { - var files = (string[])e.Data.GetData(DataFormats.FileDrop); - if (files.Length == 1) - { - LoadTextFile(files[0]); - } - } - - private static string HtmlToPlainText(string html) - { - var stripFormattingRegex = new Regex(@"<[^>]*(>|$)", RegexOptions.Multiline); // match any character between '<' and '>', even when end tag is missing - var tagWhiteSpaceRegex = new Regex(@"(>|$)(\W|\n|\r)+<", RegexOptions.Multiline); // matches one or more (white space or line breaks) between '>' and '<' - - // Decode html specific characters - var text = WebUtility.HtmlDecode(html); - - // Remove tag whitespace/line breaks - text = tagWhiteSpaceRegex.Replace(text, "><"); - - // Find new lines - text = text.Replace("
", Environment.NewLine); - text = text.Replace("
", Environment.NewLine); - text = text.Replace("
", Environment.NewLine); - text = text.Replace("
", Environment.NewLine); - text = text.Replace("
", Environment.NewLine + Environment.NewLine); - text = text.Replace("
", Environment.NewLine + Environment.NewLine); - text = text.Replace("
", Environment.NewLine + Environment.NewLine); - text = text.Replace("
", Environment.NewLine + Environment.NewLine); - text = text.Replace("

", Environment.NewLine + Environment.NewLine); - text = text.Replace("

", Environment.NewLine + Environment.NewLine); - text = text.Replace(Environment.NewLine + Environment.NewLine + Environment.NewLine, Environment.NewLine + Environment.NewLine); - text = text.Replace(Environment.NewLine + Environment.NewLine + Environment.NewLine, Environment.NewLine + Environment.NewLine); - - text = stripFormattingRegex.Replace(text, string.Empty); - - return text; - } - - private static string GetAllText(string fileName) - { - try - { - var encoding = LanguageAutoDetect.GetEncodingFromFile(fileName); - var text = FileUtil.ReadAllTextShared(fileName, encoding); - if (fileName.EndsWith(".html", StringComparison.OrdinalIgnoreCase) || fileName.EndsWith(".htm", StringComparison.OrdinalIgnoreCase)) - { - text = HtmlToPlainText(text); - } - if (fileName.EndsWith(".rtf", StringComparison.OrdinalIgnoreCase)) - { - text = GetRtfString(fileName); - } - - return text; - } - catch (Exception ex) - { - MessageBox.Show(ex.Message); - return string.Empty; - } - } - - private void LoadTextFile(string fileName) - { - textBoxText.Text = GetAllText(fileName); - SetVideoFileName(fileName); - Text = Configuration.Settings.Language.ImportText.Title + " - " + fileName; - GeneratePreview(); - } - - private void LoadTx3G(string fileName) - { - try - { - var sb = new StringBuilder(); - var sub = new Subtitle(); - new Tx3GTextOnly().LoadSubtitle(sub, null, fileName); - foreach (var paragraph in sub.Paragraphs) - { - sb.AppendLine(paragraph.Text); - sb.AppendLine(); - } - textBoxText.Text = sb.ToString(); - } - catch (Exception ex) - { - MessageBox.Show(ex.Message); - } - radioButtonSplitAtBlankLines.Checked = true; - checkBoxMergeShortLines.Checked = false; - GeneratePreview(); - } - - private void LoadRtf(string fileName) - { - try - { - labelStatus.Text = Configuration.Settings.Language.General.PleaseWait; - labelStatus.Refresh(); - textBoxText.Text = GetRtfString(fileName); - SetVideoFileName(fileName); - Text = Configuration.Settings.Language.ImportText.Title + " - " + fileName; - GeneratePreview(); - } - finally - { - labelStatus.Text = string.Empty; - } - } - - private static string GetRtfString(string fileName) - { - const int bomHeaderLength = 3; - var encoding = FileUtil.HasUtf8Bom(fileName) ? Encoding.UTF8 : Encoding.ASCII; - var bytes = FileUtil.ReadAllBytesShared(fileName); - var rtf = encoding.GetString(bytes); - if (Equals(encoding, Encoding.UTF8)) - { - rtf = encoding.GetString(bytes, bomHeaderLength, bytes.Length - bomHeaderLength); - } - - using (var rtb = new RichTextBox { Rtf = rtf }) - { - var sb = new StringBuilder(); - bool italicOn = false; - bool boldOn = false; - bool underlineOn = false; - for (int i = 0; i < rtb.TextLength; i++) - { - rtb.SelectionStart = i; - rtb.SelectionLength = 1; - if (rtb.SelectionFont.Italic && !italicOn) - { - sb.Append(""); - italicOn = true; - } - - if (rtb.SelectionFont.Bold && !boldOn) - { - sb.Append(""); - boldOn = true; - } - - if (rtb.SelectionFont.Underline && !underlineOn) - { - sb.Append(""); - underlineOn = true; - } - - if (!rtb.SelectionFont.Underline && underlineOn) - { - sb.Append(""); - underlineOn = false; - } - - if (!rtb.SelectionFont.Bold && boldOn) - { - sb.Append(""); - boldOn = false; - } - - if (!rtb.SelectionFont.Italic && italicOn) - { - sb.Append(""); - italicOn = false; - } - - sb.Append(rtb.SelectedText); - } - - if (underlineOn) - { - sb.Append("
"); - } - - if (boldOn) - { - sb.Append(""); - } - - if (italicOn) - { - sb.Append(""); - } - - return string.Join(Environment.NewLine, sb.ToString().SplitToLines()) - .Replace($" {Environment.NewLine}", Environment.NewLine) - .Replace(" ", " ") - .Replace(" ", " ") - .Replace("
", " ") - .Replace($"{Environment.NewLine}", Environment.NewLine) - .Replace($"{Environment.NewLine}", Environment.NewLine) - .Replace($"{Environment.NewLine}", Environment.NewLine) - .Replace($"{Environment.NewLine}", Environment.NewLine) - .Replace($"{Environment.NewLine}", Environment.NewLine) - .Replace($"{Environment.NewLine}", Environment.NewLine) - .Replace($"{Environment.NewLine}", Environment.NewLine); - } - } - - private void LoadAdobeStory(string fileName) - { - try - { - var sb = new StringBuilder(); - var doc = new XmlDocument(); - doc.Load(fileName); - var nodes = doc.DocumentElement?.SelectNodes("//paragraph[@element='Dialog']"); - if (nodes != null) - { - foreach (XmlNode node in nodes) // - { - XmlNode textRun = node.SelectSingleNode("textRun"); // Yeah...I suppose - if (textRun != null) - { - sb.AppendLine(textRun.InnerText); - } - } - } - - textBoxText.Text = sb.ToString(); - VideoFileName = null; - Text = Configuration.Settings.Language.ImportText.Title + " - " + fileName; - } - catch (Exception ex) - { - MessageBox.Show(ex.Message); - } - radioButtonLineMode.Checked = true; - checkBoxMergeShortLines.Checked = false; - GeneratePreview(); - } - - private bool LoadFinalDraftTemplate(string fileName, Form parentForm) - { - try - { - var fd = new FinalDraftTemplate2(); - var sub = new Subtitle(); - var lines = Encoding.UTF8.GetString(FileUtil.ReadAllBytesShared(fileName)).SplitToLines(); - var availableParagraphTypes = fd.GetParagraphTypes(lines); - using (var form = new ImportFinalDraft(availableParagraphTypes)) - { - if (form.ShowDialog(parentForm) == DialogResult.OK) - { - fd.ActiveParagraphTypes = form.ChosenParagraphTypes; - fd.LoadSubtitle(sub, lines, fileName); - } - else - { - return false; - } - } - - textBoxText.Text = sub.ToText(fd); - VideoFileName = null; - Text = Configuration.Settings.Language.ImportText.Title + " - " + fileName; - _subtitleInput = sub; - Format = new CsvNuendo(); - groupBoxSplitting.Enabled = false; - textBoxText.Enabled = false; - if (_subtitleInput.Paragraphs.Any(p => !string.IsNullOrEmpty(p.Actor))) - { - SubtitleListview1.ShowActorColumn(Configuration.Settings.Language.General.Character); - } - } - catch (Exception ex) - { - MessageBox.Show(ex.Message); - } - radioButtonLineMode.Checked = true; - checkBoxMergeShortLines.Checked = false; - GeneratePreview(); - return true; - } - - private void SetVideoFileName(string fileName) - { - VideoFileName = fileName.Substring(0, fileName.Length - Path.GetExtension(fileName).Length); - if (VideoFileName.EndsWith(".en", StringComparison.Ordinal)) - { - VideoFileName = VideoFileName.Remove(VideoFileName.Length - 3); - } - - foreach (var ext in Utilities.VideoFileExtensions) - { - if (File.Exists(VideoFileName + ext)) - { - VideoFileName += ext; - return; - } - } - - var dir = Path.GetDirectoryName(fileName); - if (dir != null) - { - foreach (var ext in Utilities.VideoFileExtensions) - { - var files = Directory.GetFiles(dir, Path.GetFileNameWithoutExtension(VideoFileName) + "*" + ext); - if (files.Length > 0) - { - VideoFileName = files[0]; - return; - } - } - VideoFileName = null; - } - } - - private void ButtonRefreshClick(object sender, EventArgs e) - { - GeneratePreview(); - } - - private void RadioButtonDurationFixedCheckedChanged(object sender, EventArgs e) - { - numericUpDownDurationFixed.Enabled = radioButtonDurationFixed.Checked; - GeneratePreview(); - } - - private void CheckBoxMergeShortLinesCheckedChanged(object sender, EventArgs e) - { - GeneratePreview(); - } - - private void ImportTextKeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - private void TextBoxTextTextChanged(object sender, EventArgs e) - { - GeneratePreview(); - } - - private void NumericUpDownDurationFixedValueChanged(object sender, EventArgs e) - { - GeneratePreview(); - } - - private void NumericUpDownGapBetweenLinesValueChanged(object sender, EventArgs e) - { - GeneratePreview(); - } - - private void RadioButtonDurationAutoCheckedChanged(object sender, EventArgs e) - { - GeneratePreview(); - } - - private void radioButtonSplitAtBlankLines_CheckedChanged(object sender, EventArgs e) - { - GeneratePreview(); - } - - private void checkBoxGenerateTimeCodes_CheckedChanged(object sender, EventArgs e) - { - groupBoxTimeCodes.Enabled = checkBoxGenerateTimeCodes.Checked; - GeneratePreview(); - } - - private void ImportText_FormClosing(object sender, FormClosingEventArgs e) - { - if (radioButtonSplitAtBlankLines.Checked) - { - Configuration.Settings.Tools.ImportTextSplitting = "blank lines"; - } - else if (radioButtonLineMode.Checked) - { - Configuration.Settings.Tools.ImportTextSplitting = "line"; - } - else - { - Configuration.Settings.Tools.ImportTextSplitting = "auto"; - } - - Configuration.Settings.Tools.ImportTextLineBreak = comboBoxLineBreak.Text.Trim(); - Configuration.Settings.Tools.ImportTextMergeShortLines = checkBoxMergeShortLines.Checked; - Configuration.Settings.Tools.ImportTextRemoveEmptyLines = checkBoxRemoveEmptyLines.Checked; - Configuration.Settings.Tools.ImportTextAutoSplitNumberOfLines = numericUpDownAutoSplitMaxLines.Value; - Configuration.Settings.Tools.ImportTextAutoSplitAtBlank = checkBoxAutoSplitAtBlankLines.Checked; - - if (radioButtonAutoSplit.Checked) - { - Configuration.Settings.Tools.ImportTextRemoveLinesNoLetters = checkBoxAutoSplitRemoveLinesNoLetters.Checked; - } - else - { - Configuration.Settings.Tools.ImportTextRemoveLinesNoLetters = checkBoxRemoveLinesWithoutLetters.Checked; - } - - Configuration.Settings.Tools.ImportTextGenerateTimeCodes = checkBoxGenerateTimeCodes.Checked; - Configuration.Settings.Tools.ImportTextTakeTimeCodeFromFileName = checkBoxTakeTimeFromFileNames.Checked; - Configuration.Settings.Tools.ImportTextAutoBreak = checkBoxAutoBreak.Checked; - Configuration.Settings.Tools.ImportTextAutoBreakAtEnd = checkBoxAutoSplitAtEnd.Checked; - Configuration.Settings.Tools.ImportTextAutoBreakAtEndMarkerText = textBoxAsEnd.Text.Replace(" ", string.Empty); - Configuration.Settings.Tools.ImportTextGap = numericUpDownGapBetweenLines.Value; - Configuration.Settings.Tools.ImportTextDurationAuto = radioButtonDurationAuto.Checked; - Configuration.Settings.Tools.ImportTextFixedDuration = numericUpDownDurationFixed.Value; - } - - private void checkBoxMultipleFiles_CheckedChanged(object sender, EventArgs e) - { - Format = null; - textBoxText.Enabled = true; - groupBoxSplitting.Enabled = true; - if (checkBoxMultipleFiles.Checked) - { - listViewInputFiles.Visible = true; - textBoxText.Visible = false; - buttonOpenText.Text = Configuration.Settings.Language.ImportText.OpenTextFiles; - groupBoxSplitting.Enabled = false; - checkBoxTakeTimeFromFileNames.Visible = true; - } - else - { - listViewInputFiles.Visible = false; - textBoxText.Visible = true; - buttonOpenText.Text = Configuration.Settings.Language.ImportText.OpenTextFile; - groupBoxSplitting.Enabled = true; - checkBoxTakeTimeFromFileNames.Visible = false; - } - GeneratePreview(); - } - - private void listViewInputFiles_DragEnter(object sender, DragEventArgs e) - { - if (e.Data.GetDataPresent(DataFormats.FileDrop, false)) - { - e.Effect = DragDropEffects.All; - } - } - - private void listViewInputFiles_DragDrop(object sender, DragEventArgs e) - { - var fileNames = (string[])e.Data.GetData(DataFormats.FileDrop); - foreach (string fileName in fileNames.OrderBy(p => p)) - { - AddInputFile(fileName); - } - GeneratePreview(); - } - - private void AddInputFile(string fileName) - { - try - { - var fi = new FileInfo(fileName); - var item = new ListViewItem(fileName) { Tag = fileName }; - item.SubItems.Add(Utilities.FormatBytesToDisplayFileSize(fi.Length)); - if (fi.Length < 1024 * 1024) // max 1 mb - { - listViewInputFiles.Items.Add(item); - } - } - catch - { - // ignored - } - } - - private void checkBoxAutoBreak_CheckedChanged(object sender, EventArgs e) - { - GeneratePreview(); - } - - private void comboBoxLineBreak_TextChanged(object sender, EventArgs e) - { - GeneratePreview(); - } - - private void clearToolStripMenuItem_Click(object sender, EventArgs e) - { - listViewInputFiles.Items.Clear(); - } - - private void ImportText_Shown(object sender, EventArgs e) - { - if (textBoxText.Visible && textBoxText.Text.Length > 20) - { - buttonOK.Focus(); - } - - if (_exit) - { - DialogResult = DialogResult.Cancel; - } - - var workingArea = Screen.FromControl(this).WorkingArea; - if (workingArea.Height < Height) - { - Height = Math.Max(workingArea.Height, MinimumSize.Height); - } - } - - private void startNumberingFromToolStripMenuItem_Click(object sender, EventArgs e) - { - using (var startNumberingFrom = new StartNumberingFrom()) - { - if (startNumberingFrom.ShowDialog(this) == DialogResult.OK) - { - _startFromNumber = startNumberingFrom.StartFromNumber; - FixedSubtitle.Renumber(startNumberingFrom.StartFromNumber); - SubtitleListview1.Fill(FixedSubtitle); - } - } - } - - private void numericUpDownAutoSplitMaxLines_ValueChanged(object sender, EventArgs e) - { - GeneratePreview(); - } - - private void textBoxAsEnd1_TextChanged(object sender, EventArgs e) - { - GeneratePreview(); - } - - private void checkBoxAutoSplitAtBlankLines_CheckedChanged(object sender, EventArgs e) - { - GeneratePreview(); - } - - private void checkBoxAutoSplitRemoveLinesNoLetters_CheckedChanged(object sender, EventArgs e) - { - GeneratePreview(); - } - - private void textBoxAsEnd1_KeyPress(object sender, KeyPressEventArgs e) - { - if (e.KeyChar == (char)Keys.Space || char.IsLetterOrDigit(e.KeyChar)) - { - e.Handled = true; - } - } - - private void numericUpDownSubtitleLineMaximumLength_ValueChanged(object sender, EventArgs e) - { - GeneratePreview(); - } - - private void comboBoxLineMode_SelectedIndexChanged(object sender, EventArgs e) - { - GeneratePreview(); - } - - private void checkBoxAutoSplitAtEnd_CheckedChanged(object sender, EventArgs e) - { - GeneratePreview(); - } - } +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.SubtitleFormats; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Text; +using System.Text.RegularExpressions; +using System.Windows.Forms; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class ImportText : Form + { + private Subtitle _subtitleInput; + private string _fileName; + private readonly Timer _refreshTimer = new Timer(); + private readonly bool _exit; + private int _startFromNumber = 1; + + public Subtitle FixedSubtitle { get; private set; } + public SubtitleFormat Format { get; set; } + public string VideoFileName { get; private set; } + + public ImportText(string fileName = null, Form parentForm = null) + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + Text = Configuration.Settings.Language.ImportText.Title; + groupBoxImportText.Text = Configuration.Settings.Language.ImportText.Title; + buttonOpenText.Text = Configuration.Settings.Language.ImportText.OpenTextFile; + groupBoxImportOptions.Text = Configuration.Settings.Language.ImportText.ImportOptions; + groupBoxSplitting.Text = Configuration.Settings.Language.ImportText.Splitting; + radioButtonAutoSplit.Text = Configuration.Settings.Language.ImportText.AutoSplitText; + radioButtonLineMode.Text = string.Empty; + comboBoxLineMode.Items.Clear(); + comboBoxLineMode.Items.Add(Configuration.Settings.Language.ImportText.OneLineIsOneSubtitle); + comboBoxLineMode.Items.Add(Configuration.Settings.Language.ImportText.TwoLinesAreOneSubtitle); + comboBoxLineMode.SelectedIndex = 0; + labelLineBreak.Text = Configuration.Settings.Language.ImportText.LineBreak; + columnHeaderFName.Text = Configuration.Settings.Language.JoinSubtitles.FileName; + columnHeaderSize.Text = Configuration.Settings.Language.General.Size; + comboBoxLineBreak.Left = labelLineBreak.Left + labelLineBreak.Width + 3; + comboBoxLineBreak.Width = groupBoxSplitting.Width - comboBoxLineBreak.Left - 5; + checkBoxMultipleFiles.AutoSize = true; + checkBoxMultipleFiles.Left = buttonOpenText.Left - checkBoxMultipleFiles.Width - 9; + checkBoxMultipleFiles.Text = Configuration.Settings.Language.ImportText.OneSubtitleIsOneFile; + listViewInputFiles.Visible = false; + labelSubMaxLen.Text = Configuration.Settings.Language.Settings.SubtitleLineMaximumLength; + numericUpDownSubtitleLineMaximumLength.Left = labelSubMaxLen.Left + labelSubMaxLen.Width + 3; + + radioButtonSplitAtBlankLines.Text = Configuration.Settings.Language.ImportText.SplitAtBlankLines; + checkBoxMergeShortLines.Text = Configuration.Settings.Language.ImportText.MergeShortLines; + checkBoxRemoveEmptyLines.Text = Configuration.Settings.Language.ImportText.RemoveEmptyLines; + checkBoxRemoveLinesWithoutLetters.Text = Configuration.Settings.Language.ImportText.RemoveLinesWithoutLetters; + checkBoxAutoSplitRemoveLinesNoLetters.Text = Configuration.Settings.Language.ImportText.RemoveLinesWithoutLetters; + checkBoxGenerateTimeCodes.Text = Configuration.Settings.Language.ImportText.GenerateTimeCodes; + checkBoxTakeTimeFromFileNames.Text = Configuration.Settings.Language.ImportText.TakeTimeFromFileName; + checkBoxTakeTimeFromFileNames.Left = checkBoxGenerateTimeCodes.Left + checkBoxGenerateTimeCodes.Width + 9; + checkBoxAutoBreak.Text = Configuration.Settings.Language.Settings.MainTextBoxAutoBreak; + labelGapBetweenSubtitles.Text = Configuration.Settings.Language.ImportText.GapBetweenSubtitles; + numericUpDownGapBetweenLines.Left = labelGapBetweenSubtitles.Left + labelGapBetweenSubtitles.Width + 3; + groupBoxDuration.Text = Configuration.Settings.Language.General.Duration; + radioButtonDurationAuto.Text = Configuration.Settings.Language.ImportText.Auto; + radioButtonDurationFixed.Text = Configuration.Settings.Language.ImportText.Fixed; + buttonRefresh.Text = Configuration.Settings.Language.ImportText.Refresh; + groupBoxTimeCodes.Text = Configuration.Settings.Language.ImportText.TimeCodes; + groupBoxImportResult.Text = Configuration.Settings.Language.General.Preview; + clearToolStripMenuItem.Text = Configuration.Settings.Language.DvdSubRip.Clear; + startNumberingFromToolStripMenuItem.Text = Configuration.Settings.Language.Main.Menu.Tools.StartNumberingFrom; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + SubtitleListview1.InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings); + UiUtil.InitializeSubtitleFont(SubtitleListview1); + UiUtil.InitializeSubtitleFont(listViewInputFiles); + textBoxText.Font = new System.Drawing.Font(listViewInputFiles.Font.FontFamily, listViewInputFiles.Font.Size, listViewInputFiles.Font.Style); + SubtitleListview1.AutoSizeAllColumns(this); + checkBoxTakeTimeFromFileNames.Visible = false; + + if (string.IsNullOrEmpty(Configuration.Settings.Tools.ImportTextSplitting)) + { + radioButtonAutoSplit.Checked = true; + } + else if (Configuration.Settings.Tools.ImportTextSplitting.Equals("blank lines", StringComparison.OrdinalIgnoreCase)) + { + radioButtonSplitAtBlankLines.Checked = true; + } + else if (Configuration.Settings.Tools.ImportTextSplitting.Equals("line", StringComparison.OrdinalIgnoreCase)) + { + radioButtonLineMode.Checked = true; + } + + comboBoxLineBreak.Text = Configuration.Settings.Tools.ImportTextLineBreak; + checkBoxMergeShortLines.Checked = Configuration.Settings.Tools.ImportTextMergeShortLines; + checkBoxRemoveEmptyLines.Checked = Configuration.Settings.Tools.ImportTextRemoveEmptyLines; + checkBoxAutoSplitAtBlankLines.Checked = Configuration.Settings.Tools.ImportTextAutoSplitAtBlank; + checkBoxRemoveLinesWithoutLetters.Checked = Configuration.Settings.Tools.ImportTextRemoveLinesNoLetters; + checkBoxAutoSplitRemoveLinesNoLetters.Checked = Configuration.Settings.Tools.ImportTextRemoveLinesNoLetters; + checkBoxGenerateTimeCodes.Checked = Configuration.Settings.Tools.ImportTextGenerateTimeCodes; + checkBoxTakeTimeFromFileNames.Checked = Configuration.Settings.Tools.ImportTextTakeTimeCodeFromFileName; + checkBoxAutoBreak.Checked = Configuration.Settings.Tools.ImportTextAutoBreak; + textBoxAsEnd.Text = Configuration.Settings.Tools.ImportTextAutoBreakAtEndMarkerText.Replace(" ", string.Empty); + checkBoxAutoSplitAtEnd.Checked = Configuration.Settings.Tools.ImportTextAutoBreakAtEnd; + checkBoxAutoSplitAtEnd.Text = Configuration.Settings.Language.ImportText.SplitAtEndChars; + textBoxAsEnd.Left = checkBoxAutoSplitAtEnd.Left + checkBoxAutoSplitAtEnd.Width; + checkBoxAutoSplitAtBlankLines.Text = Configuration.Settings.Language.ImportText.SplitAtBlankLines; + + groupBoxAutoSplitSettings.Text = Configuration.Settings.Language.Settings.Title; + labelAutoSplitNumberOfLines.Text = Configuration.Settings.Language.Settings.MaximumLines; + numericUpDownSubtitleLineMaximumLength.Left = labelSubMaxLen.Left + labelSubMaxLen.Width + 3; + numericUpDownSubtitleLineMaximumLength.Value = Configuration.Settings.General.SubtitleLineMaximumLength; + + if (Configuration.Settings.Tools.ImportTextAutoSplitNumberOfLines >= numericUpDownAutoSplitMaxLines.Minimum && + Configuration.Settings.Tools.ImportTextAutoSplitNumberOfLines <= numericUpDownAutoSplitMaxLines.Maximum) + { + numericUpDownAutoSplitMaxLines.Value = Configuration.Settings.Tools.ImportTextAutoSplitNumberOfLines; + } + + if (Configuration.Settings.Tools.ImportTextGap >= numericUpDownGapBetweenLines.Minimum && Configuration.Settings.Tools.ImportTextGap <= numericUpDownGapBetweenLines.Maximum) + { + numericUpDownGapBetweenLines.Value = Configuration.Settings.Tools.ImportTextGap; + } + if (Configuration.Settings.Tools.ImportTextDurationAuto) + { + radioButtonDurationAuto.Checked = true; + } + else + { + radioButtonDurationFixed.Checked = true; + } + numericUpDownDurationFixed.Enabled = radioButtonDurationFixed.Checked; + if (Configuration.Settings.Tools.ImportTextFixedDuration >= numericUpDownDurationFixed.Minimum && + Configuration.Settings.Tools.ImportTextFixedDuration <= numericUpDownDurationFixed.Maximum) + { + numericUpDownDurationFixed.Value = Configuration.Settings.Tools.ImportTextFixedDuration; + } + UiUtil.FixLargeFonts(this, buttonOK); + _refreshTimer.Interval = 400; + _refreshTimer.Tick += RefreshTimerTick; + + if (fileName != null && File.Exists(fileName)) + { + if (!LoadSingleFile(fileName, parentForm)) + { + _exit = true; + } + } + } + + private void RefreshTimerTick(object sender, EventArgs e) + { + _refreshTimer.Stop(); + GeneratePreviewReal(); + } + + private void ButtonOpenTextClick(object sender, EventArgs e) + { + Text = Configuration.Settings.Language.ImportText.Title; + openFileDialog1.Title = buttonOpenText.Text; + if (checkBoxMultipleFiles.Visible && checkBoxMultipleFiles.Checked) + { + openFileDialog1.Filter = Configuration.Settings.Language.ImportText.TextFiles + "|*.txt;*.rtf|" + Configuration.Settings.Language.General.AllFiles + " |*.*"; + } + else + { + openFileDialog1.Filter = Configuration.Settings.Language.ImportText.TextFiles + "|*.txt;*.rtf;*.tx3g;*.astx;*" + new FinalDraftTemplate2().Extension + "|Adobe Story|*.astx|Final Draft Template|*" + new FinalDraftTemplate2().Extension + "|" + Configuration.Settings.Language.General.AllFiles + "|*.*"; + } + + openFileDialog1.FileName = string.Empty; + openFileDialog1.Multiselect = checkBoxMultipleFiles.Visible && checkBoxMultipleFiles.Checked; + if (openFileDialog1.ShowDialog() == DialogResult.OK) + { + groupBoxImportOptions.Visible = true; + _startFromNumber = 1; + if (checkBoxMultipleFiles.Visible && checkBoxMultipleFiles.Checked) + { + foreach (var fileName in openFileDialog1.FileNames) + { + AddInputFile(fileName); + } + } + else + { + LoadSingleFile(openFileDialog1.FileName, this); + } + GeneratePreview(); + } + } + + private bool LoadSingleFile(string fileName, Form parentForm) + { + groupBoxSplitting.Enabled = true; + textBoxText.Enabled = true; + Format = null; + string ext = string.Empty; + var extension = Path.GetExtension(fileName); + _fileName = fileName; + if (extension != null) + { + ext = extension.ToLowerInvariant(); + } + + var fd = new FinalDraftTemplate2(); + var list = new List(FileUtil.ReadAllLinesShared(fileName, LanguageAutoDetect.GetEncodingFromFile(fileName))); + bool isFinalDraft = fd.IsMine(list, fileName); + + if (ext == ".astx") + { + LoadAdobeStory(fileName); + } + else if (isFinalDraft) + { + return LoadFinalDraftTemplate(fileName, parentForm ?? this); + } + else if (ext == ".tx3g" && new Tx3GTextOnly().IsMine(null, fileName)) + { + LoadTx3G(fileName); + } + else if (ext == ".rtf" && FileUtil.IsRtf(fileName)) + { + LoadRtf(fileName); + } + else if (ext == ".html" && IsHtmlIndexExportFromSubtitleEdit(fileName)) + { + textBoxText.Text = FileUtil.ReadAllTextShared(fileName, Encoding.UTF8); + Text = Configuration.Settings.Language.ImportText.Title + " - " + fileName; + GeneratePreview(); + groupBoxImportOptions.Visible = false; + } + else + { + LoadTextFile(fileName); + } + return true; + } + + private static bool IsHtmlIndexExportFromSubtitleEdit(string fileName) + { + if (string.IsNullOrEmpty(fileName)) + { + return false; + } + + var html = FileUtil.ReadAllTextShared(fileName, Encoding.UTF8); + var s = GetSubtitleFromHtmlIndex(html); + return s.Paragraphs.Count > 0; + } + + private static Subtitle GetSubtitleFromHtmlIndex(string html) + { + var lines = html + .Replace($"
{Environment.NewLine}", "
") + .Replace("
\\n", "
") + .SplitToLines(); + + // A line will look like this: #1:4:06,288->4:09,375

My mommy always said
there were no monsters.


+ var subtitle = new Subtitle(); + foreach (var line in lines) + { + var indexOfText = line.IndexOf("background-color:", StringComparison.OrdinalIgnoreCase); + if (indexOfText >= 0) + { + indexOfText = line.IndexOf('>', indexOfText); + } + + var indexOfFirstColon = line.IndexOf(':'); + var indexOfTimeSplit = line.IndexOf("->", StringComparison.Ordinal); + var indexOfFirstDiv = line.IndexOf(" 0 && indexOfFirstColon > 0 && indexOfTimeSplit > 0 && indexOfFirstDiv > 0) + { + var start = line.Substring(indexOfFirstColon + 1, indexOfTimeSplit - indexOfFirstColon - 1); + var end = line.Substring(indexOfTimeSplit + 2, indexOfFirstDiv - indexOfTimeSplit - 2); + var text = line.Substring(indexOfText + 1) + .Replace("
", string.Empty) + .Replace("
", string.Empty) + .Replace("
", string.Empty) + .Replace("
", string.Empty) + .Replace("
", Environment.NewLine) + .Replace("
", Environment.NewLine) + .Trim(); + text = WebUtility.HtmlDecode(text); + var p = new Paragraph(text, DecodeTimeCode(start), DecodeTimeCode(end)); + subtitle.Paragraphs.Add(p); + } + } + subtitle.Renumber(); + return subtitle; + } + + private static double DecodeTimeCode(string tc) + { + var parts = tc.Split(',', '.', ':'); + try + { + if (parts.Length == 2) + { + return new TimeCode(0, 0, int.Parse(parts[0]), int.Parse(parts[1])).TotalMilliseconds; + } + if (parts.Length == 3) + { + return new TimeCode(0, int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2])).TotalMilliseconds; + } + if (parts.Length == 4) + { + return new TimeCode(int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2]), int.Parse(parts[3])).TotalMilliseconds; + } + } + catch + { + return 0; + } + return 0; + } + + private void GeneratePreview() + { + if (radioButtonSplitAtBlankLines.Checked || radioButtonLineMode.Checked) + { + groupBoxAutoSplitSettings.Visible = false; + groupBoxAutoSplitSettings.SendToBack(); + checkBoxMergeShortLines.Enabled = true; + checkBoxRemoveEmptyLines.Enabled = true; + checkBoxAutoBreak.Enabled = true; + checkBoxAutoBreak.Text = Configuration.Settings.Language.Settings.MainTextBoxAutoBreak; + } + else // auto split + { + groupBoxAutoSplitSettings.Visible = true; + groupBoxAutoSplitSettings.BringToFront(); + checkBoxMergeShortLines.Enabled = false; + checkBoxRemoveEmptyLines.Enabled = false; + checkBoxAutoBreak.Enabled = true; + } + + if (_refreshTimer.Enabled) + { + _refreshTimer.Stop(); + } + + _refreshTimer.Start(); + } + + private void GeneratePreviewReal() + { + if (IsHtmlIndexExportFromSubtitleEdit(_fileName)) + { + groupBoxImportOptions.Visible = false; + var html = FileUtil.ReadAllTextShared(_fileName, Encoding.UTF8); + FixedSubtitle = GetSubtitleFromHtmlIndex(html); + groupBoxImportResult.Text = string.Format(Configuration.Settings.Language.ImportText.PreviewLinesModifiedX, FixedSubtitle.Paragraphs.Count); + SubtitleListview1.Fill(FixedSubtitle); + SubtitleListview1.SelectIndexAndEnsureVisible(0); + return; + } + + groupBoxImportOptions.Visible = true; + if (Format == null || Format.GetType() != typeof(CsvNuendo)) + { + FixedSubtitle = new Subtitle(); + if (checkBoxMultipleFiles.Visible && checkBoxMultipleFiles.Checked) + { + ImportMultipleFiles(listViewInputFiles.Items); + } + else if (radioButtonLineMode.Checked) + { + ImportLineMode(textBoxText.Lines); + } + else if (radioButtonAutoSplit.Checked) + { + ImportAutoSplit(textBoxText.Lines); + } + else + { + ImportSplitAtBlankLine(textBoxText.Lines); + } + } + else + { + FixedSubtitle = new Subtitle(_subtitleInput); + if (checkBoxAutoBreak.Enabled && checkBoxAutoBreak.Checked) + { + foreach (var p in FixedSubtitle.Paragraphs) + { + p.Text = Utilities.AutoBreakLine(p.Text); + } + } + } + + if (checkBoxMergeShortLines.Checked) + { + MergeLinesWithContinuation(); + } + + FixedSubtitle.Renumber(_startFromNumber); + if (checkBoxGenerateTimeCodes.Checked && checkBoxTakeTimeFromFileNames.Visible && checkBoxTakeTimeFromFileNames.Checked) + { + // time codes already generated + } + else if (checkBoxGenerateTimeCodes.Checked) + { + FixDurations(); + MakePseudoStartTime(); + } + else + { + foreach (var p in FixedSubtitle.Paragraphs) + { + p.StartTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; + p.EndTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; + } + } + + groupBoxImportResult.Text = string.Format(Configuration.Settings.Language.ImportText.PreviewLinesModifiedX, FixedSubtitle.Paragraphs.Count); + SubtitleListview1.Fill(FixedSubtitle); + SubtitleListview1.SelectIndexAndEnsureVisible(0); + } + + private void ImportMultipleFiles(ListView.ListViewItemCollection listViewItemCollection) + { + foreach (ListViewItem item in listViewItemCollection) + { + string line; + try + { + line = GetAllText(item.Text).Trim(); + } + catch + { + line = string.Empty; + } + + line = line.Replace("|", Environment.NewLine); + if (comboBoxLineBreak.Text.Length > 0) + { + foreach (var splitter in comboBoxLineBreak.Text.Split(';')) + { + var tempSplitter = splitter.Trim(); + if (tempSplitter.Length > 0) + { + line = line.Replace(tempSplitter, Environment.NewLine); + } + } + } + + if (string.IsNullOrWhiteSpace(line)) + { + if (!checkBoxRemoveEmptyLines.Checked) + { + FixedSubtitle.Paragraphs.Add(new Paragraph()); + ImportImages.SetEndTimeAndStartTime(Path.GetFileNameWithoutExtension(item.Text), FixedSubtitle.Paragraphs.Last()); + } + } + else if (!PlainTextImporter.ContainsLetters(line)) + { + if (!checkBoxRemoveLinesWithoutLetters.Checked) + { + FixedSubtitle.Paragraphs.Add(new Paragraph(line.Trim(), 0, 0)); + ImportImages.SetEndTimeAndStartTime(Path.GetFileNameWithoutExtension(item.Text), FixedSubtitle.Paragraphs.Last()); + } + } + else + { + FixedSubtitle.Paragraphs.Add(new Paragraph(line.Trim(), 0, 0)); + ImportImages.SetEndTimeAndStartTime(Path.GetFileNameWithoutExtension(item.Text), FixedSubtitle.Paragraphs.Last()); + } + } + } + + private void MergeLinesWithContinuation() + { + var temp = new Subtitle(); + bool skipNext = false; + for (int i = 0; i < FixedSubtitle.Paragraphs.Count; i++) + { + Paragraph p = FixedSubtitle.Paragraphs[i]; + if (!skipNext) + { + Paragraph next = FixedSubtitle.GetParagraphOrDefault(i + 1); + + bool merge = !(p.Text.Contains(Environment.NewLine) || next == null) && Configuration.Settings.General.MaxNumberOfLines > 1; + + if (merge && (p.Text.TrimEnd().EndsWith('!') || p.Text.TrimEnd().EndsWith('.'))) + { + var st = new StrippableText(p.Text); + if (st.StrippedText.Length > 0 && char.IsUpper(st.StrippedText[0])) + { + merge = false; + } + } + + if (merge && (p.Text.Length >= Configuration.Settings.General.SubtitleLineMaximumLength - 5 || next.Text.Length >= Configuration.Settings.General.SubtitleLineMaximumLength - 5)) + { + merge = false; + } + + if (merge) + { + temp.Paragraphs.Add(new Paragraph { Text = p.Text + Environment.NewLine + next.Text }); + skipNext = true; + } + else + { + temp.Paragraphs.Add(new Paragraph(p)); + } + } + else + { + skipNext = false; + } + } + FixedSubtitle = temp; + } + + private void MakePseudoStartTime() + { + var millisecondsInterval = (double)numericUpDownGapBetweenLines.Value; + double millisecondsIndex = millisecondsInterval; + foreach (Paragraph p in FixedSubtitle.Paragraphs) + { + p.EndTime.TotalMilliseconds = millisecondsIndex + p.Duration.TotalMilliseconds; + p.StartTime.TotalMilliseconds = millisecondsIndex; + millisecondsIndex += (p.EndTime.TotalMilliseconds - p.StartTime.TotalMilliseconds) + millisecondsInterval; + } + } + + private void FixDurations() + { + foreach (Paragraph p in FixedSubtitle.Paragraphs) + { + if (p.Text.Length == 0) + { + p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + 2000; + } + else + { + if (radioButtonDurationAuto.Checked) + { + p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + (Utilities.GetOptimalDisplayMilliseconds(p.Text)); + } + else + { + p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + ((double)numericUpDownDurationFixed.Value); + } + } + } + } + + private void ImportLineMode(IEnumerable lines) + { + var item = new List(); + foreach (string loopLine in lines) + { + // Replace user line break character with Environment.NewLine. + string line = loopLine; + if (comboBoxLineBreak.Text.Length > 0) + { + foreach (string splitter in comboBoxLineBreak.Text.Split(';')) + { + var tempSplitter = splitter.Trim(); + if (tempSplitter.Length > 0) + { + line = line.Replace(tempSplitter, Environment.NewLine); + } + } + } + + if (string.IsNullOrWhiteSpace(line)) + { + if (!checkBoxRemoveEmptyLines.Checked) + { + item.Add(string.Empty); + } + } + else if (!PlainTextImporter.ContainsLetters(line)) + { + if (!checkBoxRemoveLinesWithoutLetters.Checked) + { + item.Add(line.Trim()); + } + } + else + { + string text = line.Trim(); + if (checkBoxAutoBreak.Enabled && checkBoxAutoBreak.Checked && comboBoxLineMode.SelectedIndex == 0) + { + text = Utilities.AutoBreakLine(text); + } + + item.Add(text); + } + + if (item.Count >= comboBoxLineMode.SelectedIndex + 1) + { + FixedSubtitle.Paragraphs.Add(new Paragraph { Text = string.Join(Environment.NewLine, item.ToArray()) }); + item.Clear(); + } + } + if (item.Count > 0) + { + FixedSubtitle.Paragraphs.Add(new Paragraph { Text = string.Join(Environment.NewLine, item.ToArray()) }); + } + } + + private void ImportSplitAtBlankLine(IEnumerable lines) + { + var sb = new StringBuilder(); + foreach (string line in lines) + { + if (string.IsNullOrWhiteSpace(line)) + { + if (sb.Length > 0) + { + string text = sb.ToString().Trim(); + if (checkBoxAutoBreak.Enabled && checkBoxAutoBreak.Checked) + { + text = Utilities.AutoBreakLine(text); + } + + FixedSubtitle.Paragraphs.Add(new Paragraph { Text = text }); + sb.Clear(); + } + } + else if (!PlainTextImporter.ContainsLetters(line)) + { + if (!checkBoxRemoveLinesWithoutLetters.Checked) + { + sb.AppendLine(line.Trim()); + } + } + else + { + sb.AppendLine(line.Trim()); + } + } + if (sb.Length > 0) + { + SplitSingle(sb); + } + } + + private static bool CanMakeThreeLiner(out string text, string input) + { + text = string.Empty; + if (input.Length < Configuration.Settings.General.SubtitleLineMaximumLength * 3 && input.Length > Configuration.Settings.General.SubtitleLineMaximumLength * 1.5) + { + var splitLines = Utilities.AutoBreakLine(input).SplitToLines(); + if (splitLines.Count == 2 && (splitLines[0].Length > Configuration.Settings.General.SubtitleLineMaximumLength || splitLines[1].Length > Configuration.Settings.General.SubtitleLineMaximumLength)) + { + var first = new StringBuilder(); + var second = new StringBuilder(); + var third = new StringBuilder(); + foreach (string word in input.Replace(Environment.NewLine, " ").Replace(" ", " ").Split(' ')) + { + if (first.Length + word.Length < Configuration.Settings.General.SubtitleLineMaximumLength) + { + first.Append(' '); + first.Append(word); + } + else if (second.Length + word.Length < Configuration.Settings.General.SubtitleLineMaximumLength) + { + second.Append(' '); + second.Append(word); + } + else + { + third.Append(' '); + third.Append(word); + } + } + if (third.Length <= Configuration.Settings.General.SubtitleLineMaximumLength && third.Length > 10) + { + if (second.Length > 15) + { + string ending = second.ToString().Substring(second.Length - 9); + int splitPos = -1; + if (ending.Contains(". ")) + { + splitPos = ending.IndexOf(". ", StringComparison.Ordinal) + second.Length - 9; + } + else if (ending.Contains("! ")) + { + splitPos = ending.IndexOf("! ", StringComparison.Ordinal) + second.Length - 9; + } + else if (ending.Contains(", ")) + { + splitPos = ending.IndexOf(", ", StringComparison.Ordinal) + second.Length - 9; + } + else if (ending.Contains("? ")) + { + splitPos = ending.IndexOf("? ", StringComparison.Ordinal) + second.Length - 9; + } + + if (splitPos > 0) + { + text = Utilities.AutoBreakLine(first.ToString().Trim() + second.ToString().Substring(0, splitPos + 1)).Trim() + Environment.NewLine + (second.ToString().Substring(splitPos + 1) + third).Trim(); + return true; + } + } + + text = first + Environment.NewLine + second + Environment.NewLine + third; + return true; + } + } + } + return false; + } + + private void SplitSingle(StringBuilder sb) + { + string t = sb.ToString().Trim(); + var tarr = t.SplitToLines(); + if (checkBoxMergeShortLines.Checked == false && tarr.Count == 3 && + tarr[0].Length < Configuration.Settings.General.SubtitleLineMaximumLength && + tarr[1].Length < Configuration.Settings.General.SubtitleLineMaximumLength && + tarr[2].Length < Configuration.Settings.General.SubtitleLineMaximumLength) + { + FixedSubtitle.Paragraphs.Add(new Paragraph { Text = tarr[0] + Environment.NewLine + tarr[1] }); + return; + } + if (checkBoxMergeShortLines.Checked == false && tarr.Count == 2 && + tarr[0].Length < Configuration.Settings.General.SubtitleLineMaximumLength && + tarr[1].Length < Configuration.Settings.General.SubtitleLineMaximumLength) + { + FixedSubtitle.Paragraphs.Add(new Paragraph { Text = tarr[0] + Environment.NewLine + tarr[1] }); + return; + } + if (checkBoxMergeShortLines.Checked == false && tarr.Count == 1 && tarr[0].Length < Configuration.Settings.General.SubtitleLineMaximumLength) + { + FixedSubtitle.Paragraphs.Add(new Paragraph { Text = tarr[0].Trim() }); + return; + } + + Paragraph p = null; + if (CanMakeThreeLiner(out var threeLiner, sb.ToString())) + { + var parts = threeLiner.SplitToLines(); + FixedSubtitle.Paragraphs.Add(new Paragraph { Text = parts[0] + Environment.NewLine + parts[1] }); + FixedSubtitle.Paragraphs.Add(new Paragraph { Text = parts[2].Trim() }); + return; + } + + foreach (string text in Utilities.AutoBreakLineMoreThanTwoLines(sb.ToString(), Configuration.Settings.General.SubtitleLineMaximumLength, Configuration.Settings.General.MergeLinesShorterThan, "en").SplitToLines()) + { + if (p == null) + { + p = new Paragraph { Text = text }; + } + else if (p.Text.Contains(Environment.NewLine)) + { + FixedSubtitle.Paragraphs.Add(p); + p = new Paragraph(); + if (text.Length >= Configuration.Settings.General.SubtitleLineMaximumLength) + { + p.Text = Utilities.AutoBreakLine(text); + } + else + { + p.Text = text; + } + } + else + { + if (checkBoxMergeShortLines.Checked || p.Text.Length > Configuration.Settings.General.SubtitleLineMaximumLength || text.Length > Configuration.Settings.General.SubtitleLineMaximumLength) + { + p.Text = Utilities.AutoBreakLine(p.Text + Environment.NewLine + text.Trim()); + } + else + { + p.Text = p.Text + Environment.NewLine + text.Trim(); + } + } + } + if (p != null) + { + FixedSubtitle.Paragraphs.Add(p); + } + } + + private void ImportAutoSplit(string[] textLines) + { + var sub = new Subtitle(); + foreach (var line in textLines) + { + sub.Paragraphs.Add(new Paragraph(line, 0, 0)); + } + var language = LanguageAutoDetect.AutoDetectGoogleLanguage(sub); + + var plainTextImporter = new PlainTextImporter(checkBoxAutoSplitAtBlankLines.Checked, + checkBoxAutoSplitRemoveLinesNoLetters.Checked, + (int)numericUpDownAutoSplitMaxLines.Value, + checkBoxAutoSplitAtEnd.Checked ? textBoxAsEnd.Text : string.Empty, + (int)numericUpDownSubtitleLineMaximumLength.Value, + language); + + ImportLineMode(plainTextImporter.ImportAutoSplit(textLines)); + } + + private void ButtonOkClick(object sender, EventArgs e) + { + DialogResult = SubtitleListview1.Items.Count > 0 ? DialogResult.OK : DialogResult.Cancel; + } + + private void ButtonCancelClick(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void CheckBoxRemoveLinesWithoutLettersOrNumbersCheckedChanged(object sender, EventArgs e) + { + GeneratePreview(); + } + + private void CheckBoxRemoveEmptyLinesCheckedChanged(object sender, EventArgs e) + { + GeneratePreview(); + } + + private void RadioButtonLineModeCheckedChanged(object sender, EventArgs e) + { + GeneratePreview(); + // textBoxLineBreak and its label are enabled if radioButtonLineMode is checked. + comboBoxLineBreak.Enabled = radioButtonLineMode.Checked; + labelLineBreak.Enabled = radioButtonLineMode.Checked; + } + + private void RadioButtonAutoSplitCheckedChanged(object sender, EventArgs e) + { + GeneratePreview(); + } + + private void TextBoxTextDragEnter(object sender, DragEventArgs e) + { + if (e.Data.GetDataPresent(DataFormats.FileDrop, false)) + { + e.Effect = DragDropEffects.All; + } + } + + private void TextBoxTextDragDrop(object sender, DragEventArgs e) + { + var files = (string[])e.Data.GetData(DataFormats.FileDrop); + if (files.Length == 1) + { + LoadTextFile(files[0]); + } + } + + private static string HtmlToPlainText(string html) + { + var stripFormattingRegex = new Regex(@"<[^>]*(>|$)", RegexOptions.Multiline); // match any character between '<' and '>', even when end tag is missing + var tagWhiteSpaceRegex = new Regex(@"(>|$)(\W|\n|\r)+<", RegexOptions.Multiline); // matches one or more (white space or line breaks) between '>' and '<' + + // Decode html specific characters + var text = WebUtility.HtmlDecode(html); + + // Remove tag whitespace/line breaks + text = tagWhiteSpaceRegex.Replace(text, "><"); + + // Find new lines + text = text.Replace("
", Environment.NewLine); + text = text.Replace("
", Environment.NewLine); + text = text.Replace("
", Environment.NewLine); + text = text.Replace("
", Environment.NewLine); + text = text.Replace("
", Environment.NewLine + Environment.NewLine); + text = text.Replace("
", Environment.NewLine + Environment.NewLine); + text = text.Replace("
", Environment.NewLine + Environment.NewLine); + text = text.Replace("
", Environment.NewLine + Environment.NewLine); + text = text.Replace("

", Environment.NewLine + Environment.NewLine); + text = text.Replace("

", Environment.NewLine + Environment.NewLine); + text = text.Replace(Environment.NewLine + Environment.NewLine + Environment.NewLine, Environment.NewLine + Environment.NewLine); + text = text.Replace(Environment.NewLine + Environment.NewLine + Environment.NewLine, Environment.NewLine + Environment.NewLine); + + text = stripFormattingRegex.Replace(text, string.Empty); + + return text; + } + + private static string GetAllText(string fileName) + { + try + { + var encoding = LanguageAutoDetect.GetEncodingFromFile(fileName); + var text = FileUtil.ReadAllTextShared(fileName, encoding); + if (fileName.EndsWith(".html", StringComparison.OrdinalIgnoreCase) || fileName.EndsWith(".htm", StringComparison.OrdinalIgnoreCase)) + { + text = HtmlToPlainText(text); + } + if (fileName.EndsWith(".rtf", StringComparison.OrdinalIgnoreCase)) + { + text = GetRtfString(fileName); + } + + return text; + } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + return string.Empty; + } + } + + private void LoadTextFile(string fileName) + { + textBoxText.Text = GetAllText(fileName); + SetVideoFileName(fileName); + Text = Configuration.Settings.Language.ImportText.Title + " - " + fileName; + GeneratePreview(); + } + + private void LoadTx3G(string fileName) + { + try + { + var sb = new StringBuilder(); + var sub = new Subtitle(); + new Tx3GTextOnly().LoadSubtitle(sub, null, fileName); + foreach (var paragraph in sub.Paragraphs) + { + sb.AppendLine(paragraph.Text); + sb.AppendLine(); + } + textBoxText.Text = sb.ToString(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + } + radioButtonSplitAtBlankLines.Checked = true; + checkBoxMergeShortLines.Checked = false; + GeneratePreview(); + } + + private void LoadRtf(string fileName) + { + try + { + labelStatus.Text = Configuration.Settings.Language.General.PleaseWait; + labelStatus.Refresh(); + textBoxText.Text = GetRtfString(fileName); + SetVideoFileName(fileName); + Text = Configuration.Settings.Language.ImportText.Title + " - " + fileName; + GeneratePreview(); + } + finally + { + labelStatus.Text = string.Empty; + } + } + + private static string GetRtfString(string fileName) + { + const int bomHeaderLength = 3; + var encoding = FileUtil.HasUtf8Bom(fileName) ? Encoding.UTF8 : Encoding.ASCII; + var bytes = FileUtil.ReadAllBytesShared(fileName); + var rtf = encoding.GetString(bytes); + if (Equals(encoding, Encoding.UTF8)) + { + rtf = encoding.GetString(bytes, bomHeaderLength, bytes.Length - bomHeaderLength); + } + + using (var rtb = new RichTextBox { Rtf = rtf }) + { + var sb = new StringBuilder(); + bool italicOn = false; + bool boldOn = false; + bool underlineOn = false; + for (int i = 0; i < rtb.TextLength; i++) + { + rtb.SelectionStart = i; + rtb.SelectionLength = 1; + if (rtb.SelectionFont.Italic && !italicOn) + { + sb.Append(""); + italicOn = true; + } + + if (rtb.SelectionFont.Bold && !boldOn) + { + sb.Append(""); + boldOn = true; + } + + if (rtb.SelectionFont.Underline && !underlineOn) + { + sb.Append(""); + underlineOn = true; + } + + if (!rtb.SelectionFont.Underline && underlineOn) + { + sb.Append(""); + underlineOn = false; + } + + if (!rtb.SelectionFont.Bold && boldOn) + { + sb.Append(""); + boldOn = false; + } + + if (!rtb.SelectionFont.Italic && italicOn) + { + sb.Append(""); + italicOn = false; + } + + sb.Append(rtb.SelectedText); + } + + if (underlineOn) + { + sb.Append("
"); + } + + if (boldOn) + { + sb.Append("
"); + } + + if (italicOn) + { + sb.Append("
"); + } + + return string.Join(Environment.NewLine, sb.ToString().SplitToLines()) + .Replace($" {Environment.NewLine}", Environment.NewLine) + .Replace(" ", " ") + .Replace(" ", " ") + .Replace(" ", " ") + .Replace($"{Environment.NewLine}", Environment.NewLine) + .Replace($"{Environment.NewLine}", Environment.NewLine) + .Replace($"{Environment.NewLine}", Environment.NewLine) + .Replace($"{Environment.NewLine}", Environment.NewLine) + .Replace($"{Environment.NewLine}", Environment.NewLine) + .Replace($"{Environment.NewLine}", Environment.NewLine) + .Replace($"{Environment.NewLine}", Environment.NewLine); + } + } + + private void LoadAdobeStory(string fileName) + { + try + { + var sb = new StringBuilder(); + var doc = new XmlDocument(); + doc.Load(fileName); + var nodes = doc.DocumentElement?.SelectNodes("//paragraph[@element='Dialog']"); + if (nodes != null) + { + foreach (XmlNode node in nodes) // + { + XmlNode textRun = node.SelectSingleNode("textRun"); // Yeah...I suppose + if (textRun != null) + { + sb.AppendLine(textRun.InnerText); + } + } + } + + textBoxText.Text = sb.ToString(); + VideoFileName = null; + Text = Configuration.Settings.Language.ImportText.Title + " - " + fileName; + } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + } + radioButtonLineMode.Checked = true; + checkBoxMergeShortLines.Checked = false; + GeneratePreview(); + } + + private bool LoadFinalDraftTemplate(string fileName, Form parentForm) + { + try + { + var fd = new FinalDraftTemplate2(); + var sub = new Subtitle(); + var lines = Encoding.UTF8.GetString(FileUtil.ReadAllBytesShared(fileName)).SplitToLines(); + var availableParagraphTypes = fd.GetParagraphTypes(lines); + using (var form = new ImportFinalDraft(availableParagraphTypes)) + { + if (form.ShowDialog(parentForm) == DialogResult.OK) + { + fd.ActiveParagraphTypes = form.ChosenParagraphTypes; + fd.LoadSubtitle(sub, lines, fileName); + } + else + { + return false; + } + } + + textBoxText.Text = sub.ToText(fd); + VideoFileName = null; + Text = Configuration.Settings.Language.ImportText.Title + " - " + fileName; + _subtitleInput = sub; + Format = new CsvNuendo(); + groupBoxSplitting.Enabled = false; + textBoxText.Enabled = false; + if (_subtitleInput.Paragraphs.Any(p => !string.IsNullOrEmpty(p.Actor))) + { + SubtitleListview1.ShowActorColumn(Configuration.Settings.Language.General.Character); + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + } + radioButtonLineMode.Checked = true; + checkBoxMergeShortLines.Checked = false; + GeneratePreview(); + return true; + } + + private void SetVideoFileName(string fileName) + { + VideoFileName = fileName.Substring(0, fileName.Length - Path.GetExtension(fileName).Length); + if (VideoFileName.EndsWith(".en", StringComparison.Ordinal)) + { + VideoFileName = VideoFileName.Remove(VideoFileName.Length - 3); + } + + foreach (var ext in Utilities.VideoFileExtensions) + { + if (File.Exists(VideoFileName + ext)) + { + VideoFileName += ext; + return; + } + } + + var dir = Path.GetDirectoryName(fileName); + if (dir != null) + { + foreach (var ext in Utilities.VideoFileExtensions) + { + var files = Directory.GetFiles(dir, Path.GetFileNameWithoutExtension(VideoFileName) + "*" + ext); + if (files.Length > 0) + { + VideoFileName = files[0]; + return; + } + } + VideoFileName = null; + } + } + + private void ButtonRefreshClick(object sender, EventArgs e) + { + GeneratePreview(); + } + + private void RadioButtonDurationFixedCheckedChanged(object sender, EventArgs e) + { + numericUpDownDurationFixed.Enabled = radioButtonDurationFixed.Checked; + GeneratePreview(); + } + + private void CheckBoxMergeShortLinesCheckedChanged(object sender, EventArgs e) + { + GeneratePreview(); + } + + private void ImportTextKeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + private void TextBoxTextTextChanged(object sender, EventArgs e) + { + GeneratePreview(); + } + + private void NumericUpDownDurationFixedValueChanged(object sender, EventArgs e) + { + GeneratePreview(); + } + + private void NumericUpDownGapBetweenLinesValueChanged(object sender, EventArgs e) + { + GeneratePreview(); + } + + private void RadioButtonDurationAutoCheckedChanged(object sender, EventArgs e) + { + GeneratePreview(); + } + + private void radioButtonSplitAtBlankLines_CheckedChanged(object sender, EventArgs e) + { + GeneratePreview(); + } + + private void checkBoxGenerateTimeCodes_CheckedChanged(object sender, EventArgs e) + { + groupBoxTimeCodes.Enabled = checkBoxGenerateTimeCodes.Checked; + GeneratePreview(); + } + + private void ImportText_FormClosing(object sender, FormClosingEventArgs e) + { + if (radioButtonSplitAtBlankLines.Checked) + { + Configuration.Settings.Tools.ImportTextSplitting = "blank lines"; + } + else if (radioButtonLineMode.Checked) + { + Configuration.Settings.Tools.ImportTextSplitting = "line"; + } + else + { + Configuration.Settings.Tools.ImportTextSplitting = "auto"; + } + + Configuration.Settings.Tools.ImportTextLineBreak = comboBoxLineBreak.Text.Trim(); + Configuration.Settings.Tools.ImportTextMergeShortLines = checkBoxMergeShortLines.Checked; + Configuration.Settings.Tools.ImportTextRemoveEmptyLines = checkBoxRemoveEmptyLines.Checked; + Configuration.Settings.Tools.ImportTextAutoSplitNumberOfLines = numericUpDownAutoSplitMaxLines.Value; + Configuration.Settings.Tools.ImportTextAutoSplitAtBlank = checkBoxAutoSplitAtBlankLines.Checked; + + if (radioButtonAutoSplit.Checked) + { + Configuration.Settings.Tools.ImportTextRemoveLinesNoLetters = checkBoxAutoSplitRemoveLinesNoLetters.Checked; + } + else + { + Configuration.Settings.Tools.ImportTextRemoveLinesNoLetters = checkBoxRemoveLinesWithoutLetters.Checked; + } + + Configuration.Settings.Tools.ImportTextGenerateTimeCodes = checkBoxGenerateTimeCodes.Checked; + Configuration.Settings.Tools.ImportTextTakeTimeCodeFromFileName = checkBoxTakeTimeFromFileNames.Checked; + Configuration.Settings.Tools.ImportTextAutoBreak = checkBoxAutoBreak.Checked; + Configuration.Settings.Tools.ImportTextAutoBreakAtEnd = checkBoxAutoSplitAtEnd.Checked; + Configuration.Settings.Tools.ImportTextAutoBreakAtEndMarkerText = textBoxAsEnd.Text.Replace(" ", string.Empty); + Configuration.Settings.Tools.ImportTextGap = numericUpDownGapBetweenLines.Value; + Configuration.Settings.Tools.ImportTextDurationAuto = radioButtonDurationAuto.Checked; + Configuration.Settings.Tools.ImportTextFixedDuration = numericUpDownDurationFixed.Value; + } + + private void checkBoxMultipleFiles_CheckedChanged(object sender, EventArgs e) + { + Format = null; + textBoxText.Enabled = true; + groupBoxSplitting.Enabled = true; + if (checkBoxMultipleFiles.Checked) + { + listViewInputFiles.Visible = true; + textBoxText.Visible = false; + buttonOpenText.Text = Configuration.Settings.Language.ImportText.OpenTextFiles; + groupBoxSplitting.Enabled = false; + checkBoxTakeTimeFromFileNames.Visible = true; + } + else + { + listViewInputFiles.Visible = false; + textBoxText.Visible = true; + buttonOpenText.Text = Configuration.Settings.Language.ImportText.OpenTextFile; + groupBoxSplitting.Enabled = true; + checkBoxTakeTimeFromFileNames.Visible = false; + } + GeneratePreview(); + } + + private void listViewInputFiles_DragEnter(object sender, DragEventArgs e) + { + if (e.Data.GetDataPresent(DataFormats.FileDrop, false)) + { + e.Effect = DragDropEffects.All; + } + } + + private void listViewInputFiles_DragDrop(object sender, DragEventArgs e) + { + var fileNames = (string[])e.Data.GetData(DataFormats.FileDrop); + foreach (string fileName in fileNames.OrderBy(p => p)) + { + AddInputFile(fileName); + } + GeneratePreview(); + } + + private void AddInputFile(string fileName) + { + try + { + var fi = new FileInfo(fileName); + var item = new ListViewItem(fileName) { Tag = fileName }; + item.SubItems.Add(Utilities.FormatBytesToDisplayFileSize(fi.Length)); + if (fi.Length < 1024 * 1024) // max 1 mb + { + listViewInputFiles.Items.Add(item); + } + } + catch + { + // ignored + } + } + + private void checkBoxAutoBreak_CheckedChanged(object sender, EventArgs e) + { + GeneratePreview(); + } + + private void comboBoxLineBreak_TextChanged(object sender, EventArgs e) + { + GeneratePreview(); + } + + private void clearToolStripMenuItem_Click(object sender, EventArgs e) + { + listViewInputFiles.Items.Clear(); + } + + private void ImportText_Shown(object sender, EventArgs e) + { + if (textBoxText.Visible && textBoxText.Text.Length > 20) + { + buttonOK.Focus(); + } + + if (_exit) + { + DialogResult = DialogResult.Cancel; + } + + var workingArea = Screen.FromControl(this).WorkingArea; + if (workingArea.Height < Height) + { + Height = Math.Max(workingArea.Height, MinimumSize.Height); + } + } + + private void startNumberingFromToolStripMenuItem_Click(object sender, EventArgs e) + { + using (var startNumberingFrom = new StartNumberingFrom()) + { + if (startNumberingFrom.ShowDialog(this) == DialogResult.OK) + { + _startFromNumber = startNumberingFrom.StartFromNumber; + FixedSubtitle.Renumber(startNumberingFrom.StartFromNumber); + SubtitleListview1.Fill(FixedSubtitle); + } + } + } + + private void numericUpDownAutoSplitMaxLines_ValueChanged(object sender, EventArgs e) + { + GeneratePreview(); + } + + private void textBoxAsEnd1_TextChanged(object sender, EventArgs e) + { + GeneratePreview(); + } + + private void checkBoxAutoSplitAtBlankLines_CheckedChanged(object sender, EventArgs e) + { + GeneratePreview(); + } + + private void checkBoxAutoSplitRemoveLinesNoLetters_CheckedChanged(object sender, EventArgs e) + { + GeneratePreview(); + } + + private void textBoxAsEnd1_KeyPress(object sender, KeyPressEventArgs e) + { + if (e.KeyChar == (char)Keys.Space || char.IsLetterOrDigit(e.KeyChar)) + { + e.Handled = true; + } + } + + private void numericUpDownSubtitleLineMaximumLength_ValueChanged(object sender, EventArgs e) + { + GeneratePreview(); + } + + private void comboBoxLineMode_SelectedIndexChanged(object sender, EventArgs e) + { + GeneratePreview(); + } + + private void checkBoxAutoSplitAtEnd_CheckedChanged(object sender, EventArgs e) + { + GeneratePreview(); + } + } } \ No newline at end of file diff --git a/src/Forms/ImportText.resx b/src/ui/Forms/ImportText.resx similarity index 98% rename from src/Forms/ImportText.resx rename to src/ui/Forms/ImportText.resx index a9db14b14..8da7d2fda 100644 --- a/src/Forms/ImportText.resx +++ b/src/ui/Forms/ImportText.resx @@ -1,129 +1,129 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 157, 17 - - - 350, 17 - - - 17, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 157, 17 + + + 350, 17 + + + 17, 17 + \ No newline at end of file diff --git a/src/Forms/ImportUnknownFormat.Designer.cs b/src/ui/Forms/ImportUnknownFormat.Designer.cs similarity index 98% rename from src/Forms/ImportUnknownFormat.Designer.cs rename to src/ui/Forms/ImportUnknownFormat.Designer.cs index cf6e001f8..4ddc2e755 100644 --- a/src/Forms/ImportUnknownFormat.Designer.cs +++ b/src/ui/Forms/ImportUnknownFormat.Designer.cs @@ -1,266 +1,266 @@ -namespace Nikse.SubtitleEdit.Forms -{ - partial class ImportUnknownFormat - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.groupBoxImportResult = new System.Windows.Forms.GroupBox(); - this.SubtitleListview1 = new Nikse.SubtitleEdit.Controls.SubtitleListView(); - this.groupBoxImportOptions = new System.Windows.Forms.GroupBox(); - this.groupBoxTimeCodes = new System.Windows.Forms.GroupBox(); - this.radioButton1 = new System.Windows.Forms.RadioButton(); - this.radioButtonMilliseconds = new System.Windows.Forms.RadioButton(); - this.radioButtonTimeCodeFrames = new System.Windows.Forms.RadioButton(); - this.buttonRefresh = new System.Windows.Forms.Button(); - this.groupBoxImportText = new System.Windows.Forms.GroupBox(); - this.textBoxText = new System.Windows.Forms.TextBox(); - this.buttonOpenText = new System.Windows.Forms.Button(); - this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); - this.groupBoxImportResult.SuspendLayout(); - this.groupBoxImportOptions.SuspendLayout(); - this.groupBoxTimeCodes.SuspendLayout(); - this.groupBoxImportText.SuspendLayout(); - this.SuspendLayout(); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(858, 603); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 9; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(777, 603); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 8; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // groupBoxImportResult - // - this.groupBoxImportResult.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxImportResult.Controls.Add(this.SubtitleListview1); - this.groupBoxImportResult.Location = new System.Drawing.Point(12, 369); - this.groupBoxImportResult.Name = "groupBoxImportResult"; - this.groupBoxImportResult.Size = new System.Drawing.Size(921, 228); - this.groupBoxImportResult.TabIndex = 7; - this.groupBoxImportResult.TabStop = false; - this.groupBoxImportResult.Text = "Preview"; - // - // SubtitleListview1 - // - this.SubtitleListview1.AllowColumnReorder = true; - this.SubtitleListview1.AllowDrop = true; - this.SubtitleListview1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.SubtitleListview1.FirstVisibleIndex = -1; - this.SubtitleListview1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.SubtitleListview1.FullRowSelect = true; - this.SubtitleListview1.GridLines = true; - this.SubtitleListview1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; - this.SubtitleListview1.HideSelection = false; - this.SubtitleListview1.Location = new System.Drawing.Point(6, 19); - this.SubtitleListview1.MultiSelect = false; - this.SubtitleListview1.Name = "SubtitleListview1"; - this.SubtitleListview1.OwnerDraw = true; - this.SubtitleListview1.Size = new System.Drawing.Size(909, 187); - this.SubtitleListview1.SubtitleFontBold = false; - this.SubtitleListview1.SubtitleFontName = "Tahoma"; - this.SubtitleListview1.SubtitleFontSize = 8; - this.SubtitleListview1.TabIndex = 0; - this.SubtitleListview1.UseCompatibleStateImageBehavior = false; - this.SubtitleListview1.UseSyntaxColoring = true; - this.SubtitleListview1.View = System.Windows.Forms.View.Details; - // - // groupBoxImportOptions - // - this.groupBoxImportOptions.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxImportOptions.Controls.Add(this.groupBoxTimeCodes); - this.groupBoxImportOptions.Controls.Add(this.buttonRefresh); - this.groupBoxImportOptions.Location = new System.Drawing.Point(586, 12); - this.groupBoxImportOptions.Name = "groupBoxImportOptions"; - this.groupBoxImportOptions.Size = new System.Drawing.Size(341, 351); - this.groupBoxImportOptions.TabIndex = 6; - this.groupBoxImportOptions.TabStop = false; - this.groupBoxImportOptions.Text = "Import options"; - // - // groupBoxTimeCodes - // - this.groupBoxTimeCodes.Controls.Add(this.radioButton1); - this.groupBoxTimeCodes.Controls.Add(this.radioButtonMilliseconds); - this.groupBoxTimeCodes.Controls.Add(this.radioButtonTimeCodeFrames); - this.groupBoxTimeCodes.Location = new System.Drawing.Point(6, 19); - this.groupBoxTimeCodes.Name = "groupBoxTimeCodes"; - this.groupBoxTimeCodes.Size = new System.Drawing.Size(329, 99); - this.groupBoxTimeCodes.TabIndex = 5; - this.groupBoxTimeCodes.TabStop = false; - this.groupBoxTimeCodes.Text = "Time codes"; - // - // radioButton1 - // - this.radioButton1.AutoSize = true; - this.radioButton1.Checked = true; - this.radioButton1.Location = new System.Drawing.Point(14, 65); - this.radioButton1.Name = "radioButton1"; - this.radioButton1.Size = new System.Drawing.Size(51, 17); - this.radioButton1.TabIndex = 5; - this.radioButton1.TabStop = true; - this.radioButton1.Text = "Other"; - this.radioButton1.UseVisualStyleBackColor = true; - // - // radioButtonMilliseconds - // - this.radioButtonMilliseconds.AutoSize = true; - this.radioButtonMilliseconds.Location = new System.Drawing.Point(14, 42); - this.radioButtonMilliseconds.Name = "radioButtonMilliseconds"; - this.radioButtonMilliseconds.Size = new System.Drawing.Size(82, 17); - this.radioButtonMilliseconds.TabIndex = 4; - this.radioButtonMilliseconds.Text = "Milliseconds"; - this.radioButtonMilliseconds.UseVisualStyleBackColor = true; - // - // radioButtonTimeCodeFrames - // - this.radioButtonTimeCodeFrames.AutoSize = true; - this.radioButtonTimeCodeFrames.Location = new System.Drawing.Point(14, 19); - this.radioButtonTimeCodeFrames.Name = "radioButtonTimeCodeFrames"; - this.radioButtonTimeCodeFrames.Size = new System.Drawing.Size(59, 17); - this.radioButtonTimeCodeFrames.TabIndex = 3; - this.radioButtonTimeCodeFrames.Text = "Frames"; - this.radioButtonTimeCodeFrames.UseVisualStyleBackColor = true; - // - // buttonRefresh - // - this.buttonRefresh.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonRefresh.Location = new System.Drawing.Point(6, 124); - this.buttonRefresh.Name = "buttonRefresh"; - this.buttonRefresh.Size = new System.Drawing.Size(102, 23); - this.buttonRefresh.TabIndex = 6; - this.buttonRefresh.Text = "Refresh"; - this.buttonRefresh.UseVisualStyleBackColor = true; - this.buttonRefresh.Click += new System.EventHandler(this.buttonRefresh_Click); - // - // groupBoxImportText - // - this.groupBoxImportText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxImportText.Controls.Add(this.textBoxText); - this.groupBoxImportText.Controls.Add(this.buttonOpenText); - this.groupBoxImportText.Location = new System.Drawing.Point(12, 12); - this.groupBoxImportText.Name = "groupBoxImportText"; - this.groupBoxImportText.Size = new System.Drawing.Size(568, 351); - this.groupBoxImportText.TabIndex = 5; - this.groupBoxImportText.TabStop = false; - this.groupBoxImportText.Text = "Import text"; - // - // textBoxText - // - this.textBoxText.AllowDrop = true; - this.textBoxText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.textBoxText.Location = new System.Drawing.Point(6, 42); - this.textBoxText.MaxLength = 0; - this.textBoxText.Multiline = true; - this.textBoxText.Name = "textBoxText"; - this.textBoxText.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.textBoxText.Size = new System.Drawing.Size(556, 303); - this.textBoxText.TabIndex = 1; - // - // buttonOpenText - // - this.buttonOpenText.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOpenText.Location = new System.Drawing.Point(419, 15); - this.buttonOpenText.Name = "buttonOpenText"; - this.buttonOpenText.Size = new System.Drawing.Size(143, 23); - this.buttonOpenText.TabIndex = 0; - this.buttonOpenText.Text = "Open file..."; - this.buttonOpenText.UseVisualStyleBackColor = true; - this.buttonOpenText.Click += new System.EventHandler(this.buttonOpenText_Click); - // - // openFileDialog1 - // - this.openFileDialog1.FileName = "openFileDialog1"; - // - // ImportUnknownFormat - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(945, 636); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.groupBoxImportResult); - this.Controls.Add(this.groupBoxImportOptions); - this.Controls.Add(this.groupBoxImportText); - this.KeyPreview = true; - this.MinimumSize = new System.Drawing.Size(900, 600); - this.Name = "ImportUnknownFormat"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "ImportUnknownFormat"; - this.groupBoxImportResult.ResumeLayout(false); - this.groupBoxImportOptions.ResumeLayout(false); - this.groupBoxTimeCodes.ResumeLayout(false); - this.groupBoxTimeCodes.PerformLayout(); - this.groupBoxImportText.ResumeLayout(false); - this.groupBoxImportText.PerformLayout(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.GroupBox groupBoxImportResult; - private Controls.SubtitleListView SubtitleListview1; - private System.Windows.Forms.GroupBox groupBoxImportOptions; - private System.Windows.Forms.GroupBox groupBoxTimeCodes; - private System.Windows.Forms.Button buttonRefresh; - private System.Windows.Forms.GroupBox groupBoxImportText; - private System.Windows.Forms.TextBox textBoxText; - private System.Windows.Forms.Button buttonOpenText; - private System.Windows.Forms.RadioButton radioButtonTimeCodeFrames; - private System.Windows.Forms.OpenFileDialog openFileDialog1; - private System.Windows.Forms.RadioButton radioButton1; - private System.Windows.Forms.RadioButton radioButtonMilliseconds; - } +namespace Nikse.SubtitleEdit.Forms +{ + partial class ImportUnknownFormat + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.groupBoxImportResult = new System.Windows.Forms.GroupBox(); + this.SubtitleListview1 = new Nikse.SubtitleEdit.Controls.SubtitleListView(); + this.groupBoxImportOptions = new System.Windows.Forms.GroupBox(); + this.groupBoxTimeCodes = new System.Windows.Forms.GroupBox(); + this.radioButton1 = new System.Windows.Forms.RadioButton(); + this.radioButtonMilliseconds = new System.Windows.Forms.RadioButton(); + this.radioButtonTimeCodeFrames = new System.Windows.Forms.RadioButton(); + this.buttonRefresh = new System.Windows.Forms.Button(); + this.groupBoxImportText = new System.Windows.Forms.GroupBox(); + this.textBoxText = new System.Windows.Forms.TextBox(); + this.buttonOpenText = new System.Windows.Forms.Button(); + this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); + this.groupBoxImportResult.SuspendLayout(); + this.groupBoxImportOptions.SuspendLayout(); + this.groupBoxTimeCodes.SuspendLayout(); + this.groupBoxImportText.SuspendLayout(); + this.SuspendLayout(); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(858, 603); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 9; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(777, 603); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 8; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // groupBoxImportResult + // + this.groupBoxImportResult.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxImportResult.Controls.Add(this.SubtitleListview1); + this.groupBoxImportResult.Location = new System.Drawing.Point(12, 369); + this.groupBoxImportResult.Name = "groupBoxImportResult"; + this.groupBoxImportResult.Size = new System.Drawing.Size(921, 228); + this.groupBoxImportResult.TabIndex = 7; + this.groupBoxImportResult.TabStop = false; + this.groupBoxImportResult.Text = "Preview"; + // + // SubtitleListview1 + // + this.SubtitleListview1.AllowColumnReorder = true; + this.SubtitleListview1.AllowDrop = true; + this.SubtitleListview1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.SubtitleListview1.FirstVisibleIndex = -1; + this.SubtitleListview1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.SubtitleListview1.FullRowSelect = true; + this.SubtitleListview1.GridLines = true; + this.SubtitleListview1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.SubtitleListview1.HideSelection = false; + this.SubtitleListview1.Location = new System.Drawing.Point(6, 19); + this.SubtitleListview1.MultiSelect = false; + this.SubtitleListview1.Name = "SubtitleListview1"; + this.SubtitleListview1.OwnerDraw = true; + this.SubtitleListview1.Size = new System.Drawing.Size(909, 187); + this.SubtitleListview1.SubtitleFontBold = false; + this.SubtitleListview1.SubtitleFontName = "Tahoma"; + this.SubtitleListview1.SubtitleFontSize = 8; + this.SubtitleListview1.TabIndex = 0; + this.SubtitleListview1.UseCompatibleStateImageBehavior = false; + this.SubtitleListview1.UseSyntaxColoring = true; + this.SubtitleListview1.View = System.Windows.Forms.View.Details; + // + // groupBoxImportOptions + // + this.groupBoxImportOptions.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxImportOptions.Controls.Add(this.groupBoxTimeCodes); + this.groupBoxImportOptions.Controls.Add(this.buttonRefresh); + this.groupBoxImportOptions.Location = new System.Drawing.Point(586, 12); + this.groupBoxImportOptions.Name = "groupBoxImportOptions"; + this.groupBoxImportOptions.Size = new System.Drawing.Size(341, 351); + this.groupBoxImportOptions.TabIndex = 6; + this.groupBoxImportOptions.TabStop = false; + this.groupBoxImportOptions.Text = "Import options"; + // + // groupBoxTimeCodes + // + this.groupBoxTimeCodes.Controls.Add(this.radioButton1); + this.groupBoxTimeCodes.Controls.Add(this.radioButtonMilliseconds); + this.groupBoxTimeCodes.Controls.Add(this.radioButtonTimeCodeFrames); + this.groupBoxTimeCodes.Location = new System.Drawing.Point(6, 19); + this.groupBoxTimeCodes.Name = "groupBoxTimeCodes"; + this.groupBoxTimeCodes.Size = new System.Drawing.Size(329, 99); + this.groupBoxTimeCodes.TabIndex = 5; + this.groupBoxTimeCodes.TabStop = false; + this.groupBoxTimeCodes.Text = "Time codes"; + // + // radioButton1 + // + this.radioButton1.AutoSize = true; + this.radioButton1.Checked = true; + this.radioButton1.Location = new System.Drawing.Point(14, 65); + this.radioButton1.Name = "radioButton1"; + this.radioButton1.Size = new System.Drawing.Size(51, 17); + this.radioButton1.TabIndex = 5; + this.radioButton1.TabStop = true; + this.radioButton1.Text = "Other"; + this.radioButton1.UseVisualStyleBackColor = true; + // + // radioButtonMilliseconds + // + this.radioButtonMilliseconds.AutoSize = true; + this.radioButtonMilliseconds.Location = new System.Drawing.Point(14, 42); + this.radioButtonMilliseconds.Name = "radioButtonMilliseconds"; + this.radioButtonMilliseconds.Size = new System.Drawing.Size(82, 17); + this.radioButtonMilliseconds.TabIndex = 4; + this.radioButtonMilliseconds.Text = "Milliseconds"; + this.radioButtonMilliseconds.UseVisualStyleBackColor = true; + // + // radioButtonTimeCodeFrames + // + this.radioButtonTimeCodeFrames.AutoSize = true; + this.radioButtonTimeCodeFrames.Location = new System.Drawing.Point(14, 19); + this.radioButtonTimeCodeFrames.Name = "radioButtonTimeCodeFrames"; + this.radioButtonTimeCodeFrames.Size = new System.Drawing.Size(59, 17); + this.radioButtonTimeCodeFrames.TabIndex = 3; + this.radioButtonTimeCodeFrames.Text = "Frames"; + this.radioButtonTimeCodeFrames.UseVisualStyleBackColor = true; + // + // buttonRefresh + // + this.buttonRefresh.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.buttonRefresh.Location = new System.Drawing.Point(6, 124); + this.buttonRefresh.Name = "buttonRefresh"; + this.buttonRefresh.Size = new System.Drawing.Size(102, 23); + this.buttonRefresh.TabIndex = 6; + this.buttonRefresh.Text = "Refresh"; + this.buttonRefresh.UseVisualStyleBackColor = true; + this.buttonRefresh.Click += new System.EventHandler(this.buttonRefresh_Click); + // + // groupBoxImportText + // + this.groupBoxImportText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxImportText.Controls.Add(this.textBoxText); + this.groupBoxImportText.Controls.Add(this.buttonOpenText); + this.groupBoxImportText.Location = new System.Drawing.Point(12, 12); + this.groupBoxImportText.Name = "groupBoxImportText"; + this.groupBoxImportText.Size = new System.Drawing.Size(568, 351); + this.groupBoxImportText.TabIndex = 5; + this.groupBoxImportText.TabStop = false; + this.groupBoxImportText.Text = "Import text"; + // + // textBoxText + // + this.textBoxText.AllowDrop = true; + this.textBoxText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxText.Location = new System.Drawing.Point(6, 42); + this.textBoxText.MaxLength = 0; + this.textBoxText.Multiline = true; + this.textBoxText.Name = "textBoxText"; + this.textBoxText.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.textBoxText.Size = new System.Drawing.Size(556, 303); + this.textBoxText.TabIndex = 1; + // + // buttonOpenText + // + this.buttonOpenText.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOpenText.Location = new System.Drawing.Point(419, 15); + this.buttonOpenText.Name = "buttonOpenText"; + this.buttonOpenText.Size = new System.Drawing.Size(143, 23); + this.buttonOpenText.TabIndex = 0; + this.buttonOpenText.Text = "Open file..."; + this.buttonOpenText.UseVisualStyleBackColor = true; + this.buttonOpenText.Click += new System.EventHandler(this.buttonOpenText_Click); + // + // openFileDialog1 + // + this.openFileDialog1.FileName = "openFileDialog1"; + // + // ImportUnknownFormat + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(945, 636); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.groupBoxImportResult); + this.Controls.Add(this.groupBoxImportOptions); + this.Controls.Add(this.groupBoxImportText); + this.KeyPreview = true; + this.MinimumSize = new System.Drawing.Size(900, 600); + this.Name = "ImportUnknownFormat"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "ImportUnknownFormat"; + this.groupBoxImportResult.ResumeLayout(false); + this.groupBoxImportOptions.ResumeLayout(false); + this.groupBoxTimeCodes.ResumeLayout(false); + this.groupBoxTimeCodes.PerformLayout(); + this.groupBoxImportText.ResumeLayout(false); + this.groupBoxImportText.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.GroupBox groupBoxImportResult; + private Controls.SubtitleListView SubtitleListview1; + private System.Windows.Forms.GroupBox groupBoxImportOptions; + private System.Windows.Forms.GroupBox groupBoxTimeCodes; + private System.Windows.Forms.Button buttonRefresh; + private System.Windows.Forms.GroupBox groupBoxImportText; + private System.Windows.Forms.TextBox textBoxText; + private System.Windows.Forms.Button buttonOpenText; + private System.Windows.Forms.RadioButton radioButtonTimeCodeFrames; + private System.Windows.Forms.OpenFileDialog openFileDialog1; + private System.Windows.Forms.RadioButton radioButton1; + private System.Windows.Forms.RadioButton radioButtonMilliseconds; + } } \ No newline at end of file diff --git a/src/Forms/ImportUnknownFormat.cs b/src/ui/Forms/ImportUnknownFormat.cs similarity index 97% rename from src/Forms/ImportUnknownFormat.cs rename to src/ui/Forms/ImportUnknownFormat.cs index 4f85cc80d..abfe3060c 100644 --- a/src/Forms/ImportUnknownFormat.cs +++ b/src/ui/Forms/ImportUnknownFormat.cs @@ -1,116 +1,116 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.IO; -using System.Linq; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public partial class ImportUnknownFormat : Form - { - public Subtitle ImportedSubitle { get; private set; } - private readonly Timer _refreshTimer = new Timer(); - - public ImportUnknownFormat(string fileName) - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - _refreshTimer.Interval = 400; - _refreshTimer.Tick += RefreshTimerTick; - - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - SubtitleListview1.InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings); - UiUtil.InitializeSubtitleFont(SubtitleListview1); - SubtitleListview1.AutoSizeAllColumns(this); - - if (!string.IsNullOrEmpty(fileName)) - { - LoadTextFile(fileName); - GeneratePreview(); - } - } - - private void GeneratePreview() - { - if (_refreshTimer.Enabled) - { - _refreshTimer.Stop(); - } - - _refreshTimer.Start(); - } - - private void GeneratePreviewReal() - { - var uknownFormatImporter = new UnknownFormatImporter { UseFrames = radioButtonTimeCodeFrames.Checked }; - ImportedSubitle = uknownFormatImporter.AutoGuessImport(textBoxText.Lines.ToList()); - groupBoxImportResult.Text = string.Format(Configuration.Settings.Language.ImportText.PreviewLinesModifiedX, ImportedSubitle.Paragraphs.Count); - SubtitleListview1.Fill(ImportedSubitle); - if (ImportedSubitle.Paragraphs.Count > 0) - { - SubtitleListview1.SelectIndexAndEnsureVisible(0); - } - } - - private void RefreshTimerTick(object sender, EventArgs e) - { - _refreshTimer.Stop(); - GeneratePreviewReal(); - } - - private void LoadTextFile(string fileName) - { - try - { - SubtitleListview1.Items.Clear(); - var encoding = LanguageAutoDetect.GetEncodingFromFile(fileName); - textBoxText.Text = File.ReadAllText(fileName, encoding); - - // check for RTF file - if (fileName.EndsWith(".rtf", StringComparison.OrdinalIgnoreCase) && !textBoxText.Text.TrimStart().StartsWith("{\\rtf", StringComparison.Ordinal)) - { - using (var rtb = new RichTextBox()) - { - rtb.Rtf = textBoxText.Text; - textBoxText.Text = rtb.Text; - } - } - } - catch (Exception ex) - { - MessageBox.Show(ex.Message); - } - } - - private void buttonOpenText_Click(object sender, EventArgs e) - { - openFileDialog1.Title = buttonOpenText.Text; - openFileDialog1.Filter = Configuration.Settings.Language.ImportText.TextFiles + "|*.txt|" + Configuration.Settings.Language.General.AllFiles + "|*.*"; - openFileDialog1.FileName = string.Empty; - if (openFileDialog1.ShowDialog() == DialogResult.OK) - { - LoadTextFile(openFileDialog1.FileName); - } - GeneratePreview(); - } - - private void buttonRefresh_Click(object sender, EventArgs e) - { - GeneratePreviewReal(); - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private void buttonOK_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.OK; - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.IO; +using System.Linq; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public partial class ImportUnknownFormat : Form + { + public Subtitle ImportedSubitle { get; private set; } + private readonly Timer _refreshTimer = new Timer(); + + public ImportUnknownFormat(string fileName) + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + _refreshTimer.Interval = 400; + _refreshTimer.Tick += RefreshTimerTick; + + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + SubtitleListview1.InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings); + UiUtil.InitializeSubtitleFont(SubtitleListview1); + SubtitleListview1.AutoSizeAllColumns(this); + + if (!string.IsNullOrEmpty(fileName)) + { + LoadTextFile(fileName); + GeneratePreview(); + } + } + + private void GeneratePreview() + { + if (_refreshTimer.Enabled) + { + _refreshTimer.Stop(); + } + + _refreshTimer.Start(); + } + + private void GeneratePreviewReal() + { + var uknownFormatImporter = new UnknownFormatImporter { UseFrames = radioButtonTimeCodeFrames.Checked }; + ImportedSubitle = uknownFormatImporter.AutoGuessImport(textBoxText.Lines.ToList()); + groupBoxImportResult.Text = string.Format(Configuration.Settings.Language.ImportText.PreviewLinesModifiedX, ImportedSubitle.Paragraphs.Count); + SubtitleListview1.Fill(ImportedSubitle); + if (ImportedSubitle.Paragraphs.Count > 0) + { + SubtitleListview1.SelectIndexAndEnsureVisible(0); + } + } + + private void RefreshTimerTick(object sender, EventArgs e) + { + _refreshTimer.Stop(); + GeneratePreviewReal(); + } + + private void LoadTextFile(string fileName) + { + try + { + SubtitleListview1.Items.Clear(); + var encoding = LanguageAutoDetect.GetEncodingFromFile(fileName); + textBoxText.Text = File.ReadAllText(fileName, encoding); + + // check for RTF file + if (fileName.EndsWith(".rtf", StringComparison.OrdinalIgnoreCase) && !textBoxText.Text.TrimStart().StartsWith("{\\rtf", StringComparison.Ordinal)) + { + using (var rtb = new RichTextBox()) + { + rtb.Rtf = textBoxText.Text; + textBoxText.Text = rtb.Text; + } + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + } + } + + private void buttonOpenText_Click(object sender, EventArgs e) + { + openFileDialog1.Title = buttonOpenText.Text; + openFileDialog1.Filter = Configuration.Settings.Language.ImportText.TextFiles + "|*.txt|" + Configuration.Settings.Language.General.AllFiles + "|*.*"; + openFileDialog1.FileName = string.Empty; + if (openFileDialog1.ShowDialog() == DialogResult.OK) + { + LoadTextFile(openFileDialog1.FileName); + } + GeneratePreview(); + } + + private void buttonRefresh_Click(object sender, EventArgs e) + { + GeneratePreviewReal(); + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void buttonOK_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.OK; + } + } +} diff --git a/src/Forms/ImportUnknownFormat.resx b/src/ui/Forms/ImportUnknownFormat.resx similarity index 97% rename from src/Forms/ImportUnknownFormat.resx rename to src/ui/Forms/ImportUnknownFormat.resx index 3a7d67153..9bad2f599 100644 --- a/src/Forms/ImportUnknownFormat.resx +++ b/src/ui/Forms/ImportUnknownFormat.resx @@ -1,123 +1,123 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + \ No newline at end of file diff --git a/src/Forms/Interjections.Designer.cs b/src/ui/Forms/Interjections.Designer.cs similarity index 97% rename from src/Forms/Interjections.Designer.cs rename to src/ui/Forms/Interjections.Designer.cs index 9ac78a074..6f4c36527 100644 --- a/src/Forms/Interjections.Designer.cs +++ b/src/ui/Forms/Interjections.Designer.cs @@ -1,147 +1,147 @@ -namespace Nikse.SubtitleEdit.Forms -{ - partial class Interjections - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.groupBoxNamesIgonoreLists = new System.Windows.Forms.GroupBox(); - this.buttonRemove = new System.Windows.Forms.Button(); - this.listBoxInterjections = new System.Windows.Forms.ListBox(); - this.textBoxInterjection = new System.Windows.Forms.TextBox(); - this.buttonAdd = new System.Windows.Forms.Button(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.groupBoxNamesIgonoreLists.SuspendLayout(); - this.SuspendLayout(); - // - // groupBoxNamesIgonoreLists - // - this.groupBoxNamesIgonoreLists.Controls.Add(this.buttonRemove); - this.groupBoxNamesIgonoreLists.Controls.Add(this.listBoxInterjections); - this.groupBoxNamesIgonoreLists.Controls.Add(this.textBoxInterjection); - this.groupBoxNamesIgonoreLists.Controls.Add(this.buttonAdd); - this.groupBoxNamesIgonoreLists.Location = new System.Drawing.Point(12, 12); - this.groupBoxNamesIgonoreLists.Name = "groupBoxNamesIgonoreLists"; - this.groupBoxNamesIgonoreLists.Size = new System.Drawing.Size(241, 250); - this.groupBoxNamesIgonoreLists.TabIndex = 3; - this.groupBoxNamesIgonoreLists.TabStop = false; - // - // buttonRemove - // - this.buttonRemove.Enabled = false; - this.buttonRemove.Location = new System.Drawing.Point(159, 16); - this.buttonRemove.Name = "buttonRemove"; - this.buttonRemove.Size = new System.Drawing.Size(75, 23); - this.buttonRemove.TabIndex = 22; - this.buttonRemove.Text = "Remove"; - this.buttonRemove.UseVisualStyleBackColor = true; - this.buttonRemove.Click += new System.EventHandler(this.buttonRemove_Click); - // - // listBoxInterjections - // - this.listBoxInterjections.FormattingEnabled = true; - this.listBoxInterjections.Location = new System.Drawing.Point(3, 16); - this.listBoxInterjections.Name = "listBoxInterjections"; - this.listBoxInterjections.Size = new System.Drawing.Size(150, 199); - this.listBoxInterjections.TabIndex = 20; - this.listBoxInterjections.SelectedIndexChanged += new System.EventHandler(this.listBoxInterjections_SelectedIndexChanged); - // - // textBoxInterjection - // - this.textBoxInterjection.Location = new System.Drawing.Point(2, 220); - this.textBoxInterjection.Name = "textBoxInterjection"; - this.textBoxInterjection.Size = new System.Drawing.Size(151, 20); - this.textBoxInterjection.TabIndex = 24; - this.textBoxInterjection.TextChanged += new System.EventHandler(this.textBoxInterjection_TextChanged); - this.textBoxInterjection.KeyDown += new System.Windows.Forms.KeyEventHandler(this.textBoxInterjection_KeyDown); - // - // buttonAdd - // - this.buttonAdd.Enabled = false; - this.buttonAdd.Location = new System.Drawing.Point(159, 219); - this.buttonAdd.Name = "buttonAdd"; - this.buttonAdd.Size = new System.Drawing.Size(75, 23); - this.buttonAdd.TabIndex = 26; - this.buttonAdd.Text = "Add"; - this.buttonAdd.UseVisualStyleBackColor = true; - this.buttonAdd.Click += new System.EventHandler(this.buttonAdd_Click); - // - // buttonCancel - // - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.Location = new System.Drawing.Point(178, 281); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 5; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - // - // buttonOK - // - this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; - this.buttonOK.Location = new System.Drawing.Point(99, 281); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 4; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - // - // Interjections - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(268, 315); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.groupBoxNamesIgonoreLists); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "Interjections"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Interjections"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Interjections_KeyDown); - this.groupBoxNamesIgonoreLists.ResumeLayout(false); - this.groupBoxNamesIgonoreLists.PerformLayout(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.GroupBox groupBoxNamesIgonoreLists; - private System.Windows.Forms.Button buttonRemove; - private System.Windows.Forms.ListBox listBoxInterjections; - private System.Windows.Forms.TextBox textBoxInterjection; - private System.Windows.Forms.Button buttonAdd; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonOK; - } +namespace Nikse.SubtitleEdit.Forms +{ + partial class Interjections + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.groupBoxNamesIgonoreLists = new System.Windows.Forms.GroupBox(); + this.buttonRemove = new System.Windows.Forms.Button(); + this.listBoxInterjections = new System.Windows.Forms.ListBox(); + this.textBoxInterjection = new System.Windows.Forms.TextBox(); + this.buttonAdd = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.groupBoxNamesIgonoreLists.SuspendLayout(); + this.SuspendLayout(); + // + // groupBoxNamesIgonoreLists + // + this.groupBoxNamesIgonoreLists.Controls.Add(this.buttonRemove); + this.groupBoxNamesIgonoreLists.Controls.Add(this.listBoxInterjections); + this.groupBoxNamesIgonoreLists.Controls.Add(this.textBoxInterjection); + this.groupBoxNamesIgonoreLists.Controls.Add(this.buttonAdd); + this.groupBoxNamesIgonoreLists.Location = new System.Drawing.Point(12, 12); + this.groupBoxNamesIgonoreLists.Name = "groupBoxNamesIgonoreLists"; + this.groupBoxNamesIgonoreLists.Size = new System.Drawing.Size(241, 250); + this.groupBoxNamesIgonoreLists.TabIndex = 3; + this.groupBoxNamesIgonoreLists.TabStop = false; + // + // buttonRemove + // + this.buttonRemove.Enabled = false; + this.buttonRemove.Location = new System.Drawing.Point(159, 16); + this.buttonRemove.Name = "buttonRemove"; + this.buttonRemove.Size = new System.Drawing.Size(75, 23); + this.buttonRemove.TabIndex = 22; + this.buttonRemove.Text = "Remove"; + this.buttonRemove.UseVisualStyleBackColor = true; + this.buttonRemove.Click += new System.EventHandler(this.buttonRemove_Click); + // + // listBoxInterjections + // + this.listBoxInterjections.FormattingEnabled = true; + this.listBoxInterjections.Location = new System.Drawing.Point(3, 16); + this.listBoxInterjections.Name = "listBoxInterjections"; + this.listBoxInterjections.Size = new System.Drawing.Size(150, 199); + this.listBoxInterjections.TabIndex = 20; + this.listBoxInterjections.SelectedIndexChanged += new System.EventHandler(this.listBoxInterjections_SelectedIndexChanged); + // + // textBoxInterjection + // + this.textBoxInterjection.Location = new System.Drawing.Point(2, 220); + this.textBoxInterjection.Name = "textBoxInterjection"; + this.textBoxInterjection.Size = new System.Drawing.Size(151, 20); + this.textBoxInterjection.TabIndex = 24; + this.textBoxInterjection.TextChanged += new System.EventHandler(this.textBoxInterjection_TextChanged); + this.textBoxInterjection.KeyDown += new System.Windows.Forms.KeyEventHandler(this.textBoxInterjection_KeyDown); + // + // buttonAdd + // + this.buttonAdd.Enabled = false; + this.buttonAdd.Location = new System.Drawing.Point(159, 219); + this.buttonAdd.Name = "buttonAdd"; + this.buttonAdd.Size = new System.Drawing.Size(75, 23); + this.buttonAdd.TabIndex = 26; + this.buttonAdd.Text = "Add"; + this.buttonAdd.UseVisualStyleBackColor = true; + this.buttonAdd.Click += new System.EventHandler(this.buttonAdd_Click); + // + // buttonCancel + // + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.Location = new System.Drawing.Point(178, 281); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 5; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + // + // buttonOK + // + this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; + this.buttonOK.Location = new System.Drawing.Point(99, 281); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 4; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + // + // Interjections + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(268, 315); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.groupBoxNamesIgonoreLists); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "Interjections"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Interjections"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Interjections_KeyDown); + this.groupBoxNamesIgonoreLists.ResumeLayout(false); + this.groupBoxNamesIgonoreLists.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBoxNamesIgonoreLists; + private System.Windows.Forms.Button buttonRemove; + private System.Windows.Forms.ListBox listBoxInterjections; + private System.Windows.Forms.TextBox textBoxInterjection; + private System.Windows.Forms.Button buttonAdd; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + } } \ No newline at end of file diff --git a/src/Forms/Interjections.cs b/src/ui/Forms/Interjections.cs similarity index 97% rename from src/Forms/Interjections.cs rename to src/ui/Forms/Interjections.cs index d79f00d52..5ec6422e4 100644 --- a/src/Forms/Interjections.cs +++ b/src/ui/Forms/Interjections.cs @@ -1,159 +1,159 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Text; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class Interjections : Form - { - private List _interjections; - - public Interjections() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - } - - public string GetInterjectionsSemiColonSeparatedString() - { - var sb = new StringBuilder(); - foreach (string s in _interjections) - { - sb.Append(';'); - sb.Append(s.Trim()); - } - return sb.ToString().Trim(';'); - } - - private void Interjections_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - else if (e.KeyCode == UiUtil.HelpKeys) - { - Utilities.ShowHelp("#remove_text_for_hi"); - } - } - - public void Initialize(string semiColonSeparatedList) - { - _interjections = new List(); - string[] arr = semiColonSeparatedList.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries); - foreach (string s in arr) - { - _interjections.Add(s.Trim()); - } - FillListBox(); - Text = Configuration.Settings.Language.Interjections.Title; - - // Add to interjections (or general) - buttonRemove.Text = Configuration.Settings.Language.Settings.Remove; - buttonAdd.Text = Configuration.Settings.Language.MultipleReplace.Add; - - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - UiUtil.FixLargeFonts(this, buttonOK); - } - - private void buttonAdd_Click(object sender, EventArgs e) - { - string text = textBoxInterjection.Text.Trim(); - if (text.Length == 0) - { - return; - } - - if (!_interjections.Contains(text)) - { - _interjections.Add(text); - FillListBox(); - textBoxInterjection.Text = string.Empty; - textBoxInterjection.Focus(); - for (int i = 0; i < listBoxInterjections.Items.Count; i++) - { - if (listBoxInterjections.Items[i].ToString() == text) - { - listBoxInterjections.SelectedIndex = i; - int top = i - 5; - if (top < 0) - { - top = 0; - } - - listBoxInterjections.TopIndex = top; - break; - } - } - } - else - { - MessageBox.Show(Configuration.Settings.Language.Settings.WordAlreadyExists); - } - } - - private void FillListBox() - { - _interjections.Sort(); - listBoxInterjections.BeginUpdate(); - listBoxInterjections.Items.Clear(); - foreach (string s in _interjections) - { - listBoxInterjections.Items.Add(s); - } - listBoxInterjections.EndUpdate(); - } - - private void buttonRemove_Click(object sender, EventArgs e) - { - int index = listBoxInterjections.SelectedIndex; - string text = listBoxInterjections.Items[index].ToString(); - if (index >= 0) - { - if (MessageBox.Show(string.Format(Configuration.Settings.Language.Settings.RemoveX, text), null, MessageBoxButtons.YesNo) == DialogResult.Yes) - { - _interjections.Remove(text); - listBoxInterjections.Items.RemoveAt(index); - if (index < listBoxInterjections.Items.Count) - { - listBoxInterjections.SelectedIndex = index; - } - else if (listBoxInterjections.Items.Count > 0) - { - listBoxInterjections.SelectedIndex = index - 1; - } - - listBoxInterjections.Focus(); - - return; - } - MessageBox.Show(Configuration.Settings.Language.Settings.WordNotFound); - } - } - - private void listBoxInterjections_SelectedIndexChanged(object sender, EventArgs e) - { - buttonRemove.Enabled = listBoxInterjections.SelectedIndex >= 0; - } - - private void textBoxInterjection_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Enter) - { - buttonAdd_Click(null, null); - } - } - - private void textBoxInterjection_TextChanged(object sender, EventArgs e) - { - buttonAdd.Enabled = textBoxInterjection.Text.Trim().Length > 0; - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class Interjections : Form + { + private List _interjections; + + public Interjections() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + } + + public string GetInterjectionsSemiColonSeparatedString() + { + var sb = new StringBuilder(); + foreach (string s in _interjections) + { + sb.Append(';'); + sb.Append(s.Trim()); + } + return sb.ToString().Trim(';'); + } + + private void Interjections_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + else if (e.KeyCode == UiUtil.HelpKeys) + { + Utilities.ShowHelp("#remove_text_for_hi"); + } + } + + public void Initialize(string semiColonSeparatedList) + { + _interjections = new List(); + string[] arr = semiColonSeparatedList.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries); + foreach (string s in arr) + { + _interjections.Add(s.Trim()); + } + FillListBox(); + Text = Configuration.Settings.Language.Interjections.Title; + + // Add to interjections (or general) + buttonRemove.Text = Configuration.Settings.Language.Settings.Remove; + buttonAdd.Text = Configuration.Settings.Language.MultipleReplace.Add; + + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + UiUtil.FixLargeFonts(this, buttonOK); + } + + private void buttonAdd_Click(object sender, EventArgs e) + { + string text = textBoxInterjection.Text.Trim(); + if (text.Length == 0) + { + return; + } + + if (!_interjections.Contains(text)) + { + _interjections.Add(text); + FillListBox(); + textBoxInterjection.Text = string.Empty; + textBoxInterjection.Focus(); + for (int i = 0; i < listBoxInterjections.Items.Count; i++) + { + if (listBoxInterjections.Items[i].ToString() == text) + { + listBoxInterjections.SelectedIndex = i; + int top = i - 5; + if (top < 0) + { + top = 0; + } + + listBoxInterjections.TopIndex = top; + break; + } + } + } + else + { + MessageBox.Show(Configuration.Settings.Language.Settings.WordAlreadyExists); + } + } + + private void FillListBox() + { + _interjections.Sort(); + listBoxInterjections.BeginUpdate(); + listBoxInterjections.Items.Clear(); + foreach (string s in _interjections) + { + listBoxInterjections.Items.Add(s); + } + listBoxInterjections.EndUpdate(); + } + + private void buttonRemove_Click(object sender, EventArgs e) + { + int index = listBoxInterjections.SelectedIndex; + string text = listBoxInterjections.Items[index].ToString(); + if (index >= 0) + { + if (MessageBox.Show(string.Format(Configuration.Settings.Language.Settings.RemoveX, text), null, MessageBoxButtons.YesNo) == DialogResult.Yes) + { + _interjections.Remove(text); + listBoxInterjections.Items.RemoveAt(index); + if (index < listBoxInterjections.Items.Count) + { + listBoxInterjections.SelectedIndex = index; + } + else if (listBoxInterjections.Items.Count > 0) + { + listBoxInterjections.SelectedIndex = index - 1; + } + + listBoxInterjections.Focus(); + + return; + } + MessageBox.Show(Configuration.Settings.Language.Settings.WordNotFound); + } + } + + private void listBoxInterjections_SelectedIndexChanged(object sender, EventArgs e) + { + buttonRemove.Enabled = listBoxInterjections.SelectedIndex >= 0; + } + + private void textBoxInterjection_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + buttonAdd_Click(null, null); + } + } + + private void textBoxInterjection_TextChanged(object sender, EventArgs e) + { + buttonAdd.Enabled = textBoxInterjection.Text.Trim().Length > 0; + } + + } +} diff --git a/src/Forms/Ocr/GetTesseractDictionaries.resx b/src/ui/Forms/Interjections.resx similarity index 100% rename from src/Forms/Ocr/GetTesseractDictionaries.resx rename to src/ui/Forms/Interjections.resx diff --git a/src/Forms/JoinSubtitles.Designer.cs b/src/ui/Forms/JoinSubtitles.Designer.cs similarity index 98% rename from src/Forms/JoinSubtitles.Designer.cs rename to src/ui/Forms/JoinSubtitles.Designer.cs index c960e5ea2..c4a522b69 100644 --- a/src/Forms/JoinSubtitles.Designer.cs +++ b/src/ui/Forms/JoinSubtitles.Designer.cs @@ -1,284 +1,284 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class JoinSubtitles - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonJoin = new System.Windows.Forms.Button(); - this.listViewParts = new System.Windows.Forms.ListView(); - this.columnHeaderLines = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderStartTime = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderEndTime = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderFileName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.groupBoxPreview = new System.Windows.Forms.GroupBox(); - this.labelTotalLines = new System.Windows.Forms.Label(); - this.buttonClear = new System.Windows.Forms.Button(); - this.buttonRemoveFile = new System.Windows.Forms.Button(); - this.buttonAddFile = new System.Windows.Forms.Button(); - this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); - this.radioButtonJoinPlain = new System.Windows.Forms.RadioButton(); - this.numericUpDownAddMs = new System.Windows.Forms.NumericUpDown(); - this.radioButtonJoinAddTime = new System.Windows.Forms.RadioButton(); - this.labelAddTime = new System.Windows.Forms.Label(); - this.groupBoxPreview.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownAddMs)).BeginInit(); - this.SuspendLayout(); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(694, 385); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(90, 23); - this.buttonCancel.TabIndex = 45; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // buttonJoin - // - this.buttonJoin.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonJoin.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonJoin.Location = new System.Drawing.Point(573, 385); - this.buttonJoin.Name = "buttonJoin"; - this.buttonJoin.Size = new System.Drawing.Size(115, 23); - this.buttonJoin.TabIndex = 40; - this.buttonJoin.Text = "&Join"; - this.buttonJoin.UseVisualStyleBackColor = true; - this.buttonJoin.Click += new System.EventHandler(this.buttonSplit_Click); - // - // listViewParts - // - this.listViewParts.AllowDrop = true; - this.listViewParts.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.listViewParts.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeaderLines, - this.columnHeaderStartTime, - this.columnHeaderEndTime, - this.columnHeaderFileName}); - this.listViewParts.FullRowSelect = true; - this.listViewParts.HideSelection = false; - this.listViewParts.Location = new System.Drawing.Point(6, 19); - this.listViewParts.Name = "listViewParts"; - this.listViewParts.Size = new System.Drawing.Size(669, 273); - this.listViewParts.TabIndex = 101; - this.listViewParts.UseCompatibleStateImageBehavior = false; - this.listViewParts.View = System.Windows.Forms.View.Details; - this.listViewParts.DragDrop += new System.Windows.Forms.DragEventHandler(this.listViewParts_DragDrop); - this.listViewParts.DragEnter += new System.Windows.Forms.DragEventHandler(this.listViewParts_DragEnter); - // - // columnHeaderLines - // - this.columnHeaderLines.Text = "#Lines"; - this.columnHeaderLines.Width = 50; - // - // columnHeaderStartTime - // - this.columnHeaderStartTime.Text = "Start time"; - this.columnHeaderStartTime.Width = 75; - // - // columnHeaderEndTime - // - this.columnHeaderEndTime.Text = "End time"; - this.columnHeaderEndTime.Width = 75; - // - // columnHeaderFileName - // - this.columnHeaderFileName.Text = "File name"; - this.columnHeaderFileName.Width = 455; - // - // groupBoxPreview - // - this.groupBoxPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxPreview.Controls.Add(this.labelTotalLines); - this.groupBoxPreview.Controls.Add(this.buttonClear); - this.groupBoxPreview.Controls.Add(this.buttonRemoveFile); - this.groupBoxPreview.Controls.Add(this.buttonAddFile); - this.groupBoxPreview.Controls.Add(this.listViewParts); - this.groupBoxPreview.Location = new System.Drawing.Point(11, 12); - this.groupBoxPreview.Name = "groupBoxPreview"; - this.groupBoxPreview.Size = new System.Drawing.Size(773, 314); - this.groupBoxPreview.TabIndex = 27; - this.groupBoxPreview.TabStop = false; - this.groupBoxPreview.Text = "Add subtitles to join (drop also supported)"; - // - // labelTotalLines - // - this.labelTotalLines.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelTotalLines.AutoSize = true; - this.labelTotalLines.Location = new System.Drawing.Point(7, 295); - this.labelTotalLines.Name = "labelTotalLines"; - this.labelTotalLines.Size = new System.Drawing.Size(78, 13); - this.labelTotalLines.TabIndex = 105; - this.labelTotalLines.Text = "labelTotalLines"; - // - // buttonClear - // - this.buttonClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonClear.Location = new System.Drawing.Point(682, 73); - this.buttonClear.Name = "buttonClear"; - this.buttonClear.Size = new System.Drawing.Size(74, 23); - this.buttonClear.TabIndex = 104; - this.buttonClear.Text = "Clear"; - this.buttonClear.UseVisualStyleBackColor = true; - this.buttonClear.Click += new System.EventHandler(this.buttonClear_Click); - // - // buttonRemoveFile - // - this.buttonRemoveFile.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonRemoveFile.Location = new System.Drawing.Point(683, 46); - this.buttonRemoveFile.Name = "buttonRemoveFile"; - this.buttonRemoveFile.Size = new System.Drawing.Size(74, 23); - this.buttonRemoveFile.TabIndex = 103; - this.buttonRemoveFile.Text = "Remove"; - this.buttonRemoveFile.UseVisualStyleBackColor = true; - this.buttonRemoveFile.Click += new System.EventHandler(this.ButtonRemoveSubtitle_Click); - // - // buttonAddFile - // - this.buttonAddFile.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonAddFile.Location = new System.Drawing.Point(683, 19); - this.buttonAddFile.Name = "buttonAddFile"; - this.buttonAddFile.Size = new System.Drawing.Size(73, 23); - this.buttonAddFile.TabIndex = 102; - this.buttonAddFile.Text = "Add..."; - this.buttonAddFile.UseVisualStyleBackColor = true; - this.buttonAddFile.Click += new System.EventHandler(this.ButtonAddSubtitleClick); - // - // openFileDialog1 - // - this.openFileDialog1.FileName = "openFileDialog1"; - // - // radioButtonJoinPlain - // - this.radioButtonJoinPlain.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.radioButtonJoinPlain.AutoSize = true; - this.radioButtonJoinPlain.Location = new System.Drawing.Point(14, 334); - this.radioButtonJoinPlain.Name = "radioButtonJoinPlain"; - this.radioButtonJoinPlain.Size = new System.Drawing.Size(200, 17); - this.radioButtonJoinPlain.TabIndex = 30; - this.radioButtonJoinPlain.TabStop = true; - this.radioButtonJoinPlain.Text = "Files already have correct time codes"; - this.radioButtonJoinPlain.UseVisualStyleBackColor = true; - this.radioButtonJoinPlain.CheckedChanged += new System.EventHandler(this.RadioButtonJoinPlain_CheckedChanged); - // - // numericUpDownAddMs - // - this.numericUpDownAddMs.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.numericUpDownAddMs.Location = new System.Drawing.Point(385, 357); - this.numericUpDownAddMs.Maximum = new decimal(new int[] { - 100000, - 0, - 0, - 0}); - this.numericUpDownAddMs.Name = "numericUpDownAddMs"; - this.numericUpDownAddMs.Size = new System.Drawing.Size(60, 20); - this.numericUpDownAddMs.TabIndex = 34; - // - // radioButtonJoinAddTime - // - this.radioButtonJoinAddTime.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.radioButtonJoinAddTime.AutoSize = true; - this.radioButtonJoinAddTime.Location = new System.Drawing.Point(14, 357); - this.radioButtonJoinAddTime.Name = "radioButtonJoinAddTime"; - this.radioButtonJoinAddTime.Size = new System.Drawing.Size(161, 17); - this.radioButtonJoinAddTime.TabIndex = 32; - this.radioButtonJoinAddTime.TabStop = true; - this.radioButtonJoinAddTime.Text = "Add end time of previous file"; - this.radioButtonJoinAddTime.UseVisualStyleBackColor = true; - this.radioButtonJoinAddTime.CheckedChanged += new System.EventHandler(this.RadioButtonJoinAddTime_CheckedChanged); - // - // labelAddTime - // - this.labelAddTime.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelAddTime.AutoSize = true; - this.labelAddTime.Location = new System.Drawing.Point(227, 359); - this.labelAddTime.Name = "labelAddTime"; - this.labelAddTime.Size = new System.Drawing.Size(152, 13); - this.labelAddTime.TabIndex = 34; - this.labelAddTime.Text = "Add milliseconds after each file"; - // - // JoinSubtitles - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(796, 420); - this.Controls.Add(this.labelAddTime); - this.Controls.Add(this.radioButtonJoinAddTime); - this.Controls.Add(this.numericUpDownAddMs); - this.Controls.Add(this.radioButtonJoinPlain); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonJoin); - this.Controls.Add(this.groupBoxPreview); - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(640, 320); - this.Name = "JoinSubtitles"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Join subtitles"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.JoinSubtitles_FormClosing); - this.Shown += new System.EventHandler(this.JoinSubtitles_Shown); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.JoinSubtitles_KeyDown); - this.Resize += new System.EventHandler(this.JoinSubtitles_Resize); - this.groupBoxPreview.ResumeLayout(false); - this.groupBoxPreview.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownAddMs)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonJoin; - private System.Windows.Forms.ListView listViewParts; - private System.Windows.Forms.ColumnHeader columnHeaderLines; - private System.Windows.Forms.ColumnHeader columnHeaderStartTime; - private System.Windows.Forms.ColumnHeader columnHeaderFileName; - private System.Windows.Forms.GroupBox groupBoxPreview; - private System.Windows.Forms.Button buttonClear; - private System.Windows.Forms.Button buttonRemoveFile; - private System.Windows.Forms.Button buttonAddFile; - private System.Windows.Forms.ColumnHeader columnHeaderEndTime; - private System.Windows.Forms.OpenFileDialog openFileDialog1; - private System.Windows.Forms.Label labelTotalLines; - private System.Windows.Forms.RadioButton radioButtonJoinPlain; - private System.Windows.Forms.NumericUpDown numericUpDownAddMs; - private System.Windows.Forms.RadioButton radioButtonJoinAddTime; - private System.Windows.Forms.Label labelAddTime; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class JoinSubtitles + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonJoin = new System.Windows.Forms.Button(); + this.listViewParts = new System.Windows.Forms.ListView(); + this.columnHeaderLines = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderStartTime = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderEndTime = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderFileName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.groupBoxPreview = new System.Windows.Forms.GroupBox(); + this.labelTotalLines = new System.Windows.Forms.Label(); + this.buttonClear = new System.Windows.Forms.Button(); + this.buttonRemoveFile = new System.Windows.Forms.Button(); + this.buttonAddFile = new System.Windows.Forms.Button(); + this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); + this.radioButtonJoinPlain = new System.Windows.Forms.RadioButton(); + this.numericUpDownAddMs = new System.Windows.Forms.NumericUpDown(); + this.radioButtonJoinAddTime = new System.Windows.Forms.RadioButton(); + this.labelAddTime = new System.Windows.Forms.Label(); + this.groupBoxPreview.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownAddMs)).BeginInit(); + this.SuspendLayout(); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(694, 385); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(90, 23); + this.buttonCancel.TabIndex = 45; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // buttonJoin + // + this.buttonJoin.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonJoin.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonJoin.Location = new System.Drawing.Point(573, 385); + this.buttonJoin.Name = "buttonJoin"; + this.buttonJoin.Size = new System.Drawing.Size(115, 23); + this.buttonJoin.TabIndex = 40; + this.buttonJoin.Text = "&Join"; + this.buttonJoin.UseVisualStyleBackColor = true; + this.buttonJoin.Click += new System.EventHandler(this.buttonSplit_Click); + // + // listViewParts + // + this.listViewParts.AllowDrop = true; + this.listViewParts.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listViewParts.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeaderLines, + this.columnHeaderStartTime, + this.columnHeaderEndTime, + this.columnHeaderFileName}); + this.listViewParts.FullRowSelect = true; + this.listViewParts.HideSelection = false; + this.listViewParts.Location = new System.Drawing.Point(6, 19); + this.listViewParts.Name = "listViewParts"; + this.listViewParts.Size = new System.Drawing.Size(669, 273); + this.listViewParts.TabIndex = 101; + this.listViewParts.UseCompatibleStateImageBehavior = false; + this.listViewParts.View = System.Windows.Forms.View.Details; + this.listViewParts.DragDrop += new System.Windows.Forms.DragEventHandler(this.listViewParts_DragDrop); + this.listViewParts.DragEnter += new System.Windows.Forms.DragEventHandler(this.listViewParts_DragEnter); + // + // columnHeaderLines + // + this.columnHeaderLines.Text = "#Lines"; + this.columnHeaderLines.Width = 50; + // + // columnHeaderStartTime + // + this.columnHeaderStartTime.Text = "Start time"; + this.columnHeaderStartTime.Width = 75; + // + // columnHeaderEndTime + // + this.columnHeaderEndTime.Text = "End time"; + this.columnHeaderEndTime.Width = 75; + // + // columnHeaderFileName + // + this.columnHeaderFileName.Text = "File name"; + this.columnHeaderFileName.Width = 455; + // + // groupBoxPreview + // + this.groupBoxPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxPreview.Controls.Add(this.labelTotalLines); + this.groupBoxPreview.Controls.Add(this.buttonClear); + this.groupBoxPreview.Controls.Add(this.buttonRemoveFile); + this.groupBoxPreview.Controls.Add(this.buttonAddFile); + this.groupBoxPreview.Controls.Add(this.listViewParts); + this.groupBoxPreview.Location = new System.Drawing.Point(11, 12); + this.groupBoxPreview.Name = "groupBoxPreview"; + this.groupBoxPreview.Size = new System.Drawing.Size(773, 314); + this.groupBoxPreview.TabIndex = 27; + this.groupBoxPreview.TabStop = false; + this.groupBoxPreview.Text = "Add subtitles to join (drop also supported)"; + // + // labelTotalLines + // + this.labelTotalLines.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelTotalLines.AutoSize = true; + this.labelTotalLines.Location = new System.Drawing.Point(7, 295); + this.labelTotalLines.Name = "labelTotalLines"; + this.labelTotalLines.Size = new System.Drawing.Size(78, 13); + this.labelTotalLines.TabIndex = 105; + this.labelTotalLines.Text = "labelTotalLines"; + // + // buttonClear + // + this.buttonClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.buttonClear.Location = new System.Drawing.Point(682, 73); + this.buttonClear.Name = "buttonClear"; + this.buttonClear.Size = new System.Drawing.Size(74, 23); + this.buttonClear.TabIndex = 104; + this.buttonClear.Text = "Clear"; + this.buttonClear.UseVisualStyleBackColor = true; + this.buttonClear.Click += new System.EventHandler(this.buttonClear_Click); + // + // buttonRemoveFile + // + this.buttonRemoveFile.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.buttonRemoveFile.Location = new System.Drawing.Point(683, 46); + this.buttonRemoveFile.Name = "buttonRemoveFile"; + this.buttonRemoveFile.Size = new System.Drawing.Size(74, 23); + this.buttonRemoveFile.TabIndex = 103; + this.buttonRemoveFile.Text = "Remove"; + this.buttonRemoveFile.UseVisualStyleBackColor = true; + this.buttonRemoveFile.Click += new System.EventHandler(this.ButtonRemoveSubtitle_Click); + // + // buttonAddFile + // + this.buttonAddFile.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.buttonAddFile.Location = new System.Drawing.Point(683, 19); + this.buttonAddFile.Name = "buttonAddFile"; + this.buttonAddFile.Size = new System.Drawing.Size(73, 23); + this.buttonAddFile.TabIndex = 102; + this.buttonAddFile.Text = "Add..."; + this.buttonAddFile.UseVisualStyleBackColor = true; + this.buttonAddFile.Click += new System.EventHandler(this.ButtonAddSubtitleClick); + // + // openFileDialog1 + // + this.openFileDialog1.FileName = "openFileDialog1"; + // + // radioButtonJoinPlain + // + this.radioButtonJoinPlain.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.radioButtonJoinPlain.AutoSize = true; + this.radioButtonJoinPlain.Location = new System.Drawing.Point(14, 334); + this.radioButtonJoinPlain.Name = "radioButtonJoinPlain"; + this.radioButtonJoinPlain.Size = new System.Drawing.Size(200, 17); + this.radioButtonJoinPlain.TabIndex = 30; + this.radioButtonJoinPlain.TabStop = true; + this.radioButtonJoinPlain.Text = "Files already have correct time codes"; + this.radioButtonJoinPlain.UseVisualStyleBackColor = true; + this.radioButtonJoinPlain.CheckedChanged += new System.EventHandler(this.RadioButtonJoinPlain_CheckedChanged); + // + // numericUpDownAddMs + // + this.numericUpDownAddMs.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.numericUpDownAddMs.Location = new System.Drawing.Point(385, 357); + this.numericUpDownAddMs.Maximum = new decimal(new int[] { + 100000, + 0, + 0, + 0}); + this.numericUpDownAddMs.Name = "numericUpDownAddMs"; + this.numericUpDownAddMs.Size = new System.Drawing.Size(60, 20); + this.numericUpDownAddMs.TabIndex = 34; + // + // radioButtonJoinAddTime + // + this.radioButtonJoinAddTime.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.radioButtonJoinAddTime.AutoSize = true; + this.radioButtonJoinAddTime.Location = new System.Drawing.Point(14, 357); + this.radioButtonJoinAddTime.Name = "radioButtonJoinAddTime"; + this.radioButtonJoinAddTime.Size = new System.Drawing.Size(161, 17); + this.radioButtonJoinAddTime.TabIndex = 32; + this.radioButtonJoinAddTime.TabStop = true; + this.radioButtonJoinAddTime.Text = "Add end time of previous file"; + this.radioButtonJoinAddTime.UseVisualStyleBackColor = true; + this.radioButtonJoinAddTime.CheckedChanged += new System.EventHandler(this.RadioButtonJoinAddTime_CheckedChanged); + // + // labelAddTime + // + this.labelAddTime.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelAddTime.AutoSize = true; + this.labelAddTime.Location = new System.Drawing.Point(227, 359); + this.labelAddTime.Name = "labelAddTime"; + this.labelAddTime.Size = new System.Drawing.Size(152, 13); + this.labelAddTime.TabIndex = 34; + this.labelAddTime.Text = "Add milliseconds after each file"; + // + // JoinSubtitles + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(796, 420); + this.Controls.Add(this.labelAddTime); + this.Controls.Add(this.radioButtonJoinAddTime); + this.Controls.Add(this.numericUpDownAddMs); + this.Controls.Add(this.radioButtonJoinPlain); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonJoin); + this.Controls.Add(this.groupBoxPreview); + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(640, 320); + this.Name = "JoinSubtitles"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Join subtitles"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.JoinSubtitles_FormClosing); + this.Shown += new System.EventHandler(this.JoinSubtitles_Shown); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.JoinSubtitles_KeyDown); + this.Resize += new System.EventHandler(this.JoinSubtitles_Resize); + this.groupBoxPreview.ResumeLayout(false); + this.groupBoxPreview.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownAddMs)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonJoin; + private System.Windows.Forms.ListView listViewParts; + private System.Windows.Forms.ColumnHeader columnHeaderLines; + private System.Windows.Forms.ColumnHeader columnHeaderStartTime; + private System.Windows.Forms.ColumnHeader columnHeaderFileName; + private System.Windows.Forms.GroupBox groupBoxPreview; + private System.Windows.Forms.Button buttonClear; + private System.Windows.Forms.Button buttonRemoveFile; + private System.Windows.Forms.Button buttonAddFile; + private System.Windows.Forms.ColumnHeader columnHeaderEndTime; + private System.Windows.Forms.OpenFileDialog openFileDialog1; + private System.Windows.Forms.Label labelTotalLines; + private System.Windows.Forms.RadioButton radioButtonJoinPlain; + private System.Windows.Forms.NumericUpDown numericUpDownAddMs; + private System.Windows.Forms.RadioButton radioButtonJoinAddTime; + private System.Windows.Forms.Label labelAddTime; + } } \ No newline at end of file diff --git a/src/Forms/JoinSubtitles.cs b/src/ui/Forms/JoinSubtitles.cs similarity index 97% rename from src/Forms/JoinSubtitles.cs rename to src/ui/Forms/JoinSubtitles.cs index 62b213d79..2f2f2944e 100644 --- a/src/Forms/JoinSubtitles.cs +++ b/src/ui/Forms/JoinSubtitles.cs @@ -1,349 +1,349 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.SubtitleFormats; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class JoinSubtitles : PositionAndSizeForm - { - private readonly List _fileNamesToJoin = new List(); - public Subtitle JoinedSubtitle { get; set; } - public SubtitleFormat JoinedFormat { get; private set; } - - public JoinSubtitles() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - JoinedSubtitle = new Subtitle(); - labelTotalLines.Text = string.Empty; - - listViewParts.Columns[0].Text = Configuration.Settings.Language.JoinSubtitles.NumberOfLines; - listViewParts.Columns[1].Text = Configuration.Settings.Language.JoinSubtitles.StartTime; - listViewParts.Columns[2].Text = Configuration.Settings.Language.JoinSubtitles.EndTime; - listViewParts.Columns[3].Text = Configuration.Settings.Language.JoinSubtitles.FileName; - - buttonAddFile.Text = Configuration.Settings.Language.DvdSubRip.Add; - buttonRemoveFile.Text = Configuration.Settings.Language.DvdSubRip.Remove; - buttonClear.Text = Configuration.Settings.Language.DvdSubRip.Clear; - - Text = Configuration.Settings.Language.JoinSubtitles.Title; - groupBoxPreview.Text = Configuration.Settings.Language.JoinSubtitles.Information; - buttonJoin.Text = Configuration.Settings.Language.JoinSubtitles.Join; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - - radioButtonJoinPlain.Text = Configuration.Settings.Language.JoinSubtitles.AlreadyCorrectTimeCodes; - radioButtonJoinAddTime.Text = Configuration.Settings.Language.JoinSubtitles.AppendTimeCodes; - labelAddTime.Text = Configuration.Settings.Language.JoinSubtitles.AddMs; - - labelAddTime.Left = radioButtonJoinAddTime.Left + radioButtonJoinAddTime.Width + 20; - numericUpDownAddMs.Left = labelAddTime.Left + labelAddTime.Width + 5; - - UiUtil.FixLargeFonts(this, buttonCancel); - - if (Configuration.Settings.Tools.JoinCorrectTimeCodes) - { - radioButtonJoinPlain.Checked = true; - } - else - { - radioButtonJoinAddTime.Checked = true; - } - numericUpDownAddMs.Value = Configuration.Settings.Tools.JoinAddMs; - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private void buttonSplit_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.OK; - } - - private void JoinSubtitles_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - private void listViewParts_DragEnter(object sender, DragEventArgs e) - { - if (e.Data.GetDataPresent(DataFormats.FileDrop, false)) - { - e.Effect = DragDropEffects.All; - } - } - - private void listViewParts_DragDrop(object sender, DragEventArgs e) - { - var files = (string[])e.Data.GetData(DataFormats.FileDrop); - foreach (string fileName in files) - { - if (!_fileNamesToJoin.Any(file => file.Equals(fileName, StringComparison.OrdinalIgnoreCase))) - { - _fileNamesToJoin.Add(fileName); - } - } - SortAndLoad(); - } - - private void SortAndLoad() - { - JoinedFormat = new SubRip(); // default subtitle format - string header = null; - SubtitleFormat lastFormat = null; - var subtitles = new List(); - for (int k = 0; k < _fileNamesToJoin.Count; k++) - { - string fileName = _fileNamesToJoin[k]; - try - { - var sub = new Subtitle(); - SubtitleFormat format; - var lines = FileUtil.ReadAllLinesShared(fileName, LanguageAutoDetect.GetEncodingFromFile(fileName)); - if (lastFormat != null && lastFormat.IsMine(lines, fileName)) - { - format = lastFormat; - format.LoadSubtitle(sub, lines, fileName); - } - - format = sub.LoadSubtitle(fileName, out _, null); - - if (format == null) - { - if (lines.Count > 0 && lines.Count < 10 && lines[0].Trim() == "WEBVTT") - { - format = new WebVTT(); // empty WebVTT - } - } - - if (format == null) - { - foreach (var binaryFormat in SubtitleFormat.GetBinaryFormats(true)) - { - if (binaryFormat.IsMine(null, fileName)) - { - binaryFormat.LoadSubtitle(sub, null, fileName); - format = binaryFormat; - break; - } - } - } - - if (format == null) - { - foreach (var f in SubtitleFormat.GetTextOtherFormats()) - { - if (f.IsMine(lines, fileName)) - { - f.LoadSubtitle(sub, lines, fileName); - format = f; - break; - } - } - } - - if (format == null) - { - Revert(k, Configuration.Settings.Language.UnknownSubtitle.Title + Environment.NewLine + fileName); - break; - } - - if (sub.Header != null) - { - header = sub.Header; - } - - lastFormat = lastFormat == null || lastFormat.FriendlyName == format.FriendlyName ? format : new SubRip(); - - subtitles.Add(sub); - } - catch (Exception exception) - { - Revert(k, exception.Message); - return; - } - } - JoinedFormat = lastFormat; - - - if (!radioButtonJoinAddTime.Checked) - { - for (int outer = 0; outer < subtitles.Count; outer++) - { - for (int inner = 1; inner < subtitles.Count; inner++) - { - var a = subtitles[inner - 1]; - var b = subtitles[inner]; - if (a.Paragraphs.Count > 0 && b.Paragraphs.Count > 0 && a.Paragraphs[0].StartTime.TotalMilliseconds > b.Paragraphs[0].StartTime.TotalMilliseconds) - { - string t1 = _fileNamesToJoin[inner - 1]; - _fileNamesToJoin[inner - 1] = _fileNamesToJoin[inner]; - _fileNamesToJoin[inner] = t1; - - var t2 = subtitles[inner - 1]; - subtitles[inner - 1] = subtitles[inner]; - subtitles[inner] = t2; - } - } - } - } - - listViewParts.BeginUpdate(); - listViewParts.Items.Clear(); - int i = 0; - foreach (string fileName in _fileNamesToJoin) - { - var sub = subtitles[i]; - var lvi = new ListViewItem($"{sub.Paragraphs.Count:#,###,###}"); - if (sub.Paragraphs.Count > 0) - { - lvi.SubItems.Add(sub.Paragraphs[0].StartTime.ToString()); - lvi.SubItems.Add(sub.Paragraphs[sub.Paragraphs.Count - 1].StartTime.ToString()); - } - else - { - lvi.SubItems.Add("-"); - lvi.SubItems.Add("-"); - } - lvi.SubItems.Add(fileName); - listViewParts.Items.Add(lvi); - i++; - } - listViewParts.EndUpdate(); - - JoinedSubtitle = new Subtitle(); - if (JoinedFormat != null && JoinedFormat.FriendlyName != SubRip.NameOfFormat) - { - JoinedSubtitle.Header = header; - } - - var addTime = radioButtonJoinAddTime.Checked; - foreach (var sub in subtitles) - { - double addMs = 0; - if (addTime && JoinedSubtitle.Paragraphs.Count > 0) - { - addMs = JoinedSubtitle.Paragraphs.Last().EndTime.TotalMilliseconds + Convert.ToDouble(numericUpDownAddMs.Value); - } - foreach (var p in sub.Paragraphs) - { - p.StartTime.TotalMilliseconds += addMs; - p.EndTime.TotalMilliseconds += addMs; - JoinedSubtitle.Paragraphs.Add(p); - } - } - JoinedSubtitle.Renumber(); - labelTotalLines.Text = string.Format(Configuration.Settings.Language.JoinSubtitles.TotalNumberOfLinesX, JoinedSubtitle.Paragraphs.Count); - } - - private void Revert(int idx, string message) - { - for (int i = _fileNamesToJoin.Count - 1; i >= idx; i--) - { - _fileNamesToJoin.RemoveAt(i); - } - MessageBox.Show(message); - } - - private void JoinSubtitles_Resize(object sender, EventArgs e) - { - columnHeaderFileName.Width = -2; - } - - private void ButtonAddSubtitleClick(object sender, EventArgs e) - { - openFileDialog1.Title = Configuration.Settings.Language.General.OpenSubtitle; - openFileDialog1.FileName = string.Empty; - openFileDialog1.Filter = UiUtil.SubtitleExtensionFilter.Value; - openFileDialog1.Multiselect = true; - if (openFileDialog1.ShowDialog(this) == DialogResult.OK) - { - var sb = new StringBuilder(); - foreach (string fileName in openFileDialog1.FileNames) - { - Application.DoEvents(); - if (File.Exists(fileName)) - { - var fileInfo = new FileInfo(fileName); - if (fileInfo.Length < Subtitle.MaxFileSize) - { - if (!_fileNamesToJoin.Any(file => file.Equals(fileName, StringComparison.OrdinalIgnoreCase))) - { - _fileNamesToJoin.Add(fileName); - } - } - else - { - sb.AppendLine(string.Format(Configuration.Settings.Language.Main.FileXIsLargerThan10MB, fileName)); - } - } - } - SortAndLoad(); - if (sb.Length > 0) - { - MessageBox.Show(sb.ToString()); - } - JoinSubtitles_Resize(sender, e); - } - } - - private void ButtonRemoveSubtitle_Click(object sender, EventArgs e) - { - for (int i = listViewParts.SelectedIndices.Count - 1; i >= 0; i--) - { - _fileNamesToJoin.RemoveAt(listViewParts.SelectedIndices[i]); - } - if (_fileNamesToJoin.Count == 0) - { - buttonClear_Click(null, null); - } - else - { - SortAndLoad(); - } - } - - private void buttonClear_Click(object sender, EventArgs e) - { - _fileNamesToJoin.Clear(); - listViewParts.Items.Clear(); - JoinedSubtitle = new Subtitle(); - } - - private void JoinSubtitles_Shown(object sender, EventArgs e) - { - columnHeaderFileName.Width = -2; - } - - private void JoinSubtitles_FormClosing(object sender, FormClosingEventArgs e) - { - Configuration.Settings.Tools.JoinCorrectTimeCodes = radioButtonJoinPlain.Checked; - Configuration.Settings.Tools.JoinAddMs = (int)numericUpDownAddMs.Value; - } - - private void RadioButtonJoinAddTime_CheckedChanged(object sender, EventArgs e) - { - numericUpDownAddMs.Enabled = radioButtonJoinAddTime.Checked; - labelAddTime.Enabled = radioButtonJoinAddTime.Checked; - } - - private void RadioButtonJoinPlain_CheckedChanged(object sender, EventArgs e) - { - numericUpDownAddMs.Enabled = radioButtonJoinAddTime.Checked; - labelAddTime.Enabled = radioButtonJoinAddTime.Checked; - SortAndLoad(); - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.SubtitleFormats; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class JoinSubtitles : PositionAndSizeForm + { + private readonly List _fileNamesToJoin = new List(); + public Subtitle JoinedSubtitle { get; set; } + public SubtitleFormat JoinedFormat { get; private set; } + + public JoinSubtitles() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + JoinedSubtitle = new Subtitle(); + labelTotalLines.Text = string.Empty; + + listViewParts.Columns[0].Text = Configuration.Settings.Language.JoinSubtitles.NumberOfLines; + listViewParts.Columns[1].Text = Configuration.Settings.Language.JoinSubtitles.StartTime; + listViewParts.Columns[2].Text = Configuration.Settings.Language.JoinSubtitles.EndTime; + listViewParts.Columns[3].Text = Configuration.Settings.Language.JoinSubtitles.FileName; + + buttonAddFile.Text = Configuration.Settings.Language.DvdSubRip.Add; + buttonRemoveFile.Text = Configuration.Settings.Language.DvdSubRip.Remove; + buttonClear.Text = Configuration.Settings.Language.DvdSubRip.Clear; + + Text = Configuration.Settings.Language.JoinSubtitles.Title; + groupBoxPreview.Text = Configuration.Settings.Language.JoinSubtitles.Information; + buttonJoin.Text = Configuration.Settings.Language.JoinSubtitles.Join; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + + radioButtonJoinPlain.Text = Configuration.Settings.Language.JoinSubtitles.AlreadyCorrectTimeCodes; + radioButtonJoinAddTime.Text = Configuration.Settings.Language.JoinSubtitles.AppendTimeCodes; + labelAddTime.Text = Configuration.Settings.Language.JoinSubtitles.AddMs; + + labelAddTime.Left = radioButtonJoinAddTime.Left + radioButtonJoinAddTime.Width + 20; + numericUpDownAddMs.Left = labelAddTime.Left + labelAddTime.Width + 5; + + UiUtil.FixLargeFonts(this, buttonCancel); + + if (Configuration.Settings.Tools.JoinCorrectTimeCodes) + { + radioButtonJoinPlain.Checked = true; + } + else + { + radioButtonJoinAddTime.Checked = true; + } + numericUpDownAddMs.Value = Configuration.Settings.Tools.JoinAddMs; + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void buttonSplit_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.OK; + } + + private void JoinSubtitles_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + private void listViewParts_DragEnter(object sender, DragEventArgs e) + { + if (e.Data.GetDataPresent(DataFormats.FileDrop, false)) + { + e.Effect = DragDropEffects.All; + } + } + + private void listViewParts_DragDrop(object sender, DragEventArgs e) + { + var files = (string[])e.Data.GetData(DataFormats.FileDrop); + foreach (string fileName in files) + { + if (!_fileNamesToJoin.Any(file => file.Equals(fileName, StringComparison.OrdinalIgnoreCase))) + { + _fileNamesToJoin.Add(fileName); + } + } + SortAndLoad(); + } + + private void SortAndLoad() + { + JoinedFormat = new SubRip(); // default subtitle format + string header = null; + SubtitleFormat lastFormat = null; + var subtitles = new List(); + for (int k = 0; k < _fileNamesToJoin.Count; k++) + { + string fileName = _fileNamesToJoin[k]; + try + { + var sub = new Subtitle(); + SubtitleFormat format; + var lines = FileUtil.ReadAllLinesShared(fileName, LanguageAutoDetect.GetEncodingFromFile(fileName)); + if (lastFormat != null && lastFormat.IsMine(lines, fileName)) + { + format = lastFormat; + format.LoadSubtitle(sub, lines, fileName); + } + + format = sub.LoadSubtitle(fileName, out _, null); + + if (format == null) + { + if (lines.Count > 0 && lines.Count < 10 && lines[0].Trim() == "WEBVTT") + { + format = new WebVTT(); // empty WebVTT + } + } + + if (format == null) + { + foreach (var binaryFormat in SubtitleFormat.GetBinaryFormats(true)) + { + if (binaryFormat.IsMine(null, fileName)) + { + binaryFormat.LoadSubtitle(sub, null, fileName); + format = binaryFormat; + break; + } + } + } + + if (format == null) + { + foreach (var f in SubtitleFormat.GetTextOtherFormats()) + { + if (f.IsMine(lines, fileName)) + { + f.LoadSubtitle(sub, lines, fileName); + format = f; + break; + } + } + } + + if (format == null) + { + Revert(k, Configuration.Settings.Language.UnknownSubtitle.Title + Environment.NewLine + fileName); + break; + } + + if (sub.Header != null) + { + header = sub.Header; + } + + lastFormat = lastFormat == null || lastFormat.FriendlyName == format.FriendlyName ? format : new SubRip(); + + subtitles.Add(sub); + } + catch (Exception exception) + { + Revert(k, exception.Message); + return; + } + } + JoinedFormat = lastFormat; + + + if (!radioButtonJoinAddTime.Checked) + { + for (int outer = 0; outer < subtitles.Count; outer++) + { + for (int inner = 1; inner < subtitles.Count; inner++) + { + var a = subtitles[inner - 1]; + var b = subtitles[inner]; + if (a.Paragraphs.Count > 0 && b.Paragraphs.Count > 0 && a.Paragraphs[0].StartTime.TotalMilliseconds > b.Paragraphs[0].StartTime.TotalMilliseconds) + { + string t1 = _fileNamesToJoin[inner - 1]; + _fileNamesToJoin[inner - 1] = _fileNamesToJoin[inner]; + _fileNamesToJoin[inner] = t1; + + var t2 = subtitles[inner - 1]; + subtitles[inner - 1] = subtitles[inner]; + subtitles[inner] = t2; + } + } + } + } + + listViewParts.BeginUpdate(); + listViewParts.Items.Clear(); + int i = 0; + foreach (string fileName in _fileNamesToJoin) + { + var sub = subtitles[i]; + var lvi = new ListViewItem($"{sub.Paragraphs.Count:#,###,###}"); + if (sub.Paragraphs.Count > 0) + { + lvi.SubItems.Add(sub.Paragraphs[0].StartTime.ToString()); + lvi.SubItems.Add(sub.Paragraphs[sub.Paragraphs.Count - 1].StartTime.ToString()); + } + else + { + lvi.SubItems.Add("-"); + lvi.SubItems.Add("-"); + } + lvi.SubItems.Add(fileName); + listViewParts.Items.Add(lvi); + i++; + } + listViewParts.EndUpdate(); + + JoinedSubtitle = new Subtitle(); + if (JoinedFormat != null && JoinedFormat.FriendlyName != SubRip.NameOfFormat) + { + JoinedSubtitle.Header = header; + } + + var addTime = radioButtonJoinAddTime.Checked; + foreach (var sub in subtitles) + { + double addMs = 0; + if (addTime && JoinedSubtitle.Paragraphs.Count > 0) + { + addMs = JoinedSubtitle.Paragraphs.Last().EndTime.TotalMilliseconds + Convert.ToDouble(numericUpDownAddMs.Value); + } + foreach (var p in sub.Paragraphs) + { + p.StartTime.TotalMilliseconds += addMs; + p.EndTime.TotalMilliseconds += addMs; + JoinedSubtitle.Paragraphs.Add(p); + } + } + JoinedSubtitle.Renumber(); + labelTotalLines.Text = string.Format(Configuration.Settings.Language.JoinSubtitles.TotalNumberOfLinesX, JoinedSubtitle.Paragraphs.Count); + } + + private void Revert(int idx, string message) + { + for (int i = _fileNamesToJoin.Count - 1; i >= idx; i--) + { + _fileNamesToJoin.RemoveAt(i); + } + MessageBox.Show(message); + } + + private void JoinSubtitles_Resize(object sender, EventArgs e) + { + columnHeaderFileName.Width = -2; + } + + private void ButtonAddSubtitleClick(object sender, EventArgs e) + { + openFileDialog1.Title = Configuration.Settings.Language.General.OpenSubtitle; + openFileDialog1.FileName = string.Empty; + openFileDialog1.Filter = UiUtil.SubtitleExtensionFilter.Value; + openFileDialog1.Multiselect = true; + if (openFileDialog1.ShowDialog(this) == DialogResult.OK) + { + var sb = new StringBuilder(); + foreach (string fileName in openFileDialog1.FileNames) + { + Application.DoEvents(); + if (File.Exists(fileName)) + { + var fileInfo = new FileInfo(fileName); + if (fileInfo.Length < Subtitle.MaxFileSize) + { + if (!_fileNamesToJoin.Any(file => file.Equals(fileName, StringComparison.OrdinalIgnoreCase))) + { + _fileNamesToJoin.Add(fileName); + } + } + else + { + sb.AppendLine(string.Format(Configuration.Settings.Language.Main.FileXIsLargerThan10MB, fileName)); + } + } + } + SortAndLoad(); + if (sb.Length > 0) + { + MessageBox.Show(sb.ToString()); + } + JoinSubtitles_Resize(sender, e); + } + } + + private void ButtonRemoveSubtitle_Click(object sender, EventArgs e) + { + for (int i = listViewParts.SelectedIndices.Count - 1; i >= 0; i--) + { + _fileNamesToJoin.RemoveAt(listViewParts.SelectedIndices[i]); + } + if (_fileNamesToJoin.Count == 0) + { + buttonClear_Click(null, null); + } + else + { + SortAndLoad(); + } + } + + private void buttonClear_Click(object sender, EventArgs e) + { + _fileNamesToJoin.Clear(); + listViewParts.Items.Clear(); + JoinedSubtitle = new Subtitle(); + } + + private void JoinSubtitles_Shown(object sender, EventArgs e) + { + columnHeaderFileName.Width = -2; + } + + private void JoinSubtitles_FormClosing(object sender, FormClosingEventArgs e) + { + Configuration.Settings.Tools.JoinCorrectTimeCodes = radioButtonJoinPlain.Checked; + Configuration.Settings.Tools.JoinAddMs = (int)numericUpDownAddMs.Value; + } + + private void RadioButtonJoinAddTime_CheckedChanged(object sender, EventArgs e) + { + numericUpDownAddMs.Enabled = radioButtonJoinAddTime.Checked; + labelAddTime.Enabled = radioButtonJoinAddTime.Checked; + } + + private void RadioButtonJoinPlain_CheckedChanged(object sender, EventArgs e) + { + numericUpDownAddMs.Enabled = radioButtonJoinAddTime.Checked; + labelAddTime.Enabled = radioButtonJoinAddTime.Checked; + SortAndLoad(); + } + } +} diff --git a/src/Forms/JoinSubtitles.resx b/src/ui/Forms/JoinSubtitles.resx similarity index 97% rename from src/Forms/JoinSubtitles.resx rename to src/ui/Forms/JoinSubtitles.resx index 3a7d67153..9bad2f599 100644 --- a/src/Forms/JoinSubtitles.resx +++ b/src/ui/Forms/JoinSubtitles.resx @@ -1,123 +1,123 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + \ No newline at end of file diff --git a/src/Forms/Main.Designer.cs b/src/ui/Forms/Main.Designer.cs similarity index 98% rename from src/Forms/Main.Designer.cs rename to src/ui/Forms/Main.Designer.cs index 246e28555..95a865a2d 100644 --- a/src/Forms/Main.Designer.cs +++ b/src/ui/Forms/Main.Designer.cs @@ -1,5698 +1,5698 @@ -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class Main - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - if (disposing) - { - if (_networkSession != null) - { - _networkSession.Dispose(); - _networkSession = null; - } - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Main)); - TimeCode timeCode4 = new TimeCode(); - TimeCode timeCode5 = new TimeCode(); - TimeCode timeCode6 = new TimeCode(); - this.statusStrip1 = new System.Windows.Forms.StatusStrip(); - this.labelStatus = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolStripSelected = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolStripStatusLabelProgress = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolStripStatusNetworking = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolStrip1 = new System.Windows.Forms.ToolStrip(); - this.toolStripButtonFileNew = new System.Windows.Forms.ToolStripButton(); - this.toolStripButtonFileOpen = new System.Windows.Forms.ToolStripButton(); - this.toolStripButtonSave = new System.Windows.Forms.ToolStripButton(); - this.toolStripButtonSaveAs = new System.Windows.Forms.ToolStripButton(); - this.toolStripSeparatorFindReplace = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripButtonFind = new System.Windows.Forms.ToolStripButton(); - this.toolStripButtonReplace = new System.Windows.Forms.ToolStripButton(); - this.toolStripSeparatorFixSyncSpell = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripButtonFixCommonErrors = new System.Windows.Forms.ToolStripButton(); - this.toolStripButtonRemoveTextForHi = new System.Windows.Forms.ToolStripButton(); - this.toolStripButtonVisualSync = new System.Windows.Forms.ToolStripButton(); - this.toolStripButtonSpellCheck = new System.Windows.Forms.ToolStripButton(); - this.toolStripButtonNetflixQualityCheck = new System.Windows.Forms.ToolStripButton(); - this.toolStripButtonSettings = new System.Windows.Forms.ToolStripButton(); - this.toolStripSeparatorHelp = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripButtonHelp = new System.Windows.Forms.ToolStripButton(); - this.toolStripSeparatorToggle = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripButtonToggleWaveform = new System.Windows.Forms.ToolStripButton(); - this.toolStripButtonToggleVideo = new System.Windows.Forms.ToolStripButton(); - this.toolStripSeparatorSubtitleFormat = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripLabelSubtitleFormat = new System.Windows.Forms.ToolStripLabel(); - this.comboBoxSubtitleFormats = new System.Windows.Forms.ToolStripComboBox(); - this.toolStripSeparatorEncoding = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripLabelEncoding = new System.Windows.Forms.ToolStripLabel(); - this.comboBoxEncoding = new System.Windows.Forms.ToolStripComboBox(); - this.toolStripSeparatorFrameRate = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripLabelFrameRate = new System.Windows.Forms.ToolStripLabel(); - this.toolStripComboBoxFrameRate = new System.Windows.Forms.ToolStripComboBox(); - this.toolStripButtonGetFrameRate = new System.Windows.Forms.ToolStripButton(); - this.menuStrip1 = new System.Windows.Forms.MenuStrip(); - this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemOpenKeepVideo = new System.Windows.Forms.ToolStripMenuItem(); - this.reopenToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemRestoreAutoBackup = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemDCinemaProperties = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemTTProperties = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemNuendoProperties = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemFcpProperties = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemSubStationAlpha = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemAssaStyles = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemEbuProperties = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemDvdStudioProProperties = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator20 = new System.Windows.Forms.ToolStripSeparator(); - this.openOriginalToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.saveOriginalToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.saveOriginalAstoolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.removeOriginalToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripMenuItemOpenContainingFolder = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemCompare = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemStatistics = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemPlugins = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripMenuItemImportDvdSubtitles = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemSubIdx = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemImportBluRaySup = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemImportXSub = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemImportOcrHardSub = new System.Windows.Forms.ToolStripMenuItem(); - this.matroskaImportStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemManualAnsi = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemImportText = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemImportImages = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemImportTimeCodes = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator22 = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripMenuItemExport = new System.Windows.Forms.ToolStripMenuItem(); - this.adobeEncoreFABImageScriptToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemAvidStl = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemExportAyato = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemExportPngXml = new System.Windows.Forms.ToolStripMenuItem(); - this.bluraySupToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemExportBdTextSt = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemExportCapMakerPlus = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemExportCaptionInc = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemCavena890 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemExportCheetahCap = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemExportDcinemaInterop = new System.Windows.Forms.ToolStripMenuItem(); - this.dCinemaSMPTE2014ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemDost = new System.Windows.Forms.ToolStripMenuItem(); - this.DvdStudioProStl = new System.Windows.Forms.ToolStripMenuItem(); - this.eBUSTLToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemEdl = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemEdlClipName = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemExportFcpIImage = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemFcpXmlAdvanced = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemImagePerFrame = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemTextTimeCodePair = new System.Windows.Forms.ToolStripMenuItem(); - this.pACScreenElectronicsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.uniPacExportToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.plainTextToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemSpumux = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemExportUltech130 = new System.Windows.Forms.ToolStripMenuItem(); - this.vobSubsubidxToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparatorExportCustomText = new System.Windows.Forms.ToolStripSeparator(); - this.exportCustomTextFormatToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator(); - this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemUndo = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemRedo = new System.Windows.Forms.ToolStripMenuItem(); - this.showHistoryforUndoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator14 = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripMenuItemInsertUnicodeCharacter = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparatorInsertUnicodeCharacter = new System.Windows.Forms.ToolStripSeparator(); - this.findToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.findNextToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.replaceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.multipleReplaceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.gotoLineNumberToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemShowOriginalInPreview = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator25 = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripMenuItemRightToLeftMode = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemRtlUnicodeControlChars = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemRemoveUnicodeControlChars = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemReverseRightToLeftStartEnd = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator21 = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripMenuItemModifySelection = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemInverseSelection = new System.Windows.Forms.ToolStripMenuItem(); - this.editSelectAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.adjustDisplayTimeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemApplyDurationLimits = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemSubtitlesBridgeGaps = new System.Windows.Forms.ToolStripMenuItem(); - this.setMinimumDisplayTimeBetweenParagraphsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.fixToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.startNumberingFromToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.removeTextForHearImpairedToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ChangeCasingToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemAutoMergeShortLines = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemMergeDuplicateText = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemMergeLinesWithSameTimeCodes = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemAutoSplitLongLines = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemSortBy = new System.Windows.Forms.ToolStripMenuItem(); - this.sortNumberToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.sortStartTimeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.sortEndTimeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.sortDisplayTimeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.sortTextAlphabeticallytoolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.sortTextMaxLineLengthToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.sortTextTotalLengthToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.sortTextNumberOfLinesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.textCharssecToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.textWordsPerMinutewpmToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.actorToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.styleToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparatorAscOrDesc = new System.Windows.Forms.ToolStripSeparator(); - this.AscendingToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.descendingToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.netflixQualityCheckToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator23 = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripMenuItemMakeEmptyFromCurrent = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemBatchConvert = new System.Windows.Forms.ToolStripMenuItem(); - this.generateDatetimeInfoFromVideoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemMeasurementConverter = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); - this.splitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.appendTextVisuallyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.joinSubtitlesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemSpellCheckMain = new System.Windows.Forms.ToolStripMenuItem(); - this.spellCheckToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemSpellCheckFromCurrentLine = new System.Windows.Forms.ToolStripMenuItem(); - this.findDoubleWordsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.FindDoubleLinesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator(); - this.GetDictionariesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.addWordToNameListToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemVideo = new System.Windows.Forms.ToolStripMenuItem(); - this.openVideoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemOpenVideoFromUrl = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemOpenDvd = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemSetAudioTrack = new System.Windows.Forms.ToolStripMenuItem(); - this.closeVideoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.openSecondSubtitleToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.setVideoOffsetToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.smpteTimeModedropFrameToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemImportChapters = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemImportSceneChanges = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemRemoveSceneChanges = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemAddWaveformBatch = new System.Windows.Forms.ToolStripMenuItem(); - this.generateTextFromCurrentVideoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); - this.showhideWaveformToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.showhideVideoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator19 = new System.Windows.Forms.ToolStripSeparator(); - this.undockVideoControlsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.redockVideoControlsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemSynchronization = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemAdjustAllTimes = new System.Windows.Forms.ToolStripMenuItem(); - this.visualSyncToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemPointSync = new System.Windows.Forms.ToolStripMenuItem(); - this.pointSyncViaOtherSubtitleToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemChangeFrameRate2 = new System.Windows.Forms.ToolStripMenuItem(); - this.changeSpeedInPercentToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemAutoTranslate = new System.Windows.Forms.ToolStripMenuItem(); - this.translatepoweredByMicrosoftToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.translateByGoogleToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.translateFromSwedishToDanishToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.optionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.settingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.changeLanguageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemNetworking = new System.Windows.Forms.ToolStripMenuItem(); - this.startServerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.joinSessionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.chatToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.showSessionKeyLogToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.leaveSessionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.checkForUpdatesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemSplitterCheckForUpdates = new System.Windows.Forms.ToolStripSeparator(); - this.helpToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.contextMenuStripListview = new System.Windows.Forms.ContextMenuStrip(this.components); - this.setStylesForSelectedLinesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.setActorForSelectedLinesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemAssStyles = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemSetRegion = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemSetLanguage = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemWebVTT = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemPreview = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemDelete = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemInsertBefore = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemInsertAfter = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemInsertSubtitle = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemCopySourceText = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemColumn = new System.Windows.Forms.ToolStripMenuItem(); - this.columnDeleteTextOnlyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemColumnDeleteText = new System.Windows.Forms.ToolStripMenuItem(); - this.ShiftTextCellsDownToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemInsertTextFromSub = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemColumnImportText = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemPasteSpecial = new System.Windows.Forms.ToolStripMenuItem(); - this.copyOriginalTextToCurrentToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.moveTextUpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.moveTextDownToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemBookmark = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); - this.splitLineToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemMergeLines = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemMergeDialog = new System.Windows.Forms.ToolStripMenuItem(); - this.mergeBeforeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.mergeAfterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); - this.extendBeforeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.extendAfterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator(); - this.removeFormattinglToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.removeAllFormattingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.removeBoldToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.removeItalicToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.removeUnderlineToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.removeColorToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.removeFontNameToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.removeAlignmentToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.boldToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.italicToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.boxToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.underlineToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.colorToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemFont = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemAlignment = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemSurroundWithMusicSymbols = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripMenuItemAutoBreakLines = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemUnbreakLines = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparatorBreakLines = new System.Windows.Forms.ToolStripSeparator(); - this.typeEffectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.karokeeEffectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparatorAdvancedFunctions = new System.Windows.Forms.ToolStripSeparator(); - this.showSelectedLinesEarlierlaterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.visualSyncSelectedLinesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemGoogleMicrosoftTranslateSelLine = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemTranslateSelected = new System.Windows.Forms.ToolStripMenuItem(); - this.googleTranslateToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.microsoftBingTranslateToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.adjustDisplayTimeForSelectedLinesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.fixCommonErrorsInSelectedLinesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.changeCasingForSelectedLinesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemSaveSelectedLines = new System.Windows.Forms.ToolStripMenuItem(); - this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); - this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog(); - this.timer1 = new System.Windows.Forms.Timer(this.components); - this.colorDialog1 = new System.Windows.Forms.ColorDialog(); - this.groupBoxVideo = new System.Windows.Forms.GroupBox(); - this.labelNextWord = new System.Windows.Forms.Label(); - this.audioVisualizer = new Nikse.SubtitleEdit.Controls.AudioVisualizer(); - this.checkBoxSyncListViewWithVideoWhilePlaying = new System.Windows.Forms.CheckBox(); - this.labelVideoInfo = new System.Windows.Forms.Label(); - this.trackBarWaveformPosition = new System.Windows.Forms.TrackBar(); - this.panelWaveformControls = new System.Windows.Forms.Panel(); - this.toolStripWaveControls = new System.Windows.Forms.ToolStrip(); - this.toolStripButtonWaveformZoomOut = new System.Windows.Forms.ToolStripButton(); - this.toolStripComboBoxWaveform = new System.Windows.Forms.ToolStripComboBox(); - this.toolStripButtonWaveformZoomIn = new System.Windows.Forms.ToolStripButton(); - this.toolStripSeparator16 = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripButtonWaveformPause = new System.Windows.Forms.ToolStripButton(); - this.toolStripButtonWaveformPlay = new System.Windows.Forms.ToolStripButton(); - this.toolStripButtonLockCenter = new System.Windows.Forms.ToolStripButton(); - this.toolStripSplitButtonPlayRate = new System.Windows.Forms.ToolStripSplitButton(); - this.tabControlButtons = new System.Windows.Forms.TabControl(); - this.tabPageTranslate = new System.Windows.Forms.TabPage(); - this.labelTranslateTip = new System.Windows.Forms.Label(); - this.groupBoxTranslateSearch = new System.Windows.Forms.GroupBox(); - this.buttonCustomUrl2 = new System.Windows.Forms.Button(); - this.buttonCustomUrl1 = new System.Windows.Forms.Button(); - this.buttonGoogleTranslateIt = new System.Windows.Forms.Button(); - this.buttonGoogleIt = new System.Windows.Forms.Button(); - this.textBoxSearchWord = new System.Windows.Forms.TextBox(); - this.groupBoxAutoContinue = new System.Windows.Forms.GroupBox(); - this.comboBoxAutoContinue = new System.Windows.Forms.ComboBox(); - this.labelAutoContinueDelay = new System.Windows.Forms.Label(); - this.checkBoxAutoContinue = new System.Windows.Forms.CheckBox(); - this.buttonStop = new System.Windows.Forms.Button(); - this.groupBoxAutoRepeat = new System.Windows.Forms.GroupBox(); - this.comboBoxAutoRepeat = new System.Windows.Forms.ComboBox(); - this.labelAutoRepeatCount = new System.Windows.Forms.Label(); - this.checkBoxAutoRepeatOn = new System.Windows.Forms.CheckBox(); - this.buttonPlayPrevious = new System.Windows.Forms.Button(); - this.buttonPlayCurrent = new System.Windows.Forms.Button(); - this.buttonPlayNext = new System.Windows.Forms.Button(); - this.tabPageCreate = new System.Windows.Forms.TabPage(); - this.timeUpDownVideoPosition = new Nikse.SubtitleEdit.Controls.TimeUpDown(); - this.buttonGotoSub = new System.Windows.Forms.Button(); - this.buttonBeforeText = new System.Windows.Forms.Button(); - this.buttonSetEnd = new System.Windows.Forms.Button(); - this.buttonInsertNewText = new System.Windows.Forms.Button(); - this.buttonSetStartTime = new System.Windows.Forms.Button(); - this.labelCreateF12 = new System.Windows.Forms.Label(); - this.labelCreateF11 = new System.Windows.Forms.Label(); - this.labelCreateF10 = new System.Windows.Forms.Label(); - this.labelCreateF9 = new System.Windows.Forms.Label(); - this.buttonForward2 = new System.Windows.Forms.Button(); - this.numericUpDownSec2 = new System.Windows.Forms.NumericUpDown(); - this.buttonSecBack2 = new System.Windows.Forms.Button(); - this.buttonForward1 = new System.Windows.Forms.Button(); - this.numericUpDownSec1 = new System.Windows.Forms.NumericUpDown(); - this.labelVideoPosition = new System.Windows.Forms.Label(); - this.buttonSecBack1 = new System.Windows.Forms.Button(); - this.tabPageAdjust = new System.Windows.Forms.TabPage(); - this.timeUpDownVideoPositionAdjust = new Nikse.SubtitleEdit.Controls.TimeUpDown(); - this.buttonAdjustSetEndTime = new System.Windows.Forms.Button(); - this.buttonSetEndAndGoToNext = new System.Windows.Forms.Button(); - this.buttonSetStartAndOffsetRest = new System.Windows.Forms.Button(); - this.buttonAdjustSetStartTime = new System.Windows.Forms.Button(); - this.labelAdjustF12 = new System.Windows.Forms.Label(); - this.labelAdjustF11 = new System.Windows.Forms.Label(); - this.labelAdjustF10 = new System.Windows.Forms.Label(); - this.labelAdjustF9 = new System.Windows.Forms.Label(); - this.buttonAdjustSecForward2 = new System.Windows.Forms.Button(); - this.numericUpDownSecAdjust2 = new System.Windows.Forms.NumericUpDown(); - this.buttonAdjustSecBack2 = new System.Windows.Forms.Button(); - this.buttonAdjustSecForward1 = new System.Windows.Forms.Button(); - this.numericUpDownSecAdjust1 = new System.Windows.Forms.NumericUpDown(); - this.buttonAdjustSecBack1 = new System.Windows.Forms.Button(); - this.labelVideoPosition2 = new System.Windows.Forms.Label(); - this.buttonAdjustGoToPosAndPause = new System.Windows.Forms.Button(); - this.buttonAdjustPlayBefore = new System.Windows.Forms.Button(); - this.ShowSubtitleTimer = new System.Windows.Forms.Timer(this.components); - this.timerAutoDuration = new System.Windows.Forms.Timer(this.components); - this.timerAutoContinue = new System.Windows.Forms.Timer(this.components); - this.timerStillTyping = new System.Windows.Forms.Timer(this.components); - this.timerWaveform = new System.Windows.Forms.Timer(this.components); - this.contextMenuStripWaveform = new System.Windows.Forms.ContextMenuStrip(this.components); - this.addParagraphHereToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.addParagraphAndPasteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemSetParagraphAsSelection = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemFocusTextbox = new System.Windows.Forms.ToolStripMenuItem(); - this.goToPreviousSubtitleStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.goToNextSubtitleStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.deleteParagraphToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.splitToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.mergeWithPreviousToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.mergeWithNextToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator(); - this.extendToPreviousToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.extendToNextToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripMenuItemWaveformPlaySelection = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator24 = new System.Windows.Forms.ToolStripSeparator(); - this.showWaveformAndSpectrogramToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.showOnlyWaveformToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.showOnlySpectrogramToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparatorGuessTimeCodes = new System.Windows.Forms.ToolStripSeparator(); - this.removeSceneChangeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.addSceneChangeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.guessTimeCodesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.seekSilenceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.insertSubtitleHereToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.splitContainerMain = new System.Windows.Forms.SplitContainer(); - this.splitContainer1 = new System.Windows.Forms.SplitContainer(); - this.tabControlSubtitle = new System.Windows.Forms.TabControl(); - this.tabPage1 = new System.Windows.Forms.TabPage(); - this.splitContainerListViewAndText = new System.Windows.Forms.SplitContainer(); - this.SubtitleListview1 = new Nikse.SubtitleEdit.Controls.SubtitleListView(); - this.imageListBookmarks = new System.Windows.Forms.ImageList(this.components); - this.groupBoxEdit = new System.Windows.Forms.GroupBox(); - this.labelAlternateSingleLinePixels = new System.Windows.Forms.Label(); - this.labelSingleLinePixels = new System.Windows.Forms.Label(); - this.panelBookmark = new System.Windows.Forms.Panel(); - this.labelBookmark = new System.Windows.Forms.Label(); - this.pictureBoxBookmark = new System.Windows.Forms.PictureBox(); - this.labelSingleLine = new System.Windows.Forms.Label(); - this.labelAlternateSingleLine = new System.Windows.Forms.Label(); - this.labelDurationWarning = new System.Windows.Forms.Label(); - this.labelStartTimeWarning = new System.Windows.Forms.Label(); - this.buttonSplitLine = new System.Windows.Forms.Button(); - this.labelAlternateCharactersPerSecond = new System.Windows.Forms.Label(); - this.labelTextAlternateLineTotal = new System.Windows.Forms.Label(); - this.labelTextAlternateLineLengths = new System.Windows.Forms.Label(); - this.labelAlternateText = new System.Windows.Forms.Label(); - this.labelText = new System.Windows.Forms.Label(); - this.textBoxListViewTextAlternate = new Nikse.SubtitleEdit.Controls.SETextBox(); - this.contextMenuStripTextBoxListView = new System.Windows.Forms.ContextMenuStrip(this.components); - this.toolStripMenuItemWebVttVoice = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparatorWebVTT = new System.Windows.Forms.ToolStripSeparator(); - this.cutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.copyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.pasteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemSplitTextAtCursor = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemSplitViaWaveform = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator18 = new System.Windows.Forms.ToolStripSeparator(); - this.selectAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator17 = new System.Windows.Forms.ToolStripSeparator(); - this.normalToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.boldToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.italicToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.boxToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.underlineToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.colorToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemHorizontalDigits = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemBouten = new System.Windows.Forms.ToolStripMenuItem(); - this.boutendotbeforeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.boutendotafterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.boutendotoutsideToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.boutenfilledcircleoutsideToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.boutenopencircleoutsideToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.boutenopendotoutsideToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.boutenfilledsesameoutsideToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.boutenopensesameoutsideToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.boutenautooutsideToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.boutenautoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemRuby = new System.Windows.Forms.ToolStripMenuItem(); - this.fontNameToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator26 = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripMenuItemInsertUnicodeSymbol = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemInsertUnicodeControlCharacters = new System.Windows.Forms.ToolStripMenuItem(); - this.leftToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.righttoleftMarkToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.startOfLefttorightEmbeddingLREToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.startOfRighttoleftEmbeddingRLEToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.startOfLefttorightOverrideLROToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.startOfRighttoleftOverrideRLOToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.superscriptToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.subscriptToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.buttonAutoBreak = new System.Windows.Forms.Button(); - this.labelTextLineLengths = new System.Windows.Forms.Label(); - this.labelTextLineTotal = new System.Windows.Forms.Label(); - this.labelCharactersPerSecond = new System.Windows.Forms.Label(); - this.buttonUnBreak = new System.Windows.Forms.Button(); - this.timeUpDownStartTime = new Nikse.SubtitleEdit.Controls.TimeUpDown(); - this.numericUpDownDuration = new System.Windows.Forms.NumericUpDown(); - this.buttonPrevious = new System.Windows.Forms.Button(); - this.buttonNext = new System.Windows.Forms.Button(); - this.labelStartTime = new System.Windows.Forms.Label(); - this.textBoxListViewText = new Nikse.SubtitleEdit.Controls.SETextBox(); - this.labelDuration = new System.Windows.Forms.Label(); - this.labelAutoDuration = new System.Windows.Forms.Label(); - this.tabPage2 = new System.Windows.Forms.TabPage(); - this.textBoxSource = new System.Windows.Forms.TextBox(); - this.panelVideoPlayer = new System.Windows.Forms.Panel(); - this.mediaPlayer = new Nikse.SubtitleEdit.Controls.VideoPlayerContainer(); - this.contextMenuStripEmpty = new System.Windows.Forms.ContextMenuStrip(this.components); - this.insertLineToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.imageListPlayRate = new System.Windows.Forms.ImageList(this.components); - this.timerTextUndo = new System.Windows.Forms.Timer(this.components); - this.timerAlternateTextUndo = new System.Windows.Forms.Timer(this.components); - this.aSSStylesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.statusStrip1.SuspendLayout(); - this.toolStrip1.SuspendLayout(); - this.menuStrip1.SuspendLayout(); - this.contextMenuStripListview.SuspendLayout(); - this.groupBoxVideo.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.trackBarWaveformPosition)).BeginInit(); - this.panelWaveformControls.SuspendLayout(); - this.toolStripWaveControls.SuspendLayout(); - this.tabControlButtons.SuspendLayout(); - this.tabPageTranslate.SuspendLayout(); - this.groupBoxTranslateSearch.SuspendLayout(); - this.groupBoxAutoContinue.SuspendLayout(); - this.groupBoxAutoRepeat.SuspendLayout(); - this.tabPageCreate.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSec2)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSec1)).BeginInit(); - this.tabPageAdjust.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSecAdjust2)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSecAdjust1)).BeginInit(); - this.contextMenuStripWaveform.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.splitContainerMain)).BeginInit(); - this.splitContainerMain.Panel1.SuspendLayout(); - this.splitContainerMain.Panel2.SuspendLayout(); - this.splitContainerMain.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); - this.splitContainer1.Panel1.SuspendLayout(); - this.splitContainer1.Panel2.SuspendLayout(); - this.splitContainer1.SuspendLayout(); - this.tabControlSubtitle.SuspendLayout(); - this.tabPage1.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.splitContainerListViewAndText)).BeginInit(); - this.splitContainerListViewAndText.Panel1.SuspendLayout(); - this.splitContainerListViewAndText.Panel2.SuspendLayout(); - this.splitContainerListViewAndText.SuspendLayout(); - this.groupBoxEdit.SuspendLayout(); - this.panelBookmark.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxBookmark)).BeginInit(); - this.contextMenuStripTextBoxListView.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDuration)).BeginInit(); - this.tabPage2.SuspendLayout(); - this.panelVideoPlayer.SuspendLayout(); - this.contextMenuStripEmpty.SuspendLayout(); - this.SuspendLayout(); - // - // statusStrip1 - // - this.statusStrip1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.labelStatus, - this.toolStripSelected, - this.toolStripStatusLabelProgress, - this.toolStripStatusNetworking}); - this.statusStrip1.Location = new System.Drawing.Point(0, 624); - this.statusStrip1.Name = "statusStrip1"; - this.statusStrip1.Size = new System.Drawing.Size(975, 22); - this.statusStrip1.TabIndex = 4; - this.statusStrip1.Text = "statusStrip1"; - // - // labelStatus - // - this.labelStatus.Name = "labelStatus"; - this.labelStatus.Size = new System.Drawing.Size(0, 17); - this.labelStatus.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; - this.labelStatus.Click += new System.EventHandler(this.labelStatus_Click); - // - // toolStripSelected - // - this.toolStripSelected.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - this.toolStripSelected.Name = "toolStripSelected"; - this.toolStripSelected.Size = new System.Drawing.Size(746, 17); - this.toolStripSelected.Spring = true; - this.toolStripSelected.Text = "toolStripSelected"; - this.toolStripSelected.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - this.toolStripSelected.Click += new System.EventHandler(this.toolStripSelected_Click); - // - // toolStripStatusLabelProgress - // - this.toolStripStatusLabelProgress.Name = "toolStripStatusLabelProgress"; - this.toolStripStatusLabelProgress.Size = new System.Drawing.Size(166, 17); - this.toolStripStatusLabelProgress.Text = "toolStripStatusLabelProgress"; - this.toolStripStatusLabelProgress.Visible = false; - // - // toolStripStatusNetworking - // - this.toolStripStatusNetworking.Image = global::Nikse.SubtitleEdit.Properties.Resources.connect; - this.toolStripStatusNetworking.Name = "toolStripStatusNetworking"; - this.toolStripStatusNetworking.Padding = new System.Windows.Forms.Padding(50, 0, 0, 0); - this.toolStripStatusNetworking.Size = new System.Drawing.Size(214, 17); - this.toolStripStatusNetworking.Text = "toolStripStatusNetworking"; - this.toolStripStatusNetworking.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - this.toolStripStatusNetworking.TextImageRelation = System.Windows.Forms.TextImageRelation.TextBeforeImage; - this.toolStripStatusNetworking.Click += new System.EventHandler(this.toolStripStatusNetworking_Click); - // - // toolStrip1 - // - this.toolStrip1.AutoSize = false; - this.toolStrip1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.toolStrip1.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; - this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripButtonFileNew, - this.toolStripButtonFileOpen, - this.toolStripButtonSave, - this.toolStripButtonSaveAs, - this.toolStripSeparatorFindReplace, - this.toolStripButtonFind, - this.toolStripButtonReplace, - this.toolStripSeparatorFixSyncSpell, - this.toolStripButtonFixCommonErrors, - this.toolStripButtonRemoveTextForHi, - this.toolStripButtonVisualSync, - this.toolStripButtonSpellCheck, - this.toolStripButtonNetflixQualityCheck, - this.toolStripButtonSettings, - this.toolStripSeparatorHelp, - this.toolStripButtonHelp, - this.toolStripSeparatorToggle, - this.toolStripButtonToggleWaveform, - this.toolStripButtonToggleVideo, - this.toolStripSeparatorSubtitleFormat, - this.toolStripLabelSubtitleFormat, - this.comboBoxSubtitleFormats, - this.toolStripSeparatorEncoding, - this.toolStripLabelEncoding, - this.comboBoxEncoding, - this.toolStripSeparatorFrameRate, - this.toolStripLabelFrameRate, - this.toolStripComboBoxFrameRate, - this.toolStripButtonGetFrameRate}); - this.toolStrip1.Location = new System.Drawing.Point(0, 24); - this.toolStrip1.Name = "toolStrip1"; - this.toolStrip1.Size = new System.Drawing.Size(975, 40); - this.toolStrip1.TabIndex = 5; - this.toolStrip1.Text = "toolStrip1"; - // - // toolStripButtonFileNew - // - this.toolStripButtonFileNew.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.toolStripButtonFileNew.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.toolStripButtonFileNew.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonFileNew.Image"))); - this.toolStripButtonFileNew.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; - this.toolStripButtonFileNew.ImageTransparentColor = System.Drawing.Color.Transparent; - this.toolStripButtonFileNew.Name = "toolStripButtonFileNew"; - this.toolStripButtonFileNew.Size = new System.Drawing.Size(36, 37); - this.toolStripButtonFileNew.Text = "New"; - this.toolStripButtonFileNew.ToolTipText = "New"; - this.toolStripButtonFileNew.Click += new System.EventHandler(this.ToolStripButtonFileNewClick); - // - // toolStripButtonFileOpen - // - this.toolStripButtonFileOpen.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.toolStripButtonFileOpen.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.toolStripButtonFileOpen.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonFileOpen.Image"))); - this.toolStripButtonFileOpen.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; - this.toolStripButtonFileOpen.ImageTransparentColor = System.Drawing.Color.Transparent; - this.toolStripButtonFileOpen.Name = "toolStripButtonFileOpen"; - this.toolStripButtonFileOpen.Size = new System.Drawing.Size(36, 37); - this.toolStripButtonFileOpen.Text = "toolStripButtonOpen"; - this.toolStripButtonFileOpen.ToolTipText = "Open"; - this.toolStripButtonFileOpen.Click += new System.EventHandler(this.ToolStripButtonFileOpenClick); - // - // toolStripButtonSave - // - this.toolStripButtonSave.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.toolStripButtonSave.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.toolStripButtonSave.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonSave.Image"))); - this.toolStripButtonSave.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; - this.toolStripButtonSave.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButtonSave.Name = "toolStripButtonSave"; - this.toolStripButtonSave.Size = new System.Drawing.Size(36, 37); - this.toolStripButtonSave.Text = "toolStripButtonSave"; - this.toolStripButtonSave.ToolTipText = "Save"; - this.toolStripButtonSave.Click += new System.EventHandler(this.ToolStripButtonSaveClick); - // - // toolStripButtonSaveAs - // - this.toolStripButtonSaveAs.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.toolStripButtonSaveAs.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.toolStripButtonSaveAs.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonSaveAs.Image"))); - this.toolStripButtonSaveAs.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; - this.toolStripButtonSaveAs.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButtonSaveAs.Name = "toolStripButtonSaveAs"; - this.toolStripButtonSaveAs.Size = new System.Drawing.Size(36, 37); - this.toolStripButtonSaveAs.Text = "toolStripButtonSaveAs"; - this.toolStripButtonSaveAs.ToolTipText = "Save as"; - this.toolStripButtonSaveAs.Click += new System.EventHandler(this.ToolStripButtonSaveAsClick); - // - // toolStripSeparatorFindReplace - // - this.toolStripSeparatorFindReplace.Name = "toolStripSeparatorFindReplace"; - this.toolStripSeparatorFindReplace.Size = new System.Drawing.Size(6, 40); - // - // toolStripButtonFind - // - this.toolStripButtonFind.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.toolStripButtonFind.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.toolStripButtonFind.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonFind.Image"))); - this.toolStripButtonFind.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; - this.toolStripButtonFind.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButtonFind.Name = "toolStripButtonFind"; - this.toolStripButtonFind.Size = new System.Drawing.Size(36, 37); - this.toolStripButtonFind.Text = "Find"; - this.toolStripButtonFind.Click += new System.EventHandler(this.ToolStripButtonFindClick); - // - // toolStripButtonReplace - // - this.toolStripButtonReplace.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.toolStripButtonReplace.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.toolStripButtonReplace.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonReplace.Image"))); - this.toolStripButtonReplace.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; - this.toolStripButtonReplace.ImageTransparentColor = System.Drawing.Color.White; - this.toolStripButtonReplace.Name = "toolStripButtonReplace"; - this.toolStripButtonReplace.Size = new System.Drawing.Size(36, 37); - this.toolStripButtonReplace.Text = "Replace"; - this.toolStripButtonReplace.ToolTipText = "Replace"; - this.toolStripButtonReplace.Click += new System.EventHandler(this.ToolStripButtonReplaceClick); - // - // toolStripSeparatorFixSyncSpell - // - this.toolStripSeparatorFixSyncSpell.Name = "toolStripSeparatorFixSyncSpell"; - this.toolStripSeparatorFixSyncSpell.Size = new System.Drawing.Size(6, 40); - // - // toolStripButtonFixCommonErrors - // - this.toolStripButtonFixCommonErrors.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.toolStripButtonFixCommonErrors.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.toolStripButtonFixCommonErrors.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonFixCommonErrors.Image"))); - this.toolStripButtonFixCommonErrors.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; - this.toolStripButtonFixCommonErrors.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButtonFixCommonErrors.Name = "toolStripButtonFixCommonErrors"; - this.toolStripButtonFixCommonErrors.Size = new System.Drawing.Size(36, 37); - this.toolStripButtonFixCommonErrors.Text = "Fix common errors"; - this.toolStripButtonFixCommonErrors.ToolTipText = "Fix common errors"; - this.toolStripButtonFixCommonErrors.Click += new System.EventHandler(this.toolStripButtonFixCommonErrors_Click); - // - // toolStripButtonRemoveTextForHi - // - this.toolStripButtonRemoveTextForHi.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.toolStripButtonRemoveTextForHi.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.toolStripButtonRemoveTextForHi.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonRemoveTextForHi.Image"))); - this.toolStripButtonRemoveTextForHi.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; - this.toolStripButtonRemoveTextForHi.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButtonRemoveTextForHi.Name = "toolStripButtonRemoveTextForHi"; - this.toolStripButtonRemoveTextForHi.Size = new System.Drawing.Size(36, 37); - this.toolStripButtonRemoveTextForHi.Text = "Remove text for HI"; - this.toolStripButtonRemoveTextForHi.ToolTipText = "Fix common errors"; - this.toolStripButtonRemoveTextForHi.Click += new System.EventHandler(this.toolStripButtonRemoveTextForHi_Click); - // - // toolStripButtonVisualSync - // - this.toolStripButtonVisualSync.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.toolStripButtonVisualSync.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.toolStripButtonVisualSync.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonVisualSync.Image"))); - this.toolStripButtonVisualSync.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; - this.toolStripButtonVisualSync.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButtonVisualSync.Name = "toolStripButtonVisualSync"; - this.toolStripButtonVisualSync.Size = new System.Drawing.Size(36, 37); - this.toolStripButtonVisualSync.Text = "Visual sync"; - this.toolStripButtonVisualSync.Click += new System.EventHandler(this.ToolStripButtonVisualSyncClick); - // - // toolStripButtonSpellCheck - // - this.toolStripButtonSpellCheck.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.toolStripButtonSpellCheck.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F); - this.toolStripButtonSpellCheck.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonSpellCheck.Image"))); - this.toolStripButtonSpellCheck.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; - this.toolStripButtonSpellCheck.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButtonSpellCheck.Name = "toolStripButtonSpellCheck"; - this.toolStripButtonSpellCheck.Size = new System.Drawing.Size(36, 37); - this.toolStripButtonSpellCheck.Text = "Spell check"; - this.toolStripButtonSpellCheck.Click += new System.EventHandler(this.ToolStripButtonSpellCheckClick); - // - // toolStripButtonNetflixQualityCheck - // - this.toolStripButtonNetflixQualityCheck.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.toolStripButtonNetflixQualityCheck.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonNetflixQualityCheck.Image"))); - this.toolStripButtonNetflixQualityCheck.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; - this.toolStripButtonNetflixQualityCheck.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButtonNetflixQualityCheck.Name = "toolStripButtonNetflixQualityCheck"; - this.toolStripButtonNetflixQualityCheck.Size = new System.Drawing.Size(36, 37); - this.toolStripButtonNetflixQualityCheck.Text = "Netflix quality check"; - this.toolStripButtonNetflixQualityCheck.Click += new System.EventHandler(this.toolStripButtonNetflixGlyphCheck_Click); - // - // toolStripButtonSettings - // - this.toolStripButtonSettings.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.toolStripButtonSettings.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F); - this.toolStripButtonSettings.Image = global::Nikse.SubtitleEdit.Properties.Resources.Settings; - this.toolStripButtonSettings.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; - this.toolStripButtonSettings.ImageTransparentColor = System.Drawing.Color.Transparent; - this.toolStripButtonSettings.Name = "toolStripButtonSettings"; - this.toolStripButtonSettings.Size = new System.Drawing.Size(36, 37); - this.toolStripButtonSettings.Text = "Settings"; - this.toolStripButtonSettings.Click += new System.EventHandler(this.ToolStripButtonSettingsClick); - // - // toolStripSeparatorHelp - // - this.toolStripSeparatorHelp.Name = "toolStripSeparatorHelp"; - this.toolStripSeparatorHelp.Size = new System.Drawing.Size(6, 40); - // - // toolStripButtonHelp - // - this.toolStripButtonHelp.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.toolStripButtonHelp.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F); - this.toolStripButtonHelp.Image = global::Nikse.SubtitleEdit.Properties.Resources.Help; - this.toolStripButtonHelp.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; - this.toolStripButtonHelp.ImageTransparentColor = System.Drawing.Color.Transparent; - this.toolStripButtonHelp.Name = "toolStripButtonHelp"; - this.toolStripButtonHelp.Size = new System.Drawing.Size(36, 37); - this.toolStripButtonHelp.Text = "Help"; - this.toolStripButtonHelp.Click += new System.EventHandler(this.ToolStripButtonHelpClick); - // - // toolStripSeparatorToggle - // - this.toolStripSeparatorToggle.Name = "toolStripSeparatorToggle"; - this.toolStripSeparatorToggle.Size = new System.Drawing.Size(6, 40); - // - // toolStripButtonToggleWaveform - // - this.toolStripButtonToggleWaveform.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.toolStripButtonToggleWaveform.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F); - this.toolStripButtonToggleWaveform.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonToggleWaveform.Image"))); - this.toolStripButtonToggleWaveform.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; - this.toolStripButtonToggleWaveform.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButtonToggleWaveform.Name = "toolStripButtonToggleWaveform"; - this.toolStripButtonToggleWaveform.Size = new System.Drawing.Size(36, 37); - this.toolStripButtonToggleWaveform.Text = "Show/hide waveform"; - this.toolStripButtonToggleWaveform.Click += new System.EventHandler(this.toolStripButtonToggleWaveform_Click); - // - // toolStripButtonToggleVideo - // - this.toolStripButtonToggleVideo.Checked = true; - this.toolStripButtonToggleVideo.CheckState = System.Windows.Forms.CheckState.Checked; - this.toolStripButtonToggleVideo.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.toolStripButtonToggleVideo.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F); - this.toolStripButtonToggleVideo.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonToggleVideo.Image"))); - this.toolStripButtonToggleVideo.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; - this.toolStripButtonToggleVideo.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButtonToggleVideo.Name = "toolStripButtonToggleVideo"; - this.toolStripButtonToggleVideo.Size = new System.Drawing.Size(36, 37); - this.toolStripButtonToggleVideo.Text = "Show/hide video"; - this.toolStripButtonToggleVideo.Click += new System.EventHandler(this.toolStripButtonToggleVideo_Click); - // - // toolStripSeparatorSubtitleFormat - // - this.toolStripSeparatorSubtitleFormat.Name = "toolStripSeparatorSubtitleFormat"; - this.toolStripSeparatorSubtitleFormat.Size = new System.Drawing.Size(6, 40); - // - // toolStripLabelSubtitleFormat - // - this.toolStripLabelSubtitleFormat.Name = "toolStripLabelSubtitleFormat"; - this.toolStripLabelSubtitleFormat.Size = new System.Drawing.Size(86, 37); - this.toolStripLabelSubtitleFormat.Text = "Subtitle format"; - // - // comboBoxSubtitleFormats - // - this.comboBoxSubtitleFormats.DropDownHeight = 215; - this.comboBoxSubtitleFormats.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxSubtitleFormats.FlatStyle = System.Windows.Forms.FlatStyle.Standard; - this.comboBoxSubtitleFormats.IntegralHeight = false; - this.comboBoxSubtitleFormats.Name = "comboBoxSubtitleFormats"; - this.comboBoxSubtitleFormats.Size = new System.Drawing.Size(150, 40); - this.comboBoxSubtitleFormats.DropDown += new System.EventHandler(this.comboBoxSubtitleFormats_DropDown); - this.comboBoxSubtitleFormats.DropDownClosed += new System.EventHandler(this.comboBoxSubtitleFormats_DropDownClosed); - this.comboBoxSubtitleFormats.SelectedIndexChanged += new System.EventHandler(this.ComboBoxSubtitleFormatsSelectedIndexChanged); - this.comboBoxSubtitleFormats.Enter += new System.EventHandler(this.ComboBoxSubtitleFormatsEnter); - // - // toolStripSeparatorEncoding - // - this.toolStripSeparatorEncoding.Name = "toolStripSeparatorEncoding"; - this.toolStripSeparatorEncoding.Size = new System.Drawing.Size(6, 40); - // - // toolStripLabelEncoding - // - this.toolStripLabelEncoding.Name = "toolStripLabelEncoding"; - this.toolStripLabelEncoding.Size = new System.Drawing.Size(81, 37); - this.toolStripLabelEncoding.Text = "File encoding"; - // - // comboBoxEncoding - // - this.comboBoxEncoding.DropDownHeight = 215; - this.comboBoxEncoding.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxEncoding.FlatStyle = System.Windows.Forms.FlatStyle.Standard; - this.comboBoxEncoding.IntegralHeight = false; - this.comboBoxEncoding.Items.AddRange(new object[] { - "ANSI", - "UTF-7", - "UTF-8", - "Unicode", - "Unicode (big endian)"}); - this.comboBoxEncoding.Name = "comboBoxEncoding"; - this.comboBoxEncoding.Size = new System.Drawing.Size(129, 23); - this.comboBoxEncoding.DropDown += new System.EventHandler(this.MenuOpened); - this.comboBoxEncoding.DropDownClosed += new System.EventHandler(this.MenuClosed); - // - // toolStripSeparatorFrameRate - // - this.toolStripSeparatorFrameRate.Name = "toolStripSeparatorFrameRate"; - this.toolStripSeparatorFrameRate.Size = new System.Drawing.Size(6, 40); - // - // toolStripLabelFrameRate - // - this.toolStripLabelFrameRate.Name = "toolStripLabelFrameRate"; - this.toolStripLabelFrameRate.Size = new System.Drawing.Size(67, 15); - this.toolStripLabelFrameRate.Text = "Frame rate"; - // - // toolStripComboBoxFrameRate - // - this.toolStripComboBoxFrameRate.DropDownWidth = 75; - this.toolStripComboBoxFrameRate.FlatStyle = System.Windows.Forms.FlatStyle.Standard; - this.toolStripComboBoxFrameRate.Name = "toolStripComboBoxFrameRate"; - this.toolStripComboBoxFrameRate.Size = new System.Drawing.Size(75, 23); - this.toolStripComboBoxFrameRate.DropDown += new System.EventHandler(this.MenuOpened); - this.toolStripComboBoxFrameRate.DropDownClosed += new System.EventHandler(this.MenuClosed); - this.toolStripComboBoxFrameRate.TextChanged += new System.EventHandler(this.ToolStripComboBoxFrameRateTextChanged); - // - // toolStripButtonGetFrameRate - // - this.toolStripButtonGetFrameRate.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - this.toolStripButtonGetFrameRate.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonGetFrameRate.Image"))); - this.toolStripButtonGetFrameRate.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButtonGetFrameRate.Name = "toolStripButtonGetFrameRate"; - this.toolStripButtonGetFrameRate.Size = new System.Drawing.Size(23, 19); - this.toolStripButtonGetFrameRate.Text = "..."; - this.toolStripButtonGetFrameRate.ToolTipText = "Get frame rate from video file"; - this.toolStripButtonGetFrameRate.Click += new System.EventHandler(this.ButtonGetFrameRateClick); - // - // menuStrip1 - // - this.menuStrip1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.fileToolStripMenuItem, - this.editToolStripMenuItem, - this.toolsToolStripMenuItem, - this.toolStripMenuItemSpellCheckMain, - this.toolStripMenuItemVideo, - this.toolStripMenuItemSynchronization, - this.toolStripMenuItemAutoTranslate, - this.optionsToolStripMenuItem, - this.toolStripMenuItemNetworking, - this.helpToolStripMenuItem}); - this.menuStrip1.Location = new System.Drawing.Point(0, 0); - this.menuStrip1.Name = "menuStrip1"; - this.menuStrip1.Size = new System.Drawing.Size(975, 24); - this.menuStrip1.TabIndex = 6; - this.menuStrip1.Text = "menuStrip1"; - // - // fileToolStripMenuItem - // - this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.newToolStripMenuItem, - this.openToolStripMenuItem, - this.toolStripMenuItemOpenKeepVideo, - this.reopenToolStripMenuItem, - this.saveToolStripMenuItem, - this.saveAsToolStripMenuItem, - this.toolStripMenuItemRestoreAutoBackup, - this.toolStripMenuItemDCinemaProperties, - this.toolStripMenuItemTTProperties, - this.toolStripMenuItemNuendoProperties, - this.toolStripMenuItemFcpProperties, - this.toolStripMenuItemSubStationAlpha, - this.toolStripMenuItemAssaStyles, - this.toolStripMenuItemEbuProperties, - this.toolStripMenuItemDvdStudioProProperties, - this.toolStripSeparator20, - this.openOriginalToolStripMenuItem, - this.saveOriginalToolStripMenuItem, - this.saveOriginalAstoolStripMenuItem, - this.removeOriginalToolStripMenuItem, - this.toolStripSeparator12, - this.toolStripMenuItemOpenContainingFolder, - this.toolStripMenuItemCompare, - this.toolStripMenuItemStatistics, - this.toolStripMenuItemPlugins, - this.toolStripSeparator1, - this.toolStripMenuItemImportDvdSubtitles, - this.toolStripMenuItemSubIdx, - this.toolStripMenuItemImportBluRaySup, - this.toolStripMenuItemImportXSub, - this.toolStripMenuItemImportOcrHardSub, - this.matroskaImportStripMenuItem, - this.toolStripMenuItemManualAnsi, - this.toolStripMenuItemImportText, - this.toolStripMenuItemImportImages, - this.toolStripMenuItemImportTimeCodes, - this.toolStripSeparator22, - this.toolStripMenuItemExport, - this.toolStripSeparator10, - this.exitToolStripMenuItem}); - this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; - this.fileToolStripMenuItem.Size = new System.Drawing.Size(39, 20); - this.fileToolStripMenuItem.Text = "File"; - this.fileToolStripMenuItem.DropDownOpening += new System.EventHandler(this.fileToolStripMenuItem_DropDownOpening); - // - // newToolStripMenuItem - // - this.newToolStripMenuItem.Name = "newToolStripMenuItem"; - this.newToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N))); - this.newToolStripMenuItem.Size = new System.Drawing.Size(335, 22); - this.newToolStripMenuItem.Text = "New"; - this.newToolStripMenuItem.Click += new System.EventHandler(this.NewToolStripMenuItemClick); - // - // openToolStripMenuItem - // - this.openToolStripMenuItem.Name = "openToolStripMenuItem"; - this.openToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O))); - this.openToolStripMenuItem.Size = new System.Drawing.Size(335, 22); - this.openToolStripMenuItem.Text = "Open"; - this.openToolStripMenuItem.Click += new System.EventHandler(this.OpenToolStripMenuItemClick); - // - // toolStripMenuItemOpenKeepVideo - // - this.toolStripMenuItemOpenKeepVideo.Name = "toolStripMenuItemOpenKeepVideo"; - this.toolStripMenuItemOpenKeepVideo.Size = new System.Drawing.Size(335, 22); - this.toolStripMenuItemOpenKeepVideo.Text = "Open (keep video)"; - this.toolStripMenuItemOpenKeepVideo.Click += new System.EventHandler(this.toolStripMenuItemOpenKeepVideo_Click); - // - // reopenToolStripMenuItem - // - this.reopenToolStripMenuItem.Name = "reopenToolStripMenuItem"; - this.reopenToolStripMenuItem.Size = new System.Drawing.Size(335, 22); - this.reopenToolStripMenuItem.Text = "Reopen"; - // - // saveToolStripMenuItem - // - this.saveToolStripMenuItem.Name = "saveToolStripMenuItem"; - this.saveToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); - this.saveToolStripMenuItem.Size = new System.Drawing.Size(335, 22); - this.saveToolStripMenuItem.Text = "Save"; - this.saveToolStripMenuItem.Click += new System.EventHandler(this.SaveToolStripMenuItemClick); - // - // saveAsToolStripMenuItem - // - this.saveAsToolStripMenuItem.Name = "saveAsToolStripMenuItem"; - this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(335, 22); - this.saveAsToolStripMenuItem.Text = "Save as..."; - this.saveAsToolStripMenuItem.Click += new System.EventHandler(this.SaveAsToolStripMenuItemClick); - // - // toolStripMenuItemRestoreAutoBackup - // - this.toolStripMenuItemRestoreAutoBackup.Name = "toolStripMenuItemRestoreAutoBackup"; - this.toolStripMenuItemRestoreAutoBackup.Size = new System.Drawing.Size(335, 22); - this.toolStripMenuItemRestoreAutoBackup.Text = "Restore auto-backup..."; - this.toolStripMenuItemRestoreAutoBackup.Click += new System.EventHandler(this.toolStripMenuItemRestoreAutoBackup_Click); - // - // toolStripMenuItemDCinemaProperties - // - this.toolStripMenuItemDCinemaProperties.Name = "toolStripMenuItemDCinemaProperties"; - this.toolStripMenuItemDCinemaProperties.Size = new System.Drawing.Size(335, 22); - this.toolStripMenuItemDCinemaProperties.Text = "DCinema properties..."; - this.toolStripMenuItemDCinemaProperties.Click += new System.EventHandler(this.toolStripMenuItemDCinemaProperties_Click); - // - // toolStripMenuItemTTProperties - // - this.toolStripMenuItemTTProperties.Name = "toolStripMenuItemTTProperties"; - this.toolStripMenuItemTTProperties.Size = new System.Drawing.Size(335, 22); - this.toolStripMenuItemTTProperties.Text = "Timed Text properties..."; - this.toolStripMenuItemTTProperties.Click += new System.EventHandler(this.toolStripMenuItemTTPropertiesClick); - // - // toolStripMenuItemNuendoProperties - // - this.toolStripMenuItemNuendoProperties.Name = "toolStripMenuItemNuendoProperties"; - this.toolStripMenuItemNuendoProperties.Size = new System.Drawing.Size(335, 22); - this.toolStripMenuItemNuendoProperties.Text = "Nuendo properties..."; - this.toolStripMenuItemNuendoProperties.Click += new System.EventHandler(this.ToolStripMenuItemNuendoPropertiesClick); - // - // toolStripMenuItemFcpProperties - // - this.toolStripMenuItemFcpProperties.Name = "toolStripMenuItemFcpProperties"; - this.toolStripMenuItemFcpProperties.Size = new System.Drawing.Size(335, 22); - this.toolStripMenuItemFcpProperties.Text = "Final Cut Pro properties..."; - this.toolStripMenuItemFcpProperties.Click += new System.EventHandler(this.toolStripMenuItemFcpProperties_Click); - // - // toolStripMenuItemSubStationAlpha - // - this.toolStripMenuItemSubStationAlpha.Name = "toolStripMenuItemSubStationAlpha"; - this.toolStripMenuItemSubStationAlpha.Size = new System.Drawing.Size(335, 22); - this.toolStripMenuItemSubStationAlpha.Text = "Advanced Sub Station Alpha properties..."; - this.toolStripMenuItemSubStationAlpha.Click += new System.EventHandler(this.toolStripMenuItemSubStationAlpha_Click); - // - // toolStripMenuItemAssaStyles - // - this.toolStripMenuItemAssaStyles.Name = "toolStripMenuItemAssaStyles"; - this.toolStripMenuItemAssaStyles.Size = new System.Drawing.Size(335, 22); - this.toolStripMenuItemAssaStyles.Text = "Advanced Sub Station Alpha styles..."; - this.toolStripMenuItemAssaStyles.Click += new System.EventHandler(this.toolStripMenuItemAssaStyles_Click); - // - // toolStripMenuItemEbuProperties - // - this.toolStripMenuItemEbuProperties.Name = "toolStripMenuItemEbuProperties"; - this.toolStripMenuItemEbuProperties.Size = new System.Drawing.Size(335, 22); - this.toolStripMenuItemEbuProperties.Text = "Ebu properties..."; - this.toolStripMenuItemEbuProperties.Click += new System.EventHandler(this.toolStripMenuItemEbuProperties_Click); - // - // toolStripMenuItemDvdStudioProProperties - // - this.toolStripMenuItemDvdStudioProProperties.Name = "toolStripMenuItemDvdStudioProProperties"; - this.toolStripMenuItemDvdStudioProProperties.Size = new System.Drawing.Size(335, 22); - this.toolStripMenuItemDvdStudioProProperties.Text = "DVD Studio Pro properties..."; - this.toolStripMenuItemDvdStudioProProperties.Click += new System.EventHandler(this.toolStripMenuDvdStudioProperties_Click); - // - // toolStripSeparator20 - // - this.toolStripSeparator20.Name = "toolStripSeparator20"; - this.toolStripSeparator20.Size = new System.Drawing.Size(332, 6); - // - // openOriginalToolStripMenuItem - // - this.openOriginalToolStripMenuItem.Name = "openOriginalToolStripMenuItem"; - this.openOriginalToolStripMenuItem.Size = new System.Drawing.Size(335, 22); - this.openOriginalToolStripMenuItem.Text = "Open original (translator mode)..."; - this.openOriginalToolStripMenuItem.Click += new System.EventHandler(this.OpenOriginalToolStripMenuItemClick); - // - // saveOriginalToolStripMenuItem - // - this.saveOriginalToolStripMenuItem.Name = "saveOriginalToolStripMenuItem"; - this.saveOriginalToolStripMenuItem.Size = new System.Drawing.Size(335, 22); - this.saveOriginalToolStripMenuItem.Text = "Save original"; - this.saveOriginalToolStripMenuItem.Click += new System.EventHandler(this.SaveOriginalToolStripMenuItemClick); - // - // saveOriginalAstoolStripMenuItem - // - this.saveOriginalAstoolStripMenuItem.Name = "saveOriginalAstoolStripMenuItem"; - this.saveOriginalAstoolStripMenuItem.Size = new System.Drawing.Size(335, 22); - this.saveOriginalAstoolStripMenuItem.Text = "Save original as..."; - this.saveOriginalAstoolStripMenuItem.Click += new System.EventHandler(this.SaveOriginalAstoolStripMenuItemClick); - // - // removeOriginalToolStripMenuItem - // - this.removeOriginalToolStripMenuItem.Name = "removeOriginalToolStripMenuItem"; - this.removeOriginalToolStripMenuItem.Size = new System.Drawing.Size(335, 22); - this.removeOriginalToolStripMenuItem.Text = "Remove original"; - this.removeOriginalToolStripMenuItem.Click += new System.EventHandler(this.RemoveOriginalToolStripMenuItemClick); - // - // toolStripSeparator12 - // - this.toolStripSeparator12.Name = "toolStripSeparator12"; - this.toolStripSeparator12.Size = new System.Drawing.Size(332, 6); - // - // toolStripMenuItemOpenContainingFolder - // - this.toolStripMenuItemOpenContainingFolder.Name = "toolStripMenuItemOpenContainingFolder"; - this.toolStripMenuItemOpenContainingFolder.Size = new System.Drawing.Size(335, 22); - this.toolStripMenuItemOpenContainingFolder.Text = "Open containing folder"; - this.toolStripMenuItemOpenContainingFolder.Click += new System.EventHandler(this.toolStripMenuItemOpenContainingFolder_Click); - // - // toolStripMenuItemCompare - // - this.toolStripMenuItemCompare.Name = "toolStripMenuItemCompare"; - this.toolStripMenuItemCompare.Size = new System.Drawing.Size(335, 22); - this.toolStripMenuItemCompare.Text = "Compare..."; - this.toolStripMenuItemCompare.Click += new System.EventHandler(this.ToolStripMenuItemCompareClick); - // - // toolStripMenuItemStatistics - // - this.toolStripMenuItemStatistics.Name = "toolStripMenuItemStatistics"; - this.toolStripMenuItemStatistics.Size = new System.Drawing.Size(335, 22); - this.toolStripMenuItemStatistics.Text = "Statistics..."; - this.toolStripMenuItemStatistics.Click += new System.EventHandler(this.toolStripMenuItemStatistics_Click); - // - // toolStripMenuItemPlugins - // - this.toolStripMenuItemPlugins.Name = "toolStripMenuItemPlugins"; - this.toolStripMenuItemPlugins.Size = new System.Drawing.Size(335, 22); - this.toolStripMenuItemPlugins.Text = "Plugins..."; - this.toolStripMenuItemPlugins.Click += new System.EventHandler(this.toolStripMenuItemPlugins_Click); - // - // toolStripSeparator1 - // - this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(332, 6); - // - // toolStripMenuItemImportDvdSubtitles - // - this.toolStripMenuItemImportDvdSubtitles.Name = "toolStripMenuItemImportDvdSubtitles"; - this.toolStripMenuItemImportDvdSubtitles.Size = new System.Drawing.Size(335, 22); - this.toolStripMenuItemImportDvdSubtitles.Text = "Import/OCR subtitle from VOB/IFO (DVD) ..."; - this.toolStripMenuItemImportDvdSubtitles.Click += new System.EventHandler(this.ToolStripMenuItemImportDvdSubtitlesClick); - // - // toolStripMenuItemSubIdx - // - this.toolStripMenuItemSubIdx.Name = "toolStripMenuItemSubIdx"; - this.toolStripMenuItemSubIdx.Size = new System.Drawing.Size(335, 22); - this.toolStripMenuItemSubIdx.Text = "Import/OCR VobSub (sub/idx) subtitle..."; - this.toolStripMenuItemSubIdx.Click += new System.EventHandler(this.ToolStripMenuItemSubIdxClick1); - // - // toolStripMenuItemImportBluRaySup - // - this.toolStripMenuItemImportBluRaySup.Name = "toolStripMenuItemImportBluRaySup"; - this.toolStripMenuItemImportBluRaySup.Size = new System.Drawing.Size(335, 22); - this.toolStripMenuItemImportBluRaySup.Text = "Import/OCR Blu-ray sup file..."; - this.toolStripMenuItemImportBluRaySup.Click += new System.EventHandler(this.toolStripMenuItemImportBluRaySup_Click); - // - // toolStripMenuItemImportXSub - // - this.toolStripMenuItemImportXSub.Name = "toolStripMenuItemImportXSub"; - this.toolStripMenuItemImportXSub.Size = new System.Drawing.Size(335, 22); - this.toolStripMenuItemImportXSub.Text = "Import/OCR XSub from divx/avi..."; - this.toolStripMenuItemImportXSub.Click += new System.EventHandler(this.toolStripMenuItemImportXSub_Click); - // - // toolStripMenuItemImportOcrHardSub - // - this.toolStripMenuItemImportOcrHardSub.Name = "toolStripMenuItemImportOcrHardSub"; - this.toolStripMenuItemImportOcrHardSub.Size = new System.Drawing.Size(335, 22); - this.toolStripMenuItemImportOcrHardSub.Text = "Import/OCR burned-in subtitles from video file..."; - this.toolStripMenuItemImportOcrHardSub.Click += new System.EventHandler(this.toolStripMenuItemImportOcrHardSub_Click); - // - // matroskaImportStripMenuItem - // - this.matroskaImportStripMenuItem.Name = "matroskaImportStripMenuItem"; - this.matroskaImportStripMenuItem.Size = new System.Drawing.Size(335, 22); - this.matroskaImportStripMenuItem.Text = "Import subtitle from Matroska file..."; - this.matroskaImportStripMenuItem.Click += new System.EventHandler(this.MatroskaImportStripMenuItemClick); - // - // toolStripMenuItemManualAnsi - // - this.toolStripMenuItemManualAnsi.Name = "toolStripMenuItemManualAnsi"; - this.toolStripMenuItemManualAnsi.Size = new System.Drawing.Size(335, 22); - this.toolStripMenuItemManualAnsi.Text = "Import subtitle with manually chosen encoding..."; - this.toolStripMenuItemManualAnsi.Click += new System.EventHandler(this.ToolStripMenuItemManualAnsiClick); - // - // toolStripMenuItemImportText - // - this.toolStripMenuItemImportText.Name = "toolStripMenuItemImportText"; - this.toolStripMenuItemImportText.Size = new System.Drawing.Size(335, 22); - this.toolStripMenuItemImportText.Text = "Import text..."; - this.toolStripMenuItemImportText.Click += new System.EventHandler(this.ToolStripMenuItemImportTextClick); - // - // toolStripMenuItemImportImages - // - this.toolStripMenuItemImportImages.Name = "toolStripMenuItemImportImages"; - this.toolStripMenuItemImportImages.Size = new System.Drawing.Size(335, 22); - this.toolStripMenuItemImportImages.Text = "Import images..."; - this.toolStripMenuItemImportImages.Click += new System.EventHandler(this.toolStripMenuItemImportImages_Click); - // - // toolStripMenuItemImportTimeCodes - // - this.toolStripMenuItemImportTimeCodes.Name = "toolStripMenuItemImportTimeCodes"; - this.toolStripMenuItemImportTimeCodes.Size = new System.Drawing.Size(335, 22); - this.toolStripMenuItemImportTimeCodes.Text = "Import time codes into existing subtitle..."; - this.toolStripMenuItemImportTimeCodes.Click += new System.EventHandler(this.toolStripMenuItemImportTimeCodes_Click); - // - // toolStripSeparator22 - // - this.toolStripSeparator22.Name = "toolStripSeparator22"; - this.toolStripSeparator22.Size = new System.Drawing.Size(332, 6); - // - // toolStripMenuItemExport - // - this.toolStripMenuItemExport.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.adobeEncoreFABImageScriptToolStripMenuItem, - this.toolStripMenuItemAvidStl, - this.toolStripMenuItemExportAyato, - this.toolStripMenuItemExportPngXml, - this.bluraySupToolStripMenuItem, - this.toolStripMenuItemExportBdTextSt, - this.toolStripMenuItemExportCapMakerPlus, - this.toolStripMenuItemExportCaptionInc, - this.toolStripMenuItemCavena890, - this.toolStripMenuItemExportCheetahCap, - this.toolStripMenuItemExportDcinemaInterop, - this.dCinemaSMPTE2014ToolStripMenuItem, - this.toolStripMenuItemDost, - this.DvdStudioProStl, - this.eBUSTLToolStripMenuItem, - this.toolStripMenuItemEdl, - this.toolStripMenuItemEdlClipName, - this.toolStripMenuItemExportFcpIImage, - this.toolStripMenuItemFcpXmlAdvanced, - this.toolStripMenuItemImagePerFrame, - this.toolStripMenuItemTextTimeCodePair, - this.pACScreenElectronicsToolStripMenuItem, - this.uniPacExportToolStripMenuItem, - this.plainTextToolStripMenuItem, - this.toolStripMenuItemSpumux, - this.toolStripMenuItemExportUltech130, - this.vobSubsubidxToolStripMenuItem, - this.toolStripSeparatorExportCustomText, - this.exportCustomTextFormatToolStripMenuItem}); - this.toolStripMenuItemExport.Name = "toolStripMenuItemExport"; - this.toolStripMenuItemExport.Size = new System.Drawing.Size(335, 22); - this.toolStripMenuItemExport.Text = "Export"; - // - // adobeEncoreFABImageScriptToolStripMenuItem - // - this.adobeEncoreFABImageScriptToolStripMenuItem.Name = "adobeEncoreFABImageScriptToolStripMenuItem"; - this.adobeEncoreFABImageScriptToolStripMenuItem.Size = new System.Drawing.Size(255, 22); - this.adobeEncoreFABImageScriptToolStripMenuItem.Text = "Adobe Encore FAB image script..."; - this.adobeEncoreFABImageScriptToolStripMenuItem.Click += new System.EventHandler(this.AdobeEncoreFabImageScriptToolStripMenuItemClick); - // - // toolStripMenuItemAvidStl - // - this.toolStripMenuItemAvidStl.Name = "toolStripMenuItemAvidStl"; - this.toolStripMenuItemAvidStl.Size = new System.Drawing.Size(255, 22); - this.toolStripMenuItemAvidStl.Text = "Avid STL..."; - this.toolStripMenuItemAvidStl.Click += new System.EventHandler(this.toolStripMenuItemAvidStl_Click); - // - // toolStripMenuItemExportAyato - // - this.toolStripMenuItemExportAyato.Name = "toolStripMenuItemExportAyato"; - this.toolStripMenuItemExportAyato.Size = new System.Drawing.Size(255, 22); - this.toolStripMenuItemExportAyato.Text = "Ayato..."; - this.toolStripMenuItemExportAyato.Click += new System.EventHandler(this.toolStripMenuItemExportAyato_Click); - // - // toolStripMenuItemExportPngXml - // - this.toolStripMenuItemExportPngXml.Name = "toolStripMenuItemExportPngXml"; - this.toolStripMenuItemExportPngXml.Size = new System.Drawing.Size(255, 22); - this.toolStripMenuItemExportPngXml.Text = "BDN xml/png..."; - this.toolStripMenuItemExportPngXml.Click += new System.EventHandler(this.ToolStripMenuItemExportPngXmlClick); - // - // bluraySupToolStripMenuItem - // - this.bluraySupToolStripMenuItem.Name = "bluraySupToolStripMenuItem"; - this.bluraySupToolStripMenuItem.Size = new System.Drawing.Size(255, 22); - this.bluraySupToolStripMenuItem.Text = "Blu-ray sup..."; - this.bluraySupToolStripMenuItem.Click += new System.EventHandler(this.BluraySupToolStripMenuItemClick); - // - // toolStripMenuItemExportBdTextSt - // - this.toolStripMenuItemExportBdTextSt.Name = "toolStripMenuItemExportBdTextSt"; - this.toolStripMenuItemExportBdTextSt.Size = new System.Drawing.Size(255, 22); - this.toolStripMenuItemExportBdTextSt.Text = "Blu-ray TextST..."; - this.toolStripMenuItemExportBdTextSt.Click += new System.EventHandler(this.toolStripMenuItemExportBdTextSt_Click); - // - // toolStripMenuItemExportCapMakerPlus - // - this.toolStripMenuItemExportCapMakerPlus.Name = "toolStripMenuItemExportCapMakerPlus"; - this.toolStripMenuItemExportCapMakerPlus.Size = new System.Drawing.Size(255, 22); - this.toolStripMenuItemExportCapMakerPlus.Text = "CapMaker Plus..."; - this.toolStripMenuItemExportCapMakerPlus.Click += new System.EventHandler(this.toolStripMenuItemExportCapMakerPlus_Click); - // - // toolStripMenuItemExportCaptionInc - // - this.toolStripMenuItemExportCaptionInc.Name = "toolStripMenuItemExportCaptionInc"; - this.toolStripMenuItemExportCaptionInc.Size = new System.Drawing.Size(255, 22); - this.toolStripMenuItemExportCaptionInc.Text = "Captions Inc..."; - this.toolStripMenuItemExportCaptionInc.Click += new System.EventHandler(this.toolStripMenuItemExportCaptionInc_Click); - // - // toolStripMenuItemCavena890 - // - this.toolStripMenuItemCavena890.Name = "toolStripMenuItemCavena890"; - this.toolStripMenuItemCavena890.Size = new System.Drawing.Size(255, 22); - this.toolStripMenuItemCavena890.Text = "Cavena 890..."; - this.toolStripMenuItemCavena890.Click += new System.EventHandler(this.ToolStripMenuItemCavena890Click); - // - // toolStripMenuItemExportCheetahCap - // - this.toolStripMenuItemExportCheetahCap.Name = "toolStripMenuItemExportCheetahCap"; - this.toolStripMenuItemExportCheetahCap.Size = new System.Drawing.Size(255, 22); - this.toolStripMenuItemExportCheetahCap.Text = "Cheetah CAP..."; - this.toolStripMenuItemExportCheetahCap.Click += new System.EventHandler(this.toolStripMenuItemExportCheetahCap_Click); - // - // toolStripMenuItemExportDcinemaInterop - // - this.toolStripMenuItemExportDcinemaInterop.Name = "toolStripMenuItemExportDcinemaInterop"; - this.toolStripMenuItemExportDcinemaInterop.Size = new System.Drawing.Size(255, 22); - this.toolStripMenuItemExportDcinemaInterop.Text = "D-Cinema interop/png..."; - this.toolStripMenuItemExportDcinemaInterop.Click += new System.EventHandler(this.toolStripMenuItemExportDcinemaInteropClick); - // - // dCinemaSMPTE2014ToolStripMenuItem - // - this.dCinemaSMPTE2014ToolStripMenuItem.Name = "dCinemaSMPTE2014ToolStripMenuItem"; - this.dCinemaSMPTE2014ToolStripMenuItem.Size = new System.Drawing.Size(255, 22); - this.dCinemaSMPTE2014ToolStripMenuItem.Text = "D-Cinema SMPTE 2014"; - this.dCinemaSMPTE2014ToolStripMenuItem.Click += new System.EventHandler(this.dCinemaSMPTE2014ToolStripMenuItem_Click); - // - // toolStripMenuItemDost - // - this.toolStripMenuItemDost.Name = "toolStripMenuItemDost"; - this.toolStripMenuItemDost.Size = new System.Drawing.Size(255, 22); - this.toolStripMenuItemDost.Text = "DOST..."; - this.toolStripMenuItemDost.Click += new System.EventHandler(this.toolStripMenuItemDost_Click); - // - // DvdStudioProStl - // - this.DvdStudioProStl.Name = "DvdStudioProStl"; - this.DvdStudioProStl.Size = new System.Drawing.Size(255, 22); - this.DvdStudioProStl.Text = "DVD Studio Pro STL"; - this.DvdStudioProStl.Click += new System.EventHandler(this.DvdStudioProStl_Click); - // - // eBUSTLToolStripMenuItem - // - this.eBUSTLToolStripMenuItem.Name = "eBUSTLToolStripMenuItem"; - this.eBUSTLToolStripMenuItem.Size = new System.Drawing.Size(255, 22); - this.eBUSTLToolStripMenuItem.Text = "EBU STL..."; - this.eBUSTLToolStripMenuItem.Click += new System.EventHandler(this.EBustlToolStripMenuItemClick); - // - // toolStripMenuItemEdl - // - this.toolStripMenuItemEdl.Name = "toolStripMenuItemEdl"; - this.toolStripMenuItemEdl.Size = new System.Drawing.Size(255, 22); - this.toolStripMenuItemEdl.Text = "EDL..."; - this.toolStripMenuItemEdl.Click += new System.EventHandler(this.ExportToEdl); - // - // toolStripMenuItemEdlClipName - // - this.toolStripMenuItemEdlClipName.Name = "toolStripMenuItemEdlClipName"; - this.toolStripMenuItemEdlClipName.Size = new System.Drawing.Size(255, 22); - this.toolStripMenuItemEdlClipName.Text = "EDL/CLIPNAME..."; - this.toolStripMenuItemEdlClipName.Click += new System.EventHandler(this.ExportToEdlWithClipName); - // - // toolStripMenuItemExportFcpIImage - // - this.toolStripMenuItemExportFcpIImage.Name = "toolStripMenuItemExportFcpIImage"; - this.toolStripMenuItemExportFcpIImage.Size = new System.Drawing.Size(255, 22); - this.toolStripMenuItemExportFcpIImage.Text = "Final Cut Pro + image..."; - this.toolStripMenuItemExportFcpIImage.Click += new System.EventHandler(this.toolStripMenuItemExportFcpIImage_Click); - // - // toolStripMenuItemFcpXmlAdvanced - // - this.toolStripMenuItemFcpXmlAdvanced.Name = "toolStripMenuItemFcpXmlAdvanced"; - this.toolStripMenuItemFcpXmlAdvanced.Size = new System.Drawing.Size(255, 22); - this.toolStripMenuItemFcpXmlAdvanced.Text = "Final Cut Pro XML advanced..."; - this.toolStripMenuItemFcpXmlAdvanced.Click += new System.EventHandler(this.toolStripMenuItemFcpXmlAdvanced_Click); - // - // toolStripMenuItemImagePerFrame - // - this.toolStripMenuItemImagePerFrame.Name = "toolStripMenuItemImagePerFrame"; - this.toolStripMenuItemImagePerFrame.Size = new System.Drawing.Size(255, 22); - this.toolStripMenuItemImagePerFrame.Text = "Image per frame..."; - this.toolStripMenuItemImagePerFrame.Visible = false; - this.toolStripMenuItemImagePerFrame.Click += new System.EventHandler(this.ToolStripMenuItemImagePerFrameClick); - // - // toolStripMenuItemTextTimeCodePair - // - this.toolStripMenuItemTextTimeCodePair.Name = "toolStripMenuItemTextTimeCodePair"; - this.toolStripMenuItemTextTimeCodePair.Size = new System.Drawing.Size(255, 22); - this.toolStripMenuItemTextTimeCodePair.Text = "Korean ATS file pair..."; - this.toolStripMenuItemTextTimeCodePair.Click += new System.EventHandler(this.toolStripMenuItemTextTimeCodePair_Click); - // - // pACScreenElectronicsToolStripMenuItem - // - this.pACScreenElectronicsToolStripMenuItem.Name = "pACScreenElectronicsToolStripMenuItem"; - this.pACScreenElectronicsToolStripMenuItem.Size = new System.Drawing.Size(255, 22); - this.pACScreenElectronicsToolStripMenuItem.Text = "PAC (Screen Electronics)..."; - this.pACScreenElectronicsToolStripMenuItem.Click += new System.EventHandler(this.PacScreenElectronicsToolStripMenuItemClick); - // - // uniPacExportToolStripMenuItem - // - this.uniPacExportToolStripMenuItem.Name = "uniPacExportToolStripMenuItem"; - this.uniPacExportToolStripMenuItem.Size = new System.Drawing.Size(255, 22); - this.uniPacExportToolStripMenuItem.Text = "PAC Unicode (UniPac)..."; - this.uniPacExportToolStripMenuItem.Click += new System.EventHandler(this.uniPacExportToolStripMenuItem_Click); - // - // plainTextToolStripMenuItem - // - this.plainTextToolStripMenuItem.Name = "plainTextToolStripMenuItem"; - this.plainTextToolStripMenuItem.Size = new System.Drawing.Size(255, 22); - this.plainTextToolStripMenuItem.Text = "Plain text..."; - this.plainTextToolStripMenuItem.Click += new System.EventHandler(this.PlainTextToolStripMenuItemClick); - // - // toolStripMenuItemSpumux - // - this.toolStripMenuItemSpumux.Name = "toolStripMenuItemSpumux"; - this.toolStripMenuItemSpumux.Size = new System.Drawing.Size(255, 22); - this.toolStripMenuItemSpumux.Text = "Spumux..."; - this.toolStripMenuItemSpumux.Click += new System.EventHandler(this.toolStripMenuItem2_Click); - // - // toolStripMenuItemExportUltech130 - // - this.toolStripMenuItemExportUltech130.Name = "toolStripMenuItemExportUltech130"; - this.toolStripMenuItemExportUltech130.Size = new System.Drawing.Size(255, 22); - this.toolStripMenuItemExportUltech130.Text = "Ultech caption..."; - this.toolStripMenuItemExportUltech130.Click += new System.EventHandler(this.toolStripMenuItemExportUltech130_Click); - // - // vobSubsubidxToolStripMenuItem - // - this.vobSubsubidxToolStripMenuItem.Name = "vobSubsubidxToolStripMenuItem"; - this.vobSubsubidxToolStripMenuItem.Size = new System.Drawing.Size(255, 22); - this.vobSubsubidxToolStripMenuItem.Text = "VobSub (sub/idx)..."; - this.vobSubsubidxToolStripMenuItem.Click += new System.EventHandler(this.VobSubsubidxToolStripMenuItemClick); - // - // toolStripSeparatorExportCustomText - // - this.toolStripSeparatorExportCustomText.Name = "toolStripSeparatorExportCustomText"; - this.toolStripSeparatorExportCustomText.Size = new System.Drawing.Size(252, 6); - // - // exportCustomTextFormatToolStripMenuItem - // - this.exportCustomTextFormatToolStripMenuItem.Name = "exportCustomTextFormatToolStripMenuItem"; - this.exportCustomTextFormatToolStripMenuItem.Size = new System.Drawing.Size(255, 22); - this.exportCustomTextFormatToolStripMenuItem.Text = "Export custom text format..."; - this.exportCustomTextFormatToolStripMenuItem.Click += new System.EventHandler(this.exportCustomTextFormatToolStripMenuItem_Click); - // - // toolStripSeparator10 - // - this.toolStripSeparator10.Name = "toolStripSeparator10"; - this.toolStripSeparator10.Size = new System.Drawing.Size(332, 6); - // - // exitToolStripMenuItem - // - this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; - this.exitToolStripMenuItem.Size = new System.Drawing.Size(335, 22); - this.exitToolStripMenuItem.Text = "E&xit"; - this.exitToolStripMenuItem.Click += new System.EventHandler(this.ExitToolStripMenuItemClick); - // - // editToolStripMenuItem - // - this.editToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripMenuItemUndo, - this.toolStripMenuItemRedo, - this.showHistoryforUndoToolStripMenuItem, - this.toolStripSeparator14, - this.toolStripMenuItemInsertUnicodeCharacter, - this.toolStripSeparatorInsertUnicodeCharacter, - this.findToolStripMenuItem, - this.findNextToolStripMenuItem, - this.replaceToolStripMenuItem, - this.multipleReplaceToolStripMenuItem, - this.gotoLineNumberToolStripMenuItem, - this.toolStripMenuItemShowOriginalInPreview, - this.toolStripSeparator25, - this.toolStripMenuItemRightToLeftMode, - this.toolStripMenuItemRtlUnicodeControlChars, - this.toolStripMenuItemRemoveUnicodeControlChars, - this.toolStripMenuItemReverseRightToLeftStartEnd, - this.toolStripSeparator21, - this.toolStripMenuItemModifySelection, - this.toolStripMenuItemInverseSelection, - this.editSelectAllToolStripMenuItem}); - this.editToolStripMenuItem.Name = "editToolStripMenuItem"; - this.editToolStripMenuItem.Size = new System.Drawing.Size(40, 20); - this.editToolStripMenuItem.Text = "Edit"; - this.editToolStripMenuItem.DropDownOpening += new System.EventHandler(this.EditToolStripMenuItemDropDownOpening); - // - // toolStripMenuItemUndo - // - this.toolStripMenuItemUndo.Name = "toolStripMenuItemUndo"; - this.toolStripMenuItemUndo.Size = new System.Drawing.Size(301, 22); - this.toolStripMenuItemUndo.Text = "Undo"; - this.toolStripMenuItemUndo.Click += new System.EventHandler(this.toolStripMenuItemUndo_Click); - // - // toolStripMenuItemRedo - // - this.toolStripMenuItemRedo.Name = "toolStripMenuItemRedo"; - this.toolStripMenuItemRedo.Size = new System.Drawing.Size(301, 22); - this.toolStripMenuItemRedo.Text = "Redo"; - this.toolStripMenuItemRedo.Click += new System.EventHandler(this.toolStripMenuItemRedo_Click); - // - // showHistoryforUndoToolStripMenuItem - // - this.showHistoryforUndoToolStripMenuItem.Name = "showHistoryforUndoToolStripMenuItem"; - this.showHistoryforUndoToolStripMenuItem.Size = new System.Drawing.Size(301, 22); - this.showHistoryforUndoToolStripMenuItem.Text = "Show history (for undo)"; - this.showHistoryforUndoToolStripMenuItem.Click += new System.EventHandler(this.ShowHistoryforUndoToolStripMenuItemClick); - // - // toolStripSeparator14 - // - this.toolStripSeparator14.Name = "toolStripSeparator14"; - this.toolStripSeparator14.Size = new System.Drawing.Size(298, 6); - // - // toolStripMenuItemInsertUnicodeCharacter - // - this.toolStripMenuItemInsertUnicodeCharacter.Name = "toolStripMenuItemInsertUnicodeCharacter"; - this.toolStripMenuItemInsertUnicodeCharacter.Size = new System.Drawing.Size(301, 22); - this.toolStripMenuItemInsertUnicodeCharacter.Text = "Insert unicode character"; - // - // toolStripSeparatorInsertUnicodeCharacter - // - this.toolStripSeparatorInsertUnicodeCharacter.Name = "toolStripSeparatorInsertUnicodeCharacter"; - this.toolStripSeparatorInsertUnicodeCharacter.Size = new System.Drawing.Size(298, 6); - // - // findToolStripMenuItem - // - this.findToolStripMenuItem.Name = "findToolStripMenuItem"; - this.findToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F))); - this.findToolStripMenuItem.Size = new System.Drawing.Size(301, 22); - this.findToolStripMenuItem.Text = "Find"; - this.findToolStripMenuItem.Click += new System.EventHandler(this.FindToolStripMenuItemClick); - // - // findNextToolStripMenuItem - // - this.findNextToolStripMenuItem.Name = "findNextToolStripMenuItem"; - this.findNextToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F3; - this.findNextToolStripMenuItem.Size = new System.Drawing.Size(301, 22); - this.findNextToolStripMenuItem.Text = "Find next"; - this.findNextToolStripMenuItem.Click += new System.EventHandler(this.FindNextToolStripMenuItemClick); - // - // replaceToolStripMenuItem - // - this.replaceToolStripMenuItem.Name = "replaceToolStripMenuItem"; - this.replaceToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.H))); - this.replaceToolStripMenuItem.Size = new System.Drawing.Size(301, 22); - this.replaceToolStripMenuItem.Text = "Replace"; - this.replaceToolStripMenuItem.Click += new System.EventHandler(this.ReplaceToolStripMenuItemClick); - // - // multipleReplaceToolStripMenuItem - // - this.multipleReplaceToolStripMenuItem.Name = "multipleReplaceToolStripMenuItem"; - this.multipleReplaceToolStripMenuItem.Size = new System.Drawing.Size(301, 22); - this.multipleReplaceToolStripMenuItem.Text = "Multiple replace"; - this.multipleReplaceToolStripMenuItem.Click += new System.EventHandler(this.MultipleReplaceToolStripMenuItemClick); - // - // gotoLineNumberToolStripMenuItem - // - this.gotoLineNumberToolStripMenuItem.Name = "gotoLineNumberToolStripMenuItem"; - this.gotoLineNumberToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.G))); - this.gotoLineNumberToolStripMenuItem.Size = new System.Drawing.Size(301, 22); - this.gotoLineNumberToolStripMenuItem.Text = "Goto line number..."; - this.gotoLineNumberToolStripMenuItem.Click += new System.EventHandler(this.GotoLineNumberToolStripMenuItemClick); - // - // toolStripMenuItemShowOriginalInPreview - // - this.toolStripMenuItemShowOriginalInPreview.Name = "toolStripMenuItemShowOriginalInPreview"; - this.toolStripMenuItemShowOriginalInPreview.Size = new System.Drawing.Size(301, 22); - this.toolStripMenuItemShowOriginalInPreview.Text = "Show original text in video/audio previews"; - this.toolStripMenuItemShowOriginalInPreview.Click += new System.EventHandler(this.ToolStripMenuItemShowOriginalInPreviewClick); - // - // toolStripSeparator25 - // - this.toolStripSeparator25.Name = "toolStripSeparator25"; - this.toolStripSeparator25.Size = new System.Drawing.Size(298, 6); - // - // toolStripMenuItemRightToLeftMode - // - this.toolStripMenuItemRightToLeftMode.Name = "toolStripMenuItemRightToLeftMode"; - this.toolStripMenuItemRightToLeftMode.Size = new System.Drawing.Size(301, 22); - this.toolStripMenuItemRightToLeftMode.Text = "Right to left mode"; - this.toolStripMenuItemRightToLeftMode.Click += new System.EventHandler(this.ToolStripMenuItemRightToLeftModeClick); - // - // toolStripMenuItemRtlUnicodeControlChars - // - this.toolStripMenuItemRtlUnicodeControlChars.Name = "toolStripMenuItemRtlUnicodeControlChars"; - this.toolStripMenuItemRtlUnicodeControlChars.Size = new System.Drawing.Size(301, 22); - this.toolStripMenuItemRtlUnicodeControlChars.Text = "Fix RTL via Unicode tags"; - this.toolStripMenuItemRtlUnicodeControlChars.Click += new System.EventHandler(this.toolStripMenuItemRtlUnicodeControlChar_Click); - // - // toolStripMenuItemRemoveUnicodeControlChars - // - this.toolStripMenuItemRemoveUnicodeControlChars.Name = "toolStripMenuItemRemoveUnicodeControlChars"; - this.toolStripMenuItemRemoveUnicodeControlChars.Size = new System.Drawing.Size(301, 22); - this.toolStripMenuItemRemoveUnicodeControlChars.Text = "Remove Unicode tags"; - this.toolStripMenuItemRemoveUnicodeControlChars.Click += new System.EventHandler(this.toolStripMenuItemRemoveUnicodeControlChar_Click); - // - // toolStripMenuItemReverseRightToLeftStartEnd - // - this.toolStripMenuItemReverseRightToLeftStartEnd.Name = "toolStripMenuItemReverseRightToLeftStartEnd"; - this.toolStripMenuItemReverseRightToLeftStartEnd.Size = new System.Drawing.Size(301, 22); - this.toolStripMenuItemReverseRightToLeftStartEnd.Text = "Reverse RTL start/end"; - this.toolStripMenuItemReverseRightToLeftStartEnd.Click += new System.EventHandler(this.toolStripMenuItemReverseRightToLeftStartEnd_Click); - // - // toolStripSeparator21 - // - this.toolStripSeparator21.Name = "toolStripSeparator21"; - this.toolStripSeparator21.Size = new System.Drawing.Size(298, 6); - // - // toolStripMenuItemModifySelection - // - this.toolStripMenuItemModifySelection.Name = "toolStripMenuItemModifySelection"; - this.toolStripMenuItemModifySelection.Size = new System.Drawing.Size(301, 22); - this.toolStripMenuItemModifySelection.Text = "Create/modify selection..."; - this.toolStripMenuItemModifySelection.Click += new System.EventHandler(this.toolStripMenuItemModifySelection_Click); - // - // toolStripMenuItemInverseSelection - // - this.toolStripMenuItemInverseSelection.Name = "toolStripMenuItemInverseSelection"; - this.toolStripMenuItemInverseSelection.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) - | System.Windows.Forms.Keys.I))); - this.toolStripMenuItemInverseSelection.Size = new System.Drawing.Size(301, 22); - this.toolStripMenuItemInverseSelection.Text = "Inverse selection"; - this.toolStripMenuItemInverseSelection.Click += new System.EventHandler(this.toolStripMenuItemInverseSelection_Click); - // - // editSelectAllToolStripMenuItem - // - this.editSelectAllToolStripMenuItem.Name = "editSelectAllToolStripMenuItem"; - this.editSelectAllToolStripMenuItem.Size = new System.Drawing.Size(301, 22); - this.editSelectAllToolStripMenuItem.Text = "Select all"; - this.editSelectAllToolStripMenuItem.Click += new System.EventHandler(this.EditSelectAllToolStripMenuItemClick); - // - // toolsToolStripMenuItem - // - this.toolsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.adjustDisplayTimeToolStripMenuItem, - this.toolStripMenuItemApplyDurationLimits, - this.toolStripMenuItemSubtitlesBridgeGaps, - this.setMinimumDisplayTimeBetweenParagraphsToolStripMenuItem, - this.fixToolStripMenuItem, - this.startNumberingFromToolStripMenuItem, - this.removeTextForHearImpairedToolStripMenuItem, - this.ChangeCasingToolStripMenuItem, - this.toolStripMenuItemAutoMergeShortLines, - this.toolStripMenuItemMergeDuplicateText, - this.toolStripMenuItemMergeLinesWithSameTimeCodes, - this.toolStripMenuItemAutoSplitLongLines, - this.toolStripMenuItemSortBy, - this.netflixQualityCheckToolStripMenuItem, - this.toolStripSeparator23, - this.toolStripMenuItemMakeEmptyFromCurrent, - this.toolStripMenuItemBatchConvert, - this.generateDatetimeInfoFromVideoToolStripMenuItem, - this.toolStripMenuItemMeasurementConverter, - this.toolStripSeparator3, - this.splitToolStripMenuItem, - this.appendTextVisuallyToolStripMenuItem, - this.joinSubtitlesToolStripMenuItem}); - this.toolsToolStripMenuItem.Name = "toolsToolStripMenuItem"; - this.toolsToolStripMenuItem.Size = new System.Drawing.Size(49, 20); - this.toolsToolStripMenuItem.Text = "Tools"; - this.toolsToolStripMenuItem.DropDownOpening += new System.EventHandler(this.ToolsToolStripMenuItemDropDownOpening); - // - // adjustDisplayTimeToolStripMenuItem - // - this.adjustDisplayTimeToolStripMenuItem.Name = "adjustDisplayTimeToolStripMenuItem"; - this.adjustDisplayTimeToolStripMenuItem.Size = new System.Drawing.Size(338, 22); - this.adjustDisplayTimeToolStripMenuItem.Text = "Adjust display time..."; - this.adjustDisplayTimeToolStripMenuItem.Click += new System.EventHandler(this.AdjustDisplayTimeToolStripMenuItemClick); - // - // toolStripMenuItemApplyDurationLimits - // - this.toolStripMenuItemApplyDurationLimits.Name = "toolStripMenuItemApplyDurationLimits"; - this.toolStripMenuItemApplyDurationLimits.Size = new System.Drawing.Size(338, 22); - this.toolStripMenuItemApplyDurationLimits.Text = "Apply duration limits..."; - this.toolStripMenuItemApplyDurationLimits.Click += new System.EventHandler(this.toolStripMenuItemApplyDisplayTimeLimits_Click); - // - // toolStripMenuItemSubtitlesBridgeGaps - // - this.toolStripMenuItemSubtitlesBridgeGaps.Name = "toolStripMenuItemSubtitlesBridgeGaps"; - this.toolStripMenuItemSubtitlesBridgeGaps.Size = new System.Drawing.Size(338, 22); - this.toolStripMenuItemSubtitlesBridgeGaps.Text = "Bridge gap between subtitles..."; - this.toolStripMenuItemSubtitlesBridgeGaps.Click += new System.EventHandler(this.toolStripMenuItemBridgeGapsBetweenSubtitles_Click); - // - // setMinimumDisplayTimeBetweenParagraphsToolStripMenuItem - // - this.setMinimumDisplayTimeBetweenParagraphsToolStripMenuItem.Name = "setMinimumDisplayTimeBetweenParagraphsToolStripMenuItem"; - this.setMinimumDisplayTimeBetweenParagraphsToolStripMenuItem.Size = new System.Drawing.Size(338, 22); - this.setMinimumDisplayTimeBetweenParagraphsToolStripMenuItem.Text = "Apply mininum gap between subtitles..."; - this.setMinimumDisplayTimeBetweenParagraphsToolStripMenuItem.Click += new System.EventHandler(this.SetMinimalDisplayTimeDifferenceToolStripMenuItemClick); - // - // fixToolStripMenuItem - // - this.fixToolStripMenuItem.Name = "fixToolStripMenuItem"; - this.fixToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) - | System.Windows.Forms.Keys.F))); - this.fixToolStripMenuItem.Size = new System.Drawing.Size(338, 22); - this.fixToolStripMenuItem.Text = "Fix common errors..."; - this.fixToolStripMenuItem.Click += new System.EventHandler(this.FixToolStripMenuItemClick); - // - // startNumberingFromToolStripMenuItem - // - this.startNumberingFromToolStripMenuItem.Name = "startNumberingFromToolStripMenuItem"; - this.startNumberingFromToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) - | System.Windows.Forms.Keys.N))); - this.startNumberingFromToolStripMenuItem.Size = new System.Drawing.Size(338, 22); - this.startNumberingFromToolStripMenuItem.Text = "Start numbering from..."; - this.startNumberingFromToolStripMenuItem.Click += new System.EventHandler(this.StartNumberingFromToolStripMenuItemClick); - // - // removeTextForHearImpairedToolStripMenuItem - // - this.removeTextForHearImpairedToolStripMenuItem.Name = "removeTextForHearImpairedToolStripMenuItem"; - this.removeTextForHearImpairedToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) - | System.Windows.Forms.Keys.H))); - this.removeTextForHearImpairedToolStripMenuItem.Size = new System.Drawing.Size(338, 22); - this.removeTextForHearImpairedToolStripMenuItem.Text = "Remove text for hearing impaired..."; - this.removeTextForHearImpairedToolStripMenuItem.Click += new System.EventHandler(this.RemoveTextForHearImpairedToolStripMenuItemClick); - // - // ChangeCasingToolStripMenuItem - // - this.ChangeCasingToolStripMenuItem.Name = "ChangeCasingToolStripMenuItem"; - this.ChangeCasingToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) - | System.Windows.Forms.Keys.C))); - this.ChangeCasingToolStripMenuItem.Size = new System.Drawing.Size(338, 22); - this.ChangeCasingToolStripMenuItem.Text = "Change casing..."; - this.ChangeCasingToolStripMenuItem.Click += new System.EventHandler(this.ChangeCasingToolStripMenuItem_Click); - // - // toolStripMenuItemAutoMergeShortLines - // - this.toolStripMenuItemAutoMergeShortLines.Name = "toolStripMenuItemAutoMergeShortLines"; - this.toolStripMenuItemAutoMergeShortLines.Size = new System.Drawing.Size(338, 22); - this.toolStripMenuItemAutoMergeShortLines.Text = "Merge short lines..."; - this.toolStripMenuItemAutoMergeShortLines.Click += new System.EventHandler(this.ToolStripMenuItemAutoMergeShortLinesClick); - // - // toolStripMenuItemMergeDuplicateText - // - this.toolStripMenuItemMergeDuplicateText.Name = "toolStripMenuItemMergeDuplicateText"; - this.toolStripMenuItemMergeDuplicateText.Size = new System.Drawing.Size(338, 22); - this.toolStripMenuItemMergeDuplicateText.Text = "Merge lines with same text..."; - this.toolStripMenuItemMergeDuplicateText.Click += new System.EventHandler(this.toolStripMenuItemMergeDuplicateText_Click); - // - // toolStripMenuItemMergeLinesWithSameTimeCodes - // - this.toolStripMenuItemMergeLinesWithSameTimeCodes.Name = "toolStripMenuItemMergeLinesWithSameTimeCodes"; - this.toolStripMenuItemMergeLinesWithSameTimeCodes.Size = new System.Drawing.Size(338, 22); - this.toolStripMenuItemMergeLinesWithSameTimeCodes.Text = "Merge lines with same time codes..."; - this.toolStripMenuItemMergeLinesWithSameTimeCodes.Click += new System.EventHandler(this.toolStripMenuItemMergeLinesWithSameTimeCodes_Click); - // - // toolStripMenuItemAutoSplitLongLines - // - this.toolStripMenuItemAutoSplitLongLines.Name = "toolStripMenuItemAutoSplitLongLines"; - this.toolStripMenuItemAutoSplitLongLines.Size = new System.Drawing.Size(338, 22); - this.toolStripMenuItemAutoSplitLongLines.Text = "Split long lines..."; - this.toolStripMenuItemAutoSplitLongLines.Click += new System.EventHandler(this.toolStripMenuItemAutoSplitLongLines_Click); - // - // toolStripMenuItemSortBy - // - this.toolStripMenuItemSortBy.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.sortNumberToolStripMenuItem, - this.sortStartTimeToolStripMenuItem, - this.sortEndTimeToolStripMenuItem, - this.sortDisplayTimeToolStripMenuItem, - this.sortTextAlphabeticallytoolStripMenuItem, - this.sortTextMaxLineLengthToolStripMenuItem, - this.sortTextTotalLengthToolStripMenuItem, - this.sortTextNumberOfLinesToolStripMenuItem, - this.textCharssecToolStripMenuItem, - this.textWordsPerMinutewpmToolStripMenuItem, - this.actorToolStripMenuItem, - this.styleToolStripMenuItem, - this.toolStripSeparatorAscOrDesc, - this.AscendingToolStripMenuItem, - this.descendingToolStripMenuItem}); - this.toolStripMenuItemSortBy.Name = "toolStripMenuItemSortBy"; - this.toolStripMenuItemSortBy.Size = new System.Drawing.Size(338, 22); - this.toolStripMenuItemSortBy.Text = "Sort by"; - // - // sortNumberToolStripMenuItem - // - this.sortNumberToolStripMenuItem.Name = "sortNumberToolStripMenuItem"; - this.sortNumberToolStripMenuItem.Size = new System.Drawing.Size(240, 22); - this.sortNumberToolStripMenuItem.Text = "Number"; - this.sortNumberToolStripMenuItem.Click += new System.EventHandler(this.SortNumberToolStripMenuItemClick); - // - // sortStartTimeToolStripMenuItem - // - this.sortStartTimeToolStripMenuItem.Name = "sortStartTimeToolStripMenuItem"; - this.sortStartTimeToolStripMenuItem.Size = new System.Drawing.Size(240, 22); - this.sortStartTimeToolStripMenuItem.Text = "Start time"; - this.sortStartTimeToolStripMenuItem.Click += new System.EventHandler(this.SortStartTimeToolStripMenuItemClick); - // - // sortEndTimeToolStripMenuItem - // - this.sortEndTimeToolStripMenuItem.Name = "sortEndTimeToolStripMenuItem"; - this.sortEndTimeToolStripMenuItem.Size = new System.Drawing.Size(240, 22); - this.sortEndTimeToolStripMenuItem.Text = "End time"; - this.sortEndTimeToolStripMenuItem.Click += new System.EventHandler(this.SortEndTimeToolStripMenuItemClick); - // - // sortDisplayTimeToolStripMenuItem - // - this.sortDisplayTimeToolStripMenuItem.Name = "sortDisplayTimeToolStripMenuItem"; - this.sortDisplayTimeToolStripMenuItem.Size = new System.Drawing.Size(240, 22); - this.sortDisplayTimeToolStripMenuItem.Text = "Duration"; - this.sortDisplayTimeToolStripMenuItem.Click += new System.EventHandler(this.SortDisplayTimeToolStripMenuItemClick); - // - // sortTextAlphabeticallytoolStripMenuItem - // - this.sortTextAlphabeticallytoolStripMenuItem.Name = "sortTextAlphabeticallytoolStripMenuItem"; - this.sortTextAlphabeticallytoolStripMenuItem.Size = new System.Drawing.Size(240, 22); - this.sortTextAlphabeticallytoolStripMenuItem.Text = "Text - alphabetically"; - this.sortTextAlphabeticallytoolStripMenuItem.Click += new System.EventHandler(this.SortTextAlphabeticallytoolStripMenuItemClick); - // - // sortTextMaxLineLengthToolStripMenuItem - // - this.sortTextMaxLineLengthToolStripMenuItem.Name = "sortTextMaxLineLengthToolStripMenuItem"; - this.sortTextMaxLineLengthToolStripMenuItem.Size = new System.Drawing.Size(240, 22); - this.sortTextMaxLineLengthToolStripMenuItem.Text = "Text - single line max. length"; - this.sortTextMaxLineLengthToolStripMenuItem.Click += new System.EventHandler(this.SortTextMaxLineLengthToolStripMenuItemClick); - // - // sortTextTotalLengthToolStripMenuItem - // - this.sortTextTotalLengthToolStripMenuItem.Name = "sortTextTotalLengthToolStripMenuItem"; - this.sortTextTotalLengthToolStripMenuItem.Size = new System.Drawing.Size(240, 22); - this.sortTextTotalLengthToolStripMenuItem.Text = "Text - total length"; - this.sortTextTotalLengthToolStripMenuItem.Click += new System.EventHandler(this.SortTextTotalLengthToolStripMenuItemClick); - // - // sortTextNumberOfLinesToolStripMenuItem - // - this.sortTextNumberOfLinesToolStripMenuItem.Name = "sortTextNumberOfLinesToolStripMenuItem"; - this.sortTextNumberOfLinesToolStripMenuItem.Size = new System.Drawing.Size(240, 22); - this.sortTextNumberOfLinesToolStripMenuItem.Text = "Text - number of lines"; - this.sortTextNumberOfLinesToolStripMenuItem.Click += new System.EventHandler(this.SortTextNumberOfLinesToolStripMenuItemClick); - // - // textCharssecToolStripMenuItem - // - this.textCharssecToolStripMenuItem.Name = "textCharssecToolStripMenuItem"; - this.textCharssecToolStripMenuItem.Size = new System.Drawing.Size(240, 22); - this.textCharssecToolStripMenuItem.Text = "Text - chars/sec"; - this.textCharssecToolStripMenuItem.Click += new System.EventHandler(this.textCharssecToolStripMenuItem_Click); - // - // textWordsPerMinutewpmToolStripMenuItem - // - this.textWordsPerMinutewpmToolStripMenuItem.Name = "textWordsPerMinutewpmToolStripMenuItem"; - this.textWordsPerMinutewpmToolStripMenuItem.Size = new System.Drawing.Size(240, 22); - this.textWordsPerMinutewpmToolStripMenuItem.Text = "Text - words per minute (wpm)"; - this.textWordsPerMinutewpmToolStripMenuItem.Click += new System.EventHandler(this.textWordsPerMinutewpmToolStripMenuItem_Click); - // - // actorToolStripMenuItem - // - this.actorToolStripMenuItem.Name = "actorToolStripMenuItem"; - this.actorToolStripMenuItem.Size = new System.Drawing.Size(240, 22); - this.actorToolStripMenuItem.Text = "Actor"; - this.actorToolStripMenuItem.Click += new System.EventHandler(this.actorToolStripMenuItemClick); - // - // styleToolStripMenuItem - // - this.styleToolStripMenuItem.Name = "styleToolStripMenuItem"; - this.styleToolStripMenuItem.Size = new System.Drawing.Size(240, 22); - this.styleToolStripMenuItem.Text = "Style"; - this.styleToolStripMenuItem.Click += new System.EventHandler(this.styleToolStripMenuItem_Click); - // - // toolStripSeparatorAscOrDesc - // - this.toolStripSeparatorAscOrDesc.Name = "toolStripSeparatorAscOrDesc"; - this.toolStripSeparatorAscOrDesc.Size = new System.Drawing.Size(237, 6); - // - // AscendingToolStripMenuItem - // - this.AscendingToolStripMenuItem.Checked = true; - this.AscendingToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; - this.AscendingToolStripMenuItem.Name = "AscendingToolStripMenuItem"; - this.AscendingToolStripMenuItem.Size = new System.Drawing.Size(240, 22); - this.AscendingToolStripMenuItem.Text = "Ascending"; - this.AscendingToolStripMenuItem.Click += new System.EventHandler(this.AscendingToolStripMenuItem_Click); - // - // descendingToolStripMenuItem - // - this.descendingToolStripMenuItem.Name = "descendingToolStripMenuItem"; - this.descendingToolStripMenuItem.Size = new System.Drawing.Size(240, 22); - this.descendingToolStripMenuItem.Text = "Descending"; - this.descendingToolStripMenuItem.Click += new System.EventHandler(this.descendingToolStripMenuItem_Click); - // - // netflixQualityCheckToolStripMenuItem - // - this.netflixQualityCheckToolStripMenuItem.Name = "netflixQualityCheckToolStripMenuItem"; - this.netflixQualityCheckToolStripMenuItem.Size = new System.Drawing.Size(338, 22); - this.netflixQualityCheckToolStripMenuItem.Text = "Netflix quality check"; - this.netflixQualityCheckToolStripMenuItem.Click += new System.EventHandler(this.netflixGlyphCheckToolStripMenuItem_Click); - // - // toolStripSeparator23 - // - this.toolStripSeparator23.Name = "toolStripSeparator23"; - this.toolStripSeparator23.Size = new System.Drawing.Size(335, 6); - // - // toolStripMenuItemMakeEmptyFromCurrent - // - this.toolStripMenuItemMakeEmptyFromCurrent.Name = "toolStripMenuItemMakeEmptyFromCurrent"; - this.toolStripMenuItemMakeEmptyFromCurrent.Size = new System.Drawing.Size(338, 22); - this.toolStripMenuItemMakeEmptyFromCurrent.Text = "Make new empty translation from current subtitle"; - this.toolStripMenuItemMakeEmptyFromCurrent.Click += new System.EventHandler(this.ToolStripMenuItemMakeEmptyFromCurrentClick); - // - // toolStripMenuItemBatchConvert - // - this.toolStripMenuItemBatchConvert.Name = "toolStripMenuItemBatchConvert"; - this.toolStripMenuItemBatchConvert.Size = new System.Drawing.Size(338, 22); - this.toolStripMenuItemBatchConvert.Text = "Batch convert..."; - this.toolStripMenuItemBatchConvert.Click += new System.EventHandler(this.toolStripMenuItemBatchConvert_Click); - // - // generateDatetimeInfoFromVideoToolStripMenuItem - // - this.generateDatetimeInfoFromVideoToolStripMenuItem.Name = "generateDatetimeInfoFromVideoToolStripMenuItem"; - this.generateDatetimeInfoFromVideoToolStripMenuItem.Size = new System.Drawing.Size(338, 22); - this.generateDatetimeInfoFromVideoToolStripMenuItem.Text = "Generate date/time info from video..."; - this.generateDatetimeInfoFromVideoToolStripMenuItem.Click += new System.EventHandler(this.generateDatetimeInfoFromVideoToolStripMenuItem_Click); - // - // toolStripMenuItemMeasurementConverter - // - this.toolStripMenuItemMeasurementConverter.Name = "toolStripMenuItemMeasurementConverter"; - this.toolStripMenuItemMeasurementConverter.Size = new System.Drawing.Size(338, 22); - this.toolStripMenuItemMeasurementConverter.Text = "Measurement converter..."; - this.toolStripMenuItemMeasurementConverter.Click += new System.EventHandler(this.toolStripMenuItemMeasurementConverter_Click); - // - // toolStripSeparator3 - // - this.toolStripSeparator3.Name = "toolStripSeparator3"; - this.toolStripSeparator3.Size = new System.Drawing.Size(335, 6); - // - // splitToolStripMenuItem - // - this.splitToolStripMenuItem.Name = "splitToolStripMenuItem"; - this.splitToolStripMenuItem.Size = new System.Drawing.Size(338, 22); - this.splitToolStripMenuItem.Text = "Split subtitle..."; - this.splitToolStripMenuItem.Click += new System.EventHandler(this.SplitToolStripMenuItemClick); - // - // appendTextVisuallyToolStripMenuItem - // - this.appendTextVisuallyToolStripMenuItem.Name = "appendTextVisuallyToolStripMenuItem"; - this.appendTextVisuallyToolStripMenuItem.Size = new System.Drawing.Size(338, 22); - this.appendTextVisuallyToolStripMenuItem.Text = "Append subtitle..."; - this.appendTextVisuallyToolStripMenuItem.Click += new System.EventHandler(this.AppendTextVisuallyToolStripMenuItemClick); - // - // joinSubtitlesToolStripMenuItem - // - this.joinSubtitlesToolStripMenuItem.Name = "joinSubtitlesToolStripMenuItem"; - this.joinSubtitlesToolStripMenuItem.Size = new System.Drawing.Size(338, 22); - this.joinSubtitlesToolStripMenuItem.Text = "Join subtitles..."; - this.joinSubtitlesToolStripMenuItem.Click += new System.EventHandler(this.joinSubtitlesToolStripMenuItem_Click); - // - // toolStripMenuItemSpellCheckMain - // - this.toolStripMenuItemSpellCheckMain.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.spellCheckToolStripMenuItem, - this.toolStripMenuItemSpellCheckFromCurrentLine, - this.findDoubleWordsToolStripMenuItem, - this.FindDoubleLinesToolStripMenuItem, - this.toolStripSeparator9, - this.GetDictionariesToolStripMenuItem, - this.addWordToNameListToolStripMenuItem}); - this.toolStripMenuItemSpellCheckMain.Name = "toolStripMenuItemSpellCheckMain"; - this.toolStripMenuItemSpellCheckMain.Size = new System.Drawing.Size(82, 20); - this.toolStripMenuItemSpellCheckMain.Text = "Spell check"; - this.toolStripMenuItemSpellCheckMain.DropDownOpening += new System.EventHandler(this.ToolStripMenuItemSpellCheckMainDropDownOpening); - // - // spellCheckToolStripMenuItem - // - this.spellCheckToolStripMenuItem.Name = "spellCheckToolStripMenuItem"; - this.spellCheckToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) - | System.Windows.Forms.Keys.S))); - this.spellCheckToolStripMenuItem.Size = new System.Drawing.Size(267, 22); - this.spellCheckToolStripMenuItem.Text = "Spell check..."; - this.spellCheckToolStripMenuItem.Click += new System.EventHandler(this.SpellCheckToolStripMenuItemClick); - // - // toolStripMenuItemSpellCheckFromCurrentLine - // - this.toolStripMenuItemSpellCheckFromCurrentLine.Name = "toolStripMenuItemSpellCheckFromCurrentLine"; - this.toolStripMenuItemSpellCheckFromCurrentLine.Size = new System.Drawing.Size(267, 22); - this.toolStripMenuItemSpellCheckFromCurrentLine.Text = "Spell check from current line..."; - this.toolStripMenuItemSpellCheckFromCurrentLine.Click += new System.EventHandler(this.toolStripMenuItemSpellCheckFromCurrentLine_Click); - // - // findDoubleWordsToolStripMenuItem - // - this.findDoubleWordsToolStripMenuItem.Name = "findDoubleWordsToolStripMenuItem"; - this.findDoubleWordsToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) - | System.Windows.Forms.Keys.D))); - this.findDoubleWordsToolStripMenuItem.Size = new System.Drawing.Size(267, 22); - this.findDoubleWordsToolStripMenuItem.Text = "Find double words"; - this.findDoubleWordsToolStripMenuItem.Click += new System.EventHandler(this.FindDoubleWordsToolStripMenuItemClick); - // - // FindDoubleLinesToolStripMenuItem - // - this.FindDoubleLinesToolStripMenuItem.Name = "FindDoubleLinesToolStripMenuItem"; - this.FindDoubleLinesToolStripMenuItem.Size = new System.Drawing.Size(267, 22); - this.FindDoubleLinesToolStripMenuItem.Text = "Find double lines"; - this.FindDoubleLinesToolStripMenuItem.Click += new System.EventHandler(this.FindDoubleLinesToolStripMenuItemClick); - // - // toolStripSeparator9 - // - this.toolStripSeparator9.Name = "toolStripSeparator9"; - this.toolStripSeparator9.Size = new System.Drawing.Size(264, 6); - // - // GetDictionariesToolStripMenuItem - // - this.GetDictionariesToolStripMenuItem.Name = "GetDictionariesToolStripMenuItem"; - this.GetDictionariesToolStripMenuItem.Size = new System.Drawing.Size(267, 22); - this.GetDictionariesToolStripMenuItem.Text = "Get dictionary..."; - this.GetDictionariesToolStripMenuItem.Click += new System.EventHandler(this.GetDictionariesToolStripMenuItem_Click); - // - // addWordToNameListToolStripMenuItem - // - this.addWordToNameListToolStripMenuItem.Name = "addWordToNameListToolStripMenuItem"; - this.addWordToNameListToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) - | System.Windows.Forms.Keys.L))); - this.addWordToNameListToolStripMenuItem.Size = new System.Drawing.Size(267, 22); - this.addWordToNameListToolStripMenuItem.Text = "Add word to names list"; - this.addWordToNameListToolStripMenuItem.Click += new System.EventHandler(this.AddWordToNameListToolStripMenuItemClick); - // - // toolStripMenuItemVideo - // - this.toolStripMenuItemVideo.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.openVideoToolStripMenuItem, - this.toolStripMenuItemOpenVideoFromUrl, - this.toolStripMenuItemOpenDvd, - this.toolStripMenuItemSetAudioTrack, - this.closeVideoToolStripMenuItem, - this.openSecondSubtitleToolStripMenuItem, - this.setVideoOffsetToolStripMenuItem, - this.smpteTimeModedropFrameToolStripMenuItem, - this.toolStripMenuItemImportChapters, - this.toolStripMenuItemImportSceneChanges, - this.toolStripMenuItemRemoveSceneChanges, - this.toolStripMenuItemAddWaveformBatch, - this.generateTextFromCurrentVideoToolStripMenuItem, - this.toolStripSeparator5, - this.showhideWaveformToolStripMenuItem, - this.showhideVideoToolStripMenuItem, - this.toolStripSeparator19, - this.undockVideoControlsToolStripMenuItem, - this.redockVideoControlsToolStripMenuItem}); - this.toolStripMenuItemVideo.Name = "toolStripMenuItemVideo"; - this.toolStripMenuItemVideo.Size = new System.Drawing.Size(50, 20); - this.toolStripMenuItemVideo.Text = "Video"; - this.toolStripMenuItemVideo.DropDownClosed += new System.EventHandler(this.ToolStripMenuItemVideoDropDownClosed); - this.toolStripMenuItemVideo.DropDownOpening += new System.EventHandler(this.ToolStripMenuItemVideoDropDownOpening); - // - // openVideoToolStripMenuItem - // - this.openVideoToolStripMenuItem.Name = "openVideoToolStripMenuItem"; - this.openVideoToolStripMenuItem.Size = new System.Drawing.Size(257, 22); - this.openVideoToolStripMenuItem.Text = "Open video..."; - this.openVideoToolStripMenuItem.Click += new System.EventHandler(this.buttonOpenVideo_Click); - // - // toolStripMenuItemOpenVideoFromUrl - // - this.toolStripMenuItemOpenVideoFromUrl.Name = "toolStripMenuItemOpenVideoFromUrl"; - this.toolStripMenuItemOpenVideoFromUrl.Size = new System.Drawing.Size(257, 22); - this.toolStripMenuItemOpenVideoFromUrl.Text = "Open video from url..."; - this.toolStripMenuItemOpenVideoFromUrl.Click += new System.EventHandler(this.toolStripMenuItemOpenVideoFromUrl_Click); - // - // toolStripMenuItemOpenDvd - // - this.toolStripMenuItemOpenDvd.Name = "toolStripMenuItemOpenDvd"; - this.toolStripMenuItemOpenDvd.Size = new System.Drawing.Size(257, 22); - this.toolStripMenuItemOpenDvd.Text = "Open DVD..."; - this.toolStripMenuItemOpenDvd.Click += new System.EventHandler(this.toolStripMenuItemOpenDvd_Click); - // - // toolStripMenuItemSetAudioTrack - // - this.toolStripMenuItemSetAudioTrack.Name = "toolStripMenuItemSetAudioTrack"; - this.toolStripMenuItemSetAudioTrack.Size = new System.Drawing.Size(257, 22); - this.toolStripMenuItemSetAudioTrack.Text = "Choose audio track"; - // - // closeVideoToolStripMenuItem - // - this.closeVideoToolStripMenuItem.Name = "closeVideoToolStripMenuItem"; - this.closeVideoToolStripMenuItem.Size = new System.Drawing.Size(257, 22); - this.closeVideoToolStripMenuItem.Text = "Close video"; - this.closeVideoToolStripMenuItem.Click += new System.EventHandler(this.CloseVideoToolStripMenuItemClick); - // - // openSecondSubtitleToolStripMenuItem - // - this.openSecondSubtitleToolStripMenuItem.Name = "openSecondSubtitleToolStripMenuItem"; - this.openSecondSubtitleToolStripMenuItem.Size = new System.Drawing.Size(257, 22); - this.openSecondSubtitleToolStripMenuItem.Text = "Open second subtitle..."; - this.openSecondSubtitleToolStripMenuItem.Click += new System.EventHandler(this.openSecondSubtitleToolStripMenuItem_Click); - // - // setVideoOffsetToolStripMenuItem - // - this.setVideoOffsetToolStripMenuItem.Name = "setVideoOffsetToolStripMenuItem"; - this.setVideoOffsetToolStripMenuItem.Size = new System.Drawing.Size(257, 22); - this.setVideoOffsetToolStripMenuItem.Text = "Set video offset..."; - this.setVideoOffsetToolStripMenuItem.Click += new System.EventHandler(this.setVideoOffsetToolStripMenuItem_Click); - // - // smpteTimeModedropFrameToolStripMenuItem - // - this.smpteTimeModedropFrameToolStripMenuItem.Name = "smpteTimeModedropFrameToolStripMenuItem"; - this.smpteTimeModedropFrameToolStripMenuItem.Size = new System.Drawing.Size(257, 22); - this.smpteTimeModedropFrameToolStripMenuItem.Text = "SMPTE timing (drop frame)"; - this.smpteTimeModedropFrameToolStripMenuItem.Click += new System.EventHandler(this.SmpteTimeModedropFrameToolStripMenuItem_Click); - // - // toolStripMenuItemImportChapters - // - this.toolStripMenuItemImportChapters.Name = "toolStripMenuItemImportChapters"; - this.toolStripMenuItemImportChapters.Size = new System.Drawing.Size(257, 22); - this.toolStripMenuItemImportChapters.Text = "Import chapters from video..."; - this.toolStripMenuItemImportChapters.Click += new System.EventHandler(this.toolStripMenuItemImportChapters_Click); - // - // toolStripMenuItemImportSceneChanges - // - this.toolStripMenuItemImportSceneChanges.Name = "toolStripMenuItemImportSceneChanges"; - this.toolStripMenuItemImportSceneChanges.Size = new System.Drawing.Size(257, 22); - this.toolStripMenuItemImportSceneChanges.Text = "Import scene changes..."; - this.toolStripMenuItemImportSceneChanges.Click += new System.EventHandler(this.toolStripMenuItemImportSceneChanges_Click); - // - // toolStripMenuItemRemoveSceneChanges - // - this.toolStripMenuItemRemoveSceneChanges.Name = "toolStripMenuItemRemoveSceneChanges"; - this.toolStripMenuItemRemoveSceneChanges.Size = new System.Drawing.Size(257, 22); - this.toolStripMenuItemRemoveSceneChanges.Text = "Remove scene changes"; - this.toolStripMenuItemRemoveSceneChanges.Click += new System.EventHandler(this.toolStripMenuItemRemoveSceneChanges_Click); - // - // toolStripMenuItemAddWaveformBatch - // - this.toolStripMenuItemAddWaveformBatch.Name = "toolStripMenuItemAddWaveformBatch"; - this.toolStripMenuItemAddWaveformBatch.Size = new System.Drawing.Size(257, 22); - this.toolStripMenuItemAddWaveformBatch.Text = "Add waveform batch..."; - this.toolStripMenuItemAddWaveformBatch.Click += new System.EventHandler(this.ToolStripMenuItemAddWaveformBatchClick); - // - // generateTextFromCurrentVideoToolStripMenuItem - // - this.generateTextFromCurrentVideoToolStripMenuItem.Name = "generateTextFromCurrentVideoToolStripMenuItem"; - this.generateTextFromCurrentVideoToolStripMenuItem.Size = new System.Drawing.Size(257, 22); - this.generateTextFromCurrentVideoToolStripMenuItem.Text = "Generate text from current video..."; - this.generateTextFromCurrentVideoToolStripMenuItem.Click += new System.EventHandler(this.generateTextFromCurrentVideoToolStripMenuItem_Click); - // - // toolStripSeparator5 - // - this.toolStripSeparator5.Name = "toolStripSeparator5"; - this.toolStripSeparator5.Size = new System.Drawing.Size(254, 6); - // - // showhideWaveformToolStripMenuItem - // - this.showhideWaveformToolStripMenuItem.Name = "showhideWaveformToolStripMenuItem"; - this.showhideWaveformToolStripMenuItem.Size = new System.Drawing.Size(257, 22); - this.showhideWaveformToolStripMenuItem.Text = "Show/hide waveform"; - this.showhideWaveformToolStripMenuItem.Click += new System.EventHandler(this.ShowhideWaveformToolStripMenuItemClick); - // - // showhideVideoToolStripMenuItem - // - this.showhideVideoToolStripMenuItem.Name = "showhideVideoToolStripMenuItem"; - this.showhideVideoToolStripMenuItem.Size = new System.Drawing.Size(257, 22); - this.showhideVideoToolStripMenuItem.Text = "Show/hide video"; - this.showhideVideoToolStripMenuItem.Click += new System.EventHandler(this.toolStripButtonToggleVideo_Click); - // - // toolStripSeparator19 - // - this.toolStripSeparator19.Name = "toolStripSeparator19"; - this.toolStripSeparator19.Size = new System.Drawing.Size(254, 6); - // - // undockVideoControlsToolStripMenuItem - // - this.undockVideoControlsToolStripMenuItem.Name = "undockVideoControlsToolStripMenuItem"; - this.undockVideoControlsToolStripMenuItem.Size = new System.Drawing.Size(257, 22); - this.undockVideoControlsToolStripMenuItem.Text = "Un-dock video controls"; - this.undockVideoControlsToolStripMenuItem.Click += new System.EventHandler(this.UndockVideoControlsToolStripMenuItemClick); - // - // redockVideoControlsToolStripMenuItem - // - this.redockVideoControlsToolStripMenuItem.Name = "redockVideoControlsToolStripMenuItem"; - this.redockVideoControlsToolStripMenuItem.Size = new System.Drawing.Size(257, 22); - this.redockVideoControlsToolStripMenuItem.Text = "Re-dock video controls"; - this.redockVideoControlsToolStripMenuItem.Visible = false; - this.redockVideoControlsToolStripMenuItem.Click += new System.EventHandler(this.RedockVideoControlsToolStripMenuItemClick); - // - // toolStripMenuItemSynchronization - // - this.toolStripMenuItemSynchronization.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripMenuItemAdjustAllTimes, - this.visualSyncToolStripMenuItem, - this.toolStripMenuItemPointSync, - this.pointSyncViaOtherSubtitleToolStripMenuItem, - this.toolStripMenuItemChangeFrameRate2, - this.changeSpeedInPercentToolStripMenuItem}); - this.toolStripMenuItemSynchronization.Name = "toolStripMenuItemSynchronization"; - this.toolStripMenuItemSynchronization.Size = new System.Drawing.Size(106, 20); - this.toolStripMenuItemSynchronization.Text = "Synchronization"; - // - // toolStripMenuItemAdjustAllTimes - // - this.toolStripMenuItemAdjustAllTimes.Name = "toolStripMenuItemAdjustAllTimes"; - this.toolStripMenuItemAdjustAllTimes.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) - | System.Windows.Forms.Keys.A))); - this.toolStripMenuItemAdjustAllTimes.Size = new System.Drawing.Size(324, 22); - this.toolStripMenuItemAdjustAllTimes.Text = "Adjust times (show earlier/later)..."; - this.toolStripMenuItemAdjustAllTimes.Click += new System.EventHandler(this.toolStripMenuItemAdjustAllTimes_Click); - // - // visualSyncToolStripMenuItem - // - this.visualSyncToolStripMenuItem.Name = "visualSyncToolStripMenuItem"; - this.visualSyncToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) - | System.Windows.Forms.Keys.V))); - this.visualSyncToolStripMenuItem.Size = new System.Drawing.Size(324, 22); - this.visualSyncToolStripMenuItem.Text = "Visual sync..."; - this.visualSyncToolStripMenuItem.Click += new System.EventHandler(this.VisualSyncToolStripMenuItemClick); - // - // toolStripMenuItemPointSync - // - this.toolStripMenuItemPointSync.Name = "toolStripMenuItemPointSync"; - this.toolStripMenuItemPointSync.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) - | System.Windows.Forms.Keys.P))); - this.toolStripMenuItemPointSync.Size = new System.Drawing.Size(324, 22); - this.toolStripMenuItemPointSync.Text = "Point sync..."; - this.toolStripMenuItemPointSync.Click += new System.EventHandler(this.toolStripMenuItemPointSync_Click); - // - // pointSyncViaOtherSubtitleToolStripMenuItem - // - this.pointSyncViaOtherSubtitleToolStripMenuItem.Name = "pointSyncViaOtherSubtitleToolStripMenuItem"; - this.pointSyncViaOtherSubtitleToolStripMenuItem.Size = new System.Drawing.Size(324, 22); - this.pointSyncViaOtherSubtitleToolStripMenuItem.Text = "Point sync via other subtitle..."; - this.pointSyncViaOtherSubtitleToolStripMenuItem.Click += new System.EventHandler(this.pointSyncViaOtherSubtitleToolStripMenuItem_Click); - // - // toolStripMenuItemChangeFrameRate2 - // - this.toolStripMenuItemChangeFrameRate2.Name = "toolStripMenuItemChangeFrameRate2"; - this.toolStripMenuItemChangeFrameRate2.Size = new System.Drawing.Size(324, 22); - this.toolStripMenuItemChangeFrameRate2.Text = "Change frame rate..."; - this.toolStripMenuItemChangeFrameRate2.Click += new System.EventHandler(this.ToolStripMenuItemChangeFrameRateClick); - // - // changeSpeedInPercentToolStripMenuItem - // - this.changeSpeedInPercentToolStripMenuItem.Name = "changeSpeedInPercentToolStripMenuItem"; - this.changeSpeedInPercentToolStripMenuItem.Size = new System.Drawing.Size(324, 22); - this.changeSpeedInPercentToolStripMenuItem.Text = "Change speed in percent..."; - this.changeSpeedInPercentToolStripMenuItem.Click += new System.EventHandler(this.changeSpeedInPercentToolStripMenuItem_Click); - // - // toolStripMenuItemAutoTranslate - // - this.toolStripMenuItemAutoTranslate.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.translatepoweredByMicrosoftToolStripMenuItem, - this.translateByGoogleToolStripMenuItem, - this.translateFromSwedishToDanishToolStripMenuItem}); - this.toolStripMenuItemAutoTranslate.Name = "toolStripMenuItemAutoTranslate"; - this.toolStripMenuItemAutoTranslate.Size = new System.Drawing.Size(94, 20); - this.toolStripMenuItemAutoTranslate.Text = "Auto-translate"; - this.toolStripMenuItemAutoTranslate.DropDownOpening += new System.EventHandler(this.toolStripMenuItemAutoTranslate_DropDownOpening); - // - // translatepoweredByMicrosoftToolStripMenuItem - // - this.translatepoweredByMicrosoftToolStripMenuItem.Name = "translatepoweredByMicrosoftToolStripMenuItem"; - this.translatepoweredByMicrosoftToolStripMenuItem.Size = new System.Drawing.Size(402, 22); - this.translatepoweredByMicrosoftToolStripMenuItem.Text = "Translate (powered by Microsoft)..."; - this.translatepoweredByMicrosoftToolStripMenuItem.Click += new System.EventHandler(this.translatepoweredByMicrosoftToolStripMenuItem_Click); - // - // translateByGoogleToolStripMenuItem - // - this.translateByGoogleToolStripMenuItem.Name = "translateByGoogleToolStripMenuItem"; - this.translateByGoogleToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) - | System.Windows.Forms.Keys.G))); - this.translateByGoogleToolStripMenuItem.Size = new System.Drawing.Size(402, 22); - this.translateByGoogleToolStripMenuItem.Text = "Translate (powered by Google)..."; - this.translateByGoogleToolStripMenuItem.Click += new System.EventHandler(this.TranslateByGoogleToolStripMenuItemClick); - // - // translateFromSwedishToDanishToolStripMenuItem - // - this.translateFromSwedishToDanishToolStripMenuItem.Name = "translateFromSwedishToDanishToolStripMenuItem"; - this.translateFromSwedishToDanishToolStripMenuItem.Size = new System.Drawing.Size(402, 22); - this.translateFromSwedishToDanishToolStripMenuItem.Text = "Translate from swedish to danish (powered by nikse.dk/mt)..."; - this.translateFromSwedishToDanishToolStripMenuItem.Click += new System.EventHandler(this.TranslateFromSwedishToDanishToolStripMenuItemClick); - // - // optionsToolStripMenuItem - // - this.optionsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.settingsToolStripMenuItem, - this.changeLanguageToolStripMenuItem}); - this.optionsToolStripMenuItem.Name = "optionsToolStripMenuItem"; - this.optionsToolStripMenuItem.Size = new System.Drawing.Size(61, 20); - this.optionsToolStripMenuItem.Text = "Options"; - // - // settingsToolStripMenuItem - // - this.settingsToolStripMenuItem.Name = "settingsToolStripMenuItem"; - this.settingsToolStripMenuItem.Size = new System.Drawing.Size(181, 22); - this.settingsToolStripMenuItem.Text = "Settings"; - this.settingsToolStripMenuItem.Click += new System.EventHandler(this.SettingsToolStripMenuItemClick); - // - // changeLanguageToolStripMenuItem - // - this.changeLanguageToolStripMenuItem.Name = "changeLanguageToolStripMenuItem"; - this.changeLanguageToolStripMenuItem.Size = new System.Drawing.Size(181, 22); - this.changeLanguageToolStripMenuItem.Text = "Change language..."; - this.changeLanguageToolStripMenuItem.Click += new System.EventHandler(this.ChangeLanguageToolStripMenuItemClick); - // - // toolStripMenuItemNetworking - // - this.toolStripMenuItemNetworking.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.startServerToolStripMenuItem, - this.joinSessionToolStripMenuItem, - this.chatToolStripMenuItem, - this.showSessionKeyLogToolStripMenuItem, - this.leaveSessionToolStripMenuItem}); - this.toolStripMenuItemNetworking.Name = "toolStripMenuItemNetworking"; - this.toolStripMenuItemNetworking.Size = new System.Drawing.Size(81, 20); - this.toolStripMenuItemNetworking.Text = "Networking"; - this.toolStripMenuItemNetworking.DropDownOpening += new System.EventHandler(this.toolStripMenuItemNetworking_DropDownOpening); - // - // startServerToolStripMenuItem - // - this.startServerToolStripMenuItem.Name = "startServerToolStripMenuItem"; - this.startServerToolStripMenuItem.Size = new System.Drawing.Size(217, 22); - this.startServerToolStripMenuItem.Text = "Start new session"; - this.startServerToolStripMenuItem.Click += new System.EventHandler(this.startServerToolStripMenuItem_Click); - // - // joinSessionToolStripMenuItem - // - this.joinSessionToolStripMenuItem.Name = "joinSessionToolStripMenuItem"; - this.joinSessionToolStripMenuItem.Size = new System.Drawing.Size(217, 22); - this.joinSessionToolStripMenuItem.Text = "Join session"; - this.joinSessionToolStripMenuItem.Click += new System.EventHandler(this.joinSessionToolStripMenuItem_Click); - // - // chatToolStripMenuItem - // - this.chatToolStripMenuItem.Name = "chatToolStripMenuItem"; - this.chatToolStripMenuItem.Size = new System.Drawing.Size(217, 22); - this.chatToolStripMenuItem.Text = "Chat"; - this.chatToolStripMenuItem.Click += new System.EventHandler(this.chatToolStripMenuItem_Click); - // - // showSessionKeyLogToolStripMenuItem - // - this.showSessionKeyLogToolStripMenuItem.Name = "showSessionKeyLogToolStripMenuItem"; - this.showSessionKeyLogToolStripMenuItem.Size = new System.Drawing.Size(217, 22); - this.showSessionKeyLogToolStripMenuItem.Text = "Show session info and log"; - this.showSessionKeyLogToolStripMenuItem.Click += new System.EventHandler(this.showSessionKeyLogToolStripMenuItem_Click); - // - // leaveSessionToolStripMenuItem - // - this.leaveSessionToolStripMenuItem.Name = "leaveSessionToolStripMenuItem"; - this.leaveSessionToolStripMenuItem.Size = new System.Drawing.Size(217, 22); - this.leaveSessionToolStripMenuItem.Text = "Leave session"; - this.leaveSessionToolStripMenuItem.Click += new System.EventHandler(this.LeaveSessionToolStripMenuItemClick); - // - // helpToolStripMenuItem - // - this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.checkForUpdatesToolStripMenuItem, - this.toolStripMenuItemSplitterCheckForUpdates, - this.helpToolStripMenuItem1, - this.aboutToolStripMenuItem}); - this.helpToolStripMenuItem.Name = "helpToolStripMenuItem"; - this.helpToolStripMenuItem.Size = new System.Drawing.Size(45, 20); - this.helpToolStripMenuItem.Text = "Help"; - this.helpToolStripMenuItem.DropDownClosed += new System.EventHandler(this.MenuClosed); - this.helpToolStripMenuItem.DropDownOpening += new System.EventHandler(this.MenuOpened); - // - // checkForUpdatesToolStripMenuItem - // - this.checkForUpdatesToolStripMenuItem.Name = "checkForUpdatesToolStripMenuItem"; - this.checkForUpdatesToolStripMenuItem.Size = new System.Drawing.Size(181, 22); - this.checkForUpdatesToolStripMenuItem.Text = "Check for updates..."; - this.checkForUpdatesToolStripMenuItem.Click += new System.EventHandler(this.checkForUpdatesToolStripMenuItem_Click); - // - // toolStripMenuItemSplitterCheckForUpdates - // - this.toolStripMenuItemSplitterCheckForUpdates.Name = "toolStripMenuItemSplitterCheckForUpdates"; - this.toolStripMenuItemSplitterCheckForUpdates.Size = new System.Drawing.Size(178, 6); - // - // helpToolStripMenuItem1 - // - this.helpToolStripMenuItem1.Name = "helpToolStripMenuItem1"; - this.helpToolStripMenuItem1.ShortcutKeys = System.Windows.Forms.Keys.F1; - this.helpToolStripMenuItem1.Size = new System.Drawing.Size(181, 22); - this.helpToolStripMenuItem1.Text = "Help"; - this.helpToolStripMenuItem1.Click += new System.EventHandler(this.HelpToolStripMenuItem1Click); - // - // aboutToolStripMenuItem - // - this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem"; - this.aboutToolStripMenuItem.Size = new System.Drawing.Size(181, 22); - this.aboutToolStripMenuItem.Text = "About"; - this.aboutToolStripMenuItem.Click += new System.EventHandler(this.AboutToolStripMenuItemClick); - // - // contextMenuStripListview - // - this.contextMenuStripListview.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.setStylesForSelectedLinesToolStripMenuItem, - this.setActorForSelectedLinesToolStripMenuItem, - this.toolStripMenuItemAssStyles, - this.toolStripMenuItemSetRegion, - this.toolStripMenuItemSetLanguage, - this.toolStripMenuItemWebVTT, - this.toolStripMenuItemPreview, - this.toolStripMenuItemDelete, - this.toolStripMenuItemInsertBefore, - this.toolStripMenuItemInsertAfter, - this.toolStripMenuItemInsertSubtitle, - this.toolStripMenuItemCopySourceText, - this.toolStripMenuItemColumn, - this.toolStripMenuItemBookmark, - this.toolStripSeparator7, - this.splitLineToolStripMenuItem, - this.toolStripMenuItemMergeLines, - this.toolStripMenuItemMergeDialog, - this.mergeBeforeToolStripMenuItem, - this.mergeAfterToolStripMenuItem, - this.toolStripSeparator4, - this.extendBeforeToolStripMenuItem, - this.extendAfterToolStripMenuItem, - this.toolStripSeparator8, - this.removeFormattinglToolStripMenuItem, - this.boldToolStripMenuItem, - this.italicToolStripMenuItem, - this.boxToolStripMenuItem, - this.underlineToolStripMenuItem, - this.colorToolStripMenuItem, - this.toolStripMenuItemFont, - this.toolStripMenuItemAlignment, - this.toolStripMenuItemSurroundWithMusicSymbols, - this.toolStripSeparator2, - this.toolStripMenuItemAutoBreakLines, - this.toolStripMenuItemUnbreakLines, - this.toolStripSeparatorBreakLines, - this.typeEffectToolStripMenuItem, - this.karokeeEffectToolStripMenuItem, - this.toolStripSeparatorAdvancedFunctions, - this.showSelectedLinesEarlierlaterToolStripMenuItem, - this.visualSyncSelectedLinesToolStripMenuItem, - this.toolStripMenuItemGoogleMicrosoftTranslateSelLine, - this.toolStripMenuItemTranslateSelected, - this.adjustDisplayTimeForSelectedLinesToolStripMenuItem, - this.fixCommonErrorsInSelectedLinesToolStripMenuItem, - this.changeCasingForSelectedLinesToolStripMenuItem, - this.toolStripMenuItemSaveSelectedLines}); - this.contextMenuStripListview.Name = "contextMenuStripListview"; - this.contextMenuStripListview.Size = new System.Drawing.Size(285, 964); - this.contextMenuStripListview.Closed += new System.Windows.Forms.ToolStripDropDownClosedEventHandler(this.MenuClosed); - this.contextMenuStripListview.Opening += new System.ComponentModel.CancelEventHandler(this.ContextMenuStripListviewOpening); - this.contextMenuStripListview.Opened += new System.EventHandler(this.MenuOpened); - // - // setStylesForSelectedLinesToolStripMenuItem - // - this.setStylesForSelectedLinesToolStripMenuItem.Name = "setStylesForSelectedLinesToolStripMenuItem"; - this.setStylesForSelectedLinesToolStripMenuItem.Size = new System.Drawing.Size(284, 22); - this.setStylesForSelectedLinesToolStripMenuItem.Text = "ASS: Set styles for selected lines..."; - // - // setActorForSelectedLinesToolStripMenuItem - // - this.setActorForSelectedLinesToolStripMenuItem.Name = "setActorForSelectedLinesToolStripMenuItem"; - this.setActorForSelectedLinesToolStripMenuItem.Size = new System.Drawing.Size(284, 22); - this.setActorForSelectedLinesToolStripMenuItem.Text = "ASS: Set styles for selected lines..."; - // - // toolStripMenuItemAssStyles - // - this.toolStripMenuItemAssStyles.Name = "toolStripMenuItemAssStyles"; - this.toolStripMenuItemAssStyles.Size = new System.Drawing.Size(284, 22); - this.toolStripMenuItemAssStyles.Text = "ASS: Styles..."; - this.toolStripMenuItemAssStyles.Click += new System.EventHandler(this.toolStripMenuItemAssStyles_Click); - // - // toolStripMenuItemSetRegion - // - this.toolStripMenuItemSetRegion.Name = "toolStripMenuItemSetRegion"; - this.toolStripMenuItemSetRegion.Size = new System.Drawing.Size(284, 22); - this.toolStripMenuItemSetRegion.Text = "Timed text - set region"; - // - // toolStripMenuItemSetLanguage - // - this.toolStripMenuItemSetLanguage.Name = "toolStripMenuItemSetLanguage"; - this.toolStripMenuItemSetLanguage.Size = new System.Drawing.Size(284, 22); - this.toolStripMenuItemSetLanguage.Text = "Timed text - set language"; - // - // toolStripMenuItemWebVTT - // - this.toolStripMenuItemWebVTT.Name = "toolStripMenuItemWebVTT"; - this.toolStripMenuItemWebVTT.Size = new System.Drawing.Size(284, 22); - this.toolStripMenuItemWebVTT.Text = "WebVTT voice"; - // - // toolStripMenuItemPreview - // - this.toolStripMenuItemPreview.Name = "toolStripMenuItemPreview"; - this.toolStripMenuItemPreview.Size = new System.Drawing.Size(284, 22); - this.toolStripMenuItemPreview.Text = "WebVTT browser preview"; - this.toolStripMenuItemPreview.Click += new System.EventHandler(this.toolStripMenuItemPreview_Click); - // - // toolStripMenuItemDelete - // - this.toolStripMenuItemDelete.Name = "toolStripMenuItemDelete"; - this.toolStripMenuItemDelete.Size = new System.Drawing.Size(284, 22); - this.toolStripMenuItemDelete.Text = "Delete"; - this.toolStripMenuItemDelete.Click += new System.EventHandler(this.ToolStripMenuItemDeleteClick); - // - // toolStripMenuItemInsertBefore - // - this.toolStripMenuItemInsertBefore.Name = "toolStripMenuItemInsertBefore"; - this.toolStripMenuItemInsertBefore.Size = new System.Drawing.Size(284, 22); - this.toolStripMenuItemInsertBefore.Text = "Insert before"; - this.toolStripMenuItemInsertBefore.Click += new System.EventHandler(this.ToolStripMenuItemInsertBeforeClick); - // - // toolStripMenuItemInsertAfter - // - this.toolStripMenuItemInsertAfter.Name = "toolStripMenuItemInsertAfter"; - this.toolStripMenuItemInsertAfter.Size = new System.Drawing.Size(284, 22); - this.toolStripMenuItemInsertAfter.Text = "Insert after"; - this.toolStripMenuItemInsertAfter.Click += new System.EventHandler(this.ToolStripMenuItemInsertAfterClick); - // - // toolStripMenuItemInsertSubtitle - // - this.toolStripMenuItemInsertSubtitle.Name = "toolStripMenuItemInsertSubtitle"; - this.toolStripMenuItemInsertSubtitle.Size = new System.Drawing.Size(284, 22); - this.toolStripMenuItemInsertSubtitle.Text = "Insert subtitle file after this line..."; - this.toolStripMenuItemInsertSubtitle.Click += new System.EventHandler(this.ToolStripMenuItemInsertSubtitleClick); - // - // toolStripMenuItemCopySourceText - // - this.toolStripMenuItemCopySourceText.Name = "toolStripMenuItemCopySourceText"; - this.toolStripMenuItemCopySourceText.Size = new System.Drawing.Size(284, 22); - this.toolStripMenuItemCopySourceText.Text = "Copy as text to clipboard"; - this.toolStripMenuItemCopySourceText.Click += new System.EventHandler(this.ToolStripMenuItemCopySourceTextClick); - // - // toolStripMenuItemColumn - // - this.toolStripMenuItemColumn.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.columnDeleteTextOnlyToolStripMenuItem, - this.toolStripMenuItemColumnDeleteText, - this.ShiftTextCellsDownToolStripMenuItem, - this.toolStripMenuItemInsertTextFromSub, - this.toolStripMenuItemColumnImportText, - this.toolStripMenuItemPasteSpecial, - this.copyOriginalTextToCurrentToolStripMenuItem, - this.moveTextUpToolStripMenuItem, - this.moveTextDownToolStripMenuItem}); - this.toolStripMenuItemColumn.Name = "toolStripMenuItemColumn"; - this.toolStripMenuItemColumn.Size = new System.Drawing.Size(284, 22); - this.toolStripMenuItemColumn.Text = "Column"; - this.toolStripMenuItemColumn.DropDownOpening += new System.EventHandler(this.toolStripMenuItemColumn_DropDownOpening); - // - // columnDeleteTextOnlyToolStripMenuItem - // - this.columnDeleteTextOnlyToolStripMenuItem.Name = "columnDeleteTextOnlyToolStripMenuItem"; - this.columnDeleteTextOnlyToolStripMenuItem.Size = new System.Drawing.Size(314, 22); - this.columnDeleteTextOnlyToolStripMenuItem.Text = "Delete text"; - this.columnDeleteTextOnlyToolStripMenuItem.Click += new System.EventHandler(this.columnDeleteTextOnlyToolStripMenuItem_Click); - // - // toolStripMenuItemColumnDeleteText - // - this.toolStripMenuItemColumnDeleteText.Name = "toolStripMenuItemColumnDeleteText"; - this.toolStripMenuItemColumnDeleteText.Size = new System.Drawing.Size(314, 22); - this.toolStripMenuItemColumnDeleteText.Text = "Delete text and shift text cells up"; - this.toolStripMenuItemColumnDeleteText.Click += new System.EventHandler(this.deleteAndShiftCellsUpToolStripMenuItem_Click); - // - // ShiftTextCellsDownToolStripMenuItem - // - this.ShiftTextCellsDownToolStripMenuItem.Name = "ShiftTextCellsDownToolStripMenuItem"; - this.ShiftTextCellsDownToolStripMenuItem.Size = new System.Drawing.Size(314, 22); - this.ShiftTextCellsDownToolStripMenuItem.Text = "Insert and shift text cells down"; - this.ShiftTextCellsDownToolStripMenuItem.Click += new System.EventHandler(this.ShiftTextCellsDownToolStripMenuItem_Click); - // - // toolStripMenuItemInsertTextFromSub - // - this.toolStripMenuItemInsertTextFromSub.Name = "toolStripMenuItemInsertTextFromSub"; - this.toolStripMenuItemInsertTextFromSub.Size = new System.Drawing.Size(314, 22); - this.toolStripMenuItemInsertTextFromSub.Text = "Insert text from subtitle and shift cells down..."; - this.toolStripMenuItemInsertTextFromSub.Click += new System.EventHandler(this.toolStripMenuItemInsertTextFromSub_Click); - // - // toolStripMenuItemColumnImportText - // - this.toolStripMenuItemColumnImportText.Name = "toolStripMenuItemColumnImportText"; - this.toolStripMenuItemColumnImportText.Size = new System.Drawing.Size(314, 22); - this.toolStripMenuItemColumnImportText.Text = "Import text and shift text cells down..."; - this.toolStripMenuItemColumnImportText.Click += new System.EventHandler(this.toolStripMenuItemColumnImportText_Click); - // - // toolStripMenuItemPasteSpecial - // - this.toolStripMenuItemPasteSpecial.Name = "toolStripMenuItemPasteSpecial"; - this.toolStripMenuItemPasteSpecial.Size = new System.Drawing.Size(314, 22); - this.toolStripMenuItemPasteSpecial.Text = "Paste from clipboard..."; - this.toolStripMenuItemPasteSpecial.Click += new System.EventHandler(this.toolStripMenuItemPasteSpecial_Click); - // - // copyOriginalTextToCurrentToolStripMenuItem - // - this.copyOriginalTextToCurrentToolStripMenuItem.Name = "copyOriginalTextToCurrentToolStripMenuItem"; - this.copyOriginalTextToCurrentToolStripMenuItem.Size = new System.Drawing.Size(314, 22); - this.copyOriginalTextToCurrentToolStripMenuItem.Text = "Copy original text to current"; - this.copyOriginalTextToCurrentToolStripMenuItem.Click += new System.EventHandler(this.copyOriginalTextToCurrentToolStripMenuItem_Click); - // - // moveTextUpToolStripMenuItem - // - this.moveTextUpToolStripMenuItem.Name = "moveTextUpToolStripMenuItem"; - this.moveTextUpToolStripMenuItem.Size = new System.Drawing.Size(314, 22); - this.moveTextUpToolStripMenuItem.Text = "Move text up"; - this.moveTextUpToolStripMenuItem.Click += new System.EventHandler(this.moveTextUpToolStripMenuItem_Click); - // - // moveTextDownToolStripMenuItem - // - this.moveTextDownToolStripMenuItem.Name = "moveTextDownToolStripMenuItem"; - this.moveTextDownToolStripMenuItem.Size = new System.Drawing.Size(314, 22); - this.moveTextDownToolStripMenuItem.Text = "Move text down"; - this.moveTextDownToolStripMenuItem.Click += new System.EventHandler(this.moveTextDownToolStripMenuItem_Click); - // - // toolStripMenuItemBookmark - // - this.toolStripMenuItemBookmark.Name = "toolStripMenuItemBookmark"; - this.toolStripMenuItemBookmark.Size = new System.Drawing.Size(284, 22); - this.toolStripMenuItemBookmark.Text = "Bookmark..."; - this.toolStripMenuItemBookmark.Click += new System.EventHandler(this.toolStripMenuItemBookmark_Click); - // - // toolStripSeparator7 - // - this.toolStripSeparator7.Name = "toolStripSeparator7"; - this.toolStripSeparator7.Size = new System.Drawing.Size(281, 6); - // - // splitLineToolStripMenuItem - // - this.splitLineToolStripMenuItem.Name = "splitLineToolStripMenuItem"; - this.splitLineToolStripMenuItem.Size = new System.Drawing.Size(284, 22); - this.splitLineToolStripMenuItem.Text = "Split"; - this.splitLineToolStripMenuItem.Click += new System.EventHandler(this.SplitLineToolStripMenuItemClick); - // - // toolStripMenuItemMergeLines - // - this.toolStripMenuItemMergeLines.Name = "toolStripMenuItemMergeLines"; - this.toolStripMenuItemMergeLines.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) - | System.Windows.Forms.Keys.M))); - this.toolStripMenuItemMergeLines.Size = new System.Drawing.Size(284, 22); - this.toolStripMenuItemMergeLines.Text = "Merge selected lines"; - this.toolStripMenuItemMergeLines.Click += new System.EventHandler(this.ToolStripMenuItemMergeLinesClick); - // - // toolStripMenuItemMergeDialog - // - this.toolStripMenuItemMergeDialog.Name = "toolStripMenuItemMergeDialog"; - this.toolStripMenuItemMergeDialog.Size = new System.Drawing.Size(284, 22); - this.toolStripMenuItemMergeDialog.Text = "Merge selected lines as dialog"; - this.toolStripMenuItemMergeDialog.Click += new System.EventHandler(this.ToolStripMenuItemMergeDialogClick); - // - // mergeBeforeToolStripMenuItem - // - this.mergeBeforeToolStripMenuItem.Name = "mergeBeforeToolStripMenuItem"; - this.mergeBeforeToolStripMenuItem.Size = new System.Drawing.Size(284, 22); - this.mergeBeforeToolStripMenuItem.Text = "Merge with line before"; - this.mergeBeforeToolStripMenuItem.Click += new System.EventHandler(this.MergeBeforeToolStripMenuItemClick); - // - // mergeAfterToolStripMenuItem - // - this.mergeAfterToolStripMenuItem.Name = "mergeAfterToolStripMenuItem"; - this.mergeAfterToolStripMenuItem.Size = new System.Drawing.Size(284, 22); - this.mergeAfterToolStripMenuItem.Text = "Merge with line after"; - this.mergeAfterToolStripMenuItem.Click += new System.EventHandler(this.MergeAfterToolStripMenuItemClick); - // - // toolStripSeparator4 - // - this.toolStripSeparator4.Name = "toolStripSeparator4"; - this.toolStripSeparator4.Size = new System.Drawing.Size(281, 6); - // - // extendBeforeToolStripMenuItem - // - this.extendBeforeToolStripMenuItem.Name = "extendBeforeToolStripMenuItem"; - this.extendBeforeToolStripMenuItem.Size = new System.Drawing.Size(284, 22); - this.extendBeforeToolStripMenuItem.Text = "Extend to line before"; - this.extendBeforeToolStripMenuItem.Click += new System.EventHandler(this.ExtendBeforeToolStripMenuItemClick); - // - // extendAfterToolStripMenuItem - // - this.extendAfterToolStripMenuItem.Name = "extendAfterToolStripMenuItem"; - this.extendAfterToolStripMenuItem.Size = new System.Drawing.Size(284, 22); - this.extendAfterToolStripMenuItem.Text = "Extend to line after"; - this.extendAfterToolStripMenuItem.Click += new System.EventHandler(this.ExtendAfterToolStripMenuItemClick); - // - // toolStripSeparator8 - // - this.toolStripSeparator8.Name = "toolStripSeparator8"; - this.toolStripSeparator8.Size = new System.Drawing.Size(281, 6); - // - // removeFormattinglToolStripMenuItem - // - this.removeFormattinglToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.removeAllFormattingsToolStripMenuItem, - this.removeBoldToolStripMenuItem, - this.removeItalicToolStripMenuItem, - this.removeUnderlineToolStripMenuItem, - this.removeColorToolStripMenuItem, - this.removeFontNameToolStripMenuItem, - this.removeAlignmentToolStripMenuItem}); - this.removeFormattinglToolStripMenuItem.Name = "removeFormattinglToolStripMenuItem"; - this.removeFormattinglToolStripMenuItem.Size = new System.Drawing.Size(284, 22); - this.removeFormattinglToolStripMenuItem.Text = "Remove formatting"; - // - // removeAllFormattingsToolStripMenuItem - // - this.removeAllFormattingsToolStripMenuItem.Name = "removeAllFormattingsToolStripMenuItem"; - this.removeAllFormattingsToolStripMenuItem.Size = new System.Drawing.Size(197, 22); - this.removeAllFormattingsToolStripMenuItem.Text = "Remove all formattings"; - this.removeAllFormattingsToolStripMenuItem.Click += new System.EventHandler(this.removeAllFormattingsToolStripMenuItem_Click); - // - // removeBoldToolStripMenuItem - // - this.removeBoldToolStripMenuItem.Name = "removeBoldToolStripMenuItem"; - this.removeBoldToolStripMenuItem.Size = new System.Drawing.Size(197, 22); - this.removeBoldToolStripMenuItem.Text = "Remove bold"; - this.removeBoldToolStripMenuItem.Click += new System.EventHandler(this.removeBoldToolStripMenuItem_Click); - // - // removeItalicToolStripMenuItem - // - this.removeItalicToolStripMenuItem.Name = "removeItalicToolStripMenuItem"; - this.removeItalicToolStripMenuItem.Size = new System.Drawing.Size(197, 22); - this.removeItalicToolStripMenuItem.Text = "Remove italic"; - this.removeItalicToolStripMenuItem.Click += new System.EventHandler(this.removeItalicToolStripMenuItem_Click); - // - // removeUnderlineToolStripMenuItem - // - this.removeUnderlineToolStripMenuItem.Name = "removeUnderlineToolStripMenuItem"; - this.removeUnderlineToolStripMenuItem.Size = new System.Drawing.Size(197, 22); - this.removeUnderlineToolStripMenuItem.Text = "Remove underline"; - this.removeUnderlineToolStripMenuItem.Click += new System.EventHandler(this.removeUnderlineToolStripMenuItem_Click); - // - // removeColorToolStripMenuItem - // - this.removeColorToolStripMenuItem.Name = "removeColorToolStripMenuItem"; - this.removeColorToolStripMenuItem.Size = new System.Drawing.Size(197, 22); - this.removeColorToolStripMenuItem.Text = "Remove color"; - this.removeColorToolStripMenuItem.Click += new System.EventHandler(this.removeColorToolStripMenuItem_Click); - // - // removeFontNameToolStripMenuItem - // - this.removeFontNameToolStripMenuItem.Name = "removeFontNameToolStripMenuItem"; - this.removeFontNameToolStripMenuItem.Size = new System.Drawing.Size(197, 22); - this.removeFontNameToolStripMenuItem.Text = "Remove font name"; - this.removeFontNameToolStripMenuItem.Click += new System.EventHandler(this.removeFontNameToolStripMenuItem_Click); - // - // removeAlignmentToolStripMenuItem - // - this.removeAlignmentToolStripMenuItem.Name = "removeAlignmentToolStripMenuItem"; - this.removeAlignmentToolStripMenuItem.Size = new System.Drawing.Size(197, 22); - this.removeAlignmentToolStripMenuItem.Text = "Remove alignment"; - this.removeAlignmentToolStripMenuItem.Click += new System.EventHandler(this.removeAlignmentToolStripMenuItem_Click); - // - // boldToolStripMenuItem - // - this.boldToolStripMenuItem.Name = "boldToolStripMenuItem"; - this.boldToolStripMenuItem.Size = new System.Drawing.Size(284, 22); - this.boldToolStripMenuItem.Text = "Bold"; - this.boldToolStripMenuItem.Click += new System.EventHandler(this.BoldToolStripMenuItemClick); - // - // italicToolStripMenuItem - // - this.italicToolStripMenuItem.Name = "italicToolStripMenuItem"; - this.italicToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.I))); - this.italicToolStripMenuItem.Size = new System.Drawing.Size(284, 22); - this.italicToolStripMenuItem.Text = "Italic"; - this.italicToolStripMenuItem.Click += new System.EventHandler(this.ItalicToolStripMenuItemClick); - // - // boxToolStripMenuItem - // - this.boxToolStripMenuItem.Name = "boxToolStripMenuItem"; - this.boxToolStripMenuItem.Size = new System.Drawing.Size(284, 22); - this.boxToolStripMenuItem.Text = "Box"; - this.boxToolStripMenuItem.Click += new System.EventHandler(this.boxToolStripMenuItem_Click); - // - // underlineToolStripMenuItem - // - this.underlineToolStripMenuItem.Name = "underlineToolStripMenuItem"; - this.underlineToolStripMenuItem.Size = new System.Drawing.Size(284, 22); - this.underlineToolStripMenuItem.Text = "Underline"; - this.underlineToolStripMenuItem.Click += new System.EventHandler(this.UnderlineToolStripMenuItemClick); - // - // colorToolStripMenuItem - // - this.colorToolStripMenuItem.Name = "colorToolStripMenuItem"; - this.colorToolStripMenuItem.Size = new System.Drawing.Size(284, 22); - this.colorToolStripMenuItem.Text = "Color..."; - this.colorToolStripMenuItem.Click += new System.EventHandler(this.ColorToolStripMenuItemClick); - // - // toolStripMenuItemFont - // - this.toolStripMenuItemFont.Name = "toolStripMenuItemFont"; - this.toolStripMenuItemFont.Size = new System.Drawing.Size(284, 22); - this.toolStripMenuItemFont.Text = "Font name..."; - this.toolStripMenuItemFont.Click += new System.EventHandler(this.toolStripMenuItemFont_Click); - // - // toolStripMenuItemAlignment - // - this.toolStripMenuItemAlignment.Name = "toolStripMenuItemAlignment"; - this.toolStripMenuItemAlignment.Size = new System.Drawing.Size(284, 22); - this.toolStripMenuItemAlignment.Text = "Alignment"; - this.toolStripMenuItemAlignment.Click += new System.EventHandler(this.toolStripMenuItemAlignment_Click); - // - // toolStripMenuItemSurroundWithMusicSymbols - // - this.toolStripMenuItemSurroundWithMusicSymbols.Name = "toolStripMenuItemSurroundWithMusicSymbols"; - this.toolStripMenuItemSurroundWithMusicSymbols.Size = new System.Drawing.Size(284, 22); - this.toolStripMenuItemSurroundWithMusicSymbols.Text = "♪"; - this.toolStripMenuItemSurroundWithMusicSymbols.Click += new System.EventHandler(this.ToolStripMenuItemSurroundWithMusicSymbolsClick); - // - // toolStripSeparator2 - // - this.toolStripSeparator2.Name = "toolStripSeparator2"; - this.toolStripSeparator2.Size = new System.Drawing.Size(281, 6); - // - // toolStripMenuItemAutoBreakLines - // - this.toolStripMenuItemAutoBreakLines.Name = "toolStripMenuItemAutoBreakLines"; - this.toolStripMenuItemAutoBreakLines.Size = new System.Drawing.Size(284, 22); - this.toolStripMenuItemAutoBreakLines.Text = "Auto balance selected lines..."; - this.toolStripMenuItemAutoBreakLines.Click += new System.EventHandler(this.ToolStripMenuItemAutoBreakLinesClick); - // - // toolStripMenuItemUnbreakLines - // - this.toolStripMenuItemUnbreakLines.Name = "toolStripMenuItemUnbreakLines"; - this.toolStripMenuItemUnbreakLines.Size = new System.Drawing.Size(284, 22); - this.toolStripMenuItemUnbreakLines.Text = "Remove line-breaks in selected lines..."; - this.toolStripMenuItemUnbreakLines.Click += new System.EventHandler(this.ToolStripMenuItemUnbreakLinesClick); - // - // toolStripSeparatorBreakLines - // - this.toolStripSeparatorBreakLines.Name = "toolStripSeparatorBreakLines"; - this.toolStripSeparatorBreakLines.Size = new System.Drawing.Size(281, 6); - // - // typeEffectToolStripMenuItem - // - this.typeEffectToolStripMenuItem.Name = "typeEffectToolStripMenuItem"; - this.typeEffectToolStripMenuItem.Size = new System.Drawing.Size(284, 22); - this.typeEffectToolStripMenuItem.Text = "Typewriter effect..."; - this.typeEffectToolStripMenuItem.Click += new System.EventHandler(this.TypeEffectToolStripMenuItemClick); - // - // karokeeEffectToolStripMenuItem - // - this.karokeeEffectToolStripMenuItem.Name = "karokeeEffectToolStripMenuItem"; - this.karokeeEffectToolStripMenuItem.Size = new System.Drawing.Size(284, 22); - this.karokeeEffectToolStripMenuItem.Text = "Karaoke effect..."; - this.karokeeEffectToolStripMenuItem.Click += new System.EventHandler(this.KarokeeEffectToolStripMenuItemClick); - // - // toolStripSeparatorAdvancedFunctions - // - this.toolStripSeparatorAdvancedFunctions.Name = "toolStripSeparatorAdvancedFunctions"; - this.toolStripSeparatorAdvancedFunctions.Size = new System.Drawing.Size(281, 6); - // - // showSelectedLinesEarlierlaterToolStripMenuItem - // - this.showSelectedLinesEarlierlaterToolStripMenuItem.Name = "showSelectedLinesEarlierlaterToolStripMenuItem"; - this.showSelectedLinesEarlierlaterToolStripMenuItem.Size = new System.Drawing.Size(284, 22); - this.showSelectedLinesEarlierlaterToolStripMenuItem.Text = "Show selected lines earlier/later..."; - this.showSelectedLinesEarlierlaterToolStripMenuItem.Click += new System.EventHandler(this.ShowSelectedLinesEarlierlaterToolStripMenuItemClick); - // - // visualSyncSelectedLinesToolStripMenuItem - // - this.visualSyncSelectedLinesToolStripMenuItem.Name = "visualSyncSelectedLinesToolStripMenuItem"; - this.visualSyncSelectedLinesToolStripMenuItem.Size = new System.Drawing.Size(284, 22); - this.visualSyncSelectedLinesToolStripMenuItem.Text = "Visual sync selected lines..."; - this.visualSyncSelectedLinesToolStripMenuItem.Click += new System.EventHandler(this.VisualSyncSelectedLinesToolStripMenuItemClick); - // - // toolStripMenuItemGoogleMicrosoftTranslateSelLine - // - this.toolStripMenuItemGoogleMicrosoftTranslateSelLine.Name = "toolStripMenuItemGoogleMicrosoftTranslateSelLine"; - this.toolStripMenuItemGoogleMicrosoftTranslateSelLine.Size = new System.Drawing.Size(284, 22); - this.toolStripMenuItemGoogleMicrosoftTranslateSelLine.Text = "Google/Microsoft translate selected line"; - this.toolStripMenuItemGoogleMicrosoftTranslateSelLine.Click += new System.EventHandler(this.ToolStripMenuItemGoogleMicrosoftTranslateSelLineClick); - // - // toolStripMenuItemTranslateSelected - // - this.toolStripMenuItemTranslateSelected.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.googleTranslateToolStripMenuItem, - this.microsoftBingTranslateToolStripMenuItem}); - this.toolStripMenuItemTranslateSelected.Name = "toolStripMenuItemTranslateSelected"; - this.toolStripMenuItemTranslateSelected.Size = new System.Drawing.Size(284, 22); - this.toolStripMenuItemTranslateSelected.Text = "Translate selected lines via..."; - // - // googleTranslateToolStripMenuItem - // - this.googleTranslateToolStripMenuItem.Name = "googleTranslateToolStripMenuItem"; - this.googleTranslateToolStripMenuItem.Size = new System.Drawing.Size(209, 22); - this.googleTranslateToolStripMenuItem.Text = "Google translate..."; - this.googleTranslateToolStripMenuItem.Click += new System.EventHandler(this.googleTranslateToolStripMenuItem_Click); - // - // microsoftBingTranslateToolStripMenuItem - // - this.microsoftBingTranslateToolStripMenuItem.Name = "microsoftBingTranslateToolStripMenuItem"; - this.microsoftBingTranslateToolStripMenuItem.Size = new System.Drawing.Size(209, 22); - this.microsoftBingTranslateToolStripMenuItem.Text = "Microsoft Bing translate..."; - this.microsoftBingTranslateToolStripMenuItem.Click += new System.EventHandler(this.microsoftBingTranslateToolStripMenuItem_Click); - // - // adjustDisplayTimeForSelectedLinesToolStripMenuItem - // - this.adjustDisplayTimeForSelectedLinesToolStripMenuItem.Name = "adjustDisplayTimeForSelectedLinesToolStripMenuItem"; - this.adjustDisplayTimeForSelectedLinesToolStripMenuItem.Size = new System.Drawing.Size(284, 22); - this.adjustDisplayTimeForSelectedLinesToolStripMenuItem.Text = "Adjust display time for selected lines..."; - this.adjustDisplayTimeForSelectedLinesToolStripMenuItem.Click += new System.EventHandler(this.AdjustDisplayTimeForSelectedLinesToolStripMenuItemClick); - // - // fixCommonErrorsInSelectedLinesToolStripMenuItem - // - this.fixCommonErrorsInSelectedLinesToolStripMenuItem.Name = "fixCommonErrorsInSelectedLinesToolStripMenuItem"; - this.fixCommonErrorsInSelectedLinesToolStripMenuItem.Size = new System.Drawing.Size(284, 22); - this.fixCommonErrorsInSelectedLinesToolStripMenuItem.Text = "Fix common errors in selected lines..."; - this.fixCommonErrorsInSelectedLinesToolStripMenuItem.Click += new System.EventHandler(this.FixCommonErrorsInSelectedLinesToolStripMenuItemClick); - // - // changeCasingForSelectedLinesToolStripMenuItem - // - this.changeCasingForSelectedLinesToolStripMenuItem.Name = "changeCasingForSelectedLinesToolStripMenuItem"; - this.changeCasingForSelectedLinesToolStripMenuItem.Size = new System.Drawing.Size(284, 22); - this.changeCasingForSelectedLinesToolStripMenuItem.Text = "Change casing for selected lines..."; - this.changeCasingForSelectedLinesToolStripMenuItem.Click += new System.EventHandler(this.ChangeCasingForSelectedLinesToolStripMenuItemClick); - // - // toolStripMenuItemSaveSelectedLines - // - this.toolStripMenuItemSaveSelectedLines.Name = "toolStripMenuItemSaveSelectedLines"; - this.toolStripMenuItemSaveSelectedLines.Size = new System.Drawing.Size(284, 22); - this.toolStripMenuItemSaveSelectedLines.Text = "Save selected lines as..."; - this.toolStripMenuItemSaveSelectedLines.Click += new System.EventHandler(this.ToolStripMenuItemSaveSelectedLinesClick); - // - // openFileDialog1 - // - this.openFileDialog1.FileName = "openFileDialog1"; - // - // timer1 - // - this.timer1.Tick += new System.EventHandler(this.timer1_Tick); - // - // groupBoxVideo - // - this.groupBoxVideo.Controls.Add(this.labelNextWord); - this.groupBoxVideo.Controls.Add(this.audioVisualizer); - this.groupBoxVideo.Controls.Add(this.checkBoxSyncListViewWithVideoWhilePlaying); - this.groupBoxVideo.Controls.Add(this.labelVideoInfo); - this.groupBoxVideo.Controls.Add(this.trackBarWaveformPosition); - this.groupBoxVideo.Controls.Add(this.panelWaveformControls); - this.groupBoxVideo.Controls.Add(this.tabControlButtons); - this.groupBoxVideo.Dock = System.Windows.Forms.DockStyle.Fill; - this.groupBoxVideo.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.groupBoxVideo.Location = new System.Drawing.Point(0, 0); - this.groupBoxVideo.Margin = new System.Windows.Forms.Padding(0); - this.groupBoxVideo.Name = "groupBoxVideo"; - this.groupBoxVideo.Padding = new System.Windows.Forms.Padding(0); - this.groupBoxVideo.Size = new System.Drawing.Size(975, 305); - this.groupBoxVideo.TabIndex = 1; - this.groupBoxVideo.TabStop = false; - // - // labelNextWord - // - this.labelNextWord.Anchor = System.Windows.Forms.AnchorStyles.None; - this.labelNextWord.AutoSize = true; - this.labelNextWord.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelNextWord.Location = new System.Drawing.Point(401, 9); - this.labelNextWord.Name = "labelNextWord"; - this.labelNextWord.Size = new System.Drawing.Size(71, 17); - this.labelNextWord.TabIndex = 13; - this.labelNextWord.Text = "Next: xxx"; - this.labelNextWord.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; - // - // audioVisualizer - // - this.audioVisualizer.AllowDrop = true; - this.audioVisualizer.AllowNewSelection = true; - this.audioVisualizer.AllowOverlap = false; - this.audioVisualizer.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.audioVisualizer.BackColor = System.Drawing.Color.Black; - this.audioVisualizer.BackgroundColor = System.Drawing.Color.Black; - this.audioVisualizer.ClosenessForBorderSelection = 15; - this.audioVisualizer.Color = System.Drawing.Color.GreenYellow; - this.audioVisualizer.CursorColor = System.Drawing.Color.Empty; - this.audioVisualizer.ChaptersColor = System.Drawing.Color.Empty; - this.audioVisualizer.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F); - this.audioVisualizer.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(18))))); - this.audioVisualizer.InsertAtVideoPositionShortcut = System.Windows.Forms.Keys.Insert; - this.audioVisualizer.Location = new System.Drawing.Point(472, 32); - this.audioVisualizer.Margin = new System.Windows.Forms.Padding(0); - this.audioVisualizer.MouseWheelScrollUpIsForward = true; - this.audioVisualizer.Move100MsLeft = System.Windows.Forms.Keys.None; - this.audioVisualizer.Move100MsRight = System.Windows.Forms.Keys.None; - this.audioVisualizer.MoveOneSecondLeft = System.Windows.Forms.Keys.None; - this.audioVisualizer.MoveOneSecondRight = System.Windows.Forms.Keys.None; - this.audioVisualizer.Name = "audioVisualizer"; - this.audioVisualizer.NewSelectionParagraph = null; - this.audioVisualizer.ParagraphColor = System.Drawing.Color.LimeGreen; - this.audioVisualizer.SceneChanges = ((System.Collections.Generic.List)(resources.GetObject("audioVisualizer.SceneChanges"))); - this.audioVisualizer.SelectedColor = System.Drawing.Color.Red; - this.audioVisualizer.ShowGridLines = true; - this.audioVisualizer.ShowSpectrogram = false; - this.audioVisualizer.ShowWaveform = true; - this.audioVisualizer.Size = new System.Drawing.Size(499, 229); - this.audioVisualizer.StartPositionSeconds = 0D; - this.audioVisualizer.TabIndex = 6; - this.audioVisualizer.TextBold = true; - this.audioVisualizer.TextColor = System.Drawing.Color.Gray; - this.audioVisualizer.TextSize = 9F; - this.audioVisualizer.VerticalZoomFactor = 1D; - this.audioVisualizer.WaveformNotLoadedText = "Click to add waveform"; - this.audioVisualizer.WavePeaks = null; - this.audioVisualizer.ZoomFactor = 1D; - this.audioVisualizer.Click += new System.EventHandler(this.AudioWaveform_Click); - this.audioVisualizer.DragDrop += new System.Windows.Forms.DragEventHandler(this.AudioWaveformDragDrop); - this.audioVisualizer.DragEnter += new System.Windows.Forms.DragEventHandler(this.AudioWaveformDragEnter); - this.audioVisualizer.MouseEnter += new System.EventHandler(this.audioVisualizer_MouseEnter); - // - // checkBoxSyncListViewWithVideoWhilePlaying - // - this.checkBoxSyncListViewWithVideoWhilePlaying.AutoSize = true; - this.checkBoxSyncListViewWithVideoWhilePlaying.Location = new System.Drawing.Point(558, 11); - this.checkBoxSyncListViewWithVideoWhilePlaying.Name = "checkBoxSyncListViewWithVideoWhilePlaying"; - this.checkBoxSyncListViewWithVideoWhilePlaying.Size = new System.Drawing.Size(205, 17); - this.checkBoxSyncListViewWithVideoWhilePlaying.TabIndex = 1; - this.checkBoxSyncListViewWithVideoWhilePlaying.Text = "Sync listview with movie when playing"; - this.checkBoxSyncListViewWithVideoWhilePlaying.UseVisualStyleBackColor = true; - // - // labelVideoInfo - // - this.labelVideoInfo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.labelVideoInfo.Location = new System.Drawing.Point(603, 12); - this.labelVideoInfo.Name = "labelVideoInfo"; - this.labelVideoInfo.Size = new System.Drawing.Size(369, 19); - this.labelVideoInfo.TabIndex = 12; - this.labelVideoInfo.Text = "No video file loaded"; - this.labelVideoInfo.TextAlign = System.Drawing.ContentAlignment.TopRight; - // - // trackBarWaveformPosition - // - this.trackBarWaveformPosition.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.trackBarWaveformPosition.AutoSize = false; - this.trackBarWaveformPosition.Location = new System.Drawing.Point(674, 267); - this.trackBarWaveformPosition.Maximum = 1000; - this.trackBarWaveformPosition.Name = "trackBarWaveformPosition"; - this.trackBarWaveformPosition.Size = new System.Drawing.Size(297, 20); - this.trackBarWaveformPosition.TabIndex = 11; - this.trackBarWaveformPosition.TickStyle = System.Windows.Forms.TickStyle.None; - this.trackBarWaveformPosition.ValueChanged += new System.EventHandler(this.trackBarWaveformPosition_ValueChanged); - this.trackBarWaveformPosition.KeyDown += new System.Windows.Forms.KeyEventHandler(this.trackBarWaveformPosition_KeyDown); - // - // panelWaveformControls - // - this.panelWaveformControls.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.panelWaveformControls.Controls.Add(this.toolStripWaveControls); - this.panelWaveformControls.Location = new System.Drawing.Point(474, 265); - this.panelWaveformControls.Name = "panelWaveformControls"; - this.panelWaveformControls.Size = new System.Drawing.Size(205, 30); - this.panelWaveformControls.TabIndex = 10; - // - // toolStripWaveControls - // - this.toolStripWaveControls.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.toolStripWaveControls.Dock = System.Windows.Forms.DockStyle.None; - this.toolStripWaveControls.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; - this.toolStripWaveControls.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripButtonWaveformZoomOut, - this.toolStripComboBoxWaveform, - this.toolStripButtonWaveformZoomIn, - this.toolStripSeparator16, - this.toolStripButtonWaveformPause, - this.toolStripButtonWaveformPlay, - this.toolStripButtonLockCenter, - this.toolStripSplitButtonPlayRate}); - this.toolStripWaveControls.Location = new System.Drawing.Point(0, 3); - this.toolStripWaveControls.Name = "toolStripWaveControls"; - this.toolStripWaveControls.Size = new System.Drawing.Size(197, 25); - this.toolStripWaveControls.TabIndex = 0; - this.toolStripWaveControls.Text = "toolStrip2"; - // - // toolStripButtonWaveformZoomOut - // - this.toolStripButtonWaveformZoomOut.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.toolStripButtonWaveformZoomOut.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonWaveformZoomOut.Image"))); - this.toolStripButtonWaveformZoomOut.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButtonWaveformZoomOut.Name = "toolStripButtonWaveformZoomOut"; - this.toolStripButtonWaveformZoomOut.Size = new System.Drawing.Size(23, 22); - this.toolStripButtonWaveformZoomOut.Text = "toolStripButton3"; - this.toolStripButtonWaveformZoomOut.Click += new System.EventHandler(this.toolStripButtonWaveformZoomOut_Click); - // - // toolStripComboBoxWaveform - // - this.toolStripComboBoxWaveform.AutoSize = false; - this.toolStripComboBoxWaveform.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.toolStripComboBoxWaveform.Name = "toolStripComboBoxWaveform"; - this.toolStripComboBoxWaveform.Size = new System.Drawing.Size(62, 23); - // - // toolStripButtonWaveformZoomIn - // - this.toolStripButtonWaveformZoomIn.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.toolStripButtonWaveformZoomIn.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonWaveformZoomIn.Image"))); - this.toolStripButtonWaveformZoomIn.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButtonWaveformZoomIn.Name = "toolStripButtonWaveformZoomIn"; - this.toolStripButtonWaveformZoomIn.Size = new System.Drawing.Size(23, 22); - this.toolStripButtonWaveformZoomIn.Text = "toolStripButton1"; - this.toolStripButtonWaveformZoomIn.Click += new System.EventHandler(this.toolStripButtonWaveformZoomIn_Click); - // - // toolStripSeparator16 - // - this.toolStripSeparator16.Name = "toolStripSeparator16"; - this.toolStripSeparator16.Size = new System.Drawing.Size(6, 25); - // - // toolStripButtonWaveformPause - // - this.toolStripButtonWaveformPause.AutoToolTip = false; - this.toolStripButtonWaveformPause.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.toolStripButtonWaveformPause.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonWaveformPause.Image"))); - this.toolStripButtonWaveformPause.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButtonWaveformPause.Name = "toolStripButtonWaveformPause"; - this.toolStripButtonWaveformPause.Size = new System.Drawing.Size(23, 22); - this.toolStripButtonWaveformPause.Text = "toolStripButton1"; - this.toolStripButtonWaveformPause.Visible = false; - this.toolStripButtonWaveformPause.Click += new System.EventHandler(this.toolStripButtonWaveformPause_Click); - // - // toolStripButtonWaveformPlay - // - this.toolStripButtonWaveformPlay.AutoToolTip = false; - this.toolStripButtonWaveformPlay.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.toolStripButtonWaveformPlay.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonWaveformPlay.Image"))); - this.toolStripButtonWaveformPlay.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButtonWaveformPlay.Name = "toolStripButtonWaveformPlay"; - this.toolStripButtonWaveformPlay.Size = new System.Drawing.Size(23, 22); - this.toolStripButtonWaveformPlay.Text = "toolStripButton1"; - this.toolStripButtonWaveformPlay.Click += new System.EventHandler(this.toolStripButtonWaveformPlay_Click); - // - // toolStripButtonLockCenter - // - this.toolStripButtonLockCenter.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.toolStripButtonLockCenter.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonLockCenter.Image"))); - this.toolStripButtonLockCenter.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButtonLockCenter.Name = "toolStripButtonLockCenter"; - this.toolStripButtonLockCenter.Size = new System.Drawing.Size(23, 22); - this.toolStripButtonLockCenter.Text = "Center"; - this.toolStripButtonLockCenter.Click += new System.EventHandler(this.toolStripButtonLockCenter_Click); - // - // toolStripSplitButtonPlayRate - // - this.toolStripSplitButtonPlayRate.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.toolStripSplitButtonPlayRate.Image = ((System.Drawing.Image)(resources.GetObject("toolStripSplitButtonPlayRate.Image"))); - this.toolStripSplitButtonPlayRate.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripSplitButtonPlayRate.Name = "toolStripSplitButtonPlayRate"; - this.toolStripSplitButtonPlayRate.Size = new System.Drawing.Size(32, 22); - this.toolStripSplitButtonPlayRate.Text = "Play rate (speed)"; - this.toolStripSplitButtonPlayRate.ButtonClick += new System.EventHandler(this.toolStripSplitButtonPlayRate_ButtonClick); - // - // tabControlButtons - // - this.tabControlButtons.Controls.Add(this.tabPageTranslate); - this.tabControlButtons.Controls.Add(this.tabPageCreate); - this.tabControlButtons.Controls.Add(this.tabPageAdjust); - this.tabControlButtons.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed; - this.tabControlButtons.Location = new System.Drawing.Point(6, 12); - this.tabControlButtons.Name = "tabControlButtons"; - this.tabControlButtons.SelectedIndex = 0; - this.tabControlButtons.Size = new System.Drawing.Size(467, 283); - this.tabControlButtons.TabIndex = 0; - this.tabControlButtons.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.TabControlButtonsDrawItem); - this.tabControlButtons.SelectedIndexChanged += new System.EventHandler(this.tabControl1_SelectedIndexChanged); - // - // tabPageTranslate - // - this.tabPageTranslate.Controls.Add(this.labelTranslateTip); - this.tabPageTranslate.Controls.Add(this.groupBoxTranslateSearch); - this.tabPageTranslate.Controls.Add(this.groupBoxAutoContinue); - this.tabPageTranslate.Controls.Add(this.buttonStop); - this.tabPageTranslate.Controls.Add(this.groupBoxAutoRepeat); - this.tabPageTranslate.Controls.Add(this.buttonPlayPrevious); - this.tabPageTranslate.Controls.Add(this.buttonPlayCurrent); - this.tabPageTranslate.Controls.Add(this.buttonPlayNext); - this.tabPageTranslate.Location = new System.Drawing.Point(4, 22); - this.tabPageTranslate.Name = "tabPageTranslate"; - this.tabPageTranslate.Padding = new System.Windows.Forms.Padding(3); - this.tabPageTranslate.Size = new System.Drawing.Size(459, 257); - this.tabPageTranslate.TabIndex = 0; - this.tabPageTranslate.Text = "Translate"; - this.tabPageTranslate.UseVisualStyleBackColor = true; - // - // labelTranslateTip - // - this.labelTranslateTip.AutoSize = true; - this.labelTranslateTip.ForeColor = System.Drawing.Color.Gray; - this.labelTranslateTip.Location = new System.Drawing.Point(16, 225); - this.labelTranslateTip.Name = "labelTranslateTip"; - this.labelTranslateTip.Size = new System.Drawing.Size(294, 13); - this.labelTranslateTip.TabIndex = 7; - this.labelTranslateTip.Text = "Tip: Use to go to previous/next subtitle"; - // - // groupBoxTranslateSearch - // - this.groupBoxTranslateSearch.Controls.Add(this.buttonCustomUrl2); - this.groupBoxTranslateSearch.Controls.Add(this.buttonCustomUrl1); - this.groupBoxTranslateSearch.Controls.Add(this.buttonGoogleTranslateIt); - this.groupBoxTranslateSearch.Controls.Add(this.buttonGoogleIt); - this.groupBoxTranslateSearch.Controls.Add(this.textBoxSearchWord); - this.groupBoxTranslateSearch.Location = new System.Drawing.Point(198, 68); - this.groupBoxTranslateSearch.Name = "groupBoxTranslateSearch"; - this.groupBoxTranslateSearch.Size = new System.Drawing.Size(256, 150); - this.groupBoxTranslateSearch.TabIndex = 6; - this.groupBoxTranslateSearch.TabStop = false; - this.groupBoxTranslateSearch.Text = "Search text online"; - // - // buttonCustomUrl2 - // - this.buttonCustomUrl2.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCustomUrl2.Location = new System.Drawing.Point(6, 118); - this.buttonCustomUrl2.Name = "buttonCustomUrl2"; - this.buttonCustomUrl2.Size = new System.Drawing.Size(244, 23); - this.buttonCustomUrl2.TabIndex = 4; - this.buttonCustomUrl2.Text = "Custom URL"; - this.buttonCustomUrl2.UseVisualStyleBackColor = true; - this.buttonCustomUrl2.Click += new System.EventHandler(this.buttonCustomUrl2_Click); - // - // buttonCustomUrl1 - // - this.buttonCustomUrl1.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCustomUrl1.Location = new System.Drawing.Point(6, 91); - this.buttonCustomUrl1.Name = "buttonCustomUrl1"; - this.buttonCustomUrl1.Size = new System.Drawing.Size(244, 23); - this.buttonCustomUrl1.TabIndex = 3; - this.buttonCustomUrl1.Text = "Custom URL"; - this.buttonCustomUrl1.UseVisualStyleBackColor = true; - this.buttonCustomUrl1.Click += new System.EventHandler(this.buttonCustomUrl_Click); - // - // buttonGoogleTranslateIt - // - this.buttonGoogleTranslateIt.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonGoogleTranslateIt.Location = new System.Drawing.Point(132, 63); - this.buttonGoogleTranslateIt.Name = "buttonGoogleTranslateIt"; - this.buttonGoogleTranslateIt.Size = new System.Drawing.Size(118, 23); - this.buttonGoogleTranslateIt.TabIndex = 2; - this.buttonGoogleTranslateIt.Text = "Google translate it"; - this.buttonGoogleTranslateIt.UseVisualStyleBackColor = true; - this.buttonGoogleTranslateIt.Click += new System.EventHandler(this.buttonGoogleTranslateIt_Click); - // - // buttonGoogleIt - // - this.buttonGoogleIt.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonGoogleIt.Location = new System.Drawing.Point(6, 63); - this.buttonGoogleIt.Name = "buttonGoogleIt"; - this.buttonGoogleIt.Size = new System.Drawing.Size(120, 23); - this.buttonGoogleIt.TabIndex = 1; - this.buttonGoogleIt.Text = "Google it"; - this.buttonGoogleIt.UseVisualStyleBackColor = true; - this.buttonGoogleIt.Click += new System.EventHandler(this.buttonGoogleIt_Click); - // - // textBoxSearchWord - // - this.textBoxSearchWord.Location = new System.Drawing.Point(6, 18); - this.textBoxSearchWord.Multiline = true; - this.textBoxSearchWord.Name = "textBoxSearchWord"; - this.textBoxSearchWord.Size = new System.Drawing.Size(244, 39); - this.textBoxSearchWord.TabIndex = 0; - // - // groupBoxAutoContinue - // - this.groupBoxAutoContinue.Controls.Add(this.comboBoxAutoContinue); - this.groupBoxAutoContinue.Controls.Add(this.labelAutoContinueDelay); - this.groupBoxAutoContinue.Controls.Add(this.checkBoxAutoContinue); - this.groupBoxAutoContinue.Location = new System.Drawing.Point(12, 120); - this.groupBoxAutoContinue.Name = "groupBoxAutoContinue"; - this.groupBoxAutoContinue.Size = new System.Drawing.Size(182, 98); - this.groupBoxAutoContinue.TabIndex = 1; - this.groupBoxAutoContinue.TabStop = false; - this.groupBoxAutoContinue.Text = "Auto continue"; - // - // comboBoxAutoContinue - // - this.comboBoxAutoContinue.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxAutoContinue.FormattingEnabled = true; - this.comboBoxAutoContinue.Items.AddRange(new object[] { - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "10", - "11", - "12", - "13", - "14", - "15"}); - this.comboBoxAutoContinue.Location = new System.Drawing.Point(6, 59); - this.comboBoxAutoContinue.Name = "comboBoxAutoContinue"; - this.comboBoxAutoContinue.Size = new System.Drawing.Size(96, 21); - this.comboBoxAutoContinue.TabIndex = 2; - // - // labelAutoContinueDelay - // - this.labelAutoContinueDelay.AutoSize = true; - this.labelAutoContinueDelay.Location = new System.Drawing.Point(7, 43); - this.labelAutoContinueDelay.Name = "labelAutoContinueDelay"; - this.labelAutoContinueDelay.Size = new System.Drawing.Size(83, 13); - this.labelAutoContinueDelay.TabIndex = 1; - this.labelAutoContinueDelay.Text = "Delay (seconds)"; - // - // checkBoxAutoContinue - // - this.checkBoxAutoContinue.AutoSize = true; - this.checkBoxAutoContinue.Location = new System.Drawing.Point(10, 19); - this.checkBoxAutoContinue.Name = "checkBoxAutoContinue"; - this.checkBoxAutoContinue.Size = new System.Drawing.Size(107, 17); - this.checkBoxAutoContinue.TabIndex = 0; - this.checkBoxAutoContinue.Text = "Auto continue on"; - this.checkBoxAutoContinue.UseVisualStyleBackColor = true; - // - // buttonStop - // - this.buttonStop.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonStop.Location = new System.Drawing.Point(288, 42); - this.buttonStop.Name = "buttonStop"; - this.buttonStop.Size = new System.Drawing.Size(76, 23); - this.buttonStop.TabIndex = 5; - this.buttonStop.Text = "Pa&use"; - this.buttonStop.UseVisualStyleBackColor = true; - this.buttonStop.Click += new System.EventHandler(this.buttonStop_Click); - // - // groupBoxAutoRepeat - // - this.groupBoxAutoRepeat.Controls.Add(this.comboBoxAutoRepeat); - this.groupBoxAutoRepeat.Controls.Add(this.labelAutoRepeatCount); - this.groupBoxAutoRepeat.Controls.Add(this.checkBoxAutoRepeatOn); - this.groupBoxAutoRepeat.Location = new System.Drawing.Point(12, 14); - this.groupBoxAutoRepeat.Name = "groupBoxAutoRepeat"; - this.groupBoxAutoRepeat.Size = new System.Drawing.Size(182, 100); - this.groupBoxAutoRepeat.TabIndex = 0; - this.groupBoxAutoRepeat.TabStop = false; - this.groupBoxAutoRepeat.Text = "Auto repeat"; - // - // comboBoxAutoRepeat - // - this.comboBoxAutoRepeat.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxAutoRepeat.FormattingEnabled = true; - this.comboBoxAutoRepeat.Items.AddRange(new object[] { - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9"}); - this.comboBoxAutoRepeat.Location = new System.Drawing.Point(6, 60); - this.comboBoxAutoRepeat.Name = "comboBoxAutoRepeat"; - this.comboBoxAutoRepeat.Size = new System.Drawing.Size(96, 21); - this.comboBoxAutoRepeat.TabIndex = 2; - // - // labelAutoRepeatCount - // - this.labelAutoRepeatCount.AutoSize = true; - this.labelAutoRepeatCount.Location = new System.Drawing.Point(6, 44); - this.labelAutoRepeatCount.Name = "labelAutoRepeatCount"; - this.labelAutoRepeatCount.Size = new System.Drawing.Size(105, 13); - this.labelAutoRepeatCount.TabIndex = 1; - this.labelAutoRepeatCount.Text = "Repeat count (times)"; - // - // checkBoxAutoRepeatOn - // - this.checkBoxAutoRepeatOn.AutoSize = true; - this.checkBoxAutoRepeatOn.Checked = true; - this.checkBoxAutoRepeatOn.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxAutoRepeatOn.Location = new System.Drawing.Point(10, 19); - this.checkBoxAutoRepeatOn.Name = "checkBoxAutoRepeatOn"; - this.checkBoxAutoRepeatOn.Size = new System.Drawing.Size(96, 17); - this.checkBoxAutoRepeatOn.TabIndex = 0; - this.checkBoxAutoRepeatOn.Text = "Auto repeat on"; - this.checkBoxAutoRepeatOn.UseVisualStyleBackColor = true; - // - // buttonPlayPrevious - // - this.buttonPlayPrevious.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonPlayPrevious.Location = new System.Drawing.Point(206, 14); - this.buttonPlayPrevious.Name = "buttonPlayPrevious"; - this.buttonPlayPrevious.Size = new System.Drawing.Size(76, 23); - this.buttonPlayPrevious.TabIndex = 2; - this.buttonPlayPrevious.Text = "<< Previous"; - this.buttonPlayPrevious.UseVisualStyleBackColor = true; - this.buttonPlayPrevious.Click += new System.EventHandler(this.buttonPlayPrevious_Click); - // - // buttonPlayCurrent - // - this.buttonPlayCurrent.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonPlayCurrent.Location = new System.Drawing.Point(288, 14); - this.buttonPlayCurrent.Name = "buttonPlayCurrent"; - this.buttonPlayCurrent.Size = new System.Drawing.Size(76, 23); - this.buttonPlayCurrent.TabIndex = 3; - this.buttonPlayCurrent.Text = "&Play current"; - this.buttonPlayCurrent.UseVisualStyleBackColor = true; - this.buttonPlayCurrent.Click += new System.EventHandler(this.ButtonPlayCurrentClick); - // - // buttonPlayNext - // - this.buttonPlayNext.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonPlayNext.Location = new System.Drawing.Point(369, 14); - this.buttonPlayNext.Name = "buttonPlayNext"; - this.buttonPlayNext.Size = new System.Drawing.Size(76, 23); - this.buttonPlayNext.TabIndex = 4; - this.buttonPlayNext.Text = "Next >>"; - this.buttonPlayNext.UseVisualStyleBackColor = true; - this.buttonPlayNext.Click += new System.EventHandler(this.buttonPlayNext_Click); - // - // tabPageCreate - // - this.tabPageCreate.Controls.Add(this.timeUpDownVideoPosition); - this.tabPageCreate.Controls.Add(this.buttonGotoSub); - this.tabPageCreate.Controls.Add(this.buttonBeforeText); - this.tabPageCreate.Controls.Add(this.buttonSetEnd); - this.tabPageCreate.Controls.Add(this.buttonInsertNewText); - this.tabPageCreate.Controls.Add(this.buttonSetStartTime); - this.tabPageCreate.Controls.Add(this.labelCreateF12); - this.tabPageCreate.Controls.Add(this.labelCreateF11); - this.tabPageCreate.Controls.Add(this.labelCreateF10); - this.tabPageCreate.Controls.Add(this.labelCreateF9); - this.tabPageCreate.Controls.Add(this.buttonForward2); - this.tabPageCreate.Controls.Add(this.numericUpDownSec2); - this.tabPageCreate.Controls.Add(this.buttonSecBack2); - this.tabPageCreate.Controls.Add(this.buttonForward1); - this.tabPageCreate.Controls.Add(this.numericUpDownSec1); - this.tabPageCreate.Controls.Add(this.labelVideoPosition); - this.tabPageCreate.Controls.Add(this.buttonSecBack1); - this.tabPageCreate.Location = new System.Drawing.Point(4, 22); - this.tabPageCreate.Name = "tabPageCreate"; - this.tabPageCreate.Padding = new System.Windows.Forms.Padding(3); - this.tabPageCreate.Size = new System.Drawing.Size(459, 257); - this.tabPageCreate.TabIndex = 1; - this.tabPageCreate.Text = "Create"; - this.tabPageCreate.UseVisualStyleBackColor = true; - // - // timeUpDownVideoPosition - // - this.timeUpDownVideoPosition.AutoSize = true; - this.timeUpDownVideoPosition.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.timeUpDownVideoPosition.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F); - this.timeUpDownVideoPosition.Location = new System.Drawing.Point(96, 191); - this.timeUpDownVideoPosition.Margin = new System.Windows.Forms.Padding(4); - this.timeUpDownVideoPosition.Name = "timeUpDownVideoPosition"; - this.timeUpDownVideoPosition.Size = new System.Drawing.Size(111, 27); - this.timeUpDownVideoPosition.TabIndex = 12; - timeCode4.Hours = 0; - timeCode4.Milliseconds = 0; - timeCode4.Minutes = 0; - timeCode4.Seconds = 0; - timeCode4.TimeSpan = System.TimeSpan.Parse("00:00:00"); - timeCode4.TotalMilliseconds = 0D; - timeCode4.TotalSeconds = 0D; - this.timeUpDownVideoPosition.TimeCode = timeCode4; - this.timeUpDownVideoPosition.UseVideoOffset = false; - // - // buttonGotoSub - // - this.buttonGotoSub.Location = new System.Drawing.Point(6, 58); - this.buttonGotoSub.Name = "buttonGotoSub"; - this.buttonGotoSub.Size = new System.Drawing.Size(180, 23); - this.buttonGotoSub.TabIndex = 2; - this.buttonGotoSub.Text = "Goto subposition and pause"; - this.buttonGotoSub.UseVisualStyleBackColor = true; - this.buttonGotoSub.Click += new System.EventHandler(this.buttonGotoSub_Click); - this.buttonGotoSub.MouseEnter += new System.EventHandler(this.buttonGotoSub_MouseEnter); - // - // buttonBeforeText - // - this.buttonBeforeText.Location = new System.Drawing.Point(6, 32); - this.buttonBeforeText.Name = "buttonBeforeText"; - this.buttonBeforeText.Size = new System.Drawing.Size(180, 23); - this.buttonBeforeText.TabIndex = 1; - this.buttonBeforeText.Text = "Play from just before &text"; - this.buttonBeforeText.UseVisualStyleBackColor = true; - this.buttonBeforeText.Click += new System.EventHandler(this.buttonBeforeText_Click); - this.buttonBeforeText.MouseEnter += new System.EventHandler(this.buttonBeforeText_MouseEnter); - // - // buttonSetEnd - // - this.buttonSetEnd.Location = new System.Drawing.Point(6, 110); - this.buttonSetEnd.Name = "buttonSetEnd"; - this.buttonSetEnd.Size = new System.Drawing.Size(180, 23); - this.buttonSetEnd.TabIndex = 4; - this.buttonSetEnd.Text = "Set &end time"; - this.buttonSetEnd.UseVisualStyleBackColor = true; - this.buttonSetEnd.Click += new System.EventHandler(this.ButtonSetEndClick); - this.buttonSetEnd.MouseEnter += new System.EventHandler(this.buttonSetEnd_MouseEnter); - // - // buttonInsertNewText - // - this.buttonInsertNewText.Location = new System.Drawing.Point(6, 6); - this.buttonInsertNewText.Name = "buttonInsertNewText"; - this.buttonInsertNewText.Size = new System.Drawing.Size(180, 23); - this.buttonInsertNewText.TabIndex = 0; - this.buttonInsertNewText.Text = "&Insert new subtitle at vpos"; - this.buttonInsertNewText.UseVisualStyleBackColor = true; - this.buttonInsertNewText.Click += new System.EventHandler(this.ButtonInsertNewTextClick); - this.buttonInsertNewText.MouseEnter += new System.EventHandler(this.buttonInsertNewText_MouseEnter); - // - // buttonSetStartTime - // - this.buttonSetStartTime.Location = new System.Drawing.Point(6, 84); - this.buttonSetStartTime.Name = "buttonSetStartTime"; - this.buttonSetStartTime.Size = new System.Drawing.Size(180, 23); - this.buttonSetStartTime.TabIndex = 3; - this.buttonSetStartTime.Text = "Set &start time"; - this.buttonSetStartTime.UseVisualStyleBackColor = true; - this.buttonSetStartTime.Click += new System.EventHandler(this.buttonSetStartTime_Click); - this.buttonSetStartTime.MouseEnter += new System.EventHandler(this.buttonSetStartTime_MouseEnter); - // - // labelCreateF12 - // - this.labelCreateF12.AutoSize = true; - this.labelCreateF12.ForeColor = System.Drawing.Color.Gray; - this.labelCreateF12.Location = new System.Drawing.Point(188, 114); - this.labelCreateF12.Name = "labelCreateF12"; - this.labelCreateF12.Size = new System.Drawing.Size(25, 13); - this.labelCreateF12.TabIndex = 65; - this.labelCreateF12.Text = "F12"; - // - // labelCreateF11 - // - this.labelCreateF11.AutoSize = true; - this.labelCreateF11.ForeColor = System.Drawing.Color.Gray; - this.labelCreateF11.Location = new System.Drawing.Point(188, 88); - this.labelCreateF11.Name = "labelCreateF11"; - this.labelCreateF11.Size = new System.Drawing.Size(25, 13); - this.labelCreateF11.TabIndex = 64; - this.labelCreateF11.Text = "F11"; - // - // labelCreateF10 - // - this.labelCreateF10.AutoSize = true; - this.labelCreateF10.ForeColor = System.Drawing.Color.Gray; - this.labelCreateF10.Location = new System.Drawing.Point(188, 36); - this.labelCreateF10.Name = "labelCreateF10"; - this.labelCreateF10.Size = new System.Drawing.Size(25, 13); - this.labelCreateF10.TabIndex = 63; - this.labelCreateF10.Text = "F10"; - // - // labelCreateF9 - // - this.labelCreateF9.AutoSize = true; - this.labelCreateF9.ForeColor = System.Drawing.Color.Gray; - this.labelCreateF9.Location = new System.Drawing.Point(188, 10); - this.labelCreateF9.Name = "labelCreateF9"; - this.labelCreateF9.Size = new System.Drawing.Size(19, 13); - this.labelCreateF9.TabIndex = 62; - this.labelCreateF9.Text = "F9"; - // - // buttonForward2 - // - this.buttonForward2.Location = new System.Drawing.Point(130, 163); - this.buttonForward2.Name = "buttonForward2"; - this.buttonForward2.Size = new System.Drawing.Size(56, 23); - this.buttonForward2.TabIndex = 10; - this.buttonForward2.Text = " >>"; - this.buttonForward2.UseVisualStyleBackColor = true; - this.buttonForward2.Click += new System.EventHandler(this.buttonForward2_Click); - // - // numericUpDownSec2 - // - this.numericUpDownSec2.DecimalPlaces = 3; - this.numericUpDownSec2.Increment = new decimal(new int[] { - 1, - 0, - 0, - 65536}); - this.numericUpDownSec2.Location = new System.Drawing.Point(66, 164); - this.numericUpDownSec2.Maximum = new decimal(new int[] { - 60, - 0, - 0, - 0}); - this.numericUpDownSec2.Name = "numericUpDownSec2"; - this.numericUpDownSec2.Size = new System.Drawing.Size(58, 20); - this.numericUpDownSec2.TabIndex = 9; - this.numericUpDownSec2.Value = new decimal(new int[] { - 5000, - 0, - 0, - 196608}); - this.numericUpDownSec2.ValueChanged += new System.EventHandler(this.NumericUpDownSec2ValueChanged); - // - // buttonSecBack2 - // - this.buttonSecBack2.Location = new System.Drawing.Point(6, 163); - this.buttonSecBack2.Name = "buttonSecBack2"; - this.buttonSecBack2.Size = new System.Drawing.Size(56, 23); - this.buttonSecBack2.TabIndex = 8; - this.buttonSecBack2.Text = "<<"; - this.buttonSecBack2.UseVisualStyleBackColor = true; - this.buttonSecBack2.Click += new System.EventHandler(this.buttonSecBack2_Click); - // - // buttonForward1 - // - this.buttonForward1.Location = new System.Drawing.Point(130, 137); - this.buttonForward1.Name = "buttonForward1"; - this.buttonForward1.Size = new System.Drawing.Size(56, 23); - this.buttonForward1.TabIndex = 7; - this.buttonForward1.Text = ">>"; - this.buttonForward1.UseVisualStyleBackColor = true; - this.buttonForward1.Click += new System.EventHandler(this.buttonForward1_Click); - // - // numericUpDownSec1 - // - this.numericUpDownSec1.DecimalPlaces = 3; - this.numericUpDownSec1.Increment = new decimal(new int[] { - 1, - 0, - 0, - 65536}); - this.numericUpDownSec1.Location = new System.Drawing.Point(66, 138); - this.numericUpDownSec1.Maximum = new decimal(new int[] { - 60, - 0, - 0, - 0}); - this.numericUpDownSec1.Name = "numericUpDownSec1"; - this.numericUpDownSec1.Size = new System.Drawing.Size(58, 20); - this.numericUpDownSec1.TabIndex = 6; - this.numericUpDownSec1.Value = new decimal(new int[] { - 500, - 0, - 0, - 196608}); - this.numericUpDownSec1.ValueChanged += new System.EventHandler(this.NumericUpDownSec1ValueChanged); - // - // labelVideoPosition - // - this.labelVideoPosition.AutoSize = true; - this.labelVideoPosition.Location = new System.Drawing.Point(6, 196); - this.labelVideoPosition.Name = "labelVideoPosition"; - this.labelVideoPosition.Size = new System.Drawing.Size(76, 13); - this.labelVideoPosition.TabIndex = 11; - this.labelVideoPosition.Text = "Video position:"; - this.labelVideoPosition.TextAlign = System.Drawing.ContentAlignment.TopRight; - // - // buttonSecBack1 - // - this.buttonSecBack1.Location = new System.Drawing.Point(6, 137); - this.buttonSecBack1.Name = "buttonSecBack1"; - this.buttonSecBack1.Size = new System.Drawing.Size(56, 23); - this.buttonSecBack1.TabIndex = 5; - this.buttonSecBack1.Text = "<<"; - this.buttonSecBack1.UseVisualStyleBackColor = true; - this.buttonSecBack1.Click += new System.EventHandler(this.buttonSecBack1_Click); - // - // tabPageAdjust - // - this.tabPageAdjust.Controls.Add(this.timeUpDownVideoPositionAdjust); - this.tabPageAdjust.Controls.Add(this.buttonAdjustSetEndTime); - this.tabPageAdjust.Controls.Add(this.buttonSetEndAndGoToNext); - this.tabPageAdjust.Controls.Add(this.buttonSetStartAndOffsetRest); - this.tabPageAdjust.Controls.Add(this.buttonAdjustSetStartTime); - this.tabPageAdjust.Controls.Add(this.labelAdjustF12); - this.tabPageAdjust.Controls.Add(this.labelAdjustF11); - this.tabPageAdjust.Controls.Add(this.labelAdjustF10); - this.tabPageAdjust.Controls.Add(this.labelAdjustF9); - this.tabPageAdjust.Controls.Add(this.buttonAdjustSecForward2); - this.tabPageAdjust.Controls.Add(this.numericUpDownSecAdjust2); - this.tabPageAdjust.Controls.Add(this.buttonAdjustSecBack2); - this.tabPageAdjust.Controls.Add(this.buttonAdjustSecForward1); - this.tabPageAdjust.Controls.Add(this.numericUpDownSecAdjust1); - this.tabPageAdjust.Controls.Add(this.buttonAdjustSecBack1); - this.tabPageAdjust.Controls.Add(this.labelVideoPosition2); - this.tabPageAdjust.Controls.Add(this.buttonAdjustGoToPosAndPause); - this.tabPageAdjust.Controls.Add(this.buttonAdjustPlayBefore); - this.tabPageAdjust.Location = new System.Drawing.Point(4, 22); - this.tabPageAdjust.Name = "tabPageAdjust"; - this.tabPageAdjust.Size = new System.Drawing.Size(459, 257); - this.tabPageAdjust.TabIndex = 2; - this.tabPageAdjust.Text = "Adjust"; - this.tabPageAdjust.UseVisualStyleBackColor = true; - // - // timeUpDownVideoPositionAdjust - // - this.timeUpDownVideoPositionAdjust.AutoSize = true; - this.timeUpDownVideoPositionAdjust.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.timeUpDownVideoPositionAdjust.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F); - this.timeUpDownVideoPositionAdjust.Location = new System.Drawing.Point(96, 213); - this.timeUpDownVideoPositionAdjust.Margin = new System.Windows.Forms.Padding(4); - this.timeUpDownVideoPositionAdjust.Name = "timeUpDownVideoPositionAdjust"; - this.timeUpDownVideoPositionAdjust.Size = new System.Drawing.Size(111, 27); - this.timeUpDownVideoPositionAdjust.TabIndex = 13; - timeCode5.Hours = 0; - timeCode5.Milliseconds = 0; - timeCode5.Minutes = 0; - timeCode5.Seconds = 0; - timeCode5.TimeSpan = System.TimeSpan.Parse("00:00:00"); - timeCode5.TotalMilliseconds = 0D; - timeCode5.TotalSeconds = 0D; - this.timeUpDownVideoPositionAdjust.TimeCode = timeCode5; - this.timeUpDownVideoPositionAdjust.UseVideoOffset = false; - // - // buttonAdjustSetEndTime - // - this.buttonAdjustSetEndTime.Location = new System.Drawing.Point(6, 84); - this.buttonAdjustSetEndTime.Name = "buttonAdjustSetEndTime"; - this.buttonAdjustSetEndTime.Size = new System.Drawing.Size(180, 23); - this.buttonAdjustSetEndTime.TabIndex = 3; - this.buttonAdjustSetEndTime.Text = "Set end time"; - this.buttonAdjustSetEndTime.UseVisualStyleBackColor = true; - this.buttonAdjustSetEndTime.Click += new System.EventHandler(this.ButtonSetEndClick); - this.buttonAdjustSetEndTime.MouseEnter += new System.EventHandler(this.buttonAdjustSetEndTime_MouseEnter); - // - // buttonSetEndAndGoToNext - // - this.buttonSetEndAndGoToNext.Location = new System.Drawing.Point(6, 32); - this.buttonSetEndAndGoToNext.Name = "buttonSetEndAndGoToNext"; - this.buttonSetEndAndGoToNext.Size = new System.Drawing.Size(180, 23); - this.buttonSetEndAndGoToNext.TabIndex = 1; - this.buttonSetEndAndGoToNext.Text = "Set e&nd && goto next"; - this.buttonSetEndAndGoToNext.UseVisualStyleBackColor = true; - this.buttonSetEndAndGoToNext.Click += new System.EventHandler(this.ButtonSetEndAndGoToNextClick); - this.buttonSetEndAndGoToNext.MouseEnter += new System.EventHandler(this.buttonSetEndAndGoToNext_MouseEnter); - // - // buttonSetStartAndOffsetRest - // - this.buttonSetStartAndOffsetRest.Location = new System.Drawing.Point(6, 6); - this.buttonSetStartAndOffsetRest.Name = "buttonSetStartAndOffsetRest"; - this.buttonSetStartAndOffsetRest.Size = new System.Drawing.Size(180, 23); - this.buttonSetStartAndOffsetRest.TabIndex = 0; - this.buttonSetStartAndOffsetRest.Text = "Set sta&rt and offset the rest"; - this.buttonSetStartAndOffsetRest.UseVisualStyleBackColor = true; - this.buttonSetStartAndOffsetRest.Click += new System.EventHandler(this.ButtonSetStartAndOffsetRestClick); - this.buttonSetStartAndOffsetRest.MouseEnter += new System.EventHandler(this.buttonSetStartAndOffsetRest_MouseEnter); - // - // buttonAdjustSetStartTime - // - this.buttonAdjustSetStartTime.Location = new System.Drawing.Point(6, 58); - this.buttonAdjustSetStartTime.Name = "buttonAdjustSetStartTime"; - this.buttonAdjustSetStartTime.Size = new System.Drawing.Size(180, 23); - this.buttonAdjustSetStartTime.TabIndex = 2; - this.buttonAdjustSetStartTime.Text = "Set start time"; - this.buttonAdjustSetStartTime.UseVisualStyleBackColor = true; - this.buttonAdjustSetStartTime.Click += new System.EventHandler(this.buttonSetStartTime_Click); - this.buttonAdjustSetStartTime.MouseEnter += new System.EventHandler(this.buttonAdjustSetStartTime_MouseEnter); - // - // labelAdjustF12 - // - this.labelAdjustF12.AutoSize = true; - this.labelAdjustF12.ForeColor = System.Drawing.Color.Gray; - this.labelAdjustF12.Location = new System.Drawing.Point(188, 88); - this.labelAdjustF12.Name = "labelAdjustF12"; - this.labelAdjustF12.Size = new System.Drawing.Size(25, 13); - this.labelAdjustF12.TabIndex = 64; - this.labelAdjustF12.Text = "F12"; - // - // labelAdjustF11 - // - this.labelAdjustF11.AutoSize = true; - this.labelAdjustF11.ForeColor = System.Drawing.Color.Gray; - this.labelAdjustF11.Location = new System.Drawing.Point(188, 62); - this.labelAdjustF11.Name = "labelAdjustF11"; - this.labelAdjustF11.Size = new System.Drawing.Size(25, 13); - this.labelAdjustF11.TabIndex = 63; - this.labelAdjustF11.Text = "F11"; - // - // labelAdjustF10 - // - this.labelAdjustF10.AutoSize = true; - this.labelAdjustF10.ForeColor = System.Drawing.Color.Gray; - this.labelAdjustF10.Location = new System.Drawing.Point(188, 36); - this.labelAdjustF10.Name = "labelAdjustF10"; - this.labelAdjustF10.Size = new System.Drawing.Size(25, 13); - this.labelAdjustF10.TabIndex = 62; - this.labelAdjustF10.Text = "F10"; - // - // labelAdjustF9 - // - this.labelAdjustF9.AutoSize = true; - this.labelAdjustF9.ForeColor = System.Drawing.Color.Gray; - this.labelAdjustF9.Location = new System.Drawing.Point(188, 10); - this.labelAdjustF9.Name = "labelAdjustF9"; - this.labelAdjustF9.Size = new System.Drawing.Size(19, 13); - this.labelAdjustF9.TabIndex = 61; - this.labelAdjustF9.Text = "F9"; - // - // buttonAdjustSecForward2 - // - this.buttonAdjustSecForward2.Location = new System.Drawing.Point(130, 188); - this.buttonAdjustSecForward2.Name = "buttonAdjustSecForward2"; - this.buttonAdjustSecForward2.Size = new System.Drawing.Size(56, 23); - this.buttonAdjustSecForward2.TabIndex = 11; - this.buttonAdjustSecForward2.Text = ">>"; - this.buttonAdjustSecForward2.UseVisualStyleBackColor = true; - this.buttonAdjustSecForward2.Click += new System.EventHandler(this.buttonAdjustSecForward2_Click); - // - // numericUpDownSecAdjust2 - // - this.numericUpDownSecAdjust2.DecimalPlaces = 3; - this.numericUpDownSecAdjust2.Increment = new decimal(new int[] { - 1, - 0, - 0, - 65536}); - this.numericUpDownSecAdjust2.Location = new System.Drawing.Point(66, 189); - this.numericUpDownSecAdjust2.Maximum = new decimal(new int[] { - 60, - 0, - 0, - 0}); - this.numericUpDownSecAdjust2.Name = "numericUpDownSecAdjust2"; - this.numericUpDownSecAdjust2.Size = new System.Drawing.Size(58, 20); - this.numericUpDownSecAdjust2.TabIndex = 10; - this.numericUpDownSecAdjust2.Value = new decimal(new int[] { - 5000, - 0, - 0, - 196608}); - this.numericUpDownSecAdjust2.ValueChanged += new System.EventHandler(this.NumericUpDownSecAdjust2ValueChanged); - // - // buttonAdjustSecBack2 - // - this.buttonAdjustSecBack2.Location = new System.Drawing.Point(6, 188); - this.buttonAdjustSecBack2.Name = "buttonAdjustSecBack2"; - this.buttonAdjustSecBack2.Size = new System.Drawing.Size(56, 23); - this.buttonAdjustSecBack2.TabIndex = 9; - this.buttonAdjustSecBack2.Text = "<<"; - this.buttonAdjustSecBack2.UseVisualStyleBackColor = true; - this.buttonAdjustSecBack2.Click += new System.EventHandler(this.buttonAdjustSecBack2_Click); - // - // buttonAdjustSecForward1 - // - this.buttonAdjustSecForward1.Location = new System.Drawing.Point(130, 162); - this.buttonAdjustSecForward1.Name = "buttonAdjustSecForward1"; - this.buttonAdjustSecForward1.Size = new System.Drawing.Size(56, 23); - this.buttonAdjustSecForward1.TabIndex = 8; - this.buttonAdjustSecForward1.Text = ">>"; - this.buttonAdjustSecForward1.UseVisualStyleBackColor = true; - this.buttonAdjustSecForward1.Click += new System.EventHandler(this.ButtonAdjustSecForwardClick); - // - // numericUpDownSecAdjust1 - // - this.numericUpDownSecAdjust1.DecimalPlaces = 3; - this.numericUpDownSecAdjust1.Increment = new decimal(new int[] { - 1, - 0, - 0, - 65536}); - this.numericUpDownSecAdjust1.Location = new System.Drawing.Point(66, 163); - this.numericUpDownSecAdjust1.Maximum = new decimal(new int[] { - 60, - 0, - 0, - 0}); - this.numericUpDownSecAdjust1.Name = "numericUpDownSecAdjust1"; - this.numericUpDownSecAdjust1.Size = new System.Drawing.Size(58, 20); - this.numericUpDownSecAdjust1.TabIndex = 7; - this.numericUpDownSecAdjust1.Value = new decimal(new int[] { - 500, - 0, - 0, - 196608}); - this.numericUpDownSecAdjust1.ValueChanged += new System.EventHandler(this.NumericUpDownSecAdjust1ValueChanged); - // - // buttonAdjustSecBack1 - // - this.buttonAdjustSecBack1.Location = new System.Drawing.Point(6, 162); - this.buttonAdjustSecBack1.Name = "buttonAdjustSecBack1"; - this.buttonAdjustSecBack1.Size = new System.Drawing.Size(56, 23); - this.buttonAdjustSecBack1.TabIndex = 6; - this.buttonAdjustSecBack1.Text = "<<"; - this.buttonAdjustSecBack1.UseVisualStyleBackColor = true; - this.buttonAdjustSecBack1.Click += new System.EventHandler(this.ButtonAdjustSecBackClick); - // - // labelVideoPosition2 - // - this.labelVideoPosition2.AutoSize = true; - this.labelVideoPosition2.Location = new System.Drawing.Point(6, 219); - this.labelVideoPosition2.Name = "labelVideoPosition2"; - this.labelVideoPosition2.Size = new System.Drawing.Size(76, 13); - this.labelVideoPosition2.TabIndex = 12; - this.labelVideoPosition2.Text = "Video position:"; - this.labelVideoPosition2.TextAlign = System.Drawing.ContentAlignment.TopRight; - // - // buttonAdjustGoToPosAndPause - // - this.buttonAdjustGoToPosAndPause.Location = new System.Drawing.Point(6, 136); - this.buttonAdjustGoToPosAndPause.Name = "buttonAdjustGoToPosAndPause"; - this.buttonAdjustGoToPosAndPause.Size = new System.Drawing.Size(180, 23); - this.buttonAdjustGoToPosAndPause.TabIndex = 5; - this.buttonAdjustGoToPosAndPause.Text = "&Goto subposition and pause"; - this.buttonAdjustGoToPosAndPause.UseVisualStyleBackColor = true; - this.buttonAdjustGoToPosAndPause.Click += new System.EventHandler(this.buttonGotoSub_Click); - this.buttonAdjustGoToPosAndPause.MouseEnter += new System.EventHandler(this.buttonAdjustGoToPosAndPause_MouseEnter); - // - // buttonAdjustPlayBefore - // - this.buttonAdjustPlayBefore.Location = new System.Drawing.Point(6, 110); - this.buttonAdjustPlayBefore.Name = "buttonAdjustPlayBefore"; - this.buttonAdjustPlayBefore.Size = new System.Drawing.Size(180, 23); - this.buttonAdjustPlayBefore.TabIndex = 4; - this.buttonAdjustPlayBefore.Text = "&Play from just before text"; - this.buttonAdjustPlayBefore.UseVisualStyleBackColor = true; - this.buttonAdjustPlayBefore.Click += new System.EventHandler(this.buttonBeforeText_Click); - this.buttonAdjustPlayBefore.MouseEnter += new System.EventHandler(this.buttonAdjustPlayBefore_MouseEnter); - // - // ShowSubtitleTimer - // - this.ShowSubtitleTimer.Enabled = true; - this.ShowSubtitleTimer.Interval = 17; - this.ShowSubtitleTimer.Tick += new System.EventHandler(this.ShowSubtitleTimerTick); - // - // timerAutoDuration - // - this.timerAutoDuration.Interval = 300; - this.timerAutoDuration.Tick += new System.EventHandler(this.timerAutoDuration_Tick); - // - // timerAutoContinue - // - this.timerAutoContinue.Interval = 1000; - this.timerAutoContinue.Tick += new System.EventHandler(this.timerAutoContinue_Tick); - // - // timerStillTyping - // - this.timerStillTyping.Interval = 1500; - this.timerStillTyping.Tick += new System.EventHandler(this.timerStillTyping_Tick); - // - // timerWaveform - // - this.timerWaveform.Tick += new System.EventHandler(this.timerWaveform_Tick); - // - // contextMenuStripWaveform - // - this.contextMenuStripWaveform.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.addParagraphHereToolStripMenuItem, - this.addParagraphAndPasteToolStripMenuItem, - this.toolStripMenuItemSetParagraphAsSelection, - this.toolStripMenuItemFocusTextbox, - this.goToPreviousSubtitleStripMenuItem, - this.goToNextSubtitleStripMenuItem, - this.deleteParagraphToolStripMenuItem, - this.splitToolStripMenuItem1, - this.mergeWithPreviousToolStripMenuItem, - this.mergeWithNextToolStripMenuItem, - this.toolStripSeparator11, - this.extendToPreviousToolStripMenuItem, - this.extendToNextToolStripMenuItem, - this.toolStripSeparator6, - this.toolStripMenuItemWaveformPlaySelection, - this.toolStripSeparator24, - this.showWaveformAndSpectrogramToolStripMenuItem, - this.showOnlyWaveformToolStripMenuItem, - this.showOnlySpectrogramToolStripMenuItem, - this.toolStripSeparatorGuessTimeCodes, - this.removeSceneChangeToolStripMenuItem, - this.addSceneChangeToolStripMenuItem, - this.guessTimeCodesToolStripMenuItem, - this.seekSilenceToolStripMenuItem, - this.insertSubtitleHereToolStripMenuItem}); - this.contextMenuStripWaveform.Name = "contextMenuStripWaveform"; - this.contextMenuStripWaveform.Size = new System.Drawing.Size(275, 490); - this.contextMenuStripWaveform.Closing += new System.Windows.Forms.ToolStripDropDownClosingEventHandler(this.contextMenuStripWaveform_Closing); - this.contextMenuStripWaveform.Opening += new System.ComponentModel.CancelEventHandler(this.ContextMenuStripWaveformOpening); - // - // addParagraphHereToolStripMenuItem - // - this.addParagraphHereToolStripMenuItem.Name = "addParagraphHereToolStripMenuItem"; - this.addParagraphHereToolStripMenuItem.Size = new System.Drawing.Size(274, 22); - this.addParagraphHereToolStripMenuItem.Text = "Add paragraph here"; - this.addParagraphHereToolStripMenuItem.Click += new System.EventHandler(this.addParagraphHereToolStripMenuItem_Click); - // - // addParagraphAndPasteToolStripMenuItem - // - this.addParagraphAndPasteToolStripMenuItem.Name = "addParagraphAndPasteToolStripMenuItem"; - this.addParagraphAndPasteToolStripMenuItem.Size = new System.Drawing.Size(274, 22); - this.addParagraphAndPasteToolStripMenuItem.Text = "Add paragraph here + paste clipboard"; - this.addParagraphAndPasteToolStripMenuItem.Click += new System.EventHandler(this.addParagraphAndPasteToolStripMenuItem_Click); - // - // toolStripMenuItemSetParagraphAsSelection - // - this.toolStripMenuItemSetParagraphAsSelection.Name = "toolStripMenuItemSetParagraphAsSelection"; - this.toolStripMenuItemSetParagraphAsSelection.Size = new System.Drawing.Size(274, 22); - this.toolStripMenuItemSetParagraphAsSelection.Text = "Set selected paragraph as selection"; - this.toolStripMenuItemSetParagraphAsSelection.Click += new System.EventHandler(this.toolStripMenuItemSetParagraphAsSelection_Click); - // - // toolStripMenuItemFocusTextbox - // - this.toolStripMenuItemFocusTextbox.Name = "toolStripMenuItemFocusTextbox"; - this.toolStripMenuItemFocusTextbox.Size = new System.Drawing.Size(274, 22); - this.toolStripMenuItemFocusTextbox.Text = "Focus textbox"; - this.toolStripMenuItemFocusTextbox.Click += new System.EventHandler(this.toolStripMenuItemFocusTextbox_Click); - // - // goToPreviousSubtitleStripMenuItem - // - this.goToPreviousSubtitleStripMenuItem.Name = "goToPreviousSubtitleStripMenuItem"; - this.goToPreviousSubtitleStripMenuItem.Size = new System.Drawing.Size(274, 22); - this.goToPreviousSubtitleStripMenuItem.Text = "Go to previous subtitle"; - this.goToPreviousSubtitleStripMenuItem.Click += new System.EventHandler(this.goToPreviousSubtitleToolStripMenuItem_Click); - // - // goToNextSubtitleStripMenuItem - // - this.goToNextSubtitleStripMenuItem.Name = "goToNextSubtitleStripMenuItem"; - this.goToNextSubtitleStripMenuItem.Size = new System.Drawing.Size(274, 22); - this.goToNextSubtitleStripMenuItem.Text = "Go to next subtitle"; - this.goToNextSubtitleStripMenuItem.Click += new System.EventHandler(this.goToNextSubtitleToolStripMenuItem_Click); - // - // deleteParagraphToolStripMenuItem - // - this.deleteParagraphToolStripMenuItem.Name = "deleteParagraphToolStripMenuItem"; - this.deleteParagraphToolStripMenuItem.Size = new System.Drawing.Size(274, 22); - this.deleteParagraphToolStripMenuItem.Text = "Delete paragraph"; - this.deleteParagraphToolStripMenuItem.Click += new System.EventHandler(this.deleteParagraphToolStripMenuItem_Click); - // - // splitToolStripMenuItem1 - // - this.splitToolStripMenuItem1.Name = "splitToolStripMenuItem1"; - this.splitToolStripMenuItem1.Size = new System.Drawing.Size(274, 22); - this.splitToolStripMenuItem1.Text = "Split"; - this.splitToolStripMenuItem1.Click += new System.EventHandler(this.splitToolStripMenuItem1_Click); - // - // mergeWithPreviousToolStripMenuItem - // - this.mergeWithPreviousToolStripMenuItem.Name = "mergeWithPreviousToolStripMenuItem"; - this.mergeWithPreviousToolStripMenuItem.Size = new System.Drawing.Size(274, 22); - this.mergeWithPreviousToolStripMenuItem.Text = "Merge with previous"; - this.mergeWithPreviousToolStripMenuItem.Click += new System.EventHandler(this.mergeWithPreviousToolStripMenuItem_Click); - // - // mergeWithNextToolStripMenuItem - // - this.mergeWithNextToolStripMenuItem.Name = "mergeWithNextToolStripMenuItem"; - this.mergeWithNextToolStripMenuItem.Size = new System.Drawing.Size(274, 22); - this.mergeWithNextToolStripMenuItem.Text = "Merge with next"; - this.mergeWithNextToolStripMenuItem.Click += new System.EventHandler(this.mergeWithNextToolStripMenuItem_Click); - // - // toolStripSeparator11 - // - this.toolStripSeparator11.Name = "toolStripSeparator11"; - this.toolStripSeparator11.Size = new System.Drawing.Size(271, 6); - // - // extendToPreviousToolStripMenuItem - // - this.extendToPreviousToolStripMenuItem.Name = "extendToPreviousToolStripMenuItem"; - this.extendToPreviousToolStripMenuItem.Size = new System.Drawing.Size(274, 22); - this.extendToPreviousToolStripMenuItem.Text = "Extend to previous"; - this.extendToPreviousToolStripMenuItem.Click += new System.EventHandler(this.extendToPreviousToolStripMenuItem_Click); - // - // extendToNextToolStripMenuItem - // - this.extendToNextToolStripMenuItem.Name = "extendToNextToolStripMenuItem"; - this.extendToNextToolStripMenuItem.Size = new System.Drawing.Size(274, 22); - this.extendToNextToolStripMenuItem.Text = "Extend to next"; - this.extendToNextToolStripMenuItem.Click += new System.EventHandler(this.extendToNextToolStripMenuItem_Click); - // - // toolStripSeparator6 - // - this.toolStripSeparator6.Name = "toolStripSeparator6"; - this.toolStripSeparator6.Size = new System.Drawing.Size(271, 6); - // - // toolStripMenuItemWaveformPlaySelection - // - this.toolStripMenuItemWaveformPlaySelection.Name = "toolStripMenuItemWaveformPlaySelection"; - this.toolStripMenuItemWaveformPlaySelection.Size = new System.Drawing.Size(274, 22); - this.toolStripMenuItemWaveformPlaySelection.Text = "Play selection"; - this.toolStripMenuItemWaveformPlaySelection.Click += new System.EventHandler(this.toolStripMenuItemWaveformPlaySelection_Click); - // - // toolStripSeparator24 - // - this.toolStripSeparator24.Name = "toolStripSeparator24"; - this.toolStripSeparator24.Size = new System.Drawing.Size(271, 6); - // - // showWaveformAndSpectrogramToolStripMenuItem - // - this.showWaveformAndSpectrogramToolStripMenuItem.Name = "showWaveformAndSpectrogramToolStripMenuItem"; - this.showWaveformAndSpectrogramToolStripMenuItem.Size = new System.Drawing.Size(274, 22); - this.showWaveformAndSpectrogramToolStripMenuItem.Text = "Show waveform and spectrogram"; - this.showWaveformAndSpectrogramToolStripMenuItem.Click += new System.EventHandler(this.ShowWaveformAndSpectrogramToolStripMenuItemClick); - // - // showOnlyWaveformToolStripMenuItem - // - this.showOnlyWaveformToolStripMenuItem.Name = "showOnlyWaveformToolStripMenuItem"; - this.showOnlyWaveformToolStripMenuItem.Size = new System.Drawing.Size(274, 22); - this.showOnlyWaveformToolStripMenuItem.Text = "Show only waveform"; - this.showOnlyWaveformToolStripMenuItem.Click += new System.EventHandler(this.ShowOnlyWaveformToolStripMenuItemClick); - // - // showOnlySpectrogramToolStripMenuItem - // - this.showOnlySpectrogramToolStripMenuItem.Name = "showOnlySpectrogramToolStripMenuItem"; - this.showOnlySpectrogramToolStripMenuItem.Size = new System.Drawing.Size(274, 22); - this.showOnlySpectrogramToolStripMenuItem.Text = "Show only spectrogram"; - this.showOnlySpectrogramToolStripMenuItem.Click += new System.EventHandler(this.ShowOnlySpectrogramToolStripMenuItemClick); - // - // toolStripSeparatorGuessTimeCodes - // - this.toolStripSeparatorGuessTimeCodes.Name = "toolStripSeparatorGuessTimeCodes"; - this.toolStripSeparatorGuessTimeCodes.Size = new System.Drawing.Size(271, 6); - // - // removeSceneChangeToolStripMenuItem - // - this.removeSceneChangeToolStripMenuItem.Name = "removeSceneChangeToolStripMenuItem"; - this.removeSceneChangeToolStripMenuItem.Size = new System.Drawing.Size(274, 22); - this.removeSceneChangeToolStripMenuItem.Text = "Remove scene change"; - this.removeSceneChangeToolStripMenuItem.Click += new System.EventHandler(this.removeSceneChangeToolStripMenuItem_Click); - // - // addSceneChangeToolStripMenuItem - // - this.addSceneChangeToolStripMenuItem.Name = "addSceneChangeToolStripMenuItem"; - this.addSceneChangeToolStripMenuItem.Size = new System.Drawing.Size(274, 22); - this.addSceneChangeToolStripMenuItem.Text = "Add scene change"; - this.addSceneChangeToolStripMenuItem.Click += new System.EventHandler(this.addSceneChangeToolStripMenuItem_Click); - // - // guessTimeCodesToolStripMenuItem - // - this.guessTimeCodesToolStripMenuItem.Name = "guessTimeCodesToolStripMenuItem"; - this.guessTimeCodesToolStripMenuItem.Size = new System.Drawing.Size(274, 22); - this.guessTimeCodesToolStripMenuItem.Text = "Guess time codes..."; - this.guessTimeCodesToolStripMenuItem.Click += new System.EventHandler(this.GuessTimeCodesToolStripMenuItemClick); - // - // seekSilenceToolStripMenuItem - // - this.seekSilenceToolStripMenuItem.Name = "seekSilenceToolStripMenuItem"; - this.seekSilenceToolStripMenuItem.Size = new System.Drawing.Size(274, 22); - this.seekSilenceToolStripMenuItem.Text = "Seek silence..."; - this.seekSilenceToolStripMenuItem.Click += new System.EventHandler(this.seekSilenceToolStripMenuItem_Click); - // - // insertSubtitleHereToolStripMenuItem - // - this.insertSubtitleHereToolStripMenuItem.Name = "insertSubtitleHereToolStripMenuItem"; - this.insertSubtitleHereToolStripMenuItem.Size = new System.Drawing.Size(274, 22); - this.insertSubtitleHereToolStripMenuItem.Text = "Insert subtitle here..."; - this.insertSubtitleHereToolStripMenuItem.Click += new System.EventHandler(this.insertSubtitleHereToolStripMenuItem_Click); - // - // splitContainerMain - // - this.splitContainerMain.Dock = System.Windows.Forms.DockStyle.Fill; - this.splitContainerMain.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; - this.splitContainerMain.Location = new System.Drawing.Point(0, 64); - this.splitContainerMain.Name = "splitContainerMain"; - this.splitContainerMain.Orientation = System.Windows.Forms.Orientation.Horizontal; - // - // splitContainerMain.Panel1 - // - this.splitContainerMain.Panel1.Controls.Add(this.splitContainer1); - // - // splitContainerMain.Panel2 - // - this.splitContainerMain.Panel2.Controls.Add(this.groupBoxVideo); - this.splitContainerMain.Size = new System.Drawing.Size(975, 560); - this.splitContainerMain.SplitterDistance = 251; - this.splitContainerMain.TabIndex = 8; - this.splitContainerMain.SplitterMoved += new System.Windows.Forms.SplitterEventHandler(this.SplitContainerMainSplitterMoved); - // - // splitContainer1 - // - this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; - this.splitContainer1.Location = new System.Drawing.Point(0, 0); - this.splitContainer1.Name = "splitContainer1"; - // - // splitContainer1.Panel1 - // - this.splitContainer1.Panel1.Controls.Add(this.tabControlSubtitle); - // - // splitContainer1.Panel2 - // - this.splitContainer1.Panel2.Controls.Add(this.panelVideoPlayer); - this.splitContainer1.Size = new System.Drawing.Size(975, 251); - this.splitContainer1.SplitterDistance = 743; - this.splitContainer1.TabIndex = 7; - this.splitContainer1.SplitterMoved += new System.Windows.Forms.SplitterEventHandler(this.SplitContainer1SplitterMoved); - // - // tabControlSubtitle - // - this.tabControlSubtitle.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.tabControlSubtitle.Controls.Add(this.tabPage1); - this.tabControlSubtitle.Controls.Add(this.tabPage2); - this.tabControlSubtitle.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.tabControlSubtitle.Location = new System.Drawing.Point(3, 3); - this.tabControlSubtitle.Name = "tabControlSubtitle"; - this.tabControlSubtitle.SelectedIndex = 0; - this.tabControlSubtitle.Size = new System.Drawing.Size(738, 248); - this.tabControlSubtitle.TabIndex = 0; - this.tabControlSubtitle.SelectedIndexChanged += new System.EventHandler(this.TabControlSubtitleSelectedIndexChanged); - this.tabControlSubtitle.Selecting += new System.Windows.Forms.TabControlCancelEventHandler(this.TabControlSubtitleSelecting); - // - // tabPage1 - // - this.tabPage1.Controls.Add(this.splitContainerListViewAndText); - this.tabPage1.Location = new System.Drawing.Point(4, 22); - this.tabPage1.Name = "tabPage1"; - this.tabPage1.Padding = new System.Windows.Forms.Padding(3); - this.tabPage1.Size = new System.Drawing.Size(730, 222); - this.tabPage1.TabIndex = 0; - this.tabPage1.Text = "List view"; - this.tabPage1.UseVisualStyleBackColor = true; - // - // splitContainerListViewAndText - // - this.splitContainerListViewAndText.Dock = System.Windows.Forms.DockStyle.Fill; - this.splitContainerListViewAndText.Location = new System.Drawing.Point(3, 3); - this.splitContainerListViewAndText.Name = "splitContainerListViewAndText"; - this.splitContainerListViewAndText.Orientation = System.Windows.Forms.Orientation.Horizontal; - // - // splitContainerListViewAndText.Panel1 - // - this.splitContainerListViewAndText.Panel1.Controls.Add(this.SubtitleListview1); - this.splitContainerListViewAndText.Panel1MinSize = 50; - // - // splitContainerListViewAndText.Panel2 - // - this.splitContainerListViewAndText.Panel2.Controls.Add(this.groupBoxEdit); - this.splitContainerListViewAndText.Panel2MinSize = 105; - this.splitContainerListViewAndText.Size = new System.Drawing.Size(724, 216); - this.splitContainerListViewAndText.SplitterDistance = 91; - this.splitContainerListViewAndText.TabIndex = 2; - // - // SubtitleListview1 - // - this.SubtitleListview1.AllowColumnReorder = true; - this.SubtitleListview1.AllowDrop = true; - this.SubtitleListview1.ContextMenuStrip = this.contextMenuStripListview; - this.SubtitleListview1.Dock = System.Windows.Forms.DockStyle.Fill; - this.SubtitleListview1.FirstVisibleIndex = -1; - this.SubtitleListview1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.SubtitleListview1.FullRowSelect = true; - this.SubtitleListview1.GridLines = true; - this.SubtitleListview1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; - this.SubtitleListview1.HideSelection = false; - this.SubtitleListview1.Location = new System.Drawing.Point(0, 0); - this.SubtitleListview1.Name = "SubtitleListview1"; - this.SubtitleListview1.OwnerDraw = true; - this.SubtitleListview1.Size = new System.Drawing.Size(724, 91); - this.SubtitleListview1.StateImageList = this.imageListBookmarks; - this.SubtitleListview1.SubtitleFontBold = false; - this.SubtitleListview1.SubtitleFontName = "Tahoma"; - this.SubtitleListview1.SubtitleFontSize = 8; - this.SubtitleListview1.TabIndex = 0; - this.SubtitleListview1.UseCompatibleStateImageBehavior = false; - this.SubtitleListview1.UseSyntaxColoring = true; - this.SubtitleListview1.View = System.Windows.Forms.View.Details; - this.SubtitleListview1.SelectedIndexChanged += new System.EventHandler(this.SubtitleListview1_SelectedIndexChanged); - this.SubtitleListview1.DragDrop += new System.Windows.Forms.DragEventHandler(this.SubtitleListview1_DragDrop); - this.SubtitleListview1.DragEnter += new System.Windows.Forms.DragEventHandler(this.SubtitleListview1_DragEnter); - this.SubtitleListview1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.SubtitleListview1KeyDown); - this.SubtitleListview1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.SubtitleListview1_MouseDoubleClick); - this.SubtitleListview1.MouseEnter += new System.EventHandler(this.SubtitleListview1_MouseEnter); - // - // imageListBookmarks - // - this.imageListBookmarks.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit; - this.imageListBookmarks.ImageSize = new System.Drawing.Size(16, 16); - this.imageListBookmarks.TransparentColor = System.Drawing.Color.Transparent; - // - // groupBoxEdit - // - this.groupBoxEdit.Controls.Add(this.labelAlternateSingleLinePixels); - this.groupBoxEdit.Controls.Add(this.labelSingleLinePixels); - this.groupBoxEdit.Controls.Add(this.panelBookmark); - this.groupBoxEdit.Controls.Add(this.pictureBoxBookmark); - this.groupBoxEdit.Controls.Add(this.labelSingleLine); - this.groupBoxEdit.Controls.Add(this.labelAlternateSingleLine); - this.groupBoxEdit.Controls.Add(this.labelDurationWarning); - this.groupBoxEdit.Controls.Add(this.labelStartTimeWarning); - this.groupBoxEdit.Controls.Add(this.buttonSplitLine); - this.groupBoxEdit.Controls.Add(this.labelAlternateCharactersPerSecond); - this.groupBoxEdit.Controls.Add(this.labelTextAlternateLineTotal); - this.groupBoxEdit.Controls.Add(this.labelTextAlternateLineLengths); - this.groupBoxEdit.Controls.Add(this.labelAlternateText); - this.groupBoxEdit.Controls.Add(this.labelText); - this.groupBoxEdit.Controls.Add(this.textBoxListViewTextAlternate); - this.groupBoxEdit.Controls.Add(this.buttonAutoBreak); - this.groupBoxEdit.Controls.Add(this.labelTextLineLengths); - this.groupBoxEdit.Controls.Add(this.labelTextLineTotal); - this.groupBoxEdit.Controls.Add(this.labelCharactersPerSecond); - this.groupBoxEdit.Controls.Add(this.buttonUnBreak); - this.groupBoxEdit.Controls.Add(this.timeUpDownStartTime); - this.groupBoxEdit.Controls.Add(this.numericUpDownDuration); - this.groupBoxEdit.Controls.Add(this.buttonPrevious); - this.groupBoxEdit.Controls.Add(this.buttonNext); - this.groupBoxEdit.Controls.Add(this.labelStartTime); - this.groupBoxEdit.Controls.Add(this.textBoxListViewText); - this.groupBoxEdit.Controls.Add(this.labelDuration); - this.groupBoxEdit.Controls.Add(this.labelAutoDuration); - this.groupBoxEdit.Dock = System.Windows.Forms.DockStyle.Fill; - this.groupBoxEdit.Location = new System.Drawing.Point(0, 0); - this.groupBoxEdit.Name = "groupBoxEdit"; - this.groupBoxEdit.Size = new System.Drawing.Size(724, 121); - this.groupBoxEdit.TabIndex = 1; - this.groupBoxEdit.TabStop = false; - // - // labelAlternateSingleLinePixels - // - this.labelAlternateSingleLinePixels.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelAlternateSingleLinePixels.AutoSize = true; - this.labelAlternateSingleLinePixels.Location = new System.Drawing.Point(870, 94); - this.labelAlternateSingleLinePixels.Name = "labelAlternateSingleLinePixels"; - this.labelAlternateSingleLinePixels.Size = new System.Drawing.Size(62, 13); - this.labelAlternateSingleLinePixels.TabIndex = 43; - this.labelAlternateSingleLinePixels.Text = "AltSinLinPix"; - // - // labelSingleLinePixels - // - this.labelSingleLinePixels.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelSingleLinePixels.AutoSize = true; - this.labelSingleLinePixels.Location = new System.Drawing.Point(427, 94); - this.labelSingleLinePixels.Name = "labelSingleLinePixels"; - this.labelSingleLinePixels.Size = new System.Drawing.Size(105, 13); - this.labelSingleLinePixels.TabIndex = 42; - this.labelSingleLinePixels.Text = "labelSingleLinePixels"; - // - // panelBookmark - // - this.panelBookmark.BackColor = System.Drawing.Color.LemonChiffon; - this.panelBookmark.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.panelBookmark.Controls.Add(this.labelBookmark); - this.panelBookmark.Location = new System.Drawing.Point(207, 38); - this.panelBookmark.Name = "panelBookmark"; - this.panelBookmark.Size = new System.Drawing.Size(200, 25); - this.panelBookmark.TabIndex = 40; - this.panelBookmark.Visible = false; - // - // labelBookmark - // - this.labelBookmark.AutoSize = true; - this.labelBookmark.Location = new System.Drawing.Point(4, 4); - this.labelBookmark.Name = "labelBookmark"; - this.labelBookmark.Size = new System.Drawing.Size(77, 13); - this.labelBookmark.TabIndex = 0; - this.labelBookmark.Text = "labelBookmark"; - this.labelBookmark.DoubleClick += new System.EventHandler(this.labelBookmark_DoubleClick); - // - // pictureBoxBookmark - // - this.pictureBoxBookmark.Image = global::Nikse.SubtitleEdit.Properties.Resources.bookmark22; - this.pictureBoxBookmark.Location = new System.Drawing.Point(211, 28); - this.pictureBoxBookmark.Name = "pictureBoxBookmark"; - this.pictureBoxBookmark.Size = new System.Drawing.Size(22, 22); - this.pictureBoxBookmark.TabIndex = 41; - this.pictureBoxBookmark.TabStop = false; - this.pictureBoxBookmark.MouseClick += new System.Windows.Forms.MouseEventHandler(this.pictureBoxBookmark_MouseClick); - this.pictureBoxBookmark.MouseEnter += new System.EventHandler(this.pictureBoxBookmark_MouseEnter); - // - // labelSingleLine - // - this.labelSingleLine.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelSingleLine.AutoSize = true; - this.labelSingleLine.Location = new System.Drawing.Point(346, 94); - this.labelSingleLine.Name = "labelSingleLine"; - this.labelSingleLine.Size = new System.Drawing.Size(78, 13); - this.labelSingleLine.TabIndex = 32; - this.labelSingleLine.Text = "labelSingleLine"; - // - // labelAlternateSingleLine - // - this.labelAlternateSingleLine.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelAlternateSingleLine.AutoSize = true; - this.labelAlternateSingleLine.Location = new System.Drawing.Point(839, 94); - this.labelAlternateSingleLine.Name = "labelAlternateSingleLine"; - this.labelAlternateSingleLine.Size = new System.Drawing.Size(48, 13); - this.labelAlternateSingleLine.TabIndex = 36; - this.labelAlternateSingleLine.Text = "AltSinLin"; - // - // labelDurationWarning - // - this.labelDurationWarning.AutoSize = true; - this.labelDurationWarning.ForeColor = System.Drawing.Color.Red; - this.labelDurationWarning.Location = new System.Drawing.Point(122, 64); - this.labelDurationWarning.Name = "labelDurationWarning"; - this.labelDurationWarning.Size = new System.Drawing.Size(109, 13); - this.labelDurationWarning.TabIndex = 17; - this.labelDurationWarning.Text = "labelDurationWarning"; - // - // labelStartTimeWarning - // - this.labelStartTimeWarning.AutoSize = true; - this.labelStartTimeWarning.ForeColor = System.Drawing.Color.Red; - this.labelStartTimeWarning.Location = new System.Drawing.Point(8, 50); - this.labelStartTimeWarning.Name = "labelStartTimeWarning"; - this.labelStartTimeWarning.Size = new System.Drawing.Size(114, 13); - this.labelStartTimeWarning.TabIndex = 18; - this.labelStartTimeWarning.Text = "labelStartTimeWarning"; - // - // buttonSplitLine - // - this.buttonSplitLine.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonSplitLine.ForeColor = System.Drawing.Color.Red; - this.buttonSplitLine.Location = new System.Drawing.Point(604, 80); - this.buttonSplitLine.Name = "buttonSplitLine"; - this.buttonSplitLine.Size = new System.Drawing.Size(115, 23); - this.buttonSplitLine.TabIndex = 39; - this.buttonSplitLine.Text = "Split line"; - this.buttonSplitLine.UseVisualStyleBackColor = true; - this.buttonSplitLine.Visible = false; - this.buttonSplitLine.Click += new System.EventHandler(this.ButtonSplitLineClick); - // - // labelAlternateCharactersPerSecond - // - this.labelAlternateCharactersPerSecond.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.labelAlternateCharactersPerSecond.AutoSize = true; - this.labelAlternateCharactersPerSecond.Location = new System.Drawing.Point(636, 11); - this.labelAlternateCharactersPerSecond.Name = "labelAlternateCharactersPerSecond"; - this.labelAlternateCharactersPerSecond.Size = new System.Drawing.Size(64, 13); - this.labelAlternateCharactersPerSecond.TabIndex = 38; - this.labelAlternateCharactersPerSecond.Text = "altCharsSec"; - // - // labelTextAlternateLineTotal - // - this.labelTextAlternateLineTotal.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.labelTextAlternateLineTotal.AutoSize = true; - this.labelTextAlternateLineTotal.Location = new System.Drawing.Point(682, 94); - this.labelTextAlternateLineTotal.Name = "labelTextAlternateLineTotal"; - this.labelTextAlternateLineTotal.Size = new System.Drawing.Size(35, 13); - this.labelTextAlternateLineTotal.TabIndex = 37; - this.labelTextAlternateLineTotal.Text = "AltTot"; - // - // labelTextAlternateLineLengths - // - this.labelTextAlternateLineLengths.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelTextAlternateLineLengths.AutoSize = true; - this.labelTextAlternateLineLengths.Location = new System.Drawing.Point(786, 94); - this.labelTextAlternateLineLengths.Name = "labelTextAlternateLineLengths"; - this.labelTextAlternateLineLengths.Size = new System.Drawing.Size(57, 13); - this.labelTextAlternateLineLengths.TabIndex = 35; - this.labelTextAlternateLineLengths.Text = "AltLineLen"; - // - // labelAlternateText - // - this.labelAlternateText.AutoSize = true; - this.labelAlternateText.Location = new System.Drawing.Point(803, 11); - this.labelAlternateText.Name = "labelAlternateText"; - this.labelAlternateText.Size = new System.Drawing.Size(28, 13); - this.labelAlternateText.TabIndex = 34; - this.labelAlternateText.Text = "Text"; - this.labelAlternateText.Visible = false; - // - // labelText - // - this.labelText.AutoSize = true; - this.labelText.Location = new System.Drawing.Point(239, 11); - this.labelText.Name = "labelText"; - this.labelText.Size = new System.Drawing.Size(28, 13); - this.labelText.TabIndex = 5; - this.labelText.Text = "Text"; - // - // textBoxListViewTextAlternate - // - this.textBoxListViewTextAlternate.AllowDrop = true; - this.textBoxListViewTextAlternate.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.textBoxListViewTextAlternate.ContextMenuStrip = this.contextMenuStripTextBoxListView; - this.textBoxListViewTextAlternate.Enabled = false; - this.textBoxListViewTextAlternate.HideSelection = false; - this.textBoxListViewTextAlternate.Location = new System.Drawing.Point(946, 28); - this.textBoxListViewTextAlternate.Multiline = true; - this.textBoxListViewTextAlternate.Name = "textBoxListViewTextAlternate"; - this.textBoxListViewTextAlternate.Size = new System.Drawing.Size(0, 63); - this.textBoxListViewTextAlternate.TabIndex = 33; - this.textBoxListViewTextAlternate.Visible = false; - this.textBoxListViewTextAlternate.MouseClick += new System.Windows.Forms.MouseEventHandler(this.TextBoxListViewTextAlternateMouseClick); - this.textBoxListViewTextAlternate.TextChanged += new System.EventHandler(this.textBoxListViewTextAlternate_TextChanged); - this.textBoxListViewTextAlternate.Enter += new System.EventHandler(this.TextBoxListViewTextAlternateEnter); - this.textBoxListViewTextAlternate.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxListViewTextAlternateKeyDown); - this.textBoxListViewTextAlternate.KeyUp += new System.Windows.Forms.KeyEventHandler(this.TextBoxListViewTextAlternateKeyUp); - this.textBoxListViewTextAlternate.MouseMove += new System.Windows.Forms.MouseEventHandler(this.TextBoxListViewTextAlternateMouseMove); - // - // contextMenuStripTextBoxListView - // - this.contextMenuStripTextBoxListView.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripMenuItemWebVttVoice, - this.toolStripSeparatorWebVTT, - this.cutToolStripMenuItem, - this.copyToolStripMenuItem, - this.pasteToolStripMenuItem, - this.deleteToolStripMenuItem, - this.toolStripMenuItemSplitTextAtCursor, - this.toolStripMenuItemSplitViaWaveform, - this.toolStripSeparator18, - this.selectAllToolStripMenuItem, - this.toolStripSeparator17, - this.normalToolStripMenuItem1, - this.boldToolStripMenuItem1, - this.italicToolStripMenuItem1, - this.boxToolStripMenuItem1, - this.underlineToolStripMenuItem1, - this.colorToolStripMenuItem1, - this.toolStripMenuItemHorizontalDigits, - this.toolStripMenuItemBouten, - this.toolStripMenuItemRuby, - this.fontNameToolStripMenuItem, - this.toolStripSeparator26, - this.toolStripMenuItemInsertUnicodeSymbol, - this.toolStripMenuItemInsertUnicodeControlCharacters, - this.superscriptToolStripMenuItem, - this.subscriptToolStripMenuItem}); - this.contextMenuStripTextBoxListView.Name = "contextMenuStripTextBoxListView"; - this.contextMenuStripTextBoxListView.Size = new System.Drawing.Size(274, 512); - this.contextMenuStripTextBoxListView.Closed += new System.Windows.Forms.ToolStripDropDownClosedEventHandler(this.MenuClosed); - this.contextMenuStripTextBoxListView.Opening += new System.ComponentModel.CancelEventHandler(this.ContextMenuStripTextBoxListViewOpening); - this.contextMenuStripTextBoxListView.Opened += new System.EventHandler(this.MenuOpened); - // - // toolStripMenuItemWebVttVoice - // - this.toolStripMenuItemWebVttVoice.Name = "toolStripMenuItemWebVttVoice"; - this.toolStripMenuItemWebVttVoice.Size = new System.Drawing.Size(273, 22); - this.toolStripMenuItemWebVttVoice.Text = "WebVTT voice"; - // - // toolStripSeparatorWebVTT - // - this.toolStripSeparatorWebVTT.Name = "toolStripSeparatorWebVTT"; - this.toolStripSeparatorWebVTT.Size = new System.Drawing.Size(270, 6); - // - // cutToolStripMenuItem - // - this.cutToolStripMenuItem.Name = "cutToolStripMenuItem"; - this.cutToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.X))); - this.cutToolStripMenuItem.Size = new System.Drawing.Size(273, 22); - this.cutToolStripMenuItem.Text = "Cut"; - this.cutToolStripMenuItem.Click += new System.EventHandler(this.cutToolStripMenuItem_Click); - // - // copyToolStripMenuItem - // - this.copyToolStripMenuItem.Name = "copyToolStripMenuItem"; - this.copyToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.C))); - this.copyToolStripMenuItem.Size = new System.Drawing.Size(273, 22); - this.copyToolStripMenuItem.Text = "Copy"; - this.copyToolStripMenuItem.Click += new System.EventHandler(this.copyToolStripMenuItem_Click); - // - // pasteToolStripMenuItem - // - this.pasteToolStripMenuItem.Name = "pasteToolStripMenuItem"; - this.pasteToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.V))); - this.pasteToolStripMenuItem.Size = new System.Drawing.Size(273, 22); - this.pasteToolStripMenuItem.Text = "Paste"; - this.pasteToolStripMenuItem.Click += new System.EventHandler(this.PasteToolStripMenuItemClick); - // - // deleteToolStripMenuItem - // - this.deleteToolStripMenuItem.Name = "deleteToolStripMenuItem"; - this.deleteToolStripMenuItem.Size = new System.Drawing.Size(273, 22); - this.deleteToolStripMenuItem.Text = "Delete"; - this.deleteToolStripMenuItem.Click += new System.EventHandler(this.DeleteToolStripMenuItemClick); - // - // toolStripMenuItemSplitTextAtCursor - // - this.toolStripMenuItemSplitTextAtCursor.Name = "toolStripMenuItemSplitTextAtCursor"; - this.toolStripMenuItemSplitTextAtCursor.Size = new System.Drawing.Size(273, 22); - this.toolStripMenuItemSplitTextAtCursor.Text = "Split text at cursor position"; - this.toolStripMenuItemSplitTextAtCursor.Click += new System.EventHandler(this.ToolStripMenuItemSplitTextAtCursorClick); - // - // toolStripMenuItemSplitViaWaveform - // - this.toolStripMenuItemSplitViaWaveform.Name = "toolStripMenuItemSplitViaWaveform"; - this.toolStripMenuItemSplitViaWaveform.Size = new System.Drawing.Size(273, 22); - this.toolStripMenuItemSplitViaWaveform.Text = "Split text at cursor/waveform position"; - this.toolStripMenuItemSplitViaWaveform.Click += new System.EventHandler(this.toolStripMenuItemSplitViaWaveform_Click); - // - // toolStripSeparator18 - // - this.toolStripSeparator18.Name = "toolStripSeparator18"; - this.toolStripSeparator18.Size = new System.Drawing.Size(270, 6); - // - // selectAllToolStripMenuItem - // - this.selectAllToolStripMenuItem.Name = "selectAllToolStripMenuItem"; - this.selectAllToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.A))); - this.selectAllToolStripMenuItem.Size = new System.Drawing.Size(273, 22); - this.selectAllToolStripMenuItem.Text = "Select all"; - this.selectAllToolStripMenuItem.Click += new System.EventHandler(this.selectAllToolStripMenuItem_Click); - // - // toolStripSeparator17 - // - this.toolStripSeparator17.Name = "toolStripSeparator17"; - this.toolStripSeparator17.Size = new System.Drawing.Size(270, 6); - // - // normalToolStripMenuItem1 - // - this.normalToolStripMenuItem1.Name = "normalToolStripMenuItem1"; - this.normalToolStripMenuItem1.Size = new System.Drawing.Size(273, 22); - this.normalToolStripMenuItem1.Text = "Normal"; - this.normalToolStripMenuItem1.Click += new System.EventHandler(this.NormalToolStripMenuItem1Click); - // - // boldToolStripMenuItem1 - // - this.boldToolStripMenuItem1.Name = "boldToolStripMenuItem1"; - this.boldToolStripMenuItem1.Size = new System.Drawing.Size(273, 22); - this.boldToolStripMenuItem1.Text = "Bold"; - this.boldToolStripMenuItem1.Click += new System.EventHandler(this.BoldToolStripMenuItem1Click); - // - // italicToolStripMenuItem1 - // - this.italicToolStripMenuItem1.Name = "italicToolStripMenuItem1"; - this.italicToolStripMenuItem1.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.I))); - this.italicToolStripMenuItem1.Size = new System.Drawing.Size(273, 22); - this.italicToolStripMenuItem1.Text = "Italic"; - this.italicToolStripMenuItem1.Click += new System.EventHandler(this.ItalicToolStripMenuItem1Click); - // - // boxToolStripMenuItem1 - // - this.boxToolStripMenuItem1.Name = "boxToolStripMenuItem1"; - this.boxToolStripMenuItem1.Size = new System.Drawing.Size(273, 22); - this.boxToolStripMenuItem1.Text = "Box"; - this.boxToolStripMenuItem1.Click += new System.EventHandler(this.boxToolStripMenuItem1_Click); - // - // underlineToolStripMenuItem1 - // - this.underlineToolStripMenuItem1.Name = "underlineToolStripMenuItem1"; - this.underlineToolStripMenuItem1.Size = new System.Drawing.Size(273, 22); - this.underlineToolStripMenuItem1.Text = "Underline"; - this.underlineToolStripMenuItem1.Click += new System.EventHandler(this.UnderlineToolStripMenuItem1Click); - // - // colorToolStripMenuItem1 - // - this.colorToolStripMenuItem1.Name = "colorToolStripMenuItem1"; - this.colorToolStripMenuItem1.Size = new System.Drawing.Size(273, 22); - this.colorToolStripMenuItem1.Text = "Color..."; - this.colorToolStripMenuItem1.Click += new System.EventHandler(this.ColorToolStripMenuItem1Click); - // - // toolStripMenuItemHorizontalDigits - // - this.toolStripMenuItemHorizontalDigits.Name = "toolStripMenuItemHorizontalDigits"; - this.toolStripMenuItemHorizontalDigits.Size = new System.Drawing.Size(273, 22); - this.toolStripMenuItemHorizontalDigits.Text = "Horizontal digits"; - this.toolStripMenuItemHorizontalDigits.Click += new System.EventHandler(this.toolStripMenuItemHorizontalDigits_Click); - // - // toolStripMenuItemBouten - // - this.toolStripMenuItemBouten.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.boutendotbeforeToolStripMenuItem, - this.boutendotafterToolStripMenuItem, - this.boutendotoutsideToolStripMenuItem, - this.boutenfilledcircleoutsideToolStripMenuItem, - this.boutenopencircleoutsideToolStripMenuItem, - this.boutenopendotoutsideToolStripMenuItem, - this.boutenfilledsesameoutsideToolStripMenuItem, - this.boutenopensesameoutsideToolStripMenuItem, - this.boutenautooutsideToolStripMenuItem, - this.boutenautoToolStripMenuItem}); - this.toolStripMenuItemBouten.Name = "toolStripMenuItemBouten"; - this.toolStripMenuItemBouten.Size = new System.Drawing.Size(273, 22); - this.toolStripMenuItemBouten.Text = "Bouten"; - // - // boutendotbeforeToolStripMenuItem - // - this.boutendotbeforeToolStripMenuItem.Name = "boutendotbeforeToolStripMenuItem"; - this.boutendotbeforeToolStripMenuItem.Size = new System.Drawing.Size(232, 22); - this.boutendotbeforeToolStripMenuItem.Text = "bouten-dot-before"; - this.boutendotbeforeToolStripMenuItem.Click += new System.EventHandler(this.BoutenToolStripMenuItemClick); - // - // boutendotafterToolStripMenuItem - // - this.boutendotafterToolStripMenuItem.Name = "boutendotafterToolStripMenuItem"; - this.boutendotafterToolStripMenuItem.Size = new System.Drawing.Size(232, 22); - this.boutendotafterToolStripMenuItem.Text = "bouten-dot-after"; - this.boutendotafterToolStripMenuItem.Click += new System.EventHandler(this.BoutenToolStripMenuItemClick); - // - // boutendotoutsideToolStripMenuItem - // - this.boutendotoutsideToolStripMenuItem.Name = "boutendotoutsideToolStripMenuItem"; - this.boutendotoutsideToolStripMenuItem.Size = new System.Drawing.Size(232, 22); - this.boutendotoutsideToolStripMenuItem.Text = "bouten-dot-outside"; - this.boutendotoutsideToolStripMenuItem.Click += new System.EventHandler(this.BoutenToolStripMenuItemClick); - // - // boutenfilledcircleoutsideToolStripMenuItem - // - this.boutenfilledcircleoutsideToolStripMenuItem.Name = "boutenfilledcircleoutsideToolStripMenuItem"; - this.boutenfilledcircleoutsideToolStripMenuItem.Size = new System.Drawing.Size(232, 22); - this.boutenfilledcircleoutsideToolStripMenuItem.Text = "bouten-filled-circle-outside"; - this.boutenfilledcircleoutsideToolStripMenuItem.Click += new System.EventHandler(this.BoutenToolStripMenuItemClick); - // - // boutenopencircleoutsideToolStripMenuItem - // - this.boutenopencircleoutsideToolStripMenuItem.Name = "boutenopencircleoutsideToolStripMenuItem"; - this.boutenopencircleoutsideToolStripMenuItem.Size = new System.Drawing.Size(232, 22); - this.boutenopencircleoutsideToolStripMenuItem.Text = "bouten-open-circle-outside"; - this.boutenopencircleoutsideToolStripMenuItem.Click += new System.EventHandler(this.BoutenToolStripMenuItemClick); - // - // boutenopendotoutsideToolStripMenuItem - // - this.boutenopendotoutsideToolStripMenuItem.Name = "boutenopendotoutsideToolStripMenuItem"; - this.boutenopendotoutsideToolStripMenuItem.Size = new System.Drawing.Size(232, 22); - this.boutenopendotoutsideToolStripMenuItem.Text = "bouten-open-dot-outside"; - this.boutenopendotoutsideToolStripMenuItem.Click += new System.EventHandler(this.BoutenToolStripMenuItemClick); - // - // boutenfilledsesameoutsideToolStripMenuItem - // - this.boutenfilledsesameoutsideToolStripMenuItem.Name = "boutenfilledsesameoutsideToolStripMenuItem"; - this.boutenfilledsesameoutsideToolStripMenuItem.Size = new System.Drawing.Size(232, 22); - this.boutenfilledsesameoutsideToolStripMenuItem.Text = "bouten-filled-sesame-outside"; - this.boutenfilledsesameoutsideToolStripMenuItem.Click += new System.EventHandler(this.BoutenToolStripMenuItemClick); - // - // boutenopensesameoutsideToolStripMenuItem - // - this.boutenopensesameoutsideToolStripMenuItem.Name = "boutenopensesameoutsideToolStripMenuItem"; - this.boutenopensesameoutsideToolStripMenuItem.Size = new System.Drawing.Size(232, 22); - this.boutenopensesameoutsideToolStripMenuItem.Text = "bouten-open-sesame-outside"; - this.boutenopensesameoutsideToolStripMenuItem.Click += new System.EventHandler(this.BoutenToolStripMenuItemClick); - // - // boutenautooutsideToolStripMenuItem - // - this.boutenautooutsideToolStripMenuItem.Name = "boutenautooutsideToolStripMenuItem"; - this.boutenautooutsideToolStripMenuItem.Size = new System.Drawing.Size(232, 22); - this.boutenautooutsideToolStripMenuItem.Text = "bouten-auto-outside"; - this.boutenautooutsideToolStripMenuItem.Click += new System.EventHandler(this.BoutenToolStripMenuItemClick); - // - // boutenautoToolStripMenuItem - // - this.boutenautoToolStripMenuItem.Name = "boutenautoToolStripMenuItem"; - this.boutenautoToolStripMenuItem.Size = new System.Drawing.Size(232, 22); - this.boutenautoToolStripMenuItem.Text = "bouten-auto"; - this.boutenautoToolStripMenuItem.Click += new System.EventHandler(this.BoutenToolStripMenuItemClick); - // - // toolStripMenuItemRuby - // - this.toolStripMenuItemRuby.Name = "toolStripMenuItemRuby"; - this.toolStripMenuItemRuby.Size = new System.Drawing.Size(273, 22); - this.toolStripMenuItemRuby.Text = "Ruby..."; - this.toolStripMenuItemRuby.Click += new System.EventHandler(this.toolStripMenuItemRuby_Click); - // - // fontNameToolStripMenuItem - // - this.fontNameToolStripMenuItem.Name = "fontNameToolStripMenuItem"; - this.fontNameToolStripMenuItem.Size = new System.Drawing.Size(273, 22); - this.fontNameToolStripMenuItem.Text = "Font name..."; - this.fontNameToolStripMenuItem.Click += new System.EventHandler(this.FontNameToolStripMenuItemClick); - // - // toolStripSeparator26 - // - this.toolStripSeparator26.Name = "toolStripSeparator26"; - this.toolStripSeparator26.Size = new System.Drawing.Size(270, 6); - // - // toolStripMenuItemInsertUnicodeSymbol - // - this.toolStripMenuItemInsertUnicodeSymbol.Name = "toolStripMenuItemInsertUnicodeSymbol"; - this.toolStripMenuItemInsertUnicodeSymbol.Size = new System.Drawing.Size(273, 22); - this.toolStripMenuItemInsertUnicodeSymbol.Text = "Insert unicode character"; - // - // toolStripMenuItemInsertUnicodeControlCharacters - // - this.toolStripMenuItemInsertUnicodeControlCharacters.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.leftToolStripMenuItem, - this.righttoleftMarkToolStripMenuItem, - this.startOfLefttorightEmbeddingLREToolStripMenuItem, - this.startOfRighttoleftEmbeddingRLEToolStripMenuItem, - this.startOfLefttorightOverrideLROToolStripMenuItem, - this.startOfRighttoleftOverrideRLOToolStripMenuItem}); - this.toolStripMenuItemInsertUnicodeControlCharacters.Name = "toolStripMenuItemInsertUnicodeControlCharacters"; - this.toolStripMenuItemInsertUnicodeControlCharacters.Size = new System.Drawing.Size(273, 22); - this.toolStripMenuItemInsertUnicodeControlCharacters.Text = "Insert unicode control character"; - // - // leftToolStripMenuItem - // - this.leftToolStripMenuItem.Name = "leftToolStripMenuItem"; - this.leftToolStripMenuItem.Size = new System.Drawing.Size(272, 22); - this.leftToolStripMenuItem.Text = "Left-to-right mark (LRM)"; - this.leftToolStripMenuItem.Click += new System.EventHandler(this.leftToolStripMenuItem_Click); - // - // righttoleftMarkToolStripMenuItem - // - this.righttoleftMarkToolStripMenuItem.Name = "righttoleftMarkToolStripMenuItem"; - this.righttoleftMarkToolStripMenuItem.Size = new System.Drawing.Size(272, 22); - this.righttoleftMarkToolStripMenuItem.Text = "Right-to-left mark (RLM)"; - this.righttoleftMarkToolStripMenuItem.Click += new System.EventHandler(this.righttoleftMarkToolStripMenuItem_Click); - // - // startOfLefttorightEmbeddingLREToolStripMenuItem - // - this.startOfLefttorightEmbeddingLREToolStripMenuItem.Name = "startOfLefttorightEmbeddingLREToolStripMenuItem"; - this.startOfLefttorightEmbeddingLREToolStripMenuItem.Size = new System.Drawing.Size(272, 22); - this.startOfLefttorightEmbeddingLREToolStripMenuItem.Text = "Start of left-to-right embedding (LRE)"; - this.startOfLefttorightEmbeddingLREToolStripMenuItem.Click += new System.EventHandler(this.startOfLefttorightEmbeddingLREToolStripMenuItem_Click); - // - // startOfRighttoleftEmbeddingRLEToolStripMenuItem - // - this.startOfRighttoleftEmbeddingRLEToolStripMenuItem.Name = "startOfRighttoleftEmbeddingRLEToolStripMenuItem"; - this.startOfRighttoleftEmbeddingRLEToolStripMenuItem.Size = new System.Drawing.Size(272, 22); - this.startOfRighttoleftEmbeddingRLEToolStripMenuItem.Text = "Start of right-to-left embedding (RLE)"; - this.startOfRighttoleftEmbeddingRLEToolStripMenuItem.Click += new System.EventHandler(this.startOfRighttoleftEmbeddingRLEToolStripMenuItem_Click); - // - // startOfLefttorightOverrideLROToolStripMenuItem - // - this.startOfLefttorightOverrideLROToolStripMenuItem.Name = "startOfLefttorightOverrideLROToolStripMenuItem"; - this.startOfLefttorightOverrideLROToolStripMenuItem.Size = new System.Drawing.Size(272, 22); - this.startOfLefttorightOverrideLROToolStripMenuItem.Text = "Start of left-to-right override (LRO)"; - this.startOfLefttorightOverrideLROToolStripMenuItem.Click += new System.EventHandler(this.startOfLefttorightOverrideLROToolStripMenuItem_Click); - // - // startOfRighttoleftOverrideRLOToolStripMenuItem - // - this.startOfRighttoleftOverrideRLOToolStripMenuItem.Name = "startOfRighttoleftOverrideRLOToolStripMenuItem"; - this.startOfRighttoleftOverrideRLOToolStripMenuItem.Size = new System.Drawing.Size(272, 22); - this.startOfRighttoleftOverrideRLOToolStripMenuItem.Text = "Start of right-to-left override (RLO)"; - this.startOfRighttoleftOverrideRLOToolStripMenuItem.Click += new System.EventHandler(this.startOfRighttoleftOverrideRLOToolStripMenuItem_Click); - // - // superscriptToolStripMenuItem - // - this.superscriptToolStripMenuItem.Name = "superscriptToolStripMenuItem"; - this.superscriptToolStripMenuItem.Size = new System.Drawing.Size(273, 22); - this.superscriptToolStripMenuItem.Text = "Superscript"; - this.superscriptToolStripMenuItem.Click += new System.EventHandler(this.SuperscriptToolStripMenuItemClick); - // - // subscriptToolStripMenuItem - // - this.subscriptToolStripMenuItem.Name = "subscriptToolStripMenuItem"; - this.subscriptToolStripMenuItem.Size = new System.Drawing.Size(273, 22); - this.subscriptToolStripMenuItem.Text = "Subscript"; - this.subscriptToolStripMenuItem.Click += new System.EventHandler(this.SubscriptToolStripMenuItemClick); - // - // buttonAutoBreak - // - this.buttonAutoBreak.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonAutoBreak.Location = new System.Drawing.Point(604, 51); - this.buttonAutoBreak.Name = "buttonAutoBreak"; - this.buttonAutoBreak.Size = new System.Drawing.Size(115, 23); - this.buttonAutoBreak.TabIndex = 7; - this.buttonAutoBreak.Text = "Auto br"; - this.buttonAutoBreak.UseVisualStyleBackColor = true; - this.buttonAutoBreak.Click += new System.EventHandler(this.ButtonAutoBreakClick); - // - // labelTextLineLengths - // - this.labelTextLineLengths.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelTextLineLengths.AutoSize = true; - this.labelTextLineLengths.Location = new System.Drawing.Point(239, 94); - this.labelTextLineLengths.Name = "labelTextLineLengths"; - this.labelTextLineLengths.Size = new System.Drawing.Size(108, 13); - this.labelTextLineLengths.TabIndex = 12; - this.labelTextLineLengths.Text = "labelTextLineLengths"; - // - // labelTextLineTotal - // - this.labelTextLineTotal.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelTextLineTotal.AutoSize = true; - this.labelTextLineTotal.Location = new System.Drawing.Point(1001, 94); - this.labelTextLineTotal.Name = "labelTextLineTotal"; - this.labelTextLineTotal.Size = new System.Drawing.Size(94, 13); - this.labelTextLineTotal.TabIndex = 21; - this.labelTextLineTotal.Text = "labelTextLineTotal"; - // - // labelCharactersPerSecond - // - this.labelCharactersPerSecond.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.labelCharactersPerSecond.AutoSize = true; - this.labelCharactersPerSecond.Location = new System.Drawing.Point(432, 11); - this.labelCharactersPerSecond.Name = "labelCharactersPerSecond"; - this.labelCharactersPerSecond.Size = new System.Drawing.Size(133, 13); - this.labelCharactersPerSecond.TabIndex = 31; - this.labelCharactersPerSecond.Text = "labelCharactersPerSecond"; - // - // buttonUnBreak - // - this.buttonUnBreak.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonUnBreak.Location = new System.Drawing.Point(604, 22); - this.buttonUnBreak.Name = "buttonUnBreak"; - this.buttonUnBreak.Size = new System.Drawing.Size(115, 23); - this.buttonUnBreak.TabIndex = 6; - this.buttonUnBreak.Text = "Unbreak"; - this.buttonUnBreak.UseVisualStyleBackColor = true; - this.buttonUnBreak.Click += new System.EventHandler(this.ButtonUnBreakClick); - // - // timeUpDownStartTime - // - this.timeUpDownStartTime.AutoSize = true; - this.timeUpDownStartTime.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.timeUpDownStartTime.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F); - this.timeUpDownStartTime.Location = new System.Drawing.Point(8, 26); - this.timeUpDownStartTime.Margin = new System.Windows.Forms.Padding(4); - this.timeUpDownStartTime.Name = "timeUpDownStartTime"; - this.timeUpDownStartTime.Size = new System.Drawing.Size(111, 27); - this.timeUpDownStartTime.TabIndex = 0; - timeCode6.Hours = 0; - timeCode6.Milliseconds = 0; - timeCode6.Minutes = 0; - timeCode6.Seconds = 0; - timeCode6.TimeSpan = System.TimeSpan.Parse("00:00:00"); - timeCode6.TotalMilliseconds = 0D; - timeCode6.TotalSeconds = 0D; - this.timeUpDownStartTime.TimeCode = timeCode6; - this.timeUpDownStartTime.UseVideoOffset = false; - // - // numericUpDownDuration - // - this.numericUpDownDuration.DecimalPlaces = 3; - this.numericUpDownDuration.Increment = new decimal(new int[] { - 1, - 0, - 0, - 65536}); - this.numericUpDownDuration.Location = new System.Drawing.Point(122, 27); - this.numericUpDownDuration.Maximum = new decimal(new int[] { - 999999999, - 0, - 0, - 0}); - this.numericUpDownDuration.Minimum = new decimal(new int[] { - 99999, - 0, - 0, - -2147483648}); - this.numericUpDownDuration.Name = "numericUpDownDuration"; - this.numericUpDownDuration.Size = new System.Drawing.Size(56, 20); - this.numericUpDownDuration.TabIndex = 1; - this.numericUpDownDuration.ValueChanged += new System.EventHandler(this.NumericUpDownDurationValueChanged); - // - // buttonPrevious - // - this.buttonPrevious.Location = new System.Drawing.Point(8, 78); - this.buttonPrevious.Name = "buttonPrevious"; - this.buttonPrevious.Size = new System.Drawing.Size(72, 23); - this.buttonPrevious.TabIndex = 2; - this.buttonPrevious.Text = "< Prev "; - this.buttonPrevious.UseVisualStyleBackColor = true; - this.buttonPrevious.Click += new System.EventHandler(this.ButtonPreviousClick); - // - // buttonNext - // - this.buttonNext.Location = new System.Drawing.Point(86, 78); - this.buttonNext.Name = "buttonNext"; - this.buttonNext.Size = new System.Drawing.Size(72, 23); - this.buttonNext.TabIndex = 3; - this.buttonNext.Text = "Next >"; - this.buttonNext.UseVisualStyleBackColor = true; - this.buttonNext.Click += new System.EventHandler(this.ButtonNextClick); - // - // labelStartTime - // - this.labelStartTime.AutoSize = true; - this.labelStartTime.Location = new System.Drawing.Point(9, 11); - this.labelStartTime.Name = "labelStartTime"; - this.labelStartTime.Size = new System.Drawing.Size(51, 13); - this.labelStartTime.TabIndex = 3; - this.labelStartTime.Text = "Start time"; - // - // textBoxListViewText - // - this.textBoxListViewText.AllowDrop = true; - this.textBoxListViewText.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.textBoxListViewText.ContextMenuStrip = this.contextMenuStripTextBoxListView; - this.textBoxListViewText.Enabled = false; - this.textBoxListViewText.HideSelection = false; - this.textBoxListViewText.Location = new System.Drawing.Point(236, 28); - this.textBoxListViewText.Multiline = true; - this.textBoxListViewText.Name = "textBoxListViewText"; - this.textBoxListViewText.Size = new System.Drawing.Size(362, 63); - this.textBoxListViewText.TabIndex = 5; - this.textBoxListViewText.MouseClick += new System.Windows.Forms.MouseEventHandler(this.TextBoxListViewTextMouseClick); - this.textBoxListViewText.TextChanged += new System.EventHandler(this.TextBoxListViewTextTextChanged); - this.textBoxListViewText.Enter += new System.EventHandler(this.TextBoxListViewTextEnter); - this.textBoxListViewText.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxListViewTextKeyDown); - this.textBoxListViewText.KeyUp += new System.Windows.Forms.KeyEventHandler(this.textBoxListViewText_KeyUp); - this.textBoxListViewText.Leave += new System.EventHandler(this.textBoxListViewText_Leave); - this.textBoxListViewText.MouseMove += new System.Windows.Forms.MouseEventHandler(this.textBoxListViewText_MouseMove); - // - // labelDuration - // - this.labelDuration.AutoSize = true; - this.labelDuration.Location = new System.Drawing.Point(122, 11); - this.labelDuration.Name = "labelDuration"; - this.labelDuration.Size = new System.Drawing.Size(47, 13); - this.labelDuration.TabIndex = 4; - this.labelDuration.Text = "Duration"; - // - // labelAutoDuration - // - this.labelAutoDuration.AutoSize = true; - this.labelAutoDuration.Location = new System.Drawing.Point(92, 11); - this.labelAutoDuration.Name = "labelAutoDuration"; - this.labelAutoDuration.Size = new System.Drawing.Size(29, 13); - this.labelAutoDuration.TabIndex = 30; - this.labelAutoDuration.Text = "Auto"; - // - // tabPage2 - // - this.tabPage2.Controls.Add(this.textBoxSource); - this.tabPage2.Location = new System.Drawing.Point(4, 22); - this.tabPage2.Name = "tabPage2"; - this.tabPage2.Padding = new System.Windows.Forms.Padding(3); - this.tabPage2.Size = new System.Drawing.Size(730, 222); - this.tabPage2.TabIndex = 1; - this.tabPage2.Text = "Source view"; - this.tabPage2.UseVisualStyleBackColor = true; - // - // textBoxSource - // - this.textBoxSource.AllowDrop = true; - this.textBoxSource.Dock = System.Windows.Forms.DockStyle.Fill; - this.textBoxSource.HideSelection = false; - this.textBoxSource.Location = new System.Drawing.Point(3, 3); - this.textBoxSource.MaxLength = 0; - this.textBoxSource.Multiline = true; - this.textBoxSource.Name = "textBoxSource"; - this.textBoxSource.ScrollBars = System.Windows.Forms.ScrollBars.Both; - this.textBoxSource.Size = new System.Drawing.Size(724, 216); - this.textBoxSource.TabIndex = 12; - this.textBoxSource.WordWrap = false; - this.textBoxSource.Click += new System.EventHandler(this.TextBoxSourceClick); - this.textBoxSource.TextChanged += new System.EventHandler(this.TextBoxSourceTextChanged); - this.textBoxSource.DragDrop += new System.Windows.Forms.DragEventHandler(this.TextBoxSourceDragDrop); - this.textBoxSource.DragEnter += new System.Windows.Forms.DragEventHandler(this.TextBoxSourceDragEnter); - this.textBoxSource.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxSourceKeyDown); - this.textBoxSource.KeyUp += new System.Windows.Forms.KeyEventHandler(this.textBoxSource_KeyUp); - this.textBoxSource.Leave += new System.EventHandler(this.TextBoxSourceLeave); - // - // panelVideoPlayer - // - this.panelVideoPlayer.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.panelVideoPlayer.Controls.Add(this.mediaPlayer); - this.panelVideoPlayer.Location = new System.Drawing.Point(1, 1); - this.panelVideoPlayer.Name = "panelVideoPlayer"; - this.panelVideoPlayer.Size = new System.Drawing.Size(220, 246); - this.panelVideoPlayer.TabIndex = 5; - // - // mediaPlayer - // - this.mediaPlayer.AllowDrop = true; - this.mediaPlayer.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.mediaPlayer.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(18)))), ((int)(((byte)(18))))); - this.mediaPlayer.CurrentPosition = 0D; - this.mediaPlayer.FontSizeFactor = 1F; - this.mediaPlayer.LastParagraph = null; - this.mediaPlayer.Location = new System.Drawing.Point(0, 0); - this.mediaPlayer.Margin = new System.Windows.Forms.Padding(0); - this.mediaPlayer.Name = "mediaPlayer"; - this.mediaPlayer.ShowFullscreenButton = true; - this.mediaPlayer.ShowMuteButton = true; - this.mediaPlayer.ShowStopButton = true; - this.mediaPlayer.Size = new System.Drawing.Size(219, 246); - this.mediaPlayer.SmpteMode = false; - this.mediaPlayer.SubtitleText = ""; - this.mediaPlayer.TabIndex = 5; - this.mediaPlayer.TextRightToLeft = System.Windows.Forms.RightToLeft.No; - this.mediaPlayer.VideoHeight = 0; - this.mediaPlayer.VideoPlayer = null; - this.mediaPlayer.VideoWidth = 0; - this.mediaPlayer.Volume = 0D; - this.mediaPlayer.DragDrop += new System.Windows.Forms.DragEventHandler(this.mediaPlayer_DragDrop); - this.mediaPlayer.DragEnter += new System.Windows.Forms.DragEventHandler(this.mediaPlayer_DragEnter); - // - // contextMenuStripEmpty - // - this.contextMenuStripEmpty.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.insertLineToolStripMenuItem, - this.aSSStylesToolStripMenuItem}); - this.contextMenuStripEmpty.Name = "contextMenuStripEmpty"; - this.contextMenuStripEmpty.Size = new System.Drawing.Size(181, 70); - this.contextMenuStripEmpty.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStripEmpty_Opening); - // - // insertLineToolStripMenuItem - // - this.insertLineToolStripMenuItem.Name = "insertLineToolStripMenuItem"; - this.insertLineToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.insertLineToolStripMenuItem.Text = "Insert line"; - this.insertLineToolStripMenuItem.Click += new System.EventHandler(this.InsertLineToolStripMenuItemClick); - // - // imageListPlayRate - // - this.imageListPlayRate.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageListPlayRate.ImageStream"))); - this.imageListPlayRate.TransparentColor = System.Drawing.Color.Transparent; - this.imageListPlayRate.Images.SetKeyName(0, "FastForward.png"); - this.imageListPlayRate.Images.SetKeyName(1, "FastForwardHighLight.png"); - // - // timerTextUndo - // - this.timerTextUndo.Interval = 700; - this.timerTextUndo.Tick += new System.EventHandler(this.TimerTextUndoTick); - // - // timerAlternateTextUndo - // - this.timerAlternateTextUndo.Interval = 700; - this.timerAlternateTextUndo.Tick += new System.EventHandler(this.TimerAlternateTextUndoTick); - // - // aSSStylesToolStripMenuItem - // - this.aSSStylesToolStripMenuItem.Name = "aSSStylesToolStripMenuItem"; - this.aSSStylesToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.aSSStylesToolStripMenuItem.Text = "ASS styles..."; - this.aSSStylesToolStripMenuItem.Click += new System.EventHandler(this.aSSStylesToolStripMenuItem_Click); - // - // Main - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(975, 646); - this.Controls.Add(this.splitContainerMain); - this.Controls.Add(this.toolStrip1); - this.Controls.Add(this.statusStrip1); - this.Controls.Add(this.menuStrip1); - this.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.KeyPreview = true; - this.MainMenuStrip = this.menuStrip1; - this.MinimumSize = new System.Drawing.Size(800, 554); - this.Name = "Main"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormMain_FormClosing); - this.Load += new System.EventHandler(this.Main_Load); - this.Shown += new System.EventHandler(this.Main_Shown); - this.ResizeEnd += new System.EventHandler(this.Main_ResizeEnd); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.MainKeyDown); - this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.MainKeyUp); - this.Resize += new System.EventHandler(this.Main_Resize); - this.statusStrip1.ResumeLayout(false); - this.statusStrip1.PerformLayout(); - this.toolStrip1.ResumeLayout(false); - this.toolStrip1.PerformLayout(); - this.menuStrip1.ResumeLayout(false); - this.menuStrip1.PerformLayout(); - this.contextMenuStripListview.ResumeLayout(false); - this.groupBoxVideo.ResumeLayout(false); - this.groupBoxVideo.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.trackBarWaveformPosition)).EndInit(); - this.panelWaveformControls.ResumeLayout(false); - this.panelWaveformControls.PerformLayout(); - this.toolStripWaveControls.ResumeLayout(false); - this.toolStripWaveControls.PerformLayout(); - this.tabControlButtons.ResumeLayout(false); - this.tabPageTranslate.ResumeLayout(false); - this.tabPageTranslate.PerformLayout(); - this.groupBoxTranslateSearch.ResumeLayout(false); - this.groupBoxTranslateSearch.PerformLayout(); - this.groupBoxAutoContinue.ResumeLayout(false); - this.groupBoxAutoContinue.PerformLayout(); - this.groupBoxAutoRepeat.ResumeLayout(false); - this.groupBoxAutoRepeat.PerformLayout(); - this.tabPageCreate.ResumeLayout(false); - this.tabPageCreate.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSec2)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSec1)).EndInit(); - this.tabPageAdjust.ResumeLayout(false); - this.tabPageAdjust.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSecAdjust2)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSecAdjust1)).EndInit(); - this.contextMenuStripWaveform.ResumeLayout(false); - this.splitContainerMain.Panel1.ResumeLayout(false); - this.splitContainerMain.Panel2.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.splitContainerMain)).EndInit(); - this.splitContainerMain.ResumeLayout(false); - this.splitContainer1.Panel1.ResumeLayout(false); - this.splitContainer1.Panel2.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); - this.splitContainer1.ResumeLayout(false); - this.tabControlSubtitle.ResumeLayout(false); - this.tabPage1.ResumeLayout(false); - this.splitContainerListViewAndText.Panel1.ResumeLayout(false); - this.splitContainerListViewAndText.Panel2.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.splitContainerListViewAndText)).EndInit(); - this.splitContainerListViewAndText.ResumeLayout(false); - this.groupBoxEdit.ResumeLayout(false); - this.groupBoxEdit.PerformLayout(); - this.panelBookmark.ResumeLayout(false); - this.panelBookmark.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxBookmark)).EndInit(); - this.contextMenuStripTextBoxListView.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDuration)).EndInit(); - this.tabPage2.ResumeLayout(false); - this.tabPage2.PerformLayout(); - this.panelVideoPlayer.ResumeLayout(false); - this.contextMenuStripEmpty.ResumeLayout(false); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.StatusStrip statusStrip1; - private System.Windows.Forms.ToolStrip toolStrip1; - private System.Windows.Forms.MenuStrip menuStrip1; - private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem toolsToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem optionsToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem newToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem reopenToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem saveAsToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; - private System.Windows.Forms.ToolStripMenuItem findToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem findNextToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem replaceToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem gotoLineNumberToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem settingsToolStripMenuItem; - private System.Windows.Forms.TabControl tabControlSubtitle; - private System.Windows.Forms.TabPage tabPage1; - private Nikse.SubtitleEdit.Controls.SubtitleListView SubtitleListview1; - private System.Windows.Forms.TabPage tabPage2; - private System.Windows.Forms.TextBox textBoxSource; - private System.Windows.Forms.OpenFileDialog openFileDialog1; - private System.Windows.Forms.SaveFileDialog saveFileDialog1; - private System.Windows.Forms.ToolStripButton toolStripButtonFileOpen; - private System.Windows.Forms.ToolStripButton toolStripButtonFileNew; - private System.Windows.Forms.ToolStripButton toolStripButtonSave; - private System.Windows.Forms.ToolStripButton toolStripButtonSaveAs; - private System.Windows.Forms.ToolStripButton toolStripButtonFind; - private System.Windows.Forms.ToolStripButton toolStripButtonReplace; - private System.Windows.Forms.ToolStripButton toolStripButtonSpellCheck; - private System.Windows.Forms.ToolStripButton toolStripButtonSettings; - private System.Windows.Forms.ToolStripButton toolStripButtonVisualSync; - private System.Windows.Forms.ToolStripSeparator toolStripSeparatorFindReplace; - private System.Windows.Forms.ToolStripSeparator toolStripSeparatorFixSyncSpell; - private System.Windows.Forms.ToolStripSeparator toolStripSeparatorHelp; - private System.Windows.Forms.ToolStripButton toolStripButtonHelp; - private System.Windows.Forms.Timer timer1; - private System.Windows.Forms.ToolStripStatusLabel labelStatus; - private System.Windows.Forms.ToolStripMenuItem adjustDisplayTimeToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem fixToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem startNumberingFromToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem removeTextForHearImpairedToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; - private System.Windows.Forms.ToolStripMenuItem splitToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem appendTextVisuallyToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem showHistoryforUndoToolStripMenuItem; - private System.Windows.Forms.ContextMenuStrip contextMenuStripListview; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemDelete; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInsertBefore; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInsertAfter; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator7; - private System.Windows.Forms.ToolStripMenuItem boldToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem italicToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem underlineToolStripMenuItem; - private System.Windows.Forms.GroupBox groupBoxEdit; - private System.Windows.Forms.Label labelText; - private System.Windows.Forms.Label labelDuration; - private System.Windows.Forms.Label labelStartTime; - //private System.Windows.Forms.TextBox textBoxListViewText; - Nikse.SubtitleEdit.Controls.SETextBox textBoxListViewText; - private System.Windows.Forms.Button buttonPrevious; - private System.Windows.Forms.Button buttonNext; - private System.Windows.Forms.ToolStripMenuItem splitLineToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem mergeBeforeToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem mergeAfterToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator8; - private System.Windows.Forms.Button buttonAutoBreak; - private System.Windows.Forms.ToolStripMenuItem removeFormattinglToolStripMenuItem; - private System.Windows.Forms.Label labelTextLineLengths; - private System.Windows.Forms.NumericUpDown numericUpDownDuration; - private System.Windows.Forms.Label labelDurationWarning; - private System.Windows.Forms.Label labelStartTimeWarning; - private System.Windows.Forms.Button buttonUnBreak; - private System.Windows.Forms.ToolStripMenuItem colorToolStripMenuItem; - private System.Windows.Forms.ColorDialog colorDialog1; - private System.Windows.Forms.Label labelTextLineTotal; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; - private System.Windows.Forms.ToolStripMenuItem typeEffectToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem karokeeEffectToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem matroskaImportStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator10; - private Nikse.SubtitleEdit.Controls.TimeUpDown timeUpDownStartTime; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemManualAnsi; - private System.Windows.Forms.ToolStripMenuItem ChangeCasingToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemMergeLines; - private System.Windows.Forms.ToolStripSeparator toolStripSeparatorAdvancedFunctions; - private System.Windows.Forms.ToolStripMenuItem visualSyncSelectedLinesToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem showSelectedLinesEarlierlaterToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem adjustDisplayTimeForSelectedLinesToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem fixCommonErrorsInSelectedLinesToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem changeCasingForSelectedLinesToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSortBy; - private System.Windows.Forms.ToolStripMenuItem sortNumberToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem sortStartTimeToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem sortEndTimeToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem sortDisplayTimeToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem sortTextMaxLineLengthToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem sortTextTotalLengthToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem sortTextNumberOfLinesToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem sortTextAlphabeticallytoolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem changeLanguageToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator12; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemCompare; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemUnbreakLines; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemAutoBreakLines; - private System.Windows.Forms.ToolStripSeparator toolStripSeparatorBreakLines; - private System.Windows.Forms.ToolStripMenuItem multipleReplaceToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemImportDvdSubtitles; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSubIdx; - private System.Windows.Forms.ToolStripStatusLabel toolStripSelected; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInsertUnicodeCharacter; - private System.Windows.Forms.ToolStripSeparator toolStripSeparatorInsertUnicodeCharacter; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemAutoMergeShortLines; - private System.Windows.Forms.ToolStripMenuItem setMinimumDisplayTimeBetweenParagraphsToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemImportText; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemImportTimeCodes; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemFont; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator14; - private System.Windows.Forms.GroupBox groupBoxVideo; - private System.Windows.Forms.Button buttonGotoSub; - private System.Windows.Forms.Button buttonBeforeText; - private System.Windows.Forms.Button buttonSetEnd; - private System.Windows.Forms.Button buttonSetStartTime; - private System.Windows.Forms.Button buttonInsertNewText; - private System.Windows.Forms.Button buttonSecBack1; - private System.Windows.Forms.Timer ShowSubtitleTimer; - private System.Windows.Forms.Timer timerAutoDuration; - private System.Windows.Forms.Label labelAutoDuration; - private System.Windows.Forms.Timer timerAutoContinue; - private System.Windows.Forms.ToolStripComboBox comboBoxSubtitleFormats; - private System.Windows.Forms.ToolStripSeparator toolStripSeparatorToggle; - private System.Windows.Forms.ToolStripSeparator toolStripSeparatorSubtitleFormat; - private System.Windows.Forms.ToolStripLabel toolStripLabelSubtitleFormat; - private System.Windows.Forms.ToolStripLabel toolStripLabelEncoding; - private System.Windows.Forms.ToolStripComboBox comboBoxEncoding; - private System.Windows.Forms.ToolStripButton toolStripButtonToggleVideo; - private System.Windows.Forms.ToolStripSeparator toolStripSeparatorEncoding; - private System.Windows.Forms.ToolStripSeparator toolStripSeparatorFrameRate; - private System.Windows.Forms.ToolStripLabel toolStripLabelFrameRate; - private System.Windows.Forms.ToolStripComboBox toolStripComboBoxFrameRate; - private System.Windows.Forms.ToolStripButton toolStripButtonGetFrameRate; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSpellCheckMain; - private System.Windows.Forms.ToolStripMenuItem spellCheckToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem findDoubleWordsToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator9; - private System.Windows.Forms.ToolStripMenuItem GetDictionariesToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem addWordToNameListToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSynchronization; - private System.Windows.Forms.ToolStripMenuItem visualSyncToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemPointSync; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemAdjustAllTimes; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemAutoTranslate; - private System.Windows.Forms.ToolStripMenuItem translateByGoogleToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem translateFromSwedishToDanishToolStripMenuItem; - private System.Windows.Forms.Timer timerStillTyping; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemVideo; - private System.Windows.Forms.ToolStripMenuItem openVideoToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator5; - private System.Windows.Forms.ToolStripMenuItem showhideVideoToolStripMenuItem; - private System.Windows.Forms.Label labelVideoPosition; - private Controls.TimeUpDown timeUpDownVideoPosition; - private System.Windows.Forms.TabControl tabControlButtons; - private System.Windows.Forms.TabPage tabPageTranslate; - private System.Windows.Forms.GroupBox groupBoxTranslateSearch; - private System.Windows.Forms.Button buttonGoogleTranslateIt; - private System.Windows.Forms.Button buttonGoogleIt; - private System.Windows.Forms.TextBox textBoxSearchWord; - private System.Windows.Forms.GroupBox groupBoxAutoContinue; - private System.Windows.Forms.ComboBox comboBoxAutoContinue; - private System.Windows.Forms.Label labelAutoContinueDelay; - private System.Windows.Forms.CheckBox checkBoxAutoContinue; - private System.Windows.Forms.GroupBox groupBoxAutoRepeat; - private System.Windows.Forms.ComboBox comboBoxAutoRepeat; - private System.Windows.Forms.Label labelAutoRepeatCount; - private System.Windows.Forms.CheckBox checkBoxAutoRepeatOn; - private System.Windows.Forms.Button buttonStop; - private System.Windows.Forms.Button buttonPlayPrevious; - private System.Windows.Forms.Button buttonPlayCurrent; - private System.Windows.Forms.Button buttonPlayNext; - private System.Windows.Forms.TabPage tabPageCreate; - private System.Windows.Forms.TabPage tabPageAdjust; - private System.Windows.Forms.Button buttonAdjustGoToPosAndPause; - private System.Windows.Forms.Button buttonAdjustPlayBefore; - private System.Windows.Forms.Button buttonAdjustSetEndTime; - private System.Windows.Forms.Button buttonSetEndAndGoToNext; - private System.Windows.Forms.Button buttonSetStartAndOffsetRest; - private System.Windows.Forms.Button buttonAdjustSetStartTime; - private System.Windows.Forms.Label labelTranslateTip; - private System.Windows.Forms.Button buttonCustomUrl1; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemOpenContainingFolder; - private System.Windows.Forms.NumericUpDown numericUpDownSec1; - private System.Windows.Forms.Button buttonForward1; - private System.Windows.Forms.Label labelVideoPosition2; - private Controls.TimeUpDown timeUpDownVideoPositionAdjust; - private System.Windows.Forms.Button buttonAdjustSecForward1; - private System.Windows.Forms.NumericUpDown numericUpDownSecAdjust1; - private System.Windows.Forms.Button buttonAdjustSecBack1; - private System.Windows.Forms.Button buttonForward2; - private System.Windows.Forms.NumericUpDown numericUpDownSec2; - private System.Windows.Forms.Button buttonSecBack2; - private System.Windows.Forms.Button buttonAdjustSecForward2; - private System.Windows.Forms.NumericUpDown numericUpDownSecAdjust2; - private System.Windows.Forms.Button buttonAdjustSecBack2; - private System.Windows.Forms.CheckBox checkBoxSyncListViewWithVideoWhilePlaying; - private System.Windows.Forms.Label labelAdjustF10; - private System.Windows.Forms.Label labelAdjustF9; - private System.Windows.Forms.Label labelAdjustF11; - private System.Windows.Forms.Label labelAdjustF12; - private System.Windows.Forms.Label labelCreateF12; - private System.Windows.Forms.Label labelCreateF11; - private System.Windows.Forms.Label labelCreateF10; - private System.Windows.Forms.Label labelCreateF9; - private System.Windows.Forms.ToolStripMenuItem translatepoweredByMicrosoftToolStripMenuItem; - private System.Windows.Forms.ToolStripButton toolStripButtonToggleWaveform; - private Controls.VideoPlayerContainer mediaPlayer; - private System.Windows.Forms.Panel panelVideoPlayer; - private Controls.AudioVisualizer audioVisualizer; - private System.Windows.Forms.Timer timerWaveform; - private System.Windows.Forms.ContextMenuStrip contextMenuStripWaveform; - private System.Windows.Forms.ToolStripMenuItem addParagraphHereToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem deleteParagraphToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem splitToolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem mergeWithPreviousToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem mergeWithNextToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemWaveformPlaySelection; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator11; - private System.Windows.Forms.Panel panelWaveformControls; - private System.Windows.Forms.ToolStrip toolStripWaveControls; - private System.Windows.Forms.ToolStripButton toolStripButtonWaveformZoomIn; - private System.Windows.Forms.ToolStripComboBox toolStripComboBoxWaveform; - private System.Windows.Forms.ToolStripButton toolStripButtonWaveformZoomOut; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator16; - private System.Windows.Forms.ToolStripButton toolStripButtonWaveformPause; - private System.Windows.Forms.ToolStripButton toolStripButtonWaveformPlay; - private System.Windows.Forms.TrackBar trackBarWaveformPosition; - private System.Windows.Forms.Label labelVideoInfo; - private System.Windows.Forms.ToolStripMenuItem showhideWaveformToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemImportBluRaySup; - private System.Windows.Forms.Label labelCharactersPerSecond; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemNetworking; - private System.Windows.Forms.ToolStripMenuItem startServerToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem joinSessionToolStripMenuItem; - private System.Windows.Forms.ToolStripStatusLabel toolStripStatusNetworking; - private System.Windows.Forms.ToolStripMenuItem leaveSessionToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem showSessionKeyLogToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem chatToolStripMenuItem; - private System.Windows.Forms.SplitContainer splitContainer1; - private System.Windows.Forms.SplitContainer splitContainerMain; - private System.Windows.Forms.ToolStripMenuItem undockVideoControlsToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem redockVideoControlsToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator19; - private System.Windows.Forms.ToolStripButton toolStripButtonLockCenter; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInsertSubtitle; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemAutoSplitLongLines; - private System.Windows.Forms.ContextMenuStrip contextMenuStripEmpty; - private System.Windows.Forms.ToolStripMenuItem insertLineToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem closeVideoToolStripMenuItem; - private System.Windows.Forms.Label labelSingleLine; - private System.Windows.Forms.Label labelAlternateText; - private System.Windows.Forms.Label labelAlternateCharactersPerSecond; - private System.Windows.Forms.Label labelTextAlternateLineTotal; - private System.Windows.Forms.Label labelAlternateSingleLine; - private System.Windows.Forms.Label labelTextAlternateLineLengths; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator20; - private System.Windows.Forms.ToolStripMenuItem saveOriginalToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem saveOriginalAstoolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem openOriginalToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem removeOriginalToolStripMenuItem; - private System.Windows.Forms.ToolStripSplitButton toolStripSplitButtonPlayRate; - private System.Windows.Forms.ImageList imageListPlayRate; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSetAudioTrack; - private System.Windows.Forms.Button buttonSplitLine; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemChangeFrameRate2; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemCopySourceText; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator21; - private System.Windows.Forms.ToolStripMenuItem editSelectAllToolStripMenuItem; - private System.Windows.Forms.ContextMenuStrip contextMenuStripTextBoxListView; - private System.Windows.Forms.ToolStripMenuItem cutToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem copyToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem pasteToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSplitTextAtCursor; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator18; - private System.Windows.Forms.ToolStripMenuItem selectAllToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator17; - private System.Windows.Forms.ToolStripMenuItem normalToolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem boldToolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem italicToolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem underlineToolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem colorToolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem fontNameToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator22; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemExport; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemExportPngXml; - private System.Windows.Forms.ToolStripMenuItem pointSyncViaOtherSubtitleToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemGoogleMicrosoftTranslateSelLine; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator23; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemMakeEmptyFromCurrent; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator24; - private System.Windows.Forms.ToolStripMenuItem showWaveformAndSpectrogramToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem showOnlyWaveformToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem showOnlySpectrogramToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator26; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInsertUnicodeSymbol; - private System.Windows.Forms.ToolStripMenuItem setStylesForSelectedLinesToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem FindDoubleLinesToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem eBUSTLToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem pACScreenElectronicsToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemCavena890; - private Controls.SETextBox textBoxListViewTextAlternate; - private System.Windows.Forms.ToolStripMenuItem textCharssecToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem plainTextToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem bluraySupToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem vobSubsubidxToolStripMenuItem; - private System.Windows.Forms.Timer timerTextUndo; - private System.Windows.Forms.Timer timerAlternateTextUndo; - private System.Windows.Forms.ToolStripMenuItem adobeEncoreFABImageScriptToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemMergeDialog; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSurroundWithMusicSymbols; - private System.Windows.Forms.ToolStripMenuItem superscriptToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem subscriptToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemImagePerFrame; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemApplyDurationLimits; - private System.Windows.Forms.ToolStripMenuItem generateDatetimeInfoFromVideoToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator25; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemRightToLeftMode; - private System.Windows.Forms.ToolStripMenuItem joinSubtitlesToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemReverseRightToLeftStartEnd; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemExportCapMakerPlus; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemExportCheetahCap; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemExportCaptionInc; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemExportUltech130; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemAssStyles; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSubStationAlpha; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemAlignment; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemRestoreAutoBackup; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemStatistics; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemDCinemaProperties; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemTextTimeCodePair; - private System.Windows.Forms.ToolStripMenuItem textWordsPerMinutewpmToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemTTProperties; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSaveSelectedLines; - private System.Windows.Forms.Button buttonCustomUrl2; - private System.Windows.Forms.ToolStripMenuItem addParagraphAndPasteToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparatorGuessTimeCodes; - private System.Windows.Forms.ToolStripMenuItem guessTimeCodesToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem DvdStudioProStl; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemUndo; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemRedo; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemShowOriginalInPreview; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemPlugins; - private System.Windows.Forms.ToolStripMenuItem seekSilenceToolStripMenuItem; - private System.Windows.Forms.SplitContainer splitContainerListViewAndText; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemColumn; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemColumnDeleteText; - private System.Windows.Forms.ToolStripMenuItem ShiftTextCellsDownToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemPasteSpecial; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemColumnImportText; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInsertTextFromSub; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemOpenKeepVideo; - private System.Windows.Forms.ToolStripMenuItem changeSpeedInPercentToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemAvidStl; - private System.Windows.Forms.ToolStripMenuItem columnDeleteTextOnlyToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemBatchConvert; - private System.Windows.Forms.ToolStripMenuItem copyOriginalTextToCurrentToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemMergeDuplicateText; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSpumux; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemWebVTT; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemWebVttVoice; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemPreview; - private System.Windows.Forms.ToolStripSeparator toolStripSeparatorWebVTT; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemModifySelection; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInverseSelection; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSpellCheckFromCurrentLine; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemImportXSub; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemImportOcrHardSub; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemExportFcpIImage; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemNuendoProperties; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemDost; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemMeasurementConverter; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemImportChapters; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemImportSceneChanges; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemRemoveSceneChanges; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSubtitlesBridgeGaps; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemOpenDvd; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemFcpProperties; - private System.Windows.Forms.ToolStripMenuItem styleToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemFocusTextbox; - private System.Windows.Forms.ToolStripSeparator toolStripSeparatorAscOrDesc; - private System.Windows.Forms.ToolStripMenuItem AscendingToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem descendingToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparatorExportCustomText; - private System.Windows.Forms.ToolStripMenuItem exportCustomTextFormatToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSetLanguage; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInsertUnicodeControlCharacters; - private System.Windows.Forms.ToolStripMenuItem leftToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem righttoleftMarkToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem startOfLefttorightEmbeddingLREToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem startOfRighttoleftEmbeddingRLEToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem startOfLefttorightOverrideLROToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem startOfRighttoleftOverrideRLOToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemRtlUnicodeControlChars; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemRemoveUnicodeControlChars; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemImportImages; - private System.Windows.Forms.ToolStripButton toolStripButtonRemoveTextForHi; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemExportDcinemaInterop; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemMergeLinesWithSameTimeCodes; - private System.Windows.Forms.ToolStripMenuItem checkForUpdatesToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripMenuItemSplitterCheckForUpdates; - private System.Windows.Forms.ToolStripMenuItem setVideoOffsetToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemDvdStudioProProperties; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemEdlClipName; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemAddWaveformBatch; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemExportBdTextSt; - private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabelProgress; - private System.Windows.Forms.ToolStripMenuItem uniPacExportToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemExportAyato; - private System.Windows.Forms.ToolStripButton toolStripButtonFixCommonErrors; - private System.Windows.Forms.ToolStripMenuItem removeSceneChangeToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem addSceneChangeToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem netflixQualityCheckToolStripMenuItem; - private System.Windows.Forms.ToolStripButton toolStripButtonNetflixQualityCheck; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemEdl; - private System.Windows.Forms.ToolStripMenuItem setActorForSelectedLinesToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSetRegion; - private System.Windows.Forms.ToolStripMenuItem insertSubtitleHereToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem actorToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemFcpXmlAdvanced; - private System.Windows.Forms.Label labelNextWord; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemOpenVideoFromUrl; - private System.Windows.Forms.ToolStripMenuItem smpteTimeModedropFrameToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem moveTextUpToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem moveTextDownToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem generateTextFromCurrentVideoToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSplitViaWaveform; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemEbuProperties; - private System.Windows.Forms.ToolStripMenuItem boxToolStripMenuItem; - private System.Windows.Forms.ImageList imageListBookmarks; - private System.Windows.Forms.Panel panelBookmark; - private System.Windows.Forms.Label labelBookmark; - private System.Windows.Forms.PictureBox pictureBoxBookmark; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemTranslateSelected; - private System.Windows.Forms.ToolStripMenuItem googleTranslateToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem microsoftBingTranslateToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemBookmark; - private System.Windows.Forms.ToolStripMenuItem removeAllFormattingsToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem removeBoldToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem removeItalicToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem removeUnderlineToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem removeColorToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem removeFontNameToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem removeAlignmentToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemBouten; - private System.Windows.Forms.ToolStripMenuItem boutendotbeforeToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem boutendotafterToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem boutendotoutsideToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem boutenfilledcircleoutsideToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem boutenopencircleoutsideToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem boutenopendotoutsideToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem boutenfilledsesameoutsideToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem boutenopensesameoutsideToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem boutenautooutsideToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem boutenautoToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemHorizontalDigits; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSetParagraphAsSelection; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemRuby; - private System.Windows.Forms.Label labelSingleLinePixels; - private System.Windows.Forms.Label labelAlternateSingleLinePixels; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; - private System.Windows.Forms.ToolStripMenuItem extendBeforeToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem extendAfterToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem extendToPreviousToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem extendToNextToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator6; - private System.Windows.Forms.ToolStripMenuItem goToPreviousSubtitleStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem goToNextSubtitleStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem dCinemaSMPTE2014ToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem boxToolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemAssaStyles; - private System.Windows.Forms.ToolStripMenuItem openSecondSubtitleToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem aSSStylesToolStripMenuItem; - } +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class Main + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + if (disposing) + { + if (_networkSession != null) + { + _networkSession.Dispose(); + _networkSession = null; + } + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Main)); + TimeCode timeCode4 = new TimeCode(); + TimeCode timeCode5 = new TimeCode(); + TimeCode timeCode6 = new TimeCode(); + this.statusStrip1 = new System.Windows.Forms.StatusStrip(); + this.labelStatus = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStripSelected = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStripStatusLabelProgress = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStripStatusNetworking = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStrip1 = new System.Windows.Forms.ToolStrip(); + this.toolStripButtonFileNew = new System.Windows.Forms.ToolStripButton(); + this.toolStripButtonFileOpen = new System.Windows.Forms.ToolStripButton(); + this.toolStripButtonSave = new System.Windows.Forms.ToolStripButton(); + this.toolStripButtonSaveAs = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparatorFindReplace = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripButtonFind = new System.Windows.Forms.ToolStripButton(); + this.toolStripButtonReplace = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparatorFixSyncSpell = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripButtonFixCommonErrors = new System.Windows.Forms.ToolStripButton(); + this.toolStripButtonRemoveTextForHi = new System.Windows.Forms.ToolStripButton(); + this.toolStripButtonVisualSync = new System.Windows.Forms.ToolStripButton(); + this.toolStripButtonSpellCheck = new System.Windows.Forms.ToolStripButton(); + this.toolStripButtonNetflixQualityCheck = new System.Windows.Forms.ToolStripButton(); + this.toolStripButtonSettings = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparatorHelp = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripButtonHelp = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparatorToggle = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripButtonToggleWaveform = new System.Windows.Forms.ToolStripButton(); + this.toolStripButtonToggleVideo = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparatorSubtitleFormat = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripLabelSubtitleFormat = new System.Windows.Forms.ToolStripLabel(); + this.comboBoxSubtitleFormats = new System.Windows.Forms.ToolStripComboBox(); + this.toolStripSeparatorEncoding = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripLabelEncoding = new System.Windows.Forms.ToolStripLabel(); + this.comboBoxEncoding = new System.Windows.Forms.ToolStripComboBox(); + this.toolStripSeparatorFrameRate = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripLabelFrameRate = new System.Windows.Forms.ToolStripLabel(); + this.toolStripComboBoxFrameRate = new System.Windows.Forms.ToolStripComboBox(); + this.toolStripButtonGetFrameRate = new System.Windows.Forms.ToolStripButton(); + this.menuStrip1 = new System.Windows.Forms.MenuStrip(); + this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemOpenKeepVideo = new System.Windows.Forms.ToolStripMenuItem(); + this.reopenToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemRestoreAutoBackup = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemDCinemaProperties = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemTTProperties = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemNuendoProperties = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemFcpProperties = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemSubStationAlpha = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemAssaStyles = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemEbuProperties = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemDvdStudioProProperties = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator20 = new System.Windows.Forms.ToolStripSeparator(); + this.openOriginalToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.saveOriginalToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.saveOriginalAstoolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.removeOriginalToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItemOpenContainingFolder = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemCompare = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemStatistics = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemPlugins = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItemImportDvdSubtitles = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemSubIdx = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemImportBluRaySup = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemImportXSub = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemImportOcrHardSub = new System.Windows.Forms.ToolStripMenuItem(); + this.matroskaImportStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemManualAnsi = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemImportText = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemImportImages = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemImportTimeCodes = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator22 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItemExport = new System.Windows.Forms.ToolStripMenuItem(); + this.adobeEncoreFABImageScriptToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemAvidStl = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemExportAyato = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemExportPngXml = new System.Windows.Forms.ToolStripMenuItem(); + this.bluraySupToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemExportBdTextSt = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemExportCapMakerPlus = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemExportCaptionInc = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemCavena890 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemExportCheetahCap = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemExportDcinemaInterop = new System.Windows.Forms.ToolStripMenuItem(); + this.dCinemaSMPTE2014ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemDost = new System.Windows.Forms.ToolStripMenuItem(); + this.DvdStudioProStl = new System.Windows.Forms.ToolStripMenuItem(); + this.eBUSTLToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemEdl = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemEdlClipName = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemExportFcpIImage = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemFcpXmlAdvanced = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemImagePerFrame = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemTextTimeCodePair = new System.Windows.Forms.ToolStripMenuItem(); + this.pACScreenElectronicsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.uniPacExportToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.plainTextToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemSpumux = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemExportUltech130 = new System.Windows.Forms.ToolStripMenuItem(); + this.vobSubsubidxToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparatorExportCustomText = new System.Windows.Forms.ToolStripSeparator(); + this.exportCustomTextFormatToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator(); + this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemUndo = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemRedo = new System.Windows.Forms.ToolStripMenuItem(); + this.showHistoryforUndoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator14 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItemInsertUnicodeCharacter = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparatorInsertUnicodeCharacter = new System.Windows.Forms.ToolStripSeparator(); + this.findToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.findNextToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.replaceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.multipleReplaceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.gotoLineNumberToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemShowOriginalInPreview = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator25 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItemRightToLeftMode = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemRtlUnicodeControlChars = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemRemoveUnicodeControlChars = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemReverseRightToLeftStartEnd = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator21 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItemModifySelection = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemInverseSelection = new System.Windows.Forms.ToolStripMenuItem(); + this.editSelectAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.adjustDisplayTimeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemApplyDurationLimits = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemSubtitlesBridgeGaps = new System.Windows.Forms.ToolStripMenuItem(); + this.setMinimumDisplayTimeBetweenParagraphsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.fixToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.startNumberingFromToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.removeTextForHearImpairedToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ChangeCasingToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemAutoMergeShortLines = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemMergeDuplicateText = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemMergeLinesWithSameTimeCodes = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemAutoSplitLongLines = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemSortBy = new System.Windows.Forms.ToolStripMenuItem(); + this.sortNumberToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.sortStartTimeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.sortEndTimeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.sortDisplayTimeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.sortTextAlphabeticallytoolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.sortTextMaxLineLengthToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.sortTextTotalLengthToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.sortTextNumberOfLinesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.textCharssecToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.textWordsPerMinutewpmToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.actorToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.styleToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparatorAscOrDesc = new System.Windows.Forms.ToolStripSeparator(); + this.AscendingToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.descendingToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.netflixQualityCheckToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator23 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItemMakeEmptyFromCurrent = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemBatchConvert = new System.Windows.Forms.ToolStripMenuItem(); + this.generateDatetimeInfoFromVideoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemMeasurementConverter = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.splitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.appendTextVisuallyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.joinSubtitlesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemSpellCheckMain = new System.Windows.Forms.ToolStripMenuItem(); + this.spellCheckToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemSpellCheckFromCurrentLine = new System.Windows.Forms.ToolStripMenuItem(); + this.findDoubleWordsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.FindDoubleLinesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator(); + this.GetDictionariesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.addWordToNameListToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemVideo = new System.Windows.Forms.ToolStripMenuItem(); + this.openVideoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemOpenVideoFromUrl = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemOpenDvd = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemSetAudioTrack = new System.Windows.Forms.ToolStripMenuItem(); + this.closeVideoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.openSecondSubtitleToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.setVideoOffsetToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.smpteTimeModedropFrameToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemImportChapters = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemImportSceneChanges = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemRemoveSceneChanges = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemAddWaveformBatch = new System.Windows.Forms.ToolStripMenuItem(); + this.generateTextFromCurrentVideoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); + this.showhideWaveformToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.showhideVideoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator19 = new System.Windows.Forms.ToolStripSeparator(); + this.undockVideoControlsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.redockVideoControlsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemSynchronization = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemAdjustAllTimes = new System.Windows.Forms.ToolStripMenuItem(); + this.visualSyncToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemPointSync = new System.Windows.Forms.ToolStripMenuItem(); + this.pointSyncViaOtherSubtitleToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemChangeFrameRate2 = new System.Windows.Forms.ToolStripMenuItem(); + this.changeSpeedInPercentToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemAutoTranslate = new System.Windows.Forms.ToolStripMenuItem(); + this.translatepoweredByMicrosoftToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.translateByGoogleToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.translateFromSwedishToDanishToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.optionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.settingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.changeLanguageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemNetworking = new System.Windows.Forms.ToolStripMenuItem(); + this.startServerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.joinSessionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.chatToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.showSessionKeyLogToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.leaveSessionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.checkForUpdatesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemSplitterCheckForUpdates = new System.Windows.Forms.ToolStripSeparator(); + this.helpToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.contextMenuStripListview = new System.Windows.Forms.ContextMenuStrip(this.components); + this.setStylesForSelectedLinesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.setActorForSelectedLinesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemAssStyles = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemSetRegion = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemSetLanguage = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemWebVTT = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemPreview = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemDelete = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemInsertBefore = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemInsertAfter = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemInsertSubtitle = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemCopySourceText = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemColumn = new System.Windows.Forms.ToolStripMenuItem(); + this.columnDeleteTextOnlyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemColumnDeleteText = new System.Windows.Forms.ToolStripMenuItem(); + this.ShiftTextCellsDownToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemInsertTextFromSub = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemColumnImportText = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemPasteSpecial = new System.Windows.Forms.ToolStripMenuItem(); + this.copyOriginalTextToCurrentToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.moveTextUpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.moveTextDownToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemBookmark = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); + this.splitLineToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemMergeLines = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemMergeDialog = new System.Windows.Forms.ToolStripMenuItem(); + this.mergeBeforeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.mergeAfterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); + this.extendBeforeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.extendAfterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator(); + this.removeFormattinglToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.removeAllFormattingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.removeBoldToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.removeItalicToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.removeUnderlineToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.removeColorToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.removeFontNameToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.removeAlignmentToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.boldToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.italicToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.boxToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.underlineToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.colorToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemFont = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemAlignment = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemSurroundWithMusicSymbols = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItemAutoBreakLines = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemUnbreakLines = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparatorBreakLines = new System.Windows.Forms.ToolStripSeparator(); + this.typeEffectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.karokeeEffectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparatorAdvancedFunctions = new System.Windows.Forms.ToolStripSeparator(); + this.showSelectedLinesEarlierlaterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.visualSyncSelectedLinesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemGoogleMicrosoftTranslateSelLine = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemTranslateSelected = new System.Windows.Forms.ToolStripMenuItem(); + this.googleTranslateToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.microsoftBingTranslateToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.adjustDisplayTimeForSelectedLinesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.fixCommonErrorsInSelectedLinesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.changeCasingForSelectedLinesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemSaveSelectedLines = new System.Windows.Forms.ToolStripMenuItem(); + this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); + this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.colorDialog1 = new System.Windows.Forms.ColorDialog(); + this.groupBoxVideo = new System.Windows.Forms.GroupBox(); + this.labelNextWord = new System.Windows.Forms.Label(); + this.audioVisualizer = new Nikse.SubtitleEdit.Controls.AudioVisualizer(); + this.checkBoxSyncListViewWithVideoWhilePlaying = new System.Windows.Forms.CheckBox(); + this.labelVideoInfo = new System.Windows.Forms.Label(); + this.trackBarWaveformPosition = new System.Windows.Forms.TrackBar(); + this.panelWaveformControls = new System.Windows.Forms.Panel(); + this.toolStripWaveControls = new System.Windows.Forms.ToolStrip(); + this.toolStripButtonWaveformZoomOut = new System.Windows.Forms.ToolStripButton(); + this.toolStripComboBoxWaveform = new System.Windows.Forms.ToolStripComboBox(); + this.toolStripButtonWaveformZoomIn = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator16 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripButtonWaveformPause = new System.Windows.Forms.ToolStripButton(); + this.toolStripButtonWaveformPlay = new System.Windows.Forms.ToolStripButton(); + this.toolStripButtonLockCenter = new System.Windows.Forms.ToolStripButton(); + this.toolStripSplitButtonPlayRate = new System.Windows.Forms.ToolStripSplitButton(); + this.tabControlButtons = new System.Windows.Forms.TabControl(); + this.tabPageTranslate = new System.Windows.Forms.TabPage(); + this.labelTranslateTip = new System.Windows.Forms.Label(); + this.groupBoxTranslateSearch = new System.Windows.Forms.GroupBox(); + this.buttonCustomUrl2 = new System.Windows.Forms.Button(); + this.buttonCustomUrl1 = new System.Windows.Forms.Button(); + this.buttonGoogleTranslateIt = new System.Windows.Forms.Button(); + this.buttonGoogleIt = new System.Windows.Forms.Button(); + this.textBoxSearchWord = new System.Windows.Forms.TextBox(); + this.groupBoxAutoContinue = new System.Windows.Forms.GroupBox(); + this.comboBoxAutoContinue = new System.Windows.Forms.ComboBox(); + this.labelAutoContinueDelay = new System.Windows.Forms.Label(); + this.checkBoxAutoContinue = new System.Windows.Forms.CheckBox(); + this.buttonStop = new System.Windows.Forms.Button(); + this.groupBoxAutoRepeat = new System.Windows.Forms.GroupBox(); + this.comboBoxAutoRepeat = new System.Windows.Forms.ComboBox(); + this.labelAutoRepeatCount = new System.Windows.Forms.Label(); + this.checkBoxAutoRepeatOn = new System.Windows.Forms.CheckBox(); + this.buttonPlayPrevious = new System.Windows.Forms.Button(); + this.buttonPlayCurrent = new System.Windows.Forms.Button(); + this.buttonPlayNext = new System.Windows.Forms.Button(); + this.tabPageCreate = new System.Windows.Forms.TabPage(); + this.timeUpDownVideoPosition = new Nikse.SubtitleEdit.Controls.TimeUpDown(); + this.buttonGotoSub = new System.Windows.Forms.Button(); + this.buttonBeforeText = new System.Windows.Forms.Button(); + this.buttonSetEnd = new System.Windows.Forms.Button(); + this.buttonInsertNewText = new System.Windows.Forms.Button(); + this.buttonSetStartTime = new System.Windows.Forms.Button(); + this.labelCreateF12 = new System.Windows.Forms.Label(); + this.labelCreateF11 = new System.Windows.Forms.Label(); + this.labelCreateF10 = new System.Windows.Forms.Label(); + this.labelCreateF9 = new System.Windows.Forms.Label(); + this.buttonForward2 = new System.Windows.Forms.Button(); + this.numericUpDownSec2 = new System.Windows.Forms.NumericUpDown(); + this.buttonSecBack2 = new System.Windows.Forms.Button(); + this.buttonForward1 = new System.Windows.Forms.Button(); + this.numericUpDownSec1 = new System.Windows.Forms.NumericUpDown(); + this.labelVideoPosition = new System.Windows.Forms.Label(); + this.buttonSecBack1 = new System.Windows.Forms.Button(); + this.tabPageAdjust = new System.Windows.Forms.TabPage(); + this.timeUpDownVideoPositionAdjust = new Nikse.SubtitleEdit.Controls.TimeUpDown(); + this.buttonAdjustSetEndTime = new System.Windows.Forms.Button(); + this.buttonSetEndAndGoToNext = new System.Windows.Forms.Button(); + this.buttonSetStartAndOffsetRest = new System.Windows.Forms.Button(); + this.buttonAdjustSetStartTime = new System.Windows.Forms.Button(); + this.labelAdjustF12 = new System.Windows.Forms.Label(); + this.labelAdjustF11 = new System.Windows.Forms.Label(); + this.labelAdjustF10 = new System.Windows.Forms.Label(); + this.labelAdjustF9 = new System.Windows.Forms.Label(); + this.buttonAdjustSecForward2 = new System.Windows.Forms.Button(); + this.numericUpDownSecAdjust2 = new System.Windows.Forms.NumericUpDown(); + this.buttonAdjustSecBack2 = new System.Windows.Forms.Button(); + this.buttonAdjustSecForward1 = new System.Windows.Forms.Button(); + this.numericUpDownSecAdjust1 = new System.Windows.Forms.NumericUpDown(); + this.buttonAdjustSecBack1 = new System.Windows.Forms.Button(); + this.labelVideoPosition2 = new System.Windows.Forms.Label(); + this.buttonAdjustGoToPosAndPause = new System.Windows.Forms.Button(); + this.buttonAdjustPlayBefore = new System.Windows.Forms.Button(); + this.ShowSubtitleTimer = new System.Windows.Forms.Timer(this.components); + this.timerAutoDuration = new System.Windows.Forms.Timer(this.components); + this.timerAutoContinue = new System.Windows.Forms.Timer(this.components); + this.timerStillTyping = new System.Windows.Forms.Timer(this.components); + this.timerWaveform = new System.Windows.Forms.Timer(this.components); + this.contextMenuStripWaveform = new System.Windows.Forms.ContextMenuStrip(this.components); + this.addParagraphHereToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.addParagraphAndPasteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemSetParagraphAsSelection = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemFocusTextbox = new System.Windows.Forms.ToolStripMenuItem(); + this.goToPreviousSubtitleStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.goToNextSubtitleStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.deleteParagraphToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.splitToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.mergeWithPreviousToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.mergeWithNextToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator(); + this.extendToPreviousToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.extendToNextToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItemWaveformPlaySelection = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator24 = new System.Windows.Forms.ToolStripSeparator(); + this.showWaveformAndSpectrogramToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.showOnlyWaveformToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.showOnlySpectrogramToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparatorGuessTimeCodes = new System.Windows.Forms.ToolStripSeparator(); + this.removeSceneChangeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.addSceneChangeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.guessTimeCodesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.seekSilenceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.insertSubtitleHereToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.splitContainerMain = new System.Windows.Forms.SplitContainer(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.tabControlSubtitle = new System.Windows.Forms.TabControl(); + this.tabPage1 = new System.Windows.Forms.TabPage(); + this.splitContainerListViewAndText = new System.Windows.Forms.SplitContainer(); + this.SubtitleListview1 = new Nikse.SubtitleEdit.Controls.SubtitleListView(); + this.imageListBookmarks = new System.Windows.Forms.ImageList(this.components); + this.groupBoxEdit = new System.Windows.Forms.GroupBox(); + this.labelAlternateSingleLinePixels = new System.Windows.Forms.Label(); + this.labelSingleLinePixels = new System.Windows.Forms.Label(); + this.panelBookmark = new System.Windows.Forms.Panel(); + this.labelBookmark = new System.Windows.Forms.Label(); + this.pictureBoxBookmark = new System.Windows.Forms.PictureBox(); + this.labelSingleLine = new System.Windows.Forms.Label(); + this.labelAlternateSingleLine = new System.Windows.Forms.Label(); + this.labelDurationWarning = new System.Windows.Forms.Label(); + this.labelStartTimeWarning = new System.Windows.Forms.Label(); + this.buttonSplitLine = new System.Windows.Forms.Button(); + this.labelAlternateCharactersPerSecond = new System.Windows.Forms.Label(); + this.labelTextAlternateLineTotal = new System.Windows.Forms.Label(); + this.labelTextAlternateLineLengths = new System.Windows.Forms.Label(); + this.labelAlternateText = new System.Windows.Forms.Label(); + this.labelText = new System.Windows.Forms.Label(); + this.textBoxListViewTextAlternate = new Nikse.SubtitleEdit.Controls.SETextBox(); + this.contextMenuStripTextBoxListView = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItemWebVttVoice = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparatorWebVTT = new System.Windows.Forms.ToolStripSeparator(); + this.cutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.copyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.pasteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemSplitTextAtCursor = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemSplitViaWaveform = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator18 = new System.Windows.Forms.ToolStripSeparator(); + this.selectAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator17 = new System.Windows.Forms.ToolStripSeparator(); + this.normalToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.boldToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.italicToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.boxToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.underlineToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.colorToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemHorizontalDigits = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemBouten = new System.Windows.Forms.ToolStripMenuItem(); + this.boutendotbeforeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.boutendotafterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.boutendotoutsideToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.boutenfilledcircleoutsideToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.boutenopencircleoutsideToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.boutenopendotoutsideToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.boutenfilledsesameoutsideToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.boutenopensesameoutsideToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.boutenautooutsideToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.boutenautoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemRuby = new System.Windows.Forms.ToolStripMenuItem(); + this.fontNameToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator26 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItemInsertUnicodeSymbol = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemInsertUnicodeControlCharacters = new System.Windows.Forms.ToolStripMenuItem(); + this.leftToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.righttoleftMarkToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.startOfLefttorightEmbeddingLREToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.startOfRighttoleftEmbeddingRLEToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.startOfLefttorightOverrideLROToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.startOfRighttoleftOverrideRLOToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.superscriptToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.subscriptToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.buttonAutoBreak = new System.Windows.Forms.Button(); + this.labelTextLineLengths = new System.Windows.Forms.Label(); + this.labelTextLineTotal = new System.Windows.Forms.Label(); + this.labelCharactersPerSecond = new System.Windows.Forms.Label(); + this.buttonUnBreak = new System.Windows.Forms.Button(); + this.timeUpDownStartTime = new Nikse.SubtitleEdit.Controls.TimeUpDown(); + this.numericUpDownDuration = new System.Windows.Forms.NumericUpDown(); + this.buttonPrevious = new System.Windows.Forms.Button(); + this.buttonNext = new System.Windows.Forms.Button(); + this.labelStartTime = new System.Windows.Forms.Label(); + this.textBoxListViewText = new Nikse.SubtitleEdit.Controls.SETextBox(); + this.labelDuration = new System.Windows.Forms.Label(); + this.labelAutoDuration = new System.Windows.Forms.Label(); + this.tabPage2 = new System.Windows.Forms.TabPage(); + this.textBoxSource = new System.Windows.Forms.TextBox(); + this.panelVideoPlayer = new System.Windows.Forms.Panel(); + this.mediaPlayer = new Nikse.SubtitleEdit.Controls.VideoPlayerContainer(); + this.contextMenuStripEmpty = new System.Windows.Forms.ContextMenuStrip(this.components); + this.insertLineToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.imageListPlayRate = new System.Windows.Forms.ImageList(this.components); + this.timerTextUndo = new System.Windows.Forms.Timer(this.components); + this.timerAlternateTextUndo = new System.Windows.Forms.Timer(this.components); + this.aSSStylesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.statusStrip1.SuspendLayout(); + this.toolStrip1.SuspendLayout(); + this.menuStrip1.SuspendLayout(); + this.contextMenuStripListview.SuspendLayout(); + this.groupBoxVideo.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.trackBarWaveformPosition)).BeginInit(); + this.panelWaveformControls.SuspendLayout(); + this.toolStripWaveControls.SuspendLayout(); + this.tabControlButtons.SuspendLayout(); + this.tabPageTranslate.SuspendLayout(); + this.groupBoxTranslateSearch.SuspendLayout(); + this.groupBoxAutoContinue.SuspendLayout(); + this.groupBoxAutoRepeat.SuspendLayout(); + this.tabPageCreate.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSec2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSec1)).BeginInit(); + this.tabPageAdjust.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSecAdjust2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSecAdjust1)).BeginInit(); + this.contextMenuStripWaveform.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainerMain)).BeginInit(); + this.splitContainerMain.Panel1.SuspendLayout(); + this.splitContainerMain.Panel2.SuspendLayout(); + this.splitContainerMain.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.tabControlSubtitle.SuspendLayout(); + this.tabPage1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainerListViewAndText)).BeginInit(); + this.splitContainerListViewAndText.Panel1.SuspendLayout(); + this.splitContainerListViewAndText.Panel2.SuspendLayout(); + this.splitContainerListViewAndText.SuspendLayout(); + this.groupBoxEdit.SuspendLayout(); + this.panelBookmark.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxBookmark)).BeginInit(); + this.contextMenuStripTextBoxListView.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDuration)).BeginInit(); + this.tabPage2.SuspendLayout(); + this.panelVideoPlayer.SuspendLayout(); + this.contextMenuStripEmpty.SuspendLayout(); + this.SuspendLayout(); + // + // statusStrip1 + // + this.statusStrip1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.labelStatus, + this.toolStripSelected, + this.toolStripStatusLabelProgress, + this.toolStripStatusNetworking}); + this.statusStrip1.Location = new System.Drawing.Point(0, 624); + this.statusStrip1.Name = "statusStrip1"; + this.statusStrip1.Size = new System.Drawing.Size(975, 22); + this.statusStrip1.TabIndex = 4; + this.statusStrip1.Text = "statusStrip1"; + // + // labelStatus + // + this.labelStatus.Name = "labelStatus"; + this.labelStatus.Size = new System.Drawing.Size(0, 17); + this.labelStatus.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.labelStatus.Click += new System.EventHandler(this.labelStatus_Click); + // + // toolStripSelected + // + this.toolStripSelected.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.toolStripSelected.Name = "toolStripSelected"; + this.toolStripSelected.Size = new System.Drawing.Size(746, 17); + this.toolStripSelected.Spring = true; + this.toolStripSelected.Text = "toolStripSelected"; + this.toolStripSelected.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.toolStripSelected.Click += new System.EventHandler(this.toolStripSelected_Click); + // + // toolStripStatusLabelProgress + // + this.toolStripStatusLabelProgress.Name = "toolStripStatusLabelProgress"; + this.toolStripStatusLabelProgress.Size = new System.Drawing.Size(166, 17); + this.toolStripStatusLabelProgress.Text = "toolStripStatusLabelProgress"; + this.toolStripStatusLabelProgress.Visible = false; + // + // toolStripStatusNetworking + // + this.toolStripStatusNetworking.Image = global::Nikse.SubtitleEdit.Properties.Resources.connect; + this.toolStripStatusNetworking.Name = "toolStripStatusNetworking"; + this.toolStripStatusNetworking.Padding = new System.Windows.Forms.Padding(50, 0, 0, 0); + this.toolStripStatusNetworking.Size = new System.Drawing.Size(214, 17); + this.toolStripStatusNetworking.Text = "toolStripStatusNetworking"; + this.toolStripStatusNetworking.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.toolStripStatusNetworking.TextImageRelation = System.Windows.Forms.TextImageRelation.TextBeforeImage; + this.toolStripStatusNetworking.Click += new System.EventHandler(this.toolStripStatusNetworking_Click); + // + // toolStrip1 + // + this.toolStrip1.AutoSize = false; + this.toolStrip1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.toolStrip1.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; + this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripButtonFileNew, + this.toolStripButtonFileOpen, + this.toolStripButtonSave, + this.toolStripButtonSaveAs, + this.toolStripSeparatorFindReplace, + this.toolStripButtonFind, + this.toolStripButtonReplace, + this.toolStripSeparatorFixSyncSpell, + this.toolStripButtonFixCommonErrors, + this.toolStripButtonRemoveTextForHi, + this.toolStripButtonVisualSync, + this.toolStripButtonSpellCheck, + this.toolStripButtonNetflixQualityCheck, + this.toolStripButtonSettings, + this.toolStripSeparatorHelp, + this.toolStripButtonHelp, + this.toolStripSeparatorToggle, + this.toolStripButtonToggleWaveform, + this.toolStripButtonToggleVideo, + this.toolStripSeparatorSubtitleFormat, + this.toolStripLabelSubtitleFormat, + this.comboBoxSubtitleFormats, + this.toolStripSeparatorEncoding, + this.toolStripLabelEncoding, + this.comboBoxEncoding, + this.toolStripSeparatorFrameRate, + this.toolStripLabelFrameRate, + this.toolStripComboBoxFrameRate, + this.toolStripButtonGetFrameRate}); + this.toolStrip1.Location = new System.Drawing.Point(0, 24); + this.toolStrip1.Name = "toolStrip1"; + this.toolStrip1.Size = new System.Drawing.Size(975, 40); + this.toolStrip1.TabIndex = 5; + this.toolStrip1.Text = "toolStrip1"; + // + // toolStripButtonFileNew + // + this.toolStripButtonFileNew.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButtonFileNew.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.toolStripButtonFileNew.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonFileNew.Image"))); + this.toolStripButtonFileNew.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.toolStripButtonFileNew.ImageTransparentColor = System.Drawing.Color.Transparent; + this.toolStripButtonFileNew.Name = "toolStripButtonFileNew"; + this.toolStripButtonFileNew.Size = new System.Drawing.Size(36, 37); + this.toolStripButtonFileNew.Text = "New"; + this.toolStripButtonFileNew.ToolTipText = "New"; + this.toolStripButtonFileNew.Click += new System.EventHandler(this.ToolStripButtonFileNewClick); + // + // toolStripButtonFileOpen + // + this.toolStripButtonFileOpen.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButtonFileOpen.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.toolStripButtonFileOpen.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonFileOpen.Image"))); + this.toolStripButtonFileOpen.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.toolStripButtonFileOpen.ImageTransparentColor = System.Drawing.Color.Transparent; + this.toolStripButtonFileOpen.Name = "toolStripButtonFileOpen"; + this.toolStripButtonFileOpen.Size = new System.Drawing.Size(36, 37); + this.toolStripButtonFileOpen.Text = "toolStripButtonOpen"; + this.toolStripButtonFileOpen.ToolTipText = "Open"; + this.toolStripButtonFileOpen.Click += new System.EventHandler(this.ToolStripButtonFileOpenClick); + // + // toolStripButtonSave + // + this.toolStripButtonSave.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButtonSave.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.toolStripButtonSave.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonSave.Image"))); + this.toolStripButtonSave.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.toolStripButtonSave.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButtonSave.Name = "toolStripButtonSave"; + this.toolStripButtonSave.Size = new System.Drawing.Size(36, 37); + this.toolStripButtonSave.Text = "toolStripButtonSave"; + this.toolStripButtonSave.ToolTipText = "Save"; + this.toolStripButtonSave.Click += new System.EventHandler(this.ToolStripButtonSaveClick); + // + // toolStripButtonSaveAs + // + this.toolStripButtonSaveAs.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButtonSaveAs.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.toolStripButtonSaveAs.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonSaveAs.Image"))); + this.toolStripButtonSaveAs.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.toolStripButtonSaveAs.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButtonSaveAs.Name = "toolStripButtonSaveAs"; + this.toolStripButtonSaveAs.Size = new System.Drawing.Size(36, 37); + this.toolStripButtonSaveAs.Text = "toolStripButtonSaveAs"; + this.toolStripButtonSaveAs.ToolTipText = "Save as"; + this.toolStripButtonSaveAs.Click += new System.EventHandler(this.ToolStripButtonSaveAsClick); + // + // toolStripSeparatorFindReplace + // + this.toolStripSeparatorFindReplace.Name = "toolStripSeparatorFindReplace"; + this.toolStripSeparatorFindReplace.Size = new System.Drawing.Size(6, 40); + // + // toolStripButtonFind + // + this.toolStripButtonFind.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButtonFind.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.toolStripButtonFind.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonFind.Image"))); + this.toolStripButtonFind.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.toolStripButtonFind.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButtonFind.Name = "toolStripButtonFind"; + this.toolStripButtonFind.Size = new System.Drawing.Size(36, 37); + this.toolStripButtonFind.Text = "Find"; + this.toolStripButtonFind.Click += new System.EventHandler(this.ToolStripButtonFindClick); + // + // toolStripButtonReplace + // + this.toolStripButtonReplace.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButtonReplace.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.toolStripButtonReplace.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonReplace.Image"))); + this.toolStripButtonReplace.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.toolStripButtonReplace.ImageTransparentColor = System.Drawing.Color.White; + this.toolStripButtonReplace.Name = "toolStripButtonReplace"; + this.toolStripButtonReplace.Size = new System.Drawing.Size(36, 37); + this.toolStripButtonReplace.Text = "Replace"; + this.toolStripButtonReplace.ToolTipText = "Replace"; + this.toolStripButtonReplace.Click += new System.EventHandler(this.ToolStripButtonReplaceClick); + // + // toolStripSeparatorFixSyncSpell + // + this.toolStripSeparatorFixSyncSpell.Name = "toolStripSeparatorFixSyncSpell"; + this.toolStripSeparatorFixSyncSpell.Size = new System.Drawing.Size(6, 40); + // + // toolStripButtonFixCommonErrors + // + this.toolStripButtonFixCommonErrors.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButtonFixCommonErrors.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.toolStripButtonFixCommonErrors.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonFixCommonErrors.Image"))); + this.toolStripButtonFixCommonErrors.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.toolStripButtonFixCommonErrors.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButtonFixCommonErrors.Name = "toolStripButtonFixCommonErrors"; + this.toolStripButtonFixCommonErrors.Size = new System.Drawing.Size(36, 37); + this.toolStripButtonFixCommonErrors.Text = "Fix common errors"; + this.toolStripButtonFixCommonErrors.ToolTipText = "Fix common errors"; + this.toolStripButtonFixCommonErrors.Click += new System.EventHandler(this.toolStripButtonFixCommonErrors_Click); + // + // toolStripButtonRemoveTextForHi + // + this.toolStripButtonRemoveTextForHi.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButtonRemoveTextForHi.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.toolStripButtonRemoveTextForHi.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonRemoveTextForHi.Image"))); + this.toolStripButtonRemoveTextForHi.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.toolStripButtonRemoveTextForHi.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButtonRemoveTextForHi.Name = "toolStripButtonRemoveTextForHi"; + this.toolStripButtonRemoveTextForHi.Size = new System.Drawing.Size(36, 37); + this.toolStripButtonRemoveTextForHi.Text = "Remove text for HI"; + this.toolStripButtonRemoveTextForHi.ToolTipText = "Fix common errors"; + this.toolStripButtonRemoveTextForHi.Click += new System.EventHandler(this.toolStripButtonRemoveTextForHi_Click); + // + // toolStripButtonVisualSync + // + this.toolStripButtonVisualSync.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButtonVisualSync.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.toolStripButtonVisualSync.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonVisualSync.Image"))); + this.toolStripButtonVisualSync.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.toolStripButtonVisualSync.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButtonVisualSync.Name = "toolStripButtonVisualSync"; + this.toolStripButtonVisualSync.Size = new System.Drawing.Size(36, 37); + this.toolStripButtonVisualSync.Text = "Visual sync"; + this.toolStripButtonVisualSync.Click += new System.EventHandler(this.ToolStripButtonVisualSyncClick); + // + // toolStripButtonSpellCheck + // + this.toolStripButtonSpellCheck.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButtonSpellCheck.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F); + this.toolStripButtonSpellCheck.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonSpellCheck.Image"))); + this.toolStripButtonSpellCheck.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.toolStripButtonSpellCheck.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButtonSpellCheck.Name = "toolStripButtonSpellCheck"; + this.toolStripButtonSpellCheck.Size = new System.Drawing.Size(36, 37); + this.toolStripButtonSpellCheck.Text = "Spell check"; + this.toolStripButtonSpellCheck.Click += new System.EventHandler(this.ToolStripButtonSpellCheckClick); + // + // toolStripButtonNetflixQualityCheck + // + this.toolStripButtonNetflixQualityCheck.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButtonNetflixQualityCheck.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonNetflixQualityCheck.Image"))); + this.toolStripButtonNetflixQualityCheck.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.toolStripButtonNetflixQualityCheck.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButtonNetflixQualityCheck.Name = "toolStripButtonNetflixQualityCheck"; + this.toolStripButtonNetflixQualityCheck.Size = new System.Drawing.Size(36, 37); + this.toolStripButtonNetflixQualityCheck.Text = "Netflix quality check"; + this.toolStripButtonNetflixQualityCheck.Click += new System.EventHandler(this.toolStripButtonNetflixGlyphCheck_Click); + // + // toolStripButtonSettings + // + this.toolStripButtonSettings.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButtonSettings.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F); + this.toolStripButtonSettings.Image = global::Nikse.SubtitleEdit.Properties.Resources.Settings; + this.toolStripButtonSettings.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.toolStripButtonSettings.ImageTransparentColor = System.Drawing.Color.Transparent; + this.toolStripButtonSettings.Name = "toolStripButtonSettings"; + this.toolStripButtonSettings.Size = new System.Drawing.Size(36, 37); + this.toolStripButtonSettings.Text = "Settings"; + this.toolStripButtonSettings.Click += new System.EventHandler(this.ToolStripButtonSettingsClick); + // + // toolStripSeparatorHelp + // + this.toolStripSeparatorHelp.Name = "toolStripSeparatorHelp"; + this.toolStripSeparatorHelp.Size = new System.Drawing.Size(6, 40); + // + // toolStripButtonHelp + // + this.toolStripButtonHelp.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButtonHelp.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F); + this.toolStripButtonHelp.Image = global::Nikse.SubtitleEdit.Properties.Resources.Help; + this.toolStripButtonHelp.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.toolStripButtonHelp.ImageTransparentColor = System.Drawing.Color.Transparent; + this.toolStripButtonHelp.Name = "toolStripButtonHelp"; + this.toolStripButtonHelp.Size = new System.Drawing.Size(36, 37); + this.toolStripButtonHelp.Text = "Help"; + this.toolStripButtonHelp.Click += new System.EventHandler(this.ToolStripButtonHelpClick); + // + // toolStripSeparatorToggle + // + this.toolStripSeparatorToggle.Name = "toolStripSeparatorToggle"; + this.toolStripSeparatorToggle.Size = new System.Drawing.Size(6, 40); + // + // toolStripButtonToggleWaveform + // + this.toolStripButtonToggleWaveform.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButtonToggleWaveform.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F); + this.toolStripButtonToggleWaveform.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonToggleWaveform.Image"))); + this.toolStripButtonToggleWaveform.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.toolStripButtonToggleWaveform.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButtonToggleWaveform.Name = "toolStripButtonToggleWaveform"; + this.toolStripButtonToggleWaveform.Size = new System.Drawing.Size(36, 37); + this.toolStripButtonToggleWaveform.Text = "Show/hide waveform"; + this.toolStripButtonToggleWaveform.Click += new System.EventHandler(this.toolStripButtonToggleWaveform_Click); + // + // toolStripButtonToggleVideo + // + this.toolStripButtonToggleVideo.Checked = true; + this.toolStripButtonToggleVideo.CheckState = System.Windows.Forms.CheckState.Checked; + this.toolStripButtonToggleVideo.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButtonToggleVideo.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F); + this.toolStripButtonToggleVideo.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonToggleVideo.Image"))); + this.toolStripButtonToggleVideo.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.toolStripButtonToggleVideo.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButtonToggleVideo.Name = "toolStripButtonToggleVideo"; + this.toolStripButtonToggleVideo.Size = new System.Drawing.Size(36, 37); + this.toolStripButtonToggleVideo.Text = "Show/hide video"; + this.toolStripButtonToggleVideo.Click += new System.EventHandler(this.toolStripButtonToggleVideo_Click); + // + // toolStripSeparatorSubtitleFormat + // + this.toolStripSeparatorSubtitleFormat.Name = "toolStripSeparatorSubtitleFormat"; + this.toolStripSeparatorSubtitleFormat.Size = new System.Drawing.Size(6, 40); + // + // toolStripLabelSubtitleFormat + // + this.toolStripLabelSubtitleFormat.Name = "toolStripLabelSubtitleFormat"; + this.toolStripLabelSubtitleFormat.Size = new System.Drawing.Size(86, 37); + this.toolStripLabelSubtitleFormat.Text = "Subtitle format"; + // + // comboBoxSubtitleFormats + // + this.comboBoxSubtitleFormats.DropDownHeight = 215; + this.comboBoxSubtitleFormats.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxSubtitleFormats.FlatStyle = System.Windows.Forms.FlatStyle.Standard; + this.comboBoxSubtitleFormats.IntegralHeight = false; + this.comboBoxSubtitleFormats.Name = "comboBoxSubtitleFormats"; + this.comboBoxSubtitleFormats.Size = new System.Drawing.Size(150, 40); + this.comboBoxSubtitleFormats.DropDown += new System.EventHandler(this.comboBoxSubtitleFormats_DropDown); + this.comboBoxSubtitleFormats.DropDownClosed += new System.EventHandler(this.comboBoxSubtitleFormats_DropDownClosed); + this.comboBoxSubtitleFormats.SelectedIndexChanged += new System.EventHandler(this.ComboBoxSubtitleFormatsSelectedIndexChanged); + this.comboBoxSubtitleFormats.Enter += new System.EventHandler(this.ComboBoxSubtitleFormatsEnter); + // + // toolStripSeparatorEncoding + // + this.toolStripSeparatorEncoding.Name = "toolStripSeparatorEncoding"; + this.toolStripSeparatorEncoding.Size = new System.Drawing.Size(6, 40); + // + // toolStripLabelEncoding + // + this.toolStripLabelEncoding.Name = "toolStripLabelEncoding"; + this.toolStripLabelEncoding.Size = new System.Drawing.Size(81, 37); + this.toolStripLabelEncoding.Text = "File encoding"; + // + // comboBoxEncoding + // + this.comboBoxEncoding.DropDownHeight = 215; + this.comboBoxEncoding.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxEncoding.FlatStyle = System.Windows.Forms.FlatStyle.Standard; + this.comboBoxEncoding.IntegralHeight = false; + this.comboBoxEncoding.Items.AddRange(new object[] { + "ANSI", + "UTF-7", + "UTF-8", + "Unicode", + "Unicode (big endian)"}); + this.comboBoxEncoding.Name = "comboBoxEncoding"; + this.comboBoxEncoding.Size = new System.Drawing.Size(129, 23); + this.comboBoxEncoding.DropDown += new System.EventHandler(this.MenuOpened); + this.comboBoxEncoding.DropDownClosed += new System.EventHandler(this.MenuClosed); + // + // toolStripSeparatorFrameRate + // + this.toolStripSeparatorFrameRate.Name = "toolStripSeparatorFrameRate"; + this.toolStripSeparatorFrameRate.Size = new System.Drawing.Size(6, 40); + // + // toolStripLabelFrameRate + // + this.toolStripLabelFrameRate.Name = "toolStripLabelFrameRate"; + this.toolStripLabelFrameRate.Size = new System.Drawing.Size(67, 15); + this.toolStripLabelFrameRate.Text = "Frame rate"; + // + // toolStripComboBoxFrameRate + // + this.toolStripComboBoxFrameRate.DropDownWidth = 75; + this.toolStripComboBoxFrameRate.FlatStyle = System.Windows.Forms.FlatStyle.Standard; + this.toolStripComboBoxFrameRate.Name = "toolStripComboBoxFrameRate"; + this.toolStripComboBoxFrameRate.Size = new System.Drawing.Size(75, 23); + this.toolStripComboBoxFrameRate.DropDown += new System.EventHandler(this.MenuOpened); + this.toolStripComboBoxFrameRate.DropDownClosed += new System.EventHandler(this.MenuClosed); + this.toolStripComboBoxFrameRate.TextChanged += new System.EventHandler(this.ToolStripComboBoxFrameRateTextChanged); + // + // toolStripButtonGetFrameRate + // + this.toolStripButtonGetFrameRate.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.toolStripButtonGetFrameRate.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonGetFrameRate.Image"))); + this.toolStripButtonGetFrameRate.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButtonGetFrameRate.Name = "toolStripButtonGetFrameRate"; + this.toolStripButtonGetFrameRate.Size = new System.Drawing.Size(23, 19); + this.toolStripButtonGetFrameRate.Text = "..."; + this.toolStripButtonGetFrameRate.ToolTipText = "Get frame rate from video file"; + this.toolStripButtonGetFrameRate.Click += new System.EventHandler(this.ButtonGetFrameRateClick); + // + // menuStrip1 + // + this.menuStrip1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.fileToolStripMenuItem, + this.editToolStripMenuItem, + this.toolsToolStripMenuItem, + this.toolStripMenuItemSpellCheckMain, + this.toolStripMenuItemVideo, + this.toolStripMenuItemSynchronization, + this.toolStripMenuItemAutoTranslate, + this.optionsToolStripMenuItem, + this.toolStripMenuItemNetworking, + this.helpToolStripMenuItem}); + this.menuStrip1.Location = new System.Drawing.Point(0, 0); + this.menuStrip1.Name = "menuStrip1"; + this.menuStrip1.Size = new System.Drawing.Size(975, 24); + this.menuStrip1.TabIndex = 6; + this.menuStrip1.Text = "menuStrip1"; + // + // fileToolStripMenuItem + // + this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.newToolStripMenuItem, + this.openToolStripMenuItem, + this.toolStripMenuItemOpenKeepVideo, + this.reopenToolStripMenuItem, + this.saveToolStripMenuItem, + this.saveAsToolStripMenuItem, + this.toolStripMenuItemRestoreAutoBackup, + this.toolStripMenuItemDCinemaProperties, + this.toolStripMenuItemTTProperties, + this.toolStripMenuItemNuendoProperties, + this.toolStripMenuItemFcpProperties, + this.toolStripMenuItemSubStationAlpha, + this.toolStripMenuItemAssaStyles, + this.toolStripMenuItemEbuProperties, + this.toolStripMenuItemDvdStudioProProperties, + this.toolStripSeparator20, + this.openOriginalToolStripMenuItem, + this.saveOriginalToolStripMenuItem, + this.saveOriginalAstoolStripMenuItem, + this.removeOriginalToolStripMenuItem, + this.toolStripSeparator12, + this.toolStripMenuItemOpenContainingFolder, + this.toolStripMenuItemCompare, + this.toolStripMenuItemStatistics, + this.toolStripMenuItemPlugins, + this.toolStripSeparator1, + this.toolStripMenuItemImportDvdSubtitles, + this.toolStripMenuItemSubIdx, + this.toolStripMenuItemImportBluRaySup, + this.toolStripMenuItemImportXSub, + this.toolStripMenuItemImportOcrHardSub, + this.matroskaImportStripMenuItem, + this.toolStripMenuItemManualAnsi, + this.toolStripMenuItemImportText, + this.toolStripMenuItemImportImages, + this.toolStripMenuItemImportTimeCodes, + this.toolStripSeparator22, + this.toolStripMenuItemExport, + this.toolStripSeparator10, + this.exitToolStripMenuItem}); + this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; + this.fileToolStripMenuItem.Size = new System.Drawing.Size(39, 20); + this.fileToolStripMenuItem.Text = "File"; + this.fileToolStripMenuItem.DropDownOpening += new System.EventHandler(this.fileToolStripMenuItem_DropDownOpening); + // + // newToolStripMenuItem + // + this.newToolStripMenuItem.Name = "newToolStripMenuItem"; + this.newToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N))); + this.newToolStripMenuItem.Size = new System.Drawing.Size(335, 22); + this.newToolStripMenuItem.Text = "New"; + this.newToolStripMenuItem.Click += new System.EventHandler(this.NewToolStripMenuItemClick); + // + // openToolStripMenuItem + // + this.openToolStripMenuItem.Name = "openToolStripMenuItem"; + this.openToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O))); + this.openToolStripMenuItem.Size = new System.Drawing.Size(335, 22); + this.openToolStripMenuItem.Text = "Open"; + this.openToolStripMenuItem.Click += new System.EventHandler(this.OpenToolStripMenuItemClick); + // + // toolStripMenuItemOpenKeepVideo + // + this.toolStripMenuItemOpenKeepVideo.Name = "toolStripMenuItemOpenKeepVideo"; + this.toolStripMenuItemOpenKeepVideo.Size = new System.Drawing.Size(335, 22); + this.toolStripMenuItemOpenKeepVideo.Text = "Open (keep video)"; + this.toolStripMenuItemOpenKeepVideo.Click += new System.EventHandler(this.toolStripMenuItemOpenKeepVideo_Click); + // + // reopenToolStripMenuItem + // + this.reopenToolStripMenuItem.Name = "reopenToolStripMenuItem"; + this.reopenToolStripMenuItem.Size = new System.Drawing.Size(335, 22); + this.reopenToolStripMenuItem.Text = "Reopen"; + // + // saveToolStripMenuItem + // + this.saveToolStripMenuItem.Name = "saveToolStripMenuItem"; + this.saveToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); + this.saveToolStripMenuItem.Size = new System.Drawing.Size(335, 22); + this.saveToolStripMenuItem.Text = "Save"; + this.saveToolStripMenuItem.Click += new System.EventHandler(this.SaveToolStripMenuItemClick); + // + // saveAsToolStripMenuItem + // + this.saveAsToolStripMenuItem.Name = "saveAsToolStripMenuItem"; + this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(335, 22); + this.saveAsToolStripMenuItem.Text = "Save as..."; + this.saveAsToolStripMenuItem.Click += new System.EventHandler(this.SaveAsToolStripMenuItemClick); + // + // toolStripMenuItemRestoreAutoBackup + // + this.toolStripMenuItemRestoreAutoBackup.Name = "toolStripMenuItemRestoreAutoBackup"; + this.toolStripMenuItemRestoreAutoBackup.Size = new System.Drawing.Size(335, 22); + this.toolStripMenuItemRestoreAutoBackup.Text = "Restore auto-backup..."; + this.toolStripMenuItemRestoreAutoBackup.Click += new System.EventHandler(this.toolStripMenuItemRestoreAutoBackup_Click); + // + // toolStripMenuItemDCinemaProperties + // + this.toolStripMenuItemDCinemaProperties.Name = "toolStripMenuItemDCinemaProperties"; + this.toolStripMenuItemDCinemaProperties.Size = new System.Drawing.Size(335, 22); + this.toolStripMenuItemDCinemaProperties.Text = "DCinema properties..."; + this.toolStripMenuItemDCinemaProperties.Click += new System.EventHandler(this.toolStripMenuItemDCinemaProperties_Click); + // + // toolStripMenuItemTTProperties + // + this.toolStripMenuItemTTProperties.Name = "toolStripMenuItemTTProperties"; + this.toolStripMenuItemTTProperties.Size = new System.Drawing.Size(335, 22); + this.toolStripMenuItemTTProperties.Text = "Timed Text properties..."; + this.toolStripMenuItemTTProperties.Click += new System.EventHandler(this.toolStripMenuItemTTPropertiesClick); + // + // toolStripMenuItemNuendoProperties + // + this.toolStripMenuItemNuendoProperties.Name = "toolStripMenuItemNuendoProperties"; + this.toolStripMenuItemNuendoProperties.Size = new System.Drawing.Size(335, 22); + this.toolStripMenuItemNuendoProperties.Text = "Nuendo properties..."; + this.toolStripMenuItemNuendoProperties.Click += new System.EventHandler(this.ToolStripMenuItemNuendoPropertiesClick); + // + // toolStripMenuItemFcpProperties + // + this.toolStripMenuItemFcpProperties.Name = "toolStripMenuItemFcpProperties"; + this.toolStripMenuItemFcpProperties.Size = new System.Drawing.Size(335, 22); + this.toolStripMenuItemFcpProperties.Text = "Final Cut Pro properties..."; + this.toolStripMenuItemFcpProperties.Click += new System.EventHandler(this.toolStripMenuItemFcpProperties_Click); + // + // toolStripMenuItemSubStationAlpha + // + this.toolStripMenuItemSubStationAlpha.Name = "toolStripMenuItemSubStationAlpha"; + this.toolStripMenuItemSubStationAlpha.Size = new System.Drawing.Size(335, 22); + this.toolStripMenuItemSubStationAlpha.Text = "Advanced Sub Station Alpha properties..."; + this.toolStripMenuItemSubStationAlpha.Click += new System.EventHandler(this.toolStripMenuItemSubStationAlpha_Click); + // + // toolStripMenuItemAssaStyles + // + this.toolStripMenuItemAssaStyles.Name = "toolStripMenuItemAssaStyles"; + this.toolStripMenuItemAssaStyles.Size = new System.Drawing.Size(335, 22); + this.toolStripMenuItemAssaStyles.Text = "Advanced Sub Station Alpha styles..."; + this.toolStripMenuItemAssaStyles.Click += new System.EventHandler(this.toolStripMenuItemAssaStyles_Click); + // + // toolStripMenuItemEbuProperties + // + this.toolStripMenuItemEbuProperties.Name = "toolStripMenuItemEbuProperties"; + this.toolStripMenuItemEbuProperties.Size = new System.Drawing.Size(335, 22); + this.toolStripMenuItemEbuProperties.Text = "Ebu properties..."; + this.toolStripMenuItemEbuProperties.Click += new System.EventHandler(this.toolStripMenuItemEbuProperties_Click); + // + // toolStripMenuItemDvdStudioProProperties + // + this.toolStripMenuItemDvdStudioProProperties.Name = "toolStripMenuItemDvdStudioProProperties"; + this.toolStripMenuItemDvdStudioProProperties.Size = new System.Drawing.Size(335, 22); + this.toolStripMenuItemDvdStudioProProperties.Text = "DVD Studio Pro properties..."; + this.toolStripMenuItemDvdStudioProProperties.Click += new System.EventHandler(this.toolStripMenuDvdStudioProperties_Click); + // + // toolStripSeparator20 + // + this.toolStripSeparator20.Name = "toolStripSeparator20"; + this.toolStripSeparator20.Size = new System.Drawing.Size(332, 6); + // + // openOriginalToolStripMenuItem + // + this.openOriginalToolStripMenuItem.Name = "openOriginalToolStripMenuItem"; + this.openOriginalToolStripMenuItem.Size = new System.Drawing.Size(335, 22); + this.openOriginalToolStripMenuItem.Text = "Open original (translator mode)..."; + this.openOriginalToolStripMenuItem.Click += new System.EventHandler(this.OpenOriginalToolStripMenuItemClick); + // + // saveOriginalToolStripMenuItem + // + this.saveOriginalToolStripMenuItem.Name = "saveOriginalToolStripMenuItem"; + this.saveOriginalToolStripMenuItem.Size = new System.Drawing.Size(335, 22); + this.saveOriginalToolStripMenuItem.Text = "Save original"; + this.saveOriginalToolStripMenuItem.Click += new System.EventHandler(this.SaveOriginalToolStripMenuItemClick); + // + // saveOriginalAstoolStripMenuItem + // + this.saveOriginalAstoolStripMenuItem.Name = "saveOriginalAstoolStripMenuItem"; + this.saveOriginalAstoolStripMenuItem.Size = new System.Drawing.Size(335, 22); + this.saveOriginalAstoolStripMenuItem.Text = "Save original as..."; + this.saveOriginalAstoolStripMenuItem.Click += new System.EventHandler(this.SaveOriginalAstoolStripMenuItemClick); + // + // removeOriginalToolStripMenuItem + // + this.removeOriginalToolStripMenuItem.Name = "removeOriginalToolStripMenuItem"; + this.removeOriginalToolStripMenuItem.Size = new System.Drawing.Size(335, 22); + this.removeOriginalToolStripMenuItem.Text = "Remove original"; + this.removeOriginalToolStripMenuItem.Click += new System.EventHandler(this.RemoveOriginalToolStripMenuItemClick); + // + // toolStripSeparator12 + // + this.toolStripSeparator12.Name = "toolStripSeparator12"; + this.toolStripSeparator12.Size = new System.Drawing.Size(332, 6); + // + // toolStripMenuItemOpenContainingFolder + // + this.toolStripMenuItemOpenContainingFolder.Name = "toolStripMenuItemOpenContainingFolder"; + this.toolStripMenuItemOpenContainingFolder.Size = new System.Drawing.Size(335, 22); + this.toolStripMenuItemOpenContainingFolder.Text = "Open containing folder"; + this.toolStripMenuItemOpenContainingFolder.Click += new System.EventHandler(this.toolStripMenuItemOpenContainingFolder_Click); + // + // toolStripMenuItemCompare + // + this.toolStripMenuItemCompare.Name = "toolStripMenuItemCompare"; + this.toolStripMenuItemCompare.Size = new System.Drawing.Size(335, 22); + this.toolStripMenuItemCompare.Text = "Compare..."; + this.toolStripMenuItemCompare.Click += new System.EventHandler(this.ToolStripMenuItemCompareClick); + // + // toolStripMenuItemStatistics + // + this.toolStripMenuItemStatistics.Name = "toolStripMenuItemStatistics"; + this.toolStripMenuItemStatistics.Size = new System.Drawing.Size(335, 22); + this.toolStripMenuItemStatistics.Text = "Statistics..."; + this.toolStripMenuItemStatistics.Click += new System.EventHandler(this.toolStripMenuItemStatistics_Click); + // + // toolStripMenuItemPlugins + // + this.toolStripMenuItemPlugins.Name = "toolStripMenuItemPlugins"; + this.toolStripMenuItemPlugins.Size = new System.Drawing.Size(335, 22); + this.toolStripMenuItemPlugins.Text = "Plugins..."; + this.toolStripMenuItemPlugins.Click += new System.EventHandler(this.toolStripMenuItemPlugins_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(332, 6); + // + // toolStripMenuItemImportDvdSubtitles + // + this.toolStripMenuItemImportDvdSubtitles.Name = "toolStripMenuItemImportDvdSubtitles"; + this.toolStripMenuItemImportDvdSubtitles.Size = new System.Drawing.Size(335, 22); + this.toolStripMenuItemImportDvdSubtitles.Text = "Import/OCR subtitle from VOB/IFO (DVD) ..."; + this.toolStripMenuItemImportDvdSubtitles.Click += new System.EventHandler(this.ToolStripMenuItemImportDvdSubtitlesClick); + // + // toolStripMenuItemSubIdx + // + this.toolStripMenuItemSubIdx.Name = "toolStripMenuItemSubIdx"; + this.toolStripMenuItemSubIdx.Size = new System.Drawing.Size(335, 22); + this.toolStripMenuItemSubIdx.Text = "Import/OCR VobSub (sub/idx) subtitle..."; + this.toolStripMenuItemSubIdx.Click += new System.EventHandler(this.ToolStripMenuItemSubIdxClick1); + // + // toolStripMenuItemImportBluRaySup + // + this.toolStripMenuItemImportBluRaySup.Name = "toolStripMenuItemImportBluRaySup"; + this.toolStripMenuItemImportBluRaySup.Size = new System.Drawing.Size(335, 22); + this.toolStripMenuItemImportBluRaySup.Text = "Import/OCR Blu-ray sup file..."; + this.toolStripMenuItemImportBluRaySup.Click += new System.EventHandler(this.toolStripMenuItemImportBluRaySup_Click); + // + // toolStripMenuItemImportXSub + // + this.toolStripMenuItemImportXSub.Name = "toolStripMenuItemImportXSub"; + this.toolStripMenuItemImportXSub.Size = new System.Drawing.Size(335, 22); + this.toolStripMenuItemImportXSub.Text = "Import/OCR XSub from divx/avi..."; + this.toolStripMenuItemImportXSub.Click += new System.EventHandler(this.toolStripMenuItemImportXSub_Click); + // + // toolStripMenuItemImportOcrHardSub + // + this.toolStripMenuItemImportOcrHardSub.Name = "toolStripMenuItemImportOcrHardSub"; + this.toolStripMenuItemImportOcrHardSub.Size = new System.Drawing.Size(335, 22); + this.toolStripMenuItemImportOcrHardSub.Text = "Import/OCR burned-in subtitles from video file..."; + this.toolStripMenuItemImportOcrHardSub.Click += new System.EventHandler(this.toolStripMenuItemImportOcrHardSub_Click); + // + // matroskaImportStripMenuItem + // + this.matroskaImportStripMenuItem.Name = "matroskaImportStripMenuItem"; + this.matroskaImportStripMenuItem.Size = new System.Drawing.Size(335, 22); + this.matroskaImportStripMenuItem.Text = "Import subtitle from Matroska file..."; + this.matroskaImportStripMenuItem.Click += new System.EventHandler(this.MatroskaImportStripMenuItemClick); + // + // toolStripMenuItemManualAnsi + // + this.toolStripMenuItemManualAnsi.Name = "toolStripMenuItemManualAnsi"; + this.toolStripMenuItemManualAnsi.Size = new System.Drawing.Size(335, 22); + this.toolStripMenuItemManualAnsi.Text = "Import subtitle with manually chosen encoding..."; + this.toolStripMenuItemManualAnsi.Click += new System.EventHandler(this.ToolStripMenuItemManualAnsiClick); + // + // toolStripMenuItemImportText + // + this.toolStripMenuItemImportText.Name = "toolStripMenuItemImportText"; + this.toolStripMenuItemImportText.Size = new System.Drawing.Size(335, 22); + this.toolStripMenuItemImportText.Text = "Import text..."; + this.toolStripMenuItemImportText.Click += new System.EventHandler(this.ToolStripMenuItemImportTextClick); + // + // toolStripMenuItemImportImages + // + this.toolStripMenuItemImportImages.Name = "toolStripMenuItemImportImages"; + this.toolStripMenuItemImportImages.Size = new System.Drawing.Size(335, 22); + this.toolStripMenuItemImportImages.Text = "Import images..."; + this.toolStripMenuItemImportImages.Click += new System.EventHandler(this.toolStripMenuItemImportImages_Click); + // + // toolStripMenuItemImportTimeCodes + // + this.toolStripMenuItemImportTimeCodes.Name = "toolStripMenuItemImportTimeCodes"; + this.toolStripMenuItemImportTimeCodes.Size = new System.Drawing.Size(335, 22); + this.toolStripMenuItemImportTimeCodes.Text = "Import time codes into existing subtitle..."; + this.toolStripMenuItemImportTimeCodes.Click += new System.EventHandler(this.toolStripMenuItemImportTimeCodes_Click); + // + // toolStripSeparator22 + // + this.toolStripSeparator22.Name = "toolStripSeparator22"; + this.toolStripSeparator22.Size = new System.Drawing.Size(332, 6); + // + // toolStripMenuItemExport + // + this.toolStripMenuItemExport.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.adobeEncoreFABImageScriptToolStripMenuItem, + this.toolStripMenuItemAvidStl, + this.toolStripMenuItemExportAyato, + this.toolStripMenuItemExportPngXml, + this.bluraySupToolStripMenuItem, + this.toolStripMenuItemExportBdTextSt, + this.toolStripMenuItemExportCapMakerPlus, + this.toolStripMenuItemExportCaptionInc, + this.toolStripMenuItemCavena890, + this.toolStripMenuItemExportCheetahCap, + this.toolStripMenuItemExportDcinemaInterop, + this.dCinemaSMPTE2014ToolStripMenuItem, + this.toolStripMenuItemDost, + this.DvdStudioProStl, + this.eBUSTLToolStripMenuItem, + this.toolStripMenuItemEdl, + this.toolStripMenuItemEdlClipName, + this.toolStripMenuItemExportFcpIImage, + this.toolStripMenuItemFcpXmlAdvanced, + this.toolStripMenuItemImagePerFrame, + this.toolStripMenuItemTextTimeCodePair, + this.pACScreenElectronicsToolStripMenuItem, + this.uniPacExportToolStripMenuItem, + this.plainTextToolStripMenuItem, + this.toolStripMenuItemSpumux, + this.toolStripMenuItemExportUltech130, + this.vobSubsubidxToolStripMenuItem, + this.toolStripSeparatorExportCustomText, + this.exportCustomTextFormatToolStripMenuItem}); + this.toolStripMenuItemExport.Name = "toolStripMenuItemExport"; + this.toolStripMenuItemExport.Size = new System.Drawing.Size(335, 22); + this.toolStripMenuItemExport.Text = "Export"; + // + // adobeEncoreFABImageScriptToolStripMenuItem + // + this.adobeEncoreFABImageScriptToolStripMenuItem.Name = "adobeEncoreFABImageScriptToolStripMenuItem"; + this.adobeEncoreFABImageScriptToolStripMenuItem.Size = new System.Drawing.Size(255, 22); + this.adobeEncoreFABImageScriptToolStripMenuItem.Text = "Adobe Encore FAB image script..."; + this.adobeEncoreFABImageScriptToolStripMenuItem.Click += new System.EventHandler(this.AdobeEncoreFabImageScriptToolStripMenuItemClick); + // + // toolStripMenuItemAvidStl + // + this.toolStripMenuItemAvidStl.Name = "toolStripMenuItemAvidStl"; + this.toolStripMenuItemAvidStl.Size = new System.Drawing.Size(255, 22); + this.toolStripMenuItemAvidStl.Text = "Avid STL..."; + this.toolStripMenuItemAvidStl.Click += new System.EventHandler(this.toolStripMenuItemAvidStl_Click); + // + // toolStripMenuItemExportAyato + // + this.toolStripMenuItemExportAyato.Name = "toolStripMenuItemExportAyato"; + this.toolStripMenuItemExportAyato.Size = new System.Drawing.Size(255, 22); + this.toolStripMenuItemExportAyato.Text = "Ayato..."; + this.toolStripMenuItemExportAyato.Click += new System.EventHandler(this.toolStripMenuItemExportAyato_Click); + // + // toolStripMenuItemExportPngXml + // + this.toolStripMenuItemExportPngXml.Name = "toolStripMenuItemExportPngXml"; + this.toolStripMenuItemExportPngXml.Size = new System.Drawing.Size(255, 22); + this.toolStripMenuItemExportPngXml.Text = "BDN xml/png..."; + this.toolStripMenuItemExportPngXml.Click += new System.EventHandler(this.ToolStripMenuItemExportPngXmlClick); + // + // bluraySupToolStripMenuItem + // + this.bluraySupToolStripMenuItem.Name = "bluraySupToolStripMenuItem"; + this.bluraySupToolStripMenuItem.Size = new System.Drawing.Size(255, 22); + this.bluraySupToolStripMenuItem.Text = "Blu-ray sup..."; + this.bluraySupToolStripMenuItem.Click += new System.EventHandler(this.BluraySupToolStripMenuItemClick); + // + // toolStripMenuItemExportBdTextSt + // + this.toolStripMenuItemExportBdTextSt.Name = "toolStripMenuItemExportBdTextSt"; + this.toolStripMenuItemExportBdTextSt.Size = new System.Drawing.Size(255, 22); + this.toolStripMenuItemExportBdTextSt.Text = "Blu-ray TextST..."; + this.toolStripMenuItemExportBdTextSt.Click += new System.EventHandler(this.toolStripMenuItemExportBdTextSt_Click); + // + // toolStripMenuItemExportCapMakerPlus + // + this.toolStripMenuItemExportCapMakerPlus.Name = "toolStripMenuItemExportCapMakerPlus"; + this.toolStripMenuItemExportCapMakerPlus.Size = new System.Drawing.Size(255, 22); + this.toolStripMenuItemExportCapMakerPlus.Text = "CapMaker Plus..."; + this.toolStripMenuItemExportCapMakerPlus.Click += new System.EventHandler(this.toolStripMenuItemExportCapMakerPlus_Click); + // + // toolStripMenuItemExportCaptionInc + // + this.toolStripMenuItemExportCaptionInc.Name = "toolStripMenuItemExportCaptionInc"; + this.toolStripMenuItemExportCaptionInc.Size = new System.Drawing.Size(255, 22); + this.toolStripMenuItemExportCaptionInc.Text = "Captions Inc..."; + this.toolStripMenuItemExportCaptionInc.Click += new System.EventHandler(this.toolStripMenuItemExportCaptionInc_Click); + // + // toolStripMenuItemCavena890 + // + this.toolStripMenuItemCavena890.Name = "toolStripMenuItemCavena890"; + this.toolStripMenuItemCavena890.Size = new System.Drawing.Size(255, 22); + this.toolStripMenuItemCavena890.Text = "Cavena 890..."; + this.toolStripMenuItemCavena890.Click += new System.EventHandler(this.ToolStripMenuItemCavena890Click); + // + // toolStripMenuItemExportCheetahCap + // + this.toolStripMenuItemExportCheetahCap.Name = "toolStripMenuItemExportCheetahCap"; + this.toolStripMenuItemExportCheetahCap.Size = new System.Drawing.Size(255, 22); + this.toolStripMenuItemExportCheetahCap.Text = "Cheetah CAP..."; + this.toolStripMenuItemExportCheetahCap.Click += new System.EventHandler(this.toolStripMenuItemExportCheetahCap_Click); + // + // toolStripMenuItemExportDcinemaInterop + // + this.toolStripMenuItemExportDcinemaInterop.Name = "toolStripMenuItemExportDcinemaInterop"; + this.toolStripMenuItemExportDcinemaInterop.Size = new System.Drawing.Size(255, 22); + this.toolStripMenuItemExportDcinemaInterop.Text = "D-Cinema interop/png..."; + this.toolStripMenuItemExportDcinemaInterop.Click += new System.EventHandler(this.toolStripMenuItemExportDcinemaInteropClick); + // + // dCinemaSMPTE2014ToolStripMenuItem + // + this.dCinemaSMPTE2014ToolStripMenuItem.Name = "dCinemaSMPTE2014ToolStripMenuItem"; + this.dCinemaSMPTE2014ToolStripMenuItem.Size = new System.Drawing.Size(255, 22); + this.dCinemaSMPTE2014ToolStripMenuItem.Text = "D-Cinema SMPTE 2014"; + this.dCinemaSMPTE2014ToolStripMenuItem.Click += new System.EventHandler(this.dCinemaSMPTE2014ToolStripMenuItem_Click); + // + // toolStripMenuItemDost + // + this.toolStripMenuItemDost.Name = "toolStripMenuItemDost"; + this.toolStripMenuItemDost.Size = new System.Drawing.Size(255, 22); + this.toolStripMenuItemDost.Text = "DOST..."; + this.toolStripMenuItemDost.Click += new System.EventHandler(this.toolStripMenuItemDost_Click); + // + // DvdStudioProStl + // + this.DvdStudioProStl.Name = "DvdStudioProStl"; + this.DvdStudioProStl.Size = new System.Drawing.Size(255, 22); + this.DvdStudioProStl.Text = "DVD Studio Pro STL"; + this.DvdStudioProStl.Click += new System.EventHandler(this.DvdStudioProStl_Click); + // + // eBUSTLToolStripMenuItem + // + this.eBUSTLToolStripMenuItem.Name = "eBUSTLToolStripMenuItem"; + this.eBUSTLToolStripMenuItem.Size = new System.Drawing.Size(255, 22); + this.eBUSTLToolStripMenuItem.Text = "EBU STL..."; + this.eBUSTLToolStripMenuItem.Click += new System.EventHandler(this.EBustlToolStripMenuItemClick); + // + // toolStripMenuItemEdl + // + this.toolStripMenuItemEdl.Name = "toolStripMenuItemEdl"; + this.toolStripMenuItemEdl.Size = new System.Drawing.Size(255, 22); + this.toolStripMenuItemEdl.Text = "EDL..."; + this.toolStripMenuItemEdl.Click += new System.EventHandler(this.ExportToEdl); + // + // toolStripMenuItemEdlClipName + // + this.toolStripMenuItemEdlClipName.Name = "toolStripMenuItemEdlClipName"; + this.toolStripMenuItemEdlClipName.Size = new System.Drawing.Size(255, 22); + this.toolStripMenuItemEdlClipName.Text = "EDL/CLIPNAME..."; + this.toolStripMenuItemEdlClipName.Click += new System.EventHandler(this.ExportToEdlWithClipName); + // + // toolStripMenuItemExportFcpIImage + // + this.toolStripMenuItemExportFcpIImage.Name = "toolStripMenuItemExportFcpIImage"; + this.toolStripMenuItemExportFcpIImage.Size = new System.Drawing.Size(255, 22); + this.toolStripMenuItemExportFcpIImage.Text = "Final Cut Pro + image..."; + this.toolStripMenuItemExportFcpIImage.Click += new System.EventHandler(this.toolStripMenuItemExportFcpIImage_Click); + // + // toolStripMenuItemFcpXmlAdvanced + // + this.toolStripMenuItemFcpXmlAdvanced.Name = "toolStripMenuItemFcpXmlAdvanced"; + this.toolStripMenuItemFcpXmlAdvanced.Size = new System.Drawing.Size(255, 22); + this.toolStripMenuItemFcpXmlAdvanced.Text = "Final Cut Pro XML advanced..."; + this.toolStripMenuItemFcpXmlAdvanced.Click += new System.EventHandler(this.toolStripMenuItemFcpXmlAdvanced_Click); + // + // toolStripMenuItemImagePerFrame + // + this.toolStripMenuItemImagePerFrame.Name = "toolStripMenuItemImagePerFrame"; + this.toolStripMenuItemImagePerFrame.Size = new System.Drawing.Size(255, 22); + this.toolStripMenuItemImagePerFrame.Text = "Image per frame..."; + this.toolStripMenuItemImagePerFrame.Visible = false; + this.toolStripMenuItemImagePerFrame.Click += new System.EventHandler(this.ToolStripMenuItemImagePerFrameClick); + // + // toolStripMenuItemTextTimeCodePair + // + this.toolStripMenuItemTextTimeCodePair.Name = "toolStripMenuItemTextTimeCodePair"; + this.toolStripMenuItemTextTimeCodePair.Size = new System.Drawing.Size(255, 22); + this.toolStripMenuItemTextTimeCodePair.Text = "Korean ATS file pair..."; + this.toolStripMenuItemTextTimeCodePair.Click += new System.EventHandler(this.toolStripMenuItemTextTimeCodePair_Click); + // + // pACScreenElectronicsToolStripMenuItem + // + this.pACScreenElectronicsToolStripMenuItem.Name = "pACScreenElectronicsToolStripMenuItem"; + this.pACScreenElectronicsToolStripMenuItem.Size = new System.Drawing.Size(255, 22); + this.pACScreenElectronicsToolStripMenuItem.Text = "PAC (Screen Electronics)..."; + this.pACScreenElectronicsToolStripMenuItem.Click += new System.EventHandler(this.PacScreenElectronicsToolStripMenuItemClick); + // + // uniPacExportToolStripMenuItem + // + this.uniPacExportToolStripMenuItem.Name = "uniPacExportToolStripMenuItem"; + this.uniPacExportToolStripMenuItem.Size = new System.Drawing.Size(255, 22); + this.uniPacExportToolStripMenuItem.Text = "PAC Unicode (UniPac)..."; + this.uniPacExportToolStripMenuItem.Click += new System.EventHandler(this.uniPacExportToolStripMenuItem_Click); + // + // plainTextToolStripMenuItem + // + this.plainTextToolStripMenuItem.Name = "plainTextToolStripMenuItem"; + this.plainTextToolStripMenuItem.Size = new System.Drawing.Size(255, 22); + this.plainTextToolStripMenuItem.Text = "Plain text..."; + this.plainTextToolStripMenuItem.Click += new System.EventHandler(this.PlainTextToolStripMenuItemClick); + // + // toolStripMenuItemSpumux + // + this.toolStripMenuItemSpumux.Name = "toolStripMenuItemSpumux"; + this.toolStripMenuItemSpumux.Size = new System.Drawing.Size(255, 22); + this.toolStripMenuItemSpumux.Text = "Spumux..."; + this.toolStripMenuItemSpumux.Click += new System.EventHandler(this.toolStripMenuItem2_Click); + // + // toolStripMenuItemExportUltech130 + // + this.toolStripMenuItemExportUltech130.Name = "toolStripMenuItemExportUltech130"; + this.toolStripMenuItemExportUltech130.Size = new System.Drawing.Size(255, 22); + this.toolStripMenuItemExportUltech130.Text = "Ultech caption..."; + this.toolStripMenuItemExportUltech130.Click += new System.EventHandler(this.toolStripMenuItemExportUltech130_Click); + // + // vobSubsubidxToolStripMenuItem + // + this.vobSubsubidxToolStripMenuItem.Name = "vobSubsubidxToolStripMenuItem"; + this.vobSubsubidxToolStripMenuItem.Size = new System.Drawing.Size(255, 22); + this.vobSubsubidxToolStripMenuItem.Text = "VobSub (sub/idx)..."; + this.vobSubsubidxToolStripMenuItem.Click += new System.EventHandler(this.VobSubsubidxToolStripMenuItemClick); + // + // toolStripSeparatorExportCustomText + // + this.toolStripSeparatorExportCustomText.Name = "toolStripSeparatorExportCustomText"; + this.toolStripSeparatorExportCustomText.Size = new System.Drawing.Size(252, 6); + // + // exportCustomTextFormatToolStripMenuItem + // + this.exportCustomTextFormatToolStripMenuItem.Name = "exportCustomTextFormatToolStripMenuItem"; + this.exportCustomTextFormatToolStripMenuItem.Size = new System.Drawing.Size(255, 22); + this.exportCustomTextFormatToolStripMenuItem.Text = "Export custom text format..."; + this.exportCustomTextFormatToolStripMenuItem.Click += new System.EventHandler(this.exportCustomTextFormatToolStripMenuItem_Click); + // + // toolStripSeparator10 + // + this.toolStripSeparator10.Name = "toolStripSeparator10"; + this.toolStripSeparator10.Size = new System.Drawing.Size(332, 6); + // + // exitToolStripMenuItem + // + this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; + this.exitToolStripMenuItem.Size = new System.Drawing.Size(335, 22); + this.exitToolStripMenuItem.Text = "E&xit"; + this.exitToolStripMenuItem.Click += new System.EventHandler(this.ExitToolStripMenuItemClick); + // + // editToolStripMenuItem + // + this.editToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItemUndo, + this.toolStripMenuItemRedo, + this.showHistoryforUndoToolStripMenuItem, + this.toolStripSeparator14, + this.toolStripMenuItemInsertUnicodeCharacter, + this.toolStripSeparatorInsertUnicodeCharacter, + this.findToolStripMenuItem, + this.findNextToolStripMenuItem, + this.replaceToolStripMenuItem, + this.multipleReplaceToolStripMenuItem, + this.gotoLineNumberToolStripMenuItem, + this.toolStripMenuItemShowOriginalInPreview, + this.toolStripSeparator25, + this.toolStripMenuItemRightToLeftMode, + this.toolStripMenuItemRtlUnicodeControlChars, + this.toolStripMenuItemRemoveUnicodeControlChars, + this.toolStripMenuItemReverseRightToLeftStartEnd, + this.toolStripSeparator21, + this.toolStripMenuItemModifySelection, + this.toolStripMenuItemInverseSelection, + this.editSelectAllToolStripMenuItem}); + this.editToolStripMenuItem.Name = "editToolStripMenuItem"; + this.editToolStripMenuItem.Size = new System.Drawing.Size(40, 20); + this.editToolStripMenuItem.Text = "Edit"; + this.editToolStripMenuItem.DropDownOpening += new System.EventHandler(this.EditToolStripMenuItemDropDownOpening); + // + // toolStripMenuItemUndo + // + this.toolStripMenuItemUndo.Name = "toolStripMenuItemUndo"; + this.toolStripMenuItemUndo.Size = new System.Drawing.Size(301, 22); + this.toolStripMenuItemUndo.Text = "Undo"; + this.toolStripMenuItemUndo.Click += new System.EventHandler(this.toolStripMenuItemUndo_Click); + // + // toolStripMenuItemRedo + // + this.toolStripMenuItemRedo.Name = "toolStripMenuItemRedo"; + this.toolStripMenuItemRedo.Size = new System.Drawing.Size(301, 22); + this.toolStripMenuItemRedo.Text = "Redo"; + this.toolStripMenuItemRedo.Click += new System.EventHandler(this.toolStripMenuItemRedo_Click); + // + // showHistoryforUndoToolStripMenuItem + // + this.showHistoryforUndoToolStripMenuItem.Name = "showHistoryforUndoToolStripMenuItem"; + this.showHistoryforUndoToolStripMenuItem.Size = new System.Drawing.Size(301, 22); + this.showHistoryforUndoToolStripMenuItem.Text = "Show history (for undo)"; + this.showHistoryforUndoToolStripMenuItem.Click += new System.EventHandler(this.ShowHistoryforUndoToolStripMenuItemClick); + // + // toolStripSeparator14 + // + this.toolStripSeparator14.Name = "toolStripSeparator14"; + this.toolStripSeparator14.Size = new System.Drawing.Size(298, 6); + // + // toolStripMenuItemInsertUnicodeCharacter + // + this.toolStripMenuItemInsertUnicodeCharacter.Name = "toolStripMenuItemInsertUnicodeCharacter"; + this.toolStripMenuItemInsertUnicodeCharacter.Size = new System.Drawing.Size(301, 22); + this.toolStripMenuItemInsertUnicodeCharacter.Text = "Insert unicode character"; + // + // toolStripSeparatorInsertUnicodeCharacter + // + this.toolStripSeparatorInsertUnicodeCharacter.Name = "toolStripSeparatorInsertUnicodeCharacter"; + this.toolStripSeparatorInsertUnicodeCharacter.Size = new System.Drawing.Size(298, 6); + // + // findToolStripMenuItem + // + this.findToolStripMenuItem.Name = "findToolStripMenuItem"; + this.findToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F))); + this.findToolStripMenuItem.Size = new System.Drawing.Size(301, 22); + this.findToolStripMenuItem.Text = "Find"; + this.findToolStripMenuItem.Click += new System.EventHandler(this.FindToolStripMenuItemClick); + // + // findNextToolStripMenuItem + // + this.findNextToolStripMenuItem.Name = "findNextToolStripMenuItem"; + this.findNextToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F3; + this.findNextToolStripMenuItem.Size = new System.Drawing.Size(301, 22); + this.findNextToolStripMenuItem.Text = "Find next"; + this.findNextToolStripMenuItem.Click += new System.EventHandler(this.FindNextToolStripMenuItemClick); + // + // replaceToolStripMenuItem + // + this.replaceToolStripMenuItem.Name = "replaceToolStripMenuItem"; + this.replaceToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.H))); + this.replaceToolStripMenuItem.Size = new System.Drawing.Size(301, 22); + this.replaceToolStripMenuItem.Text = "Replace"; + this.replaceToolStripMenuItem.Click += new System.EventHandler(this.ReplaceToolStripMenuItemClick); + // + // multipleReplaceToolStripMenuItem + // + this.multipleReplaceToolStripMenuItem.Name = "multipleReplaceToolStripMenuItem"; + this.multipleReplaceToolStripMenuItem.Size = new System.Drawing.Size(301, 22); + this.multipleReplaceToolStripMenuItem.Text = "Multiple replace"; + this.multipleReplaceToolStripMenuItem.Click += new System.EventHandler(this.MultipleReplaceToolStripMenuItemClick); + // + // gotoLineNumberToolStripMenuItem + // + this.gotoLineNumberToolStripMenuItem.Name = "gotoLineNumberToolStripMenuItem"; + this.gotoLineNumberToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.G))); + this.gotoLineNumberToolStripMenuItem.Size = new System.Drawing.Size(301, 22); + this.gotoLineNumberToolStripMenuItem.Text = "Goto line number..."; + this.gotoLineNumberToolStripMenuItem.Click += new System.EventHandler(this.GotoLineNumberToolStripMenuItemClick); + // + // toolStripMenuItemShowOriginalInPreview + // + this.toolStripMenuItemShowOriginalInPreview.Name = "toolStripMenuItemShowOriginalInPreview"; + this.toolStripMenuItemShowOriginalInPreview.Size = new System.Drawing.Size(301, 22); + this.toolStripMenuItemShowOriginalInPreview.Text = "Show original text in video/audio previews"; + this.toolStripMenuItemShowOriginalInPreview.Click += new System.EventHandler(this.ToolStripMenuItemShowOriginalInPreviewClick); + // + // toolStripSeparator25 + // + this.toolStripSeparator25.Name = "toolStripSeparator25"; + this.toolStripSeparator25.Size = new System.Drawing.Size(298, 6); + // + // toolStripMenuItemRightToLeftMode + // + this.toolStripMenuItemRightToLeftMode.Name = "toolStripMenuItemRightToLeftMode"; + this.toolStripMenuItemRightToLeftMode.Size = new System.Drawing.Size(301, 22); + this.toolStripMenuItemRightToLeftMode.Text = "Right to left mode"; + this.toolStripMenuItemRightToLeftMode.Click += new System.EventHandler(this.ToolStripMenuItemRightToLeftModeClick); + // + // toolStripMenuItemRtlUnicodeControlChars + // + this.toolStripMenuItemRtlUnicodeControlChars.Name = "toolStripMenuItemRtlUnicodeControlChars"; + this.toolStripMenuItemRtlUnicodeControlChars.Size = new System.Drawing.Size(301, 22); + this.toolStripMenuItemRtlUnicodeControlChars.Text = "Fix RTL via Unicode tags"; + this.toolStripMenuItemRtlUnicodeControlChars.Click += new System.EventHandler(this.toolStripMenuItemRtlUnicodeControlChar_Click); + // + // toolStripMenuItemRemoveUnicodeControlChars + // + this.toolStripMenuItemRemoveUnicodeControlChars.Name = "toolStripMenuItemRemoveUnicodeControlChars"; + this.toolStripMenuItemRemoveUnicodeControlChars.Size = new System.Drawing.Size(301, 22); + this.toolStripMenuItemRemoveUnicodeControlChars.Text = "Remove Unicode tags"; + this.toolStripMenuItemRemoveUnicodeControlChars.Click += new System.EventHandler(this.toolStripMenuItemRemoveUnicodeControlChar_Click); + // + // toolStripMenuItemReverseRightToLeftStartEnd + // + this.toolStripMenuItemReverseRightToLeftStartEnd.Name = "toolStripMenuItemReverseRightToLeftStartEnd"; + this.toolStripMenuItemReverseRightToLeftStartEnd.Size = new System.Drawing.Size(301, 22); + this.toolStripMenuItemReverseRightToLeftStartEnd.Text = "Reverse RTL start/end"; + this.toolStripMenuItemReverseRightToLeftStartEnd.Click += new System.EventHandler(this.toolStripMenuItemReverseRightToLeftStartEnd_Click); + // + // toolStripSeparator21 + // + this.toolStripSeparator21.Name = "toolStripSeparator21"; + this.toolStripSeparator21.Size = new System.Drawing.Size(298, 6); + // + // toolStripMenuItemModifySelection + // + this.toolStripMenuItemModifySelection.Name = "toolStripMenuItemModifySelection"; + this.toolStripMenuItemModifySelection.Size = new System.Drawing.Size(301, 22); + this.toolStripMenuItemModifySelection.Text = "Create/modify selection..."; + this.toolStripMenuItemModifySelection.Click += new System.EventHandler(this.toolStripMenuItemModifySelection_Click); + // + // toolStripMenuItemInverseSelection + // + this.toolStripMenuItemInverseSelection.Name = "toolStripMenuItemInverseSelection"; + this.toolStripMenuItemInverseSelection.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.I))); + this.toolStripMenuItemInverseSelection.Size = new System.Drawing.Size(301, 22); + this.toolStripMenuItemInverseSelection.Text = "Inverse selection"; + this.toolStripMenuItemInverseSelection.Click += new System.EventHandler(this.toolStripMenuItemInverseSelection_Click); + // + // editSelectAllToolStripMenuItem + // + this.editSelectAllToolStripMenuItem.Name = "editSelectAllToolStripMenuItem"; + this.editSelectAllToolStripMenuItem.Size = new System.Drawing.Size(301, 22); + this.editSelectAllToolStripMenuItem.Text = "Select all"; + this.editSelectAllToolStripMenuItem.Click += new System.EventHandler(this.EditSelectAllToolStripMenuItemClick); + // + // toolsToolStripMenuItem + // + this.toolsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.adjustDisplayTimeToolStripMenuItem, + this.toolStripMenuItemApplyDurationLimits, + this.toolStripMenuItemSubtitlesBridgeGaps, + this.setMinimumDisplayTimeBetweenParagraphsToolStripMenuItem, + this.fixToolStripMenuItem, + this.startNumberingFromToolStripMenuItem, + this.removeTextForHearImpairedToolStripMenuItem, + this.ChangeCasingToolStripMenuItem, + this.toolStripMenuItemAutoMergeShortLines, + this.toolStripMenuItemMergeDuplicateText, + this.toolStripMenuItemMergeLinesWithSameTimeCodes, + this.toolStripMenuItemAutoSplitLongLines, + this.toolStripMenuItemSortBy, + this.netflixQualityCheckToolStripMenuItem, + this.toolStripSeparator23, + this.toolStripMenuItemMakeEmptyFromCurrent, + this.toolStripMenuItemBatchConvert, + this.generateDatetimeInfoFromVideoToolStripMenuItem, + this.toolStripMenuItemMeasurementConverter, + this.toolStripSeparator3, + this.splitToolStripMenuItem, + this.appendTextVisuallyToolStripMenuItem, + this.joinSubtitlesToolStripMenuItem}); + this.toolsToolStripMenuItem.Name = "toolsToolStripMenuItem"; + this.toolsToolStripMenuItem.Size = new System.Drawing.Size(49, 20); + this.toolsToolStripMenuItem.Text = "Tools"; + this.toolsToolStripMenuItem.DropDownOpening += new System.EventHandler(this.ToolsToolStripMenuItemDropDownOpening); + // + // adjustDisplayTimeToolStripMenuItem + // + this.adjustDisplayTimeToolStripMenuItem.Name = "adjustDisplayTimeToolStripMenuItem"; + this.adjustDisplayTimeToolStripMenuItem.Size = new System.Drawing.Size(338, 22); + this.adjustDisplayTimeToolStripMenuItem.Text = "Adjust display time..."; + this.adjustDisplayTimeToolStripMenuItem.Click += new System.EventHandler(this.AdjustDisplayTimeToolStripMenuItemClick); + // + // toolStripMenuItemApplyDurationLimits + // + this.toolStripMenuItemApplyDurationLimits.Name = "toolStripMenuItemApplyDurationLimits"; + this.toolStripMenuItemApplyDurationLimits.Size = new System.Drawing.Size(338, 22); + this.toolStripMenuItemApplyDurationLimits.Text = "Apply duration limits..."; + this.toolStripMenuItemApplyDurationLimits.Click += new System.EventHandler(this.toolStripMenuItemApplyDisplayTimeLimits_Click); + // + // toolStripMenuItemSubtitlesBridgeGaps + // + this.toolStripMenuItemSubtitlesBridgeGaps.Name = "toolStripMenuItemSubtitlesBridgeGaps"; + this.toolStripMenuItemSubtitlesBridgeGaps.Size = new System.Drawing.Size(338, 22); + this.toolStripMenuItemSubtitlesBridgeGaps.Text = "Bridge gap between subtitles..."; + this.toolStripMenuItemSubtitlesBridgeGaps.Click += new System.EventHandler(this.toolStripMenuItemBridgeGapsBetweenSubtitles_Click); + // + // setMinimumDisplayTimeBetweenParagraphsToolStripMenuItem + // + this.setMinimumDisplayTimeBetweenParagraphsToolStripMenuItem.Name = "setMinimumDisplayTimeBetweenParagraphsToolStripMenuItem"; + this.setMinimumDisplayTimeBetweenParagraphsToolStripMenuItem.Size = new System.Drawing.Size(338, 22); + this.setMinimumDisplayTimeBetweenParagraphsToolStripMenuItem.Text = "Apply mininum gap between subtitles..."; + this.setMinimumDisplayTimeBetweenParagraphsToolStripMenuItem.Click += new System.EventHandler(this.SetMinimalDisplayTimeDifferenceToolStripMenuItemClick); + // + // fixToolStripMenuItem + // + this.fixToolStripMenuItem.Name = "fixToolStripMenuItem"; + this.fixToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.F))); + this.fixToolStripMenuItem.Size = new System.Drawing.Size(338, 22); + this.fixToolStripMenuItem.Text = "Fix common errors..."; + this.fixToolStripMenuItem.Click += new System.EventHandler(this.FixToolStripMenuItemClick); + // + // startNumberingFromToolStripMenuItem + // + this.startNumberingFromToolStripMenuItem.Name = "startNumberingFromToolStripMenuItem"; + this.startNumberingFromToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.N))); + this.startNumberingFromToolStripMenuItem.Size = new System.Drawing.Size(338, 22); + this.startNumberingFromToolStripMenuItem.Text = "Start numbering from..."; + this.startNumberingFromToolStripMenuItem.Click += new System.EventHandler(this.StartNumberingFromToolStripMenuItemClick); + // + // removeTextForHearImpairedToolStripMenuItem + // + this.removeTextForHearImpairedToolStripMenuItem.Name = "removeTextForHearImpairedToolStripMenuItem"; + this.removeTextForHearImpairedToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.H))); + this.removeTextForHearImpairedToolStripMenuItem.Size = new System.Drawing.Size(338, 22); + this.removeTextForHearImpairedToolStripMenuItem.Text = "Remove text for hearing impaired..."; + this.removeTextForHearImpairedToolStripMenuItem.Click += new System.EventHandler(this.RemoveTextForHearImpairedToolStripMenuItemClick); + // + // ChangeCasingToolStripMenuItem + // + this.ChangeCasingToolStripMenuItem.Name = "ChangeCasingToolStripMenuItem"; + this.ChangeCasingToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.C))); + this.ChangeCasingToolStripMenuItem.Size = new System.Drawing.Size(338, 22); + this.ChangeCasingToolStripMenuItem.Text = "Change casing..."; + this.ChangeCasingToolStripMenuItem.Click += new System.EventHandler(this.ChangeCasingToolStripMenuItem_Click); + // + // toolStripMenuItemAutoMergeShortLines + // + this.toolStripMenuItemAutoMergeShortLines.Name = "toolStripMenuItemAutoMergeShortLines"; + this.toolStripMenuItemAutoMergeShortLines.Size = new System.Drawing.Size(338, 22); + this.toolStripMenuItemAutoMergeShortLines.Text = "Merge short lines..."; + this.toolStripMenuItemAutoMergeShortLines.Click += new System.EventHandler(this.ToolStripMenuItemAutoMergeShortLinesClick); + // + // toolStripMenuItemMergeDuplicateText + // + this.toolStripMenuItemMergeDuplicateText.Name = "toolStripMenuItemMergeDuplicateText"; + this.toolStripMenuItemMergeDuplicateText.Size = new System.Drawing.Size(338, 22); + this.toolStripMenuItemMergeDuplicateText.Text = "Merge lines with same text..."; + this.toolStripMenuItemMergeDuplicateText.Click += new System.EventHandler(this.toolStripMenuItemMergeDuplicateText_Click); + // + // toolStripMenuItemMergeLinesWithSameTimeCodes + // + this.toolStripMenuItemMergeLinesWithSameTimeCodes.Name = "toolStripMenuItemMergeLinesWithSameTimeCodes"; + this.toolStripMenuItemMergeLinesWithSameTimeCodes.Size = new System.Drawing.Size(338, 22); + this.toolStripMenuItemMergeLinesWithSameTimeCodes.Text = "Merge lines with same time codes..."; + this.toolStripMenuItemMergeLinesWithSameTimeCodes.Click += new System.EventHandler(this.toolStripMenuItemMergeLinesWithSameTimeCodes_Click); + // + // toolStripMenuItemAutoSplitLongLines + // + this.toolStripMenuItemAutoSplitLongLines.Name = "toolStripMenuItemAutoSplitLongLines"; + this.toolStripMenuItemAutoSplitLongLines.Size = new System.Drawing.Size(338, 22); + this.toolStripMenuItemAutoSplitLongLines.Text = "Split long lines..."; + this.toolStripMenuItemAutoSplitLongLines.Click += new System.EventHandler(this.toolStripMenuItemAutoSplitLongLines_Click); + // + // toolStripMenuItemSortBy + // + this.toolStripMenuItemSortBy.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.sortNumberToolStripMenuItem, + this.sortStartTimeToolStripMenuItem, + this.sortEndTimeToolStripMenuItem, + this.sortDisplayTimeToolStripMenuItem, + this.sortTextAlphabeticallytoolStripMenuItem, + this.sortTextMaxLineLengthToolStripMenuItem, + this.sortTextTotalLengthToolStripMenuItem, + this.sortTextNumberOfLinesToolStripMenuItem, + this.textCharssecToolStripMenuItem, + this.textWordsPerMinutewpmToolStripMenuItem, + this.actorToolStripMenuItem, + this.styleToolStripMenuItem, + this.toolStripSeparatorAscOrDesc, + this.AscendingToolStripMenuItem, + this.descendingToolStripMenuItem}); + this.toolStripMenuItemSortBy.Name = "toolStripMenuItemSortBy"; + this.toolStripMenuItemSortBy.Size = new System.Drawing.Size(338, 22); + this.toolStripMenuItemSortBy.Text = "Sort by"; + // + // sortNumberToolStripMenuItem + // + this.sortNumberToolStripMenuItem.Name = "sortNumberToolStripMenuItem"; + this.sortNumberToolStripMenuItem.Size = new System.Drawing.Size(240, 22); + this.sortNumberToolStripMenuItem.Text = "Number"; + this.sortNumberToolStripMenuItem.Click += new System.EventHandler(this.SortNumberToolStripMenuItemClick); + // + // sortStartTimeToolStripMenuItem + // + this.sortStartTimeToolStripMenuItem.Name = "sortStartTimeToolStripMenuItem"; + this.sortStartTimeToolStripMenuItem.Size = new System.Drawing.Size(240, 22); + this.sortStartTimeToolStripMenuItem.Text = "Start time"; + this.sortStartTimeToolStripMenuItem.Click += new System.EventHandler(this.SortStartTimeToolStripMenuItemClick); + // + // sortEndTimeToolStripMenuItem + // + this.sortEndTimeToolStripMenuItem.Name = "sortEndTimeToolStripMenuItem"; + this.sortEndTimeToolStripMenuItem.Size = new System.Drawing.Size(240, 22); + this.sortEndTimeToolStripMenuItem.Text = "End time"; + this.sortEndTimeToolStripMenuItem.Click += new System.EventHandler(this.SortEndTimeToolStripMenuItemClick); + // + // sortDisplayTimeToolStripMenuItem + // + this.sortDisplayTimeToolStripMenuItem.Name = "sortDisplayTimeToolStripMenuItem"; + this.sortDisplayTimeToolStripMenuItem.Size = new System.Drawing.Size(240, 22); + this.sortDisplayTimeToolStripMenuItem.Text = "Duration"; + this.sortDisplayTimeToolStripMenuItem.Click += new System.EventHandler(this.SortDisplayTimeToolStripMenuItemClick); + // + // sortTextAlphabeticallytoolStripMenuItem + // + this.sortTextAlphabeticallytoolStripMenuItem.Name = "sortTextAlphabeticallytoolStripMenuItem"; + this.sortTextAlphabeticallytoolStripMenuItem.Size = new System.Drawing.Size(240, 22); + this.sortTextAlphabeticallytoolStripMenuItem.Text = "Text - alphabetically"; + this.sortTextAlphabeticallytoolStripMenuItem.Click += new System.EventHandler(this.SortTextAlphabeticallytoolStripMenuItemClick); + // + // sortTextMaxLineLengthToolStripMenuItem + // + this.sortTextMaxLineLengthToolStripMenuItem.Name = "sortTextMaxLineLengthToolStripMenuItem"; + this.sortTextMaxLineLengthToolStripMenuItem.Size = new System.Drawing.Size(240, 22); + this.sortTextMaxLineLengthToolStripMenuItem.Text = "Text - single line max. length"; + this.sortTextMaxLineLengthToolStripMenuItem.Click += new System.EventHandler(this.SortTextMaxLineLengthToolStripMenuItemClick); + // + // sortTextTotalLengthToolStripMenuItem + // + this.sortTextTotalLengthToolStripMenuItem.Name = "sortTextTotalLengthToolStripMenuItem"; + this.sortTextTotalLengthToolStripMenuItem.Size = new System.Drawing.Size(240, 22); + this.sortTextTotalLengthToolStripMenuItem.Text = "Text - total length"; + this.sortTextTotalLengthToolStripMenuItem.Click += new System.EventHandler(this.SortTextTotalLengthToolStripMenuItemClick); + // + // sortTextNumberOfLinesToolStripMenuItem + // + this.sortTextNumberOfLinesToolStripMenuItem.Name = "sortTextNumberOfLinesToolStripMenuItem"; + this.sortTextNumberOfLinesToolStripMenuItem.Size = new System.Drawing.Size(240, 22); + this.sortTextNumberOfLinesToolStripMenuItem.Text = "Text - number of lines"; + this.sortTextNumberOfLinesToolStripMenuItem.Click += new System.EventHandler(this.SortTextNumberOfLinesToolStripMenuItemClick); + // + // textCharssecToolStripMenuItem + // + this.textCharssecToolStripMenuItem.Name = "textCharssecToolStripMenuItem"; + this.textCharssecToolStripMenuItem.Size = new System.Drawing.Size(240, 22); + this.textCharssecToolStripMenuItem.Text = "Text - chars/sec"; + this.textCharssecToolStripMenuItem.Click += new System.EventHandler(this.textCharssecToolStripMenuItem_Click); + // + // textWordsPerMinutewpmToolStripMenuItem + // + this.textWordsPerMinutewpmToolStripMenuItem.Name = "textWordsPerMinutewpmToolStripMenuItem"; + this.textWordsPerMinutewpmToolStripMenuItem.Size = new System.Drawing.Size(240, 22); + this.textWordsPerMinutewpmToolStripMenuItem.Text = "Text - words per minute (wpm)"; + this.textWordsPerMinutewpmToolStripMenuItem.Click += new System.EventHandler(this.textWordsPerMinutewpmToolStripMenuItem_Click); + // + // actorToolStripMenuItem + // + this.actorToolStripMenuItem.Name = "actorToolStripMenuItem"; + this.actorToolStripMenuItem.Size = new System.Drawing.Size(240, 22); + this.actorToolStripMenuItem.Text = "Actor"; + this.actorToolStripMenuItem.Click += new System.EventHandler(this.actorToolStripMenuItemClick); + // + // styleToolStripMenuItem + // + this.styleToolStripMenuItem.Name = "styleToolStripMenuItem"; + this.styleToolStripMenuItem.Size = new System.Drawing.Size(240, 22); + this.styleToolStripMenuItem.Text = "Style"; + this.styleToolStripMenuItem.Click += new System.EventHandler(this.styleToolStripMenuItem_Click); + // + // toolStripSeparatorAscOrDesc + // + this.toolStripSeparatorAscOrDesc.Name = "toolStripSeparatorAscOrDesc"; + this.toolStripSeparatorAscOrDesc.Size = new System.Drawing.Size(237, 6); + // + // AscendingToolStripMenuItem + // + this.AscendingToolStripMenuItem.Checked = true; + this.AscendingToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; + this.AscendingToolStripMenuItem.Name = "AscendingToolStripMenuItem"; + this.AscendingToolStripMenuItem.Size = new System.Drawing.Size(240, 22); + this.AscendingToolStripMenuItem.Text = "Ascending"; + this.AscendingToolStripMenuItem.Click += new System.EventHandler(this.AscendingToolStripMenuItem_Click); + // + // descendingToolStripMenuItem + // + this.descendingToolStripMenuItem.Name = "descendingToolStripMenuItem"; + this.descendingToolStripMenuItem.Size = new System.Drawing.Size(240, 22); + this.descendingToolStripMenuItem.Text = "Descending"; + this.descendingToolStripMenuItem.Click += new System.EventHandler(this.descendingToolStripMenuItem_Click); + // + // netflixQualityCheckToolStripMenuItem + // + this.netflixQualityCheckToolStripMenuItem.Name = "netflixQualityCheckToolStripMenuItem"; + this.netflixQualityCheckToolStripMenuItem.Size = new System.Drawing.Size(338, 22); + this.netflixQualityCheckToolStripMenuItem.Text = "Netflix quality check"; + this.netflixQualityCheckToolStripMenuItem.Click += new System.EventHandler(this.netflixGlyphCheckToolStripMenuItem_Click); + // + // toolStripSeparator23 + // + this.toolStripSeparator23.Name = "toolStripSeparator23"; + this.toolStripSeparator23.Size = new System.Drawing.Size(335, 6); + // + // toolStripMenuItemMakeEmptyFromCurrent + // + this.toolStripMenuItemMakeEmptyFromCurrent.Name = "toolStripMenuItemMakeEmptyFromCurrent"; + this.toolStripMenuItemMakeEmptyFromCurrent.Size = new System.Drawing.Size(338, 22); + this.toolStripMenuItemMakeEmptyFromCurrent.Text = "Make new empty translation from current subtitle"; + this.toolStripMenuItemMakeEmptyFromCurrent.Click += new System.EventHandler(this.ToolStripMenuItemMakeEmptyFromCurrentClick); + // + // toolStripMenuItemBatchConvert + // + this.toolStripMenuItemBatchConvert.Name = "toolStripMenuItemBatchConvert"; + this.toolStripMenuItemBatchConvert.Size = new System.Drawing.Size(338, 22); + this.toolStripMenuItemBatchConvert.Text = "Batch convert..."; + this.toolStripMenuItemBatchConvert.Click += new System.EventHandler(this.toolStripMenuItemBatchConvert_Click); + // + // generateDatetimeInfoFromVideoToolStripMenuItem + // + this.generateDatetimeInfoFromVideoToolStripMenuItem.Name = "generateDatetimeInfoFromVideoToolStripMenuItem"; + this.generateDatetimeInfoFromVideoToolStripMenuItem.Size = new System.Drawing.Size(338, 22); + this.generateDatetimeInfoFromVideoToolStripMenuItem.Text = "Generate date/time info from video..."; + this.generateDatetimeInfoFromVideoToolStripMenuItem.Click += new System.EventHandler(this.generateDatetimeInfoFromVideoToolStripMenuItem_Click); + // + // toolStripMenuItemMeasurementConverter + // + this.toolStripMenuItemMeasurementConverter.Name = "toolStripMenuItemMeasurementConverter"; + this.toolStripMenuItemMeasurementConverter.Size = new System.Drawing.Size(338, 22); + this.toolStripMenuItemMeasurementConverter.Text = "Measurement converter..."; + this.toolStripMenuItemMeasurementConverter.Click += new System.EventHandler(this.toolStripMenuItemMeasurementConverter_Click); + // + // toolStripSeparator3 + // + this.toolStripSeparator3.Name = "toolStripSeparator3"; + this.toolStripSeparator3.Size = new System.Drawing.Size(335, 6); + // + // splitToolStripMenuItem + // + this.splitToolStripMenuItem.Name = "splitToolStripMenuItem"; + this.splitToolStripMenuItem.Size = new System.Drawing.Size(338, 22); + this.splitToolStripMenuItem.Text = "Split subtitle..."; + this.splitToolStripMenuItem.Click += new System.EventHandler(this.SplitToolStripMenuItemClick); + // + // appendTextVisuallyToolStripMenuItem + // + this.appendTextVisuallyToolStripMenuItem.Name = "appendTextVisuallyToolStripMenuItem"; + this.appendTextVisuallyToolStripMenuItem.Size = new System.Drawing.Size(338, 22); + this.appendTextVisuallyToolStripMenuItem.Text = "Append subtitle..."; + this.appendTextVisuallyToolStripMenuItem.Click += new System.EventHandler(this.AppendTextVisuallyToolStripMenuItemClick); + // + // joinSubtitlesToolStripMenuItem + // + this.joinSubtitlesToolStripMenuItem.Name = "joinSubtitlesToolStripMenuItem"; + this.joinSubtitlesToolStripMenuItem.Size = new System.Drawing.Size(338, 22); + this.joinSubtitlesToolStripMenuItem.Text = "Join subtitles..."; + this.joinSubtitlesToolStripMenuItem.Click += new System.EventHandler(this.joinSubtitlesToolStripMenuItem_Click); + // + // toolStripMenuItemSpellCheckMain + // + this.toolStripMenuItemSpellCheckMain.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.spellCheckToolStripMenuItem, + this.toolStripMenuItemSpellCheckFromCurrentLine, + this.findDoubleWordsToolStripMenuItem, + this.FindDoubleLinesToolStripMenuItem, + this.toolStripSeparator9, + this.GetDictionariesToolStripMenuItem, + this.addWordToNameListToolStripMenuItem}); + this.toolStripMenuItemSpellCheckMain.Name = "toolStripMenuItemSpellCheckMain"; + this.toolStripMenuItemSpellCheckMain.Size = new System.Drawing.Size(82, 20); + this.toolStripMenuItemSpellCheckMain.Text = "Spell check"; + this.toolStripMenuItemSpellCheckMain.DropDownOpening += new System.EventHandler(this.ToolStripMenuItemSpellCheckMainDropDownOpening); + // + // spellCheckToolStripMenuItem + // + this.spellCheckToolStripMenuItem.Name = "spellCheckToolStripMenuItem"; + this.spellCheckToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.S))); + this.spellCheckToolStripMenuItem.Size = new System.Drawing.Size(267, 22); + this.spellCheckToolStripMenuItem.Text = "Spell check..."; + this.spellCheckToolStripMenuItem.Click += new System.EventHandler(this.SpellCheckToolStripMenuItemClick); + // + // toolStripMenuItemSpellCheckFromCurrentLine + // + this.toolStripMenuItemSpellCheckFromCurrentLine.Name = "toolStripMenuItemSpellCheckFromCurrentLine"; + this.toolStripMenuItemSpellCheckFromCurrentLine.Size = new System.Drawing.Size(267, 22); + this.toolStripMenuItemSpellCheckFromCurrentLine.Text = "Spell check from current line..."; + this.toolStripMenuItemSpellCheckFromCurrentLine.Click += new System.EventHandler(this.toolStripMenuItemSpellCheckFromCurrentLine_Click); + // + // findDoubleWordsToolStripMenuItem + // + this.findDoubleWordsToolStripMenuItem.Name = "findDoubleWordsToolStripMenuItem"; + this.findDoubleWordsToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.D))); + this.findDoubleWordsToolStripMenuItem.Size = new System.Drawing.Size(267, 22); + this.findDoubleWordsToolStripMenuItem.Text = "Find double words"; + this.findDoubleWordsToolStripMenuItem.Click += new System.EventHandler(this.FindDoubleWordsToolStripMenuItemClick); + // + // FindDoubleLinesToolStripMenuItem + // + this.FindDoubleLinesToolStripMenuItem.Name = "FindDoubleLinesToolStripMenuItem"; + this.FindDoubleLinesToolStripMenuItem.Size = new System.Drawing.Size(267, 22); + this.FindDoubleLinesToolStripMenuItem.Text = "Find double lines"; + this.FindDoubleLinesToolStripMenuItem.Click += new System.EventHandler(this.FindDoubleLinesToolStripMenuItemClick); + // + // toolStripSeparator9 + // + this.toolStripSeparator9.Name = "toolStripSeparator9"; + this.toolStripSeparator9.Size = new System.Drawing.Size(264, 6); + // + // GetDictionariesToolStripMenuItem + // + this.GetDictionariesToolStripMenuItem.Name = "GetDictionariesToolStripMenuItem"; + this.GetDictionariesToolStripMenuItem.Size = new System.Drawing.Size(267, 22); + this.GetDictionariesToolStripMenuItem.Text = "Get dictionary..."; + this.GetDictionariesToolStripMenuItem.Click += new System.EventHandler(this.GetDictionariesToolStripMenuItem_Click); + // + // addWordToNameListToolStripMenuItem + // + this.addWordToNameListToolStripMenuItem.Name = "addWordToNameListToolStripMenuItem"; + this.addWordToNameListToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.L))); + this.addWordToNameListToolStripMenuItem.Size = new System.Drawing.Size(267, 22); + this.addWordToNameListToolStripMenuItem.Text = "Add word to names list"; + this.addWordToNameListToolStripMenuItem.Click += new System.EventHandler(this.AddWordToNameListToolStripMenuItemClick); + // + // toolStripMenuItemVideo + // + this.toolStripMenuItemVideo.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.openVideoToolStripMenuItem, + this.toolStripMenuItemOpenVideoFromUrl, + this.toolStripMenuItemOpenDvd, + this.toolStripMenuItemSetAudioTrack, + this.closeVideoToolStripMenuItem, + this.openSecondSubtitleToolStripMenuItem, + this.setVideoOffsetToolStripMenuItem, + this.smpteTimeModedropFrameToolStripMenuItem, + this.toolStripMenuItemImportChapters, + this.toolStripMenuItemImportSceneChanges, + this.toolStripMenuItemRemoveSceneChanges, + this.toolStripMenuItemAddWaveformBatch, + this.generateTextFromCurrentVideoToolStripMenuItem, + this.toolStripSeparator5, + this.showhideWaveformToolStripMenuItem, + this.showhideVideoToolStripMenuItem, + this.toolStripSeparator19, + this.undockVideoControlsToolStripMenuItem, + this.redockVideoControlsToolStripMenuItem}); + this.toolStripMenuItemVideo.Name = "toolStripMenuItemVideo"; + this.toolStripMenuItemVideo.Size = new System.Drawing.Size(50, 20); + this.toolStripMenuItemVideo.Text = "Video"; + this.toolStripMenuItemVideo.DropDownClosed += new System.EventHandler(this.ToolStripMenuItemVideoDropDownClosed); + this.toolStripMenuItemVideo.DropDownOpening += new System.EventHandler(this.ToolStripMenuItemVideoDropDownOpening); + // + // openVideoToolStripMenuItem + // + this.openVideoToolStripMenuItem.Name = "openVideoToolStripMenuItem"; + this.openVideoToolStripMenuItem.Size = new System.Drawing.Size(257, 22); + this.openVideoToolStripMenuItem.Text = "Open video..."; + this.openVideoToolStripMenuItem.Click += new System.EventHandler(this.buttonOpenVideo_Click); + // + // toolStripMenuItemOpenVideoFromUrl + // + this.toolStripMenuItemOpenVideoFromUrl.Name = "toolStripMenuItemOpenVideoFromUrl"; + this.toolStripMenuItemOpenVideoFromUrl.Size = new System.Drawing.Size(257, 22); + this.toolStripMenuItemOpenVideoFromUrl.Text = "Open video from url..."; + this.toolStripMenuItemOpenVideoFromUrl.Click += new System.EventHandler(this.toolStripMenuItemOpenVideoFromUrl_Click); + // + // toolStripMenuItemOpenDvd + // + this.toolStripMenuItemOpenDvd.Name = "toolStripMenuItemOpenDvd"; + this.toolStripMenuItemOpenDvd.Size = new System.Drawing.Size(257, 22); + this.toolStripMenuItemOpenDvd.Text = "Open DVD..."; + this.toolStripMenuItemOpenDvd.Click += new System.EventHandler(this.toolStripMenuItemOpenDvd_Click); + // + // toolStripMenuItemSetAudioTrack + // + this.toolStripMenuItemSetAudioTrack.Name = "toolStripMenuItemSetAudioTrack"; + this.toolStripMenuItemSetAudioTrack.Size = new System.Drawing.Size(257, 22); + this.toolStripMenuItemSetAudioTrack.Text = "Choose audio track"; + // + // closeVideoToolStripMenuItem + // + this.closeVideoToolStripMenuItem.Name = "closeVideoToolStripMenuItem"; + this.closeVideoToolStripMenuItem.Size = new System.Drawing.Size(257, 22); + this.closeVideoToolStripMenuItem.Text = "Close video"; + this.closeVideoToolStripMenuItem.Click += new System.EventHandler(this.CloseVideoToolStripMenuItemClick); + // + // openSecondSubtitleToolStripMenuItem + // + this.openSecondSubtitleToolStripMenuItem.Name = "openSecondSubtitleToolStripMenuItem"; + this.openSecondSubtitleToolStripMenuItem.Size = new System.Drawing.Size(257, 22); + this.openSecondSubtitleToolStripMenuItem.Text = "Open second subtitle..."; + this.openSecondSubtitleToolStripMenuItem.Click += new System.EventHandler(this.openSecondSubtitleToolStripMenuItem_Click); + // + // setVideoOffsetToolStripMenuItem + // + this.setVideoOffsetToolStripMenuItem.Name = "setVideoOffsetToolStripMenuItem"; + this.setVideoOffsetToolStripMenuItem.Size = new System.Drawing.Size(257, 22); + this.setVideoOffsetToolStripMenuItem.Text = "Set video offset..."; + this.setVideoOffsetToolStripMenuItem.Click += new System.EventHandler(this.setVideoOffsetToolStripMenuItem_Click); + // + // smpteTimeModedropFrameToolStripMenuItem + // + this.smpteTimeModedropFrameToolStripMenuItem.Name = "smpteTimeModedropFrameToolStripMenuItem"; + this.smpteTimeModedropFrameToolStripMenuItem.Size = new System.Drawing.Size(257, 22); + this.smpteTimeModedropFrameToolStripMenuItem.Text = "SMPTE timing (drop frame)"; + this.smpteTimeModedropFrameToolStripMenuItem.Click += new System.EventHandler(this.SmpteTimeModedropFrameToolStripMenuItem_Click); + // + // toolStripMenuItemImportChapters + // + this.toolStripMenuItemImportChapters.Name = "toolStripMenuItemImportChapters"; + this.toolStripMenuItemImportChapters.Size = new System.Drawing.Size(257, 22); + this.toolStripMenuItemImportChapters.Text = "Import chapters from video..."; + this.toolStripMenuItemImportChapters.Click += new System.EventHandler(this.toolStripMenuItemImportChapters_Click); + // + // toolStripMenuItemImportSceneChanges + // + this.toolStripMenuItemImportSceneChanges.Name = "toolStripMenuItemImportSceneChanges"; + this.toolStripMenuItemImportSceneChanges.Size = new System.Drawing.Size(257, 22); + this.toolStripMenuItemImportSceneChanges.Text = "Import scene changes..."; + this.toolStripMenuItemImportSceneChanges.Click += new System.EventHandler(this.toolStripMenuItemImportSceneChanges_Click); + // + // toolStripMenuItemRemoveSceneChanges + // + this.toolStripMenuItemRemoveSceneChanges.Name = "toolStripMenuItemRemoveSceneChanges"; + this.toolStripMenuItemRemoveSceneChanges.Size = new System.Drawing.Size(257, 22); + this.toolStripMenuItemRemoveSceneChanges.Text = "Remove scene changes"; + this.toolStripMenuItemRemoveSceneChanges.Click += new System.EventHandler(this.toolStripMenuItemRemoveSceneChanges_Click); + // + // toolStripMenuItemAddWaveformBatch + // + this.toolStripMenuItemAddWaveformBatch.Name = "toolStripMenuItemAddWaveformBatch"; + this.toolStripMenuItemAddWaveformBatch.Size = new System.Drawing.Size(257, 22); + this.toolStripMenuItemAddWaveformBatch.Text = "Add waveform batch..."; + this.toolStripMenuItemAddWaveformBatch.Click += new System.EventHandler(this.ToolStripMenuItemAddWaveformBatchClick); + // + // generateTextFromCurrentVideoToolStripMenuItem + // + this.generateTextFromCurrentVideoToolStripMenuItem.Name = "generateTextFromCurrentVideoToolStripMenuItem"; + this.generateTextFromCurrentVideoToolStripMenuItem.Size = new System.Drawing.Size(257, 22); + this.generateTextFromCurrentVideoToolStripMenuItem.Text = "Generate text from current video..."; + this.generateTextFromCurrentVideoToolStripMenuItem.Click += new System.EventHandler(this.generateTextFromCurrentVideoToolStripMenuItem_Click); + // + // toolStripSeparator5 + // + this.toolStripSeparator5.Name = "toolStripSeparator5"; + this.toolStripSeparator5.Size = new System.Drawing.Size(254, 6); + // + // showhideWaveformToolStripMenuItem + // + this.showhideWaveformToolStripMenuItem.Name = "showhideWaveformToolStripMenuItem"; + this.showhideWaveformToolStripMenuItem.Size = new System.Drawing.Size(257, 22); + this.showhideWaveformToolStripMenuItem.Text = "Show/hide waveform"; + this.showhideWaveformToolStripMenuItem.Click += new System.EventHandler(this.ShowhideWaveformToolStripMenuItemClick); + // + // showhideVideoToolStripMenuItem + // + this.showhideVideoToolStripMenuItem.Name = "showhideVideoToolStripMenuItem"; + this.showhideVideoToolStripMenuItem.Size = new System.Drawing.Size(257, 22); + this.showhideVideoToolStripMenuItem.Text = "Show/hide video"; + this.showhideVideoToolStripMenuItem.Click += new System.EventHandler(this.toolStripButtonToggleVideo_Click); + // + // toolStripSeparator19 + // + this.toolStripSeparator19.Name = "toolStripSeparator19"; + this.toolStripSeparator19.Size = new System.Drawing.Size(254, 6); + // + // undockVideoControlsToolStripMenuItem + // + this.undockVideoControlsToolStripMenuItem.Name = "undockVideoControlsToolStripMenuItem"; + this.undockVideoControlsToolStripMenuItem.Size = new System.Drawing.Size(257, 22); + this.undockVideoControlsToolStripMenuItem.Text = "Un-dock video controls"; + this.undockVideoControlsToolStripMenuItem.Click += new System.EventHandler(this.UndockVideoControlsToolStripMenuItemClick); + // + // redockVideoControlsToolStripMenuItem + // + this.redockVideoControlsToolStripMenuItem.Name = "redockVideoControlsToolStripMenuItem"; + this.redockVideoControlsToolStripMenuItem.Size = new System.Drawing.Size(257, 22); + this.redockVideoControlsToolStripMenuItem.Text = "Re-dock video controls"; + this.redockVideoControlsToolStripMenuItem.Visible = false; + this.redockVideoControlsToolStripMenuItem.Click += new System.EventHandler(this.RedockVideoControlsToolStripMenuItemClick); + // + // toolStripMenuItemSynchronization + // + this.toolStripMenuItemSynchronization.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItemAdjustAllTimes, + this.visualSyncToolStripMenuItem, + this.toolStripMenuItemPointSync, + this.pointSyncViaOtherSubtitleToolStripMenuItem, + this.toolStripMenuItemChangeFrameRate2, + this.changeSpeedInPercentToolStripMenuItem}); + this.toolStripMenuItemSynchronization.Name = "toolStripMenuItemSynchronization"; + this.toolStripMenuItemSynchronization.Size = new System.Drawing.Size(106, 20); + this.toolStripMenuItemSynchronization.Text = "Synchronization"; + // + // toolStripMenuItemAdjustAllTimes + // + this.toolStripMenuItemAdjustAllTimes.Name = "toolStripMenuItemAdjustAllTimes"; + this.toolStripMenuItemAdjustAllTimes.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.A))); + this.toolStripMenuItemAdjustAllTimes.Size = new System.Drawing.Size(324, 22); + this.toolStripMenuItemAdjustAllTimes.Text = "Adjust times (show earlier/later)..."; + this.toolStripMenuItemAdjustAllTimes.Click += new System.EventHandler(this.toolStripMenuItemAdjustAllTimes_Click); + // + // visualSyncToolStripMenuItem + // + this.visualSyncToolStripMenuItem.Name = "visualSyncToolStripMenuItem"; + this.visualSyncToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.V))); + this.visualSyncToolStripMenuItem.Size = new System.Drawing.Size(324, 22); + this.visualSyncToolStripMenuItem.Text = "Visual sync..."; + this.visualSyncToolStripMenuItem.Click += new System.EventHandler(this.VisualSyncToolStripMenuItemClick); + // + // toolStripMenuItemPointSync + // + this.toolStripMenuItemPointSync.Name = "toolStripMenuItemPointSync"; + this.toolStripMenuItemPointSync.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.P))); + this.toolStripMenuItemPointSync.Size = new System.Drawing.Size(324, 22); + this.toolStripMenuItemPointSync.Text = "Point sync..."; + this.toolStripMenuItemPointSync.Click += new System.EventHandler(this.toolStripMenuItemPointSync_Click); + // + // pointSyncViaOtherSubtitleToolStripMenuItem + // + this.pointSyncViaOtherSubtitleToolStripMenuItem.Name = "pointSyncViaOtherSubtitleToolStripMenuItem"; + this.pointSyncViaOtherSubtitleToolStripMenuItem.Size = new System.Drawing.Size(324, 22); + this.pointSyncViaOtherSubtitleToolStripMenuItem.Text = "Point sync via other subtitle..."; + this.pointSyncViaOtherSubtitleToolStripMenuItem.Click += new System.EventHandler(this.pointSyncViaOtherSubtitleToolStripMenuItem_Click); + // + // toolStripMenuItemChangeFrameRate2 + // + this.toolStripMenuItemChangeFrameRate2.Name = "toolStripMenuItemChangeFrameRate2"; + this.toolStripMenuItemChangeFrameRate2.Size = new System.Drawing.Size(324, 22); + this.toolStripMenuItemChangeFrameRate2.Text = "Change frame rate..."; + this.toolStripMenuItemChangeFrameRate2.Click += new System.EventHandler(this.ToolStripMenuItemChangeFrameRateClick); + // + // changeSpeedInPercentToolStripMenuItem + // + this.changeSpeedInPercentToolStripMenuItem.Name = "changeSpeedInPercentToolStripMenuItem"; + this.changeSpeedInPercentToolStripMenuItem.Size = new System.Drawing.Size(324, 22); + this.changeSpeedInPercentToolStripMenuItem.Text = "Change speed in percent..."; + this.changeSpeedInPercentToolStripMenuItem.Click += new System.EventHandler(this.changeSpeedInPercentToolStripMenuItem_Click); + // + // toolStripMenuItemAutoTranslate + // + this.toolStripMenuItemAutoTranslate.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.translatepoweredByMicrosoftToolStripMenuItem, + this.translateByGoogleToolStripMenuItem, + this.translateFromSwedishToDanishToolStripMenuItem}); + this.toolStripMenuItemAutoTranslate.Name = "toolStripMenuItemAutoTranslate"; + this.toolStripMenuItemAutoTranslate.Size = new System.Drawing.Size(94, 20); + this.toolStripMenuItemAutoTranslate.Text = "Auto-translate"; + this.toolStripMenuItemAutoTranslate.DropDownOpening += new System.EventHandler(this.toolStripMenuItemAutoTranslate_DropDownOpening); + // + // translatepoweredByMicrosoftToolStripMenuItem + // + this.translatepoweredByMicrosoftToolStripMenuItem.Name = "translatepoweredByMicrosoftToolStripMenuItem"; + this.translatepoweredByMicrosoftToolStripMenuItem.Size = new System.Drawing.Size(402, 22); + this.translatepoweredByMicrosoftToolStripMenuItem.Text = "Translate (powered by Microsoft)..."; + this.translatepoweredByMicrosoftToolStripMenuItem.Click += new System.EventHandler(this.translatepoweredByMicrosoftToolStripMenuItem_Click); + // + // translateByGoogleToolStripMenuItem + // + this.translateByGoogleToolStripMenuItem.Name = "translateByGoogleToolStripMenuItem"; + this.translateByGoogleToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.G))); + this.translateByGoogleToolStripMenuItem.Size = new System.Drawing.Size(402, 22); + this.translateByGoogleToolStripMenuItem.Text = "Translate (powered by Google)..."; + this.translateByGoogleToolStripMenuItem.Click += new System.EventHandler(this.TranslateByGoogleToolStripMenuItemClick); + // + // translateFromSwedishToDanishToolStripMenuItem + // + this.translateFromSwedishToDanishToolStripMenuItem.Name = "translateFromSwedishToDanishToolStripMenuItem"; + this.translateFromSwedishToDanishToolStripMenuItem.Size = new System.Drawing.Size(402, 22); + this.translateFromSwedishToDanishToolStripMenuItem.Text = "Translate from swedish to danish (powered by nikse.dk/mt)..."; + this.translateFromSwedishToDanishToolStripMenuItem.Click += new System.EventHandler(this.TranslateFromSwedishToDanishToolStripMenuItemClick); + // + // optionsToolStripMenuItem + // + this.optionsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.settingsToolStripMenuItem, + this.changeLanguageToolStripMenuItem}); + this.optionsToolStripMenuItem.Name = "optionsToolStripMenuItem"; + this.optionsToolStripMenuItem.Size = new System.Drawing.Size(61, 20); + this.optionsToolStripMenuItem.Text = "Options"; + // + // settingsToolStripMenuItem + // + this.settingsToolStripMenuItem.Name = "settingsToolStripMenuItem"; + this.settingsToolStripMenuItem.Size = new System.Drawing.Size(181, 22); + this.settingsToolStripMenuItem.Text = "Settings"; + this.settingsToolStripMenuItem.Click += new System.EventHandler(this.SettingsToolStripMenuItemClick); + // + // changeLanguageToolStripMenuItem + // + this.changeLanguageToolStripMenuItem.Name = "changeLanguageToolStripMenuItem"; + this.changeLanguageToolStripMenuItem.Size = new System.Drawing.Size(181, 22); + this.changeLanguageToolStripMenuItem.Text = "Change language..."; + this.changeLanguageToolStripMenuItem.Click += new System.EventHandler(this.ChangeLanguageToolStripMenuItemClick); + // + // toolStripMenuItemNetworking + // + this.toolStripMenuItemNetworking.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.startServerToolStripMenuItem, + this.joinSessionToolStripMenuItem, + this.chatToolStripMenuItem, + this.showSessionKeyLogToolStripMenuItem, + this.leaveSessionToolStripMenuItem}); + this.toolStripMenuItemNetworking.Name = "toolStripMenuItemNetworking"; + this.toolStripMenuItemNetworking.Size = new System.Drawing.Size(81, 20); + this.toolStripMenuItemNetworking.Text = "Networking"; + this.toolStripMenuItemNetworking.DropDownOpening += new System.EventHandler(this.toolStripMenuItemNetworking_DropDownOpening); + // + // startServerToolStripMenuItem + // + this.startServerToolStripMenuItem.Name = "startServerToolStripMenuItem"; + this.startServerToolStripMenuItem.Size = new System.Drawing.Size(217, 22); + this.startServerToolStripMenuItem.Text = "Start new session"; + this.startServerToolStripMenuItem.Click += new System.EventHandler(this.startServerToolStripMenuItem_Click); + // + // joinSessionToolStripMenuItem + // + this.joinSessionToolStripMenuItem.Name = "joinSessionToolStripMenuItem"; + this.joinSessionToolStripMenuItem.Size = new System.Drawing.Size(217, 22); + this.joinSessionToolStripMenuItem.Text = "Join session"; + this.joinSessionToolStripMenuItem.Click += new System.EventHandler(this.joinSessionToolStripMenuItem_Click); + // + // chatToolStripMenuItem + // + this.chatToolStripMenuItem.Name = "chatToolStripMenuItem"; + this.chatToolStripMenuItem.Size = new System.Drawing.Size(217, 22); + this.chatToolStripMenuItem.Text = "Chat"; + this.chatToolStripMenuItem.Click += new System.EventHandler(this.chatToolStripMenuItem_Click); + // + // showSessionKeyLogToolStripMenuItem + // + this.showSessionKeyLogToolStripMenuItem.Name = "showSessionKeyLogToolStripMenuItem"; + this.showSessionKeyLogToolStripMenuItem.Size = new System.Drawing.Size(217, 22); + this.showSessionKeyLogToolStripMenuItem.Text = "Show session info and log"; + this.showSessionKeyLogToolStripMenuItem.Click += new System.EventHandler(this.showSessionKeyLogToolStripMenuItem_Click); + // + // leaveSessionToolStripMenuItem + // + this.leaveSessionToolStripMenuItem.Name = "leaveSessionToolStripMenuItem"; + this.leaveSessionToolStripMenuItem.Size = new System.Drawing.Size(217, 22); + this.leaveSessionToolStripMenuItem.Text = "Leave session"; + this.leaveSessionToolStripMenuItem.Click += new System.EventHandler(this.LeaveSessionToolStripMenuItemClick); + // + // helpToolStripMenuItem + // + this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.checkForUpdatesToolStripMenuItem, + this.toolStripMenuItemSplitterCheckForUpdates, + this.helpToolStripMenuItem1, + this.aboutToolStripMenuItem}); + this.helpToolStripMenuItem.Name = "helpToolStripMenuItem"; + this.helpToolStripMenuItem.Size = new System.Drawing.Size(45, 20); + this.helpToolStripMenuItem.Text = "Help"; + this.helpToolStripMenuItem.DropDownClosed += new System.EventHandler(this.MenuClosed); + this.helpToolStripMenuItem.DropDownOpening += new System.EventHandler(this.MenuOpened); + // + // checkForUpdatesToolStripMenuItem + // + this.checkForUpdatesToolStripMenuItem.Name = "checkForUpdatesToolStripMenuItem"; + this.checkForUpdatesToolStripMenuItem.Size = new System.Drawing.Size(181, 22); + this.checkForUpdatesToolStripMenuItem.Text = "Check for updates..."; + this.checkForUpdatesToolStripMenuItem.Click += new System.EventHandler(this.checkForUpdatesToolStripMenuItem_Click); + // + // toolStripMenuItemSplitterCheckForUpdates + // + this.toolStripMenuItemSplitterCheckForUpdates.Name = "toolStripMenuItemSplitterCheckForUpdates"; + this.toolStripMenuItemSplitterCheckForUpdates.Size = new System.Drawing.Size(178, 6); + // + // helpToolStripMenuItem1 + // + this.helpToolStripMenuItem1.Name = "helpToolStripMenuItem1"; + this.helpToolStripMenuItem1.ShortcutKeys = System.Windows.Forms.Keys.F1; + this.helpToolStripMenuItem1.Size = new System.Drawing.Size(181, 22); + this.helpToolStripMenuItem1.Text = "Help"; + this.helpToolStripMenuItem1.Click += new System.EventHandler(this.HelpToolStripMenuItem1Click); + // + // aboutToolStripMenuItem + // + this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem"; + this.aboutToolStripMenuItem.Size = new System.Drawing.Size(181, 22); + this.aboutToolStripMenuItem.Text = "About"; + this.aboutToolStripMenuItem.Click += new System.EventHandler(this.AboutToolStripMenuItemClick); + // + // contextMenuStripListview + // + this.contextMenuStripListview.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.setStylesForSelectedLinesToolStripMenuItem, + this.setActorForSelectedLinesToolStripMenuItem, + this.toolStripMenuItemAssStyles, + this.toolStripMenuItemSetRegion, + this.toolStripMenuItemSetLanguage, + this.toolStripMenuItemWebVTT, + this.toolStripMenuItemPreview, + this.toolStripMenuItemDelete, + this.toolStripMenuItemInsertBefore, + this.toolStripMenuItemInsertAfter, + this.toolStripMenuItemInsertSubtitle, + this.toolStripMenuItemCopySourceText, + this.toolStripMenuItemColumn, + this.toolStripMenuItemBookmark, + this.toolStripSeparator7, + this.splitLineToolStripMenuItem, + this.toolStripMenuItemMergeLines, + this.toolStripMenuItemMergeDialog, + this.mergeBeforeToolStripMenuItem, + this.mergeAfterToolStripMenuItem, + this.toolStripSeparator4, + this.extendBeforeToolStripMenuItem, + this.extendAfterToolStripMenuItem, + this.toolStripSeparator8, + this.removeFormattinglToolStripMenuItem, + this.boldToolStripMenuItem, + this.italicToolStripMenuItem, + this.boxToolStripMenuItem, + this.underlineToolStripMenuItem, + this.colorToolStripMenuItem, + this.toolStripMenuItemFont, + this.toolStripMenuItemAlignment, + this.toolStripMenuItemSurroundWithMusicSymbols, + this.toolStripSeparator2, + this.toolStripMenuItemAutoBreakLines, + this.toolStripMenuItemUnbreakLines, + this.toolStripSeparatorBreakLines, + this.typeEffectToolStripMenuItem, + this.karokeeEffectToolStripMenuItem, + this.toolStripSeparatorAdvancedFunctions, + this.showSelectedLinesEarlierlaterToolStripMenuItem, + this.visualSyncSelectedLinesToolStripMenuItem, + this.toolStripMenuItemGoogleMicrosoftTranslateSelLine, + this.toolStripMenuItemTranslateSelected, + this.adjustDisplayTimeForSelectedLinesToolStripMenuItem, + this.fixCommonErrorsInSelectedLinesToolStripMenuItem, + this.changeCasingForSelectedLinesToolStripMenuItem, + this.toolStripMenuItemSaveSelectedLines}); + this.contextMenuStripListview.Name = "contextMenuStripListview"; + this.contextMenuStripListview.Size = new System.Drawing.Size(285, 964); + this.contextMenuStripListview.Closed += new System.Windows.Forms.ToolStripDropDownClosedEventHandler(this.MenuClosed); + this.contextMenuStripListview.Opening += new System.ComponentModel.CancelEventHandler(this.ContextMenuStripListviewOpening); + this.contextMenuStripListview.Opened += new System.EventHandler(this.MenuOpened); + // + // setStylesForSelectedLinesToolStripMenuItem + // + this.setStylesForSelectedLinesToolStripMenuItem.Name = "setStylesForSelectedLinesToolStripMenuItem"; + this.setStylesForSelectedLinesToolStripMenuItem.Size = new System.Drawing.Size(284, 22); + this.setStylesForSelectedLinesToolStripMenuItem.Text = "ASS: Set styles for selected lines..."; + // + // setActorForSelectedLinesToolStripMenuItem + // + this.setActorForSelectedLinesToolStripMenuItem.Name = "setActorForSelectedLinesToolStripMenuItem"; + this.setActorForSelectedLinesToolStripMenuItem.Size = new System.Drawing.Size(284, 22); + this.setActorForSelectedLinesToolStripMenuItem.Text = "ASS: Set styles for selected lines..."; + // + // toolStripMenuItemAssStyles + // + this.toolStripMenuItemAssStyles.Name = "toolStripMenuItemAssStyles"; + this.toolStripMenuItemAssStyles.Size = new System.Drawing.Size(284, 22); + this.toolStripMenuItemAssStyles.Text = "ASS: Styles..."; + this.toolStripMenuItemAssStyles.Click += new System.EventHandler(this.toolStripMenuItemAssStyles_Click); + // + // toolStripMenuItemSetRegion + // + this.toolStripMenuItemSetRegion.Name = "toolStripMenuItemSetRegion"; + this.toolStripMenuItemSetRegion.Size = new System.Drawing.Size(284, 22); + this.toolStripMenuItemSetRegion.Text = "Timed text - set region"; + // + // toolStripMenuItemSetLanguage + // + this.toolStripMenuItemSetLanguage.Name = "toolStripMenuItemSetLanguage"; + this.toolStripMenuItemSetLanguage.Size = new System.Drawing.Size(284, 22); + this.toolStripMenuItemSetLanguage.Text = "Timed text - set language"; + // + // toolStripMenuItemWebVTT + // + this.toolStripMenuItemWebVTT.Name = "toolStripMenuItemWebVTT"; + this.toolStripMenuItemWebVTT.Size = new System.Drawing.Size(284, 22); + this.toolStripMenuItemWebVTT.Text = "WebVTT voice"; + // + // toolStripMenuItemPreview + // + this.toolStripMenuItemPreview.Name = "toolStripMenuItemPreview"; + this.toolStripMenuItemPreview.Size = new System.Drawing.Size(284, 22); + this.toolStripMenuItemPreview.Text = "WebVTT browser preview"; + this.toolStripMenuItemPreview.Click += new System.EventHandler(this.toolStripMenuItemPreview_Click); + // + // toolStripMenuItemDelete + // + this.toolStripMenuItemDelete.Name = "toolStripMenuItemDelete"; + this.toolStripMenuItemDelete.Size = new System.Drawing.Size(284, 22); + this.toolStripMenuItemDelete.Text = "Delete"; + this.toolStripMenuItemDelete.Click += new System.EventHandler(this.ToolStripMenuItemDeleteClick); + // + // toolStripMenuItemInsertBefore + // + this.toolStripMenuItemInsertBefore.Name = "toolStripMenuItemInsertBefore"; + this.toolStripMenuItemInsertBefore.Size = new System.Drawing.Size(284, 22); + this.toolStripMenuItemInsertBefore.Text = "Insert before"; + this.toolStripMenuItemInsertBefore.Click += new System.EventHandler(this.ToolStripMenuItemInsertBeforeClick); + // + // toolStripMenuItemInsertAfter + // + this.toolStripMenuItemInsertAfter.Name = "toolStripMenuItemInsertAfter"; + this.toolStripMenuItemInsertAfter.Size = new System.Drawing.Size(284, 22); + this.toolStripMenuItemInsertAfter.Text = "Insert after"; + this.toolStripMenuItemInsertAfter.Click += new System.EventHandler(this.ToolStripMenuItemInsertAfterClick); + // + // toolStripMenuItemInsertSubtitle + // + this.toolStripMenuItemInsertSubtitle.Name = "toolStripMenuItemInsertSubtitle"; + this.toolStripMenuItemInsertSubtitle.Size = new System.Drawing.Size(284, 22); + this.toolStripMenuItemInsertSubtitle.Text = "Insert subtitle file after this line..."; + this.toolStripMenuItemInsertSubtitle.Click += new System.EventHandler(this.ToolStripMenuItemInsertSubtitleClick); + // + // toolStripMenuItemCopySourceText + // + this.toolStripMenuItemCopySourceText.Name = "toolStripMenuItemCopySourceText"; + this.toolStripMenuItemCopySourceText.Size = new System.Drawing.Size(284, 22); + this.toolStripMenuItemCopySourceText.Text = "Copy as text to clipboard"; + this.toolStripMenuItemCopySourceText.Click += new System.EventHandler(this.ToolStripMenuItemCopySourceTextClick); + // + // toolStripMenuItemColumn + // + this.toolStripMenuItemColumn.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.columnDeleteTextOnlyToolStripMenuItem, + this.toolStripMenuItemColumnDeleteText, + this.ShiftTextCellsDownToolStripMenuItem, + this.toolStripMenuItemInsertTextFromSub, + this.toolStripMenuItemColumnImportText, + this.toolStripMenuItemPasteSpecial, + this.copyOriginalTextToCurrentToolStripMenuItem, + this.moveTextUpToolStripMenuItem, + this.moveTextDownToolStripMenuItem}); + this.toolStripMenuItemColumn.Name = "toolStripMenuItemColumn"; + this.toolStripMenuItemColumn.Size = new System.Drawing.Size(284, 22); + this.toolStripMenuItemColumn.Text = "Column"; + this.toolStripMenuItemColumn.DropDownOpening += new System.EventHandler(this.toolStripMenuItemColumn_DropDownOpening); + // + // columnDeleteTextOnlyToolStripMenuItem + // + this.columnDeleteTextOnlyToolStripMenuItem.Name = "columnDeleteTextOnlyToolStripMenuItem"; + this.columnDeleteTextOnlyToolStripMenuItem.Size = new System.Drawing.Size(314, 22); + this.columnDeleteTextOnlyToolStripMenuItem.Text = "Delete text"; + this.columnDeleteTextOnlyToolStripMenuItem.Click += new System.EventHandler(this.columnDeleteTextOnlyToolStripMenuItem_Click); + // + // toolStripMenuItemColumnDeleteText + // + this.toolStripMenuItemColumnDeleteText.Name = "toolStripMenuItemColumnDeleteText"; + this.toolStripMenuItemColumnDeleteText.Size = new System.Drawing.Size(314, 22); + this.toolStripMenuItemColumnDeleteText.Text = "Delete text and shift text cells up"; + this.toolStripMenuItemColumnDeleteText.Click += new System.EventHandler(this.deleteAndShiftCellsUpToolStripMenuItem_Click); + // + // ShiftTextCellsDownToolStripMenuItem + // + this.ShiftTextCellsDownToolStripMenuItem.Name = "ShiftTextCellsDownToolStripMenuItem"; + this.ShiftTextCellsDownToolStripMenuItem.Size = new System.Drawing.Size(314, 22); + this.ShiftTextCellsDownToolStripMenuItem.Text = "Insert and shift text cells down"; + this.ShiftTextCellsDownToolStripMenuItem.Click += new System.EventHandler(this.ShiftTextCellsDownToolStripMenuItem_Click); + // + // toolStripMenuItemInsertTextFromSub + // + this.toolStripMenuItemInsertTextFromSub.Name = "toolStripMenuItemInsertTextFromSub"; + this.toolStripMenuItemInsertTextFromSub.Size = new System.Drawing.Size(314, 22); + this.toolStripMenuItemInsertTextFromSub.Text = "Insert text from subtitle and shift cells down..."; + this.toolStripMenuItemInsertTextFromSub.Click += new System.EventHandler(this.toolStripMenuItemInsertTextFromSub_Click); + // + // toolStripMenuItemColumnImportText + // + this.toolStripMenuItemColumnImportText.Name = "toolStripMenuItemColumnImportText"; + this.toolStripMenuItemColumnImportText.Size = new System.Drawing.Size(314, 22); + this.toolStripMenuItemColumnImportText.Text = "Import text and shift text cells down..."; + this.toolStripMenuItemColumnImportText.Click += new System.EventHandler(this.toolStripMenuItemColumnImportText_Click); + // + // toolStripMenuItemPasteSpecial + // + this.toolStripMenuItemPasteSpecial.Name = "toolStripMenuItemPasteSpecial"; + this.toolStripMenuItemPasteSpecial.Size = new System.Drawing.Size(314, 22); + this.toolStripMenuItemPasteSpecial.Text = "Paste from clipboard..."; + this.toolStripMenuItemPasteSpecial.Click += new System.EventHandler(this.toolStripMenuItemPasteSpecial_Click); + // + // copyOriginalTextToCurrentToolStripMenuItem + // + this.copyOriginalTextToCurrentToolStripMenuItem.Name = "copyOriginalTextToCurrentToolStripMenuItem"; + this.copyOriginalTextToCurrentToolStripMenuItem.Size = new System.Drawing.Size(314, 22); + this.copyOriginalTextToCurrentToolStripMenuItem.Text = "Copy original text to current"; + this.copyOriginalTextToCurrentToolStripMenuItem.Click += new System.EventHandler(this.copyOriginalTextToCurrentToolStripMenuItem_Click); + // + // moveTextUpToolStripMenuItem + // + this.moveTextUpToolStripMenuItem.Name = "moveTextUpToolStripMenuItem"; + this.moveTextUpToolStripMenuItem.Size = new System.Drawing.Size(314, 22); + this.moveTextUpToolStripMenuItem.Text = "Move text up"; + this.moveTextUpToolStripMenuItem.Click += new System.EventHandler(this.moveTextUpToolStripMenuItem_Click); + // + // moveTextDownToolStripMenuItem + // + this.moveTextDownToolStripMenuItem.Name = "moveTextDownToolStripMenuItem"; + this.moveTextDownToolStripMenuItem.Size = new System.Drawing.Size(314, 22); + this.moveTextDownToolStripMenuItem.Text = "Move text down"; + this.moveTextDownToolStripMenuItem.Click += new System.EventHandler(this.moveTextDownToolStripMenuItem_Click); + // + // toolStripMenuItemBookmark + // + this.toolStripMenuItemBookmark.Name = "toolStripMenuItemBookmark"; + this.toolStripMenuItemBookmark.Size = new System.Drawing.Size(284, 22); + this.toolStripMenuItemBookmark.Text = "Bookmark..."; + this.toolStripMenuItemBookmark.Click += new System.EventHandler(this.toolStripMenuItemBookmark_Click); + // + // toolStripSeparator7 + // + this.toolStripSeparator7.Name = "toolStripSeparator7"; + this.toolStripSeparator7.Size = new System.Drawing.Size(281, 6); + // + // splitLineToolStripMenuItem + // + this.splitLineToolStripMenuItem.Name = "splitLineToolStripMenuItem"; + this.splitLineToolStripMenuItem.Size = new System.Drawing.Size(284, 22); + this.splitLineToolStripMenuItem.Text = "Split"; + this.splitLineToolStripMenuItem.Click += new System.EventHandler(this.SplitLineToolStripMenuItemClick); + // + // toolStripMenuItemMergeLines + // + this.toolStripMenuItemMergeLines.Name = "toolStripMenuItemMergeLines"; + this.toolStripMenuItemMergeLines.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.M))); + this.toolStripMenuItemMergeLines.Size = new System.Drawing.Size(284, 22); + this.toolStripMenuItemMergeLines.Text = "Merge selected lines"; + this.toolStripMenuItemMergeLines.Click += new System.EventHandler(this.ToolStripMenuItemMergeLinesClick); + // + // toolStripMenuItemMergeDialog + // + this.toolStripMenuItemMergeDialog.Name = "toolStripMenuItemMergeDialog"; + this.toolStripMenuItemMergeDialog.Size = new System.Drawing.Size(284, 22); + this.toolStripMenuItemMergeDialog.Text = "Merge selected lines as dialog"; + this.toolStripMenuItemMergeDialog.Click += new System.EventHandler(this.ToolStripMenuItemMergeDialogClick); + // + // mergeBeforeToolStripMenuItem + // + this.mergeBeforeToolStripMenuItem.Name = "mergeBeforeToolStripMenuItem"; + this.mergeBeforeToolStripMenuItem.Size = new System.Drawing.Size(284, 22); + this.mergeBeforeToolStripMenuItem.Text = "Merge with line before"; + this.mergeBeforeToolStripMenuItem.Click += new System.EventHandler(this.MergeBeforeToolStripMenuItemClick); + // + // mergeAfterToolStripMenuItem + // + this.mergeAfterToolStripMenuItem.Name = "mergeAfterToolStripMenuItem"; + this.mergeAfterToolStripMenuItem.Size = new System.Drawing.Size(284, 22); + this.mergeAfterToolStripMenuItem.Text = "Merge with line after"; + this.mergeAfterToolStripMenuItem.Click += new System.EventHandler(this.MergeAfterToolStripMenuItemClick); + // + // toolStripSeparator4 + // + this.toolStripSeparator4.Name = "toolStripSeparator4"; + this.toolStripSeparator4.Size = new System.Drawing.Size(281, 6); + // + // extendBeforeToolStripMenuItem + // + this.extendBeforeToolStripMenuItem.Name = "extendBeforeToolStripMenuItem"; + this.extendBeforeToolStripMenuItem.Size = new System.Drawing.Size(284, 22); + this.extendBeforeToolStripMenuItem.Text = "Extend to line before"; + this.extendBeforeToolStripMenuItem.Click += new System.EventHandler(this.ExtendBeforeToolStripMenuItemClick); + // + // extendAfterToolStripMenuItem + // + this.extendAfterToolStripMenuItem.Name = "extendAfterToolStripMenuItem"; + this.extendAfterToolStripMenuItem.Size = new System.Drawing.Size(284, 22); + this.extendAfterToolStripMenuItem.Text = "Extend to line after"; + this.extendAfterToolStripMenuItem.Click += new System.EventHandler(this.ExtendAfterToolStripMenuItemClick); + // + // toolStripSeparator8 + // + this.toolStripSeparator8.Name = "toolStripSeparator8"; + this.toolStripSeparator8.Size = new System.Drawing.Size(281, 6); + // + // removeFormattinglToolStripMenuItem + // + this.removeFormattinglToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.removeAllFormattingsToolStripMenuItem, + this.removeBoldToolStripMenuItem, + this.removeItalicToolStripMenuItem, + this.removeUnderlineToolStripMenuItem, + this.removeColorToolStripMenuItem, + this.removeFontNameToolStripMenuItem, + this.removeAlignmentToolStripMenuItem}); + this.removeFormattinglToolStripMenuItem.Name = "removeFormattinglToolStripMenuItem"; + this.removeFormattinglToolStripMenuItem.Size = new System.Drawing.Size(284, 22); + this.removeFormattinglToolStripMenuItem.Text = "Remove formatting"; + // + // removeAllFormattingsToolStripMenuItem + // + this.removeAllFormattingsToolStripMenuItem.Name = "removeAllFormattingsToolStripMenuItem"; + this.removeAllFormattingsToolStripMenuItem.Size = new System.Drawing.Size(197, 22); + this.removeAllFormattingsToolStripMenuItem.Text = "Remove all formattings"; + this.removeAllFormattingsToolStripMenuItem.Click += new System.EventHandler(this.removeAllFormattingsToolStripMenuItem_Click); + // + // removeBoldToolStripMenuItem + // + this.removeBoldToolStripMenuItem.Name = "removeBoldToolStripMenuItem"; + this.removeBoldToolStripMenuItem.Size = new System.Drawing.Size(197, 22); + this.removeBoldToolStripMenuItem.Text = "Remove bold"; + this.removeBoldToolStripMenuItem.Click += new System.EventHandler(this.removeBoldToolStripMenuItem_Click); + // + // removeItalicToolStripMenuItem + // + this.removeItalicToolStripMenuItem.Name = "removeItalicToolStripMenuItem"; + this.removeItalicToolStripMenuItem.Size = new System.Drawing.Size(197, 22); + this.removeItalicToolStripMenuItem.Text = "Remove italic"; + this.removeItalicToolStripMenuItem.Click += new System.EventHandler(this.removeItalicToolStripMenuItem_Click); + // + // removeUnderlineToolStripMenuItem + // + this.removeUnderlineToolStripMenuItem.Name = "removeUnderlineToolStripMenuItem"; + this.removeUnderlineToolStripMenuItem.Size = new System.Drawing.Size(197, 22); + this.removeUnderlineToolStripMenuItem.Text = "Remove underline"; + this.removeUnderlineToolStripMenuItem.Click += new System.EventHandler(this.removeUnderlineToolStripMenuItem_Click); + // + // removeColorToolStripMenuItem + // + this.removeColorToolStripMenuItem.Name = "removeColorToolStripMenuItem"; + this.removeColorToolStripMenuItem.Size = new System.Drawing.Size(197, 22); + this.removeColorToolStripMenuItem.Text = "Remove color"; + this.removeColorToolStripMenuItem.Click += new System.EventHandler(this.removeColorToolStripMenuItem_Click); + // + // removeFontNameToolStripMenuItem + // + this.removeFontNameToolStripMenuItem.Name = "removeFontNameToolStripMenuItem"; + this.removeFontNameToolStripMenuItem.Size = new System.Drawing.Size(197, 22); + this.removeFontNameToolStripMenuItem.Text = "Remove font name"; + this.removeFontNameToolStripMenuItem.Click += new System.EventHandler(this.removeFontNameToolStripMenuItem_Click); + // + // removeAlignmentToolStripMenuItem + // + this.removeAlignmentToolStripMenuItem.Name = "removeAlignmentToolStripMenuItem"; + this.removeAlignmentToolStripMenuItem.Size = new System.Drawing.Size(197, 22); + this.removeAlignmentToolStripMenuItem.Text = "Remove alignment"; + this.removeAlignmentToolStripMenuItem.Click += new System.EventHandler(this.removeAlignmentToolStripMenuItem_Click); + // + // boldToolStripMenuItem + // + this.boldToolStripMenuItem.Name = "boldToolStripMenuItem"; + this.boldToolStripMenuItem.Size = new System.Drawing.Size(284, 22); + this.boldToolStripMenuItem.Text = "Bold"; + this.boldToolStripMenuItem.Click += new System.EventHandler(this.BoldToolStripMenuItemClick); + // + // italicToolStripMenuItem + // + this.italicToolStripMenuItem.Name = "italicToolStripMenuItem"; + this.italicToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.I))); + this.italicToolStripMenuItem.Size = new System.Drawing.Size(284, 22); + this.italicToolStripMenuItem.Text = "Italic"; + this.italicToolStripMenuItem.Click += new System.EventHandler(this.ItalicToolStripMenuItemClick); + // + // boxToolStripMenuItem + // + this.boxToolStripMenuItem.Name = "boxToolStripMenuItem"; + this.boxToolStripMenuItem.Size = new System.Drawing.Size(284, 22); + this.boxToolStripMenuItem.Text = "Box"; + this.boxToolStripMenuItem.Click += new System.EventHandler(this.boxToolStripMenuItem_Click); + // + // underlineToolStripMenuItem + // + this.underlineToolStripMenuItem.Name = "underlineToolStripMenuItem"; + this.underlineToolStripMenuItem.Size = new System.Drawing.Size(284, 22); + this.underlineToolStripMenuItem.Text = "Underline"; + this.underlineToolStripMenuItem.Click += new System.EventHandler(this.UnderlineToolStripMenuItemClick); + // + // colorToolStripMenuItem + // + this.colorToolStripMenuItem.Name = "colorToolStripMenuItem"; + this.colorToolStripMenuItem.Size = new System.Drawing.Size(284, 22); + this.colorToolStripMenuItem.Text = "Color..."; + this.colorToolStripMenuItem.Click += new System.EventHandler(this.ColorToolStripMenuItemClick); + // + // toolStripMenuItemFont + // + this.toolStripMenuItemFont.Name = "toolStripMenuItemFont"; + this.toolStripMenuItemFont.Size = new System.Drawing.Size(284, 22); + this.toolStripMenuItemFont.Text = "Font name..."; + this.toolStripMenuItemFont.Click += new System.EventHandler(this.toolStripMenuItemFont_Click); + // + // toolStripMenuItemAlignment + // + this.toolStripMenuItemAlignment.Name = "toolStripMenuItemAlignment"; + this.toolStripMenuItemAlignment.Size = new System.Drawing.Size(284, 22); + this.toolStripMenuItemAlignment.Text = "Alignment"; + this.toolStripMenuItemAlignment.Click += new System.EventHandler(this.toolStripMenuItemAlignment_Click); + // + // toolStripMenuItemSurroundWithMusicSymbols + // + this.toolStripMenuItemSurroundWithMusicSymbols.Name = "toolStripMenuItemSurroundWithMusicSymbols"; + this.toolStripMenuItemSurroundWithMusicSymbols.Size = new System.Drawing.Size(284, 22); + this.toolStripMenuItemSurroundWithMusicSymbols.Text = "♪"; + this.toolStripMenuItemSurroundWithMusicSymbols.Click += new System.EventHandler(this.ToolStripMenuItemSurroundWithMusicSymbolsClick); + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(281, 6); + // + // toolStripMenuItemAutoBreakLines + // + this.toolStripMenuItemAutoBreakLines.Name = "toolStripMenuItemAutoBreakLines"; + this.toolStripMenuItemAutoBreakLines.Size = new System.Drawing.Size(284, 22); + this.toolStripMenuItemAutoBreakLines.Text = "Auto balance selected lines..."; + this.toolStripMenuItemAutoBreakLines.Click += new System.EventHandler(this.ToolStripMenuItemAutoBreakLinesClick); + // + // toolStripMenuItemUnbreakLines + // + this.toolStripMenuItemUnbreakLines.Name = "toolStripMenuItemUnbreakLines"; + this.toolStripMenuItemUnbreakLines.Size = new System.Drawing.Size(284, 22); + this.toolStripMenuItemUnbreakLines.Text = "Remove line-breaks in selected lines..."; + this.toolStripMenuItemUnbreakLines.Click += new System.EventHandler(this.ToolStripMenuItemUnbreakLinesClick); + // + // toolStripSeparatorBreakLines + // + this.toolStripSeparatorBreakLines.Name = "toolStripSeparatorBreakLines"; + this.toolStripSeparatorBreakLines.Size = new System.Drawing.Size(281, 6); + // + // typeEffectToolStripMenuItem + // + this.typeEffectToolStripMenuItem.Name = "typeEffectToolStripMenuItem"; + this.typeEffectToolStripMenuItem.Size = new System.Drawing.Size(284, 22); + this.typeEffectToolStripMenuItem.Text = "Typewriter effect..."; + this.typeEffectToolStripMenuItem.Click += new System.EventHandler(this.TypeEffectToolStripMenuItemClick); + // + // karokeeEffectToolStripMenuItem + // + this.karokeeEffectToolStripMenuItem.Name = "karokeeEffectToolStripMenuItem"; + this.karokeeEffectToolStripMenuItem.Size = new System.Drawing.Size(284, 22); + this.karokeeEffectToolStripMenuItem.Text = "Karaoke effect..."; + this.karokeeEffectToolStripMenuItem.Click += new System.EventHandler(this.KarokeeEffectToolStripMenuItemClick); + // + // toolStripSeparatorAdvancedFunctions + // + this.toolStripSeparatorAdvancedFunctions.Name = "toolStripSeparatorAdvancedFunctions"; + this.toolStripSeparatorAdvancedFunctions.Size = new System.Drawing.Size(281, 6); + // + // showSelectedLinesEarlierlaterToolStripMenuItem + // + this.showSelectedLinesEarlierlaterToolStripMenuItem.Name = "showSelectedLinesEarlierlaterToolStripMenuItem"; + this.showSelectedLinesEarlierlaterToolStripMenuItem.Size = new System.Drawing.Size(284, 22); + this.showSelectedLinesEarlierlaterToolStripMenuItem.Text = "Show selected lines earlier/later..."; + this.showSelectedLinesEarlierlaterToolStripMenuItem.Click += new System.EventHandler(this.ShowSelectedLinesEarlierlaterToolStripMenuItemClick); + // + // visualSyncSelectedLinesToolStripMenuItem + // + this.visualSyncSelectedLinesToolStripMenuItem.Name = "visualSyncSelectedLinesToolStripMenuItem"; + this.visualSyncSelectedLinesToolStripMenuItem.Size = new System.Drawing.Size(284, 22); + this.visualSyncSelectedLinesToolStripMenuItem.Text = "Visual sync selected lines..."; + this.visualSyncSelectedLinesToolStripMenuItem.Click += new System.EventHandler(this.VisualSyncSelectedLinesToolStripMenuItemClick); + // + // toolStripMenuItemGoogleMicrosoftTranslateSelLine + // + this.toolStripMenuItemGoogleMicrosoftTranslateSelLine.Name = "toolStripMenuItemGoogleMicrosoftTranslateSelLine"; + this.toolStripMenuItemGoogleMicrosoftTranslateSelLine.Size = new System.Drawing.Size(284, 22); + this.toolStripMenuItemGoogleMicrosoftTranslateSelLine.Text = "Google/Microsoft translate selected line"; + this.toolStripMenuItemGoogleMicrosoftTranslateSelLine.Click += new System.EventHandler(this.ToolStripMenuItemGoogleMicrosoftTranslateSelLineClick); + // + // toolStripMenuItemTranslateSelected + // + this.toolStripMenuItemTranslateSelected.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.googleTranslateToolStripMenuItem, + this.microsoftBingTranslateToolStripMenuItem}); + this.toolStripMenuItemTranslateSelected.Name = "toolStripMenuItemTranslateSelected"; + this.toolStripMenuItemTranslateSelected.Size = new System.Drawing.Size(284, 22); + this.toolStripMenuItemTranslateSelected.Text = "Translate selected lines via..."; + // + // googleTranslateToolStripMenuItem + // + this.googleTranslateToolStripMenuItem.Name = "googleTranslateToolStripMenuItem"; + this.googleTranslateToolStripMenuItem.Size = new System.Drawing.Size(209, 22); + this.googleTranslateToolStripMenuItem.Text = "Google translate..."; + this.googleTranslateToolStripMenuItem.Click += new System.EventHandler(this.googleTranslateToolStripMenuItem_Click); + // + // microsoftBingTranslateToolStripMenuItem + // + this.microsoftBingTranslateToolStripMenuItem.Name = "microsoftBingTranslateToolStripMenuItem"; + this.microsoftBingTranslateToolStripMenuItem.Size = new System.Drawing.Size(209, 22); + this.microsoftBingTranslateToolStripMenuItem.Text = "Microsoft Bing translate..."; + this.microsoftBingTranslateToolStripMenuItem.Click += new System.EventHandler(this.microsoftBingTranslateToolStripMenuItem_Click); + // + // adjustDisplayTimeForSelectedLinesToolStripMenuItem + // + this.adjustDisplayTimeForSelectedLinesToolStripMenuItem.Name = "adjustDisplayTimeForSelectedLinesToolStripMenuItem"; + this.adjustDisplayTimeForSelectedLinesToolStripMenuItem.Size = new System.Drawing.Size(284, 22); + this.adjustDisplayTimeForSelectedLinesToolStripMenuItem.Text = "Adjust display time for selected lines..."; + this.adjustDisplayTimeForSelectedLinesToolStripMenuItem.Click += new System.EventHandler(this.AdjustDisplayTimeForSelectedLinesToolStripMenuItemClick); + // + // fixCommonErrorsInSelectedLinesToolStripMenuItem + // + this.fixCommonErrorsInSelectedLinesToolStripMenuItem.Name = "fixCommonErrorsInSelectedLinesToolStripMenuItem"; + this.fixCommonErrorsInSelectedLinesToolStripMenuItem.Size = new System.Drawing.Size(284, 22); + this.fixCommonErrorsInSelectedLinesToolStripMenuItem.Text = "Fix common errors in selected lines..."; + this.fixCommonErrorsInSelectedLinesToolStripMenuItem.Click += new System.EventHandler(this.FixCommonErrorsInSelectedLinesToolStripMenuItemClick); + // + // changeCasingForSelectedLinesToolStripMenuItem + // + this.changeCasingForSelectedLinesToolStripMenuItem.Name = "changeCasingForSelectedLinesToolStripMenuItem"; + this.changeCasingForSelectedLinesToolStripMenuItem.Size = new System.Drawing.Size(284, 22); + this.changeCasingForSelectedLinesToolStripMenuItem.Text = "Change casing for selected lines..."; + this.changeCasingForSelectedLinesToolStripMenuItem.Click += new System.EventHandler(this.ChangeCasingForSelectedLinesToolStripMenuItemClick); + // + // toolStripMenuItemSaveSelectedLines + // + this.toolStripMenuItemSaveSelectedLines.Name = "toolStripMenuItemSaveSelectedLines"; + this.toolStripMenuItemSaveSelectedLines.Size = new System.Drawing.Size(284, 22); + this.toolStripMenuItemSaveSelectedLines.Text = "Save selected lines as..."; + this.toolStripMenuItemSaveSelectedLines.Click += new System.EventHandler(this.ToolStripMenuItemSaveSelectedLinesClick); + // + // openFileDialog1 + // + this.openFileDialog1.FileName = "openFileDialog1"; + // + // timer1 + // + this.timer1.Tick += new System.EventHandler(this.timer1_Tick); + // + // groupBoxVideo + // + this.groupBoxVideo.Controls.Add(this.labelNextWord); + this.groupBoxVideo.Controls.Add(this.audioVisualizer); + this.groupBoxVideo.Controls.Add(this.checkBoxSyncListViewWithVideoWhilePlaying); + this.groupBoxVideo.Controls.Add(this.labelVideoInfo); + this.groupBoxVideo.Controls.Add(this.trackBarWaveformPosition); + this.groupBoxVideo.Controls.Add(this.panelWaveformControls); + this.groupBoxVideo.Controls.Add(this.tabControlButtons); + this.groupBoxVideo.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupBoxVideo.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.groupBoxVideo.Location = new System.Drawing.Point(0, 0); + this.groupBoxVideo.Margin = new System.Windows.Forms.Padding(0); + this.groupBoxVideo.Name = "groupBoxVideo"; + this.groupBoxVideo.Padding = new System.Windows.Forms.Padding(0); + this.groupBoxVideo.Size = new System.Drawing.Size(975, 305); + this.groupBoxVideo.TabIndex = 1; + this.groupBoxVideo.TabStop = false; + // + // labelNextWord + // + this.labelNextWord.Anchor = System.Windows.Forms.AnchorStyles.None; + this.labelNextWord.AutoSize = true; + this.labelNextWord.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelNextWord.Location = new System.Drawing.Point(401, 9); + this.labelNextWord.Name = "labelNextWord"; + this.labelNextWord.Size = new System.Drawing.Size(71, 17); + this.labelNextWord.TabIndex = 13; + this.labelNextWord.Text = "Next: xxx"; + this.labelNextWord.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // audioVisualizer + // + this.audioVisualizer.AllowDrop = true; + this.audioVisualizer.AllowNewSelection = true; + this.audioVisualizer.AllowOverlap = false; + this.audioVisualizer.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.audioVisualizer.BackColor = System.Drawing.Color.Black; + this.audioVisualizer.BackgroundColor = System.Drawing.Color.Black; + this.audioVisualizer.ClosenessForBorderSelection = 15; + this.audioVisualizer.Color = System.Drawing.Color.GreenYellow; + this.audioVisualizer.CursorColor = System.Drawing.Color.Empty; + this.audioVisualizer.ChaptersColor = System.Drawing.Color.Empty; + this.audioVisualizer.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F); + this.audioVisualizer.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(18))))); + this.audioVisualizer.InsertAtVideoPositionShortcut = System.Windows.Forms.Keys.Insert; + this.audioVisualizer.Location = new System.Drawing.Point(472, 32); + this.audioVisualizer.Margin = new System.Windows.Forms.Padding(0); + this.audioVisualizer.MouseWheelScrollUpIsForward = true; + this.audioVisualizer.Move100MsLeft = System.Windows.Forms.Keys.None; + this.audioVisualizer.Move100MsRight = System.Windows.Forms.Keys.None; + this.audioVisualizer.MoveOneSecondLeft = System.Windows.Forms.Keys.None; + this.audioVisualizer.MoveOneSecondRight = System.Windows.Forms.Keys.None; + this.audioVisualizer.Name = "audioVisualizer"; + this.audioVisualizer.NewSelectionParagraph = null; + this.audioVisualizer.ParagraphColor = System.Drawing.Color.LimeGreen; + this.audioVisualizer.SceneChanges = ((System.Collections.Generic.List)(resources.GetObject("audioVisualizer.SceneChanges"))); + this.audioVisualizer.SelectedColor = System.Drawing.Color.Red; + this.audioVisualizer.ShowGridLines = true; + this.audioVisualizer.ShowSpectrogram = false; + this.audioVisualizer.ShowWaveform = true; + this.audioVisualizer.Size = new System.Drawing.Size(499, 229); + this.audioVisualizer.StartPositionSeconds = 0D; + this.audioVisualizer.TabIndex = 6; + this.audioVisualizer.TextBold = true; + this.audioVisualizer.TextColor = System.Drawing.Color.Gray; + this.audioVisualizer.TextSize = 9F; + this.audioVisualizer.VerticalZoomFactor = 1D; + this.audioVisualizer.WaveformNotLoadedText = "Click to add waveform"; + this.audioVisualizer.WavePeaks = null; + this.audioVisualizer.ZoomFactor = 1D; + this.audioVisualizer.Click += new System.EventHandler(this.AudioWaveform_Click); + this.audioVisualizer.DragDrop += new System.Windows.Forms.DragEventHandler(this.AudioWaveformDragDrop); + this.audioVisualizer.DragEnter += new System.Windows.Forms.DragEventHandler(this.AudioWaveformDragEnter); + this.audioVisualizer.MouseEnter += new System.EventHandler(this.audioVisualizer_MouseEnter); + // + // checkBoxSyncListViewWithVideoWhilePlaying + // + this.checkBoxSyncListViewWithVideoWhilePlaying.AutoSize = true; + this.checkBoxSyncListViewWithVideoWhilePlaying.Location = new System.Drawing.Point(558, 11); + this.checkBoxSyncListViewWithVideoWhilePlaying.Name = "checkBoxSyncListViewWithVideoWhilePlaying"; + this.checkBoxSyncListViewWithVideoWhilePlaying.Size = new System.Drawing.Size(205, 17); + this.checkBoxSyncListViewWithVideoWhilePlaying.TabIndex = 1; + this.checkBoxSyncListViewWithVideoWhilePlaying.Text = "Sync listview with movie when playing"; + this.checkBoxSyncListViewWithVideoWhilePlaying.UseVisualStyleBackColor = true; + // + // labelVideoInfo + // + this.labelVideoInfo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.labelVideoInfo.Location = new System.Drawing.Point(603, 12); + this.labelVideoInfo.Name = "labelVideoInfo"; + this.labelVideoInfo.Size = new System.Drawing.Size(369, 19); + this.labelVideoInfo.TabIndex = 12; + this.labelVideoInfo.Text = "No video file loaded"; + this.labelVideoInfo.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // trackBarWaveformPosition + // + this.trackBarWaveformPosition.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.trackBarWaveformPosition.AutoSize = false; + this.trackBarWaveformPosition.Location = new System.Drawing.Point(674, 267); + this.trackBarWaveformPosition.Maximum = 1000; + this.trackBarWaveformPosition.Name = "trackBarWaveformPosition"; + this.trackBarWaveformPosition.Size = new System.Drawing.Size(297, 20); + this.trackBarWaveformPosition.TabIndex = 11; + this.trackBarWaveformPosition.TickStyle = System.Windows.Forms.TickStyle.None; + this.trackBarWaveformPosition.ValueChanged += new System.EventHandler(this.trackBarWaveformPosition_ValueChanged); + this.trackBarWaveformPosition.KeyDown += new System.Windows.Forms.KeyEventHandler(this.trackBarWaveformPosition_KeyDown); + // + // panelWaveformControls + // + this.panelWaveformControls.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.panelWaveformControls.Controls.Add(this.toolStripWaveControls); + this.panelWaveformControls.Location = new System.Drawing.Point(474, 265); + this.panelWaveformControls.Name = "panelWaveformControls"; + this.panelWaveformControls.Size = new System.Drawing.Size(205, 30); + this.panelWaveformControls.TabIndex = 10; + // + // toolStripWaveControls + // + this.toolStripWaveControls.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.toolStripWaveControls.Dock = System.Windows.Forms.DockStyle.None; + this.toolStripWaveControls.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; + this.toolStripWaveControls.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripButtonWaveformZoomOut, + this.toolStripComboBoxWaveform, + this.toolStripButtonWaveformZoomIn, + this.toolStripSeparator16, + this.toolStripButtonWaveformPause, + this.toolStripButtonWaveformPlay, + this.toolStripButtonLockCenter, + this.toolStripSplitButtonPlayRate}); + this.toolStripWaveControls.Location = new System.Drawing.Point(0, 3); + this.toolStripWaveControls.Name = "toolStripWaveControls"; + this.toolStripWaveControls.Size = new System.Drawing.Size(197, 25); + this.toolStripWaveControls.TabIndex = 0; + this.toolStripWaveControls.Text = "toolStrip2"; + // + // toolStripButtonWaveformZoomOut + // + this.toolStripButtonWaveformZoomOut.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButtonWaveformZoomOut.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonWaveformZoomOut.Image"))); + this.toolStripButtonWaveformZoomOut.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButtonWaveformZoomOut.Name = "toolStripButtonWaveformZoomOut"; + this.toolStripButtonWaveformZoomOut.Size = new System.Drawing.Size(23, 22); + this.toolStripButtonWaveformZoomOut.Text = "toolStripButton3"; + this.toolStripButtonWaveformZoomOut.Click += new System.EventHandler(this.toolStripButtonWaveformZoomOut_Click); + // + // toolStripComboBoxWaveform + // + this.toolStripComboBoxWaveform.AutoSize = false; + this.toolStripComboBoxWaveform.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.toolStripComboBoxWaveform.Name = "toolStripComboBoxWaveform"; + this.toolStripComboBoxWaveform.Size = new System.Drawing.Size(62, 23); + // + // toolStripButtonWaveformZoomIn + // + this.toolStripButtonWaveformZoomIn.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButtonWaveformZoomIn.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonWaveformZoomIn.Image"))); + this.toolStripButtonWaveformZoomIn.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButtonWaveformZoomIn.Name = "toolStripButtonWaveformZoomIn"; + this.toolStripButtonWaveformZoomIn.Size = new System.Drawing.Size(23, 22); + this.toolStripButtonWaveformZoomIn.Text = "toolStripButton1"; + this.toolStripButtonWaveformZoomIn.Click += new System.EventHandler(this.toolStripButtonWaveformZoomIn_Click); + // + // toolStripSeparator16 + // + this.toolStripSeparator16.Name = "toolStripSeparator16"; + this.toolStripSeparator16.Size = new System.Drawing.Size(6, 25); + // + // toolStripButtonWaveformPause + // + this.toolStripButtonWaveformPause.AutoToolTip = false; + this.toolStripButtonWaveformPause.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButtonWaveformPause.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonWaveformPause.Image"))); + this.toolStripButtonWaveformPause.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButtonWaveformPause.Name = "toolStripButtonWaveformPause"; + this.toolStripButtonWaveformPause.Size = new System.Drawing.Size(23, 22); + this.toolStripButtonWaveformPause.Text = "toolStripButton1"; + this.toolStripButtonWaveformPause.Visible = false; + this.toolStripButtonWaveformPause.Click += new System.EventHandler(this.toolStripButtonWaveformPause_Click); + // + // toolStripButtonWaveformPlay + // + this.toolStripButtonWaveformPlay.AutoToolTip = false; + this.toolStripButtonWaveformPlay.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButtonWaveformPlay.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonWaveformPlay.Image"))); + this.toolStripButtonWaveformPlay.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButtonWaveformPlay.Name = "toolStripButtonWaveformPlay"; + this.toolStripButtonWaveformPlay.Size = new System.Drawing.Size(23, 22); + this.toolStripButtonWaveformPlay.Text = "toolStripButton1"; + this.toolStripButtonWaveformPlay.Click += new System.EventHandler(this.toolStripButtonWaveformPlay_Click); + // + // toolStripButtonLockCenter + // + this.toolStripButtonLockCenter.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButtonLockCenter.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonLockCenter.Image"))); + this.toolStripButtonLockCenter.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButtonLockCenter.Name = "toolStripButtonLockCenter"; + this.toolStripButtonLockCenter.Size = new System.Drawing.Size(23, 22); + this.toolStripButtonLockCenter.Text = "Center"; + this.toolStripButtonLockCenter.Click += new System.EventHandler(this.toolStripButtonLockCenter_Click); + // + // toolStripSplitButtonPlayRate + // + this.toolStripSplitButtonPlayRate.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripSplitButtonPlayRate.Image = ((System.Drawing.Image)(resources.GetObject("toolStripSplitButtonPlayRate.Image"))); + this.toolStripSplitButtonPlayRate.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripSplitButtonPlayRate.Name = "toolStripSplitButtonPlayRate"; + this.toolStripSplitButtonPlayRate.Size = new System.Drawing.Size(32, 22); + this.toolStripSplitButtonPlayRate.Text = "Play rate (speed)"; + this.toolStripSplitButtonPlayRate.ButtonClick += new System.EventHandler(this.toolStripSplitButtonPlayRate_ButtonClick); + // + // tabControlButtons + // + this.tabControlButtons.Controls.Add(this.tabPageTranslate); + this.tabControlButtons.Controls.Add(this.tabPageCreate); + this.tabControlButtons.Controls.Add(this.tabPageAdjust); + this.tabControlButtons.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed; + this.tabControlButtons.Location = new System.Drawing.Point(6, 12); + this.tabControlButtons.Name = "tabControlButtons"; + this.tabControlButtons.SelectedIndex = 0; + this.tabControlButtons.Size = new System.Drawing.Size(467, 283); + this.tabControlButtons.TabIndex = 0; + this.tabControlButtons.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.TabControlButtonsDrawItem); + this.tabControlButtons.SelectedIndexChanged += new System.EventHandler(this.tabControl1_SelectedIndexChanged); + // + // tabPageTranslate + // + this.tabPageTranslate.Controls.Add(this.labelTranslateTip); + this.tabPageTranslate.Controls.Add(this.groupBoxTranslateSearch); + this.tabPageTranslate.Controls.Add(this.groupBoxAutoContinue); + this.tabPageTranslate.Controls.Add(this.buttonStop); + this.tabPageTranslate.Controls.Add(this.groupBoxAutoRepeat); + this.tabPageTranslate.Controls.Add(this.buttonPlayPrevious); + this.tabPageTranslate.Controls.Add(this.buttonPlayCurrent); + this.tabPageTranslate.Controls.Add(this.buttonPlayNext); + this.tabPageTranslate.Location = new System.Drawing.Point(4, 22); + this.tabPageTranslate.Name = "tabPageTranslate"; + this.tabPageTranslate.Padding = new System.Windows.Forms.Padding(3); + this.tabPageTranslate.Size = new System.Drawing.Size(459, 257); + this.tabPageTranslate.TabIndex = 0; + this.tabPageTranslate.Text = "Translate"; + this.tabPageTranslate.UseVisualStyleBackColor = true; + // + // labelTranslateTip + // + this.labelTranslateTip.AutoSize = true; + this.labelTranslateTip.ForeColor = System.Drawing.Color.Gray; + this.labelTranslateTip.Location = new System.Drawing.Point(16, 225); + this.labelTranslateTip.Name = "labelTranslateTip"; + this.labelTranslateTip.Size = new System.Drawing.Size(294, 13); + this.labelTranslateTip.TabIndex = 7; + this.labelTranslateTip.Text = "Tip: Use to go to previous/next subtitle"; + // + // groupBoxTranslateSearch + // + this.groupBoxTranslateSearch.Controls.Add(this.buttonCustomUrl2); + this.groupBoxTranslateSearch.Controls.Add(this.buttonCustomUrl1); + this.groupBoxTranslateSearch.Controls.Add(this.buttonGoogleTranslateIt); + this.groupBoxTranslateSearch.Controls.Add(this.buttonGoogleIt); + this.groupBoxTranslateSearch.Controls.Add(this.textBoxSearchWord); + this.groupBoxTranslateSearch.Location = new System.Drawing.Point(198, 68); + this.groupBoxTranslateSearch.Name = "groupBoxTranslateSearch"; + this.groupBoxTranslateSearch.Size = new System.Drawing.Size(256, 150); + this.groupBoxTranslateSearch.TabIndex = 6; + this.groupBoxTranslateSearch.TabStop = false; + this.groupBoxTranslateSearch.Text = "Search text online"; + // + // buttonCustomUrl2 + // + this.buttonCustomUrl2.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCustomUrl2.Location = new System.Drawing.Point(6, 118); + this.buttonCustomUrl2.Name = "buttonCustomUrl2"; + this.buttonCustomUrl2.Size = new System.Drawing.Size(244, 23); + this.buttonCustomUrl2.TabIndex = 4; + this.buttonCustomUrl2.Text = "Custom URL"; + this.buttonCustomUrl2.UseVisualStyleBackColor = true; + this.buttonCustomUrl2.Click += new System.EventHandler(this.buttonCustomUrl2_Click); + // + // buttonCustomUrl1 + // + this.buttonCustomUrl1.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCustomUrl1.Location = new System.Drawing.Point(6, 91); + this.buttonCustomUrl1.Name = "buttonCustomUrl1"; + this.buttonCustomUrl1.Size = new System.Drawing.Size(244, 23); + this.buttonCustomUrl1.TabIndex = 3; + this.buttonCustomUrl1.Text = "Custom URL"; + this.buttonCustomUrl1.UseVisualStyleBackColor = true; + this.buttonCustomUrl1.Click += new System.EventHandler(this.buttonCustomUrl_Click); + // + // buttonGoogleTranslateIt + // + this.buttonGoogleTranslateIt.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonGoogleTranslateIt.Location = new System.Drawing.Point(132, 63); + this.buttonGoogleTranslateIt.Name = "buttonGoogleTranslateIt"; + this.buttonGoogleTranslateIt.Size = new System.Drawing.Size(118, 23); + this.buttonGoogleTranslateIt.TabIndex = 2; + this.buttonGoogleTranslateIt.Text = "Google translate it"; + this.buttonGoogleTranslateIt.UseVisualStyleBackColor = true; + this.buttonGoogleTranslateIt.Click += new System.EventHandler(this.buttonGoogleTranslateIt_Click); + // + // buttonGoogleIt + // + this.buttonGoogleIt.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonGoogleIt.Location = new System.Drawing.Point(6, 63); + this.buttonGoogleIt.Name = "buttonGoogleIt"; + this.buttonGoogleIt.Size = new System.Drawing.Size(120, 23); + this.buttonGoogleIt.TabIndex = 1; + this.buttonGoogleIt.Text = "Google it"; + this.buttonGoogleIt.UseVisualStyleBackColor = true; + this.buttonGoogleIt.Click += new System.EventHandler(this.buttonGoogleIt_Click); + // + // textBoxSearchWord + // + this.textBoxSearchWord.Location = new System.Drawing.Point(6, 18); + this.textBoxSearchWord.Multiline = true; + this.textBoxSearchWord.Name = "textBoxSearchWord"; + this.textBoxSearchWord.Size = new System.Drawing.Size(244, 39); + this.textBoxSearchWord.TabIndex = 0; + // + // groupBoxAutoContinue + // + this.groupBoxAutoContinue.Controls.Add(this.comboBoxAutoContinue); + this.groupBoxAutoContinue.Controls.Add(this.labelAutoContinueDelay); + this.groupBoxAutoContinue.Controls.Add(this.checkBoxAutoContinue); + this.groupBoxAutoContinue.Location = new System.Drawing.Point(12, 120); + this.groupBoxAutoContinue.Name = "groupBoxAutoContinue"; + this.groupBoxAutoContinue.Size = new System.Drawing.Size(182, 98); + this.groupBoxAutoContinue.TabIndex = 1; + this.groupBoxAutoContinue.TabStop = false; + this.groupBoxAutoContinue.Text = "Auto continue"; + // + // comboBoxAutoContinue + // + this.comboBoxAutoContinue.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxAutoContinue.FormattingEnabled = true; + this.comboBoxAutoContinue.Items.AddRange(new object[] { + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15"}); + this.comboBoxAutoContinue.Location = new System.Drawing.Point(6, 59); + this.comboBoxAutoContinue.Name = "comboBoxAutoContinue"; + this.comboBoxAutoContinue.Size = new System.Drawing.Size(96, 21); + this.comboBoxAutoContinue.TabIndex = 2; + // + // labelAutoContinueDelay + // + this.labelAutoContinueDelay.AutoSize = true; + this.labelAutoContinueDelay.Location = new System.Drawing.Point(7, 43); + this.labelAutoContinueDelay.Name = "labelAutoContinueDelay"; + this.labelAutoContinueDelay.Size = new System.Drawing.Size(83, 13); + this.labelAutoContinueDelay.TabIndex = 1; + this.labelAutoContinueDelay.Text = "Delay (seconds)"; + // + // checkBoxAutoContinue + // + this.checkBoxAutoContinue.AutoSize = true; + this.checkBoxAutoContinue.Location = new System.Drawing.Point(10, 19); + this.checkBoxAutoContinue.Name = "checkBoxAutoContinue"; + this.checkBoxAutoContinue.Size = new System.Drawing.Size(107, 17); + this.checkBoxAutoContinue.TabIndex = 0; + this.checkBoxAutoContinue.Text = "Auto continue on"; + this.checkBoxAutoContinue.UseVisualStyleBackColor = true; + // + // buttonStop + // + this.buttonStop.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonStop.Location = new System.Drawing.Point(288, 42); + this.buttonStop.Name = "buttonStop"; + this.buttonStop.Size = new System.Drawing.Size(76, 23); + this.buttonStop.TabIndex = 5; + this.buttonStop.Text = "Pa&use"; + this.buttonStop.UseVisualStyleBackColor = true; + this.buttonStop.Click += new System.EventHandler(this.buttonStop_Click); + // + // groupBoxAutoRepeat + // + this.groupBoxAutoRepeat.Controls.Add(this.comboBoxAutoRepeat); + this.groupBoxAutoRepeat.Controls.Add(this.labelAutoRepeatCount); + this.groupBoxAutoRepeat.Controls.Add(this.checkBoxAutoRepeatOn); + this.groupBoxAutoRepeat.Location = new System.Drawing.Point(12, 14); + this.groupBoxAutoRepeat.Name = "groupBoxAutoRepeat"; + this.groupBoxAutoRepeat.Size = new System.Drawing.Size(182, 100); + this.groupBoxAutoRepeat.TabIndex = 0; + this.groupBoxAutoRepeat.TabStop = false; + this.groupBoxAutoRepeat.Text = "Auto repeat"; + // + // comboBoxAutoRepeat + // + this.comboBoxAutoRepeat.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxAutoRepeat.FormattingEnabled = true; + this.comboBoxAutoRepeat.Items.AddRange(new object[] { + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9"}); + this.comboBoxAutoRepeat.Location = new System.Drawing.Point(6, 60); + this.comboBoxAutoRepeat.Name = "comboBoxAutoRepeat"; + this.comboBoxAutoRepeat.Size = new System.Drawing.Size(96, 21); + this.comboBoxAutoRepeat.TabIndex = 2; + // + // labelAutoRepeatCount + // + this.labelAutoRepeatCount.AutoSize = true; + this.labelAutoRepeatCount.Location = new System.Drawing.Point(6, 44); + this.labelAutoRepeatCount.Name = "labelAutoRepeatCount"; + this.labelAutoRepeatCount.Size = new System.Drawing.Size(105, 13); + this.labelAutoRepeatCount.TabIndex = 1; + this.labelAutoRepeatCount.Text = "Repeat count (times)"; + // + // checkBoxAutoRepeatOn + // + this.checkBoxAutoRepeatOn.AutoSize = true; + this.checkBoxAutoRepeatOn.Checked = true; + this.checkBoxAutoRepeatOn.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxAutoRepeatOn.Location = new System.Drawing.Point(10, 19); + this.checkBoxAutoRepeatOn.Name = "checkBoxAutoRepeatOn"; + this.checkBoxAutoRepeatOn.Size = new System.Drawing.Size(96, 17); + this.checkBoxAutoRepeatOn.TabIndex = 0; + this.checkBoxAutoRepeatOn.Text = "Auto repeat on"; + this.checkBoxAutoRepeatOn.UseVisualStyleBackColor = true; + // + // buttonPlayPrevious + // + this.buttonPlayPrevious.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonPlayPrevious.Location = new System.Drawing.Point(206, 14); + this.buttonPlayPrevious.Name = "buttonPlayPrevious"; + this.buttonPlayPrevious.Size = new System.Drawing.Size(76, 23); + this.buttonPlayPrevious.TabIndex = 2; + this.buttonPlayPrevious.Text = "<< Previous"; + this.buttonPlayPrevious.UseVisualStyleBackColor = true; + this.buttonPlayPrevious.Click += new System.EventHandler(this.buttonPlayPrevious_Click); + // + // buttonPlayCurrent + // + this.buttonPlayCurrent.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonPlayCurrent.Location = new System.Drawing.Point(288, 14); + this.buttonPlayCurrent.Name = "buttonPlayCurrent"; + this.buttonPlayCurrent.Size = new System.Drawing.Size(76, 23); + this.buttonPlayCurrent.TabIndex = 3; + this.buttonPlayCurrent.Text = "&Play current"; + this.buttonPlayCurrent.UseVisualStyleBackColor = true; + this.buttonPlayCurrent.Click += new System.EventHandler(this.ButtonPlayCurrentClick); + // + // buttonPlayNext + // + this.buttonPlayNext.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonPlayNext.Location = new System.Drawing.Point(369, 14); + this.buttonPlayNext.Name = "buttonPlayNext"; + this.buttonPlayNext.Size = new System.Drawing.Size(76, 23); + this.buttonPlayNext.TabIndex = 4; + this.buttonPlayNext.Text = "Next >>"; + this.buttonPlayNext.UseVisualStyleBackColor = true; + this.buttonPlayNext.Click += new System.EventHandler(this.buttonPlayNext_Click); + // + // tabPageCreate + // + this.tabPageCreate.Controls.Add(this.timeUpDownVideoPosition); + this.tabPageCreate.Controls.Add(this.buttonGotoSub); + this.tabPageCreate.Controls.Add(this.buttonBeforeText); + this.tabPageCreate.Controls.Add(this.buttonSetEnd); + this.tabPageCreate.Controls.Add(this.buttonInsertNewText); + this.tabPageCreate.Controls.Add(this.buttonSetStartTime); + this.tabPageCreate.Controls.Add(this.labelCreateF12); + this.tabPageCreate.Controls.Add(this.labelCreateF11); + this.tabPageCreate.Controls.Add(this.labelCreateF10); + this.tabPageCreate.Controls.Add(this.labelCreateF9); + this.tabPageCreate.Controls.Add(this.buttonForward2); + this.tabPageCreate.Controls.Add(this.numericUpDownSec2); + this.tabPageCreate.Controls.Add(this.buttonSecBack2); + this.tabPageCreate.Controls.Add(this.buttonForward1); + this.tabPageCreate.Controls.Add(this.numericUpDownSec1); + this.tabPageCreate.Controls.Add(this.labelVideoPosition); + this.tabPageCreate.Controls.Add(this.buttonSecBack1); + this.tabPageCreate.Location = new System.Drawing.Point(4, 22); + this.tabPageCreate.Name = "tabPageCreate"; + this.tabPageCreate.Padding = new System.Windows.Forms.Padding(3); + this.tabPageCreate.Size = new System.Drawing.Size(459, 257); + this.tabPageCreate.TabIndex = 1; + this.tabPageCreate.Text = "Create"; + this.tabPageCreate.UseVisualStyleBackColor = true; + // + // timeUpDownVideoPosition + // + this.timeUpDownVideoPosition.AutoSize = true; + this.timeUpDownVideoPosition.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.timeUpDownVideoPosition.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F); + this.timeUpDownVideoPosition.Location = new System.Drawing.Point(96, 191); + this.timeUpDownVideoPosition.Margin = new System.Windows.Forms.Padding(4); + this.timeUpDownVideoPosition.Name = "timeUpDownVideoPosition"; + this.timeUpDownVideoPosition.Size = new System.Drawing.Size(111, 27); + this.timeUpDownVideoPosition.TabIndex = 12; + timeCode4.Hours = 0; + timeCode4.Milliseconds = 0; + timeCode4.Minutes = 0; + timeCode4.Seconds = 0; + timeCode4.TimeSpan = System.TimeSpan.Parse("00:00:00"); + timeCode4.TotalMilliseconds = 0D; + timeCode4.TotalSeconds = 0D; + this.timeUpDownVideoPosition.TimeCode = timeCode4; + this.timeUpDownVideoPosition.UseVideoOffset = false; + // + // buttonGotoSub + // + this.buttonGotoSub.Location = new System.Drawing.Point(6, 58); + this.buttonGotoSub.Name = "buttonGotoSub"; + this.buttonGotoSub.Size = new System.Drawing.Size(180, 23); + this.buttonGotoSub.TabIndex = 2; + this.buttonGotoSub.Text = "Goto subposition and pause"; + this.buttonGotoSub.UseVisualStyleBackColor = true; + this.buttonGotoSub.Click += new System.EventHandler(this.buttonGotoSub_Click); + this.buttonGotoSub.MouseEnter += new System.EventHandler(this.buttonGotoSub_MouseEnter); + // + // buttonBeforeText + // + this.buttonBeforeText.Location = new System.Drawing.Point(6, 32); + this.buttonBeforeText.Name = "buttonBeforeText"; + this.buttonBeforeText.Size = new System.Drawing.Size(180, 23); + this.buttonBeforeText.TabIndex = 1; + this.buttonBeforeText.Text = "Play from just before &text"; + this.buttonBeforeText.UseVisualStyleBackColor = true; + this.buttonBeforeText.Click += new System.EventHandler(this.buttonBeforeText_Click); + this.buttonBeforeText.MouseEnter += new System.EventHandler(this.buttonBeforeText_MouseEnter); + // + // buttonSetEnd + // + this.buttonSetEnd.Location = new System.Drawing.Point(6, 110); + this.buttonSetEnd.Name = "buttonSetEnd"; + this.buttonSetEnd.Size = new System.Drawing.Size(180, 23); + this.buttonSetEnd.TabIndex = 4; + this.buttonSetEnd.Text = "Set &end time"; + this.buttonSetEnd.UseVisualStyleBackColor = true; + this.buttonSetEnd.Click += new System.EventHandler(this.ButtonSetEndClick); + this.buttonSetEnd.MouseEnter += new System.EventHandler(this.buttonSetEnd_MouseEnter); + // + // buttonInsertNewText + // + this.buttonInsertNewText.Location = new System.Drawing.Point(6, 6); + this.buttonInsertNewText.Name = "buttonInsertNewText"; + this.buttonInsertNewText.Size = new System.Drawing.Size(180, 23); + this.buttonInsertNewText.TabIndex = 0; + this.buttonInsertNewText.Text = "&Insert new subtitle at vpos"; + this.buttonInsertNewText.UseVisualStyleBackColor = true; + this.buttonInsertNewText.Click += new System.EventHandler(this.ButtonInsertNewTextClick); + this.buttonInsertNewText.MouseEnter += new System.EventHandler(this.buttonInsertNewText_MouseEnter); + // + // buttonSetStartTime + // + this.buttonSetStartTime.Location = new System.Drawing.Point(6, 84); + this.buttonSetStartTime.Name = "buttonSetStartTime"; + this.buttonSetStartTime.Size = new System.Drawing.Size(180, 23); + this.buttonSetStartTime.TabIndex = 3; + this.buttonSetStartTime.Text = "Set &start time"; + this.buttonSetStartTime.UseVisualStyleBackColor = true; + this.buttonSetStartTime.Click += new System.EventHandler(this.buttonSetStartTime_Click); + this.buttonSetStartTime.MouseEnter += new System.EventHandler(this.buttonSetStartTime_MouseEnter); + // + // labelCreateF12 + // + this.labelCreateF12.AutoSize = true; + this.labelCreateF12.ForeColor = System.Drawing.Color.Gray; + this.labelCreateF12.Location = new System.Drawing.Point(188, 114); + this.labelCreateF12.Name = "labelCreateF12"; + this.labelCreateF12.Size = new System.Drawing.Size(25, 13); + this.labelCreateF12.TabIndex = 65; + this.labelCreateF12.Text = "F12"; + // + // labelCreateF11 + // + this.labelCreateF11.AutoSize = true; + this.labelCreateF11.ForeColor = System.Drawing.Color.Gray; + this.labelCreateF11.Location = new System.Drawing.Point(188, 88); + this.labelCreateF11.Name = "labelCreateF11"; + this.labelCreateF11.Size = new System.Drawing.Size(25, 13); + this.labelCreateF11.TabIndex = 64; + this.labelCreateF11.Text = "F11"; + // + // labelCreateF10 + // + this.labelCreateF10.AutoSize = true; + this.labelCreateF10.ForeColor = System.Drawing.Color.Gray; + this.labelCreateF10.Location = new System.Drawing.Point(188, 36); + this.labelCreateF10.Name = "labelCreateF10"; + this.labelCreateF10.Size = new System.Drawing.Size(25, 13); + this.labelCreateF10.TabIndex = 63; + this.labelCreateF10.Text = "F10"; + // + // labelCreateF9 + // + this.labelCreateF9.AutoSize = true; + this.labelCreateF9.ForeColor = System.Drawing.Color.Gray; + this.labelCreateF9.Location = new System.Drawing.Point(188, 10); + this.labelCreateF9.Name = "labelCreateF9"; + this.labelCreateF9.Size = new System.Drawing.Size(19, 13); + this.labelCreateF9.TabIndex = 62; + this.labelCreateF9.Text = "F9"; + // + // buttonForward2 + // + this.buttonForward2.Location = new System.Drawing.Point(130, 163); + this.buttonForward2.Name = "buttonForward2"; + this.buttonForward2.Size = new System.Drawing.Size(56, 23); + this.buttonForward2.TabIndex = 10; + this.buttonForward2.Text = " >>"; + this.buttonForward2.UseVisualStyleBackColor = true; + this.buttonForward2.Click += new System.EventHandler(this.buttonForward2_Click); + // + // numericUpDownSec2 + // + this.numericUpDownSec2.DecimalPlaces = 3; + this.numericUpDownSec2.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.numericUpDownSec2.Location = new System.Drawing.Point(66, 164); + this.numericUpDownSec2.Maximum = new decimal(new int[] { + 60, + 0, + 0, + 0}); + this.numericUpDownSec2.Name = "numericUpDownSec2"; + this.numericUpDownSec2.Size = new System.Drawing.Size(58, 20); + this.numericUpDownSec2.TabIndex = 9; + this.numericUpDownSec2.Value = new decimal(new int[] { + 5000, + 0, + 0, + 196608}); + this.numericUpDownSec2.ValueChanged += new System.EventHandler(this.NumericUpDownSec2ValueChanged); + // + // buttonSecBack2 + // + this.buttonSecBack2.Location = new System.Drawing.Point(6, 163); + this.buttonSecBack2.Name = "buttonSecBack2"; + this.buttonSecBack2.Size = new System.Drawing.Size(56, 23); + this.buttonSecBack2.TabIndex = 8; + this.buttonSecBack2.Text = "<<"; + this.buttonSecBack2.UseVisualStyleBackColor = true; + this.buttonSecBack2.Click += new System.EventHandler(this.buttonSecBack2_Click); + // + // buttonForward1 + // + this.buttonForward1.Location = new System.Drawing.Point(130, 137); + this.buttonForward1.Name = "buttonForward1"; + this.buttonForward1.Size = new System.Drawing.Size(56, 23); + this.buttonForward1.TabIndex = 7; + this.buttonForward1.Text = ">>"; + this.buttonForward1.UseVisualStyleBackColor = true; + this.buttonForward1.Click += new System.EventHandler(this.buttonForward1_Click); + // + // numericUpDownSec1 + // + this.numericUpDownSec1.DecimalPlaces = 3; + this.numericUpDownSec1.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.numericUpDownSec1.Location = new System.Drawing.Point(66, 138); + this.numericUpDownSec1.Maximum = new decimal(new int[] { + 60, + 0, + 0, + 0}); + this.numericUpDownSec1.Name = "numericUpDownSec1"; + this.numericUpDownSec1.Size = new System.Drawing.Size(58, 20); + this.numericUpDownSec1.TabIndex = 6; + this.numericUpDownSec1.Value = new decimal(new int[] { + 500, + 0, + 0, + 196608}); + this.numericUpDownSec1.ValueChanged += new System.EventHandler(this.NumericUpDownSec1ValueChanged); + // + // labelVideoPosition + // + this.labelVideoPosition.AutoSize = true; + this.labelVideoPosition.Location = new System.Drawing.Point(6, 196); + this.labelVideoPosition.Name = "labelVideoPosition"; + this.labelVideoPosition.Size = new System.Drawing.Size(76, 13); + this.labelVideoPosition.TabIndex = 11; + this.labelVideoPosition.Text = "Video position:"; + this.labelVideoPosition.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // buttonSecBack1 + // + this.buttonSecBack1.Location = new System.Drawing.Point(6, 137); + this.buttonSecBack1.Name = "buttonSecBack1"; + this.buttonSecBack1.Size = new System.Drawing.Size(56, 23); + this.buttonSecBack1.TabIndex = 5; + this.buttonSecBack1.Text = "<<"; + this.buttonSecBack1.UseVisualStyleBackColor = true; + this.buttonSecBack1.Click += new System.EventHandler(this.buttonSecBack1_Click); + // + // tabPageAdjust + // + this.tabPageAdjust.Controls.Add(this.timeUpDownVideoPositionAdjust); + this.tabPageAdjust.Controls.Add(this.buttonAdjustSetEndTime); + this.tabPageAdjust.Controls.Add(this.buttonSetEndAndGoToNext); + this.tabPageAdjust.Controls.Add(this.buttonSetStartAndOffsetRest); + this.tabPageAdjust.Controls.Add(this.buttonAdjustSetStartTime); + this.tabPageAdjust.Controls.Add(this.labelAdjustF12); + this.tabPageAdjust.Controls.Add(this.labelAdjustF11); + this.tabPageAdjust.Controls.Add(this.labelAdjustF10); + this.tabPageAdjust.Controls.Add(this.labelAdjustF9); + this.tabPageAdjust.Controls.Add(this.buttonAdjustSecForward2); + this.tabPageAdjust.Controls.Add(this.numericUpDownSecAdjust2); + this.tabPageAdjust.Controls.Add(this.buttonAdjustSecBack2); + this.tabPageAdjust.Controls.Add(this.buttonAdjustSecForward1); + this.tabPageAdjust.Controls.Add(this.numericUpDownSecAdjust1); + this.tabPageAdjust.Controls.Add(this.buttonAdjustSecBack1); + this.tabPageAdjust.Controls.Add(this.labelVideoPosition2); + this.tabPageAdjust.Controls.Add(this.buttonAdjustGoToPosAndPause); + this.tabPageAdjust.Controls.Add(this.buttonAdjustPlayBefore); + this.tabPageAdjust.Location = new System.Drawing.Point(4, 22); + this.tabPageAdjust.Name = "tabPageAdjust"; + this.tabPageAdjust.Size = new System.Drawing.Size(459, 257); + this.tabPageAdjust.TabIndex = 2; + this.tabPageAdjust.Text = "Adjust"; + this.tabPageAdjust.UseVisualStyleBackColor = true; + // + // timeUpDownVideoPositionAdjust + // + this.timeUpDownVideoPositionAdjust.AutoSize = true; + this.timeUpDownVideoPositionAdjust.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.timeUpDownVideoPositionAdjust.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F); + this.timeUpDownVideoPositionAdjust.Location = new System.Drawing.Point(96, 213); + this.timeUpDownVideoPositionAdjust.Margin = new System.Windows.Forms.Padding(4); + this.timeUpDownVideoPositionAdjust.Name = "timeUpDownVideoPositionAdjust"; + this.timeUpDownVideoPositionAdjust.Size = new System.Drawing.Size(111, 27); + this.timeUpDownVideoPositionAdjust.TabIndex = 13; + timeCode5.Hours = 0; + timeCode5.Milliseconds = 0; + timeCode5.Minutes = 0; + timeCode5.Seconds = 0; + timeCode5.TimeSpan = System.TimeSpan.Parse("00:00:00"); + timeCode5.TotalMilliseconds = 0D; + timeCode5.TotalSeconds = 0D; + this.timeUpDownVideoPositionAdjust.TimeCode = timeCode5; + this.timeUpDownVideoPositionAdjust.UseVideoOffset = false; + // + // buttonAdjustSetEndTime + // + this.buttonAdjustSetEndTime.Location = new System.Drawing.Point(6, 84); + this.buttonAdjustSetEndTime.Name = "buttonAdjustSetEndTime"; + this.buttonAdjustSetEndTime.Size = new System.Drawing.Size(180, 23); + this.buttonAdjustSetEndTime.TabIndex = 3; + this.buttonAdjustSetEndTime.Text = "Set end time"; + this.buttonAdjustSetEndTime.UseVisualStyleBackColor = true; + this.buttonAdjustSetEndTime.Click += new System.EventHandler(this.ButtonSetEndClick); + this.buttonAdjustSetEndTime.MouseEnter += new System.EventHandler(this.buttonAdjustSetEndTime_MouseEnter); + // + // buttonSetEndAndGoToNext + // + this.buttonSetEndAndGoToNext.Location = new System.Drawing.Point(6, 32); + this.buttonSetEndAndGoToNext.Name = "buttonSetEndAndGoToNext"; + this.buttonSetEndAndGoToNext.Size = new System.Drawing.Size(180, 23); + this.buttonSetEndAndGoToNext.TabIndex = 1; + this.buttonSetEndAndGoToNext.Text = "Set e&nd && goto next"; + this.buttonSetEndAndGoToNext.UseVisualStyleBackColor = true; + this.buttonSetEndAndGoToNext.Click += new System.EventHandler(this.ButtonSetEndAndGoToNextClick); + this.buttonSetEndAndGoToNext.MouseEnter += new System.EventHandler(this.buttonSetEndAndGoToNext_MouseEnter); + // + // buttonSetStartAndOffsetRest + // + this.buttonSetStartAndOffsetRest.Location = new System.Drawing.Point(6, 6); + this.buttonSetStartAndOffsetRest.Name = "buttonSetStartAndOffsetRest"; + this.buttonSetStartAndOffsetRest.Size = new System.Drawing.Size(180, 23); + this.buttonSetStartAndOffsetRest.TabIndex = 0; + this.buttonSetStartAndOffsetRest.Text = "Set sta&rt and offset the rest"; + this.buttonSetStartAndOffsetRest.UseVisualStyleBackColor = true; + this.buttonSetStartAndOffsetRest.Click += new System.EventHandler(this.ButtonSetStartAndOffsetRestClick); + this.buttonSetStartAndOffsetRest.MouseEnter += new System.EventHandler(this.buttonSetStartAndOffsetRest_MouseEnter); + // + // buttonAdjustSetStartTime + // + this.buttonAdjustSetStartTime.Location = new System.Drawing.Point(6, 58); + this.buttonAdjustSetStartTime.Name = "buttonAdjustSetStartTime"; + this.buttonAdjustSetStartTime.Size = new System.Drawing.Size(180, 23); + this.buttonAdjustSetStartTime.TabIndex = 2; + this.buttonAdjustSetStartTime.Text = "Set start time"; + this.buttonAdjustSetStartTime.UseVisualStyleBackColor = true; + this.buttonAdjustSetStartTime.Click += new System.EventHandler(this.buttonSetStartTime_Click); + this.buttonAdjustSetStartTime.MouseEnter += new System.EventHandler(this.buttonAdjustSetStartTime_MouseEnter); + // + // labelAdjustF12 + // + this.labelAdjustF12.AutoSize = true; + this.labelAdjustF12.ForeColor = System.Drawing.Color.Gray; + this.labelAdjustF12.Location = new System.Drawing.Point(188, 88); + this.labelAdjustF12.Name = "labelAdjustF12"; + this.labelAdjustF12.Size = new System.Drawing.Size(25, 13); + this.labelAdjustF12.TabIndex = 64; + this.labelAdjustF12.Text = "F12"; + // + // labelAdjustF11 + // + this.labelAdjustF11.AutoSize = true; + this.labelAdjustF11.ForeColor = System.Drawing.Color.Gray; + this.labelAdjustF11.Location = new System.Drawing.Point(188, 62); + this.labelAdjustF11.Name = "labelAdjustF11"; + this.labelAdjustF11.Size = new System.Drawing.Size(25, 13); + this.labelAdjustF11.TabIndex = 63; + this.labelAdjustF11.Text = "F11"; + // + // labelAdjustF10 + // + this.labelAdjustF10.AutoSize = true; + this.labelAdjustF10.ForeColor = System.Drawing.Color.Gray; + this.labelAdjustF10.Location = new System.Drawing.Point(188, 36); + this.labelAdjustF10.Name = "labelAdjustF10"; + this.labelAdjustF10.Size = new System.Drawing.Size(25, 13); + this.labelAdjustF10.TabIndex = 62; + this.labelAdjustF10.Text = "F10"; + // + // labelAdjustF9 + // + this.labelAdjustF9.AutoSize = true; + this.labelAdjustF9.ForeColor = System.Drawing.Color.Gray; + this.labelAdjustF9.Location = new System.Drawing.Point(188, 10); + this.labelAdjustF9.Name = "labelAdjustF9"; + this.labelAdjustF9.Size = new System.Drawing.Size(19, 13); + this.labelAdjustF9.TabIndex = 61; + this.labelAdjustF9.Text = "F9"; + // + // buttonAdjustSecForward2 + // + this.buttonAdjustSecForward2.Location = new System.Drawing.Point(130, 188); + this.buttonAdjustSecForward2.Name = "buttonAdjustSecForward2"; + this.buttonAdjustSecForward2.Size = new System.Drawing.Size(56, 23); + this.buttonAdjustSecForward2.TabIndex = 11; + this.buttonAdjustSecForward2.Text = ">>"; + this.buttonAdjustSecForward2.UseVisualStyleBackColor = true; + this.buttonAdjustSecForward2.Click += new System.EventHandler(this.buttonAdjustSecForward2_Click); + // + // numericUpDownSecAdjust2 + // + this.numericUpDownSecAdjust2.DecimalPlaces = 3; + this.numericUpDownSecAdjust2.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.numericUpDownSecAdjust2.Location = new System.Drawing.Point(66, 189); + this.numericUpDownSecAdjust2.Maximum = new decimal(new int[] { + 60, + 0, + 0, + 0}); + this.numericUpDownSecAdjust2.Name = "numericUpDownSecAdjust2"; + this.numericUpDownSecAdjust2.Size = new System.Drawing.Size(58, 20); + this.numericUpDownSecAdjust2.TabIndex = 10; + this.numericUpDownSecAdjust2.Value = new decimal(new int[] { + 5000, + 0, + 0, + 196608}); + this.numericUpDownSecAdjust2.ValueChanged += new System.EventHandler(this.NumericUpDownSecAdjust2ValueChanged); + // + // buttonAdjustSecBack2 + // + this.buttonAdjustSecBack2.Location = new System.Drawing.Point(6, 188); + this.buttonAdjustSecBack2.Name = "buttonAdjustSecBack2"; + this.buttonAdjustSecBack2.Size = new System.Drawing.Size(56, 23); + this.buttonAdjustSecBack2.TabIndex = 9; + this.buttonAdjustSecBack2.Text = "<<"; + this.buttonAdjustSecBack2.UseVisualStyleBackColor = true; + this.buttonAdjustSecBack2.Click += new System.EventHandler(this.buttonAdjustSecBack2_Click); + // + // buttonAdjustSecForward1 + // + this.buttonAdjustSecForward1.Location = new System.Drawing.Point(130, 162); + this.buttonAdjustSecForward1.Name = "buttonAdjustSecForward1"; + this.buttonAdjustSecForward1.Size = new System.Drawing.Size(56, 23); + this.buttonAdjustSecForward1.TabIndex = 8; + this.buttonAdjustSecForward1.Text = ">>"; + this.buttonAdjustSecForward1.UseVisualStyleBackColor = true; + this.buttonAdjustSecForward1.Click += new System.EventHandler(this.ButtonAdjustSecForwardClick); + // + // numericUpDownSecAdjust1 + // + this.numericUpDownSecAdjust1.DecimalPlaces = 3; + this.numericUpDownSecAdjust1.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.numericUpDownSecAdjust1.Location = new System.Drawing.Point(66, 163); + this.numericUpDownSecAdjust1.Maximum = new decimal(new int[] { + 60, + 0, + 0, + 0}); + this.numericUpDownSecAdjust1.Name = "numericUpDownSecAdjust1"; + this.numericUpDownSecAdjust1.Size = new System.Drawing.Size(58, 20); + this.numericUpDownSecAdjust1.TabIndex = 7; + this.numericUpDownSecAdjust1.Value = new decimal(new int[] { + 500, + 0, + 0, + 196608}); + this.numericUpDownSecAdjust1.ValueChanged += new System.EventHandler(this.NumericUpDownSecAdjust1ValueChanged); + // + // buttonAdjustSecBack1 + // + this.buttonAdjustSecBack1.Location = new System.Drawing.Point(6, 162); + this.buttonAdjustSecBack1.Name = "buttonAdjustSecBack1"; + this.buttonAdjustSecBack1.Size = new System.Drawing.Size(56, 23); + this.buttonAdjustSecBack1.TabIndex = 6; + this.buttonAdjustSecBack1.Text = "<<"; + this.buttonAdjustSecBack1.UseVisualStyleBackColor = true; + this.buttonAdjustSecBack1.Click += new System.EventHandler(this.ButtonAdjustSecBackClick); + // + // labelVideoPosition2 + // + this.labelVideoPosition2.AutoSize = true; + this.labelVideoPosition2.Location = new System.Drawing.Point(6, 219); + this.labelVideoPosition2.Name = "labelVideoPosition2"; + this.labelVideoPosition2.Size = new System.Drawing.Size(76, 13); + this.labelVideoPosition2.TabIndex = 12; + this.labelVideoPosition2.Text = "Video position:"; + this.labelVideoPosition2.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // buttonAdjustGoToPosAndPause + // + this.buttonAdjustGoToPosAndPause.Location = new System.Drawing.Point(6, 136); + this.buttonAdjustGoToPosAndPause.Name = "buttonAdjustGoToPosAndPause"; + this.buttonAdjustGoToPosAndPause.Size = new System.Drawing.Size(180, 23); + this.buttonAdjustGoToPosAndPause.TabIndex = 5; + this.buttonAdjustGoToPosAndPause.Text = "&Goto subposition and pause"; + this.buttonAdjustGoToPosAndPause.UseVisualStyleBackColor = true; + this.buttonAdjustGoToPosAndPause.Click += new System.EventHandler(this.buttonGotoSub_Click); + this.buttonAdjustGoToPosAndPause.MouseEnter += new System.EventHandler(this.buttonAdjustGoToPosAndPause_MouseEnter); + // + // buttonAdjustPlayBefore + // + this.buttonAdjustPlayBefore.Location = new System.Drawing.Point(6, 110); + this.buttonAdjustPlayBefore.Name = "buttonAdjustPlayBefore"; + this.buttonAdjustPlayBefore.Size = new System.Drawing.Size(180, 23); + this.buttonAdjustPlayBefore.TabIndex = 4; + this.buttonAdjustPlayBefore.Text = "&Play from just before text"; + this.buttonAdjustPlayBefore.UseVisualStyleBackColor = true; + this.buttonAdjustPlayBefore.Click += new System.EventHandler(this.buttonBeforeText_Click); + this.buttonAdjustPlayBefore.MouseEnter += new System.EventHandler(this.buttonAdjustPlayBefore_MouseEnter); + // + // ShowSubtitleTimer + // + this.ShowSubtitleTimer.Enabled = true; + this.ShowSubtitleTimer.Interval = 17; + this.ShowSubtitleTimer.Tick += new System.EventHandler(this.ShowSubtitleTimerTick); + // + // timerAutoDuration + // + this.timerAutoDuration.Interval = 300; + this.timerAutoDuration.Tick += new System.EventHandler(this.timerAutoDuration_Tick); + // + // timerAutoContinue + // + this.timerAutoContinue.Interval = 1000; + this.timerAutoContinue.Tick += new System.EventHandler(this.timerAutoContinue_Tick); + // + // timerStillTyping + // + this.timerStillTyping.Interval = 1500; + this.timerStillTyping.Tick += new System.EventHandler(this.timerStillTyping_Tick); + // + // timerWaveform + // + this.timerWaveform.Tick += new System.EventHandler(this.timerWaveform_Tick); + // + // contextMenuStripWaveform + // + this.contextMenuStripWaveform.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.addParagraphHereToolStripMenuItem, + this.addParagraphAndPasteToolStripMenuItem, + this.toolStripMenuItemSetParagraphAsSelection, + this.toolStripMenuItemFocusTextbox, + this.goToPreviousSubtitleStripMenuItem, + this.goToNextSubtitleStripMenuItem, + this.deleteParagraphToolStripMenuItem, + this.splitToolStripMenuItem1, + this.mergeWithPreviousToolStripMenuItem, + this.mergeWithNextToolStripMenuItem, + this.toolStripSeparator11, + this.extendToPreviousToolStripMenuItem, + this.extendToNextToolStripMenuItem, + this.toolStripSeparator6, + this.toolStripMenuItemWaveformPlaySelection, + this.toolStripSeparator24, + this.showWaveformAndSpectrogramToolStripMenuItem, + this.showOnlyWaveformToolStripMenuItem, + this.showOnlySpectrogramToolStripMenuItem, + this.toolStripSeparatorGuessTimeCodes, + this.removeSceneChangeToolStripMenuItem, + this.addSceneChangeToolStripMenuItem, + this.guessTimeCodesToolStripMenuItem, + this.seekSilenceToolStripMenuItem, + this.insertSubtitleHereToolStripMenuItem}); + this.contextMenuStripWaveform.Name = "contextMenuStripWaveform"; + this.contextMenuStripWaveform.Size = new System.Drawing.Size(275, 490); + this.contextMenuStripWaveform.Closing += new System.Windows.Forms.ToolStripDropDownClosingEventHandler(this.contextMenuStripWaveform_Closing); + this.contextMenuStripWaveform.Opening += new System.ComponentModel.CancelEventHandler(this.ContextMenuStripWaveformOpening); + // + // addParagraphHereToolStripMenuItem + // + this.addParagraphHereToolStripMenuItem.Name = "addParagraphHereToolStripMenuItem"; + this.addParagraphHereToolStripMenuItem.Size = new System.Drawing.Size(274, 22); + this.addParagraphHereToolStripMenuItem.Text = "Add paragraph here"; + this.addParagraphHereToolStripMenuItem.Click += new System.EventHandler(this.addParagraphHereToolStripMenuItem_Click); + // + // addParagraphAndPasteToolStripMenuItem + // + this.addParagraphAndPasteToolStripMenuItem.Name = "addParagraphAndPasteToolStripMenuItem"; + this.addParagraphAndPasteToolStripMenuItem.Size = new System.Drawing.Size(274, 22); + this.addParagraphAndPasteToolStripMenuItem.Text = "Add paragraph here + paste clipboard"; + this.addParagraphAndPasteToolStripMenuItem.Click += new System.EventHandler(this.addParagraphAndPasteToolStripMenuItem_Click); + // + // toolStripMenuItemSetParagraphAsSelection + // + this.toolStripMenuItemSetParagraphAsSelection.Name = "toolStripMenuItemSetParagraphAsSelection"; + this.toolStripMenuItemSetParagraphAsSelection.Size = new System.Drawing.Size(274, 22); + this.toolStripMenuItemSetParagraphAsSelection.Text = "Set selected paragraph as selection"; + this.toolStripMenuItemSetParagraphAsSelection.Click += new System.EventHandler(this.toolStripMenuItemSetParagraphAsSelection_Click); + // + // toolStripMenuItemFocusTextbox + // + this.toolStripMenuItemFocusTextbox.Name = "toolStripMenuItemFocusTextbox"; + this.toolStripMenuItemFocusTextbox.Size = new System.Drawing.Size(274, 22); + this.toolStripMenuItemFocusTextbox.Text = "Focus textbox"; + this.toolStripMenuItemFocusTextbox.Click += new System.EventHandler(this.toolStripMenuItemFocusTextbox_Click); + // + // goToPreviousSubtitleStripMenuItem + // + this.goToPreviousSubtitleStripMenuItem.Name = "goToPreviousSubtitleStripMenuItem"; + this.goToPreviousSubtitleStripMenuItem.Size = new System.Drawing.Size(274, 22); + this.goToPreviousSubtitleStripMenuItem.Text = "Go to previous subtitle"; + this.goToPreviousSubtitleStripMenuItem.Click += new System.EventHandler(this.goToPreviousSubtitleToolStripMenuItem_Click); + // + // goToNextSubtitleStripMenuItem + // + this.goToNextSubtitleStripMenuItem.Name = "goToNextSubtitleStripMenuItem"; + this.goToNextSubtitleStripMenuItem.Size = new System.Drawing.Size(274, 22); + this.goToNextSubtitleStripMenuItem.Text = "Go to next subtitle"; + this.goToNextSubtitleStripMenuItem.Click += new System.EventHandler(this.goToNextSubtitleToolStripMenuItem_Click); + // + // deleteParagraphToolStripMenuItem + // + this.deleteParagraphToolStripMenuItem.Name = "deleteParagraphToolStripMenuItem"; + this.deleteParagraphToolStripMenuItem.Size = new System.Drawing.Size(274, 22); + this.deleteParagraphToolStripMenuItem.Text = "Delete paragraph"; + this.deleteParagraphToolStripMenuItem.Click += new System.EventHandler(this.deleteParagraphToolStripMenuItem_Click); + // + // splitToolStripMenuItem1 + // + this.splitToolStripMenuItem1.Name = "splitToolStripMenuItem1"; + this.splitToolStripMenuItem1.Size = new System.Drawing.Size(274, 22); + this.splitToolStripMenuItem1.Text = "Split"; + this.splitToolStripMenuItem1.Click += new System.EventHandler(this.splitToolStripMenuItem1_Click); + // + // mergeWithPreviousToolStripMenuItem + // + this.mergeWithPreviousToolStripMenuItem.Name = "mergeWithPreviousToolStripMenuItem"; + this.mergeWithPreviousToolStripMenuItem.Size = new System.Drawing.Size(274, 22); + this.mergeWithPreviousToolStripMenuItem.Text = "Merge with previous"; + this.mergeWithPreviousToolStripMenuItem.Click += new System.EventHandler(this.mergeWithPreviousToolStripMenuItem_Click); + // + // mergeWithNextToolStripMenuItem + // + this.mergeWithNextToolStripMenuItem.Name = "mergeWithNextToolStripMenuItem"; + this.mergeWithNextToolStripMenuItem.Size = new System.Drawing.Size(274, 22); + this.mergeWithNextToolStripMenuItem.Text = "Merge with next"; + this.mergeWithNextToolStripMenuItem.Click += new System.EventHandler(this.mergeWithNextToolStripMenuItem_Click); + // + // toolStripSeparator11 + // + this.toolStripSeparator11.Name = "toolStripSeparator11"; + this.toolStripSeparator11.Size = new System.Drawing.Size(271, 6); + // + // extendToPreviousToolStripMenuItem + // + this.extendToPreviousToolStripMenuItem.Name = "extendToPreviousToolStripMenuItem"; + this.extendToPreviousToolStripMenuItem.Size = new System.Drawing.Size(274, 22); + this.extendToPreviousToolStripMenuItem.Text = "Extend to previous"; + this.extendToPreviousToolStripMenuItem.Click += new System.EventHandler(this.extendToPreviousToolStripMenuItem_Click); + // + // extendToNextToolStripMenuItem + // + this.extendToNextToolStripMenuItem.Name = "extendToNextToolStripMenuItem"; + this.extendToNextToolStripMenuItem.Size = new System.Drawing.Size(274, 22); + this.extendToNextToolStripMenuItem.Text = "Extend to next"; + this.extendToNextToolStripMenuItem.Click += new System.EventHandler(this.extendToNextToolStripMenuItem_Click); + // + // toolStripSeparator6 + // + this.toolStripSeparator6.Name = "toolStripSeparator6"; + this.toolStripSeparator6.Size = new System.Drawing.Size(271, 6); + // + // toolStripMenuItemWaveformPlaySelection + // + this.toolStripMenuItemWaveformPlaySelection.Name = "toolStripMenuItemWaveformPlaySelection"; + this.toolStripMenuItemWaveformPlaySelection.Size = new System.Drawing.Size(274, 22); + this.toolStripMenuItemWaveformPlaySelection.Text = "Play selection"; + this.toolStripMenuItemWaveformPlaySelection.Click += new System.EventHandler(this.toolStripMenuItemWaveformPlaySelection_Click); + // + // toolStripSeparator24 + // + this.toolStripSeparator24.Name = "toolStripSeparator24"; + this.toolStripSeparator24.Size = new System.Drawing.Size(271, 6); + // + // showWaveformAndSpectrogramToolStripMenuItem + // + this.showWaveformAndSpectrogramToolStripMenuItem.Name = "showWaveformAndSpectrogramToolStripMenuItem"; + this.showWaveformAndSpectrogramToolStripMenuItem.Size = new System.Drawing.Size(274, 22); + this.showWaveformAndSpectrogramToolStripMenuItem.Text = "Show waveform and spectrogram"; + this.showWaveformAndSpectrogramToolStripMenuItem.Click += new System.EventHandler(this.ShowWaveformAndSpectrogramToolStripMenuItemClick); + // + // showOnlyWaveformToolStripMenuItem + // + this.showOnlyWaveformToolStripMenuItem.Name = "showOnlyWaveformToolStripMenuItem"; + this.showOnlyWaveformToolStripMenuItem.Size = new System.Drawing.Size(274, 22); + this.showOnlyWaveformToolStripMenuItem.Text = "Show only waveform"; + this.showOnlyWaveformToolStripMenuItem.Click += new System.EventHandler(this.ShowOnlyWaveformToolStripMenuItemClick); + // + // showOnlySpectrogramToolStripMenuItem + // + this.showOnlySpectrogramToolStripMenuItem.Name = "showOnlySpectrogramToolStripMenuItem"; + this.showOnlySpectrogramToolStripMenuItem.Size = new System.Drawing.Size(274, 22); + this.showOnlySpectrogramToolStripMenuItem.Text = "Show only spectrogram"; + this.showOnlySpectrogramToolStripMenuItem.Click += new System.EventHandler(this.ShowOnlySpectrogramToolStripMenuItemClick); + // + // toolStripSeparatorGuessTimeCodes + // + this.toolStripSeparatorGuessTimeCodes.Name = "toolStripSeparatorGuessTimeCodes"; + this.toolStripSeparatorGuessTimeCodes.Size = new System.Drawing.Size(271, 6); + // + // removeSceneChangeToolStripMenuItem + // + this.removeSceneChangeToolStripMenuItem.Name = "removeSceneChangeToolStripMenuItem"; + this.removeSceneChangeToolStripMenuItem.Size = new System.Drawing.Size(274, 22); + this.removeSceneChangeToolStripMenuItem.Text = "Remove scene change"; + this.removeSceneChangeToolStripMenuItem.Click += new System.EventHandler(this.removeSceneChangeToolStripMenuItem_Click); + // + // addSceneChangeToolStripMenuItem + // + this.addSceneChangeToolStripMenuItem.Name = "addSceneChangeToolStripMenuItem"; + this.addSceneChangeToolStripMenuItem.Size = new System.Drawing.Size(274, 22); + this.addSceneChangeToolStripMenuItem.Text = "Add scene change"; + this.addSceneChangeToolStripMenuItem.Click += new System.EventHandler(this.addSceneChangeToolStripMenuItem_Click); + // + // guessTimeCodesToolStripMenuItem + // + this.guessTimeCodesToolStripMenuItem.Name = "guessTimeCodesToolStripMenuItem"; + this.guessTimeCodesToolStripMenuItem.Size = new System.Drawing.Size(274, 22); + this.guessTimeCodesToolStripMenuItem.Text = "Guess time codes..."; + this.guessTimeCodesToolStripMenuItem.Click += new System.EventHandler(this.GuessTimeCodesToolStripMenuItemClick); + // + // seekSilenceToolStripMenuItem + // + this.seekSilenceToolStripMenuItem.Name = "seekSilenceToolStripMenuItem"; + this.seekSilenceToolStripMenuItem.Size = new System.Drawing.Size(274, 22); + this.seekSilenceToolStripMenuItem.Text = "Seek silence..."; + this.seekSilenceToolStripMenuItem.Click += new System.EventHandler(this.seekSilenceToolStripMenuItem_Click); + // + // insertSubtitleHereToolStripMenuItem + // + this.insertSubtitleHereToolStripMenuItem.Name = "insertSubtitleHereToolStripMenuItem"; + this.insertSubtitleHereToolStripMenuItem.Size = new System.Drawing.Size(274, 22); + this.insertSubtitleHereToolStripMenuItem.Text = "Insert subtitle here..."; + this.insertSubtitleHereToolStripMenuItem.Click += new System.EventHandler(this.insertSubtitleHereToolStripMenuItem_Click); + // + // splitContainerMain + // + this.splitContainerMain.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainerMain.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.splitContainerMain.Location = new System.Drawing.Point(0, 64); + this.splitContainerMain.Name = "splitContainerMain"; + this.splitContainerMain.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainerMain.Panel1 + // + this.splitContainerMain.Panel1.Controls.Add(this.splitContainer1); + // + // splitContainerMain.Panel2 + // + this.splitContainerMain.Panel2.Controls.Add(this.groupBoxVideo); + this.splitContainerMain.Size = new System.Drawing.Size(975, 560); + this.splitContainerMain.SplitterDistance = 251; + this.splitContainerMain.TabIndex = 8; + this.splitContainerMain.SplitterMoved += new System.Windows.Forms.SplitterEventHandler(this.SplitContainerMainSplitterMoved); + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.tabControlSubtitle); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.panelVideoPlayer); + this.splitContainer1.Size = new System.Drawing.Size(975, 251); + this.splitContainer1.SplitterDistance = 743; + this.splitContainer1.TabIndex = 7; + this.splitContainer1.SplitterMoved += new System.Windows.Forms.SplitterEventHandler(this.SplitContainer1SplitterMoved); + // + // tabControlSubtitle + // + this.tabControlSubtitle.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tabControlSubtitle.Controls.Add(this.tabPage1); + this.tabControlSubtitle.Controls.Add(this.tabPage2); + this.tabControlSubtitle.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.tabControlSubtitle.Location = new System.Drawing.Point(3, 3); + this.tabControlSubtitle.Name = "tabControlSubtitle"; + this.tabControlSubtitle.SelectedIndex = 0; + this.tabControlSubtitle.Size = new System.Drawing.Size(738, 248); + this.tabControlSubtitle.TabIndex = 0; + this.tabControlSubtitle.SelectedIndexChanged += new System.EventHandler(this.TabControlSubtitleSelectedIndexChanged); + this.tabControlSubtitle.Selecting += new System.Windows.Forms.TabControlCancelEventHandler(this.TabControlSubtitleSelecting); + // + // tabPage1 + // + this.tabPage1.Controls.Add(this.splitContainerListViewAndText); + this.tabPage1.Location = new System.Drawing.Point(4, 22); + this.tabPage1.Name = "tabPage1"; + this.tabPage1.Padding = new System.Windows.Forms.Padding(3); + this.tabPage1.Size = new System.Drawing.Size(730, 222); + this.tabPage1.TabIndex = 0; + this.tabPage1.Text = "List view"; + this.tabPage1.UseVisualStyleBackColor = true; + // + // splitContainerListViewAndText + // + this.splitContainerListViewAndText.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainerListViewAndText.Location = new System.Drawing.Point(3, 3); + this.splitContainerListViewAndText.Name = "splitContainerListViewAndText"; + this.splitContainerListViewAndText.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainerListViewAndText.Panel1 + // + this.splitContainerListViewAndText.Panel1.Controls.Add(this.SubtitleListview1); + this.splitContainerListViewAndText.Panel1MinSize = 50; + // + // splitContainerListViewAndText.Panel2 + // + this.splitContainerListViewAndText.Panel2.Controls.Add(this.groupBoxEdit); + this.splitContainerListViewAndText.Panel2MinSize = 105; + this.splitContainerListViewAndText.Size = new System.Drawing.Size(724, 216); + this.splitContainerListViewAndText.SplitterDistance = 91; + this.splitContainerListViewAndText.TabIndex = 2; + // + // SubtitleListview1 + // + this.SubtitleListview1.AllowColumnReorder = true; + this.SubtitleListview1.AllowDrop = true; + this.SubtitleListview1.ContextMenuStrip = this.contextMenuStripListview; + this.SubtitleListview1.Dock = System.Windows.Forms.DockStyle.Fill; + this.SubtitleListview1.FirstVisibleIndex = -1; + this.SubtitleListview1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.SubtitleListview1.FullRowSelect = true; + this.SubtitleListview1.GridLines = true; + this.SubtitleListview1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.SubtitleListview1.HideSelection = false; + this.SubtitleListview1.Location = new System.Drawing.Point(0, 0); + this.SubtitleListview1.Name = "SubtitleListview1"; + this.SubtitleListview1.OwnerDraw = true; + this.SubtitleListview1.Size = new System.Drawing.Size(724, 91); + this.SubtitleListview1.StateImageList = this.imageListBookmarks; + this.SubtitleListview1.SubtitleFontBold = false; + this.SubtitleListview1.SubtitleFontName = "Tahoma"; + this.SubtitleListview1.SubtitleFontSize = 8; + this.SubtitleListview1.TabIndex = 0; + this.SubtitleListview1.UseCompatibleStateImageBehavior = false; + this.SubtitleListview1.UseSyntaxColoring = true; + this.SubtitleListview1.View = System.Windows.Forms.View.Details; + this.SubtitleListview1.SelectedIndexChanged += new System.EventHandler(this.SubtitleListview1_SelectedIndexChanged); + this.SubtitleListview1.DragDrop += new System.Windows.Forms.DragEventHandler(this.SubtitleListview1_DragDrop); + this.SubtitleListview1.DragEnter += new System.Windows.Forms.DragEventHandler(this.SubtitleListview1_DragEnter); + this.SubtitleListview1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.SubtitleListview1KeyDown); + this.SubtitleListview1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.SubtitleListview1_MouseDoubleClick); + this.SubtitleListview1.MouseEnter += new System.EventHandler(this.SubtitleListview1_MouseEnter); + // + // imageListBookmarks + // + this.imageListBookmarks.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit; + this.imageListBookmarks.ImageSize = new System.Drawing.Size(16, 16); + this.imageListBookmarks.TransparentColor = System.Drawing.Color.Transparent; + // + // groupBoxEdit + // + this.groupBoxEdit.Controls.Add(this.labelAlternateSingleLinePixels); + this.groupBoxEdit.Controls.Add(this.labelSingleLinePixels); + this.groupBoxEdit.Controls.Add(this.panelBookmark); + this.groupBoxEdit.Controls.Add(this.pictureBoxBookmark); + this.groupBoxEdit.Controls.Add(this.labelSingleLine); + this.groupBoxEdit.Controls.Add(this.labelAlternateSingleLine); + this.groupBoxEdit.Controls.Add(this.labelDurationWarning); + this.groupBoxEdit.Controls.Add(this.labelStartTimeWarning); + this.groupBoxEdit.Controls.Add(this.buttonSplitLine); + this.groupBoxEdit.Controls.Add(this.labelAlternateCharactersPerSecond); + this.groupBoxEdit.Controls.Add(this.labelTextAlternateLineTotal); + this.groupBoxEdit.Controls.Add(this.labelTextAlternateLineLengths); + this.groupBoxEdit.Controls.Add(this.labelAlternateText); + this.groupBoxEdit.Controls.Add(this.labelText); + this.groupBoxEdit.Controls.Add(this.textBoxListViewTextAlternate); + this.groupBoxEdit.Controls.Add(this.buttonAutoBreak); + this.groupBoxEdit.Controls.Add(this.labelTextLineLengths); + this.groupBoxEdit.Controls.Add(this.labelTextLineTotal); + this.groupBoxEdit.Controls.Add(this.labelCharactersPerSecond); + this.groupBoxEdit.Controls.Add(this.buttonUnBreak); + this.groupBoxEdit.Controls.Add(this.timeUpDownStartTime); + this.groupBoxEdit.Controls.Add(this.numericUpDownDuration); + this.groupBoxEdit.Controls.Add(this.buttonPrevious); + this.groupBoxEdit.Controls.Add(this.buttonNext); + this.groupBoxEdit.Controls.Add(this.labelStartTime); + this.groupBoxEdit.Controls.Add(this.textBoxListViewText); + this.groupBoxEdit.Controls.Add(this.labelDuration); + this.groupBoxEdit.Controls.Add(this.labelAutoDuration); + this.groupBoxEdit.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupBoxEdit.Location = new System.Drawing.Point(0, 0); + this.groupBoxEdit.Name = "groupBoxEdit"; + this.groupBoxEdit.Size = new System.Drawing.Size(724, 121); + this.groupBoxEdit.TabIndex = 1; + this.groupBoxEdit.TabStop = false; + // + // labelAlternateSingleLinePixels + // + this.labelAlternateSingleLinePixels.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelAlternateSingleLinePixels.AutoSize = true; + this.labelAlternateSingleLinePixels.Location = new System.Drawing.Point(870, 94); + this.labelAlternateSingleLinePixels.Name = "labelAlternateSingleLinePixels"; + this.labelAlternateSingleLinePixels.Size = new System.Drawing.Size(62, 13); + this.labelAlternateSingleLinePixels.TabIndex = 43; + this.labelAlternateSingleLinePixels.Text = "AltSinLinPix"; + // + // labelSingleLinePixels + // + this.labelSingleLinePixels.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelSingleLinePixels.AutoSize = true; + this.labelSingleLinePixels.Location = new System.Drawing.Point(427, 94); + this.labelSingleLinePixels.Name = "labelSingleLinePixels"; + this.labelSingleLinePixels.Size = new System.Drawing.Size(105, 13); + this.labelSingleLinePixels.TabIndex = 42; + this.labelSingleLinePixels.Text = "labelSingleLinePixels"; + // + // panelBookmark + // + this.panelBookmark.BackColor = System.Drawing.Color.LemonChiffon; + this.panelBookmark.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelBookmark.Controls.Add(this.labelBookmark); + this.panelBookmark.Location = new System.Drawing.Point(207, 38); + this.panelBookmark.Name = "panelBookmark"; + this.panelBookmark.Size = new System.Drawing.Size(200, 25); + this.panelBookmark.TabIndex = 40; + this.panelBookmark.Visible = false; + // + // labelBookmark + // + this.labelBookmark.AutoSize = true; + this.labelBookmark.Location = new System.Drawing.Point(4, 4); + this.labelBookmark.Name = "labelBookmark"; + this.labelBookmark.Size = new System.Drawing.Size(77, 13); + this.labelBookmark.TabIndex = 0; + this.labelBookmark.Text = "labelBookmark"; + this.labelBookmark.DoubleClick += new System.EventHandler(this.labelBookmark_DoubleClick); + // + // pictureBoxBookmark + // + this.pictureBoxBookmark.Image = global::Nikse.SubtitleEdit.Properties.Resources.bookmark22; + this.pictureBoxBookmark.Location = new System.Drawing.Point(211, 28); + this.pictureBoxBookmark.Name = "pictureBoxBookmark"; + this.pictureBoxBookmark.Size = new System.Drawing.Size(22, 22); + this.pictureBoxBookmark.TabIndex = 41; + this.pictureBoxBookmark.TabStop = false; + this.pictureBoxBookmark.MouseClick += new System.Windows.Forms.MouseEventHandler(this.pictureBoxBookmark_MouseClick); + this.pictureBoxBookmark.MouseEnter += new System.EventHandler(this.pictureBoxBookmark_MouseEnter); + // + // labelSingleLine + // + this.labelSingleLine.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelSingleLine.AutoSize = true; + this.labelSingleLine.Location = new System.Drawing.Point(346, 94); + this.labelSingleLine.Name = "labelSingleLine"; + this.labelSingleLine.Size = new System.Drawing.Size(78, 13); + this.labelSingleLine.TabIndex = 32; + this.labelSingleLine.Text = "labelSingleLine"; + // + // labelAlternateSingleLine + // + this.labelAlternateSingleLine.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelAlternateSingleLine.AutoSize = true; + this.labelAlternateSingleLine.Location = new System.Drawing.Point(839, 94); + this.labelAlternateSingleLine.Name = "labelAlternateSingleLine"; + this.labelAlternateSingleLine.Size = new System.Drawing.Size(48, 13); + this.labelAlternateSingleLine.TabIndex = 36; + this.labelAlternateSingleLine.Text = "AltSinLin"; + // + // labelDurationWarning + // + this.labelDurationWarning.AutoSize = true; + this.labelDurationWarning.ForeColor = System.Drawing.Color.Red; + this.labelDurationWarning.Location = new System.Drawing.Point(122, 64); + this.labelDurationWarning.Name = "labelDurationWarning"; + this.labelDurationWarning.Size = new System.Drawing.Size(109, 13); + this.labelDurationWarning.TabIndex = 17; + this.labelDurationWarning.Text = "labelDurationWarning"; + // + // labelStartTimeWarning + // + this.labelStartTimeWarning.AutoSize = true; + this.labelStartTimeWarning.ForeColor = System.Drawing.Color.Red; + this.labelStartTimeWarning.Location = new System.Drawing.Point(8, 50); + this.labelStartTimeWarning.Name = "labelStartTimeWarning"; + this.labelStartTimeWarning.Size = new System.Drawing.Size(114, 13); + this.labelStartTimeWarning.TabIndex = 18; + this.labelStartTimeWarning.Text = "labelStartTimeWarning"; + // + // buttonSplitLine + // + this.buttonSplitLine.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.buttonSplitLine.ForeColor = System.Drawing.Color.Red; + this.buttonSplitLine.Location = new System.Drawing.Point(604, 80); + this.buttonSplitLine.Name = "buttonSplitLine"; + this.buttonSplitLine.Size = new System.Drawing.Size(115, 23); + this.buttonSplitLine.TabIndex = 39; + this.buttonSplitLine.Text = "Split line"; + this.buttonSplitLine.UseVisualStyleBackColor = true; + this.buttonSplitLine.Visible = false; + this.buttonSplitLine.Click += new System.EventHandler(this.ButtonSplitLineClick); + // + // labelAlternateCharactersPerSecond + // + this.labelAlternateCharactersPerSecond.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.labelAlternateCharactersPerSecond.AutoSize = true; + this.labelAlternateCharactersPerSecond.Location = new System.Drawing.Point(636, 11); + this.labelAlternateCharactersPerSecond.Name = "labelAlternateCharactersPerSecond"; + this.labelAlternateCharactersPerSecond.Size = new System.Drawing.Size(64, 13); + this.labelAlternateCharactersPerSecond.TabIndex = 38; + this.labelAlternateCharactersPerSecond.Text = "altCharsSec"; + // + // labelTextAlternateLineTotal + // + this.labelTextAlternateLineTotal.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.labelTextAlternateLineTotal.AutoSize = true; + this.labelTextAlternateLineTotal.Location = new System.Drawing.Point(682, 94); + this.labelTextAlternateLineTotal.Name = "labelTextAlternateLineTotal"; + this.labelTextAlternateLineTotal.Size = new System.Drawing.Size(35, 13); + this.labelTextAlternateLineTotal.TabIndex = 37; + this.labelTextAlternateLineTotal.Text = "AltTot"; + // + // labelTextAlternateLineLengths + // + this.labelTextAlternateLineLengths.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelTextAlternateLineLengths.AutoSize = true; + this.labelTextAlternateLineLengths.Location = new System.Drawing.Point(786, 94); + this.labelTextAlternateLineLengths.Name = "labelTextAlternateLineLengths"; + this.labelTextAlternateLineLengths.Size = new System.Drawing.Size(57, 13); + this.labelTextAlternateLineLengths.TabIndex = 35; + this.labelTextAlternateLineLengths.Text = "AltLineLen"; + // + // labelAlternateText + // + this.labelAlternateText.AutoSize = true; + this.labelAlternateText.Location = new System.Drawing.Point(803, 11); + this.labelAlternateText.Name = "labelAlternateText"; + this.labelAlternateText.Size = new System.Drawing.Size(28, 13); + this.labelAlternateText.TabIndex = 34; + this.labelAlternateText.Text = "Text"; + this.labelAlternateText.Visible = false; + // + // labelText + // + this.labelText.AutoSize = true; + this.labelText.Location = new System.Drawing.Point(239, 11); + this.labelText.Name = "labelText"; + this.labelText.Size = new System.Drawing.Size(28, 13); + this.labelText.TabIndex = 5; + this.labelText.Text = "Text"; + // + // textBoxListViewTextAlternate + // + this.textBoxListViewTextAlternate.AllowDrop = true; + this.textBoxListViewTextAlternate.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxListViewTextAlternate.ContextMenuStrip = this.contextMenuStripTextBoxListView; + this.textBoxListViewTextAlternate.Enabled = false; + this.textBoxListViewTextAlternate.HideSelection = false; + this.textBoxListViewTextAlternate.Location = new System.Drawing.Point(946, 28); + this.textBoxListViewTextAlternate.Multiline = true; + this.textBoxListViewTextAlternate.Name = "textBoxListViewTextAlternate"; + this.textBoxListViewTextAlternate.Size = new System.Drawing.Size(0, 63); + this.textBoxListViewTextAlternate.TabIndex = 33; + this.textBoxListViewTextAlternate.Visible = false; + this.textBoxListViewTextAlternate.MouseClick += new System.Windows.Forms.MouseEventHandler(this.TextBoxListViewTextAlternateMouseClick); + this.textBoxListViewTextAlternate.TextChanged += new System.EventHandler(this.textBoxListViewTextAlternate_TextChanged); + this.textBoxListViewTextAlternate.Enter += new System.EventHandler(this.TextBoxListViewTextAlternateEnter); + this.textBoxListViewTextAlternate.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxListViewTextAlternateKeyDown); + this.textBoxListViewTextAlternate.KeyUp += new System.Windows.Forms.KeyEventHandler(this.TextBoxListViewTextAlternateKeyUp); + this.textBoxListViewTextAlternate.MouseMove += new System.Windows.Forms.MouseEventHandler(this.TextBoxListViewTextAlternateMouseMove); + // + // contextMenuStripTextBoxListView + // + this.contextMenuStripTextBoxListView.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItemWebVttVoice, + this.toolStripSeparatorWebVTT, + this.cutToolStripMenuItem, + this.copyToolStripMenuItem, + this.pasteToolStripMenuItem, + this.deleteToolStripMenuItem, + this.toolStripMenuItemSplitTextAtCursor, + this.toolStripMenuItemSplitViaWaveform, + this.toolStripSeparator18, + this.selectAllToolStripMenuItem, + this.toolStripSeparator17, + this.normalToolStripMenuItem1, + this.boldToolStripMenuItem1, + this.italicToolStripMenuItem1, + this.boxToolStripMenuItem1, + this.underlineToolStripMenuItem1, + this.colorToolStripMenuItem1, + this.toolStripMenuItemHorizontalDigits, + this.toolStripMenuItemBouten, + this.toolStripMenuItemRuby, + this.fontNameToolStripMenuItem, + this.toolStripSeparator26, + this.toolStripMenuItemInsertUnicodeSymbol, + this.toolStripMenuItemInsertUnicodeControlCharacters, + this.superscriptToolStripMenuItem, + this.subscriptToolStripMenuItem}); + this.contextMenuStripTextBoxListView.Name = "contextMenuStripTextBoxListView"; + this.contextMenuStripTextBoxListView.Size = new System.Drawing.Size(274, 512); + this.contextMenuStripTextBoxListView.Closed += new System.Windows.Forms.ToolStripDropDownClosedEventHandler(this.MenuClosed); + this.contextMenuStripTextBoxListView.Opening += new System.ComponentModel.CancelEventHandler(this.ContextMenuStripTextBoxListViewOpening); + this.contextMenuStripTextBoxListView.Opened += new System.EventHandler(this.MenuOpened); + // + // toolStripMenuItemWebVttVoice + // + this.toolStripMenuItemWebVttVoice.Name = "toolStripMenuItemWebVttVoice"; + this.toolStripMenuItemWebVttVoice.Size = new System.Drawing.Size(273, 22); + this.toolStripMenuItemWebVttVoice.Text = "WebVTT voice"; + // + // toolStripSeparatorWebVTT + // + this.toolStripSeparatorWebVTT.Name = "toolStripSeparatorWebVTT"; + this.toolStripSeparatorWebVTT.Size = new System.Drawing.Size(270, 6); + // + // cutToolStripMenuItem + // + this.cutToolStripMenuItem.Name = "cutToolStripMenuItem"; + this.cutToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.X))); + this.cutToolStripMenuItem.Size = new System.Drawing.Size(273, 22); + this.cutToolStripMenuItem.Text = "Cut"; + this.cutToolStripMenuItem.Click += new System.EventHandler(this.cutToolStripMenuItem_Click); + // + // copyToolStripMenuItem + // + this.copyToolStripMenuItem.Name = "copyToolStripMenuItem"; + this.copyToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.C))); + this.copyToolStripMenuItem.Size = new System.Drawing.Size(273, 22); + this.copyToolStripMenuItem.Text = "Copy"; + this.copyToolStripMenuItem.Click += new System.EventHandler(this.copyToolStripMenuItem_Click); + // + // pasteToolStripMenuItem + // + this.pasteToolStripMenuItem.Name = "pasteToolStripMenuItem"; + this.pasteToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.V))); + this.pasteToolStripMenuItem.Size = new System.Drawing.Size(273, 22); + this.pasteToolStripMenuItem.Text = "Paste"; + this.pasteToolStripMenuItem.Click += new System.EventHandler(this.PasteToolStripMenuItemClick); + // + // deleteToolStripMenuItem + // + this.deleteToolStripMenuItem.Name = "deleteToolStripMenuItem"; + this.deleteToolStripMenuItem.Size = new System.Drawing.Size(273, 22); + this.deleteToolStripMenuItem.Text = "Delete"; + this.deleteToolStripMenuItem.Click += new System.EventHandler(this.DeleteToolStripMenuItemClick); + // + // toolStripMenuItemSplitTextAtCursor + // + this.toolStripMenuItemSplitTextAtCursor.Name = "toolStripMenuItemSplitTextAtCursor"; + this.toolStripMenuItemSplitTextAtCursor.Size = new System.Drawing.Size(273, 22); + this.toolStripMenuItemSplitTextAtCursor.Text = "Split text at cursor position"; + this.toolStripMenuItemSplitTextAtCursor.Click += new System.EventHandler(this.ToolStripMenuItemSplitTextAtCursorClick); + // + // toolStripMenuItemSplitViaWaveform + // + this.toolStripMenuItemSplitViaWaveform.Name = "toolStripMenuItemSplitViaWaveform"; + this.toolStripMenuItemSplitViaWaveform.Size = new System.Drawing.Size(273, 22); + this.toolStripMenuItemSplitViaWaveform.Text = "Split text at cursor/waveform position"; + this.toolStripMenuItemSplitViaWaveform.Click += new System.EventHandler(this.toolStripMenuItemSplitViaWaveform_Click); + // + // toolStripSeparator18 + // + this.toolStripSeparator18.Name = "toolStripSeparator18"; + this.toolStripSeparator18.Size = new System.Drawing.Size(270, 6); + // + // selectAllToolStripMenuItem + // + this.selectAllToolStripMenuItem.Name = "selectAllToolStripMenuItem"; + this.selectAllToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.A))); + this.selectAllToolStripMenuItem.Size = new System.Drawing.Size(273, 22); + this.selectAllToolStripMenuItem.Text = "Select all"; + this.selectAllToolStripMenuItem.Click += new System.EventHandler(this.selectAllToolStripMenuItem_Click); + // + // toolStripSeparator17 + // + this.toolStripSeparator17.Name = "toolStripSeparator17"; + this.toolStripSeparator17.Size = new System.Drawing.Size(270, 6); + // + // normalToolStripMenuItem1 + // + this.normalToolStripMenuItem1.Name = "normalToolStripMenuItem1"; + this.normalToolStripMenuItem1.Size = new System.Drawing.Size(273, 22); + this.normalToolStripMenuItem1.Text = "Normal"; + this.normalToolStripMenuItem1.Click += new System.EventHandler(this.NormalToolStripMenuItem1Click); + // + // boldToolStripMenuItem1 + // + this.boldToolStripMenuItem1.Name = "boldToolStripMenuItem1"; + this.boldToolStripMenuItem1.Size = new System.Drawing.Size(273, 22); + this.boldToolStripMenuItem1.Text = "Bold"; + this.boldToolStripMenuItem1.Click += new System.EventHandler(this.BoldToolStripMenuItem1Click); + // + // italicToolStripMenuItem1 + // + this.italicToolStripMenuItem1.Name = "italicToolStripMenuItem1"; + this.italicToolStripMenuItem1.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.I))); + this.italicToolStripMenuItem1.Size = new System.Drawing.Size(273, 22); + this.italicToolStripMenuItem1.Text = "Italic"; + this.italicToolStripMenuItem1.Click += new System.EventHandler(this.ItalicToolStripMenuItem1Click); + // + // boxToolStripMenuItem1 + // + this.boxToolStripMenuItem1.Name = "boxToolStripMenuItem1"; + this.boxToolStripMenuItem1.Size = new System.Drawing.Size(273, 22); + this.boxToolStripMenuItem1.Text = "Box"; + this.boxToolStripMenuItem1.Click += new System.EventHandler(this.boxToolStripMenuItem1_Click); + // + // underlineToolStripMenuItem1 + // + this.underlineToolStripMenuItem1.Name = "underlineToolStripMenuItem1"; + this.underlineToolStripMenuItem1.Size = new System.Drawing.Size(273, 22); + this.underlineToolStripMenuItem1.Text = "Underline"; + this.underlineToolStripMenuItem1.Click += new System.EventHandler(this.UnderlineToolStripMenuItem1Click); + // + // colorToolStripMenuItem1 + // + this.colorToolStripMenuItem1.Name = "colorToolStripMenuItem1"; + this.colorToolStripMenuItem1.Size = new System.Drawing.Size(273, 22); + this.colorToolStripMenuItem1.Text = "Color..."; + this.colorToolStripMenuItem1.Click += new System.EventHandler(this.ColorToolStripMenuItem1Click); + // + // toolStripMenuItemHorizontalDigits + // + this.toolStripMenuItemHorizontalDigits.Name = "toolStripMenuItemHorizontalDigits"; + this.toolStripMenuItemHorizontalDigits.Size = new System.Drawing.Size(273, 22); + this.toolStripMenuItemHorizontalDigits.Text = "Horizontal digits"; + this.toolStripMenuItemHorizontalDigits.Click += new System.EventHandler(this.toolStripMenuItemHorizontalDigits_Click); + // + // toolStripMenuItemBouten + // + this.toolStripMenuItemBouten.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.boutendotbeforeToolStripMenuItem, + this.boutendotafterToolStripMenuItem, + this.boutendotoutsideToolStripMenuItem, + this.boutenfilledcircleoutsideToolStripMenuItem, + this.boutenopencircleoutsideToolStripMenuItem, + this.boutenopendotoutsideToolStripMenuItem, + this.boutenfilledsesameoutsideToolStripMenuItem, + this.boutenopensesameoutsideToolStripMenuItem, + this.boutenautooutsideToolStripMenuItem, + this.boutenautoToolStripMenuItem}); + this.toolStripMenuItemBouten.Name = "toolStripMenuItemBouten"; + this.toolStripMenuItemBouten.Size = new System.Drawing.Size(273, 22); + this.toolStripMenuItemBouten.Text = "Bouten"; + // + // boutendotbeforeToolStripMenuItem + // + this.boutendotbeforeToolStripMenuItem.Name = "boutendotbeforeToolStripMenuItem"; + this.boutendotbeforeToolStripMenuItem.Size = new System.Drawing.Size(232, 22); + this.boutendotbeforeToolStripMenuItem.Text = "bouten-dot-before"; + this.boutendotbeforeToolStripMenuItem.Click += new System.EventHandler(this.BoutenToolStripMenuItemClick); + // + // boutendotafterToolStripMenuItem + // + this.boutendotafterToolStripMenuItem.Name = "boutendotafterToolStripMenuItem"; + this.boutendotafterToolStripMenuItem.Size = new System.Drawing.Size(232, 22); + this.boutendotafterToolStripMenuItem.Text = "bouten-dot-after"; + this.boutendotafterToolStripMenuItem.Click += new System.EventHandler(this.BoutenToolStripMenuItemClick); + // + // boutendotoutsideToolStripMenuItem + // + this.boutendotoutsideToolStripMenuItem.Name = "boutendotoutsideToolStripMenuItem"; + this.boutendotoutsideToolStripMenuItem.Size = new System.Drawing.Size(232, 22); + this.boutendotoutsideToolStripMenuItem.Text = "bouten-dot-outside"; + this.boutendotoutsideToolStripMenuItem.Click += new System.EventHandler(this.BoutenToolStripMenuItemClick); + // + // boutenfilledcircleoutsideToolStripMenuItem + // + this.boutenfilledcircleoutsideToolStripMenuItem.Name = "boutenfilledcircleoutsideToolStripMenuItem"; + this.boutenfilledcircleoutsideToolStripMenuItem.Size = new System.Drawing.Size(232, 22); + this.boutenfilledcircleoutsideToolStripMenuItem.Text = "bouten-filled-circle-outside"; + this.boutenfilledcircleoutsideToolStripMenuItem.Click += new System.EventHandler(this.BoutenToolStripMenuItemClick); + // + // boutenopencircleoutsideToolStripMenuItem + // + this.boutenopencircleoutsideToolStripMenuItem.Name = "boutenopencircleoutsideToolStripMenuItem"; + this.boutenopencircleoutsideToolStripMenuItem.Size = new System.Drawing.Size(232, 22); + this.boutenopencircleoutsideToolStripMenuItem.Text = "bouten-open-circle-outside"; + this.boutenopencircleoutsideToolStripMenuItem.Click += new System.EventHandler(this.BoutenToolStripMenuItemClick); + // + // boutenopendotoutsideToolStripMenuItem + // + this.boutenopendotoutsideToolStripMenuItem.Name = "boutenopendotoutsideToolStripMenuItem"; + this.boutenopendotoutsideToolStripMenuItem.Size = new System.Drawing.Size(232, 22); + this.boutenopendotoutsideToolStripMenuItem.Text = "bouten-open-dot-outside"; + this.boutenopendotoutsideToolStripMenuItem.Click += new System.EventHandler(this.BoutenToolStripMenuItemClick); + // + // boutenfilledsesameoutsideToolStripMenuItem + // + this.boutenfilledsesameoutsideToolStripMenuItem.Name = "boutenfilledsesameoutsideToolStripMenuItem"; + this.boutenfilledsesameoutsideToolStripMenuItem.Size = new System.Drawing.Size(232, 22); + this.boutenfilledsesameoutsideToolStripMenuItem.Text = "bouten-filled-sesame-outside"; + this.boutenfilledsesameoutsideToolStripMenuItem.Click += new System.EventHandler(this.BoutenToolStripMenuItemClick); + // + // boutenopensesameoutsideToolStripMenuItem + // + this.boutenopensesameoutsideToolStripMenuItem.Name = "boutenopensesameoutsideToolStripMenuItem"; + this.boutenopensesameoutsideToolStripMenuItem.Size = new System.Drawing.Size(232, 22); + this.boutenopensesameoutsideToolStripMenuItem.Text = "bouten-open-sesame-outside"; + this.boutenopensesameoutsideToolStripMenuItem.Click += new System.EventHandler(this.BoutenToolStripMenuItemClick); + // + // boutenautooutsideToolStripMenuItem + // + this.boutenautooutsideToolStripMenuItem.Name = "boutenautooutsideToolStripMenuItem"; + this.boutenautooutsideToolStripMenuItem.Size = new System.Drawing.Size(232, 22); + this.boutenautooutsideToolStripMenuItem.Text = "bouten-auto-outside"; + this.boutenautooutsideToolStripMenuItem.Click += new System.EventHandler(this.BoutenToolStripMenuItemClick); + // + // boutenautoToolStripMenuItem + // + this.boutenautoToolStripMenuItem.Name = "boutenautoToolStripMenuItem"; + this.boutenautoToolStripMenuItem.Size = new System.Drawing.Size(232, 22); + this.boutenautoToolStripMenuItem.Text = "bouten-auto"; + this.boutenautoToolStripMenuItem.Click += new System.EventHandler(this.BoutenToolStripMenuItemClick); + // + // toolStripMenuItemRuby + // + this.toolStripMenuItemRuby.Name = "toolStripMenuItemRuby"; + this.toolStripMenuItemRuby.Size = new System.Drawing.Size(273, 22); + this.toolStripMenuItemRuby.Text = "Ruby..."; + this.toolStripMenuItemRuby.Click += new System.EventHandler(this.toolStripMenuItemRuby_Click); + // + // fontNameToolStripMenuItem + // + this.fontNameToolStripMenuItem.Name = "fontNameToolStripMenuItem"; + this.fontNameToolStripMenuItem.Size = new System.Drawing.Size(273, 22); + this.fontNameToolStripMenuItem.Text = "Font name..."; + this.fontNameToolStripMenuItem.Click += new System.EventHandler(this.FontNameToolStripMenuItemClick); + // + // toolStripSeparator26 + // + this.toolStripSeparator26.Name = "toolStripSeparator26"; + this.toolStripSeparator26.Size = new System.Drawing.Size(270, 6); + // + // toolStripMenuItemInsertUnicodeSymbol + // + this.toolStripMenuItemInsertUnicodeSymbol.Name = "toolStripMenuItemInsertUnicodeSymbol"; + this.toolStripMenuItemInsertUnicodeSymbol.Size = new System.Drawing.Size(273, 22); + this.toolStripMenuItemInsertUnicodeSymbol.Text = "Insert unicode character"; + // + // toolStripMenuItemInsertUnicodeControlCharacters + // + this.toolStripMenuItemInsertUnicodeControlCharacters.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.leftToolStripMenuItem, + this.righttoleftMarkToolStripMenuItem, + this.startOfLefttorightEmbeddingLREToolStripMenuItem, + this.startOfRighttoleftEmbeddingRLEToolStripMenuItem, + this.startOfLefttorightOverrideLROToolStripMenuItem, + this.startOfRighttoleftOverrideRLOToolStripMenuItem}); + this.toolStripMenuItemInsertUnicodeControlCharacters.Name = "toolStripMenuItemInsertUnicodeControlCharacters"; + this.toolStripMenuItemInsertUnicodeControlCharacters.Size = new System.Drawing.Size(273, 22); + this.toolStripMenuItemInsertUnicodeControlCharacters.Text = "Insert unicode control character"; + // + // leftToolStripMenuItem + // + this.leftToolStripMenuItem.Name = "leftToolStripMenuItem"; + this.leftToolStripMenuItem.Size = new System.Drawing.Size(272, 22); + this.leftToolStripMenuItem.Text = "Left-to-right mark (LRM)"; + this.leftToolStripMenuItem.Click += new System.EventHandler(this.leftToolStripMenuItem_Click); + // + // righttoleftMarkToolStripMenuItem + // + this.righttoleftMarkToolStripMenuItem.Name = "righttoleftMarkToolStripMenuItem"; + this.righttoleftMarkToolStripMenuItem.Size = new System.Drawing.Size(272, 22); + this.righttoleftMarkToolStripMenuItem.Text = "Right-to-left mark (RLM)"; + this.righttoleftMarkToolStripMenuItem.Click += new System.EventHandler(this.righttoleftMarkToolStripMenuItem_Click); + // + // startOfLefttorightEmbeddingLREToolStripMenuItem + // + this.startOfLefttorightEmbeddingLREToolStripMenuItem.Name = "startOfLefttorightEmbeddingLREToolStripMenuItem"; + this.startOfLefttorightEmbeddingLREToolStripMenuItem.Size = new System.Drawing.Size(272, 22); + this.startOfLefttorightEmbeddingLREToolStripMenuItem.Text = "Start of left-to-right embedding (LRE)"; + this.startOfLefttorightEmbeddingLREToolStripMenuItem.Click += new System.EventHandler(this.startOfLefttorightEmbeddingLREToolStripMenuItem_Click); + // + // startOfRighttoleftEmbeddingRLEToolStripMenuItem + // + this.startOfRighttoleftEmbeddingRLEToolStripMenuItem.Name = "startOfRighttoleftEmbeddingRLEToolStripMenuItem"; + this.startOfRighttoleftEmbeddingRLEToolStripMenuItem.Size = new System.Drawing.Size(272, 22); + this.startOfRighttoleftEmbeddingRLEToolStripMenuItem.Text = "Start of right-to-left embedding (RLE)"; + this.startOfRighttoleftEmbeddingRLEToolStripMenuItem.Click += new System.EventHandler(this.startOfRighttoleftEmbeddingRLEToolStripMenuItem_Click); + // + // startOfLefttorightOverrideLROToolStripMenuItem + // + this.startOfLefttorightOverrideLROToolStripMenuItem.Name = "startOfLefttorightOverrideLROToolStripMenuItem"; + this.startOfLefttorightOverrideLROToolStripMenuItem.Size = new System.Drawing.Size(272, 22); + this.startOfLefttorightOverrideLROToolStripMenuItem.Text = "Start of left-to-right override (LRO)"; + this.startOfLefttorightOverrideLROToolStripMenuItem.Click += new System.EventHandler(this.startOfLefttorightOverrideLROToolStripMenuItem_Click); + // + // startOfRighttoleftOverrideRLOToolStripMenuItem + // + this.startOfRighttoleftOverrideRLOToolStripMenuItem.Name = "startOfRighttoleftOverrideRLOToolStripMenuItem"; + this.startOfRighttoleftOverrideRLOToolStripMenuItem.Size = new System.Drawing.Size(272, 22); + this.startOfRighttoleftOverrideRLOToolStripMenuItem.Text = "Start of right-to-left override (RLO)"; + this.startOfRighttoleftOverrideRLOToolStripMenuItem.Click += new System.EventHandler(this.startOfRighttoleftOverrideRLOToolStripMenuItem_Click); + // + // superscriptToolStripMenuItem + // + this.superscriptToolStripMenuItem.Name = "superscriptToolStripMenuItem"; + this.superscriptToolStripMenuItem.Size = new System.Drawing.Size(273, 22); + this.superscriptToolStripMenuItem.Text = "Superscript"; + this.superscriptToolStripMenuItem.Click += new System.EventHandler(this.SuperscriptToolStripMenuItemClick); + // + // subscriptToolStripMenuItem + // + this.subscriptToolStripMenuItem.Name = "subscriptToolStripMenuItem"; + this.subscriptToolStripMenuItem.Size = new System.Drawing.Size(273, 22); + this.subscriptToolStripMenuItem.Text = "Subscript"; + this.subscriptToolStripMenuItem.Click += new System.EventHandler(this.SubscriptToolStripMenuItemClick); + // + // buttonAutoBreak + // + this.buttonAutoBreak.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.buttonAutoBreak.Location = new System.Drawing.Point(604, 51); + this.buttonAutoBreak.Name = "buttonAutoBreak"; + this.buttonAutoBreak.Size = new System.Drawing.Size(115, 23); + this.buttonAutoBreak.TabIndex = 7; + this.buttonAutoBreak.Text = "Auto br"; + this.buttonAutoBreak.UseVisualStyleBackColor = true; + this.buttonAutoBreak.Click += new System.EventHandler(this.ButtonAutoBreakClick); + // + // labelTextLineLengths + // + this.labelTextLineLengths.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelTextLineLengths.AutoSize = true; + this.labelTextLineLengths.Location = new System.Drawing.Point(239, 94); + this.labelTextLineLengths.Name = "labelTextLineLengths"; + this.labelTextLineLengths.Size = new System.Drawing.Size(108, 13); + this.labelTextLineLengths.TabIndex = 12; + this.labelTextLineLengths.Text = "labelTextLineLengths"; + // + // labelTextLineTotal + // + this.labelTextLineTotal.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelTextLineTotal.AutoSize = true; + this.labelTextLineTotal.Location = new System.Drawing.Point(1001, 94); + this.labelTextLineTotal.Name = "labelTextLineTotal"; + this.labelTextLineTotal.Size = new System.Drawing.Size(94, 13); + this.labelTextLineTotal.TabIndex = 21; + this.labelTextLineTotal.Text = "labelTextLineTotal"; + // + // labelCharactersPerSecond + // + this.labelCharactersPerSecond.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.labelCharactersPerSecond.AutoSize = true; + this.labelCharactersPerSecond.Location = new System.Drawing.Point(432, 11); + this.labelCharactersPerSecond.Name = "labelCharactersPerSecond"; + this.labelCharactersPerSecond.Size = new System.Drawing.Size(133, 13); + this.labelCharactersPerSecond.TabIndex = 31; + this.labelCharactersPerSecond.Text = "labelCharactersPerSecond"; + // + // buttonUnBreak + // + this.buttonUnBreak.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.buttonUnBreak.Location = new System.Drawing.Point(604, 22); + this.buttonUnBreak.Name = "buttonUnBreak"; + this.buttonUnBreak.Size = new System.Drawing.Size(115, 23); + this.buttonUnBreak.TabIndex = 6; + this.buttonUnBreak.Text = "Unbreak"; + this.buttonUnBreak.UseVisualStyleBackColor = true; + this.buttonUnBreak.Click += new System.EventHandler(this.ButtonUnBreakClick); + // + // timeUpDownStartTime + // + this.timeUpDownStartTime.AutoSize = true; + this.timeUpDownStartTime.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.timeUpDownStartTime.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F); + this.timeUpDownStartTime.Location = new System.Drawing.Point(8, 26); + this.timeUpDownStartTime.Margin = new System.Windows.Forms.Padding(4); + this.timeUpDownStartTime.Name = "timeUpDownStartTime"; + this.timeUpDownStartTime.Size = new System.Drawing.Size(111, 27); + this.timeUpDownStartTime.TabIndex = 0; + timeCode6.Hours = 0; + timeCode6.Milliseconds = 0; + timeCode6.Minutes = 0; + timeCode6.Seconds = 0; + timeCode6.TimeSpan = System.TimeSpan.Parse("00:00:00"); + timeCode6.TotalMilliseconds = 0D; + timeCode6.TotalSeconds = 0D; + this.timeUpDownStartTime.TimeCode = timeCode6; + this.timeUpDownStartTime.UseVideoOffset = false; + // + // numericUpDownDuration + // + this.numericUpDownDuration.DecimalPlaces = 3; + this.numericUpDownDuration.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.numericUpDownDuration.Location = new System.Drawing.Point(122, 27); + this.numericUpDownDuration.Maximum = new decimal(new int[] { + 999999999, + 0, + 0, + 0}); + this.numericUpDownDuration.Minimum = new decimal(new int[] { + 99999, + 0, + 0, + -2147483648}); + this.numericUpDownDuration.Name = "numericUpDownDuration"; + this.numericUpDownDuration.Size = new System.Drawing.Size(56, 20); + this.numericUpDownDuration.TabIndex = 1; + this.numericUpDownDuration.ValueChanged += new System.EventHandler(this.NumericUpDownDurationValueChanged); + // + // buttonPrevious + // + this.buttonPrevious.Location = new System.Drawing.Point(8, 78); + this.buttonPrevious.Name = "buttonPrevious"; + this.buttonPrevious.Size = new System.Drawing.Size(72, 23); + this.buttonPrevious.TabIndex = 2; + this.buttonPrevious.Text = "< Prev "; + this.buttonPrevious.UseVisualStyleBackColor = true; + this.buttonPrevious.Click += new System.EventHandler(this.ButtonPreviousClick); + // + // buttonNext + // + this.buttonNext.Location = new System.Drawing.Point(86, 78); + this.buttonNext.Name = "buttonNext"; + this.buttonNext.Size = new System.Drawing.Size(72, 23); + this.buttonNext.TabIndex = 3; + this.buttonNext.Text = "Next >"; + this.buttonNext.UseVisualStyleBackColor = true; + this.buttonNext.Click += new System.EventHandler(this.ButtonNextClick); + // + // labelStartTime + // + this.labelStartTime.AutoSize = true; + this.labelStartTime.Location = new System.Drawing.Point(9, 11); + this.labelStartTime.Name = "labelStartTime"; + this.labelStartTime.Size = new System.Drawing.Size(51, 13); + this.labelStartTime.TabIndex = 3; + this.labelStartTime.Text = "Start time"; + // + // textBoxListViewText + // + this.textBoxListViewText.AllowDrop = true; + this.textBoxListViewText.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxListViewText.ContextMenuStrip = this.contextMenuStripTextBoxListView; + this.textBoxListViewText.Enabled = false; + this.textBoxListViewText.HideSelection = false; + this.textBoxListViewText.Location = new System.Drawing.Point(236, 28); + this.textBoxListViewText.Multiline = true; + this.textBoxListViewText.Name = "textBoxListViewText"; + this.textBoxListViewText.Size = new System.Drawing.Size(362, 63); + this.textBoxListViewText.TabIndex = 5; + this.textBoxListViewText.MouseClick += new System.Windows.Forms.MouseEventHandler(this.TextBoxListViewTextMouseClick); + this.textBoxListViewText.TextChanged += new System.EventHandler(this.TextBoxListViewTextTextChanged); + this.textBoxListViewText.Enter += new System.EventHandler(this.TextBoxListViewTextEnter); + this.textBoxListViewText.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxListViewTextKeyDown); + this.textBoxListViewText.KeyUp += new System.Windows.Forms.KeyEventHandler(this.textBoxListViewText_KeyUp); + this.textBoxListViewText.Leave += new System.EventHandler(this.textBoxListViewText_Leave); + this.textBoxListViewText.MouseMove += new System.Windows.Forms.MouseEventHandler(this.textBoxListViewText_MouseMove); + // + // labelDuration + // + this.labelDuration.AutoSize = true; + this.labelDuration.Location = new System.Drawing.Point(122, 11); + this.labelDuration.Name = "labelDuration"; + this.labelDuration.Size = new System.Drawing.Size(47, 13); + this.labelDuration.TabIndex = 4; + this.labelDuration.Text = "Duration"; + // + // labelAutoDuration + // + this.labelAutoDuration.AutoSize = true; + this.labelAutoDuration.Location = new System.Drawing.Point(92, 11); + this.labelAutoDuration.Name = "labelAutoDuration"; + this.labelAutoDuration.Size = new System.Drawing.Size(29, 13); + this.labelAutoDuration.TabIndex = 30; + this.labelAutoDuration.Text = "Auto"; + // + // tabPage2 + // + this.tabPage2.Controls.Add(this.textBoxSource); + this.tabPage2.Location = new System.Drawing.Point(4, 22); + this.tabPage2.Name = "tabPage2"; + this.tabPage2.Padding = new System.Windows.Forms.Padding(3); + this.tabPage2.Size = new System.Drawing.Size(730, 222); + this.tabPage2.TabIndex = 1; + this.tabPage2.Text = "Source view"; + this.tabPage2.UseVisualStyleBackColor = true; + // + // textBoxSource + // + this.textBoxSource.AllowDrop = true; + this.textBoxSource.Dock = System.Windows.Forms.DockStyle.Fill; + this.textBoxSource.HideSelection = false; + this.textBoxSource.Location = new System.Drawing.Point(3, 3); + this.textBoxSource.MaxLength = 0; + this.textBoxSource.Multiline = true; + this.textBoxSource.Name = "textBoxSource"; + this.textBoxSource.ScrollBars = System.Windows.Forms.ScrollBars.Both; + this.textBoxSource.Size = new System.Drawing.Size(724, 216); + this.textBoxSource.TabIndex = 12; + this.textBoxSource.WordWrap = false; + this.textBoxSource.Click += new System.EventHandler(this.TextBoxSourceClick); + this.textBoxSource.TextChanged += new System.EventHandler(this.TextBoxSourceTextChanged); + this.textBoxSource.DragDrop += new System.Windows.Forms.DragEventHandler(this.TextBoxSourceDragDrop); + this.textBoxSource.DragEnter += new System.Windows.Forms.DragEventHandler(this.TextBoxSourceDragEnter); + this.textBoxSource.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxSourceKeyDown); + this.textBoxSource.KeyUp += new System.Windows.Forms.KeyEventHandler(this.textBoxSource_KeyUp); + this.textBoxSource.Leave += new System.EventHandler(this.TextBoxSourceLeave); + // + // panelVideoPlayer + // + this.panelVideoPlayer.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.panelVideoPlayer.Controls.Add(this.mediaPlayer); + this.panelVideoPlayer.Location = new System.Drawing.Point(1, 1); + this.panelVideoPlayer.Name = "panelVideoPlayer"; + this.panelVideoPlayer.Size = new System.Drawing.Size(220, 246); + this.panelVideoPlayer.TabIndex = 5; + // + // mediaPlayer + // + this.mediaPlayer.AllowDrop = true; + this.mediaPlayer.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.mediaPlayer.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(18)))), ((int)(((byte)(18))))); + this.mediaPlayer.CurrentPosition = 0D; + this.mediaPlayer.FontSizeFactor = 1F; + this.mediaPlayer.LastParagraph = null; + this.mediaPlayer.Location = new System.Drawing.Point(0, 0); + this.mediaPlayer.Margin = new System.Windows.Forms.Padding(0); + this.mediaPlayer.Name = "mediaPlayer"; + this.mediaPlayer.ShowFullscreenButton = true; + this.mediaPlayer.ShowMuteButton = true; + this.mediaPlayer.ShowStopButton = true; + this.mediaPlayer.Size = new System.Drawing.Size(219, 246); + this.mediaPlayer.SmpteMode = false; + this.mediaPlayer.SubtitleText = ""; + this.mediaPlayer.TabIndex = 5; + this.mediaPlayer.TextRightToLeft = System.Windows.Forms.RightToLeft.No; + this.mediaPlayer.VideoHeight = 0; + this.mediaPlayer.VideoPlayer = null; + this.mediaPlayer.VideoWidth = 0; + this.mediaPlayer.Volume = 0D; + this.mediaPlayer.DragDrop += new System.Windows.Forms.DragEventHandler(this.mediaPlayer_DragDrop); + this.mediaPlayer.DragEnter += new System.Windows.Forms.DragEventHandler(this.mediaPlayer_DragEnter); + // + // contextMenuStripEmpty + // + this.contextMenuStripEmpty.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.insertLineToolStripMenuItem, + this.aSSStylesToolStripMenuItem}); + this.contextMenuStripEmpty.Name = "contextMenuStripEmpty"; + this.contextMenuStripEmpty.Size = new System.Drawing.Size(181, 70); + this.contextMenuStripEmpty.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStripEmpty_Opening); + // + // insertLineToolStripMenuItem + // + this.insertLineToolStripMenuItem.Name = "insertLineToolStripMenuItem"; + this.insertLineToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.insertLineToolStripMenuItem.Text = "Insert line"; + this.insertLineToolStripMenuItem.Click += new System.EventHandler(this.InsertLineToolStripMenuItemClick); + // + // imageListPlayRate + // + this.imageListPlayRate.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageListPlayRate.ImageStream"))); + this.imageListPlayRate.TransparentColor = System.Drawing.Color.Transparent; + this.imageListPlayRate.Images.SetKeyName(0, "FastForward.png"); + this.imageListPlayRate.Images.SetKeyName(1, "FastForwardHighLight.png"); + // + // timerTextUndo + // + this.timerTextUndo.Interval = 700; + this.timerTextUndo.Tick += new System.EventHandler(this.TimerTextUndoTick); + // + // timerAlternateTextUndo + // + this.timerAlternateTextUndo.Interval = 700; + this.timerAlternateTextUndo.Tick += new System.EventHandler(this.TimerAlternateTextUndoTick); + // + // aSSStylesToolStripMenuItem + // + this.aSSStylesToolStripMenuItem.Name = "aSSStylesToolStripMenuItem"; + this.aSSStylesToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.aSSStylesToolStripMenuItem.Text = "ASS styles..."; + this.aSSStylesToolStripMenuItem.Click += new System.EventHandler(this.aSSStylesToolStripMenuItem_Click); + // + // Main + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(975, 646); + this.Controls.Add(this.splitContainerMain); + this.Controls.Add(this.toolStrip1); + this.Controls.Add(this.statusStrip1); + this.Controls.Add(this.menuStrip1); + this.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.KeyPreview = true; + this.MainMenuStrip = this.menuStrip1; + this.MinimumSize = new System.Drawing.Size(800, 554); + this.Name = "Main"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormMain_FormClosing); + this.Load += new System.EventHandler(this.Main_Load); + this.Shown += new System.EventHandler(this.Main_Shown); + this.ResizeEnd += new System.EventHandler(this.Main_ResizeEnd); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.MainKeyDown); + this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.MainKeyUp); + this.Resize += new System.EventHandler(this.Main_Resize); + this.statusStrip1.ResumeLayout(false); + this.statusStrip1.PerformLayout(); + this.toolStrip1.ResumeLayout(false); + this.toolStrip1.PerformLayout(); + this.menuStrip1.ResumeLayout(false); + this.menuStrip1.PerformLayout(); + this.contextMenuStripListview.ResumeLayout(false); + this.groupBoxVideo.ResumeLayout(false); + this.groupBoxVideo.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.trackBarWaveformPosition)).EndInit(); + this.panelWaveformControls.ResumeLayout(false); + this.panelWaveformControls.PerformLayout(); + this.toolStripWaveControls.ResumeLayout(false); + this.toolStripWaveControls.PerformLayout(); + this.tabControlButtons.ResumeLayout(false); + this.tabPageTranslate.ResumeLayout(false); + this.tabPageTranslate.PerformLayout(); + this.groupBoxTranslateSearch.ResumeLayout(false); + this.groupBoxTranslateSearch.PerformLayout(); + this.groupBoxAutoContinue.ResumeLayout(false); + this.groupBoxAutoContinue.PerformLayout(); + this.groupBoxAutoRepeat.ResumeLayout(false); + this.groupBoxAutoRepeat.PerformLayout(); + this.tabPageCreate.ResumeLayout(false); + this.tabPageCreate.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSec2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSec1)).EndInit(); + this.tabPageAdjust.ResumeLayout(false); + this.tabPageAdjust.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSecAdjust2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSecAdjust1)).EndInit(); + this.contextMenuStripWaveform.ResumeLayout(false); + this.splitContainerMain.Panel1.ResumeLayout(false); + this.splitContainerMain.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainerMain)).EndInit(); + this.splitContainerMain.ResumeLayout(false); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + this.tabControlSubtitle.ResumeLayout(false); + this.tabPage1.ResumeLayout(false); + this.splitContainerListViewAndText.Panel1.ResumeLayout(false); + this.splitContainerListViewAndText.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainerListViewAndText)).EndInit(); + this.splitContainerListViewAndText.ResumeLayout(false); + this.groupBoxEdit.ResumeLayout(false); + this.groupBoxEdit.PerformLayout(); + this.panelBookmark.ResumeLayout(false); + this.panelBookmark.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxBookmark)).EndInit(); + this.contextMenuStripTextBoxListView.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDuration)).EndInit(); + this.tabPage2.ResumeLayout(false); + this.tabPage2.PerformLayout(); + this.panelVideoPlayer.ResumeLayout(false); + this.contextMenuStripEmpty.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.StatusStrip statusStrip1; + private System.Windows.Forms.ToolStrip toolStrip1; + private System.Windows.Forms.MenuStrip menuStrip1; + private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem optionsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem newToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem reopenToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem saveAsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem findToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem findNextToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem replaceToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem gotoLineNumberToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem settingsToolStripMenuItem; + private System.Windows.Forms.TabControl tabControlSubtitle; + private System.Windows.Forms.TabPage tabPage1; + private Nikse.SubtitleEdit.Controls.SubtitleListView SubtitleListview1; + private System.Windows.Forms.TabPage tabPage2; + private System.Windows.Forms.TextBox textBoxSource; + private System.Windows.Forms.OpenFileDialog openFileDialog1; + private System.Windows.Forms.SaveFileDialog saveFileDialog1; + private System.Windows.Forms.ToolStripButton toolStripButtonFileOpen; + private System.Windows.Forms.ToolStripButton toolStripButtonFileNew; + private System.Windows.Forms.ToolStripButton toolStripButtonSave; + private System.Windows.Forms.ToolStripButton toolStripButtonSaveAs; + private System.Windows.Forms.ToolStripButton toolStripButtonFind; + private System.Windows.Forms.ToolStripButton toolStripButtonReplace; + private System.Windows.Forms.ToolStripButton toolStripButtonSpellCheck; + private System.Windows.Forms.ToolStripButton toolStripButtonSettings; + private System.Windows.Forms.ToolStripButton toolStripButtonVisualSync; + private System.Windows.Forms.ToolStripSeparator toolStripSeparatorFindReplace; + private System.Windows.Forms.ToolStripSeparator toolStripSeparatorFixSyncSpell; + private System.Windows.Forms.ToolStripSeparator toolStripSeparatorHelp; + private System.Windows.Forms.ToolStripButton toolStripButtonHelp; + private System.Windows.Forms.Timer timer1; + private System.Windows.Forms.ToolStripStatusLabel labelStatus; + private System.Windows.Forms.ToolStripMenuItem adjustDisplayTimeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem fixToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem startNumberingFromToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem removeTextForHearImpairedToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; + private System.Windows.Forms.ToolStripMenuItem splitToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem appendTextVisuallyToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem showHistoryforUndoToolStripMenuItem; + private System.Windows.Forms.ContextMenuStrip contextMenuStripListview; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemDelete; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInsertBefore; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInsertAfter; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator7; + private System.Windows.Forms.ToolStripMenuItem boldToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem italicToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem underlineToolStripMenuItem; + private System.Windows.Forms.GroupBox groupBoxEdit; + private System.Windows.Forms.Label labelText; + private System.Windows.Forms.Label labelDuration; + private System.Windows.Forms.Label labelStartTime; + //private System.Windows.Forms.TextBox textBoxListViewText; + Nikse.SubtitleEdit.Controls.SETextBox textBoxListViewText; + private System.Windows.Forms.Button buttonPrevious; + private System.Windows.Forms.Button buttonNext; + private System.Windows.Forms.ToolStripMenuItem splitLineToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem mergeBeforeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem mergeAfterToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator8; + private System.Windows.Forms.Button buttonAutoBreak; + private System.Windows.Forms.ToolStripMenuItem removeFormattinglToolStripMenuItem; + private System.Windows.Forms.Label labelTextLineLengths; + private System.Windows.Forms.NumericUpDown numericUpDownDuration; + private System.Windows.Forms.Label labelDurationWarning; + private System.Windows.Forms.Label labelStartTimeWarning; + private System.Windows.Forms.Button buttonUnBreak; + private System.Windows.Forms.ToolStripMenuItem colorToolStripMenuItem; + private System.Windows.Forms.ColorDialog colorDialog1; + private System.Windows.Forms.Label labelTextLineTotal; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripMenuItem typeEffectToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem karokeeEffectToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem matroskaImportStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator10; + private Nikse.SubtitleEdit.Controls.TimeUpDown timeUpDownStartTime; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemManualAnsi; + private System.Windows.Forms.ToolStripMenuItem ChangeCasingToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemMergeLines; + private System.Windows.Forms.ToolStripSeparator toolStripSeparatorAdvancedFunctions; + private System.Windows.Forms.ToolStripMenuItem visualSyncSelectedLinesToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem showSelectedLinesEarlierlaterToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem adjustDisplayTimeForSelectedLinesToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem fixCommonErrorsInSelectedLinesToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem changeCasingForSelectedLinesToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSortBy; + private System.Windows.Forms.ToolStripMenuItem sortNumberToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem sortStartTimeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem sortEndTimeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem sortDisplayTimeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem sortTextMaxLineLengthToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem sortTextTotalLengthToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem sortTextNumberOfLinesToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem sortTextAlphabeticallytoolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem changeLanguageToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator12; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemCompare; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemUnbreakLines; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemAutoBreakLines; + private System.Windows.Forms.ToolStripSeparator toolStripSeparatorBreakLines; + private System.Windows.Forms.ToolStripMenuItem multipleReplaceToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemImportDvdSubtitles; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSubIdx; + private System.Windows.Forms.ToolStripStatusLabel toolStripSelected; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInsertUnicodeCharacter; + private System.Windows.Forms.ToolStripSeparator toolStripSeparatorInsertUnicodeCharacter; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemAutoMergeShortLines; + private System.Windows.Forms.ToolStripMenuItem setMinimumDisplayTimeBetweenParagraphsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemImportText; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemImportTimeCodes; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemFont; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator14; + private System.Windows.Forms.GroupBox groupBoxVideo; + private System.Windows.Forms.Button buttonGotoSub; + private System.Windows.Forms.Button buttonBeforeText; + private System.Windows.Forms.Button buttonSetEnd; + private System.Windows.Forms.Button buttonSetStartTime; + private System.Windows.Forms.Button buttonInsertNewText; + private System.Windows.Forms.Button buttonSecBack1; + private System.Windows.Forms.Timer ShowSubtitleTimer; + private System.Windows.Forms.Timer timerAutoDuration; + private System.Windows.Forms.Label labelAutoDuration; + private System.Windows.Forms.Timer timerAutoContinue; + private System.Windows.Forms.ToolStripComboBox comboBoxSubtitleFormats; + private System.Windows.Forms.ToolStripSeparator toolStripSeparatorToggle; + private System.Windows.Forms.ToolStripSeparator toolStripSeparatorSubtitleFormat; + private System.Windows.Forms.ToolStripLabel toolStripLabelSubtitleFormat; + private System.Windows.Forms.ToolStripLabel toolStripLabelEncoding; + private System.Windows.Forms.ToolStripComboBox comboBoxEncoding; + private System.Windows.Forms.ToolStripButton toolStripButtonToggleVideo; + private System.Windows.Forms.ToolStripSeparator toolStripSeparatorEncoding; + private System.Windows.Forms.ToolStripSeparator toolStripSeparatorFrameRate; + private System.Windows.Forms.ToolStripLabel toolStripLabelFrameRate; + private System.Windows.Forms.ToolStripComboBox toolStripComboBoxFrameRate; + private System.Windows.Forms.ToolStripButton toolStripButtonGetFrameRate; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSpellCheckMain; + private System.Windows.Forms.ToolStripMenuItem spellCheckToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem findDoubleWordsToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator9; + private System.Windows.Forms.ToolStripMenuItem GetDictionariesToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem addWordToNameListToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSynchronization; + private System.Windows.Forms.ToolStripMenuItem visualSyncToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemPointSync; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemAdjustAllTimes; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemAutoTranslate; + private System.Windows.Forms.ToolStripMenuItem translateByGoogleToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem translateFromSwedishToDanishToolStripMenuItem; + private System.Windows.Forms.Timer timerStillTyping; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemVideo; + private System.Windows.Forms.ToolStripMenuItem openVideoToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator5; + private System.Windows.Forms.ToolStripMenuItem showhideVideoToolStripMenuItem; + private System.Windows.Forms.Label labelVideoPosition; + private Controls.TimeUpDown timeUpDownVideoPosition; + private System.Windows.Forms.TabControl tabControlButtons; + private System.Windows.Forms.TabPage tabPageTranslate; + private System.Windows.Forms.GroupBox groupBoxTranslateSearch; + private System.Windows.Forms.Button buttonGoogleTranslateIt; + private System.Windows.Forms.Button buttonGoogleIt; + private System.Windows.Forms.TextBox textBoxSearchWord; + private System.Windows.Forms.GroupBox groupBoxAutoContinue; + private System.Windows.Forms.ComboBox comboBoxAutoContinue; + private System.Windows.Forms.Label labelAutoContinueDelay; + private System.Windows.Forms.CheckBox checkBoxAutoContinue; + private System.Windows.Forms.GroupBox groupBoxAutoRepeat; + private System.Windows.Forms.ComboBox comboBoxAutoRepeat; + private System.Windows.Forms.Label labelAutoRepeatCount; + private System.Windows.Forms.CheckBox checkBoxAutoRepeatOn; + private System.Windows.Forms.Button buttonStop; + private System.Windows.Forms.Button buttonPlayPrevious; + private System.Windows.Forms.Button buttonPlayCurrent; + private System.Windows.Forms.Button buttonPlayNext; + private System.Windows.Forms.TabPage tabPageCreate; + private System.Windows.Forms.TabPage tabPageAdjust; + private System.Windows.Forms.Button buttonAdjustGoToPosAndPause; + private System.Windows.Forms.Button buttonAdjustPlayBefore; + private System.Windows.Forms.Button buttonAdjustSetEndTime; + private System.Windows.Forms.Button buttonSetEndAndGoToNext; + private System.Windows.Forms.Button buttonSetStartAndOffsetRest; + private System.Windows.Forms.Button buttonAdjustSetStartTime; + private System.Windows.Forms.Label labelTranslateTip; + private System.Windows.Forms.Button buttonCustomUrl1; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemOpenContainingFolder; + private System.Windows.Forms.NumericUpDown numericUpDownSec1; + private System.Windows.Forms.Button buttonForward1; + private System.Windows.Forms.Label labelVideoPosition2; + private Controls.TimeUpDown timeUpDownVideoPositionAdjust; + private System.Windows.Forms.Button buttonAdjustSecForward1; + private System.Windows.Forms.NumericUpDown numericUpDownSecAdjust1; + private System.Windows.Forms.Button buttonAdjustSecBack1; + private System.Windows.Forms.Button buttonForward2; + private System.Windows.Forms.NumericUpDown numericUpDownSec2; + private System.Windows.Forms.Button buttonSecBack2; + private System.Windows.Forms.Button buttonAdjustSecForward2; + private System.Windows.Forms.NumericUpDown numericUpDownSecAdjust2; + private System.Windows.Forms.Button buttonAdjustSecBack2; + private System.Windows.Forms.CheckBox checkBoxSyncListViewWithVideoWhilePlaying; + private System.Windows.Forms.Label labelAdjustF10; + private System.Windows.Forms.Label labelAdjustF9; + private System.Windows.Forms.Label labelAdjustF11; + private System.Windows.Forms.Label labelAdjustF12; + private System.Windows.Forms.Label labelCreateF12; + private System.Windows.Forms.Label labelCreateF11; + private System.Windows.Forms.Label labelCreateF10; + private System.Windows.Forms.Label labelCreateF9; + private System.Windows.Forms.ToolStripMenuItem translatepoweredByMicrosoftToolStripMenuItem; + private System.Windows.Forms.ToolStripButton toolStripButtonToggleWaveform; + private Controls.VideoPlayerContainer mediaPlayer; + private System.Windows.Forms.Panel panelVideoPlayer; + private Controls.AudioVisualizer audioVisualizer; + private System.Windows.Forms.Timer timerWaveform; + private System.Windows.Forms.ContextMenuStrip contextMenuStripWaveform; + private System.Windows.Forms.ToolStripMenuItem addParagraphHereToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem deleteParagraphToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem splitToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem mergeWithPreviousToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem mergeWithNextToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemWaveformPlaySelection; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator11; + private System.Windows.Forms.Panel panelWaveformControls; + private System.Windows.Forms.ToolStrip toolStripWaveControls; + private System.Windows.Forms.ToolStripButton toolStripButtonWaveformZoomIn; + private System.Windows.Forms.ToolStripComboBox toolStripComboBoxWaveform; + private System.Windows.Forms.ToolStripButton toolStripButtonWaveformZoomOut; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator16; + private System.Windows.Forms.ToolStripButton toolStripButtonWaveformPause; + private System.Windows.Forms.ToolStripButton toolStripButtonWaveformPlay; + private System.Windows.Forms.TrackBar trackBarWaveformPosition; + private System.Windows.Forms.Label labelVideoInfo; + private System.Windows.Forms.ToolStripMenuItem showhideWaveformToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemImportBluRaySup; + private System.Windows.Forms.Label labelCharactersPerSecond; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemNetworking; + private System.Windows.Forms.ToolStripMenuItem startServerToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem joinSessionToolStripMenuItem; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusNetworking; + private System.Windows.Forms.ToolStripMenuItem leaveSessionToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem showSessionKeyLogToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem chatToolStripMenuItem; + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.SplitContainer splitContainerMain; + private System.Windows.Forms.ToolStripMenuItem undockVideoControlsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem redockVideoControlsToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator19; + private System.Windows.Forms.ToolStripButton toolStripButtonLockCenter; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInsertSubtitle; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemAutoSplitLongLines; + private System.Windows.Forms.ContextMenuStrip contextMenuStripEmpty; + private System.Windows.Forms.ToolStripMenuItem insertLineToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem closeVideoToolStripMenuItem; + private System.Windows.Forms.Label labelSingleLine; + private System.Windows.Forms.Label labelAlternateText; + private System.Windows.Forms.Label labelAlternateCharactersPerSecond; + private System.Windows.Forms.Label labelTextAlternateLineTotal; + private System.Windows.Forms.Label labelAlternateSingleLine; + private System.Windows.Forms.Label labelTextAlternateLineLengths; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator20; + private System.Windows.Forms.ToolStripMenuItem saveOriginalToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem saveOriginalAstoolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem openOriginalToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem removeOriginalToolStripMenuItem; + private System.Windows.Forms.ToolStripSplitButton toolStripSplitButtonPlayRate; + private System.Windows.Forms.ImageList imageListPlayRate; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSetAudioTrack; + private System.Windows.Forms.Button buttonSplitLine; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemChangeFrameRate2; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemCopySourceText; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator21; + private System.Windows.Forms.ToolStripMenuItem editSelectAllToolStripMenuItem; + private System.Windows.Forms.ContextMenuStrip contextMenuStripTextBoxListView; + private System.Windows.Forms.ToolStripMenuItem cutToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem copyToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem pasteToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSplitTextAtCursor; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator18; + private System.Windows.Forms.ToolStripMenuItem selectAllToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator17; + private System.Windows.Forms.ToolStripMenuItem normalToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem boldToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem italicToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem underlineToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem colorToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem fontNameToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator22; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemExport; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemExportPngXml; + private System.Windows.Forms.ToolStripMenuItem pointSyncViaOtherSubtitleToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemGoogleMicrosoftTranslateSelLine; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator23; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemMakeEmptyFromCurrent; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator24; + private System.Windows.Forms.ToolStripMenuItem showWaveformAndSpectrogramToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem showOnlyWaveformToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem showOnlySpectrogramToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator26; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInsertUnicodeSymbol; + private System.Windows.Forms.ToolStripMenuItem setStylesForSelectedLinesToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem FindDoubleLinesToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem eBUSTLToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem pACScreenElectronicsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemCavena890; + private Controls.SETextBox textBoxListViewTextAlternate; + private System.Windows.Forms.ToolStripMenuItem textCharssecToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem plainTextToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem bluraySupToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem vobSubsubidxToolStripMenuItem; + private System.Windows.Forms.Timer timerTextUndo; + private System.Windows.Forms.Timer timerAlternateTextUndo; + private System.Windows.Forms.ToolStripMenuItem adobeEncoreFABImageScriptToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemMergeDialog; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSurroundWithMusicSymbols; + private System.Windows.Forms.ToolStripMenuItem superscriptToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem subscriptToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemImagePerFrame; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemApplyDurationLimits; + private System.Windows.Forms.ToolStripMenuItem generateDatetimeInfoFromVideoToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator25; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemRightToLeftMode; + private System.Windows.Forms.ToolStripMenuItem joinSubtitlesToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemReverseRightToLeftStartEnd; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemExportCapMakerPlus; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemExportCheetahCap; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemExportCaptionInc; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemExportUltech130; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemAssStyles; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSubStationAlpha; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemAlignment; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemRestoreAutoBackup; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemStatistics; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemDCinemaProperties; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemTextTimeCodePair; + private System.Windows.Forms.ToolStripMenuItem textWordsPerMinutewpmToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemTTProperties; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSaveSelectedLines; + private System.Windows.Forms.Button buttonCustomUrl2; + private System.Windows.Forms.ToolStripMenuItem addParagraphAndPasteToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparatorGuessTimeCodes; + private System.Windows.Forms.ToolStripMenuItem guessTimeCodesToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem DvdStudioProStl; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemUndo; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemRedo; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemShowOriginalInPreview; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemPlugins; + private System.Windows.Forms.ToolStripMenuItem seekSilenceToolStripMenuItem; + private System.Windows.Forms.SplitContainer splitContainerListViewAndText; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemColumn; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemColumnDeleteText; + private System.Windows.Forms.ToolStripMenuItem ShiftTextCellsDownToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemPasteSpecial; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemColumnImportText; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInsertTextFromSub; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemOpenKeepVideo; + private System.Windows.Forms.ToolStripMenuItem changeSpeedInPercentToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemAvidStl; + private System.Windows.Forms.ToolStripMenuItem columnDeleteTextOnlyToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemBatchConvert; + private System.Windows.Forms.ToolStripMenuItem copyOriginalTextToCurrentToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemMergeDuplicateText; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSpumux; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemWebVTT; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemWebVttVoice; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemPreview; + private System.Windows.Forms.ToolStripSeparator toolStripSeparatorWebVTT; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemModifySelection; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInverseSelection; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSpellCheckFromCurrentLine; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemImportXSub; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemImportOcrHardSub; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemExportFcpIImage; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemNuendoProperties; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemDost; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemMeasurementConverter; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemImportChapters; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemImportSceneChanges; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemRemoveSceneChanges; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSubtitlesBridgeGaps; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemOpenDvd; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemFcpProperties; + private System.Windows.Forms.ToolStripMenuItem styleToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemFocusTextbox; + private System.Windows.Forms.ToolStripSeparator toolStripSeparatorAscOrDesc; + private System.Windows.Forms.ToolStripMenuItem AscendingToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem descendingToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparatorExportCustomText; + private System.Windows.Forms.ToolStripMenuItem exportCustomTextFormatToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSetLanguage; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInsertUnicodeControlCharacters; + private System.Windows.Forms.ToolStripMenuItem leftToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem righttoleftMarkToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem startOfLefttorightEmbeddingLREToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem startOfRighttoleftEmbeddingRLEToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem startOfLefttorightOverrideLROToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem startOfRighttoleftOverrideRLOToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemRtlUnicodeControlChars; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemRemoveUnicodeControlChars; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemImportImages; + private System.Windows.Forms.ToolStripButton toolStripButtonRemoveTextForHi; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemExportDcinemaInterop; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemMergeLinesWithSameTimeCodes; + private System.Windows.Forms.ToolStripMenuItem checkForUpdatesToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItemSplitterCheckForUpdates; + private System.Windows.Forms.ToolStripMenuItem setVideoOffsetToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemDvdStudioProProperties; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemEdlClipName; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemAddWaveformBatch; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemExportBdTextSt; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabelProgress; + private System.Windows.Forms.ToolStripMenuItem uniPacExportToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemExportAyato; + private System.Windows.Forms.ToolStripButton toolStripButtonFixCommonErrors; + private System.Windows.Forms.ToolStripMenuItem removeSceneChangeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem addSceneChangeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem netflixQualityCheckToolStripMenuItem; + private System.Windows.Forms.ToolStripButton toolStripButtonNetflixQualityCheck; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemEdl; + private System.Windows.Forms.ToolStripMenuItem setActorForSelectedLinesToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSetRegion; + private System.Windows.Forms.ToolStripMenuItem insertSubtitleHereToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem actorToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemFcpXmlAdvanced; + private System.Windows.Forms.Label labelNextWord; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemOpenVideoFromUrl; + private System.Windows.Forms.ToolStripMenuItem smpteTimeModedropFrameToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem moveTextUpToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem moveTextDownToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem generateTextFromCurrentVideoToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSplitViaWaveform; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemEbuProperties; + private System.Windows.Forms.ToolStripMenuItem boxToolStripMenuItem; + private System.Windows.Forms.ImageList imageListBookmarks; + private System.Windows.Forms.Panel panelBookmark; + private System.Windows.Forms.Label labelBookmark; + private System.Windows.Forms.PictureBox pictureBoxBookmark; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemTranslateSelected; + private System.Windows.Forms.ToolStripMenuItem googleTranslateToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem microsoftBingTranslateToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemBookmark; + private System.Windows.Forms.ToolStripMenuItem removeAllFormattingsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem removeBoldToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem removeItalicToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem removeUnderlineToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem removeColorToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem removeFontNameToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem removeAlignmentToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemBouten; + private System.Windows.Forms.ToolStripMenuItem boutendotbeforeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem boutendotafterToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem boutendotoutsideToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem boutenfilledcircleoutsideToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem boutenopencircleoutsideToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem boutenopendotoutsideToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem boutenfilledsesameoutsideToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem boutenopensesameoutsideToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem boutenautooutsideToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem boutenautoToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemHorizontalDigits; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSetParagraphAsSelection; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemRuby; + private System.Windows.Forms.Label labelSingleLinePixels; + private System.Windows.Forms.Label labelAlternateSingleLinePixels; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; + private System.Windows.Forms.ToolStripMenuItem extendBeforeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem extendAfterToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem extendToPreviousToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem extendToNextToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator6; + private System.Windows.Forms.ToolStripMenuItem goToPreviousSubtitleStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem goToNextSubtitleStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem dCinemaSMPTE2014ToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem boxToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemAssaStyles; + private System.Windows.Forms.ToolStripMenuItem openSecondSubtitleToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem aSSStylesToolStripMenuItem; + } } \ No newline at end of file diff --git a/src/Forms/Main.cs b/src/ui/Forms/Main.cs similarity index 97% rename from src/Forms/Main.cs rename to src/ui/Forms/Main.cs index 1edcc0bd7..0b578f3b6 100644 --- a/src/Forms/Main.cs +++ b/src/ui/Forms/Main.cs @@ -1,28846 +1,28846 @@ -using Nikse.SubtitleEdit.Controls; -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.BluRaySup; -using Nikse.SubtitleEdit.Core.ContainerFormats; -using Nikse.SubtitleEdit.Core.ContainerFormats.MaterialExchangeFormat; -using Nikse.SubtitleEdit.Core.ContainerFormats.Matroska; -using Nikse.SubtitleEdit.Core.ContainerFormats.Mp4; -using Nikse.SubtitleEdit.Core.ContainerFormats.Mp4.Boxes; -using Nikse.SubtitleEdit.Core.ContainerFormats.TransportStream; -using Nikse.SubtitleEdit.Core.Enums; -using Nikse.SubtitleEdit.Core.Forms; -using Nikse.SubtitleEdit.Core.NetflixQualityCheck; -using Nikse.SubtitleEdit.Core.SpellCheck; -using Nikse.SubtitleEdit.Core.SubtitleFormats; -using Nikse.SubtitleEdit.Core.VobSub; -using Nikse.SubtitleEdit.Forms.Networking; -using Nikse.SubtitleEdit.Forms.Ocr; -using Nikse.SubtitleEdit.Forms.Styles; -using Nikse.SubtitleEdit.Logic; -using Nikse.SubtitleEdit.Logic.CommandLineConvert; -using Nikse.SubtitleEdit.Logic.Networking; -using Nikse.SubtitleEdit.Logic.VideoPlayers; -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Net; -using System.Reflection; -using System.Text; -using System.Text.RegularExpressions; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - - public sealed partial class Main : Form - { - private class ComboBoxZoomItem - { - public string Text { get; set; } - public double ZoomFactor { get; set; } - - public override string ToString() - { - return Text; - } - } - - private const int TabControlListView = 0; - private const int TabControlSourceView = 1; - - private Subtitle _subtitle = new Subtitle(); - - private int _undoIndex = -1; - private string _listViewTextUndoLast; - private int _listViewTextUndoIndex = -1; - private long _listViewTextTicks = -1; - private string _listViewAlternateTextUndoLast; - private long _listViewAlternateTextTicks = -1; - - private Subtitle _subtitleAlternate = new Subtitle(); - private string _subtitleAlternateFileName; - private string _fileName; - - private int _videoAudioTrackNumber = -1; - public int VideoAudioTrackNumber - { - get => _videoAudioTrackNumber; - set - { - if (_videoAudioTrackNumber != value) - { - if (value >= 0 && _videoAudioTrackNumber != -1) - { - ReloadWaveform(VideoFileName, value); - } - _videoAudioTrackNumber = value; - } - } - } - - public string VideoFileName { get; set; } - - private DateTime _fileDateTime; - private string _title; - private FindReplaceDialogHelper _findHelper; - private int _replaceStartLineIndex; - private bool _sourceViewChange; - private int _changeSubtitleHash = -1; - private int _changeAlternateSubtitleHash = -1; - private int _subtitleListViewIndex = -1; - private Paragraph _oldSelectedParagraph; - private bool _converted; - private SubtitleFormat _oldSubtitleFormat; - private List _selectedIndices; - private LanguageStructure.Main _language; - private LanguageStructure.General _languageGeneral; - private SpellCheck _spellCheckForm; - private bool _loading = true; - private bool _exitWhenLoaded; - private int _repeatCount = -1; - private double _endSeconds = -1; - private double _endSecondsNewPosition = -1; - private long _endSecondsNewPositionTicks; - private const double EndDelay = 0.05; - private int _autoContinueDelayCount = -1; - private long _lastTextKeyDownTicks; - private long _lastHistoryTicks; - private long _lastWaveformMenuCloseTicks; - private double? _audioWaveformRightClickSeconds; - private readonly Timer _timerDoSyntaxColoring = new Timer(); - private Timer _timerAutoBackup; - private readonly Timer _timerClearStatus = new Timer(); - private string _textAutoBackup; - private string _textAutoBackupOriginal; - private readonly List _statusLog = new List(); - private bool _disableShowStatus; - private StatusLog _statusLogForm; - private bool _makeHistoryPaused; - private bool _saveAsCalled; - - private CheckForUpdatesHelper _checkForUpdatesHelper; - private Timer _timerCheckForUpdates; - - private NikseWebServiceSession _networkSession; - private NetworkChat _networkChat; - - private ShowEarlierLater _showEarlierOrLater; - private MeasurementConverter _measurementConverter; - - private bool _isVideoControlsUndocked; - private VideoPlayerUndocked _videoPlayerUndocked; - private WaveformUndocked _waveformUndocked; - private VideoControlsUndocked _videoControlsUndocked; - - private GoogleOrMicrosoftTranslate _googleOrMicrosoftTranslate; - - private bool _cancelWordSpellCheck = true; - private bool _cleanupHasRun; - - private bool _clearLastFind; - private FindType _clearLastFindType = FindType.Normal; - private string _clearLastFindText = string.Empty; - private bool _videoLoadedGoToSubPosAndPause; - private string _cutText = string.Empty; - private Paragraph _mainCreateStartDownEndUpParagraph; - private Paragraph _mainAdjustStartDownEndUpAndGoToNextParagraph; - private int _lastDoNotPrompt = -1; - private VideoInfo _videoInfo; - private bool _splitDualSami; - private bool _openFileDialogOn; - private bool _resetVideo = true; - private bool _doAutoBreakOnTextChanged = true; - private readonly static object _syncUndo = new object(); - private string[] _dragAndDropFiles; - private readonly Timer _dragAndDropTimer = new Timer(); // to prevent locking windows explorer - private readonly Timer _dragAndDropVideoTimer = new Timer(); // to prevent locking windows explorer - private long _labelNextTicks = -1; - private bool _showBookmarkLabel = true; - private ContextMenu _bookmarkContextMenu; - private readonly MainShortcuts _shortcuts = new MainShortcuts(); - private long _winLeftDownTicks = -1; - private long _winRightDownTicks = -1; - - public bool IsMenuOpen { get; private set; } - - private bool AutoRepeatContinueOn - { - get { return tabControlButtons.SelectedIndex == 0 && checkBoxAutoContinue.Checked; } - } - - private bool AutoRepeatOn - { - get { return tabControlButtons.SelectedIndex == 0 && checkBoxAutoRepeatOn.Checked; } - } - - public string Title - { - get - { - if (_title == null) - { - var versionInfo = Utilities.AssemblyVersion.Split('.'); - _title = $"{_languageGeneral.Title} {versionInfo[0]}.{versionInfo[1]}.{versionInfo[2]}"; - } - - return _title; - } - } - - private void SetCurrentFormat(string formatName) - { - SetCurrentFormat(SubtitleFormat.FromName(formatName, new SubRip())); - } - - private void SetCurrentFormat(SubtitleFormat format) - { - if (format.IsVobSubIndexFile) - { - UiUtil.InitializeSubtitleFormatComboBox(comboBoxSubtitleFormats, format); - SubtitleListview1.HideNonVobSubColumns(); - } - else if (comboBoxSubtitleFormats.Items.Count == 1) - { - SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.Extra); - SetFormatTo(format); - } - else - { - int index = 0; - foreach (string name in comboBoxSubtitleFormats.Items) - { - if (name == format.FriendlyName) - { - comboBoxSubtitleFormats.SelectedIndex = index; - return; - } - - index++; - } - } - } - - protected override void OnLoad(EventArgs e) - { - UiUtil.FixFonts(this, 10000); - UiUtil.FixFonts(contextMenuStripListview); - UiUtil.FixFonts(contextMenuStripTextBoxListView); - UiUtil.FixFonts(contextMenuStripWaveform); - UiUtil.FixLargeFonts(tabControlButtons, buttonAutoBreak); - UiUtil.FixLargeFonts(tabControlButtons, buttonAutoBreak); - UiUtil.FixLargeFonts(groupBoxEdit, buttonAutoBreak); - UiUtil.InitializeSubtitleFont(textBoxSource); - UiUtil.InitializeSubtitleFont(SubtitleListview1); - - using (var graphics = CreateGraphics()) - { - // avoid weird looking layout for high DPI - if (graphics.DpiX > 120) - { - Font = new Font(Font.FontFamily, (float)(Font.Size * graphics.DpiX / 96.0)); - - numericUpDownDuration.Left = timeUpDownStartTime.Right + 15; - numericUpDownDuration.Width += 5; - labelDuration.Left = numericUpDownDuration.Left - 3; - } - var xDiff = timeUpDownStartTime.Top - (labelStartTime.Top + labelStartTime.Height); - if (xDiff < 0) // DPI auto-size fixes: see https://github.com/SubtitleEdit/subtitleedit/issues/3981 - { - xDiff *= -1; - timeUpDownStartTime.Top += xDiff; - numericUpDownDuration.Top += xDiff; - pictureBoxBookmark.Top += xDiff; - textBoxListViewText.Top += xDiff; - textBoxListViewText.Height -= xDiff; - textBoxListViewTextAlternate.Top += xDiff; - textBoxListViewTextAlternate.Height -= xDiff; - comboBoxAutoRepeat.Top += xDiff; - comboBoxAutoContinue.Top += xDiff; - } - } - labelAutoDuration.Left = labelDuration.Left - (labelAutoDuration.Width - 5); - - textBoxListViewText.BackColor = !IsSubtitleLoaded ? SystemColors.ActiveBorder : SystemColors.WindowFrame; - textBoxListViewTextAlternate.BackColor = !IsSubtitleLoaded ? SystemColors.ActiveBorder : SystemColors.WindowFrame; - - base.OnLoad(e); - } - - private static string GetArgumentAfterColon(IEnumerable commandLineArguments, string requestedArgumentName) - { - foreach (var argument in commandLineArguments) - { - if (argument.StartsWith(requestedArgumentName, StringComparison.OrdinalIgnoreCase)) - { - if (requestedArgumentName.EndsWith(':')) - { - return argument.Substring(requestedArgumentName.Length); - } - - return argument; - } - } - - return null; - } - - public Main() - { - if (Configuration.IsRunningOnLinux) - { - NativeMethods.setlocale(NativeMethods.LC_NUMERIC, "C"); - } - - try - { - UiUtil.PreInitialize(this); - InitializeComponent(); - - Icon = Properties.Resources.SubtitleEditFormIcon; - - textBoxListViewTextAlternate.Visible = false; - labelAlternateText.Visible = false; - labelAlternateCharactersPerSecond.Visible = false; - labelTextAlternateLineLengths.Visible = false; - labelAlternateSingleLine.Visible = false; - labelAlternateSingleLinePixels.Visible = false; - labelTextAlternateLineTotal.Visible = false; - labelNextWord.Visible = false; - - SetLanguage(Configuration.Settings.General.Language); - toolStripStatusNetworking.Visible = false; - labelTextLineLengths.Text = string.Empty; - labelCharactersPerSecond.Text = string.Empty; - labelTextLineTotal.Text = string.Empty; - labelStartTimeWarning.Text = string.Empty; - labelDurationWarning.Text = string.Empty; - labelVideoInfo.Text = string.Empty; - labelSingleLine.Text = string.Empty; - labelSingleLinePixels.Text = string.Empty; - Text = Title; - timeUpDownStartTime.TimeCode = new TimeCode(); - timeUpDownStartTime.UseVideoOffset = true; - timeUpDownVideoPosition.UseVideoOffset = true; - timeUpDownVideoPositionAdjust.UseVideoOffset = true; - checkBoxAutoRepeatOn.Checked = Configuration.Settings.General.AutoRepeatOn; - comboBoxAutoRepeat.SelectedIndex = Configuration.Settings.General.AutoRepeatCount; - checkBoxAutoContinue.Checked = Configuration.Settings.General.AutoContinueOn; - checkBoxSyncListViewWithVideoWhilePlaying.Checked = Configuration.Settings.General.SyncListViewWithVideoWhilePlaying; - - SetFormatTo(Configuration.Settings.General.DefaultSubtitleFormat); - - UiUtil.InitializeTextEncodingComboBox(comboBoxEncoding.ComboBox); - - // set up UI interfaces / injections - YouTubeAnnotations.GetYouTubeAnnotationStyles = new UiGetYouTubeAnnotationStyles(); - Ebu.EbuUiHelper = new UiEbuSaveHelper(); - Pac.GetPacEncodingImplementation = new UiGetPacEncoding(this); - RichTextToPlainText.NativeRtfTextConverter = new RtfTextConverterRichTextBox(); - - toolStripComboBoxFrameRate.Items.Add(23.976.ToString(CultureInfo.CurrentCulture)); - toolStripComboBoxFrameRate.Items.Add(24.0.ToString(CultureInfo.CurrentCulture)); - toolStripComboBoxFrameRate.Items.Add(25.0.ToString(CultureInfo.CurrentCulture)); - toolStripComboBoxFrameRate.Items.Add(29.97.ToString(CultureInfo.CurrentCulture)); - toolStripComboBoxFrameRate.Items.Add(30.ToString(CultureInfo.CurrentCulture)); - toolStripComboBoxFrameRate.Text = Configuration.Settings.General.DefaultFrameRate.ToString(); - pictureBoxBookmark.Visible = false; - - UpdateRecentFilesUI(); - InitializeToolbar(); - UpdateNetflixGlyphCheckToolsVisibility(); - Utilities.SetSecurityProtocol(); // download from Github requires TLS 1.2 - - tabControlSubtitle.SelectTab(TabControlSourceView); // AC - ShowSourceLineNumber(); // AC - tabControlSubtitle.SelectTab(TabControlListView); // AC - if (Configuration.Settings.General.StartInSourceView) - { - tabControlSubtitle.SelectTab(TabControlSourceView); - } - - audioVisualizer.Visible = Configuration.Settings.General.ShowAudioVisualizer; - audioVisualizer.ShowWaveform = Configuration.Settings.General.ShowWaveform; - audioVisualizer.ShowSpectrogram = Configuration.Settings.General.ShowSpectrogram; - panelWaveformControls.Visible = Configuration.Settings.General.ShowAudioVisualizer; - trackBarWaveformPosition.Visible = Configuration.Settings.General.ShowAudioVisualizer; - toolStripButtonToggleWaveform.Checked = Configuration.Settings.General.ShowAudioVisualizer; - toolStripButtonToggleVideo.Checked = Configuration.Settings.General.ShowVideoPlayer; - - if (Configuration.Settings.General.UseTimeFormatHHMMSSFF) - { - numericUpDownDuration.DecimalPlaces = 2; - numericUpDownDuration.Increment = (decimal)(0.01); - toolStripSeparatorFrameRate.Visible = true; - toolStripLabelFrameRate.Visible = true; - toolStripComboBoxFrameRate.Visible = true; - toolStripButtonGetFrameRate.Visible = true; - } - - _timerClearStatus.Interval = Configuration.Settings.General.ClearStatusBarAfterSeconds * 1000; - _timerClearStatus.Tick += TimerClearStatus_Tick; - - var commandLineArgs = Environment.GetCommandLineArgs(); - var fileName = string.Empty; - int srcLineNumber = -1; - if (commandLineArgs.Length > 1) - { - // ConvertOrReturn() shall not return if a command line conversion has been requested - CommandLineConverter.ConvertOrReturn(Title, commandLineArgs); - - fileName = commandLineArgs[1]; - - if (fileName.Equals("/batchconvertui", StringComparison.OrdinalIgnoreCase) || fileName.Equals("-batchconvertui", StringComparison.OrdinalIgnoreCase)) - { - new BatchConvert(this.Icon).ShowDialog(); - Environment.Exit(0); - } - - var sourceLineString = GetArgumentAfterColon(commandLineArgs, "/srcline:"); - if (!int.TryParse(sourceLineString, out srcLineNumber)) - { - srcLineNumber = -1; - } - - VideoFileName = GetArgumentAfterColon(commandLineArgs, "/video:"); - } - - labelAutoDuration.Visible = false; - mediaPlayer.SubtitleText = string.Empty; - comboBoxAutoContinue.SelectedIndex = Configuration.Settings.General.AutoContinueDelay; - - timeUpDownVideoPosition.TimeCode = new TimeCode(); - timeUpDownVideoPositionAdjust.TimeCode = new TimeCode(); - timeUpDownVideoPosition.TimeCodeChanged += VideoPositionChanged; - timeUpDownVideoPositionAdjust.TimeCodeChanged += VideoPositionChanged; - timeUpDownVideoPosition.Enabled = false; - timeUpDownVideoPositionAdjust.Enabled = false; - - switch (Configuration.Settings.VideoControls.LastActiveTab) - { - case "Translate": - tabControlButtons.SelectedIndex = 0; - break; - case "Create": - tabControlButtons.SelectedIndex = 1; - break; - case "Adjust": - tabControlButtons.SelectedIndex = 2; - break; - } - - tabControl1_SelectedIndexChanged(null, null); - buttonCustomUrl1.Text = Configuration.Settings.VideoControls.CustomSearchText1; - buttonCustomUrl1.Visible = Configuration.Settings.VideoControls.CustomSearchUrl1.Length > 1; - buttonCustomUrl2.Text = Configuration.Settings.VideoControls.CustomSearchText2; - buttonCustomUrl2.Visible = Configuration.Settings.VideoControls.CustomSearchUrl2.Length > 1; - - CheckAndGetNewlyDownloadedMpvDlls(string.Empty); - - if (fileName.Length > 0 && File.Exists(fileName)) - { - fileName = Path.GetFullPath(fileName); - - if (srcLineNumber < 0) - { - if (!OpenFromRecentFiles(fileName)) - { - OpenSubtitle(fileName, null, VideoFileName, null, true); - } - } - else - { - OpenSubtitle(fileName, null, VideoFileName, null, true); - } - - if (srcLineNumber >= 0 && GetCurrentSubtitleFormat().GetType() == typeof(SubRip) && srcLineNumber < textBoxSource.Lines.Length) - { - int pos = 0; - for (int i = 0; i < srcLineNumber; i++) - { - pos += textBoxSource.Lines[i].Length; - } - - if (pos + 35 < textBoxSource.TextLength) - { - pos += 35; - } - - string s = textBoxSource.Text.Substring(0, pos); - int lastTimeCode = s.LastIndexOf(" --> ", StringComparison.Ordinal); // 00:02:26,407 --> 00:02:31,356 - if (lastTimeCode > 14 && lastTimeCode + 16 >= s.Length) - { - s = s.Substring(0, lastTimeCode - 5); - lastTimeCode = s.LastIndexOf(" --> ", StringComparison.Ordinal); - } - - if (lastTimeCode > 14 && lastTimeCode + 16 < s.Length) - { - string tc = s.Substring(lastTimeCode - 13, 30).Trim(); - int index = 0; - foreach (var p in _subtitle.Paragraphs) - { - if (tc == p.StartTime + " --> " + p.EndTime) - { - SubtitleListview1.SelectNone(); - SubtitleListview1.Items[0].Selected = false; - SubtitleListview1.SelectIndexAndEnsureVisible(index, true); - break; - } - - index++; - } - } - } - } - else if (Configuration.Settings.General.StartLoadLastFile && Configuration.Settings.RecentFiles.Files.Count > 0) - { - fileName = Configuration.Settings.RecentFiles.Files[0].FileName; - if (!string.IsNullOrEmpty(fileName) && File.Exists(fileName) && !OpenFromRecentFiles(fileName)) - { - OpenSubtitle(fileName, null); - } - } - - // Initialize events etc. for audio waveform - audioVisualizer.OnDoubleClickNonParagraph += AudioWaveform_OnDoubleClickNonParagraph; - audioVisualizer.OnPositionSelected += AudioWaveform_OnPositionSelected; - audioVisualizer.OnTimeChanged += AudioWaveform_OnTimeChanged; // start and/or end position of paragraph changed - audioVisualizer.OnNewSelectionRightClicked += AudioWaveform_OnNewSelectionRightClicked; - audioVisualizer.OnParagraphRightClicked += AudioWaveform_OnParagraphRightClicked; - audioVisualizer.OnNonParagraphRightClicked += AudioWaveform_OnNonParagraphRightClicked; - audioVisualizer.OnSingleClick += AudioWaveform_OnSingleClick; - audioVisualizer.OnPause += AudioWaveform_OnPause; - audioVisualizer.OnTimeChangedAndOffsetRest += AudioWaveform_OnTimeChangedAndOffsetRest; - audioVisualizer.OnZoomedChanged += AudioWaveform_OnZoomedChanged; - audioVisualizer.InsertAtVideoPosition += audioVisualizer_InsertAtVideoPosition; - audioVisualizer.PasteAtVideoPosition += audioVisualizer_PasteAtVideoPosition; - audioVisualizer.KeyDown += AudioVisualizer_KeyDown; - SetAudioVisualizerSettings(); - if (Configuration.Settings.General.WaveformUpdateIntervalMs > 0 && Configuration.Settings.General.WaveformUpdateIntervalMs < 200) - { - timerWaveform.Interval = Configuration.Settings.General.WaveformUpdateIntervalMs; - } - - InitializeWaveformZoomDropdown(); - toolStripComboBoxWaveform.SelectedIndexChanged += toolStripComboBoxWaveform_SelectedIndexChanged; - - FixLargeFonts(); - - if (Configuration.Settings.General.RightToLeftMode) - { - ToolStripMenuItemRightToLeftModeClick(null, null); - } - - timeUpDownStartTime.SetAutoWidth(); - numericUpDownDuration.Left = timeUpDownStartTime.Right + 4; - labelDurationWarning.Left = numericUpDownDuration.Left; - labelDuration.Left = labelDurationWarning.Left; - - timeUpDownVideoPosition.SetAutoWidth(); - timeUpDownVideoPositionAdjust.SetAutoWidth(); - } - catch (Exception exception) - { - Cursor = Cursors.Default; - MessageBox.Show(exception.Message + Environment.NewLine + exception.StackTrace); - SeLogger.Error(exception, "Main constructor"); - } - } - - private void AudioVisualizer_KeyDown(object sender, KeyEventArgs e) - { - if (SubtitleListview1.SelectedIndices.Count != 1 || e.Handled) - { - return; - } - - if (e.KeyData == italicToolStripMenuItem.ShortcutKeys) - { - ListViewToggleTag(HtmlUtil.TagItalic); - e.SuppressKeyPress = true; - } - else if (e.KeyData == boldToolStripMenuItem.ShortcutKeys) - { - ListViewToggleTag(HtmlUtil.TagBold); - e.SuppressKeyPress = true; - } - else if (e.KeyData == underlineToolStripMenuItem.ShortcutKeys) - { - ListViewToggleTag(HtmlUtil.TagUnderline); - e.SuppressKeyPress = true; - } - - else if (e.KeyData == removeAllFormattingsToolStripMenuItem.ShortcutKeys) - { - removeAllFormattingsToolStripMenuItem_Click(null, null); - e.SuppressKeyPress = true; - } - - else if (e.KeyData == _shortcuts.MainListViewAlignmentN1) - { - SetAlignment("{\\an1}", false); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainListViewAlignmentN2) - { - SetAlignment("", false); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainListViewAlignmentN3) - { - SetAlignment("{\\an3}", false); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainListViewAlignmentN4) - { - SetAlignment("{\\an4}", false); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainListViewAlignmentN5) - { - SetAlignment("{\\an5}", false); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainListViewAlignmentN6) - { - SetAlignment("{\\an6}", false); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainListViewAlignmentN7) - { - SetAlignment("{\\an7}", false); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainListViewAlignmentN8) - { - SetAlignment("{\\an8}", false); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainListViewAlignmentN9) - { - SetAlignment("{\\an9}", false); - e.SuppressKeyPress = true; - } - } - - private void InitializeWaveformZoomDropdown() - { - toolStripComboBoxWaveform.Items.Clear(); - for (double zoomCounter = AudioVisualizer.ZoomMinimum; zoomCounter <= AudioVisualizer.ZoomMaximum + (0.001); zoomCounter += 0.1) - { - int percent = (int)Math.Round(zoomCounter * 100); - var item = new ComboBoxZoomItem { Text = percent + "%", ZoomFactor = zoomCounter }; - toolStripComboBoxWaveform.Items.Add(item); - if (percent == 100) - { - toolStripComboBoxWaveform.SelectedIndex = toolStripComboBoxWaveform.Items.Count - 1; - } - } - } - - private void audioVisualizer_InsertAtVideoPosition(object sender, EventArgs e) - { - InsertNewTextAtVideoPosition(); - } - - private void audioVisualizer_PasteAtVideoPosition(object sender, EventArgs e) - { - double videoPositionInMilliseconds = mediaPlayer.CurrentPosition * TimeCode.BaseUnit; - if (_subtitle.GetFirstParagraphOrDefaultByTime(videoPositionInMilliseconds) == null) - { - PastFromClipboard(videoPositionInMilliseconds); - } - } - - private void PastFromClipboard(double videoPositionInMilliseconds) - { - if (Clipboard.ContainsText()) - { - var text = Clipboard.GetText(); - var tmp = new Subtitle(); - var format = new SubRip(); - var list = new List(text.SplitToLines()); - format.LoadSubtitle(tmp, list, null); - if (videoPositionInMilliseconds >= 0 && tmp.Paragraphs.Count > 0) - { - if (tmp.Paragraphs[0].StartTime.TotalMilliseconds > videoPositionInMilliseconds) - { - var c = tmp.Paragraphs[0].StartTime.TotalMilliseconds - videoPositionInMilliseconds; - tmp.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(-c)); - } - else - { - var c = videoPositionInMilliseconds - tmp.Paragraphs[0].StartTime.TotalMilliseconds; - tmp.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(c)); - } - } - else - { - var start = videoPositionInMilliseconds; - foreach (var line in list) - { - if (!string.IsNullOrWhiteSpace(line)) - { - var duration = Utilities.GetOptimalDisplayMilliseconds(line); - tmp.Paragraphs.Add(new Paragraph(line.Trim(), start, start + duration)); - start += duration + Configuration.Settings.General.MinimumMillisecondsBetweenLines; - } - } - } - - if (tmp.Paragraphs.Count > 0) - { - MakeHistoryForUndo(_language.BeforeInsertLine); - var selectIndices = new List(); - for (int i = 0; i < tmp.Paragraphs.Count; i++) - { - var p = tmp.Paragraphs[i]; - var idx = _subtitle.InsertParagraphInCorrectTimeOrder(p); - selectIndices.Add(idx); - if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle && SubtitleListview1.IsAlternateTextColumnVisible) - { - var original = Utilities.GetOriginalParagraph(idx + i + 1, p, _subtitleAlternate.Paragraphs); - if (original == null) - { - _subtitleAlternate.InsertParagraphInCorrectTimeOrder(new Paragraph(string.Empty, p.StartTime.TotalMilliseconds, p.EndTime.TotalMilliseconds)); - } - } - } - - _subtitle.Renumber(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - SubtitleListview1.SelectIndexAndEnsureVisible(selectIndices[0], true); - foreach (var selectIndex in selectIndices) - { - SubtitleListview1.Items[selectIndex].Selected = true; - } - - if (_subtitleListViewIndex >= 0) - { - UpdateListViewTextInfo(labelTextLineLengths, labelSingleLine, labelSingleLinePixels, labelTextLineTotal, labelCharactersPerSecond, _subtitle.Paragraphs[_subtitleListViewIndex], textBoxListViewText); - } - else - { - SubtitleListview1.SelectIndexAndEnsureVisible(0); - } - } - } - } - - private void TimerClearStatus_Tick(object sender, EventArgs e) - { - ShowStatus(string.Empty); - } - - private void SetEncoding(Encoding encoding) - { - if (encoding == Encoding.UTF8 && Configuration.Settings.General.DefaultEncoding == TextEncoding.Utf8WithoutBom) - { - comboBoxEncoding.SelectedIndex = TextEncoding.Utf8WithoutBomIndex; - } - - foreach (TextEncoding item in comboBoxEncoding.Items) - { - if (item.Equals(encoding)) - { - comboBoxEncoding.SelectedItem = item; - return; - } - } - - comboBoxEncoding.SelectedIndex = TextEncoding.Utf8WithBomIndex; // UTF-8 with BOM - } - - private void SetEncoding(string encodingName) - { - UiUtil.SetTextEncoding(comboBoxEncoding, encodingName); - } - - private Encoding GetCurrentEncoding() - { - return UiUtil.GetTextEncodingComboBoxCurrentEncoding(comboBoxEncoding.ComboBox).Encoding; - } - - private void AudioWaveform_OnNonParagraphRightClicked(object sender, AudioVisualizer.ParagraphEventArgs e) - { - addParagraphHereToolStripMenuItem.Visible = false; - addParagraphAndPasteToolStripMenuItem.Visible = false; - toolStripMenuItemSetParagraphAsSelection.Visible = false; - deleteParagraphToolStripMenuItem.Visible = false; - toolStripMenuItemFocusTextbox.Visible = true; - splitToolStripMenuItem1.Visible = false; - mergeWithPreviousToolStripMenuItem.Visible = false; - mergeWithNextToolStripMenuItem.Visible = false; - toolStripSeparator11.Visible = false; - extendToPreviousToolStripMenuItem.Visible = false; - extendToNextToolStripMenuItem.Visible = false; - toolStripSeparator6.Visible = false; - toolStripMenuItemWaveformPlaySelection.Visible = false; - toolStripSeparator24.Visible = false; - if (audioVisualizer.GetSceneChangeIndex(e.Seconds) >= 0) - { - removeSceneChangeToolStripMenuItem.Visible = true; - addSceneChangeToolStripMenuItem.Visible = false; - } - else - { - removeSceneChangeToolStripMenuItem.Visible = false; - addSceneChangeToolStripMenuItem.Visible = true; - } - - _audioWaveformRightClickSeconds = e.Seconds; - contextMenuStripWaveform.Show(MousePosition.X, MousePosition.Y); - } - - private void AudioWaveform_OnDoubleClickNonParagraph(object sender, AudioVisualizer.ParagraphEventArgs e) - { - if (mediaPlayer.VideoPlayer != null) - { - _endSeconds = -1; - if (e.Paragraph == null) - { - if (Configuration.Settings.VideoControls.WaveformDoubleClickOnNonParagraphAction == "PlayPause") - { - mediaPlayer.TogglePlayPause(); - } - } - else - { - var index = _subtitle.GetIndex(e.Paragraph); - SubtitleListview1.SelectIndexAndEnsureVisible(index, true); - if (tabControlSubtitle.SelectedIndex == TabControlSourceView) - { - var p = _subtitle.GetParagraphOrDefault(index); - if (p != null) - { - string tc = p.StartTime + " --> " + p.EndTime; - int start = textBoxSource.Text.IndexOf(p.Number + Environment.NewLine + tc, StringComparison.Ordinal); - if (start < 0) - { - start = 0; - } - - start = textBoxSource.Text.IndexOf(tc, start, StringComparison.Ordinal); - if (start > 0) - { - textBoxSource.SelectionStart = start + tc.Length + Environment.NewLine.Length; - textBoxSource.SelectionLength = 0; - textBoxSource.ScrollToCaret(); - } - } - } - } - } - } - - private void AudioWaveform_OnZoomedChanged(object sender, EventArgs e) - { - SelectZoomTextInComboBox(); - } - - private void AudioWaveform_OnTimeChangedAndOffsetRest(object sender, AudioVisualizer.ParagraphEventArgs e) - { - if (mediaPlayer.VideoPlayer == null) - { - return; - } - - int index = _subtitle.Paragraphs.IndexOf(e.Paragraph); - if (index < 0) - { - if (_subtitleAlternate != null && SubtitleListview1.IsAlternateTextColumnVisible && Configuration.Settings.General.ShowOriginalAsPreviewIfAvailable) - { - index = _subtitleAlternate.GetIndex(e.Paragraph); - if (index >= 0) - { - var current = Utilities.GetOriginalParagraph(index, e.Paragraph, _subtitle.Paragraphs); - if (current != null) - { - index = _subtitle.Paragraphs.IndexOf(current); - } - } - } - else if (_subtitleAlternate != null && SubtitleListview1.IsAlternateTextColumnVisible) - { - index = _subtitle.GetIndex(e.Paragraph); - } - } - - if (index >= 0) - { - SubtitleListview1.SelectIndexAndEnsureVisible(index, true); - mediaPlayer.CurrentPosition = e.Seconds; - SetStartAndOffsetTheRest(e.Seconds); - } - - audioVisualizer.Invalidate(); - if (tabControlSubtitle.SelectedIndex == TabControlSourceView) - { - ShowSource(); - } - } - - private void AudioWaveform_OnPause(object sender, EventArgs e) - { - _endSeconds = -1; - if (mediaPlayer.VideoPlayer != null) - { - mediaPlayer.Pause(); - } - } - - private void AudioWaveform_OnSingleClick(object sender, AudioVisualizer.ParagraphEventArgs e) - { - timerWaveform.Stop(); - _endSeconds = -1; - if (mediaPlayer.VideoPlayer != null) - { - mediaPlayer.Pause(); - } - - mediaPlayer.CurrentPosition = e.Seconds; - - int index = -1; - if (SubtitleListview1.SelectedItems.Count > 0) - { - index = SubtitleListview1.SelectedItems[0].Index; - } - - SetWaveformPosition(audioVisualizer.StartPositionSeconds, e.Seconds, index); - - if (Configuration.Settings.VideoControls.WaveformSingleClickSelect && e.Paragraph != null) - { - SubtitleListview1.SelectIndexAndEnsureVisible(_subtitle.GetIndex(e.Paragraph), true); - } - - timerWaveform.Start(); - } - - private void AudioWaveform_OnParagraphRightClicked(object sender, AudioVisualizer.ParagraphEventArgs e) - { - SubtitleListview1.SelectIndexAndEnsureVisible(_subtitle.GetIndex(e.Paragraph), true); - - addParagraphHereToolStripMenuItem.Visible = false; - addParagraphAndPasteToolStripMenuItem.Visible = false; - toolStripMenuItemSetParagraphAsSelection.Visible = false; - deleteParagraphToolStripMenuItem.Visible = true; - toolStripMenuItemFocusTextbox.Visible = true; - splitToolStripMenuItem1.Visible = true; - mergeWithPreviousToolStripMenuItem.Visible = true; - mergeWithNextToolStripMenuItem.Visible = true; - toolStripSeparator11.Visible = true; - extendToPreviousToolStripMenuItem.Visible = true; - extendToNextToolStripMenuItem.Visible = true; - toolStripSeparator6.Visible = true; - toolStripMenuItemWaveformPlaySelection.Visible = true; - toolStripSeparator24.Visible = true; - if (audioVisualizer.GetSceneChangeIndex(e.Seconds) >= 0) - { - removeSceneChangeToolStripMenuItem.Visible = true; - addSceneChangeToolStripMenuItem.Visible = false; - } - else - { - removeSceneChangeToolStripMenuItem.Visible = false; - addSceneChangeToolStripMenuItem.Visible = true; - } - - _audioWaveformRightClickSeconds = e.Seconds; - contextMenuStripWaveform.Show(MousePosition.X, MousePosition.Y); - } - - private void removeSceneChangeToolStripMenuItem_Click(object sender, EventArgs e) - { - if (!_audioWaveformRightClickSeconds.HasValue) - { - return; - } - - var idx = audioVisualizer.GetSceneChangeIndex(_audioWaveformRightClickSeconds.Value); - RemoveSceneChange(idx); - } - - private void RemoveSceneChange(int idx) - { - if (idx >= 0 && idx < audioVisualizer.SceneChanges.Count) - { - var temp = new List(audioVisualizer.SceneChanges); - temp.RemoveAt(idx); - audioVisualizer.SceneChanges = temp; - SceneChangeHelper.SaveSceneChanges(VideoFileName, temp); - } - } - - private void addSceneChangeToolStripMenuItem_Click(object sender, EventArgs e) - { - if (!_audioWaveformRightClickSeconds.HasValue) - { - return; - } - - var list = audioVisualizer.SceneChanges.Where(p => p > 0).ToList(); - list.Add(_audioWaveformRightClickSeconds.Value); - list.Sort(); - audioVisualizer.SceneChanges = list; - SceneChangeHelper.SaveSceneChanges(VideoFileName, list); - } - - private void AudioWaveform_OnNewSelectionRightClicked(object sender, AudioVisualizer.ParagraphEventArgs e) - { - SubtitleListview1.SelectIndexAndEnsureVisible(_subtitle.GetIndex(e.Paragraph), true); - - addParagraphHereToolStripMenuItem.Visible = true; - addParagraphAndPasteToolStripMenuItem.Visible = Clipboard.ContainsText(); - - if (SubtitleListview1.SelectedIndices.Count == 1) - { - var p = _subtitle.GetParagraphOrDefault(FirstSelectedIndex); - toolStripMenuItemSetParagraphAsSelection.Visible = p.StartTime.IsMaxTime; - } - - deleteParagraphToolStripMenuItem.Visible = false; - toolStripMenuItemFocusTextbox.Visible = false; - splitToolStripMenuItem1.Visible = false; - mergeWithPreviousToolStripMenuItem.Visible = false; - mergeWithNextToolStripMenuItem.Visible = false; - extendToPreviousToolStripMenuItem.Visible = false; - extendToNextToolStripMenuItem.Visible = false; - toolStripSeparator6.Visible = false; - - contextMenuStripWaveform.Show(MousePosition.X, MousePosition.Y); - } - - private void AudioWaveform_OnTimeChanged(object sender, AudioVisualizer.ParagraphEventArgs e) - { - var paragraph = e.Paragraph; - var beforeParagraph = e.BeforeParagraph; - if (beforeParagraph == null) - { - beforeParagraph = paragraph; - } - - if (Math.Abs(beforeParagraph.StartTime.TotalMilliseconds - paragraph.StartTime.TotalMilliseconds) < 0.01 && - Math.Abs(beforeParagraph.EndTime.TotalMilliseconds - paragraph.EndTime.TotalMilliseconds) < 0.01) - { - _makeHistoryPaused = true; - } - - int selectedIndex = FirstSelectedIndex; - int index = _subtitle.Paragraphs.IndexOf(paragraph); - - // TODO: Moving selected lines - // current idx must also be selected - //if (e.MouseDownParagraphType == AudioVisualizer.MouseDownParagraphType.Whole && SubtitleListview1.SelectedIndices.Count > 1) - //{ - // foreach (int idx in SubtitleListview1.SelectedIndices) - // { - // var p = _subtitle.Paragraphs[idx]; - // if (p != paragraph) - // { - // var dur = p.Duration.TotalMilliseconds; - // p.StartTime.TotalMilliseconds += e.AdjustMs; - // p.EndTime.TotalMilliseconds += e.AdjustMs; - // SubtitleListview1.SetStartTimeAndDuration(idx, p); - // } - // } - //} - - if (index == _subtitleListViewIndex) - { - // Make history item for rollback (change paragraph back for history + change again) - _subtitle.Paragraphs[index] = new Paragraph(beforeParagraph); - MakeHistoryForUndoOnlyIfNotResent(string.Format(_language.VideoControls.BeforeChangingTimeInWaveformX, "#" + paragraph.Number + " " + paragraph.Text)); - _subtitle.Paragraphs[index] = paragraph; - _makeHistoryPaused = true; - - Paragraph original = null; - if (_subtitleAlternate != null && SubtitleListview1.IsAlternateTextColumnVisible) - { - original = Utilities.GetOriginalParagraph(index, beforeParagraph, _subtitleAlternate.Paragraphs); - } - - if (Configuration.Settings.General.UseTimeFormatHHMMSSFF) - { // so we don't get weird rounds we'll use whole frames when moving start time - double fr = TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate; - if (e.BeforeParagraph != null && e.BeforeParagraph.StartTime.TotalMilliseconds != e.Paragraph.StartTime.TotalMilliseconds && - e.BeforeParagraph.Duration.TotalMilliseconds == e.Paragraph.Duration.TotalMilliseconds) - { - // move paragraph - paragraph.StartTime.TotalMilliseconds = ((int)Math.Round(paragraph.StartTime.TotalMilliseconds / fr)) * fr; - paragraph.EndTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds + e.BeforeParagraph.Duration.TotalMilliseconds; - } - else if (e.BeforeParagraph != null && e.BeforeParagraph.EndTime.TotalMilliseconds == e.Paragraph.EndTime.TotalMilliseconds) - { - paragraph.EndTime.TotalMilliseconds = ((int)Math.Round(paragraph.EndTime.TotalMilliseconds / fr)) * fr; - int end = SubtitleFormat.MillisecondsToFrames(paragraph.EndTime.TotalMilliseconds); - int dur = SubtitleFormat.MillisecondsToFrames(paragraph.Duration.TotalMilliseconds); - paragraph.StartTime.TotalMilliseconds = SubtitleFormat.FramesToMilliseconds(end - dur); - } - } - - timeUpDownStartTime.TimeCode = paragraph.StartTime; - var durationInSeconds = (decimal)paragraph.Duration.TotalSeconds; - if (durationInSeconds >= numericUpDownDuration.Minimum && durationInSeconds <= numericUpDownDuration.Maximum) - { - SetDurationInSeconds((double)durationInSeconds); - if (e.MouseDownParagraphType == AudioVisualizer.MouseDownParagraphType.Start) - { - paragraph.EndTime.TotalMilliseconds = e.BeforeParagraph.EndTime.TotalMilliseconds; - } - } - - MovePrevNext(e, beforeParagraph, index); - - if (original != null) - { - original.StartTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds; - original.EndTime.TotalMilliseconds = paragraph.EndTime.TotalMilliseconds; - } - } - else if (_subtitleAlternate != null && SubtitleListview1.IsAlternateTextColumnVisible && Configuration.Settings.General.ShowOriginalAsPreviewIfAvailable) - { - index = _subtitleAlternate.GetIndex(paragraph); - if (index >= 0) - { - // Make history item for rollback (change paragraph back for history + change again) - _subtitleAlternate.Paragraphs[index] = new Paragraph(beforeParagraph); - MakeHistoryForUndoOnlyIfNotResent(string.Format(_language.VideoControls.BeforeChangingTimeInWaveformX, "#" + paragraph.Number + " " + paragraph.Text)); - _subtitleAlternate.Paragraphs[index] = paragraph; - _makeHistoryPaused = true; - - var current = Utilities.GetOriginalParagraph(index, beforeParagraph, _subtitle.Paragraphs); - if (current != null) - { - current.StartTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds; - current.EndTime.TotalMilliseconds = paragraph.EndTime.TotalMilliseconds; - - index = _subtitle.GetIndex(current); - - SubtitleListview1.SetStartTimeAndDuration(index, paragraph, _subtitle.GetParagraphOrDefault(index + 1), _subtitle.GetParagraphOrDefault(index - 1)); - - if (index == selectedIndex) - { - timeUpDownStartTime.TimeCode = paragraph.StartTime; - var durationInSeconds = (decimal)(paragraph.Duration.TotalSeconds); - if (durationInSeconds >= numericUpDownDuration.Minimum && durationInSeconds <= numericUpDownDuration.Maximum) - { - SetDurationInSeconds((double)durationInSeconds); - } - } - } - } - } - else if (_subtitleAlternate != null && SubtitleListview1.IsAlternateTextColumnVisible) - { - index = _subtitle.GetIndex(paragraph); - if (index >= 0) - { - // Make history item for rollback (change paragraph back for history + change again) - _subtitle.Paragraphs[index] = new Paragraph(beforeParagraph); - MakeHistoryForUndoOnlyIfNotResent(string.Format(_language.VideoControls.BeforeChangingTimeInWaveformX, "#" + paragraph.Number + " " + paragraph.Text)); - _subtitle.Paragraphs[index] = paragraph; - _makeHistoryPaused = true; - - MovePrevNext(e, beforeParagraph, index); - - var original = Utilities.GetOriginalParagraph(index, beforeParagraph, _subtitleAlternate.Paragraphs); - if (original != null) - { - original.StartTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds; - original.EndTime.TotalMilliseconds = paragraph.EndTime.TotalMilliseconds; - } - - SubtitleListview1.SetStartTimeAndDuration(index, paragraph, _subtitle.GetParagraphOrDefault(index + 1), _subtitle.GetParagraphOrDefault(index - 1)); - } - } - else - { - if (index >= 0) - { - // Make history item for rollback (change paragraph back for history + change again) - _subtitle.Paragraphs[index] = new Paragraph(beforeParagraph); - MakeHistoryForUndoOnlyIfNotResent(string.Format(_language.VideoControls.BeforeChangingTimeInWaveformX, "#" + paragraph.Number + " " + paragraph.Text)); - _subtitle.Paragraphs[index] = paragraph; - _makeHistoryPaused = true; - - MovePrevNext(e, beforeParagraph, index); - SubtitleListview1.SyntaxColorLine(_subtitle.Paragraphs, index, paragraph); - - if (_subtitleAlternate != null) - { - var original = Utilities.GetOriginalParagraph(index, beforeParagraph, _subtitleAlternate.Paragraphs); - if (original != null) - { - original.StartTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds; - original.EndTime.TotalMilliseconds = paragraph.EndTime.TotalMilliseconds; - } - } - } - - SubtitleListview1.SetStartTimeAndDuration(index, paragraph, _subtitle.GetParagraphOrDefault(index + 1), _subtitle.GetParagraphOrDefault(index - 1)); - } - - beforeParagraph.StartTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds; - beforeParagraph.EndTime.TotalMilliseconds = paragraph.EndTime.TotalMilliseconds; - _makeHistoryPaused = false; - - if (Configuration.Settings.VideoControls.WaveformSetVideoPositionOnMoveStartEnd && - (e.MouseDownParagraphType == AudioVisualizer.MouseDownParagraphType.Start || - e.MouseDownParagraphType == AudioVisualizer.MouseDownParagraphType.End)) - { - mediaPlayer.CurrentPosition = e.Seconds; - } - - if (tabControlSubtitle.SelectedIndex == TabControlSourceView) - { - ShowSource(); - } - } - - private void MovePrevNext(AudioVisualizer.ParagraphEventArgs e, Paragraph beforeParagraph, int index) - { - int curIdx = FirstSelectedIndex; - if (e.MovePreviousOrNext && curIdx >= 0) - { - if (e.MouseDownParagraphType == AudioVisualizer.MouseDownParagraphType.Start) - { - var prev = _subtitle.GetParagraphOrDefault(index - 1); - if (prev != null) - { - Paragraph originalPrev = null; - if (_subtitleAlternate != null && SubtitleListview1.IsAlternateTextColumnVisible) - { - originalPrev = Utilities.GetOriginalParagraph(index - 1, prev, _subtitleAlternate.Paragraphs); - } - - prev.EndTime.TotalMilliseconds = prev.EndTime.TotalMilliseconds + (e.Paragraph.StartTime.TotalMilliseconds - beforeParagraph.StartTime.TotalMilliseconds); - SubtitleListview1.SetStartTimeAndDuration(index - 1, prev, _subtitle.GetParagraphOrDefault(index), _subtitle.GetParagraphOrDefault(index - 2)); - audioVisualizer.Invalidate(); - - if (originalPrev != null) - { - originalPrev.EndTime.TotalMilliseconds = prev.EndTime.TotalMilliseconds; - } - - if (curIdx == index - 1) - { - var durationInSeconds = (decimal)(prev.Duration.TotalSeconds); - if (durationInSeconds >= numericUpDownDuration.Minimum && durationInSeconds <= numericUpDownDuration.Maximum) - { - SetDurationInSeconds((double)durationInSeconds); - } - } - } - } - else if (e.MouseDownParagraphType == AudioVisualizer.MouseDownParagraphType.End) - { - var next = _subtitle.GetParagraphOrDefault(index + 1); - if (next != null) - { - Paragraph originalNext = null; - if (_subtitleAlternate != null && SubtitleListview1.IsAlternateTextColumnVisible) - { - originalNext = Utilities.GetOriginalParagraph(index + 1, next, _subtitleAlternate.Paragraphs); - } - - next.StartTime.TotalMilliseconds = next.StartTime.TotalMilliseconds + (e.Paragraph.EndTime.TotalMilliseconds - beforeParagraph.EndTime.TotalMilliseconds); - SubtitleListview1.SetStartTimeAndDuration(index + 1, next, _subtitle.GetParagraphOrDefault(index + 2), _subtitle.GetParagraphOrDefault(index)); - audioVisualizer.Invalidate(); - - if (originalNext != null) - { - originalNext.StartTime.TotalMilliseconds = next.StartTime.TotalMilliseconds; - } - - if (curIdx == index + 1) - { - timeUpDownStartTime.TimeCode = next.StartTime; - var durationInSeconds = (decimal)(next.Duration.TotalSeconds); - if (durationInSeconds >= numericUpDownDuration.Minimum && durationInSeconds <= numericUpDownDuration.Maximum) - { - SetDurationInSeconds((double)durationInSeconds); - } - } - } - } - } - } - - private void AudioWaveform_OnPositionSelected(object sender, AudioVisualizer.ParagraphEventArgs e) - { - mediaPlayer.CurrentPosition = e.Seconds; - if (e.Paragraph != null) - { - SubtitleListview1.SelectIndexAndEnsureVisible(_subtitle.GetIndex(e.Paragraph), true); - } - } - - private void VideoPositionChanged(object sender, EventArgs e) - { - var tud = (TimeUpDown)sender; - if (tud.Enabled) - { - mediaPlayer.CurrentPosition = tud.TimeCode.TotalSeconds; - } - } - - private void Main_Load(object sender, EventArgs e) - { - splitContainer1.Panel1MinSize = 525; - splitContainer1.Panel2MinSize = 250; - splitContainerMain.Panel1MinSize = 200; - splitContainerMain.Panel2MinSize = 220; - - if (Configuration.Settings.General.StartRememberPositionAndSize && - !string.IsNullOrEmpty(Configuration.Settings.General.StartPosition)) - { - var parts = Configuration.Settings.General.StartPosition.Split(';'); - if (parts.Length == 2) - { - if (int.TryParse(parts[0], out var x) && int.TryParse(parts[1], out var y)) - { - if (x > -100 || y > -100) - { - Left = x; - Top = y; - } - } - } - - if (Configuration.Settings.General.StartSize == "Maximized") - { - CenterFormOnCurrentScreen(); - WindowState = FormWindowState.Maximized; - return; - } - - parts = Configuration.Settings.General.StartSize.Split(';'); - if (parts.Length == 2) - { - if (int.TryParse(parts[0], out var x) && int.TryParse(parts[1], out var y)) - { - Width = x; - Height = y; - } - } - - var ctrlScreen = Screen.FromControl(this); - - if (ctrlScreen.Bounds.Width < Width) - { - Width = ctrlScreen.Bounds.Width; - } - - if (ctrlScreen.Bounds.Height < Height) - { - Height = ctrlScreen.Bounds.Height; - } - - // Fix main window coordinate (Multi-Monitor issue) - if ((ctrlScreen.Bounds.Right < Left) || (ctrlScreen.Bounds.Bottom < Top) || - (ctrlScreen.Bounds.X > Right) || (ctrlScreen.Bounds.Y > Top)) - { - CenterToScreen(); - } - } - else - { - CenterFormOnCurrentScreen(); - } - } - - private void InitializeLanguage() - { - fileToolStripMenuItem.Text = _language.Menu.File.Title; - newToolStripMenuItem.Text = _language.Menu.File.New; - openToolStripMenuItem.Text = _language.Menu.File.Open; - toolStripMenuItemOpenKeepVideo.Text = _language.Menu.File.OpenKeepVideo; - reopenToolStripMenuItem.Text = _language.Menu.File.Reopen; - saveToolStripMenuItem.Text = _language.Menu.File.Save; - saveAsToolStripMenuItem.Text = _language.Menu.File.SaveAs; - toolStripMenuItemRestoreAutoBackup.Text = _language.Menu.File.RestoreAutoBackup; - toolStripMenuItemTTProperties.Text = _language.Menu.File.TimedTextProperties; - openOriginalToolStripMenuItem.Text = _language.Menu.File.OpenOriginal; - saveOriginalToolStripMenuItem.Text = _language.Menu.File.SaveOriginal; - saveOriginalAstoolStripMenuItem.Text = _language.SaveOriginalSubtitleAs; - removeOriginalToolStripMenuItem.Text = _language.Menu.File.CloseOriginal; - - toolStripMenuItemOpenContainingFolder.Text = _language.Menu.File.OpenContainingFolder; - toolStripMenuItemCompare.Text = _language.Menu.File.Compare; - toolStripMenuItemStatistics.Text = _language.Menu.File.Statistics; - toolStripMenuItemPlugins.Text = _language.Menu.File.Plugins; - toolStripMenuItemImportDvdSubtitles.Text = _language.Menu.File.ImportOcrFromDvd; - toolStripMenuItemSubIdx.Text = _language.Menu.File.ImportOcrVobSubSubtitle; - toolStripButtonGetFrameRate.ToolTipText = _language.GetFrameRateFromVideoFile; - toolStripMenuItemImportBluRaySup.Text = _language.Menu.File.ImportBluRaySupFile; - toolStripMenuItemImportXSub.Text = _language.Menu.File.ImportXSub; - matroskaImportStripMenuItem.Text = _language.Menu.File.ImportSubtitleFromMatroskaFile; - toolStripMenuItemManualAnsi.Text = _language.Menu.File.ImportSubtitleWithManualChosenEncoding; - toolStripMenuItemImportText.Text = _language.Menu.File.ImportText; - toolStripMenuItemImportImages.Text = _language.Menu.File.ImportImages; - toolStripMenuItemImportTimeCodes.Text = _language.Menu.File.ImportTimecodes; - toolStripMenuItemExport.Text = _language.Menu.File.Export; - toolStripMenuItemExportPngXml.Text = _language.Menu.File.ExportBdnXml; - bluraySupToolStripMenuItem.Text = _language.Menu.File.ExportBluRaySup; - adobeEncoreFABImageScriptToolStripMenuItem.Text = _language.Menu.File.ExportAdobeEncoreFabImageScript; - toolStripMenuItemTextTimeCodePair.Text = _language.Menu.File.ExportKoreanAtsFilePair; - vobSubsubidxToolStripMenuItem.Text = _language.Menu.File.ExportVobSub; - toolStripMenuItemCavena890.Text = _language.Menu.File.ExportCavena890; - eBUSTLToolStripMenuItem.Text = _language.Menu.File.ExportEbu; - pACScreenElectronicsToolStripMenuItem.Text = _language.Menu.File.ExportPac; - plainTextToolStripMenuItem.Text = _language.Menu.File.ExportPlainText; - toolStripMenuItemAvidStl.Text = _language.Menu.File.ExportAvidStl; - toolStripMenuItemExportCapMakerPlus.Text = _language.Menu.File.ExportCapMakerPlus; - toolStripMenuItemExportCaptionInc.Text = _language.Menu.File.ExportCaptionsInc; - toolStripMenuItemExportCheetahCap.Text = _language.Menu.File.ExportCheetahCap; - toolStripMenuItemExportUltech130.Text = _language.Menu.File.ExportUltech130; - exportCustomTextFormatToolStripMenuItem.Text = _language.Menu.File.ExportCustomTextFormat; - exitToolStripMenuItem.Text = _language.Menu.File.Exit; - - editToolStripMenuItem.Text = _language.Menu.Edit.Title; - showHistoryforUndoToolStripMenuItem.Text = _language.Menu.Edit.ShowUndoHistory; - toolStripMenuItemUndo.Text = _language.Menu.Edit.Undo; - toolStripMenuItemRedo.Text = _language.Menu.Edit.Redo; - - toolStripMenuItemInsertUnicodeCharacter.Text = _language.Menu.Edit.InsertUnicodeSymbol; - - findToolStripMenuItem.Text = _language.Menu.Edit.Find; - findNextToolStripMenuItem.Text = _language.Menu.Edit.FindNext; - replaceToolStripMenuItem.Text = _language.Menu.Edit.Replace; - multipleReplaceToolStripMenuItem.Text = _language.Menu.Edit.MultipleReplace; - gotoLineNumberToolStripMenuItem.Text = _language.Menu.Edit.GoToSubtitleNumber; - toolStripMenuItemRightToLeftMode.Text = _language.Menu.Edit.RightToLeftMode; - - toolStripMenuItemRemoveUnicodeControlChars.Text = _language.Menu.Edit.RemoveUnicodeControlCharacters; - toolStripMenuItemRtlUnicodeControlChars.Text = _language.Menu.Edit.FixRtlViaUnicodeControlCharacters; - - toolStripMenuItemReverseRightToLeftStartEnd.Text = _language.Menu.Edit.ReverseRightToLeftStartEnd; - toolStripMenuItemModifySelection.Text = _language.Menu.Edit.ModifySelection; - toolStripMenuItemInverseSelection.Text = _language.Menu.Edit.InverseSelection; - editSelectAllToolStripMenuItem.Text = _language.Menu.ContextMenu.SelectAll; - - toolsToolStripMenuItem.Text = _language.Menu.Tools.Title; - adjustDisplayTimeToolStripMenuItem.Text = _language.Menu.Tools.AdjustDisplayDuration; - toolStripMenuItemApplyDurationLimits.Text = _language.Menu.Tools.ApplyDurationLimits; - toolStripMenuItemSubtitlesBridgeGaps.Text = _language.Menu.Tools.SubtitlesBridgeGaps; - fixToolStripMenuItem.Text = _language.Menu.Tools.FixCommonErrors; - startNumberingFromToolStripMenuItem.Text = _language.Menu.Tools.StartNumberingFrom; - removeTextForHearImpairedToolStripMenuItem.Text = _language.Menu.Tools.RemoveTextForHearingImpaired; - ChangeCasingToolStripMenuItem.Text = _language.Menu.Tools.ChangeCasing; - toolStripMenuItemChangeFrameRate2.Text = _language.Menu.Tools.ChangeFrameRate; - changeSpeedInPercentToolStripMenuItem.Text = _language.Menu.Tools.ChangeSpeedInPercent; - toolStripMenuItemAutoMergeShortLines.Text = _language.Menu.Tools.MergeShortLines; - toolStripMenuItemMergeDuplicateText.Text = _language.Menu.Tools.MergeDuplicateText; - toolStripMenuItemMergeLinesWithSameTimeCodes.Text = _language.Menu.Tools.MergeSameTimeCodes; - toolStripMenuItemAutoSplitLongLines.Text = _language.Menu.Tools.SplitLongLines; - setMinimumDisplayTimeBetweenParagraphsToolStripMenuItem.Text = _language.Menu.Tools.MinimumDisplayTimeBetweenParagraphs; - toolStripMenuItemSortBy.Text = _language.Menu.Tools.SortBy; - netflixQualityCheckToolStripMenuItem.Text = _language.Menu.Tools.NetflixQualityCheck; - toolStripButtonNetflixQualityCheck.Text = _language.Menu.Tools.NetflixQualityCheck; - - sortNumberToolStripMenuItem.Text = _language.Menu.Tools.Number; - sortStartTimeToolStripMenuItem.Text = _language.Menu.Tools.StartTime; - sortEndTimeToolStripMenuItem.Text = _language.Menu.Tools.EndTime; - sortDisplayTimeToolStripMenuItem.Text = _language.Menu.Tools.Duration; - - descendingToolStripMenuItem.Text = _language.Menu.Tools.Descending; - AscendingToolStripMenuItem.Text = _language.Menu.Tools.Ascending; - - sortTextAlphabeticallytoolStripMenuItem.Text = _language.Menu.Tools.TextAlphabetically; - sortTextMaxLineLengthToolStripMenuItem.Text = _language.Menu.Tools.TextSingleLineMaximumLength; - sortTextTotalLengthToolStripMenuItem.Text = _language.Menu.Tools.TextTotalLength; - sortTextNumberOfLinesToolStripMenuItem.Text = _language.Menu.Tools.TextNumberOfLines; - textCharssecToolStripMenuItem.Text = _language.Menu.Tools.TextNumberOfCharactersPerSeconds; - textWordsPerMinutewpmToolStripMenuItem.Text = _language.Menu.Tools.WordsPerMinute; - styleToolStripMenuItem.Text = _language.Menu.Tools.Style; - actorToolStripMenuItem.Text = Configuration.Settings.Language.General.Actor; - - toolStripMenuItemShowOriginalInPreview.Text = _language.Menu.Edit.ShowOriginalTextInAudioAndVideoPreview; - toolStripMenuItemMakeEmptyFromCurrent.Text = _language.Menu.Tools.MakeNewEmptyTranslationFromCurrentSubtitle; - toolStripMenuItemBatchConvert.Text = _language.Menu.Tools.BatchConvert; - generateDatetimeInfoFromVideoToolStripMenuItem.Text = _language.Menu.Tools.GenerateTimeAsText; - toolStripMenuItemMeasurementConverter.Text = _language.Menu.Tools.MeasurementConverter; - splitToolStripMenuItem.Text = _language.Menu.Tools.SplitSubtitle; - appendTextVisuallyToolStripMenuItem.Text = _language.Menu.Tools.AppendSubtitle; - joinSubtitlesToolStripMenuItem.Text = _language.Menu.Tools.JoinSubtitles; - - toolStripMenuItemVideo.Text = _language.Menu.Video.Title; - openVideoToolStripMenuItem.Text = _language.Menu.Video.OpenVideo; - toolStripMenuItemOpenVideoFromUrl.Text = _language.Menu.Video.OpenVideoFromUrl; - toolStripMenuItemOpenDvd.Text = _language.Menu.Video.OpenDvd; - toolStripMenuItemSetAudioTrack.Text = _language.Menu.Video.ChooseAudioTrack; - closeVideoToolStripMenuItem.Text = _language.Menu.Video.CloseVideo; - openSecondSubtitleToolStripMenuItem.Text = _language.Menu.Video.OpenSecondSubtitle; - generateTextFromCurrentVideoToolStripMenuItem.Text = _language.Menu.Video.GenerateTextFromVideo; - - smpteTimeModedropFrameToolStripMenuItem.Text = _language.Menu.Video.SmptTimeMode; - toolStripMenuItemImportChapters.Text = _language.Menu.Video.ImportChaptersFromVideo; - toolStripMenuItemImportSceneChanges.Text = _language.Menu.Video.GenerateImportSceneChanges; - toolStripMenuItemRemoveSceneChanges.Text = _language.Menu.Video.RemoveSceneChanges; - - toolStripMenuItemAddWaveformBatch.Text = _language.Menu.Video.WaveformBatchGenerate; - - if (Configuration.Settings.VideoControls.GenerateSpectrogram) - { - showhideWaveformToolStripMenuItem.Text = _language.Menu.Video.ShowHideWaveformAndSpectrogram; - } - else - { - showhideWaveformToolStripMenuItem.Text = _language.Menu.Video.ShowHideWaveform; - } - - showhideVideoToolStripMenuItem.Text = _language.Menu.Video.ShowHideVideo; - undockVideoControlsToolStripMenuItem.Text = _language.Menu.Video.UnDockVideoControls; - redockVideoControlsToolStripMenuItem.Text = _language.Menu.Video.ReDockVideoControls; - - toolStripMenuItemSpellCheckMain.Text = _language.Menu.SpellCheck.Title; - spellCheckToolStripMenuItem.Text = _language.Menu.SpellCheck.SpellCheck; - toolStripMenuItemSpellCheckFromCurrentLine.Text = _language.Menu.SpellCheck.SpellCheckFromCurrentLine; - findDoubleWordsToolStripMenuItem.Text = _language.Menu.SpellCheck.FindDoubleWords; - FindDoubleLinesToolStripMenuItem.Text = _language.Menu.SpellCheck.FindDoubleLines; - GetDictionariesToolStripMenuItem.Text = _language.Menu.SpellCheck.GetDictionaries; - addWordToNameListToolStripMenuItem.Text = _language.Menu.SpellCheck.AddToNameList; - - toolStripMenuItemSynchronization.Text = _language.Menu.Synchronization.Title; - toolStripMenuItemAdjustAllTimes.Text = _language.Menu.Synchronization.AdjustAllTimes; - visualSyncToolStripMenuItem.Text = _language.Menu.Synchronization.VisualSync; - toolStripMenuItemPointSync.Text = _language.Menu.Synchronization.PointSync; - pointSyncViaOtherSubtitleToolStripMenuItem.Text = _language.Menu.Synchronization.PointSyncViaOtherSubtitle; - - toolStripMenuItemAutoTranslate.Text = _language.Menu.AutoTranslate.Title; - translateByGoogleToolStripMenuItem.Text = _language.Menu.AutoTranslate.TranslatePoweredByGoogle; - translatepoweredByMicrosoftToolStripMenuItem.Text = _language.Menu.AutoTranslate.TranslatePoweredByMicrosoft; - translateFromSwedishToDanishToolStripMenuItem.Text = _language.Menu.AutoTranslate.TranslateFromSwedishToDanish; - - optionsToolStripMenuItem.Text = _language.Menu.Options.Title; - settingsToolStripMenuItem.Text = _language.Menu.Options.Settings; - changeLanguageToolStripMenuItem.Text = _language.Menu.Options.ChooseLanguage + " [" + Configuration.Settings.Language.Name + "]"; - - toolStripMenuItemNetworking.Text = _language.Menu.Networking.Title; - startServerToolStripMenuItem.Text = _language.Menu.Networking.StartNewSession; - joinSessionToolStripMenuItem.Text = _language.Menu.Networking.JoinSession; - showSessionKeyLogToolStripMenuItem.Text = _language.Menu.Networking.ShowSessionInfoAndLog; - chatToolStripMenuItem.Text = _language.Menu.Networking.Chat; - leaveSessionToolStripMenuItem.Text = _language.Menu.Networking.LeaveSession; - - checkForUpdatesToolStripMenuItem.Text = _language.Menu.Help.CheckForUpdates; - helpToolStripMenuItem.Text = _language.Menu.Help.Title; - helpToolStripMenuItem1.Text = _language.Menu.Help.Help; - aboutToolStripMenuItem.Text = _language.Menu.Help.About; - - toolStripButtonFileNew.ToolTipText = _language.Menu.ToolBar.New; - toolStripButtonFileOpen.ToolTipText = _language.Menu.ToolBar.Open; - toolStripButtonSave.ToolTipText = _language.Menu.ToolBar.Save; - toolStripButtonSaveAs.ToolTipText = _language.Menu.ToolBar.SaveAs; - toolStripButtonFind.ToolTipText = _language.Menu.ToolBar.Find; - toolStripButtonReplace.ToolTipText = _language.Menu.ToolBar.Replace; - toolStripButtonFixCommonErrors.ToolTipText = _language.Menu.ToolBar.FixCommonErrors; - toolStripButtonRemoveTextForHi.ToolTipText = _language.Menu.ToolBar.RemoveTextForHi; - toolStripButtonVisualSync.ToolTipText = _language.Menu.ToolBar.VisualSync; - toolStripButtonSpellCheck.ToolTipText = _language.Menu.ToolBar.SpellCheck; - toolStripButtonNetflixQualityCheck.ToolTipText = _language.Menu.ToolBar.NetflixQualityCheck; - toolStripButtonSettings.ToolTipText = _language.Menu.ToolBar.Settings; - toolStripButtonHelp.ToolTipText = _language.Menu.ToolBar.Help; - toolStripButtonToggleWaveform.ToolTipText = _language.Menu.ToolBar.ShowHideWaveform; - toolStripButtonToggleVideo.ToolTipText = _language.Menu.ToolBar.ShowHideVideo; - - toolStripMenuItemAssStyles.Text = _language.Menu.ContextMenu.SubStationAlphaStyles; - setStylesForSelectedLinesToolStripMenuItem.Text = _language.Menu.ContextMenu.SubStationAlphaSetStyle; - setActorForSelectedLinesToolStripMenuItem.Text = _language.Menu.ContextMenu.SetActor; - - toolStripMenuItemDelete.Text = _language.Menu.ContextMenu.Delete; - insertLineToolStripMenuItem.Text = _language.Menu.ContextMenu.InsertFirstLine; - toolStripMenuItemInsertBefore.Text = _language.Menu.ContextMenu.InsertBefore; - toolStripMenuItemInsertAfter.Text = _language.Menu.ContextMenu.InsertAfter; - toolStripMenuItemInsertSubtitle.Text = _language.Menu.ContextMenu.InsertSubtitleAfter; - - toolStripMenuItemCopySourceText.Text = _language.Menu.ContextMenu.CopyToClipboard; - - toolStripMenuItemColumn.Text = _language.Menu.ContextMenu.Column; - columnDeleteTextOnlyToolStripMenuItem.Text = _language.Menu.ContextMenu.ColumnDeleteText; - toolStripMenuItemColumnDeleteText.Text = _language.Menu.ContextMenu.ColumnDeleteTextAndShiftCellsUp; - ShiftTextCellsDownToolStripMenuItem.Text = _language.Menu.ContextMenu.ColumnInsertEmptyTextAndShiftCellsDown; - toolStripMenuItemInsertTextFromSub.Text = _language.Menu.ContextMenu.ColumnInsertTextFromSubtitle; - toolStripMenuItemColumnImportText.Text = _language.Menu.ContextMenu.ColumnImportTextAndShiftCellsDown; - toolStripMenuItemPasteSpecial.Text = _language.Menu.ContextMenu.ColumnPasteFromClipboard; - moveTextUpToolStripMenuItem.Text = _language.Menu.ContextMenu.ColumnTextUp; - moveTextDownToolStripMenuItem.Text = _language.Menu.ContextMenu.ColumnTextDown; - copyOriginalTextToCurrentToolStripMenuItem.Text = _language.Menu.ContextMenu.ColumnCopyOriginalTextToCurrent; - toolStripMenuItemBookmark.Text = Configuration.Settings.Language.Settings.ToggleBookmarksWithComment; - - splitLineToolStripMenuItem.Text = _language.Menu.ContextMenu.Split; - toolStripMenuItemMergeLines.Text = _language.Menu.ContextMenu.MergeSelectedLines; - toolStripMenuItemMergeDialog.Text = _language.Menu.ContextMenu.MergeSelectedLinesAsDialog; - mergeBeforeToolStripMenuItem.Text = _language.Menu.ContextMenu.MergeWithLineBefore; - mergeAfterToolStripMenuItem.Text = _language.Menu.ContextMenu.MergeWithLineAfter; - extendBeforeToolStripMenuItem.Text = _language.Menu.ContextMenu.ExtendToLineBefore; - extendAfterToolStripMenuItem.Text = _language.Menu.ContextMenu.ExtendToLineAfter; - removeFormattinglToolStripMenuItem.Text = _language.Menu.ContextMenu.RemoveFormatting; - removeAllFormattingsToolStripMenuItem.Text = _language.Menu.ContextMenu.RemoveFormattingAll; - removeBoldToolStripMenuItem.Text = _language.Menu.ContextMenu.RemoveFormattingBold; - removeItalicToolStripMenuItem.Text = _language.Menu.ContextMenu.RemoveFormattingItalic; - removeUnderlineToolStripMenuItem.Text = _language.Menu.ContextMenu.RemoveFormattingUnderline; - removeColorToolStripMenuItem.Text = _language.Menu.ContextMenu.RemoveFormattingColor; - removeFontNameToolStripMenuItem.Text = _language.Menu.ContextMenu.RemoveFormattingFontName; - removeAlignmentToolStripMenuItem.Text = _language.Menu.ContextMenu.RemoveFormattingAlignment; - boldToolStripMenuItem.Text = _languageGeneral.Bold; - underlineToolStripMenuItem.Text = _language.Menu.ContextMenu.Underline; - italicToolStripMenuItem.Text = _languageGeneral.Italic; - colorToolStripMenuItem.Text = _language.Menu.ContextMenu.Color; - toolStripMenuItemFont.Text = _language.Menu.ContextMenu.FontName; - toolStripMenuItemAlignment.Text = _language.Menu.ContextMenu.Alignment; - toolStripMenuItemAutoBreakLines.Text = _language.Menu.ContextMenu.AutoBalanceSelectedLines; - toolStripMenuItemUnbreakLines.Text = _language.Menu.ContextMenu.RemoveLineBreaksFromSelectedLines; - typeEffectToolStripMenuItem.Text = _language.Menu.ContextMenu.TypewriterEffect; - karokeeEffectToolStripMenuItem.Text = _language.Menu.ContextMenu.KaraokeEffect; - showSelectedLinesEarlierlaterToolStripMenuItem.Text = _language.Menu.ContextMenu.ShowSelectedLinesEarlierLater; - visualSyncSelectedLinesToolStripMenuItem.Text = _language.Menu.ContextMenu.VisualSyncSelectedLines; - toolStripMenuItemGoogleMicrosoftTranslateSelLine.Text = _language.Menu.ContextMenu.GoogleAndMicrosoftTranslateSelectedLine; - googleTranslateToolStripMenuItem.Text = _language.Menu.AutoTranslate.TranslatePoweredByGoogle; - microsoftBingTranslateToolStripMenuItem.Text = _language.Menu.AutoTranslate.TranslatePoweredByMicrosoft; - toolStripMenuItemTranslateSelected.Text = _language.Menu.ContextMenu.TranslateSelectedLines; - adjustDisplayTimeForSelectedLinesToolStripMenuItem.Text = _language.Menu.ContextMenu.AdjustDisplayDurationForSelectedLines; - fixCommonErrorsInSelectedLinesToolStripMenuItem.Text = _language.Menu.ContextMenu.FixCommonErrorsInSelectedLines; - changeCasingForSelectedLinesToolStripMenuItem.Text = _language.Menu.ContextMenu.ChangeCasingForSelectedLines; - toolStripMenuItemSaveSelectedLines.Text = _language.Menu.ContextMenu.SaveSelectedLines; - - // textbox context menu - cutToolStripMenuItem.Text = _language.Menu.ContextMenu.Cut; - copyToolStripMenuItem.Text = _language.Menu.ContextMenu.Copy; - pasteToolStripMenuItem.Text = _language.Menu.ContextMenu.Paste; - deleteToolStripMenuItem.Text = _language.Menu.ContextMenu.Delete; - toolStripMenuItemSplitTextAtCursor.Text = _language.Menu.ContextMenu.SplitLineAtCursorPosition; - toolStripMenuItemSplitViaWaveform.Text = _language.Menu.ContextMenu.SplitLineAtCursorAndWaveformPosition; - selectAllToolStripMenuItem.Text = _language.Menu.ContextMenu.SelectAll; - normalToolStripMenuItem1.Text = _language.Menu.ContextMenu.RemoveFormattingAll; - boldToolStripMenuItem1.Text = _languageGeneral.Bold; - italicToolStripMenuItem1.Text = _languageGeneral.Italic; - boxToolStripMenuItem.Text = _language.Menu.ContextMenu.Box; - underlineToolStripMenuItem1.Text = _language.Menu.ContextMenu.Underline; - colorToolStripMenuItem1.Text = _language.Menu.ContextMenu.Color; - fontNameToolStripMenuItem.Text = _language.Menu.ContextMenu.FontName; - toolStripMenuItemInsertUnicodeSymbol.Text = _language.Menu.Edit.InsertUnicodeSymbol; - toolStripMenuItemInsertUnicodeControlCharacters.Text = _language.Menu.Edit.InsertUnicodeControlCharacters; - superscriptToolStripMenuItem.Text = _language.Menu.ContextMenu.Superscript; - subscriptToolStripMenuItem.Text = _language.Menu.ContextMenu.Subscript; - leftToolStripMenuItem.Text = _language.Menu.Edit.InsertUnicodeControlCharactersLRM; - righttoleftMarkToolStripMenuItem.Text = _language.Menu.Edit.InsertUnicodeControlCharactersRLM; - startOfLefttorightEmbeddingLREToolStripMenuItem.Text = _language.Menu.Edit.InsertUnicodeControlCharactersLRE; - startOfRighttoleftEmbeddingRLEToolStripMenuItem.Text = _language.Menu.Edit.InsertUnicodeControlCharactersRLE; - startOfLefttorightOverrideLROToolStripMenuItem.Text = _language.Menu.Edit.InsertUnicodeControlCharactersLRO; - startOfRighttoleftOverrideRLOToolStripMenuItem.Text = _language.Menu.Edit.InsertUnicodeControlCharactersRLO; - - // main controls - SubtitleListview1.InitializeLanguage(_languageGeneral, Configuration.Settings); - toolStripLabelSubtitleFormat.Text = _language.Controls.SubtitleFormat; - toolStripLabelEncoding.Text = _language.Controls.FileEncoding; - toolStripLabelFrameRate.Text = _languageGeneral.FrameRate; - tabControlSubtitle.TabPages[TabControlSourceView].Text = _language.Controls.SourceView; - tabControlSubtitle.TabPages[TabControlListView].Text = _language.Controls.ListView; - labelStartTime.Text = _languageGeneral.StartTime; - labelDuration.Text = _languageGeneral.Duration; - labelText.Text = _languageGeneral.Text; - UpdateListViewTextInfo(labelTextLineLengths, labelSingleLine, labelSingleLinePixels, labelTextLineTotal, labelCharactersPerSecond, _subtitle?.GetParagraphOrDefault(_subtitleListViewIndex), textBoxListViewText); - labelAlternateText.Text = _languageGeneral.OriginalText; - UpdateListViewTextInfo(labelTextAlternateLineLengths, labelAlternateSingleLine, labelAlternateSingleLinePixels, labelTextAlternateLineTotal, labelAlternateCharactersPerSecond, _subtitleAlternate?.GetParagraphOrDefault(_subtitleListViewIndex), textBoxListViewTextAlternate); - buttonPrevious.Text = _language.Controls.Previous; - buttonNext.Text = _language.Controls.Next; - buttonAutoBreak.Text = _language.Controls.AutoBreak; - buttonUnBreak.Text = _language.Controls.Unbreak; - buttonSplitLine.Text = _languageGeneral.SplitLine; - ShowSourceLineNumber(); - - // video controls - tabPageTranslate.Text = _language.VideoControls.Translate + " "; - tabPageCreate.Text = _language.VideoControls.Create + " "; - tabPageAdjust.Text = _language.VideoControls.Adjust + " "; - checkBoxSyncListViewWithVideoWhilePlaying.Text = _language.VideoControls.SelectCurrentElementWhilePlaying; - if (VideoFileName == null) - { - labelVideoInfo.Text = _languageGeneral.NoVideoLoaded; - } - - toolStripButtonLockCenter.Text = _language.VideoControls.Center; - toolStripSplitButtonPlayRate.Text = _language.VideoControls.PlayRate; - groupBoxAutoRepeat.Text = _language.VideoControls.AutoRepeat; - checkBoxAutoRepeatOn.Text = _language.VideoControls.AutoRepeatOn; - labelAutoRepeatCount.Text = _language.VideoControls.AutoRepeatCount; - groupBoxAutoContinue.Text = _language.VideoControls.AutoContinue; - checkBoxAutoContinue.Text = _language.VideoControls.AutoContinueOn; - labelAutoContinueDelay.Text = _language.VideoControls.DelayInSeconds; - buttonPlayPrevious.Text = _language.VideoControls.Previous; - buttonPlayCurrent.Text = _language.VideoControls.PlayCurrent; - buttonPlayNext.Text = _language.VideoControls.Next; - buttonStop.Text = _language.VideoControls.Pause; - groupBoxTranslateSearch.Text = _language.VideoControls.SearchTextOnline; - buttonGoogleIt.Text = _language.VideoControls.GoogleIt; - buttonGoogleTranslateIt.Text = _language.VideoControls.GoogleTranslate; - labelTranslateTip.Text = _language.VideoControls.TranslateTip; - - buttonInsertNewText.Text = _language.VideoControls.InsertNewSubtitleAtVideoPosition; - buttonBeforeText.Text = _language.VideoControls.PlayFromJustBeforeText; - buttonGotoSub.Text = _language.VideoControls.GoToSubtitlePositionAndPause; - buttonSetStartTime.Text = _language.VideoControls.SetStartTime; - buttonSetEnd.Text = _language.VideoControls.SetEndTime; - buttonSecBack1.Text = _language.VideoControls.SecondsBackShort; - buttonSecBack2.Text = _language.VideoControls.SecondsBackShort; - buttonForward1.Text = _language.VideoControls.SecondsForwardShort; - buttonForward2.Text = _language.VideoControls.SecondsForwardShort; - labelVideoPosition.Text = _language.VideoControls.VideoPosition; - labelVideoPosition2.Text = _language.VideoControls.VideoPosition; - - buttonSetStartAndOffsetRest.Text = _language.VideoControls.SetstartTimeAndOffsetOfRest; - buttonSetEndAndGoToNext.Text = _language.VideoControls.SetEndTimeAndGoToNext; - buttonAdjustSetStartTime.Text = _language.VideoControls.SetStartTime; - buttonAdjustSetEndTime.Text = _language.VideoControls.SetEndTime; - buttonAdjustPlayBefore.Text = _language.VideoControls.PlayFromJustBeforeText; - buttonAdjustGoToPosAndPause.Text = _language.VideoControls.GoToSubtitlePositionAndPause; - buttonAdjustSecBack1.Text = _language.VideoControls.SecondsBackShort; - buttonAdjustSecBack2.Text = _language.VideoControls.SecondsBackShort; - buttonAdjustSecForward1.Text = _language.VideoControls.SecondsForwardShort; - buttonAdjustSecForward2.Text = _language.VideoControls.SecondsForwardShort; - - // waveform - var languageWaveform = Configuration.Settings.Language.Waveform; - addParagraphHereToolStripMenuItem.Text = languageWaveform.AddParagraphHere; - addParagraphAndPasteToolStripMenuItem.Text = languageWaveform.AddParagraphHereAndPasteText; - toolStripMenuItemSetParagraphAsSelection.Text = languageWaveform.SetParagraphAsSelection; - deleteParagraphToolStripMenuItem.Text = languageWaveform.DeleteParagraph; - toolStripMenuItemFocusTextbox.Text = languageWaveform.FocusTextBox; - goToPreviousSubtitleStripMenuItem.Text = languageWaveform.GoToPrevious; - goToNextSubtitleStripMenuItem.Text = languageWaveform.GoToNext; - - splitToolStripMenuItem1.Text = languageWaveform.Split; - mergeWithPreviousToolStripMenuItem.Text = languageWaveform.MergeWithPrevious; - mergeWithNextToolStripMenuItem.Text = languageWaveform.MergeWithNext; - extendToPreviousToolStripMenuItem.Text = languageWaveform.ExtendToPrevious; - extendToNextToolStripMenuItem.Text = languageWaveform.ExtendToNext; - toolStripMenuItemWaveformPlaySelection.Text = languageWaveform.PlaySelection; - showWaveformAndSpectrogramToolStripMenuItem.Text = languageWaveform.ShowWaveformAndSpectrogram; - showOnlyWaveformToolStripMenuItem.Text = languageWaveform.ShowWaveformOnly; - showOnlySpectrogramToolStripMenuItem.Text = languageWaveform.ShowSpectrogramOnly; - seekSilenceToolStripMenuItem.Text = languageWaveform.SeekSilence; - insertSubtitleHereToolStripMenuItem.Text = languageWaveform.InsertSubtitleHere; - guessTimeCodesToolStripMenuItem.Text = languageWaveform.GuessTimeCodes; - removeSceneChangeToolStripMenuItem.Text = languageWaveform.RemoveSceneChange; - addSceneChangeToolStripMenuItem.Text = languageWaveform.AddSceneChange; - - toolStripButtonWaveformZoomOut.ToolTipText = languageWaveform.ZoomOut; - toolStripButtonWaveformZoomIn.ToolTipText = languageWaveform.ZoomIn; - - if (Configuration.Settings.VideoControls.GenerateSpectrogram) - { - audioVisualizer.WaveformNotLoadedText = languageWaveform.ClickToAddWaveformAndSpectrogram; - } - else - { - audioVisualizer.WaveformNotLoadedText = languageWaveform.ClickToAddWaveform; - } - - // clear cached language names - DvdSubtitleLanguage.Initialize(); - } - - private void SetFormatTo(string formatName) - { - SetFormatTo(SubtitleFormat.FromName(formatName, new SubRip())); - } - - private void SetFormatTo(SubtitleFormat subtitleFormat) - { - comboBoxSubtitleFormats.SelectedIndexChanged -= ComboBoxSubtitleFormatsSelectedIndexChanged; - UiUtil.InitializeSubtitleFormatComboBox(comboBoxSubtitleFormats, subtitleFormat.FriendlyName); - comboBoxSubtitleFormats.SelectedIndexChanged += ComboBoxSubtitleFormatsSelectedIndexChanged; - } - - private int FirstSelectedIndex - { - get - { - if (SubtitleListview1.SelectedItems.Count == 0) - { - return -1; - } - - return SubtitleListview1.SelectedItems[0].Index; - } - } - - private int FirstVisibleIndex - { - get - { - if (SubtitleListview1.Items.Count == 0 || SubtitleListview1.TopItem == null) - { - return -1; - } - - return SubtitleListview1.TopItem.Index; - } - } - - private long _lastAutoSave; - - private void AutoSave(bool force = false) - { - if (!Configuration.Settings.General.AutoSave || - DateTime.UtcNow.Ticks - _lastAutoSave < 10000 * 3000 && !force) // only check for auto save evety 3 seconds - { - return; - } - - _lastAutoSave = DateTime.UtcNow.Ticks + 1009000; - var currentSubtitleHash = _subtitle.GetFastHashCode(GetCurrentEncoding().BodyName); - if (_changeSubtitleHash != currentSubtitleHash && _lastDoNotPrompt != currentSubtitleHash && _subtitle?.Paragraphs.Count > 0) - { - if (string.IsNullOrEmpty(_fileName) || _converted) - { - return; - } - - SaveSubtitle(GetCurrentSubtitleFormat(), false, true); - } - - if (!string.IsNullOrEmpty(_subtitleAlternateFileName) && Configuration.Settings.General.AllowEditOfOriginalSubtitle) - { - SaveOriginalSubtitle(GetCurrentSubtitleFormat(), true); - } - - _lastAutoSave = DateTime.UtcNow.Ticks; - } - - private bool ContinueNewOrExit() - { - AutoSave(true); - var currentSubtitleHash = _subtitle.GetFastHashCode(GetCurrentEncoding().BodyName); - if (_changeSubtitleHash != currentSubtitleHash && _lastDoNotPrompt != currentSubtitleHash && _subtitle?.Paragraphs.Count > 0) - { - string promptText = _language.SaveChangesToUntitled; - if (!string.IsNullOrEmpty(_fileName)) - { - promptText = string.Format(_language.SaveChangesToX, _fileName); - } - - var dr = MessageBox.Show(this, promptText, Title, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation); - - if (dr == DialogResult.Cancel) - { - return false; - } - - if (dr == DialogResult.Yes) - { - if (string.IsNullOrEmpty(_fileName)) - { - if (!string.IsNullOrEmpty(openFileDialog1.InitialDirectory)) - { - saveFileDialog1.InitialDirectory = openFileDialog1.InitialDirectory; - } - - saveFileDialog1.Title = _language.SaveSubtitleAs; - if (saveFileDialog1.ShowDialog(this) == DialogResult.OK) - { - openFileDialog1.InitialDirectory = saveFileDialog1.InitialDirectory; - _fileName = saveFileDialog1.FileName; - SetTitle(); - Configuration.Settings.RecentFiles.Add(_fileName, FirstVisibleIndex, FirstSelectedIndex, VideoFileName, _subtitleAlternateFileName, Configuration.Settings.General.CurrentVideoOffsetInMs); - Configuration.Settings.Save(); - } - else - { - return false; - } - } - - if (SaveSubtitle(GetCurrentSubtitleFormat()) != DialogResult.OK) - { - return false; - } - } - } - - return ContinueNewOrExitAlternate(); - } - - private bool ContinueNewOrExitAlternate() - { - if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0 && _changeAlternateSubtitleHash != _subtitleAlternate.GetFastHashCode(GetCurrentEncoding().BodyName)) - { - string promptText = _language.SaveChangesToUntitledOriginal; - if (!string.IsNullOrEmpty(_subtitleAlternateFileName)) - { - promptText = string.Format(_language.SaveChangesToOriginalX, _subtitleAlternateFileName); - } - - var dr = MessageBox.Show(this, promptText, Title, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation); - - if (dr == DialogResult.Cancel) - { - return false; - } - - if (dr == DialogResult.Yes) - { - if (string.IsNullOrEmpty(_subtitleAlternateFileName)) - { - if (!string.IsNullOrEmpty(openFileDialog1.InitialDirectory)) - { - saveFileDialog1.InitialDirectory = openFileDialog1.InitialDirectory; - } - - saveFileDialog1.Title = _language.SaveOriginalSubtitleAs; - if (saveFileDialog1.ShowDialog(this) == DialogResult.OK) - { - openFileDialog1.InitialDirectory = saveFileDialog1.InitialDirectory; - _subtitleAlternateFileName = saveFileDialog1.FileName; - } - else - { - return false; - } - } - - if (SaveOriginalSubtitle(GetCurrentSubtitleFormat()) != DialogResult.OK) - { - return false; - } - } - } - - _lastDoNotPrompt = _subtitle.GetFastHashCode(GetCurrentEncoding().BodyName); - return true; - } - - private void ExitToolStripMenuItemClick(object sender, EventArgs e) - { - ReloadFromSourceView(); - Application.Exit(); - } - - private void AboutToolStripMenuItemClick(object sender, EventArgs e) - { - ReloadFromSourceView(); - using (var about = new About()) - { - about.Initialize(); - about.ShowDialog(this); - } - } - - private void VisualSyncToolStripMenuItemClick(object sender, EventArgs e) - { - ReloadFromSourceView(); - ShowVisualSync(false); - } - - public void MakeHistoryForUndo(string description, bool resetTextUndo) - { - if (_makeHistoryPaused) - { - return; - } - - if (resetTextUndo) - { - _listViewTextUndoLast = null; - _listViewAlternateTextUndoLast = null; - } - - if (_undoIndex == -1) - { - _subtitle.HistoryItems.Clear(); - } - else - { - // remove items for redo - while (_subtitle.HistoryItems.Count > _undoIndex + 1) - { - _subtitle.HistoryItems.RemoveAt(_subtitle.HistoryItems.Count - 1); - } - } - - _subtitle.FileName = _fileName; - _subtitle.MakeHistoryForUndo(description, GetCurrentSubtitleFormat(), _fileDateTime, _subtitleAlternate, _subtitleAlternateFileName, _subtitleListViewIndex, textBoxListViewText.SelectionStart, textBoxListViewTextAlternate.SelectionStart); - _undoIndex++; - - if (_undoIndex > Subtitle.MaximumHistoryItems) - { - _undoIndex--; - } - } - - public void MakeHistoryForUndo(string description) - { - MakeHistoryForUndo(description, true); - } - - /// - /// Add undo history - but only if last entry is older than 500 ms - /// - /// Undo description - public void MakeHistoryForUndoOnlyIfNotResent(string description) - { - if (_makeHistoryPaused) - { - return; - } - - if ((DateTime.UtcNow.Ticks - _lastHistoryTicks) > 10000 * 500) // only if last change was longer ago than 500 milliseconds - { - MakeHistoryForUndo(description); - _lastHistoryTicks = DateTime.UtcNow.Ticks; - } - } - - private bool IsSubtitleLoaded - { - get { return _subtitle != null && (_subtitle.Paragraphs.Count > 1 || (_subtitle.Paragraphs.Count == 1 && !string.IsNullOrWhiteSpace(_subtitle.Paragraphs[0].Text))); } - } - - private void ShowVisualSync(bool onlySelectedLines) - { - if (!IsSubtitleLoaded) - { - DisplaySubtitleNotLoadedMessage(); - return; - } - - using (var visualSync = new VisualSync()) - { - visualSync.VideoFileName = VideoFileName; - visualSync.AudioTrackNumber = VideoAudioTrackNumber; - - SaveSubtitleListviewIndices(); - if (onlySelectedLines) - { - var selectedLines = new Subtitle(); - Subtitle selectedLinesAlternate = null; - if (_subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) - { - selectedLinesAlternate = new Subtitle(); - } - - foreach (int index in SubtitleListview1.SelectedIndices) - { - var p = _subtitle.Paragraphs[index]; - selectedLines.Paragraphs.Add(p); - if (selectedLinesAlternate != null) - { - var original = Utilities.GetOriginalParagraph(index, p, _subtitleAlternate.Paragraphs); - if (original != null) - { - selectedLinesAlternate.Paragraphs.Add(original); - } - } - } - - visualSync.Initialize(toolStripButtonVisualSync.Image as Bitmap, selectedLines, selectedLinesAlternate, _fileName, _language.VisualSyncSelectedLines, CurrentFrameRate); - } - else - { - visualSync.Initialize(toolStripButtonVisualSync.Image as Bitmap, _subtitle, _subtitleAlternate, _fileName, _language.VisualSyncTitle, CurrentFrameRate); - } - - _endSeconds = -1; - mediaPlayer.Pause(); - if (visualSync.ShowDialog(this) == DialogResult.OK) - { - MakeHistoryForUndo(_language.BeforeVisualSync); - - if (onlySelectedLines) - { // we only update selected lines - int i = 0; - foreach (int index in SubtitleListview1.SelectedIndices) - { - _subtitle.Paragraphs[index] = visualSync.Paragraphs[i]; - i++; - } - - ShowStatus(_language.VisualSyncPerformedOnSelectedLines); - } - else - { - _subtitle.Paragraphs.Clear(); - foreach (var p in visualSync.Paragraphs) - { - _subtitle.Paragraphs.Add(new Paragraph(p)); - } - - if (_subtitleAlternate != null && visualSync.ParagraphsAlternate != null) - { - _subtitleAlternate.Paragraphs.Clear(); - foreach (var p in visualSync.ParagraphsAlternate) - { - _subtitleAlternate.Paragraphs.Add(new Paragraph(p)); - } - } - - ShowStatus(_language.VisualSyncPerformed); - } - - if (visualSync.FrameRateChanged) - { - toolStripComboBoxFrameRate.Text = string.Format("{0:0.###}", visualSync.FrameRate); - } - - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - if (onlySelectedLines && SubtitleListview1.SelectedItems.Count > 0) - { - SubtitleListview1.EnsureVisible(SubtitleListview1.SelectedItems[SubtitleListview1.SelectedItems.Count - 1].Index); - } - } - - VideoFileName = visualSync.VideoFileName; - } - } - - private void OpenToolStripMenuItemClick(object sender, EventArgs e) - { - openToolStripMenuItem.Enabled = false; - ReloadFromSourceView(); - OpenNewFile(); - openToolStripMenuItem.Enabled = true; - } - - private void OpenNewFile() - { - if (_openFileDialogOn) - { - return; - } - - _openFileDialogOn = true; - _lastDoNotPrompt = -1; - if (!ContinueNewOrExit()) - { - _openFileDialogOn = false; - return; - } - - openFileDialog1.Title = _languageGeneral.OpenSubtitle; - openFileDialog1.FileName = string.Empty; - openFileDialog1.Filter = UiUtil.SubtitleExtensionFilter.Value; - if (openFileDialog1.ShowDialog(this) == DialogResult.OK) - { - RemoveAlternate(true, false); - - // try to open via recent files - if (OpenFromRecentFiles(openFileDialog1.FileName)) - { - return; - } - - OpenSubtitle(openFileDialog1.FileName, null); - } - - _openFileDialogOn = false; - } - - private bool OpenFromRecentFiles(string fileName) - { - var rfe = Configuration.Settings.RecentFiles.Files.FirstOrDefault(p => !string.IsNullOrEmpty(p.FileName) && p.FileName.Equals(fileName, StringComparison.OrdinalIgnoreCase)); - if (rfe != null) - { - OpenRecentFile(rfe); - GotoSubPosAndPause(); - SubtitleListview1.EndUpdate(); - SetRecentIndices(rfe); - if (!string.IsNullOrEmpty(rfe.VideoFileName)) - { - var p = _subtitle.GetParagraphOrDefault(rfe.FirstSelectedIndex); - if (p != null) - { - mediaPlayer.CurrentPosition = p.StartTime.TotalSeconds; - } - } - - _openFileDialogOn = false; - return true; - } - - return false; - } - - public double CurrentFrameRate - { - get - { - if (double.TryParse(toolStripComboBoxFrameRate.Text, out var f)) - { - return f; - } - - return Configuration.Settings.General.DefaultFrameRate; - } - } - - private void OpenSubtitle(string fileName, Encoding encoding) - { - OpenSubtitle(fileName, encoding, null, null); - } - - private void ResetHistory() - { - _undoIndex = -1; - _subtitle.HistoryItems.Clear(); - } - - private void OpenSubtitle(string fileName, Encoding encoding, string videoFileName, string originalFileName) - { - OpenSubtitle(fileName, encoding, videoFileName, originalFileName, false); - } - - private void OpenSubtitle(string fileName, Encoding encoding, string videoFileName, string originalFileName, bool updateRecentFile) - { - if (!File.Exists(fileName)) - { - MessageBox.Show(string.Format(_language.FileNotFound, fileName)); - return; - } - - _lastAutoSave = DateTime.UtcNow.Ticks; - bool videoFileLoaded = false; - var file = new FileInfo(fileName); - var ext = file.Extension.ToLowerInvariant(); - - // save last first visible index + first selected index from listview - if (_fileName != null && updateRecentFile) - { - Configuration.Settings.RecentFiles.Add(_fileName, FirstVisibleIndex, FirstSelectedIndex, VideoFileName, _subtitleAlternateFileName, Configuration.Settings.General.CurrentVideoOffsetInMs); - } - Configuration.Settings.General.CurrentVideoOffsetInMs = 0; - - openFileDialog1.InitialDirectory = file.DirectoryName; - - - if (ext == ".idx") - { - var subFileName = fileName.Substring(0, fileName.Length - 3) + "sub"; - if (File.Exists(subFileName) && FileUtil.IsVobSub(subFileName)) - { - ext = ".sub"; - fileName = subFileName; - } - } - - if (ext == ".sub" && IsVobSubFile(fileName, false)) - { - ImportAndOcrVobSubSubtitleNew(fileName, _loading); - return; - } - - if (ext == ".sup") - { - if (FileUtil.IsBluRaySup(fileName)) - { - ImportAndOcrBluRaySup(fileName, _loading); - return; - } - - if (FileUtil.IsSpDvdSup(fileName)) - { - ImportAndOcrSpDvdSup(fileName, _loading); - return; - } - } - - if (ext == ".mkv" || ext == ".mks") - { - ImportSubtitleFromMatroskaFile(fileName); - return; - } - - if (ext == ".divx" || ext == ".avi") - { - if (ImportSubtitleFromDivX(fileName)) - { - return; - } - } - - if ((ext == ".ts" || ext == ".rec" || ext == ".mpeg" || ext == ".mpg") && file.Length > 10000 && FileUtil.IsTransportStream(fileName)) - { - ImportSubtitleFromTransportStream(fileName); - return; - } - - if (((ext == ".m2ts" || ext == ".ts" || ext == ".mts") && file.Length > 10000 && FileUtil.IsM2TransportStream(fileName)) || - (ext == ".textst" && FileUtil.IsMpeg2PrivateStream2(fileName))) - { - bool isTextSt = false; - if (file.Length < 2000000) - { - var textSt = new TextST(); - isTextSt = textSt.IsMine(null, fileName); - } - - if (!isTextSt) - { - ImportSubtitleFromTransportStream(fileName); - return; - } - } - - if ((ext == ".mp4" || ext == ".m4v" || ext == ".3gp") && file.Length > 10000) - { - if (!new IsmtDfxp().IsMine(null, fileName)) - { - if (ImportSubtitleFromMp4(fileName) && !Configuration.Settings.General.DisableVideoAutoLoading) - { - OpenVideo(fileName); - } - - return; - } - } - - if (ext == ".mxf" && FileUtil.IsMaterialExchangeFormat(fileName)) - { - var parser = new MxfParser(fileName); - if (parser.IsValid) - { - var subtitles = parser.GetSubtitles(); - if (subtitles.Count > 0) - { - SetEncoding(Configuration.Settings.General.DefaultEncoding); - var list = new List(subtitles[0].SplitToLines()); - _subtitle = new Subtitle(); - var mxfFormat = _subtitle.ReloadLoadSubtitle(list, null, null); - SetCurrentFormat(mxfFormat); - _fileName = Utilities.GetPathAndFileNameWithoutExtension(fileName) + GetCurrentSubtitleFormat().Extension; - SetTitle(); - ShowStatus(string.Format(_language.LoadedSubtitleX, _fileName)); - _sourceViewChange = false; - _changeSubtitleHash = _subtitle.GetFastHashCode(GetCurrentEncoding().BodyName); - ResetHistory(); - SetUndockedWindowsTitle(); - _converted = true; - ShowStatus(string.Format(_language.LoadedSubtitleX, _fileName) + " - " + string.Format(_language.ConvertedToX, mxfFormat.FriendlyName)); - - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - _subtitleListViewIndex = -1; - SubtitleListview1.FirstVisibleIndex = -1; - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - - return; - } - - MessageBox.Show("No subtitles found!"); - return; - } - } - - if (ext == ".prproj") - { - var f = new AdobePremierePrProj(); - var tempFileName = AdobePremierePrProj.LoadFromZipFile(fileName); - if (!string.IsNullOrEmpty(fileName)) - { - var list = new List(File.ReadAllLines(tempFileName, LanguageAutoDetect.GetEncodingFromFile(tempFileName))); - try - { - File.Delete(tempFileName); - } - catch - { - // ignored - } - if (f.IsMine(list, tempFileName)) - { - f.LoadSubtitle(_subtitle, list, fileName); - SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); - SetEncoding(Configuration.Settings.General.DefaultEncoding); - encoding = GetCurrentEncoding(); - SubtitleListview1.Fill(_subtitle); - _subtitleListViewIndex = -1; - SubtitleListview1.FirstVisibleIndex = -1; - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - _fileName = Utilities.GetPathAndFileNameWithoutExtension(fileName) + GetCurrentSubtitleFormat().Extension; - SetTitle(); - ShowStatus(string.Format(_language.LoadedSubtitleX, _fileName)); - _converted = true; - return; - } - } - } - - if (file.Length > Subtitle.MaxFileSize) - { - // retry Blu-ray sup (file with wrong extension) - if (FileUtil.IsBluRaySup(fileName)) - { - ImportAndOcrBluRaySup(fileName, _loading); - return; - } - - // retry vobsub (file with wrong extension) - if (IsVobSubFile(fileName, false)) - { - ImportAndOcrVobSubSubtitleNew(fileName, _loading); - return; - } - - var text = string.Format(_language.FileXIsLargerThan10MB + Environment.NewLine + Environment.NewLine + _language.ContinueAnyway, fileName); - if (MessageBox.Show(this, text, Title, MessageBoxButtons.YesNoCancel) != DialogResult.Yes) - { - return; - } - } - - var tempSubtitle = new Subtitle(_subtitle, false); - if (_subtitle.HistoryItems.Count > 0 || _subtitle.Paragraphs.Count > 0) - { - MakeHistoryForUndo(string.Format(_language.BeforeLoadOf, Path.GetFileName(fileName))); - } - - var subtitleHash = _subtitle.GetFastHashCode(GetCurrentEncoding().BodyName); - bool hasChanged = (_changeSubtitleHash != subtitleHash) && (_lastDoNotPrompt != subtitleHash); - - SubtitleFormat format = _subtitle.LoadSubtitle(fileName, out encoding, encoding); - if (format == null) - { - _subtitle = tempSubtitle; - } - - if (!hasChanged) - { - _changeSubtitleHash = _subtitle.GetFastHashCode(GetCurrentEncoding().BodyName); - } - - ShowHideTextBasedFeatures(format); - - bool justConverted = false; - - if (ext == ".m2ts" || ext == ".textst") - { - var textST = new TextST(); - if (textST.IsMine(null, fileName)) - { - textST.LoadSubtitle(_subtitle, null, fileName); - _oldSubtitleFormat = textST; - SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); - SetEncoding(Configuration.Settings.General.DefaultEncoding); - encoding = GetCurrentEncoding(); - justConverted = true; - format = GetCurrentSubtitleFormat(); - } - } - - var encodingFromFile = encoding; - if (format == null) - { - encodingFromFile = LanguageAutoDetect.GetEncodingFromFile(fileName); - } - - if (format == null) - { - var f = new TimeCodesOnly1(); - var list = new List(File.ReadAllLines(fileName, encodingFromFile)); - if (f.IsMine(list, fileName)) - { - f.LoadSubtitle(_subtitle, list, fileName); - _oldSubtitleFormat = f; - SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); - SetEncoding(Configuration.Settings.General.DefaultEncoding); - encoding = GetCurrentEncoding(); - justConverted = true; - format = GetCurrentSubtitleFormat(); - } - } - - if (format == null) - { - var f = new TimeCodesOnly2(); - var list = new List(File.ReadAllLines(fileName, encodingFromFile)); - if (f.IsMine(list, fileName)) - { - f.LoadSubtitle(_subtitle, list, fileName); - _oldSubtitleFormat = f; - SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); - SetEncoding(Configuration.Settings.General.DefaultEncoding); - encoding = GetCurrentEncoding(); - justConverted = true; - format = GetCurrentSubtitleFormat(); - } - } - - if (format == null) - { - try - { - var bdnXml = new BdnXml(); - var list = new List(File.ReadAllLines(fileName, encodingFromFile)); - if (bdnXml.IsMine(list, fileName)) - { - if (ContinueNewOrExit()) - { - ImportAndOcrBdnXml(fileName, bdnXml, list); - } - - return; - } - } - catch - { - // ignore - } - } - - if (format == null) - { - try - { - var fcpImage = new FinalCutProImage(); - var list = new List(File.ReadAllLines(fileName, encodingFromFile)); - if (fcpImage.IsMine(list, fileName)) - { - if (ContinueNewOrExit()) - { - ImportAndOcrDost(fileName, fcpImage, list); - } - - return; - } - } - catch - { - // ignore - } - } - - if (format == null) - { - try - { - var f = new DvdStudioProSpaceGraphic(); - var list = new List(File.ReadAllLines(fileName, encodingFromFile)); - if (f.IsMine(list, fileName)) - { - if (ContinueNewOrExit()) - { - ImportAndOcrDost(fileName, f, list); - } - - return; - } - } - catch - { - // ignore - } - } - - if (format == null) - { - try - { - var imageFormat = new SpuImage(); - var list = new List(File.ReadAllLines(fileName, encodingFromFile)); - if (imageFormat.IsMine(list, fileName)) - { - if (ContinueNewOrExit()) - { - ImportAndOcrDost(fileName, imageFormat, list); - } - - return; - } - } - catch - { - format = null; - } - } - - if (format == null) - { - var arib = new AribB36(); - if (arib.IsMine(null, fileName)) - { - arib.LoadSubtitle(_subtitle, null, fileName); - _oldSubtitleFormat = arib; - SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); - SetEncoding(Configuration.Settings.General.DefaultEncoding); - encoding = GetCurrentEncoding(); - justConverted = true; - format = GetCurrentSubtitleFormat(); - } - } - - if (ext == ".dost") - { - try - { - var dost = new Dost(); - var list = new List(File.ReadAllLines(fileName, encodingFromFile)); - if (dost.IsMine(list, fileName)) - { - if (ContinueNewOrExit()) - { - ImportAndOcrDost(fileName, dost, list); - } - - return; - } - } - catch - { - format = null; - } - } - - if (format == null) - { - try - { - var timedtextImage = new TimedTextImage(); - var list = new List(File.ReadAllLines(fileName, encodingFromFile)); - if (timedtextImage.IsMine(list, fileName)) - { - if (ContinueNewOrExit()) - { - ImportAndOcrDost(fileName, timedtextImage, list); - } - - return; - } - } - catch - { - format = null; - } - } - - if (format == null) - { - try - { - var seImageHtmlIndex = new SeImageHtmlIndex(); - var list = new List(File.ReadAllLines(fileName, encodingFromFile)); - if (seImageHtmlIndex.IsMine(list, fileName)) - { - if (ContinueNewOrExit()) - { - ImportAndOcrDost(fileName, seImageHtmlIndex, list); - } - - return; - } - } - catch - { - format = null; - } - } - - if (format == null || format.Name == Scenarist.NameOfFormat) - { - try - { - var son = new Son(); - var list = new List(File.ReadAllLines(fileName, encodingFromFile)); - if (son.IsMine(list, fileName)) - { - if (ContinueNewOrExit()) - { - ImportAndOcrSon(fileName, son, list); - } - - return; - } - } - catch - { - format = null; - } - } - - if (format == null || format.Name == SubRip.NameOfFormat) - { - if (_subtitle.Paragraphs.Count > 1) - { - int imageCount = 0; - foreach (var p in _subtitle.Paragraphs) - { - string s = p.Text.ToLowerInvariant(); - if (s.EndsWith(".bmp", StringComparison.Ordinal) || s.EndsWith(".png", StringComparison.Ordinal) || s.EndsWith(".jpg", StringComparison.Ordinal) || s.EndsWith(".tif", StringComparison.Ordinal)) - { - imageCount++; - } - } - - if (imageCount > 2 && imageCount >= _subtitle.Paragraphs.Count - 2) - { - if (ContinueNewOrExit()) - { - ImportAndOcrSrt(_subtitle); - } - - return; - } - } - } - - if (format == null) - { - try - { - var satBoxPng = new SatBoxPng(); - var list = new List(File.ReadAllLines(fileName, encodingFromFile)); - if (satBoxPng.IsMine(list, fileName)) - { - var subtitle = new Subtitle(); - satBoxPng.LoadSubtitle(subtitle, list, fileName); - if (ContinueNewOrExit()) - { - ImportAndOcrSrt(subtitle); - } - - return; - } - } - catch - { - format = null; - } - } - - if (format == null || format.Name == Scenarist.NameOfFormat) - { - try - { - var sst = new SonicScenaristBitmaps(); - var list = new List(File.ReadAllLines(fileName, encodingFromFile)); - if (sst.IsMine(list, fileName)) - { - if (ContinueNewOrExit()) - { - ImportAndOcrSst(fileName, sst, list); - } - - return; - } - } - catch - { - format = null; - } - } - - if (format == null) - { - try - { - var htmlSamiArray = new HtmlSamiArray(); - var list = new List(File.ReadAllLines(fileName, encodingFromFile)); - if (htmlSamiArray.IsMine(list, fileName)) - { - htmlSamiArray.LoadSubtitle(_subtitle, list, fileName); - _oldSubtitleFormat = htmlSamiArray; - SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); - SetEncoding(Configuration.Settings.General.DefaultEncoding); - encoding = GetCurrentEncoding(); - justConverted = true; - format = GetCurrentSubtitleFormat(); - } - } - catch - { - format = null; - } - } - - if (format == null) - { - foreach (var f in SubtitleFormat.GetBinaryFormats(false)) - { - if (f.IsMine(null, fileName)) - { - f.LoadSubtitle(_subtitle, null, fileName); - _oldSubtitleFormat = f; - SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); - SetEncoding(Configuration.Settings.General.DefaultEncoding); - encoding = GetCurrentEncoding(); - justConverted = true; - format = GetCurrentSubtitleFormat(); - break; - } - } - } - - if (format == null) - { - var lines = FileUtil.ReadAllTextShared(fileName, encodingFromFile).SplitToLines(); - foreach (var f in SubtitleFormat.GetTextOtherFormats()) - { - if (f.IsMine(lines, fileName)) - { - f.LoadSubtitle(_subtitle, lines, fileName); - _oldSubtitleFormat = f; - SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); - SetEncoding(Configuration.Settings.General.DefaultEncoding); - encoding = GetCurrentEncoding(); - justConverted = true; - format = GetCurrentSubtitleFormat(); - break; - } - } - } - - if (format == null && ext == ".cdg" && file.Length < 50_000_000) - { - using (var importCdg = new ImportCdg(fileName)) - { - importCdg.ShowDialog(this); - return; - } - } - - // retry vobsub (file with wrong extension) - if (format == null && file.Length > 500 && IsVobSubFile(fileName, false)) - { - ImportAndOcrVobSubSubtitleNew(fileName, _loading); - return; - } - - // retry Blu-ray (file with wrong extension) - if (format == null && file.Length > 500 && FileUtil.IsBluRaySup(fileName)) - { - ImportAndOcrBluRaySup(fileName, _loading); - return; - } - - // retry SP DVD (file with wrong extension) - if (format == null && file.Length > 500 && FileUtil.IsSpDvdSup(fileName)) - { - ImportAndOcrSpDvdSup(fileName, _loading); - return; - } - - // retry Matroska (file with wrong extension) - if (format == null && !string.IsNullOrWhiteSpace(fileName)) - { - using (var matroska = new MatroskaFile(fileName)) - { - if (matroska.IsValid) - { - var subtitleList = matroska.GetTracks(true); - if (subtitleList.Count > 0) - { - ImportSubtitleFromMatroskaFile(fileName); - return; - } - } - } - } - - // check for idx file - if (format == null && file.Length > 100 && ext == ".idx") - { - MessageBox.Show(_language.ErrorLoadIdx); - return; - } - - // check for .rar file - if (format == null && file.Length > 100 && FileUtil.IsRar(fileName)) - { - MessageBox.Show(_language.ErrorLoadRar); - return; - } - - // check for .zip file - if (format == null && file.Length > 100 && FileUtil.IsZip(fileName)) - { - MessageBox.Show(_language.ErrorLoadZip); - return; - } - - // check for .7z file - if (format == null && file.Length > 100 && FileUtil.Is7Zip(fileName)) - { - MessageBox.Show(_language.ErrorLoad7Zip); - return; - } - - // check for .png file - if (format == null && file.Length > 100 && FileUtil.IsPng(fileName)) - { - MessageBox.Show(_language.ErrorLoadPng); - return; - } - - // check for .jpg file - if (format == null && file.Length > 100 && FileUtil.IsJpg(fileName)) - { - MessageBox.Show(_language.ErrorLoadJpg); - return; - } - - // check for .srr file - if (format == null && file.Length > 100 && ext == ".srr" && FileUtil.IsSrr(fileName)) - { - MessageBox.Show(_language.ErrorLoadSrr); - return; - } - - // check for Torrent file - if (format == null && file.Length > 50 && FileUtil.IsTorrentFile(fileName)) - { - MessageBox.Show(_language.ErrorLoadTorrent); - return; - } - - // check for all binary zeroes (I've heard about this a few times... perhaps related to crashes?) - if (format == null && file.Length > 50 && FileUtil.IsSubtitleFileAllBinaryZeroes(fileName)) - { - MessageBox.Show(_language.ErrorLoadBinaryZeroes); - return; - } - - if (format == null && file.Length < 100 * 1000000 && TransportStreamParser.IsDvbSup(fileName)) - { - ImportSubtitleFromDvbSupFile(fileName); - return; - } - - if (format == null && file.Length < 1000000) - { - // check for valid timed text - if (ext == ".xml" || ext == ".dfxp") - { - var sb = new StringBuilder(); - foreach (var line in File.ReadAllLines(fileName, encodingFromFile)) - { - sb.AppendLine(line); - } - - var xmlAsString = sb.ToString().Trim(); - - if (xmlAsString.Contains("http://www.w3.org/ns/ttml") && xmlAsString.Contains(" 1) - { - _subtitle = genericParseSubtitle; - SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); - SetEncoding(Configuration.Settings.General.DefaultEncoding); - encoding = GetCurrentEncoding(); - justConverted = true; - format = GetCurrentSubtitleFormat(); - ShowStatus("Guessed subtitle format via generic subtitle parser!"); - } - } - catch - { - } - } - - if (format == null && file.Length < 1_000_000 && (FileUtil.IsPlainText(fileName) || new Tx3GTextOnly().IsMine(null, fileName))) - { - ImportPlainText(fileName); - return; - } - - if (format == null) - { - var fd = new FinalDraftTemplate2(); - var list = new List(File.ReadAllLines(fileName, encodingFromFile)); - if (fd.IsMine(list, fileName)) - { - ImportPlainText(fileName); - return; - } - } - - _fileDateTime = File.GetLastWriteTime(fileName); - - if (format != null) - { - RemoveAlternate(true, false); - SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.Extra); - - new BookmarkPersistence(_subtitle, fileName).Load(); - - if (Configuration.Settings.General.RemoveBlankLinesWhenOpening) - { - _subtitle.RemoveEmptyLines(); - } - - if (Configuration.Settings.General.RemoveBadCharsWhenOpening) - { - foreach (var p in _subtitle.Paragraphs) - { - // Replace U+0456 (CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I) by U+0069 (LATIN SMALL LETTER I) - p.Text = p.Text.Replace("<і>", "").Replace("", ""); - - // remove control characters (e.g. binary zero) - p.Text = p.Text.RemoveControlCharactersButWhiteSpace(); - } - } - - _subtitleListViewIndex = -1; - Configuration.Settings.General.CurrentVideoOffsetInMs = 0; - - var oldSaveFormat = Configuration.Settings.General.LastSaveAsFormat; - SetCurrentFormat(format); - Configuration.Settings.General.LastSaveAsFormat = oldSaveFormat; - - _subtitleAlternateFileName = null; - if (LoadAlternateSubtitleFile(originalFileName)) - { - _subtitleAlternateFileName = originalFileName; - } - - // Seungki begin - _splitDualSami = false; - if (Configuration.Settings.SubtitleSettings.SamiDisplayTwoClassesAsTwoSubtitles && format.GetType() == typeof(Sami) && Sami.GetStylesFromHeader(_subtitle.Header).Count == 2) - { - var classes = Sami.GetStylesFromHeader(_subtitle.Header); - var s1 = new Subtitle(_subtitle); - var s2 = new Subtitle(_subtitle); - s1.Paragraphs.Clear(); - s2.Paragraphs.Clear(); - foreach (var p in _subtitle.Paragraphs) - { - if (p.Extra != null && p.Extra.Equals(classes[0], StringComparison.OrdinalIgnoreCase)) - { - s1.Paragraphs.Add(p); - } - else - { - s2.Paragraphs.Add(p); - } - } - - if (s1.Paragraphs.Count == 0 || s2.Paragraphs.Count == 0) - { - return; - } - - _subtitle = s1; - _subtitleAlternate = s2; - _subtitleAlternateFileName = _fileName; - SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.Extra); - SubtitleListview1.ShowAlternateTextColumn(classes[1]); - _splitDualSami = true; - } - // Seungki end - - textBoxSource.Text = _subtitle.ToText(format); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - if (SubtitleListview1.Items.Count > 0) - { - SubtitleListview1.Items[0].Selected = true; - SubtitleListview1.Items[0].Focused = true; - } - textBoxListViewText.BackColor = SystemColors.WindowFrame; - textBoxListViewTextAlternate.BackColor = SystemColors.WindowFrame; - - _findHelper = null; - _spellCheckForm = null; - - if (_resetVideo && ModifierKeys != Keys.Shift) - { - VideoFileName = null; - _videoInfo = null; - VideoAudioTrackNumber = -1; - labelVideoInfo.Text = _languageGeneral.NoVideoLoaded; - audioVisualizer.WavePeaks = null; - audioVisualizer.SetSpectrogram(null); - audioVisualizer.SceneChanges = new List(); - audioVisualizer.Chapters = new List(); - } - - if (Configuration.Settings.General.ShowVideoPlayer || Configuration.Settings.General.ShowAudioVisualizer) - { - if (!Configuration.Settings.General.DisableVideoAutoLoading) - { - if (!string.IsNullOrEmpty(videoFileName) && File.Exists(videoFileName)) - { - OpenVideo(videoFileName); - } - else if (!string.IsNullOrEmpty(fileName) && (toolStripButtonToggleVideo.Checked || toolStripButtonToggleWaveform.Checked)) - { - TryToFindAndOpenVideoFile(Utilities.GetPathAndFileNameWithoutExtension(fileName)); - } - - if (VideoFileName == null) - { - CloseVideoToolStripMenuItemClick(this, null); - } - } - } - - videoFileLoaded = VideoFileName != null; - - Configuration.Settings.RecentFiles.Add(fileName, videoFileName, originalFileName); - UpdateRecentFilesUI(); - - _fileName = fileName; - SetTitle(); - ShowStatus(string.Format(_language.LoadedSubtitleX, _fileName)); - _sourceViewChange = false; - - if (Configuration.Settings.General.AutoConvertToUtf8) - { - if (Configuration.Settings.General.DefaultEncoding == TextEncoding.Utf8WithoutBom) - { - SetEncoding(TextEncoding.Utf8WithoutBom); - } - else - { - SetEncoding(TextEncoding.Utf8WithBom); - } - } - else if (encoding == Encoding.UTF8) - { - if (File.Exists(_fileName) && FileUtil.HasUtf8Bom(fileName)) - { - SetEncoding(TextEncoding.Utf8WithBom); - } - else - { - SetEncoding(TextEncoding.Utf8WithoutBom); - } - } - else - { - SetEncoding(encoding); - } - - _changeSubtitleHash = _subtitle.GetFastHashCode(GetCurrentEncoding().BodyName); - _converted = false; - ResetHistory(); - SetListViewStateImages(); - SetUndockedWindowsTitle(); - - if (justConverted) - { - _converted = true; - ShowStatus(string.Format(_language.LoadedSubtitleX, _fileName) + " - " + string.Format(_language.ConvertedToX, format.FriendlyName)); - } - - var formatType = format.GetType(); - if (formatType == typeof(SubStationAlpha)) - { - string errors = AdvancedSubStationAlpha.CheckForErrors(_subtitle.Header); - if (!string.IsNullOrEmpty(errors)) - { - MessageBox.Show(this, errors, Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - - errors = (format as SubStationAlpha).Errors; - if (!string.IsNullOrEmpty(errors)) - { - MessageBox.Show(this, errors, Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - } - else if (formatType == typeof(AdvancedSubStationAlpha)) - { - string errors = AdvancedSubStationAlpha.CheckForErrors(_subtitle.Header); - if (!string.IsNullOrEmpty(errors)) - { - MessageBox.Show(this, errors, Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - - errors = (format as AdvancedSubStationAlpha).Errors; - if (!string.IsNullOrEmpty(errors)) - { - MessageBox.Show(this, errors, Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - } - else if (formatType == typeof(SubRip)) - { - string errors = (format as SubRip).Errors; - if (!string.IsNullOrEmpty(errors)) - { - MessageBox.Show(this, errors, Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - } - else if (formatType == typeof(MicroDvd)) - { - string errors = (format as MicroDvd).Errors; - if (!string.IsNullOrEmpty(errors)) - { - MessageBox.Show(this, errors, Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - } - else if (formatType == typeof(DCinemaSmpte2007)) - { - format.ToText(_subtitle, string.Empty); - string errors = (format as DCinemaSmpte2007).Errors; - if (!string.IsNullOrEmpty(errors)) - { - MessageBox.Show(errors, Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - } - else if (formatType == typeof(DCinemaSmpte2010)) - { - format.ToText(_subtitle, string.Empty); - string errors = (format as DCinemaSmpte2010).Errors; - if (!string.IsNullOrEmpty(errors)) - { - MessageBox.Show(errors, Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - } - else if (formatType == typeof(DCinemaSmpte2014)) - { - format.ToText(_subtitle, string.Empty); - string errors = (format as DCinemaSmpte2014).Errors; - if (!string.IsNullOrEmpty(errors)) - { - MessageBox.Show(errors, Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - } - else if (formatType == typeof(CsvNuendo)) - { - if (_subtitle.Paragraphs.Any(p => !string.IsNullOrEmpty(p.Actor))) - { - bool wasVisible = SubtitleListview1.ColumnIndexActor >= 0; - SubtitleListview1.ShowActorColumn(Configuration.Settings.Language.General.Character); - if (!wasVisible) - { - SaveSubtitleListviewIndices(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - } - } - } - } - else - { - if (file.Length < 50) - { - _findHelper = null; - _spellCheckForm = null; - VideoFileName = null; - _videoInfo = null; - VideoAudioTrackNumber = -1; - labelVideoInfo.Text = _languageGeneral.NoVideoLoaded; - audioVisualizer.WavePeaks = null; - audioVisualizer.SetSpectrogram(null); - audioVisualizer.SceneChanges = new List(); - audioVisualizer.Chapters = new List(); - - Configuration.Settings.RecentFiles.Add(fileName, FirstVisibleIndex, FirstSelectedIndex, VideoFileName, _subtitleAlternateFileName, Configuration.Settings.General.CurrentVideoOffsetInMs); - Configuration.Settings.Save(); - UpdateRecentFilesUI(); - _fileName = fileName; - SetTitle(); - ShowStatus(string.Format(_language.LoadedEmptyOrShort, _fileName)); - _sourceViewChange = false; - _converted = false; - - MessageBox.Show(_language.FileIsEmptyOrShort); - } - else - { - if (ShowUnknownSubtitle(fileName, true)) - { - ImportPlainText(fileName); - } - - return; - } - } - - if (!videoFileLoaded && mediaPlayer.VideoPlayer != null) - { - mediaPlayer.PauseAndDisposePlayer(); - timer1.Stop(); - } - - ResetShowEarlierOrLater(); - FixRightToLeftDependingOnLanguage(); - } - - private void ShowHideTextBasedFeatures(SubtitleFormat format) - { - textBoxSource.Enabled = format?.IsTextBased == true; - } - - private void SetUndockedWindowsTitle() - { - string title = _languageGeneral.NoVideoLoaded; - if (!string.IsNullOrEmpty(VideoFileName)) - { - title = Path.GetFileNameWithoutExtension(VideoFileName); - } - - if (_videoControlsUndocked != null && !_videoControlsUndocked.IsDisposed) - { - _videoControlsUndocked.Text = string.Format(_languageGeneral.ControlsWindowTitle, title); - } - - if (_videoPlayerUndocked != null && !_videoPlayerUndocked.IsDisposed) - { - _videoPlayerUndocked.Text = string.Format(_languageGeneral.VideoWindowTitle, title); - } - - if (_waveformUndocked != null && !_waveformUndocked.IsDisposed) - { - _waveformUndocked.Text = string.Format(_languageGeneral.AudioWindowTitle, title); - } - } - - private void ImportAndOcrBdnXml(string fileName, BdnXml bdnXml, List list) - { - using (var formSubOcr = new VobSubOcr()) - { - var bdnSubtitle = new Subtitle(); - bdnXml.LoadSubtitle(bdnSubtitle, list, fileName); - bdnSubtitle.FileName = fileName; - formSubOcr.Initialize(bdnSubtitle, Configuration.Settings.VobSubOcr, false); - if (formSubOcr.ShowDialog(this) == DialogResult.OK) - { - MakeHistoryForUndo(_language.BeforeImportingBdnXml); - FileNew(); - _subtitle.Paragraphs.Clear(); - SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); - foreach (var p in formSubOcr.SubtitleFromOcr.Paragraphs) - { - _subtitle.Paragraphs.Add(p); - } - - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - _subtitleListViewIndex = -1; - SubtitleListview1.FirstVisibleIndex = -1; - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - - _fileName = Path.ChangeExtension(formSubOcr.FileName, GetCurrentSubtitleFormat().Extension); - SetTitle(); - _converted = true; - } - } - } - - private void ImportAndOcrSon(string fileName, Son format, List list) - { - using (var formSubOcr = new VobSubOcr()) - { - var sub = new Subtitle(); - format.LoadSubtitle(sub, list, fileName); - sub.FileName = fileName; - formSubOcr.Initialize(sub, Configuration.Settings.VobSubOcr, true); - if (formSubOcr.ShowDialog(this) == DialogResult.OK) - { - MakeHistoryForUndo(_language.BeforeImportingBdnXml); - FileNew(); - _subtitle.Paragraphs.Clear(); - SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); - foreach (var p in formSubOcr.SubtitleFromOcr.Paragraphs) - { - _subtitle.Paragraphs.Add(p); - } - - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - _subtitleListViewIndex = -1; - SubtitleListview1.FirstVisibleIndex = -1; - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - - _fileName = Path.ChangeExtension(formSubOcr.FileName, GetCurrentSubtitleFormat().Extension); - SetTitle(); - _converted = true; - } - } - } - - private void ImportAndOcrDost(string fileName, SubtitleFormat format, List list) - { - using (var formSubOcr = new VobSubOcr()) - { - var sub = new Subtitle(); - format.LoadSubtitle(sub, list, fileName); - sub.FileName = fileName; - formSubOcr.Initialize(sub, Configuration.Settings.VobSubOcr, false); - if (formSubOcr.ShowDialog(this) == DialogResult.OK) - { - MakeHistoryForUndo(_language.BeforeImportingBdnXml); - FileNew(); - _subtitle.Paragraphs.Clear(); - SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); - foreach (var p in formSubOcr.SubtitleFromOcr.Paragraphs) - { - _subtitle.Paragraphs.Add(p); - } - - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - _subtitleListViewIndex = -1; - SubtitleListview1.FirstVisibleIndex = -1; - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - - _fileName = Path.ChangeExtension(formSubOcr.FileName, GetCurrentSubtitleFormat().Extension); - SetTitle(); - _converted = true; - } - } - } - - private void ImportAndOcrSst(string fileName, SonicScenaristBitmaps format, List list) - { - using (var formSubOcr = new VobSubOcr()) - { - var sub = new Subtitle(); - format.LoadSubtitle(sub, list, fileName); - sub.FileName = fileName; - formSubOcr.Initialize(sub, Configuration.Settings.VobSubOcr, true); - if (formSubOcr.ShowDialog(this) == DialogResult.OK) - { - MakeHistoryForUndo(_language.BeforeImportingBdnXml); - FileNew(); - _subtitle.Paragraphs.Clear(); - SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); - foreach (var p in formSubOcr.SubtitleFromOcr.Paragraphs) - { - _subtitle.Paragraphs.Add(p); - } - - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - _subtitleListViewIndex = -1; - SubtitleListview1.FirstVisibleIndex = -1; - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - - _fileName = Path.ChangeExtension(formSubOcr.FileName, GetCurrentSubtitleFormat().Extension); - SetTitle(); - _converted = true; - } - } - } - - private void ImportAndOcrSrt(Subtitle subtitle) - { - using (var formSubOcr = new VobSubOcr()) - { - formSubOcr.Initialize(subtitle, Configuration.Settings.VobSubOcr, false); - if (formSubOcr.ShowDialog(this) == DialogResult.OK) - { - MakeHistoryForUndo(_language.BeforeImportingBdnXml); - FileNew(); - _subtitle.Paragraphs.Clear(); - SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); - foreach (var p in formSubOcr.SubtitleFromOcr.Paragraphs) - { - _subtitle.Paragraphs.Add(p); - } - - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - _subtitleListViewIndex = -1; - SubtitleListview1.FirstVisibleIndex = -1; - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - - _fileName = Path.ChangeExtension(formSubOcr.FileName, GetCurrentSubtitleFormat().Extension); - SetTitle(); - _converted = true; - } - } - } - - private bool ShowUnknownSubtitle(string fileName, bool allowImportPlainText = false) - { - using (var unknownSubtitle = new UnknownSubtitle()) - { - unknownSubtitle.Initialize(Title, fileName, allowImportPlainText); - unknownSubtitle.ShowDialog(this); - return unknownSubtitle.ImportPlainText; - } - } - - private void UpdateRecentFilesUI() - { - var dropDownItems = new List(); - reopenToolStripMenuItem.DropDownItems.Clear(); - if (Configuration.Settings.General.ShowRecentFiles && Configuration.Settings.RecentFiles.Files.Count > 0) - { - reopenToolStripMenuItem.Visible = true; - var lowerFileNameList = new List(); - foreach (var file in Configuration.Settings.RecentFiles.Files) - { - if (!string.IsNullOrEmpty(file.OriginalFileName) && File.Exists(file.OriginalFileName)) - { - dropDownItems.Add(new ToolStripMenuItem(file.FileName + " + " + file.OriginalFileName, null, ReopenSubtitleToolStripMenuItemClick) { Tag = file.FileName }); - } - else - { - if (!lowerFileNameList.Contains(file.FileName.ToLowerInvariant())) - { - dropDownItems.Add(new ToolStripMenuItem(file.FileName, null, ReopenSubtitleToolStripMenuItemClick) { Tag = file.FileName }); - lowerFileNameList.Add(file.FileName.ToLowerInvariant()); - } - } - UiUtil.FixFonts(dropDownItems[dropDownItems.Count - 1]); - } - reopenToolStripMenuItem.DropDownItems.AddRange(dropDownItems.ToArray()); - } - else - { - Configuration.Settings.RecentFiles.Files.Clear(); - reopenToolStripMenuItem.Visible = false; - } - - reopenToolStripMenuItem.Visible = reopenToolStripMenuItem.DropDownItems.Count > 0; - } - - private void RemoveNotExistingFilesFromRecentFilesUI() - { - if (!Configuration.Settings.General.ShowRecentFiles || Configuration.Settings.RecentFiles.Files.Count == 0) - { - return; - } - - var bw = new BackgroundWorker(); - bw.DoWork += (sender, args) => - { - var recentFilesList = (List)args.Argument; - var notExistingFiles = new List(); - foreach (var entry in recentFilesList) - { - if (!File.Exists(entry.FileName)) - { - notExistingFiles.Add(entry.FileName); - } - } - - args.Result = notExistingFiles; - }; - bw.RunWorkerCompleted += (sender, args) => - { - var notExistingFiles = (List)args.Result; - if (notExistingFiles.Count == 0) - { - return; - } - - try - { - Configuration.Settings.RecentFiles.Files = Configuration.Settings.RecentFiles.Files - .Where(p => !notExistingFiles.Contains(p.FileName)).ToList(); - for (var index = reopenToolStripMenuItem.DropDownItems.Count - 1; index >= 0; index--) - { - ToolStripItem item = reopenToolStripMenuItem.DropDownItems[index]; - if (notExistingFiles.Contains((string)item.Tag)) - { - reopenToolStripMenuItem.DropDownItems.RemoveAt(index); - } - } - } - catch - { - // ignore - } - }; - bw.RunWorkerAsync(Configuration.Settings.RecentFiles.Files); - } - - private void ReopenSubtitleToolStripMenuItemClick(object sender, EventArgs e) - { - ReloadFromSourceView(); - var item = sender as ToolStripItem; - - if (ContinueNewOrExit()) - { - if (!string.IsNullOrEmpty(_fileName)) - { - Configuration.Settings.RecentFiles.Add(_fileName, FirstVisibleIndex, FirstSelectedIndex, VideoFileName, _subtitleAlternateFileName, Configuration.Settings.General.CurrentVideoOffsetInMs); - } - - RecentFileEntry rfe = null; - foreach (var file in Configuration.Settings.RecentFiles.Files.Where(p => !string.IsNullOrEmpty(p.OriginalFileName))) - { - if ((file.FileName + " + " + file.OriginalFileName).Equals(item.Text, StringComparison.OrdinalIgnoreCase)) - { - rfe = file; - break; - } - } - - if (rfe == null) - { - foreach (var file in Configuration.Settings.RecentFiles.Files.Where(p => string.IsNullOrEmpty(p.OriginalFileName))) - { - if (file.FileName.Equals(item.Text, StringComparison.OrdinalIgnoreCase)) - { - rfe = file; - RemoveAlternate(true, false); - break; - } - } - } - - SubtitleListview1.BeginUpdate(); - if (rfe == null) - { - OpenSubtitle(item.Text, null); - } - else - { - OpenRecentFile(rfe); - } - - GotoSubPosAndPause(); - SetRecentIndices(rfe); - SubtitleListview1.EndUpdate(); - if (rfe != null && !string.IsNullOrEmpty(rfe.VideoFileName)) - { - var p = _subtitle.GetParagraphOrDefault(rfe.FirstSelectedIndex); - if (p != null) - { - mediaPlayer.CurrentPosition = p.StartTime.TotalSeconds; - } - } - } - } - - private void OpenRecentFile(RecentFileEntry rfe) - { - OpenSubtitle(rfe.FileName, null, rfe.VideoFileName, rfe.OriginalFileName, false); - Configuration.Settings.General.CurrentVideoOffsetInMs = rfe.VideoOffsetInMs; - if (rfe.VideoOffsetInMs != 0) - { - _subtitle.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(-Configuration.Settings.General.CurrentVideoOffsetInMs)); - _changeSubtitleHash = _subtitle.GetFastHashCode(GetCurrentEncoding().BodyName); - if (_subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) - { - _subtitleAlternate.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(-Configuration.Settings.General.CurrentVideoOffsetInMs)); - _changeAlternateSubtitleHash = _subtitleAlternate.GetFastHashCode(GetCurrentEncoding().BodyName); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - } - else - { - SubtitleListview1.Fill(_subtitle); - } - } - } - - private void GotoSubPosAndPause() - { - if (!string.IsNullOrEmpty(VideoFileName)) - { - _videoLoadedGoToSubPosAndPause = true; - } - else - { - mediaPlayer.SubtitleText = string.Empty; - } - } - - private void SetRecentIndices(RecentFileEntry rfe) - { - if (!Configuration.Settings.General.RememberSelectedLine) - { - return; - } - - ShowSubtitleTimer.Stop(); - Application.DoEvents(); - if (rfe != null && !string.IsNullOrEmpty(rfe.FileName) && - rfe.FirstSelectedIndex >= 0 && rfe.FirstSelectedIndex < SubtitleListview1.Items.Count) - { - SubtitleListview1.SelectedIndexChanged -= SubtitleListview1_SelectedIndexChanged; - SubtitleListview1.SelectIndexAndEnsureVisible(rfe.FirstSelectedIndex, true); - _subtitleListViewIndex = -1; - SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; - RefreshSelectedParagraph(); - } - - if (!_loading) - { - ShowSubtitleTimer.Start(); - } - } - - private void SaveToolStripMenuItemClick(object sender, EventArgs e) - { - if (!IsSubtitleLoaded) - { - return; - } - - ReloadFromSourceView(); - _saveAsCalled = false; - SaveSubtitle(GetCurrentSubtitleFormat()); - } - - private void SaveAsToolStripMenuItemClick(object sender, EventArgs e) - { - if (!IsSubtitleLoaded) - { - return; - } - - ReloadFromSourceView(); - FileSaveAs(true); - } - - private DialogResult FileSaveAs(bool allowUsingLastSaveAsFormat) - { - SubtitleFormat currentFormat = null; - if (allowUsingLastSaveAsFormat && !string.IsNullOrEmpty(Configuration.Settings.General.LastSaveAsFormat)) - { - currentFormat = Utilities.GetSubtitleFormatByFriendlyName(Configuration.Settings.General.LastSaveAsFormat); - } - - if (currentFormat == null) - { - currentFormat = GetCurrentSubtitleFormat(); - } - - UiUtil.SetSaveDialogFilter(saveFileDialog1, currentFormat); - - saveFileDialog1.Title = _language.SaveSubtitleAs; - saveFileDialog1.DefaultExt = "*" + currentFormat.Extension; - saveFileDialog1.AddExtension = true; - - if (!string.IsNullOrEmpty(openFileDialog1.InitialDirectory)) - { - saveFileDialog1.InitialDirectory = openFileDialog1.InitialDirectory; - } - - if (!string.IsNullOrWhiteSpace(_fileName) && Configuration.Settings.General.SaveAsUseFileNameFrom.Equals("file", StringComparison.OrdinalIgnoreCase)) - { - saveFileDialog1.FileName = Utilities.GetFileNameWithoutExtension(_fileName); - saveFileDialog1.InitialDirectory = Path.GetDirectoryName(_fileName); - } - else if (!string.IsNullOrEmpty(VideoFileName) && Configuration.Settings.General.SaveAsUseFileNameFrom.Equals("video", StringComparison.OrdinalIgnoreCase)) - { - if (_converted && !string.IsNullOrEmpty(_fileName) && !File.Exists(_fileName)) - { - saveFileDialog1.FileName = Utilities.GetFileNameWithoutExtension(_fileName); - } - else - { - saveFileDialog1.FileName = Utilities.GetFileNameWithoutExtension(VideoFileName); - } - - saveFileDialog1.InitialDirectory = Path.GetDirectoryName(VideoFileName); - } - else if (!string.IsNullOrWhiteSpace(_fileName)) - { - saveFileDialog1.FileName = Utilities.GetFileNameWithoutExtension(_fileName); - saveFileDialog1.InitialDirectory = Path.GetDirectoryName(_fileName); - } - else if (!string.IsNullOrEmpty(VideoFileName)) - { - saveFileDialog1.FileName = Utilities.GetFileNameWithoutExtension(VideoFileName); - saveFileDialog1.InitialDirectory = Path.GetDirectoryName(VideoFileName); - } - else - { - saveFileDialog1.FileName = string.Empty; - } - - if (!string.IsNullOrEmpty(saveFileDialog1.FileName) && - saveFileDialog1.FileName.Contains('.') && - !saveFileDialog1.FileName.EndsWith(currentFormat.Extension, StringComparison.OrdinalIgnoreCase)) - { - saveFileDialog1.FileName = saveFileDialog1.FileName + currentFormat.Extension; - } - - var result = saveFileDialog1.ShowDialog(this); - if (result == DialogResult.OK) - { - openFileDialog1.InitialDirectory = saveFileDialog1.InitialDirectory; - _converted = false; - _fileName = saveFileDialog1.FileName; - _fileDateTime = File.GetLastWriteTime(_fileName); - SetTitle(); - MakeHistoryForUndo(_language.Menu.File.SaveAs); - - int index = 0; - foreach (SubtitleFormat format in SubtitleFormat.AllSubtitleFormats) - { - if (saveFileDialog1.FilterIndex == index + 1) - { - // only allow current extension or ".txt" - string ext = Path.GetExtension(_fileName).ToLowerInvariant(); - bool extOk = ext.Equals(format.Extension, StringComparison.OrdinalIgnoreCase) || format.AlternateExtensions.Contains(ext) || ext == ".txt"; - if (!extOk) - { - if (_fileName.EndsWith('.')) - { - _fileName = _fileName.Substring(0, _fileName.Length - 1); - } - - _fileName += format.Extension; - } - - _saveAsCalled = true; - if (SaveSubtitle(format) == DialogResult.OK) - { - Configuration.Settings.General.LastSaveAsFormat = format.Name; - SetCurrentFormat(format); - Configuration.Settings.RecentFiles.Add(_fileName, FirstVisibleIndex, FirstSelectedIndex, VideoFileName, _subtitleAlternateFileName, Configuration.Settings.General.CurrentVideoOffsetInMs); - Configuration.Settings.Save(); - UpdateRecentFilesUI(); - } - - break; - } - - index++; - } - - _converted = false; - } - - return result; - } - - private DialogResult SaveSubtitle(SubtitleFormat format, bool useNewLineWithOnly0A = false, bool skipPrompts = false) - { - if (string.IsNullOrEmpty(_fileName) || _converted) - { - return FileSaveAs(false); - } - - try - { - var sub = GetSaveSubtitle(_subtitle); - - if (format != null && !format.IsTextBased) - { - if (format is Ebu ebu) - { - var header = new Ebu.EbuGeneralSubtitleInformation(); - if (_subtitle != null && _subtitle.Header != null && (_subtitle.Header.Contains("STL2") || _subtitle.Header.Contains("STL3"))) - { - header = Ebu.ReadHeader(Encoding.UTF8.GetBytes(_subtitle.Header)); - } - - if (ebu.Save(_fileName, sub, !_saveAsCalled, header)) - { - _changeSubtitleHash = _subtitle.GetFastHashCode(GetCurrentEncoding().BodyName); - Configuration.Settings.RecentFiles.Add(_fileName, FirstVisibleIndex, FirstSelectedIndex, VideoFileName, _subtitleAlternateFileName, Configuration.Settings.General.CurrentVideoOffsetInMs); - Configuration.Settings.Save(); - } - } - - return DialogResult.OK; - } - - string allText = sub.ToText(format); - - // Seungki begin - if (_splitDualSami && _subtitleAlternate?.Paragraphs.Count > 0) - { - var s = new Subtitle(_subtitle); - foreach (var p in _subtitleAlternate.Paragraphs) - { - s.Paragraphs.Add(p); - } - - allText = s.ToText(format); - } - // Seungki end - - var currentEncoding = GetCurrentEncoding(); - bool isUnicode = currentEncoding.Equals(Encoding.Unicode) || currentEncoding.Equals(Encoding.UTF32) || currentEncoding.Equals(Encoding.GetEncoding(12001)) || currentEncoding.Equals(Encoding.UTF7) || currentEncoding.Equals(Encoding.UTF8); - if (!isUnicode) - { - if (!skipPrompts && currentEncoding.GetString(currentEncoding.GetBytes(allText)) != allText) - { - if (MessageBox.Show(string.Format(_language.UnicodeMusicSymbolsAnsiWarning), Title, MessageBoxButtons.YesNoCancel) != DialogResult.Yes) - { - return DialogResult.No; - } - } - - allText = NormalizeUnicode(allText, currentEncoding); - } - - bool containsNegativeTime = false; - var negativeTimeLines = new List(); - foreach (var p in sub.Paragraphs) - { - if (p.StartTime.TotalMilliseconds < 0 || p.EndTime.TotalMilliseconds < 0) - { - containsNegativeTime = true; - negativeTimeLines.Add(sub.Paragraphs.IndexOf(p).ToString(CultureInfo.InvariantCulture)); - if (negativeTimeLines.Count > 10) - { - negativeTimeLines[negativeTimeLines.Count - 1] = negativeTimeLines[negativeTimeLines.Count - 1] + "..."; - break; - } - } - } - - if (containsNegativeTime && !skipPrompts) - { - if (MessageBox.Show(_language.NegativeTimeWarning + Environment.NewLine + - string.Format(Configuration.Settings.Language.MultipleReplace.LinesFoundX, string.Join(", ", negativeTimeLines)), - Title, MessageBoxButtons.YesNoCancel) != DialogResult.Yes) - { - return DialogResult.No; - } - } - - if (!skipPrompts && File.Exists(_fileName)) - { - var fileInfo = new FileInfo(_fileName); - var fileOnDisk = fileInfo.LastWriteTime; - if (_fileDateTime != fileOnDisk && _fileDateTime != new DateTime()) - { - if (MessageBox.Show(string.Format(_language.OverwriteModifiedFile, - _fileName, fileOnDisk.ToShortDateString(), fileOnDisk.ToString("HH:mm:ss"), - Environment.NewLine, _fileDateTime.ToShortDateString(), _fileDateTime.ToString("HH:mm:ss")), - Title + " - " + _language.FileOnDiskModified, MessageBoxButtons.YesNoCancel) != DialogResult.Yes) - { - return DialogResult.No; - } - } - - if (fileInfo.IsReadOnly) - { - MessageBox.Show(string.Format(_language.FileXIsReadOnly, _fileName)); - return DialogResult.No; - } - } - - // force encoding - var formatType = format.GetType(); - if (formatType == typeof(WebVTT) || formatType == typeof(WebVTTFileWithLineNumber)) - { - SetEncoding(Encoding.UTF8); - currentEncoding = Encoding.UTF8; - } - else if (formatType == typeof(SwiftInterchange2)) - { - SetEncoding(Encoding.Unicode); - currentEncoding = Encoding.Unicode; - } - - if (Configuration.Settings.General.ShowFormatRequiresUtf8Warning && !currentEncoding.Equals(Encoding.UTF8) && - (formatType == typeof(DCinemaInterop) || formatType == typeof(DCinemaSmpte2007) || - formatType == typeof(DCinemaSmpte2010) || formatType == typeof(DCinemaSmpte2014))) - { - using (var form = new DialogDoNotShowAgain(Title, string.Format(_language.FormatXShouldUseUft8, GetCurrentSubtitleFormat().FriendlyName))) - { - form.ShowDialog(this); - Configuration.Settings.General.ShowFormatRequiresUtf8Warning = !form.DoNoDisplayAgain; - } - } - - if (format.Extension == ".rtf" || formatType == typeof(ProjectionSubtitleList)) - { - var enc = GetCurrentEncoding(); - if (enc != Encoding.ASCII) - { - var oldDisableShowStatus = _disableShowStatus; - _disableShowStatus = false; - ShowStatus("ASCII encoding used for save"); - _disableShowStatus = oldDisableShowStatus; - currentEncoding = Encoding.ASCII; - } - } - - if (useNewLineWithOnly0A) - { - allText = allText.Replace("\r\n", "\n"); - } - - if (formatType == typeof(ItunesTimedText) || formatType == typeof(ScenaristClosedCaptions) || formatType == typeof(ScenaristClosedCaptionsDropFrame)) - { - var outputEnc = new UTF8Encoding(false); // create encoding with no BOM - using (var file = new StreamWriter(_fileName, false, outputEnc)) // open file with encoding - { - file.Write(allText); - } - } - else if (Equals(currentEncoding, Encoding.UTF8) && (formatType == typeof(TmpegEncAW5) || formatType == typeof(TmpegEncXml))) - { - var outputEnc = new UTF8Encoding(false); // create encoding with no BOM - using (var file = new StreamWriter(_fileName, false, outputEnc)) // open file with encoding - { - file.Write(allText); - } - } - else - { - if (string.IsNullOrWhiteSpace(allText)) - { - MessageBox.Show(string.Format(_language.UnableToSaveSubtitleX, _fileName), String.Empty, MessageBoxButtons.OK, MessageBoxIcon.Stop); - return DialogResult.Cancel; - } - - if (comboBoxEncoding.SelectedIndex == TextEncoding.Utf8WithoutBomIndex) - { - var outputEnc = new UTF8Encoding(false); // create encoding with no BOM - using (var file = new StreamWriter(_fileName, false, outputEnc)) // open file with encoding - { - file.Write(allText); - } - } - else - { - // create file - includes BOM for Unicode formats - using (var fs = new FileStream(_fileName, FileMode.Create, FileAccess.Write, FileShare.Read)) - using (var sw = new StreamWriter(fs, currentEncoding)) - { - sw.Write(allText); - } - } - } - - Configuration.Settings.RecentFiles.Add(_fileName, FirstVisibleIndex, FirstSelectedIndex, VideoFileName, _subtitleAlternateFileName, Configuration.Settings.General.CurrentVideoOffsetInMs); - Configuration.Settings.Save(); - new BookmarkPersistence(_subtitle, _fileName).Save(); - _fileDateTime = File.GetLastWriteTime(_fileName); - ShowStatus(string.Format(_language.SavedSubtitleX, _fileName)); - if (formatType == typeof(NetflixTimedText)) - { - NetflixGlyphCheck(true); - } - - _changeSubtitleHash = _subtitle.GetFastHashCode(GetCurrentEncoding().BodyName); - return DialogResult.OK; - } - catch (Exception exception) - { - MessageBox.Show(exception.Message); - return DialogResult.Cancel; - } - } - - private DialogResult SaveOriginalSubtitle(SubtitleFormat format, bool skipPrompts = false) - { - try - { - var subAlt = GetSaveSubtitle(_subtitleAlternate); - - bool containsNegativeTime = false; - foreach (var p in subAlt.Paragraphs) - { - if (p.StartTime.TotalMilliseconds < 0 || p.EndTime.TotalMilliseconds < 0) - { - containsNegativeTime = true; - break; - } - } - - if (!skipPrompts && containsNegativeTime) - { - if (MessageBox.Show(_language.NegativeTimeWarning, Title, MessageBoxButtons.YesNoCancel) != DialogResult.Yes) - { - return DialogResult.No; - } - } - - if (format != null && !format.IsTextBased) - { - if (format is Ebu ebu) - { - if (ebu.Save(_subtitleAlternateFileName, subAlt)) - { - Configuration.Settings.RecentFiles.Add(_fileName, FirstVisibleIndex, FirstSelectedIndex, VideoFileName, _subtitleAlternateFileName, Configuration.Settings.General.CurrentVideoOffsetInMs); - Configuration.Settings.Save(); - ShowStatus(string.Format(_language.SavedOriginalSubtitleX, _subtitleAlternateFileName)); - _changeAlternateSubtitleHash = _subtitleAlternate.GetFastHashCode(GetCurrentEncoding().BodyName); - return DialogResult.OK; - } - - return DialogResult.No; - } - - MessageBox.Show("Ups - save original does not support this format - please go to Github and create an issue!"); - } - - string allText = subAlt.ToText(format); - var currentEncoding = GetCurrentEncoding(); - bool isUnicode = currentEncoding != null && (currentEncoding.Equals(Encoding.Unicode) || currentEncoding.Equals(Encoding.UTF32) || currentEncoding.Equals(Encoding.UTF7) || currentEncoding.Equals(Encoding.UTF8)); - if (!skipPrompts && !isUnicode && currentEncoding.GetString(currentEncoding.GetBytes(allText)) != allText) - { - if (MessageBox.Show(string.Format(_language.UnicodeMusicSymbolsAnsiWarning), Title, MessageBoxButtons.YesNoCancel) != DialogResult.Yes) - { - return DialogResult.No; - } - } - - if (!isUnicode) - { - allText = NormalizeUnicode(allText, currentEncoding); - } - - File.WriteAllText(_subtitleAlternateFileName, allText, currentEncoding); - ShowStatus(string.Format(_language.SavedOriginalSubtitleX, _subtitleAlternateFileName)); - _changeAlternateSubtitleHash = _subtitleAlternate.GetFastHashCode(GetCurrentEncoding().BodyName); - return DialogResult.OK; - } - catch - { - MessageBox.Show(string.Format(_language.UnableToSaveSubtitleX, _fileName)); - return DialogResult.Cancel; - } - } - - public string NormalizeUnicode(string input, Encoding encoding) - { - const char defHyphen = '-'; // - Hyphen-minus (\u002D) (Basic Latin) - const char defColon = ':'; // : Colon (\u003A) (Basic Latin) - - var text = input; - - bool hasSingleMusicNode = true; - if (encoding.GetString(encoding.GetBytes("♪")) != "♪") - { - text = text.Replace('♪', '#'); - hasSingleMusicNode = false; - } - - if (encoding.GetString(encoding.GetBytes("♫")) != "♫") - { - text = text.Replace('♫', hasSingleMusicNode ? '♪' : '#'); - } - - // Hyphens - return text.Replace('\u2043', defHyphen) // ⁃ Hyphen bullet (\u2043) - .Replace('\u2010', defHyphen) // ‐ Hyphen (\u2010) - .Replace('\u2012', defHyphen) // ‒ Figure dash (\u2012) - .Replace('\u2013', defHyphen) // – En dash (\u2013) - .Replace('\u2014', defHyphen) // — Em dash (\u2014) - .Replace('\u2015', defHyphen) // ― Horizontal bar (\u2015) - - // Colons: - .Replace('\u02F8', defColon) // ˸ Modifier Letter Raised Colon (\u02F8) - .Replace('\uFF1A', defColon) // : Fullwidth Colon (\uFF1A) - .Replace('\uFE13', defColon) // ︓ Presentation Form for Vertical Colon (\uFE13) - - // Others - .Replace("…", "...") - .Replace("⇒", "=>") - - // Spaces - .Replace('\u00A0', ' ') // No-Break Space - .Replace("\u200B", string.Empty) // Zero Width Space - .Replace("\uFEFF", string.Empty) // Zero Width No-Break Space - - // Intellectual property - .Replace("\u00A9", "(Copyright)") // © copyright - .Replace("\u2117", "(Sound-recording Copyright)") // ℗ sound-recording copyright - .Replace("\u00AE", "(Registered Trademark)") // ® registered trademark - .Replace("\u2120", "(Service Mark)") // ℠ service mark - .Replace("\u2122", "(Trademark)") // ™ trademark - - // RTL/LTR markers - .Replace("\u202B", string.Empty) // ‏ - .Replace("\u202A", string.Empty); // &lmr; - } - - private void NewToolStripMenuItemClick(object sender, EventArgs e) - { - ReloadFromSourceView(); - FileNew(); - } - - private void ResetSubtitle(bool forceVideoReload = false) - { - SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); - - labelStartTimeWarning.Text = string.Empty; - labelDurationWarning.Text = string.Empty; - - Configuration.Settings.General.CurrentVideoOffsetInMs = 0; - _subtitle = new Subtitle(_subtitle.HistoryItems); - _changeAlternateSubtitleHash = -1; - _changeSubtitleHash = _subtitle.GetFastHashCode(GetCurrentEncoding().BodyName); - _subtitleAlternateFileName = null; - textBoxSource.Text = string.Empty; - SubtitleListview1.Items.Clear(); - _fileName = string.Empty; - _fileDateTime = new DateTime(); - _oldSubtitleFormat = null; - labelSingleLine.Text = string.Empty; - buttonSplitLine.Visible = false; - labelSingleLinePixels.Text = string.Empty; - RemoveAlternate(true, false); - _splitDualSami = false; - - SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.Extra); - - var oldDisableShowStatus = _disableShowStatus; - _disableShowStatus = true; - ComboBoxSubtitleFormatsSelectedIndexChanged(null, null); - _disableShowStatus = oldDisableShowStatus; - - SetEncoding(Configuration.Settings.General.DefaultEncoding); - - toolStripComboBoxFrameRate.Text = Configuration.Settings.General.DefaultFrameRate.ToString(); - _findHelper = null; - _spellCheckForm = null; - - if (ModifierKeys != Keys.Shift || forceVideoReload) - { - VideoFileName = null; - _videoInfo = null; - VideoAudioTrackNumber = -1; - labelVideoInfo.Text = _languageGeneral.NoVideoLoaded; - audioVisualizer.WavePeaks = null; - audioVisualizer.SetSpectrogram(null); - audioVisualizer.SceneChanges = new List(); - audioVisualizer.Chapters = new List(); - if (mediaPlayer.VideoPlayer != null) - { - mediaPlayer.PauseAndDisposePlayer(); - } - - timeUpDownVideoPositionAdjust.TimeCode = new TimeCode(); - timeUpDownVideoPositionAdjust.Enabled = false; - timeUpDownVideoPosition.TimeCode = new TimeCode(); - timeUpDownVideoPosition.Enabled = false; - trackBarWaveformPosition.Value = 0; - timeUpDownStartTime.TimeCode = new TimeCode(); - numericUpDownDuration.Value = 0; - } - - _sourceViewChange = false; - - _subtitleListViewIndex = -1; - textBoxListViewText.Text = string.Empty; - textBoxListViewTextAlternate.Text = string.Empty; - textBoxListViewText.Enabled = false; - textBoxListViewText.BackColor = SystemColors.ActiveBorder; - textBoxListViewTextAlternate.BackColor = SystemColors.ActiveBorder; - labelTextLineLengths.Text = string.Empty; - labelCharactersPerSecond.Text = string.Empty; - labelTextLineTotal.Text = string.Empty; - - _listViewTextUndoLast = null; - _listViewAlternateTextUndoLast = null; - _listViewTextUndoIndex = -1; - - _changeSubtitleHash = _subtitle.GetFastHashCode(GetCurrentEncoding().BodyName); - _converted = false; - - SetTitle(); - SetUndockedWindowsTitle(); - mediaPlayer.SubtitleText = string.Empty; - labelNextWord.Visible = false; - ShowStatus(_language.New); - - ResetShowEarlierOrLater(); - - // Set default RTL or LTR - if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) - { - textBoxListViewTextAlternate.RightToLeft = Configuration.Settings.General.RightToLeftMode ? RightToLeft.Yes : RightToLeft.No; - } - - if (Configuration.Settings.General.RightToLeftMode) - { - textBoxListViewText.RightToLeft = RightToLeft.Yes; - textBoxSource.RightToLeft = RightToLeft.Yes; - } - else - { - textBoxListViewText.RightToLeft = RightToLeft.No; - textBoxSource.RightToLeft = RightToLeft.No; - } - - SetListViewStateImages(); - pictureBoxBookmark.Visible = false; - panelBookmark.Hide(); - } - - private void ResetShowEarlierOrLater() - { - try - { - if (_showEarlierOrLater != null && !_showEarlierOrLater.IsDisposed) - { - _showEarlierOrLater.ResetTotalAdjustment(); - } - } - catch - { - // form closing or alike - } - } - - private void FileNew() - { - if (ContinueNewOrExit()) - { - if (Configuration.Settings.General.ShowRecentFiles) - { - Configuration.Settings.RecentFiles.Add(_fileName, FirstVisibleIndex, FirstSelectedIndex, VideoFileName, _subtitleAlternateFileName, Configuration.Settings.General.CurrentVideoOffsetInMs); - } - - MakeHistoryForUndo(_language.BeforeNew); - ResetSubtitle(true); - } - } - - private void ComboBoxSubtitleFormatsSelectedIndexChanged(object sender, EventArgs e) - { - if (IsMenuOpen) - { - return; - } - - _converted = true; - var format = GetCurrentSubtitleFormat(); - if (format == null) - { - format = new SubRip(); - } - var formatType = format.GetType(); - - if (_oldSubtitleFormat == null) - { - if (!_loading) - { - MakeHistoryForUndo(string.Format(_language.BeforeConvertingToX, format.FriendlyName)); - } - } - else - { - _subtitle.MakeHistoryForUndo(string.Format(_language.BeforeConvertingToX, format.FriendlyName), _oldSubtitleFormat, _fileDateTime, _subtitleAlternate, _subtitleAlternateFileName, _subtitleListViewIndex, textBoxListViewText.SelectionStart, textBoxListViewTextAlternate.SelectionStart); - _oldSubtitleFormat.RemoveNativeFormatting(_subtitle, format); - SaveSubtitleListviewIndices(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - - if (_oldSubtitleFormat.HasStyleSupport) - { - SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.Extra); - } - - if (_networkSession == null) - { - SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.Network); - } - - if (formatType == typeof(AdvancedSubStationAlpha) && _oldSubtitleFormat.GetType() == typeof(SubStationAlpha)) - { - _subtitle.Header = AdvancedSubStationAlpha.GetHeaderAndStylesFromSubStationAlpha(_subtitle.Header); - } - else if (formatType == typeof(SubStationAlpha) && _oldSubtitleFormat.GetType() == typeof(AdvancedSubStationAlpha)) - { - _subtitle.Header = SubStationAlpha.GetHeaderAndStylesFromAdvancedSubStationAlpha(_subtitle.Header, string.Empty); - } - } - - ShowSource(); - ShowStatus(string.Format(_language.ConvertedToX, format.FriendlyName)); - if (_fileName != null && _oldSubtitleFormat != null && _fileName.EndsWith(_oldSubtitleFormat.Extension, StringComparison.Ordinal)) - { - _fileName = _fileName.Substring(0, _fileName.Length - _oldSubtitleFormat.Extension.Length) + format.Extension; - } - - _oldSubtitleFormat = format; - Configuration.Settings.General.LastSaveAsFormat = format.Name; - - if ((formatType == typeof(AdvancedSubStationAlpha) || - formatType == typeof(SubStationAlpha) || - formatType == typeof(CsvNuendo)) && (_subtitle.Paragraphs.Any(p => !string.IsNullOrEmpty(p.Actor)) || - Configuration.Settings.Tools.ListViewShowColumnActor)) - { - bool wasVisible = SubtitleListview1.ColumnIndexActor >= 0; - if (formatType == typeof(CsvNuendo)) - { - SubtitleListview1.ShowActorColumn(Configuration.Settings.Language.General.Character); - } - else - { - SubtitleListview1.ShowActorColumn(Configuration.Settings.Language.General.Actor); - } - - if (!wasVisible) - { - SaveSubtitleListviewIndices(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - } - } - else - { - SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.Actor); - } - - if (formatType == typeof(TimedText10) && Configuration.Settings.Tools.ListViewShowColumnRegion) - { - SubtitleListview1.ShowRegionColumn(Configuration.Settings.Language.General.Region); - } - else - { - SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.Region); - } - - if (format.HasStyleSupport) - { - var styles = new List(); - if (formatType == typeof(AdvancedSubStationAlpha) || formatType == typeof(SubStationAlpha)) - { - styles = AdvancedSubStationAlpha.GetStylesFromHeader(_subtitle.Header); - } - else if (formatType == typeof(TimedText10) || formatType == typeof(ItunesTimedText)) - { - styles = TimedText10.GetStylesFromHeader(_subtitle.Header); - } - else if (formatType == typeof(Sami) || formatType == typeof(SamiModern)) - { - styles = Sami.GetStylesFromHeader(_subtitle.Header); - if (string.IsNullOrEmpty(_subtitle.Header)) - { - styles = Sami.GetStylesFromSubtitle(_subtitle); - } - else - { - styles = Sami.GetStylesFromHeader(_subtitle.Header); - } - } - else if (format.Name == "Nuendo") - { - styles = GetNuendoStyles(); - } - - if (styles.Count > 0) - { - foreach (var p in _subtitle.Paragraphs) - { - if (string.IsNullOrEmpty(p.Extra)) - { - p.Extra = styles[0]; - } - } - } - - if (formatType == typeof(Sami) || formatType == typeof(SamiModern)) - { - SubtitleListview1.ShowExtraColumn(_languageGeneral.Class); - } - else if (formatType == typeof(TimedText10) || formatType == typeof(ItunesTimedText)) - { - SubtitleListview1.ShowExtraColumn(_languageGeneral.StyleLanguage); - } - else if (format.Name == "Nuendo") - { - SubtitleListview1.ShowExtraColumn(_languageGeneral.Character); - } - else - { - SubtitleListview1.ShowExtraColumn(_languageGeneral.Style); - } - - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - } - - ShowHideTextBasedFeatures(format); - - UpdateNetflixGlyphCheckToolsVisibility(); - } - - private static List GetNuendoStyles() - { - if (!string.IsNullOrEmpty(Configuration.Settings.SubtitleSettings.NuendoCharacterListFile) && File.Exists(Configuration.Settings.SubtitleSettings.NuendoCharacterListFile)) - { - return NuendoProperties.LoadCharacters(Configuration.Settings.SubtitleSettings.NuendoCharacterListFile); - } - - return new List(); - } - - private void ComboBoxSubtitleFormatsEnter(object sender, EventArgs e) - { - SubtitleFormat format = GetCurrentSubtitleFormat(); - if (format != null) - { - _oldSubtitleFormat = format; - } - } - - private SubtitleFormat GetCurrentSubtitleFormat() - { - return Utilities.GetSubtitleFormatByFriendlyName(comboBoxSubtitleFormats.SelectedItem.ToString()); - } - - private void ShowSource() - { - if (_subtitle != null && _subtitle.Paragraphs.Count > 0) - { - SubtitleFormat format = GetCurrentSubtitleFormat(); - if (format != null) - { - textBoxSource.TextChanged -= TextBoxSourceTextChanged; - textBoxSource.Text = GetSaveSubtitle(_subtitle).ToText(format); - textBoxSource.TextChanged += TextBoxSourceTextChanged; - return; - } - } - - textBoxSource.TextChanged -= TextBoxSourceTextChanged; - textBoxSource.Text = string.Empty; - textBoxSource.TextChanged += TextBoxSourceTextChanged; - } - - private void SettingsToolStripMenuItemClick(object sender, EventArgs e) - { - ShowSettings(); - } - - private void ShowSettings() - { - string oldVideoPlayer = Configuration.Settings.General.VideoPlayer; - string oldMpvVideoOutput = Configuration.Settings.General.MpvVideoOutputWindows; - string oldListViewLineSeparatorString = Configuration.Settings.General.ListViewLineSeparatorString; - var oldCpsWhiteSpaceSetting = Configuration.Settings.General.CharactersPerSecondsIgnoreWhiteSpace; - string oldSubtitleFontSettings = Configuration.Settings.General.SubtitleFontName + - Configuration.Settings.General.SubtitleTextBoxFontBold + - Configuration.Settings.General.CenterSubtitleInTextBox + - Configuration.Settings.General.SubtitleTextBoxFontSize + - Configuration.Settings.General.SubtitleFontColor.ToArgb() + - Configuration.Settings.General.SubtitleBackgroundColor.ToArgb() + - Configuration.Settings.General.SubtitleListViewFontBold.ToString() + - Configuration.Settings.General.SubtitleListViewFontSize; - - ; - bool oldUseTimeFormatHHMMSSFF = Configuration.Settings.General.UseTimeFormatHHMMSSFF; - - string oldSyntaxColoring = Configuration.Settings.Tools.ListViewSyntaxColorDurationSmall.ToString() + - Configuration.Settings.Tools.ListViewSyntaxColorDurationBig + - Configuration.Settings.Tools.ListViewSyntaxColorLongLines + - Configuration.Settings.Tools.ListViewSyntaxColorOverlap + - Configuration.Settings.Tools.ListViewSyntaxMoreThanXLines + - Configuration.Settings.General.MaxNumberOfLines + - Configuration.Settings.Tools.ListViewSyntaxErrorColor.ToArgb(); - - var oldAllowEditOfOriginalSubtitle = Configuration.Settings.General.AllowEditOfOriginalSubtitle; - var oldShowColumnEndTime = Configuration.Settings.Tools.ListViewShowColumnEndTime; - var oldShowcolumnDuration = Configuration.Settings.Tools.ListViewShowColumnDuration; - var oldShowColumnCharsPerSec = Configuration.Settings.Tools.ListViewShowColumnCharsPerSec; - var oldShowWordsMinColumn = Configuration.Settings.Tools.ListViewShowColumnWordsPerMin; - var oldSubtitleTextBoxSyntaxColor = Configuration.Settings.General.SubtitleTextBoxSyntaxColor; - var oldSubtitleFontSize = Configuration.Settings.General.SubtitleTextBoxFontSize; - var oldSubtitleTextBoxHtmlColor = Configuration.Settings.General.SubtitleTextBoxHtmlColor.ToArgb().ToString(); - var oldSubtitleTextBoxAssaColor = Configuration.Settings.General.SubtitleTextBoxAssColor.ToArgb().ToString(); - using (var settings = new Settings()) - { - settings.Initialize(Icon, toolStripButtonFileNew.Image, toolStripButtonFileOpen.Image, toolStripButtonSave.Image, toolStripButtonSaveAs.Image, toolStripButtonFind.Image, - toolStripButtonReplace.Image, toolStripButtonFixCommonErrors.Image, toolStripButtonRemoveTextForHi.Image, toolStripButtonVisualSync.Image, - toolStripButtonSpellCheck.Image, toolStripButtonNetflixQualityCheck.Image, toolStripButtonSettings.Image, toolStripButtonHelp.Image); - - if (settings.ShowDialog(this) == DialogResult.Cancel) - { - return; // settings update canceled - } - } - - try - { // can have some problems with fonts... - UiUtil.InitializeSubtitleFont(textBoxSource); - UiUtil.InitializeSubtitleFont(textBoxListViewText); - UiUtil.InitializeSubtitleFont(textBoxListViewTextAlternate); - UiUtil.InitializeSubtitleFont(SubtitleListview1); - InitializeToolbar(); - } - catch (Exception exception) - { - System.Diagnostics.Debug.WriteLine(exception.Message + Environment.NewLine + exception.StackTrace); - } - - UpdateRecentFilesUI(); - buttonCustomUrl1.Text = Configuration.Settings.VideoControls.CustomSearchText1; - buttonCustomUrl1.Visible = Configuration.Settings.VideoControls.CustomSearchUrl1.Length > 1; - buttonCustomUrl2.Text = Configuration.Settings.VideoControls.CustomSearchText2; - buttonCustomUrl2.Visible = Configuration.Settings.VideoControls.CustomSearchUrl2.Length > 1; - - SetAudioVisualizerSettings(); - - string newSyntaxColoring = Configuration.Settings.Tools.ListViewSyntaxColorDurationSmall.ToString() + - Configuration.Settings.Tools.ListViewSyntaxColorDurationBig + - Configuration.Settings.Tools.ListViewSyntaxColorLongLines + - Configuration.Settings.Tools.ListViewSyntaxColorOverlap + - Configuration.Settings.Tools.ListViewSyntaxMoreThanXLines + - Configuration.Settings.General.MaxNumberOfLines + - Configuration.Settings.Tools.ListViewSyntaxErrorColor.ToArgb(); - - if (oldSubtitleFontSettings != Configuration.Settings.General.SubtitleFontName + - Configuration.Settings.General.SubtitleTextBoxFontBold + - Configuration.Settings.General.CenterSubtitleInTextBox + - Configuration.Settings.General.SubtitleTextBoxFontSize + - Configuration.Settings.General.SubtitleFontColor.ToArgb() + - Configuration.Settings.General.SubtitleBackgroundColor.ToArgb() + - Configuration.Settings.General.SubtitleListViewFontBold.ToString() + - Configuration.Settings.General.SubtitleListViewFontSize || - oldSyntaxColoring != newSyntaxColoring || - oldShowColumnEndTime != Configuration.Settings.Tools.ListViewShowColumnEndTime || - oldShowcolumnDuration != Configuration.Settings.Tools.ListViewShowColumnDuration || - oldShowColumnCharsPerSec != Configuration.Settings.Tools.ListViewShowColumnCharsPerSec || - oldShowWordsMinColumn != Configuration.Settings.Tools.ListViewShowColumnWordsPerMin) - { - if (Configuration.Settings.Tools.ListViewShowColumnEndTime) - { - SubtitleListview1.ShowEndColumn(Configuration.Settings.Language.General.EndTime); - } - else - { - SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.End); - } - - if (Configuration.Settings.Tools.ListViewShowColumnDuration) - { - SubtitleListview1.ShowDurationColumn(Configuration.Settings.Language.General.Duration); - } - else - { - SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.Duration); - } - - if (Configuration.Settings.Tools.ListViewShowColumnCharsPerSec) - { - SubtitleListview1.ShowCharsSecColumn(Configuration.Settings.Language.General.CharsPerSec); - } - else - { - SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.CharactersPerSeconds); - } - - if (Configuration.Settings.Tools.ListViewShowColumnWordsPerMin) - { - SubtitleListview1.ShowWordsMinColumn(Configuration.Settings.Language.General.WordsPerMin); - } - else - { - SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.WordsPerMinute); - } - - try - { // can have some problems with fonts... - UiUtil.InitializeSubtitleFont(textBoxListViewText); - UiUtil.InitializeSubtitleFont(textBoxListViewTextAlternate); - UiUtil.InitializeSubtitleFont(textBoxSource); - SubtitleListview1.SubtitleFontName = Configuration.Settings.General.SubtitleFontName; - SubtitleListview1.SubtitleFontBold = Configuration.Settings.General.SubtitleListViewFontBold; - SubtitleListview1.SubtitleFontSize = Configuration.Settings.General.SubtitleListViewFontSize; - } - catch (Exception exception) - { - System.Diagnostics.Debug.WriteLine(exception.Message + Environment.NewLine + exception.StackTrace); - } - - SubtitleListview1.ForeColor = Configuration.Settings.General.SubtitleFontColor; - SubtitleListview1.BackColor = Configuration.Settings.General.SubtitleBackgroundColor; - - SaveSubtitleListviewIndices(); - UiUtil.InitializeSubtitleFont(SubtitleListview1); - SubtitleListview1.AutoSizeAllColumns(this); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - mediaPlayer.SetSubtitleFont(); - ShowSubtitle(); - } - - mediaPlayer.SetSubtitleFont(); - mediaPlayer.ShowStopButton = Configuration.Settings.General.VideoPlayerShowStopButton; - mediaPlayer.ShowMuteButton = Configuration.Settings.General.VideoPlayerShowMuteButton; - mediaPlayer.ShowFullscreenButton = Configuration.Settings.General.VideoPlayerShowFullscreenButton; - - if (oldListViewLineSeparatorString != Configuration.Settings.General.ListViewLineSeparatorString || - oldCpsWhiteSpaceSetting != Configuration.Settings.General.CharactersPerSecondsIgnoreWhiteSpace) - { - SubtitleListview1.InitializeLanguage(_languageGeneral, Configuration.Settings); - SaveSubtitleListviewIndices(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - } - - if (oldAllowEditOfOriginalSubtitle != Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) - { - if (Configuration.Settings.General.AllowEditOfOriginalSubtitle) - { - AddAlternate(); - } - else - { - RemoveAlternate(false, false); - } - - Main_ResizeEnd(null, null); - } - - SetLanguage(Configuration.Settings.General.Language); - - textBoxListViewTextAlternate.Enabled = Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleListViewIndex >= 0; - - SetShortcuts(); - - CheckAndGetNewlyDownloadedMpvDlls("Please restart to use new libmpv dll"); - - if (!string.IsNullOrEmpty(VideoFileName) && oldVideoPlayer != Configuration.Settings.General.VideoPlayer && mediaPlayer.VideoPlayer != null || - (oldMpvVideoOutput != Configuration.Settings.General.MpvVideoOutputWindows && Configuration.Settings.General.VideoPlayer.Equals("MPV", StringComparison.OrdinalIgnoreCase))) - { - string vfn = VideoFileName; - CloseVideoToolStripMenuItemClick(null, null); - OpenVideo(vfn); - } - - StartOrStopAutoBackup(); - - SetTitle(); - if (Configuration.Settings.VideoControls.GenerateSpectrogram) - { - audioVisualizer.WaveformNotLoadedText = Configuration.Settings.Language.Waveform.ClickToAddWaveformAndSpectrogram; - showhideWaveformToolStripMenuItem.Text = _language.Menu.Video.ShowHideWaveformAndSpectrogram; - } - else - { - audioVisualizer.WaveformNotLoadedText = Configuration.Settings.Language.Waveform.ClickToAddWaveform; - showhideWaveformToolStripMenuItem.Text = _language.Menu.Video.ShowHideWaveform; - } - - audioVisualizer.Invalidate(); - - if (oldUseTimeFormatHHMMSSFF != Configuration.Settings.General.UseTimeFormatHHMMSSFF) - { - RefreshTimeCodeMode(); - } - - if (oldSubtitleTextBoxSyntaxColor != Configuration.Settings.General.SubtitleTextBoxSyntaxColor || - oldSubtitleFontSize != Configuration.Settings.General.SubtitleTextBoxFontSize || - oldSubtitleTextBoxHtmlColor != Configuration.Settings.General.SubtitleTextBoxHtmlColor.ToArgb().ToString() || - oldSubtitleTextBoxAssaColor != Configuration.Settings.General.SubtitleTextBoxAssColor.ToArgb().ToString()) - { - textBoxListViewText.Initialize(Configuration.Settings.General.SubtitleTextBoxSyntaxColor); - textBoxListViewTextAlternate.Initialize(Configuration.Settings.General.SubtitleTextBoxSyntaxColor); - RefreshSelectedParagraph(); - } - textBoxListViewText.BackColor = !IsSubtitleLoaded ? SystemColors.ActiveBorder : SystemColors.WindowFrame; - textBoxListViewTextAlternate.BackColor = !IsSubtitleLoaded ? SystemColors.ActiveBorder : SystemColors.WindowFrame; - - SubtitleListview1.SyntaxColorAllLines(_subtitle); - mediaPlayer.LastParagraph = null; - Application.DoEvents(); - UiUtil.ShowSubtitle(_subtitle, mediaPlayer); - mediaPlayer.VideoPlayerContainerResize(null, null); - ShowLineInformationListView(); - ShowSourceLineNumber(); - } - - private void SetAudioVisualizerSettings() - { - audioVisualizer.ShowGridLines = Configuration.Settings.VideoControls.WaveformDrawGrid; - audioVisualizer.GridColor = Configuration.Settings.VideoControls.WaveformGridColor; - audioVisualizer.SelectedColor = Configuration.Settings.VideoControls.WaveformSelectedColor; - audioVisualizer.Color = Configuration.Settings.VideoControls.WaveformColor; - audioVisualizer.BackgroundColor = Configuration.Settings.VideoControls.WaveformBackgroundColor; - audioVisualizer.TextColor = Configuration.Settings.VideoControls.WaveformTextColor; - audioVisualizer.CursorColor = Configuration.Settings.VideoControls.WaveformCursorColor; - audioVisualizer.ChaptersColor = Configuration.Settings.VideoControls.WaveformChaptersColor; - audioVisualizer.TextSize = Configuration.Settings.VideoControls.WaveformTextSize; - audioVisualizer.TextBold = Configuration.Settings.VideoControls.WaveformTextBold; - audioVisualizer.MouseWheelScrollUpIsForward = Configuration.Settings.VideoControls.WaveformMouseWheelScrollUpIsForward; - audioVisualizer.AllowOverlap = Configuration.Settings.VideoControls.WaveformAllowOverlap; - audioVisualizer.ClosenessForBorderSelection = Configuration.Settings.VideoControls.WaveformBorderHitMs; - } - - private void CheckAndGetNewlyDownloadedMpvDlls(string message) - { - if (Configuration.Settings.General.VideoPlayer != "MPV") - { - return; - } - - var newMpvFiles = Directory.GetFiles(Configuration.DataDirectory, "*.dll.new-mpv"); - if (newMpvFiles.Length <= 0) - { - return; - } - - if (mediaPlayer != null && mediaPlayer.VideoPlayer != null) - { - var mpv = mediaPlayer.VideoPlayer as LibMpvDynamic; - mediaPlayer.VideoPlayer = null; - mpv?.HardDispose(); - } - - foreach (string newDllFileName in newMpvFiles) - { - if (File.Exists(newDllFileName)) // dll was in use, so unload + copy new dll + load - { - try - { - string targetFileName = newDllFileName.Replace(".dll.new-mpv", ".dll"); - File.Copy(newDllFileName, targetFileName, true); - File.Delete(newDllFileName); - ShowStatus("libmpv updated"); - } - catch - { - // ignore - } - } - } - - if (!string.IsNullOrEmpty(message)) - { - MessageBox.Show(message); - } - } - - private void AddAlternate() - { - buttonUnBreak.Visible = false; - buttonAutoBreak.Visible = false; - buttonSplitLine.Visible = false; - textBoxListViewTextAlternate.Visible = true; - labelAlternateText.Visible = true; - labelAlternateCharactersPerSecond.Visible = true; - labelTextAlternateLineLengths.Visible = true; - labelAlternateSingleLine.Visible = true; - labelAlternateSingleLinePixels.Visible = true; - labelTextAlternateLineTotal.Visible = true; - } - - private int ShowSubtitle() - { - if (_splitDualSami) - { - return UiUtil.ShowSubtitle(_subtitle, _subtitleAlternate, mediaPlayer); - } - - if (SubtitleListview1.IsAlternateTextColumnVisible && Configuration.Settings.General.ShowOriginalAsPreviewIfAvailable) - { - return UiUtil.ShowSubtitle(_subtitleAlternate, mediaPlayer); - } - - return UiUtil.ShowSubtitle(_subtitle, mediaPlayer); - } - - private static void TryLoadIcon(ToolStripButton button, string iconName) - { - string fullPath = Configuration.IconsDirectory + iconName + ".png"; - if (File.Exists(fullPath)) - { - button.Image = new Bitmap(fullPath); - } - } - - private void InitializeToolbar() - { - var gs = Configuration.Settings.General; - - TryLoadIcon(toolStripButtonFileNew, "New"); - TryLoadIcon(toolStripButtonFileOpen, "Open"); - TryLoadIcon(toolStripButtonSave, "Save"); - TryLoadIcon(toolStripButtonSaveAs, "SaveAs"); - TryLoadIcon(toolStripButtonFind, "Find"); - TryLoadIcon(toolStripButtonReplace, "Replace"); - TryLoadIcon(toolStripButtonFixCommonErrors, "FixCommonErrors"); - TryLoadIcon(toolStripButtonRemoveTextForHi, "RemoveTextForHi"); - TryLoadIcon(toolStripButtonVisualSync, "VisualSync"); - TryLoadIcon(toolStripButtonSpellCheck, "SpellCheck"); - TryLoadIcon(toolStripButtonNetflixQualityCheck, "NetflixGlyphCheck"); - TryLoadIcon(toolStripButtonSettings, "Settings"); - TryLoadIcon(toolStripButtonHelp, "Help"); - - TryLoadIcon(toolStripButtonToggleWaveform, "WaveformToggle"); - TryLoadIcon(toolStripButtonToggleVideo, "VideoToggle"); - - toolStripButtonFileNew.Visible = gs.ShowToolbarNew; - toolStripButtonFileOpen.Visible = gs.ShowToolbarOpen; - toolStripButtonSave.Visible = gs.ShowToolbarSave; - toolStripButtonSaveAs.Visible = gs.ShowToolbarSaveAs; - toolStripButtonFind.Visible = gs.ShowToolbarFind; - toolStripButtonReplace.Visible = gs.ShowToolbarReplace; - toolStripButtonFixCommonErrors.Visible = gs.ShowToolbarFixCommonErrors; - toolStripButtonRemoveTextForHi.Visible = gs.ShowToolbarRemoveTextForHi; - - toolStripButtonVisualSync.Visible = gs.ShowToolbarVisualSync; - toolStripButtonSpellCheck.Visible = gs.ShowToolbarSpellCheck; - toolStripButtonNetflixQualityCheck.Visible = gs.ShowToolbarNetflixGlyphCheck; - toolStripButtonSettings.Visible = gs.ShowToolbarSettings; - toolStripButtonHelp.Visible = gs.ShowToolbarHelp; - - toolStripSeparatorFrameRate.Visible = gs.ShowFrameRate; - toolStripLabelFrameRate.Visible = gs.ShowFrameRate; - toolStripComboBoxFrameRate.Visible = gs.ShowFrameRate; - toolStripButtonGetFrameRate.Visible = gs.ShowFrameRate; - - toolStripSeparatorFindReplace.Visible = gs.ShowToolbarFind || gs.ShowToolbarReplace; - toolStripSeparatorFixSyncSpell.Visible = gs.ShowToolbarFixCommonErrors || gs.ShowToolbarVisualSync || gs.ShowToolbarSpellCheck || gs.ShowToolbarSettings; - toolStripSeparatorHelp.Visible = gs.ShowToolbarHelp; - - toolStrip1.Visible = gs.ShowToolbarNew || gs.ShowToolbarOpen || gs.ShowToolbarSave || gs.ShowToolbarSaveAs || gs.ShowToolbarFind || gs.ShowToolbarReplace || - gs.ShowToolbarFixCommonErrors || gs.ShowToolbarVisualSync || gs.ShowToolbarSpellCheck || gs.ShowToolbarNetflixGlyphCheck || - gs.ShowToolbarSettings || gs.ShowToolbarHelp; - - UpdateNetflixGlyphCheckToolsVisibility(); - } - - private void ToolStripButtonFileNewClick(object sender, EventArgs e) - { - _lastDoNotPrompt = -1; - ReloadFromSourceView(); - FileNew(); - ShowHideTextBasedFeatures(GetCurrentSubtitleFormat()); - } - - private void ToolStripButtonFileOpenClick(object sender, EventArgs e) - { - toolStripButtonFileOpen.Enabled = false; - ReloadFromSourceView(); - OpenNewFile(); - toolStripButtonFileOpen.Enabled = true; - } - - private void ToolStripButtonSaveClick(object sender, EventArgs e) - { - var useOnly0AForNewLine = ModifierKeys == (Keys.Control | Keys.Shift); - SaveAll(useOnly0AForNewLine); - } - - private void SaveAll(bool useOnly0AForNewLine = false) - { - if (!IsSubtitleLoaded) - { - return; - } - - ReloadFromSourceView(); - _disableShowStatus = true; - _saveAsCalled = false; - var result = SaveSubtitle(GetCurrentSubtitleFormat(), useOnly0AForNewLine); - if (result != DialogResult.OK) - { - _disableShowStatus = false; - return; - } - - if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate.Paragraphs.Count > 0) - { - SaveOriginalToolStripMenuItemClick(null, null); - _disableShowStatus = false; - ShowStatus(string.Format(_language.SavedSubtitleX, Path.GetFileName(_fileName)) + " + " + - string.Format(_language.SavedOriginalSubtitleX, Path.GetFileName(_subtitleAlternateFileName))); - return; - } - - _disableShowStatus = false; - ShowStatus(string.Format(_language.SavedSubtitleX, Path.GetFileName(_fileName))); - - if (Configuration.Settings.General.ShowNegativeDurationInfoOnSave) - { - var sb = new StringBuilder(); - for (var index = 0; index < _subtitle.Paragraphs.Count; index++) - { - var p = _subtitle.Paragraphs[index]; - if (p.Duration.TotalMilliseconds < 0) - { - if (sb.Length < 20) - { - if (sb.Length > 0) - { - sb.Append(", "); - } - sb.Append((index + 1).ToString(CultureInfo.InvariantCulture)); - } - else - { - sb.Append("..."); - break; - } - } - } - - if (sb.Length > 0) - { - using (var form = new DialogDoNotShowAgain(Title, string.Format(_language.SubtitleContainsNegativeDurationsX, sb.ToString()))) - { - form.ShowDialog(this); - Configuration.Settings.General.ShowNegativeDurationInfoOnSave = !form.DoNoDisplayAgain; - } - } - } - } - - private void ToolStripButtonSaveAsClick(object sender, EventArgs e) - { - ReloadFromSourceView(); - FileSaveAs(true); - } - - private void ToolStripButtonFindClick(object sender, EventArgs e) - { - ReloadFromSourceView(); - Find(); - } - - private void ToolStripButtonVisualSyncClick(object sender, EventArgs e) - { - ReloadFromSourceView(); - ShowVisualSync(false); - } - - private void ToolStripButtonSettingsClick(object sender, EventArgs e) - { - ReloadFromSourceView(); - ShowSettings(); - } - - private void TextBoxSourceClick(object sender, EventArgs e) - { - ShowSourceLineNumber(); - } - - private void TextBoxSourceKeyDown(object sender, KeyEventArgs e) - { - ShowSourceLineNumber(); - if (e.Modifiers == Keys.Control && e.KeyCode == Keys.A) - { - textBoxSource.SelectAll(); - e.SuppressKeyPress = true; - } - - if (e.Modifiers == Keys.Control && e.KeyCode == Keys.D) - { - textBoxSource.SelectionLength = 0; - e.SuppressKeyPress = true; - } - } - - private void textBoxSource_KeyUp(object sender, KeyEventArgs e) - { - ShowSourceLineNumber(); - } - - private void TextBoxSourceTextChanged(object sender, EventArgs e) - { - ShowSourceLineNumber(); - _sourceViewChange = true; - labelStatus.Text = string.Empty; - } - - private bool ShowProfileInStatusBar => Configuration.Settings.General.CurrentProfile != "Default"; - - private void ShowSourceLineNumber() - { - if (tabControlSubtitle.SelectedIndex == TabControlSourceView) - { - var profile = Configuration.Settings.General.CurrentProfile + " "; - if (!ShowProfileInStatusBar) - { - profile = string.Empty; - } - - toolStripSelected.Text = profile + string.Format(_language.LineNumberX, textBoxSource.GetLineFromCharIndex(textBoxSource.SelectionStart) + 1); - } - } - - private void ButtonGetFrameRateClick(object sender, EventArgs e) - { - openFileDialog1.Title = _language.OpenVideoFile; - openFileDialog1.FileName = string.Empty; - openFileDialog1.Filter = Utilities.GetVideoFileFilter(false); - if (openFileDialog1.ShowDialog(this) == DialogResult.OK) - { - VideoFileName = openFileDialog1.FileName; - var info = UiUtil.GetVideoInfo(openFileDialog1.FileName); - if (info != null && info.Success) - { - string oldFrameRate = toolStripComboBoxFrameRate.Text; - toolStripComboBoxFrameRate.Text = string.Format("{0:0.###}", info.FramesPerSecond); - - if (oldFrameRate != toolStripComboBoxFrameRate.Text) - { - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - } - } - } - } - - private void FindToolStripMenuItemClick(object sender, EventArgs e) - { - ReloadFromSourceView(); - Find(); - } - - private void Find() - { - string selectedText; - if (tabControlSubtitle.SelectedIndex == TabControlSourceView) - { - selectedText = textBoxSource.SelectedText; - } - else - { - if (textBoxListViewTextAlternate.Focused) - { - selectedText = textBoxListViewTextAlternate.SelectedText; - } - else - { - selectedText = textBoxListViewText.SelectedText; - } - } - - if (selectedText.Length == 0 && _findHelper != null) - { - if (_clearLastFind) - { - _clearLastFind = false; - _findHelper.FindReplaceType.FindType = _clearLastFindType; - selectedText = _clearLastFindText; - } - else - { - selectedText = _findHelper.FindText; - } - } - - using (var findDialog = new FindDialog(_subtitle)) - { - findDialog.SetIcon(toolStripButtonFind.Image as Bitmap); - findDialog.Initialize(selectedText, _findHelper); - if (findDialog.ShowDialog(this) != DialogResult.OK) - { - if (_findHelper != null) - { - _findHelper.InProgress = false; - } - - return; - } - - _findHelper = findDialog.GetFindDialogHelper(_subtitleListViewIndex); - _findHelper.InProgress = true; - if (!string.IsNullOrWhiteSpace(_findHelper.FindText)) - { - if (Configuration.Settings.Tools.FindHistory.Count == 0 || Configuration.Settings.Tools.FindHistory[0] != _findHelper.FindText) - { - Configuration.Settings.Tools.FindHistory.Insert(0, _findHelper.FindText); - } - } - - ShowStatus(string.Format(_language.SearchingForXFromLineY, _findHelper.FindText, _subtitleListViewIndex + 1)); - if (tabControlSubtitle.SelectedIndex == TabControlListView) - { - var tb = GetFindReplaceTextBox(); - int startPos = tb.SelectedText.Length > 0 ? tb.SelectionStart + 1 : tb.SelectionStart; - bool found = _findHelper.Find(_subtitle, _subtitleAlternate, _subtitleListViewIndex, startPos); - tb = GetFindReplaceTextBox(); - //if we fail to find the text, we might want to start searching from the top of the file. - if (!found && _findHelper.StartLineIndex >= 1) - { - if (MessageBox.Show(_language.FindContinue, _language.FindContinueTitle, MessageBoxButtons.YesNoCancel) == DialogResult.Yes) - { - found = _findHelper.Find(_subtitle, _subtitleAlternate, -1); - } - } - - if (found) - { - SubtitleListview1.SelectIndexAndEnsureVisible(_findHelper.SelectedIndex, true); - tb.Focus(); - tb.SelectionStart = _findHelper.SelectedPosition; - tb.SelectionLength = _findHelper.FindTextLength; - ShowStatus(string.Format(_language.XFoundAtLineNumberY, _findHelper.FindText, _findHelper.SelectedIndex + 1)); - _findHelper.SelectedPosition++; - } - else - { - ShowStatus(string.Format(_language.XNotFound, _findHelper.FindText)); - } - } - else if (tabControlSubtitle.SelectedIndex == TabControlSourceView) - { - if (_findHelper.Find(textBoxSource, textBoxSource.SelectionStart)) - { - textBoxSource.SelectionStart = _findHelper.SelectedIndex; - textBoxSource.SelectionLength = _findHelper.FindTextLength; - textBoxSource.ScrollToCaret(); - ShowStatus(string.Format(_language.XFoundAtLineNumberY, _findHelper.FindText, textBoxSource.GetLineFromCharIndex(textBoxSource.SelectionStart))); - } - else - { - ShowStatus(string.Format(_language.XNotFound, _findHelper.FindText)); - } - } - } - - if (_findHelper != null) - { - _findHelper.InProgress = false; - } - } - - private void FindNextToolStripMenuItemClick(object sender, EventArgs e) - { - ReloadFromSourceView(); - FindNext(); - } - - private SETextBox GetFindReplaceTextBox() - { - return _findHelper.MatchInOriginal ? textBoxListViewTextAlternate : textBoxListViewText; - } - - private void FindNext() - { - if (_findHelper != null) - { - _findHelper.InProgress = true; - var tb = GetFindReplaceTextBox(); - if (tabControlSubtitle.SelectedIndex == TabControlListView) - { - int selectedIndex = -1; - if (SubtitleListview1.SelectedItems.Count > 0) - { - selectedIndex = SubtitleListview1.SelectedItems[0].Index; - } - - int textBoxStart = tb.SelectionStart; - if (_findHelper.SelectedPosition - 1 == tb.SelectionStart && tb.SelectionLength > 0 || - _findHelper.FindText.Equals(tb.SelectedText, StringComparison.OrdinalIgnoreCase)) - { - textBoxStart = tb.SelectionStart + 1; - } - - if (_findHelper.FindNext(_subtitle, _subtitleAlternate, selectedIndex, textBoxStart, Configuration.Settings.General.AllowEditOfOriginalSubtitle)) - { - tb = GetFindReplaceTextBox(); - SubtitleListview1.SelectIndexAndEnsureVisible(_findHelper.SelectedIndex, true); - ShowStatus(string.Format(_language.XFoundAtLineNumberY, _findHelper.FindText, _findHelper.SelectedIndex + 1)); - tb.Focus(); - tb.SelectionStart = _findHelper.SelectedPosition; - tb.SelectionLength = _findHelper.FindTextLength; - _findHelper.SelectedPosition++; - } - else - { - if (_findHelper.StartLineIndex >= 1) - { - if (MessageBox.Show(_language.FindContinue, _language.FindContinueTitle, MessageBoxButtons.YesNoCancel) == DialogResult.Yes) - { - _findHelper.StartLineIndex = 0; - if (_findHelper.Find(_subtitle, _subtitleAlternate, 0)) - { - SubtitleListview1.SelectIndexAndEnsureVisible(_findHelper.SelectedIndex, true); - tb.Focus(); - tb.SelectionStart = _findHelper.SelectedPosition; - tb.SelectionLength = _findHelper.FindTextLength; - ShowStatus(string.Format(_language.XFoundAtLineNumberY, _findHelper.FindText, _findHelper.SelectedIndex + 1)); - _findHelper.SelectedPosition++; - return; - } - } - } - - ShowStatus(string.Format(_language.XNotFound, _findHelper.FindText)); - } - } - else if (tabControlSubtitle.SelectedIndex == TabControlSourceView) - { - if (_findHelper.FindNext(textBoxSource.Text, textBoxSource.SelectionStart)) - { - textBoxSource.SelectionStart = _findHelper.SelectedIndex; - textBoxSource.SelectionLength = _findHelper.FindTextLength; - textBoxSource.ScrollToCaret(); - ShowStatus(string.Format(_language.XFoundAtLineNumberY, _findHelper.FindText, textBoxSource.GetLineFromCharIndex(textBoxSource.SelectionStart))); - } - else - { - ShowStatus(string.Format(_language.XNotFound, _findHelper.FindText)); - } - } - } - else - { - Find(); - } - - if (_findHelper != null) - { - _findHelper.InProgress = false; - } - } - - private void FindPrevious() - { - if (_findHelper == null) - { - return; - } - - _findHelper.InProgress = true; - var tb = GetFindReplaceTextBox(); - if (tabControlSubtitle.SelectedIndex == TabControlListView) - { - int selectedIndex = -1; - if (SubtitleListview1.SelectedItems.Count > 0) - { - selectedIndex = SubtitleListview1.SelectedItems[0].Index; - } - - int textBoxStart = tb.SelectionStart; - if (_findHelper.SelectedPosition - 1 == tb.SelectionStart && tb.SelectionLength > 0 || - _findHelper.FindText.Equals(tb.SelectedText, StringComparison.OrdinalIgnoreCase)) - { - textBoxStart = tb.SelectionStart - 1; - } - - if (_findHelper.FindPrevious(_subtitle, _subtitleAlternate, selectedIndex, textBoxStart, Configuration.Settings.General.AllowEditOfOriginalSubtitle)) - { - tb = GetFindReplaceTextBox(); - SubtitleListview1.SelectIndexAndEnsureVisible(_findHelper.SelectedIndex, true); - ShowStatus(string.Format(_language.XFoundAtLineNumberY, _findHelper.FindText, _findHelper.SelectedIndex + 1)); - tb.Focus(); - tb.SelectionStart = _findHelper.SelectedPosition; - tb.SelectionLength = _findHelper.FindTextLength; - _findHelper.SelectedPosition--; - } - else - { - ShowStatus(string.Format(_language.XNotFound, _findHelper.FindText)); - } - } - else if (tabControlSubtitle.SelectedIndex == TabControlSourceView) - { - if (_findHelper.FindPrevious(textBoxSource.Text, textBoxSource.SelectionStart)) - { - textBoxSource.SelectionStart = _findHelper.SelectedIndex; - textBoxSource.SelectionLength = _findHelper.FindTextLength; - textBoxSource.ScrollToCaret(); - ShowStatus(string.Format(_language.XFoundAtLineNumberY, _findHelper.FindText, textBoxSource.GetLineFromCharIndex(textBoxSource.SelectionStart))); - } - else - { - ShowStatus(string.Format(_language.XNotFound, _findHelper.FindText)); - } - } - - _findHelper.InProgress = false; - } - - private void ToolStripButtonReplaceClick(object sender, EventArgs e) - { - ReloadFromSourceView(); - Replace(null); - } - - private void ReplaceToolStripMenuItemClick(object sender, EventArgs e) - { - ReloadFromSourceView(); - Replace(null); - } - - private void ReplaceSourceView(ReplaceDialog replaceDialog) - { - bool isFirst = true; - string selectedText = textBoxSource.SelectedText; - if (selectedText.Length == 0 && _findHelper != null) - { - selectedText = _findHelper.FindText; - } - - if (replaceDialog == null) - { - replaceDialog = new ReplaceDialog(); - replaceDialog.SetIcon(toolStripButtonReplace.Image as Bitmap); - _findHelper = _findHelper ?? replaceDialog.GetFindDialogHelper(_subtitleListViewIndex); - } - else - { - isFirst = false; - } - - replaceDialog.Initialize(selectedText, _findHelper); - if (replaceDialog.ShowDialog(this) == DialogResult.OK) - { - _findHelper = replaceDialog.GetFindDialogHelper(_subtitleListViewIndex); - ShowStatus(string.Format(_language.SearchingForXFromLineY, _findHelper.FindText, _subtitleListViewIndex + 1)); - if (replaceDialog.ReplaceAll) - { - SourceListReplaceAll(replaceDialog, _findHelper); - return; - } - - int replaceCount = 0; - var searchStringFound = false; - int start = textBoxSource.SelectionStart; - if (isFirst) - { - MakeHistoryForUndo(string.Format(_language.BeforeReplace, _findHelper.FindText)); - _makeHistoryPaused = true; - if (start >= 0) - { - start--; - } - } - else - { - if (textBoxSource.SelectionLength > 0 && start > 0 && !replaceDialog.FindOnly) - { - start--; - } - } - - if (_findHelper.FindNext(textBoxSource.Text, start)) - { - textBoxSource.SelectionStart = _findHelper.SelectedIndex; - textBoxSource.SelectionLength = _findHelper.FindTextLength; - if (!replaceDialog.FindOnly) - { - textBoxSource.SelectedText = _findHelper.ReplaceText; - } - - textBoxSource.ScrollToCaret(); - - replaceCount++; - searchStringFound = true; - - if (!replaceDialog.FindOnly) - { - if (_findHelper.FindNext(textBoxSource.Text, start)) - { - textBoxSource.SelectionStart = _findHelper.SelectedIndex; - textBoxSource.SelectionLength = _findHelper.FindTextLength; - textBoxSource.ScrollToCaret(); - } - - Replace(replaceDialog); - return; - } - } - - if (replaceDialog.FindOnly) - { - if (searchStringFound) - { - ShowStatus(string.Format(_language.MatchFoundX, _findHelper.FindText)); - } - else - { - ShowStatus(string.Format(_language.NoMatchFoundX, _findHelper.FindText)); - } - - Replace(replaceDialog); - return; - } - - ReloadFromSourceView(); - if (replaceCount == 0) - { - ShowStatus(_language.FoundNothingToReplace); - } - else - { - ShowStatus(string.Format(_language.ReplaceCountX, replaceCount)); - } - } - - if (_makeHistoryPaused) - { - RestartHistory(); - } - - replaceDialog.Dispose(); - } - - private void SourceListReplaceAll(ReplaceDialog replaceDialog, FindReplaceDialogHelper findHelper) - { - if (_findHelper.FindReplaceType.FindType == FindType.RegEx) - { - SourceListReplaceAllRegEx(replaceDialog); - return; - } - - int replaceCount = 0; - bool searchStringFound = true; - int start = textBoxSource.SelectionStart; - bool isFirst = true; - string text = textBoxSource.Text; - while (searchStringFound) - { - searchStringFound = false; - if (isFirst) - { - MakeHistoryForUndo(string.Format(_language.BeforeReplace, _findHelper.FindText)); - isFirst = false; - _makeHistoryPaused = true; - if (start >= 0) - { - start--; - } - } - else - { - start--; - } - - if (_findHelper.FindNext(text, start)) - { - text = text.Remove(findHelper.SelectedIndex, findHelper.FindTextLength).Insert(findHelper.SelectedIndex, findHelper.ReplaceText); - start = findHelper.SelectedIndex + findHelper.FindTextLength; - replaceCount++; - searchStringFound = true; - } - } - - textBoxSource.Text = text; - ReloadFromSourceView(); - if (replaceCount == 0) - { - ShowStatus(_language.FoundNothingToReplace); - } - else - { - ShowStatus(string.Format(_language.ReplaceCountX, replaceCount)); - } - - if (_makeHistoryPaused) - { - RestartHistory(); - } - - replaceDialog.Dispose(); - } - - private void SourceListReplaceAllRegEx(ReplaceDialog replaceDialog) - { - var start = textBoxSource.SelectionStart; - var s = textBoxSource.Text; - var r = new Regex(_findHelper.FindText, RegexOptions.Multiline); - var matches = r.Matches(s, start); - - if (matches.Count > 0) - { - MakeHistoryForUndo(string.Format(_language.BeforeReplace, _findHelper.FindText)); - } - - var result = RegexUtils.ReplaceNewLineSafe(r, s, _findHelper.ReplaceText, int.MaxValue, start); - - // update UI - textBoxSource.Text = result; - ShowStatus(matches.Count == 0 ? _language.FoundNothingToReplace : string.Format(_language.ReplaceCountX, matches.Count)); - - // replace again from beginning - if (start > 1) - { - string msgText = _language.ReplaceContinueNotFound; - if (matches.Count > 0) - { - msgText = string.Format(_language.ReplaceXContinue, matches.Count); - } - - if (MessageBox.Show(msgText, _language.ReplaceContinueTitle, MessageBoxButtons.YesNoCancel) == DialogResult.Yes) - { - s = result.Substring(0, start - 1); - var rest = result.Remove(0, start - 1); - if (s.EndsWith('\r') && rest.StartsWith('\n')) - { // don't split "\r\n" - s = s.Substring(0, s.Length - 1); - rest = '\r' + rest; - } - - matches = r.Matches(s); - result = RegexUtils.ReplaceNewLineSafe(r, s, _findHelper.ReplaceText); - - // update UI - textBoxSource.Text = result + rest; - ShowStatus(matches.Count == 0 ? _language.FoundNothingToReplace : string.Format(_language.ReplaceCountX, matches.Count)); - } - } - - replaceDialog.Dispose(); - ReloadFromSourceView(); - } - - private void ReplaceListView(ReplaceDialog replaceDialog) - { - SaveSubtitleListviewIndices(); - int firstIndex = FirstSelectedIndex; - bool isFirst = true; - string selectedText; - if (textBoxListViewTextAlternate.Focused) - { - selectedText = textBoxListViewTextAlternate.SelectedText; - } - else - { - selectedText = textBoxListViewText.SelectedText; - } - - if (selectedText.Length == 0 && _findHelper != null) - { - selectedText = _findHelper.FindText; - } - - if (replaceDialog == null) - { - replaceDialog = new ReplaceDialog(); - replaceDialog.SetIcon(toolStripButtonReplace.Image as Bitmap); - _findHelper = _findHelper ?? replaceDialog.GetFindDialogHelper(_subtitleListViewIndex); - _findHelper.InProgress = true; - int index = 0; - - if (SubtitleListview1.SelectedItems.Count > 0) - { - index = SubtitleListview1.SelectedItems[0].Index; - } - - _findHelper.SelectedIndex = index; - if (textBoxListViewTextAlternate.Focused) - { - _findHelper.SelectedPosition = textBoxListViewTextAlternate.SelectionStart; - _findHelper.ReplaceFromPosition = _findHelper.SelectedPosition; - } - else - { - _findHelper.SelectedPosition = textBoxListViewText.SelectionStart; - _findHelper.ReplaceFromPosition = _findHelper.SelectedPosition; - } - - _replaceStartLineIndex = index; - } - else - { - isFirst = false; - if (_findHelper != null) - { - selectedText = _findHelper.FindText; - _findHelper.InProgress = true; - } - - } - - replaceDialog.Initialize(selectedText, _findHelper); - if (replaceDialog.ShowDialog(this) == DialogResult.OK) - { - if (_findHelper == null) - { - _findHelper = replaceDialog.GetFindDialogHelper(_subtitleListViewIndex); - _findHelper.InProgress = true; - } - else - { - int line = _findHelper.SelectedIndex; - int pos = _findHelper.ReplaceFromPosition; - bool success = _findHelper.Success; - var matchInOriginal = _findHelper.MatchInOriginal; - _findHelper = replaceDialog.GetFindDialogHelper(_subtitleListViewIndex); - _findHelper.SelectedIndex = line; - _findHelper.SelectedPosition = pos; - _findHelper.Success = success; - _findHelper.MatchInOriginal = matchInOriginal; - _findHelper.InProgress = true; - } - - ShowStatus(string.Format(_language.SearchingForXFromLineY, _findHelper.FindText, _subtitleListViewIndex + 1)); - int replaceCount = 0; - bool searchStringFound = true; - int stopAtIndex = int.MaxValue; - while (searchStringFound) - { - searchStringFound = false; - if (isFirst) - { - MakeHistoryForUndo(string.Format(_language.BeforeReplace, _findHelper.FindText)); - isFirst = false; - _makeHistoryPaused = true; - } - - if (replaceDialog.ReplaceAll) - { - if (_findHelper.FindNext(_subtitle, _subtitleAlternate, _findHelper.SelectedIndex, _findHelper.SelectedPosition, Configuration.Settings.General.AllowEditOfOriginalSubtitle)) - { - if (_findHelper.SelectedIndex > stopAtIndex) - { - break; - } - - SetTextForFindAndReplace(true, replaceDialog.ReplaceAll); - searchStringFound = true; - replaceCount++; - } - else - { - textBoxListViewText.Visible = true; - _subtitleListViewIndex = -1; - if (firstIndex >= 0 && firstIndex < SubtitleListview1.Items.Count) - { - SubtitleListview1.Items[firstIndex].Selected = true; - SubtitleListview1.Items[firstIndex].Focused = true; - SubtitleListview1.Focus(); - textBoxListViewText.Text = _subtitle.Paragraphs[firstIndex].Text; - if (_subtitleAlternate != null && textBoxListViewTextAlternate.Visible) - { - var orginial = Utilities.GetOriginalParagraph(_findHelper.SelectedIndex, _subtitle.Paragraphs[_findHelper.SelectedIndex], _subtitleAlternate.Paragraphs); - if (orginial != null) - { - textBoxListViewTextAlternate.Text = orginial.Text; - } - } - } - else - { - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - } - - ShowStatus(string.Format(_language.NoMatchFoundX, _findHelper.FindText)); - - if (_replaceStartLineIndex >= 1) // Prompt for start over - { - _replaceStartLineIndex = 0; - string msgText = _language.ReplaceContinueNotFound; - if (replaceCount > 0) - { - msgText = string.Format(_language.ReplaceXContinue, replaceCount); - } - - if (MessageBox.Show(msgText, _language.ReplaceContinueTitle, MessageBoxButtons.YesNoCancel) == DialogResult.Yes) - { - stopAtIndex = firstIndex; - _findHelper.MatchInOriginal = false; - _findHelper.StartLineIndex = 0; - _findHelper.SelectedIndex = 0; - _findHelper.SelectedPosition = 0; - _findHelper.ReplaceFromPosition = 0; - SetTextForFindAndReplace(false, replaceDialog.ReplaceAll); - - if (_findHelper.FindNext(_subtitle, _subtitleAlternate, _findHelper.SelectedIndex, _findHelper.SelectedPosition, Configuration.Settings.General.AllowEditOfOriginalSubtitle)) - { - SetTextForFindAndReplace(true, replaceDialog.ReplaceAll); - _findHelper.SelectedPosition += _findHelper.ReplaceText.Length; - _findHelper.ReplaceFromPosition = _findHelper.SelectedPosition; - searchStringFound = true; - replaceCount++; - } - } - } - } - } - else if (replaceDialog.FindOnly) - { - if (_findHelper.FindNext(_subtitle, _subtitleAlternate, _findHelper.SelectedIndex, _findHelper.SelectedPosition, Configuration.Settings.General.AllowEditOfOriginalSubtitle)) - { - var tb = GetFindReplaceTextBox(); - SubtitleListview1.SelectIndexAndEnsureVisible(_findHelper.SelectedIndex, true); - tb.Focus(); - tb.SelectionStart = _findHelper.SelectedPosition; - tb.SelectionLength = _findHelper.FindTextLength; - _findHelper.ReplaceFromPosition = _findHelper.SelectedPosition; - _findHelper.SelectedPosition += _findHelper.FindTextLength; - ShowStatus(string.Format(_language.NoXFoundAtLineY, _findHelper.SelectedIndex + 1, _findHelper.FindText)); - Replace(replaceDialog); - if (replaceDialog != null && !replaceDialog.IsDisposed) - { - replaceDialog.Dispose(); - } - - _findHelper.InProgress = false; - return; - } - - if (_replaceStartLineIndex >= 1) // Prompt for start over - { - _replaceStartLineIndex = 0; - if (MessageBox.Show(_language.FindContinue, _language.FindContinueTitle, MessageBoxButtons.YesNoCancel) == DialogResult.Yes) - { - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - _findHelper.StartLineIndex = 0; - _findHelper.SelectedIndex = 0; - _findHelper.SelectedPosition = 0; - _findHelper.ReplaceFromPosition = 0; - if (_findHelper.FindNext(_subtitle, _subtitleAlternate, _findHelper.SelectedIndex, _findHelper.SelectedPosition, Configuration.Settings.General.AllowEditOfOriginalSubtitle)) - { - var tb = GetFindReplaceTextBox(); - SubtitleListview1.SelectIndexAndEnsureVisible(_findHelper.SelectedIndex, true); - tb.Focus(); - tb.SelectionStart = _findHelper.SelectedPosition; - tb.SelectionLength = _findHelper.FindTextLength; - _findHelper.ReplaceFromPosition = _findHelper.SelectedPosition; - _findHelper.SelectedPosition += _findHelper.FindTextLength; - ShowStatus(string.Format(_language.NoXFoundAtLineY, _findHelper.SelectedIndex + 1, _findHelper.FindText)); - Replace(replaceDialog); - if (replaceDialog != null) - { - replaceDialog.Dispose(); - } - - _findHelper.InProgress = false; - return; - } - } - else - { - if (replaceDialog != null && !replaceDialog.IsDisposed) - { - replaceDialog.Dispose(); - } - - _findHelper.InProgress = false; - return; - } - } - - ShowStatus(string.Format(_language.NoMatchFoundX, _findHelper.FindText)); - } - else if (!replaceDialog.FindOnly) // replace once only - { - var tb = GetFindReplaceTextBox(); - string msg = string.Empty; - if (_findHelper.FindReplaceType.FindType == FindType.RegEx) - { - if (_findHelper.Success) - { - if (_findHelper.FindReplaceType.FindType == FindType.RegEx) - { - ReplaceViaRegularExpression(tb, replaceDialog.ReplaceAll); - } - else - { - tb.SelectedText = _findHelper.ReplaceText; - } - - msg = _language.OneReplacementMade + " "; - } - } - else if (tb.SelectionLength == _findHelper.FindTextLength) - { - tb.SelectedText = _findHelper.ReplaceText; - msg = _language.OneReplacementMade + " "; - _findHelper.SelectedPosition += _findHelper.ReplaceText.Length; - } - - if (_findHelper.FindNext(_subtitle, _subtitleAlternate, _findHelper.SelectedIndex, _findHelper.SelectedPosition, Configuration.Settings.General.AllowEditOfOriginalSubtitle)) - { - SubtitleListview1.SelectIndexAndEnsureVisible(_findHelper.SelectedIndex, true); - tb = GetFindReplaceTextBox(); - tb.Focus(); - tb.SelectionStart = _findHelper.SelectedPosition; - tb.SelectionLength = _findHelper.FindTextLength; - if (_findHelper.FindReplaceType.FindType != FindType.RegEx) - { - _findHelper.SelectedPosition += _findHelper.ReplaceText.Length; - } - - ShowStatus(string.Format(msg + _language.XFoundAtLineNumberY, _findHelper.FindText, _findHelper.SelectedIndex + 1)); - } - else - { - ShowStatus(msg + string.Format(_language.XNotFound, _findHelper.FindText)); - - // Prompt for start over - if (_replaceStartLineIndex >= 1) - { - _replaceStartLineIndex = 0; - if (MessageBox.Show(_language.FindContinue, _language.FindContinueTitle, MessageBoxButtons.YesNoCancel) == DialogResult.Yes) - { - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - _findHelper.StartLineIndex = 0; - _findHelper.SelectedIndex = 0; - _findHelper.SelectedPosition = 0; - _findHelper.ReplaceFromPosition = 0; - if (_findHelper.FindNext(_subtitle, _subtitleAlternate, _findHelper.SelectedIndex, _findHelper.SelectedPosition, Configuration.Settings.General.AllowEditOfOriginalSubtitle)) - { - SubtitleListview1.SelectIndexAndEnsureVisible(_findHelper.SelectedIndex, true); - tb = GetFindReplaceTextBox(); - tb.Focus(); - tb.SelectionStart = _findHelper.SelectedPosition; - tb.SelectionLength = _findHelper.FindTextLength; - _findHelper.SelectedPosition += _findHelper.ReplaceText.Length; - ShowStatus(string.Format(msg + _language.XFoundAtLineNumberY, _findHelper.FindText, _findHelper.SelectedIndex + 1)); - } - } - else - { - if (replaceDialog != null && !replaceDialog.IsDisposed) - { - replaceDialog.Dispose(); - } - - _findHelper.InProgress = false; - return; - } - } - else - { - if (replaceDialog != null && !replaceDialog.IsDisposed) - { - replaceDialog.Dispose(); - } - - _findHelper.InProgress = false; - return; - } - } - - Replace(replaceDialog); - if (replaceDialog != null && !replaceDialog.IsDisposed) - { - replaceDialog.Dispose(); - } - - _findHelper.InProgress = false; - return; - } - - if (_findHelper.SelectedIndex > stopAtIndex) - { - break; - } - } - - ShowSource(); - if (replaceCount == 0) - { - ShowStatus(_language.FoundNothingToReplace); - } - else - { - ShowStatus(string.Format(_language.ReplaceCountX, replaceCount)); - SubtitleListview1.SyntaxColorAllLines(_subtitle); - } - } - - RestoreSubtitleListviewIndices(); - if (_makeHistoryPaused) - { - RestartHistory(); - } - - replaceDialog.Dispose(); - _findHelper.InProgress = false; - } - - private void ReplaceViaRegularExpression(SETextBox tb, bool replaceAll) - { - var r = new Regex(RegexUtils.FixNewLine(_findHelper.FindText), RegexOptions.Multiline); - if (replaceAll) - { - string result = RegexUtils.ReplaceNewLineSafe(r, tb.Text, _findHelper.ReplaceText); - if (result != tb.Text) - { - tb.Text = result; - } - - _findHelper.SelectedPosition = tb.Text.Length; - _findHelper.ReplaceFromPosition = _findHelper.SelectedPosition; - } - else - { - string result = RegexUtils.ReplaceNewLineSafe(r, tb.Text, _findHelper.ReplaceText, 1, _findHelper.SelectedPosition); - if (result != tb.Text) - { - var match = r.Match(string.Join(Environment.NewLine, tb.Text.SplitToLines())); - if (match != null && match.Success && !_findHelper.FindText.StartsWith('^') && _findHelper.ReplaceText.Length > 0) - { - var add = Math.Abs(match.Length - _findHelper.ReplaceText.Length); - _findHelper.SelectedPosition += add; - _findHelper.ReplaceFromPosition = _findHelper.SelectedPosition; - } - - tb.Text = result; - } - - if (_findHelper.FindText.StartsWith('^')) - { - _findHelper.SelectedPosition++; - } - } - } - - private void SetTextForFindAndReplace(bool replace, bool replaceAll) - { - _subtitleListViewIndex = _findHelper.SelectedIndex; - textBoxListViewText.Text = _subtitle.Paragraphs[_findHelper.SelectedIndex].Text; - if (_subtitleAlternate != null && textBoxListViewTextAlternate.Visible) - { - var orginial = Utilities.GetOriginalParagraph(_findHelper.SelectedIndex, _subtitle.Paragraphs[_findHelper.SelectedIndex], _subtitleAlternate.Paragraphs); - if (orginial != null) - { - textBoxListViewTextAlternate.Text = orginial.Text; - } - } - - if (replace) - { - var tb = GetFindReplaceTextBox(); - tb.SelectionStart = _findHelper.SelectedPosition; - tb.SelectionLength = _findHelper.FindTextLength; - if (_findHelper.FindReplaceType.FindType == FindType.RegEx) - { - ReplaceViaRegularExpression(tb, replaceAll); - _findHelper.SelectedPosition += _findHelper.FindTextLength; - _findHelper.ReplaceFromPosition = _findHelper.SelectedPosition; - } - else - { - tb.SelectedText = _findHelper.ReplaceText; - _findHelper.SelectedPosition += _findHelper.ReplaceText.Length; - _findHelper.ReplaceFromPosition = _findHelper.SelectedPosition; - } - } - } - - private void Replace(ReplaceDialog replaceDialog) - { - if (tabControlSubtitle.SelectedIndex == TabControlSourceView) - { - ReplaceSourceView(replaceDialog); - } - else - { - ReplaceListView(replaceDialog); - } - } - - public void ShowStatus(string message, bool log = true) - { - if (_disableShowStatus) - { - return; - } - - labelStatus.Text = message.Replace("&", "&&"); - statusStrip1.Refresh(); - if (!string.IsNullOrEmpty(message)) - { - _timerClearStatus.Stop(); - if (log) - { - _timerClearStatus.Interval = Configuration.Settings.General.ClearStatusBarAfterSeconds * 1000; - _statusLog.Add(string.Format("{0:0000}-{1:00}-{2:00} {3}: {4}", DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.ToLongTimeString(), message)); - } - else - { - _timerClearStatus.Interval = 1500; - } - _timerClearStatus.Start(); - } - ShowSourceLineNumber(); - ShowLineInformationListView(); - } - - private void ReloadFromSourceView() - { - if (_sourceViewChange) - { - SaveSubtitleListviewIndices(); - if (!string.IsNullOrWhiteSpace(textBoxSource.Text)) - { - var oldSubtitle = new Subtitle(_subtitle); - var format = GetCurrentSubtitleFormat(); - var list = textBoxSource.Lines.ToList(); - format = new Subtitle().ReloadLoadSubtitle(list, null, format); - if (format == null) - { - MessageBox.Show(_language.UnableToParseSourceView); - return; - } - - _sourceViewChange = false; - MakeHistoryForUndo(_language.BeforeChangesMadeInSourceView); - _subtitle.ReloadLoadSubtitle(list, null, format); - - int index = 0; - foreach (string formatName in comboBoxSubtitleFormats.Items) - { - if (formatName == format.FriendlyName) - { - comboBoxSubtitleFormats.SelectedIndex = index; - break; - } - - index++; - } - - for (int i = 0; i < oldSubtitle.Paragraphs.Count; i++) - { - if (oldSubtitle.Paragraphs[i].Bookmark != null) - { - var newParagraph = _subtitle.GetFirstAlike(oldSubtitle.Paragraphs[i]); - if (newParagraph != null) - { - newParagraph.Bookmark = oldSubtitle.Paragraphs[i].Bookmark; - } - } - } - - if (Configuration.Settings.General.CurrentVideoOffsetInMs != 0) - { - _subtitle.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(-Configuration.Settings.General.CurrentVideoOffsetInMs)); - } - - var formatType = format.GetType(); - if (formatType == typeof(AdvancedSubStationAlpha) || formatType == typeof(SubStationAlpha)) - { - string errors = AdvancedSubStationAlpha.CheckForErrors(_subtitle.Header); - if (!string.IsNullOrEmpty(errors)) - { - MessageBox.Show(errors, Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - } - else if (formatType == typeof(SubRip)) - { - string errors = (format as SubRip).Errors; - if (!string.IsNullOrEmpty(errors)) - { - MessageBox.Show(errors, Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - } - else if (formatType == typeof(MicroDvd)) - { - string errors = (format as MicroDvd).Errors; - if (!string.IsNullOrEmpty(errors)) - { - MessageBox.Show(errors, Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - } - else if (formatType == typeof(DCinemaSmpte2007)) - { - format.ToText(_subtitle, string.Empty); - string errors = (format as DCinemaSmpte2007).Errors; - if (!string.IsNullOrEmpty(errors)) - { - MessageBox.Show(errors, Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - } - else if (formatType == typeof(DCinemaSmpte2010)) - { - format.ToText(_subtitle, string.Empty); - string errors = (format as DCinemaSmpte2010).Errors; - if (!string.IsNullOrEmpty(errors)) - { - MessageBox.Show(errors, Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - } - else if (formatType == typeof(DCinemaSmpte2014)) - { - format.ToText(_subtitle, string.Empty); - string errors = (format as DCinemaSmpte2014).Errors; - if (!string.IsNullOrEmpty(errors)) - { - MessageBox.Show(errors, Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - } - } - else - { - _sourceViewChange = false; - MakeHistoryForUndo(_language.BeforeChangesMadeInSourceView); - _sourceViewChange = false; - _subtitle.Paragraphs.Clear(); - } - - _subtitleListViewIndex = -1; - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - } - } - - private void HelpToolStripMenuItem1Click(object sender, EventArgs e) - { - ReloadFromSourceView(); - Utilities.ShowHelp(string.Empty); - } - - private void ToolStripButtonHelpClick(object sender, EventArgs e) - { - ReloadFromSourceView(); - Utilities.ShowHelp(string.Empty); - } - - private void GotoLineNumberToolStripMenuItemClick(object sender, EventArgs e) - { - ReloadFromSourceView(); - if (!IsSubtitleLoaded) - { - DisplaySubtitleNotLoadedMessage(); - return; - } - - using (var goToLine = new GoToLine()) - { - if (tabControlSubtitle.SelectedIndex == TabControlListView) - { - goToLine.Initialize(1, SubtitleListview1.Items.Count); - } - else if (tabControlSubtitle.SelectedIndex == TabControlSourceView) - { - goToLine.Initialize(1, textBoxSource.Lines.Length); - } - - if (goToLine.ShowDialog(this) == DialogResult.OK) - { - if (tabControlSubtitle.SelectedIndex == TabControlListView) - { - SubtitleListview1.SelectedIndexChanged -= SubtitleListview1_SelectedIndexChanged; - SubtitleListview1.SelectNone(); - SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; - - SubtitleListview1.Items[goToLine.LineNumber - 1].Selected = true; - SubtitleListview1.Items[goToLine.LineNumber - 1].EnsureVisible(); - SubtitleListview1.Items[goToLine.LineNumber - 1].Focused = true; - ShowStatus(string.Format(_language.GoToLineNumberX, goToLine.LineNumber)); - } - else if (tabControlSubtitle.SelectedIndex == TabControlSourceView) - { - textBoxSource.SelectionStart = textBoxSource.GetFirstCharIndexFromLine(goToLine.LineNumber - 1); - textBoxSource.SelectionLength = textBoxSource.Lines[goToLine.LineNumber - 1].Length; - textBoxSource.ScrollToCaret(); - ShowSourceLineNumber(); - } - } - } - } - - private void TextBoxSourceLeave(object sender, EventArgs e) - { - ReloadFromSourceView(); - } - - private void AdjustDisplayTimeToolStripMenuItemClick(object sender, EventArgs e) - { - AdjustDisplayTime(false); - } - - private void AdjustDisplayTime(bool onlySelectedLines) - { - if (!IsSubtitleLoaded) - { - DisplaySubtitleNotLoadedMessage(); - return; - } - - ReloadFromSourceView(); - using (var adjustDisplayTime = new AdjustDisplayDuration()) - { - List selectedIndices = null; - if (onlySelectedLines) - { - adjustDisplayTime.Text += " - " + _language.SelectedLines; - selectedIndices = new List(); - foreach (int item in SubtitleListview1.SelectedIndices) - { - selectedIndices.Add(item); - } - } - - if (adjustDisplayTime.ShowDialog(this) == DialogResult.OK) - { - MakeHistoryForUndo(_language.BeforeDisplayTimeAdjustment); - if (adjustDisplayTime.AdjustUsingPercent) - { - double percent = double.Parse(adjustDisplayTime.AdjustValue); - _subtitle.AdjustDisplayTimeUsingPercent(percent, selectedIndices); - ShowStatus(string.Format(_language.DisplayTimesAdjustedX, double.Parse(adjustDisplayTime.AdjustValue, CultureInfo.InvariantCulture) + "%")); - } - else if (adjustDisplayTime.AdjustUsingSeconds) - { - double seconds = double.Parse(adjustDisplayTime.AdjustValue, CultureInfo.InvariantCulture); - _subtitle.AdjustDisplayTimeUsingSeconds(seconds, selectedIndices); - ShowStatus(string.Format(_language.DisplayTimesAdjustedX, double.Parse(adjustDisplayTime.AdjustValue, CultureInfo.InvariantCulture))); - } - else if (adjustDisplayTime.AdjustUsingRecalc) - { - double maxCharSeconds = (double)(adjustDisplayTime.MaxCharactersPerSecond); - _subtitle.RecalculateDisplayTimes(maxCharSeconds, selectedIndices, (double)adjustDisplayTime.OptimalCharactersPerSecond, adjustDisplayTime.ExtendOnly); - ShowStatus(string.Format(_language.DisplayTimesAdjustedX, adjustDisplayTime.AdjustValue)); - } - else - { // fixed duration - _subtitle.SetFixedDuration(selectedIndices, adjustDisplayTime.FixedMilliseconds); - ShowStatus(string.Format(_language.DisplayTimesAdjustedX, adjustDisplayTime.FixedMilliseconds)); - } - - SaveSubtitleListviewIndices(); - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - } - } - } - - private void FixToolStripMenuItemClick(object sender, EventArgs e) - { - if (_networkSession == null) - { - FixCommonErrors(false); - } - } - - private void FixCommonErrors(bool onlySelectedLines) - { - if (IsSubtitleLoaded) - { - ReloadFromSourceView(); - SaveSubtitleListviewIndices(); - using (var fixErrors = new FixCommonErrors()) - { - if (onlySelectedLines) - { - var selectedLines = new Subtitle(); - foreach (int index in SubtitleListview1.SelectedIndices) - { - selectedLines.Paragraphs.Add(_subtitle.Paragraphs[index]); - } - - fixErrors.Initialize(selectedLines, GetCurrentSubtitleFormat(), GetCurrentEncoding()); - } - else - { - fixErrors.Initialize(_subtitle, GetCurrentSubtitleFormat(), GetCurrentEncoding()); - } - - if (fixErrors.ShowDialog(this) == DialogResult.OK) - { - MakeHistoryForUndo(_language.BeforeCommonErrorFixes); - _subtitle.Renumber(); - if (onlySelectedLines) - { - // we only update selected lines - if (_networkSession != null) - { - var deletes = new List(); - _networkSession.TimerStop(); - foreach (int index in SubtitleListview1.SelectedIndices) - { - var pOld = _subtitle.Paragraphs[index]; - var p = fixErrors.FixedSubtitle.GetParagraphOrDefaultById(pOld.Id); - if (p == null) - { - deletes.Add(index); - } - else - { - _subtitle.Paragraphs[index] = p; - SubtitleListview1.SetTimeAndText(index, p, _subtitle.GetParagraphOrDefault(index + 1)); - } - } - - NetworkGetSendUpdates(deletes, 0, null); - } - else - { - var selectedIndices = SubtitleListview1.GetSelectedIndices(); - for (int index = selectedIndices.Length - 1; index >= 0; index--) - { - var idx = selectedIndices[index]; - var pOld = _subtitle.Paragraphs[idx]; - var p = fixErrors.FixedSubtitle.GetParagraphOrDefaultById(pOld.Id); - if (p == null) - { - _subtitle.Paragraphs.RemoveAt(idx); - } - else - { - _subtitle.Paragraphs[idx] = p; - } - } - } - - ShowStatus(_language.CommonErrorsFixedInSelectedLines); - } - else - { - _subtitle.Paragraphs.Clear(); - foreach (var p in fixErrors.FixedSubtitle.Paragraphs) - { - _subtitle.Paragraphs.Add(p); - } - - ShowStatus(_language.CommonErrorsFixed); - } - - _subtitle.Renumber(); - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - } - - Configuration.Settings.CommonErrors.StartSize = fixErrors.Width + ";" + fixErrors.Height; - Configuration.Settings.CommonErrors.StartPosition = fixErrors.Left + ";" + fixErrors.Top; - } - } - else - { - DisplaySubtitleNotLoadedMessage(); - } - - ShowInTaskbar = true; - } - - private void StartNumberingFromToolStripMenuItemClick(object sender, EventArgs e) - { - if (!IsSubtitleLoaded) - { - DisplaySubtitleNotLoadedMessage(); - return; - } - - ReloadFromSourceView(); - using (var startNumberingFrom = new StartNumberingFrom()) - { - if (startNumberingFrom.ShowDialog(this) == DialogResult.OK) - { - SaveSubtitleListviewIndices(); - MakeHistoryForUndo(_language.BeforeRenumbering); - ShowStatus(string.Format(_language.RenumberedStartingFromX, startNumberingFrom.StartFromNumber)); - _subtitle.Renumber(startNumberingFrom.StartFromNumber); - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - } - } - } - - internal void ReloadFromSubtitle(Subtitle subtitle, string messageForUndo) - { - MakeHistoryForUndo(messageForUndo); - _subtitle.Paragraphs.Clear(); - _subtitle.Paragraphs.AddRange(subtitle.Paragraphs); - _subtitleListViewIndex = -1; - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - if (_subtitle.Paragraphs.Count > 0) - { - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - } - } - - private void RemoveTextForHearImpairedToolStripMenuItemClick(object sender, EventArgs e) - { - if (!IsSubtitleLoaded) - { - DisplaySubtitleNotLoadedMessage(); - return; - } - - ReloadFromSourceView(); - using (var removeTextFromHearImpaired = new FormRemoveTextForHearImpaired(this, _subtitle)) - { - removeTextFromHearImpaired.Initialize(_subtitle); - if (removeTextFromHearImpaired.ShowDialog(this) == DialogResult.OK) - { - int count = removeTextFromHearImpaired.TotalFixes; - if (count == 1) - { - ShowStatus(_language.TextingForHearingImpairedRemovedOneLine); - } - else if (count > 1) - { - ShowStatus(string.Format(_language.TextingForHearingImpairedRemovedXLines, count)); - } - } - } - } - - private void SplitToolStripMenuItemClick(object sender, EventArgs e) - { - if (!IsSubtitleLoaded) - { - DisplaySubtitleNotLoadedMessage(); - return; - } - - ReloadFromSourceView(); - double lengthInSeconds = 0; - if (mediaPlayer.VideoPlayer != null) - { - lengthInSeconds = mediaPlayer.Duration; - } - - if (Configuration.Settings.Tools.SplitAdvanced) - { - using (var split = new Split()) - { - split.Initialize(_subtitle, _fileName, GetCurrentSubtitleFormat()); - if (split.ShowDialog(this) == DialogResult.OK) - { - ShowStatus(_language.SubtitleSplitted); - } - else if (split.ShowBasic) - { - Configuration.Settings.Tools.SplitAdvanced = false; - SplitToolStripMenuItemClick(null, null); - } - } - } - else - { - using (var splitSubtitle = new SplitSubtitle()) - { - splitSubtitle.Initialize(_subtitle, _fileName, GetCurrentSubtitleFormat(), GetCurrentEncoding(), lengthInSeconds); - if (splitSubtitle.ShowDialog(this) == DialogResult.OK) - { - ShowStatus(_language.SubtitleSplitted); - } - else if (splitSubtitle.ShowAdvanced) - { - Configuration.Settings.Tools.SplitAdvanced = true; - SplitToolStripMenuItemClick(null, null); - } - } - } - } - - private void AppendTextVisuallyToolStripMenuItemClick(object sender, EventArgs e) - { - if (!IsSubtitleLoaded) - { - DisplaySubtitleNotLoadedMessage(); - return; - } - - ReloadFromSourceView(); - - if (MessageBox.Show(_language.SubtitleAppendPrompt, _language.SubtitleAppendPromptTitle, MessageBoxButtons.YesNoCancel) == DialogResult.Yes) - { - openFileDialog1.Title = _language.OpenSubtitleToAppend; - openFileDialog1.FileName = string.Empty; - openFileDialog1.Filter = UiUtil.SubtitleExtensionFilter.Value; - if (openFileDialog1.ShowDialog(this) == DialogResult.OK) - { - bool success = false; - string fileName = openFileDialog1.FileName; - if (File.Exists(fileName)) - { - var fileInfo = new FileInfo(fileName); - var subtitleToAppend = new Subtitle(); - SubtitleFormat format; - - // do not allow blu-ray/vobsub - string extension = Path.GetExtension(fileName).ToLowerInvariant(); - if (extension == ".sub" && (IsVobSubFile(fileName, false) || FileUtil.IsSpDvdSup(fileName))) - { - format = null; - } - else if (extension == ".sup" && FileUtil.IsBluRaySup(fileName)) - { - format = null; - } - else if (fileInfo.Length < Subtitle.MaxFileSize) - { - format = subtitleToAppend.LoadSubtitle(fileName, out var encoding, null); - - if (format == null) - { - var ebu = new Ebu(); - if (ebu.IsMine(null, fileName)) - { - ebu.LoadSubtitle(subtitleToAppend, null, fileName); - format = ebu; - } - } - - if (format == null) - { - var pac = new Pac(); - if (pac.IsMine(null, fileName)) - { - pac.LoadSubtitle(subtitleToAppend, null, fileName); - format = pac; - } - } - - if (format == null) - { - var cavena890 = new Cavena890(); - if (cavena890.IsMine(null, fileName)) - { - cavena890.LoadSubtitle(subtitleToAppend, null, fileName); - format = cavena890; - } - } - } - else - { - MessageBox.Show(string.Format(_language.FileXIsLargerThan10MB, fileName)); - return; - } - - if (format != null && subtitleToAppend.Paragraphs.Count > 1) - { - using (var visualSync = new VisualSync()) - { - visualSync.Initialize(toolStripButtonVisualSync.Image as Bitmap, subtitleToAppend, null, _fileName, _language.AppendViaVisualSyncTitle, CurrentFrameRate); - visualSync.ShowDialog(this); - if (visualSync.OkPressed) - { - if (MessageBox.Show(_language.AppendSynchronizedSubtitlePrompt, _language.SubtitleAppendPromptTitle, MessageBoxButtons.YesNoCancel) == DialogResult.Yes) - { - int start = _subtitle.Paragraphs.Count + 1; - var fr = CurrentFrameRate; - MakeHistoryForUndo(_language.BeforeAppend); - foreach (var p in visualSync.Paragraphs) - { - _subtitle.Paragraphs.Add(new Paragraph(p)); - } - - if (format.GetType() == typeof(AdvancedSubStationAlpha) && GetCurrentSubtitleFormat().GetType() == typeof(AdvancedSubStationAlpha)) - { - var currentStyles = new List(); - if (_subtitle.Header != null) - { - currentStyles = AdvancedSubStationAlpha.GetStylesFromHeader(_subtitle.Header); - } - - foreach (var styleName in AdvancedSubStationAlpha.GetStylesFromHeader(subtitleToAppend.Header)) - { - bool alreadyExists = false; - foreach (var currentStyleName in currentStyles) - { - if (currentStyleName.Trim().Equals(styleName.Trim(), StringComparison.OrdinalIgnoreCase)) - { - alreadyExists = true; - } - } - - if (!alreadyExists) - { - var newStyle = AdvancedSubStationAlpha.GetSsaStyle(styleName, subtitleToAppend.Header); - _subtitle.Header = AdvancedSubStationAlpha.AddSsaStyle(newStyle, _subtitle.Header); - } - } - } - - _subtitle.Renumber(); - - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - - // select appended lines - for (int i = start; i < _subtitle.Paragraphs.Count; i++) - { - SubtitleListview1.Items[i].Selected = true; - } - - SubtitleListview1.EnsureVisible(start); - - ShowStatus(string.Format(_language.SubtitleAppendedX, fileName)); - success = true; - } - } - } - } - } - - if (!success) - { - ShowStatus(_language.SubtitleNotAppended); - } - } - } - } - - private void TranslateByGoogleToolStripMenuItemClick(object sender, EventArgs e) - { - TranslateViaGoogle(false, true); - } - - private void TranslateViaGoogle(bool onlySelectedLines, bool useGoogle) - { - if (!IsSubtitleLoaded) - { - DisplaySubtitleNotLoadedMessage(); - return; - } - - bool isAlternateVisible = SubtitleListview1.IsAlternateTextColumnVisible; - ReloadFromSourceView(); - using (var googleTranslate = new GoogleTranslate()) - { - SaveSubtitleListviewIndices(); - string title = _language.GoogleTranslate; - if (!useGoogle) - { - title = _language.MicrosoftTranslate; - } - - if (onlySelectedLines) - { - var selectedLines = new Subtitle(); - foreach (int index in SubtitleListview1.SelectedIndices) - { - selectedLines.Paragraphs.Add(_subtitle.Paragraphs[index]); - } - - title += " - " + _language.SelectedLines; - if (_subtitleAlternate != null) - { - var paragraphs = new List(); - foreach (int index in SubtitleListview1.SelectedIndices) - { - var original = Utilities.GetOriginalParagraph(index, _subtitle.Paragraphs[index], _subtitleAlternate.Paragraphs); - if (original != null) - { - paragraphs.Add(original); - } - } - - if (paragraphs.Count == selectedLines.Paragraphs.Count) - { - googleTranslate.Initialize(new Subtitle(paragraphs), selectedLines, title, useGoogle, GetCurrentEncoding()); - } - else - { - googleTranslate.Initialize(selectedLines, null, title, useGoogle, GetCurrentEncoding()); - } - } - else - { - googleTranslate.Initialize(selectedLines, null, title, useGoogle, GetCurrentEncoding()); - } - } - else - { - googleTranslate.Initialize(_subtitle, null, title, useGoogle, GetCurrentEncoding()); - } - - if (googleTranslate.ShowDialog(this) == DialogResult.OK) - { - _subtitleListViewIndex = -1; - string oldFileName = _fileName; - MakeHistoryForUndo(_language.BeforeGoogleTranslation); - if (onlySelectedLines) - { - // we only update selected lines - int i = 0; - foreach (int index in SubtitleListview1.SelectedIndices) - { - _subtitle.Paragraphs[index] = googleTranslate.TranslatedSubtitle.Paragraphs[i]; - i++; - } - - ShowStatus(_language.SelectedLinesTranslated); - } - else - { - ShowSubtitleTimer.Stop(); - var oldHash = _changeSubtitleHash; - _subtitleAlternate = new Subtitle(_subtitle); - _subtitleAlternateFileName = _fileName; - _fileName = null; - _subtitle.Paragraphs.Clear(); - foreach (var p in googleTranslate.TranslatedSubtitle.Paragraphs) - { - _subtitle.Paragraphs.Add(new Paragraph(p)); - } - - ShowStatus(_language.SubtitleTranslated); - _changeAlternateSubtitleHash = oldHash; - _changeSubtitleHash = -1; - ShowSubtitleTimer.Start(); - } - - ShowSource(); - - if (!onlySelectedLines) - { - SubtitleListview1.ShowAlternateTextColumn(_languageGeneral.OriginalText); - SubtitleListview1.AutoSizeAllColumns(this); - var oldHash = _changeAlternateSubtitleHash; - SetupAlternateEdit(); - _changeAlternateSubtitleHash = oldHash; - } - - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - if (!onlySelectedLines) - { - ResetHistory(); - _fileName = googleTranslate.GetFileNameWithTargetLanguage(oldFileName, VideoFileName, _subtitleAlternate, GetCurrentSubtitleFormat()); - } - - RestoreSubtitleListviewIndices(); - _converted = true; - SetTitle(); - SetEncoding(Encoding.UTF8); - if (!isAlternateVisible) - { - toolStripMenuItemShowOriginalInPreview.Checked = false; - Configuration.Settings.General.ShowOriginalAsPreviewIfAvailable = false; - audioVisualizer.Invalidate(); - } - } - } - } - - private static string GetTranslateStringFromNikseDk(string input) - { - WebRequest.DefaultWebProxy = Utilities.GetProxy(); - //var request = WebRequest.Create("http://localhost:54942/MultiTranslator/TranslateForSubtitleEdit"); - var request = WebRequest.Create("https://www.nikse.dk/MultiTranslator/TranslateForSubtitleEdit"); - request.Method = "POST"; - var postData = String.Format("languagePair={1}&text={0}", Utilities.UrlEncode(input), "svda"); - var byteArray = Encoding.UTF8.GetBytes(postData); - request.ContentType = "application/x-www-form-urlencoded"; - request.ContentLength = byteArray.Length; - using (var dataStream = request.GetRequestStream()) - { - dataStream.Write(byteArray, 0, byteArray.Length); - } - - using (var response = request.GetResponse()) - using (var reader = new StreamReader(response.GetResponseStream())) - { - return reader.ReadToEnd(); - } - } - - private void TranslateFromSwedishToDanishToolStripMenuItemClick(object sender, EventArgs e) - { - if (!IsSubtitleLoaded) - { - DisplaySubtitleNotLoadedMessage(); - return; - } - - bool isSwedish = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle) == "sv"; - string promptText = _language.TranslateSwedishToDanish; - if (!isSwedish) - { - promptText = _language.TranslateSwedishToDanishWarning; - } - - if (MessageBox.Show(promptText, Title, MessageBoxButtons.YesNoCancel) == DialogResult.Yes) - { - try - { - _subtitleAlternate = new Subtitle(_subtitle); - _subtitleAlternateFileName = null; - int firstSelectedIndex = 0; - if (SubtitleListview1.SelectedItems.Count > 0) - { - firstSelectedIndex = SubtitleListview1.SelectedItems[0].Index; - } - - _subtitleListViewIndex = -1; - - Cursor.Current = Cursors.WaitCursor; - ShowStatus(_language.TranslatingViaNikseDkMt); - var sb = new StringBuilder(); - var output = new StringBuilder(); - foreach (var p in _subtitle.Paragraphs) - { - var s = p.Text.Replace(Environment.NewLine, "
"); - s = "

" + s + "

"; - sb.Append(s); - - if (sb.Length > 9000) - { - output.Append(GetTranslateStringFromNikseDk(sb.ToString())); - sb.Length = 0; - } - } - - if (sb.Length > 0) - { - output.Append(GetTranslateStringFromNikseDk(sb.ToString())); - } - - MakeHistoryForUndo(_language.BeforeSwedishToDanishTranslation); - var result = output.ToString(); - if (result.Length > 0) - { - int index = 0; - foreach (var s in result.Split(new[] { "

", "

" }, StringSplitOptions.RemoveEmptyEntries)) - { - if (index < _subtitle.Paragraphs.Count) - { - _subtitle.Paragraphs[index].Text = s.Trim(); - } - - index++; - } - - ShowSource(); - SubtitleListview1.ShowAlternateTextColumn(_languageGeneral.OriginalText); - SubtitleListview1.AutoSizeAllColumns(this); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - ShowStatus(_language.TranslationFromSwedishToDanishComplete); - SubtitleListview1.SelectIndexAndEnsureVisible(firstSelectedIndex, true); - _converted = true; - } - } - catch - { - ShowStatus(_language.TranslationFromSwedishToDanishFailed); - } - - Cursor.Current = Cursors.Default; - } - } - - /// - /// Undo or Redo - /// - /// True equals undo, false triggers redo - private void UndoToIndex(bool undo) - { - if (_networkSession != null) - { - return; - } - - lock (_syncUndo) - { - if (!undo && _undoIndex >= _subtitle.HistoryItems.Count - 1) - { - return; - } - - if (undo && (_subtitle == null || !_subtitle.CanUndo || _undoIndex < 0)) - { - return; - } - - // Add latest changes if any (also stop changes from being added while redoing/undoing) - timerTextUndo.Stop(); - timerAlternateTextUndo.Stop(); - _listViewTextTicks = 0; - _listViewAlternateTextTicks = 0; - TimerTextUndoTick(null, null); - TimerAlternateTextUndoTick(null, null); - - try - { - int selectedIndex = FirstSelectedIndex; - if (undo) - { - _subtitle.HistoryItems[_undoIndex].RedoParagraphs = new List(); - _subtitle.HistoryItems[_undoIndex].RedoParagraphsAlternate = new List(); - - foreach (var p in _subtitle.Paragraphs) - { - _subtitle.HistoryItems[_undoIndex].RedoParagraphs.Add(new Paragraph(p)); - } - - if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null) - { - foreach (var p in _subtitleAlternate.Paragraphs) - { - _subtitle.HistoryItems[_undoIndex].RedoParagraphsAlternate.Add(new Paragraph(p)); - } - } - - _subtitle.HistoryItems[_undoIndex].RedoFileName = _fileName; - _subtitle.HistoryItems[_undoIndex].RedoFileModified = _fileDateTime; - _subtitle.HistoryItems[_undoIndex].RedoOriginalFileName = _subtitleAlternateFileName; - - if (selectedIndex >= 0) - { - _subtitle.HistoryItems[_undoIndex].RedoParagraphs[selectedIndex].Text = - textBoxListViewText.Text; - if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && - selectedIndex < _subtitle.HistoryItems[_undoIndex].RedoParagraphsAlternate.Count) - { - _subtitle.HistoryItems[_undoIndex].RedoParagraphsAlternate[selectedIndex].Text = - textBoxListViewTextAlternate.Text; - } - - _subtitle.HistoryItems[_undoIndex].RedoLineIndex = selectedIndex; - _subtitle.HistoryItems[_undoIndex].RedoLinePosition = textBoxListViewText.SelectionStart; - _subtitle.HistoryItems[_undoIndex].RedoLinePositionAlternate = textBoxListViewTextAlternate.SelectionStart; - } - else - { - _subtitle.HistoryItems[_undoIndex].RedoLineIndex = -1; - _subtitle.HistoryItems[_undoIndex].RedoLinePosition = -1; - } - } - else - { - _undoIndex++; - } - - var text = _subtitle.HistoryItems[_undoIndex].Description; - - _subtitleListViewIndex = -1; - textBoxListViewText.Text = string.Empty; - textBoxListViewTextAlternate.Text = string.Empty; - string oldFileName = _fileName; - DateTime oldFileDateTime = _fileDateTime; - - string oldAlternameFileName = _subtitleAlternateFileName; - _fileName = _subtitle.UndoHistory(_undoIndex, out var subtitleFormatFriendlyName, out _fileDateTime, out _subtitleAlternate, out _subtitleAlternateFileName); - if (string.IsNullOrEmpty(oldAlternameFileName) && !string.IsNullOrEmpty(_subtitleAlternateFileName)) - { - SubtitleListview1.ShowAlternateTextColumn(_languageGeneral.OriginalText); - SubtitleListview1.AutoSizeAllColumns(this); - } - else if (SubtitleListview1.IsAlternateTextColumnVisible && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count == 0) - { - RemoveAlternate(true, false); - } - - if (!undo) - { - // TODO: Sometimes redo paragraphs can be null - how? - if (_subtitle.HistoryItems[_undoIndex].RedoParagraphs != null) - { - _subtitle.Paragraphs.Clear(); - foreach (var p in _subtitle.HistoryItems[_undoIndex].RedoParagraphs) - { - _subtitle.Paragraphs.Add(new Paragraph(p)); - } - - if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null) - { - _subtitleAlternate.Paragraphs.Clear(); - foreach (var p in _subtitle.HistoryItems[_undoIndex].RedoParagraphsAlternate) - { - _subtitleAlternate.Paragraphs.Add(new Paragraph(p)); - } - } - } - else - { - System.Diagnostics.Debug.WriteLine("Undo failed at undo index: " + _undoIndex); - } - - _subtitle.HistoryItems[_undoIndex].RedoParagraphs = null; - _subtitle.HistoryItems[_undoIndex].RedoParagraphsAlternate = null; - if (SubtitleListview1.IsAlternateTextColumnVisible && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count == 0) - { - RemoveAlternate(true, false); - } - } - - if (oldFileName == null || oldFileName.Equals(_fileName, StringComparison.OrdinalIgnoreCase)) - { - _fileDateTime = oldFileDateTime; // undo will not give overwrite-newer-file warning - } - - comboBoxSubtitleFormats.SelectedIndexChanged -= ComboBoxSubtitleFormatsSelectedIndexChanged; - SetCurrentFormat(subtitleFormatFriendlyName); - comboBoxSubtitleFormats.SelectedIndexChanged += ComboBoxSubtitleFormatsSelectedIndexChanged; - - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - - if (selectedIndex >= _subtitle.Paragraphs.Count) - { - SubtitleListview1.SelectIndexAndEnsureVisible(_subtitle.Paragraphs.Count - 1, true); - } - else if (selectedIndex >= 0 && selectedIndex < _subtitle.Paragraphs.Count) - { - SubtitleListview1.SelectIndexAndEnsureVisible(selectedIndex, true); - } - else - { - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - } - - audioVisualizer.Invalidate(); - if (undo) - { - if (_subtitle.HistoryItems[_undoIndex].LineIndex == FirstSelectedIndex) - { - textBoxListViewText.SelectionStart = _subtitle.HistoryItems[_undoIndex].LinePosition; - if (_subtitleAlternate != null) - { - textBoxListViewTextAlternate.SelectionStart = - _subtitle.HistoryItems[_undoIndex].LinePositionAlternate; - } - } - - ShowStatus(_language.UndoPerformed + ": " + text.Replace(Environment.NewLine, " ")); - _undoIndex--; - } - else - { - if (_subtitle.HistoryItems[_undoIndex].RedoLineIndex >= 0 && - _subtitle.HistoryItems[_undoIndex].RedoLineIndex == FirstSelectedIndex) - { - textBoxListViewText.SelectionStart = _subtitle.HistoryItems[_undoIndex].RedoLinePosition; - } - - if (_subtitleAlternate != null && _subtitle.HistoryItems[_undoIndex].RedoLineIndex >= 0 && - _subtitle.HistoryItems[_undoIndex].RedoLineIndex == FirstSelectedIndex) - { - textBoxListViewTextAlternate.SelectionStart = _subtitle.HistoryItems[_undoIndex].RedoLinePositionAlternate; - } - - _fileName = _subtitle.HistoryItems[_undoIndex].RedoFileName; - _subtitleAlternateFileName = _subtitle.HistoryItems[_undoIndex].RedoOriginalFileName; - ShowStatus(_language.RedoPerformed); - } - } - catch (Exception exception) - { - System.Diagnostics.Debug.WriteLine(exception.Message); - } - - timerTextUndo.Start(); - timerAlternateTextUndo.Start(); - SetTitle(); - SetListViewStateImages(); - } - } - - private void ShowHistoryforUndoToolStripMenuItemClick(object sender, EventArgs e) - { - if (_subtitle != null && _subtitle.CanUndo) - { - ReloadFromSourceView(); - using (var showHistory = new ShowHistory()) - { - showHistory.Initialize(_subtitle, _undoIndex); - if (showHistory.ShowDialog(this) == DialogResult.OK) - { - _subtitleListViewIndex = -1; - textBoxListViewText.Text = string.Empty; - textBoxListViewTextAlternate.Text = string.Empty; - - Cursor.Current = Cursors.WaitCursor; - SubtitleListview1.BeginUpdate(); - int rollBackCount = 0; - while (_undoIndex > showHistory.SelectedIndex && rollBackCount < Subtitle.MaximumHistoryItems) - { - UndoToIndex(true); - rollBackCount++; - } - SubtitleListview1.EndUpdate(); - Cursor.Current = Cursors.Default; - audioVisualizer.Invalidate(); - } - } - } - else - { - MessageBox.Show(_language.NothingToUndo, Title, MessageBoxButtons.OK, MessageBoxIcon.Information); - } - } - - private void ToolStripButtonSpellCheckClick(object sender, EventArgs e) - { - SpellCheck(true, 0); - } - - private void SpellCheckToolStripMenuItemClick(object sender, EventArgs e) - { - SpellCheck(true, 0); - } - - private void SpellCheck(bool autoDetect, int startFromLine) - { - if (!IsSubtitleLoaded) - { - DisplaySubtitleNotLoadedMessage(); - return; - } - - try - { - string dictionaryFolder = Utilities.DictionaryFolder; - if (!Directory.Exists(dictionaryFolder) || Directory.GetFiles(dictionaryFolder, "*.dic").Length == 0) - { - ShowGetDictionaries(); - return; - } - - if (_subtitle != null && _subtitle.Paragraphs.Count > 0) - { - if (_spellCheckForm != null) - { - var result = MessageBox.Show(_language.ContinueWithCurrentSpellCheck, Title, MessageBoxButtons.YesNoCancel); - if (result == DialogResult.Cancel) - { - return; - } - - if (result == DialogResult.No) - { - _spellCheckForm.Dispose(); - _spellCheckForm = new SpellCheck(); - _spellCheckForm.DoSpellCheck(autoDetect, _subtitle, dictionaryFolder, this, startFromLine); - } - else - { - _spellCheckForm.ContinueSpellCheck(_subtitle); - } - } - else - { - _spellCheckForm = new SpellCheck(); - _spellCheckForm.DoSpellCheck(autoDetect, _subtitle, dictionaryFolder, this, startFromLine); - } - } - } - catch (Exception ex) - { - MessageBox.Show(string.Format("{0}{1}{2}{3}{4}", ex.Source, Environment.NewLine, ex.Message, Environment.NewLine, ex.StackTrace), _title, MessageBoxButtons.OK, MessageBoxIcon.Error); - } - } - - public void ChangeWholeTextMainPart(ref int noOfChangedWords, ref bool firstChange, int i, Paragraph p) - { - SubtitleListview1.SetText(i, p.Text); - noOfChangedWords++; - if (firstChange) - { - MakeHistoryForUndo(_language.BeforeSpellCheck); - firstChange = false; - } - - if (tabControlSubtitle.SelectedIndex == TabControlSourceView) - { - ShowSource(); - } - else - { - RefreshSelectedParagraph(); - } - } - - public void DeleteLine() - { - MakeHistoryForUndo(Configuration.Settings.Language.Main.OneLineDeleted); - DeleteSelectedLines(); - } - - public void FocusParagraph(int index) - { - if (tabControlSubtitle.SelectedIndex == TabControlSourceView) - { - tabControlSubtitle.SelectedIndex = TabControlListView; - } - - if (tabControlSubtitle.SelectedIndex == TabControlListView) - { - SubtitleListview1.SelectIndexAndEnsureVisible(index, true); - } - } - - private void RefreshSelectedParagraph() - { - var idx = FirstSelectedIndex; - if (idx == -1 && _subtitle?.Paragraphs?.Count > 0) - { - idx = 0; - } - - var p = _subtitle.GetParagraphOrDefault(idx); - _subtitleListViewIndex = -1; - SubtitleListview1_SelectedIndexChanged(null, null); - if (p != null) - { - SubtitleListview1.SetStartTimeAndDuration(idx, p, _subtitle.GetParagraphOrDefault(idx + 1), _subtitle.GetParagraphOrDefault(idx - 1)); - } - } - - private void RefreshSelectedParagraphs() - { - foreach (var index in SubtitleListview1.GetSelectedIndices()) - { - var p = _subtitle.GetParagraphOrDefault(index); - if (p != null) - { - SubtitleListview1.SetStartTimeAndDuration(index, p, _subtitle.GetParagraphOrDefault(index + 1), _subtitle.GetParagraphOrDefault(index - 1)); - } - } - - _subtitleListViewIndex = -1; - SubtitleListview1_SelectedIndexChanged(null, null); - } - - private int GetPositionFromWordIndex(string text, int wordIndex) - { - var sb = new StringBuilder(); - int index = -1; - for (int i = 0; i < text.Length; i++) - { - if (SpellCheckWordLists.SplitChars.Contains(text[i])) - { - if (sb.Length > 0) - { - index++; - if (index == wordIndex) - { - int pos = i - sb.Length; - if (pos > 0) - { - pos--; - } - - if (pos >= 0) - { - return pos; - } - } - } - - sb.Clear(); - } - else - { - sb.Append(text[i]); - } - } - - if (sb.Length > 0) - { - index++; - if (index == wordIndex) - { - int pos = text.Length - 1 - sb.Length; - if (pos >= 0) - { - return pos; - } - } - } - - return 0; - } - - public void CorrectWord(string changeWord, Paragraph p, string oldWord, ref bool firstChange, int wordIndex) - { - if (oldWord != changeWord) - { - if (firstChange) - { - MakeHistoryForUndo(_language.BeforeSpellCheck); - firstChange = false; - } - - int startIndex = p.Text.IndexOf(oldWord, StringComparison.Ordinal); - if (wordIndex >= 0) - { - startIndex = p.Text.IndexOf(oldWord, GetPositionFromWordIndex(p.Text, wordIndex), StringComparison.Ordinal); - } - - while (startIndex >= 0 && startIndex < p.Text.Length && p.Text.Substring(startIndex).Contains(oldWord)) - { - bool startOk = startIndex == 0 || - "«»“” <>-—+/'\"[](){}¿¡….,;:!?%&$£\r\n؛،؟\u200E\u200F\u202A\u202B\u202C\u202D\u202E\u00C2\u00A0".Contains(p.Text[startIndex - 1]) || - char.IsPunctuation(p.Text[startIndex - 1]) || - startIndex == p.Text.Length - oldWord.Length; - if (startOk) - { - int end = startIndex + oldWord.Length; - if (end <= p.Text.Length && end == p.Text.Length || - "«»“” ,.!?:;'()<>\"-—+/[]{}%&$£…\r\n؛،؟\u200E\u200F\u202A\u202B\u202C\u202D\u202E\u00C2\u00A0".Contains(p.Text[end]) || - char.IsPunctuation(p.Text[end])) - { - var lengthBefore = p.Text.Length; - p.Text = p.Text.Remove(startIndex, oldWord.Length).Insert(startIndex, changeWord); - var lengthAfter = p.Text.Length; - if (lengthAfter > lengthBefore) - { - startIndex += (lengthAfter - lengthBefore); - } - } - } - - if (startIndex + 2 >= p.Text.Length) - { - startIndex = -1; - } - else - { - startIndex = p.Text.IndexOf(oldWord, startIndex + 2, StringComparison.Ordinal); - } - - // stop if using index - if (wordIndex >= 0) - { - startIndex = -1; - } - } - - ShowStatus(string.Format(_language.SpellCheckChangedXToY, oldWord, changeWord)); - SubtitleListview1.SetText(_subtitle.GetIndex(p), p.Text); - if (tabControlSubtitle.SelectedIndex == TabControlSourceView) - { - ShowSource(); - } - else - { - RefreshSelectedParagraph(); - } - } - } - - private void GetDictionariesToolStripMenuItem_Click(object sender, EventArgs e) - { - ShowGetDictionaries(); - } - - private void ShowGetDictionaries() - { - using (var form = new GetDictionaries()) - { - form.ShowDialog(this); - } - } - - private void ContextMenuStripListviewOpening(object sender, System.ComponentModel.CancelEventArgs e) - { - var format = GetCurrentSubtitleFormat(); - var formatType = format.GetType(); - var coordinates = SubtitleListview1.PointToClient(Cursor.Position); - var hitTest = SubtitleListview1.HitTest(coordinates); - if (coordinates.Y < 19 || (hitTest.Item != null && hitTest.Item.Index == 0 && coordinates.Y < hitTest.Item.Position.Y)) - { - e.Cancel = true; - var cm = new ContextMenuStrip(); - var contextMenuStripLvHeaderResizeToolStripMenuItem = new ToolStripMenuItem(Configuration.Settings.Language.Main.Menu.ContextMenu.SizeAllColumnsToFit); - contextMenuStripLvHeaderResizeToolStripMenuItem.Click += (sender2, e2) => { SubtitleListview1.AutoSizeColumns(); }; - cm.Items.Add(contextMenuStripLvHeaderResizeToolStripMenuItem); - - var tss = new ToolStripSeparator(); - UiUtil.FixFonts(tss); - cm.Items.Add(tss); - - // End time - var contextMenuStripLvHeaderEndTimeToolStripMenuItem = new ToolStripMenuItem(Configuration.Settings.Language.General.EndTime); - contextMenuStripLvHeaderEndTimeToolStripMenuItem.CheckOnClick = true; - contextMenuStripLvHeaderEndTimeToolStripMenuItem.Checked = Configuration.Settings.Tools.ListViewShowColumnEndTime; - contextMenuStripLvHeaderEndTimeToolStripMenuItem.Click += (sender2, e2) => - { - SubtitleListview1.BeginUpdate(); - Configuration.Settings.Tools.ListViewShowColumnEndTime = contextMenuStripLvHeaderEndTimeToolStripMenuItem.Checked; - if (Configuration.Settings.Tools.ListViewShowColumnEndTime) - { - SubtitleListview1.ShowEndColumn(Configuration.Settings.Language.General.EndTime); - } - else - { - SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.End); - } - - SaveSubtitleListviewIndices(); - UiUtil.InitializeSubtitleFont(SubtitleListview1); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - SubtitleListview1.EndUpdate(); - }; - cm.Items.Add(contextMenuStripLvHeaderEndTimeToolStripMenuItem); - - // Duration - var contextMenuStripLvHeaderDurationToolStripMenuItem = new ToolStripMenuItem(Configuration.Settings.Language.General.Duration); - contextMenuStripLvHeaderDurationToolStripMenuItem.CheckOnClick = true; - contextMenuStripLvHeaderDurationToolStripMenuItem.Checked = Configuration.Settings.Tools.ListViewShowColumnDuration; - contextMenuStripLvHeaderDurationToolStripMenuItem.Click += (sender2, e2) => - { - SubtitleListview1.BeginUpdate(); - Configuration.Settings.Tools.ListViewShowColumnDuration = contextMenuStripLvHeaderDurationToolStripMenuItem.Checked; - if (Configuration.Settings.Tools.ListViewShowColumnDuration) - { - SubtitleListview1.ShowDurationColumn(Configuration.Settings.Language.General.Duration); - } - else - { - SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.Duration); - } - - SaveSubtitleListviewIndices(); - UiUtil.InitializeSubtitleFont(SubtitleListview1); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - SubtitleListview1.EndUpdate(); - }; - cm.Items.Add(contextMenuStripLvHeaderDurationToolStripMenuItem); - - // CPS - var contextMenuStripLvHeaderCpsToolStripMenuItem = new ToolStripMenuItem(Configuration.Settings.Language.General.CharsPerSec); - contextMenuStripLvHeaderCpsToolStripMenuItem.CheckOnClick = true; - contextMenuStripLvHeaderCpsToolStripMenuItem.Checked = Configuration.Settings.Tools.ListViewShowColumnCharsPerSec; - contextMenuStripLvHeaderCpsToolStripMenuItem.Click += (sender2, e2) => - { - SubtitleListview1.BeginUpdate(); - Configuration.Settings.Tools.ListViewShowColumnCharsPerSec = contextMenuStripLvHeaderCpsToolStripMenuItem.Checked; - if (Configuration.Settings.Tools.ListViewShowColumnCharsPerSec) - { - SubtitleListview1.ShowCharsSecColumn(Configuration.Settings.Language.General.CharsPerSec); - } - else - { - SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.CharactersPerSeconds); - } - - SaveSubtitleListviewIndices(); - UiUtil.InitializeSubtitleFont(SubtitleListview1); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - SubtitleListview1.EndUpdate(); - }; - cm.Items.Add(contextMenuStripLvHeaderCpsToolStripMenuItem); - - // WPM - var contextMenuStripLvHeaderWpmToolStripMenuItem = new ToolStripMenuItem(Configuration.Settings.Language.General.WordsPerMin); - contextMenuStripLvHeaderWpmToolStripMenuItem.CheckOnClick = true; - contextMenuStripLvHeaderWpmToolStripMenuItem.Checked = Configuration.Settings.Tools.ListViewShowColumnWordsPerMin; - contextMenuStripLvHeaderWpmToolStripMenuItem.Click += (sender2, e2) => - { - SubtitleListview1.BeginUpdate(); - Configuration.Settings.Tools.ListViewShowColumnWordsPerMin = contextMenuStripLvHeaderWpmToolStripMenuItem.Checked; - if (Configuration.Settings.Tools.ListViewShowColumnWordsPerMin) - { - SubtitleListview1.ShowWordsMinColumn(Configuration.Settings.Language.General.WordsPerMin); - } - else - { - SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.WordsPerMinute); - } - - SaveSubtitleListviewIndices(); - UiUtil.InitializeSubtitleFont(SubtitleListview1); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - SubtitleListview1.EndUpdate(); - }; - cm.Items.Add(contextMenuStripLvHeaderWpmToolStripMenuItem); - - // GAP - var contextMenuStripLvHeaderGapToolStripMenuItem = new ToolStripMenuItem(Configuration.Settings.Language.General.Gap); - contextMenuStripLvHeaderGapToolStripMenuItem.CheckOnClick = true; - contextMenuStripLvHeaderGapToolStripMenuItem.Checked = Configuration.Settings.Tools.ListViewShowColumnGap; - contextMenuStripLvHeaderGapToolStripMenuItem.Click += (sender2, e2) => - { - SubtitleListview1.BeginUpdate(); - Configuration.Settings.Tools.ListViewShowColumnGap = contextMenuStripLvHeaderGapToolStripMenuItem.Checked; - if (Configuration.Settings.Tools.ListViewShowColumnGap) - { - SubtitleListview1.ShowGapColumn(Configuration.Settings.Language.General.Gap); - } - else - { - SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.Gap); - } - - SaveSubtitleListviewIndices(); - UiUtil.InitializeSubtitleFont(SubtitleListview1); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - SubtitleListview1.EndUpdate(); - }; - cm.Items.Add(contextMenuStripLvHeaderGapToolStripMenuItem); - - if (formatType == typeof(AdvancedSubStationAlpha) || formatType == typeof(SubStationAlpha) || formatType == typeof(CsvNuendo)) - { - // ACTOR - var actorTitle = formatType == typeof(CsvNuendo) ? Configuration.Settings.Language.General.Character : Configuration.Settings.Language.General.Actor; - var contextMenuStripLvHeaderActorToolStripMenuItem = new ToolStripMenuItem(actorTitle); - contextMenuStripLvHeaderActorToolStripMenuItem.CheckOnClick = true; - contextMenuStripLvHeaderActorToolStripMenuItem.Checked = Configuration.Settings.Tools.ListViewShowColumnActor; - contextMenuStripLvHeaderActorToolStripMenuItem.Click += (sender2, e2) => - { - SubtitleListview1.BeginUpdate(); - Configuration.Settings.Tools.ListViewShowColumnActor = contextMenuStripLvHeaderActorToolStripMenuItem.Checked; - if (Configuration.Settings.Tools.ListViewShowColumnActor) - { - SubtitleListview1.ShowActorColumn(actorTitle); - } - else - { - SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.Actor); - } - - SaveSubtitleListviewIndices(); - UiUtil.InitializeSubtitleFont(SubtitleListview1); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - SubtitleListview1.EndUpdate(); - }; - cm.Items.Add(contextMenuStripLvHeaderActorToolStripMenuItem); - } - - if (formatType == typeof(TimedText10)) - { - // REGION - var contextMenuStripLvHeaderRegionToolStripMenuItem = new ToolStripMenuItem(Configuration.Settings.Language.General.Region); - contextMenuStripLvHeaderRegionToolStripMenuItem.CheckOnClick = true; - contextMenuStripLvHeaderRegionToolStripMenuItem.Checked = Configuration.Settings.Tools.ListViewShowColumnRegion; - contextMenuStripLvHeaderRegionToolStripMenuItem.Click += (sender2, e2) => - { - SubtitleListview1.BeginUpdate(); - Configuration.Settings.Tools.ListViewShowColumnRegion = contextMenuStripLvHeaderRegionToolStripMenuItem.Checked; - if (Configuration.Settings.Tools.ListViewShowColumnRegion) - { - SubtitleListview1.ShowRegionColumn(Configuration.Settings.Language.General.Region); - } - else - { - SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.Region); - } - - SaveSubtitleListviewIndices(); - UiUtil.InitializeSubtitleFont(SubtitleListview1); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - SubtitleListview1.EndUpdate(); - }; - cm.Items.Add(contextMenuStripLvHeaderRegionToolStripMenuItem); - } - - cm.Show(SubtitleListview1, coordinates); - return; - } - - toolStripMenuItemPreview.Visible = formatType == typeof(WebVTT) && - !string.IsNullOrEmpty(VideoFileName) && - (VideoFileName.EndsWith(".mp4", StringComparison.OrdinalIgnoreCase) || VideoFileName.EndsWith(".m4v", StringComparison.OrdinalIgnoreCase) || VideoFileName.EndsWith(".webm", StringComparison.OrdinalIgnoreCase)) && - IsSubtitleLoaded; - - toolStripMenuItemSetRegion.Visible = false; - toolStripMenuItemSetLanguage.Visible = false; - List actors = null; - if ((formatType == typeof(AdvancedSubStationAlpha) || formatType == typeof(SubStationAlpha) || formatType == typeof(CsvNuendo)) && SubtitleListview1.SelectedItems.Count > 0) - { - actors = new List(); - toolStripMenuItemWebVTT.Visible = false; - var styles = AdvancedSubStationAlpha.GetStylesFromHeader(_subtitle.Header); - setStylesForSelectedLinesToolStripMenuItem.DropDownItems.Clear(); - foreach (var style in styles) - { - setStylesForSelectedLinesToolStripMenuItem.DropDownItems.Add(style, null, tsi_Click); - } - - setStylesForSelectedLinesToolStripMenuItem.Visible = styles.Count > 1; - toolStripMenuItemAssStyles.Visible = true; - if (formatType == typeof(AdvancedSubStationAlpha)) - { - toolStripMenuItemAssStyles.Text = _language.Menu.ContextMenu.AdvancedSubStationAlphaStyles; - setStylesForSelectedLinesToolStripMenuItem.Text = _language.Menu.ContextMenu.AdvancedSubStationAlphaSetStyle; - } - else - { - toolStripMenuItemAssStyles.Text = _language.Menu.ContextMenu.SubStationAlphaStyles; - setStylesForSelectedLinesToolStripMenuItem.Text = _language.Menu.ContextMenu.SubStationAlphaSetStyle; - } - - // actor - foreach (var p in _subtitle.Paragraphs) - { - if (!string.IsNullOrEmpty(p.Actor) && !actors.Contains(p.Actor)) - { - actors.Add(p.Actor); - } - - actors.Sort(); - } - - setActorForSelectedLinesToolStripMenuItem.DropDownItems.Clear(); - foreach (var actor in actors) - { - setActorForSelectedLinesToolStripMenuItem.DropDownItems.Add(actor, null, actor_Click); - } - - if (actors.Count > 0) - { - var tss = new ToolStripSeparator(); - UiUtil.FixFonts(tss); - setActorForSelectedLinesToolStripMenuItem.DropDownItems.Add(tss); - } - - setActorForSelectedLinesToolStripMenuItem.DropDownItems.Add(_language.Menu.ContextMenu.NewActor, null, SetNewActor); - if (actors.Count > 0) - { - setActorForSelectedLinesToolStripMenuItem.DropDownItems.Add(_language.Menu.ContextMenu.RemoveActors, null, RemoveActors); - } - } - else if (((formatType == typeof(TimedText10) && Configuration.Settings.SubtitleSettings.TimedText10ShowStyleAndLanguage) || formatType == typeof(ItunesTimedText)) && SubtitleListview1.SelectedItems.Count > 0) - { - toolStripMenuItemWebVTT.Visible = false; - toolStripMenuItemAssStyles.Text = _language.Menu.ContextMenu.TimedTextStyles; - var styles = TimedText10.GetStylesFromHeader(_subtitle.Header); - setStylesForSelectedLinesToolStripMenuItem.DropDownItems.Clear(); - foreach (var style in styles) - { - setStylesForSelectedLinesToolStripMenuItem.DropDownItems.Add(style, null, tsi_Click); - } - - setStylesForSelectedLinesToolStripMenuItem.Visible = styles.Count >= 1; - toolStripMenuItemAssStyles.Visible = true; - setStylesForSelectedLinesToolStripMenuItem.Text = _language.Menu.ContextMenu.TimedTextSetStyle; - - // regions - if (string.IsNullOrEmpty(_subtitle.Header) || !_subtitle.Header.Contains("http://www.w3.org/ns/ttml")) - { - _subtitle.Header = new TimedText10().ToText(_subtitle, string.Empty); - } - - var regions = TimedText10.GetRegionsFromHeader(_subtitle.Header); - toolStripMenuItemSetRegion.DropDownItems.Clear(); - toolStripMenuItemSetRegion.Text = _language.Menu.ContextMenu.TimedTextSetRegion; - if (regions.Count > 0) - { - toolStripMenuItemSetRegion.Visible = true; - foreach (var region in regions) - { - toolStripMenuItemSetRegion.DropDownItems.Add(region, null, SetRegionClick); - } - - toolStripMenuItemSetRegion.DropDownItems.Add("-"); - var clear = new ToolStripMenuItem(Configuration.Settings.Language.DvdSubRip.Clear); - toolStripMenuItemSetRegion.DropDownItems.Add(clear); - clear.Click += (sender2, e2) => - { - MakeHistoryForUndo("Set region: " + Configuration.Settings.Language.DvdSubRip.Clear); - foreach (int index in SubtitleListview1.SelectedIndices) - { - _subtitle.Paragraphs[index].Region = null; - SubtitleListview1.SetTimeAndText(index, _subtitle.Paragraphs[index], _subtitle.GetParagraphOrDefault(index + 1)); - } - }; - } - else - { - toolStripMenuItemSetRegion.Visible = false; - } - - // languages - var languages = TimedText10.GetUsedLanguages(_subtitle); - toolStripMenuItemSetLanguage.DropDownItems.Clear(); - toolStripMenuItemSetLanguage.Text = _language.Menu.ContextMenu.TimedTextSetLanguage; - toolStripMenuItemSetLanguage.Visible = true; - if (languages.Count > 0) - { - foreach (var language in languages) - { - toolStripMenuItemSetLanguage.DropDownItems.Add(language, null, AddLanguageClick); - } - - toolStripMenuItemSetLanguage.DropDownItems.Add("-"); - } - - var newItem = new ToolStripMenuItem(_language.New); - toolStripMenuItemSetLanguage.DropDownItems.Add(newItem); - newItem.Click += (senderNew, eNew) => - { - var moreLanguages = new List(); - foreach (CultureInfo x in CultureInfo.GetCultures(CultureTypes.NeutralCultures)) - { - var twoLetterLower = x.TwoLetterISOLanguageName.ToLowerInvariant(); - if (!languages.Contains(twoLetterLower) && - !languages.Contains(x.GetThreeLetterIsoLanguageName().ToLowerInvariant()) && - twoLetterLower != "iv") - { - moreLanguages.Add(x); - } - } - - moreLanguages = moreLanguages.OrderBy(p => p.TwoLetterISOLanguageName).ToList(); - using (var form = new TimedTextNewLanguage(moreLanguages, LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle))) - { - if (form.ShowDialog(this) == DialogResult.OK) - { - if (!string.IsNullOrEmpty(form.Language)) - { - MakeHistoryForUndo("Set language: " + form.Language); - foreach (int index in SubtitleListview1.SelectedIndices) - { - _subtitle.Paragraphs[index].Language = form.Language; - _subtitle.Paragraphs[index].Extra = TimedText10.SetExtra(_subtitle.Paragraphs[index]); - SubtitleListview1.SetExtraText(index, _subtitle.Paragraphs[index].Extra, SubtitleListview1.ForeColor); - } - } - } - } - }; - - if (languages.Count > 0) - { - var clearLanguage = new ToolStripMenuItem(Configuration.Settings.Language.DvdSubRip.Clear); - toolStripMenuItemSetLanguage.DropDownItems.Add(clearLanguage); - clearLanguage.Click += (sender2, e2) => - { - MakeHistoryForUndo("Set language: " + Configuration.Settings.Language.DvdSubRip.Clear); - foreach (int index in SubtitleListview1.SelectedIndices) - { - _subtitle.Paragraphs[index].Language = null; - _subtitle.Paragraphs[index].Extra = TimedText10.SetExtra(_subtitle.Paragraphs[index]); - SubtitleListview1.SetTimeAndText(index, _subtitle.Paragraphs[index], _subtitle.GetParagraphOrDefault(index + 1)); - } - }; - } - } - else if ((formatType == typeof(Sami) || formatType == typeof(SamiModern)) && SubtitleListview1.SelectedItems.Count > 0) - { - toolStripMenuItemWebVTT.Visible = false; - toolStripMenuItemAssStyles.Text = _language.Menu.ContextMenu.TimedTextStyles; - var styles = Sami.GetStylesFromHeader(_subtitle.Header); - setStylesForSelectedLinesToolStripMenuItem.DropDownItems.Clear(); - foreach (var style in styles) - { - setStylesForSelectedLinesToolStripMenuItem.DropDownItems.Add(style, null, tsi_Click); - } - - setStylesForSelectedLinesToolStripMenuItem.Visible = styles.Count > 1; - toolStripMenuItemAssStyles.Visible = false; - setStylesForSelectedLinesToolStripMenuItem.Text = _language.Menu.ContextMenu.SamiSetStyle; - } - else if (formatType == typeof(WebVTT) && SubtitleListview1.SelectedItems.Count > 0) - { - setStylesForSelectedLinesToolStripMenuItem.Visible = false; - toolStripMenuItemAssStyles.Visible = false; - toolStripMenuItemWebVTT.Visible = true; - var voices = WebVTT.GetVoices(_subtitle); - toolStripMenuItemWebVTT.DropDownItems.Clear(); - foreach (var style in voices) - { - toolStripMenuItemWebVTT.DropDownItems.Add(style, null, WebVTTSetVoice); - } - - toolStripMenuItemWebVTT.DropDownItems.Add(_language.Menu.ContextMenu.WebVTTSetNewVoice, null, WebVTTSetNewVoice); - if (voices.Count > 0) - { - toolStripMenuItemWebVTT.DropDownItems.Add(_language.Menu.ContextMenu.WebVTTRemoveVoices, null, WebVTTRemoveVoices); - } - } - else if ((format.Name == "Nuendo" && SubtitleListview1.SelectedItems.Count > 0)) - { - toolStripMenuItemWebVTT.Visible = false; - var styles = GetNuendoStyles(); - setStylesForSelectedLinesToolStripMenuItem.DropDownItems.Clear(); - foreach (var style in styles) - { - setStylesForSelectedLinesToolStripMenuItem.DropDownItems.Add(style, null, NuendoSetStyle); - } - - setStylesForSelectedLinesToolStripMenuItem.Visible = styles.Count > 1; - toolStripMenuItemAssStyles.Visible = false; - setStylesForSelectedLinesToolStripMenuItem.Text = _language.Menu.ContextMenu.NuendoSetStyle; - } - else - { - setStylesForSelectedLinesToolStripMenuItem.Visible = false; - toolStripMenuItemAssStyles.Visible = false; - toolStripMenuItemWebVTT.Visible = false; - } - - if (actors != null) - { - setActorForSelectedLinesToolStripMenuItem.Visible = true; - } - else - { - setActorForSelectedLinesToolStripMenuItem.Visible = false; - } - - if (formatType == typeof(Ebu)) - { - Ebu.EbuGeneralSubtitleInformation header; - if (_subtitle != null && _subtitle.Header != null && (_subtitle.Header.Contains("STL2") || _subtitle.Header.Contains("STL3"))) - { - header = Ebu.ReadHeader(Encoding.UTF8.GetBytes(_subtitle.Header)); - } - else - { - header = new Ebu.EbuGeneralSubtitleInformation(); - } - - var open = header.DisplayStandardCode != "1" && header.DisplayStandardCode != "2"; - boxToolStripMenuItem.Visible = open; - } - else - { - boxToolStripMenuItem.Visible = false; - } - - microsoftBingTranslateToolStripMenuItem.Visible = - !string.IsNullOrEmpty(Configuration.Settings.Tools.MicrosoftTranslatorApiKey) && - !string.IsNullOrEmpty(Configuration.Settings.Tools.MicrosoftTranslatorTokenEndpoint); - - toolStripMenuItemGoogleMicrosoftTranslateSelLine.Visible = false; - if (SubtitleListview1.SelectedItems.Count == 0) - { - contextMenuStripEmpty.Show(MousePosition.X, MousePosition.Y); - e.Cancel = true; - } - else - { - bool noNetWorkSession = _networkSession == null; - - toolStripMenuItemSaveSelectedLines.Visible = false; - toolStripMenuItemInsertBefore.Visible = true; - toolStripMenuItemInsertAfter.Visible = true; - toolStripMenuItemInsertSubtitle.Visible = noNetWorkSession; - toolStripMenuItemMergeLines.Visible = true; - mergeAfterToolStripMenuItem.Visible = true; - mergeBeforeToolStripMenuItem.Visible = true; - splitLineToolStripMenuItem.Visible = true; - toolStripSeparator7.Visible = true; - typeEffectToolStripMenuItem.Visible = noNetWorkSession; - karokeeEffectToolStripMenuItem.Visible = noNetWorkSession; - toolStripSeparatorAdvancedFunctions.Visible = noNetWorkSession; - adjustDisplayTimeForSelectedLinesToolStripMenuItem.Visible = true; - visualSyncSelectedLinesToolStripMenuItem.Visible = true; - toolStripMenuItemGoogleMicrosoftTranslateSelLine.Visible = false; - toolStripMenuItemUnbreakLines.Visible = true; - toolStripMenuItemAutoBreakLines.Visible = true; - toolStripSeparatorBreakLines.Visible = true; - toolStripMenuItemSurroundWithMusicSymbols.Visible = IsUnicode || Configuration.Settings.Tools.MusicSymbol == "#" || Configuration.Settings.Tools.MusicSymbol == "*"; - if (SubtitleListview1.SelectedItems.Count == 1) - { - toolStripMenuItemMergeLines.Visible = false; - visualSyncSelectedLinesToolStripMenuItem.Visible = false; - toolStripMenuItemUnbreakLines.Visible = false; - toolStripMenuItemAutoBreakLines.Visible = false; - toolStripSeparatorBreakLines.Visible = false; - if (_subtitleAlternate != null && noNetWorkSession && !string.IsNullOrEmpty(Configuration.Settings.Tools.MicrosoftBingApiId)) - { - toolStripMenuItemGoogleMicrosoftTranslateSelLine.Visible = true; - } - - toolStripMenuItemMergeDialog.Visible = false; - } - else if (SubtitleListview1.SelectedItems.Count == 2) - { - toolStripMenuItemInsertBefore.Visible = false; - toolStripMenuItemInsertAfter.Visible = false; - toolStripMenuItemInsertSubtitle.Visible = false; - mergeAfterToolStripMenuItem.Visible = false; - mergeBeforeToolStripMenuItem.Visible = false; - splitLineToolStripMenuItem.Visible = false; - toolStripMenuItemMergeDialog.Visible = true; - } - else if (SubtitleListview1.SelectedItems.Count >= 2) - { - toolStripMenuItemSaveSelectedLines.Visible = true; - toolStripMenuItemInsertBefore.Visible = false; - toolStripMenuItemInsertAfter.Visible = false; - toolStripMenuItemInsertSubtitle.Visible = false; - splitLineToolStripMenuItem.Visible = false; - mergeAfterToolStripMenuItem.Visible = false; - mergeBeforeToolStripMenuItem.Visible = false; - toolStripSeparator7.Visible = false; - - if (SubtitleListview1.SelectedItems.Count > 25) - { - toolStripMenuItemMergeLines.Visible = false; - } - else if (SubtitleListview1.SelectedItems.Count > 2) - { // only allow merge if text is not way too long - try - { - int totalLength = 0; - foreach (int index in SubtitleListview1.SelectedIndices) - { - totalLength += _subtitle.Paragraphs[index].Text.Length; - } - - if (totalLength > Configuration.Settings.General.SubtitleLineMaximumLength * 2.5) - { - toolStripMenuItemMergeLines.Visible = false; - } - } - catch - { - } - } - - toolStripMenuItemMergeDialog.Visible = false; - } - - if (formatType != typeof(SubRip)) - { - toolStripSeparatorAdvancedFunctions.Visible = SubtitleListview1.SelectedItems.Count == 1 && noNetWorkSession; - } - } - - toolStripMenuItemPasteSpecial.Visible = Clipboard.ContainsText(); - toolStripMenuItemSurroundWithMusicSymbols.Text = Configuration.Settings.Tools.MusicSymbol; - if (string.IsNullOrEmpty(Configuration.Settings.Tools.MusicSymbol)) - { - toolStripMenuItemSurroundWithMusicSymbols.Visible = false; - } - } - - private void tsi_Click(object sender, EventArgs e) - { - string style = (sender as ToolStripItem).Text; - if (!string.IsNullOrEmpty(style)) - { - MakeHistoryForUndo("Set style: " + style); - - var format = GetCurrentSubtitleFormat(); - var formatType = format.GetType(); - if ((formatType == typeof(TimedText10) || formatType == typeof(ItunesTimedText))) - { - foreach (int index in SubtitleListview1.SelectedIndices) - { - _subtitle.Paragraphs[index].Style = style; - _subtitle.Paragraphs[index].Extra = TimedText10.SetExtra(_subtitle.Paragraphs[index]); - SubtitleListview1.SetExtraText(index, _subtitle.Paragraphs[index].Extra, SubtitleListview1.ForeColor); - } - } - else - { - foreach (int index in SubtitleListview1.SelectedIndices) - { - _subtitle.Paragraphs[index].Extra = style; - SubtitleListview1.SetExtraText(index, style, SubtitleListview1.ForeColor); - } - } - } - } - - private void actor_Click(object sender, EventArgs e) - { - string actor = (sender as ToolStripItem).Text; - if (!string.IsNullOrEmpty(actor)) - { - MakeHistoryForUndo(Configuration.Settings.Language.Main.Menu.ContextMenu.SetActor + ": " + actor); - - foreach (int index in SubtitleListview1.SelectedIndices) - { - _subtitle.Paragraphs[index].Actor = actor; - SubtitleListview1.SetTimeAndText(index, _subtitle.Paragraphs[index], _subtitle.GetParagraphOrDefault(index + 1)); - } - } - } - - private void SetRegionClick(object sender, EventArgs e) - { - string region = (sender as ToolStripItem).Text; - if (!string.IsNullOrEmpty(region)) - { - MakeHistoryForUndo("Set region: " + region); - foreach (int index in SubtitleListview1.SelectedIndices) - { - _subtitle.Paragraphs[index].Region = region; - SubtitleListview1.SetTimeAndText(index, _subtitle.Paragraphs[index], _subtitle.GetParagraphOrDefault(index + 1)); - } - } - } - - private void AddLanguageClick(object sender, EventArgs e) - { - string lang = (sender as ToolStripItem).Text; - if (!string.IsNullOrEmpty(lang)) - { - MakeHistoryForUndo("Set language: " + lang); - foreach (int index in SubtitleListview1.SelectedIndices) - { - _subtitle.Paragraphs[index].Language = lang; - _subtitle.Paragraphs[index].Extra = TimedText10.SetExtra(_subtitle.Paragraphs[index]); - SubtitleListview1.SetExtraText(index, _subtitle.Paragraphs[index].Extra, SubtitleListview1.ForeColor); - } - } - } - - private void NuendoSetStyle(object sender, EventArgs e) - { - string style = (sender as ToolStripItem).Text; - if (!string.IsNullOrEmpty(style)) - { - int indexOfComment = style.IndexOf('['); - if (indexOfComment > 0) - { - style = style.Substring(0, indexOfComment).Trim(); - } - - MakeHistoryForUndo("Set style: " + style); - foreach (int index in SubtitleListview1.SelectedIndices) - { - _subtitle.Paragraphs[index].Extra = style; - _subtitle.Paragraphs[index].Actor = style; - SubtitleListview1.SetExtraText(index, style, SubtitleListview1.ForeColor); - } - } - } - - private void WebVTTSetVoice(object sender, EventArgs e) - { - string voice = (sender as ToolStripItem).Text; - if (!string.IsNullOrEmpty(voice)) - { - MakeHistoryForUndo("Set voice: " + voice); - foreach (int index in SubtitleListview1.SelectedIndices) - { - _subtitle.Paragraphs[index].Text = WebVTT.RemoveTag("v", _subtitle.Paragraphs[index].Text); - _subtitle.Paragraphs[index].Text = string.Format("{1}", voice, _subtitle.Paragraphs[index].Text); - SubtitleListview1.SetText(index, _subtitle.Paragraphs[index].Text); - } - - RefreshSelectedParagraph(); - } - } - - private void WebVTTSetNewVoice(object sender, EventArgs e) - { - using (var form = new TextPrompt(Configuration.Settings.Language.WebVttNewVoice.Title, Configuration.Settings.Language.WebVttNewVoice.VoiceName)) - { - if (form.ShowDialog(this) == DialogResult.OK) - { - string voice = form.InputText; - if (!string.IsNullOrEmpty(voice)) - { - foreach (int index in SubtitleListview1.SelectedIndices) - { - _subtitle.Paragraphs[index].Text = WebVTT.RemoveTag("v", _subtitle.Paragraphs[index].Text); - _subtitle.Paragraphs[index].Text = string.Format("{1}", voice, _subtitle.Paragraphs[index].Text); - SubtitleListview1.SetText(index, _subtitle.Paragraphs[index].Text); - } - - RefreshSelectedParagraph(); - } - } - } - } - - private void SetNewActor(object sender, EventArgs e) - { - using (var form = new TextPrompt(Configuration.Settings.Language.Main.Menu.ContextMenu.NewActor.Replace("...", string.Empty), Configuration.Settings.Language.General.Actor)) - { - if (form.ShowDialog(this) == DialogResult.OK) - { - string actor = form.InputText; - if (!string.IsNullOrEmpty(actor)) - { - foreach (int index in SubtitleListview1.SelectedIndices) - { - _subtitle.Paragraphs[index].Actor = actor; - SubtitleListview1.SetTimeAndText(index, _subtitle.Paragraphs[index], _subtitle.GetParagraphOrDefault(index + 1)); - } - } - } - } - } - - private void WebVTTRemoveVoices(object sender, EventArgs e) - { - foreach (int index in SubtitleListview1.SelectedIndices) - { - _subtitle.Paragraphs[index].Text = WebVTT.RemoveTag("v", _subtitle.Paragraphs[index].Text); - SubtitleListview1.SetText(index, _subtitle.Paragraphs[index].Text); - } - - RefreshSelectedParagraph(); - } - - private void RemoveActors(object sender, EventArgs e) - { - foreach (int index in SubtitleListview1.SelectedIndices) - { - _subtitle.Paragraphs[index].Actor = null; - SubtitleListview1.SetTimeAndText(index, _subtitle.Paragraphs[index], _subtitle.GetParagraphOrDefault(index + 1)); - } - } - - private void WebVTTSetVoiceTextBox(object sender, EventArgs e) - { - string voice = (sender as ToolStripItem).Text; - if (!string.IsNullOrEmpty(voice)) - { - var tb = GetFocusedTextBox(); - - if (tb.SelectionLength > 0) - { - string s = tb.SelectedText; - s = WebVTT.RemoveTag("v", s); - if (tb.SelectedText == tb.Text) - { - s = string.Format("{1}", voice, s); - } - else - { - s = string.Format("{1}", voice, s); - } - - tb.SelectedText = s; - } - } - } - - private void WebVTTSetNewVoiceTextBox(object sender, EventArgs e) - { - using (var form = new TextPrompt(Configuration.Settings.Language.WebVttNewVoice.Title, Configuration.Settings.Language.WebVttNewVoice.VoiceName)) - { - if (form.ShowDialog(this) == DialogResult.OK) - { - string voice = form.InputText; - if (!string.IsNullOrEmpty(voice)) - { - var tb = GetFocusedTextBox(); - - if (tb.SelectionLength > 0) - { - string s = tb.SelectedText; - s = WebVTT.RemoveTag("v", s); - if (tb.SelectedText == tb.Text) - { - s = string.Format("{1}", voice, s); - } - else - { - s = string.Format("{1}", voice, s); - } - - tb.SelectedText = s; - } - } - } - } - } - - private void BoldToolStripMenuItemClick(object sender, EventArgs e) - { - ListViewToggleTag(HtmlUtil.TagBold); - } - - private void ItalicToolStripMenuItemClick(object sender, EventArgs e) - { - ListViewToggleTag(HtmlUtil.TagItalic); - } - - private void UnderlineToolStripMenuItemClick(object sender, EventArgs e) - { - ListViewToggleTag(HtmlUtil.TagUnderline); - } - - private void ListViewToggleTag(string tag) - { - if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 0) - { - SubtitleListview1.SelectedIndexChanged -= SubtitleListview1_SelectedIndexChanged; - MakeHistoryForUndo(string.Format(_language.BeforeAddingTagX, tag)); - - var indices = new List(); - foreach (ListViewItem item in SubtitleListview1.SelectedItems) - { - indices.Add(item.Index); - } - - SubtitleListview1.BeginUpdate(); - foreach (int i in indices) - { - var p = _subtitle.GetParagraphOrDefault(i); - if (p != null) - { - if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) - { - var original = Utilities.GetOriginalParagraph(i, p, _subtitleAlternate.Paragraphs); - if (original != null) - { - original.Text = HtmlUtil.ToggleTag(original.Text, tag); - SubtitleListview1.SetAlternateText(i, original.Text); - } - } - - p.Text = HtmlUtil.ToggleTag(p.Text, tag); - SubtitleListview1.SetText(i, p.Text); - } - } - - SubtitleListview1.EndUpdate(); - - ShowStatus(string.Format(_language.TagXAdded, tag)); - ShowSource(); - RefreshSelectedParagraph(); - SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; - } - } - - private void ToolStripMenuItemDeleteClick(object sender, EventArgs e) - { - if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 0) - { - string statusText; - string historyText; - string askText; - - if (SubtitleListview1.SelectedItems.Count > 1) - { - statusText = string.Format(_language.XLinesDeleted, SubtitleListview1.SelectedItems.Count); - historyText = string.Format(_language.BeforeDeletingXLines, SubtitleListview1.SelectedItems.Count); - askText = string.Format(_language.DeleteXLinesPrompt, SubtitleListview1.SelectedItems.Count); - } - else - { - statusText = _language.OneLineDeleted; - historyText = _language.BeforeDeletingOneLine; - askText = _language.DeleteOneLinePrompt; - } - - if (Configuration.Settings.General.PromptDeleteLines && MessageBox.Show(askText, Title, MessageBoxButtons.YesNoCancel) != DialogResult.Yes) - { - _cutText = string.Empty; - return; - } - - if (!string.IsNullOrEmpty(_cutText)) - { - Clipboard.SetText(_cutText); - _cutText = string.Empty; - } - - MakeHistoryForUndo(historyText); - DeleteSelectedLines(); - - ResetTextInfoIfEmpty(); - - ShowStatus(statusText); - ShowSource(); - } - } - - private void ResetTextInfoIfEmpty() - { - if (_subtitle.Paragraphs.Count == 0) - { - labelStartTimeWarning.Text = string.Empty; - labelDurationWarning.Text = string.Empty; - _subtitleListViewIndex = -1; - textBoxListViewText.Text = string.Empty; - textBoxListViewTextAlternate.Text = string.Empty; - textBoxListViewText.Enabled = false; - textBoxListViewText.BackColor = SystemColors.ActiveBorder; - textBoxListViewTextAlternate.BackColor = SystemColors.ActiveBorder; - buttonSplitLine.Visible = false; - labelTextLineLengths.Text = string.Empty; - labelCharactersPerSecond.Text = string.Empty; - labelTextLineTotal.Text = string.Empty; - textBoxListViewText.Enabled = false; - labelSingleLine.Text = string.Empty; - labelSingleLinePixels.Text = string.Empty; - timeUpDownStartTime.TimeCode = new TimeCode(); - numericUpDownDuration.Value = 0; - ShowHideBookmark(new Paragraph()); - labelAlternateSingleLine.Text = string.Empty; - labelAlternateSingleLinePixels.Text = string.Empty; - textBoxListViewTextAlternate.Enabled = false; - labelAlternateCharactersPerSecond.Text = string.Empty; - labelTextAlternateLineLengths.Text = string.Empty; - labelTextAlternateLineTotal.Text = string.Empty; - } - } - - private void DeleteSelectedLines() - { - _subtitleListViewIndex = -1; - textBoxListViewText.Text = string.Empty; - textBoxListViewTextAlternate.Text = string.Empty; - if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) - { - var alternateIndices = new List(); - foreach (ListViewItem item in SubtitleListview1.SelectedItems) - { - var p = _subtitle.GetParagraphOrDefault(item.Index); - if (p != null) - { - var original = Utilities.GetOriginalParagraph(item.Index, p, _subtitleAlternate.Paragraphs); - if (original != null) - { - alternateIndices.Add(_subtitleAlternate.GetIndex(original)); - } - } - } - - alternateIndices.Reverse(); - foreach (int i in alternateIndices) - { - if (i < _subtitleAlternate.Paragraphs.Count) - { - _subtitleAlternate.Paragraphs.RemoveAt(i); - } - } - - _subtitleAlternate.Renumber(); - } - - var indices = new List(); - foreach (ListViewItem item in SubtitleListview1.SelectedItems) - { - indices.Add(item.Index); - } - - int firstIndex = SubtitleListview1.SelectedItems[0].Index; - - if (_networkSession != null) - { - _networkSession.TimerStop(); - NetworkGetSendUpdates(indices, 0, null); - } - else - { - indices.Reverse(); - foreach (int i in indices) - { - _subtitle.Paragraphs.RemoveAt(i); - } - - _subtitle.Renumber(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - if (SubtitleListview1.FirstVisibleIndex == 0) - { - SubtitleListview1.FirstVisibleIndex = -1; - } - - if (SubtitleListview1.Items.Count > firstIndex) - { - SubtitleListview1.SelectIndexAndEnsureVisible(firstIndex, true); - } - else if (SubtitleListview1.Items.Count > 0) - { - SubtitleListview1.SelectIndexAndEnsureVisible(SubtitleListview1.Items.Count - 1, true); - } - } - - ResetTextInfoIfEmpty(); - SetListViewStateImages(); - } - - private void ToolStripMenuItemInsertBeforeClick(object sender, EventArgs e) - { - if (_subtitle.Paragraphs.Count > 0) - { - InsertBefore(); - } - - textBoxListViewText.Focus(); - } - - private void InsertBefore() - { - MakeHistoryForUndo(_language.BeforeInsertLine); - - int firstSelectedIndex = 0; - if (SubtitleListview1.SelectedItems.Count > 0) - { - firstSelectedIndex = SubtitleListview1.SelectedItems[0].Index; - } - - int addMilliseconds = Configuration.Settings.General.MinimumMillisecondsBetweenLines + 1; - if (addMilliseconds < 1) - { - addMilliseconds = 1; - } - - var newParagraph = new Paragraph(); - - SetStyleForNewParagraph(newParagraph, firstSelectedIndex); - - var prev = _subtitle.GetParagraphOrDefault(firstSelectedIndex - 1); - var next = _subtitle.GetParagraphOrDefault(firstSelectedIndex); - if (prev != null && next != null) - { - newParagraph.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - addMilliseconds; - newParagraph.StartTime.TotalMilliseconds = newParagraph.EndTime.TotalMilliseconds - 2000; - if (newParagraph.StartTime.TotalMilliseconds <= prev.EndTime.TotalMilliseconds) - { - newParagraph.StartTime.TotalMilliseconds = prev.EndTime.TotalMilliseconds + 1; - } - - if (newParagraph.Duration.TotalMilliseconds < 100) - { - newParagraph.EndTime.TotalMilliseconds += 100; - } - - if (next.StartTime.IsMaxTime && prev.EndTime.IsMaxTime) - { - newParagraph.StartTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; - newParagraph.EndTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; - } - else if (next.StartTime.TotalMilliseconds == 0 && prev.EndTime.TotalMilliseconds == 0) - { - newParagraph.StartTime.TotalMilliseconds = 0; - newParagraph.EndTime.TotalMilliseconds = 0; - } - else if (prev.StartTime.TotalMilliseconds == next.StartTime.TotalMilliseconds && - prev.EndTime.TotalMilliseconds == next.EndTime.TotalMilliseconds) - { - newParagraph.StartTime.TotalMilliseconds = prev.StartTime.TotalMilliseconds; - newParagraph.EndTime.TotalMilliseconds = prev.EndTime.TotalMilliseconds; - } - } - else if (prev != null) - { - newParagraph.StartTime.TotalMilliseconds = prev.EndTime.TotalMilliseconds + addMilliseconds; - newParagraph.EndTime.TotalMilliseconds = newParagraph.StartTime.TotalMilliseconds + Configuration.Settings.General.NewEmptyDefaultMs; - if (newParagraph.StartTime.TotalMilliseconds > newParagraph.EndTime.TotalMilliseconds) - { - newParagraph.StartTime.TotalMilliseconds = prev.EndTime.TotalMilliseconds + 1; - } - } - else if (next != null) - { - newParagraph.StartTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - (2000 + Configuration.Settings.General.MinimumMillisecondsBetweenLines); - newParagraph.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; - - if (next.StartTime.IsMaxTime) - { - newParagraph.StartTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; - newParagraph.EndTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; - } - else if (next.StartTime.TotalMilliseconds == 0 && next.EndTime.TotalMilliseconds == 0) - { - newParagraph.StartTime.TotalMilliseconds = 0; - newParagraph.EndTime.TotalMilliseconds = 0; - } - } - else - { - newParagraph.StartTime.TotalMilliseconds = 1000; - newParagraph.EndTime.TotalMilliseconds = 3000; - if (newParagraph.Duration.TotalMilliseconds < Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds) - { - newParagraph.EndTime.TotalMilliseconds = newParagraph.StartTime.TotalMilliseconds + - Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds; - } - } - - if (_networkSession != null) - { - _networkSession.TimerStop(); - NetworkGetSendUpdates(new List(), firstSelectedIndex, newParagraph); - } - else - { - _subtitle.Paragraphs.Insert(firstSelectedIndex, newParagraph); - _subtitleListViewIndex = -1; - _subtitle.Renumber(); - - if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && SubtitleListview1.IsAlternateTextColumnVisible) - { - var currentOriginal = Utilities.GetOriginalParagraph(firstSelectedIndex, _subtitle.Paragraphs[firstSelectedIndex], _subtitleAlternate.Paragraphs); - if (currentOriginal != null) - { - _subtitleAlternate.Paragraphs.Insert(_subtitleAlternate.Paragraphs.IndexOf(currentOriginal), new Paragraph(newParagraph)); - } - else - { - _subtitleAlternate.InsertParagraphInCorrectTimeOrder(new Paragraph(newParagraph)); - } - - _subtitleAlternate.Renumber(); - } - - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - } - - SubtitleListview1.SelectIndexAndEnsureVisible(firstSelectedIndex, true); - ShowSource(); - ShowStatus(_language.LineInserted); - } - - private void ToolStripMenuItemInsertAfterClick(object sender, EventArgs e) - { - if (_subtitle.Paragraphs.Count > 0) - { - InsertAfter(string.Empty); - textBoxListViewText.Focus(); - } - } - - private void InsertAfter(string text) - { - MakeHistoryForUndo(_language.BeforeInsertLine); - - int firstSelectedIndex = 0; - if (SubtitleListview1.SelectedItems.Count > 0) - { - firstSelectedIndex = SubtitleListview1.SelectedItems[0].Index + 1; - } - - var newParagraph = new Paragraph { Text = text }; - - SetStyleForNewParagraph(newParagraph, firstSelectedIndex); - - var prev = _subtitle.GetParagraphOrDefault(firstSelectedIndex - 1); - var next = _subtitle.GetParagraphOrDefault(firstSelectedIndex); - if (prev != null) - { - int addMilliseconds = Configuration.Settings.General.MinimumMillisecondsBetweenLines; - if (addMilliseconds < 1) - { - addMilliseconds = 1; - } - - newParagraph.StartTime.TotalMilliseconds = prev.EndTime.TotalMilliseconds + addMilliseconds; - newParagraph.EndTime.TotalMilliseconds = newParagraph.StartTime.TotalMilliseconds + Configuration.Settings.General.NewEmptyDefaultMs; - if (next != null && newParagraph.EndTime.TotalMilliseconds > next.StartTime.TotalMilliseconds) - { - newParagraph.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; - } - - if (newParagraph.StartTime.TotalMilliseconds > newParagraph.EndTime.TotalMilliseconds) - { - newParagraph.StartTime.TotalMilliseconds = prev.EndTime.TotalMilliseconds + 1; - } - - if (next != null && next.StartTime.IsMaxTime && prev.EndTime.IsMaxTime) - { - newParagraph.StartTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; - newParagraph.EndTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; - } - else if (next != null && next.StartTime.TotalMilliseconds == 0 && prev.EndTime.TotalMilliseconds == 0) - { - newParagraph.StartTime.TotalMilliseconds = 0; - newParagraph.EndTime.TotalMilliseconds = 0; - } - else if (next == null && prev.EndTime.IsMaxTime) - { - newParagraph.StartTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; - newParagraph.EndTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; - } - else if (next == null && prev.EndTime.TotalMilliseconds == 0) - { - newParagraph.StartTime.TotalMilliseconds = 0; - newParagraph.EndTime.TotalMilliseconds = 0; - } - else if (next != null && - prev.StartTime.TotalMilliseconds == next.StartTime.TotalMilliseconds && - prev.EndTime.TotalMilliseconds == next.EndTime.TotalMilliseconds) - { - newParagraph.StartTime.TotalMilliseconds = prev.StartTime.TotalMilliseconds; - newParagraph.EndTime.TotalMilliseconds = prev.EndTime.TotalMilliseconds; - } - } - else if (next != null) - { - newParagraph.StartTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - 2000; - newParagraph.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - 1; - } - else - { - newParagraph.StartTime.TotalMilliseconds = 1000; - newParagraph.EndTime.TotalMilliseconds = 3000; - if (newParagraph.Duration.TotalMilliseconds < Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds) - { - newParagraph.EndTime.TotalMilliseconds = newParagraph.StartTime.TotalMilliseconds + - Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds; - } - } - - if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) - { - var currentOriginal = Utilities.GetOriginalParagraph(firstSelectedIndex - 1, _subtitle.Paragraphs[firstSelectedIndex - 1], _subtitleAlternate.Paragraphs); - if (currentOriginal != null) - { - _subtitleAlternate.Paragraphs.Insert(_subtitleAlternate.Paragraphs.IndexOf(currentOriginal) + 1, new Paragraph(newParagraph)); - } - else - { - _subtitleAlternate.InsertParagraphInCorrectTimeOrder(new Paragraph(newParagraph)); - } - - _subtitleAlternate.Renumber(); - } - - if (_networkSession != null) - { - _networkSession.TimerStop(); - NetworkGetSendUpdates(new List(), firstSelectedIndex, newParagraph); - } - else - { - _subtitle.Paragraphs.Insert(firstSelectedIndex, newParagraph); - _subtitle.Renumber(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - } - - SubtitleListview1.SelectIndexAndEnsureVisible(firstSelectedIndex, true); - ShowSource(); - ShowStatus(_language.LineInserted); - } - - private void SetStyleForNewParagraph(Paragraph newParagraph, int nearestIndex) - { - var format = GetCurrentSubtitleFormat(); - bool useExtraForStyle = format.HasStyleSupport; - var formatType = format.GetType(); - var styles = new List(); - if (formatType == typeof(AdvancedSubStationAlpha) || formatType == typeof(SubStationAlpha)) - { - styles = AdvancedSubStationAlpha.GetStylesFromHeader(_subtitle.Header); - } - else if (formatType == typeof(TimedText10) || formatType == typeof(ItunesTimedText)) - { - styles = TimedText10.GetStylesFromHeader(_subtitle.Header); - } - else if (formatType == typeof(Sami) || formatType == typeof(SamiModern)) - { - styles = Sami.GetStylesFromHeader(_subtitle.Header); - } - - string style = "Default"; - if (styles.Count > 0) - { - style = styles[0]; - } - - if (useExtraForStyle) - { - newParagraph.Extra = style; - if (format.GetType() == typeof(TimedText10) || format.GetType() == typeof(ItunesTimedText)) - { - if (styles.Count > 0) - { - newParagraph.Style = style; - } - - var c = _subtitle.GetParagraphOrDefault(nearestIndex); - if (c != null) - { - newParagraph.Style = c.Style; - newParagraph.Region = c.Region; - newParagraph.Language = c.Language; - } - - newParagraph.Extra = TimedText10.SetExtra(newParagraph); - } - } - } - - private void SubtitleListView1SelectedIndexChange() - { - StopAutoDuration(); - ShowLineInformationListView(); - if (_subtitle.Paragraphs.Count > 0) - { - int firstSelectedIndex = 0; - if (SubtitleListview1.SelectedItems.Count > 0) - { - firstSelectedIndex = SubtitleListview1.SelectedItems[0].Index; - } - - if (_subtitleListViewIndex >= 0) - { - if (_subtitleListViewIndex == firstSelectedIndex) - { - return; - } - - bool showSource = false; - - var last = _subtitle.GetParagraphOrDefault(_subtitleListViewIndex); - if (textBoxListViewText.Text != last.Text) - { - last.Text = textBoxListViewText.Text.TrimEnd(); - SubtitleListview1.SetText(_subtitleListViewIndex, last.Text); - showSource = true; - } - - var startTime = timeUpDownStartTime.TimeCode; - if (startTime != null) - { - if (Math.Abs(last.StartTime.TotalMilliseconds - startTime.TotalMilliseconds) > 0.5) - { - var dur = last.Duration.TotalMilliseconds; - last.StartTime.TotalMilliseconds = startTime.TotalMilliseconds; - last.EndTime.TotalMilliseconds = startTime.TotalMilliseconds + dur; - SubtitleListview1.SetStartTimeAndDuration(_subtitleListViewIndex, last, _subtitle.GetParagraphOrDefault(_subtitleListViewIndex + 1), _subtitle.GetParagraphOrDefault(_subtitleListViewIndex - 1)); - showSource = true; - } - } - - var duration = GetDurationInMilliseconds(); - if (duration > 0 && duration < 100000 && Math.Abs(duration - last.Duration.TotalMilliseconds) > 0.5) - { - last.EndTime.TotalMilliseconds = last.StartTime.TotalMilliseconds + duration; - SubtitleListview1.SetDuration(_subtitleListViewIndex, last, _subtitle.GetParagraphOrDefault(_subtitleListViewIndex + 1)); - showSource = true; - } - - if (showSource) - { - ShowSource(); - } - } - - var p = _subtitle.GetParagraphOrDefault(firstSelectedIndex); - if (p != null) - { - InitializeListViewEditBox(p); - _subtitleListViewIndex = firstSelectedIndex; - _oldSelectedParagraph = new Paragraph(p); - UpdateListViewTextInfo(labelTextLineLengths, labelSingleLine, labelSingleLinePixels, labelTextLineTotal, labelCharactersPerSecond, p, textBoxListViewText); - FixVerticalScrollBars(textBoxListViewText, ref _lastNumberOfNewLines); - - if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) - { - InitializeListViewEditBoxAlternate(p, firstSelectedIndex); - labelAlternateCharactersPerSecond.Left = textBoxListViewTextAlternate.Left + (textBoxListViewTextAlternate.Width - labelAlternateCharactersPerSecond.Width); - labelTextAlternateLineTotal.Left = textBoxListViewTextAlternate.Left + (textBoxListViewTextAlternate.Width - labelTextAlternateLineTotal.Width); - } - } - } - } - - private long _lastSubtitleListviewSelectedIndexChangedTick = -1; - private long _lastLastSubtitleListviewSelectedIndexChangedTick = -1; - - private void SubtitleListview1_SelectedIndexChanged(object sender, EventArgs e) - { - if (SubtitleListview1.SelectedIndices.Count == 0) - { - _listViewTextUndoIndex = -1; - return; - } - - if (DateTime.UtcNow.Ticks - _lastLastSubtitleListviewSelectedIndexChangedTick < 10000 * 50) // only if last change was less ago than 50 milliseconds - { - SubtitleListview1.SelectedIndexChanged -= SubtitleListview1_SelectedIndexChanged; - System.Threading.SynchronizationContext.Current.Post(TimeSpan.FromMilliseconds(50), () => - { - SubtitleListview1_SelectedIndexChanged(null, null); - SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; - }); - return; - } - - if (!_makeHistoryPaused) - { - _listViewTextTicks = 0; - _listViewAlternateTextTicks = 0; - TimerTextUndoTick(null, null); - TimerAlternateTextUndoTick(null, null); - } - - _listViewTextUndoIndex = -1; - SubtitleListView1SelectedIndexChange(); - if (_findHelper != null && !_findHelper.InProgress) - { - _findHelper.StartLineIndex = _subtitleListViewIndex; - _findHelper.SelectedIndex = _subtitleListViewIndex; - _findHelper.SelectedPosition = 0; - _findHelper.ReplaceFromPosition = 0; - _findHelper.MatchInOriginal = false; - } - - _lastLastSubtitleListviewSelectedIndexChangedTick = _lastSubtitleListviewSelectedIndexChangedTick; - _lastSubtitleListviewSelectedIndexChangedTick = DateTime.UtcNow.Ticks; - } - - private void ShowLineInformationListView() - { - var profile = Configuration.Settings.General.CurrentProfile + " "; - if (!ShowProfileInStatusBar) - { - profile = string.Empty; - } - - if (tabControlSubtitle.SelectedIndex == TabControlListView) - { - if (SubtitleListview1.SelectedItems.Count == 1) - { - toolStripSelected.Text = profile + string.Format("{0}/{1}", SubtitleListview1.SelectedItems[0].Index + 1, SubtitleListview1.Items.Count); - } - else - { - toolStripSelected.Text = profile + string.Format(_language.XLinesSelected, SubtitleListview1.SelectedItems.Count); - } - } - } - - private void UpdateListViewTextCharactersPerSeconds(Label charsPerSecond, Paragraph paragraph) - { - if (paragraph.Duration.TotalSeconds > 0) - { - double charactersPerSecond = Utilities.GetCharactersPerSecond(paragraph); - if (charactersPerSecond > Configuration.Settings.General.SubtitleMaximumCharactersPerSeconds && - Configuration.Settings.Tools.ListViewSyntaxColorDurationSmall) - { - charsPerSecond.ForeColor = Color.Red; - } - else - { - charsPerSecond.ForeColor = UiUtil.ForeColor; - } - - charsPerSecond.Text = string.Format(_language.CharactersPerSecond, charactersPerSecond); - } - else - { - if (Configuration.Settings.Tools.ListViewSyntaxColorDurationSmall) - { - charsPerSecond.ForeColor = UiUtil.ForeColor; - } - else - { - charsPerSecond.ForeColor = Color.Red; - } - - charsPerSecond.Text = string.Format(_language.CharactersPerSecond, _languageGeneral.NotAvailable); - } - } - - private void UpdateListViewTextInfo(Label lineLengths, Label singleLine, Label singleLinePixels, Label lineTotal, Label charactersPerSecond, Paragraph paragraph, SETextBox textBox) - { - if (paragraph == null) - { - return; - } - - bool textBoxHasFocus = textBox.Focused; - string text = paragraph.Text; - lineLengths.Text = _languageGeneral.SingleLineLengths.Trim(); - singleLine.Left = lineLengths.Left + lineLengths.Width - 3; - singleLinePixels.Left = lineLengths.Left + lineLengths.Width + 50; - text = HtmlUtil.RemoveHtmlTags(text, true); - text = NetflixImsc11Japanese.RemoveTags(text); - UiUtil.GetLineLengths(singleLine, text); - - if (Configuration.Settings.Tools.ListViewSyntaxColorWideLines) - { - UiUtil.GetLinePixelWidths(singleLinePixels, text); - labelSingleLinePixels.Visible = !(textBoxListViewText.Width / 3 < labelTextLineLengths.Width); - } - else - { - labelSingleLinePixels.Visible = false; - } - - buttonSplitLine.Visible = false; - - var s = text.Replace(Environment.NewLine, " "); - var len = text.CountCharacters(false, Configuration.Settings.General.IgnoreArabicDiacritics); - - int numberOfLines = Utilities.GetNumberOfLines(text.Trim()); - int maxLines = int.MaxValue; - if (Configuration.Settings.Tools.ListViewSyntaxMoreThanXLines) - { - maxLines = Configuration.Settings.General.MaxNumberOfLines; - } - - var splitLines = text.SplitToLines(); - if (numberOfLines <= maxLines) - { - if (len <= Configuration.Settings.General.SubtitleLineMaximumLength * Math.Max(numberOfLines, 2) && - splitLines.Count == 2 && splitLines[0].StartsWith('-') && splitLines[1].StartsWith('-') && - (splitLines[0].CountCharacters(false, Configuration.Settings.General.IgnoreArabicDiacritics) > Configuration.Settings.General.SubtitleLineMaximumLength || - splitLines[1].CountCharacters(false, Configuration.Settings.General.IgnoreArabicDiacritics) > Configuration.Settings.General.SubtitleLineMaximumLength)) - { - if (buttonUnBreak.Visible) - { - if (!textBoxHasFocus) - { - if (Configuration.Settings.Tools.ListViewSyntaxColorWideLines) - { - var totalLengthPixels = TextWidth.CalcPixelWidth(s); - lineTotal.Text = string.Format(_languageGeneral.TotalLengthX, string.Format("{0} {1}", len, totalLengthPixels)); - } - else - { - lineTotal.Text = string.Format(_languageGeneral.TotalLengthX, len); - } - } - - buttonSplitLine.Visible = true; - } - } - else if (len <= Configuration.Settings.General.SubtitleLineMaximumLength * Math.Max(numberOfLines, 2)) - { - lineTotal.ForeColor = UiUtil.ForeColor; - if (!textBoxHasFocus) - { - if (Configuration.Settings.Tools.ListViewSyntaxColorWideLines) - { - var totalLengthPixels = TextWidth.CalcPixelWidth(s); - lineTotal.Text = string.Format(_languageGeneral.TotalLengthX, string.Format("{0} {1}", len, totalLengthPixels)); - } - else - { - lineTotal.Text = string.Format(_languageGeneral.TotalLengthX, len); - } - } - } - else - { - lineTotal.ForeColor = Color.Red; - if (!textBoxHasFocus) - { - if (Configuration.Settings.Tools.ListViewSyntaxColorWideLines) - { - var totalLengthPixels = TextWidth.CalcPixelWidth(s); - lineTotal.Text = string.Format(_languageGeneral.TotalLengthXSplitLine, string.Format("{0} {1}", len, totalLengthPixels)); - } - else - { - lineTotal.Text = string.Format(_languageGeneral.TotalLengthXSplitLine, len); - } - } - - if (buttonUnBreak.Visible) - { - if (!textBoxHasFocus) - { - if (Configuration.Settings.Tools.ListViewSyntaxColorWideLines) - { - var totalLengthPixels = TextWidth.CalcPixelWidth(s); - lineTotal.Text = string.Format(_languageGeneral.TotalLengthX, string.Format("{0} {1}", len, totalLengthPixels)); - } - else - { - lineTotal.Text = string.Format(_languageGeneral.TotalLengthX, len); - } - } - - var lang = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle); - var abl = Utilities.AutoBreakLine(s, lang).SplitToLines(); - if (abl.Count > maxLines || abl.Any(li => li.CountCharacters(false, Configuration.Settings.General.IgnoreArabicDiacritics) > Configuration.Settings.General.SubtitleLineMaximumLength)) - { - buttonSplitLine.Visible = true; - } - } - } - } - else - { - if (!textBoxHasFocus) - { - if (Configuration.Settings.Tools.ListViewSyntaxColorWideLines) - { - var totalLengthPixels = TextWidth.CalcPixelWidth(s); - lineTotal.Text = string.Format(_languageGeneral.TotalLengthX, string.Format("{0} {1}", len, totalLengthPixels)); - } - else - { - lineTotal.Text = string.Format(_languageGeneral.TotalLengthX, len); - } - } - - var lang = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle); - var abl = Utilities.AutoBreakLine(s, lang).SplitToLines(); - if (abl.Count > maxLines || abl.Any(li => li.CountCharacters(false, Configuration.Settings.General.IgnoreArabicDiacritics) > Configuration.Settings.General.SubtitleLineMaximumLength) && - !textBoxListViewTextAlternate.Visible) - { - buttonSplitLine.Visible = true; - } - } - - UpdateListViewTextCharactersPerSeconds(charactersPerSecond, paragraph); - charactersPerSecond.Left = textBox.Left + (textBox.Width - labelCharactersPerSecond.Width); - lineTotal.Left = textBox.Left + (textBox.Width - lineTotal.Width); - } - - private void ButtonNextClick(object sender, EventArgs e) - { - MoveNextPrevious(0); - } - - private void ButtonPreviousClick(object sender, EventArgs e) - { - MoveNextPrevious(1); - } - - private void MoveNextPrevious(int firstSelectedIndex) - { - if (_subtitle.Paragraphs.Count == 0) - { - return; - } - - SubtitleListview1.SuspendLayout(); - var temp = firstSelectedIndex; - if (SubtitleListview1.SelectedItems.Count > 0) - { - firstSelectedIndex = SubtitleListview1.SelectedItems[0].Index; - } - - firstSelectedIndex = temp == 0 ? firstSelectedIndex + 1 : firstSelectedIndex - 1; - var p = _subtitle.GetParagraphOrDefault(firstSelectedIndex); - if (p != null) - { - SubtitleListview1.SelectIndexAndEnsureVisible(firstSelectedIndex, true); - } - - SubtitleListview1.ResumeLayout(); - } - - private void ButtonAutoBreakClick(object sender, EventArgs e) - { - string language = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle); - string languageOriginal = string.Empty; - if (_subtitleAlternate != null) - { - languageOriginal = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitleAlternate); - } - - var textCaretPos = textBoxListViewText.SelectionStart; - - if (SubtitleListview1.SelectedItems.Count > 1) - { - bool historyAdded = false; - SubtitleListview1.BeginUpdate(); - foreach (int index in SubtitleListview1.SelectedIndices) - { - var p = _subtitle.GetParagraphOrDefault(index); - if (p != null) - { - var oldText = p.Text; - var newText = Utilities.AutoBreakLine(p.Text, language); - if (oldText != newText) - { - if (!historyAdded) - { - historyAdded = true; - MakeHistoryForUndo(_language.Controls.AutoBreak.RemoveChar('&')); - } - - p.Text = newText; - SubtitleListview1.SetText(index, p.Text); - } - - if (_subtitleAlternate != null && SubtitleListview1.IsAlternateTextColumnVisible && Configuration.Settings.General.AllowEditOfOriginalSubtitle) - { - var original = Utilities.GetOriginalParagraph(index, p, _subtitleAlternate.Paragraphs); - if (original != null) - { - oldText = original.Text; - newText = Utilities.AutoBreakLine(original.Text, language); - if (oldText != newText) - { - if (!historyAdded) - { - historyAdded = true; - MakeHistoryForUndo(_language.Controls.AutoBreak.RemoveChar('&')); - } - - original.Text = newText; - SubtitleListview1.SetAlternateText(index, original.Text); - } - } - } - - SubtitleListview1.SyntaxColorLine(_subtitle.Paragraphs, index, p); - } - } - - SubtitleListview1.EndUpdate(); - RefreshSelectedParagraph(); - } - else - { - var fixedText = Utilities.AutoBreakLine(textBoxListViewText.Text, language); - var makeHistory = textBoxListViewText.Text != fixedText; - if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) - { - var alternateFixedText = Utilities.AutoBreakLine(textBoxListViewTextAlternate.Text, languageOriginal); - if (!makeHistory) - { - makeHistory = textBoxListViewTextAlternate.Text != alternateFixedText; - } - - if (makeHistory) - { - MakeHistoryForUndo(_language.Controls.AutoBreak.RemoveChar('&')); - textBoxListViewText.Text = fixedText; - } - - textBoxListViewTextAlternate.Text = alternateFixedText; - } - else if (makeHistory) - { - MakeHistoryForUndo(_language.Controls.AutoBreak.RemoveChar('&')); - textBoxListViewText.Text = fixedText; - } - } - - var s = textBoxListViewText.Text; - var startText = s.Substring(0, Math.Min(textCaretPos, s.Length)); - var numberOfNewLines = Utilities.CountTagInText(startText, Environment.NewLine); - textCaretPos += numberOfNewLines; - if (s.Length > textCaretPos && '\n' == s[textCaretPos]) - { - textCaretPos--; - } - - if (textCaretPos > 0) - { - textBoxListViewText.SelectionStart = textCaretPos; - } - } - - private int _lastNumberOfNewLines = -1; - private int _lastNumberOfNewLinesAlternate = -1; - - private static void FixVerticalScrollBars(SETextBox tb, ref int lastNumberOfNewLines) - { - var noOfNewLines = Utilities.GetNumberOfLines(tb.Text); - if (noOfNewLines == lastNumberOfNewLines) - { - return; - } - - lastNumberOfNewLines = noOfNewLines; - try - { - if (noOfNewLines <= 1 && tb.Text.Length <= 300 || TextRenderer.MeasureText(tb.Text, tb.Font).Height < tb.Height) - { - tb.ScrollBars = RichTextBoxScrollBars.None; - } - else - { - tb.ScrollBars = RichTextBoxScrollBars.Vertical; - } - } - catch - { - // ignored - } - } - - private void TextBoxListViewTextTextChanged(object sender, EventArgs e) - { - var idx = _subtitleListViewIndex; - if (idx < 0 || idx >= _subtitle.Paragraphs.Count) - { - return; - } - - // Writing when text is selected gives a double event + some trouble (typed letter disappears or a crash happens). - // This tries to fix this - changing scrollbars is bad during this double event!? - // Also check https://stackoverflow.com/questions/28331672/c-sharp-textchanged-event-fires-twice-in-a-multiline-textbox - if (textBoxListViewText.Text == string.Empty) - { - _subtitle.Paragraphs[idx].Text = string.Empty; - UpdateListViewTextInfo(labelTextLineLengths, labelSingleLine, labelSingleLinePixels, labelTextLineTotal, labelCharactersPerSecond, _subtitle.Paragraphs[idx], textBoxListViewText); - SubtitleListview1.SetText(idx, string.Empty); - _listViewTextUndoIndex = idx; - labelStatus.Text = string.Empty; - StartUpdateListSyntaxColoring(); - return; - } - - textBoxListViewText.TextChanged -= TextBoxListViewTextTextChanged; - if (_doAutoBreakOnTextChanged) - { - UiUtil.CheckAutoWrap(textBoxListViewText, new KeyEventArgs(Keys.None), Utilities.GetNumberOfLines(textBoxListViewText.Text)); - } - - // update _subtitle + listview - string text = textBoxListViewText.Text.TrimEnd(); - if (ContainsNonStandardNewLines(text)) - { - var lines = text.SplitToLines(); - text = string.Join(Environment.NewLine, lines); - textBoxListViewText.Text = text; - } - - if (idx < 0 || idx >= _subtitle.Paragraphs.Count) - { - return; - } - - _subtitle.Paragraphs[idx].Text = text; - UpdateListViewTextInfo(labelTextLineLengths, labelSingleLine, labelSingleLinePixels, labelTextLineTotal, labelCharactersPerSecond, _subtitle.Paragraphs[idx], textBoxListViewText); - SubtitleListview1.SetText(idx, text); - - _listViewTextUndoIndex = _subtitleListViewIndex; - labelStatus.Text = string.Empty; - - StartUpdateListSyntaxColoring(); - FixVerticalScrollBars(textBoxListViewText, ref _lastNumberOfNewLines); - textBoxListViewText.TextChanged += TextBoxListViewTextTextChanged; - } - - private bool ContainsNonStandardNewLines(string s) - { - if (Environment.NewLine == "\r\n") - { - int i = 0; - while (i < s.Length) - { - var ch = s[i]; - if (ch == '\r') - { - if (i >= s.Length - 1 || s[i + 1] != '\n') - { - return true; - } - - i++; - } - else if (ch == '\n') - { - return true; - } - - i++; - } - - return false; - } - else if (Environment.NewLine == "\n") - { - return s.Contains('\r'); - } - else - { - s = s.Replace(Environment.NewLine, string.Empty); - return s.Contains('\n') || s.Contains('\r'); - } - } - - private void TextBoxListViewTextAlternateTextChanged(object sender, EventArgs e) - { - if (_subtitleListViewIndex >= 0) - { - var p = _subtitle.GetParagraphOrDefault(_subtitleListViewIndex); - if (p == null) - { - return; - } - - var original = Utilities.GetOriginalParagraph(_subtitleListViewIndex, p, _subtitleAlternate.Paragraphs); - if (original != null) - { - if (textBoxListViewTextAlternate.Text == string.Empty) - { - UpdateListViewTextInfo(labelTextAlternateLineLengths, labelAlternateSingleLine, labelAlternateSingleLinePixels, labelTextAlternateLineTotal, labelAlternateCharactersPerSecond, original, textBoxListViewTextAlternate); - SubtitleListview1.SetAlternateText(_subtitleListViewIndex, string.Empty); - _listViewTextUndoIndex = _subtitleListViewIndex; - labelStatus.Text = string.Empty; - StartUpdateListSyntaxColoring(); - return; - } - - int numberOfNewLines = Utilities.GetNumberOfLines(textBoxListViewTextAlternate.Text); - UiUtil.CheckAutoWrap(textBoxListViewTextAlternate, new KeyEventArgs(Keys.None), numberOfNewLines); - - // update _subtitle + listview - string text = textBoxListViewTextAlternate.Text.TrimEnd(); - if (ContainsNonStandardNewLines(text)) - { - var lines = text.SplitToLines(); - text = string.Join(Environment.NewLine, lines); - textBoxListViewTextAlternate.Text = text; - } - - original.Text = text; - UpdateListViewTextInfo(labelTextAlternateLineLengths, labelAlternateSingleLine, labelAlternateSingleLinePixels, labelTextAlternateLineTotal, labelAlternateCharactersPerSecond, original, textBoxListViewTextAlternate); - SubtitleListview1.SetAlternateText(_subtitleListViewIndex, text); - _listViewTextUndoIndex = _subtitleListViewIndex; - } - - labelStatus.Text = string.Empty; - - StartUpdateListSyntaxColoring(); - FixVerticalScrollBars(textBoxListViewTextAlternate, ref _lastNumberOfNewLinesAlternate); - } - } - - private void TextBoxListViewTextKeyDown(object sender, KeyEventArgs e) - { - _listViewTextTicks = DateTime.UtcNow.Ticks; - - if (e.Modifiers == Keys.Shift && e.KeyCode == Keys.ShiftKey) - { - return; - } - - if (e.Modifiers == Keys.Control && e.KeyCode == (Keys.LButton | Keys.ShiftKey)) - { // surround ctrl+v action with history (for undo) - _listViewTextTicks = 0; - TimerTextUndoTick(sender, e); - Application.DoEvents(); - System.Threading.Thread.Sleep(50); - Application.DoEvents(); - _listViewTextTicks = 0; - TimerTextUndoTick(sender, e); - return; - } - - int numberOfLines = Utilities.GetNumberOfLines(textBoxListViewText.Text); - - if (e.Modifiers == Keys.None && e.KeyCode == Keys.Enter && numberOfLines > Configuration.Settings.General.MaxNumberOfLines) - { - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainTextBoxAutoBreak) - { - BreakUnbreakTextBox(false, textBoxListViewText); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainTextBoxUnbreak) - { - BreakUnbreakTextBox(true, textBoxListViewText); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainTextBoxBreakAtCursorPosition) - { - var text = Utilities.ReSplit(textBoxListViewText.Text, textBoxListViewText.SelectionStart); - if (text != textBoxListViewText.Text) - { - MakeHistoryForUndo(string.Format(_language.BeforeReplace, Configuration.Settings.Language.Settings.MainTextBoxAutoBreakFromPos)); - textBoxListViewText.Text = text; - var lines = textBoxListViewText.Text.SplitToLines(); - if (lines.Count > 0) - { - textBoxListViewText.SelectionStart = lines[0].Length; - } - } - - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainTextBoxBreakAtCursorPositionAndGoToNext) - { - var text = Utilities.ReSplit(textBoxListViewText.Text, textBoxListViewText.SelectionStart); - if (text != textBoxListViewText.Text) - { - MakeHistoryForUndo(string.Format(_language.BeforeReplace, Configuration.Settings.Language.Settings.MainTextBoxAutoBreakFromPosAndGoToNext)); - textBoxListViewText.Text = text; - ButtonNextClick(null, null); - } - - e.SuppressKeyPress = true; - } - else if (e.Modifiers == Keys.Alt && e.KeyCode == Keys.I) - { - if (textBoxListViewText.SelectionLength == 0) - { - if (textBoxListViewText.Text.Contains("", StringComparison.Ordinal)) - { - textBoxListViewText.Text = HtmlUtil.RemoveOpenCloseTags(textBoxListViewText.Text, HtmlUtil.TagItalic); - } - else - { - textBoxListViewText.Text = string.Format("{0}", textBoxListViewText.Text); - } - } - else - { - TextBoxListViewToggleTag(HtmlUtil.TagItalic); - e.SuppressKeyPress = true; - } - } - - if (e.Modifiers == Keys.Control && e.KeyCode == Keys.D) - { - textBoxListViewText.SelectionLength = 0; - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainTextBoxSplitAtCursor == e.KeyData) - { - ToolStripMenuItemSplitTextAtCursorClick(null, null); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainTextBoxSplitAtCursorAndVideoPos == e.KeyData) - { - toolStripMenuItemSplitViaWaveform_Click(null, null); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainTextBoxSplitSelectedLineBilingual == e.KeyData) - { - if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count >= 1 && SubtitleListview1.SelectedItems.Count < 10) - { - e.SuppressKeyPress = true; - SplitSelectedLineBilingual(); - } - } - else if (e.KeyData == _shortcuts.MainListViewAlignmentN1) - { - SetAlignment("{\\an1}", false); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainListViewAlignmentN2) - { - SetAlignment("", false); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainListViewAlignmentN3) - { - SetAlignment("{\\an3}", false); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainListViewAlignmentN4) - { - SetAlignment("{\\an4}", false); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainListViewAlignmentN5) - { - SetAlignment("{\\an5}", false); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainListViewAlignmentN6) - { - SetAlignment("{\\an6}", false); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainListViewAlignmentN7) - { - SetAlignment("{\\an7}", false); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainListViewAlignmentN8) - { - SetAlignment("{\\an8}", false); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainListViewAlignmentN9) - { - SetAlignment("{\\an9}", false); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainListViewToggleMusicSymbols) - { - textBoxListViewText.Text = ToogleMusicSymbols("♪", textBoxListViewText.Text); - } - else if (e.KeyData == _shortcuts.MainInsertBefore) - { - InsertBefore(); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainInsertAfter) - { - InsertAfter(string.Empty); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainListViewRemoveTimeCodes) - { - int i = _subtitleListViewIndex; - var p = _subtitle.GetParagraphOrDefault(i); - if (p != null) - { - p.StartTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; - p.EndTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; - RefreshSelectedParagraph(); - } - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainTextBoxSelectionToLower == e.KeyData && textBoxListViewText.SelectionLength > 0) // selection to lowercase - { - int start = textBoxListViewText.SelectionStart; - int length = textBoxListViewText.SelectionLength; - textBoxListViewText.SelectedText = textBoxListViewText.SelectedText.ToLowerInvariant(); - textBoxListViewText.SelectionStart = start; - textBoxListViewText.SelectionLength = length; - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainTextBoxSelectionToUpper == e.KeyData && textBoxListViewText.SelectionLength > 0) // selection to uppercase - { - int start = textBoxListViewText.SelectionStart; - int length = textBoxListViewText.SelectionLength; - textBoxListViewText.SelectedText = textBoxListViewText.SelectedText.ToUpperInvariant(); - textBoxListViewText.SelectionStart = start; - textBoxListViewText.SelectionLength = length; - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainTextBoxSelectionToggleCasing == e.KeyData && textBoxListViewText.SelectionLength > 0) // selection to uppercase - { - int start = textBoxListViewText.SelectionStart; - int length = textBoxListViewText.SelectionLength; - var text = ToggleCasing(textBoxListViewText.SelectedText); - textBoxListViewText.SelectedText = text; - textBoxListViewText.SelectionStart = start; - textBoxListViewText.SelectionLength = length; - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainTextBoxToggleAutoDuration == e.KeyData) // toggle auto-duration - { - if (timerAutoDuration.Enabled) - { - timerAutoDuration.Stop(); - labelAutoDuration.Visible = false; - } - else - { - timerAutoDuration.Start(); - labelAutoDuration.Visible = true; - } - - e.SuppressKeyPress = true; - } - - // last key down in text - _lastTextKeyDownTicks = DateTime.UtcNow.Ticks; - - UpdatePositionAndTotalLength(labelTextLineTotal, textBoxListViewText); - } - - private string ToggleCasing(string text) - { - if (string.IsNullOrWhiteSpace(text) || text.ToLower() == text.ToUpper()) - { - return text; - } - - var containsLowercase = false; - var containsUppercase = false; - for (var i = 0; i < text.Length; i++) - { - var ch = text[i]; - - if (!containsLowercase && char.IsLower(ch)) - { - containsLowercase = true; - } - - if (!containsUppercase && char.IsUpper(ch)) - { - containsUppercase = true; - } - - i++; - } - - if (containsUppercase && containsLowercase) - { - return text.ToUpperInvariant(); - } - - if (containsUppercase && !containsLowercase) - { - return text.ToLowerInvariant(); - } - - return System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(text); - } - - private void MoveFirstWordInNextUp(SETextBox tb) - { - int firstIndex = FirstSelectedIndex; - if (firstIndex >= 0) - { - var p = _subtitle.GetParagraphOrDefault(firstIndex); - var next = _subtitle.GetParagraphOrDefault(firstIndex + 1); - - if (tb == textBoxListViewTextAlternate) - { - p = Utilities.GetOriginalParagraph(firstIndex, p, _subtitleAlternate.Paragraphs); - next = Utilities.GetOriginalParagraph(firstIndex + 1, next, _subtitleAlternate.Paragraphs); - } - - if (p != null && next != null) - { - var moveUpDown = new MoveWordUpDown(p.Text, next.Text); - moveUpDown.MoveWordUp(); - if (moveUpDown.S1 != p.Text && moveUpDown.S2 != next.Text) - { - MakeHistoryForUndo(_language.BeforeLineUpdatedInListView); - p.Text = moveUpDown.S1; - next.Text = moveUpDown.S2; - if (tb == textBoxListViewTextAlternate) - { - SubtitleListview1.SetAlternateText(firstIndex, p.Text); - SubtitleListview1.SetAlternateText(firstIndex + 1, next.Text); - } - else - { - SubtitleListview1.SetText(firstIndex, p.Text); - SubtitleListview1.SetText(firstIndex + 1, next.Text); - } - var selectionStart = textBoxListViewText.SelectionStart; - tb.Text = p.Text; - if (selectionStart >= 0) - { - tb.SelectionStart = selectionStart; - } - } - } - } - } - - private void MoveLastWordDown(SETextBox tb) - { - int firstIndex = FirstSelectedIndex; - if (firstIndex >= 0) - { - var p = _subtitle.GetParagraphOrDefault(firstIndex); - var next = _subtitle.GetParagraphOrDefault(firstIndex + 1); - - if (tb == textBoxListViewTextAlternate) - { - p = Utilities.GetOriginalParagraph(firstIndex, p, _subtitleAlternate.Paragraphs); - next = Utilities.GetOriginalParagraph(firstIndex + 1, next, _subtitleAlternate.Paragraphs); - } - - if (p != null && next != null) - { - var moveUpDown = new MoveWordUpDown(p.Text, next.Text); - moveUpDown.MoveWordDown(); - if (moveUpDown.S1 != p.Text && moveUpDown.S2 != next.Text) - { - MakeHistoryForUndo(_language.BeforeLineUpdatedInListView); - p.Text = moveUpDown.S1; - next.Text = moveUpDown.S2; - if (tb == textBoxListViewTextAlternate) - { - SubtitleListview1.SetAlternateText(firstIndex, p.Text); - SubtitleListview1.SetAlternateText(firstIndex + 1, next.Text); - } - else - { - SubtitleListview1.SetText(firstIndex, p.Text); - SubtitleListview1.SetText(firstIndex + 1, next.Text); - } - var selectionStart = textBoxListViewText.SelectionStart; - tb.Text = p.Text; - if (selectionStart >= 0) - { - tb.SelectionStart = selectionStart; - } - } - } - } - } - - private void MakeAutoDurationSelectedLines() - { - if (_subtitle.Paragraphs.Count == 0) - { - return; - } - - if (SubtitleListview1.SelectedItems.Count == 1) - { - MakeAutoDuration(); - return; - } - - if (SubtitleListview1.SelectedItems.Count > 1) - { - MakeHistoryForUndo(_language.BeforeAutoDuration); - foreach (int index in SubtitleListview1.SelectedIndices) - { - var p = _subtitle.GetParagraphOrDefault(index); - if (p == null) - { - return; - } - - double duration = Utilities.GetOptimalDisplayMilliseconds(textBoxListViewText.Text); - var next = _subtitle.GetParagraphOrDefault(index + 1); - if (next != null && p.StartTime.TotalMilliseconds + duration + Configuration.Settings.General.MinimumMillisecondsBetweenLines > next.StartTime.TotalMilliseconds) - { - duration = next.StartTime.TotalMilliseconds - p.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; - } - - if (duration > 500) - { - p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + duration; - } - } - - SaveSubtitleListviewIndices(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - RefreshSelectedParagraph(); - } - } - - private void MakeAutoDuration() - { - int i = _subtitleListViewIndex; - var p = _subtitle.GetParagraphOrDefault(i); - if (p == null) - { - return; - } - - double duration = Utilities.GetOptimalDisplayMilliseconds(textBoxListViewText.Text); - var next = _subtitle.GetParagraphOrDefault(i + 1); - if (next != null && p.StartTime.TotalMilliseconds + duration + Configuration.Settings.General.MinimumMillisecondsBetweenLines > next.StartTime.TotalMilliseconds) - { - duration = next.StartTime.TotalMilliseconds - p.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; - if (duration < 400) - { - return; - } - } - - SetDurationInSeconds(duration / TimeCode.BaseUnit); - - p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + duration; - SubtitleListview1.SetDuration(i, p, _subtitle.GetParagraphOrDefault(i + 1)); - } - - private void SplitLineToolStripMenuItemClick(object sender, EventArgs e) - { - SplitSelectedParagraph(null, null); - } - - private void SplitSelectedParagraph(double? splitSeconds, int? textIndex) - { - string language = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle); - int? alternateTextIndex = null; - if (textBoxListViewTextAlternate.Focused) - { - alternateTextIndex = textIndex; - textIndex = null; - } - - if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 0) - { - SubtitleListview1.SelectedIndexChanged -= SubtitleListview1_SelectedIndexChanged; - MakeHistoryForUndo(_language.BeforeSplitLine); - - int firstSelectedIndex = SubtitleListview1.SelectedItems[0].Index; - - var currentParagraph = _subtitle.GetParagraphOrDefault(firstSelectedIndex); - var newParagraph = new Paragraph(currentParagraph); - newParagraph.NewSection = false; - - currentParagraph.Text = currentParagraph.Text.Replace("< /i>", ""); - currentParagraph.Text = currentParagraph.Text.Replace("< i>", ""); - string oldText = currentParagraph.Text; - var lines = currentParagraph.Text.SplitToLines(); - if (textIndex != null && textIndex.Value > 1 && textIndex.Value < oldText.Length - 1) - { - string a = oldText.Substring(0, textIndex.Value).Trim(); - string b = oldText.Substring(textIndex.Value).Trim(); - - if (oldText.TrimStart().StartsWith("", StringComparison.Ordinal) && oldText.TrimEnd().EndsWith("", StringComparison.Ordinal) && - Utilities.CountTagInText(oldText, "") == 1 && Utilities.CountTagInText(oldText, "") == 1) - { - a = a + ""; - b = "" + b; - } - else if (oldText.TrimStart().StartsWith("", StringComparison.Ordinal) && oldText.TrimEnd().EndsWith("", StringComparison.Ordinal) && - Utilities.CountTagInText(oldText, "") == 1 && Utilities.CountTagInText(oldText, "") == 1) - { - a = a + "
"; - b = "" + b; - } - - string aTrimmed = HtmlUtil.RemoveHtmlTags(a).TrimEnd('"').TrimEnd().TrimEnd('\'').TrimEnd(); - if (Configuration.Settings.General.SplitRemovesDashes && (aTrimmed.EndsWith('.') || aTrimmed.EndsWith('!') || aTrimmed.EndsWith('?') || aTrimmed.EndsWith('؟'))) - { - a = DialogSplitMerge.RemoveStartDash(a); - b = DialogSplitMerge.RemoveStartDash(b); - } - - currentParagraph.Text = Utilities.AutoBreakLine(a, language); - newParagraph.Text = Utilities.AutoBreakLine(b, language); - } - else - { - var l0 = string.Empty; - if (lines.Count > 0) - { - l0 = HtmlUtil.RemoveHtmlTags(lines[0], true).Trim().TrimEnd('"', '\'').TrimEnd(); - } - - if (lines.Count == 2 && (l0.EndsWith('.') || l0.EndsWith('!') || l0.EndsWith('?') || l0.EndsWith('؟'))) - { - currentParagraph.Text = Utilities.AutoBreakLine(lines[0], language); - newParagraph.Text = Utilities.AutoBreakLine(lines[1], language); - if (currentParagraph.Text.StartsWith("", StringComparison.Ordinal) && !currentParagraph.Text.Contains("") && - newParagraph.Text.EndsWith("", StringComparison.Ordinal) && !newParagraph.Text.Contains("")) - { - currentParagraph.Text = currentParagraph.Text + ""; - newParagraph.Text = "" + newParagraph.Text; - } - - if (currentParagraph.Text.StartsWith("", StringComparison.Ordinal) && !currentParagraph.Text.Contains("") && - newParagraph.Text.EndsWith("", StringComparison.Ordinal) && !newParagraph.Text.Contains("")) - { - currentParagraph.Text = currentParagraph.Text + ""; - newParagraph.Text = "" + newParagraph.Text; - } - - if (Configuration.Settings.General.SplitRemovesDashes) - { - currentParagraph.Text = DialogSplitMerge.RemoveStartDash(currentParagraph.Text); - newParagraph.Text = DialogSplitMerge.RemoveStartDash(newParagraph.Text); - } - } - else - { - string s = currentParagraph.Text; - var arr = HtmlUtil.RemoveHtmlTags(s, true).SplitToLines(); - if (arr.Count == 1 || arr.Count == 2 && (arr[0].Length > Configuration.Settings.General.SubtitleLineMaximumLength || arr[1].Length > Configuration.Settings.General.SubtitleLineMaximumLength)) - { - if (arr.Count == 2 && arr[0].StartsWith('-') && arr[1].StartsWith('-')) - { - if (lines[0].StartsWith("-", StringComparison.Ordinal)) - { - lines[0] = "" + lines[0].Remove(0, 4).TrimStart(); - } - - lines[0] = lines[0].TrimStart('-').TrimStart(); - lines[1] = lines[1].TrimStart('-').TrimStart(); - s = lines[0] + Environment.NewLine + lines[1]; - } - else - { - s = Utilities.AutoBreakLine(currentParagraph.Text, 5, Configuration.Settings.General.MergeLinesShorterThan, language); - } - } - - lines = s.SplitToLines(); - if (lines.Count == 1) - { - s = Utilities.AutoBreakLine(currentParagraph.Text, 3, 20, language); - lines = s.SplitToLines(); - } - - if (lines.Count == 1) - { - s = Utilities.AutoBreakLine(currentParagraph.Text, 3, 18, language); - lines = s.SplitToLines(); - } - - if (lines.Count == 1) - { - s = Utilities.AutoBreakLine(currentParagraph.Text, 3, 15, language); - lines = s.SplitToLines(); - } - - if (lines.Count == 2) - { - if (Utilities.CountTagInText(s, "") == 1 && lines[0].Contains("", StringComparison.Ordinal) && lines[1].Contains("", StringComparison.Ordinal)) - { - lines[0] += ""; - lines[1] = "" + lines[1]; - } - - currentParagraph.Text = Utilities.AutoBreakLine(lines[0], language); - newParagraph.Text = Utilities.AutoBreakLine(lines[1], language); - } - else if (lines.Count == 1) - { - currentParagraph.Text = Utilities.AutoBreakLine(lines[0], language); - newParagraph.Text = string.Empty; - } - else if (lines.Count == 3) - { - currentParagraph.Text = Utilities.AutoBreakLine(lines[0] + Environment.NewLine + lines[1], language); - newParagraph.Text = lines[2]; - } - else if (lines.Count > 3) - { - var half = lines.Count / 2; - var sb1 = new StringBuilder(); - for (int i = 0; i < half; i++) - { - sb1.AppendLine(lines[i]); - } - - currentParagraph.Text = Utilities.AutoBreakLine(sb1.ToString(), language); - sb1 = new StringBuilder(); - for (int i = half; i < lines.Count; i++) - { - sb1.AppendLine(lines[i]); - } - - newParagraph.Text = Utilities.AutoBreakLine(sb1.ToString(), language); - } - - if (currentParagraph.Text.Contains("", StringComparison.Ordinal) && !currentParagraph.Text.Contains("", StringComparison.Ordinal) && - newParagraph.Text.Contains("", StringComparison.Ordinal) && !newParagraph.Text.Contains("", StringComparison.Ordinal)) - { - currentParagraph.Text = currentParagraph.Text + ""; - newParagraph.Text = "" + newParagraph.Text; - } - - if (currentParagraph.Text.Contains("", StringComparison.Ordinal) && !currentParagraph.Text.Contains("", StringComparison.Ordinal) && - newParagraph.Text.Contains("", StringComparison.Ordinal) && !newParagraph.Text.Contains("")) - { - currentParagraph.Text = currentParagraph.Text + ""; - newParagraph.Text = "" + newParagraph.Text; - } - - if (currentParagraph.Text.StartsWith("-", StringComparison.Ordinal) && (currentParagraph.Text.EndsWith(".", StringComparison.Ordinal) || currentParagraph.Text.EndsWith("!", StringComparison.Ordinal)) && - newParagraph.Text.StartsWith("-", StringComparison.Ordinal) && (newParagraph.Text.EndsWith(".", StringComparison.Ordinal) || newParagraph.Text.EndsWith("!", StringComparison.Ordinal))) - { - currentParagraph.Text = currentParagraph.Text.Remove(3, 1); - newParagraph.Text = newParagraph.Text.Remove(3, 1); - } - } - } - - if (currentParagraph.Text.StartsWith(" ", StringComparison.Ordinal)) - { - currentParagraph.Text = currentParagraph.Text.Remove(3, 1); - } - - if (newParagraph.Text.StartsWith(" ", StringComparison.Ordinal)) - { - newParagraph.Text = newParagraph.Text.Remove(3, 1); - } - - var continuationStyle = Configuration.Settings.General.ContinuationStyle; - if (continuationStyle != ContinuationStyle.None) - { - if (language == "ar") - { - currentParagraph.Text = ContinuationUtilities.ConvertToForArabic(currentParagraph.Text); - newParagraph.Text = ContinuationUtilities.ConvertToForArabic(newParagraph.Text); - } - - var continuationProfile = ContinuationUtilities.GetContinuationProfile(continuationStyle); - if (ContinuationUtilities.ShouldAddSuffix(currentParagraph.Text, continuationProfile)) - { - currentParagraph.Text = ContinuationUtilities.AddSuffixIfNeeded(currentParagraph.Text, continuationProfile, false); - newParagraph.Text = ContinuationUtilities.AddPrefixIfNeeded(newParagraph.Text, continuationProfile, false); - } - - if (language == "ar") - { - currentParagraph.Text = ContinuationUtilities.ConvertBackForArabic(currentParagraph.Text); - newParagraph.Text = ContinuationUtilities.ConvertBackForArabic(newParagraph.Text); - } - } - - FixSplitItalicTag(currentParagraph, newParagraph); - FixSplitFontTag(currentParagraph, newParagraph); - SetSplitTime(splitSeconds, currentParagraph, newParagraph, oldText); - - if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) - { - var originalCurrent = Utilities.GetOriginalParagraph(firstSelectedIndex, currentParagraph, _subtitleAlternate.Paragraphs); - if (originalCurrent != null) - { - string languageOriginal = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitleAlternate); - - originalCurrent.EndTime.TotalMilliseconds = currentParagraph.EndTime.TotalMilliseconds; - var originalNew = new Paragraph(newParagraph); - originalNew.NewSection = false; - - lines = originalCurrent.Text.SplitToLines(); - - var l0Trimmed = string.Empty; - if (lines.Count > 0) - { - l0Trimmed = HtmlUtil.RemoveHtmlTags(lines[0]).TrimEnd('\'').TrimEnd('"'); - } - - oldText = originalCurrent.Text; - if (alternateTextIndex != null && alternateTextIndex.Value > 1 && alternateTextIndex.Value < oldText.Length - 1) - { - originalCurrent.Text = Utilities.AutoBreakLine(oldText.Substring(0, alternateTextIndex.Value).Trim(), language); - originalNew.Text = Utilities.AutoBreakLine(oldText.Substring(alternateTextIndex.Value).Trim(), language); - if (originalCurrent.Text.Contains("", StringComparison.Ordinal) && !originalCurrent.Text.Contains("", StringComparison.Ordinal) && - originalNew.Text.Contains("", StringComparison.Ordinal) && !originalNew.Text.Contains("", StringComparison.Ordinal)) - { - if (originalCurrent.Text.StartsWith("-", StringComparison.Ordinal) && (originalCurrent.Text.EndsWith(".", StringComparison.Ordinal) || originalCurrent.Text.EndsWith("?", StringComparison.Ordinal) || - originalCurrent.Text.EndsWith("!", StringComparison.Ordinal) || originalCurrent.Text.EndsWith("؟", StringComparison.Ordinal)) && originalNew.Text.StartsWith("-", StringComparison.Ordinal)) - { - originalCurrent.Text = "" + originalCurrent.Text.Remove(0, 4).Trim(); - originalNew.Text = originalNew.Text.TrimStart('-').Trim(); - } - - originalCurrent.Text = originalCurrent.Text + ""; - originalNew.Text = "" + originalNew.Text; - } - - if (originalCurrent.Text.Contains("", StringComparison.Ordinal) && !originalCurrent.Text.Contains("") && - originalNew.Text.Contains("", StringComparison.Ordinal) && !originalNew.Text.Contains("")) - { - originalCurrent.Text = originalCurrent.Text + ""; - originalNew.Text = "" + originalNew.Text; - } - - if (Configuration.Settings.General.SplitRemovesDashes && (l0Trimmed.EndsWith('.') || l0Trimmed.EndsWith('!') || l0Trimmed.EndsWith('?') || l0Trimmed.EndsWith('؟'))) - { - originalCurrent.Text = DialogSplitMerge.RemoveStartDash(originalCurrent.Text); - originalNew.Text = DialogSplitMerge.RemoveStartDash(originalNew.Text); - } - - lines.Clear(); - } - else if (lines.Count == 2 && (l0Trimmed.EndsWith('.') || l0Trimmed.EndsWith('!') || l0Trimmed.EndsWith('?') || l0Trimmed.EndsWith('؟'))) - { - string a = lines[0].Trim(); - string b = lines[1].Trim(); - if (oldText.TrimStart().StartsWith("", StringComparison.Ordinal) && oldText.TrimEnd().EndsWith("", StringComparison.Ordinal) && - Utilities.CountTagInText(oldText, "") == 1 && Utilities.CountTagInText(oldText, "") == 1) - { - a = a + ""; - b = "" + b; - } - - if (oldText.TrimStart().StartsWith("", StringComparison.Ordinal) && oldText.TrimEnd().EndsWith("", StringComparison.Ordinal) && - Utilities.CountTagInText(oldText, "") == 1 && Utilities.CountTagInText(oldText, "") == 1) - { - a = a + ""; - b = "" + b; - } - - if (Configuration.Settings.General.SplitRemovesDashes) - { - a = DialogSplitMerge.RemoveStartDash(a); - b = DialogSplitMerge.RemoveStartDash(b); - } - - lines[0] = a; - lines[1] = b; - originalCurrent.Text = Utilities.AutoBreakLine(a); - originalNew.Text = Utilities.AutoBreakLine(b); - } - else if (Utilities.GetNumberOfLines(originalCurrent.Text) == 2) - { - lines = originalCurrent.Text.SplitToLines(); - } - else - { - string s = Utilities.AutoBreakLine(originalCurrent.Text, 5, Configuration.Settings.General.MergeLinesShorterThan, languageOriginal); - lines = s.SplitToLines(); - } - - if (lines.Count == 1) - { - string s = Utilities.AutoBreakLine(lines[0], 3, 20, languageOriginal); - lines = s.SplitToLines(); - } - - if (lines.Count == 1) - { - string s = Utilities.AutoBreakLine(lines[0], 3, 18, languageOriginal); - lines = s.SplitToLines(); - } - - if (lines.Count == 1) - { - string s = Utilities.AutoBreakLine(lines[0], 3, 15, languageOriginal); - lines = s.SplitToLines(); - } - - if (lines.Count == 2) - { - string a = lines[0].Trim(); - string b = lines[1].Trim(); - if (oldText.TrimStart().StartsWith("", StringComparison.Ordinal) && oldText.TrimEnd().EndsWith("", StringComparison.Ordinal) && - Utilities.CountTagInText(oldText, "") == 1 && Utilities.CountTagInText(oldText, "") == 1) - { - a = a + ""; - b = "" + b; - } - - if (oldText.TrimStart().StartsWith("", StringComparison.Ordinal) && oldText.TrimEnd().EndsWith("", StringComparison.Ordinal) && - Utilities.CountTagInText(oldText, "") == 1 && Utilities.CountTagInText(oldText, "") == 1) - { - a = a + ""; - b = "" + b; - } - - if (Configuration.Settings.General.SplitRemovesDashes && (l0Trimmed.EndsWith('.') || l0Trimmed.EndsWith('!') || l0Trimmed.EndsWith('?') || l0Trimmed.EndsWith('؟'))) - { - a = DialogSplitMerge.RemoveStartDash(a); - b = DialogSplitMerge.RemoveStartDash(b); - } - - lines[0] = a; - lines[1] = b; - - originalCurrent.Text = Utilities.AutoBreakLine(lines[0]); - originalNew.Text = Utilities.AutoBreakLine(lines[1]); - } - else if (lines.Count == 1) - { - originalNew.Text = string.Empty; - } - - if (originalCurrent != null && originalNew != null) - { - if (originalCurrent.Text.StartsWith(" ", StringComparison.Ordinal)) - { - originalCurrent.Text = originalCurrent.Text.Remove(3, 1); - } - - if (originalNew.Text.StartsWith(" ", StringComparison.Ordinal)) - { - originalCurrent.Text = originalCurrent.Text.Remove(3, 1); - } - - if (continuationStyle != ContinuationStyle.None) - { - if (languageOriginal == "ar") - { - originalCurrent.Text = ContinuationUtilities.ConvertToForArabic(originalCurrent.Text); - originalNew.Text = ContinuationUtilities.ConvertToForArabic(originalNew.Text); - } - - var continuationProfile = ContinuationUtilities.GetContinuationProfile(continuationStyle); - if (ContinuationUtilities.ShouldAddSuffix(originalCurrent.Text, continuationProfile)) - { - originalCurrent.Text = ContinuationUtilities.AddSuffixIfNeeded(originalCurrent.Text, continuationProfile, false); - originalNew.Text = ContinuationUtilities.AddPrefixIfNeeded(originalNew.Text, continuationProfile, false); - } - - if (languageOriginal == "ar") - { - originalCurrent.Text = ContinuationUtilities.ConvertBackForArabic(originalCurrent.Text); - originalNew.Text = ContinuationUtilities.ConvertBackForArabic(originalNew.Text); - } - } - } - - _subtitleAlternate.InsertParagraphInCorrectTimeOrder(originalNew); - _subtitleAlternate.Renumber(); - FixSplitItalicTag(originalCurrent, originalNew); - FixSplitFontTag(originalCurrent, originalNew); - } - } - - if (_networkSession != null) - { - _networkSession.TimerStop(); - SetDurationInSeconds(currentParagraph.Duration.TotalSeconds); - _networkSession.UpdateLine(_subtitle.GetIndex(currentParagraph), currentParagraph); - NetworkGetSendUpdates(new List(), firstSelectedIndex + 1, newParagraph); - } - else - { - _subtitle.Paragraphs.Insert(firstSelectedIndex + 1, newParagraph); - _subtitle.Renumber(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - } - - SubtitleListview1.SelectIndexAndEnsureVisible(Configuration.Settings.General.SplitBehavior == 0 ? firstSelectedIndex + 1 : firstSelectedIndex, true); - ShowSource(); - ShowStatus(_language.LineSplitted); - SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; - RefreshSelectedParagraph(); - } - } - - private void FixSplitItalicTag(Paragraph currentParagraph, Paragraph nextParagraph) - { - if (currentParagraph == null || nextParagraph == null) - { - return; - } - - var startIdx = currentParagraph.Text.LastIndexOf("", StringComparison.OrdinalIgnoreCase); - if (startIdx >= 0 && - !currentParagraph.Text.Contains("", StringComparison.OrdinalIgnoreCase) && - nextParagraph.Text.Contains("", StringComparison.OrdinalIgnoreCase)) - { - var endIdx = currentParagraph.Text.IndexOf('>', startIdx); - if (endIdx >= 0) - { - var fontTag = currentParagraph.Text.Substring(startIdx, endIdx - startIdx + 1); - var pre = string.Empty; - if (currentParagraph.Text.StartsWith('{') && currentParagraph.Text.IndexOf('}') > 0) - { - var i = currentParagraph.Text.IndexOf('}'); - pre = currentParagraph.Text.Substring(0, i + 1); - currentParagraph.Text = currentParagraph.Text.Remove(0, i + 1); - } - - currentParagraph.Text = pre + currentParagraph.Text + ""; - nextParagraph.Text = pre + fontTag + nextParagraph.Text; - } - } - } - - private void FixSplitFontTag(Paragraph currentParagraph, Paragraph nextParagraph) - { - if (currentParagraph == null || nextParagraph == null) - { - return; - } - - var startIdx = currentParagraph.Text.LastIndexOf("= 0 && - !currentParagraph.Text.Contains("", StringComparison.OrdinalIgnoreCase) && - nextParagraph.Text.Contains("
", StringComparison.OrdinalIgnoreCase)) - { - var endIdx = currentParagraph.Text.IndexOf('>', startIdx); - if (endIdx >= 0) - { - var fontTag = currentParagraph.Text.Substring(startIdx, endIdx - startIdx + 1); - var pre = string.Empty; - if (currentParagraph.Text.StartsWith('{') && currentParagraph.Text.IndexOf('}') > 0) - { - var i = currentParagraph.Text.IndexOf('}'); - pre = currentParagraph.Text.Substring(0, i + 1); - currentParagraph.Text = currentParagraph.Text.Remove(0, i + 1); - } - - currentParagraph.Text = pre + currentParagraph.Text + "
"; - nextParagraph.Text = pre + fontTag + nextParagraph.Text; - } - } - } - - private void SetSplitTime(double? splitSeconds, Paragraph currentParagraph, Paragraph newParagraph, string oldText) - { - double middle = currentParagraph.StartTime.TotalMilliseconds + (currentParagraph.Duration.TotalMilliseconds / 2); - if (!string.IsNullOrWhiteSpace(HtmlUtil.RemoveHtmlTags(oldText))) - { - var lineOneTextNoHtml = HtmlUtil.RemoveHtmlTags(currentParagraph.Text, true).Replace(Environment.NewLine, string.Empty); - var lineTwoTextNoHtml = HtmlUtil.RemoveHtmlTags(newParagraph.Text, true).Replace(Environment.NewLine, string.Empty); - if (Math.Abs(lineOneTextNoHtml.Length - lineTwoTextNoHtml.Length) > 2) - { - // give more time to the paragraph with most text - var oldTextNoHtml = HtmlUtil.RemoveHtmlTags(oldText, true).Replace(Environment.NewLine, string.Empty); - var startFactor = (double)lineOneTextNoHtml.Length / oldTextNoHtml.Length; - if (startFactor < 0.25) - { - startFactor = 0.25; - } - - if (startFactor > 0.75) - { - startFactor = 0.75; - } - - middle = currentParagraph.StartTime.TotalMilliseconds + (currentParagraph.Duration.TotalMilliseconds * startFactor); - } - } - - if (currentParagraph.StartTime.IsMaxTime && currentParagraph.EndTime.IsMaxTime) - { - newParagraph.StartTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; - newParagraph.EndTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; - } - else - { - if (splitSeconds.HasValue && splitSeconds.Value > (currentParagraph.StartTime.TotalSeconds + 0.2) && splitSeconds.Value < (currentParagraph.EndTime.TotalSeconds - 0.2)) - { - middle = splitSeconds.Value * TimeCode.BaseUnit; - } - - newParagraph.EndTime.TotalMilliseconds = currentParagraph.EndTime.TotalMilliseconds; - currentParagraph.EndTime.TotalMilliseconds = middle; - newParagraph.StartTime.TotalMilliseconds = currentParagraph.EndTime.TotalMilliseconds + 1; - if (Configuration.Settings.General.MinimumMillisecondsBetweenLines > 0) - { - if (splitSeconds == null || Configuration.Settings.General.SplitBehavior == 1) - { - // SE decides split point (not user), so split gap time evenly - var halfGap = (int)Math.Round(Configuration.Settings.General.MinimumMillisecondsBetweenLines / 2.0); - currentParagraph.EndTime.TotalMilliseconds = currentParagraph.EndTime.TotalMilliseconds - halfGap; - } - else if (Configuration.Settings.General.SplitBehavior == 0) - { - currentParagraph.EndTime.TotalMilliseconds = currentParagraph.EndTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; - } - newParagraph.StartTime.TotalMilliseconds = currentParagraph.EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines; - } - } - } - - private void MergeBeforeToolStripMenuItemClick(object sender, EventArgs e) - { - if (SubtitleListview1.SelectedItems.Count >= 1) - { - var idx = SubtitleListview1.SelectedItems[0].Index; - if (idx > 0) - { - SubtitleListview1.SelectIndexAndEnsureVisible(idx - 1, true); - MergeAfterToolStripMenuItemClick(null, null); - } - } - } - - private void MergeSelectedLinesBilingual() - { - if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 1) - { - var sb1 = new StringBuilder(); - var sb2 = new StringBuilder(); - var deleteIndices = new List(); - bool first = true; - int firstIndex = 0; - double durationMilliseconds = 0; - int next = 0; - foreach (int index in SubtitleListview1.SelectedIndices) - { - if (first) - { - firstIndex = index; - next = index + 1; - first = !first; - } - else - { - deleteIndices.Add(index); - if (next != index) - { - return; - } - - next++; - } - - var arr = _subtitle.Paragraphs[index].Text.Trim().SplitToLines(); - if (arr.Count > 0) - { - int mid = (int)(arr.Count / 2); - for (var i = 0; i < arr.Count; i++) - { - var l = arr[i]; - if (i < mid) - { - sb1.Append(l + " "); - } - else - { - sb2.Append(l + " "); - } - } - } - - durationMilliseconds += _subtitle.Paragraphs[index].Duration.TotalMilliseconds; - } - - if (sb1.Length > 150 || sb2.Length > 150) - { - return; - } - - SubtitleListview1.SelectedIndexChanged -= SubtitleListview1_SelectedIndexChanged; - MakeHistoryForUndo(_language.BeforeMergeLines); - - var currentParagraph = _subtitle.Paragraphs[firstIndex]; - string text1 = sb1.ToString().TrimEnd(); - string text2 = sb2.ToString().TrimEnd(); - - currentParagraph.Text = text1 + Environment.NewLine + text2; - - //display time - currentParagraph.EndTime.TotalMilliseconds = currentParagraph.StartTime.TotalMilliseconds + durationMilliseconds; - - var nextParagraph = _subtitle.GetParagraphOrDefault(next); - if (nextParagraph != null && currentParagraph.EndTime.TotalMilliseconds > nextParagraph.StartTime.TotalMilliseconds && currentParagraph.StartTime.TotalMilliseconds < nextParagraph.StartTime.TotalMilliseconds) - { - currentParagraph.EndTime.TotalMilliseconds = nextParagraph.StartTime.TotalMilliseconds - 1; - } - - if (_networkSession != null) - { - _networkSession.TimerStop(); - _networkSession.UpdateLine(firstIndex, currentParagraph); - NetworkGetSendUpdates(deleteIndices, 0, null); - } - else - { - for (int i = deleteIndices.Count - 1; i >= 0; i--) - { - _subtitle.Paragraphs.RemoveAt(deleteIndices[i]); - } - - _subtitle.Renumber(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - } - - ShowSource(); - ShowStatus(_language.LinesMerged); - SubtitleListview1.SelectIndexAndEnsureVisible(firstIndex, true); - SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; - RefreshSelectedParagraph(); - } - } - - private void SplitSelectedLineBilingual() - { - var idx = FirstSelectedIndex; - if (_subtitle.Paragraphs.Count < 1 || idx < 0) - { - return; - } - - var p = _subtitle.GetParagraphOrDefault(idx); - if (p == null) - { - return; - } - - var tb = textBoxListViewText; - var lines = tb.Text.SplitToLines(); - if (lines.Count != 2 || tb.SelectionLength < 3 || lines[0].Length < 2 || lines[1].Length < 2) - { - return; - } - - var start = tb.SelectionStart; - var end = start + tb.SelectionLength; - var indexOfNewLine = tb.Text.IndexOf(Environment.NewLine, StringComparison.Ordinal); - if (end < indexOfNewLine || start > indexOfNewLine) - { - return; - } - - MakeHistoryForUndo(_language.BeforeSplitLine); - var oldText = p.Text; - string text1 = lines[0].Substring(0, start).Trim() + Environment.NewLine + lines[1].Substring(0, end - indexOfNewLine - 2).Trim(); - string text2 = lines[0].Remove(0, start).Trim() + Environment.NewLine + lines[1].Remove(0, end - indexOfNewLine - 2).Trim(); - var newParagraph = new Paragraph(p); - newParagraph.NewSection = false; - double? splitPos = null; - if (!string.IsNullOrEmpty(VideoFileName)) - { - splitPos = mediaPlayer.CurrentPosition; - } - - SetSplitTime(splitPos, p, newParagraph, oldText); - _subtitle.InsertParagraphInCorrectTimeOrder(newParagraph); - _subtitle.Renumber(); - if (Configuration.Settings.General.SplitBehavior > 0) - { - _subtitleListViewIndex = -1; - } - p.Text = text1; - newParagraph.Text = text2; - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - SubtitleListview1.SelectIndexAndEnsureVisible(idx, true); - } - - private void MergeSelectedLines(BreakMode breakMode = BreakMode.Normal) - { - if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 1) - { - var sb = new StringBuilder(); - var deleteIndices = new List(); - bool first = true; - int firstIndex = 0; - double endMilliseconds = 0; - int next = 0; - foreach (int index in SubtitleListview1.SelectedIndices) - { - if (first) - { - firstIndex = index; - next = index + 1; - first = !first; - } - else - { - deleteIndices.Add(index); - if (next != index) - { - return; - } - - next++; - } - - var continuationStyle = Configuration.Settings.General.ContinuationStyle; - if (continuationStyle != ContinuationStyle.None) - { - var continuationProfile = ContinuationUtilities.GetContinuationProfile(continuationStyle); - if (next < firstIndex + SubtitleListview1.SelectedIndices.Count) - { - var mergeResult = ContinuationUtilities.MergeHelper(_subtitle.Paragraphs[index].Text, _subtitle.Paragraphs[index + 1].Text, continuationProfile, LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle)); - _subtitle.Paragraphs[index].Text = mergeResult.Item1; - _subtitle.Paragraphs[index + 1].Text = mergeResult.Item2; - } - } - - var addText = _subtitle.Paragraphs[index].Text; - - if (firstIndex != index) - { - addText = RemoveAssStartAlignmentTag(addText); - } - - if (breakMode == BreakMode.UnbreakNoSpace) - { - sb.Append(addText); - } - else - { - sb.AppendLine(addText); - } - - endMilliseconds = _subtitle.Paragraphs[index].EndTime.TotalMilliseconds; - } - - if (sb.Length > 200) - { - return; - } - - SubtitleListview1.SelectedIndexChanged -= SubtitleListview1_SelectedIndexChanged; - MakeHistoryForUndo(_language.BeforeMergeLines); - - var currentParagraph = _subtitle.Paragraphs[firstIndex]; - string text = sb.ToString(); - text = HtmlUtil.FixInvalidItalicTags(text); - text = ChangeAllLinesTagsToSingleTag(text, "i"); - text = ChangeAllLinesTagsToSingleTag(text, "b"); - text = ChangeAllLinesTagsToSingleTag(text, "u"); - if (breakMode == BreakMode.Unbreak) - { - text = Utilities.UnbreakLine(text); - } - else if (breakMode == BreakMode.UnbreakNoSpace) - { - text = text.Replace(" " + Environment.NewLine + " ", string.Empty) - .Replace(Environment.NewLine + " ", string.Empty) - .Replace(" " + Environment.NewLine, string.Empty) - .Replace(Environment.NewLine, string.Empty); - } - else - { - text = Utilities.AutoBreakLine(text, LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle)); - } - - currentParagraph.Text = text; - - //display time - currentParagraph.EndTime.TotalMilliseconds = endMilliseconds; - - var nextParagraph = _subtitle.GetParagraphOrDefault(next); - if (nextParagraph != null && currentParagraph.EndTime.TotalMilliseconds > nextParagraph.StartTime.TotalMilliseconds && currentParagraph.StartTime.TotalMilliseconds < nextParagraph.StartTime.TotalMilliseconds) - { - currentParagraph.EndTime.TotalMilliseconds = nextParagraph.StartTime.TotalMilliseconds - 1; - } - - // original subtitle - if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) - { - var original = Utilities.GetOriginalParagraph(firstIndex, currentParagraph, _subtitleAlternate.Paragraphs); - if (original != null) - { - var originalTexts = new StringBuilder(); - originalTexts.Append(original.Text.TrimEnd()); - if (breakMode != BreakMode.UnbreakNoSpace) - { - originalTexts.Append(" "); - } - - for (int i = 0; i < deleteIndices.Count; i++) - { - var originalNext = Utilities.GetOriginalParagraph(deleteIndices[i], _subtitle.Paragraphs[deleteIndices[i]], _subtitleAlternate.Paragraphs); - if (originalNext != null) - { - if (breakMode == BreakMode.UnbreakNoSpace) - { - originalTexts.Append(originalNext.Text.Trim()); - } - else - { - originalTexts.Append(originalNext.Text + " "); - } - } - - } - - for (int i = deleteIndices.Count - 1; i >= 0; i--) - { - var originalNext = Utilities.GetOriginalParagraph(deleteIndices[i], _subtitle.Paragraphs[deleteIndices[i]], _subtitleAlternate.Paragraphs); - if (originalNext != null) - { - _subtitleAlternate.Paragraphs.Remove(originalNext); - } - } - - original.Text = originalTexts.ToString().Replace(" ", " "); - original.Text = ChangeAllLinesTagsToSingleTag(original.Text, "i"); - original.Text = ChangeAllLinesTagsToSingleTag(original.Text, "b"); - original.Text = ChangeAllLinesTagsToSingleTag(original.Text, "u"); - - if (breakMode == BreakMode.Unbreak) - { - original.Text = Utilities.UnbreakLine(original.Text); - } - else if (breakMode == BreakMode.UnbreakNoSpace) - { - original.Text = original.Text.Replace(" " + Environment.NewLine + " ", string.Empty) - .Replace(Environment.NewLine + " ", string.Empty) - .Replace(" " + Environment.NewLine, string.Empty) - .Replace(Environment.NewLine, string.Empty); - } - else - { - original.Text = Utilities.AutoBreakLine(original.Text, LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitleAlternate)); - } - - original.EndTime.TotalMilliseconds = currentParagraph.EndTime.TotalMilliseconds; - _subtitleAlternate.Renumber(); - } - } - - if (_networkSession != null) - { - _networkSession.TimerStop(); - _networkSession.UpdateLine(firstIndex, currentParagraph); - NetworkGetSendUpdates(deleteIndices, 0, null); - } - else - { - for (int i = deleteIndices.Count - 1; i >= 0; i--) - { - _subtitle.Paragraphs.RemoveAt(deleteIndices[i]); - } - - _subtitle.Renumber(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - } - - ShowSource(); - ShowStatus(_language.LinesMerged); - SubtitleListview1.SelectIndexAndEnsureVisible(firstIndex, true); - SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; - RefreshSelectedParagraph(); - } - } - - private void ExtendBeforeToolStripMenuItemClick(object sender, EventArgs e) - { - if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 0) - { - ExtendSelectedLinesToPreviousLine(); - } - } - - private void ExtendAfterToolStripMenuItemClick(object sender, EventArgs e) - { - if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 0) - { - ExtendSelectedLinesToNextLine(); - } - } - - private static string ChangeAllLinesTagsToSingleTag(string text, string tag) - { - if (!text.Contains("<" + tag + ">")) - { - return text; - } - - foreach (var line in text.SplitToLines()) - { - if (!line.TrimStart().StartsWith("<" + tag + ">", StringComparison.Ordinal) || !line.TrimEnd().EndsWith("", StringComparison.Ordinal)) - { - return text; - } - } - - return "<" + tag + ">" + HtmlUtil.RemoveOpenCloseTags(text, tag).Trim() + ""; - } - - private void MergeAfterToolStripMenuItemClick(object sender, EventArgs e) - { - if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 0) - { - if (SubtitleListview1.SelectedItems.Count > 2) - { - MergeSelectedLines(); - return; - } - - MergeWithLineAfter(false); - } - } - - public enum BreakMode - { - AutoBreak, - Normal, - Unbreak, - UnbreakNoSpace - } - - private void MergeWithLineAfter(bool insertDash, BreakMode breakMode = BreakMode.Normal) - { - var dialogHelper = new DialogSplitMerge { DialogStyle = Configuration.Settings.General.DialogStyle }; - int firstSelectedIndex = SubtitleListview1.SelectedItems[0].Index; - - var currentParagraph = _subtitle.GetParagraphOrDefault(firstSelectedIndex); - var nextParagraph = _subtitle.GetParagraphOrDefault(firstSelectedIndex + 1); - - if (nextParagraph != null && currentParagraph != null) - { - SubtitleListview1.SelectedIndexChanged -= SubtitleListview1_SelectedIndexChanged; - MakeHistoryForUndo(_language.BeforeMergeLines); - - var continuationStyle = Configuration.Settings.General.ContinuationStyle; - if (continuationStyle != ContinuationStyle.None) - { - var continuationProfile = ContinuationUtilities.GetContinuationProfile(continuationStyle); - var mergeResult = ContinuationUtilities.MergeHelper(currentParagraph.Text, nextParagraph.Text, continuationProfile, LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle)); - currentParagraph.Text = mergeResult.Item1; - nextParagraph.Text = mergeResult.Item2; - } - - if (_subtitleAlternate != null) - { - var original = Utilities.GetOriginalParagraph(firstSelectedIndex, currentParagraph, _subtitleAlternate.Paragraphs); - var originalNext = Utilities.GetOriginalParagraph(firstSelectedIndex + 1, nextParagraph, _subtitleAlternate.Paragraphs); - - if (original != null && originalNext != null) - { - if (continuationStyle != ContinuationStyle.None) - { - var continuationProfile = ContinuationUtilities.GetContinuationProfile(continuationStyle); - var mergeResult = ContinuationUtilities.MergeHelper(original.Text, originalNext.Text, continuationProfile, LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitleAlternate)); - original.Text = mergeResult.Item1; - originalNext.Text = mergeResult.Item2; - } - } - - if (originalNext != null) - { - if (original == null) - { - originalNext.StartTime.TotalMilliseconds = currentParagraph.StartTime.TotalMilliseconds; - originalNext.EndTime.TotalMilliseconds = nextParagraph.EndTime.TotalMilliseconds; - } - else - { - if (insertDash && !string.IsNullOrEmpty(original.Text) && !string.IsNullOrEmpty(originalNext.Text)) - { - string s = Utilities.UnbreakLine(original.Text); - original.Text = dialogHelper.InsertStartDash(s, 0); - - s = Utilities.UnbreakLine(originalNext.Text); - original.Text += Environment.NewLine + dialogHelper.InsertStartDash(s, 1); - - original.Text = original.Text.Replace("" + Environment.NewLine + "", Environment.NewLine).TrimEnd(); - } - else - { - string old1 = original.Text; - string old2 = originalNext.Text; - - if (breakMode == BreakMode.Unbreak) - { - original.Text = old1.Replace(Environment.NewLine, " "); - original.Text += Environment.NewLine + old2.Replace(Environment.NewLine, " "); - original.Text = Utilities.UnbreakLine(original.Text); - } - else if (breakMode == BreakMode.UnbreakNoSpace) - { - original.Text = old1.TrimEnd() + old2.TrimStart(); - } - else - { - original.Text = old1.Replace(Environment.NewLine, " "); - original.Text += Environment.NewLine + old2.Replace(Environment.NewLine, " "); - - if (old1.Contains(Environment.NewLine) || old2.Contains(Environment.NewLine) || - old1.Length > Configuration.Settings.General.SubtitleLineMaximumLength || old2.Length > Configuration.Settings.General.SubtitleLineMaximumLength) - { - original.Text = Utilities.AutoBreakLine(original.Text, LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitleAlternate)); - } - } - - original.Text = ChangeAllLinesTagsToSingleTag(original.Text, "i"); - original.Text = ChangeAllLinesTagsToSingleTag(original.Text, "b"); - original.Text = ChangeAllLinesTagsToSingleTag(original.Text, "u"); - - if (string.IsNullOrWhiteSpace(old1)) - { - original.Text = original.Text.TrimStart(); - } - - if (string.IsNullOrWhiteSpace(old2)) - { - original.Text = original.Text.TrimEnd(); - } - } - - original.EndTime = originalNext.EndTime; - _subtitleAlternate.Paragraphs.Remove(originalNext); - } - - _subtitleAlternate.Renumber(); - } - } - - if (insertDash && !string.IsNullOrEmpty(currentParagraph.Text) && !string.IsNullOrEmpty(nextParagraph.Text)) - { - string s = Utilities.UnbreakLine(currentParagraph.Text); - currentParagraph.Text = dialogHelper.InsertStartDash(s, 0); - - s = Utilities.UnbreakLine(RemoveAssStartAlignmentTag(nextParagraph.Text)); - currentParagraph.Text += Environment.NewLine + dialogHelper.InsertStartDash(s, 1); - - currentParagraph.Text = currentParagraph.Text.Replace("" + Environment.NewLine + "", Environment.NewLine).TrimEnd(); - } - else - { - string old1 = currentParagraph.Text; - string old2 = nextParagraph.Text; - if (breakMode == BreakMode.Unbreak) - { - currentParagraph.Text = currentParagraph.Text.Replace(Environment.NewLine, " "); - currentParagraph.Text += Environment.NewLine + nextParagraph.Text.Replace(Environment.NewLine, " "); - currentParagraph.Text = Utilities.UnbreakLine(RemoveAssStartAlignmentTag(currentParagraph.Text)); - } - else if (breakMode == BreakMode.UnbreakNoSpace) - { - currentParagraph.Text = currentParagraph.Text.TrimEnd() + RemoveAssStartAlignmentTag(nextParagraph.Text).TrimStart(); - } - else if (breakMode == BreakMode.AutoBreak) - { - currentParagraph.Text = currentParagraph.Text.Replace(Environment.NewLine, " "); - currentParagraph.Text += Environment.NewLine + RemoveAssStartAlignmentTag(nextParagraph.Text).Replace(Environment.NewLine, " "); - var language = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle); - currentParagraph.Text = Utilities.AutoBreakLine(currentParagraph.Text, language); - } - else - { - currentParagraph.Text = (currentParagraph.Text.Trim() + Environment.NewLine + - RemoveAssStartAlignmentTag(nextParagraph.Text).Trim()).Trim(); - } - - currentParagraph.Text = ChangeAllLinesTagsToSingleTag(currentParagraph.Text, "i"); - currentParagraph.Text = ChangeAllLinesTagsToSingleTag(currentParagraph.Text, "b"); - currentParagraph.Text = ChangeAllLinesTagsToSingleTag(currentParagraph.Text, "u"); - - if (old1.Contains(Environment.NewLine) || old2.Contains(Environment.NewLine) || - old1.Length > Configuration.Settings.General.SubtitleLineMaximumLength || old2.Length > Configuration.Settings.General.SubtitleLineMaximumLength) - { - currentParagraph.Text = Utilities.AutoBreakLine(currentParagraph.Text, LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle)); - } - - if (string.IsNullOrWhiteSpace(old1) && old2 != null) - { - currentParagraph.Text = old2.Trim(); - } - - if (string.IsNullOrWhiteSpace(old2) && old1 != null) - { - currentParagraph.Text = old1.Trim(); - } - } - - currentParagraph.EndTime.TotalMilliseconds = nextParagraph.EndTime.TotalMilliseconds; - - if (_networkSession != null) - { - _networkSession.TimerStop(); - SetDurationInSeconds(currentParagraph.Duration.TotalSeconds); - _networkSession.UpdateLine(_subtitle.GetIndex(currentParagraph), currentParagraph); - var deleteIndices = new List(); - deleteIndices.Add(_subtitle.GetIndex(nextParagraph)); - NetworkGetSendUpdates(deleteIndices, 0, null); - } - else - { - _subtitle.Paragraphs.Remove(nextParagraph); - _subtitle.Renumber(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - } - - ShowSource(); - ShowStatus(_language.LinesMerged); - SubtitleListview1.SelectIndexAndEnsureVisible(firstSelectedIndex, true); - SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; - RefreshSelectedParagraph(); - SubtitleListview1.SelectIndexAndEnsureVisible(firstSelectedIndex, true); - } - } - - private static string RemoveAssStartAlignmentTag(string text) - { - var s = text.TrimStart(); - if (s.StartsWith("{\\an") && s.Length > 5 && s[5] == '}') - { - s = s.Remove(0, 6); - } - return s; - } - - private void UpdateStartTimeInfo(TimeCode startTime) - { - if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 0 && startTime != null) - { - UpdateOverlapErrors(startTime); - - // update _subtitle + listview - var p = _subtitle.Paragraphs[_subtitleListViewIndex]; - p.EndTime.TotalMilliseconds += (startTime.TotalMilliseconds - p.StartTime.TotalMilliseconds); - p.StartTime = startTime; - SubtitleListview1.SetStartTimeAndDuration(_subtitleListViewIndex, p, _subtitle.GetParagraphOrDefault(_subtitleListViewIndex + 1), _subtitle.GetParagraphOrDefault(_subtitleListViewIndex - 1)); - StartUpdateListSyntaxColoring(); - } - } - - private void StartUpdateListSyntaxColoring() - { - if (!_timerDoSyntaxColoring.Enabled) - { - _timerDoSyntaxColoring.Start(); - } - } - - private void UpdateListSyntaxColoring() - { - if (_loading || _subtitle == null || _subtitleListViewIndex < 0 || _subtitleListViewIndex >= _subtitle.Paragraphs.Count) - { - return; - } - - SubtitleListview1.SyntaxColorLine(_subtitle.Paragraphs, _subtitleListViewIndex, _subtitle.Paragraphs[_subtitleListViewIndex]); - var idx = _subtitleListViewIndex + 1; - var p = _subtitle.GetParagraphOrDefault(idx); - if (p != null) - { - SubtitleListview1.SyntaxColorLine(_subtitle.Paragraphs, idx, p); - } - - idx = _subtitleListViewIndex - 1; - p = _subtitle.GetParagraphOrDefault(idx); - if (p != null) - { - SubtitleListview1.SyntaxColorLine(_subtitle.Paragraphs, idx, p); - } - } - - private void UpdateOverlapErrors(TimeCode startTime) - { - string startTimeWarning = string.Empty; - string durationWarning = string.Empty; - if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 0 && startTime != null) - { - int firstSelectedIndex = SubtitleListview1.SelectedItems[0].Index; - - var prevParagraph = _subtitle.GetParagraphOrDefault(firstSelectedIndex - 1); - if (prevParagraph != null && !prevParagraph.EndTime.IsMaxTime && prevParagraph.EndTime.TotalMilliseconds > startTime.TotalMilliseconds && Configuration.Settings.Tools.ListViewSyntaxColorOverlap) - { - startTimeWarning = string.Format(_languageGeneral.OverlapPreviousLineX, prevParagraph.EndTime.TotalSeconds - startTime.TotalSeconds); - } - - var nextParagraph = _subtitle.GetParagraphOrDefault(firstSelectedIndex + 1); - if (nextParagraph != null) - { - double durationMilliSeconds = GetDurationInMilliseconds(); - if (startTime.TotalMilliseconds + durationMilliSeconds > nextParagraph.StartTime.TotalMilliseconds && - Configuration.Settings.Tools.ListViewSyntaxColorOverlap && - !startTime.IsMaxTime) - { - durationWarning = string.Format(_languageGeneral.OverlapX, ((startTime.TotalMilliseconds + durationMilliSeconds) - nextParagraph.StartTime.TotalMilliseconds) / TimeCode.BaseUnit); - } - - if (startTimeWarning.Length == 0 && - startTime.TotalMilliseconds > nextParagraph.StartTime.TotalMilliseconds && - Configuration.Settings.Tools.ListViewSyntaxColorOverlap && - !startTime.IsMaxTime) - { - double di = (startTime.TotalMilliseconds - nextParagraph.StartTime.TotalMilliseconds) / TimeCode.BaseUnit; - startTimeWarning = string.Format(_languageGeneral.OverlapNextX, di); - } - else if (numericUpDownDuration.Value < 0) - { - durationWarning = _languageGeneral.Negative; - } - } - } - - labelStartTimeWarning.Text = startTimeWarning; - labelDurationWarning.Text = durationWarning; - } - - private double _durationMsInitialValue = 0; - private bool _durationIsDirty = false; - - private double GetDurationInMilliseconds() - { - if (!_durationIsDirty) - { - return _durationMsInitialValue; - } - - if (Configuration.Settings.General.UseTimeFormatHHMMSSFF) - { - var seconds = (int)numericUpDownDuration.Value; - var frames = (int)Math.Round((Convert.ToDouble(numericUpDownDuration.Value) % 1.0 * 100.0)); - return seconds * TimeCode.BaseUnit + frames * (TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate); - } - - return ((double)numericUpDownDuration.Value * TimeCode.BaseUnit); - } - - private bool _skipDurationChangedEvent = false; - private void SetDurationInSeconds(double seconds) - { - _durationIsDirty = false; - _durationMsInitialValue = seconds * 1000.0; - if (Configuration.Settings.General.UseTimeFormatHHMMSSFF) - { - var wholeSeconds = (int)seconds; - var frames = SubtitleFormat.MillisecondsToFrames(seconds % 1.0 * TimeCode.BaseUnit); - var extraSeconds = (int)(frames / Configuration.Settings.General.CurrentFrameRate); - var restFrames = (int)(frames % Configuration.Settings.General.CurrentFrameRate); - var v = (decimal)(wholeSeconds + extraSeconds + restFrames / 100.0); - if (v >= numericUpDownDuration.Minimum && v <= numericUpDownDuration.Maximum) - { - _skipDurationChangedEvent = true; - numericUpDownDuration.Value = (decimal)(wholeSeconds + extraSeconds + restFrames / 100.0); - _skipDurationChangedEvent = false; - - int firstSelectedIndex = SubtitleListview1.SelectedItems[0].Index; - var currentParagraph = _subtitle.GetParagraphOrDefault(firstSelectedIndex); - if (currentParagraph != null) - { - UpdateOverlapErrors(timeUpDownStartTime.TimeCode); - UpdateListViewTextCharactersPerSeconds(labelCharactersPerSecond, currentParagraph); - - if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) - { - var original = Utilities.GetOriginalParagraph(firstSelectedIndex, currentParagraph, _subtitleAlternate.Paragraphs); - if (original != null) - { - original.EndTime.TotalMilliseconds = currentParagraph.EndTime.TotalMilliseconds; - UpdateListViewTextCharactersPerSeconds(labelAlternateCharactersPerSecond, original); - } - } - - SubtitleListview1.SetDuration(firstSelectedIndex, currentParagraph, _subtitle.GetParagraphOrDefault(firstSelectedIndex + 1)); - StartUpdateListSyntaxColoring(); - } - } - } - else - { - var d = (decimal)seconds; - if (d > numericUpDownDuration.Maximum) - { - numericUpDownDuration.Value = numericUpDownDuration.Maximum; - } - else if (d < numericUpDownDuration.Minimum) - { - numericUpDownDuration.Value = numericUpDownDuration.Minimum; - } - else - { - numericUpDownDuration.Value = d; - } - } - } - - private void NumericUpDownDurationValueChanged(object sender, EventArgs e) - { - if (_skipDurationChangedEvent) - { - return; - } - - _durationIsDirty = true; - if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 0) - { - int firstSelectedIndex = SubtitleListview1.SelectedItems[0].Index; - - var currentParagraph = _subtitle.GetParagraphOrDefault(firstSelectedIndex); - if (currentParagraph != null) - { - // update _subtitle + listview - string oldDuration = currentParagraph.Duration.ToString(); - - var temp = new Paragraph(currentParagraph); - - if (Configuration.Settings.General.UseTimeFormatHHMMSSFF) - { - var seconds = (int)numericUpDownDuration.Value; - var frames = Convert.ToInt32((numericUpDownDuration.Value - seconds) * 100); - if (frames > Math.Round(Configuration.Settings.General.CurrentFrameRate) - 1) - { - numericUpDownDuration.ValueChanged -= NumericUpDownDurationValueChanged; - if (frames >= 99) - { - numericUpDownDuration.Value = (decimal)(seconds + (Math.Round((Configuration.Settings.General.CurrentFrameRate - 1)) / 100.0)); - } - else - { - numericUpDownDuration.Value = seconds + 1; - } - - numericUpDownDuration.ValueChanged += NumericUpDownDurationValueChanged; - } - } - - temp.EndTime.TotalMilliseconds = currentParagraph.StartTime.TotalMilliseconds + GetDurationInMilliseconds(); - - MakeHistoryForUndoOnlyIfNotResent(string.Format(_language.DisplayTimeAdjustedX, "#" + currentParagraph.Number + ": " + oldDuration + " -> " + temp.Duration)); - - currentParagraph.EndTime.TotalMilliseconds = temp.EndTime.TotalMilliseconds; - SubtitleListview1.SetDuration(firstSelectedIndex, currentParagraph, _subtitle.GetParagraphOrDefault(firstSelectedIndex + 1)); - - UpdateOverlapErrors(timeUpDownStartTime.TimeCode); - UpdateListViewTextCharactersPerSeconds(labelCharactersPerSecond, currentParagraph); - - if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) - { - var original = Utilities.GetOriginalParagraph(firstSelectedIndex, currentParagraph, _subtitleAlternate.Paragraphs); - if (original != null) - { - original.EndTime.TotalMilliseconds = currentParagraph.EndTime.TotalMilliseconds; - UpdateListViewTextCharactersPerSeconds(labelAlternateCharactersPerSecond, original); - } - } - - StartUpdateListSyntaxColoring(); - } - - labelStatus.Text = string.Empty; - StartUpdateListSyntaxColoring(); - } - } - - private void InitializeListViewEditBoxAlternate(Paragraph p, int firstSelectedIndex) - { - if (_subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) - { - var original = Utilities.GetOriginalParagraph(firstSelectedIndex, p, _subtitleAlternate.Paragraphs); - if (original == null) - { - textBoxListViewTextAlternate.Enabled = false; - textBoxListViewTextAlternate.Text = string.Empty; - labelAlternateCharactersPerSecond.Text = string.Empty; - } - else - { - textBoxListViewTextAlternate.Enabled = true; - textBoxListViewTextAlternate.TextChanged -= TextBoxListViewTextAlternateTextChanged; - textBoxListViewTextAlternate.Text = original.Text; - textBoxListViewTextAlternate.TextChanged += TextBoxListViewTextAlternateTextChanged; - UpdateListViewTextCharactersPerSeconds(labelAlternateCharactersPerSecond, original); - _listViewAlternateTextUndoLast = original.Text; - } - } - } - - private void InitializeListViewEditBox(Paragraph p) - { - textBoxListViewText.TextChanged -= TextBoxListViewTextTextChanged; - textBoxListViewText.Text = p.Text; - textBoxListViewText.TextChanged += TextBoxListViewTextTextChanged; - _listViewTextUndoLast = p.Text; - - timeUpDownStartTime.MaskedTextBox.TextChanged -= MaskedTextBoxTextChanged; - timeUpDownStartTime.TimeCode = p.StartTime; - timeUpDownStartTime.MaskedTextBox.TextChanged += MaskedTextBoxTextChanged; - - numericUpDownDuration.ValueChanged -= NumericUpDownDurationValueChanged; - if (p.Duration.TotalSeconds > (double)numericUpDownDuration.Maximum) - { - SetDurationInSeconds((double)numericUpDownDuration.Maximum); - } - else - { - SetDurationInSeconds(p.Duration.TotalSeconds); - } - - numericUpDownDuration.ValueChanged += NumericUpDownDurationValueChanged; - - UpdateOverlapErrors(timeUpDownStartTime.TimeCode); - UpdateListViewTextCharactersPerSeconds(labelCharactersPerSecond, p); - if (_subtitle != null && _subtitle.Paragraphs.Count > 0) - { - textBoxListViewText.Enabled = true; - } - - StartUpdateListSyntaxColoring(); - ShowHideBookmark(p); - } - - private void MaskedTextBoxTextChanged(object sender, EventArgs e) - { - if (_subtitleListViewIndex >= 0) - { - MakeHistoryForUndoOnlyIfNotResent(string.Format(_language.StarTimeAdjustedX, "#" + (_subtitleListViewIndex + 1) + ": " + timeUpDownStartTime.TimeCode)); - - int firstSelectedIndex = FirstSelectedIndex; - var oldParagraph = _subtitle.GetParagraphOrDefault(firstSelectedIndex); - if (oldParagraph != null) - { - oldParagraph = new Paragraph(oldParagraph, false); - } - - UpdateStartTimeInfo(timeUpDownStartTime.TimeCode); - - UpdateOriginalTimeCodes(oldParagraph); - labelStatus.Text = string.Empty; - } - } - - private void UpdateOriginalTimeCodes(Paragraph currentPargraphBeforeChange, Paragraph p2Before = null) - { - if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) - { - Paragraph p1 = null; - Paragraph o1 = null; - if (currentPargraphBeforeChange != null) - { - p1 = _subtitle.GetParagraphOrDefaultById(currentPargraphBeforeChange.Id); - if (p1 != null) - { - o1 = Utilities.GetOriginalParagraph(_subtitle.Paragraphs.IndexOf(p1), currentPargraphBeforeChange, _subtitleAlternate.Paragraphs); - } - } - - Paragraph p2 = null; - Paragraph o2 = null; - if (p2Before != null) - { - p2 = _subtitle.GetParagraphOrDefaultById(p2Before.Id); - if (p2 != null) - { - o2 = Utilities.GetOriginalParagraph(_subtitle.Paragraphs.IndexOf(p2), p2Before, _subtitleAlternate.Paragraphs); - } - } - - if (o1 != null) - { - o1.StartTime.TotalMilliseconds = p1.StartTime.TotalMilliseconds; - o1.EndTime.TotalMilliseconds = p1.EndTime.TotalMilliseconds; - } - - if (o2 != null) - { - o2.StartTime.TotalMilliseconds = p2.StartTime.TotalMilliseconds; - o2.EndTime.TotalMilliseconds = p2.EndTime.TotalMilliseconds; - } - } - } - - private void FormMain_FormClosing(object sender, FormClosingEventArgs e) - { - _lastDoNotPrompt = -1; - ReloadFromSourceView(); - if (!ContinueNewOrExit()) - { - e.Cancel = true; - } - else - { - if (_networkSession != null) - { - try - { - _networkSession.TimerStop(); - _networkSession.Leave(); - } - catch - { - } - } - - if (Configuration.Settings.General.StartRememberPositionAndSize && WindowState != FormWindowState.Minimized) - { - Configuration.Settings.General.StartPosition = Left + ";" + Top; - if (WindowState == FormWindowState.Maximized) - { - Configuration.Settings.General.StartSize = "Maximized"; - } - else - { - Configuration.Settings.General.StartSize = Width + ";" + Height; - } - - Configuration.Settings.General.SplitContainerMainSplitterDistance = splitContainerMain.SplitterDistance; - Configuration.Settings.General.SplitContainer1SplitterDistance = splitContainer1.SplitterDistance; - Configuration.Settings.General.SplitContainerListViewAndTextSplitterDistance = splitContainerListViewAndText.SplitterDistance; - } - - Configuration.Settings.General.AutoRepeatOn = checkBoxAutoRepeatOn.Checked; - if (int.TryParse(comboBoxAutoRepeat.Text, out var autoRepeat)) - { - Configuration.Settings.General.AutoRepeatCount = autoRepeat; - } - - Configuration.Settings.General.AutoContinueOn = checkBoxAutoContinue.Checked; - Configuration.Settings.General.AutoContinueDelay = comboBoxAutoContinue.SelectedIndex; - Configuration.Settings.General.SyncListViewWithVideoWhilePlaying = checkBoxSyncListViewWithVideoWhilePlaying.Checked; - Configuration.Settings.General.ShowWaveform = audioVisualizer.ShowWaveform; - Configuration.Settings.General.ShowSpectrogram = audioVisualizer.ShowSpectrogram; - if (Configuration.Settings.General.ShowRecentFiles) - { - if (!string.IsNullOrEmpty(_fileName)) - { - Configuration.Settings.RecentFiles.Add(_fileName, FirstVisibleIndex, FirstSelectedIndex, VideoFileName, _subtitleAlternateFileName, Configuration.Settings.General.CurrentVideoOffsetInMs); - - } - else - { - Configuration.Settings.RecentFiles.Add(null, null, null); - } - } - - if (SubtitleListview1.StateImageList?.Images.Count > 0) - { - Configuration.Settings.General.ListViewNumberWidth = SubtitleListview1.Columns[SubtitleListview1.ColumnIndexNumber].Width - 18; - } - else - { - Configuration.Settings.General.ListViewNumberWidth = SubtitleListview1.Columns[SubtitleListview1.ColumnIndexNumber].Width; - } - - SaveUndockedPositions(); - SaveListViewWidths(); - Configuration.Settings.Save(); - - if (mediaPlayer.VideoPlayer != null) - { - mediaPlayer.PauseAndDisposePlayer(); - } - } - } - - private void SaveListViewWidths() - { - if (Configuration.Settings.General.ListViewColumnsRememberSize) - { - if (SubtitleListview1.ColumnIndexNumber >= 0) - { - Configuration.Settings.General.ListViewNumberWidth = SubtitleListview1.Columns[SubtitleListview1.ColumnIndexNumber].Width; - } - - if (SubtitleListview1.ColumnIndexStart >= 0) - { - Configuration.Settings.General.ListViewStartWidth = SubtitleListview1.Columns[SubtitleListview1.ColumnIndexStart].Width; - } - - if (SubtitleListview1.ColumnIndexEnd >= 0) - { - Configuration.Settings.General.ListViewEndWidth = SubtitleListview1.Columns[SubtitleListview1.ColumnIndexEnd].Width; - } - - if (SubtitleListview1.ColumnIndexDuration >= 0) - { - Configuration.Settings.General.ListViewDurationWidth = SubtitleListview1.Columns[SubtitleListview1.ColumnIndexDuration].Width; - } - - if (SubtitleListview1.ColumnIndexCps >= 0) - { - Configuration.Settings.General.ListViewCpsWidth = SubtitleListview1.Columns[SubtitleListview1.ColumnIndexCps].Width; - } - - if (SubtitleListview1.ColumnIndexWpm >= 0) - { - Configuration.Settings.General.ListViewWpmWidth = SubtitleListview1.Columns[SubtitleListview1.ColumnIndexWpm].Width; - } - - if (SubtitleListview1.ColumnIndexText >= 0) - { - Configuration.Settings.General.ListViewTextWidth = SubtitleListview1.Columns[SubtitleListview1.ColumnIndexText].Width; - } - } - } - - private void SaveUndockedPositions() - { - if (_videoPlayerUndocked != null && !_videoPlayerUndocked.IsDisposed) - { - Configuration.Settings.General.UndockedVideoFullscreen = _videoPlayerUndocked.IsFullscreen; - Configuration.Settings.General.UndockedVideoPosition = _videoPlayerUndocked.Left + @";" + _videoPlayerUndocked.Top + @";" + _videoPlayerUndocked.Width + @";" + _videoPlayerUndocked.Height; - } - - if (_waveformUndocked != null && !_waveformUndocked.IsDisposed) - { - Configuration.Settings.General.UndockedWaveformPosition = _waveformUndocked.Left + @";" + _waveformUndocked.Top + @";" + _waveformUndocked.Width + @";" + _waveformUndocked.Height; - } - - if (_videoControlsUndocked != null && !_videoControlsUndocked.IsDisposed) - { - Configuration.Settings.General.UndockedVideoControlsPosition = _videoControlsUndocked.Left + @";" + _videoControlsUndocked.Top + @";" + _videoControlsUndocked.Width + @";" + _videoControlsUndocked.Height; - } - } - - private void ButtonUnBreakClick(object sender, EventArgs e) - { - Unbreak(); - } - - private void BreakUnbreakTextBox(bool unbreak, SETextBox tb) - { - var textCaretPos = tb.SelectionStart; - var startText = tb.Text.Substring(0, textCaretPos); - var numberOfNewLines = Utilities.CountTagInText(startText, Environment.NewLine); - if (unbreak) - { - textCaretPos -= numberOfNewLines; - tb.Text = Utilities.UnbreakLine(tb.Text); - } - else - { - int i = 0; - string s; - bool useLanguage = false; - var language = "en"; - if (Configuration.Settings.Tools.UseNoLineBreakAfter && tb == textBoxListViewText) - { - language = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle); - useLanguage = true; - } - else if (Configuration.Settings.Tools.UseNoLineBreakAfter && tb == textBoxListViewTextAlternate) - { - language = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitleAlternate); - useLanguage = true; - } - - if (useLanguage) - { - s = Utilities.AutoBreakLine(tb.Text, language); - } - else - { - s = Utilities.AutoBreakLine(tb.Text); - } - - while (i < textCaretPos && i < s.Length) - { - var ch = s[i]; - if (ch == '\n') - { - textCaretPos++; - } - - i++; - } - - textCaretPos -= numberOfNewLines; - tb.Text = s; - } - - tb.SelectionStart = textCaretPos; - } - - private void Unbreak(bool removeNewLineOnly = false) - { - _doAutoBreakOnTextChanged = false; - - var textCaretPos = textBoxListViewText.SelectionStart; - var startText = textBoxListViewText.Text.Substring(0, textCaretPos); - var numberOfNewLines = Utilities.CountTagInText(startText, Environment.NewLine); - textCaretPos -= numberOfNewLines; - bool historyAdded = false; - - if (SubtitleListview1.SelectedItems.Count > 1) - { - SubtitleListview1.BeginUpdate(); - foreach (int index in SubtitleListview1.SelectedIndices) - { - var p = _subtitle.GetParagraphOrDefault(index); - var oldText = p.Text; - var newText = p.Text; - if (removeNewLineOnly) - { - newText = newText.Replace(Environment.NewLine, string.Empty); - } - else - { - newText = Utilities.UnbreakLine(newText); - } - - if (oldText != newText) - { - if (!historyAdded) - { - historyAdded = true; - MakeHistoryForUndo(_language.BeforeRemoveLineBreaksInSelectedLines); - } - - p.Text = newText; - SubtitleListview1.SetText(index, p.Text); - } - - if (_subtitleAlternate != null && SubtitleListview1.IsAlternateTextColumnVisible && Configuration.Settings.General.AllowEditOfOriginalSubtitle) - { - var original = Utilities.GetOriginalParagraph(index, p, _subtitleAlternate.Paragraphs); - if (original != null) - { - oldText = original.Text; - newText = original.Text; - if (removeNewLineOnly) - { - newText = newText.Replace(Environment.NewLine, string.Empty); - } - else - { - newText = Utilities.UnbreakLine(newText); - } - - if (oldText != newText) - { - if (!historyAdded) - { - historyAdded = true; - MakeHistoryForUndo(_language.BeforeRemoveLineBreaksInSelectedLines); - } - - original.Text = newText; - SubtitleListview1.SetAlternateText(index, original.Text); - } - } - } - } - - SubtitleListview1.EndUpdate(); - RefreshSelectedParagraph(); - } - else - { - var fixedText = removeNewLineOnly ? textBoxListViewText.Text.Replace(Environment.NewLine, string.Empty) : Utilities.UnbreakLine(textBoxListViewText.Text); - var makeHistory = textBoxListViewText.Text != fixedText; - if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) - { - var alternateFixedText = Utilities.UnbreakLine(textBoxListViewTextAlternate.Text); - if (!makeHistory) - { - makeHistory = textBoxListViewTextAlternate.Text != alternateFixedText; - } - - if (makeHistory) - { - MakeHistoryForUndo(_language.BeforeRemoveLineBreaksInSelectedLines); - textBoxListViewText.Text = fixedText; - } - - textBoxListViewTextAlternate.Text = alternateFixedText; - } - else if (makeHistory) - { - MakeHistoryForUndo(_language.BeforeRemoveLineBreaksInSelectedLines); - textBoxListViewText.Text = fixedText; - } - } - - _doAutoBreakOnTextChanged = true; - textBoxListViewText.SelectionStart = textCaretPos; - } - - private void TabControlSubtitleSelectedIndexChanged(object sender, EventArgs e) - { - var format = GetCurrentSubtitleFormat(); - if (tabControlSubtitle.SelectedIndex == TabControlSourceView) - { - ShowSource(); - ShowSourceLineNumber(); - if (textBoxSource.CanFocus) - { - textBoxSource.Focus(); - } - - // go to correct line in source view - if (SubtitleListview1.SelectedItems.Count > 0) - { - if (format.GetType() == typeof(SubRip)) - { - var p = _subtitle.GetParagraphOrDefault(FirstSelectedIndex); - if (p != null) - { - string tc = p.StartTime + " --> " + p.EndTime; - int start = textBoxSource.Text.IndexOf(p.Number + Environment.NewLine + tc, StringComparison.Ordinal); - if (start < 0) - { - start = 0; - } - - start = textBoxSource.Text.IndexOf(tc, start, StringComparison.Ordinal); - if (start > 0) - { - textBoxSource.SelectionStart = start + tc.Length + Environment.NewLine.Length; - textBoxSource.SelectionLength = 0; - textBoxSource.ScrollToCaret(); - } - } - } - else if (format.GetType() == typeof(SubStationAlpha) || format.GetType() == typeof(AdvancedSubStationAlpha)) - { - var p = _subtitle.GetParagraphOrDefault(FirstSelectedIndex); - if (p != null) - { - const string timeCodeFormat = "{0}:{1:00}:{2:00}.{3:00}"; // h:mm:ss.cc - string startTimeCode = string.Format(timeCodeFormat, p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, p.StartTime.Milliseconds / 10); - string endTimeCode = string.Format(timeCodeFormat, p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, p.EndTime.Milliseconds / 10); - string tc = startTimeCode + "," + endTimeCode; - int start = textBoxSource.Text.IndexOf(tc, StringComparison.Ordinal); - if (start > 0) - { - int start2 = textBoxSource.Text.LastIndexOf("Dialogue:", start, StringComparison.Ordinal); - if (start2 > 0) - { - start2 = (textBoxSource.Text + Environment.NewLine).IndexOf(Environment.NewLine, start2, StringComparison.Ordinal); - } - - if (start2 > 0) - { - start = start2; - } - - textBoxSource.SelectionStart = start; - textBoxSource.SelectionLength = 0; - textBoxSource.ScrollToCaret(); - } - } - } - } - } - else - { - ReloadFromSourceView(); - ShowLineInformationListView(); - if (SubtitleListview1.CanFocus) - { - SubtitleListview1.Focus(); - } - - // go to (select + focus) correct line in list view - if (textBoxSource.SelectionStart > 0 && textBoxSource.TextLength > 30) - { - if (format.GetType() == typeof(SubRip)) - { - var timeCodeRegEx = new Regex(@"^-?\d+:-?\d+:-?\d+[:,]-?\d+\s*-->\s*-?\d+:-?\d+:-?\d+[:,]-?\d+$"); - var lineNumber = textBoxSource.GetLineFromCharIndex(textBoxSource.SelectionStart); - var lines = textBoxSource.Lines.ToList(); - if (lineNumber >= lines.Count) - { - lineNumber = lines.Count - 1; - } - - var currentLine = lines[lineNumber]; - var nextLine = lineNumber + 1 < lines.Count ? lines[lineNumber + 1] : string.Empty; - var startLine = 0; - if (Utilities.IsInteger(currentLine) && timeCodeRegEx.IsMatch(nextLine)) - { - startLine = lineNumber; - } - else - { - for (int i = lineNumber; i > 0; i--) - { - if (timeCodeRegEx.IsMatch(lines[i]) && Utilities.IsInteger(lines[i - 1])) - { - startLine = i - 1; - break; - } - } - } - - var sb = new StringBuilder(); - for (int i = startLine; i < lines.Count; i++) - { - sb.AppendLine(lines[i]); - } - - var sub = new Subtitle(); - new SubRip().LoadSubtitle(sub, sb.ToString().SplitToLines().ToList(), null); - if (sub.Paragraphs.Count > 0) - { - foreach (var p in _subtitle.Paragraphs) - { - if (sub.Paragraphs[0].Number == p.Number && - sub.Paragraphs[0].StartTime.TotalMilliseconds == p.StartTime.TotalMilliseconds && - sub.Paragraphs[0].EndTime.TotalMilliseconds == p.EndTime.TotalMilliseconds) - { - _subtitleListViewIndex = -1; - var index = _subtitle.Paragraphs.IndexOf(p); - SubtitleListview1.SelectIndexAndEnsureVisible(index, true); - break; - } - } - } - } - else if (format.GetType() == typeof(SubStationAlpha) || format.GetType() == typeof(AdvancedSubStationAlpha)) - { - int pos = textBoxSource.SelectionStart; - string s = textBoxSource.Text; - if (pos > 0) - { - pos--; - } - - while (pos > 0 && pos + 3 < s.Length && !s.Substring(pos, 3).StartsWith(Environment.NewLine, StringComparison.Ordinal)) - { - pos--; - } - - s = s.Substring(pos).Trim(); - int lastTimeCode = s.IndexOf("Dialogue:", StringComparison.Ordinal); - - if (lastTimeCode >= 0) - { - string tc = s.Substring(lastTimeCode).Trim(); - while (tc.Length > 0 && !char.IsDigit(tc[0])) - { - tc = tc.Remove(0, 1); - } - - if (tc.Length > 12) - { - TimeCode realTC; - tc = tc.Substring(0, 13); - var timeCode = tc.Split(new[] { ':', '.', ',' }, StringSplitOptions.RemoveEmptyEntries); - try - { - realTC = new TimeCode(int.Parse(timeCode[1]), int.Parse(timeCode[2]), int.Parse(timeCode[3]), int.Parse(timeCode[4]) * 10); - } - catch - { - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - return; - } - - int index = 0; - foreach (var p in _subtitle.Paragraphs) - { - if (Math.Abs(realTC.TotalMilliseconds - p.StartTime.TotalMilliseconds) < 50) - { - SubtitleListview1.SelectIndexAndEnsureVisible(index, true); - break; - } - - index++; - } - } - } - } - } - else if (textBoxSource.SelectionStart == 0 && textBoxSource.TextLength > 30) - { - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - } - } - } - - private void ColorToolStripMenuItemClick(object sender, EventArgs e) - { - if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 0) - { - - string color; - var formatType = GetCurrentSubtitleFormat().GetType(); - if (formatType == typeof(Ebu)) - { - using (var form = new EbuColorPicker(true)) - { - if (form.ShowDialog(this) != DialogResult.OK) - { - return; - } - - color = form.Color; - } - } - else if (formatType == typeof(ScenaristClosedCaptions) || formatType == typeof(ScenaristClosedCaptionsDropFrame)) - { - using (var form = new EbuColorPicker(false)) - { - if (form.ShowDialog(this) != DialogResult.OK) - { - return; - } - - color = form.Color; - } - } - else - { - if (colorDialog1.ShowDialog(this) != DialogResult.OK) - { - return; - } - - color = Utilities.ColorToHex(colorDialog1.Color); - } - - MakeHistoryForUndo(_language.BeforeSettingColor); - foreach (ListViewItem item in SubtitleListview1.SelectedItems) - { - var p = _subtitle.GetParagraphOrDefault(item.Index); - if (p != null) - { - SetFontColor(p, color); - SubtitleListview1.SetText(item.Index, p.Text); - if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle && SubtitleListview1.IsAlternateTextColumnVisible) - { - var original = Utilities.GetOriginalParagraph(item.Index, p, _subtitleAlternate.Paragraphs); - if (original != null) - { - SetFontColor(original, color); - SubtitleListview1.SetAlternateText(item.Index, original.Text); - } - } - } - } - - RefreshSelectedParagraph(); - - } - } - - private static void SetFontColor(Paragraph p, string color) - { - if (p == null) - { - return; - } - - string pre = string.Empty; - if (p.Text.StartsWith("{\\", StringComparison.Ordinal) && p.Text.IndexOf('}') >= 0) - { - int endIndex = p.Text.IndexOf('}') + 1; - pre = p.Text.Substring(0, endIndex); - p.Text = p.Text.Remove(0, endIndex); - } - - string s = p.Text; - if (s.StartsWith("'); - if (end > 0) - { - string f = s.Substring(0, end); - - if (f.Contains(" face=", StringComparison.OrdinalIgnoreCase) && !f.Contains(" color=", StringComparison.OrdinalIgnoreCase)) - { - var start = s.IndexOf(" face=", StringComparison.OrdinalIgnoreCase); - s = s.Insert(start, string.Format(" color=\"{0}\"", color)); - p.Text = pre + s; - return; - } - - var colorStart = f.IndexOf(" color=", StringComparison.OrdinalIgnoreCase); - if (colorStart >= 0) - { - if (s.IndexOf('"', colorStart + 8) > 0) - { - end = s.IndexOf('"', colorStart + 8); - } - - s = s.Substring(0, colorStart) + string.Format(" color=\"{0}", color) + s.Substring(end); - p.Text = pre + s; - return; - } - } - } - - p.Text = $"{pre}{p.Text}"; - } - - private void toolStripMenuItemFont_Click(object sender, EventArgs e) - { - if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 0) - { - using (var form = new ChooseFontName()) - { - - if (form.ShowDialog(this) == DialogResult.OK) - { - MakeHistoryForUndo(_language.BeforeSettingFontName); - - foreach (ListViewItem item in SubtitleListview1.SelectedItems) - { - var p = _subtitle.GetParagraphOrDefault(item.Index); - if (p != null) - { - SetFontName(p, form.FontName); - SubtitleListview1.SetText(item.Index, p.Text); - if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle && SubtitleListview1.IsAlternateTextColumnVisible) - { - var original = Utilities.GetOriginalParagraph(item.Index, p, _subtitleAlternate.Paragraphs); - if (original != null) - { - SetFontName(original, form.FontName); - SubtitleListview1.SetAlternateText(item.Index, original.Text); - } - } - } - } - - RefreshSelectedParagraph(); - } - } - } - } - - private void SetFontName(Paragraph p, string fontName) - { - if (p == null) - { - return; - } - - string pre = string.Empty; - if (p.Text.StartsWith("{\\", StringComparison.Ordinal) && p.Text.IndexOf('}') >= 0) - { - int endIndex = p.Text.IndexOf('}') + 1; - pre = p.Text.Substring(0, endIndex); - p.Text = p.Text.Remove(0, endIndex); - } - - string s = p.Text; - if (s.StartsWith("'); - if (end > 0) - { - var f = s.Substring(0, end); - - if (f.Contains(" color=", StringComparison.OrdinalIgnoreCase) && !f.Contains(" face=", StringComparison.OrdinalIgnoreCase)) - { - var start = s.IndexOf(" color=", StringComparison.OrdinalIgnoreCase); - p.Text = pre + s.Insert(start, string.Format(" face=\"{0}\"", fontName)); - return; - } - - var faceStart = f.IndexOf(" face=", StringComparison.OrdinalIgnoreCase); - if (f.Contains(" face=", StringComparison.OrdinalIgnoreCase)) - { - if (s.IndexOf('"', faceStart + 7) > 0) - { - end = s.IndexOf('"', faceStart + 7); - } - - p.Text = pre + s.Substring(0, faceStart) + string.Format(" face=\"{0}", fontName) + s.Substring(end); - return; - } - } - } - - p.Text = $"{pre}{s}"; - } - - private void TypeEffectToolStripMenuItemClick(object sender, EventArgs e) - { - if (SubtitleListview1.SelectedItems.Count > 0) - { - using (var typewriter = new EffectTypewriter()) - { - typewriter.Initialize(SubtitleListview1.GetSelectedParagraph(_subtitle)); - - if (typewriter.ShowDialog(this) == DialogResult.OK) - { - MakeHistoryForUndo(_language.BeforeTypeWriterEffect); - bool isframeBased = GetCurrentSubtitleFormat().IsFrameBased; - int lastSelectedIndex = SubtitleListview1.SelectedItems[0].Index; - int i = SubtitleListview1.SelectedItems.Count - 1; - while (i >= 0) - { - var item = SubtitleListview1.SelectedItems[i]; - var p = _subtitle.GetParagraphOrDefault(item.Index); - if (p != null) - { - typewriter.Initialize(p); - typewriter.MakeAnimation(); - int index = item.Index; - _subtitle.Paragraphs.RemoveAt(index); - foreach (var tp in typewriter.TypewriterParagraphs) - { - _subtitle.Paragraphs.Insert(index, tp); - index++; - } - } - - i--; - } - - _subtitle.Renumber(); - _subtitleListViewIndex = -1; - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - SubtitleListview1.SelectIndexAndEnsureVisible(lastSelectedIndex, true); - } - } - } - } - - private void KarokeeEffectToolStripMenuItemClick(object sender, EventArgs e) - { - if (SubtitleListview1.SelectedItems.Count > 0) - { - using (var karaoke = new EffectKaraoke()) - { - karaoke.Initialize(SubtitleListview1.GetSelectedParagraph(_subtitle)); - - if (karaoke.ShowDialog(this) == DialogResult.OK) - { - MakeHistoryForUndo(_language.BeforeKaraokeEffect); - int lastSelectedIndex = SubtitleListview1.SelectedItems[0].Index; - bool isframeBased = GetCurrentSubtitleFormat().IsFrameBased; - - int i = SubtitleListview1.SelectedItems.Count - 1; - while (i >= 0) - { - var item = SubtitleListview1.SelectedItems[i]; - var p = _subtitle.GetParagraphOrDefault(item.Index); - if (p != null) - { - int index = item.Index; - _subtitle.Paragraphs.RemoveAt(index); - foreach (var kp in karaoke.MakeAnimation(p)) - { - _subtitle.Paragraphs.Insert(index, kp); - index++; - } - } - - i--; - } - - _subtitle.Renumber(); - _subtitleListViewIndex = -1; - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - SubtitleListview1.SelectIndexAndEnsureVisible(lastSelectedIndex, true); - } - } - } - } - - private void MatroskaImportStripMenuItemClick(object sender, EventArgs e) - { - openFileDialog1.Title = _language.OpenMatroskaFile; - openFileDialog1.FileName = string.Empty; - openFileDialog1.Filter = _language.MatroskaFiles + "|*.mkv;*.mks|" + _languageGeneral.AllFiles + "|*.*"; - if (openFileDialog1.ShowDialog(this) == DialogResult.OK) - { - openFileDialog1.InitialDirectory = Path.GetDirectoryName(openFileDialog1.FileName); - ImportSubtitleFromMatroskaFile(openFileDialog1.FileName); - } - } - - private void ImportSubtitleFromMatroskaFile(string fileName) - { - using (var matroska = new MatroskaFile(fileName)) - { - if (matroska.IsValid) - { - var subtitleList = matroska.GetTracks(true); - if (subtitleList.Count == 0) - { - MessageBox.Show(_language.NoSubtitlesFound); - } - else if (ContinueNewOrExit()) - { - if (subtitleList.Count > 1) - { - using (var subtitleChooser = new MatroskaSubtitleChooser("mkv")) - { - subtitleChooser.Initialize(subtitleList); - if (_loading) - { - subtitleChooser.Icon = (Icon)this.Icon.Clone(); - subtitleChooser.ShowInTaskbar = true; - subtitleChooser.ShowIcon = true; - } - - if (subtitleChooser.ShowDialog(this) == DialogResult.OK) - { - if (LoadMatroskaSubtitle(subtitleList[subtitleChooser.SelectedIndex], matroska, false) && - (Path.GetExtension(matroska.Path).Equals(".mkv", StringComparison.OrdinalIgnoreCase) || - Path.GetExtension(matroska.Path).Equals(".mks", StringComparison.OrdinalIgnoreCase))) - { - if (!Configuration.Settings.General.DisableVideoAutoLoading) - { - matroska.Dispose(); - OpenVideo(matroska.Path); - } - } - else - { - _exitWhenLoaded = _loading; - } - } - } - } - else - { - var ext = Path.GetExtension(matroska.Path).ToLowerInvariant(); - if (LoadMatroskaSubtitle(subtitleList[0], matroska, false) && - (ext == ".mkv" || ext == ".mks")) - { - if (!Configuration.Settings.General.DisableVideoAutoLoading) - { - matroska.Dispose(); - if (ext == ".mkv") - { - OpenVideo(matroska.Path); - } - else - { - TryToFindAndOpenVideoFile(Path.Combine(Path.GetDirectoryName(matroska.Path), Path.GetFileNameWithoutExtension(matroska.Path))); - } - } - } - else - { - _exitWhenLoaded = _loading; - } - } - } - } - else - { - MessageBox.Show(string.Format(_language.NotAValidMatroskaFileX, fileName)); - } - } - } - - private int _lastProgressPercent = -1; - - private void UpdateProgress(long position, long total, string statusMessage) - { - var percent = (int)Math.Round(position * 100.0 / total); - if (percent == _lastProgressPercent) - { - return; - } - - ShowStatus(string.Format("{0}, {1:0}%", statusMessage, _lastProgressPercent)); - statusStrip1.Refresh(); - TaskbarList.SetProgressValue(Handle, percent, 100); - if (DateTime.UtcNow.Ticks % 10 == 0) - { - Application.DoEvents(); - } - - _lastProgressPercent = percent; - } - - private void MatroskaProgress(long position, long total) - { - UpdateProgress(position, total, _language.ParsingMatroskaFile); - } - - private Subtitle LoadMatroskaSubtitleForSync(MatroskaTrackInfo matroskaSubtitleInfo, MatroskaFile matroska) - { - var subtitle = new Subtitle(); - bool isSsa = false; - - if (matroskaSubtitleInfo.CodecId.Equals("S_VOBSUB", StringComparison.OrdinalIgnoreCase)) - { - return subtitle; - } - - if (matroskaSubtitleInfo.CodecId.Equals("S_HDMV/PGS", StringComparison.OrdinalIgnoreCase)) - { - return subtitle; - } - - SubtitleFormat format; - var codecPrivate = matroskaSubtitleInfo.GetCodecPrivate(); - if (codecPrivate.Contains("[script info]", StringComparison.OrdinalIgnoreCase)) - { - if (codecPrivate.Contains("[V4 Styles]", StringComparison.OrdinalIgnoreCase)) - { - format = new SubStationAlpha(); - } - else - { - format = new AdvancedSubStationAlpha(); - } - - isSsa = true; - } - else - { - format = new SubRip(); - } - - var sub = matroska.GetSubtitle(matroskaSubtitleInfo.TrackNumber, MatroskaProgress); - TaskbarList.SetProgressState(Handle, TaskbarButtonProgressFlags.NoProgress); - if (isSsa) - { - foreach (var p in Utilities.LoadMatroskaSSA(matroskaSubtitleInfo, matroska.Path, format, sub).Paragraphs) - { - subtitle.Paragraphs.Add(p); - } - } - else - { - foreach (var p in sub) - { - subtitle.Paragraphs.Add(new Paragraph(p.GetText(matroskaSubtitleInfo), p.Start, p.End)); - } - } - - return subtitle; - } - - private bool LoadMatroskaSubtitle(MatroskaTrackInfo matroskaSubtitleInfo, MatroskaFile matroska, bool batchMode) - { - if (matroskaSubtitleInfo.CodecId.Equals("S_VOBSUB", StringComparison.OrdinalIgnoreCase)) - { - if (batchMode) - { - return false; - } - - return LoadVobSubFromMatroska(matroskaSubtitleInfo, matroska); - } - - if (matroskaSubtitleInfo.CodecId.Equals("S_HDMV/PGS", StringComparison.OrdinalIgnoreCase)) - { - if (batchMode) - { - return false; - } - - return LoadBluRaySubFromMatroska(matroskaSubtitleInfo, matroska); - } - - if (matroskaSubtitleInfo.CodecId.Equals("S_HDMV/TEXTST", StringComparison.OrdinalIgnoreCase)) - { - if (batchMode) - { - return false; - } - - return LoadTextSTFromMatroska(matroskaSubtitleInfo, matroska, batchMode); - } - - if (matroskaSubtitleInfo.CodecId.Equals("S_DVBSUB", StringComparison.OrdinalIgnoreCase)) - { - if (batchMode) - { - return false; - } - - return LoadDvbFromMatroska(matroskaSubtitleInfo, matroska, batchMode); - } - - ShowStatus(_language.ParsingMatroskaFile); - Refresh(); - Cursor.Current = Cursors.WaitCursor; - var sub = matroska.GetSubtitle(matroskaSubtitleInfo.TrackNumber, MatroskaProgress); - TaskbarList.SetProgressState(Handle, TaskbarButtonProgressFlags.NoProgress); - Cursor.Current = Cursors.Default; - - MakeHistoryForUndo(_language.BeforeImportFromMatroskaFile); - _subtitleListViewIndex = -1; - if (!batchMode) - { - ResetSubtitle(); - } - - _subtitle.Paragraphs.Clear(); - - var format = Utilities.LoadMatroskaTextSubtitle(matroskaSubtitleInfo, matroska, sub, _subtitle); - - if (matroskaSubtitleInfo.GetCodecPrivate().Contains("[script info]", StringComparison.OrdinalIgnoreCase)) - { - if (_networkSession == null) - { - SubtitleListview1.ShowExtraColumn(_languageGeneral.Style); - } - } - else if (_networkSession == null) - { - SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.Extra); - } - - comboBoxSubtitleFormats.SelectedIndexChanged -= ComboBoxSubtitleFormatsSelectedIndexChanged; - SetCurrentFormat(format); - comboBoxSubtitleFormats.SelectedIndexChanged += ComboBoxSubtitleFormatsSelectedIndexChanged; - _oldSubtitleFormat = format; - SetEncoding(Encoding.UTF8); - ShowStatus(_language.SubtitleImportedFromMatroskaFile); - _subtitle.Renumber(); - if (matroska.Path.EndsWith(".mkv", StringComparison.OrdinalIgnoreCase) || matroska.Path.EndsWith(".mks", StringComparison.OrdinalIgnoreCase)) - { - _fileName = matroska.Path.Remove(matroska.Path.Length - 4) + format.Extension; - } - - SetTitle(); - _fileDateTime = new DateTime(); - _converted = true; - - if (batchMode) - { - return true; - } - - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - if (_subtitle.Paragraphs.Count > 0) - { - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - } - - ShowSource(); - return true; - } - - private bool LoadTextSTFromMatroska(MatroskaTrackInfo matroskaSubtitleInfo, MatroskaFile matroska, bool batchMode) - { - ShowStatus(_language.ParsingMatroskaFile); - Refresh(); - Cursor.Current = Cursors.WaitCursor; - var sub = matroska.GetSubtitle(matroskaSubtitleInfo.TrackNumber, MatroskaProgress); - TaskbarList.SetProgressState(Handle, TaskbarButtonProgressFlags.NoProgress); - Cursor.Current = Cursors.Default; - - MakeHistoryForUndo(_language.BeforeImportFromMatroskaFile); - _subtitleListViewIndex = -1; - if (!batchMode) - { - ResetSubtitle(); - } - - _subtitle.Paragraphs.Clear(); - - Utilities.LoadMatroskaTextSubtitle(matroskaSubtitleInfo, matroska, sub, _subtitle); - for (int index = 0; index < sub.Count; index++) - { - try - { - var msub = sub[index]; - int idx = -6; // MakeMKV starts at DialogPresentationSegment - var data = msub.GetData(matroskaSubtitleInfo); - if (VobSubParser.IsPrivateStream2(data, 0)) - { - idx = 0; // starts with MPEG2 private stream 2 (just to be sure) - } - - var dps = new TextST.DialogPresentationSegment(data, idx); - _subtitle.Paragraphs[index].Text = dps.Text; - } - catch (Exception exception) - { - _subtitle.Paragraphs[index].Text = exception.Message; - } - } - - if (_networkSession == null) - { - SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.Extra); - } - - comboBoxSubtitleFormats.SelectedIndexChanged -= ComboBoxSubtitleFormatsSelectedIndexChanged; - SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); - comboBoxSubtitleFormats.SelectedIndexChanged += ComboBoxSubtitleFormatsSelectedIndexChanged; - SetEncoding(Encoding.UTF8); - ShowStatus(_language.SubtitleImportedFromMatroskaFile); - _subtitle.Renumber(); - if (matroska.Path.EndsWith(".mkv", StringComparison.OrdinalIgnoreCase) || matroska.Path.EndsWith(".mks", StringComparison.OrdinalIgnoreCase)) - { - _fileName = matroska.Path.Remove(matroska.Path.Length - 4) + GetCurrentSubtitleFormat().Extension; - } - - SetTitle(); - _fileDateTime = new DateTime(); - _converted = true; - if (batchMode) - { - return true; - } - - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - if (_subtitle.Paragraphs.Count > 0) - { - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - } - - ShowSource(); - return true; - } - - private bool LoadDvbFromMatroska(MatroskaTrackInfo matroskaSubtitleInfo, MatroskaFile matroska, bool batchMode) - { - ShowStatus(_language.ParsingMatroskaFile); - Refresh(); - Cursor.Current = Cursors.WaitCursor; - var sub = matroska.GetSubtitle(matroskaSubtitleInfo.TrackNumber, MatroskaProgress); - TaskbarList.SetProgressState(Handle, TaskbarButtonProgressFlags.NoProgress); - Cursor.Current = Cursors.Default; - - MakeHistoryForUndo(_language.BeforeImportFromMatroskaFile); - _subtitleListViewIndex = -1; - if (!batchMode) - { - ResetSubtitle(); - } - - _subtitle.Paragraphs.Clear(); - var subtitleImages = new List(); - var subtitle = new Subtitle(); - Utilities.LoadMatroskaTextSubtitle(matroskaSubtitleInfo, matroska, sub, _subtitle); - for (int index = 0; index < sub.Count; index++) - { - try - { - var msub = sub[index]; - DvbSubPes pes = null; - var data = msub.GetData(matroskaSubtitleInfo); - if (data != null && data.Length > 9 && data[0] == 15 && data[1] >= SubtitleSegment.PageCompositionSegment && data[1] <= SubtitleSegment.DisplayDefinitionSegment) // sync byte + segment id - { - var buffer = new byte[data.Length + 3]; - Buffer.BlockCopy(data, 0, buffer, 2, data.Length); - buffer[0] = 32; - buffer[1] = 0; - buffer[buffer.Length - 1] = 255; - pes = new DvbSubPes(0, buffer); - } - else if (VobSubParser.IsMpeg2PackHeader(data)) - { - pes = new DvbSubPes(data, Mpeg2Header.Length); - } - else if (VobSubParser.IsPrivateStream1(data, 0)) - { - pes = new DvbSubPes(data, 0); - } - else if (data.Length > 9 && data[0] == 32 && data[1] == 0 && data[2] == 14 && data[3] == 16) - { - pes = new DvbSubPes(0, data); - } - - if (pes == null && subtitle.Paragraphs.Count > 0) - { - var last = subtitle.Paragraphs[subtitle.Paragraphs.Count - 1]; - if (last.Duration.TotalMilliseconds < 100) - { - last.EndTime.TotalMilliseconds = msub.Start; - if (last.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) - { - last.EndTime.TotalMilliseconds = last.StartTime.TotalMilliseconds + 3000; - } - } - } - - if (pes != null && pes.PageCompositions != null && pes.PageCompositions.Any(p => p.Regions.Count > 0)) - { - subtitleImages.Add(pes); - subtitle.Paragraphs.Add(new Paragraph(string.Empty, msub.Start, msub.End)); - } - } - catch - { - // continue - } - } - - if (subtitleImages.Count == 0) - { - return false; - } - - for (int index = 0; index < subtitle.Paragraphs.Count; index++) - { - var p = subtitle.Paragraphs[index]; - if (p.Duration.TotalMilliseconds < 200) - { - p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + 3000; - } - - var next = subtitle.GetParagraphOrDefault(index + 1); - if (next != null && next.StartTime.TotalMilliseconds < p.EndTime.TotalMilliseconds) - { - p.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; - } - } - - using (var formSubOcr = new VobSubOcr()) - { - formSubOcr.Initialize(subtitle, subtitleImages, Configuration.Settings.VobSubOcr); // TODO: language??? - if (_loading) - { - formSubOcr.Icon = (Icon)Icon.Clone(); - formSubOcr.ShowInTaskbar = true; - formSubOcr.ShowIcon = true; - } - - if (formSubOcr.ShowDialog(this) == DialogResult.OK) - { - ResetSubtitle(); - _subtitle.Paragraphs.Clear(); - foreach (var p in formSubOcr.SubtitleFromOcr.Paragraphs) - { - _subtitle.Paragraphs.Add(p); - } - - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - _subtitleListViewIndex = -1; - SubtitleListview1.FirstVisibleIndex = -1; - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - - _fileName = Utilities.GetPathAndFileNameWithoutExtension(matroska.Path) + GetCurrentSubtitleFormat().Extension; - _converted = true; - SetTitle(); - - Configuration.Settings.Save(); - return true; - } - } - - return false; - } - - public static void CopyStream(Stream input, Stream output) - { - var buffer = new byte[128 * 1024]; - int len; - while ((len = input.Read(buffer, 0, buffer.Length)) > 0) - { - output.Write(buffer, 0, len); - } - - output.Flush(); - } - - private bool LoadVobSubFromMatroska(MatroskaTrackInfo matroskaSubtitleInfo, MatroskaFile matroska) - { - if (matroskaSubtitleInfo.ContentEncodingType == 1) - { - MessageBox.Show(_language.NoSupportEncryptedVobSub); - } - - ShowStatus(_language.ParsingMatroskaFile); - Refresh(); - Cursor.Current = Cursors.WaitCursor; - var sub = matroska.GetSubtitle(matroskaSubtitleInfo.TrackNumber, MatroskaProgress); - TaskbarList.SetProgressState(Handle, TaskbarButtonProgressFlags.NoProgress); - Cursor.Current = Cursors.Default; - - MakeHistoryForUndo(_language.BeforeImportFromMatroskaFile); - _subtitleListViewIndex = -1; - _subtitle.Paragraphs.Clear(); - - List mergedVobSubPacks = new List(); - var idx = new Core.VobSub.Idx(matroskaSubtitleInfo.GetCodecPrivate().SplitToLines()); - foreach (var p in sub) - { - mergedVobSubPacks.Add(new VobSubMergedPack(p.GetData(matroskaSubtitleInfo), TimeSpan.FromMilliseconds(p.Start), 32, null)); - if (mergedVobSubPacks.Count > 0) - { - mergedVobSubPacks[mergedVobSubPacks.Count - 1].EndTime = TimeSpan.FromMilliseconds(p.End); - } - - // fix overlapping (some versions of Handbrake makes overlapping time codes - thx Hawke) - if (mergedVobSubPacks.Count > 1 && mergedVobSubPacks[mergedVobSubPacks.Count - 2].EndTime > mergedVobSubPacks[mergedVobSubPacks.Count - 1].StartTime) - { - mergedVobSubPacks[mergedVobSubPacks.Count - 2].EndTime = TimeSpan.FromMilliseconds(mergedVobSubPacks[mergedVobSubPacks.Count - 1].StartTime.TotalMilliseconds - 1); - } - } - - // Remove bad packs - for (int i = mergedVobSubPacks.Count - 1; i >= 0; i--) - { - if (mergedVobSubPacks[i].SubPicture.SubPictureDateSize <= 2) - { - mergedVobSubPacks.RemoveAt(i); - } - else if (mergedVobSubPacks[i].SubPicture.SubPictureDateSize <= 67 && mergedVobSubPacks[i].SubPicture.Delay.TotalMilliseconds < 35) - { - mergedVobSubPacks.RemoveAt(i); - } - } - - using (var formSubOcr = new VobSubOcr()) - { - formSubOcr.Initialize(mergedVobSubPacks, idx.Palette, Configuration.Settings.VobSubOcr, null); // TODO: language??? - if (_loading) - { - formSubOcr.Icon = (Icon)Icon.Clone(); - formSubOcr.ShowInTaskbar = true; - formSubOcr.ShowIcon = true; - } - - if (formSubOcr.ShowDialog(this) == DialogResult.OK) - { - ResetSubtitle(); - _subtitle.Paragraphs.Clear(); - foreach (var p in formSubOcr.SubtitleFromOcr.Paragraphs) - { - _subtitle.Paragraphs.Add(p); - } - - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - _subtitleListViewIndex = -1; - SubtitleListview1.FirstVisibleIndex = -1; - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - - _fileName = Utilities.GetPathAndFileNameWithoutExtension(matroska.Path) + GetCurrentSubtitleFormat().Extension; - _converted = true; - SetTitle(); - - Configuration.Settings.Save(); - return true; - } - } - - return false; - } - - private bool LoadBluRaySubFromMatroska(MatroskaTrackInfo matroskaSubtitleInfo, MatroskaFile matroska) - { - if (matroskaSubtitleInfo.ContentEncodingType == 1) - { - MessageBox.Show(_language.NoSupportEncryptedVobSub); - } - - ShowStatus(_language.ParsingMatroskaFile); - Refresh(); - Cursor.Current = Cursors.WaitCursor; - var sub = matroska.GetSubtitle(matroskaSubtitleInfo.TrackNumber, MatroskaProgress); - TaskbarList.SetProgressState(Handle, TaskbarButtonProgressFlags.NoProgress); - Cursor.Current = Cursors.Default; - - int noOfErrors = 0; - string lastError = string.Empty; - MakeHistoryForUndo(_language.BeforeImportFromMatroskaFile); - _subtitleListViewIndex = -1; - _subtitle.Paragraphs.Clear(); - var subtitles = new List(); - var log = new StringBuilder(); - var clusterStream = new MemoryStream(); - var lastPalettes = new Dictionary>(); - var lastBitmapObjects = new Dictionary>(); - foreach (var p in sub) - { - byte[] buffer = p.GetData(matroskaSubtitleInfo); - if (buffer != null && buffer.Length > 2) - { - clusterStream.Write(buffer, 0, buffer.Length); - if (ContainsBluRayStartSegment(buffer)) - { - if (subtitles.Count > 0 && subtitles[subtitles.Count - 1].StartTime == subtitles[subtitles.Count - 1].EndTime) - { - subtitles[subtitles.Count - 1].EndTime = (long)((p.Start - 1) * 90.0); - } - - clusterStream.Position = 0; - var list = BluRaySupParser.ParseBluRaySup(clusterStream, log, true, lastPalettes, lastBitmapObjects); - foreach (var sup in list) - { - sup.StartTime = (long)((p.Start - 1) * 90.0); - sup.EndTime = (long)((p.End - 1) * 90.0); - subtitles.Add(sup); - - // fix overlapping - if (subtitles.Count > 1 && sub[subtitles.Count - 2].End > sub[subtitles.Count - 1].Start) - { - subtitles[subtitles.Count - 2].EndTime = subtitles[subtitles.Count - 1].StartTime - 1; - } - } - - clusterStream = new MemoryStream(); - } - } - else if (subtitles.Count > 0) - { - var lastSub = subtitles[subtitles.Count - 1]; - if (lastSub.StartTime == lastSub.EndTime) - { - lastSub.EndTime = (long)((p.Start - 1) * 90.0); - if (lastSub.EndTime - lastSub.StartTime > 1000000) - { - lastSub.EndTime = lastSub.StartTime; - } - } - } - } - - if (noOfErrors > 0) - { - MessageBox.Show(string.Format("{0} error(s) occurred during extraction of bdsup\r\n\r\n{1}", noOfErrors, lastError)); - } - - using (var formSubOcr = new VobSubOcr()) - { - formSubOcr.Initialize(subtitles, Configuration.Settings.VobSubOcr, matroska.Path); - if (_loading) - { - formSubOcr.Icon = (Icon)Icon.Clone(); - formSubOcr.ShowInTaskbar = true; - formSubOcr.ShowIcon = true; - } - - if (formSubOcr.ShowDialog(this) == DialogResult.OK) - { - MakeHistoryForUndo(_language.BeforeImportingDvdSubtitle); - - _subtitle.Paragraphs.Clear(); - SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); - foreach (var p in formSubOcr.SubtitleFromOcr.Paragraphs) - { - _subtitle.Paragraphs.Add(p); - } - - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - _subtitleListViewIndex = -1; - SubtitleListview1.FirstVisibleIndex = -1; - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - - _fileName = string.Empty; - SetTitle(); - - Configuration.Settings.Save(); - return true; - } - } - - return false; - } - - private bool ContainsBluRayStartSegment(byte[] buffer) - { - const int epochStart = 0x80; - var position = 0; - while (position + 3 <= buffer.Length) - { - var segmentType = buffer[position]; - if (segmentType == epochStart) - { - return true; - } - - int length = BluRaySupParser.BigEndianInt16(buffer, position + 1) + 3; - position += length; - } - - return false; - } - - private void ImportSubtitleFromDvbSupFile(string fileName) - { - using (var formSubOcr = new VobSubOcr()) - { - string language = null; - var programMapTableParser = new ProgramMapTableParser(); - programMapTableParser.Parse(fileName); // get languages - if (programMapTableParser.GetSubtitlePacketIds().Count > 0) - { - language = programMapTableParser.GetSubtitleLanguageTwoLetter(programMapTableParser.GetSubtitlePacketIds().First()); - } - - var subtitles = TransportStreamParser.GetDvbSup(fileName); - formSubOcr.Initialize(subtitles, Configuration.Settings.VobSubOcr, fileName, language); - if (formSubOcr.ShowDialog(this) == DialogResult.OK) - { - MakeHistoryForUndo(_language.BeforeImportingDvdSubtitle); - - _subtitle.Paragraphs.Clear(); - SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); - foreach (var p in formSubOcr.SubtitleFromOcr.Paragraphs) - { - _subtitle.Paragraphs.Add(p); - } - - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - _subtitleListViewIndex = -1; - SubtitleListview1.FirstVisibleIndex = -1; - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - - _fileName = string.Empty; - SetTitle(); - - Configuration.Settings.Save(); - } - } - } - - private bool ImportSubtitleFromTransportStream(string fileName) - { - ShowStatus(_language.ParsingTransportStream); - Refresh(); - var tsParser = new TransportStreamParser(); - tsParser.Parse(fileName, (pos, total) => UpdateProgress(pos, total, _language.ParsingTransportStreamFile)); - ShowStatus(string.Empty); - TaskbarList.SetProgressState(Handle, TaskbarButtonProgressFlags.NoProgress); - - if (tsParser.SubtitlePacketIds.Count == 0 && tsParser.TeletextSubtitlesLookup.Count == 0) - { - MessageBox.Show(_language.NoSubtitlesFound); - _exitWhenLoaded = _loading; - return false; - } - - if (tsParser.SubtitlePacketIds.Count == 0 && tsParser.TeletextSubtitlesLookup.Count == 1 && tsParser.TeletextSubtitlesLookup.First().Value.Count() == 1) - { - _subtitle = new Subtitle(tsParser.TeletextSubtitlesLookup.First().Value.First().Value); - _subtitle.Renumber(); - SubtitleListview1.Fill(_subtitle); - SubtitleListview1.SelectIndexAndEnsureVisible(0); - if (!Configuration.Settings.General.DisableVideoAutoLoading) - { - OpenVideo(fileName); - } - - _fileName = Path.GetFileNameWithoutExtension(fileName) + GetCurrentSubtitleFormat().Extension; - _converted = true; - SetTitle(); - return true; - } - - int packetId; - if (tsParser.SubtitlePacketIds.Count + tsParser.TeletextSubtitlesLookup.Sum(p => p.Value.Count()) > 1) - { - using (var subChooser = new TransportStreamSubtitleChooser()) - { - subChooser.Initialize(tsParser, fileName); - if (subChooser.ShowDialog(this) == DialogResult.Cancel) - { - return false; - } - - if (subChooser.IsTeletext) - { - new SubRip().LoadSubtitle(_subtitle, subChooser.Srt.SplitToLines(), null); - _subtitle.Renumber(); - SubtitleListview1.Fill(_subtitle); - SubtitleListview1.SelectIndexAndEnsureVisible(0); - if (!Configuration.Settings.General.DisableVideoAutoLoading) - { - OpenVideo(fileName); - } - - _fileName = Path.GetFileNameWithoutExtension(fileName) + GetCurrentSubtitleFormat().Extension; - _converted = true; - SetTitle(); - return true; - } - - packetId = tsParser.SubtitlePacketIds[subChooser.SelectedIndex]; - } - } - else - { - packetId = tsParser.SubtitlePacketIds[0]; - } - - - var subtitles = tsParser.GetDvbSubtitles(packetId); - using (var formSubOcr = new VobSubOcr()) - { - string language = null; - var programMapTableParser = new ProgramMapTableParser(); - programMapTableParser.Parse(fileName); // get languages - if (programMapTableParser.GetSubtitlePacketIds().Count > 0) - { - language = programMapTableParser.GetSubtitleLanguage(packetId); - } - - formSubOcr.Initialize(subtitles, Configuration.Settings.VobSubOcr, fileName, language); - if (formSubOcr.ShowDialog(this) == DialogResult.OK) - { - MakeHistoryForUndo(_language.BeforeImportingDvdSubtitle); - - _subtitle.Paragraphs.Clear(); - SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); - foreach (var p in formSubOcr.SubtitleFromOcr.Paragraphs) - { - _subtitle.Paragraphs.Add(p); - } - - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - _subtitleListViewIndex = -1; - SubtitleListview1.FirstVisibleIndex = -1; - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - - _fileName = string.Empty; - if (!string.IsNullOrEmpty(formSubOcr.FileName)) - { - var currentFormat = GetCurrentSubtitleFormat(); - _fileName = Utilities.GetPathAndFileNameWithoutExtension(formSubOcr.FileName) + currentFormat.Extension; - if (!Configuration.Settings.General.DisableVideoAutoLoading) - { - OpenVideo(fileName); - } - _converted = true; - } - SetTitle(); - Configuration.Settings.Save(); - return true; - } - } - - _exitWhenLoaded = _loading; - return false; - } - - private bool ImportSubtitleFromMp4(string fileName) - { - var mp4Parser = new MP4Parser(fileName); - var mp4SubtitleTracks = mp4Parser.GetSubtitleTracks(); - if (mp4SubtitleTracks.Count == 0) - { - MessageBox.Show(_language.NoSubtitlesFound); - return false; - } - else if (mp4SubtitleTracks.Count == 1) - { - LoadMp4Subtitle(fileName, mp4SubtitleTracks[0]); - return true; - } - else - { - using (var subtitleChooser = new MatroskaSubtitleChooser("mp4")) - { - subtitleChooser.Initialize(mp4SubtitleTracks); - if (subtitleChooser.ShowDialog(this) == DialogResult.OK) - { - LoadMp4Subtitle(fileName, mp4SubtitleTracks[subtitleChooser.SelectedIndex]); - return true; - } - } - - return false; - } - } - - private bool ImportSubtitleFromDivX(string fileName) - { - var count = 0; - var list = new List(); - using (var f = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) - { - var searchBuffer = new byte[2048]; - long pos = 0; - long length = f.Length - 50; - while (pos < length) - { - f.Position = pos; - int readCount = f.Read(searchBuffer, 0, searchBuffer.Length); - for (int i = 0; i < readCount; i++) - { - if (searchBuffer[i] != 0x5b || (i + 4 < readCount && (searchBuffer[i + 1] < 0x30 || searchBuffer[i + 1] > 0x39 || searchBuffer[i + 3] != 0x3a))) - { - continue; - } - - f.Position = pos + i + 1; - - var buffer = new byte[26]; - f.Read(buffer, 0, buffer.Length); - - if (buffer[2] == 0x3a && // : - buffer[5] == 0x3a && // : - buffer[8] == 0x2e && // . - buffer[12] == 0x2d && // - - buffer[15] == 0x3a && // : - buffer[18] == 0x3a && // : - buffer[21] == 0x2e && // . - buffer[25] == 0x5d) // ] - { // subtitle time code - string timeCode = Encoding.ASCII.GetString(buffer, 0, 25); - - f.Read(buffer, 0, 2); - int width = BitConverter.ToUInt16(buffer, 0); - f.Read(buffer, 0, 2); - int height = BitConverter.ToUInt16(buffer, 0); - f.Read(buffer, 0, 2); - int x = BitConverter.ToUInt16(buffer, 0); - f.Read(buffer, 0, 2); - int y = BitConverter.ToUInt16(buffer, 0); - f.Read(buffer, 0, 2); - int xEnd = BitConverter.ToUInt16(buffer, 0); - f.Read(buffer, 0, 2); - int yEnd = BitConverter.ToUInt16(buffer, 0); - f.Read(buffer, 0, 2); - int RleLength = BitConverter.ToUInt16(buffer, 0); - - var colorBuffer = new byte[4 * 3]; // four colors with rgb (3 bytes) - f.Read(colorBuffer, 0, colorBuffer.Length); - - buffer = new byte[RleLength]; - int bytesRead = f.Read(buffer, 0, buffer.Length); - - if (width > 0 && height > 0 && bytesRead == buffer.Length) - { - var xSub = new XSub(timeCode, width, height, colorBuffer, buffer); - list.Add(xSub); - count++; - } - } - } - - pos += searchBuffer.Length; - } - } - - if (count == 0) - { - return false; - } - - using (var formSubOcr = new VobSubOcr()) - { - formSubOcr.Initialize(list, Configuration.Settings.VobSubOcr, fileName); // TODO: language??? - if (formSubOcr.ShowDialog(this) == DialogResult.OK) - { - MakeHistoryForUndo(_language.BeforeImportFromMatroskaFile); - _subtitleListViewIndex = -1; - FileNew(); - foreach (var p in formSubOcr.SubtitleFromOcr.Paragraphs) - { - _subtitle.Paragraphs.Add(p); - } - - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - _subtitleListViewIndex = -1; - SubtitleListview1.FirstVisibleIndex = -1; - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - - _fileName = Utilities.GetPathAndFileNameWithoutExtension(fileName) + GetCurrentSubtitleFormat().Extension; - _converted = true; - SetTitle(); - - Configuration.Settings.Save(); - if (!Configuration.Settings.General.DisableVideoAutoLoading) - { - OpenVideo(fileName); - } - } - } - - return true; - } - - private static Subtitle LoadMp4SubtitleForSync(Trak mp4SubtitleTrack) - { - var subtitle = new Subtitle(); - if (mp4SubtitleTrack.Mdia.IsVobSubSubtitle) - { - return subtitle; - } - else - { - subtitle.Paragraphs.AddRange(mp4SubtitleTrack.Mdia.Minf.Stbl.GetParagraphs()); - } - - return subtitle; - } - - private void LoadMp4Subtitle(string fileName, Trak mp4SubtitleTrack) - { - if (mp4SubtitleTrack.Mdia.IsVobSubSubtitle) - { - var subPicturesWithTimeCodes = new List(); - var paragraphs = mp4SubtitleTrack.Mdia.Minf.Stbl.GetParagraphs(); - for (int i = 0; i < paragraphs.Count; i++) - { - if (mp4SubtitleTrack.Mdia.Minf.Stbl.SubPictures.Count > i) - { - var start = paragraphs[i].StartTime.TimeSpan; - var end = paragraphs[i].EndTime.TimeSpan; - subPicturesWithTimeCodes.Add(new VobSubOcr.SubPicturesWithSeparateTimeCodes(mp4SubtitleTrack.Mdia.Minf.Stbl.SubPictures[i], start, end)); - } - } - - using (var formSubOcr = new VobSubOcr()) - { - formSubOcr.Initialize(subPicturesWithTimeCodes, Configuration.Settings.VobSubOcr, fileName); // TODO: language??? - if (formSubOcr.ShowDialog(this) == DialogResult.OK) - { - MakeHistoryForUndo(_language.BeforeImportFromMatroskaFile); - _subtitleListViewIndex = -1; - FileNew(); - foreach (var p in formSubOcr.SubtitleFromOcr.Paragraphs) - { - _subtitle.Paragraphs.Add(p); - } - - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - _subtitleListViewIndex = -1; - SubtitleListview1.FirstVisibleIndex = -1; - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - - _fileName = Utilities.GetPathAndFileNameWithoutExtension(fileName) + GetCurrentSubtitleFormat().Extension; - _converted = true; - SetTitle(); - - Configuration.Settings.Save(); - } - } - } - else - { - MakeHistoryForUndo(_language.BeforeImportFromMatroskaFile); - _subtitleListViewIndex = -1; - FileNew(); - - _subtitle.Paragraphs.AddRange(mp4SubtitleTrack.Mdia.Minf.Stbl.GetParagraphs()); - - SetEncoding(Encoding.UTF8); - ShowStatus(_language.SubtitleImportedFromMatroskaFile); - _subtitle.Renumber(); - if (fileName.EndsWith(".mp4", StringComparison.OrdinalIgnoreCase) || fileName.EndsWith(".m4v", StringComparison.OrdinalIgnoreCase)) - { - _fileName = fileName.Substring(0, fileName.Length - 4) + GetCurrentSubtitleFormat().Extension; - } - - SetTitle(); - _fileDateTime = new DateTime(); - _converted = true; - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - if (_subtitle.Paragraphs.Count > 0) - { - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - } - - ShowSource(); - } - } - - private void SubtitleListview1_DragEnter(object sender, DragEventArgs e) - { - // make sure they're actually dropping files (not text or anything else) - if (e.Data.GetDataPresent(DataFormats.FileDrop, false)) - { - e.Effect = DragDropEffects.All; - } - } - - private void SubtitleListview1_DragDrop(object sender, DragEventArgs e) - { - _dragAndDropFiles = (string[])e.Data.GetData(DataFormats.FileDrop); - if (_dragAndDropFiles.Length == 1) - { - _dragAndDropTimer.Start(); - } - else - { - MessageBox.Show(_language.DropOnlyOneFile); - } - } - - private void DoSubtitleListview1Drop(object sender, EventArgs e) - { - _dragAndDropTimer.Stop(); - - if (ContinueNewOrExit()) - { - string fileName = _dragAndDropFiles[0]; - var file = new FileInfo(fileName); - - // Do not allow directory drop - if (FileUtil.IsDirectory(fileName)) - { - MessageBox.Show(_language.ErrorDirectoryDropNotAllowed, file.Name, MessageBoxButtons.OK, MessageBoxIcon.Error); - return; - } - - var dirName = Path.GetDirectoryName(fileName); - saveFileDialog1.InitialDirectory = dirName; - openFileDialog1.InitialDirectory = dirName; - var ext = file.Extension.ToLowerInvariant(); - - if (ext == ".mkv" || ext == ".mks") - { - using (var matroska = new MatroskaFile(fileName)) - { - if (matroska.IsValid) - { - var subtitleList = matroska.GetTracks(true); - if (subtitleList.Count == 0) - { - MessageBox.Show(_language.NoSubtitlesFound); - } - else if (subtitleList.Count > 1) - { - using (var subtitleChooser = new MatroskaSubtitleChooser("mkv")) - { - subtitleChooser.Initialize(subtitleList); - if (subtitleChooser.ShowDialog(this) == DialogResult.OK) - { - ResetSubtitle(); - if (LoadMatroskaSubtitle(subtitleList[subtitleChooser.SelectedIndex], matroska, false) && - (ext.Equals(".mkv", StringComparison.Ordinal) || ext.Equals(".mks", StringComparison.Ordinal)) && - !Configuration.Settings.General.DisableVideoAutoLoading) - { - OpenVideo(fileName); - } - } - } - } - else - { - ResetSubtitle(); - if (LoadMatroskaSubtitle(subtitleList[0], matroska, false) && - (ext.Equals(".mkv", StringComparison.Ordinal) || ext.Equals(".mks", StringComparison.Ordinal)) && - !Configuration.Settings.General.DisableVideoAutoLoading) - { - OpenVideo(fileName); - } - } - - return; - } - } - } - else if (ext == ".mp4" || ext == ".m4v" || ext == ".3gp") - { - var mp4Parser = new MP4Parser(fileName); - var mp4SubtitleTracks = mp4Parser.GetSubtitleTracks(); - if (mp4SubtitleTracks.Count > 0) - { - ImportSubtitleFromMp4(fileName); - return; - } - - MessageBox.Show(_language.NoSubtitlesFound); - return; - } - else if (ext == ".vob" || ext == ".ifo") - { - ImportDvdSubtitle(fileName); - return; - } - else if (ext == ".idx") - { - var subFileName = fileName.Substring(0, fileName.Length - 3) + "sub"; - if (File.Exists(subFileName) && FileUtil.IsVobSub(subFileName)) - { - ImportAndOcrVobSubSubtitleNew(subFileName, _loading); - return; - } - } - - comboBoxEncoding.BeginUpdate(); - comboBoxSubtitleFormats.BeginUpdate(); - - if (file.Length < Subtitle.MaxFileSize) - { - if (!OpenFromRecentFiles(fileName)) - { - OpenSubtitle(fileName, null); - } - } - else if (file.Length < 150000000 && ext == ".sub" && IsVobSubFile(fileName, true)) // max 150 mb - { - OpenSubtitle(fileName, null); - } - else if (file.Length < 250000000 && ext == ".sup" && FileUtil.IsBluRaySup(fileName)) // max 250 mb - { - OpenSubtitle(fileName, null); - } - else if ((ext == ".ts" || ext == ".rec" || ext == ".mpg" || ext == ".mpeg") && FileUtil.IsTransportStream(fileName)) - { - OpenSubtitle(fileName, null); - } - else if ((ext == ".m2ts" || ext == ".ts" || ext == ".mts") && FileUtil.IsM2TransportStream(fileName)) - { - OpenSubtitle(fileName, null); - } - else - { - MessageBox.Show(string.Format(_language.DropFileXNotAccepted, fileName)); - } - - comboBoxSubtitleFormats.EndUpdate(); - comboBoxEncoding.EndUpdate(); - } - } - - private void TextBoxSourceDragEnter(object sender, DragEventArgs e) - { - // make sure they're actually dropping files (not text or anything else) - if (e.Data.GetDataPresent(DataFormats.FileDrop, false)) - { - e.Effect = DragDropEffects.All; - } - } - - private void TextBoxSourceDragDrop(object sender, DragEventArgs e) - { - var files = (string[])e.Data.GetData(DataFormats.FileDrop); - if (files.Length == 1) - { - if (ContinueNewOrExit()) - { - OpenSubtitle(files[0], null); - } - } - else - { - MessageBox.Show(_language.DropOnlyOneFile); - } - } - - private void ToolStripMenuItemManualAnsiClick(object sender, EventArgs e) - { - ReloadFromSourceView(); - openFileDialog1.Title = _language.OpenAnsiSubtitle; - openFileDialog1.FileName = string.Empty; - openFileDialog1.Filter = UiUtil.SubtitleExtensionFilter.Value; - if (openFileDialog1.ShowDialog(this) == DialogResult.OK) - { - using (var chooseEncoding = new ChooseEncoding()) - { - chooseEncoding.Initialize(openFileDialog1.FileName); - if (chooseEncoding.ShowDialog(this) == DialogResult.OK) - { - Encoding encoding = chooseEncoding.GetEncoding(); - SetEncoding(Encoding.UTF8); - OpenSubtitle(openFileDialog1.FileName, encoding); - } - } - } - } - - private void ChangeCasingToolStripMenuItem_Click(object sender, EventArgs e) - { - ChangeCasing(false); - } - - private void ChangeCasing(bool onlySelectedLines) - { - if (!IsSubtitleLoaded) - { - DisplaySubtitleNotLoadedMessage(); - return; - } - - SaveSubtitleListviewIndices(); - using (var changeCasing = new ChangeCasing()) - { - if (onlySelectedLines) - { - changeCasing.Text += " - " + _language.SelectedLines; - } - - ReloadFromSourceView(); - if (changeCasing.ShowDialog(this) == DialogResult.OK) - { - MakeHistoryForUndo(_language.BeforeChangeCasing); - - Cursor.Current = Cursors.WaitCursor; - var selectedLines = new Subtitle(); - var selectedIndices = new List(SubtitleListview1.GetSelectedIndices()); - if (onlySelectedLines) - { - foreach (int index in selectedIndices) - { - selectedLines.Paragraphs.Add(new Paragraph(_subtitle.Paragraphs[index])); - } - } - else - { - foreach (var p in _subtitle.Paragraphs) - { - selectedLines.Paragraphs.Add(new Paragraph(p)); - } - } - - bool saveChangeCaseChanges = true; - var casingNamesLinesChanged = 0; - - if (changeCasing.ChangeNamesToo && changeCasing.OnlyAllUpper) - { - selectedIndices = new List(); - var allUpperSubtitle = new Subtitle(); - var sub = onlySelectedLines ? selectedLines : _subtitle; - for (var index = 0; index < sub.Paragraphs.Count; index++) - { - var p = sub.Paragraphs[index]; - var noTags = HtmlUtil.RemoveHtmlTags(p.Text, true); - if (noTags == noTags.ToUpperInvariant()) - { - allUpperSubtitle.Paragraphs.Add(p); - selectedIndices.Add(index); - } - } - - selectedLines = allUpperSubtitle; - onlySelectedLines = true; - } - - changeCasing.FixCasing(selectedLines, LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle)); - if (changeCasing.ChangeNamesToo) - { - using (var changeCasingNames = new ChangeCasingNames()) - { - changeCasingNames.Initialize(selectedLines); - if (changeCasingNames.ShowDialog(this) == DialogResult.OK) - { - changeCasingNames.FixCasing(); - casingNamesLinesChanged = changeCasingNames.LinesChanged; - - if (changeCasing.LinesChanged == 0) - { - ShowStatus(string.Format(_language.CasingCompleteMessageOnlyNames, casingNamesLinesChanged, _subtitle.Paragraphs.Count)); - } - else - { - ShowStatus(string.Format(_language.CasingCompleteMessage, changeCasing.LinesChanged, _subtitle.Paragraphs.Count, casingNamesLinesChanged)); - } - } - else - { - saveChangeCaseChanges = false; - } - } - } - else - { - ShowStatus(string.Format(_language.CasingCompleteMessageNoNames, changeCasing.LinesChanged, _subtitle.Paragraphs.Count)); - } - - if (saveChangeCaseChanges) - { - if (onlySelectedLines) - { - int i = 0; - foreach (int index in selectedIndices) - { - _subtitle.Paragraphs[index].Text = selectedLines.Paragraphs[i].Text; - i++; - } - } - else - { - for (int i = 0; i < _subtitle.Paragraphs.Count; i++) - { - _subtitle.Paragraphs[i].Text = selectedLines.Paragraphs[i].Text; - } - } - - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - if (changeCasing.LinesChanged > 0 || casingNamesLinesChanged > 0) - { - _subtitleListViewIndex = -1; - RestoreSubtitleListviewIndices(); - UpdateSourceView(); - } - } - - Cursor.Current = Cursors.Default; - } - } - } - - private void ToolStripMenuItemChangeFrameRateClick(object sender, EventArgs e) - { - if (!IsSubtitleLoaded) - { - DisplaySubtitleNotLoadedMessage(); - return; - } - - int lastSelectedIndex = 0; - if (SubtitleListview1.SelectedItems.Count > 0) - { - lastSelectedIndex = SubtitleListview1.SelectedItems[0].Index; - } - - ReloadFromSourceView(); - using (var changeFrameRate = new ChangeFrameRate()) - { - changeFrameRate.Initialize(CurrentFrameRate.ToString()); - if (changeFrameRate.ShowDialog(this) == DialogResult.OK) - { - MakeHistoryForUndo(_language.BeforeChangeFrameRate); - - double oldFrameRate = changeFrameRate.OldFrameRate; - double newFrameRate = changeFrameRate.NewFrameRate; - _subtitle.ChangeFrameRate(oldFrameRate, newFrameRate); - - ShowStatus(string.Format(_language.FrameRateChangedFromXToY, oldFrameRate, newFrameRate)); - toolStripComboBoxFrameRate.Text = newFrameRate.ToString(); - - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - _subtitleListViewIndex = -1; - SubtitleListview1.SelectIndexAndEnsureVisible(lastSelectedIndex, true); - } - } - } - - private bool IsVobSubFile(string subFileName, bool verbose) - { - try - { - if (FileUtil.IsVobSub(subFileName)) - { - if (!verbose) - { - return true; - } - - var idxFileName = Utilities.GetPathAndFileNameWithoutExtension(subFileName) + ".idx"; - if (File.Exists(idxFileName)) - { - return true; - } - - var dr = MessageBox.Show(string.Format(_language.IdxFileNotFoundWarning, idxFileName), _title, MessageBoxButtons.YesNoCancel); - return dr == DialogResult.Yes; - } - - if (verbose) - { - MessageBox.Show(string.Format(_language.InvalidVobSubHeader, subFileName)); - } - } - catch (Exception ex) - { - if (verbose) - { - MessageBox.Show(ex.Message); - } - } - - return false; - } - - private void ImportAndOcrSpDvdSup(string fileName, bool showInTaskbar) - { - var spList = new List(); - - using (var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read)) - { - var buffer = new byte[SpHeader.SpHeaderLength]; - int bytesRead = fs.Read(buffer, 0, buffer.Length); - var header = new SpHeader(buffer); - - while (header.Identifier == "SP" && bytesRead > 0 && header.NextBlockPosition > 4) - { - buffer = new byte[header.NextBlockPosition]; - bytesRead = fs.Read(buffer, 0, buffer.Length); - if (bytesRead == buffer.Length) - { - header.AddPicture(buffer); - spList.Add(header); - } - - buffer = new byte[SpHeader.SpHeaderLength]; - bytesRead = fs.Read(buffer, 0, buffer.Length); - while (bytesRead == buffer.Length && Encoding.ASCII.GetString(buffer, 0, 2) != "SP") - { - fs.Seek(fs.Position - buffer.Length + 1, SeekOrigin.Begin); - bytesRead = fs.Read(buffer, 0, buffer.Length); - } - header = new SpHeader(buffer); - } - } - - using (var vobSubOcr = new VobSubOcr()) - { - if (showInTaskbar) - { - vobSubOcr.Icon = (Icon)this.Icon.Clone(); - vobSubOcr.ShowInTaskbar = true; - vobSubOcr.ShowIcon = true; - } - - vobSubOcr.Initialize(fileName, null, Configuration.Settings.VobSubOcr, spList); - if (vobSubOcr.ShowDialog(this) == DialogResult.OK) - { - MakeHistoryForUndo(_language.BeforeImportingVobSubFile); - FileNew(); - _subtitle.Paragraphs.Clear(); - SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); - foreach (var p in vobSubOcr.SubtitleFromOcr.Paragraphs) - { - _subtitle.Paragraphs.Add(p); - } - - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - _subtitleListViewIndex = -1; - SubtitleListview1.FirstVisibleIndex = -1; - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - - _fileName = Path.ChangeExtension(vobSubOcr.FileName, GetCurrentSubtitleFormat().Extension); - SetTitle(); - _converted = true; - - Configuration.Settings.Save(); - } - else - { - _exitWhenLoaded = _loading; - } - } - } - - private void ImportAndOcrVobSubSubtitleNew(string fileName, bool showInTaskbar) - { - if (!IsVobSubFile(fileName, true)) - { - return; - } - - using (var vobSubOcr = new VobSubOcr()) - { - if (showInTaskbar) - { - vobSubOcr.Icon = (Icon)Icon.Clone(); - vobSubOcr.ShowInTaskbar = true; - vobSubOcr.ShowIcon = true; - } - - if (vobSubOcr.Initialize(fileName, Configuration.Settings.VobSubOcr, this) && vobSubOcr.ShowDialog(this) == DialogResult.OK) - { - MakeHistoryForUndo(_language.BeforeImportingVobSubFile); - FileNew(); - _subtitle.Paragraphs.Clear(); - SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); - foreach (var p in vobSubOcr.SubtitleFromOcr.Paragraphs) - { - _subtitle.Paragraphs.Add(p); - } - - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - _subtitleListViewIndex = -1; - SubtitleListview1.FirstVisibleIndex = -1; - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - - _fileName = Path.ChangeExtension(vobSubOcr.FileName, GetCurrentSubtitleFormat().Extension); - SetTitle(); - _converted = true; - - Configuration.Settings.Save(); - } - else - { - _exitWhenLoaded = _loading; - } - } - } - - private void ToolStripMenuItemMergeLinesClick(object sender, EventArgs e) - { - if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count >= 1) - { - // check consecutive numbers - var last = SubtitleListview1.SelectedIndices[0] - 1; - foreach (int index in SubtitleListview1.SelectedIndices) - { - if (last != index - 1) - { - return; - } - - last = index; - } - - MergeAfterToolStripMenuItemClick(null, null); - } - } - - private void VisualSyncSelectedLinesToolStripMenuItemClick(object sender, EventArgs e) - { - ShowVisualSync(true); - } - - private void SaveSubtitleListviewIndices() - { - _selectedIndices = new List(); - foreach (int index in SubtitleListview1.SelectedIndices) - { - _selectedIndices.Add(index); - } - } - - private void RestoreSubtitleListviewIndices() - { - _subtitleListViewIndex = -1; - if (_selectedIndices != null) - { - SubtitleListview1.SelectNone(); - int i = 0; - foreach (int index in _selectedIndices) - { - if (index >= 0 && index < SubtitleListview1.Items.Count) - { - SubtitleListview1.Items[index].Selected = true; - if (i == 0) - { - SubtitleListview1.SelectIndexAndEnsureVisible(index, true); - } - } - - i++; - } - } - } - - private void ShowSelectedLinesEarlierlaterToolStripMenuItemClick(object sender, EventArgs e) - { - if (!IsSubtitleLoaded) - { - DisplaySubtitleNotLoadedMessage(); - return; - } - - if (_showEarlierOrLater != null && !_showEarlierOrLater.IsDisposed) - { - _showEarlierOrLater.WindowState = FormWindowState.Normal; - _showEarlierOrLater.Focus(); - return; - } - - bool waveformEnabled = timerWaveform.Enabled; - timerWaveform.Stop(); - timer1.Stop(); - - _showEarlierOrLater = new ShowEarlierLater(); - if (!_showEarlierOrLater.IsPositionAndSizeSaved) - { - _showEarlierOrLater.Top = Top + 100; - _showEarlierOrLater.Left = Left + (Width / 2) - (_showEarlierOrLater.Width / 3); - } - - _showEarlierOrLater.Initialize(ShowEarlierOrLater, true); - MakeHistoryForUndo(_language.BeforeShowSelectedLinesEarlierLater); - _showEarlierOrLater.Show(this); - - timerWaveform.Enabled = waveformEnabled; - timer1.Start(); - - RefreshSelectedParagraph(); - } - - public static Control FindFocusedControl(Control control) - { - var container = control as ContainerControl; - while (container != null) - { - control = container.ActiveControl; - container = control as ContainerControl; - } - - return control; - } - - internal void MainKeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.LWin) - { - _winLeftDownTicks = DateTime.UtcNow.Ticks; - } - - if (e.KeyCode == Keys.RWin) - { - _winRightDownTicks = DateTime.UtcNow.Ticks; - } - - if ((DateTime.UtcNow.Ticks - _winLeftDownTicks) <= 10000 * 999 || (DateTime.UtcNow.Ticks - _winRightDownTicks) <= 10000 * 999) // less than 999 ms - { - // if it's less than one second since Win key was pressed we ignore key (not perfect...) - e.SuppressKeyPress = true; - return; - } - - if (e.Modifiers == Keys.Alt && e.KeyCode == (Keys.RButton | Keys.ShiftKey) && (textBoxListViewText.Focused || textBoxListViewTextAlternate.Focused)) - { // annoying that focus leaves textbox while typing, when pressing Alt alone - e.SuppressKeyPress = true; - return; - } - - if (e.Modifiers == Keys.Alt && e.KeyCode == (Keys.RButton | Keys.ShiftKey)) - { - return; - } - - if (e.Modifiers == Keys.Shift && e.KeyCode == Keys.ShiftKey) - { - return; - } - - if (e.Modifiers == Keys.Control && e.KeyCode == (Keys.LButton | Keys.ShiftKey)) - { - return; - } - - if (e.Modifiers == (Keys.Control | Keys.Shift) && e.KeyCode == Keys.ShiftKey) - { - return; - } - - var fc = FindFocusedControl(this); - if (fc != null && e.Modifiers != Keys.Control && e.Modifiers != Keys.Alt && e.Modifiers != (Keys.Control | Keys.Shift) && e.Modifiers != (Keys.Control | Keys.Alt) && e.Modifiers != (Keys.Control | Keys.Shift | Keys.Alt)) - { - // do not check for shortcuts if text is being entered and a textbox is focused - if ((fc.Parent.Name == textBoxListViewText.Name || fc.Parent.Name == textBoxListViewTextAlternate.Name || fc.Name == textBoxSearchWord.Name) && - ((e.KeyCode >= Keys.A && e.KeyCode <= Keys.Z) || (e.KeyCode >= Keys.OemSemicolon && e.KeyCode <= Keys.OemBackslash))) - { - return; - } - - // do not check for shortcuts if a number is being entered and a time box is focused - if (fc.Parent != null && (fc.Parent.Name == timeUpDownStartTime.Name || fc.Parent.Name == numericUpDownDuration.Name) && - (e.KeyCode >= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9 || e.KeyValue >= 48 && e.KeyValue <= 57)) - { - return; - } - } - - bool inListView = tabControlSubtitle.SelectedIndex == TabControlListView; - - - if (e.KeyCode == Keys.Escape && !_cancelWordSpellCheck) - { - _cancelWordSpellCheck = true; - } - else if (audioVisualizer.Visible && e.KeyData == _shortcuts.WaveformVerticalZoom) - { - audioVisualizer.VerticalZoomFactor *= 1.1; - e.SuppressKeyPress = true; - } - else if (audioVisualizer.Visible && e.KeyData == _shortcuts.WaveformVerticalZoomOut) - { - audioVisualizer.VerticalZoomFactor /= 1.1; - e.SuppressKeyPress = true; - } - else if (audioVisualizer.Visible && e.KeyData == _shortcuts.WaveformZoomIn) - { - audioVisualizer.ZoomIn(); - e.SuppressKeyPress = true; - } - else if (audioVisualizer.Visible && e.KeyData == _shortcuts.WaveformZoomOut) - { - audioVisualizer.ZoomOut(); - e.SuppressKeyPress = true; - } - else if (audioVisualizer.Visible && e.KeyData == _shortcuts.WaveformSplit) - { - if (mediaPlayer.IsPaused) - { - var pos = mediaPlayer.VideoPlayer.CurrentPosition; - var paragraph = _subtitle.GetFirstParagraphOrDefaultByTime(pos * TimeCode.BaseUnit); - if (paragraph != null && - pos * TimeCode.BaseUnit + 100 > paragraph.StartTime.TotalMilliseconds && - pos * TimeCode.BaseUnit - 100 < paragraph.EndTime.TotalMilliseconds) - { - SubtitleListview1.SelectIndexAndEnsureVisible(paragraph); - SplitSelectedParagraph(pos, null); - } - } - - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.VideoPlayFirstSelected && !string.IsNullOrEmpty(VideoFileName)) - { - PlayFirstSelectedSubtitle(); - } - else if (audioVisualizer.Visible && (e.KeyData == _shortcuts.WaveformPlaySelection || e.KeyData == _shortcuts.WaveformPlaySelectionEnd)) - { - WaveformPlaySelection(nearEnd: e.KeyData == _shortcuts.WaveformPlaySelectionEnd); - e.SuppressKeyPress = true; - } - else if (audioVisualizer.Visible && e.KeyData == _shortcuts.WaveformSearchSilenceForward) - { - if (audioVisualizer.WavePeaks != null) - { - audioVisualizer.FindDataBelowThreshold(Configuration.Settings.VideoControls.WaveformSeeksSilenceMaxVolume, Configuration.Settings.VideoControls.WaveformSeeksSilenceDurationSeconds); - } - e.SuppressKeyPress = true; - } - else if (audioVisualizer.Visible && e.KeyData == _shortcuts.WaveformSearchSilenceBack) - { - if (audioVisualizer.WavePeaks != null) - { - audioVisualizer.FindDataBelowThresholdBack(Configuration.Settings.VideoControls.WaveformSeeksSilenceMaxVolume, Configuration.Settings.VideoControls.WaveformSeeksSilenceDurationSeconds); - } - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainInsertAfter == e.KeyData && inListView) - { - InsertAfter(string.Empty); - e.SuppressKeyPress = true; - textBoxListViewText.Focus(); - } - else if (_shortcuts.MainInsertBefore == e.KeyData && inListView) - { - InsertBefore(); - e.SuppressKeyPress = true; - textBoxListViewText.Focus(); - } - else if (_shortcuts.MainMergeDialog == e.KeyData && inListView) - { - MergeDialogs(); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainListViewToggleDashes == e.KeyData && inListView) - { - if (textBoxListViewText.Focused) - { - ToggleDashesTextBox(textBoxListViewText); - } - else if (textBoxListViewTextAlternate.Focused) - { - ToggleDashesTextBox(textBoxListViewTextAlternate); - } - else - { - ToggleDashes(); - } - e.SuppressKeyPress = true; - } - else if (!toolStripMenuItemRtlUnicodeControlChars.Visible && _shortcuts.MainEditFixRTLViaUnicodeChars == e.KeyData && inListView) - { - toolStripMenuItemRtlUnicodeControlChar_Click(null, null); - e.SuppressKeyPress = true; - } - else if (!toolStripMenuItemRemoveUnicodeControlChars.Visible && _shortcuts.MainEditRemoveRTLUnicodeChars == e.KeyData && inListView) - { - toolStripMenuItemRemoveUnicodeControlChar_Click(null, null); - e.SuppressKeyPress = true; - } - else if (!toolStripMenuItemReverseRightToLeftStartEnd.Visible && _shortcuts.MainEditReverseStartAndEndingForRtl == e.KeyData && inListView) - { - ReverseStartAndEndingForRtl(); - e.SuppressKeyPress = true; - } - else if (toolStripMenuItemUndo.ShortcutKeys == e.KeyData) // undo - { - toolStripMenuItemUndo_Click(sender, e); - e.SuppressKeyPress = true; - } - else if (toolStripMenuItemRedo.ShortcutKeys == e.KeyData) // redo - { - toolStripMenuItemRedo_Click(sender, e); - e.SuppressKeyPress = true; - } - else if (e.KeyCode == Keys.Down && e.Modifiers == Keys.Alt) - { - if (AutoRepeatContinueOn || AutoRepeatOn) - { - PlayNext(); - } - else - { - ButtonNextClick(null, null); - } - } - else if (e.KeyCode == Keys.Up && e.Modifiers == Keys.Alt) - { - if (AutoRepeatContinueOn || AutoRepeatOn) - { - PlayPrevious(); - } - else - { - ButtonPreviousClick(null, null); - } - - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainGeneralGoToNextSubtitle == e.KeyData) - { - MoveNextPrevious(0); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainGeneralGoToNextSubtitleCursorAtEnd == e.KeyData) - { - MoveNextPrevious(0); - textBoxListViewText.SelectionStart = textBoxListViewText.Text.Length; - textBoxListViewText.SelectionLength = 0; - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainGeneralGoToPrevSubtitle == e.KeyData) - { - if (AutoRepeatContinueOn || AutoRepeatOn) - { - PlayPrevious(); - } - else - { - ButtonPreviousClick(null, null); - } - - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainGeneralGoToStartOfCurrentSubtitle == e.KeyData) - { - if (SubtitleListview1.SelectedItems.Count == 1 && mediaPlayer.VideoPlayer != null) - { - mediaPlayer.CurrentPosition = _subtitle.Paragraphs[SubtitleListview1.SelectedItems[0].Index].StartTime.TotalSeconds; - e.SuppressKeyPress = true; - } - - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainGeneralGoToEndOfCurrentSubtitle == e.KeyData) - { - if (SubtitleListview1.SelectedItems.Count == 1 && mediaPlayer.VideoPlayer != null) - { - mediaPlayer.CurrentPosition = _subtitle.Paragraphs[SubtitleListview1.SelectedItems[0].Index].EndTime.TotalSeconds; - e.SuppressKeyPress = true; - } - - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainGoToPreviousSubtitleAndFocusVideo == e.KeyData) - { - int newIndex = _subtitleListViewIndex - 1; - if (newIndex >= 0) - { - _subtitleListViewIndex = -1; - SubtitleListview1.SelectIndexAndEnsureVisibleFaster(newIndex); - _subtitleListViewIndex = newIndex; - textBoxListViewText.Focus(); - textBoxListViewText.SelectAll(); - GotoSubtitleIndex(newIndex); - ShowSubtitle(); - e.SuppressKeyPress = true; - } - } - else if (_shortcuts.MainGoToNextSubtitleAndFocusVideo == e.KeyData) - { - int newIndex = _subtitleListViewIndex + 1; - if (newIndex < _subtitle.Paragraphs.Count) - { - _subtitleListViewIndex = -1; - SubtitleListview1.SelectIndexAndEnsureVisibleFaster(newIndex); - _subtitleListViewIndex = newIndex; - textBoxListViewText.Focus(); - textBoxListViewText.SelectAll(); - GotoSubtitleIndex(newIndex); - ShowSubtitle(); - e.SuppressKeyPress = true; - } - } - else if (_shortcuts.MainGoToNextSubtitleAndPlay == e.KeyData && mediaPlayer != null) - { - int newIndex = _subtitleListViewIndex + 1; - if (newIndex < _subtitle.Paragraphs.Count) - { - _subtitleListViewIndex = -1; - SubtitleListview1.SelectIndexAndEnsureVisibleFaster(newIndex); - _subtitleListViewIndex = newIndex; - textBoxListViewText.Focus(); - textBoxListViewText.SelectAll(); - GotoSubtitleIndex(newIndex); - var p = _subtitle.GetParagraphOrDefault(newIndex); - if (p != null) - { - mediaPlayer.CurrentPosition = p.StartTime.TotalSeconds; - ShowSubtitle(); - mediaPlayer.Play(); - _endSeconds = p.EndTime.TotalSeconds; - } - - e.SuppressKeyPress = true; - } - } - else if (_shortcuts.MainGoToPrevSubtitleAndPlay == e.KeyData && mediaPlayer != null) - { - int newIndex = _subtitleListViewIndex - 1; - if (newIndex > 0) - { - _subtitleListViewIndex = -1; - SubtitleListview1.SelectIndexAndEnsureVisibleFaster(newIndex); - _subtitleListViewIndex = newIndex; - textBoxListViewText.Focus(); - textBoxListViewText.SelectAll(); - GotoSubtitleIndex(newIndex); - var p = _subtitle.GetParagraphOrDefault(newIndex); - if (p != null) - { - mediaPlayer.CurrentPosition = p.StartTime.TotalSeconds; - ShowSubtitle(); - mediaPlayer.Play(); - _endSeconds = p.EndTime.TotalSeconds; - } - - e.SuppressKeyPress = true; - } - } - else if (_shortcuts.MainUnbreakNoSpace == e.KeyData) - { - Unbreak(true); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainGeneralToggleBookmarks == e.KeyData) - { - ToggleBookmarks(false); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainGeneralClearBookmarks == e.KeyData) - { - ClearBookmarks(); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainGeneralGoToBookmark == e.KeyData) - { - e.SuppressKeyPress = true; - GoToBookmark(); - } - else if (_shortcuts.MainGeneralGoToPreviousBookmark == e.KeyData) - { - GoToPrevoiusBookmark(); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainGeneralGoToNextBookmark == e.KeyData) - { - GoToNextBookmark(); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainGeneralChooseProfile == e.KeyData) - { - ChooseProfile(); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainGeneralDuplicateLine == e.KeyData && SubtitleListview1.SelectedItems.Count == 1) - { - DuplicateLine(); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainGeneralFileSaveAll == e.KeyData) - { - SaveAll(); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainToggleFocus == e.KeyData && inListView) - { - if (SubtitleListview1.Focused) - { - textBoxListViewText.Focus(); - } - else - { - SubtitleListview1.Focus(); - } - - e.SuppressKeyPress = true; - } - else if (e.KeyCode == Keys.Home && e.Modifiers == Keys.Alt) - { - SubtitleListview1.FirstVisibleIndex = -1; - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - e.SuppressKeyPress = true; - } - else if (e.KeyCode == Keys.End && e.Modifiers == Keys.Alt) - { - SubtitleListview1.SelectIndexAndEnsureVisible(SubtitleListview1.Items.Count - 1, true); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainGeneralGoToFirstSelectedLine == e.KeyData) //Locate first selected line in subtitle listview - { - if (SubtitleListview1.SelectedItems.Count > 0) - { - SubtitleListview1.SelectedItems[0].EnsureVisible(); - } - - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainGeneralGoToFirstEmptyLine == e.KeyData) //Go to first empty line - if any - { - GoToFirstEmptyLine(); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainGeneralMergeSelectedLines == e.KeyData) - { - if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count >= 1) - { - e.SuppressKeyPress = true; - if (SubtitleListview1.SelectedItems.Count == 2) - { - MergeAfterToolStripMenuItemClick(null, null); - } - else - { - MergeSelectedLines(); - } - } - } - else if (_shortcuts.MainGeneralMergeSelectedLinesAndAutoBreak == e.KeyData) - { - e.SuppressKeyPress = true; - if (SubtitleListview1.SelectedItems.Count == 2) - { - MergeWithLineAfter(false, BreakMode.AutoBreak); - } - else - { - MergeSelectedLines(BreakMode.AutoBreak); - } - } - else if (_shortcuts.MainGeneralMergeSelectedLinesAndUnbreak == e.KeyData) - { - e.SuppressKeyPress = true; - if (SubtitleListview1.SelectedItems.Count == 2) - { - MergeWithLineAfter(false, BreakMode.Unbreak); - } - else - { - MergeSelectedLines(BreakMode.Unbreak); - } - } - else if (_shortcuts.MainGeneralMergeSelectedLinesAndUnbreakNoSpace == e.KeyData) - { - if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count >= 1) - { - e.SuppressKeyPress = true; - if (SubtitleListview1.SelectedItems.Count == 2) - { - MergeWithLineAfter(false, BreakMode.UnbreakNoSpace); - } - else - { - MergeSelectedLines(BreakMode.UnbreakNoSpace); - } - } - } - else if (_shortcuts.MainGeneralMergeSelectedLinesBilingual == e.KeyData) - { - if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count >= 1 && SubtitleListview1.SelectedItems.Count < 10) - { - e.SuppressKeyPress = true; - MergeSelectedLinesBilingual(); - } - } - else if (_shortcuts.MainGeneralMergeSelectedLinesOnlyFirstText == e.KeyData) - { - if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count >= 1) - { - e.SuppressKeyPress = true; - MergeSelectedLinesOnlyFirstText(); - } - } - else if (_shortcuts.MainGeneralMergeWithNext == e.KeyData) - { - if (SubtitleListview1.SelectedItems.Count >= 1) - { - var idx = SubtitleListview1.SelectedItems[0].Index; - if (idx >= 0 && _subtitle.Paragraphs.Count > idx + 1) - { - SubtitleListview1.SelectIndexAndEnsureVisible(idx, true); - MergeAfterToolStripMenuItemClick(null, null); - e.SuppressKeyPress = true; - } - } - } - else if (_shortcuts.MainGeneralMergeWithPrevious == e.KeyData) - { - if (SubtitleListview1.SelectedItems.Count >= 1) - { - var idx = SubtitleListview1.SelectedItems[0].Index; - if (idx > 0) - { - SubtitleListview1.SelectIndexAndEnsureVisible(idx - 1, true); - MergeAfterToolStripMenuItemClick(null, null); - e.SuppressKeyPress = true; - } - } - } - else if (_shortcuts.MainGeneralToggleTranslationMode == e.KeyData) - { // toggle translator mode - EditToolStripMenuItemDropDownOpening(null, null); - toolStripMenuItemTranslationMode_Click(null, null); - } - else if (e.KeyData == _shortcuts.VideoPlayPauseToggle) - { - if (mediaPlayer.VideoPlayer != null) - { - if (_shortcuts.VideoPlayPauseToggle == Keys.Space && - (textBoxListViewText.Focused || textBoxListViewTextAlternate.Focused || textBoxSearchWord.Focused)) - { - return; - } - - _endSeconds = -1; - e.SuppressKeyPress = true; - System.Threading.SynchronizationContext.Current.Post(TimeSpan.FromMilliseconds(1), () => mediaPlayer.TogglePlayPause()); - } - } - else if (e.KeyData == _shortcuts.VideoPause) - { - if (mediaPlayer.VideoPlayer != null) - { - _endSeconds = -1; - mediaPlayer.Pause(); - e.SuppressKeyPress = true; - } - } - else if (_shortcuts.MainVideoPlayFromJustBefore == e.KeyData) - { - buttonBeforeText_Click(null, null); - e.SuppressKeyPress = true; - } - else if (e.Modifiers == (Keys.Control | Keys.Shift) && e.KeyCode == Keys.Right) - { - if (!textBoxListViewText.Focused && !textBoxListViewTextAlternate.Focused) - { - mediaPlayer.CurrentPosition += 1.0; - e.SuppressKeyPress = true; - } - } - else if (e.Modifiers == (Keys.Control | Keys.Shift) && e.KeyCode == Keys.Left) - { - if (!textBoxListViewText.Focused && !textBoxListViewTextAlternate.Focused) - { - mediaPlayer.CurrentPosition -= 1.0; - e.SuppressKeyPress = true; - } - } - else if (e.Modifiers == Keys.None && e.KeyCode == Keys.Space) - { - if (!textBoxListViewText.Focused && !textBoxListViewTextAlternate.Focused && !textBoxSource.Focused && mediaPlayer.VideoPlayer != null) - { - if (audioVisualizer.Focused || mediaPlayer.Focused || SubtitleListview1.Focused) - { - _endSeconds = -1; - mediaPlayer.TogglePlayPause(); - e.SuppressKeyPress = true; - } - } - } - else if (e.Modifiers == Keys.Alt && e.KeyCode == Keys.D1) - { - if (SubtitleListview1.SelectedItems.Count > 0 && _subtitle != null && mediaPlayer.VideoPlayer != null) - { - var p = _subtitle.GetParagraphOrDefault(SubtitleListview1.SelectedItems[0].Index); - if (p != null) - { - mediaPlayer.CurrentPosition = p.StartTime.TotalSeconds; - } - } - e.SuppressKeyPress = true; - } - else if (e.Modifiers == Keys.Alt && e.KeyCode == Keys.D2) - { - if (SubtitleListview1.SelectedItems.Count > 0 && _subtitle != null && mediaPlayer.VideoPlayer != null) - { - var p = _subtitle.GetParagraphOrDefault(SubtitleListview1.SelectedItems[0].Index); - if (p != null) - { - mediaPlayer.CurrentPosition = p.EndTime.TotalSeconds; - } - } - e.SuppressKeyPress = true; - } - else if (e.Modifiers == Keys.Alt && e.KeyCode == Keys.D3) - { - if (SubtitleListview1.SelectedItems.Count > 0 && _subtitle != null && mediaPlayer.VideoPlayer != null) - { - int index = SubtitleListview1.SelectedItems[0].Index - 1; - var p = _subtitle.GetParagraphOrDefault(index); - if (p != null) - { - SubtitleListview1.SelectIndexAndEnsureVisible(index, true); - mediaPlayer.CurrentPosition = p.StartTime.TotalSeconds; - } - } - e.SuppressKeyPress = true; - } - else if (e.Modifiers == Keys.Alt && e.KeyCode == Keys.D4) - { - if (SubtitleListview1.SelectedItems.Count > 0 && _subtitle != null && mediaPlayer.VideoPlayer != null) - { - int index = SubtitleListview1.SelectedItems[0].Index + 1; - var p = _subtitle.GetParagraphOrDefault(index); - if (p != null) - { - SubtitleListview1.SelectIndexAndEnsureVisible(index, true); - mediaPlayer.CurrentPosition = p.StartTime.TotalSeconds; - } - } - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainVideoToggleStartEndCurrent == e.KeyData) - { - if (SubtitleListview1.SelectedItems.Count > 0 && _subtitle != null && mediaPlayer.VideoPlayer != null) - { - mediaPlayer.Pause(); - var p = _subtitle.GetParagraphOrDefault(SubtitleListview1.SelectedItems[0].Index); - if (p != null) - { - if (Math.Abs(mediaPlayer.CurrentPosition - p.StartTime.TotalSeconds) < 0.1) - { - mediaPlayer.CurrentPosition = p.EndTime.TotalSeconds; - } - else - { - mediaPlayer.CurrentPosition = p.StartTime.TotalSeconds; - } - } - } - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainVideoPlayCurrent == e.KeyData) - { - if (SubtitleListview1.SelectedItems.Count > 0 && _subtitle != null && mediaPlayer.VideoPlayer != null) - { - var p = _subtitle.GetParagraphOrDefault(SubtitleListview1.SelectedItems[0].Index); - if (p != null) - { - mediaPlayer.CurrentPosition = p.StartTime.TotalSeconds; - ShowSubtitle(); - mediaPlayer.Play(); - _endSeconds = p.EndTime.TotalSeconds; - } - } - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainVideoGoToStartCurrent == e.KeyData) - { - if (mediaPlayer.VideoPlayer != null) - { - GotoSubPositionAndPause(); - } - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainVideo3000MsLeft == e.KeyData) - { - if (mediaPlayer.VideoPlayer != null) - { - GoBackSeconds(3); - } - e.SuppressKeyPress = true; - } - else if (e.Modifiers == (Keys.Control | Keys.Alt | Keys.Shift) && e.KeyCode == Keys.W) // watermark - { - var enc = GetCurrentEncoding(); - if (enc != Encoding.UTF8 && enc != Encoding.UTF32 && enc != Encoding.Unicode && enc != Encoding.UTF7) - { - MessageBox.Show(Configuration.Settings.Language.Watermark.ErrorUnicodeEncodingOnly); - } - else - { - using (var watermarkForm = new Watermark()) - { - MakeHistoryForUndo(Configuration.Settings.Language.Watermark.BeforeWatermark); - watermarkForm.Initialize(_subtitle, FirstSelectedIndex); - if (watermarkForm.ShowDialog(this) == DialogResult.OK) - { - watermarkForm.AddOrRemove(_subtitle); - RefreshSelectedParagraph(); - } - } - } - - e.SuppressKeyPress = true; - } - else if (e.Modifiers == (Keys.Control | Keys.Alt | Keys.Shift) && e.KeyCode == Keys.F) // Toggle HHMMSSFF / HHMMSSMMM - { - Configuration.Settings.General.UseTimeFormatHHMMSSFF = !Configuration.Settings.General.UseTimeFormatHHMMSSFF; - RefreshTimeCodeMode(); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainGeneralSwitchTranslationAndOriginal == e.KeyData) // switch original/current - { - if (_subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0 && _networkSession == null) - { - int firstIndex = FirstSelectedIndex; - double firstMs = -1; - if (firstIndex >= 0) - { - firstMs = _subtitle.Paragraphs[firstIndex].StartTime.TotalMilliseconds; - } - - var temp = _subtitle; - _subtitle = _subtitleAlternate; - _subtitleAlternate = temp; - - var tempName = _fileName; - _fileName = _subtitleAlternateFileName; - _subtitleAlternateFileName = tempName; - - var tempChangeSubText = _changeSubtitleHash; - _changeSubtitleHash = _changeAlternateSubtitleHash; - _changeAlternateSubtitleHash = tempChangeSubText; - - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - - _subtitleListViewIndex = -1; - if (firstIndex >= 0 && _subtitle.Paragraphs.Count > firstIndex && Math.Abs(_subtitle.Paragraphs[firstIndex].StartTime.TotalMilliseconds - firstMs) < 0.01) - { - SubtitleListview1.SelectIndexAndEnsureVisible(firstIndex, true); - } - else - { - RefreshSelectedParagraph(); - } - - SetTitle(); - - _fileDateTime = new DateTime(); - } - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainGeneralMergeTranslationAndOriginal == e.KeyData) // Merge translation and original - { - if (_subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0 && _networkSession == null) - { - if (ContinueNewOrExit()) - { - var subtitle = new Subtitle(); - var fr = CurrentFrameRate; - var format = GetCurrentSubtitleFormat(); - var videoFileName = VideoFileName; - foreach (var p in _subtitle.Paragraphs) - { - var newP = new Paragraph(p); - var original = Utilities.GetOriginalParagraph(_subtitle.GetIndex(p), p, _subtitleAlternate.Paragraphs); - if (original != null) - { - newP.Text = (newP.Text.TrimEnd() + Environment.NewLine + original.Text.TrimStart()).Trim(); - } - - subtitle.Paragraphs.Add(newP); - } - - RemoveAlternate(true, true); - FileNew(); - SetCurrentFormat(format); - toolStripComboBoxFrameRate.Text = fr.ToString(); - _subtitle = subtitle; - _subtitleListViewIndex = -1; - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - if (!string.IsNullOrEmpty(videoFileName)) - { - OpenVideo(videoFileName); - } - e.SuppressKeyPress = true; - } - } - } - else if (e.KeyData == _shortcuts.ToggleVideoDockUndock) - { - if (_isVideoControlsUndocked) - { - RedockVideoControlsToolStripMenuItemClick(null, null); - } - else - { - UndockVideoControlsToolStripMenuItemClick(null, null); - } - e.SuppressKeyPress = true; - } - else if (mediaPlayer.VideoPlayer != null && e.KeyData == _shortcuts.MainVideoFoucsSetVideoPosition) - { - timeUpDownVideoPositionAdjust.Focus(); - e.SuppressKeyPress = true; - } - else if (mediaPlayer.VideoPlayer != null && e.KeyData == _shortcuts.Video1FrameLeft) - { - if (mediaPlayer.VideoPlayer is LibMpvDynamic libMpv) - { - libMpv.GetPreviousFrame(); - } - else - { - MoveVideoSeconds(-1.0 / Configuration.Settings.General.CurrentFrameRate); - } - - e.SuppressKeyPress = true; - } - else if (mediaPlayer.VideoPlayer != null && e.KeyData == _shortcuts.Video1FrameRight) - { - if (mediaPlayer.VideoPlayer is LibMpvDynamic libMpv) - { - libMpv.GetNextFrame(); - } - else - { - MoveVideoSeconds(1.0 / Configuration.Settings.General.CurrentFrameRate); - } - - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.Video1FrameLeftWithPlay) - { - if (mediaPlayer.VideoPlayer != null) - { - double startSeconds = mediaPlayer.CurrentPosition - (1.0 / Configuration.Settings.General.CurrentFrameRate); - _endSeconds = startSeconds + (1.0 / Configuration.Settings.General.CurrentFrameRate); - _endSecondsNewPosition = startSeconds; - mediaPlayer.CurrentPosition = startSeconds; - UiUtil.ShowSubtitle(_subtitle, mediaPlayer); - mediaPlayer.Play(); - _endSecondsNewPositionTicks = DateTime.UtcNow.Ticks; - } - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.Video1FrameRightWithPlay) - { - if (mediaPlayer.VideoPlayer != null) - { - double startSeconds = mediaPlayer.CurrentPosition + (1.0 / Configuration.Settings.General.CurrentFrameRate); - _endSeconds = startSeconds + (1.0 / Configuration.Settings.General.CurrentFrameRate); - _endSecondsNewPosition = startSeconds; - mediaPlayer.CurrentPosition = startSeconds; - UiUtil.ShowSubtitle(_subtitle, mediaPlayer); - mediaPlayer.Play(); - _endSecondsNewPositionTicks = DateTime.UtcNow.Ticks; - } - e.SuppressKeyPress = true; - } - else if (mediaPlayer.VideoPlayer != null && e.KeyData == _shortcuts.Video100MsLeft) - { - MoveVideoSeconds(-0.1); - e.SuppressKeyPress = true; - } - else if (mediaPlayer.VideoPlayer != null && e.KeyData == _shortcuts.Video100MsRight) - { - MoveVideoSeconds(0.1); - e.SuppressKeyPress = true; - } - else if (mediaPlayer.VideoPlayer != null && e.KeyData == _shortcuts.Video500MsLeft) - { - MoveVideoSeconds(-0.5); - e.SuppressKeyPress = true; - } - else if (mediaPlayer.VideoPlayer != null && e.KeyData == _shortcuts.Video500MsRight) - { - MoveVideoSeconds(0.5); - e.SuppressKeyPress = true; - } - else if (mediaPlayer.VideoPlayer != null && e.KeyData == _shortcuts.Video1000MsLeft) - { - MoveVideoSeconds(-1.0); - e.SuppressKeyPress = true; - } - else if (mediaPlayer.VideoPlayer != null && e.KeyData == _shortcuts.Video1000MsRight) - { - MoveVideoSeconds(1.0); - e.SuppressKeyPress = true; - } - else if (mediaPlayer.VideoPlayer != null && e.KeyData == _shortcuts.Video5000MsLeft) - { - MoveVideoSeconds(-5.0); - e.SuppressKeyPress = true; - } - else if (mediaPlayer.VideoPlayer != null && e.KeyData == _shortcuts.Video5000MsRight) - { - MoveVideoSeconds(5.0); - e.SuppressKeyPress = true; - } - else if (mediaPlayer.VideoPlayer != null && e.KeyData == _shortcuts.VideoXSMsLeft) - { - ButtonAdjustSecBackClick(null, null); - e.SuppressKeyPress = true; - } - else if (mediaPlayer.VideoPlayer != null && e.KeyData == _shortcuts.VideoXSMsRight) - { - ButtonAdjustSecForwardClick(null, null); - e.SuppressKeyPress = true; - } - else if (mediaPlayer.VideoPlayer != null && e.KeyData == _shortcuts.VideoXLMsLeft) - { - buttonAdjustSecBack2_Click(null, null); - e.SuppressKeyPress = true; - } - else if (mediaPlayer.VideoPlayer != null && e.KeyData == _shortcuts.VideoXLMsRight) - { - buttonAdjustSecForward2_Click(null, null); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainToolsBeamer == e.KeyData) - { - using (var beamer = new Beamer(this, _subtitle, _subtitleListViewIndex)) - { - beamer.ShowDialog(this); - } - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainVideoFullscreen) // fullscreen - { - GoFullscreen(false); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainVideoSlower) - { - e.SuppressKeyPress = true; - for (var index = 0; index < toolStripSplitButtonPlayRate.DropDownItems.Count; index++) - { - var item = (ToolStripMenuItem)toolStripSplitButtonPlayRate.DropDownItems[index]; - if (item.Checked && index > 0) - { - SetPlayRate(toolStripSplitButtonPlayRate.DropDownItems[index - 1], null); - return; - } - } - } - else if (e.KeyData == _shortcuts.MainVideoFaster) - { - e.SuppressKeyPress = true; - for (var index = 0; index < toolStripSplitButtonPlayRate.DropDownItems.Count; index++) - { - var item = (ToolStripMenuItem)toolStripSplitButtonPlayRate.DropDownItems[index]; - if (item.Checked && index + 1 < toolStripSplitButtonPlayRate.DropDownItems.Count) - { - SetPlayRate(toolStripSplitButtonPlayRate.DropDownItems[index + 1], null); - return; - } - } - } - else if (e.KeyData == _shortcuts.MainVideoReset) - { - e.SuppressKeyPress = true; - if (audioVisualizer != null) - { - audioVisualizer.ZoomFactor = 1.0; - audioVisualizer.VerticalZoomFactor = 1.0; - InitializeWaveformZoomDropdown(); - } - - if (mediaPlayer != null && mediaPlayer.VideoPlayer != null) - { - mediaPlayer.VideoPlayer.PlayRate = 1.0; - InitializePlayRateDropDown(); - toolStripSplitButtonPlayRate.Image = imageListPlayRate.Images[0]; - } - } - else if (audioVisualizer.Focused && audioVisualizer.NewSelectionParagraph != null && e.KeyData == _shortcuts.WaveformAddTextAtHere) - { - addParagraphHereToolStripMenuItem_Click(null, null); - e.SuppressKeyPress = true; - } - else if (audioVisualizer.Focused && audioVisualizer.NewSelectionParagraph != null && e.KeyData == _shortcuts.WaveformAddTextAtHereFromClipboard) - { - addParagraphAndPasteToolStripMenuItem_Click(null, null); - e.SuppressKeyPress = true; - } - else if (audioVisualizer.Focused && audioVisualizer.NewSelectionParagraph != null && e.KeyData == _shortcuts.WaveformSetParagraphAsNewSelection) - { - toolStripMenuItemSetParagraphAsSelection_Click(null, null); - e.SuppressKeyPress = true; - } - else if (audioVisualizer.Focused && e.KeyData == _shortcuts.WaveformFocusListView) - { - SubtitleListview1.Focus(); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.VideoGoToPrevSubtitle) - { - GoToPreviousSubtitle(mediaPlayer.CurrentPosition * TimeCode.BaseUnit); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.VideoGoToNextSubtitle) - { - GoToNextSubtitle(mediaPlayer.CurrentPosition * TimeCode.BaseUnit); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.VideoSelectNextSubtitle) - { - var cp = mediaPlayer.CurrentPosition * TimeCode.BaseUnit; - foreach (var p in _subtitle.Paragraphs) - { - if (p.StartTime.TotalMilliseconds > cp) - { - SubtitleListview1.SelectNone(); - SubtitleListview1.Items[_subtitle.Paragraphs.IndexOf(p)].Selected = true; - SubtitleListview1.Items[_subtitle.Paragraphs.IndexOf(p)].Focused = true; - break; - } - } - - e.SuppressKeyPress = true; - } - else if (mediaPlayer.Chapters?.Count > 0 && e.KeyData == _shortcuts.VideoGoToPrevChapter) - { - var cp = mediaPlayer.CurrentPosition - 0.01; - foreach (var chapter in mediaPlayer.Chapters.Reverse()) - { - if (chapter.StartTime < cp) - { - mediaPlayer.CurrentPosition = chapter.StartTime; - break; - } - } - - e.SuppressKeyPress = true; - } - else if (mediaPlayer.Chapters?.Count > 0 && e.KeyData == _shortcuts.VideoGoToNextChapter) - { - var cp = mediaPlayer.CurrentPosition + 0.01; - foreach (var chapter in mediaPlayer.Chapters) - { - if (chapter.StartTime > cp) - { - mediaPlayer.CurrentPosition = chapter.StartTime; - break; - } - } - - e.SuppressKeyPress = true; - } - else if (audioVisualizer.SceneChanges != null && e.KeyData == _shortcuts.WaveformGoToPreviousSceneChange) - { - var cp = mediaPlayer.CurrentPosition - 0.01; - foreach (var sceneChange in audioVisualizer.SceneChanges.Reverse()) - { - if (sceneChange < cp) - { - mediaPlayer.CurrentPosition = sceneChange; - break; - } - } - - e.SuppressKeyPress = true; - } - else if (audioVisualizer.SceneChanges != null && e.KeyData == _shortcuts.WaveformGoToNextSceneChange) - { - var cp = mediaPlayer.CurrentPosition + 0.01; - foreach (var sceneChange in audioVisualizer.SceneChanges) - { - if (sceneChange > cp) - { - mediaPlayer.CurrentPosition = sceneChange; - break; - } - } - - e.SuppressKeyPress = true; - } - else if (audioVisualizer.SceneChanges != null && mediaPlayer.IsPaused && e.KeyData == _shortcuts.WaveformToggleSceneChange) - { - var cp = mediaPlayer.CurrentPosition; - var idx = audioVisualizer.GetSceneChangeIndex(cp); - if (idx >= 0) - { - RemoveSceneChange(idx); - if (audioVisualizer.SceneChanges.Count == 0) - { - SceneChangeHelper.DeleteSceneChanges(VideoFileName); - } - } - else - { // add scene change - var list = audioVisualizer.SceneChanges.Where(p => p > 0).ToList(); - list.Add(cp); - list.Sort(); - audioVisualizer.SceneChanges = list; - SceneChangeHelper.SaveSceneChanges(VideoFileName, list); - } - - e.SuppressKeyPress = true; - } - else if (audioVisualizer.SceneChanges != null && mediaPlayer.IsPaused && e.KeyData == _shortcuts.WaveformGuessStart) - { - AutoGuessStartTime(_subtitleListViewIndex); - e.SuppressKeyPress = true; - } - else if (audioVisualizer.Focused && e.KeyCode == Keys.Delete) - { - ToolStripMenuItemDeleteClick(null, null); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainToolsAutoDuration == e.KeyData) - { - MakeAutoDuration(); - e.SuppressKeyPress = true; - } - else if (e.Modifiers == (Keys.Control | Keys.Alt | Keys.Shift) && e.KeyCode == Keys.I) - { - using (var form = new ImportUnknownFormat(string.Empty)) - { - if (form.ShowDialog(this) == DialogResult.OK) - { - if (form.ImportedSubitle?.Paragraphs.Count > 0) - { - _subtitle = form.ImportedSubitle; - _fileName = null; - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - SetTitle(); - } - } - } - - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainTextBoxMoveLastWordDown) - { - if (textBoxListViewTextAlternate.Focused) - { - MoveLastWordDown(textBoxListViewTextAlternate); - } - else - { - MoveLastWordDown(textBoxListViewText); - } - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainTextBoxMoveFirstWordFromNextUp) - { - if (textBoxListViewTextAlternate.Focused) - { - MoveFirstWordInNextUp(textBoxListViewTextAlternate); - } - else - { - MoveFirstWordInNextUp(textBoxListViewText); - } - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainTextBoxMoveLastWordDownCurrent) - { - if (textBoxListViewTextAlternate.Focused) - { - MoveWordUpDownInCurrent(true, textBoxListViewTextAlternate); - } - else - { - MoveWordUpDownInCurrent(true, textBoxListViewText); - } - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainTextBoxMoveFirstWordUpCurrent) - { - if (textBoxListViewTextAlternate.Focused) - { - MoveWordUpDownInCurrent(false, textBoxListViewTextAlternate); - } - else - { - MoveWordUpDownInCurrent(false, textBoxListViewText); - } - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainAutoCalcCurrentDuration == e.KeyData) - { - e.SuppressKeyPress = true; - if (SubtitleListview1.SelectedItems.Count >= 1) - { - MakeHistoryForUndo(_language.BeforeDisplayTimeAdjustment); - _makeHistoryPaused = true; - var idx = SubtitleListview1.SelectedItems[0].Index; - _subtitle.RecalculateDisplayTime(Configuration.Settings.General.SubtitleMaximumCharactersPerSeconds, idx, Configuration.Settings.General.SubtitleOptimalCharactersPerSeconds); - SetDurationInSeconds(_subtitle.Paragraphs[idx].Duration.TotalSeconds); - _makeHistoryPaused = false; - } - } - else if (e.KeyCode == Keys.F3 && e.Modifiers == Keys.Shift) - { - FindPrevious(); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainAdjustExtendCurrentSubtitle == e.KeyData) - { - ExtendCurrentSubtitle(); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainAdjustExtendToNextSubtitle == e.KeyData) - { - ExtendSelectedLinesToNextLine(); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainAdjustExtendToPreviousSubtitle == e.KeyData) - { - ExtendSelectedLinesToPreviousLine(); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainAdjustExtendPreviousLineEndToCurrentStart == e.KeyData) - { - ExtendPreviousEndToCurrentStart(); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainAdjustExtendNextLineStartToCurrentEnd == e.KeyData) - { - ExtendNextStartToCurrentEnd(); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainAdjustSnapStartToNextSceneChange == e.KeyData) - { - SnapSelectedLinesStartToNextSceneChange(); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainAdjustSnapStartToNextSceneChangeWithGap == e.KeyData) - { - SnapSelectedLinesStartToNextSceneChange(true); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainAdjustSnapEndToPreviousSceneChange == e.KeyData) - { - SnapSelectedLinesEndToPreviousSceneChange(); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainAdjustSnapEndToPreviousSceneChangeWithGap == e.KeyData) - { - SnapSelectedLinesEndToPreviousSceneChange(true); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainAdjustExtendToNextSceneChange == e.KeyData) - { - ExtendSelectedLinesToNextSceneChange(); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainAdjustExtendToNextSceneChangeWithGap == e.KeyData) - { - ExtendSelectedLinesToNextSceneChange(true); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainAdjustExtendToPreviousSceneChange == e.KeyData) - { - ExtendSelectedLinesToPreviousSceneChange(); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainAdjustExtendToPreviousSceneChangeWithGap == e.KeyData) - { - ExtendSelectedLinesToPreviousSceneChange(true); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainListViewGoToNextError) - { - GoToNextSyntaxError(); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainWaveformAdd) - { - if (audioVisualizer.WavePeaks == null) - { - AudioWaveform_Click(null, null); - } - e.SuppressKeyPress = true; - } - - - //TABS: Create / adjust / translate - - // create - else if (_shortcuts.MainCreateInsertSubAtVideoPos == e.KeyData) - { - ButtonInsertNewTextClick(null, null); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainCreateInsertSubAtVideoPosNoTextBoxFocus == e.KeyData) - { - var p = InsertNewTextAtVideoPosition(); - p.Text = string.Empty; - SubtitleListview1.SetText(_subtitle.GetIndex(p), p.Text); - textBoxListViewText.Text = p.Text; - e.SuppressKeyPress = true; - } - else if (tabControlButtons.SelectedTab == tabPageCreate && e.Modifiers == Keys.Alt && e.KeyCode == Keys.F9) - { - StopAutoDuration(); - ButtonSetEndClick(null, null); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainCreateSetStart == e.KeyData) - { - buttonSetStartTime_Click(null, null); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainCreateSetEnd == e.KeyData) - { - StopAutoDuration(); - ButtonSetEndClick(null, null); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainAdjustSetEndAndPause == e.KeyData) - { - StopAutoDuration(); - mediaPlayer.Pause(); - ButtonSetEndClick(null, null); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainCreateSetEndAddNewAndGoToNew == e.KeyData) - { - StopAutoDuration(); - e.SuppressKeyPress = true; - - if (SubtitleListview1.SelectedItems.Count == 1) - { - double videoPosition = mediaPlayer.CurrentPosition; - if (!mediaPlayer.IsPaused) - { - videoPosition -= Configuration.Settings.General.SetStartEndHumanDelay / TimeCode.BaseUnit; - } - - int index = SubtitleListview1.SelectedItems[0].Index; - MakeHistoryForUndoOnlyIfNotResent(string.Format(_language.VideoControls.BeforeChangingTimeInWaveformX, "#" + _subtitle.Paragraphs[index].Number + " " + _subtitle.Paragraphs[index].Text)); - - var p = _subtitle.Paragraphs[index]; - p.EndTime = TimeCode.FromSeconds(videoPosition); - if (p.Duration.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines > Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds) - { - var newEndTime = new TimeCode(p.EndTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines); - double charactersPerSecond = Utilities.GetCharactersPerSecond(new Paragraph(p) { EndTime = newEndTime }); - if (charactersPerSecond <= Configuration.Settings.General.SubtitleMaximumCharactersPerSeconds) - { - p.EndTime = newEndTime; - } - } - - SubtitleListview1.SetStartTimeAndDuration(index, _subtitle.Paragraphs[index], _subtitle.GetParagraphOrDefault(index + 1), _subtitle.GetParagraphOrDefault(index - 1)); - SetDurationInSeconds(_subtitle.Paragraphs[index].Duration.TotalSeconds); - ButtonInsertNewTextClick(null, null); - } - } - else if (_shortcuts.MainCreateStartDownEndUp == e.KeyData) - { - if (_mainCreateStartDownEndUpParagraph == null) - { - _mainCreateStartDownEndUpParagraph = InsertNewTextAtVideoPosition(); - } - - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainAdjustSelected100MsForward == e.KeyData) - { - ShowEarlierOrLater(100, SelectionChoice.SelectionOnly); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainAdjustSelected100MsBack == e.KeyData) - { - ShowEarlierOrLater(-100, SelectionChoice.SelectionOnly); - e.SuppressKeyPress = true; - } - - - // adjust - else if (_shortcuts.MainAdjustSelected100MsForward == e.KeyData) - { - ShowEarlierOrLater(100, SelectionChoice.SelectionOnly); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainAdjustSelected100MsBack == e.KeyData) - { - ShowEarlierOrLater(-100, SelectionChoice.SelectionOnly); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainAdjustAdjustStartXMsBack == e.KeyData) - { - MoveStartCurrent(-Configuration.Settings.Tools.MoveStartEndMs, false); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainAdjustAdjustStartXMsForward == e.KeyData) - { - MoveStartCurrent(Configuration.Settings.Tools.MoveStartEndMs, false); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainAdjustAdjustEndXMsBack == e.KeyData) - { - MoveEndCurrent(-Configuration.Settings.Tools.MoveStartEndMs, false); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainAdjustAdjustEndXMsForward == e.KeyData) - { - MoveEndCurrent(Configuration.Settings.Tools.MoveStartEndMs, false); - e.SuppressKeyPress = true; - } - - else if (_shortcuts.MainAdjustMoveStartOneFrameBack == e.KeyData) - { - MoveStartCurrent(-(int)Math.Round(1000.0 / CurrentFrameRate), false); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainAdjustMoveStartOneFrameForward == e.KeyData) - { - MoveStartCurrent((int)Math.Round(1000.0 / CurrentFrameRate), false); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainAdjustMoveEndOneFrameBack == e.KeyData) - { - MoveEndCurrent(-(int)Math.Round(1000.0 / CurrentFrameRate), false); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainAdjustMoveEndOneFrameForward == e.KeyData) - { - MoveEndCurrent((int)Math.Round(1000.0 / CurrentFrameRate), false); - e.SuppressKeyPress = true; - } - - else if (_shortcuts.MainAdjustMoveStartOneFrameBackKeepGapPrev == e.KeyData) - { - MoveStartCurrent(-(int)Math.Round(1000.0 / CurrentFrameRate), true); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainAdjustMoveStartOneFrameForwardKeepGapPrev == e.KeyData) - { - MoveStartCurrent((int)Math.Round(1000.0 / CurrentFrameRate), true); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainAdjustMoveEndOneFrameBackKeepGapNext == e.KeyData) - { - MoveEndCurrent(-(int)Math.Round(1000.0 / CurrentFrameRate), true); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainAdjustMoveEndOneFrameForwardKeepGapNext == e.KeyData) - { - MoveEndCurrent((int)Math.Round(1000.0 / CurrentFrameRate), true); - e.SuppressKeyPress = true; - } - - else if (mediaPlayer.VideoPlayer != null && (_shortcuts.MainAdjustSetStartAndOffsetTheRest == e.KeyData || _shortcuts.MainAdjustSetStartAndOffsetTheRest2 == e.KeyData)) - { - ButtonSetStartAndOffsetRestClick(null, null); - e.SuppressKeyPress = true; - } - else if (mediaPlayer.VideoPlayer != null && _shortcuts.MainAdjustSetEndAndOffsetTheRest == e.KeyData) - { - SetEndAndOffsetTheRest(false); - e.SuppressKeyPress = true; - } - else if (mediaPlayer.VideoPlayer != null && _shortcuts.MainAdjustSetEndAndOffsetTheRestAndGoToNext == e.KeyData) - { - SetEndAndOffsetTheRest(true); - e.SuppressKeyPress = true; - } - else if (mediaPlayer.VideoPlayer != null && _shortcuts.MainAdjustSetEndAndGotoNext == e.KeyData) - { - ShowNextSubtitleLabel(); - ButtonSetEndAndGoToNextClick(null, null); - e.SuppressKeyPress = true; - } - else if (mediaPlayer.VideoPlayer != null && _shortcuts.MainAdjustSetStartKeepDuration == e.KeyData) - { - SetStartTime(true, mediaPlayer.CurrentPosition); - e.SuppressKeyPress = true; - } - else if (mediaPlayer.VideoPlayer != null && _shortcuts.MainAdjustInsertViaEndAutoStart == e.KeyData) - { - SetCurrentViaEndPositionAndGotoNext(FirstSelectedIndex, false); - e.SuppressKeyPress = true; - } - else if (mediaPlayer.VideoPlayer != null && _shortcuts.MainAdjustInsertViaEndAutoStartAndGoToNext == e.KeyData) - { - ShowNextSubtitleLabel(); - SetCurrentViaEndPositionAndGotoNext(FirstSelectedIndex, true); - e.SuppressKeyPress = true; - } - else if (mediaPlayer.VideoPlayer != null && _shortcuts.MainAdjustSetStartAutoDurationAndGoToNext == e.KeyData) - { - SetCurrentStartAutoDurationAndGotoNext(FirstSelectedIndex); - e.SuppressKeyPress = true; - } - else if (mediaPlayer.VideoPlayer != null && _shortcuts.MainAdjustSetEndNextStartAndGoToNext == e.KeyData) - { - ShowNextSubtitleLabel(); - SetCurrentEndNextStartAndGoToNext(FirstSelectedIndex); - e.SuppressKeyPress = true; - } - else if (mediaPlayer.VideoPlayer != null && _shortcuts.MainAdjustStartDownEndUpAndGoToNext == e.KeyData && _mainAdjustStartDownEndUpAndGoToNextParagraph == null) - { - ShowNextSubtitleLabel(); - _mainAdjustStartDownEndUpAndGoToNextParagraph = _subtitle.GetParagraphOrDefault(FirstSelectedIndex); - SetStartTime(true, mediaPlayer.CurrentPosition); - e.SuppressKeyPress = true; - } - else if (mediaPlayer.VideoPlayer != null && _shortcuts.MainAdjustSetStartAndEndOfPrevious == e.KeyData) - { - var pos = mediaPlayer.CurrentPosition; - SetStartAndEndOfPrevious(pos, false); - e.SuppressKeyPress = true; - } - else if (mediaPlayer.VideoPlayer != null && _shortcuts.MainAdjustSetStartAndEndOfPreviousAndGoToNext == e.KeyData) - { - var pos = mediaPlayer.CurrentPosition; - SetStartAndEndOfPrevious(pos, true); - e.SuppressKeyPress = true; - } - - // translate - else if (_shortcuts.MainTranslateGoogleIt == e.KeyData) - { - e.SuppressKeyPress = true; - buttonGoogleIt_Click(null, null); - } - else if (_shortcuts.MainTranslateCustomSearch1 == e.KeyData) - { - e.SuppressKeyPress = true; - RunCustomSearch(Configuration.Settings.VideoControls.CustomSearchUrl1); - } - else if (_shortcuts.MainTranslateCustomSearch2 == e.KeyData) - { - e.SuppressKeyPress = true; - RunCustomSearch(Configuration.Settings.VideoControls.CustomSearchUrl2); - } - else if (_shortcuts.MainTranslateCustomSearch3 == e.KeyData) - { - e.SuppressKeyPress = true; - RunCustomSearch(Configuration.Settings.VideoControls.CustomSearchUrl3); - } - else if (_shortcuts.MainTranslateCustomSearch4 == e.KeyData) - { - e.SuppressKeyPress = true; - RunCustomSearch(Configuration.Settings.VideoControls.CustomSearchUrl4); - } - else if (_shortcuts.MainTranslateCustomSearch5 == e.KeyData) - { - e.SuppressKeyPress = true; - RunCustomSearch(Configuration.Settings.VideoControls.CustomSearchUrl5); - } - // put new entries above tabs - } - - private void SetStartAndEndOfPrevious(double positionInSeconds, bool goToNext) - { - int index = SubtitleListview1.SelectedItems[0].Index; - var current = _subtitle.GetParagraphOrDefault(index); - if (SubtitleListview1.SelectedItems.Count != 1 || current == null) - { - return; - } - - if (positionInSeconds > current.EndTime.TotalSeconds - Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds / 1000) - { - return; - } - - // previous sub - var p = _subtitle.GetParagraphOrDefault(index - 1); - if (p == null || p.StartTime.TotalMilliseconds < p.StartTime.TotalMilliseconds - 9000) - { - SetStartTime(false, mediaPlayer.CurrentPosition); - return; - } - - if (positionInSeconds < p.StartTime.TotalSeconds + Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds / 1000) - { - return; - } - - SetStartTime(false, mediaPlayer.CurrentPosition); - - var oldParagraph = new Paragraph(p, false); - MakeHistoryForUndoOnlyIfNotResent(string.Format(_language.VideoControls.BeforeChangingTimeInWaveformX, "#" + p.Number + " " + p.Text)); - p.EndTime.TotalMilliseconds = positionInSeconds * TimeCode.BaseUnit - Configuration.Settings.General.MinimumMillisecondsBetweenLines; - if (oldParagraph.StartTime.IsMaxTime) - { - p.StartTime.TotalMilliseconds = p.EndTime.TotalMilliseconds - Utilities.GetOptimalDisplayMilliseconds(p.Text); - } - - SubtitleListview1.SetStartTimeAndDuration(index, current, _subtitle.GetParagraphOrDefault(index + 1), _subtitle.GetParagraphOrDefault(index - 1)); - SubtitleListview1.SetStartTimeAndDuration(index - 1, p, current, _subtitle.GetParagraphOrDefault(index - 2)); - UpdateOriginalTimeCodes(oldParagraph); - ShowSource(); - - var next = _subtitle.GetParagraphOrDefault(index - 1); - if (goToNext && next != null) - { - SubtitleListview1.SelectIndexAndEnsureVisible(index + 1, true); - } - } - - private void ExtendCurrentSubtitle() - { - if (SubtitleListview1.SelectedItems.Count == 1) - { - var historyAdded = false; - var idx = SubtitleListview1.SelectedItems[0].Index; - var p = _subtitle.Paragraphs[idx]; - var next = _subtitle.GetParagraphOrDefault(idx + 1); - if (next == null || next.StartTime.TotalMilliseconds > p.StartTime.TotalMilliseconds + Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines) - { - MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustExtendCurrentSubtitle)); - historyAdded = true; - p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds; - } - else - { - MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustExtendCurrentSubtitle)); - historyAdded = true; - p.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; - } - - if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) - { - var original = Utilities.GetOriginalParagraph(idx, p, _subtitleAlternate.Paragraphs); - if (original != null) - { - var originalNext = _subtitleAlternate.GetParagraphOrDefault(_subtitleAlternate.GetIndex(original) + 1); - if (originalNext == null || originalNext.StartTime.TotalMilliseconds > original.StartTime.TotalMilliseconds + Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines) - { - if (!historyAdded) - { - MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustExtendCurrentSubtitle)); - } - - original.EndTime.TotalMilliseconds = original.StartTime.TotalMilliseconds + Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds; - } - else - { - if (!historyAdded) - { - MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustExtendCurrentSubtitle)); - } - - original.EndTime.TotalMilliseconds = originalNext.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; - } - } - } - - RefreshSelectedParagraph(); - } - } - - private void ExtendSelectedLinesToNextLine() - { - var historyAdded = false; - foreach (ListViewItem selectedItem in SubtitleListview1.SelectedItems) - { - var idx = selectedItem.Index; - var p = _subtitle.Paragraphs[idx]; - var next = _subtitle.GetParagraphOrDefault(idx + 1); - if (next != null) - { - if (!historyAdded) - { - MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustExtendToNextSubtitle)); - historyAdded = true; - } - p.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; - } - - if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) - { - var original = Utilities.GetOriginalParagraph(idx, p, _subtitleAlternate.Paragraphs); - if (original != null) - { - var originalNext = _subtitleAlternate.GetParagraphOrDefault(_subtitleAlternate.GetIndex(original) + 1); - if (originalNext != null) - { - if (!historyAdded) - { - MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustExtendToNextSubtitle)); - historyAdded = true; - } - - original.EndTime.TotalMilliseconds = originalNext.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; - } - } - } - - RefreshSelectedParagraphs(); - } - } - - private void ExtendSelectedLinesToPreviousLine() - { - var historyAdded = false; - foreach (ListViewItem selectedItem in SubtitleListview1.SelectedItems) - { - var idx = selectedItem.Index; - var p = _subtitle.Paragraphs[idx]; - var previous = _subtitle.GetParagraphOrDefault(idx - 1); - if (previous != null) - { - if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) - { - var original = Utilities.GetOriginalParagraph(idx, p, _subtitleAlternate.Paragraphs); - if (original != null) - { - var originalPrevious = _subtitleAlternate.GetParagraphOrDefault(_subtitleAlternate.GetIndex(original) - 1); - if (originalPrevious != null) - { - if (!historyAdded) - { - MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustExtendToPreviousSubtitle)); - historyAdded = true; - } - - original.StartTime.TotalMilliseconds = originalPrevious.EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines; - } - } - } - - if (!historyAdded) - { - MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustExtendToPreviousSubtitle)); - historyAdded = true; - } - - p.StartTime.TotalMilliseconds = previous.EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines; - } - - RefreshSelectedParagraphs(); - } - } - - private void ExtendPreviousEndToCurrentStart() - { - if (SubtitleListview1.SelectedItems.Count == 1) - { - var historyAdded = false; - var idx = SubtitleListview1.SelectedItems[0].Index; - var p = _subtitle.Paragraphs[idx]; - var previous = _subtitle.GetParagraphOrDefault(idx - 1); - if (previous != null) - { - if (!historyAdded) - { - MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustExtendPreviousLineEndToCurrentStart)); - historyAdded = true; - } - previous.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; - } - - if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) - { - var original = Utilities.GetOriginalParagraph(idx, p, _subtitleAlternate.Paragraphs); - if (original != null) - { - var originalPrevious = _subtitleAlternate.GetParagraphOrDefault(_subtitleAlternate.GetIndex(original) - 1); - if (originalPrevious != null) - { - if (!historyAdded) - { - MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustExtendPreviousLineEndToCurrentStart)); - historyAdded = true; - } - - originalPrevious.EndTime.TotalMilliseconds = original.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; - } - } - } - - SubtitleListview1.SetStartTimeAndDuration(idx - 1, previous, _subtitle.GetParagraphOrDefault(idx), _subtitle.GetParagraphOrDefault(idx - 2)); - } - } - - private void ExtendNextStartToCurrentEnd() - { - if (SubtitleListview1.SelectedItems.Count == 1) - { - var historyAdded = false; - var idx = SubtitleListview1.SelectedItems[0].Index; - var p = _subtitle.Paragraphs[idx]; - var next = _subtitle.GetParagraphOrDefault(idx + 1); - if (next != null) - { - if (!historyAdded) - { - MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustExtendNextLineStartToCurrentEnd)); - historyAdded = true; - } - next.StartTime.TotalMilliseconds = p.EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines; - } - - if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) - { - var original = Utilities.GetOriginalParagraph(idx, p, _subtitleAlternate.Paragraphs); - if (original != null) - { - var originalNext = _subtitleAlternate.GetParagraphOrDefault(_subtitleAlternate.GetIndex(original) + 1); - if (originalNext != null) - { - if (!historyAdded) - { - MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustExtendNextLineStartToCurrentEnd)); - historyAdded = true; - } - - originalNext.StartTime.TotalMilliseconds = original.EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines; - } - } - } - - SubtitleListview1.SetStartTimeAndDuration(idx + 1, next, _subtitle.GetParagraphOrDefault(idx + 2), _subtitle.GetParagraphOrDefault(idx)); - } - } - - private void SnapSelectedLinesStartToNextSceneChange(bool withGap = false) - { - var historyAdded = false; - foreach (ListViewItem selectedItem in SubtitleListview1.SelectedItems) - { - var idx = selectedItem.Index; - var p = _subtitle.Paragraphs[idx]; - List nextSceneChanges = audioVisualizer.SceneChanges.Count > 0 ? audioVisualizer.SceneChanges.Where(x => x > p.StartTime.TotalSeconds + 0.01).ToList() : new List(); - if (nextSceneChanges.Count > 0) - { - double nearestSceneChange = nextSceneChanges.Aggregate((x, y) => Math.Abs(x - p.StartTime.TotalSeconds) < Math.Abs(y - p.StartTime.TotalSeconds) ? x : y); - - if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) - { - var original = Utilities.GetOriginalParagraph(idx, p, _subtitleAlternate.Paragraphs); - if (original != null) - { - if (!historyAdded) - { - MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustSnapStartToNextSceneChange)); - historyAdded = true; - } - - if (!withGap) - { - if (nearestSceneChange * 1000 < p.EndTime.TotalMilliseconds) - { - original.StartTime.TotalMilliseconds = nearestSceneChange * 1000; - } - } - else - { - if (nearestSceneChange * 1000 + Configuration.Settings.General.MinimumMillisecondsBetweenLines < p.EndTime.TotalMilliseconds) - { - original.StartTime.TotalMilliseconds = nearestSceneChange * 1000 + Configuration.Settings.General.MinimumMillisecondsBetweenLines; - - } - } - } - } - - if (!historyAdded) - { - MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustSnapStartToNextSceneChange)); - historyAdded = true; - } - - if (!withGap) - { - if (nearestSceneChange * 1000 < p.EndTime.TotalMilliseconds) - { - p.StartTime.TotalMilliseconds = nearestSceneChange * 1000; - } - } - else - { - if (nearestSceneChange * 1000 + Configuration.Settings.General.MinimumMillisecondsBetweenLines < p.EndTime.TotalMilliseconds) - { - p.StartTime.TotalMilliseconds = nearestSceneChange * 1000 + Configuration.Settings.General.MinimumMillisecondsBetweenLines; - } - } - } - - RefreshSelectedParagraphs(); - } - } - - private void SnapSelectedLinesEndToPreviousSceneChange(bool withGap = false) - { - var historyAdded = false; - foreach (ListViewItem selectedItem in SubtitleListview1.SelectedItems) - { - var idx = selectedItem.Index; - var p = _subtitle.Paragraphs[idx]; - List previousSceneChanges = audioVisualizer.SceneChanges.Count > 0 ? audioVisualizer.SceneChanges.Where(x => x < p.EndTime.TotalSeconds + 0.01).ToList() : new List(); - if (previousSceneChanges.Count > 0) - { - double nearestSceneChange = previousSceneChanges.Aggregate((x, y) => Math.Abs(x - p.EndTime.TotalSeconds) < Math.Abs(y - p.EndTime.TotalSeconds) ? x : y); - - if (!historyAdded) - { - MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustSnapEndToPreviousSceneChange)); - historyAdded = true; - } - - if (!withGap) - { - if (nearestSceneChange * 1000 > p.StartTime.TotalMilliseconds) - { - p.EndTime.TotalMilliseconds = nearestSceneChange * 1000; - } - } - else - { - if (nearestSceneChange * 1000 - Configuration.Settings.General.MinimumMillisecondsBetweenLines > p.StartTime.TotalMilliseconds) - { - p.EndTime.TotalMilliseconds = nearestSceneChange * 1000 - Configuration.Settings.General.MinimumMillisecondsBetweenLines; - } - } - - if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) - { - var original = Utilities.GetOriginalParagraph(idx, p, _subtitleAlternate.Paragraphs); - if (original != null) - { - if (!historyAdded) - { - MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustSnapEndToPreviousSceneChange)); - historyAdded = true; - } - - if (!withGap) - { - if (nearestSceneChange * 1000 > p.StartTime.TotalMilliseconds) - { - original.EndTime.TotalMilliseconds = nearestSceneChange * 1000; - } - } - else - { - if (nearestSceneChange * 1000 - Configuration.Settings.General.MinimumMillisecondsBetweenLines > p.StartTime.TotalMilliseconds) - { - original.EndTime.TotalMilliseconds = nearestSceneChange * 1000 - Configuration.Settings.General.MinimumMillisecondsBetweenLines; - - } - } - } - } - } - - RefreshSelectedParagraphs(); - } - } - - private void ExtendSelectedLinesToNextSceneChange(bool withGap = false) - { - var historyAdded = false; - foreach (ListViewItem selectedItem in SubtitleListview1.SelectedItems) - { - var idx = selectedItem.Index; - var p = _subtitle.Paragraphs[idx]; - List nextSceneChanges = audioVisualizer.SceneChanges.Count > 0 ? audioVisualizer.SceneChanges.Where(x => x > p.EndTime.TotalSeconds + 0.01).ToList() : new List(); - if (nextSceneChanges.Count > 0) - { - var next = _subtitle.GetParagraphOrDefault(idx + 1); - double nearestSceneChange = nextSceneChanges.Aggregate((x, y) => Math.Abs(x - p.EndTime.TotalSeconds) < Math.Abs(y - p.EndTime.TotalSeconds) ? x : y); - double nearestStartTimeWithGap = next != null ? next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines : Double.MaxValue; - - if (!historyAdded) - { - MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustExtendToNextSceneChange)); - historyAdded = true; - } - - if (!withGap) - { - p.EndTime.TotalMilliseconds = Math.Min(nearestSceneChange * 1000, nearestStartTimeWithGap); - } - else - { - p.EndTime.TotalMilliseconds = Math.Min(nearestSceneChange * 1000 - Configuration.Settings.General.MinimumMillisecondsBetweenLines, nearestStartTimeWithGap); - } - - if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) - { - var original = Utilities.GetOriginalParagraph(idx, p, _subtitleAlternate.Paragraphs); - if (original != null) - { - var originalNext = _subtitleAlternate.GetParagraphOrDefault(_subtitleAlternate.GetIndex(original) + 1); - double nearestOriginalStartTimeWithGap = originalNext != null ? originalNext.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines : Double.MaxValue; - - if (!historyAdded) - { - MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustExtendToNextSceneChange)); - historyAdded = true; - } - - if (!withGap) - { - original.EndTime.TotalMilliseconds = Math.Min(nearestSceneChange * 1000, nearestOriginalStartTimeWithGap); - - } - else - { - original.EndTime.TotalMilliseconds = Math.Min(nearestSceneChange * 1000 - Configuration.Settings.General.MinimumMillisecondsBetweenLines, nearestStartTimeWithGap); - } - } - } - } - - RefreshSelectedParagraphs(); - } - } - - private void ExtendSelectedLinesToPreviousSceneChange(bool withGap = false) - { - var historyAdded = false; - foreach (ListViewItem selectedItem in SubtitleListview1.SelectedItems) - { - var idx = selectedItem.Index; - var p = _subtitle.Paragraphs[idx]; - List previousSceneChanges = audioVisualizer.SceneChanges.Count > 0 ? audioVisualizer.SceneChanges.Where(x => x < p.StartTime.TotalSeconds - 0.01).ToList() : new List(); - if (previousSceneChanges.Count > 0) - { - var previous = _subtitle.GetParagraphOrDefault(idx - 1); - double nearestSceneChange = previousSceneChanges.Aggregate((x, y) => Math.Abs(x - p.StartTime.TotalSeconds) < Math.Abs(y - p.StartTime.TotalSeconds) ? x : y); - double nearestEndTimeWithGap = previous != null ? previous.EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines : -9999; - - if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) - { - var original = Utilities.GetOriginalParagraph(idx, p, _subtitleAlternate.Paragraphs); - if (original != null) - { - var originalPrevious = _subtitleAlternate.GetParagraphOrDefault(_subtitleAlternate.GetIndex(original) - 1); - double nearestOriginalEndTimeWithGap = originalPrevious != null ? originalPrevious.EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines : -9999; - - if (!historyAdded) - { - MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustExtendToPreviousSceneChange)); - historyAdded = true; - } - - if (!withGap) - { - original.StartTime.TotalMilliseconds = Math.Max(nearestSceneChange * 1000, nearestOriginalEndTimeWithGap); - } - else - { - original.StartTime.TotalMilliseconds = Math.Max(nearestSceneChange * 1000 + Configuration.Settings.General.MinimumMillisecondsBetweenLines, nearestOriginalEndTimeWithGap); - } - } - } - - if (!historyAdded) - { - MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustExtendToPreviousSceneChange)); - historyAdded = true; - } - - if (!withGap) - { - p.StartTime.TotalMilliseconds = Math.Max(nearestSceneChange * 1000, nearestEndTimeWithGap); - } - else - { - p.StartTime.TotalMilliseconds = Math.Max(nearestSceneChange * 1000 + Configuration.Settings.General.MinimumMillisecondsBetweenLines, nearestEndTimeWithGap); - } - } - - RefreshSelectedParagraphs(); - } - } - - private void GoToPreviousSubtitle(double currentPosition) - { - var found = false; - foreach (var p in _subtitle.Paragraphs) - { - if (p.StartTime.TotalMilliseconds > currentPosition - 1) - { - var prev = _subtitle.GetParagraphOrDefault(_subtitle.Paragraphs.IndexOf(p) - 1); - if (prev == null) - { - break; - } - - mediaPlayer.CurrentPosition = prev.StartTime.TotalSeconds; - SubtitleListview1.SelectIndexAndEnsureVisible(_subtitle.Paragraphs.IndexOf(prev), true); - if (audioVisualizer.WavePeaks != null && p.StartTime.TotalSeconds > audioVisualizer.EndPositionSeconds + 0.2) - { - audioVisualizer.StartPositionSeconds = mediaPlayer.CurrentPosition - 0.2; - } - found = true; - break; - } - } - if (!found && _subtitle.Paragraphs.Count > 0 && _subtitle.Paragraphs[_subtitle.Paragraphs.Count - 1].StartTime.TotalMilliseconds < currentPosition) - { - var p = _subtitle.Paragraphs[_subtitle.Paragraphs.Count - 1]; - mediaPlayer.CurrentPosition = p.StartTime.TotalSeconds; - SubtitleListview1.SelectIndexAndEnsureVisible(_subtitle.Paragraphs.Count - 1, true); - if (audioVisualizer.WavePeaks != null && p.StartTime.TotalSeconds > audioVisualizer.EndPositionSeconds + 0.2) - { - audioVisualizer.StartPositionSeconds = mediaPlayer.CurrentPosition - 0.2; - } - } - } - - private void GoToNextSubtitle(double currentPosition) - { - foreach (var p in _subtitle.Paragraphs) - { - if (p.StartTime.TotalMilliseconds > currentPosition) - { - mediaPlayer.CurrentPosition = p.StartTime.TotalSeconds; - SubtitleListview1.SelectIndexAndEnsureVisible(_subtitle.Paragraphs.IndexOf(p), true); - if (audioVisualizer.WavePeaks != null && p.StartTime.TotalSeconds > audioVisualizer.EndPositionSeconds + 0.2) - { - audioVisualizer.StartPositionSeconds = mediaPlayer.CurrentPosition - 0.2; - } - - break; - } - } - } - - private void AutoGuessStartTime(int index) - { - var p = _subtitle.GetParagraphOrDefault(index); - if (p == null) - { - return; - } - - var silenceLengthInSeconds = 0.08; - var lowPercent = audioVisualizer.FindLowPercentage(p.StartTime.TotalSeconds - 0.3, p.StartTime.TotalSeconds + 0.1); - var highPercent = audioVisualizer.FindHighPercentage(p.StartTime.TotalSeconds - 0.3, p.StartTime.TotalSeconds + 0.4); - var add = 5.0; - if (highPercent > 40) - { - add = 8; - } - else if (highPercent < 5) - { - add = highPercent - lowPercent - 0.3; - } - for (var startVolume = lowPercent + add; startVolume < 14; startVolume += 0.3) - { - var pos = audioVisualizer.FindDataBelowThresholdBackForStart(startVolume, silenceLengthInSeconds, p.StartTime.TotalSeconds); - var pos2 = audioVisualizer.FindDataBelowThresholdBackForStart(startVolume + 0.3, silenceLengthInSeconds, p.StartTime.TotalSeconds); - if (pos >= 0 && pos > p.StartTime.TotalSeconds - 1) - { - if (pos2 > pos && pos2 >= 0 && pos2 > p.StartTime.TotalSeconds - 1) - { - pos = pos2; - } - - var newStartTimeMs = pos * TimeCode.BaseUnit; - var prev = _subtitle.GetParagraphOrDefault(index - 1); - if (prev != null && prev.EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines >= newStartTimeMs) - { - newStartTimeMs = prev.EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines; - if (newStartTimeMs >= p.StartTime.TotalMilliseconds) - { - break; // cannot move start time - } - } - - // check for scene changes - if (audioVisualizer.SceneChanges != null) - { - var matchingSceneChanges = audioVisualizer.SceneChanges - .Where(sc => sc > p.StartTime.TotalSeconds - 0.3 && sc < p.StartTime.TotalSeconds + 0.2) - .OrderBy(sc => Math.Abs(sc - p.StartTime.TotalSeconds)); - if (matchingSceneChanges.Count() > 0) - { - newStartTimeMs = matchingSceneChanges.First() * TimeCode.BaseUnit; - } - } - - if (Math.Abs(p.StartTime.TotalMilliseconds - newStartTimeMs) < 10) - { - break; // diff too small - } - - var newEndTimeMs = p.EndTime.TotalMilliseconds; - if (newStartTimeMs > p.StartTime.TotalMilliseconds) - { - var temp = new Paragraph(p); - temp.StartTime.TotalMilliseconds = newStartTimeMs; - if (temp.Duration.TotalMilliseconds < Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds || - Utilities.GetCharactersPerSecond(temp) > Configuration.Settings.General.SubtitleMaximumCharactersPerSeconds) - { - var next = _subtitle.GetParagraphOrDefault(index + 1); - if (next == null || - next.StartTime.TotalMilliseconds > newStartTimeMs + p.Duration.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines) - { - newEndTimeMs = newStartTimeMs + p.Duration.TotalMilliseconds; - } - } - } - - MakeHistoryForUndo(string.Format(Configuration.Settings.Language.Main.BeforeX, Configuration.Settings.Language.Settings.WaveformGuessStart)); - - if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) - { - var original = Utilities.GetOriginalParagraph(index, p, _subtitleAlternate.Paragraphs); - if (original != null) - { - original.StartTime.TotalMilliseconds = newStartTimeMs; - original.EndTime.TotalMilliseconds = newEndTimeMs; - } - } - - p.StartTime.TotalMilliseconds = newStartTimeMs; - p.EndTime.TotalMilliseconds = newEndTimeMs; - RefreshSelectedParagraph(); - SubtitleListview1.SetStartTimeAndDuration(index, p, _subtitle.GetParagraphOrDefault(index + 1), _subtitle.GetParagraphOrDefault(index - 1)); - break; - } - } - } - - private void GoToBookmark() - { - using (var form = new BookmarksGoTo(_subtitle)) - { - if (form.ShowDialog(this) == DialogResult.OK) - { - SubtitleListview1.SelectIndexAndEnsureVisible(form.BookmarkIndex, true); - if (mediaPlayer.VideoPlayer != null) - { - mediaPlayer.VideoPlayer.CurrentPosition = _subtitle.Paragraphs[form.BookmarkIndex].StartTime.TotalSeconds; - } - } - } - } - - private void GoToPrevoiusBookmark() - { - int idx = FirstSelectedIndex - 1; - try - { - for (int i = idx; i >= 0; i--) - { - var p = _subtitle.Paragraphs[i]; - if (p.Bookmark != null) - { - SubtitleListview1.SelectIndexAndEnsureVisible(i, true); - if (mediaPlayer.VideoPlayer != null) - { - mediaPlayer.VideoPlayer.CurrentPosition = _subtitle.Paragraphs[i].StartTime.TotalSeconds; - } - - return; - } - } - } - catch - { - } - } - - private void GoToNextBookmark() - { - int idx = FirstSelectedIndex + 1; - try - { - for (int i = idx; i < _subtitle.Paragraphs.Count; i++) - { - var p = _subtitle.Paragraphs[i]; - if (p.Bookmark != null) - { - SubtitleListview1.SelectIndexAndEnsureVisible(i, true); - if (mediaPlayer.VideoPlayer != null) - { - mediaPlayer.VideoPlayer.CurrentPosition = _subtitle.Paragraphs[i].StartTime.TotalSeconds; - } - - return; - } - } - } - catch - { - } - } - - private void ToggleBookmarks(bool setText) - { - bool first = true; - string newValue = null; - if (setText) - { - MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.ToggleBookmarksWithComment)); - } - else - { - MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.ToggleBookmarks)); - } - - foreach (int index in SubtitleListview1.SelectedIndices) - { - var p = _subtitle.Paragraphs[index]; - if (first) - { - if (p.Bookmark == null) - { - if (setText) - { - using (var form = new BookmarkAdd(p)) - { - var result = form.ShowDialog(this); - if (result != DialogResult.OK) - { - return; - } - - newValue = form.Comment; - } - } - else - { - newValue = string.Empty; - } - } - else - { - newValue = null; - } - - first = false; - } - - p.Bookmark = newValue; - SubtitleListview1.ShowState(index, p); - ShowHideBookmark(p); - } - - SetListViewStateImages(); - new BookmarkPersistence(_subtitle, _fileName).Save(); - } - - private void SetListViewStateImages() - { - var oldStaeImageList = SubtitleListview1.StateImageList; - SubtitleListview1.StateImageList = _subtitle != null && _subtitle.Paragraphs.Any(p => p.Bookmark != null) ? imageListBookmarks : null; - if (SubtitleListview1.StateImageList == null) - { - SubtitleListview1.Columns[SubtitleListview1.ColumnIndexNumber].Text = Configuration.Settings.Language.General.NumberSymbol; - } - else - { - SubtitleListview1.Columns[SubtitleListview1.ColumnIndexNumber].Text = " " + Configuration.Settings.Language.General.NumberSymbol; - } - - if (oldStaeImageList == SubtitleListview1.StateImageList) - { - return; - } - - if (!_loading) - { - if (SubtitleListview1.StateImageList == null) - { - SubtitleListview1.Columns[SubtitleListview1.ColumnIndexNumber].Width = Configuration.Settings.General.ListViewNumberWidth - 18; - } - else - { - SubtitleListview1.Columns[SubtitleListview1.ColumnIndexNumber].Width = Configuration.Settings.General.ListViewNumberWidth + 18; - } - } - - SubtitleListview1.SubtitleListViewLastColumnFill(null, null); - } - - private void ClearBookmarks() - { - MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.ClearBookmarks)); - for (var index = 0; index < _subtitle.Paragraphs.Count; index++) - { - var paragraph = _subtitle.Paragraphs[index]; - if (paragraph.Bookmark != null) - { - paragraph.Bookmark = null; - SubtitleListview1.ShowState(index, paragraph); - } - } - - var p = _subtitle.GetParagraphOrDefault(_subtitleListViewIndex); - if (p != null) - { - ShowHideBookmark(p); - } - - SetListViewStateImages(); - new BookmarkPersistence(_subtitle, _fileName).Save(); - } - - private void MoveWordUpDownInCurrent(bool down, SETextBox tb) - { - int firstIndex = FirstSelectedIndex; - if (firstIndex < 0) - { - return; - } - - var p = _subtitle.GetParagraphOrDefault(firstIndex); - if (tb == textBoxListViewTextAlternate) - { - p = Utilities.GetOriginalParagraph(firstIndex, p, _subtitleAlternate.Paragraphs); - } - - if (p == null) - { - return; - } - - var lines = p.Text.SplitToLines(); - if (lines.Count == 1) - { - lines.Add(string.Empty); - } - - if (lines.Count != 2) - { - return; - } - - var line1Words = lines[0].Split(' ').ToList(); - var line2Words = lines[1].Split(' ').ToList(); - if (down) - { - if (line1Words.Count > 0) - { - line2Words.Insert(0, line1Words[line1Words.Count - 1]); - line1Words.RemoveAt(line1Words.Count - 1); - } - } - else // up - { - if (line2Words.Count > 0) - { - line1Words.Add(line2Words[0]); - line2Words.RemoveAt(0); - } - } - - var newText = (string.Join(" ", line1Words.ToArray()).Trim() + Environment.NewLine + - string.Join(" ", line2Words.ToArray()).Trim()).Trim(); - if (newText != p.Text) - { - var oldText = p.Text; - MakeHistoryForUndo(_language.BeforeLineUpdatedInListView); - var textCaretPos = textBoxListViewText.SelectionStart; - p.Text = newText; - if (tb == textBoxListViewTextAlternate) - { - SubtitleListview1.SetAlternateText(firstIndex, p.Text); - } - else - { - SubtitleListview1.SetText(firstIndex, p.Text); - } - tb.Text = p.Text; - - // keep cursor position - KeepCursorMoveWordUpdown(down, newText, oldText, textCaretPos); - } - } - - private void KeepCursorMoveWordUpdown(bool down, string newText, string oldText, int textCaretPos) - { - if (textCaretPos > textBoxListViewText.Text.Length) - { - // set cursor at end of textbox - textBoxListViewText.SelectionStart = textCaretPos; - int end = textBoxListViewText.Text.Length; - textBoxListViewText.SelectionStart = end; - textBoxListViewText.SelectionLength = 0; - return; - } - - int indexOfNewLine = newText.IndexOf(Environment.NewLine, StringComparison.Ordinal); - int oldIndexOfNewLine = oldText.IndexOf(Environment.NewLine, StringComparison.Ordinal); - - if (down) - { - if (indexOfNewLine == -1 && oldIndexOfNewLine > 0 && textCaretPos > oldIndexOfNewLine) - { - textCaretPos--; - } - else if (textCaretPos > indexOfNewLine && textCaretPos > oldIndexOfNewLine && oldIndexOfNewLine >= 0 || - textCaretPos < indexOfNewLine && (oldIndexOfNewLine == -1 || textCaretPos < oldIndexOfNewLine) || - textCaretPos < oldIndexOfNewLine && indexOfNewLine == -1) - { - } - else - { - textCaretPos++; - } - } - else // up - { - if (textCaretPos <= oldIndexOfNewLine || textCaretPos > oldIndexOfNewLine && textCaretPos > indexOfNewLine && indexOfNewLine >= 0) - { - } - else - { - textCaretPos--; - } - } - - if (textBoxListViewText.Text.Length > textCaretPos && '\n' == textBoxListViewText.Text[textCaretPos]) - { - textCaretPos--; - } - - if (textCaretPos >= 0) - { - textBoxListViewText.SelectionStart = textCaretPos; - textBoxListViewText.SelectionStart = textCaretPos; - textBoxListViewText.SelectionStart = textCaretPos; - } - } - - private void MoveStartCurrent(int ms, bool keepGapPrevIfClose) - { - var i = _subtitleListViewIndex; - if (i < 0 || i >= _subtitle.Paragraphs.Count || ms == 0) - { - return; - } - - var p = _subtitle.GetParagraphOrDefault(i); - if (p == null) - { - return; - } - - // snap to scene change - if (Configuration.Settings.VideoControls.WaveformSnapToSceneChanges && audioVisualizer?.SceneChanges?.Count > 0) - { - var seconds = (p.StartTime.TotalMilliseconds + ms) / 1000.0; - var closest = audioVisualizer.SceneChanges.OrderBy(sc => Math.Abs(seconds - sc)).First() * 1000.0; - if (Math.Abs(p.StartTime.TotalMilliseconds + ms - closest) < CurrentFrameRate * 0.9) - { - ms = (int)Math.Round(closest - p.StartTime.TotalMilliseconds); - } - } - - var prevGap = 0.0; - var prev = _subtitle.GetParagraphOrDefault(i - 1); - if (keepGapPrevIfClose && prev != null) - { - if (prev.EndTime.TotalMilliseconds <= p.StartTime.TotalMilliseconds && prev.EndTime.TotalMilliseconds + 200 >= p.StartTime.TotalMilliseconds) - { - prevGap = p.StartTime.TotalMilliseconds - prev.EndTime.TotalMilliseconds; - if (ms < 0 && prev.Duration.TotalMilliseconds + ms < Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds) - { - return; - } - } - else - { - prev = null; - } - } - - if (ms > 0) - { - if (p.StartTime.TotalMilliseconds + ms + Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds > p.EndTime.TotalMilliseconds) - { - return; // do not allow duration smaller than min duration in ms - } - - p.StartTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + ms; - } - else - { - if (p.Duration.TotalMilliseconds + Math.Abs(ms) > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) - { - return; - } - - if (p.StartTime.TotalMilliseconds + ms < 0) - { - return; - } - - if (keepGapPrevIfClose || prev == null || p.StartTime.TotalMilliseconds - (Math.Abs(ms) + Configuration.Settings.General.MinimumMillisecondsBetweenLines) > prev.EndTime.TotalMilliseconds) - { - p.StartTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + ms; - } - else - { - var newStartMs = prev.EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines; - if (newStartMs < p.StartTime.TotalMilliseconds) - { - p.StartTime.TotalMilliseconds = newStartMs; - } - } - } - - SubtitleListview1.SetStartTimeAndDuration(i, p, _subtitle.GetParagraphOrDefault(i + 1), _subtitle.GetParagraphOrDefault(i - 1)); - timeUpDownStartTime.MaskedTextBox.TextChanged -= MaskedTextBoxTextChanged; - timeUpDownStartTime.TimeCode = p.StartTime; - timeUpDownStartTime.MaskedTextBox.TextChanged += MaskedTextBoxTextChanged; - SetDurationInSeconds(p.Duration.TotalSeconds); - - if (keepGapPrevIfClose && prev != null) - { - prev.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds - prevGap; - if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) - { - var original = Utilities.GetOriginalParagraph(_subtitle.GetIndex(prev), prev, _subtitleAlternate.Paragraphs); - if (original != null) - { - original.EndTime.TotalMilliseconds = prev.EndTime.TotalMilliseconds; - } - } - SubtitleListview1.SetStartTimeAndDuration(i - 1, prev, p, _subtitle.GetParagraphOrDefault(i - 2)); - } - - if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) - { - var original = Utilities.GetOriginalParagraph(_subtitle.GetIndex(p), p, _subtitleAlternate.Paragraphs); - if (original != null) - { - original.StartTime.TotalMilliseconds = p.StartTime.TotalMilliseconds; - original.EndTime.TotalMilliseconds = p.EndTime.TotalMilliseconds; - } - } - - SubtitleListview1.SyntaxColorLine(_subtitle.Paragraphs, i, p); - } - - private void MoveEndCurrent(int ms, bool keepGapNextIfClose) - { - var i = _subtitleListViewIndex; - if (i < 0 || i >= _subtitle.Paragraphs.Count || ms == 0) - { - return; - } - - var p = _subtitle.GetParagraphOrDefault(i); - if (p == null) - { - return; - } - - // snap to scene change - if (Configuration.Settings.VideoControls.WaveformSnapToSceneChanges && audioVisualizer?.SceneChanges?.Count > 0) - { - var seconds = (p.EndTime.TotalMilliseconds + ms) / 1000.0; - var closest = audioVisualizer.SceneChanges.OrderBy(sc => Math.Abs(seconds - sc)).First() * 1000.0; - if (Math.Abs(p.EndTime.TotalMilliseconds + ms - closest) < CurrentFrameRate * 0.9) - { - ms = (int)Math.Round(closest - p.EndTime.TotalMilliseconds); - } - } - - var nextGap = 0.0; - var next = _subtitle.GetParagraphOrDefault(i + 1); - if (keepGapNextIfClose && next != null) - { - if (next.StartTime.TotalMilliseconds >= p.EndTime.TotalMilliseconds && next.StartTime.TotalMilliseconds - 200 < p.EndTime.TotalMilliseconds) - { - nextGap = next.StartTime.TotalMilliseconds - p.EndTime.TotalMilliseconds; - if (ms > 0 && next.Duration.TotalMilliseconds + ms < Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds) - { - return; - } - } - else - { - next = null; - } - } - - if (ms > 0) - { - if (p.Duration.TotalMilliseconds + ms > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) - { - return; - } - - if (keepGapNextIfClose || next == null || p.EndTime.TotalMilliseconds + ms + Configuration.Settings.General.MinimumMillisecondsBetweenLines < next.StartTime.TotalMilliseconds) - { - p.EndTime.TotalMilliseconds = p.EndTime.TotalMilliseconds + ms; - } - else - { - var newEndMs = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; - if (newEndMs > p.EndTime.TotalMilliseconds) - { - p.EndTime.TotalMilliseconds = newEndMs; - } - } - } - else - { - if (p.EndTime.TotalMilliseconds + ms - Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds < p.StartTime.TotalMilliseconds) - { - return; // do not allow duration smaller than min duration in ms - } - - p.EndTime.TotalMilliseconds = p.EndTime.TotalMilliseconds + ms; - } - - SubtitleListview1.SetStartTimeAndDuration(i, p, _subtitle.GetParagraphOrDefault(i + 1), _subtitle.GetParagraphOrDefault(i - 1)); - timeUpDownStartTime.MaskedTextBox.TextChanged -= MaskedTextBoxTextChanged; - timeUpDownStartTime.TimeCode = p.StartTime; - timeUpDownStartTime.MaskedTextBox.TextChanged += MaskedTextBoxTextChanged; - SetDurationInSeconds(p.Duration.TotalSeconds); - - if (keepGapNextIfClose && next != null) - { - next.StartTime.TotalMilliseconds = p.EndTime.TotalMilliseconds + nextGap; - if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) - { - var original = Utilities.GetOriginalParagraph(_subtitle.GetIndex(next), next, _subtitleAlternate.Paragraphs); - if (original != null) - { - original.StartTime.TotalMilliseconds = next.StartTime.TotalMilliseconds; - } - } - SubtitleListview1.SetStartTimeAndDuration(i + 1, next, _subtitle.GetParagraphOrDefault(i + 2), p); - } - - if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) - { - var original = Utilities.GetOriginalParagraph(_subtitle.GetIndex(p), p, _subtitleAlternate.Paragraphs); - if (original != null) - { - original.StartTime.TotalMilliseconds = p.StartTime.TotalMilliseconds; - original.EndTime.TotalMilliseconds = p.EndTime.TotalMilliseconds; - } - } - - SubtitleListview1.SyntaxColorLine(_subtitle.Paragraphs, i, p); - } - - private void ShowNextSubtitleLabel() - { - if (audioVisualizer.Visible && audioVisualizer.WavePeaks != null && audioVisualizer.Width > 300 && _subtitleListViewIndex >= 0) - { - var next = _subtitle.GetParagraphOrDefault(_subtitleListViewIndex + 1); - if (next != null && !string.IsNullOrEmpty(next.Text)) - { - labelNextWord.Top = audioVisualizer.Top; - labelNextWord.Text = string.Format(_language.NextX, HtmlUtil.RemoveHtmlTags(next.Text, true).Replace(Environment.NewLine, " ")); - labelNextWord.Left = audioVisualizer.Width / 2 - labelNextWord.Width / 2 + audioVisualizer.Left; - labelNextWord.Visible = true; - _labelNextTicks = DateTime.UtcNow.Ticks; - } - else - { - labelNextWord.Visible = false; - } - } - else - { - labelNextWord.Visible = false; - } - } - - private void MergeSelectedLinesOnlyFirstText() - { - if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 1) - { - var deleteIndices = new List(); - bool first = true; - int firstIndex = 0; - int next = 0; - string text = string.Empty; - double endTime = 0; - foreach (int index in SubtitleListview1.SelectedIndices) - { - if (first) - { - firstIndex = index; - next = index + 1; - } - else - { - deleteIndices.Add(index); - if (next != index) - { - return; - } - - next++; - } - - first = false; - if (string.IsNullOrEmpty(text)) - { - text = _subtitle.Paragraphs[index].Text.Trim(); - } - - endTime = _subtitle.Paragraphs[index].EndTime.TotalMilliseconds; - } - - SubtitleListview1.SelectedIndexChanged -= SubtitleListview1_SelectedIndexChanged; - MakeHistoryForUndo(_language.BeforeMergeLines); - - var currentParagraph = _subtitle.Paragraphs[firstIndex]; - currentParagraph.Text = text; - currentParagraph.EndTime.TotalMilliseconds = endTime; - - var nextParagraph = _subtitle.GetParagraphOrDefault(next); - if (nextParagraph != null && currentParagraph.EndTime.TotalMilliseconds > nextParagraph.StartTime.TotalMilliseconds && currentParagraph.StartTime.TotalMilliseconds < nextParagraph.StartTime.TotalMilliseconds) - { - currentParagraph.EndTime.TotalMilliseconds = nextParagraph.StartTime.TotalMilliseconds - 1; - } - - // original subtitle - if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) - { - var original = Utilities.GetOriginalParagraph(firstIndex, currentParagraph, _subtitleAlternate.Paragraphs); - if (original != null) - { - string originalText = string.Empty; - for (int i = 0; i < deleteIndices.Count; i++) - { - var originalNext = Utilities.GetOriginalParagraph(deleteIndices[i], _subtitle.Paragraphs[deleteIndices[i]], _subtitleAlternate.Paragraphs); - if (originalNext != null && string.IsNullOrEmpty(originalText)) - { - originalText = originalNext.Text; - } - } - - for (int i = deleteIndices.Count - 1; i >= 0; i--) - { - var originalNext = Utilities.GetOriginalParagraph(deleteIndices[i], _subtitle.Paragraphs[deleteIndices[i]], _subtitleAlternate.Paragraphs); - if (originalNext != null) - { - _subtitleAlternate.Paragraphs.Remove(originalNext); - } - } - - original.Text = originalText; - original.EndTime.TotalMilliseconds = currentParagraph.EndTime.TotalMilliseconds; - _subtitleAlternate.Renumber(); - } - } - - if (_networkSession != null) - { - _networkSession.TimerStop(); - _networkSession.UpdateLine(firstIndex, currentParagraph); - NetworkGetSendUpdates(deleteIndices, 0, null); - } - else - { - for (int i = deleteIndices.Count - 1; i >= 0; i--) - { - _subtitle.Paragraphs.RemoveAt(deleteIndices[i]); - } - - _subtitle.Renumber(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - } - - ShowSource(); - ShowStatus(_language.LinesMerged); - SubtitleListview1.SelectIndexAndEnsureVisible(firstIndex, true); - SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; - RefreshSelectedParagraph(); - } - } - - private void GoToFirstEmptyLine() - { - var index = FirstSelectedIndex + 1; - for (; index < _subtitle.Paragraphs.Count; index++) - { - if (string.IsNullOrWhiteSpace(_subtitle.Paragraphs[index].Text)) - { - SubtitleListview1.SelectIndexAndEnsureVisible(index, true); - if (mediaPlayer.VideoPlayer != null) - { - mediaPlayer.VideoPlayer.CurrentPosition = _subtitle.Paragraphs[index].StartTime.TotalSeconds; - } - - return; - } - } - } - - private void PlayFirstSelectedSubtitle() - { - if (_subtitleListViewIndex >= 0 && mediaPlayer.VideoPlayer != null) - { - GotoSubtitleIndex(_subtitleListViewIndex); - var paragraph = _subtitle.Paragraphs[_subtitleListViewIndex]; - double startSeconds = paragraph.StartTime.TotalSeconds; - _endSeconds = paragraph.EndTime.TotalSeconds; - mediaPlayer.CurrentPosition = startSeconds; - ShowSubtitle(); - mediaPlayer.Play(); - } - } - - private void SetEndAndOffsetTheRest(bool goToNext) - { - if (SubtitleListview1.SelectedItems.Count == 1) - { - bool oldSync = checkBoxSyncListViewWithVideoWhilePlaying.Checked; - checkBoxSyncListViewWithVideoWhilePlaying.Checked = false; - - int index = SubtitleListview1.SelectedItems[0].Index; - double videoPosition = mediaPlayer.CurrentPosition; - if (!mediaPlayer.IsPaused) - { - videoPosition -= Configuration.Settings.General.SetStartEndHumanDelay / TimeCode.BaseUnit; - } - - var tc = TimeCode.FromSeconds(videoPosition); - - double offset = tc.TotalMilliseconds - _subtitle.Paragraphs[index].EndTime.TotalMilliseconds; - if (_subtitle.Paragraphs[index].StartTime.TotalMilliseconds + 100 > tc.TotalMilliseconds || offset > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) - { - return; - } - - MakeHistoryForUndo(_language.BeforeSetEndTimeAndOffsetTheRest + @" " + _subtitle.Paragraphs[index].Number + @" - " + tc); - - numericUpDownDuration.ValueChanged -= NumericUpDownDurationValueChanged; - _subtitle.Paragraphs[index].EndTime.TotalSeconds = videoPosition; - SubtitleListview1.SetDuration(index, _subtitle.Paragraphs[index], _subtitle.GetParagraphOrDefault(index + 1)); - checkBoxSyncListViewWithVideoWhilePlaying.Checked = oldSync; - numericUpDownDuration.Value = (decimal)_subtitle.Paragraphs[index].Duration.TotalSeconds; - numericUpDownDuration.ValueChanged += NumericUpDownDurationValueChanged; - RefreshSelectedParagraph(); - - for (int i = index + 1; i < SubtitleListview1.Items.Count; i++) - { - if (!_subtitle.Paragraphs[i].StartTime.IsMaxTime) - { - _subtitle.Paragraphs[i].StartTime = new TimeCode(_subtitle.Paragraphs[i].StartTime.TotalMilliseconds + offset); - _subtitle.Paragraphs[i].EndTime = new TimeCode(_subtitle.Paragraphs[i].EndTime.TotalMilliseconds + offset); - SubtitleListview1.SetDuration(i, _subtitle.Paragraphs[i], _subtitle.GetParagraphOrDefault(i + 1)); - } - } - - if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) - { - var original = Utilities.GetOriginalParagraph(index, _subtitle.Paragraphs[index], _subtitleAlternate.Paragraphs); - if (original != null) - { - index = _subtitleAlternate.GetIndex(original); - for (int i = index; i < _subtitleAlternate.Paragraphs.Count; i++) - { - if (!_subtitleAlternate.Paragraphs[i].StartTime.IsMaxTime) - { - _subtitleAlternate.Paragraphs[i].StartTime = new TimeCode(_subtitleAlternate.Paragraphs[i].StartTime.TotalMilliseconds + offset); - _subtitleAlternate.Paragraphs[i].EndTime = new TimeCode(_subtitleAlternate.Paragraphs[i].EndTime.TotalMilliseconds + offset); - } - } - } - } - - checkBoxSyncListViewWithVideoWhilePlaying.Checked = oldSync; - - if (goToNext) - { - _subtitleListViewIndex = -1; - SubtitleListview1.SelectIndexAndEnsureVisible(index + 1, true); - if (mediaPlayer.IsPaused && index + 1 < _subtitle.Paragraphs.Count) - { - mediaPlayer.CurrentPosition = _subtitle.Paragraphs[index + 1].StartTime.TotalSeconds; - } - } - } - } - - private void MoveVideoSeconds(double seconds) - { - var oldPosition = mediaPlayer.CurrentPosition; - var newPosition = oldPosition + seconds; - if (newPosition < 0) - { - newPosition = 0; - } - - if (mediaPlayer.IsPaused && Configuration.Settings.General.MoveVideo100Or500MsPlaySmallSample) - { - mediaPlayer.CurrentPosition = newPosition; - mediaPlayer.Play(); - System.Threading.Thread.Sleep(99); - mediaPlayer.Stop(); - } - - mediaPlayer.CurrentPosition = newPosition; - } - - private void RunCustomSearch(string url) - { - if (!string.IsNullOrEmpty(url)) - { - RunTranslateSearch((text) => - { - url = string.Format(url, Utilities.UrlEncode(text)); - UiUtil.OpenURL(url); - }); - } - } - - private void GoFullscreen(bool force) - { - if (mediaPlayer.VideoPlayer == null && !force) - { - return; - } - - mediaPlayer.ShowFullScreenControls(); - bool setRedockOnFullscreenEnd = false; - - if (_videoPlayerUndocked == null || _videoPlayerUndocked.IsDisposed) - { - UndockVideoControlsToolStripMenuItemClick(null, null); - setRedockOnFullscreenEnd = true; - } - - if (_videoPlayerUndocked != null && !_videoPlayerUndocked.IsDisposed) - { - _videoPlayerUndocked.Focus(); - _videoPlayerUndocked.GoFullscreen(); - if (setRedockOnFullscreenEnd) - { - _videoPlayerUndocked.RedockOnFullscreenEnd = true; - } - } - } - - private void RefreshTimeCodeMode() - { - if (Configuration.Settings.General.UseTimeFormatHHMMSSFF) - { - numericUpDownDuration.DecimalPlaces = 2; - numericUpDownDuration.Increment = (decimal)(0.01); - - toolStripSeparatorFrameRate.Visible = true; - toolStripLabelFrameRate.Visible = true; - toolStripComboBoxFrameRate.Visible = true; - toolStripButtonGetFrameRate.Visible = true; - } - else - { - numericUpDownDuration.DecimalPlaces = 3; - numericUpDownDuration.Increment = (decimal)(0.1); - - toolStripSeparatorFrameRate.Visible = Configuration.Settings.General.ShowFrameRate; - toolStripLabelFrameRate.Visible = Configuration.Settings.General.ShowFrameRate; - toolStripComboBoxFrameRate.Visible = Configuration.Settings.General.ShowFrameRate; - toolStripButtonGetFrameRate.Visible = Configuration.Settings.General.ShowFrameRate; - } - - SaveSubtitleListviewIndices(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - RefreshSelectedParagraph(); - } - - private void ReverseStartAndEndingForRtl() - { - MakeHistoryForUndo(toolStripMenuItemReverseRightToLeftStartEnd.Text); - int selectedIndex = FirstSelectedIndex; - foreach (int index in SubtitleListview1.SelectedIndices) - { - var p = _subtitle.Paragraphs[index]; - p.Text = Utilities.ReverseStartAndEndingForRightToLeft(p.Text); - SubtitleListview1.SetText(index, p.Text); - if (index == selectedIndex) - { - textBoxListViewText.Text = p.Text; - } - } - } - - private void MergeDialogs() - { - if (SubtitleListview1.SelectedItems.Count == 1 || SubtitleListview1.SelectedItems.Count == 2 && SubtitleListview1.SelectedIndices[0] + 1 == SubtitleListview1.SelectedIndices[1]) - { - MergeWithLineAfter(true); - } - } - - private void ToggleDashes() - { - var index = FirstSelectedIndex; - if (index >= 0) - { - var hasStartDash = false; - var p = _subtitle.Paragraphs[index]; - var lines = p.Text.SplitToLines(); - foreach (var line in lines) - { - var trimmed = HtmlUtil.RemoveHtmlTags(line, true).TrimStart(); - if (trimmed.StartsWith('-')) - { - hasStartDash = true; - break; - } - } - - if (!hasStartDash && _subtitleAlternate != null && textBoxListViewTextAlternate.Visible) - { - var original = Utilities.GetOriginalParagraph(index, p, _subtitleAlternate.Paragraphs); - if (original != null) - { - lines = original.Text.SplitToLines(); - foreach (var line in lines) - { - var trimmed = HtmlUtil.RemoveHtmlTags(line, true).TrimStart(); - if (trimmed.StartsWith('-')) - { - hasStartDash = true; - break; - } - } - } - } - - MakeHistoryForUndo(_language.BeforeToggleDialogDashes); - if (hasStartDash) - { - RemoveDashes(); - } - else - { - AddDashes(); - } - } - } - - private void ToggleDashesTextBox(SETextBox tb) - { - var hasStartDash = false; - var lines = tb.Text.TrimEnd().SplitToLines(); - foreach (var line in lines) - { - var trimmed = HtmlUtil.RemoveHtmlTags(line, true).TrimStart(); - if (trimmed.StartsWith('-')) - { - hasStartDash = true; - break; - } - } - - MakeHistoryForUndo(_language.BeforeToggleDialogDashes); - var sb = new StringBuilder(); - if (hasStartDash) - { - // remove dashes - foreach (var line in lines) - { - var pre = string.Empty; - var s = SplitStartTags(line, ref pre); - sb.AppendLine(pre + s.TrimStart('-').TrimStart()); - } - - tb.Text = sb.ToString().Trim(); - } - else - { - // add dashes - if (CouldBeDialog(lines)) - { - foreach (var line in lines) - { - var pre = string.Empty; - var s = SplitStartTags(line, ref pre); - sb.AppendLine(pre + "- " + s); - } - } - else - { - sb.Append(tb.Text); - } - - var text = sb.ToString().Trim(); - var dialogHelper = new DialogSplitMerge { DialogStyle = Configuration.Settings.General.DialogStyle, SkipLineEndingCheck = true }; - text = dialogHelper.FixDashesAndSpaces(text); - tb.Text = text; - } - } - - private void AddDashes() - { - var dialogHelper = new DialogSplitMerge { DialogStyle = Configuration.Settings.General.DialogStyle, SkipLineEndingCheck = true }; - foreach (int index in SubtitleListview1.SelectedIndices) - { - var p = _subtitle.Paragraphs[index]; - var lines = p.Text.SplitToLines(); - var sb = new StringBuilder(); - if (CouldBeDialog(lines)) - { - foreach (var line in lines) - { - var pre = string.Empty; - var s = SplitStartTags(line, ref pre); - sb.AppendLine(pre + "- " + s); - } - } - else - { - sb.Append(p.Text); - } - - var text = sb.ToString().Trim(); - text = dialogHelper.FixDashesAndSpaces(text); - _subtitle.Paragraphs[index].Text = text; - SubtitleListview1.SetText(index, text); - if (index == _subtitleListViewIndex) - { - textBoxListViewText.Text = text; - } - - if (_subtitleAlternate != null && textBoxListViewTextAlternate.Visible) - { - var original = Utilities.GetOriginalParagraph(index, p, _subtitleAlternate.Paragraphs); - if (original != null) - { - lines = original.Text.SplitToLines(); - sb = new StringBuilder(); - if (CouldBeDialog(lines)) - { - foreach (var line in lines) - { - var pre = string.Empty; - var s = SplitStartTags(line, ref pre); - if (!line.StartsWith("-")) - { - sb.AppendLine(pre + "- " + s); - } - else - { - sb.AppendLine(pre + s); - } - } - } - else - { - sb.Append(original.Text); - } - - text = sb.ToString().Trim(); - text = dialogHelper.FixDashesAndSpaces(text); - _subtitleAlternate.Paragraphs[index].Text = text; - SubtitleListview1.SetAlternateText(index, text); - if (index == _subtitleListViewIndex) - { - textBoxListViewTextAlternate.Text = text; - } - } - } - } - } - - private static bool CouldBeDialog(List lines) - { - return lines.Count >= 2 && lines.Count <= 3; - } - - private void RemoveDashes() - { - foreach (int index in SubtitleListview1.SelectedIndices) - { - var p = _subtitle.Paragraphs[index]; - var lines = p.Text.SplitToLines(); - var sb = new StringBuilder(); - foreach (var line in lines) - { - var pre = string.Empty; - var s = SplitStartTags(line, ref pre); - sb.AppendLine(pre + s.TrimStart('-').TrimStart()); - } - - string text = sb.ToString().Trim(); - _subtitle.Paragraphs[index].Text = text; - SubtitleListview1.SetText(index, text); - if (index == _subtitleListViewIndex) - { - textBoxListViewText.Text = text; - } - - if (_subtitleAlternate != null && textBoxListViewTextAlternate.Visible) - { - var original = Utilities.GetOriginalParagraph(index, p, _subtitleAlternate.Paragraphs); - if (original != null) - { - lines = original.Text.SplitToLines(); - sb = new StringBuilder(); - foreach (var line in lines) - { - var pre = string.Empty; - var s = SplitStartTags(line, ref pre); - sb.AppendLine(pre + s.TrimStart('-').TrimStart()); - } - - text = sb.ToString().Trim(); - _subtitleAlternate.Paragraphs[index].Text = text; - SubtitleListview1.SetAlternateText(index, text); - if (index == _subtitleListViewIndex) - { - textBoxListViewTextAlternate.Text = text; - } - } - } - } - } - - private static string SplitStartTags(string line, ref string pre) - { - var s = line; - if (s.StartsWith("{\\", StringComparison.Ordinal) && s.IndexOf('}') > 0) - { - pre = s.Substring(0, s.IndexOf('}') + 1); - s = s.Remove(0, pre.Length); - } - - bool updated = true; - while (updated) - { - updated = false; - if (s.StartsWith(' ')) - { - pre += ' '; - s = s.Remove(0, 1); - updated = true; - } - else if (s.StartsWith("", StringComparison.OrdinalIgnoreCase) || - s.StartsWith("", StringComparison.OrdinalIgnoreCase) || - s.StartsWith("", StringComparison.OrdinalIgnoreCase)) - { - pre += s.Substring(0, 3); - s = s.Remove(0, 3); - updated = true; - } - else if (s.StartsWith("'); - if (endFont > 0) - { - pre += s.Substring(0, endFont + 1); - s = s.Remove(0, endFont + 1); - updated = true; - } - } - } - - return s; - } - - private void SetTitle() - { - var text = "Untitled"; - string separator = " + "; - if (!string.IsNullOrEmpty(_fileName)) - { - text = _fileName; - } - - if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) - { - text += separator; - if (string.IsNullOrEmpty(_fileName)) - { - text = text + _language.New + " + "; - } - - if (!string.IsNullOrEmpty(_subtitleAlternateFileName)) - { - text += _subtitleAlternateFileName; - } - else - { - text += _language.New; - } - } - - Text = text + " - " + Title; - } - - private void SubtitleListview1KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.C && e.Modifiers == Keys.Control) //Ctrl+c = Copy to clipboard - { - var tmp = new Subtitle(); - foreach (int i in SubtitleListview1.SelectedIndices) - { - var p = _subtitle.GetParagraphOrDefault(i); - if (p != null) - { - tmp.Paragraphs.Add(new Paragraph(p)); - } - } - - if (tmp.Paragraphs.Count > 0) - { - if (Configuration.Settings.General.CurrentVideoOffsetInMs != 0) - { - tmp.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(Configuration.Settings.General.CurrentVideoOffsetInMs)); - } - - Clipboard.SetText(tmp.ToText(new SubRip()).TrimEnd()); - } - - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainListViewCopyText) - { - var sb = new StringBuilder(); - foreach (int i in SubtitleListview1.SelectedIndices) - { - var p = _subtitle.GetParagraphOrDefault(i); - if (p != null) - { - sb.AppendLine(p.Text + Environment.NewLine); - } - } - - if (sb.ToString().TrimEnd().Length > 0) - { - Clipboard.SetText(sb.ToString().TrimEnd()); - } - - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainListViewAutoDuration) - { - MakeAutoDurationSelectedLines(); - } - else if (e.KeyData == _shortcuts.MainListViewAlignmentN1) - { - SetAlignment("{\\an1}", true); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainListViewAlignmentN2) - { - SetAlignment("", true); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainListViewAlignmentN3) - { - SetAlignment("{\\an3}", true); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainListViewAlignmentN4) - { - SetAlignment("{\\an4}", true); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainListViewAlignmentN5) - { - SetAlignment("{\\an5}", true); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainListViewAlignmentN6) - { - SetAlignment("{\\an6}", true); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainListViewAlignmentN7) - { - SetAlignment("{\\an7}", true); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainListViewAlignmentN8) - { - SetAlignment("{\\an8}", true); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainListViewAlignmentN9) - { - SetAlignment("{\\an9}", true); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainListViewFocusWaveform) - { - if (audioVisualizer.CanFocus) - { - audioVisualizer.Focus(); - e.SuppressKeyPress = true; - } - } - else if (e.KeyData == _shortcuts.MainListViewGoToNextError) - { - GoToNextSyntaxError(); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainListViewRemoveTimeCodes) - { - RemoveTimeCodesFromSelectedLines(); - e.SuppressKeyPress = true; - } - else if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control) //Ctrl+V = Paste from clipboard - { - if (Clipboard.ContainsText()) - { - var text = Clipboard.GetText(); - var tmp = new Subtitle(); - var format = new SubRip(); - var list = new List(text.SplitToLines()); - format.LoadSubtitle(tmp, list, null); - if (SubtitleListview1.SelectedItems.Count == 1 && tmp.Paragraphs.Count > 0) - { - MakeHistoryForUndo(_language.BeforeInsertLine); - int firstIndex = FirstSelectedIndex; - var lastParagraph = _subtitle.Paragraphs[firstIndex]; - double addMs = 0; - if (lastParagraph.EndTime.TotalMilliseconds > tmp.Paragraphs[0].StartTime.TotalMilliseconds) - { // add time to pasted subtitles to prevent overlap, but only if necessary - addMs = lastParagraph.EndTime.TotalMilliseconds - tmp.Paragraphs[0].StartTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines; - } - else if (firstIndex <= _subtitle.Paragraphs.Count - 2 && _subtitle.Paragraphs[firstIndex + 1].StartTime.TotalMilliseconds < tmp.Paragraphs[0].StartTime.TotalMilliseconds) - { // inserting between two subtitle... with overlapping codes - addMs = lastParagraph.EndTime.TotalMilliseconds - tmp.Paragraphs[0].StartTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines; - } - - var selectIndices = new List(); - for (int i = 0; i < tmp.Paragraphs.Count; i++) - { - var p = tmp.Paragraphs[i]; - p.StartTime.TotalMilliseconds += addMs; - p.EndTime.TotalMilliseconds += addMs; - _subtitle.Paragraphs.Insert(firstIndex + i + 1, p); - selectIndices.Insert(0, firstIndex + i + 1); - if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle && SubtitleListview1.IsAlternateTextColumnVisible) - { - var original = Utilities.GetOriginalParagraph(firstIndex + i + 1, p, _subtitleAlternate.Paragraphs); - if (original == null) - { - _subtitleAlternate.InsertParagraphInCorrectTimeOrder(new Paragraph(string.Empty, p.StartTime.TotalMilliseconds, p.EndTime.TotalMilliseconds)); - } - } - } - - _subtitle.Renumber(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - SubtitleListview1.BeginUpdate(); - foreach (var selectIndex in selectIndices) - { - SubtitleListview1.Items[selectIndex].Selected = true; - } - - SubtitleListview1.EndUpdate(); - SubtitleListview1.SelectIndexAndEnsureVisible(firstIndex + 1, true); - } - else if (SubtitleListview1.Items.Count == 0 && tmp.Paragraphs.Count > 0) - { // insert into empty subtitle - MakeHistoryForUndo(_language.BeforeInsertLine); - foreach (var p in tmp.Paragraphs) - { - _subtitle.Paragraphs.Add(p); - if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle && SubtitleListview1.IsAlternateTextColumnVisible) - { - var original = Utilities.GetOriginalParagraph(_subtitle.Paragraphs.Count - 1, p, _subtitleAlternate.Paragraphs); - if (original == null) - { - _subtitleAlternate.InsertParagraphInCorrectTimeOrder(new Paragraph(string.Empty, p.StartTime.TotalMilliseconds, p.EndTime.TotalMilliseconds)); - } - } - } - - _subtitle.Renumber(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - } - else if (SubtitleListview1.Items.Count > 1 && tmp.Paragraphs.Count > 0) - { - // multiple lines selected - first delete, then insert - int firstIndex = FirstSelectedIndex; - if (firstIndex >= 0) - { - var idx = firstIndex; - MakeHistoryForUndo(_language.BeforeInsertLine); - _makeHistoryPaused = true; - - DeleteSelectedLines(); - _subtitleListViewIndex = -1; - var selectedIndices = new List(); - foreach (var p in tmp.Paragraphs) - { - _subtitle.Paragraphs.Insert(idx, p); - selectedIndices.Add(idx); - if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle && SubtitleListview1.IsAlternateTextColumnVisible) - { - var original = Utilities.GetOriginalParagraph(idx, p, _subtitleAlternate.Paragraphs); - if (original == null) - { - _subtitleAlternate.InsertParagraphInCorrectTimeOrder(new Paragraph(string.Empty, p.StartTime.TotalMilliseconds, p.EndTime.TotalMilliseconds)); - } - } - - idx++; - } - - _subtitle.Renumber(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - SubtitleListview1.SelectIndexAndEnsureVisible(firstIndex, true); - foreach (var selectedIndex in selectedIndices) - { - SubtitleListview1.Items[selectedIndex].Selected = true; - } - RestartHistory(); - } - } - else if (SubtitleListview1.Items.Count > 0 && list.Count >= 1 && list.Count < 4 && !text.Trim().Contains(Environment.NewLine + Environment.NewLine)) - { - // less than 4 lines of text, just insert into first selected - textBoxListViewText.Text = text.Trim(); - } - else if (list.Count >= 1 && list.Count < 2000) - { - MakeHistoryForUndo(_language.BeforeInsertLine); - _makeHistoryPaused = true; - SubtitleListview1.BeginUpdate(); - foreach (var line in list) - { - if (!string.IsNullOrWhiteSpace(line)) - { - var s = line.Trim().Length > Configuration.Settings.General.SubtitleLineMaximumLength ? Utilities.AutoBreakLine(line) : line.Trim(); - InsertAfter(s); - } - } - SubtitleListview1.EndUpdate(); - RestartHistory(); - } - - if (_subtitleListViewIndex >= 0) - { - UpdateListViewTextInfo(labelTextLineLengths, labelSingleLine, labelSingleLinePixels, labelTextLineTotal, labelCharactersPerSecond, _subtitle.Paragraphs[_subtitleListViewIndex], textBoxListViewText); - } - else - { - SubtitleListview1.SelectIndexAndEnsureVisible(0); - } - } - else if (Clipboard.ContainsFileDropList()) - { - var fileDropList = Clipboard.GetFileDropList(); - if (fileDropList.Count == 1) - { - ShowStatus(Configuration.Settings.Language.General.PleaseWait, false); - OpenSubtitle(fileDropList[0], null); - } - } - - e.SuppressKeyPress = true; - } - else if (e.KeyCode == Keys.X && e.Modifiers == Keys.Control) //Ctrl+X = Cut to clipboard - { - var tmp = new Subtitle(); - foreach (int i in SubtitleListview1.SelectedIndices) - { - var p = _subtitle.GetParagraphOrDefault(i); - if (p != null) - { - tmp.Paragraphs.Add(new Paragraph(p)); - } - } - - e.SuppressKeyPress = true; - _cutText = tmp.ToText(new SubRip()); - ToolStripMenuItemDeleteClick(null, null); - } - else if (e.KeyCode == Keys.A && e.Modifiers == Keys.Control) - { - SubtitleListview1.SelectAll(); - e.SuppressKeyPress = true; - } - else if (e.KeyCode == Keys.D && e.Modifiers == Keys.Control) - { - SubtitleListview1.SelectFirstSelectedItemOnly(); - e.SuppressKeyPress = true; - } - else if (e.KeyCode == Keys.Delete && SubtitleListview1.SelectedItems.Count > 0) //Delete - { - ToolStripMenuItemDeleteClick(null, null); - } - else if (e.KeyData == _shortcuts.MainInsertBefore) - { - InsertBefore(); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainInsertAfter) - { - InsertAfter(string.Empty); - e.SuppressKeyPress = true; - } - else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.Home) - { - SubtitleListview1.FirstVisibleIndex = -1; - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - e.SuppressKeyPress = true; - } - else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.End) - { - SubtitleListview1.SelectIndexAndEnsureVisible(SubtitleListview1.Items.Count - 1, true); - e.SuppressKeyPress = true; - } - else if (e.Modifiers == Keys.None && e.KeyCode == Keys.Enter) - { - SubtitleListview1_MouseDoubleClick(null, null); - } - } - - private void RemoveTimeCodesFromSelectedLines() - { - MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.RemoveTimeCodes)); - - var indices = new List(); - foreach (ListViewItem item in SubtitleListview1.SelectedItems) - { - indices.Add(item.Index); - } - foreach (int i in indices) - { - if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle && SubtitleListview1.IsAlternateTextColumnVisible) - { - var original = Utilities.GetOriginalParagraph(i, _subtitle.Paragraphs[i], _subtitleAlternate.Paragraphs); - if (original != null) - { - original.StartTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; - original.EndTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; - } - } - _subtitle.Paragraphs[i].StartTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; - _subtitle.Paragraphs[i].EndTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; - } - - SaveSubtitleListviewIndices(); - _subtitleListViewIndex = -1; - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - ShowSource(); - RestoreSubtitleListviewIndices(); - } - - private void SetAlignment(string tag, bool selectedLines) - { - if (selectedLines) - { - SubtitleListview1.SelectedIndexChanged -= SubtitleListview1_SelectedIndexChanged; - MakeHistoryForUndo(string.Format(_language.BeforeAddingTagX, tag)); - - var indices = new List(); - foreach (ListViewItem item in SubtitleListview1.SelectedItems) - { - indices.Add(item.Index); - } - - bool first = true; - SubtitleListview1.BeginUpdate(); - foreach (int i in indices) - { - if (first) - { - if (_subtitle.Paragraphs[i].Text.StartsWith(tag, StringComparison.Ordinal)) - { - tag = string.Empty; - } - - if (_subtitle.Paragraphs[i].Text.StartsWith(tag.Replace("}", "\\"), StringComparison.Ordinal)) - { - tag = string.Empty; - } - - first = false; - } - - if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle && SubtitleListview1.IsAlternateTextColumnVisible) - { - var original = Utilities.GetOriginalParagraph(i, _subtitle.Paragraphs[i], _subtitleAlternate.Paragraphs); - if (original != null) - { - original.Text = SetAlignTag(original.Text, tag); - SubtitleListview1.SetAlternateText(i, original.Text); - } - } - - _subtitle.Paragraphs[i].Text = SetAlignTag(_subtitle.Paragraphs[i].Text, tag); - SubtitleListview1.SetText(i, _subtitle.Paragraphs[i].Text); - } - - SubtitleListview1.EndUpdate(); - - ShowStatus(string.Format(_language.TagXAdded, tag)); - ShowSource(); - RefreshSelectedParagraph(); - SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; - } - else - { - var tb = GetFocusedTextBox(); - var pos = tb.SelectionStart; - int oldLength = tb.Text.Length; - bool atEnd = pos == oldLength; - tb.Text = SetAlignTag(tb.Text, tag); - if (atEnd) - { - tb.SelectionStart = tb.Text.Length; - } - else if (pos == 0) - { - tb.SelectionStart = 0; - } - else if (oldLength == tb.Text.Length) - { - tb.SelectionStart = pos; - } - else if (pos + 5 <= tb.Text.Length) - { - tb.SelectionStart = pos + 5; - } - } - } - - private void GoToNextSyntaxError() - { - int idx = FirstSelectedIndex + 1; - try - { - for (int i = idx; i < _subtitle.Paragraphs.Count; i++) - { - var item = SubtitleListview1.Items[i]; - if (item.SubItems[SubtitleListview1.ColumnIndexDuration].BackColor == Configuration.Settings.Tools.ListViewSyntaxErrorColor || - item.SubItems[SubtitleListview1.ColumnIndexText].BackColor == Configuration.Settings.Tools.ListViewSyntaxErrorColor || - item.SubItems[SubtitleListview1.ColumnIndexStart].BackColor == Configuration.Settings.Tools.ListViewSyntaxErrorColor || - (SubtitleListview1.ColumnIndexCps >= 0 && item.SubItems[SubtitleListview1.ColumnIndexCps].BackColor == Configuration.Settings.Tools.ListViewSyntaxErrorColor) || - (SubtitleListview1.ColumnIndexWpm >= 0 && item.SubItems[SubtitleListview1.ColumnIndexWpm].BackColor == Configuration.Settings.Tools.ListViewSyntaxErrorColor) || - (SubtitleListview1.ColumnIndexGap >= 0 && item.SubItems[SubtitleListview1.ColumnIndexGap].BackColor == Configuration.Settings.Tools.ListViewSyntaxErrorColor)) - { - SubtitleListview1.SelectIndexAndEnsureVisible(i, true); - if (mediaPlayer.VideoPlayer != null) - { - mediaPlayer.VideoPlayer.CurrentPosition = _subtitle.Paragraphs[i].StartTime.TotalSeconds; - } - - return; - } - } - } - catch - { - } - } - - private void RestartHistory() - { - _listViewTextUndoLast = null; - _listViewTextUndoIndex = -1; - _listViewTextTicks = -1; - _listViewAlternateTextUndoLast = null; - _listViewAlternateTextTicks = -1; - _undoIndex = _subtitle.HistoryItems.Count - 1; - _makeHistoryPaused = false; - } - - private void AdjustDisplayTimeForSelectedLinesToolStripMenuItemClick(object sender, EventArgs e) - { - AdjustDisplayTime(true); - } - - private void FixCommonErrorsInSelectedLinesToolStripMenuItemClick(object sender, EventArgs e) - { - FixCommonErrors(true); - } - - private void FindDoubleWordsToolStripMenuItemClick(object sender, EventArgs e) - { - if (!IsSubtitleLoaded) - { - DisplaySubtitleNotLoadedMessage(); - return; - } - - var regex = new Regex(@"\b(\w+)\s+\1\b"); - _clearLastFind = true; - if (_findHelper != null) - { - _clearLastFindType = _findHelper.FindReplaceType.FindType; - _clearLastFindText = _findHelper.FindText; - } - - _findHelper = new FindReplaceDialogHelper(new ReplaceType { FindType = FindType.RegEx }, string.Format(_language.DoubleWordsViaRegEx, regex), regex, string.Empty, _subtitleListViewIndex); - - ReloadFromSourceView(); - FindNext(); - } - - private void ChangeCasingForSelectedLinesToolStripMenuItemClick(object sender, EventArgs e) - { - ChangeCasing(true); - } - - private void CenterFormOnCurrentScreen() - { - var screen = Screen.FromControl(this); - Left = screen.Bounds.X + ((screen.Bounds.Width - Width) / 2); - Top = screen.Bounds.Y + ((screen.Bounds.Height - Height) / 2); - } - - private void SortSubtitle(SubtitleSortCriteria subtitleSortCriteria, string description) - { - var firstSelectedIndex = 0; - if (SubtitleListview1.SelectedItems.Count > 0) - { - firstSelectedIndex = SubtitleListview1.SelectedItems[0].Index; - } - - _subtitleListViewIndex = -1; - MakeHistoryForUndo(string.Format(_language.BeforeSortX, description)); - _subtitle.Sort(subtitleSortCriteria); - if (descendingToolStripMenuItem.Checked) - { - _subtitle.Paragraphs.Reverse(); - } - - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - SubtitleListview1.SelectIndexAndEnsureVisible(firstSelectedIndex, true); - ShowStatus(string.Format(_language.SortedByX, description)); - } - - private void SortNumberToolStripMenuItemClick(object sender, EventArgs e) - { - SortSubtitle(SubtitleSortCriteria.Number, (sender as ToolStripItem).Text); - } - - private void SortStartTimeToolStripMenuItemClick(object sender, EventArgs e) - { - SortSubtitle(SubtitleSortCriteria.StartTime, (sender as ToolStripItem).Text); - } - - private void SortEndTimeToolStripMenuItemClick(object sender, EventArgs e) - { - SortSubtitle(SubtitleSortCriteria.EndTime, (sender as ToolStripItem).Text); - } - - private void SortDisplayTimeToolStripMenuItemClick(object sender, EventArgs e) - { - SortSubtitle(SubtitleSortCriteria.Duration, (sender as ToolStripItem).Text); - } - - private void SortTextMaxLineLengthToolStripMenuItemClick(object sender, EventArgs e) - { - SortSubtitle(SubtitleSortCriteria.TextMaxLineLength, (sender as ToolStripItem).Text); - } - - private void SortTextTotalLengthToolStripMenuItemClick(object sender, EventArgs e) - { - SortSubtitle(SubtitleSortCriteria.TextTotalLength, (sender as ToolStripItem).Text); - } - - private void SortTextNumberOfLinesToolStripMenuItemClick(object sender, EventArgs e) - { - SortSubtitle(SubtitleSortCriteria.TextNumberOfLines, (sender as ToolStripItem).Text); - } - - private void SortTextAlphabeticallytoolStripMenuItemClick(object sender, EventArgs e) - { - SortSubtitle(SubtitleSortCriteria.Text, (sender as ToolStripItem).Text); - } - - private void textCharssecToolStripMenuItem_Click(object sender, EventArgs e) - { - SortSubtitle(SubtitleSortCriteria.TextCharactersPerSeconds, (sender as ToolStripItem).Text); - } - - private void ChangeLanguageToolStripMenuItemClick(object sender, EventArgs e) - { - using (var cl = new ChooseLanguage()) - { - if (cl.ShowDialog(this) == DialogResult.OK) - { - SetLanguage(cl.CultureName); - Configuration.Settings.Save(); - } - } - } - - private void SetLanguage(string cultureName) - { - if (string.IsNullOrEmpty(cultureName)) - { - cultureName = "en-US"; - } - - if (cultureName != "en-US") - { - try - { - Configuration.Settings.Language = Language.Load(Path.Combine(Configuration.BaseDirectory, "Languages", cultureName + ".xml")); - } - catch (Exception ex) - { - var cap = "Language file load error"; - var msg = "Could not load language file " + cultureName + ".xml" + - "\n\nError Message:\n" + ex.Message + - "\n\nStack Trace:\n" + ex.StackTrace; - MessageBox.Show(this, msg, cap); - cultureName = "en-US"; - } - } - - if (cultureName == "en-US") - { - Configuration.Settings.Language = new Language(); // default is en-US - } - - Configuration.Settings.General.Language = cultureName; - _languageGeneral = Configuration.Settings.Language.General; - _language = Configuration.Settings.Language.Main; - InitializeLanguage(); - } - - private void ToolStripMenuItemCompareClick(object sender, EventArgs e) - { - var compareForm = new Compare(); - if (_subtitleAlternate != null && _subtitleAlternateFileName != null && SubtitleListview1.IsAlternateTextColumnVisible) - { - compareForm.Initialize(_subtitle, _fileName, _subtitleAlternate, _subtitleAlternateFileName); - } - else - { - compareForm.Initialize(_subtitle, _fileName, _languageGeneral.CurrentSubtitle); - } - - compareForm.Show(this); - compareForm.Activate(); - } - - private void ToolStripMenuItemAutoBreakLinesClick(object sender, EventArgs e) - { - if (!IsSubtitleLoaded) - { - DisplaySubtitleNotLoadedMessage(); - return; - } - - ReloadFromSourceView(); - using (var autoBreakUnbreakLines = new AutoBreakUnbreakLines()) - { - var selectedLines = new Subtitle(); - foreach (int index in SubtitleListview1.SelectedIndices) - { - selectedLines.Paragraphs.Add(_subtitle.Paragraphs[index]); - } - - autoBreakUnbreakLines.Initialize(selectedLines, true); - - if (autoBreakUnbreakLines.ShowDialog() == DialogResult.OK && autoBreakUnbreakLines.FixedText.Count > 0) - { - MakeHistoryForUndo(_language.BeforeAutoBalanceSelectedLines); - SubtitleListview1.BeginUpdate(); - foreach (int index in SubtitleListview1.SelectedIndices) - { - var p = _subtitle.GetParagraphOrDefault(index); - if (autoBreakUnbreakLines.FixedText.ContainsKey(p.Id)) - { - p.Text = autoBreakUnbreakLines.FixedText[p.Id]; - SubtitleListview1.SetText(index, p.Text); - SubtitleListview1.SyntaxColorLine(_subtitle.Paragraphs, index, p); - } - } - - SubtitleListview1.EndUpdate(); - RefreshSelectedParagraph(); - ShowStatus(string.Format(_language.NumberOfLinesAutoBalancedX, autoBreakUnbreakLines.FixedText.Count)); - } - } - } - - private void ToolStripMenuItemUnbreakLinesClick(object sender, EventArgs e) - { - if (!IsSubtitleLoaded) - { - DisplaySubtitleNotLoadedMessage(); - return; - } - - ReloadFromSourceView(); - using (var autoBreakUnbreakLines = new AutoBreakUnbreakLines()) - { - var selectedLines = new Subtitle(); - foreach (int index in SubtitleListview1.SelectedIndices) - { - selectedLines.Paragraphs.Add(_subtitle.Paragraphs[index]); - } - - autoBreakUnbreakLines.Initialize(selectedLines, false); - - if (autoBreakUnbreakLines.ShowDialog() == DialogResult.OK && autoBreakUnbreakLines.FixedText.Count > 0) - { - MakeHistoryForUndo(_language.BeforeRemoveLineBreaksInSelectedLines); - - SubtitleListview1.BeginUpdate(); - foreach (int index in SubtitleListview1.SelectedIndices) - { - var p = _subtitle.GetParagraphOrDefault(index); - if (autoBreakUnbreakLines.FixedText.ContainsKey(p.Id)) - { - p.Text = autoBreakUnbreakLines.FixedText[p.Id]; - SubtitleListview1.SetText(index, p.Text); - SubtitleListview1.SyntaxColorLine(_subtitle.Paragraphs, index, p); - } - } - - SubtitleListview1.EndUpdate(); - RefreshSelectedParagraph(); - ShowStatus(string.Format(_language.NumberOfWithRemovedLineBreakX, autoBreakUnbreakLines.FixedText.Count)); - } - } - } - - private void MultipleReplaceToolStripMenuItemClick(object sender, EventArgs e) - { - using (var multipleReplace = new MultipleReplace()) - { - multipleReplace.Initialize(_subtitle); - if (multipleReplace.ShowDialog(this) == DialogResult.OK) - { - MakeHistoryForUndo(_language.BeforeMultipleReplace); - SaveSubtitleListviewIndices(); - - for (int i = 0; i < _subtitle.Paragraphs.Count; i++) - { - _subtitle.Paragraphs[i].Text = multipleReplace.FixedSubtitle.Paragraphs[i].Text; - } - - _subtitle.RemoveParagraphsByIndices(multipleReplace.DeleteIndices); - _subtitle.Renumber(); - - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - RefreshSelectedParagraph(); - ShowSource(); - ShowStatus(string.Format(_language.NumberOfLinesReplacedX, multipleReplace.FixCount)); - } - } - } - - private void ToolStripMenuItemImportDvdSubtitlesClick(object sender, EventArgs e) - { - if (!ContinueNewOrExit()) - { - return; - } - - ImportDvdSubtitle(null); - } - - private void ImportDvdSubtitle(string fileName) - { - using (var formSubRip = new DvdSubRip(Handle, fileName)) - { - if (formSubRip.ShowDialog(this) == DialogResult.OK) - { - using (var showSubtitles = new DvdSubRipChooseLanguage()) - { - showSubtitles.Initialize(formSubRip.MergedVobSubPacks, formSubRip.Palette, formSubRip.Languages, formSubRip.SelectedLanguage); - if (formSubRip.Languages.Count == 1 || showSubtitles.ShowDialog(this) == DialogResult.OK) - { - using (var formSubOcr = new VobSubOcr()) - { - var subs = formSubRip.MergedVobSubPacks; - if (showSubtitles.SelectedVobSubMergedPacks != null) - { - subs = showSubtitles.SelectedVobSubMergedPacks; - } - - formSubOcr.Initialize(subs, formSubRip.Palette, Configuration.Settings.VobSubOcr, formSubRip.SelectedLanguage); - if (formSubOcr.ShowDialog(this) == DialogResult.OK) - { - MakeHistoryForUndo(_language.BeforeImportingDvdSubtitle); - FileNew(); - _subtitle.Paragraphs.Clear(); - SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); - foreach (var p in formSubOcr.SubtitleFromOcr.Paragraphs) - { - _subtitle.Paragraphs.Add(p); - } - - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - _subtitleListViewIndex = -1; - SubtitleListview1.FirstVisibleIndex = -1; - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - - _fileName = string.Empty; - SetTitle(); - - Configuration.Settings.Save(); - } - } - } - } - } - } - } - - private void ToolStripMenuItemSubIdxClick1(object sender, EventArgs e) - { - if (ContinueNewOrExit()) - { - openFileDialog1.Title = _language.OpenVobSubFile; - openFileDialog1.FileName = string.Empty; - openFileDialog1.Filter = _language.VobSubFiles + "|*.sub"; - if (openFileDialog1.ShowDialog(this) == DialogResult.OK) - { - ImportAndOcrVobSubSubtitleNew(openFileDialog1.FileName, false); - openFileDialog1.InitialDirectory = Path.GetDirectoryName(openFileDialog1.FileName); - } - } - } - - private void SubtitleListview1_MouseDoubleClick(object sender, MouseEventArgs e) - { - if (Configuration.Settings.General.ListViewDoubleClickAction == 1) - { - GotoSubPositionAndPause(); - } - else if (Configuration.Settings.General.ListViewDoubleClickAction == 2) - { - if (AutoRepeatContinueOn || AutoRepeatOn) - { - PlayCurrent(); - } - else - { - buttonBeforeText_Click(null, null); - } - } - else if (Configuration.Settings.General.ListViewDoubleClickAction == 3) - { - GotoSubPositionAndPause(-0.5); - } - else if (Configuration.Settings.General.ListViewDoubleClickAction == 4) - { - GotoSubPositionAndPause(-1.0); - } - else if (Configuration.Settings.General.ListViewDoubleClickAction == 5) - { - if (AutoRepeatContinueOn || AutoRepeatOn) - { - PlayCurrent(); - } - else - { - if (SubtitleListview1.SelectedItems.Count > 0) - { - int index = SubtitleListview1.SelectedItems[0].Index; - - mediaPlayer.Pause(); - double pos = _subtitle.Paragraphs[index].StartTime.TotalSeconds; - if (pos > 1) - { - mediaPlayer.CurrentPosition = (_subtitle.Paragraphs[index].StartTime.TotalSeconds) - 1.0; - } - else - { - mediaPlayer.CurrentPosition = _subtitle.Paragraphs[index].StartTime.TotalSeconds; - } - - mediaPlayer.Play(); - } - } - } - else if (Configuration.Settings.General.ListViewDoubleClickAction == 6) - { - GotoSubPositionAndPause(); - textBoxListViewText.Focus(); - } - else if (Configuration.Settings.General.ListViewDoubleClickAction == 7) - { - textBoxListViewText.Focus(); - } - } - - private void AddWordToNameListToolStripMenuItemClick(object sender, EventArgs e) - { - using (var addToNamesList = new AddToNameList()) - { - addToNamesList.Initialize(_subtitle, textBoxListViewText.SelectedText); - if (addToNamesList.ShowDialog(this) == DialogResult.OK) - { - ShowStatus(string.Format(_language.NameXAddedToNameList, addToNamesList.NewName)); - } - else if (!string.IsNullOrEmpty(addToNamesList.NewName)) - { - ShowStatus(string.Format(_language.NameXNotAddedToNameList, addToNamesList.NewName)); - } - } - } - - private bool IsUnicode - { - get - { - var enc = GetCurrentEncoding(); - return enc == Encoding.UTF8 || enc == Encoding.Unicode || enc == Encoding.UTF7 || enc == Encoding.UTF32 || enc == Encoding.BigEndianUnicode; - } - } - - private void EditToolStripMenuItemDropDownOpening(object sender, EventArgs e) - { - toolStripMenuItemRemoveUnicodeControlChars.Visible = IsUnicode; - toolStripMenuItemRtlUnicodeControlChars.Visible = IsUnicode; - if (!IsUnicode || _subtitleListViewIndex == -1) - { - toolStripMenuItemInsertUnicodeCharacter.Visible = false; - toolStripSeparatorInsertUnicodeCharacter.Visible = false; - } - else - { - if (toolStripMenuItemInsertUnicodeCharacter.DropDownItems.Count == 0) - { - foreach (var s in Configuration.Settings.Tools.UnicodeSymbolsToInsert.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries)) - { - toolStripMenuItemInsertUnicodeCharacter.DropDownItems.Add(s, null, InsertUnicodeGlyphAllowMultiLine); - if (Environment.OSVersion.Version.Major < 6 && Configuration.Settings.General.SubtitleFontName == Utilities.WinXP2KUnicodeFontName) // 6 == Vista/Win2008Server/Win7 - { - toolStripMenuItemInsertUnicodeCharacter.DropDownItems[toolStripMenuItemInsertUnicodeCharacter.DropDownItems.Count - 1].Font = new Font(Utilities.WinXP2KUnicodeFontName, toolStripMenuItemInsertUnicodeSymbol.Font.Size); - } - } - } - - toolStripMenuItemInsertUnicodeCharacter.Visible = toolStripMenuItemInsertUnicodeCharacter.DropDownItems.Count > 0; - toolStripSeparatorInsertUnicodeCharacter.Visible = toolStripMenuItemInsertUnicodeCharacter.DropDownItems.Count > 0; - } - - lock (_syncUndo) - { - toolStripMenuItemUndo.Enabled = _subtitle != null && _subtitle.CanUndo && _undoIndex >= 0; - toolStripMenuItemRedo.Enabled = _subtitle != null && _subtitle.CanUndo && _undoIndex < _subtitle.HistoryItems.Count - 1; - } - - showHistoryforUndoToolStripMenuItem.Enabled = _subtitle != null && _subtitle.CanUndo; - toolStripMenuItemShowOriginalInPreview.Visible = SubtitleListview1.IsAlternateTextColumnVisible; - - if (_networkSession != null) - { - toolStripMenuItemUndo.Enabled = false; - toolStripMenuItemRedo.Enabled = false; - showHistoryforUndoToolStripMenuItem.Enabled = false; - } - } - - private void InsertUnicodeGlyph(object sender, EventArgs e) - { - if (sender is ToolStripItem item) - { - PasteIntoActiveTextBox(item.Text); - } - } - - private void InsertUnicodeGlyphAllowMultiLine(object sender, EventArgs e) - { - if (sender is ToolStripItem item) - { - PasteIntoActiveTextBox(item.Text, true); - } - } - - private void ToolStripMenuItemAutoMergeShortLinesClick(object sender, EventArgs e) - { - if (!IsSubtitleLoaded) - { - DisplaySubtitleNotLoadedMessage(); - return; - } - - ReloadFromSourceView(); - using (var formMergeShortLines = new MergeShortLines()) - { - formMergeShortLines.Initialize(_subtitle); - if (formMergeShortLines.ShowDialog(this) == DialogResult.OK) - { - MakeHistoryForUndo(_language.BeforeMergeShortLines); - _subtitle.Paragraphs.Clear(); - foreach (var p in formMergeShortLines.MergedSubtitle.Paragraphs) - { - _subtitle.Paragraphs.Add(p); - } - - _subtitle.Renumber(); - - ShowStatus(string.Format(_language.MergedShortLinesX, formMergeShortLines.NumberOfMerges)); - SaveSubtitleListviewIndices(); - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - } - } - } - - private void toolStripMenuItemAutoSplitLongLines_Click(object sender, EventArgs e) - { - if (!IsSubtitleLoaded) - { - DisplaySubtitleNotLoadedMessage(); - return; - } - - ReloadFromSourceView(); - using (var splitLongLines = new SplitLongLines()) - { - splitLongLines.Initialize(_subtitle); - if (splitLongLines.ShowDialog(this) == DialogResult.OK) - { - MakeHistoryForUndo(_language.BeforeSplitLongLines); - _subtitle.Paragraphs.Clear(); - foreach (var p in splitLongLines.SplitSubtitle.Paragraphs) - { - _subtitle.Paragraphs.Add(p); - } - - ShowStatus(string.Format(_language.LongLinesSplitX, splitLongLines.NumberOfSplits)); - SaveSubtitleListviewIndices(); - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - } - } - } - - private void SetMinimalDisplayTimeDifferenceToolStripMenuItemClick(object sender, EventArgs e) - { - if (!IsSubtitleLoaded) - { - DisplaySubtitleNotLoadedMessage(); - return; - } - - using (var setMinDisplayDiff = new SetMinimumDisplayTimeBetweenParagraphs()) - { - setMinDisplayDiff.Initialize(_subtitle); - if (setMinDisplayDiff.ShowDialog() == DialogResult.OK && setMinDisplayDiff.FixCount > 0) - { - MakeHistoryForUndo(_language.BeforeSetMinimumDisplayTimeBetweenParagraphs); - _subtitle.Paragraphs.Clear(); - foreach (var p in setMinDisplayDiff.FixedSubtitle.Paragraphs) - { - _subtitle.Paragraphs.Add(p); - } - - ShowStatus(string.Format(_language.XMinimumDisplayTimeBetweenParagraphsChanged, setMinDisplayDiff.FixCount)); - SaveSubtitleListviewIndices(); - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - } - } - } - - private void ToolStripMenuItemImportTextClick(object sender, EventArgs e) - { - ImportPlainText(null); - } - - private void ImportPlainText(string fileName) - { - using (var importText = new ImportText(fileName, this)) - { - if (importText.ShowDialog(this) == DialogResult.OK) - { - if (ContinueNewOrExit()) - { - MakeHistoryForUndo(_language.BeforeImportText); - - ResetSubtitle(); - if (!string.IsNullOrEmpty(importText.VideoFileName)) - { - if (!Configuration.Settings.General.DisableVideoAutoLoading) - { - OpenVideo(importText.VideoFileName); - } - - _fileName = importText.VideoFileName; - _converted = true; - SetTitle(); - } - - _subtitleListViewIndex = -1; - if (importText.Format != null) - { - SetCurrentFormat(importText.Format); - } - - _subtitle = new Subtitle(importText.FixedSubtitle.Paragraphs, _subtitle.HistoryItems); - ShowStatus(_language.TextImported); - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - } - } - } - } - - private void toolStripMenuItemPointSync_Click(object sender, EventArgs e) - { - if (!IsSubtitleLoaded) - { - DisplaySubtitleNotLoadedMessage(); - return; - } - - using (var pointSync = new SyncPointsSync()) - { - pointSync.Initialize(_subtitle, _fileName, VideoFileName, VideoAudioTrackNumber); - mediaPlayer.Pause(); - if (pointSync.ShowDialog(this) == DialogResult.OK) - { - _subtitleListViewIndex = -1; - MakeHistoryForUndo(_language.BeforePointSynchronization); - _subtitle.Paragraphs.Clear(); - foreach (var p in pointSync.FixedSubtitle.Paragraphs) - { - _subtitle.Paragraphs.Add(p); - } - ShowStatus(_language.PointSynchronizationDone); - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - } - - Activate(); - VideoFileName = pointSync.VideoFileName; - } - } - - private void pointSyncViaOtherSubtitleToolStripMenuItem_Click(object sender, EventArgs e) - { - if (!IsSubtitleLoaded) - { - DisplaySubtitleNotLoadedMessage(); - return; - } - - using (var pointSync = new SyncPointsSync()) - { - openFileDialog1.Title = _language.OpenOtherSubtitle; - openFileDialog1.FileName = string.Empty; - openFileDialog1.Filter = UiUtil.SubtitleExtensionFilter.Value; - if (openFileDialog1.ShowDialog() == DialogResult.OK && File.Exists(openFileDialog1.FileName)) - { - var file = new FileInfo(openFileDialog1.FileName); - var fileName = file.FullName; - var extension = file.Extension.ToLowerInvariant(); - - // TODO: Check for mkv etc - if (extension == ".sub") - { - if (IsVobSubFile(fileName, false)) - { - MessageBox.Show(_language.NoSupportHereVobSub); - return; - } - } - - if (extension == ".sup") - { - if (FileUtil.IsBluRaySup(fileName)) - { - MessageBox.Show(_language.NoSupportHereBluRaySup); - return; - } - else if (FileUtil.IsSpDvdSup(fileName)) - { - MessageBox.Show(_language.NoSupportHereDvdSup); - return; - } - } - - var sub = new Subtitle(); - if (extension == ".mkv" || extension == ".mks") - { - using (var matroska = new MatroskaFile(fileName)) - { - if (matroska.IsValid) - { - var subtitleList = matroska.GetTracks(true); - if (subtitleList.Count > 1) - { - using (var subtitleChooser = new MatroskaSubtitleChooser("mkv")) - { - subtitleChooser.Initialize(subtitleList); - if (_loading) - { - subtitleChooser.Icon = (Icon)Icon.Clone(); - subtitleChooser.ShowInTaskbar = true; - subtitleChooser.ShowIcon = true; - } - - if (subtitleChooser.ShowDialog(this) == DialogResult.OK) - { - sub = LoadMatroskaSubtitleForSync(subtitleList[subtitleChooser.SelectedIndex], matroska); - } - } - } - else if (subtitleList.Count > 0) - { - sub = LoadMatroskaSubtitleForSync(subtitleList[0], matroska); - } - else - { - MessageBox.Show(_language.NoSubtitlesFound); - return; - } - } - } - } - - if (extension == ".divx" || extension == ".avi") - { - MessageBox.Show(_language.NoSupportHereDivx); - return; - } - - if ((extension == ".mp4" || extension == ".m4v" || extension == ".3gp") && file.Length > 10000) - { - var mp4Parser = new MP4Parser(fileName); - var mp4SubtitleTracks = mp4Parser.GetSubtitleTracks(); - if (mp4SubtitleTracks.Count == 0) - { - MessageBox.Show(_language.NoSubtitlesFound); - return; - } - else if (mp4SubtitleTracks.Count == 1) - { - sub = LoadMp4SubtitleForSync(mp4SubtitleTracks[0]); - } - else - { - using (var subtitleChooser = new MatroskaSubtitleChooser("mp4")) - { - subtitleChooser.Initialize(mp4SubtitleTracks); - if (subtitleChooser.ShowDialog(this) == DialogResult.OK) - { - sub = LoadMp4SubtitleForSync(mp4SubtitleTracks[0]); - } - } - } - } - - if (file.Length > 1024 * 1024 * 10 && sub.Paragraphs.Count == 0) // max 10 mb - { - var text = string.Format(_language.FileXIsLargerThan10MB + Environment.NewLine + Environment.NewLine + _language.ContinueAnyway, fileName); - if (MessageBox.Show(this, text, Title, MessageBoxButtons.YesNoCancel) != DialogResult.Yes) - { - return; - } - } - - sub.Renumber(); - if (sub.Paragraphs.Count == 0) - { - var f = sub.LoadSubtitle(fileName, out var enc, null); - if (f == null) - { - ShowUnknownSubtitle(fileName); - return; - } - } - - pointSync.Initialize(_subtitle, _fileName, VideoFileName, VideoAudioTrackNumber, fileName, sub); - mediaPlayer.Pause(); - if (pointSync.ShowDialog(this) == DialogResult.OK) - { - _subtitleListViewIndex = -1; - MakeHistoryForUndo(_language.BeforePointSynchronization); - _subtitle.Paragraphs.Clear(); - foreach (var p in pointSync.FixedSubtitle.Paragraphs) - { - _subtitle.Paragraphs.Add(p); - } - ShowStatus(_language.PointSynchronizationDone); - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - } - - VideoFileName = pointSync.VideoFileName; - } - } - } - - private void toolStripMenuItemImportTimeCodes_Click(object sender, EventArgs e) - { - if (_subtitle.Paragraphs.Count < 1) - { - DisplaySubtitleNotLoadedMessage(); - return; - } - - openFileDialog1.Title = _languageGeneral.OpenSubtitle; - openFileDialog1.FileName = string.Empty; - openFileDialog1.Filter = UiUtil.SubtitleExtensionFilter.Value; - if (openFileDialog1.ShowDialog(this) == DialogResult.OK) - { - var timeCodeSubtitle = new Subtitle(); - SubtitleFormat format = null; - - if (format == null && - openFileDialog1.FileName.EndsWith(".sup", StringComparison.OrdinalIgnoreCase) && - FileUtil.IsBluRaySup(openFileDialog1.FileName)) - { - var log = new StringBuilder(); - var subtitles = BluRaySupParser.ParseBluRaySup(openFileDialog1.FileName, log); - if (subtitles.Count > 0) - { - foreach (var sup in subtitles) - { - timeCodeSubtitle.Paragraphs.Add(new Paragraph(sup.StartTimeCode, sup.EndTimeCode, string.Empty)); - } - - format = new SubRip(); // just to set format to something - } - } - - if (format == null) - { - format = timeCodeSubtitle.LoadSubtitle(openFileDialog1.FileName, out var encoding, null); - } - - if (format == null) - { - var formats = SubtitleFormat.GetBinaryFormats(true).Union(SubtitleFormat.GetTextOtherFormats()).Union(new SubtitleFormat[] - { - new TimeCodesOnly1(), - new TimeCodesOnly2() - }).ToArray(); - format = SubtitleFormat.LoadSubtitleFromFile(formats, openFileDialog1.FileName, timeCodeSubtitle); - } - - if (format == null) - { - ShowUnknownSubtitle(openFileDialog1.FileName); - return; - } - - if (timeCodeSubtitle.Paragraphs.Count != _subtitle.Paragraphs.Count) - { - var text = string.Format(_language.ImportTimeCodesDifferentNumberOfLinesWarning, timeCodeSubtitle.Paragraphs.Count, _subtitle.Paragraphs.Count); - if (MessageBox.Show(this, text, _title, MessageBoxButtons.YesNoCancel) != DialogResult.Yes) - { - return; - } - } - - MakeHistoryForUndo(_language.BeforeTimeCodeImport); - - int count = 0; - for (int i = 0; i < timeCodeSubtitle.Paragraphs.Count; i++) - { - var existing = _subtitle.GetParagraphOrDefault(i); - - var newTimeCode = timeCodeSubtitle.GetParagraphOrDefault(i); - if (existing == null || newTimeCode == null) - { - break; - } - - Paragraph original = null; - if (existing != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle && - _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0 && SubtitleListview1.IsAlternateTextColumnVisible) - { - original = Utilities.GetOriginalParagraph(i, existing, _subtitleAlternate.Paragraphs); - } - - existing.StartTime.TotalMilliseconds = newTimeCode.StartTime.TotalMilliseconds; - existing.EndTime.TotalMilliseconds = newTimeCode.EndTime.TotalMilliseconds; - - if (original != null) - { - original.StartTime.TotalMilliseconds = newTimeCode.StartTime.TotalMilliseconds; - original.EndTime.TotalMilliseconds = newTimeCode.EndTime.TotalMilliseconds; - } - - count++; - } - - ShowStatus(string.Format(_language.TimeCodeImportedFromXY, Path.GetFileName(openFileDialog1.FileName), count)); - SaveSubtitleListviewIndices(); - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - } - } - - private void toolStripMenuItemTranslationMode_Click(object sender, EventArgs e) - { - if (_subtitle == null || _subtitle.Paragraphs.Count == 0) - { - return; - } - - if (SubtitleListview1.IsAlternateTextColumnVisible) - { - RemoveAlternate(true, true); - } - else - { - OpenAlternateSubtitle(); - SetTitle(); - } - } - - private void OpenAlternateSubtitle() - { - if (ContinueNewOrExitAlternate()) - { - SaveSubtitleListviewIndices(); - openFileDialog1.Title = _languageGeneral.OpenOriginalSubtitleFile; - openFileDialog1.FileName = string.Empty; - openFileDialog1.Filter = UiUtil.SubtitleExtensionFilter.Value; - if (openFileDialog1.ShowDialog(this) != DialogResult.OK) - { - return; - } - - if (!LoadAlternateSubtitleFile(openFileDialog1.FileName)) - { - return; - } - - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - - Configuration.Settings.RecentFiles.Add(_fileName, FirstVisibleIndex, FirstSelectedIndex, VideoFileName, _subtitleAlternateFileName, Configuration.Settings.General.CurrentVideoOffsetInMs); - Configuration.Settings.Save(); - UpdateRecentFilesUI(); - MainResize(); - if (SubtitleListview1.SelectedIndices.Count == 0) - { - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - } - RefreshSelectedParagraph(); - } - } - - private bool LoadAlternateSubtitleFile(string fileName) - { - if (!File.Exists(fileName)) - { - return false; - } - - var file = new FileInfo(fileName); - - if (file.Extension.Equals(".sub", StringComparison.OrdinalIgnoreCase) && IsVobSubFile(fileName, false)) - { - return false; - } - - if (file.Length > 1024 * 1024 * 10) // max 10 mb - { - var text = string.Format(_language.FileXIsLargerThan10MB + Environment.NewLine + Environment.NewLine + _language.ContinueAnyway, fileName); - if (MessageBox.Show(this, text, Title, MessageBoxButtons.YesNoCancel) != DialogResult.Yes) - { - return false; - } - } - - _subtitleAlternate = new Subtitle(); - _subtitleAlternateFileName = fileName; - SubtitleFormat format = _subtitleAlternate.LoadSubtitle(fileName, out _, null); - - if (format == null) - { - foreach (var binaryFormat in SubtitleFormat.GetBinaryFormats(false)) - { - if (binaryFormat.IsMine(null, fileName)) - { - binaryFormat.LoadSubtitle(_subtitleAlternate, null, fileName); - format = binaryFormat; - break; - } - } - } - - if (format == null) - { - var lines = FileUtil.ReadAllTextShared(fileName, LanguageAutoDetect.GetEncodingFromFile(fileName)).SplitToLines(); - foreach (var f in SubtitleFormat.GetTextOtherFormats()) - { - if (f.IsMine(lines, fileName)) - { - f.LoadSubtitle(_subtitleAlternate, lines, fileName); - format = f; - break; - } - } - } - - if (format == null) - { - return false; - } - - SetupAlternateEdit(); - FixRightToLeftDependingOnLanguage(); - return true; - } - - private void SetupAlternateEdit() - { - if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate.Paragraphs.Count > 0) - { - InsertMissingParagraphs(_subtitle, _subtitleAlternate); - InsertMissingParagraphs(_subtitleAlternate, _subtitle); - - buttonUnBreak.Visible = false; - buttonAutoBreak.Visible = false; - buttonSplitLine.Visible = false; - - textBoxListViewText.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom; - textBoxListViewText.Width = (groupBoxEdit.Width - (textBoxListViewText.Left + 10)) / 2; - textBoxListViewTextAlternate.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom; - textBoxListViewTextAlternate.Left = textBoxListViewText.Left + textBoxListViewText.Width + 3; - textBoxListViewTextAlternate.Width = textBoxListViewText.Width; - textBoxListViewTextAlternate.Visible = true; - labelAlternateText.Text = _languageGeneral.OriginalText; - labelAlternateText.Visible = true; - labelAlternateCharactersPerSecond.Visible = true; - labelTextAlternateLineLengths.Visible = true; - labelAlternateSingleLine.Visible = true; - labelAlternateSingleLinePixels.Visible = true; - labelTextAlternateLineTotal.Visible = true; - - labelCharactersPerSecond.Left = textBoxListViewText.Left + (textBoxListViewText.Width - labelCharactersPerSecond.Width); - labelTextLineTotal.Left = textBoxListViewText.Left + (textBoxListViewText.Width - labelTextLineTotal.Width); - Main_Resize(null, null); - _changeAlternateSubtitleHash = _subtitleAlternate.GetFastHashCode(GetCurrentEncoding().BodyName); - - SetTitle(); - } - - SubtitleListview1.ShowAlternateTextColumn(_languageGeneral.OriginalText); - SubtitleListview1.AutoSizeAllColumns(this); - } - - private static void InsertMissingParagraphs(Subtitle masterSubtitle, Subtitle insertIntoSubtitle) - { - int index = 0; - foreach (var p in masterSubtitle.Paragraphs) - { - var insertParagraph = Utilities.GetOriginalParagraph(index, p, insertIntoSubtitle.Paragraphs); - if (insertParagraph == null) - { - insertParagraph = new Paragraph(p); - insertParagraph.Text = string.Empty; - if (p.StartTime.IsMaxTime) - { - insertIntoSubtitle.Paragraphs.Add(new Paragraph(p, true) { Text = string.Empty }); - } - else - { - insertIntoSubtitle.InsertParagraphInCorrectTimeOrder(insertParagraph); - } - } - - index++; - } - - insertIntoSubtitle.Renumber(); - } - - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - private void OpenVideo(string fileName) - { - if (!_resetVideo) - { - return; - } - - if (!string.IsNullOrEmpty(fileName) && File.Exists(fileName)) - { - if (_loading) - { - VideoFileName = fileName; - return; - } - - var fi = new FileInfo(fileName); - if (fi.Length < 1000) - { - return; - } - - ShowSubtitleTimer.Stop(); - Cursor = Cursors.WaitCursor; - VideoFileName = fileName; - if (mediaPlayer.VideoPlayer != null) - { - mediaPlayer.PauseAndDisposePlayer(); - } - - _endSeconds = -1; - - _videoInfo = UiUtil.GetVideoInfo(fileName); - if (_videoInfo.FramesPerSecond > 0) - { - toolStripComboBoxFrameRate.Text = string.Format("{0:0.###}", _videoInfo.FramesPerSecond); - } - - string oldVideoPlayer = Configuration.Settings.General.VideoPlayer; - var ok = UiUtil.InitializeVideoPlayerAndContainer(fileName, _videoInfo, mediaPlayer, VideoLoaded, VideoEnded); - if (!ok && oldVideoPlayer != Configuration.Settings.General.VideoPlayer) - { - CloseVideoToolStripMenuItemClick(null, null); - VideoFileName = fileName; - _videoInfo = UiUtil.GetVideoInfo(fileName); - UiUtil.InitializeVideoPlayerAndContainer(fileName, _videoInfo, mediaPlayer, VideoLoaded, VideoEnded); - } - - mediaPlayer.Volume = 0; - mediaPlayer.ShowFullscreenButton = Configuration.Settings.General.VideoPlayerShowFullscreenButton; - mediaPlayer.OnButtonClicked -= MediaPlayer_OnButtonClicked; - mediaPlayer.OnButtonClicked += MediaPlayer_OnButtonClicked; - - if (_videoInfo.VideoCodec != null) - { - labelVideoInfo.Text = Path.GetFileName(fileName) + " " + _videoInfo.Width + "x" + _videoInfo.Height + " " + _videoInfo.VideoCodec.Trim(); - } - else - { - labelVideoInfo.Text = Path.GetFileName(fileName) + " " + _videoInfo.Width + "x" + _videoInfo.Height; - } - - if (_videoInfo.FramesPerSecond > 0) - { - labelVideoInfo.Text = labelVideoInfo.Text + " " + string.Format("{0:0.0##}", _videoInfo.FramesPerSecond); - } - - - string peakWaveFileName = WavePeakGenerator.GetPeakWaveFileName(fileName); - string spectrogramFolder = WavePeakGenerator.SpectrogramDrawer.GetSpectrogramFolder(fileName); - if (File.Exists(peakWaveFileName)) - { - audioVisualizer.ZoomFactor = 1.0; - audioVisualizer.VerticalZoomFactor = 1.0; - SelectZoomTextInComboBox(); - audioVisualizer.WavePeaks = WavePeakData.FromDisk(peakWaveFileName); - audioVisualizer.SetSpectrogram(SpectrogramData.FromDisk(spectrogramFolder)); - audioVisualizer.SceneChanges = SceneChangeHelper.FromDisk(VideoFileName); - SetWaveformPosition(0, 0, 0); - timerWaveform.Start(); - } - - Cursor = Cursors.Default; - - SetUndockedWindowsTitle(); - ShowSubtitleTimer.Start(); - } - } - - private void MediaPlayer_OnButtonClicked(object sender, EventArgs e) - { - if (sender is PictureBox pb && pb.Name == "_pictureBoxFullscreenOver") - { - if (_videoPlayerUndocked != null && !_videoPlayerUndocked.IsDisposed && _videoPlayerUndocked.IsFullscreen) - { - _videoPlayerUndocked.NoFullscreen(); - } - else - { - GoFullscreen(false); - } - } - } - - private void SetWaveformPosition(double startPositionSeconds, double currentVideoPositionSeconds, int subtitleIndex) - { - if (_subtitleAlternate != null && SubtitleListview1.IsAlternateTextColumnVisible && Configuration.Settings.General.ShowOriginalAsPreviewIfAvailable) - { - int index = -1; - if (SubtitleListview1.SelectedItems.Count > 0 && _subtitle.Paragraphs.Count > 0) - { - int i = SubtitleListview1.SelectedItems[0].Index; - var p = Utilities.GetOriginalParagraph(i, _subtitle.Paragraphs[i], _subtitleAlternate.Paragraphs); - index = _subtitleAlternate.GetIndex(p); - } - - audioVisualizer.SetPosition(startPositionSeconds, _subtitleAlternate, currentVideoPositionSeconds, index, SubtitleListview1.SelectedIndices); - } - else - { - audioVisualizer.SetPosition(startPositionSeconds, _subtitle, currentVideoPositionSeconds, subtitleIndex, SubtitleListview1.SelectedIndices); - } - } - - private void VideoLoaded(object sender, EventArgs e) - { - if (_loading) - { - Application.DoEvents(); - } - - mediaPlayer.Volume = Configuration.Settings.General.VideoPlayerDefaultVolume; - timer1.Start(); - - trackBarWaveformPosition.Maximum = (int)mediaPlayer.Duration; - - if (_videoLoadedGoToSubPosAndPause) - { - Application.DoEvents(); - _videoLoadedGoToSubPosAndPause = false; - GotoSubPositionAndPause(); - } - - mediaPlayer.Pause(); - mediaPlayer.UpdatePlayerName(); - - // Keep current play rate - for (var index = 0; index < toolStripSplitButtonPlayRate.DropDownItems.Count; index++) - { - var item = (ToolStripMenuItem)toolStripSplitButtonPlayRate.DropDownItems[index]; - if (item.Checked) - { - SetPlayRate(item, null, true); - break; - } - } - - if (mediaPlayer.VideoPlayer is LibMpvDynamic && !Configuration.Settings.General.MpvHandlesPreviewText) - { - (mediaPlayer.VideoPlayer as LibMpvDynamic)?.RemoveSubtitle(); - } - - if (trackBarWaveformPosition.Maximum <= 0) - { - trackBarWaveformPosition.Maximum = (int)mediaPlayer.Duration; - } - } - - private void VideoEnded(object sender, EventArgs e) - { - mediaPlayer.Pause(); - } - - private void TryToFindAndOpenVideoFile(string fileNameNoExtension) - { - string movieFileName = null; - - foreach (var extension in Utilities.VideoFileExtensions) - { - var fileName = fileNameNoExtension + extension; - if (File.Exists(fileName)) - { - bool skipLoad = false; - if (extension == ".m2ts" && new FileInfo(fileName).Length < 2000000) - { - var textSt = new TextST(); - skipLoad = textSt.IsMine(null, fileName); // don't load TextST files as video/audio file - } - - if (!skipLoad) - { - movieFileName = fileName; - break; - } - } - } - - if (movieFileName != null) - { - OpenVideo(movieFileName); - } - else - { - var index = fileNameNoExtension.LastIndexOf('.'); - if (index > 0) - { - TryToFindAndOpenVideoFile(fileNameNoExtension.Remove(index)); - } - } - } - - internal void GoBackSeconds(double seconds) - { - if (mediaPlayer.CurrentPosition > seconds) - { - mediaPlayer.CurrentPosition -= seconds; - } - else - { - mediaPlayer.CurrentPosition = 0; - } - - ShowSubtitle(); - } - - private void ButtonStartHalfASecondBackClick(object sender, EventArgs e) - { - GoBackSeconds(0.5); - } - - private void ButtonStartThreeSecondsBackClick(object sender, EventArgs e) - { - GoBackSeconds(3.0); - } - - private void ButtonStartOneMinuteBackClick(object sender, EventArgs e) - { - GoBackSeconds(60); - } - - private void ButtonStartHalfASecondAheadClick(object sender, EventArgs e) - { - GoBackSeconds(-0.5); - } - - private void ButtonStartThreeSecondsAheadClick(object sender, EventArgs e) - { - GoBackSeconds(-3); - } - - private void ButtonStartOneMinuteAheadClick(object sender, EventArgs e) - { - GoBackSeconds(-60); - } - - private void ShowSubtitleTimerTick(object sender, EventArgs e) - { - ShowSubtitleTimer.Stop(); - - if (_subtitle == null || _subtitle.Paragraphs.Count == 0) - { - ShowSubtitleTimer.Interval = 250; - } - else - { - ShowSubtitleTimer.Interval = 17; - } - - if (mediaPlayer.VideoPlayer != null) - { - int oldIndex = FirstSelectedIndex; - int index = ShowSubtitle(); - if (index != -1 && checkBoxSyncListViewWithVideoWhilePlaying.Checked && oldIndex != index) - { - if ((DateTime.UtcNow.Ticks - _lastTextKeyDownTicks) > 10000 * 700) // only if last typed char was entered > 700 milliseconds - { - if (_endSeconds <= 0 || !checkBoxAutoRepeatOn.Checked) - { - if (!timerAutoDuration.Enabled && !mediaPlayer.IsPaused && (mediaPlayer.CurrentPosition > 0.2 || index > 0)) - { - SubtitleListview1.SelectIndexAndEnsureVisibleFaster(index); - } - } - } - } - } - - var currentChanged = _changeSubtitleHash != _subtitle.GetFastHashCode(GetCurrentEncoding().BodyName); - var originalActive = Configuration.Settings.General.AllowEditOfOriginalSubtitle && - _subtitleAlternate != null && - _subtitleAlternate.Paragraphs.Count > 0; - var originalChanged = originalActive && - _changeAlternateSubtitleHash != _subtitleAlternate.GetFastHashCode(GetCurrentEncoding().BodyName); - if (currentChanged || originalChanged) - { - AddTitleBarChangeAsterisk(currentChanged, originalChanged, originalActive); - AutoSave(); - } - else if (Text.Contains('*')) - { - Text = Text.RemoveChar('*').TrimEnd(); - } - - ShowSubtitleTimer.Start(); - } - - private void AddTitleBarChangeAsterisk(bool currentChanged, bool originalChanged, bool originalActive) - { - if (Configuration.Settings.General.TitleBarAsterisk.Equals("before", StringComparison.Ordinal)) - { - if (!Text.Contains('*')) - { - Text = "*" + Text; - } - } - else if (Configuration.Settings.General.TitleBarAsterisk.Equals("after", StringComparison.Ordinal)) - { - var s = Text.RemoveChar('*').TrimEnd(); - if (currentChanged && !originalActive || originalChanged) - { - var length = Title.Length; - if (s.Length > length) - { - s = s.Substring(0, s.Length - length).TrimEnd(' ', '*', '-') + "* - " + Title; - } - } - if (currentChanged) - { - s = s.Replace(" + ", "* + "); - } - - Text = s; - } - } - - private void HideVideoPlayer() - { - mediaPlayer.Pause(); - - int textHeight = splitContainerListViewAndText.Height - splitContainerListViewAndText.SplitterDistance; - - splitContainer1.Panel2Collapsed = true; - splitContainerMain.Panel2Collapsed = true; - Main_Resize(null, null); - - splitContainerListViewAndText.SplitterDistance = splitContainerListViewAndText.Height - textHeight; - } - - private void ShowVideoPlayer() - { - if (_isVideoControlsUndocked) - { - ShowHideUndockedVideoControls(); - } - else - { - if (toolStripButtonToggleVideo.Checked && toolStripButtonToggleWaveform.Checked) - { - splitContainer1.Panel2Collapsed = false; - MoveVideoUp(); - } - else - { - splitContainer1.Panel2Collapsed = true; - MoveVideoDown(); - } - - splitContainerMain.Panel2Collapsed = false; - if (toolStripButtonToggleVideo.Checked) - { - if (audioVisualizer.Visible) - { - audioVisualizer.Left = tabControlButtons.Left + tabControlButtons.Width + 5; - } - else - { - panelVideoPlayer.Left = tabControlButtons.Left + tabControlButtons.Width + 5; - } - } - else if (audioVisualizer.Visible) - { - audioVisualizer.Left = tabControlButtons.Left + tabControlButtons.Width + 5; - } - - audioVisualizer.Width = groupBoxVideo.Width - (audioVisualizer.Left + 10); - - checkBoxSyncListViewWithVideoWhilePlaying.Left = tabControlButtons.Left + tabControlButtons.Width + 5; - panelWaveformControls.Left = audioVisualizer.Left; - trackBarWaveformPosition.Left = panelWaveformControls.Left + panelWaveformControls.Width + 5; - trackBarWaveformPosition.Width = audioVisualizer.Left + audioVisualizer.Width - trackBarWaveformPosition.Left + 5; - } - - if (mediaPlayer.VideoPlayer == null && !string.IsNullOrEmpty(_fileName) && string.IsNullOrEmpty(VideoFileName) && !Configuration.Settings.General.DisableVideoAutoLoading) - { - TryToFindAndOpenVideoFile(Utilities.GetPathAndFileNameWithoutExtension(_fileName)); - } - - Main_Resize(null, null); - } - - private void ShowHideUndockedVideoControls() - { - if (_videoPlayerUndocked == null || _videoPlayerUndocked.IsDisposed) - { - UnDockVideoPlayer(); - } - - _videoPlayerUndocked.Visible = false; - if (toolStripButtonToggleVideo.Checked) - { - _videoPlayerUndocked.Show(this); - if (_videoPlayerUndocked.WindowState == FormWindowState.Minimized) - { - _videoPlayerUndocked.WindowState = FormWindowState.Normal; - } - } - - if (_waveformUndocked == null || _waveformUndocked.IsDisposed) - { - UnDockWaveform(); - } - - _waveformUndocked.Visible = false; - if (toolStripButtonToggleWaveform.Checked) - { - _waveformUndocked.Show(this); - if (_waveformUndocked.WindowState == FormWindowState.Minimized) - { - _waveformUndocked.WindowState = FormWindowState.Normal; - } - } - - if (toolStripButtonToggleVideo.Checked || toolStripButtonToggleWaveform.Checked) - { - if (_videoControlsUndocked == null || _videoControlsUndocked.IsDisposed) - { - UnDockVideoButtons(); - } - - _videoControlsUndocked.Visible = false; - _videoControlsUndocked.Show(this); - } - else - { - if (_videoControlsUndocked != null && !_videoControlsUndocked.IsDisposed) - { - _videoControlsUndocked.Visible = false; - } - } - } - - private void MoveVideoUp() - { - if (splitContainer1.Panel2.Controls.Count == 0) - { - var control = panelVideoPlayer; - groupBoxVideo.Controls.Remove(control); - splitContainer1.Panel2.Controls.Add(control); - } - - panelVideoPlayer.Top = 0; - panelVideoPlayer.Left = 0; - panelVideoPlayer.Height = splitContainer1.Panel2.Height - 2; - panelVideoPlayer.Width = splitContainer1.Panel2.Width - 2; - } - - private void MoveVideoDown() - { - if (splitContainer1.Panel2.Controls.Count > 0) - { - var control = panelVideoPlayer; - splitContainer1.Panel2.Controls.Clear(); - groupBoxVideo.Controls.Add(control); - } - - panelVideoPlayer.Top = 32; - panelVideoPlayer.Left = tabControlButtons.Left + tabControlButtons.Width + 5; - panelVideoPlayer.Height = groupBoxVideo.Height - (panelVideoPlayer.Top + 5); - panelVideoPlayer.Width = groupBoxVideo.Width - (panelVideoPlayer.Left + 5); - } - - private void FixLargeFonts() - { - using (var graphics = CreateGraphics()) - { - var textSize = graphics.MeasureString(buttonPlayPrevious.Text, Font); - if (textSize.Height > buttonPlayPrevious.Height - 4) - { - int newButtonHeight = 23; - UiUtil.SetButtonHeight(this, newButtonHeight, -4); - - // List view - SubtitleListview1.InitializeTimestampColumnWidths(this); - const int adjustUp = 8; - SubtitleListview1.Height = SubtitleListview1.Height - adjustUp; - groupBoxEdit.Top = groupBoxEdit.Top - adjustUp; - groupBoxEdit.Height = groupBoxEdit.Height + adjustUp; - numericUpDownDuration.Left = timeUpDownStartTime.Left + timeUpDownStartTime.Width; - numericUpDownDuration.Width = numericUpDownDuration.Width + 5; - labelDuration.Left = numericUpDownDuration.Left - 3; - - // Video controls - Create - timeUpDownVideoPosition.Left = labelVideoPosition.Left + labelVideoPosition.Width; - int buttonWidth = labelVideoPosition.Width + timeUpDownVideoPosition.Width; - buttonInsertNewText.Width = buttonWidth; - buttonBeforeText.Width = buttonWidth; - buttonGotoSub.Width = buttonWidth; - buttonSetStartTime.Width = buttonWidth; - buttonSetEnd.Width = buttonWidth; - int FKeyLeft = buttonInsertNewText.Left + buttonInsertNewText.Width; - labelCreateF9.Left = FKeyLeft; - labelCreateF10.Left = FKeyLeft; - labelCreateF11.Left = FKeyLeft; - labelCreateF12.Left = FKeyLeft; - buttonForward1.Left = buttonInsertNewText.Left + buttonInsertNewText.Width - buttonForward1.Width; - numericUpDownSec1.Width = buttonInsertNewText.Width - (numericUpDownSec1.Left + buttonForward1.Width); - buttonForward2.Left = buttonInsertNewText.Left + buttonInsertNewText.Width - buttonForward2.Width; - numericUpDownSec2.Width = buttonInsertNewText.Width - (numericUpDownSec2.Left + buttonForward2.Width); - - // Video controls - Adjust - timeUpDownVideoPositionAdjust.Left = labelVideoPosition2.Left + labelVideoPosition2.Width; - buttonSetStartAndOffsetRest.Width = buttonWidth; - buttonSetEndAndGoToNext.Width = buttonWidth; - buttonAdjustSetStartTime.Width = buttonWidth; - buttonAdjustSetEndTime.Width = buttonWidth; - buttonAdjustPlayBefore.Width = buttonWidth; - buttonAdjustGoToPosAndPause.Width = buttonWidth; - labelAdjustF9.Left = FKeyLeft; - labelAdjustF10.Left = FKeyLeft; - labelAdjustF11.Left = FKeyLeft; - labelAdjustF12.Left = FKeyLeft; - buttonAdjustSecForward1.Left = buttonInsertNewText.Left + buttonInsertNewText.Width - buttonAdjustSecForward1.Width; - numericUpDownSecAdjust1.Width = buttonInsertNewText.Width - (numericUpDownSecAdjust2.Left + buttonAdjustSecForward1.Width); - buttonAdjustSecForward2.Left = buttonInsertNewText.Left + buttonInsertNewText.Width - buttonAdjustSecForward2.Width; - numericUpDownSecAdjust2.Width = buttonInsertNewText.Width - (numericUpDownSecAdjust2.Left + buttonAdjustSecForward2.Width); - - tabControl1_SelectedIndexChanged(null, null); - } - } - } - - private void Main_Resize(object sender, EventArgs e) - { - if (_loading) - { - return; - } - - if (WindowState == FormWindowState.Maximized) - { - Main_ResizeEnd(sender, e); - return; - } - - panelVideoPlayer.Invalidate(); - } - - private void Main_ResizeEnd(object sender, EventArgs e) - { - if (_loading) - { - return; - } - - panelVideoPlayer.Invalidate(); - MainResize(); - - // Due to strange bug in listview when maximizing - SaveSubtitleListviewIndices(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - SubtitleListview1.SelectIndexAndEnsureVisible(_subtitleListViewIndex, true); - - panelVideoPlayer.Refresh(); - } - - private void MainResize() - { - var tbText = textBoxListViewText; - var tbOriginal = textBoxListViewTextAlternate; - int firstLeft = 236; - - var lbText = labelText; - var lbTextOriginal = labelAlternateText; - - var lbSingleLine = labelTextLineLengths; - var lbSingleLineOriginal = labelTextAlternateLineLengths; - - tbText.Left = firstLeft; - tbOriginal.Left = firstLeft; - lbText.Left = firstLeft; - lbTextOriginal.Left = firstLeft; - tbText.Width = groupBoxEdit.Width - (tbText.Left + 10 + (groupBoxEdit.Width - buttonUnBreak.Left)); - - if (Configuration.Settings.General.RightToLeftMode && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) - { - tbText = textBoxListViewTextAlternate; - tbOriginal = textBoxListViewText; - - lbText = labelAlternateText; - lbTextOriginal = labelText; - - lbSingleLine = labelTextAlternateLineLengths; - lbSingleLineOriginal = labelTextLineLengths; - } - else - { - labelTextLineLengths.Left = firstLeft; - } - - tbText.Left = firstLeft; - lbText.Left = firstLeft; - lbSingleLine.Left = firstLeft; - - if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0 && - textBoxListViewTextAlternate.Visible) - { - tbText.Width = (groupBoxEdit.Width - (tbText.Left + 10)) / 2; - tbOriginal.Left = tbText.Left + tbText.Width + 3; - lbTextOriginal.Left = tbOriginal.Left; - - tbOriginal.Width = tbText.Width; - - labelAlternateCharactersPerSecond.Left = tbOriginal.Left + (tbOriginal.Width - labelAlternateCharactersPerSecond.Width); - lbSingleLineOriginal.Left = tbOriginal.Left; - labelAlternateSingleLine.Left = labelTextAlternateLineLengths.Left + labelTextAlternateLineLengths.Width; - labelAlternateSingleLinePixels.Left = labelAlternateSingleLine.Left + labelAlternateSingleLine.Width + 10; - labelTextAlternateLineTotal.Left = tbOriginal.Left + (tbOriginal.Width - labelTextAlternateLineTotal.Width); - if (textBoxListViewText.Width / 2.1 < labelTextLineLengths.Width) - { - labelTextAlternateLineTotal.Visible = false; - } - else - { - labelTextAlternateLineTotal.Visible = true; - } - - if (textBoxListViewText.Width / 3 < labelTextLineLengths.Width) - { - labelAlternateSingleLinePixels.Visible = false; - } - else - { - labelAlternateSingleLinePixels.Visible = Configuration.Settings.Tools.ListViewSyntaxColorWideLines; - } - } - - labelAlternateCharactersPerSecond.Top = labelCharactersPerSecond.Top; - labelCharactersPerSecond.Left = tbText.Left + (tbText.Width - labelCharactersPerSecond.Width); - labelTextLineTotal.Left = tbText.Left + (tbText.Width - labelTextLineTotal.Width); - SubtitleListview1.AutoSizeAllColumns(this); - - if (textBoxListViewText.Width / 2.1 < labelTextLineLengths.Width) - { - labelTextLineTotal.Visible = false; - } - else - { - labelTextLineTotal.Visible = true; - } - - if (textBoxListViewText.Width / 3 < labelTextLineLengths.Width) - { - labelSingleLinePixels.Visible = false; - } - else - { - labelSingleLinePixels.Visible = Configuration.Settings.Tools.ListViewSyntaxColorWideLines; - } - - FixRightToLeftDependingOnLanguage(); - } - - private void FixRightToLeftDependingOnLanguage() - { - if (Configuration.Settings.General.RightToLeftMode) - { - if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) - { - if (LanguageAutoDetect.CouldBeRightToLeftLanguage(_subtitleAlternate)) - { - textBoxListViewTextAlternate.RightToLeft = RightToLeft.Yes; - } - else - { - textBoxListViewTextAlternate.RightToLeft = RightToLeft.No; - } - } - - if (LanguageAutoDetect.CouldBeRightToLeftLanguage(_subtitle)) - { - textBoxListViewText.RightToLeft = RightToLeft.Yes; - textBoxSource.RightToLeft = RightToLeft.Yes; - } - else - { - - textBoxListViewText.RightToLeft = RightToLeft.No; - textBoxSource.RightToLeft = RightToLeft.No; - } - } - else - { - textBoxListViewText.RightToLeft = RightToLeft.No; - textBoxSource.RightToLeft = RightToLeft.No; - } - } - - private void PlayCurrent() - { - if (_subtitleListViewIndex >= 0) - { - GotoSubtitleIndex(_subtitleListViewIndex); - textBoxListViewText.Focus(); - ReadyAutoRepeat(); - PlayPart(_subtitle.Paragraphs[_subtitleListViewIndex]); - } - } - - private void ReadyAutoRepeat() - { - if (checkBoxAutoRepeatOn.Checked) - { - _repeatCount = int.Parse(comboBoxAutoRepeat.Text); - } - else - { - _repeatCount = -1; - } - - if (mediaPlayer.VideoPlayer != null) - { - labelStatus.Text = _language.VideoControls.Playing; - } - } - - private void PlayNext() - { - int newIndex = _subtitleListViewIndex + 1; - if (newIndex < _subtitle.Paragraphs.Count) - { - foreach (ListViewItem item in SubtitleListview1.SelectedItems) - { - item.Selected = false; - } - - SubtitleListview1.Items[newIndex].Selected = true; - SubtitleListview1.Items[newIndex].EnsureVisible(); - SubtitleListview1.Items[newIndex].Focused = true; - textBoxListViewText.Focus(); - textBoxListViewText.SelectAll(); - _subtitleListViewIndex = newIndex; - GotoSubtitleIndex(newIndex); - ShowSubtitle(); - PlayCurrent(); - } - } - - private void PlayPrevious() - { - if (_subtitleListViewIndex > 0) - { - int newIndex = _subtitleListViewIndex - 1; - foreach (ListViewItem item in SubtitleListview1.SelectedItems) - { - item.Selected = false; - } - - SubtitleListview1.Items[newIndex].Selected = true; - SubtitleListview1.Items[newIndex].EnsureVisible(); - SubtitleListview1.Items[newIndex].Focused = true; - textBoxListViewText.Focus(); - textBoxListViewText.SelectAll(); - GotoSubtitleIndex(newIndex); - ShowSubtitle(); - _subtitleListViewIndex = newIndex; - PlayCurrent(); - } - } - - private void GotoSubtitleIndex(int index) - { - if (mediaPlayer.VideoPlayer != null && mediaPlayer.Duration > 0) - { - mediaPlayer.CurrentPosition = _subtitle.Paragraphs[index].StartTime.TotalSeconds; - } - } - - private void PlayPart(Paragraph paragraph) - { - if (mediaPlayer.VideoPlayer != null) - { - double startSeconds = paragraph.StartTime.TotalSeconds; - if (startSeconds > 0.05) - { - startSeconds -= 0.05; // go a little back - } - - _endSeconds = paragraph.EndTime.TotalSeconds; - if (mediaPlayer.Duration > _endSeconds + 0.05) - { - _endSeconds += 0.05; // go a little forward - } - - mediaPlayer.CurrentPosition = startSeconds; - ShowSubtitle(); - mediaPlayer.Play(); - } - } - - private void buttonSetStartTime_Click(object sender, EventArgs e) - { - SetStartTime(false, mediaPlayer.CurrentPosition); - } - - private void SetStartTime(bool adjustEndTime, double videoPosition) - { - if (SubtitleListview1.SelectedItems.Count == 1) - { - timeUpDownStartTime.MaskedTextBox.TextChanged -= MaskedTextBoxTextChanged; - int index = SubtitleListview1.SelectedItems[0].Index; - var p = _subtitle.Paragraphs[index]; - var oldParagraph = new Paragraph(p, false); - if (oldParagraph.StartTime.IsMaxTime || oldParagraph.EndTime.IsMaxTime) - { - adjustEndTime = true; - } - - if (!mediaPlayer.IsPaused) - { - videoPosition -= Configuration.Settings.General.SetStartEndHumanDelay / TimeCode.BaseUnit; - } - - MakeHistoryForUndoOnlyIfNotResent(string.Format(_language.VideoControls.BeforeChangingTimeInWaveformX, "#" + p.Number + " " + p.Text)); - - timeUpDownStartTime.TimeCode = TimeCode.FromSeconds(videoPosition); - - var duration = p.Duration.TotalMilliseconds; - - p.StartTime.TotalMilliseconds = videoPosition * TimeCode.BaseUnit; - if (adjustEndTime) - { - p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + duration; - } - - if (oldParagraph.StartTime.IsMaxTime) - { - p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(p.Text); - } - - SubtitleListview1.SetStartTimeAndDuration(index, p, _subtitle.GetParagraphOrDefault(index + 1), _subtitle.GetParagraphOrDefault(index - 1)); - timeUpDownStartTime.TimeCode = p.StartTime; - timeUpDownStartTime.MaskedTextBox.TextChanged += MaskedTextBoxTextChanged; - - if (!adjustEndTime) - { - SetDurationInSeconds(p.Duration.TotalSeconds); - } - - UpdateOriginalTimeCodes(oldParagraph); - ShowSource(); - RefreshSelectedParagraph(); - } - } - - private void ButtonSetEndClick(object sender, EventArgs e) - { - if (SubtitleListview1.SelectedItems.Count == 1) - { - double videoPosition = mediaPlayer.CurrentPosition; - if (!mediaPlayer.IsPaused) - { - videoPosition -= Configuration.Settings.General.SetStartEndHumanDelay / TimeCode.BaseUnit; - } - - int index = SubtitleListview1.SelectedItems[0].Index; - MakeHistoryForUndoOnlyIfNotResent(string.Format(_language.VideoControls.BeforeChangingTimeInWaveformX, "#" + _subtitle.Paragraphs[index].Number + " " + _subtitle.Paragraphs[index].Text)); - - if (_subtitle.Paragraphs[index].StartTime.IsMaxTime) - { - timeUpDownStartTime.MaskedTextBox.TextChanged -= MaskedTextBoxTextChanged; - _subtitle.Paragraphs[index].EndTime.TotalSeconds = videoPosition; - _subtitle.Paragraphs[index].StartTime.TotalMilliseconds = _subtitle.Paragraphs[index].EndTime.TotalMilliseconds - Utilities.GetOptimalDisplayMilliseconds(_subtitle.Paragraphs[index].Text); - if (_subtitle.Paragraphs[index].StartTime.TotalMilliseconds < 0) - { - _subtitle.Paragraphs[index].StartTime.TotalMilliseconds = 0; - } - - timeUpDownStartTime.TimeCode = _subtitle.Paragraphs[index].StartTime; - SubtitleListview1.SetStartTimeAndDuration(index, _subtitle.Paragraphs[index], _subtitle.GetParagraphOrDefault(index + 1), _subtitle.GetParagraphOrDefault(index - 1)); - timeUpDownStartTime.MaskedTextBox.TextChanged += MaskedTextBoxTextChanged; - } - else - { - _subtitle.Paragraphs[index].EndTime = TimeCode.FromSeconds(videoPosition); - } - - SubtitleListview1.SetStartTimeAndDuration(index, _subtitle.Paragraphs[index], _subtitle.GetParagraphOrDefault(index + 1), _subtitle.GetParagraphOrDefault(index - 1)); - SetDurationInSeconds(_subtitle.Paragraphs[index].Duration.TotalSeconds); - } - } - - private void ButtonInsertNewTextClick(object sender, EventArgs e) - { - mediaPlayer.Pause(); - - var newParagraph = InsertNewTextAtVideoPosition(); - - textBoxListViewText.Focus(); - timerAutoDuration.Start(); - - ShowStatus(string.Format(_language.VideoControls.NewTextInsertAtX, newParagraph.StartTime.ToShortString())); - } - - private Paragraph InsertNewTextAtVideoPosition() - { - // current movie Position - double videoPositionInMilliseconds = mediaPlayer.CurrentPosition * TimeCode.BaseUnit; - if (!mediaPlayer.IsPaused && videoPositionInMilliseconds > Configuration.Settings.General.SetStartEndHumanDelay) - { - videoPositionInMilliseconds -= Configuration.Settings.General.SetStartEndHumanDelay; - } - - var tc = new TimeCode(videoPositionInMilliseconds); - MakeHistoryForUndo(_language.BeforeInsertSubtitleAtVideoPosition + " " + tc); - - // find index where to insert - int index = 0; - foreach (var p in _subtitle.Paragraphs) - { - if (p.StartTime.TotalMilliseconds > videoPositionInMilliseconds) - { - break; - } - - index++; - } - - // prevent overlap - var endTotalMilliseconds = videoPositionInMilliseconds + Configuration.Settings.General.NewEmptyDefaultMs; - var next = _subtitle.GetParagraphOrDefault(index); - if (next != null) - { - if (endTotalMilliseconds > next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines) - { - endTotalMilliseconds = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; - } - } - - // create and insert - var newParagraph = new Paragraph(string.Empty, videoPositionInMilliseconds, endTotalMilliseconds); - SetStyleForNewParagraph(newParagraph, index); - if (_networkSession != null) - { - _networkSession.TimerStop(); - NetworkGetSendUpdates(new List(), index, newParagraph); - } - else - { - _subtitle.Paragraphs.Insert(index, newParagraph); - - // check if original is available - and insert new paragraph in the original too - if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) - { - _subtitleAlternate.InsertParagraphInCorrectTimeOrder(new Paragraph(newParagraph)); - _subtitleAlternate.Renumber(); - } - - _subtitleListViewIndex = -1; - _subtitle.Renumber(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - } - - SubtitleListview1.SelectIndexAndEnsureVisible(index, true); - return newParagraph; - } - - private void timerAutoDuration_Tick(object sender, EventArgs e) - { - labelAutoDuration.Visible = !labelAutoDuration.Visible; - if (SubtitleListview1.SelectedItems.Count > 0) - { - try - { - int firstSelectedIndex = SubtitleListview1.SelectedItems[0].Index; - var currentParagraph = _subtitle.Paragraphs[firstSelectedIndex]; - var nextParagraph = _subtitle.GetParagraphOrDefault(firstSelectedIndex + 1); - double duration = Utilities.GetOptimalDisplayMilliseconds(textBoxListViewText.Text); - if (currentParagraph.StartTime.TotalMilliseconds + duration + Configuration.Settings.General.MinimumMillisecondsBetweenLines > nextParagraph?.StartTime.TotalMilliseconds) - { - var newEndTime = nextParagraph.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; - if (newEndTime - currentParagraph.StartTime.TotalMilliseconds > 100) - { - duration = newEndTime - currentParagraph.StartTime.TotalMilliseconds; - } - else - { - return; // too close to next subtitle - } - } - - SetDurationInSeconds(duration / TimeCode.BaseUnit); - currentParagraph.EndTime.TotalMilliseconds = currentParagraph.StartTime.TotalMilliseconds + duration; - SubtitleListview1.SetDuration(firstSelectedIndex, currentParagraph, _subtitle.GetParagraphOrDefault(firstSelectedIndex + 1)); - } - catch - { - // ignore - } - } - } - - private void buttonBeforeText_Click(object sender, EventArgs e) - { - if (SubtitleListview1.SelectedItems.Count > 0) - { - int index = SubtitleListview1.SelectedItems[0].Index; - - mediaPlayer.Pause(); - double pos = _subtitle.Paragraphs[index].StartTime.TotalSeconds; - if (pos > 1) - { - mediaPlayer.CurrentPosition = (_subtitle.Paragraphs[index].StartTime.TotalSeconds) - 0.5; - } - else - { - mediaPlayer.CurrentPosition = _subtitle.Paragraphs[index].StartTime.TotalSeconds; - } - - mediaPlayer.Play(); - } - } - - private void GotoSubPositionAndPause() - { - GotoSubPositionAndPause(0); - } - - private void GotoSubPositionAndPause(double adjustSeconds) - { - if (SubtitleListview1.SelectedItems.Count > 0) - { - int index = SubtitleListview1.SelectedItems[0].Index; - if (index == -1 || index >= _subtitle.Paragraphs.Count) - { - return; - } - - var p = _subtitle.Paragraphs[index]; - mediaPlayer.Pause(); - if (p.StartTime.IsMaxTime) - { - return; - } - - double newPos = p.StartTime.TotalSeconds + adjustSeconds; - if (newPos < 0) - { - newPos = 0; - } - - mediaPlayer.CurrentPosition = newPos; - ShowSubtitle(); - - double startPos = mediaPlayer.CurrentPosition - 1; - if (startPos < 0) - { - startPos = 0; - } - - SetWaveformPosition(startPos, mediaPlayer.CurrentPosition, index); - } - } - - private void buttonGotoSub_Click(object sender, EventArgs e) - { - GotoSubPositionAndPause(); - } - - private void buttonOpenVideo_Click(object sender, EventArgs e) - { - if (string.IsNullOrEmpty(openFileDialog1.InitialDirectory) && !string.IsNullOrEmpty(_fileName)) - { - openFileDialog1.InitialDirectory = Path.GetDirectoryName(_fileName); - } - - openFileDialog1.Title = _languageGeneral.OpenVideoFileTitle; - openFileDialog1.FileName = string.Empty; - openFileDialog1.Filter = Utilities.GetVideoFileFilter(true); - - openFileDialog1.FileName = string.Empty; - if (openFileDialog1.ShowDialog() == DialogResult.OK) - { - if (audioVisualizer.WavePeaks != null) - { - audioVisualizer.WavePeaks = null; - audioVisualizer.SetSpectrogram(null); - audioVisualizer.SceneChanges = new List(); - audioVisualizer.Chapters = new List(); - } - - openFileDialog1.InitialDirectory = Path.GetDirectoryName(openFileDialog1.FileName); - if (!panelVideoPlayer.Visible) - { - toolStripButtonToggleVideo_Click(null, null); - } - - OpenVideo(openFileDialog1.FileName); - } - } - - private void toolStripButtonToggleVideo_Click(object sender, EventArgs e) - { - toolStripButtonToggleVideo.Checked = !toolStripButtonToggleVideo.Checked; - panelVideoPlayer.Visible = toolStripButtonToggleVideo.Checked; - mediaPlayer.BringToFront(); - if (!toolStripButtonToggleVideo.Checked && !toolStripButtonToggleWaveform.Checked) - { - if (_isVideoControlsUndocked) - { - ShowHideUndockedVideoControls(); - } - else - { - HideVideoPlayer(); - } - } - else - { - ShowVideoPlayer(); - } - - Configuration.Settings.General.ShowVideoPlayer = toolStripButtonToggleVideo.Checked; - if (!_loading) - { - Refresh(); - } - } - - private void toolStripButtonToggleWaveform_Click(object sender, EventArgs e) - { - toolStripButtonToggleWaveform.Checked = !toolStripButtonToggleWaveform.Checked; - audioVisualizer.Visible = toolStripButtonToggleWaveform.Checked; - trackBarWaveformPosition.Visible = toolStripButtonToggleWaveform.Checked; - panelWaveformControls.Visible = toolStripButtonToggleWaveform.Checked; - if (!toolStripButtonToggleWaveform.Checked && !toolStripButtonToggleVideo.Checked) - { - if (_isVideoControlsUndocked) - { - ShowHideUndockedVideoControls(); - } - else - { - HideVideoPlayer(); - } - } - else - { - ShowVideoPlayer(); - } - - Configuration.Settings.General.ShowAudioVisualizer = toolStripButtonToggleWaveform.Checked; - Refresh(); - } - - public void ShowEarlierOrLater(double adjustMilliseconds, SelectionChoice selection) - { - var tc = new TimeCode(adjustMilliseconds); - MakeHistoryForUndo(_language.BeforeShowSelectedLinesEarlierLater + ": " + tc); - if (adjustMilliseconds < 0) - { - if (selection == SelectionChoice.AllLines) - { - ShowStatus(string.Format(_language.ShowAllLinesXSecondsLinesEarlier, adjustMilliseconds / -TimeCode.BaseUnit)); - } - else if (selection == SelectionChoice.SelectionOnly) - { - ShowStatus(string.Format(_language.ShowSelectedLinesXSecondsLinesEarlier, adjustMilliseconds / -TimeCode.BaseUnit)); - } - else if (selection == SelectionChoice.SelectionAndForward) - { - ShowStatus(string.Format(_language.ShowSelectionAndForwardXSecondsLinesEarlier, adjustMilliseconds / -TimeCode.BaseUnit)); - } - } - else - { - if (selection == SelectionChoice.AllLines) - { - ShowStatus(string.Format(_language.ShowAllLinesXSecondsLinesLater, adjustMilliseconds / TimeCode.BaseUnit)); - } - else if (selection == SelectionChoice.SelectionOnly) - { - ShowStatus(string.Format(_language.ShowSelectedLinesXSecondsLinesLater, adjustMilliseconds / TimeCode.BaseUnit)); - } - else if (selection == SelectionChoice.SelectionAndForward) - { - ShowStatus(string.Format(_language.ShowSelectionAndForwardXSecondsLinesLater, adjustMilliseconds / TimeCode.BaseUnit)); - } - } - - int startFrom = 0; - if (selection == SelectionChoice.SelectionAndForward) - { - if (SubtitleListview1.SelectedItems.Count > 0) - { - startFrom = SubtitleListview1.SelectedItems[0].Index; - } - else - { - startFrom = _subtitle.Paragraphs.Count; - } - } - - // don't overlap previous/next - if (selection == SelectionChoice.SelectionOnly && SubtitleListview1.SelectedItems.Count == 1 && - !Configuration.Settings.VideoControls.WaveformAllowOverlap && - GetCurrentSubtitleFormat().GetType() != typeof(AdvancedSubStationAlpha)) - { - var current = _subtitle.GetParagraphOrDefault(FirstSelectedIndex); - if (current != null) - { - if (adjustMilliseconds >= 0) - { - var next = _subtitle.GetParagraphOrDefault(FirstSelectedIndex + 1); - if (next != null && current.EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines > next.StartTime.TotalMilliseconds - adjustMilliseconds) - { - var newAdjustMs = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines - current.EndTime.TotalMilliseconds; - if (newAdjustMs > 0) - { - adjustMilliseconds = newAdjustMs; - } - else - { - return; - } - } - } - else - { - var prev = _subtitle.GetParagraphOrDefault(FirstSelectedIndex - 1); - if (prev != null && current.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines + adjustMilliseconds < prev.EndTime.TotalMilliseconds) - { - var newAdjustMs = prev.EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines - current.StartTime.TotalMilliseconds; - if (newAdjustMs < 0) - { - adjustMilliseconds = newAdjustMs; - } - else - { - return; - } - } - } - } - } - - SubtitleListview1.BeginUpdate(); - for (int i = startFrom; i < _subtitle.Paragraphs.Count; i++) - { - switch (selection) - { - case SelectionChoice.SelectionOnly: - if (SubtitleListview1.Items[i].Selected) - { - ShowEarlierOrLaterParagraph(adjustMilliseconds, i); - } - - break; - case SelectionChoice.AllLines: - case SelectionChoice.SelectionAndForward: - ShowEarlierOrLaterParagraph(adjustMilliseconds, i); - break; - } - } - - SubtitleListview1.EndUpdate(); - RefreshSelectedParagraph(); - UpdateSourceView(); - UpdateListSyntaxColoring(); - } - - private void ShowEarlierOrLaterParagraph(double adjustMilliseconds, int i) - { - var p = _subtitle.GetParagraphOrDefault(i); - if (p != null && !p.StartTime.IsMaxTime) - { - if (_subtitleAlternate != null) - { - var original = Utilities.GetOriginalParagraph(i, p, _subtitleAlternate.Paragraphs); - if (original != null) - { - original.StartTime.TotalMilliseconds += adjustMilliseconds; - original.EndTime.TotalMilliseconds += adjustMilliseconds; - } - } - - p.StartTime.TotalMilliseconds += adjustMilliseconds; - p.EndTime.TotalMilliseconds += adjustMilliseconds; - SubtitleListview1.SetStartTimeAndDuration(i, p, _subtitle.GetParagraphOrDefault(i + 1), _subtitle.GetParagraphOrDefault(i - 1)); - } - } - - private void UpdateSourceView() - { - if (tabControlSubtitle.SelectedIndex == TabControlSourceView) - { - ShowSource(); - } - } - - private void toolStripMenuItemAdjustAllTimes_Click(object sender, EventArgs e) - { - if (SubtitleListview1.SelectedItems.Count > 1) - { - ShowSelectedLinesEarlierlaterToolStripMenuItemClick(null, null); - return; - } - - if (!IsSubtitleLoaded) - { - DisplaySubtitleNotLoadedMessage(); - return; - } - - mediaPlayer.Pause(); - - if (_showEarlierOrLater != null && !_showEarlierOrLater.IsDisposed) - { - _showEarlierOrLater.WindowState = FormWindowState.Normal; - _showEarlierOrLater.Focus(); - return; - } - - _showEarlierOrLater = new ShowEarlierLater(); - if (!_showEarlierOrLater.IsPositionAndSizeSaved) - { - _showEarlierOrLater.Top = Top + 100; - _showEarlierOrLater.Left = Left + Width / 2 - _showEarlierOrLater.Width / 3; - } - - SaveSubtitleListviewIndices(); - _showEarlierOrLater.Initialize(ShowEarlierOrLater, false); - _showEarlierOrLater.Show(this); - } - - private void timer1_Tick(object sender, EventArgs e) - { - if (mediaPlayer.VideoPlayer != null) - { - if (!mediaPlayer.IsPaused) - { - timeUpDownVideoPosition.Enabled = false; - timeUpDownVideoPositionAdjust.Enabled = false; - - if (_endSeconds >= 0 && mediaPlayer.CurrentPosition > _endSeconds && !(AutoRepeatContinueOn || AutoRepeatOn)) - { - mediaPlayer.Pause(); - if (_endSecondsNewPosition >= 0 && _endSecondsNewPositionTicks > DateTime.UtcNow.Ticks - (10000 * 900)) // 900 ms - { - mediaPlayer.CurrentPosition = _endSecondsNewPosition; - } - else - { - mediaPlayer.CurrentPosition = _endSeconds + EndDelay; - } - - _endSeconds = -1; - _endSecondsNewPosition = -1; - _endSecondsNewPositionTicks = 0; - } - - if (AutoRepeatContinueOn || AutoRepeatOn) - { - if (_endSeconds >= 0 && mediaPlayer.CurrentPosition > _endSeconds && checkBoxAutoRepeatOn.Checked) - { - mediaPlayer.Pause(); - _endSeconds = -1; - - if (checkBoxAutoRepeatOn.Checked && _repeatCount > 0) - { - if (_repeatCount == 1) - { - labelStatus.Text = _language.VideoControls.RepeatingLastTime; - } - else - { - labelStatus.Text = string.Format(_language.VideoControls.RepeatingXTimesLeft, _repeatCount); - } - - _repeatCount--; - if (_subtitleListViewIndex >= 0 && _subtitleListViewIndex < _subtitle.Paragraphs.Count) - { - PlayPart(_subtitle.Paragraphs[_subtitleListViewIndex]); - } - } - else if (checkBoxAutoContinue.Checked) - { - _autoContinueDelayCount = int.Parse(comboBoxAutoContinue.Text); - if (_repeatCount == 1) - { - labelStatus.Text = _language.VideoControls.AutoContinueInOneSecond; - } - else - { - labelStatus.Text = string.Format(_language.VideoControls.AutoContinueInXSeconds, _autoContinueDelayCount); - } - - timerAutoContinue.Start(); - } - } - } - } - else - { - timeUpDownVideoPosition.Enabled = true; - timeUpDownVideoPositionAdjust.Enabled = true; - } - - int index = ShowSubtitle(); - - double pos = mediaPlayer.CurrentPosition * TimeCode.BaseUnit; - if (!timeUpDownVideoPosition.MaskedTextBox.Focused && timeUpDownVideoPosition.TimeCode.TotalMilliseconds != pos) - { - timeUpDownVideoPosition.TimeCode = new TimeCode(pos); - } - - if (!timeUpDownVideoPositionAdjust.MaskedTextBox.Focused && timeUpDownVideoPositionAdjust.TimeCode.TotalMilliseconds != pos) - { - timeUpDownVideoPositionAdjust.TimeCode = new TimeCode(pos); - } - - mediaPlayer.RefreshProgressBar(); - - trackBarWaveformPosition.ValueChanged -= trackBarWaveformPosition_ValueChanged; - int value = (int)mediaPlayer.CurrentPosition; - if (value > trackBarWaveformPosition.Maximum) - { - value = trackBarWaveformPosition.Maximum; - } - - if (value < trackBarWaveformPosition.Minimum) - { - value = trackBarWaveformPosition.Minimum; - } - - trackBarWaveformPosition.Value = value; - trackBarWaveformPosition.ValueChanged += trackBarWaveformPosition_ValueChanged; - - if (labelNextWord.Visible && _labelNextTicks + 100000000 < DateTime.UtcNow.Ticks) - { - labelNextWord.Visible = false; - } - } - } - - private void StopAutoDuration() - { - timerAutoDuration.Stop(); - labelAutoDuration.Visible = false; - } - - private void textBoxListViewText_Leave(object sender, EventArgs e) - { - StopAutoDuration(); - } - - private void timerAutoContinue_Tick(object sender, EventArgs e) - { - _autoContinueDelayCount--; - - if (_autoContinueDelayCount == 0) - { - timerAutoContinue.Stop(); - - if (timerStillTyping.Enabled) - { - labelStatus.Text = _language.VideoControls.StillTypingAutoContinueStopped; - } - else - { - labelStatus.Text = string.Empty; - PlayNext(); - } - } - else - { - if (_repeatCount == 1) - { - labelStatus.Text = _language.VideoControls.AutoContinueInOneSecond; - } - else - { - labelStatus.Text = string.Format(_language.VideoControls.AutoContinueInXSeconds, _autoContinueDelayCount); - } - } - } - - private void timerStillTyping_Tick(object sender, EventArgs e) - { - timerStillTyping.Stop(); - } - - private void textBoxListViewText_MouseMove(object sender, MouseEventArgs e) - { - if ((AutoRepeatContinueOn || AutoRepeatOn) && !textBoxSearchWord.Focused && textBoxListViewText.Focused) - { - string selectedText = textBoxListViewText.SelectedText; - if (!string.IsNullOrEmpty(selectedText)) - { - selectedText = selectedText.Trim(); - selectedText = selectedText.TrimEnd('.', ',', '!', '?'); - selectedText = selectedText.TrimEnd(); - if (!string.IsNullOrEmpty(selectedText) && selectedText != textBoxSearchWord.Text) - { - textBoxSearchWord.Text = HtmlUtil.RemoveHtmlTags(selectedText); - } - } - } - } - - private void textBoxListViewText_KeyUp(object sender, KeyEventArgs e) - { - textBoxListViewText_MouseMove(sender, null); - textBoxListViewText.ClearUndo(); - UpdatePositionAndTotalLength(labelTextLineTotal, textBoxListViewText); - } - - public void RunTranslateSearch(Action act) - { - var text = textBoxSearchWord.Text; - if (tabControlButtons.SelectedTab != tabPageTranslate) - { - var tb = GetFocusedTextBox(); - if (tb.SelectionLength == 0) - { - text = tb.Text; - } - else - { - text = tb.SelectedText; - } - } - - if (!string.IsNullOrWhiteSpace(text)) - { - act(text); - } - } - - private void buttonGoogleIt_Click(object sender, EventArgs e) - { - RunTranslateSearch((text) => { UiUtil.OpenURL("https://www.google.com/search?q=" + Utilities.UrlEncode(text)); }); - } - - private void buttonGoogleTranslateIt_Click(object sender, EventArgs e) - { - RunTranslateSearch((text) => - { - string languageId = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle); - UiUtil.OpenURL("https://translate.google.com/#auto|" + languageId + "|" + Utilities.UrlEncode(text)); - }); - } - - private void ButtonPlayCurrentClick(object sender, EventArgs e) - { - PlayCurrent(); - } - - private void buttonPlayNext_Click(object sender, EventArgs e) - { - PlayNext(); - } - - private void buttonPlayPrevious_Click(object sender, EventArgs e) - { - PlayPrevious(); - } - - private void buttonStop_Click(object sender, EventArgs e) - { - _endSeconds = -1; - timerAutoContinue.Stop(); - mediaPlayer.Pause(); - labelStatus.Text = string.Empty; - } - - private void fileToolStripMenuItem_DropDownOpening(object sender, EventArgs e) - { - toolStripMenuItemOpenContainingFolder.Visible = !string.IsNullOrEmpty(_fileName) && File.Exists(_fileName); - bool subtitleLoaded = IsSubtitleLoaded; - toolStripMenuItemStatistics.Visible = subtitleLoaded; - toolStripSeparator22.Visible = subtitleLoaded; - toolStripMenuItemExport.Visible = subtitleLoaded; - openOriginalToolStripMenuItem.Visible = subtitleLoaded; - toolStripMenuItemOpenKeepVideo.Visible = VideoFileName != null; - if (subtitleLoaded && Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) - { - saveOriginalToolStripMenuItem.Visible = true; - saveOriginalAstoolStripMenuItem.Visible = true; - removeOriginalToolStripMenuItem.Visible = true; - } - else - { - saveOriginalToolStripMenuItem.Visible = false; - saveOriginalAstoolStripMenuItem.Visible = false; - if (subtitleLoaded && SubtitleListview1.IsAlternateTextColumnVisible && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) - { - removeOriginalToolStripMenuItem.Visible = true; - } - else - { - removeOriginalToolStripMenuItem.Visible = false; - } - } - - var format = GetCurrentSubtitleFormat(); - var ft = format.GetType(); - if (ft == typeof(AdvancedSubStationAlpha)) - { - toolStripMenuItemSubStationAlpha.Visible = true; - toolStripMenuItemSubStationAlpha.Text = _language.Menu.File.AdvancedSubStationAlphaProperties; - - toolStripMenuItemAssStyles.Visible = true; - toolStripMenuItemAssStyles.Text = _language.Menu.ContextMenu.AdvancedSubStationAlphaStyles; - - toolStripMenuItemAssaStyles.Visible = true; - } - else if (ft == typeof(SubStationAlpha)) - { - toolStripMenuItemSubStationAlpha.Visible = true; - toolStripMenuItemSubStationAlpha.Text = _language.Menu.File.SubStationAlphaProperties; - - toolStripMenuItemAssStyles.Visible = true; - toolStripMenuItemAssStyles.Text = _language.Menu.ContextMenu.AdvancedSubStationAlphaStyles; - - toolStripMenuItemAssaStyles.Visible = true; - } - else - { - toolStripMenuItemSubStationAlpha.Visible = false; - toolStripMenuItemAssStyles.Visible = false; - toolStripMenuItemAssaStyles.Visible = false; - } - - if (ft == typeof(Ebu)) - { - toolStripMenuItemEbuProperties.Text = _language.Menu.File.EbuProperties; - toolStripMenuItemEbuProperties.Visible = !string.IsNullOrEmpty(_language.Menu.File.EbuProperties); - } - else - { - toolStripMenuItemEbuProperties.Visible = false; - } - - if (ft == typeof(DvdStudioPro) || - ft == typeof(DvdStudioProSpace) || - ft == typeof(DvdStudioProSpaceOne) || - ft == typeof(DvdStudioProSpaceOneSemicolon)) - { - toolStripMenuItemDvdStudioProProperties.Text = _language.Menu.File.DvdStuioProProperties; - toolStripMenuItemDvdStudioProProperties.Visible = true; - } - else - { - toolStripMenuItemDvdStudioProProperties.Visible = false; - } - - if (ft == typeof(DCinemaInterop) || ft == typeof(DCinemaSmpte2014) || ft == typeof(DCinemaSmpte2010) || ft == typeof(DCinemaSmpte2007)) - { - toolStripMenuItemDCinemaProperties.Visible = true; - } - else - { - toolStripMenuItemDCinemaProperties.Visible = false; - } - - if (ft == typeof(TimedText10) || ft == typeof(ItunesTimedText)) - { - toolStripMenuItemTTProperties.Visible = true; - } - else - { - toolStripMenuItemTTProperties.Visible = false; - } - - toolStripMenuItemNuendoProperties.Visible = format.Name == "Nuendo"; - toolStripMenuItemFcpProperties.Visible = ft == typeof(FinalCutProXml); - - toolStripSeparator20.Visible = subtitleLoaded; - } - - private void toolStripMenuItemOpenContainingFolder_Click(object sender, EventArgs e) - { - UiUtil.OpenFolderFromFileName(_fileName); - } - - private void tabControl1_SelectedIndexChanged(object sender, EventArgs e) - { - if (tabControlButtons.SelectedIndex == 0) - { - tabControlButtons.Width = groupBoxTranslateSearch.Left + groupBoxTranslateSearch.Width + 10; - Configuration.Settings.VideoControls.LastActiveTab = "Translate"; - } - else if (tabControlButtons.SelectedIndex == 1) - { - tabControlButtons.Width = buttonInsertNewText.Left + buttonInsertNewText.Width + 35; - Configuration.Settings.VideoControls.LastActiveTab = "Create"; - } - else if (tabControlButtons.SelectedIndex == 2) - { - tabControlButtons.Width = buttonInsertNewText.Left + buttonInsertNewText.Width + 35; - Configuration.Settings.VideoControls.LastActiveTab = "Adjust"; - } - - if (!_isVideoControlsUndocked) - { - if (toolStripButtonToggleWaveform.Checked) - { - audioVisualizer.Left = tabControlButtons.Left + tabControlButtons.Width + 5; - } - - if (!toolStripButtonToggleWaveform.Checked && toolStripButtonToggleVideo.Checked) - { - panelVideoPlayer.Left = tabControlButtons.Left + tabControlButtons.Width + 5; - panelVideoPlayer.Width = groupBoxVideo.Width - (panelVideoPlayer.Left + 10); - } - - audioVisualizer.Width = groupBoxVideo.Width - (audioVisualizer.Left + 10); - panelWaveformControls.Left = audioVisualizer.Left; - trackBarWaveformPosition.Left = panelWaveformControls.Left + panelWaveformControls.Width + 5; - trackBarWaveformPosition.Width = groupBoxVideo.Width - (trackBarWaveformPosition.Left + 10); - Main_Resize(null, null); - checkBoxSyncListViewWithVideoWhilePlaying.Left = tabControlButtons.Left + tabControlButtons.Width + 5; - if (!_loading) - { - Refresh(); - } - } - else if (_videoControlsUndocked != null && !_videoControlsUndocked.IsDisposed) - { - _videoControlsUndocked.Width = tabControlButtons.Width + 20; - _videoControlsUndocked.Height = tabControlButtons.Height + 65; - } - } - - private void buttonSecBack1_Click(object sender, EventArgs e) - { - GoBackSeconds((double)numericUpDownSec1.Value); - } - - private void buttonForward1_Click(object sender, EventArgs e) - { - GoBackSeconds(-(double)numericUpDownSec1.Value); - } - - private void ButtonSetStartAndOffsetRestClick(object sender, EventArgs e) - { - SetStartAndOffsetTheRest(mediaPlayer.CurrentPosition); - } - - private void SetStartAndOffsetTheRest(double videoPosition) - { - if (SubtitleListview1.SelectedItems.Count == 1) - { - bool oldSync = checkBoxSyncListViewWithVideoWhilePlaying.Checked; - checkBoxSyncListViewWithVideoWhilePlaying.Checked = false; - - timeUpDownStartTime.MaskedTextBox.TextChanged -= MaskedTextBoxTextChanged; - int index = SubtitleListview1.SelectedItems[0].Index; - var oldP = new Paragraph(_subtitle.Paragraphs[index]); - if (!mediaPlayer.IsPaused) - { - videoPosition -= Configuration.Settings.General.SetStartEndHumanDelay / TimeCode.BaseUnit; - } - - var tc = TimeCode.FromSeconds(videoPosition); - timeUpDownStartTime.TimeCode = tc; - - MakeHistoryForUndo(_language.BeforeSetStartTimeAndOffsetTheRest + @" " + oldP.Number + @" - " + tc); - - double offset = oldP.StartTime.TotalMilliseconds - tc.TotalMilliseconds; - - if (oldP.StartTime.IsMaxTime) - { - _subtitle.Paragraphs[index].StartTime.TotalSeconds = videoPosition; - _subtitle.Paragraphs[index].EndTime.TotalMilliseconds = _subtitle.Paragraphs[index].StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(_subtitle.Paragraphs[index].Text); - SubtitleListview1.SetStartTimeAndDuration(index, _subtitle.Paragraphs[index], _subtitle.GetParagraphOrDefault(index + 1), _subtitle.GetParagraphOrDefault(index - 1)); - checkBoxSyncListViewWithVideoWhilePlaying.Checked = oldSync; - timeUpDownStartTime.MaskedTextBox.TextChanged += MaskedTextBoxTextChanged; - RefreshSelectedParagraph(); - return; - } - - _subtitle.Paragraphs[index].StartTime = new TimeCode(_subtitle.Paragraphs[index].StartTime.TotalMilliseconds - offset); - _subtitle.Paragraphs[index].EndTime = new TimeCode(_subtitle.Paragraphs[index].EndTime.TotalMilliseconds - offset); - SubtitleListview1.SetStartTimeAndDuration(index, _subtitle.Paragraphs[index], _subtitle.GetParagraphOrDefault(index + 1), _subtitle.GetParagraphOrDefault(index - 1)); - - for (int i = index + 1; i < SubtitleListview1.Items.Count; i++) - { - if (!_subtitle.Paragraphs[i].StartTime.IsMaxTime) - { - _subtitle.Paragraphs[i].StartTime = new TimeCode(_subtitle.Paragraphs[i].StartTime.TotalMilliseconds - offset); - _subtitle.Paragraphs[i].EndTime = new TimeCode(_subtitle.Paragraphs[i].EndTime.TotalMilliseconds - offset); - SubtitleListview1.SetStartTimeAndDuration(i, _subtitle.Paragraphs[i], _subtitle.GetParagraphOrDefault(i + 1), _subtitle.GetParagraphOrDefault(i - 1)); - } - } - - if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) - { - var original = Utilities.GetOriginalParagraph(index, oldP, _subtitleAlternate.Paragraphs); - if (original != null) - { - index = _subtitleAlternate.GetIndex(original); - for (int i = index; i < _subtitleAlternate.Paragraphs.Count; i++) - { - if (!_subtitleAlternate.Paragraphs[i].StartTime.IsMaxTime) - { - _subtitleAlternate.Paragraphs[i].StartTime = new TimeCode(_subtitleAlternate.Paragraphs[i].StartTime.TotalMilliseconds - offset); - _subtitleAlternate.Paragraphs[i].EndTime = new TimeCode(_subtitleAlternate.Paragraphs[i].EndTime.TotalMilliseconds - offset); - } - } - } - } - - ShowSource(); - checkBoxSyncListViewWithVideoWhilePlaying.Checked = oldSync; - timeUpDownStartTime.MaskedTextBox.TextChanged += MaskedTextBoxTextChanged; - } - } - - private void ButtonSetEndAndGoToNextClick(object sender, EventArgs e) - { - if (SubtitleListview1.SelectedItems.Count == 1) - { - int index = SubtitleListview1.SelectedItems[0].Index; - double videoPosition = mediaPlayer.CurrentPosition; - if (!mediaPlayer.IsPaused) - { - videoPosition -= Configuration.Settings.General.SetStartEndHumanDelay / TimeCode.BaseUnit; - } - - string oldDuration = _subtitle.Paragraphs[index].Duration.ToString(); - var temp = new Paragraph(_subtitle.Paragraphs[index]); - temp.EndTime.TotalMilliseconds = TimeCode.FromSeconds(videoPosition).TotalMilliseconds; - MakeHistoryForUndo(string.Format(_language.DisplayTimeAdjustedX, "#" + _subtitle.Paragraphs[index].Number + ": " + oldDuration + " -> " + temp.Duration)); - _makeHistoryPaused = true; - - if (_subtitle.Paragraphs[index].StartTime.IsMaxTime) - { - timeUpDownStartTime.MaskedTextBox.TextChanged -= MaskedTextBoxTextChanged; - _subtitle.Paragraphs[index].EndTime.TotalSeconds = videoPosition; - _subtitle.Paragraphs[index].StartTime.TotalMilliseconds = _subtitle.Paragraphs[index].EndTime.TotalMilliseconds - Utilities.GetOptimalDisplayMilliseconds(_subtitle.Paragraphs[index].Text); - if (_subtitle.Paragraphs[index].StartTime.TotalMilliseconds < 0) - { - _subtitle.Paragraphs[index].StartTime.TotalMilliseconds = 0; - } - - timeUpDownStartTime.TimeCode = _subtitle.Paragraphs[index].StartTime; - SubtitleListview1.SetStartTimeAndDuration(index, _subtitle.Paragraphs[index], _subtitle.GetParagraphOrDefault(index + 1), _subtitle.GetParagraphOrDefault(index - 1)); - timeUpDownStartTime.MaskedTextBox.TextChanged += MaskedTextBoxTextChanged; - } - else - { - _subtitle.Paragraphs[index].EndTime = TimeCode.FromSeconds(videoPosition); - } - - SubtitleListview1.SetDuration(index, _subtitle.Paragraphs[index], _subtitle.GetParagraphOrDefault(index + 1)); - SetDurationInSeconds(_subtitle.Paragraphs[index].Duration.TotalSeconds); - - if (index + 1 < _subtitle.Paragraphs.Count) - { - SubtitleListview1.SelectIndexAndEnsureVisible(index + 1, true); - } - - _makeHistoryPaused = false; - } - } - - private void ButtonAdjustSecBackClick(object sender, EventArgs e) - { - GoBackSeconds((double)numericUpDownSecAdjust1.Value); - } - - private void ButtonAdjustSecForwardClick(object sender, EventArgs e) - { - GoBackSeconds(-(double)numericUpDownSecAdjust1.Value); - } - - private void StartOrStopAutoBackup() - { - _timerAutoBackup?.Dispose(); - if (Configuration.Settings.General.AutoBackupSeconds > 0) - { - _timerAutoBackup = new Timer(); - _timerAutoBackup.Tick += TimerAutoBackupTick; - _timerAutoBackup.Interval = 1000 * Configuration.Settings.General.AutoBackupSeconds; // take backup every x second if changes were made - _timerAutoBackup.Start(); - } - } - - private void Main_Shown(object sender, EventArgs e) - { - splitContainerListViewAndText.SplitterMoved += splitContainerListViewAndText_SplitterMoved; - splitContainerListViewAndText.SizeChanged += splitContainerListViewAndText_SizeChanged; - - imageListBookmarks.Images.Add(pictureBoxBookmark.Image); - SetListViewStateImages(); - - toolStripButtonToggleVideo.Checked = !Configuration.Settings.General.ShowVideoPlayer; - toolStripButtonToggleVideo_Click(null, null); - - StartOrStopAutoBackup(); - - SetPositionFromXYString(Configuration.Settings.General.UndockedVideoPosition, "VideoPlayerUndocked"); - SetPositionFromXYString(Configuration.Settings.General.UndockedWaveformPosition, "WaveformUndocked"); - SetPositionFromXYString(Configuration.Settings.General.UndockedVideoControlsPosition, "VideoControlsUndocked"); - if (Configuration.Settings.General.Undocked && Configuration.Settings.General.StartRememberPositionAndSize) - { - Configuration.Settings.General.Undocked = false; - UndockVideoControlsToolStripMenuItemClick(null, null); - if (Configuration.Settings.General.UndockedVideoFullscreen) - { - GoFullscreen(true); - } - } - - Main_Resize(null, null); - - toolStripButtonLockCenter.Checked = Configuration.Settings.General.WaveformCenter; - audioVisualizer.Locked = toolStripButtonLockCenter.Checked; - - numericUpDownSec1.Value = (decimal)(Configuration.Settings.General.SmallDelayMilliseconds / TimeCode.BaseUnit); - numericUpDownSec2.Value = (decimal)(Configuration.Settings.General.LargeDelayMilliseconds / TimeCode.BaseUnit); - - numericUpDownSecAdjust1.Value = (decimal)(Configuration.Settings.General.SmallDelayMilliseconds / TimeCode.BaseUnit); - numericUpDownSecAdjust2.Value = (decimal)(Configuration.Settings.General.LargeDelayMilliseconds / TimeCode.BaseUnit); - - SetShortcuts(); - MainResize(); - _loading = false; - OpenVideo(VideoFileName); - ShowSubtitleTimer.Stop(); - lock (_syncUndo) - { - timerTextUndo.Start(); - timerAlternateTextUndo.Start(); - } - - if (Configuration.IsRunningOnLinux) - { - numericUpDownDuration.Left = timeUpDownStartTime.Left + timeUpDownStartTime.Width + 10; - numericUpDownDuration.Width += 10; - numericUpDownSec1.Width += 10; - numericUpDownSec2.Width += 10; - numericUpDownSecAdjust1.Width += 10; - numericUpDownSecAdjust2.Width += 10; - labelDuration.Left = numericUpDownDuration.Left; - } - - _timerDoSyntaxColoring.Interval = 100; - _timerDoSyntaxColoring.Tick += _timerDoSyntaxColoring_Tick; - - var showBeta = Configuration.Settings.General.ShowBetaStuff; - generateDatetimeInfoFromVideoToolStripMenuItem.Visible = showBeta; - toolStripMenuItemExportCaptionInc.Visible = showBeta; - toolStripMenuItemExportUltech130.Visible = showBeta; - toolStripMenuItemInverseSelection.Visible = showBeta; - toolStripMenuItemSpellCheckFromCurrentLine.Visible = showBeta; - toolStripMenuItemImportOcrHardSub.Visible = showBeta; - toolStripMenuItemOpenDvd.Visible = showBeta; - - if (Configuration.Settings.General.StartRememberPositionAndSize && - Configuration.Settings.General.SplitContainerMainSplitterDistance > 0 && - Configuration.Settings.General.SplitContainer1SplitterDistance > 0 && - Configuration.Settings.General.SplitContainerListViewAndTextSplitterDistance > 0) - { - splitContainerMain.SplitterDistance = Configuration.Settings.General.SplitContainerMainSplitterDistance; - splitContainer1.SplitterDistance = Configuration.Settings.General.SplitContainer1SplitterDistance; - splitContainerListViewAndText.SplitterDistance = Configuration.Settings.General.SplitContainerListViewAndTextSplitterDistance; - } - - mediaPlayer.InitializeVolume(Configuration.Settings.General.VideoPlayerDefaultVolume); - tabControlSubtitle.Invalidate(); - - if (string.IsNullOrEmpty(Configuration.Settings.Language.CheckForUpdates.CheckingForUpdates)) - { - checkForUpdatesToolStripMenuItem.Visible = false; - toolStripMenuItemSplitterCheckForUpdates.Visible = false; - } - else if (Configuration.Settings.General.CheckForUpdates && Configuration.Settings.General.LastCheckForUpdates < DateTime.Now.AddDays(-5)) - { - _checkForUpdatesHelper = new CheckForUpdatesHelper(); - _checkForUpdatesHelper.CheckForUpdates(); - _timerCheckForUpdates = new Timer(); - _timerCheckForUpdates.Interval = 7000; - _timerCheckForUpdates.Tick += TimerCheckForUpdatesTick; - _timerCheckForUpdates.Start(); - Configuration.Settings.General.LastCheckForUpdates = DateTime.Now; - } - - _dragAndDropTimer.Interval = 50; - _dragAndDropTimer.Tick += DoSubtitleListview1Drop; - - _dragAndDropVideoTimer.Interval = 50; - _dragAndDropVideoTimer.Tick += DropVideoTick; - - if (_exitWhenLoaded) - { - Application.Exit(); - } - - // Fix some large font issue - if (numericUpDownDuration.Left + numericUpDownDuration.Width > textBoxListViewText.Left) - { - numericUpDownDuration.Left = timeUpDownStartTime.Left + timeUpDownStartTime.Width + 5; - numericUpDownDuration.Width = textBoxListViewText.Left - numericUpDownDuration.Left - 5; - labelDuration.Left = numericUpDownDuration.Left; - } - - if (string.IsNullOrEmpty(_fileName) && (_subtitle == null || _subtitle.Paragraphs.Count == 0)) - { - _changeSubtitleHash = _subtitle.GetFastHashCode(GetCurrentEncoding().BodyName); - } - - comboBoxSubtitleFormats.AutoCompleteSource = AutoCompleteSource.ListItems; - comboBoxSubtitleFormats.AutoCompleteMode = AutoCompleteMode.Append; - InitializePlayRateDropDown(); - - LoadPlugins(); - - mediaPlayer.OnEmptyPlayerClicked += MediaPlayer_OnEmptyPlayerClicked; - SubtitleListview1.SelectIndexAndEnsureVisible(_subtitleListViewIndex, true); - if (Configuration.Settings.General.StartInSourceView) - { - textBoxSource.Focus(); - } - else - { - SubtitleListview1.Focus(); - } - - UiUtil.FixFonts(toolStripComboBoxWaveform); - UiUtil.FixFonts(toolStripComboBoxFrameRate); - UiUtil.FixFonts(comboBoxSubtitleFormats); - UiUtil.FixFonts(comboBoxEncoding); - UiUtil.FixFonts(toolStripSplitButtonPlayRate); - - _lastTextKeyDownTicks = DateTime.UtcNow.Ticks; - if (_subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) - { - var idx = _subtitleListViewIndex; - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - SubtitleListview1.SelectIndexAndEnsureVisibleFaster(idx); - } - - SetTitle(); - labelSingleLine.Left = labelTextLineLengths.Left + labelTextLineLengths.Width - 6; - RemoveNotExistingFilesFromRecentFilesUI(); - ShowSubtitleTimer.Start(); - } - - private void InitializePlayRateDropDown() - { - toolStripSplitButtonPlayRate.DropDownItems.Clear(); - var foreColor = UiUtil.ForeColor; - var backColor = UiUtil.BackColor; - for (int i = 30; i <= 300; i += 10) - { - toolStripSplitButtonPlayRate.DropDownItems.Add(new ToolStripMenuItem(i + "%", null, SetPlayRate) { Checked = i == 100, BackColor = backColor, ForeColor = foreColor }); - } - } - - private void MediaPlayer_OnEmptyPlayerClicked(object sender, EventArgs e) - { - if (string.IsNullOrEmpty(VideoFileName)) - { - buttonOpenVideo_Click(sender, e); - } - } - - private void SetPlayRate(object sender, EventArgs e) - { - SetPlayRate(sender, e, false); - } - - private void SetPlayRate(object sender, EventArgs e, bool skipStatusMessage) - { - if (!(sender is ToolStripMenuItem playRateDropDownItem) || mediaPlayer == null || mediaPlayer.VideoPlayer == null) - { - return; - } - - foreach (ToolStripMenuItem item in toolStripSplitButtonPlayRate.DropDownItems) - { - item.Checked = false; - } - - playRateDropDownItem.Checked = true; - var percentText = playRateDropDownItem.Text.TrimEnd('%'); - if (!skipStatusMessage) - { - ShowStatus(string.Format(_language.SetPlayRateX, percentText)); - } - - var factor = double.Parse(percentText) / 100.0; - toolStripSplitButtonPlayRate.Image = Math.Abs(factor - 1) < 0.01 ? imageListPlayRate.Images[0] : imageListPlayRate.Images[1]; - mediaPlayer.VideoPlayer.PlayRate = factor; - } - - private void TimerCheckForUpdatesTick(object sender, EventArgs e) - { - _timerCheckForUpdates.Stop(); - if (_checkForUpdatesHelper.IsUpdateAvailable()) - { - using (var form = new CheckForUpdates(this, _checkForUpdatesHelper)) - { - form.ShowDialog(this); - } - } - - _checkForUpdatesHelper = null; - _timerCheckForUpdates = null; - } - - private void _timerDoSyntaxColoring_Tick(object sender, EventArgs e) - { - UpdateListSyntaxColoring(); - _timerDoSyntaxColoring.Stop(); - } - - private static void SetPositionFromXYString(string positionAndSize, string name) - { - var parts = positionAndSize.Split(';'); - if (parts.Length == 4) - { - if (int.TryParse(parts[0], out var left) - && int.TryParse(parts[1], out var top) - && int.TryParse(parts[2], out var width) - && int.TryParse(parts[3], out var height)) - { - PositionAndSizeForm.SetPositionAndSize(name, new Rectangle(left, top, width, height)); - } - else - { - System.Diagnostics.Debug.WriteLine("Could not set position and size for '{0}'.", name); - } - } - } - - private void SetShortcuts() - { - _shortcuts.SetShortcuts(); - newToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainFileNew); - openToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainFileOpen); - toolStripMenuItemOpenKeepVideo.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainFileOpenKeepVideo); - saveToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainFileSave); - saveOriginalToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainFileSaveOriginal); - saveOriginalAstoolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainFileSaveOriginalAs); - saveAsToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainFileSaveAs); - openOriginalToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainFileOpenOriginal); - removeOriginalToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainFileCloseOriginal); - toolStripMenuItemCompare.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainFileCompare); - toolStripMenuItemImportText.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainFileImportPlainText); - toolStripMenuItemImportTimeCodes.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainFileImportTimeCodes); - eBUSTLToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainFileExportEbu); - pACScreenElectronicsToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainFileExportPac); - plainTextToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainFileExportPlainText); - - toolStripMenuItemUndo.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainEditUndo); - toolStripMenuItemRedo.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainEditRedo); - findToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainEditFind); - findNextToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainEditFindNext); - replaceToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainEditReplace); - multipleReplaceToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainEditMultipleReplace); - gotoLineNumberToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainEditGoToLineNumber); - toolStripMenuItemRightToLeftMode.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainEditRightToLeft); - toolStripMenuItemShowOriginalInPreview.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainEditToggleTranslationOriginalInPreviews); - toolStripMenuItemInverseSelection.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainEditInverseSelection); - toolStripMenuItemModifySelection.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainEditModifySelection); - - fixToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainToolsFixCommonErrors); - toolStripMenuItemAutoMergeShortLines.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainToolsMergeShortLines); - toolStripMenuItemMergeDuplicateText.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainToolsMergeDuplicateText); - toolStripMenuItemMergeLinesWithSameTimeCodes.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainToolsMergeSameTimeCodes); - toolStripMenuItemMakeEmptyFromCurrent.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainToolsMakeEmptyFromCurrent); - toolStripMenuItemAutoSplitLongLines.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainToolsSplitLongLines); - toolStripMenuItemSubtitlesBridgeGaps.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainToolsDurationsBridgeGap); - setMinimumDisplayTimeBetweenParagraphsToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainToolsMinimumDisplayTimeBetweenParagraphs); - startNumberingFromToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainToolsRenumber); - removeTextForHearImpairedToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainToolsRemoveTextForHI); - ChangeCasingToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainToolsChangeCasing); - toolStripMenuItemShowOriginalInPreview.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainEditToggleTranslationOriginalInPreviews); - toolStripMenuItemBatchConvert.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainToolsBatchConvert); - toolStripMenuItemMeasurementConverter.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainToolsMeasurementConverter); - splitToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainToolsSplit); - appendTextVisuallyToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainToolsAppend); - joinSubtitlesToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainToolsJoin); - - openVideoToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainVideoOpen); - closeVideoToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainVideoClose); - showhideVideoToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainVideoShowHideVideo); - toolStripMenuItemBookmark.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.GeneralToggleBookmarksWithText); - - spellCheckToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainSpellCheck); - findDoubleWordsToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainSpellCheckFindDoubleWords); - addWordToNameListToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainSpellCheckAddWordToNames); - - translateByGoogleToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainTranslateGoogleTranslate); - - toolStripMenuItemAdjustAllTimes.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainSynchronizationAdjustTimes); - visualSyncToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainSynchronizationVisualSync); - toolStripMenuItemPointSync.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainSynchronizationPointSync); - pointSyncViaOtherSubtitleToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainSynchronizationPointSyncViaFile); - toolStripMenuItemChangeFrameRate2.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainSynchronizationChangeFrameRate); - italicToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewItalic); - removeAllFormattingsToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainRemoveFormatting); - boldToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewBold); - boldToolStripMenuItem1.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewBold); - underlineToolStripMenuItem1.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewUnderline); - underlineToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewUnderline); - boxToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewBox); - boxToolStripMenuItem1.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewBox); - splitLineToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewSplit); - toolStripMenuItemSurroundWithMusicSymbols.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewToggleMusicSymbols); - toolStripMenuItemAlignment.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewAlignment); - copyOriginalTextToCurrentToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewCopyTextFromOriginalToCurrent); - columnDeleteTextOnlyToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewColumnDeleteText); - toolStripMenuItemColumnDeleteText.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewColumnDeleteTextAndShiftUp); - ShiftTextCellsDownToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewColumnInsertText); - toolStripMenuItemPasteSpecial.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewColumnPaste); - toolStripMenuItemRuby.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainTextBoxSelectionToRuby); - moveTextUpToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewColumnTextUp); - moveTextDownToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewColumnTextDown); - toolStripMenuItemReverseRightToLeftStartEnd.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainEditReverseStartAndEndingForRTL); - italicToolStripMenuItem1.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainTextBoxItalic); - - audioVisualizer.InsertAtVideoPositionShortcut = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainWaveformInsertAtCurrentPosition); - audioVisualizer.Move100MsLeft = UiUtil.GetKeys(Configuration.Settings.Shortcuts.Waveform100MsLeft); - audioVisualizer.Move100MsRight = UiUtil.GetKeys(Configuration.Settings.Shortcuts.Waveform100MsRight); - audioVisualizer.MoveOneSecondLeft = UiUtil.GetKeys(Configuration.Settings.Shortcuts.Waveform1000MsLeft); - audioVisualizer.MoveOneSecondRight = UiUtil.GetKeys(Configuration.Settings.Shortcuts.Waveform1000MsRight); - - UiUtil.HelpKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.GeneralHelp); - helpToolStripMenuItem1.ShortcutKeys = UiUtil.HelpKeys; - - - // shortcut hints - if (!string.IsNullOrEmpty(Configuration.Settings.Shortcuts.MainAdjustSetStartAndOffsetTheRest2) && Configuration.Settings.Shortcuts.MainAdjustSetStartAndOffsetTheRest2.Length < 5) - { - labelAdjustF9.Text = Configuration.Settings.Shortcuts.MainAdjustSetStartAndOffsetTheRest2; - } - else if (!string.IsNullOrEmpty(Configuration.Settings.Shortcuts.MainAdjustSetStartAndOffsetTheRest) && Configuration.Settings.Shortcuts.MainAdjustSetStartAndOffsetTheRest.Length < 5) - { - labelAdjustF9.Text = Configuration.Settings.Shortcuts.MainAdjustSetStartAndOffsetTheRest; - } - else - { - labelAdjustF9.Text = string.Empty; - } - - if (!string.IsNullOrEmpty(Configuration.Settings.Shortcuts.MainAdjustSetEndAndGotoNext) && Configuration.Settings.Shortcuts.MainAdjustSetEndAndGotoNext.Length < 5) - { - labelAdjustF10.Text = Configuration.Settings.Shortcuts.MainAdjustSetEndAndGotoNext; - } - else - { - labelAdjustF10.Text = string.Empty; - } - - if (!string.IsNullOrEmpty(Configuration.Settings.Shortcuts.MainCreateSetStart) && Configuration.Settings.Shortcuts.MainCreateSetStart.Length < 5) - { - labelAdjustF11.Text = Configuration.Settings.Shortcuts.MainCreateSetStart; - labelCreateF11.Text = Configuration.Settings.Shortcuts.MainCreateSetStart; - } - else - { - labelAdjustF11.Text = string.Empty; - labelCreateF11.Text = string.Empty; - } - - if (!string.IsNullOrEmpty(Configuration.Settings.Shortcuts.MainCreateSetEnd) && Configuration.Settings.Shortcuts.MainCreateSetEnd.Length < 5) - { - labelAdjustF12.Text = Configuration.Settings.Shortcuts.MainCreateSetEnd; - labelCreateF12.Text = Configuration.Settings.Shortcuts.MainCreateSetEnd; - } - else - { - labelAdjustF12.Text = string.Empty; - labelCreateF12.Text = string.Empty; - } - - if (!string.IsNullOrEmpty(Configuration.Settings.Shortcuts.MainCreateInsertSubAtVideoPos) && Configuration.Settings.Shortcuts.MainCreateInsertSubAtVideoPos.Length < 5) - { - labelCreateF9.Text = Configuration.Settings.Shortcuts.MainCreateInsertSubAtVideoPos; - } - else - { - labelCreateF9.Text = string.Empty; - } - - if (!string.IsNullOrEmpty(Configuration.Settings.Shortcuts.MainVideoPlayFromJustBefore) && Configuration.Settings.Shortcuts.MainVideoPlayFromJustBefore.Length < 5) - { - labelCreateF10.Text = Configuration.Settings.Shortcuts.MainVideoPlayFromJustBefore; - } - else - { - labelCreateF10.Text = string.Empty; - } - } - - public static object GetPropertiesAndDoAction(string pluginFileName, out string name, out string text, out decimal version, out string description, out string actionType, out string shortcut, out System.Reflection.MethodInfo mi) - { - name = null; - text = null; - version = 0; - description = null; - actionType = null; - shortcut = null; - mi = null; - Assembly assembly; - try - { - assembly = Assembly.Load(File.ReadAllBytes(pluginFileName)); - } - catch - { - return null; - } - - // note: *objectName must not include path or file extension - string objectName = Path.GetFileNameWithoutExtension(pluginFileName); - if (assembly != null) - { - Type pluginType = assembly.GetType("Nikse.SubtitleEdit.PluginLogic." + objectName); - if (pluginType == null) - { - return null; - } - - object pluginObject = Activator.CreateInstance(pluginType); - - // IPlugin - var t = pluginType.GetInterface("IPlugin"); - if (t == null) - { - return null; - } - - PropertyInfo pi = t.GetProperty("Name"); - if (pi != null) - { - name = (string)pi.GetValue(pluginObject, null); - } - - pi = t.GetProperty("Text"); - if (pi != null) - { - text = (string)pi.GetValue(pluginObject, null); - } - - pi = t.GetProperty("Description"); - if (pi != null) - { - description = (string)pi.GetValue(pluginObject, null); - } - - pi = t.GetProperty("Version"); - if (pi != null) - { - version = Convert.ToDecimal(pi.GetValue(pluginObject, null)); - } - - pi = t.GetProperty("ActionType"); - if (pi != null) - { - actionType = (string)pi.GetValue(pluginObject, null); - } - - mi = t.GetMethod("DoAction"); - - pi = t.GetProperty("Shortcut"); - if (pi != null) - { - shortcut = (string)pi.GetValue(pluginObject, null); - } - - return pluginObject; - } - - return null; - } - - private void LoadPlugins() - { - var path = Configuration.PluginsDirectory; - if (!Directory.Exists(path)) - { - return; - } - - UiUtil.CleanUpMenuItemPlugin(fileToolStripMenuItem); - UiUtil.CleanUpMenuItemPlugin(toolsToolStripMenuItem); - UiUtil.CleanUpMenuItemPlugin(toolStripMenuItemSpellCheckMain); - UiUtil.CleanUpMenuItemPlugin(toolStripMenuItemSynchronization); - UiUtil.CleanUpMenuItemPlugin(toolStripMenuItemAutoTranslate); - UiUtil.CleanUpMenuItemPlugin(toolStripMenuItemTranslateSelected); - - var fileMenuItems = new List(); - var toolsMenuItems = new List(); - var translateMenuItems = new List(); - var translateSelectedLinesMenuItems = new List(); - var syncMenuItems = new List(); - var spellCheckMenuItems = new List(); - - foreach (var pluginFileName in Directory.GetFiles(path, "*.DLL")) - { - try - { - GetPropertiesAndDoAction(pluginFileName, out var name, out var text, out var version, out var description, out var actionType, out var shortcut, out var mi); - if (!string.IsNullOrEmpty(name) && !string.IsNullOrEmpty(actionType) && mi != null) - { - var item = new ToolStripMenuItem { Text = text, Tag = pluginFileName }; - UiUtil.FixFonts(item); - - if (!string.IsNullOrEmpty(shortcut)) - { - item.ShortcutKeys = UiUtil.GetKeys(shortcut); - } - - if (actionType.Equals("File", StringComparison.OrdinalIgnoreCase)) - { - AddSeparator(fileMenuItems.Count, fileToolStripMenuItem, 2); - item.Click += PluginToolClick; - fileMenuItems.Add(item); - } - else if (actionType.Equals("Tool", StringComparison.OrdinalIgnoreCase)) - { - AddSeparator(toolsMenuItems.Count, toolsToolStripMenuItem); - item.Click += PluginToolClick; - toolsMenuItems.Add(item); - } - else if (actionType.Equals("Sync", StringComparison.OrdinalIgnoreCase)) - { - AddSeparator(syncMenuItems.Count, toolStripMenuItemSynchronization); - item.Click += PluginToolClick; - syncMenuItems.Add(item); - } - else if (actionType.Equals("Translate", StringComparison.OrdinalIgnoreCase)) - { - AddSeparator(translateMenuItems.Count, toolStripMenuItemAutoTranslate); - item.Click += PluginClickTranslate; - translateMenuItems.Add(item); - - // selected lines - item = new ToolStripMenuItem(); - item.Text = text; - item.Tag = pluginFileName; - UiUtil.FixFonts(item); - AddSeparator(translateMenuItems.Count - 1, toolStripMenuItemTranslateSelected); - item.Click += PluginClickTranslateSelectedLines; - translateSelectedLinesMenuItems.Add(item); - } - else if (actionType.Equals("SpellCheck", StringComparison.OrdinalIgnoreCase)) - { - AddSeparator(spellCheckMenuItems.Count, toolStripMenuItemSpellCheckMain); - item.Click += PluginClickNoFormatChange; - spellCheckMenuItems.Add(item); - } - } - } - catch (Exception exception) - { - MessageBox.Show(string.Format(_language.ErrorLoadingPluginXErrorY, pluginFileName, exception.Message)); - } - } - foreach (var fileMenuItem in fileMenuItems) - { - fileToolStripMenuItem.DropDownItems.Insert(fileToolStripMenuItem.DropDownItems.Count - 2, fileMenuItem); - } - toolsToolStripMenuItem.DropDownItems.AddRange(toolsMenuItems.OrderBy(p => p.Text).ToArray()); - toolStripMenuItemAutoTranslate.DropDownItems.AddRange(translateMenuItems.OrderBy(p => p.Text).ToArray()); - toolStripMenuItemTranslateSelected.DropDownItems.AddRange(translateSelectedLinesMenuItems.OrderBy(p => p.Text).ToArray()); - toolStripMenuItemSynchronization.DropDownItems.AddRange(syncMenuItems.OrderBy(p => p.Text).ToArray()); - toolStripMenuItemSpellCheckMain.DropDownItems.AddRange(spellCheckMenuItems.OrderBy(p => p.Text).ToArray()); - } - - private void AddSeparator(int pluginCount, ToolStripMenuItem parent, int? relativeOffset = null) - { - if (pluginCount == 0) - { - var tss = new ToolStripSeparator(); - if (relativeOffset == null) - { - if (parent.DropDownItems.Count > 0 && parent.DropDownItems[parent.DropDownItems.Count - 1].GetType() == typeof(ToolStripSeparator)) - { - return; // don't app separator after separator - } - - parent.DropDownItems.Add(tss); - } - else - { - if (parent.DropDownItems.Count - relativeOffset.Value >= 0 && - relativeOffset.Value < parent.DropDownItems.Count && - parent.DropDownItems.Count > 0 && - parent.DropDownItems[parent.DropDownItems.Count - relativeOffset.Value].GetType() == typeof(ToolStripSeparator)) - { - return; // don't app separator after separator - } - - parent.DropDownItems.Insert(parent.DropDownItems.Count - relativeOffset.Value, tss); - } - - UiUtil.FixFonts(tss); - } - } - - private void PluginToolClick(object sender, EventArgs e) - { - CallPlugin(sender, true, false); - } - - private void PluginClickNoFormatChange(object sender, EventArgs e) - { - CallPlugin(sender, false, false); - } - - private void PluginClickTranslate(object sender, EventArgs e) - { - CallPlugin(sender, false, true); - } - - private void PluginClickTranslateSelectedLines(object sender, EventArgs e) - { - CallPluginTranslateSelectedLines(sender); - } - - private void CallPlugin(object sender, bool allowChangeFormat, bool translate) - { - try - { - var item = (ToolStripItem)sender; - var pluginObject = GetPropertiesAndDoAction(item.Tag.ToString(), out var name, out var text, out var version, out var description, out var actionType, out var shortcut, out var mi); - if (mi == null) - { - return; - } - - string rawText = null; - var format = GetCurrentSubtitleFormat(); - if (format != null) - { - rawText = _subtitle.ToText(format); - } - - string pluginResult = (string)mi.Invoke(pluginObject, - new object[] - { - this, - _subtitle.ToText(new SubRip()), - Configuration.Settings.General.CurrentFrameRate, - Configuration.Settings.General.ListViewLineSeparatorString, - _fileName, - VideoFileName, - rawText - }); - - if (!string.IsNullOrEmpty(pluginResult) && pluginResult.Length > 10 && text != pluginResult) - { - var lines = new List(pluginResult.SplitToLines()); - - MakeHistoryForUndo(string.Format(_language.BeforeRunningPluginXVersionY, name, version)); - - var s = new Subtitle(); - SubtitleFormat newFormat = null; - foreach (var subtitleFormat in SubtitleFormat.AllSubtitleFormats) - { - if (subtitleFormat.IsMine(lines, null)) - { - subtitleFormat.LoadSubtitle(s, lines, null); - newFormat = subtitleFormat; - break; - } - } - - if (translate) - { - _subtitleAlternate = new Subtitle(_subtitle); - _subtitleAlternateFileName = _fileName; - - var language = LanguageAutoDetect.AutoDetectGoogleLanguageOrNull(s); - if (language != null && !string.IsNullOrEmpty(_fileName)) - { - _fileName = Utilities.GetPathAndFileNameWithoutExtension(_fileName); - var oldLang = "." + LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitleAlternate); - if (oldLang.Length == 3 && _fileName.EndsWith(oldLang, StringComparison.OrdinalIgnoreCase)) - { - _fileName = _fileName.Remove(_fileName.Length - 3); - } - - _fileName += "." + language + GetCurrentSubtitleFormat().Extension; - } - else - { - _fileName = null; - } - - _subtitle.Paragraphs.Clear(); - foreach (var p in s.Paragraphs) - { - _subtitle.Paragraphs.Add(new Paragraph(p)); - } - - ShowStatus(_language.SubtitleTranslated); - ShowSource(); - SubtitleListview1.ShowAlternateTextColumn(_languageGeneral.OriginalText); - SubtitleListview1.AutoSizeAllColumns(this); - SetupAlternateEdit(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - ResetHistory(); - RestoreSubtitleListviewIndices(); - _converted = true; - SetTitle(); - return; - } - - if (newFormat != null) - { - if (allowChangeFormat && newFormat.GetType() == typeof(SubRip) && IsOnlyTextChanged(_subtitle, s)) - { - allowChangeFormat = false; - } - - if (!allowChangeFormat && IsOnlyTextChanged(_subtitle, s)) - { - for (int k = 0; k < s.Paragraphs.Count; k++) - { - _subtitle.Paragraphs[k].Text = s.Paragraphs[k].Text; - } - } - else - { - _subtitle.Paragraphs.Clear(); - _subtitle.Header = s.Header; - _subtitle.Footer = s.Footer; - foreach (var p in s.Paragraphs) - { - _subtitle.Paragraphs.Add(p); - } - } - - if (allowChangeFormat) - { - SetCurrentFormat(newFormat); - } - - SaveSubtitleListviewIndices(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - ShowSource(); - - ShowStatus(string.Format(_language.PluginXExecuted, name)); - } - else - { - MessageBox.Show(_language.UnableToReadPluginResult); - } - } - } - catch (Exception exception) - { - MessageBox.Show(exception.Message + Environment.NewLine + exception.StackTrace); - if (exception.InnerException != null) - { - MessageBox.Show(exception.InnerException.Message + Environment.NewLine + exception.InnerException.StackTrace); - } - } - } - - private void CallPluginTranslateSelectedLines(object sender) - { - try - { - var item = (ToolStripItem)sender; - var pluginObject = GetPropertiesAndDoAction(item.Tag.ToString(), out var name, out var text, out var version, out var description, out var actionType, out var shortcut, out var mi); - if (mi == null) - { - return; - } - - SaveSubtitleListviewIndices(); - var selectedLines = new Subtitle(); - foreach (int index in SubtitleListview1.SelectedIndices) - { - var p = _subtitle.Paragraphs[index]; - if (_subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) - { - var original = Utilities.GetOriginalParagraph(index, p, _subtitleAlternate.Paragraphs); - if (original != null) - { - p = original; - } - else - { - p = new Paragraph(string.Empty, p.StartTime.TotalMilliseconds, p.EndTime.TotalMilliseconds); - } - } - - selectedLines.Paragraphs.Add(p); - } - - string rawText = null; - SubtitleFormat format = GetCurrentSubtitleFormat(); - if (format != null) - { - rawText = selectedLines.ToText(format); - } - - string pluginResult = (string)mi.Invoke(pluginObject, - new object[] - { - this, - selectedLines.ToText(new SubRip()), - Configuration.Settings.General.CurrentFrameRate, - Configuration.Settings.General.ListViewLineSeparatorString, - _fileName, - VideoFileName, - rawText - }); - - if (!string.IsNullOrEmpty(pluginResult) && pluginResult.Length > 10 && text != pluginResult) - { - var lines = new List(pluginResult.SplitToLines()); - MakeHistoryForUndo(string.Format(_language.BeforeRunningPluginXVersionY, name, version)); - var s = new Subtitle(); - var f = new SubRip(); - if (f.IsMine(lines, null)) - { - f.LoadSubtitle(s, lines, null); - - // we only update selected lines - int i = 0; - foreach (int index in SubtitleListview1.SelectedIndices) - { - _subtitle.Paragraphs[index] = s.Paragraphs[i]; - i++; - } - - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - ShowStatus(string.Format(_language.PluginXExecuted, name)); - } - } - } - catch (Exception exception) - { - MessageBox.Show(exception.Message + Environment.NewLine + exception.StackTrace); - if (exception.InnerException != null) - { - MessageBox.Show(exception.InnerException.Message + Environment.NewLine + exception.InnerException.StackTrace); - } - } - } - - private bool IsOnlyTextChanged(Subtitle s1, Subtitle s2) - { - if (s1.Paragraphs.Count != s2.Paragraphs.Count) - { - return false; - } - - for (int i = 0; i < s1.Paragraphs.Count; i++) - { - var p1 = s1.Paragraphs[i]; - var p2 = s2.Paragraphs[i]; - if (Math.Abs(p1.StartTime.TotalMilliseconds - p2.StartTime.TotalMilliseconds) > 0.01) - { - return false; - } - - if (Math.Abs(p1.EndTime.TotalMilliseconds - p2.EndTime.TotalMilliseconds) > 0.01) - { - return false; - } - } - - return true; - } - - private string _lastWrittenAutoBackup = string.Empty; - private bool _showAutoBackupError = true; - - private void TimerAutoBackupTick(object sender, EventArgs e) - { - string currentText = string.Empty; - if (_subtitle != null && _subtitle.Paragraphs.Count > 0) - { - var saveFormat = GetCurrentSubtitleFormat(); - if (!saveFormat.IsTextBased) - { - saveFormat = new SubRip(); - } - - currentText = _subtitle.ToText(saveFormat); - if (_textAutoBackup == null) - { - _textAutoBackup = currentText; - } - - if ((Configuration.Settings.General.AutoSave || - !string.IsNullOrEmpty(_textAutoBackup) && currentText.Trim() != _textAutoBackup.Trim() && !string.IsNullOrWhiteSpace(currentText)) && - _lastWrittenAutoBackup != currentText) - { - if (!Directory.Exists(Configuration.AutoBackupDirectory)) - { - try - { - Directory.CreateDirectory(Configuration.AutoBackupDirectory); - } - catch (Exception exception) - { - MessageBox.Show(string.Format(_language.UnableToCreateBackupDirectory, Configuration.AutoBackupDirectory, exception.Message)); - return; - } - } - - string title = string.Empty; - if (!string.IsNullOrEmpty(_fileName)) - { - title = "_" + Path.GetFileNameWithoutExtension(_fileName); - } - - string fileName = string.Format("{0}{1:0000}-{2:00}-{3:00}_{4:00}-{5:00}-{6:00}{7}{8}", Configuration.AutoBackupDirectory, DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second, title, saveFormat.Extension); - try - { - File.WriteAllText(fileName, currentText); - _lastWrittenAutoBackup = currentText; - } - catch (Exception exception) - { - if (_showAutoBackupError) - { - MessageBox.Show("Unable to save auto-backup to file: " + fileName + Environment.NewLine + - Environment.NewLine + - exception.Message + Environment.NewLine + exception.StackTrace); - _showAutoBackupError = false; - } - } - - if (!_cleanupHasRun) - { - // let the cleanup process be handled by worker thread - System.Threading.Tasks.Task.Factory.StartNew(() => { RestoreAutoBackup.CleanAutoBackupFolder(Configuration.AutoBackupDirectory, Configuration.Settings.General.AutoBackupDeleteAfterMonths); }); - _cleanupHasRun = true; - } - } - } - - _textAutoBackup = currentText; - - if (_subtitleAlternateFileName != null && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) - { - var saveFormat = GetCurrentSubtitleFormat(); - if (!saveFormat.IsTextBased) - { - saveFormat = new SubRip(); - } - - string currentTextAlternate = _subtitleAlternate.ToText(saveFormat); - if (_subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) - { - if (_textAutoBackupOriginal == null) - { - _textAutoBackupOriginal = currentTextAlternate; - } - - if (Configuration.Settings.General.AutoSave || - !string.IsNullOrEmpty(_textAutoBackupOriginal) && currentTextAlternate.Trim() != _textAutoBackupOriginal.Trim() && !string.IsNullOrWhiteSpace(currentTextAlternate)) - { - if (!Directory.Exists(Configuration.AutoBackupDirectory)) - { - try - { - Directory.CreateDirectory(Configuration.AutoBackupDirectory); - } - catch (Exception exception) - { - MessageBox.Show(string.Format(_language.UnableToCreateBackupDirectory, Configuration.AutoBackupDirectory, exception.Message)); - return; - } - } - - string title = string.Empty; - if (!string.IsNullOrEmpty(_subtitleAlternateFileName)) - { - title = "_" + Path.GetFileNameWithoutExtension(_subtitleAlternateFileName); - } - - string fileName = string.Format("{0}{1:0000}-{2:00}-{3:00}_{4:00}-{5:00}-{6:00}{7}{8}", Configuration.AutoBackupDirectory, DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second, "_Original" + title, saveFormat.Extension); - File.WriteAllText(fileName, currentTextAlternate); - } - } - - _textAutoBackupOriginal = currentTextAlternate; - } - } - - private void DropVideoTick(object sender, EventArgs e) - { - _dragAndDropVideoTimer.Stop(); - OpenVideo(VideoFileName); - } - - private void mediaPlayer_DragDrop(object sender, DragEventArgs e) - { - var files = (string[])e.Data.GetData(DataFormats.FileDrop); - if (files.Length == 1) - { - string fileName = files[0]; - string ext = Path.GetExtension(fileName).ToLowerInvariant(); - if (Utilities.GetVideoFileFilter(true).Contains(ext)) - { - if (string.IsNullOrEmpty(_fileName)) - { - var dirName = Path.GetDirectoryName(fileName); - saveFileDialog1.InitialDirectory = dirName; - openFileDialog1.InitialDirectory = dirName; - } - - VideoFileName = fileName; - _dragAndDropVideoTimer.Start(); - } - else - { - try - { - var fi = new FileInfo(fileName); - if (fi.Length < Subtitle.MaxFileSize) - { - var lines = new List(File.ReadAllLines(fileName)); - foreach (SubtitleFormat format in SubtitleFormat.AllSubtitleFormats) - { - if (format.IsMine(lines, fileName)) - { - OpenSubtitle(fileName, null); - return; - } - } - } - } - catch - { - } - - MessageBox.Show(string.Format(_language.DropFileXNotAccepted, fileName)); - } - } - else - { - MessageBox.Show(_language.DropOnlyOneFile); - } - } - - private void mediaPlayer_DragEnter(object sender, DragEventArgs e) - { - // make sure they're actually dropping files (not text or anything else) - if (e.Data.GetDataPresent(DataFormats.FileDrop, false)) - { - e.Effect = DragDropEffects.All; - } - } - - private void buttonSecBack2_Click(object sender, EventArgs e) - { - GoBackSeconds((double)numericUpDownSec2.Value); - } - - private void buttonForward2_Click(object sender, EventArgs e) - { - GoBackSeconds(-(double)numericUpDownSec2.Value); - } - - private void buttonAdjustSecBack2_Click(object sender, EventArgs e) - { - GoBackSeconds((double)numericUpDownSecAdjust2.Value); - } - - private void buttonAdjustSecForward2_Click(object sender, EventArgs e) - { - GoBackSeconds(-(double)numericUpDownSecAdjust2.Value); - } - - private void translatepoweredByMicrosoftToolStripMenuItem_Click(object sender, EventArgs e) - { - TranslateViaGoogle(false, false); - } - - private void AudioWaveform_Click(object sender, EventArgs e) - { - if (audioVisualizer.WavePeaks == null) - { - if (VideoFileName != null && (VideoFileName.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || - VideoFileName.StartsWith("https://", StringComparison.OrdinalIgnoreCase))) - { - return; - } - - if (string.IsNullOrEmpty(VideoFileName)) - { - buttonOpenVideo_Click(sender, e); - if (string.IsNullOrEmpty(VideoFileName)) - { - return; - } - - if (audioVisualizer.WavePeaks != null && File.Exists(WavePeakGenerator.GetPeakWaveFileName(VideoFileName))) - { - return; // waveform already exists and is loaded - } - } - - mediaPlayer.Pause(); - using (var addWaveform = new AddWaveform()) - { - var videoAudioTrackNumber = VideoAudioTrackNumber; - if (mediaPlayer.VideoPlayer is LibVlcDynamic && VideoAudioTrackNumber != -1) - { - videoAudioTrackNumber -= 1; - } - - var peakWaveFileName = WavePeakGenerator.GetPeakWaveFileName(VideoFileName, videoAudioTrackNumber); - var spectrogramFolder = WavePeakGenerator.SpectrogramDrawer.GetSpectrogramFolder(VideoFileName, videoAudioTrackNumber); - - if (WavePeakGenerator.IsFileValidForVisualizer(VideoFileName)) - { - addWaveform.InitializeViaWaveFile(VideoFileName, peakWaveFileName, spectrogramFolder); - } - else - { - addWaveform.Initialize(VideoFileName, peakWaveFileName, spectrogramFolder, videoAudioTrackNumber); - } - - if (addWaveform.ShowDialog() == DialogResult.OK) - { - audioVisualizer.ZoomFactor = 1.0; - audioVisualizer.VerticalZoomFactor = 1.0; - SelectZoomTextInComboBox(); - audioVisualizer.WavePeaks = addWaveform.Peaks; - audioVisualizer.SetSpectrogram(addWaveform.Spectrogram); - timerWaveform.Start(); - } - - if (videoAudioTrackNumber != addWaveform.AudioTrackNumber) - { - if (mediaPlayer.VideoPlayer is LibVlcDynamic libVlc) - { - libVlc.AudioTrackNumber = addWaveform.AudioTrackNumber + 1; - VideoAudioTrackNumber = addWaveform.AudioTrackNumber + 1; - } - else if (mediaPlayer.VideoPlayer is LibMpvDynamic libMpv) - { - libMpv.AudioTrackNumber = addWaveform.AudioTrackNumber; - VideoAudioTrackNumber = addWaveform.AudioTrackNumber; - } - } - } - - if (mediaPlayer.Chapters?.Count > 0) - { - audioVisualizer.Chapters = mediaPlayer.Chapters; - } - } - } - - private void ReloadWaveform(string fileName, int audioTrackNumber) - { - if (audioVisualizer.WavePeaks != null) - { - audioVisualizer.WavePeaks = null; - audioVisualizer.SetSpectrogram(null); - audioVisualizer.SceneChanges = new List(); - audioVisualizer.Chapters = new List(); - } - - if (mediaPlayer.VideoPlayer is LibVlcDynamic && audioTrackNumber != -1) - { - audioTrackNumber -= 1; - } - - var peakWaveFileName = WavePeakGenerator.GetPeakWaveFileName(fileName, audioTrackNumber); - var spectrogramFolder = WavePeakGenerator.SpectrogramDrawer.GetSpectrogramFolder(VideoFileName, audioTrackNumber); - - if (File.Exists(peakWaveFileName)) - { - audioVisualizer.ZoomFactor = 1.0; - audioVisualizer.VerticalZoomFactor = 1.0; - SelectZoomTextInComboBox(); - audioVisualizer.WavePeaks = WavePeakData.FromDisk(peakWaveFileName); - audioVisualizer.SetSpectrogram(SpectrogramData.FromDisk(spectrogramFolder)); - audioVisualizer.SceneChanges = SceneChangeHelper.FromDisk(VideoFileName); - SetWaveformPosition(0, 0, 0); - timerWaveform.Start(); - } - } - - private void timerWaveform_Tick(object sender, EventArgs e) - { - if (audioVisualizer.Visible && mediaPlayer.VideoPlayer != null && audioVisualizer.WavePeaks != null) - { - int index = -1; - if (SubtitleListview1.SelectedItems.Count > 0) - { - index = SubtitleListview1.SelectedItems[0].Index; - } - - if (audioVisualizer.Locked) - { - double startPos = mediaPlayer.CurrentPosition - ((audioVisualizer.EndPositionSeconds - audioVisualizer.StartPositionSeconds) / 2.0); - if (startPos < 0) - { - startPos = 0; - } - - SetWaveformPosition(startPos, mediaPlayer.CurrentPosition, index); - } - else if (mediaPlayer.CurrentPosition > audioVisualizer.EndPositionSeconds || mediaPlayer.CurrentPosition < audioVisualizer.StartPositionSeconds) - { - double startPos = mediaPlayer.CurrentPosition - 0.01; - if (startPos < 0) - { - startPos = 0; - } - - audioVisualizer.ClearSelection(); - SetWaveformPosition(startPos, mediaPlayer.CurrentPosition, index); - } - else - { - SetWaveformPosition(audioVisualizer.StartPositionSeconds, mediaPlayer.CurrentPosition, index); - } - - bool paused = mediaPlayer.IsPaused; - toolStripButtonWaveformPause.Visible = !paused; - toolStripButtonWaveformPlay.Visible = paused; - } - else - { - toolStripButtonWaveformPlay.Visible = true; - toolStripButtonWaveformPause.Visible = false; - } - } - - private void addParagraphHereToolStripMenuItem_Click(object sender, EventArgs e) - { - audioVisualizer.ClearSelection(); - var newParagraph = new Paragraph(audioVisualizer.NewSelectionParagraph); - - mediaPlayer.Pause(); - - // find index where to insert - int index = 0; - for (int i = 0; i < _subtitle.Paragraphs.Count; i++) - { - var p = _subtitle.Paragraphs[i]; - if (p.StartTime.TotalMilliseconds > newParagraph.StartTime.TotalMilliseconds && - (!p.StartTime.IsMaxTime || !HasSmallerStartTimes(_subtitle, i + 1, newParagraph.StartTime.TotalMilliseconds))) - { - break; - } - - index++; - } - - SetStyleForNewParagraph(newParagraph, index); - - MakeHistoryForUndo(_language.BeforeInsertLine); - - // create and insert - if (_networkSession != null) - { - _networkSession.TimerStop(); - NetworkGetSendUpdates(new List(), index, newParagraph); - } - else - { - _subtitle.Paragraphs.Insert(index, newParagraph); - - if (_subtitleAlternate != null && SubtitleListview1.IsAlternateTextColumnVisible && Configuration.Settings.General.AllowEditOfOriginalSubtitle) - { - _subtitleAlternate.InsertParagraphInCorrectTimeOrder(new Paragraph(newParagraph)); - _subtitleAlternate.Renumber(); - } - - _subtitleListViewIndex = -1; - _subtitle.Renumber(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - } - - SubtitleListview1.SelectIndexAndEnsureVisible(index, true); - - textBoxListViewText.Focus(); - audioVisualizer.NewSelectionParagraph = null; - - ShowStatus(string.Format(_language.VideoControls.NewTextInsertAtX, newParagraph.StartTime.ToShortString())); - audioVisualizer.Invalidate(); - } - - private static bool HasSmallerStartTimes(Subtitle subtitle, int startIndex, double startMs) - { - for (int i = startIndex; i < subtitle.Paragraphs.Count; i++) - { - var p = subtitle.Paragraphs[i]; - if (startMs > p.StartTime.TotalMilliseconds && !p.StartTime.IsMaxTime) - { - return true; - } - } - - return false; - } - - private void addParagraphAndPasteToolStripMenuItem_Click(object sender, EventArgs e) - { - addParagraphHereToolStripMenuItem_Click(sender, e); - textBoxListViewText.Text = Clipboard.GetText(); - } - - private void mergeWithPreviousToolStripMenuItem_Click(object sender, EventArgs e) - { - int index = _subtitle.GetIndex(audioVisualizer.RightClickedParagraph); - if (index >= 0) - { - SubtitleListview1.SelectIndexAndEnsureVisible(index, true); - MergeBeforeToolStripMenuItemClick(null, null); - } - - audioVisualizer.Invalidate(); - } - - private void deleteParagraphToolStripMenuItem_Click(object sender, EventArgs e) - { - int index = _subtitle.GetIndex(audioVisualizer.RightClickedParagraph); - if (index >= 0) - { - SubtitleListview1.SelectIndexAndEnsureVisible(index, true); - ToolStripMenuItemDeleteClick(null, null); - } - - audioVisualizer.Invalidate(); - } - - private void splitToolStripMenuItem1_Click(object sender, EventArgs e) - { - for (int i = 0; i < _subtitle.Paragraphs.Count; i++) - { - if (audioVisualizer.RightClickedParagraph.StartTime.TotalMilliseconds == _subtitle.Paragraphs[i].StartTime.TotalMilliseconds && - audioVisualizer.RightClickedParagraph.EndTime.TotalMilliseconds == _subtitle.Paragraphs[i].EndTime.TotalMilliseconds) - { - SubtitleListview1.SelectIndexAndEnsureVisible(i, true); - SplitSelectedParagraph(_audioWaveformRightClickSeconds, null); - break; - } - } - - audioVisualizer.Invalidate(); - } - - private void mergeWithNextToolStripMenuItem_Click(object sender, EventArgs e) - { - int index = _subtitle.GetIndex(audioVisualizer.RightClickedParagraph); - if (index >= 0) - { - SubtitleListview1.SelectIndexAndEnsureVisible(index, true); - MergeAfterToolStripMenuItemClick(null, null); - } - - audioVisualizer.Invalidate(); - } - - private void extendToPreviousToolStripMenuItem_Click(object sender, EventArgs e) - { - int index = _subtitle.GetIndex(audioVisualizer.RightClickedParagraph); - if (index >= 0) - { - SubtitleListview1.SelectIndexAndEnsureVisible(index, true); - ExtendSelectedLinesToPreviousLine(); - } - - audioVisualizer.Invalidate(); - } - - private void extendToNextToolStripMenuItem_Click(object sender, EventArgs e) - { - int index = _subtitle.GetIndex(audioVisualizer.RightClickedParagraph); - if (index >= 0) - { - SubtitleListview1.SelectIndexAndEnsureVisible(index, true); - ExtendSelectedLinesToNextLine(); - } - - audioVisualizer.Invalidate(); - } - - private void goToPreviousSubtitleToolStripMenuItem_Click(object sender, EventArgs e) - { - if (audioVisualizer.RightClickedParagraph != null) - { - GoToPreviousSubtitle(audioVisualizer.RightClickedParagraph.StartTime.TotalMilliseconds); - } - else - { - GoToPreviousSubtitle(mediaPlayer.CurrentPosition * TimeCode.BaseUnit); - } - } - - private void goToNextSubtitleToolStripMenuItem_Click(object sender, EventArgs e) - { - if (audioVisualizer.RightClickedParagraph != null) - { - GoToNextSubtitle(audioVisualizer.RightClickedParagraph.StartTime.TotalMilliseconds); - } - else - { - GoToNextSubtitle(mediaPlayer.CurrentPosition * TimeCode.BaseUnit); - } - } - - private void buttonWaveformZoomIn_Click(object sender, EventArgs e) - { - if (audioVisualizer.WavePeaks != null && audioVisualizer.Visible) - { - audioVisualizer.ZoomFactor += 0.1; - } - } - - private void buttonWaveformZoomOut_Click(object sender, EventArgs e) - { - if (audioVisualizer.WavePeaks != null && audioVisualizer.Visible) - { - audioVisualizer.ZoomFactor -= 0.1; - } - } - - private void buttonWaveformZoomReset_Click(object sender, EventArgs e) - { - if (audioVisualizer.WavePeaks != null && audioVisualizer.Visible) - { - audioVisualizer.ZoomFactor = 1.0; - } - } - - private void toolStripMenuItemWaveformPlaySelection_Click(object sender, EventArgs e) - { - WaveformPlaySelection(); - } - - private void WaveformPlaySelection(bool nearEnd = false) - { - if (mediaPlayer.VideoPlayer != null) - { - var p = - audioVisualizer.NewSelectionParagraph ?? - audioVisualizer.SelectedParagraph; - - if (p != null) - { - double startSeconds = p.StartTime.TotalSeconds; - _endSeconds = p.EndTime.TotalSeconds; - if (nearEnd) - { - startSeconds = Math.Max(startSeconds, _endSeconds - 1.0); - } - - mediaPlayer.CurrentPosition = startSeconds; - UiUtil.ShowSubtitle(_subtitle, mediaPlayer); - mediaPlayer.Play(); - } - } - } - - private void toolStripButtonWaveformZoomIn_Click(object sender, EventArgs e) - { - if (audioVisualizer.WavePeaks != null && audioVisualizer.Visible) - { - audioVisualizer.ZoomFactor += 0.1; - SelectZoomTextInComboBox(); - } - } - - private void toolStripButtonWaveformZoomOut_Click(object sender, EventArgs e) - { - if (audioVisualizer.WavePeaks != null && audioVisualizer.Visible) - { - audioVisualizer.ZoomFactor -= 0.1; - SelectZoomTextInComboBox(); - } - } - - private void toolStripComboBoxWaveform_SelectedIndexChanged(object sender, EventArgs e) - { - try - { - if (toolStripComboBoxWaveform.SelectedItem is ComboBoxZoomItem item) - { - audioVisualizer.ZoomFactor = item.ZoomFactor; - } - } - catch - { - // ignore - } - } - - private void SelectZoomTextInComboBox() - { - int i = 0; - foreach (ComboBoxZoomItem item in toolStripComboBoxWaveform.Items) - { - if (Math.Abs(audioVisualizer.ZoomFactor - item.ZoomFactor) < 0.001) - { - toolStripComboBoxWaveform.SelectedIndex = i; - return; - } - - i++; - } - } - - private void toolStripButtonWaveformPause_Click(object sender, EventArgs e) - { - mediaPlayer.Pause(); - } - - private void toolStripButtonWaveformPlay_Click(object sender, EventArgs e) - { - mediaPlayer.Play(); - } - - private void toolStripButtonLockCenter_Click(object sender, EventArgs e) - { - toolStripButtonLockCenter.Checked = !toolStripButtonLockCenter.Checked; - audioVisualizer.Locked = toolStripButtonLockCenter.Checked; - Configuration.Settings.General.WaveformCenter = audioVisualizer.Locked; - } - - private void trackBarWaveformPosition_ValueChanged(object sender, EventArgs e) - { - mediaPlayer.CurrentPosition = trackBarWaveformPosition.Value; - } - - private void buttonCustomUrl_Click(object sender, EventArgs e) - { - RunCustomSearch(Configuration.Settings.VideoControls.CustomSearchUrl1); - } - - private void buttonCustomUrl2_Click(object sender, EventArgs e) - { - RunCustomSearch(Configuration.Settings.VideoControls.CustomSearchUrl2); - } - - private void ShowhideWaveformToolStripMenuItemClick(object sender, EventArgs e) - { - toolStripButtonToggleWaveform_Click(null, null); - } - - private void AudioWaveformDragEnter(object sender, DragEventArgs e) - { - // make sure they're actually dropping files (not text or anything else) - if (e.Data.GetDataPresent(DataFormats.FileDrop, false)) - { - e.Effect = DragDropEffects.All; - } - } - - private void AudioWaveformDragDrop(object sender, DragEventArgs e) - { - var files = (string[])e.Data.GetData(DataFormats.FileDrop); - if (files.Length != 1) - { - MessageBox.Show(_language.DropOnlyOneFile); - return; - } - - string fileName = files[0]; - string ext = Path.GetExtension(fileName).ToLowerInvariant(); - if (ext != ".wav" || !WavePeakGenerator.IsFileValidForVisualizer(fileName)) - { - if (audioVisualizer.WavePeaks == null && (Utilities.VideoFileExtensions.Contains(ext) || Utilities.AudioFileExtensions.Contains(ext))) - { - VideoFileName = fileName; - AudioWaveform_Click(null, null); - OpenVideo(VideoFileName); - return; - } - - try - { - var fi = new FileInfo(fileName); - if (fi.Length < 1024 * 500) - { - var lines = new List(File.ReadAllLines(fileName)); - foreach (SubtitleFormat format in SubtitleFormat.AllSubtitleFormats) - { - if (format.IsMine(lines, fileName)) - { - OpenSubtitle(fileName, null); - return; - } - } - } - } - catch - { - } - } - - if (ext != ".wav") - { - MessageBox.Show(".wav only!"); - return; - } - - if (VideoFileName == null) - { - OpenVideo(fileName); - return; - } - - using (var addWaveform = new AddWaveform()) - { - string peakWaveFileName = WavePeakGenerator.GetPeakWaveFileName(VideoFileName); - string spectrogramFolder = WavePeakGenerator.SpectrogramDrawer.GetSpectrogramFolder(VideoFileName); - addWaveform.InitializeViaWaveFile(fileName, peakWaveFileName, spectrogramFolder); - if (addWaveform.ShowDialog() == DialogResult.OK) - { - audioVisualizer.WavePeaks = addWaveform.Peaks; - audioVisualizer.SetSpectrogram(addWaveform.Spectrogram); - timerWaveform.Start(); - } - } - } - - private void toolStripMenuItemImportBluRaySup_Click(object sender, EventArgs e) - { - if (ContinueNewOrExit()) - { - openFileDialog1.Title = _language.OpenBluRaySupFile; - openFileDialog1.FileName = string.Empty; - openFileDialog1.Filter = _language.BluRaySupFiles + "|*.sup"; - if (openFileDialog1.ShowDialog(this) == DialogResult.OK) - { - if (!FileUtil.IsBluRaySup(openFileDialog1.FileName) && FileUtil.IsSpDvdSup(openFileDialog1.FileName)) - { - ImportAndOcrSpDvdSup(openFileDialog1.FileName, false); - return; - } - - ImportAndOcrBluRaySup(openFileDialog1.FileName, false); - } - } - } - - private void ImportAndOcrBluRaySup(string fileName, bool showInTaskbar) - { - var log = new StringBuilder(); - var subtitles = BluRaySupParser.ParseBluRaySup(fileName, log); - if (subtitles.Count == 0) - { - string msg = _language.BlurayNotSubtitlesFound + Environment.NewLine + Environment.NewLine + log.ToString(); - if (msg.Length > 800) - { - msg = msg.Substring(0, 800); - } - - MessageBox.Show(msg.Trim() + "..."); - return; - } - - using (var vobSubOcr = new VobSubOcr()) - { - if (showInTaskbar) - { - vobSubOcr.Icon = (Icon)Icon.Clone(); - vobSubOcr.ShowInTaskbar = true; - vobSubOcr.ShowIcon = true; - } - - vobSubOcr.Initialize(subtitles, Configuration.Settings.VobSubOcr, fileName); - vobSubOcr.FileName = Path.GetFileName(fileName); - if (vobSubOcr.ShowDialog(this) == DialogResult.OK) - { - MakeHistoryForUndo(_language.BeforeImportingBluRaySupFile); - FileNew(); - _subtitle.Paragraphs.Clear(); - SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); - foreach (var p in vobSubOcr.SubtitleFromOcr.Paragraphs) - { - _subtitle.Paragraphs.Add(p); - } - - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - _subtitleListViewIndex = -1; - SubtitleListview1.FirstVisibleIndex = -1; - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - - _fileName = Path.ChangeExtension(fileName, GetCurrentSubtitleFormat().Extension); - SetTitle(); - _converted = true; - - Configuration.Settings.Save(); - } - else - { - _exitWhenLoaded = _loading; - } - } - } - - private void selectAllToolStripMenuItem_Click(object sender, EventArgs e) - { - GetFocusedTextBox().SelectAll(); - } - - private void cutToolStripMenuItem_Click(object sender, EventArgs e) - { - GetFocusedTextBox().Cut(); - } - - private void copyToolStripMenuItem_Click(object sender, EventArgs e) - { - GetFocusedTextBox().Copy(); - } - - private void PasteToolStripMenuItemClick(object sender, EventArgs e) - { - GetFocusedTextBox().Paste(); - } - - private void DeleteToolStripMenuItemClick(object sender, EventArgs e) - { - GetFocusedTextBox().SelectedText = string.Empty; - } - - private void NormalToolStripMenuItem1Click(object sender, EventArgs e) - { - var tb = GetFocusedTextBox(); - - if (tb.SelectionLength == 0) - { - var allText = HtmlUtil.RemoveHtmlTags(tb.Text); - allText = NetflixImsc11Japanese.RemoveTags(allText); - tb.Text = allText; - return; - } - - string text = tb.SelectedText; - int selectionStart = tb.SelectionStart; - text = HtmlUtil.RemoveHtmlTags(text); - text = NetflixImsc11Japanese.RemoveTags(text); - tb.SelectedText = text; - tb.SelectionStart = selectionStart; - tb.SelectionLength = text.Length; - } - - private SETextBox GetFocusedTextBox() - { - if (!textBoxListViewTextAlternate.Visible) - { - return textBoxListViewText; - } - - return textBoxListViewTextAlternate.Focused ? textBoxListViewTextAlternate : textBoxListViewText; - } - - private void TextBoxListViewToggleTag(string tag) - { - var tb = GetFocusedTextBox(); - - string text; - int selectionStart = tb.SelectionStart; - - // No text selected. - if (tb.SelectedText.Length == 0) - { - text = tb.Text; - - // Split lines (split a subtitle into its lines). - var lines = text.SplitToLines(); - - // Get current line index (the line where the cursor is current located). - int numberOfNewLines = 0; - for (int i = 0; i < tb.SelectionStart && i < text.Length; i++) - { - if (text[i] == '\n') - { - numberOfNewLines++; - } - } - int selectedLineIdx = numberOfNewLines; // Do not use 'GetLineFromCharIndex' as it also counts when lines are wrapped - - // Get line from index. - string selectedLine = lines[selectedLineIdx]; - - // Test if line at where cursor is current at is a dialog. - bool isDialog = selectedLine.StartsWith('-') || - selectedLine.StartsWith("<" + tag + ">-", StringComparison.OrdinalIgnoreCase); - - // Will be used keep cursor in its previous location after toggle/untoggle. - int textLen = text.Length; - - // 1st set the cursor position to zero. - tb.SelectionStart = 0; - - // If is dialog, only toggle/Untoggle line where caret/cursor is current at. - if (isDialog) - { - lines[selectedLineIdx] = HtmlUtil.ToggleTag(selectedLine, tag); - text = string.Join(Environment.NewLine, lines); - } - else - { - text = HtmlUtil.ToggleTag(text, tag); - } - - tb.Text = text; - // Note: Math.Max will prevent blowing if caret is at the begining and tag was untoggled. - tb.SelectionStart = textLen > text.Length ? Math.Max(selectionStart - 3, 0) : selectionStart + 3; - } - else - { - string post = string.Empty; - string pre = string.Empty; - // There is text selected - text = tb.SelectedText; - while (text.EndsWith(' ') || text.EndsWith(Environment.NewLine, StringComparison.Ordinal) || text.StartsWith(' ') || text.StartsWith(Environment.NewLine, StringComparison.Ordinal)) - { - if (text.EndsWith(' ')) - { - post += " "; - text = text.Remove(text.Length - 1); - } - - if (text.EndsWith(Environment.NewLine, StringComparison.Ordinal)) - { - post += Environment.NewLine; - text = text.Remove(text.Length - 2); - } - - if (text.StartsWith(' ')) - { - pre += " "; - text = text.Remove(0, 1); - } - - if (text.StartsWith(Environment.NewLine, StringComparison.Ordinal)) - { - pre += Environment.NewLine; - text = text.Remove(0, 2); - } - } - - text = HtmlUtil.ToggleTag(text, tag); - // Update text and maintain selection. - if (pre.Length > 0) - { - text = pre + text; - selectionStart += pre.Length; - } - - if (post.Length > 0) - { - text = text + post; - } - - tb.SelectedText = text; - tb.SelectionStart = selectionStart; - tb.SelectionLength = text.Length; - } - } - - private void BoldToolStripMenuItem1Click(object sender, EventArgs e) - { - TextBoxListViewToggleTag(HtmlUtil.TagBold); - } - - private void ItalicToolStripMenuItem1Click(object sender, EventArgs e) - { - TextBoxListViewToggleTag(HtmlUtil.TagItalic); - } - - private void UnderlineToolStripMenuItem1Click(object sender, EventArgs e) - { - TextBoxListViewToggleTag(HtmlUtil.TagUnderline); - } - - private void ColorToolStripMenuItem1Click(object sender, EventArgs e) - { - var tb = GetFocusedTextBox(); - string text = tb.SelectedText; - if (string.IsNullOrEmpty(text) && tb.Text.Length > 0) - { - text = tb.Text; - tb.SelectAll(); - } - int selectionStart = tb.SelectionStart; - - string color; - var formatType = GetCurrentSubtitleFormat().GetType(); - if (formatType == typeof(Ebu)) - { - using (var form = new EbuColorPicker(true)) - { - if (form.ShowDialog(this) != DialogResult.OK) - { - return; - } - - color = form.Color; - } - } - else if (formatType == typeof(ScenaristClosedCaptions) || formatType == typeof(ScenaristClosedCaptionsDropFrame)) - { - using (var form = new EbuColorPicker(false)) - { - if (form.ShowDialog(this) != DialogResult.OK) - { - return; - } - - color = form.Color; - } - } - else - { - if (colorDialog1.ShowDialog(this) != DialogResult.OK) - { - return; - } - - color = Utilities.ColorToHex(colorDialog1.Color); - } - - bool done = false; - string pre = string.Empty; - if (selectionStart == 0 && text.StartsWith("{\\", StringComparison.Ordinal) && text.IndexOf('}') >= 0) - { - int endIndex = text.IndexOf('}') + 1; - pre = text.Substring(0, endIndex); - text = text.Remove(0, endIndex); - } - - string s = text; - if (s.StartsWith("'); - if (end > 0) - { - string f = s.Substring(0, end); - if (f.Contains(" face=", StringComparison.OrdinalIgnoreCase) && !f.Contains(" color=", StringComparison.OrdinalIgnoreCase)) - { - var start = s.IndexOf(" face=", StringComparison.OrdinalIgnoreCase); - s = s.Insert(start, string.Format(" color=\"{0}\"", color)); - text = s; - done = true; - } - else if (f.Contains(" color=", StringComparison.OrdinalIgnoreCase)) - { - int colorStart = f.IndexOf(" color=", StringComparison.OrdinalIgnoreCase); - if (s.IndexOf('"', colorStart + " color=".Length + 1) > 0) - { - end = s.IndexOf('"', colorStart + " color=".Length + 1); - } - - s = s.Substring(0, colorStart) + string.Format(" color=\"{0}", color) + s.Substring(end); - text = s; - done = true; - } - } - } - - if (!done) - { - text = $"{pre}{text}"; - } - else - { - text = pre + text; - } - - tb.SelectedText = text; - tb.SelectionStart = selectionStart; - tb.SelectionLength = text.Length; - } - - private void FontNameToolStripMenuItemClick(object sender, EventArgs e) - { - var tb = GetFocusedTextBox(); - - // font name - string text = tb.SelectedText; - if (string.IsNullOrEmpty(text) && tb.Text.Length > 0) - { - text = tb.Text; - tb.SelectAll(); - } - int selectionStart = tb.SelectionStart; - - using (var form = new ChooseFontName()) - { - if (form.ShowDialog(this) == DialogResult.OK) - { - bool done = false; - - string pre = string.Empty; - if (selectionStart == 0 && text.StartsWith("{\\", StringComparison.Ordinal) && text.IndexOf('}') >= 0) - { - int endIndex = text.IndexOf('}') + 1; - pre = text.Substring(0, endIndex); - text = text.Remove(0, endIndex); - } - - if (text.StartsWith("'); - if (end > 0) - { - string f = text.Substring(0, end); - if (f.Contains(" color=", StringComparison.OrdinalIgnoreCase) && !f.Contains(" face=", StringComparison.OrdinalIgnoreCase)) - { - var start = text.IndexOf(" color=", StringComparison.OrdinalIgnoreCase); - text = text.Insert(start, string.Format(" face=\"{0}\"", form.FontName)); - done = true; - } - else if (f.Contains(" face=", StringComparison.OrdinalIgnoreCase)) - { - int faceStart = f.IndexOf(" face=", StringComparison.OrdinalIgnoreCase); - if (text.IndexOf('"', faceStart + " face=".Length + 1) > 0) - { - end = text.IndexOf('"', faceStart + " face=".Length + 1); - } - - text = text.Substring(0, faceStart) + string.Format(" face=\"{0}", form.FontName) + text.Substring(end); - done = true; - } - } - } - - if (!done) - { - text = $"{pre}{text}"; - } - else - { - text = pre + text; - } - - tb.SelectedText = text; - tb.SelectionStart = selectionStart; - tb.SelectionLength = text.Length; - } - } - } - - public void SetSubtitle(Subtitle subtitle, string message) - { - _subtitle = subtitle; - SubtitleListview1.Fill(subtitle, _subtitleAlternate); - ShowStatus(message); - } - - #region Networking - - private void startServerToolStripMenuItem_Click(object sender, EventArgs e) - { - using (var networkNew = new NetworkStart()) - { - _networkSession = new NikseWebServiceSession(_subtitle, _subtitleAlternate, TimerWebServiceTick, OnUpdateUserLogEntries); - networkNew.Initialize(_networkSession, _fileName); - if (networkNew.ShowDialog(this) == DialogResult.OK) - { - _networkSession.AppendToLog(string.Format(_language.XStartedSessionYAtZ, _networkSession.CurrentUser.UserName, _networkSession.SessionId, DateTime.Now.ToLongTimeString())); - toolStripStatusNetworking.Visible = true; - toolStripStatusNetworking.Text = _language.NetworkMode; - EnableDisableControlsNotWorkingInNetworkMode(false); - SubtitleListview1.ShowNetworkColumn(_language.UserAndAction); - SubtitleListview1.AutoSizeAllColumns(this); - TimerWebServiceTick(null, null); - } - else - { - _networkSession = null; - } - } - } - - private void joinSessionToolStripMenuItem_Click(object sender, EventArgs e) - { - _networkSession = new NikseWebServiceSession(_subtitle, _subtitleAlternate, TimerWebServiceTick, OnUpdateUserLogEntries); - using (var networkJoin = new NetworkJoin()) - { - networkJoin.Initialize(_networkSession); - - if (networkJoin.ShowDialog(this) == DialogResult.OK) - { - _subtitle = _networkSession.Subtitle; - _subtitleAlternate = _networkSession.OriginalSubtitle; - if (_subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) - { - SubtitleListview1.ShowAlternateTextColumn(_languageGeneral.OriginalText); - } - - _fileName = networkJoin.FileName; - SetTitle(); - toolStripStatusNetworking.Visible = true; - toolStripStatusNetworking.Text = _language.NetworkMode; - EnableDisableControlsNotWorkingInNetworkMode(false); - _networkSession.AppendToLog(string.Format(_language.XStartedSessionYAtZ, _networkSession.CurrentUser.UserName, _networkSession.SessionId, DateTime.Now.ToLongTimeString())); - SubtitleListview1.ShowNetworkColumn(_language.UserAndAction); - SubtitleListview1.AutoSizeAllColumns(this); - _subtitleListViewIndex = -1; - _oldSelectedParagraph = null; - - if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) - { - buttonUnBreak.Visible = false; - buttonAutoBreak.Visible = false; - buttonSplitLine.Visible = false; - - textBoxListViewText.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom; - textBoxListViewText.Width = (groupBoxEdit.Width - (textBoxListViewText.Left + 10)) / 2; - textBoxListViewTextAlternate.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom; - textBoxListViewTextAlternate.Left = textBoxListViewText.Left + textBoxListViewText.Width + 3; - textBoxListViewTextAlternate.Width = textBoxListViewText.Width; - textBoxListViewTextAlternate.Visible = true; - labelAlternateText.Text = _languageGeneral.OriginalText; - labelAlternateText.Visible = true; - labelAlternateCharactersPerSecond.Visible = true; - labelTextAlternateLineLengths.Visible = true; - labelAlternateSingleLine.Visible = true; - labelAlternateSingleLinePixels.Visible = true; - labelTextAlternateLineTotal.Visible = true; - - labelCharactersPerSecond.Left = textBoxListViewText.Left + (textBoxListViewText.Width - labelCharactersPerSecond.Width); - labelTextLineTotal.Left = textBoxListViewText.Left + (textBoxListViewText.Width - labelTextLineTotal.Width); - AddAlternate(); - Main_Resize(null, null); - _changeAlternateSubtitleHash = _subtitleAlternate.GetFastHashCode(GetCurrentEncoding().BodyName); - } - else - { - RemoveAlternate(false, true); - } - - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - TimerWebServiceTick(null, null); - } - else - { - _networkSession = null; - } - } - } - - private void EnableDisableControlsNotWorkingInNetworkMode(bool enabled) - { - //Top menu - newToolStripMenuItem.Enabled = enabled; - openToolStripMenuItem.Enabled = enabled; - reopenToolStripMenuItem.Enabled = enabled; - toolStripMenuItemOpenContainingFolder.Enabled = enabled; - toolStripMenuItemCompare.Enabled = enabled; - toolStripMenuItemImportDvdSubtitles.Enabled = enabled; - toolStripMenuItemSubIdx.Enabled = enabled; - toolStripMenuItemImportBluRaySup.Enabled = enabled; - matroskaImportStripMenuItem.Enabled = enabled; - toolStripMenuItemManualAnsi.Enabled = enabled; - toolStripMenuItemImportText.Enabled = enabled; - toolStripMenuItemImportTimeCodes.Enabled = enabled; - - showHistoryforUndoToolStripMenuItem.Enabled = enabled; - multipleReplaceToolStripMenuItem.Enabled = enabled; - - toolsToolStripMenuItem.Enabled = enabled; - - toolStripMenuItemSynchronization.Enabled = enabled; - - toolStripMenuItemAutoTranslate.Enabled = enabled; - - //Toolbar - toolStripButtonFileNew.Enabled = enabled; - toolStripButtonFileOpen.Enabled = enabled; - toolStripMenuItemOpenKeepVideo.Enabled = enabled; - toolStripMenuItemRestoreAutoBackup.Enabled = enabled; - toolStripButtonVisualSync.Enabled = enabled; - - // textbox source - textBoxSource.ReadOnly = !enabled; - } - - internal void TimerWebServiceTick(object sender, EventArgs e) - { - if (_networkSession == null) - { - return; - } - - List deleteIndices = new List(); - NetworkGetSendUpdates(deleteIndices, 0, null); - } - - private void NetworkGetSendUpdates(List deleteIndices, int insertIndex, Paragraph insertParagraph) - { - _networkSession.TimerStop(); - - bool doReFill = false; - bool updateListViewStatus = false; - SubtitleListview1.SelectedIndexChanged -= SubtitleListview1_SelectedIndexChanged; - string message = string.Empty; - - int numberOfLines = 0; - List updates = null; - int numberOfRetries = 10; - while (numberOfRetries > 0) - { - numberOfRetries--; - try - { - updates = _networkSession.GetUpdates(out message, out numberOfLines); - numberOfRetries = 0; - } - catch (Exception exception) - { - if (numberOfRetries <= 0) - { - if (exception.InnerException != null) - { - MessageBox.Show(string.Format(_language.NetworkUnableToConnectToServer, exception.InnerException.Message + Environment.NewLine + exception.InnerException.StackTrace)); - } - else - { - MessageBox.Show(string.Format(_language.NetworkUnableToConnectToServer, exception.Message + Environment.NewLine + exception.StackTrace)); - } - - _networkSession.TimerStop(); - if (_networkChat != null && !_networkChat.IsDisposed) - { - _networkChat.Close(); - _networkChat = null; - } - - _networkSession = null; - EnableDisableControlsNotWorkingInNetworkMode(true); - toolStripStatusNetworking.Visible = false; - SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.Network); - _networkChat = null; - return; - } - - Application.DoEvents(); - System.Threading.Thread.Sleep(250); - } - } - - int currentSelectedIndex = -1; - if (SubtitleListview1.SelectedItems.Count > 0) - { - currentSelectedIndex = SubtitleListview1.SelectedItems[0].Index; - } - - int oldCurrentSelectedIndex = currentSelectedIndex; - if (message == "OK") - { - foreach (var update in updates) - { - if (!string.IsNullOrEmpty(update.Text)) - { - if (!update.Text.Contains(Environment.NewLine)) - { - update.Text = update.Text.Replace("\n", Environment.NewLine); - } - - update.Text = WebUtility.HtmlDecode(update.Text).Replace("
", Environment.NewLine); - } - - if (update.User.Ip != _networkSession.CurrentUser.Ip || update.User.UserName != _networkSession.CurrentUser.UserName) - { - if (update.Action == "USR") - { - _networkSession.Users.Add(update.User); - if (_networkChat != null && !_networkChat.IsDisposed) - { - _networkChat.AddUser(update.User); - } - - _networkSession.AppendToLog(string.Format(_language.NetworkNewUser, update.User.UserName, update.User.Ip)); - } - else if (update.Action == "MSG") - { - _networkSession.ChatLog.Add(new NikseWebServiceSession.ChatEntry { User = update.User, Message = update.Text }); - if (_networkChat == null || _networkChat.IsDisposed) - { - _networkChat = new NetworkChat(); - _networkChat.Initialize(_networkSession); - _networkChat.Show(this); - } - else - { - _networkChat.AddChatMessage(update.User, update.Text); - } - - if (!string.IsNullOrEmpty(Configuration.Settings.NetworkSettings.NewMessageSound) && File.Exists(Configuration.Settings.NetworkSettings.NewMessageSound)) - { - try - { - using (var soundPlayer = new System.Media.SoundPlayer(Configuration.Settings.NetworkSettings.NewMessageSound)) - { - soundPlayer.Play(); - } - } - catch - { - } - } - - _networkSession.AppendToLog(string.Format(_language.NetworkMessage, update.User.UserName, update.User.Ip, update.Text)); - } - else if (update.Action == "DEL") - { - doReFill = true; - _subtitle.Paragraphs.RemoveAt(update.Index); - if (_networkSession.LastSubtitle != null) - { - _networkSession.LastSubtitle.Paragraphs.RemoveAt(update.Index); - } - - _networkSession.AppendToLog(string.Format(_language.NetworkDelete, update.User.UserName, update.User.Ip, update.Index)); - _networkSession.AdjustUpdateLogToDelete(update.Index); - - if (deleteIndices.Count > 0) - { - for (int i = deleteIndices.Count - 1; i >= 0; i--) - { - int index = deleteIndices[i]; - if (index == update.Index) - { - deleteIndices.RemoveAt(i); - } - else if (index > update.Index) - { - deleteIndices[i] = index - 1; - } - } - } - - if (insertIndex > update.Index) - { - insertIndex--; - } - - if (currentSelectedIndex >= 0 && currentSelectedIndex > update.Index) - { - currentSelectedIndex--; - } - } - else if (update.Action == "INS") - { - doReFill = true; - var p = new Paragraph(update.Text, update.StartMilliseconds, update.EndMilliseconds); - _subtitle.Paragraphs.Insert(update.Index, p); - if (_networkSession.LastSubtitle != null) - { - _networkSession.LastSubtitle.Paragraphs.Insert(update.Index, new Paragraph(p)); - } - - _networkSession.AppendToLog(string.Format(_language.NetworkInsert, update.User.UserName, update.User.Ip, update.Index, UiUtil.GetListViewTextFromString(update.Text))); - _networkSession.AddToWsUserLog(update.User, update.Index, update.Action, false); - updateListViewStatus = true; - _networkSession.AdjustUpdateLogToInsert(update.Index); - - if (deleteIndices.Count > 0) - { - for (int i = deleteIndices.Count - 1; i >= 0; i--) - { - int index = deleteIndices[i]; - if (index > update.Index) - { - deleteIndices[i] = index + 1; - } - } - } - - if (insertIndex > update.Index) - { - insertIndex++; - } - - if (currentSelectedIndex >= 0 && currentSelectedIndex > update.Index) - { - currentSelectedIndex++; - } - } - else if (update.Action == "UPD") - { - updateListViewStatus = true; - var p = _subtitle.GetParagraphOrDefault(update.Index); - if (p != null) - { - p.StartTime.TotalMilliseconds = update.StartMilliseconds; - p.EndTime.TotalMilliseconds = update.EndMilliseconds; - p.Text = update.Text; - SubtitleListview1.SetTimeAndText(update.Index, p, _subtitle.GetParagraphOrDefault(update.Index + 1)); - _networkSession.AppendToLog(string.Format(_language.NetworkUpdate, update.User.UserName, update.User.Ip, update.Index, UiUtil.GetListViewTextFromString(update.Text))); - _networkSession.AddToWsUserLog(update.User, update.Index, update.Action, true); - updateListViewStatus = true; - } - - if (_networkSession.LastSubtitle != null) - { - p = _networkSession.LastSubtitle.GetParagraphOrDefault(update.Index); - if (p != null) - { - p.StartTime.TotalMilliseconds = update.StartMilliseconds; - p.EndTime.TotalMilliseconds = update.EndMilliseconds; - p.Text = update.Text; - } - } - } - else if (update.Action == "BYE") - { - if (_networkChat != null && !_networkChat.IsDisposed) - { - _networkChat.RemoveUser(update.User); - } - - SeNetworkService.SeUser removeUser = null; - foreach (var user in _networkSession.Users) - { - if (user.UserName == update.User.UserName) - { - removeUser = user; - break; - } - } - - if (removeUser != null) - { - _networkSession.Users.Remove(removeUser); - } - - _networkSession.AppendToLog(string.Format(_language.NetworkByeUser, update.User.UserName, update.User.Ip)); - } - else - { - _networkSession.AppendToLog("UNKNOWN ACTION: " + update.Action + " by " + update.User.UserName + " (" + update.User.Ip + ")"); - } - } - } - - if (numberOfLines != _subtitle.Paragraphs.Count) - { - _subtitle = _networkSession.ReloadSubtitle(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - UpdateListviewWithUserLogEntries(); - _networkSession.LastSubtitle = new Subtitle(_subtitle); - _oldSelectedParagraph = null; - SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; - _networkSession.TimerStart(); - RefreshSelectedParagraph(); - return; - } - - if (deleteIndices.Count > 0) - { - deleteIndices.Sort(); - deleteIndices.Reverse(); - foreach (int i in deleteIndices) - { - _subtitle.Paragraphs.RemoveAt(i); - if (_networkSession.LastSubtitle != null && i < _networkSession.LastSubtitle.Paragraphs.Count) - { - _networkSession.LastSubtitle.Paragraphs.RemoveAt(i); - } - } - - _networkSession.DeleteLines(deleteIndices); - doReFill = true; - } - - if (insertIndex >= 0 && insertParagraph != null) - { - _subtitle.Paragraphs.Insert(insertIndex, insertParagraph); - if (_networkSession.LastSubtitle != null && insertIndex < _networkSession.LastSubtitle.Paragraphs.Count) - { - _networkSession.LastSubtitle.Paragraphs.Insert(insertIndex, insertParagraph); - } - - _networkSession.InsertLine(insertIndex, insertParagraph); - doReFill = true; - } - - _networkSession.CheckForAndSubmitUpdates(); // updates only (no inserts/deletes) - } - else - { - if (message == "Session not found!") - { - message = _networkSession.Restart(); - if (message == "Reload") - { - _subtitle = _networkSession.ReloadSubtitle(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - UpdateListviewWithUserLogEntries(); - _networkSession.LastSubtitle = new Subtitle(_subtitle); - _oldSelectedParagraph = null; - SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; - _networkSession.TimerStart(); - RefreshSelectedParagraph(); - return; - } - - if (message == "OK") - { - _networkSession.TimerStart(); - RefreshSelectedParagraph(); - return; - } - } - else if (message == "User not found!") - { - message = _networkSession.ReJoin(); - if (message == "Reload") - { - _subtitle = _networkSession.ReloadSubtitle(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - UpdateListviewWithUserLogEntries(); - _networkSession.LastSubtitle = new Subtitle(_subtitle); - _oldSelectedParagraph = null; - SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; - _networkSession.TimerStart(); - RefreshSelectedParagraph(); - return; - } - } - - MessageBox.Show(message); - LeaveSessionToolStripMenuItemClick(null, null); - SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; - return; - } - - if (doReFill) - { - _subtitle.Renumber(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - UpdateListviewWithUserLogEntries(); - - if (oldCurrentSelectedIndex != currentSelectedIndex) - { - _oldSelectedParagraph = null; - _subtitleListViewIndex = currentSelectedIndex; - SubtitleListview1.SelectIndexAndEnsureVisible(_subtitleListViewIndex); - } - else if (_oldSelectedParagraph != null) - { - var p = _subtitle.GetFirstAlike(_oldSelectedParagraph); - if (p == null) - { - var tmp = new Paragraph(_oldSelectedParagraph); - tmp.Text = textBoxListViewText.Text; - p = _subtitle.GetFirstAlike(tmp); - } - - if (p == null) - { - int idx = oldCurrentSelectedIndex; - if (idx >= _subtitle.Paragraphs.Count) - { - idx = _subtitle.Paragraphs.Count - 1; - } - - if (idx >= 0 && idx < _subtitle.Paragraphs.Count) - { - SubtitleListview1.SelectIndexAndEnsureVisible(idx); - _listViewTextUndoIndex = -1; - SubtitleListView1SelectedIndexChange(); - textBoxListViewText.Text = _subtitle.Paragraphs[idx].Text; - } - } - else - { - _subtitleListViewIndex = _subtitle.GetIndex(p); - SubtitleListview1.SelectIndexAndEnsureVisible(_subtitleListViewIndex); - _listViewTextUndoIndex = -1; - SubtitleListView1SelectedIndexChange(); - } - } - } - else if (updateListViewStatus) - { - UpdateListviewWithUserLogEntries(); - } - - _networkSession.LastSubtitle = new Subtitle(_subtitle); - SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; - _networkSession.TimerStart(); - } - - private void UpdateListviewWithUserLogEntries() - { - SubtitleListview1.BeginUpdate(); - foreach (UpdateLogEntry entry in _networkSession.UpdateLog) - { - SubtitleListview1.SetNetworkText(entry.Index, entry.ToString(), Utilities.GetColorFromUserName(entry.UserName)); - } - - SubtitleListview1.EndUpdate(); - } - - private void LeaveSessionToolStripMenuItemClick(object sender, EventArgs e) - { - if (_networkSession != null) - { - _networkSession.TimerStop(); - _networkSession.Leave(); - } - - if (_networkChat != null && !_networkChat.IsDisposed) - { - _networkChat.Close(); - _networkChat = null; - } - - _networkSession = null; - EnableDisableControlsNotWorkingInNetworkMode(true); - toolStripStatusNetworking.Visible = false; - SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.Network); - _networkChat = null; - } - - private void toolStripMenuItemNetworking_DropDownOpening(object sender, EventArgs e) - { - startServerToolStripMenuItem.Visible = _networkSession == null; - joinSessionToolStripMenuItem.Visible = _networkSession == null; - showSessionKeyLogToolStripMenuItem.Visible = _networkSession != null; - leaveSessionToolStripMenuItem.Visible = _networkSession != null; - chatToolStripMenuItem.Visible = _networkSession != null; - } - - internal void OnUpdateUserLogEntries(object sender, EventArgs e) - { - UpdateListviewWithUserLogEntries(); - } - - private void toolStripStatusNetworking_Click(object sender, EventArgs e) - { - showSessionKeyLogToolStripMenuItem_Click(null, null); - } - - private void showSessionKeyLogToolStripMenuItem_Click(object sender, EventArgs e) - { - using (var networkLog = new NetworkLogAndInfo()) - { - networkLog.Initialize(_networkSession); - networkLog.ShowDialog(this); - } - } - - private void chatToolStripMenuItem_Click(object sender, EventArgs e) - { - if (_networkSession != null) - { - if (_networkChat == null || _networkChat.IsDisposed) - { - _networkChat = new NetworkChat(); - _networkChat.Initialize(_networkSession); - _networkChat.Show(this); - } - else - { - _networkChat.WindowState = FormWindowState.Normal; - } - } - } - - #endregion Networking - - private void UnDockVideoPlayer() - { - bool firstUndock = _videoPlayerUndocked != null && !_videoPlayerUndocked.IsDisposed; - - _videoPlayerUndocked = new VideoPlayerUndocked(this, mediaPlayer); - - if (firstUndock) - { - Configuration.Settings.General.UndockedVideoPosition = _videoPlayerUndocked.Left + @";" + _videoPlayerUndocked.Top + @";" + _videoPlayerUndocked.Width + @";" + _videoPlayerUndocked.Height; - } - - Control control = null; - if (splitContainer1.Panel2.Controls.Count == 0) - { - control = panelVideoPlayer; - groupBoxVideo.Controls.Remove(control); - } - else - { - control = panelVideoPlayer; - splitContainer1.Panel2.Controls.Clear(); - } - - if (control != null) - { - control.Top = 0; - control.Left = 0; - control.Width = _videoPlayerUndocked.PanelContainer.Width; - control.Height = _videoPlayerUndocked.PanelContainer.Height; - _videoPlayerUndocked.PanelContainer.Controls.Add(control); - } - } - - public void ReDockVideoPlayer(Control control) - { - groupBoxVideo.Controls.Add(control); - mediaPlayer.FontSizeFactor = 1.0F; - mediaPlayer.SetSubtitleFont(); - mediaPlayer.SubtitleText = string.Empty; - } - - private void UnDockWaveform() - { - _waveformUndocked = new WaveformUndocked(this); - - var control = audioVisualizer; - groupBoxVideo.Controls.Remove(control); - control.Top = 0; - control.Left = 0; - control.Width = _waveformUndocked.PanelContainer.Width; - control.Height = _waveformUndocked.PanelContainer.Height - panelWaveformControls.Height; - _waveformUndocked.PanelContainer.Controls.Add(control); - - var control2 = (Control)panelWaveformControls; - groupBoxVideo.Controls.Remove(control2); - control2.Top = control.Height; - control2.Left = 0; - _waveformUndocked.PanelContainer.Controls.Add(control2); - - var control3 = (Control)trackBarWaveformPosition; - groupBoxVideo.Controls.Remove(control3); - control3.Top = control.Height; - control3.Left = control2.Width + 2; - control3.Width = _waveformUndocked.PanelContainer.Width - control3.Left; - _waveformUndocked.PanelContainer.Controls.Add(control3); - } - - public void ReDockWaveform(Control waveform, Control buttons, Control trackBar) - { - groupBoxVideo.Controls.Add(waveform); - waveform.Top = 30; - waveform.Height = groupBoxVideo.Height - (waveform.Top + buttons.Height + 10); - - groupBoxVideo.Controls.Add(buttons); - buttons.Top = waveform.Top + waveform.Height + 5; - - groupBoxVideo.Controls.Add(trackBar); - trackBar.Top = buttons.Top; - } - - private void UnDockVideoButtons() - { - _videoControlsUndocked = new VideoControlsUndocked(this); - var control = tabControlButtons; - groupBoxVideo.Controls.Remove(control); - control.Top = 25; - control.Left = 0; - _videoControlsUndocked.PanelContainer.Controls.Add(control); - - groupBoxVideo.Controls.Remove(checkBoxSyncListViewWithVideoWhilePlaying); - _videoControlsUndocked.PanelContainer.Controls.Add(checkBoxSyncListViewWithVideoWhilePlaying); - checkBoxSyncListViewWithVideoWhilePlaying.Top = 5; - checkBoxSyncListViewWithVideoWhilePlaying.Left = 5; - - splitContainerMain.Panel2Collapsed = true; - splitContainer1.Panel2Collapsed = true; - } - - public void ReDockVideoButtons(Control videoButtons, Control checkBoxSyncSubWithVideo) - { - groupBoxVideo.Controls.Add(videoButtons); - videoButtons.Top = 12; - videoButtons.Left = 5; - - groupBoxVideo.Controls.Add(checkBoxSyncSubWithVideo); - checkBoxSyncSubWithVideo.Top = 11; - checkBoxSyncSubWithVideo.Left = videoButtons.Left + videoButtons.Width + 5; - } - - private void UndockVideoControlsToolStripMenuItemClick(object sender, EventArgs e) - { - if (Configuration.Settings.General.Undocked) - { - return; - } - - Configuration.Settings.General.Undocked = true; - if (!_loading) - { - Configuration.Settings.General.SplitContainerMainSplitterDistance = splitContainerMain.SplitterDistance; - Configuration.Settings.General.SplitContainer1SplitterDistance = splitContainer1.SplitterDistance; - Configuration.Settings.General.SplitContainerListViewAndTextSplitterDistance = splitContainerListViewAndText.SplitterDistance; - } - - var top = Math.Max(Top, 0); - var left = Math.Max(Left, 0); - UnDockVideoPlayer(); - splitContainerListViewAndText.SplitterDistance = splitContainerListViewAndText.Height - 109; - if (toolStripButtonToggleVideo.Checked) - { - _videoPlayerUndocked.Show(this); - if (_videoPlayerUndocked.Top < 0 || _videoPlayerUndocked.Left < 0) - { - _videoPlayerUndocked.WindowState = FormWindowState.Normal; - _videoPlayerUndocked.Top = top + 40; - _videoPlayerUndocked.Left = Math.Abs(left - 20); - _videoPlayerUndocked.Width = 600; - _videoPlayerUndocked.Height = 400; - } - } - - UnDockWaveform(); - if (toolStripButtonToggleWaveform.Checked) - { - _waveformUndocked.Show(this); - if (_waveformUndocked.Top < 0 || _waveformUndocked.Left < 0) - { - _waveformUndocked.WindowState = FormWindowState.Normal; - _waveformUndocked.Top = top + 60; - _waveformUndocked.Left = Math.Abs(left - 15); - _waveformUndocked.Width = 600; - _waveformUndocked.Height = 200; - } - } - - UnDockVideoButtons(); - _videoControlsUndocked.Show(this); - if (_videoControlsUndocked.Top < 0 || _videoControlsUndocked.Left < 0) - { - _videoControlsUndocked.WindowState = FormWindowState.Normal; - _videoControlsUndocked.Top = top + 40; - _videoControlsUndocked.Left = Math.Abs(left - 10); - _videoControlsUndocked.Width = tabControlButtons.Width + 20; - _videoControlsUndocked.Height = tabControlButtons.Height + 65; - } - - _isVideoControlsUndocked = true; - SetUndockedWindowsTitle(); - - undockVideoControlsToolStripMenuItem.Visible = false; - redockVideoControlsToolStripMenuItem.Visible = true; - - tabControl1_SelectedIndexChanged(null, null); - _videoControlsUndocked.Refresh(); - } - - public void RedockVideoControlsToolStripMenuItemClick(object sender, EventArgs e) - { - if (!Configuration.Settings.General.Undocked) - { - return; - } - - mediaPlayer.ShowNonFullScreenControls(); - - SaveUndockedPositions(); - - Configuration.Settings.General.Undocked = false; - - if (_videoControlsUndocked != null && !_videoControlsUndocked.IsDisposed) - { - var control = _videoControlsUndocked.PanelContainer.Controls[0]; - var controlCheckBox = _videoControlsUndocked.PanelContainer.Controls[1]; - _videoControlsUndocked.PanelContainer.Controls.Clear(); - ReDockVideoButtons(control, controlCheckBox); - _videoControlsUndocked.Close(); - _videoControlsUndocked = null; - } - - if (_waveformUndocked != null && !_waveformUndocked.IsDisposed) - { - var controlWaveform = _waveformUndocked.PanelContainer.Controls[0]; - var controlButtons = _waveformUndocked.PanelContainer.Controls[1]; - var controlTrackBar = _waveformUndocked.PanelContainer.Controls[2]; - _waveformUndocked.PanelContainer.Controls.Clear(); - ReDockWaveform(controlWaveform, controlButtons, controlTrackBar); - _waveformUndocked.Close(); - _waveformUndocked = null; - } - - if (_videoPlayerUndocked != null && !_videoPlayerUndocked.IsDisposed) - { - var control = _videoPlayerUndocked.PanelContainer.Controls[0]; - _videoPlayerUndocked.PanelContainer.Controls.Remove(control); - ReDockVideoPlayer(control); - _videoPlayerUndocked.Close(); - _videoPlayerUndocked = null; - mediaPlayer.ShowFullscreenButton = Configuration.Settings.General.VideoPlayerShowFullscreenButton; - } - - _isVideoControlsUndocked = false; - _videoPlayerUndocked = null; - _waveformUndocked = null; - _videoControlsUndocked = null; - ShowVideoPlayer(); - - audioVisualizer.Visible = toolStripButtonToggleWaveform.Checked; - trackBarWaveformPosition.Visible = toolStripButtonToggleWaveform.Checked; - panelWaveformControls.Visible = toolStripButtonToggleWaveform.Checked; - if (!toolStripButtonToggleVideo.Checked) - { - HideVideoPlayer(); - } - - mediaPlayer.Invalidate(); - Refresh(); - - undockVideoControlsToolStripMenuItem.Visible = true; - redockVideoControlsToolStripMenuItem.Visible = false; - SubtitleListview1.SelectIndexAndEnsureVisible(_subtitleListViewIndex, true); - - splitContainerMain.SplitterDistance = Configuration.Settings.General.SplitContainerMainSplitterDistance; - splitContainer1.SplitterDistance = Configuration.Settings.General.SplitContainer1SplitterDistance; - splitContainerListViewAndText.SplitterDistance = Configuration.Settings.General.SplitContainerListViewAndTextSplitterDistance; - } - - private void Bw_DoWork(object sender, DoWorkEventArgs e) - { - System.Threading.Thread.Sleep(1200); - } - - internal void SetWaveformToggleOff() - { - toolStripButtonToggleWaveform.Checked = false; - } - - internal void SetVideoPlayerToggleOff() - { - toolStripButtonToggleVideo.Checked = false; - } - - private void ToolStripMenuItemInsertSubtitleClick(object sender, EventArgs e) - { - openFileDialog1.Title = _languageGeneral.OpenSubtitle; - openFileDialog1.FileName = string.Empty; - openFileDialog1.Filter = UiUtil.SubtitleExtensionFilter.Value; - if (openFileDialog1.ShowDialog(this) == DialogResult.OK) - { - if (!File.Exists(openFileDialog1.FileName)) - { - return; - } - - var fi = new FileInfo(openFileDialog1.FileName); - if (fi.Length > 1024 * 1024 * 10) // max 10 mb - { - var text = string.Format(_language.FileXIsLargerThan10MB + Environment.NewLine + Environment.NewLine + _language.ContinueAnyway, openFileDialog1.FileName); - if (MessageBox.Show(this, text, Title, MessageBoxButtons.YesNoCancel) != DialogResult.Yes) - { - return; - } - } - - MakeHistoryForUndo(string.Format(_language.BeforeInsertLine, openFileDialog1.FileName)); - - var subtitle = new Subtitle(); - SubtitleFormat format = subtitle.LoadSubtitle(openFileDialog1.FileName, out var encoding, null); - - if (format != null) - { - SaveSubtitleListviewIndices(); - if (Configuration.Settings.General.RemoveBlankLinesWhenOpening) - { - subtitle.RemoveEmptyLines(); - } - - int index = FirstSelectedIndex + 1; - if (index < 0) - { - index = 0; - } - - var last = _subtitle.GetParagraphOrDefault(index - 1); - var newFirst = subtitle.GetParagraphOrDefault(0); - if (last != null && newFirst != null && newFirst.StartTime.TotalMilliseconds < last.EndTime.TotalMilliseconds) - { - var addMilliseconds = last.EndTime.TotalMilliseconds - newFirst.StartTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines; - subtitle.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(addMilliseconds)); - } - - foreach (var p in subtitle.Paragraphs) - { - _subtitle.Paragraphs.Insert(index, new Paragraph(p)); - index++; - } - - if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) - { - index = FirstSelectedIndex; - if (index < 0) - { - index = 0; - } - - var current = _subtitle.GetParagraphOrDefault(index); - if (current != null) - { - var original = Utilities.GetOriginalParagraph(index, current, _subtitleAlternate.Paragraphs); - if (original != null) - { - index = _subtitleAlternate.GetIndex(original); - foreach (var p in subtitle.Paragraphs) - { - _subtitleAlternate.Paragraphs.Insert(index, new Paragraph(p)); - index++; - } - - if (subtitle.Paragraphs.Count > 0) - { - _subtitleAlternate.Renumber(); - } - } - } - } - - _subtitle.Renumber(); - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - } - } - } - - private void InsertLineToolStripMenuItemClick(object sender, EventArgs e) - { - if (_subtitle == null || _subtitle.Paragraphs.Count == 0) - { - InsertBefore(); - } - else - { - SubtitleListview1.SelectIndexAndEnsureVisible(_subtitle.Paragraphs.Count - 1, true); - InsertAfter(string.Empty); - SubtitleListview1.SelectIndexAndEnsureVisible(_subtitle.Paragraphs.Count - 1, true); - } - } - - private void CloseVideoToolStripMenuItemClick(object sender, EventArgs e) - { - timer1.Stop(); - if (mediaPlayer.VideoPlayer != null) - { - mediaPlayer.PauseAndDisposePlayer(); - } - - mediaPlayer.SetPlayerName(string.Empty); - mediaPlayer.ResetTimeLabel(); - mediaPlayer.VideoPlayer = null; - mediaPlayer.CurrentPosition = 0; - VideoFileName = null; - _videoInfo = null; - VideoAudioTrackNumber = -1; - labelVideoInfo.Text = _languageGeneral.NoVideoLoaded; - audioVisualizer.WavePeaks = null; - audioVisualizer.SetSpectrogram(null); - audioVisualizer.SceneChanges = new List(); - audioVisualizer.Chapters = new List(); - timeUpDownVideoPositionAdjust.TimeCode = new TimeCode(); - timeUpDownVideoPositionAdjust.Enabled = false; - timeUpDownVideoPosition.TimeCode = new TimeCode(); - timeUpDownVideoPosition.Enabled = false; - } - - private void ToolStripMenuItemVideoDropDownOpening(object sender, EventArgs e) - { - if (_isVideoControlsUndocked) - { - redockVideoControlsToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainVideoToggleVideoControls); - undockVideoControlsToolStripMenuItem.ShortcutKeys = Keys.None; - } - else - { - undockVideoControlsToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainVideoToggleVideoControls); - redockVideoControlsToolStripMenuItem.ShortcutKeys = Keys.None; - } - - closeVideoToolStripMenuItem.Visible = !string.IsNullOrEmpty(VideoFileName); - setVideoOffsetToolStripMenuItem.Visible = !string.IsNullOrEmpty(VideoFileName); - smpteTimeModedropFrameToolStripMenuItem.Visible = !string.IsNullOrEmpty(VideoFileName); - if (!string.IsNullOrEmpty(VideoFileName)) - { - if (Configuration.Settings.General.CurrentVideoOffsetInMs != 0) - { - setVideoOffsetToolStripMenuItem.Text = string.Format("{0} [{1}]", _language.Menu.Video.SetVideoOffset, new TimeCode(Configuration.Settings.General.CurrentVideoOffsetInMs).ToShortDisplayString()); - } - else - { - setVideoOffsetToolStripMenuItem.Text = _language.Menu.Video.SetVideoOffset; - } - - smpteTimeModedropFrameToolStripMenuItem.Checked = mediaPlayer.SmpteMode; - } - - toolStripMenuItemOpenVideoFromUrl.Visible = Configuration.Settings.General.VideoPlayer.Trim().Equals("MPV", StringComparison.OrdinalIgnoreCase) && - LibMpvDynamic.IsInstalled && - File.Exists(Path.Combine(Configuration.DataDirectory, "youtube-dl.exe")); - - toolStripMenuItemSetAudioTrack.Visible = false; - openSecondSubtitleToolStripMenuItem.Visible = false; - if (mediaPlayer.VideoPlayer is LibVlcDynamic libVlc) - { - openSecondSubtitleToolStripMenuItem.Visible = true; - var audioTracks = libVlc.GetAudioTracks(); - VideoAudioTrackNumber = libVlc.AudioTrackNumber; - if (audioTracks.Count > 1) - { - toolStripMenuItemSetAudioTrack.DropDownItems.Clear(); - for (int i = 0; i < audioTracks.Count; i++) - { - var at = audioTracks[i]; - toolStripMenuItemSetAudioTrack.DropDownItems.Add(string.IsNullOrWhiteSpace(at.Value) ? at.Key.ToString(CultureInfo.InvariantCulture) : at.Value, null, ChooseAudioTrack); - toolStripMenuItemSetAudioTrack.DropDownItems[toolStripMenuItemSetAudioTrack.DropDownItems.Count - 1].Tag = at.Key.ToString(CultureInfo.InvariantCulture); - if (at.Key == VideoAudioTrackNumber) - { - toolStripMenuItemSetAudioTrack.DropDownItems[toolStripMenuItemSetAudioTrack.DropDownItems.Count - 1].Select(); - } - } - - toolStripMenuItemSetAudioTrack.Visible = true; - } - } - else if (mediaPlayer.VideoPlayer is LibMpvDynamic libMpv) - { - openSecondSubtitleToolStripMenuItem.Visible = true; - var audioTracks = libMpv.AudioTracks; - VideoAudioTrackNumber = libMpv.AudioTrackNumber; - if (audioTracks.Count > 1) - { - toolStripMenuItemSetAudioTrack.DropDownItems.Clear(); - for (int i = 0; i < audioTracks.Count; i++) - { - var at = audioTracks[i]; - var trackText = string.IsNullOrWhiteSpace(at.Value) ? at.Key.ToString(CultureInfo.InvariantCulture) : "Track " + at.Key + " - " + char.ToUpper(at.Value[0]) + at.Value.Substring(1); - toolStripMenuItemSetAudioTrack.DropDownItems.Add(trackText, null, ChooseAudioTrack); - toolStripMenuItemSetAudioTrack.DropDownItems[toolStripMenuItemSetAudioTrack.DropDownItems.Count - 1].Tag = at.Key.ToString(CultureInfo.InvariantCulture); - if (i == VideoAudioTrackNumber) - { - toolStripMenuItemSetAudioTrack.DropDownItems[toolStripMenuItemSetAudioTrack.DropDownItems.Count - 1].Select(); - } - } - - toolStripMenuItemSetAudioTrack.Visible = true; - } - } - - if (mediaPlayer.VideoPlayer != null && audioVisualizer.WavePeaks != null && audioVisualizer.WavePeaks.Peaks.Count > 0) - { - toolStripMenuItemImportSceneChanges.Visible = true; - toolStripMenuItemRemoveSceneChanges.Visible = audioVisualizer.SceneChanges.Count > 0; - } - else - { - toolStripMenuItemImportSceneChanges.Visible = false; - toolStripMenuItemRemoveSceneChanges.Visible = false; - } - - if (mediaPlayer.VideoPlayer != null && VideoFileName.EndsWith(".mkv", StringComparison.OrdinalIgnoreCase)) - { - toolStripMenuItemImportChapters.Visible = true; - } - else - { - toolStripMenuItemImportChapters.Visible = false; - } - - generateTextFromCurrentVideoToolStripMenuItem.Visible = Directory.Exists(Path.Combine(Configuration.DataDirectory, "pocketsphinx")); - } - - private void ChooseAudioTrack(object sender, EventArgs e) - { - if (mediaPlayer.VideoPlayer is LibVlcDynamic libVlc) - { - var item = sender as ToolStripItem; - int number = int.Parse(item.Tag.ToString()); - libVlc.AudioTrackNumber = number; - VideoAudioTrackNumber = number; - } - else if (mediaPlayer.VideoPlayer is LibMpvDynamic libMpv) - { - var item = sender as ToolStripItem; - int number = int.Parse(item.Tag.ToString()); - number--; - libMpv.AudioTrackNumber = number; - VideoAudioTrackNumber = number; - } - } - - private void textBoxListViewTextAlternate_TextChanged(object sender, EventArgs e) - { - if (_subtitleAlternate == null || _subtitleAlternate.Paragraphs.Count < 1) - { - return; - } - - if (_subtitleListViewIndex >= 0) - { - var original = Utilities.GetOriginalParagraph(_subtitleListViewIndex, _subtitle.Paragraphs[_subtitleListViewIndex], _subtitleAlternate.Paragraphs); - if (original != null) - { - string text = textBoxListViewTextAlternate.Text.TrimEnd(); - - // update _subtitle + listview - original.Text = text; - UpdateListViewTextInfo(labelTextAlternateLineLengths, labelAlternateSingleLine, labelAlternateSingleLinePixels, labelTextAlternateLineTotal, labelAlternateCharactersPerSecond, original, textBoxListViewTextAlternate); - SubtitleListview1.SetAlternateText(_subtitleListViewIndex, text); - FixVerticalScrollBars(textBoxListViewTextAlternate, ref _lastNumberOfNewLinesAlternate); - } - } - } - - private void TextBoxListViewTextAlternateKeyDown(object sender, KeyEventArgs e) - { - _listViewAlternateTextTicks = DateTime.UtcNow.Ticks; - if (_subtitleAlternate == null || _subtitleAlternate.Paragraphs.Count < 1) - { - return; - } - - if (e.Modifiers == Keys.Shift && e.KeyCode == Keys.ShiftKey) - { - return; - } - - if (e.Modifiers == Keys.Control && e.KeyCode == (Keys.LButton | Keys.ShiftKey)) - { // surround ctrl+v action with history (for undo) - _listViewAlternateTextTicks = 0; - TimerAlternateTextUndoTick(sender, e); - Application.DoEvents(); - System.Threading.Thread.Sleep(50); - Application.DoEvents(); - _listViewAlternateTextTicks = 0; - TimerAlternateTextUndoTick(sender, e); - return; - } - - int numberOfLines = Utilities.GetNumberOfLines(textBoxListViewTextAlternate.Text); - - if (e.Modifiers == Keys.None && e.KeyCode == Keys.Enter && numberOfLines > Configuration.Settings.General.MaxNumberOfLines) - { - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainTextBoxAutoBreak) - { - BreakUnbreakTextBox(false, textBoxListViewTextAlternate); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainTextBoxUnbreak) - { - BreakUnbreakTextBox(true, textBoxListViewTextAlternate); - e.SuppressKeyPress = true; - } - else if (e.KeyData == _shortcuts.MainTextBoxBreakAtCursorPosition) - { - textBoxListViewTextAlternate.Text = Utilities.ReSplit(textBoxListViewTextAlternate.Text, textBoxListViewTextAlternate.SelectionStart); - var lines = textBoxListViewTextAlternate.Text.SplitToLines(); - if (lines.Count > 0) - { - textBoxListViewTextAlternate.SelectionStart = lines[0].Length; - } - - e.SuppressKeyPress = true; - } - - else if (e.KeyData == _shortcuts.MainTextBoxBreakAtCursorPosition) - { - textBoxListViewText.Text = Utilities.ReSplit(textBoxListViewText.Text, textBoxListViewText.SelectionStart); - ButtonNextClick(null, null); - e.SuppressKeyPress = true; - } - else if (e.Modifiers == Keys.Alt && e.KeyCode == Keys.I) - { - if (textBoxListViewTextAlternate.SelectionLength == 0) - { - if (textBoxListViewTextAlternate.Text.Contains("")) - { - textBoxListViewTextAlternate.Text = HtmlUtil.RemoveOpenCloseTags(textBoxListViewTextAlternate.Text, HtmlUtil.TagItalic); - } - else - { - textBoxListViewTextAlternate.Text = string.Format("{0}", textBoxListViewTextAlternate.Text); - } - } - else - { - TextBoxListViewToggleTag(HtmlUtil.TagItalic); - e.SuppressKeyPress = true; - } - } - - if (e.Modifiers == Keys.Control && e.KeyCode == Keys.D) - { - textBoxListViewTextAlternate.SelectionLength = 0; - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainTextBoxSelectionToLower == e.KeyData) // selection to lowercase - { - if (textBoxListViewTextAlternate.SelectionLength > 0) - { - int start = textBoxListViewTextAlternate.SelectionStart; - int length = textBoxListViewTextAlternate.SelectionLength; - textBoxListViewTextAlternate.SelectedText = textBoxListViewTextAlternate.SelectedText.ToLowerInvariant(); - textBoxListViewTextAlternate.SelectionStart = start; - textBoxListViewTextAlternate.SelectionLength = length; - e.SuppressKeyPress = true; - } - } - else if (_shortcuts.MainTextBoxSelectionToUpper == e.KeyData) // selection to uppercase - { - if (textBoxListViewTextAlternate.SelectionLength > 0) - { - int start = textBoxListViewTextAlternate.SelectionStart; - int length = textBoxListViewTextAlternate.SelectionLength; - textBoxListViewTextAlternate.SelectedText = textBoxListViewTextAlternate.SelectedText.ToUpperInvariant(); - textBoxListViewTextAlternate.SelectionStart = start; - textBoxListViewTextAlternate.SelectionLength = length; - e.SuppressKeyPress = true; - } - } - else if (_shortcuts.MainTextBoxSelectionToggleCasing == e.KeyData && textBoxListViewTextAlternate.SelectionLength > 0) // selection to uppercase - { - int start = textBoxListViewTextAlternate.SelectionStart; - int length = textBoxListViewTextAlternate.SelectionLength; - var text = ToggleCasing(textBoxListViewTextAlternate.SelectedText); - textBoxListViewTextAlternate.SelectedText = text; - textBoxListViewTextAlternate.SelectionStart = start; - textBoxListViewTextAlternate.SelectionLength = length; - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainTextBoxSplitAtCursor == e.KeyData && Configuration.Settings.General.AllowEditOfOriginalSubtitle) - { - ToolStripMenuItemSplitTextAtCursorClick(null, null); - e.SuppressKeyPress = true; - } - else if (_shortcuts.MainTextBoxSplitAtCursorAndVideoPos == e.KeyData && Configuration.Settings.General.AllowEditOfOriginalSubtitle) - { - toolStripMenuItemSplitViaWaveform_Click(null, null); - e.SuppressKeyPress = true; - } - - // last key down in text - _lastTextKeyDownTicks = DateTime.UtcNow.Ticks; - - UpdatePositionAndTotalLength(labelTextAlternateLineTotal, textBoxListViewTextAlternate); - } - - private void OpenOriginalToolStripMenuItemClick(object sender, EventArgs e) - { - OpenAlternateSubtitle(); - } - - private void SaveOriginalAstoolStripMenuItemClick(object sender, EventArgs e) - { - if (_subtitleAlternate == null || _subtitleAlternate.Paragraphs.Count == 0) - { - return; - } - - SubtitleFormat currentFormat = GetCurrentSubtitleFormat(); - if (currentFormat == null) - { - currentFormat = new SubRip(); - } - - UiUtil.SetSaveDialogFilter(saveFileDialog1, currentFormat); - - saveFileDialog1.Title = _language.SaveOriginalSubtitleAs; - saveFileDialog1.DefaultExt = "*" + currentFormat.Extension; - saveFileDialog1.AddExtension = true; - - if (!string.IsNullOrEmpty(VideoFileName)) - { - saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(VideoFileName); - } - else if (!string.IsNullOrEmpty(_subtitleAlternateFileName)) - { - saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(_subtitleAlternateFileName); - } - else - { - saveFileDialog1.FileName = string.Empty; - } - - if (!string.IsNullOrEmpty(openFileDialog1.InitialDirectory)) - { - saveFileDialog1.InitialDirectory = openFileDialog1.InitialDirectory; - } - - DialogResult result = saveFileDialog1.ShowDialog(this); - if (result == DialogResult.OK) - { - _subtitleAlternateFileName = saveFileDialog1.FileName; - SaveOriginalSubtitle(currentFormat); - SetTitle(); - if (_fileName != null) - { - Configuration.Settings.RecentFiles.Add(_fileName, FirstVisibleIndex, FirstSelectedIndex, VideoFileName, _subtitleAlternateFileName, Configuration.Settings.General.CurrentVideoOffsetInMs); - } - } - } - - private void SaveOriginalToolStripMenuItemClick(object sender, EventArgs e) - { - if (string.IsNullOrEmpty(_subtitleAlternateFileName)) - { - SaveOriginalAstoolStripMenuItemClick(null, null); - return; - } - - try - { - SaveOriginalSubtitle(GetCurrentSubtitleFormat()); - } - catch - { - MessageBox.Show(string.Format(_language.UnableToSaveSubtitleX, _subtitleAlternateFileName)); - } - } - - private void RemoveOriginalToolStripMenuItemClick(object sender, EventArgs e) - { - if (ContinueNewOrExitAlternate()) - { - RemoveAlternate(true, true); - } - } - - private void RemoveAlternate(bool removeFromListView, bool updateRecentFiles) - { - if (removeFromListView) - { - SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.TextAlternate); - SubtitleListview1.AutoSizeAllColumns(this); - _subtitleAlternate = new Subtitle(); - _subtitleAlternateFileName = null; - - if (_fileName != null && updateRecentFiles) - { - Configuration.Settings.RecentFiles.Add(_fileName, FirstVisibleIndex, FirstSelectedIndex, VideoFileName, _subtitleAlternateFileName, Configuration.Settings.General.CurrentVideoOffsetInMs); - Configuration.Settings.Save(); - UpdateRecentFilesUI(); - } - } - - buttonUnBreak.Visible = true; - buttonAutoBreak.Visible = true; - textBoxListViewTextAlternate.Visible = false; - labelAlternateText.Visible = false; - labelAlternateCharactersPerSecond.Visible = false; - labelTextAlternateLineLengths.Visible = false; - labelAlternateSingleLine.Visible = false; - labelAlternateSingleLinePixels.Visible = false; - labelTextAlternateLineTotal.Visible = false; - textBoxListViewText.Width = (groupBoxEdit.Width - (textBoxListViewText.Left + 8 + buttonUnBreak.Width)); - textBoxListViewText.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom; - labelTextLineTotal.Left = 236; - labelTextAlternateLineTotal.Left = 236; - - MainResize(); - SetTitle(); - SubtitleListview1.SelectIndexAndEnsureVisible(_subtitleListViewIndex, true); - } - - private void ToolStripMenuItemSpellCheckMainDropDownOpening(object sender, EventArgs e) - { - addWordToNameListToolStripMenuItem.Visible = true; - } - - private void SplitContainer1SplitterMoved(object sender, SplitterEventArgs e) - { - Main_Resize(null, null); - } - - private void ButtonSplitLineClick(object sender, EventArgs e) - { - SplitSelectedParagraph(null, null); - } - - private void ToolStripMenuItemCopySourceTextClick(object sender, EventArgs e) - { - var selectedLines = new Subtitle(_subtitle); - selectedLines.Paragraphs.Clear(); - foreach (int index in SubtitleListview1.SelectedIndices) - { - selectedLines.Paragraphs.Add(new Paragraph(_subtitle.Paragraphs[index])); - } - - if (Configuration.Settings.General.CurrentVideoOffsetInMs != 0) - { - selectedLines.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(Configuration.Settings.General.CurrentVideoOffsetInMs)); - } - - Clipboard.SetText(selectedLines.ToText(GetCurrentSubtitleFormat()).TrimEnd()); - } - - public void PlayPause() - { - mediaPlayer.TogglePlayPause(); - } - - public void SetCurrentViaEndPositionAndGotoNext(int index, bool goToNext) - { - var p = _subtitle.GetParagraphOrDefault(index); - if (p == null) - { - return; - } - - if (mediaPlayer.VideoPlayer == null || string.IsNullOrEmpty(VideoFileName)) - { - MessageBox.Show(_languageGeneral.NoVideoLoaded); - return; - } - - var oldParagraph = new Paragraph(p, false); - - //if (autoDuration) - //{ - // // TODO: auto duration - // // TODO: Search for start via wave file (must only be minor adjustment) - //} - - // current movie Position - double durationTotalMilliseconds = p.Duration.TotalMilliseconds; - double totalMillisecondsEnd = mediaPlayer.CurrentPosition * TimeCode.BaseUnit; - - var tc = new TimeCode(totalMillisecondsEnd - durationTotalMilliseconds); - MakeHistoryForUndo(_language.BeforeSetEndAndVideoPosition + " " + tc); - _makeHistoryPaused = true; - - if (p.StartTime.IsMaxTime) - { - p.EndTime.TotalSeconds = mediaPlayer.CurrentPosition; - p.StartTime.TotalMilliseconds = p.EndTime.TotalMilliseconds - Utilities.GetOptimalDisplayMilliseconds(p.Text); - } - else - { - p.StartTime.TotalMilliseconds = totalMillisecondsEnd - durationTotalMilliseconds; - p.EndTime.TotalMilliseconds = totalMillisecondsEnd; - } - - timeUpDownStartTime.TimeCode = p.StartTime; - var durationInSeconds = (decimal)(p.Duration.TotalSeconds); - if (durationInSeconds >= numericUpDownDuration.Minimum && durationInSeconds <= numericUpDownDuration.Maximum) - { - SetDurationInSeconds((double)durationInSeconds); - } - - UpdateOriginalTimeCodes(oldParagraph); - RestartHistory(); - - if (goToNext) - { - SubtitleListview1.SelectIndexAndEnsureVisible(index + 1, true); - } - - ShowStatus(string.Format(_language.VideoControls.AdjustedViaEndTime, p.StartTime.ToShortString())); - audioVisualizer.Invalidate(); - } - - public void SetCurrentStartAutoDurationAndGotoNext(int index) - { - var prev = _subtitle.GetParagraphOrDefault(index - 1); - var p = _subtitle.GetParagraphOrDefault(index); - if (p == null) - { - return; - } - - double videoPosition = mediaPlayer.CurrentPosition; - if (prev != null && Math.Abs(prev.StartTime.TotalSeconds - videoPosition) < 0.3) - { - ShowStatus("Subtitle already here"); - return; - } - - ShowNextSubtitleLabel(); - - if (mediaPlayer.VideoPlayer == null || string.IsNullOrEmpty(VideoFileName)) - { - MessageBox.Show(_languageGeneral.NoVideoLoaded); - return; - } - - MakeHistoryForUndoOnlyIfNotResent(string.Format(_language.VideoControls.BeforeChangingTimeInWaveformX, "#" + p.Number + " " + p.Text)); - - timeUpDownStartTime.MaskedTextBox.TextChanged -= MaskedTextBoxTextChanged; - var oldParagraph = new Paragraph(_subtitle.Paragraphs[index], false); - if (!mediaPlayer.IsPaused) - { - videoPosition -= Configuration.Settings.General.SetStartEndHumanDelay / TimeCode.BaseUnit; - } - - timeUpDownStartTime.TimeCode = TimeCode.FromSeconds(videoPosition); - - double duration = Utilities.GetOptimalDisplayMilliseconds(textBoxListViewText.Text); - - _subtitle.Paragraphs[index].StartTime.TotalMilliseconds = TimeSpan.FromSeconds(videoPosition).TotalMilliseconds; - if (prev != null && prev.EndTime.TotalMilliseconds > _subtitle.Paragraphs[index].StartTime.TotalMilliseconds) - { - int minDiff = Configuration.Settings.General.MinimumMillisecondsBetweenLines + 1; - if (minDiff < 1) - { - minDiff = 1; - } - - prev.EndTime.TotalMilliseconds = _subtitle.Paragraphs[index].StartTime.TotalMilliseconds - minDiff; - } - - _subtitle.Paragraphs[index].EndTime.TotalMilliseconds = _subtitle.Paragraphs[index].StartTime.TotalMilliseconds + duration; - SubtitleListview1.SetStartTimeAndDuration(index, _subtitle.Paragraphs[index], _subtitle.GetParagraphOrDefault(index + 1), _subtitle.GetParagraphOrDefault(index - 1)); - timeUpDownStartTime.TimeCode = _subtitle.Paragraphs[index].StartTime; - timeUpDownStartTime.MaskedTextBox.TextChanged += MaskedTextBoxTextChanged; - UpdateOriginalTimeCodes(oldParagraph); - _subtitleListViewIndex = -1; - SubtitleListview1.SelectIndexAndEnsureVisible(index + 1, true); - audioVisualizer.Invalidate(); - } - - public void SetCurrentEndNextStartAndGoToNext(int index) - { - var p = _subtitle.GetParagraphOrDefault(index); - var next = _subtitle.GetParagraphOrDefault(index + 1); - if (p == null) - { - return; - } - - if (mediaPlayer.VideoPlayer == null || string.IsNullOrEmpty(VideoFileName)) - { - MessageBox.Show(_languageGeneral.NoVideoLoaded); - return; - } - - MakeHistoryForUndoOnlyIfNotResent(string.Format(_language.VideoControls.BeforeChangingTimeInWaveformX, "#" + p.Number + " " + p.Text)); - var p1 = new Paragraph(p, false); - Paragraph p2 = null; - if (next != null) - { - p2 = new Paragraph(next, false); - } - - double videoPosition = mediaPlayer.CurrentPosition; - if (!mediaPlayer.IsPaused) - { - videoPosition -= Configuration.Settings.General.SetStartEndHumanDelay / TimeCode.BaseUnit; - } - - p.EndTime = TimeCode.FromSeconds(videoPosition); - if (p.StartTime.IsMaxTime) - { - timeUpDownStartTime.MaskedTextBox.TextChanged -= MaskedTextBoxTextChanged; - p.StartTime.TotalMilliseconds = p.EndTime.TotalMilliseconds - Utilities.GetOptimalDisplayMilliseconds(p.Text); - if (p.StartTime.TotalMilliseconds < 0) - { - p.StartTime.TotalMilliseconds = 0; - } - - timeUpDownStartTime.TimeCode = p.StartTime; - SubtitleListview1.SetStartTimeAndDuration(index, p, _subtitle.GetParagraphOrDefault(index + 1), _subtitle.GetParagraphOrDefault(index - 1)); - timeUpDownStartTime.MaskedTextBox.TextChanged += MaskedTextBoxTextChanged; - } - - if (p.Duration.TotalSeconds < 0 || p.Duration.TotalSeconds > 10) - { - p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(p.Text); - } - - SubtitleListview1.SetStartTimeAndDuration(index, p, _subtitle.GetParagraphOrDefault(index + 1), _subtitle.GetParagraphOrDefault(index - 1)); - - SetDurationInSeconds(_subtitle.Paragraphs[index].Duration.TotalSeconds + 0.001); - if (next != null) - { - int addMilliseconds = Configuration.Settings.General.MinimumMillisecondsBetweenLines; - if (addMilliseconds < 1 || addMilliseconds > 500) - { - addMilliseconds = 1; - } - - var oldDuration = next.Duration.TotalMilliseconds; - if (next.StartTime.IsMaxTime || next.EndTime.IsMaxTime) - { - oldDuration = Utilities.GetOptimalDisplayMilliseconds(p.Text); - } - - next.StartTime.TotalMilliseconds = p.EndTime.TotalMilliseconds + addMilliseconds; - next.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds + oldDuration; - SubtitleListview1.SetStartTimeAndDuration(index + 1, next, _subtitle.GetParagraphOrDefault(index + 2), _subtitle.GetParagraphOrDefault(index)); - SubtitleListview1.SelectIndexAndEnsureVisible(index + 1, true); - } - - UpdateOriginalTimeCodes(p1, p2); - audioVisualizer.Invalidate(); - } - - private void EditSelectAllToolStripMenuItemClick(object sender, EventArgs e) - { - for (int i = 0; i < SubtitleListview1.Items.Count; i++) - { - SubtitleListview1.Items[i].Selected = true; - } - } - - private void ToolStripMenuItemSplitTextAtCursorClick(object sender, EventArgs e) - { - var tb = GetFocusedTextBox(); - - int? pos = null; - if (tb.SelectionStart > 1 && tb.SelectionStart < tb.Text.Length - 1) - { - pos = tb.SelectionStart; - } - - SplitSelectedParagraph(null, pos); - tb.Focus(); - tb.SelectionStart = tb.Text.Length; - } - - private void toolStripMenuItemSplitViaWaveform_Click(object sender, EventArgs e) - { - var tb = GetFocusedTextBox(); - if (tb.SelectionStart > 1 && tb.SelectionStart < tb.Text.Length - 1) - { - int? pos = tb.SelectionStart; - SplitSelectedParagraph(mediaPlayer.CurrentPosition, pos); - tb.Focus(); - tb.SelectionStart = tb.Text.Length; - } - } - - private void ContextMenuStripTextBoxListViewOpening(object sender, System.ComponentModel.CancelEventArgs e) - { - var tb = GetFocusedTextBox(); - toolStripMenuItemSplitTextAtCursor.Visible = tb.Text.Length > 1; - - if (IsUnicode) - { - if (toolStripMenuItemInsertUnicodeSymbol.DropDownItems.Count == 0) - { - foreach (var s in Configuration.Settings.Tools.UnicodeSymbolsToInsert.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries)) - { - toolStripMenuItemInsertUnicodeSymbol.DropDownItems.Add(s, null, InsertUnicodeGlyph); - if (Environment.OSVersion.Version.Major < 6 && Configuration.Settings.General.SubtitleFontName == Utilities.WinXP2KUnicodeFontName) // 6 == Vista/Win2008Server/Win7 - { - toolStripMenuItemInsertUnicodeSymbol.DropDownItems[toolStripMenuItemInsertUnicodeSymbol.DropDownItems.Count - 1].Font = new Font(Utilities.WinXP2KUnicodeFontName, toolStripMenuItemInsertUnicodeSymbol.Font.Size); - } - } - } - - toolStripMenuItemInsertUnicodeSymbol.Visible = toolStripMenuItemInsertUnicodeSymbol.DropDownItems.Count > 0; - toolStripSeparator26.Visible = toolStripMenuItemInsertUnicodeSymbol.DropDownItems.Count > 0; - - superscriptToolStripMenuItem.Visible = tb.SelectionLength > 0; - subscriptToolStripMenuItem.Visible = tb.SelectionLength > 0; - toolStripMenuItemInsertUnicodeControlCharacters.Visible = true; - } - else - { - toolStripMenuItemInsertUnicodeSymbol.Visible = false; - toolStripSeparator26.Visible = false; - superscriptToolStripMenuItem.Visible = false; - subscriptToolStripMenuItem.Visible = false; - toolStripMenuItemInsertUnicodeControlCharacters.Visible = false; - } - - var formatType = GetCurrentSubtitleFormat().GetType(); - if (formatType == typeof(WebVTT) && tb.SelectionLength > 0) - { - toolStripSeparatorWebVTT.Visible = true; - toolStripMenuItemWebVttVoice.Visible = true; - var voices = WebVTT.GetVoices(_subtitle); - toolStripMenuItemWebVttVoice.DropDownItems.Clear(); - foreach (var style in voices) - { - toolStripMenuItemWebVttVoice.DropDownItems.Add(style, null, WebVTTSetVoiceTextBox); - } - - toolStripMenuItemWebVttVoice.DropDownItems.Add(_language.Menu.ContextMenu.WebVTTSetNewVoice, null, WebVTTSetNewVoiceTextBox); - } - else - { - toolStripSeparatorWebVTT.Visible = false; - toolStripMenuItemWebVttVoice.Visible = false; - toolStripMenuItemWebVttVoice.Visible = false; - } - - if (formatType == typeof(NetflixImsc11Japanese)) - { - boldToolStripMenuItem1.Visible = false; - underlineToolStripMenuItem1.Visible = false; - colorToolStripMenuItem1.Visible = false; - fontNameToolStripMenuItem.Visible = false; - toolStripMenuItemHorizontalDigits.Visible = true; - if (tb.SelectionLength > 0) - { - toolStripMenuItemBouten.Visible = true; - toolStripMenuItemRuby.Visible = true; - } - else - { - toolStripMenuItemBouten.Visible = false; - toolStripMenuItemRuby.Visible = true; - } - - if (tb.SelectionLength > 1 && tb.SelectionLength < 8) - { - toolStripMenuItemHorizontalDigits.Visible = true; - } - else - { - toolStripMenuItemHorizontalDigits.Visible = false; - } - } - else if (formatType == typeof(Sami) || formatType == typeof(SamiModern)) - { - boldToolStripMenuItem1.Visible = true; - underlineToolStripMenuItem1.Visible = true; - colorToolStripMenuItem1.Visible = true; - fontNameToolStripMenuItem.Visible = true; - toolStripMenuItemHorizontalDigits.Visible = false; - toolStripMenuItemBouten.Visible = false; - if (tb.SelectionLength > 0) - { - toolStripMenuItemRuby.Visible = true; - } - else - { - toolStripMenuItemRuby.Visible = true; - } - } - else if (formatType == typeof(Ebu)) - { - Ebu.EbuGeneralSubtitleInformation header; - if (_subtitle != null && _subtitle.Header != null && (_subtitle.Header.Contains("STL2") || _subtitle.Header.Contains("STL3"))) - { - header = Ebu.ReadHeader(Encoding.UTF8.GetBytes(_subtitle.Header)); - } - else - { - header = new Ebu.EbuGeneralSubtitleInformation(); - } - - var open = header.DisplayStandardCode != "1" && header.DisplayStandardCode != "2"; - boxToolStripMenuItem.Visible = open; - } - else - { - boxToolStripMenuItem1.Visible = false; - boldToolStripMenuItem1.Visible = true; - underlineToolStripMenuItem1.Visible = true; - colorToolStripMenuItem1.Visible = true; - fontNameToolStripMenuItem.Visible = true; - toolStripMenuItemBouten.Visible = false; - toolStripMenuItemRuby.Visible = false; - toolStripMenuItemHorizontalDigits.Visible = false; - } - - if (tb.SelectionStart > 1 && tb.SelectionStart < tb.Text.Length - 1 && !string.IsNullOrEmpty(VideoFileName) && mediaPlayer != null && - _subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 0) - { - int firstSelectedIndex = SubtitleListview1.SelectedItems[0].Index; - var currentParagraph = _subtitle.GetParagraphOrDefault(firstSelectedIndex); - var splitSeconds = mediaPlayer.CurrentPosition; - if (splitSeconds > (currentParagraph.StartTime.TotalSeconds + 0.2) && splitSeconds < (currentParagraph.EndTime.TotalSeconds - 0.2)) - { - toolStripMenuItemSplitViaWaveform.Visible = true; - } - else - { - toolStripMenuItemSplitViaWaveform.Visible = false; - } - } - else - { - toolStripMenuItemSplitViaWaveform.Visible = false; - } - } - - private void ToolStripMenuItemExportPngXmlClick(object sender, EventArgs e) - { - using (var exportBdnXmlPng = new ExportPngXml()) - { - exportBdnXmlPng.Initialize(_subtitle, GetCurrentSubtitleFormat(), "BDNXML", _fileName, _videoInfo, VideoFileName); - exportBdnXmlPng.ShowDialog(this); - } - } - - private void TabControlSubtitleSelecting(object sender, TabControlCancelEventArgs e) - { - if (tabControlSubtitle.SelectedIndex != TabControlSourceView && textBoxSource.Text.Trim().Length > 1) - { - var currentFormat = GetCurrentSubtitleFormat(); - if (currentFormat != null && !currentFormat.IsTextBased) - { - return; - } - - var format = new Subtitle().ReloadLoadSubtitle(textBoxSource.Lines.ToList(), null, currentFormat); - if (format == null) - { - e.Cancel = true; - } - } - } - - private void ToolStripComboBoxFrameRateTextChanged(object sender, EventArgs e) - { - Configuration.Settings.General.CurrentFrameRate = CurrentFrameRate; - if (_loading) - { - return; - } - - SubtitleListview1.UpdateFrames(_subtitle); - if (tabControlSubtitle.SelectedIndex == TabControlSourceView) - { - ShowSource(); - } - } - - private void ToolStripMenuItemGoogleMicrosoftTranslateSelLineClick(object sender, EventArgs e) - { - int firstSelectedIndex = FirstSelectedIndex; - if (firstSelectedIndex >= 0) - { - var p = _subtitle.GetParagraphOrDefault(firstSelectedIndex); - if (p != null) - { - string defaultFromLanguage = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle); - if (_subtitleAlternate != null) - { - var o = Utilities.GetOriginalParagraph(firstSelectedIndex, p, _subtitleAlternate.Paragraphs); - if (o != null) - { - p = o; - defaultFromLanguage = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitleAlternate); - } - } - - Cursor = Cursors.WaitCursor; - if (_googleOrMicrosoftTranslate == null || _googleOrMicrosoftTranslate.IsDisposed) - { - _googleOrMicrosoftTranslate = new GoogleOrMicrosoftTranslate(); - _googleOrMicrosoftTranslate.InitializeFromLanguage(defaultFromLanguage); - } - - _googleOrMicrosoftTranslate.Initialize(p); - Cursor = Cursors.Default; - if (_googleOrMicrosoftTranslate.ShowDialog() == DialogResult.OK) - { - textBoxListViewText.Text = _googleOrMicrosoftTranslate.TranslatedText; - } - } - } - } - - private void NumericUpDownSec1ValueChanged(object sender, EventArgs e) - { - Configuration.Settings.General.SmallDelayMilliseconds = (int)(numericUpDownSec1.Value * 1000); - } - - private void NumericUpDownSec2ValueChanged(object sender, EventArgs e) - { - Configuration.Settings.General.LargeDelayMilliseconds = (int)(numericUpDownSec2.Value * 1000); - } - - private void NumericUpDownSecAdjust1ValueChanged(object sender, EventArgs e) - { - Configuration.Settings.General.SmallDelayMilliseconds = (int)(numericUpDownSecAdjust1.Value * 1000); - } - - private void NumericUpDownSecAdjust2ValueChanged(object sender, EventArgs e) - { - Configuration.Settings.General.LargeDelayMilliseconds = (int)(numericUpDownSecAdjust2.Value * 1000); - } - - private void ToolStripMenuItemMakeEmptyFromCurrentClick(object sender, EventArgs e) - { - if (ContinueNewOrExit()) - { - bool isAlternateVisible = SubtitleListview1.IsAlternateTextColumnVisible; - _subtitleAlternate = new Subtitle(_subtitle); - _subtitleAlternateFileName = null; - int oldIndex = FirstSelectedIndex; - if (oldIndex < 0) - { - oldIndex = 0; - } - - foreach (var p in _subtitle.Paragraphs) - { - if (Configuration.Settings.General.RemoveBlankLinesWhenOpening && string.IsNullOrEmpty(Configuration.Settings.Tools.NewEmptyTranslationText)) - { - p.Text = "-"; - } - else if (Configuration.Settings.Tools.NewEmptyTranslationText != null) - { - p.Text = Configuration.Settings.Tools.NewEmptyTranslationText; - } - else - { - p.Text = string.Empty; - } - } - - SubtitleListview1.ShowAlternateTextColumn(_languageGeneral.OriginalText); - _subtitleListViewIndex = -1; - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - SubtitleListview1.SelectIndexAndEnsureVisible(oldIndex, true); - textBoxListViewText.Focus(); - Configuration.Settings.General.ShowOriginalAsPreviewIfAvailable = true; - - _subtitleAlternateFileName = _fileName; - _fileName = null; - SetupAlternateEdit(); - ResetHistory(); - - if (!isAlternateVisible || toolStripMenuItemShowOriginalInPreview.Checked) - { - toolStripMenuItemShowOriginalInPreview.Checked = false; - Configuration.Settings.General.ShowOriginalAsPreviewIfAvailable = false; - audioVisualizer.Invalidate(); - } - } - } - - private void ToolStripMenuItemShowOriginalInPreviewClick(object sender, EventArgs e) - { - toolStripMenuItemShowOriginalInPreview.Checked = !toolStripMenuItemShowOriginalInPreview.Checked; - Configuration.Settings.General.ShowOriginalAsPreviewIfAvailable = toolStripMenuItemShowOriginalInPreview.Checked; - } - - private void ToolStripMenuItemVideoDropDownClosed(object sender, EventArgs e) - { - redockVideoControlsToolStripMenuItem.ShortcutKeys = Keys.None; - undockVideoControlsToolStripMenuItem.ShortcutKeys = Keys.None; - } - - private void ToolsToolStripMenuItemDropDownOpening(object sender, EventArgs e) - { - if (_subtitle?.Paragraphs.Count > 0 && _networkSession == null) - { - toolStripSeparator23.Visible = true; - toolStripMenuItemMakeEmptyFromCurrent.Visible = !SubtitleListview1.IsAlternateTextColumnVisible; - toolStripMenuItemShowOriginalInPreview.Checked = Configuration.Settings.General.ShowOriginalAsPreviewIfAvailable; - } - else - { - toolStripSeparator23.Visible = false; - toolStripMenuItemMakeEmptyFromCurrent.Visible = false; - toolStripMenuItemShowOriginalInPreview.Checked = false; - } - - var f = GetCurrentSubtitleFormat(); - styleToolStripMenuItem.Visible = f.HasStyleSupport; - var formatType = f.GetType(); - actorToolStripMenuItem.Visible = formatType == typeof(AdvancedSubStationAlpha) || formatType == typeof(SubStationAlpha); - } - - private void ContextMenuStripWaveformOpening(object sender, System.ComponentModel.CancelEventArgs e) - { - if (audioVisualizer.IsSpectrogramAvailable) - { - if (audioVisualizer.ShowSpectrogram && audioVisualizer.ShowWaveform) - { - showWaveformAndSpectrogramToolStripMenuItem.Visible = false; - showOnlyWaveformToolStripMenuItem.Visible = true; - showOnlySpectrogramToolStripMenuItem.Visible = true; - toolStripSeparatorGuessTimeCodes.Visible = true; - } - else if (audioVisualizer.ShowSpectrogram) - { - showWaveformAndSpectrogramToolStripMenuItem.Visible = true; - showOnlyWaveformToolStripMenuItem.Visible = true; - showOnlySpectrogramToolStripMenuItem.Visible = false; - toolStripSeparatorGuessTimeCodes.Visible = true; - } - else - { - showWaveformAndSpectrogramToolStripMenuItem.Visible = true; - showOnlyWaveformToolStripMenuItem.Visible = false; - showOnlySpectrogramToolStripMenuItem.Visible = true; - toolStripSeparatorGuessTimeCodes.Visible = true; - } - } - else - { - toolStripSeparator24.Visible = false; - showWaveformAndSpectrogramToolStripMenuItem.Visible = false; - showOnlyWaveformToolStripMenuItem.Visible = false; - showOnlySpectrogramToolStripMenuItem.Visible = false; - toolStripSeparatorGuessTimeCodes.Visible = false; - } - - insertSubtitleHereToolStripMenuItem.Visible = !_subtitle.Paragraphs.Any(p => p.StartTime.TotalSeconds <= mediaPlayer.CurrentPosition + 1.0 && - p.EndTime.TotalSeconds <= mediaPlayer.CurrentPosition + 1.0 && - p.EndTime.TotalSeconds >= mediaPlayer.CurrentPosition); - } - - private void ShowWaveformAndSpectrogramToolStripMenuItemClick(object sender, EventArgs e) - { - audioVisualizer.ShowSpectrogram = true; - audioVisualizer.ShowWaveform = true; - } - - private void ShowOnlyWaveformToolStripMenuItemClick(object sender, EventArgs e) - { - audioVisualizer.ShowSpectrogram = false; - audioVisualizer.ShowWaveform = true; - } - - private void ShowOnlySpectrogramToolStripMenuItemClick(object sender, EventArgs e) - { - audioVisualizer.ShowSpectrogram = true; - audioVisualizer.ShowWaveform = false; - } - - private void SplitContainerMainSplitterMoved(object sender, SplitterEventArgs e) - { - mediaPlayer.Refresh(); - } - - private void FindDoubleLinesToolStripMenuItemClick(object sender, EventArgs e) - { - if (!IsSubtitleLoaded) - { - DisplaySubtitleNotLoadedMessage(); - return; - } - - for (int i = FirstSelectedIndex + 1; i < _subtitle.Paragraphs.Count; i++) - { - var current = _subtitle.GetParagraphOrDefault(i); - var next = _subtitle.GetParagraphOrDefault(i + 1); - if (current != null && next != null) - { - if (current.Text.Trim().Equals(next.Text.Trim(), StringComparison.OrdinalIgnoreCase)) - { - SubtitleListview1.SelectIndexAndEnsureVisible(i, true); - SubtitleListview1.Items[i + 1].Selected = true; - break; - } - } - } - } - - private void TextBoxListViewTextAlternateMouseMove(object sender, MouseEventArgs e) - { - if (Control.ModifierKeys == Keys.Control && MouseButtons == MouseButtons.Left) - { - if (!string.IsNullOrEmpty(textBoxListViewTextAlternate.SelectedText)) - { - textBoxListViewTextAlternate.DoDragDrop(textBoxListViewTextAlternate.SelectedText, DragDropEffects.Copy); - } - else - { - textBoxListViewTextAlternate.DoDragDrop(textBoxListViewTextAlternate.Text, DragDropEffects.Copy); - } - } - else if ((AutoRepeatContinueOn || AutoRepeatOn) && !textBoxSearchWord.Focused && textBoxListViewTextAlternate.Focused) - { - string selectedText = textBoxListViewTextAlternate.SelectedText; - if (!string.IsNullOrEmpty(selectedText)) - { - selectedText = selectedText.Trim(); - selectedText = selectedText.TrimEnd('.', ',', '!', '?').TrimEnd(); - if (!string.IsNullOrEmpty(selectedText) && selectedText != textBoxSearchWord.Text) - { - textBoxSearchWord.Text = HtmlUtil.RemoveHtmlTags(selectedText); - } - } - } - } - - private void EBustlToolStripMenuItemClick(object sender, EventArgs e) - { - var ebu = new Ebu(); - saveFileDialog1.Filter = ebu.Name + "|*" + ebu.Extension; - saveFileDialog1.Title = _language.SaveSubtitleAs; - saveFileDialog1.DefaultExt = "*" + ebu.Extension; - saveFileDialog1.AddExtension = true; - - if (!string.IsNullOrEmpty(VideoFileName)) - { - saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(VideoFileName); - } - else - { - saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(_fileName); - } - - if (!string.IsNullOrEmpty(openFileDialog1.InitialDirectory)) - { - saveFileDialog1.InitialDirectory = openFileDialog1.InitialDirectory; - } - - DialogResult result = saveFileDialog1.ShowDialog(this); - if (result == DialogResult.OK) - { - openFileDialog1.InitialDirectory = saveFileDialog1.InitialDirectory; - string fileName = saveFileDialog1.FileName; - string ext = Path.GetExtension(fileName); - bool extOk = ext.Equals(ebu.Extension, StringComparison.OrdinalIgnoreCase); - if (!extOk) - { - if (fileName.EndsWith('.')) - { - fileName = fileName.Substring(0, fileName.Length - 1); - } - - fileName += ebu.Extension; - } - - new Ebu().Save(fileName, GetSaveSubtitle(_subtitle)); - } - } - - private void ToolStripMenuItemCavena890Click(object sender, EventArgs e) - { - var cavena890 = new Cavena890(); - saveFileDialog1.Filter = cavena890.Name + "|*" + cavena890.Extension; - saveFileDialog1.Title = _language.SaveSubtitleAs; - saveFileDialog1.DefaultExt = "*" + cavena890.Extension; - saveFileDialog1.AddExtension = true; - - if (!string.IsNullOrEmpty(VideoFileName)) - { - saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(VideoFileName); - } - else - { - saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(_fileName); - } - - if (!string.IsNullOrEmpty(openFileDialog1.InitialDirectory)) - { - saveFileDialog1.InitialDirectory = openFileDialog1.InitialDirectory; - } - - DialogResult result = saveFileDialog1.ShowDialog(this); - if (result == DialogResult.OK) - { - openFileDialog1.InitialDirectory = saveFileDialog1.InitialDirectory; - string fileName = saveFileDialog1.FileName; - string ext = Path.GetExtension(fileName); - bool extOk = ext.Equals(cavena890.Extension, StringComparison.OrdinalIgnoreCase); - if (!extOk) - { - if (fileName.EndsWith('.')) - { - fileName = fileName.Substring(0, fileName.Length - 1); - } - - fileName += cavena890.Extension; - } - - using (var form = new Cavena890SaveOptions(_subtitle, _fileName)) - { - if (form.ShowDialog(this) == DialogResult.OK) - { - cavena890.Save(fileName, GetSaveSubtitle(_subtitle)); - } - } - } - } - - private void PacScreenElectronicsToolStripMenuItemClick(object sender, EventArgs e) - { - var pac = new Pac(); - saveFileDialog1.Filter = pac.Name + "|*" + pac.Extension; - saveFileDialog1.Title = _language.SaveSubtitleAs; - saveFileDialog1.DefaultExt = "*" + pac.Extension; - saveFileDialog1.AddExtension = true; - - if (!string.IsNullOrEmpty(VideoFileName)) - { - saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(VideoFileName); - } - else - { - saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(_fileName); - } - - if (!string.IsNullOrEmpty(openFileDialog1.InitialDirectory)) - { - saveFileDialog1.InitialDirectory = openFileDialog1.InitialDirectory; - } - - DialogResult result = saveFileDialog1.ShowDialog(this); - if (result == DialogResult.OK) - { - openFileDialog1.InitialDirectory = saveFileDialog1.InitialDirectory; - string fileName = saveFileDialog1.FileName; - string ext = Path.GetExtension(fileName); - bool extOk = ext.Equals(pac.Extension, StringComparison.OrdinalIgnoreCase); - if (!extOk) - { - if (fileName.EndsWith('.')) - { - fileName = fileName.Substring(0, fileName.Length - 1); - } - - fileName += pac.Extension; - } - - pac.Save(fileName, GetSaveSubtitle(_subtitle)); - } - } - - private void uniPacExportToolStripMenuItem_Click(object sender, EventArgs e) - { - var uniPac = new PacUnicode(); - saveFileDialog1.Filter = uniPac.Name + "|*" + uniPac.Extension; - saveFileDialog1.Title = _language.SaveSubtitleAs; - saveFileDialog1.DefaultExt = "*" + uniPac.Extension; - saveFileDialog1.AddExtension = true; - - if (!string.IsNullOrEmpty(VideoFileName)) - { - saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(VideoFileName); - } - else - { - saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(_fileName); - } - - if (!string.IsNullOrEmpty(openFileDialog1.InitialDirectory)) - { - saveFileDialog1.InitialDirectory = openFileDialog1.InitialDirectory; - } - - DialogResult result = saveFileDialog1.ShowDialog(this); - if (result == DialogResult.OK) - { - openFileDialog1.InitialDirectory = saveFileDialog1.InitialDirectory; - string fileName = saveFileDialog1.FileName; - string ext = Path.GetExtension(fileName); - bool extOk = ext.Equals(uniPac.Extension, StringComparison.OrdinalIgnoreCase); - if (!extOk) - { - if (fileName.EndsWith('.')) - { - fileName = fileName.Substring(0, fileName.Length - 1); - } - - fileName += uniPac.Extension; - } - - uniPac.Save(fileName, GetSaveSubtitle(_subtitle)); - } - } - - private void toolStripMenuItemExportAyato_Click(object sender, EventArgs e) - { - var ayato = new Ayato(); - saveFileDialog1.Filter = ayato.Name + "|*" + ayato.Extension; - saveFileDialog1.Title = _language.SaveSubtitleAs; - saveFileDialog1.DefaultExt = "*" + ayato.Extension; - saveFileDialog1.AddExtension = true; - - if (!string.IsNullOrEmpty(VideoFileName)) - { - saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(VideoFileName); - } - else - { - saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(_fileName); - } - - if (!string.IsNullOrEmpty(openFileDialog1.InitialDirectory)) - { - saveFileDialog1.InitialDirectory = openFileDialog1.InitialDirectory; - } - - DialogResult result = saveFileDialog1.ShowDialog(this); - if (result == DialogResult.OK) - { - openFileDialog1.InitialDirectory = saveFileDialog1.InitialDirectory; - string fileName = saveFileDialog1.FileName; - string ext = Path.GetExtension(fileName); - bool extOk = ext.Equals(ayato.Extension, StringComparison.OrdinalIgnoreCase); - if (!extOk) - { - if (fileName.EndsWith('.')) - { - fileName = fileName.Substring(0, fileName.Length - 1); - } - - fileName += ayato.Extension; - } - - ayato.Save(fileName, VideoFileName, GetSaveSubtitle(_subtitle)); - } - } - - private void TextBoxListViewTextEnter(object sender, EventArgs e) - { - if (_findHelper != null) - { - _findHelper.MatchInOriginal = false; - } - - if (_measurementConverter != null) - { - _measurementConverter.IsOriginalActive = false; - } - } - - private void TextBoxListViewTextAlternateEnter(object sender, EventArgs e) - { - if (_findHelper != null) - { - _findHelper.MatchInOriginal = true; - } - - if (_measurementConverter != null) - { - _measurementConverter.IsOriginalActive = true; - } - } - - private void PlainTextToolStripMenuItemClick(object sender, EventArgs e) - { - using (var exportText = new ExportText()) - { - exportText.Initialize(GetSaveSubtitle(_subtitle), _fileName); - if (exportText.ShowDialog() == DialogResult.OK) - { - ShowStatus(_language.SubtitleExported); - } - } - } - - private void BluraySupToolStripMenuItemClick(object sender, EventArgs e) - { - using (var exportBdnXmlPng = new ExportPngXml()) - { - exportBdnXmlPng.Initialize(_subtitle, GetCurrentSubtitleFormat(), ExportPngXml.ExportFormats.BluraySup, _fileName, _videoInfo, VideoFileName); - exportBdnXmlPng.ShowDialog(this); - } - } - - private void VobSubsubidxToolStripMenuItemClick(object sender, EventArgs e) - { - using (var exportBdnXmlPng = new ExportPngXml()) - { - exportBdnXmlPng.Initialize(_subtitle, GetCurrentSubtitleFormat(), ExportPngXml.ExportFormats.VobSub, _fileName, _videoInfo, VideoFileName); - exportBdnXmlPng.ShowDialog(this); - } - } - - private void TextBoxListViewTextAlternateKeyUp(object sender, KeyEventArgs e) - { - textBoxListViewTextAlternate.ClearUndo(); - UpdatePositionAndTotalLength(labelTextAlternateLineTotal, textBoxListViewTextAlternate); - } - - private void TimerTextUndoTick(object sender, EventArgs e) - { - if (_subtitle == null || _subtitle.Paragraphs.Count == 0 || _listViewTextTicks == -1 || !CanFocus) - { - return; - } - - // progress check - ShowTranslationProgress(); - - // text undo - int index = _listViewTextUndoIndex; - if (index == -1) - { - index = _subtitleListViewIndex; - } - - if (index < 0 || index >= _subtitle.Paragraphs.Count) - { - return; - } - - if ((DateTime.UtcNow.Ticks - _listViewTextTicks) > 10000 * 700) // only if last typed char was entered > 700 milliseconds - { - if (index < 0 || index >= _subtitle.Paragraphs.Count) - { - return; - } - - string newText = _subtitle.Paragraphs[index].Text.TrimEnd(); - string oldText = _listViewTextUndoLast; - if (oldText == null) - { - return; - } - - if (_listViewTextUndoLast != newText) - { - MakeHistoryForUndo(_languageGeneral.Text + ": " + _listViewTextUndoLast.TrimEnd() + " -> " + newText, false); - int hidx = _subtitle.HistoryItems.Count - 1; - if (hidx >= 0 && hidx < _subtitle.HistoryItems.Count) - { - _subtitle.HistoryItems[hidx].Subtitle.Paragraphs[index].Text = _listViewTextUndoLast; - } - - _listViewTextUndoLast = newText; - _listViewTextUndoIndex = -1; - } - } - } - - private void ShowTranslationProgress() - { - if (Configuration.Settings.General.ShowProgress) - { - if (_subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) - { - int numberOfNonBlankLines = 0; - foreach (var paragraph in _subtitle.Paragraphs) - { - if (!string.IsNullOrWhiteSpace(paragraph.Text)) - { - numberOfNonBlankLines++; - } - } - - int percent = (int)Math.Round(numberOfNonBlankLines * 100.0 / _subtitle.Paragraphs.Count); - toolStripStatusLabelProgress.Text = string.Format("{0}% completed", percent); - if (!toolStripStatusLabelProgress.Visible) - { - toolStripStatusLabelProgress.Visible = true; - } - } - else if (_subtitle.Paragraphs.Count > 0 && !string.IsNullOrWhiteSpace(VideoFileName) && mediaPlayer != null && mediaPlayer.VideoPlayer != null && mediaPlayer.VideoPlayer.Duration > 0) - { - var last = _subtitle.Paragraphs.LastOrDefault(); - if (last != null && !last.StartTime.IsMaxTime) - { - var subtitleEndSeconds = last.EndTime.TotalSeconds; - var videoEndSeconds = mediaPlayer.VideoPlayer.Duration; - int percent = (int)Math.Round(subtitleEndSeconds * 100.0 / videoEndSeconds); - toolStripStatusLabelProgress.Text = string.Format("{0}% completed", percent); - if (!toolStripStatusLabelProgress.Visible) - { - toolStripStatusLabelProgress.Visible = true; - } - } - } - else - { - toolStripStatusLabelProgress.Visible = false; - } - } - } - - private void TimerAlternateTextUndoTick(object sender, EventArgs e) - { - if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) - { - int index = _listViewTextUndoIndex; - if (index == -1) - { - index = _subtitleListViewIndex; - } - - if (_listViewAlternateTextTicks == -1 || !CanFocus || _subtitleAlternate == null || _subtitleAlternate.Paragraphs.Count == 0 || index < 0 || index >= _subtitleAlternate.Paragraphs.Count) - { - return; - } - - if ((DateTime.UtcNow.Ticks - _listViewAlternateTextTicks) > 10000 * 700) // only if last typed char was entered > 700 milliseconds - { - var original = Utilities.GetOriginalParagraph(index, _subtitle.Paragraphs[index], _subtitleAlternate.Paragraphs); - if (original != null) - { - index = _subtitleAlternate.Paragraphs.IndexOf(original); - } - else - { - return; - } - - string newText = _subtitleAlternate.Paragraphs[index].Text.TrimEnd(); - string oldText = _listViewAlternateTextUndoLast; - if (oldText == null || index < 0) - { - return; - } - - if (_listViewAlternateTextUndoLast != newText && _subtitle.HistoryItems.Count > 0 && - index < _subtitle.HistoryItems[_subtitle.HistoryItems.Count - 1].OriginalSubtitle.Paragraphs.Count) - { - MakeHistoryForUndo(_languageGeneral.Text + ": " + _listViewAlternateTextUndoLast.TrimEnd() + " -> " + newText, false); - _subtitle.HistoryItems[_subtitle.HistoryItems.Count - 1].OriginalSubtitle.Paragraphs[index].Text = _listViewAlternateTextUndoLast; - - _listViewAlternateTextUndoLast = newText; - _listViewTextUndoIndex = -1; - } - } - } - } - - private void UpdatePositionAndTotalLength(Label lineTotal, SETextBox textBox) - { - if (string.IsNullOrEmpty(textBox.Text)) - { - lineTotal.Text = string.Empty; - return; - } - - int extraNewLineLength = Environment.NewLine.Length - 1; - int lineBreakPos = textBox.Text.IndexOf(Environment.NewLine, StringComparison.Ordinal); - int pos = textBox.SelectionStart; - var s = HtmlUtil.RemoveHtmlTags(textBox.Text, true).Replace(Environment.NewLine, string.Empty); // we don't count new line in total length... correct? - int totalLength = s.CountCharacters(false, Configuration.Settings.General.IgnoreArabicDiacritics); - string totalL; - - if (Configuration.Settings.Tools.ListViewSyntaxColorWideLines) - { - var totalLengthPixels = TextWidth.CalcPixelWidth(s); - totalL = " " + string.Format(_languageGeneral.TotalLengthX, string.Format("{0} {1}", totalLength, totalLengthPixels)); - } - else - { - totalL = " " + string.Format(_languageGeneral.TotalLengthX, totalLength); - } - - if (lineBreakPos < 0 || pos <= lineBreakPos) - { - lineTotal.Text = "1," + (pos + 1) + totalL; - lineTotal.Left = textBox.Left + (textBox.Width - lineTotal.Width); - return; - } - - int secondLineBreakPos = textBox.Text.IndexOf(Environment.NewLine, lineBreakPos + 1, StringComparison.Ordinal); - if (secondLineBreakPos < 0 || pos <= secondLineBreakPos + extraNewLineLength) - { - lineTotal.Text = "2," + (pos - (lineBreakPos + extraNewLineLength)) + totalL; - lineTotal.Left = textBox.Left + (textBox.Width - lineTotal.Width); - return; - } - - int thirdLineBreakPos = textBox.Text.IndexOf(Environment.NewLine, secondLineBreakPos + 1, StringComparison.Ordinal); - if (thirdLineBreakPos < 0 || pos < thirdLineBreakPos + (extraNewLineLength * 2)) - { - lineTotal.Text = "3," + (pos - (secondLineBreakPos + extraNewLineLength)) + totalL; - lineTotal.Left = textBox.Left + (textBox.Width - lineTotal.Width); - return; - } - - int forthLineBreakPos = textBox.Text.IndexOf(Environment.NewLine, thirdLineBreakPos + 1, StringComparison.Ordinal); - if (forthLineBreakPos < 0 || pos < forthLineBreakPos + (extraNewLineLength * 3)) - { - lineTotal.Text = "4," + (pos - (thirdLineBreakPos + extraNewLineLength)) + totalL; - lineTotal.Left = textBox.Left + (textBox.Width - lineTotal.Width); - return; - } - - lineTotal.Text = string.Empty; - } - - private void TextBoxListViewTextMouseClick(object sender, MouseEventArgs e) - { - UpdatePositionAndTotalLength(labelTextLineTotal, textBoxListViewText); - } - - private void TextBoxListViewTextAlternateMouseClick(object sender, MouseEventArgs e) - { - UpdatePositionAndTotalLength(labelTextAlternateLineTotal, textBoxListViewTextAlternate); - } - - private void TabControlButtonsDrawItem(object sender, DrawItemEventArgs e) - { - var tc = (TabControl)sender; - var textBrush = new SolidBrush(ForeColor); - var tabFont = new Font(tc.Font, FontStyle.Regular); - if (e.State == DrawItemState.Selected) - { - tabFont = new Font(tc.Font, FontStyle.Bold); - e.Graphics.FillRectangle(new SolidBrush(SystemColors.Window), e.Bounds); - } - - Rectangle tabBounds = tc.GetTabRect(e.Index); - var stringFlags = new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center }; - e.Graphics.DrawString(tc.TabPages[e.Index].Text.Trim(), tabFont, textBrush, tabBounds, new StringFormat(stringFlags)); - } - - public void GotoNextSubPosFromVideoPos() - { - if (mediaPlayer.VideoPlayer != null && _subtitle != null) - { - double ms = mediaPlayer.VideoPlayer.CurrentPosition * TimeCode.BaseUnit; - foreach (var p in _subtitle.Paragraphs) - { - if (p.EndTime.TotalMilliseconds > ms && p.StartTime.TotalMilliseconds < ms) - { - // current sub - } - else if (p.Duration.TotalSeconds < 10 && p.StartTime.TotalMilliseconds > ms) - { - mediaPlayer.VideoPlayer.CurrentPosition = p.StartTime.TotalSeconds; - SubtitleListview1.SelectIndexAndEnsureVisible(_subtitle.GetIndex(p), true); - return; - } - } - } - } - - public void GotoPrevSubPosFromvideoPos() - { - if (mediaPlayer.VideoPlayer != null && _subtitle != null) - { - double ms = mediaPlayer.VideoPlayer.CurrentPosition * TimeCode.BaseUnit; - int i = _subtitle.Paragraphs.Count - 1; - while (i >= 0) - { - var p = _subtitle.Paragraphs[i]; - if (p.EndTime.TotalMilliseconds > ms && p.StartTime.TotalMilliseconds < ms) - { - // current sub - } - else if (p.Duration.TotalSeconds < 10 && p.StartTime.TotalMilliseconds < ms) - { - mediaPlayer.VideoPlayer.CurrentPosition = p.StartTime.TotalSeconds; - SubtitleListview1.SelectIndexAndEnsureVisible(_subtitle.GetIndex(p), true); - return; - } - - i--; - } - } - } - - private void AdobeEncoreFabImageScriptToolStripMenuItemClick(object sender, EventArgs e) - { - using (var exportBdnXmlPng = new ExportPngXml()) - { - exportBdnXmlPng.Initialize(_subtitle, GetCurrentSubtitleFormat(), ExportPngXml.ExportFormats.Fab, _fileName, _videoInfo, VideoFileName); - exportBdnXmlPng.ShowDialog(this); - } - } - - private void ToolStripMenuItemMergeDialogClick(object sender, EventArgs e) - { - MergeDialogs(); - } - - private void MainKeyUp(object sender, KeyEventArgs e) - { - if (_mainCreateStartDownEndUpParagraph != null) - { - var p = _subtitle.Paragraphs[_subtitleListViewIndex]; - if (p.ToString() == _mainCreateStartDownEndUpParagraph.ToString()) - { - ButtonSetEndClick(null, null); - } - - _mainCreateStartDownEndUpParagraph = null; - } - else if (_mainAdjustStartDownEndUpAndGoToNextParagraph != null) - { - var p = _subtitle.Paragraphs[_subtitleListViewIndex]; - if (p.ToString() == _mainAdjustStartDownEndUpAndGoToNextParagraph.ToString()) - { - double videoPositionInSeconds = mediaPlayer.CurrentPosition; - if (p.StartTime.TotalSeconds + 0.1 < videoPositionInSeconds) - { - ButtonSetEndClick(null, null); - } - - SubtitleListview1.SelectIndexAndEnsureVisible(_subtitleListViewIndex + 1, true); - } - - _mainAdjustStartDownEndUpAndGoToNextParagraph = null; - } - } - - private void ToolStripMenuItemSurroundWithMusicSymbolsClick(object sender, EventArgs e) - { - string tag = Configuration.Settings.Tools.MusicSymbol; - if (string.IsNullOrWhiteSpace(tag)) - { - return; - } - - if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 0) - { - SubtitleListview1.SelectedIndexChanged -= SubtitleListview1_SelectedIndexChanged; - MakeHistoryForUndo(string.Format(_language.BeforeAddingTagX, tag)); - - var indices = new List(); - foreach (ListViewItem item in SubtitleListview1.SelectedItems) - { - indices.Add(item.Index); - } - - SubtitleListview1.BeginUpdate(); - foreach (int i in indices) - { - if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) - { - var original = Utilities.GetOriginalParagraph(i, _subtitle.Paragraphs[i], _subtitleAlternate.Paragraphs); - if (original != null) - { - original.Text = ToogleMusicSymbols(tag, original.Text); - SubtitleListview1.SetAlternateText(i, original.Text); - } - } - - _subtitle.Paragraphs[i].Text = ToogleMusicSymbols(tag, _subtitle.Paragraphs[i].Text); - SubtitleListview1.SetText(i, _subtitle.Paragraphs[i].Text); - } - - SubtitleListview1.EndUpdate(); - - ShowStatus(string.Format(_language.TagXAdded, tag)); - ShowSource(); - RefreshSelectedParagraph(); - SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; - } - } - - private string ToogleMusicSymbols(string tag, string text) - { - string pre = string.Empty; - string post = string.Empty; - var indexOfEndBracket = text.IndexOf('}'); - if (text.StartsWith("{\\", StringComparison.Ordinal) && indexOfEndBracket > 1) - { - pre = text.Substring(0, indexOfEndBracket + 1); - text = text.Remove(0, indexOfEndBracket + 1); - } - - bool updated = true; - while (updated) - { - updated = false; - if (text.StartsWith(' ')) - { - pre += ' '; - text = text.Remove(0, 1); - updated = true; - } - else if (text.StartsWith("'); - if (endFont > 0) - { - pre += text.Substring(0, endFont + 1); - text = text.Remove(0, endFont + 1); - updated = true; - } - - if (text.EndsWith("
", StringComparison.OrdinalIgnoreCase)) - { - var endTag = "
"; - post += endTag; - text = text.Remove(text.Length - endTag.Length, endTag.Length); - } - } - } - - if (text.Contains(tag)) - { - text = pre + text.Replace(tag, string.Empty).Replace(Environment.NewLine + " ", Environment.NewLine).Replace(" " + Environment.NewLine, Environment.NewLine).Trim() + post; - } - else - { - if (Configuration.Settings.Tools.MusicSymbolStyle.Equals("single", StringComparison.OrdinalIgnoreCase)) - { - text = string.Format("{0}{1} {2}{3}", pre, tag, text.Replace(Environment.NewLine, Environment.NewLine + tag + " "), post); - } - else - { - text = string.Format("{0}{1} {2} {1}{3}", pre, tag, text.Replace(Environment.NewLine, " " + tag + Environment.NewLine + tag + " "), post); - } - } - - return text; - } - - private void SuperscriptToolStripMenuItemClick(object sender, EventArgs e) - { - var tb = GetFocusedTextBox(); - - string text = tb.SelectedText; - int selectionStart = tb.SelectionStart; - text = Utilities.ToSuperscript(text); - tb.SelectedText = text; - tb.SelectionStart = selectionStart; - tb.SelectionLength = text.Length; - } - - private void SubscriptToolStripMenuItemClick(object sender, EventArgs e) - { - var tb = GetFocusedTextBox(); - - string text = tb.SelectedText; - int selectionStart = tb.SelectionStart; - text = Utilities.ToSubscript(text); - tb.SelectedText = text; - tb.SelectionStart = selectionStart; - tb.SelectionLength = text.Length; - } - - private void ToolStripMenuItemImagePerFrameClick(object sender, EventArgs e) - { - using (var exportBdnXmlPng = new ExportPngXml()) - { - exportBdnXmlPng.Initialize(_subtitle, GetCurrentSubtitleFormat(), ExportPngXml.ExportFormats.ImageFrame, _fileName, _videoInfo, VideoFileName); - exportBdnXmlPng.ShowDialog(this); - } - } - - private void toolStripMenuItemApplyDisplayTimeLimits_Click(object sender, EventArgs e) - { - ApplyDisplayTimeLimits(false); - } - - private void ApplyDisplayTimeLimits(bool onlySelectedLines) - { - if (!IsSubtitleLoaded) - { - DisplaySubtitleNotLoadedMessage(); - return; - } - - ReloadFromSourceView(); - using (var applyDurationLimits = new ApplyDurationLimits()) - { - if (onlySelectedLines) - { - var selectedLines = new Subtitle(); - foreach (int index in SubtitleListview1.SelectedIndices) - { - selectedLines.Paragraphs.Add(_subtitle.Paragraphs[index]); - } - - applyDurationLimits.Initialize(selectedLines); - } - else - { - applyDurationLimits.Initialize(_subtitle); - } - - if (applyDurationLimits.ShowDialog(this) == DialogResult.OK) - { - MakeHistoryForUndo(_language.BeforeDisplayTimeAdjustment); - - if (onlySelectedLines) - { // we only update selected lines - int i = 0; - foreach (int index in SubtitleListview1.SelectedIndices) - { - _subtitle.Paragraphs[index] = applyDurationLimits.FixedSubtitle.Paragraphs[i]; - i++; - } - - ShowStatus(_language.VisualSyncPerformedOnSelectedLines); - SubtitleListview1.SyntaxColorAllLines(_subtitle); - } - else - { - SaveSubtitleListviewIndices(); - _subtitle.Paragraphs.Clear(); - foreach (var p in applyDurationLimits.FixedSubtitle.Paragraphs) - { - _subtitle.Paragraphs.Add(new Paragraph(p)); - } - - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - } - ShowSource(); - } - } - } - - private void generateDatetimeInfoFromVideoToolStripMenuItem_Click(object sender, EventArgs e) - { - ReloadFromSourceView(); - using (var extractDateTimeInfo = new ExtractDateTimeInfo()) - { - if (extractDateTimeInfo.ShowDialog(this) == DialogResult.OK) - { - if (ContinueNewOrExit()) - { - MakeHistoryForUndo(_language.BeforeDisplayTimeAdjustment); - - ResetSubtitle(); - _subtitle.Paragraphs.Clear(); - foreach (var p in extractDateTimeInfo.DateTimeSubtitle.Paragraphs) - { - _subtitle.Paragraphs.Add(new Paragraph(p)); - } - - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - ShowSource(); - OpenVideo(extractDateTimeInfo.VideoFileName); - } - } - } - } - - private void ToolStripMenuItemRightToLeftModeClick(object sender, EventArgs e) - { - var focusedItem = SubtitleListview1.FocusedItem; - toolStripMenuItemRightToLeftMode.Checked = !toolStripMenuItemRightToLeftMode.Checked; - if (!toolStripMenuItemRightToLeftMode.Checked) - { - RightToLeft = RightToLeft.No; - textBoxListViewText.RightToLeft = RightToLeft.No; - textBoxListViewTextAlternate.RightToLeft = RightToLeft.No; - SubtitleListview1.RightToLeft = RightToLeft.No; - SubtitleListview1.RightToLeftLayout = false; - textBoxSource.RightToLeft = RightToLeft.No; - mediaPlayer.TextRightToLeft = RightToLeft.No; - textBoxSearchWord.RightToLeft = RightToLeft.No; - Configuration.Settings.General.RightToLeftMode = false; - } - else - { - //RightToLeft = RightToLeft.Yes; - is this better? TimeUpDown custom control needs to support RTL before enabling this - textBoxListViewText.RightToLeft = RightToLeft.Yes; - textBoxListViewTextAlternate.RightToLeft = RightToLeft.Yes; - SubtitleListview1.RightToLeft = RightToLeft.Yes; - SubtitleListview1.RightToLeftLayout = true; - textBoxSource.RightToLeft = RightToLeft.Yes; - mediaPlayer.TextRightToLeft = RightToLeft.Yes; - textBoxSearchWord.RightToLeft = RightToLeft.Yes; - Configuration.Settings.General.RightToLeftMode = true; - } - - MainResize(); - TextBoxListViewTextTextChanged(null, null); - textBoxListViewTextAlternate_TextChanged(null, null); - if (focusedItem != null) - { - SubtitleListview1.SelectIndexAndEnsureVisible(focusedItem.Index, true); - } - } - - private void joinSubtitlesToolStripMenuItem_Click(object sender, EventArgs e) - { - ReloadFromSourceView(); - using (var joinSubtitles = new JoinSubtitles()) - { - if (joinSubtitles.ShowDialog(this) == DialogResult.OK && joinSubtitles.JoinedSubtitle != null && joinSubtitles.JoinedSubtitle.Paragraphs.Count > 0 && ContinueNewOrExit()) - { - MakeHistoryForUndo(_language.BeforeDisplaySubtitleJoin); - - ResetSubtitle(); - _subtitle.Paragraphs.Clear(); - _subtitle.Paragraphs.AddRange(joinSubtitles.JoinedSubtitle.Paragraphs); - SetCurrentFormat(joinSubtitles.JoinedFormat); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - SubtitleListview1.SelectIndexAndEnsureVisible(0, true); - ShowSource(); - ShowStatus(_language.SubtitlesJoined); - } - } - } - - private void toolStripMenuItemReverseRightToLeftStartEnd_Click(object sender, EventArgs e) - { - ReverseStartAndEndingForRtl(); - } - - private void toolStripMenuItemExportCapMakerPlus_Click(object sender, EventArgs e) - { - var capMakerPlus = new CapMakerPlus(); - saveFileDialog1.Filter = capMakerPlus.Name + "|*" + capMakerPlus.Extension; - saveFileDialog1.Title = _language.SaveSubtitleAs; - saveFileDialog1.DefaultExt = "*" + capMakerPlus.Extension; - saveFileDialog1.AddExtension = true; - - if (!string.IsNullOrEmpty(VideoFileName)) - { - saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(VideoFileName); - } - else - { - saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(_fileName); - } - - if (!string.IsNullOrEmpty(openFileDialog1.InitialDirectory)) - { - saveFileDialog1.InitialDirectory = openFileDialog1.InitialDirectory; - } - - DialogResult result = saveFileDialog1.ShowDialog(this); - if (result == DialogResult.OK) - { - openFileDialog1.InitialDirectory = saveFileDialog1.InitialDirectory; - string fileName = saveFileDialog1.FileName; - string ext = Path.GetExtension(fileName); - bool extOk = ext.Equals(capMakerPlus.Extension, StringComparison.OrdinalIgnoreCase); - if (!extOk) - { - if (fileName.EndsWith('.')) - { - fileName = fileName.Substring(0, fileName.Length - 1); - } - - fileName += capMakerPlus.Extension; - } - - CapMakerPlus.Save(fileName, GetSaveSubtitle(_subtitle)); - } - } - - private void toolStripMenuItemExportCheetahCap_Click(object sender, EventArgs e) - { - var cheetahCaption = new CheetahCaption(); - saveFileDialog1.Filter = cheetahCaption.Name + "|*" + cheetahCaption.Extension; - saveFileDialog1.Title = _language.SaveSubtitleAs; - saveFileDialog1.DefaultExt = "*" + cheetahCaption.Extension; - saveFileDialog1.AddExtension = true; - - if (!string.IsNullOrEmpty(VideoFileName)) - { - saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(VideoFileName); - } - else - { - saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(_fileName); - } - - if (!string.IsNullOrEmpty(openFileDialog1.InitialDirectory)) - { - saveFileDialog1.InitialDirectory = openFileDialog1.InitialDirectory; - } - - DialogResult result = saveFileDialog1.ShowDialog(this); - if (result == DialogResult.OK) - { - openFileDialog1.InitialDirectory = saveFileDialog1.InitialDirectory; - string fileName = saveFileDialog1.FileName; - string ext = Path.GetExtension(fileName); - bool extOk = ext.Equals(cheetahCaption.Extension, StringComparison.OrdinalIgnoreCase); - if (!extOk) - { - if (fileName.EndsWith('.')) - { - fileName = fileName.Substring(0, fileName.Length - 1); - } - - fileName += cheetahCaption.Extension; - } - - CheetahCaption.Save(fileName, GetSaveSubtitle(_subtitle)); - } - } - - private void toolStripMenuItemExportCaptionInc_Click(object sender, EventArgs e) - { - var captionInc = new CaptionsInc(); - saveFileDialog1.Filter = captionInc.Name + "|*" + captionInc.Extension; - saveFileDialog1.Title = _language.SaveSubtitleAs; - saveFileDialog1.DefaultExt = "*" + captionInc.Extension; - saveFileDialog1.AddExtension = true; - - if (!string.IsNullOrEmpty(VideoFileName)) - { - saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(VideoFileName); - } - else - { - saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(_fileName); - } - - if (!string.IsNullOrEmpty(openFileDialog1.InitialDirectory)) - { - saveFileDialog1.InitialDirectory = openFileDialog1.InitialDirectory; - } - - DialogResult result = saveFileDialog1.ShowDialog(this); - if (result == DialogResult.OK) - { - openFileDialog1.InitialDirectory = saveFileDialog1.InitialDirectory; - string fileName = saveFileDialog1.FileName; - string ext = Path.GetExtension(fileName); - bool extOk = ext.Equals(captionInc.Extension, StringComparison.OrdinalIgnoreCase); - if (!extOk) - { - if (fileName.EndsWith('.')) - { - fileName = fileName.Substring(0, fileName.Length - 1); - } - - fileName += captionInc.Extension; - } - - CaptionsInc.Save(fileName, GetSaveSubtitle(_subtitle)); - } - } - - private void toolStripMenuItemExportUltech130_Click(object sender, EventArgs e) - { - var ultech130 = new Ultech130(); - saveFileDialog1.Filter = ultech130.Name + "|*" + ultech130.Extension; - saveFileDialog1.Title = _language.SaveSubtitleAs; - saveFileDialog1.DefaultExt = "*" + ultech130.Extension; - saveFileDialog1.AddExtension = true; - - if (!string.IsNullOrEmpty(VideoFileName)) - { - saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(VideoFileName); - } - else - { - saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(_fileName); - } - - if (!string.IsNullOrEmpty(openFileDialog1.InitialDirectory)) - { - saveFileDialog1.InitialDirectory = openFileDialog1.InitialDirectory; - } - - DialogResult result = saveFileDialog1.ShowDialog(this); - if (result == DialogResult.OK) - { - openFileDialog1.InitialDirectory = saveFileDialog1.InitialDirectory; - string fileName = saveFileDialog1.FileName; - string ext = Path.GetExtension(fileName); - bool extOk = ext.Equals(ultech130.Extension, StringComparison.OrdinalIgnoreCase); - if (!extOk) - { - if (fileName.EndsWith('.')) - { - fileName = fileName.Substring(0, fileName.Length - 1); - } - - fileName += ultech130.Extension; - } - - Ultech130.Save(fileName, GetSaveSubtitle(_subtitle)); - } - } - - private void toolStripMenuItemAssStyles_Click(object sender, EventArgs e) - { - StylesForm styles = null; - try - { - var format = GetCurrentSubtitleFormat(); - var formatType = format.GetType(); - if (formatType == typeof(AdvancedSubStationAlpha) || formatType == typeof(SubStationAlpha)) - { - styles = new SubStationAlphaStyles(_subtitle, format); - if (styles.ShowDialog(this) == DialogResult.OK) - { - if (_subtitle.Header != styles.Header) - { - MakeHistoryForUndo(styles.Text); - } - - _subtitle.Header = styles.Header; - var styleList = AdvancedSubStationAlpha.GetStylesFromHeader(_subtitle.Header); - if ((styles as SubStationAlphaStyles).RenameActions.Count > 0) - { - foreach (var renameAction in (styles as SubStationAlphaStyles).RenameActions) - { - for (var i = 0; i < _subtitle.Paragraphs.Count; i++) - { - var p = _subtitle.Paragraphs[i]; - if (p.Extra == renameAction.OldName) - { - p.Extra = renameAction.NewName; - } - } - } - - CleanRemovedStyles(styleList); - SaveSubtitleListviewIndices(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - } - else - { - CleanRemovedStyles(styleList); - } - } - } - else if (formatType == typeof(TimedText10) || formatType == typeof(ItunesTimedText)) - { - styles = new TimedTextStyles(_subtitle); - if (styles.ShowDialog(this) == DialogResult.OK) - { - if (_subtitle.Header != styles.Header) - { - MakeHistoryForUndo(styles.Text); - } - - _subtitle.Header = styles.Header; - } - } - } - finally - { - mediaPlayer.LastParagraph = null; - UiUtil.ShowSubtitle(_subtitle, mediaPlayer); - styles?.Dispose(); - } - } - - private void CleanRemovedStyles(List styleList) - { - for (var i = 0; i < _subtitle.Paragraphs.Count; i++) - { - var p = _subtitle.Paragraphs[i]; - if (p.Extra == null || !styleList.Any(s => s.Equals(p.Extra == "*Default" ? "Default" : p.Extra, StringComparison.OrdinalIgnoreCase))) - { - p.Extra = styleList[0]; - SubtitleListview1.SetExtraText(i, p.Extra, SubtitleListview1.ForeColor); - } - } - } - - private void toolStripMenuItemSubStationAlpha_Click(object sender, EventArgs e) - { - if (tabControlSubtitle.SelectedIndex == TabControlSourceView) - { - ReloadFromSourceView(); - } - - using (var properties = new SubStationAlphaProperties(_subtitle, GetCurrentSubtitleFormat(), VideoFileName, _fileName)) - { - if (properties.ShowDialog(this) == DialogResult.OK && tabControlSubtitle.SelectedIndex == TabControlSourceView) - { - ShowSource(); - } - } - } - - private static string RemoveAssAlignmentTags(string s) - { - return s.Replace("{\\an1}", string.Empty) // ASS tags alone - .Replace("{\\an2}", string.Empty) - .Replace("{\\an3}", string.Empty) - .Replace("{\\an4}", string.Empty) - .Replace("{\\an5}", string.Empty) - .Replace("{\\an6}", string.Empty) - .Replace("{\\an7}", string.Empty) - .Replace("{\\an8}", string.Empty) - .Replace("{\\an9}", string.Empty) - - .Replace("{an1\\", "{") // ASS multi tags (start) - .Replace("{an2\\", "{") - .Replace("{an3\\", "{") - .Replace("{an4\\", "{") - .Replace("{an5\\", "{") - .Replace("{an6\\", "{") - .Replace("{an7\\", "{") - .Replace("{an8\\", "{") - .Replace("{an9\\", "{") - - .Replace("\\an1\\", "\\") // ASS multi tags (middle) - .Replace("\\an2\\", "\\") - .Replace("\\an3\\", "\\") - .Replace("\\an4\\", "\\") - .Replace("\\an5\\", "\\") - .Replace("\\an6\\", "\\") - .Replace("\\an7\\", "\\") - .Replace("\\an8\\", "\\") - .Replace("\\an9\\", "\\") - - .Replace("\\an1}", "}") // ASS multi tags (end) - .Replace("\\an2}", "}") - .Replace("\\an3}", "}") - .Replace("\\an4}", "}") - .Replace("\\an5}", "}") - .Replace("\\an6}", "}") - .Replace("\\an7}", "}") - .Replace("\\an8}", "}") - .Replace("\\an9}", "}") - - .Replace("{\\a1}", string.Empty) // SSA tags - .Replace("{\\a2}", string.Empty) - .Replace("{\\a3}", string.Empty) - .Replace("{\\a4}", string.Empty) - .Replace("{\\a5}", string.Empty) - .Replace("{\\a6}", string.Empty) - .Replace("{\\a7}", string.Empty) - .Replace("{\\a8}", string.Empty) - .Replace("{\\a9}", string.Empty); - } - - private static string SetAlignTag(string s, string tag) - { - var text = RemoveAssAlignmentTags(s); - if (text.StartsWith("{\\", StringComparison.Ordinal) && text.Contains('}')) - { - if (!string.IsNullOrEmpty(tag)) - { - return text.Insert(1, "\\" + tag.TrimStart('{').TrimStart('\\').TrimEnd('}')); - } - - return text; - } - else - { - return string.Format(@"{0}{1}", tag, text); - } - } - - private void toolStripMenuItemAlignment_Click(object sender, EventArgs e) - { - var formatType = GetCurrentSubtitleFormat().GetType(); - - if (formatType == typeof(NetflixImsc11Japanese)) - { - using (var f = new AlignmentPickerJapanese(textBoxListViewText.Text)) - { - if (f.ShowDialog(this) == DialogResult.OK) - { - SetAlignment(f.ContentAlignment, true); - } - } - - return; - } - - using (var f = new AlignmentPicker(textBoxListViewText.Text)) - { - f.TopMost = true; - f.StartPosition = FormStartPosition.Manual; - f.Left = Cursor.Position.X - 150; - f.Top = Cursor.Position.Y - 75; - if (f.ShowDialog(this) == DialogResult.OK) - { - string tag = string.Empty; - if (formatType == typeof(SubStationAlpha)) - { - //1: Bottom left - //2: Bottom center - //3: Bottom right - //9: Middle left - //10: Middle center - //11: Middle right - //5: Top left - //6: Top center - //7: Top right - switch (f.Alignment) - { - case ContentAlignment.BottomLeft: - tag = "{\\a1}"; - break; - case ContentAlignment.BottomCenter: - tag = "{\\a2}"; - break; - case ContentAlignment.BottomRight: - tag = "{\\a3}"; - break; - case ContentAlignment.MiddleLeft: - tag = "{\\a9}"; - break; - case ContentAlignment.MiddleCenter: - tag = "{\\a10}"; - break; - case ContentAlignment.MiddleRight: - tag = "{\\a11}"; - break; - case ContentAlignment.TopLeft: - tag = "{\\a5}"; - break; - case ContentAlignment.TopCenter: - tag = "{\\a6}"; - break; - case ContentAlignment.TopRight: - tag = "{\\a7}"; - break; - } - } - else - { - //1: Bottom left - //2: Bottom center - //3: Bottom right - //4: Middle left - //5: Middle center - //6: Middle right - //7: Top left - //8: Top center - //9: Top right - switch (f.Alignment) - { - case ContentAlignment.BottomLeft: - tag = "{\\an1}"; - break; - case ContentAlignment.BottomCenter: - if (formatType == typeof(SubRip)) - { - tag = string.Empty; - } - else - { - tag = "{\\an2}"; - } - - break; - case ContentAlignment.BottomRight: - tag = "{\\an3}"; - break; - case ContentAlignment.MiddleLeft: - tag = "{\\an4}"; - break; - case ContentAlignment.MiddleCenter: - tag = "{\\an5}"; - break; - case ContentAlignment.MiddleRight: - tag = "{\\an6}"; - break; - case ContentAlignment.TopLeft: - tag = "{\\an7}"; - break; - case ContentAlignment.TopCenter: - tag = "{\\an8}"; - break; - case ContentAlignment.TopRight: - tag = "{\\an9}"; - break; - } - } - - if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 0) - { - SetAlignment(tag, true); - } - } - } - } - - private void toolStripMenuItemRestoreAutoBackup_Click(object sender, EventArgs e) - { - _lastDoNotPrompt = -1; - using (var restoreAutoBackup = new RestoreAutoBackup()) - { - if (restoreAutoBackup.ShowDialog(this) == DialogResult.OK && !string.IsNullOrEmpty(restoreAutoBackup.AutoBackupFileName)) - { - if (ContinueNewOrExit()) - { - OpenSubtitle(restoreAutoBackup.AutoBackupFileName, null); - _fileName = _fileName.Remove(0, Configuration.AutoBackupDirectory.Length).TrimStart(Path.DirectorySeparatorChar); - _converted = true; - SetTitle(); - } - } - } - } - - private void labelStatus_Click(object sender, EventArgs e) - { - if (_statusLog.Count == 0) - { - return; - } - - if (_statusLogForm == null || _statusLogForm.IsDisposed) - { - _statusLogForm = new StatusLog(_statusLog); - _statusLogForm.Show(this); - } - else - { - _statusLogForm.Show(); - } - } - - private void toolStripMenuItemStatistics_Click(object sender, EventArgs e) - { - using (var stats = new Statistics(_subtitle, _fileName, GetCurrentSubtitleFormat())) - { - stats.ShowDialog(this); - } - } - - private void toolStripMenuItemDCinemaProperties_Click(object sender, EventArgs e) - { - PositionAndSizeForm properties = null; - try - { - if (GetCurrentSubtitleFormat().GetType() == typeof(DCinemaInterop)) - { - properties = new DCinema.DCinemaPropertiesInterop(); - } - else - { - properties = new DCinema.DCinemaPropertiesSmpte(); - } - - properties.ShowDialog(this); - } - finally - { - properties?.Dispose(); - } - } - - private void toolStripMenuItemTextTimeCodePair_Click(object sender, EventArgs e) - { - if (saveFileDialog1.ShowDialog(this) == DialogResult.OK) - { - saveFileDialog1.Filter = _language.TextFiles + "|*.txt"; - saveFileDialog1.Title = _language.SaveSubtitleAs; - saveFileDialog1.DefaultExt = "*.txt"; - saveFileDialog1.AddExtension = true; - - string fname = saveFileDialog1.FileName; - if (string.IsNullOrEmpty(fname)) - { - fname = "ATS"; - } - - if (!fname.EndsWith(".txt", StringComparison.Ordinal)) - { - fname += ".txt"; - } - - string fileNameTimeCode = fname.Insert(fname.Length - 4, "_timecode"); - string fileNameText = fname.Insert(fname.Length - 4, "_text"); - - var timeCodeLines = new StringBuilder(); - var textLines = new StringBuilder(); - - const string timeCodeWriteFormat = "{0:00}:{1:00}:{2:00}:{3:00}"; - foreach (var p in GetSaveSubtitle(_subtitle).Paragraphs) - { - timeCodeLines.AppendLine(string.Format(timeCodeWriteFormat, p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, SubtitleFormat.MillisecondsToFramesMaxFrameRate(p.StartTime.Milliseconds))); - timeCodeLines.AppendLine(string.Format(timeCodeWriteFormat, p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, SubtitleFormat.MillisecondsToFramesMaxFrameRate(p.EndTime.Milliseconds))); - - textLines.AppendLine(HtmlUtil.RemoveHtmlTags(p.Text).Replace(Environment.NewLine, "|")); - textLines.AppendLine(); - } - - File.WriteAllText(fileNameTimeCode, timeCodeLines.ToString(), Encoding.UTF8); - File.WriteAllText(fileNameText, textLines.ToString(), Encoding.UTF8); - } - } - - private void textWordsPerMinutewpmToolStripMenuItem_Click(object sender, EventArgs e) - { - SortSubtitle(SubtitleSortCriteria.WordsPerMinute, (sender as ToolStripItem).Text); - } - - private void toolStripMenuItemTTPropertiesClick(object sender, EventArgs e) - { - var subtitleFormatType = GetCurrentSubtitleFormat().GetType(); - if (subtitleFormatType != typeof(TimedText10) && subtitleFormatType != typeof(ItunesTimedText)) - { - return; - } - - using (var properties = new TimedTextProperties(_subtitle)) - { - properties.ShowDialog(this); - } - } - - private void ToolStripMenuItemSaveSelectedLinesClick(object sender, EventArgs e) - { - var newSub = new Subtitle(_subtitle); - newSub.Header = _subtitle.Header; - newSub.Paragraphs.Clear(); - foreach (int index in SubtitleListview1.SelectedIndices) - { - newSub.Paragraphs.Add(_subtitle.Paragraphs[index]); - } - - SubtitleFormat currentFormat = GetCurrentSubtitleFormat(); - UiUtil.SetSaveDialogFilter(saveFileDialog1, currentFormat); - saveFileDialog1.Title = _language.SaveSubtitleAs; - saveFileDialog1.DefaultExt = "*" + currentFormat.Extension; - saveFileDialog1.AddExtension = true; - if (!string.IsNullOrEmpty(_fileName)) - { - saveFileDialog1.InitialDirectory = Path.GetDirectoryName(_fileName); - } - - if (saveFileDialog1.ShowDialog(this) == DialogResult.OK) - { - int index = 0; - foreach (SubtitleFormat format in SubtitleFormat.AllSubtitleFormats) - { - if (saveFileDialog1.FilterIndex == index + 1) - { - // only allow current extension or ".txt" - string fileName = saveFileDialog1.FileName; - string ext = Path.GetExtension(fileName).ToLowerInvariant(); - bool extOk = ext.Equals(format.Extension, StringComparison.OrdinalIgnoreCase) || format.AlternateExtensions.Contains(ext) || ext == ".txt"; - if (!extOk) - { - if (fileName.EndsWith('.')) - { - fileName = fileName.TrimEnd('.'); - } - - fileName += format.Extension; - } - - if (format.IsTextBased) - { - string allText = GetSaveSubtitle(newSub).ToText(format); - File.WriteAllText(fileName, allText, GetCurrentEncoding()); - ShowStatus(string.Format(_language.XLinesSavedAsY, newSub.Paragraphs.Count, fileName)); - return; - } - else if (format.GetType() == typeof(Ebu)) - { - new Ebu().Save(fileName, GetSaveSubtitle(newSub)); - ShowStatus(string.Format(_language.XLinesSavedAsY, newSub.Paragraphs.Count, fileName)); - return; - } - } - - index++; - } - } - } - - private void GuessTimeCodesToolStripMenuItemClick(object sender, EventArgs e) - { - using (var form = new WaveformGenerateTimeCodes()) - { - if (form.ShowDialog(this) == DialogResult.OK) - { - MakeHistoryForUndoOnlyIfNotResent(string.Format(_language.BeforeGuessingTimeCodes)); - - double startFromSeconds = 0; - if (form.StartFromVideoPosition) - { - startFromSeconds = mediaPlayer.CurrentPosition; - } - - if (form.DeleteAll) - { - _subtitle.Paragraphs.Clear(); - } - else if (form.DeleteForward) - { - for (int i = _subtitle.Paragraphs.Count - 1; i > 0; i--) - { - if (_subtitle.Paragraphs[i].EndTime.TotalSeconds + 1 > startFromSeconds) - { - _subtitle.Paragraphs.RemoveAt(i); - } - } - } - - audioVisualizer.GenerateTimeCodes(_subtitle, startFromSeconds, form.BlockSize, form.VolumeMinimum, form.VolumeMaximum, form.DefaultMilliseconds); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RefreshSelectedParagraph(); - } - } - } - - private void DvdStudioProStl_Click(object sender, EventArgs e) - { - using (var exportBdnXmlPng = new ExportPngXml()) - { - exportBdnXmlPng.Initialize(_subtitle, GetCurrentSubtitleFormat(), "STL", _fileName, _videoInfo, VideoFileName); - exportBdnXmlPng.ShowDialog(this); - } - } - - private void toolStripMenuItemPlugins_Click(object sender, EventArgs e) - { - using (var form = new PluginsGet()) - { - form.ShowDialog(this); - LoadPlugins(); - } - } - - private void toolStripMenuItemUndo_Click(object sender, EventArgs e) - { - UndoToIndex(true); - } - - private void toolStripMenuItemRedo_Click(object sender, EventArgs e) - { - UndoToIndex(false); - } - - private void seekSilenceToolStripMenuItem_Click(object sender, EventArgs e) - { - if (audioVisualizer.WavePeaks == null) - { - return; - } - - using (var form = new SeekSilence()) - { - if (form.ShowDialog(this) == DialogResult.OK) - { - if (form.SeekForward) - { - audioVisualizer.FindDataBelowThreshold(form.VolumeBelow, form.SecondsDuration); - } - else - { - audioVisualizer.FindDataBelowThresholdBack(form.VolumeBelow, form.SecondsDuration); - } - } - } - } - - private void toolStripMenuItemPasteSpecial_Click(object sender, EventArgs e) - { - string text = Clipboard.GetText(); - var tmp = new Subtitle(); - var list = new List(text.SplitToLines()); - new SubRip().LoadSubtitle(tmp, list, null); - if (tmp.Paragraphs.Count == 0) - { - tmp = SubtitleFormat.LoadSubtitleFromLines(list, null) ?? new Subtitle(); - } - - if (SubtitleListview1.SelectedItems.Count == 1 && text.Length > 0) - { - var form = new ColumnPaste(SubtitleListview1.IsAlternateTextColumnVisible && _subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle, tmp.Paragraphs.Count == 0); - if (form.ShowDialog(this) == DialogResult.OK) - { - MakeHistoryForUndo(_language.BeforeColumnPaste); - - if (tmp.Paragraphs.Count == 0) - { - foreach (var line in text.SplitToLines()) - { - tmp.Paragraphs.Add(new Paragraph(line, 0, 0)); - } - } - - int index = FirstSelectedIndex; - - if (!form.PasteOverwrite) - { - for (int i = 0; i < tmp.Paragraphs.Count; i++) - { - if (form.PasteAll) - { - for (int k = _subtitle.Paragraphs.Count - 2; k >= index; k--) - { - _subtitle.Paragraphs[k + 1] = new Paragraph(_subtitle.Paragraphs[k]); - } - - if (index + i < _subtitle.Paragraphs.Count) - { - _subtitle.Paragraphs[index + i].Text = string.Empty; - } - } - else if (form.PasteTimeCodesOnly) - { - for (int k = _subtitle.Paragraphs.Count - 2; k >= index; k--) - { - _subtitle.Paragraphs[k + 1].StartTime.TotalMilliseconds = _subtitle.Paragraphs[k].StartTime.TotalMilliseconds; - _subtitle.Paragraphs[k + 1].EndTime.TotalMilliseconds = _subtitle.Paragraphs[k].EndTime.TotalMilliseconds; - } - } - else if (form.PasteTextOnly) - { - for (int k = _subtitle.Paragraphs.Count - 2; k >= index; k--) - { - _subtitle.Paragraphs[k + 1].Text = _subtitle.Paragraphs[k].Text; - } - } - else if (form.PasteOriginalTextOnly) - { - for (int k = _subtitle.Paragraphs.Count - 2; k >= index; k--) - { - var original = Utilities.GetOriginalParagraph(k, _subtitle.Paragraphs[k], _subtitleAlternate.Paragraphs); - var originalNext = Utilities.GetOriginalParagraph(k + 1, _subtitle.Paragraphs[k + 1], _subtitleAlternate.Paragraphs); - if (original != null) - { - originalNext.Text = original.Text; - } - } - - if (index + i < _subtitle.Paragraphs.Count) - { - var original = Utilities.GetOriginalParagraph(index, _subtitle.Paragraphs[index + i], _subtitleAlternate.Paragraphs); - if (original != null) - { - original.Text = string.Empty; - } - } - } - } - } - - if (form.PasteOverwrite) - { - for (int i = 0; i < tmp.Paragraphs.Count; i++) - { - if (form.PasteAll) - { - if (index + i < _subtitle.Paragraphs.Count) - { - _subtitle.Paragraphs[index + i].Text = tmp.Paragraphs[i].Text; - _subtitle.Paragraphs[index + i].StartTime.TotalMilliseconds = tmp.Paragraphs[i].StartTime.TotalMilliseconds; - _subtitle.Paragraphs[index + i].EndTime.TotalMilliseconds = tmp.Paragraphs[i].EndTime.TotalMilliseconds; - } - } - else if (form.PasteTimeCodesOnly) - { - if (index + i < _subtitle.Paragraphs.Count) - { - _subtitle.Paragraphs[index + i].StartTime.TotalMilliseconds = tmp.Paragraphs[i].StartTime.TotalMilliseconds; - _subtitle.Paragraphs[index + i].EndTime.TotalMilliseconds = tmp.Paragraphs[i].EndTime.TotalMilliseconds; - } - } - else if (form.PasteTextOnly) - { - if (index + i < _subtitle.Paragraphs.Count) - { - _subtitle.Paragraphs[index + i].Text = tmp.Paragraphs[i].Text; - } - } - else if (form.PasteOriginalTextOnly) - { - if (index + i < _subtitle.Paragraphs.Count) - { - var original = Utilities.GetOriginalParagraph(index + i, _subtitle.Paragraphs[index + i], _subtitleAlternate.Paragraphs); - if (original != null) - { - original.Text = tmp.Paragraphs[i].Text; - } - } - } - } - } - else - { - for (int i = 0; i + index < _subtitle.Paragraphs.Count && i < tmp.Paragraphs.Count; i++) - { - if (index + i < _subtitle.Paragraphs.Count) - { - if (form.PasteAll) - { - _subtitle.Paragraphs[index + i].Text = tmp.Paragraphs[i].Text; - _subtitle.Paragraphs[index + i].StartTime.TotalMilliseconds = tmp.Paragraphs[i].StartTime.TotalMilliseconds; - _subtitle.Paragraphs[index + i].EndTime.TotalMilliseconds = tmp.Paragraphs[i].EndTime.TotalMilliseconds; - } - else if (form.PasteTimeCodesOnly) - { - _subtitle.Paragraphs[index + i].StartTime.TotalMilliseconds = tmp.Paragraphs[i].StartTime.TotalMilliseconds; - _subtitle.Paragraphs[index + i].EndTime.TotalMilliseconds = tmp.Paragraphs[i].EndTime.TotalMilliseconds; - } - else if (form.PasteTextOnly) - { - _subtitle.Paragraphs[index + i].Text = tmp.Paragraphs[i].Text; - } - else if (form.PasteOriginalTextOnly) - { - var original = Utilities.GetOriginalParagraph(index + i, _subtitle.Paragraphs[index + i], _subtitleAlternate.Paragraphs); - if (original != null) - { - original.Text = tmp.Paragraphs[i].Text; - } - } - } - } - } - - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - SubtitleListview1.SelectIndexAndEnsureVisible(index, true); - RefreshSelectedParagraph(); - } - - form.Dispose(); - } - } - - private void deleteAndShiftCellsUpToolStripMenuItem_Click(object sender, EventArgs e) - { - if (SubtitleListview1.SelectedIndices.Count < 1) - { - return; - } - - int first = FirstSelectedIndex; - List list = new List(); - foreach (int index in SubtitleListview1.SelectedIndices) - { - list.Add(index); - } - - list.Sort(); - list.Reverse(); - - MakeHistoryForUndo(_language.BeforeColumnDelete); - foreach (int index in list) - { - for (int k = index; k < _subtitle.Paragraphs.Count - 1; k++) - { - _subtitle.Paragraphs[k].Text = _subtitle.Paragraphs[k + 1].Text; - } - - _subtitle.Paragraphs[_subtitle.Paragraphs.Count - 1].Text = string.Empty; - } - - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - SubtitleListview1.SelectIndexAndEnsureVisible(first, true); - RefreshSelectedParagraph(); - } - - private void toolStripMenuItemColumnImportText_Click(object sender, EventArgs e) - { - if (SubtitleListview1.SelectedIndices.Count < 1) - { - return; - } - - using (var importText = new ImportText()) - { - if (importText.ShowDialog(this) == DialogResult.OK) - { - MakeHistoryForUndo(_language.BeforeColumnImportText); - int index = FirstSelectedIndex; - for (int i = 0; i < importText.FixedSubtitle.Paragraphs.Count; i++) - { - for (int k = _subtitle.Paragraphs.Count - 2; k > index; k--) - { - _subtitle.Paragraphs[k + 1].Text = _subtitle.Paragraphs[k].Text; - } - - if (index + i < _subtitle.Paragraphs.Count) - { - _subtitle.Paragraphs[index + i].Text = string.Empty; - } - } - - for (int i = 0; i + index < _subtitle.Paragraphs.Count && i < importText.FixedSubtitle.Paragraphs.Count; i++) - { - _subtitle.Paragraphs[index + i].Text = importText.FixedSubtitle.Paragraphs[i].Text; - } - - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - SubtitleListview1.SelectIndexAndEnsureVisible(index, true); - RefreshSelectedParagraph(); - } - } - } - - private void ShiftTextCellsDownToolStripMenuItem_Click(object sender, EventArgs e) - { - if (SubtitleListview1.SelectedIndices.Count < 1) - { - return; - } - - int index = FirstSelectedIndex; - int count = SubtitleListview1.SelectedIndices.Count; - MakeHistoryForUndo(_language.BeforeColumnShiftCellsDown); - for (int i = 0; i < count; i++) - { - for (int k = _subtitle.Paragraphs.Count - 2; k >= index; k--) - { - _subtitle.Paragraphs[k + 1].Text = _subtitle.Paragraphs[k].Text; - } - - if (index + i < _subtitle.Paragraphs.Count) - { - _subtitle.Paragraphs[index + i].Text = string.Empty; - } - } - - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - SubtitleListview1.SelectIndexAndEnsureVisible(index, true); - RefreshSelectedParagraph(); - } - - private void toolStripMenuItemInsertTextFromSub_Click(object sender, EventArgs e) - { - openFileDialog1.Title = _languageGeneral.OpenSubtitle; - openFileDialog1.FileName = string.Empty; - openFileDialog1.Filter = UiUtil.SubtitleExtensionFilter.Value; - if (openFileDialog1.ShowDialog(this) == DialogResult.OK) - { - if (!File.Exists(openFileDialog1.FileName)) - { - return; - } - - var fi = new FileInfo(openFileDialog1.FileName); - if (fi.Length > 1024 * 1024 * 10) // max 10 mb - { - var text = string.Format(_language.FileXIsLargerThan10MB + Environment.NewLine + Environment.NewLine + _language.ContinueAnyway, openFileDialog1.FileName); - if (MessageBox.Show(this, text, Title, MessageBoxButtons.YesNoCancel) != DialogResult.Yes) - { - return; - } - } - - var tmp = new Subtitle(); - SubtitleFormat format = tmp.LoadSubtitle(openFileDialog1.FileName, out var encoding, null); - if (format != null) - { - if (Configuration.Settings.General.RemoveBlankLinesWhenOpening) - { - tmp.RemoveEmptyLines(); - } - - if (SubtitleListview1.SelectedIndices.Count < 1) - { - return; - } - - MakeHistoryForUndo(_language.BeforeColumnShiftCellsDown); - - int index = FirstSelectedIndex; - for (int i = 0; i < tmp.Paragraphs.Count; i++) - { - { - for (int k = _subtitle.Paragraphs.Count - 2; k > index; k--) - { - _subtitle.Paragraphs[k + 1].Text = _subtitle.Paragraphs[k].Text; - } - } - } - - for (int i = 0; i + index < _subtitle.Paragraphs.Count && i < tmp.Paragraphs.Count; i++) - { - _subtitle.Paragraphs[index + i].Text = tmp.Paragraphs[i].Text; - } - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - SubtitleListview1.SelectIndexAndEnsureVisible(index, true); - RefreshSelectedParagraph(); - } - } - } - - private void toolStripMenuItemOpenKeepVideo_Click(object sender, EventArgs e) - { - openToolStripMenuItem.Enabled = false; - ReloadFromSourceView(); - _resetVideo = false; - OpenNewFile(); - _resetVideo = true; - openToolStripMenuItem.Enabled = true; - } - - private void changeSpeedInPercentToolStripMenuItem_Click(object sender, EventArgs e) - { - if (!IsSubtitleLoaded) - { - DisplaySubtitleNotLoadedMessage(); - return; - } - - ReloadFromSourceView(); - using (var form = new ChangeSpeedInPercent(SubtitleListview1.SelectedItems.Count)) - { - if (form.ShowDialog(this) == DialogResult.OK) - { - MakeHistoryForUndo(_language.BeforeAdjustSpeedInPercent); - SaveSubtitleListviewIndices(); - if (form.AdjustAllLines) - { - _subtitle = form.AdjustAllParagraphs(_subtitle); - if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle && SubtitleListview1.IsAlternateTextColumnVisible) - { - _subtitleAlternate = form.AdjustAllParagraphs(_subtitleAlternate); - } - } - else - { - foreach (int index in SubtitleListview1.SelectedIndices) - { - var p = _subtitle.GetParagraphOrDefault(index); - if (p != null) - { - form.AdjustParagraph(p); - if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle && SubtitleListview1.IsAlternateTextColumnVisible) - { - var original = Utilities.GetOriginalParagraph(index, p, _subtitle.Paragraphs); - if (original != null) - { - form.AdjustParagraph(original); - } - } - } - } - } - - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - } - } - } - - private void toolStripMenuItemAvidStl_Click(object sender, EventArgs e) - { - var avidStl = new AvidStl(); - saveFileDialog1.Filter = avidStl.Name + "|*" + avidStl.Extension; - saveFileDialog1.Title = _language.SaveSubtitleAs; - saveFileDialog1.DefaultExt = "*" + avidStl.Extension; - saveFileDialog1.AddExtension = true; - - if (!string.IsNullOrEmpty(VideoFileName)) - { - saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(VideoFileName); - } - else - { - saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(_fileName); - } - - if (!string.IsNullOrEmpty(openFileDialog1.InitialDirectory)) - { - saveFileDialog1.InitialDirectory = openFileDialog1.InitialDirectory; - } - - DialogResult result = saveFileDialog1.ShowDialog(this); - if (result == DialogResult.OK) - { - openFileDialog1.InitialDirectory = saveFileDialog1.InitialDirectory; - string fileName = saveFileDialog1.FileName; - string ext = Path.GetExtension(fileName); - bool extOk = ext.Equals(avidStl.Extension, StringComparison.OrdinalIgnoreCase); - if (!extOk) - { - if (fileName.EndsWith('.')) - { - fileName = fileName.Substring(0, fileName.Length - 1); - } - - fileName += avidStl.Extension; - } - - AvidStl.Save(fileName, GetSaveSubtitle(_subtitle)); - } - } - - private Subtitle GetSaveSubtitle(Subtitle subtitle) - { - var sub = new Subtitle(subtitle); - if (string.IsNullOrEmpty(sub.FileName)) - { - sub.FileName = "Untitled"; - } - - if (Configuration.Settings.General.CurrentVideoOffsetInMs != 0) - { - sub.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(Configuration.Settings.General.CurrentVideoOffsetInMs)); - } - - return sub; - } - - private void columnDeleteTextOnlyToolStripMenuItem_Click(object sender, EventArgs e) - { - if (SubtitleListview1.SelectedIndices.Count < 1) - { - return; - } - - MakeHistoryForUndo(_language.BeforeColumnDelete); - foreach (int index in SubtitleListview1.SelectedIndices) - { - _subtitle.Paragraphs[index].Text = string.Empty; - SubtitleListview1.SetText(index, string.Empty); - SubtitleListview1.SyntaxColorLine(_subtitle.Paragraphs, index, _subtitle.Paragraphs[index]); - } - - RefreshSelectedParagraph(); - } - - private void toolStripMenuItemBatchConvert_Click(object sender, EventArgs e) - { - Visible = false; - using (var form = new BatchConvert(Icon)) - { - form.ShowDialog(this); - } - - Visible = true; - } - - private void copyOriginalTextToCurrentToolStripMenuItem_Click(object sender, EventArgs e) - { - if (_subtitleAlternate == null || !SubtitleListview1.IsAlternateTextColumnVisible || SubtitleListview1.SelectedIndices.Count < 1) - { - return; - } - - bool first = true; - foreach (int index in SubtitleListview1.SelectedIndices) - { - var original = Utilities.GetOriginalParagraph(index, _subtitle.Paragraphs[index], _subtitleAlternate.Paragraphs); - if (original != null) - { - if (first) - { - MakeHistoryForUndo(_language.BeforeColumnPaste); - } - - SubtitleListview1.SetText(index, original.Text); - _subtitle.Paragraphs[index].Text = original.Text; - SubtitleListview1.SyntaxColorLine(_subtitle.Paragraphs, index, _subtitle.Paragraphs[index]); - first = false; - } - } - - RefreshSelectedParagraph(); - } - - private void toolStripMenuItemColumn_DropDownOpening(object sender, EventArgs e) - { - copyOriginalTextToCurrentToolStripMenuItem.Visible = !string.IsNullOrEmpty(copyOriginalTextToCurrentToolStripMenuItem.Text) && - SubtitleListview1.IsAlternateTextColumnVisible && - _subtitleAlternate != null; - } - - private void toolStripMenuItemMergeDuplicateText_Click(object sender, EventArgs e) - { - if (!IsSubtitleLoaded) - { - DisplaySubtitleNotLoadedMessage(); - return; - } - - ReloadFromSourceView(); - using (var form = new MergeDoubleLines()) - { - form.Initialize(_subtitle); - if (form.ShowDialog(this) == DialogResult.OK) - { - MakeHistoryForUndo(_language.BeforeMergeLinesWithSameText); - _subtitle.Paragraphs.Clear(); - foreach (var p in form.MergedSubtitle.Paragraphs) - { - _subtitle.Paragraphs.Add(p); - } - - ShowStatus(string.Format(_language.MergedShortLinesX, form.NumberOfMerges)); - SaveSubtitleListviewIndices(); - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - } - } - } - - private void toolStripMenuItemMergeLinesWithSameTimeCodes_Click(object sender, EventArgs e) - { - if (!IsSubtitleLoaded) - { - DisplaySubtitleNotLoadedMessage(); - return; - } - - ReloadFromSourceView(); - using (var form = new MergeTextWithSameTimeCodes()) - { - form.Initialize(_subtitle); - if (form.ShowDialog(this) == DialogResult.OK) - { - MakeHistoryForUndo(_language.BeforeMergeLinesWithSameText); - _subtitle.Paragraphs.Clear(); - foreach (var p in form.MergedSubtitle.Paragraphs) - { - _subtitle.Paragraphs.Add(p); - } - - ShowStatus(string.Format(_language.MergedShortLinesX, form.NumberOfMerges)); - SaveSubtitleListviewIndices(); - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - } - } - } - - private void toolStripMenuItem2_Click(object sender, EventArgs e) - { - using (var exportBdnXmlPng = new ExportPngXml()) - { - exportBdnXmlPng.Initialize(_subtitle, GetCurrentSubtitleFormat(), ExportPngXml.ExportFormats.Spumux, _fileName, _videoInfo, VideoFileName); - exportBdnXmlPng.ShowDialog(this); - } - } - - private void toolStripMenuItemModifySelection_Click(object sender, EventArgs e) - { - if (!IsSubtitleLoaded) - { - DisplaySubtitleNotLoadedMessage(); - return; - } - - using (var form = new ModifySelection(_subtitle, GetCurrentSubtitleFormat(), SubtitleListview1)) - { - form.ShowDialog(this); - } - } - - private void toolStripMenuItemInverseSelection_Click(object sender, EventArgs e) - { - if (!IsSubtitleLoaded) - { - DisplaySubtitleNotLoadedMessage(); - return; - } - - foreach (ListViewItem item in SubtitleListview1.Items) - { - item.Selected = !item.Selected; - } - } - - private void toolStripMenuItemSpellCheckFromCurrentLine_Click(object sender, EventArgs e) - { - _spellCheckForm = null; - SpellCheck(true, FirstSelectedIndex); - } - - private void toolStripMenuItemImportXSub_Click(object sender, EventArgs e) - { - if (ContinueNewOrExit()) - { - openFileDialog1.Title = _language.OpenXSubFiles; - openFileDialog1.FileName = string.Empty; - openFileDialog1.Filter = _language.XSubFiles + "|*.divx;*.avi"; - if (openFileDialog1.ShowDialog(this) == DialogResult.OK) - { - ShowStatus(_languageGeneral.PleaseWait); - if (ImportSubtitleFromDivX(openFileDialog1.FileName)) - { - ShowStatus(string.Format(_language.LoadedSubtitleX, openFileDialog1.FileName)); - } - else - { - ShowStatus(string.Empty); - MessageBox.Show(_language.NotAValidXSubFile); - } - } - } - } - - private void toolStripMenuItemImportOcrHardSub_Click(object sender, EventArgs e) - { - using (var form = new HardSubExtract(VideoFileName)) - { - if (form.ShowDialog(this) == DialogResult.OK) - { - if (!string.IsNullOrEmpty(form.OcrFileName)) - { - MakeHistoryForUndo(_language.BeforeAutoBalanceSelectedLines); - OpenSubtitle(form.OcrFileName, null); - } - } - } - } - - private void toolStripMenuItemExportFcpIImage_Click(object sender, EventArgs e) - { - using (var exportBdnXmlPng = new ExportPngXml()) - { - exportBdnXmlPng.Initialize(_subtitle, GetCurrentSubtitleFormat(), ExportPngXml.ExportFormats.Fcp, _fileName, _videoInfo, VideoFileName); - exportBdnXmlPng.ShowDialog(this); - } - } - - private void ToolStripMenuItemNuendoPropertiesClick(object sender, EventArgs e) - { - using (var form = new NuendoProperties()) - { - if (form.ShowDialog(this) == DialogResult.OK) - { - Configuration.Settings.SubtitleSettings.NuendoCharacterListFile = form.CharacterListFile; - } - } - } - - private void toolStripMenuItemDost_Click(object sender, EventArgs e) - { - using (var exportBdnXmlPng = new ExportPngXml()) - { - exportBdnXmlPng.Initialize(_subtitle, GetCurrentSubtitleFormat(), ExportPngXml.ExportFormats.Dost, _fileName, _videoInfo, VideoFileName); - exportBdnXmlPng.ShowDialog(this); - } - } - - private void toolStripMenuItemMeasurementConverter_Click(object sender, EventArgs e) - { - var selectedText = string.Empty; - if (tabControlSubtitle.SelectedIndex == TabControlSourceView) - { - selectedText = textBoxSource.SelectedText; - } - else - { - selectedText = GetFocusedTextBox().SelectedText; - } - - if (_measurementConverter != null && !_measurementConverter.IsDisposed) - { - _measurementConverter.WindowState = FormWindowState.Normal; - _measurementConverter.Input = selectedText; - _measurementConverter.IsOriginalActive = GetFocusedTextBox() == textBoxListViewTextAlternate; - _measurementConverter.Focus(); - return; - } - - _measurementConverter = new MeasurementConverter - { - Input = selectedText, - IsOriginalActive = GetFocusedTextBox() == textBoxListViewTextAlternate, - }; - _measurementConverter.InsertClicked += measurementConverter_InsertClicked; - _measurementConverter.Show(this); - } - - private void measurementConverter_InsertClicked(object sender, MeasurementConverter.InsertEventArgs e) - { - if (IsSubtitleLoaded) - { - var tb = e.IsOriginalActive ? textBoxListViewTextAlternate : textBoxListViewText; - tb.SelectedText = e.Result; - } - } - - private async void toolStripMenuItemImportChapters_Click(object sender, EventArgs e) - { - toolStripMenuItemImportChapters.Enabled = false; - ShowStatus(_language.ImportingChapters); - - var chaps = new List(); - using (var matroska = new MatroskaFile(VideoFileName)) - { - chaps = await System.Threading.Tasks.Task.Run(() => matroska.GetChapters()); - } - - if (chaps?.Count > 0) - { - mediaPlayer.Chapters = chaps; - - if (audioVisualizer.WavePeaks != null) - { - audioVisualizer.Chapters = chaps; - } - - ShowStatus(string.Format(_language.XChaptersImported, chaps?.Count)); - } - else - { - ShowStatus(_language.NoChapters); - MessageBox.Show(_language.NoChapters, Title); - } - - toolStripMenuItemImportChapters.Enabled = true; - } - - private void toolStripMenuItemImportSceneChanges_Click(object sender, EventArgs e) - { - using (var form = new ImportSceneChanges(_videoInfo, VideoFileName)) - { - if (form.ShowDialog(this) == DialogResult.OK) - { - audioVisualizer.SceneChanges = form.SceneChangesInSeconds; - SceneChangeHelper.SaveSceneChanges(VideoFileName, audioVisualizer.SceneChanges); - ShowStatus(string.Format(_language.XSceneChangesImported, form.SceneChangesInSeconds.Count)); - } - } - } - - private void toolStripMenuItemRemoveSceneChanges_Click(object sender, EventArgs e) - { - if (audioVisualizer.SceneChanges != null) - { - audioVisualizer.SceneChanges = new List(); - SceneChangeHelper.DeleteSceneChanges(VideoFileName); - } - } - - private void toolStripMenuItemBridgeGapsBetweenSubtitles_Click(object sender, EventArgs e) - { - if (!IsSubtitleLoaded) - { - DisplaySubtitleNotLoadedMessage(); - return; - } - - using (var form = new DurationsBridgeGaps(_subtitle)) - { - if (form.ShowDialog(this) == DialogResult.OK && form.FixedCount > 0) - { - int index = FirstSelectedIndex; - if (index < 0) - { - index = 0; - } - - MakeHistoryForUndo(_language.BeforeDurationsBridgeGap); - SaveSubtitleListviewIndices(); - _subtitle.Paragraphs.Clear(); - _subtitle.Paragraphs.AddRange(form.FixedSubtitle.Paragraphs); - - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - SubtitleListview1.SelectIndexAndEnsureVisible(index, true); - RestoreSubtitleListviewIndices(); - } - } - } - - private void toolStripMenuItemOpenDvd_Click(object sender, EventArgs e) - { - using (var form = new OpenVideoDvd()) - { - if (form.ShowDialog(this) == DialogResult.OK && !string.IsNullOrEmpty(form.DvdPath)) - { - VideoFileName = form.DvdPath; - if (mediaPlayer.VideoPlayer != null) - { - mediaPlayer.PauseAndDisposePlayer(); - } - - _endSeconds = -1; - - _videoInfo = new VideoInfo(); - _videoInfo.Width = 720; - _videoInfo.Height = 576; - _videoInfo.FramesPerSecond = 25; - _videoInfo.VideoCodec = "MPEG2"; - toolStripComboBoxFrameRate.Text = string.Format("{0:0.###}", _videoInfo.FramesPerSecond); - - var oldVideoPlayer = Configuration.Settings.General.VideoPlayer; - try - { - Configuration.Settings.General.VideoPlayer = "VLC"; - UiUtil.InitializeVideoPlayerAndContainer(VideoFileName, _videoInfo, mediaPlayer, VideoLoaded, VideoEnded); - mediaPlayer.ShowFullscreenButton = Configuration.Settings.General.VideoPlayerShowFullscreenButton; - mediaPlayer.OnButtonClicked -= MediaPlayer_OnButtonClicked; - mediaPlayer.OnButtonClicked += MediaPlayer_OnButtonClicked; - mediaPlayer.Volume = 0; - labelVideoInfo.Text = string.Format("DVD {0}x{1} {2}", _videoInfo.Width, _videoInfo.Height, _videoInfo.VideoCodec.Trim()); - if (_videoInfo.FramesPerSecond > 0) - { - labelVideoInfo.Text += string.Format(" {0:0.0##}", _videoInfo.FramesPerSecond); - } - } - finally - { - Configuration.Settings.General.VideoPlayer = oldVideoPlayer; - } - } - } - } - - private void toolStripMenuItemFcpProperties_Click(object sender, EventArgs e) - { - using (var form = new FcpProperties()) - { - if (form.ShowDialog(this) == DialogResult.OK) - { - Configuration.Settings.SubtitleSettings.FcpFontSize = form.FcpFontSize; - Configuration.Settings.SubtitleSettings.FcpFontName = form.FcpFontName; - } - } - } - - private void styleToolStripMenuItem_Click(object sender, EventArgs e) - { - SortSubtitle(SubtitleSortCriteria.Style, (sender as ToolStripItem).Text); - } - - private void toolStripMenuItemFocusTextbox_Click(object sender, EventArgs e) - { - int index = _subtitle.GetIndex(audioVisualizer.RightClickedParagraph); - if (index >= 0) - { - SubtitleListview1.SelectIndexAndEnsureVisible(index, true); - } - - textBoxListViewText.Focus(); - textBoxListViewText.SelectAll(); - } - - private void AscendingToolStripMenuItem_Click(object sender, EventArgs e) - { - descendingToolStripMenuItem.Checked = false; - AscendingToolStripMenuItem.Checked = true; - toolsToolStripMenuItem.ShowDropDown(); - toolStripMenuItemSortBy.ShowDropDown(); - } - - private void descendingToolStripMenuItem_Click(object sender, EventArgs e) - { - AscendingToolStripMenuItem.Checked = false; - descendingToolStripMenuItem.Checked = true; - toolsToolStripMenuItem.ShowDropDown(); - toolStripMenuItemSortBy.ShowDropDown(); - } - - private void exportCustomTextFormatToolStripMenuItem_Click(object sender, EventArgs e) - { - using (var form = new ExportCustomText(GetSaveSubtitle(_subtitle), GetSaveSubtitle(_subtitleAlternate), _fileName)) - { - if (form.ShowDialog(this) == DialogResult.OK) - { - ShowStatus(form.LogMessage); - } - } - } - - private void PasteIntoActiveTextBox(string s, bool allowMultiLine = false) - { - if (tabControlSubtitle.SelectedIndex == TabControlSourceView) - { - textBoxSource.SelectedText = s; - } - else - { - if (textBoxListViewTextAlternate.Visible && textBoxListViewTextAlternate.Enabled && textBoxListViewTextAlternate.Focused) - { - if (!string.IsNullOrEmpty(textBoxListViewTextAlternate.SelectedText)) - { - textBoxListViewTextAlternate.SelectedText = s; - } - else - { - var selectionStart = textBoxListViewTextAlternate.SelectionStart; - textBoxListViewTextAlternate.Text = textBoxListViewTextAlternate.Text.Insert(textBoxListViewTextAlternate.SelectionStart, s); - textBoxListViewTextAlternate.SelectionStart = selectionStart + s.Length; - } - } - else - { - if (SubtitleListview1.SelectedItems.Count > 1 && !textBoxListViewText.Focused && allowMultiLine) - { - foreach (ListViewItem item in SubtitleListview1.SelectedItems) - { - var p = _subtitle.GetParagraphOrDefault(item.Index); - if (p == null) - { - continue; - } - - p.Text = s + " " + p.Text; - SubtitleListview1.SetText(item.Index, p.Text); - } - RefreshSelectedParagraph(); - } - else - { - if (!string.IsNullOrEmpty(textBoxListViewText.SelectedText)) - { - textBoxListViewText.SelectedText = s; - } - else - { - var selectionStart = textBoxListViewText.SelectionStart; - textBoxListViewText.Text = textBoxListViewText.Text.Insert(textBoxListViewText.SelectionStart, s); - textBoxListViewText.SelectionStart = selectionStart + s.Length; - } - } - - ShowSource(); - } - } - } - - private void leftToolStripMenuItem_Click(object sender, EventArgs e) - { - PasteIntoActiveTextBox("\u200E"); // LRM, Left-to-Right Mark, acts as a Latin character. - } - - private void righttoleftMarkToolStripMenuItem_Click(object sender, EventArgs e) - { - PasteIntoActiveTextBox("\u200F"); // RLM, Right-to-Left Mark, acts as an Arabic character. - } - - private void startOfLefttorightEmbeddingLREToolStripMenuItem_Click(object sender, EventArgs e) - { - PasteIntoActiveTextBox("\u202A"); - } - - private void startOfRighttoleftEmbeddingRLEToolStripMenuItem_Click(object sender, EventArgs e) - { - PasteIntoActiveTextBox("\u202B"); - } - - private void startOfLefttorightOverrideLROToolStripMenuItem_Click(object sender, EventArgs e) - { - PasteIntoActiveTextBox("\u202D"); - } - - private void startOfRighttoleftOverrideRLOToolStripMenuItem_Click(object sender, EventArgs e) - { - PasteIntoActiveTextBox("\u202E"); - } - - private void toolStripMenuItemRtlUnicodeControlChar_Click(object sender, EventArgs e) - { - if (IsUnicode) - { - int selectedIndex = FirstSelectedIndex; - foreach (int index in SubtitleListview1.SelectedIndices) - { - var p = _subtitle.Paragraphs[index]; - p.Text = Utilities.FixRtlViaUnicodeChars(p.Text); - SubtitleListview1.SetText(index, p.Text); - if (index == selectedIndex) - { - textBoxListViewText.Text = p.Text; - } - } - - RefreshSelectedParagraph(); - } - } - - private void toolStripMenuItemRemoveUnicodeControlChar_Click(object sender, EventArgs e) - { - if (IsUnicode) - { - int selectedIndex = FirstSelectedIndex; - foreach (int index in SubtitleListview1.SelectedIndices) - { - var p = _subtitle.Paragraphs[index]; - p.Text = Utilities.RemoveUnicodeControlChars(p.Text); - SubtitleListview1.SetText(index, p.Text); - if (index == selectedIndex) - { - textBoxListViewText.Text = p.Text; - } - } - - RefreshSelectedParagraph(); - } - } - - private void toolStripMenuItemImportImages_Click(object sender, EventArgs e) - { - if (!ContinueNewOrExit()) - { - return; - } - - if (!string.IsNullOrEmpty(VideoFileName) && mediaPlayer.VideoPlayer != null) - { - mediaPlayer.Pause(); - } - - using (var form = new ImportImages()) - { - if (form.ShowDialog(this) == DialogResult.OK && form.Subtitle.Paragraphs.Count > 0) - { - ImportAndOcrSrt(form.Subtitle); - } - } - } - - private void audioVisualizer_MouseEnter(object sender, EventArgs e) - { - if (Configuration.Settings.VideoControls.WaveformFocusOnMouseEnter && audioVisualizer.WavePeaks != null && !audioVisualizer.Focused && audioVisualizer.CanFocus) - { - if (Math.Abs(_lastWaveformMenuCloseTicks - DateTime.UtcNow.Ticks) > 10000 * 500) // only if last change was longer ago than 500 milliseconds - { - audioVisualizer.Focus(); - } - } - } - - private void SubtitleListview1_MouseEnter(object sender, EventArgs e) - { - if (Configuration.Settings.VideoControls.WaveformFocusOnMouseEnter && Configuration.Settings.VideoControls.WaveformListViewFocusOnMouseEnter && SubtitleListview1.CanFocus) - { - SubtitleListview1.Focus(); - } - } - - private void toolStripButtonFixCommonErrors_Click(object sender, EventArgs e) - { - FixCommonErrors(false); - } - - private void toolStripButtonRemoveTextForHi_Click(object sender, EventArgs e) - { - RemoveTextForHearImpairedToolStripMenuItemClick(sender, e); - } - - private void toolStripMenuItemExportDcinemaInteropClick(object sender, EventArgs e) - { - using (var exportBdnXmlPng = new ExportPngXml()) - { - exportBdnXmlPng.Initialize(_subtitle, GetCurrentSubtitleFormat(), ExportPngXml.ExportFormats.DCinemaInterop, _fileName, _videoInfo, VideoFileName); - exportBdnXmlPng.ShowDialog(this); - } - } - - private void dCinemaSMPTE2014ToolStripMenuItem_Click(object sender, EventArgs e) - { - using (var exportBdnXmlPng = new ExportPngXml()) - { - exportBdnXmlPng.Initialize(_subtitle, GetCurrentSubtitleFormat(), ExportPngXml.ExportFormats.DCinemaInterop, _fileName, _videoInfo, VideoFileName); - exportBdnXmlPng.ShowDialog(this); - } - } - - internal Subtitle UndoFromSpellCheck(Subtitle subtitle) - { - var idx = FirstSelectedIndex; - for (int i = 0; i < _subtitle.Paragraphs.Count; i++) - { - if (_subtitle.Paragraphs[i].Text != subtitle.Paragraphs[i].Text) - { - _subtitle.Paragraphs[i].Text = subtitle.Paragraphs[i].Text; - SubtitleListview1.SetText(i, _subtitle.Paragraphs[i].Text); - } - - if (idx == i) - { - SubtitleListview1.SetText(idx, _subtitle.Paragraphs[idx].Text); - } - } - - RefreshSelectedParagraph(); - return _subtitle; - } - - private void checkForUpdatesToolStripMenuItem_Click(object sender, EventArgs e) - { - try - { - if (_timerCheckForUpdates != null) - { - _timerCheckForUpdates.Stop(); - } - } - catch - { - } - - using (var form = new CheckForUpdates(this)) - { - form.ShowDialog(this); - } - - Configuration.Settings.General.LastCheckForUpdates = DateTime.Now; - } - - private void setVideoOffsetToolStripMenuItem_Click(object sender, EventArgs e) - { - if (!string.IsNullOrEmpty(VideoFileName) && mediaPlayer.VideoPlayer != null) - { - mediaPlayer.Pause(); - } - - using (var form = new SetVideoOffset()) - { - form.VideoOffset = new TimeCode(10, 0, 0, 0); - if (Configuration.Settings.General.CurrentVideoOffsetInMs != 0) - { - form.VideoOffset = new TimeCode(Configuration.Settings.General.CurrentVideoOffsetInMs); - } - - var oldVideoOffset = Configuration.Settings.General.CurrentVideoOffsetInMs; - if (form.ShowDialog(this) == DialogResult.OK) - { - var change = _changeSubtitleHash != _subtitle.GetFastHashCode(GetCurrentEncoding().BodyName); - if (form.FromCurrentVideoPosition && mediaPlayer.VideoPlayer != null) - { - Configuration.Settings.General.CurrentVideoOffsetInMs = (long)(Math.Round((form.VideoOffset.TotalSeconds - mediaPlayer.VideoPlayer.CurrentPosition) * 1000.0)); - change = true; - } - else - { - Configuration.Settings.General.CurrentVideoOffsetInMs = (long)(Math.Round(form.VideoOffset.TotalSeconds * 1000.0)); - } - - if (form.DoNotaddVideoOffsetToTimeCodes) - { - if (form.Reset) - { - _subtitle.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(oldVideoOffset)); - _subtitleAlternate?.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(oldVideoOffset)); - } - else - { - _subtitle.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(-Configuration.Settings.General.CurrentVideoOffsetInMs)); - _subtitleAlternate?.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(-Configuration.Settings.General.CurrentVideoOffsetInMs)); - } - } - else - { - change = true; - } - - if (!change) - { - _changeSubtitleHash = _subtitle.GetFastHashCode(GetCurrentEncoding().BodyName); - } - else if (change && _changeSubtitleHash == _subtitle.GetFastHashCode(GetCurrentEncoding().BodyName)) - { - _changeSubtitleHash = -1; - } - - SaveSubtitleListviewIndices(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RefreshSelectedParagraph(); - RestoreSubtitleListviewIndices(); - } - } - } - - private void toolStripMenuItemEbuProperties_Click(object sender, EventArgs e) - { - using (var properties = new EbuSaveOptions()) - { - if (_subtitle != null && _subtitle.Header != null && (_subtitle.Header.Contains("STL2") || _subtitle.Header.Contains("STL3"))) - { - var header = Ebu.ReadHeader(Encoding.UTF8.GetBytes(_subtitle.Header)); - properties.Initialize(header, Ebu.EbuUiHelper.JustificationCode, null, _subtitle); - } - else - { - var header = new Ebu.EbuGeneralSubtitleInformation(); - if (!string.IsNullOrEmpty(_fileName) && new Ebu().IsMine(null, _fileName)) - { - properties.Initialize(header, Ebu.EbuUiHelper.JustificationCode, _fileName, _subtitle); - } - else - { - properties.Initialize(header, Ebu.EbuUiHelper.JustificationCode, null, _subtitle); - } - } - - if (properties.ShowDialog(this) == DialogResult.OK) - { - Ebu.EbuUiHelper.JustificationCode = properties.JustificationCode; - } - } - } - - private void ExportToEdlWithClipName(object sender, EventArgs e) - { - using (var exportBdnXmlPng = new ExportPngXml()) - { - exportBdnXmlPng.Initialize(_subtitle, GetCurrentSubtitleFormat(), ExportPngXml.ExportFormats.EdlClipName, _fileName, _videoInfo, VideoFileName); - exportBdnXmlPng.ShowDialog(this); - } - } - - private void ExportToEdl(object sender, EventArgs e) - { - using (var exportBdnXmlPng = new ExportPngXml()) - { - exportBdnXmlPng.Initialize(_subtitle, GetCurrentSubtitleFormat(), ExportPngXml.ExportFormats.Edl, _fileName, _videoInfo, VideoFileName); - exportBdnXmlPng.ShowDialog(this); - } - } - - private void ToolStripMenuItemAddWaveformBatchClick(object sender, EventArgs e) - { - using (var form = new AddWaveformBatch()) - { - form.ShowDialog(this); - } - } - - private void DisplaySubtitleNotLoadedMessage() - { - MessageBox.Show(this, _language.NoSubtitleLoaded, Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - - private void toolStripMenuItemExportBdTextSt_Click(object sender, EventArgs e) - { - using (var form = new ExportTextST(_subtitle)) - { - form.ShowDialog(this); - } - } - - private void ChooseProfile() - { - using (var form = new ProfileChoose(Configuration.Settings.General.Profiles, Configuration.Settings.General.CurrentProfile)) - { - if (form.ShowDialog(this) == DialogResult.OK) - { - SubtitleListview1.BeginUpdate(); - for (int i = 0; i < _subtitle.Paragraphs.Count; i++) - { - SubtitleListview1.SyntaxColorLine(_subtitle.Paragraphs, i, _subtitle.Paragraphs[i]); - } - - SubtitleListview1.EndUpdate(); - if (_subtitleListViewIndex >= 0) - { - UpdateListViewTextInfo(labelTextLineLengths, labelSingleLine, labelSingleLinePixels, labelTextLineTotal, labelCharactersPerSecond, _subtitle.Paragraphs[_subtitleListViewIndex], textBoxListViewText); - } - - ShowLineInformationListView(); - ShowSourceLineNumber(); - } - } - } - - private void DuplicateLine() - { - if (SubtitleListview1.SelectedItems.Count != 1) - { - return; - } - - var firstSelectedIndex = SubtitleListview1.SelectedItems[0].Index; - MakeHistoryForUndo(_language.BeforeInsertLine); - var newParagraph = new Paragraph(); - SetStyleForNewParagraph(newParagraph, firstSelectedIndex); - var cur = _subtitle.GetParagraphOrDefault(firstSelectedIndex); - newParagraph.StartTime.TotalMilliseconds = cur.StartTime.TotalMilliseconds; - newParagraph.EndTime.TotalMilliseconds = cur.EndTime.TotalMilliseconds; - newParagraph.Text = cur.Text; - - if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) - { - var currentOriginal = Utilities.GetOriginalParagraph(firstSelectedIndex, _subtitle.Paragraphs[firstSelectedIndex], _subtitleAlternate.Paragraphs); - if (currentOriginal != null) - { - _subtitleAlternate.Paragraphs.Insert(_subtitleAlternate.Paragraphs.IndexOf(currentOriginal) + 1, new Paragraph(currentOriginal)); - } - else - { - _subtitleAlternate.InsertParagraphInCorrectTimeOrder(new Paragraph(newParagraph)); - } - _subtitleAlternate.Renumber(); - } - - if (_networkSession != null) - { - _networkSession.TimerStop(); - NetworkGetSendUpdates(new List(), firstSelectedIndex, newParagraph); - } - else - { - _subtitle.Paragraphs.Insert(firstSelectedIndex, newParagraph); - _subtitle.Renumber(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - } - - SubtitleListview1.SelectIndexAndEnsureVisible(firstSelectedIndex, true); - ShowSource(); - ShowStatus(_language.LineInserted); - } - - private void toolStripSelected_Click(object sender, EventArgs e) - { - if (!ShowProfileInStatusBar) - { - labelStatus_Click(sender, e); - return; - } - - var x = statusStrip1.PointToClient(Cursor.Position).X; - var textWidth = TextRenderer.MeasureText(toolStripSelected.Text, toolStripSelected.Font).Width; - if (toolStripStatusLabelProgress.Visible) - { - textWidth += toolStripStatusLabelProgress.Width + 5; - } - - var min = statusStrip1.Width - textWidth - 20; - var max = min + TextRenderer.MeasureText(Configuration.Settings.General.CurrentProfile, toolStripSelected.Font).Width + 10; - if (x >= min && x <= max) - { - ChooseProfile(); // profile name in status bar clicked - } - else - { - labelStatus_Click(sender, e); - } - } - - private void contextMenuStripWaveform_Closing(object sender, ToolStripDropDownClosingEventArgs e) - { - _lastWaveformMenuCloseTicks = DateTime.UtcNow.Ticks; - } - - private void MenuOpened(object sender, EventArgs e) - { - IsMenuOpen = true; - } - - private void MenuClosed(object sender, ToolStripDropDownClosedEventArgs e) - { - IsMenuOpen = false; - } - - private void MenuClosed(object sender, EventArgs e) - { - IsMenuOpen = false; - } - - private void UpdateNetflixGlyphCheckToolsVisibility() - { - bool showTools = IsNetflixGlyphCheckAvailable(); - toolStripButtonNetflixQualityCheck.Visible = showTools && Configuration.Settings.General.ShowToolbarNetflixGlyphCheck; - } - - private bool IsNetflixGlyphCheckAvailable() - { - var formatType = GetCurrentSubtitleFormat().GetType(); - return formatType == typeof(TimedText10) || formatType == typeof(NetflixTimedText) || formatType == typeof(NetflixImsc11Japanese) || formatType == typeof(Ebu); - } - - private void NetflixGlyphCheck(bool isSaving) - { - ReloadFromSourceView(); - - string fileName = string.IsNullOrEmpty(_fileName) ? "UntitledSubtitle" : Path.GetFileNameWithoutExtension(_fileName); - string language = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle); - - var netflixController = new NetflixQualityController { Language = language, VideoFileName = VideoFileName }; - if (!string.IsNullOrEmpty(VideoFileName) && _videoInfo != null && _videoInfo.FramesPerSecond > 20) - { - netflixController.FrameRate = _videoInfo.FramesPerSecond; - } - else if (!string.IsNullOrEmpty(VideoFileName) && CurrentFrameRate != 23.976 && CurrentFrameRate != 24) - { - netflixController.FrameRate = CurrentFrameRate; - } - - netflixController.RunChecks(_subtitle); - - if (netflixController.Records.Count > 0) - { - string reportPath = Path.GetTempPath() + fileName + "_NetflixQualityCheck.csv"; - netflixController.SaveCsv(reportPath); - if (!isSaving) - { - using (var form = new NetflixFixErrors(_subtitle, GetCurrentSubtitleFormat(), _fileName, VideoFileName)) - { - if (form.ShowDialog(this) == DialogResult.OK) - { - // Do nothing for now - } - } - } - else - { - ShowStatus(string.Format(_language.SavedSubtitleX, _fileName) + " - " + - string.Format(Configuration.Settings.Language.NetflixQualityCheck.FoundXIssues, netflixController.Records.Count)); - } - } - else if (!isSaving) - { - MessageBox.Show("Netflix Quality Check found no issues.", "Netflix Quality Check"); - } - } - - private void netflixGlyphCheckToolStripMenuItem_Click(object sender, EventArgs e) - { - NetflixGlyphCheck(false); - } - - private void toolStripButtonNetflixGlyphCheck_Click(object sender, EventArgs e) - { - NetflixGlyphCheck(false); - } - - private void insertSubtitleHereToolStripMenuItem_Click(object sender, EventArgs e) - { - openFileDialog1.Title = _languageGeneral.OpenSubtitle; - openFileDialog1.FileName = string.Empty; - openFileDialog1.Filter = UiUtil.SubtitleExtensionFilter.Value; - if (openFileDialog1.ShowDialog(this) == DialogResult.OK && File.Exists(openFileDialog1.FileName)) - { - var fi = new FileInfo(openFileDialog1.FileName); - if (fi.Length > 1024 * 1024 * 10) // max 10 mb - { - var text = string.Format(_language.FileXIsLargerThan10MB + Environment.NewLine + Environment.NewLine + _language.ContinueAnyway, openFileDialog1.FileName); - if (MessageBox.Show(this, text, Title, MessageBoxButtons.YesNoCancel) != DialogResult.Yes) - { - return; - } - } - - var subtitle = new Subtitle(); - SubtitleFormat format = subtitle.LoadSubtitle(openFileDialog1.FileName, out var encoding, null); - if (format != null && subtitle.Paragraphs.Count > 0) - { - SaveSubtitleListviewIndices(); - - if (Configuration.Settings.General.RemoveBlankLinesWhenOpening) - { - subtitle.RemoveEmptyLines(); - } - - var adjustment = mediaPlayer.CurrentPosition - subtitle.Paragraphs[0].StartTime.TotalSeconds; - if (adjustment < 0) - { - adjustment = 0; - } - - foreach (Paragraph newP in subtitle.Paragraphs) - { - newP.Adjust(1.0d, adjustment); - if (_subtitle.Paragraphs.Any(p => newP.StartTime.TotalMilliseconds >= p.StartTime.TotalMilliseconds && - newP.StartTime.TotalMilliseconds <= p.EndTime.TotalMilliseconds || - newP.EndTime.TotalMilliseconds >= p.StartTime.TotalMilliseconds && - newP.EndTime.TotalMilliseconds <= p.EndTime.TotalMilliseconds)) - { - // new subs will overlap existing subs - if (MessageBox.Show(_language.PromptInsertSubtitleOverlap, _languageGeneral.Title, MessageBoxButtons.YesNoCancel) != DialogResult.Yes) - { - return; - } - - break; - } - } - - MakeHistoryForUndo(string.Format(_language.BeforeInsertSubtitleAtVideoPosition, openFileDialog1.FileName)); - - foreach (var p in subtitle.Paragraphs) - { - _subtitle.InsertParagraphInCorrectTimeOrder(p); - } - - _subtitle.Renumber(); - ShowSource(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - RestoreSubtitleListviewIndices(); - } - } - } - - private void actorToolStripMenuItemClick(object sender, EventArgs e) - { - SortSubtitle(SubtitleSortCriteria.Actor, (sender as ToolStripItem).Text); - } - - private void toolStripMenuItemFcpXmlAdvanced_Click(object sender, EventArgs e) - { - using (var dialog = new ExportFcpXmlAdvanced(_subtitle, VideoFileName)) - { - dialog.ShowDialog(this); - } - } - - private void toolStripMenuItemOpenVideoFromUrl_Click(object sender, EventArgs e) - { - using (var form = new TextPrompt(Configuration.Settings.Language.Main.OpenVideoFile, "Url")) - { - if (form.ShowDialog(this) == DialogResult.OK) - { - string url = form.InputText; - if (!string.IsNullOrEmpty(url)) - { - if (audioVisualizer.WavePeaks != null) - { - audioVisualizer.WavePeaks = null; - audioVisualizer.SetSpectrogram(null); - audioVisualizer.SceneChanges = new List(); - audioVisualizer.Chapters = new List(); - } - - if (!panelVideoPlayer.Visible) - { - toolStripButtonToggleVideo_Click(null, null); - } - - ShowSubtitleTimer.Stop(); - Cursor = Cursors.WaitCursor; - VideoFileName = url; - if (mediaPlayer.VideoPlayer != null) - { - mediaPlayer.PauseAndDisposePlayer(); - } - - _endSeconds = -1; - UiUtil.InitializeVideoPlayerAndContainer(url, _videoInfo, mediaPlayer, VideoLoaded, VideoEnded); - mediaPlayer.Volume = 0; - mediaPlayer.ShowFullscreenButton = Configuration.Settings.General.VideoPlayerShowFullscreenButton; - mediaPlayer.OnButtonClicked -= MediaPlayer_OnButtonClicked; - mediaPlayer.OnButtonClicked += MediaPlayer_OnButtonClicked; - labelVideoInfo.Text = url; - Cursor = Cursors.Default; - SetUndockedWindowsTitle(); - ShowSubtitleTimer.Start(); - } - } - } - } - - private void SmpteTimeModedropFrameToolStripMenuItem_Click(object sender, EventArgs e) - { - smpteTimeModedropFrameToolStripMenuItem.Checked = !smpteTimeModedropFrameToolStripMenuItem.Checked; - mediaPlayer.SmpteMode = smpteTimeModedropFrameToolStripMenuItem.Checked; - } - - private void moveTextUpToolStripMenuItem_Click(object sender, EventArgs e) - { - var indices = SubtitleListview1.SelectedIndices.OfType().OrderBy(p => p).ToList(); - if (indices.Count == 0 || indices[0] - 1 < 0) - { - return; - } - - MakeHistoryForUndo(string.Format(_language.BeforeX, _language.Menu.ContextMenu.ColumnTextUp)); - SubtitleListview1.SelectedIndexChanged -= SubtitleListview1_SelectedIndexChanged; - SubtitleListview1.BeginUpdate(); - foreach (int index in indices) - { - if (index - 1 >= 0) - { - var p = _subtitle.Paragraphs[index]; - var prev = _subtitle.Paragraphs[index - 1]; - var prevText = prev.Text; - prev.Text = p.Text; - p.Text = prevText; - SubtitleListview1.Items[index - 1].Selected = true; - SubtitleListview1.Items[index].Selected = false; - SubtitleListview1.SetText(index - 1, prev.Text); - SubtitleListview1.SetText(index, p.Text); - SubtitleListview1.SyntaxColorLine(_subtitle.Paragraphs, index - 1, prev); - SubtitleListview1.SyntaxColorLine(_subtitle.Paragraphs, index, p); - } - } - - SubtitleListview1.EndUpdate(); - SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; - SubtitleListview1.EnsureVisible(FirstSelectedIndex); - _subtitleListViewIndex = -1; - SubtitleListview1_SelectedIndexChanged(null, null); - } - - private void moveTextDownToolStripMenuItem_Click(object sender, EventArgs e) - { - var indices = SubtitleListview1.SelectedIndices.OfType().OrderByDescending(p => p).ToList(); - if (indices.Count == 0 || indices[0] + 1 >= _subtitle.Paragraphs.Count) - { - return; - } - - MakeHistoryForUndo(string.Format(_language.BeforeX, _language.Menu.ContextMenu.ColumnTextDown)); - SubtitleListview1.SelectedIndexChanged -= SubtitleListview1_SelectedIndexChanged; - SubtitleListview1.BeginUpdate(); - foreach (int index in indices) - { - if (index + 1 < _subtitle.Paragraphs.Count) - { - var p = _subtitle.Paragraphs[index]; - var next = _subtitle.Paragraphs[index + 1]; - var nextText = next.Text; - next.Text = p.Text; - p.Text = nextText; - SubtitleListview1.Items[index + 1].Selected = true; - SubtitleListview1.Items[index].Selected = false; - SubtitleListview1.SetText(index, p.Text); - SubtitleListview1.SetText(index + 1, next.Text); - SubtitleListview1.SyntaxColorLine(_subtitle.Paragraphs, index, p); - SubtitleListview1.SyntaxColorLine(_subtitle.Paragraphs, index + 1, next); - } - } - - SubtitleListview1.EndUpdate(); - SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; - SubtitleListview1.EnsureVisible(FirstSelectedIndex); - SubtitleListview1.EnsureVisible(indices[0]); - _subtitleListViewIndex = -1; - SubtitleListview1_SelectedIndexChanged(null, null); - } - - private void generateTextFromCurrentVideoToolStripMenuItem_Click(object sender, EventArgs e) - { - using (var form = new AudioToText(VideoFileName, _videoInfo)) - { - if (form.ShowDialog(this) == DialogResult.OK) - { - _subtitle.Paragraphs.Clear(); - _subtitle.Paragraphs.AddRange(form.Subtitle.Paragraphs); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - if (_subtitle.Paragraphs.Count > 1) - { - ToolStripMenuItemAutoMergeShortLinesClick(sender, e); - } - } - } - } - - private void toolStripMenuDvdStudioProperties_Click(object sender, EventArgs e) - { - using (var form = new DvdStudioProProperties()) - { - form.ShowDialog(this); - } - } - - private void boxToolStripMenuItem_Click(object sender, EventArgs e) - { - ListViewToggleTag("box"); - } - - private void ShowHideBookmark(Paragraph p) - { - if (!string.IsNullOrWhiteSpace(p.Bookmark)) - { - pictureBoxBookmark.Show(); - if (_showBookmarkLabel) - { - panelBookmark.Show(); - using (var graphics = CreateGraphics()) - { - var textSize = graphics.MeasureString(p.Bookmark, Font); - labelBookmark.Text = p.Bookmark; - panelBookmark.Left = pictureBoxBookmark.Left; - panelBookmark.Top = pictureBoxBookmark.Top + pictureBoxBookmark.Height + 9; - panelBookmark.Width = (int)textSize.Width + 20; - panelBookmark.Height = (int)textSize.Height + 20; - panelBookmark.Show(); - } - } - else - { - panelBookmark.Hide(); - } - } - else if (p.Bookmark != null) - { - pictureBoxBookmark.Show(); - panelBookmark.Hide(); - } - else if (panelBookmark.Visible || pictureBoxBookmark.Visible) - { - panelBookmark.Hide(); - pictureBoxBookmark.Hide(); - } - } - - private void pictureBoxBookmark_MouseClick(object sender, MouseEventArgs e) - { - if (e.Button == MouseButtons.Left) - { - if (panelBookmark.Visible) - { - panelBookmark.Hide(); - _showBookmarkLabel = false; - } - else - { - _showBookmarkLabel = true; - var p = _subtitle.GetParagraphOrDefault(_subtitleListViewIndex); - if (p != null) - { - ShowHideBookmark(p); - } - } - } - } - - private void pictureBoxBookmark_MouseEnter(object sender, EventArgs e) - { - if (_bookmarkContextMenu != null) - { - return; - } - - _bookmarkContextMenu = new ContextMenu(); - - // edit bookmark - var menuItem = new MenuItem(Configuration.Settings.Language.Main.Menu.ContextMenu.EditBookmark); - menuItem.Click += (sender2, e2) => { labelBookmark_DoubleClick(null, null); }; - _bookmarkContextMenu.MenuItems.Add(menuItem); - - // remove bookmark - menuItem = new MenuItem(Configuration.Settings.Language.Main.Menu.ContextMenu.RemoveBookmark); - menuItem.Click += (sender2, e2) => - { - var p2 = _subtitle.GetParagraphOrDefault(_subtitleListViewIndex); - if (p2 != null) - { - MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Main.Menu.ContextMenu.RemoveBookmark)); - p2.Bookmark = null; - SubtitleListview1.ShowState(_subtitleListViewIndex, p2); - ShowHideBookmark(p2); - SetListViewStateImages(); - new BookmarkPersistence(_subtitle, _fileName).Save(); - } - }; - _bookmarkContextMenu.MenuItems.Add(menuItem); - - _bookmarkContextMenu.MenuItems.Add("-"); - - // go to bookmark - menuItem = new MenuItem(Configuration.Settings.Language.Settings.GoToBookmark); - menuItem.Click += (sender2, e2) => { GoToBookmark(); }; - _bookmarkContextMenu.MenuItems.Add(menuItem); - - // clear all bookmarks - menuItem = new MenuItem(Configuration.Settings.Language.Settings.ClearBookmarks); - menuItem.Click += (sender2, e2) => { ClearBookmarks(); }; - _bookmarkContextMenu.MenuItems.Add(menuItem); - - pictureBoxBookmark.ContextMenu = _bookmarkContextMenu; - } - - private void labelBookmark_DoubleClick(object sender, EventArgs e) - { - var p1 = _subtitle.GetParagraphOrDefault(_subtitleListViewIndex); - if (p1 != null) - { - using (var form = new BookmarkAdd(p1)) - { - var result = form.ShowDialog(this); - if (result == DialogResult.OK) - { - MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Main.Menu.ContextMenu.EditBookmark)); - p1.Bookmark = form.Comment; - SubtitleListview1.ShowState(_subtitleListViewIndex, p1); - ShowHideBookmark(p1); - SetListViewStateImages(); - new BookmarkPersistence(_subtitle, _fileName).Save(); - } - } - } - } - - private void googleTranslateToolStripMenuItem_Click(object sender, EventArgs e) - { - TranslateViaGoogle(true, true); - } - - private void microsoftBingTranslateToolStripMenuItem_Click(object sender, EventArgs e) - { - TranslateViaGoogle(true, false); - } - - private void toolStripMenuItemBookmark_Click(object sender, EventArgs e) - { - ToggleBookmarks(true); - } - - private void RunActionOnAllParagraphs(Func action, string historyMessage) - { - if (_subtitle.Paragraphs.Count <= 0 || SubtitleListview1.SelectedItems.Count <= 0) - { - return; - } - - int linesUpdated = 0; - var selectedIndices = SubtitleListview1.GetSelectedIndices(); - for (int i = selectedIndices.Length - 1; i >= 0; i--) - { - int idx = selectedIndices[i]; - var p = _subtitle.GetParagraphOrDefault(idx); - if (p != null) - { - var newText = action.Invoke(p); - if (newText != p.Text) - { - if (linesUpdated == 0) - { - MakeHistoryForUndo(historyMessage); - } - if (newText.IsOnlyControlCharactersOrWhiteSpace()) - { - _subtitle.Paragraphs.RemoveAt(idx); - } - else - { - p.Text = newText; - } - linesUpdated++; - } - - if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) - { - var original = Utilities.GetOriginalParagraph(idx, p, _subtitleAlternate.Paragraphs); - if (original != null) - { - newText = action.Invoke(original); - if (newText != original.Text) - { - if (linesUpdated == 0) - { - MakeHistoryForUndo(historyMessage); - } - if (newText.IsOnlyControlCharactersOrWhiteSpace()) - { - _subtitleAlternate.Paragraphs.RemoveAt(idx); - } - else - { - original.Text = newText; - } - linesUpdated++; - } - } - } - } - } - - if (linesUpdated == 0) - { - return; // nothing changed - } - - var firstIdx = FirstSelectedIndex; - _subtitle.Renumber(); - _subtitleAlternate?.Renumber(); - SubtitleListview1.Fill(_subtitle, _subtitleAlternate); - ShowSource(); - SubtitleListview1.SelectIndexAndEnsureVisibleFaster(firstIdx); - RefreshSelectedParagraph(); - ShowStatus(string.Format(_language.LinesUpdatedX, linesUpdated)); - } - - private void removeAllFormattingsToolStripMenuItem_Click(object sender, EventArgs e) - { - RunActionOnAllParagraphs((p) => - { - var s = p.Text.Replace("♪", string.Empty).Replace("♫", string.Empty); - s = NetflixImsc11Japanese.RemoveTags(s); - return HtmlUtil.RemoveHtmlTags(s, true).Trim(); - }, string.Format(_language.BeforeX, _language.Menu.ContextMenu.RemoveFormattingAll)); - } - - private void removeBoldToolStripMenuItem_Click(object sender, EventArgs e) - { - RunActionOnAllParagraphs((p) => - { - return p.Text.Replace("", string.Empty) - .Replace("", string.Empty) - .Replace("", string.Empty) - .Replace("", string.Empty); - }, string.Format(_language.BeforeX, _language.Menu.ContextMenu.RemoveFormattingBold)); - } - - private void removeItalicToolStripMenuItem_Click(object sender, EventArgs e) - { - RunActionOnAllParagraphs((p) => - { - return p.Text.Replace("", string.Empty) - .Replace("", string.Empty) - .Replace("", string.Empty) - .Replace("", string.Empty); - }, string.Format(_language.BeforeX, _language.Menu.ContextMenu.RemoveFormattingItalic)); - } - - private void removeUnderlineToolStripMenuItem_Click(object sender, EventArgs e) - { - RunActionOnAllParagraphs((p) => - { - return p.Text.Replace("", string.Empty) - .Replace("", string.Empty) - .Replace("", string.Empty) - .Replace("", string.Empty); - }, string.Format(_language.BeforeX, _language.Menu.ContextMenu.RemoveFormattingUnderline)); - } - - private void removeColorToolStripMenuItem_Click(object sender, EventArgs e) - { - RunActionOnAllParagraphs((p) => - { - if (!p.Text.Contains(" 4) - { - var font = s.Substring(match.Index - 5); - if (font.StartsWith("", StringComparison.OrdinalIgnoreCase)) - { - s = s.Remove(match.Index - 5, 7); - var endIndex = s.IndexOf("", match.Index - 5, StringComparison.OrdinalIgnoreCase); - if (endIndex >= 0) - { - s = s.Remove(endIndex, 7); - } - } - else if (s.Length > match.Index + 1 && s[match.Index + 1] == '>') - { - s = s.Remove(match.Index, 1); - } - } - - match = r.Match(s); - } - - return s.Trim(); - }, string.Format(_language.BeforeX, _language.Menu.ContextMenu.RemoveFormattingColor)); - } - - private void removeFontNameToolStripMenuItem_Click(object sender, EventArgs e) - { - RunActionOnAllParagraphs((p) => - { - if (!p.Text.Contains(" 4) - { - var font = s.Substring(match.Index - 5); - if (font.StartsWith("", StringComparison.OrdinalIgnoreCase)) - { - s = s.Remove(match.Index - 5, 7); - var endIndex = s.IndexOf("", match.Index - 5, StringComparison.OrdinalIgnoreCase); - if (endIndex >= 0) - { - s = s.Remove(endIndex, 7); - } - } - else if (s.Length > match.Index + 1 && s[match.Index + 1] == '>') - { - s = s.Remove(match.Index, 1); - } - } - - match = r.Match(s); - } - - return s; - }, string.Format(_language.BeforeX, _language.Menu.ContextMenu.RemoveFormattingFontName)); - } - - private void removeAlignmentToolStripMenuItem_Click(object sender, EventArgs e) - { - RunActionOnAllParagraphs((p) => - { - if (!p.Text.Contains('{')) - { - return p.Text; - } - - return RemoveAssAlignmentTags(p.Text); - }, string.Format(_language.BeforeX, _language.Menu.ContextMenu.RemoveFormattingAlignment)); - } - - private void BoutenToolStripMenuItemClick(object sender, EventArgs e) - { - MakeHistoryForUndo(string.Format(_language.BeforeX, (sender as ToolStripMenuItem).Text)); - TextBoxListViewToggleTag((sender as ToolStripMenuItem).Text); - } - - private void toolStripMenuItemHorizontalDigits_Click(object sender, EventArgs e) - { - MakeHistoryForUndo(string.Format(_language.BeforeX, "horizontalDigit")); - TextBoxListViewToggleTag("horizontalDigit"); - } - - private void toolStripMenuItemSetParagraphAsSelection_Click(object sender, EventArgs e) - { - if (SubtitleListview1.SelectedItems.Count == 1 && audioVisualizer != null && audioVisualizer.NewSelectionParagraph != null) - { - var idx = SubtitleListview1.SelectedItems[0].Index; - var p = _subtitle.Paragraphs[idx]; - ButtonSetEndAndGoToNextClick(null, null); - p.StartTime.TotalMilliseconds = audioVisualizer.NewSelectionParagraph.StartTime.TotalMilliseconds; - p.EndTime.TotalMilliseconds = audioVisualizer.NewSelectionParagraph.EndTime.TotalMilliseconds; - SubtitleListview1.SetStartTimeAndDuration(idx, p, _subtitle.GetParagraphOrDefault(idx - 1), _subtitle.GetParagraphOrDefault(idx + 1)); - mediaPlayer.CurrentPosition = audioVisualizer.NewSelectionParagraph.EndTime.TotalSeconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines / 1000.0; - audioVisualizer.NewSelectionParagraph = null; - } - } - - private void toolStripMenuItemRuby_Click(object sender, EventArgs e) - { - var tb = GetFocusedTextBox(); - string before = string.Empty; - string text = tb.SelectedText; - string after = string.Empty; - - int selectionStart = tb.SelectionStart; - if (selectionStart > 0) - { - before = tb.Text.Substring(0, selectionStart); - } - - if (tb.Text.Length > selectionStart + text.Length) - { - after = tb.Text.Remove(0, selectionStart + text.Length); - } - - if (text.StartsWith(' ')) - { - before += " "; - text = text.TrimStart(); - } - - if (text.EndsWith(' ')) - { - after = " " + after; - } - - using (var form = new RubyJapanese(before, text, after)) - { - if (form.ShowDialog(this) != DialogResult.OK) - { - return; - } - - var rubyText = form.RubyText; - if (form.RubyItalic) - { - rubyText = "" + rubyText + ""; - } - else - { - rubyText = "" + rubyText + ""; - } - var rubyHtml = before + "" + form.RubyBaseText + "" + rubyText + "" + after; // sami ruby tag fix - var formatType = GetCurrentSubtitleFormat().GetType(); - if (formatType == typeof(Sami)) // sami ruby tag fix - { - rubyHtml = rubyHtml.Replace("ruby-container", "ruby") - .Replace("ruby-text", "rt") - .Replace("", string.Empty) - .Replace("", string.Empty) // sami ruby tag fix rp remove - .Replace("", string.Empty) // sami ruby tag fix italic remove - .Replace("", string.Empty) - .Replace("", string.Empty) - .Replace("", string.Empty); - } - tb.Text = rubyHtml; - } - } - - private void toolStripMenuItemAutoTranslate_DropDownOpening(object sender, EventArgs e) - { - translatepoweredByMicrosoftToolStripMenuItem.Visible = - !string.IsNullOrEmpty(Configuration.Settings.Tools.MicrosoftTranslatorApiKey) && - !string.IsNullOrEmpty(Configuration.Settings.Tools.MicrosoftTranslatorTokenEndpoint); - } - - private void comboBoxSubtitleFormats_DropDownClosed(object sender, EventArgs e) - { - MenuClosed(sender, e); - if (_oldSubtitleFormat.FriendlyName != GetCurrentSubtitleFormat().FriendlyName) - { - ComboBoxSubtitleFormatsSelectedIndexChanged(sender, e); - } - } - - private void comboBoxSubtitleFormats_DropDown(object sender, EventArgs e) - { - _oldSubtitleFormat = GetCurrentSubtitleFormat(); - MenuOpened(sender, e); - } - - private void toolStripSplitButtonPlayRate_ButtonClick(object sender, EventArgs e) - { - toolStripSplitButtonPlayRate.ShowDropDown(); - } - - private void ShowButtonShortcut(string shortcut) - { - if (string.IsNullOrEmpty(shortcut)) - { - ShowStatus(string.Empty, false); - } - else - { - ShowStatus(string.Format(Configuration.Settings.Language.General.ShortcutX, shortcut), false); - } - } - - private void buttonSetStartAndOffsetRest_MouseEnter(object sender, EventArgs e) - { - if (!string.IsNullOrEmpty(Configuration.Settings.Shortcuts.MainAdjustSetStartAndOffsetTheRest2)) - { - ShowButtonShortcut(Configuration.Settings.Shortcuts.MainAdjustSetStartAndOffsetTheRest2); - } - else - { - ShowButtonShortcut(Configuration.Settings.Shortcuts.MainAdjustSetStartAndOffsetTheRest); - } - } - - private void buttonSetEndAndGoToNext_MouseEnter(object sender, EventArgs e) - { - ShowButtonShortcut(Configuration.Settings.Shortcuts.MainAdjustSetEndAndGotoNext); - } - - private void buttonAdjustSetStartTime_MouseEnter(object sender, EventArgs e) - { - ShowButtonShortcut(Configuration.Settings.Shortcuts.MainCreateSetStart); - } - - private void buttonAdjustSetEndTime_MouseEnter(object sender, EventArgs e) - { - ShowButtonShortcut(Configuration.Settings.Shortcuts.MainCreateSetEnd); - } - - private void buttonInsertNewText_MouseEnter(object sender, EventArgs e) - { - ShowButtonShortcut(Configuration.Settings.Shortcuts.MainCreateInsertSubAtVideoPos); - } - - private void buttonAdjustPlayBefore_MouseEnter(object sender, EventArgs e) - { - ShowButtonShortcut(Configuration.Settings.Shortcuts.MainVideoPlayFromJustBefore); - } - - private void buttonAdjustGoToPosAndPause_MouseEnter(object sender, EventArgs e) - { - ShowButtonShortcut(Configuration.Settings.Shortcuts.MainVideoGoToStartCurrent); - } - - private void buttonBeforeText_MouseEnter(object sender, EventArgs e) - { - ShowButtonShortcut(Configuration.Settings.Shortcuts.MainVideoPlayFromJustBefore); - } - - private void buttonGotoSub_MouseEnter(object sender, EventArgs e) - { - ShowButtonShortcut(Configuration.Settings.Shortcuts.MainVideoGoToStartCurrent); - } - - private void buttonSetStartTime_MouseEnter(object sender, EventArgs e) - { - ShowButtonShortcut(Configuration.Settings.Shortcuts.MainCreateSetStart); - } - - private void buttonSetEnd_MouseEnter(object sender, EventArgs e) - { - ShowButtonShortcut(Configuration.Settings.Shortcuts.MainCreateSetEnd); - } - - private void boxToolStripMenuItem1_Click(object sender, EventArgs e) - { - var tb = GetFocusedTextBox(); - tb.Text = HtmlUtil.ToggleTag(tb.Text, "box"); - } - - private void toolStripMenuItemPreview_Click(object sender, EventArgs e) - { - var htmlFileName = Path.Combine(Path.GetTempPath(), $"WebVttPreview_{Guid.NewGuid()}.html"); - var subText = Encoding.UTF8.GetBytes(new WebVTT().ToText(_subtitle, "preview")); - File.WriteAllText(htmlFileName, @" - - - - WebVTT preview - - - - -" - .Replace('\'', '"') - .Replace("[BASE64]", Convert.ToBase64String(subText)) - .Replace("[VIDEO]", "file://" + VideoFileName) - .Replace("[EXT]", Path.GetExtension(VideoFileName).TrimStart('.').ToLowerInvariant()), Encoding.UTF8); - UiUtil.OpenFile(htmlFileName); - - System.Threading.SynchronizationContext.Current.Post(TimeSpan.FromMilliseconds(25000), () => - { - try - { - File.Delete(htmlFileName); - } - catch - { - // Ignore - } - }); - } - - private void trackBarWaveformPosition_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Space) - { - mediaPlayer.TogglePlayPause(); - e.SuppressKeyPress = true; - } - } - - private void toolStripMenuItemAssaStyles_Click(object sender, EventArgs e) - { - toolStripMenuItemAssStyles_Click(sender, e); - } - - private void openSecondSubtitleToolStripMenuItem_Click(object sender, EventArgs e) - { - openFileDialog1.Title = _languageGeneral.OpenSubtitle; - openFileDialog1.FileName = string.Empty; - openFileDialog1.Filter = UiUtil.SubtitleExtensionFilter.Value; - if (openFileDialog1.ShowDialog(this) != DialogResult.OK) - { - return; - } - - if (mediaPlayer.VideoPlayer is LibMpvDynamic libMpv) - { - if (Configuration.Settings.General.MpvHandlesPreviewText) - { - Configuration.Settings.General.MpvHandlesPreviewText = false; - mediaPlayer.VideoPlayer = libMpv; - mediaPlayer.SubtitleText = string.Empty; - } - libMpv.LoadSubtitle(openFileDialog1.FileName); - } - else if (mediaPlayer.VideoPlayer is LibVlcDynamic libvlc) - { - libvlc.LoadSecondSubtitle(openFileDialog1.FileName); - } - } - - private void aSSStylesToolStripMenuItem_Click(object sender, EventArgs e) - { - toolStripMenuItemAssStyles_Click(sender, e); - } - - private void contextMenuStripEmpty_Opening(object sender, CancelEventArgs e) - { - var format = GetCurrentSubtitleFormat(); - var formatType = format.GetType(); - if (formatType == typeof(AdvancedSubStationAlpha)) - { - aSSStylesToolStripMenuItem.Visible = true; - aSSStylesToolStripMenuItem.Text = _language.Menu.ContextMenu.AdvancedSubStationAlphaStyles; - } - else if (formatType == typeof(SubStationAlpha)) - { - aSSStylesToolStripMenuItem.Visible = true; - aSSStylesToolStripMenuItem.Text = _language.Menu.ContextMenu.SubStationAlphaStyles; - } - else - { - aSSStylesToolStripMenuItem.Visible = false; - } - } - - private void splitContainerListViewAndText_SplitterMoved(object sender, SplitterEventArgs e) - { - if (Configuration.Settings.General.SubtitleTextBoxMaxHeight < splitContainerListViewAndText.Panel2MinSize && - Configuration.Settings.General.SubtitleTextBoxMaxHeight > 1000) - { - return; - } - - if (splitContainerListViewAndText.Panel2.Height > Configuration.Settings.General.SubtitleTextBoxMaxHeight) - { - splitContainerListViewAndText.SplitterDistance = splitContainerListViewAndText.Height - Configuration.Settings.General.SubtitleTextBoxMaxHeight; - } - } - - private void splitContainerListViewAndText_SizeChanged(object sender, EventArgs e) - { - splitContainerListViewAndText_SplitterMoved(null, null); - } - } -} +using Nikse.SubtitleEdit.Controls; +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.BluRaySup; +using Nikse.SubtitleEdit.Core.ContainerFormats; +using Nikse.SubtitleEdit.Core.ContainerFormats.MaterialExchangeFormat; +using Nikse.SubtitleEdit.Core.ContainerFormats.Matroska; +using Nikse.SubtitleEdit.Core.ContainerFormats.Mp4; +using Nikse.SubtitleEdit.Core.ContainerFormats.Mp4.Boxes; +using Nikse.SubtitleEdit.Core.ContainerFormats.TransportStream; +using Nikse.SubtitleEdit.Core.Enums; +using Nikse.SubtitleEdit.Core.Forms; +using Nikse.SubtitleEdit.Core.NetflixQualityCheck; +using Nikse.SubtitleEdit.Core.SpellCheck; +using Nikse.SubtitleEdit.Core.SubtitleFormats; +using Nikse.SubtitleEdit.Core.VobSub; +using Nikse.SubtitleEdit.Forms.Networking; +using Nikse.SubtitleEdit.Forms.Ocr; +using Nikse.SubtitleEdit.Forms.Styles; +using Nikse.SubtitleEdit.Logic; +using Nikse.SubtitleEdit.Logic.CommandLineConvert; +using Nikse.SubtitleEdit.Logic.Networking; +using Nikse.SubtitleEdit.Logic.VideoPlayers; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Net; +using System.Reflection; +using System.Text; +using System.Text.RegularExpressions; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + + public sealed partial class Main : Form + { + private class ComboBoxZoomItem + { + public string Text { get; set; } + public double ZoomFactor { get; set; } + + public override string ToString() + { + return Text; + } + } + + private const int TabControlListView = 0; + private const int TabControlSourceView = 1; + + private Subtitle _subtitle = new Subtitle(); + + private int _undoIndex = -1; + private string _listViewTextUndoLast; + private int _listViewTextUndoIndex = -1; + private long _listViewTextTicks = -1; + private string _listViewAlternateTextUndoLast; + private long _listViewAlternateTextTicks = -1; + + private Subtitle _subtitleAlternate = new Subtitle(); + private string _subtitleAlternateFileName; + private string _fileName; + + private int _videoAudioTrackNumber = -1; + public int VideoAudioTrackNumber + { + get => _videoAudioTrackNumber; + set + { + if (_videoAudioTrackNumber != value) + { + if (value >= 0 && _videoAudioTrackNumber != -1) + { + ReloadWaveform(VideoFileName, value); + } + _videoAudioTrackNumber = value; + } + } + } + + public string VideoFileName { get; set; } + + private DateTime _fileDateTime; + private string _title; + private FindReplaceDialogHelper _findHelper; + private int _replaceStartLineIndex; + private bool _sourceViewChange; + private int _changeSubtitleHash = -1; + private int _changeAlternateSubtitleHash = -1; + private int _subtitleListViewIndex = -1; + private Paragraph _oldSelectedParagraph; + private bool _converted; + private SubtitleFormat _oldSubtitleFormat; + private List _selectedIndices; + private LanguageStructure.Main _language; + private LanguageStructure.General _languageGeneral; + private SpellCheck _spellCheckForm; + private bool _loading = true; + private bool _exitWhenLoaded; + private int _repeatCount = -1; + private double _endSeconds = -1; + private double _endSecondsNewPosition = -1; + private long _endSecondsNewPositionTicks; + private const double EndDelay = 0.05; + private int _autoContinueDelayCount = -1; + private long _lastTextKeyDownTicks; + private long _lastHistoryTicks; + private long _lastWaveformMenuCloseTicks; + private double? _audioWaveformRightClickSeconds; + private readonly Timer _timerDoSyntaxColoring = new Timer(); + private Timer _timerAutoBackup; + private readonly Timer _timerClearStatus = new Timer(); + private string _textAutoBackup; + private string _textAutoBackupOriginal; + private readonly List _statusLog = new List(); + private bool _disableShowStatus; + private StatusLog _statusLogForm; + private bool _makeHistoryPaused; + private bool _saveAsCalled; + + private CheckForUpdatesHelper _checkForUpdatesHelper; + private Timer _timerCheckForUpdates; + + private NikseWebServiceSession _networkSession; + private NetworkChat _networkChat; + + private ShowEarlierLater _showEarlierOrLater; + private MeasurementConverter _measurementConverter; + + private bool _isVideoControlsUndocked; + private VideoPlayerUndocked _videoPlayerUndocked; + private WaveformUndocked _waveformUndocked; + private VideoControlsUndocked _videoControlsUndocked; + + private GoogleOrMicrosoftTranslate _googleOrMicrosoftTranslate; + + private bool _cancelWordSpellCheck = true; + private bool _cleanupHasRun; + + private bool _clearLastFind; + private FindType _clearLastFindType = FindType.Normal; + private string _clearLastFindText = string.Empty; + private bool _videoLoadedGoToSubPosAndPause; + private string _cutText = string.Empty; + private Paragraph _mainCreateStartDownEndUpParagraph; + private Paragraph _mainAdjustStartDownEndUpAndGoToNextParagraph; + private int _lastDoNotPrompt = -1; + private VideoInfo _videoInfo; + private bool _splitDualSami; + private bool _openFileDialogOn; + private bool _resetVideo = true; + private bool _doAutoBreakOnTextChanged = true; + private readonly static object _syncUndo = new object(); + private string[] _dragAndDropFiles; + private readonly Timer _dragAndDropTimer = new Timer(); // to prevent locking windows explorer + private readonly Timer _dragAndDropVideoTimer = new Timer(); // to prevent locking windows explorer + private long _labelNextTicks = -1; + private bool _showBookmarkLabel = true; + private ContextMenu _bookmarkContextMenu; + private readonly MainShortcuts _shortcuts = new MainShortcuts(); + private long _winLeftDownTicks = -1; + private long _winRightDownTicks = -1; + + public bool IsMenuOpen { get; private set; } + + private bool AutoRepeatContinueOn + { + get { return tabControlButtons.SelectedIndex == 0 && checkBoxAutoContinue.Checked; } + } + + private bool AutoRepeatOn + { + get { return tabControlButtons.SelectedIndex == 0 && checkBoxAutoRepeatOn.Checked; } + } + + public string Title + { + get + { + if (_title == null) + { + var versionInfo = Utilities.AssemblyVersion.Split('.'); + _title = $"{_languageGeneral.Title} {versionInfo[0]}.{versionInfo[1]}.{versionInfo[2]}"; + } + + return _title; + } + } + + private void SetCurrentFormat(string formatName) + { + SetCurrentFormat(SubtitleFormat.FromName(formatName, new SubRip())); + } + + private void SetCurrentFormat(SubtitleFormat format) + { + if (format.IsVobSubIndexFile) + { + UiUtil.InitializeSubtitleFormatComboBox(comboBoxSubtitleFormats, format); + SubtitleListview1.HideNonVobSubColumns(); + } + else if (comboBoxSubtitleFormats.Items.Count == 1) + { + SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.Extra); + SetFormatTo(format); + } + else + { + int index = 0; + foreach (string name in comboBoxSubtitleFormats.Items) + { + if (name == format.FriendlyName) + { + comboBoxSubtitleFormats.SelectedIndex = index; + return; + } + + index++; + } + } + } + + protected override void OnLoad(EventArgs e) + { + UiUtil.FixFonts(this, 10000); + UiUtil.FixFonts(contextMenuStripListview); + UiUtil.FixFonts(contextMenuStripTextBoxListView); + UiUtil.FixFonts(contextMenuStripWaveform); + UiUtil.FixLargeFonts(tabControlButtons, buttonAutoBreak); + UiUtil.FixLargeFonts(tabControlButtons, buttonAutoBreak); + UiUtil.FixLargeFonts(groupBoxEdit, buttonAutoBreak); + UiUtil.InitializeSubtitleFont(textBoxSource); + UiUtil.InitializeSubtitleFont(SubtitleListview1); + + using (var graphics = CreateGraphics()) + { + // avoid weird looking layout for high DPI + if (graphics.DpiX > 120) + { + Font = new Font(Font.FontFamily, (float)(Font.Size * graphics.DpiX / 96.0)); + + numericUpDownDuration.Left = timeUpDownStartTime.Right + 15; + numericUpDownDuration.Width += 5; + labelDuration.Left = numericUpDownDuration.Left - 3; + } + var xDiff = timeUpDownStartTime.Top - (labelStartTime.Top + labelStartTime.Height); + if (xDiff < 0) // DPI auto-size fixes: see https://github.com/SubtitleEdit/subtitleedit/issues/3981 + { + xDiff *= -1; + timeUpDownStartTime.Top += xDiff; + numericUpDownDuration.Top += xDiff; + pictureBoxBookmark.Top += xDiff; + textBoxListViewText.Top += xDiff; + textBoxListViewText.Height -= xDiff; + textBoxListViewTextAlternate.Top += xDiff; + textBoxListViewTextAlternate.Height -= xDiff; + comboBoxAutoRepeat.Top += xDiff; + comboBoxAutoContinue.Top += xDiff; + } + } + labelAutoDuration.Left = labelDuration.Left - (labelAutoDuration.Width - 5); + + textBoxListViewText.BackColor = !IsSubtitleLoaded ? SystemColors.ActiveBorder : SystemColors.WindowFrame; + textBoxListViewTextAlternate.BackColor = !IsSubtitleLoaded ? SystemColors.ActiveBorder : SystemColors.WindowFrame; + + base.OnLoad(e); + } + + private static string GetArgumentAfterColon(IEnumerable commandLineArguments, string requestedArgumentName) + { + foreach (var argument in commandLineArguments) + { + if (argument.StartsWith(requestedArgumentName, StringComparison.OrdinalIgnoreCase)) + { + if (requestedArgumentName.EndsWith(':')) + { + return argument.Substring(requestedArgumentName.Length); + } + + return argument; + } + } + + return null; + } + + public Main() + { + if (Configuration.IsRunningOnLinux) + { + NativeMethods.setlocale(NativeMethods.LC_NUMERIC, "C"); + } + + try + { + UiUtil.PreInitialize(this); + InitializeComponent(); + + Icon = Properties.Resources.SubtitleEditFormIcon; + + textBoxListViewTextAlternate.Visible = false; + labelAlternateText.Visible = false; + labelAlternateCharactersPerSecond.Visible = false; + labelTextAlternateLineLengths.Visible = false; + labelAlternateSingleLine.Visible = false; + labelAlternateSingleLinePixels.Visible = false; + labelTextAlternateLineTotal.Visible = false; + labelNextWord.Visible = false; + + SetLanguage(Configuration.Settings.General.Language); + toolStripStatusNetworking.Visible = false; + labelTextLineLengths.Text = string.Empty; + labelCharactersPerSecond.Text = string.Empty; + labelTextLineTotal.Text = string.Empty; + labelStartTimeWarning.Text = string.Empty; + labelDurationWarning.Text = string.Empty; + labelVideoInfo.Text = string.Empty; + labelSingleLine.Text = string.Empty; + labelSingleLinePixels.Text = string.Empty; + Text = Title; + timeUpDownStartTime.TimeCode = new TimeCode(); + timeUpDownStartTime.UseVideoOffset = true; + timeUpDownVideoPosition.UseVideoOffset = true; + timeUpDownVideoPositionAdjust.UseVideoOffset = true; + checkBoxAutoRepeatOn.Checked = Configuration.Settings.General.AutoRepeatOn; + comboBoxAutoRepeat.SelectedIndex = Configuration.Settings.General.AutoRepeatCount; + checkBoxAutoContinue.Checked = Configuration.Settings.General.AutoContinueOn; + checkBoxSyncListViewWithVideoWhilePlaying.Checked = Configuration.Settings.General.SyncListViewWithVideoWhilePlaying; + + SetFormatTo(Configuration.Settings.General.DefaultSubtitleFormat); + + UiUtil.InitializeTextEncodingComboBox(comboBoxEncoding.ComboBox); + + // set up UI interfaces / injections + YouTubeAnnotations.GetYouTubeAnnotationStyles = new UiGetYouTubeAnnotationStyles(); + Ebu.EbuUiHelper = new UiEbuSaveHelper(); + Pac.GetPacEncodingImplementation = new UiGetPacEncoding(this); + RichTextToPlainText.NativeRtfTextConverter = new RtfTextConverterRichTextBox(); + + toolStripComboBoxFrameRate.Items.Add(23.976.ToString(CultureInfo.CurrentCulture)); + toolStripComboBoxFrameRate.Items.Add(24.0.ToString(CultureInfo.CurrentCulture)); + toolStripComboBoxFrameRate.Items.Add(25.0.ToString(CultureInfo.CurrentCulture)); + toolStripComboBoxFrameRate.Items.Add(29.97.ToString(CultureInfo.CurrentCulture)); + toolStripComboBoxFrameRate.Items.Add(30.ToString(CultureInfo.CurrentCulture)); + toolStripComboBoxFrameRate.Text = Configuration.Settings.General.DefaultFrameRate.ToString(); + pictureBoxBookmark.Visible = false; + + UpdateRecentFilesUI(); + InitializeToolbar(); + UpdateNetflixGlyphCheckToolsVisibility(); + Utilities.SetSecurityProtocol(); // download from Github requires TLS 1.2 + + tabControlSubtitle.SelectTab(TabControlSourceView); // AC + ShowSourceLineNumber(); // AC + tabControlSubtitle.SelectTab(TabControlListView); // AC + if (Configuration.Settings.General.StartInSourceView) + { + tabControlSubtitle.SelectTab(TabControlSourceView); + } + + audioVisualizer.Visible = Configuration.Settings.General.ShowAudioVisualizer; + audioVisualizer.ShowWaveform = Configuration.Settings.General.ShowWaveform; + audioVisualizer.ShowSpectrogram = Configuration.Settings.General.ShowSpectrogram; + panelWaveformControls.Visible = Configuration.Settings.General.ShowAudioVisualizer; + trackBarWaveformPosition.Visible = Configuration.Settings.General.ShowAudioVisualizer; + toolStripButtonToggleWaveform.Checked = Configuration.Settings.General.ShowAudioVisualizer; + toolStripButtonToggleVideo.Checked = Configuration.Settings.General.ShowVideoPlayer; + + if (Configuration.Settings.General.UseTimeFormatHHMMSSFF) + { + numericUpDownDuration.DecimalPlaces = 2; + numericUpDownDuration.Increment = (decimal)(0.01); + toolStripSeparatorFrameRate.Visible = true; + toolStripLabelFrameRate.Visible = true; + toolStripComboBoxFrameRate.Visible = true; + toolStripButtonGetFrameRate.Visible = true; + } + + _timerClearStatus.Interval = Configuration.Settings.General.ClearStatusBarAfterSeconds * 1000; + _timerClearStatus.Tick += TimerClearStatus_Tick; + + var commandLineArgs = Environment.GetCommandLineArgs(); + var fileName = string.Empty; + int srcLineNumber = -1; + if (commandLineArgs.Length > 1) + { + // ConvertOrReturn() shall not return if a command line conversion has been requested + CommandLineConverter.ConvertOrReturn(Title, commandLineArgs); + + fileName = commandLineArgs[1]; + + if (fileName.Equals("/batchconvertui", StringComparison.OrdinalIgnoreCase) || fileName.Equals("-batchconvertui", StringComparison.OrdinalIgnoreCase)) + { + new BatchConvert(this.Icon).ShowDialog(); + Environment.Exit(0); + } + + var sourceLineString = GetArgumentAfterColon(commandLineArgs, "/srcline:"); + if (!int.TryParse(sourceLineString, out srcLineNumber)) + { + srcLineNumber = -1; + } + + VideoFileName = GetArgumentAfterColon(commandLineArgs, "/video:"); + } + + labelAutoDuration.Visible = false; + mediaPlayer.SubtitleText = string.Empty; + comboBoxAutoContinue.SelectedIndex = Configuration.Settings.General.AutoContinueDelay; + + timeUpDownVideoPosition.TimeCode = new TimeCode(); + timeUpDownVideoPositionAdjust.TimeCode = new TimeCode(); + timeUpDownVideoPosition.TimeCodeChanged += VideoPositionChanged; + timeUpDownVideoPositionAdjust.TimeCodeChanged += VideoPositionChanged; + timeUpDownVideoPosition.Enabled = false; + timeUpDownVideoPositionAdjust.Enabled = false; + + switch (Configuration.Settings.VideoControls.LastActiveTab) + { + case "Translate": + tabControlButtons.SelectedIndex = 0; + break; + case "Create": + tabControlButtons.SelectedIndex = 1; + break; + case "Adjust": + tabControlButtons.SelectedIndex = 2; + break; + } + + tabControl1_SelectedIndexChanged(null, null); + buttonCustomUrl1.Text = Configuration.Settings.VideoControls.CustomSearchText1; + buttonCustomUrl1.Visible = Configuration.Settings.VideoControls.CustomSearchUrl1.Length > 1; + buttonCustomUrl2.Text = Configuration.Settings.VideoControls.CustomSearchText2; + buttonCustomUrl2.Visible = Configuration.Settings.VideoControls.CustomSearchUrl2.Length > 1; + + CheckAndGetNewlyDownloadedMpvDlls(string.Empty); + + if (fileName.Length > 0 && File.Exists(fileName)) + { + fileName = Path.GetFullPath(fileName); + + if (srcLineNumber < 0) + { + if (!OpenFromRecentFiles(fileName)) + { + OpenSubtitle(fileName, null, VideoFileName, null, true); + } + } + else + { + OpenSubtitle(fileName, null, VideoFileName, null, true); + } + + if (srcLineNumber >= 0 && GetCurrentSubtitleFormat().GetType() == typeof(SubRip) && srcLineNumber < textBoxSource.Lines.Length) + { + int pos = 0; + for (int i = 0; i < srcLineNumber; i++) + { + pos += textBoxSource.Lines[i].Length; + } + + if (pos + 35 < textBoxSource.TextLength) + { + pos += 35; + } + + string s = textBoxSource.Text.Substring(0, pos); + int lastTimeCode = s.LastIndexOf(" --> ", StringComparison.Ordinal); // 00:02:26,407 --> 00:02:31,356 + if (lastTimeCode > 14 && lastTimeCode + 16 >= s.Length) + { + s = s.Substring(0, lastTimeCode - 5); + lastTimeCode = s.LastIndexOf(" --> ", StringComparison.Ordinal); + } + + if (lastTimeCode > 14 && lastTimeCode + 16 < s.Length) + { + string tc = s.Substring(lastTimeCode - 13, 30).Trim(); + int index = 0; + foreach (var p in _subtitle.Paragraphs) + { + if (tc == p.StartTime + " --> " + p.EndTime) + { + SubtitleListview1.SelectNone(); + SubtitleListview1.Items[0].Selected = false; + SubtitleListview1.SelectIndexAndEnsureVisible(index, true); + break; + } + + index++; + } + } + } + } + else if (Configuration.Settings.General.StartLoadLastFile && Configuration.Settings.RecentFiles.Files.Count > 0) + { + fileName = Configuration.Settings.RecentFiles.Files[0].FileName; + if (!string.IsNullOrEmpty(fileName) && File.Exists(fileName) && !OpenFromRecentFiles(fileName)) + { + OpenSubtitle(fileName, null); + } + } + + // Initialize events etc. for audio waveform + audioVisualizer.OnDoubleClickNonParagraph += AudioWaveform_OnDoubleClickNonParagraph; + audioVisualizer.OnPositionSelected += AudioWaveform_OnPositionSelected; + audioVisualizer.OnTimeChanged += AudioWaveform_OnTimeChanged; // start and/or end position of paragraph changed + audioVisualizer.OnNewSelectionRightClicked += AudioWaveform_OnNewSelectionRightClicked; + audioVisualizer.OnParagraphRightClicked += AudioWaveform_OnParagraphRightClicked; + audioVisualizer.OnNonParagraphRightClicked += AudioWaveform_OnNonParagraphRightClicked; + audioVisualizer.OnSingleClick += AudioWaveform_OnSingleClick; + audioVisualizer.OnPause += AudioWaveform_OnPause; + audioVisualizer.OnTimeChangedAndOffsetRest += AudioWaveform_OnTimeChangedAndOffsetRest; + audioVisualizer.OnZoomedChanged += AudioWaveform_OnZoomedChanged; + audioVisualizer.InsertAtVideoPosition += audioVisualizer_InsertAtVideoPosition; + audioVisualizer.PasteAtVideoPosition += audioVisualizer_PasteAtVideoPosition; + audioVisualizer.KeyDown += AudioVisualizer_KeyDown; + SetAudioVisualizerSettings(); + if (Configuration.Settings.General.WaveformUpdateIntervalMs > 0 && Configuration.Settings.General.WaveformUpdateIntervalMs < 200) + { + timerWaveform.Interval = Configuration.Settings.General.WaveformUpdateIntervalMs; + } + + InitializeWaveformZoomDropdown(); + toolStripComboBoxWaveform.SelectedIndexChanged += toolStripComboBoxWaveform_SelectedIndexChanged; + + FixLargeFonts(); + + if (Configuration.Settings.General.RightToLeftMode) + { + ToolStripMenuItemRightToLeftModeClick(null, null); + } + + timeUpDownStartTime.SetAutoWidth(); + numericUpDownDuration.Left = timeUpDownStartTime.Right + 4; + labelDurationWarning.Left = numericUpDownDuration.Left; + labelDuration.Left = labelDurationWarning.Left; + + timeUpDownVideoPosition.SetAutoWidth(); + timeUpDownVideoPositionAdjust.SetAutoWidth(); + } + catch (Exception exception) + { + Cursor = Cursors.Default; + MessageBox.Show(exception.Message + Environment.NewLine + exception.StackTrace); + SeLogger.Error(exception, "Main constructor"); + } + } + + private void AudioVisualizer_KeyDown(object sender, KeyEventArgs e) + { + if (SubtitleListview1.SelectedIndices.Count != 1 || e.Handled) + { + return; + } + + if (e.KeyData == italicToolStripMenuItem.ShortcutKeys) + { + ListViewToggleTag(HtmlUtil.TagItalic); + e.SuppressKeyPress = true; + } + else if (e.KeyData == boldToolStripMenuItem.ShortcutKeys) + { + ListViewToggleTag(HtmlUtil.TagBold); + e.SuppressKeyPress = true; + } + else if (e.KeyData == underlineToolStripMenuItem.ShortcutKeys) + { + ListViewToggleTag(HtmlUtil.TagUnderline); + e.SuppressKeyPress = true; + } + + else if (e.KeyData == removeAllFormattingsToolStripMenuItem.ShortcutKeys) + { + removeAllFormattingsToolStripMenuItem_Click(null, null); + e.SuppressKeyPress = true; + } + + else if (e.KeyData == _shortcuts.MainListViewAlignmentN1) + { + SetAlignment("{\\an1}", false); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainListViewAlignmentN2) + { + SetAlignment("", false); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainListViewAlignmentN3) + { + SetAlignment("{\\an3}", false); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainListViewAlignmentN4) + { + SetAlignment("{\\an4}", false); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainListViewAlignmentN5) + { + SetAlignment("{\\an5}", false); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainListViewAlignmentN6) + { + SetAlignment("{\\an6}", false); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainListViewAlignmentN7) + { + SetAlignment("{\\an7}", false); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainListViewAlignmentN8) + { + SetAlignment("{\\an8}", false); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainListViewAlignmentN9) + { + SetAlignment("{\\an9}", false); + e.SuppressKeyPress = true; + } + } + + private void InitializeWaveformZoomDropdown() + { + toolStripComboBoxWaveform.Items.Clear(); + for (double zoomCounter = AudioVisualizer.ZoomMinimum; zoomCounter <= AudioVisualizer.ZoomMaximum + (0.001); zoomCounter += 0.1) + { + int percent = (int)Math.Round(zoomCounter * 100); + var item = new ComboBoxZoomItem { Text = percent + "%", ZoomFactor = zoomCounter }; + toolStripComboBoxWaveform.Items.Add(item); + if (percent == 100) + { + toolStripComboBoxWaveform.SelectedIndex = toolStripComboBoxWaveform.Items.Count - 1; + } + } + } + + private void audioVisualizer_InsertAtVideoPosition(object sender, EventArgs e) + { + InsertNewTextAtVideoPosition(); + } + + private void audioVisualizer_PasteAtVideoPosition(object sender, EventArgs e) + { + double videoPositionInMilliseconds = mediaPlayer.CurrentPosition * TimeCode.BaseUnit; + if (_subtitle.GetFirstParagraphOrDefaultByTime(videoPositionInMilliseconds) == null) + { + PastFromClipboard(videoPositionInMilliseconds); + } + } + + private void PastFromClipboard(double videoPositionInMilliseconds) + { + if (Clipboard.ContainsText()) + { + var text = Clipboard.GetText(); + var tmp = new Subtitle(); + var format = new SubRip(); + var list = new List(text.SplitToLines()); + format.LoadSubtitle(tmp, list, null); + if (videoPositionInMilliseconds >= 0 && tmp.Paragraphs.Count > 0) + { + if (tmp.Paragraphs[0].StartTime.TotalMilliseconds > videoPositionInMilliseconds) + { + var c = tmp.Paragraphs[0].StartTime.TotalMilliseconds - videoPositionInMilliseconds; + tmp.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(-c)); + } + else + { + var c = videoPositionInMilliseconds - tmp.Paragraphs[0].StartTime.TotalMilliseconds; + tmp.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(c)); + } + } + else + { + var start = videoPositionInMilliseconds; + foreach (var line in list) + { + if (!string.IsNullOrWhiteSpace(line)) + { + var duration = Utilities.GetOptimalDisplayMilliseconds(line); + tmp.Paragraphs.Add(new Paragraph(line.Trim(), start, start + duration)); + start += duration + Configuration.Settings.General.MinimumMillisecondsBetweenLines; + } + } + } + + if (tmp.Paragraphs.Count > 0) + { + MakeHistoryForUndo(_language.BeforeInsertLine); + var selectIndices = new List(); + for (int i = 0; i < tmp.Paragraphs.Count; i++) + { + var p = tmp.Paragraphs[i]; + var idx = _subtitle.InsertParagraphInCorrectTimeOrder(p); + selectIndices.Add(idx); + if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle && SubtitleListview1.IsAlternateTextColumnVisible) + { + var original = Utilities.GetOriginalParagraph(idx + i + 1, p, _subtitleAlternate.Paragraphs); + if (original == null) + { + _subtitleAlternate.InsertParagraphInCorrectTimeOrder(new Paragraph(string.Empty, p.StartTime.TotalMilliseconds, p.EndTime.TotalMilliseconds)); + } + } + } + + _subtitle.Renumber(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + SubtitleListview1.SelectIndexAndEnsureVisible(selectIndices[0], true); + foreach (var selectIndex in selectIndices) + { + SubtitleListview1.Items[selectIndex].Selected = true; + } + + if (_subtitleListViewIndex >= 0) + { + UpdateListViewTextInfo(labelTextLineLengths, labelSingleLine, labelSingleLinePixels, labelTextLineTotal, labelCharactersPerSecond, _subtitle.Paragraphs[_subtitleListViewIndex], textBoxListViewText); + } + else + { + SubtitleListview1.SelectIndexAndEnsureVisible(0); + } + } + } + } + + private void TimerClearStatus_Tick(object sender, EventArgs e) + { + ShowStatus(string.Empty); + } + + private void SetEncoding(Encoding encoding) + { + if (encoding == Encoding.UTF8 && Configuration.Settings.General.DefaultEncoding == TextEncoding.Utf8WithoutBom) + { + comboBoxEncoding.SelectedIndex = TextEncoding.Utf8WithoutBomIndex; + } + + foreach (TextEncoding item in comboBoxEncoding.Items) + { + if (item.Equals(encoding)) + { + comboBoxEncoding.SelectedItem = item; + return; + } + } + + comboBoxEncoding.SelectedIndex = TextEncoding.Utf8WithBomIndex; // UTF-8 with BOM + } + + private void SetEncoding(string encodingName) + { + UiUtil.SetTextEncoding(comboBoxEncoding, encodingName); + } + + private Encoding GetCurrentEncoding() + { + return UiUtil.GetTextEncodingComboBoxCurrentEncoding(comboBoxEncoding.ComboBox).Encoding; + } + + private void AudioWaveform_OnNonParagraphRightClicked(object sender, AudioVisualizer.ParagraphEventArgs e) + { + addParagraphHereToolStripMenuItem.Visible = false; + addParagraphAndPasteToolStripMenuItem.Visible = false; + toolStripMenuItemSetParagraphAsSelection.Visible = false; + deleteParagraphToolStripMenuItem.Visible = false; + toolStripMenuItemFocusTextbox.Visible = true; + splitToolStripMenuItem1.Visible = false; + mergeWithPreviousToolStripMenuItem.Visible = false; + mergeWithNextToolStripMenuItem.Visible = false; + toolStripSeparator11.Visible = false; + extendToPreviousToolStripMenuItem.Visible = false; + extendToNextToolStripMenuItem.Visible = false; + toolStripSeparator6.Visible = false; + toolStripMenuItemWaveformPlaySelection.Visible = false; + toolStripSeparator24.Visible = false; + if (audioVisualizer.GetSceneChangeIndex(e.Seconds) >= 0) + { + removeSceneChangeToolStripMenuItem.Visible = true; + addSceneChangeToolStripMenuItem.Visible = false; + } + else + { + removeSceneChangeToolStripMenuItem.Visible = false; + addSceneChangeToolStripMenuItem.Visible = true; + } + + _audioWaveformRightClickSeconds = e.Seconds; + contextMenuStripWaveform.Show(MousePosition.X, MousePosition.Y); + } + + private void AudioWaveform_OnDoubleClickNonParagraph(object sender, AudioVisualizer.ParagraphEventArgs e) + { + if (mediaPlayer.VideoPlayer != null) + { + _endSeconds = -1; + if (e.Paragraph == null) + { + if (Configuration.Settings.VideoControls.WaveformDoubleClickOnNonParagraphAction == "PlayPause") + { + mediaPlayer.TogglePlayPause(); + } + } + else + { + var index = _subtitle.GetIndex(e.Paragraph); + SubtitleListview1.SelectIndexAndEnsureVisible(index, true); + if (tabControlSubtitle.SelectedIndex == TabControlSourceView) + { + var p = _subtitle.GetParagraphOrDefault(index); + if (p != null) + { + string tc = p.StartTime + " --> " + p.EndTime; + int start = textBoxSource.Text.IndexOf(p.Number + Environment.NewLine + tc, StringComparison.Ordinal); + if (start < 0) + { + start = 0; + } + + start = textBoxSource.Text.IndexOf(tc, start, StringComparison.Ordinal); + if (start > 0) + { + textBoxSource.SelectionStart = start + tc.Length + Environment.NewLine.Length; + textBoxSource.SelectionLength = 0; + textBoxSource.ScrollToCaret(); + } + } + } + } + } + } + + private void AudioWaveform_OnZoomedChanged(object sender, EventArgs e) + { + SelectZoomTextInComboBox(); + } + + private void AudioWaveform_OnTimeChangedAndOffsetRest(object sender, AudioVisualizer.ParagraphEventArgs e) + { + if (mediaPlayer.VideoPlayer == null) + { + return; + } + + int index = _subtitle.Paragraphs.IndexOf(e.Paragraph); + if (index < 0) + { + if (_subtitleAlternate != null && SubtitleListview1.IsAlternateTextColumnVisible && Configuration.Settings.General.ShowOriginalAsPreviewIfAvailable) + { + index = _subtitleAlternate.GetIndex(e.Paragraph); + if (index >= 0) + { + var current = Utilities.GetOriginalParagraph(index, e.Paragraph, _subtitle.Paragraphs); + if (current != null) + { + index = _subtitle.Paragraphs.IndexOf(current); + } + } + } + else if (_subtitleAlternate != null && SubtitleListview1.IsAlternateTextColumnVisible) + { + index = _subtitle.GetIndex(e.Paragraph); + } + } + + if (index >= 0) + { + SubtitleListview1.SelectIndexAndEnsureVisible(index, true); + mediaPlayer.CurrentPosition = e.Seconds; + SetStartAndOffsetTheRest(e.Seconds); + } + + audioVisualizer.Invalidate(); + if (tabControlSubtitle.SelectedIndex == TabControlSourceView) + { + ShowSource(); + } + } + + private void AudioWaveform_OnPause(object sender, EventArgs e) + { + _endSeconds = -1; + if (mediaPlayer.VideoPlayer != null) + { + mediaPlayer.Pause(); + } + } + + private void AudioWaveform_OnSingleClick(object sender, AudioVisualizer.ParagraphEventArgs e) + { + timerWaveform.Stop(); + _endSeconds = -1; + if (mediaPlayer.VideoPlayer != null) + { + mediaPlayer.Pause(); + } + + mediaPlayer.CurrentPosition = e.Seconds; + + int index = -1; + if (SubtitleListview1.SelectedItems.Count > 0) + { + index = SubtitleListview1.SelectedItems[0].Index; + } + + SetWaveformPosition(audioVisualizer.StartPositionSeconds, e.Seconds, index); + + if (Configuration.Settings.VideoControls.WaveformSingleClickSelect && e.Paragraph != null) + { + SubtitleListview1.SelectIndexAndEnsureVisible(_subtitle.GetIndex(e.Paragraph), true); + } + + timerWaveform.Start(); + } + + private void AudioWaveform_OnParagraphRightClicked(object sender, AudioVisualizer.ParagraphEventArgs e) + { + SubtitleListview1.SelectIndexAndEnsureVisible(_subtitle.GetIndex(e.Paragraph), true); + + addParagraphHereToolStripMenuItem.Visible = false; + addParagraphAndPasteToolStripMenuItem.Visible = false; + toolStripMenuItemSetParagraphAsSelection.Visible = false; + deleteParagraphToolStripMenuItem.Visible = true; + toolStripMenuItemFocusTextbox.Visible = true; + splitToolStripMenuItem1.Visible = true; + mergeWithPreviousToolStripMenuItem.Visible = true; + mergeWithNextToolStripMenuItem.Visible = true; + toolStripSeparator11.Visible = true; + extendToPreviousToolStripMenuItem.Visible = true; + extendToNextToolStripMenuItem.Visible = true; + toolStripSeparator6.Visible = true; + toolStripMenuItemWaveformPlaySelection.Visible = true; + toolStripSeparator24.Visible = true; + if (audioVisualizer.GetSceneChangeIndex(e.Seconds) >= 0) + { + removeSceneChangeToolStripMenuItem.Visible = true; + addSceneChangeToolStripMenuItem.Visible = false; + } + else + { + removeSceneChangeToolStripMenuItem.Visible = false; + addSceneChangeToolStripMenuItem.Visible = true; + } + + _audioWaveformRightClickSeconds = e.Seconds; + contextMenuStripWaveform.Show(MousePosition.X, MousePosition.Y); + } + + private void removeSceneChangeToolStripMenuItem_Click(object sender, EventArgs e) + { + if (!_audioWaveformRightClickSeconds.HasValue) + { + return; + } + + var idx = audioVisualizer.GetSceneChangeIndex(_audioWaveformRightClickSeconds.Value); + RemoveSceneChange(idx); + } + + private void RemoveSceneChange(int idx) + { + if (idx >= 0 && idx < audioVisualizer.SceneChanges.Count) + { + var temp = new List(audioVisualizer.SceneChanges); + temp.RemoveAt(idx); + audioVisualizer.SceneChanges = temp; + SceneChangeHelper.SaveSceneChanges(VideoFileName, temp); + } + } + + private void addSceneChangeToolStripMenuItem_Click(object sender, EventArgs e) + { + if (!_audioWaveformRightClickSeconds.HasValue) + { + return; + } + + var list = audioVisualizer.SceneChanges.Where(p => p > 0).ToList(); + list.Add(_audioWaveformRightClickSeconds.Value); + list.Sort(); + audioVisualizer.SceneChanges = list; + SceneChangeHelper.SaveSceneChanges(VideoFileName, list); + } + + private void AudioWaveform_OnNewSelectionRightClicked(object sender, AudioVisualizer.ParagraphEventArgs e) + { + SubtitleListview1.SelectIndexAndEnsureVisible(_subtitle.GetIndex(e.Paragraph), true); + + addParagraphHereToolStripMenuItem.Visible = true; + addParagraphAndPasteToolStripMenuItem.Visible = Clipboard.ContainsText(); + + if (SubtitleListview1.SelectedIndices.Count == 1) + { + var p = _subtitle.GetParagraphOrDefault(FirstSelectedIndex); + toolStripMenuItemSetParagraphAsSelection.Visible = p.StartTime.IsMaxTime; + } + + deleteParagraphToolStripMenuItem.Visible = false; + toolStripMenuItemFocusTextbox.Visible = false; + splitToolStripMenuItem1.Visible = false; + mergeWithPreviousToolStripMenuItem.Visible = false; + mergeWithNextToolStripMenuItem.Visible = false; + extendToPreviousToolStripMenuItem.Visible = false; + extendToNextToolStripMenuItem.Visible = false; + toolStripSeparator6.Visible = false; + + contextMenuStripWaveform.Show(MousePosition.X, MousePosition.Y); + } + + private void AudioWaveform_OnTimeChanged(object sender, AudioVisualizer.ParagraphEventArgs e) + { + var paragraph = e.Paragraph; + var beforeParagraph = e.BeforeParagraph; + if (beforeParagraph == null) + { + beforeParagraph = paragraph; + } + + if (Math.Abs(beforeParagraph.StartTime.TotalMilliseconds - paragraph.StartTime.TotalMilliseconds) < 0.01 && + Math.Abs(beforeParagraph.EndTime.TotalMilliseconds - paragraph.EndTime.TotalMilliseconds) < 0.01) + { + _makeHistoryPaused = true; + } + + int selectedIndex = FirstSelectedIndex; + int index = _subtitle.Paragraphs.IndexOf(paragraph); + + // TODO: Moving selected lines + // current idx must also be selected + //if (e.MouseDownParagraphType == AudioVisualizer.MouseDownParagraphType.Whole && SubtitleListview1.SelectedIndices.Count > 1) + //{ + // foreach (int idx in SubtitleListview1.SelectedIndices) + // { + // var p = _subtitle.Paragraphs[idx]; + // if (p != paragraph) + // { + // var dur = p.Duration.TotalMilliseconds; + // p.StartTime.TotalMilliseconds += e.AdjustMs; + // p.EndTime.TotalMilliseconds += e.AdjustMs; + // SubtitleListview1.SetStartTimeAndDuration(idx, p); + // } + // } + //} + + if (index == _subtitleListViewIndex) + { + // Make history item for rollback (change paragraph back for history + change again) + _subtitle.Paragraphs[index] = new Paragraph(beforeParagraph); + MakeHistoryForUndoOnlyIfNotResent(string.Format(_language.VideoControls.BeforeChangingTimeInWaveformX, "#" + paragraph.Number + " " + paragraph.Text)); + _subtitle.Paragraphs[index] = paragraph; + _makeHistoryPaused = true; + + Paragraph original = null; + if (_subtitleAlternate != null && SubtitleListview1.IsAlternateTextColumnVisible) + { + original = Utilities.GetOriginalParagraph(index, beforeParagraph, _subtitleAlternate.Paragraphs); + } + + if (Configuration.Settings.General.UseTimeFormatHHMMSSFF) + { // so we don't get weird rounds we'll use whole frames when moving start time + double fr = TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate; + if (e.BeforeParagraph != null && e.BeforeParagraph.StartTime.TotalMilliseconds != e.Paragraph.StartTime.TotalMilliseconds && + e.BeforeParagraph.Duration.TotalMilliseconds == e.Paragraph.Duration.TotalMilliseconds) + { + // move paragraph + paragraph.StartTime.TotalMilliseconds = ((int)Math.Round(paragraph.StartTime.TotalMilliseconds / fr)) * fr; + paragraph.EndTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds + e.BeforeParagraph.Duration.TotalMilliseconds; + } + else if (e.BeforeParagraph != null && e.BeforeParagraph.EndTime.TotalMilliseconds == e.Paragraph.EndTime.TotalMilliseconds) + { + paragraph.EndTime.TotalMilliseconds = ((int)Math.Round(paragraph.EndTime.TotalMilliseconds / fr)) * fr; + int end = SubtitleFormat.MillisecondsToFrames(paragraph.EndTime.TotalMilliseconds); + int dur = SubtitleFormat.MillisecondsToFrames(paragraph.Duration.TotalMilliseconds); + paragraph.StartTime.TotalMilliseconds = SubtitleFormat.FramesToMilliseconds(end - dur); + } + } + + timeUpDownStartTime.TimeCode = paragraph.StartTime; + var durationInSeconds = (decimal)paragraph.Duration.TotalSeconds; + if (durationInSeconds >= numericUpDownDuration.Minimum && durationInSeconds <= numericUpDownDuration.Maximum) + { + SetDurationInSeconds((double)durationInSeconds); + if (e.MouseDownParagraphType == AudioVisualizer.MouseDownParagraphType.Start) + { + paragraph.EndTime.TotalMilliseconds = e.BeforeParagraph.EndTime.TotalMilliseconds; + } + } + + MovePrevNext(e, beforeParagraph, index); + + if (original != null) + { + original.StartTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds; + original.EndTime.TotalMilliseconds = paragraph.EndTime.TotalMilliseconds; + } + } + else if (_subtitleAlternate != null && SubtitleListview1.IsAlternateTextColumnVisible && Configuration.Settings.General.ShowOriginalAsPreviewIfAvailable) + { + index = _subtitleAlternate.GetIndex(paragraph); + if (index >= 0) + { + // Make history item for rollback (change paragraph back for history + change again) + _subtitleAlternate.Paragraphs[index] = new Paragraph(beforeParagraph); + MakeHistoryForUndoOnlyIfNotResent(string.Format(_language.VideoControls.BeforeChangingTimeInWaveformX, "#" + paragraph.Number + " " + paragraph.Text)); + _subtitleAlternate.Paragraphs[index] = paragraph; + _makeHistoryPaused = true; + + var current = Utilities.GetOriginalParagraph(index, beforeParagraph, _subtitle.Paragraphs); + if (current != null) + { + current.StartTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds; + current.EndTime.TotalMilliseconds = paragraph.EndTime.TotalMilliseconds; + + index = _subtitle.GetIndex(current); + + SubtitleListview1.SetStartTimeAndDuration(index, paragraph, _subtitle.GetParagraphOrDefault(index + 1), _subtitle.GetParagraphOrDefault(index - 1)); + + if (index == selectedIndex) + { + timeUpDownStartTime.TimeCode = paragraph.StartTime; + var durationInSeconds = (decimal)(paragraph.Duration.TotalSeconds); + if (durationInSeconds >= numericUpDownDuration.Minimum && durationInSeconds <= numericUpDownDuration.Maximum) + { + SetDurationInSeconds((double)durationInSeconds); + } + } + } + } + } + else if (_subtitleAlternate != null && SubtitleListview1.IsAlternateTextColumnVisible) + { + index = _subtitle.GetIndex(paragraph); + if (index >= 0) + { + // Make history item for rollback (change paragraph back for history + change again) + _subtitle.Paragraphs[index] = new Paragraph(beforeParagraph); + MakeHistoryForUndoOnlyIfNotResent(string.Format(_language.VideoControls.BeforeChangingTimeInWaveformX, "#" + paragraph.Number + " " + paragraph.Text)); + _subtitle.Paragraphs[index] = paragraph; + _makeHistoryPaused = true; + + MovePrevNext(e, beforeParagraph, index); + + var original = Utilities.GetOriginalParagraph(index, beforeParagraph, _subtitleAlternate.Paragraphs); + if (original != null) + { + original.StartTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds; + original.EndTime.TotalMilliseconds = paragraph.EndTime.TotalMilliseconds; + } + + SubtitleListview1.SetStartTimeAndDuration(index, paragraph, _subtitle.GetParagraphOrDefault(index + 1), _subtitle.GetParagraphOrDefault(index - 1)); + } + } + else + { + if (index >= 0) + { + // Make history item for rollback (change paragraph back for history + change again) + _subtitle.Paragraphs[index] = new Paragraph(beforeParagraph); + MakeHistoryForUndoOnlyIfNotResent(string.Format(_language.VideoControls.BeforeChangingTimeInWaveformX, "#" + paragraph.Number + " " + paragraph.Text)); + _subtitle.Paragraphs[index] = paragraph; + _makeHistoryPaused = true; + + MovePrevNext(e, beforeParagraph, index); + SubtitleListview1.SyntaxColorLine(_subtitle.Paragraphs, index, paragraph); + + if (_subtitleAlternate != null) + { + var original = Utilities.GetOriginalParagraph(index, beforeParagraph, _subtitleAlternate.Paragraphs); + if (original != null) + { + original.StartTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds; + original.EndTime.TotalMilliseconds = paragraph.EndTime.TotalMilliseconds; + } + } + } + + SubtitleListview1.SetStartTimeAndDuration(index, paragraph, _subtitle.GetParagraphOrDefault(index + 1), _subtitle.GetParagraphOrDefault(index - 1)); + } + + beforeParagraph.StartTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds; + beforeParagraph.EndTime.TotalMilliseconds = paragraph.EndTime.TotalMilliseconds; + _makeHistoryPaused = false; + + if (Configuration.Settings.VideoControls.WaveformSetVideoPositionOnMoveStartEnd && + (e.MouseDownParagraphType == AudioVisualizer.MouseDownParagraphType.Start || + e.MouseDownParagraphType == AudioVisualizer.MouseDownParagraphType.End)) + { + mediaPlayer.CurrentPosition = e.Seconds; + } + + if (tabControlSubtitle.SelectedIndex == TabControlSourceView) + { + ShowSource(); + } + } + + private void MovePrevNext(AudioVisualizer.ParagraphEventArgs e, Paragraph beforeParagraph, int index) + { + int curIdx = FirstSelectedIndex; + if (e.MovePreviousOrNext && curIdx >= 0) + { + if (e.MouseDownParagraphType == AudioVisualizer.MouseDownParagraphType.Start) + { + var prev = _subtitle.GetParagraphOrDefault(index - 1); + if (prev != null) + { + Paragraph originalPrev = null; + if (_subtitleAlternate != null && SubtitleListview1.IsAlternateTextColumnVisible) + { + originalPrev = Utilities.GetOriginalParagraph(index - 1, prev, _subtitleAlternate.Paragraphs); + } + + prev.EndTime.TotalMilliseconds = prev.EndTime.TotalMilliseconds + (e.Paragraph.StartTime.TotalMilliseconds - beforeParagraph.StartTime.TotalMilliseconds); + SubtitleListview1.SetStartTimeAndDuration(index - 1, prev, _subtitle.GetParagraphOrDefault(index), _subtitle.GetParagraphOrDefault(index - 2)); + audioVisualizer.Invalidate(); + + if (originalPrev != null) + { + originalPrev.EndTime.TotalMilliseconds = prev.EndTime.TotalMilliseconds; + } + + if (curIdx == index - 1) + { + var durationInSeconds = (decimal)(prev.Duration.TotalSeconds); + if (durationInSeconds >= numericUpDownDuration.Minimum && durationInSeconds <= numericUpDownDuration.Maximum) + { + SetDurationInSeconds((double)durationInSeconds); + } + } + } + } + else if (e.MouseDownParagraphType == AudioVisualizer.MouseDownParagraphType.End) + { + var next = _subtitle.GetParagraphOrDefault(index + 1); + if (next != null) + { + Paragraph originalNext = null; + if (_subtitleAlternate != null && SubtitleListview1.IsAlternateTextColumnVisible) + { + originalNext = Utilities.GetOriginalParagraph(index + 1, next, _subtitleAlternate.Paragraphs); + } + + next.StartTime.TotalMilliseconds = next.StartTime.TotalMilliseconds + (e.Paragraph.EndTime.TotalMilliseconds - beforeParagraph.EndTime.TotalMilliseconds); + SubtitleListview1.SetStartTimeAndDuration(index + 1, next, _subtitle.GetParagraphOrDefault(index + 2), _subtitle.GetParagraphOrDefault(index)); + audioVisualizer.Invalidate(); + + if (originalNext != null) + { + originalNext.StartTime.TotalMilliseconds = next.StartTime.TotalMilliseconds; + } + + if (curIdx == index + 1) + { + timeUpDownStartTime.TimeCode = next.StartTime; + var durationInSeconds = (decimal)(next.Duration.TotalSeconds); + if (durationInSeconds >= numericUpDownDuration.Minimum && durationInSeconds <= numericUpDownDuration.Maximum) + { + SetDurationInSeconds((double)durationInSeconds); + } + } + } + } + } + } + + private void AudioWaveform_OnPositionSelected(object sender, AudioVisualizer.ParagraphEventArgs e) + { + mediaPlayer.CurrentPosition = e.Seconds; + if (e.Paragraph != null) + { + SubtitleListview1.SelectIndexAndEnsureVisible(_subtitle.GetIndex(e.Paragraph), true); + } + } + + private void VideoPositionChanged(object sender, EventArgs e) + { + var tud = (TimeUpDown)sender; + if (tud.Enabled) + { + mediaPlayer.CurrentPosition = tud.TimeCode.TotalSeconds; + } + } + + private void Main_Load(object sender, EventArgs e) + { + splitContainer1.Panel1MinSize = 525; + splitContainer1.Panel2MinSize = 250; + splitContainerMain.Panel1MinSize = 200; + splitContainerMain.Panel2MinSize = 220; + + if (Configuration.Settings.General.StartRememberPositionAndSize && + !string.IsNullOrEmpty(Configuration.Settings.General.StartPosition)) + { + var parts = Configuration.Settings.General.StartPosition.Split(';'); + if (parts.Length == 2) + { + if (int.TryParse(parts[0], out var x) && int.TryParse(parts[1], out var y)) + { + if (x > -100 || y > -100) + { + Left = x; + Top = y; + } + } + } + + if (Configuration.Settings.General.StartSize == "Maximized") + { + CenterFormOnCurrentScreen(); + WindowState = FormWindowState.Maximized; + return; + } + + parts = Configuration.Settings.General.StartSize.Split(';'); + if (parts.Length == 2) + { + if (int.TryParse(parts[0], out var x) && int.TryParse(parts[1], out var y)) + { + Width = x; + Height = y; + } + } + + var ctrlScreen = Screen.FromControl(this); + + if (ctrlScreen.Bounds.Width < Width) + { + Width = ctrlScreen.Bounds.Width; + } + + if (ctrlScreen.Bounds.Height < Height) + { + Height = ctrlScreen.Bounds.Height; + } + + // Fix main window coordinate (Multi-Monitor issue) + if ((ctrlScreen.Bounds.Right < Left) || (ctrlScreen.Bounds.Bottom < Top) || + (ctrlScreen.Bounds.X > Right) || (ctrlScreen.Bounds.Y > Top)) + { + CenterToScreen(); + } + } + else + { + CenterFormOnCurrentScreen(); + } + } + + private void InitializeLanguage() + { + fileToolStripMenuItem.Text = _language.Menu.File.Title; + newToolStripMenuItem.Text = _language.Menu.File.New; + openToolStripMenuItem.Text = _language.Menu.File.Open; + toolStripMenuItemOpenKeepVideo.Text = _language.Menu.File.OpenKeepVideo; + reopenToolStripMenuItem.Text = _language.Menu.File.Reopen; + saveToolStripMenuItem.Text = _language.Menu.File.Save; + saveAsToolStripMenuItem.Text = _language.Menu.File.SaveAs; + toolStripMenuItemRestoreAutoBackup.Text = _language.Menu.File.RestoreAutoBackup; + toolStripMenuItemTTProperties.Text = _language.Menu.File.TimedTextProperties; + openOriginalToolStripMenuItem.Text = _language.Menu.File.OpenOriginal; + saveOriginalToolStripMenuItem.Text = _language.Menu.File.SaveOriginal; + saveOriginalAstoolStripMenuItem.Text = _language.SaveOriginalSubtitleAs; + removeOriginalToolStripMenuItem.Text = _language.Menu.File.CloseOriginal; + + toolStripMenuItemOpenContainingFolder.Text = _language.Menu.File.OpenContainingFolder; + toolStripMenuItemCompare.Text = _language.Menu.File.Compare; + toolStripMenuItemStatistics.Text = _language.Menu.File.Statistics; + toolStripMenuItemPlugins.Text = _language.Menu.File.Plugins; + toolStripMenuItemImportDvdSubtitles.Text = _language.Menu.File.ImportOcrFromDvd; + toolStripMenuItemSubIdx.Text = _language.Menu.File.ImportOcrVobSubSubtitle; + toolStripButtonGetFrameRate.ToolTipText = _language.GetFrameRateFromVideoFile; + toolStripMenuItemImportBluRaySup.Text = _language.Menu.File.ImportBluRaySupFile; + toolStripMenuItemImportXSub.Text = _language.Menu.File.ImportXSub; + matroskaImportStripMenuItem.Text = _language.Menu.File.ImportSubtitleFromMatroskaFile; + toolStripMenuItemManualAnsi.Text = _language.Menu.File.ImportSubtitleWithManualChosenEncoding; + toolStripMenuItemImportText.Text = _language.Menu.File.ImportText; + toolStripMenuItemImportImages.Text = _language.Menu.File.ImportImages; + toolStripMenuItemImportTimeCodes.Text = _language.Menu.File.ImportTimecodes; + toolStripMenuItemExport.Text = _language.Menu.File.Export; + toolStripMenuItemExportPngXml.Text = _language.Menu.File.ExportBdnXml; + bluraySupToolStripMenuItem.Text = _language.Menu.File.ExportBluRaySup; + adobeEncoreFABImageScriptToolStripMenuItem.Text = _language.Menu.File.ExportAdobeEncoreFabImageScript; + toolStripMenuItemTextTimeCodePair.Text = _language.Menu.File.ExportKoreanAtsFilePair; + vobSubsubidxToolStripMenuItem.Text = _language.Menu.File.ExportVobSub; + toolStripMenuItemCavena890.Text = _language.Menu.File.ExportCavena890; + eBUSTLToolStripMenuItem.Text = _language.Menu.File.ExportEbu; + pACScreenElectronicsToolStripMenuItem.Text = _language.Menu.File.ExportPac; + plainTextToolStripMenuItem.Text = _language.Menu.File.ExportPlainText; + toolStripMenuItemAvidStl.Text = _language.Menu.File.ExportAvidStl; + toolStripMenuItemExportCapMakerPlus.Text = _language.Menu.File.ExportCapMakerPlus; + toolStripMenuItemExportCaptionInc.Text = _language.Menu.File.ExportCaptionsInc; + toolStripMenuItemExportCheetahCap.Text = _language.Menu.File.ExportCheetahCap; + toolStripMenuItemExportUltech130.Text = _language.Menu.File.ExportUltech130; + exportCustomTextFormatToolStripMenuItem.Text = _language.Menu.File.ExportCustomTextFormat; + exitToolStripMenuItem.Text = _language.Menu.File.Exit; + + editToolStripMenuItem.Text = _language.Menu.Edit.Title; + showHistoryforUndoToolStripMenuItem.Text = _language.Menu.Edit.ShowUndoHistory; + toolStripMenuItemUndo.Text = _language.Menu.Edit.Undo; + toolStripMenuItemRedo.Text = _language.Menu.Edit.Redo; + + toolStripMenuItemInsertUnicodeCharacter.Text = _language.Menu.Edit.InsertUnicodeSymbol; + + findToolStripMenuItem.Text = _language.Menu.Edit.Find; + findNextToolStripMenuItem.Text = _language.Menu.Edit.FindNext; + replaceToolStripMenuItem.Text = _language.Menu.Edit.Replace; + multipleReplaceToolStripMenuItem.Text = _language.Menu.Edit.MultipleReplace; + gotoLineNumberToolStripMenuItem.Text = _language.Menu.Edit.GoToSubtitleNumber; + toolStripMenuItemRightToLeftMode.Text = _language.Menu.Edit.RightToLeftMode; + + toolStripMenuItemRemoveUnicodeControlChars.Text = _language.Menu.Edit.RemoveUnicodeControlCharacters; + toolStripMenuItemRtlUnicodeControlChars.Text = _language.Menu.Edit.FixRtlViaUnicodeControlCharacters; + + toolStripMenuItemReverseRightToLeftStartEnd.Text = _language.Menu.Edit.ReverseRightToLeftStartEnd; + toolStripMenuItemModifySelection.Text = _language.Menu.Edit.ModifySelection; + toolStripMenuItemInverseSelection.Text = _language.Menu.Edit.InverseSelection; + editSelectAllToolStripMenuItem.Text = _language.Menu.ContextMenu.SelectAll; + + toolsToolStripMenuItem.Text = _language.Menu.Tools.Title; + adjustDisplayTimeToolStripMenuItem.Text = _language.Menu.Tools.AdjustDisplayDuration; + toolStripMenuItemApplyDurationLimits.Text = _language.Menu.Tools.ApplyDurationLimits; + toolStripMenuItemSubtitlesBridgeGaps.Text = _language.Menu.Tools.SubtitlesBridgeGaps; + fixToolStripMenuItem.Text = _language.Menu.Tools.FixCommonErrors; + startNumberingFromToolStripMenuItem.Text = _language.Menu.Tools.StartNumberingFrom; + removeTextForHearImpairedToolStripMenuItem.Text = _language.Menu.Tools.RemoveTextForHearingImpaired; + ChangeCasingToolStripMenuItem.Text = _language.Menu.Tools.ChangeCasing; + toolStripMenuItemChangeFrameRate2.Text = _language.Menu.Tools.ChangeFrameRate; + changeSpeedInPercentToolStripMenuItem.Text = _language.Menu.Tools.ChangeSpeedInPercent; + toolStripMenuItemAutoMergeShortLines.Text = _language.Menu.Tools.MergeShortLines; + toolStripMenuItemMergeDuplicateText.Text = _language.Menu.Tools.MergeDuplicateText; + toolStripMenuItemMergeLinesWithSameTimeCodes.Text = _language.Menu.Tools.MergeSameTimeCodes; + toolStripMenuItemAutoSplitLongLines.Text = _language.Menu.Tools.SplitLongLines; + setMinimumDisplayTimeBetweenParagraphsToolStripMenuItem.Text = _language.Menu.Tools.MinimumDisplayTimeBetweenParagraphs; + toolStripMenuItemSortBy.Text = _language.Menu.Tools.SortBy; + netflixQualityCheckToolStripMenuItem.Text = _language.Menu.Tools.NetflixQualityCheck; + toolStripButtonNetflixQualityCheck.Text = _language.Menu.Tools.NetflixQualityCheck; + + sortNumberToolStripMenuItem.Text = _language.Menu.Tools.Number; + sortStartTimeToolStripMenuItem.Text = _language.Menu.Tools.StartTime; + sortEndTimeToolStripMenuItem.Text = _language.Menu.Tools.EndTime; + sortDisplayTimeToolStripMenuItem.Text = _language.Menu.Tools.Duration; + + descendingToolStripMenuItem.Text = _language.Menu.Tools.Descending; + AscendingToolStripMenuItem.Text = _language.Menu.Tools.Ascending; + + sortTextAlphabeticallytoolStripMenuItem.Text = _language.Menu.Tools.TextAlphabetically; + sortTextMaxLineLengthToolStripMenuItem.Text = _language.Menu.Tools.TextSingleLineMaximumLength; + sortTextTotalLengthToolStripMenuItem.Text = _language.Menu.Tools.TextTotalLength; + sortTextNumberOfLinesToolStripMenuItem.Text = _language.Menu.Tools.TextNumberOfLines; + textCharssecToolStripMenuItem.Text = _language.Menu.Tools.TextNumberOfCharactersPerSeconds; + textWordsPerMinutewpmToolStripMenuItem.Text = _language.Menu.Tools.WordsPerMinute; + styleToolStripMenuItem.Text = _language.Menu.Tools.Style; + actorToolStripMenuItem.Text = Configuration.Settings.Language.General.Actor; + + toolStripMenuItemShowOriginalInPreview.Text = _language.Menu.Edit.ShowOriginalTextInAudioAndVideoPreview; + toolStripMenuItemMakeEmptyFromCurrent.Text = _language.Menu.Tools.MakeNewEmptyTranslationFromCurrentSubtitle; + toolStripMenuItemBatchConvert.Text = _language.Menu.Tools.BatchConvert; + generateDatetimeInfoFromVideoToolStripMenuItem.Text = _language.Menu.Tools.GenerateTimeAsText; + toolStripMenuItemMeasurementConverter.Text = _language.Menu.Tools.MeasurementConverter; + splitToolStripMenuItem.Text = _language.Menu.Tools.SplitSubtitle; + appendTextVisuallyToolStripMenuItem.Text = _language.Menu.Tools.AppendSubtitle; + joinSubtitlesToolStripMenuItem.Text = _language.Menu.Tools.JoinSubtitles; + + toolStripMenuItemVideo.Text = _language.Menu.Video.Title; + openVideoToolStripMenuItem.Text = _language.Menu.Video.OpenVideo; + toolStripMenuItemOpenVideoFromUrl.Text = _language.Menu.Video.OpenVideoFromUrl; + toolStripMenuItemOpenDvd.Text = _language.Menu.Video.OpenDvd; + toolStripMenuItemSetAudioTrack.Text = _language.Menu.Video.ChooseAudioTrack; + closeVideoToolStripMenuItem.Text = _language.Menu.Video.CloseVideo; + openSecondSubtitleToolStripMenuItem.Text = _language.Menu.Video.OpenSecondSubtitle; + generateTextFromCurrentVideoToolStripMenuItem.Text = _language.Menu.Video.GenerateTextFromVideo; + + smpteTimeModedropFrameToolStripMenuItem.Text = _language.Menu.Video.SmptTimeMode; + toolStripMenuItemImportChapters.Text = _language.Menu.Video.ImportChaptersFromVideo; + toolStripMenuItemImportSceneChanges.Text = _language.Menu.Video.GenerateImportSceneChanges; + toolStripMenuItemRemoveSceneChanges.Text = _language.Menu.Video.RemoveSceneChanges; + + toolStripMenuItemAddWaveformBatch.Text = _language.Menu.Video.WaveformBatchGenerate; + + if (Configuration.Settings.VideoControls.GenerateSpectrogram) + { + showhideWaveformToolStripMenuItem.Text = _language.Menu.Video.ShowHideWaveformAndSpectrogram; + } + else + { + showhideWaveformToolStripMenuItem.Text = _language.Menu.Video.ShowHideWaveform; + } + + showhideVideoToolStripMenuItem.Text = _language.Menu.Video.ShowHideVideo; + undockVideoControlsToolStripMenuItem.Text = _language.Menu.Video.UnDockVideoControls; + redockVideoControlsToolStripMenuItem.Text = _language.Menu.Video.ReDockVideoControls; + + toolStripMenuItemSpellCheckMain.Text = _language.Menu.SpellCheck.Title; + spellCheckToolStripMenuItem.Text = _language.Menu.SpellCheck.SpellCheck; + toolStripMenuItemSpellCheckFromCurrentLine.Text = _language.Menu.SpellCheck.SpellCheckFromCurrentLine; + findDoubleWordsToolStripMenuItem.Text = _language.Menu.SpellCheck.FindDoubleWords; + FindDoubleLinesToolStripMenuItem.Text = _language.Menu.SpellCheck.FindDoubleLines; + GetDictionariesToolStripMenuItem.Text = _language.Menu.SpellCheck.GetDictionaries; + addWordToNameListToolStripMenuItem.Text = _language.Menu.SpellCheck.AddToNameList; + + toolStripMenuItemSynchronization.Text = _language.Menu.Synchronization.Title; + toolStripMenuItemAdjustAllTimes.Text = _language.Menu.Synchronization.AdjustAllTimes; + visualSyncToolStripMenuItem.Text = _language.Menu.Synchronization.VisualSync; + toolStripMenuItemPointSync.Text = _language.Menu.Synchronization.PointSync; + pointSyncViaOtherSubtitleToolStripMenuItem.Text = _language.Menu.Synchronization.PointSyncViaOtherSubtitle; + + toolStripMenuItemAutoTranslate.Text = _language.Menu.AutoTranslate.Title; + translateByGoogleToolStripMenuItem.Text = _language.Menu.AutoTranslate.TranslatePoweredByGoogle; + translatepoweredByMicrosoftToolStripMenuItem.Text = _language.Menu.AutoTranslate.TranslatePoweredByMicrosoft; + translateFromSwedishToDanishToolStripMenuItem.Text = _language.Menu.AutoTranslate.TranslateFromSwedishToDanish; + + optionsToolStripMenuItem.Text = _language.Menu.Options.Title; + settingsToolStripMenuItem.Text = _language.Menu.Options.Settings; + changeLanguageToolStripMenuItem.Text = _language.Menu.Options.ChooseLanguage + " [" + Configuration.Settings.Language.Name + "]"; + + toolStripMenuItemNetworking.Text = _language.Menu.Networking.Title; + startServerToolStripMenuItem.Text = _language.Menu.Networking.StartNewSession; + joinSessionToolStripMenuItem.Text = _language.Menu.Networking.JoinSession; + showSessionKeyLogToolStripMenuItem.Text = _language.Menu.Networking.ShowSessionInfoAndLog; + chatToolStripMenuItem.Text = _language.Menu.Networking.Chat; + leaveSessionToolStripMenuItem.Text = _language.Menu.Networking.LeaveSession; + + checkForUpdatesToolStripMenuItem.Text = _language.Menu.Help.CheckForUpdates; + helpToolStripMenuItem.Text = _language.Menu.Help.Title; + helpToolStripMenuItem1.Text = _language.Menu.Help.Help; + aboutToolStripMenuItem.Text = _language.Menu.Help.About; + + toolStripButtonFileNew.ToolTipText = _language.Menu.ToolBar.New; + toolStripButtonFileOpen.ToolTipText = _language.Menu.ToolBar.Open; + toolStripButtonSave.ToolTipText = _language.Menu.ToolBar.Save; + toolStripButtonSaveAs.ToolTipText = _language.Menu.ToolBar.SaveAs; + toolStripButtonFind.ToolTipText = _language.Menu.ToolBar.Find; + toolStripButtonReplace.ToolTipText = _language.Menu.ToolBar.Replace; + toolStripButtonFixCommonErrors.ToolTipText = _language.Menu.ToolBar.FixCommonErrors; + toolStripButtonRemoveTextForHi.ToolTipText = _language.Menu.ToolBar.RemoveTextForHi; + toolStripButtonVisualSync.ToolTipText = _language.Menu.ToolBar.VisualSync; + toolStripButtonSpellCheck.ToolTipText = _language.Menu.ToolBar.SpellCheck; + toolStripButtonNetflixQualityCheck.ToolTipText = _language.Menu.ToolBar.NetflixQualityCheck; + toolStripButtonSettings.ToolTipText = _language.Menu.ToolBar.Settings; + toolStripButtonHelp.ToolTipText = _language.Menu.ToolBar.Help; + toolStripButtonToggleWaveform.ToolTipText = _language.Menu.ToolBar.ShowHideWaveform; + toolStripButtonToggleVideo.ToolTipText = _language.Menu.ToolBar.ShowHideVideo; + + toolStripMenuItemAssStyles.Text = _language.Menu.ContextMenu.SubStationAlphaStyles; + setStylesForSelectedLinesToolStripMenuItem.Text = _language.Menu.ContextMenu.SubStationAlphaSetStyle; + setActorForSelectedLinesToolStripMenuItem.Text = _language.Menu.ContextMenu.SetActor; + + toolStripMenuItemDelete.Text = _language.Menu.ContextMenu.Delete; + insertLineToolStripMenuItem.Text = _language.Menu.ContextMenu.InsertFirstLine; + toolStripMenuItemInsertBefore.Text = _language.Menu.ContextMenu.InsertBefore; + toolStripMenuItemInsertAfter.Text = _language.Menu.ContextMenu.InsertAfter; + toolStripMenuItemInsertSubtitle.Text = _language.Menu.ContextMenu.InsertSubtitleAfter; + + toolStripMenuItemCopySourceText.Text = _language.Menu.ContextMenu.CopyToClipboard; + + toolStripMenuItemColumn.Text = _language.Menu.ContextMenu.Column; + columnDeleteTextOnlyToolStripMenuItem.Text = _language.Menu.ContextMenu.ColumnDeleteText; + toolStripMenuItemColumnDeleteText.Text = _language.Menu.ContextMenu.ColumnDeleteTextAndShiftCellsUp; + ShiftTextCellsDownToolStripMenuItem.Text = _language.Menu.ContextMenu.ColumnInsertEmptyTextAndShiftCellsDown; + toolStripMenuItemInsertTextFromSub.Text = _language.Menu.ContextMenu.ColumnInsertTextFromSubtitle; + toolStripMenuItemColumnImportText.Text = _language.Menu.ContextMenu.ColumnImportTextAndShiftCellsDown; + toolStripMenuItemPasteSpecial.Text = _language.Menu.ContextMenu.ColumnPasteFromClipboard; + moveTextUpToolStripMenuItem.Text = _language.Menu.ContextMenu.ColumnTextUp; + moveTextDownToolStripMenuItem.Text = _language.Menu.ContextMenu.ColumnTextDown; + copyOriginalTextToCurrentToolStripMenuItem.Text = _language.Menu.ContextMenu.ColumnCopyOriginalTextToCurrent; + toolStripMenuItemBookmark.Text = Configuration.Settings.Language.Settings.ToggleBookmarksWithComment; + + splitLineToolStripMenuItem.Text = _language.Menu.ContextMenu.Split; + toolStripMenuItemMergeLines.Text = _language.Menu.ContextMenu.MergeSelectedLines; + toolStripMenuItemMergeDialog.Text = _language.Menu.ContextMenu.MergeSelectedLinesAsDialog; + mergeBeforeToolStripMenuItem.Text = _language.Menu.ContextMenu.MergeWithLineBefore; + mergeAfterToolStripMenuItem.Text = _language.Menu.ContextMenu.MergeWithLineAfter; + extendBeforeToolStripMenuItem.Text = _language.Menu.ContextMenu.ExtendToLineBefore; + extendAfterToolStripMenuItem.Text = _language.Menu.ContextMenu.ExtendToLineAfter; + removeFormattinglToolStripMenuItem.Text = _language.Menu.ContextMenu.RemoveFormatting; + removeAllFormattingsToolStripMenuItem.Text = _language.Menu.ContextMenu.RemoveFormattingAll; + removeBoldToolStripMenuItem.Text = _language.Menu.ContextMenu.RemoveFormattingBold; + removeItalicToolStripMenuItem.Text = _language.Menu.ContextMenu.RemoveFormattingItalic; + removeUnderlineToolStripMenuItem.Text = _language.Menu.ContextMenu.RemoveFormattingUnderline; + removeColorToolStripMenuItem.Text = _language.Menu.ContextMenu.RemoveFormattingColor; + removeFontNameToolStripMenuItem.Text = _language.Menu.ContextMenu.RemoveFormattingFontName; + removeAlignmentToolStripMenuItem.Text = _language.Menu.ContextMenu.RemoveFormattingAlignment; + boldToolStripMenuItem.Text = _languageGeneral.Bold; + underlineToolStripMenuItem.Text = _language.Menu.ContextMenu.Underline; + italicToolStripMenuItem.Text = _languageGeneral.Italic; + colorToolStripMenuItem.Text = _language.Menu.ContextMenu.Color; + toolStripMenuItemFont.Text = _language.Menu.ContextMenu.FontName; + toolStripMenuItemAlignment.Text = _language.Menu.ContextMenu.Alignment; + toolStripMenuItemAutoBreakLines.Text = _language.Menu.ContextMenu.AutoBalanceSelectedLines; + toolStripMenuItemUnbreakLines.Text = _language.Menu.ContextMenu.RemoveLineBreaksFromSelectedLines; + typeEffectToolStripMenuItem.Text = _language.Menu.ContextMenu.TypewriterEffect; + karokeeEffectToolStripMenuItem.Text = _language.Menu.ContextMenu.KaraokeEffect; + showSelectedLinesEarlierlaterToolStripMenuItem.Text = _language.Menu.ContextMenu.ShowSelectedLinesEarlierLater; + visualSyncSelectedLinesToolStripMenuItem.Text = _language.Menu.ContextMenu.VisualSyncSelectedLines; + toolStripMenuItemGoogleMicrosoftTranslateSelLine.Text = _language.Menu.ContextMenu.GoogleAndMicrosoftTranslateSelectedLine; + googleTranslateToolStripMenuItem.Text = _language.Menu.AutoTranslate.TranslatePoweredByGoogle; + microsoftBingTranslateToolStripMenuItem.Text = _language.Menu.AutoTranslate.TranslatePoweredByMicrosoft; + toolStripMenuItemTranslateSelected.Text = _language.Menu.ContextMenu.TranslateSelectedLines; + adjustDisplayTimeForSelectedLinesToolStripMenuItem.Text = _language.Menu.ContextMenu.AdjustDisplayDurationForSelectedLines; + fixCommonErrorsInSelectedLinesToolStripMenuItem.Text = _language.Menu.ContextMenu.FixCommonErrorsInSelectedLines; + changeCasingForSelectedLinesToolStripMenuItem.Text = _language.Menu.ContextMenu.ChangeCasingForSelectedLines; + toolStripMenuItemSaveSelectedLines.Text = _language.Menu.ContextMenu.SaveSelectedLines; + + // textbox context menu + cutToolStripMenuItem.Text = _language.Menu.ContextMenu.Cut; + copyToolStripMenuItem.Text = _language.Menu.ContextMenu.Copy; + pasteToolStripMenuItem.Text = _language.Menu.ContextMenu.Paste; + deleteToolStripMenuItem.Text = _language.Menu.ContextMenu.Delete; + toolStripMenuItemSplitTextAtCursor.Text = _language.Menu.ContextMenu.SplitLineAtCursorPosition; + toolStripMenuItemSplitViaWaveform.Text = _language.Menu.ContextMenu.SplitLineAtCursorAndWaveformPosition; + selectAllToolStripMenuItem.Text = _language.Menu.ContextMenu.SelectAll; + normalToolStripMenuItem1.Text = _language.Menu.ContextMenu.RemoveFormattingAll; + boldToolStripMenuItem1.Text = _languageGeneral.Bold; + italicToolStripMenuItem1.Text = _languageGeneral.Italic; + boxToolStripMenuItem.Text = _language.Menu.ContextMenu.Box; + underlineToolStripMenuItem1.Text = _language.Menu.ContextMenu.Underline; + colorToolStripMenuItem1.Text = _language.Menu.ContextMenu.Color; + fontNameToolStripMenuItem.Text = _language.Menu.ContextMenu.FontName; + toolStripMenuItemInsertUnicodeSymbol.Text = _language.Menu.Edit.InsertUnicodeSymbol; + toolStripMenuItemInsertUnicodeControlCharacters.Text = _language.Menu.Edit.InsertUnicodeControlCharacters; + superscriptToolStripMenuItem.Text = _language.Menu.ContextMenu.Superscript; + subscriptToolStripMenuItem.Text = _language.Menu.ContextMenu.Subscript; + leftToolStripMenuItem.Text = _language.Menu.Edit.InsertUnicodeControlCharactersLRM; + righttoleftMarkToolStripMenuItem.Text = _language.Menu.Edit.InsertUnicodeControlCharactersRLM; + startOfLefttorightEmbeddingLREToolStripMenuItem.Text = _language.Menu.Edit.InsertUnicodeControlCharactersLRE; + startOfRighttoleftEmbeddingRLEToolStripMenuItem.Text = _language.Menu.Edit.InsertUnicodeControlCharactersRLE; + startOfLefttorightOverrideLROToolStripMenuItem.Text = _language.Menu.Edit.InsertUnicodeControlCharactersLRO; + startOfRighttoleftOverrideRLOToolStripMenuItem.Text = _language.Menu.Edit.InsertUnicodeControlCharactersRLO; + + // main controls + SubtitleListview1.InitializeLanguage(_languageGeneral, Configuration.Settings); + toolStripLabelSubtitleFormat.Text = _language.Controls.SubtitleFormat; + toolStripLabelEncoding.Text = _language.Controls.FileEncoding; + toolStripLabelFrameRate.Text = _languageGeneral.FrameRate; + tabControlSubtitle.TabPages[TabControlSourceView].Text = _language.Controls.SourceView; + tabControlSubtitle.TabPages[TabControlListView].Text = _language.Controls.ListView; + labelStartTime.Text = _languageGeneral.StartTime; + labelDuration.Text = _languageGeneral.Duration; + labelText.Text = _languageGeneral.Text; + UpdateListViewTextInfo(labelTextLineLengths, labelSingleLine, labelSingleLinePixels, labelTextLineTotal, labelCharactersPerSecond, _subtitle?.GetParagraphOrDefault(_subtitleListViewIndex), textBoxListViewText); + labelAlternateText.Text = _languageGeneral.OriginalText; + UpdateListViewTextInfo(labelTextAlternateLineLengths, labelAlternateSingleLine, labelAlternateSingleLinePixels, labelTextAlternateLineTotal, labelAlternateCharactersPerSecond, _subtitleAlternate?.GetParagraphOrDefault(_subtitleListViewIndex), textBoxListViewTextAlternate); + buttonPrevious.Text = _language.Controls.Previous; + buttonNext.Text = _language.Controls.Next; + buttonAutoBreak.Text = _language.Controls.AutoBreak; + buttonUnBreak.Text = _language.Controls.Unbreak; + buttonSplitLine.Text = _languageGeneral.SplitLine; + ShowSourceLineNumber(); + + // video controls + tabPageTranslate.Text = _language.VideoControls.Translate + " "; + tabPageCreate.Text = _language.VideoControls.Create + " "; + tabPageAdjust.Text = _language.VideoControls.Adjust + " "; + checkBoxSyncListViewWithVideoWhilePlaying.Text = _language.VideoControls.SelectCurrentElementWhilePlaying; + if (VideoFileName == null) + { + labelVideoInfo.Text = _languageGeneral.NoVideoLoaded; + } + + toolStripButtonLockCenter.Text = _language.VideoControls.Center; + toolStripSplitButtonPlayRate.Text = _language.VideoControls.PlayRate; + groupBoxAutoRepeat.Text = _language.VideoControls.AutoRepeat; + checkBoxAutoRepeatOn.Text = _language.VideoControls.AutoRepeatOn; + labelAutoRepeatCount.Text = _language.VideoControls.AutoRepeatCount; + groupBoxAutoContinue.Text = _language.VideoControls.AutoContinue; + checkBoxAutoContinue.Text = _language.VideoControls.AutoContinueOn; + labelAutoContinueDelay.Text = _language.VideoControls.DelayInSeconds; + buttonPlayPrevious.Text = _language.VideoControls.Previous; + buttonPlayCurrent.Text = _language.VideoControls.PlayCurrent; + buttonPlayNext.Text = _language.VideoControls.Next; + buttonStop.Text = _language.VideoControls.Pause; + groupBoxTranslateSearch.Text = _language.VideoControls.SearchTextOnline; + buttonGoogleIt.Text = _language.VideoControls.GoogleIt; + buttonGoogleTranslateIt.Text = _language.VideoControls.GoogleTranslate; + labelTranslateTip.Text = _language.VideoControls.TranslateTip; + + buttonInsertNewText.Text = _language.VideoControls.InsertNewSubtitleAtVideoPosition; + buttonBeforeText.Text = _language.VideoControls.PlayFromJustBeforeText; + buttonGotoSub.Text = _language.VideoControls.GoToSubtitlePositionAndPause; + buttonSetStartTime.Text = _language.VideoControls.SetStartTime; + buttonSetEnd.Text = _language.VideoControls.SetEndTime; + buttonSecBack1.Text = _language.VideoControls.SecondsBackShort; + buttonSecBack2.Text = _language.VideoControls.SecondsBackShort; + buttonForward1.Text = _language.VideoControls.SecondsForwardShort; + buttonForward2.Text = _language.VideoControls.SecondsForwardShort; + labelVideoPosition.Text = _language.VideoControls.VideoPosition; + labelVideoPosition2.Text = _language.VideoControls.VideoPosition; + + buttonSetStartAndOffsetRest.Text = _language.VideoControls.SetstartTimeAndOffsetOfRest; + buttonSetEndAndGoToNext.Text = _language.VideoControls.SetEndTimeAndGoToNext; + buttonAdjustSetStartTime.Text = _language.VideoControls.SetStartTime; + buttonAdjustSetEndTime.Text = _language.VideoControls.SetEndTime; + buttonAdjustPlayBefore.Text = _language.VideoControls.PlayFromJustBeforeText; + buttonAdjustGoToPosAndPause.Text = _language.VideoControls.GoToSubtitlePositionAndPause; + buttonAdjustSecBack1.Text = _language.VideoControls.SecondsBackShort; + buttonAdjustSecBack2.Text = _language.VideoControls.SecondsBackShort; + buttonAdjustSecForward1.Text = _language.VideoControls.SecondsForwardShort; + buttonAdjustSecForward2.Text = _language.VideoControls.SecondsForwardShort; + + // waveform + var languageWaveform = Configuration.Settings.Language.Waveform; + addParagraphHereToolStripMenuItem.Text = languageWaveform.AddParagraphHere; + addParagraphAndPasteToolStripMenuItem.Text = languageWaveform.AddParagraphHereAndPasteText; + toolStripMenuItemSetParagraphAsSelection.Text = languageWaveform.SetParagraphAsSelection; + deleteParagraphToolStripMenuItem.Text = languageWaveform.DeleteParagraph; + toolStripMenuItemFocusTextbox.Text = languageWaveform.FocusTextBox; + goToPreviousSubtitleStripMenuItem.Text = languageWaveform.GoToPrevious; + goToNextSubtitleStripMenuItem.Text = languageWaveform.GoToNext; + + splitToolStripMenuItem1.Text = languageWaveform.Split; + mergeWithPreviousToolStripMenuItem.Text = languageWaveform.MergeWithPrevious; + mergeWithNextToolStripMenuItem.Text = languageWaveform.MergeWithNext; + extendToPreviousToolStripMenuItem.Text = languageWaveform.ExtendToPrevious; + extendToNextToolStripMenuItem.Text = languageWaveform.ExtendToNext; + toolStripMenuItemWaveformPlaySelection.Text = languageWaveform.PlaySelection; + showWaveformAndSpectrogramToolStripMenuItem.Text = languageWaveform.ShowWaveformAndSpectrogram; + showOnlyWaveformToolStripMenuItem.Text = languageWaveform.ShowWaveformOnly; + showOnlySpectrogramToolStripMenuItem.Text = languageWaveform.ShowSpectrogramOnly; + seekSilenceToolStripMenuItem.Text = languageWaveform.SeekSilence; + insertSubtitleHereToolStripMenuItem.Text = languageWaveform.InsertSubtitleHere; + guessTimeCodesToolStripMenuItem.Text = languageWaveform.GuessTimeCodes; + removeSceneChangeToolStripMenuItem.Text = languageWaveform.RemoveSceneChange; + addSceneChangeToolStripMenuItem.Text = languageWaveform.AddSceneChange; + + toolStripButtonWaveformZoomOut.ToolTipText = languageWaveform.ZoomOut; + toolStripButtonWaveformZoomIn.ToolTipText = languageWaveform.ZoomIn; + + if (Configuration.Settings.VideoControls.GenerateSpectrogram) + { + audioVisualizer.WaveformNotLoadedText = languageWaveform.ClickToAddWaveformAndSpectrogram; + } + else + { + audioVisualizer.WaveformNotLoadedText = languageWaveform.ClickToAddWaveform; + } + + // clear cached language names + DvdSubtitleLanguage.Initialize(); + } + + private void SetFormatTo(string formatName) + { + SetFormatTo(SubtitleFormat.FromName(formatName, new SubRip())); + } + + private void SetFormatTo(SubtitleFormat subtitleFormat) + { + comboBoxSubtitleFormats.SelectedIndexChanged -= ComboBoxSubtitleFormatsSelectedIndexChanged; + UiUtil.InitializeSubtitleFormatComboBox(comboBoxSubtitleFormats, subtitleFormat.FriendlyName); + comboBoxSubtitleFormats.SelectedIndexChanged += ComboBoxSubtitleFormatsSelectedIndexChanged; + } + + private int FirstSelectedIndex + { + get + { + if (SubtitleListview1.SelectedItems.Count == 0) + { + return -1; + } + + return SubtitleListview1.SelectedItems[0].Index; + } + } + + private int FirstVisibleIndex + { + get + { + if (SubtitleListview1.Items.Count == 0 || SubtitleListview1.TopItem == null) + { + return -1; + } + + return SubtitleListview1.TopItem.Index; + } + } + + private long _lastAutoSave; + + private void AutoSave(bool force = false) + { + if (!Configuration.Settings.General.AutoSave || + DateTime.UtcNow.Ticks - _lastAutoSave < 10000 * 3000 && !force) // only check for auto save evety 3 seconds + { + return; + } + + _lastAutoSave = DateTime.UtcNow.Ticks + 1009000; + var currentSubtitleHash = _subtitle.GetFastHashCode(GetCurrentEncoding().BodyName); + if (_changeSubtitleHash != currentSubtitleHash && _lastDoNotPrompt != currentSubtitleHash && _subtitle?.Paragraphs.Count > 0) + { + if (string.IsNullOrEmpty(_fileName) || _converted) + { + return; + } + + SaveSubtitle(GetCurrentSubtitleFormat(), false, true); + } + + if (!string.IsNullOrEmpty(_subtitleAlternateFileName) && Configuration.Settings.General.AllowEditOfOriginalSubtitle) + { + SaveOriginalSubtitle(GetCurrentSubtitleFormat(), true); + } + + _lastAutoSave = DateTime.UtcNow.Ticks; + } + + private bool ContinueNewOrExit() + { + AutoSave(true); + var currentSubtitleHash = _subtitle.GetFastHashCode(GetCurrentEncoding().BodyName); + if (_changeSubtitleHash != currentSubtitleHash && _lastDoNotPrompt != currentSubtitleHash && _subtitle?.Paragraphs.Count > 0) + { + string promptText = _language.SaveChangesToUntitled; + if (!string.IsNullOrEmpty(_fileName)) + { + promptText = string.Format(_language.SaveChangesToX, _fileName); + } + + var dr = MessageBox.Show(this, promptText, Title, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation); + + if (dr == DialogResult.Cancel) + { + return false; + } + + if (dr == DialogResult.Yes) + { + if (string.IsNullOrEmpty(_fileName)) + { + if (!string.IsNullOrEmpty(openFileDialog1.InitialDirectory)) + { + saveFileDialog1.InitialDirectory = openFileDialog1.InitialDirectory; + } + + saveFileDialog1.Title = _language.SaveSubtitleAs; + if (saveFileDialog1.ShowDialog(this) == DialogResult.OK) + { + openFileDialog1.InitialDirectory = saveFileDialog1.InitialDirectory; + _fileName = saveFileDialog1.FileName; + SetTitle(); + Configuration.Settings.RecentFiles.Add(_fileName, FirstVisibleIndex, FirstSelectedIndex, VideoFileName, _subtitleAlternateFileName, Configuration.Settings.General.CurrentVideoOffsetInMs); + Configuration.Settings.Save(); + } + else + { + return false; + } + } + + if (SaveSubtitle(GetCurrentSubtitleFormat()) != DialogResult.OK) + { + return false; + } + } + } + + return ContinueNewOrExitAlternate(); + } + + private bool ContinueNewOrExitAlternate() + { + if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0 && _changeAlternateSubtitleHash != _subtitleAlternate.GetFastHashCode(GetCurrentEncoding().BodyName)) + { + string promptText = _language.SaveChangesToUntitledOriginal; + if (!string.IsNullOrEmpty(_subtitleAlternateFileName)) + { + promptText = string.Format(_language.SaveChangesToOriginalX, _subtitleAlternateFileName); + } + + var dr = MessageBox.Show(this, promptText, Title, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation); + + if (dr == DialogResult.Cancel) + { + return false; + } + + if (dr == DialogResult.Yes) + { + if (string.IsNullOrEmpty(_subtitleAlternateFileName)) + { + if (!string.IsNullOrEmpty(openFileDialog1.InitialDirectory)) + { + saveFileDialog1.InitialDirectory = openFileDialog1.InitialDirectory; + } + + saveFileDialog1.Title = _language.SaveOriginalSubtitleAs; + if (saveFileDialog1.ShowDialog(this) == DialogResult.OK) + { + openFileDialog1.InitialDirectory = saveFileDialog1.InitialDirectory; + _subtitleAlternateFileName = saveFileDialog1.FileName; + } + else + { + return false; + } + } + + if (SaveOriginalSubtitle(GetCurrentSubtitleFormat()) != DialogResult.OK) + { + return false; + } + } + } + + _lastDoNotPrompt = _subtitle.GetFastHashCode(GetCurrentEncoding().BodyName); + return true; + } + + private void ExitToolStripMenuItemClick(object sender, EventArgs e) + { + ReloadFromSourceView(); + Application.Exit(); + } + + private void AboutToolStripMenuItemClick(object sender, EventArgs e) + { + ReloadFromSourceView(); + using (var about = new About()) + { + about.Initialize(); + about.ShowDialog(this); + } + } + + private void VisualSyncToolStripMenuItemClick(object sender, EventArgs e) + { + ReloadFromSourceView(); + ShowVisualSync(false); + } + + public void MakeHistoryForUndo(string description, bool resetTextUndo) + { + if (_makeHistoryPaused) + { + return; + } + + if (resetTextUndo) + { + _listViewTextUndoLast = null; + _listViewAlternateTextUndoLast = null; + } + + if (_undoIndex == -1) + { + _subtitle.HistoryItems.Clear(); + } + else + { + // remove items for redo + while (_subtitle.HistoryItems.Count > _undoIndex + 1) + { + _subtitle.HistoryItems.RemoveAt(_subtitle.HistoryItems.Count - 1); + } + } + + _subtitle.FileName = _fileName; + _subtitle.MakeHistoryForUndo(description, GetCurrentSubtitleFormat(), _fileDateTime, _subtitleAlternate, _subtitleAlternateFileName, _subtitleListViewIndex, textBoxListViewText.SelectionStart, textBoxListViewTextAlternate.SelectionStart); + _undoIndex++; + + if (_undoIndex > Subtitle.MaximumHistoryItems) + { + _undoIndex--; + } + } + + public void MakeHistoryForUndo(string description) + { + MakeHistoryForUndo(description, true); + } + + /// + /// Add undo history - but only if last entry is older than 500 ms + /// + /// Undo description + public void MakeHistoryForUndoOnlyIfNotResent(string description) + { + if (_makeHistoryPaused) + { + return; + } + + if ((DateTime.UtcNow.Ticks - _lastHistoryTicks) > 10000 * 500) // only if last change was longer ago than 500 milliseconds + { + MakeHistoryForUndo(description); + _lastHistoryTicks = DateTime.UtcNow.Ticks; + } + } + + private bool IsSubtitleLoaded + { + get { return _subtitle != null && (_subtitle.Paragraphs.Count > 1 || (_subtitle.Paragraphs.Count == 1 && !string.IsNullOrWhiteSpace(_subtitle.Paragraphs[0].Text))); } + } + + private void ShowVisualSync(bool onlySelectedLines) + { + if (!IsSubtitleLoaded) + { + DisplaySubtitleNotLoadedMessage(); + return; + } + + using (var visualSync = new VisualSync()) + { + visualSync.VideoFileName = VideoFileName; + visualSync.AudioTrackNumber = VideoAudioTrackNumber; + + SaveSubtitleListviewIndices(); + if (onlySelectedLines) + { + var selectedLines = new Subtitle(); + Subtitle selectedLinesAlternate = null; + if (_subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) + { + selectedLinesAlternate = new Subtitle(); + } + + foreach (int index in SubtitleListview1.SelectedIndices) + { + var p = _subtitle.Paragraphs[index]; + selectedLines.Paragraphs.Add(p); + if (selectedLinesAlternate != null) + { + var original = Utilities.GetOriginalParagraph(index, p, _subtitleAlternate.Paragraphs); + if (original != null) + { + selectedLinesAlternate.Paragraphs.Add(original); + } + } + } + + visualSync.Initialize(toolStripButtonVisualSync.Image as Bitmap, selectedLines, selectedLinesAlternate, _fileName, _language.VisualSyncSelectedLines, CurrentFrameRate); + } + else + { + visualSync.Initialize(toolStripButtonVisualSync.Image as Bitmap, _subtitle, _subtitleAlternate, _fileName, _language.VisualSyncTitle, CurrentFrameRate); + } + + _endSeconds = -1; + mediaPlayer.Pause(); + if (visualSync.ShowDialog(this) == DialogResult.OK) + { + MakeHistoryForUndo(_language.BeforeVisualSync); + + if (onlySelectedLines) + { // we only update selected lines + int i = 0; + foreach (int index in SubtitleListview1.SelectedIndices) + { + _subtitle.Paragraphs[index] = visualSync.Paragraphs[i]; + i++; + } + + ShowStatus(_language.VisualSyncPerformedOnSelectedLines); + } + else + { + _subtitle.Paragraphs.Clear(); + foreach (var p in visualSync.Paragraphs) + { + _subtitle.Paragraphs.Add(new Paragraph(p)); + } + + if (_subtitleAlternate != null && visualSync.ParagraphsAlternate != null) + { + _subtitleAlternate.Paragraphs.Clear(); + foreach (var p in visualSync.ParagraphsAlternate) + { + _subtitleAlternate.Paragraphs.Add(new Paragraph(p)); + } + } + + ShowStatus(_language.VisualSyncPerformed); + } + + if (visualSync.FrameRateChanged) + { + toolStripComboBoxFrameRate.Text = string.Format("{0:0.###}", visualSync.FrameRate); + } + + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + if (onlySelectedLines && SubtitleListview1.SelectedItems.Count > 0) + { + SubtitleListview1.EnsureVisible(SubtitleListview1.SelectedItems[SubtitleListview1.SelectedItems.Count - 1].Index); + } + } + + VideoFileName = visualSync.VideoFileName; + } + } + + private void OpenToolStripMenuItemClick(object sender, EventArgs e) + { + openToolStripMenuItem.Enabled = false; + ReloadFromSourceView(); + OpenNewFile(); + openToolStripMenuItem.Enabled = true; + } + + private void OpenNewFile() + { + if (_openFileDialogOn) + { + return; + } + + _openFileDialogOn = true; + _lastDoNotPrompt = -1; + if (!ContinueNewOrExit()) + { + _openFileDialogOn = false; + return; + } + + openFileDialog1.Title = _languageGeneral.OpenSubtitle; + openFileDialog1.FileName = string.Empty; + openFileDialog1.Filter = UiUtil.SubtitleExtensionFilter.Value; + if (openFileDialog1.ShowDialog(this) == DialogResult.OK) + { + RemoveAlternate(true, false); + + // try to open via recent files + if (OpenFromRecentFiles(openFileDialog1.FileName)) + { + return; + } + + OpenSubtitle(openFileDialog1.FileName, null); + } + + _openFileDialogOn = false; + } + + private bool OpenFromRecentFiles(string fileName) + { + var rfe = Configuration.Settings.RecentFiles.Files.FirstOrDefault(p => !string.IsNullOrEmpty(p.FileName) && p.FileName.Equals(fileName, StringComparison.OrdinalIgnoreCase)); + if (rfe != null) + { + OpenRecentFile(rfe); + GotoSubPosAndPause(); + SubtitleListview1.EndUpdate(); + SetRecentIndices(rfe); + if (!string.IsNullOrEmpty(rfe.VideoFileName)) + { + var p = _subtitle.GetParagraphOrDefault(rfe.FirstSelectedIndex); + if (p != null) + { + mediaPlayer.CurrentPosition = p.StartTime.TotalSeconds; + } + } + + _openFileDialogOn = false; + return true; + } + + return false; + } + + public double CurrentFrameRate + { + get + { + if (double.TryParse(toolStripComboBoxFrameRate.Text, out var f)) + { + return f; + } + + return Configuration.Settings.General.DefaultFrameRate; + } + } + + private void OpenSubtitle(string fileName, Encoding encoding) + { + OpenSubtitle(fileName, encoding, null, null); + } + + private void ResetHistory() + { + _undoIndex = -1; + _subtitle.HistoryItems.Clear(); + } + + private void OpenSubtitle(string fileName, Encoding encoding, string videoFileName, string originalFileName) + { + OpenSubtitle(fileName, encoding, videoFileName, originalFileName, false); + } + + private void OpenSubtitle(string fileName, Encoding encoding, string videoFileName, string originalFileName, bool updateRecentFile) + { + if (!File.Exists(fileName)) + { + MessageBox.Show(string.Format(_language.FileNotFound, fileName)); + return; + } + + _lastAutoSave = DateTime.UtcNow.Ticks; + bool videoFileLoaded = false; + var file = new FileInfo(fileName); + var ext = file.Extension.ToLowerInvariant(); + + // save last first visible index + first selected index from listview + if (_fileName != null && updateRecentFile) + { + Configuration.Settings.RecentFiles.Add(_fileName, FirstVisibleIndex, FirstSelectedIndex, VideoFileName, _subtitleAlternateFileName, Configuration.Settings.General.CurrentVideoOffsetInMs); + } + Configuration.Settings.General.CurrentVideoOffsetInMs = 0; + + openFileDialog1.InitialDirectory = file.DirectoryName; + + + if (ext == ".idx") + { + var subFileName = fileName.Substring(0, fileName.Length - 3) + "sub"; + if (File.Exists(subFileName) && FileUtil.IsVobSub(subFileName)) + { + ext = ".sub"; + fileName = subFileName; + } + } + + if (ext == ".sub" && IsVobSubFile(fileName, false)) + { + ImportAndOcrVobSubSubtitleNew(fileName, _loading); + return; + } + + if (ext == ".sup") + { + if (FileUtil.IsBluRaySup(fileName)) + { + ImportAndOcrBluRaySup(fileName, _loading); + return; + } + + if (FileUtil.IsSpDvdSup(fileName)) + { + ImportAndOcrSpDvdSup(fileName, _loading); + return; + } + } + + if (ext == ".mkv" || ext == ".mks") + { + ImportSubtitleFromMatroskaFile(fileName); + return; + } + + if (ext == ".divx" || ext == ".avi") + { + if (ImportSubtitleFromDivX(fileName)) + { + return; + } + } + + if ((ext == ".ts" || ext == ".rec" || ext == ".mpeg" || ext == ".mpg") && file.Length > 10000 && FileUtil.IsTransportStream(fileName)) + { + ImportSubtitleFromTransportStream(fileName); + return; + } + + if (((ext == ".m2ts" || ext == ".ts" || ext == ".mts") && file.Length > 10000 && FileUtil.IsM2TransportStream(fileName)) || + (ext == ".textst" && FileUtil.IsMpeg2PrivateStream2(fileName))) + { + bool isTextSt = false; + if (file.Length < 2000000) + { + var textSt = new TextST(); + isTextSt = textSt.IsMine(null, fileName); + } + + if (!isTextSt) + { + ImportSubtitleFromTransportStream(fileName); + return; + } + } + + if ((ext == ".mp4" || ext == ".m4v" || ext == ".3gp") && file.Length > 10000) + { + if (!new IsmtDfxp().IsMine(null, fileName)) + { + if (ImportSubtitleFromMp4(fileName) && !Configuration.Settings.General.DisableVideoAutoLoading) + { + OpenVideo(fileName); + } + + return; + } + } + + if (ext == ".mxf" && FileUtil.IsMaterialExchangeFormat(fileName)) + { + var parser = new MxfParser(fileName); + if (parser.IsValid) + { + var subtitles = parser.GetSubtitles(); + if (subtitles.Count > 0) + { + SetEncoding(Configuration.Settings.General.DefaultEncoding); + var list = new List(subtitles[0].SplitToLines()); + _subtitle = new Subtitle(); + var mxfFormat = _subtitle.ReloadLoadSubtitle(list, null, null); + SetCurrentFormat(mxfFormat); + _fileName = Utilities.GetPathAndFileNameWithoutExtension(fileName) + GetCurrentSubtitleFormat().Extension; + SetTitle(); + ShowStatus(string.Format(_language.LoadedSubtitleX, _fileName)); + _sourceViewChange = false; + _changeSubtitleHash = _subtitle.GetFastHashCode(GetCurrentEncoding().BodyName); + ResetHistory(); + SetUndockedWindowsTitle(); + _converted = true; + ShowStatus(string.Format(_language.LoadedSubtitleX, _fileName) + " - " + string.Format(_language.ConvertedToX, mxfFormat.FriendlyName)); + + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + _subtitleListViewIndex = -1; + SubtitleListview1.FirstVisibleIndex = -1; + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + + return; + } + + MessageBox.Show("No subtitles found!"); + return; + } + } + + if (ext == ".prproj") + { + var f = new AdobePremierePrProj(); + var tempFileName = AdobePremierePrProj.LoadFromZipFile(fileName); + if (!string.IsNullOrEmpty(fileName)) + { + var list = new List(File.ReadAllLines(tempFileName, LanguageAutoDetect.GetEncodingFromFile(tempFileName))); + try + { + File.Delete(tempFileName); + } + catch + { + // ignored + } + if (f.IsMine(list, tempFileName)) + { + f.LoadSubtitle(_subtitle, list, fileName); + SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); + SetEncoding(Configuration.Settings.General.DefaultEncoding); + encoding = GetCurrentEncoding(); + SubtitleListview1.Fill(_subtitle); + _subtitleListViewIndex = -1; + SubtitleListview1.FirstVisibleIndex = -1; + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + _fileName = Utilities.GetPathAndFileNameWithoutExtension(fileName) + GetCurrentSubtitleFormat().Extension; + SetTitle(); + ShowStatus(string.Format(_language.LoadedSubtitleX, _fileName)); + _converted = true; + return; + } + } + } + + if (file.Length > Subtitle.MaxFileSize) + { + // retry Blu-ray sup (file with wrong extension) + if (FileUtil.IsBluRaySup(fileName)) + { + ImportAndOcrBluRaySup(fileName, _loading); + return; + } + + // retry vobsub (file with wrong extension) + if (IsVobSubFile(fileName, false)) + { + ImportAndOcrVobSubSubtitleNew(fileName, _loading); + return; + } + + var text = string.Format(_language.FileXIsLargerThan10MB + Environment.NewLine + Environment.NewLine + _language.ContinueAnyway, fileName); + if (MessageBox.Show(this, text, Title, MessageBoxButtons.YesNoCancel) != DialogResult.Yes) + { + return; + } + } + + var tempSubtitle = new Subtitle(_subtitle, false); + if (_subtitle.HistoryItems.Count > 0 || _subtitle.Paragraphs.Count > 0) + { + MakeHistoryForUndo(string.Format(_language.BeforeLoadOf, Path.GetFileName(fileName))); + } + + var subtitleHash = _subtitle.GetFastHashCode(GetCurrentEncoding().BodyName); + bool hasChanged = (_changeSubtitleHash != subtitleHash) && (_lastDoNotPrompt != subtitleHash); + + SubtitleFormat format = _subtitle.LoadSubtitle(fileName, out encoding, encoding); + if (format == null) + { + _subtitle = tempSubtitle; + } + + if (!hasChanged) + { + _changeSubtitleHash = _subtitle.GetFastHashCode(GetCurrentEncoding().BodyName); + } + + ShowHideTextBasedFeatures(format); + + bool justConverted = false; + + if (ext == ".m2ts" || ext == ".textst") + { + var textST = new TextST(); + if (textST.IsMine(null, fileName)) + { + textST.LoadSubtitle(_subtitle, null, fileName); + _oldSubtitleFormat = textST; + SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); + SetEncoding(Configuration.Settings.General.DefaultEncoding); + encoding = GetCurrentEncoding(); + justConverted = true; + format = GetCurrentSubtitleFormat(); + } + } + + var encodingFromFile = encoding; + if (format == null) + { + encodingFromFile = LanguageAutoDetect.GetEncodingFromFile(fileName); + } + + if (format == null) + { + var f = new TimeCodesOnly1(); + var list = new List(File.ReadAllLines(fileName, encodingFromFile)); + if (f.IsMine(list, fileName)) + { + f.LoadSubtitle(_subtitle, list, fileName); + _oldSubtitleFormat = f; + SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); + SetEncoding(Configuration.Settings.General.DefaultEncoding); + encoding = GetCurrentEncoding(); + justConverted = true; + format = GetCurrentSubtitleFormat(); + } + } + + if (format == null) + { + var f = new TimeCodesOnly2(); + var list = new List(File.ReadAllLines(fileName, encodingFromFile)); + if (f.IsMine(list, fileName)) + { + f.LoadSubtitle(_subtitle, list, fileName); + _oldSubtitleFormat = f; + SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); + SetEncoding(Configuration.Settings.General.DefaultEncoding); + encoding = GetCurrentEncoding(); + justConverted = true; + format = GetCurrentSubtitleFormat(); + } + } + + if (format == null) + { + try + { + var bdnXml = new BdnXml(); + var list = new List(File.ReadAllLines(fileName, encodingFromFile)); + if (bdnXml.IsMine(list, fileName)) + { + if (ContinueNewOrExit()) + { + ImportAndOcrBdnXml(fileName, bdnXml, list); + } + + return; + } + } + catch + { + // ignore + } + } + + if (format == null) + { + try + { + var fcpImage = new FinalCutProImage(); + var list = new List(File.ReadAllLines(fileName, encodingFromFile)); + if (fcpImage.IsMine(list, fileName)) + { + if (ContinueNewOrExit()) + { + ImportAndOcrDost(fileName, fcpImage, list); + } + + return; + } + } + catch + { + // ignore + } + } + + if (format == null) + { + try + { + var f = new DvdStudioProSpaceGraphic(); + var list = new List(File.ReadAllLines(fileName, encodingFromFile)); + if (f.IsMine(list, fileName)) + { + if (ContinueNewOrExit()) + { + ImportAndOcrDost(fileName, f, list); + } + + return; + } + } + catch + { + // ignore + } + } + + if (format == null) + { + try + { + var imageFormat = new SpuImage(); + var list = new List(File.ReadAllLines(fileName, encodingFromFile)); + if (imageFormat.IsMine(list, fileName)) + { + if (ContinueNewOrExit()) + { + ImportAndOcrDost(fileName, imageFormat, list); + } + + return; + } + } + catch + { + format = null; + } + } + + if (format == null) + { + var arib = new AribB36(); + if (arib.IsMine(null, fileName)) + { + arib.LoadSubtitle(_subtitle, null, fileName); + _oldSubtitleFormat = arib; + SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); + SetEncoding(Configuration.Settings.General.DefaultEncoding); + encoding = GetCurrentEncoding(); + justConverted = true; + format = GetCurrentSubtitleFormat(); + } + } + + if (ext == ".dost") + { + try + { + var dost = new Dost(); + var list = new List(File.ReadAllLines(fileName, encodingFromFile)); + if (dost.IsMine(list, fileName)) + { + if (ContinueNewOrExit()) + { + ImportAndOcrDost(fileName, dost, list); + } + + return; + } + } + catch + { + format = null; + } + } + + if (format == null) + { + try + { + var timedtextImage = new TimedTextImage(); + var list = new List(File.ReadAllLines(fileName, encodingFromFile)); + if (timedtextImage.IsMine(list, fileName)) + { + if (ContinueNewOrExit()) + { + ImportAndOcrDost(fileName, timedtextImage, list); + } + + return; + } + } + catch + { + format = null; + } + } + + if (format == null) + { + try + { + var seImageHtmlIndex = new SeImageHtmlIndex(); + var list = new List(File.ReadAllLines(fileName, encodingFromFile)); + if (seImageHtmlIndex.IsMine(list, fileName)) + { + if (ContinueNewOrExit()) + { + ImportAndOcrDost(fileName, seImageHtmlIndex, list); + } + + return; + } + } + catch + { + format = null; + } + } + + if (format == null || format.Name == Scenarist.NameOfFormat) + { + try + { + var son = new Son(); + var list = new List(File.ReadAllLines(fileName, encodingFromFile)); + if (son.IsMine(list, fileName)) + { + if (ContinueNewOrExit()) + { + ImportAndOcrSon(fileName, son, list); + } + + return; + } + } + catch + { + format = null; + } + } + + if (format == null || format.Name == SubRip.NameOfFormat) + { + if (_subtitle.Paragraphs.Count > 1) + { + int imageCount = 0; + foreach (var p in _subtitle.Paragraphs) + { + string s = p.Text.ToLowerInvariant(); + if (s.EndsWith(".bmp", StringComparison.Ordinal) || s.EndsWith(".png", StringComparison.Ordinal) || s.EndsWith(".jpg", StringComparison.Ordinal) || s.EndsWith(".tif", StringComparison.Ordinal)) + { + imageCount++; + } + } + + if (imageCount > 2 && imageCount >= _subtitle.Paragraphs.Count - 2) + { + if (ContinueNewOrExit()) + { + ImportAndOcrSrt(_subtitle); + } + + return; + } + } + } + + if (format == null) + { + try + { + var satBoxPng = new SatBoxPng(); + var list = new List(File.ReadAllLines(fileName, encodingFromFile)); + if (satBoxPng.IsMine(list, fileName)) + { + var subtitle = new Subtitle(); + satBoxPng.LoadSubtitle(subtitle, list, fileName); + if (ContinueNewOrExit()) + { + ImportAndOcrSrt(subtitle); + } + + return; + } + } + catch + { + format = null; + } + } + + if (format == null || format.Name == Scenarist.NameOfFormat) + { + try + { + var sst = new SonicScenaristBitmaps(); + var list = new List(File.ReadAllLines(fileName, encodingFromFile)); + if (sst.IsMine(list, fileName)) + { + if (ContinueNewOrExit()) + { + ImportAndOcrSst(fileName, sst, list); + } + + return; + } + } + catch + { + format = null; + } + } + + if (format == null) + { + try + { + var htmlSamiArray = new HtmlSamiArray(); + var list = new List(File.ReadAllLines(fileName, encodingFromFile)); + if (htmlSamiArray.IsMine(list, fileName)) + { + htmlSamiArray.LoadSubtitle(_subtitle, list, fileName); + _oldSubtitleFormat = htmlSamiArray; + SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); + SetEncoding(Configuration.Settings.General.DefaultEncoding); + encoding = GetCurrentEncoding(); + justConverted = true; + format = GetCurrentSubtitleFormat(); + } + } + catch + { + format = null; + } + } + + if (format == null) + { + foreach (var f in SubtitleFormat.GetBinaryFormats(false)) + { + if (f.IsMine(null, fileName)) + { + f.LoadSubtitle(_subtitle, null, fileName); + _oldSubtitleFormat = f; + SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); + SetEncoding(Configuration.Settings.General.DefaultEncoding); + encoding = GetCurrentEncoding(); + justConverted = true; + format = GetCurrentSubtitleFormat(); + break; + } + } + } + + if (format == null) + { + var lines = FileUtil.ReadAllTextShared(fileName, encodingFromFile).SplitToLines(); + foreach (var f in SubtitleFormat.GetTextOtherFormats()) + { + if (f.IsMine(lines, fileName)) + { + f.LoadSubtitle(_subtitle, lines, fileName); + _oldSubtitleFormat = f; + SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); + SetEncoding(Configuration.Settings.General.DefaultEncoding); + encoding = GetCurrentEncoding(); + justConverted = true; + format = GetCurrentSubtitleFormat(); + break; + } + } + } + + if (format == null && ext == ".cdg" && file.Length < 50_000_000) + { + using (var importCdg = new ImportCdg(fileName)) + { + importCdg.ShowDialog(this); + return; + } + } + + // retry vobsub (file with wrong extension) + if (format == null && file.Length > 500 && IsVobSubFile(fileName, false)) + { + ImportAndOcrVobSubSubtitleNew(fileName, _loading); + return; + } + + // retry Blu-ray (file with wrong extension) + if (format == null && file.Length > 500 && FileUtil.IsBluRaySup(fileName)) + { + ImportAndOcrBluRaySup(fileName, _loading); + return; + } + + // retry SP DVD (file with wrong extension) + if (format == null && file.Length > 500 && FileUtil.IsSpDvdSup(fileName)) + { + ImportAndOcrSpDvdSup(fileName, _loading); + return; + } + + // retry Matroska (file with wrong extension) + if (format == null && !string.IsNullOrWhiteSpace(fileName)) + { + using (var matroska = new MatroskaFile(fileName)) + { + if (matroska.IsValid) + { + var subtitleList = matroska.GetTracks(true); + if (subtitleList.Count > 0) + { + ImportSubtitleFromMatroskaFile(fileName); + return; + } + } + } + } + + // check for idx file + if (format == null && file.Length > 100 && ext == ".idx") + { + MessageBox.Show(_language.ErrorLoadIdx); + return; + } + + // check for .rar file + if (format == null && file.Length > 100 && FileUtil.IsRar(fileName)) + { + MessageBox.Show(_language.ErrorLoadRar); + return; + } + + // check for .zip file + if (format == null && file.Length > 100 && FileUtil.IsZip(fileName)) + { + MessageBox.Show(_language.ErrorLoadZip); + return; + } + + // check for .7z file + if (format == null && file.Length > 100 && FileUtil.Is7Zip(fileName)) + { + MessageBox.Show(_language.ErrorLoad7Zip); + return; + } + + // check for .png file + if (format == null && file.Length > 100 && FileUtil.IsPng(fileName)) + { + MessageBox.Show(_language.ErrorLoadPng); + return; + } + + // check for .jpg file + if (format == null && file.Length > 100 && FileUtil.IsJpg(fileName)) + { + MessageBox.Show(_language.ErrorLoadJpg); + return; + } + + // check for .srr file + if (format == null && file.Length > 100 && ext == ".srr" && FileUtil.IsSrr(fileName)) + { + MessageBox.Show(_language.ErrorLoadSrr); + return; + } + + // check for Torrent file + if (format == null && file.Length > 50 && FileUtil.IsTorrentFile(fileName)) + { + MessageBox.Show(_language.ErrorLoadTorrent); + return; + } + + // check for all binary zeroes (I've heard about this a few times... perhaps related to crashes?) + if (format == null && file.Length > 50 && FileUtil.IsSubtitleFileAllBinaryZeroes(fileName)) + { + MessageBox.Show(_language.ErrorLoadBinaryZeroes); + return; + } + + if (format == null && file.Length < 100 * 1000000 && TransportStreamParser.IsDvbSup(fileName)) + { + ImportSubtitleFromDvbSupFile(fileName); + return; + } + + if (format == null && file.Length < 1000000) + { + // check for valid timed text + if (ext == ".xml" || ext == ".dfxp") + { + var sb = new StringBuilder(); + foreach (var line in File.ReadAllLines(fileName, encodingFromFile)) + { + sb.AppendLine(line); + } + + var xmlAsString = sb.ToString().Trim(); + + if (xmlAsString.Contains("http://www.w3.org/ns/ttml") && xmlAsString.Contains(" 1) + { + _subtitle = genericParseSubtitle; + SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); + SetEncoding(Configuration.Settings.General.DefaultEncoding); + encoding = GetCurrentEncoding(); + justConverted = true; + format = GetCurrentSubtitleFormat(); + ShowStatus("Guessed subtitle format via generic subtitle parser!"); + } + } + catch + { + } + } + + if (format == null && file.Length < 1_000_000 && (FileUtil.IsPlainText(fileName) || new Tx3GTextOnly().IsMine(null, fileName))) + { + ImportPlainText(fileName); + return; + } + + if (format == null) + { + var fd = new FinalDraftTemplate2(); + var list = new List(File.ReadAllLines(fileName, encodingFromFile)); + if (fd.IsMine(list, fileName)) + { + ImportPlainText(fileName); + return; + } + } + + _fileDateTime = File.GetLastWriteTime(fileName); + + if (format != null) + { + RemoveAlternate(true, false); + SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.Extra); + + new BookmarkPersistence(_subtitle, fileName).Load(); + + if (Configuration.Settings.General.RemoveBlankLinesWhenOpening) + { + _subtitle.RemoveEmptyLines(); + } + + if (Configuration.Settings.General.RemoveBadCharsWhenOpening) + { + foreach (var p in _subtitle.Paragraphs) + { + // Replace U+0456 (CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I) by U+0069 (LATIN SMALL LETTER I) + p.Text = p.Text.Replace("<і>", "").Replace("", ""); + + // remove control characters (e.g. binary zero) + p.Text = p.Text.RemoveControlCharactersButWhiteSpace(); + } + } + + _subtitleListViewIndex = -1; + Configuration.Settings.General.CurrentVideoOffsetInMs = 0; + + var oldSaveFormat = Configuration.Settings.General.LastSaveAsFormat; + SetCurrentFormat(format); + Configuration.Settings.General.LastSaveAsFormat = oldSaveFormat; + + _subtitleAlternateFileName = null; + if (LoadAlternateSubtitleFile(originalFileName)) + { + _subtitleAlternateFileName = originalFileName; + } + + // Seungki begin + _splitDualSami = false; + if (Configuration.Settings.SubtitleSettings.SamiDisplayTwoClassesAsTwoSubtitles && format.GetType() == typeof(Sami) && Sami.GetStylesFromHeader(_subtitle.Header).Count == 2) + { + var classes = Sami.GetStylesFromHeader(_subtitle.Header); + var s1 = new Subtitle(_subtitle); + var s2 = new Subtitle(_subtitle); + s1.Paragraphs.Clear(); + s2.Paragraphs.Clear(); + foreach (var p in _subtitle.Paragraphs) + { + if (p.Extra != null && p.Extra.Equals(classes[0], StringComparison.OrdinalIgnoreCase)) + { + s1.Paragraphs.Add(p); + } + else + { + s2.Paragraphs.Add(p); + } + } + + if (s1.Paragraphs.Count == 0 || s2.Paragraphs.Count == 0) + { + return; + } + + _subtitle = s1; + _subtitleAlternate = s2; + _subtitleAlternateFileName = _fileName; + SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.Extra); + SubtitleListview1.ShowAlternateTextColumn(classes[1]); + _splitDualSami = true; + } + // Seungki end + + textBoxSource.Text = _subtitle.ToText(format); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + if (SubtitleListview1.Items.Count > 0) + { + SubtitleListview1.Items[0].Selected = true; + SubtitleListview1.Items[0].Focused = true; + } + textBoxListViewText.BackColor = SystemColors.WindowFrame; + textBoxListViewTextAlternate.BackColor = SystemColors.WindowFrame; + + _findHelper = null; + _spellCheckForm = null; + + if (_resetVideo && ModifierKeys != Keys.Shift) + { + VideoFileName = null; + _videoInfo = null; + VideoAudioTrackNumber = -1; + labelVideoInfo.Text = _languageGeneral.NoVideoLoaded; + audioVisualizer.WavePeaks = null; + audioVisualizer.SetSpectrogram(null); + audioVisualizer.SceneChanges = new List(); + audioVisualizer.Chapters = new List(); + } + + if (Configuration.Settings.General.ShowVideoPlayer || Configuration.Settings.General.ShowAudioVisualizer) + { + if (!Configuration.Settings.General.DisableVideoAutoLoading) + { + if (!string.IsNullOrEmpty(videoFileName) && File.Exists(videoFileName)) + { + OpenVideo(videoFileName); + } + else if (!string.IsNullOrEmpty(fileName) && (toolStripButtonToggleVideo.Checked || toolStripButtonToggleWaveform.Checked)) + { + TryToFindAndOpenVideoFile(Utilities.GetPathAndFileNameWithoutExtension(fileName)); + } + + if (VideoFileName == null) + { + CloseVideoToolStripMenuItemClick(this, null); + } + } + } + + videoFileLoaded = VideoFileName != null; + + Configuration.Settings.RecentFiles.Add(fileName, videoFileName, originalFileName); + UpdateRecentFilesUI(); + + _fileName = fileName; + SetTitle(); + ShowStatus(string.Format(_language.LoadedSubtitleX, _fileName)); + _sourceViewChange = false; + + if (Configuration.Settings.General.AutoConvertToUtf8) + { + if (Configuration.Settings.General.DefaultEncoding == TextEncoding.Utf8WithoutBom) + { + SetEncoding(TextEncoding.Utf8WithoutBom); + } + else + { + SetEncoding(TextEncoding.Utf8WithBom); + } + } + else if (encoding == Encoding.UTF8) + { + if (File.Exists(_fileName) && FileUtil.HasUtf8Bom(fileName)) + { + SetEncoding(TextEncoding.Utf8WithBom); + } + else + { + SetEncoding(TextEncoding.Utf8WithoutBom); + } + } + else + { + SetEncoding(encoding); + } + + _changeSubtitleHash = _subtitle.GetFastHashCode(GetCurrentEncoding().BodyName); + _converted = false; + ResetHistory(); + SetListViewStateImages(); + SetUndockedWindowsTitle(); + + if (justConverted) + { + _converted = true; + ShowStatus(string.Format(_language.LoadedSubtitleX, _fileName) + " - " + string.Format(_language.ConvertedToX, format.FriendlyName)); + } + + var formatType = format.GetType(); + if (formatType == typeof(SubStationAlpha)) + { + string errors = AdvancedSubStationAlpha.CheckForErrors(_subtitle.Header); + if (!string.IsNullOrEmpty(errors)) + { + MessageBox.Show(this, errors, Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + + errors = (format as SubStationAlpha).Errors; + if (!string.IsNullOrEmpty(errors)) + { + MessageBox.Show(this, errors, Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + } + else if (formatType == typeof(AdvancedSubStationAlpha)) + { + string errors = AdvancedSubStationAlpha.CheckForErrors(_subtitle.Header); + if (!string.IsNullOrEmpty(errors)) + { + MessageBox.Show(this, errors, Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + + errors = (format as AdvancedSubStationAlpha).Errors; + if (!string.IsNullOrEmpty(errors)) + { + MessageBox.Show(this, errors, Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + } + else if (formatType == typeof(SubRip)) + { + string errors = (format as SubRip).Errors; + if (!string.IsNullOrEmpty(errors)) + { + MessageBox.Show(this, errors, Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + } + else if (formatType == typeof(MicroDvd)) + { + string errors = (format as MicroDvd).Errors; + if (!string.IsNullOrEmpty(errors)) + { + MessageBox.Show(this, errors, Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + } + else if (formatType == typeof(DCinemaSmpte2007)) + { + format.ToText(_subtitle, string.Empty); + string errors = (format as DCinemaSmpte2007).Errors; + if (!string.IsNullOrEmpty(errors)) + { + MessageBox.Show(errors, Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + } + else if (formatType == typeof(DCinemaSmpte2010)) + { + format.ToText(_subtitle, string.Empty); + string errors = (format as DCinemaSmpte2010).Errors; + if (!string.IsNullOrEmpty(errors)) + { + MessageBox.Show(errors, Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + } + else if (formatType == typeof(DCinemaSmpte2014)) + { + format.ToText(_subtitle, string.Empty); + string errors = (format as DCinemaSmpte2014).Errors; + if (!string.IsNullOrEmpty(errors)) + { + MessageBox.Show(errors, Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + } + else if (formatType == typeof(CsvNuendo)) + { + if (_subtitle.Paragraphs.Any(p => !string.IsNullOrEmpty(p.Actor))) + { + bool wasVisible = SubtitleListview1.ColumnIndexActor >= 0; + SubtitleListview1.ShowActorColumn(Configuration.Settings.Language.General.Character); + if (!wasVisible) + { + SaveSubtitleListviewIndices(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + } + } + } + } + else + { + if (file.Length < 50) + { + _findHelper = null; + _spellCheckForm = null; + VideoFileName = null; + _videoInfo = null; + VideoAudioTrackNumber = -1; + labelVideoInfo.Text = _languageGeneral.NoVideoLoaded; + audioVisualizer.WavePeaks = null; + audioVisualizer.SetSpectrogram(null); + audioVisualizer.SceneChanges = new List(); + audioVisualizer.Chapters = new List(); + + Configuration.Settings.RecentFiles.Add(fileName, FirstVisibleIndex, FirstSelectedIndex, VideoFileName, _subtitleAlternateFileName, Configuration.Settings.General.CurrentVideoOffsetInMs); + Configuration.Settings.Save(); + UpdateRecentFilesUI(); + _fileName = fileName; + SetTitle(); + ShowStatus(string.Format(_language.LoadedEmptyOrShort, _fileName)); + _sourceViewChange = false; + _converted = false; + + MessageBox.Show(_language.FileIsEmptyOrShort); + } + else + { + if (ShowUnknownSubtitle(fileName, true)) + { + ImportPlainText(fileName); + } + + return; + } + } + + if (!videoFileLoaded && mediaPlayer.VideoPlayer != null) + { + mediaPlayer.PauseAndDisposePlayer(); + timer1.Stop(); + } + + ResetShowEarlierOrLater(); + FixRightToLeftDependingOnLanguage(); + } + + private void ShowHideTextBasedFeatures(SubtitleFormat format) + { + textBoxSource.Enabled = format?.IsTextBased == true; + } + + private void SetUndockedWindowsTitle() + { + string title = _languageGeneral.NoVideoLoaded; + if (!string.IsNullOrEmpty(VideoFileName)) + { + title = Path.GetFileNameWithoutExtension(VideoFileName); + } + + if (_videoControlsUndocked != null && !_videoControlsUndocked.IsDisposed) + { + _videoControlsUndocked.Text = string.Format(_languageGeneral.ControlsWindowTitle, title); + } + + if (_videoPlayerUndocked != null && !_videoPlayerUndocked.IsDisposed) + { + _videoPlayerUndocked.Text = string.Format(_languageGeneral.VideoWindowTitle, title); + } + + if (_waveformUndocked != null && !_waveformUndocked.IsDisposed) + { + _waveformUndocked.Text = string.Format(_languageGeneral.AudioWindowTitle, title); + } + } + + private void ImportAndOcrBdnXml(string fileName, BdnXml bdnXml, List list) + { + using (var formSubOcr = new VobSubOcr()) + { + var bdnSubtitle = new Subtitle(); + bdnXml.LoadSubtitle(bdnSubtitle, list, fileName); + bdnSubtitle.FileName = fileName; + formSubOcr.Initialize(bdnSubtitle, Configuration.Settings.VobSubOcr, false); + if (formSubOcr.ShowDialog(this) == DialogResult.OK) + { + MakeHistoryForUndo(_language.BeforeImportingBdnXml); + FileNew(); + _subtitle.Paragraphs.Clear(); + SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); + foreach (var p in formSubOcr.SubtitleFromOcr.Paragraphs) + { + _subtitle.Paragraphs.Add(p); + } + + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + _subtitleListViewIndex = -1; + SubtitleListview1.FirstVisibleIndex = -1; + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + + _fileName = Path.ChangeExtension(formSubOcr.FileName, GetCurrentSubtitleFormat().Extension); + SetTitle(); + _converted = true; + } + } + } + + private void ImportAndOcrSon(string fileName, Son format, List list) + { + using (var formSubOcr = new VobSubOcr()) + { + var sub = new Subtitle(); + format.LoadSubtitle(sub, list, fileName); + sub.FileName = fileName; + formSubOcr.Initialize(sub, Configuration.Settings.VobSubOcr, true); + if (formSubOcr.ShowDialog(this) == DialogResult.OK) + { + MakeHistoryForUndo(_language.BeforeImportingBdnXml); + FileNew(); + _subtitle.Paragraphs.Clear(); + SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); + foreach (var p in formSubOcr.SubtitleFromOcr.Paragraphs) + { + _subtitle.Paragraphs.Add(p); + } + + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + _subtitleListViewIndex = -1; + SubtitleListview1.FirstVisibleIndex = -1; + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + + _fileName = Path.ChangeExtension(formSubOcr.FileName, GetCurrentSubtitleFormat().Extension); + SetTitle(); + _converted = true; + } + } + } + + private void ImportAndOcrDost(string fileName, SubtitleFormat format, List list) + { + using (var formSubOcr = new VobSubOcr()) + { + var sub = new Subtitle(); + format.LoadSubtitle(sub, list, fileName); + sub.FileName = fileName; + formSubOcr.Initialize(sub, Configuration.Settings.VobSubOcr, false); + if (formSubOcr.ShowDialog(this) == DialogResult.OK) + { + MakeHistoryForUndo(_language.BeforeImportingBdnXml); + FileNew(); + _subtitle.Paragraphs.Clear(); + SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); + foreach (var p in formSubOcr.SubtitleFromOcr.Paragraphs) + { + _subtitle.Paragraphs.Add(p); + } + + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + _subtitleListViewIndex = -1; + SubtitleListview1.FirstVisibleIndex = -1; + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + + _fileName = Path.ChangeExtension(formSubOcr.FileName, GetCurrentSubtitleFormat().Extension); + SetTitle(); + _converted = true; + } + } + } + + private void ImportAndOcrSst(string fileName, SonicScenaristBitmaps format, List list) + { + using (var formSubOcr = new VobSubOcr()) + { + var sub = new Subtitle(); + format.LoadSubtitle(sub, list, fileName); + sub.FileName = fileName; + formSubOcr.Initialize(sub, Configuration.Settings.VobSubOcr, true); + if (formSubOcr.ShowDialog(this) == DialogResult.OK) + { + MakeHistoryForUndo(_language.BeforeImportingBdnXml); + FileNew(); + _subtitle.Paragraphs.Clear(); + SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); + foreach (var p in formSubOcr.SubtitleFromOcr.Paragraphs) + { + _subtitle.Paragraphs.Add(p); + } + + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + _subtitleListViewIndex = -1; + SubtitleListview1.FirstVisibleIndex = -1; + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + + _fileName = Path.ChangeExtension(formSubOcr.FileName, GetCurrentSubtitleFormat().Extension); + SetTitle(); + _converted = true; + } + } + } + + private void ImportAndOcrSrt(Subtitle subtitle) + { + using (var formSubOcr = new VobSubOcr()) + { + formSubOcr.Initialize(subtitle, Configuration.Settings.VobSubOcr, false); + if (formSubOcr.ShowDialog(this) == DialogResult.OK) + { + MakeHistoryForUndo(_language.BeforeImportingBdnXml); + FileNew(); + _subtitle.Paragraphs.Clear(); + SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); + foreach (var p in formSubOcr.SubtitleFromOcr.Paragraphs) + { + _subtitle.Paragraphs.Add(p); + } + + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + _subtitleListViewIndex = -1; + SubtitleListview1.FirstVisibleIndex = -1; + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + + _fileName = Path.ChangeExtension(formSubOcr.FileName, GetCurrentSubtitleFormat().Extension); + SetTitle(); + _converted = true; + } + } + } + + private bool ShowUnknownSubtitle(string fileName, bool allowImportPlainText = false) + { + using (var unknownSubtitle = new UnknownSubtitle()) + { + unknownSubtitle.Initialize(Title, fileName, allowImportPlainText); + unknownSubtitle.ShowDialog(this); + return unknownSubtitle.ImportPlainText; + } + } + + private void UpdateRecentFilesUI() + { + var dropDownItems = new List(); + reopenToolStripMenuItem.DropDownItems.Clear(); + if (Configuration.Settings.General.ShowRecentFiles && Configuration.Settings.RecentFiles.Files.Count > 0) + { + reopenToolStripMenuItem.Visible = true; + var lowerFileNameList = new List(); + foreach (var file in Configuration.Settings.RecentFiles.Files) + { + if (!string.IsNullOrEmpty(file.OriginalFileName) && File.Exists(file.OriginalFileName)) + { + dropDownItems.Add(new ToolStripMenuItem(file.FileName + " + " + file.OriginalFileName, null, ReopenSubtitleToolStripMenuItemClick) { Tag = file.FileName }); + } + else + { + if (!lowerFileNameList.Contains(file.FileName.ToLowerInvariant())) + { + dropDownItems.Add(new ToolStripMenuItem(file.FileName, null, ReopenSubtitleToolStripMenuItemClick) { Tag = file.FileName }); + lowerFileNameList.Add(file.FileName.ToLowerInvariant()); + } + } + UiUtil.FixFonts(dropDownItems[dropDownItems.Count - 1]); + } + reopenToolStripMenuItem.DropDownItems.AddRange(dropDownItems.ToArray()); + } + else + { + Configuration.Settings.RecentFiles.Files.Clear(); + reopenToolStripMenuItem.Visible = false; + } + + reopenToolStripMenuItem.Visible = reopenToolStripMenuItem.DropDownItems.Count > 0; + } + + private void RemoveNotExistingFilesFromRecentFilesUI() + { + if (!Configuration.Settings.General.ShowRecentFiles || Configuration.Settings.RecentFiles.Files.Count == 0) + { + return; + } + + var bw = new BackgroundWorker(); + bw.DoWork += (sender, args) => + { + var recentFilesList = (List)args.Argument; + var notExistingFiles = new List(); + foreach (var entry in recentFilesList) + { + if (!File.Exists(entry.FileName)) + { + notExistingFiles.Add(entry.FileName); + } + } + + args.Result = notExistingFiles; + }; + bw.RunWorkerCompleted += (sender, args) => + { + var notExistingFiles = (List)args.Result; + if (notExistingFiles.Count == 0) + { + return; + } + + try + { + Configuration.Settings.RecentFiles.Files = Configuration.Settings.RecentFiles.Files + .Where(p => !notExistingFiles.Contains(p.FileName)).ToList(); + for (var index = reopenToolStripMenuItem.DropDownItems.Count - 1; index >= 0; index--) + { + ToolStripItem item = reopenToolStripMenuItem.DropDownItems[index]; + if (notExistingFiles.Contains((string)item.Tag)) + { + reopenToolStripMenuItem.DropDownItems.RemoveAt(index); + } + } + } + catch + { + // ignore + } + }; + bw.RunWorkerAsync(Configuration.Settings.RecentFiles.Files); + } + + private void ReopenSubtitleToolStripMenuItemClick(object sender, EventArgs e) + { + ReloadFromSourceView(); + var item = sender as ToolStripItem; + + if (ContinueNewOrExit()) + { + if (!string.IsNullOrEmpty(_fileName)) + { + Configuration.Settings.RecentFiles.Add(_fileName, FirstVisibleIndex, FirstSelectedIndex, VideoFileName, _subtitleAlternateFileName, Configuration.Settings.General.CurrentVideoOffsetInMs); + } + + RecentFileEntry rfe = null; + foreach (var file in Configuration.Settings.RecentFiles.Files.Where(p => !string.IsNullOrEmpty(p.OriginalFileName))) + { + if ((file.FileName + " + " + file.OriginalFileName).Equals(item.Text, StringComparison.OrdinalIgnoreCase)) + { + rfe = file; + break; + } + } + + if (rfe == null) + { + foreach (var file in Configuration.Settings.RecentFiles.Files.Where(p => string.IsNullOrEmpty(p.OriginalFileName))) + { + if (file.FileName.Equals(item.Text, StringComparison.OrdinalIgnoreCase)) + { + rfe = file; + RemoveAlternate(true, false); + break; + } + } + } + + SubtitleListview1.BeginUpdate(); + if (rfe == null) + { + OpenSubtitle(item.Text, null); + } + else + { + OpenRecentFile(rfe); + } + + GotoSubPosAndPause(); + SetRecentIndices(rfe); + SubtitleListview1.EndUpdate(); + if (rfe != null && !string.IsNullOrEmpty(rfe.VideoFileName)) + { + var p = _subtitle.GetParagraphOrDefault(rfe.FirstSelectedIndex); + if (p != null) + { + mediaPlayer.CurrentPosition = p.StartTime.TotalSeconds; + } + } + } + } + + private void OpenRecentFile(RecentFileEntry rfe) + { + OpenSubtitle(rfe.FileName, null, rfe.VideoFileName, rfe.OriginalFileName, false); + Configuration.Settings.General.CurrentVideoOffsetInMs = rfe.VideoOffsetInMs; + if (rfe.VideoOffsetInMs != 0) + { + _subtitle.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(-Configuration.Settings.General.CurrentVideoOffsetInMs)); + _changeSubtitleHash = _subtitle.GetFastHashCode(GetCurrentEncoding().BodyName); + if (_subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) + { + _subtitleAlternate.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(-Configuration.Settings.General.CurrentVideoOffsetInMs)); + _changeAlternateSubtitleHash = _subtitleAlternate.GetFastHashCode(GetCurrentEncoding().BodyName); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + } + else + { + SubtitleListview1.Fill(_subtitle); + } + } + } + + private void GotoSubPosAndPause() + { + if (!string.IsNullOrEmpty(VideoFileName)) + { + _videoLoadedGoToSubPosAndPause = true; + } + else + { + mediaPlayer.SubtitleText = string.Empty; + } + } + + private void SetRecentIndices(RecentFileEntry rfe) + { + if (!Configuration.Settings.General.RememberSelectedLine) + { + return; + } + + ShowSubtitleTimer.Stop(); + Application.DoEvents(); + if (rfe != null && !string.IsNullOrEmpty(rfe.FileName) && + rfe.FirstSelectedIndex >= 0 && rfe.FirstSelectedIndex < SubtitleListview1.Items.Count) + { + SubtitleListview1.SelectedIndexChanged -= SubtitleListview1_SelectedIndexChanged; + SubtitleListview1.SelectIndexAndEnsureVisible(rfe.FirstSelectedIndex, true); + _subtitleListViewIndex = -1; + SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; + RefreshSelectedParagraph(); + } + + if (!_loading) + { + ShowSubtitleTimer.Start(); + } + } + + private void SaveToolStripMenuItemClick(object sender, EventArgs e) + { + if (!IsSubtitleLoaded) + { + return; + } + + ReloadFromSourceView(); + _saveAsCalled = false; + SaveSubtitle(GetCurrentSubtitleFormat()); + } + + private void SaveAsToolStripMenuItemClick(object sender, EventArgs e) + { + if (!IsSubtitleLoaded) + { + return; + } + + ReloadFromSourceView(); + FileSaveAs(true); + } + + private DialogResult FileSaveAs(bool allowUsingLastSaveAsFormat) + { + SubtitleFormat currentFormat = null; + if (allowUsingLastSaveAsFormat && !string.IsNullOrEmpty(Configuration.Settings.General.LastSaveAsFormat)) + { + currentFormat = Utilities.GetSubtitleFormatByFriendlyName(Configuration.Settings.General.LastSaveAsFormat); + } + + if (currentFormat == null) + { + currentFormat = GetCurrentSubtitleFormat(); + } + + UiUtil.SetSaveDialogFilter(saveFileDialog1, currentFormat); + + saveFileDialog1.Title = _language.SaveSubtitleAs; + saveFileDialog1.DefaultExt = "*" + currentFormat.Extension; + saveFileDialog1.AddExtension = true; + + if (!string.IsNullOrEmpty(openFileDialog1.InitialDirectory)) + { + saveFileDialog1.InitialDirectory = openFileDialog1.InitialDirectory; + } + + if (!string.IsNullOrWhiteSpace(_fileName) && Configuration.Settings.General.SaveAsUseFileNameFrom.Equals("file", StringComparison.OrdinalIgnoreCase)) + { + saveFileDialog1.FileName = Utilities.GetFileNameWithoutExtension(_fileName); + saveFileDialog1.InitialDirectory = Path.GetDirectoryName(_fileName); + } + else if (!string.IsNullOrEmpty(VideoFileName) && Configuration.Settings.General.SaveAsUseFileNameFrom.Equals("video", StringComparison.OrdinalIgnoreCase)) + { + if (_converted && !string.IsNullOrEmpty(_fileName) && !File.Exists(_fileName)) + { + saveFileDialog1.FileName = Utilities.GetFileNameWithoutExtension(_fileName); + } + else + { + saveFileDialog1.FileName = Utilities.GetFileNameWithoutExtension(VideoFileName); + } + + saveFileDialog1.InitialDirectory = Path.GetDirectoryName(VideoFileName); + } + else if (!string.IsNullOrWhiteSpace(_fileName)) + { + saveFileDialog1.FileName = Utilities.GetFileNameWithoutExtension(_fileName); + saveFileDialog1.InitialDirectory = Path.GetDirectoryName(_fileName); + } + else if (!string.IsNullOrEmpty(VideoFileName)) + { + saveFileDialog1.FileName = Utilities.GetFileNameWithoutExtension(VideoFileName); + saveFileDialog1.InitialDirectory = Path.GetDirectoryName(VideoFileName); + } + else + { + saveFileDialog1.FileName = string.Empty; + } + + if (!string.IsNullOrEmpty(saveFileDialog1.FileName) && + saveFileDialog1.FileName.Contains('.') && + !saveFileDialog1.FileName.EndsWith(currentFormat.Extension, StringComparison.OrdinalIgnoreCase)) + { + saveFileDialog1.FileName = saveFileDialog1.FileName + currentFormat.Extension; + } + + var result = saveFileDialog1.ShowDialog(this); + if (result == DialogResult.OK) + { + openFileDialog1.InitialDirectory = saveFileDialog1.InitialDirectory; + _converted = false; + _fileName = saveFileDialog1.FileName; + _fileDateTime = File.GetLastWriteTime(_fileName); + SetTitle(); + MakeHistoryForUndo(_language.Menu.File.SaveAs); + + int index = 0; + foreach (SubtitleFormat format in SubtitleFormat.AllSubtitleFormats) + { + if (saveFileDialog1.FilterIndex == index + 1) + { + // only allow current extension or ".txt" + string ext = Path.GetExtension(_fileName).ToLowerInvariant(); + bool extOk = ext.Equals(format.Extension, StringComparison.OrdinalIgnoreCase) || format.AlternateExtensions.Contains(ext) || ext == ".txt"; + if (!extOk) + { + if (_fileName.EndsWith('.')) + { + _fileName = _fileName.Substring(0, _fileName.Length - 1); + } + + _fileName += format.Extension; + } + + _saveAsCalled = true; + if (SaveSubtitle(format) == DialogResult.OK) + { + Configuration.Settings.General.LastSaveAsFormat = format.Name; + SetCurrentFormat(format); + Configuration.Settings.RecentFiles.Add(_fileName, FirstVisibleIndex, FirstSelectedIndex, VideoFileName, _subtitleAlternateFileName, Configuration.Settings.General.CurrentVideoOffsetInMs); + Configuration.Settings.Save(); + UpdateRecentFilesUI(); + } + + break; + } + + index++; + } + + _converted = false; + } + + return result; + } + + private DialogResult SaveSubtitle(SubtitleFormat format, bool useNewLineWithOnly0A = false, bool skipPrompts = false) + { + if (string.IsNullOrEmpty(_fileName) || _converted) + { + return FileSaveAs(false); + } + + try + { + var sub = GetSaveSubtitle(_subtitle); + + if (format != null && !format.IsTextBased) + { + if (format is Ebu ebu) + { + var header = new Ebu.EbuGeneralSubtitleInformation(); + if (_subtitle != null && _subtitle.Header != null && (_subtitle.Header.Contains("STL2") || _subtitle.Header.Contains("STL3"))) + { + header = Ebu.ReadHeader(Encoding.UTF8.GetBytes(_subtitle.Header)); + } + + if (ebu.Save(_fileName, sub, !_saveAsCalled, header)) + { + _changeSubtitleHash = _subtitle.GetFastHashCode(GetCurrentEncoding().BodyName); + Configuration.Settings.RecentFiles.Add(_fileName, FirstVisibleIndex, FirstSelectedIndex, VideoFileName, _subtitleAlternateFileName, Configuration.Settings.General.CurrentVideoOffsetInMs); + Configuration.Settings.Save(); + } + } + + return DialogResult.OK; + } + + string allText = sub.ToText(format); + + // Seungki begin + if (_splitDualSami && _subtitleAlternate?.Paragraphs.Count > 0) + { + var s = new Subtitle(_subtitle); + foreach (var p in _subtitleAlternate.Paragraphs) + { + s.Paragraphs.Add(p); + } + + allText = s.ToText(format); + } + // Seungki end + + var currentEncoding = GetCurrentEncoding(); + bool isUnicode = currentEncoding.Equals(Encoding.Unicode) || currentEncoding.Equals(Encoding.UTF32) || currentEncoding.Equals(Encoding.GetEncoding(12001)) || currentEncoding.Equals(Encoding.UTF7) || currentEncoding.Equals(Encoding.UTF8); + if (!isUnicode) + { + if (!skipPrompts && currentEncoding.GetString(currentEncoding.GetBytes(allText)) != allText) + { + if (MessageBox.Show(string.Format(_language.UnicodeMusicSymbolsAnsiWarning), Title, MessageBoxButtons.YesNoCancel) != DialogResult.Yes) + { + return DialogResult.No; + } + } + + allText = NormalizeUnicode(allText, currentEncoding); + } + + bool containsNegativeTime = false; + var negativeTimeLines = new List(); + foreach (var p in sub.Paragraphs) + { + if (p.StartTime.TotalMilliseconds < 0 || p.EndTime.TotalMilliseconds < 0) + { + containsNegativeTime = true; + negativeTimeLines.Add(sub.Paragraphs.IndexOf(p).ToString(CultureInfo.InvariantCulture)); + if (negativeTimeLines.Count > 10) + { + negativeTimeLines[negativeTimeLines.Count - 1] = negativeTimeLines[negativeTimeLines.Count - 1] + "..."; + break; + } + } + } + + if (containsNegativeTime && !skipPrompts) + { + if (MessageBox.Show(_language.NegativeTimeWarning + Environment.NewLine + + string.Format(Configuration.Settings.Language.MultipleReplace.LinesFoundX, string.Join(", ", negativeTimeLines)), + Title, MessageBoxButtons.YesNoCancel) != DialogResult.Yes) + { + return DialogResult.No; + } + } + + if (!skipPrompts && File.Exists(_fileName)) + { + var fileInfo = new FileInfo(_fileName); + var fileOnDisk = fileInfo.LastWriteTime; + if (_fileDateTime != fileOnDisk && _fileDateTime != new DateTime()) + { + if (MessageBox.Show(string.Format(_language.OverwriteModifiedFile, + _fileName, fileOnDisk.ToShortDateString(), fileOnDisk.ToString("HH:mm:ss"), + Environment.NewLine, _fileDateTime.ToShortDateString(), _fileDateTime.ToString("HH:mm:ss")), + Title + " - " + _language.FileOnDiskModified, MessageBoxButtons.YesNoCancel) != DialogResult.Yes) + { + return DialogResult.No; + } + } + + if (fileInfo.IsReadOnly) + { + MessageBox.Show(string.Format(_language.FileXIsReadOnly, _fileName)); + return DialogResult.No; + } + } + + // force encoding + var formatType = format.GetType(); + if (formatType == typeof(WebVTT) || formatType == typeof(WebVTTFileWithLineNumber)) + { + SetEncoding(Encoding.UTF8); + currentEncoding = Encoding.UTF8; + } + else if (formatType == typeof(SwiftInterchange2)) + { + SetEncoding(Encoding.Unicode); + currentEncoding = Encoding.Unicode; + } + + if (Configuration.Settings.General.ShowFormatRequiresUtf8Warning && !currentEncoding.Equals(Encoding.UTF8) && + (formatType == typeof(DCinemaInterop) || formatType == typeof(DCinemaSmpte2007) || + formatType == typeof(DCinemaSmpte2010) || formatType == typeof(DCinemaSmpte2014))) + { + using (var form = new DialogDoNotShowAgain(Title, string.Format(_language.FormatXShouldUseUft8, GetCurrentSubtitleFormat().FriendlyName))) + { + form.ShowDialog(this); + Configuration.Settings.General.ShowFormatRequiresUtf8Warning = !form.DoNoDisplayAgain; + } + } + + if (format.Extension == ".rtf" || formatType == typeof(ProjectionSubtitleList)) + { + var enc = GetCurrentEncoding(); + if (enc != Encoding.ASCII) + { + var oldDisableShowStatus = _disableShowStatus; + _disableShowStatus = false; + ShowStatus("ASCII encoding used for save"); + _disableShowStatus = oldDisableShowStatus; + currentEncoding = Encoding.ASCII; + } + } + + if (useNewLineWithOnly0A) + { + allText = allText.Replace("\r\n", "\n"); + } + + if (formatType == typeof(ItunesTimedText) || formatType == typeof(ScenaristClosedCaptions) || formatType == typeof(ScenaristClosedCaptionsDropFrame)) + { + var outputEnc = new UTF8Encoding(false); // create encoding with no BOM + using (var file = new StreamWriter(_fileName, false, outputEnc)) // open file with encoding + { + file.Write(allText); + } + } + else if (Equals(currentEncoding, Encoding.UTF8) && (formatType == typeof(TmpegEncAW5) || formatType == typeof(TmpegEncXml))) + { + var outputEnc = new UTF8Encoding(false); // create encoding with no BOM + using (var file = new StreamWriter(_fileName, false, outputEnc)) // open file with encoding + { + file.Write(allText); + } + } + else + { + if (string.IsNullOrWhiteSpace(allText)) + { + MessageBox.Show(string.Format(_language.UnableToSaveSubtitleX, _fileName), String.Empty, MessageBoxButtons.OK, MessageBoxIcon.Stop); + return DialogResult.Cancel; + } + + if (comboBoxEncoding.SelectedIndex == TextEncoding.Utf8WithoutBomIndex) + { + var outputEnc = new UTF8Encoding(false); // create encoding with no BOM + using (var file = new StreamWriter(_fileName, false, outputEnc)) // open file with encoding + { + file.Write(allText); + } + } + else + { + // create file - includes BOM for Unicode formats + using (var fs = new FileStream(_fileName, FileMode.Create, FileAccess.Write, FileShare.Read)) + using (var sw = new StreamWriter(fs, currentEncoding)) + { + sw.Write(allText); + } + } + } + + Configuration.Settings.RecentFiles.Add(_fileName, FirstVisibleIndex, FirstSelectedIndex, VideoFileName, _subtitleAlternateFileName, Configuration.Settings.General.CurrentVideoOffsetInMs); + Configuration.Settings.Save(); + new BookmarkPersistence(_subtitle, _fileName).Save(); + _fileDateTime = File.GetLastWriteTime(_fileName); + ShowStatus(string.Format(_language.SavedSubtitleX, _fileName)); + if (formatType == typeof(NetflixTimedText)) + { + NetflixGlyphCheck(true); + } + + _changeSubtitleHash = _subtitle.GetFastHashCode(GetCurrentEncoding().BodyName); + return DialogResult.OK; + } + catch (Exception exception) + { + MessageBox.Show(exception.Message); + return DialogResult.Cancel; + } + } + + private DialogResult SaveOriginalSubtitle(SubtitleFormat format, bool skipPrompts = false) + { + try + { + var subAlt = GetSaveSubtitle(_subtitleAlternate); + + bool containsNegativeTime = false; + foreach (var p in subAlt.Paragraphs) + { + if (p.StartTime.TotalMilliseconds < 0 || p.EndTime.TotalMilliseconds < 0) + { + containsNegativeTime = true; + break; + } + } + + if (!skipPrompts && containsNegativeTime) + { + if (MessageBox.Show(_language.NegativeTimeWarning, Title, MessageBoxButtons.YesNoCancel) != DialogResult.Yes) + { + return DialogResult.No; + } + } + + if (format != null && !format.IsTextBased) + { + if (format is Ebu ebu) + { + if (ebu.Save(_subtitleAlternateFileName, subAlt)) + { + Configuration.Settings.RecentFiles.Add(_fileName, FirstVisibleIndex, FirstSelectedIndex, VideoFileName, _subtitleAlternateFileName, Configuration.Settings.General.CurrentVideoOffsetInMs); + Configuration.Settings.Save(); + ShowStatus(string.Format(_language.SavedOriginalSubtitleX, _subtitleAlternateFileName)); + _changeAlternateSubtitleHash = _subtitleAlternate.GetFastHashCode(GetCurrentEncoding().BodyName); + return DialogResult.OK; + } + + return DialogResult.No; + } + + MessageBox.Show("Ups - save original does not support this format - please go to Github and create an issue!"); + } + + string allText = subAlt.ToText(format); + var currentEncoding = GetCurrentEncoding(); + bool isUnicode = currentEncoding != null && (currentEncoding.Equals(Encoding.Unicode) || currentEncoding.Equals(Encoding.UTF32) || currentEncoding.Equals(Encoding.UTF7) || currentEncoding.Equals(Encoding.UTF8)); + if (!skipPrompts && !isUnicode && currentEncoding.GetString(currentEncoding.GetBytes(allText)) != allText) + { + if (MessageBox.Show(string.Format(_language.UnicodeMusicSymbolsAnsiWarning), Title, MessageBoxButtons.YesNoCancel) != DialogResult.Yes) + { + return DialogResult.No; + } + } + + if (!isUnicode) + { + allText = NormalizeUnicode(allText, currentEncoding); + } + + File.WriteAllText(_subtitleAlternateFileName, allText, currentEncoding); + ShowStatus(string.Format(_language.SavedOriginalSubtitleX, _subtitleAlternateFileName)); + _changeAlternateSubtitleHash = _subtitleAlternate.GetFastHashCode(GetCurrentEncoding().BodyName); + return DialogResult.OK; + } + catch + { + MessageBox.Show(string.Format(_language.UnableToSaveSubtitleX, _fileName)); + return DialogResult.Cancel; + } + } + + public string NormalizeUnicode(string input, Encoding encoding) + { + const char defHyphen = '-'; // - Hyphen-minus (\u002D) (Basic Latin) + const char defColon = ':'; // : Colon (\u003A) (Basic Latin) + + var text = input; + + bool hasSingleMusicNode = true; + if (encoding.GetString(encoding.GetBytes("♪")) != "♪") + { + text = text.Replace('♪', '#'); + hasSingleMusicNode = false; + } + + if (encoding.GetString(encoding.GetBytes("♫")) != "♫") + { + text = text.Replace('♫', hasSingleMusicNode ? '♪' : '#'); + } + + // Hyphens + return text.Replace('\u2043', defHyphen) // ⁃ Hyphen bullet (\u2043) + .Replace('\u2010', defHyphen) // ‐ Hyphen (\u2010) + .Replace('\u2012', defHyphen) // ‒ Figure dash (\u2012) + .Replace('\u2013', defHyphen) // – En dash (\u2013) + .Replace('\u2014', defHyphen) // — Em dash (\u2014) + .Replace('\u2015', defHyphen) // ― Horizontal bar (\u2015) + + // Colons: + .Replace('\u02F8', defColon) // ˸ Modifier Letter Raised Colon (\u02F8) + .Replace('\uFF1A', defColon) // : Fullwidth Colon (\uFF1A) + .Replace('\uFE13', defColon) // ︓ Presentation Form for Vertical Colon (\uFE13) + + // Others + .Replace("…", "...") + .Replace("⇒", "=>") + + // Spaces + .Replace('\u00A0', ' ') // No-Break Space + .Replace("\u200B", string.Empty) // Zero Width Space + .Replace("\uFEFF", string.Empty) // Zero Width No-Break Space + + // Intellectual property + .Replace("\u00A9", "(Copyright)") // © copyright + .Replace("\u2117", "(Sound-recording Copyright)") // ℗ sound-recording copyright + .Replace("\u00AE", "(Registered Trademark)") // ® registered trademark + .Replace("\u2120", "(Service Mark)") // ℠ service mark + .Replace("\u2122", "(Trademark)") // ™ trademark + + // RTL/LTR markers + .Replace("\u202B", string.Empty) // ‏ + .Replace("\u202A", string.Empty); // &lmr; + } + + private void NewToolStripMenuItemClick(object sender, EventArgs e) + { + ReloadFromSourceView(); + FileNew(); + } + + private void ResetSubtitle(bool forceVideoReload = false) + { + SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); + + labelStartTimeWarning.Text = string.Empty; + labelDurationWarning.Text = string.Empty; + + Configuration.Settings.General.CurrentVideoOffsetInMs = 0; + _subtitle = new Subtitle(_subtitle.HistoryItems); + _changeAlternateSubtitleHash = -1; + _changeSubtitleHash = _subtitle.GetFastHashCode(GetCurrentEncoding().BodyName); + _subtitleAlternateFileName = null; + textBoxSource.Text = string.Empty; + SubtitleListview1.Items.Clear(); + _fileName = string.Empty; + _fileDateTime = new DateTime(); + _oldSubtitleFormat = null; + labelSingleLine.Text = string.Empty; + buttonSplitLine.Visible = false; + labelSingleLinePixels.Text = string.Empty; + RemoveAlternate(true, false); + _splitDualSami = false; + + SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.Extra); + + var oldDisableShowStatus = _disableShowStatus; + _disableShowStatus = true; + ComboBoxSubtitleFormatsSelectedIndexChanged(null, null); + _disableShowStatus = oldDisableShowStatus; + + SetEncoding(Configuration.Settings.General.DefaultEncoding); + + toolStripComboBoxFrameRate.Text = Configuration.Settings.General.DefaultFrameRate.ToString(); + _findHelper = null; + _spellCheckForm = null; + + if (ModifierKeys != Keys.Shift || forceVideoReload) + { + VideoFileName = null; + _videoInfo = null; + VideoAudioTrackNumber = -1; + labelVideoInfo.Text = _languageGeneral.NoVideoLoaded; + audioVisualizer.WavePeaks = null; + audioVisualizer.SetSpectrogram(null); + audioVisualizer.SceneChanges = new List(); + audioVisualizer.Chapters = new List(); + if (mediaPlayer.VideoPlayer != null) + { + mediaPlayer.PauseAndDisposePlayer(); + } + + timeUpDownVideoPositionAdjust.TimeCode = new TimeCode(); + timeUpDownVideoPositionAdjust.Enabled = false; + timeUpDownVideoPosition.TimeCode = new TimeCode(); + timeUpDownVideoPosition.Enabled = false; + trackBarWaveformPosition.Value = 0; + timeUpDownStartTime.TimeCode = new TimeCode(); + numericUpDownDuration.Value = 0; + } + + _sourceViewChange = false; + + _subtitleListViewIndex = -1; + textBoxListViewText.Text = string.Empty; + textBoxListViewTextAlternate.Text = string.Empty; + textBoxListViewText.Enabled = false; + textBoxListViewText.BackColor = SystemColors.ActiveBorder; + textBoxListViewTextAlternate.BackColor = SystemColors.ActiveBorder; + labelTextLineLengths.Text = string.Empty; + labelCharactersPerSecond.Text = string.Empty; + labelTextLineTotal.Text = string.Empty; + + _listViewTextUndoLast = null; + _listViewAlternateTextUndoLast = null; + _listViewTextUndoIndex = -1; + + _changeSubtitleHash = _subtitle.GetFastHashCode(GetCurrentEncoding().BodyName); + _converted = false; + + SetTitle(); + SetUndockedWindowsTitle(); + mediaPlayer.SubtitleText = string.Empty; + labelNextWord.Visible = false; + ShowStatus(_language.New); + + ResetShowEarlierOrLater(); + + // Set default RTL or LTR + if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) + { + textBoxListViewTextAlternate.RightToLeft = Configuration.Settings.General.RightToLeftMode ? RightToLeft.Yes : RightToLeft.No; + } + + if (Configuration.Settings.General.RightToLeftMode) + { + textBoxListViewText.RightToLeft = RightToLeft.Yes; + textBoxSource.RightToLeft = RightToLeft.Yes; + } + else + { + textBoxListViewText.RightToLeft = RightToLeft.No; + textBoxSource.RightToLeft = RightToLeft.No; + } + + SetListViewStateImages(); + pictureBoxBookmark.Visible = false; + panelBookmark.Hide(); + } + + private void ResetShowEarlierOrLater() + { + try + { + if (_showEarlierOrLater != null && !_showEarlierOrLater.IsDisposed) + { + _showEarlierOrLater.ResetTotalAdjustment(); + } + } + catch + { + // form closing or alike + } + } + + private void FileNew() + { + if (ContinueNewOrExit()) + { + if (Configuration.Settings.General.ShowRecentFiles) + { + Configuration.Settings.RecentFiles.Add(_fileName, FirstVisibleIndex, FirstSelectedIndex, VideoFileName, _subtitleAlternateFileName, Configuration.Settings.General.CurrentVideoOffsetInMs); + } + + MakeHistoryForUndo(_language.BeforeNew); + ResetSubtitle(true); + } + } + + private void ComboBoxSubtitleFormatsSelectedIndexChanged(object sender, EventArgs e) + { + if (IsMenuOpen) + { + return; + } + + _converted = true; + var format = GetCurrentSubtitleFormat(); + if (format == null) + { + format = new SubRip(); + } + var formatType = format.GetType(); + + if (_oldSubtitleFormat == null) + { + if (!_loading) + { + MakeHistoryForUndo(string.Format(_language.BeforeConvertingToX, format.FriendlyName)); + } + } + else + { + _subtitle.MakeHistoryForUndo(string.Format(_language.BeforeConvertingToX, format.FriendlyName), _oldSubtitleFormat, _fileDateTime, _subtitleAlternate, _subtitleAlternateFileName, _subtitleListViewIndex, textBoxListViewText.SelectionStart, textBoxListViewTextAlternate.SelectionStart); + _oldSubtitleFormat.RemoveNativeFormatting(_subtitle, format); + SaveSubtitleListviewIndices(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + + if (_oldSubtitleFormat.HasStyleSupport) + { + SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.Extra); + } + + if (_networkSession == null) + { + SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.Network); + } + + if (formatType == typeof(AdvancedSubStationAlpha) && _oldSubtitleFormat.GetType() == typeof(SubStationAlpha)) + { + _subtitle.Header = AdvancedSubStationAlpha.GetHeaderAndStylesFromSubStationAlpha(_subtitle.Header); + } + else if (formatType == typeof(SubStationAlpha) && _oldSubtitleFormat.GetType() == typeof(AdvancedSubStationAlpha)) + { + _subtitle.Header = SubStationAlpha.GetHeaderAndStylesFromAdvancedSubStationAlpha(_subtitle.Header, string.Empty); + } + } + + ShowSource(); + ShowStatus(string.Format(_language.ConvertedToX, format.FriendlyName)); + if (_fileName != null && _oldSubtitleFormat != null && _fileName.EndsWith(_oldSubtitleFormat.Extension, StringComparison.Ordinal)) + { + _fileName = _fileName.Substring(0, _fileName.Length - _oldSubtitleFormat.Extension.Length) + format.Extension; + } + + _oldSubtitleFormat = format; + Configuration.Settings.General.LastSaveAsFormat = format.Name; + + if ((formatType == typeof(AdvancedSubStationAlpha) || + formatType == typeof(SubStationAlpha) || + formatType == typeof(CsvNuendo)) && (_subtitle.Paragraphs.Any(p => !string.IsNullOrEmpty(p.Actor)) || + Configuration.Settings.Tools.ListViewShowColumnActor)) + { + bool wasVisible = SubtitleListview1.ColumnIndexActor >= 0; + if (formatType == typeof(CsvNuendo)) + { + SubtitleListview1.ShowActorColumn(Configuration.Settings.Language.General.Character); + } + else + { + SubtitleListview1.ShowActorColumn(Configuration.Settings.Language.General.Actor); + } + + if (!wasVisible) + { + SaveSubtitleListviewIndices(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + } + } + else + { + SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.Actor); + } + + if (formatType == typeof(TimedText10) && Configuration.Settings.Tools.ListViewShowColumnRegion) + { + SubtitleListview1.ShowRegionColumn(Configuration.Settings.Language.General.Region); + } + else + { + SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.Region); + } + + if (format.HasStyleSupport) + { + var styles = new List(); + if (formatType == typeof(AdvancedSubStationAlpha) || formatType == typeof(SubStationAlpha)) + { + styles = AdvancedSubStationAlpha.GetStylesFromHeader(_subtitle.Header); + } + else if (formatType == typeof(TimedText10) || formatType == typeof(ItunesTimedText)) + { + styles = TimedText10.GetStylesFromHeader(_subtitle.Header); + } + else if (formatType == typeof(Sami) || formatType == typeof(SamiModern)) + { + styles = Sami.GetStylesFromHeader(_subtitle.Header); + if (string.IsNullOrEmpty(_subtitle.Header)) + { + styles = Sami.GetStylesFromSubtitle(_subtitle); + } + else + { + styles = Sami.GetStylesFromHeader(_subtitle.Header); + } + } + else if (format.Name == "Nuendo") + { + styles = GetNuendoStyles(); + } + + if (styles.Count > 0) + { + foreach (var p in _subtitle.Paragraphs) + { + if (string.IsNullOrEmpty(p.Extra)) + { + p.Extra = styles[0]; + } + } + } + + if (formatType == typeof(Sami) || formatType == typeof(SamiModern)) + { + SubtitleListview1.ShowExtraColumn(_languageGeneral.Class); + } + else if (formatType == typeof(TimedText10) || formatType == typeof(ItunesTimedText)) + { + SubtitleListview1.ShowExtraColumn(_languageGeneral.StyleLanguage); + } + else if (format.Name == "Nuendo") + { + SubtitleListview1.ShowExtraColumn(_languageGeneral.Character); + } + else + { + SubtitleListview1.ShowExtraColumn(_languageGeneral.Style); + } + + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + } + + ShowHideTextBasedFeatures(format); + + UpdateNetflixGlyphCheckToolsVisibility(); + } + + private static List GetNuendoStyles() + { + if (!string.IsNullOrEmpty(Configuration.Settings.SubtitleSettings.NuendoCharacterListFile) && File.Exists(Configuration.Settings.SubtitleSettings.NuendoCharacterListFile)) + { + return NuendoProperties.LoadCharacters(Configuration.Settings.SubtitleSettings.NuendoCharacterListFile); + } + + return new List(); + } + + private void ComboBoxSubtitleFormatsEnter(object sender, EventArgs e) + { + SubtitleFormat format = GetCurrentSubtitleFormat(); + if (format != null) + { + _oldSubtitleFormat = format; + } + } + + private SubtitleFormat GetCurrentSubtitleFormat() + { + return Utilities.GetSubtitleFormatByFriendlyName(comboBoxSubtitleFormats.SelectedItem.ToString()); + } + + private void ShowSource() + { + if (_subtitle != null && _subtitle.Paragraphs.Count > 0) + { + SubtitleFormat format = GetCurrentSubtitleFormat(); + if (format != null) + { + textBoxSource.TextChanged -= TextBoxSourceTextChanged; + textBoxSource.Text = GetSaveSubtitle(_subtitle).ToText(format); + textBoxSource.TextChanged += TextBoxSourceTextChanged; + return; + } + } + + textBoxSource.TextChanged -= TextBoxSourceTextChanged; + textBoxSource.Text = string.Empty; + textBoxSource.TextChanged += TextBoxSourceTextChanged; + } + + private void SettingsToolStripMenuItemClick(object sender, EventArgs e) + { + ShowSettings(); + } + + private void ShowSettings() + { + string oldVideoPlayer = Configuration.Settings.General.VideoPlayer; + string oldMpvVideoOutput = Configuration.Settings.General.MpvVideoOutputWindows; + string oldListViewLineSeparatorString = Configuration.Settings.General.ListViewLineSeparatorString; + var oldCpsWhiteSpaceSetting = Configuration.Settings.General.CharactersPerSecondsIgnoreWhiteSpace; + string oldSubtitleFontSettings = Configuration.Settings.General.SubtitleFontName + + Configuration.Settings.General.SubtitleTextBoxFontBold + + Configuration.Settings.General.CenterSubtitleInTextBox + + Configuration.Settings.General.SubtitleTextBoxFontSize + + Configuration.Settings.General.SubtitleFontColor.ToArgb() + + Configuration.Settings.General.SubtitleBackgroundColor.ToArgb() + + Configuration.Settings.General.SubtitleListViewFontBold.ToString() + + Configuration.Settings.General.SubtitleListViewFontSize; + + ; + bool oldUseTimeFormatHHMMSSFF = Configuration.Settings.General.UseTimeFormatHHMMSSFF; + + string oldSyntaxColoring = Configuration.Settings.Tools.ListViewSyntaxColorDurationSmall.ToString() + + Configuration.Settings.Tools.ListViewSyntaxColorDurationBig + + Configuration.Settings.Tools.ListViewSyntaxColorLongLines + + Configuration.Settings.Tools.ListViewSyntaxColorOverlap + + Configuration.Settings.Tools.ListViewSyntaxMoreThanXLines + + Configuration.Settings.General.MaxNumberOfLines + + Configuration.Settings.Tools.ListViewSyntaxErrorColor.ToArgb(); + + var oldAllowEditOfOriginalSubtitle = Configuration.Settings.General.AllowEditOfOriginalSubtitle; + var oldShowColumnEndTime = Configuration.Settings.Tools.ListViewShowColumnEndTime; + var oldShowcolumnDuration = Configuration.Settings.Tools.ListViewShowColumnDuration; + var oldShowColumnCharsPerSec = Configuration.Settings.Tools.ListViewShowColumnCharsPerSec; + var oldShowWordsMinColumn = Configuration.Settings.Tools.ListViewShowColumnWordsPerMin; + var oldSubtitleTextBoxSyntaxColor = Configuration.Settings.General.SubtitleTextBoxSyntaxColor; + var oldSubtitleFontSize = Configuration.Settings.General.SubtitleTextBoxFontSize; + var oldSubtitleTextBoxHtmlColor = Configuration.Settings.General.SubtitleTextBoxHtmlColor.ToArgb().ToString(); + var oldSubtitleTextBoxAssaColor = Configuration.Settings.General.SubtitleTextBoxAssColor.ToArgb().ToString(); + using (var settings = new Settings()) + { + settings.Initialize(Icon, toolStripButtonFileNew.Image, toolStripButtonFileOpen.Image, toolStripButtonSave.Image, toolStripButtonSaveAs.Image, toolStripButtonFind.Image, + toolStripButtonReplace.Image, toolStripButtonFixCommonErrors.Image, toolStripButtonRemoveTextForHi.Image, toolStripButtonVisualSync.Image, + toolStripButtonSpellCheck.Image, toolStripButtonNetflixQualityCheck.Image, toolStripButtonSettings.Image, toolStripButtonHelp.Image); + + if (settings.ShowDialog(this) == DialogResult.Cancel) + { + return; // settings update canceled + } + } + + try + { // can have some problems with fonts... + UiUtil.InitializeSubtitleFont(textBoxSource); + UiUtil.InitializeSubtitleFont(textBoxListViewText); + UiUtil.InitializeSubtitleFont(textBoxListViewTextAlternate); + UiUtil.InitializeSubtitleFont(SubtitleListview1); + InitializeToolbar(); + } + catch (Exception exception) + { + System.Diagnostics.Debug.WriteLine(exception.Message + Environment.NewLine + exception.StackTrace); + } + + UpdateRecentFilesUI(); + buttonCustomUrl1.Text = Configuration.Settings.VideoControls.CustomSearchText1; + buttonCustomUrl1.Visible = Configuration.Settings.VideoControls.CustomSearchUrl1.Length > 1; + buttonCustomUrl2.Text = Configuration.Settings.VideoControls.CustomSearchText2; + buttonCustomUrl2.Visible = Configuration.Settings.VideoControls.CustomSearchUrl2.Length > 1; + + SetAudioVisualizerSettings(); + + string newSyntaxColoring = Configuration.Settings.Tools.ListViewSyntaxColorDurationSmall.ToString() + + Configuration.Settings.Tools.ListViewSyntaxColorDurationBig + + Configuration.Settings.Tools.ListViewSyntaxColorLongLines + + Configuration.Settings.Tools.ListViewSyntaxColorOverlap + + Configuration.Settings.Tools.ListViewSyntaxMoreThanXLines + + Configuration.Settings.General.MaxNumberOfLines + + Configuration.Settings.Tools.ListViewSyntaxErrorColor.ToArgb(); + + if (oldSubtitleFontSettings != Configuration.Settings.General.SubtitleFontName + + Configuration.Settings.General.SubtitleTextBoxFontBold + + Configuration.Settings.General.CenterSubtitleInTextBox + + Configuration.Settings.General.SubtitleTextBoxFontSize + + Configuration.Settings.General.SubtitleFontColor.ToArgb() + + Configuration.Settings.General.SubtitleBackgroundColor.ToArgb() + + Configuration.Settings.General.SubtitleListViewFontBold.ToString() + + Configuration.Settings.General.SubtitleListViewFontSize || + oldSyntaxColoring != newSyntaxColoring || + oldShowColumnEndTime != Configuration.Settings.Tools.ListViewShowColumnEndTime || + oldShowcolumnDuration != Configuration.Settings.Tools.ListViewShowColumnDuration || + oldShowColumnCharsPerSec != Configuration.Settings.Tools.ListViewShowColumnCharsPerSec || + oldShowWordsMinColumn != Configuration.Settings.Tools.ListViewShowColumnWordsPerMin) + { + if (Configuration.Settings.Tools.ListViewShowColumnEndTime) + { + SubtitleListview1.ShowEndColumn(Configuration.Settings.Language.General.EndTime); + } + else + { + SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.End); + } + + if (Configuration.Settings.Tools.ListViewShowColumnDuration) + { + SubtitleListview1.ShowDurationColumn(Configuration.Settings.Language.General.Duration); + } + else + { + SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.Duration); + } + + if (Configuration.Settings.Tools.ListViewShowColumnCharsPerSec) + { + SubtitleListview1.ShowCharsSecColumn(Configuration.Settings.Language.General.CharsPerSec); + } + else + { + SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.CharactersPerSeconds); + } + + if (Configuration.Settings.Tools.ListViewShowColumnWordsPerMin) + { + SubtitleListview1.ShowWordsMinColumn(Configuration.Settings.Language.General.WordsPerMin); + } + else + { + SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.WordsPerMinute); + } + + try + { // can have some problems with fonts... + UiUtil.InitializeSubtitleFont(textBoxListViewText); + UiUtil.InitializeSubtitleFont(textBoxListViewTextAlternate); + UiUtil.InitializeSubtitleFont(textBoxSource); + SubtitleListview1.SubtitleFontName = Configuration.Settings.General.SubtitleFontName; + SubtitleListview1.SubtitleFontBold = Configuration.Settings.General.SubtitleListViewFontBold; + SubtitleListview1.SubtitleFontSize = Configuration.Settings.General.SubtitleListViewFontSize; + } + catch (Exception exception) + { + System.Diagnostics.Debug.WriteLine(exception.Message + Environment.NewLine + exception.StackTrace); + } + + SubtitleListview1.ForeColor = Configuration.Settings.General.SubtitleFontColor; + SubtitleListview1.BackColor = Configuration.Settings.General.SubtitleBackgroundColor; + + SaveSubtitleListviewIndices(); + UiUtil.InitializeSubtitleFont(SubtitleListview1); + SubtitleListview1.AutoSizeAllColumns(this); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + mediaPlayer.SetSubtitleFont(); + ShowSubtitle(); + } + + mediaPlayer.SetSubtitleFont(); + mediaPlayer.ShowStopButton = Configuration.Settings.General.VideoPlayerShowStopButton; + mediaPlayer.ShowMuteButton = Configuration.Settings.General.VideoPlayerShowMuteButton; + mediaPlayer.ShowFullscreenButton = Configuration.Settings.General.VideoPlayerShowFullscreenButton; + + if (oldListViewLineSeparatorString != Configuration.Settings.General.ListViewLineSeparatorString || + oldCpsWhiteSpaceSetting != Configuration.Settings.General.CharactersPerSecondsIgnoreWhiteSpace) + { + SubtitleListview1.InitializeLanguage(_languageGeneral, Configuration.Settings); + SaveSubtitleListviewIndices(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + } + + if (oldAllowEditOfOriginalSubtitle != Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) + { + if (Configuration.Settings.General.AllowEditOfOriginalSubtitle) + { + AddAlternate(); + } + else + { + RemoveAlternate(false, false); + } + + Main_ResizeEnd(null, null); + } + + SetLanguage(Configuration.Settings.General.Language); + + textBoxListViewTextAlternate.Enabled = Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleListViewIndex >= 0; + + SetShortcuts(); + + CheckAndGetNewlyDownloadedMpvDlls("Please restart to use new libmpv dll"); + + if (!string.IsNullOrEmpty(VideoFileName) && oldVideoPlayer != Configuration.Settings.General.VideoPlayer && mediaPlayer.VideoPlayer != null || + (oldMpvVideoOutput != Configuration.Settings.General.MpvVideoOutputWindows && Configuration.Settings.General.VideoPlayer.Equals("MPV", StringComparison.OrdinalIgnoreCase))) + { + string vfn = VideoFileName; + CloseVideoToolStripMenuItemClick(null, null); + OpenVideo(vfn); + } + + StartOrStopAutoBackup(); + + SetTitle(); + if (Configuration.Settings.VideoControls.GenerateSpectrogram) + { + audioVisualizer.WaveformNotLoadedText = Configuration.Settings.Language.Waveform.ClickToAddWaveformAndSpectrogram; + showhideWaveformToolStripMenuItem.Text = _language.Menu.Video.ShowHideWaveformAndSpectrogram; + } + else + { + audioVisualizer.WaveformNotLoadedText = Configuration.Settings.Language.Waveform.ClickToAddWaveform; + showhideWaveformToolStripMenuItem.Text = _language.Menu.Video.ShowHideWaveform; + } + + audioVisualizer.Invalidate(); + + if (oldUseTimeFormatHHMMSSFF != Configuration.Settings.General.UseTimeFormatHHMMSSFF) + { + RefreshTimeCodeMode(); + } + + if (oldSubtitleTextBoxSyntaxColor != Configuration.Settings.General.SubtitleTextBoxSyntaxColor || + oldSubtitleFontSize != Configuration.Settings.General.SubtitleTextBoxFontSize || + oldSubtitleTextBoxHtmlColor != Configuration.Settings.General.SubtitleTextBoxHtmlColor.ToArgb().ToString() || + oldSubtitleTextBoxAssaColor != Configuration.Settings.General.SubtitleTextBoxAssColor.ToArgb().ToString()) + { + textBoxListViewText.Initialize(Configuration.Settings.General.SubtitleTextBoxSyntaxColor); + textBoxListViewTextAlternate.Initialize(Configuration.Settings.General.SubtitleTextBoxSyntaxColor); + RefreshSelectedParagraph(); + } + textBoxListViewText.BackColor = !IsSubtitleLoaded ? SystemColors.ActiveBorder : SystemColors.WindowFrame; + textBoxListViewTextAlternate.BackColor = !IsSubtitleLoaded ? SystemColors.ActiveBorder : SystemColors.WindowFrame; + + SubtitleListview1.SyntaxColorAllLines(_subtitle); + mediaPlayer.LastParagraph = null; + Application.DoEvents(); + UiUtil.ShowSubtitle(_subtitle, mediaPlayer); + mediaPlayer.VideoPlayerContainerResize(null, null); + ShowLineInformationListView(); + ShowSourceLineNumber(); + } + + private void SetAudioVisualizerSettings() + { + audioVisualizer.ShowGridLines = Configuration.Settings.VideoControls.WaveformDrawGrid; + audioVisualizer.GridColor = Configuration.Settings.VideoControls.WaveformGridColor; + audioVisualizer.SelectedColor = Configuration.Settings.VideoControls.WaveformSelectedColor; + audioVisualizer.Color = Configuration.Settings.VideoControls.WaveformColor; + audioVisualizer.BackgroundColor = Configuration.Settings.VideoControls.WaveformBackgroundColor; + audioVisualizer.TextColor = Configuration.Settings.VideoControls.WaveformTextColor; + audioVisualizer.CursorColor = Configuration.Settings.VideoControls.WaveformCursorColor; + audioVisualizer.ChaptersColor = Configuration.Settings.VideoControls.WaveformChaptersColor; + audioVisualizer.TextSize = Configuration.Settings.VideoControls.WaveformTextSize; + audioVisualizer.TextBold = Configuration.Settings.VideoControls.WaveformTextBold; + audioVisualizer.MouseWheelScrollUpIsForward = Configuration.Settings.VideoControls.WaveformMouseWheelScrollUpIsForward; + audioVisualizer.AllowOverlap = Configuration.Settings.VideoControls.WaveformAllowOverlap; + audioVisualizer.ClosenessForBorderSelection = Configuration.Settings.VideoControls.WaveformBorderHitMs; + } + + private void CheckAndGetNewlyDownloadedMpvDlls(string message) + { + if (Configuration.Settings.General.VideoPlayer != "MPV") + { + return; + } + + var newMpvFiles = Directory.GetFiles(Configuration.DataDirectory, "*.dll.new-mpv"); + if (newMpvFiles.Length <= 0) + { + return; + } + + if (mediaPlayer != null && mediaPlayer.VideoPlayer != null) + { + var mpv = mediaPlayer.VideoPlayer as LibMpvDynamic; + mediaPlayer.VideoPlayer = null; + mpv?.HardDispose(); + } + + foreach (string newDllFileName in newMpvFiles) + { + if (File.Exists(newDllFileName)) // dll was in use, so unload + copy new dll + load + { + try + { + string targetFileName = newDllFileName.Replace(".dll.new-mpv", ".dll"); + File.Copy(newDllFileName, targetFileName, true); + File.Delete(newDllFileName); + ShowStatus("libmpv updated"); + } + catch + { + // ignore + } + } + } + + if (!string.IsNullOrEmpty(message)) + { + MessageBox.Show(message); + } + } + + private void AddAlternate() + { + buttonUnBreak.Visible = false; + buttonAutoBreak.Visible = false; + buttonSplitLine.Visible = false; + textBoxListViewTextAlternate.Visible = true; + labelAlternateText.Visible = true; + labelAlternateCharactersPerSecond.Visible = true; + labelTextAlternateLineLengths.Visible = true; + labelAlternateSingleLine.Visible = true; + labelAlternateSingleLinePixels.Visible = true; + labelTextAlternateLineTotal.Visible = true; + } + + private int ShowSubtitle() + { + if (_splitDualSami) + { + return UiUtil.ShowSubtitle(_subtitle, _subtitleAlternate, mediaPlayer); + } + + if (SubtitleListview1.IsAlternateTextColumnVisible && Configuration.Settings.General.ShowOriginalAsPreviewIfAvailable) + { + return UiUtil.ShowSubtitle(_subtitleAlternate, mediaPlayer); + } + + return UiUtil.ShowSubtitle(_subtitle, mediaPlayer); + } + + private static void TryLoadIcon(ToolStripButton button, string iconName) + { + string fullPath = Configuration.IconsDirectory + iconName + ".png"; + if (File.Exists(fullPath)) + { + button.Image = new Bitmap(fullPath); + } + } + + private void InitializeToolbar() + { + var gs = Configuration.Settings.General; + + TryLoadIcon(toolStripButtonFileNew, "New"); + TryLoadIcon(toolStripButtonFileOpen, "Open"); + TryLoadIcon(toolStripButtonSave, "Save"); + TryLoadIcon(toolStripButtonSaveAs, "SaveAs"); + TryLoadIcon(toolStripButtonFind, "Find"); + TryLoadIcon(toolStripButtonReplace, "Replace"); + TryLoadIcon(toolStripButtonFixCommonErrors, "FixCommonErrors"); + TryLoadIcon(toolStripButtonRemoveTextForHi, "RemoveTextForHi"); + TryLoadIcon(toolStripButtonVisualSync, "VisualSync"); + TryLoadIcon(toolStripButtonSpellCheck, "SpellCheck"); + TryLoadIcon(toolStripButtonNetflixQualityCheck, "NetflixGlyphCheck"); + TryLoadIcon(toolStripButtonSettings, "Settings"); + TryLoadIcon(toolStripButtonHelp, "Help"); + + TryLoadIcon(toolStripButtonToggleWaveform, "WaveformToggle"); + TryLoadIcon(toolStripButtonToggleVideo, "VideoToggle"); + + toolStripButtonFileNew.Visible = gs.ShowToolbarNew; + toolStripButtonFileOpen.Visible = gs.ShowToolbarOpen; + toolStripButtonSave.Visible = gs.ShowToolbarSave; + toolStripButtonSaveAs.Visible = gs.ShowToolbarSaveAs; + toolStripButtonFind.Visible = gs.ShowToolbarFind; + toolStripButtonReplace.Visible = gs.ShowToolbarReplace; + toolStripButtonFixCommonErrors.Visible = gs.ShowToolbarFixCommonErrors; + toolStripButtonRemoveTextForHi.Visible = gs.ShowToolbarRemoveTextForHi; + + toolStripButtonVisualSync.Visible = gs.ShowToolbarVisualSync; + toolStripButtonSpellCheck.Visible = gs.ShowToolbarSpellCheck; + toolStripButtonNetflixQualityCheck.Visible = gs.ShowToolbarNetflixGlyphCheck; + toolStripButtonSettings.Visible = gs.ShowToolbarSettings; + toolStripButtonHelp.Visible = gs.ShowToolbarHelp; + + toolStripSeparatorFrameRate.Visible = gs.ShowFrameRate; + toolStripLabelFrameRate.Visible = gs.ShowFrameRate; + toolStripComboBoxFrameRate.Visible = gs.ShowFrameRate; + toolStripButtonGetFrameRate.Visible = gs.ShowFrameRate; + + toolStripSeparatorFindReplace.Visible = gs.ShowToolbarFind || gs.ShowToolbarReplace; + toolStripSeparatorFixSyncSpell.Visible = gs.ShowToolbarFixCommonErrors || gs.ShowToolbarVisualSync || gs.ShowToolbarSpellCheck || gs.ShowToolbarSettings; + toolStripSeparatorHelp.Visible = gs.ShowToolbarHelp; + + toolStrip1.Visible = gs.ShowToolbarNew || gs.ShowToolbarOpen || gs.ShowToolbarSave || gs.ShowToolbarSaveAs || gs.ShowToolbarFind || gs.ShowToolbarReplace || + gs.ShowToolbarFixCommonErrors || gs.ShowToolbarVisualSync || gs.ShowToolbarSpellCheck || gs.ShowToolbarNetflixGlyphCheck || + gs.ShowToolbarSettings || gs.ShowToolbarHelp; + + UpdateNetflixGlyphCheckToolsVisibility(); + } + + private void ToolStripButtonFileNewClick(object sender, EventArgs e) + { + _lastDoNotPrompt = -1; + ReloadFromSourceView(); + FileNew(); + ShowHideTextBasedFeatures(GetCurrentSubtitleFormat()); + } + + private void ToolStripButtonFileOpenClick(object sender, EventArgs e) + { + toolStripButtonFileOpen.Enabled = false; + ReloadFromSourceView(); + OpenNewFile(); + toolStripButtonFileOpen.Enabled = true; + } + + private void ToolStripButtonSaveClick(object sender, EventArgs e) + { + var useOnly0AForNewLine = ModifierKeys == (Keys.Control | Keys.Shift); + SaveAll(useOnly0AForNewLine); + } + + private void SaveAll(bool useOnly0AForNewLine = false) + { + if (!IsSubtitleLoaded) + { + return; + } + + ReloadFromSourceView(); + _disableShowStatus = true; + _saveAsCalled = false; + var result = SaveSubtitle(GetCurrentSubtitleFormat(), useOnly0AForNewLine); + if (result != DialogResult.OK) + { + _disableShowStatus = false; + return; + } + + if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate.Paragraphs.Count > 0) + { + SaveOriginalToolStripMenuItemClick(null, null); + _disableShowStatus = false; + ShowStatus(string.Format(_language.SavedSubtitleX, Path.GetFileName(_fileName)) + " + " + + string.Format(_language.SavedOriginalSubtitleX, Path.GetFileName(_subtitleAlternateFileName))); + return; + } + + _disableShowStatus = false; + ShowStatus(string.Format(_language.SavedSubtitleX, Path.GetFileName(_fileName))); + + if (Configuration.Settings.General.ShowNegativeDurationInfoOnSave) + { + var sb = new StringBuilder(); + for (var index = 0; index < _subtitle.Paragraphs.Count; index++) + { + var p = _subtitle.Paragraphs[index]; + if (p.Duration.TotalMilliseconds < 0) + { + if (sb.Length < 20) + { + if (sb.Length > 0) + { + sb.Append(", "); + } + sb.Append((index + 1).ToString(CultureInfo.InvariantCulture)); + } + else + { + sb.Append("..."); + break; + } + } + } + + if (sb.Length > 0) + { + using (var form = new DialogDoNotShowAgain(Title, string.Format(_language.SubtitleContainsNegativeDurationsX, sb.ToString()))) + { + form.ShowDialog(this); + Configuration.Settings.General.ShowNegativeDurationInfoOnSave = !form.DoNoDisplayAgain; + } + } + } + } + + private void ToolStripButtonSaveAsClick(object sender, EventArgs e) + { + ReloadFromSourceView(); + FileSaveAs(true); + } + + private void ToolStripButtonFindClick(object sender, EventArgs e) + { + ReloadFromSourceView(); + Find(); + } + + private void ToolStripButtonVisualSyncClick(object sender, EventArgs e) + { + ReloadFromSourceView(); + ShowVisualSync(false); + } + + private void ToolStripButtonSettingsClick(object sender, EventArgs e) + { + ReloadFromSourceView(); + ShowSettings(); + } + + private void TextBoxSourceClick(object sender, EventArgs e) + { + ShowSourceLineNumber(); + } + + private void TextBoxSourceKeyDown(object sender, KeyEventArgs e) + { + ShowSourceLineNumber(); + if (e.Modifiers == Keys.Control && e.KeyCode == Keys.A) + { + textBoxSource.SelectAll(); + e.SuppressKeyPress = true; + } + + if (e.Modifiers == Keys.Control && e.KeyCode == Keys.D) + { + textBoxSource.SelectionLength = 0; + e.SuppressKeyPress = true; + } + } + + private void textBoxSource_KeyUp(object sender, KeyEventArgs e) + { + ShowSourceLineNumber(); + } + + private void TextBoxSourceTextChanged(object sender, EventArgs e) + { + ShowSourceLineNumber(); + _sourceViewChange = true; + labelStatus.Text = string.Empty; + } + + private bool ShowProfileInStatusBar => Configuration.Settings.General.CurrentProfile != "Default"; + + private void ShowSourceLineNumber() + { + if (tabControlSubtitle.SelectedIndex == TabControlSourceView) + { + var profile = Configuration.Settings.General.CurrentProfile + " "; + if (!ShowProfileInStatusBar) + { + profile = string.Empty; + } + + toolStripSelected.Text = profile + string.Format(_language.LineNumberX, textBoxSource.GetLineFromCharIndex(textBoxSource.SelectionStart) + 1); + } + } + + private void ButtonGetFrameRateClick(object sender, EventArgs e) + { + openFileDialog1.Title = _language.OpenVideoFile; + openFileDialog1.FileName = string.Empty; + openFileDialog1.Filter = Utilities.GetVideoFileFilter(false); + if (openFileDialog1.ShowDialog(this) == DialogResult.OK) + { + VideoFileName = openFileDialog1.FileName; + var info = UiUtil.GetVideoInfo(openFileDialog1.FileName); + if (info != null && info.Success) + { + string oldFrameRate = toolStripComboBoxFrameRate.Text; + toolStripComboBoxFrameRate.Text = string.Format("{0:0.###}", info.FramesPerSecond); + + if (oldFrameRate != toolStripComboBoxFrameRate.Text) + { + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + } + } + } + } + + private void FindToolStripMenuItemClick(object sender, EventArgs e) + { + ReloadFromSourceView(); + Find(); + } + + private void Find() + { + string selectedText; + if (tabControlSubtitle.SelectedIndex == TabControlSourceView) + { + selectedText = textBoxSource.SelectedText; + } + else + { + if (textBoxListViewTextAlternate.Focused) + { + selectedText = textBoxListViewTextAlternate.SelectedText; + } + else + { + selectedText = textBoxListViewText.SelectedText; + } + } + + if (selectedText.Length == 0 && _findHelper != null) + { + if (_clearLastFind) + { + _clearLastFind = false; + _findHelper.FindReplaceType.FindType = _clearLastFindType; + selectedText = _clearLastFindText; + } + else + { + selectedText = _findHelper.FindText; + } + } + + using (var findDialog = new FindDialog(_subtitle)) + { + findDialog.SetIcon(toolStripButtonFind.Image as Bitmap); + findDialog.Initialize(selectedText, _findHelper); + if (findDialog.ShowDialog(this) != DialogResult.OK) + { + if (_findHelper != null) + { + _findHelper.InProgress = false; + } + + return; + } + + _findHelper = findDialog.GetFindDialogHelper(_subtitleListViewIndex); + _findHelper.InProgress = true; + if (!string.IsNullOrWhiteSpace(_findHelper.FindText)) + { + if (Configuration.Settings.Tools.FindHistory.Count == 0 || Configuration.Settings.Tools.FindHistory[0] != _findHelper.FindText) + { + Configuration.Settings.Tools.FindHistory.Insert(0, _findHelper.FindText); + } + } + + ShowStatus(string.Format(_language.SearchingForXFromLineY, _findHelper.FindText, _subtitleListViewIndex + 1)); + if (tabControlSubtitle.SelectedIndex == TabControlListView) + { + var tb = GetFindReplaceTextBox(); + int startPos = tb.SelectedText.Length > 0 ? tb.SelectionStart + 1 : tb.SelectionStart; + bool found = _findHelper.Find(_subtitle, _subtitleAlternate, _subtitleListViewIndex, startPos); + tb = GetFindReplaceTextBox(); + //if we fail to find the text, we might want to start searching from the top of the file. + if (!found && _findHelper.StartLineIndex >= 1) + { + if (MessageBox.Show(_language.FindContinue, _language.FindContinueTitle, MessageBoxButtons.YesNoCancel) == DialogResult.Yes) + { + found = _findHelper.Find(_subtitle, _subtitleAlternate, -1); + } + } + + if (found) + { + SubtitleListview1.SelectIndexAndEnsureVisible(_findHelper.SelectedIndex, true); + tb.Focus(); + tb.SelectionStart = _findHelper.SelectedPosition; + tb.SelectionLength = _findHelper.FindTextLength; + ShowStatus(string.Format(_language.XFoundAtLineNumberY, _findHelper.FindText, _findHelper.SelectedIndex + 1)); + _findHelper.SelectedPosition++; + } + else + { + ShowStatus(string.Format(_language.XNotFound, _findHelper.FindText)); + } + } + else if (tabControlSubtitle.SelectedIndex == TabControlSourceView) + { + if (_findHelper.Find(textBoxSource, textBoxSource.SelectionStart)) + { + textBoxSource.SelectionStart = _findHelper.SelectedIndex; + textBoxSource.SelectionLength = _findHelper.FindTextLength; + textBoxSource.ScrollToCaret(); + ShowStatus(string.Format(_language.XFoundAtLineNumberY, _findHelper.FindText, textBoxSource.GetLineFromCharIndex(textBoxSource.SelectionStart))); + } + else + { + ShowStatus(string.Format(_language.XNotFound, _findHelper.FindText)); + } + } + } + + if (_findHelper != null) + { + _findHelper.InProgress = false; + } + } + + private void FindNextToolStripMenuItemClick(object sender, EventArgs e) + { + ReloadFromSourceView(); + FindNext(); + } + + private SETextBox GetFindReplaceTextBox() + { + return _findHelper.MatchInOriginal ? textBoxListViewTextAlternate : textBoxListViewText; + } + + private void FindNext() + { + if (_findHelper != null) + { + _findHelper.InProgress = true; + var tb = GetFindReplaceTextBox(); + if (tabControlSubtitle.SelectedIndex == TabControlListView) + { + int selectedIndex = -1; + if (SubtitleListview1.SelectedItems.Count > 0) + { + selectedIndex = SubtitleListview1.SelectedItems[0].Index; + } + + int textBoxStart = tb.SelectionStart; + if (_findHelper.SelectedPosition - 1 == tb.SelectionStart && tb.SelectionLength > 0 || + _findHelper.FindText.Equals(tb.SelectedText, StringComparison.OrdinalIgnoreCase)) + { + textBoxStart = tb.SelectionStart + 1; + } + + if (_findHelper.FindNext(_subtitle, _subtitleAlternate, selectedIndex, textBoxStart, Configuration.Settings.General.AllowEditOfOriginalSubtitle)) + { + tb = GetFindReplaceTextBox(); + SubtitleListview1.SelectIndexAndEnsureVisible(_findHelper.SelectedIndex, true); + ShowStatus(string.Format(_language.XFoundAtLineNumberY, _findHelper.FindText, _findHelper.SelectedIndex + 1)); + tb.Focus(); + tb.SelectionStart = _findHelper.SelectedPosition; + tb.SelectionLength = _findHelper.FindTextLength; + _findHelper.SelectedPosition++; + } + else + { + if (_findHelper.StartLineIndex >= 1) + { + if (MessageBox.Show(_language.FindContinue, _language.FindContinueTitle, MessageBoxButtons.YesNoCancel) == DialogResult.Yes) + { + _findHelper.StartLineIndex = 0; + if (_findHelper.Find(_subtitle, _subtitleAlternate, 0)) + { + SubtitleListview1.SelectIndexAndEnsureVisible(_findHelper.SelectedIndex, true); + tb.Focus(); + tb.SelectionStart = _findHelper.SelectedPosition; + tb.SelectionLength = _findHelper.FindTextLength; + ShowStatus(string.Format(_language.XFoundAtLineNumberY, _findHelper.FindText, _findHelper.SelectedIndex + 1)); + _findHelper.SelectedPosition++; + return; + } + } + } + + ShowStatus(string.Format(_language.XNotFound, _findHelper.FindText)); + } + } + else if (tabControlSubtitle.SelectedIndex == TabControlSourceView) + { + if (_findHelper.FindNext(textBoxSource.Text, textBoxSource.SelectionStart)) + { + textBoxSource.SelectionStart = _findHelper.SelectedIndex; + textBoxSource.SelectionLength = _findHelper.FindTextLength; + textBoxSource.ScrollToCaret(); + ShowStatus(string.Format(_language.XFoundAtLineNumberY, _findHelper.FindText, textBoxSource.GetLineFromCharIndex(textBoxSource.SelectionStart))); + } + else + { + ShowStatus(string.Format(_language.XNotFound, _findHelper.FindText)); + } + } + } + else + { + Find(); + } + + if (_findHelper != null) + { + _findHelper.InProgress = false; + } + } + + private void FindPrevious() + { + if (_findHelper == null) + { + return; + } + + _findHelper.InProgress = true; + var tb = GetFindReplaceTextBox(); + if (tabControlSubtitle.SelectedIndex == TabControlListView) + { + int selectedIndex = -1; + if (SubtitleListview1.SelectedItems.Count > 0) + { + selectedIndex = SubtitleListview1.SelectedItems[0].Index; + } + + int textBoxStart = tb.SelectionStart; + if (_findHelper.SelectedPosition - 1 == tb.SelectionStart && tb.SelectionLength > 0 || + _findHelper.FindText.Equals(tb.SelectedText, StringComparison.OrdinalIgnoreCase)) + { + textBoxStart = tb.SelectionStart - 1; + } + + if (_findHelper.FindPrevious(_subtitle, _subtitleAlternate, selectedIndex, textBoxStart, Configuration.Settings.General.AllowEditOfOriginalSubtitle)) + { + tb = GetFindReplaceTextBox(); + SubtitleListview1.SelectIndexAndEnsureVisible(_findHelper.SelectedIndex, true); + ShowStatus(string.Format(_language.XFoundAtLineNumberY, _findHelper.FindText, _findHelper.SelectedIndex + 1)); + tb.Focus(); + tb.SelectionStart = _findHelper.SelectedPosition; + tb.SelectionLength = _findHelper.FindTextLength; + _findHelper.SelectedPosition--; + } + else + { + ShowStatus(string.Format(_language.XNotFound, _findHelper.FindText)); + } + } + else if (tabControlSubtitle.SelectedIndex == TabControlSourceView) + { + if (_findHelper.FindPrevious(textBoxSource.Text, textBoxSource.SelectionStart)) + { + textBoxSource.SelectionStart = _findHelper.SelectedIndex; + textBoxSource.SelectionLength = _findHelper.FindTextLength; + textBoxSource.ScrollToCaret(); + ShowStatus(string.Format(_language.XFoundAtLineNumberY, _findHelper.FindText, textBoxSource.GetLineFromCharIndex(textBoxSource.SelectionStart))); + } + else + { + ShowStatus(string.Format(_language.XNotFound, _findHelper.FindText)); + } + } + + _findHelper.InProgress = false; + } + + private void ToolStripButtonReplaceClick(object sender, EventArgs e) + { + ReloadFromSourceView(); + Replace(null); + } + + private void ReplaceToolStripMenuItemClick(object sender, EventArgs e) + { + ReloadFromSourceView(); + Replace(null); + } + + private void ReplaceSourceView(ReplaceDialog replaceDialog) + { + bool isFirst = true; + string selectedText = textBoxSource.SelectedText; + if (selectedText.Length == 0 && _findHelper != null) + { + selectedText = _findHelper.FindText; + } + + if (replaceDialog == null) + { + replaceDialog = new ReplaceDialog(); + replaceDialog.SetIcon(toolStripButtonReplace.Image as Bitmap); + _findHelper = _findHelper ?? replaceDialog.GetFindDialogHelper(_subtitleListViewIndex); + } + else + { + isFirst = false; + } + + replaceDialog.Initialize(selectedText, _findHelper); + if (replaceDialog.ShowDialog(this) == DialogResult.OK) + { + _findHelper = replaceDialog.GetFindDialogHelper(_subtitleListViewIndex); + ShowStatus(string.Format(_language.SearchingForXFromLineY, _findHelper.FindText, _subtitleListViewIndex + 1)); + if (replaceDialog.ReplaceAll) + { + SourceListReplaceAll(replaceDialog, _findHelper); + return; + } + + int replaceCount = 0; + var searchStringFound = false; + int start = textBoxSource.SelectionStart; + if (isFirst) + { + MakeHistoryForUndo(string.Format(_language.BeforeReplace, _findHelper.FindText)); + _makeHistoryPaused = true; + if (start >= 0) + { + start--; + } + } + else + { + if (textBoxSource.SelectionLength > 0 && start > 0 && !replaceDialog.FindOnly) + { + start--; + } + } + + if (_findHelper.FindNext(textBoxSource.Text, start)) + { + textBoxSource.SelectionStart = _findHelper.SelectedIndex; + textBoxSource.SelectionLength = _findHelper.FindTextLength; + if (!replaceDialog.FindOnly) + { + textBoxSource.SelectedText = _findHelper.ReplaceText; + } + + textBoxSource.ScrollToCaret(); + + replaceCount++; + searchStringFound = true; + + if (!replaceDialog.FindOnly) + { + if (_findHelper.FindNext(textBoxSource.Text, start)) + { + textBoxSource.SelectionStart = _findHelper.SelectedIndex; + textBoxSource.SelectionLength = _findHelper.FindTextLength; + textBoxSource.ScrollToCaret(); + } + + Replace(replaceDialog); + return; + } + } + + if (replaceDialog.FindOnly) + { + if (searchStringFound) + { + ShowStatus(string.Format(_language.MatchFoundX, _findHelper.FindText)); + } + else + { + ShowStatus(string.Format(_language.NoMatchFoundX, _findHelper.FindText)); + } + + Replace(replaceDialog); + return; + } + + ReloadFromSourceView(); + if (replaceCount == 0) + { + ShowStatus(_language.FoundNothingToReplace); + } + else + { + ShowStatus(string.Format(_language.ReplaceCountX, replaceCount)); + } + } + + if (_makeHistoryPaused) + { + RestartHistory(); + } + + replaceDialog.Dispose(); + } + + private void SourceListReplaceAll(ReplaceDialog replaceDialog, FindReplaceDialogHelper findHelper) + { + if (_findHelper.FindReplaceType.FindType == FindType.RegEx) + { + SourceListReplaceAllRegEx(replaceDialog); + return; + } + + int replaceCount = 0; + bool searchStringFound = true; + int start = textBoxSource.SelectionStart; + bool isFirst = true; + string text = textBoxSource.Text; + while (searchStringFound) + { + searchStringFound = false; + if (isFirst) + { + MakeHistoryForUndo(string.Format(_language.BeforeReplace, _findHelper.FindText)); + isFirst = false; + _makeHistoryPaused = true; + if (start >= 0) + { + start--; + } + } + else + { + start--; + } + + if (_findHelper.FindNext(text, start)) + { + text = text.Remove(findHelper.SelectedIndex, findHelper.FindTextLength).Insert(findHelper.SelectedIndex, findHelper.ReplaceText); + start = findHelper.SelectedIndex + findHelper.FindTextLength; + replaceCount++; + searchStringFound = true; + } + } + + textBoxSource.Text = text; + ReloadFromSourceView(); + if (replaceCount == 0) + { + ShowStatus(_language.FoundNothingToReplace); + } + else + { + ShowStatus(string.Format(_language.ReplaceCountX, replaceCount)); + } + + if (_makeHistoryPaused) + { + RestartHistory(); + } + + replaceDialog.Dispose(); + } + + private void SourceListReplaceAllRegEx(ReplaceDialog replaceDialog) + { + var start = textBoxSource.SelectionStart; + var s = textBoxSource.Text; + var r = new Regex(_findHelper.FindText, RegexOptions.Multiline); + var matches = r.Matches(s, start); + + if (matches.Count > 0) + { + MakeHistoryForUndo(string.Format(_language.BeforeReplace, _findHelper.FindText)); + } + + var result = RegexUtils.ReplaceNewLineSafe(r, s, _findHelper.ReplaceText, int.MaxValue, start); + + // update UI + textBoxSource.Text = result; + ShowStatus(matches.Count == 0 ? _language.FoundNothingToReplace : string.Format(_language.ReplaceCountX, matches.Count)); + + // replace again from beginning + if (start > 1) + { + string msgText = _language.ReplaceContinueNotFound; + if (matches.Count > 0) + { + msgText = string.Format(_language.ReplaceXContinue, matches.Count); + } + + if (MessageBox.Show(msgText, _language.ReplaceContinueTitle, MessageBoxButtons.YesNoCancel) == DialogResult.Yes) + { + s = result.Substring(0, start - 1); + var rest = result.Remove(0, start - 1); + if (s.EndsWith('\r') && rest.StartsWith('\n')) + { // don't split "\r\n" + s = s.Substring(0, s.Length - 1); + rest = '\r' + rest; + } + + matches = r.Matches(s); + result = RegexUtils.ReplaceNewLineSafe(r, s, _findHelper.ReplaceText); + + // update UI + textBoxSource.Text = result + rest; + ShowStatus(matches.Count == 0 ? _language.FoundNothingToReplace : string.Format(_language.ReplaceCountX, matches.Count)); + } + } + + replaceDialog.Dispose(); + ReloadFromSourceView(); + } + + private void ReplaceListView(ReplaceDialog replaceDialog) + { + SaveSubtitleListviewIndices(); + int firstIndex = FirstSelectedIndex; + bool isFirst = true; + string selectedText; + if (textBoxListViewTextAlternate.Focused) + { + selectedText = textBoxListViewTextAlternate.SelectedText; + } + else + { + selectedText = textBoxListViewText.SelectedText; + } + + if (selectedText.Length == 0 && _findHelper != null) + { + selectedText = _findHelper.FindText; + } + + if (replaceDialog == null) + { + replaceDialog = new ReplaceDialog(); + replaceDialog.SetIcon(toolStripButtonReplace.Image as Bitmap); + _findHelper = _findHelper ?? replaceDialog.GetFindDialogHelper(_subtitleListViewIndex); + _findHelper.InProgress = true; + int index = 0; + + if (SubtitleListview1.SelectedItems.Count > 0) + { + index = SubtitleListview1.SelectedItems[0].Index; + } + + _findHelper.SelectedIndex = index; + if (textBoxListViewTextAlternate.Focused) + { + _findHelper.SelectedPosition = textBoxListViewTextAlternate.SelectionStart; + _findHelper.ReplaceFromPosition = _findHelper.SelectedPosition; + } + else + { + _findHelper.SelectedPosition = textBoxListViewText.SelectionStart; + _findHelper.ReplaceFromPosition = _findHelper.SelectedPosition; + } + + _replaceStartLineIndex = index; + } + else + { + isFirst = false; + if (_findHelper != null) + { + selectedText = _findHelper.FindText; + _findHelper.InProgress = true; + } + + } + + replaceDialog.Initialize(selectedText, _findHelper); + if (replaceDialog.ShowDialog(this) == DialogResult.OK) + { + if (_findHelper == null) + { + _findHelper = replaceDialog.GetFindDialogHelper(_subtitleListViewIndex); + _findHelper.InProgress = true; + } + else + { + int line = _findHelper.SelectedIndex; + int pos = _findHelper.ReplaceFromPosition; + bool success = _findHelper.Success; + var matchInOriginal = _findHelper.MatchInOriginal; + _findHelper = replaceDialog.GetFindDialogHelper(_subtitleListViewIndex); + _findHelper.SelectedIndex = line; + _findHelper.SelectedPosition = pos; + _findHelper.Success = success; + _findHelper.MatchInOriginal = matchInOriginal; + _findHelper.InProgress = true; + } + + ShowStatus(string.Format(_language.SearchingForXFromLineY, _findHelper.FindText, _subtitleListViewIndex + 1)); + int replaceCount = 0; + bool searchStringFound = true; + int stopAtIndex = int.MaxValue; + while (searchStringFound) + { + searchStringFound = false; + if (isFirst) + { + MakeHistoryForUndo(string.Format(_language.BeforeReplace, _findHelper.FindText)); + isFirst = false; + _makeHistoryPaused = true; + } + + if (replaceDialog.ReplaceAll) + { + if (_findHelper.FindNext(_subtitle, _subtitleAlternate, _findHelper.SelectedIndex, _findHelper.SelectedPosition, Configuration.Settings.General.AllowEditOfOriginalSubtitle)) + { + if (_findHelper.SelectedIndex > stopAtIndex) + { + break; + } + + SetTextForFindAndReplace(true, replaceDialog.ReplaceAll); + searchStringFound = true; + replaceCount++; + } + else + { + textBoxListViewText.Visible = true; + _subtitleListViewIndex = -1; + if (firstIndex >= 0 && firstIndex < SubtitleListview1.Items.Count) + { + SubtitleListview1.Items[firstIndex].Selected = true; + SubtitleListview1.Items[firstIndex].Focused = true; + SubtitleListview1.Focus(); + textBoxListViewText.Text = _subtitle.Paragraphs[firstIndex].Text; + if (_subtitleAlternate != null && textBoxListViewTextAlternate.Visible) + { + var orginial = Utilities.GetOriginalParagraph(_findHelper.SelectedIndex, _subtitle.Paragraphs[_findHelper.SelectedIndex], _subtitleAlternate.Paragraphs); + if (orginial != null) + { + textBoxListViewTextAlternate.Text = orginial.Text; + } + } + } + else + { + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + } + + ShowStatus(string.Format(_language.NoMatchFoundX, _findHelper.FindText)); + + if (_replaceStartLineIndex >= 1) // Prompt for start over + { + _replaceStartLineIndex = 0; + string msgText = _language.ReplaceContinueNotFound; + if (replaceCount > 0) + { + msgText = string.Format(_language.ReplaceXContinue, replaceCount); + } + + if (MessageBox.Show(msgText, _language.ReplaceContinueTitle, MessageBoxButtons.YesNoCancel) == DialogResult.Yes) + { + stopAtIndex = firstIndex; + _findHelper.MatchInOriginal = false; + _findHelper.StartLineIndex = 0; + _findHelper.SelectedIndex = 0; + _findHelper.SelectedPosition = 0; + _findHelper.ReplaceFromPosition = 0; + SetTextForFindAndReplace(false, replaceDialog.ReplaceAll); + + if (_findHelper.FindNext(_subtitle, _subtitleAlternate, _findHelper.SelectedIndex, _findHelper.SelectedPosition, Configuration.Settings.General.AllowEditOfOriginalSubtitle)) + { + SetTextForFindAndReplace(true, replaceDialog.ReplaceAll); + _findHelper.SelectedPosition += _findHelper.ReplaceText.Length; + _findHelper.ReplaceFromPosition = _findHelper.SelectedPosition; + searchStringFound = true; + replaceCount++; + } + } + } + } + } + else if (replaceDialog.FindOnly) + { + if (_findHelper.FindNext(_subtitle, _subtitleAlternate, _findHelper.SelectedIndex, _findHelper.SelectedPosition, Configuration.Settings.General.AllowEditOfOriginalSubtitle)) + { + var tb = GetFindReplaceTextBox(); + SubtitleListview1.SelectIndexAndEnsureVisible(_findHelper.SelectedIndex, true); + tb.Focus(); + tb.SelectionStart = _findHelper.SelectedPosition; + tb.SelectionLength = _findHelper.FindTextLength; + _findHelper.ReplaceFromPosition = _findHelper.SelectedPosition; + _findHelper.SelectedPosition += _findHelper.FindTextLength; + ShowStatus(string.Format(_language.NoXFoundAtLineY, _findHelper.SelectedIndex + 1, _findHelper.FindText)); + Replace(replaceDialog); + if (replaceDialog != null && !replaceDialog.IsDisposed) + { + replaceDialog.Dispose(); + } + + _findHelper.InProgress = false; + return; + } + + if (_replaceStartLineIndex >= 1) // Prompt for start over + { + _replaceStartLineIndex = 0; + if (MessageBox.Show(_language.FindContinue, _language.FindContinueTitle, MessageBoxButtons.YesNoCancel) == DialogResult.Yes) + { + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + _findHelper.StartLineIndex = 0; + _findHelper.SelectedIndex = 0; + _findHelper.SelectedPosition = 0; + _findHelper.ReplaceFromPosition = 0; + if (_findHelper.FindNext(_subtitle, _subtitleAlternate, _findHelper.SelectedIndex, _findHelper.SelectedPosition, Configuration.Settings.General.AllowEditOfOriginalSubtitle)) + { + var tb = GetFindReplaceTextBox(); + SubtitleListview1.SelectIndexAndEnsureVisible(_findHelper.SelectedIndex, true); + tb.Focus(); + tb.SelectionStart = _findHelper.SelectedPosition; + tb.SelectionLength = _findHelper.FindTextLength; + _findHelper.ReplaceFromPosition = _findHelper.SelectedPosition; + _findHelper.SelectedPosition += _findHelper.FindTextLength; + ShowStatus(string.Format(_language.NoXFoundAtLineY, _findHelper.SelectedIndex + 1, _findHelper.FindText)); + Replace(replaceDialog); + if (replaceDialog != null) + { + replaceDialog.Dispose(); + } + + _findHelper.InProgress = false; + return; + } + } + else + { + if (replaceDialog != null && !replaceDialog.IsDisposed) + { + replaceDialog.Dispose(); + } + + _findHelper.InProgress = false; + return; + } + } + + ShowStatus(string.Format(_language.NoMatchFoundX, _findHelper.FindText)); + } + else if (!replaceDialog.FindOnly) // replace once only + { + var tb = GetFindReplaceTextBox(); + string msg = string.Empty; + if (_findHelper.FindReplaceType.FindType == FindType.RegEx) + { + if (_findHelper.Success) + { + if (_findHelper.FindReplaceType.FindType == FindType.RegEx) + { + ReplaceViaRegularExpression(tb, replaceDialog.ReplaceAll); + } + else + { + tb.SelectedText = _findHelper.ReplaceText; + } + + msg = _language.OneReplacementMade + " "; + } + } + else if (tb.SelectionLength == _findHelper.FindTextLength) + { + tb.SelectedText = _findHelper.ReplaceText; + msg = _language.OneReplacementMade + " "; + _findHelper.SelectedPosition += _findHelper.ReplaceText.Length; + } + + if (_findHelper.FindNext(_subtitle, _subtitleAlternate, _findHelper.SelectedIndex, _findHelper.SelectedPosition, Configuration.Settings.General.AllowEditOfOriginalSubtitle)) + { + SubtitleListview1.SelectIndexAndEnsureVisible(_findHelper.SelectedIndex, true); + tb = GetFindReplaceTextBox(); + tb.Focus(); + tb.SelectionStart = _findHelper.SelectedPosition; + tb.SelectionLength = _findHelper.FindTextLength; + if (_findHelper.FindReplaceType.FindType != FindType.RegEx) + { + _findHelper.SelectedPosition += _findHelper.ReplaceText.Length; + } + + ShowStatus(string.Format(msg + _language.XFoundAtLineNumberY, _findHelper.FindText, _findHelper.SelectedIndex + 1)); + } + else + { + ShowStatus(msg + string.Format(_language.XNotFound, _findHelper.FindText)); + + // Prompt for start over + if (_replaceStartLineIndex >= 1) + { + _replaceStartLineIndex = 0; + if (MessageBox.Show(_language.FindContinue, _language.FindContinueTitle, MessageBoxButtons.YesNoCancel) == DialogResult.Yes) + { + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + _findHelper.StartLineIndex = 0; + _findHelper.SelectedIndex = 0; + _findHelper.SelectedPosition = 0; + _findHelper.ReplaceFromPosition = 0; + if (_findHelper.FindNext(_subtitle, _subtitleAlternate, _findHelper.SelectedIndex, _findHelper.SelectedPosition, Configuration.Settings.General.AllowEditOfOriginalSubtitle)) + { + SubtitleListview1.SelectIndexAndEnsureVisible(_findHelper.SelectedIndex, true); + tb = GetFindReplaceTextBox(); + tb.Focus(); + tb.SelectionStart = _findHelper.SelectedPosition; + tb.SelectionLength = _findHelper.FindTextLength; + _findHelper.SelectedPosition += _findHelper.ReplaceText.Length; + ShowStatus(string.Format(msg + _language.XFoundAtLineNumberY, _findHelper.FindText, _findHelper.SelectedIndex + 1)); + } + } + else + { + if (replaceDialog != null && !replaceDialog.IsDisposed) + { + replaceDialog.Dispose(); + } + + _findHelper.InProgress = false; + return; + } + } + else + { + if (replaceDialog != null && !replaceDialog.IsDisposed) + { + replaceDialog.Dispose(); + } + + _findHelper.InProgress = false; + return; + } + } + + Replace(replaceDialog); + if (replaceDialog != null && !replaceDialog.IsDisposed) + { + replaceDialog.Dispose(); + } + + _findHelper.InProgress = false; + return; + } + + if (_findHelper.SelectedIndex > stopAtIndex) + { + break; + } + } + + ShowSource(); + if (replaceCount == 0) + { + ShowStatus(_language.FoundNothingToReplace); + } + else + { + ShowStatus(string.Format(_language.ReplaceCountX, replaceCount)); + SubtitleListview1.SyntaxColorAllLines(_subtitle); + } + } + + RestoreSubtitleListviewIndices(); + if (_makeHistoryPaused) + { + RestartHistory(); + } + + replaceDialog.Dispose(); + _findHelper.InProgress = false; + } + + private void ReplaceViaRegularExpression(SETextBox tb, bool replaceAll) + { + var r = new Regex(RegexUtils.FixNewLine(_findHelper.FindText), RegexOptions.Multiline); + if (replaceAll) + { + string result = RegexUtils.ReplaceNewLineSafe(r, tb.Text, _findHelper.ReplaceText); + if (result != tb.Text) + { + tb.Text = result; + } + + _findHelper.SelectedPosition = tb.Text.Length; + _findHelper.ReplaceFromPosition = _findHelper.SelectedPosition; + } + else + { + string result = RegexUtils.ReplaceNewLineSafe(r, tb.Text, _findHelper.ReplaceText, 1, _findHelper.SelectedPosition); + if (result != tb.Text) + { + var match = r.Match(string.Join(Environment.NewLine, tb.Text.SplitToLines())); + if (match != null && match.Success && !_findHelper.FindText.StartsWith('^') && _findHelper.ReplaceText.Length > 0) + { + var add = Math.Abs(match.Length - _findHelper.ReplaceText.Length); + _findHelper.SelectedPosition += add; + _findHelper.ReplaceFromPosition = _findHelper.SelectedPosition; + } + + tb.Text = result; + } + + if (_findHelper.FindText.StartsWith('^')) + { + _findHelper.SelectedPosition++; + } + } + } + + private void SetTextForFindAndReplace(bool replace, bool replaceAll) + { + _subtitleListViewIndex = _findHelper.SelectedIndex; + textBoxListViewText.Text = _subtitle.Paragraphs[_findHelper.SelectedIndex].Text; + if (_subtitleAlternate != null && textBoxListViewTextAlternate.Visible) + { + var orginial = Utilities.GetOriginalParagraph(_findHelper.SelectedIndex, _subtitle.Paragraphs[_findHelper.SelectedIndex], _subtitleAlternate.Paragraphs); + if (orginial != null) + { + textBoxListViewTextAlternate.Text = orginial.Text; + } + } + + if (replace) + { + var tb = GetFindReplaceTextBox(); + tb.SelectionStart = _findHelper.SelectedPosition; + tb.SelectionLength = _findHelper.FindTextLength; + if (_findHelper.FindReplaceType.FindType == FindType.RegEx) + { + ReplaceViaRegularExpression(tb, replaceAll); + _findHelper.SelectedPosition += _findHelper.FindTextLength; + _findHelper.ReplaceFromPosition = _findHelper.SelectedPosition; + } + else + { + tb.SelectedText = _findHelper.ReplaceText; + _findHelper.SelectedPosition += _findHelper.ReplaceText.Length; + _findHelper.ReplaceFromPosition = _findHelper.SelectedPosition; + } + } + } + + private void Replace(ReplaceDialog replaceDialog) + { + if (tabControlSubtitle.SelectedIndex == TabControlSourceView) + { + ReplaceSourceView(replaceDialog); + } + else + { + ReplaceListView(replaceDialog); + } + } + + public void ShowStatus(string message, bool log = true) + { + if (_disableShowStatus) + { + return; + } + + labelStatus.Text = message.Replace("&", "&&"); + statusStrip1.Refresh(); + if (!string.IsNullOrEmpty(message)) + { + _timerClearStatus.Stop(); + if (log) + { + _timerClearStatus.Interval = Configuration.Settings.General.ClearStatusBarAfterSeconds * 1000; + _statusLog.Add(string.Format("{0:0000}-{1:00}-{2:00} {3}: {4}", DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.ToLongTimeString(), message)); + } + else + { + _timerClearStatus.Interval = 1500; + } + _timerClearStatus.Start(); + } + ShowSourceLineNumber(); + ShowLineInformationListView(); + } + + private void ReloadFromSourceView() + { + if (_sourceViewChange) + { + SaveSubtitleListviewIndices(); + if (!string.IsNullOrWhiteSpace(textBoxSource.Text)) + { + var oldSubtitle = new Subtitle(_subtitle); + var format = GetCurrentSubtitleFormat(); + var list = textBoxSource.Lines.ToList(); + format = new Subtitle().ReloadLoadSubtitle(list, null, format); + if (format == null) + { + MessageBox.Show(_language.UnableToParseSourceView); + return; + } + + _sourceViewChange = false; + MakeHistoryForUndo(_language.BeforeChangesMadeInSourceView); + _subtitle.ReloadLoadSubtitle(list, null, format); + + int index = 0; + foreach (string formatName in comboBoxSubtitleFormats.Items) + { + if (formatName == format.FriendlyName) + { + comboBoxSubtitleFormats.SelectedIndex = index; + break; + } + + index++; + } + + for (int i = 0; i < oldSubtitle.Paragraphs.Count; i++) + { + if (oldSubtitle.Paragraphs[i].Bookmark != null) + { + var newParagraph = _subtitle.GetFirstAlike(oldSubtitle.Paragraphs[i]); + if (newParagraph != null) + { + newParagraph.Bookmark = oldSubtitle.Paragraphs[i].Bookmark; + } + } + } + + if (Configuration.Settings.General.CurrentVideoOffsetInMs != 0) + { + _subtitle.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(-Configuration.Settings.General.CurrentVideoOffsetInMs)); + } + + var formatType = format.GetType(); + if (formatType == typeof(AdvancedSubStationAlpha) || formatType == typeof(SubStationAlpha)) + { + string errors = AdvancedSubStationAlpha.CheckForErrors(_subtitle.Header); + if (!string.IsNullOrEmpty(errors)) + { + MessageBox.Show(errors, Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + } + else if (formatType == typeof(SubRip)) + { + string errors = (format as SubRip).Errors; + if (!string.IsNullOrEmpty(errors)) + { + MessageBox.Show(errors, Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + } + else if (formatType == typeof(MicroDvd)) + { + string errors = (format as MicroDvd).Errors; + if (!string.IsNullOrEmpty(errors)) + { + MessageBox.Show(errors, Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + } + else if (formatType == typeof(DCinemaSmpte2007)) + { + format.ToText(_subtitle, string.Empty); + string errors = (format as DCinemaSmpte2007).Errors; + if (!string.IsNullOrEmpty(errors)) + { + MessageBox.Show(errors, Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + } + else if (formatType == typeof(DCinemaSmpte2010)) + { + format.ToText(_subtitle, string.Empty); + string errors = (format as DCinemaSmpte2010).Errors; + if (!string.IsNullOrEmpty(errors)) + { + MessageBox.Show(errors, Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + } + else if (formatType == typeof(DCinemaSmpte2014)) + { + format.ToText(_subtitle, string.Empty); + string errors = (format as DCinemaSmpte2014).Errors; + if (!string.IsNullOrEmpty(errors)) + { + MessageBox.Show(errors, Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + } + } + else + { + _sourceViewChange = false; + MakeHistoryForUndo(_language.BeforeChangesMadeInSourceView); + _sourceViewChange = false; + _subtitle.Paragraphs.Clear(); + } + + _subtitleListViewIndex = -1; + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + } + } + + private void HelpToolStripMenuItem1Click(object sender, EventArgs e) + { + ReloadFromSourceView(); + Utilities.ShowHelp(string.Empty); + } + + private void ToolStripButtonHelpClick(object sender, EventArgs e) + { + ReloadFromSourceView(); + Utilities.ShowHelp(string.Empty); + } + + private void GotoLineNumberToolStripMenuItemClick(object sender, EventArgs e) + { + ReloadFromSourceView(); + if (!IsSubtitleLoaded) + { + DisplaySubtitleNotLoadedMessage(); + return; + } + + using (var goToLine = new GoToLine()) + { + if (tabControlSubtitle.SelectedIndex == TabControlListView) + { + goToLine.Initialize(1, SubtitleListview1.Items.Count); + } + else if (tabControlSubtitle.SelectedIndex == TabControlSourceView) + { + goToLine.Initialize(1, textBoxSource.Lines.Length); + } + + if (goToLine.ShowDialog(this) == DialogResult.OK) + { + if (tabControlSubtitle.SelectedIndex == TabControlListView) + { + SubtitleListview1.SelectedIndexChanged -= SubtitleListview1_SelectedIndexChanged; + SubtitleListview1.SelectNone(); + SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; + + SubtitleListview1.Items[goToLine.LineNumber - 1].Selected = true; + SubtitleListview1.Items[goToLine.LineNumber - 1].EnsureVisible(); + SubtitleListview1.Items[goToLine.LineNumber - 1].Focused = true; + ShowStatus(string.Format(_language.GoToLineNumberX, goToLine.LineNumber)); + } + else if (tabControlSubtitle.SelectedIndex == TabControlSourceView) + { + textBoxSource.SelectionStart = textBoxSource.GetFirstCharIndexFromLine(goToLine.LineNumber - 1); + textBoxSource.SelectionLength = textBoxSource.Lines[goToLine.LineNumber - 1].Length; + textBoxSource.ScrollToCaret(); + ShowSourceLineNumber(); + } + } + } + } + + private void TextBoxSourceLeave(object sender, EventArgs e) + { + ReloadFromSourceView(); + } + + private void AdjustDisplayTimeToolStripMenuItemClick(object sender, EventArgs e) + { + AdjustDisplayTime(false); + } + + private void AdjustDisplayTime(bool onlySelectedLines) + { + if (!IsSubtitleLoaded) + { + DisplaySubtitleNotLoadedMessage(); + return; + } + + ReloadFromSourceView(); + using (var adjustDisplayTime = new AdjustDisplayDuration()) + { + List selectedIndices = null; + if (onlySelectedLines) + { + adjustDisplayTime.Text += " - " + _language.SelectedLines; + selectedIndices = new List(); + foreach (int item in SubtitleListview1.SelectedIndices) + { + selectedIndices.Add(item); + } + } + + if (adjustDisplayTime.ShowDialog(this) == DialogResult.OK) + { + MakeHistoryForUndo(_language.BeforeDisplayTimeAdjustment); + if (adjustDisplayTime.AdjustUsingPercent) + { + double percent = double.Parse(adjustDisplayTime.AdjustValue); + _subtitle.AdjustDisplayTimeUsingPercent(percent, selectedIndices); + ShowStatus(string.Format(_language.DisplayTimesAdjustedX, double.Parse(adjustDisplayTime.AdjustValue, CultureInfo.InvariantCulture) + "%")); + } + else if (adjustDisplayTime.AdjustUsingSeconds) + { + double seconds = double.Parse(adjustDisplayTime.AdjustValue, CultureInfo.InvariantCulture); + _subtitle.AdjustDisplayTimeUsingSeconds(seconds, selectedIndices); + ShowStatus(string.Format(_language.DisplayTimesAdjustedX, double.Parse(adjustDisplayTime.AdjustValue, CultureInfo.InvariantCulture))); + } + else if (adjustDisplayTime.AdjustUsingRecalc) + { + double maxCharSeconds = (double)(adjustDisplayTime.MaxCharactersPerSecond); + _subtitle.RecalculateDisplayTimes(maxCharSeconds, selectedIndices, (double)adjustDisplayTime.OptimalCharactersPerSecond, adjustDisplayTime.ExtendOnly); + ShowStatus(string.Format(_language.DisplayTimesAdjustedX, adjustDisplayTime.AdjustValue)); + } + else + { // fixed duration + _subtitle.SetFixedDuration(selectedIndices, adjustDisplayTime.FixedMilliseconds); + ShowStatus(string.Format(_language.DisplayTimesAdjustedX, adjustDisplayTime.FixedMilliseconds)); + } + + SaveSubtitleListviewIndices(); + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + } + } + } + + private void FixToolStripMenuItemClick(object sender, EventArgs e) + { + if (_networkSession == null) + { + FixCommonErrors(false); + } + } + + private void FixCommonErrors(bool onlySelectedLines) + { + if (IsSubtitleLoaded) + { + ReloadFromSourceView(); + SaveSubtitleListviewIndices(); + using (var fixErrors = new FixCommonErrors()) + { + if (onlySelectedLines) + { + var selectedLines = new Subtitle(); + foreach (int index in SubtitleListview1.SelectedIndices) + { + selectedLines.Paragraphs.Add(_subtitle.Paragraphs[index]); + } + + fixErrors.Initialize(selectedLines, GetCurrentSubtitleFormat(), GetCurrentEncoding()); + } + else + { + fixErrors.Initialize(_subtitle, GetCurrentSubtitleFormat(), GetCurrentEncoding()); + } + + if (fixErrors.ShowDialog(this) == DialogResult.OK) + { + MakeHistoryForUndo(_language.BeforeCommonErrorFixes); + _subtitle.Renumber(); + if (onlySelectedLines) + { + // we only update selected lines + if (_networkSession != null) + { + var deletes = new List(); + _networkSession.TimerStop(); + foreach (int index in SubtitleListview1.SelectedIndices) + { + var pOld = _subtitle.Paragraphs[index]; + var p = fixErrors.FixedSubtitle.GetParagraphOrDefaultById(pOld.Id); + if (p == null) + { + deletes.Add(index); + } + else + { + _subtitle.Paragraphs[index] = p; + SubtitleListview1.SetTimeAndText(index, p, _subtitle.GetParagraphOrDefault(index + 1)); + } + } + + NetworkGetSendUpdates(deletes, 0, null); + } + else + { + var selectedIndices = SubtitleListview1.GetSelectedIndices(); + for (int index = selectedIndices.Length - 1; index >= 0; index--) + { + var idx = selectedIndices[index]; + var pOld = _subtitle.Paragraphs[idx]; + var p = fixErrors.FixedSubtitle.GetParagraphOrDefaultById(pOld.Id); + if (p == null) + { + _subtitle.Paragraphs.RemoveAt(idx); + } + else + { + _subtitle.Paragraphs[idx] = p; + } + } + } + + ShowStatus(_language.CommonErrorsFixedInSelectedLines); + } + else + { + _subtitle.Paragraphs.Clear(); + foreach (var p in fixErrors.FixedSubtitle.Paragraphs) + { + _subtitle.Paragraphs.Add(p); + } + + ShowStatus(_language.CommonErrorsFixed); + } + + _subtitle.Renumber(); + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + } + + Configuration.Settings.CommonErrors.StartSize = fixErrors.Width + ";" + fixErrors.Height; + Configuration.Settings.CommonErrors.StartPosition = fixErrors.Left + ";" + fixErrors.Top; + } + } + else + { + DisplaySubtitleNotLoadedMessage(); + } + + ShowInTaskbar = true; + } + + private void StartNumberingFromToolStripMenuItemClick(object sender, EventArgs e) + { + if (!IsSubtitleLoaded) + { + DisplaySubtitleNotLoadedMessage(); + return; + } + + ReloadFromSourceView(); + using (var startNumberingFrom = new StartNumberingFrom()) + { + if (startNumberingFrom.ShowDialog(this) == DialogResult.OK) + { + SaveSubtitleListviewIndices(); + MakeHistoryForUndo(_language.BeforeRenumbering); + ShowStatus(string.Format(_language.RenumberedStartingFromX, startNumberingFrom.StartFromNumber)); + _subtitle.Renumber(startNumberingFrom.StartFromNumber); + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + } + } + } + + internal void ReloadFromSubtitle(Subtitle subtitle, string messageForUndo) + { + MakeHistoryForUndo(messageForUndo); + _subtitle.Paragraphs.Clear(); + _subtitle.Paragraphs.AddRange(subtitle.Paragraphs); + _subtitleListViewIndex = -1; + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + if (_subtitle.Paragraphs.Count > 0) + { + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + } + } + + private void RemoveTextForHearImpairedToolStripMenuItemClick(object sender, EventArgs e) + { + if (!IsSubtitleLoaded) + { + DisplaySubtitleNotLoadedMessage(); + return; + } + + ReloadFromSourceView(); + using (var removeTextFromHearImpaired = new FormRemoveTextForHearImpaired(this, _subtitle)) + { + removeTextFromHearImpaired.Initialize(_subtitle); + if (removeTextFromHearImpaired.ShowDialog(this) == DialogResult.OK) + { + int count = removeTextFromHearImpaired.TotalFixes; + if (count == 1) + { + ShowStatus(_language.TextingForHearingImpairedRemovedOneLine); + } + else if (count > 1) + { + ShowStatus(string.Format(_language.TextingForHearingImpairedRemovedXLines, count)); + } + } + } + } + + private void SplitToolStripMenuItemClick(object sender, EventArgs e) + { + if (!IsSubtitleLoaded) + { + DisplaySubtitleNotLoadedMessage(); + return; + } + + ReloadFromSourceView(); + double lengthInSeconds = 0; + if (mediaPlayer.VideoPlayer != null) + { + lengthInSeconds = mediaPlayer.Duration; + } + + if (Configuration.Settings.Tools.SplitAdvanced) + { + using (var split = new Split()) + { + split.Initialize(_subtitle, _fileName, GetCurrentSubtitleFormat()); + if (split.ShowDialog(this) == DialogResult.OK) + { + ShowStatus(_language.SubtitleSplitted); + } + else if (split.ShowBasic) + { + Configuration.Settings.Tools.SplitAdvanced = false; + SplitToolStripMenuItemClick(null, null); + } + } + } + else + { + using (var splitSubtitle = new SplitSubtitle()) + { + splitSubtitle.Initialize(_subtitle, _fileName, GetCurrentSubtitleFormat(), GetCurrentEncoding(), lengthInSeconds); + if (splitSubtitle.ShowDialog(this) == DialogResult.OK) + { + ShowStatus(_language.SubtitleSplitted); + } + else if (splitSubtitle.ShowAdvanced) + { + Configuration.Settings.Tools.SplitAdvanced = true; + SplitToolStripMenuItemClick(null, null); + } + } + } + } + + private void AppendTextVisuallyToolStripMenuItemClick(object sender, EventArgs e) + { + if (!IsSubtitleLoaded) + { + DisplaySubtitleNotLoadedMessage(); + return; + } + + ReloadFromSourceView(); + + if (MessageBox.Show(_language.SubtitleAppendPrompt, _language.SubtitleAppendPromptTitle, MessageBoxButtons.YesNoCancel) == DialogResult.Yes) + { + openFileDialog1.Title = _language.OpenSubtitleToAppend; + openFileDialog1.FileName = string.Empty; + openFileDialog1.Filter = UiUtil.SubtitleExtensionFilter.Value; + if (openFileDialog1.ShowDialog(this) == DialogResult.OK) + { + bool success = false; + string fileName = openFileDialog1.FileName; + if (File.Exists(fileName)) + { + var fileInfo = new FileInfo(fileName); + var subtitleToAppend = new Subtitle(); + SubtitleFormat format; + + // do not allow blu-ray/vobsub + string extension = Path.GetExtension(fileName).ToLowerInvariant(); + if (extension == ".sub" && (IsVobSubFile(fileName, false) || FileUtil.IsSpDvdSup(fileName))) + { + format = null; + } + else if (extension == ".sup" && FileUtil.IsBluRaySup(fileName)) + { + format = null; + } + else if (fileInfo.Length < Subtitle.MaxFileSize) + { + format = subtitleToAppend.LoadSubtitle(fileName, out var encoding, null); + + if (format == null) + { + var ebu = new Ebu(); + if (ebu.IsMine(null, fileName)) + { + ebu.LoadSubtitle(subtitleToAppend, null, fileName); + format = ebu; + } + } + + if (format == null) + { + var pac = new Pac(); + if (pac.IsMine(null, fileName)) + { + pac.LoadSubtitle(subtitleToAppend, null, fileName); + format = pac; + } + } + + if (format == null) + { + var cavena890 = new Cavena890(); + if (cavena890.IsMine(null, fileName)) + { + cavena890.LoadSubtitle(subtitleToAppend, null, fileName); + format = cavena890; + } + } + } + else + { + MessageBox.Show(string.Format(_language.FileXIsLargerThan10MB, fileName)); + return; + } + + if (format != null && subtitleToAppend.Paragraphs.Count > 1) + { + using (var visualSync = new VisualSync()) + { + visualSync.Initialize(toolStripButtonVisualSync.Image as Bitmap, subtitleToAppend, null, _fileName, _language.AppendViaVisualSyncTitle, CurrentFrameRate); + visualSync.ShowDialog(this); + if (visualSync.OkPressed) + { + if (MessageBox.Show(_language.AppendSynchronizedSubtitlePrompt, _language.SubtitleAppendPromptTitle, MessageBoxButtons.YesNoCancel) == DialogResult.Yes) + { + int start = _subtitle.Paragraphs.Count + 1; + var fr = CurrentFrameRate; + MakeHistoryForUndo(_language.BeforeAppend); + foreach (var p in visualSync.Paragraphs) + { + _subtitle.Paragraphs.Add(new Paragraph(p)); + } + + if (format.GetType() == typeof(AdvancedSubStationAlpha) && GetCurrentSubtitleFormat().GetType() == typeof(AdvancedSubStationAlpha)) + { + var currentStyles = new List(); + if (_subtitle.Header != null) + { + currentStyles = AdvancedSubStationAlpha.GetStylesFromHeader(_subtitle.Header); + } + + foreach (var styleName in AdvancedSubStationAlpha.GetStylesFromHeader(subtitleToAppend.Header)) + { + bool alreadyExists = false; + foreach (var currentStyleName in currentStyles) + { + if (currentStyleName.Trim().Equals(styleName.Trim(), StringComparison.OrdinalIgnoreCase)) + { + alreadyExists = true; + } + } + + if (!alreadyExists) + { + var newStyle = AdvancedSubStationAlpha.GetSsaStyle(styleName, subtitleToAppend.Header); + _subtitle.Header = AdvancedSubStationAlpha.AddSsaStyle(newStyle, _subtitle.Header); + } + } + } + + _subtitle.Renumber(); + + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + + // select appended lines + for (int i = start; i < _subtitle.Paragraphs.Count; i++) + { + SubtitleListview1.Items[i].Selected = true; + } + + SubtitleListview1.EnsureVisible(start); + + ShowStatus(string.Format(_language.SubtitleAppendedX, fileName)); + success = true; + } + } + } + } + } + + if (!success) + { + ShowStatus(_language.SubtitleNotAppended); + } + } + } + } + + private void TranslateByGoogleToolStripMenuItemClick(object sender, EventArgs e) + { + TranslateViaGoogle(false, true); + } + + private void TranslateViaGoogle(bool onlySelectedLines, bool useGoogle) + { + if (!IsSubtitleLoaded) + { + DisplaySubtitleNotLoadedMessage(); + return; + } + + bool isAlternateVisible = SubtitleListview1.IsAlternateTextColumnVisible; + ReloadFromSourceView(); + using (var googleTranslate = new GoogleTranslate()) + { + SaveSubtitleListviewIndices(); + string title = _language.GoogleTranslate; + if (!useGoogle) + { + title = _language.MicrosoftTranslate; + } + + if (onlySelectedLines) + { + var selectedLines = new Subtitle(); + foreach (int index in SubtitleListview1.SelectedIndices) + { + selectedLines.Paragraphs.Add(_subtitle.Paragraphs[index]); + } + + title += " - " + _language.SelectedLines; + if (_subtitleAlternate != null) + { + var paragraphs = new List(); + foreach (int index in SubtitleListview1.SelectedIndices) + { + var original = Utilities.GetOriginalParagraph(index, _subtitle.Paragraphs[index], _subtitleAlternate.Paragraphs); + if (original != null) + { + paragraphs.Add(original); + } + } + + if (paragraphs.Count == selectedLines.Paragraphs.Count) + { + googleTranslate.Initialize(new Subtitle(paragraphs), selectedLines, title, useGoogle, GetCurrentEncoding()); + } + else + { + googleTranslate.Initialize(selectedLines, null, title, useGoogle, GetCurrentEncoding()); + } + } + else + { + googleTranslate.Initialize(selectedLines, null, title, useGoogle, GetCurrentEncoding()); + } + } + else + { + googleTranslate.Initialize(_subtitle, null, title, useGoogle, GetCurrentEncoding()); + } + + if (googleTranslate.ShowDialog(this) == DialogResult.OK) + { + _subtitleListViewIndex = -1; + string oldFileName = _fileName; + MakeHistoryForUndo(_language.BeforeGoogleTranslation); + if (onlySelectedLines) + { + // we only update selected lines + int i = 0; + foreach (int index in SubtitleListview1.SelectedIndices) + { + _subtitle.Paragraphs[index] = googleTranslate.TranslatedSubtitle.Paragraphs[i]; + i++; + } + + ShowStatus(_language.SelectedLinesTranslated); + } + else + { + ShowSubtitleTimer.Stop(); + var oldHash = _changeSubtitleHash; + _subtitleAlternate = new Subtitle(_subtitle); + _subtitleAlternateFileName = _fileName; + _fileName = null; + _subtitle.Paragraphs.Clear(); + foreach (var p in googleTranslate.TranslatedSubtitle.Paragraphs) + { + _subtitle.Paragraphs.Add(new Paragraph(p)); + } + + ShowStatus(_language.SubtitleTranslated); + _changeAlternateSubtitleHash = oldHash; + _changeSubtitleHash = -1; + ShowSubtitleTimer.Start(); + } + + ShowSource(); + + if (!onlySelectedLines) + { + SubtitleListview1.ShowAlternateTextColumn(_languageGeneral.OriginalText); + SubtitleListview1.AutoSizeAllColumns(this); + var oldHash = _changeAlternateSubtitleHash; + SetupAlternateEdit(); + _changeAlternateSubtitleHash = oldHash; + } + + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + if (!onlySelectedLines) + { + ResetHistory(); + _fileName = googleTranslate.GetFileNameWithTargetLanguage(oldFileName, VideoFileName, _subtitleAlternate, GetCurrentSubtitleFormat()); + } + + RestoreSubtitleListviewIndices(); + _converted = true; + SetTitle(); + SetEncoding(Encoding.UTF8); + if (!isAlternateVisible) + { + toolStripMenuItemShowOriginalInPreview.Checked = false; + Configuration.Settings.General.ShowOriginalAsPreviewIfAvailable = false; + audioVisualizer.Invalidate(); + } + } + } + } + + private static string GetTranslateStringFromNikseDk(string input) + { + WebRequest.DefaultWebProxy = Utilities.GetProxy(); + //var request = WebRequest.Create("http://localhost:54942/MultiTranslator/TranslateForSubtitleEdit"); + var request = WebRequest.Create("https://www.nikse.dk/MultiTranslator/TranslateForSubtitleEdit"); + request.Method = "POST"; + var postData = String.Format("languagePair={1}&text={0}", Utilities.UrlEncode(input), "svda"); + var byteArray = Encoding.UTF8.GetBytes(postData); + request.ContentType = "application/x-www-form-urlencoded"; + request.ContentLength = byteArray.Length; + using (var dataStream = request.GetRequestStream()) + { + dataStream.Write(byteArray, 0, byteArray.Length); + } + + using (var response = request.GetResponse()) + using (var reader = new StreamReader(response.GetResponseStream())) + { + return reader.ReadToEnd(); + } + } + + private void TranslateFromSwedishToDanishToolStripMenuItemClick(object sender, EventArgs e) + { + if (!IsSubtitleLoaded) + { + DisplaySubtitleNotLoadedMessage(); + return; + } + + bool isSwedish = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle) == "sv"; + string promptText = _language.TranslateSwedishToDanish; + if (!isSwedish) + { + promptText = _language.TranslateSwedishToDanishWarning; + } + + if (MessageBox.Show(promptText, Title, MessageBoxButtons.YesNoCancel) == DialogResult.Yes) + { + try + { + _subtitleAlternate = new Subtitle(_subtitle); + _subtitleAlternateFileName = null; + int firstSelectedIndex = 0; + if (SubtitleListview1.SelectedItems.Count > 0) + { + firstSelectedIndex = SubtitleListview1.SelectedItems[0].Index; + } + + _subtitleListViewIndex = -1; + + Cursor.Current = Cursors.WaitCursor; + ShowStatus(_language.TranslatingViaNikseDkMt); + var sb = new StringBuilder(); + var output = new StringBuilder(); + foreach (var p in _subtitle.Paragraphs) + { + var s = p.Text.Replace(Environment.NewLine, "
"); + s = "

" + s + "

"; + sb.Append(s); + + if (sb.Length > 9000) + { + output.Append(GetTranslateStringFromNikseDk(sb.ToString())); + sb.Length = 0; + } + } + + if (sb.Length > 0) + { + output.Append(GetTranslateStringFromNikseDk(sb.ToString())); + } + + MakeHistoryForUndo(_language.BeforeSwedishToDanishTranslation); + var result = output.ToString(); + if (result.Length > 0) + { + int index = 0; + foreach (var s in result.Split(new[] { "

", "

" }, StringSplitOptions.RemoveEmptyEntries)) + { + if (index < _subtitle.Paragraphs.Count) + { + _subtitle.Paragraphs[index].Text = s.Trim(); + } + + index++; + } + + ShowSource(); + SubtitleListview1.ShowAlternateTextColumn(_languageGeneral.OriginalText); + SubtitleListview1.AutoSizeAllColumns(this); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + ShowStatus(_language.TranslationFromSwedishToDanishComplete); + SubtitleListview1.SelectIndexAndEnsureVisible(firstSelectedIndex, true); + _converted = true; + } + } + catch + { + ShowStatus(_language.TranslationFromSwedishToDanishFailed); + } + + Cursor.Current = Cursors.Default; + } + } + + /// + /// Undo or Redo + /// + /// True equals undo, false triggers redo + private void UndoToIndex(bool undo) + { + if (_networkSession != null) + { + return; + } + + lock (_syncUndo) + { + if (!undo && _undoIndex >= _subtitle.HistoryItems.Count - 1) + { + return; + } + + if (undo && (_subtitle == null || !_subtitle.CanUndo || _undoIndex < 0)) + { + return; + } + + // Add latest changes if any (also stop changes from being added while redoing/undoing) + timerTextUndo.Stop(); + timerAlternateTextUndo.Stop(); + _listViewTextTicks = 0; + _listViewAlternateTextTicks = 0; + TimerTextUndoTick(null, null); + TimerAlternateTextUndoTick(null, null); + + try + { + int selectedIndex = FirstSelectedIndex; + if (undo) + { + _subtitle.HistoryItems[_undoIndex].RedoParagraphs = new List(); + _subtitle.HistoryItems[_undoIndex].RedoParagraphsAlternate = new List(); + + foreach (var p in _subtitle.Paragraphs) + { + _subtitle.HistoryItems[_undoIndex].RedoParagraphs.Add(new Paragraph(p)); + } + + if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null) + { + foreach (var p in _subtitleAlternate.Paragraphs) + { + _subtitle.HistoryItems[_undoIndex].RedoParagraphsAlternate.Add(new Paragraph(p)); + } + } + + _subtitle.HistoryItems[_undoIndex].RedoFileName = _fileName; + _subtitle.HistoryItems[_undoIndex].RedoFileModified = _fileDateTime; + _subtitle.HistoryItems[_undoIndex].RedoOriginalFileName = _subtitleAlternateFileName; + + if (selectedIndex >= 0) + { + _subtitle.HistoryItems[_undoIndex].RedoParagraphs[selectedIndex].Text = + textBoxListViewText.Text; + if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && + selectedIndex < _subtitle.HistoryItems[_undoIndex].RedoParagraphsAlternate.Count) + { + _subtitle.HistoryItems[_undoIndex].RedoParagraphsAlternate[selectedIndex].Text = + textBoxListViewTextAlternate.Text; + } + + _subtitle.HistoryItems[_undoIndex].RedoLineIndex = selectedIndex; + _subtitle.HistoryItems[_undoIndex].RedoLinePosition = textBoxListViewText.SelectionStart; + _subtitle.HistoryItems[_undoIndex].RedoLinePositionAlternate = textBoxListViewTextAlternate.SelectionStart; + } + else + { + _subtitle.HistoryItems[_undoIndex].RedoLineIndex = -1; + _subtitle.HistoryItems[_undoIndex].RedoLinePosition = -1; + } + } + else + { + _undoIndex++; + } + + var text = _subtitle.HistoryItems[_undoIndex].Description; + + _subtitleListViewIndex = -1; + textBoxListViewText.Text = string.Empty; + textBoxListViewTextAlternate.Text = string.Empty; + string oldFileName = _fileName; + DateTime oldFileDateTime = _fileDateTime; + + string oldAlternameFileName = _subtitleAlternateFileName; + _fileName = _subtitle.UndoHistory(_undoIndex, out var subtitleFormatFriendlyName, out _fileDateTime, out _subtitleAlternate, out _subtitleAlternateFileName); + if (string.IsNullOrEmpty(oldAlternameFileName) && !string.IsNullOrEmpty(_subtitleAlternateFileName)) + { + SubtitleListview1.ShowAlternateTextColumn(_languageGeneral.OriginalText); + SubtitleListview1.AutoSizeAllColumns(this); + } + else if (SubtitleListview1.IsAlternateTextColumnVisible && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count == 0) + { + RemoveAlternate(true, false); + } + + if (!undo) + { + // TODO: Sometimes redo paragraphs can be null - how? + if (_subtitle.HistoryItems[_undoIndex].RedoParagraphs != null) + { + _subtitle.Paragraphs.Clear(); + foreach (var p in _subtitle.HistoryItems[_undoIndex].RedoParagraphs) + { + _subtitle.Paragraphs.Add(new Paragraph(p)); + } + + if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null) + { + _subtitleAlternate.Paragraphs.Clear(); + foreach (var p in _subtitle.HistoryItems[_undoIndex].RedoParagraphsAlternate) + { + _subtitleAlternate.Paragraphs.Add(new Paragraph(p)); + } + } + } + else + { + System.Diagnostics.Debug.WriteLine("Undo failed at undo index: " + _undoIndex); + } + + _subtitle.HistoryItems[_undoIndex].RedoParagraphs = null; + _subtitle.HistoryItems[_undoIndex].RedoParagraphsAlternate = null; + if (SubtitleListview1.IsAlternateTextColumnVisible && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count == 0) + { + RemoveAlternate(true, false); + } + } + + if (oldFileName == null || oldFileName.Equals(_fileName, StringComparison.OrdinalIgnoreCase)) + { + _fileDateTime = oldFileDateTime; // undo will not give overwrite-newer-file warning + } + + comboBoxSubtitleFormats.SelectedIndexChanged -= ComboBoxSubtitleFormatsSelectedIndexChanged; + SetCurrentFormat(subtitleFormatFriendlyName); + comboBoxSubtitleFormats.SelectedIndexChanged += ComboBoxSubtitleFormatsSelectedIndexChanged; + + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + + if (selectedIndex >= _subtitle.Paragraphs.Count) + { + SubtitleListview1.SelectIndexAndEnsureVisible(_subtitle.Paragraphs.Count - 1, true); + } + else if (selectedIndex >= 0 && selectedIndex < _subtitle.Paragraphs.Count) + { + SubtitleListview1.SelectIndexAndEnsureVisible(selectedIndex, true); + } + else + { + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + } + + audioVisualizer.Invalidate(); + if (undo) + { + if (_subtitle.HistoryItems[_undoIndex].LineIndex == FirstSelectedIndex) + { + textBoxListViewText.SelectionStart = _subtitle.HistoryItems[_undoIndex].LinePosition; + if (_subtitleAlternate != null) + { + textBoxListViewTextAlternate.SelectionStart = + _subtitle.HistoryItems[_undoIndex].LinePositionAlternate; + } + } + + ShowStatus(_language.UndoPerformed + ": " + text.Replace(Environment.NewLine, " ")); + _undoIndex--; + } + else + { + if (_subtitle.HistoryItems[_undoIndex].RedoLineIndex >= 0 && + _subtitle.HistoryItems[_undoIndex].RedoLineIndex == FirstSelectedIndex) + { + textBoxListViewText.SelectionStart = _subtitle.HistoryItems[_undoIndex].RedoLinePosition; + } + + if (_subtitleAlternate != null && _subtitle.HistoryItems[_undoIndex].RedoLineIndex >= 0 && + _subtitle.HistoryItems[_undoIndex].RedoLineIndex == FirstSelectedIndex) + { + textBoxListViewTextAlternate.SelectionStart = _subtitle.HistoryItems[_undoIndex].RedoLinePositionAlternate; + } + + _fileName = _subtitle.HistoryItems[_undoIndex].RedoFileName; + _subtitleAlternateFileName = _subtitle.HistoryItems[_undoIndex].RedoOriginalFileName; + ShowStatus(_language.RedoPerformed); + } + } + catch (Exception exception) + { + System.Diagnostics.Debug.WriteLine(exception.Message); + } + + timerTextUndo.Start(); + timerAlternateTextUndo.Start(); + SetTitle(); + SetListViewStateImages(); + } + } + + private void ShowHistoryforUndoToolStripMenuItemClick(object sender, EventArgs e) + { + if (_subtitle != null && _subtitle.CanUndo) + { + ReloadFromSourceView(); + using (var showHistory = new ShowHistory()) + { + showHistory.Initialize(_subtitle, _undoIndex); + if (showHistory.ShowDialog(this) == DialogResult.OK) + { + _subtitleListViewIndex = -1; + textBoxListViewText.Text = string.Empty; + textBoxListViewTextAlternate.Text = string.Empty; + + Cursor.Current = Cursors.WaitCursor; + SubtitleListview1.BeginUpdate(); + int rollBackCount = 0; + while (_undoIndex > showHistory.SelectedIndex && rollBackCount < Subtitle.MaximumHistoryItems) + { + UndoToIndex(true); + rollBackCount++; + } + SubtitleListview1.EndUpdate(); + Cursor.Current = Cursors.Default; + audioVisualizer.Invalidate(); + } + } + } + else + { + MessageBox.Show(_language.NothingToUndo, Title, MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + + private void ToolStripButtonSpellCheckClick(object sender, EventArgs e) + { + SpellCheck(true, 0); + } + + private void SpellCheckToolStripMenuItemClick(object sender, EventArgs e) + { + SpellCheck(true, 0); + } + + private void SpellCheck(bool autoDetect, int startFromLine) + { + if (!IsSubtitleLoaded) + { + DisplaySubtitleNotLoadedMessage(); + return; + } + + try + { + string dictionaryFolder = Utilities.DictionaryFolder; + if (!Directory.Exists(dictionaryFolder) || Directory.GetFiles(dictionaryFolder, "*.dic").Length == 0) + { + ShowGetDictionaries(); + return; + } + + if (_subtitle != null && _subtitle.Paragraphs.Count > 0) + { + if (_spellCheckForm != null) + { + var result = MessageBox.Show(_language.ContinueWithCurrentSpellCheck, Title, MessageBoxButtons.YesNoCancel); + if (result == DialogResult.Cancel) + { + return; + } + + if (result == DialogResult.No) + { + _spellCheckForm.Dispose(); + _spellCheckForm = new SpellCheck(); + _spellCheckForm.DoSpellCheck(autoDetect, _subtitle, dictionaryFolder, this, startFromLine); + } + else + { + _spellCheckForm.ContinueSpellCheck(_subtitle); + } + } + else + { + _spellCheckForm = new SpellCheck(); + _spellCheckForm.DoSpellCheck(autoDetect, _subtitle, dictionaryFolder, this, startFromLine); + } + } + } + catch (Exception ex) + { + MessageBox.Show(string.Format("{0}{1}{2}{3}{4}", ex.Source, Environment.NewLine, ex.Message, Environment.NewLine, ex.StackTrace), _title, MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + public void ChangeWholeTextMainPart(ref int noOfChangedWords, ref bool firstChange, int i, Paragraph p) + { + SubtitleListview1.SetText(i, p.Text); + noOfChangedWords++; + if (firstChange) + { + MakeHistoryForUndo(_language.BeforeSpellCheck); + firstChange = false; + } + + if (tabControlSubtitle.SelectedIndex == TabControlSourceView) + { + ShowSource(); + } + else + { + RefreshSelectedParagraph(); + } + } + + public void DeleteLine() + { + MakeHistoryForUndo(Configuration.Settings.Language.Main.OneLineDeleted); + DeleteSelectedLines(); + } + + public void FocusParagraph(int index) + { + if (tabControlSubtitle.SelectedIndex == TabControlSourceView) + { + tabControlSubtitle.SelectedIndex = TabControlListView; + } + + if (tabControlSubtitle.SelectedIndex == TabControlListView) + { + SubtitleListview1.SelectIndexAndEnsureVisible(index, true); + } + } + + private void RefreshSelectedParagraph() + { + var idx = FirstSelectedIndex; + if (idx == -1 && _subtitle?.Paragraphs?.Count > 0) + { + idx = 0; + } + + var p = _subtitle.GetParagraphOrDefault(idx); + _subtitleListViewIndex = -1; + SubtitleListview1_SelectedIndexChanged(null, null); + if (p != null) + { + SubtitleListview1.SetStartTimeAndDuration(idx, p, _subtitle.GetParagraphOrDefault(idx + 1), _subtitle.GetParagraphOrDefault(idx - 1)); + } + } + + private void RefreshSelectedParagraphs() + { + foreach (var index in SubtitleListview1.GetSelectedIndices()) + { + var p = _subtitle.GetParagraphOrDefault(index); + if (p != null) + { + SubtitleListview1.SetStartTimeAndDuration(index, p, _subtitle.GetParagraphOrDefault(index + 1), _subtitle.GetParagraphOrDefault(index - 1)); + } + } + + _subtitleListViewIndex = -1; + SubtitleListview1_SelectedIndexChanged(null, null); + } + + private int GetPositionFromWordIndex(string text, int wordIndex) + { + var sb = new StringBuilder(); + int index = -1; + for (int i = 0; i < text.Length; i++) + { + if (SpellCheckWordLists.SplitChars.Contains(text[i])) + { + if (sb.Length > 0) + { + index++; + if (index == wordIndex) + { + int pos = i - sb.Length; + if (pos > 0) + { + pos--; + } + + if (pos >= 0) + { + return pos; + } + } + } + + sb.Clear(); + } + else + { + sb.Append(text[i]); + } + } + + if (sb.Length > 0) + { + index++; + if (index == wordIndex) + { + int pos = text.Length - 1 - sb.Length; + if (pos >= 0) + { + return pos; + } + } + } + + return 0; + } + + public void CorrectWord(string changeWord, Paragraph p, string oldWord, ref bool firstChange, int wordIndex) + { + if (oldWord != changeWord) + { + if (firstChange) + { + MakeHistoryForUndo(_language.BeforeSpellCheck); + firstChange = false; + } + + int startIndex = p.Text.IndexOf(oldWord, StringComparison.Ordinal); + if (wordIndex >= 0) + { + startIndex = p.Text.IndexOf(oldWord, GetPositionFromWordIndex(p.Text, wordIndex), StringComparison.Ordinal); + } + + while (startIndex >= 0 && startIndex < p.Text.Length && p.Text.Substring(startIndex).Contains(oldWord)) + { + bool startOk = startIndex == 0 || + "«»“” <>-—+/'\"[](){}¿¡….,;:!?%&$£\r\n؛،؟\u200E\u200F\u202A\u202B\u202C\u202D\u202E\u00C2\u00A0".Contains(p.Text[startIndex - 1]) || + char.IsPunctuation(p.Text[startIndex - 1]) || + startIndex == p.Text.Length - oldWord.Length; + if (startOk) + { + int end = startIndex + oldWord.Length; + if (end <= p.Text.Length && end == p.Text.Length || + "«»“” ,.!?:;'()<>\"-—+/[]{}%&$£…\r\n؛،؟\u200E\u200F\u202A\u202B\u202C\u202D\u202E\u00C2\u00A0".Contains(p.Text[end]) || + char.IsPunctuation(p.Text[end])) + { + var lengthBefore = p.Text.Length; + p.Text = p.Text.Remove(startIndex, oldWord.Length).Insert(startIndex, changeWord); + var lengthAfter = p.Text.Length; + if (lengthAfter > lengthBefore) + { + startIndex += (lengthAfter - lengthBefore); + } + } + } + + if (startIndex + 2 >= p.Text.Length) + { + startIndex = -1; + } + else + { + startIndex = p.Text.IndexOf(oldWord, startIndex + 2, StringComparison.Ordinal); + } + + // stop if using index + if (wordIndex >= 0) + { + startIndex = -1; + } + } + + ShowStatus(string.Format(_language.SpellCheckChangedXToY, oldWord, changeWord)); + SubtitleListview1.SetText(_subtitle.GetIndex(p), p.Text); + if (tabControlSubtitle.SelectedIndex == TabControlSourceView) + { + ShowSource(); + } + else + { + RefreshSelectedParagraph(); + } + } + } + + private void GetDictionariesToolStripMenuItem_Click(object sender, EventArgs e) + { + ShowGetDictionaries(); + } + + private void ShowGetDictionaries() + { + using (var form = new GetDictionaries()) + { + form.ShowDialog(this); + } + } + + private void ContextMenuStripListviewOpening(object sender, System.ComponentModel.CancelEventArgs e) + { + var format = GetCurrentSubtitleFormat(); + var formatType = format.GetType(); + var coordinates = SubtitleListview1.PointToClient(Cursor.Position); + var hitTest = SubtitleListview1.HitTest(coordinates); + if (coordinates.Y < 19 || (hitTest.Item != null && hitTest.Item.Index == 0 && coordinates.Y < hitTest.Item.Position.Y)) + { + e.Cancel = true; + var cm = new ContextMenuStrip(); + var contextMenuStripLvHeaderResizeToolStripMenuItem = new ToolStripMenuItem(Configuration.Settings.Language.Main.Menu.ContextMenu.SizeAllColumnsToFit); + contextMenuStripLvHeaderResizeToolStripMenuItem.Click += (sender2, e2) => { SubtitleListview1.AutoSizeColumns(); }; + cm.Items.Add(contextMenuStripLvHeaderResizeToolStripMenuItem); + + var tss = new ToolStripSeparator(); + UiUtil.FixFonts(tss); + cm.Items.Add(tss); + + // End time + var contextMenuStripLvHeaderEndTimeToolStripMenuItem = new ToolStripMenuItem(Configuration.Settings.Language.General.EndTime); + contextMenuStripLvHeaderEndTimeToolStripMenuItem.CheckOnClick = true; + contextMenuStripLvHeaderEndTimeToolStripMenuItem.Checked = Configuration.Settings.Tools.ListViewShowColumnEndTime; + contextMenuStripLvHeaderEndTimeToolStripMenuItem.Click += (sender2, e2) => + { + SubtitleListview1.BeginUpdate(); + Configuration.Settings.Tools.ListViewShowColumnEndTime = contextMenuStripLvHeaderEndTimeToolStripMenuItem.Checked; + if (Configuration.Settings.Tools.ListViewShowColumnEndTime) + { + SubtitleListview1.ShowEndColumn(Configuration.Settings.Language.General.EndTime); + } + else + { + SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.End); + } + + SaveSubtitleListviewIndices(); + UiUtil.InitializeSubtitleFont(SubtitleListview1); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + SubtitleListview1.EndUpdate(); + }; + cm.Items.Add(contextMenuStripLvHeaderEndTimeToolStripMenuItem); + + // Duration + var contextMenuStripLvHeaderDurationToolStripMenuItem = new ToolStripMenuItem(Configuration.Settings.Language.General.Duration); + contextMenuStripLvHeaderDurationToolStripMenuItem.CheckOnClick = true; + contextMenuStripLvHeaderDurationToolStripMenuItem.Checked = Configuration.Settings.Tools.ListViewShowColumnDuration; + contextMenuStripLvHeaderDurationToolStripMenuItem.Click += (sender2, e2) => + { + SubtitleListview1.BeginUpdate(); + Configuration.Settings.Tools.ListViewShowColumnDuration = contextMenuStripLvHeaderDurationToolStripMenuItem.Checked; + if (Configuration.Settings.Tools.ListViewShowColumnDuration) + { + SubtitleListview1.ShowDurationColumn(Configuration.Settings.Language.General.Duration); + } + else + { + SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.Duration); + } + + SaveSubtitleListviewIndices(); + UiUtil.InitializeSubtitleFont(SubtitleListview1); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + SubtitleListview1.EndUpdate(); + }; + cm.Items.Add(contextMenuStripLvHeaderDurationToolStripMenuItem); + + // CPS + var contextMenuStripLvHeaderCpsToolStripMenuItem = new ToolStripMenuItem(Configuration.Settings.Language.General.CharsPerSec); + contextMenuStripLvHeaderCpsToolStripMenuItem.CheckOnClick = true; + contextMenuStripLvHeaderCpsToolStripMenuItem.Checked = Configuration.Settings.Tools.ListViewShowColumnCharsPerSec; + contextMenuStripLvHeaderCpsToolStripMenuItem.Click += (sender2, e2) => + { + SubtitleListview1.BeginUpdate(); + Configuration.Settings.Tools.ListViewShowColumnCharsPerSec = contextMenuStripLvHeaderCpsToolStripMenuItem.Checked; + if (Configuration.Settings.Tools.ListViewShowColumnCharsPerSec) + { + SubtitleListview1.ShowCharsSecColumn(Configuration.Settings.Language.General.CharsPerSec); + } + else + { + SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.CharactersPerSeconds); + } + + SaveSubtitleListviewIndices(); + UiUtil.InitializeSubtitleFont(SubtitleListview1); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + SubtitleListview1.EndUpdate(); + }; + cm.Items.Add(contextMenuStripLvHeaderCpsToolStripMenuItem); + + // WPM + var contextMenuStripLvHeaderWpmToolStripMenuItem = new ToolStripMenuItem(Configuration.Settings.Language.General.WordsPerMin); + contextMenuStripLvHeaderWpmToolStripMenuItem.CheckOnClick = true; + contextMenuStripLvHeaderWpmToolStripMenuItem.Checked = Configuration.Settings.Tools.ListViewShowColumnWordsPerMin; + contextMenuStripLvHeaderWpmToolStripMenuItem.Click += (sender2, e2) => + { + SubtitleListview1.BeginUpdate(); + Configuration.Settings.Tools.ListViewShowColumnWordsPerMin = contextMenuStripLvHeaderWpmToolStripMenuItem.Checked; + if (Configuration.Settings.Tools.ListViewShowColumnWordsPerMin) + { + SubtitleListview1.ShowWordsMinColumn(Configuration.Settings.Language.General.WordsPerMin); + } + else + { + SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.WordsPerMinute); + } + + SaveSubtitleListviewIndices(); + UiUtil.InitializeSubtitleFont(SubtitleListview1); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + SubtitleListview1.EndUpdate(); + }; + cm.Items.Add(contextMenuStripLvHeaderWpmToolStripMenuItem); + + // GAP + var contextMenuStripLvHeaderGapToolStripMenuItem = new ToolStripMenuItem(Configuration.Settings.Language.General.Gap); + contextMenuStripLvHeaderGapToolStripMenuItem.CheckOnClick = true; + contextMenuStripLvHeaderGapToolStripMenuItem.Checked = Configuration.Settings.Tools.ListViewShowColumnGap; + contextMenuStripLvHeaderGapToolStripMenuItem.Click += (sender2, e2) => + { + SubtitleListview1.BeginUpdate(); + Configuration.Settings.Tools.ListViewShowColumnGap = contextMenuStripLvHeaderGapToolStripMenuItem.Checked; + if (Configuration.Settings.Tools.ListViewShowColumnGap) + { + SubtitleListview1.ShowGapColumn(Configuration.Settings.Language.General.Gap); + } + else + { + SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.Gap); + } + + SaveSubtitleListviewIndices(); + UiUtil.InitializeSubtitleFont(SubtitleListview1); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + SubtitleListview1.EndUpdate(); + }; + cm.Items.Add(contextMenuStripLvHeaderGapToolStripMenuItem); + + if (formatType == typeof(AdvancedSubStationAlpha) || formatType == typeof(SubStationAlpha) || formatType == typeof(CsvNuendo)) + { + // ACTOR + var actorTitle = formatType == typeof(CsvNuendo) ? Configuration.Settings.Language.General.Character : Configuration.Settings.Language.General.Actor; + var contextMenuStripLvHeaderActorToolStripMenuItem = new ToolStripMenuItem(actorTitle); + contextMenuStripLvHeaderActorToolStripMenuItem.CheckOnClick = true; + contextMenuStripLvHeaderActorToolStripMenuItem.Checked = Configuration.Settings.Tools.ListViewShowColumnActor; + contextMenuStripLvHeaderActorToolStripMenuItem.Click += (sender2, e2) => + { + SubtitleListview1.BeginUpdate(); + Configuration.Settings.Tools.ListViewShowColumnActor = contextMenuStripLvHeaderActorToolStripMenuItem.Checked; + if (Configuration.Settings.Tools.ListViewShowColumnActor) + { + SubtitleListview1.ShowActorColumn(actorTitle); + } + else + { + SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.Actor); + } + + SaveSubtitleListviewIndices(); + UiUtil.InitializeSubtitleFont(SubtitleListview1); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + SubtitleListview1.EndUpdate(); + }; + cm.Items.Add(contextMenuStripLvHeaderActorToolStripMenuItem); + } + + if (formatType == typeof(TimedText10)) + { + // REGION + var contextMenuStripLvHeaderRegionToolStripMenuItem = new ToolStripMenuItem(Configuration.Settings.Language.General.Region); + contextMenuStripLvHeaderRegionToolStripMenuItem.CheckOnClick = true; + contextMenuStripLvHeaderRegionToolStripMenuItem.Checked = Configuration.Settings.Tools.ListViewShowColumnRegion; + contextMenuStripLvHeaderRegionToolStripMenuItem.Click += (sender2, e2) => + { + SubtitleListview1.BeginUpdate(); + Configuration.Settings.Tools.ListViewShowColumnRegion = contextMenuStripLvHeaderRegionToolStripMenuItem.Checked; + if (Configuration.Settings.Tools.ListViewShowColumnRegion) + { + SubtitleListview1.ShowRegionColumn(Configuration.Settings.Language.General.Region); + } + else + { + SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.Region); + } + + SaveSubtitleListviewIndices(); + UiUtil.InitializeSubtitleFont(SubtitleListview1); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + SubtitleListview1.EndUpdate(); + }; + cm.Items.Add(contextMenuStripLvHeaderRegionToolStripMenuItem); + } + + cm.Show(SubtitleListview1, coordinates); + return; + } + + toolStripMenuItemPreview.Visible = formatType == typeof(WebVTT) && + !string.IsNullOrEmpty(VideoFileName) && + (VideoFileName.EndsWith(".mp4", StringComparison.OrdinalIgnoreCase) || VideoFileName.EndsWith(".m4v", StringComparison.OrdinalIgnoreCase) || VideoFileName.EndsWith(".webm", StringComparison.OrdinalIgnoreCase)) && + IsSubtitleLoaded; + + toolStripMenuItemSetRegion.Visible = false; + toolStripMenuItemSetLanguage.Visible = false; + List actors = null; + if ((formatType == typeof(AdvancedSubStationAlpha) || formatType == typeof(SubStationAlpha) || formatType == typeof(CsvNuendo)) && SubtitleListview1.SelectedItems.Count > 0) + { + actors = new List(); + toolStripMenuItemWebVTT.Visible = false; + var styles = AdvancedSubStationAlpha.GetStylesFromHeader(_subtitle.Header); + setStylesForSelectedLinesToolStripMenuItem.DropDownItems.Clear(); + foreach (var style in styles) + { + setStylesForSelectedLinesToolStripMenuItem.DropDownItems.Add(style, null, tsi_Click); + } + + setStylesForSelectedLinesToolStripMenuItem.Visible = styles.Count > 1; + toolStripMenuItemAssStyles.Visible = true; + if (formatType == typeof(AdvancedSubStationAlpha)) + { + toolStripMenuItemAssStyles.Text = _language.Menu.ContextMenu.AdvancedSubStationAlphaStyles; + setStylesForSelectedLinesToolStripMenuItem.Text = _language.Menu.ContextMenu.AdvancedSubStationAlphaSetStyle; + } + else + { + toolStripMenuItemAssStyles.Text = _language.Menu.ContextMenu.SubStationAlphaStyles; + setStylesForSelectedLinesToolStripMenuItem.Text = _language.Menu.ContextMenu.SubStationAlphaSetStyle; + } + + // actor + foreach (var p in _subtitle.Paragraphs) + { + if (!string.IsNullOrEmpty(p.Actor) && !actors.Contains(p.Actor)) + { + actors.Add(p.Actor); + } + + actors.Sort(); + } + + setActorForSelectedLinesToolStripMenuItem.DropDownItems.Clear(); + foreach (var actor in actors) + { + setActorForSelectedLinesToolStripMenuItem.DropDownItems.Add(actor, null, actor_Click); + } + + if (actors.Count > 0) + { + var tss = new ToolStripSeparator(); + UiUtil.FixFonts(tss); + setActorForSelectedLinesToolStripMenuItem.DropDownItems.Add(tss); + } + + setActorForSelectedLinesToolStripMenuItem.DropDownItems.Add(_language.Menu.ContextMenu.NewActor, null, SetNewActor); + if (actors.Count > 0) + { + setActorForSelectedLinesToolStripMenuItem.DropDownItems.Add(_language.Menu.ContextMenu.RemoveActors, null, RemoveActors); + } + } + else if (((formatType == typeof(TimedText10) && Configuration.Settings.SubtitleSettings.TimedText10ShowStyleAndLanguage) || formatType == typeof(ItunesTimedText)) && SubtitleListview1.SelectedItems.Count > 0) + { + toolStripMenuItemWebVTT.Visible = false; + toolStripMenuItemAssStyles.Text = _language.Menu.ContextMenu.TimedTextStyles; + var styles = TimedText10.GetStylesFromHeader(_subtitle.Header); + setStylesForSelectedLinesToolStripMenuItem.DropDownItems.Clear(); + foreach (var style in styles) + { + setStylesForSelectedLinesToolStripMenuItem.DropDownItems.Add(style, null, tsi_Click); + } + + setStylesForSelectedLinesToolStripMenuItem.Visible = styles.Count >= 1; + toolStripMenuItemAssStyles.Visible = true; + setStylesForSelectedLinesToolStripMenuItem.Text = _language.Menu.ContextMenu.TimedTextSetStyle; + + // regions + if (string.IsNullOrEmpty(_subtitle.Header) || !_subtitle.Header.Contains("http://www.w3.org/ns/ttml")) + { + _subtitle.Header = new TimedText10().ToText(_subtitle, string.Empty); + } + + var regions = TimedText10.GetRegionsFromHeader(_subtitle.Header); + toolStripMenuItemSetRegion.DropDownItems.Clear(); + toolStripMenuItemSetRegion.Text = _language.Menu.ContextMenu.TimedTextSetRegion; + if (regions.Count > 0) + { + toolStripMenuItemSetRegion.Visible = true; + foreach (var region in regions) + { + toolStripMenuItemSetRegion.DropDownItems.Add(region, null, SetRegionClick); + } + + toolStripMenuItemSetRegion.DropDownItems.Add("-"); + var clear = new ToolStripMenuItem(Configuration.Settings.Language.DvdSubRip.Clear); + toolStripMenuItemSetRegion.DropDownItems.Add(clear); + clear.Click += (sender2, e2) => + { + MakeHistoryForUndo("Set region: " + Configuration.Settings.Language.DvdSubRip.Clear); + foreach (int index in SubtitleListview1.SelectedIndices) + { + _subtitle.Paragraphs[index].Region = null; + SubtitleListview1.SetTimeAndText(index, _subtitle.Paragraphs[index], _subtitle.GetParagraphOrDefault(index + 1)); + } + }; + } + else + { + toolStripMenuItemSetRegion.Visible = false; + } + + // languages + var languages = TimedText10.GetUsedLanguages(_subtitle); + toolStripMenuItemSetLanguage.DropDownItems.Clear(); + toolStripMenuItemSetLanguage.Text = _language.Menu.ContextMenu.TimedTextSetLanguage; + toolStripMenuItemSetLanguage.Visible = true; + if (languages.Count > 0) + { + foreach (var language in languages) + { + toolStripMenuItemSetLanguage.DropDownItems.Add(language, null, AddLanguageClick); + } + + toolStripMenuItemSetLanguage.DropDownItems.Add("-"); + } + + var newItem = new ToolStripMenuItem(_language.New); + toolStripMenuItemSetLanguage.DropDownItems.Add(newItem); + newItem.Click += (senderNew, eNew) => + { + var moreLanguages = new List(); + foreach (CultureInfo x in CultureInfo.GetCultures(CultureTypes.NeutralCultures)) + { + var twoLetterLower = x.TwoLetterISOLanguageName.ToLowerInvariant(); + if (!languages.Contains(twoLetterLower) && + !languages.Contains(x.GetThreeLetterIsoLanguageName().ToLowerInvariant()) && + twoLetterLower != "iv") + { + moreLanguages.Add(x); + } + } + + moreLanguages = moreLanguages.OrderBy(p => p.TwoLetterISOLanguageName).ToList(); + using (var form = new TimedTextNewLanguage(moreLanguages, LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle))) + { + if (form.ShowDialog(this) == DialogResult.OK) + { + if (!string.IsNullOrEmpty(form.Language)) + { + MakeHistoryForUndo("Set language: " + form.Language); + foreach (int index in SubtitleListview1.SelectedIndices) + { + _subtitle.Paragraphs[index].Language = form.Language; + _subtitle.Paragraphs[index].Extra = TimedText10.SetExtra(_subtitle.Paragraphs[index]); + SubtitleListview1.SetExtraText(index, _subtitle.Paragraphs[index].Extra, SubtitleListview1.ForeColor); + } + } + } + } + }; + + if (languages.Count > 0) + { + var clearLanguage = new ToolStripMenuItem(Configuration.Settings.Language.DvdSubRip.Clear); + toolStripMenuItemSetLanguage.DropDownItems.Add(clearLanguage); + clearLanguage.Click += (sender2, e2) => + { + MakeHistoryForUndo("Set language: " + Configuration.Settings.Language.DvdSubRip.Clear); + foreach (int index in SubtitleListview1.SelectedIndices) + { + _subtitle.Paragraphs[index].Language = null; + _subtitle.Paragraphs[index].Extra = TimedText10.SetExtra(_subtitle.Paragraphs[index]); + SubtitleListview1.SetTimeAndText(index, _subtitle.Paragraphs[index], _subtitle.GetParagraphOrDefault(index + 1)); + } + }; + } + } + else if ((formatType == typeof(Sami) || formatType == typeof(SamiModern)) && SubtitleListview1.SelectedItems.Count > 0) + { + toolStripMenuItemWebVTT.Visible = false; + toolStripMenuItemAssStyles.Text = _language.Menu.ContextMenu.TimedTextStyles; + var styles = Sami.GetStylesFromHeader(_subtitle.Header); + setStylesForSelectedLinesToolStripMenuItem.DropDownItems.Clear(); + foreach (var style in styles) + { + setStylesForSelectedLinesToolStripMenuItem.DropDownItems.Add(style, null, tsi_Click); + } + + setStylesForSelectedLinesToolStripMenuItem.Visible = styles.Count > 1; + toolStripMenuItemAssStyles.Visible = false; + setStylesForSelectedLinesToolStripMenuItem.Text = _language.Menu.ContextMenu.SamiSetStyle; + } + else if (formatType == typeof(WebVTT) && SubtitleListview1.SelectedItems.Count > 0) + { + setStylesForSelectedLinesToolStripMenuItem.Visible = false; + toolStripMenuItemAssStyles.Visible = false; + toolStripMenuItemWebVTT.Visible = true; + var voices = WebVTT.GetVoices(_subtitle); + toolStripMenuItemWebVTT.DropDownItems.Clear(); + foreach (var style in voices) + { + toolStripMenuItemWebVTT.DropDownItems.Add(style, null, WebVTTSetVoice); + } + + toolStripMenuItemWebVTT.DropDownItems.Add(_language.Menu.ContextMenu.WebVTTSetNewVoice, null, WebVTTSetNewVoice); + if (voices.Count > 0) + { + toolStripMenuItemWebVTT.DropDownItems.Add(_language.Menu.ContextMenu.WebVTTRemoveVoices, null, WebVTTRemoveVoices); + } + } + else if ((format.Name == "Nuendo" && SubtitleListview1.SelectedItems.Count > 0)) + { + toolStripMenuItemWebVTT.Visible = false; + var styles = GetNuendoStyles(); + setStylesForSelectedLinesToolStripMenuItem.DropDownItems.Clear(); + foreach (var style in styles) + { + setStylesForSelectedLinesToolStripMenuItem.DropDownItems.Add(style, null, NuendoSetStyle); + } + + setStylesForSelectedLinesToolStripMenuItem.Visible = styles.Count > 1; + toolStripMenuItemAssStyles.Visible = false; + setStylesForSelectedLinesToolStripMenuItem.Text = _language.Menu.ContextMenu.NuendoSetStyle; + } + else + { + setStylesForSelectedLinesToolStripMenuItem.Visible = false; + toolStripMenuItemAssStyles.Visible = false; + toolStripMenuItemWebVTT.Visible = false; + } + + if (actors != null) + { + setActorForSelectedLinesToolStripMenuItem.Visible = true; + } + else + { + setActorForSelectedLinesToolStripMenuItem.Visible = false; + } + + if (formatType == typeof(Ebu)) + { + Ebu.EbuGeneralSubtitleInformation header; + if (_subtitle != null && _subtitle.Header != null && (_subtitle.Header.Contains("STL2") || _subtitle.Header.Contains("STL3"))) + { + header = Ebu.ReadHeader(Encoding.UTF8.GetBytes(_subtitle.Header)); + } + else + { + header = new Ebu.EbuGeneralSubtitleInformation(); + } + + var open = header.DisplayStandardCode != "1" && header.DisplayStandardCode != "2"; + boxToolStripMenuItem.Visible = open; + } + else + { + boxToolStripMenuItem.Visible = false; + } + + microsoftBingTranslateToolStripMenuItem.Visible = + !string.IsNullOrEmpty(Configuration.Settings.Tools.MicrosoftTranslatorApiKey) && + !string.IsNullOrEmpty(Configuration.Settings.Tools.MicrosoftTranslatorTokenEndpoint); + + toolStripMenuItemGoogleMicrosoftTranslateSelLine.Visible = false; + if (SubtitleListview1.SelectedItems.Count == 0) + { + contextMenuStripEmpty.Show(MousePosition.X, MousePosition.Y); + e.Cancel = true; + } + else + { + bool noNetWorkSession = _networkSession == null; + + toolStripMenuItemSaveSelectedLines.Visible = false; + toolStripMenuItemInsertBefore.Visible = true; + toolStripMenuItemInsertAfter.Visible = true; + toolStripMenuItemInsertSubtitle.Visible = noNetWorkSession; + toolStripMenuItemMergeLines.Visible = true; + mergeAfterToolStripMenuItem.Visible = true; + mergeBeforeToolStripMenuItem.Visible = true; + splitLineToolStripMenuItem.Visible = true; + toolStripSeparator7.Visible = true; + typeEffectToolStripMenuItem.Visible = noNetWorkSession; + karokeeEffectToolStripMenuItem.Visible = noNetWorkSession; + toolStripSeparatorAdvancedFunctions.Visible = noNetWorkSession; + adjustDisplayTimeForSelectedLinesToolStripMenuItem.Visible = true; + visualSyncSelectedLinesToolStripMenuItem.Visible = true; + toolStripMenuItemGoogleMicrosoftTranslateSelLine.Visible = false; + toolStripMenuItemUnbreakLines.Visible = true; + toolStripMenuItemAutoBreakLines.Visible = true; + toolStripSeparatorBreakLines.Visible = true; + toolStripMenuItemSurroundWithMusicSymbols.Visible = IsUnicode || Configuration.Settings.Tools.MusicSymbol == "#" || Configuration.Settings.Tools.MusicSymbol == "*"; + if (SubtitleListview1.SelectedItems.Count == 1) + { + toolStripMenuItemMergeLines.Visible = false; + visualSyncSelectedLinesToolStripMenuItem.Visible = false; + toolStripMenuItemUnbreakLines.Visible = false; + toolStripMenuItemAutoBreakLines.Visible = false; + toolStripSeparatorBreakLines.Visible = false; + if (_subtitleAlternate != null && noNetWorkSession && !string.IsNullOrEmpty(Configuration.Settings.Tools.MicrosoftBingApiId)) + { + toolStripMenuItemGoogleMicrosoftTranslateSelLine.Visible = true; + } + + toolStripMenuItemMergeDialog.Visible = false; + } + else if (SubtitleListview1.SelectedItems.Count == 2) + { + toolStripMenuItemInsertBefore.Visible = false; + toolStripMenuItemInsertAfter.Visible = false; + toolStripMenuItemInsertSubtitle.Visible = false; + mergeAfterToolStripMenuItem.Visible = false; + mergeBeforeToolStripMenuItem.Visible = false; + splitLineToolStripMenuItem.Visible = false; + toolStripMenuItemMergeDialog.Visible = true; + } + else if (SubtitleListview1.SelectedItems.Count >= 2) + { + toolStripMenuItemSaveSelectedLines.Visible = true; + toolStripMenuItemInsertBefore.Visible = false; + toolStripMenuItemInsertAfter.Visible = false; + toolStripMenuItemInsertSubtitle.Visible = false; + splitLineToolStripMenuItem.Visible = false; + mergeAfterToolStripMenuItem.Visible = false; + mergeBeforeToolStripMenuItem.Visible = false; + toolStripSeparator7.Visible = false; + + if (SubtitleListview1.SelectedItems.Count > 25) + { + toolStripMenuItemMergeLines.Visible = false; + } + else if (SubtitleListview1.SelectedItems.Count > 2) + { // only allow merge if text is not way too long + try + { + int totalLength = 0; + foreach (int index in SubtitleListview1.SelectedIndices) + { + totalLength += _subtitle.Paragraphs[index].Text.Length; + } + + if (totalLength > Configuration.Settings.General.SubtitleLineMaximumLength * 2.5) + { + toolStripMenuItemMergeLines.Visible = false; + } + } + catch + { + } + } + + toolStripMenuItemMergeDialog.Visible = false; + } + + if (formatType != typeof(SubRip)) + { + toolStripSeparatorAdvancedFunctions.Visible = SubtitleListview1.SelectedItems.Count == 1 && noNetWorkSession; + } + } + + toolStripMenuItemPasteSpecial.Visible = Clipboard.ContainsText(); + toolStripMenuItemSurroundWithMusicSymbols.Text = Configuration.Settings.Tools.MusicSymbol; + if (string.IsNullOrEmpty(Configuration.Settings.Tools.MusicSymbol)) + { + toolStripMenuItemSurroundWithMusicSymbols.Visible = false; + } + } + + private void tsi_Click(object sender, EventArgs e) + { + string style = (sender as ToolStripItem).Text; + if (!string.IsNullOrEmpty(style)) + { + MakeHistoryForUndo("Set style: " + style); + + var format = GetCurrentSubtitleFormat(); + var formatType = format.GetType(); + if ((formatType == typeof(TimedText10) || formatType == typeof(ItunesTimedText))) + { + foreach (int index in SubtitleListview1.SelectedIndices) + { + _subtitle.Paragraphs[index].Style = style; + _subtitle.Paragraphs[index].Extra = TimedText10.SetExtra(_subtitle.Paragraphs[index]); + SubtitleListview1.SetExtraText(index, _subtitle.Paragraphs[index].Extra, SubtitleListview1.ForeColor); + } + } + else + { + foreach (int index in SubtitleListview1.SelectedIndices) + { + _subtitle.Paragraphs[index].Extra = style; + SubtitleListview1.SetExtraText(index, style, SubtitleListview1.ForeColor); + } + } + } + } + + private void actor_Click(object sender, EventArgs e) + { + string actor = (sender as ToolStripItem).Text; + if (!string.IsNullOrEmpty(actor)) + { + MakeHistoryForUndo(Configuration.Settings.Language.Main.Menu.ContextMenu.SetActor + ": " + actor); + + foreach (int index in SubtitleListview1.SelectedIndices) + { + _subtitle.Paragraphs[index].Actor = actor; + SubtitleListview1.SetTimeAndText(index, _subtitle.Paragraphs[index], _subtitle.GetParagraphOrDefault(index + 1)); + } + } + } + + private void SetRegionClick(object sender, EventArgs e) + { + string region = (sender as ToolStripItem).Text; + if (!string.IsNullOrEmpty(region)) + { + MakeHistoryForUndo("Set region: " + region); + foreach (int index in SubtitleListview1.SelectedIndices) + { + _subtitle.Paragraphs[index].Region = region; + SubtitleListview1.SetTimeAndText(index, _subtitle.Paragraphs[index], _subtitle.GetParagraphOrDefault(index + 1)); + } + } + } + + private void AddLanguageClick(object sender, EventArgs e) + { + string lang = (sender as ToolStripItem).Text; + if (!string.IsNullOrEmpty(lang)) + { + MakeHistoryForUndo("Set language: " + lang); + foreach (int index in SubtitleListview1.SelectedIndices) + { + _subtitle.Paragraphs[index].Language = lang; + _subtitle.Paragraphs[index].Extra = TimedText10.SetExtra(_subtitle.Paragraphs[index]); + SubtitleListview1.SetExtraText(index, _subtitle.Paragraphs[index].Extra, SubtitleListview1.ForeColor); + } + } + } + + private void NuendoSetStyle(object sender, EventArgs e) + { + string style = (sender as ToolStripItem).Text; + if (!string.IsNullOrEmpty(style)) + { + int indexOfComment = style.IndexOf('['); + if (indexOfComment > 0) + { + style = style.Substring(0, indexOfComment).Trim(); + } + + MakeHistoryForUndo("Set style: " + style); + foreach (int index in SubtitleListview1.SelectedIndices) + { + _subtitle.Paragraphs[index].Extra = style; + _subtitle.Paragraphs[index].Actor = style; + SubtitleListview1.SetExtraText(index, style, SubtitleListview1.ForeColor); + } + } + } + + private void WebVTTSetVoice(object sender, EventArgs e) + { + string voice = (sender as ToolStripItem).Text; + if (!string.IsNullOrEmpty(voice)) + { + MakeHistoryForUndo("Set voice: " + voice); + foreach (int index in SubtitleListview1.SelectedIndices) + { + _subtitle.Paragraphs[index].Text = WebVTT.RemoveTag("v", _subtitle.Paragraphs[index].Text); + _subtitle.Paragraphs[index].Text = string.Format("{1}", voice, _subtitle.Paragraphs[index].Text); + SubtitleListview1.SetText(index, _subtitle.Paragraphs[index].Text); + } + + RefreshSelectedParagraph(); + } + } + + private void WebVTTSetNewVoice(object sender, EventArgs e) + { + using (var form = new TextPrompt(Configuration.Settings.Language.WebVttNewVoice.Title, Configuration.Settings.Language.WebVttNewVoice.VoiceName)) + { + if (form.ShowDialog(this) == DialogResult.OK) + { + string voice = form.InputText; + if (!string.IsNullOrEmpty(voice)) + { + foreach (int index in SubtitleListview1.SelectedIndices) + { + _subtitle.Paragraphs[index].Text = WebVTT.RemoveTag("v", _subtitle.Paragraphs[index].Text); + _subtitle.Paragraphs[index].Text = string.Format("{1}", voice, _subtitle.Paragraphs[index].Text); + SubtitleListview1.SetText(index, _subtitle.Paragraphs[index].Text); + } + + RefreshSelectedParagraph(); + } + } + } + } + + private void SetNewActor(object sender, EventArgs e) + { + using (var form = new TextPrompt(Configuration.Settings.Language.Main.Menu.ContextMenu.NewActor.Replace("...", string.Empty), Configuration.Settings.Language.General.Actor)) + { + if (form.ShowDialog(this) == DialogResult.OK) + { + string actor = form.InputText; + if (!string.IsNullOrEmpty(actor)) + { + foreach (int index in SubtitleListview1.SelectedIndices) + { + _subtitle.Paragraphs[index].Actor = actor; + SubtitleListview1.SetTimeAndText(index, _subtitle.Paragraphs[index], _subtitle.GetParagraphOrDefault(index + 1)); + } + } + } + } + } + + private void WebVTTRemoveVoices(object sender, EventArgs e) + { + foreach (int index in SubtitleListview1.SelectedIndices) + { + _subtitle.Paragraphs[index].Text = WebVTT.RemoveTag("v", _subtitle.Paragraphs[index].Text); + SubtitleListview1.SetText(index, _subtitle.Paragraphs[index].Text); + } + + RefreshSelectedParagraph(); + } + + private void RemoveActors(object sender, EventArgs e) + { + foreach (int index in SubtitleListview1.SelectedIndices) + { + _subtitle.Paragraphs[index].Actor = null; + SubtitleListview1.SetTimeAndText(index, _subtitle.Paragraphs[index], _subtitle.GetParagraphOrDefault(index + 1)); + } + } + + private void WebVTTSetVoiceTextBox(object sender, EventArgs e) + { + string voice = (sender as ToolStripItem).Text; + if (!string.IsNullOrEmpty(voice)) + { + var tb = GetFocusedTextBox(); + + if (tb.SelectionLength > 0) + { + string s = tb.SelectedText; + s = WebVTT.RemoveTag("v", s); + if (tb.SelectedText == tb.Text) + { + s = string.Format("{1}", voice, s); + } + else + { + s = string.Format("{1}", voice, s); + } + + tb.SelectedText = s; + } + } + } + + private void WebVTTSetNewVoiceTextBox(object sender, EventArgs e) + { + using (var form = new TextPrompt(Configuration.Settings.Language.WebVttNewVoice.Title, Configuration.Settings.Language.WebVttNewVoice.VoiceName)) + { + if (form.ShowDialog(this) == DialogResult.OK) + { + string voice = form.InputText; + if (!string.IsNullOrEmpty(voice)) + { + var tb = GetFocusedTextBox(); + + if (tb.SelectionLength > 0) + { + string s = tb.SelectedText; + s = WebVTT.RemoveTag("v", s); + if (tb.SelectedText == tb.Text) + { + s = string.Format("{1}", voice, s); + } + else + { + s = string.Format("{1}", voice, s); + } + + tb.SelectedText = s; + } + } + } + } + } + + private void BoldToolStripMenuItemClick(object sender, EventArgs e) + { + ListViewToggleTag(HtmlUtil.TagBold); + } + + private void ItalicToolStripMenuItemClick(object sender, EventArgs e) + { + ListViewToggleTag(HtmlUtil.TagItalic); + } + + private void UnderlineToolStripMenuItemClick(object sender, EventArgs e) + { + ListViewToggleTag(HtmlUtil.TagUnderline); + } + + private void ListViewToggleTag(string tag) + { + if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 0) + { + SubtitleListview1.SelectedIndexChanged -= SubtitleListview1_SelectedIndexChanged; + MakeHistoryForUndo(string.Format(_language.BeforeAddingTagX, tag)); + + var indices = new List(); + foreach (ListViewItem item in SubtitleListview1.SelectedItems) + { + indices.Add(item.Index); + } + + SubtitleListview1.BeginUpdate(); + foreach (int i in indices) + { + var p = _subtitle.GetParagraphOrDefault(i); + if (p != null) + { + if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) + { + var original = Utilities.GetOriginalParagraph(i, p, _subtitleAlternate.Paragraphs); + if (original != null) + { + original.Text = HtmlUtil.ToggleTag(original.Text, tag); + SubtitleListview1.SetAlternateText(i, original.Text); + } + } + + p.Text = HtmlUtil.ToggleTag(p.Text, tag); + SubtitleListview1.SetText(i, p.Text); + } + } + + SubtitleListview1.EndUpdate(); + + ShowStatus(string.Format(_language.TagXAdded, tag)); + ShowSource(); + RefreshSelectedParagraph(); + SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; + } + } + + private void ToolStripMenuItemDeleteClick(object sender, EventArgs e) + { + if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 0) + { + string statusText; + string historyText; + string askText; + + if (SubtitleListview1.SelectedItems.Count > 1) + { + statusText = string.Format(_language.XLinesDeleted, SubtitleListview1.SelectedItems.Count); + historyText = string.Format(_language.BeforeDeletingXLines, SubtitleListview1.SelectedItems.Count); + askText = string.Format(_language.DeleteXLinesPrompt, SubtitleListview1.SelectedItems.Count); + } + else + { + statusText = _language.OneLineDeleted; + historyText = _language.BeforeDeletingOneLine; + askText = _language.DeleteOneLinePrompt; + } + + if (Configuration.Settings.General.PromptDeleteLines && MessageBox.Show(askText, Title, MessageBoxButtons.YesNoCancel) != DialogResult.Yes) + { + _cutText = string.Empty; + return; + } + + if (!string.IsNullOrEmpty(_cutText)) + { + Clipboard.SetText(_cutText); + _cutText = string.Empty; + } + + MakeHistoryForUndo(historyText); + DeleteSelectedLines(); + + ResetTextInfoIfEmpty(); + + ShowStatus(statusText); + ShowSource(); + } + } + + private void ResetTextInfoIfEmpty() + { + if (_subtitle.Paragraphs.Count == 0) + { + labelStartTimeWarning.Text = string.Empty; + labelDurationWarning.Text = string.Empty; + _subtitleListViewIndex = -1; + textBoxListViewText.Text = string.Empty; + textBoxListViewTextAlternate.Text = string.Empty; + textBoxListViewText.Enabled = false; + textBoxListViewText.BackColor = SystemColors.ActiveBorder; + textBoxListViewTextAlternate.BackColor = SystemColors.ActiveBorder; + buttonSplitLine.Visible = false; + labelTextLineLengths.Text = string.Empty; + labelCharactersPerSecond.Text = string.Empty; + labelTextLineTotal.Text = string.Empty; + textBoxListViewText.Enabled = false; + labelSingleLine.Text = string.Empty; + labelSingleLinePixels.Text = string.Empty; + timeUpDownStartTime.TimeCode = new TimeCode(); + numericUpDownDuration.Value = 0; + ShowHideBookmark(new Paragraph()); + labelAlternateSingleLine.Text = string.Empty; + labelAlternateSingleLinePixels.Text = string.Empty; + textBoxListViewTextAlternate.Enabled = false; + labelAlternateCharactersPerSecond.Text = string.Empty; + labelTextAlternateLineLengths.Text = string.Empty; + labelTextAlternateLineTotal.Text = string.Empty; + } + } + + private void DeleteSelectedLines() + { + _subtitleListViewIndex = -1; + textBoxListViewText.Text = string.Empty; + textBoxListViewTextAlternate.Text = string.Empty; + if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) + { + var alternateIndices = new List(); + foreach (ListViewItem item in SubtitleListview1.SelectedItems) + { + var p = _subtitle.GetParagraphOrDefault(item.Index); + if (p != null) + { + var original = Utilities.GetOriginalParagraph(item.Index, p, _subtitleAlternate.Paragraphs); + if (original != null) + { + alternateIndices.Add(_subtitleAlternate.GetIndex(original)); + } + } + } + + alternateIndices.Reverse(); + foreach (int i in alternateIndices) + { + if (i < _subtitleAlternate.Paragraphs.Count) + { + _subtitleAlternate.Paragraphs.RemoveAt(i); + } + } + + _subtitleAlternate.Renumber(); + } + + var indices = new List(); + foreach (ListViewItem item in SubtitleListview1.SelectedItems) + { + indices.Add(item.Index); + } + + int firstIndex = SubtitleListview1.SelectedItems[0].Index; + + if (_networkSession != null) + { + _networkSession.TimerStop(); + NetworkGetSendUpdates(indices, 0, null); + } + else + { + indices.Reverse(); + foreach (int i in indices) + { + _subtitle.Paragraphs.RemoveAt(i); + } + + _subtitle.Renumber(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + if (SubtitleListview1.FirstVisibleIndex == 0) + { + SubtitleListview1.FirstVisibleIndex = -1; + } + + if (SubtitleListview1.Items.Count > firstIndex) + { + SubtitleListview1.SelectIndexAndEnsureVisible(firstIndex, true); + } + else if (SubtitleListview1.Items.Count > 0) + { + SubtitleListview1.SelectIndexAndEnsureVisible(SubtitleListview1.Items.Count - 1, true); + } + } + + ResetTextInfoIfEmpty(); + SetListViewStateImages(); + } + + private void ToolStripMenuItemInsertBeforeClick(object sender, EventArgs e) + { + if (_subtitle.Paragraphs.Count > 0) + { + InsertBefore(); + } + + textBoxListViewText.Focus(); + } + + private void InsertBefore() + { + MakeHistoryForUndo(_language.BeforeInsertLine); + + int firstSelectedIndex = 0; + if (SubtitleListview1.SelectedItems.Count > 0) + { + firstSelectedIndex = SubtitleListview1.SelectedItems[0].Index; + } + + int addMilliseconds = Configuration.Settings.General.MinimumMillisecondsBetweenLines + 1; + if (addMilliseconds < 1) + { + addMilliseconds = 1; + } + + var newParagraph = new Paragraph(); + + SetStyleForNewParagraph(newParagraph, firstSelectedIndex); + + var prev = _subtitle.GetParagraphOrDefault(firstSelectedIndex - 1); + var next = _subtitle.GetParagraphOrDefault(firstSelectedIndex); + if (prev != null && next != null) + { + newParagraph.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - addMilliseconds; + newParagraph.StartTime.TotalMilliseconds = newParagraph.EndTime.TotalMilliseconds - 2000; + if (newParagraph.StartTime.TotalMilliseconds <= prev.EndTime.TotalMilliseconds) + { + newParagraph.StartTime.TotalMilliseconds = prev.EndTime.TotalMilliseconds + 1; + } + + if (newParagraph.Duration.TotalMilliseconds < 100) + { + newParagraph.EndTime.TotalMilliseconds += 100; + } + + if (next.StartTime.IsMaxTime && prev.EndTime.IsMaxTime) + { + newParagraph.StartTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; + newParagraph.EndTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; + } + else if (next.StartTime.TotalMilliseconds == 0 && prev.EndTime.TotalMilliseconds == 0) + { + newParagraph.StartTime.TotalMilliseconds = 0; + newParagraph.EndTime.TotalMilliseconds = 0; + } + else if (prev.StartTime.TotalMilliseconds == next.StartTime.TotalMilliseconds && + prev.EndTime.TotalMilliseconds == next.EndTime.TotalMilliseconds) + { + newParagraph.StartTime.TotalMilliseconds = prev.StartTime.TotalMilliseconds; + newParagraph.EndTime.TotalMilliseconds = prev.EndTime.TotalMilliseconds; + } + } + else if (prev != null) + { + newParagraph.StartTime.TotalMilliseconds = prev.EndTime.TotalMilliseconds + addMilliseconds; + newParagraph.EndTime.TotalMilliseconds = newParagraph.StartTime.TotalMilliseconds + Configuration.Settings.General.NewEmptyDefaultMs; + if (newParagraph.StartTime.TotalMilliseconds > newParagraph.EndTime.TotalMilliseconds) + { + newParagraph.StartTime.TotalMilliseconds = prev.EndTime.TotalMilliseconds + 1; + } + } + else if (next != null) + { + newParagraph.StartTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - (2000 + Configuration.Settings.General.MinimumMillisecondsBetweenLines); + newParagraph.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; + + if (next.StartTime.IsMaxTime) + { + newParagraph.StartTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; + newParagraph.EndTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; + } + else if (next.StartTime.TotalMilliseconds == 0 && next.EndTime.TotalMilliseconds == 0) + { + newParagraph.StartTime.TotalMilliseconds = 0; + newParagraph.EndTime.TotalMilliseconds = 0; + } + } + else + { + newParagraph.StartTime.TotalMilliseconds = 1000; + newParagraph.EndTime.TotalMilliseconds = 3000; + if (newParagraph.Duration.TotalMilliseconds < Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds) + { + newParagraph.EndTime.TotalMilliseconds = newParagraph.StartTime.TotalMilliseconds + + Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds; + } + } + + if (_networkSession != null) + { + _networkSession.TimerStop(); + NetworkGetSendUpdates(new List(), firstSelectedIndex, newParagraph); + } + else + { + _subtitle.Paragraphs.Insert(firstSelectedIndex, newParagraph); + _subtitleListViewIndex = -1; + _subtitle.Renumber(); + + if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && SubtitleListview1.IsAlternateTextColumnVisible) + { + var currentOriginal = Utilities.GetOriginalParagraph(firstSelectedIndex, _subtitle.Paragraphs[firstSelectedIndex], _subtitleAlternate.Paragraphs); + if (currentOriginal != null) + { + _subtitleAlternate.Paragraphs.Insert(_subtitleAlternate.Paragraphs.IndexOf(currentOriginal), new Paragraph(newParagraph)); + } + else + { + _subtitleAlternate.InsertParagraphInCorrectTimeOrder(new Paragraph(newParagraph)); + } + + _subtitleAlternate.Renumber(); + } + + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + } + + SubtitleListview1.SelectIndexAndEnsureVisible(firstSelectedIndex, true); + ShowSource(); + ShowStatus(_language.LineInserted); + } + + private void ToolStripMenuItemInsertAfterClick(object sender, EventArgs e) + { + if (_subtitle.Paragraphs.Count > 0) + { + InsertAfter(string.Empty); + textBoxListViewText.Focus(); + } + } + + private void InsertAfter(string text) + { + MakeHistoryForUndo(_language.BeforeInsertLine); + + int firstSelectedIndex = 0; + if (SubtitleListview1.SelectedItems.Count > 0) + { + firstSelectedIndex = SubtitleListview1.SelectedItems[0].Index + 1; + } + + var newParagraph = new Paragraph { Text = text }; + + SetStyleForNewParagraph(newParagraph, firstSelectedIndex); + + var prev = _subtitle.GetParagraphOrDefault(firstSelectedIndex - 1); + var next = _subtitle.GetParagraphOrDefault(firstSelectedIndex); + if (prev != null) + { + int addMilliseconds = Configuration.Settings.General.MinimumMillisecondsBetweenLines; + if (addMilliseconds < 1) + { + addMilliseconds = 1; + } + + newParagraph.StartTime.TotalMilliseconds = prev.EndTime.TotalMilliseconds + addMilliseconds; + newParagraph.EndTime.TotalMilliseconds = newParagraph.StartTime.TotalMilliseconds + Configuration.Settings.General.NewEmptyDefaultMs; + if (next != null && newParagraph.EndTime.TotalMilliseconds > next.StartTime.TotalMilliseconds) + { + newParagraph.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; + } + + if (newParagraph.StartTime.TotalMilliseconds > newParagraph.EndTime.TotalMilliseconds) + { + newParagraph.StartTime.TotalMilliseconds = prev.EndTime.TotalMilliseconds + 1; + } + + if (next != null && next.StartTime.IsMaxTime && prev.EndTime.IsMaxTime) + { + newParagraph.StartTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; + newParagraph.EndTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; + } + else if (next != null && next.StartTime.TotalMilliseconds == 0 && prev.EndTime.TotalMilliseconds == 0) + { + newParagraph.StartTime.TotalMilliseconds = 0; + newParagraph.EndTime.TotalMilliseconds = 0; + } + else if (next == null && prev.EndTime.IsMaxTime) + { + newParagraph.StartTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; + newParagraph.EndTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; + } + else if (next == null && prev.EndTime.TotalMilliseconds == 0) + { + newParagraph.StartTime.TotalMilliseconds = 0; + newParagraph.EndTime.TotalMilliseconds = 0; + } + else if (next != null && + prev.StartTime.TotalMilliseconds == next.StartTime.TotalMilliseconds && + prev.EndTime.TotalMilliseconds == next.EndTime.TotalMilliseconds) + { + newParagraph.StartTime.TotalMilliseconds = prev.StartTime.TotalMilliseconds; + newParagraph.EndTime.TotalMilliseconds = prev.EndTime.TotalMilliseconds; + } + } + else if (next != null) + { + newParagraph.StartTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - 2000; + newParagraph.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - 1; + } + else + { + newParagraph.StartTime.TotalMilliseconds = 1000; + newParagraph.EndTime.TotalMilliseconds = 3000; + if (newParagraph.Duration.TotalMilliseconds < Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds) + { + newParagraph.EndTime.TotalMilliseconds = newParagraph.StartTime.TotalMilliseconds + + Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds; + } + } + + if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) + { + var currentOriginal = Utilities.GetOriginalParagraph(firstSelectedIndex - 1, _subtitle.Paragraphs[firstSelectedIndex - 1], _subtitleAlternate.Paragraphs); + if (currentOriginal != null) + { + _subtitleAlternate.Paragraphs.Insert(_subtitleAlternate.Paragraphs.IndexOf(currentOriginal) + 1, new Paragraph(newParagraph)); + } + else + { + _subtitleAlternate.InsertParagraphInCorrectTimeOrder(new Paragraph(newParagraph)); + } + + _subtitleAlternate.Renumber(); + } + + if (_networkSession != null) + { + _networkSession.TimerStop(); + NetworkGetSendUpdates(new List(), firstSelectedIndex, newParagraph); + } + else + { + _subtitle.Paragraphs.Insert(firstSelectedIndex, newParagraph); + _subtitle.Renumber(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + } + + SubtitleListview1.SelectIndexAndEnsureVisible(firstSelectedIndex, true); + ShowSource(); + ShowStatus(_language.LineInserted); + } + + private void SetStyleForNewParagraph(Paragraph newParagraph, int nearestIndex) + { + var format = GetCurrentSubtitleFormat(); + bool useExtraForStyle = format.HasStyleSupport; + var formatType = format.GetType(); + var styles = new List(); + if (formatType == typeof(AdvancedSubStationAlpha) || formatType == typeof(SubStationAlpha)) + { + styles = AdvancedSubStationAlpha.GetStylesFromHeader(_subtitle.Header); + } + else if (formatType == typeof(TimedText10) || formatType == typeof(ItunesTimedText)) + { + styles = TimedText10.GetStylesFromHeader(_subtitle.Header); + } + else if (formatType == typeof(Sami) || formatType == typeof(SamiModern)) + { + styles = Sami.GetStylesFromHeader(_subtitle.Header); + } + + string style = "Default"; + if (styles.Count > 0) + { + style = styles[0]; + } + + if (useExtraForStyle) + { + newParagraph.Extra = style; + if (format.GetType() == typeof(TimedText10) || format.GetType() == typeof(ItunesTimedText)) + { + if (styles.Count > 0) + { + newParagraph.Style = style; + } + + var c = _subtitle.GetParagraphOrDefault(nearestIndex); + if (c != null) + { + newParagraph.Style = c.Style; + newParagraph.Region = c.Region; + newParagraph.Language = c.Language; + } + + newParagraph.Extra = TimedText10.SetExtra(newParagraph); + } + } + } + + private void SubtitleListView1SelectedIndexChange() + { + StopAutoDuration(); + ShowLineInformationListView(); + if (_subtitle.Paragraphs.Count > 0) + { + int firstSelectedIndex = 0; + if (SubtitleListview1.SelectedItems.Count > 0) + { + firstSelectedIndex = SubtitleListview1.SelectedItems[0].Index; + } + + if (_subtitleListViewIndex >= 0) + { + if (_subtitleListViewIndex == firstSelectedIndex) + { + return; + } + + bool showSource = false; + + var last = _subtitle.GetParagraphOrDefault(_subtitleListViewIndex); + if (textBoxListViewText.Text != last.Text) + { + last.Text = textBoxListViewText.Text.TrimEnd(); + SubtitleListview1.SetText(_subtitleListViewIndex, last.Text); + showSource = true; + } + + var startTime = timeUpDownStartTime.TimeCode; + if (startTime != null) + { + if (Math.Abs(last.StartTime.TotalMilliseconds - startTime.TotalMilliseconds) > 0.5) + { + var dur = last.Duration.TotalMilliseconds; + last.StartTime.TotalMilliseconds = startTime.TotalMilliseconds; + last.EndTime.TotalMilliseconds = startTime.TotalMilliseconds + dur; + SubtitleListview1.SetStartTimeAndDuration(_subtitleListViewIndex, last, _subtitle.GetParagraphOrDefault(_subtitleListViewIndex + 1), _subtitle.GetParagraphOrDefault(_subtitleListViewIndex - 1)); + showSource = true; + } + } + + var duration = GetDurationInMilliseconds(); + if (duration > 0 && duration < 100000 && Math.Abs(duration - last.Duration.TotalMilliseconds) > 0.5) + { + last.EndTime.TotalMilliseconds = last.StartTime.TotalMilliseconds + duration; + SubtitleListview1.SetDuration(_subtitleListViewIndex, last, _subtitle.GetParagraphOrDefault(_subtitleListViewIndex + 1)); + showSource = true; + } + + if (showSource) + { + ShowSource(); + } + } + + var p = _subtitle.GetParagraphOrDefault(firstSelectedIndex); + if (p != null) + { + InitializeListViewEditBox(p); + _subtitleListViewIndex = firstSelectedIndex; + _oldSelectedParagraph = new Paragraph(p); + UpdateListViewTextInfo(labelTextLineLengths, labelSingleLine, labelSingleLinePixels, labelTextLineTotal, labelCharactersPerSecond, p, textBoxListViewText); + FixVerticalScrollBars(textBoxListViewText, ref _lastNumberOfNewLines); + + if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) + { + InitializeListViewEditBoxAlternate(p, firstSelectedIndex); + labelAlternateCharactersPerSecond.Left = textBoxListViewTextAlternate.Left + (textBoxListViewTextAlternate.Width - labelAlternateCharactersPerSecond.Width); + labelTextAlternateLineTotal.Left = textBoxListViewTextAlternate.Left + (textBoxListViewTextAlternate.Width - labelTextAlternateLineTotal.Width); + } + } + } + } + + private long _lastSubtitleListviewSelectedIndexChangedTick = -1; + private long _lastLastSubtitleListviewSelectedIndexChangedTick = -1; + + private void SubtitleListview1_SelectedIndexChanged(object sender, EventArgs e) + { + if (SubtitleListview1.SelectedIndices.Count == 0) + { + _listViewTextUndoIndex = -1; + return; + } + + if (DateTime.UtcNow.Ticks - _lastLastSubtitleListviewSelectedIndexChangedTick < 10000 * 50) // only if last change was less ago than 50 milliseconds + { + SubtitleListview1.SelectedIndexChanged -= SubtitleListview1_SelectedIndexChanged; + System.Threading.SynchronizationContext.Current.Post(TimeSpan.FromMilliseconds(50), () => + { + SubtitleListview1_SelectedIndexChanged(null, null); + SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; + }); + return; + } + + if (!_makeHistoryPaused) + { + _listViewTextTicks = 0; + _listViewAlternateTextTicks = 0; + TimerTextUndoTick(null, null); + TimerAlternateTextUndoTick(null, null); + } + + _listViewTextUndoIndex = -1; + SubtitleListView1SelectedIndexChange(); + if (_findHelper != null && !_findHelper.InProgress) + { + _findHelper.StartLineIndex = _subtitleListViewIndex; + _findHelper.SelectedIndex = _subtitleListViewIndex; + _findHelper.SelectedPosition = 0; + _findHelper.ReplaceFromPosition = 0; + _findHelper.MatchInOriginal = false; + } + + _lastLastSubtitleListviewSelectedIndexChangedTick = _lastSubtitleListviewSelectedIndexChangedTick; + _lastSubtitleListviewSelectedIndexChangedTick = DateTime.UtcNow.Ticks; + } + + private void ShowLineInformationListView() + { + var profile = Configuration.Settings.General.CurrentProfile + " "; + if (!ShowProfileInStatusBar) + { + profile = string.Empty; + } + + if (tabControlSubtitle.SelectedIndex == TabControlListView) + { + if (SubtitleListview1.SelectedItems.Count == 1) + { + toolStripSelected.Text = profile + string.Format("{0}/{1}", SubtitleListview1.SelectedItems[0].Index + 1, SubtitleListview1.Items.Count); + } + else + { + toolStripSelected.Text = profile + string.Format(_language.XLinesSelected, SubtitleListview1.SelectedItems.Count); + } + } + } + + private void UpdateListViewTextCharactersPerSeconds(Label charsPerSecond, Paragraph paragraph) + { + if (paragraph.Duration.TotalSeconds > 0) + { + double charactersPerSecond = Utilities.GetCharactersPerSecond(paragraph); + if (charactersPerSecond > Configuration.Settings.General.SubtitleMaximumCharactersPerSeconds && + Configuration.Settings.Tools.ListViewSyntaxColorDurationSmall) + { + charsPerSecond.ForeColor = Color.Red; + } + else + { + charsPerSecond.ForeColor = UiUtil.ForeColor; + } + + charsPerSecond.Text = string.Format(_language.CharactersPerSecond, charactersPerSecond); + } + else + { + if (Configuration.Settings.Tools.ListViewSyntaxColorDurationSmall) + { + charsPerSecond.ForeColor = UiUtil.ForeColor; + } + else + { + charsPerSecond.ForeColor = Color.Red; + } + + charsPerSecond.Text = string.Format(_language.CharactersPerSecond, _languageGeneral.NotAvailable); + } + } + + private void UpdateListViewTextInfo(Label lineLengths, Label singleLine, Label singleLinePixels, Label lineTotal, Label charactersPerSecond, Paragraph paragraph, SETextBox textBox) + { + if (paragraph == null) + { + return; + } + + bool textBoxHasFocus = textBox.Focused; + string text = paragraph.Text; + lineLengths.Text = _languageGeneral.SingleLineLengths.Trim(); + singleLine.Left = lineLengths.Left + lineLengths.Width - 3; + singleLinePixels.Left = lineLengths.Left + lineLengths.Width + 50; + text = HtmlUtil.RemoveHtmlTags(text, true); + text = NetflixImsc11Japanese.RemoveTags(text); + UiUtil.GetLineLengths(singleLine, text); + + if (Configuration.Settings.Tools.ListViewSyntaxColorWideLines) + { + UiUtil.GetLinePixelWidths(singleLinePixels, text); + labelSingleLinePixels.Visible = !(textBoxListViewText.Width / 3 < labelTextLineLengths.Width); + } + else + { + labelSingleLinePixels.Visible = false; + } + + buttonSplitLine.Visible = false; + + var s = text.Replace(Environment.NewLine, " "); + var len = text.CountCharacters(false, Configuration.Settings.General.IgnoreArabicDiacritics); + + int numberOfLines = Utilities.GetNumberOfLines(text.Trim()); + int maxLines = int.MaxValue; + if (Configuration.Settings.Tools.ListViewSyntaxMoreThanXLines) + { + maxLines = Configuration.Settings.General.MaxNumberOfLines; + } + + var splitLines = text.SplitToLines(); + if (numberOfLines <= maxLines) + { + if (len <= Configuration.Settings.General.SubtitleLineMaximumLength * Math.Max(numberOfLines, 2) && + splitLines.Count == 2 && splitLines[0].StartsWith('-') && splitLines[1].StartsWith('-') && + (splitLines[0].CountCharacters(false, Configuration.Settings.General.IgnoreArabicDiacritics) > Configuration.Settings.General.SubtitleLineMaximumLength || + splitLines[1].CountCharacters(false, Configuration.Settings.General.IgnoreArabicDiacritics) > Configuration.Settings.General.SubtitleLineMaximumLength)) + { + if (buttonUnBreak.Visible) + { + if (!textBoxHasFocus) + { + if (Configuration.Settings.Tools.ListViewSyntaxColorWideLines) + { + var totalLengthPixels = TextWidth.CalcPixelWidth(s); + lineTotal.Text = string.Format(_languageGeneral.TotalLengthX, string.Format("{0} {1}", len, totalLengthPixels)); + } + else + { + lineTotal.Text = string.Format(_languageGeneral.TotalLengthX, len); + } + } + + buttonSplitLine.Visible = true; + } + } + else if (len <= Configuration.Settings.General.SubtitleLineMaximumLength * Math.Max(numberOfLines, 2)) + { + lineTotal.ForeColor = UiUtil.ForeColor; + if (!textBoxHasFocus) + { + if (Configuration.Settings.Tools.ListViewSyntaxColorWideLines) + { + var totalLengthPixels = TextWidth.CalcPixelWidth(s); + lineTotal.Text = string.Format(_languageGeneral.TotalLengthX, string.Format("{0} {1}", len, totalLengthPixels)); + } + else + { + lineTotal.Text = string.Format(_languageGeneral.TotalLengthX, len); + } + } + } + else + { + lineTotal.ForeColor = Color.Red; + if (!textBoxHasFocus) + { + if (Configuration.Settings.Tools.ListViewSyntaxColorWideLines) + { + var totalLengthPixels = TextWidth.CalcPixelWidth(s); + lineTotal.Text = string.Format(_languageGeneral.TotalLengthXSplitLine, string.Format("{0} {1}", len, totalLengthPixels)); + } + else + { + lineTotal.Text = string.Format(_languageGeneral.TotalLengthXSplitLine, len); + } + } + + if (buttonUnBreak.Visible) + { + if (!textBoxHasFocus) + { + if (Configuration.Settings.Tools.ListViewSyntaxColorWideLines) + { + var totalLengthPixels = TextWidth.CalcPixelWidth(s); + lineTotal.Text = string.Format(_languageGeneral.TotalLengthX, string.Format("{0} {1}", len, totalLengthPixels)); + } + else + { + lineTotal.Text = string.Format(_languageGeneral.TotalLengthX, len); + } + } + + var lang = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle); + var abl = Utilities.AutoBreakLine(s, lang).SplitToLines(); + if (abl.Count > maxLines || abl.Any(li => li.CountCharacters(false, Configuration.Settings.General.IgnoreArabicDiacritics) > Configuration.Settings.General.SubtitleLineMaximumLength)) + { + buttonSplitLine.Visible = true; + } + } + } + } + else + { + if (!textBoxHasFocus) + { + if (Configuration.Settings.Tools.ListViewSyntaxColorWideLines) + { + var totalLengthPixels = TextWidth.CalcPixelWidth(s); + lineTotal.Text = string.Format(_languageGeneral.TotalLengthX, string.Format("{0} {1}", len, totalLengthPixels)); + } + else + { + lineTotal.Text = string.Format(_languageGeneral.TotalLengthX, len); + } + } + + var lang = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle); + var abl = Utilities.AutoBreakLine(s, lang).SplitToLines(); + if (abl.Count > maxLines || abl.Any(li => li.CountCharacters(false, Configuration.Settings.General.IgnoreArabicDiacritics) > Configuration.Settings.General.SubtitleLineMaximumLength) && + !textBoxListViewTextAlternate.Visible) + { + buttonSplitLine.Visible = true; + } + } + + UpdateListViewTextCharactersPerSeconds(charactersPerSecond, paragraph); + charactersPerSecond.Left = textBox.Left + (textBox.Width - labelCharactersPerSecond.Width); + lineTotal.Left = textBox.Left + (textBox.Width - lineTotal.Width); + } + + private void ButtonNextClick(object sender, EventArgs e) + { + MoveNextPrevious(0); + } + + private void ButtonPreviousClick(object sender, EventArgs e) + { + MoveNextPrevious(1); + } + + private void MoveNextPrevious(int firstSelectedIndex) + { + if (_subtitle.Paragraphs.Count == 0) + { + return; + } + + SubtitleListview1.SuspendLayout(); + var temp = firstSelectedIndex; + if (SubtitleListview1.SelectedItems.Count > 0) + { + firstSelectedIndex = SubtitleListview1.SelectedItems[0].Index; + } + + firstSelectedIndex = temp == 0 ? firstSelectedIndex + 1 : firstSelectedIndex - 1; + var p = _subtitle.GetParagraphOrDefault(firstSelectedIndex); + if (p != null) + { + SubtitleListview1.SelectIndexAndEnsureVisible(firstSelectedIndex, true); + } + + SubtitleListview1.ResumeLayout(); + } + + private void ButtonAutoBreakClick(object sender, EventArgs e) + { + string language = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle); + string languageOriginal = string.Empty; + if (_subtitleAlternate != null) + { + languageOriginal = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitleAlternate); + } + + var textCaretPos = textBoxListViewText.SelectionStart; + + if (SubtitleListview1.SelectedItems.Count > 1) + { + bool historyAdded = false; + SubtitleListview1.BeginUpdate(); + foreach (int index in SubtitleListview1.SelectedIndices) + { + var p = _subtitle.GetParagraphOrDefault(index); + if (p != null) + { + var oldText = p.Text; + var newText = Utilities.AutoBreakLine(p.Text, language); + if (oldText != newText) + { + if (!historyAdded) + { + historyAdded = true; + MakeHistoryForUndo(_language.Controls.AutoBreak.RemoveChar('&')); + } + + p.Text = newText; + SubtitleListview1.SetText(index, p.Text); + } + + if (_subtitleAlternate != null && SubtitleListview1.IsAlternateTextColumnVisible && Configuration.Settings.General.AllowEditOfOriginalSubtitle) + { + var original = Utilities.GetOriginalParagraph(index, p, _subtitleAlternate.Paragraphs); + if (original != null) + { + oldText = original.Text; + newText = Utilities.AutoBreakLine(original.Text, language); + if (oldText != newText) + { + if (!historyAdded) + { + historyAdded = true; + MakeHistoryForUndo(_language.Controls.AutoBreak.RemoveChar('&')); + } + + original.Text = newText; + SubtitleListview1.SetAlternateText(index, original.Text); + } + } + } + + SubtitleListview1.SyntaxColorLine(_subtitle.Paragraphs, index, p); + } + } + + SubtitleListview1.EndUpdate(); + RefreshSelectedParagraph(); + } + else + { + var fixedText = Utilities.AutoBreakLine(textBoxListViewText.Text, language); + var makeHistory = textBoxListViewText.Text != fixedText; + if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) + { + var alternateFixedText = Utilities.AutoBreakLine(textBoxListViewTextAlternate.Text, languageOriginal); + if (!makeHistory) + { + makeHistory = textBoxListViewTextAlternate.Text != alternateFixedText; + } + + if (makeHistory) + { + MakeHistoryForUndo(_language.Controls.AutoBreak.RemoveChar('&')); + textBoxListViewText.Text = fixedText; + } + + textBoxListViewTextAlternate.Text = alternateFixedText; + } + else if (makeHistory) + { + MakeHistoryForUndo(_language.Controls.AutoBreak.RemoveChar('&')); + textBoxListViewText.Text = fixedText; + } + } + + var s = textBoxListViewText.Text; + var startText = s.Substring(0, Math.Min(textCaretPos, s.Length)); + var numberOfNewLines = Utilities.CountTagInText(startText, Environment.NewLine); + textCaretPos += numberOfNewLines; + if (s.Length > textCaretPos && '\n' == s[textCaretPos]) + { + textCaretPos--; + } + + if (textCaretPos > 0) + { + textBoxListViewText.SelectionStart = textCaretPos; + } + } + + private int _lastNumberOfNewLines = -1; + private int _lastNumberOfNewLinesAlternate = -1; + + private static void FixVerticalScrollBars(SETextBox tb, ref int lastNumberOfNewLines) + { + var noOfNewLines = Utilities.GetNumberOfLines(tb.Text); + if (noOfNewLines == lastNumberOfNewLines) + { + return; + } + + lastNumberOfNewLines = noOfNewLines; + try + { + if (noOfNewLines <= 1 && tb.Text.Length <= 300 || TextRenderer.MeasureText(tb.Text, tb.Font).Height < tb.Height) + { + tb.ScrollBars = RichTextBoxScrollBars.None; + } + else + { + tb.ScrollBars = RichTextBoxScrollBars.Vertical; + } + } + catch + { + // ignored + } + } + + private void TextBoxListViewTextTextChanged(object sender, EventArgs e) + { + var idx = _subtitleListViewIndex; + if (idx < 0 || idx >= _subtitle.Paragraphs.Count) + { + return; + } + + // Writing when text is selected gives a double event + some trouble (typed letter disappears or a crash happens). + // This tries to fix this - changing scrollbars is bad during this double event!? + // Also check https://stackoverflow.com/questions/28331672/c-sharp-textchanged-event-fires-twice-in-a-multiline-textbox + if (textBoxListViewText.Text == string.Empty) + { + _subtitle.Paragraphs[idx].Text = string.Empty; + UpdateListViewTextInfo(labelTextLineLengths, labelSingleLine, labelSingleLinePixels, labelTextLineTotal, labelCharactersPerSecond, _subtitle.Paragraphs[idx], textBoxListViewText); + SubtitleListview1.SetText(idx, string.Empty); + _listViewTextUndoIndex = idx; + labelStatus.Text = string.Empty; + StartUpdateListSyntaxColoring(); + return; + } + + textBoxListViewText.TextChanged -= TextBoxListViewTextTextChanged; + if (_doAutoBreakOnTextChanged) + { + UiUtil.CheckAutoWrap(textBoxListViewText, new KeyEventArgs(Keys.None), Utilities.GetNumberOfLines(textBoxListViewText.Text)); + } + + // update _subtitle + listview + string text = textBoxListViewText.Text.TrimEnd(); + if (ContainsNonStandardNewLines(text)) + { + var lines = text.SplitToLines(); + text = string.Join(Environment.NewLine, lines); + textBoxListViewText.Text = text; + } + + if (idx < 0 || idx >= _subtitle.Paragraphs.Count) + { + return; + } + + _subtitle.Paragraphs[idx].Text = text; + UpdateListViewTextInfo(labelTextLineLengths, labelSingleLine, labelSingleLinePixels, labelTextLineTotal, labelCharactersPerSecond, _subtitle.Paragraphs[idx], textBoxListViewText); + SubtitleListview1.SetText(idx, text); + + _listViewTextUndoIndex = _subtitleListViewIndex; + labelStatus.Text = string.Empty; + + StartUpdateListSyntaxColoring(); + FixVerticalScrollBars(textBoxListViewText, ref _lastNumberOfNewLines); + textBoxListViewText.TextChanged += TextBoxListViewTextTextChanged; + } + + private bool ContainsNonStandardNewLines(string s) + { + if (Environment.NewLine == "\r\n") + { + int i = 0; + while (i < s.Length) + { + var ch = s[i]; + if (ch == '\r') + { + if (i >= s.Length - 1 || s[i + 1] != '\n') + { + return true; + } + + i++; + } + else if (ch == '\n') + { + return true; + } + + i++; + } + + return false; + } + else if (Environment.NewLine == "\n") + { + return s.Contains('\r'); + } + else + { + s = s.Replace(Environment.NewLine, string.Empty); + return s.Contains('\n') || s.Contains('\r'); + } + } + + private void TextBoxListViewTextAlternateTextChanged(object sender, EventArgs e) + { + if (_subtitleListViewIndex >= 0) + { + var p = _subtitle.GetParagraphOrDefault(_subtitleListViewIndex); + if (p == null) + { + return; + } + + var original = Utilities.GetOriginalParagraph(_subtitleListViewIndex, p, _subtitleAlternate.Paragraphs); + if (original != null) + { + if (textBoxListViewTextAlternate.Text == string.Empty) + { + UpdateListViewTextInfo(labelTextAlternateLineLengths, labelAlternateSingleLine, labelAlternateSingleLinePixels, labelTextAlternateLineTotal, labelAlternateCharactersPerSecond, original, textBoxListViewTextAlternate); + SubtitleListview1.SetAlternateText(_subtitleListViewIndex, string.Empty); + _listViewTextUndoIndex = _subtitleListViewIndex; + labelStatus.Text = string.Empty; + StartUpdateListSyntaxColoring(); + return; + } + + int numberOfNewLines = Utilities.GetNumberOfLines(textBoxListViewTextAlternate.Text); + UiUtil.CheckAutoWrap(textBoxListViewTextAlternate, new KeyEventArgs(Keys.None), numberOfNewLines); + + // update _subtitle + listview + string text = textBoxListViewTextAlternate.Text.TrimEnd(); + if (ContainsNonStandardNewLines(text)) + { + var lines = text.SplitToLines(); + text = string.Join(Environment.NewLine, lines); + textBoxListViewTextAlternate.Text = text; + } + + original.Text = text; + UpdateListViewTextInfo(labelTextAlternateLineLengths, labelAlternateSingleLine, labelAlternateSingleLinePixels, labelTextAlternateLineTotal, labelAlternateCharactersPerSecond, original, textBoxListViewTextAlternate); + SubtitleListview1.SetAlternateText(_subtitleListViewIndex, text); + _listViewTextUndoIndex = _subtitleListViewIndex; + } + + labelStatus.Text = string.Empty; + + StartUpdateListSyntaxColoring(); + FixVerticalScrollBars(textBoxListViewTextAlternate, ref _lastNumberOfNewLinesAlternate); + } + } + + private void TextBoxListViewTextKeyDown(object sender, KeyEventArgs e) + { + _listViewTextTicks = DateTime.UtcNow.Ticks; + + if (e.Modifiers == Keys.Shift && e.KeyCode == Keys.ShiftKey) + { + return; + } + + if (e.Modifiers == Keys.Control && e.KeyCode == (Keys.LButton | Keys.ShiftKey)) + { // surround ctrl+v action with history (for undo) + _listViewTextTicks = 0; + TimerTextUndoTick(sender, e); + Application.DoEvents(); + System.Threading.Thread.Sleep(50); + Application.DoEvents(); + _listViewTextTicks = 0; + TimerTextUndoTick(sender, e); + return; + } + + int numberOfLines = Utilities.GetNumberOfLines(textBoxListViewText.Text); + + if (e.Modifiers == Keys.None && e.KeyCode == Keys.Enter && numberOfLines > Configuration.Settings.General.MaxNumberOfLines) + { + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainTextBoxAutoBreak) + { + BreakUnbreakTextBox(false, textBoxListViewText); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainTextBoxUnbreak) + { + BreakUnbreakTextBox(true, textBoxListViewText); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainTextBoxBreakAtCursorPosition) + { + var text = Utilities.ReSplit(textBoxListViewText.Text, textBoxListViewText.SelectionStart); + if (text != textBoxListViewText.Text) + { + MakeHistoryForUndo(string.Format(_language.BeforeReplace, Configuration.Settings.Language.Settings.MainTextBoxAutoBreakFromPos)); + textBoxListViewText.Text = text; + var lines = textBoxListViewText.Text.SplitToLines(); + if (lines.Count > 0) + { + textBoxListViewText.SelectionStart = lines[0].Length; + } + } + + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainTextBoxBreakAtCursorPositionAndGoToNext) + { + var text = Utilities.ReSplit(textBoxListViewText.Text, textBoxListViewText.SelectionStart); + if (text != textBoxListViewText.Text) + { + MakeHistoryForUndo(string.Format(_language.BeforeReplace, Configuration.Settings.Language.Settings.MainTextBoxAutoBreakFromPosAndGoToNext)); + textBoxListViewText.Text = text; + ButtonNextClick(null, null); + } + + e.SuppressKeyPress = true; + } + else if (e.Modifiers == Keys.Alt && e.KeyCode == Keys.I) + { + if (textBoxListViewText.SelectionLength == 0) + { + if (textBoxListViewText.Text.Contains("", StringComparison.Ordinal)) + { + textBoxListViewText.Text = HtmlUtil.RemoveOpenCloseTags(textBoxListViewText.Text, HtmlUtil.TagItalic); + } + else + { + textBoxListViewText.Text = string.Format("{0}", textBoxListViewText.Text); + } + } + else + { + TextBoxListViewToggleTag(HtmlUtil.TagItalic); + e.SuppressKeyPress = true; + } + } + + if (e.Modifiers == Keys.Control && e.KeyCode == Keys.D) + { + textBoxListViewText.SelectionLength = 0; + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainTextBoxSplitAtCursor == e.KeyData) + { + ToolStripMenuItemSplitTextAtCursorClick(null, null); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainTextBoxSplitAtCursorAndVideoPos == e.KeyData) + { + toolStripMenuItemSplitViaWaveform_Click(null, null); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainTextBoxSplitSelectedLineBilingual == e.KeyData) + { + if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count >= 1 && SubtitleListview1.SelectedItems.Count < 10) + { + e.SuppressKeyPress = true; + SplitSelectedLineBilingual(); + } + } + else if (e.KeyData == _shortcuts.MainListViewAlignmentN1) + { + SetAlignment("{\\an1}", false); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainListViewAlignmentN2) + { + SetAlignment("", false); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainListViewAlignmentN3) + { + SetAlignment("{\\an3}", false); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainListViewAlignmentN4) + { + SetAlignment("{\\an4}", false); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainListViewAlignmentN5) + { + SetAlignment("{\\an5}", false); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainListViewAlignmentN6) + { + SetAlignment("{\\an6}", false); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainListViewAlignmentN7) + { + SetAlignment("{\\an7}", false); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainListViewAlignmentN8) + { + SetAlignment("{\\an8}", false); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainListViewAlignmentN9) + { + SetAlignment("{\\an9}", false); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainListViewToggleMusicSymbols) + { + textBoxListViewText.Text = ToogleMusicSymbols("♪", textBoxListViewText.Text); + } + else if (e.KeyData == _shortcuts.MainInsertBefore) + { + InsertBefore(); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainInsertAfter) + { + InsertAfter(string.Empty); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainListViewRemoveTimeCodes) + { + int i = _subtitleListViewIndex; + var p = _subtitle.GetParagraphOrDefault(i); + if (p != null) + { + p.StartTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; + p.EndTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; + RefreshSelectedParagraph(); + } + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainTextBoxSelectionToLower == e.KeyData && textBoxListViewText.SelectionLength > 0) // selection to lowercase + { + int start = textBoxListViewText.SelectionStart; + int length = textBoxListViewText.SelectionLength; + textBoxListViewText.SelectedText = textBoxListViewText.SelectedText.ToLowerInvariant(); + textBoxListViewText.SelectionStart = start; + textBoxListViewText.SelectionLength = length; + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainTextBoxSelectionToUpper == e.KeyData && textBoxListViewText.SelectionLength > 0) // selection to uppercase + { + int start = textBoxListViewText.SelectionStart; + int length = textBoxListViewText.SelectionLength; + textBoxListViewText.SelectedText = textBoxListViewText.SelectedText.ToUpperInvariant(); + textBoxListViewText.SelectionStart = start; + textBoxListViewText.SelectionLength = length; + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainTextBoxSelectionToggleCasing == e.KeyData && textBoxListViewText.SelectionLength > 0) // selection to uppercase + { + int start = textBoxListViewText.SelectionStart; + int length = textBoxListViewText.SelectionLength; + var text = ToggleCasing(textBoxListViewText.SelectedText); + textBoxListViewText.SelectedText = text; + textBoxListViewText.SelectionStart = start; + textBoxListViewText.SelectionLength = length; + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainTextBoxToggleAutoDuration == e.KeyData) // toggle auto-duration + { + if (timerAutoDuration.Enabled) + { + timerAutoDuration.Stop(); + labelAutoDuration.Visible = false; + } + else + { + timerAutoDuration.Start(); + labelAutoDuration.Visible = true; + } + + e.SuppressKeyPress = true; + } + + // last key down in text + _lastTextKeyDownTicks = DateTime.UtcNow.Ticks; + + UpdatePositionAndTotalLength(labelTextLineTotal, textBoxListViewText); + } + + private string ToggleCasing(string text) + { + if (string.IsNullOrWhiteSpace(text) || text.ToLower() == text.ToUpper()) + { + return text; + } + + var containsLowercase = false; + var containsUppercase = false; + for (var i = 0; i < text.Length; i++) + { + var ch = text[i]; + + if (!containsLowercase && char.IsLower(ch)) + { + containsLowercase = true; + } + + if (!containsUppercase && char.IsUpper(ch)) + { + containsUppercase = true; + } + + i++; + } + + if (containsUppercase && containsLowercase) + { + return text.ToUpperInvariant(); + } + + if (containsUppercase && !containsLowercase) + { + return text.ToLowerInvariant(); + } + + return System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(text); + } + + private void MoveFirstWordInNextUp(SETextBox tb) + { + int firstIndex = FirstSelectedIndex; + if (firstIndex >= 0) + { + var p = _subtitle.GetParagraphOrDefault(firstIndex); + var next = _subtitle.GetParagraphOrDefault(firstIndex + 1); + + if (tb == textBoxListViewTextAlternate) + { + p = Utilities.GetOriginalParagraph(firstIndex, p, _subtitleAlternate.Paragraphs); + next = Utilities.GetOriginalParagraph(firstIndex + 1, next, _subtitleAlternate.Paragraphs); + } + + if (p != null && next != null) + { + var moveUpDown = new MoveWordUpDown(p.Text, next.Text); + moveUpDown.MoveWordUp(); + if (moveUpDown.S1 != p.Text && moveUpDown.S2 != next.Text) + { + MakeHistoryForUndo(_language.BeforeLineUpdatedInListView); + p.Text = moveUpDown.S1; + next.Text = moveUpDown.S2; + if (tb == textBoxListViewTextAlternate) + { + SubtitleListview1.SetAlternateText(firstIndex, p.Text); + SubtitleListview1.SetAlternateText(firstIndex + 1, next.Text); + } + else + { + SubtitleListview1.SetText(firstIndex, p.Text); + SubtitleListview1.SetText(firstIndex + 1, next.Text); + } + var selectionStart = textBoxListViewText.SelectionStart; + tb.Text = p.Text; + if (selectionStart >= 0) + { + tb.SelectionStart = selectionStart; + } + } + } + } + } + + private void MoveLastWordDown(SETextBox tb) + { + int firstIndex = FirstSelectedIndex; + if (firstIndex >= 0) + { + var p = _subtitle.GetParagraphOrDefault(firstIndex); + var next = _subtitle.GetParagraphOrDefault(firstIndex + 1); + + if (tb == textBoxListViewTextAlternate) + { + p = Utilities.GetOriginalParagraph(firstIndex, p, _subtitleAlternate.Paragraphs); + next = Utilities.GetOriginalParagraph(firstIndex + 1, next, _subtitleAlternate.Paragraphs); + } + + if (p != null && next != null) + { + var moveUpDown = new MoveWordUpDown(p.Text, next.Text); + moveUpDown.MoveWordDown(); + if (moveUpDown.S1 != p.Text && moveUpDown.S2 != next.Text) + { + MakeHistoryForUndo(_language.BeforeLineUpdatedInListView); + p.Text = moveUpDown.S1; + next.Text = moveUpDown.S2; + if (tb == textBoxListViewTextAlternate) + { + SubtitleListview1.SetAlternateText(firstIndex, p.Text); + SubtitleListview1.SetAlternateText(firstIndex + 1, next.Text); + } + else + { + SubtitleListview1.SetText(firstIndex, p.Text); + SubtitleListview1.SetText(firstIndex + 1, next.Text); + } + var selectionStart = textBoxListViewText.SelectionStart; + tb.Text = p.Text; + if (selectionStart >= 0) + { + tb.SelectionStart = selectionStart; + } + } + } + } + } + + private void MakeAutoDurationSelectedLines() + { + if (_subtitle.Paragraphs.Count == 0) + { + return; + } + + if (SubtitleListview1.SelectedItems.Count == 1) + { + MakeAutoDuration(); + return; + } + + if (SubtitleListview1.SelectedItems.Count > 1) + { + MakeHistoryForUndo(_language.BeforeAutoDuration); + foreach (int index in SubtitleListview1.SelectedIndices) + { + var p = _subtitle.GetParagraphOrDefault(index); + if (p == null) + { + return; + } + + double duration = Utilities.GetOptimalDisplayMilliseconds(textBoxListViewText.Text); + var next = _subtitle.GetParagraphOrDefault(index + 1); + if (next != null && p.StartTime.TotalMilliseconds + duration + Configuration.Settings.General.MinimumMillisecondsBetweenLines > next.StartTime.TotalMilliseconds) + { + duration = next.StartTime.TotalMilliseconds - p.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; + } + + if (duration > 500) + { + p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + duration; + } + } + + SaveSubtitleListviewIndices(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + RefreshSelectedParagraph(); + } + } + + private void MakeAutoDuration() + { + int i = _subtitleListViewIndex; + var p = _subtitle.GetParagraphOrDefault(i); + if (p == null) + { + return; + } + + double duration = Utilities.GetOptimalDisplayMilliseconds(textBoxListViewText.Text); + var next = _subtitle.GetParagraphOrDefault(i + 1); + if (next != null && p.StartTime.TotalMilliseconds + duration + Configuration.Settings.General.MinimumMillisecondsBetweenLines > next.StartTime.TotalMilliseconds) + { + duration = next.StartTime.TotalMilliseconds - p.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; + if (duration < 400) + { + return; + } + } + + SetDurationInSeconds(duration / TimeCode.BaseUnit); + + p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + duration; + SubtitleListview1.SetDuration(i, p, _subtitle.GetParagraphOrDefault(i + 1)); + } + + private void SplitLineToolStripMenuItemClick(object sender, EventArgs e) + { + SplitSelectedParagraph(null, null); + } + + private void SplitSelectedParagraph(double? splitSeconds, int? textIndex) + { + string language = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle); + int? alternateTextIndex = null; + if (textBoxListViewTextAlternate.Focused) + { + alternateTextIndex = textIndex; + textIndex = null; + } + + if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 0) + { + SubtitleListview1.SelectedIndexChanged -= SubtitleListview1_SelectedIndexChanged; + MakeHistoryForUndo(_language.BeforeSplitLine); + + int firstSelectedIndex = SubtitleListview1.SelectedItems[0].Index; + + var currentParagraph = _subtitle.GetParagraphOrDefault(firstSelectedIndex); + var newParagraph = new Paragraph(currentParagraph); + newParagraph.NewSection = false; + + currentParagraph.Text = currentParagraph.Text.Replace("< /i>", ""); + currentParagraph.Text = currentParagraph.Text.Replace("< i>", ""); + string oldText = currentParagraph.Text; + var lines = currentParagraph.Text.SplitToLines(); + if (textIndex != null && textIndex.Value > 1 && textIndex.Value < oldText.Length - 1) + { + string a = oldText.Substring(0, textIndex.Value).Trim(); + string b = oldText.Substring(textIndex.Value).Trim(); + + if (oldText.TrimStart().StartsWith("", StringComparison.Ordinal) && oldText.TrimEnd().EndsWith("", StringComparison.Ordinal) && + Utilities.CountTagInText(oldText, "") == 1 && Utilities.CountTagInText(oldText, "") == 1) + { + a = a + ""; + b = "" + b; + } + else if (oldText.TrimStart().StartsWith("", StringComparison.Ordinal) && oldText.TrimEnd().EndsWith("", StringComparison.Ordinal) && + Utilities.CountTagInText(oldText, "") == 1 && Utilities.CountTagInText(oldText, "") == 1) + { + a = a + "
"; + b = "" + b; + } + + string aTrimmed = HtmlUtil.RemoveHtmlTags(a).TrimEnd('"').TrimEnd().TrimEnd('\'').TrimEnd(); + if (Configuration.Settings.General.SplitRemovesDashes && (aTrimmed.EndsWith('.') || aTrimmed.EndsWith('!') || aTrimmed.EndsWith('?') || aTrimmed.EndsWith('؟'))) + { + a = DialogSplitMerge.RemoveStartDash(a); + b = DialogSplitMerge.RemoveStartDash(b); + } + + currentParagraph.Text = Utilities.AutoBreakLine(a, language); + newParagraph.Text = Utilities.AutoBreakLine(b, language); + } + else + { + var l0 = string.Empty; + if (lines.Count > 0) + { + l0 = HtmlUtil.RemoveHtmlTags(lines[0], true).Trim().TrimEnd('"', '\'').TrimEnd(); + } + + if (lines.Count == 2 && (l0.EndsWith('.') || l0.EndsWith('!') || l0.EndsWith('?') || l0.EndsWith('؟'))) + { + currentParagraph.Text = Utilities.AutoBreakLine(lines[0], language); + newParagraph.Text = Utilities.AutoBreakLine(lines[1], language); + if (currentParagraph.Text.StartsWith("", StringComparison.Ordinal) && !currentParagraph.Text.Contains("") && + newParagraph.Text.EndsWith("", StringComparison.Ordinal) && !newParagraph.Text.Contains("")) + { + currentParagraph.Text = currentParagraph.Text + ""; + newParagraph.Text = "" + newParagraph.Text; + } + + if (currentParagraph.Text.StartsWith("", StringComparison.Ordinal) && !currentParagraph.Text.Contains("") && + newParagraph.Text.EndsWith("", StringComparison.Ordinal) && !newParagraph.Text.Contains("")) + { + currentParagraph.Text = currentParagraph.Text + ""; + newParagraph.Text = "" + newParagraph.Text; + } + + if (Configuration.Settings.General.SplitRemovesDashes) + { + currentParagraph.Text = DialogSplitMerge.RemoveStartDash(currentParagraph.Text); + newParagraph.Text = DialogSplitMerge.RemoveStartDash(newParagraph.Text); + } + } + else + { + string s = currentParagraph.Text; + var arr = HtmlUtil.RemoveHtmlTags(s, true).SplitToLines(); + if (arr.Count == 1 || arr.Count == 2 && (arr[0].Length > Configuration.Settings.General.SubtitleLineMaximumLength || arr[1].Length > Configuration.Settings.General.SubtitleLineMaximumLength)) + { + if (arr.Count == 2 && arr[0].StartsWith('-') && arr[1].StartsWith('-')) + { + if (lines[0].StartsWith("-", StringComparison.Ordinal)) + { + lines[0] = "" + lines[0].Remove(0, 4).TrimStart(); + } + + lines[0] = lines[0].TrimStart('-').TrimStart(); + lines[1] = lines[1].TrimStart('-').TrimStart(); + s = lines[0] + Environment.NewLine + lines[1]; + } + else + { + s = Utilities.AutoBreakLine(currentParagraph.Text, 5, Configuration.Settings.General.MergeLinesShorterThan, language); + } + } + + lines = s.SplitToLines(); + if (lines.Count == 1) + { + s = Utilities.AutoBreakLine(currentParagraph.Text, 3, 20, language); + lines = s.SplitToLines(); + } + + if (lines.Count == 1) + { + s = Utilities.AutoBreakLine(currentParagraph.Text, 3, 18, language); + lines = s.SplitToLines(); + } + + if (lines.Count == 1) + { + s = Utilities.AutoBreakLine(currentParagraph.Text, 3, 15, language); + lines = s.SplitToLines(); + } + + if (lines.Count == 2) + { + if (Utilities.CountTagInText(s, "") == 1 && lines[0].Contains("", StringComparison.Ordinal) && lines[1].Contains("", StringComparison.Ordinal)) + { + lines[0] += ""; + lines[1] = "" + lines[1]; + } + + currentParagraph.Text = Utilities.AutoBreakLine(lines[0], language); + newParagraph.Text = Utilities.AutoBreakLine(lines[1], language); + } + else if (lines.Count == 1) + { + currentParagraph.Text = Utilities.AutoBreakLine(lines[0], language); + newParagraph.Text = string.Empty; + } + else if (lines.Count == 3) + { + currentParagraph.Text = Utilities.AutoBreakLine(lines[0] + Environment.NewLine + lines[1], language); + newParagraph.Text = lines[2]; + } + else if (lines.Count > 3) + { + var half = lines.Count / 2; + var sb1 = new StringBuilder(); + for (int i = 0; i < half; i++) + { + sb1.AppendLine(lines[i]); + } + + currentParagraph.Text = Utilities.AutoBreakLine(sb1.ToString(), language); + sb1 = new StringBuilder(); + for (int i = half; i < lines.Count; i++) + { + sb1.AppendLine(lines[i]); + } + + newParagraph.Text = Utilities.AutoBreakLine(sb1.ToString(), language); + } + + if (currentParagraph.Text.Contains("", StringComparison.Ordinal) && !currentParagraph.Text.Contains("", StringComparison.Ordinal) && + newParagraph.Text.Contains("", StringComparison.Ordinal) && !newParagraph.Text.Contains("", StringComparison.Ordinal)) + { + currentParagraph.Text = currentParagraph.Text + ""; + newParagraph.Text = "" + newParagraph.Text; + } + + if (currentParagraph.Text.Contains("", StringComparison.Ordinal) && !currentParagraph.Text.Contains("", StringComparison.Ordinal) && + newParagraph.Text.Contains("", StringComparison.Ordinal) && !newParagraph.Text.Contains("")) + { + currentParagraph.Text = currentParagraph.Text + ""; + newParagraph.Text = "" + newParagraph.Text; + } + + if (currentParagraph.Text.StartsWith("-", StringComparison.Ordinal) && (currentParagraph.Text.EndsWith(".", StringComparison.Ordinal) || currentParagraph.Text.EndsWith("!", StringComparison.Ordinal)) && + newParagraph.Text.StartsWith("-", StringComparison.Ordinal) && (newParagraph.Text.EndsWith(".", StringComparison.Ordinal) || newParagraph.Text.EndsWith("!", StringComparison.Ordinal))) + { + currentParagraph.Text = currentParagraph.Text.Remove(3, 1); + newParagraph.Text = newParagraph.Text.Remove(3, 1); + } + } + } + + if (currentParagraph.Text.StartsWith(" ", StringComparison.Ordinal)) + { + currentParagraph.Text = currentParagraph.Text.Remove(3, 1); + } + + if (newParagraph.Text.StartsWith(" ", StringComparison.Ordinal)) + { + newParagraph.Text = newParagraph.Text.Remove(3, 1); + } + + var continuationStyle = Configuration.Settings.General.ContinuationStyle; + if (continuationStyle != ContinuationStyle.None) + { + if (language == "ar") + { + currentParagraph.Text = ContinuationUtilities.ConvertToForArabic(currentParagraph.Text); + newParagraph.Text = ContinuationUtilities.ConvertToForArabic(newParagraph.Text); + } + + var continuationProfile = ContinuationUtilities.GetContinuationProfile(continuationStyle); + if (ContinuationUtilities.ShouldAddSuffix(currentParagraph.Text, continuationProfile)) + { + currentParagraph.Text = ContinuationUtilities.AddSuffixIfNeeded(currentParagraph.Text, continuationProfile, false); + newParagraph.Text = ContinuationUtilities.AddPrefixIfNeeded(newParagraph.Text, continuationProfile, false); + } + + if (language == "ar") + { + currentParagraph.Text = ContinuationUtilities.ConvertBackForArabic(currentParagraph.Text); + newParagraph.Text = ContinuationUtilities.ConvertBackForArabic(newParagraph.Text); + } + } + + FixSplitItalicTag(currentParagraph, newParagraph); + FixSplitFontTag(currentParagraph, newParagraph); + SetSplitTime(splitSeconds, currentParagraph, newParagraph, oldText); + + if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) + { + var originalCurrent = Utilities.GetOriginalParagraph(firstSelectedIndex, currentParagraph, _subtitleAlternate.Paragraphs); + if (originalCurrent != null) + { + string languageOriginal = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitleAlternate); + + originalCurrent.EndTime.TotalMilliseconds = currentParagraph.EndTime.TotalMilliseconds; + var originalNew = new Paragraph(newParagraph); + originalNew.NewSection = false; + + lines = originalCurrent.Text.SplitToLines(); + + var l0Trimmed = string.Empty; + if (lines.Count > 0) + { + l0Trimmed = HtmlUtil.RemoveHtmlTags(lines[0]).TrimEnd('\'').TrimEnd('"'); + } + + oldText = originalCurrent.Text; + if (alternateTextIndex != null && alternateTextIndex.Value > 1 && alternateTextIndex.Value < oldText.Length - 1) + { + originalCurrent.Text = Utilities.AutoBreakLine(oldText.Substring(0, alternateTextIndex.Value).Trim(), language); + originalNew.Text = Utilities.AutoBreakLine(oldText.Substring(alternateTextIndex.Value).Trim(), language); + if (originalCurrent.Text.Contains("", StringComparison.Ordinal) && !originalCurrent.Text.Contains("", StringComparison.Ordinal) && + originalNew.Text.Contains("", StringComparison.Ordinal) && !originalNew.Text.Contains("", StringComparison.Ordinal)) + { + if (originalCurrent.Text.StartsWith("-", StringComparison.Ordinal) && (originalCurrent.Text.EndsWith(".", StringComparison.Ordinal) || originalCurrent.Text.EndsWith("?", StringComparison.Ordinal) || + originalCurrent.Text.EndsWith("!", StringComparison.Ordinal) || originalCurrent.Text.EndsWith("؟", StringComparison.Ordinal)) && originalNew.Text.StartsWith("-", StringComparison.Ordinal)) + { + originalCurrent.Text = "" + originalCurrent.Text.Remove(0, 4).Trim(); + originalNew.Text = originalNew.Text.TrimStart('-').Trim(); + } + + originalCurrent.Text = originalCurrent.Text + ""; + originalNew.Text = "" + originalNew.Text; + } + + if (originalCurrent.Text.Contains("", StringComparison.Ordinal) && !originalCurrent.Text.Contains("") && + originalNew.Text.Contains("", StringComparison.Ordinal) && !originalNew.Text.Contains("")) + { + originalCurrent.Text = originalCurrent.Text + ""; + originalNew.Text = "" + originalNew.Text; + } + + if (Configuration.Settings.General.SplitRemovesDashes && (l0Trimmed.EndsWith('.') || l0Trimmed.EndsWith('!') || l0Trimmed.EndsWith('?') || l0Trimmed.EndsWith('؟'))) + { + originalCurrent.Text = DialogSplitMerge.RemoveStartDash(originalCurrent.Text); + originalNew.Text = DialogSplitMerge.RemoveStartDash(originalNew.Text); + } + + lines.Clear(); + } + else if (lines.Count == 2 && (l0Trimmed.EndsWith('.') || l0Trimmed.EndsWith('!') || l0Trimmed.EndsWith('?') || l0Trimmed.EndsWith('؟'))) + { + string a = lines[0].Trim(); + string b = lines[1].Trim(); + if (oldText.TrimStart().StartsWith("", StringComparison.Ordinal) && oldText.TrimEnd().EndsWith("", StringComparison.Ordinal) && + Utilities.CountTagInText(oldText, "") == 1 && Utilities.CountTagInText(oldText, "") == 1) + { + a = a + ""; + b = "" + b; + } + + if (oldText.TrimStart().StartsWith("", StringComparison.Ordinal) && oldText.TrimEnd().EndsWith("", StringComparison.Ordinal) && + Utilities.CountTagInText(oldText, "") == 1 && Utilities.CountTagInText(oldText, "") == 1) + { + a = a + ""; + b = "" + b; + } + + if (Configuration.Settings.General.SplitRemovesDashes) + { + a = DialogSplitMerge.RemoveStartDash(a); + b = DialogSplitMerge.RemoveStartDash(b); + } + + lines[0] = a; + lines[1] = b; + originalCurrent.Text = Utilities.AutoBreakLine(a); + originalNew.Text = Utilities.AutoBreakLine(b); + } + else if (Utilities.GetNumberOfLines(originalCurrent.Text) == 2) + { + lines = originalCurrent.Text.SplitToLines(); + } + else + { + string s = Utilities.AutoBreakLine(originalCurrent.Text, 5, Configuration.Settings.General.MergeLinesShorterThan, languageOriginal); + lines = s.SplitToLines(); + } + + if (lines.Count == 1) + { + string s = Utilities.AutoBreakLine(lines[0], 3, 20, languageOriginal); + lines = s.SplitToLines(); + } + + if (lines.Count == 1) + { + string s = Utilities.AutoBreakLine(lines[0], 3, 18, languageOriginal); + lines = s.SplitToLines(); + } + + if (lines.Count == 1) + { + string s = Utilities.AutoBreakLine(lines[0], 3, 15, languageOriginal); + lines = s.SplitToLines(); + } + + if (lines.Count == 2) + { + string a = lines[0].Trim(); + string b = lines[1].Trim(); + if (oldText.TrimStart().StartsWith("", StringComparison.Ordinal) && oldText.TrimEnd().EndsWith("", StringComparison.Ordinal) && + Utilities.CountTagInText(oldText, "") == 1 && Utilities.CountTagInText(oldText, "") == 1) + { + a = a + ""; + b = "" + b; + } + + if (oldText.TrimStart().StartsWith("", StringComparison.Ordinal) && oldText.TrimEnd().EndsWith("", StringComparison.Ordinal) && + Utilities.CountTagInText(oldText, "") == 1 && Utilities.CountTagInText(oldText, "") == 1) + { + a = a + ""; + b = "" + b; + } + + if (Configuration.Settings.General.SplitRemovesDashes && (l0Trimmed.EndsWith('.') || l0Trimmed.EndsWith('!') || l0Trimmed.EndsWith('?') || l0Trimmed.EndsWith('؟'))) + { + a = DialogSplitMerge.RemoveStartDash(a); + b = DialogSplitMerge.RemoveStartDash(b); + } + + lines[0] = a; + lines[1] = b; + + originalCurrent.Text = Utilities.AutoBreakLine(lines[0]); + originalNew.Text = Utilities.AutoBreakLine(lines[1]); + } + else if (lines.Count == 1) + { + originalNew.Text = string.Empty; + } + + if (originalCurrent != null && originalNew != null) + { + if (originalCurrent.Text.StartsWith(" ", StringComparison.Ordinal)) + { + originalCurrent.Text = originalCurrent.Text.Remove(3, 1); + } + + if (originalNew.Text.StartsWith(" ", StringComparison.Ordinal)) + { + originalCurrent.Text = originalCurrent.Text.Remove(3, 1); + } + + if (continuationStyle != ContinuationStyle.None) + { + if (languageOriginal == "ar") + { + originalCurrent.Text = ContinuationUtilities.ConvertToForArabic(originalCurrent.Text); + originalNew.Text = ContinuationUtilities.ConvertToForArabic(originalNew.Text); + } + + var continuationProfile = ContinuationUtilities.GetContinuationProfile(continuationStyle); + if (ContinuationUtilities.ShouldAddSuffix(originalCurrent.Text, continuationProfile)) + { + originalCurrent.Text = ContinuationUtilities.AddSuffixIfNeeded(originalCurrent.Text, continuationProfile, false); + originalNew.Text = ContinuationUtilities.AddPrefixIfNeeded(originalNew.Text, continuationProfile, false); + } + + if (languageOriginal == "ar") + { + originalCurrent.Text = ContinuationUtilities.ConvertBackForArabic(originalCurrent.Text); + originalNew.Text = ContinuationUtilities.ConvertBackForArabic(originalNew.Text); + } + } + } + + _subtitleAlternate.InsertParagraphInCorrectTimeOrder(originalNew); + _subtitleAlternate.Renumber(); + FixSplitItalicTag(originalCurrent, originalNew); + FixSplitFontTag(originalCurrent, originalNew); + } + } + + if (_networkSession != null) + { + _networkSession.TimerStop(); + SetDurationInSeconds(currentParagraph.Duration.TotalSeconds); + _networkSession.UpdateLine(_subtitle.GetIndex(currentParagraph), currentParagraph); + NetworkGetSendUpdates(new List(), firstSelectedIndex + 1, newParagraph); + } + else + { + _subtitle.Paragraphs.Insert(firstSelectedIndex + 1, newParagraph); + _subtitle.Renumber(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + } + + SubtitleListview1.SelectIndexAndEnsureVisible(Configuration.Settings.General.SplitBehavior == 0 ? firstSelectedIndex + 1 : firstSelectedIndex, true); + ShowSource(); + ShowStatus(_language.LineSplitted); + SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; + RefreshSelectedParagraph(); + } + } + + private void FixSplitItalicTag(Paragraph currentParagraph, Paragraph nextParagraph) + { + if (currentParagraph == null || nextParagraph == null) + { + return; + } + + var startIdx = currentParagraph.Text.LastIndexOf("", StringComparison.OrdinalIgnoreCase); + if (startIdx >= 0 && + !currentParagraph.Text.Contains("", StringComparison.OrdinalIgnoreCase) && + nextParagraph.Text.Contains("", StringComparison.OrdinalIgnoreCase)) + { + var endIdx = currentParagraph.Text.IndexOf('>', startIdx); + if (endIdx >= 0) + { + var fontTag = currentParagraph.Text.Substring(startIdx, endIdx - startIdx + 1); + var pre = string.Empty; + if (currentParagraph.Text.StartsWith('{') && currentParagraph.Text.IndexOf('}') > 0) + { + var i = currentParagraph.Text.IndexOf('}'); + pre = currentParagraph.Text.Substring(0, i + 1); + currentParagraph.Text = currentParagraph.Text.Remove(0, i + 1); + } + + currentParagraph.Text = pre + currentParagraph.Text + ""; + nextParagraph.Text = pre + fontTag + nextParagraph.Text; + } + } + } + + private void FixSplitFontTag(Paragraph currentParagraph, Paragraph nextParagraph) + { + if (currentParagraph == null || nextParagraph == null) + { + return; + } + + var startIdx = currentParagraph.Text.LastIndexOf("= 0 && + !currentParagraph.Text.Contains("", StringComparison.OrdinalIgnoreCase) && + nextParagraph.Text.Contains("
", StringComparison.OrdinalIgnoreCase)) + { + var endIdx = currentParagraph.Text.IndexOf('>', startIdx); + if (endIdx >= 0) + { + var fontTag = currentParagraph.Text.Substring(startIdx, endIdx - startIdx + 1); + var pre = string.Empty; + if (currentParagraph.Text.StartsWith('{') && currentParagraph.Text.IndexOf('}') > 0) + { + var i = currentParagraph.Text.IndexOf('}'); + pre = currentParagraph.Text.Substring(0, i + 1); + currentParagraph.Text = currentParagraph.Text.Remove(0, i + 1); + } + + currentParagraph.Text = pre + currentParagraph.Text + "
"; + nextParagraph.Text = pre + fontTag + nextParagraph.Text; + } + } + } + + private void SetSplitTime(double? splitSeconds, Paragraph currentParagraph, Paragraph newParagraph, string oldText) + { + double middle = currentParagraph.StartTime.TotalMilliseconds + (currentParagraph.Duration.TotalMilliseconds / 2); + if (!string.IsNullOrWhiteSpace(HtmlUtil.RemoveHtmlTags(oldText))) + { + var lineOneTextNoHtml = HtmlUtil.RemoveHtmlTags(currentParagraph.Text, true).Replace(Environment.NewLine, string.Empty); + var lineTwoTextNoHtml = HtmlUtil.RemoveHtmlTags(newParagraph.Text, true).Replace(Environment.NewLine, string.Empty); + if (Math.Abs(lineOneTextNoHtml.Length - lineTwoTextNoHtml.Length) > 2) + { + // give more time to the paragraph with most text + var oldTextNoHtml = HtmlUtil.RemoveHtmlTags(oldText, true).Replace(Environment.NewLine, string.Empty); + var startFactor = (double)lineOneTextNoHtml.Length / oldTextNoHtml.Length; + if (startFactor < 0.25) + { + startFactor = 0.25; + } + + if (startFactor > 0.75) + { + startFactor = 0.75; + } + + middle = currentParagraph.StartTime.TotalMilliseconds + (currentParagraph.Duration.TotalMilliseconds * startFactor); + } + } + + if (currentParagraph.StartTime.IsMaxTime && currentParagraph.EndTime.IsMaxTime) + { + newParagraph.StartTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; + newParagraph.EndTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; + } + else + { + if (splitSeconds.HasValue && splitSeconds.Value > (currentParagraph.StartTime.TotalSeconds + 0.2) && splitSeconds.Value < (currentParagraph.EndTime.TotalSeconds - 0.2)) + { + middle = splitSeconds.Value * TimeCode.BaseUnit; + } + + newParagraph.EndTime.TotalMilliseconds = currentParagraph.EndTime.TotalMilliseconds; + currentParagraph.EndTime.TotalMilliseconds = middle; + newParagraph.StartTime.TotalMilliseconds = currentParagraph.EndTime.TotalMilliseconds + 1; + if (Configuration.Settings.General.MinimumMillisecondsBetweenLines > 0) + { + if (splitSeconds == null || Configuration.Settings.General.SplitBehavior == 1) + { + // SE decides split point (not user), so split gap time evenly + var halfGap = (int)Math.Round(Configuration.Settings.General.MinimumMillisecondsBetweenLines / 2.0); + currentParagraph.EndTime.TotalMilliseconds = currentParagraph.EndTime.TotalMilliseconds - halfGap; + } + else if (Configuration.Settings.General.SplitBehavior == 0) + { + currentParagraph.EndTime.TotalMilliseconds = currentParagraph.EndTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; + } + newParagraph.StartTime.TotalMilliseconds = currentParagraph.EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines; + } + } + } + + private void MergeBeforeToolStripMenuItemClick(object sender, EventArgs e) + { + if (SubtitleListview1.SelectedItems.Count >= 1) + { + var idx = SubtitleListview1.SelectedItems[0].Index; + if (idx > 0) + { + SubtitleListview1.SelectIndexAndEnsureVisible(idx - 1, true); + MergeAfterToolStripMenuItemClick(null, null); + } + } + } + + private void MergeSelectedLinesBilingual() + { + if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 1) + { + var sb1 = new StringBuilder(); + var sb2 = new StringBuilder(); + var deleteIndices = new List(); + bool first = true; + int firstIndex = 0; + double durationMilliseconds = 0; + int next = 0; + foreach (int index in SubtitleListview1.SelectedIndices) + { + if (first) + { + firstIndex = index; + next = index + 1; + first = !first; + } + else + { + deleteIndices.Add(index); + if (next != index) + { + return; + } + + next++; + } + + var arr = _subtitle.Paragraphs[index].Text.Trim().SplitToLines(); + if (arr.Count > 0) + { + int mid = (int)(arr.Count / 2); + for (var i = 0; i < arr.Count; i++) + { + var l = arr[i]; + if (i < mid) + { + sb1.Append(l + " "); + } + else + { + sb2.Append(l + " "); + } + } + } + + durationMilliseconds += _subtitle.Paragraphs[index].Duration.TotalMilliseconds; + } + + if (sb1.Length > 150 || sb2.Length > 150) + { + return; + } + + SubtitleListview1.SelectedIndexChanged -= SubtitleListview1_SelectedIndexChanged; + MakeHistoryForUndo(_language.BeforeMergeLines); + + var currentParagraph = _subtitle.Paragraphs[firstIndex]; + string text1 = sb1.ToString().TrimEnd(); + string text2 = sb2.ToString().TrimEnd(); + + currentParagraph.Text = text1 + Environment.NewLine + text2; + + //display time + currentParagraph.EndTime.TotalMilliseconds = currentParagraph.StartTime.TotalMilliseconds + durationMilliseconds; + + var nextParagraph = _subtitle.GetParagraphOrDefault(next); + if (nextParagraph != null && currentParagraph.EndTime.TotalMilliseconds > nextParagraph.StartTime.TotalMilliseconds && currentParagraph.StartTime.TotalMilliseconds < nextParagraph.StartTime.TotalMilliseconds) + { + currentParagraph.EndTime.TotalMilliseconds = nextParagraph.StartTime.TotalMilliseconds - 1; + } + + if (_networkSession != null) + { + _networkSession.TimerStop(); + _networkSession.UpdateLine(firstIndex, currentParagraph); + NetworkGetSendUpdates(deleteIndices, 0, null); + } + else + { + for (int i = deleteIndices.Count - 1; i >= 0; i--) + { + _subtitle.Paragraphs.RemoveAt(deleteIndices[i]); + } + + _subtitle.Renumber(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + } + + ShowSource(); + ShowStatus(_language.LinesMerged); + SubtitleListview1.SelectIndexAndEnsureVisible(firstIndex, true); + SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; + RefreshSelectedParagraph(); + } + } + + private void SplitSelectedLineBilingual() + { + var idx = FirstSelectedIndex; + if (_subtitle.Paragraphs.Count < 1 || idx < 0) + { + return; + } + + var p = _subtitle.GetParagraphOrDefault(idx); + if (p == null) + { + return; + } + + var tb = textBoxListViewText; + var lines = tb.Text.SplitToLines(); + if (lines.Count != 2 || tb.SelectionLength < 3 || lines[0].Length < 2 || lines[1].Length < 2) + { + return; + } + + var start = tb.SelectionStart; + var end = start + tb.SelectionLength; + var indexOfNewLine = tb.Text.IndexOf(Environment.NewLine, StringComparison.Ordinal); + if (end < indexOfNewLine || start > indexOfNewLine) + { + return; + } + + MakeHistoryForUndo(_language.BeforeSplitLine); + var oldText = p.Text; + string text1 = lines[0].Substring(0, start).Trim() + Environment.NewLine + lines[1].Substring(0, end - indexOfNewLine - 2).Trim(); + string text2 = lines[0].Remove(0, start).Trim() + Environment.NewLine + lines[1].Remove(0, end - indexOfNewLine - 2).Trim(); + var newParagraph = new Paragraph(p); + newParagraph.NewSection = false; + double? splitPos = null; + if (!string.IsNullOrEmpty(VideoFileName)) + { + splitPos = mediaPlayer.CurrentPosition; + } + + SetSplitTime(splitPos, p, newParagraph, oldText); + _subtitle.InsertParagraphInCorrectTimeOrder(newParagraph); + _subtitle.Renumber(); + if (Configuration.Settings.General.SplitBehavior > 0) + { + _subtitleListViewIndex = -1; + } + p.Text = text1; + newParagraph.Text = text2; + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + SubtitleListview1.SelectIndexAndEnsureVisible(idx, true); + } + + private void MergeSelectedLines(BreakMode breakMode = BreakMode.Normal) + { + if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 1) + { + var sb = new StringBuilder(); + var deleteIndices = new List(); + bool first = true; + int firstIndex = 0; + double endMilliseconds = 0; + int next = 0; + foreach (int index in SubtitleListview1.SelectedIndices) + { + if (first) + { + firstIndex = index; + next = index + 1; + first = !first; + } + else + { + deleteIndices.Add(index); + if (next != index) + { + return; + } + + next++; + } + + var continuationStyle = Configuration.Settings.General.ContinuationStyle; + if (continuationStyle != ContinuationStyle.None) + { + var continuationProfile = ContinuationUtilities.GetContinuationProfile(continuationStyle); + if (next < firstIndex + SubtitleListview1.SelectedIndices.Count) + { + var mergeResult = ContinuationUtilities.MergeHelper(_subtitle.Paragraphs[index].Text, _subtitle.Paragraphs[index + 1].Text, continuationProfile, LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle)); + _subtitle.Paragraphs[index].Text = mergeResult.Item1; + _subtitle.Paragraphs[index + 1].Text = mergeResult.Item2; + } + } + + var addText = _subtitle.Paragraphs[index].Text; + + if (firstIndex != index) + { + addText = RemoveAssStartAlignmentTag(addText); + } + + if (breakMode == BreakMode.UnbreakNoSpace) + { + sb.Append(addText); + } + else + { + sb.AppendLine(addText); + } + + endMilliseconds = _subtitle.Paragraphs[index].EndTime.TotalMilliseconds; + } + + if (sb.Length > 200) + { + return; + } + + SubtitleListview1.SelectedIndexChanged -= SubtitleListview1_SelectedIndexChanged; + MakeHistoryForUndo(_language.BeforeMergeLines); + + var currentParagraph = _subtitle.Paragraphs[firstIndex]; + string text = sb.ToString(); + text = HtmlUtil.FixInvalidItalicTags(text); + text = ChangeAllLinesTagsToSingleTag(text, "i"); + text = ChangeAllLinesTagsToSingleTag(text, "b"); + text = ChangeAllLinesTagsToSingleTag(text, "u"); + if (breakMode == BreakMode.Unbreak) + { + text = Utilities.UnbreakLine(text); + } + else if (breakMode == BreakMode.UnbreakNoSpace) + { + text = text.Replace(" " + Environment.NewLine + " ", string.Empty) + .Replace(Environment.NewLine + " ", string.Empty) + .Replace(" " + Environment.NewLine, string.Empty) + .Replace(Environment.NewLine, string.Empty); + } + else + { + text = Utilities.AutoBreakLine(text, LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle)); + } + + currentParagraph.Text = text; + + //display time + currentParagraph.EndTime.TotalMilliseconds = endMilliseconds; + + var nextParagraph = _subtitle.GetParagraphOrDefault(next); + if (nextParagraph != null && currentParagraph.EndTime.TotalMilliseconds > nextParagraph.StartTime.TotalMilliseconds && currentParagraph.StartTime.TotalMilliseconds < nextParagraph.StartTime.TotalMilliseconds) + { + currentParagraph.EndTime.TotalMilliseconds = nextParagraph.StartTime.TotalMilliseconds - 1; + } + + // original subtitle + if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) + { + var original = Utilities.GetOriginalParagraph(firstIndex, currentParagraph, _subtitleAlternate.Paragraphs); + if (original != null) + { + var originalTexts = new StringBuilder(); + originalTexts.Append(original.Text.TrimEnd()); + if (breakMode != BreakMode.UnbreakNoSpace) + { + originalTexts.Append(" "); + } + + for (int i = 0; i < deleteIndices.Count; i++) + { + var originalNext = Utilities.GetOriginalParagraph(deleteIndices[i], _subtitle.Paragraphs[deleteIndices[i]], _subtitleAlternate.Paragraphs); + if (originalNext != null) + { + if (breakMode == BreakMode.UnbreakNoSpace) + { + originalTexts.Append(originalNext.Text.Trim()); + } + else + { + originalTexts.Append(originalNext.Text + " "); + } + } + + } + + for (int i = deleteIndices.Count - 1; i >= 0; i--) + { + var originalNext = Utilities.GetOriginalParagraph(deleteIndices[i], _subtitle.Paragraphs[deleteIndices[i]], _subtitleAlternate.Paragraphs); + if (originalNext != null) + { + _subtitleAlternate.Paragraphs.Remove(originalNext); + } + } + + original.Text = originalTexts.ToString().Replace(" ", " "); + original.Text = ChangeAllLinesTagsToSingleTag(original.Text, "i"); + original.Text = ChangeAllLinesTagsToSingleTag(original.Text, "b"); + original.Text = ChangeAllLinesTagsToSingleTag(original.Text, "u"); + + if (breakMode == BreakMode.Unbreak) + { + original.Text = Utilities.UnbreakLine(original.Text); + } + else if (breakMode == BreakMode.UnbreakNoSpace) + { + original.Text = original.Text.Replace(" " + Environment.NewLine + " ", string.Empty) + .Replace(Environment.NewLine + " ", string.Empty) + .Replace(" " + Environment.NewLine, string.Empty) + .Replace(Environment.NewLine, string.Empty); + } + else + { + original.Text = Utilities.AutoBreakLine(original.Text, LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitleAlternate)); + } + + original.EndTime.TotalMilliseconds = currentParagraph.EndTime.TotalMilliseconds; + _subtitleAlternate.Renumber(); + } + } + + if (_networkSession != null) + { + _networkSession.TimerStop(); + _networkSession.UpdateLine(firstIndex, currentParagraph); + NetworkGetSendUpdates(deleteIndices, 0, null); + } + else + { + for (int i = deleteIndices.Count - 1; i >= 0; i--) + { + _subtitle.Paragraphs.RemoveAt(deleteIndices[i]); + } + + _subtitle.Renumber(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + } + + ShowSource(); + ShowStatus(_language.LinesMerged); + SubtitleListview1.SelectIndexAndEnsureVisible(firstIndex, true); + SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; + RefreshSelectedParagraph(); + } + } + + private void ExtendBeforeToolStripMenuItemClick(object sender, EventArgs e) + { + if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 0) + { + ExtendSelectedLinesToPreviousLine(); + } + } + + private void ExtendAfterToolStripMenuItemClick(object sender, EventArgs e) + { + if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 0) + { + ExtendSelectedLinesToNextLine(); + } + } + + private static string ChangeAllLinesTagsToSingleTag(string text, string tag) + { + if (!text.Contains("<" + tag + ">")) + { + return text; + } + + foreach (var line in text.SplitToLines()) + { + if (!line.TrimStart().StartsWith("<" + tag + ">", StringComparison.Ordinal) || !line.TrimEnd().EndsWith("", StringComparison.Ordinal)) + { + return text; + } + } + + return "<" + tag + ">" + HtmlUtil.RemoveOpenCloseTags(text, tag).Trim() + ""; + } + + private void MergeAfterToolStripMenuItemClick(object sender, EventArgs e) + { + if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 0) + { + if (SubtitleListview1.SelectedItems.Count > 2) + { + MergeSelectedLines(); + return; + } + + MergeWithLineAfter(false); + } + } + + public enum BreakMode + { + AutoBreak, + Normal, + Unbreak, + UnbreakNoSpace + } + + private void MergeWithLineAfter(bool insertDash, BreakMode breakMode = BreakMode.Normal) + { + var dialogHelper = new DialogSplitMerge { DialogStyle = Configuration.Settings.General.DialogStyle }; + int firstSelectedIndex = SubtitleListview1.SelectedItems[0].Index; + + var currentParagraph = _subtitle.GetParagraphOrDefault(firstSelectedIndex); + var nextParagraph = _subtitle.GetParagraphOrDefault(firstSelectedIndex + 1); + + if (nextParagraph != null && currentParagraph != null) + { + SubtitleListview1.SelectedIndexChanged -= SubtitleListview1_SelectedIndexChanged; + MakeHistoryForUndo(_language.BeforeMergeLines); + + var continuationStyle = Configuration.Settings.General.ContinuationStyle; + if (continuationStyle != ContinuationStyle.None) + { + var continuationProfile = ContinuationUtilities.GetContinuationProfile(continuationStyle); + var mergeResult = ContinuationUtilities.MergeHelper(currentParagraph.Text, nextParagraph.Text, continuationProfile, LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle)); + currentParagraph.Text = mergeResult.Item1; + nextParagraph.Text = mergeResult.Item2; + } + + if (_subtitleAlternate != null) + { + var original = Utilities.GetOriginalParagraph(firstSelectedIndex, currentParagraph, _subtitleAlternate.Paragraphs); + var originalNext = Utilities.GetOriginalParagraph(firstSelectedIndex + 1, nextParagraph, _subtitleAlternate.Paragraphs); + + if (original != null && originalNext != null) + { + if (continuationStyle != ContinuationStyle.None) + { + var continuationProfile = ContinuationUtilities.GetContinuationProfile(continuationStyle); + var mergeResult = ContinuationUtilities.MergeHelper(original.Text, originalNext.Text, continuationProfile, LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitleAlternate)); + original.Text = mergeResult.Item1; + originalNext.Text = mergeResult.Item2; + } + } + + if (originalNext != null) + { + if (original == null) + { + originalNext.StartTime.TotalMilliseconds = currentParagraph.StartTime.TotalMilliseconds; + originalNext.EndTime.TotalMilliseconds = nextParagraph.EndTime.TotalMilliseconds; + } + else + { + if (insertDash && !string.IsNullOrEmpty(original.Text) && !string.IsNullOrEmpty(originalNext.Text)) + { + string s = Utilities.UnbreakLine(original.Text); + original.Text = dialogHelper.InsertStartDash(s, 0); + + s = Utilities.UnbreakLine(originalNext.Text); + original.Text += Environment.NewLine + dialogHelper.InsertStartDash(s, 1); + + original.Text = original.Text.Replace("" + Environment.NewLine + "", Environment.NewLine).TrimEnd(); + } + else + { + string old1 = original.Text; + string old2 = originalNext.Text; + + if (breakMode == BreakMode.Unbreak) + { + original.Text = old1.Replace(Environment.NewLine, " "); + original.Text += Environment.NewLine + old2.Replace(Environment.NewLine, " "); + original.Text = Utilities.UnbreakLine(original.Text); + } + else if (breakMode == BreakMode.UnbreakNoSpace) + { + original.Text = old1.TrimEnd() + old2.TrimStart(); + } + else + { + original.Text = old1.Replace(Environment.NewLine, " "); + original.Text += Environment.NewLine + old2.Replace(Environment.NewLine, " "); + + if (old1.Contains(Environment.NewLine) || old2.Contains(Environment.NewLine) || + old1.Length > Configuration.Settings.General.SubtitleLineMaximumLength || old2.Length > Configuration.Settings.General.SubtitleLineMaximumLength) + { + original.Text = Utilities.AutoBreakLine(original.Text, LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitleAlternate)); + } + } + + original.Text = ChangeAllLinesTagsToSingleTag(original.Text, "i"); + original.Text = ChangeAllLinesTagsToSingleTag(original.Text, "b"); + original.Text = ChangeAllLinesTagsToSingleTag(original.Text, "u"); + + if (string.IsNullOrWhiteSpace(old1)) + { + original.Text = original.Text.TrimStart(); + } + + if (string.IsNullOrWhiteSpace(old2)) + { + original.Text = original.Text.TrimEnd(); + } + } + + original.EndTime = originalNext.EndTime; + _subtitleAlternate.Paragraphs.Remove(originalNext); + } + + _subtitleAlternate.Renumber(); + } + } + + if (insertDash && !string.IsNullOrEmpty(currentParagraph.Text) && !string.IsNullOrEmpty(nextParagraph.Text)) + { + string s = Utilities.UnbreakLine(currentParagraph.Text); + currentParagraph.Text = dialogHelper.InsertStartDash(s, 0); + + s = Utilities.UnbreakLine(RemoveAssStartAlignmentTag(nextParagraph.Text)); + currentParagraph.Text += Environment.NewLine + dialogHelper.InsertStartDash(s, 1); + + currentParagraph.Text = currentParagraph.Text.Replace("" + Environment.NewLine + "", Environment.NewLine).TrimEnd(); + } + else + { + string old1 = currentParagraph.Text; + string old2 = nextParagraph.Text; + if (breakMode == BreakMode.Unbreak) + { + currentParagraph.Text = currentParagraph.Text.Replace(Environment.NewLine, " "); + currentParagraph.Text += Environment.NewLine + nextParagraph.Text.Replace(Environment.NewLine, " "); + currentParagraph.Text = Utilities.UnbreakLine(RemoveAssStartAlignmentTag(currentParagraph.Text)); + } + else if (breakMode == BreakMode.UnbreakNoSpace) + { + currentParagraph.Text = currentParagraph.Text.TrimEnd() + RemoveAssStartAlignmentTag(nextParagraph.Text).TrimStart(); + } + else if (breakMode == BreakMode.AutoBreak) + { + currentParagraph.Text = currentParagraph.Text.Replace(Environment.NewLine, " "); + currentParagraph.Text += Environment.NewLine + RemoveAssStartAlignmentTag(nextParagraph.Text).Replace(Environment.NewLine, " "); + var language = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle); + currentParagraph.Text = Utilities.AutoBreakLine(currentParagraph.Text, language); + } + else + { + currentParagraph.Text = (currentParagraph.Text.Trim() + Environment.NewLine + + RemoveAssStartAlignmentTag(nextParagraph.Text).Trim()).Trim(); + } + + currentParagraph.Text = ChangeAllLinesTagsToSingleTag(currentParagraph.Text, "i"); + currentParagraph.Text = ChangeAllLinesTagsToSingleTag(currentParagraph.Text, "b"); + currentParagraph.Text = ChangeAllLinesTagsToSingleTag(currentParagraph.Text, "u"); + + if (old1.Contains(Environment.NewLine) || old2.Contains(Environment.NewLine) || + old1.Length > Configuration.Settings.General.SubtitleLineMaximumLength || old2.Length > Configuration.Settings.General.SubtitleLineMaximumLength) + { + currentParagraph.Text = Utilities.AutoBreakLine(currentParagraph.Text, LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle)); + } + + if (string.IsNullOrWhiteSpace(old1) && old2 != null) + { + currentParagraph.Text = old2.Trim(); + } + + if (string.IsNullOrWhiteSpace(old2) && old1 != null) + { + currentParagraph.Text = old1.Trim(); + } + } + + currentParagraph.EndTime.TotalMilliseconds = nextParagraph.EndTime.TotalMilliseconds; + + if (_networkSession != null) + { + _networkSession.TimerStop(); + SetDurationInSeconds(currentParagraph.Duration.TotalSeconds); + _networkSession.UpdateLine(_subtitle.GetIndex(currentParagraph), currentParagraph); + var deleteIndices = new List(); + deleteIndices.Add(_subtitle.GetIndex(nextParagraph)); + NetworkGetSendUpdates(deleteIndices, 0, null); + } + else + { + _subtitle.Paragraphs.Remove(nextParagraph); + _subtitle.Renumber(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + } + + ShowSource(); + ShowStatus(_language.LinesMerged); + SubtitleListview1.SelectIndexAndEnsureVisible(firstSelectedIndex, true); + SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; + RefreshSelectedParagraph(); + SubtitleListview1.SelectIndexAndEnsureVisible(firstSelectedIndex, true); + } + } + + private static string RemoveAssStartAlignmentTag(string text) + { + var s = text.TrimStart(); + if (s.StartsWith("{\\an") && s.Length > 5 && s[5] == '}') + { + s = s.Remove(0, 6); + } + return s; + } + + private void UpdateStartTimeInfo(TimeCode startTime) + { + if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 0 && startTime != null) + { + UpdateOverlapErrors(startTime); + + // update _subtitle + listview + var p = _subtitle.Paragraphs[_subtitleListViewIndex]; + p.EndTime.TotalMilliseconds += (startTime.TotalMilliseconds - p.StartTime.TotalMilliseconds); + p.StartTime = startTime; + SubtitleListview1.SetStartTimeAndDuration(_subtitleListViewIndex, p, _subtitle.GetParagraphOrDefault(_subtitleListViewIndex + 1), _subtitle.GetParagraphOrDefault(_subtitleListViewIndex - 1)); + StartUpdateListSyntaxColoring(); + } + } + + private void StartUpdateListSyntaxColoring() + { + if (!_timerDoSyntaxColoring.Enabled) + { + _timerDoSyntaxColoring.Start(); + } + } + + private void UpdateListSyntaxColoring() + { + if (_loading || _subtitle == null || _subtitleListViewIndex < 0 || _subtitleListViewIndex >= _subtitle.Paragraphs.Count) + { + return; + } + + SubtitleListview1.SyntaxColorLine(_subtitle.Paragraphs, _subtitleListViewIndex, _subtitle.Paragraphs[_subtitleListViewIndex]); + var idx = _subtitleListViewIndex + 1; + var p = _subtitle.GetParagraphOrDefault(idx); + if (p != null) + { + SubtitleListview1.SyntaxColorLine(_subtitle.Paragraphs, idx, p); + } + + idx = _subtitleListViewIndex - 1; + p = _subtitle.GetParagraphOrDefault(idx); + if (p != null) + { + SubtitleListview1.SyntaxColorLine(_subtitle.Paragraphs, idx, p); + } + } + + private void UpdateOverlapErrors(TimeCode startTime) + { + string startTimeWarning = string.Empty; + string durationWarning = string.Empty; + if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 0 && startTime != null) + { + int firstSelectedIndex = SubtitleListview1.SelectedItems[0].Index; + + var prevParagraph = _subtitle.GetParagraphOrDefault(firstSelectedIndex - 1); + if (prevParagraph != null && !prevParagraph.EndTime.IsMaxTime && prevParagraph.EndTime.TotalMilliseconds > startTime.TotalMilliseconds && Configuration.Settings.Tools.ListViewSyntaxColorOverlap) + { + startTimeWarning = string.Format(_languageGeneral.OverlapPreviousLineX, prevParagraph.EndTime.TotalSeconds - startTime.TotalSeconds); + } + + var nextParagraph = _subtitle.GetParagraphOrDefault(firstSelectedIndex + 1); + if (nextParagraph != null) + { + double durationMilliSeconds = GetDurationInMilliseconds(); + if (startTime.TotalMilliseconds + durationMilliSeconds > nextParagraph.StartTime.TotalMilliseconds && + Configuration.Settings.Tools.ListViewSyntaxColorOverlap && + !startTime.IsMaxTime) + { + durationWarning = string.Format(_languageGeneral.OverlapX, ((startTime.TotalMilliseconds + durationMilliSeconds) - nextParagraph.StartTime.TotalMilliseconds) / TimeCode.BaseUnit); + } + + if (startTimeWarning.Length == 0 && + startTime.TotalMilliseconds > nextParagraph.StartTime.TotalMilliseconds && + Configuration.Settings.Tools.ListViewSyntaxColorOverlap && + !startTime.IsMaxTime) + { + double di = (startTime.TotalMilliseconds - nextParagraph.StartTime.TotalMilliseconds) / TimeCode.BaseUnit; + startTimeWarning = string.Format(_languageGeneral.OverlapNextX, di); + } + else if (numericUpDownDuration.Value < 0) + { + durationWarning = _languageGeneral.Negative; + } + } + } + + labelStartTimeWarning.Text = startTimeWarning; + labelDurationWarning.Text = durationWarning; + } + + private double _durationMsInitialValue = 0; + private bool _durationIsDirty = false; + + private double GetDurationInMilliseconds() + { + if (!_durationIsDirty) + { + return _durationMsInitialValue; + } + + if (Configuration.Settings.General.UseTimeFormatHHMMSSFF) + { + var seconds = (int)numericUpDownDuration.Value; + var frames = (int)Math.Round((Convert.ToDouble(numericUpDownDuration.Value) % 1.0 * 100.0)); + return seconds * TimeCode.BaseUnit + frames * (TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate); + } + + return ((double)numericUpDownDuration.Value * TimeCode.BaseUnit); + } + + private bool _skipDurationChangedEvent = false; + private void SetDurationInSeconds(double seconds) + { + _durationIsDirty = false; + _durationMsInitialValue = seconds * 1000.0; + if (Configuration.Settings.General.UseTimeFormatHHMMSSFF) + { + var wholeSeconds = (int)seconds; + var frames = SubtitleFormat.MillisecondsToFrames(seconds % 1.0 * TimeCode.BaseUnit); + var extraSeconds = (int)(frames / Configuration.Settings.General.CurrentFrameRate); + var restFrames = (int)(frames % Configuration.Settings.General.CurrentFrameRate); + var v = (decimal)(wholeSeconds + extraSeconds + restFrames / 100.0); + if (v >= numericUpDownDuration.Minimum && v <= numericUpDownDuration.Maximum) + { + _skipDurationChangedEvent = true; + numericUpDownDuration.Value = (decimal)(wholeSeconds + extraSeconds + restFrames / 100.0); + _skipDurationChangedEvent = false; + + int firstSelectedIndex = SubtitleListview1.SelectedItems[0].Index; + var currentParagraph = _subtitle.GetParagraphOrDefault(firstSelectedIndex); + if (currentParagraph != null) + { + UpdateOverlapErrors(timeUpDownStartTime.TimeCode); + UpdateListViewTextCharactersPerSeconds(labelCharactersPerSecond, currentParagraph); + + if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) + { + var original = Utilities.GetOriginalParagraph(firstSelectedIndex, currentParagraph, _subtitleAlternate.Paragraphs); + if (original != null) + { + original.EndTime.TotalMilliseconds = currentParagraph.EndTime.TotalMilliseconds; + UpdateListViewTextCharactersPerSeconds(labelAlternateCharactersPerSecond, original); + } + } + + SubtitleListview1.SetDuration(firstSelectedIndex, currentParagraph, _subtitle.GetParagraphOrDefault(firstSelectedIndex + 1)); + StartUpdateListSyntaxColoring(); + } + } + } + else + { + var d = (decimal)seconds; + if (d > numericUpDownDuration.Maximum) + { + numericUpDownDuration.Value = numericUpDownDuration.Maximum; + } + else if (d < numericUpDownDuration.Minimum) + { + numericUpDownDuration.Value = numericUpDownDuration.Minimum; + } + else + { + numericUpDownDuration.Value = d; + } + } + } + + private void NumericUpDownDurationValueChanged(object sender, EventArgs e) + { + if (_skipDurationChangedEvent) + { + return; + } + + _durationIsDirty = true; + if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 0) + { + int firstSelectedIndex = SubtitleListview1.SelectedItems[0].Index; + + var currentParagraph = _subtitle.GetParagraphOrDefault(firstSelectedIndex); + if (currentParagraph != null) + { + // update _subtitle + listview + string oldDuration = currentParagraph.Duration.ToString(); + + var temp = new Paragraph(currentParagraph); + + if (Configuration.Settings.General.UseTimeFormatHHMMSSFF) + { + var seconds = (int)numericUpDownDuration.Value; + var frames = Convert.ToInt32((numericUpDownDuration.Value - seconds) * 100); + if (frames > Math.Round(Configuration.Settings.General.CurrentFrameRate) - 1) + { + numericUpDownDuration.ValueChanged -= NumericUpDownDurationValueChanged; + if (frames >= 99) + { + numericUpDownDuration.Value = (decimal)(seconds + (Math.Round((Configuration.Settings.General.CurrentFrameRate - 1)) / 100.0)); + } + else + { + numericUpDownDuration.Value = seconds + 1; + } + + numericUpDownDuration.ValueChanged += NumericUpDownDurationValueChanged; + } + } + + temp.EndTime.TotalMilliseconds = currentParagraph.StartTime.TotalMilliseconds + GetDurationInMilliseconds(); + + MakeHistoryForUndoOnlyIfNotResent(string.Format(_language.DisplayTimeAdjustedX, "#" + currentParagraph.Number + ": " + oldDuration + " -> " + temp.Duration)); + + currentParagraph.EndTime.TotalMilliseconds = temp.EndTime.TotalMilliseconds; + SubtitleListview1.SetDuration(firstSelectedIndex, currentParagraph, _subtitle.GetParagraphOrDefault(firstSelectedIndex + 1)); + + UpdateOverlapErrors(timeUpDownStartTime.TimeCode); + UpdateListViewTextCharactersPerSeconds(labelCharactersPerSecond, currentParagraph); + + if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) + { + var original = Utilities.GetOriginalParagraph(firstSelectedIndex, currentParagraph, _subtitleAlternate.Paragraphs); + if (original != null) + { + original.EndTime.TotalMilliseconds = currentParagraph.EndTime.TotalMilliseconds; + UpdateListViewTextCharactersPerSeconds(labelAlternateCharactersPerSecond, original); + } + } + + StartUpdateListSyntaxColoring(); + } + + labelStatus.Text = string.Empty; + StartUpdateListSyntaxColoring(); + } + } + + private void InitializeListViewEditBoxAlternate(Paragraph p, int firstSelectedIndex) + { + if (_subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) + { + var original = Utilities.GetOriginalParagraph(firstSelectedIndex, p, _subtitleAlternate.Paragraphs); + if (original == null) + { + textBoxListViewTextAlternate.Enabled = false; + textBoxListViewTextAlternate.Text = string.Empty; + labelAlternateCharactersPerSecond.Text = string.Empty; + } + else + { + textBoxListViewTextAlternate.Enabled = true; + textBoxListViewTextAlternate.TextChanged -= TextBoxListViewTextAlternateTextChanged; + textBoxListViewTextAlternate.Text = original.Text; + textBoxListViewTextAlternate.TextChanged += TextBoxListViewTextAlternateTextChanged; + UpdateListViewTextCharactersPerSeconds(labelAlternateCharactersPerSecond, original); + _listViewAlternateTextUndoLast = original.Text; + } + } + } + + private void InitializeListViewEditBox(Paragraph p) + { + textBoxListViewText.TextChanged -= TextBoxListViewTextTextChanged; + textBoxListViewText.Text = p.Text; + textBoxListViewText.TextChanged += TextBoxListViewTextTextChanged; + _listViewTextUndoLast = p.Text; + + timeUpDownStartTime.MaskedTextBox.TextChanged -= MaskedTextBoxTextChanged; + timeUpDownStartTime.TimeCode = p.StartTime; + timeUpDownStartTime.MaskedTextBox.TextChanged += MaskedTextBoxTextChanged; + + numericUpDownDuration.ValueChanged -= NumericUpDownDurationValueChanged; + if (p.Duration.TotalSeconds > (double)numericUpDownDuration.Maximum) + { + SetDurationInSeconds((double)numericUpDownDuration.Maximum); + } + else + { + SetDurationInSeconds(p.Duration.TotalSeconds); + } + + numericUpDownDuration.ValueChanged += NumericUpDownDurationValueChanged; + + UpdateOverlapErrors(timeUpDownStartTime.TimeCode); + UpdateListViewTextCharactersPerSeconds(labelCharactersPerSecond, p); + if (_subtitle != null && _subtitle.Paragraphs.Count > 0) + { + textBoxListViewText.Enabled = true; + } + + StartUpdateListSyntaxColoring(); + ShowHideBookmark(p); + } + + private void MaskedTextBoxTextChanged(object sender, EventArgs e) + { + if (_subtitleListViewIndex >= 0) + { + MakeHistoryForUndoOnlyIfNotResent(string.Format(_language.StarTimeAdjustedX, "#" + (_subtitleListViewIndex + 1) + ": " + timeUpDownStartTime.TimeCode)); + + int firstSelectedIndex = FirstSelectedIndex; + var oldParagraph = _subtitle.GetParagraphOrDefault(firstSelectedIndex); + if (oldParagraph != null) + { + oldParagraph = new Paragraph(oldParagraph, false); + } + + UpdateStartTimeInfo(timeUpDownStartTime.TimeCode); + + UpdateOriginalTimeCodes(oldParagraph); + labelStatus.Text = string.Empty; + } + } + + private void UpdateOriginalTimeCodes(Paragraph currentPargraphBeforeChange, Paragraph p2Before = null) + { + if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) + { + Paragraph p1 = null; + Paragraph o1 = null; + if (currentPargraphBeforeChange != null) + { + p1 = _subtitle.GetParagraphOrDefaultById(currentPargraphBeforeChange.Id); + if (p1 != null) + { + o1 = Utilities.GetOriginalParagraph(_subtitle.Paragraphs.IndexOf(p1), currentPargraphBeforeChange, _subtitleAlternate.Paragraphs); + } + } + + Paragraph p2 = null; + Paragraph o2 = null; + if (p2Before != null) + { + p2 = _subtitle.GetParagraphOrDefaultById(p2Before.Id); + if (p2 != null) + { + o2 = Utilities.GetOriginalParagraph(_subtitle.Paragraphs.IndexOf(p2), p2Before, _subtitleAlternate.Paragraphs); + } + } + + if (o1 != null) + { + o1.StartTime.TotalMilliseconds = p1.StartTime.TotalMilliseconds; + o1.EndTime.TotalMilliseconds = p1.EndTime.TotalMilliseconds; + } + + if (o2 != null) + { + o2.StartTime.TotalMilliseconds = p2.StartTime.TotalMilliseconds; + o2.EndTime.TotalMilliseconds = p2.EndTime.TotalMilliseconds; + } + } + } + + private void FormMain_FormClosing(object sender, FormClosingEventArgs e) + { + _lastDoNotPrompt = -1; + ReloadFromSourceView(); + if (!ContinueNewOrExit()) + { + e.Cancel = true; + } + else + { + if (_networkSession != null) + { + try + { + _networkSession.TimerStop(); + _networkSession.Leave(); + } + catch + { + } + } + + if (Configuration.Settings.General.StartRememberPositionAndSize && WindowState != FormWindowState.Minimized) + { + Configuration.Settings.General.StartPosition = Left + ";" + Top; + if (WindowState == FormWindowState.Maximized) + { + Configuration.Settings.General.StartSize = "Maximized"; + } + else + { + Configuration.Settings.General.StartSize = Width + ";" + Height; + } + + Configuration.Settings.General.SplitContainerMainSplitterDistance = splitContainerMain.SplitterDistance; + Configuration.Settings.General.SplitContainer1SplitterDistance = splitContainer1.SplitterDistance; + Configuration.Settings.General.SplitContainerListViewAndTextSplitterDistance = splitContainerListViewAndText.SplitterDistance; + } + + Configuration.Settings.General.AutoRepeatOn = checkBoxAutoRepeatOn.Checked; + if (int.TryParse(comboBoxAutoRepeat.Text, out var autoRepeat)) + { + Configuration.Settings.General.AutoRepeatCount = autoRepeat; + } + + Configuration.Settings.General.AutoContinueOn = checkBoxAutoContinue.Checked; + Configuration.Settings.General.AutoContinueDelay = comboBoxAutoContinue.SelectedIndex; + Configuration.Settings.General.SyncListViewWithVideoWhilePlaying = checkBoxSyncListViewWithVideoWhilePlaying.Checked; + Configuration.Settings.General.ShowWaveform = audioVisualizer.ShowWaveform; + Configuration.Settings.General.ShowSpectrogram = audioVisualizer.ShowSpectrogram; + if (Configuration.Settings.General.ShowRecentFiles) + { + if (!string.IsNullOrEmpty(_fileName)) + { + Configuration.Settings.RecentFiles.Add(_fileName, FirstVisibleIndex, FirstSelectedIndex, VideoFileName, _subtitleAlternateFileName, Configuration.Settings.General.CurrentVideoOffsetInMs); + + } + else + { + Configuration.Settings.RecentFiles.Add(null, null, null); + } + } + + if (SubtitleListview1.StateImageList?.Images.Count > 0) + { + Configuration.Settings.General.ListViewNumberWidth = SubtitleListview1.Columns[SubtitleListview1.ColumnIndexNumber].Width - 18; + } + else + { + Configuration.Settings.General.ListViewNumberWidth = SubtitleListview1.Columns[SubtitleListview1.ColumnIndexNumber].Width; + } + + SaveUndockedPositions(); + SaveListViewWidths(); + Configuration.Settings.Save(); + + if (mediaPlayer.VideoPlayer != null) + { + mediaPlayer.PauseAndDisposePlayer(); + } + } + } + + private void SaveListViewWidths() + { + if (Configuration.Settings.General.ListViewColumnsRememberSize) + { + if (SubtitleListview1.ColumnIndexNumber >= 0) + { + Configuration.Settings.General.ListViewNumberWidth = SubtitleListview1.Columns[SubtitleListview1.ColumnIndexNumber].Width; + } + + if (SubtitleListview1.ColumnIndexStart >= 0) + { + Configuration.Settings.General.ListViewStartWidth = SubtitleListview1.Columns[SubtitleListview1.ColumnIndexStart].Width; + } + + if (SubtitleListview1.ColumnIndexEnd >= 0) + { + Configuration.Settings.General.ListViewEndWidth = SubtitleListview1.Columns[SubtitleListview1.ColumnIndexEnd].Width; + } + + if (SubtitleListview1.ColumnIndexDuration >= 0) + { + Configuration.Settings.General.ListViewDurationWidth = SubtitleListview1.Columns[SubtitleListview1.ColumnIndexDuration].Width; + } + + if (SubtitleListview1.ColumnIndexCps >= 0) + { + Configuration.Settings.General.ListViewCpsWidth = SubtitleListview1.Columns[SubtitleListview1.ColumnIndexCps].Width; + } + + if (SubtitleListview1.ColumnIndexWpm >= 0) + { + Configuration.Settings.General.ListViewWpmWidth = SubtitleListview1.Columns[SubtitleListview1.ColumnIndexWpm].Width; + } + + if (SubtitleListview1.ColumnIndexText >= 0) + { + Configuration.Settings.General.ListViewTextWidth = SubtitleListview1.Columns[SubtitleListview1.ColumnIndexText].Width; + } + } + } + + private void SaveUndockedPositions() + { + if (_videoPlayerUndocked != null && !_videoPlayerUndocked.IsDisposed) + { + Configuration.Settings.General.UndockedVideoFullscreen = _videoPlayerUndocked.IsFullscreen; + Configuration.Settings.General.UndockedVideoPosition = _videoPlayerUndocked.Left + @";" + _videoPlayerUndocked.Top + @";" + _videoPlayerUndocked.Width + @";" + _videoPlayerUndocked.Height; + } + + if (_waveformUndocked != null && !_waveformUndocked.IsDisposed) + { + Configuration.Settings.General.UndockedWaveformPosition = _waveformUndocked.Left + @";" + _waveformUndocked.Top + @";" + _waveformUndocked.Width + @";" + _waveformUndocked.Height; + } + + if (_videoControlsUndocked != null && !_videoControlsUndocked.IsDisposed) + { + Configuration.Settings.General.UndockedVideoControlsPosition = _videoControlsUndocked.Left + @";" + _videoControlsUndocked.Top + @";" + _videoControlsUndocked.Width + @";" + _videoControlsUndocked.Height; + } + } + + private void ButtonUnBreakClick(object sender, EventArgs e) + { + Unbreak(); + } + + private void BreakUnbreakTextBox(bool unbreak, SETextBox tb) + { + var textCaretPos = tb.SelectionStart; + var startText = tb.Text.Substring(0, textCaretPos); + var numberOfNewLines = Utilities.CountTagInText(startText, Environment.NewLine); + if (unbreak) + { + textCaretPos -= numberOfNewLines; + tb.Text = Utilities.UnbreakLine(tb.Text); + } + else + { + int i = 0; + string s; + bool useLanguage = false; + var language = "en"; + if (Configuration.Settings.Tools.UseNoLineBreakAfter && tb == textBoxListViewText) + { + language = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle); + useLanguage = true; + } + else if (Configuration.Settings.Tools.UseNoLineBreakAfter && tb == textBoxListViewTextAlternate) + { + language = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitleAlternate); + useLanguage = true; + } + + if (useLanguage) + { + s = Utilities.AutoBreakLine(tb.Text, language); + } + else + { + s = Utilities.AutoBreakLine(tb.Text); + } + + while (i < textCaretPos && i < s.Length) + { + var ch = s[i]; + if (ch == '\n') + { + textCaretPos++; + } + + i++; + } + + textCaretPos -= numberOfNewLines; + tb.Text = s; + } + + tb.SelectionStart = textCaretPos; + } + + private void Unbreak(bool removeNewLineOnly = false) + { + _doAutoBreakOnTextChanged = false; + + var textCaretPos = textBoxListViewText.SelectionStart; + var startText = textBoxListViewText.Text.Substring(0, textCaretPos); + var numberOfNewLines = Utilities.CountTagInText(startText, Environment.NewLine); + textCaretPos -= numberOfNewLines; + bool historyAdded = false; + + if (SubtitleListview1.SelectedItems.Count > 1) + { + SubtitleListview1.BeginUpdate(); + foreach (int index in SubtitleListview1.SelectedIndices) + { + var p = _subtitle.GetParagraphOrDefault(index); + var oldText = p.Text; + var newText = p.Text; + if (removeNewLineOnly) + { + newText = newText.Replace(Environment.NewLine, string.Empty); + } + else + { + newText = Utilities.UnbreakLine(newText); + } + + if (oldText != newText) + { + if (!historyAdded) + { + historyAdded = true; + MakeHistoryForUndo(_language.BeforeRemoveLineBreaksInSelectedLines); + } + + p.Text = newText; + SubtitleListview1.SetText(index, p.Text); + } + + if (_subtitleAlternate != null && SubtitleListview1.IsAlternateTextColumnVisible && Configuration.Settings.General.AllowEditOfOriginalSubtitle) + { + var original = Utilities.GetOriginalParagraph(index, p, _subtitleAlternate.Paragraphs); + if (original != null) + { + oldText = original.Text; + newText = original.Text; + if (removeNewLineOnly) + { + newText = newText.Replace(Environment.NewLine, string.Empty); + } + else + { + newText = Utilities.UnbreakLine(newText); + } + + if (oldText != newText) + { + if (!historyAdded) + { + historyAdded = true; + MakeHistoryForUndo(_language.BeforeRemoveLineBreaksInSelectedLines); + } + + original.Text = newText; + SubtitleListview1.SetAlternateText(index, original.Text); + } + } + } + } + + SubtitleListview1.EndUpdate(); + RefreshSelectedParagraph(); + } + else + { + var fixedText = removeNewLineOnly ? textBoxListViewText.Text.Replace(Environment.NewLine, string.Empty) : Utilities.UnbreakLine(textBoxListViewText.Text); + var makeHistory = textBoxListViewText.Text != fixedText; + if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) + { + var alternateFixedText = Utilities.UnbreakLine(textBoxListViewTextAlternate.Text); + if (!makeHistory) + { + makeHistory = textBoxListViewTextAlternate.Text != alternateFixedText; + } + + if (makeHistory) + { + MakeHistoryForUndo(_language.BeforeRemoveLineBreaksInSelectedLines); + textBoxListViewText.Text = fixedText; + } + + textBoxListViewTextAlternate.Text = alternateFixedText; + } + else if (makeHistory) + { + MakeHistoryForUndo(_language.BeforeRemoveLineBreaksInSelectedLines); + textBoxListViewText.Text = fixedText; + } + } + + _doAutoBreakOnTextChanged = true; + textBoxListViewText.SelectionStart = textCaretPos; + } + + private void TabControlSubtitleSelectedIndexChanged(object sender, EventArgs e) + { + var format = GetCurrentSubtitleFormat(); + if (tabControlSubtitle.SelectedIndex == TabControlSourceView) + { + ShowSource(); + ShowSourceLineNumber(); + if (textBoxSource.CanFocus) + { + textBoxSource.Focus(); + } + + // go to correct line in source view + if (SubtitleListview1.SelectedItems.Count > 0) + { + if (format.GetType() == typeof(SubRip)) + { + var p = _subtitle.GetParagraphOrDefault(FirstSelectedIndex); + if (p != null) + { + string tc = p.StartTime + " --> " + p.EndTime; + int start = textBoxSource.Text.IndexOf(p.Number + Environment.NewLine + tc, StringComparison.Ordinal); + if (start < 0) + { + start = 0; + } + + start = textBoxSource.Text.IndexOf(tc, start, StringComparison.Ordinal); + if (start > 0) + { + textBoxSource.SelectionStart = start + tc.Length + Environment.NewLine.Length; + textBoxSource.SelectionLength = 0; + textBoxSource.ScrollToCaret(); + } + } + } + else if (format.GetType() == typeof(SubStationAlpha) || format.GetType() == typeof(AdvancedSubStationAlpha)) + { + var p = _subtitle.GetParagraphOrDefault(FirstSelectedIndex); + if (p != null) + { + const string timeCodeFormat = "{0}:{1:00}:{2:00}.{3:00}"; // h:mm:ss.cc + string startTimeCode = string.Format(timeCodeFormat, p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, p.StartTime.Milliseconds / 10); + string endTimeCode = string.Format(timeCodeFormat, p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, p.EndTime.Milliseconds / 10); + string tc = startTimeCode + "," + endTimeCode; + int start = textBoxSource.Text.IndexOf(tc, StringComparison.Ordinal); + if (start > 0) + { + int start2 = textBoxSource.Text.LastIndexOf("Dialogue:", start, StringComparison.Ordinal); + if (start2 > 0) + { + start2 = (textBoxSource.Text + Environment.NewLine).IndexOf(Environment.NewLine, start2, StringComparison.Ordinal); + } + + if (start2 > 0) + { + start = start2; + } + + textBoxSource.SelectionStart = start; + textBoxSource.SelectionLength = 0; + textBoxSource.ScrollToCaret(); + } + } + } + } + } + else + { + ReloadFromSourceView(); + ShowLineInformationListView(); + if (SubtitleListview1.CanFocus) + { + SubtitleListview1.Focus(); + } + + // go to (select + focus) correct line in list view + if (textBoxSource.SelectionStart > 0 && textBoxSource.TextLength > 30) + { + if (format.GetType() == typeof(SubRip)) + { + var timeCodeRegEx = new Regex(@"^-?\d+:-?\d+:-?\d+[:,]-?\d+\s*-->\s*-?\d+:-?\d+:-?\d+[:,]-?\d+$"); + var lineNumber = textBoxSource.GetLineFromCharIndex(textBoxSource.SelectionStart); + var lines = textBoxSource.Lines.ToList(); + if (lineNumber >= lines.Count) + { + lineNumber = lines.Count - 1; + } + + var currentLine = lines[lineNumber]; + var nextLine = lineNumber + 1 < lines.Count ? lines[lineNumber + 1] : string.Empty; + var startLine = 0; + if (Utilities.IsInteger(currentLine) && timeCodeRegEx.IsMatch(nextLine)) + { + startLine = lineNumber; + } + else + { + for (int i = lineNumber; i > 0; i--) + { + if (timeCodeRegEx.IsMatch(lines[i]) && Utilities.IsInteger(lines[i - 1])) + { + startLine = i - 1; + break; + } + } + } + + var sb = new StringBuilder(); + for (int i = startLine; i < lines.Count; i++) + { + sb.AppendLine(lines[i]); + } + + var sub = new Subtitle(); + new SubRip().LoadSubtitle(sub, sb.ToString().SplitToLines().ToList(), null); + if (sub.Paragraphs.Count > 0) + { + foreach (var p in _subtitle.Paragraphs) + { + if (sub.Paragraphs[0].Number == p.Number && + sub.Paragraphs[0].StartTime.TotalMilliseconds == p.StartTime.TotalMilliseconds && + sub.Paragraphs[0].EndTime.TotalMilliseconds == p.EndTime.TotalMilliseconds) + { + _subtitleListViewIndex = -1; + var index = _subtitle.Paragraphs.IndexOf(p); + SubtitleListview1.SelectIndexAndEnsureVisible(index, true); + break; + } + } + } + } + else if (format.GetType() == typeof(SubStationAlpha) || format.GetType() == typeof(AdvancedSubStationAlpha)) + { + int pos = textBoxSource.SelectionStart; + string s = textBoxSource.Text; + if (pos > 0) + { + pos--; + } + + while (pos > 0 && pos + 3 < s.Length && !s.Substring(pos, 3).StartsWith(Environment.NewLine, StringComparison.Ordinal)) + { + pos--; + } + + s = s.Substring(pos).Trim(); + int lastTimeCode = s.IndexOf("Dialogue:", StringComparison.Ordinal); + + if (lastTimeCode >= 0) + { + string tc = s.Substring(lastTimeCode).Trim(); + while (tc.Length > 0 && !char.IsDigit(tc[0])) + { + tc = tc.Remove(0, 1); + } + + if (tc.Length > 12) + { + TimeCode realTC; + tc = tc.Substring(0, 13); + var timeCode = tc.Split(new[] { ':', '.', ',' }, StringSplitOptions.RemoveEmptyEntries); + try + { + realTC = new TimeCode(int.Parse(timeCode[1]), int.Parse(timeCode[2]), int.Parse(timeCode[3]), int.Parse(timeCode[4]) * 10); + } + catch + { + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + return; + } + + int index = 0; + foreach (var p in _subtitle.Paragraphs) + { + if (Math.Abs(realTC.TotalMilliseconds - p.StartTime.TotalMilliseconds) < 50) + { + SubtitleListview1.SelectIndexAndEnsureVisible(index, true); + break; + } + + index++; + } + } + } + } + } + else if (textBoxSource.SelectionStart == 0 && textBoxSource.TextLength > 30) + { + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + } + } + } + + private void ColorToolStripMenuItemClick(object sender, EventArgs e) + { + if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 0) + { + + string color; + var formatType = GetCurrentSubtitleFormat().GetType(); + if (formatType == typeof(Ebu)) + { + using (var form = new EbuColorPicker(true)) + { + if (form.ShowDialog(this) != DialogResult.OK) + { + return; + } + + color = form.Color; + } + } + else if (formatType == typeof(ScenaristClosedCaptions) || formatType == typeof(ScenaristClosedCaptionsDropFrame)) + { + using (var form = new EbuColorPicker(false)) + { + if (form.ShowDialog(this) != DialogResult.OK) + { + return; + } + + color = form.Color; + } + } + else + { + if (colorDialog1.ShowDialog(this) != DialogResult.OK) + { + return; + } + + color = Utilities.ColorToHex(colorDialog1.Color); + } + + MakeHistoryForUndo(_language.BeforeSettingColor); + foreach (ListViewItem item in SubtitleListview1.SelectedItems) + { + var p = _subtitle.GetParagraphOrDefault(item.Index); + if (p != null) + { + SetFontColor(p, color); + SubtitleListview1.SetText(item.Index, p.Text); + if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle && SubtitleListview1.IsAlternateTextColumnVisible) + { + var original = Utilities.GetOriginalParagraph(item.Index, p, _subtitleAlternate.Paragraphs); + if (original != null) + { + SetFontColor(original, color); + SubtitleListview1.SetAlternateText(item.Index, original.Text); + } + } + } + } + + RefreshSelectedParagraph(); + + } + } + + private static void SetFontColor(Paragraph p, string color) + { + if (p == null) + { + return; + } + + string pre = string.Empty; + if (p.Text.StartsWith("{\\", StringComparison.Ordinal) && p.Text.IndexOf('}') >= 0) + { + int endIndex = p.Text.IndexOf('}') + 1; + pre = p.Text.Substring(0, endIndex); + p.Text = p.Text.Remove(0, endIndex); + } + + string s = p.Text; + if (s.StartsWith("'); + if (end > 0) + { + string f = s.Substring(0, end); + + if (f.Contains(" face=", StringComparison.OrdinalIgnoreCase) && !f.Contains(" color=", StringComparison.OrdinalIgnoreCase)) + { + var start = s.IndexOf(" face=", StringComparison.OrdinalIgnoreCase); + s = s.Insert(start, string.Format(" color=\"{0}\"", color)); + p.Text = pre + s; + return; + } + + var colorStart = f.IndexOf(" color=", StringComparison.OrdinalIgnoreCase); + if (colorStart >= 0) + { + if (s.IndexOf('"', colorStart + 8) > 0) + { + end = s.IndexOf('"', colorStart + 8); + } + + s = s.Substring(0, colorStart) + string.Format(" color=\"{0}", color) + s.Substring(end); + p.Text = pre + s; + return; + } + } + } + + p.Text = $"{pre}{p.Text}"; + } + + private void toolStripMenuItemFont_Click(object sender, EventArgs e) + { + if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 0) + { + using (var form = new ChooseFontName()) + { + + if (form.ShowDialog(this) == DialogResult.OK) + { + MakeHistoryForUndo(_language.BeforeSettingFontName); + + foreach (ListViewItem item in SubtitleListview1.SelectedItems) + { + var p = _subtitle.GetParagraphOrDefault(item.Index); + if (p != null) + { + SetFontName(p, form.FontName); + SubtitleListview1.SetText(item.Index, p.Text); + if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle && SubtitleListview1.IsAlternateTextColumnVisible) + { + var original = Utilities.GetOriginalParagraph(item.Index, p, _subtitleAlternate.Paragraphs); + if (original != null) + { + SetFontName(original, form.FontName); + SubtitleListview1.SetAlternateText(item.Index, original.Text); + } + } + } + } + + RefreshSelectedParagraph(); + } + } + } + } + + private void SetFontName(Paragraph p, string fontName) + { + if (p == null) + { + return; + } + + string pre = string.Empty; + if (p.Text.StartsWith("{\\", StringComparison.Ordinal) && p.Text.IndexOf('}') >= 0) + { + int endIndex = p.Text.IndexOf('}') + 1; + pre = p.Text.Substring(0, endIndex); + p.Text = p.Text.Remove(0, endIndex); + } + + string s = p.Text; + if (s.StartsWith("'); + if (end > 0) + { + var f = s.Substring(0, end); + + if (f.Contains(" color=", StringComparison.OrdinalIgnoreCase) && !f.Contains(" face=", StringComparison.OrdinalIgnoreCase)) + { + var start = s.IndexOf(" color=", StringComparison.OrdinalIgnoreCase); + p.Text = pre + s.Insert(start, string.Format(" face=\"{0}\"", fontName)); + return; + } + + var faceStart = f.IndexOf(" face=", StringComparison.OrdinalIgnoreCase); + if (f.Contains(" face=", StringComparison.OrdinalIgnoreCase)) + { + if (s.IndexOf('"', faceStart + 7) > 0) + { + end = s.IndexOf('"', faceStart + 7); + } + + p.Text = pre + s.Substring(0, faceStart) + string.Format(" face=\"{0}", fontName) + s.Substring(end); + return; + } + } + } + + p.Text = $"{pre}{s}"; + } + + private void TypeEffectToolStripMenuItemClick(object sender, EventArgs e) + { + if (SubtitleListview1.SelectedItems.Count > 0) + { + using (var typewriter = new EffectTypewriter()) + { + typewriter.Initialize(SubtitleListview1.GetSelectedParagraph(_subtitle)); + + if (typewriter.ShowDialog(this) == DialogResult.OK) + { + MakeHistoryForUndo(_language.BeforeTypeWriterEffect); + bool isframeBased = GetCurrentSubtitleFormat().IsFrameBased; + int lastSelectedIndex = SubtitleListview1.SelectedItems[0].Index; + int i = SubtitleListview1.SelectedItems.Count - 1; + while (i >= 0) + { + var item = SubtitleListview1.SelectedItems[i]; + var p = _subtitle.GetParagraphOrDefault(item.Index); + if (p != null) + { + typewriter.Initialize(p); + typewriter.MakeAnimation(); + int index = item.Index; + _subtitle.Paragraphs.RemoveAt(index); + foreach (var tp in typewriter.TypewriterParagraphs) + { + _subtitle.Paragraphs.Insert(index, tp); + index++; + } + } + + i--; + } + + _subtitle.Renumber(); + _subtitleListViewIndex = -1; + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + SubtitleListview1.SelectIndexAndEnsureVisible(lastSelectedIndex, true); + } + } + } + } + + private void KarokeeEffectToolStripMenuItemClick(object sender, EventArgs e) + { + if (SubtitleListview1.SelectedItems.Count > 0) + { + using (var karaoke = new EffectKaraoke()) + { + karaoke.Initialize(SubtitleListview1.GetSelectedParagraph(_subtitle)); + + if (karaoke.ShowDialog(this) == DialogResult.OK) + { + MakeHistoryForUndo(_language.BeforeKaraokeEffect); + int lastSelectedIndex = SubtitleListview1.SelectedItems[0].Index; + bool isframeBased = GetCurrentSubtitleFormat().IsFrameBased; + + int i = SubtitleListview1.SelectedItems.Count - 1; + while (i >= 0) + { + var item = SubtitleListview1.SelectedItems[i]; + var p = _subtitle.GetParagraphOrDefault(item.Index); + if (p != null) + { + int index = item.Index; + _subtitle.Paragraphs.RemoveAt(index); + foreach (var kp in karaoke.MakeAnimation(p)) + { + _subtitle.Paragraphs.Insert(index, kp); + index++; + } + } + + i--; + } + + _subtitle.Renumber(); + _subtitleListViewIndex = -1; + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + SubtitleListview1.SelectIndexAndEnsureVisible(lastSelectedIndex, true); + } + } + } + } + + private void MatroskaImportStripMenuItemClick(object sender, EventArgs e) + { + openFileDialog1.Title = _language.OpenMatroskaFile; + openFileDialog1.FileName = string.Empty; + openFileDialog1.Filter = _language.MatroskaFiles + "|*.mkv;*.mks|" + _languageGeneral.AllFiles + "|*.*"; + if (openFileDialog1.ShowDialog(this) == DialogResult.OK) + { + openFileDialog1.InitialDirectory = Path.GetDirectoryName(openFileDialog1.FileName); + ImportSubtitleFromMatroskaFile(openFileDialog1.FileName); + } + } + + private void ImportSubtitleFromMatroskaFile(string fileName) + { + using (var matroska = new MatroskaFile(fileName)) + { + if (matroska.IsValid) + { + var subtitleList = matroska.GetTracks(true); + if (subtitleList.Count == 0) + { + MessageBox.Show(_language.NoSubtitlesFound); + } + else if (ContinueNewOrExit()) + { + if (subtitleList.Count > 1) + { + using (var subtitleChooser = new MatroskaSubtitleChooser("mkv")) + { + subtitleChooser.Initialize(subtitleList); + if (_loading) + { + subtitleChooser.Icon = (Icon)this.Icon.Clone(); + subtitleChooser.ShowInTaskbar = true; + subtitleChooser.ShowIcon = true; + } + + if (subtitleChooser.ShowDialog(this) == DialogResult.OK) + { + if (LoadMatroskaSubtitle(subtitleList[subtitleChooser.SelectedIndex], matroska, false) && + (Path.GetExtension(matroska.Path).Equals(".mkv", StringComparison.OrdinalIgnoreCase) || + Path.GetExtension(matroska.Path).Equals(".mks", StringComparison.OrdinalIgnoreCase))) + { + if (!Configuration.Settings.General.DisableVideoAutoLoading) + { + matroska.Dispose(); + OpenVideo(matroska.Path); + } + } + else + { + _exitWhenLoaded = _loading; + } + } + } + } + else + { + var ext = Path.GetExtension(matroska.Path).ToLowerInvariant(); + if (LoadMatroskaSubtitle(subtitleList[0], matroska, false) && + (ext == ".mkv" || ext == ".mks")) + { + if (!Configuration.Settings.General.DisableVideoAutoLoading) + { + matroska.Dispose(); + if (ext == ".mkv") + { + OpenVideo(matroska.Path); + } + else + { + TryToFindAndOpenVideoFile(Path.Combine(Path.GetDirectoryName(matroska.Path), Path.GetFileNameWithoutExtension(matroska.Path))); + } + } + } + else + { + _exitWhenLoaded = _loading; + } + } + } + } + else + { + MessageBox.Show(string.Format(_language.NotAValidMatroskaFileX, fileName)); + } + } + } + + private int _lastProgressPercent = -1; + + private void UpdateProgress(long position, long total, string statusMessage) + { + var percent = (int)Math.Round(position * 100.0 / total); + if (percent == _lastProgressPercent) + { + return; + } + + ShowStatus(string.Format("{0}, {1:0}%", statusMessage, _lastProgressPercent)); + statusStrip1.Refresh(); + TaskbarList.SetProgressValue(Handle, percent, 100); + if (DateTime.UtcNow.Ticks % 10 == 0) + { + Application.DoEvents(); + } + + _lastProgressPercent = percent; + } + + private void MatroskaProgress(long position, long total) + { + UpdateProgress(position, total, _language.ParsingMatroskaFile); + } + + private Subtitle LoadMatroskaSubtitleForSync(MatroskaTrackInfo matroskaSubtitleInfo, MatroskaFile matroska) + { + var subtitle = new Subtitle(); + bool isSsa = false; + + if (matroskaSubtitleInfo.CodecId.Equals("S_VOBSUB", StringComparison.OrdinalIgnoreCase)) + { + return subtitle; + } + + if (matroskaSubtitleInfo.CodecId.Equals("S_HDMV/PGS", StringComparison.OrdinalIgnoreCase)) + { + return subtitle; + } + + SubtitleFormat format; + var codecPrivate = matroskaSubtitleInfo.GetCodecPrivate(); + if (codecPrivate.Contains("[script info]", StringComparison.OrdinalIgnoreCase)) + { + if (codecPrivate.Contains("[V4 Styles]", StringComparison.OrdinalIgnoreCase)) + { + format = new SubStationAlpha(); + } + else + { + format = new AdvancedSubStationAlpha(); + } + + isSsa = true; + } + else + { + format = new SubRip(); + } + + var sub = matroska.GetSubtitle(matroskaSubtitleInfo.TrackNumber, MatroskaProgress); + TaskbarList.SetProgressState(Handle, TaskbarButtonProgressFlags.NoProgress); + if (isSsa) + { + foreach (var p in Utilities.LoadMatroskaSSA(matroskaSubtitleInfo, matroska.Path, format, sub).Paragraphs) + { + subtitle.Paragraphs.Add(p); + } + } + else + { + foreach (var p in sub) + { + subtitle.Paragraphs.Add(new Paragraph(p.GetText(matroskaSubtitleInfo), p.Start, p.End)); + } + } + + return subtitle; + } + + private bool LoadMatroskaSubtitle(MatroskaTrackInfo matroskaSubtitleInfo, MatroskaFile matroska, bool batchMode) + { + if (matroskaSubtitleInfo.CodecId.Equals("S_VOBSUB", StringComparison.OrdinalIgnoreCase)) + { + if (batchMode) + { + return false; + } + + return LoadVobSubFromMatroska(matroskaSubtitleInfo, matroska); + } + + if (matroskaSubtitleInfo.CodecId.Equals("S_HDMV/PGS", StringComparison.OrdinalIgnoreCase)) + { + if (batchMode) + { + return false; + } + + return LoadBluRaySubFromMatroska(matroskaSubtitleInfo, matroska); + } + + if (matroskaSubtitleInfo.CodecId.Equals("S_HDMV/TEXTST", StringComparison.OrdinalIgnoreCase)) + { + if (batchMode) + { + return false; + } + + return LoadTextSTFromMatroska(matroskaSubtitleInfo, matroska, batchMode); + } + + if (matroskaSubtitleInfo.CodecId.Equals("S_DVBSUB", StringComparison.OrdinalIgnoreCase)) + { + if (batchMode) + { + return false; + } + + return LoadDvbFromMatroska(matroskaSubtitleInfo, matroska, batchMode); + } + + ShowStatus(_language.ParsingMatroskaFile); + Refresh(); + Cursor.Current = Cursors.WaitCursor; + var sub = matroska.GetSubtitle(matroskaSubtitleInfo.TrackNumber, MatroskaProgress); + TaskbarList.SetProgressState(Handle, TaskbarButtonProgressFlags.NoProgress); + Cursor.Current = Cursors.Default; + + MakeHistoryForUndo(_language.BeforeImportFromMatroskaFile); + _subtitleListViewIndex = -1; + if (!batchMode) + { + ResetSubtitle(); + } + + _subtitle.Paragraphs.Clear(); + + var format = Utilities.LoadMatroskaTextSubtitle(matroskaSubtitleInfo, matroska, sub, _subtitle); + + if (matroskaSubtitleInfo.GetCodecPrivate().Contains("[script info]", StringComparison.OrdinalIgnoreCase)) + { + if (_networkSession == null) + { + SubtitleListview1.ShowExtraColumn(_languageGeneral.Style); + } + } + else if (_networkSession == null) + { + SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.Extra); + } + + comboBoxSubtitleFormats.SelectedIndexChanged -= ComboBoxSubtitleFormatsSelectedIndexChanged; + SetCurrentFormat(format); + comboBoxSubtitleFormats.SelectedIndexChanged += ComboBoxSubtitleFormatsSelectedIndexChanged; + _oldSubtitleFormat = format; + SetEncoding(Encoding.UTF8); + ShowStatus(_language.SubtitleImportedFromMatroskaFile); + _subtitle.Renumber(); + if (matroska.Path.EndsWith(".mkv", StringComparison.OrdinalIgnoreCase) || matroska.Path.EndsWith(".mks", StringComparison.OrdinalIgnoreCase)) + { + _fileName = matroska.Path.Remove(matroska.Path.Length - 4) + format.Extension; + } + + SetTitle(); + _fileDateTime = new DateTime(); + _converted = true; + + if (batchMode) + { + return true; + } + + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + if (_subtitle.Paragraphs.Count > 0) + { + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + } + + ShowSource(); + return true; + } + + private bool LoadTextSTFromMatroska(MatroskaTrackInfo matroskaSubtitleInfo, MatroskaFile matroska, bool batchMode) + { + ShowStatus(_language.ParsingMatroskaFile); + Refresh(); + Cursor.Current = Cursors.WaitCursor; + var sub = matroska.GetSubtitle(matroskaSubtitleInfo.TrackNumber, MatroskaProgress); + TaskbarList.SetProgressState(Handle, TaskbarButtonProgressFlags.NoProgress); + Cursor.Current = Cursors.Default; + + MakeHistoryForUndo(_language.BeforeImportFromMatroskaFile); + _subtitleListViewIndex = -1; + if (!batchMode) + { + ResetSubtitle(); + } + + _subtitle.Paragraphs.Clear(); + + Utilities.LoadMatroskaTextSubtitle(matroskaSubtitleInfo, matroska, sub, _subtitle); + for (int index = 0; index < sub.Count; index++) + { + try + { + var msub = sub[index]; + int idx = -6; // MakeMKV starts at DialogPresentationSegment + var data = msub.GetData(matroskaSubtitleInfo); + if (VobSubParser.IsPrivateStream2(data, 0)) + { + idx = 0; // starts with MPEG2 private stream 2 (just to be sure) + } + + var dps = new TextST.DialogPresentationSegment(data, idx); + _subtitle.Paragraphs[index].Text = dps.Text; + } + catch (Exception exception) + { + _subtitle.Paragraphs[index].Text = exception.Message; + } + } + + if (_networkSession == null) + { + SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.Extra); + } + + comboBoxSubtitleFormats.SelectedIndexChanged -= ComboBoxSubtitleFormatsSelectedIndexChanged; + SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); + comboBoxSubtitleFormats.SelectedIndexChanged += ComboBoxSubtitleFormatsSelectedIndexChanged; + SetEncoding(Encoding.UTF8); + ShowStatus(_language.SubtitleImportedFromMatroskaFile); + _subtitle.Renumber(); + if (matroska.Path.EndsWith(".mkv", StringComparison.OrdinalIgnoreCase) || matroska.Path.EndsWith(".mks", StringComparison.OrdinalIgnoreCase)) + { + _fileName = matroska.Path.Remove(matroska.Path.Length - 4) + GetCurrentSubtitleFormat().Extension; + } + + SetTitle(); + _fileDateTime = new DateTime(); + _converted = true; + if (batchMode) + { + return true; + } + + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + if (_subtitle.Paragraphs.Count > 0) + { + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + } + + ShowSource(); + return true; + } + + private bool LoadDvbFromMatroska(MatroskaTrackInfo matroskaSubtitleInfo, MatroskaFile matroska, bool batchMode) + { + ShowStatus(_language.ParsingMatroskaFile); + Refresh(); + Cursor.Current = Cursors.WaitCursor; + var sub = matroska.GetSubtitle(matroskaSubtitleInfo.TrackNumber, MatroskaProgress); + TaskbarList.SetProgressState(Handle, TaskbarButtonProgressFlags.NoProgress); + Cursor.Current = Cursors.Default; + + MakeHistoryForUndo(_language.BeforeImportFromMatroskaFile); + _subtitleListViewIndex = -1; + if (!batchMode) + { + ResetSubtitle(); + } + + _subtitle.Paragraphs.Clear(); + var subtitleImages = new List(); + var subtitle = new Subtitle(); + Utilities.LoadMatroskaTextSubtitle(matroskaSubtitleInfo, matroska, sub, _subtitle); + for (int index = 0; index < sub.Count; index++) + { + try + { + var msub = sub[index]; + DvbSubPes pes = null; + var data = msub.GetData(matroskaSubtitleInfo); + if (data != null && data.Length > 9 && data[0] == 15 && data[1] >= SubtitleSegment.PageCompositionSegment && data[1] <= SubtitleSegment.DisplayDefinitionSegment) // sync byte + segment id + { + var buffer = new byte[data.Length + 3]; + Buffer.BlockCopy(data, 0, buffer, 2, data.Length); + buffer[0] = 32; + buffer[1] = 0; + buffer[buffer.Length - 1] = 255; + pes = new DvbSubPes(0, buffer); + } + else if (VobSubParser.IsMpeg2PackHeader(data)) + { + pes = new DvbSubPes(data, Mpeg2Header.Length); + } + else if (VobSubParser.IsPrivateStream1(data, 0)) + { + pes = new DvbSubPes(data, 0); + } + else if (data.Length > 9 && data[0] == 32 && data[1] == 0 && data[2] == 14 && data[3] == 16) + { + pes = new DvbSubPes(0, data); + } + + if (pes == null && subtitle.Paragraphs.Count > 0) + { + var last = subtitle.Paragraphs[subtitle.Paragraphs.Count - 1]; + if (last.Duration.TotalMilliseconds < 100) + { + last.EndTime.TotalMilliseconds = msub.Start; + if (last.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) + { + last.EndTime.TotalMilliseconds = last.StartTime.TotalMilliseconds + 3000; + } + } + } + + if (pes != null && pes.PageCompositions != null && pes.PageCompositions.Any(p => p.Regions.Count > 0)) + { + subtitleImages.Add(pes); + subtitle.Paragraphs.Add(new Paragraph(string.Empty, msub.Start, msub.End)); + } + } + catch + { + // continue + } + } + + if (subtitleImages.Count == 0) + { + return false; + } + + for (int index = 0; index < subtitle.Paragraphs.Count; index++) + { + var p = subtitle.Paragraphs[index]; + if (p.Duration.TotalMilliseconds < 200) + { + p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + 3000; + } + + var next = subtitle.GetParagraphOrDefault(index + 1); + if (next != null && next.StartTime.TotalMilliseconds < p.EndTime.TotalMilliseconds) + { + p.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; + } + } + + using (var formSubOcr = new VobSubOcr()) + { + formSubOcr.Initialize(subtitle, subtitleImages, Configuration.Settings.VobSubOcr); // TODO: language??? + if (_loading) + { + formSubOcr.Icon = (Icon)Icon.Clone(); + formSubOcr.ShowInTaskbar = true; + formSubOcr.ShowIcon = true; + } + + if (formSubOcr.ShowDialog(this) == DialogResult.OK) + { + ResetSubtitle(); + _subtitle.Paragraphs.Clear(); + foreach (var p in formSubOcr.SubtitleFromOcr.Paragraphs) + { + _subtitle.Paragraphs.Add(p); + } + + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + _subtitleListViewIndex = -1; + SubtitleListview1.FirstVisibleIndex = -1; + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + + _fileName = Utilities.GetPathAndFileNameWithoutExtension(matroska.Path) + GetCurrentSubtitleFormat().Extension; + _converted = true; + SetTitle(); + + Configuration.Settings.Save(); + return true; + } + } + + return false; + } + + public static void CopyStream(Stream input, Stream output) + { + var buffer = new byte[128 * 1024]; + int len; + while ((len = input.Read(buffer, 0, buffer.Length)) > 0) + { + output.Write(buffer, 0, len); + } + + output.Flush(); + } + + private bool LoadVobSubFromMatroska(MatroskaTrackInfo matroskaSubtitleInfo, MatroskaFile matroska) + { + if (matroskaSubtitleInfo.ContentEncodingType == 1) + { + MessageBox.Show(_language.NoSupportEncryptedVobSub); + } + + ShowStatus(_language.ParsingMatroskaFile); + Refresh(); + Cursor.Current = Cursors.WaitCursor; + var sub = matroska.GetSubtitle(matroskaSubtitleInfo.TrackNumber, MatroskaProgress); + TaskbarList.SetProgressState(Handle, TaskbarButtonProgressFlags.NoProgress); + Cursor.Current = Cursors.Default; + + MakeHistoryForUndo(_language.BeforeImportFromMatroskaFile); + _subtitleListViewIndex = -1; + _subtitle.Paragraphs.Clear(); + + List mergedVobSubPacks = new List(); + var idx = new Core.VobSub.Idx(matroskaSubtitleInfo.GetCodecPrivate().SplitToLines()); + foreach (var p in sub) + { + mergedVobSubPacks.Add(new VobSubMergedPack(p.GetData(matroskaSubtitleInfo), TimeSpan.FromMilliseconds(p.Start), 32, null)); + if (mergedVobSubPacks.Count > 0) + { + mergedVobSubPacks[mergedVobSubPacks.Count - 1].EndTime = TimeSpan.FromMilliseconds(p.End); + } + + // fix overlapping (some versions of Handbrake makes overlapping time codes - thx Hawke) + if (mergedVobSubPacks.Count > 1 && mergedVobSubPacks[mergedVobSubPacks.Count - 2].EndTime > mergedVobSubPacks[mergedVobSubPacks.Count - 1].StartTime) + { + mergedVobSubPacks[mergedVobSubPacks.Count - 2].EndTime = TimeSpan.FromMilliseconds(mergedVobSubPacks[mergedVobSubPacks.Count - 1].StartTime.TotalMilliseconds - 1); + } + } + + // Remove bad packs + for (int i = mergedVobSubPacks.Count - 1; i >= 0; i--) + { + if (mergedVobSubPacks[i].SubPicture.SubPictureDateSize <= 2) + { + mergedVobSubPacks.RemoveAt(i); + } + else if (mergedVobSubPacks[i].SubPicture.SubPictureDateSize <= 67 && mergedVobSubPacks[i].SubPicture.Delay.TotalMilliseconds < 35) + { + mergedVobSubPacks.RemoveAt(i); + } + } + + using (var formSubOcr = new VobSubOcr()) + { + formSubOcr.Initialize(mergedVobSubPacks, idx.Palette, Configuration.Settings.VobSubOcr, null); // TODO: language??? + if (_loading) + { + formSubOcr.Icon = (Icon)Icon.Clone(); + formSubOcr.ShowInTaskbar = true; + formSubOcr.ShowIcon = true; + } + + if (formSubOcr.ShowDialog(this) == DialogResult.OK) + { + ResetSubtitle(); + _subtitle.Paragraphs.Clear(); + foreach (var p in formSubOcr.SubtitleFromOcr.Paragraphs) + { + _subtitle.Paragraphs.Add(p); + } + + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + _subtitleListViewIndex = -1; + SubtitleListview1.FirstVisibleIndex = -1; + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + + _fileName = Utilities.GetPathAndFileNameWithoutExtension(matroska.Path) + GetCurrentSubtitleFormat().Extension; + _converted = true; + SetTitle(); + + Configuration.Settings.Save(); + return true; + } + } + + return false; + } + + private bool LoadBluRaySubFromMatroska(MatroskaTrackInfo matroskaSubtitleInfo, MatroskaFile matroska) + { + if (matroskaSubtitleInfo.ContentEncodingType == 1) + { + MessageBox.Show(_language.NoSupportEncryptedVobSub); + } + + ShowStatus(_language.ParsingMatroskaFile); + Refresh(); + Cursor.Current = Cursors.WaitCursor; + var sub = matroska.GetSubtitle(matroskaSubtitleInfo.TrackNumber, MatroskaProgress); + TaskbarList.SetProgressState(Handle, TaskbarButtonProgressFlags.NoProgress); + Cursor.Current = Cursors.Default; + + int noOfErrors = 0; + string lastError = string.Empty; + MakeHistoryForUndo(_language.BeforeImportFromMatroskaFile); + _subtitleListViewIndex = -1; + _subtitle.Paragraphs.Clear(); + var subtitles = new List(); + var log = new StringBuilder(); + var clusterStream = new MemoryStream(); + var lastPalettes = new Dictionary>(); + var lastBitmapObjects = new Dictionary>(); + foreach (var p in sub) + { + byte[] buffer = p.GetData(matroskaSubtitleInfo); + if (buffer != null && buffer.Length > 2) + { + clusterStream.Write(buffer, 0, buffer.Length); + if (ContainsBluRayStartSegment(buffer)) + { + if (subtitles.Count > 0 && subtitles[subtitles.Count - 1].StartTime == subtitles[subtitles.Count - 1].EndTime) + { + subtitles[subtitles.Count - 1].EndTime = (long)((p.Start - 1) * 90.0); + } + + clusterStream.Position = 0; + var list = BluRaySupParser.ParseBluRaySup(clusterStream, log, true, lastPalettes, lastBitmapObjects); + foreach (var sup in list) + { + sup.StartTime = (long)((p.Start - 1) * 90.0); + sup.EndTime = (long)((p.End - 1) * 90.0); + subtitles.Add(sup); + + // fix overlapping + if (subtitles.Count > 1 && sub[subtitles.Count - 2].End > sub[subtitles.Count - 1].Start) + { + subtitles[subtitles.Count - 2].EndTime = subtitles[subtitles.Count - 1].StartTime - 1; + } + } + + clusterStream = new MemoryStream(); + } + } + else if (subtitles.Count > 0) + { + var lastSub = subtitles[subtitles.Count - 1]; + if (lastSub.StartTime == lastSub.EndTime) + { + lastSub.EndTime = (long)((p.Start - 1) * 90.0); + if (lastSub.EndTime - lastSub.StartTime > 1000000) + { + lastSub.EndTime = lastSub.StartTime; + } + } + } + } + + if (noOfErrors > 0) + { + MessageBox.Show(string.Format("{0} error(s) occurred during extraction of bdsup\r\n\r\n{1}", noOfErrors, lastError)); + } + + using (var formSubOcr = new VobSubOcr()) + { + formSubOcr.Initialize(subtitles, Configuration.Settings.VobSubOcr, matroska.Path); + if (_loading) + { + formSubOcr.Icon = (Icon)Icon.Clone(); + formSubOcr.ShowInTaskbar = true; + formSubOcr.ShowIcon = true; + } + + if (formSubOcr.ShowDialog(this) == DialogResult.OK) + { + MakeHistoryForUndo(_language.BeforeImportingDvdSubtitle); + + _subtitle.Paragraphs.Clear(); + SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); + foreach (var p in formSubOcr.SubtitleFromOcr.Paragraphs) + { + _subtitle.Paragraphs.Add(p); + } + + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + _subtitleListViewIndex = -1; + SubtitleListview1.FirstVisibleIndex = -1; + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + + _fileName = string.Empty; + SetTitle(); + + Configuration.Settings.Save(); + return true; + } + } + + return false; + } + + private bool ContainsBluRayStartSegment(byte[] buffer) + { + const int epochStart = 0x80; + var position = 0; + while (position + 3 <= buffer.Length) + { + var segmentType = buffer[position]; + if (segmentType == epochStart) + { + return true; + } + + int length = BluRaySupParser.BigEndianInt16(buffer, position + 1) + 3; + position += length; + } + + return false; + } + + private void ImportSubtitleFromDvbSupFile(string fileName) + { + using (var formSubOcr = new VobSubOcr()) + { + string language = null; + var programMapTableParser = new ProgramMapTableParser(); + programMapTableParser.Parse(fileName); // get languages + if (programMapTableParser.GetSubtitlePacketIds().Count > 0) + { + language = programMapTableParser.GetSubtitleLanguageTwoLetter(programMapTableParser.GetSubtitlePacketIds().First()); + } + + var subtitles = TransportStreamParser.GetDvbSup(fileName); + formSubOcr.Initialize(subtitles, Configuration.Settings.VobSubOcr, fileName, language); + if (formSubOcr.ShowDialog(this) == DialogResult.OK) + { + MakeHistoryForUndo(_language.BeforeImportingDvdSubtitle); + + _subtitle.Paragraphs.Clear(); + SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); + foreach (var p in formSubOcr.SubtitleFromOcr.Paragraphs) + { + _subtitle.Paragraphs.Add(p); + } + + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + _subtitleListViewIndex = -1; + SubtitleListview1.FirstVisibleIndex = -1; + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + + _fileName = string.Empty; + SetTitle(); + + Configuration.Settings.Save(); + } + } + } + + private bool ImportSubtitleFromTransportStream(string fileName) + { + ShowStatus(_language.ParsingTransportStream); + Refresh(); + var tsParser = new TransportStreamParser(); + tsParser.Parse(fileName, (pos, total) => UpdateProgress(pos, total, _language.ParsingTransportStreamFile)); + ShowStatus(string.Empty); + TaskbarList.SetProgressState(Handle, TaskbarButtonProgressFlags.NoProgress); + + if (tsParser.SubtitlePacketIds.Count == 0 && tsParser.TeletextSubtitlesLookup.Count == 0) + { + MessageBox.Show(_language.NoSubtitlesFound); + _exitWhenLoaded = _loading; + return false; + } + + if (tsParser.SubtitlePacketIds.Count == 0 && tsParser.TeletextSubtitlesLookup.Count == 1 && tsParser.TeletextSubtitlesLookup.First().Value.Count() == 1) + { + _subtitle = new Subtitle(tsParser.TeletextSubtitlesLookup.First().Value.First().Value); + _subtitle.Renumber(); + SubtitleListview1.Fill(_subtitle); + SubtitleListview1.SelectIndexAndEnsureVisible(0); + if (!Configuration.Settings.General.DisableVideoAutoLoading) + { + OpenVideo(fileName); + } + + _fileName = Path.GetFileNameWithoutExtension(fileName) + GetCurrentSubtitleFormat().Extension; + _converted = true; + SetTitle(); + return true; + } + + int packetId; + if (tsParser.SubtitlePacketIds.Count + tsParser.TeletextSubtitlesLookup.Sum(p => p.Value.Count()) > 1) + { + using (var subChooser = new TransportStreamSubtitleChooser()) + { + subChooser.Initialize(tsParser, fileName); + if (subChooser.ShowDialog(this) == DialogResult.Cancel) + { + return false; + } + + if (subChooser.IsTeletext) + { + new SubRip().LoadSubtitle(_subtitle, subChooser.Srt.SplitToLines(), null); + _subtitle.Renumber(); + SubtitleListview1.Fill(_subtitle); + SubtitleListview1.SelectIndexAndEnsureVisible(0); + if (!Configuration.Settings.General.DisableVideoAutoLoading) + { + OpenVideo(fileName); + } + + _fileName = Path.GetFileNameWithoutExtension(fileName) + GetCurrentSubtitleFormat().Extension; + _converted = true; + SetTitle(); + return true; + } + + packetId = tsParser.SubtitlePacketIds[subChooser.SelectedIndex]; + } + } + else + { + packetId = tsParser.SubtitlePacketIds[0]; + } + + + var subtitles = tsParser.GetDvbSubtitles(packetId); + using (var formSubOcr = new VobSubOcr()) + { + string language = null; + var programMapTableParser = new ProgramMapTableParser(); + programMapTableParser.Parse(fileName); // get languages + if (programMapTableParser.GetSubtitlePacketIds().Count > 0) + { + language = programMapTableParser.GetSubtitleLanguage(packetId); + } + + formSubOcr.Initialize(subtitles, Configuration.Settings.VobSubOcr, fileName, language); + if (formSubOcr.ShowDialog(this) == DialogResult.OK) + { + MakeHistoryForUndo(_language.BeforeImportingDvdSubtitle); + + _subtitle.Paragraphs.Clear(); + SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); + foreach (var p in formSubOcr.SubtitleFromOcr.Paragraphs) + { + _subtitle.Paragraphs.Add(p); + } + + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + _subtitleListViewIndex = -1; + SubtitleListview1.FirstVisibleIndex = -1; + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + + _fileName = string.Empty; + if (!string.IsNullOrEmpty(formSubOcr.FileName)) + { + var currentFormat = GetCurrentSubtitleFormat(); + _fileName = Utilities.GetPathAndFileNameWithoutExtension(formSubOcr.FileName) + currentFormat.Extension; + if (!Configuration.Settings.General.DisableVideoAutoLoading) + { + OpenVideo(fileName); + } + _converted = true; + } + SetTitle(); + Configuration.Settings.Save(); + return true; + } + } + + _exitWhenLoaded = _loading; + return false; + } + + private bool ImportSubtitleFromMp4(string fileName) + { + var mp4Parser = new MP4Parser(fileName); + var mp4SubtitleTracks = mp4Parser.GetSubtitleTracks(); + if (mp4SubtitleTracks.Count == 0) + { + MessageBox.Show(_language.NoSubtitlesFound); + return false; + } + else if (mp4SubtitleTracks.Count == 1) + { + LoadMp4Subtitle(fileName, mp4SubtitleTracks[0]); + return true; + } + else + { + using (var subtitleChooser = new MatroskaSubtitleChooser("mp4")) + { + subtitleChooser.Initialize(mp4SubtitleTracks); + if (subtitleChooser.ShowDialog(this) == DialogResult.OK) + { + LoadMp4Subtitle(fileName, mp4SubtitleTracks[subtitleChooser.SelectedIndex]); + return true; + } + } + + return false; + } + } + + private bool ImportSubtitleFromDivX(string fileName) + { + var count = 0; + var list = new List(); + using (var f = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + { + var searchBuffer = new byte[2048]; + long pos = 0; + long length = f.Length - 50; + while (pos < length) + { + f.Position = pos; + int readCount = f.Read(searchBuffer, 0, searchBuffer.Length); + for (int i = 0; i < readCount; i++) + { + if (searchBuffer[i] != 0x5b || (i + 4 < readCount && (searchBuffer[i + 1] < 0x30 || searchBuffer[i + 1] > 0x39 || searchBuffer[i + 3] != 0x3a))) + { + continue; + } + + f.Position = pos + i + 1; + + var buffer = new byte[26]; + f.Read(buffer, 0, buffer.Length); + + if (buffer[2] == 0x3a && // : + buffer[5] == 0x3a && // : + buffer[8] == 0x2e && // . + buffer[12] == 0x2d && // - + buffer[15] == 0x3a && // : + buffer[18] == 0x3a && // : + buffer[21] == 0x2e && // . + buffer[25] == 0x5d) // ] + { // subtitle time code + string timeCode = Encoding.ASCII.GetString(buffer, 0, 25); + + f.Read(buffer, 0, 2); + int width = BitConverter.ToUInt16(buffer, 0); + f.Read(buffer, 0, 2); + int height = BitConverter.ToUInt16(buffer, 0); + f.Read(buffer, 0, 2); + int x = BitConverter.ToUInt16(buffer, 0); + f.Read(buffer, 0, 2); + int y = BitConverter.ToUInt16(buffer, 0); + f.Read(buffer, 0, 2); + int xEnd = BitConverter.ToUInt16(buffer, 0); + f.Read(buffer, 0, 2); + int yEnd = BitConverter.ToUInt16(buffer, 0); + f.Read(buffer, 0, 2); + int RleLength = BitConverter.ToUInt16(buffer, 0); + + var colorBuffer = new byte[4 * 3]; // four colors with rgb (3 bytes) + f.Read(colorBuffer, 0, colorBuffer.Length); + + buffer = new byte[RleLength]; + int bytesRead = f.Read(buffer, 0, buffer.Length); + + if (width > 0 && height > 0 && bytesRead == buffer.Length) + { + var xSub = new XSub(timeCode, width, height, colorBuffer, buffer); + list.Add(xSub); + count++; + } + } + } + + pos += searchBuffer.Length; + } + } + + if (count == 0) + { + return false; + } + + using (var formSubOcr = new VobSubOcr()) + { + formSubOcr.Initialize(list, Configuration.Settings.VobSubOcr, fileName); // TODO: language??? + if (formSubOcr.ShowDialog(this) == DialogResult.OK) + { + MakeHistoryForUndo(_language.BeforeImportFromMatroskaFile); + _subtitleListViewIndex = -1; + FileNew(); + foreach (var p in formSubOcr.SubtitleFromOcr.Paragraphs) + { + _subtitle.Paragraphs.Add(p); + } + + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + _subtitleListViewIndex = -1; + SubtitleListview1.FirstVisibleIndex = -1; + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + + _fileName = Utilities.GetPathAndFileNameWithoutExtension(fileName) + GetCurrentSubtitleFormat().Extension; + _converted = true; + SetTitle(); + + Configuration.Settings.Save(); + if (!Configuration.Settings.General.DisableVideoAutoLoading) + { + OpenVideo(fileName); + } + } + } + + return true; + } + + private static Subtitle LoadMp4SubtitleForSync(Trak mp4SubtitleTrack) + { + var subtitle = new Subtitle(); + if (mp4SubtitleTrack.Mdia.IsVobSubSubtitle) + { + return subtitle; + } + else + { + subtitle.Paragraphs.AddRange(mp4SubtitleTrack.Mdia.Minf.Stbl.GetParagraphs()); + } + + return subtitle; + } + + private void LoadMp4Subtitle(string fileName, Trak mp4SubtitleTrack) + { + if (mp4SubtitleTrack.Mdia.IsVobSubSubtitle) + { + var subPicturesWithTimeCodes = new List(); + var paragraphs = mp4SubtitleTrack.Mdia.Minf.Stbl.GetParagraphs(); + for (int i = 0; i < paragraphs.Count; i++) + { + if (mp4SubtitleTrack.Mdia.Minf.Stbl.SubPictures.Count > i) + { + var start = paragraphs[i].StartTime.TimeSpan; + var end = paragraphs[i].EndTime.TimeSpan; + subPicturesWithTimeCodes.Add(new VobSubOcr.SubPicturesWithSeparateTimeCodes(mp4SubtitleTrack.Mdia.Minf.Stbl.SubPictures[i], start, end)); + } + } + + using (var formSubOcr = new VobSubOcr()) + { + formSubOcr.Initialize(subPicturesWithTimeCodes, Configuration.Settings.VobSubOcr, fileName); // TODO: language??? + if (formSubOcr.ShowDialog(this) == DialogResult.OK) + { + MakeHistoryForUndo(_language.BeforeImportFromMatroskaFile); + _subtitleListViewIndex = -1; + FileNew(); + foreach (var p in formSubOcr.SubtitleFromOcr.Paragraphs) + { + _subtitle.Paragraphs.Add(p); + } + + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + _subtitleListViewIndex = -1; + SubtitleListview1.FirstVisibleIndex = -1; + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + + _fileName = Utilities.GetPathAndFileNameWithoutExtension(fileName) + GetCurrentSubtitleFormat().Extension; + _converted = true; + SetTitle(); + + Configuration.Settings.Save(); + } + } + } + else + { + MakeHistoryForUndo(_language.BeforeImportFromMatroskaFile); + _subtitleListViewIndex = -1; + FileNew(); + + _subtitle.Paragraphs.AddRange(mp4SubtitleTrack.Mdia.Minf.Stbl.GetParagraphs()); + + SetEncoding(Encoding.UTF8); + ShowStatus(_language.SubtitleImportedFromMatroskaFile); + _subtitle.Renumber(); + if (fileName.EndsWith(".mp4", StringComparison.OrdinalIgnoreCase) || fileName.EndsWith(".m4v", StringComparison.OrdinalIgnoreCase)) + { + _fileName = fileName.Substring(0, fileName.Length - 4) + GetCurrentSubtitleFormat().Extension; + } + + SetTitle(); + _fileDateTime = new DateTime(); + _converted = true; + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + if (_subtitle.Paragraphs.Count > 0) + { + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + } + + ShowSource(); + } + } + + private void SubtitleListview1_DragEnter(object sender, DragEventArgs e) + { + // make sure they're actually dropping files (not text or anything else) + if (e.Data.GetDataPresent(DataFormats.FileDrop, false)) + { + e.Effect = DragDropEffects.All; + } + } + + private void SubtitleListview1_DragDrop(object sender, DragEventArgs e) + { + _dragAndDropFiles = (string[])e.Data.GetData(DataFormats.FileDrop); + if (_dragAndDropFiles.Length == 1) + { + _dragAndDropTimer.Start(); + } + else + { + MessageBox.Show(_language.DropOnlyOneFile); + } + } + + private void DoSubtitleListview1Drop(object sender, EventArgs e) + { + _dragAndDropTimer.Stop(); + + if (ContinueNewOrExit()) + { + string fileName = _dragAndDropFiles[0]; + var file = new FileInfo(fileName); + + // Do not allow directory drop + if (FileUtil.IsDirectory(fileName)) + { + MessageBox.Show(_language.ErrorDirectoryDropNotAllowed, file.Name, MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + var dirName = Path.GetDirectoryName(fileName); + saveFileDialog1.InitialDirectory = dirName; + openFileDialog1.InitialDirectory = dirName; + var ext = file.Extension.ToLowerInvariant(); + + if (ext == ".mkv" || ext == ".mks") + { + using (var matroska = new MatroskaFile(fileName)) + { + if (matroska.IsValid) + { + var subtitleList = matroska.GetTracks(true); + if (subtitleList.Count == 0) + { + MessageBox.Show(_language.NoSubtitlesFound); + } + else if (subtitleList.Count > 1) + { + using (var subtitleChooser = new MatroskaSubtitleChooser("mkv")) + { + subtitleChooser.Initialize(subtitleList); + if (subtitleChooser.ShowDialog(this) == DialogResult.OK) + { + ResetSubtitle(); + if (LoadMatroskaSubtitle(subtitleList[subtitleChooser.SelectedIndex], matroska, false) && + (ext.Equals(".mkv", StringComparison.Ordinal) || ext.Equals(".mks", StringComparison.Ordinal)) && + !Configuration.Settings.General.DisableVideoAutoLoading) + { + OpenVideo(fileName); + } + } + } + } + else + { + ResetSubtitle(); + if (LoadMatroskaSubtitle(subtitleList[0], matroska, false) && + (ext.Equals(".mkv", StringComparison.Ordinal) || ext.Equals(".mks", StringComparison.Ordinal)) && + !Configuration.Settings.General.DisableVideoAutoLoading) + { + OpenVideo(fileName); + } + } + + return; + } + } + } + else if (ext == ".mp4" || ext == ".m4v" || ext == ".3gp") + { + var mp4Parser = new MP4Parser(fileName); + var mp4SubtitleTracks = mp4Parser.GetSubtitleTracks(); + if (mp4SubtitleTracks.Count > 0) + { + ImportSubtitleFromMp4(fileName); + return; + } + + MessageBox.Show(_language.NoSubtitlesFound); + return; + } + else if (ext == ".vob" || ext == ".ifo") + { + ImportDvdSubtitle(fileName); + return; + } + else if (ext == ".idx") + { + var subFileName = fileName.Substring(0, fileName.Length - 3) + "sub"; + if (File.Exists(subFileName) && FileUtil.IsVobSub(subFileName)) + { + ImportAndOcrVobSubSubtitleNew(subFileName, _loading); + return; + } + } + + comboBoxEncoding.BeginUpdate(); + comboBoxSubtitleFormats.BeginUpdate(); + + if (file.Length < Subtitle.MaxFileSize) + { + if (!OpenFromRecentFiles(fileName)) + { + OpenSubtitle(fileName, null); + } + } + else if (file.Length < 150000000 && ext == ".sub" && IsVobSubFile(fileName, true)) // max 150 mb + { + OpenSubtitle(fileName, null); + } + else if (file.Length < 250000000 && ext == ".sup" && FileUtil.IsBluRaySup(fileName)) // max 250 mb + { + OpenSubtitle(fileName, null); + } + else if ((ext == ".ts" || ext == ".rec" || ext == ".mpg" || ext == ".mpeg") && FileUtil.IsTransportStream(fileName)) + { + OpenSubtitle(fileName, null); + } + else if ((ext == ".m2ts" || ext == ".ts" || ext == ".mts") && FileUtil.IsM2TransportStream(fileName)) + { + OpenSubtitle(fileName, null); + } + else + { + MessageBox.Show(string.Format(_language.DropFileXNotAccepted, fileName)); + } + + comboBoxSubtitleFormats.EndUpdate(); + comboBoxEncoding.EndUpdate(); + } + } + + private void TextBoxSourceDragEnter(object sender, DragEventArgs e) + { + // make sure they're actually dropping files (not text or anything else) + if (e.Data.GetDataPresent(DataFormats.FileDrop, false)) + { + e.Effect = DragDropEffects.All; + } + } + + private void TextBoxSourceDragDrop(object sender, DragEventArgs e) + { + var files = (string[])e.Data.GetData(DataFormats.FileDrop); + if (files.Length == 1) + { + if (ContinueNewOrExit()) + { + OpenSubtitle(files[0], null); + } + } + else + { + MessageBox.Show(_language.DropOnlyOneFile); + } + } + + private void ToolStripMenuItemManualAnsiClick(object sender, EventArgs e) + { + ReloadFromSourceView(); + openFileDialog1.Title = _language.OpenAnsiSubtitle; + openFileDialog1.FileName = string.Empty; + openFileDialog1.Filter = UiUtil.SubtitleExtensionFilter.Value; + if (openFileDialog1.ShowDialog(this) == DialogResult.OK) + { + using (var chooseEncoding = new ChooseEncoding()) + { + chooseEncoding.Initialize(openFileDialog1.FileName); + if (chooseEncoding.ShowDialog(this) == DialogResult.OK) + { + Encoding encoding = chooseEncoding.GetEncoding(); + SetEncoding(Encoding.UTF8); + OpenSubtitle(openFileDialog1.FileName, encoding); + } + } + } + } + + private void ChangeCasingToolStripMenuItem_Click(object sender, EventArgs e) + { + ChangeCasing(false); + } + + private void ChangeCasing(bool onlySelectedLines) + { + if (!IsSubtitleLoaded) + { + DisplaySubtitleNotLoadedMessage(); + return; + } + + SaveSubtitleListviewIndices(); + using (var changeCasing = new ChangeCasing()) + { + if (onlySelectedLines) + { + changeCasing.Text += " - " + _language.SelectedLines; + } + + ReloadFromSourceView(); + if (changeCasing.ShowDialog(this) == DialogResult.OK) + { + MakeHistoryForUndo(_language.BeforeChangeCasing); + + Cursor.Current = Cursors.WaitCursor; + var selectedLines = new Subtitle(); + var selectedIndices = new List(SubtitleListview1.GetSelectedIndices()); + if (onlySelectedLines) + { + foreach (int index in selectedIndices) + { + selectedLines.Paragraphs.Add(new Paragraph(_subtitle.Paragraphs[index])); + } + } + else + { + foreach (var p in _subtitle.Paragraphs) + { + selectedLines.Paragraphs.Add(new Paragraph(p)); + } + } + + bool saveChangeCaseChanges = true; + var casingNamesLinesChanged = 0; + + if (changeCasing.ChangeNamesToo && changeCasing.OnlyAllUpper) + { + selectedIndices = new List(); + var allUpperSubtitle = new Subtitle(); + var sub = onlySelectedLines ? selectedLines : _subtitle; + for (var index = 0; index < sub.Paragraphs.Count; index++) + { + var p = sub.Paragraphs[index]; + var noTags = HtmlUtil.RemoveHtmlTags(p.Text, true); + if (noTags == noTags.ToUpperInvariant()) + { + allUpperSubtitle.Paragraphs.Add(p); + selectedIndices.Add(index); + } + } + + selectedLines = allUpperSubtitle; + onlySelectedLines = true; + } + + changeCasing.FixCasing(selectedLines, LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle)); + if (changeCasing.ChangeNamesToo) + { + using (var changeCasingNames = new ChangeCasingNames()) + { + changeCasingNames.Initialize(selectedLines); + if (changeCasingNames.ShowDialog(this) == DialogResult.OK) + { + changeCasingNames.FixCasing(); + casingNamesLinesChanged = changeCasingNames.LinesChanged; + + if (changeCasing.LinesChanged == 0) + { + ShowStatus(string.Format(_language.CasingCompleteMessageOnlyNames, casingNamesLinesChanged, _subtitle.Paragraphs.Count)); + } + else + { + ShowStatus(string.Format(_language.CasingCompleteMessage, changeCasing.LinesChanged, _subtitle.Paragraphs.Count, casingNamesLinesChanged)); + } + } + else + { + saveChangeCaseChanges = false; + } + } + } + else + { + ShowStatus(string.Format(_language.CasingCompleteMessageNoNames, changeCasing.LinesChanged, _subtitle.Paragraphs.Count)); + } + + if (saveChangeCaseChanges) + { + if (onlySelectedLines) + { + int i = 0; + foreach (int index in selectedIndices) + { + _subtitle.Paragraphs[index].Text = selectedLines.Paragraphs[i].Text; + i++; + } + } + else + { + for (int i = 0; i < _subtitle.Paragraphs.Count; i++) + { + _subtitle.Paragraphs[i].Text = selectedLines.Paragraphs[i].Text; + } + } + + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + if (changeCasing.LinesChanged > 0 || casingNamesLinesChanged > 0) + { + _subtitleListViewIndex = -1; + RestoreSubtitleListviewIndices(); + UpdateSourceView(); + } + } + + Cursor.Current = Cursors.Default; + } + } + } + + private void ToolStripMenuItemChangeFrameRateClick(object sender, EventArgs e) + { + if (!IsSubtitleLoaded) + { + DisplaySubtitleNotLoadedMessage(); + return; + } + + int lastSelectedIndex = 0; + if (SubtitleListview1.SelectedItems.Count > 0) + { + lastSelectedIndex = SubtitleListview1.SelectedItems[0].Index; + } + + ReloadFromSourceView(); + using (var changeFrameRate = new ChangeFrameRate()) + { + changeFrameRate.Initialize(CurrentFrameRate.ToString()); + if (changeFrameRate.ShowDialog(this) == DialogResult.OK) + { + MakeHistoryForUndo(_language.BeforeChangeFrameRate); + + double oldFrameRate = changeFrameRate.OldFrameRate; + double newFrameRate = changeFrameRate.NewFrameRate; + _subtitle.ChangeFrameRate(oldFrameRate, newFrameRate); + + ShowStatus(string.Format(_language.FrameRateChangedFromXToY, oldFrameRate, newFrameRate)); + toolStripComboBoxFrameRate.Text = newFrameRate.ToString(); + + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + _subtitleListViewIndex = -1; + SubtitleListview1.SelectIndexAndEnsureVisible(lastSelectedIndex, true); + } + } + } + + private bool IsVobSubFile(string subFileName, bool verbose) + { + try + { + if (FileUtil.IsVobSub(subFileName)) + { + if (!verbose) + { + return true; + } + + var idxFileName = Utilities.GetPathAndFileNameWithoutExtension(subFileName) + ".idx"; + if (File.Exists(idxFileName)) + { + return true; + } + + var dr = MessageBox.Show(string.Format(_language.IdxFileNotFoundWarning, idxFileName), _title, MessageBoxButtons.YesNoCancel); + return dr == DialogResult.Yes; + } + + if (verbose) + { + MessageBox.Show(string.Format(_language.InvalidVobSubHeader, subFileName)); + } + } + catch (Exception ex) + { + if (verbose) + { + MessageBox.Show(ex.Message); + } + } + + return false; + } + + private void ImportAndOcrSpDvdSup(string fileName, bool showInTaskbar) + { + var spList = new List(); + + using (var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read)) + { + var buffer = new byte[SpHeader.SpHeaderLength]; + int bytesRead = fs.Read(buffer, 0, buffer.Length); + var header = new SpHeader(buffer); + + while (header.Identifier == "SP" && bytesRead > 0 && header.NextBlockPosition > 4) + { + buffer = new byte[header.NextBlockPosition]; + bytesRead = fs.Read(buffer, 0, buffer.Length); + if (bytesRead == buffer.Length) + { + header.AddPicture(buffer); + spList.Add(header); + } + + buffer = new byte[SpHeader.SpHeaderLength]; + bytesRead = fs.Read(buffer, 0, buffer.Length); + while (bytesRead == buffer.Length && Encoding.ASCII.GetString(buffer, 0, 2) != "SP") + { + fs.Seek(fs.Position - buffer.Length + 1, SeekOrigin.Begin); + bytesRead = fs.Read(buffer, 0, buffer.Length); + } + header = new SpHeader(buffer); + } + } + + using (var vobSubOcr = new VobSubOcr()) + { + if (showInTaskbar) + { + vobSubOcr.Icon = (Icon)this.Icon.Clone(); + vobSubOcr.ShowInTaskbar = true; + vobSubOcr.ShowIcon = true; + } + + vobSubOcr.Initialize(fileName, null, Configuration.Settings.VobSubOcr, spList); + if (vobSubOcr.ShowDialog(this) == DialogResult.OK) + { + MakeHistoryForUndo(_language.BeforeImportingVobSubFile); + FileNew(); + _subtitle.Paragraphs.Clear(); + SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); + foreach (var p in vobSubOcr.SubtitleFromOcr.Paragraphs) + { + _subtitle.Paragraphs.Add(p); + } + + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + _subtitleListViewIndex = -1; + SubtitleListview1.FirstVisibleIndex = -1; + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + + _fileName = Path.ChangeExtension(vobSubOcr.FileName, GetCurrentSubtitleFormat().Extension); + SetTitle(); + _converted = true; + + Configuration.Settings.Save(); + } + else + { + _exitWhenLoaded = _loading; + } + } + } + + private void ImportAndOcrVobSubSubtitleNew(string fileName, bool showInTaskbar) + { + if (!IsVobSubFile(fileName, true)) + { + return; + } + + using (var vobSubOcr = new VobSubOcr()) + { + if (showInTaskbar) + { + vobSubOcr.Icon = (Icon)Icon.Clone(); + vobSubOcr.ShowInTaskbar = true; + vobSubOcr.ShowIcon = true; + } + + if (vobSubOcr.Initialize(fileName, Configuration.Settings.VobSubOcr, this) && vobSubOcr.ShowDialog(this) == DialogResult.OK) + { + MakeHistoryForUndo(_language.BeforeImportingVobSubFile); + FileNew(); + _subtitle.Paragraphs.Clear(); + SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); + foreach (var p in vobSubOcr.SubtitleFromOcr.Paragraphs) + { + _subtitle.Paragraphs.Add(p); + } + + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + _subtitleListViewIndex = -1; + SubtitleListview1.FirstVisibleIndex = -1; + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + + _fileName = Path.ChangeExtension(vobSubOcr.FileName, GetCurrentSubtitleFormat().Extension); + SetTitle(); + _converted = true; + + Configuration.Settings.Save(); + } + else + { + _exitWhenLoaded = _loading; + } + } + } + + private void ToolStripMenuItemMergeLinesClick(object sender, EventArgs e) + { + if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count >= 1) + { + // check consecutive numbers + var last = SubtitleListview1.SelectedIndices[0] - 1; + foreach (int index in SubtitleListview1.SelectedIndices) + { + if (last != index - 1) + { + return; + } + + last = index; + } + + MergeAfterToolStripMenuItemClick(null, null); + } + } + + private void VisualSyncSelectedLinesToolStripMenuItemClick(object sender, EventArgs e) + { + ShowVisualSync(true); + } + + private void SaveSubtitleListviewIndices() + { + _selectedIndices = new List(); + foreach (int index in SubtitleListview1.SelectedIndices) + { + _selectedIndices.Add(index); + } + } + + private void RestoreSubtitleListviewIndices() + { + _subtitleListViewIndex = -1; + if (_selectedIndices != null) + { + SubtitleListview1.SelectNone(); + int i = 0; + foreach (int index in _selectedIndices) + { + if (index >= 0 && index < SubtitleListview1.Items.Count) + { + SubtitleListview1.Items[index].Selected = true; + if (i == 0) + { + SubtitleListview1.SelectIndexAndEnsureVisible(index, true); + } + } + + i++; + } + } + } + + private void ShowSelectedLinesEarlierlaterToolStripMenuItemClick(object sender, EventArgs e) + { + if (!IsSubtitleLoaded) + { + DisplaySubtitleNotLoadedMessage(); + return; + } + + if (_showEarlierOrLater != null && !_showEarlierOrLater.IsDisposed) + { + _showEarlierOrLater.WindowState = FormWindowState.Normal; + _showEarlierOrLater.Focus(); + return; + } + + bool waveformEnabled = timerWaveform.Enabled; + timerWaveform.Stop(); + timer1.Stop(); + + _showEarlierOrLater = new ShowEarlierLater(); + if (!_showEarlierOrLater.IsPositionAndSizeSaved) + { + _showEarlierOrLater.Top = Top + 100; + _showEarlierOrLater.Left = Left + (Width / 2) - (_showEarlierOrLater.Width / 3); + } + + _showEarlierOrLater.Initialize(ShowEarlierOrLater, true); + MakeHistoryForUndo(_language.BeforeShowSelectedLinesEarlierLater); + _showEarlierOrLater.Show(this); + + timerWaveform.Enabled = waveformEnabled; + timer1.Start(); + + RefreshSelectedParagraph(); + } + + public static Control FindFocusedControl(Control control) + { + var container = control as ContainerControl; + while (container != null) + { + control = container.ActiveControl; + container = control as ContainerControl; + } + + return control; + } + + internal void MainKeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.LWin) + { + _winLeftDownTicks = DateTime.UtcNow.Ticks; + } + + if (e.KeyCode == Keys.RWin) + { + _winRightDownTicks = DateTime.UtcNow.Ticks; + } + + if ((DateTime.UtcNow.Ticks - _winLeftDownTicks) <= 10000 * 999 || (DateTime.UtcNow.Ticks - _winRightDownTicks) <= 10000 * 999) // less than 999 ms + { + // if it's less than one second since Win key was pressed we ignore key (not perfect...) + e.SuppressKeyPress = true; + return; + } + + if (e.Modifiers == Keys.Alt && e.KeyCode == (Keys.RButton | Keys.ShiftKey) && (textBoxListViewText.Focused || textBoxListViewTextAlternate.Focused)) + { // annoying that focus leaves textbox while typing, when pressing Alt alone + e.SuppressKeyPress = true; + return; + } + + if (e.Modifiers == Keys.Alt && e.KeyCode == (Keys.RButton | Keys.ShiftKey)) + { + return; + } + + if (e.Modifiers == Keys.Shift && e.KeyCode == Keys.ShiftKey) + { + return; + } + + if (e.Modifiers == Keys.Control && e.KeyCode == (Keys.LButton | Keys.ShiftKey)) + { + return; + } + + if (e.Modifiers == (Keys.Control | Keys.Shift) && e.KeyCode == Keys.ShiftKey) + { + return; + } + + var fc = FindFocusedControl(this); + if (fc != null && e.Modifiers != Keys.Control && e.Modifiers != Keys.Alt && e.Modifiers != (Keys.Control | Keys.Shift) && e.Modifiers != (Keys.Control | Keys.Alt) && e.Modifiers != (Keys.Control | Keys.Shift | Keys.Alt)) + { + // do not check for shortcuts if text is being entered and a textbox is focused + if ((fc.Parent.Name == textBoxListViewText.Name || fc.Parent.Name == textBoxListViewTextAlternate.Name || fc.Name == textBoxSearchWord.Name) && + ((e.KeyCode >= Keys.A && e.KeyCode <= Keys.Z) || (e.KeyCode >= Keys.OemSemicolon && e.KeyCode <= Keys.OemBackslash))) + { + return; + } + + // do not check for shortcuts if a number is being entered and a time box is focused + if (fc.Parent != null && (fc.Parent.Name == timeUpDownStartTime.Name || fc.Parent.Name == numericUpDownDuration.Name) && + (e.KeyCode >= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9 || e.KeyValue >= 48 && e.KeyValue <= 57)) + { + return; + } + } + + bool inListView = tabControlSubtitle.SelectedIndex == TabControlListView; + + + if (e.KeyCode == Keys.Escape && !_cancelWordSpellCheck) + { + _cancelWordSpellCheck = true; + } + else if (audioVisualizer.Visible && e.KeyData == _shortcuts.WaveformVerticalZoom) + { + audioVisualizer.VerticalZoomFactor *= 1.1; + e.SuppressKeyPress = true; + } + else if (audioVisualizer.Visible && e.KeyData == _shortcuts.WaveformVerticalZoomOut) + { + audioVisualizer.VerticalZoomFactor /= 1.1; + e.SuppressKeyPress = true; + } + else if (audioVisualizer.Visible && e.KeyData == _shortcuts.WaveformZoomIn) + { + audioVisualizer.ZoomIn(); + e.SuppressKeyPress = true; + } + else if (audioVisualizer.Visible && e.KeyData == _shortcuts.WaveformZoomOut) + { + audioVisualizer.ZoomOut(); + e.SuppressKeyPress = true; + } + else if (audioVisualizer.Visible && e.KeyData == _shortcuts.WaveformSplit) + { + if (mediaPlayer.IsPaused) + { + var pos = mediaPlayer.VideoPlayer.CurrentPosition; + var paragraph = _subtitle.GetFirstParagraphOrDefaultByTime(pos * TimeCode.BaseUnit); + if (paragraph != null && + pos * TimeCode.BaseUnit + 100 > paragraph.StartTime.TotalMilliseconds && + pos * TimeCode.BaseUnit - 100 < paragraph.EndTime.TotalMilliseconds) + { + SubtitleListview1.SelectIndexAndEnsureVisible(paragraph); + SplitSelectedParagraph(pos, null); + } + } + + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.VideoPlayFirstSelected && !string.IsNullOrEmpty(VideoFileName)) + { + PlayFirstSelectedSubtitle(); + } + else if (audioVisualizer.Visible && (e.KeyData == _shortcuts.WaveformPlaySelection || e.KeyData == _shortcuts.WaveformPlaySelectionEnd)) + { + WaveformPlaySelection(nearEnd: e.KeyData == _shortcuts.WaveformPlaySelectionEnd); + e.SuppressKeyPress = true; + } + else if (audioVisualizer.Visible && e.KeyData == _shortcuts.WaveformSearchSilenceForward) + { + if (audioVisualizer.WavePeaks != null) + { + audioVisualizer.FindDataBelowThreshold(Configuration.Settings.VideoControls.WaveformSeeksSilenceMaxVolume, Configuration.Settings.VideoControls.WaveformSeeksSilenceDurationSeconds); + } + e.SuppressKeyPress = true; + } + else if (audioVisualizer.Visible && e.KeyData == _shortcuts.WaveformSearchSilenceBack) + { + if (audioVisualizer.WavePeaks != null) + { + audioVisualizer.FindDataBelowThresholdBack(Configuration.Settings.VideoControls.WaveformSeeksSilenceMaxVolume, Configuration.Settings.VideoControls.WaveformSeeksSilenceDurationSeconds); + } + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainInsertAfter == e.KeyData && inListView) + { + InsertAfter(string.Empty); + e.SuppressKeyPress = true; + textBoxListViewText.Focus(); + } + else if (_shortcuts.MainInsertBefore == e.KeyData && inListView) + { + InsertBefore(); + e.SuppressKeyPress = true; + textBoxListViewText.Focus(); + } + else if (_shortcuts.MainMergeDialog == e.KeyData && inListView) + { + MergeDialogs(); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainListViewToggleDashes == e.KeyData && inListView) + { + if (textBoxListViewText.Focused) + { + ToggleDashesTextBox(textBoxListViewText); + } + else if (textBoxListViewTextAlternate.Focused) + { + ToggleDashesTextBox(textBoxListViewTextAlternate); + } + else + { + ToggleDashes(); + } + e.SuppressKeyPress = true; + } + else if (!toolStripMenuItemRtlUnicodeControlChars.Visible && _shortcuts.MainEditFixRTLViaUnicodeChars == e.KeyData && inListView) + { + toolStripMenuItemRtlUnicodeControlChar_Click(null, null); + e.SuppressKeyPress = true; + } + else if (!toolStripMenuItemRemoveUnicodeControlChars.Visible && _shortcuts.MainEditRemoveRTLUnicodeChars == e.KeyData && inListView) + { + toolStripMenuItemRemoveUnicodeControlChar_Click(null, null); + e.SuppressKeyPress = true; + } + else if (!toolStripMenuItemReverseRightToLeftStartEnd.Visible && _shortcuts.MainEditReverseStartAndEndingForRtl == e.KeyData && inListView) + { + ReverseStartAndEndingForRtl(); + e.SuppressKeyPress = true; + } + else if (toolStripMenuItemUndo.ShortcutKeys == e.KeyData) // undo + { + toolStripMenuItemUndo_Click(sender, e); + e.SuppressKeyPress = true; + } + else if (toolStripMenuItemRedo.ShortcutKeys == e.KeyData) // redo + { + toolStripMenuItemRedo_Click(sender, e); + e.SuppressKeyPress = true; + } + else if (e.KeyCode == Keys.Down && e.Modifiers == Keys.Alt) + { + if (AutoRepeatContinueOn || AutoRepeatOn) + { + PlayNext(); + } + else + { + ButtonNextClick(null, null); + } + } + else if (e.KeyCode == Keys.Up && e.Modifiers == Keys.Alt) + { + if (AutoRepeatContinueOn || AutoRepeatOn) + { + PlayPrevious(); + } + else + { + ButtonPreviousClick(null, null); + } + + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainGeneralGoToNextSubtitle == e.KeyData) + { + MoveNextPrevious(0); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainGeneralGoToNextSubtitleCursorAtEnd == e.KeyData) + { + MoveNextPrevious(0); + textBoxListViewText.SelectionStart = textBoxListViewText.Text.Length; + textBoxListViewText.SelectionLength = 0; + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainGeneralGoToPrevSubtitle == e.KeyData) + { + if (AutoRepeatContinueOn || AutoRepeatOn) + { + PlayPrevious(); + } + else + { + ButtonPreviousClick(null, null); + } + + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainGeneralGoToStartOfCurrentSubtitle == e.KeyData) + { + if (SubtitleListview1.SelectedItems.Count == 1 && mediaPlayer.VideoPlayer != null) + { + mediaPlayer.CurrentPosition = _subtitle.Paragraphs[SubtitleListview1.SelectedItems[0].Index].StartTime.TotalSeconds; + e.SuppressKeyPress = true; + } + + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainGeneralGoToEndOfCurrentSubtitle == e.KeyData) + { + if (SubtitleListview1.SelectedItems.Count == 1 && mediaPlayer.VideoPlayer != null) + { + mediaPlayer.CurrentPosition = _subtitle.Paragraphs[SubtitleListview1.SelectedItems[0].Index].EndTime.TotalSeconds; + e.SuppressKeyPress = true; + } + + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainGoToPreviousSubtitleAndFocusVideo == e.KeyData) + { + int newIndex = _subtitleListViewIndex - 1; + if (newIndex >= 0) + { + _subtitleListViewIndex = -1; + SubtitleListview1.SelectIndexAndEnsureVisibleFaster(newIndex); + _subtitleListViewIndex = newIndex; + textBoxListViewText.Focus(); + textBoxListViewText.SelectAll(); + GotoSubtitleIndex(newIndex); + ShowSubtitle(); + e.SuppressKeyPress = true; + } + } + else if (_shortcuts.MainGoToNextSubtitleAndFocusVideo == e.KeyData) + { + int newIndex = _subtitleListViewIndex + 1; + if (newIndex < _subtitle.Paragraphs.Count) + { + _subtitleListViewIndex = -1; + SubtitleListview1.SelectIndexAndEnsureVisibleFaster(newIndex); + _subtitleListViewIndex = newIndex; + textBoxListViewText.Focus(); + textBoxListViewText.SelectAll(); + GotoSubtitleIndex(newIndex); + ShowSubtitle(); + e.SuppressKeyPress = true; + } + } + else if (_shortcuts.MainGoToNextSubtitleAndPlay == e.KeyData && mediaPlayer != null) + { + int newIndex = _subtitleListViewIndex + 1; + if (newIndex < _subtitle.Paragraphs.Count) + { + _subtitleListViewIndex = -1; + SubtitleListview1.SelectIndexAndEnsureVisibleFaster(newIndex); + _subtitleListViewIndex = newIndex; + textBoxListViewText.Focus(); + textBoxListViewText.SelectAll(); + GotoSubtitleIndex(newIndex); + var p = _subtitle.GetParagraphOrDefault(newIndex); + if (p != null) + { + mediaPlayer.CurrentPosition = p.StartTime.TotalSeconds; + ShowSubtitle(); + mediaPlayer.Play(); + _endSeconds = p.EndTime.TotalSeconds; + } + + e.SuppressKeyPress = true; + } + } + else if (_shortcuts.MainGoToPrevSubtitleAndPlay == e.KeyData && mediaPlayer != null) + { + int newIndex = _subtitleListViewIndex - 1; + if (newIndex > 0) + { + _subtitleListViewIndex = -1; + SubtitleListview1.SelectIndexAndEnsureVisibleFaster(newIndex); + _subtitleListViewIndex = newIndex; + textBoxListViewText.Focus(); + textBoxListViewText.SelectAll(); + GotoSubtitleIndex(newIndex); + var p = _subtitle.GetParagraphOrDefault(newIndex); + if (p != null) + { + mediaPlayer.CurrentPosition = p.StartTime.TotalSeconds; + ShowSubtitle(); + mediaPlayer.Play(); + _endSeconds = p.EndTime.TotalSeconds; + } + + e.SuppressKeyPress = true; + } + } + else if (_shortcuts.MainUnbreakNoSpace == e.KeyData) + { + Unbreak(true); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainGeneralToggleBookmarks == e.KeyData) + { + ToggleBookmarks(false); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainGeneralClearBookmarks == e.KeyData) + { + ClearBookmarks(); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainGeneralGoToBookmark == e.KeyData) + { + e.SuppressKeyPress = true; + GoToBookmark(); + } + else if (_shortcuts.MainGeneralGoToPreviousBookmark == e.KeyData) + { + GoToPrevoiusBookmark(); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainGeneralGoToNextBookmark == e.KeyData) + { + GoToNextBookmark(); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainGeneralChooseProfile == e.KeyData) + { + ChooseProfile(); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainGeneralDuplicateLine == e.KeyData && SubtitleListview1.SelectedItems.Count == 1) + { + DuplicateLine(); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainGeneralFileSaveAll == e.KeyData) + { + SaveAll(); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainToggleFocus == e.KeyData && inListView) + { + if (SubtitleListview1.Focused) + { + textBoxListViewText.Focus(); + } + else + { + SubtitleListview1.Focus(); + } + + e.SuppressKeyPress = true; + } + else if (e.KeyCode == Keys.Home && e.Modifiers == Keys.Alt) + { + SubtitleListview1.FirstVisibleIndex = -1; + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + e.SuppressKeyPress = true; + } + else if (e.KeyCode == Keys.End && e.Modifiers == Keys.Alt) + { + SubtitleListview1.SelectIndexAndEnsureVisible(SubtitleListview1.Items.Count - 1, true); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainGeneralGoToFirstSelectedLine == e.KeyData) //Locate first selected line in subtitle listview + { + if (SubtitleListview1.SelectedItems.Count > 0) + { + SubtitleListview1.SelectedItems[0].EnsureVisible(); + } + + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainGeneralGoToFirstEmptyLine == e.KeyData) //Go to first empty line - if any + { + GoToFirstEmptyLine(); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainGeneralMergeSelectedLines == e.KeyData) + { + if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count >= 1) + { + e.SuppressKeyPress = true; + if (SubtitleListview1.SelectedItems.Count == 2) + { + MergeAfterToolStripMenuItemClick(null, null); + } + else + { + MergeSelectedLines(); + } + } + } + else if (_shortcuts.MainGeneralMergeSelectedLinesAndAutoBreak == e.KeyData) + { + e.SuppressKeyPress = true; + if (SubtitleListview1.SelectedItems.Count == 2) + { + MergeWithLineAfter(false, BreakMode.AutoBreak); + } + else + { + MergeSelectedLines(BreakMode.AutoBreak); + } + } + else if (_shortcuts.MainGeneralMergeSelectedLinesAndUnbreak == e.KeyData) + { + e.SuppressKeyPress = true; + if (SubtitleListview1.SelectedItems.Count == 2) + { + MergeWithLineAfter(false, BreakMode.Unbreak); + } + else + { + MergeSelectedLines(BreakMode.Unbreak); + } + } + else if (_shortcuts.MainGeneralMergeSelectedLinesAndUnbreakNoSpace == e.KeyData) + { + if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count >= 1) + { + e.SuppressKeyPress = true; + if (SubtitleListview1.SelectedItems.Count == 2) + { + MergeWithLineAfter(false, BreakMode.UnbreakNoSpace); + } + else + { + MergeSelectedLines(BreakMode.UnbreakNoSpace); + } + } + } + else if (_shortcuts.MainGeneralMergeSelectedLinesBilingual == e.KeyData) + { + if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count >= 1 && SubtitleListview1.SelectedItems.Count < 10) + { + e.SuppressKeyPress = true; + MergeSelectedLinesBilingual(); + } + } + else if (_shortcuts.MainGeneralMergeSelectedLinesOnlyFirstText == e.KeyData) + { + if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count >= 1) + { + e.SuppressKeyPress = true; + MergeSelectedLinesOnlyFirstText(); + } + } + else if (_shortcuts.MainGeneralMergeWithNext == e.KeyData) + { + if (SubtitleListview1.SelectedItems.Count >= 1) + { + var idx = SubtitleListview1.SelectedItems[0].Index; + if (idx >= 0 && _subtitle.Paragraphs.Count > idx + 1) + { + SubtitleListview1.SelectIndexAndEnsureVisible(idx, true); + MergeAfterToolStripMenuItemClick(null, null); + e.SuppressKeyPress = true; + } + } + } + else if (_shortcuts.MainGeneralMergeWithPrevious == e.KeyData) + { + if (SubtitleListview1.SelectedItems.Count >= 1) + { + var idx = SubtitleListview1.SelectedItems[0].Index; + if (idx > 0) + { + SubtitleListview1.SelectIndexAndEnsureVisible(idx - 1, true); + MergeAfterToolStripMenuItemClick(null, null); + e.SuppressKeyPress = true; + } + } + } + else if (_shortcuts.MainGeneralToggleTranslationMode == e.KeyData) + { // toggle translator mode + EditToolStripMenuItemDropDownOpening(null, null); + toolStripMenuItemTranslationMode_Click(null, null); + } + else if (e.KeyData == _shortcuts.VideoPlayPauseToggle) + { + if (mediaPlayer.VideoPlayer != null) + { + if (_shortcuts.VideoPlayPauseToggle == Keys.Space && + (textBoxListViewText.Focused || textBoxListViewTextAlternate.Focused || textBoxSearchWord.Focused)) + { + return; + } + + _endSeconds = -1; + e.SuppressKeyPress = true; + System.Threading.SynchronizationContext.Current.Post(TimeSpan.FromMilliseconds(1), () => mediaPlayer.TogglePlayPause()); + } + } + else if (e.KeyData == _shortcuts.VideoPause) + { + if (mediaPlayer.VideoPlayer != null) + { + _endSeconds = -1; + mediaPlayer.Pause(); + e.SuppressKeyPress = true; + } + } + else if (_shortcuts.MainVideoPlayFromJustBefore == e.KeyData) + { + buttonBeforeText_Click(null, null); + e.SuppressKeyPress = true; + } + else if (e.Modifiers == (Keys.Control | Keys.Shift) && e.KeyCode == Keys.Right) + { + if (!textBoxListViewText.Focused && !textBoxListViewTextAlternate.Focused) + { + mediaPlayer.CurrentPosition += 1.0; + e.SuppressKeyPress = true; + } + } + else if (e.Modifiers == (Keys.Control | Keys.Shift) && e.KeyCode == Keys.Left) + { + if (!textBoxListViewText.Focused && !textBoxListViewTextAlternate.Focused) + { + mediaPlayer.CurrentPosition -= 1.0; + e.SuppressKeyPress = true; + } + } + else if (e.Modifiers == Keys.None && e.KeyCode == Keys.Space) + { + if (!textBoxListViewText.Focused && !textBoxListViewTextAlternate.Focused && !textBoxSource.Focused && mediaPlayer.VideoPlayer != null) + { + if (audioVisualizer.Focused || mediaPlayer.Focused || SubtitleListview1.Focused) + { + _endSeconds = -1; + mediaPlayer.TogglePlayPause(); + e.SuppressKeyPress = true; + } + } + } + else if (e.Modifiers == Keys.Alt && e.KeyCode == Keys.D1) + { + if (SubtitleListview1.SelectedItems.Count > 0 && _subtitle != null && mediaPlayer.VideoPlayer != null) + { + var p = _subtitle.GetParagraphOrDefault(SubtitleListview1.SelectedItems[0].Index); + if (p != null) + { + mediaPlayer.CurrentPosition = p.StartTime.TotalSeconds; + } + } + e.SuppressKeyPress = true; + } + else if (e.Modifiers == Keys.Alt && e.KeyCode == Keys.D2) + { + if (SubtitleListview1.SelectedItems.Count > 0 && _subtitle != null && mediaPlayer.VideoPlayer != null) + { + var p = _subtitle.GetParagraphOrDefault(SubtitleListview1.SelectedItems[0].Index); + if (p != null) + { + mediaPlayer.CurrentPosition = p.EndTime.TotalSeconds; + } + } + e.SuppressKeyPress = true; + } + else if (e.Modifiers == Keys.Alt && e.KeyCode == Keys.D3) + { + if (SubtitleListview1.SelectedItems.Count > 0 && _subtitle != null && mediaPlayer.VideoPlayer != null) + { + int index = SubtitleListview1.SelectedItems[0].Index - 1; + var p = _subtitle.GetParagraphOrDefault(index); + if (p != null) + { + SubtitleListview1.SelectIndexAndEnsureVisible(index, true); + mediaPlayer.CurrentPosition = p.StartTime.TotalSeconds; + } + } + e.SuppressKeyPress = true; + } + else if (e.Modifiers == Keys.Alt && e.KeyCode == Keys.D4) + { + if (SubtitleListview1.SelectedItems.Count > 0 && _subtitle != null && mediaPlayer.VideoPlayer != null) + { + int index = SubtitleListview1.SelectedItems[0].Index + 1; + var p = _subtitle.GetParagraphOrDefault(index); + if (p != null) + { + SubtitleListview1.SelectIndexAndEnsureVisible(index, true); + mediaPlayer.CurrentPosition = p.StartTime.TotalSeconds; + } + } + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainVideoToggleStartEndCurrent == e.KeyData) + { + if (SubtitleListview1.SelectedItems.Count > 0 && _subtitle != null && mediaPlayer.VideoPlayer != null) + { + mediaPlayer.Pause(); + var p = _subtitle.GetParagraphOrDefault(SubtitleListview1.SelectedItems[0].Index); + if (p != null) + { + if (Math.Abs(mediaPlayer.CurrentPosition - p.StartTime.TotalSeconds) < 0.1) + { + mediaPlayer.CurrentPosition = p.EndTime.TotalSeconds; + } + else + { + mediaPlayer.CurrentPosition = p.StartTime.TotalSeconds; + } + } + } + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainVideoPlayCurrent == e.KeyData) + { + if (SubtitleListview1.SelectedItems.Count > 0 && _subtitle != null && mediaPlayer.VideoPlayer != null) + { + var p = _subtitle.GetParagraphOrDefault(SubtitleListview1.SelectedItems[0].Index); + if (p != null) + { + mediaPlayer.CurrentPosition = p.StartTime.TotalSeconds; + ShowSubtitle(); + mediaPlayer.Play(); + _endSeconds = p.EndTime.TotalSeconds; + } + } + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainVideoGoToStartCurrent == e.KeyData) + { + if (mediaPlayer.VideoPlayer != null) + { + GotoSubPositionAndPause(); + } + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainVideo3000MsLeft == e.KeyData) + { + if (mediaPlayer.VideoPlayer != null) + { + GoBackSeconds(3); + } + e.SuppressKeyPress = true; + } + else if (e.Modifiers == (Keys.Control | Keys.Alt | Keys.Shift) && e.KeyCode == Keys.W) // watermark + { + var enc = GetCurrentEncoding(); + if (enc != Encoding.UTF8 && enc != Encoding.UTF32 && enc != Encoding.Unicode && enc != Encoding.UTF7) + { + MessageBox.Show(Configuration.Settings.Language.Watermark.ErrorUnicodeEncodingOnly); + } + else + { + using (var watermarkForm = new Watermark()) + { + MakeHistoryForUndo(Configuration.Settings.Language.Watermark.BeforeWatermark); + watermarkForm.Initialize(_subtitle, FirstSelectedIndex); + if (watermarkForm.ShowDialog(this) == DialogResult.OK) + { + watermarkForm.AddOrRemove(_subtitle); + RefreshSelectedParagraph(); + } + } + } + + e.SuppressKeyPress = true; + } + else if (e.Modifiers == (Keys.Control | Keys.Alt | Keys.Shift) && e.KeyCode == Keys.F) // Toggle HHMMSSFF / HHMMSSMMM + { + Configuration.Settings.General.UseTimeFormatHHMMSSFF = !Configuration.Settings.General.UseTimeFormatHHMMSSFF; + RefreshTimeCodeMode(); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainGeneralSwitchTranslationAndOriginal == e.KeyData) // switch original/current + { + if (_subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0 && _networkSession == null) + { + int firstIndex = FirstSelectedIndex; + double firstMs = -1; + if (firstIndex >= 0) + { + firstMs = _subtitle.Paragraphs[firstIndex].StartTime.TotalMilliseconds; + } + + var temp = _subtitle; + _subtitle = _subtitleAlternate; + _subtitleAlternate = temp; + + var tempName = _fileName; + _fileName = _subtitleAlternateFileName; + _subtitleAlternateFileName = tempName; + + var tempChangeSubText = _changeSubtitleHash; + _changeSubtitleHash = _changeAlternateSubtitleHash; + _changeAlternateSubtitleHash = tempChangeSubText; + + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + + _subtitleListViewIndex = -1; + if (firstIndex >= 0 && _subtitle.Paragraphs.Count > firstIndex && Math.Abs(_subtitle.Paragraphs[firstIndex].StartTime.TotalMilliseconds - firstMs) < 0.01) + { + SubtitleListview1.SelectIndexAndEnsureVisible(firstIndex, true); + } + else + { + RefreshSelectedParagraph(); + } + + SetTitle(); + + _fileDateTime = new DateTime(); + } + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainGeneralMergeTranslationAndOriginal == e.KeyData) // Merge translation and original + { + if (_subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0 && _networkSession == null) + { + if (ContinueNewOrExit()) + { + var subtitle = new Subtitle(); + var fr = CurrentFrameRate; + var format = GetCurrentSubtitleFormat(); + var videoFileName = VideoFileName; + foreach (var p in _subtitle.Paragraphs) + { + var newP = new Paragraph(p); + var original = Utilities.GetOriginalParagraph(_subtitle.GetIndex(p), p, _subtitleAlternate.Paragraphs); + if (original != null) + { + newP.Text = (newP.Text.TrimEnd() + Environment.NewLine + original.Text.TrimStart()).Trim(); + } + + subtitle.Paragraphs.Add(newP); + } + + RemoveAlternate(true, true); + FileNew(); + SetCurrentFormat(format); + toolStripComboBoxFrameRate.Text = fr.ToString(); + _subtitle = subtitle; + _subtitleListViewIndex = -1; + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + if (!string.IsNullOrEmpty(videoFileName)) + { + OpenVideo(videoFileName); + } + e.SuppressKeyPress = true; + } + } + } + else if (e.KeyData == _shortcuts.ToggleVideoDockUndock) + { + if (_isVideoControlsUndocked) + { + RedockVideoControlsToolStripMenuItemClick(null, null); + } + else + { + UndockVideoControlsToolStripMenuItemClick(null, null); + } + e.SuppressKeyPress = true; + } + else if (mediaPlayer.VideoPlayer != null && e.KeyData == _shortcuts.MainVideoFoucsSetVideoPosition) + { + timeUpDownVideoPositionAdjust.Focus(); + e.SuppressKeyPress = true; + } + else if (mediaPlayer.VideoPlayer != null && e.KeyData == _shortcuts.Video1FrameLeft) + { + if (mediaPlayer.VideoPlayer is LibMpvDynamic libMpv) + { + libMpv.GetPreviousFrame(); + } + else + { + MoveVideoSeconds(-1.0 / Configuration.Settings.General.CurrentFrameRate); + } + + e.SuppressKeyPress = true; + } + else if (mediaPlayer.VideoPlayer != null && e.KeyData == _shortcuts.Video1FrameRight) + { + if (mediaPlayer.VideoPlayer is LibMpvDynamic libMpv) + { + libMpv.GetNextFrame(); + } + else + { + MoveVideoSeconds(1.0 / Configuration.Settings.General.CurrentFrameRate); + } + + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.Video1FrameLeftWithPlay) + { + if (mediaPlayer.VideoPlayer != null) + { + double startSeconds = mediaPlayer.CurrentPosition - (1.0 / Configuration.Settings.General.CurrentFrameRate); + _endSeconds = startSeconds + (1.0 / Configuration.Settings.General.CurrentFrameRate); + _endSecondsNewPosition = startSeconds; + mediaPlayer.CurrentPosition = startSeconds; + UiUtil.ShowSubtitle(_subtitle, mediaPlayer); + mediaPlayer.Play(); + _endSecondsNewPositionTicks = DateTime.UtcNow.Ticks; + } + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.Video1FrameRightWithPlay) + { + if (mediaPlayer.VideoPlayer != null) + { + double startSeconds = mediaPlayer.CurrentPosition + (1.0 / Configuration.Settings.General.CurrentFrameRate); + _endSeconds = startSeconds + (1.0 / Configuration.Settings.General.CurrentFrameRate); + _endSecondsNewPosition = startSeconds; + mediaPlayer.CurrentPosition = startSeconds; + UiUtil.ShowSubtitle(_subtitle, mediaPlayer); + mediaPlayer.Play(); + _endSecondsNewPositionTicks = DateTime.UtcNow.Ticks; + } + e.SuppressKeyPress = true; + } + else if (mediaPlayer.VideoPlayer != null && e.KeyData == _shortcuts.Video100MsLeft) + { + MoveVideoSeconds(-0.1); + e.SuppressKeyPress = true; + } + else if (mediaPlayer.VideoPlayer != null && e.KeyData == _shortcuts.Video100MsRight) + { + MoveVideoSeconds(0.1); + e.SuppressKeyPress = true; + } + else if (mediaPlayer.VideoPlayer != null && e.KeyData == _shortcuts.Video500MsLeft) + { + MoveVideoSeconds(-0.5); + e.SuppressKeyPress = true; + } + else if (mediaPlayer.VideoPlayer != null && e.KeyData == _shortcuts.Video500MsRight) + { + MoveVideoSeconds(0.5); + e.SuppressKeyPress = true; + } + else if (mediaPlayer.VideoPlayer != null && e.KeyData == _shortcuts.Video1000MsLeft) + { + MoveVideoSeconds(-1.0); + e.SuppressKeyPress = true; + } + else if (mediaPlayer.VideoPlayer != null && e.KeyData == _shortcuts.Video1000MsRight) + { + MoveVideoSeconds(1.0); + e.SuppressKeyPress = true; + } + else if (mediaPlayer.VideoPlayer != null && e.KeyData == _shortcuts.Video5000MsLeft) + { + MoveVideoSeconds(-5.0); + e.SuppressKeyPress = true; + } + else if (mediaPlayer.VideoPlayer != null && e.KeyData == _shortcuts.Video5000MsRight) + { + MoveVideoSeconds(5.0); + e.SuppressKeyPress = true; + } + else if (mediaPlayer.VideoPlayer != null && e.KeyData == _shortcuts.VideoXSMsLeft) + { + ButtonAdjustSecBackClick(null, null); + e.SuppressKeyPress = true; + } + else if (mediaPlayer.VideoPlayer != null && e.KeyData == _shortcuts.VideoXSMsRight) + { + ButtonAdjustSecForwardClick(null, null); + e.SuppressKeyPress = true; + } + else if (mediaPlayer.VideoPlayer != null && e.KeyData == _shortcuts.VideoXLMsLeft) + { + buttonAdjustSecBack2_Click(null, null); + e.SuppressKeyPress = true; + } + else if (mediaPlayer.VideoPlayer != null && e.KeyData == _shortcuts.VideoXLMsRight) + { + buttonAdjustSecForward2_Click(null, null); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainToolsBeamer == e.KeyData) + { + using (var beamer = new Beamer(this, _subtitle, _subtitleListViewIndex)) + { + beamer.ShowDialog(this); + } + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainVideoFullscreen) // fullscreen + { + GoFullscreen(false); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainVideoSlower) + { + e.SuppressKeyPress = true; + for (var index = 0; index < toolStripSplitButtonPlayRate.DropDownItems.Count; index++) + { + var item = (ToolStripMenuItem)toolStripSplitButtonPlayRate.DropDownItems[index]; + if (item.Checked && index > 0) + { + SetPlayRate(toolStripSplitButtonPlayRate.DropDownItems[index - 1], null); + return; + } + } + } + else if (e.KeyData == _shortcuts.MainVideoFaster) + { + e.SuppressKeyPress = true; + for (var index = 0; index < toolStripSplitButtonPlayRate.DropDownItems.Count; index++) + { + var item = (ToolStripMenuItem)toolStripSplitButtonPlayRate.DropDownItems[index]; + if (item.Checked && index + 1 < toolStripSplitButtonPlayRate.DropDownItems.Count) + { + SetPlayRate(toolStripSplitButtonPlayRate.DropDownItems[index + 1], null); + return; + } + } + } + else if (e.KeyData == _shortcuts.MainVideoReset) + { + e.SuppressKeyPress = true; + if (audioVisualizer != null) + { + audioVisualizer.ZoomFactor = 1.0; + audioVisualizer.VerticalZoomFactor = 1.0; + InitializeWaveformZoomDropdown(); + } + + if (mediaPlayer != null && mediaPlayer.VideoPlayer != null) + { + mediaPlayer.VideoPlayer.PlayRate = 1.0; + InitializePlayRateDropDown(); + toolStripSplitButtonPlayRate.Image = imageListPlayRate.Images[0]; + } + } + else if (audioVisualizer.Focused && audioVisualizer.NewSelectionParagraph != null && e.KeyData == _shortcuts.WaveformAddTextAtHere) + { + addParagraphHereToolStripMenuItem_Click(null, null); + e.SuppressKeyPress = true; + } + else if (audioVisualizer.Focused && audioVisualizer.NewSelectionParagraph != null && e.KeyData == _shortcuts.WaveformAddTextAtHereFromClipboard) + { + addParagraphAndPasteToolStripMenuItem_Click(null, null); + e.SuppressKeyPress = true; + } + else if (audioVisualizer.Focused && audioVisualizer.NewSelectionParagraph != null && e.KeyData == _shortcuts.WaveformSetParagraphAsNewSelection) + { + toolStripMenuItemSetParagraphAsSelection_Click(null, null); + e.SuppressKeyPress = true; + } + else if (audioVisualizer.Focused && e.KeyData == _shortcuts.WaveformFocusListView) + { + SubtitleListview1.Focus(); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.VideoGoToPrevSubtitle) + { + GoToPreviousSubtitle(mediaPlayer.CurrentPosition * TimeCode.BaseUnit); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.VideoGoToNextSubtitle) + { + GoToNextSubtitle(mediaPlayer.CurrentPosition * TimeCode.BaseUnit); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.VideoSelectNextSubtitle) + { + var cp = mediaPlayer.CurrentPosition * TimeCode.BaseUnit; + foreach (var p in _subtitle.Paragraphs) + { + if (p.StartTime.TotalMilliseconds > cp) + { + SubtitleListview1.SelectNone(); + SubtitleListview1.Items[_subtitle.Paragraphs.IndexOf(p)].Selected = true; + SubtitleListview1.Items[_subtitle.Paragraphs.IndexOf(p)].Focused = true; + break; + } + } + + e.SuppressKeyPress = true; + } + else if (mediaPlayer.Chapters?.Count > 0 && e.KeyData == _shortcuts.VideoGoToPrevChapter) + { + var cp = mediaPlayer.CurrentPosition - 0.01; + foreach (var chapter in mediaPlayer.Chapters.Reverse()) + { + if (chapter.StartTime < cp) + { + mediaPlayer.CurrentPosition = chapter.StartTime; + break; + } + } + + e.SuppressKeyPress = true; + } + else if (mediaPlayer.Chapters?.Count > 0 && e.KeyData == _shortcuts.VideoGoToNextChapter) + { + var cp = mediaPlayer.CurrentPosition + 0.01; + foreach (var chapter in mediaPlayer.Chapters) + { + if (chapter.StartTime > cp) + { + mediaPlayer.CurrentPosition = chapter.StartTime; + break; + } + } + + e.SuppressKeyPress = true; + } + else if (audioVisualizer.SceneChanges != null && e.KeyData == _shortcuts.WaveformGoToPreviousSceneChange) + { + var cp = mediaPlayer.CurrentPosition - 0.01; + foreach (var sceneChange in audioVisualizer.SceneChanges.Reverse()) + { + if (sceneChange < cp) + { + mediaPlayer.CurrentPosition = sceneChange; + break; + } + } + + e.SuppressKeyPress = true; + } + else if (audioVisualizer.SceneChanges != null && e.KeyData == _shortcuts.WaveformGoToNextSceneChange) + { + var cp = mediaPlayer.CurrentPosition + 0.01; + foreach (var sceneChange in audioVisualizer.SceneChanges) + { + if (sceneChange > cp) + { + mediaPlayer.CurrentPosition = sceneChange; + break; + } + } + + e.SuppressKeyPress = true; + } + else if (audioVisualizer.SceneChanges != null && mediaPlayer.IsPaused && e.KeyData == _shortcuts.WaveformToggleSceneChange) + { + var cp = mediaPlayer.CurrentPosition; + var idx = audioVisualizer.GetSceneChangeIndex(cp); + if (idx >= 0) + { + RemoveSceneChange(idx); + if (audioVisualizer.SceneChanges.Count == 0) + { + SceneChangeHelper.DeleteSceneChanges(VideoFileName); + } + } + else + { // add scene change + var list = audioVisualizer.SceneChanges.Where(p => p > 0).ToList(); + list.Add(cp); + list.Sort(); + audioVisualizer.SceneChanges = list; + SceneChangeHelper.SaveSceneChanges(VideoFileName, list); + } + + e.SuppressKeyPress = true; + } + else if (audioVisualizer.SceneChanges != null && mediaPlayer.IsPaused && e.KeyData == _shortcuts.WaveformGuessStart) + { + AutoGuessStartTime(_subtitleListViewIndex); + e.SuppressKeyPress = true; + } + else if (audioVisualizer.Focused && e.KeyCode == Keys.Delete) + { + ToolStripMenuItemDeleteClick(null, null); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainToolsAutoDuration == e.KeyData) + { + MakeAutoDuration(); + e.SuppressKeyPress = true; + } + else if (e.Modifiers == (Keys.Control | Keys.Alt | Keys.Shift) && e.KeyCode == Keys.I) + { + using (var form = new ImportUnknownFormat(string.Empty)) + { + if (form.ShowDialog(this) == DialogResult.OK) + { + if (form.ImportedSubitle?.Paragraphs.Count > 0) + { + _subtitle = form.ImportedSubitle; + _fileName = null; + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + SetTitle(); + } + } + } + + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainTextBoxMoveLastWordDown) + { + if (textBoxListViewTextAlternate.Focused) + { + MoveLastWordDown(textBoxListViewTextAlternate); + } + else + { + MoveLastWordDown(textBoxListViewText); + } + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainTextBoxMoveFirstWordFromNextUp) + { + if (textBoxListViewTextAlternate.Focused) + { + MoveFirstWordInNextUp(textBoxListViewTextAlternate); + } + else + { + MoveFirstWordInNextUp(textBoxListViewText); + } + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainTextBoxMoveLastWordDownCurrent) + { + if (textBoxListViewTextAlternate.Focused) + { + MoveWordUpDownInCurrent(true, textBoxListViewTextAlternate); + } + else + { + MoveWordUpDownInCurrent(true, textBoxListViewText); + } + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainTextBoxMoveFirstWordUpCurrent) + { + if (textBoxListViewTextAlternate.Focused) + { + MoveWordUpDownInCurrent(false, textBoxListViewTextAlternate); + } + else + { + MoveWordUpDownInCurrent(false, textBoxListViewText); + } + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainAutoCalcCurrentDuration == e.KeyData) + { + e.SuppressKeyPress = true; + if (SubtitleListview1.SelectedItems.Count >= 1) + { + MakeHistoryForUndo(_language.BeforeDisplayTimeAdjustment); + _makeHistoryPaused = true; + var idx = SubtitleListview1.SelectedItems[0].Index; + _subtitle.RecalculateDisplayTime(Configuration.Settings.General.SubtitleMaximumCharactersPerSeconds, idx, Configuration.Settings.General.SubtitleOptimalCharactersPerSeconds); + SetDurationInSeconds(_subtitle.Paragraphs[idx].Duration.TotalSeconds); + _makeHistoryPaused = false; + } + } + else if (e.KeyCode == Keys.F3 && e.Modifiers == Keys.Shift) + { + FindPrevious(); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainAdjustExtendCurrentSubtitle == e.KeyData) + { + ExtendCurrentSubtitle(); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainAdjustExtendToNextSubtitle == e.KeyData) + { + ExtendSelectedLinesToNextLine(); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainAdjustExtendToPreviousSubtitle == e.KeyData) + { + ExtendSelectedLinesToPreviousLine(); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainAdjustExtendPreviousLineEndToCurrentStart == e.KeyData) + { + ExtendPreviousEndToCurrentStart(); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainAdjustExtendNextLineStartToCurrentEnd == e.KeyData) + { + ExtendNextStartToCurrentEnd(); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainAdjustSnapStartToNextSceneChange == e.KeyData) + { + SnapSelectedLinesStartToNextSceneChange(); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainAdjustSnapStartToNextSceneChangeWithGap == e.KeyData) + { + SnapSelectedLinesStartToNextSceneChange(true); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainAdjustSnapEndToPreviousSceneChange == e.KeyData) + { + SnapSelectedLinesEndToPreviousSceneChange(); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainAdjustSnapEndToPreviousSceneChangeWithGap == e.KeyData) + { + SnapSelectedLinesEndToPreviousSceneChange(true); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainAdjustExtendToNextSceneChange == e.KeyData) + { + ExtendSelectedLinesToNextSceneChange(); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainAdjustExtendToNextSceneChangeWithGap == e.KeyData) + { + ExtendSelectedLinesToNextSceneChange(true); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainAdjustExtendToPreviousSceneChange == e.KeyData) + { + ExtendSelectedLinesToPreviousSceneChange(); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainAdjustExtendToPreviousSceneChangeWithGap == e.KeyData) + { + ExtendSelectedLinesToPreviousSceneChange(true); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainListViewGoToNextError) + { + GoToNextSyntaxError(); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainWaveformAdd) + { + if (audioVisualizer.WavePeaks == null) + { + AudioWaveform_Click(null, null); + } + e.SuppressKeyPress = true; + } + + + //TABS: Create / adjust / translate + + // create + else if (_shortcuts.MainCreateInsertSubAtVideoPos == e.KeyData) + { + ButtonInsertNewTextClick(null, null); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainCreateInsertSubAtVideoPosNoTextBoxFocus == e.KeyData) + { + var p = InsertNewTextAtVideoPosition(); + p.Text = string.Empty; + SubtitleListview1.SetText(_subtitle.GetIndex(p), p.Text); + textBoxListViewText.Text = p.Text; + e.SuppressKeyPress = true; + } + else if (tabControlButtons.SelectedTab == tabPageCreate && e.Modifiers == Keys.Alt && e.KeyCode == Keys.F9) + { + StopAutoDuration(); + ButtonSetEndClick(null, null); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainCreateSetStart == e.KeyData) + { + buttonSetStartTime_Click(null, null); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainCreateSetEnd == e.KeyData) + { + StopAutoDuration(); + ButtonSetEndClick(null, null); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainAdjustSetEndAndPause == e.KeyData) + { + StopAutoDuration(); + mediaPlayer.Pause(); + ButtonSetEndClick(null, null); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainCreateSetEndAddNewAndGoToNew == e.KeyData) + { + StopAutoDuration(); + e.SuppressKeyPress = true; + + if (SubtitleListview1.SelectedItems.Count == 1) + { + double videoPosition = mediaPlayer.CurrentPosition; + if (!mediaPlayer.IsPaused) + { + videoPosition -= Configuration.Settings.General.SetStartEndHumanDelay / TimeCode.BaseUnit; + } + + int index = SubtitleListview1.SelectedItems[0].Index; + MakeHistoryForUndoOnlyIfNotResent(string.Format(_language.VideoControls.BeforeChangingTimeInWaveformX, "#" + _subtitle.Paragraphs[index].Number + " " + _subtitle.Paragraphs[index].Text)); + + var p = _subtitle.Paragraphs[index]; + p.EndTime = TimeCode.FromSeconds(videoPosition); + if (p.Duration.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines > Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds) + { + var newEndTime = new TimeCode(p.EndTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines); + double charactersPerSecond = Utilities.GetCharactersPerSecond(new Paragraph(p) { EndTime = newEndTime }); + if (charactersPerSecond <= Configuration.Settings.General.SubtitleMaximumCharactersPerSeconds) + { + p.EndTime = newEndTime; + } + } + + SubtitleListview1.SetStartTimeAndDuration(index, _subtitle.Paragraphs[index], _subtitle.GetParagraphOrDefault(index + 1), _subtitle.GetParagraphOrDefault(index - 1)); + SetDurationInSeconds(_subtitle.Paragraphs[index].Duration.TotalSeconds); + ButtonInsertNewTextClick(null, null); + } + } + else if (_shortcuts.MainCreateStartDownEndUp == e.KeyData) + { + if (_mainCreateStartDownEndUpParagraph == null) + { + _mainCreateStartDownEndUpParagraph = InsertNewTextAtVideoPosition(); + } + + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainAdjustSelected100MsForward == e.KeyData) + { + ShowEarlierOrLater(100, SelectionChoice.SelectionOnly); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainAdjustSelected100MsBack == e.KeyData) + { + ShowEarlierOrLater(-100, SelectionChoice.SelectionOnly); + e.SuppressKeyPress = true; + } + + + // adjust + else if (_shortcuts.MainAdjustSelected100MsForward == e.KeyData) + { + ShowEarlierOrLater(100, SelectionChoice.SelectionOnly); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainAdjustSelected100MsBack == e.KeyData) + { + ShowEarlierOrLater(-100, SelectionChoice.SelectionOnly); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainAdjustAdjustStartXMsBack == e.KeyData) + { + MoveStartCurrent(-Configuration.Settings.Tools.MoveStartEndMs, false); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainAdjustAdjustStartXMsForward == e.KeyData) + { + MoveStartCurrent(Configuration.Settings.Tools.MoveStartEndMs, false); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainAdjustAdjustEndXMsBack == e.KeyData) + { + MoveEndCurrent(-Configuration.Settings.Tools.MoveStartEndMs, false); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainAdjustAdjustEndXMsForward == e.KeyData) + { + MoveEndCurrent(Configuration.Settings.Tools.MoveStartEndMs, false); + e.SuppressKeyPress = true; + } + + else if (_shortcuts.MainAdjustMoveStartOneFrameBack == e.KeyData) + { + MoveStartCurrent(-(int)Math.Round(1000.0 / CurrentFrameRate), false); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainAdjustMoveStartOneFrameForward == e.KeyData) + { + MoveStartCurrent((int)Math.Round(1000.0 / CurrentFrameRate), false); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainAdjustMoveEndOneFrameBack == e.KeyData) + { + MoveEndCurrent(-(int)Math.Round(1000.0 / CurrentFrameRate), false); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainAdjustMoveEndOneFrameForward == e.KeyData) + { + MoveEndCurrent((int)Math.Round(1000.0 / CurrentFrameRate), false); + e.SuppressKeyPress = true; + } + + else if (_shortcuts.MainAdjustMoveStartOneFrameBackKeepGapPrev == e.KeyData) + { + MoveStartCurrent(-(int)Math.Round(1000.0 / CurrentFrameRate), true); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainAdjustMoveStartOneFrameForwardKeepGapPrev == e.KeyData) + { + MoveStartCurrent((int)Math.Round(1000.0 / CurrentFrameRate), true); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainAdjustMoveEndOneFrameBackKeepGapNext == e.KeyData) + { + MoveEndCurrent(-(int)Math.Round(1000.0 / CurrentFrameRate), true); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainAdjustMoveEndOneFrameForwardKeepGapNext == e.KeyData) + { + MoveEndCurrent((int)Math.Round(1000.0 / CurrentFrameRate), true); + e.SuppressKeyPress = true; + } + + else if (mediaPlayer.VideoPlayer != null && (_shortcuts.MainAdjustSetStartAndOffsetTheRest == e.KeyData || _shortcuts.MainAdjustSetStartAndOffsetTheRest2 == e.KeyData)) + { + ButtonSetStartAndOffsetRestClick(null, null); + e.SuppressKeyPress = true; + } + else if (mediaPlayer.VideoPlayer != null && _shortcuts.MainAdjustSetEndAndOffsetTheRest == e.KeyData) + { + SetEndAndOffsetTheRest(false); + e.SuppressKeyPress = true; + } + else if (mediaPlayer.VideoPlayer != null && _shortcuts.MainAdjustSetEndAndOffsetTheRestAndGoToNext == e.KeyData) + { + SetEndAndOffsetTheRest(true); + e.SuppressKeyPress = true; + } + else if (mediaPlayer.VideoPlayer != null && _shortcuts.MainAdjustSetEndAndGotoNext == e.KeyData) + { + ShowNextSubtitleLabel(); + ButtonSetEndAndGoToNextClick(null, null); + e.SuppressKeyPress = true; + } + else if (mediaPlayer.VideoPlayer != null && _shortcuts.MainAdjustSetStartKeepDuration == e.KeyData) + { + SetStartTime(true, mediaPlayer.CurrentPosition); + e.SuppressKeyPress = true; + } + else if (mediaPlayer.VideoPlayer != null && _shortcuts.MainAdjustInsertViaEndAutoStart == e.KeyData) + { + SetCurrentViaEndPositionAndGotoNext(FirstSelectedIndex, false); + e.SuppressKeyPress = true; + } + else if (mediaPlayer.VideoPlayer != null && _shortcuts.MainAdjustInsertViaEndAutoStartAndGoToNext == e.KeyData) + { + ShowNextSubtitleLabel(); + SetCurrentViaEndPositionAndGotoNext(FirstSelectedIndex, true); + e.SuppressKeyPress = true; + } + else if (mediaPlayer.VideoPlayer != null && _shortcuts.MainAdjustSetStartAutoDurationAndGoToNext == e.KeyData) + { + SetCurrentStartAutoDurationAndGotoNext(FirstSelectedIndex); + e.SuppressKeyPress = true; + } + else if (mediaPlayer.VideoPlayer != null && _shortcuts.MainAdjustSetEndNextStartAndGoToNext == e.KeyData) + { + ShowNextSubtitleLabel(); + SetCurrentEndNextStartAndGoToNext(FirstSelectedIndex); + e.SuppressKeyPress = true; + } + else if (mediaPlayer.VideoPlayer != null && _shortcuts.MainAdjustStartDownEndUpAndGoToNext == e.KeyData && _mainAdjustStartDownEndUpAndGoToNextParagraph == null) + { + ShowNextSubtitleLabel(); + _mainAdjustStartDownEndUpAndGoToNextParagraph = _subtitle.GetParagraphOrDefault(FirstSelectedIndex); + SetStartTime(true, mediaPlayer.CurrentPosition); + e.SuppressKeyPress = true; + } + else if (mediaPlayer.VideoPlayer != null && _shortcuts.MainAdjustSetStartAndEndOfPrevious == e.KeyData) + { + var pos = mediaPlayer.CurrentPosition; + SetStartAndEndOfPrevious(pos, false); + e.SuppressKeyPress = true; + } + else if (mediaPlayer.VideoPlayer != null && _shortcuts.MainAdjustSetStartAndEndOfPreviousAndGoToNext == e.KeyData) + { + var pos = mediaPlayer.CurrentPosition; + SetStartAndEndOfPrevious(pos, true); + e.SuppressKeyPress = true; + } + + // translate + else if (_shortcuts.MainTranslateGoogleIt == e.KeyData) + { + e.SuppressKeyPress = true; + buttonGoogleIt_Click(null, null); + } + else if (_shortcuts.MainTranslateCustomSearch1 == e.KeyData) + { + e.SuppressKeyPress = true; + RunCustomSearch(Configuration.Settings.VideoControls.CustomSearchUrl1); + } + else if (_shortcuts.MainTranslateCustomSearch2 == e.KeyData) + { + e.SuppressKeyPress = true; + RunCustomSearch(Configuration.Settings.VideoControls.CustomSearchUrl2); + } + else if (_shortcuts.MainTranslateCustomSearch3 == e.KeyData) + { + e.SuppressKeyPress = true; + RunCustomSearch(Configuration.Settings.VideoControls.CustomSearchUrl3); + } + else if (_shortcuts.MainTranslateCustomSearch4 == e.KeyData) + { + e.SuppressKeyPress = true; + RunCustomSearch(Configuration.Settings.VideoControls.CustomSearchUrl4); + } + else if (_shortcuts.MainTranslateCustomSearch5 == e.KeyData) + { + e.SuppressKeyPress = true; + RunCustomSearch(Configuration.Settings.VideoControls.CustomSearchUrl5); + } + // put new entries above tabs + } + + private void SetStartAndEndOfPrevious(double positionInSeconds, bool goToNext) + { + int index = SubtitleListview1.SelectedItems[0].Index; + var current = _subtitle.GetParagraphOrDefault(index); + if (SubtitleListview1.SelectedItems.Count != 1 || current == null) + { + return; + } + + if (positionInSeconds > current.EndTime.TotalSeconds - Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds / 1000) + { + return; + } + + // previous sub + var p = _subtitle.GetParagraphOrDefault(index - 1); + if (p == null || p.StartTime.TotalMilliseconds < p.StartTime.TotalMilliseconds - 9000) + { + SetStartTime(false, mediaPlayer.CurrentPosition); + return; + } + + if (positionInSeconds < p.StartTime.TotalSeconds + Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds / 1000) + { + return; + } + + SetStartTime(false, mediaPlayer.CurrentPosition); + + var oldParagraph = new Paragraph(p, false); + MakeHistoryForUndoOnlyIfNotResent(string.Format(_language.VideoControls.BeforeChangingTimeInWaveformX, "#" + p.Number + " " + p.Text)); + p.EndTime.TotalMilliseconds = positionInSeconds * TimeCode.BaseUnit - Configuration.Settings.General.MinimumMillisecondsBetweenLines; + if (oldParagraph.StartTime.IsMaxTime) + { + p.StartTime.TotalMilliseconds = p.EndTime.TotalMilliseconds - Utilities.GetOptimalDisplayMilliseconds(p.Text); + } + + SubtitleListview1.SetStartTimeAndDuration(index, current, _subtitle.GetParagraphOrDefault(index + 1), _subtitle.GetParagraphOrDefault(index - 1)); + SubtitleListview1.SetStartTimeAndDuration(index - 1, p, current, _subtitle.GetParagraphOrDefault(index - 2)); + UpdateOriginalTimeCodes(oldParagraph); + ShowSource(); + + var next = _subtitle.GetParagraphOrDefault(index - 1); + if (goToNext && next != null) + { + SubtitleListview1.SelectIndexAndEnsureVisible(index + 1, true); + } + } + + private void ExtendCurrentSubtitle() + { + if (SubtitleListview1.SelectedItems.Count == 1) + { + var historyAdded = false; + var idx = SubtitleListview1.SelectedItems[0].Index; + var p = _subtitle.Paragraphs[idx]; + var next = _subtitle.GetParagraphOrDefault(idx + 1); + if (next == null || next.StartTime.TotalMilliseconds > p.StartTime.TotalMilliseconds + Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines) + { + MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustExtendCurrentSubtitle)); + historyAdded = true; + p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds; + } + else + { + MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustExtendCurrentSubtitle)); + historyAdded = true; + p.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; + } + + if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) + { + var original = Utilities.GetOriginalParagraph(idx, p, _subtitleAlternate.Paragraphs); + if (original != null) + { + var originalNext = _subtitleAlternate.GetParagraphOrDefault(_subtitleAlternate.GetIndex(original) + 1); + if (originalNext == null || originalNext.StartTime.TotalMilliseconds > original.StartTime.TotalMilliseconds + Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines) + { + if (!historyAdded) + { + MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustExtendCurrentSubtitle)); + } + + original.EndTime.TotalMilliseconds = original.StartTime.TotalMilliseconds + Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds; + } + else + { + if (!historyAdded) + { + MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustExtendCurrentSubtitle)); + } + + original.EndTime.TotalMilliseconds = originalNext.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; + } + } + } + + RefreshSelectedParagraph(); + } + } + + private void ExtendSelectedLinesToNextLine() + { + var historyAdded = false; + foreach (ListViewItem selectedItem in SubtitleListview1.SelectedItems) + { + var idx = selectedItem.Index; + var p = _subtitle.Paragraphs[idx]; + var next = _subtitle.GetParagraphOrDefault(idx + 1); + if (next != null) + { + if (!historyAdded) + { + MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustExtendToNextSubtitle)); + historyAdded = true; + } + p.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; + } + + if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) + { + var original = Utilities.GetOriginalParagraph(idx, p, _subtitleAlternate.Paragraphs); + if (original != null) + { + var originalNext = _subtitleAlternate.GetParagraphOrDefault(_subtitleAlternate.GetIndex(original) + 1); + if (originalNext != null) + { + if (!historyAdded) + { + MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustExtendToNextSubtitle)); + historyAdded = true; + } + + original.EndTime.TotalMilliseconds = originalNext.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; + } + } + } + + RefreshSelectedParagraphs(); + } + } + + private void ExtendSelectedLinesToPreviousLine() + { + var historyAdded = false; + foreach (ListViewItem selectedItem in SubtitleListview1.SelectedItems) + { + var idx = selectedItem.Index; + var p = _subtitle.Paragraphs[idx]; + var previous = _subtitle.GetParagraphOrDefault(idx - 1); + if (previous != null) + { + if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) + { + var original = Utilities.GetOriginalParagraph(idx, p, _subtitleAlternate.Paragraphs); + if (original != null) + { + var originalPrevious = _subtitleAlternate.GetParagraphOrDefault(_subtitleAlternate.GetIndex(original) - 1); + if (originalPrevious != null) + { + if (!historyAdded) + { + MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustExtendToPreviousSubtitle)); + historyAdded = true; + } + + original.StartTime.TotalMilliseconds = originalPrevious.EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines; + } + } + } + + if (!historyAdded) + { + MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustExtendToPreviousSubtitle)); + historyAdded = true; + } + + p.StartTime.TotalMilliseconds = previous.EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines; + } + + RefreshSelectedParagraphs(); + } + } + + private void ExtendPreviousEndToCurrentStart() + { + if (SubtitleListview1.SelectedItems.Count == 1) + { + var historyAdded = false; + var idx = SubtitleListview1.SelectedItems[0].Index; + var p = _subtitle.Paragraphs[idx]; + var previous = _subtitle.GetParagraphOrDefault(idx - 1); + if (previous != null) + { + if (!historyAdded) + { + MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustExtendPreviousLineEndToCurrentStart)); + historyAdded = true; + } + previous.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; + } + + if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) + { + var original = Utilities.GetOriginalParagraph(idx, p, _subtitleAlternate.Paragraphs); + if (original != null) + { + var originalPrevious = _subtitleAlternate.GetParagraphOrDefault(_subtitleAlternate.GetIndex(original) - 1); + if (originalPrevious != null) + { + if (!historyAdded) + { + MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustExtendPreviousLineEndToCurrentStart)); + historyAdded = true; + } + + originalPrevious.EndTime.TotalMilliseconds = original.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; + } + } + } + + SubtitleListview1.SetStartTimeAndDuration(idx - 1, previous, _subtitle.GetParagraphOrDefault(idx), _subtitle.GetParagraphOrDefault(idx - 2)); + } + } + + private void ExtendNextStartToCurrentEnd() + { + if (SubtitleListview1.SelectedItems.Count == 1) + { + var historyAdded = false; + var idx = SubtitleListview1.SelectedItems[0].Index; + var p = _subtitle.Paragraphs[idx]; + var next = _subtitle.GetParagraphOrDefault(idx + 1); + if (next != null) + { + if (!historyAdded) + { + MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustExtendNextLineStartToCurrentEnd)); + historyAdded = true; + } + next.StartTime.TotalMilliseconds = p.EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines; + } + + if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) + { + var original = Utilities.GetOriginalParagraph(idx, p, _subtitleAlternate.Paragraphs); + if (original != null) + { + var originalNext = _subtitleAlternate.GetParagraphOrDefault(_subtitleAlternate.GetIndex(original) + 1); + if (originalNext != null) + { + if (!historyAdded) + { + MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustExtendNextLineStartToCurrentEnd)); + historyAdded = true; + } + + originalNext.StartTime.TotalMilliseconds = original.EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines; + } + } + } + + SubtitleListview1.SetStartTimeAndDuration(idx + 1, next, _subtitle.GetParagraphOrDefault(idx + 2), _subtitle.GetParagraphOrDefault(idx)); + } + } + + private void SnapSelectedLinesStartToNextSceneChange(bool withGap = false) + { + var historyAdded = false; + foreach (ListViewItem selectedItem in SubtitleListview1.SelectedItems) + { + var idx = selectedItem.Index; + var p = _subtitle.Paragraphs[idx]; + List nextSceneChanges = audioVisualizer.SceneChanges.Count > 0 ? audioVisualizer.SceneChanges.Where(x => x > p.StartTime.TotalSeconds + 0.01).ToList() : new List(); + if (nextSceneChanges.Count > 0) + { + double nearestSceneChange = nextSceneChanges.Aggregate((x, y) => Math.Abs(x - p.StartTime.TotalSeconds) < Math.Abs(y - p.StartTime.TotalSeconds) ? x : y); + + if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) + { + var original = Utilities.GetOriginalParagraph(idx, p, _subtitleAlternate.Paragraphs); + if (original != null) + { + if (!historyAdded) + { + MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustSnapStartToNextSceneChange)); + historyAdded = true; + } + + if (!withGap) + { + if (nearestSceneChange * 1000 < p.EndTime.TotalMilliseconds) + { + original.StartTime.TotalMilliseconds = nearestSceneChange * 1000; + } + } + else + { + if (nearestSceneChange * 1000 + Configuration.Settings.General.MinimumMillisecondsBetweenLines < p.EndTime.TotalMilliseconds) + { + original.StartTime.TotalMilliseconds = nearestSceneChange * 1000 + Configuration.Settings.General.MinimumMillisecondsBetweenLines; + + } + } + } + } + + if (!historyAdded) + { + MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustSnapStartToNextSceneChange)); + historyAdded = true; + } + + if (!withGap) + { + if (nearestSceneChange * 1000 < p.EndTime.TotalMilliseconds) + { + p.StartTime.TotalMilliseconds = nearestSceneChange * 1000; + } + } + else + { + if (nearestSceneChange * 1000 + Configuration.Settings.General.MinimumMillisecondsBetweenLines < p.EndTime.TotalMilliseconds) + { + p.StartTime.TotalMilliseconds = nearestSceneChange * 1000 + Configuration.Settings.General.MinimumMillisecondsBetweenLines; + } + } + } + + RefreshSelectedParagraphs(); + } + } + + private void SnapSelectedLinesEndToPreviousSceneChange(bool withGap = false) + { + var historyAdded = false; + foreach (ListViewItem selectedItem in SubtitleListview1.SelectedItems) + { + var idx = selectedItem.Index; + var p = _subtitle.Paragraphs[idx]; + List previousSceneChanges = audioVisualizer.SceneChanges.Count > 0 ? audioVisualizer.SceneChanges.Where(x => x < p.EndTime.TotalSeconds + 0.01).ToList() : new List(); + if (previousSceneChanges.Count > 0) + { + double nearestSceneChange = previousSceneChanges.Aggregate((x, y) => Math.Abs(x - p.EndTime.TotalSeconds) < Math.Abs(y - p.EndTime.TotalSeconds) ? x : y); + + if (!historyAdded) + { + MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustSnapEndToPreviousSceneChange)); + historyAdded = true; + } + + if (!withGap) + { + if (nearestSceneChange * 1000 > p.StartTime.TotalMilliseconds) + { + p.EndTime.TotalMilliseconds = nearestSceneChange * 1000; + } + } + else + { + if (nearestSceneChange * 1000 - Configuration.Settings.General.MinimumMillisecondsBetweenLines > p.StartTime.TotalMilliseconds) + { + p.EndTime.TotalMilliseconds = nearestSceneChange * 1000 - Configuration.Settings.General.MinimumMillisecondsBetweenLines; + } + } + + if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) + { + var original = Utilities.GetOriginalParagraph(idx, p, _subtitleAlternate.Paragraphs); + if (original != null) + { + if (!historyAdded) + { + MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustSnapEndToPreviousSceneChange)); + historyAdded = true; + } + + if (!withGap) + { + if (nearestSceneChange * 1000 > p.StartTime.TotalMilliseconds) + { + original.EndTime.TotalMilliseconds = nearestSceneChange * 1000; + } + } + else + { + if (nearestSceneChange * 1000 - Configuration.Settings.General.MinimumMillisecondsBetweenLines > p.StartTime.TotalMilliseconds) + { + original.EndTime.TotalMilliseconds = nearestSceneChange * 1000 - Configuration.Settings.General.MinimumMillisecondsBetweenLines; + + } + } + } + } + } + + RefreshSelectedParagraphs(); + } + } + + private void ExtendSelectedLinesToNextSceneChange(bool withGap = false) + { + var historyAdded = false; + foreach (ListViewItem selectedItem in SubtitleListview1.SelectedItems) + { + var idx = selectedItem.Index; + var p = _subtitle.Paragraphs[idx]; + List nextSceneChanges = audioVisualizer.SceneChanges.Count > 0 ? audioVisualizer.SceneChanges.Where(x => x > p.EndTime.TotalSeconds + 0.01).ToList() : new List(); + if (nextSceneChanges.Count > 0) + { + var next = _subtitle.GetParagraphOrDefault(idx + 1); + double nearestSceneChange = nextSceneChanges.Aggregate((x, y) => Math.Abs(x - p.EndTime.TotalSeconds) < Math.Abs(y - p.EndTime.TotalSeconds) ? x : y); + double nearestStartTimeWithGap = next != null ? next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines : Double.MaxValue; + + if (!historyAdded) + { + MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustExtendToNextSceneChange)); + historyAdded = true; + } + + if (!withGap) + { + p.EndTime.TotalMilliseconds = Math.Min(nearestSceneChange * 1000, nearestStartTimeWithGap); + } + else + { + p.EndTime.TotalMilliseconds = Math.Min(nearestSceneChange * 1000 - Configuration.Settings.General.MinimumMillisecondsBetweenLines, nearestStartTimeWithGap); + } + + if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) + { + var original = Utilities.GetOriginalParagraph(idx, p, _subtitleAlternate.Paragraphs); + if (original != null) + { + var originalNext = _subtitleAlternate.GetParagraphOrDefault(_subtitleAlternate.GetIndex(original) + 1); + double nearestOriginalStartTimeWithGap = originalNext != null ? originalNext.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines : Double.MaxValue; + + if (!historyAdded) + { + MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustExtendToNextSceneChange)); + historyAdded = true; + } + + if (!withGap) + { + original.EndTime.TotalMilliseconds = Math.Min(nearestSceneChange * 1000, nearestOriginalStartTimeWithGap); + + } + else + { + original.EndTime.TotalMilliseconds = Math.Min(nearestSceneChange * 1000 - Configuration.Settings.General.MinimumMillisecondsBetweenLines, nearestStartTimeWithGap); + } + } + } + } + + RefreshSelectedParagraphs(); + } + } + + private void ExtendSelectedLinesToPreviousSceneChange(bool withGap = false) + { + var historyAdded = false; + foreach (ListViewItem selectedItem in SubtitleListview1.SelectedItems) + { + var idx = selectedItem.Index; + var p = _subtitle.Paragraphs[idx]; + List previousSceneChanges = audioVisualizer.SceneChanges.Count > 0 ? audioVisualizer.SceneChanges.Where(x => x < p.StartTime.TotalSeconds - 0.01).ToList() : new List(); + if (previousSceneChanges.Count > 0) + { + var previous = _subtitle.GetParagraphOrDefault(idx - 1); + double nearestSceneChange = previousSceneChanges.Aggregate((x, y) => Math.Abs(x - p.StartTime.TotalSeconds) < Math.Abs(y - p.StartTime.TotalSeconds) ? x : y); + double nearestEndTimeWithGap = previous != null ? previous.EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines : -9999; + + if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) + { + var original = Utilities.GetOriginalParagraph(idx, p, _subtitleAlternate.Paragraphs); + if (original != null) + { + var originalPrevious = _subtitleAlternate.GetParagraphOrDefault(_subtitleAlternate.GetIndex(original) - 1); + double nearestOriginalEndTimeWithGap = originalPrevious != null ? originalPrevious.EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines : -9999; + + if (!historyAdded) + { + MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustExtendToPreviousSceneChange)); + historyAdded = true; + } + + if (!withGap) + { + original.StartTime.TotalMilliseconds = Math.Max(nearestSceneChange * 1000, nearestOriginalEndTimeWithGap); + } + else + { + original.StartTime.TotalMilliseconds = Math.Max(nearestSceneChange * 1000 + Configuration.Settings.General.MinimumMillisecondsBetweenLines, nearestOriginalEndTimeWithGap); + } + } + } + + if (!historyAdded) + { + MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.AdjustExtendToPreviousSceneChange)); + historyAdded = true; + } + + if (!withGap) + { + p.StartTime.TotalMilliseconds = Math.Max(nearestSceneChange * 1000, nearestEndTimeWithGap); + } + else + { + p.StartTime.TotalMilliseconds = Math.Max(nearestSceneChange * 1000 + Configuration.Settings.General.MinimumMillisecondsBetweenLines, nearestEndTimeWithGap); + } + } + + RefreshSelectedParagraphs(); + } + } + + private void GoToPreviousSubtitle(double currentPosition) + { + var found = false; + foreach (var p in _subtitle.Paragraphs) + { + if (p.StartTime.TotalMilliseconds > currentPosition - 1) + { + var prev = _subtitle.GetParagraphOrDefault(_subtitle.Paragraphs.IndexOf(p) - 1); + if (prev == null) + { + break; + } + + mediaPlayer.CurrentPosition = prev.StartTime.TotalSeconds; + SubtitleListview1.SelectIndexAndEnsureVisible(_subtitle.Paragraphs.IndexOf(prev), true); + if (audioVisualizer.WavePeaks != null && p.StartTime.TotalSeconds > audioVisualizer.EndPositionSeconds + 0.2) + { + audioVisualizer.StartPositionSeconds = mediaPlayer.CurrentPosition - 0.2; + } + found = true; + break; + } + } + if (!found && _subtitle.Paragraphs.Count > 0 && _subtitle.Paragraphs[_subtitle.Paragraphs.Count - 1].StartTime.TotalMilliseconds < currentPosition) + { + var p = _subtitle.Paragraphs[_subtitle.Paragraphs.Count - 1]; + mediaPlayer.CurrentPosition = p.StartTime.TotalSeconds; + SubtitleListview1.SelectIndexAndEnsureVisible(_subtitle.Paragraphs.Count - 1, true); + if (audioVisualizer.WavePeaks != null && p.StartTime.TotalSeconds > audioVisualizer.EndPositionSeconds + 0.2) + { + audioVisualizer.StartPositionSeconds = mediaPlayer.CurrentPosition - 0.2; + } + } + } + + private void GoToNextSubtitle(double currentPosition) + { + foreach (var p in _subtitle.Paragraphs) + { + if (p.StartTime.TotalMilliseconds > currentPosition) + { + mediaPlayer.CurrentPosition = p.StartTime.TotalSeconds; + SubtitleListview1.SelectIndexAndEnsureVisible(_subtitle.Paragraphs.IndexOf(p), true); + if (audioVisualizer.WavePeaks != null && p.StartTime.TotalSeconds > audioVisualizer.EndPositionSeconds + 0.2) + { + audioVisualizer.StartPositionSeconds = mediaPlayer.CurrentPosition - 0.2; + } + + break; + } + } + } + + private void AutoGuessStartTime(int index) + { + var p = _subtitle.GetParagraphOrDefault(index); + if (p == null) + { + return; + } + + var silenceLengthInSeconds = 0.08; + var lowPercent = audioVisualizer.FindLowPercentage(p.StartTime.TotalSeconds - 0.3, p.StartTime.TotalSeconds + 0.1); + var highPercent = audioVisualizer.FindHighPercentage(p.StartTime.TotalSeconds - 0.3, p.StartTime.TotalSeconds + 0.4); + var add = 5.0; + if (highPercent > 40) + { + add = 8; + } + else if (highPercent < 5) + { + add = highPercent - lowPercent - 0.3; + } + for (var startVolume = lowPercent + add; startVolume < 14; startVolume += 0.3) + { + var pos = audioVisualizer.FindDataBelowThresholdBackForStart(startVolume, silenceLengthInSeconds, p.StartTime.TotalSeconds); + var pos2 = audioVisualizer.FindDataBelowThresholdBackForStart(startVolume + 0.3, silenceLengthInSeconds, p.StartTime.TotalSeconds); + if (pos >= 0 && pos > p.StartTime.TotalSeconds - 1) + { + if (pos2 > pos && pos2 >= 0 && pos2 > p.StartTime.TotalSeconds - 1) + { + pos = pos2; + } + + var newStartTimeMs = pos * TimeCode.BaseUnit; + var prev = _subtitle.GetParagraphOrDefault(index - 1); + if (prev != null && prev.EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines >= newStartTimeMs) + { + newStartTimeMs = prev.EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines; + if (newStartTimeMs >= p.StartTime.TotalMilliseconds) + { + break; // cannot move start time + } + } + + // check for scene changes + if (audioVisualizer.SceneChanges != null) + { + var matchingSceneChanges = audioVisualizer.SceneChanges + .Where(sc => sc > p.StartTime.TotalSeconds - 0.3 && sc < p.StartTime.TotalSeconds + 0.2) + .OrderBy(sc => Math.Abs(sc - p.StartTime.TotalSeconds)); + if (matchingSceneChanges.Count() > 0) + { + newStartTimeMs = matchingSceneChanges.First() * TimeCode.BaseUnit; + } + } + + if (Math.Abs(p.StartTime.TotalMilliseconds - newStartTimeMs) < 10) + { + break; // diff too small + } + + var newEndTimeMs = p.EndTime.TotalMilliseconds; + if (newStartTimeMs > p.StartTime.TotalMilliseconds) + { + var temp = new Paragraph(p); + temp.StartTime.TotalMilliseconds = newStartTimeMs; + if (temp.Duration.TotalMilliseconds < Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds || + Utilities.GetCharactersPerSecond(temp) > Configuration.Settings.General.SubtitleMaximumCharactersPerSeconds) + { + var next = _subtitle.GetParagraphOrDefault(index + 1); + if (next == null || + next.StartTime.TotalMilliseconds > newStartTimeMs + p.Duration.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines) + { + newEndTimeMs = newStartTimeMs + p.Duration.TotalMilliseconds; + } + } + } + + MakeHistoryForUndo(string.Format(Configuration.Settings.Language.Main.BeforeX, Configuration.Settings.Language.Settings.WaveformGuessStart)); + + if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) + { + var original = Utilities.GetOriginalParagraph(index, p, _subtitleAlternate.Paragraphs); + if (original != null) + { + original.StartTime.TotalMilliseconds = newStartTimeMs; + original.EndTime.TotalMilliseconds = newEndTimeMs; + } + } + + p.StartTime.TotalMilliseconds = newStartTimeMs; + p.EndTime.TotalMilliseconds = newEndTimeMs; + RefreshSelectedParagraph(); + SubtitleListview1.SetStartTimeAndDuration(index, p, _subtitle.GetParagraphOrDefault(index + 1), _subtitle.GetParagraphOrDefault(index - 1)); + break; + } + } + } + + private void GoToBookmark() + { + using (var form = new BookmarksGoTo(_subtitle)) + { + if (form.ShowDialog(this) == DialogResult.OK) + { + SubtitleListview1.SelectIndexAndEnsureVisible(form.BookmarkIndex, true); + if (mediaPlayer.VideoPlayer != null) + { + mediaPlayer.VideoPlayer.CurrentPosition = _subtitle.Paragraphs[form.BookmarkIndex].StartTime.TotalSeconds; + } + } + } + } + + private void GoToPrevoiusBookmark() + { + int idx = FirstSelectedIndex - 1; + try + { + for (int i = idx; i >= 0; i--) + { + var p = _subtitle.Paragraphs[i]; + if (p.Bookmark != null) + { + SubtitleListview1.SelectIndexAndEnsureVisible(i, true); + if (mediaPlayer.VideoPlayer != null) + { + mediaPlayer.VideoPlayer.CurrentPosition = _subtitle.Paragraphs[i].StartTime.TotalSeconds; + } + + return; + } + } + } + catch + { + } + } + + private void GoToNextBookmark() + { + int idx = FirstSelectedIndex + 1; + try + { + for (int i = idx; i < _subtitle.Paragraphs.Count; i++) + { + var p = _subtitle.Paragraphs[i]; + if (p.Bookmark != null) + { + SubtitleListview1.SelectIndexAndEnsureVisible(i, true); + if (mediaPlayer.VideoPlayer != null) + { + mediaPlayer.VideoPlayer.CurrentPosition = _subtitle.Paragraphs[i].StartTime.TotalSeconds; + } + + return; + } + } + } + catch + { + } + } + + private void ToggleBookmarks(bool setText) + { + bool first = true; + string newValue = null; + if (setText) + { + MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.ToggleBookmarksWithComment)); + } + else + { + MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.ToggleBookmarks)); + } + + foreach (int index in SubtitleListview1.SelectedIndices) + { + var p = _subtitle.Paragraphs[index]; + if (first) + { + if (p.Bookmark == null) + { + if (setText) + { + using (var form = new BookmarkAdd(p)) + { + var result = form.ShowDialog(this); + if (result != DialogResult.OK) + { + return; + } + + newValue = form.Comment; + } + } + else + { + newValue = string.Empty; + } + } + else + { + newValue = null; + } + + first = false; + } + + p.Bookmark = newValue; + SubtitleListview1.ShowState(index, p); + ShowHideBookmark(p); + } + + SetListViewStateImages(); + new BookmarkPersistence(_subtitle, _fileName).Save(); + } + + private void SetListViewStateImages() + { + var oldStaeImageList = SubtitleListview1.StateImageList; + SubtitleListview1.StateImageList = _subtitle != null && _subtitle.Paragraphs.Any(p => p.Bookmark != null) ? imageListBookmarks : null; + if (SubtitleListview1.StateImageList == null) + { + SubtitleListview1.Columns[SubtitleListview1.ColumnIndexNumber].Text = Configuration.Settings.Language.General.NumberSymbol; + } + else + { + SubtitleListview1.Columns[SubtitleListview1.ColumnIndexNumber].Text = " " + Configuration.Settings.Language.General.NumberSymbol; + } + + if (oldStaeImageList == SubtitleListview1.StateImageList) + { + return; + } + + if (!_loading) + { + if (SubtitleListview1.StateImageList == null) + { + SubtitleListview1.Columns[SubtitleListview1.ColumnIndexNumber].Width = Configuration.Settings.General.ListViewNumberWidth - 18; + } + else + { + SubtitleListview1.Columns[SubtitleListview1.ColumnIndexNumber].Width = Configuration.Settings.General.ListViewNumberWidth + 18; + } + } + + SubtitleListview1.SubtitleListViewLastColumnFill(null, null); + } + + private void ClearBookmarks() + { + MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.ClearBookmarks)); + for (var index = 0; index < _subtitle.Paragraphs.Count; index++) + { + var paragraph = _subtitle.Paragraphs[index]; + if (paragraph.Bookmark != null) + { + paragraph.Bookmark = null; + SubtitleListview1.ShowState(index, paragraph); + } + } + + var p = _subtitle.GetParagraphOrDefault(_subtitleListViewIndex); + if (p != null) + { + ShowHideBookmark(p); + } + + SetListViewStateImages(); + new BookmarkPersistence(_subtitle, _fileName).Save(); + } + + private void MoveWordUpDownInCurrent(bool down, SETextBox tb) + { + int firstIndex = FirstSelectedIndex; + if (firstIndex < 0) + { + return; + } + + var p = _subtitle.GetParagraphOrDefault(firstIndex); + if (tb == textBoxListViewTextAlternate) + { + p = Utilities.GetOriginalParagraph(firstIndex, p, _subtitleAlternate.Paragraphs); + } + + if (p == null) + { + return; + } + + var lines = p.Text.SplitToLines(); + if (lines.Count == 1) + { + lines.Add(string.Empty); + } + + if (lines.Count != 2) + { + return; + } + + var line1Words = lines[0].Split(' ').ToList(); + var line2Words = lines[1].Split(' ').ToList(); + if (down) + { + if (line1Words.Count > 0) + { + line2Words.Insert(0, line1Words[line1Words.Count - 1]); + line1Words.RemoveAt(line1Words.Count - 1); + } + } + else // up + { + if (line2Words.Count > 0) + { + line1Words.Add(line2Words[0]); + line2Words.RemoveAt(0); + } + } + + var newText = (string.Join(" ", line1Words.ToArray()).Trim() + Environment.NewLine + + string.Join(" ", line2Words.ToArray()).Trim()).Trim(); + if (newText != p.Text) + { + var oldText = p.Text; + MakeHistoryForUndo(_language.BeforeLineUpdatedInListView); + var textCaretPos = textBoxListViewText.SelectionStart; + p.Text = newText; + if (tb == textBoxListViewTextAlternate) + { + SubtitleListview1.SetAlternateText(firstIndex, p.Text); + } + else + { + SubtitleListview1.SetText(firstIndex, p.Text); + } + tb.Text = p.Text; + + // keep cursor position + KeepCursorMoveWordUpdown(down, newText, oldText, textCaretPos); + } + } + + private void KeepCursorMoveWordUpdown(bool down, string newText, string oldText, int textCaretPos) + { + if (textCaretPos > textBoxListViewText.Text.Length) + { + // set cursor at end of textbox + textBoxListViewText.SelectionStart = textCaretPos; + int end = textBoxListViewText.Text.Length; + textBoxListViewText.SelectionStart = end; + textBoxListViewText.SelectionLength = 0; + return; + } + + int indexOfNewLine = newText.IndexOf(Environment.NewLine, StringComparison.Ordinal); + int oldIndexOfNewLine = oldText.IndexOf(Environment.NewLine, StringComparison.Ordinal); + + if (down) + { + if (indexOfNewLine == -1 && oldIndexOfNewLine > 0 && textCaretPos > oldIndexOfNewLine) + { + textCaretPos--; + } + else if (textCaretPos > indexOfNewLine && textCaretPos > oldIndexOfNewLine && oldIndexOfNewLine >= 0 || + textCaretPos < indexOfNewLine && (oldIndexOfNewLine == -1 || textCaretPos < oldIndexOfNewLine) || + textCaretPos < oldIndexOfNewLine && indexOfNewLine == -1) + { + } + else + { + textCaretPos++; + } + } + else // up + { + if (textCaretPos <= oldIndexOfNewLine || textCaretPos > oldIndexOfNewLine && textCaretPos > indexOfNewLine && indexOfNewLine >= 0) + { + } + else + { + textCaretPos--; + } + } + + if (textBoxListViewText.Text.Length > textCaretPos && '\n' == textBoxListViewText.Text[textCaretPos]) + { + textCaretPos--; + } + + if (textCaretPos >= 0) + { + textBoxListViewText.SelectionStart = textCaretPos; + textBoxListViewText.SelectionStart = textCaretPos; + textBoxListViewText.SelectionStart = textCaretPos; + } + } + + private void MoveStartCurrent(int ms, bool keepGapPrevIfClose) + { + var i = _subtitleListViewIndex; + if (i < 0 || i >= _subtitle.Paragraphs.Count || ms == 0) + { + return; + } + + var p = _subtitle.GetParagraphOrDefault(i); + if (p == null) + { + return; + } + + // snap to scene change + if (Configuration.Settings.VideoControls.WaveformSnapToSceneChanges && audioVisualizer?.SceneChanges?.Count > 0) + { + var seconds = (p.StartTime.TotalMilliseconds + ms) / 1000.0; + var closest = audioVisualizer.SceneChanges.OrderBy(sc => Math.Abs(seconds - sc)).First() * 1000.0; + if (Math.Abs(p.StartTime.TotalMilliseconds + ms - closest) < CurrentFrameRate * 0.9) + { + ms = (int)Math.Round(closest - p.StartTime.TotalMilliseconds); + } + } + + var prevGap = 0.0; + var prev = _subtitle.GetParagraphOrDefault(i - 1); + if (keepGapPrevIfClose && prev != null) + { + if (prev.EndTime.TotalMilliseconds <= p.StartTime.TotalMilliseconds && prev.EndTime.TotalMilliseconds + 200 >= p.StartTime.TotalMilliseconds) + { + prevGap = p.StartTime.TotalMilliseconds - prev.EndTime.TotalMilliseconds; + if (ms < 0 && prev.Duration.TotalMilliseconds + ms < Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds) + { + return; + } + } + else + { + prev = null; + } + } + + if (ms > 0) + { + if (p.StartTime.TotalMilliseconds + ms + Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds > p.EndTime.TotalMilliseconds) + { + return; // do not allow duration smaller than min duration in ms + } + + p.StartTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + ms; + } + else + { + if (p.Duration.TotalMilliseconds + Math.Abs(ms) > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) + { + return; + } + + if (p.StartTime.TotalMilliseconds + ms < 0) + { + return; + } + + if (keepGapPrevIfClose || prev == null || p.StartTime.TotalMilliseconds - (Math.Abs(ms) + Configuration.Settings.General.MinimumMillisecondsBetweenLines) > prev.EndTime.TotalMilliseconds) + { + p.StartTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + ms; + } + else + { + var newStartMs = prev.EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines; + if (newStartMs < p.StartTime.TotalMilliseconds) + { + p.StartTime.TotalMilliseconds = newStartMs; + } + } + } + + SubtitleListview1.SetStartTimeAndDuration(i, p, _subtitle.GetParagraphOrDefault(i + 1), _subtitle.GetParagraphOrDefault(i - 1)); + timeUpDownStartTime.MaskedTextBox.TextChanged -= MaskedTextBoxTextChanged; + timeUpDownStartTime.TimeCode = p.StartTime; + timeUpDownStartTime.MaskedTextBox.TextChanged += MaskedTextBoxTextChanged; + SetDurationInSeconds(p.Duration.TotalSeconds); + + if (keepGapPrevIfClose && prev != null) + { + prev.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds - prevGap; + if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) + { + var original = Utilities.GetOriginalParagraph(_subtitle.GetIndex(prev), prev, _subtitleAlternate.Paragraphs); + if (original != null) + { + original.EndTime.TotalMilliseconds = prev.EndTime.TotalMilliseconds; + } + } + SubtitleListview1.SetStartTimeAndDuration(i - 1, prev, p, _subtitle.GetParagraphOrDefault(i - 2)); + } + + if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) + { + var original = Utilities.GetOriginalParagraph(_subtitle.GetIndex(p), p, _subtitleAlternate.Paragraphs); + if (original != null) + { + original.StartTime.TotalMilliseconds = p.StartTime.TotalMilliseconds; + original.EndTime.TotalMilliseconds = p.EndTime.TotalMilliseconds; + } + } + + SubtitleListview1.SyntaxColorLine(_subtitle.Paragraphs, i, p); + } + + private void MoveEndCurrent(int ms, bool keepGapNextIfClose) + { + var i = _subtitleListViewIndex; + if (i < 0 || i >= _subtitle.Paragraphs.Count || ms == 0) + { + return; + } + + var p = _subtitle.GetParagraphOrDefault(i); + if (p == null) + { + return; + } + + // snap to scene change + if (Configuration.Settings.VideoControls.WaveformSnapToSceneChanges && audioVisualizer?.SceneChanges?.Count > 0) + { + var seconds = (p.EndTime.TotalMilliseconds + ms) / 1000.0; + var closest = audioVisualizer.SceneChanges.OrderBy(sc => Math.Abs(seconds - sc)).First() * 1000.0; + if (Math.Abs(p.EndTime.TotalMilliseconds + ms - closest) < CurrentFrameRate * 0.9) + { + ms = (int)Math.Round(closest - p.EndTime.TotalMilliseconds); + } + } + + var nextGap = 0.0; + var next = _subtitle.GetParagraphOrDefault(i + 1); + if (keepGapNextIfClose && next != null) + { + if (next.StartTime.TotalMilliseconds >= p.EndTime.TotalMilliseconds && next.StartTime.TotalMilliseconds - 200 < p.EndTime.TotalMilliseconds) + { + nextGap = next.StartTime.TotalMilliseconds - p.EndTime.TotalMilliseconds; + if (ms > 0 && next.Duration.TotalMilliseconds + ms < Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds) + { + return; + } + } + else + { + next = null; + } + } + + if (ms > 0) + { + if (p.Duration.TotalMilliseconds + ms > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) + { + return; + } + + if (keepGapNextIfClose || next == null || p.EndTime.TotalMilliseconds + ms + Configuration.Settings.General.MinimumMillisecondsBetweenLines < next.StartTime.TotalMilliseconds) + { + p.EndTime.TotalMilliseconds = p.EndTime.TotalMilliseconds + ms; + } + else + { + var newEndMs = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; + if (newEndMs > p.EndTime.TotalMilliseconds) + { + p.EndTime.TotalMilliseconds = newEndMs; + } + } + } + else + { + if (p.EndTime.TotalMilliseconds + ms - Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds < p.StartTime.TotalMilliseconds) + { + return; // do not allow duration smaller than min duration in ms + } + + p.EndTime.TotalMilliseconds = p.EndTime.TotalMilliseconds + ms; + } + + SubtitleListview1.SetStartTimeAndDuration(i, p, _subtitle.GetParagraphOrDefault(i + 1), _subtitle.GetParagraphOrDefault(i - 1)); + timeUpDownStartTime.MaskedTextBox.TextChanged -= MaskedTextBoxTextChanged; + timeUpDownStartTime.TimeCode = p.StartTime; + timeUpDownStartTime.MaskedTextBox.TextChanged += MaskedTextBoxTextChanged; + SetDurationInSeconds(p.Duration.TotalSeconds); + + if (keepGapNextIfClose && next != null) + { + next.StartTime.TotalMilliseconds = p.EndTime.TotalMilliseconds + nextGap; + if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) + { + var original = Utilities.GetOriginalParagraph(_subtitle.GetIndex(next), next, _subtitleAlternate.Paragraphs); + if (original != null) + { + original.StartTime.TotalMilliseconds = next.StartTime.TotalMilliseconds; + } + } + SubtitleListview1.SetStartTimeAndDuration(i + 1, next, _subtitle.GetParagraphOrDefault(i + 2), p); + } + + if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) + { + var original = Utilities.GetOriginalParagraph(_subtitle.GetIndex(p), p, _subtitleAlternate.Paragraphs); + if (original != null) + { + original.StartTime.TotalMilliseconds = p.StartTime.TotalMilliseconds; + original.EndTime.TotalMilliseconds = p.EndTime.TotalMilliseconds; + } + } + + SubtitleListview1.SyntaxColorLine(_subtitle.Paragraphs, i, p); + } + + private void ShowNextSubtitleLabel() + { + if (audioVisualizer.Visible && audioVisualizer.WavePeaks != null && audioVisualizer.Width > 300 && _subtitleListViewIndex >= 0) + { + var next = _subtitle.GetParagraphOrDefault(_subtitleListViewIndex + 1); + if (next != null && !string.IsNullOrEmpty(next.Text)) + { + labelNextWord.Top = audioVisualizer.Top; + labelNextWord.Text = string.Format(_language.NextX, HtmlUtil.RemoveHtmlTags(next.Text, true).Replace(Environment.NewLine, " ")); + labelNextWord.Left = audioVisualizer.Width / 2 - labelNextWord.Width / 2 + audioVisualizer.Left; + labelNextWord.Visible = true; + _labelNextTicks = DateTime.UtcNow.Ticks; + } + else + { + labelNextWord.Visible = false; + } + } + else + { + labelNextWord.Visible = false; + } + } + + private void MergeSelectedLinesOnlyFirstText() + { + if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 1) + { + var deleteIndices = new List(); + bool first = true; + int firstIndex = 0; + int next = 0; + string text = string.Empty; + double endTime = 0; + foreach (int index in SubtitleListview1.SelectedIndices) + { + if (first) + { + firstIndex = index; + next = index + 1; + } + else + { + deleteIndices.Add(index); + if (next != index) + { + return; + } + + next++; + } + + first = false; + if (string.IsNullOrEmpty(text)) + { + text = _subtitle.Paragraphs[index].Text.Trim(); + } + + endTime = _subtitle.Paragraphs[index].EndTime.TotalMilliseconds; + } + + SubtitleListview1.SelectedIndexChanged -= SubtitleListview1_SelectedIndexChanged; + MakeHistoryForUndo(_language.BeforeMergeLines); + + var currentParagraph = _subtitle.Paragraphs[firstIndex]; + currentParagraph.Text = text; + currentParagraph.EndTime.TotalMilliseconds = endTime; + + var nextParagraph = _subtitle.GetParagraphOrDefault(next); + if (nextParagraph != null && currentParagraph.EndTime.TotalMilliseconds > nextParagraph.StartTime.TotalMilliseconds && currentParagraph.StartTime.TotalMilliseconds < nextParagraph.StartTime.TotalMilliseconds) + { + currentParagraph.EndTime.TotalMilliseconds = nextParagraph.StartTime.TotalMilliseconds - 1; + } + + // original subtitle + if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) + { + var original = Utilities.GetOriginalParagraph(firstIndex, currentParagraph, _subtitleAlternate.Paragraphs); + if (original != null) + { + string originalText = string.Empty; + for (int i = 0; i < deleteIndices.Count; i++) + { + var originalNext = Utilities.GetOriginalParagraph(deleteIndices[i], _subtitle.Paragraphs[deleteIndices[i]], _subtitleAlternate.Paragraphs); + if (originalNext != null && string.IsNullOrEmpty(originalText)) + { + originalText = originalNext.Text; + } + } + + for (int i = deleteIndices.Count - 1; i >= 0; i--) + { + var originalNext = Utilities.GetOriginalParagraph(deleteIndices[i], _subtitle.Paragraphs[deleteIndices[i]], _subtitleAlternate.Paragraphs); + if (originalNext != null) + { + _subtitleAlternate.Paragraphs.Remove(originalNext); + } + } + + original.Text = originalText; + original.EndTime.TotalMilliseconds = currentParagraph.EndTime.TotalMilliseconds; + _subtitleAlternate.Renumber(); + } + } + + if (_networkSession != null) + { + _networkSession.TimerStop(); + _networkSession.UpdateLine(firstIndex, currentParagraph); + NetworkGetSendUpdates(deleteIndices, 0, null); + } + else + { + for (int i = deleteIndices.Count - 1; i >= 0; i--) + { + _subtitle.Paragraphs.RemoveAt(deleteIndices[i]); + } + + _subtitle.Renumber(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + } + + ShowSource(); + ShowStatus(_language.LinesMerged); + SubtitleListview1.SelectIndexAndEnsureVisible(firstIndex, true); + SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; + RefreshSelectedParagraph(); + } + } + + private void GoToFirstEmptyLine() + { + var index = FirstSelectedIndex + 1; + for (; index < _subtitle.Paragraphs.Count; index++) + { + if (string.IsNullOrWhiteSpace(_subtitle.Paragraphs[index].Text)) + { + SubtitleListview1.SelectIndexAndEnsureVisible(index, true); + if (mediaPlayer.VideoPlayer != null) + { + mediaPlayer.VideoPlayer.CurrentPosition = _subtitle.Paragraphs[index].StartTime.TotalSeconds; + } + + return; + } + } + } + + private void PlayFirstSelectedSubtitle() + { + if (_subtitleListViewIndex >= 0 && mediaPlayer.VideoPlayer != null) + { + GotoSubtitleIndex(_subtitleListViewIndex); + var paragraph = _subtitle.Paragraphs[_subtitleListViewIndex]; + double startSeconds = paragraph.StartTime.TotalSeconds; + _endSeconds = paragraph.EndTime.TotalSeconds; + mediaPlayer.CurrentPosition = startSeconds; + ShowSubtitle(); + mediaPlayer.Play(); + } + } + + private void SetEndAndOffsetTheRest(bool goToNext) + { + if (SubtitleListview1.SelectedItems.Count == 1) + { + bool oldSync = checkBoxSyncListViewWithVideoWhilePlaying.Checked; + checkBoxSyncListViewWithVideoWhilePlaying.Checked = false; + + int index = SubtitleListview1.SelectedItems[0].Index; + double videoPosition = mediaPlayer.CurrentPosition; + if (!mediaPlayer.IsPaused) + { + videoPosition -= Configuration.Settings.General.SetStartEndHumanDelay / TimeCode.BaseUnit; + } + + var tc = TimeCode.FromSeconds(videoPosition); + + double offset = tc.TotalMilliseconds - _subtitle.Paragraphs[index].EndTime.TotalMilliseconds; + if (_subtitle.Paragraphs[index].StartTime.TotalMilliseconds + 100 > tc.TotalMilliseconds || offset > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) + { + return; + } + + MakeHistoryForUndo(_language.BeforeSetEndTimeAndOffsetTheRest + @" " + _subtitle.Paragraphs[index].Number + @" - " + tc); + + numericUpDownDuration.ValueChanged -= NumericUpDownDurationValueChanged; + _subtitle.Paragraphs[index].EndTime.TotalSeconds = videoPosition; + SubtitleListview1.SetDuration(index, _subtitle.Paragraphs[index], _subtitle.GetParagraphOrDefault(index + 1)); + checkBoxSyncListViewWithVideoWhilePlaying.Checked = oldSync; + numericUpDownDuration.Value = (decimal)_subtitle.Paragraphs[index].Duration.TotalSeconds; + numericUpDownDuration.ValueChanged += NumericUpDownDurationValueChanged; + RefreshSelectedParagraph(); + + for (int i = index + 1; i < SubtitleListview1.Items.Count; i++) + { + if (!_subtitle.Paragraphs[i].StartTime.IsMaxTime) + { + _subtitle.Paragraphs[i].StartTime = new TimeCode(_subtitle.Paragraphs[i].StartTime.TotalMilliseconds + offset); + _subtitle.Paragraphs[i].EndTime = new TimeCode(_subtitle.Paragraphs[i].EndTime.TotalMilliseconds + offset); + SubtitleListview1.SetDuration(i, _subtitle.Paragraphs[i], _subtitle.GetParagraphOrDefault(i + 1)); + } + } + + if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) + { + var original = Utilities.GetOriginalParagraph(index, _subtitle.Paragraphs[index], _subtitleAlternate.Paragraphs); + if (original != null) + { + index = _subtitleAlternate.GetIndex(original); + for (int i = index; i < _subtitleAlternate.Paragraphs.Count; i++) + { + if (!_subtitleAlternate.Paragraphs[i].StartTime.IsMaxTime) + { + _subtitleAlternate.Paragraphs[i].StartTime = new TimeCode(_subtitleAlternate.Paragraphs[i].StartTime.TotalMilliseconds + offset); + _subtitleAlternate.Paragraphs[i].EndTime = new TimeCode(_subtitleAlternate.Paragraphs[i].EndTime.TotalMilliseconds + offset); + } + } + } + } + + checkBoxSyncListViewWithVideoWhilePlaying.Checked = oldSync; + + if (goToNext) + { + _subtitleListViewIndex = -1; + SubtitleListview1.SelectIndexAndEnsureVisible(index + 1, true); + if (mediaPlayer.IsPaused && index + 1 < _subtitle.Paragraphs.Count) + { + mediaPlayer.CurrentPosition = _subtitle.Paragraphs[index + 1].StartTime.TotalSeconds; + } + } + } + } + + private void MoveVideoSeconds(double seconds) + { + var oldPosition = mediaPlayer.CurrentPosition; + var newPosition = oldPosition + seconds; + if (newPosition < 0) + { + newPosition = 0; + } + + if (mediaPlayer.IsPaused && Configuration.Settings.General.MoveVideo100Or500MsPlaySmallSample) + { + mediaPlayer.CurrentPosition = newPosition; + mediaPlayer.Play(); + System.Threading.Thread.Sleep(99); + mediaPlayer.Stop(); + } + + mediaPlayer.CurrentPosition = newPosition; + } + + private void RunCustomSearch(string url) + { + if (!string.IsNullOrEmpty(url)) + { + RunTranslateSearch((text) => + { + url = string.Format(url, Utilities.UrlEncode(text)); + UiUtil.OpenURL(url); + }); + } + } + + private void GoFullscreen(bool force) + { + if (mediaPlayer.VideoPlayer == null && !force) + { + return; + } + + mediaPlayer.ShowFullScreenControls(); + bool setRedockOnFullscreenEnd = false; + + if (_videoPlayerUndocked == null || _videoPlayerUndocked.IsDisposed) + { + UndockVideoControlsToolStripMenuItemClick(null, null); + setRedockOnFullscreenEnd = true; + } + + if (_videoPlayerUndocked != null && !_videoPlayerUndocked.IsDisposed) + { + _videoPlayerUndocked.Focus(); + _videoPlayerUndocked.GoFullscreen(); + if (setRedockOnFullscreenEnd) + { + _videoPlayerUndocked.RedockOnFullscreenEnd = true; + } + } + } + + private void RefreshTimeCodeMode() + { + if (Configuration.Settings.General.UseTimeFormatHHMMSSFF) + { + numericUpDownDuration.DecimalPlaces = 2; + numericUpDownDuration.Increment = (decimal)(0.01); + + toolStripSeparatorFrameRate.Visible = true; + toolStripLabelFrameRate.Visible = true; + toolStripComboBoxFrameRate.Visible = true; + toolStripButtonGetFrameRate.Visible = true; + } + else + { + numericUpDownDuration.DecimalPlaces = 3; + numericUpDownDuration.Increment = (decimal)(0.1); + + toolStripSeparatorFrameRate.Visible = Configuration.Settings.General.ShowFrameRate; + toolStripLabelFrameRate.Visible = Configuration.Settings.General.ShowFrameRate; + toolStripComboBoxFrameRate.Visible = Configuration.Settings.General.ShowFrameRate; + toolStripButtonGetFrameRate.Visible = Configuration.Settings.General.ShowFrameRate; + } + + SaveSubtitleListviewIndices(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + RefreshSelectedParagraph(); + } + + private void ReverseStartAndEndingForRtl() + { + MakeHistoryForUndo(toolStripMenuItemReverseRightToLeftStartEnd.Text); + int selectedIndex = FirstSelectedIndex; + foreach (int index in SubtitleListview1.SelectedIndices) + { + var p = _subtitle.Paragraphs[index]; + p.Text = Utilities.ReverseStartAndEndingForRightToLeft(p.Text); + SubtitleListview1.SetText(index, p.Text); + if (index == selectedIndex) + { + textBoxListViewText.Text = p.Text; + } + } + } + + private void MergeDialogs() + { + if (SubtitleListview1.SelectedItems.Count == 1 || SubtitleListview1.SelectedItems.Count == 2 && SubtitleListview1.SelectedIndices[0] + 1 == SubtitleListview1.SelectedIndices[1]) + { + MergeWithLineAfter(true); + } + } + + private void ToggleDashes() + { + var index = FirstSelectedIndex; + if (index >= 0) + { + var hasStartDash = false; + var p = _subtitle.Paragraphs[index]; + var lines = p.Text.SplitToLines(); + foreach (var line in lines) + { + var trimmed = HtmlUtil.RemoveHtmlTags(line, true).TrimStart(); + if (trimmed.StartsWith('-')) + { + hasStartDash = true; + break; + } + } + + if (!hasStartDash && _subtitleAlternate != null && textBoxListViewTextAlternate.Visible) + { + var original = Utilities.GetOriginalParagraph(index, p, _subtitleAlternate.Paragraphs); + if (original != null) + { + lines = original.Text.SplitToLines(); + foreach (var line in lines) + { + var trimmed = HtmlUtil.RemoveHtmlTags(line, true).TrimStart(); + if (trimmed.StartsWith('-')) + { + hasStartDash = true; + break; + } + } + } + } + + MakeHistoryForUndo(_language.BeforeToggleDialogDashes); + if (hasStartDash) + { + RemoveDashes(); + } + else + { + AddDashes(); + } + } + } + + private void ToggleDashesTextBox(SETextBox tb) + { + var hasStartDash = false; + var lines = tb.Text.TrimEnd().SplitToLines(); + foreach (var line in lines) + { + var trimmed = HtmlUtil.RemoveHtmlTags(line, true).TrimStart(); + if (trimmed.StartsWith('-')) + { + hasStartDash = true; + break; + } + } + + MakeHistoryForUndo(_language.BeforeToggleDialogDashes); + var sb = new StringBuilder(); + if (hasStartDash) + { + // remove dashes + foreach (var line in lines) + { + var pre = string.Empty; + var s = SplitStartTags(line, ref pre); + sb.AppendLine(pre + s.TrimStart('-').TrimStart()); + } + + tb.Text = sb.ToString().Trim(); + } + else + { + // add dashes + if (CouldBeDialog(lines)) + { + foreach (var line in lines) + { + var pre = string.Empty; + var s = SplitStartTags(line, ref pre); + sb.AppendLine(pre + "- " + s); + } + } + else + { + sb.Append(tb.Text); + } + + var text = sb.ToString().Trim(); + var dialogHelper = new DialogSplitMerge { DialogStyle = Configuration.Settings.General.DialogStyle, SkipLineEndingCheck = true }; + text = dialogHelper.FixDashesAndSpaces(text); + tb.Text = text; + } + } + + private void AddDashes() + { + var dialogHelper = new DialogSplitMerge { DialogStyle = Configuration.Settings.General.DialogStyle, SkipLineEndingCheck = true }; + foreach (int index in SubtitleListview1.SelectedIndices) + { + var p = _subtitle.Paragraphs[index]; + var lines = p.Text.SplitToLines(); + var sb = new StringBuilder(); + if (CouldBeDialog(lines)) + { + foreach (var line in lines) + { + var pre = string.Empty; + var s = SplitStartTags(line, ref pre); + sb.AppendLine(pre + "- " + s); + } + } + else + { + sb.Append(p.Text); + } + + var text = sb.ToString().Trim(); + text = dialogHelper.FixDashesAndSpaces(text); + _subtitle.Paragraphs[index].Text = text; + SubtitleListview1.SetText(index, text); + if (index == _subtitleListViewIndex) + { + textBoxListViewText.Text = text; + } + + if (_subtitleAlternate != null && textBoxListViewTextAlternate.Visible) + { + var original = Utilities.GetOriginalParagraph(index, p, _subtitleAlternate.Paragraphs); + if (original != null) + { + lines = original.Text.SplitToLines(); + sb = new StringBuilder(); + if (CouldBeDialog(lines)) + { + foreach (var line in lines) + { + var pre = string.Empty; + var s = SplitStartTags(line, ref pre); + if (!line.StartsWith("-")) + { + sb.AppendLine(pre + "- " + s); + } + else + { + sb.AppendLine(pre + s); + } + } + } + else + { + sb.Append(original.Text); + } + + text = sb.ToString().Trim(); + text = dialogHelper.FixDashesAndSpaces(text); + _subtitleAlternate.Paragraphs[index].Text = text; + SubtitleListview1.SetAlternateText(index, text); + if (index == _subtitleListViewIndex) + { + textBoxListViewTextAlternate.Text = text; + } + } + } + } + } + + private static bool CouldBeDialog(List lines) + { + return lines.Count >= 2 && lines.Count <= 3; + } + + private void RemoveDashes() + { + foreach (int index in SubtitleListview1.SelectedIndices) + { + var p = _subtitle.Paragraphs[index]; + var lines = p.Text.SplitToLines(); + var sb = new StringBuilder(); + foreach (var line in lines) + { + var pre = string.Empty; + var s = SplitStartTags(line, ref pre); + sb.AppendLine(pre + s.TrimStart('-').TrimStart()); + } + + string text = sb.ToString().Trim(); + _subtitle.Paragraphs[index].Text = text; + SubtitleListview1.SetText(index, text); + if (index == _subtitleListViewIndex) + { + textBoxListViewText.Text = text; + } + + if (_subtitleAlternate != null && textBoxListViewTextAlternate.Visible) + { + var original = Utilities.GetOriginalParagraph(index, p, _subtitleAlternate.Paragraphs); + if (original != null) + { + lines = original.Text.SplitToLines(); + sb = new StringBuilder(); + foreach (var line in lines) + { + var pre = string.Empty; + var s = SplitStartTags(line, ref pre); + sb.AppendLine(pre + s.TrimStart('-').TrimStart()); + } + + text = sb.ToString().Trim(); + _subtitleAlternate.Paragraphs[index].Text = text; + SubtitleListview1.SetAlternateText(index, text); + if (index == _subtitleListViewIndex) + { + textBoxListViewTextAlternate.Text = text; + } + } + } + } + } + + private static string SplitStartTags(string line, ref string pre) + { + var s = line; + if (s.StartsWith("{\\", StringComparison.Ordinal) && s.IndexOf('}') > 0) + { + pre = s.Substring(0, s.IndexOf('}') + 1); + s = s.Remove(0, pre.Length); + } + + bool updated = true; + while (updated) + { + updated = false; + if (s.StartsWith(' ')) + { + pre += ' '; + s = s.Remove(0, 1); + updated = true; + } + else if (s.StartsWith("", StringComparison.OrdinalIgnoreCase) || + s.StartsWith("", StringComparison.OrdinalIgnoreCase) || + s.StartsWith("", StringComparison.OrdinalIgnoreCase)) + { + pre += s.Substring(0, 3); + s = s.Remove(0, 3); + updated = true; + } + else if (s.StartsWith("'); + if (endFont > 0) + { + pre += s.Substring(0, endFont + 1); + s = s.Remove(0, endFont + 1); + updated = true; + } + } + } + + return s; + } + + private void SetTitle() + { + var text = "Untitled"; + string separator = " + "; + if (!string.IsNullOrEmpty(_fileName)) + { + text = _fileName; + } + + if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) + { + text += separator; + if (string.IsNullOrEmpty(_fileName)) + { + text = text + _language.New + " + "; + } + + if (!string.IsNullOrEmpty(_subtitleAlternateFileName)) + { + text += _subtitleAlternateFileName; + } + else + { + text += _language.New; + } + } + + Text = text + " - " + Title; + } + + private void SubtitleListview1KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.C && e.Modifiers == Keys.Control) //Ctrl+c = Copy to clipboard + { + var tmp = new Subtitle(); + foreach (int i in SubtitleListview1.SelectedIndices) + { + var p = _subtitle.GetParagraphOrDefault(i); + if (p != null) + { + tmp.Paragraphs.Add(new Paragraph(p)); + } + } + + if (tmp.Paragraphs.Count > 0) + { + if (Configuration.Settings.General.CurrentVideoOffsetInMs != 0) + { + tmp.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(Configuration.Settings.General.CurrentVideoOffsetInMs)); + } + + Clipboard.SetText(tmp.ToText(new SubRip()).TrimEnd()); + } + + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainListViewCopyText) + { + var sb = new StringBuilder(); + foreach (int i in SubtitleListview1.SelectedIndices) + { + var p = _subtitle.GetParagraphOrDefault(i); + if (p != null) + { + sb.AppendLine(p.Text + Environment.NewLine); + } + } + + if (sb.ToString().TrimEnd().Length > 0) + { + Clipboard.SetText(sb.ToString().TrimEnd()); + } + + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainListViewAutoDuration) + { + MakeAutoDurationSelectedLines(); + } + else if (e.KeyData == _shortcuts.MainListViewAlignmentN1) + { + SetAlignment("{\\an1}", true); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainListViewAlignmentN2) + { + SetAlignment("", true); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainListViewAlignmentN3) + { + SetAlignment("{\\an3}", true); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainListViewAlignmentN4) + { + SetAlignment("{\\an4}", true); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainListViewAlignmentN5) + { + SetAlignment("{\\an5}", true); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainListViewAlignmentN6) + { + SetAlignment("{\\an6}", true); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainListViewAlignmentN7) + { + SetAlignment("{\\an7}", true); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainListViewAlignmentN8) + { + SetAlignment("{\\an8}", true); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainListViewAlignmentN9) + { + SetAlignment("{\\an9}", true); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainListViewFocusWaveform) + { + if (audioVisualizer.CanFocus) + { + audioVisualizer.Focus(); + e.SuppressKeyPress = true; + } + } + else if (e.KeyData == _shortcuts.MainListViewGoToNextError) + { + GoToNextSyntaxError(); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainListViewRemoveTimeCodes) + { + RemoveTimeCodesFromSelectedLines(); + e.SuppressKeyPress = true; + } + else if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control) //Ctrl+V = Paste from clipboard + { + if (Clipboard.ContainsText()) + { + var text = Clipboard.GetText(); + var tmp = new Subtitle(); + var format = new SubRip(); + var list = new List(text.SplitToLines()); + format.LoadSubtitle(tmp, list, null); + if (SubtitleListview1.SelectedItems.Count == 1 && tmp.Paragraphs.Count > 0) + { + MakeHistoryForUndo(_language.BeforeInsertLine); + int firstIndex = FirstSelectedIndex; + var lastParagraph = _subtitle.Paragraphs[firstIndex]; + double addMs = 0; + if (lastParagraph.EndTime.TotalMilliseconds > tmp.Paragraphs[0].StartTime.TotalMilliseconds) + { // add time to pasted subtitles to prevent overlap, but only if necessary + addMs = lastParagraph.EndTime.TotalMilliseconds - tmp.Paragraphs[0].StartTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines; + } + else if (firstIndex <= _subtitle.Paragraphs.Count - 2 && _subtitle.Paragraphs[firstIndex + 1].StartTime.TotalMilliseconds < tmp.Paragraphs[0].StartTime.TotalMilliseconds) + { // inserting between two subtitle... with overlapping codes + addMs = lastParagraph.EndTime.TotalMilliseconds - tmp.Paragraphs[0].StartTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines; + } + + var selectIndices = new List(); + for (int i = 0; i < tmp.Paragraphs.Count; i++) + { + var p = tmp.Paragraphs[i]; + p.StartTime.TotalMilliseconds += addMs; + p.EndTime.TotalMilliseconds += addMs; + _subtitle.Paragraphs.Insert(firstIndex + i + 1, p); + selectIndices.Insert(0, firstIndex + i + 1); + if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle && SubtitleListview1.IsAlternateTextColumnVisible) + { + var original = Utilities.GetOriginalParagraph(firstIndex + i + 1, p, _subtitleAlternate.Paragraphs); + if (original == null) + { + _subtitleAlternate.InsertParagraphInCorrectTimeOrder(new Paragraph(string.Empty, p.StartTime.TotalMilliseconds, p.EndTime.TotalMilliseconds)); + } + } + } + + _subtitle.Renumber(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + SubtitleListview1.BeginUpdate(); + foreach (var selectIndex in selectIndices) + { + SubtitleListview1.Items[selectIndex].Selected = true; + } + + SubtitleListview1.EndUpdate(); + SubtitleListview1.SelectIndexAndEnsureVisible(firstIndex + 1, true); + } + else if (SubtitleListview1.Items.Count == 0 && tmp.Paragraphs.Count > 0) + { // insert into empty subtitle + MakeHistoryForUndo(_language.BeforeInsertLine); + foreach (var p in tmp.Paragraphs) + { + _subtitle.Paragraphs.Add(p); + if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle && SubtitleListview1.IsAlternateTextColumnVisible) + { + var original = Utilities.GetOriginalParagraph(_subtitle.Paragraphs.Count - 1, p, _subtitleAlternate.Paragraphs); + if (original == null) + { + _subtitleAlternate.InsertParagraphInCorrectTimeOrder(new Paragraph(string.Empty, p.StartTime.TotalMilliseconds, p.EndTime.TotalMilliseconds)); + } + } + } + + _subtitle.Renumber(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + } + else if (SubtitleListview1.Items.Count > 1 && tmp.Paragraphs.Count > 0) + { + // multiple lines selected - first delete, then insert + int firstIndex = FirstSelectedIndex; + if (firstIndex >= 0) + { + var idx = firstIndex; + MakeHistoryForUndo(_language.BeforeInsertLine); + _makeHistoryPaused = true; + + DeleteSelectedLines(); + _subtitleListViewIndex = -1; + var selectedIndices = new List(); + foreach (var p in tmp.Paragraphs) + { + _subtitle.Paragraphs.Insert(idx, p); + selectedIndices.Add(idx); + if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle && SubtitleListview1.IsAlternateTextColumnVisible) + { + var original = Utilities.GetOriginalParagraph(idx, p, _subtitleAlternate.Paragraphs); + if (original == null) + { + _subtitleAlternate.InsertParagraphInCorrectTimeOrder(new Paragraph(string.Empty, p.StartTime.TotalMilliseconds, p.EndTime.TotalMilliseconds)); + } + } + + idx++; + } + + _subtitle.Renumber(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + SubtitleListview1.SelectIndexAndEnsureVisible(firstIndex, true); + foreach (var selectedIndex in selectedIndices) + { + SubtitleListview1.Items[selectedIndex].Selected = true; + } + RestartHistory(); + } + } + else if (SubtitleListview1.Items.Count > 0 && list.Count >= 1 && list.Count < 4 && !text.Trim().Contains(Environment.NewLine + Environment.NewLine)) + { + // less than 4 lines of text, just insert into first selected + textBoxListViewText.Text = text.Trim(); + } + else if (list.Count >= 1 && list.Count < 2000) + { + MakeHistoryForUndo(_language.BeforeInsertLine); + _makeHistoryPaused = true; + SubtitleListview1.BeginUpdate(); + foreach (var line in list) + { + if (!string.IsNullOrWhiteSpace(line)) + { + var s = line.Trim().Length > Configuration.Settings.General.SubtitleLineMaximumLength ? Utilities.AutoBreakLine(line) : line.Trim(); + InsertAfter(s); + } + } + SubtitleListview1.EndUpdate(); + RestartHistory(); + } + + if (_subtitleListViewIndex >= 0) + { + UpdateListViewTextInfo(labelTextLineLengths, labelSingleLine, labelSingleLinePixels, labelTextLineTotal, labelCharactersPerSecond, _subtitle.Paragraphs[_subtitleListViewIndex], textBoxListViewText); + } + else + { + SubtitleListview1.SelectIndexAndEnsureVisible(0); + } + } + else if (Clipboard.ContainsFileDropList()) + { + var fileDropList = Clipboard.GetFileDropList(); + if (fileDropList.Count == 1) + { + ShowStatus(Configuration.Settings.Language.General.PleaseWait, false); + OpenSubtitle(fileDropList[0], null); + } + } + + e.SuppressKeyPress = true; + } + else if (e.KeyCode == Keys.X && e.Modifiers == Keys.Control) //Ctrl+X = Cut to clipboard + { + var tmp = new Subtitle(); + foreach (int i in SubtitleListview1.SelectedIndices) + { + var p = _subtitle.GetParagraphOrDefault(i); + if (p != null) + { + tmp.Paragraphs.Add(new Paragraph(p)); + } + } + + e.SuppressKeyPress = true; + _cutText = tmp.ToText(new SubRip()); + ToolStripMenuItemDeleteClick(null, null); + } + else if (e.KeyCode == Keys.A && e.Modifiers == Keys.Control) + { + SubtitleListview1.SelectAll(); + e.SuppressKeyPress = true; + } + else if (e.KeyCode == Keys.D && e.Modifiers == Keys.Control) + { + SubtitleListview1.SelectFirstSelectedItemOnly(); + e.SuppressKeyPress = true; + } + else if (e.KeyCode == Keys.Delete && SubtitleListview1.SelectedItems.Count > 0) //Delete + { + ToolStripMenuItemDeleteClick(null, null); + } + else if (e.KeyData == _shortcuts.MainInsertBefore) + { + InsertBefore(); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainInsertAfter) + { + InsertAfter(string.Empty); + e.SuppressKeyPress = true; + } + else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.Home) + { + SubtitleListview1.FirstVisibleIndex = -1; + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + e.SuppressKeyPress = true; + } + else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.End) + { + SubtitleListview1.SelectIndexAndEnsureVisible(SubtitleListview1.Items.Count - 1, true); + e.SuppressKeyPress = true; + } + else if (e.Modifiers == Keys.None && e.KeyCode == Keys.Enter) + { + SubtitleListview1_MouseDoubleClick(null, null); + } + } + + private void RemoveTimeCodesFromSelectedLines() + { + MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Settings.RemoveTimeCodes)); + + var indices = new List(); + foreach (ListViewItem item in SubtitleListview1.SelectedItems) + { + indices.Add(item.Index); + } + foreach (int i in indices) + { + if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle && SubtitleListview1.IsAlternateTextColumnVisible) + { + var original = Utilities.GetOriginalParagraph(i, _subtitle.Paragraphs[i], _subtitleAlternate.Paragraphs); + if (original != null) + { + original.StartTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; + original.EndTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; + } + } + _subtitle.Paragraphs[i].StartTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; + _subtitle.Paragraphs[i].EndTime.TotalMilliseconds = TimeCode.MaxTimeTotalMilliseconds; + } + + SaveSubtitleListviewIndices(); + _subtitleListViewIndex = -1; + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + ShowSource(); + RestoreSubtitleListviewIndices(); + } + + private void SetAlignment(string tag, bool selectedLines) + { + if (selectedLines) + { + SubtitleListview1.SelectedIndexChanged -= SubtitleListview1_SelectedIndexChanged; + MakeHistoryForUndo(string.Format(_language.BeforeAddingTagX, tag)); + + var indices = new List(); + foreach (ListViewItem item in SubtitleListview1.SelectedItems) + { + indices.Add(item.Index); + } + + bool first = true; + SubtitleListview1.BeginUpdate(); + foreach (int i in indices) + { + if (first) + { + if (_subtitle.Paragraphs[i].Text.StartsWith(tag, StringComparison.Ordinal)) + { + tag = string.Empty; + } + + if (_subtitle.Paragraphs[i].Text.StartsWith(tag.Replace("}", "\\"), StringComparison.Ordinal)) + { + tag = string.Empty; + } + + first = false; + } + + if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle && SubtitleListview1.IsAlternateTextColumnVisible) + { + var original = Utilities.GetOriginalParagraph(i, _subtitle.Paragraphs[i], _subtitleAlternate.Paragraphs); + if (original != null) + { + original.Text = SetAlignTag(original.Text, tag); + SubtitleListview1.SetAlternateText(i, original.Text); + } + } + + _subtitle.Paragraphs[i].Text = SetAlignTag(_subtitle.Paragraphs[i].Text, tag); + SubtitleListview1.SetText(i, _subtitle.Paragraphs[i].Text); + } + + SubtitleListview1.EndUpdate(); + + ShowStatus(string.Format(_language.TagXAdded, tag)); + ShowSource(); + RefreshSelectedParagraph(); + SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; + } + else + { + var tb = GetFocusedTextBox(); + var pos = tb.SelectionStart; + int oldLength = tb.Text.Length; + bool atEnd = pos == oldLength; + tb.Text = SetAlignTag(tb.Text, tag); + if (atEnd) + { + tb.SelectionStart = tb.Text.Length; + } + else if (pos == 0) + { + tb.SelectionStart = 0; + } + else if (oldLength == tb.Text.Length) + { + tb.SelectionStart = pos; + } + else if (pos + 5 <= tb.Text.Length) + { + tb.SelectionStart = pos + 5; + } + } + } + + private void GoToNextSyntaxError() + { + int idx = FirstSelectedIndex + 1; + try + { + for (int i = idx; i < _subtitle.Paragraphs.Count; i++) + { + var item = SubtitleListview1.Items[i]; + if (item.SubItems[SubtitleListview1.ColumnIndexDuration].BackColor == Configuration.Settings.Tools.ListViewSyntaxErrorColor || + item.SubItems[SubtitleListview1.ColumnIndexText].BackColor == Configuration.Settings.Tools.ListViewSyntaxErrorColor || + item.SubItems[SubtitleListview1.ColumnIndexStart].BackColor == Configuration.Settings.Tools.ListViewSyntaxErrorColor || + (SubtitleListview1.ColumnIndexCps >= 0 && item.SubItems[SubtitleListview1.ColumnIndexCps].BackColor == Configuration.Settings.Tools.ListViewSyntaxErrorColor) || + (SubtitleListview1.ColumnIndexWpm >= 0 && item.SubItems[SubtitleListview1.ColumnIndexWpm].BackColor == Configuration.Settings.Tools.ListViewSyntaxErrorColor) || + (SubtitleListview1.ColumnIndexGap >= 0 && item.SubItems[SubtitleListview1.ColumnIndexGap].BackColor == Configuration.Settings.Tools.ListViewSyntaxErrorColor)) + { + SubtitleListview1.SelectIndexAndEnsureVisible(i, true); + if (mediaPlayer.VideoPlayer != null) + { + mediaPlayer.VideoPlayer.CurrentPosition = _subtitle.Paragraphs[i].StartTime.TotalSeconds; + } + + return; + } + } + } + catch + { + } + } + + private void RestartHistory() + { + _listViewTextUndoLast = null; + _listViewTextUndoIndex = -1; + _listViewTextTicks = -1; + _listViewAlternateTextUndoLast = null; + _listViewAlternateTextTicks = -1; + _undoIndex = _subtitle.HistoryItems.Count - 1; + _makeHistoryPaused = false; + } + + private void AdjustDisplayTimeForSelectedLinesToolStripMenuItemClick(object sender, EventArgs e) + { + AdjustDisplayTime(true); + } + + private void FixCommonErrorsInSelectedLinesToolStripMenuItemClick(object sender, EventArgs e) + { + FixCommonErrors(true); + } + + private void FindDoubleWordsToolStripMenuItemClick(object sender, EventArgs e) + { + if (!IsSubtitleLoaded) + { + DisplaySubtitleNotLoadedMessage(); + return; + } + + var regex = new Regex(@"\b(\w+)\s+\1\b"); + _clearLastFind = true; + if (_findHelper != null) + { + _clearLastFindType = _findHelper.FindReplaceType.FindType; + _clearLastFindText = _findHelper.FindText; + } + + _findHelper = new FindReplaceDialogHelper(new ReplaceType { FindType = FindType.RegEx }, string.Format(_language.DoubleWordsViaRegEx, regex), regex, string.Empty, _subtitleListViewIndex); + + ReloadFromSourceView(); + FindNext(); + } + + private void ChangeCasingForSelectedLinesToolStripMenuItemClick(object sender, EventArgs e) + { + ChangeCasing(true); + } + + private void CenterFormOnCurrentScreen() + { + var screen = Screen.FromControl(this); + Left = screen.Bounds.X + ((screen.Bounds.Width - Width) / 2); + Top = screen.Bounds.Y + ((screen.Bounds.Height - Height) / 2); + } + + private void SortSubtitle(SubtitleSortCriteria subtitleSortCriteria, string description) + { + var firstSelectedIndex = 0; + if (SubtitleListview1.SelectedItems.Count > 0) + { + firstSelectedIndex = SubtitleListview1.SelectedItems[0].Index; + } + + _subtitleListViewIndex = -1; + MakeHistoryForUndo(string.Format(_language.BeforeSortX, description)); + _subtitle.Sort(subtitleSortCriteria); + if (descendingToolStripMenuItem.Checked) + { + _subtitle.Paragraphs.Reverse(); + } + + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + SubtitleListview1.SelectIndexAndEnsureVisible(firstSelectedIndex, true); + ShowStatus(string.Format(_language.SortedByX, description)); + } + + private void SortNumberToolStripMenuItemClick(object sender, EventArgs e) + { + SortSubtitle(SubtitleSortCriteria.Number, (sender as ToolStripItem).Text); + } + + private void SortStartTimeToolStripMenuItemClick(object sender, EventArgs e) + { + SortSubtitle(SubtitleSortCriteria.StartTime, (sender as ToolStripItem).Text); + } + + private void SortEndTimeToolStripMenuItemClick(object sender, EventArgs e) + { + SortSubtitle(SubtitleSortCriteria.EndTime, (sender as ToolStripItem).Text); + } + + private void SortDisplayTimeToolStripMenuItemClick(object sender, EventArgs e) + { + SortSubtitle(SubtitleSortCriteria.Duration, (sender as ToolStripItem).Text); + } + + private void SortTextMaxLineLengthToolStripMenuItemClick(object sender, EventArgs e) + { + SortSubtitle(SubtitleSortCriteria.TextMaxLineLength, (sender as ToolStripItem).Text); + } + + private void SortTextTotalLengthToolStripMenuItemClick(object sender, EventArgs e) + { + SortSubtitle(SubtitleSortCriteria.TextTotalLength, (sender as ToolStripItem).Text); + } + + private void SortTextNumberOfLinesToolStripMenuItemClick(object sender, EventArgs e) + { + SortSubtitle(SubtitleSortCriteria.TextNumberOfLines, (sender as ToolStripItem).Text); + } + + private void SortTextAlphabeticallytoolStripMenuItemClick(object sender, EventArgs e) + { + SortSubtitle(SubtitleSortCriteria.Text, (sender as ToolStripItem).Text); + } + + private void textCharssecToolStripMenuItem_Click(object sender, EventArgs e) + { + SortSubtitle(SubtitleSortCriteria.TextCharactersPerSeconds, (sender as ToolStripItem).Text); + } + + private void ChangeLanguageToolStripMenuItemClick(object sender, EventArgs e) + { + using (var cl = new ChooseLanguage()) + { + if (cl.ShowDialog(this) == DialogResult.OK) + { + SetLanguage(cl.CultureName); + Configuration.Settings.Save(); + } + } + } + + private void SetLanguage(string cultureName) + { + if (string.IsNullOrEmpty(cultureName)) + { + cultureName = "en-US"; + } + + if (cultureName != "en-US") + { + try + { + Configuration.Settings.Language = Language.Load(Path.Combine(Configuration.BaseDirectory, "Languages", cultureName + ".xml")); + } + catch (Exception ex) + { + var cap = "Language file load error"; + var msg = "Could not load language file " + cultureName + ".xml" + + "\n\nError Message:\n" + ex.Message + + "\n\nStack Trace:\n" + ex.StackTrace; + MessageBox.Show(this, msg, cap); + cultureName = "en-US"; + } + } + + if (cultureName == "en-US") + { + Configuration.Settings.Language = new Language(); // default is en-US + } + + Configuration.Settings.General.Language = cultureName; + _languageGeneral = Configuration.Settings.Language.General; + _language = Configuration.Settings.Language.Main; + InitializeLanguage(); + } + + private void ToolStripMenuItemCompareClick(object sender, EventArgs e) + { + var compareForm = new Compare(); + if (_subtitleAlternate != null && _subtitleAlternateFileName != null && SubtitleListview1.IsAlternateTextColumnVisible) + { + compareForm.Initialize(_subtitle, _fileName, _subtitleAlternate, _subtitleAlternateFileName); + } + else + { + compareForm.Initialize(_subtitle, _fileName, _languageGeneral.CurrentSubtitle); + } + + compareForm.Show(this); + compareForm.Activate(); + } + + private void ToolStripMenuItemAutoBreakLinesClick(object sender, EventArgs e) + { + if (!IsSubtitleLoaded) + { + DisplaySubtitleNotLoadedMessage(); + return; + } + + ReloadFromSourceView(); + using (var autoBreakUnbreakLines = new AutoBreakUnbreakLines()) + { + var selectedLines = new Subtitle(); + foreach (int index in SubtitleListview1.SelectedIndices) + { + selectedLines.Paragraphs.Add(_subtitle.Paragraphs[index]); + } + + autoBreakUnbreakLines.Initialize(selectedLines, true); + + if (autoBreakUnbreakLines.ShowDialog() == DialogResult.OK && autoBreakUnbreakLines.FixedText.Count > 0) + { + MakeHistoryForUndo(_language.BeforeAutoBalanceSelectedLines); + SubtitleListview1.BeginUpdate(); + foreach (int index in SubtitleListview1.SelectedIndices) + { + var p = _subtitle.GetParagraphOrDefault(index); + if (autoBreakUnbreakLines.FixedText.ContainsKey(p.Id)) + { + p.Text = autoBreakUnbreakLines.FixedText[p.Id]; + SubtitleListview1.SetText(index, p.Text); + SubtitleListview1.SyntaxColorLine(_subtitle.Paragraphs, index, p); + } + } + + SubtitleListview1.EndUpdate(); + RefreshSelectedParagraph(); + ShowStatus(string.Format(_language.NumberOfLinesAutoBalancedX, autoBreakUnbreakLines.FixedText.Count)); + } + } + } + + private void ToolStripMenuItemUnbreakLinesClick(object sender, EventArgs e) + { + if (!IsSubtitleLoaded) + { + DisplaySubtitleNotLoadedMessage(); + return; + } + + ReloadFromSourceView(); + using (var autoBreakUnbreakLines = new AutoBreakUnbreakLines()) + { + var selectedLines = new Subtitle(); + foreach (int index in SubtitleListview1.SelectedIndices) + { + selectedLines.Paragraphs.Add(_subtitle.Paragraphs[index]); + } + + autoBreakUnbreakLines.Initialize(selectedLines, false); + + if (autoBreakUnbreakLines.ShowDialog() == DialogResult.OK && autoBreakUnbreakLines.FixedText.Count > 0) + { + MakeHistoryForUndo(_language.BeforeRemoveLineBreaksInSelectedLines); + + SubtitleListview1.BeginUpdate(); + foreach (int index in SubtitleListview1.SelectedIndices) + { + var p = _subtitle.GetParagraphOrDefault(index); + if (autoBreakUnbreakLines.FixedText.ContainsKey(p.Id)) + { + p.Text = autoBreakUnbreakLines.FixedText[p.Id]; + SubtitleListview1.SetText(index, p.Text); + SubtitleListview1.SyntaxColorLine(_subtitle.Paragraphs, index, p); + } + } + + SubtitleListview1.EndUpdate(); + RefreshSelectedParagraph(); + ShowStatus(string.Format(_language.NumberOfWithRemovedLineBreakX, autoBreakUnbreakLines.FixedText.Count)); + } + } + } + + private void MultipleReplaceToolStripMenuItemClick(object sender, EventArgs e) + { + using (var multipleReplace = new MultipleReplace()) + { + multipleReplace.Initialize(_subtitle); + if (multipleReplace.ShowDialog(this) == DialogResult.OK) + { + MakeHistoryForUndo(_language.BeforeMultipleReplace); + SaveSubtitleListviewIndices(); + + for (int i = 0; i < _subtitle.Paragraphs.Count; i++) + { + _subtitle.Paragraphs[i].Text = multipleReplace.FixedSubtitle.Paragraphs[i].Text; + } + + _subtitle.RemoveParagraphsByIndices(multipleReplace.DeleteIndices); + _subtitle.Renumber(); + + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + RefreshSelectedParagraph(); + ShowSource(); + ShowStatus(string.Format(_language.NumberOfLinesReplacedX, multipleReplace.FixCount)); + } + } + } + + private void ToolStripMenuItemImportDvdSubtitlesClick(object sender, EventArgs e) + { + if (!ContinueNewOrExit()) + { + return; + } + + ImportDvdSubtitle(null); + } + + private void ImportDvdSubtitle(string fileName) + { + using (var formSubRip = new DvdSubRip(Handle, fileName)) + { + if (formSubRip.ShowDialog(this) == DialogResult.OK) + { + using (var showSubtitles = new DvdSubRipChooseLanguage()) + { + showSubtitles.Initialize(formSubRip.MergedVobSubPacks, formSubRip.Palette, formSubRip.Languages, formSubRip.SelectedLanguage); + if (formSubRip.Languages.Count == 1 || showSubtitles.ShowDialog(this) == DialogResult.OK) + { + using (var formSubOcr = new VobSubOcr()) + { + var subs = formSubRip.MergedVobSubPacks; + if (showSubtitles.SelectedVobSubMergedPacks != null) + { + subs = showSubtitles.SelectedVobSubMergedPacks; + } + + formSubOcr.Initialize(subs, formSubRip.Palette, Configuration.Settings.VobSubOcr, formSubRip.SelectedLanguage); + if (formSubOcr.ShowDialog(this) == DialogResult.OK) + { + MakeHistoryForUndo(_language.BeforeImportingDvdSubtitle); + FileNew(); + _subtitle.Paragraphs.Clear(); + SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); + foreach (var p in formSubOcr.SubtitleFromOcr.Paragraphs) + { + _subtitle.Paragraphs.Add(p); + } + + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + _subtitleListViewIndex = -1; + SubtitleListview1.FirstVisibleIndex = -1; + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + + _fileName = string.Empty; + SetTitle(); + + Configuration.Settings.Save(); + } + } + } + } + } + } + } + + private void ToolStripMenuItemSubIdxClick1(object sender, EventArgs e) + { + if (ContinueNewOrExit()) + { + openFileDialog1.Title = _language.OpenVobSubFile; + openFileDialog1.FileName = string.Empty; + openFileDialog1.Filter = _language.VobSubFiles + "|*.sub"; + if (openFileDialog1.ShowDialog(this) == DialogResult.OK) + { + ImportAndOcrVobSubSubtitleNew(openFileDialog1.FileName, false); + openFileDialog1.InitialDirectory = Path.GetDirectoryName(openFileDialog1.FileName); + } + } + } + + private void SubtitleListview1_MouseDoubleClick(object sender, MouseEventArgs e) + { + if (Configuration.Settings.General.ListViewDoubleClickAction == 1) + { + GotoSubPositionAndPause(); + } + else if (Configuration.Settings.General.ListViewDoubleClickAction == 2) + { + if (AutoRepeatContinueOn || AutoRepeatOn) + { + PlayCurrent(); + } + else + { + buttonBeforeText_Click(null, null); + } + } + else if (Configuration.Settings.General.ListViewDoubleClickAction == 3) + { + GotoSubPositionAndPause(-0.5); + } + else if (Configuration.Settings.General.ListViewDoubleClickAction == 4) + { + GotoSubPositionAndPause(-1.0); + } + else if (Configuration.Settings.General.ListViewDoubleClickAction == 5) + { + if (AutoRepeatContinueOn || AutoRepeatOn) + { + PlayCurrent(); + } + else + { + if (SubtitleListview1.SelectedItems.Count > 0) + { + int index = SubtitleListview1.SelectedItems[0].Index; + + mediaPlayer.Pause(); + double pos = _subtitle.Paragraphs[index].StartTime.TotalSeconds; + if (pos > 1) + { + mediaPlayer.CurrentPosition = (_subtitle.Paragraphs[index].StartTime.TotalSeconds) - 1.0; + } + else + { + mediaPlayer.CurrentPosition = _subtitle.Paragraphs[index].StartTime.TotalSeconds; + } + + mediaPlayer.Play(); + } + } + } + else if (Configuration.Settings.General.ListViewDoubleClickAction == 6) + { + GotoSubPositionAndPause(); + textBoxListViewText.Focus(); + } + else if (Configuration.Settings.General.ListViewDoubleClickAction == 7) + { + textBoxListViewText.Focus(); + } + } + + private void AddWordToNameListToolStripMenuItemClick(object sender, EventArgs e) + { + using (var addToNamesList = new AddToNameList()) + { + addToNamesList.Initialize(_subtitle, textBoxListViewText.SelectedText); + if (addToNamesList.ShowDialog(this) == DialogResult.OK) + { + ShowStatus(string.Format(_language.NameXAddedToNameList, addToNamesList.NewName)); + } + else if (!string.IsNullOrEmpty(addToNamesList.NewName)) + { + ShowStatus(string.Format(_language.NameXNotAddedToNameList, addToNamesList.NewName)); + } + } + } + + private bool IsUnicode + { + get + { + var enc = GetCurrentEncoding(); + return enc == Encoding.UTF8 || enc == Encoding.Unicode || enc == Encoding.UTF7 || enc == Encoding.UTF32 || enc == Encoding.BigEndianUnicode; + } + } + + private void EditToolStripMenuItemDropDownOpening(object sender, EventArgs e) + { + toolStripMenuItemRemoveUnicodeControlChars.Visible = IsUnicode; + toolStripMenuItemRtlUnicodeControlChars.Visible = IsUnicode; + if (!IsUnicode || _subtitleListViewIndex == -1) + { + toolStripMenuItemInsertUnicodeCharacter.Visible = false; + toolStripSeparatorInsertUnicodeCharacter.Visible = false; + } + else + { + if (toolStripMenuItemInsertUnicodeCharacter.DropDownItems.Count == 0) + { + foreach (var s in Configuration.Settings.Tools.UnicodeSymbolsToInsert.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries)) + { + toolStripMenuItemInsertUnicodeCharacter.DropDownItems.Add(s, null, InsertUnicodeGlyphAllowMultiLine); + if (Environment.OSVersion.Version.Major < 6 && Configuration.Settings.General.SubtitleFontName == Utilities.WinXP2KUnicodeFontName) // 6 == Vista/Win2008Server/Win7 + { + toolStripMenuItemInsertUnicodeCharacter.DropDownItems[toolStripMenuItemInsertUnicodeCharacter.DropDownItems.Count - 1].Font = new Font(Utilities.WinXP2KUnicodeFontName, toolStripMenuItemInsertUnicodeSymbol.Font.Size); + } + } + } + + toolStripMenuItemInsertUnicodeCharacter.Visible = toolStripMenuItemInsertUnicodeCharacter.DropDownItems.Count > 0; + toolStripSeparatorInsertUnicodeCharacter.Visible = toolStripMenuItemInsertUnicodeCharacter.DropDownItems.Count > 0; + } + + lock (_syncUndo) + { + toolStripMenuItemUndo.Enabled = _subtitle != null && _subtitle.CanUndo && _undoIndex >= 0; + toolStripMenuItemRedo.Enabled = _subtitle != null && _subtitle.CanUndo && _undoIndex < _subtitle.HistoryItems.Count - 1; + } + + showHistoryforUndoToolStripMenuItem.Enabled = _subtitle != null && _subtitle.CanUndo; + toolStripMenuItemShowOriginalInPreview.Visible = SubtitleListview1.IsAlternateTextColumnVisible; + + if (_networkSession != null) + { + toolStripMenuItemUndo.Enabled = false; + toolStripMenuItemRedo.Enabled = false; + showHistoryforUndoToolStripMenuItem.Enabled = false; + } + } + + private void InsertUnicodeGlyph(object sender, EventArgs e) + { + if (sender is ToolStripItem item) + { + PasteIntoActiveTextBox(item.Text); + } + } + + private void InsertUnicodeGlyphAllowMultiLine(object sender, EventArgs e) + { + if (sender is ToolStripItem item) + { + PasteIntoActiveTextBox(item.Text, true); + } + } + + private void ToolStripMenuItemAutoMergeShortLinesClick(object sender, EventArgs e) + { + if (!IsSubtitleLoaded) + { + DisplaySubtitleNotLoadedMessage(); + return; + } + + ReloadFromSourceView(); + using (var formMergeShortLines = new MergeShortLines()) + { + formMergeShortLines.Initialize(_subtitle); + if (formMergeShortLines.ShowDialog(this) == DialogResult.OK) + { + MakeHistoryForUndo(_language.BeforeMergeShortLines); + _subtitle.Paragraphs.Clear(); + foreach (var p in formMergeShortLines.MergedSubtitle.Paragraphs) + { + _subtitle.Paragraphs.Add(p); + } + + _subtitle.Renumber(); + + ShowStatus(string.Format(_language.MergedShortLinesX, formMergeShortLines.NumberOfMerges)); + SaveSubtitleListviewIndices(); + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + } + } + } + + private void toolStripMenuItemAutoSplitLongLines_Click(object sender, EventArgs e) + { + if (!IsSubtitleLoaded) + { + DisplaySubtitleNotLoadedMessage(); + return; + } + + ReloadFromSourceView(); + using (var splitLongLines = new SplitLongLines()) + { + splitLongLines.Initialize(_subtitle); + if (splitLongLines.ShowDialog(this) == DialogResult.OK) + { + MakeHistoryForUndo(_language.BeforeSplitLongLines); + _subtitle.Paragraphs.Clear(); + foreach (var p in splitLongLines.SplitSubtitle.Paragraphs) + { + _subtitle.Paragraphs.Add(p); + } + + ShowStatus(string.Format(_language.LongLinesSplitX, splitLongLines.NumberOfSplits)); + SaveSubtitleListviewIndices(); + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + } + } + } + + private void SetMinimalDisplayTimeDifferenceToolStripMenuItemClick(object sender, EventArgs e) + { + if (!IsSubtitleLoaded) + { + DisplaySubtitleNotLoadedMessage(); + return; + } + + using (var setMinDisplayDiff = new SetMinimumDisplayTimeBetweenParagraphs()) + { + setMinDisplayDiff.Initialize(_subtitle); + if (setMinDisplayDiff.ShowDialog() == DialogResult.OK && setMinDisplayDiff.FixCount > 0) + { + MakeHistoryForUndo(_language.BeforeSetMinimumDisplayTimeBetweenParagraphs); + _subtitle.Paragraphs.Clear(); + foreach (var p in setMinDisplayDiff.FixedSubtitle.Paragraphs) + { + _subtitle.Paragraphs.Add(p); + } + + ShowStatus(string.Format(_language.XMinimumDisplayTimeBetweenParagraphsChanged, setMinDisplayDiff.FixCount)); + SaveSubtitleListviewIndices(); + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + } + } + } + + private void ToolStripMenuItemImportTextClick(object sender, EventArgs e) + { + ImportPlainText(null); + } + + private void ImportPlainText(string fileName) + { + using (var importText = new ImportText(fileName, this)) + { + if (importText.ShowDialog(this) == DialogResult.OK) + { + if (ContinueNewOrExit()) + { + MakeHistoryForUndo(_language.BeforeImportText); + + ResetSubtitle(); + if (!string.IsNullOrEmpty(importText.VideoFileName)) + { + if (!Configuration.Settings.General.DisableVideoAutoLoading) + { + OpenVideo(importText.VideoFileName); + } + + _fileName = importText.VideoFileName; + _converted = true; + SetTitle(); + } + + _subtitleListViewIndex = -1; + if (importText.Format != null) + { + SetCurrentFormat(importText.Format); + } + + _subtitle = new Subtitle(importText.FixedSubtitle.Paragraphs, _subtitle.HistoryItems); + ShowStatus(_language.TextImported); + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + } + } + } + } + + private void toolStripMenuItemPointSync_Click(object sender, EventArgs e) + { + if (!IsSubtitleLoaded) + { + DisplaySubtitleNotLoadedMessage(); + return; + } + + using (var pointSync = new SyncPointsSync()) + { + pointSync.Initialize(_subtitle, _fileName, VideoFileName, VideoAudioTrackNumber); + mediaPlayer.Pause(); + if (pointSync.ShowDialog(this) == DialogResult.OK) + { + _subtitleListViewIndex = -1; + MakeHistoryForUndo(_language.BeforePointSynchronization); + _subtitle.Paragraphs.Clear(); + foreach (var p in pointSync.FixedSubtitle.Paragraphs) + { + _subtitle.Paragraphs.Add(p); + } + ShowStatus(_language.PointSynchronizationDone); + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + } + + Activate(); + VideoFileName = pointSync.VideoFileName; + } + } + + private void pointSyncViaOtherSubtitleToolStripMenuItem_Click(object sender, EventArgs e) + { + if (!IsSubtitleLoaded) + { + DisplaySubtitleNotLoadedMessage(); + return; + } + + using (var pointSync = new SyncPointsSync()) + { + openFileDialog1.Title = _language.OpenOtherSubtitle; + openFileDialog1.FileName = string.Empty; + openFileDialog1.Filter = UiUtil.SubtitleExtensionFilter.Value; + if (openFileDialog1.ShowDialog() == DialogResult.OK && File.Exists(openFileDialog1.FileName)) + { + var file = new FileInfo(openFileDialog1.FileName); + var fileName = file.FullName; + var extension = file.Extension.ToLowerInvariant(); + + // TODO: Check for mkv etc + if (extension == ".sub") + { + if (IsVobSubFile(fileName, false)) + { + MessageBox.Show(_language.NoSupportHereVobSub); + return; + } + } + + if (extension == ".sup") + { + if (FileUtil.IsBluRaySup(fileName)) + { + MessageBox.Show(_language.NoSupportHereBluRaySup); + return; + } + else if (FileUtil.IsSpDvdSup(fileName)) + { + MessageBox.Show(_language.NoSupportHereDvdSup); + return; + } + } + + var sub = new Subtitle(); + if (extension == ".mkv" || extension == ".mks") + { + using (var matroska = new MatroskaFile(fileName)) + { + if (matroska.IsValid) + { + var subtitleList = matroska.GetTracks(true); + if (subtitleList.Count > 1) + { + using (var subtitleChooser = new MatroskaSubtitleChooser("mkv")) + { + subtitleChooser.Initialize(subtitleList); + if (_loading) + { + subtitleChooser.Icon = (Icon)Icon.Clone(); + subtitleChooser.ShowInTaskbar = true; + subtitleChooser.ShowIcon = true; + } + + if (subtitleChooser.ShowDialog(this) == DialogResult.OK) + { + sub = LoadMatroskaSubtitleForSync(subtitleList[subtitleChooser.SelectedIndex], matroska); + } + } + } + else if (subtitleList.Count > 0) + { + sub = LoadMatroskaSubtitleForSync(subtitleList[0], matroska); + } + else + { + MessageBox.Show(_language.NoSubtitlesFound); + return; + } + } + } + } + + if (extension == ".divx" || extension == ".avi") + { + MessageBox.Show(_language.NoSupportHereDivx); + return; + } + + if ((extension == ".mp4" || extension == ".m4v" || extension == ".3gp") && file.Length > 10000) + { + var mp4Parser = new MP4Parser(fileName); + var mp4SubtitleTracks = mp4Parser.GetSubtitleTracks(); + if (mp4SubtitleTracks.Count == 0) + { + MessageBox.Show(_language.NoSubtitlesFound); + return; + } + else if (mp4SubtitleTracks.Count == 1) + { + sub = LoadMp4SubtitleForSync(mp4SubtitleTracks[0]); + } + else + { + using (var subtitleChooser = new MatroskaSubtitleChooser("mp4")) + { + subtitleChooser.Initialize(mp4SubtitleTracks); + if (subtitleChooser.ShowDialog(this) == DialogResult.OK) + { + sub = LoadMp4SubtitleForSync(mp4SubtitleTracks[0]); + } + } + } + } + + if (file.Length > 1024 * 1024 * 10 && sub.Paragraphs.Count == 0) // max 10 mb + { + var text = string.Format(_language.FileXIsLargerThan10MB + Environment.NewLine + Environment.NewLine + _language.ContinueAnyway, fileName); + if (MessageBox.Show(this, text, Title, MessageBoxButtons.YesNoCancel) != DialogResult.Yes) + { + return; + } + } + + sub.Renumber(); + if (sub.Paragraphs.Count == 0) + { + var f = sub.LoadSubtitle(fileName, out var enc, null); + if (f == null) + { + ShowUnknownSubtitle(fileName); + return; + } + } + + pointSync.Initialize(_subtitle, _fileName, VideoFileName, VideoAudioTrackNumber, fileName, sub); + mediaPlayer.Pause(); + if (pointSync.ShowDialog(this) == DialogResult.OK) + { + _subtitleListViewIndex = -1; + MakeHistoryForUndo(_language.BeforePointSynchronization); + _subtitle.Paragraphs.Clear(); + foreach (var p in pointSync.FixedSubtitle.Paragraphs) + { + _subtitle.Paragraphs.Add(p); + } + ShowStatus(_language.PointSynchronizationDone); + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + } + + VideoFileName = pointSync.VideoFileName; + } + } + } + + private void toolStripMenuItemImportTimeCodes_Click(object sender, EventArgs e) + { + if (_subtitle.Paragraphs.Count < 1) + { + DisplaySubtitleNotLoadedMessage(); + return; + } + + openFileDialog1.Title = _languageGeneral.OpenSubtitle; + openFileDialog1.FileName = string.Empty; + openFileDialog1.Filter = UiUtil.SubtitleExtensionFilter.Value; + if (openFileDialog1.ShowDialog(this) == DialogResult.OK) + { + var timeCodeSubtitle = new Subtitle(); + SubtitleFormat format = null; + + if (format == null && + openFileDialog1.FileName.EndsWith(".sup", StringComparison.OrdinalIgnoreCase) && + FileUtil.IsBluRaySup(openFileDialog1.FileName)) + { + var log = new StringBuilder(); + var subtitles = BluRaySupParser.ParseBluRaySup(openFileDialog1.FileName, log); + if (subtitles.Count > 0) + { + foreach (var sup in subtitles) + { + timeCodeSubtitle.Paragraphs.Add(new Paragraph(sup.StartTimeCode, sup.EndTimeCode, string.Empty)); + } + + format = new SubRip(); // just to set format to something + } + } + + if (format == null) + { + format = timeCodeSubtitle.LoadSubtitle(openFileDialog1.FileName, out var encoding, null); + } + + if (format == null) + { + var formats = SubtitleFormat.GetBinaryFormats(true).Union(SubtitleFormat.GetTextOtherFormats()).Union(new SubtitleFormat[] + { + new TimeCodesOnly1(), + new TimeCodesOnly2() + }).ToArray(); + format = SubtitleFormat.LoadSubtitleFromFile(formats, openFileDialog1.FileName, timeCodeSubtitle); + } + + if (format == null) + { + ShowUnknownSubtitle(openFileDialog1.FileName); + return; + } + + if (timeCodeSubtitle.Paragraphs.Count != _subtitle.Paragraphs.Count) + { + var text = string.Format(_language.ImportTimeCodesDifferentNumberOfLinesWarning, timeCodeSubtitle.Paragraphs.Count, _subtitle.Paragraphs.Count); + if (MessageBox.Show(this, text, _title, MessageBoxButtons.YesNoCancel) != DialogResult.Yes) + { + return; + } + } + + MakeHistoryForUndo(_language.BeforeTimeCodeImport); + + int count = 0; + for (int i = 0; i < timeCodeSubtitle.Paragraphs.Count; i++) + { + var existing = _subtitle.GetParagraphOrDefault(i); + + var newTimeCode = timeCodeSubtitle.GetParagraphOrDefault(i); + if (existing == null || newTimeCode == null) + { + break; + } + + Paragraph original = null; + if (existing != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle && + _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0 && SubtitleListview1.IsAlternateTextColumnVisible) + { + original = Utilities.GetOriginalParagraph(i, existing, _subtitleAlternate.Paragraphs); + } + + existing.StartTime.TotalMilliseconds = newTimeCode.StartTime.TotalMilliseconds; + existing.EndTime.TotalMilliseconds = newTimeCode.EndTime.TotalMilliseconds; + + if (original != null) + { + original.StartTime.TotalMilliseconds = newTimeCode.StartTime.TotalMilliseconds; + original.EndTime.TotalMilliseconds = newTimeCode.EndTime.TotalMilliseconds; + } + + count++; + } + + ShowStatus(string.Format(_language.TimeCodeImportedFromXY, Path.GetFileName(openFileDialog1.FileName), count)); + SaveSubtitleListviewIndices(); + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + } + } + + private void toolStripMenuItemTranslationMode_Click(object sender, EventArgs e) + { + if (_subtitle == null || _subtitle.Paragraphs.Count == 0) + { + return; + } + + if (SubtitleListview1.IsAlternateTextColumnVisible) + { + RemoveAlternate(true, true); + } + else + { + OpenAlternateSubtitle(); + SetTitle(); + } + } + + private void OpenAlternateSubtitle() + { + if (ContinueNewOrExitAlternate()) + { + SaveSubtitleListviewIndices(); + openFileDialog1.Title = _languageGeneral.OpenOriginalSubtitleFile; + openFileDialog1.FileName = string.Empty; + openFileDialog1.Filter = UiUtil.SubtitleExtensionFilter.Value; + if (openFileDialog1.ShowDialog(this) != DialogResult.OK) + { + return; + } + + if (!LoadAlternateSubtitleFile(openFileDialog1.FileName)) + { + return; + } + + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + + Configuration.Settings.RecentFiles.Add(_fileName, FirstVisibleIndex, FirstSelectedIndex, VideoFileName, _subtitleAlternateFileName, Configuration.Settings.General.CurrentVideoOffsetInMs); + Configuration.Settings.Save(); + UpdateRecentFilesUI(); + MainResize(); + if (SubtitleListview1.SelectedIndices.Count == 0) + { + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + } + RefreshSelectedParagraph(); + } + } + + private bool LoadAlternateSubtitleFile(string fileName) + { + if (!File.Exists(fileName)) + { + return false; + } + + var file = new FileInfo(fileName); + + if (file.Extension.Equals(".sub", StringComparison.OrdinalIgnoreCase) && IsVobSubFile(fileName, false)) + { + return false; + } + + if (file.Length > 1024 * 1024 * 10) // max 10 mb + { + var text = string.Format(_language.FileXIsLargerThan10MB + Environment.NewLine + Environment.NewLine + _language.ContinueAnyway, fileName); + if (MessageBox.Show(this, text, Title, MessageBoxButtons.YesNoCancel) != DialogResult.Yes) + { + return false; + } + } + + _subtitleAlternate = new Subtitle(); + _subtitleAlternateFileName = fileName; + SubtitleFormat format = _subtitleAlternate.LoadSubtitle(fileName, out _, null); + + if (format == null) + { + foreach (var binaryFormat in SubtitleFormat.GetBinaryFormats(false)) + { + if (binaryFormat.IsMine(null, fileName)) + { + binaryFormat.LoadSubtitle(_subtitleAlternate, null, fileName); + format = binaryFormat; + break; + } + } + } + + if (format == null) + { + var lines = FileUtil.ReadAllTextShared(fileName, LanguageAutoDetect.GetEncodingFromFile(fileName)).SplitToLines(); + foreach (var f in SubtitleFormat.GetTextOtherFormats()) + { + if (f.IsMine(lines, fileName)) + { + f.LoadSubtitle(_subtitleAlternate, lines, fileName); + format = f; + break; + } + } + } + + if (format == null) + { + return false; + } + + SetupAlternateEdit(); + FixRightToLeftDependingOnLanguage(); + return true; + } + + private void SetupAlternateEdit() + { + if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate.Paragraphs.Count > 0) + { + InsertMissingParagraphs(_subtitle, _subtitleAlternate); + InsertMissingParagraphs(_subtitleAlternate, _subtitle); + + buttonUnBreak.Visible = false; + buttonAutoBreak.Visible = false; + buttonSplitLine.Visible = false; + + textBoxListViewText.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom; + textBoxListViewText.Width = (groupBoxEdit.Width - (textBoxListViewText.Left + 10)) / 2; + textBoxListViewTextAlternate.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom; + textBoxListViewTextAlternate.Left = textBoxListViewText.Left + textBoxListViewText.Width + 3; + textBoxListViewTextAlternate.Width = textBoxListViewText.Width; + textBoxListViewTextAlternate.Visible = true; + labelAlternateText.Text = _languageGeneral.OriginalText; + labelAlternateText.Visible = true; + labelAlternateCharactersPerSecond.Visible = true; + labelTextAlternateLineLengths.Visible = true; + labelAlternateSingleLine.Visible = true; + labelAlternateSingleLinePixels.Visible = true; + labelTextAlternateLineTotal.Visible = true; + + labelCharactersPerSecond.Left = textBoxListViewText.Left + (textBoxListViewText.Width - labelCharactersPerSecond.Width); + labelTextLineTotal.Left = textBoxListViewText.Left + (textBoxListViewText.Width - labelTextLineTotal.Width); + Main_Resize(null, null); + _changeAlternateSubtitleHash = _subtitleAlternate.GetFastHashCode(GetCurrentEncoding().BodyName); + + SetTitle(); + } + + SubtitleListview1.ShowAlternateTextColumn(_languageGeneral.OriginalText); + SubtitleListview1.AutoSizeAllColumns(this); + } + + private static void InsertMissingParagraphs(Subtitle masterSubtitle, Subtitle insertIntoSubtitle) + { + int index = 0; + foreach (var p in masterSubtitle.Paragraphs) + { + var insertParagraph = Utilities.GetOriginalParagraph(index, p, insertIntoSubtitle.Paragraphs); + if (insertParagraph == null) + { + insertParagraph = new Paragraph(p); + insertParagraph.Text = string.Empty; + if (p.StartTime.IsMaxTime) + { + insertIntoSubtitle.Paragraphs.Add(new Paragraph(p, true) { Text = string.Empty }); + } + else + { + insertIntoSubtitle.InsertParagraphInCorrectTimeOrder(insertParagraph); + } + } + + index++; + } + + insertIntoSubtitle.Renumber(); + } + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + private void OpenVideo(string fileName) + { + if (!_resetVideo) + { + return; + } + + if (!string.IsNullOrEmpty(fileName) && File.Exists(fileName)) + { + if (_loading) + { + VideoFileName = fileName; + return; + } + + var fi = new FileInfo(fileName); + if (fi.Length < 1000) + { + return; + } + + ShowSubtitleTimer.Stop(); + Cursor = Cursors.WaitCursor; + VideoFileName = fileName; + if (mediaPlayer.VideoPlayer != null) + { + mediaPlayer.PauseAndDisposePlayer(); + } + + _endSeconds = -1; + + _videoInfo = UiUtil.GetVideoInfo(fileName); + if (_videoInfo.FramesPerSecond > 0) + { + toolStripComboBoxFrameRate.Text = string.Format("{0:0.###}", _videoInfo.FramesPerSecond); + } + + string oldVideoPlayer = Configuration.Settings.General.VideoPlayer; + var ok = UiUtil.InitializeVideoPlayerAndContainer(fileName, _videoInfo, mediaPlayer, VideoLoaded, VideoEnded); + if (!ok && oldVideoPlayer != Configuration.Settings.General.VideoPlayer) + { + CloseVideoToolStripMenuItemClick(null, null); + VideoFileName = fileName; + _videoInfo = UiUtil.GetVideoInfo(fileName); + UiUtil.InitializeVideoPlayerAndContainer(fileName, _videoInfo, mediaPlayer, VideoLoaded, VideoEnded); + } + + mediaPlayer.Volume = 0; + mediaPlayer.ShowFullscreenButton = Configuration.Settings.General.VideoPlayerShowFullscreenButton; + mediaPlayer.OnButtonClicked -= MediaPlayer_OnButtonClicked; + mediaPlayer.OnButtonClicked += MediaPlayer_OnButtonClicked; + + if (_videoInfo.VideoCodec != null) + { + labelVideoInfo.Text = Path.GetFileName(fileName) + " " + _videoInfo.Width + "x" + _videoInfo.Height + " " + _videoInfo.VideoCodec.Trim(); + } + else + { + labelVideoInfo.Text = Path.GetFileName(fileName) + " " + _videoInfo.Width + "x" + _videoInfo.Height; + } + + if (_videoInfo.FramesPerSecond > 0) + { + labelVideoInfo.Text = labelVideoInfo.Text + " " + string.Format("{0:0.0##}", _videoInfo.FramesPerSecond); + } + + + string peakWaveFileName = WavePeakGenerator.GetPeakWaveFileName(fileName); + string spectrogramFolder = WavePeakGenerator.SpectrogramDrawer.GetSpectrogramFolder(fileName); + if (File.Exists(peakWaveFileName)) + { + audioVisualizer.ZoomFactor = 1.0; + audioVisualizer.VerticalZoomFactor = 1.0; + SelectZoomTextInComboBox(); + audioVisualizer.WavePeaks = WavePeakData.FromDisk(peakWaveFileName); + audioVisualizer.SetSpectrogram(SpectrogramData.FromDisk(spectrogramFolder)); + audioVisualizer.SceneChanges = SceneChangeHelper.FromDisk(VideoFileName); + SetWaveformPosition(0, 0, 0); + timerWaveform.Start(); + } + + Cursor = Cursors.Default; + + SetUndockedWindowsTitle(); + ShowSubtitleTimer.Start(); + } + } + + private void MediaPlayer_OnButtonClicked(object sender, EventArgs e) + { + if (sender is PictureBox pb && pb.Name == "_pictureBoxFullscreenOver") + { + if (_videoPlayerUndocked != null && !_videoPlayerUndocked.IsDisposed && _videoPlayerUndocked.IsFullscreen) + { + _videoPlayerUndocked.NoFullscreen(); + } + else + { + GoFullscreen(false); + } + } + } + + private void SetWaveformPosition(double startPositionSeconds, double currentVideoPositionSeconds, int subtitleIndex) + { + if (_subtitleAlternate != null && SubtitleListview1.IsAlternateTextColumnVisible && Configuration.Settings.General.ShowOriginalAsPreviewIfAvailable) + { + int index = -1; + if (SubtitleListview1.SelectedItems.Count > 0 && _subtitle.Paragraphs.Count > 0) + { + int i = SubtitleListview1.SelectedItems[0].Index; + var p = Utilities.GetOriginalParagraph(i, _subtitle.Paragraphs[i], _subtitleAlternate.Paragraphs); + index = _subtitleAlternate.GetIndex(p); + } + + audioVisualizer.SetPosition(startPositionSeconds, _subtitleAlternate, currentVideoPositionSeconds, index, SubtitleListview1.SelectedIndices); + } + else + { + audioVisualizer.SetPosition(startPositionSeconds, _subtitle, currentVideoPositionSeconds, subtitleIndex, SubtitleListview1.SelectedIndices); + } + } + + private void VideoLoaded(object sender, EventArgs e) + { + if (_loading) + { + Application.DoEvents(); + } + + mediaPlayer.Volume = Configuration.Settings.General.VideoPlayerDefaultVolume; + timer1.Start(); + + trackBarWaveformPosition.Maximum = (int)mediaPlayer.Duration; + + if (_videoLoadedGoToSubPosAndPause) + { + Application.DoEvents(); + _videoLoadedGoToSubPosAndPause = false; + GotoSubPositionAndPause(); + } + + mediaPlayer.Pause(); + mediaPlayer.UpdatePlayerName(); + + // Keep current play rate + for (var index = 0; index < toolStripSplitButtonPlayRate.DropDownItems.Count; index++) + { + var item = (ToolStripMenuItem)toolStripSplitButtonPlayRate.DropDownItems[index]; + if (item.Checked) + { + SetPlayRate(item, null, true); + break; + } + } + + if (mediaPlayer.VideoPlayer is LibMpvDynamic && !Configuration.Settings.General.MpvHandlesPreviewText) + { + (mediaPlayer.VideoPlayer as LibMpvDynamic)?.RemoveSubtitle(); + } + + if (trackBarWaveformPosition.Maximum <= 0) + { + trackBarWaveformPosition.Maximum = (int)mediaPlayer.Duration; + } + } + + private void VideoEnded(object sender, EventArgs e) + { + mediaPlayer.Pause(); + } + + private void TryToFindAndOpenVideoFile(string fileNameNoExtension) + { + string movieFileName = null; + + foreach (var extension in Utilities.VideoFileExtensions) + { + var fileName = fileNameNoExtension + extension; + if (File.Exists(fileName)) + { + bool skipLoad = false; + if (extension == ".m2ts" && new FileInfo(fileName).Length < 2000000) + { + var textSt = new TextST(); + skipLoad = textSt.IsMine(null, fileName); // don't load TextST files as video/audio file + } + + if (!skipLoad) + { + movieFileName = fileName; + break; + } + } + } + + if (movieFileName != null) + { + OpenVideo(movieFileName); + } + else + { + var index = fileNameNoExtension.LastIndexOf('.'); + if (index > 0) + { + TryToFindAndOpenVideoFile(fileNameNoExtension.Remove(index)); + } + } + } + + internal void GoBackSeconds(double seconds) + { + if (mediaPlayer.CurrentPosition > seconds) + { + mediaPlayer.CurrentPosition -= seconds; + } + else + { + mediaPlayer.CurrentPosition = 0; + } + + ShowSubtitle(); + } + + private void ButtonStartHalfASecondBackClick(object sender, EventArgs e) + { + GoBackSeconds(0.5); + } + + private void ButtonStartThreeSecondsBackClick(object sender, EventArgs e) + { + GoBackSeconds(3.0); + } + + private void ButtonStartOneMinuteBackClick(object sender, EventArgs e) + { + GoBackSeconds(60); + } + + private void ButtonStartHalfASecondAheadClick(object sender, EventArgs e) + { + GoBackSeconds(-0.5); + } + + private void ButtonStartThreeSecondsAheadClick(object sender, EventArgs e) + { + GoBackSeconds(-3); + } + + private void ButtonStartOneMinuteAheadClick(object sender, EventArgs e) + { + GoBackSeconds(-60); + } + + private void ShowSubtitleTimerTick(object sender, EventArgs e) + { + ShowSubtitleTimer.Stop(); + + if (_subtitle == null || _subtitle.Paragraphs.Count == 0) + { + ShowSubtitleTimer.Interval = 250; + } + else + { + ShowSubtitleTimer.Interval = 17; + } + + if (mediaPlayer.VideoPlayer != null) + { + int oldIndex = FirstSelectedIndex; + int index = ShowSubtitle(); + if (index != -1 && checkBoxSyncListViewWithVideoWhilePlaying.Checked && oldIndex != index) + { + if ((DateTime.UtcNow.Ticks - _lastTextKeyDownTicks) > 10000 * 700) // only if last typed char was entered > 700 milliseconds + { + if (_endSeconds <= 0 || !checkBoxAutoRepeatOn.Checked) + { + if (!timerAutoDuration.Enabled && !mediaPlayer.IsPaused && (mediaPlayer.CurrentPosition > 0.2 || index > 0)) + { + SubtitleListview1.SelectIndexAndEnsureVisibleFaster(index); + } + } + } + } + } + + var currentChanged = _changeSubtitleHash != _subtitle.GetFastHashCode(GetCurrentEncoding().BodyName); + var originalActive = Configuration.Settings.General.AllowEditOfOriginalSubtitle && + _subtitleAlternate != null && + _subtitleAlternate.Paragraphs.Count > 0; + var originalChanged = originalActive && + _changeAlternateSubtitleHash != _subtitleAlternate.GetFastHashCode(GetCurrentEncoding().BodyName); + if (currentChanged || originalChanged) + { + AddTitleBarChangeAsterisk(currentChanged, originalChanged, originalActive); + AutoSave(); + } + else if (Text.Contains('*')) + { + Text = Text.RemoveChar('*').TrimEnd(); + } + + ShowSubtitleTimer.Start(); + } + + private void AddTitleBarChangeAsterisk(bool currentChanged, bool originalChanged, bool originalActive) + { + if (Configuration.Settings.General.TitleBarAsterisk.Equals("before", StringComparison.Ordinal)) + { + if (!Text.Contains('*')) + { + Text = "*" + Text; + } + } + else if (Configuration.Settings.General.TitleBarAsterisk.Equals("after", StringComparison.Ordinal)) + { + var s = Text.RemoveChar('*').TrimEnd(); + if (currentChanged && !originalActive || originalChanged) + { + var length = Title.Length; + if (s.Length > length) + { + s = s.Substring(0, s.Length - length).TrimEnd(' ', '*', '-') + "* - " + Title; + } + } + if (currentChanged) + { + s = s.Replace(" + ", "* + "); + } + + Text = s; + } + } + + private void HideVideoPlayer() + { + mediaPlayer.Pause(); + + int textHeight = splitContainerListViewAndText.Height - splitContainerListViewAndText.SplitterDistance; + + splitContainer1.Panel2Collapsed = true; + splitContainerMain.Panel2Collapsed = true; + Main_Resize(null, null); + + splitContainerListViewAndText.SplitterDistance = splitContainerListViewAndText.Height - textHeight; + } + + private void ShowVideoPlayer() + { + if (_isVideoControlsUndocked) + { + ShowHideUndockedVideoControls(); + } + else + { + if (toolStripButtonToggleVideo.Checked && toolStripButtonToggleWaveform.Checked) + { + splitContainer1.Panel2Collapsed = false; + MoveVideoUp(); + } + else + { + splitContainer1.Panel2Collapsed = true; + MoveVideoDown(); + } + + splitContainerMain.Panel2Collapsed = false; + if (toolStripButtonToggleVideo.Checked) + { + if (audioVisualizer.Visible) + { + audioVisualizer.Left = tabControlButtons.Left + tabControlButtons.Width + 5; + } + else + { + panelVideoPlayer.Left = tabControlButtons.Left + tabControlButtons.Width + 5; + } + } + else if (audioVisualizer.Visible) + { + audioVisualizer.Left = tabControlButtons.Left + tabControlButtons.Width + 5; + } + + audioVisualizer.Width = groupBoxVideo.Width - (audioVisualizer.Left + 10); + + checkBoxSyncListViewWithVideoWhilePlaying.Left = tabControlButtons.Left + tabControlButtons.Width + 5; + panelWaveformControls.Left = audioVisualizer.Left; + trackBarWaveformPosition.Left = panelWaveformControls.Left + panelWaveformControls.Width + 5; + trackBarWaveformPosition.Width = audioVisualizer.Left + audioVisualizer.Width - trackBarWaveformPosition.Left + 5; + } + + if (mediaPlayer.VideoPlayer == null && !string.IsNullOrEmpty(_fileName) && string.IsNullOrEmpty(VideoFileName) && !Configuration.Settings.General.DisableVideoAutoLoading) + { + TryToFindAndOpenVideoFile(Utilities.GetPathAndFileNameWithoutExtension(_fileName)); + } + + Main_Resize(null, null); + } + + private void ShowHideUndockedVideoControls() + { + if (_videoPlayerUndocked == null || _videoPlayerUndocked.IsDisposed) + { + UnDockVideoPlayer(); + } + + _videoPlayerUndocked.Visible = false; + if (toolStripButtonToggleVideo.Checked) + { + _videoPlayerUndocked.Show(this); + if (_videoPlayerUndocked.WindowState == FormWindowState.Minimized) + { + _videoPlayerUndocked.WindowState = FormWindowState.Normal; + } + } + + if (_waveformUndocked == null || _waveformUndocked.IsDisposed) + { + UnDockWaveform(); + } + + _waveformUndocked.Visible = false; + if (toolStripButtonToggleWaveform.Checked) + { + _waveformUndocked.Show(this); + if (_waveformUndocked.WindowState == FormWindowState.Minimized) + { + _waveformUndocked.WindowState = FormWindowState.Normal; + } + } + + if (toolStripButtonToggleVideo.Checked || toolStripButtonToggleWaveform.Checked) + { + if (_videoControlsUndocked == null || _videoControlsUndocked.IsDisposed) + { + UnDockVideoButtons(); + } + + _videoControlsUndocked.Visible = false; + _videoControlsUndocked.Show(this); + } + else + { + if (_videoControlsUndocked != null && !_videoControlsUndocked.IsDisposed) + { + _videoControlsUndocked.Visible = false; + } + } + } + + private void MoveVideoUp() + { + if (splitContainer1.Panel2.Controls.Count == 0) + { + var control = panelVideoPlayer; + groupBoxVideo.Controls.Remove(control); + splitContainer1.Panel2.Controls.Add(control); + } + + panelVideoPlayer.Top = 0; + panelVideoPlayer.Left = 0; + panelVideoPlayer.Height = splitContainer1.Panel2.Height - 2; + panelVideoPlayer.Width = splitContainer1.Panel2.Width - 2; + } + + private void MoveVideoDown() + { + if (splitContainer1.Panel2.Controls.Count > 0) + { + var control = panelVideoPlayer; + splitContainer1.Panel2.Controls.Clear(); + groupBoxVideo.Controls.Add(control); + } + + panelVideoPlayer.Top = 32; + panelVideoPlayer.Left = tabControlButtons.Left + tabControlButtons.Width + 5; + panelVideoPlayer.Height = groupBoxVideo.Height - (panelVideoPlayer.Top + 5); + panelVideoPlayer.Width = groupBoxVideo.Width - (panelVideoPlayer.Left + 5); + } + + private void FixLargeFonts() + { + using (var graphics = CreateGraphics()) + { + var textSize = graphics.MeasureString(buttonPlayPrevious.Text, Font); + if (textSize.Height > buttonPlayPrevious.Height - 4) + { + int newButtonHeight = 23; + UiUtil.SetButtonHeight(this, newButtonHeight, -4); + + // List view + SubtitleListview1.InitializeTimestampColumnWidths(this); + const int adjustUp = 8; + SubtitleListview1.Height = SubtitleListview1.Height - adjustUp; + groupBoxEdit.Top = groupBoxEdit.Top - adjustUp; + groupBoxEdit.Height = groupBoxEdit.Height + adjustUp; + numericUpDownDuration.Left = timeUpDownStartTime.Left + timeUpDownStartTime.Width; + numericUpDownDuration.Width = numericUpDownDuration.Width + 5; + labelDuration.Left = numericUpDownDuration.Left - 3; + + // Video controls - Create + timeUpDownVideoPosition.Left = labelVideoPosition.Left + labelVideoPosition.Width; + int buttonWidth = labelVideoPosition.Width + timeUpDownVideoPosition.Width; + buttonInsertNewText.Width = buttonWidth; + buttonBeforeText.Width = buttonWidth; + buttonGotoSub.Width = buttonWidth; + buttonSetStartTime.Width = buttonWidth; + buttonSetEnd.Width = buttonWidth; + int FKeyLeft = buttonInsertNewText.Left + buttonInsertNewText.Width; + labelCreateF9.Left = FKeyLeft; + labelCreateF10.Left = FKeyLeft; + labelCreateF11.Left = FKeyLeft; + labelCreateF12.Left = FKeyLeft; + buttonForward1.Left = buttonInsertNewText.Left + buttonInsertNewText.Width - buttonForward1.Width; + numericUpDownSec1.Width = buttonInsertNewText.Width - (numericUpDownSec1.Left + buttonForward1.Width); + buttonForward2.Left = buttonInsertNewText.Left + buttonInsertNewText.Width - buttonForward2.Width; + numericUpDownSec2.Width = buttonInsertNewText.Width - (numericUpDownSec2.Left + buttonForward2.Width); + + // Video controls - Adjust + timeUpDownVideoPositionAdjust.Left = labelVideoPosition2.Left + labelVideoPosition2.Width; + buttonSetStartAndOffsetRest.Width = buttonWidth; + buttonSetEndAndGoToNext.Width = buttonWidth; + buttonAdjustSetStartTime.Width = buttonWidth; + buttonAdjustSetEndTime.Width = buttonWidth; + buttonAdjustPlayBefore.Width = buttonWidth; + buttonAdjustGoToPosAndPause.Width = buttonWidth; + labelAdjustF9.Left = FKeyLeft; + labelAdjustF10.Left = FKeyLeft; + labelAdjustF11.Left = FKeyLeft; + labelAdjustF12.Left = FKeyLeft; + buttonAdjustSecForward1.Left = buttonInsertNewText.Left + buttonInsertNewText.Width - buttonAdjustSecForward1.Width; + numericUpDownSecAdjust1.Width = buttonInsertNewText.Width - (numericUpDownSecAdjust2.Left + buttonAdjustSecForward1.Width); + buttonAdjustSecForward2.Left = buttonInsertNewText.Left + buttonInsertNewText.Width - buttonAdjustSecForward2.Width; + numericUpDownSecAdjust2.Width = buttonInsertNewText.Width - (numericUpDownSecAdjust2.Left + buttonAdjustSecForward2.Width); + + tabControl1_SelectedIndexChanged(null, null); + } + } + } + + private void Main_Resize(object sender, EventArgs e) + { + if (_loading) + { + return; + } + + if (WindowState == FormWindowState.Maximized) + { + Main_ResizeEnd(sender, e); + return; + } + + panelVideoPlayer.Invalidate(); + } + + private void Main_ResizeEnd(object sender, EventArgs e) + { + if (_loading) + { + return; + } + + panelVideoPlayer.Invalidate(); + MainResize(); + + // Due to strange bug in listview when maximizing + SaveSubtitleListviewIndices(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + SubtitleListview1.SelectIndexAndEnsureVisible(_subtitleListViewIndex, true); + + panelVideoPlayer.Refresh(); + } + + private void MainResize() + { + var tbText = textBoxListViewText; + var tbOriginal = textBoxListViewTextAlternate; + int firstLeft = 236; + + var lbText = labelText; + var lbTextOriginal = labelAlternateText; + + var lbSingleLine = labelTextLineLengths; + var lbSingleLineOriginal = labelTextAlternateLineLengths; + + tbText.Left = firstLeft; + tbOriginal.Left = firstLeft; + lbText.Left = firstLeft; + lbTextOriginal.Left = firstLeft; + tbText.Width = groupBoxEdit.Width - (tbText.Left + 10 + (groupBoxEdit.Width - buttonUnBreak.Left)); + + if (Configuration.Settings.General.RightToLeftMode && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) + { + tbText = textBoxListViewTextAlternate; + tbOriginal = textBoxListViewText; + + lbText = labelAlternateText; + lbTextOriginal = labelText; + + lbSingleLine = labelTextAlternateLineLengths; + lbSingleLineOriginal = labelTextLineLengths; + } + else + { + labelTextLineLengths.Left = firstLeft; + } + + tbText.Left = firstLeft; + lbText.Left = firstLeft; + lbSingleLine.Left = firstLeft; + + if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0 && + textBoxListViewTextAlternate.Visible) + { + tbText.Width = (groupBoxEdit.Width - (tbText.Left + 10)) / 2; + tbOriginal.Left = tbText.Left + tbText.Width + 3; + lbTextOriginal.Left = tbOriginal.Left; + + tbOriginal.Width = tbText.Width; + + labelAlternateCharactersPerSecond.Left = tbOriginal.Left + (tbOriginal.Width - labelAlternateCharactersPerSecond.Width); + lbSingleLineOriginal.Left = tbOriginal.Left; + labelAlternateSingleLine.Left = labelTextAlternateLineLengths.Left + labelTextAlternateLineLengths.Width; + labelAlternateSingleLinePixels.Left = labelAlternateSingleLine.Left + labelAlternateSingleLine.Width + 10; + labelTextAlternateLineTotal.Left = tbOriginal.Left + (tbOriginal.Width - labelTextAlternateLineTotal.Width); + if (textBoxListViewText.Width / 2.1 < labelTextLineLengths.Width) + { + labelTextAlternateLineTotal.Visible = false; + } + else + { + labelTextAlternateLineTotal.Visible = true; + } + + if (textBoxListViewText.Width / 3 < labelTextLineLengths.Width) + { + labelAlternateSingleLinePixels.Visible = false; + } + else + { + labelAlternateSingleLinePixels.Visible = Configuration.Settings.Tools.ListViewSyntaxColorWideLines; + } + } + + labelAlternateCharactersPerSecond.Top = labelCharactersPerSecond.Top; + labelCharactersPerSecond.Left = tbText.Left + (tbText.Width - labelCharactersPerSecond.Width); + labelTextLineTotal.Left = tbText.Left + (tbText.Width - labelTextLineTotal.Width); + SubtitleListview1.AutoSizeAllColumns(this); + + if (textBoxListViewText.Width / 2.1 < labelTextLineLengths.Width) + { + labelTextLineTotal.Visible = false; + } + else + { + labelTextLineTotal.Visible = true; + } + + if (textBoxListViewText.Width / 3 < labelTextLineLengths.Width) + { + labelSingleLinePixels.Visible = false; + } + else + { + labelSingleLinePixels.Visible = Configuration.Settings.Tools.ListViewSyntaxColorWideLines; + } + + FixRightToLeftDependingOnLanguage(); + } + + private void FixRightToLeftDependingOnLanguage() + { + if (Configuration.Settings.General.RightToLeftMode) + { + if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) + { + if (LanguageAutoDetect.CouldBeRightToLeftLanguage(_subtitleAlternate)) + { + textBoxListViewTextAlternate.RightToLeft = RightToLeft.Yes; + } + else + { + textBoxListViewTextAlternate.RightToLeft = RightToLeft.No; + } + } + + if (LanguageAutoDetect.CouldBeRightToLeftLanguage(_subtitle)) + { + textBoxListViewText.RightToLeft = RightToLeft.Yes; + textBoxSource.RightToLeft = RightToLeft.Yes; + } + else + { + + textBoxListViewText.RightToLeft = RightToLeft.No; + textBoxSource.RightToLeft = RightToLeft.No; + } + } + else + { + textBoxListViewText.RightToLeft = RightToLeft.No; + textBoxSource.RightToLeft = RightToLeft.No; + } + } + + private void PlayCurrent() + { + if (_subtitleListViewIndex >= 0) + { + GotoSubtitleIndex(_subtitleListViewIndex); + textBoxListViewText.Focus(); + ReadyAutoRepeat(); + PlayPart(_subtitle.Paragraphs[_subtitleListViewIndex]); + } + } + + private void ReadyAutoRepeat() + { + if (checkBoxAutoRepeatOn.Checked) + { + _repeatCount = int.Parse(comboBoxAutoRepeat.Text); + } + else + { + _repeatCount = -1; + } + + if (mediaPlayer.VideoPlayer != null) + { + labelStatus.Text = _language.VideoControls.Playing; + } + } + + private void PlayNext() + { + int newIndex = _subtitleListViewIndex + 1; + if (newIndex < _subtitle.Paragraphs.Count) + { + foreach (ListViewItem item in SubtitleListview1.SelectedItems) + { + item.Selected = false; + } + + SubtitleListview1.Items[newIndex].Selected = true; + SubtitleListview1.Items[newIndex].EnsureVisible(); + SubtitleListview1.Items[newIndex].Focused = true; + textBoxListViewText.Focus(); + textBoxListViewText.SelectAll(); + _subtitleListViewIndex = newIndex; + GotoSubtitleIndex(newIndex); + ShowSubtitle(); + PlayCurrent(); + } + } + + private void PlayPrevious() + { + if (_subtitleListViewIndex > 0) + { + int newIndex = _subtitleListViewIndex - 1; + foreach (ListViewItem item in SubtitleListview1.SelectedItems) + { + item.Selected = false; + } + + SubtitleListview1.Items[newIndex].Selected = true; + SubtitleListview1.Items[newIndex].EnsureVisible(); + SubtitleListview1.Items[newIndex].Focused = true; + textBoxListViewText.Focus(); + textBoxListViewText.SelectAll(); + GotoSubtitleIndex(newIndex); + ShowSubtitle(); + _subtitleListViewIndex = newIndex; + PlayCurrent(); + } + } + + private void GotoSubtitleIndex(int index) + { + if (mediaPlayer.VideoPlayer != null && mediaPlayer.Duration > 0) + { + mediaPlayer.CurrentPosition = _subtitle.Paragraphs[index].StartTime.TotalSeconds; + } + } + + private void PlayPart(Paragraph paragraph) + { + if (mediaPlayer.VideoPlayer != null) + { + double startSeconds = paragraph.StartTime.TotalSeconds; + if (startSeconds > 0.05) + { + startSeconds -= 0.05; // go a little back + } + + _endSeconds = paragraph.EndTime.TotalSeconds; + if (mediaPlayer.Duration > _endSeconds + 0.05) + { + _endSeconds += 0.05; // go a little forward + } + + mediaPlayer.CurrentPosition = startSeconds; + ShowSubtitle(); + mediaPlayer.Play(); + } + } + + private void buttonSetStartTime_Click(object sender, EventArgs e) + { + SetStartTime(false, mediaPlayer.CurrentPosition); + } + + private void SetStartTime(bool adjustEndTime, double videoPosition) + { + if (SubtitleListview1.SelectedItems.Count == 1) + { + timeUpDownStartTime.MaskedTextBox.TextChanged -= MaskedTextBoxTextChanged; + int index = SubtitleListview1.SelectedItems[0].Index; + var p = _subtitle.Paragraphs[index]; + var oldParagraph = new Paragraph(p, false); + if (oldParagraph.StartTime.IsMaxTime || oldParagraph.EndTime.IsMaxTime) + { + adjustEndTime = true; + } + + if (!mediaPlayer.IsPaused) + { + videoPosition -= Configuration.Settings.General.SetStartEndHumanDelay / TimeCode.BaseUnit; + } + + MakeHistoryForUndoOnlyIfNotResent(string.Format(_language.VideoControls.BeforeChangingTimeInWaveformX, "#" + p.Number + " " + p.Text)); + + timeUpDownStartTime.TimeCode = TimeCode.FromSeconds(videoPosition); + + var duration = p.Duration.TotalMilliseconds; + + p.StartTime.TotalMilliseconds = videoPosition * TimeCode.BaseUnit; + if (adjustEndTime) + { + p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + duration; + } + + if (oldParagraph.StartTime.IsMaxTime) + { + p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(p.Text); + } + + SubtitleListview1.SetStartTimeAndDuration(index, p, _subtitle.GetParagraphOrDefault(index + 1), _subtitle.GetParagraphOrDefault(index - 1)); + timeUpDownStartTime.TimeCode = p.StartTime; + timeUpDownStartTime.MaskedTextBox.TextChanged += MaskedTextBoxTextChanged; + + if (!adjustEndTime) + { + SetDurationInSeconds(p.Duration.TotalSeconds); + } + + UpdateOriginalTimeCodes(oldParagraph); + ShowSource(); + RefreshSelectedParagraph(); + } + } + + private void ButtonSetEndClick(object sender, EventArgs e) + { + if (SubtitleListview1.SelectedItems.Count == 1) + { + double videoPosition = mediaPlayer.CurrentPosition; + if (!mediaPlayer.IsPaused) + { + videoPosition -= Configuration.Settings.General.SetStartEndHumanDelay / TimeCode.BaseUnit; + } + + int index = SubtitleListview1.SelectedItems[0].Index; + MakeHistoryForUndoOnlyIfNotResent(string.Format(_language.VideoControls.BeforeChangingTimeInWaveformX, "#" + _subtitle.Paragraphs[index].Number + " " + _subtitle.Paragraphs[index].Text)); + + if (_subtitle.Paragraphs[index].StartTime.IsMaxTime) + { + timeUpDownStartTime.MaskedTextBox.TextChanged -= MaskedTextBoxTextChanged; + _subtitle.Paragraphs[index].EndTime.TotalSeconds = videoPosition; + _subtitle.Paragraphs[index].StartTime.TotalMilliseconds = _subtitle.Paragraphs[index].EndTime.TotalMilliseconds - Utilities.GetOptimalDisplayMilliseconds(_subtitle.Paragraphs[index].Text); + if (_subtitle.Paragraphs[index].StartTime.TotalMilliseconds < 0) + { + _subtitle.Paragraphs[index].StartTime.TotalMilliseconds = 0; + } + + timeUpDownStartTime.TimeCode = _subtitle.Paragraphs[index].StartTime; + SubtitleListview1.SetStartTimeAndDuration(index, _subtitle.Paragraphs[index], _subtitle.GetParagraphOrDefault(index + 1), _subtitle.GetParagraphOrDefault(index - 1)); + timeUpDownStartTime.MaskedTextBox.TextChanged += MaskedTextBoxTextChanged; + } + else + { + _subtitle.Paragraphs[index].EndTime = TimeCode.FromSeconds(videoPosition); + } + + SubtitleListview1.SetStartTimeAndDuration(index, _subtitle.Paragraphs[index], _subtitle.GetParagraphOrDefault(index + 1), _subtitle.GetParagraphOrDefault(index - 1)); + SetDurationInSeconds(_subtitle.Paragraphs[index].Duration.TotalSeconds); + } + } + + private void ButtonInsertNewTextClick(object sender, EventArgs e) + { + mediaPlayer.Pause(); + + var newParagraph = InsertNewTextAtVideoPosition(); + + textBoxListViewText.Focus(); + timerAutoDuration.Start(); + + ShowStatus(string.Format(_language.VideoControls.NewTextInsertAtX, newParagraph.StartTime.ToShortString())); + } + + private Paragraph InsertNewTextAtVideoPosition() + { + // current movie Position + double videoPositionInMilliseconds = mediaPlayer.CurrentPosition * TimeCode.BaseUnit; + if (!mediaPlayer.IsPaused && videoPositionInMilliseconds > Configuration.Settings.General.SetStartEndHumanDelay) + { + videoPositionInMilliseconds -= Configuration.Settings.General.SetStartEndHumanDelay; + } + + var tc = new TimeCode(videoPositionInMilliseconds); + MakeHistoryForUndo(_language.BeforeInsertSubtitleAtVideoPosition + " " + tc); + + // find index where to insert + int index = 0; + foreach (var p in _subtitle.Paragraphs) + { + if (p.StartTime.TotalMilliseconds > videoPositionInMilliseconds) + { + break; + } + + index++; + } + + // prevent overlap + var endTotalMilliseconds = videoPositionInMilliseconds + Configuration.Settings.General.NewEmptyDefaultMs; + var next = _subtitle.GetParagraphOrDefault(index); + if (next != null) + { + if (endTotalMilliseconds > next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines) + { + endTotalMilliseconds = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; + } + } + + // create and insert + var newParagraph = new Paragraph(string.Empty, videoPositionInMilliseconds, endTotalMilliseconds); + SetStyleForNewParagraph(newParagraph, index); + if (_networkSession != null) + { + _networkSession.TimerStop(); + NetworkGetSendUpdates(new List(), index, newParagraph); + } + else + { + _subtitle.Paragraphs.Insert(index, newParagraph); + + // check if original is available - and insert new paragraph in the original too + if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) + { + _subtitleAlternate.InsertParagraphInCorrectTimeOrder(new Paragraph(newParagraph)); + _subtitleAlternate.Renumber(); + } + + _subtitleListViewIndex = -1; + _subtitle.Renumber(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + } + + SubtitleListview1.SelectIndexAndEnsureVisible(index, true); + return newParagraph; + } + + private void timerAutoDuration_Tick(object sender, EventArgs e) + { + labelAutoDuration.Visible = !labelAutoDuration.Visible; + if (SubtitleListview1.SelectedItems.Count > 0) + { + try + { + int firstSelectedIndex = SubtitleListview1.SelectedItems[0].Index; + var currentParagraph = _subtitle.Paragraphs[firstSelectedIndex]; + var nextParagraph = _subtitle.GetParagraphOrDefault(firstSelectedIndex + 1); + double duration = Utilities.GetOptimalDisplayMilliseconds(textBoxListViewText.Text); + if (currentParagraph.StartTime.TotalMilliseconds + duration + Configuration.Settings.General.MinimumMillisecondsBetweenLines > nextParagraph?.StartTime.TotalMilliseconds) + { + var newEndTime = nextParagraph.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; + if (newEndTime - currentParagraph.StartTime.TotalMilliseconds > 100) + { + duration = newEndTime - currentParagraph.StartTime.TotalMilliseconds; + } + else + { + return; // too close to next subtitle + } + } + + SetDurationInSeconds(duration / TimeCode.BaseUnit); + currentParagraph.EndTime.TotalMilliseconds = currentParagraph.StartTime.TotalMilliseconds + duration; + SubtitleListview1.SetDuration(firstSelectedIndex, currentParagraph, _subtitle.GetParagraphOrDefault(firstSelectedIndex + 1)); + } + catch + { + // ignore + } + } + } + + private void buttonBeforeText_Click(object sender, EventArgs e) + { + if (SubtitleListview1.SelectedItems.Count > 0) + { + int index = SubtitleListview1.SelectedItems[0].Index; + + mediaPlayer.Pause(); + double pos = _subtitle.Paragraphs[index].StartTime.TotalSeconds; + if (pos > 1) + { + mediaPlayer.CurrentPosition = (_subtitle.Paragraphs[index].StartTime.TotalSeconds) - 0.5; + } + else + { + mediaPlayer.CurrentPosition = _subtitle.Paragraphs[index].StartTime.TotalSeconds; + } + + mediaPlayer.Play(); + } + } + + private void GotoSubPositionAndPause() + { + GotoSubPositionAndPause(0); + } + + private void GotoSubPositionAndPause(double adjustSeconds) + { + if (SubtitleListview1.SelectedItems.Count > 0) + { + int index = SubtitleListview1.SelectedItems[0].Index; + if (index == -1 || index >= _subtitle.Paragraphs.Count) + { + return; + } + + var p = _subtitle.Paragraphs[index]; + mediaPlayer.Pause(); + if (p.StartTime.IsMaxTime) + { + return; + } + + double newPos = p.StartTime.TotalSeconds + adjustSeconds; + if (newPos < 0) + { + newPos = 0; + } + + mediaPlayer.CurrentPosition = newPos; + ShowSubtitle(); + + double startPos = mediaPlayer.CurrentPosition - 1; + if (startPos < 0) + { + startPos = 0; + } + + SetWaveformPosition(startPos, mediaPlayer.CurrentPosition, index); + } + } + + private void buttonGotoSub_Click(object sender, EventArgs e) + { + GotoSubPositionAndPause(); + } + + private void buttonOpenVideo_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(openFileDialog1.InitialDirectory) && !string.IsNullOrEmpty(_fileName)) + { + openFileDialog1.InitialDirectory = Path.GetDirectoryName(_fileName); + } + + openFileDialog1.Title = _languageGeneral.OpenVideoFileTitle; + openFileDialog1.FileName = string.Empty; + openFileDialog1.Filter = Utilities.GetVideoFileFilter(true); + + openFileDialog1.FileName = string.Empty; + if (openFileDialog1.ShowDialog() == DialogResult.OK) + { + if (audioVisualizer.WavePeaks != null) + { + audioVisualizer.WavePeaks = null; + audioVisualizer.SetSpectrogram(null); + audioVisualizer.SceneChanges = new List(); + audioVisualizer.Chapters = new List(); + } + + openFileDialog1.InitialDirectory = Path.GetDirectoryName(openFileDialog1.FileName); + if (!panelVideoPlayer.Visible) + { + toolStripButtonToggleVideo_Click(null, null); + } + + OpenVideo(openFileDialog1.FileName); + } + } + + private void toolStripButtonToggleVideo_Click(object sender, EventArgs e) + { + toolStripButtonToggleVideo.Checked = !toolStripButtonToggleVideo.Checked; + panelVideoPlayer.Visible = toolStripButtonToggleVideo.Checked; + mediaPlayer.BringToFront(); + if (!toolStripButtonToggleVideo.Checked && !toolStripButtonToggleWaveform.Checked) + { + if (_isVideoControlsUndocked) + { + ShowHideUndockedVideoControls(); + } + else + { + HideVideoPlayer(); + } + } + else + { + ShowVideoPlayer(); + } + + Configuration.Settings.General.ShowVideoPlayer = toolStripButtonToggleVideo.Checked; + if (!_loading) + { + Refresh(); + } + } + + private void toolStripButtonToggleWaveform_Click(object sender, EventArgs e) + { + toolStripButtonToggleWaveform.Checked = !toolStripButtonToggleWaveform.Checked; + audioVisualizer.Visible = toolStripButtonToggleWaveform.Checked; + trackBarWaveformPosition.Visible = toolStripButtonToggleWaveform.Checked; + panelWaveformControls.Visible = toolStripButtonToggleWaveform.Checked; + if (!toolStripButtonToggleWaveform.Checked && !toolStripButtonToggleVideo.Checked) + { + if (_isVideoControlsUndocked) + { + ShowHideUndockedVideoControls(); + } + else + { + HideVideoPlayer(); + } + } + else + { + ShowVideoPlayer(); + } + + Configuration.Settings.General.ShowAudioVisualizer = toolStripButtonToggleWaveform.Checked; + Refresh(); + } + + public void ShowEarlierOrLater(double adjustMilliseconds, SelectionChoice selection) + { + var tc = new TimeCode(adjustMilliseconds); + MakeHistoryForUndo(_language.BeforeShowSelectedLinesEarlierLater + ": " + tc); + if (adjustMilliseconds < 0) + { + if (selection == SelectionChoice.AllLines) + { + ShowStatus(string.Format(_language.ShowAllLinesXSecondsLinesEarlier, adjustMilliseconds / -TimeCode.BaseUnit)); + } + else if (selection == SelectionChoice.SelectionOnly) + { + ShowStatus(string.Format(_language.ShowSelectedLinesXSecondsLinesEarlier, adjustMilliseconds / -TimeCode.BaseUnit)); + } + else if (selection == SelectionChoice.SelectionAndForward) + { + ShowStatus(string.Format(_language.ShowSelectionAndForwardXSecondsLinesEarlier, adjustMilliseconds / -TimeCode.BaseUnit)); + } + } + else + { + if (selection == SelectionChoice.AllLines) + { + ShowStatus(string.Format(_language.ShowAllLinesXSecondsLinesLater, adjustMilliseconds / TimeCode.BaseUnit)); + } + else if (selection == SelectionChoice.SelectionOnly) + { + ShowStatus(string.Format(_language.ShowSelectedLinesXSecondsLinesLater, adjustMilliseconds / TimeCode.BaseUnit)); + } + else if (selection == SelectionChoice.SelectionAndForward) + { + ShowStatus(string.Format(_language.ShowSelectionAndForwardXSecondsLinesLater, adjustMilliseconds / TimeCode.BaseUnit)); + } + } + + int startFrom = 0; + if (selection == SelectionChoice.SelectionAndForward) + { + if (SubtitleListview1.SelectedItems.Count > 0) + { + startFrom = SubtitleListview1.SelectedItems[0].Index; + } + else + { + startFrom = _subtitle.Paragraphs.Count; + } + } + + // don't overlap previous/next + if (selection == SelectionChoice.SelectionOnly && SubtitleListview1.SelectedItems.Count == 1 && + !Configuration.Settings.VideoControls.WaveformAllowOverlap && + GetCurrentSubtitleFormat().GetType() != typeof(AdvancedSubStationAlpha)) + { + var current = _subtitle.GetParagraphOrDefault(FirstSelectedIndex); + if (current != null) + { + if (adjustMilliseconds >= 0) + { + var next = _subtitle.GetParagraphOrDefault(FirstSelectedIndex + 1); + if (next != null && current.EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines > next.StartTime.TotalMilliseconds - adjustMilliseconds) + { + var newAdjustMs = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines - current.EndTime.TotalMilliseconds; + if (newAdjustMs > 0) + { + adjustMilliseconds = newAdjustMs; + } + else + { + return; + } + } + } + else + { + var prev = _subtitle.GetParagraphOrDefault(FirstSelectedIndex - 1); + if (prev != null && current.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines + adjustMilliseconds < prev.EndTime.TotalMilliseconds) + { + var newAdjustMs = prev.EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines - current.StartTime.TotalMilliseconds; + if (newAdjustMs < 0) + { + adjustMilliseconds = newAdjustMs; + } + else + { + return; + } + } + } + } + } + + SubtitleListview1.BeginUpdate(); + for (int i = startFrom; i < _subtitle.Paragraphs.Count; i++) + { + switch (selection) + { + case SelectionChoice.SelectionOnly: + if (SubtitleListview1.Items[i].Selected) + { + ShowEarlierOrLaterParagraph(adjustMilliseconds, i); + } + + break; + case SelectionChoice.AllLines: + case SelectionChoice.SelectionAndForward: + ShowEarlierOrLaterParagraph(adjustMilliseconds, i); + break; + } + } + + SubtitleListview1.EndUpdate(); + RefreshSelectedParagraph(); + UpdateSourceView(); + UpdateListSyntaxColoring(); + } + + private void ShowEarlierOrLaterParagraph(double adjustMilliseconds, int i) + { + var p = _subtitle.GetParagraphOrDefault(i); + if (p != null && !p.StartTime.IsMaxTime) + { + if (_subtitleAlternate != null) + { + var original = Utilities.GetOriginalParagraph(i, p, _subtitleAlternate.Paragraphs); + if (original != null) + { + original.StartTime.TotalMilliseconds += adjustMilliseconds; + original.EndTime.TotalMilliseconds += adjustMilliseconds; + } + } + + p.StartTime.TotalMilliseconds += adjustMilliseconds; + p.EndTime.TotalMilliseconds += adjustMilliseconds; + SubtitleListview1.SetStartTimeAndDuration(i, p, _subtitle.GetParagraphOrDefault(i + 1), _subtitle.GetParagraphOrDefault(i - 1)); + } + } + + private void UpdateSourceView() + { + if (tabControlSubtitle.SelectedIndex == TabControlSourceView) + { + ShowSource(); + } + } + + private void toolStripMenuItemAdjustAllTimes_Click(object sender, EventArgs e) + { + if (SubtitleListview1.SelectedItems.Count > 1) + { + ShowSelectedLinesEarlierlaterToolStripMenuItemClick(null, null); + return; + } + + if (!IsSubtitleLoaded) + { + DisplaySubtitleNotLoadedMessage(); + return; + } + + mediaPlayer.Pause(); + + if (_showEarlierOrLater != null && !_showEarlierOrLater.IsDisposed) + { + _showEarlierOrLater.WindowState = FormWindowState.Normal; + _showEarlierOrLater.Focus(); + return; + } + + _showEarlierOrLater = new ShowEarlierLater(); + if (!_showEarlierOrLater.IsPositionAndSizeSaved) + { + _showEarlierOrLater.Top = Top + 100; + _showEarlierOrLater.Left = Left + Width / 2 - _showEarlierOrLater.Width / 3; + } + + SaveSubtitleListviewIndices(); + _showEarlierOrLater.Initialize(ShowEarlierOrLater, false); + _showEarlierOrLater.Show(this); + } + + private void timer1_Tick(object sender, EventArgs e) + { + if (mediaPlayer.VideoPlayer != null) + { + if (!mediaPlayer.IsPaused) + { + timeUpDownVideoPosition.Enabled = false; + timeUpDownVideoPositionAdjust.Enabled = false; + + if (_endSeconds >= 0 && mediaPlayer.CurrentPosition > _endSeconds && !(AutoRepeatContinueOn || AutoRepeatOn)) + { + mediaPlayer.Pause(); + if (_endSecondsNewPosition >= 0 && _endSecondsNewPositionTicks > DateTime.UtcNow.Ticks - (10000 * 900)) // 900 ms + { + mediaPlayer.CurrentPosition = _endSecondsNewPosition; + } + else + { + mediaPlayer.CurrentPosition = _endSeconds + EndDelay; + } + + _endSeconds = -1; + _endSecondsNewPosition = -1; + _endSecondsNewPositionTicks = 0; + } + + if (AutoRepeatContinueOn || AutoRepeatOn) + { + if (_endSeconds >= 0 && mediaPlayer.CurrentPosition > _endSeconds && checkBoxAutoRepeatOn.Checked) + { + mediaPlayer.Pause(); + _endSeconds = -1; + + if (checkBoxAutoRepeatOn.Checked && _repeatCount > 0) + { + if (_repeatCount == 1) + { + labelStatus.Text = _language.VideoControls.RepeatingLastTime; + } + else + { + labelStatus.Text = string.Format(_language.VideoControls.RepeatingXTimesLeft, _repeatCount); + } + + _repeatCount--; + if (_subtitleListViewIndex >= 0 && _subtitleListViewIndex < _subtitle.Paragraphs.Count) + { + PlayPart(_subtitle.Paragraphs[_subtitleListViewIndex]); + } + } + else if (checkBoxAutoContinue.Checked) + { + _autoContinueDelayCount = int.Parse(comboBoxAutoContinue.Text); + if (_repeatCount == 1) + { + labelStatus.Text = _language.VideoControls.AutoContinueInOneSecond; + } + else + { + labelStatus.Text = string.Format(_language.VideoControls.AutoContinueInXSeconds, _autoContinueDelayCount); + } + + timerAutoContinue.Start(); + } + } + } + } + else + { + timeUpDownVideoPosition.Enabled = true; + timeUpDownVideoPositionAdjust.Enabled = true; + } + + int index = ShowSubtitle(); + + double pos = mediaPlayer.CurrentPosition * TimeCode.BaseUnit; + if (!timeUpDownVideoPosition.MaskedTextBox.Focused && timeUpDownVideoPosition.TimeCode.TotalMilliseconds != pos) + { + timeUpDownVideoPosition.TimeCode = new TimeCode(pos); + } + + if (!timeUpDownVideoPositionAdjust.MaskedTextBox.Focused && timeUpDownVideoPositionAdjust.TimeCode.TotalMilliseconds != pos) + { + timeUpDownVideoPositionAdjust.TimeCode = new TimeCode(pos); + } + + mediaPlayer.RefreshProgressBar(); + + trackBarWaveformPosition.ValueChanged -= trackBarWaveformPosition_ValueChanged; + int value = (int)mediaPlayer.CurrentPosition; + if (value > trackBarWaveformPosition.Maximum) + { + value = trackBarWaveformPosition.Maximum; + } + + if (value < trackBarWaveformPosition.Minimum) + { + value = trackBarWaveformPosition.Minimum; + } + + trackBarWaveformPosition.Value = value; + trackBarWaveformPosition.ValueChanged += trackBarWaveformPosition_ValueChanged; + + if (labelNextWord.Visible && _labelNextTicks + 100000000 < DateTime.UtcNow.Ticks) + { + labelNextWord.Visible = false; + } + } + } + + private void StopAutoDuration() + { + timerAutoDuration.Stop(); + labelAutoDuration.Visible = false; + } + + private void textBoxListViewText_Leave(object sender, EventArgs e) + { + StopAutoDuration(); + } + + private void timerAutoContinue_Tick(object sender, EventArgs e) + { + _autoContinueDelayCount--; + + if (_autoContinueDelayCount == 0) + { + timerAutoContinue.Stop(); + + if (timerStillTyping.Enabled) + { + labelStatus.Text = _language.VideoControls.StillTypingAutoContinueStopped; + } + else + { + labelStatus.Text = string.Empty; + PlayNext(); + } + } + else + { + if (_repeatCount == 1) + { + labelStatus.Text = _language.VideoControls.AutoContinueInOneSecond; + } + else + { + labelStatus.Text = string.Format(_language.VideoControls.AutoContinueInXSeconds, _autoContinueDelayCount); + } + } + } + + private void timerStillTyping_Tick(object sender, EventArgs e) + { + timerStillTyping.Stop(); + } + + private void textBoxListViewText_MouseMove(object sender, MouseEventArgs e) + { + if ((AutoRepeatContinueOn || AutoRepeatOn) && !textBoxSearchWord.Focused && textBoxListViewText.Focused) + { + string selectedText = textBoxListViewText.SelectedText; + if (!string.IsNullOrEmpty(selectedText)) + { + selectedText = selectedText.Trim(); + selectedText = selectedText.TrimEnd('.', ',', '!', '?'); + selectedText = selectedText.TrimEnd(); + if (!string.IsNullOrEmpty(selectedText) && selectedText != textBoxSearchWord.Text) + { + textBoxSearchWord.Text = HtmlUtil.RemoveHtmlTags(selectedText); + } + } + } + } + + private void textBoxListViewText_KeyUp(object sender, KeyEventArgs e) + { + textBoxListViewText_MouseMove(sender, null); + textBoxListViewText.ClearUndo(); + UpdatePositionAndTotalLength(labelTextLineTotal, textBoxListViewText); + } + + public void RunTranslateSearch(Action act) + { + var text = textBoxSearchWord.Text; + if (tabControlButtons.SelectedTab != tabPageTranslate) + { + var tb = GetFocusedTextBox(); + if (tb.SelectionLength == 0) + { + text = tb.Text; + } + else + { + text = tb.SelectedText; + } + } + + if (!string.IsNullOrWhiteSpace(text)) + { + act(text); + } + } + + private void buttonGoogleIt_Click(object sender, EventArgs e) + { + RunTranslateSearch((text) => { UiUtil.OpenURL("https://www.google.com/search?q=" + Utilities.UrlEncode(text)); }); + } + + private void buttonGoogleTranslateIt_Click(object sender, EventArgs e) + { + RunTranslateSearch((text) => + { + string languageId = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle); + UiUtil.OpenURL("https://translate.google.com/#auto|" + languageId + "|" + Utilities.UrlEncode(text)); + }); + } + + private void ButtonPlayCurrentClick(object sender, EventArgs e) + { + PlayCurrent(); + } + + private void buttonPlayNext_Click(object sender, EventArgs e) + { + PlayNext(); + } + + private void buttonPlayPrevious_Click(object sender, EventArgs e) + { + PlayPrevious(); + } + + private void buttonStop_Click(object sender, EventArgs e) + { + _endSeconds = -1; + timerAutoContinue.Stop(); + mediaPlayer.Pause(); + labelStatus.Text = string.Empty; + } + + private void fileToolStripMenuItem_DropDownOpening(object sender, EventArgs e) + { + toolStripMenuItemOpenContainingFolder.Visible = !string.IsNullOrEmpty(_fileName) && File.Exists(_fileName); + bool subtitleLoaded = IsSubtitleLoaded; + toolStripMenuItemStatistics.Visible = subtitleLoaded; + toolStripSeparator22.Visible = subtitleLoaded; + toolStripMenuItemExport.Visible = subtitleLoaded; + openOriginalToolStripMenuItem.Visible = subtitleLoaded; + toolStripMenuItemOpenKeepVideo.Visible = VideoFileName != null; + if (subtitleLoaded && Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) + { + saveOriginalToolStripMenuItem.Visible = true; + saveOriginalAstoolStripMenuItem.Visible = true; + removeOriginalToolStripMenuItem.Visible = true; + } + else + { + saveOriginalToolStripMenuItem.Visible = false; + saveOriginalAstoolStripMenuItem.Visible = false; + if (subtitleLoaded && SubtitleListview1.IsAlternateTextColumnVisible && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) + { + removeOriginalToolStripMenuItem.Visible = true; + } + else + { + removeOriginalToolStripMenuItem.Visible = false; + } + } + + var format = GetCurrentSubtitleFormat(); + var ft = format.GetType(); + if (ft == typeof(AdvancedSubStationAlpha)) + { + toolStripMenuItemSubStationAlpha.Visible = true; + toolStripMenuItemSubStationAlpha.Text = _language.Menu.File.AdvancedSubStationAlphaProperties; + + toolStripMenuItemAssStyles.Visible = true; + toolStripMenuItemAssStyles.Text = _language.Menu.ContextMenu.AdvancedSubStationAlphaStyles; + + toolStripMenuItemAssaStyles.Visible = true; + } + else if (ft == typeof(SubStationAlpha)) + { + toolStripMenuItemSubStationAlpha.Visible = true; + toolStripMenuItemSubStationAlpha.Text = _language.Menu.File.SubStationAlphaProperties; + + toolStripMenuItemAssStyles.Visible = true; + toolStripMenuItemAssStyles.Text = _language.Menu.ContextMenu.AdvancedSubStationAlphaStyles; + + toolStripMenuItemAssaStyles.Visible = true; + } + else + { + toolStripMenuItemSubStationAlpha.Visible = false; + toolStripMenuItemAssStyles.Visible = false; + toolStripMenuItemAssaStyles.Visible = false; + } + + if (ft == typeof(Ebu)) + { + toolStripMenuItemEbuProperties.Text = _language.Menu.File.EbuProperties; + toolStripMenuItemEbuProperties.Visible = !string.IsNullOrEmpty(_language.Menu.File.EbuProperties); + } + else + { + toolStripMenuItemEbuProperties.Visible = false; + } + + if (ft == typeof(DvdStudioPro) || + ft == typeof(DvdStudioProSpace) || + ft == typeof(DvdStudioProSpaceOne) || + ft == typeof(DvdStudioProSpaceOneSemicolon)) + { + toolStripMenuItemDvdStudioProProperties.Text = _language.Menu.File.DvdStuioProProperties; + toolStripMenuItemDvdStudioProProperties.Visible = true; + } + else + { + toolStripMenuItemDvdStudioProProperties.Visible = false; + } + + if (ft == typeof(DCinemaInterop) || ft == typeof(DCinemaSmpte2014) || ft == typeof(DCinemaSmpte2010) || ft == typeof(DCinemaSmpte2007)) + { + toolStripMenuItemDCinemaProperties.Visible = true; + } + else + { + toolStripMenuItemDCinemaProperties.Visible = false; + } + + if (ft == typeof(TimedText10) || ft == typeof(ItunesTimedText)) + { + toolStripMenuItemTTProperties.Visible = true; + } + else + { + toolStripMenuItemTTProperties.Visible = false; + } + + toolStripMenuItemNuendoProperties.Visible = format.Name == "Nuendo"; + toolStripMenuItemFcpProperties.Visible = ft == typeof(FinalCutProXml); + + toolStripSeparator20.Visible = subtitleLoaded; + } + + private void toolStripMenuItemOpenContainingFolder_Click(object sender, EventArgs e) + { + UiUtil.OpenFolderFromFileName(_fileName); + } + + private void tabControl1_SelectedIndexChanged(object sender, EventArgs e) + { + if (tabControlButtons.SelectedIndex == 0) + { + tabControlButtons.Width = groupBoxTranslateSearch.Left + groupBoxTranslateSearch.Width + 10; + Configuration.Settings.VideoControls.LastActiveTab = "Translate"; + } + else if (tabControlButtons.SelectedIndex == 1) + { + tabControlButtons.Width = buttonInsertNewText.Left + buttonInsertNewText.Width + 35; + Configuration.Settings.VideoControls.LastActiveTab = "Create"; + } + else if (tabControlButtons.SelectedIndex == 2) + { + tabControlButtons.Width = buttonInsertNewText.Left + buttonInsertNewText.Width + 35; + Configuration.Settings.VideoControls.LastActiveTab = "Adjust"; + } + + if (!_isVideoControlsUndocked) + { + if (toolStripButtonToggleWaveform.Checked) + { + audioVisualizer.Left = tabControlButtons.Left + tabControlButtons.Width + 5; + } + + if (!toolStripButtonToggleWaveform.Checked && toolStripButtonToggleVideo.Checked) + { + panelVideoPlayer.Left = tabControlButtons.Left + tabControlButtons.Width + 5; + panelVideoPlayer.Width = groupBoxVideo.Width - (panelVideoPlayer.Left + 10); + } + + audioVisualizer.Width = groupBoxVideo.Width - (audioVisualizer.Left + 10); + panelWaveformControls.Left = audioVisualizer.Left; + trackBarWaveformPosition.Left = panelWaveformControls.Left + panelWaveformControls.Width + 5; + trackBarWaveformPosition.Width = groupBoxVideo.Width - (trackBarWaveformPosition.Left + 10); + Main_Resize(null, null); + checkBoxSyncListViewWithVideoWhilePlaying.Left = tabControlButtons.Left + tabControlButtons.Width + 5; + if (!_loading) + { + Refresh(); + } + } + else if (_videoControlsUndocked != null && !_videoControlsUndocked.IsDisposed) + { + _videoControlsUndocked.Width = tabControlButtons.Width + 20; + _videoControlsUndocked.Height = tabControlButtons.Height + 65; + } + } + + private void buttonSecBack1_Click(object sender, EventArgs e) + { + GoBackSeconds((double)numericUpDownSec1.Value); + } + + private void buttonForward1_Click(object sender, EventArgs e) + { + GoBackSeconds(-(double)numericUpDownSec1.Value); + } + + private void ButtonSetStartAndOffsetRestClick(object sender, EventArgs e) + { + SetStartAndOffsetTheRest(mediaPlayer.CurrentPosition); + } + + private void SetStartAndOffsetTheRest(double videoPosition) + { + if (SubtitleListview1.SelectedItems.Count == 1) + { + bool oldSync = checkBoxSyncListViewWithVideoWhilePlaying.Checked; + checkBoxSyncListViewWithVideoWhilePlaying.Checked = false; + + timeUpDownStartTime.MaskedTextBox.TextChanged -= MaskedTextBoxTextChanged; + int index = SubtitleListview1.SelectedItems[0].Index; + var oldP = new Paragraph(_subtitle.Paragraphs[index]); + if (!mediaPlayer.IsPaused) + { + videoPosition -= Configuration.Settings.General.SetStartEndHumanDelay / TimeCode.BaseUnit; + } + + var tc = TimeCode.FromSeconds(videoPosition); + timeUpDownStartTime.TimeCode = tc; + + MakeHistoryForUndo(_language.BeforeSetStartTimeAndOffsetTheRest + @" " + oldP.Number + @" - " + tc); + + double offset = oldP.StartTime.TotalMilliseconds - tc.TotalMilliseconds; + + if (oldP.StartTime.IsMaxTime) + { + _subtitle.Paragraphs[index].StartTime.TotalSeconds = videoPosition; + _subtitle.Paragraphs[index].EndTime.TotalMilliseconds = _subtitle.Paragraphs[index].StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(_subtitle.Paragraphs[index].Text); + SubtitleListview1.SetStartTimeAndDuration(index, _subtitle.Paragraphs[index], _subtitle.GetParagraphOrDefault(index + 1), _subtitle.GetParagraphOrDefault(index - 1)); + checkBoxSyncListViewWithVideoWhilePlaying.Checked = oldSync; + timeUpDownStartTime.MaskedTextBox.TextChanged += MaskedTextBoxTextChanged; + RefreshSelectedParagraph(); + return; + } + + _subtitle.Paragraphs[index].StartTime = new TimeCode(_subtitle.Paragraphs[index].StartTime.TotalMilliseconds - offset); + _subtitle.Paragraphs[index].EndTime = new TimeCode(_subtitle.Paragraphs[index].EndTime.TotalMilliseconds - offset); + SubtitleListview1.SetStartTimeAndDuration(index, _subtitle.Paragraphs[index], _subtitle.GetParagraphOrDefault(index + 1), _subtitle.GetParagraphOrDefault(index - 1)); + + for (int i = index + 1; i < SubtitleListview1.Items.Count; i++) + { + if (!_subtitle.Paragraphs[i].StartTime.IsMaxTime) + { + _subtitle.Paragraphs[i].StartTime = new TimeCode(_subtitle.Paragraphs[i].StartTime.TotalMilliseconds - offset); + _subtitle.Paragraphs[i].EndTime = new TimeCode(_subtitle.Paragraphs[i].EndTime.TotalMilliseconds - offset); + SubtitleListview1.SetStartTimeAndDuration(i, _subtitle.Paragraphs[i], _subtitle.GetParagraphOrDefault(i + 1), _subtitle.GetParagraphOrDefault(i - 1)); + } + } + + if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) + { + var original = Utilities.GetOriginalParagraph(index, oldP, _subtitleAlternate.Paragraphs); + if (original != null) + { + index = _subtitleAlternate.GetIndex(original); + for (int i = index; i < _subtitleAlternate.Paragraphs.Count; i++) + { + if (!_subtitleAlternate.Paragraphs[i].StartTime.IsMaxTime) + { + _subtitleAlternate.Paragraphs[i].StartTime = new TimeCode(_subtitleAlternate.Paragraphs[i].StartTime.TotalMilliseconds - offset); + _subtitleAlternate.Paragraphs[i].EndTime = new TimeCode(_subtitleAlternate.Paragraphs[i].EndTime.TotalMilliseconds - offset); + } + } + } + } + + ShowSource(); + checkBoxSyncListViewWithVideoWhilePlaying.Checked = oldSync; + timeUpDownStartTime.MaskedTextBox.TextChanged += MaskedTextBoxTextChanged; + } + } + + private void ButtonSetEndAndGoToNextClick(object sender, EventArgs e) + { + if (SubtitleListview1.SelectedItems.Count == 1) + { + int index = SubtitleListview1.SelectedItems[0].Index; + double videoPosition = mediaPlayer.CurrentPosition; + if (!mediaPlayer.IsPaused) + { + videoPosition -= Configuration.Settings.General.SetStartEndHumanDelay / TimeCode.BaseUnit; + } + + string oldDuration = _subtitle.Paragraphs[index].Duration.ToString(); + var temp = new Paragraph(_subtitle.Paragraphs[index]); + temp.EndTime.TotalMilliseconds = TimeCode.FromSeconds(videoPosition).TotalMilliseconds; + MakeHistoryForUndo(string.Format(_language.DisplayTimeAdjustedX, "#" + _subtitle.Paragraphs[index].Number + ": " + oldDuration + " -> " + temp.Duration)); + _makeHistoryPaused = true; + + if (_subtitle.Paragraphs[index].StartTime.IsMaxTime) + { + timeUpDownStartTime.MaskedTextBox.TextChanged -= MaskedTextBoxTextChanged; + _subtitle.Paragraphs[index].EndTime.TotalSeconds = videoPosition; + _subtitle.Paragraphs[index].StartTime.TotalMilliseconds = _subtitle.Paragraphs[index].EndTime.TotalMilliseconds - Utilities.GetOptimalDisplayMilliseconds(_subtitle.Paragraphs[index].Text); + if (_subtitle.Paragraphs[index].StartTime.TotalMilliseconds < 0) + { + _subtitle.Paragraphs[index].StartTime.TotalMilliseconds = 0; + } + + timeUpDownStartTime.TimeCode = _subtitle.Paragraphs[index].StartTime; + SubtitleListview1.SetStartTimeAndDuration(index, _subtitle.Paragraphs[index], _subtitle.GetParagraphOrDefault(index + 1), _subtitle.GetParagraphOrDefault(index - 1)); + timeUpDownStartTime.MaskedTextBox.TextChanged += MaskedTextBoxTextChanged; + } + else + { + _subtitle.Paragraphs[index].EndTime = TimeCode.FromSeconds(videoPosition); + } + + SubtitleListview1.SetDuration(index, _subtitle.Paragraphs[index], _subtitle.GetParagraphOrDefault(index + 1)); + SetDurationInSeconds(_subtitle.Paragraphs[index].Duration.TotalSeconds); + + if (index + 1 < _subtitle.Paragraphs.Count) + { + SubtitleListview1.SelectIndexAndEnsureVisible(index + 1, true); + } + + _makeHistoryPaused = false; + } + } + + private void ButtonAdjustSecBackClick(object sender, EventArgs e) + { + GoBackSeconds((double)numericUpDownSecAdjust1.Value); + } + + private void ButtonAdjustSecForwardClick(object sender, EventArgs e) + { + GoBackSeconds(-(double)numericUpDownSecAdjust1.Value); + } + + private void StartOrStopAutoBackup() + { + _timerAutoBackup?.Dispose(); + if (Configuration.Settings.General.AutoBackupSeconds > 0) + { + _timerAutoBackup = new Timer(); + _timerAutoBackup.Tick += TimerAutoBackupTick; + _timerAutoBackup.Interval = 1000 * Configuration.Settings.General.AutoBackupSeconds; // take backup every x second if changes were made + _timerAutoBackup.Start(); + } + } + + private void Main_Shown(object sender, EventArgs e) + { + splitContainerListViewAndText.SplitterMoved += splitContainerListViewAndText_SplitterMoved; + splitContainerListViewAndText.SizeChanged += splitContainerListViewAndText_SizeChanged; + + imageListBookmarks.Images.Add(pictureBoxBookmark.Image); + SetListViewStateImages(); + + toolStripButtonToggleVideo.Checked = !Configuration.Settings.General.ShowVideoPlayer; + toolStripButtonToggleVideo_Click(null, null); + + StartOrStopAutoBackup(); + + SetPositionFromXYString(Configuration.Settings.General.UndockedVideoPosition, "VideoPlayerUndocked"); + SetPositionFromXYString(Configuration.Settings.General.UndockedWaveformPosition, "WaveformUndocked"); + SetPositionFromXYString(Configuration.Settings.General.UndockedVideoControlsPosition, "VideoControlsUndocked"); + if (Configuration.Settings.General.Undocked && Configuration.Settings.General.StartRememberPositionAndSize) + { + Configuration.Settings.General.Undocked = false; + UndockVideoControlsToolStripMenuItemClick(null, null); + if (Configuration.Settings.General.UndockedVideoFullscreen) + { + GoFullscreen(true); + } + } + + Main_Resize(null, null); + + toolStripButtonLockCenter.Checked = Configuration.Settings.General.WaveformCenter; + audioVisualizer.Locked = toolStripButtonLockCenter.Checked; + + numericUpDownSec1.Value = (decimal)(Configuration.Settings.General.SmallDelayMilliseconds / TimeCode.BaseUnit); + numericUpDownSec2.Value = (decimal)(Configuration.Settings.General.LargeDelayMilliseconds / TimeCode.BaseUnit); + + numericUpDownSecAdjust1.Value = (decimal)(Configuration.Settings.General.SmallDelayMilliseconds / TimeCode.BaseUnit); + numericUpDownSecAdjust2.Value = (decimal)(Configuration.Settings.General.LargeDelayMilliseconds / TimeCode.BaseUnit); + + SetShortcuts(); + MainResize(); + _loading = false; + OpenVideo(VideoFileName); + ShowSubtitleTimer.Stop(); + lock (_syncUndo) + { + timerTextUndo.Start(); + timerAlternateTextUndo.Start(); + } + + if (Configuration.IsRunningOnLinux) + { + numericUpDownDuration.Left = timeUpDownStartTime.Left + timeUpDownStartTime.Width + 10; + numericUpDownDuration.Width += 10; + numericUpDownSec1.Width += 10; + numericUpDownSec2.Width += 10; + numericUpDownSecAdjust1.Width += 10; + numericUpDownSecAdjust2.Width += 10; + labelDuration.Left = numericUpDownDuration.Left; + } + + _timerDoSyntaxColoring.Interval = 100; + _timerDoSyntaxColoring.Tick += _timerDoSyntaxColoring_Tick; + + var showBeta = Configuration.Settings.General.ShowBetaStuff; + generateDatetimeInfoFromVideoToolStripMenuItem.Visible = showBeta; + toolStripMenuItemExportCaptionInc.Visible = showBeta; + toolStripMenuItemExportUltech130.Visible = showBeta; + toolStripMenuItemInverseSelection.Visible = showBeta; + toolStripMenuItemSpellCheckFromCurrentLine.Visible = showBeta; + toolStripMenuItemImportOcrHardSub.Visible = showBeta; + toolStripMenuItemOpenDvd.Visible = showBeta; + + if (Configuration.Settings.General.StartRememberPositionAndSize && + Configuration.Settings.General.SplitContainerMainSplitterDistance > 0 && + Configuration.Settings.General.SplitContainer1SplitterDistance > 0 && + Configuration.Settings.General.SplitContainerListViewAndTextSplitterDistance > 0) + { + splitContainerMain.SplitterDistance = Configuration.Settings.General.SplitContainerMainSplitterDistance; + splitContainer1.SplitterDistance = Configuration.Settings.General.SplitContainer1SplitterDistance; + splitContainerListViewAndText.SplitterDistance = Configuration.Settings.General.SplitContainerListViewAndTextSplitterDistance; + } + + mediaPlayer.InitializeVolume(Configuration.Settings.General.VideoPlayerDefaultVolume); + tabControlSubtitle.Invalidate(); + + if (string.IsNullOrEmpty(Configuration.Settings.Language.CheckForUpdates.CheckingForUpdates)) + { + checkForUpdatesToolStripMenuItem.Visible = false; + toolStripMenuItemSplitterCheckForUpdates.Visible = false; + } + else if (Configuration.Settings.General.CheckForUpdates && Configuration.Settings.General.LastCheckForUpdates < DateTime.Now.AddDays(-5)) + { + _checkForUpdatesHelper = new CheckForUpdatesHelper(); + _checkForUpdatesHelper.CheckForUpdates(); + _timerCheckForUpdates = new Timer(); + _timerCheckForUpdates.Interval = 7000; + _timerCheckForUpdates.Tick += TimerCheckForUpdatesTick; + _timerCheckForUpdates.Start(); + Configuration.Settings.General.LastCheckForUpdates = DateTime.Now; + } + + _dragAndDropTimer.Interval = 50; + _dragAndDropTimer.Tick += DoSubtitleListview1Drop; + + _dragAndDropVideoTimer.Interval = 50; + _dragAndDropVideoTimer.Tick += DropVideoTick; + + if (_exitWhenLoaded) + { + Application.Exit(); + } + + // Fix some large font issue + if (numericUpDownDuration.Left + numericUpDownDuration.Width > textBoxListViewText.Left) + { + numericUpDownDuration.Left = timeUpDownStartTime.Left + timeUpDownStartTime.Width + 5; + numericUpDownDuration.Width = textBoxListViewText.Left - numericUpDownDuration.Left - 5; + labelDuration.Left = numericUpDownDuration.Left; + } + + if (string.IsNullOrEmpty(_fileName) && (_subtitle == null || _subtitle.Paragraphs.Count == 0)) + { + _changeSubtitleHash = _subtitle.GetFastHashCode(GetCurrentEncoding().BodyName); + } + + comboBoxSubtitleFormats.AutoCompleteSource = AutoCompleteSource.ListItems; + comboBoxSubtitleFormats.AutoCompleteMode = AutoCompleteMode.Append; + InitializePlayRateDropDown(); + + LoadPlugins(); + + mediaPlayer.OnEmptyPlayerClicked += MediaPlayer_OnEmptyPlayerClicked; + SubtitleListview1.SelectIndexAndEnsureVisible(_subtitleListViewIndex, true); + if (Configuration.Settings.General.StartInSourceView) + { + textBoxSource.Focus(); + } + else + { + SubtitleListview1.Focus(); + } + + UiUtil.FixFonts(toolStripComboBoxWaveform); + UiUtil.FixFonts(toolStripComboBoxFrameRate); + UiUtil.FixFonts(comboBoxSubtitleFormats); + UiUtil.FixFonts(comboBoxEncoding); + UiUtil.FixFonts(toolStripSplitButtonPlayRate); + + _lastTextKeyDownTicks = DateTime.UtcNow.Ticks; + if (_subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) + { + var idx = _subtitleListViewIndex; + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + SubtitleListview1.SelectIndexAndEnsureVisibleFaster(idx); + } + + SetTitle(); + labelSingleLine.Left = labelTextLineLengths.Left + labelTextLineLengths.Width - 6; + RemoveNotExistingFilesFromRecentFilesUI(); + ShowSubtitleTimer.Start(); + } + + private void InitializePlayRateDropDown() + { + toolStripSplitButtonPlayRate.DropDownItems.Clear(); + var foreColor = UiUtil.ForeColor; + var backColor = UiUtil.BackColor; + for (int i = 30; i <= 300; i += 10) + { + toolStripSplitButtonPlayRate.DropDownItems.Add(new ToolStripMenuItem(i + "%", null, SetPlayRate) { Checked = i == 100, BackColor = backColor, ForeColor = foreColor }); + } + } + + private void MediaPlayer_OnEmptyPlayerClicked(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(VideoFileName)) + { + buttonOpenVideo_Click(sender, e); + } + } + + private void SetPlayRate(object sender, EventArgs e) + { + SetPlayRate(sender, e, false); + } + + private void SetPlayRate(object sender, EventArgs e, bool skipStatusMessage) + { + if (!(sender is ToolStripMenuItem playRateDropDownItem) || mediaPlayer == null || mediaPlayer.VideoPlayer == null) + { + return; + } + + foreach (ToolStripMenuItem item in toolStripSplitButtonPlayRate.DropDownItems) + { + item.Checked = false; + } + + playRateDropDownItem.Checked = true; + var percentText = playRateDropDownItem.Text.TrimEnd('%'); + if (!skipStatusMessage) + { + ShowStatus(string.Format(_language.SetPlayRateX, percentText)); + } + + var factor = double.Parse(percentText) / 100.0; + toolStripSplitButtonPlayRate.Image = Math.Abs(factor - 1) < 0.01 ? imageListPlayRate.Images[0] : imageListPlayRate.Images[1]; + mediaPlayer.VideoPlayer.PlayRate = factor; + } + + private void TimerCheckForUpdatesTick(object sender, EventArgs e) + { + _timerCheckForUpdates.Stop(); + if (_checkForUpdatesHelper.IsUpdateAvailable()) + { + using (var form = new CheckForUpdates(this, _checkForUpdatesHelper)) + { + form.ShowDialog(this); + } + } + + _checkForUpdatesHelper = null; + _timerCheckForUpdates = null; + } + + private void _timerDoSyntaxColoring_Tick(object sender, EventArgs e) + { + UpdateListSyntaxColoring(); + _timerDoSyntaxColoring.Stop(); + } + + private static void SetPositionFromXYString(string positionAndSize, string name) + { + var parts = positionAndSize.Split(';'); + if (parts.Length == 4) + { + if (int.TryParse(parts[0], out var left) + && int.TryParse(parts[1], out var top) + && int.TryParse(parts[2], out var width) + && int.TryParse(parts[3], out var height)) + { + PositionAndSizeForm.SetPositionAndSize(name, new Rectangle(left, top, width, height)); + } + else + { + System.Diagnostics.Debug.WriteLine("Could not set position and size for '{0}'.", name); + } + } + } + + private void SetShortcuts() + { + _shortcuts.SetShortcuts(); + newToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainFileNew); + openToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainFileOpen); + toolStripMenuItemOpenKeepVideo.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainFileOpenKeepVideo); + saveToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainFileSave); + saveOriginalToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainFileSaveOriginal); + saveOriginalAstoolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainFileSaveOriginalAs); + saveAsToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainFileSaveAs); + openOriginalToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainFileOpenOriginal); + removeOriginalToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainFileCloseOriginal); + toolStripMenuItemCompare.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainFileCompare); + toolStripMenuItemImportText.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainFileImportPlainText); + toolStripMenuItemImportTimeCodes.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainFileImportTimeCodes); + eBUSTLToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainFileExportEbu); + pACScreenElectronicsToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainFileExportPac); + plainTextToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainFileExportPlainText); + + toolStripMenuItemUndo.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainEditUndo); + toolStripMenuItemRedo.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainEditRedo); + findToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainEditFind); + findNextToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainEditFindNext); + replaceToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainEditReplace); + multipleReplaceToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainEditMultipleReplace); + gotoLineNumberToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainEditGoToLineNumber); + toolStripMenuItemRightToLeftMode.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainEditRightToLeft); + toolStripMenuItemShowOriginalInPreview.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainEditToggleTranslationOriginalInPreviews); + toolStripMenuItemInverseSelection.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainEditInverseSelection); + toolStripMenuItemModifySelection.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainEditModifySelection); + + fixToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainToolsFixCommonErrors); + toolStripMenuItemAutoMergeShortLines.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainToolsMergeShortLines); + toolStripMenuItemMergeDuplicateText.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainToolsMergeDuplicateText); + toolStripMenuItemMergeLinesWithSameTimeCodes.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainToolsMergeSameTimeCodes); + toolStripMenuItemMakeEmptyFromCurrent.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainToolsMakeEmptyFromCurrent); + toolStripMenuItemAutoSplitLongLines.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainToolsSplitLongLines); + toolStripMenuItemSubtitlesBridgeGaps.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainToolsDurationsBridgeGap); + setMinimumDisplayTimeBetweenParagraphsToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainToolsMinimumDisplayTimeBetweenParagraphs); + startNumberingFromToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainToolsRenumber); + removeTextForHearImpairedToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainToolsRemoveTextForHI); + ChangeCasingToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainToolsChangeCasing); + toolStripMenuItemShowOriginalInPreview.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainEditToggleTranslationOriginalInPreviews); + toolStripMenuItemBatchConvert.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainToolsBatchConvert); + toolStripMenuItemMeasurementConverter.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainToolsMeasurementConverter); + splitToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainToolsSplit); + appendTextVisuallyToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainToolsAppend); + joinSubtitlesToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainToolsJoin); + + openVideoToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainVideoOpen); + closeVideoToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainVideoClose); + showhideVideoToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainVideoShowHideVideo); + toolStripMenuItemBookmark.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.GeneralToggleBookmarksWithText); + + spellCheckToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainSpellCheck); + findDoubleWordsToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainSpellCheckFindDoubleWords); + addWordToNameListToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainSpellCheckAddWordToNames); + + translateByGoogleToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainTranslateGoogleTranslate); + + toolStripMenuItemAdjustAllTimes.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainSynchronizationAdjustTimes); + visualSyncToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainSynchronizationVisualSync); + toolStripMenuItemPointSync.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainSynchronizationPointSync); + pointSyncViaOtherSubtitleToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainSynchronizationPointSyncViaFile); + toolStripMenuItemChangeFrameRate2.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainSynchronizationChangeFrameRate); + italicToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewItalic); + removeAllFormattingsToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainRemoveFormatting); + boldToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewBold); + boldToolStripMenuItem1.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewBold); + underlineToolStripMenuItem1.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewUnderline); + underlineToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewUnderline); + boxToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewBox); + boxToolStripMenuItem1.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewBox); + splitLineToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewSplit); + toolStripMenuItemSurroundWithMusicSymbols.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewToggleMusicSymbols); + toolStripMenuItemAlignment.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewAlignment); + copyOriginalTextToCurrentToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewCopyTextFromOriginalToCurrent); + columnDeleteTextOnlyToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewColumnDeleteText); + toolStripMenuItemColumnDeleteText.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewColumnDeleteTextAndShiftUp); + ShiftTextCellsDownToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewColumnInsertText); + toolStripMenuItemPasteSpecial.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewColumnPaste); + toolStripMenuItemRuby.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainTextBoxSelectionToRuby); + moveTextUpToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewColumnTextUp); + moveTextDownToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewColumnTextDown); + toolStripMenuItemReverseRightToLeftStartEnd.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainEditReverseStartAndEndingForRTL); + italicToolStripMenuItem1.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainTextBoxItalic); + + audioVisualizer.InsertAtVideoPositionShortcut = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainWaveformInsertAtCurrentPosition); + audioVisualizer.Move100MsLeft = UiUtil.GetKeys(Configuration.Settings.Shortcuts.Waveform100MsLeft); + audioVisualizer.Move100MsRight = UiUtil.GetKeys(Configuration.Settings.Shortcuts.Waveform100MsRight); + audioVisualizer.MoveOneSecondLeft = UiUtil.GetKeys(Configuration.Settings.Shortcuts.Waveform1000MsLeft); + audioVisualizer.MoveOneSecondRight = UiUtil.GetKeys(Configuration.Settings.Shortcuts.Waveform1000MsRight); + + UiUtil.HelpKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.GeneralHelp); + helpToolStripMenuItem1.ShortcutKeys = UiUtil.HelpKeys; + + + // shortcut hints + if (!string.IsNullOrEmpty(Configuration.Settings.Shortcuts.MainAdjustSetStartAndOffsetTheRest2) && Configuration.Settings.Shortcuts.MainAdjustSetStartAndOffsetTheRest2.Length < 5) + { + labelAdjustF9.Text = Configuration.Settings.Shortcuts.MainAdjustSetStartAndOffsetTheRest2; + } + else if (!string.IsNullOrEmpty(Configuration.Settings.Shortcuts.MainAdjustSetStartAndOffsetTheRest) && Configuration.Settings.Shortcuts.MainAdjustSetStartAndOffsetTheRest.Length < 5) + { + labelAdjustF9.Text = Configuration.Settings.Shortcuts.MainAdjustSetStartAndOffsetTheRest; + } + else + { + labelAdjustF9.Text = string.Empty; + } + + if (!string.IsNullOrEmpty(Configuration.Settings.Shortcuts.MainAdjustSetEndAndGotoNext) && Configuration.Settings.Shortcuts.MainAdjustSetEndAndGotoNext.Length < 5) + { + labelAdjustF10.Text = Configuration.Settings.Shortcuts.MainAdjustSetEndAndGotoNext; + } + else + { + labelAdjustF10.Text = string.Empty; + } + + if (!string.IsNullOrEmpty(Configuration.Settings.Shortcuts.MainCreateSetStart) && Configuration.Settings.Shortcuts.MainCreateSetStart.Length < 5) + { + labelAdjustF11.Text = Configuration.Settings.Shortcuts.MainCreateSetStart; + labelCreateF11.Text = Configuration.Settings.Shortcuts.MainCreateSetStart; + } + else + { + labelAdjustF11.Text = string.Empty; + labelCreateF11.Text = string.Empty; + } + + if (!string.IsNullOrEmpty(Configuration.Settings.Shortcuts.MainCreateSetEnd) && Configuration.Settings.Shortcuts.MainCreateSetEnd.Length < 5) + { + labelAdjustF12.Text = Configuration.Settings.Shortcuts.MainCreateSetEnd; + labelCreateF12.Text = Configuration.Settings.Shortcuts.MainCreateSetEnd; + } + else + { + labelAdjustF12.Text = string.Empty; + labelCreateF12.Text = string.Empty; + } + + if (!string.IsNullOrEmpty(Configuration.Settings.Shortcuts.MainCreateInsertSubAtVideoPos) && Configuration.Settings.Shortcuts.MainCreateInsertSubAtVideoPos.Length < 5) + { + labelCreateF9.Text = Configuration.Settings.Shortcuts.MainCreateInsertSubAtVideoPos; + } + else + { + labelCreateF9.Text = string.Empty; + } + + if (!string.IsNullOrEmpty(Configuration.Settings.Shortcuts.MainVideoPlayFromJustBefore) && Configuration.Settings.Shortcuts.MainVideoPlayFromJustBefore.Length < 5) + { + labelCreateF10.Text = Configuration.Settings.Shortcuts.MainVideoPlayFromJustBefore; + } + else + { + labelCreateF10.Text = string.Empty; + } + } + + public static object GetPropertiesAndDoAction(string pluginFileName, out string name, out string text, out decimal version, out string description, out string actionType, out string shortcut, out System.Reflection.MethodInfo mi) + { + name = null; + text = null; + version = 0; + description = null; + actionType = null; + shortcut = null; + mi = null; + Assembly assembly; + try + { + assembly = Assembly.Load(File.ReadAllBytes(pluginFileName)); + } + catch + { + return null; + } + + // note: *objectName must not include path or file extension + string objectName = Path.GetFileNameWithoutExtension(pluginFileName); + if (assembly != null) + { + Type pluginType = assembly.GetType("Nikse.SubtitleEdit.PluginLogic." + objectName); + if (pluginType == null) + { + return null; + } + + object pluginObject = Activator.CreateInstance(pluginType); + + // IPlugin + var t = pluginType.GetInterface("IPlugin"); + if (t == null) + { + return null; + } + + PropertyInfo pi = t.GetProperty("Name"); + if (pi != null) + { + name = (string)pi.GetValue(pluginObject, null); + } + + pi = t.GetProperty("Text"); + if (pi != null) + { + text = (string)pi.GetValue(pluginObject, null); + } + + pi = t.GetProperty("Description"); + if (pi != null) + { + description = (string)pi.GetValue(pluginObject, null); + } + + pi = t.GetProperty("Version"); + if (pi != null) + { + version = Convert.ToDecimal(pi.GetValue(pluginObject, null)); + } + + pi = t.GetProperty("ActionType"); + if (pi != null) + { + actionType = (string)pi.GetValue(pluginObject, null); + } + + mi = t.GetMethod("DoAction"); + + pi = t.GetProperty("Shortcut"); + if (pi != null) + { + shortcut = (string)pi.GetValue(pluginObject, null); + } + + return pluginObject; + } + + return null; + } + + private void LoadPlugins() + { + var path = Configuration.PluginsDirectory; + if (!Directory.Exists(path)) + { + return; + } + + UiUtil.CleanUpMenuItemPlugin(fileToolStripMenuItem); + UiUtil.CleanUpMenuItemPlugin(toolsToolStripMenuItem); + UiUtil.CleanUpMenuItemPlugin(toolStripMenuItemSpellCheckMain); + UiUtil.CleanUpMenuItemPlugin(toolStripMenuItemSynchronization); + UiUtil.CleanUpMenuItemPlugin(toolStripMenuItemAutoTranslate); + UiUtil.CleanUpMenuItemPlugin(toolStripMenuItemTranslateSelected); + + var fileMenuItems = new List(); + var toolsMenuItems = new List(); + var translateMenuItems = new List(); + var translateSelectedLinesMenuItems = new List(); + var syncMenuItems = new List(); + var spellCheckMenuItems = new List(); + + foreach (var pluginFileName in Directory.GetFiles(path, "*.DLL")) + { + try + { + GetPropertiesAndDoAction(pluginFileName, out var name, out var text, out var version, out var description, out var actionType, out var shortcut, out var mi); + if (!string.IsNullOrEmpty(name) && !string.IsNullOrEmpty(actionType) && mi != null) + { + var item = new ToolStripMenuItem { Text = text, Tag = pluginFileName }; + UiUtil.FixFonts(item); + + if (!string.IsNullOrEmpty(shortcut)) + { + item.ShortcutKeys = UiUtil.GetKeys(shortcut); + } + + if (actionType.Equals("File", StringComparison.OrdinalIgnoreCase)) + { + AddSeparator(fileMenuItems.Count, fileToolStripMenuItem, 2); + item.Click += PluginToolClick; + fileMenuItems.Add(item); + } + else if (actionType.Equals("Tool", StringComparison.OrdinalIgnoreCase)) + { + AddSeparator(toolsMenuItems.Count, toolsToolStripMenuItem); + item.Click += PluginToolClick; + toolsMenuItems.Add(item); + } + else if (actionType.Equals("Sync", StringComparison.OrdinalIgnoreCase)) + { + AddSeparator(syncMenuItems.Count, toolStripMenuItemSynchronization); + item.Click += PluginToolClick; + syncMenuItems.Add(item); + } + else if (actionType.Equals("Translate", StringComparison.OrdinalIgnoreCase)) + { + AddSeparator(translateMenuItems.Count, toolStripMenuItemAutoTranslate); + item.Click += PluginClickTranslate; + translateMenuItems.Add(item); + + // selected lines + item = new ToolStripMenuItem(); + item.Text = text; + item.Tag = pluginFileName; + UiUtil.FixFonts(item); + AddSeparator(translateMenuItems.Count - 1, toolStripMenuItemTranslateSelected); + item.Click += PluginClickTranslateSelectedLines; + translateSelectedLinesMenuItems.Add(item); + } + else if (actionType.Equals("SpellCheck", StringComparison.OrdinalIgnoreCase)) + { + AddSeparator(spellCheckMenuItems.Count, toolStripMenuItemSpellCheckMain); + item.Click += PluginClickNoFormatChange; + spellCheckMenuItems.Add(item); + } + } + } + catch (Exception exception) + { + MessageBox.Show(string.Format(_language.ErrorLoadingPluginXErrorY, pluginFileName, exception.Message)); + } + } + foreach (var fileMenuItem in fileMenuItems) + { + fileToolStripMenuItem.DropDownItems.Insert(fileToolStripMenuItem.DropDownItems.Count - 2, fileMenuItem); + } + toolsToolStripMenuItem.DropDownItems.AddRange(toolsMenuItems.OrderBy(p => p.Text).ToArray()); + toolStripMenuItemAutoTranslate.DropDownItems.AddRange(translateMenuItems.OrderBy(p => p.Text).ToArray()); + toolStripMenuItemTranslateSelected.DropDownItems.AddRange(translateSelectedLinesMenuItems.OrderBy(p => p.Text).ToArray()); + toolStripMenuItemSynchronization.DropDownItems.AddRange(syncMenuItems.OrderBy(p => p.Text).ToArray()); + toolStripMenuItemSpellCheckMain.DropDownItems.AddRange(spellCheckMenuItems.OrderBy(p => p.Text).ToArray()); + } + + private void AddSeparator(int pluginCount, ToolStripMenuItem parent, int? relativeOffset = null) + { + if (pluginCount == 0) + { + var tss = new ToolStripSeparator(); + if (relativeOffset == null) + { + if (parent.DropDownItems.Count > 0 && parent.DropDownItems[parent.DropDownItems.Count - 1].GetType() == typeof(ToolStripSeparator)) + { + return; // don't app separator after separator + } + + parent.DropDownItems.Add(tss); + } + else + { + if (parent.DropDownItems.Count - relativeOffset.Value >= 0 && + relativeOffset.Value < parent.DropDownItems.Count && + parent.DropDownItems.Count > 0 && + parent.DropDownItems[parent.DropDownItems.Count - relativeOffset.Value].GetType() == typeof(ToolStripSeparator)) + { + return; // don't app separator after separator + } + + parent.DropDownItems.Insert(parent.DropDownItems.Count - relativeOffset.Value, tss); + } + + UiUtil.FixFonts(tss); + } + } + + private void PluginToolClick(object sender, EventArgs e) + { + CallPlugin(sender, true, false); + } + + private void PluginClickNoFormatChange(object sender, EventArgs e) + { + CallPlugin(sender, false, false); + } + + private void PluginClickTranslate(object sender, EventArgs e) + { + CallPlugin(sender, false, true); + } + + private void PluginClickTranslateSelectedLines(object sender, EventArgs e) + { + CallPluginTranslateSelectedLines(sender); + } + + private void CallPlugin(object sender, bool allowChangeFormat, bool translate) + { + try + { + var item = (ToolStripItem)sender; + var pluginObject = GetPropertiesAndDoAction(item.Tag.ToString(), out var name, out var text, out var version, out var description, out var actionType, out var shortcut, out var mi); + if (mi == null) + { + return; + } + + string rawText = null; + var format = GetCurrentSubtitleFormat(); + if (format != null) + { + rawText = _subtitle.ToText(format); + } + + string pluginResult = (string)mi.Invoke(pluginObject, + new object[] + { + this, + _subtitle.ToText(new SubRip()), + Configuration.Settings.General.CurrentFrameRate, + Configuration.Settings.General.ListViewLineSeparatorString, + _fileName, + VideoFileName, + rawText + }); + + if (!string.IsNullOrEmpty(pluginResult) && pluginResult.Length > 10 && text != pluginResult) + { + var lines = new List(pluginResult.SplitToLines()); + + MakeHistoryForUndo(string.Format(_language.BeforeRunningPluginXVersionY, name, version)); + + var s = new Subtitle(); + SubtitleFormat newFormat = null; + foreach (var subtitleFormat in SubtitleFormat.AllSubtitleFormats) + { + if (subtitleFormat.IsMine(lines, null)) + { + subtitleFormat.LoadSubtitle(s, lines, null); + newFormat = subtitleFormat; + break; + } + } + + if (translate) + { + _subtitleAlternate = new Subtitle(_subtitle); + _subtitleAlternateFileName = _fileName; + + var language = LanguageAutoDetect.AutoDetectGoogleLanguageOrNull(s); + if (language != null && !string.IsNullOrEmpty(_fileName)) + { + _fileName = Utilities.GetPathAndFileNameWithoutExtension(_fileName); + var oldLang = "." + LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitleAlternate); + if (oldLang.Length == 3 && _fileName.EndsWith(oldLang, StringComparison.OrdinalIgnoreCase)) + { + _fileName = _fileName.Remove(_fileName.Length - 3); + } + + _fileName += "." + language + GetCurrentSubtitleFormat().Extension; + } + else + { + _fileName = null; + } + + _subtitle.Paragraphs.Clear(); + foreach (var p in s.Paragraphs) + { + _subtitle.Paragraphs.Add(new Paragraph(p)); + } + + ShowStatus(_language.SubtitleTranslated); + ShowSource(); + SubtitleListview1.ShowAlternateTextColumn(_languageGeneral.OriginalText); + SubtitleListview1.AutoSizeAllColumns(this); + SetupAlternateEdit(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + ResetHistory(); + RestoreSubtitleListviewIndices(); + _converted = true; + SetTitle(); + return; + } + + if (newFormat != null) + { + if (allowChangeFormat && newFormat.GetType() == typeof(SubRip) && IsOnlyTextChanged(_subtitle, s)) + { + allowChangeFormat = false; + } + + if (!allowChangeFormat && IsOnlyTextChanged(_subtitle, s)) + { + for (int k = 0; k < s.Paragraphs.Count; k++) + { + _subtitle.Paragraphs[k].Text = s.Paragraphs[k].Text; + } + } + else + { + _subtitle.Paragraphs.Clear(); + _subtitle.Header = s.Header; + _subtitle.Footer = s.Footer; + foreach (var p in s.Paragraphs) + { + _subtitle.Paragraphs.Add(p); + } + } + + if (allowChangeFormat) + { + SetCurrentFormat(newFormat); + } + + SaveSubtitleListviewIndices(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + ShowSource(); + + ShowStatus(string.Format(_language.PluginXExecuted, name)); + } + else + { + MessageBox.Show(_language.UnableToReadPluginResult); + } + } + } + catch (Exception exception) + { + MessageBox.Show(exception.Message + Environment.NewLine + exception.StackTrace); + if (exception.InnerException != null) + { + MessageBox.Show(exception.InnerException.Message + Environment.NewLine + exception.InnerException.StackTrace); + } + } + } + + private void CallPluginTranslateSelectedLines(object sender) + { + try + { + var item = (ToolStripItem)sender; + var pluginObject = GetPropertiesAndDoAction(item.Tag.ToString(), out var name, out var text, out var version, out var description, out var actionType, out var shortcut, out var mi); + if (mi == null) + { + return; + } + + SaveSubtitleListviewIndices(); + var selectedLines = new Subtitle(); + foreach (int index in SubtitleListview1.SelectedIndices) + { + var p = _subtitle.Paragraphs[index]; + if (_subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) + { + var original = Utilities.GetOriginalParagraph(index, p, _subtitleAlternate.Paragraphs); + if (original != null) + { + p = original; + } + else + { + p = new Paragraph(string.Empty, p.StartTime.TotalMilliseconds, p.EndTime.TotalMilliseconds); + } + } + + selectedLines.Paragraphs.Add(p); + } + + string rawText = null; + SubtitleFormat format = GetCurrentSubtitleFormat(); + if (format != null) + { + rawText = selectedLines.ToText(format); + } + + string pluginResult = (string)mi.Invoke(pluginObject, + new object[] + { + this, + selectedLines.ToText(new SubRip()), + Configuration.Settings.General.CurrentFrameRate, + Configuration.Settings.General.ListViewLineSeparatorString, + _fileName, + VideoFileName, + rawText + }); + + if (!string.IsNullOrEmpty(pluginResult) && pluginResult.Length > 10 && text != pluginResult) + { + var lines = new List(pluginResult.SplitToLines()); + MakeHistoryForUndo(string.Format(_language.BeforeRunningPluginXVersionY, name, version)); + var s = new Subtitle(); + var f = new SubRip(); + if (f.IsMine(lines, null)) + { + f.LoadSubtitle(s, lines, null); + + // we only update selected lines + int i = 0; + foreach (int index in SubtitleListview1.SelectedIndices) + { + _subtitle.Paragraphs[index] = s.Paragraphs[i]; + i++; + } + + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + ShowStatus(string.Format(_language.PluginXExecuted, name)); + } + } + } + catch (Exception exception) + { + MessageBox.Show(exception.Message + Environment.NewLine + exception.StackTrace); + if (exception.InnerException != null) + { + MessageBox.Show(exception.InnerException.Message + Environment.NewLine + exception.InnerException.StackTrace); + } + } + } + + private bool IsOnlyTextChanged(Subtitle s1, Subtitle s2) + { + if (s1.Paragraphs.Count != s2.Paragraphs.Count) + { + return false; + } + + for (int i = 0; i < s1.Paragraphs.Count; i++) + { + var p1 = s1.Paragraphs[i]; + var p2 = s2.Paragraphs[i]; + if (Math.Abs(p1.StartTime.TotalMilliseconds - p2.StartTime.TotalMilliseconds) > 0.01) + { + return false; + } + + if (Math.Abs(p1.EndTime.TotalMilliseconds - p2.EndTime.TotalMilliseconds) > 0.01) + { + return false; + } + } + + return true; + } + + private string _lastWrittenAutoBackup = string.Empty; + private bool _showAutoBackupError = true; + + private void TimerAutoBackupTick(object sender, EventArgs e) + { + string currentText = string.Empty; + if (_subtitle != null && _subtitle.Paragraphs.Count > 0) + { + var saveFormat = GetCurrentSubtitleFormat(); + if (!saveFormat.IsTextBased) + { + saveFormat = new SubRip(); + } + + currentText = _subtitle.ToText(saveFormat); + if (_textAutoBackup == null) + { + _textAutoBackup = currentText; + } + + if ((Configuration.Settings.General.AutoSave || + !string.IsNullOrEmpty(_textAutoBackup) && currentText.Trim() != _textAutoBackup.Trim() && !string.IsNullOrWhiteSpace(currentText)) && + _lastWrittenAutoBackup != currentText) + { + if (!Directory.Exists(Configuration.AutoBackupDirectory)) + { + try + { + Directory.CreateDirectory(Configuration.AutoBackupDirectory); + } + catch (Exception exception) + { + MessageBox.Show(string.Format(_language.UnableToCreateBackupDirectory, Configuration.AutoBackupDirectory, exception.Message)); + return; + } + } + + string title = string.Empty; + if (!string.IsNullOrEmpty(_fileName)) + { + title = "_" + Path.GetFileNameWithoutExtension(_fileName); + } + + string fileName = string.Format("{0}{1:0000}-{2:00}-{3:00}_{4:00}-{5:00}-{6:00}{7}{8}", Configuration.AutoBackupDirectory, DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second, title, saveFormat.Extension); + try + { + File.WriteAllText(fileName, currentText); + _lastWrittenAutoBackup = currentText; + } + catch (Exception exception) + { + if (_showAutoBackupError) + { + MessageBox.Show("Unable to save auto-backup to file: " + fileName + Environment.NewLine + + Environment.NewLine + + exception.Message + Environment.NewLine + exception.StackTrace); + _showAutoBackupError = false; + } + } + + if (!_cleanupHasRun) + { + // let the cleanup process be handled by worker thread + System.Threading.Tasks.Task.Factory.StartNew(() => { RestoreAutoBackup.CleanAutoBackupFolder(Configuration.AutoBackupDirectory, Configuration.Settings.General.AutoBackupDeleteAfterMonths); }); + _cleanupHasRun = true; + } + } + } + + _textAutoBackup = currentText; + + if (_subtitleAlternateFileName != null && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) + { + var saveFormat = GetCurrentSubtitleFormat(); + if (!saveFormat.IsTextBased) + { + saveFormat = new SubRip(); + } + + string currentTextAlternate = _subtitleAlternate.ToText(saveFormat); + if (_subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) + { + if (_textAutoBackupOriginal == null) + { + _textAutoBackupOriginal = currentTextAlternate; + } + + if (Configuration.Settings.General.AutoSave || + !string.IsNullOrEmpty(_textAutoBackupOriginal) && currentTextAlternate.Trim() != _textAutoBackupOriginal.Trim() && !string.IsNullOrWhiteSpace(currentTextAlternate)) + { + if (!Directory.Exists(Configuration.AutoBackupDirectory)) + { + try + { + Directory.CreateDirectory(Configuration.AutoBackupDirectory); + } + catch (Exception exception) + { + MessageBox.Show(string.Format(_language.UnableToCreateBackupDirectory, Configuration.AutoBackupDirectory, exception.Message)); + return; + } + } + + string title = string.Empty; + if (!string.IsNullOrEmpty(_subtitleAlternateFileName)) + { + title = "_" + Path.GetFileNameWithoutExtension(_subtitleAlternateFileName); + } + + string fileName = string.Format("{0}{1:0000}-{2:00}-{3:00}_{4:00}-{5:00}-{6:00}{7}{8}", Configuration.AutoBackupDirectory, DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second, "_Original" + title, saveFormat.Extension); + File.WriteAllText(fileName, currentTextAlternate); + } + } + + _textAutoBackupOriginal = currentTextAlternate; + } + } + + private void DropVideoTick(object sender, EventArgs e) + { + _dragAndDropVideoTimer.Stop(); + OpenVideo(VideoFileName); + } + + private void mediaPlayer_DragDrop(object sender, DragEventArgs e) + { + var files = (string[])e.Data.GetData(DataFormats.FileDrop); + if (files.Length == 1) + { + string fileName = files[0]; + string ext = Path.GetExtension(fileName).ToLowerInvariant(); + if (Utilities.GetVideoFileFilter(true).Contains(ext)) + { + if (string.IsNullOrEmpty(_fileName)) + { + var dirName = Path.GetDirectoryName(fileName); + saveFileDialog1.InitialDirectory = dirName; + openFileDialog1.InitialDirectory = dirName; + } + + VideoFileName = fileName; + _dragAndDropVideoTimer.Start(); + } + else + { + try + { + var fi = new FileInfo(fileName); + if (fi.Length < Subtitle.MaxFileSize) + { + var lines = new List(File.ReadAllLines(fileName)); + foreach (SubtitleFormat format in SubtitleFormat.AllSubtitleFormats) + { + if (format.IsMine(lines, fileName)) + { + OpenSubtitle(fileName, null); + return; + } + } + } + } + catch + { + } + + MessageBox.Show(string.Format(_language.DropFileXNotAccepted, fileName)); + } + } + else + { + MessageBox.Show(_language.DropOnlyOneFile); + } + } + + private void mediaPlayer_DragEnter(object sender, DragEventArgs e) + { + // make sure they're actually dropping files (not text or anything else) + if (e.Data.GetDataPresent(DataFormats.FileDrop, false)) + { + e.Effect = DragDropEffects.All; + } + } + + private void buttonSecBack2_Click(object sender, EventArgs e) + { + GoBackSeconds((double)numericUpDownSec2.Value); + } + + private void buttonForward2_Click(object sender, EventArgs e) + { + GoBackSeconds(-(double)numericUpDownSec2.Value); + } + + private void buttonAdjustSecBack2_Click(object sender, EventArgs e) + { + GoBackSeconds((double)numericUpDownSecAdjust2.Value); + } + + private void buttonAdjustSecForward2_Click(object sender, EventArgs e) + { + GoBackSeconds(-(double)numericUpDownSecAdjust2.Value); + } + + private void translatepoweredByMicrosoftToolStripMenuItem_Click(object sender, EventArgs e) + { + TranslateViaGoogle(false, false); + } + + private void AudioWaveform_Click(object sender, EventArgs e) + { + if (audioVisualizer.WavePeaks == null) + { + if (VideoFileName != null && (VideoFileName.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || + VideoFileName.StartsWith("https://", StringComparison.OrdinalIgnoreCase))) + { + return; + } + + if (string.IsNullOrEmpty(VideoFileName)) + { + buttonOpenVideo_Click(sender, e); + if (string.IsNullOrEmpty(VideoFileName)) + { + return; + } + + if (audioVisualizer.WavePeaks != null && File.Exists(WavePeakGenerator.GetPeakWaveFileName(VideoFileName))) + { + return; // waveform already exists and is loaded + } + } + + mediaPlayer.Pause(); + using (var addWaveform = new AddWaveform()) + { + var videoAudioTrackNumber = VideoAudioTrackNumber; + if (mediaPlayer.VideoPlayer is LibVlcDynamic && VideoAudioTrackNumber != -1) + { + videoAudioTrackNumber -= 1; + } + + var peakWaveFileName = WavePeakGenerator.GetPeakWaveFileName(VideoFileName, videoAudioTrackNumber); + var spectrogramFolder = WavePeakGenerator.SpectrogramDrawer.GetSpectrogramFolder(VideoFileName, videoAudioTrackNumber); + + if (WavePeakGenerator.IsFileValidForVisualizer(VideoFileName)) + { + addWaveform.InitializeViaWaveFile(VideoFileName, peakWaveFileName, spectrogramFolder); + } + else + { + addWaveform.Initialize(VideoFileName, peakWaveFileName, spectrogramFolder, videoAudioTrackNumber); + } + + if (addWaveform.ShowDialog() == DialogResult.OK) + { + audioVisualizer.ZoomFactor = 1.0; + audioVisualizer.VerticalZoomFactor = 1.0; + SelectZoomTextInComboBox(); + audioVisualizer.WavePeaks = addWaveform.Peaks; + audioVisualizer.SetSpectrogram(addWaveform.Spectrogram); + timerWaveform.Start(); + } + + if (videoAudioTrackNumber != addWaveform.AudioTrackNumber) + { + if (mediaPlayer.VideoPlayer is LibVlcDynamic libVlc) + { + libVlc.AudioTrackNumber = addWaveform.AudioTrackNumber + 1; + VideoAudioTrackNumber = addWaveform.AudioTrackNumber + 1; + } + else if (mediaPlayer.VideoPlayer is LibMpvDynamic libMpv) + { + libMpv.AudioTrackNumber = addWaveform.AudioTrackNumber; + VideoAudioTrackNumber = addWaveform.AudioTrackNumber; + } + } + } + + if (mediaPlayer.Chapters?.Count > 0) + { + audioVisualizer.Chapters = mediaPlayer.Chapters; + } + } + } + + private void ReloadWaveform(string fileName, int audioTrackNumber) + { + if (audioVisualizer.WavePeaks != null) + { + audioVisualizer.WavePeaks = null; + audioVisualizer.SetSpectrogram(null); + audioVisualizer.SceneChanges = new List(); + audioVisualizer.Chapters = new List(); + } + + if (mediaPlayer.VideoPlayer is LibVlcDynamic && audioTrackNumber != -1) + { + audioTrackNumber -= 1; + } + + var peakWaveFileName = WavePeakGenerator.GetPeakWaveFileName(fileName, audioTrackNumber); + var spectrogramFolder = WavePeakGenerator.SpectrogramDrawer.GetSpectrogramFolder(VideoFileName, audioTrackNumber); + + if (File.Exists(peakWaveFileName)) + { + audioVisualizer.ZoomFactor = 1.0; + audioVisualizer.VerticalZoomFactor = 1.0; + SelectZoomTextInComboBox(); + audioVisualizer.WavePeaks = WavePeakData.FromDisk(peakWaveFileName); + audioVisualizer.SetSpectrogram(SpectrogramData.FromDisk(spectrogramFolder)); + audioVisualizer.SceneChanges = SceneChangeHelper.FromDisk(VideoFileName); + SetWaveformPosition(0, 0, 0); + timerWaveform.Start(); + } + } + + private void timerWaveform_Tick(object sender, EventArgs e) + { + if (audioVisualizer.Visible && mediaPlayer.VideoPlayer != null && audioVisualizer.WavePeaks != null) + { + int index = -1; + if (SubtitleListview1.SelectedItems.Count > 0) + { + index = SubtitleListview1.SelectedItems[0].Index; + } + + if (audioVisualizer.Locked) + { + double startPos = mediaPlayer.CurrentPosition - ((audioVisualizer.EndPositionSeconds - audioVisualizer.StartPositionSeconds) / 2.0); + if (startPos < 0) + { + startPos = 0; + } + + SetWaveformPosition(startPos, mediaPlayer.CurrentPosition, index); + } + else if (mediaPlayer.CurrentPosition > audioVisualizer.EndPositionSeconds || mediaPlayer.CurrentPosition < audioVisualizer.StartPositionSeconds) + { + double startPos = mediaPlayer.CurrentPosition - 0.01; + if (startPos < 0) + { + startPos = 0; + } + + audioVisualizer.ClearSelection(); + SetWaveformPosition(startPos, mediaPlayer.CurrentPosition, index); + } + else + { + SetWaveformPosition(audioVisualizer.StartPositionSeconds, mediaPlayer.CurrentPosition, index); + } + + bool paused = mediaPlayer.IsPaused; + toolStripButtonWaveformPause.Visible = !paused; + toolStripButtonWaveformPlay.Visible = paused; + } + else + { + toolStripButtonWaveformPlay.Visible = true; + toolStripButtonWaveformPause.Visible = false; + } + } + + private void addParagraphHereToolStripMenuItem_Click(object sender, EventArgs e) + { + audioVisualizer.ClearSelection(); + var newParagraph = new Paragraph(audioVisualizer.NewSelectionParagraph); + + mediaPlayer.Pause(); + + // find index where to insert + int index = 0; + for (int i = 0; i < _subtitle.Paragraphs.Count; i++) + { + var p = _subtitle.Paragraphs[i]; + if (p.StartTime.TotalMilliseconds > newParagraph.StartTime.TotalMilliseconds && + (!p.StartTime.IsMaxTime || !HasSmallerStartTimes(_subtitle, i + 1, newParagraph.StartTime.TotalMilliseconds))) + { + break; + } + + index++; + } + + SetStyleForNewParagraph(newParagraph, index); + + MakeHistoryForUndo(_language.BeforeInsertLine); + + // create and insert + if (_networkSession != null) + { + _networkSession.TimerStop(); + NetworkGetSendUpdates(new List(), index, newParagraph); + } + else + { + _subtitle.Paragraphs.Insert(index, newParagraph); + + if (_subtitleAlternate != null && SubtitleListview1.IsAlternateTextColumnVisible && Configuration.Settings.General.AllowEditOfOriginalSubtitle) + { + _subtitleAlternate.InsertParagraphInCorrectTimeOrder(new Paragraph(newParagraph)); + _subtitleAlternate.Renumber(); + } + + _subtitleListViewIndex = -1; + _subtitle.Renumber(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + } + + SubtitleListview1.SelectIndexAndEnsureVisible(index, true); + + textBoxListViewText.Focus(); + audioVisualizer.NewSelectionParagraph = null; + + ShowStatus(string.Format(_language.VideoControls.NewTextInsertAtX, newParagraph.StartTime.ToShortString())); + audioVisualizer.Invalidate(); + } + + private static bool HasSmallerStartTimes(Subtitle subtitle, int startIndex, double startMs) + { + for (int i = startIndex; i < subtitle.Paragraphs.Count; i++) + { + var p = subtitle.Paragraphs[i]; + if (startMs > p.StartTime.TotalMilliseconds && !p.StartTime.IsMaxTime) + { + return true; + } + } + + return false; + } + + private void addParagraphAndPasteToolStripMenuItem_Click(object sender, EventArgs e) + { + addParagraphHereToolStripMenuItem_Click(sender, e); + textBoxListViewText.Text = Clipboard.GetText(); + } + + private void mergeWithPreviousToolStripMenuItem_Click(object sender, EventArgs e) + { + int index = _subtitle.GetIndex(audioVisualizer.RightClickedParagraph); + if (index >= 0) + { + SubtitleListview1.SelectIndexAndEnsureVisible(index, true); + MergeBeforeToolStripMenuItemClick(null, null); + } + + audioVisualizer.Invalidate(); + } + + private void deleteParagraphToolStripMenuItem_Click(object sender, EventArgs e) + { + int index = _subtitle.GetIndex(audioVisualizer.RightClickedParagraph); + if (index >= 0) + { + SubtitleListview1.SelectIndexAndEnsureVisible(index, true); + ToolStripMenuItemDeleteClick(null, null); + } + + audioVisualizer.Invalidate(); + } + + private void splitToolStripMenuItem1_Click(object sender, EventArgs e) + { + for (int i = 0; i < _subtitle.Paragraphs.Count; i++) + { + if (audioVisualizer.RightClickedParagraph.StartTime.TotalMilliseconds == _subtitle.Paragraphs[i].StartTime.TotalMilliseconds && + audioVisualizer.RightClickedParagraph.EndTime.TotalMilliseconds == _subtitle.Paragraphs[i].EndTime.TotalMilliseconds) + { + SubtitleListview1.SelectIndexAndEnsureVisible(i, true); + SplitSelectedParagraph(_audioWaveformRightClickSeconds, null); + break; + } + } + + audioVisualizer.Invalidate(); + } + + private void mergeWithNextToolStripMenuItem_Click(object sender, EventArgs e) + { + int index = _subtitle.GetIndex(audioVisualizer.RightClickedParagraph); + if (index >= 0) + { + SubtitleListview1.SelectIndexAndEnsureVisible(index, true); + MergeAfterToolStripMenuItemClick(null, null); + } + + audioVisualizer.Invalidate(); + } + + private void extendToPreviousToolStripMenuItem_Click(object sender, EventArgs e) + { + int index = _subtitle.GetIndex(audioVisualizer.RightClickedParagraph); + if (index >= 0) + { + SubtitleListview1.SelectIndexAndEnsureVisible(index, true); + ExtendSelectedLinesToPreviousLine(); + } + + audioVisualizer.Invalidate(); + } + + private void extendToNextToolStripMenuItem_Click(object sender, EventArgs e) + { + int index = _subtitle.GetIndex(audioVisualizer.RightClickedParagraph); + if (index >= 0) + { + SubtitleListview1.SelectIndexAndEnsureVisible(index, true); + ExtendSelectedLinesToNextLine(); + } + + audioVisualizer.Invalidate(); + } + + private void goToPreviousSubtitleToolStripMenuItem_Click(object sender, EventArgs e) + { + if (audioVisualizer.RightClickedParagraph != null) + { + GoToPreviousSubtitle(audioVisualizer.RightClickedParagraph.StartTime.TotalMilliseconds); + } + else + { + GoToPreviousSubtitle(mediaPlayer.CurrentPosition * TimeCode.BaseUnit); + } + } + + private void goToNextSubtitleToolStripMenuItem_Click(object sender, EventArgs e) + { + if (audioVisualizer.RightClickedParagraph != null) + { + GoToNextSubtitle(audioVisualizer.RightClickedParagraph.StartTime.TotalMilliseconds); + } + else + { + GoToNextSubtitle(mediaPlayer.CurrentPosition * TimeCode.BaseUnit); + } + } + + private void buttonWaveformZoomIn_Click(object sender, EventArgs e) + { + if (audioVisualizer.WavePeaks != null && audioVisualizer.Visible) + { + audioVisualizer.ZoomFactor += 0.1; + } + } + + private void buttonWaveformZoomOut_Click(object sender, EventArgs e) + { + if (audioVisualizer.WavePeaks != null && audioVisualizer.Visible) + { + audioVisualizer.ZoomFactor -= 0.1; + } + } + + private void buttonWaveformZoomReset_Click(object sender, EventArgs e) + { + if (audioVisualizer.WavePeaks != null && audioVisualizer.Visible) + { + audioVisualizer.ZoomFactor = 1.0; + } + } + + private void toolStripMenuItemWaveformPlaySelection_Click(object sender, EventArgs e) + { + WaveformPlaySelection(); + } + + private void WaveformPlaySelection(bool nearEnd = false) + { + if (mediaPlayer.VideoPlayer != null) + { + var p = + audioVisualizer.NewSelectionParagraph ?? + audioVisualizer.SelectedParagraph; + + if (p != null) + { + double startSeconds = p.StartTime.TotalSeconds; + _endSeconds = p.EndTime.TotalSeconds; + if (nearEnd) + { + startSeconds = Math.Max(startSeconds, _endSeconds - 1.0); + } + + mediaPlayer.CurrentPosition = startSeconds; + UiUtil.ShowSubtitle(_subtitle, mediaPlayer); + mediaPlayer.Play(); + } + } + } + + private void toolStripButtonWaveformZoomIn_Click(object sender, EventArgs e) + { + if (audioVisualizer.WavePeaks != null && audioVisualizer.Visible) + { + audioVisualizer.ZoomFactor += 0.1; + SelectZoomTextInComboBox(); + } + } + + private void toolStripButtonWaveformZoomOut_Click(object sender, EventArgs e) + { + if (audioVisualizer.WavePeaks != null && audioVisualizer.Visible) + { + audioVisualizer.ZoomFactor -= 0.1; + SelectZoomTextInComboBox(); + } + } + + private void toolStripComboBoxWaveform_SelectedIndexChanged(object sender, EventArgs e) + { + try + { + if (toolStripComboBoxWaveform.SelectedItem is ComboBoxZoomItem item) + { + audioVisualizer.ZoomFactor = item.ZoomFactor; + } + } + catch + { + // ignore + } + } + + private void SelectZoomTextInComboBox() + { + int i = 0; + foreach (ComboBoxZoomItem item in toolStripComboBoxWaveform.Items) + { + if (Math.Abs(audioVisualizer.ZoomFactor - item.ZoomFactor) < 0.001) + { + toolStripComboBoxWaveform.SelectedIndex = i; + return; + } + + i++; + } + } + + private void toolStripButtonWaveformPause_Click(object sender, EventArgs e) + { + mediaPlayer.Pause(); + } + + private void toolStripButtonWaveformPlay_Click(object sender, EventArgs e) + { + mediaPlayer.Play(); + } + + private void toolStripButtonLockCenter_Click(object sender, EventArgs e) + { + toolStripButtonLockCenter.Checked = !toolStripButtonLockCenter.Checked; + audioVisualizer.Locked = toolStripButtonLockCenter.Checked; + Configuration.Settings.General.WaveformCenter = audioVisualizer.Locked; + } + + private void trackBarWaveformPosition_ValueChanged(object sender, EventArgs e) + { + mediaPlayer.CurrentPosition = trackBarWaveformPosition.Value; + } + + private void buttonCustomUrl_Click(object sender, EventArgs e) + { + RunCustomSearch(Configuration.Settings.VideoControls.CustomSearchUrl1); + } + + private void buttonCustomUrl2_Click(object sender, EventArgs e) + { + RunCustomSearch(Configuration.Settings.VideoControls.CustomSearchUrl2); + } + + private void ShowhideWaveformToolStripMenuItemClick(object sender, EventArgs e) + { + toolStripButtonToggleWaveform_Click(null, null); + } + + private void AudioWaveformDragEnter(object sender, DragEventArgs e) + { + // make sure they're actually dropping files (not text or anything else) + if (e.Data.GetDataPresent(DataFormats.FileDrop, false)) + { + e.Effect = DragDropEffects.All; + } + } + + private void AudioWaveformDragDrop(object sender, DragEventArgs e) + { + var files = (string[])e.Data.GetData(DataFormats.FileDrop); + if (files.Length != 1) + { + MessageBox.Show(_language.DropOnlyOneFile); + return; + } + + string fileName = files[0]; + string ext = Path.GetExtension(fileName).ToLowerInvariant(); + if (ext != ".wav" || !WavePeakGenerator.IsFileValidForVisualizer(fileName)) + { + if (audioVisualizer.WavePeaks == null && (Utilities.VideoFileExtensions.Contains(ext) || Utilities.AudioFileExtensions.Contains(ext))) + { + VideoFileName = fileName; + AudioWaveform_Click(null, null); + OpenVideo(VideoFileName); + return; + } + + try + { + var fi = new FileInfo(fileName); + if (fi.Length < 1024 * 500) + { + var lines = new List(File.ReadAllLines(fileName)); + foreach (SubtitleFormat format in SubtitleFormat.AllSubtitleFormats) + { + if (format.IsMine(lines, fileName)) + { + OpenSubtitle(fileName, null); + return; + } + } + } + } + catch + { + } + } + + if (ext != ".wav") + { + MessageBox.Show(".wav only!"); + return; + } + + if (VideoFileName == null) + { + OpenVideo(fileName); + return; + } + + using (var addWaveform = new AddWaveform()) + { + string peakWaveFileName = WavePeakGenerator.GetPeakWaveFileName(VideoFileName); + string spectrogramFolder = WavePeakGenerator.SpectrogramDrawer.GetSpectrogramFolder(VideoFileName); + addWaveform.InitializeViaWaveFile(fileName, peakWaveFileName, spectrogramFolder); + if (addWaveform.ShowDialog() == DialogResult.OK) + { + audioVisualizer.WavePeaks = addWaveform.Peaks; + audioVisualizer.SetSpectrogram(addWaveform.Spectrogram); + timerWaveform.Start(); + } + } + } + + private void toolStripMenuItemImportBluRaySup_Click(object sender, EventArgs e) + { + if (ContinueNewOrExit()) + { + openFileDialog1.Title = _language.OpenBluRaySupFile; + openFileDialog1.FileName = string.Empty; + openFileDialog1.Filter = _language.BluRaySupFiles + "|*.sup"; + if (openFileDialog1.ShowDialog(this) == DialogResult.OK) + { + if (!FileUtil.IsBluRaySup(openFileDialog1.FileName) && FileUtil.IsSpDvdSup(openFileDialog1.FileName)) + { + ImportAndOcrSpDvdSup(openFileDialog1.FileName, false); + return; + } + + ImportAndOcrBluRaySup(openFileDialog1.FileName, false); + } + } + } + + private void ImportAndOcrBluRaySup(string fileName, bool showInTaskbar) + { + var log = new StringBuilder(); + var subtitles = BluRaySupParser.ParseBluRaySup(fileName, log); + if (subtitles.Count == 0) + { + string msg = _language.BlurayNotSubtitlesFound + Environment.NewLine + Environment.NewLine + log.ToString(); + if (msg.Length > 800) + { + msg = msg.Substring(0, 800); + } + + MessageBox.Show(msg.Trim() + "..."); + return; + } + + using (var vobSubOcr = new VobSubOcr()) + { + if (showInTaskbar) + { + vobSubOcr.Icon = (Icon)Icon.Clone(); + vobSubOcr.ShowInTaskbar = true; + vobSubOcr.ShowIcon = true; + } + + vobSubOcr.Initialize(subtitles, Configuration.Settings.VobSubOcr, fileName); + vobSubOcr.FileName = Path.GetFileName(fileName); + if (vobSubOcr.ShowDialog(this) == DialogResult.OK) + { + MakeHistoryForUndo(_language.BeforeImportingBluRaySupFile); + FileNew(); + _subtitle.Paragraphs.Clear(); + SetCurrentFormat(Configuration.Settings.General.DefaultSubtitleFormat); + foreach (var p in vobSubOcr.SubtitleFromOcr.Paragraphs) + { + _subtitle.Paragraphs.Add(p); + } + + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + _subtitleListViewIndex = -1; + SubtitleListview1.FirstVisibleIndex = -1; + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + + _fileName = Path.ChangeExtension(fileName, GetCurrentSubtitleFormat().Extension); + SetTitle(); + _converted = true; + + Configuration.Settings.Save(); + } + else + { + _exitWhenLoaded = _loading; + } + } + } + + private void selectAllToolStripMenuItem_Click(object sender, EventArgs e) + { + GetFocusedTextBox().SelectAll(); + } + + private void cutToolStripMenuItem_Click(object sender, EventArgs e) + { + GetFocusedTextBox().Cut(); + } + + private void copyToolStripMenuItem_Click(object sender, EventArgs e) + { + GetFocusedTextBox().Copy(); + } + + private void PasteToolStripMenuItemClick(object sender, EventArgs e) + { + GetFocusedTextBox().Paste(); + } + + private void DeleteToolStripMenuItemClick(object sender, EventArgs e) + { + GetFocusedTextBox().SelectedText = string.Empty; + } + + private void NormalToolStripMenuItem1Click(object sender, EventArgs e) + { + var tb = GetFocusedTextBox(); + + if (tb.SelectionLength == 0) + { + var allText = HtmlUtil.RemoveHtmlTags(tb.Text); + allText = NetflixImsc11Japanese.RemoveTags(allText); + tb.Text = allText; + return; + } + + string text = tb.SelectedText; + int selectionStart = tb.SelectionStart; + text = HtmlUtil.RemoveHtmlTags(text); + text = NetflixImsc11Japanese.RemoveTags(text); + tb.SelectedText = text; + tb.SelectionStart = selectionStart; + tb.SelectionLength = text.Length; + } + + private SETextBox GetFocusedTextBox() + { + if (!textBoxListViewTextAlternate.Visible) + { + return textBoxListViewText; + } + + return textBoxListViewTextAlternate.Focused ? textBoxListViewTextAlternate : textBoxListViewText; + } + + private void TextBoxListViewToggleTag(string tag) + { + var tb = GetFocusedTextBox(); + + string text; + int selectionStart = tb.SelectionStart; + + // No text selected. + if (tb.SelectedText.Length == 0) + { + text = tb.Text; + + // Split lines (split a subtitle into its lines). + var lines = text.SplitToLines(); + + // Get current line index (the line where the cursor is current located). + int numberOfNewLines = 0; + for (int i = 0; i < tb.SelectionStart && i < text.Length; i++) + { + if (text[i] == '\n') + { + numberOfNewLines++; + } + } + int selectedLineIdx = numberOfNewLines; // Do not use 'GetLineFromCharIndex' as it also counts when lines are wrapped + + // Get line from index. + string selectedLine = lines[selectedLineIdx]; + + // Test if line at where cursor is current at is a dialog. + bool isDialog = selectedLine.StartsWith('-') || + selectedLine.StartsWith("<" + tag + ">-", StringComparison.OrdinalIgnoreCase); + + // Will be used keep cursor in its previous location after toggle/untoggle. + int textLen = text.Length; + + // 1st set the cursor position to zero. + tb.SelectionStart = 0; + + // If is dialog, only toggle/Untoggle line where caret/cursor is current at. + if (isDialog) + { + lines[selectedLineIdx] = HtmlUtil.ToggleTag(selectedLine, tag); + text = string.Join(Environment.NewLine, lines); + } + else + { + text = HtmlUtil.ToggleTag(text, tag); + } + + tb.Text = text; + // Note: Math.Max will prevent blowing if caret is at the begining and tag was untoggled. + tb.SelectionStart = textLen > text.Length ? Math.Max(selectionStart - 3, 0) : selectionStart + 3; + } + else + { + string post = string.Empty; + string pre = string.Empty; + // There is text selected + text = tb.SelectedText; + while (text.EndsWith(' ') || text.EndsWith(Environment.NewLine, StringComparison.Ordinal) || text.StartsWith(' ') || text.StartsWith(Environment.NewLine, StringComparison.Ordinal)) + { + if (text.EndsWith(' ')) + { + post += " "; + text = text.Remove(text.Length - 1); + } + + if (text.EndsWith(Environment.NewLine, StringComparison.Ordinal)) + { + post += Environment.NewLine; + text = text.Remove(text.Length - 2); + } + + if (text.StartsWith(' ')) + { + pre += " "; + text = text.Remove(0, 1); + } + + if (text.StartsWith(Environment.NewLine, StringComparison.Ordinal)) + { + pre += Environment.NewLine; + text = text.Remove(0, 2); + } + } + + text = HtmlUtil.ToggleTag(text, tag); + // Update text and maintain selection. + if (pre.Length > 0) + { + text = pre + text; + selectionStart += pre.Length; + } + + if (post.Length > 0) + { + text = text + post; + } + + tb.SelectedText = text; + tb.SelectionStart = selectionStart; + tb.SelectionLength = text.Length; + } + } + + private void BoldToolStripMenuItem1Click(object sender, EventArgs e) + { + TextBoxListViewToggleTag(HtmlUtil.TagBold); + } + + private void ItalicToolStripMenuItem1Click(object sender, EventArgs e) + { + TextBoxListViewToggleTag(HtmlUtil.TagItalic); + } + + private void UnderlineToolStripMenuItem1Click(object sender, EventArgs e) + { + TextBoxListViewToggleTag(HtmlUtil.TagUnderline); + } + + private void ColorToolStripMenuItem1Click(object sender, EventArgs e) + { + var tb = GetFocusedTextBox(); + string text = tb.SelectedText; + if (string.IsNullOrEmpty(text) && tb.Text.Length > 0) + { + text = tb.Text; + tb.SelectAll(); + } + int selectionStart = tb.SelectionStart; + + string color; + var formatType = GetCurrentSubtitleFormat().GetType(); + if (formatType == typeof(Ebu)) + { + using (var form = new EbuColorPicker(true)) + { + if (form.ShowDialog(this) != DialogResult.OK) + { + return; + } + + color = form.Color; + } + } + else if (formatType == typeof(ScenaristClosedCaptions) || formatType == typeof(ScenaristClosedCaptionsDropFrame)) + { + using (var form = new EbuColorPicker(false)) + { + if (form.ShowDialog(this) != DialogResult.OK) + { + return; + } + + color = form.Color; + } + } + else + { + if (colorDialog1.ShowDialog(this) != DialogResult.OK) + { + return; + } + + color = Utilities.ColorToHex(colorDialog1.Color); + } + + bool done = false; + string pre = string.Empty; + if (selectionStart == 0 && text.StartsWith("{\\", StringComparison.Ordinal) && text.IndexOf('}') >= 0) + { + int endIndex = text.IndexOf('}') + 1; + pre = text.Substring(0, endIndex); + text = text.Remove(0, endIndex); + } + + string s = text; + if (s.StartsWith("'); + if (end > 0) + { + string f = s.Substring(0, end); + if (f.Contains(" face=", StringComparison.OrdinalIgnoreCase) && !f.Contains(" color=", StringComparison.OrdinalIgnoreCase)) + { + var start = s.IndexOf(" face=", StringComparison.OrdinalIgnoreCase); + s = s.Insert(start, string.Format(" color=\"{0}\"", color)); + text = s; + done = true; + } + else if (f.Contains(" color=", StringComparison.OrdinalIgnoreCase)) + { + int colorStart = f.IndexOf(" color=", StringComparison.OrdinalIgnoreCase); + if (s.IndexOf('"', colorStart + " color=".Length + 1) > 0) + { + end = s.IndexOf('"', colorStart + " color=".Length + 1); + } + + s = s.Substring(0, colorStart) + string.Format(" color=\"{0}", color) + s.Substring(end); + text = s; + done = true; + } + } + } + + if (!done) + { + text = $"{pre}{text}"; + } + else + { + text = pre + text; + } + + tb.SelectedText = text; + tb.SelectionStart = selectionStart; + tb.SelectionLength = text.Length; + } + + private void FontNameToolStripMenuItemClick(object sender, EventArgs e) + { + var tb = GetFocusedTextBox(); + + // font name + string text = tb.SelectedText; + if (string.IsNullOrEmpty(text) && tb.Text.Length > 0) + { + text = tb.Text; + tb.SelectAll(); + } + int selectionStart = tb.SelectionStart; + + using (var form = new ChooseFontName()) + { + if (form.ShowDialog(this) == DialogResult.OK) + { + bool done = false; + + string pre = string.Empty; + if (selectionStart == 0 && text.StartsWith("{\\", StringComparison.Ordinal) && text.IndexOf('}') >= 0) + { + int endIndex = text.IndexOf('}') + 1; + pre = text.Substring(0, endIndex); + text = text.Remove(0, endIndex); + } + + if (text.StartsWith("'); + if (end > 0) + { + string f = text.Substring(0, end); + if (f.Contains(" color=", StringComparison.OrdinalIgnoreCase) && !f.Contains(" face=", StringComparison.OrdinalIgnoreCase)) + { + var start = text.IndexOf(" color=", StringComparison.OrdinalIgnoreCase); + text = text.Insert(start, string.Format(" face=\"{0}\"", form.FontName)); + done = true; + } + else if (f.Contains(" face=", StringComparison.OrdinalIgnoreCase)) + { + int faceStart = f.IndexOf(" face=", StringComparison.OrdinalIgnoreCase); + if (text.IndexOf('"', faceStart + " face=".Length + 1) > 0) + { + end = text.IndexOf('"', faceStart + " face=".Length + 1); + } + + text = text.Substring(0, faceStart) + string.Format(" face=\"{0}", form.FontName) + text.Substring(end); + done = true; + } + } + } + + if (!done) + { + text = $"{pre}{text}"; + } + else + { + text = pre + text; + } + + tb.SelectedText = text; + tb.SelectionStart = selectionStart; + tb.SelectionLength = text.Length; + } + } + } + + public void SetSubtitle(Subtitle subtitle, string message) + { + _subtitle = subtitle; + SubtitleListview1.Fill(subtitle, _subtitleAlternate); + ShowStatus(message); + } + + #region Networking + + private void startServerToolStripMenuItem_Click(object sender, EventArgs e) + { + using (var networkNew = new NetworkStart()) + { + _networkSession = new NikseWebServiceSession(_subtitle, _subtitleAlternate, TimerWebServiceTick, OnUpdateUserLogEntries); + networkNew.Initialize(_networkSession, _fileName); + if (networkNew.ShowDialog(this) == DialogResult.OK) + { + _networkSession.AppendToLog(string.Format(_language.XStartedSessionYAtZ, _networkSession.CurrentUser.UserName, _networkSession.SessionId, DateTime.Now.ToLongTimeString())); + toolStripStatusNetworking.Visible = true; + toolStripStatusNetworking.Text = _language.NetworkMode; + EnableDisableControlsNotWorkingInNetworkMode(false); + SubtitleListview1.ShowNetworkColumn(_language.UserAndAction); + SubtitleListview1.AutoSizeAllColumns(this); + TimerWebServiceTick(null, null); + } + else + { + _networkSession = null; + } + } + } + + private void joinSessionToolStripMenuItem_Click(object sender, EventArgs e) + { + _networkSession = new NikseWebServiceSession(_subtitle, _subtitleAlternate, TimerWebServiceTick, OnUpdateUserLogEntries); + using (var networkJoin = new NetworkJoin()) + { + networkJoin.Initialize(_networkSession); + + if (networkJoin.ShowDialog(this) == DialogResult.OK) + { + _subtitle = _networkSession.Subtitle; + _subtitleAlternate = _networkSession.OriginalSubtitle; + if (_subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) + { + SubtitleListview1.ShowAlternateTextColumn(_languageGeneral.OriginalText); + } + + _fileName = networkJoin.FileName; + SetTitle(); + toolStripStatusNetworking.Visible = true; + toolStripStatusNetworking.Text = _language.NetworkMode; + EnableDisableControlsNotWorkingInNetworkMode(false); + _networkSession.AppendToLog(string.Format(_language.XStartedSessionYAtZ, _networkSession.CurrentUser.UserName, _networkSession.SessionId, DateTime.Now.ToLongTimeString())); + SubtitleListview1.ShowNetworkColumn(_language.UserAndAction); + SubtitleListview1.AutoSizeAllColumns(this); + _subtitleListViewIndex = -1; + _oldSelectedParagraph = null; + + if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) + { + buttonUnBreak.Visible = false; + buttonAutoBreak.Visible = false; + buttonSplitLine.Visible = false; + + textBoxListViewText.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom; + textBoxListViewText.Width = (groupBoxEdit.Width - (textBoxListViewText.Left + 10)) / 2; + textBoxListViewTextAlternate.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom; + textBoxListViewTextAlternate.Left = textBoxListViewText.Left + textBoxListViewText.Width + 3; + textBoxListViewTextAlternate.Width = textBoxListViewText.Width; + textBoxListViewTextAlternate.Visible = true; + labelAlternateText.Text = _languageGeneral.OriginalText; + labelAlternateText.Visible = true; + labelAlternateCharactersPerSecond.Visible = true; + labelTextAlternateLineLengths.Visible = true; + labelAlternateSingleLine.Visible = true; + labelAlternateSingleLinePixels.Visible = true; + labelTextAlternateLineTotal.Visible = true; + + labelCharactersPerSecond.Left = textBoxListViewText.Left + (textBoxListViewText.Width - labelCharactersPerSecond.Width); + labelTextLineTotal.Left = textBoxListViewText.Left + (textBoxListViewText.Width - labelTextLineTotal.Width); + AddAlternate(); + Main_Resize(null, null); + _changeAlternateSubtitleHash = _subtitleAlternate.GetFastHashCode(GetCurrentEncoding().BodyName); + } + else + { + RemoveAlternate(false, true); + } + + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + TimerWebServiceTick(null, null); + } + else + { + _networkSession = null; + } + } + } + + private void EnableDisableControlsNotWorkingInNetworkMode(bool enabled) + { + //Top menu + newToolStripMenuItem.Enabled = enabled; + openToolStripMenuItem.Enabled = enabled; + reopenToolStripMenuItem.Enabled = enabled; + toolStripMenuItemOpenContainingFolder.Enabled = enabled; + toolStripMenuItemCompare.Enabled = enabled; + toolStripMenuItemImportDvdSubtitles.Enabled = enabled; + toolStripMenuItemSubIdx.Enabled = enabled; + toolStripMenuItemImportBluRaySup.Enabled = enabled; + matroskaImportStripMenuItem.Enabled = enabled; + toolStripMenuItemManualAnsi.Enabled = enabled; + toolStripMenuItemImportText.Enabled = enabled; + toolStripMenuItemImportTimeCodes.Enabled = enabled; + + showHistoryforUndoToolStripMenuItem.Enabled = enabled; + multipleReplaceToolStripMenuItem.Enabled = enabled; + + toolsToolStripMenuItem.Enabled = enabled; + + toolStripMenuItemSynchronization.Enabled = enabled; + + toolStripMenuItemAutoTranslate.Enabled = enabled; + + //Toolbar + toolStripButtonFileNew.Enabled = enabled; + toolStripButtonFileOpen.Enabled = enabled; + toolStripMenuItemOpenKeepVideo.Enabled = enabled; + toolStripMenuItemRestoreAutoBackup.Enabled = enabled; + toolStripButtonVisualSync.Enabled = enabled; + + // textbox source + textBoxSource.ReadOnly = !enabled; + } + + internal void TimerWebServiceTick(object sender, EventArgs e) + { + if (_networkSession == null) + { + return; + } + + List deleteIndices = new List(); + NetworkGetSendUpdates(deleteIndices, 0, null); + } + + private void NetworkGetSendUpdates(List deleteIndices, int insertIndex, Paragraph insertParagraph) + { + _networkSession.TimerStop(); + + bool doReFill = false; + bool updateListViewStatus = false; + SubtitleListview1.SelectedIndexChanged -= SubtitleListview1_SelectedIndexChanged; + string message = string.Empty; + + int numberOfLines = 0; + List updates = null; + int numberOfRetries = 10; + while (numberOfRetries > 0) + { + numberOfRetries--; + try + { + updates = _networkSession.GetUpdates(out message, out numberOfLines); + numberOfRetries = 0; + } + catch (Exception exception) + { + if (numberOfRetries <= 0) + { + if (exception.InnerException != null) + { + MessageBox.Show(string.Format(_language.NetworkUnableToConnectToServer, exception.InnerException.Message + Environment.NewLine + exception.InnerException.StackTrace)); + } + else + { + MessageBox.Show(string.Format(_language.NetworkUnableToConnectToServer, exception.Message + Environment.NewLine + exception.StackTrace)); + } + + _networkSession.TimerStop(); + if (_networkChat != null && !_networkChat.IsDisposed) + { + _networkChat.Close(); + _networkChat = null; + } + + _networkSession = null; + EnableDisableControlsNotWorkingInNetworkMode(true); + toolStripStatusNetworking.Visible = false; + SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.Network); + _networkChat = null; + return; + } + + Application.DoEvents(); + System.Threading.Thread.Sleep(250); + } + } + + int currentSelectedIndex = -1; + if (SubtitleListview1.SelectedItems.Count > 0) + { + currentSelectedIndex = SubtitleListview1.SelectedItems[0].Index; + } + + int oldCurrentSelectedIndex = currentSelectedIndex; + if (message == "OK") + { + foreach (var update in updates) + { + if (!string.IsNullOrEmpty(update.Text)) + { + if (!update.Text.Contains(Environment.NewLine)) + { + update.Text = update.Text.Replace("\n", Environment.NewLine); + } + + update.Text = WebUtility.HtmlDecode(update.Text).Replace("
", Environment.NewLine); + } + + if (update.User.Ip != _networkSession.CurrentUser.Ip || update.User.UserName != _networkSession.CurrentUser.UserName) + { + if (update.Action == "USR") + { + _networkSession.Users.Add(update.User); + if (_networkChat != null && !_networkChat.IsDisposed) + { + _networkChat.AddUser(update.User); + } + + _networkSession.AppendToLog(string.Format(_language.NetworkNewUser, update.User.UserName, update.User.Ip)); + } + else if (update.Action == "MSG") + { + _networkSession.ChatLog.Add(new NikseWebServiceSession.ChatEntry { User = update.User, Message = update.Text }); + if (_networkChat == null || _networkChat.IsDisposed) + { + _networkChat = new NetworkChat(); + _networkChat.Initialize(_networkSession); + _networkChat.Show(this); + } + else + { + _networkChat.AddChatMessage(update.User, update.Text); + } + + if (!string.IsNullOrEmpty(Configuration.Settings.NetworkSettings.NewMessageSound) && File.Exists(Configuration.Settings.NetworkSettings.NewMessageSound)) + { + try + { + using (var soundPlayer = new System.Media.SoundPlayer(Configuration.Settings.NetworkSettings.NewMessageSound)) + { + soundPlayer.Play(); + } + } + catch + { + } + } + + _networkSession.AppendToLog(string.Format(_language.NetworkMessage, update.User.UserName, update.User.Ip, update.Text)); + } + else if (update.Action == "DEL") + { + doReFill = true; + _subtitle.Paragraphs.RemoveAt(update.Index); + if (_networkSession.LastSubtitle != null) + { + _networkSession.LastSubtitle.Paragraphs.RemoveAt(update.Index); + } + + _networkSession.AppendToLog(string.Format(_language.NetworkDelete, update.User.UserName, update.User.Ip, update.Index)); + _networkSession.AdjustUpdateLogToDelete(update.Index); + + if (deleteIndices.Count > 0) + { + for (int i = deleteIndices.Count - 1; i >= 0; i--) + { + int index = deleteIndices[i]; + if (index == update.Index) + { + deleteIndices.RemoveAt(i); + } + else if (index > update.Index) + { + deleteIndices[i] = index - 1; + } + } + } + + if (insertIndex > update.Index) + { + insertIndex--; + } + + if (currentSelectedIndex >= 0 && currentSelectedIndex > update.Index) + { + currentSelectedIndex--; + } + } + else if (update.Action == "INS") + { + doReFill = true; + var p = new Paragraph(update.Text, update.StartMilliseconds, update.EndMilliseconds); + _subtitle.Paragraphs.Insert(update.Index, p); + if (_networkSession.LastSubtitle != null) + { + _networkSession.LastSubtitle.Paragraphs.Insert(update.Index, new Paragraph(p)); + } + + _networkSession.AppendToLog(string.Format(_language.NetworkInsert, update.User.UserName, update.User.Ip, update.Index, UiUtil.GetListViewTextFromString(update.Text))); + _networkSession.AddToWsUserLog(update.User, update.Index, update.Action, false); + updateListViewStatus = true; + _networkSession.AdjustUpdateLogToInsert(update.Index); + + if (deleteIndices.Count > 0) + { + for (int i = deleteIndices.Count - 1; i >= 0; i--) + { + int index = deleteIndices[i]; + if (index > update.Index) + { + deleteIndices[i] = index + 1; + } + } + } + + if (insertIndex > update.Index) + { + insertIndex++; + } + + if (currentSelectedIndex >= 0 && currentSelectedIndex > update.Index) + { + currentSelectedIndex++; + } + } + else if (update.Action == "UPD") + { + updateListViewStatus = true; + var p = _subtitle.GetParagraphOrDefault(update.Index); + if (p != null) + { + p.StartTime.TotalMilliseconds = update.StartMilliseconds; + p.EndTime.TotalMilliseconds = update.EndMilliseconds; + p.Text = update.Text; + SubtitleListview1.SetTimeAndText(update.Index, p, _subtitle.GetParagraphOrDefault(update.Index + 1)); + _networkSession.AppendToLog(string.Format(_language.NetworkUpdate, update.User.UserName, update.User.Ip, update.Index, UiUtil.GetListViewTextFromString(update.Text))); + _networkSession.AddToWsUserLog(update.User, update.Index, update.Action, true); + updateListViewStatus = true; + } + + if (_networkSession.LastSubtitle != null) + { + p = _networkSession.LastSubtitle.GetParagraphOrDefault(update.Index); + if (p != null) + { + p.StartTime.TotalMilliseconds = update.StartMilliseconds; + p.EndTime.TotalMilliseconds = update.EndMilliseconds; + p.Text = update.Text; + } + } + } + else if (update.Action == "BYE") + { + if (_networkChat != null && !_networkChat.IsDisposed) + { + _networkChat.RemoveUser(update.User); + } + + SeNetworkService.SeUser removeUser = null; + foreach (var user in _networkSession.Users) + { + if (user.UserName == update.User.UserName) + { + removeUser = user; + break; + } + } + + if (removeUser != null) + { + _networkSession.Users.Remove(removeUser); + } + + _networkSession.AppendToLog(string.Format(_language.NetworkByeUser, update.User.UserName, update.User.Ip)); + } + else + { + _networkSession.AppendToLog("UNKNOWN ACTION: " + update.Action + " by " + update.User.UserName + " (" + update.User.Ip + ")"); + } + } + } + + if (numberOfLines != _subtitle.Paragraphs.Count) + { + _subtitle = _networkSession.ReloadSubtitle(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + UpdateListviewWithUserLogEntries(); + _networkSession.LastSubtitle = new Subtitle(_subtitle); + _oldSelectedParagraph = null; + SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; + _networkSession.TimerStart(); + RefreshSelectedParagraph(); + return; + } + + if (deleteIndices.Count > 0) + { + deleteIndices.Sort(); + deleteIndices.Reverse(); + foreach (int i in deleteIndices) + { + _subtitle.Paragraphs.RemoveAt(i); + if (_networkSession.LastSubtitle != null && i < _networkSession.LastSubtitle.Paragraphs.Count) + { + _networkSession.LastSubtitle.Paragraphs.RemoveAt(i); + } + } + + _networkSession.DeleteLines(deleteIndices); + doReFill = true; + } + + if (insertIndex >= 0 && insertParagraph != null) + { + _subtitle.Paragraphs.Insert(insertIndex, insertParagraph); + if (_networkSession.LastSubtitle != null && insertIndex < _networkSession.LastSubtitle.Paragraphs.Count) + { + _networkSession.LastSubtitle.Paragraphs.Insert(insertIndex, insertParagraph); + } + + _networkSession.InsertLine(insertIndex, insertParagraph); + doReFill = true; + } + + _networkSession.CheckForAndSubmitUpdates(); // updates only (no inserts/deletes) + } + else + { + if (message == "Session not found!") + { + message = _networkSession.Restart(); + if (message == "Reload") + { + _subtitle = _networkSession.ReloadSubtitle(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + UpdateListviewWithUserLogEntries(); + _networkSession.LastSubtitle = new Subtitle(_subtitle); + _oldSelectedParagraph = null; + SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; + _networkSession.TimerStart(); + RefreshSelectedParagraph(); + return; + } + + if (message == "OK") + { + _networkSession.TimerStart(); + RefreshSelectedParagraph(); + return; + } + } + else if (message == "User not found!") + { + message = _networkSession.ReJoin(); + if (message == "Reload") + { + _subtitle = _networkSession.ReloadSubtitle(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + UpdateListviewWithUserLogEntries(); + _networkSession.LastSubtitle = new Subtitle(_subtitle); + _oldSelectedParagraph = null; + SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; + _networkSession.TimerStart(); + RefreshSelectedParagraph(); + return; + } + } + + MessageBox.Show(message); + LeaveSessionToolStripMenuItemClick(null, null); + SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; + return; + } + + if (doReFill) + { + _subtitle.Renumber(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + UpdateListviewWithUserLogEntries(); + + if (oldCurrentSelectedIndex != currentSelectedIndex) + { + _oldSelectedParagraph = null; + _subtitleListViewIndex = currentSelectedIndex; + SubtitleListview1.SelectIndexAndEnsureVisible(_subtitleListViewIndex); + } + else if (_oldSelectedParagraph != null) + { + var p = _subtitle.GetFirstAlike(_oldSelectedParagraph); + if (p == null) + { + var tmp = new Paragraph(_oldSelectedParagraph); + tmp.Text = textBoxListViewText.Text; + p = _subtitle.GetFirstAlike(tmp); + } + + if (p == null) + { + int idx = oldCurrentSelectedIndex; + if (idx >= _subtitle.Paragraphs.Count) + { + idx = _subtitle.Paragraphs.Count - 1; + } + + if (idx >= 0 && idx < _subtitle.Paragraphs.Count) + { + SubtitleListview1.SelectIndexAndEnsureVisible(idx); + _listViewTextUndoIndex = -1; + SubtitleListView1SelectedIndexChange(); + textBoxListViewText.Text = _subtitle.Paragraphs[idx].Text; + } + } + else + { + _subtitleListViewIndex = _subtitle.GetIndex(p); + SubtitleListview1.SelectIndexAndEnsureVisible(_subtitleListViewIndex); + _listViewTextUndoIndex = -1; + SubtitleListView1SelectedIndexChange(); + } + } + } + else if (updateListViewStatus) + { + UpdateListviewWithUserLogEntries(); + } + + _networkSession.LastSubtitle = new Subtitle(_subtitle); + SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; + _networkSession.TimerStart(); + } + + private void UpdateListviewWithUserLogEntries() + { + SubtitleListview1.BeginUpdate(); + foreach (UpdateLogEntry entry in _networkSession.UpdateLog) + { + SubtitleListview1.SetNetworkText(entry.Index, entry.ToString(), Utilities.GetColorFromUserName(entry.UserName)); + } + + SubtitleListview1.EndUpdate(); + } + + private void LeaveSessionToolStripMenuItemClick(object sender, EventArgs e) + { + if (_networkSession != null) + { + _networkSession.TimerStop(); + _networkSession.Leave(); + } + + if (_networkChat != null && !_networkChat.IsDisposed) + { + _networkChat.Close(); + _networkChat = null; + } + + _networkSession = null; + EnableDisableControlsNotWorkingInNetworkMode(true); + toolStripStatusNetworking.Visible = false; + SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.Network); + _networkChat = null; + } + + private void toolStripMenuItemNetworking_DropDownOpening(object sender, EventArgs e) + { + startServerToolStripMenuItem.Visible = _networkSession == null; + joinSessionToolStripMenuItem.Visible = _networkSession == null; + showSessionKeyLogToolStripMenuItem.Visible = _networkSession != null; + leaveSessionToolStripMenuItem.Visible = _networkSession != null; + chatToolStripMenuItem.Visible = _networkSession != null; + } + + internal void OnUpdateUserLogEntries(object sender, EventArgs e) + { + UpdateListviewWithUserLogEntries(); + } + + private void toolStripStatusNetworking_Click(object sender, EventArgs e) + { + showSessionKeyLogToolStripMenuItem_Click(null, null); + } + + private void showSessionKeyLogToolStripMenuItem_Click(object sender, EventArgs e) + { + using (var networkLog = new NetworkLogAndInfo()) + { + networkLog.Initialize(_networkSession); + networkLog.ShowDialog(this); + } + } + + private void chatToolStripMenuItem_Click(object sender, EventArgs e) + { + if (_networkSession != null) + { + if (_networkChat == null || _networkChat.IsDisposed) + { + _networkChat = new NetworkChat(); + _networkChat.Initialize(_networkSession); + _networkChat.Show(this); + } + else + { + _networkChat.WindowState = FormWindowState.Normal; + } + } + } + + #endregion Networking + + private void UnDockVideoPlayer() + { + bool firstUndock = _videoPlayerUndocked != null && !_videoPlayerUndocked.IsDisposed; + + _videoPlayerUndocked = new VideoPlayerUndocked(this, mediaPlayer); + + if (firstUndock) + { + Configuration.Settings.General.UndockedVideoPosition = _videoPlayerUndocked.Left + @";" + _videoPlayerUndocked.Top + @";" + _videoPlayerUndocked.Width + @";" + _videoPlayerUndocked.Height; + } + + Control control = null; + if (splitContainer1.Panel2.Controls.Count == 0) + { + control = panelVideoPlayer; + groupBoxVideo.Controls.Remove(control); + } + else + { + control = panelVideoPlayer; + splitContainer1.Panel2.Controls.Clear(); + } + + if (control != null) + { + control.Top = 0; + control.Left = 0; + control.Width = _videoPlayerUndocked.PanelContainer.Width; + control.Height = _videoPlayerUndocked.PanelContainer.Height; + _videoPlayerUndocked.PanelContainer.Controls.Add(control); + } + } + + public void ReDockVideoPlayer(Control control) + { + groupBoxVideo.Controls.Add(control); + mediaPlayer.FontSizeFactor = 1.0F; + mediaPlayer.SetSubtitleFont(); + mediaPlayer.SubtitleText = string.Empty; + } + + private void UnDockWaveform() + { + _waveformUndocked = new WaveformUndocked(this); + + var control = audioVisualizer; + groupBoxVideo.Controls.Remove(control); + control.Top = 0; + control.Left = 0; + control.Width = _waveformUndocked.PanelContainer.Width; + control.Height = _waveformUndocked.PanelContainer.Height - panelWaveformControls.Height; + _waveformUndocked.PanelContainer.Controls.Add(control); + + var control2 = (Control)panelWaveformControls; + groupBoxVideo.Controls.Remove(control2); + control2.Top = control.Height; + control2.Left = 0; + _waveformUndocked.PanelContainer.Controls.Add(control2); + + var control3 = (Control)trackBarWaveformPosition; + groupBoxVideo.Controls.Remove(control3); + control3.Top = control.Height; + control3.Left = control2.Width + 2; + control3.Width = _waveformUndocked.PanelContainer.Width - control3.Left; + _waveformUndocked.PanelContainer.Controls.Add(control3); + } + + public void ReDockWaveform(Control waveform, Control buttons, Control trackBar) + { + groupBoxVideo.Controls.Add(waveform); + waveform.Top = 30; + waveform.Height = groupBoxVideo.Height - (waveform.Top + buttons.Height + 10); + + groupBoxVideo.Controls.Add(buttons); + buttons.Top = waveform.Top + waveform.Height + 5; + + groupBoxVideo.Controls.Add(trackBar); + trackBar.Top = buttons.Top; + } + + private void UnDockVideoButtons() + { + _videoControlsUndocked = new VideoControlsUndocked(this); + var control = tabControlButtons; + groupBoxVideo.Controls.Remove(control); + control.Top = 25; + control.Left = 0; + _videoControlsUndocked.PanelContainer.Controls.Add(control); + + groupBoxVideo.Controls.Remove(checkBoxSyncListViewWithVideoWhilePlaying); + _videoControlsUndocked.PanelContainer.Controls.Add(checkBoxSyncListViewWithVideoWhilePlaying); + checkBoxSyncListViewWithVideoWhilePlaying.Top = 5; + checkBoxSyncListViewWithVideoWhilePlaying.Left = 5; + + splitContainerMain.Panel2Collapsed = true; + splitContainer1.Panel2Collapsed = true; + } + + public void ReDockVideoButtons(Control videoButtons, Control checkBoxSyncSubWithVideo) + { + groupBoxVideo.Controls.Add(videoButtons); + videoButtons.Top = 12; + videoButtons.Left = 5; + + groupBoxVideo.Controls.Add(checkBoxSyncSubWithVideo); + checkBoxSyncSubWithVideo.Top = 11; + checkBoxSyncSubWithVideo.Left = videoButtons.Left + videoButtons.Width + 5; + } + + private void UndockVideoControlsToolStripMenuItemClick(object sender, EventArgs e) + { + if (Configuration.Settings.General.Undocked) + { + return; + } + + Configuration.Settings.General.Undocked = true; + if (!_loading) + { + Configuration.Settings.General.SplitContainerMainSplitterDistance = splitContainerMain.SplitterDistance; + Configuration.Settings.General.SplitContainer1SplitterDistance = splitContainer1.SplitterDistance; + Configuration.Settings.General.SplitContainerListViewAndTextSplitterDistance = splitContainerListViewAndText.SplitterDistance; + } + + var top = Math.Max(Top, 0); + var left = Math.Max(Left, 0); + UnDockVideoPlayer(); + splitContainerListViewAndText.SplitterDistance = splitContainerListViewAndText.Height - 109; + if (toolStripButtonToggleVideo.Checked) + { + _videoPlayerUndocked.Show(this); + if (_videoPlayerUndocked.Top < 0 || _videoPlayerUndocked.Left < 0) + { + _videoPlayerUndocked.WindowState = FormWindowState.Normal; + _videoPlayerUndocked.Top = top + 40; + _videoPlayerUndocked.Left = Math.Abs(left - 20); + _videoPlayerUndocked.Width = 600; + _videoPlayerUndocked.Height = 400; + } + } + + UnDockWaveform(); + if (toolStripButtonToggleWaveform.Checked) + { + _waveformUndocked.Show(this); + if (_waveformUndocked.Top < 0 || _waveformUndocked.Left < 0) + { + _waveformUndocked.WindowState = FormWindowState.Normal; + _waveformUndocked.Top = top + 60; + _waveformUndocked.Left = Math.Abs(left - 15); + _waveformUndocked.Width = 600; + _waveformUndocked.Height = 200; + } + } + + UnDockVideoButtons(); + _videoControlsUndocked.Show(this); + if (_videoControlsUndocked.Top < 0 || _videoControlsUndocked.Left < 0) + { + _videoControlsUndocked.WindowState = FormWindowState.Normal; + _videoControlsUndocked.Top = top + 40; + _videoControlsUndocked.Left = Math.Abs(left - 10); + _videoControlsUndocked.Width = tabControlButtons.Width + 20; + _videoControlsUndocked.Height = tabControlButtons.Height + 65; + } + + _isVideoControlsUndocked = true; + SetUndockedWindowsTitle(); + + undockVideoControlsToolStripMenuItem.Visible = false; + redockVideoControlsToolStripMenuItem.Visible = true; + + tabControl1_SelectedIndexChanged(null, null); + _videoControlsUndocked.Refresh(); + } + + public void RedockVideoControlsToolStripMenuItemClick(object sender, EventArgs e) + { + if (!Configuration.Settings.General.Undocked) + { + return; + } + + mediaPlayer.ShowNonFullScreenControls(); + + SaveUndockedPositions(); + + Configuration.Settings.General.Undocked = false; + + if (_videoControlsUndocked != null && !_videoControlsUndocked.IsDisposed) + { + var control = _videoControlsUndocked.PanelContainer.Controls[0]; + var controlCheckBox = _videoControlsUndocked.PanelContainer.Controls[1]; + _videoControlsUndocked.PanelContainer.Controls.Clear(); + ReDockVideoButtons(control, controlCheckBox); + _videoControlsUndocked.Close(); + _videoControlsUndocked = null; + } + + if (_waveformUndocked != null && !_waveformUndocked.IsDisposed) + { + var controlWaveform = _waveformUndocked.PanelContainer.Controls[0]; + var controlButtons = _waveformUndocked.PanelContainer.Controls[1]; + var controlTrackBar = _waveformUndocked.PanelContainer.Controls[2]; + _waveformUndocked.PanelContainer.Controls.Clear(); + ReDockWaveform(controlWaveform, controlButtons, controlTrackBar); + _waveformUndocked.Close(); + _waveformUndocked = null; + } + + if (_videoPlayerUndocked != null && !_videoPlayerUndocked.IsDisposed) + { + var control = _videoPlayerUndocked.PanelContainer.Controls[0]; + _videoPlayerUndocked.PanelContainer.Controls.Remove(control); + ReDockVideoPlayer(control); + _videoPlayerUndocked.Close(); + _videoPlayerUndocked = null; + mediaPlayer.ShowFullscreenButton = Configuration.Settings.General.VideoPlayerShowFullscreenButton; + } + + _isVideoControlsUndocked = false; + _videoPlayerUndocked = null; + _waveformUndocked = null; + _videoControlsUndocked = null; + ShowVideoPlayer(); + + audioVisualizer.Visible = toolStripButtonToggleWaveform.Checked; + trackBarWaveformPosition.Visible = toolStripButtonToggleWaveform.Checked; + panelWaveformControls.Visible = toolStripButtonToggleWaveform.Checked; + if (!toolStripButtonToggleVideo.Checked) + { + HideVideoPlayer(); + } + + mediaPlayer.Invalidate(); + Refresh(); + + undockVideoControlsToolStripMenuItem.Visible = true; + redockVideoControlsToolStripMenuItem.Visible = false; + SubtitleListview1.SelectIndexAndEnsureVisible(_subtitleListViewIndex, true); + + splitContainerMain.SplitterDistance = Configuration.Settings.General.SplitContainerMainSplitterDistance; + splitContainer1.SplitterDistance = Configuration.Settings.General.SplitContainer1SplitterDistance; + splitContainerListViewAndText.SplitterDistance = Configuration.Settings.General.SplitContainerListViewAndTextSplitterDistance; + } + + private void Bw_DoWork(object sender, DoWorkEventArgs e) + { + System.Threading.Thread.Sleep(1200); + } + + internal void SetWaveformToggleOff() + { + toolStripButtonToggleWaveform.Checked = false; + } + + internal void SetVideoPlayerToggleOff() + { + toolStripButtonToggleVideo.Checked = false; + } + + private void ToolStripMenuItemInsertSubtitleClick(object sender, EventArgs e) + { + openFileDialog1.Title = _languageGeneral.OpenSubtitle; + openFileDialog1.FileName = string.Empty; + openFileDialog1.Filter = UiUtil.SubtitleExtensionFilter.Value; + if (openFileDialog1.ShowDialog(this) == DialogResult.OK) + { + if (!File.Exists(openFileDialog1.FileName)) + { + return; + } + + var fi = new FileInfo(openFileDialog1.FileName); + if (fi.Length > 1024 * 1024 * 10) // max 10 mb + { + var text = string.Format(_language.FileXIsLargerThan10MB + Environment.NewLine + Environment.NewLine + _language.ContinueAnyway, openFileDialog1.FileName); + if (MessageBox.Show(this, text, Title, MessageBoxButtons.YesNoCancel) != DialogResult.Yes) + { + return; + } + } + + MakeHistoryForUndo(string.Format(_language.BeforeInsertLine, openFileDialog1.FileName)); + + var subtitle = new Subtitle(); + SubtitleFormat format = subtitle.LoadSubtitle(openFileDialog1.FileName, out var encoding, null); + + if (format != null) + { + SaveSubtitleListviewIndices(); + if (Configuration.Settings.General.RemoveBlankLinesWhenOpening) + { + subtitle.RemoveEmptyLines(); + } + + int index = FirstSelectedIndex + 1; + if (index < 0) + { + index = 0; + } + + var last = _subtitle.GetParagraphOrDefault(index - 1); + var newFirst = subtitle.GetParagraphOrDefault(0); + if (last != null && newFirst != null && newFirst.StartTime.TotalMilliseconds < last.EndTime.TotalMilliseconds) + { + var addMilliseconds = last.EndTime.TotalMilliseconds - newFirst.StartTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines; + subtitle.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(addMilliseconds)); + } + + foreach (var p in subtitle.Paragraphs) + { + _subtitle.Paragraphs.Insert(index, new Paragraph(p)); + index++; + } + + if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) + { + index = FirstSelectedIndex; + if (index < 0) + { + index = 0; + } + + var current = _subtitle.GetParagraphOrDefault(index); + if (current != null) + { + var original = Utilities.GetOriginalParagraph(index, current, _subtitleAlternate.Paragraphs); + if (original != null) + { + index = _subtitleAlternate.GetIndex(original); + foreach (var p in subtitle.Paragraphs) + { + _subtitleAlternate.Paragraphs.Insert(index, new Paragraph(p)); + index++; + } + + if (subtitle.Paragraphs.Count > 0) + { + _subtitleAlternate.Renumber(); + } + } + } + } + + _subtitle.Renumber(); + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + } + } + } + + private void InsertLineToolStripMenuItemClick(object sender, EventArgs e) + { + if (_subtitle == null || _subtitle.Paragraphs.Count == 0) + { + InsertBefore(); + } + else + { + SubtitleListview1.SelectIndexAndEnsureVisible(_subtitle.Paragraphs.Count - 1, true); + InsertAfter(string.Empty); + SubtitleListview1.SelectIndexAndEnsureVisible(_subtitle.Paragraphs.Count - 1, true); + } + } + + private void CloseVideoToolStripMenuItemClick(object sender, EventArgs e) + { + timer1.Stop(); + if (mediaPlayer.VideoPlayer != null) + { + mediaPlayer.PauseAndDisposePlayer(); + } + + mediaPlayer.SetPlayerName(string.Empty); + mediaPlayer.ResetTimeLabel(); + mediaPlayer.VideoPlayer = null; + mediaPlayer.CurrentPosition = 0; + VideoFileName = null; + _videoInfo = null; + VideoAudioTrackNumber = -1; + labelVideoInfo.Text = _languageGeneral.NoVideoLoaded; + audioVisualizer.WavePeaks = null; + audioVisualizer.SetSpectrogram(null); + audioVisualizer.SceneChanges = new List(); + audioVisualizer.Chapters = new List(); + timeUpDownVideoPositionAdjust.TimeCode = new TimeCode(); + timeUpDownVideoPositionAdjust.Enabled = false; + timeUpDownVideoPosition.TimeCode = new TimeCode(); + timeUpDownVideoPosition.Enabled = false; + } + + private void ToolStripMenuItemVideoDropDownOpening(object sender, EventArgs e) + { + if (_isVideoControlsUndocked) + { + redockVideoControlsToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainVideoToggleVideoControls); + undockVideoControlsToolStripMenuItem.ShortcutKeys = Keys.None; + } + else + { + undockVideoControlsToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainVideoToggleVideoControls); + redockVideoControlsToolStripMenuItem.ShortcutKeys = Keys.None; + } + + closeVideoToolStripMenuItem.Visible = !string.IsNullOrEmpty(VideoFileName); + setVideoOffsetToolStripMenuItem.Visible = !string.IsNullOrEmpty(VideoFileName); + smpteTimeModedropFrameToolStripMenuItem.Visible = !string.IsNullOrEmpty(VideoFileName); + if (!string.IsNullOrEmpty(VideoFileName)) + { + if (Configuration.Settings.General.CurrentVideoOffsetInMs != 0) + { + setVideoOffsetToolStripMenuItem.Text = string.Format("{0} [{1}]", _language.Menu.Video.SetVideoOffset, new TimeCode(Configuration.Settings.General.CurrentVideoOffsetInMs).ToShortDisplayString()); + } + else + { + setVideoOffsetToolStripMenuItem.Text = _language.Menu.Video.SetVideoOffset; + } + + smpteTimeModedropFrameToolStripMenuItem.Checked = mediaPlayer.SmpteMode; + } + + toolStripMenuItemOpenVideoFromUrl.Visible = Configuration.Settings.General.VideoPlayer.Trim().Equals("MPV", StringComparison.OrdinalIgnoreCase) && + LibMpvDynamic.IsInstalled && + File.Exists(Path.Combine(Configuration.DataDirectory, "youtube-dl.exe")); + + toolStripMenuItemSetAudioTrack.Visible = false; + openSecondSubtitleToolStripMenuItem.Visible = false; + if (mediaPlayer.VideoPlayer is LibVlcDynamic libVlc) + { + openSecondSubtitleToolStripMenuItem.Visible = true; + var audioTracks = libVlc.GetAudioTracks(); + VideoAudioTrackNumber = libVlc.AudioTrackNumber; + if (audioTracks.Count > 1) + { + toolStripMenuItemSetAudioTrack.DropDownItems.Clear(); + for (int i = 0; i < audioTracks.Count; i++) + { + var at = audioTracks[i]; + toolStripMenuItemSetAudioTrack.DropDownItems.Add(string.IsNullOrWhiteSpace(at.Value) ? at.Key.ToString(CultureInfo.InvariantCulture) : at.Value, null, ChooseAudioTrack); + toolStripMenuItemSetAudioTrack.DropDownItems[toolStripMenuItemSetAudioTrack.DropDownItems.Count - 1].Tag = at.Key.ToString(CultureInfo.InvariantCulture); + if (at.Key == VideoAudioTrackNumber) + { + toolStripMenuItemSetAudioTrack.DropDownItems[toolStripMenuItemSetAudioTrack.DropDownItems.Count - 1].Select(); + } + } + + toolStripMenuItemSetAudioTrack.Visible = true; + } + } + else if (mediaPlayer.VideoPlayer is LibMpvDynamic libMpv) + { + openSecondSubtitleToolStripMenuItem.Visible = true; + var audioTracks = libMpv.AudioTracks; + VideoAudioTrackNumber = libMpv.AudioTrackNumber; + if (audioTracks.Count > 1) + { + toolStripMenuItemSetAudioTrack.DropDownItems.Clear(); + for (int i = 0; i < audioTracks.Count; i++) + { + var at = audioTracks[i]; + var trackText = string.IsNullOrWhiteSpace(at.Value) ? at.Key.ToString(CultureInfo.InvariantCulture) : "Track " + at.Key + " - " + char.ToUpper(at.Value[0]) + at.Value.Substring(1); + toolStripMenuItemSetAudioTrack.DropDownItems.Add(trackText, null, ChooseAudioTrack); + toolStripMenuItemSetAudioTrack.DropDownItems[toolStripMenuItemSetAudioTrack.DropDownItems.Count - 1].Tag = at.Key.ToString(CultureInfo.InvariantCulture); + if (i == VideoAudioTrackNumber) + { + toolStripMenuItemSetAudioTrack.DropDownItems[toolStripMenuItemSetAudioTrack.DropDownItems.Count - 1].Select(); + } + } + + toolStripMenuItemSetAudioTrack.Visible = true; + } + } + + if (mediaPlayer.VideoPlayer != null && audioVisualizer.WavePeaks != null && audioVisualizer.WavePeaks.Peaks.Count > 0) + { + toolStripMenuItemImportSceneChanges.Visible = true; + toolStripMenuItemRemoveSceneChanges.Visible = audioVisualizer.SceneChanges.Count > 0; + } + else + { + toolStripMenuItemImportSceneChanges.Visible = false; + toolStripMenuItemRemoveSceneChanges.Visible = false; + } + + if (mediaPlayer.VideoPlayer != null && VideoFileName.EndsWith(".mkv", StringComparison.OrdinalIgnoreCase)) + { + toolStripMenuItemImportChapters.Visible = true; + } + else + { + toolStripMenuItemImportChapters.Visible = false; + } + + generateTextFromCurrentVideoToolStripMenuItem.Visible = Directory.Exists(Path.Combine(Configuration.DataDirectory, "pocketsphinx")); + } + + private void ChooseAudioTrack(object sender, EventArgs e) + { + if (mediaPlayer.VideoPlayer is LibVlcDynamic libVlc) + { + var item = sender as ToolStripItem; + int number = int.Parse(item.Tag.ToString()); + libVlc.AudioTrackNumber = number; + VideoAudioTrackNumber = number; + } + else if (mediaPlayer.VideoPlayer is LibMpvDynamic libMpv) + { + var item = sender as ToolStripItem; + int number = int.Parse(item.Tag.ToString()); + number--; + libMpv.AudioTrackNumber = number; + VideoAudioTrackNumber = number; + } + } + + private void textBoxListViewTextAlternate_TextChanged(object sender, EventArgs e) + { + if (_subtitleAlternate == null || _subtitleAlternate.Paragraphs.Count < 1) + { + return; + } + + if (_subtitleListViewIndex >= 0) + { + var original = Utilities.GetOriginalParagraph(_subtitleListViewIndex, _subtitle.Paragraphs[_subtitleListViewIndex], _subtitleAlternate.Paragraphs); + if (original != null) + { + string text = textBoxListViewTextAlternate.Text.TrimEnd(); + + // update _subtitle + listview + original.Text = text; + UpdateListViewTextInfo(labelTextAlternateLineLengths, labelAlternateSingleLine, labelAlternateSingleLinePixels, labelTextAlternateLineTotal, labelAlternateCharactersPerSecond, original, textBoxListViewTextAlternate); + SubtitleListview1.SetAlternateText(_subtitleListViewIndex, text); + FixVerticalScrollBars(textBoxListViewTextAlternate, ref _lastNumberOfNewLinesAlternate); + } + } + } + + private void TextBoxListViewTextAlternateKeyDown(object sender, KeyEventArgs e) + { + _listViewAlternateTextTicks = DateTime.UtcNow.Ticks; + if (_subtitleAlternate == null || _subtitleAlternate.Paragraphs.Count < 1) + { + return; + } + + if (e.Modifiers == Keys.Shift && e.KeyCode == Keys.ShiftKey) + { + return; + } + + if (e.Modifiers == Keys.Control && e.KeyCode == (Keys.LButton | Keys.ShiftKey)) + { // surround ctrl+v action with history (for undo) + _listViewAlternateTextTicks = 0; + TimerAlternateTextUndoTick(sender, e); + Application.DoEvents(); + System.Threading.Thread.Sleep(50); + Application.DoEvents(); + _listViewAlternateTextTicks = 0; + TimerAlternateTextUndoTick(sender, e); + return; + } + + int numberOfLines = Utilities.GetNumberOfLines(textBoxListViewTextAlternate.Text); + + if (e.Modifiers == Keys.None && e.KeyCode == Keys.Enter && numberOfLines > Configuration.Settings.General.MaxNumberOfLines) + { + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainTextBoxAutoBreak) + { + BreakUnbreakTextBox(false, textBoxListViewTextAlternate); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainTextBoxUnbreak) + { + BreakUnbreakTextBox(true, textBoxListViewTextAlternate); + e.SuppressKeyPress = true; + } + else if (e.KeyData == _shortcuts.MainTextBoxBreakAtCursorPosition) + { + textBoxListViewTextAlternate.Text = Utilities.ReSplit(textBoxListViewTextAlternate.Text, textBoxListViewTextAlternate.SelectionStart); + var lines = textBoxListViewTextAlternate.Text.SplitToLines(); + if (lines.Count > 0) + { + textBoxListViewTextAlternate.SelectionStart = lines[0].Length; + } + + e.SuppressKeyPress = true; + } + + else if (e.KeyData == _shortcuts.MainTextBoxBreakAtCursorPosition) + { + textBoxListViewText.Text = Utilities.ReSplit(textBoxListViewText.Text, textBoxListViewText.SelectionStart); + ButtonNextClick(null, null); + e.SuppressKeyPress = true; + } + else if (e.Modifiers == Keys.Alt && e.KeyCode == Keys.I) + { + if (textBoxListViewTextAlternate.SelectionLength == 0) + { + if (textBoxListViewTextAlternate.Text.Contains("")) + { + textBoxListViewTextAlternate.Text = HtmlUtil.RemoveOpenCloseTags(textBoxListViewTextAlternate.Text, HtmlUtil.TagItalic); + } + else + { + textBoxListViewTextAlternate.Text = string.Format("{0}", textBoxListViewTextAlternate.Text); + } + } + else + { + TextBoxListViewToggleTag(HtmlUtil.TagItalic); + e.SuppressKeyPress = true; + } + } + + if (e.Modifiers == Keys.Control && e.KeyCode == Keys.D) + { + textBoxListViewTextAlternate.SelectionLength = 0; + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainTextBoxSelectionToLower == e.KeyData) // selection to lowercase + { + if (textBoxListViewTextAlternate.SelectionLength > 0) + { + int start = textBoxListViewTextAlternate.SelectionStart; + int length = textBoxListViewTextAlternate.SelectionLength; + textBoxListViewTextAlternate.SelectedText = textBoxListViewTextAlternate.SelectedText.ToLowerInvariant(); + textBoxListViewTextAlternate.SelectionStart = start; + textBoxListViewTextAlternate.SelectionLength = length; + e.SuppressKeyPress = true; + } + } + else if (_shortcuts.MainTextBoxSelectionToUpper == e.KeyData) // selection to uppercase + { + if (textBoxListViewTextAlternate.SelectionLength > 0) + { + int start = textBoxListViewTextAlternate.SelectionStart; + int length = textBoxListViewTextAlternate.SelectionLength; + textBoxListViewTextAlternate.SelectedText = textBoxListViewTextAlternate.SelectedText.ToUpperInvariant(); + textBoxListViewTextAlternate.SelectionStart = start; + textBoxListViewTextAlternate.SelectionLength = length; + e.SuppressKeyPress = true; + } + } + else if (_shortcuts.MainTextBoxSelectionToggleCasing == e.KeyData && textBoxListViewTextAlternate.SelectionLength > 0) // selection to uppercase + { + int start = textBoxListViewTextAlternate.SelectionStart; + int length = textBoxListViewTextAlternate.SelectionLength; + var text = ToggleCasing(textBoxListViewTextAlternate.SelectedText); + textBoxListViewTextAlternate.SelectedText = text; + textBoxListViewTextAlternate.SelectionStart = start; + textBoxListViewTextAlternate.SelectionLength = length; + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainTextBoxSplitAtCursor == e.KeyData && Configuration.Settings.General.AllowEditOfOriginalSubtitle) + { + ToolStripMenuItemSplitTextAtCursorClick(null, null); + e.SuppressKeyPress = true; + } + else if (_shortcuts.MainTextBoxSplitAtCursorAndVideoPos == e.KeyData && Configuration.Settings.General.AllowEditOfOriginalSubtitle) + { + toolStripMenuItemSplitViaWaveform_Click(null, null); + e.SuppressKeyPress = true; + } + + // last key down in text + _lastTextKeyDownTicks = DateTime.UtcNow.Ticks; + + UpdatePositionAndTotalLength(labelTextAlternateLineTotal, textBoxListViewTextAlternate); + } + + private void OpenOriginalToolStripMenuItemClick(object sender, EventArgs e) + { + OpenAlternateSubtitle(); + } + + private void SaveOriginalAstoolStripMenuItemClick(object sender, EventArgs e) + { + if (_subtitleAlternate == null || _subtitleAlternate.Paragraphs.Count == 0) + { + return; + } + + SubtitleFormat currentFormat = GetCurrentSubtitleFormat(); + if (currentFormat == null) + { + currentFormat = new SubRip(); + } + + UiUtil.SetSaveDialogFilter(saveFileDialog1, currentFormat); + + saveFileDialog1.Title = _language.SaveOriginalSubtitleAs; + saveFileDialog1.DefaultExt = "*" + currentFormat.Extension; + saveFileDialog1.AddExtension = true; + + if (!string.IsNullOrEmpty(VideoFileName)) + { + saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(VideoFileName); + } + else if (!string.IsNullOrEmpty(_subtitleAlternateFileName)) + { + saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(_subtitleAlternateFileName); + } + else + { + saveFileDialog1.FileName = string.Empty; + } + + if (!string.IsNullOrEmpty(openFileDialog1.InitialDirectory)) + { + saveFileDialog1.InitialDirectory = openFileDialog1.InitialDirectory; + } + + DialogResult result = saveFileDialog1.ShowDialog(this); + if (result == DialogResult.OK) + { + _subtitleAlternateFileName = saveFileDialog1.FileName; + SaveOriginalSubtitle(currentFormat); + SetTitle(); + if (_fileName != null) + { + Configuration.Settings.RecentFiles.Add(_fileName, FirstVisibleIndex, FirstSelectedIndex, VideoFileName, _subtitleAlternateFileName, Configuration.Settings.General.CurrentVideoOffsetInMs); + } + } + } + + private void SaveOriginalToolStripMenuItemClick(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(_subtitleAlternateFileName)) + { + SaveOriginalAstoolStripMenuItemClick(null, null); + return; + } + + try + { + SaveOriginalSubtitle(GetCurrentSubtitleFormat()); + } + catch + { + MessageBox.Show(string.Format(_language.UnableToSaveSubtitleX, _subtitleAlternateFileName)); + } + } + + private void RemoveOriginalToolStripMenuItemClick(object sender, EventArgs e) + { + if (ContinueNewOrExitAlternate()) + { + RemoveAlternate(true, true); + } + } + + private void RemoveAlternate(bool removeFromListView, bool updateRecentFiles) + { + if (removeFromListView) + { + SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.TextAlternate); + SubtitleListview1.AutoSizeAllColumns(this); + _subtitleAlternate = new Subtitle(); + _subtitleAlternateFileName = null; + + if (_fileName != null && updateRecentFiles) + { + Configuration.Settings.RecentFiles.Add(_fileName, FirstVisibleIndex, FirstSelectedIndex, VideoFileName, _subtitleAlternateFileName, Configuration.Settings.General.CurrentVideoOffsetInMs); + Configuration.Settings.Save(); + UpdateRecentFilesUI(); + } + } + + buttonUnBreak.Visible = true; + buttonAutoBreak.Visible = true; + textBoxListViewTextAlternate.Visible = false; + labelAlternateText.Visible = false; + labelAlternateCharactersPerSecond.Visible = false; + labelTextAlternateLineLengths.Visible = false; + labelAlternateSingleLine.Visible = false; + labelAlternateSingleLinePixels.Visible = false; + labelTextAlternateLineTotal.Visible = false; + textBoxListViewText.Width = (groupBoxEdit.Width - (textBoxListViewText.Left + 8 + buttonUnBreak.Width)); + textBoxListViewText.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom; + labelTextLineTotal.Left = 236; + labelTextAlternateLineTotal.Left = 236; + + MainResize(); + SetTitle(); + SubtitleListview1.SelectIndexAndEnsureVisible(_subtitleListViewIndex, true); + } + + private void ToolStripMenuItemSpellCheckMainDropDownOpening(object sender, EventArgs e) + { + addWordToNameListToolStripMenuItem.Visible = true; + } + + private void SplitContainer1SplitterMoved(object sender, SplitterEventArgs e) + { + Main_Resize(null, null); + } + + private void ButtonSplitLineClick(object sender, EventArgs e) + { + SplitSelectedParagraph(null, null); + } + + private void ToolStripMenuItemCopySourceTextClick(object sender, EventArgs e) + { + var selectedLines = new Subtitle(_subtitle); + selectedLines.Paragraphs.Clear(); + foreach (int index in SubtitleListview1.SelectedIndices) + { + selectedLines.Paragraphs.Add(new Paragraph(_subtitle.Paragraphs[index])); + } + + if (Configuration.Settings.General.CurrentVideoOffsetInMs != 0) + { + selectedLines.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(Configuration.Settings.General.CurrentVideoOffsetInMs)); + } + + Clipboard.SetText(selectedLines.ToText(GetCurrentSubtitleFormat()).TrimEnd()); + } + + public void PlayPause() + { + mediaPlayer.TogglePlayPause(); + } + + public void SetCurrentViaEndPositionAndGotoNext(int index, bool goToNext) + { + var p = _subtitle.GetParagraphOrDefault(index); + if (p == null) + { + return; + } + + if (mediaPlayer.VideoPlayer == null || string.IsNullOrEmpty(VideoFileName)) + { + MessageBox.Show(_languageGeneral.NoVideoLoaded); + return; + } + + var oldParagraph = new Paragraph(p, false); + + //if (autoDuration) + //{ + // // TODO: auto duration + // // TODO: Search for start via wave file (must only be minor adjustment) + //} + + // current movie Position + double durationTotalMilliseconds = p.Duration.TotalMilliseconds; + double totalMillisecondsEnd = mediaPlayer.CurrentPosition * TimeCode.BaseUnit; + + var tc = new TimeCode(totalMillisecondsEnd - durationTotalMilliseconds); + MakeHistoryForUndo(_language.BeforeSetEndAndVideoPosition + " " + tc); + _makeHistoryPaused = true; + + if (p.StartTime.IsMaxTime) + { + p.EndTime.TotalSeconds = mediaPlayer.CurrentPosition; + p.StartTime.TotalMilliseconds = p.EndTime.TotalMilliseconds - Utilities.GetOptimalDisplayMilliseconds(p.Text); + } + else + { + p.StartTime.TotalMilliseconds = totalMillisecondsEnd - durationTotalMilliseconds; + p.EndTime.TotalMilliseconds = totalMillisecondsEnd; + } + + timeUpDownStartTime.TimeCode = p.StartTime; + var durationInSeconds = (decimal)(p.Duration.TotalSeconds); + if (durationInSeconds >= numericUpDownDuration.Minimum && durationInSeconds <= numericUpDownDuration.Maximum) + { + SetDurationInSeconds((double)durationInSeconds); + } + + UpdateOriginalTimeCodes(oldParagraph); + RestartHistory(); + + if (goToNext) + { + SubtitleListview1.SelectIndexAndEnsureVisible(index + 1, true); + } + + ShowStatus(string.Format(_language.VideoControls.AdjustedViaEndTime, p.StartTime.ToShortString())); + audioVisualizer.Invalidate(); + } + + public void SetCurrentStartAutoDurationAndGotoNext(int index) + { + var prev = _subtitle.GetParagraphOrDefault(index - 1); + var p = _subtitle.GetParagraphOrDefault(index); + if (p == null) + { + return; + } + + double videoPosition = mediaPlayer.CurrentPosition; + if (prev != null && Math.Abs(prev.StartTime.TotalSeconds - videoPosition) < 0.3) + { + ShowStatus("Subtitle already here"); + return; + } + + ShowNextSubtitleLabel(); + + if (mediaPlayer.VideoPlayer == null || string.IsNullOrEmpty(VideoFileName)) + { + MessageBox.Show(_languageGeneral.NoVideoLoaded); + return; + } + + MakeHistoryForUndoOnlyIfNotResent(string.Format(_language.VideoControls.BeforeChangingTimeInWaveformX, "#" + p.Number + " " + p.Text)); + + timeUpDownStartTime.MaskedTextBox.TextChanged -= MaskedTextBoxTextChanged; + var oldParagraph = new Paragraph(_subtitle.Paragraphs[index], false); + if (!mediaPlayer.IsPaused) + { + videoPosition -= Configuration.Settings.General.SetStartEndHumanDelay / TimeCode.BaseUnit; + } + + timeUpDownStartTime.TimeCode = TimeCode.FromSeconds(videoPosition); + + double duration = Utilities.GetOptimalDisplayMilliseconds(textBoxListViewText.Text); + + _subtitle.Paragraphs[index].StartTime.TotalMilliseconds = TimeSpan.FromSeconds(videoPosition).TotalMilliseconds; + if (prev != null && prev.EndTime.TotalMilliseconds > _subtitle.Paragraphs[index].StartTime.TotalMilliseconds) + { + int minDiff = Configuration.Settings.General.MinimumMillisecondsBetweenLines + 1; + if (minDiff < 1) + { + minDiff = 1; + } + + prev.EndTime.TotalMilliseconds = _subtitle.Paragraphs[index].StartTime.TotalMilliseconds - minDiff; + } + + _subtitle.Paragraphs[index].EndTime.TotalMilliseconds = _subtitle.Paragraphs[index].StartTime.TotalMilliseconds + duration; + SubtitleListview1.SetStartTimeAndDuration(index, _subtitle.Paragraphs[index], _subtitle.GetParagraphOrDefault(index + 1), _subtitle.GetParagraphOrDefault(index - 1)); + timeUpDownStartTime.TimeCode = _subtitle.Paragraphs[index].StartTime; + timeUpDownStartTime.MaskedTextBox.TextChanged += MaskedTextBoxTextChanged; + UpdateOriginalTimeCodes(oldParagraph); + _subtitleListViewIndex = -1; + SubtitleListview1.SelectIndexAndEnsureVisible(index + 1, true); + audioVisualizer.Invalidate(); + } + + public void SetCurrentEndNextStartAndGoToNext(int index) + { + var p = _subtitle.GetParagraphOrDefault(index); + var next = _subtitle.GetParagraphOrDefault(index + 1); + if (p == null) + { + return; + } + + if (mediaPlayer.VideoPlayer == null || string.IsNullOrEmpty(VideoFileName)) + { + MessageBox.Show(_languageGeneral.NoVideoLoaded); + return; + } + + MakeHistoryForUndoOnlyIfNotResent(string.Format(_language.VideoControls.BeforeChangingTimeInWaveformX, "#" + p.Number + " " + p.Text)); + var p1 = new Paragraph(p, false); + Paragraph p2 = null; + if (next != null) + { + p2 = new Paragraph(next, false); + } + + double videoPosition = mediaPlayer.CurrentPosition; + if (!mediaPlayer.IsPaused) + { + videoPosition -= Configuration.Settings.General.SetStartEndHumanDelay / TimeCode.BaseUnit; + } + + p.EndTime = TimeCode.FromSeconds(videoPosition); + if (p.StartTime.IsMaxTime) + { + timeUpDownStartTime.MaskedTextBox.TextChanged -= MaskedTextBoxTextChanged; + p.StartTime.TotalMilliseconds = p.EndTime.TotalMilliseconds - Utilities.GetOptimalDisplayMilliseconds(p.Text); + if (p.StartTime.TotalMilliseconds < 0) + { + p.StartTime.TotalMilliseconds = 0; + } + + timeUpDownStartTime.TimeCode = p.StartTime; + SubtitleListview1.SetStartTimeAndDuration(index, p, _subtitle.GetParagraphOrDefault(index + 1), _subtitle.GetParagraphOrDefault(index - 1)); + timeUpDownStartTime.MaskedTextBox.TextChanged += MaskedTextBoxTextChanged; + } + + if (p.Duration.TotalSeconds < 0 || p.Duration.TotalSeconds > 10) + { + p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(p.Text); + } + + SubtitleListview1.SetStartTimeAndDuration(index, p, _subtitle.GetParagraphOrDefault(index + 1), _subtitle.GetParagraphOrDefault(index - 1)); + + SetDurationInSeconds(_subtitle.Paragraphs[index].Duration.TotalSeconds + 0.001); + if (next != null) + { + int addMilliseconds = Configuration.Settings.General.MinimumMillisecondsBetweenLines; + if (addMilliseconds < 1 || addMilliseconds > 500) + { + addMilliseconds = 1; + } + + var oldDuration = next.Duration.TotalMilliseconds; + if (next.StartTime.IsMaxTime || next.EndTime.IsMaxTime) + { + oldDuration = Utilities.GetOptimalDisplayMilliseconds(p.Text); + } + + next.StartTime.TotalMilliseconds = p.EndTime.TotalMilliseconds + addMilliseconds; + next.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds + oldDuration; + SubtitleListview1.SetStartTimeAndDuration(index + 1, next, _subtitle.GetParagraphOrDefault(index + 2), _subtitle.GetParagraphOrDefault(index)); + SubtitleListview1.SelectIndexAndEnsureVisible(index + 1, true); + } + + UpdateOriginalTimeCodes(p1, p2); + audioVisualizer.Invalidate(); + } + + private void EditSelectAllToolStripMenuItemClick(object sender, EventArgs e) + { + for (int i = 0; i < SubtitleListview1.Items.Count; i++) + { + SubtitleListview1.Items[i].Selected = true; + } + } + + private void ToolStripMenuItemSplitTextAtCursorClick(object sender, EventArgs e) + { + var tb = GetFocusedTextBox(); + + int? pos = null; + if (tb.SelectionStart > 1 && tb.SelectionStart < tb.Text.Length - 1) + { + pos = tb.SelectionStart; + } + + SplitSelectedParagraph(null, pos); + tb.Focus(); + tb.SelectionStart = tb.Text.Length; + } + + private void toolStripMenuItemSplitViaWaveform_Click(object sender, EventArgs e) + { + var tb = GetFocusedTextBox(); + if (tb.SelectionStart > 1 && tb.SelectionStart < tb.Text.Length - 1) + { + int? pos = tb.SelectionStart; + SplitSelectedParagraph(mediaPlayer.CurrentPosition, pos); + tb.Focus(); + tb.SelectionStart = tb.Text.Length; + } + } + + private void ContextMenuStripTextBoxListViewOpening(object sender, System.ComponentModel.CancelEventArgs e) + { + var tb = GetFocusedTextBox(); + toolStripMenuItemSplitTextAtCursor.Visible = tb.Text.Length > 1; + + if (IsUnicode) + { + if (toolStripMenuItemInsertUnicodeSymbol.DropDownItems.Count == 0) + { + foreach (var s in Configuration.Settings.Tools.UnicodeSymbolsToInsert.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries)) + { + toolStripMenuItemInsertUnicodeSymbol.DropDownItems.Add(s, null, InsertUnicodeGlyph); + if (Environment.OSVersion.Version.Major < 6 && Configuration.Settings.General.SubtitleFontName == Utilities.WinXP2KUnicodeFontName) // 6 == Vista/Win2008Server/Win7 + { + toolStripMenuItemInsertUnicodeSymbol.DropDownItems[toolStripMenuItemInsertUnicodeSymbol.DropDownItems.Count - 1].Font = new Font(Utilities.WinXP2KUnicodeFontName, toolStripMenuItemInsertUnicodeSymbol.Font.Size); + } + } + } + + toolStripMenuItemInsertUnicodeSymbol.Visible = toolStripMenuItemInsertUnicodeSymbol.DropDownItems.Count > 0; + toolStripSeparator26.Visible = toolStripMenuItemInsertUnicodeSymbol.DropDownItems.Count > 0; + + superscriptToolStripMenuItem.Visible = tb.SelectionLength > 0; + subscriptToolStripMenuItem.Visible = tb.SelectionLength > 0; + toolStripMenuItemInsertUnicodeControlCharacters.Visible = true; + } + else + { + toolStripMenuItemInsertUnicodeSymbol.Visible = false; + toolStripSeparator26.Visible = false; + superscriptToolStripMenuItem.Visible = false; + subscriptToolStripMenuItem.Visible = false; + toolStripMenuItemInsertUnicodeControlCharacters.Visible = false; + } + + var formatType = GetCurrentSubtitleFormat().GetType(); + if (formatType == typeof(WebVTT) && tb.SelectionLength > 0) + { + toolStripSeparatorWebVTT.Visible = true; + toolStripMenuItemWebVttVoice.Visible = true; + var voices = WebVTT.GetVoices(_subtitle); + toolStripMenuItemWebVttVoice.DropDownItems.Clear(); + foreach (var style in voices) + { + toolStripMenuItemWebVttVoice.DropDownItems.Add(style, null, WebVTTSetVoiceTextBox); + } + + toolStripMenuItemWebVttVoice.DropDownItems.Add(_language.Menu.ContextMenu.WebVTTSetNewVoice, null, WebVTTSetNewVoiceTextBox); + } + else + { + toolStripSeparatorWebVTT.Visible = false; + toolStripMenuItemWebVttVoice.Visible = false; + toolStripMenuItemWebVttVoice.Visible = false; + } + + if (formatType == typeof(NetflixImsc11Japanese)) + { + boldToolStripMenuItem1.Visible = false; + underlineToolStripMenuItem1.Visible = false; + colorToolStripMenuItem1.Visible = false; + fontNameToolStripMenuItem.Visible = false; + toolStripMenuItemHorizontalDigits.Visible = true; + if (tb.SelectionLength > 0) + { + toolStripMenuItemBouten.Visible = true; + toolStripMenuItemRuby.Visible = true; + } + else + { + toolStripMenuItemBouten.Visible = false; + toolStripMenuItemRuby.Visible = true; + } + + if (tb.SelectionLength > 1 && tb.SelectionLength < 8) + { + toolStripMenuItemHorizontalDigits.Visible = true; + } + else + { + toolStripMenuItemHorizontalDigits.Visible = false; + } + } + else if (formatType == typeof(Sami) || formatType == typeof(SamiModern)) + { + boldToolStripMenuItem1.Visible = true; + underlineToolStripMenuItem1.Visible = true; + colorToolStripMenuItem1.Visible = true; + fontNameToolStripMenuItem.Visible = true; + toolStripMenuItemHorizontalDigits.Visible = false; + toolStripMenuItemBouten.Visible = false; + if (tb.SelectionLength > 0) + { + toolStripMenuItemRuby.Visible = true; + } + else + { + toolStripMenuItemRuby.Visible = true; + } + } + else if (formatType == typeof(Ebu)) + { + Ebu.EbuGeneralSubtitleInformation header; + if (_subtitle != null && _subtitle.Header != null && (_subtitle.Header.Contains("STL2") || _subtitle.Header.Contains("STL3"))) + { + header = Ebu.ReadHeader(Encoding.UTF8.GetBytes(_subtitle.Header)); + } + else + { + header = new Ebu.EbuGeneralSubtitleInformation(); + } + + var open = header.DisplayStandardCode != "1" && header.DisplayStandardCode != "2"; + boxToolStripMenuItem.Visible = open; + } + else + { + boxToolStripMenuItem1.Visible = false; + boldToolStripMenuItem1.Visible = true; + underlineToolStripMenuItem1.Visible = true; + colorToolStripMenuItem1.Visible = true; + fontNameToolStripMenuItem.Visible = true; + toolStripMenuItemBouten.Visible = false; + toolStripMenuItemRuby.Visible = false; + toolStripMenuItemHorizontalDigits.Visible = false; + } + + if (tb.SelectionStart > 1 && tb.SelectionStart < tb.Text.Length - 1 && !string.IsNullOrEmpty(VideoFileName) && mediaPlayer != null && + _subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 0) + { + int firstSelectedIndex = SubtitleListview1.SelectedItems[0].Index; + var currentParagraph = _subtitle.GetParagraphOrDefault(firstSelectedIndex); + var splitSeconds = mediaPlayer.CurrentPosition; + if (splitSeconds > (currentParagraph.StartTime.TotalSeconds + 0.2) && splitSeconds < (currentParagraph.EndTime.TotalSeconds - 0.2)) + { + toolStripMenuItemSplitViaWaveform.Visible = true; + } + else + { + toolStripMenuItemSplitViaWaveform.Visible = false; + } + } + else + { + toolStripMenuItemSplitViaWaveform.Visible = false; + } + } + + private void ToolStripMenuItemExportPngXmlClick(object sender, EventArgs e) + { + using (var exportBdnXmlPng = new ExportPngXml()) + { + exportBdnXmlPng.Initialize(_subtitle, GetCurrentSubtitleFormat(), "BDNXML", _fileName, _videoInfo, VideoFileName); + exportBdnXmlPng.ShowDialog(this); + } + } + + private void TabControlSubtitleSelecting(object sender, TabControlCancelEventArgs e) + { + if (tabControlSubtitle.SelectedIndex != TabControlSourceView && textBoxSource.Text.Trim().Length > 1) + { + var currentFormat = GetCurrentSubtitleFormat(); + if (currentFormat != null && !currentFormat.IsTextBased) + { + return; + } + + var format = new Subtitle().ReloadLoadSubtitle(textBoxSource.Lines.ToList(), null, currentFormat); + if (format == null) + { + e.Cancel = true; + } + } + } + + private void ToolStripComboBoxFrameRateTextChanged(object sender, EventArgs e) + { + Configuration.Settings.General.CurrentFrameRate = CurrentFrameRate; + if (_loading) + { + return; + } + + SubtitleListview1.UpdateFrames(_subtitle); + if (tabControlSubtitle.SelectedIndex == TabControlSourceView) + { + ShowSource(); + } + } + + private void ToolStripMenuItemGoogleMicrosoftTranslateSelLineClick(object sender, EventArgs e) + { + int firstSelectedIndex = FirstSelectedIndex; + if (firstSelectedIndex >= 0) + { + var p = _subtitle.GetParagraphOrDefault(firstSelectedIndex); + if (p != null) + { + string defaultFromLanguage = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle); + if (_subtitleAlternate != null) + { + var o = Utilities.GetOriginalParagraph(firstSelectedIndex, p, _subtitleAlternate.Paragraphs); + if (o != null) + { + p = o; + defaultFromLanguage = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitleAlternate); + } + } + + Cursor = Cursors.WaitCursor; + if (_googleOrMicrosoftTranslate == null || _googleOrMicrosoftTranslate.IsDisposed) + { + _googleOrMicrosoftTranslate = new GoogleOrMicrosoftTranslate(); + _googleOrMicrosoftTranslate.InitializeFromLanguage(defaultFromLanguage); + } + + _googleOrMicrosoftTranslate.Initialize(p); + Cursor = Cursors.Default; + if (_googleOrMicrosoftTranslate.ShowDialog() == DialogResult.OK) + { + textBoxListViewText.Text = _googleOrMicrosoftTranslate.TranslatedText; + } + } + } + } + + private void NumericUpDownSec1ValueChanged(object sender, EventArgs e) + { + Configuration.Settings.General.SmallDelayMilliseconds = (int)(numericUpDownSec1.Value * 1000); + } + + private void NumericUpDownSec2ValueChanged(object sender, EventArgs e) + { + Configuration.Settings.General.LargeDelayMilliseconds = (int)(numericUpDownSec2.Value * 1000); + } + + private void NumericUpDownSecAdjust1ValueChanged(object sender, EventArgs e) + { + Configuration.Settings.General.SmallDelayMilliseconds = (int)(numericUpDownSecAdjust1.Value * 1000); + } + + private void NumericUpDownSecAdjust2ValueChanged(object sender, EventArgs e) + { + Configuration.Settings.General.LargeDelayMilliseconds = (int)(numericUpDownSecAdjust2.Value * 1000); + } + + private void ToolStripMenuItemMakeEmptyFromCurrentClick(object sender, EventArgs e) + { + if (ContinueNewOrExit()) + { + bool isAlternateVisible = SubtitleListview1.IsAlternateTextColumnVisible; + _subtitleAlternate = new Subtitle(_subtitle); + _subtitleAlternateFileName = null; + int oldIndex = FirstSelectedIndex; + if (oldIndex < 0) + { + oldIndex = 0; + } + + foreach (var p in _subtitle.Paragraphs) + { + if (Configuration.Settings.General.RemoveBlankLinesWhenOpening && string.IsNullOrEmpty(Configuration.Settings.Tools.NewEmptyTranslationText)) + { + p.Text = "-"; + } + else if (Configuration.Settings.Tools.NewEmptyTranslationText != null) + { + p.Text = Configuration.Settings.Tools.NewEmptyTranslationText; + } + else + { + p.Text = string.Empty; + } + } + + SubtitleListview1.ShowAlternateTextColumn(_languageGeneral.OriginalText); + _subtitleListViewIndex = -1; + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + SubtitleListview1.SelectIndexAndEnsureVisible(oldIndex, true); + textBoxListViewText.Focus(); + Configuration.Settings.General.ShowOriginalAsPreviewIfAvailable = true; + + _subtitleAlternateFileName = _fileName; + _fileName = null; + SetupAlternateEdit(); + ResetHistory(); + + if (!isAlternateVisible || toolStripMenuItemShowOriginalInPreview.Checked) + { + toolStripMenuItemShowOriginalInPreview.Checked = false; + Configuration.Settings.General.ShowOriginalAsPreviewIfAvailable = false; + audioVisualizer.Invalidate(); + } + } + } + + private void ToolStripMenuItemShowOriginalInPreviewClick(object sender, EventArgs e) + { + toolStripMenuItemShowOriginalInPreview.Checked = !toolStripMenuItemShowOriginalInPreview.Checked; + Configuration.Settings.General.ShowOriginalAsPreviewIfAvailable = toolStripMenuItemShowOriginalInPreview.Checked; + } + + private void ToolStripMenuItemVideoDropDownClosed(object sender, EventArgs e) + { + redockVideoControlsToolStripMenuItem.ShortcutKeys = Keys.None; + undockVideoControlsToolStripMenuItem.ShortcutKeys = Keys.None; + } + + private void ToolsToolStripMenuItemDropDownOpening(object sender, EventArgs e) + { + if (_subtitle?.Paragraphs.Count > 0 && _networkSession == null) + { + toolStripSeparator23.Visible = true; + toolStripMenuItemMakeEmptyFromCurrent.Visible = !SubtitleListview1.IsAlternateTextColumnVisible; + toolStripMenuItemShowOriginalInPreview.Checked = Configuration.Settings.General.ShowOriginalAsPreviewIfAvailable; + } + else + { + toolStripSeparator23.Visible = false; + toolStripMenuItemMakeEmptyFromCurrent.Visible = false; + toolStripMenuItemShowOriginalInPreview.Checked = false; + } + + var f = GetCurrentSubtitleFormat(); + styleToolStripMenuItem.Visible = f.HasStyleSupport; + var formatType = f.GetType(); + actorToolStripMenuItem.Visible = formatType == typeof(AdvancedSubStationAlpha) || formatType == typeof(SubStationAlpha); + } + + private void ContextMenuStripWaveformOpening(object sender, System.ComponentModel.CancelEventArgs e) + { + if (audioVisualizer.IsSpectrogramAvailable) + { + if (audioVisualizer.ShowSpectrogram && audioVisualizer.ShowWaveform) + { + showWaveformAndSpectrogramToolStripMenuItem.Visible = false; + showOnlyWaveformToolStripMenuItem.Visible = true; + showOnlySpectrogramToolStripMenuItem.Visible = true; + toolStripSeparatorGuessTimeCodes.Visible = true; + } + else if (audioVisualizer.ShowSpectrogram) + { + showWaveformAndSpectrogramToolStripMenuItem.Visible = true; + showOnlyWaveformToolStripMenuItem.Visible = true; + showOnlySpectrogramToolStripMenuItem.Visible = false; + toolStripSeparatorGuessTimeCodes.Visible = true; + } + else + { + showWaveformAndSpectrogramToolStripMenuItem.Visible = true; + showOnlyWaveformToolStripMenuItem.Visible = false; + showOnlySpectrogramToolStripMenuItem.Visible = true; + toolStripSeparatorGuessTimeCodes.Visible = true; + } + } + else + { + toolStripSeparator24.Visible = false; + showWaveformAndSpectrogramToolStripMenuItem.Visible = false; + showOnlyWaveformToolStripMenuItem.Visible = false; + showOnlySpectrogramToolStripMenuItem.Visible = false; + toolStripSeparatorGuessTimeCodes.Visible = false; + } + + insertSubtitleHereToolStripMenuItem.Visible = !_subtitle.Paragraphs.Any(p => p.StartTime.TotalSeconds <= mediaPlayer.CurrentPosition + 1.0 && + p.EndTime.TotalSeconds <= mediaPlayer.CurrentPosition + 1.0 && + p.EndTime.TotalSeconds >= mediaPlayer.CurrentPosition); + } + + private void ShowWaveformAndSpectrogramToolStripMenuItemClick(object sender, EventArgs e) + { + audioVisualizer.ShowSpectrogram = true; + audioVisualizer.ShowWaveform = true; + } + + private void ShowOnlyWaveformToolStripMenuItemClick(object sender, EventArgs e) + { + audioVisualizer.ShowSpectrogram = false; + audioVisualizer.ShowWaveform = true; + } + + private void ShowOnlySpectrogramToolStripMenuItemClick(object sender, EventArgs e) + { + audioVisualizer.ShowSpectrogram = true; + audioVisualizer.ShowWaveform = false; + } + + private void SplitContainerMainSplitterMoved(object sender, SplitterEventArgs e) + { + mediaPlayer.Refresh(); + } + + private void FindDoubleLinesToolStripMenuItemClick(object sender, EventArgs e) + { + if (!IsSubtitleLoaded) + { + DisplaySubtitleNotLoadedMessage(); + return; + } + + for (int i = FirstSelectedIndex + 1; i < _subtitle.Paragraphs.Count; i++) + { + var current = _subtitle.GetParagraphOrDefault(i); + var next = _subtitle.GetParagraphOrDefault(i + 1); + if (current != null && next != null) + { + if (current.Text.Trim().Equals(next.Text.Trim(), StringComparison.OrdinalIgnoreCase)) + { + SubtitleListview1.SelectIndexAndEnsureVisible(i, true); + SubtitleListview1.Items[i + 1].Selected = true; + break; + } + } + } + } + + private void TextBoxListViewTextAlternateMouseMove(object sender, MouseEventArgs e) + { + if (Control.ModifierKeys == Keys.Control && MouseButtons == MouseButtons.Left) + { + if (!string.IsNullOrEmpty(textBoxListViewTextAlternate.SelectedText)) + { + textBoxListViewTextAlternate.DoDragDrop(textBoxListViewTextAlternate.SelectedText, DragDropEffects.Copy); + } + else + { + textBoxListViewTextAlternate.DoDragDrop(textBoxListViewTextAlternate.Text, DragDropEffects.Copy); + } + } + else if ((AutoRepeatContinueOn || AutoRepeatOn) && !textBoxSearchWord.Focused && textBoxListViewTextAlternate.Focused) + { + string selectedText = textBoxListViewTextAlternate.SelectedText; + if (!string.IsNullOrEmpty(selectedText)) + { + selectedText = selectedText.Trim(); + selectedText = selectedText.TrimEnd('.', ',', '!', '?').TrimEnd(); + if (!string.IsNullOrEmpty(selectedText) && selectedText != textBoxSearchWord.Text) + { + textBoxSearchWord.Text = HtmlUtil.RemoveHtmlTags(selectedText); + } + } + } + } + + private void EBustlToolStripMenuItemClick(object sender, EventArgs e) + { + var ebu = new Ebu(); + saveFileDialog1.Filter = ebu.Name + "|*" + ebu.Extension; + saveFileDialog1.Title = _language.SaveSubtitleAs; + saveFileDialog1.DefaultExt = "*" + ebu.Extension; + saveFileDialog1.AddExtension = true; + + if (!string.IsNullOrEmpty(VideoFileName)) + { + saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(VideoFileName); + } + else + { + saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(_fileName); + } + + if (!string.IsNullOrEmpty(openFileDialog1.InitialDirectory)) + { + saveFileDialog1.InitialDirectory = openFileDialog1.InitialDirectory; + } + + DialogResult result = saveFileDialog1.ShowDialog(this); + if (result == DialogResult.OK) + { + openFileDialog1.InitialDirectory = saveFileDialog1.InitialDirectory; + string fileName = saveFileDialog1.FileName; + string ext = Path.GetExtension(fileName); + bool extOk = ext.Equals(ebu.Extension, StringComparison.OrdinalIgnoreCase); + if (!extOk) + { + if (fileName.EndsWith('.')) + { + fileName = fileName.Substring(0, fileName.Length - 1); + } + + fileName += ebu.Extension; + } + + new Ebu().Save(fileName, GetSaveSubtitle(_subtitle)); + } + } + + private void ToolStripMenuItemCavena890Click(object sender, EventArgs e) + { + var cavena890 = new Cavena890(); + saveFileDialog1.Filter = cavena890.Name + "|*" + cavena890.Extension; + saveFileDialog1.Title = _language.SaveSubtitleAs; + saveFileDialog1.DefaultExt = "*" + cavena890.Extension; + saveFileDialog1.AddExtension = true; + + if (!string.IsNullOrEmpty(VideoFileName)) + { + saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(VideoFileName); + } + else + { + saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(_fileName); + } + + if (!string.IsNullOrEmpty(openFileDialog1.InitialDirectory)) + { + saveFileDialog1.InitialDirectory = openFileDialog1.InitialDirectory; + } + + DialogResult result = saveFileDialog1.ShowDialog(this); + if (result == DialogResult.OK) + { + openFileDialog1.InitialDirectory = saveFileDialog1.InitialDirectory; + string fileName = saveFileDialog1.FileName; + string ext = Path.GetExtension(fileName); + bool extOk = ext.Equals(cavena890.Extension, StringComparison.OrdinalIgnoreCase); + if (!extOk) + { + if (fileName.EndsWith('.')) + { + fileName = fileName.Substring(0, fileName.Length - 1); + } + + fileName += cavena890.Extension; + } + + using (var form = new Cavena890SaveOptions(_subtitle, _fileName)) + { + if (form.ShowDialog(this) == DialogResult.OK) + { + cavena890.Save(fileName, GetSaveSubtitle(_subtitle)); + } + } + } + } + + private void PacScreenElectronicsToolStripMenuItemClick(object sender, EventArgs e) + { + var pac = new Pac(); + saveFileDialog1.Filter = pac.Name + "|*" + pac.Extension; + saveFileDialog1.Title = _language.SaveSubtitleAs; + saveFileDialog1.DefaultExt = "*" + pac.Extension; + saveFileDialog1.AddExtension = true; + + if (!string.IsNullOrEmpty(VideoFileName)) + { + saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(VideoFileName); + } + else + { + saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(_fileName); + } + + if (!string.IsNullOrEmpty(openFileDialog1.InitialDirectory)) + { + saveFileDialog1.InitialDirectory = openFileDialog1.InitialDirectory; + } + + DialogResult result = saveFileDialog1.ShowDialog(this); + if (result == DialogResult.OK) + { + openFileDialog1.InitialDirectory = saveFileDialog1.InitialDirectory; + string fileName = saveFileDialog1.FileName; + string ext = Path.GetExtension(fileName); + bool extOk = ext.Equals(pac.Extension, StringComparison.OrdinalIgnoreCase); + if (!extOk) + { + if (fileName.EndsWith('.')) + { + fileName = fileName.Substring(0, fileName.Length - 1); + } + + fileName += pac.Extension; + } + + pac.Save(fileName, GetSaveSubtitle(_subtitle)); + } + } + + private void uniPacExportToolStripMenuItem_Click(object sender, EventArgs e) + { + var uniPac = new PacUnicode(); + saveFileDialog1.Filter = uniPac.Name + "|*" + uniPac.Extension; + saveFileDialog1.Title = _language.SaveSubtitleAs; + saveFileDialog1.DefaultExt = "*" + uniPac.Extension; + saveFileDialog1.AddExtension = true; + + if (!string.IsNullOrEmpty(VideoFileName)) + { + saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(VideoFileName); + } + else + { + saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(_fileName); + } + + if (!string.IsNullOrEmpty(openFileDialog1.InitialDirectory)) + { + saveFileDialog1.InitialDirectory = openFileDialog1.InitialDirectory; + } + + DialogResult result = saveFileDialog1.ShowDialog(this); + if (result == DialogResult.OK) + { + openFileDialog1.InitialDirectory = saveFileDialog1.InitialDirectory; + string fileName = saveFileDialog1.FileName; + string ext = Path.GetExtension(fileName); + bool extOk = ext.Equals(uniPac.Extension, StringComparison.OrdinalIgnoreCase); + if (!extOk) + { + if (fileName.EndsWith('.')) + { + fileName = fileName.Substring(0, fileName.Length - 1); + } + + fileName += uniPac.Extension; + } + + uniPac.Save(fileName, GetSaveSubtitle(_subtitle)); + } + } + + private void toolStripMenuItemExportAyato_Click(object sender, EventArgs e) + { + var ayato = new Ayato(); + saveFileDialog1.Filter = ayato.Name + "|*" + ayato.Extension; + saveFileDialog1.Title = _language.SaveSubtitleAs; + saveFileDialog1.DefaultExt = "*" + ayato.Extension; + saveFileDialog1.AddExtension = true; + + if (!string.IsNullOrEmpty(VideoFileName)) + { + saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(VideoFileName); + } + else + { + saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(_fileName); + } + + if (!string.IsNullOrEmpty(openFileDialog1.InitialDirectory)) + { + saveFileDialog1.InitialDirectory = openFileDialog1.InitialDirectory; + } + + DialogResult result = saveFileDialog1.ShowDialog(this); + if (result == DialogResult.OK) + { + openFileDialog1.InitialDirectory = saveFileDialog1.InitialDirectory; + string fileName = saveFileDialog1.FileName; + string ext = Path.GetExtension(fileName); + bool extOk = ext.Equals(ayato.Extension, StringComparison.OrdinalIgnoreCase); + if (!extOk) + { + if (fileName.EndsWith('.')) + { + fileName = fileName.Substring(0, fileName.Length - 1); + } + + fileName += ayato.Extension; + } + + ayato.Save(fileName, VideoFileName, GetSaveSubtitle(_subtitle)); + } + } + + private void TextBoxListViewTextEnter(object sender, EventArgs e) + { + if (_findHelper != null) + { + _findHelper.MatchInOriginal = false; + } + + if (_measurementConverter != null) + { + _measurementConverter.IsOriginalActive = false; + } + } + + private void TextBoxListViewTextAlternateEnter(object sender, EventArgs e) + { + if (_findHelper != null) + { + _findHelper.MatchInOriginal = true; + } + + if (_measurementConverter != null) + { + _measurementConverter.IsOriginalActive = true; + } + } + + private void PlainTextToolStripMenuItemClick(object sender, EventArgs e) + { + using (var exportText = new ExportText()) + { + exportText.Initialize(GetSaveSubtitle(_subtitle), _fileName); + if (exportText.ShowDialog() == DialogResult.OK) + { + ShowStatus(_language.SubtitleExported); + } + } + } + + private void BluraySupToolStripMenuItemClick(object sender, EventArgs e) + { + using (var exportBdnXmlPng = new ExportPngXml()) + { + exportBdnXmlPng.Initialize(_subtitle, GetCurrentSubtitleFormat(), ExportPngXml.ExportFormats.BluraySup, _fileName, _videoInfo, VideoFileName); + exportBdnXmlPng.ShowDialog(this); + } + } + + private void VobSubsubidxToolStripMenuItemClick(object sender, EventArgs e) + { + using (var exportBdnXmlPng = new ExportPngXml()) + { + exportBdnXmlPng.Initialize(_subtitle, GetCurrentSubtitleFormat(), ExportPngXml.ExportFormats.VobSub, _fileName, _videoInfo, VideoFileName); + exportBdnXmlPng.ShowDialog(this); + } + } + + private void TextBoxListViewTextAlternateKeyUp(object sender, KeyEventArgs e) + { + textBoxListViewTextAlternate.ClearUndo(); + UpdatePositionAndTotalLength(labelTextAlternateLineTotal, textBoxListViewTextAlternate); + } + + private void TimerTextUndoTick(object sender, EventArgs e) + { + if (_subtitle == null || _subtitle.Paragraphs.Count == 0 || _listViewTextTicks == -1 || !CanFocus) + { + return; + } + + // progress check + ShowTranslationProgress(); + + // text undo + int index = _listViewTextUndoIndex; + if (index == -1) + { + index = _subtitleListViewIndex; + } + + if (index < 0 || index >= _subtitle.Paragraphs.Count) + { + return; + } + + if ((DateTime.UtcNow.Ticks - _listViewTextTicks) > 10000 * 700) // only if last typed char was entered > 700 milliseconds + { + if (index < 0 || index >= _subtitle.Paragraphs.Count) + { + return; + } + + string newText = _subtitle.Paragraphs[index].Text.TrimEnd(); + string oldText = _listViewTextUndoLast; + if (oldText == null) + { + return; + } + + if (_listViewTextUndoLast != newText) + { + MakeHistoryForUndo(_languageGeneral.Text + ": " + _listViewTextUndoLast.TrimEnd() + " -> " + newText, false); + int hidx = _subtitle.HistoryItems.Count - 1; + if (hidx >= 0 && hidx < _subtitle.HistoryItems.Count) + { + _subtitle.HistoryItems[hidx].Subtitle.Paragraphs[index].Text = _listViewTextUndoLast; + } + + _listViewTextUndoLast = newText; + _listViewTextUndoIndex = -1; + } + } + } + + private void ShowTranslationProgress() + { + if (Configuration.Settings.General.ShowProgress) + { + if (_subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) + { + int numberOfNonBlankLines = 0; + foreach (var paragraph in _subtitle.Paragraphs) + { + if (!string.IsNullOrWhiteSpace(paragraph.Text)) + { + numberOfNonBlankLines++; + } + } + + int percent = (int)Math.Round(numberOfNonBlankLines * 100.0 / _subtitle.Paragraphs.Count); + toolStripStatusLabelProgress.Text = string.Format("{0}% completed", percent); + if (!toolStripStatusLabelProgress.Visible) + { + toolStripStatusLabelProgress.Visible = true; + } + } + else if (_subtitle.Paragraphs.Count > 0 && !string.IsNullOrWhiteSpace(VideoFileName) && mediaPlayer != null && mediaPlayer.VideoPlayer != null && mediaPlayer.VideoPlayer.Duration > 0) + { + var last = _subtitle.Paragraphs.LastOrDefault(); + if (last != null && !last.StartTime.IsMaxTime) + { + var subtitleEndSeconds = last.EndTime.TotalSeconds; + var videoEndSeconds = mediaPlayer.VideoPlayer.Duration; + int percent = (int)Math.Round(subtitleEndSeconds * 100.0 / videoEndSeconds); + toolStripStatusLabelProgress.Text = string.Format("{0}% completed", percent); + if (!toolStripStatusLabelProgress.Visible) + { + toolStripStatusLabelProgress.Visible = true; + } + } + } + else + { + toolStripStatusLabelProgress.Visible = false; + } + } + } + + private void TimerAlternateTextUndoTick(object sender, EventArgs e) + { + if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) + { + int index = _listViewTextUndoIndex; + if (index == -1) + { + index = _subtitleListViewIndex; + } + + if (_listViewAlternateTextTicks == -1 || !CanFocus || _subtitleAlternate == null || _subtitleAlternate.Paragraphs.Count == 0 || index < 0 || index >= _subtitleAlternate.Paragraphs.Count) + { + return; + } + + if ((DateTime.UtcNow.Ticks - _listViewAlternateTextTicks) > 10000 * 700) // only if last typed char was entered > 700 milliseconds + { + var original = Utilities.GetOriginalParagraph(index, _subtitle.Paragraphs[index], _subtitleAlternate.Paragraphs); + if (original != null) + { + index = _subtitleAlternate.Paragraphs.IndexOf(original); + } + else + { + return; + } + + string newText = _subtitleAlternate.Paragraphs[index].Text.TrimEnd(); + string oldText = _listViewAlternateTextUndoLast; + if (oldText == null || index < 0) + { + return; + } + + if (_listViewAlternateTextUndoLast != newText && _subtitle.HistoryItems.Count > 0 && + index < _subtitle.HistoryItems[_subtitle.HistoryItems.Count - 1].OriginalSubtitle.Paragraphs.Count) + { + MakeHistoryForUndo(_languageGeneral.Text + ": " + _listViewAlternateTextUndoLast.TrimEnd() + " -> " + newText, false); + _subtitle.HistoryItems[_subtitle.HistoryItems.Count - 1].OriginalSubtitle.Paragraphs[index].Text = _listViewAlternateTextUndoLast; + + _listViewAlternateTextUndoLast = newText; + _listViewTextUndoIndex = -1; + } + } + } + } + + private void UpdatePositionAndTotalLength(Label lineTotal, SETextBox textBox) + { + if (string.IsNullOrEmpty(textBox.Text)) + { + lineTotal.Text = string.Empty; + return; + } + + int extraNewLineLength = Environment.NewLine.Length - 1; + int lineBreakPos = textBox.Text.IndexOf(Environment.NewLine, StringComparison.Ordinal); + int pos = textBox.SelectionStart; + var s = HtmlUtil.RemoveHtmlTags(textBox.Text, true).Replace(Environment.NewLine, string.Empty); // we don't count new line in total length... correct? + int totalLength = s.CountCharacters(false, Configuration.Settings.General.IgnoreArabicDiacritics); + string totalL; + + if (Configuration.Settings.Tools.ListViewSyntaxColorWideLines) + { + var totalLengthPixels = TextWidth.CalcPixelWidth(s); + totalL = " " + string.Format(_languageGeneral.TotalLengthX, string.Format("{0} {1}", totalLength, totalLengthPixels)); + } + else + { + totalL = " " + string.Format(_languageGeneral.TotalLengthX, totalLength); + } + + if (lineBreakPos < 0 || pos <= lineBreakPos) + { + lineTotal.Text = "1," + (pos + 1) + totalL; + lineTotal.Left = textBox.Left + (textBox.Width - lineTotal.Width); + return; + } + + int secondLineBreakPos = textBox.Text.IndexOf(Environment.NewLine, lineBreakPos + 1, StringComparison.Ordinal); + if (secondLineBreakPos < 0 || pos <= secondLineBreakPos + extraNewLineLength) + { + lineTotal.Text = "2," + (pos - (lineBreakPos + extraNewLineLength)) + totalL; + lineTotal.Left = textBox.Left + (textBox.Width - lineTotal.Width); + return; + } + + int thirdLineBreakPos = textBox.Text.IndexOf(Environment.NewLine, secondLineBreakPos + 1, StringComparison.Ordinal); + if (thirdLineBreakPos < 0 || pos < thirdLineBreakPos + (extraNewLineLength * 2)) + { + lineTotal.Text = "3," + (pos - (secondLineBreakPos + extraNewLineLength)) + totalL; + lineTotal.Left = textBox.Left + (textBox.Width - lineTotal.Width); + return; + } + + int forthLineBreakPos = textBox.Text.IndexOf(Environment.NewLine, thirdLineBreakPos + 1, StringComparison.Ordinal); + if (forthLineBreakPos < 0 || pos < forthLineBreakPos + (extraNewLineLength * 3)) + { + lineTotal.Text = "4," + (pos - (thirdLineBreakPos + extraNewLineLength)) + totalL; + lineTotal.Left = textBox.Left + (textBox.Width - lineTotal.Width); + return; + } + + lineTotal.Text = string.Empty; + } + + private void TextBoxListViewTextMouseClick(object sender, MouseEventArgs e) + { + UpdatePositionAndTotalLength(labelTextLineTotal, textBoxListViewText); + } + + private void TextBoxListViewTextAlternateMouseClick(object sender, MouseEventArgs e) + { + UpdatePositionAndTotalLength(labelTextAlternateLineTotal, textBoxListViewTextAlternate); + } + + private void TabControlButtonsDrawItem(object sender, DrawItemEventArgs e) + { + var tc = (TabControl)sender; + var textBrush = new SolidBrush(ForeColor); + var tabFont = new Font(tc.Font, FontStyle.Regular); + if (e.State == DrawItemState.Selected) + { + tabFont = new Font(tc.Font, FontStyle.Bold); + e.Graphics.FillRectangle(new SolidBrush(SystemColors.Window), e.Bounds); + } + + Rectangle tabBounds = tc.GetTabRect(e.Index); + var stringFlags = new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center }; + e.Graphics.DrawString(tc.TabPages[e.Index].Text.Trim(), tabFont, textBrush, tabBounds, new StringFormat(stringFlags)); + } + + public void GotoNextSubPosFromVideoPos() + { + if (mediaPlayer.VideoPlayer != null && _subtitle != null) + { + double ms = mediaPlayer.VideoPlayer.CurrentPosition * TimeCode.BaseUnit; + foreach (var p in _subtitle.Paragraphs) + { + if (p.EndTime.TotalMilliseconds > ms && p.StartTime.TotalMilliseconds < ms) + { + // current sub + } + else if (p.Duration.TotalSeconds < 10 && p.StartTime.TotalMilliseconds > ms) + { + mediaPlayer.VideoPlayer.CurrentPosition = p.StartTime.TotalSeconds; + SubtitleListview1.SelectIndexAndEnsureVisible(_subtitle.GetIndex(p), true); + return; + } + } + } + } + + public void GotoPrevSubPosFromvideoPos() + { + if (mediaPlayer.VideoPlayer != null && _subtitle != null) + { + double ms = mediaPlayer.VideoPlayer.CurrentPosition * TimeCode.BaseUnit; + int i = _subtitle.Paragraphs.Count - 1; + while (i >= 0) + { + var p = _subtitle.Paragraphs[i]; + if (p.EndTime.TotalMilliseconds > ms && p.StartTime.TotalMilliseconds < ms) + { + // current sub + } + else if (p.Duration.TotalSeconds < 10 && p.StartTime.TotalMilliseconds < ms) + { + mediaPlayer.VideoPlayer.CurrentPosition = p.StartTime.TotalSeconds; + SubtitleListview1.SelectIndexAndEnsureVisible(_subtitle.GetIndex(p), true); + return; + } + + i--; + } + } + } + + private void AdobeEncoreFabImageScriptToolStripMenuItemClick(object sender, EventArgs e) + { + using (var exportBdnXmlPng = new ExportPngXml()) + { + exportBdnXmlPng.Initialize(_subtitle, GetCurrentSubtitleFormat(), ExportPngXml.ExportFormats.Fab, _fileName, _videoInfo, VideoFileName); + exportBdnXmlPng.ShowDialog(this); + } + } + + private void ToolStripMenuItemMergeDialogClick(object sender, EventArgs e) + { + MergeDialogs(); + } + + private void MainKeyUp(object sender, KeyEventArgs e) + { + if (_mainCreateStartDownEndUpParagraph != null) + { + var p = _subtitle.Paragraphs[_subtitleListViewIndex]; + if (p.ToString() == _mainCreateStartDownEndUpParagraph.ToString()) + { + ButtonSetEndClick(null, null); + } + + _mainCreateStartDownEndUpParagraph = null; + } + else if (_mainAdjustStartDownEndUpAndGoToNextParagraph != null) + { + var p = _subtitle.Paragraphs[_subtitleListViewIndex]; + if (p.ToString() == _mainAdjustStartDownEndUpAndGoToNextParagraph.ToString()) + { + double videoPositionInSeconds = mediaPlayer.CurrentPosition; + if (p.StartTime.TotalSeconds + 0.1 < videoPositionInSeconds) + { + ButtonSetEndClick(null, null); + } + + SubtitleListview1.SelectIndexAndEnsureVisible(_subtitleListViewIndex + 1, true); + } + + _mainAdjustStartDownEndUpAndGoToNextParagraph = null; + } + } + + private void ToolStripMenuItemSurroundWithMusicSymbolsClick(object sender, EventArgs e) + { + string tag = Configuration.Settings.Tools.MusicSymbol; + if (string.IsNullOrWhiteSpace(tag)) + { + return; + } + + if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 0) + { + SubtitleListview1.SelectedIndexChanged -= SubtitleListview1_SelectedIndexChanged; + MakeHistoryForUndo(string.Format(_language.BeforeAddingTagX, tag)); + + var indices = new List(); + foreach (ListViewItem item in SubtitleListview1.SelectedItems) + { + indices.Add(item.Index); + } + + SubtitleListview1.BeginUpdate(); + foreach (int i in indices) + { + if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) + { + var original = Utilities.GetOriginalParagraph(i, _subtitle.Paragraphs[i], _subtitleAlternate.Paragraphs); + if (original != null) + { + original.Text = ToogleMusicSymbols(tag, original.Text); + SubtitleListview1.SetAlternateText(i, original.Text); + } + } + + _subtitle.Paragraphs[i].Text = ToogleMusicSymbols(tag, _subtitle.Paragraphs[i].Text); + SubtitleListview1.SetText(i, _subtitle.Paragraphs[i].Text); + } + + SubtitleListview1.EndUpdate(); + + ShowStatus(string.Format(_language.TagXAdded, tag)); + ShowSource(); + RefreshSelectedParagraph(); + SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; + } + } + + private string ToogleMusicSymbols(string tag, string text) + { + string pre = string.Empty; + string post = string.Empty; + var indexOfEndBracket = text.IndexOf('}'); + if (text.StartsWith("{\\", StringComparison.Ordinal) && indexOfEndBracket > 1) + { + pre = text.Substring(0, indexOfEndBracket + 1); + text = text.Remove(0, indexOfEndBracket + 1); + } + + bool updated = true; + while (updated) + { + updated = false; + if (text.StartsWith(' ')) + { + pre += ' '; + text = text.Remove(0, 1); + updated = true; + } + else if (text.StartsWith("'); + if (endFont > 0) + { + pre += text.Substring(0, endFont + 1); + text = text.Remove(0, endFont + 1); + updated = true; + } + + if (text.EndsWith("
", StringComparison.OrdinalIgnoreCase)) + { + var endTag = "
"; + post += endTag; + text = text.Remove(text.Length - endTag.Length, endTag.Length); + } + } + } + + if (text.Contains(tag)) + { + text = pre + text.Replace(tag, string.Empty).Replace(Environment.NewLine + " ", Environment.NewLine).Replace(" " + Environment.NewLine, Environment.NewLine).Trim() + post; + } + else + { + if (Configuration.Settings.Tools.MusicSymbolStyle.Equals("single", StringComparison.OrdinalIgnoreCase)) + { + text = string.Format("{0}{1} {2}{3}", pre, tag, text.Replace(Environment.NewLine, Environment.NewLine + tag + " "), post); + } + else + { + text = string.Format("{0}{1} {2} {1}{3}", pre, tag, text.Replace(Environment.NewLine, " " + tag + Environment.NewLine + tag + " "), post); + } + } + + return text; + } + + private void SuperscriptToolStripMenuItemClick(object sender, EventArgs e) + { + var tb = GetFocusedTextBox(); + + string text = tb.SelectedText; + int selectionStart = tb.SelectionStart; + text = Utilities.ToSuperscript(text); + tb.SelectedText = text; + tb.SelectionStart = selectionStart; + tb.SelectionLength = text.Length; + } + + private void SubscriptToolStripMenuItemClick(object sender, EventArgs e) + { + var tb = GetFocusedTextBox(); + + string text = tb.SelectedText; + int selectionStart = tb.SelectionStart; + text = Utilities.ToSubscript(text); + tb.SelectedText = text; + tb.SelectionStart = selectionStart; + tb.SelectionLength = text.Length; + } + + private void ToolStripMenuItemImagePerFrameClick(object sender, EventArgs e) + { + using (var exportBdnXmlPng = new ExportPngXml()) + { + exportBdnXmlPng.Initialize(_subtitle, GetCurrentSubtitleFormat(), ExportPngXml.ExportFormats.ImageFrame, _fileName, _videoInfo, VideoFileName); + exportBdnXmlPng.ShowDialog(this); + } + } + + private void toolStripMenuItemApplyDisplayTimeLimits_Click(object sender, EventArgs e) + { + ApplyDisplayTimeLimits(false); + } + + private void ApplyDisplayTimeLimits(bool onlySelectedLines) + { + if (!IsSubtitleLoaded) + { + DisplaySubtitleNotLoadedMessage(); + return; + } + + ReloadFromSourceView(); + using (var applyDurationLimits = new ApplyDurationLimits()) + { + if (onlySelectedLines) + { + var selectedLines = new Subtitle(); + foreach (int index in SubtitleListview1.SelectedIndices) + { + selectedLines.Paragraphs.Add(_subtitle.Paragraphs[index]); + } + + applyDurationLimits.Initialize(selectedLines); + } + else + { + applyDurationLimits.Initialize(_subtitle); + } + + if (applyDurationLimits.ShowDialog(this) == DialogResult.OK) + { + MakeHistoryForUndo(_language.BeforeDisplayTimeAdjustment); + + if (onlySelectedLines) + { // we only update selected lines + int i = 0; + foreach (int index in SubtitleListview1.SelectedIndices) + { + _subtitle.Paragraphs[index] = applyDurationLimits.FixedSubtitle.Paragraphs[i]; + i++; + } + + ShowStatus(_language.VisualSyncPerformedOnSelectedLines); + SubtitleListview1.SyntaxColorAllLines(_subtitle); + } + else + { + SaveSubtitleListviewIndices(); + _subtitle.Paragraphs.Clear(); + foreach (var p in applyDurationLimits.FixedSubtitle.Paragraphs) + { + _subtitle.Paragraphs.Add(new Paragraph(p)); + } + + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + } + ShowSource(); + } + } + } + + private void generateDatetimeInfoFromVideoToolStripMenuItem_Click(object sender, EventArgs e) + { + ReloadFromSourceView(); + using (var extractDateTimeInfo = new ExtractDateTimeInfo()) + { + if (extractDateTimeInfo.ShowDialog(this) == DialogResult.OK) + { + if (ContinueNewOrExit()) + { + MakeHistoryForUndo(_language.BeforeDisplayTimeAdjustment); + + ResetSubtitle(); + _subtitle.Paragraphs.Clear(); + foreach (var p in extractDateTimeInfo.DateTimeSubtitle.Paragraphs) + { + _subtitle.Paragraphs.Add(new Paragraph(p)); + } + + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + ShowSource(); + OpenVideo(extractDateTimeInfo.VideoFileName); + } + } + } + } + + private void ToolStripMenuItemRightToLeftModeClick(object sender, EventArgs e) + { + var focusedItem = SubtitleListview1.FocusedItem; + toolStripMenuItemRightToLeftMode.Checked = !toolStripMenuItemRightToLeftMode.Checked; + if (!toolStripMenuItemRightToLeftMode.Checked) + { + RightToLeft = RightToLeft.No; + textBoxListViewText.RightToLeft = RightToLeft.No; + textBoxListViewTextAlternate.RightToLeft = RightToLeft.No; + SubtitleListview1.RightToLeft = RightToLeft.No; + SubtitleListview1.RightToLeftLayout = false; + textBoxSource.RightToLeft = RightToLeft.No; + mediaPlayer.TextRightToLeft = RightToLeft.No; + textBoxSearchWord.RightToLeft = RightToLeft.No; + Configuration.Settings.General.RightToLeftMode = false; + } + else + { + //RightToLeft = RightToLeft.Yes; - is this better? TimeUpDown custom control needs to support RTL before enabling this + textBoxListViewText.RightToLeft = RightToLeft.Yes; + textBoxListViewTextAlternate.RightToLeft = RightToLeft.Yes; + SubtitleListview1.RightToLeft = RightToLeft.Yes; + SubtitleListview1.RightToLeftLayout = true; + textBoxSource.RightToLeft = RightToLeft.Yes; + mediaPlayer.TextRightToLeft = RightToLeft.Yes; + textBoxSearchWord.RightToLeft = RightToLeft.Yes; + Configuration.Settings.General.RightToLeftMode = true; + } + + MainResize(); + TextBoxListViewTextTextChanged(null, null); + textBoxListViewTextAlternate_TextChanged(null, null); + if (focusedItem != null) + { + SubtitleListview1.SelectIndexAndEnsureVisible(focusedItem.Index, true); + } + } + + private void joinSubtitlesToolStripMenuItem_Click(object sender, EventArgs e) + { + ReloadFromSourceView(); + using (var joinSubtitles = new JoinSubtitles()) + { + if (joinSubtitles.ShowDialog(this) == DialogResult.OK && joinSubtitles.JoinedSubtitle != null && joinSubtitles.JoinedSubtitle.Paragraphs.Count > 0 && ContinueNewOrExit()) + { + MakeHistoryForUndo(_language.BeforeDisplaySubtitleJoin); + + ResetSubtitle(); + _subtitle.Paragraphs.Clear(); + _subtitle.Paragraphs.AddRange(joinSubtitles.JoinedSubtitle.Paragraphs); + SetCurrentFormat(joinSubtitles.JoinedFormat); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + SubtitleListview1.SelectIndexAndEnsureVisible(0, true); + ShowSource(); + ShowStatus(_language.SubtitlesJoined); + } + } + } + + private void toolStripMenuItemReverseRightToLeftStartEnd_Click(object sender, EventArgs e) + { + ReverseStartAndEndingForRtl(); + } + + private void toolStripMenuItemExportCapMakerPlus_Click(object sender, EventArgs e) + { + var capMakerPlus = new CapMakerPlus(); + saveFileDialog1.Filter = capMakerPlus.Name + "|*" + capMakerPlus.Extension; + saveFileDialog1.Title = _language.SaveSubtitleAs; + saveFileDialog1.DefaultExt = "*" + capMakerPlus.Extension; + saveFileDialog1.AddExtension = true; + + if (!string.IsNullOrEmpty(VideoFileName)) + { + saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(VideoFileName); + } + else + { + saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(_fileName); + } + + if (!string.IsNullOrEmpty(openFileDialog1.InitialDirectory)) + { + saveFileDialog1.InitialDirectory = openFileDialog1.InitialDirectory; + } + + DialogResult result = saveFileDialog1.ShowDialog(this); + if (result == DialogResult.OK) + { + openFileDialog1.InitialDirectory = saveFileDialog1.InitialDirectory; + string fileName = saveFileDialog1.FileName; + string ext = Path.GetExtension(fileName); + bool extOk = ext.Equals(capMakerPlus.Extension, StringComparison.OrdinalIgnoreCase); + if (!extOk) + { + if (fileName.EndsWith('.')) + { + fileName = fileName.Substring(0, fileName.Length - 1); + } + + fileName += capMakerPlus.Extension; + } + + CapMakerPlus.Save(fileName, GetSaveSubtitle(_subtitle)); + } + } + + private void toolStripMenuItemExportCheetahCap_Click(object sender, EventArgs e) + { + var cheetahCaption = new CheetahCaption(); + saveFileDialog1.Filter = cheetahCaption.Name + "|*" + cheetahCaption.Extension; + saveFileDialog1.Title = _language.SaveSubtitleAs; + saveFileDialog1.DefaultExt = "*" + cheetahCaption.Extension; + saveFileDialog1.AddExtension = true; + + if (!string.IsNullOrEmpty(VideoFileName)) + { + saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(VideoFileName); + } + else + { + saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(_fileName); + } + + if (!string.IsNullOrEmpty(openFileDialog1.InitialDirectory)) + { + saveFileDialog1.InitialDirectory = openFileDialog1.InitialDirectory; + } + + DialogResult result = saveFileDialog1.ShowDialog(this); + if (result == DialogResult.OK) + { + openFileDialog1.InitialDirectory = saveFileDialog1.InitialDirectory; + string fileName = saveFileDialog1.FileName; + string ext = Path.GetExtension(fileName); + bool extOk = ext.Equals(cheetahCaption.Extension, StringComparison.OrdinalIgnoreCase); + if (!extOk) + { + if (fileName.EndsWith('.')) + { + fileName = fileName.Substring(0, fileName.Length - 1); + } + + fileName += cheetahCaption.Extension; + } + + CheetahCaption.Save(fileName, GetSaveSubtitle(_subtitle)); + } + } + + private void toolStripMenuItemExportCaptionInc_Click(object sender, EventArgs e) + { + var captionInc = new CaptionsInc(); + saveFileDialog1.Filter = captionInc.Name + "|*" + captionInc.Extension; + saveFileDialog1.Title = _language.SaveSubtitleAs; + saveFileDialog1.DefaultExt = "*" + captionInc.Extension; + saveFileDialog1.AddExtension = true; + + if (!string.IsNullOrEmpty(VideoFileName)) + { + saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(VideoFileName); + } + else + { + saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(_fileName); + } + + if (!string.IsNullOrEmpty(openFileDialog1.InitialDirectory)) + { + saveFileDialog1.InitialDirectory = openFileDialog1.InitialDirectory; + } + + DialogResult result = saveFileDialog1.ShowDialog(this); + if (result == DialogResult.OK) + { + openFileDialog1.InitialDirectory = saveFileDialog1.InitialDirectory; + string fileName = saveFileDialog1.FileName; + string ext = Path.GetExtension(fileName); + bool extOk = ext.Equals(captionInc.Extension, StringComparison.OrdinalIgnoreCase); + if (!extOk) + { + if (fileName.EndsWith('.')) + { + fileName = fileName.Substring(0, fileName.Length - 1); + } + + fileName += captionInc.Extension; + } + + CaptionsInc.Save(fileName, GetSaveSubtitle(_subtitle)); + } + } + + private void toolStripMenuItemExportUltech130_Click(object sender, EventArgs e) + { + var ultech130 = new Ultech130(); + saveFileDialog1.Filter = ultech130.Name + "|*" + ultech130.Extension; + saveFileDialog1.Title = _language.SaveSubtitleAs; + saveFileDialog1.DefaultExt = "*" + ultech130.Extension; + saveFileDialog1.AddExtension = true; + + if (!string.IsNullOrEmpty(VideoFileName)) + { + saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(VideoFileName); + } + else + { + saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(_fileName); + } + + if (!string.IsNullOrEmpty(openFileDialog1.InitialDirectory)) + { + saveFileDialog1.InitialDirectory = openFileDialog1.InitialDirectory; + } + + DialogResult result = saveFileDialog1.ShowDialog(this); + if (result == DialogResult.OK) + { + openFileDialog1.InitialDirectory = saveFileDialog1.InitialDirectory; + string fileName = saveFileDialog1.FileName; + string ext = Path.GetExtension(fileName); + bool extOk = ext.Equals(ultech130.Extension, StringComparison.OrdinalIgnoreCase); + if (!extOk) + { + if (fileName.EndsWith('.')) + { + fileName = fileName.Substring(0, fileName.Length - 1); + } + + fileName += ultech130.Extension; + } + + Ultech130.Save(fileName, GetSaveSubtitle(_subtitle)); + } + } + + private void toolStripMenuItemAssStyles_Click(object sender, EventArgs e) + { + StylesForm styles = null; + try + { + var format = GetCurrentSubtitleFormat(); + var formatType = format.GetType(); + if (formatType == typeof(AdvancedSubStationAlpha) || formatType == typeof(SubStationAlpha)) + { + styles = new SubStationAlphaStyles(_subtitle, format); + if (styles.ShowDialog(this) == DialogResult.OK) + { + if (_subtitle.Header != styles.Header) + { + MakeHistoryForUndo(styles.Text); + } + + _subtitle.Header = styles.Header; + var styleList = AdvancedSubStationAlpha.GetStylesFromHeader(_subtitle.Header); + if ((styles as SubStationAlphaStyles).RenameActions.Count > 0) + { + foreach (var renameAction in (styles as SubStationAlphaStyles).RenameActions) + { + for (var i = 0; i < _subtitle.Paragraphs.Count; i++) + { + var p = _subtitle.Paragraphs[i]; + if (p.Extra == renameAction.OldName) + { + p.Extra = renameAction.NewName; + } + } + } + + CleanRemovedStyles(styleList); + SaveSubtitleListviewIndices(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + } + else + { + CleanRemovedStyles(styleList); + } + } + } + else if (formatType == typeof(TimedText10) || formatType == typeof(ItunesTimedText)) + { + styles = new TimedTextStyles(_subtitle); + if (styles.ShowDialog(this) == DialogResult.OK) + { + if (_subtitle.Header != styles.Header) + { + MakeHistoryForUndo(styles.Text); + } + + _subtitle.Header = styles.Header; + } + } + } + finally + { + mediaPlayer.LastParagraph = null; + UiUtil.ShowSubtitle(_subtitle, mediaPlayer); + styles?.Dispose(); + } + } + + private void CleanRemovedStyles(List styleList) + { + for (var i = 0; i < _subtitle.Paragraphs.Count; i++) + { + var p = _subtitle.Paragraphs[i]; + if (p.Extra == null || !styleList.Any(s => s.Equals(p.Extra == "*Default" ? "Default" : p.Extra, StringComparison.OrdinalIgnoreCase))) + { + p.Extra = styleList[0]; + SubtitleListview1.SetExtraText(i, p.Extra, SubtitleListview1.ForeColor); + } + } + } + + private void toolStripMenuItemSubStationAlpha_Click(object sender, EventArgs e) + { + if (tabControlSubtitle.SelectedIndex == TabControlSourceView) + { + ReloadFromSourceView(); + } + + using (var properties = new SubStationAlphaProperties(_subtitle, GetCurrentSubtitleFormat(), VideoFileName, _fileName)) + { + if (properties.ShowDialog(this) == DialogResult.OK && tabControlSubtitle.SelectedIndex == TabControlSourceView) + { + ShowSource(); + } + } + } + + private static string RemoveAssAlignmentTags(string s) + { + return s.Replace("{\\an1}", string.Empty) // ASS tags alone + .Replace("{\\an2}", string.Empty) + .Replace("{\\an3}", string.Empty) + .Replace("{\\an4}", string.Empty) + .Replace("{\\an5}", string.Empty) + .Replace("{\\an6}", string.Empty) + .Replace("{\\an7}", string.Empty) + .Replace("{\\an8}", string.Empty) + .Replace("{\\an9}", string.Empty) + + .Replace("{an1\\", "{") // ASS multi tags (start) + .Replace("{an2\\", "{") + .Replace("{an3\\", "{") + .Replace("{an4\\", "{") + .Replace("{an5\\", "{") + .Replace("{an6\\", "{") + .Replace("{an7\\", "{") + .Replace("{an8\\", "{") + .Replace("{an9\\", "{") + + .Replace("\\an1\\", "\\") // ASS multi tags (middle) + .Replace("\\an2\\", "\\") + .Replace("\\an3\\", "\\") + .Replace("\\an4\\", "\\") + .Replace("\\an5\\", "\\") + .Replace("\\an6\\", "\\") + .Replace("\\an7\\", "\\") + .Replace("\\an8\\", "\\") + .Replace("\\an9\\", "\\") + + .Replace("\\an1}", "}") // ASS multi tags (end) + .Replace("\\an2}", "}") + .Replace("\\an3}", "}") + .Replace("\\an4}", "}") + .Replace("\\an5}", "}") + .Replace("\\an6}", "}") + .Replace("\\an7}", "}") + .Replace("\\an8}", "}") + .Replace("\\an9}", "}") + + .Replace("{\\a1}", string.Empty) // SSA tags + .Replace("{\\a2}", string.Empty) + .Replace("{\\a3}", string.Empty) + .Replace("{\\a4}", string.Empty) + .Replace("{\\a5}", string.Empty) + .Replace("{\\a6}", string.Empty) + .Replace("{\\a7}", string.Empty) + .Replace("{\\a8}", string.Empty) + .Replace("{\\a9}", string.Empty); + } + + private static string SetAlignTag(string s, string tag) + { + var text = RemoveAssAlignmentTags(s); + if (text.StartsWith("{\\", StringComparison.Ordinal) && text.Contains('}')) + { + if (!string.IsNullOrEmpty(tag)) + { + return text.Insert(1, "\\" + tag.TrimStart('{').TrimStart('\\').TrimEnd('}')); + } + + return text; + } + else + { + return string.Format(@"{0}{1}", tag, text); + } + } + + private void toolStripMenuItemAlignment_Click(object sender, EventArgs e) + { + var formatType = GetCurrentSubtitleFormat().GetType(); + + if (formatType == typeof(NetflixImsc11Japanese)) + { + using (var f = new AlignmentPickerJapanese(textBoxListViewText.Text)) + { + if (f.ShowDialog(this) == DialogResult.OK) + { + SetAlignment(f.ContentAlignment, true); + } + } + + return; + } + + using (var f = new AlignmentPicker(textBoxListViewText.Text)) + { + f.TopMost = true; + f.StartPosition = FormStartPosition.Manual; + f.Left = Cursor.Position.X - 150; + f.Top = Cursor.Position.Y - 75; + if (f.ShowDialog(this) == DialogResult.OK) + { + string tag = string.Empty; + if (formatType == typeof(SubStationAlpha)) + { + //1: Bottom left + //2: Bottom center + //3: Bottom right + //9: Middle left + //10: Middle center + //11: Middle right + //5: Top left + //6: Top center + //7: Top right + switch (f.Alignment) + { + case ContentAlignment.BottomLeft: + tag = "{\\a1}"; + break; + case ContentAlignment.BottomCenter: + tag = "{\\a2}"; + break; + case ContentAlignment.BottomRight: + tag = "{\\a3}"; + break; + case ContentAlignment.MiddleLeft: + tag = "{\\a9}"; + break; + case ContentAlignment.MiddleCenter: + tag = "{\\a10}"; + break; + case ContentAlignment.MiddleRight: + tag = "{\\a11}"; + break; + case ContentAlignment.TopLeft: + tag = "{\\a5}"; + break; + case ContentAlignment.TopCenter: + tag = "{\\a6}"; + break; + case ContentAlignment.TopRight: + tag = "{\\a7}"; + break; + } + } + else + { + //1: Bottom left + //2: Bottom center + //3: Bottom right + //4: Middle left + //5: Middle center + //6: Middle right + //7: Top left + //8: Top center + //9: Top right + switch (f.Alignment) + { + case ContentAlignment.BottomLeft: + tag = "{\\an1}"; + break; + case ContentAlignment.BottomCenter: + if (formatType == typeof(SubRip)) + { + tag = string.Empty; + } + else + { + tag = "{\\an2}"; + } + + break; + case ContentAlignment.BottomRight: + tag = "{\\an3}"; + break; + case ContentAlignment.MiddleLeft: + tag = "{\\an4}"; + break; + case ContentAlignment.MiddleCenter: + tag = "{\\an5}"; + break; + case ContentAlignment.MiddleRight: + tag = "{\\an6}"; + break; + case ContentAlignment.TopLeft: + tag = "{\\an7}"; + break; + case ContentAlignment.TopCenter: + tag = "{\\an8}"; + break; + case ContentAlignment.TopRight: + tag = "{\\an9}"; + break; + } + } + + if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 0) + { + SetAlignment(tag, true); + } + } + } + } + + private void toolStripMenuItemRestoreAutoBackup_Click(object sender, EventArgs e) + { + _lastDoNotPrompt = -1; + using (var restoreAutoBackup = new RestoreAutoBackup()) + { + if (restoreAutoBackup.ShowDialog(this) == DialogResult.OK && !string.IsNullOrEmpty(restoreAutoBackup.AutoBackupFileName)) + { + if (ContinueNewOrExit()) + { + OpenSubtitle(restoreAutoBackup.AutoBackupFileName, null); + _fileName = _fileName.Remove(0, Configuration.AutoBackupDirectory.Length).TrimStart(Path.DirectorySeparatorChar); + _converted = true; + SetTitle(); + } + } + } + } + + private void labelStatus_Click(object sender, EventArgs e) + { + if (_statusLog.Count == 0) + { + return; + } + + if (_statusLogForm == null || _statusLogForm.IsDisposed) + { + _statusLogForm = new StatusLog(_statusLog); + _statusLogForm.Show(this); + } + else + { + _statusLogForm.Show(); + } + } + + private void toolStripMenuItemStatistics_Click(object sender, EventArgs e) + { + using (var stats = new Statistics(_subtitle, _fileName, GetCurrentSubtitleFormat())) + { + stats.ShowDialog(this); + } + } + + private void toolStripMenuItemDCinemaProperties_Click(object sender, EventArgs e) + { + PositionAndSizeForm properties = null; + try + { + if (GetCurrentSubtitleFormat().GetType() == typeof(DCinemaInterop)) + { + properties = new DCinema.DCinemaPropertiesInterop(); + } + else + { + properties = new DCinema.DCinemaPropertiesSmpte(); + } + + properties.ShowDialog(this); + } + finally + { + properties?.Dispose(); + } + } + + private void toolStripMenuItemTextTimeCodePair_Click(object sender, EventArgs e) + { + if (saveFileDialog1.ShowDialog(this) == DialogResult.OK) + { + saveFileDialog1.Filter = _language.TextFiles + "|*.txt"; + saveFileDialog1.Title = _language.SaveSubtitleAs; + saveFileDialog1.DefaultExt = "*.txt"; + saveFileDialog1.AddExtension = true; + + string fname = saveFileDialog1.FileName; + if (string.IsNullOrEmpty(fname)) + { + fname = "ATS"; + } + + if (!fname.EndsWith(".txt", StringComparison.Ordinal)) + { + fname += ".txt"; + } + + string fileNameTimeCode = fname.Insert(fname.Length - 4, "_timecode"); + string fileNameText = fname.Insert(fname.Length - 4, "_text"); + + var timeCodeLines = new StringBuilder(); + var textLines = new StringBuilder(); + + const string timeCodeWriteFormat = "{0:00}:{1:00}:{2:00}:{3:00}"; + foreach (var p in GetSaveSubtitle(_subtitle).Paragraphs) + { + timeCodeLines.AppendLine(string.Format(timeCodeWriteFormat, p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, SubtitleFormat.MillisecondsToFramesMaxFrameRate(p.StartTime.Milliseconds))); + timeCodeLines.AppendLine(string.Format(timeCodeWriteFormat, p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, SubtitleFormat.MillisecondsToFramesMaxFrameRate(p.EndTime.Milliseconds))); + + textLines.AppendLine(HtmlUtil.RemoveHtmlTags(p.Text).Replace(Environment.NewLine, "|")); + textLines.AppendLine(); + } + + File.WriteAllText(fileNameTimeCode, timeCodeLines.ToString(), Encoding.UTF8); + File.WriteAllText(fileNameText, textLines.ToString(), Encoding.UTF8); + } + } + + private void textWordsPerMinutewpmToolStripMenuItem_Click(object sender, EventArgs e) + { + SortSubtitle(SubtitleSortCriteria.WordsPerMinute, (sender as ToolStripItem).Text); + } + + private void toolStripMenuItemTTPropertiesClick(object sender, EventArgs e) + { + var subtitleFormatType = GetCurrentSubtitleFormat().GetType(); + if (subtitleFormatType != typeof(TimedText10) && subtitleFormatType != typeof(ItunesTimedText)) + { + return; + } + + using (var properties = new TimedTextProperties(_subtitle)) + { + properties.ShowDialog(this); + } + } + + private void ToolStripMenuItemSaveSelectedLinesClick(object sender, EventArgs e) + { + var newSub = new Subtitle(_subtitle); + newSub.Header = _subtitle.Header; + newSub.Paragraphs.Clear(); + foreach (int index in SubtitleListview1.SelectedIndices) + { + newSub.Paragraphs.Add(_subtitle.Paragraphs[index]); + } + + SubtitleFormat currentFormat = GetCurrentSubtitleFormat(); + UiUtil.SetSaveDialogFilter(saveFileDialog1, currentFormat); + saveFileDialog1.Title = _language.SaveSubtitleAs; + saveFileDialog1.DefaultExt = "*" + currentFormat.Extension; + saveFileDialog1.AddExtension = true; + if (!string.IsNullOrEmpty(_fileName)) + { + saveFileDialog1.InitialDirectory = Path.GetDirectoryName(_fileName); + } + + if (saveFileDialog1.ShowDialog(this) == DialogResult.OK) + { + int index = 0; + foreach (SubtitleFormat format in SubtitleFormat.AllSubtitleFormats) + { + if (saveFileDialog1.FilterIndex == index + 1) + { + // only allow current extension or ".txt" + string fileName = saveFileDialog1.FileName; + string ext = Path.GetExtension(fileName).ToLowerInvariant(); + bool extOk = ext.Equals(format.Extension, StringComparison.OrdinalIgnoreCase) || format.AlternateExtensions.Contains(ext) || ext == ".txt"; + if (!extOk) + { + if (fileName.EndsWith('.')) + { + fileName = fileName.TrimEnd('.'); + } + + fileName += format.Extension; + } + + if (format.IsTextBased) + { + string allText = GetSaveSubtitle(newSub).ToText(format); + File.WriteAllText(fileName, allText, GetCurrentEncoding()); + ShowStatus(string.Format(_language.XLinesSavedAsY, newSub.Paragraphs.Count, fileName)); + return; + } + else if (format.GetType() == typeof(Ebu)) + { + new Ebu().Save(fileName, GetSaveSubtitle(newSub)); + ShowStatus(string.Format(_language.XLinesSavedAsY, newSub.Paragraphs.Count, fileName)); + return; + } + } + + index++; + } + } + } + + private void GuessTimeCodesToolStripMenuItemClick(object sender, EventArgs e) + { + using (var form = new WaveformGenerateTimeCodes()) + { + if (form.ShowDialog(this) == DialogResult.OK) + { + MakeHistoryForUndoOnlyIfNotResent(string.Format(_language.BeforeGuessingTimeCodes)); + + double startFromSeconds = 0; + if (form.StartFromVideoPosition) + { + startFromSeconds = mediaPlayer.CurrentPosition; + } + + if (form.DeleteAll) + { + _subtitle.Paragraphs.Clear(); + } + else if (form.DeleteForward) + { + for (int i = _subtitle.Paragraphs.Count - 1; i > 0; i--) + { + if (_subtitle.Paragraphs[i].EndTime.TotalSeconds + 1 > startFromSeconds) + { + _subtitle.Paragraphs.RemoveAt(i); + } + } + } + + audioVisualizer.GenerateTimeCodes(_subtitle, startFromSeconds, form.BlockSize, form.VolumeMinimum, form.VolumeMaximum, form.DefaultMilliseconds); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RefreshSelectedParagraph(); + } + } + } + + private void DvdStudioProStl_Click(object sender, EventArgs e) + { + using (var exportBdnXmlPng = new ExportPngXml()) + { + exportBdnXmlPng.Initialize(_subtitle, GetCurrentSubtitleFormat(), "STL", _fileName, _videoInfo, VideoFileName); + exportBdnXmlPng.ShowDialog(this); + } + } + + private void toolStripMenuItemPlugins_Click(object sender, EventArgs e) + { + using (var form = new PluginsGet()) + { + form.ShowDialog(this); + LoadPlugins(); + } + } + + private void toolStripMenuItemUndo_Click(object sender, EventArgs e) + { + UndoToIndex(true); + } + + private void toolStripMenuItemRedo_Click(object sender, EventArgs e) + { + UndoToIndex(false); + } + + private void seekSilenceToolStripMenuItem_Click(object sender, EventArgs e) + { + if (audioVisualizer.WavePeaks == null) + { + return; + } + + using (var form = new SeekSilence()) + { + if (form.ShowDialog(this) == DialogResult.OK) + { + if (form.SeekForward) + { + audioVisualizer.FindDataBelowThreshold(form.VolumeBelow, form.SecondsDuration); + } + else + { + audioVisualizer.FindDataBelowThresholdBack(form.VolumeBelow, form.SecondsDuration); + } + } + } + } + + private void toolStripMenuItemPasteSpecial_Click(object sender, EventArgs e) + { + string text = Clipboard.GetText(); + var tmp = new Subtitle(); + var list = new List(text.SplitToLines()); + new SubRip().LoadSubtitle(tmp, list, null); + if (tmp.Paragraphs.Count == 0) + { + tmp = SubtitleFormat.LoadSubtitleFromLines(list, null) ?? new Subtitle(); + } + + if (SubtitleListview1.SelectedItems.Count == 1 && text.Length > 0) + { + var form = new ColumnPaste(SubtitleListview1.IsAlternateTextColumnVisible && _subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle, tmp.Paragraphs.Count == 0); + if (form.ShowDialog(this) == DialogResult.OK) + { + MakeHistoryForUndo(_language.BeforeColumnPaste); + + if (tmp.Paragraphs.Count == 0) + { + foreach (var line in text.SplitToLines()) + { + tmp.Paragraphs.Add(new Paragraph(line, 0, 0)); + } + } + + int index = FirstSelectedIndex; + + if (!form.PasteOverwrite) + { + for (int i = 0; i < tmp.Paragraphs.Count; i++) + { + if (form.PasteAll) + { + for (int k = _subtitle.Paragraphs.Count - 2; k >= index; k--) + { + _subtitle.Paragraphs[k + 1] = new Paragraph(_subtitle.Paragraphs[k]); + } + + if (index + i < _subtitle.Paragraphs.Count) + { + _subtitle.Paragraphs[index + i].Text = string.Empty; + } + } + else if (form.PasteTimeCodesOnly) + { + for (int k = _subtitle.Paragraphs.Count - 2; k >= index; k--) + { + _subtitle.Paragraphs[k + 1].StartTime.TotalMilliseconds = _subtitle.Paragraphs[k].StartTime.TotalMilliseconds; + _subtitle.Paragraphs[k + 1].EndTime.TotalMilliseconds = _subtitle.Paragraphs[k].EndTime.TotalMilliseconds; + } + } + else if (form.PasteTextOnly) + { + for (int k = _subtitle.Paragraphs.Count - 2; k >= index; k--) + { + _subtitle.Paragraphs[k + 1].Text = _subtitle.Paragraphs[k].Text; + } + } + else if (form.PasteOriginalTextOnly) + { + for (int k = _subtitle.Paragraphs.Count - 2; k >= index; k--) + { + var original = Utilities.GetOriginalParagraph(k, _subtitle.Paragraphs[k], _subtitleAlternate.Paragraphs); + var originalNext = Utilities.GetOriginalParagraph(k + 1, _subtitle.Paragraphs[k + 1], _subtitleAlternate.Paragraphs); + if (original != null) + { + originalNext.Text = original.Text; + } + } + + if (index + i < _subtitle.Paragraphs.Count) + { + var original = Utilities.GetOriginalParagraph(index, _subtitle.Paragraphs[index + i], _subtitleAlternate.Paragraphs); + if (original != null) + { + original.Text = string.Empty; + } + } + } + } + } + + if (form.PasteOverwrite) + { + for (int i = 0; i < tmp.Paragraphs.Count; i++) + { + if (form.PasteAll) + { + if (index + i < _subtitle.Paragraphs.Count) + { + _subtitle.Paragraphs[index + i].Text = tmp.Paragraphs[i].Text; + _subtitle.Paragraphs[index + i].StartTime.TotalMilliseconds = tmp.Paragraphs[i].StartTime.TotalMilliseconds; + _subtitle.Paragraphs[index + i].EndTime.TotalMilliseconds = tmp.Paragraphs[i].EndTime.TotalMilliseconds; + } + } + else if (form.PasteTimeCodesOnly) + { + if (index + i < _subtitle.Paragraphs.Count) + { + _subtitle.Paragraphs[index + i].StartTime.TotalMilliseconds = tmp.Paragraphs[i].StartTime.TotalMilliseconds; + _subtitle.Paragraphs[index + i].EndTime.TotalMilliseconds = tmp.Paragraphs[i].EndTime.TotalMilliseconds; + } + } + else if (form.PasteTextOnly) + { + if (index + i < _subtitle.Paragraphs.Count) + { + _subtitle.Paragraphs[index + i].Text = tmp.Paragraphs[i].Text; + } + } + else if (form.PasteOriginalTextOnly) + { + if (index + i < _subtitle.Paragraphs.Count) + { + var original = Utilities.GetOriginalParagraph(index + i, _subtitle.Paragraphs[index + i], _subtitleAlternate.Paragraphs); + if (original != null) + { + original.Text = tmp.Paragraphs[i].Text; + } + } + } + } + } + else + { + for (int i = 0; i + index < _subtitle.Paragraphs.Count && i < tmp.Paragraphs.Count; i++) + { + if (index + i < _subtitle.Paragraphs.Count) + { + if (form.PasteAll) + { + _subtitle.Paragraphs[index + i].Text = tmp.Paragraphs[i].Text; + _subtitle.Paragraphs[index + i].StartTime.TotalMilliseconds = tmp.Paragraphs[i].StartTime.TotalMilliseconds; + _subtitle.Paragraphs[index + i].EndTime.TotalMilliseconds = tmp.Paragraphs[i].EndTime.TotalMilliseconds; + } + else if (form.PasteTimeCodesOnly) + { + _subtitle.Paragraphs[index + i].StartTime.TotalMilliseconds = tmp.Paragraphs[i].StartTime.TotalMilliseconds; + _subtitle.Paragraphs[index + i].EndTime.TotalMilliseconds = tmp.Paragraphs[i].EndTime.TotalMilliseconds; + } + else if (form.PasteTextOnly) + { + _subtitle.Paragraphs[index + i].Text = tmp.Paragraphs[i].Text; + } + else if (form.PasteOriginalTextOnly) + { + var original = Utilities.GetOriginalParagraph(index + i, _subtitle.Paragraphs[index + i], _subtitleAlternate.Paragraphs); + if (original != null) + { + original.Text = tmp.Paragraphs[i].Text; + } + } + } + } + } + + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + SubtitleListview1.SelectIndexAndEnsureVisible(index, true); + RefreshSelectedParagraph(); + } + + form.Dispose(); + } + } + + private void deleteAndShiftCellsUpToolStripMenuItem_Click(object sender, EventArgs e) + { + if (SubtitleListview1.SelectedIndices.Count < 1) + { + return; + } + + int first = FirstSelectedIndex; + List list = new List(); + foreach (int index in SubtitleListview1.SelectedIndices) + { + list.Add(index); + } + + list.Sort(); + list.Reverse(); + + MakeHistoryForUndo(_language.BeforeColumnDelete); + foreach (int index in list) + { + for (int k = index; k < _subtitle.Paragraphs.Count - 1; k++) + { + _subtitle.Paragraphs[k].Text = _subtitle.Paragraphs[k + 1].Text; + } + + _subtitle.Paragraphs[_subtitle.Paragraphs.Count - 1].Text = string.Empty; + } + + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + SubtitleListview1.SelectIndexAndEnsureVisible(first, true); + RefreshSelectedParagraph(); + } + + private void toolStripMenuItemColumnImportText_Click(object sender, EventArgs e) + { + if (SubtitleListview1.SelectedIndices.Count < 1) + { + return; + } + + using (var importText = new ImportText()) + { + if (importText.ShowDialog(this) == DialogResult.OK) + { + MakeHistoryForUndo(_language.BeforeColumnImportText); + int index = FirstSelectedIndex; + for (int i = 0; i < importText.FixedSubtitle.Paragraphs.Count; i++) + { + for (int k = _subtitle.Paragraphs.Count - 2; k > index; k--) + { + _subtitle.Paragraphs[k + 1].Text = _subtitle.Paragraphs[k].Text; + } + + if (index + i < _subtitle.Paragraphs.Count) + { + _subtitle.Paragraphs[index + i].Text = string.Empty; + } + } + + for (int i = 0; i + index < _subtitle.Paragraphs.Count && i < importText.FixedSubtitle.Paragraphs.Count; i++) + { + _subtitle.Paragraphs[index + i].Text = importText.FixedSubtitle.Paragraphs[i].Text; + } + + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + SubtitleListview1.SelectIndexAndEnsureVisible(index, true); + RefreshSelectedParagraph(); + } + } + } + + private void ShiftTextCellsDownToolStripMenuItem_Click(object sender, EventArgs e) + { + if (SubtitleListview1.SelectedIndices.Count < 1) + { + return; + } + + int index = FirstSelectedIndex; + int count = SubtitleListview1.SelectedIndices.Count; + MakeHistoryForUndo(_language.BeforeColumnShiftCellsDown); + for (int i = 0; i < count; i++) + { + for (int k = _subtitle.Paragraphs.Count - 2; k >= index; k--) + { + _subtitle.Paragraphs[k + 1].Text = _subtitle.Paragraphs[k].Text; + } + + if (index + i < _subtitle.Paragraphs.Count) + { + _subtitle.Paragraphs[index + i].Text = string.Empty; + } + } + + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + SubtitleListview1.SelectIndexAndEnsureVisible(index, true); + RefreshSelectedParagraph(); + } + + private void toolStripMenuItemInsertTextFromSub_Click(object sender, EventArgs e) + { + openFileDialog1.Title = _languageGeneral.OpenSubtitle; + openFileDialog1.FileName = string.Empty; + openFileDialog1.Filter = UiUtil.SubtitleExtensionFilter.Value; + if (openFileDialog1.ShowDialog(this) == DialogResult.OK) + { + if (!File.Exists(openFileDialog1.FileName)) + { + return; + } + + var fi = new FileInfo(openFileDialog1.FileName); + if (fi.Length > 1024 * 1024 * 10) // max 10 mb + { + var text = string.Format(_language.FileXIsLargerThan10MB + Environment.NewLine + Environment.NewLine + _language.ContinueAnyway, openFileDialog1.FileName); + if (MessageBox.Show(this, text, Title, MessageBoxButtons.YesNoCancel) != DialogResult.Yes) + { + return; + } + } + + var tmp = new Subtitle(); + SubtitleFormat format = tmp.LoadSubtitle(openFileDialog1.FileName, out var encoding, null); + if (format != null) + { + if (Configuration.Settings.General.RemoveBlankLinesWhenOpening) + { + tmp.RemoveEmptyLines(); + } + + if (SubtitleListview1.SelectedIndices.Count < 1) + { + return; + } + + MakeHistoryForUndo(_language.BeforeColumnShiftCellsDown); + + int index = FirstSelectedIndex; + for (int i = 0; i < tmp.Paragraphs.Count; i++) + { + { + for (int k = _subtitle.Paragraphs.Count - 2; k > index; k--) + { + _subtitle.Paragraphs[k + 1].Text = _subtitle.Paragraphs[k].Text; + } + } + } + + for (int i = 0; i + index < _subtitle.Paragraphs.Count && i < tmp.Paragraphs.Count; i++) + { + _subtitle.Paragraphs[index + i].Text = tmp.Paragraphs[i].Text; + } + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + SubtitleListview1.SelectIndexAndEnsureVisible(index, true); + RefreshSelectedParagraph(); + } + } + } + + private void toolStripMenuItemOpenKeepVideo_Click(object sender, EventArgs e) + { + openToolStripMenuItem.Enabled = false; + ReloadFromSourceView(); + _resetVideo = false; + OpenNewFile(); + _resetVideo = true; + openToolStripMenuItem.Enabled = true; + } + + private void changeSpeedInPercentToolStripMenuItem_Click(object sender, EventArgs e) + { + if (!IsSubtitleLoaded) + { + DisplaySubtitleNotLoadedMessage(); + return; + } + + ReloadFromSourceView(); + using (var form = new ChangeSpeedInPercent(SubtitleListview1.SelectedItems.Count)) + { + if (form.ShowDialog(this) == DialogResult.OK) + { + MakeHistoryForUndo(_language.BeforeAdjustSpeedInPercent); + SaveSubtitleListviewIndices(); + if (form.AdjustAllLines) + { + _subtitle = form.AdjustAllParagraphs(_subtitle); + if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle && SubtitleListview1.IsAlternateTextColumnVisible) + { + _subtitleAlternate = form.AdjustAllParagraphs(_subtitleAlternate); + } + } + else + { + foreach (int index in SubtitleListview1.SelectedIndices) + { + var p = _subtitle.GetParagraphOrDefault(index); + if (p != null) + { + form.AdjustParagraph(p); + if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle && SubtitleListview1.IsAlternateTextColumnVisible) + { + var original = Utilities.GetOriginalParagraph(index, p, _subtitle.Paragraphs); + if (original != null) + { + form.AdjustParagraph(original); + } + } + } + } + } + + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + } + } + } + + private void toolStripMenuItemAvidStl_Click(object sender, EventArgs e) + { + var avidStl = new AvidStl(); + saveFileDialog1.Filter = avidStl.Name + "|*" + avidStl.Extension; + saveFileDialog1.Title = _language.SaveSubtitleAs; + saveFileDialog1.DefaultExt = "*" + avidStl.Extension; + saveFileDialog1.AddExtension = true; + + if (!string.IsNullOrEmpty(VideoFileName)) + { + saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(VideoFileName); + } + else + { + saveFileDialog1.FileName = Utilities.GetPathAndFileNameWithoutExtension(_fileName); + } + + if (!string.IsNullOrEmpty(openFileDialog1.InitialDirectory)) + { + saveFileDialog1.InitialDirectory = openFileDialog1.InitialDirectory; + } + + DialogResult result = saveFileDialog1.ShowDialog(this); + if (result == DialogResult.OK) + { + openFileDialog1.InitialDirectory = saveFileDialog1.InitialDirectory; + string fileName = saveFileDialog1.FileName; + string ext = Path.GetExtension(fileName); + bool extOk = ext.Equals(avidStl.Extension, StringComparison.OrdinalIgnoreCase); + if (!extOk) + { + if (fileName.EndsWith('.')) + { + fileName = fileName.Substring(0, fileName.Length - 1); + } + + fileName += avidStl.Extension; + } + + AvidStl.Save(fileName, GetSaveSubtitle(_subtitle)); + } + } + + private Subtitle GetSaveSubtitle(Subtitle subtitle) + { + var sub = new Subtitle(subtitle); + if (string.IsNullOrEmpty(sub.FileName)) + { + sub.FileName = "Untitled"; + } + + if (Configuration.Settings.General.CurrentVideoOffsetInMs != 0) + { + sub.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(Configuration.Settings.General.CurrentVideoOffsetInMs)); + } + + return sub; + } + + private void columnDeleteTextOnlyToolStripMenuItem_Click(object sender, EventArgs e) + { + if (SubtitleListview1.SelectedIndices.Count < 1) + { + return; + } + + MakeHistoryForUndo(_language.BeforeColumnDelete); + foreach (int index in SubtitleListview1.SelectedIndices) + { + _subtitle.Paragraphs[index].Text = string.Empty; + SubtitleListview1.SetText(index, string.Empty); + SubtitleListview1.SyntaxColorLine(_subtitle.Paragraphs, index, _subtitle.Paragraphs[index]); + } + + RefreshSelectedParagraph(); + } + + private void toolStripMenuItemBatchConvert_Click(object sender, EventArgs e) + { + Visible = false; + using (var form = new BatchConvert(Icon)) + { + form.ShowDialog(this); + } + + Visible = true; + } + + private void copyOriginalTextToCurrentToolStripMenuItem_Click(object sender, EventArgs e) + { + if (_subtitleAlternate == null || !SubtitleListview1.IsAlternateTextColumnVisible || SubtitleListview1.SelectedIndices.Count < 1) + { + return; + } + + bool first = true; + foreach (int index in SubtitleListview1.SelectedIndices) + { + var original = Utilities.GetOriginalParagraph(index, _subtitle.Paragraphs[index], _subtitleAlternate.Paragraphs); + if (original != null) + { + if (first) + { + MakeHistoryForUndo(_language.BeforeColumnPaste); + } + + SubtitleListview1.SetText(index, original.Text); + _subtitle.Paragraphs[index].Text = original.Text; + SubtitleListview1.SyntaxColorLine(_subtitle.Paragraphs, index, _subtitle.Paragraphs[index]); + first = false; + } + } + + RefreshSelectedParagraph(); + } + + private void toolStripMenuItemColumn_DropDownOpening(object sender, EventArgs e) + { + copyOriginalTextToCurrentToolStripMenuItem.Visible = !string.IsNullOrEmpty(copyOriginalTextToCurrentToolStripMenuItem.Text) && + SubtitleListview1.IsAlternateTextColumnVisible && + _subtitleAlternate != null; + } + + private void toolStripMenuItemMergeDuplicateText_Click(object sender, EventArgs e) + { + if (!IsSubtitleLoaded) + { + DisplaySubtitleNotLoadedMessage(); + return; + } + + ReloadFromSourceView(); + using (var form = new MergeDoubleLines()) + { + form.Initialize(_subtitle); + if (form.ShowDialog(this) == DialogResult.OK) + { + MakeHistoryForUndo(_language.BeforeMergeLinesWithSameText); + _subtitle.Paragraphs.Clear(); + foreach (var p in form.MergedSubtitle.Paragraphs) + { + _subtitle.Paragraphs.Add(p); + } + + ShowStatus(string.Format(_language.MergedShortLinesX, form.NumberOfMerges)); + SaveSubtitleListviewIndices(); + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + } + } + } + + private void toolStripMenuItemMergeLinesWithSameTimeCodes_Click(object sender, EventArgs e) + { + if (!IsSubtitleLoaded) + { + DisplaySubtitleNotLoadedMessage(); + return; + } + + ReloadFromSourceView(); + using (var form = new MergeTextWithSameTimeCodes()) + { + form.Initialize(_subtitle); + if (form.ShowDialog(this) == DialogResult.OK) + { + MakeHistoryForUndo(_language.BeforeMergeLinesWithSameText); + _subtitle.Paragraphs.Clear(); + foreach (var p in form.MergedSubtitle.Paragraphs) + { + _subtitle.Paragraphs.Add(p); + } + + ShowStatus(string.Format(_language.MergedShortLinesX, form.NumberOfMerges)); + SaveSubtitleListviewIndices(); + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + } + } + } + + private void toolStripMenuItem2_Click(object sender, EventArgs e) + { + using (var exportBdnXmlPng = new ExportPngXml()) + { + exportBdnXmlPng.Initialize(_subtitle, GetCurrentSubtitleFormat(), ExportPngXml.ExportFormats.Spumux, _fileName, _videoInfo, VideoFileName); + exportBdnXmlPng.ShowDialog(this); + } + } + + private void toolStripMenuItemModifySelection_Click(object sender, EventArgs e) + { + if (!IsSubtitleLoaded) + { + DisplaySubtitleNotLoadedMessage(); + return; + } + + using (var form = new ModifySelection(_subtitle, GetCurrentSubtitleFormat(), SubtitleListview1)) + { + form.ShowDialog(this); + } + } + + private void toolStripMenuItemInverseSelection_Click(object sender, EventArgs e) + { + if (!IsSubtitleLoaded) + { + DisplaySubtitleNotLoadedMessage(); + return; + } + + foreach (ListViewItem item in SubtitleListview1.Items) + { + item.Selected = !item.Selected; + } + } + + private void toolStripMenuItemSpellCheckFromCurrentLine_Click(object sender, EventArgs e) + { + _spellCheckForm = null; + SpellCheck(true, FirstSelectedIndex); + } + + private void toolStripMenuItemImportXSub_Click(object sender, EventArgs e) + { + if (ContinueNewOrExit()) + { + openFileDialog1.Title = _language.OpenXSubFiles; + openFileDialog1.FileName = string.Empty; + openFileDialog1.Filter = _language.XSubFiles + "|*.divx;*.avi"; + if (openFileDialog1.ShowDialog(this) == DialogResult.OK) + { + ShowStatus(_languageGeneral.PleaseWait); + if (ImportSubtitleFromDivX(openFileDialog1.FileName)) + { + ShowStatus(string.Format(_language.LoadedSubtitleX, openFileDialog1.FileName)); + } + else + { + ShowStatus(string.Empty); + MessageBox.Show(_language.NotAValidXSubFile); + } + } + } + } + + private void toolStripMenuItemImportOcrHardSub_Click(object sender, EventArgs e) + { + using (var form = new HardSubExtract(VideoFileName)) + { + if (form.ShowDialog(this) == DialogResult.OK) + { + if (!string.IsNullOrEmpty(form.OcrFileName)) + { + MakeHistoryForUndo(_language.BeforeAutoBalanceSelectedLines); + OpenSubtitle(form.OcrFileName, null); + } + } + } + } + + private void toolStripMenuItemExportFcpIImage_Click(object sender, EventArgs e) + { + using (var exportBdnXmlPng = new ExportPngXml()) + { + exportBdnXmlPng.Initialize(_subtitle, GetCurrentSubtitleFormat(), ExportPngXml.ExportFormats.Fcp, _fileName, _videoInfo, VideoFileName); + exportBdnXmlPng.ShowDialog(this); + } + } + + private void ToolStripMenuItemNuendoPropertiesClick(object sender, EventArgs e) + { + using (var form = new NuendoProperties()) + { + if (form.ShowDialog(this) == DialogResult.OK) + { + Configuration.Settings.SubtitleSettings.NuendoCharacterListFile = form.CharacterListFile; + } + } + } + + private void toolStripMenuItemDost_Click(object sender, EventArgs e) + { + using (var exportBdnXmlPng = new ExportPngXml()) + { + exportBdnXmlPng.Initialize(_subtitle, GetCurrentSubtitleFormat(), ExportPngXml.ExportFormats.Dost, _fileName, _videoInfo, VideoFileName); + exportBdnXmlPng.ShowDialog(this); + } + } + + private void toolStripMenuItemMeasurementConverter_Click(object sender, EventArgs e) + { + var selectedText = string.Empty; + if (tabControlSubtitle.SelectedIndex == TabControlSourceView) + { + selectedText = textBoxSource.SelectedText; + } + else + { + selectedText = GetFocusedTextBox().SelectedText; + } + + if (_measurementConverter != null && !_measurementConverter.IsDisposed) + { + _measurementConverter.WindowState = FormWindowState.Normal; + _measurementConverter.Input = selectedText; + _measurementConverter.IsOriginalActive = GetFocusedTextBox() == textBoxListViewTextAlternate; + _measurementConverter.Focus(); + return; + } + + _measurementConverter = new MeasurementConverter + { + Input = selectedText, + IsOriginalActive = GetFocusedTextBox() == textBoxListViewTextAlternate, + }; + _measurementConverter.InsertClicked += measurementConverter_InsertClicked; + _measurementConverter.Show(this); + } + + private void measurementConverter_InsertClicked(object sender, MeasurementConverter.InsertEventArgs e) + { + if (IsSubtitleLoaded) + { + var tb = e.IsOriginalActive ? textBoxListViewTextAlternate : textBoxListViewText; + tb.SelectedText = e.Result; + } + } + + private async void toolStripMenuItemImportChapters_Click(object sender, EventArgs e) + { + toolStripMenuItemImportChapters.Enabled = false; + ShowStatus(_language.ImportingChapters); + + var chaps = new List(); + using (var matroska = new MatroskaFile(VideoFileName)) + { + chaps = await System.Threading.Tasks.Task.Run(() => matroska.GetChapters()); + } + + if (chaps?.Count > 0) + { + mediaPlayer.Chapters = chaps; + + if (audioVisualizer.WavePeaks != null) + { + audioVisualizer.Chapters = chaps; + } + + ShowStatus(string.Format(_language.XChaptersImported, chaps?.Count)); + } + else + { + ShowStatus(_language.NoChapters); + MessageBox.Show(_language.NoChapters, Title); + } + + toolStripMenuItemImportChapters.Enabled = true; + } + + private void toolStripMenuItemImportSceneChanges_Click(object sender, EventArgs e) + { + using (var form = new ImportSceneChanges(_videoInfo, VideoFileName)) + { + if (form.ShowDialog(this) == DialogResult.OK) + { + audioVisualizer.SceneChanges = form.SceneChangesInSeconds; + SceneChangeHelper.SaveSceneChanges(VideoFileName, audioVisualizer.SceneChanges); + ShowStatus(string.Format(_language.XSceneChangesImported, form.SceneChangesInSeconds.Count)); + } + } + } + + private void toolStripMenuItemRemoveSceneChanges_Click(object sender, EventArgs e) + { + if (audioVisualizer.SceneChanges != null) + { + audioVisualizer.SceneChanges = new List(); + SceneChangeHelper.DeleteSceneChanges(VideoFileName); + } + } + + private void toolStripMenuItemBridgeGapsBetweenSubtitles_Click(object sender, EventArgs e) + { + if (!IsSubtitleLoaded) + { + DisplaySubtitleNotLoadedMessage(); + return; + } + + using (var form = new DurationsBridgeGaps(_subtitle)) + { + if (form.ShowDialog(this) == DialogResult.OK && form.FixedCount > 0) + { + int index = FirstSelectedIndex; + if (index < 0) + { + index = 0; + } + + MakeHistoryForUndo(_language.BeforeDurationsBridgeGap); + SaveSubtitleListviewIndices(); + _subtitle.Paragraphs.Clear(); + _subtitle.Paragraphs.AddRange(form.FixedSubtitle.Paragraphs); + + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + SubtitleListview1.SelectIndexAndEnsureVisible(index, true); + RestoreSubtitleListviewIndices(); + } + } + } + + private void toolStripMenuItemOpenDvd_Click(object sender, EventArgs e) + { + using (var form = new OpenVideoDvd()) + { + if (form.ShowDialog(this) == DialogResult.OK && !string.IsNullOrEmpty(form.DvdPath)) + { + VideoFileName = form.DvdPath; + if (mediaPlayer.VideoPlayer != null) + { + mediaPlayer.PauseAndDisposePlayer(); + } + + _endSeconds = -1; + + _videoInfo = new VideoInfo(); + _videoInfo.Width = 720; + _videoInfo.Height = 576; + _videoInfo.FramesPerSecond = 25; + _videoInfo.VideoCodec = "MPEG2"; + toolStripComboBoxFrameRate.Text = string.Format("{0:0.###}", _videoInfo.FramesPerSecond); + + var oldVideoPlayer = Configuration.Settings.General.VideoPlayer; + try + { + Configuration.Settings.General.VideoPlayer = "VLC"; + UiUtil.InitializeVideoPlayerAndContainer(VideoFileName, _videoInfo, mediaPlayer, VideoLoaded, VideoEnded); + mediaPlayer.ShowFullscreenButton = Configuration.Settings.General.VideoPlayerShowFullscreenButton; + mediaPlayer.OnButtonClicked -= MediaPlayer_OnButtonClicked; + mediaPlayer.OnButtonClicked += MediaPlayer_OnButtonClicked; + mediaPlayer.Volume = 0; + labelVideoInfo.Text = string.Format("DVD {0}x{1} {2}", _videoInfo.Width, _videoInfo.Height, _videoInfo.VideoCodec.Trim()); + if (_videoInfo.FramesPerSecond > 0) + { + labelVideoInfo.Text += string.Format(" {0:0.0##}", _videoInfo.FramesPerSecond); + } + } + finally + { + Configuration.Settings.General.VideoPlayer = oldVideoPlayer; + } + } + } + } + + private void toolStripMenuItemFcpProperties_Click(object sender, EventArgs e) + { + using (var form = new FcpProperties()) + { + if (form.ShowDialog(this) == DialogResult.OK) + { + Configuration.Settings.SubtitleSettings.FcpFontSize = form.FcpFontSize; + Configuration.Settings.SubtitleSettings.FcpFontName = form.FcpFontName; + } + } + } + + private void styleToolStripMenuItem_Click(object sender, EventArgs e) + { + SortSubtitle(SubtitleSortCriteria.Style, (sender as ToolStripItem).Text); + } + + private void toolStripMenuItemFocusTextbox_Click(object sender, EventArgs e) + { + int index = _subtitle.GetIndex(audioVisualizer.RightClickedParagraph); + if (index >= 0) + { + SubtitleListview1.SelectIndexAndEnsureVisible(index, true); + } + + textBoxListViewText.Focus(); + textBoxListViewText.SelectAll(); + } + + private void AscendingToolStripMenuItem_Click(object sender, EventArgs e) + { + descendingToolStripMenuItem.Checked = false; + AscendingToolStripMenuItem.Checked = true; + toolsToolStripMenuItem.ShowDropDown(); + toolStripMenuItemSortBy.ShowDropDown(); + } + + private void descendingToolStripMenuItem_Click(object sender, EventArgs e) + { + AscendingToolStripMenuItem.Checked = false; + descendingToolStripMenuItem.Checked = true; + toolsToolStripMenuItem.ShowDropDown(); + toolStripMenuItemSortBy.ShowDropDown(); + } + + private void exportCustomTextFormatToolStripMenuItem_Click(object sender, EventArgs e) + { + using (var form = new ExportCustomText(GetSaveSubtitle(_subtitle), GetSaveSubtitle(_subtitleAlternate), _fileName)) + { + if (form.ShowDialog(this) == DialogResult.OK) + { + ShowStatus(form.LogMessage); + } + } + } + + private void PasteIntoActiveTextBox(string s, bool allowMultiLine = false) + { + if (tabControlSubtitle.SelectedIndex == TabControlSourceView) + { + textBoxSource.SelectedText = s; + } + else + { + if (textBoxListViewTextAlternate.Visible && textBoxListViewTextAlternate.Enabled && textBoxListViewTextAlternate.Focused) + { + if (!string.IsNullOrEmpty(textBoxListViewTextAlternate.SelectedText)) + { + textBoxListViewTextAlternate.SelectedText = s; + } + else + { + var selectionStart = textBoxListViewTextAlternate.SelectionStart; + textBoxListViewTextAlternate.Text = textBoxListViewTextAlternate.Text.Insert(textBoxListViewTextAlternate.SelectionStart, s); + textBoxListViewTextAlternate.SelectionStart = selectionStart + s.Length; + } + } + else + { + if (SubtitleListview1.SelectedItems.Count > 1 && !textBoxListViewText.Focused && allowMultiLine) + { + foreach (ListViewItem item in SubtitleListview1.SelectedItems) + { + var p = _subtitle.GetParagraphOrDefault(item.Index); + if (p == null) + { + continue; + } + + p.Text = s + " " + p.Text; + SubtitleListview1.SetText(item.Index, p.Text); + } + RefreshSelectedParagraph(); + } + else + { + if (!string.IsNullOrEmpty(textBoxListViewText.SelectedText)) + { + textBoxListViewText.SelectedText = s; + } + else + { + var selectionStart = textBoxListViewText.SelectionStart; + textBoxListViewText.Text = textBoxListViewText.Text.Insert(textBoxListViewText.SelectionStart, s); + textBoxListViewText.SelectionStart = selectionStart + s.Length; + } + } + + ShowSource(); + } + } + } + + private void leftToolStripMenuItem_Click(object sender, EventArgs e) + { + PasteIntoActiveTextBox("\u200E"); // LRM, Left-to-Right Mark, acts as a Latin character. + } + + private void righttoleftMarkToolStripMenuItem_Click(object sender, EventArgs e) + { + PasteIntoActiveTextBox("\u200F"); // RLM, Right-to-Left Mark, acts as an Arabic character. + } + + private void startOfLefttorightEmbeddingLREToolStripMenuItem_Click(object sender, EventArgs e) + { + PasteIntoActiveTextBox("\u202A"); + } + + private void startOfRighttoleftEmbeddingRLEToolStripMenuItem_Click(object sender, EventArgs e) + { + PasteIntoActiveTextBox("\u202B"); + } + + private void startOfLefttorightOverrideLROToolStripMenuItem_Click(object sender, EventArgs e) + { + PasteIntoActiveTextBox("\u202D"); + } + + private void startOfRighttoleftOverrideRLOToolStripMenuItem_Click(object sender, EventArgs e) + { + PasteIntoActiveTextBox("\u202E"); + } + + private void toolStripMenuItemRtlUnicodeControlChar_Click(object sender, EventArgs e) + { + if (IsUnicode) + { + int selectedIndex = FirstSelectedIndex; + foreach (int index in SubtitleListview1.SelectedIndices) + { + var p = _subtitle.Paragraphs[index]; + p.Text = Utilities.FixRtlViaUnicodeChars(p.Text); + SubtitleListview1.SetText(index, p.Text); + if (index == selectedIndex) + { + textBoxListViewText.Text = p.Text; + } + } + + RefreshSelectedParagraph(); + } + } + + private void toolStripMenuItemRemoveUnicodeControlChar_Click(object sender, EventArgs e) + { + if (IsUnicode) + { + int selectedIndex = FirstSelectedIndex; + foreach (int index in SubtitleListview1.SelectedIndices) + { + var p = _subtitle.Paragraphs[index]; + p.Text = Utilities.RemoveUnicodeControlChars(p.Text); + SubtitleListview1.SetText(index, p.Text); + if (index == selectedIndex) + { + textBoxListViewText.Text = p.Text; + } + } + + RefreshSelectedParagraph(); + } + } + + private void toolStripMenuItemImportImages_Click(object sender, EventArgs e) + { + if (!ContinueNewOrExit()) + { + return; + } + + if (!string.IsNullOrEmpty(VideoFileName) && mediaPlayer.VideoPlayer != null) + { + mediaPlayer.Pause(); + } + + using (var form = new ImportImages()) + { + if (form.ShowDialog(this) == DialogResult.OK && form.Subtitle.Paragraphs.Count > 0) + { + ImportAndOcrSrt(form.Subtitle); + } + } + } + + private void audioVisualizer_MouseEnter(object sender, EventArgs e) + { + if (Configuration.Settings.VideoControls.WaveformFocusOnMouseEnter && audioVisualizer.WavePeaks != null && !audioVisualizer.Focused && audioVisualizer.CanFocus) + { + if (Math.Abs(_lastWaveformMenuCloseTicks - DateTime.UtcNow.Ticks) > 10000 * 500) // only if last change was longer ago than 500 milliseconds + { + audioVisualizer.Focus(); + } + } + } + + private void SubtitleListview1_MouseEnter(object sender, EventArgs e) + { + if (Configuration.Settings.VideoControls.WaveformFocusOnMouseEnter && Configuration.Settings.VideoControls.WaveformListViewFocusOnMouseEnter && SubtitleListview1.CanFocus) + { + SubtitleListview1.Focus(); + } + } + + private void toolStripButtonFixCommonErrors_Click(object sender, EventArgs e) + { + FixCommonErrors(false); + } + + private void toolStripButtonRemoveTextForHi_Click(object sender, EventArgs e) + { + RemoveTextForHearImpairedToolStripMenuItemClick(sender, e); + } + + private void toolStripMenuItemExportDcinemaInteropClick(object sender, EventArgs e) + { + using (var exportBdnXmlPng = new ExportPngXml()) + { + exportBdnXmlPng.Initialize(_subtitle, GetCurrentSubtitleFormat(), ExportPngXml.ExportFormats.DCinemaInterop, _fileName, _videoInfo, VideoFileName); + exportBdnXmlPng.ShowDialog(this); + } + } + + private void dCinemaSMPTE2014ToolStripMenuItem_Click(object sender, EventArgs e) + { + using (var exportBdnXmlPng = new ExportPngXml()) + { + exportBdnXmlPng.Initialize(_subtitle, GetCurrentSubtitleFormat(), ExportPngXml.ExportFormats.DCinemaInterop, _fileName, _videoInfo, VideoFileName); + exportBdnXmlPng.ShowDialog(this); + } + } + + internal Subtitle UndoFromSpellCheck(Subtitle subtitle) + { + var idx = FirstSelectedIndex; + for (int i = 0; i < _subtitle.Paragraphs.Count; i++) + { + if (_subtitle.Paragraphs[i].Text != subtitle.Paragraphs[i].Text) + { + _subtitle.Paragraphs[i].Text = subtitle.Paragraphs[i].Text; + SubtitleListview1.SetText(i, _subtitle.Paragraphs[i].Text); + } + + if (idx == i) + { + SubtitleListview1.SetText(idx, _subtitle.Paragraphs[idx].Text); + } + } + + RefreshSelectedParagraph(); + return _subtitle; + } + + private void checkForUpdatesToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + if (_timerCheckForUpdates != null) + { + _timerCheckForUpdates.Stop(); + } + } + catch + { + } + + using (var form = new CheckForUpdates(this)) + { + form.ShowDialog(this); + } + + Configuration.Settings.General.LastCheckForUpdates = DateTime.Now; + } + + private void setVideoOffsetToolStripMenuItem_Click(object sender, EventArgs e) + { + if (!string.IsNullOrEmpty(VideoFileName) && mediaPlayer.VideoPlayer != null) + { + mediaPlayer.Pause(); + } + + using (var form = new SetVideoOffset()) + { + form.VideoOffset = new TimeCode(10, 0, 0, 0); + if (Configuration.Settings.General.CurrentVideoOffsetInMs != 0) + { + form.VideoOffset = new TimeCode(Configuration.Settings.General.CurrentVideoOffsetInMs); + } + + var oldVideoOffset = Configuration.Settings.General.CurrentVideoOffsetInMs; + if (form.ShowDialog(this) == DialogResult.OK) + { + var change = _changeSubtitleHash != _subtitle.GetFastHashCode(GetCurrentEncoding().BodyName); + if (form.FromCurrentVideoPosition && mediaPlayer.VideoPlayer != null) + { + Configuration.Settings.General.CurrentVideoOffsetInMs = (long)(Math.Round((form.VideoOffset.TotalSeconds - mediaPlayer.VideoPlayer.CurrentPosition) * 1000.0)); + change = true; + } + else + { + Configuration.Settings.General.CurrentVideoOffsetInMs = (long)(Math.Round(form.VideoOffset.TotalSeconds * 1000.0)); + } + + if (form.DoNotaddVideoOffsetToTimeCodes) + { + if (form.Reset) + { + _subtitle.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(oldVideoOffset)); + _subtitleAlternate?.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(oldVideoOffset)); + } + else + { + _subtitle.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(-Configuration.Settings.General.CurrentVideoOffsetInMs)); + _subtitleAlternate?.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(-Configuration.Settings.General.CurrentVideoOffsetInMs)); + } + } + else + { + change = true; + } + + if (!change) + { + _changeSubtitleHash = _subtitle.GetFastHashCode(GetCurrentEncoding().BodyName); + } + else if (change && _changeSubtitleHash == _subtitle.GetFastHashCode(GetCurrentEncoding().BodyName)) + { + _changeSubtitleHash = -1; + } + + SaveSubtitleListviewIndices(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RefreshSelectedParagraph(); + RestoreSubtitleListviewIndices(); + } + } + } + + private void toolStripMenuItemEbuProperties_Click(object sender, EventArgs e) + { + using (var properties = new EbuSaveOptions()) + { + if (_subtitle != null && _subtitle.Header != null && (_subtitle.Header.Contains("STL2") || _subtitle.Header.Contains("STL3"))) + { + var header = Ebu.ReadHeader(Encoding.UTF8.GetBytes(_subtitle.Header)); + properties.Initialize(header, Ebu.EbuUiHelper.JustificationCode, null, _subtitle); + } + else + { + var header = new Ebu.EbuGeneralSubtitleInformation(); + if (!string.IsNullOrEmpty(_fileName) && new Ebu().IsMine(null, _fileName)) + { + properties.Initialize(header, Ebu.EbuUiHelper.JustificationCode, _fileName, _subtitle); + } + else + { + properties.Initialize(header, Ebu.EbuUiHelper.JustificationCode, null, _subtitle); + } + } + + if (properties.ShowDialog(this) == DialogResult.OK) + { + Ebu.EbuUiHelper.JustificationCode = properties.JustificationCode; + } + } + } + + private void ExportToEdlWithClipName(object sender, EventArgs e) + { + using (var exportBdnXmlPng = new ExportPngXml()) + { + exportBdnXmlPng.Initialize(_subtitle, GetCurrentSubtitleFormat(), ExportPngXml.ExportFormats.EdlClipName, _fileName, _videoInfo, VideoFileName); + exportBdnXmlPng.ShowDialog(this); + } + } + + private void ExportToEdl(object sender, EventArgs e) + { + using (var exportBdnXmlPng = new ExportPngXml()) + { + exportBdnXmlPng.Initialize(_subtitle, GetCurrentSubtitleFormat(), ExportPngXml.ExportFormats.Edl, _fileName, _videoInfo, VideoFileName); + exportBdnXmlPng.ShowDialog(this); + } + } + + private void ToolStripMenuItemAddWaveformBatchClick(object sender, EventArgs e) + { + using (var form = new AddWaveformBatch()) + { + form.ShowDialog(this); + } + } + + private void DisplaySubtitleNotLoadedMessage() + { + MessageBox.Show(this, _language.NoSubtitleLoaded, Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + + private void toolStripMenuItemExportBdTextSt_Click(object sender, EventArgs e) + { + using (var form = new ExportTextST(_subtitle)) + { + form.ShowDialog(this); + } + } + + private void ChooseProfile() + { + using (var form = new ProfileChoose(Configuration.Settings.General.Profiles, Configuration.Settings.General.CurrentProfile)) + { + if (form.ShowDialog(this) == DialogResult.OK) + { + SubtitleListview1.BeginUpdate(); + for (int i = 0; i < _subtitle.Paragraphs.Count; i++) + { + SubtitleListview1.SyntaxColorLine(_subtitle.Paragraphs, i, _subtitle.Paragraphs[i]); + } + + SubtitleListview1.EndUpdate(); + if (_subtitleListViewIndex >= 0) + { + UpdateListViewTextInfo(labelTextLineLengths, labelSingleLine, labelSingleLinePixels, labelTextLineTotal, labelCharactersPerSecond, _subtitle.Paragraphs[_subtitleListViewIndex], textBoxListViewText); + } + + ShowLineInformationListView(); + ShowSourceLineNumber(); + } + } + } + + private void DuplicateLine() + { + if (SubtitleListview1.SelectedItems.Count != 1) + { + return; + } + + var firstSelectedIndex = SubtitleListview1.SelectedItems[0].Index; + MakeHistoryForUndo(_language.BeforeInsertLine); + var newParagraph = new Paragraph(); + SetStyleForNewParagraph(newParagraph, firstSelectedIndex); + var cur = _subtitle.GetParagraphOrDefault(firstSelectedIndex); + newParagraph.StartTime.TotalMilliseconds = cur.StartTime.TotalMilliseconds; + newParagraph.EndTime.TotalMilliseconds = cur.EndTime.TotalMilliseconds; + newParagraph.Text = cur.Text; + + if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) + { + var currentOriginal = Utilities.GetOriginalParagraph(firstSelectedIndex, _subtitle.Paragraphs[firstSelectedIndex], _subtitleAlternate.Paragraphs); + if (currentOriginal != null) + { + _subtitleAlternate.Paragraphs.Insert(_subtitleAlternate.Paragraphs.IndexOf(currentOriginal) + 1, new Paragraph(currentOriginal)); + } + else + { + _subtitleAlternate.InsertParagraphInCorrectTimeOrder(new Paragraph(newParagraph)); + } + _subtitleAlternate.Renumber(); + } + + if (_networkSession != null) + { + _networkSession.TimerStop(); + NetworkGetSendUpdates(new List(), firstSelectedIndex, newParagraph); + } + else + { + _subtitle.Paragraphs.Insert(firstSelectedIndex, newParagraph); + _subtitle.Renumber(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + } + + SubtitleListview1.SelectIndexAndEnsureVisible(firstSelectedIndex, true); + ShowSource(); + ShowStatus(_language.LineInserted); + } + + private void toolStripSelected_Click(object sender, EventArgs e) + { + if (!ShowProfileInStatusBar) + { + labelStatus_Click(sender, e); + return; + } + + var x = statusStrip1.PointToClient(Cursor.Position).X; + var textWidth = TextRenderer.MeasureText(toolStripSelected.Text, toolStripSelected.Font).Width; + if (toolStripStatusLabelProgress.Visible) + { + textWidth += toolStripStatusLabelProgress.Width + 5; + } + + var min = statusStrip1.Width - textWidth - 20; + var max = min + TextRenderer.MeasureText(Configuration.Settings.General.CurrentProfile, toolStripSelected.Font).Width + 10; + if (x >= min && x <= max) + { + ChooseProfile(); // profile name in status bar clicked + } + else + { + labelStatus_Click(sender, e); + } + } + + private void contextMenuStripWaveform_Closing(object sender, ToolStripDropDownClosingEventArgs e) + { + _lastWaveformMenuCloseTicks = DateTime.UtcNow.Ticks; + } + + private void MenuOpened(object sender, EventArgs e) + { + IsMenuOpen = true; + } + + private void MenuClosed(object sender, ToolStripDropDownClosedEventArgs e) + { + IsMenuOpen = false; + } + + private void MenuClosed(object sender, EventArgs e) + { + IsMenuOpen = false; + } + + private void UpdateNetflixGlyphCheckToolsVisibility() + { + bool showTools = IsNetflixGlyphCheckAvailable(); + toolStripButtonNetflixQualityCheck.Visible = showTools && Configuration.Settings.General.ShowToolbarNetflixGlyphCheck; + } + + private bool IsNetflixGlyphCheckAvailable() + { + var formatType = GetCurrentSubtitleFormat().GetType(); + return formatType == typeof(TimedText10) || formatType == typeof(NetflixTimedText) || formatType == typeof(NetflixImsc11Japanese) || formatType == typeof(Ebu); + } + + private void NetflixGlyphCheck(bool isSaving) + { + ReloadFromSourceView(); + + string fileName = string.IsNullOrEmpty(_fileName) ? "UntitledSubtitle" : Path.GetFileNameWithoutExtension(_fileName); + string language = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle); + + var netflixController = new NetflixQualityController { Language = language, VideoFileName = VideoFileName }; + if (!string.IsNullOrEmpty(VideoFileName) && _videoInfo != null && _videoInfo.FramesPerSecond > 20) + { + netflixController.FrameRate = _videoInfo.FramesPerSecond; + } + else if (!string.IsNullOrEmpty(VideoFileName) && CurrentFrameRate != 23.976 && CurrentFrameRate != 24) + { + netflixController.FrameRate = CurrentFrameRate; + } + + netflixController.RunChecks(_subtitle); + + if (netflixController.Records.Count > 0) + { + string reportPath = Path.GetTempPath() + fileName + "_NetflixQualityCheck.csv"; + netflixController.SaveCsv(reportPath); + if (!isSaving) + { + using (var form = new NetflixFixErrors(_subtitle, GetCurrentSubtitleFormat(), _fileName, VideoFileName)) + { + if (form.ShowDialog(this) == DialogResult.OK) + { + // Do nothing for now + } + } + } + else + { + ShowStatus(string.Format(_language.SavedSubtitleX, _fileName) + " - " + + string.Format(Configuration.Settings.Language.NetflixQualityCheck.FoundXIssues, netflixController.Records.Count)); + } + } + else if (!isSaving) + { + MessageBox.Show("Netflix Quality Check found no issues.", "Netflix Quality Check"); + } + } + + private void netflixGlyphCheckToolStripMenuItem_Click(object sender, EventArgs e) + { + NetflixGlyphCheck(false); + } + + private void toolStripButtonNetflixGlyphCheck_Click(object sender, EventArgs e) + { + NetflixGlyphCheck(false); + } + + private void insertSubtitleHereToolStripMenuItem_Click(object sender, EventArgs e) + { + openFileDialog1.Title = _languageGeneral.OpenSubtitle; + openFileDialog1.FileName = string.Empty; + openFileDialog1.Filter = UiUtil.SubtitleExtensionFilter.Value; + if (openFileDialog1.ShowDialog(this) == DialogResult.OK && File.Exists(openFileDialog1.FileName)) + { + var fi = new FileInfo(openFileDialog1.FileName); + if (fi.Length > 1024 * 1024 * 10) // max 10 mb + { + var text = string.Format(_language.FileXIsLargerThan10MB + Environment.NewLine + Environment.NewLine + _language.ContinueAnyway, openFileDialog1.FileName); + if (MessageBox.Show(this, text, Title, MessageBoxButtons.YesNoCancel) != DialogResult.Yes) + { + return; + } + } + + var subtitle = new Subtitle(); + SubtitleFormat format = subtitle.LoadSubtitle(openFileDialog1.FileName, out var encoding, null); + if (format != null && subtitle.Paragraphs.Count > 0) + { + SaveSubtitleListviewIndices(); + + if (Configuration.Settings.General.RemoveBlankLinesWhenOpening) + { + subtitle.RemoveEmptyLines(); + } + + var adjustment = mediaPlayer.CurrentPosition - subtitle.Paragraphs[0].StartTime.TotalSeconds; + if (adjustment < 0) + { + adjustment = 0; + } + + foreach (Paragraph newP in subtitle.Paragraphs) + { + newP.Adjust(1.0d, adjustment); + if (_subtitle.Paragraphs.Any(p => newP.StartTime.TotalMilliseconds >= p.StartTime.TotalMilliseconds && + newP.StartTime.TotalMilliseconds <= p.EndTime.TotalMilliseconds || + newP.EndTime.TotalMilliseconds >= p.StartTime.TotalMilliseconds && + newP.EndTime.TotalMilliseconds <= p.EndTime.TotalMilliseconds)) + { + // new subs will overlap existing subs + if (MessageBox.Show(_language.PromptInsertSubtitleOverlap, _languageGeneral.Title, MessageBoxButtons.YesNoCancel) != DialogResult.Yes) + { + return; + } + + break; + } + } + + MakeHistoryForUndo(string.Format(_language.BeforeInsertSubtitleAtVideoPosition, openFileDialog1.FileName)); + + foreach (var p in subtitle.Paragraphs) + { + _subtitle.InsertParagraphInCorrectTimeOrder(p); + } + + _subtitle.Renumber(); + ShowSource(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + RestoreSubtitleListviewIndices(); + } + } + } + + private void actorToolStripMenuItemClick(object sender, EventArgs e) + { + SortSubtitle(SubtitleSortCriteria.Actor, (sender as ToolStripItem).Text); + } + + private void toolStripMenuItemFcpXmlAdvanced_Click(object sender, EventArgs e) + { + using (var dialog = new ExportFcpXmlAdvanced(_subtitle, VideoFileName)) + { + dialog.ShowDialog(this); + } + } + + private void toolStripMenuItemOpenVideoFromUrl_Click(object sender, EventArgs e) + { + using (var form = new TextPrompt(Configuration.Settings.Language.Main.OpenVideoFile, "Url")) + { + if (form.ShowDialog(this) == DialogResult.OK) + { + string url = form.InputText; + if (!string.IsNullOrEmpty(url)) + { + if (audioVisualizer.WavePeaks != null) + { + audioVisualizer.WavePeaks = null; + audioVisualizer.SetSpectrogram(null); + audioVisualizer.SceneChanges = new List(); + audioVisualizer.Chapters = new List(); + } + + if (!panelVideoPlayer.Visible) + { + toolStripButtonToggleVideo_Click(null, null); + } + + ShowSubtitleTimer.Stop(); + Cursor = Cursors.WaitCursor; + VideoFileName = url; + if (mediaPlayer.VideoPlayer != null) + { + mediaPlayer.PauseAndDisposePlayer(); + } + + _endSeconds = -1; + UiUtil.InitializeVideoPlayerAndContainer(url, _videoInfo, mediaPlayer, VideoLoaded, VideoEnded); + mediaPlayer.Volume = 0; + mediaPlayer.ShowFullscreenButton = Configuration.Settings.General.VideoPlayerShowFullscreenButton; + mediaPlayer.OnButtonClicked -= MediaPlayer_OnButtonClicked; + mediaPlayer.OnButtonClicked += MediaPlayer_OnButtonClicked; + labelVideoInfo.Text = url; + Cursor = Cursors.Default; + SetUndockedWindowsTitle(); + ShowSubtitleTimer.Start(); + } + } + } + } + + private void SmpteTimeModedropFrameToolStripMenuItem_Click(object sender, EventArgs e) + { + smpteTimeModedropFrameToolStripMenuItem.Checked = !smpteTimeModedropFrameToolStripMenuItem.Checked; + mediaPlayer.SmpteMode = smpteTimeModedropFrameToolStripMenuItem.Checked; + } + + private void moveTextUpToolStripMenuItem_Click(object sender, EventArgs e) + { + var indices = SubtitleListview1.SelectedIndices.OfType().OrderBy(p => p).ToList(); + if (indices.Count == 0 || indices[0] - 1 < 0) + { + return; + } + + MakeHistoryForUndo(string.Format(_language.BeforeX, _language.Menu.ContextMenu.ColumnTextUp)); + SubtitleListview1.SelectedIndexChanged -= SubtitleListview1_SelectedIndexChanged; + SubtitleListview1.BeginUpdate(); + foreach (int index in indices) + { + if (index - 1 >= 0) + { + var p = _subtitle.Paragraphs[index]; + var prev = _subtitle.Paragraphs[index - 1]; + var prevText = prev.Text; + prev.Text = p.Text; + p.Text = prevText; + SubtitleListview1.Items[index - 1].Selected = true; + SubtitleListview1.Items[index].Selected = false; + SubtitleListview1.SetText(index - 1, prev.Text); + SubtitleListview1.SetText(index, p.Text); + SubtitleListview1.SyntaxColorLine(_subtitle.Paragraphs, index - 1, prev); + SubtitleListview1.SyntaxColorLine(_subtitle.Paragraphs, index, p); + } + } + + SubtitleListview1.EndUpdate(); + SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; + SubtitleListview1.EnsureVisible(FirstSelectedIndex); + _subtitleListViewIndex = -1; + SubtitleListview1_SelectedIndexChanged(null, null); + } + + private void moveTextDownToolStripMenuItem_Click(object sender, EventArgs e) + { + var indices = SubtitleListview1.SelectedIndices.OfType().OrderByDescending(p => p).ToList(); + if (indices.Count == 0 || indices[0] + 1 >= _subtitle.Paragraphs.Count) + { + return; + } + + MakeHistoryForUndo(string.Format(_language.BeforeX, _language.Menu.ContextMenu.ColumnTextDown)); + SubtitleListview1.SelectedIndexChanged -= SubtitleListview1_SelectedIndexChanged; + SubtitleListview1.BeginUpdate(); + foreach (int index in indices) + { + if (index + 1 < _subtitle.Paragraphs.Count) + { + var p = _subtitle.Paragraphs[index]; + var next = _subtitle.Paragraphs[index + 1]; + var nextText = next.Text; + next.Text = p.Text; + p.Text = nextText; + SubtitleListview1.Items[index + 1].Selected = true; + SubtitleListview1.Items[index].Selected = false; + SubtitleListview1.SetText(index, p.Text); + SubtitleListview1.SetText(index + 1, next.Text); + SubtitleListview1.SyntaxColorLine(_subtitle.Paragraphs, index, p); + SubtitleListview1.SyntaxColorLine(_subtitle.Paragraphs, index + 1, next); + } + } + + SubtitleListview1.EndUpdate(); + SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; + SubtitleListview1.EnsureVisible(FirstSelectedIndex); + SubtitleListview1.EnsureVisible(indices[0]); + _subtitleListViewIndex = -1; + SubtitleListview1_SelectedIndexChanged(null, null); + } + + private void generateTextFromCurrentVideoToolStripMenuItem_Click(object sender, EventArgs e) + { + using (var form = new AudioToText(VideoFileName, _videoInfo)) + { + if (form.ShowDialog(this) == DialogResult.OK) + { + _subtitle.Paragraphs.Clear(); + _subtitle.Paragraphs.AddRange(form.Subtitle.Paragraphs); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + if (_subtitle.Paragraphs.Count > 1) + { + ToolStripMenuItemAutoMergeShortLinesClick(sender, e); + } + } + } + } + + private void toolStripMenuDvdStudioProperties_Click(object sender, EventArgs e) + { + using (var form = new DvdStudioProProperties()) + { + form.ShowDialog(this); + } + } + + private void boxToolStripMenuItem_Click(object sender, EventArgs e) + { + ListViewToggleTag("box"); + } + + private void ShowHideBookmark(Paragraph p) + { + if (!string.IsNullOrWhiteSpace(p.Bookmark)) + { + pictureBoxBookmark.Show(); + if (_showBookmarkLabel) + { + panelBookmark.Show(); + using (var graphics = CreateGraphics()) + { + var textSize = graphics.MeasureString(p.Bookmark, Font); + labelBookmark.Text = p.Bookmark; + panelBookmark.Left = pictureBoxBookmark.Left; + panelBookmark.Top = pictureBoxBookmark.Top + pictureBoxBookmark.Height + 9; + panelBookmark.Width = (int)textSize.Width + 20; + panelBookmark.Height = (int)textSize.Height + 20; + panelBookmark.Show(); + } + } + else + { + panelBookmark.Hide(); + } + } + else if (p.Bookmark != null) + { + pictureBoxBookmark.Show(); + panelBookmark.Hide(); + } + else if (panelBookmark.Visible || pictureBoxBookmark.Visible) + { + panelBookmark.Hide(); + pictureBoxBookmark.Hide(); + } + } + + private void pictureBoxBookmark_MouseClick(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + if (panelBookmark.Visible) + { + panelBookmark.Hide(); + _showBookmarkLabel = false; + } + else + { + _showBookmarkLabel = true; + var p = _subtitle.GetParagraphOrDefault(_subtitleListViewIndex); + if (p != null) + { + ShowHideBookmark(p); + } + } + } + } + + private void pictureBoxBookmark_MouseEnter(object sender, EventArgs e) + { + if (_bookmarkContextMenu != null) + { + return; + } + + _bookmarkContextMenu = new ContextMenu(); + + // edit bookmark + var menuItem = new MenuItem(Configuration.Settings.Language.Main.Menu.ContextMenu.EditBookmark); + menuItem.Click += (sender2, e2) => { labelBookmark_DoubleClick(null, null); }; + _bookmarkContextMenu.MenuItems.Add(menuItem); + + // remove bookmark + menuItem = new MenuItem(Configuration.Settings.Language.Main.Menu.ContextMenu.RemoveBookmark); + menuItem.Click += (sender2, e2) => + { + var p2 = _subtitle.GetParagraphOrDefault(_subtitleListViewIndex); + if (p2 != null) + { + MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Main.Menu.ContextMenu.RemoveBookmark)); + p2.Bookmark = null; + SubtitleListview1.ShowState(_subtitleListViewIndex, p2); + ShowHideBookmark(p2); + SetListViewStateImages(); + new BookmarkPersistence(_subtitle, _fileName).Save(); + } + }; + _bookmarkContextMenu.MenuItems.Add(menuItem); + + _bookmarkContextMenu.MenuItems.Add("-"); + + // go to bookmark + menuItem = new MenuItem(Configuration.Settings.Language.Settings.GoToBookmark); + menuItem.Click += (sender2, e2) => { GoToBookmark(); }; + _bookmarkContextMenu.MenuItems.Add(menuItem); + + // clear all bookmarks + menuItem = new MenuItem(Configuration.Settings.Language.Settings.ClearBookmarks); + menuItem.Click += (sender2, e2) => { ClearBookmarks(); }; + _bookmarkContextMenu.MenuItems.Add(menuItem); + + pictureBoxBookmark.ContextMenu = _bookmarkContextMenu; + } + + private void labelBookmark_DoubleClick(object sender, EventArgs e) + { + var p1 = _subtitle.GetParagraphOrDefault(_subtitleListViewIndex); + if (p1 != null) + { + using (var form = new BookmarkAdd(p1)) + { + var result = form.ShowDialog(this); + if (result == DialogResult.OK) + { + MakeHistoryForUndo(string.Format(_language.BeforeX, Configuration.Settings.Language.Main.Menu.ContextMenu.EditBookmark)); + p1.Bookmark = form.Comment; + SubtitleListview1.ShowState(_subtitleListViewIndex, p1); + ShowHideBookmark(p1); + SetListViewStateImages(); + new BookmarkPersistence(_subtitle, _fileName).Save(); + } + } + } + } + + private void googleTranslateToolStripMenuItem_Click(object sender, EventArgs e) + { + TranslateViaGoogle(true, true); + } + + private void microsoftBingTranslateToolStripMenuItem_Click(object sender, EventArgs e) + { + TranslateViaGoogle(true, false); + } + + private void toolStripMenuItemBookmark_Click(object sender, EventArgs e) + { + ToggleBookmarks(true); + } + + private void RunActionOnAllParagraphs(Func action, string historyMessage) + { + if (_subtitle.Paragraphs.Count <= 0 || SubtitleListview1.SelectedItems.Count <= 0) + { + return; + } + + int linesUpdated = 0; + var selectedIndices = SubtitleListview1.GetSelectedIndices(); + for (int i = selectedIndices.Length - 1; i >= 0; i--) + { + int idx = selectedIndices[i]; + var p = _subtitle.GetParagraphOrDefault(idx); + if (p != null) + { + var newText = action.Invoke(p); + if (newText != p.Text) + { + if (linesUpdated == 0) + { + MakeHistoryForUndo(historyMessage); + } + if (newText.IsOnlyControlCharactersOrWhiteSpace()) + { + _subtitle.Paragraphs.RemoveAt(idx); + } + else + { + p.Text = newText; + } + linesUpdated++; + } + + if (_subtitleAlternate != null && Configuration.Settings.General.AllowEditOfOriginalSubtitle) + { + var original = Utilities.GetOriginalParagraph(idx, p, _subtitleAlternate.Paragraphs); + if (original != null) + { + newText = action.Invoke(original); + if (newText != original.Text) + { + if (linesUpdated == 0) + { + MakeHistoryForUndo(historyMessage); + } + if (newText.IsOnlyControlCharactersOrWhiteSpace()) + { + _subtitleAlternate.Paragraphs.RemoveAt(idx); + } + else + { + original.Text = newText; + } + linesUpdated++; + } + } + } + } + } + + if (linesUpdated == 0) + { + return; // nothing changed + } + + var firstIdx = FirstSelectedIndex; + _subtitle.Renumber(); + _subtitleAlternate?.Renumber(); + SubtitleListview1.Fill(_subtitle, _subtitleAlternate); + ShowSource(); + SubtitleListview1.SelectIndexAndEnsureVisibleFaster(firstIdx); + RefreshSelectedParagraph(); + ShowStatus(string.Format(_language.LinesUpdatedX, linesUpdated)); + } + + private void removeAllFormattingsToolStripMenuItem_Click(object sender, EventArgs e) + { + RunActionOnAllParagraphs((p) => + { + var s = p.Text.Replace("♪", string.Empty).Replace("♫", string.Empty); + s = NetflixImsc11Japanese.RemoveTags(s); + return HtmlUtil.RemoveHtmlTags(s, true).Trim(); + }, string.Format(_language.BeforeX, _language.Menu.ContextMenu.RemoveFormattingAll)); + } + + private void removeBoldToolStripMenuItem_Click(object sender, EventArgs e) + { + RunActionOnAllParagraphs((p) => + { + return p.Text.Replace("", string.Empty) + .Replace("", string.Empty) + .Replace("", string.Empty) + .Replace("", string.Empty); + }, string.Format(_language.BeforeX, _language.Menu.ContextMenu.RemoveFormattingBold)); + } + + private void removeItalicToolStripMenuItem_Click(object sender, EventArgs e) + { + RunActionOnAllParagraphs((p) => + { + return p.Text.Replace("", string.Empty) + .Replace("", string.Empty) + .Replace("", string.Empty) + .Replace("", string.Empty); + }, string.Format(_language.BeforeX, _language.Menu.ContextMenu.RemoveFormattingItalic)); + } + + private void removeUnderlineToolStripMenuItem_Click(object sender, EventArgs e) + { + RunActionOnAllParagraphs((p) => + { + return p.Text.Replace("", string.Empty) + .Replace("", string.Empty) + .Replace("", string.Empty) + .Replace("", string.Empty); + }, string.Format(_language.BeforeX, _language.Menu.ContextMenu.RemoveFormattingUnderline)); + } + + private void removeColorToolStripMenuItem_Click(object sender, EventArgs e) + { + RunActionOnAllParagraphs((p) => + { + if (!p.Text.Contains(" 4) + { + var font = s.Substring(match.Index - 5); + if (font.StartsWith("", StringComparison.OrdinalIgnoreCase)) + { + s = s.Remove(match.Index - 5, 7); + var endIndex = s.IndexOf("", match.Index - 5, StringComparison.OrdinalIgnoreCase); + if (endIndex >= 0) + { + s = s.Remove(endIndex, 7); + } + } + else if (s.Length > match.Index + 1 && s[match.Index + 1] == '>') + { + s = s.Remove(match.Index, 1); + } + } + + match = r.Match(s); + } + + return s.Trim(); + }, string.Format(_language.BeforeX, _language.Menu.ContextMenu.RemoveFormattingColor)); + } + + private void removeFontNameToolStripMenuItem_Click(object sender, EventArgs e) + { + RunActionOnAllParagraphs((p) => + { + if (!p.Text.Contains(" 4) + { + var font = s.Substring(match.Index - 5); + if (font.StartsWith("", StringComparison.OrdinalIgnoreCase)) + { + s = s.Remove(match.Index - 5, 7); + var endIndex = s.IndexOf("", match.Index - 5, StringComparison.OrdinalIgnoreCase); + if (endIndex >= 0) + { + s = s.Remove(endIndex, 7); + } + } + else if (s.Length > match.Index + 1 && s[match.Index + 1] == '>') + { + s = s.Remove(match.Index, 1); + } + } + + match = r.Match(s); + } + + return s; + }, string.Format(_language.BeforeX, _language.Menu.ContextMenu.RemoveFormattingFontName)); + } + + private void removeAlignmentToolStripMenuItem_Click(object sender, EventArgs e) + { + RunActionOnAllParagraphs((p) => + { + if (!p.Text.Contains('{')) + { + return p.Text; + } + + return RemoveAssAlignmentTags(p.Text); + }, string.Format(_language.BeforeX, _language.Menu.ContextMenu.RemoveFormattingAlignment)); + } + + private void BoutenToolStripMenuItemClick(object sender, EventArgs e) + { + MakeHistoryForUndo(string.Format(_language.BeforeX, (sender as ToolStripMenuItem).Text)); + TextBoxListViewToggleTag((sender as ToolStripMenuItem).Text); + } + + private void toolStripMenuItemHorizontalDigits_Click(object sender, EventArgs e) + { + MakeHistoryForUndo(string.Format(_language.BeforeX, "horizontalDigit")); + TextBoxListViewToggleTag("horizontalDigit"); + } + + private void toolStripMenuItemSetParagraphAsSelection_Click(object sender, EventArgs e) + { + if (SubtitleListview1.SelectedItems.Count == 1 && audioVisualizer != null && audioVisualizer.NewSelectionParagraph != null) + { + var idx = SubtitleListview1.SelectedItems[0].Index; + var p = _subtitle.Paragraphs[idx]; + ButtonSetEndAndGoToNextClick(null, null); + p.StartTime.TotalMilliseconds = audioVisualizer.NewSelectionParagraph.StartTime.TotalMilliseconds; + p.EndTime.TotalMilliseconds = audioVisualizer.NewSelectionParagraph.EndTime.TotalMilliseconds; + SubtitleListview1.SetStartTimeAndDuration(idx, p, _subtitle.GetParagraphOrDefault(idx - 1), _subtitle.GetParagraphOrDefault(idx + 1)); + mediaPlayer.CurrentPosition = audioVisualizer.NewSelectionParagraph.EndTime.TotalSeconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines / 1000.0; + audioVisualizer.NewSelectionParagraph = null; + } + } + + private void toolStripMenuItemRuby_Click(object sender, EventArgs e) + { + var tb = GetFocusedTextBox(); + string before = string.Empty; + string text = tb.SelectedText; + string after = string.Empty; + + int selectionStart = tb.SelectionStart; + if (selectionStart > 0) + { + before = tb.Text.Substring(0, selectionStart); + } + + if (tb.Text.Length > selectionStart + text.Length) + { + after = tb.Text.Remove(0, selectionStart + text.Length); + } + + if (text.StartsWith(' ')) + { + before += " "; + text = text.TrimStart(); + } + + if (text.EndsWith(' ')) + { + after = " " + after; + } + + using (var form = new RubyJapanese(before, text, after)) + { + if (form.ShowDialog(this) != DialogResult.OK) + { + return; + } + + var rubyText = form.RubyText; + if (form.RubyItalic) + { + rubyText = "" + rubyText + ""; + } + else + { + rubyText = "" + rubyText + ""; + } + var rubyHtml = before + "" + form.RubyBaseText + "" + rubyText + "" + after; // sami ruby tag fix + var formatType = GetCurrentSubtitleFormat().GetType(); + if (formatType == typeof(Sami)) // sami ruby tag fix + { + rubyHtml = rubyHtml.Replace("ruby-container", "ruby") + .Replace("ruby-text", "rt") + .Replace("", string.Empty) + .Replace("", string.Empty) // sami ruby tag fix rp remove + .Replace("", string.Empty) // sami ruby tag fix italic remove + .Replace("", string.Empty) + .Replace("", string.Empty) + .Replace("", string.Empty); + } + tb.Text = rubyHtml; + } + } + + private void toolStripMenuItemAutoTranslate_DropDownOpening(object sender, EventArgs e) + { + translatepoweredByMicrosoftToolStripMenuItem.Visible = + !string.IsNullOrEmpty(Configuration.Settings.Tools.MicrosoftTranslatorApiKey) && + !string.IsNullOrEmpty(Configuration.Settings.Tools.MicrosoftTranslatorTokenEndpoint); + } + + private void comboBoxSubtitleFormats_DropDownClosed(object sender, EventArgs e) + { + MenuClosed(sender, e); + if (_oldSubtitleFormat.FriendlyName != GetCurrentSubtitleFormat().FriendlyName) + { + ComboBoxSubtitleFormatsSelectedIndexChanged(sender, e); + } + } + + private void comboBoxSubtitleFormats_DropDown(object sender, EventArgs e) + { + _oldSubtitleFormat = GetCurrentSubtitleFormat(); + MenuOpened(sender, e); + } + + private void toolStripSplitButtonPlayRate_ButtonClick(object sender, EventArgs e) + { + toolStripSplitButtonPlayRate.ShowDropDown(); + } + + private void ShowButtonShortcut(string shortcut) + { + if (string.IsNullOrEmpty(shortcut)) + { + ShowStatus(string.Empty, false); + } + else + { + ShowStatus(string.Format(Configuration.Settings.Language.General.ShortcutX, shortcut), false); + } + } + + private void buttonSetStartAndOffsetRest_MouseEnter(object sender, EventArgs e) + { + if (!string.IsNullOrEmpty(Configuration.Settings.Shortcuts.MainAdjustSetStartAndOffsetTheRest2)) + { + ShowButtonShortcut(Configuration.Settings.Shortcuts.MainAdjustSetStartAndOffsetTheRest2); + } + else + { + ShowButtonShortcut(Configuration.Settings.Shortcuts.MainAdjustSetStartAndOffsetTheRest); + } + } + + private void buttonSetEndAndGoToNext_MouseEnter(object sender, EventArgs e) + { + ShowButtonShortcut(Configuration.Settings.Shortcuts.MainAdjustSetEndAndGotoNext); + } + + private void buttonAdjustSetStartTime_MouseEnter(object sender, EventArgs e) + { + ShowButtonShortcut(Configuration.Settings.Shortcuts.MainCreateSetStart); + } + + private void buttonAdjustSetEndTime_MouseEnter(object sender, EventArgs e) + { + ShowButtonShortcut(Configuration.Settings.Shortcuts.MainCreateSetEnd); + } + + private void buttonInsertNewText_MouseEnter(object sender, EventArgs e) + { + ShowButtonShortcut(Configuration.Settings.Shortcuts.MainCreateInsertSubAtVideoPos); + } + + private void buttonAdjustPlayBefore_MouseEnter(object sender, EventArgs e) + { + ShowButtonShortcut(Configuration.Settings.Shortcuts.MainVideoPlayFromJustBefore); + } + + private void buttonAdjustGoToPosAndPause_MouseEnter(object sender, EventArgs e) + { + ShowButtonShortcut(Configuration.Settings.Shortcuts.MainVideoGoToStartCurrent); + } + + private void buttonBeforeText_MouseEnter(object sender, EventArgs e) + { + ShowButtonShortcut(Configuration.Settings.Shortcuts.MainVideoPlayFromJustBefore); + } + + private void buttonGotoSub_MouseEnter(object sender, EventArgs e) + { + ShowButtonShortcut(Configuration.Settings.Shortcuts.MainVideoGoToStartCurrent); + } + + private void buttonSetStartTime_MouseEnter(object sender, EventArgs e) + { + ShowButtonShortcut(Configuration.Settings.Shortcuts.MainCreateSetStart); + } + + private void buttonSetEnd_MouseEnter(object sender, EventArgs e) + { + ShowButtonShortcut(Configuration.Settings.Shortcuts.MainCreateSetEnd); + } + + private void boxToolStripMenuItem1_Click(object sender, EventArgs e) + { + var tb = GetFocusedTextBox(); + tb.Text = HtmlUtil.ToggleTag(tb.Text, "box"); + } + + private void toolStripMenuItemPreview_Click(object sender, EventArgs e) + { + var htmlFileName = Path.Combine(Path.GetTempPath(), $"WebVttPreview_{Guid.NewGuid()}.html"); + var subText = Encoding.UTF8.GetBytes(new WebVTT().ToText(_subtitle, "preview")); + File.WriteAllText(htmlFileName, @" + + + + WebVTT preview + + + + +" + .Replace('\'', '"') + .Replace("[BASE64]", Convert.ToBase64String(subText)) + .Replace("[VIDEO]", "file://" + VideoFileName) + .Replace("[EXT]", Path.GetExtension(VideoFileName).TrimStart('.').ToLowerInvariant()), Encoding.UTF8); + UiUtil.OpenFile(htmlFileName); + + System.Threading.SynchronizationContext.Current.Post(TimeSpan.FromMilliseconds(25000), () => + { + try + { + File.Delete(htmlFileName); + } + catch + { + // Ignore + } + }); + } + + private void trackBarWaveformPosition_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Space) + { + mediaPlayer.TogglePlayPause(); + e.SuppressKeyPress = true; + } + } + + private void toolStripMenuItemAssaStyles_Click(object sender, EventArgs e) + { + toolStripMenuItemAssStyles_Click(sender, e); + } + + private void openSecondSubtitleToolStripMenuItem_Click(object sender, EventArgs e) + { + openFileDialog1.Title = _languageGeneral.OpenSubtitle; + openFileDialog1.FileName = string.Empty; + openFileDialog1.Filter = UiUtil.SubtitleExtensionFilter.Value; + if (openFileDialog1.ShowDialog(this) != DialogResult.OK) + { + return; + } + + if (mediaPlayer.VideoPlayer is LibMpvDynamic libMpv) + { + if (Configuration.Settings.General.MpvHandlesPreviewText) + { + Configuration.Settings.General.MpvHandlesPreviewText = false; + mediaPlayer.VideoPlayer = libMpv; + mediaPlayer.SubtitleText = string.Empty; + } + libMpv.LoadSubtitle(openFileDialog1.FileName); + } + else if (mediaPlayer.VideoPlayer is LibVlcDynamic libvlc) + { + libvlc.LoadSecondSubtitle(openFileDialog1.FileName); + } + } + + private void aSSStylesToolStripMenuItem_Click(object sender, EventArgs e) + { + toolStripMenuItemAssStyles_Click(sender, e); + } + + private void contextMenuStripEmpty_Opening(object sender, CancelEventArgs e) + { + var format = GetCurrentSubtitleFormat(); + var formatType = format.GetType(); + if (formatType == typeof(AdvancedSubStationAlpha)) + { + aSSStylesToolStripMenuItem.Visible = true; + aSSStylesToolStripMenuItem.Text = _language.Menu.ContextMenu.AdvancedSubStationAlphaStyles; + } + else if (formatType == typeof(SubStationAlpha)) + { + aSSStylesToolStripMenuItem.Visible = true; + aSSStylesToolStripMenuItem.Text = _language.Menu.ContextMenu.SubStationAlphaStyles; + } + else + { + aSSStylesToolStripMenuItem.Visible = false; + } + } + + private void splitContainerListViewAndText_SplitterMoved(object sender, SplitterEventArgs e) + { + if (Configuration.Settings.General.SubtitleTextBoxMaxHeight < splitContainerListViewAndText.Panel2MinSize && + Configuration.Settings.General.SubtitleTextBoxMaxHeight > 1000) + { + return; + } + + if (splitContainerListViewAndText.Panel2.Height > Configuration.Settings.General.SubtitleTextBoxMaxHeight) + { + splitContainerListViewAndText.SplitterDistance = splitContainerListViewAndText.Height - Configuration.Settings.General.SubtitleTextBoxMaxHeight; + } + } + + private void splitContainerListViewAndText_SizeChanged(object sender, EventArgs e) + { + splitContainerListViewAndText_SplitterMoved(null, null); + } + } +} diff --git a/src/Forms/Main.resx b/src/ui/Forms/Main.resx similarity index 98% rename from src/Forms/Main.resx rename to src/ui/Forms/Main.resx index fcd792a4a..afe2ae3cf 100644 --- a/src/Forms/Main.resx +++ b/src/ui/Forms/Main.resx @@ -1,760 +1,760 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 934, 17 - - - 217, 17 - - - - - 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 - RK5CYII= - - - - - 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 - l+svNTWhA+4N0kEAAAAASUVORK5CYII= - - - - - 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 - GD8DWVnn/SrmSbcAAAAASUVORK5CYII= - - - - - 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 - TQ5yKU5N+xNUiLSfSZ3YnAAAAABJRU5ErkJggg== - - - - - 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 - AElFTkSuQmCC - - - - - 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 - TgDQASA1MVpwzwAAAABJRU5ErkJggg== - - - - 322, 17 - - - 459, 56 - - - 673, 17 - - - 1050, 17 - - - 372, 56 - - - 813, 17 - - - - AAEAAAD/////AQAAAAAAAAAMAgAAAJoBbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1u - ZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIG1zY29ybGliLCBWZXJzaW9u - PTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQUB - AAAAMFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLkRvdWJsZQMAAAAGX2l0 - ZW1zBV9zaXplCF92ZXJzaW9uBwAABggIAgAAAAkDAAAAAAAAAAAAAAAPAwAAAAAAAAAGCw== - - - - 650, 56 - - - 650, 56 - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHISURBVDhPrZDfS1NhGMf7f6Sb8A8IuwvEguqiGyF/lEFZ - usbUgsUcYxynzGNNPLN0c26xyXRpiIHo5o6xFmGtcl2IN9oQXEs3qSQ/9R5MZeckCH3guXu+n+f7vqf+ - K8XSDslUmuFQBEd3H3aXm8GRIHH1FdvFIvtrxuQ2NgiEo4RjU2Q+LrO1ta3Nu8yHP8Iw3iE/X3I5Y4lY - FOHZRJJyfuzuUSj9IjQ+jUfxatL92CGitrhczt/wWn6Xz+s/keRB4omEXiAqitpHKQ+/XfmOf0KlX1H0 - ArtL1qoJ2ruDWLoC3LU/5cZ9D7WtPVy+6WDh0w4xdZ22jna9wCb1HAjuOX3ceqhQZ5G52ixxsdHG+doH - vFwqEYmvYW6z6AVeX4Cl9xnD2uKyCE+9KfJodI5euVcvmE+qDI8+OzYsxmx1MTkZ1QsKhW8MPBkiGH3x - z3Cne4SqKy1ElDt6gWBldZW+/gGcbgXfeFL7MPFmUdts7eLspdu4rTV8XXYQ83cYSzbzeaZnZnBKEg1N - 17nWUIet00ZkLKxNVeVpVE+FJgk9bjKWHEc6nabmQvWBJCDXn1ySep3SJM9dZzA1nju5QJDNZjGZWlhc - VPkN8D3f8pYPr2wAAAAASUVORK5CYII= - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHbSURBVDhPrZLfS1NxGMb7f6Kb6A8Iu4lALKgughA0TYVl - 2RLpByzmGOPsB2PGyrlS5zZzi6k1kSUS5o62ipitki62iOZd8zgzKqlPvYc6rM4KhB54787zeZ7vw9n1 - X6VtVMnmnjAynsTpHcDh8RMei7OgLrOuafz8rL7evisTTaRITKcpvFylWt3Ub6Xw4gcwwdBwhGLpTX2I - JIt5/mGWP/V5+xva1lfGJ2cJhoZ4X6mYIVJbkmt10RvXT8zlyjav176gBMJk5ubMAKkotWsl5guuUcP8 - rPiJyJSK4vWaAQ5PQH/vL2OfO8o5xy06LgdpPu/jWJeTxVcfmVbX6OjqNAPsis8ASKrlaojWvgAnuhWO - tNs51HyF+/ktkgtlLGe7zYBwJEb+ecEYTGpLamOLTU8Wc/rpB67FHqC4FTNgcfkRI7Hbvw0mqQdPXjLM - cr02D6nUhBmgaRsM3hwmnpoxBqtNluv3j9FwvIeJGxYzQFQslRi4PojLH2J0MqsPJm+W2r02N/uPnsFv - a2J91cn8lK8+RH6S2UwGl6LQ1nmalrZW7P12kncSpGfu0bBvD2pwtw75a5N/Kb+Sp+lwowGJBk7tHJJ7 - nNMhdz17sbYf2DlAJHtZrT0sLal8B8x71HTDfCJyAAAAAElFTkSuQmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAACiSURBVDhPYxgFmKB389//XRt+/c+e/PATNj5BAFJ89eGf - /7qhq/5j4xMEbWu//b/19Pd/Vb9FYA3ofIKgccXn/5cf/v4v5zYLrAGdTxDULn7//8T13//F7CaBNaDz - CYKKea/+777w8z+/WTdYAzqfICiZ/fz/+pM//3MatII1oPMJgoLpj/8v2PP5P6tOI1gDOp8gAMU3m24T - XAM6f9gBBgYAkeCWT284Yq8AAAAASUVORK5CYII= - - - - - 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 - - - - 941, 56 - - - 17, 95 - - - 354, 95 - - - 510, 95 - - - 647, 95 - - - 167, 56 - - - 1095, 56 - - - 437, 17 - - - 171, 95 - - - 17, 56 - - - - AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w - LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 - ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAD2 - CAAAAk1TRnQBSQFMAgEBAgEAAbgBJwG4AScBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo - AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA - AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 - AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA - AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm - AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM - AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA - ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz - AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ - AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM - AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA - AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA - AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ - AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/ - AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA - AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm - ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ - Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz - AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA - AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM - AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM - ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM - Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA - AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM - AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ - AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz - AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm - AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw - AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/xEAEHUwABB1MAAQdSQA - AewB9AQAAewB9AQABHUB7AV1AewFdSQAAewBDwHyAwAB7AEPAfIDAAR1AewBDwR1AewBDwR1JAAB7AFJ - AQ8B8gIAAewBSQEPAfICAAR1AewBSQEPA3UB7AFJAQ8DdSAAAewBEQFDARUBFAFyAUkBDwEHAesBFAFy - AUkBDwHyAQAB7AERAUMBFQEUAXIBSQEPAQcB6wEUAXIBSQEPAnUgAAHtAQgBeARyAUkBDwRyAUkBDwHy - Ae0BCAF4BHIBSQEPBHIBSQEPAXUgAAGSAQgDmAJ4AnIBbQGYAngCcgFtAZIBCAOYAngCcgFtAZgCeAJy - AW0gAAEcAcIECAJ4AewBmQIIAngB7AHzARwBwgQIAngB7AGZAggCeAHsAXUgAAGYARwBkgHtAewBCAGY - AewB8AHvAewBCAGYAewB8wEAAZgBHAGSAe0B7AEIAZgB7AHwAe8B7AEIAZgB7AJ1JAAB7QEIAewB8wIA - Ae0BCAHsAfMCAAR1Ae0BCAHsA3UB7QEIAewDdSQAAZIB7AHzAwABkgHsAfMDAAR1AZIB7AR1AZIB7AR1 - JAABHAH0BAABHAH0BAAEdQEcBXUBHAV1MAAQdTAAEHUgAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEB - AQABAQUAAYAXAAP/AQAC/wYAAv8GAAL/BgAB8wHPBgAB8QHHBgAB8AHDBwABAR8AAQEGAAHwAcMGAAHx - AccGAAHzAc8GAAL/BgAC/wYACw== - - - - 783, 95 - - - 916, 95 - - - 115 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 934, 17 + + + 217, 17 + + + + + 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 + RK5CYII= + + + + + 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 + l+svNTWhA+4N0kEAAAAASUVORK5CYII= + + + + + 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 + GD8DWVnn/SrmSbcAAAAASUVORK5CYII= + + + + + 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 + TQ5yKU5N+xNUiLSfSZ3YnAAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAASfSURBVFhH7ZVLTGNVHMY7PqLRnSsTY8yEhXFjXEx0Y8SN + MRNgoKVAX/QFLbRAeZe2tL1QoOUxgBQGihSKwHR4l7Y8ypsZnsNjoBAeA6MTZ+IYjC5cGqOf5+IdYzIb + GVoXxl/y5d5zztdzvn/PzTms//lP0rsSbfEExRje5qN7Lf4B0/3vMRxMxc6pG0c/eeDb06B3U4Cbd2Kb + mOHw0rche+jfLcDhj8NYeVyH/dMh3H3Ugv51JbrucsHYwoPLFfnq4EY6qb4bq9/dwMw3Zkw9MGHxkR2b + 33fBuRDuAMuSX0eDFLZP+zBxUoqJYxPGjg1Y+LoBgcNyOOeTwhdgcKv4HfeSDGtPXJh7WA//CQX/kRH+ + Ywpz39rRPi9G2yRXz9hDT+eiinz1Biw/dsJ7bIb3vhmeAwMCx5Xou6dD8zQ/fNU7l+RXOhbSSeXN8N+v + xPChEQP7xRg6IEGObLgREKF6ip3A2ENP86wc/ZsUxk/qMHBgRP+eEbf29CQAhY5lDRpIAMYaehyzKk7z + mBK+oxr07lNw7xWjZ1cPd9CA7l0d6nwiWEdEHzH20FM7KkXHmo4sXoKuHQNcQT06yZ537mjRMJWKmmHe + 81dvHeL6bL6EKqb5DBV+ifa6V04WK0bHtg7tZGHnVhGcm4Vo3cyH1cNHh0f1NmM/H9oe9s/WAQloWXqF + YIH1AjP0F9ZBCRoXctG2WYSWdS0cG/nkWQAHUbUnBZYm3i+M9Xzo2rh9JjcfjqAZDlKddVAGi1uAMi/3 + MmNh2QbFLeX9UjRu5aFxnWgtD/aVHNhXc3F9UYOSXgHyd95/nbH/c/I6Y/jads7ZJLXLWahZzDhT6ZAU + 5q8EoG4lCWifuUeEqrkMfLGSi9qlHNQt0f5s1K5mg7opgq7tOW9BTQsHlE+OijklymfTUTGvgm1ejarb + maD8ChS6BNA5EoeNXSLUrGSjkgStWsiEjaj6jgaWaTV0nRf48NSN12CcToV5RgnztALUVBpKZpUoJWHK + 59QoGSchnEKY/KmoWFDDMqeChYQsI2NlpJ3v5CGnKS7ATHd+FFVR91R2NopGxDBMpMAwKUdxQAFDQAkj + HWqGBKI1rYKJFglomkon7TTovSnIakq8+KEjrok2KutjkdcnQNG4DNoJOQrHU8h7KrTkqSeBdJOp0AX+ + lH6SBJxRQGVPgMoWX89MczEkVdFx8upYpLmSkOeTINsnRe6oDDl+6Zny/HLk+lPOVDCWgsweIWT18aE9 + chUNcRGRtsjfpE1sZHrFyCTbkuGREJEnaWeRdhYJpxmTQGaNBZ+KVjM/DR2tytaXeVTMD0JbDNL6hUgf + EUE5JCRKJhJBRcLIvkyE0BoXvguHhmv6/HZSaRQkPTzISRBpPx+yAQHkA3wkllwDrzTmM8YaNi4l24Rm + jinqd35bAkRDSUgmF01CXRzYxmi6+leInjmuQ8UlopeI3vhU/rE6Vh8Ntj0Wid0cxBRdxZWr78aTsTcZ + D+0NOU8D0It8EvFhRJnEKQG7jIN4Kv4J3ceMhS0ADf33vkb0FtF7RB8wot/pPnosbFvwFLq6F4no/f67 + 6L6wVR5GWKw/AKiF4yhMyBvPAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALmSURBVFhHtZfPaxNBFMdHs7/GpPtzehS86sGzB7178e7B + P8CLdw9CjlaxIig0YAtaiq3WNglFUCwGT6VUQaEtpRXT7GYFD+KlIvij63thErazr2CT7Be+p3lv3ydv + 9s1O2GHasPwk5iLjluZekCGk6oaTUC4zpsmQ/9Mb0yUB2mawIENIUcXRRwZYAoAdK8gArHPxp2k6p2RY + RlRx9JEByoazv2zQXYh4MC7DMqKKo/sCmNXspEV0ITbF93XGSjL0gKji6L4AqrqdNAwvCwAOzdFrMvSA + qOLovgAwcapgkwCx5W3DQ4/L8J7Uwl33DTAJ27Bm0iPZNtxLMrwntXDXfQM8hW2Y1hwSILTEsgzvSS3c + dd8A6NuFkWSTOJjKXOxHuntWpnSULpr2QAAT2kiyqNNdiKxgUqZ0lC6a9kAA0/Ae3IEufKZGkjs/t1lp + VKblA4DjOAYArw45mNqWuCHT2DzEpgt3PRAA+h4A3AdDwV8qQKw7X+BgMjDvEXQrndf1wAA4jtiFiPuz + GQBwZLlXMO8BxKTzuh4YAMexA6D550gAU7zDvFsQs0hsw8AAaBxHXIuNYIWCaGneeYTEl1bNHQoAjiOu + hbq4TAHAXeE5AmCcmjsUAPxluNaAh8U8CFUAvCvgO4CdwslJ5w4FAB8ql1lkeddVAPRrGFXswkweAGi5 + zEJm+1u89EMF2IXDCg+tirINQwdAxZaoqADomu4m4wCRzssFoGn4p/GDpAJsQRdwHJ+ktiEXAFTbCl6q + AOgZ+IQ/TG1DbgDhCe8iBfAeLjF3U9uQGwDoWMTFJgVRgbGdk9uQJwBr8+AqBfAWLrT4DcG8XAE+MFaE + q/o3FSCEl3FCbkOuAKg2F2MqAPoFjOQz2Ib8AZh3ssnFbxXgE3ThMWxD7gAo+Ms2pwKga3CfPDLAglHc + qxeKzbrurNZ0e6lq2FNV3bkpl0ntGv6ZVcNZWYM/LR917+sGL+7tQFcaXPylARj7BzrmrMNw48QGAAAA + AElFTkSuQmCC + + + + + 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 + TgDQASA1MVpwzwAAAABJRU5ErkJggg== + + + + 322, 17 + + + 459, 56 + + + 673, 17 + + + 1050, 17 + + + 372, 56 + + + 813, 17 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAJoBbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1u + ZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIG1zY29ybGliLCBWZXJzaW9u + PTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQUB + AAAAMFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLkRvdWJsZQMAAAAGX2l0 + ZW1zBV9zaXplCF92ZXJzaW9uBwAABggIAgAAAAkDAAAAAAAAAAAAAAAPAwAAAAAAAAAGCw== + + + + 650, 56 + + + 650, 56 + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHISURBVDhPrZDfS1NhGMf7f6Sb8A8IuwvEguqiGyF/lEFZ + usbUgsUcYxynzGNNPLN0c26xyXRpiIHo5o6xFmGtcl2IN9oQXEs3qSQ/9R5MZeckCH3guXu+n+f7vqf+ + K8XSDslUmuFQBEd3H3aXm8GRIHH1FdvFIvtrxuQ2NgiEo4RjU2Q+LrO1ta3Nu8yHP8Iw3iE/X3I5Y4lY + FOHZRJJyfuzuUSj9IjQ+jUfxatL92CGitrhczt/wWn6Xz+s/keRB4omEXiAqitpHKQ+/XfmOf0KlX1H0 + ArtL1qoJ2ruDWLoC3LU/5cZ9D7WtPVy+6WDh0w4xdZ22jna9wCb1HAjuOX3ceqhQZ5G52ixxsdHG+doH + vFwqEYmvYW6z6AVeX4Cl9xnD2uKyCE+9KfJodI5euVcvmE+qDI8+OzYsxmx1MTkZ1QsKhW8MPBkiGH3x + z3Cne4SqKy1ElDt6gWBldZW+/gGcbgXfeFL7MPFmUdts7eLspdu4rTV8XXYQ83cYSzbzeaZnZnBKEg1N + 17nWUIet00ZkLKxNVeVpVE+FJgk9bjKWHEc6nabmQvWBJCDXn1ySep3SJM9dZzA1nju5QJDNZjGZWlhc + VPkN8D3f8pYPr2wAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHbSURBVDhPrZLfS1NxGMb7f6Kb6A8Iu4lALKgughA0TYVl + 2RLpByzmGOPsB2PGyrlS5zZzi6k1kSUS5o62ipitki62iOZd8zgzKqlPvYc6rM4KhB54787zeZ7vw9n1 + X6VtVMnmnjAynsTpHcDh8RMei7OgLrOuafz8rL7evisTTaRITKcpvFylWt3Ub6Xw4gcwwdBwhGLpTX2I + JIt5/mGWP/V5+xva1lfGJ2cJhoZ4X6mYIVJbkmt10RvXT8zlyjav176gBMJk5ubMAKkotWsl5guuUcP8 + rPiJyJSK4vWaAQ5PQH/vL2OfO8o5xy06LgdpPu/jWJeTxVcfmVbX6OjqNAPsis8ASKrlaojWvgAnuhWO + tNs51HyF+/ktkgtlLGe7zYBwJEb+ecEYTGpLamOLTU8Wc/rpB67FHqC4FTNgcfkRI7Hbvw0mqQdPXjLM + cr02D6nUhBmgaRsM3hwmnpoxBqtNluv3j9FwvIeJGxYzQFQslRi4PojLH2J0MqsPJm+W2r02N/uPnsFv + a2J91cn8lK8+RH6S2UwGl6LQ1nmalrZW7P12kncSpGfu0bBvD2pwtw75a5N/Kb+Sp+lwowGJBk7tHJJ7 + nNMhdz17sbYf2DlAJHtZrT0sLal8B8x71HTDfCJyAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAACiSURBVDhPYxgFmKB389//XRt+/c+e/PATNj5BAFJ89eGf + /7qhq/5j4xMEbWu//b/19Pd/Vb9FYA3ofIKgccXn/5cf/v4v5zYLrAGdTxDULn7//8T13//F7CaBNaDz + CYKKea/+777w8z+/WTdYAzqfICiZ/fz/+pM//3MatII1oPMJgoLpj/8v2PP5P6tOI1gDOp8gAMU3m24T + XAM6f9gBBgYAkeCWT284Yq8AAAAASUVORK5CYII= + + + + + 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 + + + + 941, 56 + + + 17, 95 + + + 354, 95 + + + 510, 95 + + + 647, 95 + + + 167, 56 + + + 1095, 56 + + + 437, 17 + + + 171, 95 + + + 17, 56 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAD2 + CAAAAk1TRnQBSQFMAgEBAgEAAbgBJwG4AScBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA + AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 + AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA + AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm + AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM + AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA + ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz + AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ + AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM + AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA + AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA + AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ + AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/ + AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA + AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm + ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ + Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz + AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA + AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM + AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM + ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM + Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA + AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM + AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ + AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz + AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm + AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw + AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/xEAEHUwABB1MAAQdSQA + AewB9AQAAewB9AQABHUB7AV1AewFdSQAAewBDwHyAwAB7AEPAfIDAAR1AewBDwR1AewBDwR1JAAB7AFJ + AQ8B8gIAAewBSQEPAfICAAR1AewBSQEPA3UB7AFJAQ8DdSAAAewBEQFDARUBFAFyAUkBDwEHAesBFAFy + AUkBDwHyAQAB7AERAUMBFQEUAXIBSQEPAQcB6wEUAXIBSQEPAnUgAAHtAQgBeARyAUkBDwRyAUkBDwHy + Ae0BCAF4BHIBSQEPBHIBSQEPAXUgAAGSAQgDmAJ4AnIBbQGYAngCcgFtAZIBCAOYAngCcgFtAZgCeAJy + AW0gAAEcAcIECAJ4AewBmQIIAngB7AHzARwBwgQIAngB7AGZAggCeAHsAXUgAAGYARwBkgHtAewBCAGY + AewB8AHvAewBCAGYAewB8wEAAZgBHAGSAe0B7AEIAZgB7AHwAe8B7AEIAZgB7AJ1JAAB7QEIAewB8wIA + Ae0BCAHsAfMCAAR1Ae0BCAHsA3UB7QEIAewDdSQAAZIB7AHzAwABkgHsAfMDAAR1AZIB7AR1AZIB7AR1 + JAABHAH0BAABHAH0BAAEdQEcBXUBHAV1MAAQdTAAEHUgAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEB + AQABAQUAAYAXAAP/AQAC/wYAAv8GAAL/BgAB8wHPBgAB8QHHBgAB8AHDBwABAR8AAQEGAAHwAcMGAAHx + AccGAAHzAc8GAAL/BgAC/wYACw== + + + + 783, 95 + + + 916, 95 + + + 115 + \ No newline at end of file diff --git a/src/Forms/MatroskaSubtitleChooser.Designer.cs b/src/ui/Forms/MatroskaSubtitleChooser.Designer.cs similarity index 98% rename from src/Forms/MatroskaSubtitleChooser.Designer.cs rename to src/ui/Forms/MatroskaSubtitleChooser.Designer.cs index 2b8548acb..1d4ad68b3 100644 --- a/src/Forms/MatroskaSubtitleChooser.Designer.cs +++ b/src/ui/Forms/MatroskaSubtitleChooser.Designer.cs @@ -1,182 +1,182 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class MatroskaSubtitleChooser - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.listBox1 = new System.Windows.Forms.ListBox(); - this.labelChoose = new System.Windows.Forms.Label(); - this.listView1 = new System.Windows.Forms.ListView(); - this.columnHeaderTrack = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderLanguage = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderCodec = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderDefault = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderForced = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.SuspendLayout(); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.BackColor = System.Drawing.SystemColors.Control; - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.Location = new System.Drawing.Point(491, 302); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 46; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = false; - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.Location = new System.Drawing.Point(410, 302); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 45; - this.buttonOK.Text = "OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); - // - // listBox1 - // - this.listBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.listBox1.FormattingEnabled = true; - this.listBox1.Location = new System.Drawing.Point(12, 43); - this.listBox1.Name = "listBox1"; - this.listBox1.Size = new System.Drawing.Size(554, 251); - this.listBox1.TabIndex = 47; - this.listBox1.SelectedIndexChanged += new System.EventHandler(this.listBox1_SelectedIndexChanged); - this.listBox1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.listBox1_KeyDown); - this.listBox1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.listBox1_MouseDoubleClick); - // - // labelChoose - // - this.labelChoose.AutoSize = true; - this.labelChoose.Location = new System.Drawing.Point(9, 20); - this.labelChoose.Name = "labelChoose"; - this.labelChoose.Size = new System.Drawing.Size(224, 13); - this.labelChoose.TabIndex = 48; - this.labelChoose.Text = "More than one subtitle found - please choose"; - // - // listView1 - // - this.listView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeaderTrack, - this.columnHeaderName, - this.columnHeaderLanguage, - this.columnHeaderCodec, - this.columnHeaderDefault, - this.columnHeaderForced}); - this.listView1.FullRowSelect = true; - this.listView1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; - this.listView1.HideSelection = false; - this.listView1.Location = new System.Drawing.Point(13, 43); - this.listView1.MultiSelect = false; - this.listView1.Name = "listView1"; - this.listView1.Size = new System.Drawing.Size(553, 253); - this.listView1.TabIndex = 49; - this.listView1.UseCompatibleStateImageBehavior = false; - this.listView1.View = System.Windows.Forms.View.Details; - this.listView1.SelectedIndexChanged += new System.EventHandler(this.listView1_SelectedIndexChanged); - this.listView1.DoubleClick += new System.EventHandler(this.listView1_DoubleClick); - this.listView1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.listView1_KeyDown); - // - // columnHeaderTrack - // - this.columnHeaderTrack.Text = "Track#"; - // - // columnHeaderName - // - this.columnHeaderName.Text = "Name"; - this.columnHeaderName.Width = 180; - // - // columnHeaderLanguage - // - this.columnHeaderLanguage.Text = "Language"; - // - // columnHeaderCodec - // - this.columnHeaderCodec.Text = "Codec"; - this.columnHeaderCodec.Width = 100; - // - // columnHeaderDefault - // - this.columnHeaderDefault.Text = "Default"; - // - // columnHeaderForced - // - this.columnHeaderForced.Text = "Forced"; - // - // MatroskaSubtitleChooser - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(579, 329); - this.Controls.Add(this.labelChoose); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.listBox1); - this.Controls.Add(this.listView1); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(400, 250); - this.Name = "MatroskaSubtitleChooser"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Choose subtitle from Matroska file"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormMatroskaSubtitleChooser_KeyDown); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.ListBox listBox1; - private System.Windows.Forms.Label labelChoose; - private System.Windows.Forms.ListView listView1; - private System.Windows.Forms.ColumnHeader columnHeaderTrack; - private System.Windows.Forms.ColumnHeader columnHeaderName; - private System.Windows.Forms.ColumnHeader columnHeaderLanguage; - private System.Windows.Forms.ColumnHeader columnHeaderCodec; - private System.Windows.Forms.ColumnHeader columnHeaderDefault; - private System.Windows.Forms.ColumnHeader columnHeaderForced; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class MatroskaSubtitleChooser + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.listBox1 = new System.Windows.Forms.ListBox(); + this.labelChoose = new System.Windows.Forms.Label(); + this.listView1 = new System.Windows.Forms.ListView(); + this.columnHeaderTrack = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderLanguage = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderCodec = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderDefault = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderForced = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.SuspendLayout(); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.BackColor = System.Drawing.SystemColors.Control; + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.Location = new System.Drawing.Point(491, 302); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 46; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = false; + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.Location = new System.Drawing.Point(410, 302); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 45; + this.buttonOK.Text = "OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); + // + // listBox1 + // + this.listBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listBox1.FormattingEnabled = true; + this.listBox1.Location = new System.Drawing.Point(12, 43); + this.listBox1.Name = "listBox1"; + this.listBox1.Size = new System.Drawing.Size(554, 251); + this.listBox1.TabIndex = 47; + this.listBox1.SelectedIndexChanged += new System.EventHandler(this.listBox1_SelectedIndexChanged); + this.listBox1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.listBox1_KeyDown); + this.listBox1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.listBox1_MouseDoubleClick); + // + // labelChoose + // + this.labelChoose.AutoSize = true; + this.labelChoose.Location = new System.Drawing.Point(9, 20); + this.labelChoose.Name = "labelChoose"; + this.labelChoose.Size = new System.Drawing.Size(224, 13); + this.labelChoose.TabIndex = 48; + this.labelChoose.Text = "More than one subtitle found - please choose"; + // + // listView1 + // + this.listView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeaderTrack, + this.columnHeaderName, + this.columnHeaderLanguage, + this.columnHeaderCodec, + this.columnHeaderDefault, + this.columnHeaderForced}); + this.listView1.FullRowSelect = true; + this.listView1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.listView1.HideSelection = false; + this.listView1.Location = new System.Drawing.Point(13, 43); + this.listView1.MultiSelect = false; + this.listView1.Name = "listView1"; + this.listView1.Size = new System.Drawing.Size(553, 253); + this.listView1.TabIndex = 49; + this.listView1.UseCompatibleStateImageBehavior = false; + this.listView1.View = System.Windows.Forms.View.Details; + this.listView1.SelectedIndexChanged += new System.EventHandler(this.listView1_SelectedIndexChanged); + this.listView1.DoubleClick += new System.EventHandler(this.listView1_DoubleClick); + this.listView1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.listView1_KeyDown); + // + // columnHeaderTrack + // + this.columnHeaderTrack.Text = "Track#"; + // + // columnHeaderName + // + this.columnHeaderName.Text = "Name"; + this.columnHeaderName.Width = 180; + // + // columnHeaderLanguage + // + this.columnHeaderLanguage.Text = "Language"; + // + // columnHeaderCodec + // + this.columnHeaderCodec.Text = "Codec"; + this.columnHeaderCodec.Width = 100; + // + // columnHeaderDefault + // + this.columnHeaderDefault.Text = "Default"; + // + // columnHeaderForced + // + this.columnHeaderForced.Text = "Forced"; + // + // MatroskaSubtitleChooser + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(579, 329); + this.Controls.Add(this.labelChoose); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.listBox1); + this.Controls.Add(this.listView1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(400, 250); + this.Name = "MatroskaSubtitleChooser"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Choose subtitle from Matroska file"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormMatroskaSubtitleChooser_KeyDown); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.ListBox listBox1; + private System.Windows.Forms.Label labelChoose; + private System.Windows.Forms.ListView listView1; + private System.Windows.Forms.ColumnHeader columnHeaderTrack; + private System.Windows.Forms.ColumnHeader columnHeaderName; + private System.Windows.Forms.ColumnHeader columnHeaderLanguage; + private System.Windows.Forms.ColumnHeader columnHeaderCodec; + private System.Windows.Forms.ColumnHeader columnHeaderDefault; + private System.Windows.Forms.ColumnHeader columnHeaderForced; + } } \ No newline at end of file diff --git a/src/Forms/MatroskaSubtitleChooser.cs b/src/ui/Forms/MatroskaSubtitleChooser.cs similarity index 97% rename from src/Forms/MatroskaSubtitleChooser.cs rename to src/ui/Forms/MatroskaSubtitleChooser.cs index 2ffa511f3..4d5a69f10 100644 --- a/src/Forms/MatroskaSubtitleChooser.cs +++ b/src/ui/Forms/MatroskaSubtitleChooser.cs @@ -1,126 +1,126 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.ContainerFormats.Matroska; -using Nikse.SubtitleEdit.Core.ContainerFormats.Mp4.Boxes; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class MatroskaSubtitleChooser : Form - { - public MatroskaSubtitleChooser(string fileType) - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - Text = fileType.Equals("mp4", StringComparison.Ordinal) ? Configuration.Settings.Language.MatroskaSubtitleChooser.TitleMp4 : Configuration.Settings.Language.MatroskaSubtitleChooser.Title; - labelChoose.Text = Configuration.Settings.Language.MatroskaSubtitleChooser.PleaseChoose; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - UiUtil.FixLargeFonts(this, buttonOK); - } - - public int SelectedIndex { get; private set; } - - internal void Initialize(List subtitleInfoList) - { - listBox1.Visible = false; - listView1.Visible = true; - var format = Configuration.Settings.Language.MatroskaSubtitleChooser.TrackXLanguageYTypeZ; - foreach (var info in subtitleInfoList) - { - AddListViewItem(info); - } - listView1.Items[0].Selected = true; - listView1.FocusedItem = listView1.Items[0]; - } - - private void AddListViewItem(MatroskaTrackInfo info) - { - var item = new ListViewItem(info.TrackNumber.ToString()); - item.SubItems.Add(info.Name); - item.SubItems.Add(info.Language); - item.SubItems.Add(info.CodecId); - item.SubItems.Add(info.IsDefault.ToString(CultureInfo.InvariantCulture)); - item.SubItems.Add(info.IsForced.ToString(CultureInfo.InvariantCulture)); - listView1.Items.Add(item); - } - - internal void Initialize(List mp4SubtitleTracks) - { - listBox1.Visible = true; - listView1.Visible = false; - int i = 0; - foreach (var track in mp4SubtitleTracks) - { - i++; - string handler = (track.Mdia.HandlerType + " " + track.Mdia.HandlerName).Trim(); - if (handler.Length > 1) - { - handler = " - " + handler; - } - - string s = $"{i}: {track.Mdia.Mdhd.Iso639ThreeLetterCode} - {track.Mdia.Mdhd.LanguageString}{handler}"; - listBox1.Items.Add(s); - } - listBox1.SelectedIndex = 0; - } - - private void FormMatroskaSubtitleChooser_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - private void ButtonOkClick(object sender, EventArgs e) - { - DialogResult = DialogResult.OK; - } - - private void listBox1_MouseDoubleClick(object sender, MouseEventArgs e) - { - DialogResult = DialogResult.OK; - } - - private void listView1_SelectedIndexChanged(object sender, EventArgs e) - { - if (listView1.SelectedItems.Count > 0) - { - SelectedIndex = listView1.SelectedItems[0].Index; - } - } - - private void listBox1_SelectedIndexChanged(object sender, EventArgs e) - { - SelectedIndex = listBox1.SelectedIndex; - } - - private void listView1_DoubleClick(object sender, EventArgs e) - { - DialogResult = DialogResult.OK; - } - - private void listView1_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Enter) - { - DialogResult = DialogResult.OK; - } - } - - private void listBox1_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Enter) - { - DialogResult = DialogResult.OK; - } - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.ContainerFormats.Matroska; +using Nikse.SubtitleEdit.Core.ContainerFormats.Mp4.Boxes; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class MatroskaSubtitleChooser : Form + { + public MatroskaSubtitleChooser(string fileType) + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + Text = fileType.Equals("mp4", StringComparison.Ordinal) ? Configuration.Settings.Language.MatroskaSubtitleChooser.TitleMp4 : Configuration.Settings.Language.MatroskaSubtitleChooser.Title; + labelChoose.Text = Configuration.Settings.Language.MatroskaSubtitleChooser.PleaseChoose; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + UiUtil.FixLargeFonts(this, buttonOK); + } + + public int SelectedIndex { get; private set; } + + internal void Initialize(List subtitleInfoList) + { + listBox1.Visible = false; + listView1.Visible = true; + var format = Configuration.Settings.Language.MatroskaSubtitleChooser.TrackXLanguageYTypeZ; + foreach (var info in subtitleInfoList) + { + AddListViewItem(info); + } + listView1.Items[0].Selected = true; + listView1.FocusedItem = listView1.Items[0]; + } + + private void AddListViewItem(MatroskaTrackInfo info) + { + var item = new ListViewItem(info.TrackNumber.ToString()); + item.SubItems.Add(info.Name); + item.SubItems.Add(info.Language); + item.SubItems.Add(info.CodecId); + item.SubItems.Add(info.IsDefault.ToString(CultureInfo.InvariantCulture)); + item.SubItems.Add(info.IsForced.ToString(CultureInfo.InvariantCulture)); + listView1.Items.Add(item); + } + + internal void Initialize(List mp4SubtitleTracks) + { + listBox1.Visible = true; + listView1.Visible = false; + int i = 0; + foreach (var track in mp4SubtitleTracks) + { + i++; + string handler = (track.Mdia.HandlerType + " " + track.Mdia.HandlerName).Trim(); + if (handler.Length > 1) + { + handler = " - " + handler; + } + + string s = $"{i}: {track.Mdia.Mdhd.Iso639ThreeLetterCode} - {track.Mdia.Mdhd.LanguageString}{handler}"; + listBox1.Items.Add(s); + } + listBox1.SelectedIndex = 0; + } + + private void FormMatroskaSubtitleChooser_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + private void ButtonOkClick(object sender, EventArgs e) + { + DialogResult = DialogResult.OK; + } + + private void listBox1_MouseDoubleClick(object sender, MouseEventArgs e) + { + DialogResult = DialogResult.OK; + } + + private void listView1_SelectedIndexChanged(object sender, EventArgs e) + { + if (listView1.SelectedItems.Count > 0) + { + SelectedIndex = listView1.SelectedItems[0].Index; + } + } + + private void listBox1_SelectedIndexChanged(object sender, EventArgs e) + { + SelectedIndex = listBox1.SelectedIndex; + } + + private void listView1_DoubleClick(object sender, EventArgs e) + { + DialogResult = DialogResult.OK; + } + + private void listView1_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + DialogResult = DialogResult.OK; + } + } + + private void listBox1_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + DialogResult = DialogResult.OK; + } + } + } +} diff --git a/src/Forms/MatroskaSubtitleChooser.resx b/src/ui/Forms/MatroskaSubtitleChooser.resx similarity index 97% rename from src/Forms/MatroskaSubtitleChooser.resx rename to src/ui/Forms/MatroskaSubtitleChooser.resx index c7e0d4bdf..d58980a38 100644 --- a/src/Forms/MatroskaSubtitleChooser.resx +++ b/src/ui/Forms/MatroskaSubtitleChooser.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Forms/MeasurementConverter.Designer.cs b/src/ui/Forms/MeasurementConverter.Designer.cs similarity index 98% rename from src/Forms/MeasurementConverter.Designer.cs rename to src/ui/Forms/MeasurementConverter.Designer.cs index 68dbd8fab..c38a23a7d 100644 --- a/src/Forms/MeasurementConverter.Designer.cs +++ b/src/ui/Forms/MeasurementConverter.Designer.cs @@ -1,205 +1,205 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class MeasurementConverter - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.listBoxCategory = new System.Windows.Forms.ListBox(); - this.labelConvertFrom = new System.Windows.Forms.Label(); - this.comboBoxFrom = new System.Windows.Forms.ComboBox(); - this.textBoxInput = new System.Windows.Forms.TextBox(); - this.labelConvertTo = new System.Windows.Forms.Label(); - this.comboBoxTo = new System.Windows.Forms.ComboBox(); - this.textBoxResult = new System.Windows.Forms.TextBox(); - this.linkLabel1 = new System.Windows.Forms.LinkLabel(); - this.checkBoxCloseOnInsert = new System.Windows.Forms.CheckBox(); - this.buttonInsert = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.SuspendLayout(); - // - // listBoxCategory - // - this.listBoxCategory.FormattingEnabled = true; - this.listBoxCategory.ItemHeight = 16; - this.listBoxCategory.Location = new System.Drawing.Point(10, 10); - this.listBoxCategory.Name = "listBoxCategory"; - this.listBoxCategory.Size = new System.Drawing.Size(106, 170); - this.listBoxCategory.TabIndex = 0; - this.listBoxCategory.SelectedIndexChanged += new System.EventHandler(this.listBoxCategory_SelectedIndexChanged); - this.listBoxCategory.LostFocus += new System.EventHandler(this.listBoxCategory_LostFocus); - // - // labelConvertFrom - // - this.labelConvertFrom.AutoSize = true; - this.labelConvertFrom.Location = new System.Drawing.Point(124, 32); - this.labelConvertFrom.Name = "labelConvertFrom"; - this.labelConvertFrom.Size = new System.Drawing.Size(89, 17); - this.labelConvertFrom.TabIndex = 1; - this.labelConvertFrom.Text = "Convert from:"; - // - // comboBoxFrom - // - this.comboBoxFrom.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxFrom.FormattingEnabled = true; - this.comboBoxFrom.Location = new System.Drawing.Point(127, 54); - this.comboBoxFrom.Name = "comboBoxFrom"; - this.comboBoxFrom.Size = new System.Drawing.Size(132, 24); - this.comboBoxFrom.TabIndex = 2; - this.comboBoxFrom.SelectedIndexChanged += new System.EventHandler(this.comboBoxFrom_SelectedIndexChanged); - // - // textBoxInput - // - this.textBoxInput.Location = new System.Drawing.Point(127, 86); - this.textBoxInput.Name = "textBoxInput"; - this.textBoxInput.Size = new System.Drawing.Size(132, 22); - this.textBoxInput.TabIndex = 3; - this.textBoxInput.TextChanged += new System.EventHandler(this.textBoxInput_TextChanged); - this.textBoxInput.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.textBoxInput_KeyPress); - this.textBoxInput.KeyUp += new System.Windows.Forms.KeyEventHandler(this.textBoxInput_KeyUp); - // - // labelConvertTo - // - this.labelConvertTo.AutoSize = true; - this.labelConvertTo.Location = new System.Drawing.Point(264, 32); - this.labelConvertTo.Name = "labelConvertTo"; - this.labelConvertTo.Size = new System.Drawing.Size(56, 13); - this.labelConvertTo.TabIndex = 4; - this.labelConvertTo.Text = "Convert to:"; - // - // comboBoxTo - // - this.comboBoxTo.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxTo.FormattingEnabled = true; - this.comboBoxTo.Location = new System.Drawing.Point(267, 54); - this.comboBoxTo.Name = "comboBoxTo"; - this.comboBoxTo.Size = new System.Drawing.Size(132, 24); - this.comboBoxTo.TabIndex = 5; - this.comboBoxTo.SelectedIndexChanged += new System.EventHandler(this.comboBoxTo_SelectedIndexChanged); - // - // textBoxResult - // - this.textBoxResult.Location = new System.Drawing.Point(267, 86); - this.textBoxResult.Name = "textBoxResult"; - this.textBoxResult.ReadOnly = true; - this.textBoxResult.Size = new System.Drawing.Size(132, 22); - this.textBoxResult.TabIndex = 6; - // - // linkLabel1 - // - this.linkLabel1.Location = new System.Drawing.Point(218, 112); - this.linkLabel1.Name = "linkLabel1"; - this.linkLabel1.Size = new System.Drawing.Size(181, 23); - this.linkLabel1.TabIndex = 7; - this.linkLabel1.TabStop = true; - this.linkLabel1.Text = "Copy to clipboard"; - this.linkLabel1.TextAlign = System.Drawing.ContentAlignment.TopRight; - this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked); - // - // checkBoxCloseOnInsert - // - this.checkBoxCloseOnInsert.AutoSize = true; - this.checkBoxCloseOnInsert.Location = new System.Drawing.Point(127, 158); - this.checkBoxCloseOnInsert.Name = "checkBoxCloseOnInsert"; - this.checkBoxCloseOnInsert.Size = new System.Drawing.Size(83, 17); - this.checkBoxCloseOnInsert.TabIndex = 8; - this.checkBoxCloseOnInsert.Text = "Close on insert"; - this.checkBoxCloseOnInsert.UseVisualStyleBackColor = true; - // - // buttonInsert - // - this.buttonInsert.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonInsert.DialogResult = System.Windows.Forms.DialogResult.Yes; - this.buttonInsert.Location = new System.Drawing.Point(245, 155); - this.buttonInsert.Name = "buttonInsert"; - this.buttonInsert.Size = new System.Drawing.Size(75, 23); - this.buttonInsert.TabIndex = 9; - this.buttonInsert.Text = "&Insert"; - this.buttonInsert.UseVisualStyleBackColor = true; - this.buttonInsert.Click += new System.EventHandler(this.buttonInsert_Click); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(323, 155); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 10; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // MeasurementConverter - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(410, 190); - this.Controls.Add(this.listBoxCategory); - this.Controls.Add(this.labelConvertFrom); - this.Controls.Add(this.comboBoxFrom); - this.Controls.Add(this.textBoxInput); - this.Controls.Add(this.labelConvertTo); - this.Controls.Add(this.comboBoxTo); - this.Controls.Add(this.textBoxResult); - this.Controls.Add(this.linkLabel1); - this.Controls.Add(this.checkBoxCloseOnInsert); - this.Controls.Add(this.buttonInsert); - this.Controls.Add(this.buttonOK); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "MeasurementConverter"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Measurement converter"; - this.Activated += new System.EventHandler(this.MeasurementConverter_Activated); - this.Deactivate += new System.EventHandler(this.MeasurementConverter_Deactivate); - this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.MeasurementConverter_FormClosed); - this.Load += new System.EventHandler(this.MeasurementConverter_Load); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.MeasurementConverter_KeyDown); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.ListBox listBoxCategory; - private System.Windows.Forms.Label labelConvertFrom; - private System.Windows.Forms.ComboBox comboBoxFrom; - private System.Windows.Forms.TextBox textBoxInput; - private System.Windows.Forms.Label labelConvertTo; - private System.Windows.Forms.ComboBox comboBoxTo; - private System.Windows.Forms.TextBox textBoxResult; - private System.Windows.Forms.LinkLabel linkLabel1; - private System.Windows.Forms.CheckBox checkBoxCloseOnInsert; - private System.Windows.Forms.Button buttonInsert; - private System.Windows.Forms.Button buttonOK; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class MeasurementConverter + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.listBoxCategory = new System.Windows.Forms.ListBox(); + this.labelConvertFrom = new System.Windows.Forms.Label(); + this.comboBoxFrom = new System.Windows.Forms.ComboBox(); + this.textBoxInput = new System.Windows.Forms.TextBox(); + this.labelConvertTo = new System.Windows.Forms.Label(); + this.comboBoxTo = new System.Windows.Forms.ComboBox(); + this.textBoxResult = new System.Windows.Forms.TextBox(); + this.linkLabel1 = new System.Windows.Forms.LinkLabel(); + this.checkBoxCloseOnInsert = new System.Windows.Forms.CheckBox(); + this.buttonInsert = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // listBoxCategory + // + this.listBoxCategory.FormattingEnabled = true; + this.listBoxCategory.ItemHeight = 16; + this.listBoxCategory.Location = new System.Drawing.Point(10, 10); + this.listBoxCategory.Name = "listBoxCategory"; + this.listBoxCategory.Size = new System.Drawing.Size(106, 170); + this.listBoxCategory.TabIndex = 0; + this.listBoxCategory.SelectedIndexChanged += new System.EventHandler(this.listBoxCategory_SelectedIndexChanged); + this.listBoxCategory.LostFocus += new System.EventHandler(this.listBoxCategory_LostFocus); + // + // labelConvertFrom + // + this.labelConvertFrom.AutoSize = true; + this.labelConvertFrom.Location = new System.Drawing.Point(124, 32); + this.labelConvertFrom.Name = "labelConvertFrom"; + this.labelConvertFrom.Size = new System.Drawing.Size(89, 17); + this.labelConvertFrom.TabIndex = 1; + this.labelConvertFrom.Text = "Convert from:"; + // + // comboBoxFrom + // + this.comboBoxFrom.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxFrom.FormattingEnabled = true; + this.comboBoxFrom.Location = new System.Drawing.Point(127, 54); + this.comboBoxFrom.Name = "comboBoxFrom"; + this.comboBoxFrom.Size = new System.Drawing.Size(132, 24); + this.comboBoxFrom.TabIndex = 2; + this.comboBoxFrom.SelectedIndexChanged += new System.EventHandler(this.comboBoxFrom_SelectedIndexChanged); + // + // textBoxInput + // + this.textBoxInput.Location = new System.Drawing.Point(127, 86); + this.textBoxInput.Name = "textBoxInput"; + this.textBoxInput.Size = new System.Drawing.Size(132, 22); + this.textBoxInput.TabIndex = 3; + this.textBoxInput.TextChanged += new System.EventHandler(this.textBoxInput_TextChanged); + this.textBoxInput.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.textBoxInput_KeyPress); + this.textBoxInput.KeyUp += new System.Windows.Forms.KeyEventHandler(this.textBoxInput_KeyUp); + // + // labelConvertTo + // + this.labelConvertTo.AutoSize = true; + this.labelConvertTo.Location = new System.Drawing.Point(264, 32); + this.labelConvertTo.Name = "labelConvertTo"; + this.labelConvertTo.Size = new System.Drawing.Size(56, 13); + this.labelConvertTo.TabIndex = 4; + this.labelConvertTo.Text = "Convert to:"; + // + // comboBoxTo + // + this.comboBoxTo.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxTo.FormattingEnabled = true; + this.comboBoxTo.Location = new System.Drawing.Point(267, 54); + this.comboBoxTo.Name = "comboBoxTo"; + this.comboBoxTo.Size = new System.Drawing.Size(132, 24); + this.comboBoxTo.TabIndex = 5; + this.comboBoxTo.SelectedIndexChanged += new System.EventHandler(this.comboBoxTo_SelectedIndexChanged); + // + // textBoxResult + // + this.textBoxResult.Location = new System.Drawing.Point(267, 86); + this.textBoxResult.Name = "textBoxResult"; + this.textBoxResult.ReadOnly = true; + this.textBoxResult.Size = new System.Drawing.Size(132, 22); + this.textBoxResult.TabIndex = 6; + // + // linkLabel1 + // + this.linkLabel1.Location = new System.Drawing.Point(218, 112); + this.linkLabel1.Name = "linkLabel1"; + this.linkLabel1.Size = new System.Drawing.Size(181, 23); + this.linkLabel1.TabIndex = 7; + this.linkLabel1.TabStop = true; + this.linkLabel1.Text = "Copy to clipboard"; + this.linkLabel1.TextAlign = System.Drawing.ContentAlignment.TopRight; + this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked); + // + // checkBoxCloseOnInsert + // + this.checkBoxCloseOnInsert.AutoSize = true; + this.checkBoxCloseOnInsert.Location = new System.Drawing.Point(127, 158); + this.checkBoxCloseOnInsert.Name = "checkBoxCloseOnInsert"; + this.checkBoxCloseOnInsert.Size = new System.Drawing.Size(83, 17); + this.checkBoxCloseOnInsert.TabIndex = 8; + this.checkBoxCloseOnInsert.Text = "Close on insert"; + this.checkBoxCloseOnInsert.UseVisualStyleBackColor = true; + // + // buttonInsert + // + this.buttonInsert.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonInsert.DialogResult = System.Windows.Forms.DialogResult.Yes; + this.buttonInsert.Location = new System.Drawing.Point(245, 155); + this.buttonInsert.Name = "buttonInsert"; + this.buttonInsert.Size = new System.Drawing.Size(75, 23); + this.buttonInsert.TabIndex = 9; + this.buttonInsert.Text = "&Insert"; + this.buttonInsert.UseVisualStyleBackColor = true; + this.buttonInsert.Click += new System.EventHandler(this.buttonInsert_Click); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(323, 155); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 10; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // MeasurementConverter + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(410, 190); + this.Controls.Add(this.listBoxCategory); + this.Controls.Add(this.labelConvertFrom); + this.Controls.Add(this.comboBoxFrom); + this.Controls.Add(this.textBoxInput); + this.Controls.Add(this.labelConvertTo); + this.Controls.Add(this.comboBoxTo); + this.Controls.Add(this.textBoxResult); + this.Controls.Add(this.linkLabel1); + this.Controls.Add(this.checkBoxCloseOnInsert); + this.Controls.Add(this.buttonInsert); + this.Controls.Add(this.buttonOK); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "MeasurementConverter"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Measurement converter"; + this.Activated += new System.EventHandler(this.MeasurementConverter_Activated); + this.Deactivate += new System.EventHandler(this.MeasurementConverter_Deactivate); + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.MeasurementConverter_FormClosed); + this.Load += new System.EventHandler(this.MeasurementConverter_Load); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.MeasurementConverter_KeyDown); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ListBox listBoxCategory; + private System.Windows.Forms.Label labelConvertFrom; + private System.Windows.Forms.ComboBox comboBoxFrom; + private System.Windows.Forms.TextBox textBoxInput; + private System.Windows.Forms.Label labelConvertTo; + private System.Windows.Forms.ComboBox comboBoxTo; + private System.Windows.Forms.TextBox textBoxResult; + private System.Windows.Forms.LinkLabel linkLabel1; + private System.Windows.Forms.CheckBox checkBoxCloseOnInsert; + private System.Windows.Forms.Button buttonInsert; + private System.Windows.Forms.Button buttonOK; + } } \ No newline at end of file diff --git a/src/Forms/MeasurementConverter.cs b/src/ui/Forms/MeasurementConverter.cs similarity index 97% rename from src/Forms/MeasurementConverter.cs rename to src/ui/Forms/MeasurementConverter.cs index b004dbf5f..2ca7fd1ce 100644 --- a/src/Forms/MeasurementConverter.cs +++ b/src/ui/Forms/MeasurementConverter.cs @@ -1,4907 +1,4907 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class MeasurementConverter : Form - { - public class InsertEventArgs : EventArgs - { - public string Result { get; set; } - public bool IsOriginalActive { get; set; } - } - - public event EventHandler InsertClicked; - - public string Input { get; set; } - public bool IsOriginalActive { get; set; } - - private string Output { get; set; } - - private readonly Color _defaultBackColor; - - private readonly string[] _fields = Configuration.Settings.General.MeasurementConverterCategories.Split(';'); - - private readonly List _length = new List { Configuration.Settings.Language.MeasurementConverter.Kilometers, - Configuration.Settings.Language.MeasurementConverter.Meters, - Configuration.Settings.Language.MeasurementConverter.Centimeters, - Configuration.Settings.Language.MeasurementConverter.Millimeters, - Configuration.Settings.Language.MeasurementConverter.Micrometers, - Configuration.Settings.Language.MeasurementConverter.Nanometers, - Configuration.Settings.Language.MeasurementConverter.Angstroms, - Configuration.Settings.Language.MeasurementConverter.MilesTerrestial, - Configuration.Settings.Language.MeasurementConverter.MilesNautical, - Configuration.Settings.Language.MeasurementConverter.Yards, - Configuration.Settings.Language.MeasurementConverter.Feet, - Configuration.Settings.Language.MeasurementConverter.Inches, - Configuration.Settings.Language.MeasurementConverter.Chains, - Configuration.Settings.Language.MeasurementConverter.Fathoms, - Configuration.Settings.Language.MeasurementConverter.Hands, - Configuration.Settings.Language.MeasurementConverter.Rods, - Configuration.Settings.Language.MeasurementConverter.Spans }; - - private readonly List _mass = new List { Configuration.Settings.Language.MeasurementConverter.LongTonnes, - Configuration.Settings.Language.MeasurementConverter.ShortTonnes, - Configuration.Settings.Language.MeasurementConverter.Tonnes, - Configuration.Settings.Language.MeasurementConverter.Kilos, - Configuration.Settings.Language.MeasurementConverter.Grams, - Configuration.Settings.Language.MeasurementConverter.Milligrams, - Configuration.Settings.Language.MeasurementConverter.Micrograms, - Configuration.Settings.Language.MeasurementConverter.Pounds, - Configuration.Settings.Language.MeasurementConverter.Ounces, - Configuration.Settings.Language.MeasurementConverter.Carats, - Configuration.Settings.Language.MeasurementConverter.Drams, - Configuration.Settings.Language.MeasurementConverter.Grains, - Configuration.Settings.Language.MeasurementConverter.Stones }; - - private readonly List _volume = new List { Configuration.Settings.Language.MeasurementConverter.CubicKilometers, - Configuration.Settings.Language.MeasurementConverter.CubicMeters, - Configuration.Settings.Language.MeasurementConverter.Litres, - Configuration.Settings.Language.MeasurementConverter.CubicCentimeters, - Configuration.Settings.Language.MeasurementConverter.CubicMillimeters, - Configuration.Settings.Language.MeasurementConverter.CubicMiles, - Configuration.Settings.Language.MeasurementConverter.CubicYards, - Configuration.Settings.Language.MeasurementConverter.CubicFTs, - Configuration.Settings.Language.MeasurementConverter.CubicInches, - Configuration.Settings.Language.MeasurementConverter.OilBarrels, - Configuration.Settings.Language.MeasurementConverter.GallonUS, - Configuration.Settings.Language.MeasurementConverter.QuartsUS, - Configuration.Settings.Language.MeasurementConverter.PintsUS, - Configuration.Settings.Language.MeasurementConverter.FluidOuncesUS, - Configuration.Settings.Language.MeasurementConverter.Bushels, - Configuration.Settings.Language.MeasurementConverter.Pecks, - Configuration.Settings.Language.MeasurementConverter.GallonsUK, - Configuration.Settings.Language.MeasurementConverter.QuartsUK, - Configuration.Settings.Language.MeasurementConverter.PintsUK, - Configuration.Settings.Language.MeasurementConverter.FluidOuncesUK }; - - private readonly List _area = new List {Configuration.Settings.Language.MeasurementConverter.SquareKilometers, - Configuration.Settings.Language.MeasurementConverter.SquareMeters, - Configuration.Settings.Language.MeasurementConverter.SquareCentimeters, - Configuration.Settings.Language.MeasurementConverter.SquareMillimeters, - Configuration.Settings.Language.MeasurementConverter.SquareMiles, - Configuration.Settings.Language.MeasurementConverter.SquareYards, - Configuration.Settings.Language.MeasurementConverter.SquareFTs, - Configuration.Settings.Language.MeasurementConverter.SquareInches, - Configuration.Settings.Language.MeasurementConverter.Hectares, - Configuration.Settings.Language.MeasurementConverter.Acres, - Configuration.Settings.Language.MeasurementConverter.Ares }; - - private readonly List _time = new List { Configuration.Settings.Language.MeasurementConverter.Hours, - Configuration.Settings.Language.MeasurementConverter.Minutes, - Configuration.Settings.Language.MeasurementConverter.Seconds, - Configuration.Settings.Language.MeasurementConverter.Milliseconds, - Configuration.Settings.Language.MeasurementConverter.Microseconds }; - - private readonly List _temperature = new List { Configuration.Settings.Language.MeasurementConverter.Fahrenheit, - Configuration.Settings.Language.MeasurementConverter.Celsius, - Configuration.Settings.Language.MeasurementConverter.Kelvin }; - - private readonly List _velocity = new List { Configuration.Settings.Language.MeasurementConverter.KilometersPerHour, - Configuration.Settings.Language.MeasurementConverter.MetersPerSecond, - Configuration.Settings.Language.MeasurementConverter.MilesPerHour, - Configuration.Settings.Language.MeasurementConverter.YardsPerMinute, - Configuration.Settings.Language.MeasurementConverter.FTsPerSecond, - Configuration.Settings.Language.MeasurementConverter.Knots }; - - private readonly List _force = new List { Configuration.Settings.Language.MeasurementConverter.PoundsForce, - Configuration.Settings.Language.MeasurementConverter.Newtons, - Configuration.Settings.Language.MeasurementConverter.KilosForce }; - - private readonly List _energy = new List { Configuration.Settings.Language.MeasurementConverter.Jouls, - Configuration.Settings.Language.MeasurementConverter.Calories, - Configuration.Settings.Language.MeasurementConverter.Ergs, - Configuration.Settings.Language.MeasurementConverter.ElectronVolts, - Configuration.Settings.Language.MeasurementConverter.Btus }; - - private readonly List _power = new List { Configuration.Settings.Language.MeasurementConverter.Watts, - Configuration.Settings.Language.MeasurementConverter.Horsepower }; - - private readonly List _pressure = new List { Configuration.Settings.Language.MeasurementConverter.Atmospheres, - Configuration.Settings.Language.MeasurementConverter.Bars, - Configuration.Settings.Language.MeasurementConverter.Pascals, - Configuration.Settings.Language.MeasurementConverter.MillimetersOfMercury, - Configuration.Settings.Language.MeasurementConverter.PoundPerSquareInch, - Configuration.Settings.Language.MeasurementConverter.KilogramPerSquareCentimeter, - Configuration.Settings.Language.MeasurementConverter.KiloPascals }; - - public MeasurementConverter() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - _defaultBackColor = Color.White; - var l = Configuration.Settings.Language.MeasurementConverter; - Text = l.Title; - labelConvertFrom.Text = l.ConvertFrom; - labelConvertTo.Text = l.ConvertTo; - linkLabel1.Text = l.CopyToClipboard; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - checkBoxCloseOnInsert.Checked = Configuration.Settings.General.MeasurementConverterCloseOnInsert; - - _defaultBackColor = textBoxInput.BackColor; - - listBoxCategory.Items.Add(l.Length); - listBoxCategory.Items.Add(l.Mass); - listBoxCategory.Items.Add(l.Volume); - listBoxCategory.Items.Add(l.Area); - listBoxCategory.Items.Add(l.Time); - listBoxCategory.Items.Add(l.Temperature); - listBoxCategory.Items.Add(l.Velocity); - listBoxCategory.Items.Add(l.Force); - listBoxCategory.Items.Add(l.Energy); - listBoxCategory.Items.Add(l.Power); - listBoxCategory.Items.Add(l.Pressure); - - listBoxCategory.SelectedItem = _fields[0]; - - UiUtil.FixLargeFonts(this, buttonOK); - } - - private void comboBoxFrom_SelectedIndexChanged(object sender, EventArgs e) - { - string cat = listBoxCategory.SelectedItem.ToString(); - string text = comboBoxFrom.SelectedItem.ToString(); - var l = Configuration.Settings.Language.MeasurementConverter; - - comboBoxTo.Items.Clear(); - - if (cat == l.Length) - { - comboBoxTo.Items.AddRange(_length.Cast().ToArray()); - } - else if (cat == l.Mass) - { - comboBoxTo.Items.AddRange(_mass.Cast().ToArray()); - } - else if (cat == l.Volume) - { - comboBoxTo.Items.AddRange(_volume.Cast().ToArray()); - } - else if (cat == l.Area) - { - comboBoxTo.Items.AddRange(_area.Cast().ToArray()); - } - else if (cat == l.Time) - { - comboBoxTo.Items.AddRange(_time.Cast().ToArray()); - } - else if (cat == l.Temperature) - { - comboBoxTo.Items.AddRange(_temperature.Cast().ToArray()); - } - else if (cat == l.Velocity) - { - comboBoxTo.Items.AddRange(_velocity.Cast().ToArray()); - } - else if (cat == l.Force) - { - comboBoxTo.Items.AddRange(_force.Cast().ToArray()); - } - else if (cat == l.Energy) - { - comboBoxTo.Items.AddRange(_energy.Cast().ToArray()); - } - else if (cat == l.Power) - { - comboBoxTo.Items.AddRange(_power.Cast().ToArray()); - } - else if (cat == l.Pressure) - { - comboBoxTo.Items.AddRange(_pressure.Cast().ToArray()); - } - comboBoxTo.Items.Remove(text); - - if (comboBoxTo.Items.Count > 0) - { - if (comboBoxTo.Items.Contains(_fields[2])) - { - comboBoxTo.SelectedItem = _fields[2]; - } - else - { - comboBoxTo.SelectedIndex = 0; - } - } - - textBoxInput_TextChanged(null, null); - } - - private void ShowResult(double d) - { - textBoxResult.Text = $"{d:0.##}"; - Output = $"{d:0.##}"; - } - - private void comboBoxTo_SelectedIndexChanged(object sender, EventArgs e) - { - textBoxInput_TextChanged(null, null); - } - - private void buttonInsert_Click(object sender, EventArgs e) - { - InsertClicked?.Invoke(this, new InsertEventArgs { Result = Output, IsOriginalActive = IsOriginalActive }); - - if (checkBoxCloseOnInsert.Checked) - { - Configuration.Settings.General.MeasurementConverterCloseOnInsert = checkBoxCloseOnInsert.Checked; - Configuration.Settings.General.MeasurementConverterCategories = listBoxCategory.SelectedItem + ";" + comboBoxFrom.SelectedItem + ";" + comboBoxTo.SelectedItem; - Close(); - } - } - - private void buttonOK_Click(object sender, EventArgs e) - { - Configuration.Settings.General.MeasurementConverterCloseOnInsert = checkBoxCloseOnInsert.Checked; - Configuration.Settings.General.MeasurementConverterCategories = listBoxCategory.SelectedItem + ";" + comboBoxFrom.SelectedItem + ";" + comboBoxTo.SelectedItem; - Close(); - } - - private void MeasurementConverter_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - Close(); - } - } - - private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) - { - if (textBoxResult.Text.Length > 0) - { - Clipboard.SetText(textBoxResult.Text); - } - } - - private void textBoxInput_TextChanged(object sender, EventArgs e) - { - if (comboBoxFrom.SelectedIndex == -1 || comboBoxTo.SelectedIndex == -1) - { - return; - } - - if (!double.TryParse(textBoxInput.Text, out var d)) - { - textBoxInput.BackColor = Configuration.Settings.Tools.ListViewSyntaxErrorColor; - return; - } - - textBoxInput.BackColor = _defaultBackColor; - - string text = comboBoxFrom.SelectedItem.ToString(); - string textTo = comboBoxTo.SelectedItem.ToString(); - - string cat = listBoxCategory.SelectedItem.ToString(); - var l = Configuration.Settings.Language.MeasurementConverter; - - if (cat == l.Length) - { - if (text == l.Kilometers) - { - if (textTo == l.Meters) - { - ShowResult(Convert.ToDouble(d) * 1000); - } - else if (textTo == l.Centimeters) - { - ShowResult(Convert.ToDouble(d) * 100000); - } - else if (textTo == l.Millimeters) - { - ShowResult(Convert.ToDouble(d) * 1000000); - } - else if (textTo == l.Micrometers) - { - ShowResult(Convert.ToDouble(d) * 1000000000); - } - else if (textTo == l.Nanometers) - { - ShowResult(Convert.ToDouble(d) * 1000000000000); - } - else if (textTo == l.Angstroms) - { - ShowResult(Convert.ToDouble(d) * 10000000000000); - } - else if (textTo == l.MilesTerrestial) - { - ShowResult(Convert.ToDouble(d) / 1.609); - } - else if (textTo == l.MilesNautical) - { - ShowResult(Convert.ToDouble(d) / 1.852); - } - else if (textTo == l.Yards) - { - ShowResult(Convert.ToDouble(d) * 1093.61); - } - else if (textTo == l.Feet) - { - ShowResult(Convert.ToDouble(d) * 3280.84); - } - else if (textTo == l.Inches) - { - ShowResult(Convert.ToDouble(d) * 39370.1); - } - else if (textTo == l.Chains) - { - ShowResult(Convert.ToDouble(d) * 49.71); - } - else if (textTo == l.Fathoms) - { - ShowResult(Convert.ToDouble(d) * 546.807); - } - else if (textTo == l.Hands) - { - ShowResult(Convert.ToDouble(d) * 9842.52); - } - else if (textTo == l.Rods) - { - ShowResult(Convert.ToDouble(d) * 198.839); - } - else if (textTo == l.Spans) - { - ShowResult(Convert.ToDouble(d) * 4374.45); - } - } - else if (text == l.Meters) - { - if (textTo == l.Kilometers) - { - ShowResult(Convert.ToDouble(d) / 1000); - } - else if (textTo == l.Centimeters) - { - ShowResult(Convert.ToDouble(d) * 100); - } - else if (textTo == l.Millimeters) - { - ShowResult(Convert.ToDouble(d) * 1000); - } - else if (textTo == l.Micrometers) - { - ShowResult(Convert.ToDouble(d) * 1000000); - } - else if (textTo == l.Nanometers) - { - ShowResult(Convert.ToDouble(d) * 1000000000); - } - else if (textTo == l.Angstroms) - { - ShowResult(Convert.ToDouble(d) * 10000000000); - } - else if (textTo == l.MilesTerrestial) - { - ShowResult(Convert.ToDouble(d) / 1609); - } - else if (textTo == l.MilesNautical) - { - ShowResult(Convert.ToDouble(d) / 1852); - } - else if (textTo == l.Yards) - { - ShowResult(Convert.ToDouble(d) * 1.094); - } - else if (textTo == l.Feet) - { - ShowResult(Convert.ToDouble(d) * 3.281); - } - else if (textTo == l.Inches) - { - ShowResult(Convert.ToDouble(d) * 39.37); - } - else if (textTo == l.Chains) - { - ShowResult(Convert.ToDouble(d) / 20.117); - } - else if (textTo == l.Fathoms) - { - ShowResult(Convert.ToDouble(d) / 1.829); - } - else if (textTo == l.Hands) - { - ShowResult(Convert.ToDouble(d) * 9.843); - } - else if (textTo == l.Rods) - { - ShowResult(Convert.ToDouble(d) / 5.029); - } - else if (textTo == l.Spans) - { - ShowResult(Convert.ToDouble(d) * 4.374); - } - } - else if (text == l.Centimeters) - { - if (textTo == l.Kilometers) - { - ShowResult(Convert.ToDouble(d) / 100000); - } - else if (textTo == l.Meters) - { - ShowResult(Convert.ToDouble(d) / 100); - } - else if (textTo == l.Millimeters) - { - ShowResult(Convert.ToDouble(d) * 10); - } - else if (textTo == l.Micrometers) - { - ShowResult(Convert.ToDouble(d) * 10000); - } - else if (textTo == l.Nanometers) - { - ShowResult(Convert.ToDouble(d) * 1e+7); - } - else if (textTo == l.Angstroms) - { - ShowResult(Convert.ToDouble(d) * 1e+8); - } - else if (textTo == l.MilesTerrestial) - { - ShowResult(Convert.ToDouble(d) / 160934); - } - else if (textTo == l.MilesNautical) - { - ShowResult(Convert.ToDouble(d) / 185200); - } - else if (textTo == l.Yards) - { - ShowResult(Convert.ToDouble(d) / 91.44); - } - else if (textTo == l.Feet) - { - ShowResult(Convert.ToDouble(d) / 30.48); - } - else if (textTo == l.Inches) - { - ShowResult(Convert.ToDouble(d) / 2.54); - } - else if (textTo == l.Chains) - { - ShowResult(Convert.ToDouble(d) / 2012); - } - else if (textTo == l.Fathoms) - { - ShowResult(Convert.ToDouble(d) / 183); - } - else if (textTo == l.Hands) - { - ShowResult(Convert.ToDouble(d) / 10.16); - } - else if (textTo == l.Rods) - { - ShowResult(Convert.ToDouble(d) / 503); - } - else if (textTo == l.Spans) - { - ShowResult(Convert.ToDouble(d) / 22.86); - } - } - else if (text == l.Millimeters) - { - if (textTo == l.Kilometers) - { - ShowResult(Convert.ToDouble(d) / 1e+6); - } - else if (textTo == l.Meters) - { - ShowResult(Convert.ToDouble(d) / 1000); - } - else if (textTo == l.Centimeters) - { - ShowResult(Convert.ToDouble(d) / 10); - } - else if (textTo == l.Micrometers) - { - ShowResult(Convert.ToDouble(d) * 1000); - } - else if (textTo == l.Nanometers) - { - ShowResult(Convert.ToDouble(d) * 1e+6); - } - else if (textTo == l.Angstroms) - { - ShowResult(Convert.ToDouble(d) * 1e+7); - } - else if (textTo == l.MilesTerrestial) - { - ShowResult(Convert.ToDouble(d) / 1.609e+6); - } - else if (textTo == l.MilesNautical) - { - ShowResult(Convert.ToDouble(d) / 1.852e+6); - } - else if (textTo == l.Yards) - { - ShowResult(Convert.ToDouble(d) / 914); - } - else if (textTo == l.Feet) - { - ShowResult(Convert.ToDouble(d) / 305); - } - else if (textTo == l.Inches) - { - ShowResult(Convert.ToDouble(d) / 25.4); - } - else if (textTo == l.Chains) - { - ShowResult(Convert.ToDouble(d) / 20117); - } - else if (textTo == l.Fathoms) - { - ShowResult(Convert.ToDouble(d) / 1829); - } - else if (textTo == l.Hands) - { - ShowResult(Convert.ToDouble(d) / 102); - } - else if (textTo == l.Rods) - { - ShowResult(Convert.ToDouble(d) / 5029); - } - else if (textTo == l.Spans) - { - ShowResult(Convert.ToDouble(d) / 229); - } - } - else if (text == l.Micrometers) - { - if (textTo == l.Kilometers) - { - ShowResult(Convert.ToDouble(d) / 1e+9); - } - else if (textTo == l.Meters) - { - ShowResult(Convert.ToDouble(d) / 1e+6); - } - else if (textTo == l.Centimeters) - { - ShowResult(Convert.ToDouble(d) / 10000); - } - else if (textTo == l.Millimeters) - { - ShowResult(Convert.ToDouble(d) / 1000); - } - else if (textTo == l.Nanometers) - { - ShowResult(Convert.ToDouble(d) * 1000); - } - else if (textTo == l.Angstroms) - { - ShowResult(Convert.ToDouble(d) * 10000); - } - else if (textTo == l.MilesTerrestial) - { - ShowResult(Convert.ToDouble(d) / 1.609e+9); - } - else if (textTo == l.MilesNautical) - { - ShowResult(Convert.ToDouble(d) / 1.852e+9); - } - else if (textTo == l.Yards) - { - ShowResult(Convert.ToDouble(d) / 914400); - } - else if (textTo == l.Feet) - { - ShowResult(Convert.ToDouble(d) / 304800); - } - else if (textTo == l.Inches) - { - ShowResult(Convert.ToDouble(d) / 25400); - } - else if (textTo == l.Chains) - { - ShowResult(Convert.ToDouble(d) / 2.012e+7); - } - else if (textTo == l.Fathoms) - { - ShowResult(Convert.ToDouble(d) / 1.829e+6); - } - else if (textTo == l.Hands) - { - ShowResult(Convert.ToDouble(d) / 101600); - } - else if (textTo == l.Rods) - { - ShowResult(Convert.ToDouble(d) / 5.029e+6); - } - else if (textTo == l.Spans) - { - ShowResult(Convert.ToDouble(d) / 228600); - } - } - else if (text == l.Nanometers) - { - if (textTo == l.Kilometers) - { - ShowResult(Convert.ToDouble(d) / 1e+12); - } - else if (textTo == l.Meters) - { - ShowResult(Convert.ToDouble(d) / 1e+9); - } - else if (textTo == l.Centimeters) - { - ShowResult(Convert.ToDouble(d) / 1e+7); - } - else if (textTo == l.Millimeters) - { - ShowResult(Convert.ToDouble(d) / 1e+6); - } - else if (textTo == l.Micrometers) - { - ShowResult(Convert.ToDouble(d) / 1000); - } - else if (textTo == l.Angstroms) - { - ShowResult(Convert.ToDouble(d) * 10); - } - else if (textTo == l.MilesTerrestial) - { - ShowResult(Convert.ToDouble(d) / 1.609e+12); - } - else if (textTo == l.MilesNautical) - { - ShowResult(Convert.ToDouble(d) / 1.852e+12); - } - else if (textTo == l.Yards) - { - ShowResult(Convert.ToDouble(d) / 9.144e+8); - } - else if (textTo == l.Feet) - { - ShowResult(Convert.ToDouble(d) / 3.048e+8); - } - else if (textTo == l.Inches) - { - ShowResult(Convert.ToDouble(d) / 2.54e+7); - } - else if (textTo == l.Chains) - { - ShowResult(Convert.ToDouble(d) / 2.012e+10); - } - else if (textTo == l.Fathoms) - { - ShowResult(Convert.ToDouble(d) / 1.829e+9); - } - else if (textTo == l.Hands) - { - ShowResult(Convert.ToDouble(d) / 1.016e+8); - } - else if (textTo == l.Rods) - { - ShowResult(Convert.ToDouble(d) / 5.029e+9); - } - else if (textTo == l.Spans) - { - ShowResult(Convert.ToDouble(d) / 2.286e+8); - } - } - else if (text == l.Angstroms) - { - if (textTo == l.Kilometers) - { - ShowResult(Convert.ToDouble(d) / 1e+13); - } - else if (textTo == l.Meters) - { - ShowResult(Convert.ToDouble(d) / 1e+10); - } - else if (textTo == l.Centimeters) - { - ShowResult(Convert.ToDouble(d) / 1e+8); - } - else if (textTo == l.Millimeters) - { - ShowResult(Convert.ToDouble(d) / 1e+7); - } - else if (textTo == l.Micrometers) - { - ShowResult(Convert.ToDouble(d) / 10000); - } - else if (textTo == l.Nanometers) - { - ShowResult(Convert.ToDouble(d) / 10); - } - else if (textTo == l.MilesTerrestial) - { - ShowResult(Convert.ToDouble(d) / 1.609e+13); - } - else if (textTo == l.MilesNautical) - { - ShowResult(Convert.ToDouble(d) / 1.852e+13); - } - else if (textTo == l.Yards) - { - ShowResult(Convert.ToDouble(d) / 9.144e+9); - } - else if (textTo == l.Feet) - { - ShowResult(Convert.ToDouble(d) / 3.048e+9); - } - else if (textTo == l.Inches) - { - ShowResult(Convert.ToDouble(d) / 2.54e+8); - } - else if (textTo == l.Chains) - { - ShowResult(Convert.ToDouble(d) / 2.012e+11); - } - else if (textTo == l.Fathoms) - { - ShowResult(Convert.ToDouble(d) / 1.829e+10); - } - else if (textTo == l.Hands) - { - ShowResult(Convert.ToDouble(d) / 1.016e+9); - } - else if (textTo == l.Rods) - { - ShowResult(Convert.ToDouble(d) / 5.029e+10); - } - else if (textTo == l.Spans) - { - ShowResult(Convert.ToDouble(d) / 2.286e+9); - } - } - else if (text == l.MilesTerrestial) - { - if (textTo == l.Kilometers) - { - ShowResult(Convert.ToDouble(d) * 1.609); - } - else if (textTo == l.Meters) - { - ShowResult(Convert.ToDouble(d) * 1609); - } - else if (textTo == l.Centimeters) - { - ShowResult(Convert.ToDouble(d) * 160934); - } - else if (textTo == l.Millimeters) - { - ShowResult(Convert.ToDouble(d) * 1.609e+6); - } - else if (textTo == l.Micrometers) - { - ShowResult(Convert.ToDouble(d) * 1.609e+9); - } - else if (textTo == l.Nanometers) - { - ShowResult(Convert.ToDouble(d) * 1.609e+12); - } - else if (textTo == l.Angstroms) - { - ShowResult(Convert.ToDouble(d) * 1.609e+13); - } - else if (textTo == l.MilesNautical) - { - ShowResult(Convert.ToDouble(d) / 1.151); - } - else if (textTo == l.Yards) - { - ShowResult(Convert.ToDouble(d) * 1760); - } - else if (textTo == l.Feet) - { - ShowResult(Convert.ToDouble(d) * 5280); - } - else if (textTo == l.Inches) - { - ShowResult(Convert.ToDouble(d) * 63360); - } - else if (textTo == l.Chains) - { - ShowResult(Convert.ToDouble(d) * 80); - } - else if (textTo == l.Fathoms) - { - ShowResult(Convert.ToDouble(d) * 880); - } - else if (textTo == l.Hands) - { - ShowResult(Convert.ToDouble(d) * 15840); - } - else if (textTo == l.Rods) - { - ShowResult(Convert.ToDouble(d) * 320); - } - else if (textTo == l.Spans) - { - ShowResult(Convert.ToDouble(d) * 7040); - } - } - else if (text == l.MilesNautical) - { - if (textTo == l.Kilometers) - { - ShowResult(Convert.ToDouble(d) * 1.852); - } - else if (textTo == l.Meters) - { - ShowResult(Convert.ToDouble(d) * 1852); - } - else if (textTo == l.Centimeters) - { - ShowResult(Convert.ToDouble(d) * 185200); - } - else if (textTo == l.Millimeters) - { - ShowResult(Convert.ToDouble(d) * 1.852e+6); - } - else if (textTo == l.Micrometers) - { - ShowResult(Convert.ToDouble(d) * 1.852e+9); - } - else if (textTo == l.Nanometers) - { - ShowResult(Convert.ToDouble(d) * 1.852e+12); - } - else if (textTo == l.Angstroms) - { - ShowResult(Convert.ToDouble(d) * 1.852e+13); - } - else if (textTo == l.MilesTerrestial) - { - ShowResult(Convert.ToDouble(d) * 1.151); - } - else if (textTo == l.Yards) - { - ShowResult(Convert.ToDouble(d) * 2025); - } - else if (textTo == l.Feet) - { - ShowResult(Convert.ToDouble(d) * 6076); - } - else if (textTo == l.Inches) - { - ShowResult(Convert.ToDouble(d) * 72913); - } - else if (textTo == l.Chains) - { - ShowResult(Convert.ToDouble(d) * 92.062); - } - else if (textTo == l.Fathoms) - { - ShowResult(Convert.ToDouble(d) * 1013); - } - else if (textTo == l.Hands) - { - ShowResult(Convert.ToDouble(d) * 18228); - } - else if (textTo == l.Rods) - { - ShowResult(Convert.ToDouble(d) * 368); - } - else if (textTo == l.Spans) - { - ShowResult(Convert.ToDouble(d) * 8101); - } - } - else if (text == l.Yards) - { - if (textTo == l.Kilometers) - { - ShowResult(Convert.ToDouble(d) / 1094); - } - else if (textTo == l.Meters) - { - ShowResult(Convert.ToDouble(d) / 1.094); - } - else if (textTo == l.Centimeters) - { - ShowResult(Convert.ToDouble(d) * 91.44); - } - else if (textTo == l.Millimeters) - { - ShowResult(Convert.ToDouble(d) * 914); - } - else if (textTo == l.Micrometers) - { - ShowResult(Convert.ToDouble(d) * 914400); - } - else if (textTo == l.Nanometers) - { - ShowResult(Convert.ToDouble(d) * 9.144e+8); - } - else if (textTo == l.Angstroms) - { - ShowResult(Convert.ToDouble(d) * 9.144e+9); - } - else if (textTo == l.MilesTerrestial) - { - ShowResult(Convert.ToDouble(d) / 1760); - } - else if (textTo == l.MilesNautical) - { - ShowResult(Convert.ToDouble(d) / 2025); - } - else if (textTo == l.Feet) - { - ShowResult(Convert.ToDouble(d) * 3); - } - else if (textTo == l.Inches) - { - ShowResult(Convert.ToDouble(d) * 36); - } - else if (textTo == l.Chains) - { - ShowResult(Convert.ToDouble(d) / 22); - } - else if (textTo == l.Fathoms) - { - ShowResult(Convert.ToDouble(d) / 2); - } - else if (textTo == l.Hands) - { - ShowResult(Convert.ToDouble(d) * 9); - } - else if (textTo == l.Rods) - { - ShowResult(Convert.ToDouble(d) / 5.5); - } - else if (textTo == l.Spans) - { - ShowResult(Convert.ToDouble(d) * 4); - } - } - else if (text == l.Feet) - { - if (textTo == l.Kilometers) - { - ShowResult(Convert.ToDouble(d) / 3281); - } - else if (textTo == l.Meters) - { - ShowResult(Convert.ToDouble(d) / 3.281); - } - else if (textTo == l.Centimeters) - { - ShowResult(Convert.ToDouble(d) * 30.48); - } - else if (textTo == l.Millimeters) - { - ShowResult(Convert.ToDouble(d) * 305); - } - else if (textTo == l.Micrometers) - { - ShowResult(Convert.ToDouble(d) * 304800); - } - else if (textTo == l.Nanometers) - { - ShowResult(Convert.ToDouble(d) * 3.048e+8); - } - else if (textTo == l.Angstroms) - { - ShowResult(Convert.ToDouble(d) * 3.048e+9); - } - else if (textTo == l.MilesTerrestial) - { - ShowResult(Convert.ToDouble(d) / 5280); - } - else if (textTo == l.MilesNautical) - { - ShowResult(Convert.ToDouble(d) / 6076); - } - else if (textTo == l.Yards) - { - ShowResult(Convert.ToDouble(d) / 3); - } - else if (textTo == l.Inches) - { - ShowResult(Convert.ToDouble(d) * 12); - } - else if (textTo == l.Chains) - { - ShowResult(Convert.ToDouble(d) / 66); - } - else if (textTo == l.Fathoms) - { - ShowResult(Convert.ToDouble(d) / 6); - } - else if (textTo == l.Hands) - { - ShowResult(Convert.ToDouble(d) * 3); - } - else if (textTo == l.Rods) - { - ShowResult(Convert.ToDouble(d) / 16.5); - } - else if (textTo == l.Spans) - { - ShowResult(Convert.ToDouble(d) * 1.333); - } - } - else if (text == l.Inches) - { - if (textTo == l.Kilometers) - { - ShowResult(Convert.ToDouble(d) / 39370); - } - else if (textTo == l.Meters) - { - ShowResult(Convert.ToDouble(d) / 39.37); - } - else if (textTo == l.Centimeters) - { - ShowResult(Convert.ToDouble(d) * 2.54); - } - else if (textTo == l.Millimeters) - { - ShowResult(Convert.ToDouble(d) * 25.4); - } - else if (textTo == l.Micrometers) - { - ShowResult(Convert.ToDouble(d) * 25400); - } - else if (textTo == l.Nanometers) - { - ShowResult(Convert.ToDouble(d) * 2.54e+7); - } - else if (textTo == l.Angstroms) - { - ShowResult(Convert.ToDouble(d) * 2.54e+8); - } - else if (textTo == l.MilesTerrestial) - { - ShowResult(Convert.ToDouble(d) / 63360); - } - else if (textTo == l.MilesNautical) - { - ShowResult(Convert.ToDouble(d) / 72913); - } - else if (textTo == l.Yards) - { - ShowResult(Convert.ToDouble(d) / 36); - } - else if (textTo == l.Feet) - { - ShowResult(Convert.ToDouble(d) / 12); - } - else if (textTo == l.Chains) - { - ShowResult(Convert.ToDouble(d) / 792); - } - else if (textTo == l.Fathoms) - { - ShowResult(Convert.ToDouble(d) / 72); - } - else if (textTo == l.Hands) - { - ShowResult(Convert.ToDouble(d) / 4); - } - else if (textTo == l.Rods) - { - ShowResult(Convert.ToDouble(d) / 198); - } - else if (textTo == l.Spans) - { - ShowResult(Convert.ToDouble(d) / 9); - } - } - else if (text == l.Chains) - { - if (textTo == l.Kilometers) - { - ShowResult(Convert.ToDouble(d) / 49.71); - } - else if (textTo == l.Meters) - { - ShowResult(Convert.ToDouble(d) * 20.117); - } - else if (textTo == l.Centimeters) - { - ShowResult(Convert.ToDouble(d) * 2012); - } - else if (textTo == l.Millimeters) - { - ShowResult(Convert.ToDouble(d) * 20117); - } - else if (textTo == l.Micrometers) - { - ShowResult(Convert.ToDouble(d) * 2.012e+7); - } - else if (textTo == l.Nanometers) - { - ShowResult(Convert.ToDouble(d) * 2.012e+10); - } - else if (textTo == l.Angstroms) - { - ShowResult(Convert.ToDouble(d) * 2.012e+11); - } - else if (textTo == l.MilesTerrestial) - { - ShowResult(Convert.ToDouble(d) / 80); - } - else if (textTo == l.MilesNautical) - { - ShowResult(Convert.ToDouble(d) / 92.062); - } - else if (textTo == l.Yards) - { - ShowResult(Convert.ToDouble(d) * 22); - } - else if (textTo == l.Feet) - { - ShowResult(Convert.ToDouble(d) * 66); - } - else if (textTo == l.Inches) - { - ShowResult(Convert.ToDouble(d) * 792); - } - else if (textTo == l.Fathoms) - { - ShowResult(Convert.ToDouble(d) * 11); - } - else if (textTo == l.Hands) - { - ShowResult(Convert.ToDouble(d) * 198); - } - else if (textTo == l.Rods) - { - ShowResult(Convert.ToDouble(d) * 4); - } - else if (textTo == l.Spans) - { - ShowResult(Convert.ToDouble(d) * 88); - } - } - else if (text == l.Fathoms) - { - if (textTo == l.Kilometers) - { - ShowResult(Convert.ToDouble(d) / 547); - } - else if (textTo == l.Meters) - { - ShowResult(Convert.ToDouble(d) * 1.829); - } - else if (textTo == l.Centimeters) - { - ShowResult(Convert.ToDouble(d) * 183); - } - else if (textTo == l.Millimeters) - { - ShowResult(Convert.ToDouble(d) * 1829); - } - else if (textTo == l.Micrometers) - { - ShowResult(Convert.ToDouble(d) * 1.829e+6); - } - else if (textTo == l.Nanometers) - { - ShowResult(Convert.ToDouble(d) * 1.829e+9); - } - else if (textTo == l.Angstroms) - { - ShowResult(Convert.ToDouble(d) * 1.829e+10); - } - else if (textTo == l.MilesTerrestial) - { - ShowResult(Convert.ToDouble(d) / 880); - } - else if (textTo == l.MilesNautical) - { - ShowResult(Convert.ToDouble(d) / 1013); - } - else if (textTo == l.Yards) - { - ShowResult(Convert.ToDouble(d) * 2); - } - else if (textTo == l.Feet) - { - ShowResult(Convert.ToDouble(d) * 6); - } - else if (textTo == l.Inches) - { - ShowResult(Convert.ToDouble(d) * 72); - } - else if (textTo == l.Chains) - { - ShowResult(Convert.ToDouble(d) / 11); - } - else if (textTo == l.Hands) - { - ShowResult(Convert.ToDouble(d) * 18); - } - else if (textTo == l.Rods) - { - ShowResult(Convert.ToDouble(d) / 2.75); - } - else if (textTo == l.Spans) - { - ShowResult(Convert.ToDouble(d) * 8); - } - } - else if (text == l.Hands) - { - if (textTo == l.Kilometers) - { - ShowResult(Convert.ToDouble(d) / 9843); - } - else if (textTo == l.Meters) - { - ShowResult(Convert.ToDouble(d) / 9.843); - } - else if (textTo == l.Centimeters) - { - ShowResult(Convert.ToDouble(d) * 10.16); - } - else if (textTo == l.Millimeters) - { - ShowResult(Convert.ToDouble(d) * 102); - } - else if (textTo == l.Micrometers) - { - ShowResult(Convert.ToDouble(d) * 101600); - } - else if (textTo == l.Nanometers) - { - ShowResult(Convert.ToDouble(d) * 1.016e+8); - } - else if (textTo == l.Angstroms) - { - ShowResult(Convert.ToDouble(d) * 1.016e+9); - } - else if (textTo == l.MilesTerrestial) - { - ShowResult(Convert.ToDouble(d) / 15840); - } - else if (textTo == l.MilesNautical) - { - ShowResult(Convert.ToDouble(d) / 18228); - } - else if (textTo == l.Yards) - { - ShowResult(Convert.ToDouble(d) / 9); - } - else if (textTo == l.Feet) - { - ShowResult(Convert.ToDouble(d) / 3); - } - else if (textTo == l.Inches) - { - ShowResult(Convert.ToDouble(d) * 4); - } - else if (textTo == l.Chains) - { - ShowResult(Convert.ToDouble(d) / 198); - } - else if (textTo == l.Fathoms) - { - ShowResult(Convert.ToDouble(d) / 18); - } - else if (textTo == l.Rods) - { - ShowResult(Convert.ToDouble(d) / 49.5); - } - else if (textTo == l.Spans) - { - ShowResult(Convert.ToDouble(d) / 2.25); - } - } - else if (text == l.Rods) - { - if (textTo == l.Kilometers) - { - ShowResult(Convert.ToDouble(d) / 199); - } - else if (textTo == l.Meters) - { - ShowResult(Convert.ToDouble(d) * 5.029); - } - else if (textTo == l.Centimeters) - { - ShowResult(Convert.ToDouble(d) * 503); - } - else if (textTo == l.Millimeters) - { - ShowResult(Convert.ToDouble(d) * 5029); - } - else if (textTo == l.Micrometers) - { - ShowResult(Convert.ToDouble(d) * 5.029e+6); - } - else if (textTo == l.Nanometers) - { - ShowResult(Convert.ToDouble(d) * 5.029e+9); - } - else if (textTo == l.Angstroms) - { - ShowResult(Convert.ToDouble(d) * 5.029e+10); - } - else if (textTo == l.MilesTerrestial) - { - ShowResult(Convert.ToDouble(d) / 320); - } - else if (textTo == l.MilesNautical) - { - ShowResult(Convert.ToDouble(d) / 368); - } - else if (textTo == l.Yards) - { - ShowResult(Convert.ToDouble(d) * 5.5); - } - else if (textTo == l.Feet) - { - ShowResult(Convert.ToDouble(d) * 16.5); - } - else if (textTo == l.Inches) - { - ShowResult(Convert.ToDouble(d) * 198); - } - else if (textTo == l.Chains) - { - ShowResult(Convert.ToDouble(d) / 4); - } - else if (textTo == l.Fathoms) - { - ShowResult(Convert.ToDouble(d) * 2.75); - } - else if (textTo == l.Hands) - { - ShowResult(Convert.ToDouble(d) * 49.5); - } - else if (textTo == l.Spans) - { - ShowResult(Convert.ToDouble(d) * 22); - } - } - else if (text == l.Spans) - { - if (textTo == l.Kilometers) - { - ShowResult(Convert.ToDouble(d) / 4374); - } - else if (textTo == l.Meters) - { - ShowResult(Convert.ToDouble(d) / 4.374); - } - else if (textTo == l.Centimeters) - { - ShowResult(Convert.ToDouble(d) * 22.86); - } - else if (textTo == l.Millimeters) - { - ShowResult(Convert.ToDouble(d) * 229); - } - else if (textTo == l.Micrometers) - { - ShowResult(Convert.ToDouble(d) * 228600); - } - else if (textTo == l.Nanometers) - { - ShowResult(Convert.ToDouble(d) * 2.286e+8); - } - else if (textTo == l.Angstroms) - { - ShowResult(Convert.ToDouble(d) * 2.286e+9); - } - else if (textTo == l.MilesTerrestial) - { - ShowResult(Convert.ToDouble(d) / 7040); - } - else if (textTo == l.MilesNautical) - { - ShowResult(Convert.ToDouble(d) / 8101); - } - else if (textTo == l.Yards) - { - ShowResult(Convert.ToDouble(d) / 4); - } - else if (textTo == l.Feet) - { - ShowResult(Convert.ToDouble(d) / 1.333); - } - else if (textTo == l.Inches) - { - ShowResult(Convert.ToDouble(d) * 9); - } - else if (textTo == l.Chains) - { - ShowResult(Convert.ToDouble(d) / 88); - } - else if (textTo == l.Fathoms) - { - ShowResult(Convert.ToDouble(d) / 8); - } - else if (textTo == l.Hands) - { - ShowResult(Convert.ToDouble(d) * 2.25); - } - else if (textTo == l.Rods) - { - ShowResult(Convert.ToDouble(d) / 22); - } - } - } - else if (cat == l.Mass) - { - if (text == l.LongTonnes) - { - if (textTo == l.ShortTonnes) - { - ShowResult(Convert.ToDouble(d) * 1.12); - } - else if (textTo == l.Tonnes) - { - ShowResult(Convert.ToDouble(d) * 1.016); - } - else if (textTo == l.Kilos) - { - ShowResult(Convert.ToDouble(d) * 1016); - } - else if (textTo == l.Grams) - { - ShowResult(Convert.ToDouble(d) * 1.016e+6); - } - else if (textTo == l.Milligrams) - { - ShowResult(Convert.ToDouble(d) * 1.016e+9); - } - else if (textTo == l.Micrograms) - { - ShowResult(Convert.ToDouble(d) * 1.016e+12); - } - else if (textTo == l.Pounds) - { - ShowResult(Convert.ToDouble(d) * 2240); - } - else if (textTo == l.Ounces) - { - ShowResult(Convert.ToDouble(d) * 35840); - } - else if (textTo == l.Carats) - { - ShowResult(Convert.ToDouble(d) * 5.08e+6); - } - else if (textTo == l.Drams) - { - ShowResult(Convert.ToDouble(d) * 573438); - } - else if (textTo == l.Grains) - { - ShowResult(Convert.ToDouble(d) * 1.568e+7); - } - else if (textTo == l.Stones) - { - ShowResult(Convert.ToDouble(d) * 160); - } - } - else if (text == l.ShortTonnes) - { - if (textTo == l.LongTonnes) - { - ShowResult(Convert.ToDouble(d) / 1.12); - } - else if (textTo == l.Tonnes) - { - ShowResult(Convert.ToDouble(d) / 1.102); - } - else if (textTo == l.Kilos) - { - ShowResult(Convert.ToDouble(d) * 907); - } - else if (textTo == l.Grams) - { - ShowResult(Convert.ToDouble(d) * 907185); - } - else if (textTo == l.Milligrams) - { - ShowResult(Convert.ToDouble(d) * 9.072e+8); - } - else if (textTo == l.Micrograms) - { - ShowResult(Convert.ToDouble(d) * 9.072e+11); - } - else if (textTo == l.Pounds) - { - ShowResult(Convert.ToDouble(d) * 2000); - } - else if (textTo == l.Ounces) - { - ShowResult(Convert.ToDouble(d) * 32000); - } - else if (textTo == l.Carats) - { - ShowResult(Convert.ToDouble(d) * 4.536e+6); - } - else if (textTo == l.Drams) - { - ShowResult(Convert.ToDouble(d) * 511999); - } - else if (textTo == l.Grains) - { - ShowResult(Convert.ToDouble(d) * 1.4e+7); - } - else if (textTo == l.Stones) - { - ShowResult(Convert.ToDouble(d) * 143); - } - } - else if (text == l.Tonnes) - { - if (textTo == l.LongTonnes) - { - ShowResult(Convert.ToDouble(d) / 1.016); - } - else if (textTo == l.ShortTonnes) - { - ShowResult(Convert.ToDouble(d) * 1.102); - } - else if (textTo == l.Kilos) - { - ShowResult(Convert.ToDouble(d) * 1000); - } - else if (textTo == l.Grams) - { - ShowResult(Convert.ToDouble(d) * 1e+6); - } - else if (textTo == l.Milligrams) - { - ShowResult(Convert.ToDouble(d) * 1e+9); - } - else if (textTo == l.Micrograms) - { - ShowResult(Convert.ToDouble(d) * 1e+12); - } - else if (textTo == l.Pounds) - { - ShowResult(Convert.ToDouble(d) * 2205); - } - else if (textTo == l.Ounces) - { - ShowResult(Convert.ToDouble(d) * 35274); - } - else if (textTo == l.Carats) - { - ShowResult(Convert.ToDouble(d) * 5e+6); - } - else if (textTo == l.Drams) - { - ShowResult(Convert.ToDouble(d) * 564382); - } - else if (textTo == l.Grains) - { - ShowResult(Convert.ToDouble(d) * 1.543e+7); - } - else if (textTo == l.Stones) - { - ShowResult(Convert.ToDouble(d) * 157); - } - } - else if (text == l.Kilos) - { - if (textTo == l.LongTonnes) - { - ShowResult(Convert.ToDouble(d) / 1016); - } - else if (textTo == l.ShortTonnes) - { - ShowResult(Convert.ToDouble(d) / 907); - } - else if (textTo == l.Tonnes) - { - ShowResult(Convert.ToDouble(d) / 1000); - } - else if (textTo == l.Grams) - { - ShowResult(Convert.ToDouble(d) * 1000); - } - else if (textTo == l.Milligrams) - { - ShowResult(Convert.ToDouble(d) * 1e+6); - } - else if (textTo == l.Micrograms) - { - ShowResult(Convert.ToDouble(d) * 1e+9); - } - else if (textTo == l.Pounds) - { - ShowResult(Convert.ToDouble(d) * 2.205); - } - else if (textTo == l.Ounces) - { - ShowResult(Convert.ToDouble(d) * 35.274); - } - else if (textTo == l.Carats) - { - ShowResult(Convert.ToDouble(d) * 5000); - } - else if (textTo == l.Drams) - { - ShowResult(Convert.ToDouble(d) * 564); - } - else if (textTo == l.Grains) - { - ShowResult(Convert.ToDouble(d) * 15432); - } - else if (textTo == l.Stones) - { - ShowResult(Convert.ToDouble(d) / 6.35); - } - } - else if (text == l.Grams) - { - if (textTo == l.LongTonnes) - { - ShowResult(Convert.ToDouble(d) / 1.016e+6); - } - else if (textTo == l.ShortTonnes) - { - ShowResult(Convert.ToDouble(d) / 907185); - } - else if (textTo == l.Tonnes) - { - ShowResult(Convert.ToDouble(d) / 1e+6); - } - else if (textTo == l.Kilos) - { - ShowResult(Convert.ToDouble(d) / 1000); - } - else if (textTo == l.Milligrams) - { - ShowResult(Convert.ToDouble(d) * 1000); - } - else if (textTo == l.Micrograms) - { - ShowResult(Convert.ToDouble(d) * 1e+6); - } - else if (textTo == l.Pounds) - { - ShowResult(Convert.ToDouble(d) / 454); - } - else if (textTo == l.Ounces) - { - ShowResult(Convert.ToDouble(d) / 28.35); - } - else if (textTo == l.Carats) - { - ShowResult(Convert.ToDouble(d) * 5); - } - else if (textTo == l.Drams) - { - ShowResult(Convert.ToDouble(d) / 1.772); - } - else if (textTo == l.Grains) - { - ShowResult(Convert.ToDouble(d) * 15.432); - } - else if (textTo == l.Stones) - { - ShowResult(Convert.ToDouble(d) / 6350); - } - } - else if (text == l.Milligrams) - { - if (textTo == l.LongTonnes) - { - ShowResult(Convert.ToDouble(d) / 1.016e+9); - } - else if (textTo == l.ShortTonnes) - { - ShowResult(Convert.ToDouble(d) / 9.072e+8); - } - else if (textTo == l.Tonnes) - { - ShowResult(Convert.ToDouble(d) / 1e+9); - } - else if (textTo == l.Kilos) - { - ShowResult(Convert.ToDouble(d) / 1e+6); - } - else if (textTo == l.Grams) - { - ShowResult(Convert.ToDouble(d) / 1000); - } - else if (textTo == l.Micrograms) - { - ShowResult(Convert.ToDouble(d) * 1000); - } - else if (textTo == l.Pounds) - { - ShowResult(Convert.ToDouble(d) / 453592); - } - else if (textTo == l.Ounces) - { - ShowResult(Convert.ToDouble(d) / 28350); - } - else if (textTo == l.Carats) - { - ShowResult(Convert.ToDouble(d) / 200); - } - else if (textTo == l.Drams) - { - ShowResult(Convert.ToDouble(d) / 1772); - } - else if (textTo == l.Grains) - { - ShowResult(Convert.ToDouble(d) / 64.799); - } - else if (textTo == l.Stones) - { - ShowResult(Convert.ToDouble(d) / 6.35e+6); - } - } - else if (text == l.Micrograms) - { - if (textTo == l.LongTonnes) - { - ShowResult(Convert.ToDouble(d) / 1.016e+12); - } - else if (textTo == l.ShortTonnes) - { - ShowResult(Convert.ToDouble(d) / 9.072e+11); - } - else if (textTo == l.Tonnes) - { - ShowResult(Convert.ToDouble(d) / 1e+12); - } - else if (textTo == l.Kilos) - { - ShowResult(Convert.ToDouble(d) / 1e+9); - } - else if (textTo == l.Grams) - { - ShowResult(Convert.ToDouble(d) / 1e+6); - } - else if (textTo == l.Milligrams) - { - ShowResult(Convert.ToDouble(d) / 1000); - } - else if (textTo == l.Pounds) - { - ShowResult(Convert.ToDouble(d) / 4.536e+8); - } - else if (textTo == l.Ounces) - { - ShowResult(Convert.ToDouble(d) / 2.835e+7); - } - else if (textTo == l.Carats) - { - ShowResult(Convert.ToDouble(d) / 200000); - } - else if (textTo == l.Drams) - { - ShowResult(Convert.ToDouble(d) / 1.772e+6); - } - else if (textTo == l.Grains) - { - ShowResult(Convert.ToDouble(d) / 64799); - } - else if (textTo == l.Stones) - { - ShowResult(Convert.ToDouble(d) / 6.35e+9); - } - } - else if (text == l.Pounds) - { - if (textTo == l.LongTonnes) - { - ShowResult(Convert.ToDouble(d) / 2240); - } - else if (textTo == l.ShortTonnes) - { - ShowResult(Convert.ToDouble(d) / 2000); - } - else if (textTo == l.Tonnes) - { - ShowResult(Convert.ToDouble(d) / 2205); - } - else if (textTo == l.Kilos) - { - ShowResult(Convert.ToDouble(d) / 2.205); - } - else if (textTo == l.Grams) - { - ShowResult(Convert.ToDouble(d) * 454); - } - else if (textTo == l.Milligrams) - { - ShowResult(Convert.ToDouble(d) * 453592); - } - else if (textTo == l.Micrograms) - { - ShowResult(Convert.ToDouble(d) * 4.536e+8); - } - else if (textTo == l.Ounces) - { - ShowResult(Convert.ToDouble(d) * 16); - } - else if (textTo == l.Carats) - { - ShowResult(Convert.ToDouble(d) * 2268); - } - else if (textTo == l.Drams) - { - ShowResult(Convert.ToDouble(d) * 256); - } - else if (textTo == l.Grains) - { - ShowResult(Convert.ToDouble(d) * 7000); - } - else if (textTo == l.Stones) - { - ShowResult(Convert.ToDouble(d) / 14); - } - } - else if (text == l.Ounces) - { - if (textTo == l.LongTonnes) - { - ShowResult(Convert.ToDouble(d) / 35840); - } - else if (textTo == l.ShortTonnes) - { - ShowResult(Convert.ToDouble(d) / 32000); - } - else if (textTo == l.Tonnes) - { - ShowResult(Convert.ToDouble(d) / 35274); - } - else if (textTo == l.Kilos) - { - ShowResult(Convert.ToDouble(d) / 35.274); - } - else if (textTo == l.Grams) - { - ShowResult(Convert.ToDouble(d) * 28.35); - } - else if (textTo == l.Milligrams) - { - ShowResult(Convert.ToDouble(d) * 28350); - } - else if (textTo == l.Micrograms) - { - ShowResult(Convert.ToDouble(d) * 2.835e+7); - } - else if (textTo == l.Pounds) - { - ShowResult(Convert.ToDouble(d) / 16); - } - else if (textTo == l.Carats) - { - ShowResult(Convert.ToDouble(d) * 142); - } - else if (textTo == l.Drams) - { - ShowResult(Convert.ToDouble(d) * 16); - } - else if (textTo == l.Grains) - { - ShowResult(Convert.ToDouble(d) * 438); - } - else if (textTo == l.Stones) - { - ShowResult(Convert.ToDouble(d) / 224); - } - } - else if (text == l.Carats) - { - if (textTo == l.LongTonnes) - { - ShowResult(Convert.ToDouble(d) / 5.08e+6); - } - else if (textTo == l.ShortTonnes) - { - ShowResult(Convert.ToDouble(d) / 4.536e+6); - } - else if (textTo == l.Tonnes) - { - ShowResult(Convert.ToDouble(d) / 5e+6); - } - else if (textTo == l.Kilos) - { - ShowResult(Convert.ToDouble(d) / 5000); - } - else if (textTo == l.Grams) - { - ShowResult(Convert.ToDouble(d) / 5); - } - else if (textTo == l.Milligrams) - { - ShowResult(Convert.ToDouble(d) * 200); - } - else if (textTo == l.Micrograms) - { - ShowResult(Convert.ToDouble(d) * 200000); - } - else if (textTo == l.Pounds) - { - ShowResult(Convert.ToDouble(d) / 2268); - } - else if (textTo == l.Ounces) - { - ShowResult(Convert.ToDouble(d) / 142); - } - else if (textTo == l.Drams) - { - ShowResult(Convert.ToDouble(d) / 8.859); - } - else if (textTo == l.Grains) - { - ShowResult(Convert.ToDouble(d) * 3.086); - } - else if (textTo == l.Stones) - { - ShowResult(Convert.ToDouble(d) / 31751); - } - } - else if (text == l.Drams) - { - if (textTo == l.LongTonnes) - { - ShowResult(Convert.ToDouble(d) / 573438); - } - else if (textTo == l.ShortTonnes) - { - ShowResult(Convert.ToDouble(d) / 511999); - } - else if (textTo == l.Tonnes) - { - ShowResult(Convert.ToDouble(d) / 564382); - } - else if (textTo == l.Kilos) - { - ShowResult(Convert.ToDouble(d) / 564); - } - else if (textTo == l.Grams) - { - ShowResult(Convert.ToDouble(d) * 1.772); - } - else if (textTo == l.Milligrams) - { - ShowResult(Convert.ToDouble(d) * 1772); - } - else if (textTo == l.Micrograms) - { - ShowResult(Convert.ToDouble(d) * 1.772e+6); - } - else if (textTo == l.Pounds) - { - ShowResult(Convert.ToDouble(d) / 256); - } - else if (textTo == l.Ounces) - { - ShowResult(Convert.ToDouble(d) / 16); - } - else if (textTo == l.Carats) - { - ShowResult(Convert.ToDouble(d) * 8.859); - } - else if (textTo == l.Grains) - { - ShowResult(Convert.ToDouble(d) * 27.344); - } - else if (textTo == l.Stones) - { - ShowResult(Convert.ToDouble(d) / 3584); - } - } - else if (text == l.Grains) - { - if (textTo == l.LongTonnes) - { - ShowResult(Convert.ToDouble(d) / 1.568e+7); - } - else if (textTo == l.ShortTonnes) - { - ShowResult(Convert.ToDouble(d) / 1.4e+7); - } - else if (textTo == l.Tonnes) - { - ShowResult(Convert.ToDouble(d) / 1.543e+7); - } - else if (textTo == l.Kilos) - { - ShowResult(Convert.ToDouble(d) / 15432); - } - else if (textTo == l.Grams) - { - ShowResult(Convert.ToDouble(d) / 15.432); - } - else if (textTo == l.Milligrams) - { - ShowResult(Convert.ToDouble(d) * 64.799); - } - else if (textTo == l.Micrograms) - { - ShowResult(Convert.ToDouble(d) * 64799); - } - else if (textTo == l.Pounds) - { - ShowResult(Convert.ToDouble(d) / 7000); - } - else if (textTo == l.Ounces) - { - ShowResult(Convert.ToDouble(d) / 438); - } - else if (textTo == l.Carats) - { - ShowResult(Convert.ToDouble(d) / 3.086); - } - else if (textTo == l.Drams) - { - ShowResult(Convert.ToDouble(d) / 27.344); - } - else if (textTo == l.Stones) - { - ShowResult(Convert.ToDouble(d) / 98000); - } - } - else if (text == l.Stones) - { - if (textTo == l.LongTonnes) - { - ShowResult(Convert.ToDouble(d) / 160); - } - else if (textTo == l.ShortTonnes) - { - ShowResult(Convert.ToDouble(d) / 143); - } - else if (textTo == l.Tonnes) - { - ShowResult(Convert.ToDouble(d) / 157); - } - else if (textTo == l.Kilos) - { - ShowResult(Convert.ToDouble(d) * 6.35); - } - else if (textTo == l.Grams) - { - ShowResult(Convert.ToDouble(d) * 6350); - } - else if (textTo == l.Milligrams) - { - ShowResult(Convert.ToDouble(d) * 6.35e+6); - } - else if (textTo == l.Micrograms) - { - ShowResult(Convert.ToDouble(d) * 6.35e+9); - } - else if (textTo == l.Pounds) - { - ShowResult(Convert.ToDouble(d) * 14); - } - else if (textTo == l.Ounces) - { - ShowResult(Convert.ToDouble(d) * 224); - } - else if (textTo == l.Carats) - { - ShowResult(Convert.ToDouble(d) * 31751); - } - else if (textTo == l.Drams) - { - ShowResult(Convert.ToDouble(d) * 3584); - } - else if (textTo == l.Grains) - { - ShowResult(Convert.ToDouble(d) * 98000); - } - } - } - else if (cat == l.Volume) - { - if (text == l.CubicKilometers) - { - if (textTo == l.CubicMeters) - { - ShowResult(Convert.ToDouble(d) * 1e+9); - } - else if (textTo == l.Litres) - { - ShowResult(Convert.ToDouble(d) * 1e+12); - } - else if (textTo == l.CubicCentimeters) - { - ShowResult(Convert.ToDouble(d) * 1e+15); - } - else if (textTo == l.CubicMillimeters) - { - ShowResult(Convert.ToDouble(d) * 1e+18); - } - else if (textTo == l.CubicMiles) - { - ShowResult(Convert.ToDouble(d) / 4.168); - } - else if (textTo == l.CubicYards) - { - ShowResult(Convert.ToDouble(d) * 1.308e+9); - } - else if (textTo == l.CubicFTs) - { - ShowResult(Convert.ToDouble(d) * 3.531e+10); - } - else if (textTo == l.CubicInches) - { - ShowResult(Convert.ToDouble(d) * 6.102e+13); - } - else if (textTo == l.OilBarrels) - { - ShowResult(Convert.ToDouble(d) * 6.29e+9); - } - else if (textTo == l.GallonUS) - { - ShowResult(Convert.ToDouble(d) * 2.642e+11); - } - else if (textTo == l.QuartsUS) - { - ShowResult(Convert.ToDouble(d) * 1.057e+12); - } - else if (textTo == l.PintsUS) - { - ShowResult(Convert.ToDouble(d) * 2.113e+12); - } - else if (textTo == l.FluidOuncesUS) - { - ShowResult(Convert.ToDouble(d) * 3.381e+13); - } - else if (textTo == l.Bushels) - { - ShowResult(Convert.ToDouble(d) * 2.838e+10); - } - else if (textTo == l.Pecks) - { - ShowResult(Convert.ToDouble(d) * 1.135e+11); - } - else if (textTo == l.GallonsUK) - { - ShowResult(Convert.ToDouble(d) * 2.2e+11); - } - else if (textTo == l.QuartsUK) - { - ShowResult(Convert.ToDouble(d) * 8.799e+11); - } - else if (textTo == l.PintsUK) - { - ShowResult(Convert.ToDouble(d) * 1.76e+12); - } - else if (textTo == l.FluidOuncesUK) - { - ShowResult(Convert.ToDouble(d) * 3.52e+13); - } - } - else if (text == l.CubicMeters) - { - if (textTo == l.CubicKilometers) - { - ShowResult(Convert.ToDouble(d) / 1e+9); - } - else if (textTo == l.Litres) - { - ShowResult(Convert.ToDouble(d) * 1000); - } - else if (textTo == l.CubicCentimeters) - { - ShowResult(Convert.ToDouble(d) * 1e+6); - } - else if (textTo == l.CubicMillimeters) - { - ShowResult(Convert.ToDouble(d) * 1e+9); - } - else if (textTo == l.CubicMiles) - { - ShowResult(Convert.ToDouble(d) / 4.168e+9); - } - else if (textTo == l.CubicYards) - { - ShowResult(Convert.ToDouble(d) * 1.308); - } - else if (textTo == l.CubicFTs) - { - ShowResult(Convert.ToDouble(d) * 35.315); - } - else if (textTo == l.CubicInches) - { - ShowResult(Convert.ToDouble(d) * 61024); - } - else if (textTo == l.OilBarrels) - { - ShowResult(Convert.ToDouble(d) * 6.29); - } - else if (textTo == l.GallonUS) - { - ShowResult(Convert.ToDouble(d) * 264); - } - else if (textTo == l.QuartsUS) - { - ShowResult(Convert.ToDouble(d) * 1057); - } - else if (textTo == l.PintsUS) - { - ShowResult(Convert.ToDouble(d) * 2113); - } - else if (textTo == l.FluidOuncesUS) - { - ShowResult(Convert.ToDouble(d) * 33814); - } - else if (textTo == l.Bushels) - { - ShowResult(Convert.ToDouble(d) * 28.378); - } - else if (textTo == l.Pecks) - { - ShowResult(Convert.ToDouble(d) * 114); - } - else if (textTo == l.GallonsUK) - { - ShowResult(Convert.ToDouble(d) * 220); - } - else if (textTo == l.QuartsUK) - { - ShowResult(Convert.ToDouble(d) * 880); - } - else if (textTo == l.PintsUK) - { - ShowResult(Convert.ToDouble(d) * 1760); - } - else if (textTo == l.FluidOuncesUK) - { - ShowResult(Convert.ToDouble(d) * 35195); - } - } - else if (text == l.Litres) - { - if (textTo == l.CubicKilometers) - { - ShowResult(Convert.ToDouble(d) / 1e+12); - } - else if (textTo == l.CubicMeters) - { - ShowResult(Convert.ToDouble(d) / 1000); - } - else if (textTo == l.CubicCentimeters) - { - ShowResult(Convert.ToDouble(d) * 1000); - } - else if (textTo == l.CubicMillimeters) - { - ShowResult(Convert.ToDouble(d) * 1e+6); - } - else if (textTo == l.CubicMiles) - { - ShowResult(Convert.ToDouble(d) / 4.168e+12); - } - else if (textTo == l.CubicYards) - { - ShowResult(Convert.ToDouble(d) / 765); - } - else if (textTo == l.CubicFTs) - { - ShowResult(Convert.ToDouble(d) / 28.317); - } - else if (textTo == l.CubicInches) - { - ShowResult(Convert.ToDouble(d) * 61.024); - } - else if (textTo == l.OilBarrels) - { - ShowResult(Convert.ToDouble(d) / 159); - } - else if (textTo == l.GallonUS) - { - ShowResult(Convert.ToDouble(d) / 3.785); - } - else if (textTo == l.QuartsUS) - { - ShowResult(Convert.ToDouble(d) * 1.057); - } - else if (textTo == l.PintsUS) - { - ShowResult(Convert.ToDouble(d) * 2.113); - } - else if (textTo == l.FluidOuncesUS) - { - ShowResult(Convert.ToDouble(d) * 33.814); - } - else if (textTo == l.Bushels) - { - ShowResult(Convert.ToDouble(d) / 35.239); - } - else if (textTo == l.Pecks) - { - ShowResult(Convert.ToDouble(d) / 8.81); - } - else if (textTo == l.GallonsUK) - { - ShowResult(Convert.ToDouble(d) / 4.546); - } - else if (textTo == l.QuartsUK) - { - ShowResult(Convert.ToDouble(d) / 1.137); - } - else if (textTo == l.PintsUK) - { - ShowResult(Convert.ToDouble(d) * 1.76); - } - else if (textTo == l.FluidOuncesUK) - { - ShowResult(Convert.ToDouble(d) * 35.195); - } - } - else if (text == l.CubicCentimeters) - { - if (textTo == l.CubicKilometers) - { - ShowResult(Convert.ToDouble(d) / 1e+15); - } - else if (textTo == l.CubicMeters) - { - ShowResult(Convert.ToDouble(d) / 1e+6); - } - else if (textTo == l.Litres) - { - ShowResult(Convert.ToDouble(d) / 1000); - } - else if (textTo == l.CubicMillimeters) - { - ShowResult(Convert.ToDouble(d) * 1000); - } - else if (textTo == l.CubicMiles) - { - ShowResult(Convert.ToDouble(d) / 4.168e+15); - } - else if (textTo == l.CubicYards) - { - ShowResult(Convert.ToDouble(d) / 764555); - } - else if (textTo == l.CubicFTs) - { - ShowResult(Convert.ToDouble(d) / 28317); - } - else if (textTo == l.CubicInches) - { - ShowResult(Convert.ToDouble(d) / 16.387); - } - else if (textTo == l.OilBarrels) - { - ShowResult(Convert.ToDouble(d) / 158987); - } - else if (textTo == l.GallonUS) - { - ShowResult(Convert.ToDouble(d) / 3785); - } - else if (textTo == l.QuartsUS) - { - ShowResult(Convert.ToDouble(d) / 946); - } - else if (textTo == l.PintsUS) - { - ShowResult(Convert.ToDouble(d) / 473); - } - else if (textTo == l.FluidOuncesUS) - { - ShowResult(Convert.ToDouble(d) / 29.574); - } - else if (textTo == l.Bushels) - { - ShowResult(Convert.ToDouble(d) / 35239); - } - else if (textTo == l.Pecks) - { - ShowResult(Convert.ToDouble(d) / 8810); - } - else if (textTo == l.GallonsUK) - { - ShowResult(Convert.ToDouble(d) / 4546); - } - else if (textTo == l.QuartsUK) - { - ShowResult(Convert.ToDouble(d) / 1137); - } - else if (textTo == l.PintsUK) - { - ShowResult(Convert.ToDouble(d) / 568); - } - else if (textTo == l.FluidOuncesUK) - { - ShowResult(Convert.ToDouble(d) / 28.413); - } - } - else if (text == l.CubicMillimeters) - { - if (textTo == l.CubicKilometers) - { - ShowResult(Convert.ToDouble(d) / 1e+18); - } - else if (textTo == l.CubicMeters) - { - ShowResult(Convert.ToDouble(d) / 1e+9); - } - else if (textTo == l.Litres) - { - ShowResult(Convert.ToDouble(d) / 1e+6); - } - else if (textTo == l.CubicCentimeters) - { - ShowResult(Convert.ToDouble(d) / 1000); - } - else if (textTo == l.CubicMiles) - { - ShowResult(Convert.ToDouble(d) / 4.168e+18); - } - else if (textTo == l.CubicYards) - { - ShowResult(Convert.ToDouble(d) / 7.646e+8); - } - else if (textTo == l.CubicFTs) - { - ShowResult(Convert.ToDouble(d) / 2.832e+7); - } - else if (textTo == l.CubicInches) - { - ShowResult(Convert.ToDouble(d) / 16387); - } - else if (textTo == l.OilBarrels) - { - ShowResult(Convert.ToDouble(d) / 1.59e+8); - } - else if (textTo == l.GallonUS) - { - ShowResult(Convert.ToDouble(d) / 3.785e+6); - } - else if (textTo == l.QuartsUS) - { - ShowResult(Convert.ToDouble(d) / 946353); - } - else if (textTo == l.PintsUS) - { - ShowResult(Convert.ToDouble(d) / 473176); - } - else if (textTo == l.FluidOuncesUS) - { - ShowResult(Convert.ToDouble(d) / 29574); - } - else if (textTo == l.Bushels) - { - ShowResult(Convert.ToDouble(d) / 3.524e+7); - } - else if (textTo == l.Pecks) - { - ShowResult(Convert.ToDouble(d) / 8.81e+6); - } - else if (textTo == l.GallonsUK) - { - ShowResult(Convert.ToDouble(d) / 4.546e+6); - } - else if (textTo == l.QuartsUK) - { - ShowResult(Convert.ToDouble(d) / 1.137e+6); - } - else if (textTo == l.PintsUK) - { - ShowResult(Convert.ToDouble(d) / 568261); - } - else if (textTo == l.FluidOuncesUK) - { - ShowResult(Convert.ToDouble(d) / 28413); - } - } - else if (text == l.CubicMiles) - { - if (textTo == l.CubicKilometers) - { - ShowResult(Convert.ToDouble(d) * 4.168); - } - else if (textTo == l.CubicMeters) - { - ShowResult(Convert.ToDouble(d) * 4.168e+9); - } - else if (textTo == l.Litres) - { - ShowResult(Convert.ToDouble(d) * 4.168e+12); - } - else if (textTo == l.CubicCentimeters) - { - ShowResult(Convert.ToDouble(d) * 4.168e+15); - } - else if (textTo == l.CubicMillimeters) - { - ShowResult(Convert.ToDouble(d) * 4.168e+18); - } - else if (textTo == l.CubicYards) - { - ShowResult(Convert.ToDouble(d) * 5.452e+9); - } - else if (textTo == l.CubicFTs) - { - ShowResult(Convert.ToDouble(d) * 1.472e+11); - } - else if (textTo == l.CubicInches) - { - ShowResult(Convert.ToDouble(d) * 2.544e+14); - } - else if (textTo == l.OilBarrels) - { - ShowResult(Convert.ToDouble(d) * 2.622e+10); - } - else if (textTo == l.GallonUS) - { - ShowResult(Convert.ToDouble(d) * 1.101e+12); - } - else if (textTo == l.QuartsUS) - { - ShowResult(Convert.ToDouble(d) * 4.404e+12); - } - else if (textTo == l.PintsUS) - { - ShowResult(Convert.ToDouble(d) * 8.809e+12); - } - else if (textTo == l.FluidOuncesUS) - { - ShowResult(Convert.ToDouble(d) * 1.409e+14); - } - else if (textTo == l.Bushels) - { - ShowResult(Convert.ToDouble(d) * 1.183e+11); - } - else if (textTo == l.Pecks) - { - ShowResult(Convert.ToDouble(d) * 4.731e+11); - } - else if (textTo == l.GallonsUK) - { - ShowResult(Convert.ToDouble(d) * 9.169e+11); - } - else if (textTo == l.QuartsUK) - { - ShowResult(Convert.ToDouble(d) * 3.667e+12); - } - else if (textTo == l.PintsUK) - { - ShowResult(Convert.ToDouble(d) * 7.335e+12); - } - else if (textTo == l.FluidOuncesUK) - { - ShowResult(Convert.ToDouble(d) * 1.467e+14); - } - } - else if (text == l.CubicYards) - { - if (textTo == l.CubicKilometers) - { - ShowResult(Convert.ToDouble(d) / 1.308e+9); - } - else if (textTo == l.CubicMeters) - { - ShowResult(Convert.ToDouble(d) / 1.308); - } - else if (textTo == l.Litres) - { - ShowResult(Convert.ToDouble(d) * 765); - } - else if (textTo == l.CubicCentimeters) - { - ShowResult(Convert.ToDouble(d) * 764555); - } - else if (textTo == l.CubicMillimeters) - { - ShowResult(Convert.ToDouble(d) * 7.646e+8); - } - else if (textTo == l.CubicMiles) - { - ShowResult(Convert.ToDouble(d) / 5.452e+9); - } - else if (textTo == l.CubicFTs) - { - ShowResult(Convert.ToDouble(d) * 27); - } - else if (textTo == l.CubicInches) - { - ShowResult(Convert.ToDouble(d) * 46656); - } - else if (textTo == l.OilBarrels) - { - ShowResult(Convert.ToDouble(d) * 4.809); - } - else if (textTo == l.GallonUS) - { - ShowResult(Convert.ToDouble(d) * 202); - } - else if (textTo == l.QuartsUS) - { - ShowResult(Convert.ToDouble(d) * 808); - } - else if (textTo == l.PintsUS) - { - ShowResult(Convert.ToDouble(d) * 1616); - } - else if (textTo == l.FluidOuncesUS) - { - ShowResult(Convert.ToDouble(d) * 25853); - } - else if (textTo == l.Bushels) - { - ShowResult(Convert.ToDouble(d) * 21.696); - } - else if (textTo == l.Pecks) - { - ShowResult(Convert.ToDouble(d) * 86.785); - } - else if (textTo == l.GallonsUK) - { - ShowResult(Convert.ToDouble(d) * 168); - } - else if (textTo == l.QuartsUK) - { - ShowResult(Convert.ToDouble(d) * 673); - } - else if (textTo == l.PintsUK) - { - ShowResult(Convert.ToDouble(d) * 1345); - } - else if (textTo == l.FluidOuncesUK) - { - ShowResult(Convert.ToDouble(d) * 26909); - } - } - else if (text == l.CubicFTs) - { - if (textTo == l.CubicKilometers) - { - ShowResult(Convert.ToDouble(d) / 3.531e+10); - } - else if (textTo == l.CubicMeters) - { - ShowResult(Convert.ToDouble(d) / 35.315); - } - else if (textTo == l.Litres) - { - ShowResult(Convert.ToDouble(d) * 28.317); - } - else if (textTo == l.CubicCentimeters) - { - ShowResult(Convert.ToDouble(d) * 28317); - } - else if (textTo == l.CubicMillimeters) - { - ShowResult(Convert.ToDouble(d) * 2.832e+7); - } - else if (textTo == l.CubicMiles) - { - ShowResult(Convert.ToDouble(d) / 1.472e+11); - } - else if (textTo == l.CubicYards) - { - ShowResult(Convert.ToDouble(d) / 27); - } - else if (textTo == l.CubicInches) - { - ShowResult(Convert.ToDouble(d) * 1728); - } - else if (textTo == l.OilBarrels) - { - ShowResult(Convert.ToDouble(d) / 5.615); - } - else if (textTo == l.GallonUS) - { - ShowResult(Convert.ToDouble(d) * 7.481); - } - else if (textTo == l.QuartsUS) - { - ShowResult(Convert.ToDouble(d) * 29.922); - } - else if (textTo == l.PintsUS) - { - ShowResult(Convert.ToDouble(d) * 59.844); - } - else if (textTo == l.FluidOuncesUS) - { - ShowResult(Convert.ToDouble(d) * 958); - } - else if (textTo == l.Bushels) - { - ShowResult(Convert.ToDouble(d) / 1.244); - } - else if (textTo == l.Pecks) - { - ShowResult(Convert.ToDouble(d) * 3.214); - } - else if (textTo == l.GallonsUK) - { - ShowResult(Convert.ToDouble(d) * 6.229); - } - else if (textTo == l.QuartsUK) - { - ShowResult(Convert.ToDouble(d) * 24.915); - } - else if (textTo == l.PintsUK) - { - ShowResult(Convert.ToDouble(d) * 49.831); - } - else if (textTo == l.FluidOuncesUK) - { - ShowResult(Convert.ToDouble(d) * 997); - } - } - else if (text == l.CubicInches) - { - if (textTo == l.CubicKilometers) - { - ShowResult(Convert.ToDouble(d) / 6.102e+13); - } - else if (textTo == l.CubicMeters) - { - ShowResult(Convert.ToDouble(d) / 61024); - } - else if (textTo == l.Litres) - { - ShowResult(Convert.ToDouble(d) / 61.024); - } - else if (textTo == l.CubicCentimeters) - { - ShowResult(Convert.ToDouble(d) * 16.387); - } - else if (textTo == l.CubicMillimeters) - { - ShowResult(Convert.ToDouble(d) * 16387); - } - else if (textTo == l.CubicMiles) - { - ShowResult(Convert.ToDouble(d) / 2.544e+14); - } - else if (textTo == l.CubicYards) - { - ShowResult(Convert.ToDouble(d) / 46656); - } - else if (textTo == l.CubicFTs) - { - ShowResult(Convert.ToDouble(d) / 1728); - } - else if (textTo == l.OilBarrels) - { - ShowResult(Convert.ToDouble(d) / 9702); - } - else if (textTo == l.GallonUS) - { - ShowResult(Convert.ToDouble(d) / 231); - } - else if (textTo == l.QuartsUS) - { - ShowResult(Convert.ToDouble(d) / 57.75); - } - else if (textTo == l.PintsUS) - { - ShowResult(Convert.ToDouble(d) / 28.875); - } - else if (textTo == l.FluidOuncesUS) - { - ShowResult(Convert.ToDouble(d) / 1.805); - } - else if (textTo == l.Bushels) - { - ShowResult(Convert.ToDouble(d) / 2150); - } - else if (textTo == l.Pecks) - { - ShowResult(Convert.ToDouble(d) / 538); - } - else if (textTo == l.GallonsUK) - { - ShowResult(Convert.ToDouble(d) / 277); - } - else if (textTo == l.QuartsUK) - { - ShowResult(Convert.ToDouble(d) / 69.355); - } - else if (textTo == l.PintsUK) - { - ShowResult(Convert.ToDouble(d) / 34.677); - } - else if (textTo == l.FluidOuncesUK) - { - ShowResult(Convert.ToDouble(d) / 1.734); - } - } - else if (text == l.OilBarrels) - { - if (textTo == l.CubicKilometers) - { - ShowResult(Convert.ToDouble(d) / 6.29e+9); - } - else if (textTo == l.CubicMeters) - { - ShowResult(Convert.ToDouble(d) / 6.29); - } - else if (textTo == l.Litres) - { - ShowResult(Convert.ToDouble(d) * 159); - } - else if (textTo == l.CubicCentimeters) - { - ShowResult(Convert.ToDouble(d) * 158987); - } - else if (textTo == l.CubicMillimeters) - { - ShowResult(Convert.ToDouble(d) * 1.59e+8); - } - else if (textTo == l.CubicMiles) - { - ShowResult(Convert.ToDouble(d) / 2.622e+10); - } - else if (textTo == l.CubicYards) - { - ShowResult(Convert.ToDouble(d) / 4.809); - } - else if (textTo == l.CubicFTs) - { - ShowResult(Convert.ToDouble(d) * 5.615); - } - else if (textTo == l.CubicInches) - { - ShowResult(Convert.ToDouble(d) * 9702); - } - else if (textTo == l.GallonUS) - { - ShowResult(Convert.ToDouble(d) * 42); - } - else if (textTo == l.QuartsUS) - { - ShowResult(Convert.ToDouble(d) * 168); - } - else if (textTo == l.PintsUS) - { - ShowResult(Convert.ToDouble(d) * 336); - } - else if (textTo == l.FluidOuncesUS) - { - ShowResult(Convert.ToDouble(d) * 5376); - } - else if (textTo == l.Bushels) - { - ShowResult(Convert.ToDouble(d) * 4.512); - } - else if (textTo == l.Pecks) - { - ShowResult(Convert.ToDouble(d) * 18.047); - } - else if (textTo == l.GallonsUK) - { - ShowResult(Convert.ToDouble(d) * 34.972); - } - else if (textTo == l.QuartsUK) - { - ShowResult(Convert.ToDouble(d) * 140); - } - else if (textTo == l.PintsUK) - { - ShowResult(Convert.ToDouble(d) * 280); - } - else if (textTo == l.FluidOuncesUK) - { - ShowResult(Convert.ToDouble(d) * 5596); - } - } - else if (text == l.GallonUS) - { - if (textTo == l.CubicKilometers) - { - ShowResult(Convert.ToDouble(d) / 2.642e+11); - } - else if (textTo == l.CubicMeters) - { - ShowResult(Convert.ToDouble(d) / 264); - } - else if (textTo == l.Litres) - { - ShowResult(Convert.ToDouble(d) * 3.785); - } - else if (textTo == l.CubicCentimeters) - { - ShowResult(Convert.ToDouble(d) * 3785); - } - else if (textTo == l.CubicMillimeters) - { - ShowResult(Convert.ToDouble(d) * 3.785e+6); - } - else if (textTo == l.CubicMiles) - { - ShowResult(Convert.ToDouble(d) / 1.101e+12); - } - else if (textTo == l.CubicYards) - { - ShowResult(Convert.ToDouble(d) / 202); - } - else if (textTo == l.CubicFTs) - { - ShowResult(Convert.ToDouble(d) / 7.481); - } - else if (textTo == l.CubicInches) - { - ShowResult(Convert.ToDouble(d) * 231); - } - else if (textTo == l.OilBarrels) - { - ShowResult(Convert.ToDouble(d) / 42); - } - else if (textTo == l.QuartsUS) - { - ShowResult(Convert.ToDouble(d) * 4); - } - else if (textTo == l.PintsUS) - { - ShowResult(Convert.ToDouble(d) * 8); - } - else if (textTo == l.FluidOuncesUS) - { - ShowResult(Convert.ToDouble(d) * 128); - } - else if (textTo == l.Bushels) - { - ShowResult(Convert.ToDouble(d) / 9.309); - } - else if (textTo == l.Pecks) - { - ShowResult(Convert.ToDouble(d) / 2.327); - } - else if (textTo == l.GallonsUK) - { - ShowResult(Convert.ToDouble(d) / 1.201); - } - else if (textTo == l.QuartsUK) - { - ShowResult(Convert.ToDouble(d) * 3.331); - } - else if (textTo == l.PintsUK) - { - ShowResult(Convert.ToDouble(d) * 6.661); - } - else if (textTo == l.FluidOuncesUK) - { - ShowResult(Convert.ToDouble(d) * 133); - } - } - else if (text == l.QuartsUS) - { - if (textTo == l.CubicKilometers) - { - ShowResult(Convert.ToDouble(d) / 1.057e+12); - } - else if (textTo == l.CubicMeters) - { - ShowResult(Convert.ToDouble(d) / 1057); - } - else if (textTo == l.Litres) - { - ShowResult(Convert.ToDouble(d) / 1.057); - } - else if (textTo == l.CubicCentimeters) - { - ShowResult(Convert.ToDouble(d) * 946); - } - else if (textTo == l.CubicMillimeters) - { - ShowResult(Convert.ToDouble(d) * 946353); - } - else if (textTo == l.CubicMiles) - { - ShowResult(Convert.ToDouble(d) / 4.404e+12); - } - else if (textTo == l.CubicYards) - { - ShowResult(Convert.ToDouble(d) / 808); - } - else if (textTo == l.CubicFTs) - { - ShowResult(Convert.ToDouble(d) / 29.922); - } - else if (textTo == l.CubicInches) - { - ShowResult(Convert.ToDouble(d) * 57.75); - } - else if (textTo == l.OilBarrels) - { - ShowResult(Convert.ToDouble(d) / 168); - } - else if (textTo == l.GallonUS) - { - ShowResult(Convert.ToDouble(d) / 4); - } - else if (textTo == l.PintsUS) - { - ShowResult(Convert.ToDouble(d) * 2); - } - else if (textTo == l.FluidOuncesUS) - { - ShowResult(Convert.ToDouble(d) * 32); - } - else if (textTo == l.Bushels) - { - ShowResult(Convert.ToDouble(d) / 37.237); - } - else if (textTo == l.Pecks) - { - ShowResult(Convert.ToDouble(d) / 9.309); - } - else if (textTo == l.GallonsUK) - { - ShowResult(Convert.ToDouble(d) / 4.804); - } - else if (textTo == l.QuartsUK) - { - ShowResult(Convert.ToDouble(d) / 1.201); - } - else if (textTo == l.PintsUK) - { - ShowResult(Convert.ToDouble(d) * 1.665); - } - else if (textTo == l.FluidOuncesUK) - { - ShowResult(Convert.ToDouble(d) * 33.307); - } - } - else if (text == l.PintsUS) - { - if (textTo == l.CubicKilometers) - { - ShowResult(Convert.ToDouble(d) / 2.113e+12); - } - else if (textTo == l.CubicMeters) - { - ShowResult(Convert.ToDouble(d) / 2113); - } - else if (textTo == l.Litres) - { - ShowResult(Convert.ToDouble(d) / 2.113); - } - else if (textTo == l.CubicCentimeters) - { - ShowResult(Convert.ToDouble(d) * 473); - } - else if (textTo == l.CubicMillimeters) - { - ShowResult(Convert.ToDouble(d) * 473176); - } - else if (textTo == l.CubicMiles) - { - ShowResult(Convert.ToDouble(d) / 8.809e+12); - } - else if (textTo == l.CubicYards) - { - ShowResult(Convert.ToDouble(d) / 1616); - } - else if (textTo == l.CubicFTs) - { - ShowResult(Convert.ToDouble(d) / 59.844); - } - else if (textTo == l.CubicInches) - { - ShowResult(Convert.ToDouble(d) * 28.875); - } - else if (textTo == l.OilBarrels) - { - ShowResult(Convert.ToDouble(d) / 336); - } - else if (textTo == l.GallonUS) - { - ShowResult(Convert.ToDouble(d) / 8); - } - else if (textTo == l.QuartsUS) - { - ShowResult(Convert.ToDouble(d) / 2); - } - else if (textTo == l.FluidOuncesUS) - { - ShowResult(Convert.ToDouble(d) * 16); - } - else if (textTo == l.Bushels) - { - ShowResult(Convert.ToDouble(d) / 74.473); - } - else if (textTo == l.Pecks) - { - ShowResult(Convert.ToDouble(d) / 18.618); - } - else if (textTo == l.GallonsUK) - { - ShowResult(Convert.ToDouble(d) / 9.608); - } - else if (textTo == l.QuartsUK) - { - ShowResult(Convert.ToDouble(d) / 2.402); - } - else if (textTo == l.PintsUK) - { - ShowResult(Convert.ToDouble(d) / 1.201); - } - else if (textTo == l.FluidOuncesUK) - { - ShowResult(Convert.ToDouble(d) * 16.653); - } - } - else if (text == l.FluidOuncesUS) - { - if (textTo == l.CubicKilometers) - { - ShowResult(Convert.ToDouble(d) / 3.381e+13); - } - else if (textTo == l.CubicMeters) - { - ShowResult(Convert.ToDouble(d) / 33814); - } - else if (textTo == l.Litres) - { - ShowResult(Convert.ToDouble(d) / 33.814); - } - else if (textTo == l.CubicCentimeters) - { - ShowResult(Convert.ToDouble(d) * 29.574); - } - else if (textTo == l.CubicMillimeters) - { - ShowResult(Convert.ToDouble(d) * 29574); - } - else if (textTo == l.CubicMiles) - { - ShowResult(Convert.ToDouble(d) / 1.409e+14); - } - else if (textTo == l.CubicYards) - { - ShowResult(Convert.ToDouble(d) / 25853); - } - else if (textTo == l.CubicFTs) - { - ShowResult(Convert.ToDouble(d) / 958); - } - else if (textTo == l.CubicInches) - { - ShowResult(Convert.ToDouble(d) * 1.805); - } - else if (textTo == l.OilBarrels) - { - ShowResult(Convert.ToDouble(d) / 5376); - } - else if (textTo == l.GallonUS) - { - ShowResult(Convert.ToDouble(d) / 128); - } - else if (textTo == l.QuartsUS) - { - ShowResult(Convert.ToDouble(d) / 32); - } - else if (textTo == l.PintsUS) - { - ShowResult(Convert.ToDouble(d) / 16); - } - else if (textTo == l.Bushels) - { - ShowResult(Convert.ToDouble(d) / 1192); - } - else if (textTo == l.Pecks) - { - ShowResult(Convert.ToDouble(d) / 298); - } - else if (textTo == l.GallonsUK) - { - ShowResult(Convert.ToDouble(d) / 154); - } - else if (textTo == l.QuartsUK) - { - ShowResult(Convert.ToDouble(d) / 38.43); - } - else if (textTo == l.PintsUK) - { - ShowResult(Convert.ToDouble(d) / 19.215); - } - else if (textTo == l.FluidOuncesUK) - { - ShowResult(Convert.ToDouble(d) * 1.041); - } - } - else if (text == l.Bushels) - { - if (textTo == l.CubicKilometers) - { - ShowResult(Convert.ToDouble(d) / 2.838e+10); - } - else if (textTo == l.CubicMeters) - { - ShowResult(Convert.ToDouble(d) / 28.378); - } - else if (textTo == l.Litres) - { - ShowResult(Convert.ToDouble(d) * 35.239); - } - else if (textTo == l.CubicCentimeters) - { - ShowResult(Convert.ToDouble(d) * 35239); - } - else if (textTo == l.CubicMillimeters) - { - ShowResult(Convert.ToDouble(d) * 3.524e+7); - } - else if (textTo == l.CubicMiles) - { - ShowResult(Convert.ToDouble(d) / 1.183e+11); - } - else if (textTo == l.CubicYards) - { - ShowResult(Convert.ToDouble(d) / 21.696); - } - else if (textTo == l.CubicFTs) - { - ShowResult(Convert.ToDouble(d) * 1.244); - } - else if (textTo == l.CubicInches) - { - ShowResult(Convert.ToDouble(d) * 2150); - } - else if (textTo == l.OilBarrels) - { - ShowResult(Convert.ToDouble(d) / 4.512); - } - else if (textTo == l.GallonUS) - { - ShowResult(Convert.ToDouble(d) * 9.309); - } - else if (textTo == l.QuartsUS) - { - ShowResult(Convert.ToDouble(d) * 37.237); - } - else if (textTo == l.PintsUS) - { - ShowResult(Convert.ToDouble(d) * 74.473); - } - else if (textTo == l.FluidOuncesUS) - { - ShowResult(Convert.ToDouble(d) * 1192); - } - else if (textTo == l.Pecks) - { - ShowResult(Convert.ToDouble(d) * 4); - } - else if (textTo == l.GallonsUK) - { - ShowResult(Convert.ToDouble(d) * 7.752); - } - else if (textTo == l.QuartsUK) - { - ShowResult(Convert.ToDouble(d) * 31.006); - } - else if (textTo == l.PintsUK) - { - ShowResult(Convert.ToDouble(d) * 62.012); - } - else if (textTo == l.FluidOuncesUK) - { - ShowResult(Convert.ToDouble(d) * 1240); - } - } - else if (text == l.Pecks) - { - if (textTo == l.CubicKilometers) - { - ShowResult(Convert.ToDouble(d) / 1.135e+11); - } - else if (textTo == l.CubicMeters) - { - ShowResult(Convert.ToDouble(d) / 114); - } - else if (textTo == l.Litres) - { - ShowResult(Convert.ToDouble(d) * 8.81); - } - else if (textTo == l.CubicCentimeters) - { - ShowResult(Convert.ToDouble(d) * 8810); - } - else if (textTo == l.CubicMillimeters) - { - ShowResult(Convert.ToDouble(d) * 8.81e+6); - } - else if (textTo == l.CubicMiles) - { - ShowResult(Convert.ToDouble(d) / 4.731e+11); - } - else if (textTo == l.CubicYards) - { - ShowResult(Convert.ToDouble(d) / 86.785); - } - else if (textTo == l.CubicFTs) - { - ShowResult(Convert.ToDouble(d) / 3.214); - } - else if (textTo == l.CubicInches) - { - ShowResult(Convert.ToDouble(d) * 538); - } - else if (textTo == l.OilBarrels) - { - ShowResult(Convert.ToDouble(d) / 18.047); - } - else if (textTo == l.GallonUS) - { - ShowResult(Convert.ToDouble(d) * 2.327); - } - else if (textTo == l.QuartsUS) - { - ShowResult(Convert.ToDouble(d) * 9.309); - } - else if (textTo == l.PintsUS) - { - ShowResult(Convert.ToDouble(d) * 18.618); - } - else if (textTo == l.FluidOuncesUS) - { - ShowResult(Convert.ToDouble(d) * 298); - } - else if (textTo == l.Bushels) - { - ShowResult(Convert.ToDouble(d) / 4); - } - else if (textTo == l.GallonsUK) - { - ShowResult(Convert.ToDouble(d) * 1.938); - } - else if (textTo == l.QuartsUK) - { - ShowResult(Convert.ToDouble(d) * 7.752); - } - else if (textTo == l.PintsUK) - { - ShowResult(Convert.ToDouble(d) * 15.503); - } - else if (textTo == l.FluidOuncesUK) - { - ShowResult(Convert.ToDouble(d) * 310); - } - } - else if (text == l.GallonsUK) - { - if (textTo == l.CubicKilometers) - { - ShowResult(Convert.ToDouble(d) / 2.2e+11); - } - else if (textTo == l.CubicMeters) - { - ShowResult(Convert.ToDouble(d) / 220); - } - else if (textTo == l.Litres) - { - ShowResult(Convert.ToDouble(d) * 4.546); - } - else if (textTo == l.CubicCentimeters) - { - ShowResult(Convert.ToDouble(d) * 4546); - } - else if (textTo == l.CubicMillimeters) - { - ShowResult(Convert.ToDouble(d) * 4.546e+6); - } - else if (textTo == l.CubicMiles) - { - ShowResult(Convert.ToDouble(d) / 9.169e+11); - } - else if (textTo == l.CubicYards) - { - ShowResult(Convert.ToDouble(d) / 168); - } - else if (textTo == l.CubicFTs) - { - ShowResult(Convert.ToDouble(d) / 6.229); - } - else if (textTo == l.CubicInches) - { - ShowResult(Convert.ToDouble(d) * 277); - } - else if (textTo == l.OilBarrels) - { - ShowResult(Convert.ToDouble(d) / 34.972); - } - else if (textTo == l.GallonUS) - { - ShowResult(Convert.ToDouble(d) * 1.201); - } - else if (textTo == l.QuartsUS) - { - ShowResult(Convert.ToDouble(d) * 4.804); - } - else if (textTo == l.PintsUS) - { - ShowResult(Convert.ToDouble(d) * 9.608); - } - else if (textTo == l.FluidOuncesUS) - { - ShowResult(Convert.ToDouble(d) * 154); - } - else if (textTo == l.Bushels) - { - ShowResult(Convert.ToDouble(d) / 7.752); - } - else if (textTo == l.Pecks) - { - ShowResult(Convert.ToDouble(d) / 1.938); - } - else if (textTo == l.QuartsUK) - { - ShowResult(Convert.ToDouble(d) * 4); - } - else if (textTo == l.PintsUK) - { - ShowResult(Convert.ToDouble(d) * 8); - } - else if (textTo == l.FluidOuncesUK) - { - ShowResult(Convert.ToDouble(d) * 160); - } - } - else if (text == l.QuartsUK) - { - if (textTo == l.CubicKilometers) - { - ShowResult(Convert.ToDouble(d) / 2.2e+11); - } - else if (textTo == l.CubicMeters) - { - ShowResult(Convert.ToDouble(d) / 880); - } - else if (textTo == l.Litres) - { - ShowResult(Convert.ToDouble(d) * 1.137); - } - else if (textTo == l.CubicCentimeters) - { - ShowResult(Convert.ToDouble(d) * 4546); - } - else if (textTo == l.CubicMillimeters) - { - ShowResult(Convert.ToDouble(d) * 4.546e+6); - } - else if (textTo == l.CubicMiles) - { - ShowResult(Convert.ToDouble(d) / 9.169e+11); - } - else if (textTo == l.CubicYards) - { - ShowResult(Convert.ToDouble(d) / 168); - } - else if (textTo == l.CubicFTs) - { - ShowResult(Convert.ToDouble(d) / 24.915); - } - else if (textTo == l.CubicInches) - { - ShowResult(Convert.ToDouble(d) * 69.355); - } - else if (textTo == l.OilBarrels) - { - ShowResult(Convert.ToDouble(d) / 34.972); - } - else if (textTo == l.GallonUS) - { - ShowResult(Convert.ToDouble(d) / 3.331); - } - else if (textTo == l.QuartsUS) - { - ShowResult(Convert.ToDouble(d) * 1.201); - } - else if (textTo == l.PintsUS) - { - ShowResult(Convert.ToDouble(d) * 2.402); - } - else if (textTo == l.FluidOuncesUS) - { - ShowResult(Convert.ToDouble(d) * 38.43); - } - else if (textTo == l.Bushels) - { - ShowResult(Convert.ToDouble(d) / 7.752); - } - else if (textTo == l.Pecks) - { - ShowResult(Convert.ToDouble(d) / 1.938); - } - else if (textTo == l.GallonsUK) - { - ShowResult(Convert.ToDouble(d) / 4); - } - else if (textTo == l.PintsUK) - { - ShowResult(Convert.ToDouble(d) * 4); - } - else if (textTo == l.FluidOuncesUK) - { - ShowResult(Convert.ToDouble(d) * 160); - } - } - else if (text == l.PintsUK) - { - if (textTo == l.CubicKilometers) - { - ShowResult(Convert.ToDouble(d) / 1.76e+12); - } - else if (textTo == l.CubicMeters) - { - ShowResult(Convert.ToDouble(d) / 1760); - } - else if (textTo == l.Litres) - { - ShowResult(Convert.ToDouble(d) / 1.76); - } - else if (textTo == l.CubicCentimeters) - { - ShowResult(Convert.ToDouble(d) * 568); - } - else if (textTo == l.CubicMillimeters) - { - ShowResult(Convert.ToDouble(d) * 568261); - } - else if (textTo == l.CubicMiles) - { - ShowResult(Convert.ToDouble(d) / 7.335e+12); - } - else if (textTo == l.CubicYards) - { - ShowResult(Convert.ToDouble(d) / 1345); - } - else if (textTo == l.CubicFTs) - { - ShowResult(Convert.ToDouble(d) / 49.831); - } - else if (textTo == l.CubicInches) - { - ShowResult(Convert.ToDouble(d) * 34.677); - } - else if (textTo == l.OilBarrels) - { - ShowResult(Convert.ToDouble(d) / 280); - } - else if (textTo == l.GallonUS) - { - ShowResult(Convert.ToDouble(d) / 6.661); - } - else if (textTo == l.QuartsUS) - { - ShowResult(Convert.ToDouble(d) / 1.665); - } - else if (textTo == l.PintsUS) - { - ShowResult(Convert.ToDouble(d)); - } - else if (textTo == l.FluidOuncesUS) - { - ShowResult(Convert.ToDouble(d) * 1.201); - } - else if (textTo == l.Bushels) - { - ShowResult(Convert.ToDouble(d) / 62.012); - } - else if (textTo == l.Pecks) - { - ShowResult(Convert.ToDouble(d) / 15.503); - } - else if (textTo == l.GallonsUK) - { - ShowResult(Convert.ToDouble(d) / 8); - } - else if (textTo == l.QuartsUK) - { - ShowResult(Convert.ToDouble(d) / 2); - } - else if (textTo == l.FluidOuncesUK) - { - ShowResult(Convert.ToDouble(d) * 20); - } - } - else if (text == l.FluidOuncesUK) - { - if (textTo == l.CubicKilometers) - { - ShowResult(Convert.ToDouble(d) / 3.52e+13); - } - else if (textTo == l.CubicMeters) - { - ShowResult(Convert.ToDouble(d) / 35195); - } - else if (textTo == l.Litres) - { - ShowResult(Convert.ToDouble(d) / 35.195); - } - else if (textTo == l.CubicCentimeters) - { - ShowResult(Convert.ToDouble(d) * 28.413); - } - else if (textTo == l.CubicMillimeters) - { - ShowResult(Convert.ToDouble(d) * 28413); - } - else if (textTo == l.CubicMiles) - { - ShowResult(Convert.ToDouble(d) / 1.467e+14); - } - else if (textTo == l.CubicYards) - { - ShowResult(Convert.ToDouble(d) / 26909); - } - else if (textTo == l.CubicFTs) - { - ShowResult(Convert.ToDouble(d) / 997); - } - else if (textTo == l.CubicInches) - { - ShowResult(Convert.ToDouble(d) * 1.734); - } - else if (textTo == l.OilBarrels) - { - ShowResult(Convert.ToDouble(d) / 5596); - } - else if (textTo == l.GallonUS) - { - ShowResult(Convert.ToDouble(d) / 133); - } - else if (textTo == l.QuartsUS) - { - ShowResult(Convert.ToDouble(d) / 33.307); - } - else if (textTo == l.PintsUS) - { - ShowResult(Convert.ToDouble(d) / 16.653); - } - else if (textTo == l.FluidOuncesUS) - { - ShowResult(Convert.ToDouble(d) / 1.041); - } - else if (textTo == l.Bushels) - { - ShowResult(Convert.ToDouble(d) / 1240); - } - else if (textTo == l.Pecks) - { - ShowResult(Convert.ToDouble(d) / 310); - } - else if (textTo == l.GallonsUK) - { - ShowResult(Convert.ToDouble(d) / 160); - } - else if (textTo == l.QuartsUK) - { - ShowResult(Convert.ToDouble(d) / 40); - } - else if (textTo == l.PintsUK) - { - ShowResult(Convert.ToDouble(d) / 20); - } - } - } - else if (cat == l.Area) - { - if (text == l.SquareKilometers) - { - if (textTo == l.SquareMeters) - { - ShowResult(Convert.ToDouble(d) * 1e+6); - } - else if (textTo == l.SquareCentimeters) - { - ShowResult(Convert.ToDouble(d) * 1e+10); - } - else if (textTo == l.SquareMillimeters) - { - ShowResult(Convert.ToDouble(d) * 1e+12); - } - else if (textTo == l.SquareMiles) - { - ShowResult(Convert.ToDouble(d) / 2.59); - } - else if (textTo == l.SquareYards) - { - ShowResult(Convert.ToDouble(d) * 1.196e+6); - } - else if (textTo == l.SquareFTs) - { - ShowResult(Convert.ToDouble(d) * 1.076e+7); - } - else if (textTo == l.SquareInches) - { - ShowResult(Convert.ToDouble(d) * 1.55e+9); - } - else if (textTo == l.Hectares) - { - ShowResult(Convert.ToDouble(d) * 100); - } - else if (textTo == l.Acres) - { - ShowResult(Convert.ToDouble(d) * 247); - } - else if (textTo == l.Ares) - { - ShowResult(Convert.ToDouble(d) * 10000); - } - } - else if (text == l.SquareMeters) - { - if (textTo == l.SquareKilometers) - { - ShowResult(Convert.ToDouble(d) / 1e+6); - } - else if (textTo == l.SquareCentimeters) - { - ShowResult(Convert.ToDouble(d) * 10000); - } - else if (textTo == l.SquareMillimeters) - { - ShowResult(Convert.ToDouble(d) * 1e+6); - } - else if (textTo == l.SquareMiles) - { - ShowResult(Convert.ToDouble(d) / 2.59e+6); - } - else if (textTo == l.SquareYards) - { - ShowResult(Convert.ToDouble(d) * 1.196); - } - else if (textTo == l.SquareFTs) - { - ShowResult(Convert.ToDouble(d) * 10.764); - } - else if (textTo == l.SquareInches) - { - ShowResult(Convert.ToDouble(d) * 1550); - } - else if (textTo == l.Hectares) - { - ShowResult(Convert.ToDouble(d) / 10000); - } - else if (textTo == l.Acres) - { - ShowResult(Convert.ToDouble(d) / 4047); - } - else if (textTo == l.Ares) - { - ShowResult(Convert.ToDouble(d) * 100); - } - } - else if (text == l.SquareCentimeters) - { - if (textTo == l.SquareKilometers) - { - ShowResult(Convert.ToDouble(d) / 1e+10); - } - else if (textTo == l.SquareMeters) - { - ShowResult(Convert.ToDouble(d) / 10000); - } - else if (textTo == l.SquareMillimeters) - { - ShowResult(Convert.ToDouble(d) * 100); - } - else if (textTo == l.SquareMiles) - { - ShowResult(Convert.ToDouble(d) / 2.59e+10); - } - else if (textTo == l.SquareYards) - { - ShowResult(Convert.ToDouble(d) / 8361); - } - else if (textTo == l.SquareFTs) - { - ShowResult(Convert.ToDouble(d) / 929); - } - else if (textTo == l.SquareInches) - { - ShowResult(Convert.ToDouble(d) / 6.452); - } - else if (textTo == l.Hectares) - { - ShowResult(Convert.ToDouble(d) / 1e+8); - } - else if (textTo == l.Acres) - { - ShowResult(Convert.ToDouble(d) / 4.047e+7); - } - else if (textTo == l.Ares) - { - ShowResult(Convert.ToDouble(d) / 1e+6); - } - } - else if (text == l.SquareMillimeters) - { - if (textTo == l.SquareKilometers) - { - ShowResult(Convert.ToDouble(d) / 1e+12); - } - else if (textTo == l.SquareMeters) - { - ShowResult(Convert.ToDouble(d) / 1e+6); - } - else if (textTo == l.SquareCentimeters) - { - ShowResult(Convert.ToDouble(d) / 100); - } - else if (textTo == l.SquareMiles) - { - ShowResult(Convert.ToDouble(d) / 2.59e+12); - } - else if (textTo == l.SquareYards) - { - ShowResult(Convert.ToDouble(d) / 836127); - } - else if (textTo == l.SquareFTs) - { - ShowResult(Convert.ToDouble(d) / 92903); - } - else if (textTo == l.SquareInches) - { - ShowResult(Convert.ToDouble(d) / 645); - } - else if (textTo == l.Hectares) - { - ShowResult(Convert.ToDouble(d) / 1e+10); - } - else if (textTo == l.Acres) - { - ShowResult(Convert.ToDouble(d) / 4.047e+9); - } - else if (textTo == l.Ares) - { - ShowResult(Convert.ToDouble(d) / 1e+8); - } - } - else if (text == l.SquareMiles) - { - if (textTo == l.SquareKilometers) - { - ShowResult(Convert.ToDouble(d) * 2.59); - } - else if (textTo == l.SquareMeters) - { - ShowResult(Convert.ToDouble(d) * 2.59e+6); - } - else if (textTo == l.SquareCentimeters) - { - ShowResult(Convert.ToDouble(d) * 2.59e+10); - } - else if (textTo == l.SquareMillimeters) - { - ShowResult(Convert.ToDouble(d) * 2.59e+12); - } - else if (textTo == l.SquareYards) - { - ShowResult(Convert.ToDouble(d) * 3.098e+6); - } - else if (textTo == l.SquareFTs) - { - ShowResult(Convert.ToDouble(d) * 2.788e+7); - } - else if (textTo == l.SquareInches) - { - ShowResult(Convert.ToDouble(d) * 4.014e+9); - } - else if (textTo == l.Hectares) - { - ShowResult(Convert.ToDouble(d) * 259); - } - else if (textTo == l.Acres) - { - ShowResult(Convert.ToDouble(d) * 640); - } - else if (textTo == l.Ares) - { - ShowResult(Convert.ToDouble(d) * 25900); - } - } - else if (text == l.SquareYards) - { - if (textTo == l.SquareKilometers) - { - ShowResult(Convert.ToDouble(d) / 1.196e+6); - } - else if (textTo == l.SquareMeters) - { - ShowResult(Convert.ToDouble(d) / 1.196); - } - else if (textTo == l.SquareCentimeters) - { - ShowResult(Convert.ToDouble(d) * 8361); - } - else if (textTo == l.SquareMillimeters) - { - ShowResult(Convert.ToDouble(d) * 836127); - } - else if (textTo == l.SquareMiles) - { - ShowResult(Convert.ToDouble(d) / 3.098e+6); - } - else if (textTo == l.SquareFTs) - { - ShowResult(Convert.ToDouble(d) * 9); - } - else if (textTo == l.SquareInches) - { - ShowResult(Convert.ToDouble(d) * 1296); - } - else if (textTo == l.Hectares) - { - ShowResult(Convert.ToDouble(d) / 11960); - } - else if (textTo == l.Acres) - { - ShowResult(Convert.ToDouble(d) / 4840); - } - else if (textTo == l.Ares) - { - ShowResult(Convert.ToDouble(d) / 120); - } - } - else if (text == l.SquareFTs) - { - if (textTo == l.SquareKilometers) - { - ShowResult(Convert.ToDouble(d) / 1.076e+7); - } - else if (textTo == l.SquareMeters) - { - ShowResult(Convert.ToDouble(d) / 10.764); - } - else if (textTo == l.SquareCentimeters) - { - ShowResult(Convert.ToDouble(d) * 929); - } - else if (textTo == l.SquareMillimeters) - { - ShowResult(Convert.ToDouble(d) * 92903); - } - else if (textTo == l.SquareMiles) - { - ShowResult(Convert.ToDouble(d) / 2.788e+7); - } - else if (textTo == l.SquareYards) - { - ShowResult(Convert.ToDouble(d) / 9); - } - else if (textTo == l.SquareInches) - { - ShowResult(Convert.ToDouble(d)); - } - else if (textTo == l.Hectares) - { - ShowResult(Convert.ToDouble(d) * 144); - } - else if (textTo == l.Acres) - { - ShowResult(Convert.ToDouble(d) / 43560); - } - else if (textTo == l.Ares) - { - ShowResult(Convert.ToDouble(d) / 1076); - } - } - else if (text == l.SquareInches) - { - if (textTo == l.SquareKilometers) - { - ShowResult(Convert.ToDouble(d) / 1.55e+9); - } - else if (textTo == l.SquareMeters) - { - ShowResult(Convert.ToDouble(d) / 1550); - } - else if (textTo == l.SquareCentimeters) - { - ShowResult(Convert.ToDouble(d) * 6.452); - } - else if (textTo == l.SquareMillimeters) - { - ShowResult(Convert.ToDouble(d) * 645); - } - else if (textTo == l.SquareMiles) - { - ShowResult(Convert.ToDouble(d) / 4.014e+9); - } - else if (textTo == l.SquareYards) - { - ShowResult(Convert.ToDouble(d) / 1296); - } - else if (textTo == l.SquareFTs) - { - ShowResult(Convert.ToDouble(d) / 144); - } - else if (textTo == l.Hectares) - { - ShowResult(Convert.ToDouble(d) / 1.55e+7); - } - else if (textTo == l.Acres) - { - ShowResult(Convert.ToDouble(d) / 6.273e+6); - } - else if (textTo == l.Ares) - { - ShowResult(Convert.ToDouble(d) / 6.273e+6); - } - } - else if (text == l.Hectares) - { - if (textTo == l.SquareKilometers) - { - ShowResult(Convert.ToDouble(d) / 100); - } - else if (textTo == l.SquareMeters) - { - ShowResult(Convert.ToDouble(d) * 10000); - } - else if (textTo == l.SquareCentimeters) - { - ShowResult(Convert.ToDouble(d) * 1e+8); - } - else if (textTo == l.SquareMillimeters) - { - ShowResult(Convert.ToDouble(d) * 1e+10); - } - else if (textTo == l.SquareMiles) - { - ShowResult(Convert.ToDouble(d) / 259); - } - else if (textTo == l.SquareYards) - { - ShowResult(Convert.ToDouble(d) * 11960); - } - else if (textTo == l.SquareFTs) - { - ShowResult(Convert.ToDouble(d) * 107639); - } - else if (textTo == l.SquareInches) - { - ShowResult(Convert.ToDouble(d) * 1.55e+7); - } - else if (textTo == l.Acres) - { - ShowResult(Convert.ToDouble(d) * 2.471); - } - else if (textTo == l.Ares) - { - ShowResult(Convert.ToDouble(d) * 100); - } - } - else if (text == l.Acres) - { - if (textTo == l.SquareKilometers) - { - ShowResult(Convert.ToDouble(d) / 247); - } - else if (textTo == l.SquareMeters) - { - ShowResult(Convert.ToDouble(d) * 4047); - } - else if (textTo == l.SquareCentimeters) - { - ShowResult(Convert.ToDouble(d) * 4.047e+7); - } - else if (textTo == l.SquareMillimeters) - { - ShowResult(Convert.ToDouble(d) * 4.047e+9); - } - else if (textTo == l.SquareMiles) - { - ShowResult(Convert.ToDouble(d) / 640); - } - else if (textTo == l.SquareYards) - { - ShowResult(Convert.ToDouble(d) * 4840); - } - else if (textTo == l.SquareFTs) - { - ShowResult(Convert.ToDouble(d) * 43560); - } - else if (textTo == l.SquareInches) - { - ShowResult(Convert.ToDouble(d) * 6.273e+6); - } - else if (textTo == l.Hectares) - { - ShowResult(Convert.ToDouble(d) / 2.471); - } - else if (textTo == l.Ares) - { - ShowResult(Convert.ToDouble(d) * 40.469); - } - } - else if (text == l.Ares) - { - if (textTo == l.SquareKilometers) - { - ShowResult(Convert.ToDouble(d) / 10000); - } - else if (textTo == l.SquareMeters) - { - ShowResult(Convert.ToDouble(d) * 100); - } - else if (textTo == l.SquareCentimeters) - { - ShowResult(Convert.ToDouble(d) * 1e+6); - } - else if (textTo == l.SquareMillimeters) - { - ShowResult(Convert.ToDouble(d) * 1e+8); - } - else if (textTo == l.SquareMiles) - { - ShowResult(Convert.ToDouble(d) / 25900); - } - else if (textTo == l.SquareYards) - { - ShowResult(Convert.ToDouble(d) * 120); - } - else if (textTo == l.SquareFTs) - { - ShowResult(Convert.ToDouble(d) * 1076); - } - else if (textTo == l.SquareInches) - { - ShowResult(Convert.ToDouble(d) * 155000); - } - else if (textTo == l.Hectares) - { - ShowResult(Convert.ToDouble(d) / 100); - } - else if (textTo == l.Acres) - { - ShowResult(Convert.ToDouble(d) / 40.469); - } - } - } - else if (cat == l.Time) - { - if (text == l.Hours) - { - if (textTo == l.Minutes) - { - ShowResult(Convert.ToDouble(d) * 60); - } - else if (textTo == l.Seconds) - { - ShowResult(Convert.ToDouble(d) * 3600); - } - else if (textTo == l.Milliseconds) - { - ShowResult(Convert.ToDouble(d) * 3.6e+6); - } - else if (textTo == l.Microseconds) - { - ShowResult(Convert.ToDouble(d) * 3.6e+9); - } - } - else if (text == l.Minutes) - { - if (textTo == l.Hours) - { - ShowResult(Convert.ToDouble(d) / 60); - } - else if (textTo == l.Seconds) - { - ShowResult(Convert.ToDouble(d) * 60); - } - else if (textTo == l.Milliseconds) - { - ShowResult(Convert.ToDouble(d) * 60000); - } - else if (textTo == l.Microseconds) - { - ShowResult(Convert.ToDouble(d) * 6e+7); - } - } - else if (text == l.Seconds) - { - if (textTo == l.Hours) - { - ShowResult(Convert.ToDouble(d) / 3600); - } - else if (textTo == l.Minutes) - { - ShowResult(Convert.ToDouble(d) / 60); - } - else if (textTo == l.Milliseconds) - { - ShowResult(Convert.ToDouble(d) * TimeCode.BaseUnit); - } - else if (textTo == l.Microseconds) - { - ShowResult(Convert.ToDouble(d) * 1e+6); - } - } - else if (text == l.Milliseconds) - { - if (textTo == l.Hours) - { - ShowResult(Convert.ToDouble(d) / 3.6e+6); - } - else if (textTo == l.Minutes) - { - ShowResult(Convert.ToDouble(d) / 60000); - } - else if (textTo == l.Seconds) - { - ShowResult(Convert.ToDouble(d) / 1000); - } - else if (textTo == l.Microseconds) - { - ShowResult(Convert.ToDouble(d) * 1000); - } - } - else if (text == l.Microseconds) - { - if (textTo == l.Hours) - { - ShowResult(Convert.ToDouble(d) / 3.6e+9); - } - else if (textTo == l.Minutes) - { - ShowResult(Convert.ToDouble(d) / 6e+7); - } - else if (textTo == l.Seconds) - { - ShowResult(Convert.ToDouble(d) / 1e+6); - } - else if (textTo == l.Milliseconds) - { - ShowResult(Convert.ToDouble(d) / 1000); - } - } - } - else if (cat == l.Temperature) - { - if (text == l.Fahrenheit) - { - if (textTo == l.Celsius) - { - ShowResult((Convert.ToDouble(d) - 32) * 5 / 9); - } - else if (textTo == l.Kelvin) - { - ShowResult((Convert.ToDouble(d) - 32) * 5 / 9 + 273.15); - } - } - else if (text == l.Celsius) - { - if (textTo == l.Fahrenheit) - { - ShowResult(Convert.ToDouble(d) * 1.80 + 32); - } - else if (textTo == l.Kelvin) - { - ShowResult(Convert.ToDouble(d) + 273.15); - } - } - else if (text == l.Kelvin) - { - if (textTo == l.Fahrenheit) - { - ShowResult((Convert.ToDouble(d) - 273.15) * 9 / 5 + 32); - } - else if (textTo == l.Celsius) - { - ShowResult(Convert.ToDouble(d) - 273.15); - } - } - } - else if (cat == l.Velocity) - { - if (text == l.KilometersPerHour) - { - if (textTo == l.MetersPerSecond) - { - ShowResult(Convert.ToDouble(d) / 3.6); - } - else if (textTo == l.MilesPerHour) - { - ShowResult(Convert.ToDouble(d) / 1.609); - } - else if (textTo == l.YardsPerMinute) - { - ShowResult(Convert.ToDouble(d) * 18.227); - } - else if (textTo == l.FTsPerSecond) - { - ShowResult(Convert.ToDouble(d) / 1.097); - } - else if (textTo == l.Knots) - { - ShowResult(Convert.ToDouble(d) / 1.852); - } - } - if (text == l.MetersPerSecond) - { - if (textTo == l.KilometersPerHour) - { - ShowResult(Convert.ToDouble(d) * 3.6); - } - else if (textTo == l.MilesPerHour) - { - ShowResult(Convert.ToDouble(d) * 2.237); - } - else if (textTo == l.YardsPerMinute) - { - ShowResult(Convert.ToDouble(d) * 65.617); - } - else if (textTo == l.FTsPerSecond) - { - ShowResult(Convert.ToDouble(d) * 3.281); - } - else if (textTo == l.Knots) - { - ShowResult(Convert.ToDouble(d) * 1.944); - } - } - if (text == l.MilesPerHour) - { - if (textTo == l.KilometersPerHour) - { - ShowResult(Convert.ToDouble(d) * 1.609); - } - else if (textTo == l.MetersPerSecond) - { - ShowResult(Convert.ToDouble(d) / 2.237); - } - else if (textTo == l.YardsPerMinute) - { - ShowResult(Convert.ToDouble(d) * 29.333); - } - else if (textTo == l.FTsPerSecond) - { - ShowResult(Convert.ToDouble(d) * 1.467); - } - else if (textTo == l.Knots) - { - ShowResult(Convert.ToDouble(d) / 1.151); - } - } - if (text == l.YardsPerMinute) - { - if (textTo == l.KilometersPerHour) - { - ShowResult(Convert.ToDouble(d) / 18.227); - } - else if (textTo == l.MetersPerSecond) - { - ShowResult(Convert.ToDouble(d) / 65.617); - } - else if (textTo == l.MilesPerHour) - { - ShowResult(Convert.ToDouble(d) / 29.333); - } - else if (textTo == l.FTsPerSecond) - { - ShowResult(Convert.ToDouble(d) / 20); - } - else if (textTo == l.Knots) - { - ShowResult(Convert.ToDouble(d) / 33.756); - } - } - if (text == l.FTsPerSecond) - { - if (textTo == l.KilometersPerHour) - { - ShowResult(Convert.ToDouble(d) * 1.097); - } - else if (textTo == l.MetersPerSecond) - { - ShowResult(Convert.ToDouble(d) / 3.281); - } - else if (textTo == l.MilesPerHour) - { - ShowResult(Convert.ToDouble(d) / 1.467); - } - else if (textTo == l.YardsPerMinute) - { - ShowResult(Convert.ToDouble(d) * 20); - } - else if (textTo == l.Knots) - { - ShowResult(Convert.ToDouble(d) / 1.688); - } - } - if (text == l.Knots) - { - if (textTo == l.KilometersPerHour) - { - ShowResult(Convert.ToDouble(d) * 1.852); - } - else if (textTo == l.MetersPerSecond) - { - ShowResult(Convert.ToDouble(d) / 1.944); - } - else if (textTo == l.MilesPerHour) - { - ShowResult(Convert.ToDouble(d) * 1.151); - } - else if (textTo == l.YardsPerMinute) - { - ShowResult(Convert.ToDouble(d) * 33.756); - } - else if (textTo == l.FTsPerSecond) - { - ShowResult(Convert.ToDouble(d) * 1.688); - } - } - } - else if (cat == l.Force) - { - if (text == l.PoundsForce) - { - if (textTo == l.Newtons) - { - ShowResult(Convert.ToDouble(d) * 4.448); - } - else if (textTo == l.KilosForce) - { - ShowResult(Convert.ToDouble(d) / 2.205); - } - } - if (text == l.Newtons) - { - if (textTo == l.PoundsForce) - { - ShowResult(Convert.ToDouble(d) / 4.448); - } - else if (textTo == l.KilosForce) - { - ShowResult(Convert.ToDouble(d) / 9.807); - } - } - if (text == l.KilosForce) - { - if (textTo == l.PoundsForce) - { - ShowResult(Convert.ToDouble(d) * 2.205); - } - else if (textTo == l.Newtons) - { - ShowResult(Convert.ToDouble(d) * 9.807); - } - } - } - else if (cat == l.Energy) - { - if (text == l.Jouls) - { - if (textTo == l.Calories) - { - ShowResult(Convert.ToDouble(d) / 4.184); - } - else if (textTo == l.Ergs) - { - ShowResult(Convert.ToDouble(d) / 10000000); - } - else if (textTo == l.ElectronVolts) - { - ShowResult(Convert.ToDouble(d) * 6.242e+18); - } - else if (textTo == l.Btus) - { - ShowResult(Convert.ToDouble(d) / 1055); - } - } - else if (text == l.Calories) - { - if (textTo == l.Jouls) - { - ShowResult(Convert.ToDouble(d) * 4.184); - } - else if (textTo == l.Ergs) - { - ShowResult(Convert.ToDouble(d) * 41840000); - } - else if (textTo == l.ElectronVolts) - { - ShowResult(Convert.ToDouble(d) * 9.223e+18); - } - else if (textTo == l.Btus) - { - ShowResult(Convert.ToDouble(d) * 3.966); - } - } - else if (text == l.Ergs) - { - if (textTo == l.Jouls) - { - ShowResult(Convert.ToDouble(d) / 10000000); - } - else if (textTo == l.Calories) - { - ShowResult(Convert.ToDouble(d) / 4.184e+10); - } - else if (textTo == l.ElectronVolts) - { - ShowResult(Convert.ToDouble(d) * 6.242e+11); - } - else if (textTo == l.Btus) - { - ShowResult(Convert.ToDouble(d) / 1.055e+10); - } - } - else if (text == l.ElectronVolts) - { - if (textTo == l.Jouls) - { - ShowResult(Convert.ToDouble(d) / 6.242e+18); - } - else if (textTo == l.Calories) - { - ShowResult(Convert.ToDouble(d) / 9.223e+18); - } - else if (textTo == l.Ergs) - { - ShowResult(Convert.ToDouble(d) / 6.242e+11); - } - else if (textTo == l.Btus) - { - ShowResult(Convert.ToDouble(d) / 9.223e+18); - } - } - else if (text == l.Btus) - { - if (textTo == l.Jouls) - { - ShowResult(Convert.ToDouble(d) * 1055); - } - else if (textTo == l.Calories) - { - ShowResult(Convert.ToDouble(d) / 3.966); - } - else if (textTo == l.Ergs) - { - ShowResult(Convert.ToDouble(d) * 1.055e+10); - } - else if (textTo == l.ElectronVolts) - { - ShowResult(Convert.ToDouble(d) * 9.223e+18); - } - } - } - else if (cat == l.Power) - { - if (text == l.Watts) - { - if (textTo == l.Horsepower) - { - ShowResult(Convert.ToDouble(d) / 746); - } - } - else if (text == l.Horsepower) - { - if (textTo == l.Watts) - { - ShowResult(Convert.ToDouble(d) * 746); - } - } - } - else if (cat == l.Pressure) - { - if (text == l.Atmospheres) - { - if (textTo == l.Bars) - { - ShowResult(Convert.ToDouble(d) * 1.013); - } - else if (textTo == l.Pascals) - { - ShowResult(Convert.ToDouble(d) * 101325); - } - else if (textTo == l.MillimetersOfMercury) - { - ShowResult(Convert.ToDouble(d) * 760); - } - else if (textTo == l.PoundPerSquareInch) - { - ShowResult(Convert.ToDouble(d) * 14.696); - } - else if (textTo == l.KilogramPerSquareCentimeter) - { - ShowResult(Convert.ToDouble(d) * 1.033); - } - else if (textTo == l.KiloPascals) - { - ShowResult(Convert.ToDouble(d) * 101); - } - } - if (text == l.Bars) - { - if (textTo == l.Atmospheres) - { - ShowResult(Convert.ToDouble(d) / 1.013); - } - else if (textTo == l.Pascals) - { - ShowResult(Convert.ToDouble(d) * 100000); - } - else if (textTo == l.MillimetersOfMercury) - { - ShowResult(Convert.ToDouble(d) * 750); - } - else if (textTo == l.PoundPerSquareInch) - { - ShowResult(Convert.ToDouble(d) * 14.504); - } - else if (textTo == l.KilogramPerSquareCentimeter) - { - ShowResult(Convert.ToDouble(d) * 1.02); - } - else if (textTo == l.KiloPascals) - { - ShowResult(Convert.ToDouble(d) * 100); - } - } - if (text == l.Pascals) - { - if (textTo == l.Atmospheres) - { - ShowResult(Convert.ToDouble(d) / 101325); - } - else if (textTo == l.Bars) - { - ShowResult(Convert.ToDouble(d) / 100000); - } - else if (textTo == l.MillimetersOfMercury) - { - ShowResult(Convert.ToDouble(d) / 133); - } - else if (textTo == l.PoundPerSquareInch) - { - ShowResult(Convert.ToDouble(d) / 6895); - } - else if (textTo == l.KilogramPerSquareCentimeter) - { - ShowResult(Convert.ToDouble(d) / 98067); - } - else if (textTo == l.KiloPascals) - { - ShowResult(Convert.ToDouble(d) / 1000); - } - } - if (text == l.MillimetersOfMercury) - { - if (textTo == l.Atmospheres) - { - ShowResult(Convert.ToDouble(d) / 760); - } - else if (textTo == l.Bars) - { - ShowResult(Convert.ToDouble(d) / 750); - } - else if (textTo == l.Pascals) - { - ShowResult(Convert.ToDouble(d) * 133); - } - else if (textTo == l.PoundPerSquareInch) - { - ShowResult(Convert.ToDouble(d) / 51.715); - } - else if (textTo == l.KilogramPerSquareCentimeter) - { - ShowResult(Convert.ToDouble(d) / 736); - } - else if (textTo == l.KiloPascals) - { - ShowResult(Convert.ToDouble(d) / 7.501); - } - } - if (text == l.PoundPerSquareInch) - { - if (textTo == l.Atmospheres) - { - ShowResult(Convert.ToDouble(d) / 14.696); - } - else if (textTo == l.Bars) - { - ShowResult(Convert.ToDouble(d) / 14.504); - } - else if (textTo == l.Pascals) - { - ShowResult(Convert.ToDouble(d) * 6895); - } - else if (textTo == l.MillimetersOfMercury) - { - ShowResult(Convert.ToDouble(d) * 51.715); - } - else if (textTo == l.KilogramPerSquareCentimeter) - { - ShowResult(Convert.ToDouble(d) / 14.223); - } - else if (textTo == l.KiloPascals) - { - ShowResult(Convert.ToDouble(d) * 6.895); - } - } - if (text == l.KilogramPerSquareCentimeter) - { - if (textTo == l.Atmospheres) - { - ShowResult(Convert.ToDouble(d) / 1.033); - } - else if (textTo == l.Bars) - { - ShowResult(Convert.ToDouble(d) / 1.02); - } - else if (textTo == l.Pascals) - { - ShowResult(Convert.ToDouble(d) * 98067); - } - else if (textTo == l.MillimetersOfMercury) - { - ShowResult(Convert.ToDouble(d) * 736); - } - else if (textTo == l.PoundPerSquareInch) - { - ShowResult(Convert.ToDouble(d) * 14.223); - } - else if (textTo == l.KiloPascals) - { - ShowResult(Convert.ToDouble(d) * 98.066); - } - } - if (text == l.KiloPascals) - { - if (textTo == l.Atmospheres) - { - ShowResult(Convert.ToDouble(d) / 101); - } - else if (textTo == l.Bars) - { - ShowResult(Convert.ToDouble(d) / 100); - } - else if (textTo == l.Pascals) - { - ShowResult(Convert.ToDouble(d) * 1000); - } - else if (textTo == l.MillimetersOfMercury) - { - ShowResult(Convert.ToDouble(d) * 7.501); - } - else if (textTo == l.PoundPerSquareInch) - { - ShowResult(Convert.ToDouble(d) / 6.895); - } - else if (textTo == l.KilogramPerSquareCentimeter) - { - ShowResult(Convert.ToDouble(d) / 98.066); - } - } - } - } - - private void textBoxInput_KeyUp(object sender, KeyEventArgs e) - { - textBoxInput_TextChanged(null, null); - } - - private void textBoxInput_KeyPress(object sender, KeyPressEventArgs e) - { - if (char.IsControl(e.KeyChar) || char.IsDigit(e.KeyChar)) - { - return; - } - - if (e.KeyChar == '.' && !((sender as TextBox).Text.IndexOf('.') > -1) || e.KeyChar == ',' || e.KeyChar == '-' && !((sender as TextBox).Text.IndexOf('-') > -1)) - { - return; - } - - e.Handled = true; - } - - private void listBoxCategory_SelectedIndexChanged(object sender, EventArgs e) - { - string cat = listBoxCategory.SelectedItem.ToString(); - var l = Configuration.Settings.Language.MeasurementConverter; - - comboBoxFrom.Items.Clear(); - - if (cat == l.Length) - { - comboBoxFrom.Items.AddRange(_length.Cast().ToArray()); - } - else if (cat == l.Mass) - { - comboBoxFrom.Items.AddRange(_mass.Cast().ToArray()); - } - else if (cat == l.Volume) - { - comboBoxFrom.Items.AddRange(_volume.Cast().ToArray()); - } - else if (cat == l.Area) - { - comboBoxFrom.Items.AddRange(_area.Cast().ToArray()); - } - else if (cat == l.Time) - { - comboBoxFrom.Items.AddRange(_time.Cast().ToArray()); - } - else if (cat == l.Temperature) - { - comboBoxFrom.Items.AddRange(_temperature.Cast().ToArray()); - } - else if (cat == l.Velocity) - { - comboBoxFrom.Items.AddRange(_velocity.Cast().ToArray()); - } - else if (cat == l.Force) - { - comboBoxFrom.Items.AddRange(_force.Cast().ToArray()); - } - else if (cat == l.Energy) - { - comboBoxFrom.Items.AddRange(_energy.Cast().ToArray()); - } - else if (cat == l.Power) - { - comboBoxFrom.Items.AddRange(_power.Cast().ToArray()); - } - else if (cat == l.Pressure) - { - comboBoxFrom.Items.AddRange(_pressure.Cast().ToArray()); - } - - if (comboBoxFrom.Items.Count > 0) - { - if (comboBoxFrom.Items.Contains(_fields[1])) - { - comboBoxFrom.SelectedItem = _fields[1]; - } - else - { - comboBoxFrom.SelectedIndex = 0; - } - } - - comboBoxFrom_SelectedIndexChanged(null, null); - } - - private void listBoxCategory_LostFocus(object sender, EventArgs e) - { - // avoid flickering when losing focus - listBoxCategory.Update(); - } - - private void MeasurementConverter_Activated(object sender, EventArgs e) - { - Opacity = 1; - textBoxInput.Text = double.TryParse(Input, out _) ? Input : "1"; - } - - private void MeasurementConverter_FormClosed(object sender, FormClosedEventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private void MeasurementConverter_Deactivate(object sender, EventArgs e) - { - if (DialogResult != DialogResult.Cancel) - { - Opacity = 0.5; - } - } - - private void MeasurementConverter_Load(object sender, EventArgs e) - { - CenterToParent(); - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class MeasurementConverter : Form + { + public class InsertEventArgs : EventArgs + { + public string Result { get; set; } + public bool IsOriginalActive { get; set; } + } + + public event EventHandler InsertClicked; + + public string Input { get; set; } + public bool IsOriginalActive { get; set; } + + private string Output { get; set; } + + private readonly Color _defaultBackColor; + + private readonly string[] _fields = Configuration.Settings.General.MeasurementConverterCategories.Split(';'); + + private readonly List _length = new List { Configuration.Settings.Language.MeasurementConverter.Kilometers, + Configuration.Settings.Language.MeasurementConverter.Meters, + Configuration.Settings.Language.MeasurementConverter.Centimeters, + Configuration.Settings.Language.MeasurementConverter.Millimeters, + Configuration.Settings.Language.MeasurementConverter.Micrometers, + Configuration.Settings.Language.MeasurementConverter.Nanometers, + Configuration.Settings.Language.MeasurementConverter.Angstroms, + Configuration.Settings.Language.MeasurementConverter.MilesTerrestial, + Configuration.Settings.Language.MeasurementConverter.MilesNautical, + Configuration.Settings.Language.MeasurementConverter.Yards, + Configuration.Settings.Language.MeasurementConverter.Feet, + Configuration.Settings.Language.MeasurementConverter.Inches, + Configuration.Settings.Language.MeasurementConverter.Chains, + Configuration.Settings.Language.MeasurementConverter.Fathoms, + Configuration.Settings.Language.MeasurementConverter.Hands, + Configuration.Settings.Language.MeasurementConverter.Rods, + Configuration.Settings.Language.MeasurementConverter.Spans }; + + private readonly List _mass = new List { Configuration.Settings.Language.MeasurementConverter.LongTonnes, + Configuration.Settings.Language.MeasurementConverter.ShortTonnes, + Configuration.Settings.Language.MeasurementConverter.Tonnes, + Configuration.Settings.Language.MeasurementConverter.Kilos, + Configuration.Settings.Language.MeasurementConverter.Grams, + Configuration.Settings.Language.MeasurementConverter.Milligrams, + Configuration.Settings.Language.MeasurementConverter.Micrograms, + Configuration.Settings.Language.MeasurementConverter.Pounds, + Configuration.Settings.Language.MeasurementConverter.Ounces, + Configuration.Settings.Language.MeasurementConverter.Carats, + Configuration.Settings.Language.MeasurementConverter.Drams, + Configuration.Settings.Language.MeasurementConverter.Grains, + Configuration.Settings.Language.MeasurementConverter.Stones }; + + private readonly List _volume = new List { Configuration.Settings.Language.MeasurementConverter.CubicKilometers, + Configuration.Settings.Language.MeasurementConverter.CubicMeters, + Configuration.Settings.Language.MeasurementConverter.Litres, + Configuration.Settings.Language.MeasurementConverter.CubicCentimeters, + Configuration.Settings.Language.MeasurementConverter.CubicMillimeters, + Configuration.Settings.Language.MeasurementConverter.CubicMiles, + Configuration.Settings.Language.MeasurementConverter.CubicYards, + Configuration.Settings.Language.MeasurementConverter.CubicFTs, + Configuration.Settings.Language.MeasurementConverter.CubicInches, + Configuration.Settings.Language.MeasurementConverter.OilBarrels, + Configuration.Settings.Language.MeasurementConverter.GallonUS, + Configuration.Settings.Language.MeasurementConverter.QuartsUS, + Configuration.Settings.Language.MeasurementConverter.PintsUS, + Configuration.Settings.Language.MeasurementConverter.FluidOuncesUS, + Configuration.Settings.Language.MeasurementConverter.Bushels, + Configuration.Settings.Language.MeasurementConverter.Pecks, + Configuration.Settings.Language.MeasurementConverter.GallonsUK, + Configuration.Settings.Language.MeasurementConverter.QuartsUK, + Configuration.Settings.Language.MeasurementConverter.PintsUK, + Configuration.Settings.Language.MeasurementConverter.FluidOuncesUK }; + + private readonly List _area = new List {Configuration.Settings.Language.MeasurementConverter.SquareKilometers, + Configuration.Settings.Language.MeasurementConverter.SquareMeters, + Configuration.Settings.Language.MeasurementConverter.SquareCentimeters, + Configuration.Settings.Language.MeasurementConverter.SquareMillimeters, + Configuration.Settings.Language.MeasurementConverter.SquareMiles, + Configuration.Settings.Language.MeasurementConverter.SquareYards, + Configuration.Settings.Language.MeasurementConverter.SquareFTs, + Configuration.Settings.Language.MeasurementConverter.SquareInches, + Configuration.Settings.Language.MeasurementConverter.Hectares, + Configuration.Settings.Language.MeasurementConverter.Acres, + Configuration.Settings.Language.MeasurementConverter.Ares }; + + private readonly List _time = new List { Configuration.Settings.Language.MeasurementConverter.Hours, + Configuration.Settings.Language.MeasurementConverter.Minutes, + Configuration.Settings.Language.MeasurementConverter.Seconds, + Configuration.Settings.Language.MeasurementConverter.Milliseconds, + Configuration.Settings.Language.MeasurementConverter.Microseconds }; + + private readonly List _temperature = new List { Configuration.Settings.Language.MeasurementConverter.Fahrenheit, + Configuration.Settings.Language.MeasurementConverter.Celsius, + Configuration.Settings.Language.MeasurementConverter.Kelvin }; + + private readonly List _velocity = new List { Configuration.Settings.Language.MeasurementConverter.KilometersPerHour, + Configuration.Settings.Language.MeasurementConverter.MetersPerSecond, + Configuration.Settings.Language.MeasurementConverter.MilesPerHour, + Configuration.Settings.Language.MeasurementConverter.YardsPerMinute, + Configuration.Settings.Language.MeasurementConverter.FTsPerSecond, + Configuration.Settings.Language.MeasurementConverter.Knots }; + + private readonly List _force = new List { Configuration.Settings.Language.MeasurementConverter.PoundsForce, + Configuration.Settings.Language.MeasurementConverter.Newtons, + Configuration.Settings.Language.MeasurementConverter.KilosForce }; + + private readonly List _energy = new List { Configuration.Settings.Language.MeasurementConverter.Jouls, + Configuration.Settings.Language.MeasurementConverter.Calories, + Configuration.Settings.Language.MeasurementConverter.Ergs, + Configuration.Settings.Language.MeasurementConverter.ElectronVolts, + Configuration.Settings.Language.MeasurementConverter.Btus }; + + private readonly List _power = new List { Configuration.Settings.Language.MeasurementConverter.Watts, + Configuration.Settings.Language.MeasurementConverter.Horsepower }; + + private readonly List _pressure = new List { Configuration.Settings.Language.MeasurementConverter.Atmospheres, + Configuration.Settings.Language.MeasurementConverter.Bars, + Configuration.Settings.Language.MeasurementConverter.Pascals, + Configuration.Settings.Language.MeasurementConverter.MillimetersOfMercury, + Configuration.Settings.Language.MeasurementConverter.PoundPerSquareInch, + Configuration.Settings.Language.MeasurementConverter.KilogramPerSquareCentimeter, + Configuration.Settings.Language.MeasurementConverter.KiloPascals }; + + public MeasurementConverter() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + _defaultBackColor = Color.White; + var l = Configuration.Settings.Language.MeasurementConverter; + Text = l.Title; + labelConvertFrom.Text = l.ConvertFrom; + labelConvertTo.Text = l.ConvertTo; + linkLabel1.Text = l.CopyToClipboard; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + checkBoxCloseOnInsert.Checked = Configuration.Settings.General.MeasurementConverterCloseOnInsert; + + _defaultBackColor = textBoxInput.BackColor; + + listBoxCategory.Items.Add(l.Length); + listBoxCategory.Items.Add(l.Mass); + listBoxCategory.Items.Add(l.Volume); + listBoxCategory.Items.Add(l.Area); + listBoxCategory.Items.Add(l.Time); + listBoxCategory.Items.Add(l.Temperature); + listBoxCategory.Items.Add(l.Velocity); + listBoxCategory.Items.Add(l.Force); + listBoxCategory.Items.Add(l.Energy); + listBoxCategory.Items.Add(l.Power); + listBoxCategory.Items.Add(l.Pressure); + + listBoxCategory.SelectedItem = _fields[0]; + + UiUtil.FixLargeFonts(this, buttonOK); + } + + private void comboBoxFrom_SelectedIndexChanged(object sender, EventArgs e) + { + string cat = listBoxCategory.SelectedItem.ToString(); + string text = comboBoxFrom.SelectedItem.ToString(); + var l = Configuration.Settings.Language.MeasurementConverter; + + comboBoxTo.Items.Clear(); + + if (cat == l.Length) + { + comboBoxTo.Items.AddRange(_length.Cast().ToArray()); + } + else if (cat == l.Mass) + { + comboBoxTo.Items.AddRange(_mass.Cast().ToArray()); + } + else if (cat == l.Volume) + { + comboBoxTo.Items.AddRange(_volume.Cast().ToArray()); + } + else if (cat == l.Area) + { + comboBoxTo.Items.AddRange(_area.Cast().ToArray()); + } + else if (cat == l.Time) + { + comboBoxTo.Items.AddRange(_time.Cast().ToArray()); + } + else if (cat == l.Temperature) + { + comboBoxTo.Items.AddRange(_temperature.Cast().ToArray()); + } + else if (cat == l.Velocity) + { + comboBoxTo.Items.AddRange(_velocity.Cast().ToArray()); + } + else if (cat == l.Force) + { + comboBoxTo.Items.AddRange(_force.Cast().ToArray()); + } + else if (cat == l.Energy) + { + comboBoxTo.Items.AddRange(_energy.Cast().ToArray()); + } + else if (cat == l.Power) + { + comboBoxTo.Items.AddRange(_power.Cast().ToArray()); + } + else if (cat == l.Pressure) + { + comboBoxTo.Items.AddRange(_pressure.Cast().ToArray()); + } + comboBoxTo.Items.Remove(text); + + if (comboBoxTo.Items.Count > 0) + { + if (comboBoxTo.Items.Contains(_fields[2])) + { + comboBoxTo.SelectedItem = _fields[2]; + } + else + { + comboBoxTo.SelectedIndex = 0; + } + } + + textBoxInput_TextChanged(null, null); + } + + private void ShowResult(double d) + { + textBoxResult.Text = $"{d:0.##}"; + Output = $"{d:0.##}"; + } + + private void comboBoxTo_SelectedIndexChanged(object sender, EventArgs e) + { + textBoxInput_TextChanged(null, null); + } + + private void buttonInsert_Click(object sender, EventArgs e) + { + InsertClicked?.Invoke(this, new InsertEventArgs { Result = Output, IsOriginalActive = IsOriginalActive }); + + if (checkBoxCloseOnInsert.Checked) + { + Configuration.Settings.General.MeasurementConverterCloseOnInsert = checkBoxCloseOnInsert.Checked; + Configuration.Settings.General.MeasurementConverterCategories = listBoxCategory.SelectedItem + ";" + comboBoxFrom.SelectedItem + ";" + comboBoxTo.SelectedItem; + Close(); + } + } + + private void buttonOK_Click(object sender, EventArgs e) + { + Configuration.Settings.General.MeasurementConverterCloseOnInsert = checkBoxCloseOnInsert.Checked; + Configuration.Settings.General.MeasurementConverterCategories = listBoxCategory.SelectedItem + ";" + comboBoxFrom.SelectedItem + ";" + comboBoxTo.SelectedItem; + Close(); + } + + private void MeasurementConverter_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + Close(); + } + } + + private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + if (textBoxResult.Text.Length > 0) + { + Clipboard.SetText(textBoxResult.Text); + } + } + + private void textBoxInput_TextChanged(object sender, EventArgs e) + { + if (comboBoxFrom.SelectedIndex == -1 || comboBoxTo.SelectedIndex == -1) + { + return; + } + + if (!double.TryParse(textBoxInput.Text, out var d)) + { + textBoxInput.BackColor = Configuration.Settings.Tools.ListViewSyntaxErrorColor; + return; + } + + textBoxInput.BackColor = _defaultBackColor; + + string text = comboBoxFrom.SelectedItem.ToString(); + string textTo = comboBoxTo.SelectedItem.ToString(); + + string cat = listBoxCategory.SelectedItem.ToString(); + var l = Configuration.Settings.Language.MeasurementConverter; + + if (cat == l.Length) + { + if (text == l.Kilometers) + { + if (textTo == l.Meters) + { + ShowResult(Convert.ToDouble(d) * 1000); + } + else if (textTo == l.Centimeters) + { + ShowResult(Convert.ToDouble(d) * 100000); + } + else if (textTo == l.Millimeters) + { + ShowResult(Convert.ToDouble(d) * 1000000); + } + else if (textTo == l.Micrometers) + { + ShowResult(Convert.ToDouble(d) * 1000000000); + } + else if (textTo == l.Nanometers) + { + ShowResult(Convert.ToDouble(d) * 1000000000000); + } + else if (textTo == l.Angstroms) + { + ShowResult(Convert.ToDouble(d) * 10000000000000); + } + else if (textTo == l.MilesTerrestial) + { + ShowResult(Convert.ToDouble(d) / 1.609); + } + else if (textTo == l.MilesNautical) + { + ShowResult(Convert.ToDouble(d) / 1.852); + } + else if (textTo == l.Yards) + { + ShowResult(Convert.ToDouble(d) * 1093.61); + } + else if (textTo == l.Feet) + { + ShowResult(Convert.ToDouble(d) * 3280.84); + } + else if (textTo == l.Inches) + { + ShowResult(Convert.ToDouble(d) * 39370.1); + } + else if (textTo == l.Chains) + { + ShowResult(Convert.ToDouble(d) * 49.71); + } + else if (textTo == l.Fathoms) + { + ShowResult(Convert.ToDouble(d) * 546.807); + } + else if (textTo == l.Hands) + { + ShowResult(Convert.ToDouble(d) * 9842.52); + } + else if (textTo == l.Rods) + { + ShowResult(Convert.ToDouble(d) * 198.839); + } + else if (textTo == l.Spans) + { + ShowResult(Convert.ToDouble(d) * 4374.45); + } + } + else if (text == l.Meters) + { + if (textTo == l.Kilometers) + { + ShowResult(Convert.ToDouble(d) / 1000); + } + else if (textTo == l.Centimeters) + { + ShowResult(Convert.ToDouble(d) * 100); + } + else if (textTo == l.Millimeters) + { + ShowResult(Convert.ToDouble(d) * 1000); + } + else if (textTo == l.Micrometers) + { + ShowResult(Convert.ToDouble(d) * 1000000); + } + else if (textTo == l.Nanometers) + { + ShowResult(Convert.ToDouble(d) * 1000000000); + } + else if (textTo == l.Angstroms) + { + ShowResult(Convert.ToDouble(d) * 10000000000); + } + else if (textTo == l.MilesTerrestial) + { + ShowResult(Convert.ToDouble(d) / 1609); + } + else if (textTo == l.MilesNautical) + { + ShowResult(Convert.ToDouble(d) / 1852); + } + else if (textTo == l.Yards) + { + ShowResult(Convert.ToDouble(d) * 1.094); + } + else if (textTo == l.Feet) + { + ShowResult(Convert.ToDouble(d) * 3.281); + } + else if (textTo == l.Inches) + { + ShowResult(Convert.ToDouble(d) * 39.37); + } + else if (textTo == l.Chains) + { + ShowResult(Convert.ToDouble(d) / 20.117); + } + else if (textTo == l.Fathoms) + { + ShowResult(Convert.ToDouble(d) / 1.829); + } + else if (textTo == l.Hands) + { + ShowResult(Convert.ToDouble(d) * 9.843); + } + else if (textTo == l.Rods) + { + ShowResult(Convert.ToDouble(d) / 5.029); + } + else if (textTo == l.Spans) + { + ShowResult(Convert.ToDouble(d) * 4.374); + } + } + else if (text == l.Centimeters) + { + if (textTo == l.Kilometers) + { + ShowResult(Convert.ToDouble(d) / 100000); + } + else if (textTo == l.Meters) + { + ShowResult(Convert.ToDouble(d) / 100); + } + else if (textTo == l.Millimeters) + { + ShowResult(Convert.ToDouble(d) * 10); + } + else if (textTo == l.Micrometers) + { + ShowResult(Convert.ToDouble(d) * 10000); + } + else if (textTo == l.Nanometers) + { + ShowResult(Convert.ToDouble(d) * 1e+7); + } + else if (textTo == l.Angstroms) + { + ShowResult(Convert.ToDouble(d) * 1e+8); + } + else if (textTo == l.MilesTerrestial) + { + ShowResult(Convert.ToDouble(d) / 160934); + } + else if (textTo == l.MilesNautical) + { + ShowResult(Convert.ToDouble(d) / 185200); + } + else if (textTo == l.Yards) + { + ShowResult(Convert.ToDouble(d) / 91.44); + } + else if (textTo == l.Feet) + { + ShowResult(Convert.ToDouble(d) / 30.48); + } + else if (textTo == l.Inches) + { + ShowResult(Convert.ToDouble(d) / 2.54); + } + else if (textTo == l.Chains) + { + ShowResult(Convert.ToDouble(d) / 2012); + } + else if (textTo == l.Fathoms) + { + ShowResult(Convert.ToDouble(d) / 183); + } + else if (textTo == l.Hands) + { + ShowResult(Convert.ToDouble(d) / 10.16); + } + else if (textTo == l.Rods) + { + ShowResult(Convert.ToDouble(d) / 503); + } + else if (textTo == l.Spans) + { + ShowResult(Convert.ToDouble(d) / 22.86); + } + } + else if (text == l.Millimeters) + { + if (textTo == l.Kilometers) + { + ShowResult(Convert.ToDouble(d) / 1e+6); + } + else if (textTo == l.Meters) + { + ShowResult(Convert.ToDouble(d) / 1000); + } + else if (textTo == l.Centimeters) + { + ShowResult(Convert.ToDouble(d) / 10); + } + else if (textTo == l.Micrometers) + { + ShowResult(Convert.ToDouble(d) * 1000); + } + else if (textTo == l.Nanometers) + { + ShowResult(Convert.ToDouble(d) * 1e+6); + } + else if (textTo == l.Angstroms) + { + ShowResult(Convert.ToDouble(d) * 1e+7); + } + else if (textTo == l.MilesTerrestial) + { + ShowResult(Convert.ToDouble(d) / 1.609e+6); + } + else if (textTo == l.MilesNautical) + { + ShowResult(Convert.ToDouble(d) / 1.852e+6); + } + else if (textTo == l.Yards) + { + ShowResult(Convert.ToDouble(d) / 914); + } + else if (textTo == l.Feet) + { + ShowResult(Convert.ToDouble(d) / 305); + } + else if (textTo == l.Inches) + { + ShowResult(Convert.ToDouble(d) / 25.4); + } + else if (textTo == l.Chains) + { + ShowResult(Convert.ToDouble(d) / 20117); + } + else if (textTo == l.Fathoms) + { + ShowResult(Convert.ToDouble(d) / 1829); + } + else if (textTo == l.Hands) + { + ShowResult(Convert.ToDouble(d) / 102); + } + else if (textTo == l.Rods) + { + ShowResult(Convert.ToDouble(d) / 5029); + } + else if (textTo == l.Spans) + { + ShowResult(Convert.ToDouble(d) / 229); + } + } + else if (text == l.Micrometers) + { + if (textTo == l.Kilometers) + { + ShowResult(Convert.ToDouble(d) / 1e+9); + } + else if (textTo == l.Meters) + { + ShowResult(Convert.ToDouble(d) / 1e+6); + } + else if (textTo == l.Centimeters) + { + ShowResult(Convert.ToDouble(d) / 10000); + } + else if (textTo == l.Millimeters) + { + ShowResult(Convert.ToDouble(d) / 1000); + } + else if (textTo == l.Nanometers) + { + ShowResult(Convert.ToDouble(d) * 1000); + } + else if (textTo == l.Angstroms) + { + ShowResult(Convert.ToDouble(d) * 10000); + } + else if (textTo == l.MilesTerrestial) + { + ShowResult(Convert.ToDouble(d) / 1.609e+9); + } + else if (textTo == l.MilesNautical) + { + ShowResult(Convert.ToDouble(d) / 1.852e+9); + } + else if (textTo == l.Yards) + { + ShowResult(Convert.ToDouble(d) / 914400); + } + else if (textTo == l.Feet) + { + ShowResult(Convert.ToDouble(d) / 304800); + } + else if (textTo == l.Inches) + { + ShowResult(Convert.ToDouble(d) / 25400); + } + else if (textTo == l.Chains) + { + ShowResult(Convert.ToDouble(d) / 2.012e+7); + } + else if (textTo == l.Fathoms) + { + ShowResult(Convert.ToDouble(d) / 1.829e+6); + } + else if (textTo == l.Hands) + { + ShowResult(Convert.ToDouble(d) / 101600); + } + else if (textTo == l.Rods) + { + ShowResult(Convert.ToDouble(d) / 5.029e+6); + } + else if (textTo == l.Spans) + { + ShowResult(Convert.ToDouble(d) / 228600); + } + } + else if (text == l.Nanometers) + { + if (textTo == l.Kilometers) + { + ShowResult(Convert.ToDouble(d) / 1e+12); + } + else if (textTo == l.Meters) + { + ShowResult(Convert.ToDouble(d) / 1e+9); + } + else if (textTo == l.Centimeters) + { + ShowResult(Convert.ToDouble(d) / 1e+7); + } + else if (textTo == l.Millimeters) + { + ShowResult(Convert.ToDouble(d) / 1e+6); + } + else if (textTo == l.Micrometers) + { + ShowResult(Convert.ToDouble(d) / 1000); + } + else if (textTo == l.Angstroms) + { + ShowResult(Convert.ToDouble(d) * 10); + } + else if (textTo == l.MilesTerrestial) + { + ShowResult(Convert.ToDouble(d) / 1.609e+12); + } + else if (textTo == l.MilesNautical) + { + ShowResult(Convert.ToDouble(d) / 1.852e+12); + } + else if (textTo == l.Yards) + { + ShowResult(Convert.ToDouble(d) / 9.144e+8); + } + else if (textTo == l.Feet) + { + ShowResult(Convert.ToDouble(d) / 3.048e+8); + } + else if (textTo == l.Inches) + { + ShowResult(Convert.ToDouble(d) / 2.54e+7); + } + else if (textTo == l.Chains) + { + ShowResult(Convert.ToDouble(d) / 2.012e+10); + } + else if (textTo == l.Fathoms) + { + ShowResult(Convert.ToDouble(d) / 1.829e+9); + } + else if (textTo == l.Hands) + { + ShowResult(Convert.ToDouble(d) / 1.016e+8); + } + else if (textTo == l.Rods) + { + ShowResult(Convert.ToDouble(d) / 5.029e+9); + } + else if (textTo == l.Spans) + { + ShowResult(Convert.ToDouble(d) / 2.286e+8); + } + } + else if (text == l.Angstroms) + { + if (textTo == l.Kilometers) + { + ShowResult(Convert.ToDouble(d) / 1e+13); + } + else if (textTo == l.Meters) + { + ShowResult(Convert.ToDouble(d) / 1e+10); + } + else if (textTo == l.Centimeters) + { + ShowResult(Convert.ToDouble(d) / 1e+8); + } + else if (textTo == l.Millimeters) + { + ShowResult(Convert.ToDouble(d) / 1e+7); + } + else if (textTo == l.Micrometers) + { + ShowResult(Convert.ToDouble(d) / 10000); + } + else if (textTo == l.Nanometers) + { + ShowResult(Convert.ToDouble(d) / 10); + } + else if (textTo == l.MilesTerrestial) + { + ShowResult(Convert.ToDouble(d) / 1.609e+13); + } + else if (textTo == l.MilesNautical) + { + ShowResult(Convert.ToDouble(d) / 1.852e+13); + } + else if (textTo == l.Yards) + { + ShowResult(Convert.ToDouble(d) / 9.144e+9); + } + else if (textTo == l.Feet) + { + ShowResult(Convert.ToDouble(d) / 3.048e+9); + } + else if (textTo == l.Inches) + { + ShowResult(Convert.ToDouble(d) / 2.54e+8); + } + else if (textTo == l.Chains) + { + ShowResult(Convert.ToDouble(d) / 2.012e+11); + } + else if (textTo == l.Fathoms) + { + ShowResult(Convert.ToDouble(d) / 1.829e+10); + } + else if (textTo == l.Hands) + { + ShowResult(Convert.ToDouble(d) / 1.016e+9); + } + else if (textTo == l.Rods) + { + ShowResult(Convert.ToDouble(d) / 5.029e+10); + } + else if (textTo == l.Spans) + { + ShowResult(Convert.ToDouble(d) / 2.286e+9); + } + } + else if (text == l.MilesTerrestial) + { + if (textTo == l.Kilometers) + { + ShowResult(Convert.ToDouble(d) * 1.609); + } + else if (textTo == l.Meters) + { + ShowResult(Convert.ToDouble(d) * 1609); + } + else if (textTo == l.Centimeters) + { + ShowResult(Convert.ToDouble(d) * 160934); + } + else if (textTo == l.Millimeters) + { + ShowResult(Convert.ToDouble(d) * 1.609e+6); + } + else if (textTo == l.Micrometers) + { + ShowResult(Convert.ToDouble(d) * 1.609e+9); + } + else if (textTo == l.Nanometers) + { + ShowResult(Convert.ToDouble(d) * 1.609e+12); + } + else if (textTo == l.Angstroms) + { + ShowResult(Convert.ToDouble(d) * 1.609e+13); + } + else if (textTo == l.MilesNautical) + { + ShowResult(Convert.ToDouble(d) / 1.151); + } + else if (textTo == l.Yards) + { + ShowResult(Convert.ToDouble(d) * 1760); + } + else if (textTo == l.Feet) + { + ShowResult(Convert.ToDouble(d) * 5280); + } + else if (textTo == l.Inches) + { + ShowResult(Convert.ToDouble(d) * 63360); + } + else if (textTo == l.Chains) + { + ShowResult(Convert.ToDouble(d) * 80); + } + else if (textTo == l.Fathoms) + { + ShowResult(Convert.ToDouble(d) * 880); + } + else if (textTo == l.Hands) + { + ShowResult(Convert.ToDouble(d) * 15840); + } + else if (textTo == l.Rods) + { + ShowResult(Convert.ToDouble(d) * 320); + } + else if (textTo == l.Spans) + { + ShowResult(Convert.ToDouble(d) * 7040); + } + } + else if (text == l.MilesNautical) + { + if (textTo == l.Kilometers) + { + ShowResult(Convert.ToDouble(d) * 1.852); + } + else if (textTo == l.Meters) + { + ShowResult(Convert.ToDouble(d) * 1852); + } + else if (textTo == l.Centimeters) + { + ShowResult(Convert.ToDouble(d) * 185200); + } + else if (textTo == l.Millimeters) + { + ShowResult(Convert.ToDouble(d) * 1.852e+6); + } + else if (textTo == l.Micrometers) + { + ShowResult(Convert.ToDouble(d) * 1.852e+9); + } + else if (textTo == l.Nanometers) + { + ShowResult(Convert.ToDouble(d) * 1.852e+12); + } + else if (textTo == l.Angstroms) + { + ShowResult(Convert.ToDouble(d) * 1.852e+13); + } + else if (textTo == l.MilesTerrestial) + { + ShowResult(Convert.ToDouble(d) * 1.151); + } + else if (textTo == l.Yards) + { + ShowResult(Convert.ToDouble(d) * 2025); + } + else if (textTo == l.Feet) + { + ShowResult(Convert.ToDouble(d) * 6076); + } + else if (textTo == l.Inches) + { + ShowResult(Convert.ToDouble(d) * 72913); + } + else if (textTo == l.Chains) + { + ShowResult(Convert.ToDouble(d) * 92.062); + } + else if (textTo == l.Fathoms) + { + ShowResult(Convert.ToDouble(d) * 1013); + } + else if (textTo == l.Hands) + { + ShowResult(Convert.ToDouble(d) * 18228); + } + else if (textTo == l.Rods) + { + ShowResult(Convert.ToDouble(d) * 368); + } + else if (textTo == l.Spans) + { + ShowResult(Convert.ToDouble(d) * 8101); + } + } + else if (text == l.Yards) + { + if (textTo == l.Kilometers) + { + ShowResult(Convert.ToDouble(d) / 1094); + } + else if (textTo == l.Meters) + { + ShowResult(Convert.ToDouble(d) / 1.094); + } + else if (textTo == l.Centimeters) + { + ShowResult(Convert.ToDouble(d) * 91.44); + } + else if (textTo == l.Millimeters) + { + ShowResult(Convert.ToDouble(d) * 914); + } + else if (textTo == l.Micrometers) + { + ShowResult(Convert.ToDouble(d) * 914400); + } + else if (textTo == l.Nanometers) + { + ShowResult(Convert.ToDouble(d) * 9.144e+8); + } + else if (textTo == l.Angstroms) + { + ShowResult(Convert.ToDouble(d) * 9.144e+9); + } + else if (textTo == l.MilesTerrestial) + { + ShowResult(Convert.ToDouble(d) / 1760); + } + else if (textTo == l.MilesNautical) + { + ShowResult(Convert.ToDouble(d) / 2025); + } + else if (textTo == l.Feet) + { + ShowResult(Convert.ToDouble(d) * 3); + } + else if (textTo == l.Inches) + { + ShowResult(Convert.ToDouble(d) * 36); + } + else if (textTo == l.Chains) + { + ShowResult(Convert.ToDouble(d) / 22); + } + else if (textTo == l.Fathoms) + { + ShowResult(Convert.ToDouble(d) / 2); + } + else if (textTo == l.Hands) + { + ShowResult(Convert.ToDouble(d) * 9); + } + else if (textTo == l.Rods) + { + ShowResult(Convert.ToDouble(d) / 5.5); + } + else if (textTo == l.Spans) + { + ShowResult(Convert.ToDouble(d) * 4); + } + } + else if (text == l.Feet) + { + if (textTo == l.Kilometers) + { + ShowResult(Convert.ToDouble(d) / 3281); + } + else if (textTo == l.Meters) + { + ShowResult(Convert.ToDouble(d) / 3.281); + } + else if (textTo == l.Centimeters) + { + ShowResult(Convert.ToDouble(d) * 30.48); + } + else if (textTo == l.Millimeters) + { + ShowResult(Convert.ToDouble(d) * 305); + } + else if (textTo == l.Micrometers) + { + ShowResult(Convert.ToDouble(d) * 304800); + } + else if (textTo == l.Nanometers) + { + ShowResult(Convert.ToDouble(d) * 3.048e+8); + } + else if (textTo == l.Angstroms) + { + ShowResult(Convert.ToDouble(d) * 3.048e+9); + } + else if (textTo == l.MilesTerrestial) + { + ShowResult(Convert.ToDouble(d) / 5280); + } + else if (textTo == l.MilesNautical) + { + ShowResult(Convert.ToDouble(d) / 6076); + } + else if (textTo == l.Yards) + { + ShowResult(Convert.ToDouble(d) / 3); + } + else if (textTo == l.Inches) + { + ShowResult(Convert.ToDouble(d) * 12); + } + else if (textTo == l.Chains) + { + ShowResult(Convert.ToDouble(d) / 66); + } + else if (textTo == l.Fathoms) + { + ShowResult(Convert.ToDouble(d) / 6); + } + else if (textTo == l.Hands) + { + ShowResult(Convert.ToDouble(d) * 3); + } + else if (textTo == l.Rods) + { + ShowResult(Convert.ToDouble(d) / 16.5); + } + else if (textTo == l.Spans) + { + ShowResult(Convert.ToDouble(d) * 1.333); + } + } + else if (text == l.Inches) + { + if (textTo == l.Kilometers) + { + ShowResult(Convert.ToDouble(d) / 39370); + } + else if (textTo == l.Meters) + { + ShowResult(Convert.ToDouble(d) / 39.37); + } + else if (textTo == l.Centimeters) + { + ShowResult(Convert.ToDouble(d) * 2.54); + } + else if (textTo == l.Millimeters) + { + ShowResult(Convert.ToDouble(d) * 25.4); + } + else if (textTo == l.Micrometers) + { + ShowResult(Convert.ToDouble(d) * 25400); + } + else if (textTo == l.Nanometers) + { + ShowResult(Convert.ToDouble(d) * 2.54e+7); + } + else if (textTo == l.Angstroms) + { + ShowResult(Convert.ToDouble(d) * 2.54e+8); + } + else if (textTo == l.MilesTerrestial) + { + ShowResult(Convert.ToDouble(d) / 63360); + } + else if (textTo == l.MilesNautical) + { + ShowResult(Convert.ToDouble(d) / 72913); + } + else if (textTo == l.Yards) + { + ShowResult(Convert.ToDouble(d) / 36); + } + else if (textTo == l.Feet) + { + ShowResult(Convert.ToDouble(d) / 12); + } + else if (textTo == l.Chains) + { + ShowResult(Convert.ToDouble(d) / 792); + } + else if (textTo == l.Fathoms) + { + ShowResult(Convert.ToDouble(d) / 72); + } + else if (textTo == l.Hands) + { + ShowResult(Convert.ToDouble(d) / 4); + } + else if (textTo == l.Rods) + { + ShowResult(Convert.ToDouble(d) / 198); + } + else if (textTo == l.Spans) + { + ShowResult(Convert.ToDouble(d) / 9); + } + } + else if (text == l.Chains) + { + if (textTo == l.Kilometers) + { + ShowResult(Convert.ToDouble(d) / 49.71); + } + else if (textTo == l.Meters) + { + ShowResult(Convert.ToDouble(d) * 20.117); + } + else if (textTo == l.Centimeters) + { + ShowResult(Convert.ToDouble(d) * 2012); + } + else if (textTo == l.Millimeters) + { + ShowResult(Convert.ToDouble(d) * 20117); + } + else if (textTo == l.Micrometers) + { + ShowResult(Convert.ToDouble(d) * 2.012e+7); + } + else if (textTo == l.Nanometers) + { + ShowResult(Convert.ToDouble(d) * 2.012e+10); + } + else if (textTo == l.Angstroms) + { + ShowResult(Convert.ToDouble(d) * 2.012e+11); + } + else if (textTo == l.MilesTerrestial) + { + ShowResult(Convert.ToDouble(d) / 80); + } + else if (textTo == l.MilesNautical) + { + ShowResult(Convert.ToDouble(d) / 92.062); + } + else if (textTo == l.Yards) + { + ShowResult(Convert.ToDouble(d) * 22); + } + else if (textTo == l.Feet) + { + ShowResult(Convert.ToDouble(d) * 66); + } + else if (textTo == l.Inches) + { + ShowResult(Convert.ToDouble(d) * 792); + } + else if (textTo == l.Fathoms) + { + ShowResult(Convert.ToDouble(d) * 11); + } + else if (textTo == l.Hands) + { + ShowResult(Convert.ToDouble(d) * 198); + } + else if (textTo == l.Rods) + { + ShowResult(Convert.ToDouble(d) * 4); + } + else if (textTo == l.Spans) + { + ShowResult(Convert.ToDouble(d) * 88); + } + } + else if (text == l.Fathoms) + { + if (textTo == l.Kilometers) + { + ShowResult(Convert.ToDouble(d) / 547); + } + else if (textTo == l.Meters) + { + ShowResult(Convert.ToDouble(d) * 1.829); + } + else if (textTo == l.Centimeters) + { + ShowResult(Convert.ToDouble(d) * 183); + } + else if (textTo == l.Millimeters) + { + ShowResult(Convert.ToDouble(d) * 1829); + } + else if (textTo == l.Micrometers) + { + ShowResult(Convert.ToDouble(d) * 1.829e+6); + } + else if (textTo == l.Nanometers) + { + ShowResult(Convert.ToDouble(d) * 1.829e+9); + } + else if (textTo == l.Angstroms) + { + ShowResult(Convert.ToDouble(d) * 1.829e+10); + } + else if (textTo == l.MilesTerrestial) + { + ShowResult(Convert.ToDouble(d) / 880); + } + else if (textTo == l.MilesNautical) + { + ShowResult(Convert.ToDouble(d) / 1013); + } + else if (textTo == l.Yards) + { + ShowResult(Convert.ToDouble(d) * 2); + } + else if (textTo == l.Feet) + { + ShowResult(Convert.ToDouble(d) * 6); + } + else if (textTo == l.Inches) + { + ShowResult(Convert.ToDouble(d) * 72); + } + else if (textTo == l.Chains) + { + ShowResult(Convert.ToDouble(d) / 11); + } + else if (textTo == l.Hands) + { + ShowResult(Convert.ToDouble(d) * 18); + } + else if (textTo == l.Rods) + { + ShowResult(Convert.ToDouble(d) / 2.75); + } + else if (textTo == l.Spans) + { + ShowResult(Convert.ToDouble(d) * 8); + } + } + else if (text == l.Hands) + { + if (textTo == l.Kilometers) + { + ShowResult(Convert.ToDouble(d) / 9843); + } + else if (textTo == l.Meters) + { + ShowResult(Convert.ToDouble(d) / 9.843); + } + else if (textTo == l.Centimeters) + { + ShowResult(Convert.ToDouble(d) * 10.16); + } + else if (textTo == l.Millimeters) + { + ShowResult(Convert.ToDouble(d) * 102); + } + else if (textTo == l.Micrometers) + { + ShowResult(Convert.ToDouble(d) * 101600); + } + else if (textTo == l.Nanometers) + { + ShowResult(Convert.ToDouble(d) * 1.016e+8); + } + else if (textTo == l.Angstroms) + { + ShowResult(Convert.ToDouble(d) * 1.016e+9); + } + else if (textTo == l.MilesTerrestial) + { + ShowResult(Convert.ToDouble(d) / 15840); + } + else if (textTo == l.MilesNautical) + { + ShowResult(Convert.ToDouble(d) / 18228); + } + else if (textTo == l.Yards) + { + ShowResult(Convert.ToDouble(d) / 9); + } + else if (textTo == l.Feet) + { + ShowResult(Convert.ToDouble(d) / 3); + } + else if (textTo == l.Inches) + { + ShowResult(Convert.ToDouble(d) * 4); + } + else if (textTo == l.Chains) + { + ShowResult(Convert.ToDouble(d) / 198); + } + else if (textTo == l.Fathoms) + { + ShowResult(Convert.ToDouble(d) / 18); + } + else if (textTo == l.Rods) + { + ShowResult(Convert.ToDouble(d) / 49.5); + } + else if (textTo == l.Spans) + { + ShowResult(Convert.ToDouble(d) / 2.25); + } + } + else if (text == l.Rods) + { + if (textTo == l.Kilometers) + { + ShowResult(Convert.ToDouble(d) / 199); + } + else if (textTo == l.Meters) + { + ShowResult(Convert.ToDouble(d) * 5.029); + } + else if (textTo == l.Centimeters) + { + ShowResult(Convert.ToDouble(d) * 503); + } + else if (textTo == l.Millimeters) + { + ShowResult(Convert.ToDouble(d) * 5029); + } + else if (textTo == l.Micrometers) + { + ShowResult(Convert.ToDouble(d) * 5.029e+6); + } + else if (textTo == l.Nanometers) + { + ShowResult(Convert.ToDouble(d) * 5.029e+9); + } + else if (textTo == l.Angstroms) + { + ShowResult(Convert.ToDouble(d) * 5.029e+10); + } + else if (textTo == l.MilesTerrestial) + { + ShowResult(Convert.ToDouble(d) / 320); + } + else if (textTo == l.MilesNautical) + { + ShowResult(Convert.ToDouble(d) / 368); + } + else if (textTo == l.Yards) + { + ShowResult(Convert.ToDouble(d) * 5.5); + } + else if (textTo == l.Feet) + { + ShowResult(Convert.ToDouble(d) * 16.5); + } + else if (textTo == l.Inches) + { + ShowResult(Convert.ToDouble(d) * 198); + } + else if (textTo == l.Chains) + { + ShowResult(Convert.ToDouble(d) / 4); + } + else if (textTo == l.Fathoms) + { + ShowResult(Convert.ToDouble(d) * 2.75); + } + else if (textTo == l.Hands) + { + ShowResult(Convert.ToDouble(d) * 49.5); + } + else if (textTo == l.Spans) + { + ShowResult(Convert.ToDouble(d) * 22); + } + } + else if (text == l.Spans) + { + if (textTo == l.Kilometers) + { + ShowResult(Convert.ToDouble(d) / 4374); + } + else if (textTo == l.Meters) + { + ShowResult(Convert.ToDouble(d) / 4.374); + } + else if (textTo == l.Centimeters) + { + ShowResult(Convert.ToDouble(d) * 22.86); + } + else if (textTo == l.Millimeters) + { + ShowResult(Convert.ToDouble(d) * 229); + } + else if (textTo == l.Micrometers) + { + ShowResult(Convert.ToDouble(d) * 228600); + } + else if (textTo == l.Nanometers) + { + ShowResult(Convert.ToDouble(d) * 2.286e+8); + } + else if (textTo == l.Angstroms) + { + ShowResult(Convert.ToDouble(d) * 2.286e+9); + } + else if (textTo == l.MilesTerrestial) + { + ShowResult(Convert.ToDouble(d) / 7040); + } + else if (textTo == l.MilesNautical) + { + ShowResult(Convert.ToDouble(d) / 8101); + } + else if (textTo == l.Yards) + { + ShowResult(Convert.ToDouble(d) / 4); + } + else if (textTo == l.Feet) + { + ShowResult(Convert.ToDouble(d) / 1.333); + } + else if (textTo == l.Inches) + { + ShowResult(Convert.ToDouble(d) * 9); + } + else if (textTo == l.Chains) + { + ShowResult(Convert.ToDouble(d) / 88); + } + else if (textTo == l.Fathoms) + { + ShowResult(Convert.ToDouble(d) / 8); + } + else if (textTo == l.Hands) + { + ShowResult(Convert.ToDouble(d) * 2.25); + } + else if (textTo == l.Rods) + { + ShowResult(Convert.ToDouble(d) / 22); + } + } + } + else if (cat == l.Mass) + { + if (text == l.LongTonnes) + { + if (textTo == l.ShortTonnes) + { + ShowResult(Convert.ToDouble(d) * 1.12); + } + else if (textTo == l.Tonnes) + { + ShowResult(Convert.ToDouble(d) * 1.016); + } + else if (textTo == l.Kilos) + { + ShowResult(Convert.ToDouble(d) * 1016); + } + else if (textTo == l.Grams) + { + ShowResult(Convert.ToDouble(d) * 1.016e+6); + } + else if (textTo == l.Milligrams) + { + ShowResult(Convert.ToDouble(d) * 1.016e+9); + } + else if (textTo == l.Micrograms) + { + ShowResult(Convert.ToDouble(d) * 1.016e+12); + } + else if (textTo == l.Pounds) + { + ShowResult(Convert.ToDouble(d) * 2240); + } + else if (textTo == l.Ounces) + { + ShowResult(Convert.ToDouble(d) * 35840); + } + else if (textTo == l.Carats) + { + ShowResult(Convert.ToDouble(d) * 5.08e+6); + } + else if (textTo == l.Drams) + { + ShowResult(Convert.ToDouble(d) * 573438); + } + else if (textTo == l.Grains) + { + ShowResult(Convert.ToDouble(d) * 1.568e+7); + } + else if (textTo == l.Stones) + { + ShowResult(Convert.ToDouble(d) * 160); + } + } + else if (text == l.ShortTonnes) + { + if (textTo == l.LongTonnes) + { + ShowResult(Convert.ToDouble(d) / 1.12); + } + else if (textTo == l.Tonnes) + { + ShowResult(Convert.ToDouble(d) / 1.102); + } + else if (textTo == l.Kilos) + { + ShowResult(Convert.ToDouble(d) * 907); + } + else if (textTo == l.Grams) + { + ShowResult(Convert.ToDouble(d) * 907185); + } + else if (textTo == l.Milligrams) + { + ShowResult(Convert.ToDouble(d) * 9.072e+8); + } + else if (textTo == l.Micrograms) + { + ShowResult(Convert.ToDouble(d) * 9.072e+11); + } + else if (textTo == l.Pounds) + { + ShowResult(Convert.ToDouble(d) * 2000); + } + else if (textTo == l.Ounces) + { + ShowResult(Convert.ToDouble(d) * 32000); + } + else if (textTo == l.Carats) + { + ShowResult(Convert.ToDouble(d) * 4.536e+6); + } + else if (textTo == l.Drams) + { + ShowResult(Convert.ToDouble(d) * 511999); + } + else if (textTo == l.Grains) + { + ShowResult(Convert.ToDouble(d) * 1.4e+7); + } + else if (textTo == l.Stones) + { + ShowResult(Convert.ToDouble(d) * 143); + } + } + else if (text == l.Tonnes) + { + if (textTo == l.LongTonnes) + { + ShowResult(Convert.ToDouble(d) / 1.016); + } + else if (textTo == l.ShortTonnes) + { + ShowResult(Convert.ToDouble(d) * 1.102); + } + else if (textTo == l.Kilos) + { + ShowResult(Convert.ToDouble(d) * 1000); + } + else if (textTo == l.Grams) + { + ShowResult(Convert.ToDouble(d) * 1e+6); + } + else if (textTo == l.Milligrams) + { + ShowResult(Convert.ToDouble(d) * 1e+9); + } + else if (textTo == l.Micrograms) + { + ShowResult(Convert.ToDouble(d) * 1e+12); + } + else if (textTo == l.Pounds) + { + ShowResult(Convert.ToDouble(d) * 2205); + } + else if (textTo == l.Ounces) + { + ShowResult(Convert.ToDouble(d) * 35274); + } + else if (textTo == l.Carats) + { + ShowResult(Convert.ToDouble(d) * 5e+6); + } + else if (textTo == l.Drams) + { + ShowResult(Convert.ToDouble(d) * 564382); + } + else if (textTo == l.Grains) + { + ShowResult(Convert.ToDouble(d) * 1.543e+7); + } + else if (textTo == l.Stones) + { + ShowResult(Convert.ToDouble(d) * 157); + } + } + else if (text == l.Kilos) + { + if (textTo == l.LongTonnes) + { + ShowResult(Convert.ToDouble(d) / 1016); + } + else if (textTo == l.ShortTonnes) + { + ShowResult(Convert.ToDouble(d) / 907); + } + else if (textTo == l.Tonnes) + { + ShowResult(Convert.ToDouble(d) / 1000); + } + else if (textTo == l.Grams) + { + ShowResult(Convert.ToDouble(d) * 1000); + } + else if (textTo == l.Milligrams) + { + ShowResult(Convert.ToDouble(d) * 1e+6); + } + else if (textTo == l.Micrograms) + { + ShowResult(Convert.ToDouble(d) * 1e+9); + } + else if (textTo == l.Pounds) + { + ShowResult(Convert.ToDouble(d) * 2.205); + } + else if (textTo == l.Ounces) + { + ShowResult(Convert.ToDouble(d) * 35.274); + } + else if (textTo == l.Carats) + { + ShowResult(Convert.ToDouble(d) * 5000); + } + else if (textTo == l.Drams) + { + ShowResult(Convert.ToDouble(d) * 564); + } + else if (textTo == l.Grains) + { + ShowResult(Convert.ToDouble(d) * 15432); + } + else if (textTo == l.Stones) + { + ShowResult(Convert.ToDouble(d) / 6.35); + } + } + else if (text == l.Grams) + { + if (textTo == l.LongTonnes) + { + ShowResult(Convert.ToDouble(d) / 1.016e+6); + } + else if (textTo == l.ShortTonnes) + { + ShowResult(Convert.ToDouble(d) / 907185); + } + else if (textTo == l.Tonnes) + { + ShowResult(Convert.ToDouble(d) / 1e+6); + } + else if (textTo == l.Kilos) + { + ShowResult(Convert.ToDouble(d) / 1000); + } + else if (textTo == l.Milligrams) + { + ShowResult(Convert.ToDouble(d) * 1000); + } + else if (textTo == l.Micrograms) + { + ShowResult(Convert.ToDouble(d) * 1e+6); + } + else if (textTo == l.Pounds) + { + ShowResult(Convert.ToDouble(d) / 454); + } + else if (textTo == l.Ounces) + { + ShowResult(Convert.ToDouble(d) / 28.35); + } + else if (textTo == l.Carats) + { + ShowResult(Convert.ToDouble(d) * 5); + } + else if (textTo == l.Drams) + { + ShowResult(Convert.ToDouble(d) / 1.772); + } + else if (textTo == l.Grains) + { + ShowResult(Convert.ToDouble(d) * 15.432); + } + else if (textTo == l.Stones) + { + ShowResult(Convert.ToDouble(d) / 6350); + } + } + else if (text == l.Milligrams) + { + if (textTo == l.LongTonnes) + { + ShowResult(Convert.ToDouble(d) / 1.016e+9); + } + else if (textTo == l.ShortTonnes) + { + ShowResult(Convert.ToDouble(d) / 9.072e+8); + } + else if (textTo == l.Tonnes) + { + ShowResult(Convert.ToDouble(d) / 1e+9); + } + else if (textTo == l.Kilos) + { + ShowResult(Convert.ToDouble(d) / 1e+6); + } + else if (textTo == l.Grams) + { + ShowResult(Convert.ToDouble(d) / 1000); + } + else if (textTo == l.Micrograms) + { + ShowResult(Convert.ToDouble(d) * 1000); + } + else if (textTo == l.Pounds) + { + ShowResult(Convert.ToDouble(d) / 453592); + } + else if (textTo == l.Ounces) + { + ShowResult(Convert.ToDouble(d) / 28350); + } + else if (textTo == l.Carats) + { + ShowResult(Convert.ToDouble(d) / 200); + } + else if (textTo == l.Drams) + { + ShowResult(Convert.ToDouble(d) / 1772); + } + else if (textTo == l.Grains) + { + ShowResult(Convert.ToDouble(d) / 64.799); + } + else if (textTo == l.Stones) + { + ShowResult(Convert.ToDouble(d) / 6.35e+6); + } + } + else if (text == l.Micrograms) + { + if (textTo == l.LongTonnes) + { + ShowResult(Convert.ToDouble(d) / 1.016e+12); + } + else if (textTo == l.ShortTonnes) + { + ShowResult(Convert.ToDouble(d) / 9.072e+11); + } + else if (textTo == l.Tonnes) + { + ShowResult(Convert.ToDouble(d) / 1e+12); + } + else if (textTo == l.Kilos) + { + ShowResult(Convert.ToDouble(d) / 1e+9); + } + else if (textTo == l.Grams) + { + ShowResult(Convert.ToDouble(d) / 1e+6); + } + else if (textTo == l.Milligrams) + { + ShowResult(Convert.ToDouble(d) / 1000); + } + else if (textTo == l.Pounds) + { + ShowResult(Convert.ToDouble(d) / 4.536e+8); + } + else if (textTo == l.Ounces) + { + ShowResult(Convert.ToDouble(d) / 2.835e+7); + } + else if (textTo == l.Carats) + { + ShowResult(Convert.ToDouble(d) / 200000); + } + else if (textTo == l.Drams) + { + ShowResult(Convert.ToDouble(d) / 1.772e+6); + } + else if (textTo == l.Grains) + { + ShowResult(Convert.ToDouble(d) / 64799); + } + else if (textTo == l.Stones) + { + ShowResult(Convert.ToDouble(d) / 6.35e+9); + } + } + else if (text == l.Pounds) + { + if (textTo == l.LongTonnes) + { + ShowResult(Convert.ToDouble(d) / 2240); + } + else if (textTo == l.ShortTonnes) + { + ShowResult(Convert.ToDouble(d) / 2000); + } + else if (textTo == l.Tonnes) + { + ShowResult(Convert.ToDouble(d) / 2205); + } + else if (textTo == l.Kilos) + { + ShowResult(Convert.ToDouble(d) / 2.205); + } + else if (textTo == l.Grams) + { + ShowResult(Convert.ToDouble(d) * 454); + } + else if (textTo == l.Milligrams) + { + ShowResult(Convert.ToDouble(d) * 453592); + } + else if (textTo == l.Micrograms) + { + ShowResult(Convert.ToDouble(d) * 4.536e+8); + } + else if (textTo == l.Ounces) + { + ShowResult(Convert.ToDouble(d) * 16); + } + else if (textTo == l.Carats) + { + ShowResult(Convert.ToDouble(d) * 2268); + } + else if (textTo == l.Drams) + { + ShowResult(Convert.ToDouble(d) * 256); + } + else if (textTo == l.Grains) + { + ShowResult(Convert.ToDouble(d) * 7000); + } + else if (textTo == l.Stones) + { + ShowResult(Convert.ToDouble(d) / 14); + } + } + else if (text == l.Ounces) + { + if (textTo == l.LongTonnes) + { + ShowResult(Convert.ToDouble(d) / 35840); + } + else if (textTo == l.ShortTonnes) + { + ShowResult(Convert.ToDouble(d) / 32000); + } + else if (textTo == l.Tonnes) + { + ShowResult(Convert.ToDouble(d) / 35274); + } + else if (textTo == l.Kilos) + { + ShowResult(Convert.ToDouble(d) / 35.274); + } + else if (textTo == l.Grams) + { + ShowResult(Convert.ToDouble(d) * 28.35); + } + else if (textTo == l.Milligrams) + { + ShowResult(Convert.ToDouble(d) * 28350); + } + else if (textTo == l.Micrograms) + { + ShowResult(Convert.ToDouble(d) * 2.835e+7); + } + else if (textTo == l.Pounds) + { + ShowResult(Convert.ToDouble(d) / 16); + } + else if (textTo == l.Carats) + { + ShowResult(Convert.ToDouble(d) * 142); + } + else if (textTo == l.Drams) + { + ShowResult(Convert.ToDouble(d) * 16); + } + else if (textTo == l.Grains) + { + ShowResult(Convert.ToDouble(d) * 438); + } + else if (textTo == l.Stones) + { + ShowResult(Convert.ToDouble(d) / 224); + } + } + else if (text == l.Carats) + { + if (textTo == l.LongTonnes) + { + ShowResult(Convert.ToDouble(d) / 5.08e+6); + } + else if (textTo == l.ShortTonnes) + { + ShowResult(Convert.ToDouble(d) / 4.536e+6); + } + else if (textTo == l.Tonnes) + { + ShowResult(Convert.ToDouble(d) / 5e+6); + } + else if (textTo == l.Kilos) + { + ShowResult(Convert.ToDouble(d) / 5000); + } + else if (textTo == l.Grams) + { + ShowResult(Convert.ToDouble(d) / 5); + } + else if (textTo == l.Milligrams) + { + ShowResult(Convert.ToDouble(d) * 200); + } + else if (textTo == l.Micrograms) + { + ShowResult(Convert.ToDouble(d) * 200000); + } + else if (textTo == l.Pounds) + { + ShowResult(Convert.ToDouble(d) / 2268); + } + else if (textTo == l.Ounces) + { + ShowResult(Convert.ToDouble(d) / 142); + } + else if (textTo == l.Drams) + { + ShowResult(Convert.ToDouble(d) / 8.859); + } + else if (textTo == l.Grains) + { + ShowResult(Convert.ToDouble(d) * 3.086); + } + else if (textTo == l.Stones) + { + ShowResult(Convert.ToDouble(d) / 31751); + } + } + else if (text == l.Drams) + { + if (textTo == l.LongTonnes) + { + ShowResult(Convert.ToDouble(d) / 573438); + } + else if (textTo == l.ShortTonnes) + { + ShowResult(Convert.ToDouble(d) / 511999); + } + else if (textTo == l.Tonnes) + { + ShowResult(Convert.ToDouble(d) / 564382); + } + else if (textTo == l.Kilos) + { + ShowResult(Convert.ToDouble(d) / 564); + } + else if (textTo == l.Grams) + { + ShowResult(Convert.ToDouble(d) * 1.772); + } + else if (textTo == l.Milligrams) + { + ShowResult(Convert.ToDouble(d) * 1772); + } + else if (textTo == l.Micrograms) + { + ShowResult(Convert.ToDouble(d) * 1.772e+6); + } + else if (textTo == l.Pounds) + { + ShowResult(Convert.ToDouble(d) / 256); + } + else if (textTo == l.Ounces) + { + ShowResult(Convert.ToDouble(d) / 16); + } + else if (textTo == l.Carats) + { + ShowResult(Convert.ToDouble(d) * 8.859); + } + else if (textTo == l.Grains) + { + ShowResult(Convert.ToDouble(d) * 27.344); + } + else if (textTo == l.Stones) + { + ShowResult(Convert.ToDouble(d) / 3584); + } + } + else if (text == l.Grains) + { + if (textTo == l.LongTonnes) + { + ShowResult(Convert.ToDouble(d) / 1.568e+7); + } + else if (textTo == l.ShortTonnes) + { + ShowResult(Convert.ToDouble(d) / 1.4e+7); + } + else if (textTo == l.Tonnes) + { + ShowResult(Convert.ToDouble(d) / 1.543e+7); + } + else if (textTo == l.Kilos) + { + ShowResult(Convert.ToDouble(d) / 15432); + } + else if (textTo == l.Grams) + { + ShowResult(Convert.ToDouble(d) / 15.432); + } + else if (textTo == l.Milligrams) + { + ShowResult(Convert.ToDouble(d) * 64.799); + } + else if (textTo == l.Micrograms) + { + ShowResult(Convert.ToDouble(d) * 64799); + } + else if (textTo == l.Pounds) + { + ShowResult(Convert.ToDouble(d) / 7000); + } + else if (textTo == l.Ounces) + { + ShowResult(Convert.ToDouble(d) / 438); + } + else if (textTo == l.Carats) + { + ShowResult(Convert.ToDouble(d) / 3.086); + } + else if (textTo == l.Drams) + { + ShowResult(Convert.ToDouble(d) / 27.344); + } + else if (textTo == l.Stones) + { + ShowResult(Convert.ToDouble(d) / 98000); + } + } + else if (text == l.Stones) + { + if (textTo == l.LongTonnes) + { + ShowResult(Convert.ToDouble(d) / 160); + } + else if (textTo == l.ShortTonnes) + { + ShowResult(Convert.ToDouble(d) / 143); + } + else if (textTo == l.Tonnes) + { + ShowResult(Convert.ToDouble(d) / 157); + } + else if (textTo == l.Kilos) + { + ShowResult(Convert.ToDouble(d) * 6.35); + } + else if (textTo == l.Grams) + { + ShowResult(Convert.ToDouble(d) * 6350); + } + else if (textTo == l.Milligrams) + { + ShowResult(Convert.ToDouble(d) * 6.35e+6); + } + else if (textTo == l.Micrograms) + { + ShowResult(Convert.ToDouble(d) * 6.35e+9); + } + else if (textTo == l.Pounds) + { + ShowResult(Convert.ToDouble(d) * 14); + } + else if (textTo == l.Ounces) + { + ShowResult(Convert.ToDouble(d) * 224); + } + else if (textTo == l.Carats) + { + ShowResult(Convert.ToDouble(d) * 31751); + } + else if (textTo == l.Drams) + { + ShowResult(Convert.ToDouble(d) * 3584); + } + else if (textTo == l.Grains) + { + ShowResult(Convert.ToDouble(d) * 98000); + } + } + } + else if (cat == l.Volume) + { + if (text == l.CubicKilometers) + { + if (textTo == l.CubicMeters) + { + ShowResult(Convert.ToDouble(d) * 1e+9); + } + else if (textTo == l.Litres) + { + ShowResult(Convert.ToDouble(d) * 1e+12); + } + else if (textTo == l.CubicCentimeters) + { + ShowResult(Convert.ToDouble(d) * 1e+15); + } + else if (textTo == l.CubicMillimeters) + { + ShowResult(Convert.ToDouble(d) * 1e+18); + } + else if (textTo == l.CubicMiles) + { + ShowResult(Convert.ToDouble(d) / 4.168); + } + else if (textTo == l.CubicYards) + { + ShowResult(Convert.ToDouble(d) * 1.308e+9); + } + else if (textTo == l.CubicFTs) + { + ShowResult(Convert.ToDouble(d) * 3.531e+10); + } + else if (textTo == l.CubicInches) + { + ShowResult(Convert.ToDouble(d) * 6.102e+13); + } + else if (textTo == l.OilBarrels) + { + ShowResult(Convert.ToDouble(d) * 6.29e+9); + } + else if (textTo == l.GallonUS) + { + ShowResult(Convert.ToDouble(d) * 2.642e+11); + } + else if (textTo == l.QuartsUS) + { + ShowResult(Convert.ToDouble(d) * 1.057e+12); + } + else if (textTo == l.PintsUS) + { + ShowResult(Convert.ToDouble(d) * 2.113e+12); + } + else if (textTo == l.FluidOuncesUS) + { + ShowResult(Convert.ToDouble(d) * 3.381e+13); + } + else if (textTo == l.Bushels) + { + ShowResult(Convert.ToDouble(d) * 2.838e+10); + } + else if (textTo == l.Pecks) + { + ShowResult(Convert.ToDouble(d) * 1.135e+11); + } + else if (textTo == l.GallonsUK) + { + ShowResult(Convert.ToDouble(d) * 2.2e+11); + } + else if (textTo == l.QuartsUK) + { + ShowResult(Convert.ToDouble(d) * 8.799e+11); + } + else if (textTo == l.PintsUK) + { + ShowResult(Convert.ToDouble(d) * 1.76e+12); + } + else if (textTo == l.FluidOuncesUK) + { + ShowResult(Convert.ToDouble(d) * 3.52e+13); + } + } + else if (text == l.CubicMeters) + { + if (textTo == l.CubicKilometers) + { + ShowResult(Convert.ToDouble(d) / 1e+9); + } + else if (textTo == l.Litres) + { + ShowResult(Convert.ToDouble(d) * 1000); + } + else if (textTo == l.CubicCentimeters) + { + ShowResult(Convert.ToDouble(d) * 1e+6); + } + else if (textTo == l.CubicMillimeters) + { + ShowResult(Convert.ToDouble(d) * 1e+9); + } + else if (textTo == l.CubicMiles) + { + ShowResult(Convert.ToDouble(d) / 4.168e+9); + } + else if (textTo == l.CubicYards) + { + ShowResult(Convert.ToDouble(d) * 1.308); + } + else if (textTo == l.CubicFTs) + { + ShowResult(Convert.ToDouble(d) * 35.315); + } + else if (textTo == l.CubicInches) + { + ShowResult(Convert.ToDouble(d) * 61024); + } + else if (textTo == l.OilBarrels) + { + ShowResult(Convert.ToDouble(d) * 6.29); + } + else if (textTo == l.GallonUS) + { + ShowResult(Convert.ToDouble(d) * 264); + } + else if (textTo == l.QuartsUS) + { + ShowResult(Convert.ToDouble(d) * 1057); + } + else if (textTo == l.PintsUS) + { + ShowResult(Convert.ToDouble(d) * 2113); + } + else if (textTo == l.FluidOuncesUS) + { + ShowResult(Convert.ToDouble(d) * 33814); + } + else if (textTo == l.Bushels) + { + ShowResult(Convert.ToDouble(d) * 28.378); + } + else if (textTo == l.Pecks) + { + ShowResult(Convert.ToDouble(d) * 114); + } + else if (textTo == l.GallonsUK) + { + ShowResult(Convert.ToDouble(d) * 220); + } + else if (textTo == l.QuartsUK) + { + ShowResult(Convert.ToDouble(d) * 880); + } + else if (textTo == l.PintsUK) + { + ShowResult(Convert.ToDouble(d) * 1760); + } + else if (textTo == l.FluidOuncesUK) + { + ShowResult(Convert.ToDouble(d) * 35195); + } + } + else if (text == l.Litres) + { + if (textTo == l.CubicKilometers) + { + ShowResult(Convert.ToDouble(d) / 1e+12); + } + else if (textTo == l.CubicMeters) + { + ShowResult(Convert.ToDouble(d) / 1000); + } + else if (textTo == l.CubicCentimeters) + { + ShowResult(Convert.ToDouble(d) * 1000); + } + else if (textTo == l.CubicMillimeters) + { + ShowResult(Convert.ToDouble(d) * 1e+6); + } + else if (textTo == l.CubicMiles) + { + ShowResult(Convert.ToDouble(d) / 4.168e+12); + } + else if (textTo == l.CubicYards) + { + ShowResult(Convert.ToDouble(d) / 765); + } + else if (textTo == l.CubicFTs) + { + ShowResult(Convert.ToDouble(d) / 28.317); + } + else if (textTo == l.CubicInches) + { + ShowResult(Convert.ToDouble(d) * 61.024); + } + else if (textTo == l.OilBarrels) + { + ShowResult(Convert.ToDouble(d) / 159); + } + else if (textTo == l.GallonUS) + { + ShowResult(Convert.ToDouble(d) / 3.785); + } + else if (textTo == l.QuartsUS) + { + ShowResult(Convert.ToDouble(d) * 1.057); + } + else if (textTo == l.PintsUS) + { + ShowResult(Convert.ToDouble(d) * 2.113); + } + else if (textTo == l.FluidOuncesUS) + { + ShowResult(Convert.ToDouble(d) * 33.814); + } + else if (textTo == l.Bushels) + { + ShowResult(Convert.ToDouble(d) / 35.239); + } + else if (textTo == l.Pecks) + { + ShowResult(Convert.ToDouble(d) / 8.81); + } + else if (textTo == l.GallonsUK) + { + ShowResult(Convert.ToDouble(d) / 4.546); + } + else if (textTo == l.QuartsUK) + { + ShowResult(Convert.ToDouble(d) / 1.137); + } + else if (textTo == l.PintsUK) + { + ShowResult(Convert.ToDouble(d) * 1.76); + } + else if (textTo == l.FluidOuncesUK) + { + ShowResult(Convert.ToDouble(d) * 35.195); + } + } + else if (text == l.CubicCentimeters) + { + if (textTo == l.CubicKilometers) + { + ShowResult(Convert.ToDouble(d) / 1e+15); + } + else if (textTo == l.CubicMeters) + { + ShowResult(Convert.ToDouble(d) / 1e+6); + } + else if (textTo == l.Litres) + { + ShowResult(Convert.ToDouble(d) / 1000); + } + else if (textTo == l.CubicMillimeters) + { + ShowResult(Convert.ToDouble(d) * 1000); + } + else if (textTo == l.CubicMiles) + { + ShowResult(Convert.ToDouble(d) / 4.168e+15); + } + else if (textTo == l.CubicYards) + { + ShowResult(Convert.ToDouble(d) / 764555); + } + else if (textTo == l.CubicFTs) + { + ShowResult(Convert.ToDouble(d) / 28317); + } + else if (textTo == l.CubicInches) + { + ShowResult(Convert.ToDouble(d) / 16.387); + } + else if (textTo == l.OilBarrels) + { + ShowResult(Convert.ToDouble(d) / 158987); + } + else if (textTo == l.GallonUS) + { + ShowResult(Convert.ToDouble(d) / 3785); + } + else if (textTo == l.QuartsUS) + { + ShowResult(Convert.ToDouble(d) / 946); + } + else if (textTo == l.PintsUS) + { + ShowResult(Convert.ToDouble(d) / 473); + } + else if (textTo == l.FluidOuncesUS) + { + ShowResult(Convert.ToDouble(d) / 29.574); + } + else if (textTo == l.Bushels) + { + ShowResult(Convert.ToDouble(d) / 35239); + } + else if (textTo == l.Pecks) + { + ShowResult(Convert.ToDouble(d) / 8810); + } + else if (textTo == l.GallonsUK) + { + ShowResult(Convert.ToDouble(d) / 4546); + } + else if (textTo == l.QuartsUK) + { + ShowResult(Convert.ToDouble(d) / 1137); + } + else if (textTo == l.PintsUK) + { + ShowResult(Convert.ToDouble(d) / 568); + } + else if (textTo == l.FluidOuncesUK) + { + ShowResult(Convert.ToDouble(d) / 28.413); + } + } + else if (text == l.CubicMillimeters) + { + if (textTo == l.CubicKilometers) + { + ShowResult(Convert.ToDouble(d) / 1e+18); + } + else if (textTo == l.CubicMeters) + { + ShowResult(Convert.ToDouble(d) / 1e+9); + } + else if (textTo == l.Litres) + { + ShowResult(Convert.ToDouble(d) / 1e+6); + } + else if (textTo == l.CubicCentimeters) + { + ShowResult(Convert.ToDouble(d) / 1000); + } + else if (textTo == l.CubicMiles) + { + ShowResult(Convert.ToDouble(d) / 4.168e+18); + } + else if (textTo == l.CubicYards) + { + ShowResult(Convert.ToDouble(d) / 7.646e+8); + } + else if (textTo == l.CubicFTs) + { + ShowResult(Convert.ToDouble(d) / 2.832e+7); + } + else if (textTo == l.CubicInches) + { + ShowResult(Convert.ToDouble(d) / 16387); + } + else if (textTo == l.OilBarrels) + { + ShowResult(Convert.ToDouble(d) / 1.59e+8); + } + else if (textTo == l.GallonUS) + { + ShowResult(Convert.ToDouble(d) / 3.785e+6); + } + else if (textTo == l.QuartsUS) + { + ShowResult(Convert.ToDouble(d) / 946353); + } + else if (textTo == l.PintsUS) + { + ShowResult(Convert.ToDouble(d) / 473176); + } + else if (textTo == l.FluidOuncesUS) + { + ShowResult(Convert.ToDouble(d) / 29574); + } + else if (textTo == l.Bushels) + { + ShowResult(Convert.ToDouble(d) / 3.524e+7); + } + else if (textTo == l.Pecks) + { + ShowResult(Convert.ToDouble(d) / 8.81e+6); + } + else if (textTo == l.GallonsUK) + { + ShowResult(Convert.ToDouble(d) / 4.546e+6); + } + else if (textTo == l.QuartsUK) + { + ShowResult(Convert.ToDouble(d) / 1.137e+6); + } + else if (textTo == l.PintsUK) + { + ShowResult(Convert.ToDouble(d) / 568261); + } + else if (textTo == l.FluidOuncesUK) + { + ShowResult(Convert.ToDouble(d) / 28413); + } + } + else if (text == l.CubicMiles) + { + if (textTo == l.CubicKilometers) + { + ShowResult(Convert.ToDouble(d) * 4.168); + } + else if (textTo == l.CubicMeters) + { + ShowResult(Convert.ToDouble(d) * 4.168e+9); + } + else if (textTo == l.Litres) + { + ShowResult(Convert.ToDouble(d) * 4.168e+12); + } + else if (textTo == l.CubicCentimeters) + { + ShowResult(Convert.ToDouble(d) * 4.168e+15); + } + else if (textTo == l.CubicMillimeters) + { + ShowResult(Convert.ToDouble(d) * 4.168e+18); + } + else if (textTo == l.CubicYards) + { + ShowResult(Convert.ToDouble(d) * 5.452e+9); + } + else if (textTo == l.CubicFTs) + { + ShowResult(Convert.ToDouble(d) * 1.472e+11); + } + else if (textTo == l.CubicInches) + { + ShowResult(Convert.ToDouble(d) * 2.544e+14); + } + else if (textTo == l.OilBarrels) + { + ShowResult(Convert.ToDouble(d) * 2.622e+10); + } + else if (textTo == l.GallonUS) + { + ShowResult(Convert.ToDouble(d) * 1.101e+12); + } + else if (textTo == l.QuartsUS) + { + ShowResult(Convert.ToDouble(d) * 4.404e+12); + } + else if (textTo == l.PintsUS) + { + ShowResult(Convert.ToDouble(d) * 8.809e+12); + } + else if (textTo == l.FluidOuncesUS) + { + ShowResult(Convert.ToDouble(d) * 1.409e+14); + } + else if (textTo == l.Bushels) + { + ShowResult(Convert.ToDouble(d) * 1.183e+11); + } + else if (textTo == l.Pecks) + { + ShowResult(Convert.ToDouble(d) * 4.731e+11); + } + else if (textTo == l.GallonsUK) + { + ShowResult(Convert.ToDouble(d) * 9.169e+11); + } + else if (textTo == l.QuartsUK) + { + ShowResult(Convert.ToDouble(d) * 3.667e+12); + } + else if (textTo == l.PintsUK) + { + ShowResult(Convert.ToDouble(d) * 7.335e+12); + } + else if (textTo == l.FluidOuncesUK) + { + ShowResult(Convert.ToDouble(d) * 1.467e+14); + } + } + else if (text == l.CubicYards) + { + if (textTo == l.CubicKilometers) + { + ShowResult(Convert.ToDouble(d) / 1.308e+9); + } + else if (textTo == l.CubicMeters) + { + ShowResult(Convert.ToDouble(d) / 1.308); + } + else if (textTo == l.Litres) + { + ShowResult(Convert.ToDouble(d) * 765); + } + else if (textTo == l.CubicCentimeters) + { + ShowResult(Convert.ToDouble(d) * 764555); + } + else if (textTo == l.CubicMillimeters) + { + ShowResult(Convert.ToDouble(d) * 7.646e+8); + } + else if (textTo == l.CubicMiles) + { + ShowResult(Convert.ToDouble(d) / 5.452e+9); + } + else if (textTo == l.CubicFTs) + { + ShowResult(Convert.ToDouble(d) * 27); + } + else if (textTo == l.CubicInches) + { + ShowResult(Convert.ToDouble(d) * 46656); + } + else if (textTo == l.OilBarrels) + { + ShowResult(Convert.ToDouble(d) * 4.809); + } + else if (textTo == l.GallonUS) + { + ShowResult(Convert.ToDouble(d) * 202); + } + else if (textTo == l.QuartsUS) + { + ShowResult(Convert.ToDouble(d) * 808); + } + else if (textTo == l.PintsUS) + { + ShowResult(Convert.ToDouble(d) * 1616); + } + else if (textTo == l.FluidOuncesUS) + { + ShowResult(Convert.ToDouble(d) * 25853); + } + else if (textTo == l.Bushels) + { + ShowResult(Convert.ToDouble(d) * 21.696); + } + else if (textTo == l.Pecks) + { + ShowResult(Convert.ToDouble(d) * 86.785); + } + else if (textTo == l.GallonsUK) + { + ShowResult(Convert.ToDouble(d) * 168); + } + else if (textTo == l.QuartsUK) + { + ShowResult(Convert.ToDouble(d) * 673); + } + else if (textTo == l.PintsUK) + { + ShowResult(Convert.ToDouble(d) * 1345); + } + else if (textTo == l.FluidOuncesUK) + { + ShowResult(Convert.ToDouble(d) * 26909); + } + } + else if (text == l.CubicFTs) + { + if (textTo == l.CubicKilometers) + { + ShowResult(Convert.ToDouble(d) / 3.531e+10); + } + else if (textTo == l.CubicMeters) + { + ShowResult(Convert.ToDouble(d) / 35.315); + } + else if (textTo == l.Litres) + { + ShowResult(Convert.ToDouble(d) * 28.317); + } + else if (textTo == l.CubicCentimeters) + { + ShowResult(Convert.ToDouble(d) * 28317); + } + else if (textTo == l.CubicMillimeters) + { + ShowResult(Convert.ToDouble(d) * 2.832e+7); + } + else if (textTo == l.CubicMiles) + { + ShowResult(Convert.ToDouble(d) / 1.472e+11); + } + else if (textTo == l.CubicYards) + { + ShowResult(Convert.ToDouble(d) / 27); + } + else if (textTo == l.CubicInches) + { + ShowResult(Convert.ToDouble(d) * 1728); + } + else if (textTo == l.OilBarrels) + { + ShowResult(Convert.ToDouble(d) / 5.615); + } + else if (textTo == l.GallonUS) + { + ShowResult(Convert.ToDouble(d) * 7.481); + } + else if (textTo == l.QuartsUS) + { + ShowResult(Convert.ToDouble(d) * 29.922); + } + else if (textTo == l.PintsUS) + { + ShowResult(Convert.ToDouble(d) * 59.844); + } + else if (textTo == l.FluidOuncesUS) + { + ShowResult(Convert.ToDouble(d) * 958); + } + else if (textTo == l.Bushels) + { + ShowResult(Convert.ToDouble(d) / 1.244); + } + else if (textTo == l.Pecks) + { + ShowResult(Convert.ToDouble(d) * 3.214); + } + else if (textTo == l.GallonsUK) + { + ShowResult(Convert.ToDouble(d) * 6.229); + } + else if (textTo == l.QuartsUK) + { + ShowResult(Convert.ToDouble(d) * 24.915); + } + else if (textTo == l.PintsUK) + { + ShowResult(Convert.ToDouble(d) * 49.831); + } + else if (textTo == l.FluidOuncesUK) + { + ShowResult(Convert.ToDouble(d) * 997); + } + } + else if (text == l.CubicInches) + { + if (textTo == l.CubicKilometers) + { + ShowResult(Convert.ToDouble(d) / 6.102e+13); + } + else if (textTo == l.CubicMeters) + { + ShowResult(Convert.ToDouble(d) / 61024); + } + else if (textTo == l.Litres) + { + ShowResult(Convert.ToDouble(d) / 61.024); + } + else if (textTo == l.CubicCentimeters) + { + ShowResult(Convert.ToDouble(d) * 16.387); + } + else if (textTo == l.CubicMillimeters) + { + ShowResult(Convert.ToDouble(d) * 16387); + } + else if (textTo == l.CubicMiles) + { + ShowResult(Convert.ToDouble(d) / 2.544e+14); + } + else if (textTo == l.CubicYards) + { + ShowResult(Convert.ToDouble(d) / 46656); + } + else if (textTo == l.CubicFTs) + { + ShowResult(Convert.ToDouble(d) / 1728); + } + else if (textTo == l.OilBarrels) + { + ShowResult(Convert.ToDouble(d) / 9702); + } + else if (textTo == l.GallonUS) + { + ShowResult(Convert.ToDouble(d) / 231); + } + else if (textTo == l.QuartsUS) + { + ShowResult(Convert.ToDouble(d) / 57.75); + } + else if (textTo == l.PintsUS) + { + ShowResult(Convert.ToDouble(d) / 28.875); + } + else if (textTo == l.FluidOuncesUS) + { + ShowResult(Convert.ToDouble(d) / 1.805); + } + else if (textTo == l.Bushels) + { + ShowResult(Convert.ToDouble(d) / 2150); + } + else if (textTo == l.Pecks) + { + ShowResult(Convert.ToDouble(d) / 538); + } + else if (textTo == l.GallonsUK) + { + ShowResult(Convert.ToDouble(d) / 277); + } + else if (textTo == l.QuartsUK) + { + ShowResult(Convert.ToDouble(d) / 69.355); + } + else if (textTo == l.PintsUK) + { + ShowResult(Convert.ToDouble(d) / 34.677); + } + else if (textTo == l.FluidOuncesUK) + { + ShowResult(Convert.ToDouble(d) / 1.734); + } + } + else if (text == l.OilBarrels) + { + if (textTo == l.CubicKilometers) + { + ShowResult(Convert.ToDouble(d) / 6.29e+9); + } + else if (textTo == l.CubicMeters) + { + ShowResult(Convert.ToDouble(d) / 6.29); + } + else if (textTo == l.Litres) + { + ShowResult(Convert.ToDouble(d) * 159); + } + else if (textTo == l.CubicCentimeters) + { + ShowResult(Convert.ToDouble(d) * 158987); + } + else if (textTo == l.CubicMillimeters) + { + ShowResult(Convert.ToDouble(d) * 1.59e+8); + } + else if (textTo == l.CubicMiles) + { + ShowResult(Convert.ToDouble(d) / 2.622e+10); + } + else if (textTo == l.CubicYards) + { + ShowResult(Convert.ToDouble(d) / 4.809); + } + else if (textTo == l.CubicFTs) + { + ShowResult(Convert.ToDouble(d) * 5.615); + } + else if (textTo == l.CubicInches) + { + ShowResult(Convert.ToDouble(d) * 9702); + } + else if (textTo == l.GallonUS) + { + ShowResult(Convert.ToDouble(d) * 42); + } + else if (textTo == l.QuartsUS) + { + ShowResult(Convert.ToDouble(d) * 168); + } + else if (textTo == l.PintsUS) + { + ShowResult(Convert.ToDouble(d) * 336); + } + else if (textTo == l.FluidOuncesUS) + { + ShowResult(Convert.ToDouble(d) * 5376); + } + else if (textTo == l.Bushels) + { + ShowResult(Convert.ToDouble(d) * 4.512); + } + else if (textTo == l.Pecks) + { + ShowResult(Convert.ToDouble(d) * 18.047); + } + else if (textTo == l.GallonsUK) + { + ShowResult(Convert.ToDouble(d) * 34.972); + } + else if (textTo == l.QuartsUK) + { + ShowResult(Convert.ToDouble(d) * 140); + } + else if (textTo == l.PintsUK) + { + ShowResult(Convert.ToDouble(d) * 280); + } + else if (textTo == l.FluidOuncesUK) + { + ShowResult(Convert.ToDouble(d) * 5596); + } + } + else if (text == l.GallonUS) + { + if (textTo == l.CubicKilometers) + { + ShowResult(Convert.ToDouble(d) / 2.642e+11); + } + else if (textTo == l.CubicMeters) + { + ShowResult(Convert.ToDouble(d) / 264); + } + else if (textTo == l.Litres) + { + ShowResult(Convert.ToDouble(d) * 3.785); + } + else if (textTo == l.CubicCentimeters) + { + ShowResult(Convert.ToDouble(d) * 3785); + } + else if (textTo == l.CubicMillimeters) + { + ShowResult(Convert.ToDouble(d) * 3.785e+6); + } + else if (textTo == l.CubicMiles) + { + ShowResult(Convert.ToDouble(d) / 1.101e+12); + } + else if (textTo == l.CubicYards) + { + ShowResult(Convert.ToDouble(d) / 202); + } + else if (textTo == l.CubicFTs) + { + ShowResult(Convert.ToDouble(d) / 7.481); + } + else if (textTo == l.CubicInches) + { + ShowResult(Convert.ToDouble(d) * 231); + } + else if (textTo == l.OilBarrels) + { + ShowResult(Convert.ToDouble(d) / 42); + } + else if (textTo == l.QuartsUS) + { + ShowResult(Convert.ToDouble(d) * 4); + } + else if (textTo == l.PintsUS) + { + ShowResult(Convert.ToDouble(d) * 8); + } + else if (textTo == l.FluidOuncesUS) + { + ShowResult(Convert.ToDouble(d) * 128); + } + else if (textTo == l.Bushels) + { + ShowResult(Convert.ToDouble(d) / 9.309); + } + else if (textTo == l.Pecks) + { + ShowResult(Convert.ToDouble(d) / 2.327); + } + else if (textTo == l.GallonsUK) + { + ShowResult(Convert.ToDouble(d) / 1.201); + } + else if (textTo == l.QuartsUK) + { + ShowResult(Convert.ToDouble(d) * 3.331); + } + else if (textTo == l.PintsUK) + { + ShowResult(Convert.ToDouble(d) * 6.661); + } + else if (textTo == l.FluidOuncesUK) + { + ShowResult(Convert.ToDouble(d) * 133); + } + } + else if (text == l.QuartsUS) + { + if (textTo == l.CubicKilometers) + { + ShowResult(Convert.ToDouble(d) / 1.057e+12); + } + else if (textTo == l.CubicMeters) + { + ShowResult(Convert.ToDouble(d) / 1057); + } + else if (textTo == l.Litres) + { + ShowResult(Convert.ToDouble(d) / 1.057); + } + else if (textTo == l.CubicCentimeters) + { + ShowResult(Convert.ToDouble(d) * 946); + } + else if (textTo == l.CubicMillimeters) + { + ShowResult(Convert.ToDouble(d) * 946353); + } + else if (textTo == l.CubicMiles) + { + ShowResult(Convert.ToDouble(d) / 4.404e+12); + } + else if (textTo == l.CubicYards) + { + ShowResult(Convert.ToDouble(d) / 808); + } + else if (textTo == l.CubicFTs) + { + ShowResult(Convert.ToDouble(d) / 29.922); + } + else if (textTo == l.CubicInches) + { + ShowResult(Convert.ToDouble(d) * 57.75); + } + else if (textTo == l.OilBarrels) + { + ShowResult(Convert.ToDouble(d) / 168); + } + else if (textTo == l.GallonUS) + { + ShowResult(Convert.ToDouble(d) / 4); + } + else if (textTo == l.PintsUS) + { + ShowResult(Convert.ToDouble(d) * 2); + } + else if (textTo == l.FluidOuncesUS) + { + ShowResult(Convert.ToDouble(d) * 32); + } + else if (textTo == l.Bushels) + { + ShowResult(Convert.ToDouble(d) / 37.237); + } + else if (textTo == l.Pecks) + { + ShowResult(Convert.ToDouble(d) / 9.309); + } + else if (textTo == l.GallonsUK) + { + ShowResult(Convert.ToDouble(d) / 4.804); + } + else if (textTo == l.QuartsUK) + { + ShowResult(Convert.ToDouble(d) / 1.201); + } + else if (textTo == l.PintsUK) + { + ShowResult(Convert.ToDouble(d) * 1.665); + } + else if (textTo == l.FluidOuncesUK) + { + ShowResult(Convert.ToDouble(d) * 33.307); + } + } + else if (text == l.PintsUS) + { + if (textTo == l.CubicKilometers) + { + ShowResult(Convert.ToDouble(d) / 2.113e+12); + } + else if (textTo == l.CubicMeters) + { + ShowResult(Convert.ToDouble(d) / 2113); + } + else if (textTo == l.Litres) + { + ShowResult(Convert.ToDouble(d) / 2.113); + } + else if (textTo == l.CubicCentimeters) + { + ShowResult(Convert.ToDouble(d) * 473); + } + else if (textTo == l.CubicMillimeters) + { + ShowResult(Convert.ToDouble(d) * 473176); + } + else if (textTo == l.CubicMiles) + { + ShowResult(Convert.ToDouble(d) / 8.809e+12); + } + else if (textTo == l.CubicYards) + { + ShowResult(Convert.ToDouble(d) / 1616); + } + else if (textTo == l.CubicFTs) + { + ShowResult(Convert.ToDouble(d) / 59.844); + } + else if (textTo == l.CubicInches) + { + ShowResult(Convert.ToDouble(d) * 28.875); + } + else if (textTo == l.OilBarrels) + { + ShowResult(Convert.ToDouble(d) / 336); + } + else if (textTo == l.GallonUS) + { + ShowResult(Convert.ToDouble(d) / 8); + } + else if (textTo == l.QuartsUS) + { + ShowResult(Convert.ToDouble(d) / 2); + } + else if (textTo == l.FluidOuncesUS) + { + ShowResult(Convert.ToDouble(d) * 16); + } + else if (textTo == l.Bushels) + { + ShowResult(Convert.ToDouble(d) / 74.473); + } + else if (textTo == l.Pecks) + { + ShowResult(Convert.ToDouble(d) / 18.618); + } + else if (textTo == l.GallonsUK) + { + ShowResult(Convert.ToDouble(d) / 9.608); + } + else if (textTo == l.QuartsUK) + { + ShowResult(Convert.ToDouble(d) / 2.402); + } + else if (textTo == l.PintsUK) + { + ShowResult(Convert.ToDouble(d) / 1.201); + } + else if (textTo == l.FluidOuncesUK) + { + ShowResult(Convert.ToDouble(d) * 16.653); + } + } + else if (text == l.FluidOuncesUS) + { + if (textTo == l.CubicKilometers) + { + ShowResult(Convert.ToDouble(d) / 3.381e+13); + } + else if (textTo == l.CubicMeters) + { + ShowResult(Convert.ToDouble(d) / 33814); + } + else if (textTo == l.Litres) + { + ShowResult(Convert.ToDouble(d) / 33.814); + } + else if (textTo == l.CubicCentimeters) + { + ShowResult(Convert.ToDouble(d) * 29.574); + } + else if (textTo == l.CubicMillimeters) + { + ShowResult(Convert.ToDouble(d) * 29574); + } + else if (textTo == l.CubicMiles) + { + ShowResult(Convert.ToDouble(d) / 1.409e+14); + } + else if (textTo == l.CubicYards) + { + ShowResult(Convert.ToDouble(d) / 25853); + } + else if (textTo == l.CubicFTs) + { + ShowResult(Convert.ToDouble(d) / 958); + } + else if (textTo == l.CubicInches) + { + ShowResult(Convert.ToDouble(d) * 1.805); + } + else if (textTo == l.OilBarrels) + { + ShowResult(Convert.ToDouble(d) / 5376); + } + else if (textTo == l.GallonUS) + { + ShowResult(Convert.ToDouble(d) / 128); + } + else if (textTo == l.QuartsUS) + { + ShowResult(Convert.ToDouble(d) / 32); + } + else if (textTo == l.PintsUS) + { + ShowResult(Convert.ToDouble(d) / 16); + } + else if (textTo == l.Bushels) + { + ShowResult(Convert.ToDouble(d) / 1192); + } + else if (textTo == l.Pecks) + { + ShowResult(Convert.ToDouble(d) / 298); + } + else if (textTo == l.GallonsUK) + { + ShowResult(Convert.ToDouble(d) / 154); + } + else if (textTo == l.QuartsUK) + { + ShowResult(Convert.ToDouble(d) / 38.43); + } + else if (textTo == l.PintsUK) + { + ShowResult(Convert.ToDouble(d) / 19.215); + } + else if (textTo == l.FluidOuncesUK) + { + ShowResult(Convert.ToDouble(d) * 1.041); + } + } + else if (text == l.Bushels) + { + if (textTo == l.CubicKilometers) + { + ShowResult(Convert.ToDouble(d) / 2.838e+10); + } + else if (textTo == l.CubicMeters) + { + ShowResult(Convert.ToDouble(d) / 28.378); + } + else if (textTo == l.Litres) + { + ShowResult(Convert.ToDouble(d) * 35.239); + } + else if (textTo == l.CubicCentimeters) + { + ShowResult(Convert.ToDouble(d) * 35239); + } + else if (textTo == l.CubicMillimeters) + { + ShowResult(Convert.ToDouble(d) * 3.524e+7); + } + else if (textTo == l.CubicMiles) + { + ShowResult(Convert.ToDouble(d) / 1.183e+11); + } + else if (textTo == l.CubicYards) + { + ShowResult(Convert.ToDouble(d) / 21.696); + } + else if (textTo == l.CubicFTs) + { + ShowResult(Convert.ToDouble(d) * 1.244); + } + else if (textTo == l.CubicInches) + { + ShowResult(Convert.ToDouble(d) * 2150); + } + else if (textTo == l.OilBarrels) + { + ShowResult(Convert.ToDouble(d) / 4.512); + } + else if (textTo == l.GallonUS) + { + ShowResult(Convert.ToDouble(d) * 9.309); + } + else if (textTo == l.QuartsUS) + { + ShowResult(Convert.ToDouble(d) * 37.237); + } + else if (textTo == l.PintsUS) + { + ShowResult(Convert.ToDouble(d) * 74.473); + } + else if (textTo == l.FluidOuncesUS) + { + ShowResult(Convert.ToDouble(d) * 1192); + } + else if (textTo == l.Pecks) + { + ShowResult(Convert.ToDouble(d) * 4); + } + else if (textTo == l.GallonsUK) + { + ShowResult(Convert.ToDouble(d) * 7.752); + } + else if (textTo == l.QuartsUK) + { + ShowResult(Convert.ToDouble(d) * 31.006); + } + else if (textTo == l.PintsUK) + { + ShowResult(Convert.ToDouble(d) * 62.012); + } + else if (textTo == l.FluidOuncesUK) + { + ShowResult(Convert.ToDouble(d) * 1240); + } + } + else if (text == l.Pecks) + { + if (textTo == l.CubicKilometers) + { + ShowResult(Convert.ToDouble(d) / 1.135e+11); + } + else if (textTo == l.CubicMeters) + { + ShowResult(Convert.ToDouble(d) / 114); + } + else if (textTo == l.Litres) + { + ShowResult(Convert.ToDouble(d) * 8.81); + } + else if (textTo == l.CubicCentimeters) + { + ShowResult(Convert.ToDouble(d) * 8810); + } + else if (textTo == l.CubicMillimeters) + { + ShowResult(Convert.ToDouble(d) * 8.81e+6); + } + else if (textTo == l.CubicMiles) + { + ShowResult(Convert.ToDouble(d) / 4.731e+11); + } + else if (textTo == l.CubicYards) + { + ShowResult(Convert.ToDouble(d) / 86.785); + } + else if (textTo == l.CubicFTs) + { + ShowResult(Convert.ToDouble(d) / 3.214); + } + else if (textTo == l.CubicInches) + { + ShowResult(Convert.ToDouble(d) * 538); + } + else if (textTo == l.OilBarrels) + { + ShowResult(Convert.ToDouble(d) / 18.047); + } + else if (textTo == l.GallonUS) + { + ShowResult(Convert.ToDouble(d) * 2.327); + } + else if (textTo == l.QuartsUS) + { + ShowResult(Convert.ToDouble(d) * 9.309); + } + else if (textTo == l.PintsUS) + { + ShowResult(Convert.ToDouble(d) * 18.618); + } + else if (textTo == l.FluidOuncesUS) + { + ShowResult(Convert.ToDouble(d) * 298); + } + else if (textTo == l.Bushels) + { + ShowResult(Convert.ToDouble(d) / 4); + } + else if (textTo == l.GallonsUK) + { + ShowResult(Convert.ToDouble(d) * 1.938); + } + else if (textTo == l.QuartsUK) + { + ShowResult(Convert.ToDouble(d) * 7.752); + } + else if (textTo == l.PintsUK) + { + ShowResult(Convert.ToDouble(d) * 15.503); + } + else if (textTo == l.FluidOuncesUK) + { + ShowResult(Convert.ToDouble(d) * 310); + } + } + else if (text == l.GallonsUK) + { + if (textTo == l.CubicKilometers) + { + ShowResult(Convert.ToDouble(d) / 2.2e+11); + } + else if (textTo == l.CubicMeters) + { + ShowResult(Convert.ToDouble(d) / 220); + } + else if (textTo == l.Litres) + { + ShowResult(Convert.ToDouble(d) * 4.546); + } + else if (textTo == l.CubicCentimeters) + { + ShowResult(Convert.ToDouble(d) * 4546); + } + else if (textTo == l.CubicMillimeters) + { + ShowResult(Convert.ToDouble(d) * 4.546e+6); + } + else if (textTo == l.CubicMiles) + { + ShowResult(Convert.ToDouble(d) / 9.169e+11); + } + else if (textTo == l.CubicYards) + { + ShowResult(Convert.ToDouble(d) / 168); + } + else if (textTo == l.CubicFTs) + { + ShowResult(Convert.ToDouble(d) / 6.229); + } + else if (textTo == l.CubicInches) + { + ShowResult(Convert.ToDouble(d) * 277); + } + else if (textTo == l.OilBarrels) + { + ShowResult(Convert.ToDouble(d) / 34.972); + } + else if (textTo == l.GallonUS) + { + ShowResult(Convert.ToDouble(d) * 1.201); + } + else if (textTo == l.QuartsUS) + { + ShowResult(Convert.ToDouble(d) * 4.804); + } + else if (textTo == l.PintsUS) + { + ShowResult(Convert.ToDouble(d) * 9.608); + } + else if (textTo == l.FluidOuncesUS) + { + ShowResult(Convert.ToDouble(d) * 154); + } + else if (textTo == l.Bushels) + { + ShowResult(Convert.ToDouble(d) / 7.752); + } + else if (textTo == l.Pecks) + { + ShowResult(Convert.ToDouble(d) / 1.938); + } + else if (textTo == l.QuartsUK) + { + ShowResult(Convert.ToDouble(d) * 4); + } + else if (textTo == l.PintsUK) + { + ShowResult(Convert.ToDouble(d) * 8); + } + else if (textTo == l.FluidOuncesUK) + { + ShowResult(Convert.ToDouble(d) * 160); + } + } + else if (text == l.QuartsUK) + { + if (textTo == l.CubicKilometers) + { + ShowResult(Convert.ToDouble(d) / 2.2e+11); + } + else if (textTo == l.CubicMeters) + { + ShowResult(Convert.ToDouble(d) / 880); + } + else if (textTo == l.Litres) + { + ShowResult(Convert.ToDouble(d) * 1.137); + } + else if (textTo == l.CubicCentimeters) + { + ShowResult(Convert.ToDouble(d) * 4546); + } + else if (textTo == l.CubicMillimeters) + { + ShowResult(Convert.ToDouble(d) * 4.546e+6); + } + else if (textTo == l.CubicMiles) + { + ShowResult(Convert.ToDouble(d) / 9.169e+11); + } + else if (textTo == l.CubicYards) + { + ShowResult(Convert.ToDouble(d) / 168); + } + else if (textTo == l.CubicFTs) + { + ShowResult(Convert.ToDouble(d) / 24.915); + } + else if (textTo == l.CubicInches) + { + ShowResult(Convert.ToDouble(d) * 69.355); + } + else if (textTo == l.OilBarrels) + { + ShowResult(Convert.ToDouble(d) / 34.972); + } + else if (textTo == l.GallonUS) + { + ShowResult(Convert.ToDouble(d) / 3.331); + } + else if (textTo == l.QuartsUS) + { + ShowResult(Convert.ToDouble(d) * 1.201); + } + else if (textTo == l.PintsUS) + { + ShowResult(Convert.ToDouble(d) * 2.402); + } + else if (textTo == l.FluidOuncesUS) + { + ShowResult(Convert.ToDouble(d) * 38.43); + } + else if (textTo == l.Bushels) + { + ShowResult(Convert.ToDouble(d) / 7.752); + } + else if (textTo == l.Pecks) + { + ShowResult(Convert.ToDouble(d) / 1.938); + } + else if (textTo == l.GallonsUK) + { + ShowResult(Convert.ToDouble(d) / 4); + } + else if (textTo == l.PintsUK) + { + ShowResult(Convert.ToDouble(d) * 4); + } + else if (textTo == l.FluidOuncesUK) + { + ShowResult(Convert.ToDouble(d) * 160); + } + } + else if (text == l.PintsUK) + { + if (textTo == l.CubicKilometers) + { + ShowResult(Convert.ToDouble(d) / 1.76e+12); + } + else if (textTo == l.CubicMeters) + { + ShowResult(Convert.ToDouble(d) / 1760); + } + else if (textTo == l.Litres) + { + ShowResult(Convert.ToDouble(d) / 1.76); + } + else if (textTo == l.CubicCentimeters) + { + ShowResult(Convert.ToDouble(d) * 568); + } + else if (textTo == l.CubicMillimeters) + { + ShowResult(Convert.ToDouble(d) * 568261); + } + else if (textTo == l.CubicMiles) + { + ShowResult(Convert.ToDouble(d) / 7.335e+12); + } + else if (textTo == l.CubicYards) + { + ShowResult(Convert.ToDouble(d) / 1345); + } + else if (textTo == l.CubicFTs) + { + ShowResult(Convert.ToDouble(d) / 49.831); + } + else if (textTo == l.CubicInches) + { + ShowResult(Convert.ToDouble(d) * 34.677); + } + else if (textTo == l.OilBarrels) + { + ShowResult(Convert.ToDouble(d) / 280); + } + else if (textTo == l.GallonUS) + { + ShowResult(Convert.ToDouble(d) / 6.661); + } + else if (textTo == l.QuartsUS) + { + ShowResult(Convert.ToDouble(d) / 1.665); + } + else if (textTo == l.PintsUS) + { + ShowResult(Convert.ToDouble(d)); + } + else if (textTo == l.FluidOuncesUS) + { + ShowResult(Convert.ToDouble(d) * 1.201); + } + else if (textTo == l.Bushels) + { + ShowResult(Convert.ToDouble(d) / 62.012); + } + else if (textTo == l.Pecks) + { + ShowResult(Convert.ToDouble(d) / 15.503); + } + else if (textTo == l.GallonsUK) + { + ShowResult(Convert.ToDouble(d) / 8); + } + else if (textTo == l.QuartsUK) + { + ShowResult(Convert.ToDouble(d) / 2); + } + else if (textTo == l.FluidOuncesUK) + { + ShowResult(Convert.ToDouble(d) * 20); + } + } + else if (text == l.FluidOuncesUK) + { + if (textTo == l.CubicKilometers) + { + ShowResult(Convert.ToDouble(d) / 3.52e+13); + } + else if (textTo == l.CubicMeters) + { + ShowResult(Convert.ToDouble(d) / 35195); + } + else if (textTo == l.Litres) + { + ShowResult(Convert.ToDouble(d) / 35.195); + } + else if (textTo == l.CubicCentimeters) + { + ShowResult(Convert.ToDouble(d) * 28.413); + } + else if (textTo == l.CubicMillimeters) + { + ShowResult(Convert.ToDouble(d) * 28413); + } + else if (textTo == l.CubicMiles) + { + ShowResult(Convert.ToDouble(d) / 1.467e+14); + } + else if (textTo == l.CubicYards) + { + ShowResult(Convert.ToDouble(d) / 26909); + } + else if (textTo == l.CubicFTs) + { + ShowResult(Convert.ToDouble(d) / 997); + } + else if (textTo == l.CubicInches) + { + ShowResult(Convert.ToDouble(d) * 1.734); + } + else if (textTo == l.OilBarrels) + { + ShowResult(Convert.ToDouble(d) / 5596); + } + else if (textTo == l.GallonUS) + { + ShowResult(Convert.ToDouble(d) / 133); + } + else if (textTo == l.QuartsUS) + { + ShowResult(Convert.ToDouble(d) / 33.307); + } + else if (textTo == l.PintsUS) + { + ShowResult(Convert.ToDouble(d) / 16.653); + } + else if (textTo == l.FluidOuncesUS) + { + ShowResult(Convert.ToDouble(d) / 1.041); + } + else if (textTo == l.Bushels) + { + ShowResult(Convert.ToDouble(d) / 1240); + } + else if (textTo == l.Pecks) + { + ShowResult(Convert.ToDouble(d) / 310); + } + else if (textTo == l.GallonsUK) + { + ShowResult(Convert.ToDouble(d) / 160); + } + else if (textTo == l.QuartsUK) + { + ShowResult(Convert.ToDouble(d) / 40); + } + else if (textTo == l.PintsUK) + { + ShowResult(Convert.ToDouble(d) / 20); + } + } + } + else if (cat == l.Area) + { + if (text == l.SquareKilometers) + { + if (textTo == l.SquareMeters) + { + ShowResult(Convert.ToDouble(d) * 1e+6); + } + else if (textTo == l.SquareCentimeters) + { + ShowResult(Convert.ToDouble(d) * 1e+10); + } + else if (textTo == l.SquareMillimeters) + { + ShowResult(Convert.ToDouble(d) * 1e+12); + } + else if (textTo == l.SquareMiles) + { + ShowResult(Convert.ToDouble(d) / 2.59); + } + else if (textTo == l.SquareYards) + { + ShowResult(Convert.ToDouble(d) * 1.196e+6); + } + else if (textTo == l.SquareFTs) + { + ShowResult(Convert.ToDouble(d) * 1.076e+7); + } + else if (textTo == l.SquareInches) + { + ShowResult(Convert.ToDouble(d) * 1.55e+9); + } + else if (textTo == l.Hectares) + { + ShowResult(Convert.ToDouble(d) * 100); + } + else if (textTo == l.Acres) + { + ShowResult(Convert.ToDouble(d) * 247); + } + else if (textTo == l.Ares) + { + ShowResult(Convert.ToDouble(d) * 10000); + } + } + else if (text == l.SquareMeters) + { + if (textTo == l.SquareKilometers) + { + ShowResult(Convert.ToDouble(d) / 1e+6); + } + else if (textTo == l.SquareCentimeters) + { + ShowResult(Convert.ToDouble(d) * 10000); + } + else if (textTo == l.SquareMillimeters) + { + ShowResult(Convert.ToDouble(d) * 1e+6); + } + else if (textTo == l.SquareMiles) + { + ShowResult(Convert.ToDouble(d) / 2.59e+6); + } + else if (textTo == l.SquareYards) + { + ShowResult(Convert.ToDouble(d) * 1.196); + } + else if (textTo == l.SquareFTs) + { + ShowResult(Convert.ToDouble(d) * 10.764); + } + else if (textTo == l.SquareInches) + { + ShowResult(Convert.ToDouble(d) * 1550); + } + else if (textTo == l.Hectares) + { + ShowResult(Convert.ToDouble(d) / 10000); + } + else if (textTo == l.Acres) + { + ShowResult(Convert.ToDouble(d) / 4047); + } + else if (textTo == l.Ares) + { + ShowResult(Convert.ToDouble(d) * 100); + } + } + else if (text == l.SquareCentimeters) + { + if (textTo == l.SquareKilometers) + { + ShowResult(Convert.ToDouble(d) / 1e+10); + } + else if (textTo == l.SquareMeters) + { + ShowResult(Convert.ToDouble(d) / 10000); + } + else if (textTo == l.SquareMillimeters) + { + ShowResult(Convert.ToDouble(d) * 100); + } + else if (textTo == l.SquareMiles) + { + ShowResult(Convert.ToDouble(d) / 2.59e+10); + } + else if (textTo == l.SquareYards) + { + ShowResult(Convert.ToDouble(d) / 8361); + } + else if (textTo == l.SquareFTs) + { + ShowResult(Convert.ToDouble(d) / 929); + } + else if (textTo == l.SquareInches) + { + ShowResult(Convert.ToDouble(d) / 6.452); + } + else if (textTo == l.Hectares) + { + ShowResult(Convert.ToDouble(d) / 1e+8); + } + else if (textTo == l.Acres) + { + ShowResult(Convert.ToDouble(d) / 4.047e+7); + } + else if (textTo == l.Ares) + { + ShowResult(Convert.ToDouble(d) / 1e+6); + } + } + else if (text == l.SquareMillimeters) + { + if (textTo == l.SquareKilometers) + { + ShowResult(Convert.ToDouble(d) / 1e+12); + } + else if (textTo == l.SquareMeters) + { + ShowResult(Convert.ToDouble(d) / 1e+6); + } + else if (textTo == l.SquareCentimeters) + { + ShowResult(Convert.ToDouble(d) / 100); + } + else if (textTo == l.SquareMiles) + { + ShowResult(Convert.ToDouble(d) / 2.59e+12); + } + else if (textTo == l.SquareYards) + { + ShowResult(Convert.ToDouble(d) / 836127); + } + else if (textTo == l.SquareFTs) + { + ShowResult(Convert.ToDouble(d) / 92903); + } + else if (textTo == l.SquareInches) + { + ShowResult(Convert.ToDouble(d) / 645); + } + else if (textTo == l.Hectares) + { + ShowResult(Convert.ToDouble(d) / 1e+10); + } + else if (textTo == l.Acres) + { + ShowResult(Convert.ToDouble(d) / 4.047e+9); + } + else if (textTo == l.Ares) + { + ShowResult(Convert.ToDouble(d) / 1e+8); + } + } + else if (text == l.SquareMiles) + { + if (textTo == l.SquareKilometers) + { + ShowResult(Convert.ToDouble(d) * 2.59); + } + else if (textTo == l.SquareMeters) + { + ShowResult(Convert.ToDouble(d) * 2.59e+6); + } + else if (textTo == l.SquareCentimeters) + { + ShowResult(Convert.ToDouble(d) * 2.59e+10); + } + else if (textTo == l.SquareMillimeters) + { + ShowResult(Convert.ToDouble(d) * 2.59e+12); + } + else if (textTo == l.SquareYards) + { + ShowResult(Convert.ToDouble(d) * 3.098e+6); + } + else if (textTo == l.SquareFTs) + { + ShowResult(Convert.ToDouble(d) * 2.788e+7); + } + else if (textTo == l.SquareInches) + { + ShowResult(Convert.ToDouble(d) * 4.014e+9); + } + else if (textTo == l.Hectares) + { + ShowResult(Convert.ToDouble(d) * 259); + } + else if (textTo == l.Acres) + { + ShowResult(Convert.ToDouble(d) * 640); + } + else if (textTo == l.Ares) + { + ShowResult(Convert.ToDouble(d) * 25900); + } + } + else if (text == l.SquareYards) + { + if (textTo == l.SquareKilometers) + { + ShowResult(Convert.ToDouble(d) / 1.196e+6); + } + else if (textTo == l.SquareMeters) + { + ShowResult(Convert.ToDouble(d) / 1.196); + } + else if (textTo == l.SquareCentimeters) + { + ShowResult(Convert.ToDouble(d) * 8361); + } + else if (textTo == l.SquareMillimeters) + { + ShowResult(Convert.ToDouble(d) * 836127); + } + else if (textTo == l.SquareMiles) + { + ShowResult(Convert.ToDouble(d) / 3.098e+6); + } + else if (textTo == l.SquareFTs) + { + ShowResult(Convert.ToDouble(d) * 9); + } + else if (textTo == l.SquareInches) + { + ShowResult(Convert.ToDouble(d) * 1296); + } + else if (textTo == l.Hectares) + { + ShowResult(Convert.ToDouble(d) / 11960); + } + else if (textTo == l.Acres) + { + ShowResult(Convert.ToDouble(d) / 4840); + } + else if (textTo == l.Ares) + { + ShowResult(Convert.ToDouble(d) / 120); + } + } + else if (text == l.SquareFTs) + { + if (textTo == l.SquareKilometers) + { + ShowResult(Convert.ToDouble(d) / 1.076e+7); + } + else if (textTo == l.SquareMeters) + { + ShowResult(Convert.ToDouble(d) / 10.764); + } + else if (textTo == l.SquareCentimeters) + { + ShowResult(Convert.ToDouble(d) * 929); + } + else if (textTo == l.SquareMillimeters) + { + ShowResult(Convert.ToDouble(d) * 92903); + } + else if (textTo == l.SquareMiles) + { + ShowResult(Convert.ToDouble(d) / 2.788e+7); + } + else if (textTo == l.SquareYards) + { + ShowResult(Convert.ToDouble(d) / 9); + } + else if (textTo == l.SquareInches) + { + ShowResult(Convert.ToDouble(d)); + } + else if (textTo == l.Hectares) + { + ShowResult(Convert.ToDouble(d) * 144); + } + else if (textTo == l.Acres) + { + ShowResult(Convert.ToDouble(d) / 43560); + } + else if (textTo == l.Ares) + { + ShowResult(Convert.ToDouble(d) / 1076); + } + } + else if (text == l.SquareInches) + { + if (textTo == l.SquareKilometers) + { + ShowResult(Convert.ToDouble(d) / 1.55e+9); + } + else if (textTo == l.SquareMeters) + { + ShowResult(Convert.ToDouble(d) / 1550); + } + else if (textTo == l.SquareCentimeters) + { + ShowResult(Convert.ToDouble(d) * 6.452); + } + else if (textTo == l.SquareMillimeters) + { + ShowResult(Convert.ToDouble(d) * 645); + } + else if (textTo == l.SquareMiles) + { + ShowResult(Convert.ToDouble(d) / 4.014e+9); + } + else if (textTo == l.SquareYards) + { + ShowResult(Convert.ToDouble(d) / 1296); + } + else if (textTo == l.SquareFTs) + { + ShowResult(Convert.ToDouble(d) / 144); + } + else if (textTo == l.Hectares) + { + ShowResult(Convert.ToDouble(d) / 1.55e+7); + } + else if (textTo == l.Acres) + { + ShowResult(Convert.ToDouble(d) / 6.273e+6); + } + else if (textTo == l.Ares) + { + ShowResult(Convert.ToDouble(d) / 6.273e+6); + } + } + else if (text == l.Hectares) + { + if (textTo == l.SquareKilometers) + { + ShowResult(Convert.ToDouble(d) / 100); + } + else if (textTo == l.SquareMeters) + { + ShowResult(Convert.ToDouble(d) * 10000); + } + else if (textTo == l.SquareCentimeters) + { + ShowResult(Convert.ToDouble(d) * 1e+8); + } + else if (textTo == l.SquareMillimeters) + { + ShowResult(Convert.ToDouble(d) * 1e+10); + } + else if (textTo == l.SquareMiles) + { + ShowResult(Convert.ToDouble(d) / 259); + } + else if (textTo == l.SquareYards) + { + ShowResult(Convert.ToDouble(d) * 11960); + } + else if (textTo == l.SquareFTs) + { + ShowResult(Convert.ToDouble(d) * 107639); + } + else if (textTo == l.SquareInches) + { + ShowResult(Convert.ToDouble(d) * 1.55e+7); + } + else if (textTo == l.Acres) + { + ShowResult(Convert.ToDouble(d) * 2.471); + } + else if (textTo == l.Ares) + { + ShowResult(Convert.ToDouble(d) * 100); + } + } + else if (text == l.Acres) + { + if (textTo == l.SquareKilometers) + { + ShowResult(Convert.ToDouble(d) / 247); + } + else if (textTo == l.SquareMeters) + { + ShowResult(Convert.ToDouble(d) * 4047); + } + else if (textTo == l.SquareCentimeters) + { + ShowResult(Convert.ToDouble(d) * 4.047e+7); + } + else if (textTo == l.SquareMillimeters) + { + ShowResult(Convert.ToDouble(d) * 4.047e+9); + } + else if (textTo == l.SquareMiles) + { + ShowResult(Convert.ToDouble(d) / 640); + } + else if (textTo == l.SquareYards) + { + ShowResult(Convert.ToDouble(d) * 4840); + } + else if (textTo == l.SquareFTs) + { + ShowResult(Convert.ToDouble(d) * 43560); + } + else if (textTo == l.SquareInches) + { + ShowResult(Convert.ToDouble(d) * 6.273e+6); + } + else if (textTo == l.Hectares) + { + ShowResult(Convert.ToDouble(d) / 2.471); + } + else if (textTo == l.Ares) + { + ShowResult(Convert.ToDouble(d) * 40.469); + } + } + else if (text == l.Ares) + { + if (textTo == l.SquareKilometers) + { + ShowResult(Convert.ToDouble(d) / 10000); + } + else if (textTo == l.SquareMeters) + { + ShowResult(Convert.ToDouble(d) * 100); + } + else if (textTo == l.SquareCentimeters) + { + ShowResult(Convert.ToDouble(d) * 1e+6); + } + else if (textTo == l.SquareMillimeters) + { + ShowResult(Convert.ToDouble(d) * 1e+8); + } + else if (textTo == l.SquareMiles) + { + ShowResult(Convert.ToDouble(d) / 25900); + } + else if (textTo == l.SquareYards) + { + ShowResult(Convert.ToDouble(d) * 120); + } + else if (textTo == l.SquareFTs) + { + ShowResult(Convert.ToDouble(d) * 1076); + } + else if (textTo == l.SquareInches) + { + ShowResult(Convert.ToDouble(d) * 155000); + } + else if (textTo == l.Hectares) + { + ShowResult(Convert.ToDouble(d) / 100); + } + else if (textTo == l.Acres) + { + ShowResult(Convert.ToDouble(d) / 40.469); + } + } + } + else if (cat == l.Time) + { + if (text == l.Hours) + { + if (textTo == l.Minutes) + { + ShowResult(Convert.ToDouble(d) * 60); + } + else if (textTo == l.Seconds) + { + ShowResult(Convert.ToDouble(d) * 3600); + } + else if (textTo == l.Milliseconds) + { + ShowResult(Convert.ToDouble(d) * 3.6e+6); + } + else if (textTo == l.Microseconds) + { + ShowResult(Convert.ToDouble(d) * 3.6e+9); + } + } + else if (text == l.Minutes) + { + if (textTo == l.Hours) + { + ShowResult(Convert.ToDouble(d) / 60); + } + else if (textTo == l.Seconds) + { + ShowResult(Convert.ToDouble(d) * 60); + } + else if (textTo == l.Milliseconds) + { + ShowResult(Convert.ToDouble(d) * 60000); + } + else if (textTo == l.Microseconds) + { + ShowResult(Convert.ToDouble(d) * 6e+7); + } + } + else if (text == l.Seconds) + { + if (textTo == l.Hours) + { + ShowResult(Convert.ToDouble(d) / 3600); + } + else if (textTo == l.Minutes) + { + ShowResult(Convert.ToDouble(d) / 60); + } + else if (textTo == l.Milliseconds) + { + ShowResult(Convert.ToDouble(d) * TimeCode.BaseUnit); + } + else if (textTo == l.Microseconds) + { + ShowResult(Convert.ToDouble(d) * 1e+6); + } + } + else if (text == l.Milliseconds) + { + if (textTo == l.Hours) + { + ShowResult(Convert.ToDouble(d) / 3.6e+6); + } + else if (textTo == l.Minutes) + { + ShowResult(Convert.ToDouble(d) / 60000); + } + else if (textTo == l.Seconds) + { + ShowResult(Convert.ToDouble(d) / 1000); + } + else if (textTo == l.Microseconds) + { + ShowResult(Convert.ToDouble(d) * 1000); + } + } + else if (text == l.Microseconds) + { + if (textTo == l.Hours) + { + ShowResult(Convert.ToDouble(d) / 3.6e+9); + } + else if (textTo == l.Minutes) + { + ShowResult(Convert.ToDouble(d) / 6e+7); + } + else if (textTo == l.Seconds) + { + ShowResult(Convert.ToDouble(d) / 1e+6); + } + else if (textTo == l.Milliseconds) + { + ShowResult(Convert.ToDouble(d) / 1000); + } + } + } + else if (cat == l.Temperature) + { + if (text == l.Fahrenheit) + { + if (textTo == l.Celsius) + { + ShowResult((Convert.ToDouble(d) - 32) * 5 / 9); + } + else if (textTo == l.Kelvin) + { + ShowResult((Convert.ToDouble(d) - 32) * 5 / 9 + 273.15); + } + } + else if (text == l.Celsius) + { + if (textTo == l.Fahrenheit) + { + ShowResult(Convert.ToDouble(d) * 1.80 + 32); + } + else if (textTo == l.Kelvin) + { + ShowResult(Convert.ToDouble(d) + 273.15); + } + } + else if (text == l.Kelvin) + { + if (textTo == l.Fahrenheit) + { + ShowResult((Convert.ToDouble(d) - 273.15) * 9 / 5 + 32); + } + else if (textTo == l.Celsius) + { + ShowResult(Convert.ToDouble(d) - 273.15); + } + } + } + else if (cat == l.Velocity) + { + if (text == l.KilometersPerHour) + { + if (textTo == l.MetersPerSecond) + { + ShowResult(Convert.ToDouble(d) / 3.6); + } + else if (textTo == l.MilesPerHour) + { + ShowResult(Convert.ToDouble(d) / 1.609); + } + else if (textTo == l.YardsPerMinute) + { + ShowResult(Convert.ToDouble(d) * 18.227); + } + else if (textTo == l.FTsPerSecond) + { + ShowResult(Convert.ToDouble(d) / 1.097); + } + else if (textTo == l.Knots) + { + ShowResult(Convert.ToDouble(d) / 1.852); + } + } + if (text == l.MetersPerSecond) + { + if (textTo == l.KilometersPerHour) + { + ShowResult(Convert.ToDouble(d) * 3.6); + } + else if (textTo == l.MilesPerHour) + { + ShowResult(Convert.ToDouble(d) * 2.237); + } + else if (textTo == l.YardsPerMinute) + { + ShowResult(Convert.ToDouble(d) * 65.617); + } + else if (textTo == l.FTsPerSecond) + { + ShowResult(Convert.ToDouble(d) * 3.281); + } + else if (textTo == l.Knots) + { + ShowResult(Convert.ToDouble(d) * 1.944); + } + } + if (text == l.MilesPerHour) + { + if (textTo == l.KilometersPerHour) + { + ShowResult(Convert.ToDouble(d) * 1.609); + } + else if (textTo == l.MetersPerSecond) + { + ShowResult(Convert.ToDouble(d) / 2.237); + } + else if (textTo == l.YardsPerMinute) + { + ShowResult(Convert.ToDouble(d) * 29.333); + } + else if (textTo == l.FTsPerSecond) + { + ShowResult(Convert.ToDouble(d) * 1.467); + } + else if (textTo == l.Knots) + { + ShowResult(Convert.ToDouble(d) / 1.151); + } + } + if (text == l.YardsPerMinute) + { + if (textTo == l.KilometersPerHour) + { + ShowResult(Convert.ToDouble(d) / 18.227); + } + else if (textTo == l.MetersPerSecond) + { + ShowResult(Convert.ToDouble(d) / 65.617); + } + else if (textTo == l.MilesPerHour) + { + ShowResult(Convert.ToDouble(d) / 29.333); + } + else if (textTo == l.FTsPerSecond) + { + ShowResult(Convert.ToDouble(d) / 20); + } + else if (textTo == l.Knots) + { + ShowResult(Convert.ToDouble(d) / 33.756); + } + } + if (text == l.FTsPerSecond) + { + if (textTo == l.KilometersPerHour) + { + ShowResult(Convert.ToDouble(d) * 1.097); + } + else if (textTo == l.MetersPerSecond) + { + ShowResult(Convert.ToDouble(d) / 3.281); + } + else if (textTo == l.MilesPerHour) + { + ShowResult(Convert.ToDouble(d) / 1.467); + } + else if (textTo == l.YardsPerMinute) + { + ShowResult(Convert.ToDouble(d) * 20); + } + else if (textTo == l.Knots) + { + ShowResult(Convert.ToDouble(d) / 1.688); + } + } + if (text == l.Knots) + { + if (textTo == l.KilometersPerHour) + { + ShowResult(Convert.ToDouble(d) * 1.852); + } + else if (textTo == l.MetersPerSecond) + { + ShowResult(Convert.ToDouble(d) / 1.944); + } + else if (textTo == l.MilesPerHour) + { + ShowResult(Convert.ToDouble(d) * 1.151); + } + else if (textTo == l.YardsPerMinute) + { + ShowResult(Convert.ToDouble(d) * 33.756); + } + else if (textTo == l.FTsPerSecond) + { + ShowResult(Convert.ToDouble(d) * 1.688); + } + } + } + else if (cat == l.Force) + { + if (text == l.PoundsForce) + { + if (textTo == l.Newtons) + { + ShowResult(Convert.ToDouble(d) * 4.448); + } + else if (textTo == l.KilosForce) + { + ShowResult(Convert.ToDouble(d) / 2.205); + } + } + if (text == l.Newtons) + { + if (textTo == l.PoundsForce) + { + ShowResult(Convert.ToDouble(d) / 4.448); + } + else if (textTo == l.KilosForce) + { + ShowResult(Convert.ToDouble(d) / 9.807); + } + } + if (text == l.KilosForce) + { + if (textTo == l.PoundsForce) + { + ShowResult(Convert.ToDouble(d) * 2.205); + } + else if (textTo == l.Newtons) + { + ShowResult(Convert.ToDouble(d) * 9.807); + } + } + } + else if (cat == l.Energy) + { + if (text == l.Jouls) + { + if (textTo == l.Calories) + { + ShowResult(Convert.ToDouble(d) / 4.184); + } + else if (textTo == l.Ergs) + { + ShowResult(Convert.ToDouble(d) / 10000000); + } + else if (textTo == l.ElectronVolts) + { + ShowResult(Convert.ToDouble(d) * 6.242e+18); + } + else if (textTo == l.Btus) + { + ShowResult(Convert.ToDouble(d) / 1055); + } + } + else if (text == l.Calories) + { + if (textTo == l.Jouls) + { + ShowResult(Convert.ToDouble(d) * 4.184); + } + else if (textTo == l.Ergs) + { + ShowResult(Convert.ToDouble(d) * 41840000); + } + else if (textTo == l.ElectronVolts) + { + ShowResult(Convert.ToDouble(d) * 9.223e+18); + } + else if (textTo == l.Btus) + { + ShowResult(Convert.ToDouble(d) * 3.966); + } + } + else if (text == l.Ergs) + { + if (textTo == l.Jouls) + { + ShowResult(Convert.ToDouble(d) / 10000000); + } + else if (textTo == l.Calories) + { + ShowResult(Convert.ToDouble(d) / 4.184e+10); + } + else if (textTo == l.ElectronVolts) + { + ShowResult(Convert.ToDouble(d) * 6.242e+11); + } + else if (textTo == l.Btus) + { + ShowResult(Convert.ToDouble(d) / 1.055e+10); + } + } + else if (text == l.ElectronVolts) + { + if (textTo == l.Jouls) + { + ShowResult(Convert.ToDouble(d) / 6.242e+18); + } + else if (textTo == l.Calories) + { + ShowResult(Convert.ToDouble(d) / 9.223e+18); + } + else if (textTo == l.Ergs) + { + ShowResult(Convert.ToDouble(d) / 6.242e+11); + } + else if (textTo == l.Btus) + { + ShowResult(Convert.ToDouble(d) / 9.223e+18); + } + } + else if (text == l.Btus) + { + if (textTo == l.Jouls) + { + ShowResult(Convert.ToDouble(d) * 1055); + } + else if (textTo == l.Calories) + { + ShowResult(Convert.ToDouble(d) / 3.966); + } + else if (textTo == l.Ergs) + { + ShowResult(Convert.ToDouble(d) * 1.055e+10); + } + else if (textTo == l.ElectronVolts) + { + ShowResult(Convert.ToDouble(d) * 9.223e+18); + } + } + } + else if (cat == l.Power) + { + if (text == l.Watts) + { + if (textTo == l.Horsepower) + { + ShowResult(Convert.ToDouble(d) / 746); + } + } + else if (text == l.Horsepower) + { + if (textTo == l.Watts) + { + ShowResult(Convert.ToDouble(d) * 746); + } + } + } + else if (cat == l.Pressure) + { + if (text == l.Atmospheres) + { + if (textTo == l.Bars) + { + ShowResult(Convert.ToDouble(d) * 1.013); + } + else if (textTo == l.Pascals) + { + ShowResult(Convert.ToDouble(d) * 101325); + } + else if (textTo == l.MillimetersOfMercury) + { + ShowResult(Convert.ToDouble(d) * 760); + } + else if (textTo == l.PoundPerSquareInch) + { + ShowResult(Convert.ToDouble(d) * 14.696); + } + else if (textTo == l.KilogramPerSquareCentimeter) + { + ShowResult(Convert.ToDouble(d) * 1.033); + } + else if (textTo == l.KiloPascals) + { + ShowResult(Convert.ToDouble(d) * 101); + } + } + if (text == l.Bars) + { + if (textTo == l.Atmospheres) + { + ShowResult(Convert.ToDouble(d) / 1.013); + } + else if (textTo == l.Pascals) + { + ShowResult(Convert.ToDouble(d) * 100000); + } + else if (textTo == l.MillimetersOfMercury) + { + ShowResult(Convert.ToDouble(d) * 750); + } + else if (textTo == l.PoundPerSquareInch) + { + ShowResult(Convert.ToDouble(d) * 14.504); + } + else if (textTo == l.KilogramPerSquareCentimeter) + { + ShowResult(Convert.ToDouble(d) * 1.02); + } + else if (textTo == l.KiloPascals) + { + ShowResult(Convert.ToDouble(d) * 100); + } + } + if (text == l.Pascals) + { + if (textTo == l.Atmospheres) + { + ShowResult(Convert.ToDouble(d) / 101325); + } + else if (textTo == l.Bars) + { + ShowResult(Convert.ToDouble(d) / 100000); + } + else if (textTo == l.MillimetersOfMercury) + { + ShowResult(Convert.ToDouble(d) / 133); + } + else if (textTo == l.PoundPerSquareInch) + { + ShowResult(Convert.ToDouble(d) / 6895); + } + else if (textTo == l.KilogramPerSquareCentimeter) + { + ShowResult(Convert.ToDouble(d) / 98067); + } + else if (textTo == l.KiloPascals) + { + ShowResult(Convert.ToDouble(d) / 1000); + } + } + if (text == l.MillimetersOfMercury) + { + if (textTo == l.Atmospheres) + { + ShowResult(Convert.ToDouble(d) / 760); + } + else if (textTo == l.Bars) + { + ShowResult(Convert.ToDouble(d) / 750); + } + else if (textTo == l.Pascals) + { + ShowResult(Convert.ToDouble(d) * 133); + } + else if (textTo == l.PoundPerSquareInch) + { + ShowResult(Convert.ToDouble(d) / 51.715); + } + else if (textTo == l.KilogramPerSquareCentimeter) + { + ShowResult(Convert.ToDouble(d) / 736); + } + else if (textTo == l.KiloPascals) + { + ShowResult(Convert.ToDouble(d) / 7.501); + } + } + if (text == l.PoundPerSquareInch) + { + if (textTo == l.Atmospheres) + { + ShowResult(Convert.ToDouble(d) / 14.696); + } + else if (textTo == l.Bars) + { + ShowResult(Convert.ToDouble(d) / 14.504); + } + else if (textTo == l.Pascals) + { + ShowResult(Convert.ToDouble(d) * 6895); + } + else if (textTo == l.MillimetersOfMercury) + { + ShowResult(Convert.ToDouble(d) * 51.715); + } + else if (textTo == l.KilogramPerSquareCentimeter) + { + ShowResult(Convert.ToDouble(d) / 14.223); + } + else if (textTo == l.KiloPascals) + { + ShowResult(Convert.ToDouble(d) * 6.895); + } + } + if (text == l.KilogramPerSquareCentimeter) + { + if (textTo == l.Atmospheres) + { + ShowResult(Convert.ToDouble(d) / 1.033); + } + else if (textTo == l.Bars) + { + ShowResult(Convert.ToDouble(d) / 1.02); + } + else if (textTo == l.Pascals) + { + ShowResult(Convert.ToDouble(d) * 98067); + } + else if (textTo == l.MillimetersOfMercury) + { + ShowResult(Convert.ToDouble(d) * 736); + } + else if (textTo == l.PoundPerSquareInch) + { + ShowResult(Convert.ToDouble(d) * 14.223); + } + else if (textTo == l.KiloPascals) + { + ShowResult(Convert.ToDouble(d) * 98.066); + } + } + if (text == l.KiloPascals) + { + if (textTo == l.Atmospheres) + { + ShowResult(Convert.ToDouble(d) / 101); + } + else if (textTo == l.Bars) + { + ShowResult(Convert.ToDouble(d) / 100); + } + else if (textTo == l.Pascals) + { + ShowResult(Convert.ToDouble(d) * 1000); + } + else if (textTo == l.MillimetersOfMercury) + { + ShowResult(Convert.ToDouble(d) * 7.501); + } + else if (textTo == l.PoundPerSquareInch) + { + ShowResult(Convert.ToDouble(d) / 6.895); + } + else if (textTo == l.KilogramPerSquareCentimeter) + { + ShowResult(Convert.ToDouble(d) / 98.066); + } + } + } + } + + private void textBoxInput_KeyUp(object sender, KeyEventArgs e) + { + textBoxInput_TextChanged(null, null); + } + + private void textBoxInput_KeyPress(object sender, KeyPressEventArgs e) + { + if (char.IsControl(e.KeyChar) || char.IsDigit(e.KeyChar)) + { + return; + } + + if (e.KeyChar == '.' && !((sender as TextBox).Text.IndexOf('.') > -1) || e.KeyChar == ',' || e.KeyChar == '-' && !((sender as TextBox).Text.IndexOf('-') > -1)) + { + return; + } + + e.Handled = true; + } + + private void listBoxCategory_SelectedIndexChanged(object sender, EventArgs e) + { + string cat = listBoxCategory.SelectedItem.ToString(); + var l = Configuration.Settings.Language.MeasurementConverter; + + comboBoxFrom.Items.Clear(); + + if (cat == l.Length) + { + comboBoxFrom.Items.AddRange(_length.Cast().ToArray()); + } + else if (cat == l.Mass) + { + comboBoxFrom.Items.AddRange(_mass.Cast().ToArray()); + } + else if (cat == l.Volume) + { + comboBoxFrom.Items.AddRange(_volume.Cast().ToArray()); + } + else if (cat == l.Area) + { + comboBoxFrom.Items.AddRange(_area.Cast().ToArray()); + } + else if (cat == l.Time) + { + comboBoxFrom.Items.AddRange(_time.Cast().ToArray()); + } + else if (cat == l.Temperature) + { + comboBoxFrom.Items.AddRange(_temperature.Cast().ToArray()); + } + else if (cat == l.Velocity) + { + comboBoxFrom.Items.AddRange(_velocity.Cast().ToArray()); + } + else if (cat == l.Force) + { + comboBoxFrom.Items.AddRange(_force.Cast().ToArray()); + } + else if (cat == l.Energy) + { + comboBoxFrom.Items.AddRange(_energy.Cast().ToArray()); + } + else if (cat == l.Power) + { + comboBoxFrom.Items.AddRange(_power.Cast().ToArray()); + } + else if (cat == l.Pressure) + { + comboBoxFrom.Items.AddRange(_pressure.Cast().ToArray()); + } + + if (comboBoxFrom.Items.Count > 0) + { + if (comboBoxFrom.Items.Contains(_fields[1])) + { + comboBoxFrom.SelectedItem = _fields[1]; + } + else + { + comboBoxFrom.SelectedIndex = 0; + } + } + + comboBoxFrom_SelectedIndexChanged(null, null); + } + + private void listBoxCategory_LostFocus(object sender, EventArgs e) + { + // avoid flickering when losing focus + listBoxCategory.Update(); + } + + private void MeasurementConverter_Activated(object sender, EventArgs e) + { + Opacity = 1; + textBoxInput.Text = double.TryParse(Input, out _) ? Input : "1"; + } + + private void MeasurementConverter_FormClosed(object sender, FormClosedEventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void MeasurementConverter_Deactivate(object sender, EventArgs e) + { + if (DialogResult != DialogResult.Cancel) + { + Opacity = 0.5; + } + } + + private void MeasurementConverter_Load(object sender, EventArgs e) + { + CenterToParent(); + } + } +} diff --git a/src/Forms/ProfileChoose.resx b/src/ui/Forms/MeasurementConverter.resx similarity index 100% rename from src/Forms/ProfileChoose.resx rename to src/ui/Forms/MeasurementConverter.resx diff --git a/src/Forms/MergeDoubleLines.Designer.cs b/src/ui/Forms/MergeDoubleLines.Designer.cs similarity index 98% rename from src/Forms/MergeDoubleLines.Designer.cs rename to src/ui/Forms/MergeDoubleLines.Designer.cs index fb99a9606..9bb1b6ee1 100644 --- a/src/Forms/MergeDoubleLines.Designer.cs +++ b/src/ui/Forms/MergeDoubleLines.Designer.cs @@ -1,258 +1,258 @@ -namespace Nikse.SubtitleEdit.Forms -{ - partial class MergeDoubleLines - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.groupBoxLinesFound = new System.Windows.Forms.GroupBox(); - this.listViewFixes = new System.Windows.Forms.ListView(); - this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderText = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.buttonOK = new System.Windows.Forms.Button(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.checkBoxIncludeIncrementing = new System.Windows.Forms.CheckBox(); - this.numericUpDownMaxMillisecondsBetweenLines = new System.Windows.Forms.NumericUpDown(); - this.labelMaxMillisecondsBetweenLines = new System.Windows.Forms.Label(); - this.SubtitleListview1 = new Nikse.SubtitleEdit.Controls.SubtitleListView(); - this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); - this.toolStripMenuItemSelectAll = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemInverseSelection = new System.Windows.Forms.ToolStripMenuItem(); - this.groupBoxLinesFound.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxMillisecondsBetweenLines)).BeginInit(); - this.contextMenuStrip1.SuspendLayout(); - this.SuspendLayout(); - // - // columnHeader4 - // - this.columnHeader4.Text = "Apply"; - this.columnHeader4.Width = 45; - // - // groupBoxLinesFound - // - this.groupBoxLinesFound.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxLinesFound.Controls.Add(this.listViewFixes); - this.groupBoxLinesFound.Location = new System.Drawing.Point(15, 55); - this.groupBoxLinesFound.Name = "groupBoxLinesFound"; - this.groupBoxLinesFound.Size = new System.Drawing.Size(1025, 196); - this.groupBoxLinesFound.TabIndex = 45; - this.groupBoxLinesFound.TabStop = false; - this.groupBoxLinesFound.Text = "Lines that will be merged"; - // - // listViewFixes - // - this.listViewFixes.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.listViewFixes.CheckBoxes = true; - this.listViewFixes.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeader4, - this.columnHeader5, - this.columnHeaderText}); - this.listViewFixes.ContextMenuStrip = this.contextMenuStrip1; - this.listViewFixes.FullRowSelect = true; - this.listViewFixes.HideSelection = false; - this.listViewFixes.Location = new System.Drawing.Point(6, 19); - this.listViewFixes.Name = "listViewFixes"; - this.listViewFixes.Size = new System.Drawing.Size(1013, 177); - this.listViewFixes.TabIndex = 0; - this.listViewFixes.UseCompatibleStateImageBehavior = false; - this.listViewFixes.View = System.Windows.Forms.View.Details; - this.listViewFixes.SelectedIndexChanged += new System.EventHandler(this.listViewFixes_SelectedIndexChanged); - // - // columnHeader5 - // - this.columnHeader5.Text = "Line#"; - this.columnHeader5.Width = 122; - // - // columnHeaderText - // - this.columnHeaderText.Text = "New text"; - this.columnHeaderText.Width = 500; - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(884, 692); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 41; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(965, 692); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 42; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.ButtonCancelClick); - // - // checkBoxIncludeIncrementing - // - this.checkBoxIncludeIncrementing.AutoSize = true; - this.checkBoxIncludeIncrementing.Checked = true; - this.checkBoxIncludeIncrementing.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxIncludeIncrementing.Location = new System.Drawing.Point(306, 16); - this.checkBoxIncludeIncrementing.Name = "checkBoxIncludeIncrementing"; - this.checkBoxIncludeIncrementing.Size = new System.Drawing.Size(148, 17); - this.checkBoxIncludeIncrementing.TabIndex = 47; - this.checkBoxIncludeIncrementing.Text = "Include incrementing lines"; - this.checkBoxIncludeIncrementing.UseVisualStyleBackColor = true; - this.checkBoxIncludeIncrementing.CheckedChanged += new System.EventHandler(this.checkBoxFixIncrementing_CheckedChanged); - // - // numericUpDownMaxMillisecondsBetweenLines - // - this.numericUpDownMaxMillisecondsBetweenLines.Location = new System.Drawing.Point(202, 15); - this.numericUpDownMaxMillisecondsBetweenLines.Maximum = new decimal(new int[] { - 10000, - 0, - 0, - 0}); - this.numericUpDownMaxMillisecondsBetweenLines.Name = "numericUpDownMaxMillisecondsBetweenLines"; - this.numericUpDownMaxMillisecondsBetweenLines.Size = new System.Drawing.Size(64, 20); - this.numericUpDownMaxMillisecondsBetweenLines.TabIndex = 48; - this.numericUpDownMaxMillisecondsBetweenLines.Value = new decimal(new int[] { - 250, - 0, - 0, - 0}); - this.numericUpDownMaxMillisecondsBetweenLines.ValueChanged += new System.EventHandler(this.numericUpDownMaxMillisecondsBetweenLines_ValueChanged); - // - // labelMaxMillisecondsBetweenLines - // - this.labelMaxMillisecondsBetweenLines.AutoSize = true; - this.labelMaxMillisecondsBetweenLines.Location = new System.Drawing.Point(18, 17); - this.labelMaxMillisecondsBetweenLines.Name = "labelMaxMillisecondsBetweenLines"; - this.labelMaxMillisecondsBetweenLines.Size = new System.Drawing.Size(178, 13); - this.labelMaxMillisecondsBetweenLines.TabIndex = 49; - this.labelMaxMillisecondsBetweenLines.Text = "Maximum milliseconds between lines"; - // - // SubtitleListview1 - // - this.SubtitleListview1.AllowColumnReorder = true; - this.SubtitleListview1.AllowDrop = true; - this.SubtitleListview1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.SubtitleListview1.FirstVisibleIndex = -1; - this.SubtitleListview1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.SubtitleListview1.FullRowSelect = true; - this.SubtitleListview1.GridLines = true; - this.SubtitleListview1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; - this.SubtitleListview1.HideSelection = false; - this.SubtitleListview1.Location = new System.Drawing.Point(12, 257); - this.SubtitleListview1.Name = "SubtitleListview1"; - this.SubtitleListview1.OwnerDraw = true; - this.SubtitleListview1.Size = new System.Drawing.Size(1028, 429); - this.SubtitleListview1.SubtitleFontBold = false; - this.SubtitleListview1.SubtitleFontName = "Tahoma"; - this.SubtitleListview1.SubtitleFontSize = 8; - this.SubtitleListview1.TabIndex = 40; - this.SubtitleListview1.UseCompatibleStateImageBehavior = false; - this.SubtitleListview1.UseSyntaxColoring = true; - this.SubtitleListview1.View = System.Windows.Forms.View.Details; - // - // contextMenuStrip1 - // - this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripMenuItemSelectAll, - this.toolStripMenuItemInverseSelection}); - this.contextMenuStrip1.Name = "contextMenuStrip1"; - this.contextMenuStrip1.Size = new System.Drawing.Size(162, 48); - // - // toolStripMenuItemSelectAll - // - this.toolStripMenuItemSelectAll.Name = "toolStripMenuItemSelectAll"; - this.toolStripMenuItemSelectAll.Size = new System.Drawing.Size(180, 22); - this.toolStripMenuItemSelectAll.Text = "Select all"; - this.toolStripMenuItemSelectAll.Click += new System.EventHandler(this.toolStripMenuItemSelectAll_Click); - // - // toolStripMenuItemInverseSelection - // - this.toolStripMenuItemInverseSelection.Name = "toolStripMenuItemInverseSelection"; - this.toolStripMenuItemInverseSelection.Size = new System.Drawing.Size(180, 22); - this.toolStripMenuItemInverseSelection.Text = "Inverse selection"; - this.toolStripMenuItemInverseSelection.Click += new System.EventHandler(this.toolStripMenuItemInverseSelection_Click); - // - // MergeDoubleLines - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(1052, 725); - this.Controls.Add(this.numericUpDownMaxMillisecondsBetweenLines); - this.Controls.Add(this.labelMaxMillisecondsBetweenLines); - this.Controls.Add(this.checkBoxIncludeIncrementing); - this.Controls.Add(this.groupBoxLinesFound); - this.Controls.Add(this.SubtitleListview1); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.buttonCancel); - this.KeyPreview = true; - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(750, 400); - this.Name = "MergeDoubleLines"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Merge lines with same text"; - this.Shown += new System.EventHandler(this.MergeDoubleLines_Shown); - this.ResizeEnd += new System.EventHandler(this.MergeDoubleLines_ResizeEnd); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.MergeDoubleLines_KeyDown); - this.groupBoxLinesFound.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxMillisecondsBetweenLines)).EndInit(); - this.contextMenuStrip1.ResumeLayout(false); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.ColumnHeader columnHeader4; - private System.Windows.Forms.GroupBox groupBoxLinesFound; - private System.Windows.Forms.ListView listViewFixes; - private System.Windows.Forms.ColumnHeader columnHeader5; - private System.Windows.Forms.ColumnHeader columnHeaderText; - private Controls.SubtitleListView SubtitleListview1; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.CheckBox checkBoxIncludeIncrementing; - private System.Windows.Forms.NumericUpDown numericUpDownMaxMillisecondsBetweenLines; - private System.Windows.Forms.Label labelMaxMillisecondsBetweenLines; - private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSelectAll; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInverseSelection; - } +namespace Nikse.SubtitleEdit.Forms +{ + partial class MergeDoubleLines + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.groupBoxLinesFound = new System.Windows.Forms.GroupBox(); + this.listViewFixes = new System.Windows.Forms.ListView(); + this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderText = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.buttonOK = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.checkBoxIncludeIncrementing = new System.Windows.Forms.CheckBox(); + this.numericUpDownMaxMillisecondsBetweenLines = new System.Windows.Forms.NumericUpDown(); + this.labelMaxMillisecondsBetweenLines = new System.Windows.Forms.Label(); + this.SubtitleListview1 = new Nikse.SubtitleEdit.Controls.SubtitleListView(); + this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItemSelectAll = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemInverseSelection = new System.Windows.Forms.ToolStripMenuItem(); + this.groupBoxLinesFound.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxMillisecondsBetweenLines)).BeginInit(); + this.contextMenuStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // columnHeader4 + // + this.columnHeader4.Text = "Apply"; + this.columnHeader4.Width = 45; + // + // groupBoxLinesFound + // + this.groupBoxLinesFound.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxLinesFound.Controls.Add(this.listViewFixes); + this.groupBoxLinesFound.Location = new System.Drawing.Point(15, 55); + this.groupBoxLinesFound.Name = "groupBoxLinesFound"; + this.groupBoxLinesFound.Size = new System.Drawing.Size(1025, 196); + this.groupBoxLinesFound.TabIndex = 45; + this.groupBoxLinesFound.TabStop = false; + this.groupBoxLinesFound.Text = "Lines that will be merged"; + // + // listViewFixes + // + this.listViewFixes.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listViewFixes.CheckBoxes = true; + this.listViewFixes.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader4, + this.columnHeader5, + this.columnHeaderText}); + this.listViewFixes.ContextMenuStrip = this.contextMenuStrip1; + this.listViewFixes.FullRowSelect = true; + this.listViewFixes.HideSelection = false; + this.listViewFixes.Location = new System.Drawing.Point(6, 19); + this.listViewFixes.Name = "listViewFixes"; + this.listViewFixes.Size = new System.Drawing.Size(1013, 177); + this.listViewFixes.TabIndex = 0; + this.listViewFixes.UseCompatibleStateImageBehavior = false; + this.listViewFixes.View = System.Windows.Forms.View.Details; + this.listViewFixes.SelectedIndexChanged += new System.EventHandler(this.listViewFixes_SelectedIndexChanged); + // + // columnHeader5 + // + this.columnHeader5.Text = "Line#"; + this.columnHeader5.Width = 122; + // + // columnHeaderText + // + this.columnHeaderText.Text = "New text"; + this.columnHeaderText.Width = 500; + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(884, 692); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 41; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(965, 692); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 42; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.ButtonCancelClick); + // + // checkBoxIncludeIncrementing + // + this.checkBoxIncludeIncrementing.AutoSize = true; + this.checkBoxIncludeIncrementing.Checked = true; + this.checkBoxIncludeIncrementing.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxIncludeIncrementing.Location = new System.Drawing.Point(306, 16); + this.checkBoxIncludeIncrementing.Name = "checkBoxIncludeIncrementing"; + this.checkBoxIncludeIncrementing.Size = new System.Drawing.Size(148, 17); + this.checkBoxIncludeIncrementing.TabIndex = 47; + this.checkBoxIncludeIncrementing.Text = "Include incrementing lines"; + this.checkBoxIncludeIncrementing.UseVisualStyleBackColor = true; + this.checkBoxIncludeIncrementing.CheckedChanged += new System.EventHandler(this.checkBoxFixIncrementing_CheckedChanged); + // + // numericUpDownMaxMillisecondsBetweenLines + // + this.numericUpDownMaxMillisecondsBetweenLines.Location = new System.Drawing.Point(202, 15); + this.numericUpDownMaxMillisecondsBetweenLines.Maximum = new decimal(new int[] { + 10000, + 0, + 0, + 0}); + this.numericUpDownMaxMillisecondsBetweenLines.Name = "numericUpDownMaxMillisecondsBetweenLines"; + this.numericUpDownMaxMillisecondsBetweenLines.Size = new System.Drawing.Size(64, 20); + this.numericUpDownMaxMillisecondsBetweenLines.TabIndex = 48; + this.numericUpDownMaxMillisecondsBetweenLines.Value = new decimal(new int[] { + 250, + 0, + 0, + 0}); + this.numericUpDownMaxMillisecondsBetweenLines.ValueChanged += new System.EventHandler(this.numericUpDownMaxMillisecondsBetweenLines_ValueChanged); + // + // labelMaxMillisecondsBetweenLines + // + this.labelMaxMillisecondsBetweenLines.AutoSize = true; + this.labelMaxMillisecondsBetweenLines.Location = new System.Drawing.Point(18, 17); + this.labelMaxMillisecondsBetweenLines.Name = "labelMaxMillisecondsBetweenLines"; + this.labelMaxMillisecondsBetweenLines.Size = new System.Drawing.Size(178, 13); + this.labelMaxMillisecondsBetweenLines.TabIndex = 49; + this.labelMaxMillisecondsBetweenLines.Text = "Maximum milliseconds between lines"; + // + // SubtitleListview1 + // + this.SubtitleListview1.AllowColumnReorder = true; + this.SubtitleListview1.AllowDrop = true; + this.SubtitleListview1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.SubtitleListview1.FirstVisibleIndex = -1; + this.SubtitleListview1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.SubtitleListview1.FullRowSelect = true; + this.SubtitleListview1.GridLines = true; + this.SubtitleListview1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.SubtitleListview1.HideSelection = false; + this.SubtitleListview1.Location = new System.Drawing.Point(12, 257); + this.SubtitleListview1.Name = "SubtitleListview1"; + this.SubtitleListview1.OwnerDraw = true; + this.SubtitleListview1.Size = new System.Drawing.Size(1028, 429); + this.SubtitleListview1.SubtitleFontBold = false; + this.SubtitleListview1.SubtitleFontName = "Tahoma"; + this.SubtitleListview1.SubtitleFontSize = 8; + this.SubtitleListview1.TabIndex = 40; + this.SubtitleListview1.UseCompatibleStateImageBehavior = false; + this.SubtitleListview1.UseSyntaxColoring = true; + this.SubtitleListview1.View = System.Windows.Forms.View.Details; + // + // contextMenuStrip1 + // + this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItemSelectAll, + this.toolStripMenuItemInverseSelection}); + this.contextMenuStrip1.Name = "contextMenuStrip1"; + this.contextMenuStrip1.Size = new System.Drawing.Size(162, 48); + // + // toolStripMenuItemSelectAll + // + this.toolStripMenuItemSelectAll.Name = "toolStripMenuItemSelectAll"; + this.toolStripMenuItemSelectAll.Size = new System.Drawing.Size(180, 22); + this.toolStripMenuItemSelectAll.Text = "Select all"; + this.toolStripMenuItemSelectAll.Click += new System.EventHandler(this.toolStripMenuItemSelectAll_Click); + // + // toolStripMenuItemInverseSelection + // + this.toolStripMenuItemInverseSelection.Name = "toolStripMenuItemInverseSelection"; + this.toolStripMenuItemInverseSelection.Size = new System.Drawing.Size(180, 22); + this.toolStripMenuItemInverseSelection.Text = "Inverse selection"; + this.toolStripMenuItemInverseSelection.Click += new System.EventHandler(this.toolStripMenuItemInverseSelection_Click); + // + // MergeDoubleLines + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1052, 725); + this.Controls.Add(this.numericUpDownMaxMillisecondsBetweenLines); + this.Controls.Add(this.labelMaxMillisecondsBetweenLines); + this.Controls.Add(this.checkBoxIncludeIncrementing); + this.Controls.Add(this.groupBoxLinesFound); + this.Controls.Add(this.SubtitleListview1); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.buttonCancel); + this.KeyPreview = true; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(750, 400); + this.Name = "MergeDoubleLines"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Merge lines with same text"; + this.Shown += new System.EventHandler(this.MergeDoubleLines_Shown); + this.ResizeEnd += new System.EventHandler(this.MergeDoubleLines_ResizeEnd); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.MergeDoubleLines_KeyDown); + this.groupBoxLinesFound.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxMillisecondsBetweenLines)).EndInit(); + this.contextMenuStrip1.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ColumnHeader columnHeader4; + private System.Windows.Forms.GroupBox groupBoxLinesFound; + private System.Windows.Forms.ListView listViewFixes; + private System.Windows.Forms.ColumnHeader columnHeader5; + private System.Windows.Forms.ColumnHeader columnHeaderText; + private Controls.SubtitleListView SubtitleListview1; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.CheckBox checkBoxIncludeIncrementing; + private System.Windows.Forms.NumericUpDown numericUpDownMaxMillisecondsBetweenLines; + private System.Windows.Forms.Label labelMaxMillisecondsBetweenLines; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSelectAll; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInverseSelection; + } } \ No newline at end of file diff --git a/src/Forms/MergeDoubleLines.cs b/src/ui/Forms/MergeDoubleLines.cs similarity index 97% rename from src/Forms/MergeDoubleLines.cs rename to src/ui/Forms/MergeDoubleLines.cs index f1f2ee7e5..8a49a54bd 100644 --- a/src/Forms/MergeDoubleLines.cs +++ b/src/ui/Forms/MergeDoubleLines.cs @@ -1,348 +1,348 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Globalization; -using System.Text; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public partial class MergeDoubleLines : PositionAndSizeForm - { - private Subtitle _subtitle; - private bool _loading = true; - private readonly Timer _previewTimer = new Timer(); - - public int NumberOfMerges { get; private set; } - public Subtitle MergedSubtitle { get; private set; } - - public MergeDoubleLines() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - _previewTimer.Tick += previewTimer_Tick; - _previewTimer.Interval = 250; - UiUtil.FixLargeFonts(this, buttonOK); - } - - public void Initialize(Subtitle subtitle) - { - if (subtitle.Paragraphs.Count > 0) - { - subtitle.Renumber(subtitle.Paragraphs[0].Number); - } - - Text = Configuration.Settings.Language.MergeDoubleLines.Title; - labelMaxMillisecondsBetweenLines.Text = Configuration.Settings.Language.MergeDoubleLines.MaxMillisecondsBetweenLines; - checkBoxIncludeIncrementing.Text = Configuration.Settings.Language.MergeDoubleLines.IncludeIncrementing; - numericUpDownMaxMillisecondsBetweenLines.Left = labelMaxMillisecondsBetweenLines.Left + labelMaxMillisecondsBetweenLines.Width + 3; - checkBoxIncludeIncrementing.Left = numericUpDownMaxMillisecondsBetweenLines.Left + numericUpDownMaxMillisecondsBetweenLines.Width + 10; - - listViewFixes.Columns[0].Text = Configuration.Settings.Language.General.Apply; - listViewFixes.Columns[1].Text = Configuration.Settings.Language.General.LineNumber; - listViewFixes.Columns[2].Text = Configuration.Settings.Language.MergedShortLines.MergedText; - - toolStripMenuItemInverseSelection.Text = Configuration.Settings.Language.Main.Menu.Edit.InverseSelection; - toolStripMenuItemSelectAll.Text = Configuration.Settings.Language.Main.Menu.ContextMenu.SelectAll; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - SubtitleListview1.InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings); - UiUtil.InitializeSubtitleFont(SubtitleListview1); - SubtitleListview1.AutoSizeAllColumns(this); - NumberOfMerges = 0; - _subtitle = subtitle; - MergeDoubleLines_ResizeEnd(null, null); - } - - private void AddToListView(Paragraph p, string lineNumbers, string newText) - { - var item = new ListViewItem(string.Empty) { Tag = p, Checked = true }; - item.SubItems.Add(lineNumbers.TrimEnd(',')); - item.SubItems.Add(UiUtil.GetListViewTextFromString(newText)); - listViewFixes.Items.Add(item); - } - - private void GeneratePreview() - { - if (_subtitle == null) - { - return; - } - - NumberOfMerges = 0; - SubtitleListview1.Items.Clear(); - SubtitleListview1.BeginUpdate(); - MergedSubtitle = MergeLinesWithSameTextInSubtitle(_subtitle, out var count, true, checkBoxIncludeIncrementing.Checked, true, (int)numericUpDownMaxMillisecondsBetweenLines.Value); - NumberOfMerges = count; - - SubtitleListview1.Fill(_subtitle); - - UpdateBackgroundColor(); - - SubtitleListview1.EndUpdate(); - groupBoxLinesFound.Text = string.Format(Configuration.Settings.Language.MergedShortLines.NumberOfMergesX, NumberOfMerges); - } - - private bool IsFixAllowed(Paragraph p) - { - foreach (ListViewItem item in listViewFixes.Items) - { - string numbers = item.SubItems[1].Text; - foreach (string number in numbers.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) - { - if (number == p.Number.ToString(CultureInfo.InvariantCulture)) - { - return item.Checked; - } - } - } - return true; - } - - public Subtitle MergeLinesWithSameTextInSubtitle(Subtitle subtitle, out int numberOfMerges, bool clearFixes, bool fixIncrementing, bool lineAfterNext, int maxMsBetween) - { - var mergedIndexes = new List(); - var removed = new List(); - if (!_loading) - { - listViewFixes.ItemChecked -= listViewFixes_ItemChecked; - } - - if (clearFixes) - { - listViewFixes.Items.Clear(); - } - - numberOfMerges = 0; - var mergedSubtitle = new Subtitle(); - Paragraph p = null; - var lineNumbers = new StringBuilder(); - for (int i = 1; i < subtitle.Paragraphs.Count; i++) - { - if (removed.Contains(i - 1)) - { - continue; - } - - p = new Paragraph(subtitle.GetParagraphOrDefault(i - 1)); - mergedSubtitle.Paragraphs.Add(p); - - for (int j = i; j < subtitle.Paragraphs.Count; j++) - { - if (removed.Contains(j)) - { - continue; - } - - var next = subtitle.GetParagraphOrDefault(j); - var incrementText = string.Empty; - if ((MergeLinesSameTextUtils.QualifiesForMerge(p, next, maxMsBetween) || fixIncrementing && MergeLinesSameTextUtils.QualifiesForMergeIncrement(p, next, maxMsBetween, out incrementText)) && IsFixAllowed(p)) - { - p.Text = next.Text; - if (!string.IsNullOrEmpty(incrementText)) - { - p.Text = incrementText; - } - - p.EndTime.TotalMilliseconds = next.EndTime.TotalMilliseconds; - if (lineNumbers.Length > 0) - { - lineNumbers.Append(next.Number); - lineNumbers.Append(','); - } - else - { - lineNumbers.Append(p.Number); - lineNumbers.Append(','); - lineNumbers.Append(next.Number); - lineNumbers.Append(','); - } - - removed.Add(j); - numberOfMerges++; - if (!mergedIndexes.Contains(j)) - { - mergedIndexes.Add(j); - } - - if (!mergedIndexes.Contains(i - 1)) - { - mergedIndexes.Add(i - 1); - } - } - } - - if (!removed.Contains(i - 1) && lineNumbers.Length > 0 && clearFixes) - { - AddToListView(p, lineNumbers.ToString(), p.Text); - lineNumbers.Clear(); - } - } - - if (lineNumbers.Length > 0 && clearFixes && p != null) - { - AddToListView(p, lineNumbers.ToString(), p.Text); - } - - if (!mergedIndexes.Contains(subtitle.Paragraphs.Count - 1)) - { - mergedSubtitle.Paragraphs.Add(new Paragraph(subtitle.GetParagraphOrDefault(subtitle.Paragraphs.Count - 1))); - } - - if (!_loading) - { - listViewFixes.ItemChecked += listViewFixes_ItemChecked; - } - - mergedSubtitle.Renumber(); - return mergedSubtitle; - } - - private void ButtonCancelClick(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private void ButtonOkClick(object sender, EventArgs e) - { - DialogResult = DialogResult.OK; - } - - private void listViewFixes_SelectedIndexChanged(object sender, EventArgs e) - { - if (listViewFixes.SelectedIndices.Count > 0) - { - int index = listViewFixes.SelectedIndices[0]; - ListViewItem item = listViewFixes.Items[index]; - var numbers = item.SubItems[1].Text.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); - foreach (string number in numbers) - { - foreach (var p in _subtitle.Paragraphs) - { - if (p.Number.ToString(CultureInfo.InvariantCulture) == number) - { - index = _subtitle.GetIndex(p); - SubtitleListview1.EnsureVisible(index); - } - } - } - } - } - - private void listViewFixes_ItemChecked(object sender, ItemCheckedEventArgs e) - { - if (_loading) - { - return; - } - - NumberOfMerges = 0; - SubtitleListview1.Items.Clear(); - SubtitleListview1.BeginUpdate(); - MergedSubtitle = MergeLinesWithSameTextInSubtitle(_subtitle, out var count, false, checkBoxIncludeIncrementing.Checked, true, (int)numericUpDownMaxMillisecondsBetweenLines.Value); - NumberOfMerges = count; - SubtitleListview1.Fill(_subtitle); - UpdateBackgroundColor(); - SubtitleListview1.EndUpdate(); - groupBoxLinesFound.Text = string.Format(Configuration.Settings.Language.MergedShortLines.NumberOfMergesX, NumberOfMerges); - } - - private void UpdateBackgroundColor() - { - var colors = new List - { - Color.Green, - Color.LimeGreen, - Color.GreenYellow, - }; - int colorIdx = 0; - - for (int i = 0; i < listViewFixes.Items.Count; i++) - { - ListViewItem item = listViewFixes.Items[i]; - var lineNumbers = item.SubItems[1].Text; - if (item.Checked && !string.IsNullOrEmpty(lineNumbers)) - { - var numbers = lineNumbers.Split(','); - foreach (var number in numbers) - { - SubtitleListview1.SetBackgroundColor(Convert.ToInt32(number) - 1, colors[colorIdx]); - } - - colorIdx++; - if (colorIdx >= colors.Count) - { - colorIdx = 0; - } - } - } - } - - private void MergeDoubleLines_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - private void MergeDoubleLines_Shown(object sender, EventArgs e) - { - GeneratePreview(); - listViewFixes.Focus(); - if (listViewFixes.Items.Count > 0) - { - listViewFixes.Items[0].Selected = true; - } - - _loading = false; - listViewFixes.ItemChecked += listViewFixes_ItemChecked; - } - - private void checkBoxFixIncrementing_CheckedChanged(object sender, EventArgs e) - { - Cursor = Cursors.WaitCursor; - GeneratePreview(); - Cursor = Cursors.Default; - } - - private void numericUpDownMaxMillisecondsBetweenLines_ValueChanged(object sender, EventArgs e) - { - _previewTimer.Stop(); - _previewTimer.Start(); - } - - private void previewTimer_Tick(object sender, EventArgs e) - { - _previewTimer.Stop(); - Cursor = Cursors.WaitCursor; - GeneratePreview(); - Cursor = Cursors.Default; - } - - private void MergeDoubleLines_ResizeEnd(object sender, EventArgs e) - { - columnHeaderText.Width = -2; - } - - private void toolStripMenuItemSelectAll_Click(object sender, EventArgs e) - { - foreach (ListViewItem item in listViewFixes.Items) - { - item.Checked = true; - } - } - - private void toolStripMenuItemInverseSelection_Click(object sender, EventArgs e) - { - foreach (ListViewItem item in listViewFixes.Items) - { - item.Checked = !item.Checked; - } - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Globalization; +using System.Text; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public partial class MergeDoubleLines : PositionAndSizeForm + { + private Subtitle _subtitle; + private bool _loading = true; + private readonly Timer _previewTimer = new Timer(); + + public int NumberOfMerges { get; private set; } + public Subtitle MergedSubtitle { get; private set; } + + public MergeDoubleLines() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + _previewTimer.Tick += previewTimer_Tick; + _previewTimer.Interval = 250; + UiUtil.FixLargeFonts(this, buttonOK); + } + + public void Initialize(Subtitle subtitle) + { + if (subtitle.Paragraphs.Count > 0) + { + subtitle.Renumber(subtitle.Paragraphs[0].Number); + } + + Text = Configuration.Settings.Language.MergeDoubleLines.Title; + labelMaxMillisecondsBetweenLines.Text = Configuration.Settings.Language.MergeDoubleLines.MaxMillisecondsBetweenLines; + checkBoxIncludeIncrementing.Text = Configuration.Settings.Language.MergeDoubleLines.IncludeIncrementing; + numericUpDownMaxMillisecondsBetweenLines.Left = labelMaxMillisecondsBetweenLines.Left + labelMaxMillisecondsBetweenLines.Width + 3; + checkBoxIncludeIncrementing.Left = numericUpDownMaxMillisecondsBetweenLines.Left + numericUpDownMaxMillisecondsBetweenLines.Width + 10; + + listViewFixes.Columns[0].Text = Configuration.Settings.Language.General.Apply; + listViewFixes.Columns[1].Text = Configuration.Settings.Language.General.LineNumber; + listViewFixes.Columns[2].Text = Configuration.Settings.Language.MergedShortLines.MergedText; + + toolStripMenuItemInverseSelection.Text = Configuration.Settings.Language.Main.Menu.Edit.InverseSelection; + toolStripMenuItemSelectAll.Text = Configuration.Settings.Language.Main.Menu.ContextMenu.SelectAll; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + SubtitleListview1.InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings); + UiUtil.InitializeSubtitleFont(SubtitleListview1); + SubtitleListview1.AutoSizeAllColumns(this); + NumberOfMerges = 0; + _subtitle = subtitle; + MergeDoubleLines_ResizeEnd(null, null); + } + + private void AddToListView(Paragraph p, string lineNumbers, string newText) + { + var item = new ListViewItem(string.Empty) { Tag = p, Checked = true }; + item.SubItems.Add(lineNumbers.TrimEnd(',')); + item.SubItems.Add(UiUtil.GetListViewTextFromString(newText)); + listViewFixes.Items.Add(item); + } + + private void GeneratePreview() + { + if (_subtitle == null) + { + return; + } + + NumberOfMerges = 0; + SubtitleListview1.Items.Clear(); + SubtitleListview1.BeginUpdate(); + MergedSubtitle = MergeLinesWithSameTextInSubtitle(_subtitle, out var count, true, checkBoxIncludeIncrementing.Checked, true, (int)numericUpDownMaxMillisecondsBetweenLines.Value); + NumberOfMerges = count; + + SubtitleListview1.Fill(_subtitle); + + UpdateBackgroundColor(); + + SubtitleListview1.EndUpdate(); + groupBoxLinesFound.Text = string.Format(Configuration.Settings.Language.MergedShortLines.NumberOfMergesX, NumberOfMerges); + } + + private bool IsFixAllowed(Paragraph p) + { + foreach (ListViewItem item in listViewFixes.Items) + { + string numbers = item.SubItems[1].Text; + foreach (string number in numbers.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) + { + if (number == p.Number.ToString(CultureInfo.InvariantCulture)) + { + return item.Checked; + } + } + } + return true; + } + + public Subtitle MergeLinesWithSameTextInSubtitle(Subtitle subtitle, out int numberOfMerges, bool clearFixes, bool fixIncrementing, bool lineAfterNext, int maxMsBetween) + { + var mergedIndexes = new List(); + var removed = new List(); + if (!_loading) + { + listViewFixes.ItemChecked -= listViewFixes_ItemChecked; + } + + if (clearFixes) + { + listViewFixes.Items.Clear(); + } + + numberOfMerges = 0; + var mergedSubtitle = new Subtitle(); + Paragraph p = null; + var lineNumbers = new StringBuilder(); + for (int i = 1; i < subtitle.Paragraphs.Count; i++) + { + if (removed.Contains(i - 1)) + { + continue; + } + + p = new Paragraph(subtitle.GetParagraphOrDefault(i - 1)); + mergedSubtitle.Paragraphs.Add(p); + + for (int j = i; j < subtitle.Paragraphs.Count; j++) + { + if (removed.Contains(j)) + { + continue; + } + + var next = subtitle.GetParagraphOrDefault(j); + var incrementText = string.Empty; + if ((MergeLinesSameTextUtils.QualifiesForMerge(p, next, maxMsBetween) || fixIncrementing && MergeLinesSameTextUtils.QualifiesForMergeIncrement(p, next, maxMsBetween, out incrementText)) && IsFixAllowed(p)) + { + p.Text = next.Text; + if (!string.IsNullOrEmpty(incrementText)) + { + p.Text = incrementText; + } + + p.EndTime.TotalMilliseconds = next.EndTime.TotalMilliseconds; + if (lineNumbers.Length > 0) + { + lineNumbers.Append(next.Number); + lineNumbers.Append(','); + } + else + { + lineNumbers.Append(p.Number); + lineNumbers.Append(','); + lineNumbers.Append(next.Number); + lineNumbers.Append(','); + } + + removed.Add(j); + numberOfMerges++; + if (!mergedIndexes.Contains(j)) + { + mergedIndexes.Add(j); + } + + if (!mergedIndexes.Contains(i - 1)) + { + mergedIndexes.Add(i - 1); + } + } + } + + if (!removed.Contains(i - 1) && lineNumbers.Length > 0 && clearFixes) + { + AddToListView(p, lineNumbers.ToString(), p.Text); + lineNumbers.Clear(); + } + } + + if (lineNumbers.Length > 0 && clearFixes && p != null) + { + AddToListView(p, lineNumbers.ToString(), p.Text); + } + + if (!mergedIndexes.Contains(subtitle.Paragraphs.Count - 1)) + { + mergedSubtitle.Paragraphs.Add(new Paragraph(subtitle.GetParagraphOrDefault(subtitle.Paragraphs.Count - 1))); + } + + if (!_loading) + { + listViewFixes.ItemChecked += listViewFixes_ItemChecked; + } + + mergedSubtitle.Renumber(); + return mergedSubtitle; + } + + private void ButtonCancelClick(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void ButtonOkClick(object sender, EventArgs e) + { + DialogResult = DialogResult.OK; + } + + private void listViewFixes_SelectedIndexChanged(object sender, EventArgs e) + { + if (listViewFixes.SelectedIndices.Count > 0) + { + int index = listViewFixes.SelectedIndices[0]; + ListViewItem item = listViewFixes.Items[index]; + var numbers = item.SubItems[1].Text.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + foreach (string number in numbers) + { + foreach (var p in _subtitle.Paragraphs) + { + if (p.Number.ToString(CultureInfo.InvariantCulture) == number) + { + index = _subtitle.GetIndex(p); + SubtitleListview1.EnsureVisible(index); + } + } + } + } + } + + private void listViewFixes_ItemChecked(object sender, ItemCheckedEventArgs e) + { + if (_loading) + { + return; + } + + NumberOfMerges = 0; + SubtitleListview1.Items.Clear(); + SubtitleListview1.BeginUpdate(); + MergedSubtitle = MergeLinesWithSameTextInSubtitle(_subtitle, out var count, false, checkBoxIncludeIncrementing.Checked, true, (int)numericUpDownMaxMillisecondsBetweenLines.Value); + NumberOfMerges = count; + SubtitleListview1.Fill(_subtitle); + UpdateBackgroundColor(); + SubtitleListview1.EndUpdate(); + groupBoxLinesFound.Text = string.Format(Configuration.Settings.Language.MergedShortLines.NumberOfMergesX, NumberOfMerges); + } + + private void UpdateBackgroundColor() + { + var colors = new List + { + Color.Green, + Color.LimeGreen, + Color.GreenYellow, + }; + int colorIdx = 0; + + for (int i = 0; i < listViewFixes.Items.Count; i++) + { + ListViewItem item = listViewFixes.Items[i]; + var lineNumbers = item.SubItems[1].Text; + if (item.Checked && !string.IsNullOrEmpty(lineNumbers)) + { + var numbers = lineNumbers.Split(','); + foreach (var number in numbers) + { + SubtitleListview1.SetBackgroundColor(Convert.ToInt32(number) - 1, colors[colorIdx]); + } + + colorIdx++; + if (colorIdx >= colors.Count) + { + colorIdx = 0; + } + } + } + } + + private void MergeDoubleLines_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + private void MergeDoubleLines_Shown(object sender, EventArgs e) + { + GeneratePreview(); + listViewFixes.Focus(); + if (listViewFixes.Items.Count > 0) + { + listViewFixes.Items[0].Selected = true; + } + + _loading = false; + listViewFixes.ItemChecked += listViewFixes_ItemChecked; + } + + private void checkBoxFixIncrementing_CheckedChanged(object sender, EventArgs e) + { + Cursor = Cursors.WaitCursor; + GeneratePreview(); + Cursor = Cursors.Default; + } + + private void numericUpDownMaxMillisecondsBetweenLines_ValueChanged(object sender, EventArgs e) + { + _previewTimer.Stop(); + _previewTimer.Start(); + } + + private void previewTimer_Tick(object sender, EventArgs e) + { + _previewTimer.Stop(); + Cursor = Cursors.WaitCursor; + GeneratePreview(); + Cursor = Cursors.Default; + } + + private void MergeDoubleLines_ResizeEnd(object sender, EventArgs e) + { + columnHeaderText.Width = -2; + } + + private void toolStripMenuItemSelectAll_Click(object sender, EventArgs e) + { + foreach (ListViewItem item in listViewFixes.Items) + { + item.Checked = true; + } + } + + private void toolStripMenuItemInverseSelection_Click(object sender, EventArgs e) + { + foreach (ListViewItem item in listViewFixes.Items) + { + item.Checked = !item.Checked; + } + } + } +} diff --git a/src/Forms/MergeDoubleLines.resx b/src/ui/Forms/MergeDoubleLines.resx similarity index 97% rename from src/Forms/MergeDoubleLines.resx rename to src/ui/Forms/MergeDoubleLines.resx index 661dc1126..ad537526f 100644 --- a/src/Forms/MergeDoubleLines.resx +++ b/src/ui/Forms/MergeDoubleLines.resx @@ -1,123 +1,123 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + \ No newline at end of file diff --git a/src/Forms/MergeShortLines.Designer.cs b/src/ui/Forms/MergeShortLines.Designer.cs similarity index 98% rename from src/Forms/MergeShortLines.Designer.cs rename to src/ui/Forms/MergeShortLines.Designer.cs index 9fa68289d..0af707bc6 100644 --- a/src/Forms/MergeShortLines.Designer.cs +++ b/src/ui/Forms/MergeShortLines.Designer.cs @@ -1,305 +1,305 @@ -using Nikse.SubtitleEdit.Controls; - -namespace Nikse.SubtitleEdit.Forms -{ - partial class MergeShortLines - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.buttonOK = new System.Windows.Forms.Button(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.numericUpDownMaxCharacters = new System.Windows.Forms.NumericUpDown(); - this.labelMaxCharacters = new System.Windows.Forms.Label(); - this.labelMaxMillisecondsBetweenLines = new System.Windows.Forms.Label(); - this.numericUpDownMaxMillisecondsBetweenLines = new System.Windows.Forms.NumericUpDown(); - this.groupBoxLinesFound = new System.Windows.Forms.GroupBox(); - this.listViewFixes = new System.Windows.Forms.ListView(); - this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader7 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.checkBoxOnlyContinuationLines = new System.Windows.Forms.CheckBox(); - this.SubtitleListview1 = new Nikse.SubtitleEdit.Controls.SubtitleListView(); - this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); - this.toolStripMenuItemSelectAll = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemInverseSelection = new System.Windows.Forms.ToolStripMenuItem(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxCharacters)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxMillisecondsBetweenLines)).BeginInit(); - this.groupBoxLinesFound.SuspendLayout(); - this.contextMenuStrip1.SuspendLayout(); - this.SuspendLayout(); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(608, 562); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 6; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(689, 562); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 8; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.ButtonCancelClick); - // - // numericUpDownMaxCharacters - // - this.numericUpDownMaxCharacters.Location = new System.Drawing.Point(190, 27); - this.numericUpDownMaxCharacters.Maximum = new decimal(new int[] { - 999, - 0, - 0, - 0}); - this.numericUpDownMaxCharacters.Minimum = new decimal(new int[] { - 10, - 0, - 0, - 0}); - this.numericUpDownMaxCharacters.Name = "numericUpDownMaxCharacters"; - this.numericUpDownMaxCharacters.Size = new System.Drawing.Size(64, 21); - this.numericUpDownMaxCharacters.TabIndex = 0; - this.numericUpDownMaxCharacters.Value = new decimal(new int[] { - 65, - 0, - 0, - 0}); - this.numericUpDownMaxCharacters.ValueChanged += new System.EventHandler(this.NumericUpDownMaxCharactersValueChanged); - // - // labelMaxCharacters - // - this.labelMaxCharacters.AutoSize = true; - this.labelMaxCharacters.Location = new System.Drawing.Point(187, 9); - this.labelMaxCharacters.Name = "labelMaxCharacters"; - this.labelMaxCharacters.Size = new System.Drawing.Size(190, 13); - this.labelMaxCharacters.TabIndex = 32; - this.labelMaxCharacters.Text = "Maximum characters in one paragraph"; - // - // labelMaxMillisecondsBetweenLines - // - this.labelMaxMillisecondsBetweenLines.AutoSize = true; - this.labelMaxMillisecondsBetweenLines.Location = new System.Drawing.Point(483, 9); - this.labelMaxMillisecondsBetweenLines.Name = "labelMaxMillisecondsBetweenLines"; - this.labelMaxMillisecondsBetweenLines.Size = new System.Drawing.Size(178, 13); - this.labelMaxMillisecondsBetweenLines.TabIndex = 33; - this.labelMaxMillisecondsBetweenLines.Text = "Maximum milliseconds between lines"; - // - // numericUpDownMaxMillisecondsBetweenLines - // - this.numericUpDownMaxMillisecondsBetweenLines.Location = new System.Drawing.Point(486, 26); - this.numericUpDownMaxMillisecondsBetweenLines.Maximum = new decimal(new int[] { - 10000, - 0, - 0, - 0}); - this.numericUpDownMaxMillisecondsBetweenLines.Minimum = new decimal(new int[] { - 1, - 0, - 0, - 0}); - this.numericUpDownMaxMillisecondsBetweenLines.Name = "numericUpDownMaxMillisecondsBetweenLines"; - this.numericUpDownMaxMillisecondsBetweenLines.Size = new System.Drawing.Size(64, 21); - this.numericUpDownMaxMillisecondsBetweenLines.TabIndex = 2; - this.numericUpDownMaxMillisecondsBetweenLines.Value = new decimal(new int[] { - 250, - 0, - 0, - 0}); - this.numericUpDownMaxMillisecondsBetweenLines.ValueChanged += new System.EventHandler(this.NumericUpDownMaxMillisecondsBetweenLinesValueChanged); - // - // groupBoxLinesFound - // - this.groupBoxLinesFound.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxLinesFound.Controls.Add(this.listViewFixes); - this.groupBoxLinesFound.Location = new System.Drawing.Point(13, 68); - this.groupBoxLinesFound.Name = "groupBoxLinesFound"; - this.groupBoxLinesFound.Size = new System.Drawing.Size(752, 200); - this.groupBoxLinesFound.TabIndex = 36; - this.groupBoxLinesFound.TabStop = false; - this.groupBoxLinesFound.Text = "Lines that will be merged"; - // - // listViewFixes - // - this.listViewFixes.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.listViewFixes.CheckBoxes = true; - this.listViewFixes.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeader4, - this.columnHeader5, - this.columnHeader7}); - this.listViewFixes.ContextMenuStrip = this.contextMenuStrip1; - this.listViewFixes.FullRowSelect = true; - this.listViewFixes.HideSelection = false; - this.listViewFixes.Location = new System.Drawing.Point(6, 23); - this.listViewFixes.Name = "listViewFixes"; - this.listViewFixes.Size = new System.Drawing.Size(740, 171); - this.listViewFixes.TabIndex = 0; - this.listViewFixes.UseCompatibleStateImageBehavior = false; - this.listViewFixes.View = System.Windows.Forms.View.Details; - this.listViewFixes.SelectedIndexChanged += new System.EventHandler(this.listViewFixes_SelectedIndexChanged); - // - // columnHeader4 - // - this.columnHeader4.Text = "Apply"; - this.columnHeader4.Width = 45; - // - // columnHeader5 - // - this.columnHeader5.Text = "Line#"; - this.columnHeader5.Width = 122; - // - // columnHeader7 - // - this.columnHeader7.Text = "New text"; - this.columnHeader7.Width = 500; - // - // checkBoxOnlyContinuationLines - // - this.checkBoxOnlyContinuationLines.AutoSize = true; - this.checkBoxOnlyContinuationLines.Checked = true; - this.checkBoxOnlyContinuationLines.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxOnlyContinuationLines.Location = new System.Drawing.Point(190, 54); - this.checkBoxOnlyContinuationLines.Name = "checkBoxOnlyContinuationLines"; - this.checkBoxOnlyContinuationLines.Size = new System.Drawing.Size(167, 17); - this.checkBoxOnlyContinuationLines.TabIndex = 37; - this.checkBoxOnlyContinuationLines.Text = "Only merge continuation lines"; - this.checkBoxOnlyContinuationLines.UseVisualStyleBackColor = true; - this.checkBoxOnlyContinuationLines.CheckedChanged += new System.EventHandler(this.checkBoxOnlyContinuationLines_CheckedChanged); - // - // SubtitleListview1 - // - this.SubtitleListview1.AllowColumnReorder = true; - this.SubtitleListview1.AllowDrop = true; - this.SubtitleListview1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.SubtitleListview1.FirstVisibleIndex = -1; - this.SubtitleListview1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.SubtitleListview1.FullRowSelect = true; - this.SubtitleListview1.GridLines = true; - this.SubtitleListview1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; - this.SubtitleListview1.HideSelection = false; - this.SubtitleListview1.Location = new System.Drawing.Point(10, 274); - this.SubtitleListview1.Name = "SubtitleListview1"; - this.SubtitleListview1.OwnerDraw = true; - this.SubtitleListview1.Size = new System.Drawing.Size(757, 282); - this.SubtitleListview1.SubtitleFontBold = false; - this.SubtitleListview1.SubtitleFontName = "Tahoma"; - this.SubtitleListview1.SubtitleFontSize = 8; - this.SubtitleListview1.TabIndex = 4; - this.SubtitleListview1.UseCompatibleStateImageBehavior = false; - this.SubtitleListview1.UseSyntaxColoring = true; - this.SubtitleListview1.View = System.Windows.Forms.View.Details; - // - // contextMenuStrip1 - // - this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripMenuItemSelectAll, - this.toolStripMenuItemInverseSelection}); - this.contextMenuStrip1.Name = "contextMenuStrip1"; - this.contextMenuStrip1.Size = new System.Drawing.Size(181, 70); - // - // toolStripMenuItemSelectAll - // - this.toolStripMenuItemSelectAll.Name = "toolStripMenuItemSelectAll"; - this.toolStripMenuItemSelectAll.Size = new System.Drawing.Size(180, 22); - this.toolStripMenuItemSelectAll.Text = "Select all"; - this.toolStripMenuItemSelectAll.Click += new System.EventHandler(this.toolStripMenuItemSelectAll_Click); - // - // toolStripMenuItemInverseSelection - // - this.toolStripMenuItemInverseSelection.Name = "toolStripMenuItemInverseSelection"; - this.toolStripMenuItemInverseSelection.Size = new System.Drawing.Size(180, 22); - this.toolStripMenuItemInverseSelection.Text = "Inverse selection"; - this.toolStripMenuItemInverseSelection.Click += new System.EventHandler(this.toolStripMenuItemInverseSelection_Click); - // - // MergeShortLines - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(776, 595); - this.Controls.Add(this.checkBoxOnlyContinuationLines); - this.Controls.Add(this.numericUpDownMaxCharacters); - this.Controls.Add(this.groupBoxLinesFound); - this.Controls.Add(this.numericUpDownMaxMillisecondsBetweenLines); - this.Controls.Add(this.labelMaxMillisecondsBetweenLines); - this.Controls.Add(this.labelMaxCharacters); - this.Controls.Add(this.SubtitleListview1); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.buttonCancel); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.KeyPreview = true; - this.MinimumSize = new System.Drawing.Size(750, 400); - this.Name = "MergeShortLines"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "MergeShortLines"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MergeShortLines_FormClosing); - this.Shown += new System.EventHandler(this.MergeShortLines_Shown); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.MergeShortLines_KeyDown); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxCharacters)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxMillisecondsBetweenLines)).EndInit(); - this.groupBoxLinesFound.ResumeLayout(false); - this.contextMenuStrip1.ResumeLayout(false); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Button buttonCancel; - private SubtitleListView SubtitleListview1; - private System.Windows.Forms.NumericUpDown numericUpDownMaxCharacters; - private System.Windows.Forms.Label labelMaxCharacters; - private System.Windows.Forms.Label labelMaxMillisecondsBetweenLines; - private System.Windows.Forms.NumericUpDown numericUpDownMaxMillisecondsBetweenLines; - private System.Windows.Forms.GroupBox groupBoxLinesFound; - private System.Windows.Forms.ListView listViewFixes; - private System.Windows.Forms.ColumnHeader columnHeader4; - private System.Windows.Forms.ColumnHeader columnHeader5; - private System.Windows.Forms.ColumnHeader columnHeader7; - private System.Windows.Forms.CheckBox checkBoxOnlyContinuationLines; - private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSelectAll; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInverseSelection; - } +using Nikse.SubtitleEdit.Controls; + +namespace Nikse.SubtitleEdit.Forms +{ + partial class MergeShortLines + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.buttonOK = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.numericUpDownMaxCharacters = new System.Windows.Forms.NumericUpDown(); + this.labelMaxCharacters = new System.Windows.Forms.Label(); + this.labelMaxMillisecondsBetweenLines = new System.Windows.Forms.Label(); + this.numericUpDownMaxMillisecondsBetweenLines = new System.Windows.Forms.NumericUpDown(); + this.groupBoxLinesFound = new System.Windows.Forms.GroupBox(); + this.listViewFixes = new System.Windows.Forms.ListView(); + this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader7 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.checkBoxOnlyContinuationLines = new System.Windows.Forms.CheckBox(); + this.SubtitleListview1 = new Nikse.SubtitleEdit.Controls.SubtitleListView(); + this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItemSelectAll = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemInverseSelection = new System.Windows.Forms.ToolStripMenuItem(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxCharacters)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxMillisecondsBetweenLines)).BeginInit(); + this.groupBoxLinesFound.SuspendLayout(); + this.contextMenuStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(608, 562); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 6; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(689, 562); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 8; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.ButtonCancelClick); + // + // numericUpDownMaxCharacters + // + this.numericUpDownMaxCharacters.Location = new System.Drawing.Point(190, 27); + this.numericUpDownMaxCharacters.Maximum = new decimal(new int[] { + 999, + 0, + 0, + 0}); + this.numericUpDownMaxCharacters.Minimum = new decimal(new int[] { + 10, + 0, + 0, + 0}); + this.numericUpDownMaxCharacters.Name = "numericUpDownMaxCharacters"; + this.numericUpDownMaxCharacters.Size = new System.Drawing.Size(64, 21); + this.numericUpDownMaxCharacters.TabIndex = 0; + this.numericUpDownMaxCharacters.Value = new decimal(new int[] { + 65, + 0, + 0, + 0}); + this.numericUpDownMaxCharacters.ValueChanged += new System.EventHandler(this.NumericUpDownMaxCharactersValueChanged); + // + // labelMaxCharacters + // + this.labelMaxCharacters.AutoSize = true; + this.labelMaxCharacters.Location = new System.Drawing.Point(187, 9); + this.labelMaxCharacters.Name = "labelMaxCharacters"; + this.labelMaxCharacters.Size = new System.Drawing.Size(190, 13); + this.labelMaxCharacters.TabIndex = 32; + this.labelMaxCharacters.Text = "Maximum characters in one paragraph"; + // + // labelMaxMillisecondsBetweenLines + // + this.labelMaxMillisecondsBetweenLines.AutoSize = true; + this.labelMaxMillisecondsBetweenLines.Location = new System.Drawing.Point(483, 9); + this.labelMaxMillisecondsBetweenLines.Name = "labelMaxMillisecondsBetweenLines"; + this.labelMaxMillisecondsBetweenLines.Size = new System.Drawing.Size(178, 13); + this.labelMaxMillisecondsBetweenLines.TabIndex = 33; + this.labelMaxMillisecondsBetweenLines.Text = "Maximum milliseconds between lines"; + // + // numericUpDownMaxMillisecondsBetweenLines + // + this.numericUpDownMaxMillisecondsBetweenLines.Location = new System.Drawing.Point(486, 26); + this.numericUpDownMaxMillisecondsBetweenLines.Maximum = new decimal(new int[] { + 10000, + 0, + 0, + 0}); + this.numericUpDownMaxMillisecondsBetweenLines.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownMaxMillisecondsBetweenLines.Name = "numericUpDownMaxMillisecondsBetweenLines"; + this.numericUpDownMaxMillisecondsBetweenLines.Size = new System.Drawing.Size(64, 21); + this.numericUpDownMaxMillisecondsBetweenLines.TabIndex = 2; + this.numericUpDownMaxMillisecondsBetweenLines.Value = new decimal(new int[] { + 250, + 0, + 0, + 0}); + this.numericUpDownMaxMillisecondsBetweenLines.ValueChanged += new System.EventHandler(this.NumericUpDownMaxMillisecondsBetweenLinesValueChanged); + // + // groupBoxLinesFound + // + this.groupBoxLinesFound.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxLinesFound.Controls.Add(this.listViewFixes); + this.groupBoxLinesFound.Location = new System.Drawing.Point(13, 68); + this.groupBoxLinesFound.Name = "groupBoxLinesFound"; + this.groupBoxLinesFound.Size = new System.Drawing.Size(752, 200); + this.groupBoxLinesFound.TabIndex = 36; + this.groupBoxLinesFound.TabStop = false; + this.groupBoxLinesFound.Text = "Lines that will be merged"; + // + // listViewFixes + // + this.listViewFixes.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listViewFixes.CheckBoxes = true; + this.listViewFixes.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader4, + this.columnHeader5, + this.columnHeader7}); + this.listViewFixes.ContextMenuStrip = this.contextMenuStrip1; + this.listViewFixes.FullRowSelect = true; + this.listViewFixes.HideSelection = false; + this.listViewFixes.Location = new System.Drawing.Point(6, 23); + this.listViewFixes.Name = "listViewFixes"; + this.listViewFixes.Size = new System.Drawing.Size(740, 171); + this.listViewFixes.TabIndex = 0; + this.listViewFixes.UseCompatibleStateImageBehavior = false; + this.listViewFixes.View = System.Windows.Forms.View.Details; + this.listViewFixes.SelectedIndexChanged += new System.EventHandler(this.listViewFixes_SelectedIndexChanged); + // + // columnHeader4 + // + this.columnHeader4.Text = "Apply"; + this.columnHeader4.Width = 45; + // + // columnHeader5 + // + this.columnHeader5.Text = "Line#"; + this.columnHeader5.Width = 122; + // + // columnHeader7 + // + this.columnHeader7.Text = "New text"; + this.columnHeader7.Width = 500; + // + // checkBoxOnlyContinuationLines + // + this.checkBoxOnlyContinuationLines.AutoSize = true; + this.checkBoxOnlyContinuationLines.Checked = true; + this.checkBoxOnlyContinuationLines.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxOnlyContinuationLines.Location = new System.Drawing.Point(190, 54); + this.checkBoxOnlyContinuationLines.Name = "checkBoxOnlyContinuationLines"; + this.checkBoxOnlyContinuationLines.Size = new System.Drawing.Size(167, 17); + this.checkBoxOnlyContinuationLines.TabIndex = 37; + this.checkBoxOnlyContinuationLines.Text = "Only merge continuation lines"; + this.checkBoxOnlyContinuationLines.UseVisualStyleBackColor = true; + this.checkBoxOnlyContinuationLines.CheckedChanged += new System.EventHandler(this.checkBoxOnlyContinuationLines_CheckedChanged); + // + // SubtitleListview1 + // + this.SubtitleListview1.AllowColumnReorder = true; + this.SubtitleListview1.AllowDrop = true; + this.SubtitleListview1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.SubtitleListview1.FirstVisibleIndex = -1; + this.SubtitleListview1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.SubtitleListview1.FullRowSelect = true; + this.SubtitleListview1.GridLines = true; + this.SubtitleListview1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.SubtitleListview1.HideSelection = false; + this.SubtitleListview1.Location = new System.Drawing.Point(10, 274); + this.SubtitleListview1.Name = "SubtitleListview1"; + this.SubtitleListview1.OwnerDraw = true; + this.SubtitleListview1.Size = new System.Drawing.Size(757, 282); + this.SubtitleListview1.SubtitleFontBold = false; + this.SubtitleListview1.SubtitleFontName = "Tahoma"; + this.SubtitleListview1.SubtitleFontSize = 8; + this.SubtitleListview1.TabIndex = 4; + this.SubtitleListview1.UseCompatibleStateImageBehavior = false; + this.SubtitleListview1.UseSyntaxColoring = true; + this.SubtitleListview1.View = System.Windows.Forms.View.Details; + // + // contextMenuStrip1 + // + this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItemSelectAll, + this.toolStripMenuItemInverseSelection}); + this.contextMenuStrip1.Name = "contextMenuStrip1"; + this.contextMenuStrip1.Size = new System.Drawing.Size(181, 70); + // + // toolStripMenuItemSelectAll + // + this.toolStripMenuItemSelectAll.Name = "toolStripMenuItemSelectAll"; + this.toolStripMenuItemSelectAll.Size = new System.Drawing.Size(180, 22); + this.toolStripMenuItemSelectAll.Text = "Select all"; + this.toolStripMenuItemSelectAll.Click += new System.EventHandler(this.toolStripMenuItemSelectAll_Click); + // + // toolStripMenuItemInverseSelection + // + this.toolStripMenuItemInverseSelection.Name = "toolStripMenuItemInverseSelection"; + this.toolStripMenuItemInverseSelection.Size = new System.Drawing.Size(180, 22); + this.toolStripMenuItemInverseSelection.Text = "Inverse selection"; + this.toolStripMenuItemInverseSelection.Click += new System.EventHandler(this.toolStripMenuItemInverseSelection_Click); + // + // MergeShortLines + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(776, 595); + this.Controls.Add(this.checkBoxOnlyContinuationLines); + this.Controls.Add(this.numericUpDownMaxCharacters); + this.Controls.Add(this.groupBoxLinesFound); + this.Controls.Add(this.numericUpDownMaxMillisecondsBetweenLines); + this.Controls.Add(this.labelMaxMillisecondsBetweenLines); + this.Controls.Add(this.labelMaxCharacters); + this.Controls.Add(this.SubtitleListview1); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.buttonCancel); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.KeyPreview = true; + this.MinimumSize = new System.Drawing.Size(750, 400); + this.Name = "MergeShortLines"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "MergeShortLines"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MergeShortLines_FormClosing); + this.Shown += new System.EventHandler(this.MergeShortLines_Shown); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.MergeShortLines_KeyDown); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxCharacters)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxMillisecondsBetweenLines)).EndInit(); + this.groupBoxLinesFound.ResumeLayout(false); + this.contextMenuStrip1.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Button buttonCancel; + private SubtitleListView SubtitleListview1; + private System.Windows.Forms.NumericUpDown numericUpDownMaxCharacters; + private System.Windows.Forms.Label labelMaxCharacters; + private System.Windows.Forms.Label labelMaxMillisecondsBetweenLines; + private System.Windows.Forms.NumericUpDown numericUpDownMaxMillisecondsBetweenLines; + private System.Windows.Forms.GroupBox groupBoxLinesFound; + private System.Windows.Forms.ListView listViewFixes; + private System.Windows.Forms.ColumnHeader columnHeader4; + private System.Windows.Forms.ColumnHeader columnHeader5; + private System.Windows.Forms.ColumnHeader columnHeader7; + private System.Windows.Forms.CheckBox checkBoxOnlyContinuationLines; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSelectAll; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInverseSelection; + } } \ No newline at end of file diff --git a/src/Forms/MergeShortLines.cs b/src/ui/Forms/MergeShortLines.cs similarity index 97% rename from src/Forms/MergeShortLines.cs rename to src/ui/Forms/MergeShortLines.cs index 8df0d2ef8..0543f6657 100644 --- a/src/Forms/MergeShortLines.cs +++ b/src/ui/Forms/MergeShortLines.cs @@ -1,326 +1,326 @@ -using Nikse.SubtitleEdit.Controls; -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Globalization; -using System.Text; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public partial class MergeShortLines : PositionAndSizeForm - { - public int NumberOfMerges { get; private set; } - public Subtitle MergedSubtitle { get; private set; } - - private Subtitle _subtitle; - - public MergeShortLines() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - UiUtil.FixLargeFonts(this, buttonOK); - SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.CharactersPerSeconds); - SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.WordsPerMinute); - } - - private void MergeShortLines_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - public void Initialize(Subtitle subtitle) - { - if (subtitle.Paragraphs.Count > 0) - { - subtitle.Renumber(); - } - - Text = Configuration.Settings.Language.MergedShortLines.Title; - labelMaxCharacters.Text = Configuration.Settings.Language.MergedShortLines.MaximumCharacters; - labelMaxMillisecondsBetweenLines.Text = Configuration.Settings.Language.MergedShortLines.MaximumMillisecondsBetween; - - checkBoxOnlyContinuationLines.Text = Configuration.Settings.Language.MergedShortLines.OnlyMergeContinuationLines; - - listViewFixes.Columns[0].Text = Configuration.Settings.Language.General.Apply; - listViewFixes.Columns[1].Text = Configuration.Settings.Language.General.LineNumber; - listViewFixes.Columns[2].Text = Configuration.Settings.Language.MergedShortLines.MergedText; - - toolStripMenuItemInverseSelection.Text = Configuration.Settings.Language.Main.Menu.Edit.InverseSelection; - toolStripMenuItemSelectAll.Text = Configuration.Settings.Language.Main.Menu.ContextMenu.SelectAll; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - SubtitleListview1.InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings); - UiUtil.InitializeSubtitleFont(SubtitleListview1); - SubtitleListview1.AutoSizeAllColumns(this); - NumberOfMerges = 0; - if (Configuration.Settings.Tools.MergeShortLinesMaxChars > numericUpDownMaxCharacters.Maximum) - { - numericUpDownMaxCharacters.Value = numericUpDownMaxCharacters.Maximum; - } - else if (Configuration.Settings.Tools.MergeShortLinesMaxChars < numericUpDownMaxCharacters.Minimum) - { - numericUpDownMaxCharacters.Value = numericUpDownMaxCharacters.Minimum; - } - else - { - numericUpDownMaxCharacters.Value = Configuration.Settings.Tools.MergeShortLinesMaxChars; - } - numericUpDownMaxMillisecondsBetweenLines.Value = Configuration.Settings.Tools.MergeShortLinesMaxGap; - checkBoxOnlyContinuationLines.Checked = Configuration.Settings.Tools.MergeShortLinesOnlyContinuous; - _subtitle = subtitle; - } - - private void AddToListView(Paragraph p, string lineNumbers, string newText) - { - var item = new ListViewItem(string.Empty) { Tag = p, Checked = true }; - item.SubItems.Add(lineNumbers.TrimEnd(',')); - item.SubItems.Add(UiUtil.GetListViewTextFromString(newText)); - listViewFixes.Items.Add(item); - } - - private void GeneratePreview() - { - if (_subtitle == null) - { - return; - } - - var mergedIndexes = new List(); - - NumberOfMerges = 0; - SubtitleListview1.Items.Clear(); - SubtitleListview1.BeginUpdate(); - MergedSubtitle = MergeShortLinesInSubtitle(_subtitle, mergedIndexes, out var count, (double)numericUpDownMaxMillisecondsBetweenLines.Value, (int)numericUpDownMaxCharacters.Value, true); - NumberOfMerges = count; - - SubtitleListview1.Fill(_subtitle); - - foreach (var index in mergedIndexes) - { - SubtitleListview1.SetBackgroundColor(index, Color.Green); - } - - SubtitleListview1.EndUpdate(); - groupBoxLinesFound.Text = string.Format(Configuration.Settings.Language.MergedShortLines.NumberOfMergesX, NumberOfMerges); - } - - private bool IsFixAllowed(Paragraph p) - { - foreach (ListViewItem item in listViewFixes.Items) - { - string numbers = item.SubItems[1].Text; - foreach (string number in numbers.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) - { - if (number == p.Number.ToString(CultureInfo.InvariantCulture)) - { - return item.Checked; - } - } - } - return true; - } - - public Subtitle MergeShortLinesInSubtitle(Subtitle subtitle, List mergedIndexes, out int numberOfMerges, double maxMillisecondsBetweenLines, int maxCharacters, bool clearFixes) - { - listViewFixes.ItemChecked -= listViewFixes_ItemChecked; - if (clearFixes) - { - listViewFixes.Items.Clear(); - } - - numberOfMerges = 0; - string language = LanguageAutoDetect.AutoDetectGoogleLanguage(subtitle); - var mergedSubtitle = new Subtitle(); - bool lastMerged = false; - Paragraph p = null; - var lineNumbers = new StringBuilder(); - bool onlyContinuousLines = checkBoxOnlyContinuationLines.Checked; - for (int i = 1; i < subtitle.Paragraphs.Count; i++) - { - if (!lastMerged) - { - p = new Paragraph(subtitle.GetParagraphOrDefault(i - 1)); - mergedSubtitle.Paragraphs.Add(p); - } - Paragraph next = subtitle.GetParagraphOrDefault(i); - if (next != null) - { - if (Utilities.QualifiesForMerge(p, next, maxMillisecondsBetweenLines, maxCharacters, onlyContinuousLines) && IsFixAllowed(p)) - { - if (MergeShortLinesUtils.GetStartTag(p.Text) == MergeShortLinesUtils.GetStartTag(next.Text) && - MergeShortLinesUtils.GetEndTag(p.Text) == MergeShortLinesUtils.GetEndTag(next.Text)) - { - string s1 = p.Text.Trim(); - s1 = s1.Substring(0, s1.Length - MergeShortLinesUtils.GetEndTag(s1).Length); - string s2 = next.Text.Trim(); - s2 = s2.Substring(MergeShortLinesUtils.GetStartTag(s2).Length); - p.Text = Utilities.AutoBreakLine(s1 + Environment.NewLine + s2, language); - } - else - { - p.Text = Utilities.AutoBreakLine(p.Text + Environment.NewLine + next.Text, language); - } - p.EndTime = next.EndTime; - - if (lastMerged) - { - lineNumbers.Append(next.Number); - lineNumbers.Append(','); - } - else - { - lineNumbers.Append(p.Number); - lineNumbers.Append(','); - lineNumbers.Append(next.Number); - lineNumbers.Append(','); - } - - lastMerged = true; - numberOfMerges++; - if (!mergedIndexes.Contains(i)) - { - mergedIndexes.Add(i); - } - - if (!mergedIndexes.Contains(i - 1)) - { - mergedIndexes.Add(i - 1); - } - } - else - { - lastMerged = false; - } - } - else - { - lastMerged = false; - } - if (!lastMerged && lineNumbers.Length > 0 && clearFixes) - { - AddToListView(p, lineNumbers.ToString(), p.Text); - lineNumbers.Clear(); - } - } - if (!lastMerged) - { - mergedSubtitle.Paragraphs.Add(new Paragraph(subtitle.GetParagraphOrDefault(subtitle.Paragraphs.Count - 1))); - } - - listViewFixes.ItemChecked += listViewFixes_ItemChecked; - return mergedSubtitle; - } - - private void NumericUpDownMaxCharactersValueChanged(object sender, EventArgs e) - { - Cursor = Cursors.WaitCursor; - GeneratePreview(); - Cursor = Cursors.Default; - } - - private void NumericUpDownMaxMillisecondsBetweenLinesValueChanged(object sender, EventArgs e) - { - Cursor = Cursors.WaitCursor; - GeneratePreview(); - Cursor = Cursors.Default; - } - - private void ButtonCancelClick(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private void ButtonOkClick(object sender, EventArgs e) - { - Configuration.Settings.Tools.MergeShortLinesMaxGap = (int)numericUpDownMaxMillisecondsBetweenLines.Value; - Configuration.Settings.Tools.MergeShortLinesOnlyContinuous = checkBoxOnlyContinuationLines.Checked; - DialogResult = DialogResult.OK; - } - - private void listViewFixes_SelectedIndexChanged(object sender, EventArgs e) - { - if (listViewFixes.SelectedIndices.Count > 0) - { - int index = listViewFixes.SelectedIndices[0]; - ListViewItem item = listViewFixes.Items[index]; - string[] numbers = item.SubItems[1].Text.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); - foreach (string number in numbers) - { - foreach (Paragraph p in _subtitle.Paragraphs) - { - if (p.Number.ToString(CultureInfo.InvariantCulture) == number) - { - index = _subtitle.GetIndex(p); - SubtitleListview1.EnsureVisible(index); - } - } - } - } - } - - private void listViewFixes_ItemChecked(object sender, ItemCheckedEventArgs e) - { - var mergedIndexes = new List(); - - NumberOfMerges = 0; - SubtitleListview1.Items.Clear(); - SubtitleListview1.BeginUpdate(); - int count; - MergedSubtitle = MergeShortLinesInSubtitle(_subtitle, mergedIndexes, out count, (double)numericUpDownMaxMillisecondsBetweenLines.Value, (int)numericUpDownMaxCharacters.Value, false); - NumberOfMerges = count; - SubtitleListview1.Fill(_subtitle); - foreach (var index in mergedIndexes) - { - SubtitleListview1.SetBackgroundColor(index, Color.Green); - } - SubtitleListview1.EndUpdate(); - groupBoxLinesFound.Text = string.Format(Configuration.Settings.Language.MergedShortLines.NumberOfMergesX, NumberOfMerges); - } - - private void MergeShortLines_Shown(object sender, EventArgs e) - { - GeneratePreview(); - listViewFixes.Focus(); - if (listViewFixes.Items.Count > 0) - { - listViewFixes.Items[0].Selected = true; - } - } - - private void checkBoxOnlyContinuationLines_CheckedChanged(object sender, EventArgs e) - { - Cursor = Cursors.WaitCursor; - GeneratePreview(); - Cursor = Cursors.Default; - } - - private void MergeShortLines_FormClosing(object sender, FormClosingEventArgs e) - { - Configuration.Settings.Tools.MergeShortLinesMaxChars = (int)numericUpDownMaxCharacters.Value; - } - - private void toolStripMenuItemSelectAll_Click(object sender, EventArgs e) - { - foreach (ListViewItem item in listViewFixes.Items) - { - item.Checked = true; - } - } - - private void toolStripMenuItemInverseSelection_Click(object sender, EventArgs e) - { - foreach (ListViewItem item in listViewFixes.Items) - { - item.Checked = !item.Checked; - } - } - } -} +using Nikse.SubtitleEdit.Controls; +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Globalization; +using System.Text; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public partial class MergeShortLines : PositionAndSizeForm + { + public int NumberOfMerges { get; private set; } + public Subtitle MergedSubtitle { get; private set; } + + private Subtitle _subtitle; + + public MergeShortLines() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + UiUtil.FixLargeFonts(this, buttonOK); + SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.CharactersPerSeconds); + SubtitleListview1.HideColumn(SubtitleListView.SubtitleColumn.WordsPerMinute); + } + + private void MergeShortLines_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + public void Initialize(Subtitle subtitle) + { + if (subtitle.Paragraphs.Count > 0) + { + subtitle.Renumber(); + } + + Text = Configuration.Settings.Language.MergedShortLines.Title; + labelMaxCharacters.Text = Configuration.Settings.Language.MergedShortLines.MaximumCharacters; + labelMaxMillisecondsBetweenLines.Text = Configuration.Settings.Language.MergedShortLines.MaximumMillisecondsBetween; + + checkBoxOnlyContinuationLines.Text = Configuration.Settings.Language.MergedShortLines.OnlyMergeContinuationLines; + + listViewFixes.Columns[0].Text = Configuration.Settings.Language.General.Apply; + listViewFixes.Columns[1].Text = Configuration.Settings.Language.General.LineNumber; + listViewFixes.Columns[2].Text = Configuration.Settings.Language.MergedShortLines.MergedText; + + toolStripMenuItemInverseSelection.Text = Configuration.Settings.Language.Main.Menu.Edit.InverseSelection; + toolStripMenuItemSelectAll.Text = Configuration.Settings.Language.Main.Menu.ContextMenu.SelectAll; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + SubtitleListview1.InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings); + UiUtil.InitializeSubtitleFont(SubtitleListview1); + SubtitleListview1.AutoSizeAllColumns(this); + NumberOfMerges = 0; + if (Configuration.Settings.Tools.MergeShortLinesMaxChars > numericUpDownMaxCharacters.Maximum) + { + numericUpDownMaxCharacters.Value = numericUpDownMaxCharacters.Maximum; + } + else if (Configuration.Settings.Tools.MergeShortLinesMaxChars < numericUpDownMaxCharacters.Minimum) + { + numericUpDownMaxCharacters.Value = numericUpDownMaxCharacters.Minimum; + } + else + { + numericUpDownMaxCharacters.Value = Configuration.Settings.Tools.MergeShortLinesMaxChars; + } + numericUpDownMaxMillisecondsBetweenLines.Value = Configuration.Settings.Tools.MergeShortLinesMaxGap; + checkBoxOnlyContinuationLines.Checked = Configuration.Settings.Tools.MergeShortLinesOnlyContinuous; + _subtitle = subtitle; + } + + private void AddToListView(Paragraph p, string lineNumbers, string newText) + { + var item = new ListViewItem(string.Empty) { Tag = p, Checked = true }; + item.SubItems.Add(lineNumbers.TrimEnd(',')); + item.SubItems.Add(UiUtil.GetListViewTextFromString(newText)); + listViewFixes.Items.Add(item); + } + + private void GeneratePreview() + { + if (_subtitle == null) + { + return; + } + + var mergedIndexes = new List(); + + NumberOfMerges = 0; + SubtitleListview1.Items.Clear(); + SubtitleListview1.BeginUpdate(); + MergedSubtitle = MergeShortLinesInSubtitle(_subtitle, mergedIndexes, out var count, (double)numericUpDownMaxMillisecondsBetweenLines.Value, (int)numericUpDownMaxCharacters.Value, true); + NumberOfMerges = count; + + SubtitleListview1.Fill(_subtitle); + + foreach (var index in mergedIndexes) + { + SubtitleListview1.SetBackgroundColor(index, Color.Green); + } + + SubtitleListview1.EndUpdate(); + groupBoxLinesFound.Text = string.Format(Configuration.Settings.Language.MergedShortLines.NumberOfMergesX, NumberOfMerges); + } + + private bool IsFixAllowed(Paragraph p) + { + foreach (ListViewItem item in listViewFixes.Items) + { + string numbers = item.SubItems[1].Text; + foreach (string number in numbers.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) + { + if (number == p.Number.ToString(CultureInfo.InvariantCulture)) + { + return item.Checked; + } + } + } + return true; + } + + public Subtitle MergeShortLinesInSubtitle(Subtitle subtitle, List mergedIndexes, out int numberOfMerges, double maxMillisecondsBetweenLines, int maxCharacters, bool clearFixes) + { + listViewFixes.ItemChecked -= listViewFixes_ItemChecked; + if (clearFixes) + { + listViewFixes.Items.Clear(); + } + + numberOfMerges = 0; + string language = LanguageAutoDetect.AutoDetectGoogleLanguage(subtitle); + var mergedSubtitle = new Subtitle(); + bool lastMerged = false; + Paragraph p = null; + var lineNumbers = new StringBuilder(); + bool onlyContinuousLines = checkBoxOnlyContinuationLines.Checked; + for (int i = 1; i < subtitle.Paragraphs.Count; i++) + { + if (!lastMerged) + { + p = new Paragraph(subtitle.GetParagraphOrDefault(i - 1)); + mergedSubtitle.Paragraphs.Add(p); + } + Paragraph next = subtitle.GetParagraphOrDefault(i); + if (next != null) + { + if (Utilities.QualifiesForMerge(p, next, maxMillisecondsBetweenLines, maxCharacters, onlyContinuousLines) && IsFixAllowed(p)) + { + if (MergeShortLinesUtils.GetStartTag(p.Text) == MergeShortLinesUtils.GetStartTag(next.Text) && + MergeShortLinesUtils.GetEndTag(p.Text) == MergeShortLinesUtils.GetEndTag(next.Text)) + { + string s1 = p.Text.Trim(); + s1 = s1.Substring(0, s1.Length - MergeShortLinesUtils.GetEndTag(s1).Length); + string s2 = next.Text.Trim(); + s2 = s2.Substring(MergeShortLinesUtils.GetStartTag(s2).Length); + p.Text = Utilities.AutoBreakLine(s1 + Environment.NewLine + s2, language); + } + else + { + p.Text = Utilities.AutoBreakLine(p.Text + Environment.NewLine + next.Text, language); + } + p.EndTime = next.EndTime; + + if (lastMerged) + { + lineNumbers.Append(next.Number); + lineNumbers.Append(','); + } + else + { + lineNumbers.Append(p.Number); + lineNumbers.Append(','); + lineNumbers.Append(next.Number); + lineNumbers.Append(','); + } + + lastMerged = true; + numberOfMerges++; + if (!mergedIndexes.Contains(i)) + { + mergedIndexes.Add(i); + } + + if (!mergedIndexes.Contains(i - 1)) + { + mergedIndexes.Add(i - 1); + } + } + else + { + lastMerged = false; + } + } + else + { + lastMerged = false; + } + if (!lastMerged && lineNumbers.Length > 0 && clearFixes) + { + AddToListView(p, lineNumbers.ToString(), p.Text); + lineNumbers.Clear(); + } + } + if (!lastMerged) + { + mergedSubtitle.Paragraphs.Add(new Paragraph(subtitle.GetParagraphOrDefault(subtitle.Paragraphs.Count - 1))); + } + + listViewFixes.ItemChecked += listViewFixes_ItemChecked; + return mergedSubtitle; + } + + private void NumericUpDownMaxCharactersValueChanged(object sender, EventArgs e) + { + Cursor = Cursors.WaitCursor; + GeneratePreview(); + Cursor = Cursors.Default; + } + + private void NumericUpDownMaxMillisecondsBetweenLinesValueChanged(object sender, EventArgs e) + { + Cursor = Cursors.WaitCursor; + GeneratePreview(); + Cursor = Cursors.Default; + } + + private void ButtonCancelClick(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void ButtonOkClick(object sender, EventArgs e) + { + Configuration.Settings.Tools.MergeShortLinesMaxGap = (int)numericUpDownMaxMillisecondsBetweenLines.Value; + Configuration.Settings.Tools.MergeShortLinesOnlyContinuous = checkBoxOnlyContinuationLines.Checked; + DialogResult = DialogResult.OK; + } + + private void listViewFixes_SelectedIndexChanged(object sender, EventArgs e) + { + if (listViewFixes.SelectedIndices.Count > 0) + { + int index = listViewFixes.SelectedIndices[0]; + ListViewItem item = listViewFixes.Items[index]; + string[] numbers = item.SubItems[1].Text.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + foreach (string number in numbers) + { + foreach (Paragraph p in _subtitle.Paragraphs) + { + if (p.Number.ToString(CultureInfo.InvariantCulture) == number) + { + index = _subtitle.GetIndex(p); + SubtitleListview1.EnsureVisible(index); + } + } + } + } + } + + private void listViewFixes_ItemChecked(object sender, ItemCheckedEventArgs e) + { + var mergedIndexes = new List(); + + NumberOfMerges = 0; + SubtitleListview1.Items.Clear(); + SubtitleListview1.BeginUpdate(); + int count; + MergedSubtitle = MergeShortLinesInSubtitle(_subtitle, mergedIndexes, out count, (double)numericUpDownMaxMillisecondsBetweenLines.Value, (int)numericUpDownMaxCharacters.Value, false); + NumberOfMerges = count; + SubtitleListview1.Fill(_subtitle); + foreach (var index in mergedIndexes) + { + SubtitleListview1.SetBackgroundColor(index, Color.Green); + } + SubtitleListview1.EndUpdate(); + groupBoxLinesFound.Text = string.Format(Configuration.Settings.Language.MergedShortLines.NumberOfMergesX, NumberOfMerges); + } + + private void MergeShortLines_Shown(object sender, EventArgs e) + { + GeneratePreview(); + listViewFixes.Focus(); + if (listViewFixes.Items.Count > 0) + { + listViewFixes.Items[0].Selected = true; + } + } + + private void checkBoxOnlyContinuationLines_CheckedChanged(object sender, EventArgs e) + { + Cursor = Cursors.WaitCursor; + GeneratePreview(); + Cursor = Cursors.Default; + } + + private void MergeShortLines_FormClosing(object sender, FormClosingEventArgs e) + { + Configuration.Settings.Tools.MergeShortLinesMaxChars = (int)numericUpDownMaxCharacters.Value; + } + + private void toolStripMenuItemSelectAll_Click(object sender, EventArgs e) + { + foreach (ListViewItem item in listViewFixes.Items) + { + item.Checked = true; + } + } + + private void toolStripMenuItemInverseSelection_Click(object sender, EventArgs e) + { + foreach (ListViewItem item in listViewFixes.Items) + { + item.Checked = !item.Checked; + } + } + } +} diff --git a/src/Forms/MergeShortLines.resx b/src/ui/Forms/MergeShortLines.resx similarity index 97% rename from src/Forms/MergeShortLines.resx rename to src/ui/Forms/MergeShortLines.resx index 661dc1126..ad537526f 100644 --- a/src/Forms/MergeShortLines.resx +++ b/src/ui/Forms/MergeShortLines.resx @@ -1,123 +1,123 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + \ No newline at end of file diff --git a/src/Forms/MergeTextWithSameTimeCodes.Designer.cs b/src/ui/Forms/MergeTextWithSameTimeCodes.Designer.cs similarity index 100% rename from src/Forms/MergeTextWithSameTimeCodes.Designer.cs rename to src/ui/Forms/MergeTextWithSameTimeCodes.Designer.cs diff --git a/src/Forms/MergeTextWithSameTimeCodes.cs b/src/ui/Forms/MergeTextWithSameTimeCodes.cs similarity index 100% rename from src/Forms/MergeTextWithSameTimeCodes.cs rename to src/ui/Forms/MergeTextWithSameTimeCodes.cs diff --git a/src/Forms/ApplyDurationLimits.resx b/src/ui/Forms/MergeTextWithSameTimeCodes.resx similarity index 97% rename from src/Forms/ApplyDurationLimits.resx rename to src/ui/Forms/MergeTextWithSameTimeCodes.resx index 661dc1126..ad537526f 100644 --- a/src/Forms/ApplyDurationLimits.resx +++ b/src/ui/Forms/MergeTextWithSameTimeCodes.resx @@ -1,123 +1,123 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + \ No newline at end of file diff --git a/src/Forms/ModifySelection.Designer.cs b/src/ui/Forms/ModifySelection.Designer.cs similarity index 98% rename from src/Forms/ModifySelection.Designer.cs rename to src/ui/Forms/ModifySelection.Designer.cs index ec5350c41..3dec0fcea 100644 --- a/src/Forms/ModifySelection.Designer.cs +++ b/src/ui/Forms/ModifySelection.Designer.cs @@ -1,385 +1,385 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class ModifySelection - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.groupBoxWhatToDo = new System.Windows.Forms.GroupBox(); - this.radioButtonIntersect = new System.Windows.Forms.RadioButton(); - this.radioButtonSubtractFromSelection = new System.Windows.Forms.RadioButton(); - this.radioButtonAddToSelection = new System.Windows.Forms.RadioButton(); - this.radioButtonNewSelection = new System.Windows.Forms.RadioButton(); - this.groupBoxRule = new System.Windows.Forms.GroupBox(); - this.numericUpDownDuration = new System.Windows.Forms.NumericUpDown(); - this.checkBoxCaseSensitive = new System.Windows.Forms.CheckBox(); - this.textBoxText = new System.Windows.Forms.TextBox(); - this.comboBoxRule = new System.Windows.Forms.ComboBox(); - this.listViewStyles = new System.Windows.Forms.ListView(); - this.columnHeaderStyleName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.buttonApply = new System.Windows.Forms.Button(); - this.groupBoxPreview = new System.Windows.Forms.GroupBox(); - this.listViewFixes = new System.Windows.Forms.ListView(); - this.columnHeaderApply = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderLine = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderText = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderStyle = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.labelInfo = new System.Windows.Forms.Label(); - this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); - this.toolStripMenuItemSelectAll = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemInverseSelection = new System.Windows.Forms.ToolStripMenuItem(); - this.groupBoxWhatToDo.SuspendLayout(); - this.groupBoxRule.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDuration)).BeginInit(); - this.groupBoxPreview.SuspendLayout(); - this.contextMenuStrip1.SuspendLayout(); - this.SuspendLayout(); - // - // groupBoxWhatToDo - // - this.groupBoxWhatToDo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxWhatToDo.Controls.Add(this.radioButtonIntersect); - this.groupBoxWhatToDo.Controls.Add(this.radioButtonSubtractFromSelection); - this.groupBoxWhatToDo.Controls.Add(this.radioButtonAddToSelection); - this.groupBoxWhatToDo.Controls.Add(this.radioButtonNewSelection); - this.groupBoxWhatToDo.Location = new System.Drawing.Point(380, 12); - this.groupBoxWhatToDo.Name = "groupBoxWhatToDo"; - this.groupBoxWhatToDo.Size = new System.Drawing.Size(411, 135); - this.groupBoxWhatToDo.TabIndex = 1; - this.groupBoxWhatToDo.TabStop = false; - this.groupBoxWhatToDo.Text = "What to do with matches"; - // - // radioButtonIntersect - // - this.radioButtonIntersect.AutoSize = true; - this.radioButtonIntersect.Location = new System.Drawing.Point(7, 89); - this.radioButtonIntersect.Name = "radioButtonIntersect"; - this.radioButtonIntersect.Size = new System.Drawing.Size(172, 17); - this.radioButtonIntersect.TabIndex = 3; - this.radioButtonIntersect.Text = "Intersect with current selection"; - this.radioButtonIntersect.UseVisualStyleBackColor = true; - this.radioButtonIntersect.CheckedChanged += new System.EventHandler(this.radioButton_CheckedChanged); - // - // radioButtonSubtractFromSelection - // - this.radioButtonSubtractFromSelection.AutoSize = true; - this.radioButtonSubtractFromSelection.Location = new System.Drawing.Point(7, 66); - this.radioButtonSubtractFromSelection.Name = "radioButtonSubtractFromSelection"; - this.radioButtonSubtractFromSelection.Size = new System.Drawing.Size(169, 17); - this.radioButtonSubtractFromSelection.TabIndex = 2; - this.radioButtonSubtractFromSelection.Text = "Subtract from current selection"; - this.radioButtonSubtractFromSelection.UseVisualStyleBackColor = true; - this.radioButtonSubtractFromSelection.CheckedChanged += new System.EventHandler(this.radioButton_CheckedChanged); - // - // radioButtonAddToSelection - // - this.radioButtonAddToSelection.AutoSize = true; - this.radioButtonAddToSelection.Location = new System.Drawing.Point(7, 43); - this.radioButtonAddToSelection.Name = "radioButtonAddToSelection"; - this.radioButtonAddToSelection.Size = new System.Drawing.Size(137, 17); - this.radioButtonAddToSelection.TabIndex = 1; - this.radioButtonAddToSelection.Text = "Add to current selection"; - this.radioButtonAddToSelection.UseVisualStyleBackColor = true; - this.radioButtonAddToSelection.CheckedChanged += new System.EventHandler(this.radioButton_CheckedChanged); - // - // radioButtonNewSelection - // - this.radioButtonNewSelection.AutoSize = true; - this.radioButtonNewSelection.Checked = true; - this.radioButtonNewSelection.Location = new System.Drawing.Point(7, 20); - this.radioButtonNewSelection.Name = "radioButtonNewSelection"; - this.radioButtonNewSelection.Size = new System.Drawing.Size(120, 17); - this.radioButtonNewSelection.TabIndex = 0; - this.radioButtonNewSelection.TabStop = true; - this.radioButtonNewSelection.Text = "Make new selection"; - this.radioButtonNewSelection.UseVisualStyleBackColor = true; - this.radioButtonNewSelection.CheckedChanged += new System.EventHandler(this.radioButton_CheckedChanged); - // - // groupBoxRule - // - this.groupBoxRule.Controls.Add(this.numericUpDownDuration); - this.groupBoxRule.Controls.Add(this.checkBoxCaseSensitive); - this.groupBoxRule.Controls.Add(this.textBoxText); - this.groupBoxRule.Controls.Add(this.comboBoxRule); - this.groupBoxRule.Controls.Add(this.listViewStyles); - this.groupBoxRule.Location = new System.Drawing.Point(12, 12); - this.groupBoxRule.Name = "groupBoxRule"; - this.groupBoxRule.Size = new System.Drawing.Size(362, 135); - this.groupBoxRule.TabIndex = 0; - this.groupBoxRule.TabStop = false; - this.groupBoxRule.Text = "Rule"; - // - // numericUpDownDuration - // - this.numericUpDownDuration.Location = new System.Drawing.Point(198, 22); - this.numericUpDownDuration.Maximum = new decimal(new int[] { - 10000, - 0, - 0, - 0}); - this.numericUpDownDuration.Name = "numericUpDownDuration"; - this.numericUpDownDuration.Size = new System.Drawing.Size(82, 20); - this.numericUpDownDuration.TabIndex = 4; - this.numericUpDownDuration.ValueChanged += new System.EventHandler(this.numericUpDownDuration_ValueChanged); - // - // checkBoxCaseSensitive - // - this.checkBoxCaseSensitive.AutoSize = true; - this.checkBoxCaseSensitive.Location = new System.Drawing.Point(6, 47); - this.checkBoxCaseSensitive.Name = "checkBoxCaseSensitive"; - this.checkBoxCaseSensitive.Size = new System.Drawing.Size(94, 17); - this.checkBoxCaseSensitive.TabIndex = 2; - this.checkBoxCaseSensitive.Text = "Case sensitive"; - this.checkBoxCaseSensitive.UseVisualStyleBackColor = true; - this.checkBoxCaseSensitive.CheckedChanged += new System.EventHandler(this.checkBoxCaseSensitive_CheckedChanged); - // - // textBoxText - // - this.textBoxText.Location = new System.Drawing.Point(198, 21); - this.textBoxText.Name = "textBoxText"; - this.textBoxText.Size = new System.Drawing.Size(158, 20); - this.textBoxText.TabIndex = 1; - this.textBoxText.TextChanged += new System.EventHandler(this.textBox1_TextChanged); - // - // comboBoxRule - // - this.comboBoxRule.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxRule.FormattingEnabled = true; - this.comboBoxRule.Items.AddRange(new object[] { - "Contains", - "Starts with", - "Ends with", - "Not contains", - "RegEx"}); - this.comboBoxRule.Location = new System.Drawing.Point(6, 20); - this.comboBoxRule.Name = "comboBoxRule"; - this.comboBoxRule.Size = new System.Drawing.Size(185, 21); - this.comboBoxRule.TabIndex = 0; - this.comboBoxRule.SelectedIndexChanged += new System.EventHandler(this.comboBoxRule_SelectedIndexChanged); - // - // listViewStyles - // - this.listViewStyles.CheckBoxes = true; - this.listViewStyles.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeaderStyleName}); - this.listViewStyles.FullRowSelect = true; - this.listViewStyles.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None; - this.listViewStyles.HideSelection = false; - this.listViewStyles.Location = new System.Drawing.Point(198, 21); - this.listViewStyles.Name = "listViewStyles"; - this.listViewStyles.Size = new System.Drawing.Size(158, 108); - this.listViewStyles.TabIndex = 3; - this.listViewStyles.UseCompatibleStateImageBehavior = false; - this.listViewStyles.View = System.Windows.Forms.View.Details; - this.listViewStyles.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.listViewStyles_ItemChecked); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(621, 446); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 6; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(540, 446); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 5; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // buttonApply - // - this.buttonApply.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonApply.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonApply.Location = new System.Drawing.Point(702, 446); - this.buttonApply.Name = "buttonApply"; - this.buttonApply.Size = new System.Drawing.Size(89, 23); - this.buttonApply.TabIndex = 7; - this.buttonApply.Text = "&Apply"; - this.buttonApply.UseVisualStyleBackColor = true; - this.buttonApply.Click += new System.EventHandler(this.buttonApply_Click); - // - // groupBoxPreview - // - this.groupBoxPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxPreview.Controls.Add(this.listViewFixes); - this.groupBoxPreview.Location = new System.Drawing.Point(12, 153); - this.groupBoxPreview.Name = "groupBoxPreview"; - this.groupBoxPreview.Size = new System.Drawing.Size(779, 286); - this.groupBoxPreview.TabIndex = 2; - this.groupBoxPreview.TabStop = false; - this.groupBoxPreview.Text = "Matching lines"; - // - // listViewFixes - // - this.listViewFixes.CheckBoxes = true; - this.listViewFixes.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeaderApply, - this.columnHeaderLine, - this.columnHeaderText, - this.columnHeaderStyle}); - this.listViewFixes.ContextMenuStrip = this.contextMenuStrip1; - this.listViewFixes.Dock = System.Windows.Forms.DockStyle.Fill; - this.listViewFixes.FullRowSelect = true; - this.listViewFixes.HideSelection = false; - this.listViewFixes.Location = new System.Drawing.Point(3, 16); - this.listViewFixes.Name = "listViewFixes"; - this.listViewFixes.Size = new System.Drawing.Size(773, 267); - this.listViewFixes.TabIndex = 1; - this.listViewFixes.UseCompatibleStateImageBehavior = false; - this.listViewFixes.View = System.Windows.Forms.View.Details; - // - // columnHeaderApply - // - this.columnHeaderApply.Text = "Apply"; - this.columnHeaderApply.Width = 50; - // - // columnHeaderLine - // - this.columnHeaderLine.Text = "Line#"; - this.columnHeaderLine.Width = 122; - // - // columnHeaderText - // - this.columnHeaderText.Text = "Text"; - this.columnHeaderText.Width = 450; - // - // columnHeaderStyle - // - this.columnHeaderStyle.Text = "Style"; - // - // labelInfo - // - this.labelInfo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelInfo.AutoSize = true; - this.labelInfo.Location = new System.Drawing.Point(12, 446); - this.labelInfo.Name = "labelInfo"; - this.labelInfo.Size = new System.Drawing.Size(47, 13); - this.labelInfo.TabIndex = 3; - this.labelInfo.Text = "labelInfo"; - // - // contextMenuStrip1 - // - this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripMenuItemSelectAll, - this.toolStripMenuItemInverseSelection}); - this.contextMenuStrip1.Name = "contextMenuStrip1"; - this.contextMenuStrip1.Size = new System.Drawing.Size(181, 70); - // - // toolStripMenuItemSelectAll - // - this.toolStripMenuItemSelectAll.Name = "toolStripMenuItemSelectAll"; - this.toolStripMenuItemSelectAll.Size = new System.Drawing.Size(180, 22); - this.toolStripMenuItemSelectAll.Text = "Select all"; - this.toolStripMenuItemSelectAll.Click += new System.EventHandler(this.toolStripMenuItemSelectAll_Click); - // - // toolStripMenuItemInverseSelection - // - this.toolStripMenuItemInverseSelection.Name = "toolStripMenuItemInverseSelection"; - this.toolStripMenuItemInverseSelection.Size = new System.Drawing.Size(180, 22); - this.toolStripMenuItemInverseSelection.Text = "Inverse selection"; - this.toolStripMenuItemInverseSelection.Click += new System.EventHandler(this.toolStripMenuItemInverseSelection_Click); - // - // ModifySelection - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(803, 478); - this.Controls.Add(this.labelInfo); - this.Controls.Add(this.groupBoxWhatToDo); - this.Controls.Add(this.groupBoxPreview); - this.Controls.Add(this.buttonApply); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.groupBoxRule); - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(700, 400); - this.Name = "ModifySelection"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Create/modify selection"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ModifySelection_KeyDown); - this.Resize += new System.EventHandler(this.ModifySelection_Resize); - this.groupBoxWhatToDo.ResumeLayout(false); - this.groupBoxWhatToDo.PerformLayout(); - this.groupBoxRule.ResumeLayout(false); - this.groupBoxRule.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDuration)).EndInit(); - this.groupBoxPreview.ResumeLayout(false); - this.contextMenuStrip1.ResumeLayout(false); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.GroupBox groupBoxWhatToDo; - private System.Windows.Forms.RadioButton radioButtonSubtractFromSelection; - private System.Windows.Forms.RadioButton radioButtonAddToSelection; - private System.Windows.Forms.RadioButton radioButtonNewSelection; - private System.Windows.Forms.GroupBox groupBoxRule; - private System.Windows.Forms.TextBox textBoxText; - private System.Windows.Forms.ComboBox comboBoxRule; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Button buttonApply; - private System.Windows.Forms.GroupBox groupBoxPreview; - private System.Windows.Forms.ListView listViewFixes; - private System.Windows.Forms.ColumnHeader columnHeaderApply; - private System.Windows.Forms.ColumnHeader columnHeaderLine; - private System.Windows.Forms.ColumnHeader columnHeaderText; - private System.Windows.Forms.Label labelInfo; - private System.Windows.Forms.CheckBox checkBoxCaseSensitive; - private System.Windows.Forms.RadioButton radioButtonIntersect; - private System.Windows.Forms.ColumnHeader columnHeaderStyle; - private System.Windows.Forms.ListView listViewStyles; - private System.Windows.Forms.ColumnHeader columnHeaderStyleName; - private System.Windows.Forms.NumericUpDown numericUpDownDuration; - private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSelectAll; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInverseSelection; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class ModifySelection + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.groupBoxWhatToDo = new System.Windows.Forms.GroupBox(); + this.radioButtonIntersect = new System.Windows.Forms.RadioButton(); + this.radioButtonSubtractFromSelection = new System.Windows.Forms.RadioButton(); + this.radioButtonAddToSelection = new System.Windows.Forms.RadioButton(); + this.radioButtonNewSelection = new System.Windows.Forms.RadioButton(); + this.groupBoxRule = new System.Windows.Forms.GroupBox(); + this.numericUpDownDuration = new System.Windows.Forms.NumericUpDown(); + this.checkBoxCaseSensitive = new System.Windows.Forms.CheckBox(); + this.textBoxText = new System.Windows.Forms.TextBox(); + this.comboBoxRule = new System.Windows.Forms.ComboBox(); + this.listViewStyles = new System.Windows.Forms.ListView(); + this.columnHeaderStyleName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.buttonApply = new System.Windows.Forms.Button(); + this.groupBoxPreview = new System.Windows.Forms.GroupBox(); + this.listViewFixes = new System.Windows.Forms.ListView(); + this.columnHeaderApply = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderLine = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderText = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderStyle = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.labelInfo = new System.Windows.Forms.Label(); + this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItemSelectAll = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemInverseSelection = new System.Windows.Forms.ToolStripMenuItem(); + this.groupBoxWhatToDo.SuspendLayout(); + this.groupBoxRule.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDuration)).BeginInit(); + this.groupBoxPreview.SuspendLayout(); + this.contextMenuStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // groupBoxWhatToDo + // + this.groupBoxWhatToDo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxWhatToDo.Controls.Add(this.radioButtonIntersect); + this.groupBoxWhatToDo.Controls.Add(this.radioButtonSubtractFromSelection); + this.groupBoxWhatToDo.Controls.Add(this.radioButtonAddToSelection); + this.groupBoxWhatToDo.Controls.Add(this.radioButtonNewSelection); + this.groupBoxWhatToDo.Location = new System.Drawing.Point(380, 12); + this.groupBoxWhatToDo.Name = "groupBoxWhatToDo"; + this.groupBoxWhatToDo.Size = new System.Drawing.Size(411, 135); + this.groupBoxWhatToDo.TabIndex = 1; + this.groupBoxWhatToDo.TabStop = false; + this.groupBoxWhatToDo.Text = "What to do with matches"; + // + // radioButtonIntersect + // + this.radioButtonIntersect.AutoSize = true; + this.radioButtonIntersect.Location = new System.Drawing.Point(7, 89); + this.radioButtonIntersect.Name = "radioButtonIntersect"; + this.radioButtonIntersect.Size = new System.Drawing.Size(172, 17); + this.radioButtonIntersect.TabIndex = 3; + this.radioButtonIntersect.Text = "Intersect with current selection"; + this.radioButtonIntersect.UseVisualStyleBackColor = true; + this.radioButtonIntersect.CheckedChanged += new System.EventHandler(this.radioButton_CheckedChanged); + // + // radioButtonSubtractFromSelection + // + this.radioButtonSubtractFromSelection.AutoSize = true; + this.radioButtonSubtractFromSelection.Location = new System.Drawing.Point(7, 66); + this.radioButtonSubtractFromSelection.Name = "radioButtonSubtractFromSelection"; + this.radioButtonSubtractFromSelection.Size = new System.Drawing.Size(169, 17); + this.radioButtonSubtractFromSelection.TabIndex = 2; + this.radioButtonSubtractFromSelection.Text = "Subtract from current selection"; + this.radioButtonSubtractFromSelection.UseVisualStyleBackColor = true; + this.radioButtonSubtractFromSelection.CheckedChanged += new System.EventHandler(this.radioButton_CheckedChanged); + // + // radioButtonAddToSelection + // + this.radioButtonAddToSelection.AutoSize = true; + this.radioButtonAddToSelection.Location = new System.Drawing.Point(7, 43); + this.radioButtonAddToSelection.Name = "radioButtonAddToSelection"; + this.radioButtonAddToSelection.Size = new System.Drawing.Size(137, 17); + this.radioButtonAddToSelection.TabIndex = 1; + this.radioButtonAddToSelection.Text = "Add to current selection"; + this.radioButtonAddToSelection.UseVisualStyleBackColor = true; + this.radioButtonAddToSelection.CheckedChanged += new System.EventHandler(this.radioButton_CheckedChanged); + // + // radioButtonNewSelection + // + this.radioButtonNewSelection.AutoSize = true; + this.radioButtonNewSelection.Checked = true; + this.radioButtonNewSelection.Location = new System.Drawing.Point(7, 20); + this.radioButtonNewSelection.Name = "radioButtonNewSelection"; + this.radioButtonNewSelection.Size = new System.Drawing.Size(120, 17); + this.radioButtonNewSelection.TabIndex = 0; + this.radioButtonNewSelection.TabStop = true; + this.radioButtonNewSelection.Text = "Make new selection"; + this.radioButtonNewSelection.UseVisualStyleBackColor = true; + this.radioButtonNewSelection.CheckedChanged += new System.EventHandler(this.radioButton_CheckedChanged); + // + // groupBoxRule + // + this.groupBoxRule.Controls.Add(this.numericUpDownDuration); + this.groupBoxRule.Controls.Add(this.checkBoxCaseSensitive); + this.groupBoxRule.Controls.Add(this.textBoxText); + this.groupBoxRule.Controls.Add(this.comboBoxRule); + this.groupBoxRule.Controls.Add(this.listViewStyles); + this.groupBoxRule.Location = new System.Drawing.Point(12, 12); + this.groupBoxRule.Name = "groupBoxRule"; + this.groupBoxRule.Size = new System.Drawing.Size(362, 135); + this.groupBoxRule.TabIndex = 0; + this.groupBoxRule.TabStop = false; + this.groupBoxRule.Text = "Rule"; + // + // numericUpDownDuration + // + this.numericUpDownDuration.Location = new System.Drawing.Point(198, 22); + this.numericUpDownDuration.Maximum = new decimal(new int[] { + 10000, + 0, + 0, + 0}); + this.numericUpDownDuration.Name = "numericUpDownDuration"; + this.numericUpDownDuration.Size = new System.Drawing.Size(82, 20); + this.numericUpDownDuration.TabIndex = 4; + this.numericUpDownDuration.ValueChanged += new System.EventHandler(this.numericUpDownDuration_ValueChanged); + // + // checkBoxCaseSensitive + // + this.checkBoxCaseSensitive.AutoSize = true; + this.checkBoxCaseSensitive.Location = new System.Drawing.Point(6, 47); + this.checkBoxCaseSensitive.Name = "checkBoxCaseSensitive"; + this.checkBoxCaseSensitive.Size = new System.Drawing.Size(94, 17); + this.checkBoxCaseSensitive.TabIndex = 2; + this.checkBoxCaseSensitive.Text = "Case sensitive"; + this.checkBoxCaseSensitive.UseVisualStyleBackColor = true; + this.checkBoxCaseSensitive.CheckedChanged += new System.EventHandler(this.checkBoxCaseSensitive_CheckedChanged); + // + // textBoxText + // + this.textBoxText.Location = new System.Drawing.Point(198, 21); + this.textBoxText.Name = "textBoxText"; + this.textBoxText.Size = new System.Drawing.Size(158, 20); + this.textBoxText.TabIndex = 1; + this.textBoxText.TextChanged += new System.EventHandler(this.textBox1_TextChanged); + // + // comboBoxRule + // + this.comboBoxRule.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxRule.FormattingEnabled = true; + this.comboBoxRule.Items.AddRange(new object[] { + "Contains", + "Starts with", + "Ends with", + "Not contains", + "RegEx"}); + this.comboBoxRule.Location = new System.Drawing.Point(6, 20); + this.comboBoxRule.Name = "comboBoxRule"; + this.comboBoxRule.Size = new System.Drawing.Size(185, 21); + this.comboBoxRule.TabIndex = 0; + this.comboBoxRule.SelectedIndexChanged += new System.EventHandler(this.comboBoxRule_SelectedIndexChanged); + // + // listViewStyles + // + this.listViewStyles.CheckBoxes = true; + this.listViewStyles.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeaderStyleName}); + this.listViewStyles.FullRowSelect = true; + this.listViewStyles.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None; + this.listViewStyles.HideSelection = false; + this.listViewStyles.Location = new System.Drawing.Point(198, 21); + this.listViewStyles.Name = "listViewStyles"; + this.listViewStyles.Size = new System.Drawing.Size(158, 108); + this.listViewStyles.TabIndex = 3; + this.listViewStyles.UseCompatibleStateImageBehavior = false; + this.listViewStyles.View = System.Windows.Forms.View.Details; + this.listViewStyles.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.listViewStyles_ItemChecked); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(621, 446); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 6; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(540, 446); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 5; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // buttonApply + // + this.buttonApply.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonApply.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonApply.Location = new System.Drawing.Point(702, 446); + this.buttonApply.Name = "buttonApply"; + this.buttonApply.Size = new System.Drawing.Size(89, 23); + this.buttonApply.TabIndex = 7; + this.buttonApply.Text = "&Apply"; + this.buttonApply.UseVisualStyleBackColor = true; + this.buttonApply.Click += new System.EventHandler(this.buttonApply_Click); + // + // groupBoxPreview + // + this.groupBoxPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxPreview.Controls.Add(this.listViewFixes); + this.groupBoxPreview.Location = new System.Drawing.Point(12, 153); + this.groupBoxPreview.Name = "groupBoxPreview"; + this.groupBoxPreview.Size = new System.Drawing.Size(779, 286); + this.groupBoxPreview.TabIndex = 2; + this.groupBoxPreview.TabStop = false; + this.groupBoxPreview.Text = "Matching lines"; + // + // listViewFixes + // + this.listViewFixes.CheckBoxes = true; + this.listViewFixes.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeaderApply, + this.columnHeaderLine, + this.columnHeaderText, + this.columnHeaderStyle}); + this.listViewFixes.ContextMenuStrip = this.contextMenuStrip1; + this.listViewFixes.Dock = System.Windows.Forms.DockStyle.Fill; + this.listViewFixes.FullRowSelect = true; + this.listViewFixes.HideSelection = false; + this.listViewFixes.Location = new System.Drawing.Point(3, 16); + this.listViewFixes.Name = "listViewFixes"; + this.listViewFixes.Size = new System.Drawing.Size(773, 267); + this.listViewFixes.TabIndex = 1; + this.listViewFixes.UseCompatibleStateImageBehavior = false; + this.listViewFixes.View = System.Windows.Forms.View.Details; + // + // columnHeaderApply + // + this.columnHeaderApply.Text = "Apply"; + this.columnHeaderApply.Width = 50; + // + // columnHeaderLine + // + this.columnHeaderLine.Text = "Line#"; + this.columnHeaderLine.Width = 122; + // + // columnHeaderText + // + this.columnHeaderText.Text = "Text"; + this.columnHeaderText.Width = 450; + // + // columnHeaderStyle + // + this.columnHeaderStyle.Text = "Style"; + // + // labelInfo + // + this.labelInfo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelInfo.AutoSize = true; + this.labelInfo.Location = new System.Drawing.Point(12, 446); + this.labelInfo.Name = "labelInfo"; + this.labelInfo.Size = new System.Drawing.Size(47, 13); + this.labelInfo.TabIndex = 3; + this.labelInfo.Text = "labelInfo"; + // + // contextMenuStrip1 + // + this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItemSelectAll, + this.toolStripMenuItemInverseSelection}); + this.contextMenuStrip1.Name = "contextMenuStrip1"; + this.contextMenuStrip1.Size = new System.Drawing.Size(181, 70); + // + // toolStripMenuItemSelectAll + // + this.toolStripMenuItemSelectAll.Name = "toolStripMenuItemSelectAll"; + this.toolStripMenuItemSelectAll.Size = new System.Drawing.Size(180, 22); + this.toolStripMenuItemSelectAll.Text = "Select all"; + this.toolStripMenuItemSelectAll.Click += new System.EventHandler(this.toolStripMenuItemSelectAll_Click); + // + // toolStripMenuItemInverseSelection + // + this.toolStripMenuItemInverseSelection.Name = "toolStripMenuItemInverseSelection"; + this.toolStripMenuItemInverseSelection.Size = new System.Drawing.Size(180, 22); + this.toolStripMenuItemInverseSelection.Text = "Inverse selection"; + this.toolStripMenuItemInverseSelection.Click += new System.EventHandler(this.toolStripMenuItemInverseSelection_Click); + // + // ModifySelection + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(803, 478); + this.Controls.Add(this.labelInfo); + this.Controls.Add(this.groupBoxWhatToDo); + this.Controls.Add(this.groupBoxPreview); + this.Controls.Add(this.buttonApply); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.groupBoxRule); + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(700, 400); + this.Name = "ModifySelection"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Create/modify selection"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ModifySelection_KeyDown); + this.Resize += new System.EventHandler(this.ModifySelection_Resize); + this.groupBoxWhatToDo.ResumeLayout(false); + this.groupBoxWhatToDo.PerformLayout(); + this.groupBoxRule.ResumeLayout(false); + this.groupBoxRule.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDuration)).EndInit(); + this.groupBoxPreview.ResumeLayout(false); + this.contextMenuStrip1.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBoxWhatToDo; + private System.Windows.Forms.RadioButton radioButtonSubtractFromSelection; + private System.Windows.Forms.RadioButton radioButtonAddToSelection; + private System.Windows.Forms.RadioButton radioButtonNewSelection; + private System.Windows.Forms.GroupBox groupBoxRule; + private System.Windows.Forms.TextBox textBoxText; + private System.Windows.Forms.ComboBox comboBoxRule; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Button buttonApply; + private System.Windows.Forms.GroupBox groupBoxPreview; + private System.Windows.Forms.ListView listViewFixes; + private System.Windows.Forms.ColumnHeader columnHeaderApply; + private System.Windows.Forms.ColumnHeader columnHeaderLine; + private System.Windows.Forms.ColumnHeader columnHeaderText; + private System.Windows.Forms.Label labelInfo; + private System.Windows.Forms.CheckBox checkBoxCaseSensitive; + private System.Windows.Forms.RadioButton radioButtonIntersect; + private System.Windows.Forms.ColumnHeader columnHeaderStyle; + private System.Windows.Forms.ListView listViewStyles; + private System.Windows.Forms.ColumnHeader columnHeaderStyleName; + private System.Windows.Forms.NumericUpDown numericUpDownDuration; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSelectAll; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInverseSelection; + } } \ No newline at end of file diff --git a/src/Forms/ModifySelection.cs b/src/ui/Forms/ModifySelection.cs similarity index 97% rename from src/Forms/ModifySelection.cs rename to src/ui/Forms/ModifySelection.cs index 736e14594..db53a374e 100644 --- a/src/Forms/ModifySelection.cs +++ b/src/ui/Forms/ModifySelection.cs @@ -1,576 +1,576 @@ -using Nikse.SubtitleEdit.Controls; -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text.RegularExpressions; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; -using Nikse.SubtitleEdit.Core.SubtitleFormats; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class ModifySelection : PositionAndSizeForm - { - private readonly SubtitleListView _subtitleListView; - private readonly Subtitle _subtitle; - private readonly SubtitleFormat _format; - private readonly bool _loading; - - private const int FunctionContains = 0; - private const int FunctionStartsWith = 1; - private const int FunctionEndsWith = 2; - private const int FunctionNotContains = 3; - private const int FunctionAlUppercase = 4; - private const int FunctionRegEx = 5; - private const int FunctionUnequal = 6; - private const int FunctionEqual = 7; - private const int FunctionDurationLessThan = 8; - private const int FunctionDurationGreaterThan = 9; - private const int FunctionMoreThanTwoLines = 10; - private const int FunctionStyle = 11; - private const int FunctionActor = 12; - - public ModifySelection(Subtitle subtitle, SubtitleFormat format, SubtitleListView subtitleListView) - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - _loading = true; - _subtitle = subtitle; - _format = format; - _subtitleListView = subtitleListView; - labelInfo.Text = string.Empty; - comboBoxRule.SelectedIndex = 0; - Text = Configuration.Settings.Language.ModifySelection.Title; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - buttonApply.Text = Configuration.Settings.Language.General.Apply; - groupBoxRule.Text = Configuration.Settings.Language.ModifySelection.Rule; - groupBoxWhatToDo.Text = Configuration.Settings.Language.ModifySelection.DoWithMatches; - checkBoxCaseSensitive.Text = Configuration.Settings.Language.ModifySelection.CaseSensitive; - radioButtonNewSelection.Text = Configuration.Settings.Language.ModifySelection.MakeNewSelection; - radioButtonAddToSelection.Text = Configuration.Settings.Language.ModifySelection.AddToCurrentSelection; - radioButtonSubtractFromSelection.Text = Configuration.Settings.Language.ModifySelection.SubtractFromCurrentSelection; - radioButtonIntersect.Text = Configuration.Settings.Language.ModifySelection.IntersectWithCurrentSelection; - columnHeaderApply.Text = Configuration.Settings.Language.General.Apply; - columnHeaderLine.Text = Configuration.Settings.Language.General.LineNumber; - columnHeaderText.Text = Configuration.Settings.Language.General.Text; - toolStripMenuItemInverseSelection.Text = Configuration.Settings.Language.Main.Menu.Edit.InverseSelection; - toolStripMenuItemSelectAll.Text = Configuration.Settings.Language.Main.Menu.ContextMenu.SelectAll; - - listViewStyles.Visible = false; - - UiUtil.FixLargeFonts(this, buttonOK); - - comboBoxRule.Items.Clear(); - comboBoxRule.Items.Add(Configuration.Settings.Language.ModifySelection.Contains); - comboBoxRule.Items.Add(Configuration.Settings.Language.ModifySelection.StartsWith); - comboBoxRule.Items.Add(Configuration.Settings.Language.ModifySelection.EndsWith); - comboBoxRule.Items.Add(Configuration.Settings.Language.ModifySelection.NoContains); - comboBoxRule.Items.Add(Configuration.Settings.Language.ChangeCasing.AllUppercase); - comboBoxRule.Items.Add(Configuration.Settings.Language.ModifySelection.RegEx); - comboBoxRule.Items.Add(Configuration.Settings.Language.ModifySelection.UnequalLines); - comboBoxRule.Items.Add(Configuration.Settings.Language.ModifySelection.EqualLines); - comboBoxRule.Items.Add(Configuration.Settings.Language.ModifySelection.DurationLessThan); - comboBoxRule.Items.Add(Configuration.Settings.Language.ModifySelection.DurationGreaterThan); - comboBoxRule.Items.Add(Configuration.Settings.Language.ModifySelection.MoreThanTwoLines); - if (_format.HasStyleSupport) - { - comboBoxRule.Items.Add(Configuration.Settings.Language.General.Style); - } - if (_format.HasStyleSupport && (_format.GetType() == typeof(AdvancedSubStationAlpha) || _format.GetType() == typeof(SubStationAlpha))) - { - comboBoxRule.Items.Add(Configuration.Settings.Language.General.Actor); - } - - checkBoxCaseSensitive.Checked = Configuration.Settings.Tools.ModifySelectionCaseSensitive; - textBoxText.Text = Configuration.Settings.Tools.ModifySelectionText; - if (Configuration.Settings.Tools.ModifySelectionRule == "Starts with") - { - comboBoxRule.SelectedIndex = FunctionStartsWith; - } - else if (Configuration.Settings.Tools.ModifySelectionRule == "Ends with") - { - comboBoxRule.SelectedIndex = FunctionEndsWith; - } - else if (Configuration.Settings.Tools.ModifySelectionRule == "Not contains") - { - comboBoxRule.SelectedIndex = FunctionNotContains; - } - else if (Configuration.Settings.Tools.ModifySelectionRule == "AllUppercase") - { - comboBoxRule.SelectedIndex = FunctionAlUppercase; - } - else if (Configuration.Settings.Tools.ModifySelectionRule == "RegEx") - { - comboBoxRule.SelectedIndex = FunctionRegEx; - } - else if (Configuration.Settings.Tools.ModifySelectionRule == "Duration <") - { - comboBoxRule.SelectedIndex = FunctionDurationLessThan; - } - else if (Configuration.Settings.Tools.ModifySelectionRule == "Duration >") - { - comboBoxRule.SelectedIndex = FunctionDurationGreaterThan; - } - else if (Configuration.Settings.Tools.ModifySelectionRule == "More than two lines") - { - comboBoxRule.SelectedIndex = FunctionMoreThanTwoLines; - } - else if (Configuration.Settings.Tools.ModifySelectionRule == "Style" && _format.HasStyleSupport) - { - comboBoxRule.SelectedIndex = FunctionStyle; - } - else if (Configuration.Settings.Tools.ModifySelectionRule == "Actor" && (_format.GetType() == typeof(AdvancedSubStationAlpha) || _format.GetType() == typeof(SubStationAlpha))) - { - comboBoxRule.SelectedIndex = FunctionActor; - } - else - { - comboBoxRule.SelectedIndex = 0; - } - - if (!_format.HasStyleSupport) - { - listViewFixes.Columns.Remove(columnHeaderStyle); - } - ModifySelection_Resize(null, null); - - _loading = false; - Preview(); - } - - private void ModifySelection_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private void buttonOK_Click(object sender, EventArgs e) - { - ApplySelection(); - DialogResult = DialogResult.OK; - - Configuration.Settings.Tools.ModifySelectionCaseSensitive = checkBoxCaseSensitive.Checked; - Configuration.Settings.Tools.ModifySelectionText = textBoxText.Text; - if (comboBoxRule.SelectedIndex == FunctionContains) - { - Configuration.Settings.Tools.ModifySelectionRule = "Contains"; - } - else if (comboBoxRule.SelectedIndex == FunctionStartsWith) - { - Configuration.Settings.Tools.ModifySelectionRule = "Starts with"; - } - else if (comboBoxRule.SelectedIndex == FunctionEndsWith) - { - Configuration.Settings.Tools.ModifySelectionRule = "Ends with"; - } - else if (comboBoxRule.SelectedIndex == FunctionNotContains) - { - Configuration.Settings.Tools.ModifySelectionRule = "Not contains"; - } - else if (comboBoxRule.SelectedIndex == FunctionAlUppercase) - { - Configuration.Settings.Tools.ModifySelectionRule = "AllUppercase"; - } - else if (comboBoxRule.SelectedIndex == FunctionRegEx) - { - Configuration.Settings.Tools.ModifySelectionRule = "RegEx"; - } - else if (comboBoxRule.SelectedIndex == FunctionDurationLessThan) - { - Configuration.Settings.Tools.ModifySelectionRule = "Duration <"; - } - else if (comboBoxRule.SelectedIndex == FunctionDurationGreaterThan) - { - Configuration.Settings.Tools.ModifySelectionRule = "Duration >"; - } - else if (comboBoxRule.SelectedIndex == FunctionMoreThanTwoLines) - { - Configuration.Settings.Tools.ModifySelectionRule = "More than two lines"; - } - else if (comboBoxRule.SelectedIndex == FunctionStyle) - { - Configuration.Settings.Tools.ModifySelectionRule = "Style"; - } - else if (comboBoxRule.SelectedIndex == FunctionActor) - { - Configuration.Settings.Tools.ModifySelectionRule = "Actor"; - } - } - - private void buttonApply_Click(object sender, EventArgs e) - { - ApplySelection(); - } - - private ListViewItem MakeListViewItem(Paragraph p, int index) - { - var item = new ListViewItem(string.Empty) { Tag = index, Checked = true }; - item.SubItems.Add(p.Number.ToString()); - item.SubItems.Add(UiUtil.GetListViewTextFromString(p.Text)); - if (_format.HasStyleSupport) - { - item.SubItems.Add(string.IsNullOrEmpty(p.Style) ? p.Extra : p.Style); - } - - return item; - } - - private void Preview() - { - if (_loading) - { - return; - } - - Regex regEx = null; - var listViewItems = new List(); - listViewFixes.BeginUpdate(); - listViewFixes.Items.Clear(); - string text = textBoxText.Text; - if (comboBoxRule.SelectedIndex != FunctionRegEx) - { - text = text.Replace("\\r\\n", Environment.NewLine); - } - - var styles = new List(); - var actors = new List(); - if (comboBoxRule.SelectedIndex == FunctionStyle) // select styles - { - foreach (ListViewItem item in listViewStyles.Items) - { - if (item.Checked) - { - styles.Add(item.Text); - } - } - } - else if (comboBoxRule.SelectedIndex == FunctionActor) // select actors - { - foreach (ListViewItem item in listViewStyles.Items) - { - if (item.Checked) - { - actors.Add(item.Text); - } - } - } - - for (int i = 0; i < _subtitle.Paragraphs.Count; i++) - { - if ((radioButtonSubtractFromSelection.Checked || radioButtonIntersect.Checked) && _subtitleListView.Items[i].Selected || - !radioButtonSubtractFromSelection.Checked && !radioButtonIntersect.Checked) - { - var p = _subtitle.Paragraphs[i]; - if (text.Length > 0) - { - if (comboBoxRule.SelectedIndex == FunctionContains) // Contains - { - if (checkBoxCaseSensitive.Checked && p.Text.Contains(text, StringComparison.Ordinal) || !checkBoxCaseSensitive.Checked && p.Text.Contains(text, StringComparison.OrdinalIgnoreCase)) - { - listViewItems.Add(MakeListViewItem(p, i)); - } - } - else if (comboBoxRule.SelectedIndex == FunctionStartsWith) // Starts with - { - if (checkBoxCaseSensitive.Checked && p.Text.StartsWith(text, StringComparison.Ordinal) || !checkBoxCaseSensitive.Checked && p.Text.StartsWith(text, StringComparison.OrdinalIgnoreCase)) - { - listViewItems.Add(MakeListViewItem(p, i)); - } - } - else if (comboBoxRule.SelectedIndex == FunctionEndsWith) // Ends with - { - if (checkBoxCaseSensitive.Checked && p.Text.EndsWith(text, StringComparison.Ordinal) || !checkBoxCaseSensitive.Checked && p.Text.EndsWith(text, StringComparison.OrdinalIgnoreCase)) - { - listViewItems.Add(MakeListViewItem(p, i)); - } - } - else if (comboBoxRule.SelectedIndex == FunctionNotContains) // Not contains - { - if (checkBoxCaseSensitive.Checked && !p.Text.Contains(text, StringComparison.Ordinal) || !checkBoxCaseSensitive.Checked && !p.Text.Contains(text, StringComparison.OrdinalIgnoreCase)) - { - listViewItems.Add(MakeListViewItem(p, i)); - } - } - else if (comboBoxRule.SelectedIndex == FunctionRegEx) // RegEx - { - labelInfo.Text = string.Empty; - if (regEx == null) - { - try - { - regEx = new Regex(text, RegexOptions.Compiled); - } - catch (Exception e) - { - labelInfo.Text = e.Message; - break; - } - } - if (regEx.IsMatch(p.Text)) - { - listViewItems.Add(MakeListViewItem(p, i)); - } - } - } - if (comboBoxRule.SelectedIndex == FunctionUnequal) // select unequal lines - { - if (i % 2 == 0) - { - listViewItems.Add(MakeListViewItem(p, i)); - } - } - else if (comboBoxRule.SelectedIndex == FunctionEqual) // select equal lines - { - if (i % 2 == 1) - { - listViewItems.Add(MakeListViewItem(p, i)); - } - } - else if (comboBoxRule.SelectedIndex == FunctionDurationLessThan) // duration less than - { - if (p.Duration.TotalMilliseconds < (double)numericUpDownDuration.Value) - { - listViewItems.Add(MakeListViewItem(p, i)); - } - } - else if (comboBoxRule.SelectedIndex == FunctionDurationGreaterThan) // duration greater than - { - if (p.Duration.TotalMilliseconds > (double)numericUpDownDuration.Value) - { - listViewItems.Add(MakeListViewItem(p, i)); - } - } - else if (comboBoxRule.SelectedIndex == FunctionMoreThanTwoLines) - { - if (p.Text.SplitToLines().Count > 2) - { - listViewItems.Add(MakeListViewItem(p, i)); - } - } - else if (comboBoxRule.SelectedIndex == FunctionAlUppercase) // all uppercase - { - if (HtmlUtil.RemoveHtmlTags(p.Text, true) == HtmlUtil.RemoveHtmlTags(p.Text, true).ToUpperInvariant() && p.Text != p.Text.ToLowerInvariant()) - { - listViewItems.Add(MakeListViewItem(p, i)); - } - } - else if (comboBoxRule.SelectedIndex == FunctionStyle) // select styles - { - if (styles.Contains(string.IsNullOrEmpty(p.Style) ? p.Extra : p.Style)) - { - listViewItems.Add(MakeListViewItem(p, i)); - } - } - else if (comboBoxRule.SelectedIndex == FunctionActor) // select actors - { - if (actors.Contains(p.Actor)) - { - listViewItems.Add(MakeListViewItem(p, i)); - } - } - } - } - - listViewFixes.Items.AddRange(listViewItems.ToArray()); - listViewFixes.EndUpdate(); - groupBoxPreview.Text = string.Format(Configuration.Settings.Language.ModifySelection.MatchingLinesX, listViewFixes.Items.Count); - } - - private void ApplySelection() - { - _subtitleListView.BeginUpdate(); - if (radioButtonNewSelection.Checked || radioButtonIntersect.Checked) - { - _subtitleListView.SelectNone(); - } - - if (radioButtonNewSelection.Checked || radioButtonAddToSelection.Checked || radioButtonIntersect.Checked) - { - foreach (ListViewItem item in listViewFixes.Items) - { - if (item.Checked) - { - int index = Convert.ToInt32(item.Tag); - _subtitleListView.Items[index].Selected = true; - } - } - } - else if (radioButtonSubtractFromSelection.Checked) - { - foreach (ListViewItem item in listViewFixes.Items) - { - if (item.Checked) - { - int index = Convert.ToInt32(item.Tag); - _subtitleListView.Items[index].Selected = false; - } - } - } - _subtitleListView.EndUpdate(); - } - - private void textBox1_TextChanged(object sender, EventArgs e) - { - Preview(); - } - - private void comboBoxRule_SelectedIndexChanged(object sender, EventArgs e) - { - textBoxText.Visible = true; - listViewStyles.Visible = false; - numericUpDownDuration.Visible = comboBoxRule.SelectedIndex == FunctionDurationLessThan || comboBoxRule.SelectedIndex == FunctionDurationGreaterThan; - if (comboBoxRule.SelectedIndex == FunctionRegEx) // regex - { - textBoxText.ContextMenu = FindReplaceDialogHelper.GetRegExContextMenu(textBoxText); - checkBoxCaseSensitive.Enabled = false; - } - else if (comboBoxRule.SelectedIndex == FunctionUnequal || comboBoxRule.SelectedIndex == FunctionEqual || comboBoxRule.SelectedIndex == FunctionMoreThanTwoLines) - { - textBoxText.ContextMenuStrip = null; - checkBoxCaseSensitive.Enabled = false; - textBoxText.Visible = false; - } - else if (comboBoxRule.SelectedIndex == FunctionStyle) - { - checkBoxCaseSensitive.Enabled = false; - listViewStyles.Visible = true; - listViewStyles.BringToFront(); - FillStyles(); - } - else if (comboBoxRule.SelectedIndex == FunctionActor) - { - checkBoxCaseSensitive.Enabled = false; - listViewStyles.Visible = true; - listViewStyles.BringToFront(); - FillActors(); - } - else if (comboBoxRule.SelectedIndex == FunctionDurationLessThan || comboBoxRule.SelectedIndex == FunctionDurationGreaterThan || comboBoxRule.SelectedIndex == FunctionAlUppercase) - { - checkBoxCaseSensitive.Enabled = false; - listViewStyles.Visible = false; - textBoxText.Visible = false; - if (comboBoxRule.SelectedIndex == FunctionDurationLessThan) - { - if (numericUpDownDuration.Value == 0 && - Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds >= numericUpDownDuration.Minimum && - Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds <= numericUpDownDuration.Maximum) - { - numericUpDownDuration.Value = Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds; - } - } - else - { - if (numericUpDownDuration.Value == 0 && - Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds >= numericUpDownDuration.Minimum && - Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds <= numericUpDownDuration.Maximum) - { - numericUpDownDuration.Value = Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds; - } - } - } - else - { - textBoxText.ContextMenuStrip = null; - checkBoxCaseSensitive.Enabled = true; - } - - Preview(); - } - - private void FillStyles() - { - listViewStyles.Columns[listViewStyles.Columns.Count - 1].Width = -2; - var styles = new List(); - var formatType = _format.GetType(); - if (formatType == typeof(AdvancedSubStationAlpha) || formatType == typeof(SubStationAlpha)) - { - styles = AdvancedSubStationAlpha.GetStylesFromHeader(_subtitle.Header); - } - else if (formatType == typeof(TimedText10) || formatType == typeof(ItunesTimedText)) - { - styles = TimedText10.GetStylesFromHeader(_subtitle.Header); - } - else if (formatType == typeof(Sami) || formatType == typeof(SamiModern)) - { - styles = _subtitle.Header == null ? Sami.GetStylesFromSubtitle(_subtitle) : Sami.GetStylesFromHeader(_subtitle.Header); - } - - listViewStyles.Items.Clear(); - foreach (var style in styles.OrderBy(p => p)) - { - listViewStyles.Items.Add(style); - } - } - - private void FillActors() - { - listViewStyles.Columns[listViewStyles.Columns.Count - 1].Width = -2; - var actors = new List(); - foreach (var paragraph in _subtitle.Paragraphs) - { - if (!string.IsNullOrEmpty(paragraph.Actor) && !actors.Contains(paragraph.Actor)) - { - actors.Add(paragraph.Actor); - } - } - - listViewStyles.Items.Clear(); - foreach (var style in actors.OrderBy(p => p)) - { - listViewStyles.Items.Add(style); - } - } - - private void checkBoxCaseSensitive_CheckedChanged(object sender, EventArgs e) - { - Preview(); - } - - private void radioButton_CheckedChanged(object sender, EventArgs e) - { - Preview(); - } - - private void ModifySelection_Resize(object sender, EventArgs e) - { - listViewFixes.Columns[listViewFixes.Columns.Count - 1].Width = -2; - } - - private void listViewStyles_ItemChecked(object sender, ItemCheckedEventArgs e) - { - Preview(); - } - - private void numericUpDownDuration_ValueChanged(object sender, EventArgs e) - { - Preview(); - } - - private void toolStripMenuItemSelectAll_Click(object sender, EventArgs e) - { - foreach (ListViewItem item in listViewFixes.Items) - { - item.Checked = true; - } - } - - private void toolStripMenuItemInverseSelection_Click(object sender, EventArgs e) - { - foreach (ListViewItem item in listViewFixes.Items) - { - item.Checked = !item.Checked; - } - } - } -} +using Nikse.SubtitleEdit.Controls; +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.SubtitleFormats; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class ModifySelection : PositionAndSizeForm + { + private readonly SubtitleListView _subtitleListView; + private readonly Subtitle _subtitle; + private readonly SubtitleFormat _format; + private readonly bool _loading; + + private const int FunctionContains = 0; + private const int FunctionStartsWith = 1; + private const int FunctionEndsWith = 2; + private const int FunctionNotContains = 3; + private const int FunctionAlUppercase = 4; + private const int FunctionRegEx = 5; + private const int FunctionUnequal = 6; + private const int FunctionEqual = 7; + private const int FunctionDurationLessThan = 8; + private const int FunctionDurationGreaterThan = 9; + private const int FunctionMoreThanTwoLines = 10; + private const int FunctionStyle = 11; + private const int FunctionActor = 12; + + public ModifySelection(Subtitle subtitle, SubtitleFormat format, SubtitleListView subtitleListView) + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + _loading = true; + _subtitle = subtitle; + _format = format; + _subtitleListView = subtitleListView; + labelInfo.Text = string.Empty; + comboBoxRule.SelectedIndex = 0; + Text = Configuration.Settings.Language.ModifySelection.Title; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + buttonApply.Text = Configuration.Settings.Language.General.Apply; + groupBoxRule.Text = Configuration.Settings.Language.ModifySelection.Rule; + groupBoxWhatToDo.Text = Configuration.Settings.Language.ModifySelection.DoWithMatches; + checkBoxCaseSensitive.Text = Configuration.Settings.Language.ModifySelection.CaseSensitive; + radioButtonNewSelection.Text = Configuration.Settings.Language.ModifySelection.MakeNewSelection; + radioButtonAddToSelection.Text = Configuration.Settings.Language.ModifySelection.AddToCurrentSelection; + radioButtonSubtractFromSelection.Text = Configuration.Settings.Language.ModifySelection.SubtractFromCurrentSelection; + radioButtonIntersect.Text = Configuration.Settings.Language.ModifySelection.IntersectWithCurrentSelection; + columnHeaderApply.Text = Configuration.Settings.Language.General.Apply; + columnHeaderLine.Text = Configuration.Settings.Language.General.LineNumber; + columnHeaderText.Text = Configuration.Settings.Language.General.Text; + toolStripMenuItemInverseSelection.Text = Configuration.Settings.Language.Main.Menu.Edit.InverseSelection; + toolStripMenuItemSelectAll.Text = Configuration.Settings.Language.Main.Menu.ContextMenu.SelectAll; + + listViewStyles.Visible = false; + + UiUtil.FixLargeFonts(this, buttonOK); + + comboBoxRule.Items.Clear(); + comboBoxRule.Items.Add(Configuration.Settings.Language.ModifySelection.Contains); + comboBoxRule.Items.Add(Configuration.Settings.Language.ModifySelection.StartsWith); + comboBoxRule.Items.Add(Configuration.Settings.Language.ModifySelection.EndsWith); + comboBoxRule.Items.Add(Configuration.Settings.Language.ModifySelection.NoContains); + comboBoxRule.Items.Add(Configuration.Settings.Language.ChangeCasing.AllUppercase); + comboBoxRule.Items.Add(Configuration.Settings.Language.ModifySelection.RegEx); + comboBoxRule.Items.Add(Configuration.Settings.Language.ModifySelection.UnequalLines); + comboBoxRule.Items.Add(Configuration.Settings.Language.ModifySelection.EqualLines); + comboBoxRule.Items.Add(Configuration.Settings.Language.ModifySelection.DurationLessThan); + comboBoxRule.Items.Add(Configuration.Settings.Language.ModifySelection.DurationGreaterThan); + comboBoxRule.Items.Add(Configuration.Settings.Language.ModifySelection.MoreThanTwoLines); + if (_format.HasStyleSupport) + { + comboBoxRule.Items.Add(Configuration.Settings.Language.General.Style); + } + if (_format.HasStyleSupport && (_format.GetType() == typeof(AdvancedSubStationAlpha) || _format.GetType() == typeof(SubStationAlpha))) + { + comboBoxRule.Items.Add(Configuration.Settings.Language.General.Actor); + } + + checkBoxCaseSensitive.Checked = Configuration.Settings.Tools.ModifySelectionCaseSensitive; + textBoxText.Text = Configuration.Settings.Tools.ModifySelectionText; + if (Configuration.Settings.Tools.ModifySelectionRule == "Starts with") + { + comboBoxRule.SelectedIndex = FunctionStartsWith; + } + else if (Configuration.Settings.Tools.ModifySelectionRule == "Ends with") + { + comboBoxRule.SelectedIndex = FunctionEndsWith; + } + else if (Configuration.Settings.Tools.ModifySelectionRule == "Not contains") + { + comboBoxRule.SelectedIndex = FunctionNotContains; + } + else if (Configuration.Settings.Tools.ModifySelectionRule == "AllUppercase") + { + comboBoxRule.SelectedIndex = FunctionAlUppercase; + } + else if (Configuration.Settings.Tools.ModifySelectionRule == "RegEx") + { + comboBoxRule.SelectedIndex = FunctionRegEx; + } + else if (Configuration.Settings.Tools.ModifySelectionRule == "Duration <") + { + comboBoxRule.SelectedIndex = FunctionDurationLessThan; + } + else if (Configuration.Settings.Tools.ModifySelectionRule == "Duration >") + { + comboBoxRule.SelectedIndex = FunctionDurationGreaterThan; + } + else if (Configuration.Settings.Tools.ModifySelectionRule == "More than two lines") + { + comboBoxRule.SelectedIndex = FunctionMoreThanTwoLines; + } + else if (Configuration.Settings.Tools.ModifySelectionRule == "Style" && _format.HasStyleSupport) + { + comboBoxRule.SelectedIndex = FunctionStyle; + } + else if (Configuration.Settings.Tools.ModifySelectionRule == "Actor" && (_format.GetType() == typeof(AdvancedSubStationAlpha) || _format.GetType() == typeof(SubStationAlpha))) + { + comboBoxRule.SelectedIndex = FunctionActor; + } + else + { + comboBoxRule.SelectedIndex = 0; + } + + if (!_format.HasStyleSupport) + { + listViewFixes.Columns.Remove(columnHeaderStyle); + } + ModifySelection_Resize(null, null); + + _loading = false; + Preview(); + } + + private void ModifySelection_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void buttonOK_Click(object sender, EventArgs e) + { + ApplySelection(); + DialogResult = DialogResult.OK; + + Configuration.Settings.Tools.ModifySelectionCaseSensitive = checkBoxCaseSensitive.Checked; + Configuration.Settings.Tools.ModifySelectionText = textBoxText.Text; + if (comboBoxRule.SelectedIndex == FunctionContains) + { + Configuration.Settings.Tools.ModifySelectionRule = "Contains"; + } + else if (comboBoxRule.SelectedIndex == FunctionStartsWith) + { + Configuration.Settings.Tools.ModifySelectionRule = "Starts with"; + } + else if (comboBoxRule.SelectedIndex == FunctionEndsWith) + { + Configuration.Settings.Tools.ModifySelectionRule = "Ends with"; + } + else if (comboBoxRule.SelectedIndex == FunctionNotContains) + { + Configuration.Settings.Tools.ModifySelectionRule = "Not contains"; + } + else if (comboBoxRule.SelectedIndex == FunctionAlUppercase) + { + Configuration.Settings.Tools.ModifySelectionRule = "AllUppercase"; + } + else if (comboBoxRule.SelectedIndex == FunctionRegEx) + { + Configuration.Settings.Tools.ModifySelectionRule = "RegEx"; + } + else if (comboBoxRule.SelectedIndex == FunctionDurationLessThan) + { + Configuration.Settings.Tools.ModifySelectionRule = "Duration <"; + } + else if (comboBoxRule.SelectedIndex == FunctionDurationGreaterThan) + { + Configuration.Settings.Tools.ModifySelectionRule = "Duration >"; + } + else if (comboBoxRule.SelectedIndex == FunctionMoreThanTwoLines) + { + Configuration.Settings.Tools.ModifySelectionRule = "More than two lines"; + } + else if (comboBoxRule.SelectedIndex == FunctionStyle) + { + Configuration.Settings.Tools.ModifySelectionRule = "Style"; + } + else if (comboBoxRule.SelectedIndex == FunctionActor) + { + Configuration.Settings.Tools.ModifySelectionRule = "Actor"; + } + } + + private void buttonApply_Click(object sender, EventArgs e) + { + ApplySelection(); + } + + private ListViewItem MakeListViewItem(Paragraph p, int index) + { + var item = new ListViewItem(string.Empty) { Tag = index, Checked = true }; + item.SubItems.Add(p.Number.ToString()); + item.SubItems.Add(UiUtil.GetListViewTextFromString(p.Text)); + if (_format.HasStyleSupport) + { + item.SubItems.Add(string.IsNullOrEmpty(p.Style) ? p.Extra : p.Style); + } + + return item; + } + + private void Preview() + { + if (_loading) + { + return; + } + + Regex regEx = null; + var listViewItems = new List(); + listViewFixes.BeginUpdate(); + listViewFixes.Items.Clear(); + string text = textBoxText.Text; + if (comboBoxRule.SelectedIndex != FunctionRegEx) + { + text = text.Replace("\\r\\n", Environment.NewLine); + } + + var styles = new List(); + var actors = new List(); + if (comboBoxRule.SelectedIndex == FunctionStyle) // select styles + { + foreach (ListViewItem item in listViewStyles.Items) + { + if (item.Checked) + { + styles.Add(item.Text); + } + } + } + else if (comboBoxRule.SelectedIndex == FunctionActor) // select actors + { + foreach (ListViewItem item in listViewStyles.Items) + { + if (item.Checked) + { + actors.Add(item.Text); + } + } + } + + for (int i = 0; i < _subtitle.Paragraphs.Count; i++) + { + if ((radioButtonSubtractFromSelection.Checked || radioButtonIntersect.Checked) && _subtitleListView.Items[i].Selected || + !radioButtonSubtractFromSelection.Checked && !radioButtonIntersect.Checked) + { + var p = _subtitle.Paragraphs[i]; + if (text.Length > 0) + { + if (comboBoxRule.SelectedIndex == FunctionContains) // Contains + { + if (checkBoxCaseSensitive.Checked && p.Text.Contains(text, StringComparison.Ordinal) || !checkBoxCaseSensitive.Checked && p.Text.Contains(text, StringComparison.OrdinalIgnoreCase)) + { + listViewItems.Add(MakeListViewItem(p, i)); + } + } + else if (comboBoxRule.SelectedIndex == FunctionStartsWith) // Starts with + { + if (checkBoxCaseSensitive.Checked && p.Text.StartsWith(text, StringComparison.Ordinal) || !checkBoxCaseSensitive.Checked && p.Text.StartsWith(text, StringComparison.OrdinalIgnoreCase)) + { + listViewItems.Add(MakeListViewItem(p, i)); + } + } + else if (comboBoxRule.SelectedIndex == FunctionEndsWith) // Ends with + { + if (checkBoxCaseSensitive.Checked && p.Text.EndsWith(text, StringComparison.Ordinal) || !checkBoxCaseSensitive.Checked && p.Text.EndsWith(text, StringComparison.OrdinalIgnoreCase)) + { + listViewItems.Add(MakeListViewItem(p, i)); + } + } + else if (comboBoxRule.SelectedIndex == FunctionNotContains) // Not contains + { + if (checkBoxCaseSensitive.Checked && !p.Text.Contains(text, StringComparison.Ordinal) || !checkBoxCaseSensitive.Checked && !p.Text.Contains(text, StringComparison.OrdinalIgnoreCase)) + { + listViewItems.Add(MakeListViewItem(p, i)); + } + } + else if (comboBoxRule.SelectedIndex == FunctionRegEx) // RegEx + { + labelInfo.Text = string.Empty; + if (regEx == null) + { + try + { + regEx = new Regex(text, RegexOptions.Compiled); + } + catch (Exception e) + { + labelInfo.Text = e.Message; + break; + } + } + if (regEx.IsMatch(p.Text)) + { + listViewItems.Add(MakeListViewItem(p, i)); + } + } + } + if (comboBoxRule.SelectedIndex == FunctionUnequal) // select unequal lines + { + if (i % 2 == 0) + { + listViewItems.Add(MakeListViewItem(p, i)); + } + } + else if (comboBoxRule.SelectedIndex == FunctionEqual) // select equal lines + { + if (i % 2 == 1) + { + listViewItems.Add(MakeListViewItem(p, i)); + } + } + else if (comboBoxRule.SelectedIndex == FunctionDurationLessThan) // duration less than + { + if (p.Duration.TotalMilliseconds < (double)numericUpDownDuration.Value) + { + listViewItems.Add(MakeListViewItem(p, i)); + } + } + else if (comboBoxRule.SelectedIndex == FunctionDurationGreaterThan) // duration greater than + { + if (p.Duration.TotalMilliseconds > (double)numericUpDownDuration.Value) + { + listViewItems.Add(MakeListViewItem(p, i)); + } + } + else if (comboBoxRule.SelectedIndex == FunctionMoreThanTwoLines) + { + if (p.Text.SplitToLines().Count > 2) + { + listViewItems.Add(MakeListViewItem(p, i)); + } + } + else if (comboBoxRule.SelectedIndex == FunctionAlUppercase) // all uppercase + { + if (HtmlUtil.RemoveHtmlTags(p.Text, true) == HtmlUtil.RemoveHtmlTags(p.Text, true).ToUpperInvariant() && p.Text != p.Text.ToLowerInvariant()) + { + listViewItems.Add(MakeListViewItem(p, i)); + } + } + else if (comboBoxRule.SelectedIndex == FunctionStyle) // select styles + { + if (styles.Contains(string.IsNullOrEmpty(p.Style) ? p.Extra : p.Style)) + { + listViewItems.Add(MakeListViewItem(p, i)); + } + } + else if (comboBoxRule.SelectedIndex == FunctionActor) // select actors + { + if (actors.Contains(p.Actor)) + { + listViewItems.Add(MakeListViewItem(p, i)); + } + } + } + } + + listViewFixes.Items.AddRange(listViewItems.ToArray()); + listViewFixes.EndUpdate(); + groupBoxPreview.Text = string.Format(Configuration.Settings.Language.ModifySelection.MatchingLinesX, listViewFixes.Items.Count); + } + + private void ApplySelection() + { + _subtitleListView.BeginUpdate(); + if (radioButtonNewSelection.Checked || radioButtonIntersect.Checked) + { + _subtitleListView.SelectNone(); + } + + if (radioButtonNewSelection.Checked || radioButtonAddToSelection.Checked || radioButtonIntersect.Checked) + { + foreach (ListViewItem item in listViewFixes.Items) + { + if (item.Checked) + { + int index = Convert.ToInt32(item.Tag); + _subtitleListView.Items[index].Selected = true; + } + } + } + else if (radioButtonSubtractFromSelection.Checked) + { + foreach (ListViewItem item in listViewFixes.Items) + { + if (item.Checked) + { + int index = Convert.ToInt32(item.Tag); + _subtitleListView.Items[index].Selected = false; + } + } + } + _subtitleListView.EndUpdate(); + } + + private void textBox1_TextChanged(object sender, EventArgs e) + { + Preview(); + } + + private void comboBoxRule_SelectedIndexChanged(object sender, EventArgs e) + { + textBoxText.Visible = true; + listViewStyles.Visible = false; + numericUpDownDuration.Visible = comboBoxRule.SelectedIndex == FunctionDurationLessThan || comboBoxRule.SelectedIndex == FunctionDurationGreaterThan; + if (comboBoxRule.SelectedIndex == FunctionRegEx) // regex + { + textBoxText.ContextMenu = FindReplaceDialogHelper.GetRegExContextMenu(textBoxText); + checkBoxCaseSensitive.Enabled = false; + } + else if (comboBoxRule.SelectedIndex == FunctionUnequal || comboBoxRule.SelectedIndex == FunctionEqual || comboBoxRule.SelectedIndex == FunctionMoreThanTwoLines) + { + textBoxText.ContextMenuStrip = null; + checkBoxCaseSensitive.Enabled = false; + textBoxText.Visible = false; + } + else if (comboBoxRule.SelectedIndex == FunctionStyle) + { + checkBoxCaseSensitive.Enabled = false; + listViewStyles.Visible = true; + listViewStyles.BringToFront(); + FillStyles(); + } + else if (comboBoxRule.SelectedIndex == FunctionActor) + { + checkBoxCaseSensitive.Enabled = false; + listViewStyles.Visible = true; + listViewStyles.BringToFront(); + FillActors(); + } + else if (comboBoxRule.SelectedIndex == FunctionDurationLessThan || comboBoxRule.SelectedIndex == FunctionDurationGreaterThan || comboBoxRule.SelectedIndex == FunctionAlUppercase) + { + checkBoxCaseSensitive.Enabled = false; + listViewStyles.Visible = false; + textBoxText.Visible = false; + if (comboBoxRule.SelectedIndex == FunctionDurationLessThan) + { + if (numericUpDownDuration.Value == 0 && + Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds >= numericUpDownDuration.Minimum && + Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds <= numericUpDownDuration.Maximum) + { + numericUpDownDuration.Value = Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds; + } + } + else + { + if (numericUpDownDuration.Value == 0 && + Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds >= numericUpDownDuration.Minimum && + Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds <= numericUpDownDuration.Maximum) + { + numericUpDownDuration.Value = Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds; + } + } + } + else + { + textBoxText.ContextMenuStrip = null; + checkBoxCaseSensitive.Enabled = true; + } + + Preview(); + } + + private void FillStyles() + { + listViewStyles.Columns[listViewStyles.Columns.Count - 1].Width = -2; + var styles = new List(); + var formatType = _format.GetType(); + if (formatType == typeof(AdvancedSubStationAlpha) || formatType == typeof(SubStationAlpha)) + { + styles = AdvancedSubStationAlpha.GetStylesFromHeader(_subtitle.Header); + } + else if (formatType == typeof(TimedText10) || formatType == typeof(ItunesTimedText)) + { + styles = TimedText10.GetStylesFromHeader(_subtitle.Header); + } + else if (formatType == typeof(Sami) || formatType == typeof(SamiModern)) + { + styles = _subtitle.Header == null ? Sami.GetStylesFromSubtitle(_subtitle) : Sami.GetStylesFromHeader(_subtitle.Header); + } + + listViewStyles.Items.Clear(); + foreach (var style in styles.OrderBy(p => p)) + { + listViewStyles.Items.Add(style); + } + } + + private void FillActors() + { + listViewStyles.Columns[listViewStyles.Columns.Count - 1].Width = -2; + var actors = new List(); + foreach (var paragraph in _subtitle.Paragraphs) + { + if (!string.IsNullOrEmpty(paragraph.Actor) && !actors.Contains(paragraph.Actor)) + { + actors.Add(paragraph.Actor); + } + } + + listViewStyles.Items.Clear(); + foreach (var style in actors.OrderBy(p => p)) + { + listViewStyles.Items.Add(style); + } + } + + private void checkBoxCaseSensitive_CheckedChanged(object sender, EventArgs e) + { + Preview(); + } + + private void radioButton_CheckedChanged(object sender, EventArgs e) + { + Preview(); + } + + private void ModifySelection_Resize(object sender, EventArgs e) + { + listViewFixes.Columns[listViewFixes.Columns.Count - 1].Width = -2; + } + + private void listViewStyles_ItemChecked(object sender, ItemCheckedEventArgs e) + { + Preview(); + } + + private void numericUpDownDuration_ValueChanged(object sender, EventArgs e) + { + Preview(); + } + + private void toolStripMenuItemSelectAll_Click(object sender, EventArgs e) + { + foreach (ListViewItem item in listViewFixes.Items) + { + item.Checked = true; + } + } + + private void toolStripMenuItemInverseSelection_Click(object sender, EventArgs e) + { + foreach (ListViewItem item in listViewFixes.Items) + { + item.Checked = !item.Checked; + } + } + } +} diff --git a/src/Forms/ModifySelection.resx b/src/ui/Forms/ModifySelection.resx similarity index 97% rename from src/Forms/ModifySelection.resx rename to src/ui/Forms/ModifySelection.resx index 661dc1126..ad537526f 100644 --- a/src/Forms/ModifySelection.resx +++ b/src/ui/Forms/ModifySelection.resx @@ -1,123 +1,123 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + \ No newline at end of file diff --git a/src/Forms/MultipleReplace.Designer.cs b/src/ui/Forms/MultipleReplace.Designer.cs similarity index 98% rename from src/Forms/MultipleReplace.Designer.cs rename to src/ui/Forms/MultipleReplace.Designer.cs index a754f6afa..21cc4b29b 100644 --- a/src/Forms/MultipleReplace.Designer.cs +++ b/src/ui/Forms/MultipleReplace.Designer.cs @@ -1,810 +1,810 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class MultipleReplace - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.groupBoxLinesFound = new System.Windows.Forms.GroupBox(); - this.buttonReplacesInverseSelection = new System.Windows.Forms.Button(); - this.buttonReplacesSelectAll = new System.Windows.Forms.Button(); - this.listViewFixes = new System.Windows.Forms.ListView(); - this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader7 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader8 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.groupBoxReplaces = new System.Windows.Forms.GroupBox(); - this.labelDescription = new System.Windows.Forms.Label(); - this.textBoxDescription = new System.Windows.Forms.TextBox(); - this.radioButtonRegEx = new System.Windows.Forms.RadioButton(); - this.radioButtonCaseSensitive = new System.Windows.Forms.RadioButton(); - this.textBoxFind = new System.Windows.Forms.TextBox(); - this.textBoxReplace = new System.Windows.Forms.TextBox(); - this.buttonUpdate = new System.Windows.Forms.Button(); - this.buttonAdd = new System.Windows.Forms.Button(); - this.labelFindWhat = new System.Windows.Forms.Label(); - this.labelReplaceWith = new System.Windows.Forms.Label(); - this.listViewRules = new System.Windows.Forms.ListView(); - this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader6 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader9 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.contextMenuStripRules = new System.Windows.Forms.ContextMenuStrip(this.components); - this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemRemoveAll = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripMenuItemMoveRulesToGroup = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); - this.moveUpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.moveDownToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.moveTopToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.moveBottomToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripMenuItemImport = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemExport = new System.Windows.Forms.ToolStripMenuItem(); - this.radioButtonNormal = new System.Windows.Forms.RadioButton(); - this.buttonOK = new System.Windows.Forms.Button(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.splitContainer1 = new System.Windows.Forms.SplitContainer(); - this.groupBoxGroups = new System.Windows.Forms.GroupBox(); - this.buttonExportGroups = new System.Windows.Forms.Button(); - this.buttonImportGroups = new System.Windows.Forms.Button(); - this.buttonNewGroup = new System.Windows.Forms.Button(); - this.listViewGroups = new System.Windows.Forms.ListView(); - this.columnHeaderForName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.contextMenuStripGroups = new System.Windows.Forms.ContextMenuStrip(this.components); - this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemRename = new System.Windows.Forms.ToolStripMenuItem(); - this.deleteToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); - this.moveUpToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.moveDownToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.moveToTopToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.moveToBottomToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparatorGroupImportExport = new System.Windows.Forms.ToolStripSeparator(); - this.importToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.exportToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.buttonApply = new System.Windows.Forms.Button(); - this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); - this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog(); - this.groupBoxLinesFound.SuspendLayout(); - this.groupBoxReplaces.SuspendLayout(); - this.contextMenuStripRules.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); - this.splitContainer1.Panel1.SuspendLayout(); - this.splitContainer1.Panel2.SuspendLayout(); - this.splitContainer1.SuspendLayout(); - this.groupBoxGroups.SuspendLayout(); - this.contextMenuStripGroups.SuspendLayout(); - this.SuspendLayout(); - // - // groupBoxLinesFound - // - this.groupBoxLinesFound.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxLinesFound.Controls.Add(this.buttonReplacesInverseSelection); - this.groupBoxLinesFound.Controls.Add(this.buttonReplacesSelectAll); - this.groupBoxLinesFound.Controls.Add(this.listViewFixes); - this.groupBoxLinesFound.Location = new System.Drawing.Point(4, 14); - this.groupBoxLinesFound.Name = "groupBoxLinesFound"; - this.groupBoxLinesFound.Size = new System.Drawing.Size(1046, 232); - this.groupBoxLinesFound.TabIndex = 8; - this.groupBoxLinesFound.TabStop = false; - this.groupBoxLinesFound.Text = "Lines found: {0}"; - // - // buttonReplacesInverseSelection - // - this.buttonReplacesInverseSelection.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonReplacesInverseSelection.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonReplacesInverseSelection.Location = new System.Drawing.Point(91, 204); - this.buttonReplacesInverseSelection.Name = "buttonReplacesInverseSelection"; - this.buttonReplacesInverseSelection.Size = new System.Drawing.Size(100, 23); - this.buttonReplacesInverseSelection.TabIndex = 12; - this.buttonReplacesInverseSelection.Text = "&Inverse selection"; - this.buttonReplacesInverseSelection.UseVisualStyleBackColor = true; - this.buttonReplacesInverseSelection.Click += new System.EventHandler(this.buttonReplacesInverseSelection_Click); - // - // buttonReplacesSelectAll - // - this.buttonReplacesSelectAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonReplacesSelectAll.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonReplacesSelectAll.Location = new System.Drawing.Point(10, 204); - this.buttonReplacesSelectAll.Name = "buttonReplacesSelectAll"; - this.buttonReplacesSelectAll.Size = new System.Drawing.Size(75, 23); - this.buttonReplacesSelectAll.TabIndex = 11; - this.buttonReplacesSelectAll.Text = "Select &all"; - this.buttonReplacesSelectAll.UseVisualStyleBackColor = true; - this.buttonReplacesSelectAll.Click += new System.EventHandler(this.buttonReplacesSelectAll_Click); - // - // listViewFixes - // - this.listViewFixes.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.listViewFixes.CheckBoxes = true; - this.listViewFixes.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeader4, - this.columnHeader5, - this.columnHeader7, - this.columnHeader8}); - this.listViewFixes.FullRowSelect = true; - this.listViewFixes.HideSelection = false; - this.listViewFixes.Location = new System.Drawing.Point(10, 21); - this.listViewFixes.Name = "listViewFixes"; - this.listViewFixes.Size = new System.Drawing.Size(1030, 177); - this.listViewFixes.TabIndex = 10; - this.listViewFixes.UseCompatibleStateImageBehavior = false; - this.listViewFixes.View = System.Windows.Forms.View.Details; - this.listViewFixes.KeyDown += new System.Windows.Forms.KeyEventHandler(this.listViewFixes_KeyDown); - // - // columnHeader4 - // - this.columnHeader4.Text = "Apply"; - this.columnHeader4.Width = 48; - // - // columnHeader5 - // - this.columnHeader5.Text = "Line#"; - this.columnHeader5.Width = 61; - // - // columnHeader7 - // - this.columnHeader7.Text = "Before"; - this.columnHeader7.Width = 330; - // - // columnHeader8 - // - this.columnHeader8.Text = "After"; - this.columnHeader8.Width = 440; - // - // groupBoxReplaces - // - this.groupBoxReplaces.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxReplaces.Controls.Add(this.labelDescription); - this.groupBoxReplaces.Controls.Add(this.textBoxDescription); - this.groupBoxReplaces.Controls.Add(this.radioButtonRegEx); - this.groupBoxReplaces.Controls.Add(this.radioButtonCaseSensitive); - this.groupBoxReplaces.Controls.Add(this.textBoxFind); - this.groupBoxReplaces.Controls.Add(this.textBoxReplace); - this.groupBoxReplaces.Controls.Add(this.buttonUpdate); - this.groupBoxReplaces.Controls.Add(this.buttonAdd); - this.groupBoxReplaces.Controls.Add(this.labelFindWhat); - this.groupBoxReplaces.Controls.Add(this.labelReplaceWith); - this.groupBoxReplaces.Controls.Add(this.listViewRules); - this.groupBoxReplaces.Controls.Add(this.radioButtonNormal); - this.groupBoxReplaces.Location = new System.Drawing.Point(235, 3); - this.groupBoxReplaces.Name = "groupBoxReplaces"; - this.groupBoxReplaces.Size = new System.Drawing.Size(809, 257); - this.groupBoxReplaces.TabIndex = 1; - this.groupBoxReplaces.TabStop = false; - this.groupBoxReplaces.Text = "Rules for group \"X\""; - // - // labelDescription - // - this.labelDescription.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelDescription.AutoSize = true; - this.labelDescription.Location = new System.Drawing.Point(400, 184); - this.labelDescription.Name = "labelDescription"; - this.labelDescription.Size = new System.Drawing.Size(64, 13); - this.labelDescription.TabIndex = 11; - this.labelDescription.Text = "Description:"; - // - // textBoxDescription - // - this.textBoxDescription.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.textBoxDescription.Location = new System.Drawing.Point(403, 202); - this.textBoxDescription.Name = "textBoxDescription"; - this.textBoxDescription.Size = new System.Drawing.Size(190, 21); - this.textBoxDescription.TabIndex = 5; - // - // radioButtonRegEx - // - this.radioButtonRegEx.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.radioButtonRegEx.AutoSize = true; - this.radioButtonRegEx.Location = new System.Drawing.Point(177, 230); - this.radioButtonRegEx.Name = "radioButtonRegEx"; - this.radioButtonRegEx.Size = new System.Drawing.Size(56, 17); - this.radioButtonRegEx.TabIndex = 12; - this.radioButtonRegEx.Text = "RegEx"; - this.radioButtonRegEx.UseVisualStyleBackColor = true; - this.radioButtonRegEx.CheckedChanged += new System.EventHandler(this.RadioButtonCheckedChanged); - // - // radioButtonCaseSensitive - // - this.radioButtonCaseSensitive.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.radioButtonCaseSensitive.AutoSize = true; - this.radioButtonCaseSensitive.Location = new System.Drawing.Point(75, 230); - this.radioButtonCaseSensitive.Name = "radioButtonCaseSensitive"; - this.radioButtonCaseSensitive.Size = new System.Drawing.Size(94, 17); - this.radioButtonCaseSensitive.TabIndex = 11; - this.radioButtonCaseSensitive.Text = "Case sensitive"; - this.radioButtonCaseSensitive.UseVisualStyleBackColor = true; - this.radioButtonCaseSensitive.CheckedChanged += new System.EventHandler(this.RadioButtonCheckedChanged); - // - // textBoxFind - // - this.textBoxFind.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.textBoxFind.Location = new System.Drawing.Point(9, 203); - this.textBoxFind.Name = "textBoxFind"; - this.textBoxFind.Size = new System.Drawing.Size(211, 21); - this.textBoxFind.TabIndex = 2; - // - // textBoxReplace - // - this.textBoxReplace.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.textBoxReplace.Location = new System.Drawing.Point(226, 203); - this.textBoxReplace.Name = "textBoxReplace"; - this.textBoxReplace.Size = new System.Drawing.Size(171, 21); - this.textBoxReplace.TabIndex = 4; - this.textBoxReplace.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxReplaceKeyDown); - // - // buttonUpdate - // - this.buttonUpdate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonUpdate.Location = new System.Drawing.Point(704, 201); - this.buttonUpdate.Name = "buttonUpdate"; - this.buttonUpdate.Size = new System.Drawing.Size(99, 23); - this.buttonUpdate.TabIndex = 7; - this.buttonUpdate.Text = "&Update"; - this.buttonUpdate.UseVisualStyleBackColor = true; - this.buttonUpdate.Click += new System.EventHandler(this.ButtonUpdateClick); - // - // buttonAdd - // - this.buttonAdd.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonAdd.Location = new System.Drawing.Point(599, 201); - this.buttonAdd.Name = "buttonAdd"; - this.buttonAdd.Size = new System.Drawing.Size(99, 23); - this.buttonAdd.TabIndex = 6; - this.buttonAdd.Text = "&Add"; - this.buttonAdd.UseVisualStyleBackColor = true; - this.buttonAdd.Click += new System.EventHandler(this.ButtonAddClick); - // - // labelFindWhat - // - this.labelFindWhat.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelFindWhat.AutoSize = true; - this.labelFindWhat.Location = new System.Drawing.Point(6, 184); - this.labelFindWhat.Name = "labelFindWhat"; - this.labelFindWhat.Size = new System.Drawing.Size(58, 13); - this.labelFindWhat.TabIndex = 1; - this.labelFindWhat.Text = "Find what:"; - // - // labelReplaceWith - // - this.labelReplaceWith.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelReplaceWith.AutoSize = true; - this.labelReplaceWith.Location = new System.Drawing.Point(223, 184); - this.labelReplaceWith.Name = "labelReplaceWith"; - this.labelReplaceWith.Size = new System.Drawing.Size(72, 13); - this.labelReplaceWith.TabIndex = 3; - this.labelReplaceWith.Text = "Replace with:"; - // - // listViewRules - // - this.listViewRules.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.listViewRules.CheckBoxes = true; - this.listViewRules.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeader1, - this.columnHeader2, - this.columnHeader3, - this.columnHeader6, - this.columnHeader9}); - this.listViewRules.ContextMenuStrip = this.contextMenuStripRules; - this.listViewRules.FullRowSelect = true; - this.listViewRules.HideSelection = false; - this.listViewRules.Location = new System.Drawing.Point(9, 20); - this.listViewRules.Name = "listViewRules"; - this.listViewRules.Size = new System.Drawing.Size(797, 149); - this.listViewRules.TabIndex = 0; - this.listViewRules.UseCompatibleStateImageBehavior = false; - this.listViewRules.View = System.Windows.Forms.View.Details; - this.listViewRules.SelectedIndexChanged += new System.EventHandler(this.ListViewReplaceListSelectedIndexChanged); - this.listViewRules.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ListViewRulesKeyDown); - // - // columnHeader1 - // - this.columnHeader1.Text = "Enabled"; - this.columnHeader1.Width = 70; - // - // columnHeader2 - // - this.columnHeader2.Text = "Find what"; - this.columnHeader2.Width = 200; - // - // columnHeader3 - // - this.columnHeader3.Text = "Replace with"; - this.columnHeader3.Width = 170; - // - // columnHeader6 - // - this.columnHeader6.Text = "Search type"; - this.columnHeader6.Width = 170; - // - // columnHeader9 - // - this.columnHeader9.Text = "Description"; - this.columnHeader9.Width = 166; - // - // contextMenuStripRules - // - this.contextMenuStripRules.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.deleteToolStripMenuItem, - this.toolStripMenuItemRemoveAll, - this.toolStripSeparator2, - this.toolStripMenuItemMoveRulesToGroup, - this.toolStripSeparator4, - this.moveUpToolStripMenuItem, - this.moveDownToolStripMenuItem, - this.moveTopToolStripMenuItem, - this.moveBottomToolStripMenuItem, - this.toolStripSeparator3, - this.toolStripMenuItemImport, - this.toolStripMenuItemExport}); - this.contextMenuStripRules.Name = "contextMenuStrip1"; - this.contextMenuStripRules.Size = new System.Drawing.Size(228, 220); - this.contextMenuStripRules.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStrip1_Opening); - // - // deleteToolStripMenuItem - // - this.deleteToolStripMenuItem.Name = "deleteToolStripMenuItem"; - this.deleteToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.Delete; - this.deleteToolStripMenuItem.Size = new System.Drawing.Size(227, 22); - this.deleteToolStripMenuItem.Text = "Remove"; - this.deleteToolStripMenuItem.Click += new System.EventHandler(this.DeleteToolStripMenuItemClick); - // - // toolStripMenuItemRemoveAll - // - this.toolStripMenuItemRemoveAll.Name = "toolStripMenuItemRemoveAll"; - this.toolStripMenuItemRemoveAll.Size = new System.Drawing.Size(227, 22); - this.toolStripMenuItemRemoveAll.Text = "Remove all"; - this.toolStripMenuItemRemoveAll.Click += new System.EventHandler(this.toolStripMenuItem2_Click); - // - // toolStripSeparator2 - // - this.toolStripSeparator2.Name = "toolStripSeparator2"; - this.toolStripSeparator2.Size = new System.Drawing.Size(224, 6); - // - // toolStripMenuItemMoveRulesToGroup - // - this.toolStripMenuItemMoveRulesToGroup.Name = "toolStripMenuItemMoveRulesToGroup"; - this.toolStripMenuItemMoveRulesToGroup.Size = new System.Drawing.Size(227, 22); - this.toolStripMenuItemMoveRulesToGroup.Text = "Move selected rules to group"; - // - // toolStripSeparator4 - // - this.toolStripSeparator4.Name = "toolStripSeparator4"; - this.toolStripSeparator4.Size = new System.Drawing.Size(224, 6); - // - // moveUpToolStripMenuItem - // - this.moveUpToolStripMenuItem.Name = "moveUpToolStripMenuItem"; - this.moveUpToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Up))); - this.moveUpToolStripMenuItem.Size = new System.Drawing.Size(227, 22); - this.moveUpToolStripMenuItem.Text = "Move up"; - this.moveUpToolStripMenuItem.Click += new System.EventHandler(this.moveUpToolStripMenuItem_Click); - // - // moveDownToolStripMenuItem - // - this.moveDownToolStripMenuItem.Name = "moveDownToolStripMenuItem"; - this.moveDownToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Down))); - this.moveDownToolStripMenuItem.Size = new System.Drawing.Size(227, 22); - this.moveDownToolStripMenuItem.Text = "Move down"; - this.moveDownToolStripMenuItem.Click += new System.EventHandler(this.moveDownToolStripMenuItem_Click); - // - // moveTopToolStripMenuItem - // - this.moveTopToolStripMenuItem.Name = "moveTopToolStripMenuItem"; - this.moveTopToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Home))); - this.moveTopToolStripMenuItem.Size = new System.Drawing.Size(227, 22); - this.moveTopToolStripMenuItem.Text = "Move to top"; - this.moveTopToolStripMenuItem.Click += new System.EventHandler(this.moveTopToolStripMenuItem_Click); - // - // moveBottomToolStripMenuItem - // - this.moveBottomToolStripMenuItem.Name = "moveBottomToolStripMenuItem"; - this.moveBottomToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.End))); - this.moveBottomToolStripMenuItem.Size = new System.Drawing.Size(227, 22); - this.moveBottomToolStripMenuItem.Text = "Move to bottom"; - this.moveBottomToolStripMenuItem.Click += new System.EventHandler(this.moveBottomToolStripMenuItem_Click); - // - // toolStripSeparator3 - // - this.toolStripSeparator3.Name = "toolStripSeparator3"; - this.toolStripSeparator3.Size = new System.Drawing.Size(224, 6); - // - // toolStripMenuItemImport - // - this.toolStripMenuItemImport.Name = "toolStripMenuItemImport"; - this.toolStripMenuItemImport.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.I))); - this.toolStripMenuItemImport.Size = new System.Drawing.Size(227, 22); - this.toolStripMenuItemImport.Text = "Import..."; - this.toolStripMenuItemImport.Click += new System.EventHandler(this.toolStripMenuItem3_Click); - // - // toolStripMenuItemExport - // - this.toolStripMenuItemExport.Name = "toolStripMenuItemExport"; - this.toolStripMenuItemExport.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.E))); - this.toolStripMenuItemExport.Size = new System.Drawing.Size(227, 22); - this.toolStripMenuItemExport.Text = "Export..."; - this.toolStripMenuItemExport.Click += new System.EventHandler(this.toolStripMenuItem4_Click); - // - // radioButtonNormal - // - this.radioButtonNormal.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.radioButtonNormal.AutoSize = true; - this.radioButtonNormal.Checked = true; - this.radioButtonNormal.Location = new System.Drawing.Point(11, 230); - this.radioButtonNormal.Name = "radioButtonNormal"; - this.radioButtonNormal.Size = new System.Drawing.Size(58, 17); - this.radioButtonNormal.TabIndex = 10; - this.radioButtonNormal.TabStop = true; - this.radioButtonNormal.Text = "Normal"; - this.radioButtonNormal.UseVisualStyleBackColor = true; - this.radioButtonNormal.CheckedChanged += new System.EventHandler(this.RadioButtonCheckedChanged); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.Location = new System.Drawing.Point(804, 251); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 14; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.Location = new System.Drawing.Point(885, 251); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 15; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // splitContainer1 - // - this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; - this.splitContainer1.Location = new System.Drawing.Point(0, 0); - this.splitContainer1.Name = "splitContainer1"; - this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; - // - // splitContainer1.Panel1 - // - this.splitContainer1.Panel1.Controls.Add(this.groupBoxGroups); - this.splitContainer1.Panel1.Controls.Add(this.groupBoxReplaces); - // - // splitContainer1.Panel2 - // - this.splitContainer1.Panel2.Controls.Add(this.buttonApply); - this.splitContainer1.Panel2.Controls.Add(this.groupBoxLinesFound); - this.splitContainer1.Panel2.Controls.Add(this.buttonOK); - this.splitContainer1.Panel2.Controls.Add(this.buttonCancel); - this.splitContainer1.Size = new System.Drawing.Size(1053, 555); - this.splitContainer1.SplitterDistance = 263; - this.splitContainer1.TabIndex = 0; - // - // groupBoxGroups - // - this.groupBoxGroups.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left))); - this.groupBoxGroups.Controls.Add(this.buttonExportGroups); - this.groupBoxGroups.Controls.Add(this.buttonImportGroups); - this.groupBoxGroups.Controls.Add(this.buttonNewGroup); - this.groupBoxGroups.Controls.Add(this.listViewGroups); - this.groupBoxGroups.Location = new System.Drawing.Point(6, 3); - this.groupBoxGroups.Name = "groupBoxGroups"; - this.groupBoxGroups.Size = new System.Drawing.Size(223, 257); - this.groupBoxGroups.TabIndex = 0; - this.groupBoxGroups.TabStop = false; - this.groupBoxGroups.Text = "Groups"; - // - // buttonExportGroups - // - this.buttonExportGroups.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonExportGroups.Location = new System.Drawing.Point(118, 230); - this.buttonExportGroups.Name = "buttonExportGroups"; - this.buttonExportGroups.Size = new System.Drawing.Size(99, 23); - this.buttonExportGroups.TabIndex = 3; - this.buttonExportGroups.Text = "Export"; - this.buttonExportGroups.UseVisualStyleBackColor = true; - this.buttonExportGroups.Click += new System.EventHandler(this.buttonExportGroups_Click); - // - // buttonImportGroups - // - this.buttonImportGroups.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonImportGroups.Location = new System.Drawing.Point(8, 230); - this.buttonImportGroups.Name = "buttonImportGroups"; - this.buttonImportGroups.Size = new System.Drawing.Size(104, 23); - this.buttonImportGroups.TabIndex = 2; - this.buttonImportGroups.Text = "Import"; - this.buttonImportGroups.UseVisualStyleBackColor = true; - this.buttonImportGroups.Click += new System.EventHandler(this.buttonImportGroups_Click); - // - // buttonNewGroup - // - this.buttonNewGroup.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonNewGroup.Location = new System.Drawing.Point(8, 203); - this.buttonNewGroup.Name = "buttonNewGroup"; - this.buttonNewGroup.Size = new System.Drawing.Size(209, 23); - this.buttonNewGroup.TabIndex = 1; - this.buttonNewGroup.Text = "New"; - this.buttonNewGroup.UseVisualStyleBackColor = true; - this.buttonNewGroup.Click += new System.EventHandler(this.buttonNewGroup_Click); - // - // listViewGroups - // - this.listViewGroups.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.listViewGroups.CheckBoxes = true; - this.listViewGroups.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeaderForName}); - this.listViewGroups.ContextMenuStrip = this.contextMenuStripGroups; - this.listViewGroups.FullRowSelect = true; - this.listViewGroups.GridLines = true; - this.listViewGroups.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None; - this.listViewGroups.HideSelection = false; - this.listViewGroups.Location = new System.Drawing.Point(8, 20); - this.listViewGroups.MultiSelect = false; - this.listViewGroups.Name = "listViewGroups"; - this.listViewGroups.Size = new System.Drawing.Size(209, 177); - this.listViewGroups.TabIndex = 0; - this.listViewGroups.UseCompatibleStateImageBehavior = false; - this.listViewGroups.View = System.Windows.Forms.View.Details; - // - // columnHeaderForName - // - this.columnHeaderForName.Text = "Active"; - this.columnHeaderForName.Width = 205; - // - // contextMenuStripGroups - // - this.contextMenuStripGroups.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.newToolStripMenuItem, - this.toolStripMenuItemRename, - this.deleteToolStripMenuItem1, - this.toolStripSeparator1, - this.moveUpToolStripMenuItem1, - this.moveDownToolStripMenuItem1, - this.moveToTopToolStripMenuItem, - this.moveToBottomToolStripMenuItem, - this.toolStripSeparatorGroupImportExport, - this.importToolStripMenuItem, - this.exportToolStripMenuItem}); - this.contextMenuStripGroups.Name = "contextMenuStripGroups"; - this.contextMenuStripGroups.Size = new System.Drawing.Size(162, 214); - this.contextMenuStripGroups.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStripGroups_Opening); - // - // newToolStripMenuItem - // - this.newToolStripMenuItem.Name = "newToolStripMenuItem"; - this.newToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift | System.Windows.Forms.Keys.N))); - this.newToolStripMenuItem.Size = new System.Drawing.Size(161, 22); - this.newToolStripMenuItem.Text = "New..."; - this.newToolStripMenuItem.Click += new System.EventHandler(this.newToolStripMenuItem_Click); - // - // toolStripMenuItemRename - // - this.toolStripMenuItemRename.Name = "toolStripMenuItemRename"; - this.toolStripMenuItemRename.ShortcutKeys = System.Windows.Forms.Keys.F2; - this.toolStripMenuItemRename.Size = new System.Drawing.Size(161, 22); - this.toolStripMenuItemRename.Text = "Rename..."; - this.toolStripMenuItemRename.Click += new System.EventHandler(this.ToolStripMenuItemRenameClick); - // - // deleteToolStripMenuItem1 - // - this.deleteToolStripMenuItem1.Name = "deleteToolStripMenuItem1"; - this.deleteToolStripMenuItem1.ShortcutKeys = System.Windows.Forms.Keys.Delete; - this.deleteToolStripMenuItem1.Size = new System.Drawing.Size(161, 22); - this.deleteToolStripMenuItem1.Text = "Delete..."; - this.deleteToolStripMenuItem1.Click += new System.EventHandler(this.deleteToolStripMenuItem1_Click); - // - // toolStripSeparator1 - // - this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(158, 6); - // - // moveUpToolStripMenuItem1 - // - this.moveUpToolStripMenuItem1.Name = "moveUpToolStripMenuItem1"; - this.moveUpToolStripMenuItem1.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Up))); - this.moveUpToolStripMenuItem1.Size = new System.Drawing.Size(161, 22); - this.moveUpToolStripMenuItem1.Text = "Move up"; - this.moveUpToolStripMenuItem1.Click += new System.EventHandler(this.moveUpToolStripMenuItem1_Click); - // - // moveDownToolStripMenuItem1 - // - this.moveDownToolStripMenuItem1.Name = "moveDownToolStripMenuItem1"; - this.moveDownToolStripMenuItem1.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Down))); - this.moveDownToolStripMenuItem1.Size = new System.Drawing.Size(161, 22); - this.moveDownToolStripMenuItem1.Text = "Move down"; - this.moveDownToolStripMenuItem1.Click += new System.EventHandler(this.moveDownToolStripMenuItem1_Click); - // - // moveToTopToolStripMenuItem - // - this.moveToTopToolStripMenuItem.Name = "moveToTopToolStripMenuItem"; - this.moveToTopToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Home))); - this.moveToTopToolStripMenuItem.Size = new System.Drawing.Size(161, 22); - this.moveToTopToolStripMenuItem.Text = "Move to top"; - this.moveToTopToolStripMenuItem.Click += new System.EventHandler(this.moveToTopToolStripMenuItem_Click); - // - // moveToBottomToolStripMenuItem - // - this.moveToBottomToolStripMenuItem.Name = "moveToBottomToolStripMenuItem"; - this.moveToBottomToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.End))); - this.moveToBottomToolStripMenuItem.Size = new System.Drawing.Size(161, 22); - this.moveToBottomToolStripMenuItem.Text = "Move to bottom"; - this.moveToBottomToolStripMenuItem.Click += new System.EventHandler(this.moveToBottomToolStripMenuItem_Click); - // - // toolStripSeparatorGroupImportExport - // - this.toolStripSeparatorGroupImportExport.Name = "toolStripSeparatorGroupImportExport"; - this.toolStripSeparatorGroupImportExport.Size = new System.Drawing.Size(158, 6); - // - // importToolStripMenuItem - // - this.importToolStripMenuItem.Name = "importToolStripMenuItem"; - this.importToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.I))); - this.importToolStripMenuItem.Size = new System.Drawing.Size(161, 22); - this.importToolStripMenuItem.Text = "Import..."; - this.importToolStripMenuItem.Click += new System.EventHandler(this.importToolStripMenuItem_Click); - // - // exportToolStripMenuItem - // - this.exportToolStripMenuItem.Name = "exportToolStripMenuItem"; - this.exportToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.E))); - this.exportToolStripMenuItem.Size = new System.Drawing.Size(161, 22); - this.exportToolStripMenuItem.Text = "Export..."; - this.exportToolStripMenuItem.Click += new System.EventHandler(this.exportToolStripMenuItem_Click); - // - // buttonApply - // - this.buttonApply.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonApply.Location = new System.Drawing.Point(966, 251); - this.buttonApply.Name = "buttonApply"; - this.buttonApply.Size = new System.Drawing.Size(75, 23); - this.buttonApply.TabIndex = 16; - this.buttonApply.Text = "Apply"; - this.buttonApply.UseVisualStyleBackColor = true; - this.buttonApply.Click += new System.EventHandler(this.buttonApply_Click); - // - // openFileDialog1 - // - this.openFileDialog1.FileName = "openFileDialog1"; - // - // MultipleReplace - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(1053, 555); - this.Controls.Add(this.splitContainer1); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.KeyPreview = true; - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(910, 582); - this.Name = "MultipleReplace"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Multiple replace"; - this.Shown += new System.EventHandler(this.MultipleReplace_Shown); - this.ResizeEnd += new System.EventHandler(this.MultipleReplace_ResizeEnd); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.MultipleReplace_KeyDown); - this.groupBoxLinesFound.ResumeLayout(false); - this.groupBoxReplaces.ResumeLayout(false); - this.groupBoxReplaces.PerformLayout(); - this.contextMenuStripRules.ResumeLayout(false); - this.splitContainer1.Panel1.ResumeLayout(false); - this.splitContainer1.Panel2.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); - this.splitContainer1.ResumeLayout(false); - this.groupBoxGroups.ResumeLayout(false); - this.contextMenuStripGroups.ResumeLayout(false); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.GroupBox groupBoxLinesFound; - private System.Windows.Forms.ListView listViewFixes; - private System.Windows.Forms.ColumnHeader columnHeader4; - private System.Windows.Forms.ColumnHeader columnHeader5; - private System.Windows.Forms.ColumnHeader columnHeader7; - private System.Windows.Forms.ColumnHeader columnHeader8; - private System.Windows.Forms.GroupBox groupBoxReplaces; - private System.Windows.Forms.ListView listViewRules; - private System.Windows.Forms.ColumnHeader columnHeader1; - private System.Windows.Forms.ColumnHeader columnHeader2; - private System.Windows.Forms.ColumnHeader columnHeader3; - private System.Windows.Forms.ColumnHeader columnHeader6; - private System.Windows.Forms.Label labelFindWhat; - private System.Windows.Forms.Label labelReplaceWith; - private System.Windows.Forms.TextBox textBoxReplace; - private System.Windows.Forms.RadioButton radioButtonRegEx; - private System.Windows.Forms.RadioButton radioButtonCaseSensitive; - private System.Windows.Forms.RadioButton radioButtonNormal; - private System.Windows.Forms.TextBox textBoxFind; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonAdd; - private System.Windows.Forms.ContextMenuStrip contextMenuStripRules; - private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem; - private System.Windows.Forms.Button buttonUpdate; - private System.Windows.Forms.SplitContainer splitContainer1; - private System.Windows.Forms.Button buttonReplacesSelectAll; - private System.Windows.Forms.Button buttonReplacesInverseSelection; - private System.Windows.Forms.ToolStripMenuItem moveUpToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem moveDownToolStripMenuItem; - private System.Windows.Forms.OpenFileDialog openFileDialog1; - private System.Windows.Forms.SaveFileDialog saveFileDialog1; - private System.Windows.Forms.ToolStripMenuItem moveTopToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem moveBottomToolStripMenuItem; - private System.Windows.Forms.GroupBox groupBoxGroups; - private System.Windows.Forms.Button buttonNewGroup; - private System.Windows.Forms.ListView listViewGroups; - private System.Windows.Forms.ColumnHeader columnHeaderForName; - private System.Windows.Forms.ContextMenuStrip contextMenuStripGroups; - private System.Windows.Forms.ToolStripMenuItem newToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemRename; - private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem1; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; - private System.Windows.Forms.ToolStripMenuItem moveUpToolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem moveDownToolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem moveToTopToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem moveToBottomToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemRemoveAll; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemExport; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemImport; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemMoveRulesToGroup; - private System.Windows.Forms.Button buttonApply; - private System.Windows.Forms.Label labelDescription; - private System.Windows.Forms.TextBox textBoxDescription; - private System.Windows.Forms.ColumnHeader columnHeader9; - private System.Windows.Forms.ToolStripSeparator toolStripSeparatorGroupImportExport; - private System.Windows.Forms.ToolStripMenuItem exportToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem importToolStripMenuItem; - private System.Windows.Forms.Button buttonExportGroups; - private System.Windows.Forms.Button buttonImportGroups; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class MultipleReplace + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.groupBoxLinesFound = new System.Windows.Forms.GroupBox(); + this.buttonReplacesInverseSelection = new System.Windows.Forms.Button(); + this.buttonReplacesSelectAll = new System.Windows.Forms.Button(); + this.listViewFixes = new System.Windows.Forms.ListView(); + this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader7 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader8 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.groupBoxReplaces = new System.Windows.Forms.GroupBox(); + this.labelDescription = new System.Windows.Forms.Label(); + this.textBoxDescription = new System.Windows.Forms.TextBox(); + this.radioButtonRegEx = new System.Windows.Forms.RadioButton(); + this.radioButtonCaseSensitive = new System.Windows.Forms.RadioButton(); + this.textBoxFind = new System.Windows.Forms.TextBox(); + this.textBoxReplace = new System.Windows.Forms.TextBox(); + this.buttonUpdate = new System.Windows.Forms.Button(); + this.buttonAdd = new System.Windows.Forms.Button(); + this.labelFindWhat = new System.Windows.Forms.Label(); + this.labelReplaceWith = new System.Windows.Forms.Label(); + this.listViewRules = new System.Windows.Forms.ListView(); + this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader6 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader9 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.contextMenuStripRules = new System.Windows.Forms.ContextMenuStrip(this.components); + this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemRemoveAll = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItemMoveRulesToGroup = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); + this.moveUpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.moveDownToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.moveTopToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.moveBottomToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItemImport = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemExport = new System.Windows.Forms.ToolStripMenuItem(); + this.radioButtonNormal = new System.Windows.Forms.RadioButton(); + this.buttonOK = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.groupBoxGroups = new System.Windows.Forms.GroupBox(); + this.buttonExportGroups = new System.Windows.Forms.Button(); + this.buttonImportGroups = new System.Windows.Forms.Button(); + this.buttonNewGroup = new System.Windows.Forms.Button(); + this.listViewGroups = new System.Windows.Forms.ListView(); + this.columnHeaderForName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.contextMenuStripGroups = new System.Windows.Forms.ContextMenuStrip(this.components); + this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemRename = new System.Windows.Forms.ToolStripMenuItem(); + this.deleteToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.moveUpToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.moveDownToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.moveToTopToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.moveToBottomToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparatorGroupImportExport = new System.Windows.Forms.ToolStripSeparator(); + this.importToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.exportToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.buttonApply = new System.Windows.Forms.Button(); + this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); + this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog(); + this.groupBoxLinesFound.SuspendLayout(); + this.groupBoxReplaces.SuspendLayout(); + this.contextMenuStripRules.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.groupBoxGroups.SuspendLayout(); + this.contextMenuStripGroups.SuspendLayout(); + this.SuspendLayout(); + // + // groupBoxLinesFound + // + this.groupBoxLinesFound.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxLinesFound.Controls.Add(this.buttonReplacesInverseSelection); + this.groupBoxLinesFound.Controls.Add(this.buttonReplacesSelectAll); + this.groupBoxLinesFound.Controls.Add(this.listViewFixes); + this.groupBoxLinesFound.Location = new System.Drawing.Point(4, 14); + this.groupBoxLinesFound.Name = "groupBoxLinesFound"; + this.groupBoxLinesFound.Size = new System.Drawing.Size(1046, 232); + this.groupBoxLinesFound.TabIndex = 8; + this.groupBoxLinesFound.TabStop = false; + this.groupBoxLinesFound.Text = "Lines found: {0}"; + // + // buttonReplacesInverseSelection + // + this.buttonReplacesInverseSelection.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonReplacesInverseSelection.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonReplacesInverseSelection.Location = new System.Drawing.Point(91, 204); + this.buttonReplacesInverseSelection.Name = "buttonReplacesInverseSelection"; + this.buttonReplacesInverseSelection.Size = new System.Drawing.Size(100, 23); + this.buttonReplacesInverseSelection.TabIndex = 12; + this.buttonReplacesInverseSelection.Text = "&Inverse selection"; + this.buttonReplacesInverseSelection.UseVisualStyleBackColor = true; + this.buttonReplacesInverseSelection.Click += new System.EventHandler(this.buttonReplacesInverseSelection_Click); + // + // buttonReplacesSelectAll + // + this.buttonReplacesSelectAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonReplacesSelectAll.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonReplacesSelectAll.Location = new System.Drawing.Point(10, 204); + this.buttonReplacesSelectAll.Name = "buttonReplacesSelectAll"; + this.buttonReplacesSelectAll.Size = new System.Drawing.Size(75, 23); + this.buttonReplacesSelectAll.TabIndex = 11; + this.buttonReplacesSelectAll.Text = "Select &all"; + this.buttonReplacesSelectAll.UseVisualStyleBackColor = true; + this.buttonReplacesSelectAll.Click += new System.EventHandler(this.buttonReplacesSelectAll_Click); + // + // listViewFixes + // + this.listViewFixes.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listViewFixes.CheckBoxes = true; + this.listViewFixes.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader4, + this.columnHeader5, + this.columnHeader7, + this.columnHeader8}); + this.listViewFixes.FullRowSelect = true; + this.listViewFixes.HideSelection = false; + this.listViewFixes.Location = new System.Drawing.Point(10, 21); + this.listViewFixes.Name = "listViewFixes"; + this.listViewFixes.Size = new System.Drawing.Size(1030, 177); + this.listViewFixes.TabIndex = 10; + this.listViewFixes.UseCompatibleStateImageBehavior = false; + this.listViewFixes.View = System.Windows.Forms.View.Details; + this.listViewFixes.KeyDown += new System.Windows.Forms.KeyEventHandler(this.listViewFixes_KeyDown); + // + // columnHeader4 + // + this.columnHeader4.Text = "Apply"; + this.columnHeader4.Width = 48; + // + // columnHeader5 + // + this.columnHeader5.Text = "Line#"; + this.columnHeader5.Width = 61; + // + // columnHeader7 + // + this.columnHeader7.Text = "Before"; + this.columnHeader7.Width = 330; + // + // columnHeader8 + // + this.columnHeader8.Text = "After"; + this.columnHeader8.Width = 440; + // + // groupBoxReplaces + // + this.groupBoxReplaces.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxReplaces.Controls.Add(this.labelDescription); + this.groupBoxReplaces.Controls.Add(this.textBoxDescription); + this.groupBoxReplaces.Controls.Add(this.radioButtonRegEx); + this.groupBoxReplaces.Controls.Add(this.radioButtonCaseSensitive); + this.groupBoxReplaces.Controls.Add(this.textBoxFind); + this.groupBoxReplaces.Controls.Add(this.textBoxReplace); + this.groupBoxReplaces.Controls.Add(this.buttonUpdate); + this.groupBoxReplaces.Controls.Add(this.buttonAdd); + this.groupBoxReplaces.Controls.Add(this.labelFindWhat); + this.groupBoxReplaces.Controls.Add(this.labelReplaceWith); + this.groupBoxReplaces.Controls.Add(this.listViewRules); + this.groupBoxReplaces.Controls.Add(this.radioButtonNormal); + this.groupBoxReplaces.Location = new System.Drawing.Point(235, 3); + this.groupBoxReplaces.Name = "groupBoxReplaces"; + this.groupBoxReplaces.Size = new System.Drawing.Size(809, 257); + this.groupBoxReplaces.TabIndex = 1; + this.groupBoxReplaces.TabStop = false; + this.groupBoxReplaces.Text = "Rules for group \"X\""; + // + // labelDescription + // + this.labelDescription.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelDescription.AutoSize = true; + this.labelDescription.Location = new System.Drawing.Point(400, 184); + this.labelDescription.Name = "labelDescription"; + this.labelDescription.Size = new System.Drawing.Size(64, 13); + this.labelDescription.TabIndex = 11; + this.labelDescription.Text = "Description:"; + // + // textBoxDescription + // + this.textBoxDescription.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxDescription.Location = new System.Drawing.Point(403, 202); + this.textBoxDescription.Name = "textBoxDescription"; + this.textBoxDescription.Size = new System.Drawing.Size(190, 21); + this.textBoxDescription.TabIndex = 5; + // + // radioButtonRegEx + // + this.radioButtonRegEx.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.radioButtonRegEx.AutoSize = true; + this.radioButtonRegEx.Location = new System.Drawing.Point(177, 230); + this.radioButtonRegEx.Name = "radioButtonRegEx"; + this.radioButtonRegEx.Size = new System.Drawing.Size(56, 17); + this.radioButtonRegEx.TabIndex = 12; + this.radioButtonRegEx.Text = "RegEx"; + this.radioButtonRegEx.UseVisualStyleBackColor = true; + this.radioButtonRegEx.CheckedChanged += new System.EventHandler(this.RadioButtonCheckedChanged); + // + // radioButtonCaseSensitive + // + this.radioButtonCaseSensitive.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.radioButtonCaseSensitive.AutoSize = true; + this.radioButtonCaseSensitive.Location = new System.Drawing.Point(75, 230); + this.radioButtonCaseSensitive.Name = "radioButtonCaseSensitive"; + this.radioButtonCaseSensitive.Size = new System.Drawing.Size(94, 17); + this.radioButtonCaseSensitive.TabIndex = 11; + this.radioButtonCaseSensitive.Text = "Case sensitive"; + this.radioButtonCaseSensitive.UseVisualStyleBackColor = true; + this.radioButtonCaseSensitive.CheckedChanged += new System.EventHandler(this.RadioButtonCheckedChanged); + // + // textBoxFind + // + this.textBoxFind.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.textBoxFind.Location = new System.Drawing.Point(9, 203); + this.textBoxFind.Name = "textBoxFind"; + this.textBoxFind.Size = new System.Drawing.Size(211, 21); + this.textBoxFind.TabIndex = 2; + // + // textBoxReplace + // + this.textBoxReplace.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.textBoxReplace.Location = new System.Drawing.Point(226, 203); + this.textBoxReplace.Name = "textBoxReplace"; + this.textBoxReplace.Size = new System.Drawing.Size(171, 21); + this.textBoxReplace.TabIndex = 4; + this.textBoxReplace.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxReplaceKeyDown); + // + // buttonUpdate + // + this.buttonUpdate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonUpdate.Location = new System.Drawing.Point(704, 201); + this.buttonUpdate.Name = "buttonUpdate"; + this.buttonUpdate.Size = new System.Drawing.Size(99, 23); + this.buttonUpdate.TabIndex = 7; + this.buttonUpdate.Text = "&Update"; + this.buttonUpdate.UseVisualStyleBackColor = true; + this.buttonUpdate.Click += new System.EventHandler(this.ButtonUpdateClick); + // + // buttonAdd + // + this.buttonAdd.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonAdd.Location = new System.Drawing.Point(599, 201); + this.buttonAdd.Name = "buttonAdd"; + this.buttonAdd.Size = new System.Drawing.Size(99, 23); + this.buttonAdd.TabIndex = 6; + this.buttonAdd.Text = "&Add"; + this.buttonAdd.UseVisualStyleBackColor = true; + this.buttonAdd.Click += new System.EventHandler(this.ButtonAddClick); + // + // labelFindWhat + // + this.labelFindWhat.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelFindWhat.AutoSize = true; + this.labelFindWhat.Location = new System.Drawing.Point(6, 184); + this.labelFindWhat.Name = "labelFindWhat"; + this.labelFindWhat.Size = new System.Drawing.Size(58, 13); + this.labelFindWhat.TabIndex = 1; + this.labelFindWhat.Text = "Find what:"; + // + // labelReplaceWith + // + this.labelReplaceWith.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelReplaceWith.AutoSize = true; + this.labelReplaceWith.Location = new System.Drawing.Point(223, 184); + this.labelReplaceWith.Name = "labelReplaceWith"; + this.labelReplaceWith.Size = new System.Drawing.Size(72, 13); + this.labelReplaceWith.TabIndex = 3; + this.labelReplaceWith.Text = "Replace with:"; + // + // listViewRules + // + this.listViewRules.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listViewRules.CheckBoxes = true; + this.listViewRules.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader1, + this.columnHeader2, + this.columnHeader3, + this.columnHeader6, + this.columnHeader9}); + this.listViewRules.ContextMenuStrip = this.contextMenuStripRules; + this.listViewRules.FullRowSelect = true; + this.listViewRules.HideSelection = false; + this.listViewRules.Location = new System.Drawing.Point(9, 20); + this.listViewRules.Name = "listViewRules"; + this.listViewRules.Size = new System.Drawing.Size(797, 149); + this.listViewRules.TabIndex = 0; + this.listViewRules.UseCompatibleStateImageBehavior = false; + this.listViewRules.View = System.Windows.Forms.View.Details; + this.listViewRules.SelectedIndexChanged += new System.EventHandler(this.ListViewReplaceListSelectedIndexChanged); + this.listViewRules.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ListViewRulesKeyDown); + // + // columnHeader1 + // + this.columnHeader1.Text = "Enabled"; + this.columnHeader1.Width = 70; + // + // columnHeader2 + // + this.columnHeader2.Text = "Find what"; + this.columnHeader2.Width = 200; + // + // columnHeader3 + // + this.columnHeader3.Text = "Replace with"; + this.columnHeader3.Width = 170; + // + // columnHeader6 + // + this.columnHeader6.Text = "Search type"; + this.columnHeader6.Width = 170; + // + // columnHeader9 + // + this.columnHeader9.Text = "Description"; + this.columnHeader9.Width = 166; + // + // contextMenuStripRules + // + this.contextMenuStripRules.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.deleteToolStripMenuItem, + this.toolStripMenuItemRemoveAll, + this.toolStripSeparator2, + this.toolStripMenuItemMoveRulesToGroup, + this.toolStripSeparator4, + this.moveUpToolStripMenuItem, + this.moveDownToolStripMenuItem, + this.moveTopToolStripMenuItem, + this.moveBottomToolStripMenuItem, + this.toolStripSeparator3, + this.toolStripMenuItemImport, + this.toolStripMenuItemExport}); + this.contextMenuStripRules.Name = "contextMenuStrip1"; + this.contextMenuStripRules.Size = new System.Drawing.Size(228, 220); + this.contextMenuStripRules.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStrip1_Opening); + // + // deleteToolStripMenuItem + // + this.deleteToolStripMenuItem.Name = "deleteToolStripMenuItem"; + this.deleteToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.Delete; + this.deleteToolStripMenuItem.Size = new System.Drawing.Size(227, 22); + this.deleteToolStripMenuItem.Text = "Remove"; + this.deleteToolStripMenuItem.Click += new System.EventHandler(this.DeleteToolStripMenuItemClick); + // + // toolStripMenuItemRemoveAll + // + this.toolStripMenuItemRemoveAll.Name = "toolStripMenuItemRemoveAll"; + this.toolStripMenuItemRemoveAll.Size = new System.Drawing.Size(227, 22); + this.toolStripMenuItemRemoveAll.Text = "Remove all"; + this.toolStripMenuItemRemoveAll.Click += new System.EventHandler(this.toolStripMenuItem2_Click); + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(224, 6); + // + // toolStripMenuItemMoveRulesToGroup + // + this.toolStripMenuItemMoveRulesToGroup.Name = "toolStripMenuItemMoveRulesToGroup"; + this.toolStripMenuItemMoveRulesToGroup.Size = new System.Drawing.Size(227, 22); + this.toolStripMenuItemMoveRulesToGroup.Text = "Move selected rules to group"; + // + // toolStripSeparator4 + // + this.toolStripSeparator4.Name = "toolStripSeparator4"; + this.toolStripSeparator4.Size = new System.Drawing.Size(224, 6); + // + // moveUpToolStripMenuItem + // + this.moveUpToolStripMenuItem.Name = "moveUpToolStripMenuItem"; + this.moveUpToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Up))); + this.moveUpToolStripMenuItem.Size = new System.Drawing.Size(227, 22); + this.moveUpToolStripMenuItem.Text = "Move up"; + this.moveUpToolStripMenuItem.Click += new System.EventHandler(this.moveUpToolStripMenuItem_Click); + // + // moveDownToolStripMenuItem + // + this.moveDownToolStripMenuItem.Name = "moveDownToolStripMenuItem"; + this.moveDownToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Down))); + this.moveDownToolStripMenuItem.Size = new System.Drawing.Size(227, 22); + this.moveDownToolStripMenuItem.Text = "Move down"; + this.moveDownToolStripMenuItem.Click += new System.EventHandler(this.moveDownToolStripMenuItem_Click); + // + // moveTopToolStripMenuItem + // + this.moveTopToolStripMenuItem.Name = "moveTopToolStripMenuItem"; + this.moveTopToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Home))); + this.moveTopToolStripMenuItem.Size = new System.Drawing.Size(227, 22); + this.moveTopToolStripMenuItem.Text = "Move to top"; + this.moveTopToolStripMenuItem.Click += new System.EventHandler(this.moveTopToolStripMenuItem_Click); + // + // moveBottomToolStripMenuItem + // + this.moveBottomToolStripMenuItem.Name = "moveBottomToolStripMenuItem"; + this.moveBottomToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.End))); + this.moveBottomToolStripMenuItem.Size = new System.Drawing.Size(227, 22); + this.moveBottomToolStripMenuItem.Text = "Move to bottom"; + this.moveBottomToolStripMenuItem.Click += new System.EventHandler(this.moveBottomToolStripMenuItem_Click); + // + // toolStripSeparator3 + // + this.toolStripSeparator3.Name = "toolStripSeparator3"; + this.toolStripSeparator3.Size = new System.Drawing.Size(224, 6); + // + // toolStripMenuItemImport + // + this.toolStripMenuItemImport.Name = "toolStripMenuItemImport"; + this.toolStripMenuItemImport.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.I))); + this.toolStripMenuItemImport.Size = new System.Drawing.Size(227, 22); + this.toolStripMenuItemImport.Text = "Import..."; + this.toolStripMenuItemImport.Click += new System.EventHandler(this.toolStripMenuItem3_Click); + // + // toolStripMenuItemExport + // + this.toolStripMenuItemExport.Name = "toolStripMenuItemExport"; + this.toolStripMenuItemExport.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.E))); + this.toolStripMenuItemExport.Size = new System.Drawing.Size(227, 22); + this.toolStripMenuItemExport.Text = "Export..."; + this.toolStripMenuItemExport.Click += new System.EventHandler(this.toolStripMenuItem4_Click); + // + // radioButtonNormal + // + this.radioButtonNormal.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.radioButtonNormal.AutoSize = true; + this.radioButtonNormal.Checked = true; + this.radioButtonNormal.Location = new System.Drawing.Point(11, 230); + this.radioButtonNormal.Name = "radioButtonNormal"; + this.radioButtonNormal.Size = new System.Drawing.Size(58, 17); + this.radioButtonNormal.TabIndex = 10; + this.radioButtonNormal.TabStop = true; + this.radioButtonNormal.Text = "Normal"; + this.radioButtonNormal.UseVisualStyleBackColor = true; + this.radioButtonNormal.CheckedChanged += new System.EventHandler(this.RadioButtonCheckedChanged); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.Location = new System.Drawing.Point(804, 251); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 14; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.Location = new System.Drawing.Point(885, 251); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 15; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.groupBoxGroups); + this.splitContainer1.Panel1.Controls.Add(this.groupBoxReplaces); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.buttonApply); + this.splitContainer1.Panel2.Controls.Add(this.groupBoxLinesFound); + this.splitContainer1.Panel2.Controls.Add(this.buttonOK); + this.splitContainer1.Panel2.Controls.Add(this.buttonCancel); + this.splitContainer1.Size = new System.Drawing.Size(1053, 555); + this.splitContainer1.SplitterDistance = 263; + this.splitContainer1.TabIndex = 0; + // + // groupBoxGroups + // + this.groupBoxGroups.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.groupBoxGroups.Controls.Add(this.buttonExportGroups); + this.groupBoxGroups.Controls.Add(this.buttonImportGroups); + this.groupBoxGroups.Controls.Add(this.buttonNewGroup); + this.groupBoxGroups.Controls.Add(this.listViewGroups); + this.groupBoxGroups.Location = new System.Drawing.Point(6, 3); + this.groupBoxGroups.Name = "groupBoxGroups"; + this.groupBoxGroups.Size = new System.Drawing.Size(223, 257); + this.groupBoxGroups.TabIndex = 0; + this.groupBoxGroups.TabStop = false; + this.groupBoxGroups.Text = "Groups"; + // + // buttonExportGroups + // + this.buttonExportGroups.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonExportGroups.Location = new System.Drawing.Point(118, 230); + this.buttonExportGroups.Name = "buttonExportGroups"; + this.buttonExportGroups.Size = new System.Drawing.Size(99, 23); + this.buttonExportGroups.TabIndex = 3; + this.buttonExportGroups.Text = "Export"; + this.buttonExportGroups.UseVisualStyleBackColor = true; + this.buttonExportGroups.Click += new System.EventHandler(this.buttonExportGroups_Click); + // + // buttonImportGroups + // + this.buttonImportGroups.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonImportGroups.Location = new System.Drawing.Point(8, 230); + this.buttonImportGroups.Name = "buttonImportGroups"; + this.buttonImportGroups.Size = new System.Drawing.Size(104, 23); + this.buttonImportGroups.TabIndex = 2; + this.buttonImportGroups.Text = "Import"; + this.buttonImportGroups.UseVisualStyleBackColor = true; + this.buttonImportGroups.Click += new System.EventHandler(this.buttonImportGroups_Click); + // + // buttonNewGroup + // + this.buttonNewGroup.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonNewGroup.Location = new System.Drawing.Point(8, 203); + this.buttonNewGroup.Name = "buttonNewGroup"; + this.buttonNewGroup.Size = new System.Drawing.Size(209, 23); + this.buttonNewGroup.TabIndex = 1; + this.buttonNewGroup.Text = "New"; + this.buttonNewGroup.UseVisualStyleBackColor = true; + this.buttonNewGroup.Click += new System.EventHandler(this.buttonNewGroup_Click); + // + // listViewGroups + // + this.listViewGroups.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listViewGroups.CheckBoxes = true; + this.listViewGroups.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeaderForName}); + this.listViewGroups.ContextMenuStrip = this.contextMenuStripGroups; + this.listViewGroups.FullRowSelect = true; + this.listViewGroups.GridLines = true; + this.listViewGroups.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None; + this.listViewGroups.HideSelection = false; + this.listViewGroups.Location = new System.Drawing.Point(8, 20); + this.listViewGroups.MultiSelect = false; + this.listViewGroups.Name = "listViewGroups"; + this.listViewGroups.Size = new System.Drawing.Size(209, 177); + this.listViewGroups.TabIndex = 0; + this.listViewGroups.UseCompatibleStateImageBehavior = false; + this.listViewGroups.View = System.Windows.Forms.View.Details; + // + // columnHeaderForName + // + this.columnHeaderForName.Text = "Active"; + this.columnHeaderForName.Width = 205; + // + // contextMenuStripGroups + // + this.contextMenuStripGroups.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.newToolStripMenuItem, + this.toolStripMenuItemRename, + this.deleteToolStripMenuItem1, + this.toolStripSeparator1, + this.moveUpToolStripMenuItem1, + this.moveDownToolStripMenuItem1, + this.moveToTopToolStripMenuItem, + this.moveToBottomToolStripMenuItem, + this.toolStripSeparatorGroupImportExport, + this.importToolStripMenuItem, + this.exportToolStripMenuItem}); + this.contextMenuStripGroups.Name = "contextMenuStripGroups"; + this.contextMenuStripGroups.Size = new System.Drawing.Size(162, 214); + this.contextMenuStripGroups.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStripGroups_Opening); + // + // newToolStripMenuItem + // + this.newToolStripMenuItem.Name = "newToolStripMenuItem"; + this.newToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift | System.Windows.Forms.Keys.N))); + this.newToolStripMenuItem.Size = new System.Drawing.Size(161, 22); + this.newToolStripMenuItem.Text = "New..."; + this.newToolStripMenuItem.Click += new System.EventHandler(this.newToolStripMenuItem_Click); + // + // toolStripMenuItemRename + // + this.toolStripMenuItemRename.Name = "toolStripMenuItemRename"; + this.toolStripMenuItemRename.ShortcutKeys = System.Windows.Forms.Keys.F2; + this.toolStripMenuItemRename.Size = new System.Drawing.Size(161, 22); + this.toolStripMenuItemRename.Text = "Rename..."; + this.toolStripMenuItemRename.Click += new System.EventHandler(this.ToolStripMenuItemRenameClick); + // + // deleteToolStripMenuItem1 + // + this.deleteToolStripMenuItem1.Name = "deleteToolStripMenuItem1"; + this.deleteToolStripMenuItem1.ShortcutKeys = System.Windows.Forms.Keys.Delete; + this.deleteToolStripMenuItem1.Size = new System.Drawing.Size(161, 22); + this.deleteToolStripMenuItem1.Text = "Delete..."; + this.deleteToolStripMenuItem1.Click += new System.EventHandler(this.deleteToolStripMenuItem1_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(158, 6); + // + // moveUpToolStripMenuItem1 + // + this.moveUpToolStripMenuItem1.Name = "moveUpToolStripMenuItem1"; + this.moveUpToolStripMenuItem1.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Up))); + this.moveUpToolStripMenuItem1.Size = new System.Drawing.Size(161, 22); + this.moveUpToolStripMenuItem1.Text = "Move up"; + this.moveUpToolStripMenuItem1.Click += new System.EventHandler(this.moveUpToolStripMenuItem1_Click); + // + // moveDownToolStripMenuItem1 + // + this.moveDownToolStripMenuItem1.Name = "moveDownToolStripMenuItem1"; + this.moveDownToolStripMenuItem1.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Down))); + this.moveDownToolStripMenuItem1.Size = new System.Drawing.Size(161, 22); + this.moveDownToolStripMenuItem1.Text = "Move down"; + this.moveDownToolStripMenuItem1.Click += new System.EventHandler(this.moveDownToolStripMenuItem1_Click); + // + // moveToTopToolStripMenuItem + // + this.moveToTopToolStripMenuItem.Name = "moveToTopToolStripMenuItem"; + this.moveToTopToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Home))); + this.moveToTopToolStripMenuItem.Size = new System.Drawing.Size(161, 22); + this.moveToTopToolStripMenuItem.Text = "Move to top"; + this.moveToTopToolStripMenuItem.Click += new System.EventHandler(this.moveToTopToolStripMenuItem_Click); + // + // moveToBottomToolStripMenuItem + // + this.moveToBottomToolStripMenuItem.Name = "moveToBottomToolStripMenuItem"; + this.moveToBottomToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.End))); + this.moveToBottomToolStripMenuItem.Size = new System.Drawing.Size(161, 22); + this.moveToBottomToolStripMenuItem.Text = "Move to bottom"; + this.moveToBottomToolStripMenuItem.Click += new System.EventHandler(this.moveToBottomToolStripMenuItem_Click); + // + // toolStripSeparatorGroupImportExport + // + this.toolStripSeparatorGroupImportExport.Name = "toolStripSeparatorGroupImportExport"; + this.toolStripSeparatorGroupImportExport.Size = new System.Drawing.Size(158, 6); + // + // importToolStripMenuItem + // + this.importToolStripMenuItem.Name = "importToolStripMenuItem"; + this.importToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.I))); + this.importToolStripMenuItem.Size = new System.Drawing.Size(161, 22); + this.importToolStripMenuItem.Text = "Import..."; + this.importToolStripMenuItem.Click += new System.EventHandler(this.importToolStripMenuItem_Click); + // + // exportToolStripMenuItem + // + this.exportToolStripMenuItem.Name = "exportToolStripMenuItem"; + this.exportToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.E))); + this.exportToolStripMenuItem.Size = new System.Drawing.Size(161, 22); + this.exportToolStripMenuItem.Text = "Export..."; + this.exportToolStripMenuItem.Click += new System.EventHandler(this.exportToolStripMenuItem_Click); + // + // buttonApply + // + this.buttonApply.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonApply.Location = new System.Drawing.Point(966, 251); + this.buttonApply.Name = "buttonApply"; + this.buttonApply.Size = new System.Drawing.Size(75, 23); + this.buttonApply.TabIndex = 16; + this.buttonApply.Text = "Apply"; + this.buttonApply.UseVisualStyleBackColor = true; + this.buttonApply.Click += new System.EventHandler(this.buttonApply_Click); + // + // openFileDialog1 + // + this.openFileDialog1.FileName = "openFileDialog1"; + // + // MultipleReplace + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1053, 555); + this.Controls.Add(this.splitContainer1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.KeyPreview = true; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(910, 582); + this.Name = "MultipleReplace"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Multiple replace"; + this.Shown += new System.EventHandler(this.MultipleReplace_Shown); + this.ResizeEnd += new System.EventHandler(this.MultipleReplace_ResizeEnd); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.MultipleReplace_KeyDown); + this.groupBoxLinesFound.ResumeLayout(false); + this.groupBoxReplaces.ResumeLayout(false); + this.groupBoxReplaces.PerformLayout(); + this.contextMenuStripRules.ResumeLayout(false); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + this.groupBoxGroups.ResumeLayout(false); + this.contextMenuStripGroups.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBoxLinesFound; + private System.Windows.Forms.ListView listViewFixes; + private System.Windows.Forms.ColumnHeader columnHeader4; + private System.Windows.Forms.ColumnHeader columnHeader5; + private System.Windows.Forms.ColumnHeader columnHeader7; + private System.Windows.Forms.ColumnHeader columnHeader8; + private System.Windows.Forms.GroupBox groupBoxReplaces; + private System.Windows.Forms.ListView listViewRules; + private System.Windows.Forms.ColumnHeader columnHeader1; + private System.Windows.Forms.ColumnHeader columnHeader2; + private System.Windows.Forms.ColumnHeader columnHeader3; + private System.Windows.Forms.ColumnHeader columnHeader6; + private System.Windows.Forms.Label labelFindWhat; + private System.Windows.Forms.Label labelReplaceWith; + private System.Windows.Forms.TextBox textBoxReplace; + private System.Windows.Forms.RadioButton radioButtonRegEx; + private System.Windows.Forms.RadioButton radioButtonCaseSensitive; + private System.Windows.Forms.RadioButton radioButtonNormal; + private System.Windows.Forms.TextBox textBoxFind; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonAdd; + private System.Windows.Forms.ContextMenuStrip contextMenuStripRules; + private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem; + private System.Windows.Forms.Button buttonUpdate; + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.Button buttonReplacesSelectAll; + private System.Windows.Forms.Button buttonReplacesInverseSelection; + private System.Windows.Forms.ToolStripMenuItem moveUpToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem moveDownToolStripMenuItem; + private System.Windows.Forms.OpenFileDialog openFileDialog1; + private System.Windows.Forms.SaveFileDialog saveFileDialog1; + private System.Windows.Forms.ToolStripMenuItem moveTopToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem moveBottomToolStripMenuItem; + private System.Windows.Forms.GroupBox groupBoxGroups; + private System.Windows.Forms.Button buttonNewGroup; + private System.Windows.Forms.ListView listViewGroups; + private System.Windows.Forms.ColumnHeader columnHeaderForName; + private System.Windows.Forms.ContextMenuStrip contextMenuStripGroups; + private System.Windows.Forms.ToolStripMenuItem newToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemRename; + private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem1; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem moveUpToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem moveDownToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem moveToTopToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem moveToBottomToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemRemoveAll; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemExport; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemImport; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemMoveRulesToGroup; + private System.Windows.Forms.Button buttonApply; + private System.Windows.Forms.Label labelDescription; + private System.Windows.Forms.TextBox textBoxDescription; + private System.Windows.Forms.ColumnHeader columnHeader9; + private System.Windows.Forms.ToolStripSeparator toolStripSeparatorGroupImportExport; + private System.Windows.Forms.ToolStripMenuItem exportToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem importToolStripMenuItem; + private System.Windows.Forms.Button buttonExportGroups; + private System.Windows.Forms.Button buttonImportGroups; + } } \ No newline at end of file diff --git a/src/Forms/MultipleReplace.cs b/src/ui/Forms/MultipleReplace.cs similarity index 97% rename from src/Forms/MultipleReplace.cs rename to src/ui/Forms/MultipleReplace.cs index 0f7613360..dcda934db 100644 --- a/src/Forms/MultipleReplace.cs +++ b/src/ui/Forms/MultipleReplace.cs @@ -1,1309 +1,1309 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text.RegularExpressions; -using System.Windows.Forms; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class MultipleReplace : PositionAndSizeForm - { - internal const string Group = "Group"; - internal const string GroupName = "Name"; - internal const string GroupEnabled = "Enabled"; - internal const string MultipleSearchAndReplaceItem = "MultipleSearchAndReplaceItem"; - internal const string RuleEnabled = "Enabled"; - internal const string FindWhat = "FindWhat"; - internal const string ReplaceWith = "ReplaceWith"; - internal const string SearchType = "SearchType"; - internal const string Description = "Description"; - - private const string TemplateFilterExtension = "|*.template"; - - private readonly List _oldMultipleSearchAndReplaceGroups = new List(); - private readonly Dictionary _compiledRegExList = new Dictionary(); - private Subtitle _subtitle; - private Subtitle _original; - public Subtitle FixedSubtitle { get; private set; } - public int FixCount { get; private set; } - public List DeleteIndices { get; } - - public void SetDeleteIndices() - { - foreach (ListViewItem item in listViewFixes.Items) - { - if (item.Checked && item.SubItems[3].Text == string.Empty) - { - var index = _subtitle.GetIndex(item.Tag as Paragraph); - if (!DeleteIndices.Contains(index)) - { - DeleteIndices.Add(index); - } - } - } - } - - private MultipleSearchAndReplaceGroup _currentGroup; - - public MultipleReplace() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - DeleteIndices = new List(); - openFileDialog1.FileName = string.Empty; - saveFileDialog1.FileName = string.Empty; - - textBoxReplace.ContextMenu = FindReplaceDialogHelper.GetReplaceTextContextMenu(textBoxReplace); - buttonUpdate.Enabled = false; - - Text = Configuration.Settings.Language.MultipleReplace.Title; - labelFindWhat.Text = Configuration.Settings.Language.MultipleReplace.FindWhat; - labelReplaceWith.Text = Configuration.Settings.Language.MultipleReplace.ReplaceWith; - labelDescription.Text = Configuration.Settings.Language.MultipleReplace.Description; - radioButtonNormal.Text = Configuration.Settings.Language.MultipleReplace.Normal; - radioButtonRegEx.Text = Configuration.Settings.Language.MultipleReplace.RegularExpression; - radioButtonCaseSensitive.Text = Configuration.Settings.Language.MultipleReplace.CaseSensitive; - buttonAdd.Text = Configuration.Settings.Language.MultipleReplace.Add; - buttonUpdate.Text = Configuration.Settings.Language.MultipleReplace.Update; - listViewRules.Columns[0].Text = Configuration.Settings.Language.MultipleReplace.Enabled; - listViewRules.Columns[1].Text = Configuration.Settings.Language.MultipleReplace.FindWhat; - listViewRules.Columns[2].Text = Configuration.Settings.Language.MultipleReplace.ReplaceWith; - listViewRules.Columns[3].Text = Configuration.Settings.Language.MultipleReplace.SearchType; - listViewRules.Columns[4].Text = Configuration.Settings.Language.MultipleReplace.Description; - groupBoxGroups.Text = Configuration.Settings.Language.MultipleReplace.Groups; - groupBoxLinesFound.Text = string.Empty; - listViewFixes.Columns[0].Text = Configuration.Settings.Language.General.Apply; - listViewFixes.Columns[1].Text = Configuration.Settings.Language.General.LineNumber; - listViewFixes.Columns[2].Text = Configuration.Settings.Language.General.Before; - listViewFixes.Columns[3].Text = Configuration.Settings.Language.General.After; - deleteToolStripMenuItem.Text = Configuration.Settings.Language.MultipleReplace.Remove; - toolStripMenuItemRemoveAll.Text = Configuration.Settings.Language.MultipleReplace.RemoveAll; - toolStripMenuItemImport.Text = Configuration.Settings.Language.MultipleReplace.Import; - toolStripMenuItemExport.Text = Configuration.Settings.Language.MultipleReplace.Export; - importToolStripMenuItem.Text = Configuration.Settings.Language.MultipleReplace.Import; - exportToolStripMenuItem.Text = Configuration.Settings.Language.MultipleReplace.Export; - buttonImportGroups.Text = Configuration.Settings.Language.MultipleReplace.Import; - buttonExportGroups.Text = Configuration.Settings.Language.MultipleReplace.Export; - buttonNewGroup.Text = Configuration.Settings.Language.MultipleReplace.NewGroup; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - buttonApply.Text = Configuration.Settings.Language.General.Apply; - buttonReplacesSelectAll.Text = Configuration.Settings.Language.FixCommonErrors.SelectAll; - buttonReplacesInverseSelection.Text = Configuration.Settings.Language.FixCommonErrors.InverseSelection; - UiUtil.FixLargeFonts(this, buttonOK); - splitContainer1.Panel1MinSize = 200; - splitContainer1.Panel2MinSize = 200; - - moveUpToolStripMenuItem.Text = Configuration.Settings.Language.DvdSubRip.MoveUp; - moveDownToolStripMenuItem.Text = Configuration.Settings.Language.DvdSubRip.MoveDown; - moveTopToolStripMenuItem.Text = Configuration.Settings.Language.MultipleReplace.MoveToTop; - moveBottomToolStripMenuItem.Text = Configuration.Settings.Language.MultipleReplace.MoveToBottom; - newToolStripMenuItem.Text = Configuration.Settings.Language.MultipleReplace.NewGroup; - - toolStripMenuItemMoveRulesToGroup.Text = Configuration.Settings.Language.MultipleReplace.MoveSelectedRulesToGroup; - moveUpToolStripMenuItem1.Text = Configuration.Settings.Language.DvdSubRip.MoveUp; - moveDownToolStripMenuItem1.Text = Configuration.Settings.Language.DvdSubRip.MoveDown; - moveToTopToolStripMenuItem.Text = Configuration.Settings.Language.MultipleReplace.MoveToTop; - moveToBottomToolStripMenuItem.Text = Configuration.Settings.Language.MultipleReplace.MoveToBottom; - toolStripMenuItemRename.Text = Configuration.Settings.Language.MultipleReplace.RenameGroup; - deleteToolStripMenuItem1.Text = Configuration.Settings.Language.MultipleReplace.Remove; - - radioButtonCaseSensitive.Left = radioButtonNormal.Left + radioButtonNormal.Width + 40; - radioButtonRegEx.Left = radioButtonCaseSensitive.Left + radioButtonCaseSensitive.Width + 40; - } - - public void Initialize(Subtitle subtitle) - { - _subtitle = subtitle ?? throw new ArgumentNullException(nameof(subtitle)); - _original = new Subtitle(_subtitle); - _oldMultipleSearchAndReplaceGroups.Clear(); - - if (Configuration.Settings.MultipleSearchAndReplaceGroups.Count == 0) - { - Configuration.Settings.MultipleSearchAndReplaceGroups.Add(new MultipleSearchAndReplaceGroup { Enabled = true, Name = "Default", Rules = new List() }); - } - - foreach (var group in Configuration.Settings.MultipleSearchAndReplaceGroups) - { - var oldGroup = new MultipleSearchAndReplaceGroup { Name = group.Name, Enabled = group.Enabled, Rules = new List() }; - foreach (var rule in group.Rules) - { - oldGroup.Rules.Add(rule); - } - _oldMultipleSearchAndReplaceGroups.Add(oldGroup); - } - - if (subtitle.Paragraphs == null || subtitle.Paragraphs.Count == 0) - { - groupBoxLinesFound.Enabled = false; - } - - UpdateViewFromModel(Configuration.Settings.MultipleSearchAndReplaceGroups, Configuration.Settings.MultipleSearchAndReplaceGroups[0]); - } - - internal void RunFromBatch(Subtitle subtitle) - { - Initialize(subtitle); - GeneratePreview(); - SetDeleteIndices(); - } - - internal void RunFromBatch(Subtitle subtitle, IEnumerable importFileNames) - { - var savedList = Configuration.Settings.MultipleSearchAndReplaceGroups; - try - { - Configuration.Settings.MultipleSearchAndReplaceGroups = new List(); - foreach (var fileName in importFileNames) - { - if (fileName.Equals(".")) - { - Configuration.Settings.MultipleSearchAndReplaceGroups.AddRange(savedList); - } - else - { - Configuration.Settings.MultipleSearchAndReplaceGroups.AddRange(ImportGroupsFile(fileName)); - } - } - RunFromBatch(subtitle); - } - finally - { - Configuration.Settings.MultipleSearchAndReplaceGroups = savedList; - } - } - - private void MultipleReplace_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - buttonCancel_Click(null, null); - } - else if (e.KeyCode == UiUtil.HelpKeys) - { - Utilities.ShowHelp("#multiple_replace"); - } - } - - private void RadioButtonCheckedChanged(object sender, EventArgs e) - { - textBoxFind.ContextMenu = sender == radioButtonRegEx ? FindReplaceDialogHelper.GetRegExContextMenu(textBoxFind) : null; - } - - private void ButtonAddClick(object sender, EventArgs e) - { - if (_currentGroup == null) - { - return; - } - - string findText = textBoxFind.Text.RemoveControlCharacters(); - if (findText.Length > 0) - { - string searchType = ReplaceExpression.SearchTypeNormal; - if (radioButtonCaseSensitive.Checked) - { - searchType = ReplaceExpression.SearchTypeCaseSensitive; - } - else if (radioButtonRegEx.Checked) - { - searchType = ReplaceExpression.SearchTypeRegularExpression; - if (!RegexUtils.IsValidRegex(findText)) - { - MessageBox.Show(Configuration.Settings.Language.General.RegularExpressionIsNotValid); - textBoxFind.Select(); - return; - } - } - - var rule = new MultipleSearchAndReplaceSetting { Enabled = true, FindWhat = findText, ReplaceWith = textBoxReplace.Text, SearchType = searchType, Description = textBoxDescription.Text }; - _currentGroup.Rules.Add(rule); - AddToRulesListView(rule); - textBoxFind.Text = string.Empty; - textBoxReplace.Text = string.Empty; - textBoxDescription.Text = string.Empty; - GeneratePreview(); - textBoxFind.Select(); - } - } - - private void GeneratePreview() - { - Cursor = Cursors.WaitCursor; - FixedSubtitle = new Subtitle(_subtitle); - int fixedLines = 0; - listViewFixes.BeginUpdate(); - listViewFixes.Items.Clear(); - var replaceExpressions = new HashSet(); - foreach (var group in Configuration.Settings.MultipleSearchAndReplaceGroups) - { - if (group.Enabled) - { - foreach (var rule in group.Rules) - { - if (rule.Enabled) - { - string findWhat = rule.FindWhat; - if (!string.IsNullOrEmpty(findWhat)) // allow space or spaces - { - string replaceWith = RegexUtils.FixNewLine(rule.ReplaceWith); - findWhat = RegexUtils.FixNewLine(findWhat); - string searchType = rule.SearchType; - var mpi = new ReplaceExpression(findWhat, replaceWith, searchType); - replaceExpressions.Add(mpi); - if (mpi.SearchType == ReplaceExpression.SearchRegEx && !_compiledRegExList.ContainsKey(findWhat)) - { - _compiledRegExList.Add(findWhat, new Regex(findWhat, RegexOptions.Compiled | RegexOptions.Multiline)); - } - } - } - } - } - } - - var fixes = new List(); - for (var i = 0; i < _subtitle.Paragraphs.Count; i++) - { - Paragraph p = _subtitle.Paragraphs[i]; - bool hit = false; - string newText = p.Text; - foreach (ReplaceExpression item in replaceExpressions) - { - if (item.SearchType == ReplaceExpression.SearchCaseSensitive) - { - if (newText.Contains(item.FindWhat)) - { - hit = true; - newText = newText.Replace(item.FindWhat, item.ReplaceWith); - } - } - else if (item.SearchType == ReplaceExpression.SearchRegEx) - { - Regex r = _compiledRegExList[item.FindWhat]; - if (r.IsMatch(newText)) - { - hit = true; - newText = RegexUtils.ReplaceNewLineSafe(r, newText, item.ReplaceWith); - } - } - else - { - int index = newText.IndexOf(item.FindWhat, StringComparison.OrdinalIgnoreCase); - if (index >= 0) - { - hit = true; - do - { - newText = newText.Remove(index, item.FindWhat.Length).Insert(index, item.ReplaceWith); - index = newText.IndexOf(item.FindWhat, index + item.ReplaceWith.Length, StringComparison.OrdinalIgnoreCase); - } while (index >= 0); - } - } - } - - if (hit && newText != p.Text) - { - fixedLines++; - fixes.Add(MakePreviewListItem(p, newText)); - FixedSubtitle.Paragraphs[i].Text = newText; - } - } - - listViewFixes.Items.AddRange(fixes.ToArray()); - listViewFixes.EndUpdate(); - groupBoxLinesFound.Text = string.Format(Configuration.Settings.Language.MultipleReplace.LinesFoundX, fixedLines); - Cursor = Cursors.Default; - } - - private void AddToRulesListView(MultipleSearchAndReplaceSetting rule) - { - var item = new ListViewItem(string.Empty) { Checked = rule.Enabled, Tag = rule }; - item.SubItems.Add(rule.FindWhat); - item.SubItems.Add(rule.ReplaceWith); - item.SubItems.Add(EnglishSearchTypeToLocal(rule.SearchType)); - item.SubItems.Add(rule.Description); - listViewRules.Items.Add(item); - } - - private ListViewItem MakePreviewListItem(Paragraph p, string newText) - { - var item = new ListViewItem(string.Empty) { Tag = p, Checked = true }; - item.SubItems.Add(p.Number.ToString(CultureInfo.InvariantCulture)); - item.SubItems.Add(UiUtil.GetListViewTextFromString(p.Text)); - item.SubItems.Add(UiUtil.GetListViewTextFromString(newText)); - return item; - } - - private static string LocalSearchTypeToEnglish(string searchType) - { - if (searchType == Configuration.Settings.Language.MultipleReplace.RegularExpression) - { - return ReplaceExpression.SearchTypeRegularExpression; - } - - if (searchType == Configuration.Settings.Language.MultipleReplace.CaseSensitive) - { - return ReplaceExpression.SearchTypeCaseSensitive; - } - - return ReplaceExpression.SearchTypeNormal; - } - - private static string EnglishSearchTypeToLocal(string searchType) - { - if (searchType == ReplaceExpression.SearchTypeRegularExpression) - { - return Configuration.Settings.Language.MultipleReplace.RegularExpression; - } - - if (searchType == ReplaceExpression.SearchTypeCaseSensitive) - { - return Configuration.Settings.Language.MultipleReplace.CaseSensitive; - } - - return Configuration.Settings.Language.MultipleReplace.Normal; - } - - private void buttonOK_Click(object sender, EventArgs e) - { - SetDeleteIndices(); - ResetUncheckLines(); - SetFixCount(); - SaveReplaceList(true); - DialogResult = DialogResult.OK; - } - - public void SetFixCount() - { - for (var index = 0; index < _original.Paragraphs.Count; index++) - { - var p = _original.Paragraphs[index]; - var f = FixedSubtitle.GetParagraphOrDefault(index); - if (f != null && f.Text != p.Text) - { - FixCount++; - } - } - } - - private void SaveReplaceList(bool saveToDisk) - { - if (saveToDisk) - { - Configuration.Settings.Save(); - } - } - - private void ResetUncheckLines() - { - foreach (ListViewItem item in listViewFixes.Items) - { - if (!item.Checked) - { - int index = _subtitle.GetIndex(item.Tag as Paragraph); - FixedSubtitle.Paragraphs[index].Text = _subtitle.Paragraphs[index].Text; - } - } - } - - private void DeleteToolStripMenuItemClick(object sender, EventArgs e) - { - if (listViewRules.Items.Count < 1 || listViewRules.SelectedItems.Count < 1 || _currentGroup == null) - { - return; - } - - listViewRules.BeginUpdate(); - for (int i = listViewRules.Items.Count - 1; i >= 0; i--) - { - ListViewItem item = listViewRules.Items[i]; - if (item.Selected) - { - item.Remove(); - _currentGroup.Rules.Remove(item.Tag as MultipleSearchAndReplaceSetting); - } - } - listViewRules.EndUpdate(); - GeneratePreview(); - } - - private void ListViewRulesKeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.A && e.Modifiers == Keys.Control) - { - listViewRules.SelectAll(); - e.SuppressKeyPress = true; - } - else if (e.KeyCode == Keys.D && e.Modifiers == Keys.Control) - { - listViewRules.SelectFirstSelectedItemOnly(); - e.SuppressKeyPress = true; - } - else if (e.KeyCode == Keys.I && e.Modifiers == (Keys.Control | Keys.Shift)) //InverseSelection - { - listViewRules.InverseSelection(); - e.SuppressKeyPress = true; - } - } - - private void ButtonUpdateClick(object sender, EventArgs e) - { - if (listViewRules.SelectedItems.Count != 1 || _currentGroup == null) - { - return; - } - - string findText = textBoxFind.Text.RemoveControlCharacters(); - textBoxFind.Text = findText; - - string replaceText = textBoxReplace.Text.RemoveControlCharacters(); - textBoxReplace.Text = replaceText; - - if (findText.Length > 0) - { - string searchType = ReplaceExpression.SearchTypeNormal; - if (radioButtonCaseSensitive.Checked) - { - searchType = ReplaceExpression.SearchTypeCaseSensitive; - } - else if (radioButtonRegEx.Checked) - { - searchType = ReplaceExpression.SearchTypeRegularExpression; - if (!RegexUtils.IsValidRegex(findText)) - { - MessageBox.Show(Configuration.Settings.Language.General.RegularExpressionIsNotValid); - textBoxFind.Select(); - return; - } - } - - var item = listViewRules.SelectedItems[0]; - item.SubItems[1].Text = findText; - item.SubItems[2].Text = replaceText; - item.SubItems[3].Text = EnglishSearchTypeToLocal(searchType); - item.SubItems[4].Text = textBoxDescription.Text; - - _currentGroup.Rules[item.Index].FindWhat = findText; - _currentGroup.Rules[item.Index].ReplaceWith = replaceText; - _currentGroup.Rules[item.Index].SearchType = searchType; - _currentGroup.Rules[item.Index].Description = textBoxDescription.Text; - - GeneratePreview(); - textBoxFind.Select(); - } - } - - private void ListViewReplaceListSelectedIndexChanged(object sender, EventArgs e) - { - if (listViewRules.SelectedItems.Count == 1) - { - buttonUpdate.Enabled = true; - textBoxFind.Text = listViewRules.SelectedItems[0].SubItems[1].Text; - textBoxReplace.Text = listViewRules.SelectedItems[0].SubItems[2].Text; - string searchType = LocalSearchTypeToEnglish(listViewRules.SelectedItems[0].SubItems[3].Text); - if (searchType == ReplaceExpression.SearchTypeRegularExpression) - { - radioButtonRegEx.Checked = true; - } - else if (searchType == ReplaceExpression.SearchTypeCaseSensitive) - { - radioButtonCaseSensitive.Checked = true; - } - else - { - radioButtonNormal.Checked = true; - } - - textBoxDescription.Text = listViewRules.SelectedItems[0].SubItems[4].Text; - } - else - { - buttonUpdate.Enabled = false; - } - } - - private void TextBoxReplaceKeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Enter) - { - ButtonAddClick(null, null); - } - } - - private void buttonReplacesSelectAll_Click(object sender, EventArgs e) - { - foreach (ListViewItem item in listViewFixes.Items) - { - item.Checked = true; - } - } - - private void buttonReplacesInverseSelection_Click(object sender, EventArgs e) - { - foreach (ListViewItem item in listViewFixes.Items) - { - item.Checked = !item.Checked; - } - } - - private void contextMenuStrip1_Opening(object sender, System.ComponentModel.CancelEventArgs e) - { - bool moreThanOneGroup = Configuration.Settings.MultipleSearchAndReplaceGroups.Count > 1; - bool isVisible = listViewRules.Items.Count > 1 && listViewRules.SelectedItems.Count == 1; - toolStripSeparator3.Visible = isVisible; - moveUpToolStripMenuItem.Visible = isVisible; - moveDownToolStripMenuItem.Visible = isVisible; - moveTopToolStripMenuItem.Visible = isVisible; - moveBottomToolStripMenuItem.Visible = isVisible; - - toolStripMenuItemExport.Visible = listViewRules.Items.Count > 0; - toolStripMenuItemRemoveAll.Visible = listViewRules.Items.Count > 0; - toolStripSeparator2.Visible = listViewRules.Items.Count > 0; - - deleteToolStripMenuItem.Visible = listViewRules.SelectedItems.Count >= 1; - - if (moreThanOneGroup && listViewRules.SelectedItems.Count >= 1) - { - toolStripMenuItemMoveRulesToGroup.Visible = true; - toolStripSeparator4.Visible = true; - toolStripMenuItemMoveRulesToGroup.DropDownItems.Clear(); - foreach (var g in Configuration.Settings.MultipleSearchAndReplaceGroups) - { - if (g != _currentGroup) - { - var menuItem = new ToolStripMenuItem(g.Name) { Tag = g }; - menuItem.Click += (o, args) => { MoveRulesToGroup(g); }; - toolStripMenuItemMoveRulesToGroup.DropDownItems.Add(menuItem); - } - } - } - else - { - toolStripMenuItemMoveRulesToGroup.Visible = false; - toolStripSeparator4.Visible = false; - } - } - - private void MoveRulesToGroup(MultipleSearchAndReplaceGroup newGroup) - { - foreach (ListViewItem item in listViewRules.SelectedItems) - { - var rule = (MultipleSearchAndReplaceSetting)item.Tag; - _currentGroup.Rules.Remove(rule); - newGroup.Rules.Add(rule); - } - UpdateViewFromModel(Configuration.Settings.MultipleSearchAndReplaceGroups, _currentGroup); - GeneratePreview(); - } - - private void SwapRules(int index, int index2) - { - if (_currentGroup == null) - { - return; - } - - listViewRules.ItemChecked -= ListViewRulesItemChecked; - - var temp = _currentGroup.Rules[index]; - _currentGroup.Rules[index] = _currentGroup.Rules[index2]; - _currentGroup.Rules[index2] = temp; - - bool enabled = listViewRules.Items[index].Checked; - string findWhat = listViewRules.Items[index].SubItems[1].Text; - string replaceWith = listViewRules.Items[index].SubItems[2].Text; - string searchType = listViewRules.Items[index].SubItems[3].Text; - string description = listViewRules.Items[index].SubItems[4].Text; - - listViewRules.Items[index].Checked = listViewRules.Items[index2].Checked; - listViewRules.Items[index].SubItems[1].Text = listViewRules.Items[index2].SubItems[1].Text; - listViewRules.Items[index].SubItems[2].Text = listViewRules.Items[index2].SubItems[2].Text; - listViewRules.Items[index].SubItems[3].Text = listViewRules.Items[index2].SubItems[3].Text; - listViewRules.Items[index].SubItems[4].Text = listViewRules.Items[index2].SubItems[4].Text; - listViewRules.Items[index].Tag = _currentGroup.Rules[index]; - - listViewRules.Items[index2].Checked = enabled; - listViewRules.Items[index2].SubItems[1].Text = findWhat; - listViewRules.Items[index2].SubItems[2].Text = replaceWith; - listViewRules.Items[index2].SubItems[3].Text = searchType; - listViewRules.Items[index2].SubItems[4].Text = description; - listViewRules.Items[index2].Tag = _currentGroup.Rules[index2]; - - listViewRules.Items[index].Selected = false; - listViewRules.Items[index2].Selected = true; - listViewRules.Items[index2].Focused = true; - listViewRules.EnsureVisible(index2); - GeneratePreview(); - listViewRules.ItemChecked += ListViewRulesItemChecked; - } - - private void moveUpToolStripMenuItem_Click(object sender, EventArgs e) - { - if (listViewRules.SelectedItems.Count != 1 || listViewRules.Items.Count < 2) - { - return; - } - - int index = listViewRules.SelectedIndices[0]; - if (index == 0) - { - return; - } - - SwapRules(index, index - 1); - } - - private void moveDownToolStripMenuItem_Click(object sender, EventArgs e) - { - if (listViewRules.SelectedItems.Count != 1 || listViewRules.Items.Count < 2) - { - return; - } - - int index = listViewRules.SelectedIndices[0]; - if (index == listViewRules.Items.Count - 1) - { - return; - } - - SwapRules(index, index + 1); - } - - private void moveTopToolStripMenuItem_Click(object sender, EventArgs e) - { - if (listViewRules.SelectedItems.Count != 1 || listViewRules.Items.Count < 2) - { - return; - } - - int index = listViewRules.SelectedIndices[0]; - if (index == 0) - { - return; - } - - if (_currentGroup == null) - { - return; - } - - var temp = _currentGroup.Rules[index]; - _currentGroup.Rules.Remove(temp); - _currentGroup.Rules.Insert(0, temp); - listViewGroups_SelectedIndexChanged(null, null); - GeneratePreview(); - } - - private void moveBottomToolStripMenuItem_Click(object sender, EventArgs e) - { - if (listViewRules.SelectedItems.Count != 1 || listViewRules.Items.Count < 2) - { - return; - } - - int index = listViewRules.SelectedIndices[0]; - int bottomIndex = listViewRules.Items.Count - 1; - if (index == bottomIndex) - { - return; - } - - var temp = _currentGroup.Rules[index]; - _currentGroup.Rules.Remove(temp); - _currentGroup.Rules.Add(temp); - listViewGroups_SelectedIndexChanged(null, null); - listViewRules.Items[0].Selected = false; - listViewRules.Items[bottomIndex].Selected = true; - listViewRules.Items[bottomIndex].Focused = true; - listViewRules.EnsureVisible(bottomIndex); - GeneratePreview(); - } - - private void ImportRulesFile(string fileName) - { - if (_currentGroup == null) - { - return; - } - - var doc = new XmlDocument { XmlResolver = null }; - doc.Load(fileName); - - var replaceNodes = doc.DocumentElement?.SelectNodes("//MultipleSearchAndReplaceItem"); - if (replaceNodes == null) - { - return; - } - - foreach (XmlNode listNode in replaceNodes) - { - var item = MakeMultipleSearchAndReplaceSetting(listNode); - AddToRulesListView(item); - _currentGroup.Rules.Add(item); - } - } - - private List ImportGroupsFile(string fileName) - { - var list = new List(); - var doc = new XmlDocument { XmlResolver = null }; - doc.Load(fileName); - var groups = doc.DocumentElement?.SelectNodes("//Group"); - if (groups != null) - { - foreach (XmlNode groupNode in groups) - { - var group = new MultipleSearchAndReplaceGroup(); - var nameNode = groupNode.SelectSingleNode(GroupName); - var enabledNode = groupNode.SelectSingleNode(GroupEnabled); - - group.Name = nameNode != null ? nameNode.InnerText : "Untitled"; - group.Enabled = enabledNode != null ? Convert.ToBoolean(enabledNode.InnerText) : false; - - group.Rules = new List(); - list.Add(group); - - var replaceItems = groupNode.SelectNodes("MultipleSearchAndReplaceItem"); - if (replaceItems != null) - { - foreach (XmlNode listNode in replaceItems) - { - var item = MakeMultipleSearchAndReplaceSetting(listNode); - group.Rules.Add(item); - } - } - } - } - - if (list.Count == 0) - { - // import into "untitled" group if only rules - var group = new MultipleSearchAndReplaceGroup - { - Name = "untitled", - Rules = new List() - }; - var replaceItems = doc.DocumentElement?.SelectNodes("//MultipleSearchAndReplaceItem"); - if (replaceItems != null) - { - foreach (XmlNode listNode in replaceItems) - { - var item = MakeMultipleSearchAndReplaceSetting(listNode); - group.Rules.Add(item); - } - } - - if (group.Rules.Count > 0) - { - list.Add(group); - } - } - - return list; - } - - private static MultipleSearchAndReplaceSetting MakeMultipleSearchAndReplaceSetting(XmlNode listNode) - { - var item = new MultipleSearchAndReplaceSetting(); - var subNode = listNode.SelectSingleNode(RuleEnabled); - if (subNode != null) - { - item.Enabled = Convert.ToBoolean(subNode.InnerText); - } - - subNode = listNode.SelectSingleNode(FindWhat); - if (subNode != null) - { - item.FindWhat = subNode.InnerText; - } - - subNode = listNode.SelectSingleNode(ReplaceWith); - if (subNode != null) - { - item.ReplaceWith = subNode.InnerText; - } - - subNode = listNode.SelectSingleNode(SearchType); - if (subNode != null) - { - item.SearchType = subNode.InnerText; - } - - subNode = listNode.SelectSingleNode(SearchType); - if (subNode != null) - { - item.SearchType = subNode.InnerText; - } - - subNode = listNode.SelectSingleNode(Description); - if (subNode != null) - { - item.Description = subNode.InnerText; - } - - return item; - } - - private void MultipleReplace_Shown(object sender, EventArgs e) - { - GeneratePreview(); - listViewRules.ItemChecked += ListViewRulesItemChecked; - listViewGroups.ItemChecked += listViewGroups_ItemChecked; - listViewGroups.SelectedIndexChanged += listViewGroups_SelectedIndexChanged; - MultipleReplace_ResizeEnd(sender, null); - listViewGroups_SelectedIndexChanged(null, null); - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - Configuration.Settings.MultipleSearchAndReplaceGroups = _oldMultipleSearchAndReplaceGroups; - DialogResult = DialogResult.Cancel; - } - - private void buttonNewGroup_Click(object sender, EventArgs e) - { - newToolStripMenuItem_Click(sender, null); - } - - private void newToolStripMenuItem_Click(object sender, EventArgs e) - { - using (var form = new MultipleReplaceNewGroup(string.Empty)) - { - if (form.ShowDialog(this) == DialogResult.OK && form.GroupName.Length > 0) - { - var newGroup = new MultipleSearchAndReplaceGroup { Enabled = true, Name = form.GroupName, Rules = new List() }; - Configuration.Settings.MultipleSearchAndReplaceGroups.Add(newGroup); - UpdateViewFromModel(Configuration.Settings.MultipleSearchAndReplaceGroups, newGroup); - } - } - } - - private void UpdateViewFromModel(List groups, MultipleSearchAndReplaceGroup focusGroup) - { - listViewGroups.BeginUpdate(); - listViewGroups.Items.Clear(); - for (int index = 0; index < groups.Count; index++) - { - var group = groups[index]; - var lvi = new ListViewItem(group.Name) { Checked = group.Enabled, Tag = group }; - listViewGroups.Items.Add(lvi); - if (group == focusGroup) - { - listViewGroups.Items[index].Selected = true; - listViewGroups.Items[index].Focused = true; - listViewGroups.EnsureVisible(index); - } - } - listViewGroups.EndUpdate(); - if (groups.Count == 0) - { - groupBoxReplaces.Text = string.Empty; - textBoxFind.Text = string.Empty; - textBoxReplace.Text = string.Empty; - textBoxDescription.Text = string.Empty; - textBoxDescription.Text = string.Empty; - radioButtonNormal.Checked = true; - } - } - - private void listViewGroups_SelectedIndexChanged(object sender, EventArgs e) - { - if (listViewGroups.SelectedItems.Count < 1) - { - return; - } - - _currentGroup = listViewGroups.SelectedItems[0].Tag as MultipleSearchAndReplaceGroup; - if (_currentGroup == null) - { - return; - } - - listViewRules.ItemChecked -= ListViewRulesItemChecked; - listViewGroups.ItemChecked -= listViewGroups_ItemChecked; - listViewRules.BeginUpdate(); - groupBoxReplaces.Text = string.Format(Configuration.Settings.Language.MultipleReplace.RulesForGroupX, _currentGroup.Name); - listViewRules.Items.Clear(); - foreach (var rule in _currentGroup.Rules) - { - AddToRulesListView(rule); - } - if (_currentGroup.Rules.Count > 0) - { - listViewRules.Items[0].Selected = true; - } - else - { - textBoxFind.Text = string.Empty; - textBoxReplace.Text = string.Empty; - textBoxDescription.Text = string.Empty; - } - listViewRules.EndUpdate(); - listViewRules.ItemChecked += ListViewRulesItemChecked; - listViewGroups.ItemChecked += listViewGroups_ItemChecked; - } - - private void listViewGroups_ItemChecked(object sender, ItemCheckedEventArgs e) - { - var group = e.Item.Tag as MultipleSearchAndReplaceGroup; - if (group == null) - { - return; - } - - group.Enabled = e.Item.Checked; - GeneratePreview(); - } - - private void ListViewRulesItemChecked(object sender, ItemCheckedEventArgs e) - { - if (!(e.Item.Tag is MultipleSearchAndReplaceSetting rule)) - { - return; - } - - rule.Enabled = e.Item.Checked; - GeneratePreview(); - } - - private void toolStripMenuItem2_Click(object sender, EventArgs e) - { - if (_currentGroup == null) - { - return; - } - - _currentGroup.Rules.Clear(); - listViewRules.Items.Clear(); - GeneratePreview(); - } - - private void toolStripMenuItem4_Click(object sender, EventArgs e) - { - if (_currentGroup == null || _currentGroup.Rules.Count == 0) - { - return; - } - - saveFileDialog1.Title = Configuration.Settings.Language.MultipleReplace.ExportRulesTitle; - saveFileDialog1.Filter = Configuration.Settings.Language.MultipleReplace.Rules + TemplateFilterExtension; - if (saveFileDialog1.ShowDialog(this) == DialogResult.OK) - { - var textWriter = new XmlTextWriter(saveFileDialog1.FileName, null) { Formatting = Formatting.Indented }; - textWriter.WriteStartDocument(); - textWriter.WriteStartElement("Settings", string.Empty); - textWriter.WriteStartElement("MultipleSearchAndReplaceList", string.Empty); - textWriter.WriteStartElement(Group, string.Empty); - textWriter.WriteElementString(GroupName, _currentGroup.Name); - foreach (var item in _currentGroup.Rules) - { - textWriter.WriteStartElement(MultipleSearchAndReplaceItem, string.Empty); - textWriter.WriteElementString(RuleEnabled, item.Enabled.ToString()); - textWriter.WriteElementString(FindWhat, item.FindWhat); - textWriter.WriteElementString(ReplaceWith, item.ReplaceWith); - textWriter.WriteElementString(SearchType, item.SearchType); - textWriter.WriteElementString(Description, item.Description); - textWriter.WriteEndElement(); - } - textWriter.WriteEndElement(); - textWriter.WriteEndElement(); - textWriter.WriteEndElement(); - textWriter.WriteEndDocument(); - textWriter.Close(); - } - } - - private void toolStripMenuItem3_Click(object sender, EventArgs e) - { - if (_currentGroup == null) - { - return; - } - - openFileDialog1.Title = Configuration.Settings.Language.MultipleReplace.ImportRulesTitle; - openFileDialog1.Filter = Configuration.Settings.Language.MultipleReplace.Rules + TemplateFilterExtension; - if (openFileDialog1.ShowDialog(this) == DialogResult.OK) - { - try - { - ImportRulesFile(openFileDialog1.FileName); - } - catch (Exception exception) - { - MessageBox.Show(exception.Message); - return; - } - GeneratePreview(); - } - } - - private void ToolStripMenuItemRenameClick(object sender, EventArgs e) - { - if (_currentGroup == null) - { - return; - } - - using (var form = new MultipleReplaceNewGroup(_currentGroup.Name)) - { - if (form.ShowDialog(this) == DialogResult.OK && form.GroupName.Length > 0) - { - _currentGroup.Name = form.GroupName; - UpdateViewFromModel(Configuration.Settings.MultipleSearchAndReplaceGroups, _currentGroup); - } - } - } - - private void deleteToolStripMenuItem1_Click(object sender, EventArgs e) - { - if (_currentGroup == null) - { - return; - } - - var idx = Configuration.Settings.MultipleSearchAndReplaceGroups.IndexOf(_currentGroup); - Configuration.Settings.MultipleSearchAndReplaceGroups.RemoveAt(idx); - if (Configuration.Settings.MultipleSearchAndReplaceGroups.Count > 0) - { - if (idx >= Configuration.Settings.MultipleSearchAndReplaceGroups.Count) - { - idx--; - } - - _currentGroup = Configuration.Settings.MultipleSearchAndReplaceGroups[idx]; - } - else - { - _currentGroup = null; - listViewRules.Items.Clear(); - listViewFixes.Items.Clear(); - } - UpdateViewFromModel(Configuration.Settings.MultipleSearchAndReplaceGroups, _currentGroup); - } - - private void SwapGroups(int index, int index2) - { - var temp = Configuration.Settings.MultipleSearchAndReplaceGroups[index]; - Configuration.Settings.MultipleSearchAndReplaceGroups[index] = Configuration.Settings.MultipleSearchAndReplaceGroups[index2]; - Configuration.Settings.MultipleSearchAndReplaceGroups[index2] = temp; - - UpdateViewFromModel(Configuration.Settings.MultipleSearchAndReplaceGroups, _currentGroup); - GeneratePreview(); - } - - private void moveUpToolStripMenuItem1_Click(object sender, EventArgs e) - { - if (listViewGroups.Items.Count < 2 || listViewGroups.SelectedItems.Count == 0) - { - return; - } - - int index = listViewGroups.SelectedIndices[0]; - if (index == 0) - { - return; - } - - SwapGroups(index, index - 1); - } - - private void moveDownToolStripMenuItem1_Click(object sender, EventArgs e) - { - if (listViewGroups.Items.Count < 2 || listViewGroups.SelectedItems.Count == 0) - { - return; - } - - int index = listViewGroups.SelectedIndices[0]; - if (index == listViewGroups.Items.Count - 1) - { - return; - } - - SwapGroups(index, index + 1); - } - - private void MultipleReplace_ResizeEnd(object sender, EventArgs e) - { - listViewRules.Columns[listViewRules.Columns.Count - 1].Width = -2; - } - - private void moveToTopToolStripMenuItem_Click(object sender, EventArgs e) - { - if (listViewGroups.Items.Count < 2 || listViewGroups.SelectedItems.Count == 0) - { - return; - } - - int index = listViewGroups.SelectedIndices[0]; - if (index == 0) - { - return; - } - - var temp = Configuration.Settings.MultipleSearchAndReplaceGroups[index]; - Configuration.Settings.MultipleSearchAndReplaceGroups.Remove(temp); - Configuration.Settings.MultipleSearchAndReplaceGroups.Insert(0, temp); - UpdateViewFromModel(Configuration.Settings.MultipleSearchAndReplaceGroups, _currentGroup); - GeneratePreview(); - } - - private void moveToBottomToolStripMenuItem_Click(object sender, EventArgs e) - { - if (listViewGroups.Items.Count < 2 || listViewGroups.SelectedItems.Count == 0) - { - return; - } - - int index = listViewGroups.SelectedIndices[0]; - int bottomIndex = listViewGroups.Items.Count - 1; - if (index == bottomIndex) - { - return; - } - - var temp = Configuration.Settings.MultipleSearchAndReplaceGroups[index]; - Configuration.Settings.MultipleSearchAndReplaceGroups.Remove(temp); - Configuration.Settings.MultipleSearchAndReplaceGroups.Insert(bottomIndex, temp); - UpdateViewFromModel(Configuration.Settings.MultipleSearchAndReplaceGroups, temp); - GeneratePreview(); - } - - private void contextMenuStripGroups_Opening(object sender, System.ComponentModel.CancelEventArgs e) - { - bool doShow = listViewGroups.SelectedItems.Count > 0; - foreach (ToolStripItem item in contextMenuStripGroups.Items) - { - if (item != newToolStripMenuItem && - item != toolStripSeparatorGroupImportExport && - item != importToolStripMenuItem) - { - item.Visible = doShow; - } - if (item == exportToolStripMenuItem) - { - item.Visible = listViewGroups.Items.Count > 0; - } - } - } - - private void buttonApply_Click(object sender, EventArgs e) - { - SetDeleteIndices(); - ResetUncheckLines(); - _subtitle = new Subtitle(FixedSubtitle); - GeneratePreview(); - } - - private void exportToolStripMenuItem_Click(object sender, EventArgs e) - { - if (listViewGroups.Items.Count == 0) - { - return; - } - - using (var form = new MultipleReplaceExportImport(Configuration.Settings.MultipleSearchAndReplaceGroups, true)) - { - form.ShowDialog(this); - } - } - - private void importToolStripMenuItem_Click(object sender, EventArgs e) - { - openFileDialog1.Title = Configuration.Settings.Language.MultipleReplace.ImportRulesTitle; - openFileDialog1.Filter = Configuration.Settings.Language.MultipleReplace.Rules + TemplateFilterExtension; - if (openFileDialog1.ShowDialog(this) == DialogResult.OK) - { - try - { - var importGroups = ImportGroupsFile(openFileDialog1.FileName); - if (importGroups.Count == 0) - { - MessageBox.Show(Configuration.Settings.Language.MultipleReplace.NothingToImport); - return; - } - - using (var form = new MultipleReplaceExportImport(importGroups, false)) - { - if (form.ShowDialog(this) == DialogResult.OK) - { - var oldGroupsSelectedIndex = listViewGroups.SelectedIndices.Count == 0 ? -1 : listViewGroups.SelectedIndices[0]; - foreach (var importGroup in importGroups.Where(g => form.ChosenGroups.Contains(g.Name))) - { - importGroup.Name = FixDuplicateName(importGroup.Name, Configuration.Settings.MultipleSearchAndReplaceGroups); - Configuration.Settings.MultipleSearchAndReplaceGroups.Add(importGroup); - } - UpdateViewFromModel(Configuration.Settings.MultipleSearchAndReplaceGroups, _currentGroup); - if (oldGroupsSelectedIndex == -1 && listViewGroups.Items.Count > 0) - { - listViewGroups.Items[0].Selected = true; - } - } - } - } - catch (Exception exception) - { - MessageBox.Show(exception.Message); - return; - } - GeneratePreview(); - } - } - - private static string FixDuplicateName(string newGroupName, List existinGroups) - { - if (existinGroups.All(p => p.Name != newGroupName)) - { - return newGroupName; - } - - for (int i = 1; i < int.MaxValue; i++) - { - var name = $"{newGroupName}_{i}"; - if (existinGroups.All(p => p.Name != name)) - { - return name; - } - } - - return Guid.NewGuid().ToString(); - } - - private void buttonImportGroups_Click(object sender, EventArgs e) - { - importToolStripMenuItem_Click(sender, e); - } - - private void buttonExportGroups_Click(object sender, EventArgs e) - { - exportToolStripMenuItem_Click(sender, e); - } - - private void listViewFixes_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.A && e.Modifiers == Keys.Control) - { - listViewFixes.SelectAll(); - e.SuppressKeyPress = true; - } - else if (e.KeyCode == Keys.D && e.Modifiers == Keys.Control) - { - listViewFixes.SelectFirstSelectedItemOnly(); - e.SuppressKeyPress = true; - } - else if (e.KeyCode == Keys.I && e.Modifiers == (Keys.Control | Keys.Shift)) //InverseSelection - { - listViewFixes.InverseSelection(); - e.SuppressKeyPress = true; - } - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text.RegularExpressions; +using System.Windows.Forms; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class MultipleReplace : PositionAndSizeForm + { + internal const string Group = "Group"; + internal const string GroupName = "Name"; + internal const string GroupEnabled = "Enabled"; + internal const string MultipleSearchAndReplaceItem = "MultipleSearchAndReplaceItem"; + internal const string RuleEnabled = "Enabled"; + internal const string FindWhat = "FindWhat"; + internal const string ReplaceWith = "ReplaceWith"; + internal const string SearchType = "SearchType"; + internal const string Description = "Description"; + + private const string TemplateFilterExtension = "|*.template"; + + private readonly List _oldMultipleSearchAndReplaceGroups = new List(); + private readonly Dictionary _compiledRegExList = new Dictionary(); + private Subtitle _subtitle; + private Subtitle _original; + public Subtitle FixedSubtitle { get; private set; } + public int FixCount { get; private set; } + public List DeleteIndices { get; } + + public void SetDeleteIndices() + { + foreach (ListViewItem item in listViewFixes.Items) + { + if (item.Checked && item.SubItems[3].Text == string.Empty) + { + var index = _subtitle.GetIndex(item.Tag as Paragraph); + if (!DeleteIndices.Contains(index)) + { + DeleteIndices.Add(index); + } + } + } + } + + private MultipleSearchAndReplaceGroup _currentGroup; + + public MultipleReplace() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + DeleteIndices = new List(); + openFileDialog1.FileName = string.Empty; + saveFileDialog1.FileName = string.Empty; + + textBoxReplace.ContextMenu = FindReplaceDialogHelper.GetReplaceTextContextMenu(textBoxReplace); + buttonUpdate.Enabled = false; + + Text = Configuration.Settings.Language.MultipleReplace.Title; + labelFindWhat.Text = Configuration.Settings.Language.MultipleReplace.FindWhat; + labelReplaceWith.Text = Configuration.Settings.Language.MultipleReplace.ReplaceWith; + labelDescription.Text = Configuration.Settings.Language.MultipleReplace.Description; + radioButtonNormal.Text = Configuration.Settings.Language.MultipleReplace.Normal; + radioButtonRegEx.Text = Configuration.Settings.Language.MultipleReplace.RegularExpression; + radioButtonCaseSensitive.Text = Configuration.Settings.Language.MultipleReplace.CaseSensitive; + buttonAdd.Text = Configuration.Settings.Language.MultipleReplace.Add; + buttonUpdate.Text = Configuration.Settings.Language.MultipleReplace.Update; + listViewRules.Columns[0].Text = Configuration.Settings.Language.MultipleReplace.Enabled; + listViewRules.Columns[1].Text = Configuration.Settings.Language.MultipleReplace.FindWhat; + listViewRules.Columns[2].Text = Configuration.Settings.Language.MultipleReplace.ReplaceWith; + listViewRules.Columns[3].Text = Configuration.Settings.Language.MultipleReplace.SearchType; + listViewRules.Columns[4].Text = Configuration.Settings.Language.MultipleReplace.Description; + groupBoxGroups.Text = Configuration.Settings.Language.MultipleReplace.Groups; + groupBoxLinesFound.Text = string.Empty; + listViewFixes.Columns[0].Text = Configuration.Settings.Language.General.Apply; + listViewFixes.Columns[1].Text = Configuration.Settings.Language.General.LineNumber; + listViewFixes.Columns[2].Text = Configuration.Settings.Language.General.Before; + listViewFixes.Columns[3].Text = Configuration.Settings.Language.General.After; + deleteToolStripMenuItem.Text = Configuration.Settings.Language.MultipleReplace.Remove; + toolStripMenuItemRemoveAll.Text = Configuration.Settings.Language.MultipleReplace.RemoveAll; + toolStripMenuItemImport.Text = Configuration.Settings.Language.MultipleReplace.Import; + toolStripMenuItemExport.Text = Configuration.Settings.Language.MultipleReplace.Export; + importToolStripMenuItem.Text = Configuration.Settings.Language.MultipleReplace.Import; + exportToolStripMenuItem.Text = Configuration.Settings.Language.MultipleReplace.Export; + buttonImportGroups.Text = Configuration.Settings.Language.MultipleReplace.Import; + buttonExportGroups.Text = Configuration.Settings.Language.MultipleReplace.Export; + buttonNewGroup.Text = Configuration.Settings.Language.MultipleReplace.NewGroup; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + buttonApply.Text = Configuration.Settings.Language.General.Apply; + buttonReplacesSelectAll.Text = Configuration.Settings.Language.FixCommonErrors.SelectAll; + buttonReplacesInverseSelection.Text = Configuration.Settings.Language.FixCommonErrors.InverseSelection; + UiUtil.FixLargeFonts(this, buttonOK); + splitContainer1.Panel1MinSize = 200; + splitContainer1.Panel2MinSize = 200; + + moveUpToolStripMenuItem.Text = Configuration.Settings.Language.DvdSubRip.MoveUp; + moveDownToolStripMenuItem.Text = Configuration.Settings.Language.DvdSubRip.MoveDown; + moveTopToolStripMenuItem.Text = Configuration.Settings.Language.MultipleReplace.MoveToTop; + moveBottomToolStripMenuItem.Text = Configuration.Settings.Language.MultipleReplace.MoveToBottom; + newToolStripMenuItem.Text = Configuration.Settings.Language.MultipleReplace.NewGroup; + + toolStripMenuItemMoveRulesToGroup.Text = Configuration.Settings.Language.MultipleReplace.MoveSelectedRulesToGroup; + moveUpToolStripMenuItem1.Text = Configuration.Settings.Language.DvdSubRip.MoveUp; + moveDownToolStripMenuItem1.Text = Configuration.Settings.Language.DvdSubRip.MoveDown; + moveToTopToolStripMenuItem.Text = Configuration.Settings.Language.MultipleReplace.MoveToTop; + moveToBottomToolStripMenuItem.Text = Configuration.Settings.Language.MultipleReplace.MoveToBottom; + toolStripMenuItemRename.Text = Configuration.Settings.Language.MultipleReplace.RenameGroup; + deleteToolStripMenuItem1.Text = Configuration.Settings.Language.MultipleReplace.Remove; + + radioButtonCaseSensitive.Left = radioButtonNormal.Left + radioButtonNormal.Width + 40; + radioButtonRegEx.Left = radioButtonCaseSensitive.Left + radioButtonCaseSensitive.Width + 40; + } + + public void Initialize(Subtitle subtitle) + { + _subtitle = subtitle ?? throw new ArgumentNullException(nameof(subtitle)); + _original = new Subtitle(_subtitle); + _oldMultipleSearchAndReplaceGroups.Clear(); + + if (Configuration.Settings.MultipleSearchAndReplaceGroups.Count == 0) + { + Configuration.Settings.MultipleSearchAndReplaceGroups.Add(new MultipleSearchAndReplaceGroup { Enabled = true, Name = "Default", Rules = new List() }); + } + + foreach (var group in Configuration.Settings.MultipleSearchAndReplaceGroups) + { + var oldGroup = new MultipleSearchAndReplaceGroup { Name = group.Name, Enabled = group.Enabled, Rules = new List() }; + foreach (var rule in group.Rules) + { + oldGroup.Rules.Add(rule); + } + _oldMultipleSearchAndReplaceGroups.Add(oldGroup); + } + + if (subtitle.Paragraphs == null || subtitle.Paragraphs.Count == 0) + { + groupBoxLinesFound.Enabled = false; + } + + UpdateViewFromModel(Configuration.Settings.MultipleSearchAndReplaceGroups, Configuration.Settings.MultipleSearchAndReplaceGroups[0]); + } + + internal void RunFromBatch(Subtitle subtitle) + { + Initialize(subtitle); + GeneratePreview(); + SetDeleteIndices(); + } + + internal void RunFromBatch(Subtitle subtitle, IEnumerable importFileNames) + { + var savedList = Configuration.Settings.MultipleSearchAndReplaceGroups; + try + { + Configuration.Settings.MultipleSearchAndReplaceGroups = new List(); + foreach (var fileName in importFileNames) + { + if (fileName.Equals(".")) + { + Configuration.Settings.MultipleSearchAndReplaceGroups.AddRange(savedList); + } + else + { + Configuration.Settings.MultipleSearchAndReplaceGroups.AddRange(ImportGroupsFile(fileName)); + } + } + RunFromBatch(subtitle); + } + finally + { + Configuration.Settings.MultipleSearchAndReplaceGroups = savedList; + } + } + + private void MultipleReplace_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + buttonCancel_Click(null, null); + } + else if (e.KeyCode == UiUtil.HelpKeys) + { + Utilities.ShowHelp("#multiple_replace"); + } + } + + private void RadioButtonCheckedChanged(object sender, EventArgs e) + { + textBoxFind.ContextMenu = sender == radioButtonRegEx ? FindReplaceDialogHelper.GetRegExContextMenu(textBoxFind) : null; + } + + private void ButtonAddClick(object sender, EventArgs e) + { + if (_currentGroup == null) + { + return; + } + + string findText = textBoxFind.Text.RemoveControlCharacters(); + if (findText.Length > 0) + { + string searchType = ReplaceExpression.SearchTypeNormal; + if (radioButtonCaseSensitive.Checked) + { + searchType = ReplaceExpression.SearchTypeCaseSensitive; + } + else if (radioButtonRegEx.Checked) + { + searchType = ReplaceExpression.SearchTypeRegularExpression; + if (!RegexUtils.IsValidRegex(findText)) + { + MessageBox.Show(Configuration.Settings.Language.General.RegularExpressionIsNotValid); + textBoxFind.Select(); + return; + } + } + + var rule = new MultipleSearchAndReplaceSetting { Enabled = true, FindWhat = findText, ReplaceWith = textBoxReplace.Text, SearchType = searchType, Description = textBoxDescription.Text }; + _currentGroup.Rules.Add(rule); + AddToRulesListView(rule); + textBoxFind.Text = string.Empty; + textBoxReplace.Text = string.Empty; + textBoxDescription.Text = string.Empty; + GeneratePreview(); + textBoxFind.Select(); + } + } + + private void GeneratePreview() + { + Cursor = Cursors.WaitCursor; + FixedSubtitle = new Subtitle(_subtitle); + int fixedLines = 0; + listViewFixes.BeginUpdate(); + listViewFixes.Items.Clear(); + var replaceExpressions = new HashSet(); + foreach (var group in Configuration.Settings.MultipleSearchAndReplaceGroups) + { + if (group.Enabled) + { + foreach (var rule in group.Rules) + { + if (rule.Enabled) + { + string findWhat = rule.FindWhat; + if (!string.IsNullOrEmpty(findWhat)) // allow space or spaces + { + string replaceWith = RegexUtils.FixNewLine(rule.ReplaceWith); + findWhat = RegexUtils.FixNewLine(findWhat); + string searchType = rule.SearchType; + var mpi = new ReplaceExpression(findWhat, replaceWith, searchType); + replaceExpressions.Add(mpi); + if (mpi.SearchType == ReplaceExpression.SearchRegEx && !_compiledRegExList.ContainsKey(findWhat)) + { + _compiledRegExList.Add(findWhat, new Regex(findWhat, RegexOptions.Compiled | RegexOptions.Multiline)); + } + } + } + } + } + } + + var fixes = new List(); + for (var i = 0; i < _subtitle.Paragraphs.Count; i++) + { + Paragraph p = _subtitle.Paragraphs[i]; + bool hit = false; + string newText = p.Text; + foreach (ReplaceExpression item in replaceExpressions) + { + if (item.SearchType == ReplaceExpression.SearchCaseSensitive) + { + if (newText.Contains(item.FindWhat)) + { + hit = true; + newText = newText.Replace(item.FindWhat, item.ReplaceWith); + } + } + else if (item.SearchType == ReplaceExpression.SearchRegEx) + { + Regex r = _compiledRegExList[item.FindWhat]; + if (r.IsMatch(newText)) + { + hit = true; + newText = RegexUtils.ReplaceNewLineSafe(r, newText, item.ReplaceWith); + } + } + else + { + int index = newText.IndexOf(item.FindWhat, StringComparison.OrdinalIgnoreCase); + if (index >= 0) + { + hit = true; + do + { + newText = newText.Remove(index, item.FindWhat.Length).Insert(index, item.ReplaceWith); + index = newText.IndexOf(item.FindWhat, index + item.ReplaceWith.Length, StringComparison.OrdinalIgnoreCase); + } while (index >= 0); + } + } + } + + if (hit && newText != p.Text) + { + fixedLines++; + fixes.Add(MakePreviewListItem(p, newText)); + FixedSubtitle.Paragraphs[i].Text = newText; + } + } + + listViewFixes.Items.AddRange(fixes.ToArray()); + listViewFixes.EndUpdate(); + groupBoxLinesFound.Text = string.Format(Configuration.Settings.Language.MultipleReplace.LinesFoundX, fixedLines); + Cursor = Cursors.Default; + } + + private void AddToRulesListView(MultipleSearchAndReplaceSetting rule) + { + var item = new ListViewItem(string.Empty) { Checked = rule.Enabled, Tag = rule }; + item.SubItems.Add(rule.FindWhat); + item.SubItems.Add(rule.ReplaceWith); + item.SubItems.Add(EnglishSearchTypeToLocal(rule.SearchType)); + item.SubItems.Add(rule.Description); + listViewRules.Items.Add(item); + } + + private ListViewItem MakePreviewListItem(Paragraph p, string newText) + { + var item = new ListViewItem(string.Empty) { Tag = p, Checked = true }; + item.SubItems.Add(p.Number.ToString(CultureInfo.InvariantCulture)); + item.SubItems.Add(UiUtil.GetListViewTextFromString(p.Text)); + item.SubItems.Add(UiUtil.GetListViewTextFromString(newText)); + return item; + } + + private static string LocalSearchTypeToEnglish(string searchType) + { + if (searchType == Configuration.Settings.Language.MultipleReplace.RegularExpression) + { + return ReplaceExpression.SearchTypeRegularExpression; + } + + if (searchType == Configuration.Settings.Language.MultipleReplace.CaseSensitive) + { + return ReplaceExpression.SearchTypeCaseSensitive; + } + + return ReplaceExpression.SearchTypeNormal; + } + + private static string EnglishSearchTypeToLocal(string searchType) + { + if (searchType == ReplaceExpression.SearchTypeRegularExpression) + { + return Configuration.Settings.Language.MultipleReplace.RegularExpression; + } + + if (searchType == ReplaceExpression.SearchTypeCaseSensitive) + { + return Configuration.Settings.Language.MultipleReplace.CaseSensitive; + } + + return Configuration.Settings.Language.MultipleReplace.Normal; + } + + private void buttonOK_Click(object sender, EventArgs e) + { + SetDeleteIndices(); + ResetUncheckLines(); + SetFixCount(); + SaveReplaceList(true); + DialogResult = DialogResult.OK; + } + + public void SetFixCount() + { + for (var index = 0; index < _original.Paragraphs.Count; index++) + { + var p = _original.Paragraphs[index]; + var f = FixedSubtitle.GetParagraphOrDefault(index); + if (f != null && f.Text != p.Text) + { + FixCount++; + } + } + } + + private void SaveReplaceList(bool saveToDisk) + { + if (saveToDisk) + { + Configuration.Settings.Save(); + } + } + + private void ResetUncheckLines() + { + foreach (ListViewItem item in listViewFixes.Items) + { + if (!item.Checked) + { + int index = _subtitle.GetIndex(item.Tag as Paragraph); + FixedSubtitle.Paragraphs[index].Text = _subtitle.Paragraphs[index].Text; + } + } + } + + private void DeleteToolStripMenuItemClick(object sender, EventArgs e) + { + if (listViewRules.Items.Count < 1 || listViewRules.SelectedItems.Count < 1 || _currentGroup == null) + { + return; + } + + listViewRules.BeginUpdate(); + for (int i = listViewRules.Items.Count - 1; i >= 0; i--) + { + ListViewItem item = listViewRules.Items[i]; + if (item.Selected) + { + item.Remove(); + _currentGroup.Rules.Remove(item.Tag as MultipleSearchAndReplaceSetting); + } + } + listViewRules.EndUpdate(); + GeneratePreview(); + } + + private void ListViewRulesKeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.A && e.Modifiers == Keys.Control) + { + listViewRules.SelectAll(); + e.SuppressKeyPress = true; + } + else if (e.KeyCode == Keys.D && e.Modifiers == Keys.Control) + { + listViewRules.SelectFirstSelectedItemOnly(); + e.SuppressKeyPress = true; + } + else if (e.KeyCode == Keys.I && e.Modifiers == (Keys.Control | Keys.Shift)) //InverseSelection + { + listViewRules.InverseSelection(); + e.SuppressKeyPress = true; + } + } + + private void ButtonUpdateClick(object sender, EventArgs e) + { + if (listViewRules.SelectedItems.Count != 1 || _currentGroup == null) + { + return; + } + + string findText = textBoxFind.Text.RemoveControlCharacters(); + textBoxFind.Text = findText; + + string replaceText = textBoxReplace.Text.RemoveControlCharacters(); + textBoxReplace.Text = replaceText; + + if (findText.Length > 0) + { + string searchType = ReplaceExpression.SearchTypeNormal; + if (radioButtonCaseSensitive.Checked) + { + searchType = ReplaceExpression.SearchTypeCaseSensitive; + } + else if (radioButtonRegEx.Checked) + { + searchType = ReplaceExpression.SearchTypeRegularExpression; + if (!RegexUtils.IsValidRegex(findText)) + { + MessageBox.Show(Configuration.Settings.Language.General.RegularExpressionIsNotValid); + textBoxFind.Select(); + return; + } + } + + var item = listViewRules.SelectedItems[0]; + item.SubItems[1].Text = findText; + item.SubItems[2].Text = replaceText; + item.SubItems[3].Text = EnglishSearchTypeToLocal(searchType); + item.SubItems[4].Text = textBoxDescription.Text; + + _currentGroup.Rules[item.Index].FindWhat = findText; + _currentGroup.Rules[item.Index].ReplaceWith = replaceText; + _currentGroup.Rules[item.Index].SearchType = searchType; + _currentGroup.Rules[item.Index].Description = textBoxDescription.Text; + + GeneratePreview(); + textBoxFind.Select(); + } + } + + private void ListViewReplaceListSelectedIndexChanged(object sender, EventArgs e) + { + if (listViewRules.SelectedItems.Count == 1) + { + buttonUpdate.Enabled = true; + textBoxFind.Text = listViewRules.SelectedItems[0].SubItems[1].Text; + textBoxReplace.Text = listViewRules.SelectedItems[0].SubItems[2].Text; + string searchType = LocalSearchTypeToEnglish(listViewRules.SelectedItems[0].SubItems[3].Text); + if (searchType == ReplaceExpression.SearchTypeRegularExpression) + { + radioButtonRegEx.Checked = true; + } + else if (searchType == ReplaceExpression.SearchTypeCaseSensitive) + { + radioButtonCaseSensitive.Checked = true; + } + else + { + radioButtonNormal.Checked = true; + } + + textBoxDescription.Text = listViewRules.SelectedItems[0].SubItems[4].Text; + } + else + { + buttonUpdate.Enabled = false; + } + } + + private void TextBoxReplaceKeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + ButtonAddClick(null, null); + } + } + + private void buttonReplacesSelectAll_Click(object sender, EventArgs e) + { + foreach (ListViewItem item in listViewFixes.Items) + { + item.Checked = true; + } + } + + private void buttonReplacesInverseSelection_Click(object sender, EventArgs e) + { + foreach (ListViewItem item in listViewFixes.Items) + { + item.Checked = !item.Checked; + } + } + + private void contextMenuStrip1_Opening(object sender, System.ComponentModel.CancelEventArgs e) + { + bool moreThanOneGroup = Configuration.Settings.MultipleSearchAndReplaceGroups.Count > 1; + bool isVisible = listViewRules.Items.Count > 1 && listViewRules.SelectedItems.Count == 1; + toolStripSeparator3.Visible = isVisible; + moveUpToolStripMenuItem.Visible = isVisible; + moveDownToolStripMenuItem.Visible = isVisible; + moveTopToolStripMenuItem.Visible = isVisible; + moveBottomToolStripMenuItem.Visible = isVisible; + + toolStripMenuItemExport.Visible = listViewRules.Items.Count > 0; + toolStripMenuItemRemoveAll.Visible = listViewRules.Items.Count > 0; + toolStripSeparator2.Visible = listViewRules.Items.Count > 0; + + deleteToolStripMenuItem.Visible = listViewRules.SelectedItems.Count >= 1; + + if (moreThanOneGroup && listViewRules.SelectedItems.Count >= 1) + { + toolStripMenuItemMoveRulesToGroup.Visible = true; + toolStripSeparator4.Visible = true; + toolStripMenuItemMoveRulesToGroup.DropDownItems.Clear(); + foreach (var g in Configuration.Settings.MultipleSearchAndReplaceGroups) + { + if (g != _currentGroup) + { + var menuItem = new ToolStripMenuItem(g.Name) { Tag = g }; + menuItem.Click += (o, args) => { MoveRulesToGroup(g); }; + toolStripMenuItemMoveRulesToGroup.DropDownItems.Add(menuItem); + } + } + } + else + { + toolStripMenuItemMoveRulesToGroup.Visible = false; + toolStripSeparator4.Visible = false; + } + } + + private void MoveRulesToGroup(MultipleSearchAndReplaceGroup newGroup) + { + foreach (ListViewItem item in listViewRules.SelectedItems) + { + var rule = (MultipleSearchAndReplaceSetting)item.Tag; + _currentGroup.Rules.Remove(rule); + newGroup.Rules.Add(rule); + } + UpdateViewFromModel(Configuration.Settings.MultipleSearchAndReplaceGroups, _currentGroup); + GeneratePreview(); + } + + private void SwapRules(int index, int index2) + { + if (_currentGroup == null) + { + return; + } + + listViewRules.ItemChecked -= ListViewRulesItemChecked; + + var temp = _currentGroup.Rules[index]; + _currentGroup.Rules[index] = _currentGroup.Rules[index2]; + _currentGroup.Rules[index2] = temp; + + bool enabled = listViewRules.Items[index].Checked; + string findWhat = listViewRules.Items[index].SubItems[1].Text; + string replaceWith = listViewRules.Items[index].SubItems[2].Text; + string searchType = listViewRules.Items[index].SubItems[3].Text; + string description = listViewRules.Items[index].SubItems[4].Text; + + listViewRules.Items[index].Checked = listViewRules.Items[index2].Checked; + listViewRules.Items[index].SubItems[1].Text = listViewRules.Items[index2].SubItems[1].Text; + listViewRules.Items[index].SubItems[2].Text = listViewRules.Items[index2].SubItems[2].Text; + listViewRules.Items[index].SubItems[3].Text = listViewRules.Items[index2].SubItems[3].Text; + listViewRules.Items[index].SubItems[4].Text = listViewRules.Items[index2].SubItems[4].Text; + listViewRules.Items[index].Tag = _currentGroup.Rules[index]; + + listViewRules.Items[index2].Checked = enabled; + listViewRules.Items[index2].SubItems[1].Text = findWhat; + listViewRules.Items[index2].SubItems[2].Text = replaceWith; + listViewRules.Items[index2].SubItems[3].Text = searchType; + listViewRules.Items[index2].SubItems[4].Text = description; + listViewRules.Items[index2].Tag = _currentGroup.Rules[index2]; + + listViewRules.Items[index].Selected = false; + listViewRules.Items[index2].Selected = true; + listViewRules.Items[index2].Focused = true; + listViewRules.EnsureVisible(index2); + GeneratePreview(); + listViewRules.ItemChecked += ListViewRulesItemChecked; + } + + private void moveUpToolStripMenuItem_Click(object sender, EventArgs e) + { + if (listViewRules.SelectedItems.Count != 1 || listViewRules.Items.Count < 2) + { + return; + } + + int index = listViewRules.SelectedIndices[0]; + if (index == 0) + { + return; + } + + SwapRules(index, index - 1); + } + + private void moveDownToolStripMenuItem_Click(object sender, EventArgs e) + { + if (listViewRules.SelectedItems.Count != 1 || listViewRules.Items.Count < 2) + { + return; + } + + int index = listViewRules.SelectedIndices[0]; + if (index == listViewRules.Items.Count - 1) + { + return; + } + + SwapRules(index, index + 1); + } + + private void moveTopToolStripMenuItem_Click(object sender, EventArgs e) + { + if (listViewRules.SelectedItems.Count != 1 || listViewRules.Items.Count < 2) + { + return; + } + + int index = listViewRules.SelectedIndices[0]; + if (index == 0) + { + return; + } + + if (_currentGroup == null) + { + return; + } + + var temp = _currentGroup.Rules[index]; + _currentGroup.Rules.Remove(temp); + _currentGroup.Rules.Insert(0, temp); + listViewGroups_SelectedIndexChanged(null, null); + GeneratePreview(); + } + + private void moveBottomToolStripMenuItem_Click(object sender, EventArgs e) + { + if (listViewRules.SelectedItems.Count != 1 || listViewRules.Items.Count < 2) + { + return; + } + + int index = listViewRules.SelectedIndices[0]; + int bottomIndex = listViewRules.Items.Count - 1; + if (index == bottomIndex) + { + return; + } + + var temp = _currentGroup.Rules[index]; + _currentGroup.Rules.Remove(temp); + _currentGroup.Rules.Add(temp); + listViewGroups_SelectedIndexChanged(null, null); + listViewRules.Items[0].Selected = false; + listViewRules.Items[bottomIndex].Selected = true; + listViewRules.Items[bottomIndex].Focused = true; + listViewRules.EnsureVisible(bottomIndex); + GeneratePreview(); + } + + private void ImportRulesFile(string fileName) + { + if (_currentGroup == null) + { + return; + } + + var doc = new XmlDocument { XmlResolver = null }; + doc.Load(fileName); + + var replaceNodes = doc.DocumentElement?.SelectNodes("//MultipleSearchAndReplaceItem"); + if (replaceNodes == null) + { + return; + } + + foreach (XmlNode listNode in replaceNodes) + { + var item = MakeMultipleSearchAndReplaceSetting(listNode); + AddToRulesListView(item); + _currentGroup.Rules.Add(item); + } + } + + private List ImportGroupsFile(string fileName) + { + var list = new List(); + var doc = new XmlDocument { XmlResolver = null }; + doc.Load(fileName); + var groups = doc.DocumentElement?.SelectNodes("//Group"); + if (groups != null) + { + foreach (XmlNode groupNode in groups) + { + var group = new MultipleSearchAndReplaceGroup(); + var nameNode = groupNode.SelectSingleNode(GroupName); + var enabledNode = groupNode.SelectSingleNode(GroupEnabled); + + group.Name = nameNode != null ? nameNode.InnerText : "Untitled"; + group.Enabled = enabledNode != null ? Convert.ToBoolean(enabledNode.InnerText) : false; + + group.Rules = new List(); + list.Add(group); + + var replaceItems = groupNode.SelectNodes("MultipleSearchAndReplaceItem"); + if (replaceItems != null) + { + foreach (XmlNode listNode in replaceItems) + { + var item = MakeMultipleSearchAndReplaceSetting(listNode); + group.Rules.Add(item); + } + } + } + } + + if (list.Count == 0) + { + // import into "untitled" group if only rules + var group = new MultipleSearchAndReplaceGroup + { + Name = "untitled", + Rules = new List() + }; + var replaceItems = doc.DocumentElement?.SelectNodes("//MultipleSearchAndReplaceItem"); + if (replaceItems != null) + { + foreach (XmlNode listNode in replaceItems) + { + var item = MakeMultipleSearchAndReplaceSetting(listNode); + group.Rules.Add(item); + } + } + + if (group.Rules.Count > 0) + { + list.Add(group); + } + } + + return list; + } + + private static MultipleSearchAndReplaceSetting MakeMultipleSearchAndReplaceSetting(XmlNode listNode) + { + var item = new MultipleSearchAndReplaceSetting(); + var subNode = listNode.SelectSingleNode(RuleEnabled); + if (subNode != null) + { + item.Enabled = Convert.ToBoolean(subNode.InnerText); + } + + subNode = listNode.SelectSingleNode(FindWhat); + if (subNode != null) + { + item.FindWhat = subNode.InnerText; + } + + subNode = listNode.SelectSingleNode(ReplaceWith); + if (subNode != null) + { + item.ReplaceWith = subNode.InnerText; + } + + subNode = listNode.SelectSingleNode(SearchType); + if (subNode != null) + { + item.SearchType = subNode.InnerText; + } + + subNode = listNode.SelectSingleNode(SearchType); + if (subNode != null) + { + item.SearchType = subNode.InnerText; + } + + subNode = listNode.SelectSingleNode(Description); + if (subNode != null) + { + item.Description = subNode.InnerText; + } + + return item; + } + + private void MultipleReplace_Shown(object sender, EventArgs e) + { + GeneratePreview(); + listViewRules.ItemChecked += ListViewRulesItemChecked; + listViewGroups.ItemChecked += listViewGroups_ItemChecked; + listViewGroups.SelectedIndexChanged += listViewGroups_SelectedIndexChanged; + MultipleReplace_ResizeEnd(sender, null); + listViewGroups_SelectedIndexChanged(null, null); + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + Configuration.Settings.MultipleSearchAndReplaceGroups = _oldMultipleSearchAndReplaceGroups; + DialogResult = DialogResult.Cancel; + } + + private void buttonNewGroup_Click(object sender, EventArgs e) + { + newToolStripMenuItem_Click(sender, null); + } + + private void newToolStripMenuItem_Click(object sender, EventArgs e) + { + using (var form = new MultipleReplaceNewGroup(string.Empty)) + { + if (form.ShowDialog(this) == DialogResult.OK && form.GroupName.Length > 0) + { + var newGroup = new MultipleSearchAndReplaceGroup { Enabled = true, Name = form.GroupName, Rules = new List() }; + Configuration.Settings.MultipleSearchAndReplaceGroups.Add(newGroup); + UpdateViewFromModel(Configuration.Settings.MultipleSearchAndReplaceGroups, newGroup); + } + } + } + + private void UpdateViewFromModel(List groups, MultipleSearchAndReplaceGroup focusGroup) + { + listViewGroups.BeginUpdate(); + listViewGroups.Items.Clear(); + for (int index = 0; index < groups.Count; index++) + { + var group = groups[index]; + var lvi = new ListViewItem(group.Name) { Checked = group.Enabled, Tag = group }; + listViewGroups.Items.Add(lvi); + if (group == focusGroup) + { + listViewGroups.Items[index].Selected = true; + listViewGroups.Items[index].Focused = true; + listViewGroups.EnsureVisible(index); + } + } + listViewGroups.EndUpdate(); + if (groups.Count == 0) + { + groupBoxReplaces.Text = string.Empty; + textBoxFind.Text = string.Empty; + textBoxReplace.Text = string.Empty; + textBoxDescription.Text = string.Empty; + textBoxDescription.Text = string.Empty; + radioButtonNormal.Checked = true; + } + } + + private void listViewGroups_SelectedIndexChanged(object sender, EventArgs e) + { + if (listViewGroups.SelectedItems.Count < 1) + { + return; + } + + _currentGroup = listViewGroups.SelectedItems[0].Tag as MultipleSearchAndReplaceGroup; + if (_currentGroup == null) + { + return; + } + + listViewRules.ItemChecked -= ListViewRulesItemChecked; + listViewGroups.ItemChecked -= listViewGroups_ItemChecked; + listViewRules.BeginUpdate(); + groupBoxReplaces.Text = string.Format(Configuration.Settings.Language.MultipleReplace.RulesForGroupX, _currentGroup.Name); + listViewRules.Items.Clear(); + foreach (var rule in _currentGroup.Rules) + { + AddToRulesListView(rule); + } + if (_currentGroup.Rules.Count > 0) + { + listViewRules.Items[0].Selected = true; + } + else + { + textBoxFind.Text = string.Empty; + textBoxReplace.Text = string.Empty; + textBoxDescription.Text = string.Empty; + } + listViewRules.EndUpdate(); + listViewRules.ItemChecked += ListViewRulesItemChecked; + listViewGroups.ItemChecked += listViewGroups_ItemChecked; + } + + private void listViewGroups_ItemChecked(object sender, ItemCheckedEventArgs e) + { + var group = e.Item.Tag as MultipleSearchAndReplaceGroup; + if (group == null) + { + return; + } + + group.Enabled = e.Item.Checked; + GeneratePreview(); + } + + private void ListViewRulesItemChecked(object sender, ItemCheckedEventArgs e) + { + if (!(e.Item.Tag is MultipleSearchAndReplaceSetting rule)) + { + return; + } + + rule.Enabled = e.Item.Checked; + GeneratePreview(); + } + + private void toolStripMenuItem2_Click(object sender, EventArgs e) + { + if (_currentGroup == null) + { + return; + } + + _currentGroup.Rules.Clear(); + listViewRules.Items.Clear(); + GeneratePreview(); + } + + private void toolStripMenuItem4_Click(object sender, EventArgs e) + { + if (_currentGroup == null || _currentGroup.Rules.Count == 0) + { + return; + } + + saveFileDialog1.Title = Configuration.Settings.Language.MultipleReplace.ExportRulesTitle; + saveFileDialog1.Filter = Configuration.Settings.Language.MultipleReplace.Rules + TemplateFilterExtension; + if (saveFileDialog1.ShowDialog(this) == DialogResult.OK) + { + var textWriter = new XmlTextWriter(saveFileDialog1.FileName, null) { Formatting = Formatting.Indented }; + textWriter.WriteStartDocument(); + textWriter.WriteStartElement("Settings", string.Empty); + textWriter.WriteStartElement("MultipleSearchAndReplaceList", string.Empty); + textWriter.WriteStartElement(Group, string.Empty); + textWriter.WriteElementString(GroupName, _currentGroup.Name); + foreach (var item in _currentGroup.Rules) + { + textWriter.WriteStartElement(MultipleSearchAndReplaceItem, string.Empty); + textWriter.WriteElementString(RuleEnabled, item.Enabled.ToString()); + textWriter.WriteElementString(FindWhat, item.FindWhat); + textWriter.WriteElementString(ReplaceWith, item.ReplaceWith); + textWriter.WriteElementString(SearchType, item.SearchType); + textWriter.WriteElementString(Description, item.Description); + textWriter.WriteEndElement(); + } + textWriter.WriteEndElement(); + textWriter.WriteEndElement(); + textWriter.WriteEndElement(); + textWriter.WriteEndDocument(); + textWriter.Close(); + } + } + + private void toolStripMenuItem3_Click(object sender, EventArgs e) + { + if (_currentGroup == null) + { + return; + } + + openFileDialog1.Title = Configuration.Settings.Language.MultipleReplace.ImportRulesTitle; + openFileDialog1.Filter = Configuration.Settings.Language.MultipleReplace.Rules + TemplateFilterExtension; + if (openFileDialog1.ShowDialog(this) == DialogResult.OK) + { + try + { + ImportRulesFile(openFileDialog1.FileName); + } + catch (Exception exception) + { + MessageBox.Show(exception.Message); + return; + } + GeneratePreview(); + } + } + + private void ToolStripMenuItemRenameClick(object sender, EventArgs e) + { + if (_currentGroup == null) + { + return; + } + + using (var form = new MultipleReplaceNewGroup(_currentGroup.Name)) + { + if (form.ShowDialog(this) == DialogResult.OK && form.GroupName.Length > 0) + { + _currentGroup.Name = form.GroupName; + UpdateViewFromModel(Configuration.Settings.MultipleSearchAndReplaceGroups, _currentGroup); + } + } + } + + private void deleteToolStripMenuItem1_Click(object sender, EventArgs e) + { + if (_currentGroup == null) + { + return; + } + + var idx = Configuration.Settings.MultipleSearchAndReplaceGroups.IndexOf(_currentGroup); + Configuration.Settings.MultipleSearchAndReplaceGroups.RemoveAt(idx); + if (Configuration.Settings.MultipleSearchAndReplaceGroups.Count > 0) + { + if (idx >= Configuration.Settings.MultipleSearchAndReplaceGroups.Count) + { + idx--; + } + + _currentGroup = Configuration.Settings.MultipleSearchAndReplaceGroups[idx]; + } + else + { + _currentGroup = null; + listViewRules.Items.Clear(); + listViewFixes.Items.Clear(); + } + UpdateViewFromModel(Configuration.Settings.MultipleSearchAndReplaceGroups, _currentGroup); + } + + private void SwapGroups(int index, int index2) + { + var temp = Configuration.Settings.MultipleSearchAndReplaceGroups[index]; + Configuration.Settings.MultipleSearchAndReplaceGroups[index] = Configuration.Settings.MultipleSearchAndReplaceGroups[index2]; + Configuration.Settings.MultipleSearchAndReplaceGroups[index2] = temp; + + UpdateViewFromModel(Configuration.Settings.MultipleSearchAndReplaceGroups, _currentGroup); + GeneratePreview(); + } + + private void moveUpToolStripMenuItem1_Click(object sender, EventArgs e) + { + if (listViewGroups.Items.Count < 2 || listViewGroups.SelectedItems.Count == 0) + { + return; + } + + int index = listViewGroups.SelectedIndices[0]; + if (index == 0) + { + return; + } + + SwapGroups(index, index - 1); + } + + private void moveDownToolStripMenuItem1_Click(object sender, EventArgs e) + { + if (listViewGroups.Items.Count < 2 || listViewGroups.SelectedItems.Count == 0) + { + return; + } + + int index = listViewGroups.SelectedIndices[0]; + if (index == listViewGroups.Items.Count - 1) + { + return; + } + + SwapGroups(index, index + 1); + } + + private void MultipleReplace_ResizeEnd(object sender, EventArgs e) + { + listViewRules.Columns[listViewRules.Columns.Count - 1].Width = -2; + } + + private void moveToTopToolStripMenuItem_Click(object sender, EventArgs e) + { + if (listViewGroups.Items.Count < 2 || listViewGroups.SelectedItems.Count == 0) + { + return; + } + + int index = listViewGroups.SelectedIndices[0]; + if (index == 0) + { + return; + } + + var temp = Configuration.Settings.MultipleSearchAndReplaceGroups[index]; + Configuration.Settings.MultipleSearchAndReplaceGroups.Remove(temp); + Configuration.Settings.MultipleSearchAndReplaceGroups.Insert(0, temp); + UpdateViewFromModel(Configuration.Settings.MultipleSearchAndReplaceGroups, _currentGroup); + GeneratePreview(); + } + + private void moveToBottomToolStripMenuItem_Click(object sender, EventArgs e) + { + if (listViewGroups.Items.Count < 2 || listViewGroups.SelectedItems.Count == 0) + { + return; + } + + int index = listViewGroups.SelectedIndices[0]; + int bottomIndex = listViewGroups.Items.Count - 1; + if (index == bottomIndex) + { + return; + } + + var temp = Configuration.Settings.MultipleSearchAndReplaceGroups[index]; + Configuration.Settings.MultipleSearchAndReplaceGroups.Remove(temp); + Configuration.Settings.MultipleSearchAndReplaceGroups.Insert(bottomIndex, temp); + UpdateViewFromModel(Configuration.Settings.MultipleSearchAndReplaceGroups, temp); + GeneratePreview(); + } + + private void contextMenuStripGroups_Opening(object sender, System.ComponentModel.CancelEventArgs e) + { + bool doShow = listViewGroups.SelectedItems.Count > 0; + foreach (ToolStripItem item in contextMenuStripGroups.Items) + { + if (item != newToolStripMenuItem && + item != toolStripSeparatorGroupImportExport && + item != importToolStripMenuItem) + { + item.Visible = doShow; + } + if (item == exportToolStripMenuItem) + { + item.Visible = listViewGroups.Items.Count > 0; + } + } + } + + private void buttonApply_Click(object sender, EventArgs e) + { + SetDeleteIndices(); + ResetUncheckLines(); + _subtitle = new Subtitle(FixedSubtitle); + GeneratePreview(); + } + + private void exportToolStripMenuItem_Click(object sender, EventArgs e) + { + if (listViewGroups.Items.Count == 0) + { + return; + } + + using (var form = new MultipleReplaceExportImport(Configuration.Settings.MultipleSearchAndReplaceGroups, true)) + { + form.ShowDialog(this); + } + } + + private void importToolStripMenuItem_Click(object sender, EventArgs e) + { + openFileDialog1.Title = Configuration.Settings.Language.MultipleReplace.ImportRulesTitle; + openFileDialog1.Filter = Configuration.Settings.Language.MultipleReplace.Rules + TemplateFilterExtension; + if (openFileDialog1.ShowDialog(this) == DialogResult.OK) + { + try + { + var importGroups = ImportGroupsFile(openFileDialog1.FileName); + if (importGroups.Count == 0) + { + MessageBox.Show(Configuration.Settings.Language.MultipleReplace.NothingToImport); + return; + } + + using (var form = new MultipleReplaceExportImport(importGroups, false)) + { + if (form.ShowDialog(this) == DialogResult.OK) + { + var oldGroupsSelectedIndex = listViewGroups.SelectedIndices.Count == 0 ? -1 : listViewGroups.SelectedIndices[0]; + foreach (var importGroup in importGroups.Where(g => form.ChosenGroups.Contains(g.Name))) + { + importGroup.Name = FixDuplicateName(importGroup.Name, Configuration.Settings.MultipleSearchAndReplaceGroups); + Configuration.Settings.MultipleSearchAndReplaceGroups.Add(importGroup); + } + UpdateViewFromModel(Configuration.Settings.MultipleSearchAndReplaceGroups, _currentGroup); + if (oldGroupsSelectedIndex == -1 && listViewGroups.Items.Count > 0) + { + listViewGroups.Items[0].Selected = true; + } + } + } + } + catch (Exception exception) + { + MessageBox.Show(exception.Message); + return; + } + GeneratePreview(); + } + } + + private static string FixDuplicateName(string newGroupName, List existinGroups) + { + if (existinGroups.All(p => p.Name != newGroupName)) + { + return newGroupName; + } + + for (int i = 1; i < int.MaxValue; i++) + { + var name = $"{newGroupName}_{i}"; + if (existinGroups.All(p => p.Name != name)) + { + return name; + } + } + + return Guid.NewGuid().ToString(); + } + + private void buttonImportGroups_Click(object sender, EventArgs e) + { + importToolStripMenuItem_Click(sender, e); + } + + private void buttonExportGroups_Click(object sender, EventArgs e) + { + exportToolStripMenuItem_Click(sender, e); + } + + private void listViewFixes_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.A && e.Modifiers == Keys.Control) + { + listViewFixes.SelectAll(); + e.SuppressKeyPress = true; + } + else if (e.KeyCode == Keys.D && e.Modifiers == Keys.Control) + { + listViewFixes.SelectFirstSelectedItemOnly(); + e.SuppressKeyPress = true; + } + else if (e.KeyCode == Keys.I && e.Modifiers == (Keys.Control | Keys.Shift)) //InverseSelection + { + listViewFixes.InverseSelection(); + e.SuppressKeyPress = true; + } + } + + } +} diff --git a/src/Forms/MultipleReplace.resx b/src/ui/Forms/MultipleReplace.resx similarity index 98% rename from src/Forms/MultipleReplace.resx rename to src/ui/Forms/MultipleReplace.resx index c96da9ab6..8ac43125e 100644 --- a/src/Forms/MultipleReplace.resx +++ b/src/ui/Forms/MultipleReplace.resx @@ -1,132 +1,132 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - 448, 17 - - - 172, 17 - - - 312, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 448, 17 + + + 172, 17 + + + 312, 17 + \ No newline at end of file diff --git a/src/Forms/MultipleReplaceExportImport.Designer.cs b/src/ui/Forms/MultipleReplaceExportImport.Designer.cs similarity index 100% rename from src/Forms/MultipleReplaceExportImport.Designer.cs rename to src/ui/Forms/MultipleReplaceExportImport.Designer.cs diff --git a/src/Forms/MultipleReplaceExportImport.cs b/src/ui/Forms/MultipleReplaceExportImport.cs similarity index 100% rename from src/Forms/MultipleReplaceExportImport.cs rename to src/ui/Forms/MultipleReplaceExportImport.cs diff --git a/src/Forms/MultipleReplaceExportImport.resx b/src/ui/Forms/MultipleReplaceExportImport.resx similarity index 100% rename from src/Forms/MultipleReplaceExportImport.resx rename to src/ui/Forms/MultipleReplaceExportImport.resx diff --git a/src/Forms/MultipleReplaceNewGroup.Designer.cs b/src/ui/Forms/MultipleReplaceNewGroup.Designer.cs similarity index 100% rename from src/Forms/MultipleReplaceNewGroup.Designer.cs rename to src/ui/Forms/MultipleReplaceNewGroup.Designer.cs diff --git a/src/Forms/MultipleReplaceNewGroup.cs b/src/ui/Forms/MultipleReplaceNewGroup.cs similarity index 100% rename from src/Forms/MultipleReplaceNewGroup.cs rename to src/ui/Forms/MultipleReplaceNewGroup.cs diff --git a/src/Forms/RubyJapanese.resx b/src/ui/Forms/MultipleReplaceNewGroup.resx similarity index 100% rename from src/Forms/RubyJapanese.resx rename to src/ui/Forms/MultipleReplaceNewGroup.resx diff --git a/src/Forms/NetflixFixErrors.Designer.cs b/src/ui/Forms/NetflixFixErrors.Designer.cs similarity index 100% rename from src/Forms/NetflixFixErrors.Designer.cs rename to src/ui/Forms/NetflixFixErrors.Designer.cs diff --git a/src/Forms/NetflixFixErrors.cs b/src/ui/Forms/NetflixFixErrors.cs similarity index 100% rename from src/Forms/NetflixFixErrors.cs rename to src/ui/Forms/NetflixFixErrors.cs diff --git a/src/Forms/SetVideoOffset.resx b/src/ui/Forms/NetflixFixErrors.resx similarity index 100% rename from src/Forms/SetVideoOffset.resx rename to src/ui/Forms/NetflixFixErrors.resx diff --git a/src/Forms/Networking/NetworkChat.Designer.cs b/src/ui/Forms/Networking/NetworkChat.Designer.cs similarity index 100% rename from src/Forms/Networking/NetworkChat.Designer.cs rename to src/ui/Forms/Networking/NetworkChat.Designer.cs diff --git a/src/Forms/Networking/NetworkChat.cs b/src/ui/Forms/Networking/NetworkChat.cs similarity index 100% rename from src/Forms/Networking/NetworkChat.cs rename to src/ui/Forms/Networking/NetworkChat.cs diff --git a/src/Forms/Networking/NetworkChat.resx b/src/ui/Forms/Networking/NetworkChat.resx similarity index 100% rename from src/Forms/Networking/NetworkChat.resx rename to src/ui/Forms/Networking/NetworkChat.resx diff --git a/src/Forms/Networking/NetworkJoin.Designer.cs b/src/ui/Forms/Networking/NetworkJoin.Designer.cs similarity index 100% rename from src/Forms/Networking/NetworkJoin.Designer.cs rename to src/ui/Forms/Networking/NetworkJoin.Designer.cs diff --git a/src/Forms/Networking/NetworkJoin.cs b/src/ui/Forms/Networking/NetworkJoin.cs similarity index 100% rename from src/Forms/Networking/NetworkJoin.cs rename to src/ui/Forms/Networking/NetworkJoin.cs diff --git a/src/Forms/SettingsFixContinuationStyle.resx b/src/ui/Forms/Networking/NetworkJoin.resx similarity index 100% rename from src/Forms/SettingsFixContinuationStyle.resx rename to src/ui/Forms/Networking/NetworkJoin.resx diff --git a/src/Forms/Networking/NetworkLogAndInfo.Designer.cs b/src/ui/Forms/Networking/NetworkLogAndInfo.Designer.cs similarity index 100% rename from src/Forms/Networking/NetworkLogAndInfo.Designer.cs rename to src/ui/Forms/Networking/NetworkLogAndInfo.Designer.cs diff --git a/src/Forms/Networking/NetworkLogAndInfo.cs b/src/ui/Forms/Networking/NetworkLogAndInfo.cs similarity index 100% rename from src/Forms/Networking/NetworkLogAndInfo.cs rename to src/ui/Forms/Networking/NetworkLogAndInfo.cs diff --git a/src/Forms/SettingsGapChoose.resx b/src/ui/Forms/Networking/NetworkLogAndInfo.resx similarity index 100% rename from src/Forms/SettingsGapChoose.resx rename to src/ui/Forms/Networking/NetworkLogAndInfo.resx diff --git a/src/Forms/Networking/NetworkStart.Designer.cs b/src/ui/Forms/Networking/NetworkStart.Designer.cs similarity index 100% rename from src/Forms/Networking/NetworkStart.Designer.cs rename to src/ui/Forms/Networking/NetworkStart.Designer.cs diff --git a/src/Forms/Networking/NetworkStart.cs b/src/ui/Forms/Networking/NetworkStart.cs similarity index 100% rename from src/Forms/Networking/NetworkStart.cs rename to src/ui/Forms/Networking/NetworkStart.cs diff --git a/src/Forms/SettingsLineWidth.resx b/src/ui/Forms/Networking/NetworkStart.resx similarity index 100% rename from src/Forms/SettingsLineWidth.resx rename to src/ui/Forms/Networking/NetworkStart.resx diff --git a/src/Forms/NuendoProperties.Designer.cs b/src/ui/Forms/NuendoProperties.Designer.cs similarity index 97% rename from src/Forms/NuendoProperties.Designer.cs rename to src/ui/Forms/NuendoProperties.Designer.cs index abc26ac12..6b5bc04fd 100644 --- a/src/Forms/NuendoProperties.Designer.cs +++ b/src/ui/Forms/NuendoProperties.Designer.cs @@ -1,138 +1,138 @@ -namespace Nikse.SubtitleEdit.Forms -{ - partial class NuendoProperties - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.buttonOK = new System.Windows.Forms.Button(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); - this.labelCharacterList = new System.Windows.Forms.Label(); - this.textBoxCharacterFile = new System.Windows.Forms.TextBox(); - this.buttonChooseCharacterFile = new System.Windows.Forms.Button(); - this.labelStatus = new System.Windows.Forms.Label(); - this.SuspendLayout(); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.Location = new System.Drawing.Point(218, 109); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 3; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.Location = new System.Drawing.Point(299, 109); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 4; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // openFileDialog1 - // - this.openFileDialog1.FileName = "openFileDialog1"; - // - // labelCharacterList - // - this.labelCharacterList.AutoSize = true; - this.labelCharacterList.Location = new System.Drawing.Point(13, 25); - this.labelCharacterList.Name = "labelCharacterList"; - this.labelCharacterList.Size = new System.Drawing.Size(104, 13); - this.labelCharacterList.TabIndex = 5; - this.labelCharacterList.Text = "Character list csv file"; - // - // textBoxCharacterFile - // - this.textBoxCharacterFile.Location = new System.Drawing.Point(13, 42); - this.textBoxCharacterFile.Name = "textBoxCharacterFile"; - this.textBoxCharacterFile.Size = new System.Drawing.Size(330, 20); - this.textBoxCharacterFile.TabIndex = 6; - // - // buttonChooseCharacterFile - // - this.buttonChooseCharacterFile.Location = new System.Drawing.Point(349, 42); - this.buttonChooseCharacterFile.Name = "buttonChooseCharacterFile"; - this.buttonChooseCharacterFile.Size = new System.Drawing.Size(24, 21); - this.buttonChooseCharacterFile.TabIndex = 7; - this.buttonChooseCharacterFile.Text = "..."; - this.buttonChooseCharacterFile.UseVisualStyleBackColor = true; - this.buttonChooseCharacterFile.Click += new System.EventHandler(this.ButtonChooseCharacter_Click); - // - // labelStatus - // - this.labelStatus.AutoSize = true; - this.labelStatus.Location = new System.Drawing.Point(13, 65); - this.labelStatus.Name = "labelStatus"; - this.labelStatus.Size = new System.Drawing.Size(59, 13); - this.labelStatus.TabIndex = 8; - this.labelStatus.Text = "labelStatus"; - // - // NuendoProperties - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(386, 142); - this.Controls.Add(this.labelStatus); - this.Controls.Add(this.buttonChooseCharacterFile); - this.Controls.Add(this.textBoxCharacterFile); - this.Controls.Add(this.labelCharacterList); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.buttonCancel); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "NuendoProperties"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Nuendo properties"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Csv2Properties_KeyDown); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.OpenFileDialog openFileDialog1; - private System.Windows.Forms.Label labelCharacterList; - private System.Windows.Forms.TextBox textBoxCharacterFile; - private System.Windows.Forms.Button buttonChooseCharacterFile; - private System.Windows.Forms.Label labelStatus; - } +namespace Nikse.SubtitleEdit.Forms +{ + partial class NuendoProperties + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.buttonOK = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); + this.labelCharacterList = new System.Windows.Forms.Label(); + this.textBoxCharacterFile = new System.Windows.Forms.TextBox(); + this.buttonChooseCharacterFile = new System.Windows.Forms.Button(); + this.labelStatus = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.Location = new System.Drawing.Point(218, 109); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 3; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.Location = new System.Drawing.Point(299, 109); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 4; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // openFileDialog1 + // + this.openFileDialog1.FileName = "openFileDialog1"; + // + // labelCharacterList + // + this.labelCharacterList.AutoSize = true; + this.labelCharacterList.Location = new System.Drawing.Point(13, 25); + this.labelCharacterList.Name = "labelCharacterList"; + this.labelCharacterList.Size = new System.Drawing.Size(104, 13); + this.labelCharacterList.TabIndex = 5; + this.labelCharacterList.Text = "Character list csv file"; + // + // textBoxCharacterFile + // + this.textBoxCharacterFile.Location = new System.Drawing.Point(13, 42); + this.textBoxCharacterFile.Name = "textBoxCharacterFile"; + this.textBoxCharacterFile.Size = new System.Drawing.Size(330, 20); + this.textBoxCharacterFile.TabIndex = 6; + // + // buttonChooseCharacterFile + // + this.buttonChooseCharacterFile.Location = new System.Drawing.Point(349, 42); + this.buttonChooseCharacterFile.Name = "buttonChooseCharacterFile"; + this.buttonChooseCharacterFile.Size = new System.Drawing.Size(24, 21); + this.buttonChooseCharacterFile.TabIndex = 7; + this.buttonChooseCharacterFile.Text = "..."; + this.buttonChooseCharacterFile.UseVisualStyleBackColor = true; + this.buttonChooseCharacterFile.Click += new System.EventHandler(this.ButtonChooseCharacter_Click); + // + // labelStatus + // + this.labelStatus.AutoSize = true; + this.labelStatus.Location = new System.Drawing.Point(13, 65); + this.labelStatus.Name = "labelStatus"; + this.labelStatus.Size = new System.Drawing.Size(59, 13); + this.labelStatus.TabIndex = 8; + this.labelStatus.Text = "labelStatus"; + // + // NuendoProperties + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(386, 142); + this.Controls.Add(this.labelStatus); + this.Controls.Add(this.buttonChooseCharacterFile); + this.Controls.Add(this.textBoxCharacterFile); + this.Controls.Add(this.labelCharacterList); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.buttonCancel); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "NuendoProperties"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Nuendo properties"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Csv2Properties_KeyDown); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.OpenFileDialog openFileDialog1; + private System.Windows.Forms.Label labelCharacterList; + private System.Windows.Forms.TextBox textBoxCharacterFile; + private System.Windows.Forms.Button buttonChooseCharacterFile; + private System.Windows.Forms.Label labelStatus; + } } \ No newline at end of file diff --git a/src/Forms/NuendoProperties.cs b/src/ui/Forms/NuendoProperties.cs similarity index 97% rename from src/Forms/NuendoProperties.cs rename to src/ui/Forms/NuendoProperties.cs index cd404b561..9c574d39c 100644 --- a/src/Forms/NuendoProperties.cs +++ b/src/ui/Forms/NuendoProperties.cs @@ -1,99 +1,99 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public partial class NuendoProperties : PositionAndSizeForm - { - public string CharacterListFile { get; set; } - - public NuendoProperties() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - labelStatus.Text = string.Empty; - textBoxCharacterFile.Text = Configuration.Settings.SubtitleSettings.NuendoCharacterListFile; - } - - private void ButtonChooseCharacter_Click(object sender, EventArgs e) - { - openFileDialog1.Filter = "Csv files|*.csv"; - openFileDialog1.FileName = string.Empty; - if (openFileDialog1.ShowDialog(this) == DialogResult.OK) - { - textBoxCharacterFile.Text = openFileDialog1.FileName; - - int count = LoadCharacters(openFileDialog1.FileName).Count; - if (count == 0) - { - labelStatus.Text = "No characters found!"; - } - else - { - labelStatus.Text = $"{count} characters found"; - } - } - } - - private void Csv2Properties_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private void buttonOK_Click(object sender, EventArgs e) - { - CharacterListFile = textBoxCharacterFile.Text; - DialogResult = DialogResult.OK; - } - - public static List LoadCharacters(string fileName) - { - int lineNumber = 0; - var separator = new[] { ';' }; - List characters = new List(); - foreach (string line in System.IO.File.ReadAllLines(fileName)) - { - string[] parts = line.Split(separator, StringSplitOptions.RemoveEmptyEntries); - if (parts.Length > 0) - { - try - { - string text = Utilities.FixQuotes(parts[0]); - if (!string.IsNullOrWhiteSpace(text) && !characters.Contains(text)) - { - if (parts.Length > 1) - { - text += " [" + Utilities.FixQuotes(parts[1]) + "]"; - } - - if (lineNumber != 0 || (!text.StartsWith("character [", StringComparison.OrdinalIgnoreCase) && !text.Equals("character", StringComparison.OrdinalIgnoreCase))) - { - characters.Add(text); - } - } - } - catch - { - // ignored - } - } - lineNumber++; - } - return characters; - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public partial class NuendoProperties : PositionAndSizeForm + { + public string CharacterListFile { get; set; } + + public NuendoProperties() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + labelStatus.Text = string.Empty; + textBoxCharacterFile.Text = Configuration.Settings.SubtitleSettings.NuendoCharacterListFile; + } + + private void ButtonChooseCharacter_Click(object sender, EventArgs e) + { + openFileDialog1.Filter = "Csv files|*.csv"; + openFileDialog1.FileName = string.Empty; + if (openFileDialog1.ShowDialog(this) == DialogResult.OK) + { + textBoxCharacterFile.Text = openFileDialog1.FileName; + + int count = LoadCharacters(openFileDialog1.FileName).Count; + if (count == 0) + { + labelStatus.Text = "No characters found!"; + } + else + { + labelStatus.Text = $"{count} characters found"; + } + } + } + + private void Csv2Properties_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void buttonOK_Click(object sender, EventArgs e) + { + CharacterListFile = textBoxCharacterFile.Text; + DialogResult = DialogResult.OK; + } + + public static List LoadCharacters(string fileName) + { + int lineNumber = 0; + var separator = new[] { ';' }; + List characters = new List(); + foreach (string line in System.IO.File.ReadAllLines(fileName)) + { + string[] parts = line.Split(separator, StringSplitOptions.RemoveEmptyEntries); + if (parts.Length > 0) + { + try + { + string text = Utilities.FixQuotes(parts[0]); + if (!string.IsNullOrWhiteSpace(text) && !characters.Contains(text)) + { + if (parts.Length > 1) + { + text += " [" + Utilities.FixQuotes(parts[1]) + "]"; + } + + if (lineNumber != 0 || (!text.StartsWith("character [", StringComparison.OrdinalIgnoreCase) && !text.Equals("character", StringComparison.OrdinalIgnoreCase))) + { + characters.Add(text); + } + } + } + catch + { + // ignored + } + } + lineNumber++; + } + return characters; + } + + } +} diff --git a/src/Forms/NuendoProperties.resx b/src/ui/Forms/NuendoProperties.resx similarity index 97% rename from src/Forms/NuendoProperties.resx rename to src/ui/Forms/NuendoProperties.resx index 3a7d67153..9bad2f599 100644 --- a/src/Forms/NuendoProperties.resx +++ b/src/ui/Forms/NuendoProperties.resx @@ -1,123 +1,123 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + \ No newline at end of file diff --git a/src/Forms/Ocr/AddBeterMultiMatch.Designer.cs b/src/ui/Forms/Ocr/AddBeterMultiMatch.Designer.cs similarity index 100% rename from src/Forms/Ocr/AddBeterMultiMatch.Designer.cs rename to src/ui/Forms/Ocr/AddBeterMultiMatch.Designer.cs diff --git a/src/Forms/Ocr/AddBeterMultiMatch.cs b/src/ui/Forms/Ocr/AddBeterMultiMatch.cs similarity index 100% rename from src/Forms/Ocr/AddBeterMultiMatch.cs rename to src/ui/Forms/Ocr/AddBeterMultiMatch.cs diff --git a/src/Forms/TextPrompt.resx b/src/ui/Forms/Ocr/AddBeterMultiMatch.resx similarity index 100% rename from src/Forms/TextPrompt.resx rename to src/ui/Forms/Ocr/AddBeterMultiMatch.resx diff --git a/src/Forms/Ocr/AddBetterMultiMatchNOcr.Designer.cs b/src/ui/Forms/Ocr/AddBetterMultiMatchNOcr.Designer.cs similarity index 100% rename from src/Forms/Ocr/AddBetterMultiMatchNOcr.Designer.cs rename to src/ui/Forms/Ocr/AddBetterMultiMatchNOcr.Designer.cs diff --git a/src/Forms/Ocr/AddBetterMultiMatchNOcr.cs b/src/ui/Forms/Ocr/AddBetterMultiMatchNOcr.cs similarity index 100% rename from src/Forms/Ocr/AddBetterMultiMatchNOcr.cs rename to src/ui/Forms/Ocr/AddBetterMultiMatchNOcr.cs diff --git a/src/Forms/TimedTextNewLanguage.resx b/src/ui/Forms/Ocr/AddBetterMultiMatchNOcr.resx similarity index 100% rename from src/Forms/TimedTextNewLanguage.resx rename to src/ui/Forms/Ocr/AddBetterMultiMatchNOcr.resx diff --git a/src/Forms/Ocr/AddToOcrReplaceList.Designer.cs b/src/ui/Forms/Ocr/AddToOcrReplaceList.Designer.cs similarity index 100% rename from src/Forms/Ocr/AddToOcrReplaceList.Designer.cs rename to src/ui/Forms/Ocr/AddToOcrReplaceList.Designer.cs diff --git a/src/Forms/Ocr/AddToOcrReplaceList.cs b/src/ui/Forms/Ocr/AddToOcrReplaceList.cs similarity index 100% rename from src/Forms/Ocr/AddToOcrReplaceList.cs rename to src/ui/Forms/Ocr/AddToOcrReplaceList.cs diff --git a/src/Logic/VideoPlayers/MpcHC/MessageHandlerWindow.resx b/src/ui/Forms/Ocr/AddToOcrReplaceList.resx similarity index 100% rename from src/Logic/VideoPlayers/MpcHC/MessageHandlerWindow.resx rename to src/ui/Forms/Ocr/AddToOcrReplaceList.resx diff --git a/src/Forms/Ocr/BinaryOcrChooseEditDb.Designer.cs b/src/ui/Forms/Ocr/BinaryOcrChooseEditDb.Designer.cs similarity index 100% rename from src/Forms/Ocr/BinaryOcrChooseEditDb.Designer.cs rename to src/ui/Forms/Ocr/BinaryOcrChooseEditDb.Designer.cs diff --git a/src/Forms/Ocr/BinaryOcrChooseEditDb.cs b/src/ui/Forms/Ocr/BinaryOcrChooseEditDb.cs similarity index 100% rename from src/Forms/Ocr/BinaryOcrChooseEditDb.cs rename to src/ui/Forms/Ocr/BinaryOcrChooseEditDb.cs diff --git a/src/Forms/AddToNames.resx b/src/ui/Forms/Ocr/BinaryOcrChooseEditDb.resx similarity index 97% rename from src/Forms/AddToNames.resx rename to src/ui/Forms/Ocr/BinaryOcrChooseEditDb.resx index 29dcb1b3a..1af7de150 100644 --- a/src/Forms/AddToNames.resx +++ b/src/ui/Forms/Ocr/BinaryOcrChooseEditDb.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Forms/Ocr/BinaryOcrTrain.Designer.cs b/src/ui/Forms/Ocr/BinaryOcrTrain.Designer.cs similarity index 100% rename from src/Forms/Ocr/BinaryOcrTrain.Designer.cs rename to src/ui/Forms/Ocr/BinaryOcrTrain.Designer.cs diff --git a/src/Forms/Ocr/BinaryOcrTrain.cs b/src/ui/Forms/Ocr/BinaryOcrTrain.cs similarity index 100% rename from src/Forms/Ocr/BinaryOcrTrain.cs rename to src/ui/Forms/Ocr/BinaryOcrTrain.cs diff --git a/src/Forms/Ocr/BinaryOcrTrain.resx b/src/ui/Forms/Ocr/BinaryOcrTrain.resx similarity index 100% rename from src/Forms/Ocr/BinaryOcrTrain.resx rename to src/ui/Forms/Ocr/BinaryOcrTrain.resx diff --git a/src/Forms/Ocr/DownloadTesseract302.Designer.cs b/src/ui/Forms/Ocr/DownloadTesseract302.Designer.cs similarity index 100% rename from src/Forms/Ocr/DownloadTesseract302.Designer.cs rename to src/ui/Forms/Ocr/DownloadTesseract302.Designer.cs diff --git a/src/Forms/Ocr/DownloadTesseract302.cs b/src/ui/Forms/Ocr/DownloadTesseract302.cs similarity index 100% rename from src/Forms/Ocr/DownloadTesseract302.cs rename to src/ui/Forms/Ocr/DownloadTesseract302.cs diff --git a/src/Forms/AddToUserDic.resx b/src/ui/Forms/Ocr/DownloadTesseract302.resx similarity index 97% rename from src/Forms/AddToUserDic.resx rename to src/ui/Forms/Ocr/DownloadTesseract302.resx index 29dcb1b3a..1af7de150 100644 --- a/src/Forms/AddToUserDic.resx +++ b/src/ui/Forms/Ocr/DownloadTesseract302.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Forms/Ocr/DownloadTesseract4.Designer.cs b/src/ui/Forms/Ocr/DownloadTesseract4.Designer.cs similarity index 100% rename from src/Forms/Ocr/DownloadTesseract4.Designer.cs rename to src/ui/Forms/Ocr/DownloadTesseract4.Designer.cs diff --git a/src/Forms/Ocr/DownloadTesseract4.cs b/src/ui/Forms/Ocr/DownloadTesseract4.cs similarity index 100% rename from src/Forms/Ocr/DownloadTesseract4.cs rename to src/ui/Forms/Ocr/DownloadTesseract4.cs diff --git a/src/Forms/AlignmentPicker.resx b/src/ui/Forms/Ocr/DownloadTesseract4.resx similarity index 97% rename from src/Forms/AlignmentPicker.resx rename to src/ui/Forms/Ocr/DownloadTesseract4.resx index 29dcb1b3a..1af7de150 100644 --- a/src/Forms/AlignmentPicker.resx +++ b/src/ui/Forms/Ocr/DownloadTesseract4.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Forms/Ocr/GetTesseract302Dictionaries.Designer.cs b/src/ui/Forms/Ocr/GetTesseract302Dictionaries.Designer.cs similarity index 100% rename from src/Forms/Ocr/GetTesseract302Dictionaries.Designer.cs rename to src/ui/Forms/Ocr/GetTesseract302Dictionaries.Designer.cs diff --git a/src/Forms/Ocr/GetTesseract302Dictionaries.cs b/src/ui/Forms/Ocr/GetTesseract302Dictionaries.cs similarity index 100% rename from src/Forms/Ocr/GetTesseract302Dictionaries.cs rename to src/ui/Forms/Ocr/GetTesseract302Dictionaries.cs diff --git a/src/Forms/ChangeSpeedInPercent.resx b/src/ui/Forms/Ocr/GetTesseract302Dictionaries.resx similarity index 97% rename from src/Forms/ChangeSpeedInPercent.resx rename to src/ui/Forms/Ocr/GetTesseract302Dictionaries.resx index 29dcb1b3a..1af7de150 100644 --- a/src/Forms/ChangeSpeedInPercent.resx +++ b/src/ui/Forms/Ocr/GetTesseract302Dictionaries.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Forms/Ocr/GetTesseractDictionaries.Designer.cs b/src/ui/Forms/Ocr/GetTesseractDictionaries.Designer.cs similarity index 100% rename from src/Forms/Ocr/GetTesseractDictionaries.Designer.cs rename to src/ui/Forms/Ocr/GetTesseractDictionaries.Designer.cs diff --git a/src/Forms/Ocr/GetTesseractDictionaries.cs b/src/ui/Forms/Ocr/GetTesseractDictionaries.cs similarity index 100% rename from src/Forms/Ocr/GetTesseractDictionaries.cs rename to src/ui/Forms/Ocr/GetTesseractDictionaries.cs diff --git a/src/ui/Forms/Ocr/GetTesseractDictionaries.resx b/src/ui/Forms/Ocr/GetTesseractDictionaries.resx new file mode 100644 index 000000000..1af7de150 --- /dev/null +++ b/src/ui/Forms/Ocr/GetTesseractDictionaries.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/src/Forms/Ocr/OCRSpellCheck.Designer.cs b/src/ui/Forms/Ocr/OCRSpellCheck.Designer.cs similarity index 100% rename from src/Forms/Ocr/OCRSpellCheck.Designer.cs rename to src/ui/Forms/Ocr/OCRSpellCheck.Designer.cs diff --git a/src/Forms/Ocr/OCRSpellCheck.cs b/src/ui/Forms/Ocr/OCRSpellCheck.cs similarity index 100% rename from src/Forms/Ocr/OCRSpellCheck.cs rename to src/ui/Forms/Ocr/OCRSpellCheck.cs diff --git a/src/Forms/AutoBreakUnbreakLines.resx b/src/ui/Forms/Ocr/OCRSpellCheck.resx similarity index 97% rename from src/Forms/AutoBreakUnbreakLines.resx rename to src/ui/Forms/Ocr/OCRSpellCheck.resx index 98381cccc..15f75b3cd 100644 --- a/src/Forms/AutoBreakUnbreakLines.resx +++ b/src/ui/Forms/Ocr/OCRSpellCheck.resx @@ -1,123 +1,123 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + \ No newline at end of file diff --git a/src/Forms/Ocr/OcrPreprocessingSettings.Designer.cs b/src/ui/Forms/Ocr/OcrPreprocessingSettings.Designer.cs similarity index 100% rename from src/Forms/Ocr/OcrPreprocessingSettings.Designer.cs rename to src/ui/Forms/Ocr/OcrPreprocessingSettings.Designer.cs diff --git a/src/Forms/Ocr/OcrPreprocessingSettings.cs b/src/ui/Forms/Ocr/OcrPreprocessingSettings.cs similarity index 100% rename from src/Forms/Ocr/OcrPreprocessingSettings.cs rename to src/ui/Forms/Ocr/OcrPreprocessingSettings.cs diff --git a/src/Forms/Ocr/OcrPreprocessingSettings.resx b/src/ui/Forms/Ocr/OcrPreprocessingSettings.resx similarity index 100% rename from src/Forms/Ocr/OcrPreprocessingSettings.resx rename to src/ui/Forms/Ocr/OcrPreprocessingSettings.resx diff --git a/src/Forms/Ocr/OcrPreprocessingT4.Designer.cs b/src/ui/Forms/Ocr/OcrPreprocessingT4.Designer.cs similarity index 100% rename from src/Forms/Ocr/OcrPreprocessingT4.Designer.cs rename to src/ui/Forms/Ocr/OcrPreprocessingT4.Designer.cs diff --git a/src/Forms/Ocr/OcrPreprocessingT4.cs b/src/ui/Forms/Ocr/OcrPreprocessingT4.cs similarity index 100% rename from src/Forms/Ocr/OcrPreprocessingT4.cs rename to src/ui/Forms/Ocr/OcrPreprocessingT4.cs diff --git a/src/Forms/Ocr/OcrPreprocessingT4.resx b/src/ui/Forms/Ocr/OcrPreprocessingT4.resx similarity index 100% rename from src/Forms/Ocr/OcrPreprocessingT4.resx rename to src/ui/Forms/Ocr/OcrPreprocessingT4.resx diff --git a/src/Forms/Ocr/VobSubCharactersImport.Designer.cs b/src/ui/Forms/Ocr/VobSubCharactersImport.Designer.cs similarity index 100% rename from src/Forms/Ocr/VobSubCharactersImport.Designer.cs rename to src/ui/Forms/Ocr/VobSubCharactersImport.Designer.cs diff --git a/src/Forms/Ocr/VobSubCharactersImport.cs b/src/ui/Forms/Ocr/VobSubCharactersImport.cs similarity index 100% rename from src/Forms/Ocr/VobSubCharactersImport.cs rename to src/ui/Forms/Ocr/VobSubCharactersImport.cs diff --git a/src/Forms/Ocr/VobSubCharactersImport.resx b/src/ui/Forms/Ocr/VobSubCharactersImport.resx similarity index 100% rename from src/Forms/Ocr/VobSubCharactersImport.resx rename to src/ui/Forms/Ocr/VobSubCharactersImport.resx diff --git a/src/Forms/Ocr/VobSubEditCharacters.Designer.cs b/src/ui/Forms/Ocr/VobSubEditCharacters.Designer.cs similarity index 100% rename from src/Forms/Ocr/VobSubEditCharacters.Designer.cs rename to src/ui/Forms/Ocr/VobSubEditCharacters.Designer.cs diff --git a/src/Forms/Ocr/VobSubEditCharacters.cs b/src/ui/Forms/Ocr/VobSubEditCharacters.cs similarity index 100% rename from src/Forms/Ocr/VobSubEditCharacters.cs rename to src/ui/Forms/Ocr/VobSubEditCharacters.cs diff --git a/src/Forms/Ocr/VobSubEditCharacters.resx b/src/ui/Forms/Ocr/VobSubEditCharacters.resx similarity index 100% rename from src/Forms/Ocr/VobSubEditCharacters.resx rename to src/ui/Forms/Ocr/VobSubEditCharacters.resx diff --git a/src/Forms/Ocr/VobSubNOcrCharacterInspect.Designer.cs b/src/ui/Forms/Ocr/VobSubNOcrCharacterInspect.Designer.cs similarity index 100% rename from src/Forms/Ocr/VobSubNOcrCharacterInspect.Designer.cs rename to src/ui/Forms/Ocr/VobSubNOcrCharacterInspect.Designer.cs diff --git a/src/Forms/Ocr/VobSubNOcrCharacterInspect.cs b/src/ui/Forms/Ocr/VobSubNOcrCharacterInspect.cs similarity index 100% rename from src/Forms/Ocr/VobSubNOcrCharacterInspect.cs rename to src/ui/Forms/Ocr/VobSubNOcrCharacterInspect.cs diff --git a/src/Forms/Ocr/VobSubNOcrCharacterInspect.resx b/src/ui/Forms/Ocr/VobSubNOcrCharacterInspect.resx similarity index 100% rename from src/Forms/Ocr/VobSubNOcrCharacterInspect.resx rename to src/ui/Forms/Ocr/VobSubNOcrCharacterInspect.resx diff --git a/src/Forms/Ocr/VobSubNOcrEdit.Designer.cs b/src/ui/Forms/Ocr/VobSubNOcrEdit.Designer.cs similarity index 100% rename from src/Forms/Ocr/VobSubNOcrEdit.Designer.cs rename to src/ui/Forms/Ocr/VobSubNOcrEdit.Designer.cs diff --git a/src/Forms/Ocr/VobSubNOcrEdit.cs b/src/ui/Forms/Ocr/VobSubNOcrEdit.cs similarity index 100% rename from src/Forms/Ocr/VobSubNOcrEdit.cs rename to src/ui/Forms/Ocr/VobSubNOcrEdit.cs diff --git a/src/Forms/Ocr/VobSubNOcrEdit.resx b/src/ui/Forms/Ocr/VobSubNOcrEdit.resx similarity index 100% rename from src/Forms/Ocr/VobSubNOcrEdit.resx rename to src/ui/Forms/Ocr/VobSubNOcrEdit.resx diff --git a/src/Forms/Ocr/VobSubNOcrTrain.Designer.cs b/src/ui/Forms/Ocr/VobSubNOcrTrain.Designer.cs similarity index 100% rename from src/Forms/Ocr/VobSubNOcrTrain.Designer.cs rename to src/ui/Forms/Ocr/VobSubNOcrTrain.Designer.cs diff --git a/src/Forms/Ocr/VobSubNOcrTrain.cs b/src/ui/Forms/Ocr/VobSubNOcrTrain.cs similarity index 100% rename from src/Forms/Ocr/VobSubNOcrTrain.cs rename to src/ui/Forms/Ocr/VobSubNOcrTrain.cs diff --git a/src/Forms/Ocr/VobSubNOcrTrain.resx b/src/ui/Forms/Ocr/VobSubNOcrTrain.resx similarity index 100% rename from src/Forms/Ocr/VobSubNOcrTrain.resx rename to src/ui/Forms/Ocr/VobSubNOcrTrain.resx diff --git a/src/Forms/Ocr/VobSubOcr.Designer.cs b/src/ui/Forms/Ocr/VobSubOcr.Designer.cs similarity index 100% rename from src/Forms/Ocr/VobSubOcr.Designer.cs rename to src/ui/Forms/Ocr/VobSubOcr.Designer.cs diff --git a/src/Forms/Ocr/VobSubOcr.cs b/src/ui/Forms/Ocr/VobSubOcr.cs similarity index 100% rename from src/Forms/Ocr/VobSubOcr.cs rename to src/ui/Forms/Ocr/VobSubOcr.cs diff --git a/src/Forms/Ocr/VobSubOcr.resx b/src/ui/Forms/Ocr/VobSubOcr.resx similarity index 100% rename from src/Forms/Ocr/VobSubOcr.resx rename to src/ui/Forms/Ocr/VobSubOcr.resx diff --git a/src/Forms/Ocr/VobSubOcrCharacter.Designer.cs b/src/ui/Forms/Ocr/VobSubOcrCharacter.Designer.cs similarity index 100% rename from src/Forms/Ocr/VobSubOcrCharacter.Designer.cs rename to src/ui/Forms/Ocr/VobSubOcrCharacter.Designer.cs diff --git a/src/Forms/Ocr/VobSubOcrCharacter.cs b/src/ui/Forms/Ocr/VobSubOcrCharacter.cs similarity index 100% rename from src/Forms/Ocr/VobSubOcrCharacter.cs rename to src/ui/Forms/Ocr/VobSubOcrCharacter.cs diff --git a/src/Forms/Ocr/VobSubOcrCharacter.resx b/src/ui/Forms/Ocr/VobSubOcrCharacter.resx similarity index 100% rename from src/Forms/Ocr/VobSubOcrCharacter.resx rename to src/ui/Forms/Ocr/VobSubOcrCharacter.resx diff --git a/src/Forms/Ocr/VobSubOcrCharacterInspect.Designer.cs b/src/ui/Forms/Ocr/VobSubOcrCharacterInspect.Designer.cs similarity index 100% rename from src/Forms/Ocr/VobSubOcrCharacterInspect.Designer.cs rename to src/ui/Forms/Ocr/VobSubOcrCharacterInspect.Designer.cs diff --git a/src/Forms/Ocr/VobSubOcrCharacterInspect.cs b/src/ui/Forms/Ocr/VobSubOcrCharacterInspect.cs similarity index 100% rename from src/Forms/Ocr/VobSubOcrCharacterInspect.cs rename to src/ui/Forms/Ocr/VobSubOcrCharacterInspect.cs diff --git a/src/Forms/Ocr/VobSubOcrCharacterInspect.resx b/src/ui/Forms/Ocr/VobSubOcrCharacterInspect.resx similarity index 100% rename from src/Forms/Ocr/VobSubOcrCharacterInspect.resx rename to src/ui/Forms/Ocr/VobSubOcrCharacterInspect.resx diff --git a/src/Forms/Ocr/VobSubOcrNOcrCharacter.Designer.cs b/src/ui/Forms/Ocr/VobSubOcrNOcrCharacter.Designer.cs similarity index 100% rename from src/Forms/Ocr/VobSubOcrNOcrCharacter.Designer.cs rename to src/ui/Forms/Ocr/VobSubOcrNOcrCharacter.Designer.cs diff --git a/src/Forms/Ocr/VobSubOcrNOcrCharacter.cs b/src/ui/Forms/Ocr/VobSubOcrNOcrCharacter.cs similarity index 100% rename from src/Forms/Ocr/VobSubOcrNOcrCharacter.cs rename to src/ui/Forms/Ocr/VobSubOcrNOcrCharacter.cs diff --git a/src/Forms/Ocr/VobSubOcrNOcrCharacter.resx b/src/ui/Forms/Ocr/VobSubOcrNOcrCharacter.resx similarity index 100% rename from src/Forms/Ocr/VobSubOcrNOcrCharacter.resx rename to src/ui/Forms/Ocr/VobSubOcrNOcrCharacter.resx diff --git a/src/Forms/Ocr/VobSubOcrNewFolder.Designer.cs b/src/ui/Forms/Ocr/VobSubOcrNewFolder.Designer.cs similarity index 100% rename from src/Forms/Ocr/VobSubOcrNewFolder.Designer.cs rename to src/ui/Forms/Ocr/VobSubOcrNewFolder.Designer.cs diff --git a/src/Forms/Ocr/VobSubOcrNewFolder.cs b/src/ui/Forms/Ocr/VobSubOcrNewFolder.cs similarity index 100% rename from src/Forms/Ocr/VobSubOcrNewFolder.cs rename to src/ui/Forms/Ocr/VobSubOcrNewFolder.cs diff --git a/src/Controls/TimeUpDown.resx b/src/ui/Forms/Ocr/VobSubOcrNewFolder.resx similarity index 97% rename from src/Controls/TimeUpDown.resx rename to src/ui/Forms/Ocr/VobSubOcrNewFolder.resx index c7e0d4bdf..d58980a38 100644 --- a/src/Controls/TimeUpDown.resx +++ b/src/ui/Forms/Ocr/VobSubOcrNewFolder.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Forms/Ocr/VobSubOcrSetItalicFactor.Designer.cs b/src/ui/Forms/Ocr/VobSubOcrSetItalicFactor.Designer.cs similarity index 100% rename from src/Forms/Ocr/VobSubOcrSetItalicFactor.Designer.cs rename to src/ui/Forms/Ocr/VobSubOcrSetItalicFactor.Designer.cs diff --git a/src/Forms/Ocr/VobSubOcrSetItalicFactor.cs b/src/ui/Forms/Ocr/VobSubOcrSetItalicFactor.cs similarity index 100% rename from src/Forms/Ocr/VobSubOcrSetItalicFactor.cs rename to src/ui/Forms/Ocr/VobSubOcrSetItalicFactor.cs diff --git a/src/Forms/Ocr/VobSubOcrSetItalicFactor.resx b/src/ui/Forms/Ocr/VobSubOcrSetItalicFactor.resx similarity index 100% rename from src/Forms/Ocr/VobSubOcrSetItalicFactor.resx rename to src/ui/Forms/Ocr/VobSubOcrSetItalicFactor.resx diff --git a/src/Forms/OpenVideoDvd.Designer.cs b/src/ui/Forms/OpenVideoDvd.Designer.cs similarity index 98% rename from src/Forms/OpenVideoDvd.Designer.cs rename to src/ui/Forms/OpenVideoDvd.Designer.cs index d7480697d..94ae13f21 100644 --- a/src/Forms/OpenVideoDvd.Designer.cs +++ b/src/ui/Forms/OpenVideoDvd.Designer.cs @@ -1,233 +1,233 @@ -namespace Nikse.SubtitleEdit.Forms -{ - partial class OpenVideoDvd - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.PanelDrive = new System.Windows.Forms.Panel(); - this.comboBoxDrive = new System.Windows.Forms.ComboBox(); - this.labelChooseDrive = new System.Windows.Forms.Label(); - this.PanelFolder = new System.Windows.Forms.Panel(); - this.buttonChooseFolder = new System.Windows.Forms.Button(); - this.labelChooseFolder = new System.Windows.Forms.Label(); - this.textBoxFolder = new System.Windows.Forms.TextBox(); - this.radioButtonDisc = new System.Windows.Forms.RadioButton(); - this.radioButtonFolder = new System.Windows.Forms.RadioButton(); - this.groupBoxOpenDvdFrom = new System.Windows.Forms.GroupBox(); - this.folderBrowserDialog1 = new System.Windows.Forms.FolderBrowserDialog(); - this.PanelDrive.SuspendLayout(); - this.PanelFolder.SuspendLayout(); - this.groupBoxOpenDvdFrom.SuspendLayout(); - this.SuspendLayout(); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(374, 133); - this.buttonCancel.Margin = new System.Windows.Forms.Padding(2); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(56, 23); - this.buttonCancel.TabIndex = 4; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(314, 133); - this.buttonOK.Margin = new System.Windows.Forms.Padding(2); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(56, 23); - this.buttonOK.TabIndex = 3; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // PanelDrive - // - this.PanelDrive.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.PanelDrive.Controls.Add(this.comboBoxDrive); - this.PanelDrive.Controls.Add(this.labelChooseDrive); - this.PanelDrive.Location = new System.Drawing.Point(82, 31); - this.PanelDrive.Margin = new System.Windows.Forms.Padding(2); - this.PanelDrive.Name = "PanelDrive"; - this.PanelDrive.Size = new System.Drawing.Size(332, 81); - this.PanelDrive.TabIndex = 1; - // - // comboBoxDrive - // - this.comboBoxDrive.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxDrive.FormattingEnabled = true; - this.comboBoxDrive.Location = new System.Drawing.Point(5, 24); - this.comboBoxDrive.Margin = new System.Windows.Forms.Padding(2); - this.comboBoxDrive.Name = "comboBoxDrive"; - this.comboBoxDrive.Size = new System.Drawing.Size(288, 21); - this.comboBoxDrive.TabIndex = 1; - // - // labelChooseDrive - // - this.labelChooseDrive.AutoSize = true; - this.labelChooseDrive.Location = new System.Drawing.Point(3, 8); - this.labelChooseDrive.Name = "labelChooseDrive"; - this.labelChooseDrive.Size = new System.Drawing.Size(69, 13); - this.labelChooseDrive.TabIndex = 0; - this.labelChooseDrive.Text = "Choose drive"; - // - // PanelFolder - // - this.PanelFolder.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.PanelFolder.Controls.Add(this.buttonChooseFolder); - this.PanelFolder.Controls.Add(this.labelChooseFolder); - this.PanelFolder.Controls.Add(this.textBoxFolder); - this.PanelFolder.Location = new System.Drawing.Point(29, 76); - this.PanelFolder.Margin = new System.Windows.Forms.Padding(2); - this.PanelFolder.Name = "PanelFolder"; - this.PanelFolder.Size = new System.Drawing.Size(332, 81); - this.PanelFolder.TabIndex = 2; - // - // buttonChooseFolder - // - this.buttonChooseFolder.Location = new System.Drawing.Point(298, 23); - this.buttonChooseFolder.Name = "buttonChooseFolder"; - this.buttonChooseFolder.Size = new System.Drawing.Size(26, 23); - this.buttonChooseFolder.TabIndex = 2; - this.buttonChooseFolder.Text = "..."; - this.buttonChooseFolder.UseVisualStyleBackColor = true; - this.buttonChooseFolder.Click += new System.EventHandler(this.buttonChooseFolder_Click); - // - // labelChooseFolder - // - this.labelChooseFolder.AutoSize = true; - this.labelChooseFolder.Location = new System.Drawing.Point(3, 8); - this.labelChooseFolder.Name = "labelChooseFolder"; - this.labelChooseFolder.Size = new System.Drawing.Size(72, 13); - this.labelChooseFolder.TabIndex = 0; - this.labelChooseFolder.Text = "Choose folder"; - // - // textBoxFolder - // - this.textBoxFolder.Location = new System.Drawing.Point(5, 25); - this.textBoxFolder.Name = "textBoxFolder"; - this.textBoxFolder.Size = new System.Drawing.Size(288, 20); - this.textBoxFolder.TabIndex = 1; - // - // radioButtonDisc - // - this.radioButtonDisc.AutoSize = true; - this.radioButtonDisc.Checked = true; - this.radioButtonDisc.Location = new System.Drawing.Point(11, 31); - this.radioButtonDisc.Margin = new System.Windows.Forms.Padding(2); - this.radioButtonDisc.Name = "radioButtonDisc"; - this.radioButtonDisc.Size = new System.Drawing.Size(46, 17); - this.radioButtonDisc.TabIndex = 0; - this.radioButtonDisc.TabStop = true; - this.radioButtonDisc.Text = "Disc"; - this.radioButtonDisc.UseVisualStyleBackColor = true; - this.radioButtonDisc.CheckedChanged += new System.EventHandler(this.radioButtonDisc_CheckedChanged); - // - // radioButtonFolder - // - this.radioButtonFolder.AutoSize = true; - this.radioButtonFolder.Location = new System.Drawing.Point(11, 54); - this.radioButtonFolder.Margin = new System.Windows.Forms.Padding(2); - this.radioButtonFolder.Name = "radioButtonFolder"; - this.radioButtonFolder.Size = new System.Drawing.Size(54, 17); - this.radioButtonFolder.TabIndex = 1; - this.radioButtonFolder.Text = "Folder"; - this.radioButtonFolder.UseVisualStyleBackColor = true; - // - // groupBoxOpenDvdFrom - // - this.groupBoxOpenDvdFrom.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxOpenDvdFrom.Controls.Add(this.radioButtonDisc); - this.groupBoxOpenDvdFrom.Controls.Add(this.radioButtonFolder); - this.groupBoxOpenDvdFrom.Controls.Add(this.PanelFolder); - this.groupBoxOpenDvdFrom.Controls.Add(this.PanelDrive); - this.groupBoxOpenDvdFrom.Location = new System.Drawing.Point(9, 10); - this.groupBoxOpenDvdFrom.Margin = new System.Windows.Forms.Padding(2); - this.groupBoxOpenDvdFrom.Name = "groupBoxOpenDvdFrom"; - this.groupBoxOpenDvdFrom.Padding = new System.Windows.Forms.Padding(2); - this.groupBoxOpenDvdFrom.Size = new System.Drawing.Size(422, 118); - this.groupBoxOpenDvdFrom.TabIndex = 0; - this.groupBoxOpenDvdFrom.TabStop = false; - this.groupBoxOpenDvdFrom.Text = "Open DVD from..."; - // - // OpenVideoDvd - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(440, 160); - this.Controls.Add(this.groupBoxOpenDvdFrom); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.Margin = new System.Windows.Forms.Padding(2); - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "OpenVideoDvd"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.Text = "OpenVideoDvd"; - this.Shown += new System.EventHandler(this.OpenVideoDvd_Shown); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.OpenVideoDvd_KeyDown); - this.PanelDrive.ResumeLayout(false); - this.PanelDrive.PerformLayout(); - this.PanelFolder.ResumeLayout(false); - this.PanelFolder.PerformLayout(); - this.groupBoxOpenDvdFrom.ResumeLayout(false); - this.groupBoxOpenDvdFrom.PerformLayout(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Panel PanelDrive; - private System.Windows.Forms.Panel PanelFolder; - private System.Windows.Forms.Label labelChooseDrive; - private System.Windows.Forms.Label labelChooseFolder; - private System.Windows.Forms.TextBox textBoxFolder; - private System.Windows.Forms.ComboBox comboBoxDrive; - private System.Windows.Forms.RadioButton radioButtonDisc; - private System.Windows.Forms.RadioButton radioButtonFolder; - private System.Windows.Forms.GroupBox groupBoxOpenDvdFrom; - private System.Windows.Forms.Button buttonChooseFolder; - private System.Windows.Forms.FolderBrowserDialog folderBrowserDialog1; - } +namespace Nikse.SubtitleEdit.Forms +{ + partial class OpenVideoDvd + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.PanelDrive = new System.Windows.Forms.Panel(); + this.comboBoxDrive = new System.Windows.Forms.ComboBox(); + this.labelChooseDrive = new System.Windows.Forms.Label(); + this.PanelFolder = new System.Windows.Forms.Panel(); + this.buttonChooseFolder = new System.Windows.Forms.Button(); + this.labelChooseFolder = new System.Windows.Forms.Label(); + this.textBoxFolder = new System.Windows.Forms.TextBox(); + this.radioButtonDisc = new System.Windows.Forms.RadioButton(); + this.radioButtonFolder = new System.Windows.Forms.RadioButton(); + this.groupBoxOpenDvdFrom = new System.Windows.Forms.GroupBox(); + this.folderBrowserDialog1 = new System.Windows.Forms.FolderBrowserDialog(); + this.PanelDrive.SuspendLayout(); + this.PanelFolder.SuspendLayout(); + this.groupBoxOpenDvdFrom.SuspendLayout(); + this.SuspendLayout(); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(374, 133); + this.buttonCancel.Margin = new System.Windows.Forms.Padding(2); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(56, 23); + this.buttonCancel.TabIndex = 4; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(314, 133); + this.buttonOK.Margin = new System.Windows.Forms.Padding(2); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(56, 23); + this.buttonOK.TabIndex = 3; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // PanelDrive + // + this.PanelDrive.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.PanelDrive.Controls.Add(this.comboBoxDrive); + this.PanelDrive.Controls.Add(this.labelChooseDrive); + this.PanelDrive.Location = new System.Drawing.Point(82, 31); + this.PanelDrive.Margin = new System.Windows.Forms.Padding(2); + this.PanelDrive.Name = "PanelDrive"; + this.PanelDrive.Size = new System.Drawing.Size(332, 81); + this.PanelDrive.TabIndex = 1; + // + // comboBoxDrive + // + this.comboBoxDrive.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxDrive.FormattingEnabled = true; + this.comboBoxDrive.Location = new System.Drawing.Point(5, 24); + this.comboBoxDrive.Margin = new System.Windows.Forms.Padding(2); + this.comboBoxDrive.Name = "comboBoxDrive"; + this.comboBoxDrive.Size = new System.Drawing.Size(288, 21); + this.comboBoxDrive.TabIndex = 1; + // + // labelChooseDrive + // + this.labelChooseDrive.AutoSize = true; + this.labelChooseDrive.Location = new System.Drawing.Point(3, 8); + this.labelChooseDrive.Name = "labelChooseDrive"; + this.labelChooseDrive.Size = new System.Drawing.Size(69, 13); + this.labelChooseDrive.TabIndex = 0; + this.labelChooseDrive.Text = "Choose drive"; + // + // PanelFolder + // + this.PanelFolder.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.PanelFolder.Controls.Add(this.buttonChooseFolder); + this.PanelFolder.Controls.Add(this.labelChooseFolder); + this.PanelFolder.Controls.Add(this.textBoxFolder); + this.PanelFolder.Location = new System.Drawing.Point(29, 76); + this.PanelFolder.Margin = new System.Windows.Forms.Padding(2); + this.PanelFolder.Name = "PanelFolder"; + this.PanelFolder.Size = new System.Drawing.Size(332, 81); + this.PanelFolder.TabIndex = 2; + // + // buttonChooseFolder + // + this.buttonChooseFolder.Location = new System.Drawing.Point(298, 23); + this.buttonChooseFolder.Name = "buttonChooseFolder"; + this.buttonChooseFolder.Size = new System.Drawing.Size(26, 23); + this.buttonChooseFolder.TabIndex = 2; + this.buttonChooseFolder.Text = "..."; + this.buttonChooseFolder.UseVisualStyleBackColor = true; + this.buttonChooseFolder.Click += new System.EventHandler(this.buttonChooseFolder_Click); + // + // labelChooseFolder + // + this.labelChooseFolder.AutoSize = true; + this.labelChooseFolder.Location = new System.Drawing.Point(3, 8); + this.labelChooseFolder.Name = "labelChooseFolder"; + this.labelChooseFolder.Size = new System.Drawing.Size(72, 13); + this.labelChooseFolder.TabIndex = 0; + this.labelChooseFolder.Text = "Choose folder"; + // + // textBoxFolder + // + this.textBoxFolder.Location = new System.Drawing.Point(5, 25); + this.textBoxFolder.Name = "textBoxFolder"; + this.textBoxFolder.Size = new System.Drawing.Size(288, 20); + this.textBoxFolder.TabIndex = 1; + // + // radioButtonDisc + // + this.radioButtonDisc.AutoSize = true; + this.radioButtonDisc.Checked = true; + this.radioButtonDisc.Location = new System.Drawing.Point(11, 31); + this.radioButtonDisc.Margin = new System.Windows.Forms.Padding(2); + this.radioButtonDisc.Name = "radioButtonDisc"; + this.radioButtonDisc.Size = new System.Drawing.Size(46, 17); + this.radioButtonDisc.TabIndex = 0; + this.radioButtonDisc.TabStop = true; + this.radioButtonDisc.Text = "Disc"; + this.radioButtonDisc.UseVisualStyleBackColor = true; + this.radioButtonDisc.CheckedChanged += new System.EventHandler(this.radioButtonDisc_CheckedChanged); + // + // radioButtonFolder + // + this.radioButtonFolder.AutoSize = true; + this.radioButtonFolder.Location = new System.Drawing.Point(11, 54); + this.radioButtonFolder.Margin = new System.Windows.Forms.Padding(2); + this.radioButtonFolder.Name = "radioButtonFolder"; + this.radioButtonFolder.Size = new System.Drawing.Size(54, 17); + this.radioButtonFolder.TabIndex = 1; + this.radioButtonFolder.Text = "Folder"; + this.radioButtonFolder.UseVisualStyleBackColor = true; + // + // groupBoxOpenDvdFrom + // + this.groupBoxOpenDvdFrom.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxOpenDvdFrom.Controls.Add(this.radioButtonDisc); + this.groupBoxOpenDvdFrom.Controls.Add(this.radioButtonFolder); + this.groupBoxOpenDvdFrom.Controls.Add(this.PanelFolder); + this.groupBoxOpenDvdFrom.Controls.Add(this.PanelDrive); + this.groupBoxOpenDvdFrom.Location = new System.Drawing.Point(9, 10); + this.groupBoxOpenDvdFrom.Margin = new System.Windows.Forms.Padding(2); + this.groupBoxOpenDvdFrom.Name = "groupBoxOpenDvdFrom"; + this.groupBoxOpenDvdFrom.Padding = new System.Windows.Forms.Padding(2); + this.groupBoxOpenDvdFrom.Size = new System.Drawing.Size(422, 118); + this.groupBoxOpenDvdFrom.TabIndex = 0; + this.groupBoxOpenDvdFrom.TabStop = false; + this.groupBoxOpenDvdFrom.Text = "Open DVD from..."; + // + // OpenVideoDvd + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(440, 160); + this.Controls.Add(this.groupBoxOpenDvdFrom); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.Margin = new System.Windows.Forms.Padding(2); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "OpenVideoDvd"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.Text = "OpenVideoDvd"; + this.Shown += new System.EventHandler(this.OpenVideoDvd_Shown); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.OpenVideoDvd_KeyDown); + this.PanelDrive.ResumeLayout(false); + this.PanelDrive.PerformLayout(); + this.PanelFolder.ResumeLayout(false); + this.PanelFolder.PerformLayout(); + this.groupBoxOpenDvdFrom.ResumeLayout(false); + this.groupBoxOpenDvdFrom.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Panel PanelDrive; + private System.Windows.Forms.Panel PanelFolder; + private System.Windows.Forms.Label labelChooseDrive; + private System.Windows.Forms.Label labelChooseFolder; + private System.Windows.Forms.TextBox textBoxFolder; + private System.Windows.Forms.ComboBox comboBoxDrive; + private System.Windows.Forms.RadioButton radioButtonDisc; + private System.Windows.Forms.RadioButton radioButtonFolder; + private System.Windows.Forms.GroupBox groupBoxOpenDvdFrom; + private System.Windows.Forms.Button buttonChooseFolder; + private System.Windows.Forms.FolderBrowserDialog folderBrowserDialog1; + } } \ No newline at end of file diff --git a/src/Forms/OpenVideoDvd.cs b/src/ui/Forms/OpenVideoDvd.cs similarity index 97% rename from src/Forms/OpenVideoDvd.cs rename to src/ui/Forms/OpenVideoDvd.cs index 463b6f9a5..3344c1845 100644 --- a/src/Forms/OpenVideoDvd.cs +++ b/src/ui/Forms/OpenVideoDvd.cs @@ -1,117 +1,117 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.IO; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public partial class OpenVideoDvd : PositionAndSizeForm - { - - public string DvdPath { get; set; } - - public OpenVideoDvd() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - Text = Configuration.Settings.Language.OpenVideoDvd.Title; - groupBoxOpenDvdFrom.Text = Configuration.Settings.Language.OpenVideoDvd.OpenDvdFrom; - radioButtonDisc.Text = Configuration.Settings.Language.OpenVideoDvd.Disc; - radioButtonFolder.Text = Configuration.Settings.Language.OpenVideoDvd.Folder; - labelChooseDrive.Text = Configuration.Settings.Language.OpenVideoDvd.ChooseDrive; - labelChooseFolder.Text = Configuration.Settings.Language.OpenVideoDvd.ChooseFolder; - PanelDrive.Enabled = false; - UiUtil.FixLargeFonts(this, buttonOK); - radioButtonDisc_CheckedChanged(null, null); - - PanelFolder.Left = PanelDrive.Left; - PanelFolder.Top = PanelDrive.Top; - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private void buttonOK_Click(object sender, EventArgs e) - { - if (radioButtonDisc.Checked) - { - string s = comboBoxDrive.Items[comboBoxDrive.SelectedIndex].ToString(); - if (s.Contains(' ')) - { - s = s.Substring(0, s.IndexOf(' ')); - } - - DvdPath = s; - } - else - { - DvdPath = textBoxFolder.Text; - } - DialogResult = DialogResult.OK; - } - - private void radioButtonDisc_CheckedChanged(object sender, EventArgs e) - { - PanelDrive.Visible = radioButtonDisc.Checked; - PanelFolder.Visible = radioButtonFolder.Checked; - } - - private void buttonChooseFolder_Click(object sender, EventArgs e) - { - folderBrowserDialog1.ShowNewFolderButton = true; - if (folderBrowserDialog1.ShowDialog() == DialogResult.OK) - { - textBoxFolder.Text = folderBrowserDialog1.SelectedPath; - } - } - - private void OpenVideoDvd_Shown(object sender, EventArgs e) - { - foreach (DriveInfo drive in DriveInfo.GetDrives()) - { - if (drive.DriveType == DriveType.CDRom || drive.DriveType == DriveType.Removable) - { - if (drive.IsReady) - { - try - { - comboBoxDrive.Items.Add(drive + " " + drive.VolumeLabel); - } - catch - { - comboBoxDrive.Items.Add(drive.ToString()); - } - } - else - { - comboBoxDrive.Items.Add(drive.ToString()); - } - } - } - if (comboBoxDrive.Items.Count > 0) - { - comboBoxDrive.SelectedIndex = 0; - } - else - { - radioButtonFolder.Checked = true; - } - - PanelDrive.Enabled = true; - } - - private void OpenVideoDvd_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.IO; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public partial class OpenVideoDvd : PositionAndSizeForm + { + + public string DvdPath { get; set; } + + public OpenVideoDvd() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + Text = Configuration.Settings.Language.OpenVideoDvd.Title; + groupBoxOpenDvdFrom.Text = Configuration.Settings.Language.OpenVideoDvd.OpenDvdFrom; + radioButtonDisc.Text = Configuration.Settings.Language.OpenVideoDvd.Disc; + radioButtonFolder.Text = Configuration.Settings.Language.OpenVideoDvd.Folder; + labelChooseDrive.Text = Configuration.Settings.Language.OpenVideoDvd.ChooseDrive; + labelChooseFolder.Text = Configuration.Settings.Language.OpenVideoDvd.ChooseFolder; + PanelDrive.Enabled = false; + UiUtil.FixLargeFonts(this, buttonOK); + radioButtonDisc_CheckedChanged(null, null); + + PanelFolder.Left = PanelDrive.Left; + PanelFolder.Top = PanelDrive.Top; + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void buttonOK_Click(object sender, EventArgs e) + { + if (radioButtonDisc.Checked) + { + string s = comboBoxDrive.Items[comboBoxDrive.SelectedIndex].ToString(); + if (s.Contains(' ')) + { + s = s.Substring(0, s.IndexOf(' ')); + } + + DvdPath = s; + } + else + { + DvdPath = textBoxFolder.Text; + } + DialogResult = DialogResult.OK; + } + + private void radioButtonDisc_CheckedChanged(object sender, EventArgs e) + { + PanelDrive.Visible = radioButtonDisc.Checked; + PanelFolder.Visible = radioButtonFolder.Checked; + } + + private void buttonChooseFolder_Click(object sender, EventArgs e) + { + folderBrowserDialog1.ShowNewFolderButton = true; + if (folderBrowserDialog1.ShowDialog() == DialogResult.OK) + { + textBoxFolder.Text = folderBrowserDialog1.SelectedPath; + } + } + + private void OpenVideoDvd_Shown(object sender, EventArgs e) + { + foreach (DriveInfo drive in DriveInfo.GetDrives()) + { + if (drive.DriveType == DriveType.CDRom || drive.DriveType == DriveType.Removable) + { + if (drive.IsReady) + { + try + { + comboBoxDrive.Items.Add(drive + " " + drive.VolumeLabel); + } + catch + { + comboBoxDrive.Items.Add(drive.ToString()); + } + } + else + { + comboBoxDrive.Items.Add(drive.ToString()); + } + } + } + if (comboBoxDrive.Items.Count > 0) + { + comboBoxDrive.SelectedIndex = 0; + } + else + { + radioButtonFolder.Checked = true; + } + + PanelDrive.Enabled = true; + } + + private void OpenVideoDvd_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + } +} diff --git a/src/Forms/OpenVideoDvd.resx b/src/ui/Forms/OpenVideoDvd.resx similarity index 97% rename from src/Forms/OpenVideoDvd.resx rename to src/ui/Forms/OpenVideoDvd.resx index 913dd0dab..69f943da9 100644 --- a/src/Forms/OpenVideoDvd.resx +++ b/src/ui/Forms/OpenVideoDvd.resx @@ -1,123 +1,123 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + \ No newline at end of file diff --git a/src/Forms/PacEncoding.Designer.cs b/src/ui/Forms/PacEncoding.Designer.cs similarity index 97% rename from src/Forms/PacEncoding.Designer.cs rename to src/ui/Forms/PacEncoding.Designer.cs index 400374aaf..d57d70fd8 100644 --- a/src/Forms/PacEncoding.Designer.cs +++ b/src/ui/Forms/PacEncoding.Designer.cs @@ -1,150 +1,150 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class PacEncoding - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.comboBoxCodePage = new System.Windows.Forms.ComboBox(); - this.labelCodePage = new System.Windows.Forms.Label(); - this.labelPreview = new System.Windows.Forms.Label(); - this.textBoxPreview = new System.Windows.Forms.TextBox(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.SuspendLayout(); - // - // comboBoxCodePage - // - this.comboBoxCodePage.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxCodePage.FormattingEnabled = true; - this.comboBoxCodePage.Items.AddRange(new object[] { - "Latin", - "Greek", - "Latin Czech", - "Arabic", - "Hebrew", - "Thai", - "Cyrillic", - "Chinese Traditional (Big5)", - "Chinese Simplified (gb2312)", - "Korean", - "Japanese"}); - this.comboBoxCodePage.Location = new System.Drawing.Point(12, 37); - this.comboBoxCodePage.Name = "comboBoxCodePage"; - this.comboBoxCodePage.Size = new System.Drawing.Size(203, 21); - this.comboBoxCodePage.TabIndex = 0; - this.comboBoxCodePage.SelectedIndexChanged += new System.EventHandler(this.comboBoxCodePage_SelectedIndexChanged); - // - // labelCodePage - // - this.labelCodePage.AutoSize = true; - this.labelCodePage.Location = new System.Drawing.Point(9, 21); - this.labelCodePage.Name = "labelCodePage"; - this.labelCodePage.Size = new System.Drawing.Size(155, 13); - this.labelCodePage.TabIndex = 1; - this.labelCodePage.Text = "Please choose PAC code page"; - // - // labelPreview - // - this.labelPreview.AutoSize = true; - this.labelPreview.Location = new System.Drawing.Point(9, 73); - this.labelPreview.Name = "labelPreview"; - this.labelPreview.Size = new System.Drawing.Size(122, 13); - this.labelPreview.TabIndex = 2; - this.labelPreview.Text = "PAC code page preview"; - // - // textBoxPreview - // - this.textBoxPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.textBoxPreview.Location = new System.Drawing.Point(12, 89); - this.textBoxPreview.Multiline = true; - this.textBoxPreview.Name = "textBoxPreview"; - this.textBoxPreview.ReadOnly = true; - this.textBoxPreview.Size = new System.Drawing.Size(361, 115); - this.textBoxPreview.TabIndex = 3; - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(298, 213); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 5; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(217, 213); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 4; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // PacEncoding - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(385, 248); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.textBoxPreview); - this.Controls.Add(this.labelPreview); - this.Controls.Add(this.labelCodePage); - this.Controls.Add(this.comboBoxCodePage); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "PacEncoding"; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "PacEncoding"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.PacEncoding_KeyDown); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.ComboBox comboBoxCodePage; - private System.Windows.Forms.Label labelCodePage; - private System.Windows.Forms.Label labelPreview; - private System.Windows.Forms.TextBox textBoxPreview; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonOK; - - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class PacEncoding + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.comboBoxCodePage = new System.Windows.Forms.ComboBox(); + this.labelCodePage = new System.Windows.Forms.Label(); + this.labelPreview = new System.Windows.Forms.Label(); + this.textBoxPreview = new System.Windows.Forms.TextBox(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // comboBoxCodePage + // + this.comboBoxCodePage.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxCodePage.FormattingEnabled = true; + this.comboBoxCodePage.Items.AddRange(new object[] { + "Latin", + "Greek", + "Latin Czech", + "Arabic", + "Hebrew", + "Thai", + "Cyrillic", + "Chinese Traditional (Big5)", + "Chinese Simplified (gb2312)", + "Korean", + "Japanese"}); + this.comboBoxCodePage.Location = new System.Drawing.Point(12, 37); + this.comboBoxCodePage.Name = "comboBoxCodePage"; + this.comboBoxCodePage.Size = new System.Drawing.Size(203, 21); + this.comboBoxCodePage.TabIndex = 0; + this.comboBoxCodePage.SelectedIndexChanged += new System.EventHandler(this.comboBoxCodePage_SelectedIndexChanged); + // + // labelCodePage + // + this.labelCodePage.AutoSize = true; + this.labelCodePage.Location = new System.Drawing.Point(9, 21); + this.labelCodePage.Name = "labelCodePage"; + this.labelCodePage.Size = new System.Drawing.Size(155, 13); + this.labelCodePage.TabIndex = 1; + this.labelCodePage.Text = "Please choose PAC code page"; + // + // labelPreview + // + this.labelPreview.AutoSize = true; + this.labelPreview.Location = new System.Drawing.Point(9, 73); + this.labelPreview.Name = "labelPreview"; + this.labelPreview.Size = new System.Drawing.Size(122, 13); + this.labelPreview.TabIndex = 2; + this.labelPreview.Text = "PAC code page preview"; + // + // textBoxPreview + // + this.textBoxPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxPreview.Location = new System.Drawing.Point(12, 89); + this.textBoxPreview.Multiline = true; + this.textBoxPreview.Name = "textBoxPreview"; + this.textBoxPreview.ReadOnly = true; + this.textBoxPreview.Size = new System.Drawing.Size(361, 115); + this.textBoxPreview.TabIndex = 3; + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(298, 213); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 5; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(217, 213); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 4; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // PacEncoding + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(385, 248); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.textBoxPreview); + this.Controls.Add(this.labelPreview); + this.Controls.Add(this.labelCodePage); + this.Controls.Add(this.comboBoxCodePage); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "PacEncoding"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "PacEncoding"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.PacEncoding_KeyDown); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ComboBox comboBoxCodePage; + private System.Windows.Forms.Label labelCodePage; + private System.Windows.Forms.Label labelPreview; + private System.Windows.Forms.TextBox textBoxPreview; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + + } } \ No newline at end of file diff --git a/src/Forms/PacEncoding.cs b/src/ui/Forms/PacEncoding.cs similarity index 97% rename from src/Forms/PacEncoding.cs rename to src/ui/Forms/PacEncoding.cs index 47db8205f..80731d818 100644 --- a/src/Forms/PacEncoding.cs +++ b/src/ui/Forms/PacEncoding.cs @@ -1,150 +1,150 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.SubtitleFormats; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Text; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - - public sealed partial class PacEncoding : Form - { - private const string PreviewChars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; - public int CodePageIndex { get; set; } - - private readonly byte[] _previewBuffer; - - public PacEncoding(byte[] previewBuffer, string fileName) - { - CodePageIndex = Configuration.Settings.General.LastPacCodePage; - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - Text = System.IO.Path.GetFileName(fileName); - _previewBuffer = previewBuffer; - if (CodePageIndex >= 0 && CodePageIndex < comboBoxCodePage.Items.Count) - { - comboBoxCodePage.SelectedIndex = CodePageIndex; - } - - if (previewBuffer == null) - { - labelPreview.Visible = false; - textBoxPreview.Visible = false; - Height -= textBoxPreview.Height; - } - UiUtil.FixLargeFonts(this, buttonOK); - } - - private void PacEncoding_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - private void comboBoxCodePage_SelectedIndexChanged(object sender, EventArgs e) - { - if (comboBoxCodePage.SelectedIndex >= 0) - { - CodePageIndex = comboBoxCodePage.SelectedIndex; - if (_previewBuffer != null) - { - Encoding encoding = Pac.GetEncoding(CodePageIndex); - const int feIndex = 0; - const int endDelimiter = 0x00; - int index; - - var indexOfW16 = Encoding.ASCII.GetString(_previewBuffer).IndexOf("W16", StringComparison.Ordinal); - if (indexOfW16 > 0 && indexOfW16 < _previewBuffer.Length - 5) - { - index = indexOfW16 + 4; - if (CodePageIndex == Pac.CodePageChineseSimplified) - { - textBoxPreview.Text = Encoding.GetEncoding(Pac.EncodingChineseSimplified).GetString(_previewBuffer, index, _previewBuffer.Length - index); - return; - } - else if (CodePageIndex == Pac.CodePageChineseTraditional) - { - textBoxPreview.Text = Encoding.GetEncoding(Pac.EncodingChineseTraditional).GetString(_previewBuffer, index, _previewBuffer.Length - index); - return; - } - else if (CodePageIndex == Pac.CodePageKorean) - { - textBoxPreview.Text = Encoding.GetEncoding(Pac.EncodingKorean).GetString(_previewBuffer, index, _previewBuffer.Length - index); - return; - } - else if (CodePageIndex == Pac.CodePageJapanese) - { - textBoxPreview.Text = Encoding.GetEncoding(Pac.EncodingJapanese).GetString(_previewBuffer, index, _previewBuffer.Length - index); - return; - } - } - - var sb = new StringBuilder(); - index = feIndex + 3; - while (index < _previewBuffer.Length && _previewBuffer[index] != endDelimiter) - { - if (_previewBuffer[index] == 0xFE) - { - sb.AppendLine(); - index += 2; - } - else if (_previewBuffer[index] == 0xFF) - { - sb.Append(' '); - } - else if (CodePageIndex == Pac.CodePageLatin) - { - sb.Append(Pac.GetLatinString(encoding, _previewBuffer, ref index)); - } - else if (CodePageIndex == Pac.CodePageArabic) - { - sb.Append(Pac.GetArabicString(_previewBuffer, ref index)); - } - else if (CodePageIndex == Pac.CodePageHebrew) - { - sb.Append(Pac.GetHebrewString(_previewBuffer, ref index)); - } - else if (CodePageIndex == Pac.CodePageCyrillic) - { - sb.Append(Pac.GetCyrillicString(_previewBuffer, ref index)); - } - else if (CodePageIndex == Pac.CodePageGreek) - { - sb.Append(Pac.GetGreekString(_previewBuffer, ref index)); - } - else - { - sb.Append(encoding.GetString(_previewBuffer, index, 1)); - } - - index++; - } - if (CodePageIndex == Pac.CodePageArabic) - { - textBoxPreview.Text = Utilities.FixEnglishTextInRightToLeftLanguage(sb.ToString(), PreviewChars); - } - else - { - textBoxPreview.Text = sb.ToString(); - } - } - } - } - - private void buttonOK_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.OK; - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.SubtitleFormats; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Text; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + + public sealed partial class PacEncoding : Form + { + private const string PreviewChars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + public int CodePageIndex { get; set; } + + private readonly byte[] _previewBuffer; + + public PacEncoding(byte[] previewBuffer, string fileName) + { + CodePageIndex = Configuration.Settings.General.LastPacCodePage; + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + Text = System.IO.Path.GetFileName(fileName); + _previewBuffer = previewBuffer; + if (CodePageIndex >= 0 && CodePageIndex < comboBoxCodePage.Items.Count) + { + comboBoxCodePage.SelectedIndex = CodePageIndex; + } + + if (previewBuffer == null) + { + labelPreview.Visible = false; + textBoxPreview.Visible = false; + Height -= textBoxPreview.Height; + } + UiUtil.FixLargeFonts(this, buttonOK); + } + + private void PacEncoding_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + private void comboBoxCodePage_SelectedIndexChanged(object sender, EventArgs e) + { + if (comboBoxCodePage.SelectedIndex >= 0) + { + CodePageIndex = comboBoxCodePage.SelectedIndex; + if (_previewBuffer != null) + { + Encoding encoding = Pac.GetEncoding(CodePageIndex); + const int feIndex = 0; + const int endDelimiter = 0x00; + int index; + + var indexOfW16 = Encoding.ASCII.GetString(_previewBuffer).IndexOf("W16", StringComparison.Ordinal); + if (indexOfW16 > 0 && indexOfW16 < _previewBuffer.Length - 5) + { + index = indexOfW16 + 4; + if (CodePageIndex == Pac.CodePageChineseSimplified) + { + textBoxPreview.Text = Encoding.GetEncoding(Pac.EncodingChineseSimplified).GetString(_previewBuffer, index, _previewBuffer.Length - index); + return; + } + else if (CodePageIndex == Pac.CodePageChineseTraditional) + { + textBoxPreview.Text = Encoding.GetEncoding(Pac.EncodingChineseTraditional).GetString(_previewBuffer, index, _previewBuffer.Length - index); + return; + } + else if (CodePageIndex == Pac.CodePageKorean) + { + textBoxPreview.Text = Encoding.GetEncoding(Pac.EncodingKorean).GetString(_previewBuffer, index, _previewBuffer.Length - index); + return; + } + else if (CodePageIndex == Pac.CodePageJapanese) + { + textBoxPreview.Text = Encoding.GetEncoding(Pac.EncodingJapanese).GetString(_previewBuffer, index, _previewBuffer.Length - index); + return; + } + } + + var sb = new StringBuilder(); + index = feIndex + 3; + while (index < _previewBuffer.Length && _previewBuffer[index] != endDelimiter) + { + if (_previewBuffer[index] == 0xFE) + { + sb.AppendLine(); + index += 2; + } + else if (_previewBuffer[index] == 0xFF) + { + sb.Append(' '); + } + else if (CodePageIndex == Pac.CodePageLatin) + { + sb.Append(Pac.GetLatinString(encoding, _previewBuffer, ref index)); + } + else if (CodePageIndex == Pac.CodePageArabic) + { + sb.Append(Pac.GetArabicString(_previewBuffer, ref index)); + } + else if (CodePageIndex == Pac.CodePageHebrew) + { + sb.Append(Pac.GetHebrewString(_previewBuffer, ref index)); + } + else if (CodePageIndex == Pac.CodePageCyrillic) + { + sb.Append(Pac.GetCyrillicString(_previewBuffer, ref index)); + } + else if (CodePageIndex == Pac.CodePageGreek) + { + sb.Append(Pac.GetGreekString(_previewBuffer, ref index)); + } + else + { + sb.Append(encoding.GetString(_previewBuffer, index, 1)); + } + + index++; + } + if (CodePageIndex == Pac.CodePageArabic) + { + textBoxPreview.Text = Utilities.FixEnglishTextInRightToLeftLanguage(sb.ToString(), PreviewChars); + } + else + { + textBoxPreview.Text = sb.ToString(); + } + } + } + } + + private void buttonOK_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.OK; + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + } +} diff --git a/src/Forms/PacEncoding.resx b/src/ui/Forms/PacEncoding.resx similarity index 97% rename from src/Forms/PacEncoding.resx rename to src/ui/Forms/PacEncoding.resx index 29dcb1b3a..1af7de150 100644 --- a/src/Forms/PacEncoding.resx +++ b/src/ui/Forms/PacEncoding.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Forms/PluginsGet.Designer.cs b/src/ui/Forms/PluginsGet.Designer.cs similarity index 98% rename from src/Forms/PluginsGet.Designer.cs rename to src/ui/Forms/PluginsGet.Designer.cs index ca4c177a7..33164a5b4 100644 --- a/src/Forms/PluginsGet.Designer.cs +++ b/src/ui/Forms/PluginsGet.Designer.cs @@ -1,353 +1,353 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class PluginsGet - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.labelClickDownload = new System.Windows.Forms.Label(); - this.buttonDownload = new System.Windows.Forms.Button(); - this.labelDescription1 = new System.Windows.Forms.Label(); - this.linkLabelOpenPluginFolder = new System.Windows.Forms.LinkLabel(); - this.buttonOK = new System.Windows.Forms.Button(); - this.listViewGetPlugins = new System.Windows.Forms.ListView(); - this.columnHeaderName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderDescription = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderVersion = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderDate = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.tabControlPlugins = new System.Windows.Forms.TabControl(); - this.tabPageInstalledPlugins = new System.Windows.Forms.TabPage(); - this.buttonUpdateAll = new System.Windows.Forms.Button(); - this.buttonRemove = new System.Windows.Forms.Button(); - this.listViewInstalledPlugins = new System.Windows.Forms.ListView(); - this.columnHeaderInsName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderInsDescription = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderInsVersion = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderInsType = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.tabPageGetPlugins = new System.Windows.Forms.TabPage(); - this.buttonSearchClear = new System.Windows.Forms.Button(); - this.labelShortcutsSearch = new System.Windows.Forms.Label(); - this.textBoxSearch = new System.Windows.Forms.TextBox(); - this.labelPleaseWait = new System.Windows.Forms.Label(); - this.tabControlPlugins.SuspendLayout(); - this.tabPageInstalledPlugins.SuspendLayout(); - this.tabPageGetPlugins.SuspendLayout(); - this.SuspendLayout(); - // - // labelClickDownload - // - this.labelClickDownload.AutoSize = true; - this.labelClickDownload.Location = new System.Drawing.Point(13, 48); - this.labelClickDownload.Name = "labelClickDownload"; - this.labelClickDownload.Size = new System.Drawing.Size(181, 13); - this.labelClickDownload.TabIndex = 23; - this.labelClickDownload.Text = "Choose plugin and click \"Download\""; - // - // buttonDownload - // - this.buttonDownload.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonDownload.Location = new System.Drawing.Point(680, 435); - this.buttonDownload.Name = "buttonDownload"; - this.buttonDownload.Size = new System.Drawing.Size(104, 25); - this.buttonDownload.TabIndex = 22; - this.buttonDownload.Text = "&Download"; - this.buttonDownload.UseVisualStyleBackColor = true; - this.buttonDownload.Click += new System.EventHandler(this.buttonDownload_Click); - // - // labelDescription1 - // - this.labelDescription1.AutoSize = true; - this.labelDescription1.Location = new System.Drawing.Point(13, 16); - this.labelDescription1.Name = "labelDescription1"; - this.labelDescription1.Size = new System.Drawing.Size(306, 13); - this.labelDescription1.TabIndex = 21; - this.labelDescription1.Text = "Subtitle Edit plugins must be downloaded to the \"Plugins\" folder"; - // - // linkLabelOpenPluginFolder - // - this.linkLabelOpenPluginFolder.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.linkLabelOpenPluginFolder.AutoSize = true; - this.linkLabelOpenPluginFolder.Location = new System.Drawing.Point(12, 515); - this.linkLabelOpenPluginFolder.Name = "linkLabelOpenPluginFolder"; - this.linkLabelOpenPluginFolder.Size = new System.Drawing.Size(106, 13); - this.linkLabelOpenPluginFolder.TabIndex = 98; - this.linkLabelOpenPluginFolder.TabStop = true; - this.linkLabelOpenPluginFolder.Text = "Open \'Plug-ins\' folder"; - this.linkLabelOpenPluginFolder.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabelOpenDictionaryFolder_LinkClicked); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; - this.buttonOK.Location = new System.Drawing.Point(695, 510); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(104, 23); - this.buttonOK.TabIndex = 99; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - // - // listViewGetPlugins - // - this.listViewGetPlugins.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.listViewGetPlugins.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeaderName, - this.columnHeaderDescription, - this.columnHeaderVersion, - this.columnHeaderDate}); - this.listViewGetPlugins.FullRowSelect = true; - this.listViewGetPlugins.HideSelection = false; - this.listViewGetPlugins.Location = new System.Drawing.Point(16, 67); - this.listViewGetPlugins.MultiSelect = false; - this.listViewGetPlugins.Name = "listViewGetPlugins"; - this.listViewGetPlugins.Size = new System.Drawing.Size(767, 362); - this.listViewGetPlugins.TabIndex = 15; - this.listViewGetPlugins.UseCompatibleStateImageBehavior = false; - this.listViewGetPlugins.View = System.Windows.Forms.View.Details; - // - // columnHeaderName - // - this.columnHeaderName.Text = "Name"; - this.columnHeaderName.Width = 140; - // - // columnHeaderDescription - // - this.columnHeaderDescription.Text = "Description"; - this.columnHeaderDescription.Width = 420; - // - // columnHeaderVersion - // - this.columnHeaderVersion.Text = "Version"; - this.columnHeaderVersion.Width = 80; - // - // columnHeaderDate - // - this.columnHeaderDate.Text = "Date"; - this.columnHeaderDate.Width = 70; - // - // tabControlPlugins - // - this.tabControlPlugins.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.tabControlPlugins.Controls.Add(this.tabPageInstalledPlugins); - this.tabControlPlugins.Controls.Add(this.tabPageGetPlugins); - this.tabControlPlugins.Location = new System.Drawing.Point(12, 12); - this.tabControlPlugins.Name = "tabControlPlugins"; - this.tabControlPlugins.SelectedIndex = 0; - this.tabControlPlugins.Size = new System.Drawing.Size(798, 492); - this.tabControlPlugins.TabIndex = 28; - // - // tabPageInstalledPlugins - // - this.tabPageInstalledPlugins.Controls.Add(this.buttonUpdateAll); - this.tabPageInstalledPlugins.Controls.Add(this.buttonRemove); - this.tabPageInstalledPlugins.Controls.Add(this.listViewInstalledPlugins); - this.tabPageInstalledPlugins.Location = new System.Drawing.Point(4, 22); - this.tabPageInstalledPlugins.Name = "tabPageInstalledPlugins"; - this.tabPageInstalledPlugins.Padding = new System.Windows.Forms.Padding(3); - this.tabPageInstalledPlugins.Size = new System.Drawing.Size(790, 466); - this.tabPageInstalledPlugins.TabIndex = 0; - this.tabPageInstalledPlugins.Text = "Installed plugins"; - this.tabPageInstalledPlugins.UseVisualStyleBackColor = true; - // - // buttonUpdateAll - // - this.buttonUpdateAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonUpdateAll.Location = new System.Drawing.Point(539, 435); - this.buttonUpdateAll.Name = "buttonUpdateAll"; - this.buttonUpdateAll.Size = new System.Drawing.Size(134, 25); - this.buttonUpdateAll.TabIndex = 30; - this.buttonUpdateAll.Text = "Updata all"; - this.buttonUpdateAll.UseVisualStyleBackColor = true; - this.buttonUpdateAll.Click += new System.EventHandler(this.buttonUpdateAll_Click); - // - // buttonRemove - // - this.buttonRemove.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonRemove.Location = new System.Drawing.Point(679, 435); - this.buttonRemove.Name = "buttonRemove"; - this.buttonRemove.Size = new System.Drawing.Size(104, 25); - this.buttonRemove.TabIndex = 29; - this.buttonRemove.Text = "&Remove"; - this.buttonRemove.UseVisualStyleBackColor = true; - this.buttonRemove.Click += new System.EventHandler(this.buttonRemove_Click); - // - // listViewInstalledPlugins - // - this.listViewInstalledPlugins.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.listViewInstalledPlugins.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeaderInsName, - this.columnHeaderInsDescription, - this.columnHeaderInsVersion, - this.columnHeaderInsType}); - this.listViewInstalledPlugins.FullRowSelect = true; - this.listViewInstalledPlugins.HideSelection = false; - this.listViewInstalledPlugins.Location = new System.Drawing.Point(6, 6); - this.listViewInstalledPlugins.MultiSelect = false; - this.listViewInstalledPlugins.Name = "listViewInstalledPlugins"; - this.listViewInstalledPlugins.Size = new System.Drawing.Size(777, 423); - this.listViewInstalledPlugins.Sorting = System.Windows.Forms.SortOrder.Ascending; - this.listViewInstalledPlugins.TabIndex = 28; - this.listViewInstalledPlugins.UseCompatibleStateImageBehavior = false; - this.listViewInstalledPlugins.View = System.Windows.Forms.View.Details; - // - // columnHeaderInsName - // - this.columnHeaderInsName.Text = "Name"; - this.columnHeaderInsName.Width = 140; - // - // columnHeaderInsDescription - // - this.columnHeaderInsDescription.Text = "Description"; - this.columnHeaderInsDescription.Width = 420; - // - // columnHeaderInsVersion - // - this.columnHeaderInsVersion.Text = "Version"; - this.columnHeaderInsVersion.Width = 80; - // - // columnHeaderInsType - // - this.columnHeaderInsType.Text = "Date"; - this.columnHeaderInsType.Width = 80; - // - // tabPageGetPlugins - // - this.tabPageGetPlugins.Controls.Add(this.buttonSearchClear); - this.tabPageGetPlugins.Controls.Add(this.labelShortcutsSearch); - this.tabPageGetPlugins.Controls.Add(this.textBoxSearch); - this.tabPageGetPlugins.Controls.Add(this.labelPleaseWait); - this.tabPageGetPlugins.Controls.Add(this.listViewGetPlugins); - this.tabPageGetPlugins.Controls.Add(this.labelDescription1); - this.tabPageGetPlugins.Controls.Add(this.buttonDownload); - this.tabPageGetPlugins.Controls.Add(this.labelClickDownload); - this.tabPageGetPlugins.Location = new System.Drawing.Point(4, 22); - this.tabPageGetPlugins.Name = "tabPageGetPlugins"; - this.tabPageGetPlugins.Padding = new System.Windows.Forms.Padding(3); - this.tabPageGetPlugins.Size = new System.Drawing.Size(790, 466); - this.tabPageGetPlugins.TabIndex = 1; - this.tabPageGetPlugins.Text = "Get plugins"; - this.tabPageGetPlugins.UseVisualStyleBackColor = true; - // - // buttonSearchClear - // - this.buttonSearchClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonSearchClear.Enabled = false; - this.buttonSearchClear.Location = new System.Drawing.Point(672, 38); - this.buttonSearchClear.Name = "buttonSearchClear"; - this.buttonSearchClear.Size = new System.Drawing.Size(111, 23); - this.buttonSearchClear.TabIndex = 8; - this.buttonSearchClear.Text = "Clear"; - this.buttonSearchClear.UseVisualStyleBackColor = true; - this.buttonSearchClear.Click += new System.EventHandler(this.buttonSearchClear_Click); - // - // labelShortcutsSearch - // - this.labelShortcutsSearch.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.labelShortcutsSearch.AutoSize = true; - this.labelShortcutsSearch.Location = new System.Drawing.Point(469, 43); - this.labelShortcutsSearch.Name = "labelShortcutsSearch"; - this.labelShortcutsSearch.Size = new System.Drawing.Size(41, 13); - this.labelShortcutsSearch.TabIndex = 43; - this.labelShortcutsSearch.Text = "Search"; - // - // textBoxSearch - // - this.textBoxSearch.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.textBoxSearch.Location = new System.Drawing.Point(515, 40); - this.textBoxSearch.Name = "textBoxSearch"; - this.textBoxSearch.Size = new System.Drawing.Size(151, 20); - this.textBoxSearch.TabIndex = 5; - this.textBoxSearch.TextChanged += new System.EventHandler(this.textBoxSearch_TextChanged); - // - // labelPleaseWait - // - this.labelPleaseWait.AutoSize = true; - this.labelPleaseWait.Location = new System.Drawing.Point(13, 447); - this.labelPleaseWait.Name = "labelPleaseWait"; - this.labelPleaseWait.Size = new System.Drawing.Size(70, 13); - this.labelPleaseWait.TabIndex = 28; - this.labelPleaseWait.Text = "Please wait..."; - // - // PluginsGet - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(811, 542); - this.Controls.Add(this.tabControlPlugins); - this.Controls.Add(this.linkLabelOpenPluginFolder); - this.Controls.Add(this.buttonOK); - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(600, 350); - this.Name = "PluginsGet"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Plugins"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.PluginsGet_KeyDown); - this.tabControlPlugins.ResumeLayout(false); - this.tabPageInstalledPlugins.ResumeLayout(false); - this.tabPageGetPlugins.ResumeLayout(false); - this.tabPageGetPlugins.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Label labelClickDownload; - private System.Windows.Forms.Button buttonDownload; - private System.Windows.Forms.Label labelDescription1; - private System.Windows.Forms.LinkLabel linkLabelOpenPluginFolder; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.ListView listViewGetPlugins; - private System.Windows.Forms.ColumnHeader columnHeaderName; - private System.Windows.Forms.ColumnHeader columnHeaderVersion; - private System.Windows.Forms.ColumnHeader columnHeaderDescription; - private System.Windows.Forms.ColumnHeader columnHeaderDate; - private System.Windows.Forms.TabControl tabControlPlugins; - private System.Windows.Forms.TabPage tabPageInstalledPlugins; - private System.Windows.Forms.Button buttonRemove; - private System.Windows.Forms.ListView listViewInstalledPlugins; - private System.Windows.Forms.ColumnHeader columnHeaderInsName; - private System.Windows.Forms.ColumnHeader columnHeaderInsDescription; - private System.Windows.Forms.ColumnHeader columnHeaderInsVersion; - private System.Windows.Forms.ColumnHeader columnHeaderInsType; - private System.Windows.Forms.TabPage tabPageGetPlugins; - private System.Windows.Forms.Label labelPleaseWait; - private System.Windows.Forms.Button buttonUpdateAll; - private System.Windows.Forms.Button buttonSearchClear; - private System.Windows.Forms.Label labelShortcutsSearch; - private System.Windows.Forms.TextBox textBoxSearch; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class PluginsGet + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.labelClickDownload = new System.Windows.Forms.Label(); + this.buttonDownload = new System.Windows.Forms.Button(); + this.labelDescription1 = new System.Windows.Forms.Label(); + this.linkLabelOpenPluginFolder = new System.Windows.Forms.LinkLabel(); + this.buttonOK = new System.Windows.Forms.Button(); + this.listViewGetPlugins = new System.Windows.Forms.ListView(); + this.columnHeaderName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderDescription = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderVersion = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderDate = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.tabControlPlugins = new System.Windows.Forms.TabControl(); + this.tabPageInstalledPlugins = new System.Windows.Forms.TabPage(); + this.buttonUpdateAll = new System.Windows.Forms.Button(); + this.buttonRemove = new System.Windows.Forms.Button(); + this.listViewInstalledPlugins = new System.Windows.Forms.ListView(); + this.columnHeaderInsName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderInsDescription = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderInsVersion = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderInsType = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.tabPageGetPlugins = new System.Windows.Forms.TabPage(); + this.buttonSearchClear = new System.Windows.Forms.Button(); + this.labelShortcutsSearch = new System.Windows.Forms.Label(); + this.textBoxSearch = new System.Windows.Forms.TextBox(); + this.labelPleaseWait = new System.Windows.Forms.Label(); + this.tabControlPlugins.SuspendLayout(); + this.tabPageInstalledPlugins.SuspendLayout(); + this.tabPageGetPlugins.SuspendLayout(); + this.SuspendLayout(); + // + // labelClickDownload + // + this.labelClickDownload.AutoSize = true; + this.labelClickDownload.Location = new System.Drawing.Point(13, 48); + this.labelClickDownload.Name = "labelClickDownload"; + this.labelClickDownload.Size = new System.Drawing.Size(181, 13); + this.labelClickDownload.TabIndex = 23; + this.labelClickDownload.Text = "Choose plugin and click \"Download\""; + // + // buttonDownload + // + this.buttonDownload.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonDownload.Location = new System.Drawing.Point(680, 435); + this.buttonDownload.Name = "buttonDownload"; + this.buttonDownload.Size = new System.Drawing.Size(104, 25); + this.buttonDownload.TabIndex = 22; + this.buttonDownload.Text = "&Download"; + this.buttonDownload.UseVisualStyleBackColor = true; + this.buttonDownload.Click += new System.EventHandler(this.buttonDownload_Click); + // + // labelDescription1 + // + this.labelDescription1.AutoSize = true; + this.labelDescription1.Location = new System.Drawing.Point(13, 16); + this.labelDescription1.Name = "labelDescription1"; + this.labelDescription1.Size = new System.Drawing.Size(306, 13); + this.labelDescription1.TabIndex = 21; + this.labelDescription1.Text = "Subtitle Edit plugins must be downloaded to the \"Plugins\" folder"; + // + // linkLabelOpenPluginFolder + // + this.linkLabelOpenPluginFolder.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.linkLabelOpenPluginFolder.AutoSize = true; + this.linkLabelOpenPluginFolder.Location = new System.Drawing.Point(12, 515); + this.linkLabelOpenPluginFolder.Name = "linkLabelOpenPluginFolder"; + this.linkLabelOpenPluginFolder.Size = new System.Drawing.Size(106, 13); + this.linkLabelOpenPluginFolder.TabIndex = 98; + this.linkLabelOpenPluginFolder.TabStop = true; + this.linkLabelOpenPluginFolder.Text = "Open \'Plug-ins\' folder"; + this.linkLabelOpenPluginFolder.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabelOpenDictionaryFolder_LinkClicked); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; + this.buttonOK.Location = new System.Drawing.Point(695, 510); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(104, 23); + this.buttonOK.TabIndex = 99; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + // + // listViewGetPlugins + // + this.listViewGetPlugins.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listViewGetPlugins.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeaderName, + this.columnHeaderDescription, + this.columnHeaderVersion, + this.columnHeaderDate}); + this.listViewGetPlugins.FullRowSelect = true; + this.listViewGetPlugins.HideSelection = false; + this.listViewGetPlugins.Location = new System.Drawing.Point(16, 67); + this.listViewGetPlugins.MultiSelect = false; + this.listViewGetPlugins.Name = "listViewGetPlugins"; + this.listViewGetPlugins.Size = new System.Drawing.Size(767, 362); + this.listViewGetPlugins.TabIndex = 15; + this.listViewGetPlugins.UseCompatibleStateImageBehavior = false; + this.listViewGetPlugins.View = System.Windows.Forms.View.Details; + // + // columnHeaderName + // + this.columnHeaderName.Text = "Name"; + this.columnHeaderName.Width = 140; + // + // columnHeaderDescription + // + this.columnHeaderDescription.Text = "Description"; + this.columnHeaderDescription.Width = 420; + // + // columnHeaderVersion + // + this.columnHeaderVersion.Text = "Version"; + this.columnHeaderVersion.Width = 80; + // + // columnHeaderDate + // + this.columnHeaderDate.Text = "Date"; + this.columnHeaderDate.Width = 70; + // + // tabControlPlugins + // + this.tabControlPlugins.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tabControlPlugins.Controls.Add(this.tabPageInstalledPlugins); + this.tabControlPlugins.Controls.Add(this.tabPageGetPlugins); + this.tabControlPlugins.Location = new System.Drawing.Point(12, 12); + this.tabControlPlugins.Name = "tabControlPlugins"; + this.tabControlPlugins.SelectedIndex = 0; + this.tabControlPlugins.Size = new System.Drawing.Size(798, 492); + this.tabControlPlugins.TabIndex = 28; + // + // tabPageInstalledPlugins + // + this.tabPageInstalledPlugins.Controls.Add(this.buttonUpdateAll); + this.tabPageInstalledPlugins.Controls.Add(this.buttonRemove); + this.tabPageInstalledPlugins.Controls.Add(this.listViewInstalledPlugins); + this.tabPageInstalledPlugins.Location = new System.Drawing.Point(4, 22); + this.tabPageInstalledPlugins.Name = "tabPageInstalledPlugins"; + this.tabPageInstalledPlugins.Padding = new System.Windows.Forms.Padding(3); + this.tabPageInstalledPlugins.Size = new System.Drawing.Size(790, 466); + this.tabPageInstalledPlugins.TabIndex = 0; + this.tabPageInstalledPlugins.Text = "Installed plugins"; + this.tabPageInstalledPlugins.UseVisualStyleBackColor = true; + // + // buttonUpdateAll + // + this.buttonUpdateAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonUpdateAll.Location = new System.Drawing.Point(539, 435); + this.buttonUpdateAll.Name = "buttonUpdateAll"; + this.buttonUpdateAll.Size = new System.Drawing.Size(134, 25); + this.buttonUpdateAll.TabIndex = 30; + this.buttonUpdateAll.Text = "Updata all"; + this.buttonUpdateAll.UseVisualStyleBackColor = true; + this.buttonUpdateAll.Click += new System.EventHandler(this.buttonUpdateAll_Click); + // + // buttonRemove + // + this.buttonRemove.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonRemove.Location = new System.Drawing.Point(679, 435); + this.buttonRemove.Name = "buttonRemove"; + this.buttonRemove.Size = new System.Drawing.Size(104, 25); + this.buttonRemove.TabIndex = 29; + this.buttonRemove.Text = "&Remove"; + this.buttonRemove.UseVisualStyleBackColor = true; + this.buttonRemove.Click += new System.EventHandler(this.buttonRemove_Click); + // + // listViewInstalledPlugins + // + this.listViewInstalledPlugins.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listViewInstalledPlugins.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeaderInsName, + this.columnHeaderInsDescription, + this.columnHeaderInsVersion, + this.columnHeaderInsType}); + this.listViewInstalledPlugins.FullRowSelect = true; + this.listViewInstalledPlugins.HideSelection = false; + this.listViewInstalledPlugins.Location = new System.Drawing.Point(6, 6); + this.listViewInstalledPlugins.MultiSelect = false; + this.listViewInstalledPlugins.Name = "listViewInstalledPlugins"; + this.listViewInstalledPlugins.Size = new System.Drawing.Size(777, 423); + this.listViewInstalledPlugins.Sorting = System.Windows.Forms.SortOrder.Ascending; + this.listViewInstalledPlugins.TabIndex = 28; + this.listViewInstalledPlugins.UseCompatibleStateImageBehavior = false; + this.listViewInstalledPlugins.View = System.Windows.Forms.View.Details; + // + // columnHeaderInsName + // + this.columnHeaderInsName.Text = "Name"; + this.columnHeaderInsName.Width = 140; + // + // columnHeaderInsDescription + // + this.columnHeaderInsDescription.Text = "Description"; + this.columnHeaderInsDescription.Width = 420; + // + // columnHeaderInsVersion + // + this.columnHeaderInsVersion.Text = "Version"; + this.columnHeaderInsVersion.Width = 80; + // + // columnHeaderInsType + // + this.columnHeaderInsType.Text = "Date"; + this.columnHeaderInsType.Width = 80; + // + // tabPageGetPlugins + // + this.tabPageGetPlugins.Controls.Add(this.buttonSearchClear); + this.tabPageGetPlugins.Controls.Add(this.labelShortcutsSearch); + this.tabPageGetPlugins.Controls.Add(this.textBoxSearch); + this.tabPageGetPlugins.Controls.Add(this.labelPleaseWait); + this.tabPageGetPlugins.Controls.Add(this.listViewGetPlugins); + this.tabPageGetPlugins.Controls.Add(this.labelDescription1); + this.tabPageGetPlugins.Controls.Add(this.buttonDownload); + this.tabPageGetPlugins.Controls.Add(this.labelClickDownload); + this.tabPageGetPlugins.Location = new System.Drawing.Point(4, 22); + this.tabPageGetPlugins.Name = "tabPageGetPlugins"; + this.tabPageGetPlugins.Padding = new System.Windows.Forms.Padding(3); + this.tabPageGetPlugins.Size = new System.Drawing.Size(790, 466); + this.tabPageGetPlugins.TabIndex = 1; + this.tabPageGetPlugins.Text = "Get plugins"; + this.tabPageGetPlugins.UseVisualStyleBackColor = true; + // + // buttonSearchClear + // + this.buttonSearchClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.buttonSearchClear.Enabled = false; + this.buttonSearchClear.Location = new System.Drawing.Point(672, 38); + this.buttonSearchClear.Name = "buttonSearchClear"; + this.buttonSearchClear.Size = new System.Drawing.Size(111, 23); + this.buttonSearchClear.TabIndex = 8; + this.buttonSearchClear.Text = "Clear"; + this.buttonSearchClear.UseVisualStyleBackColor = true; + this.buttonSearchClear.Click += new System.EventHandler(this.buttonSearchClear_Click); + // + // labelShortcutsSearch + // + this.labelShortcutsSearch.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.labelShortcutsSearch.AutoSize = true; + this.labelShortcutsSearch.Location = new System.Drawing.Point(469, 43); + this.labelShortcutsSearch.Name = "labelShortcutsSearch"; + this.labelShortcutsSearch.Size = new System.Drawing.Size(41, 13); + this.labelShortcutsSearch.TabIndex = 43; + this.labelShortcutsSearch.Text = "Search"; + // + // textBoxSearch + // + this.textBoxSearch.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxSearch.Location = new System.Drawing.Point(515, 40); + this.textBoxSearch.Name = "textBoxSearch"; + this.textBoxSearch.Size = new System.Drawing.Size(151, 20); + this.textBoxSearch.TabIndex = 5; + this.textBoxSearch.TextChanged += new System.EventHandler(this.textBoxSearch_TextChanged); + // + // labelPleaseWait + // + this.labelPleaseWait.AutoSize = true; + this.labelPleaseWait.Location = new System.Drawing.Point(13, 447); + this.labelPleaseWait.Name = "labelPleaseWait"; + this.labelPleaseWait.Size = new System.Drawing.Size(70, 13); + this.labelPleaseWait.TabIndex = 28; + this.labelPleaseWait.Text = "Please wait..."; + // + // PluginsGet + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(811, 542); + this.Controls.Add(this.tabControlPlugins); + this.Controls.Add(this.linkLabelOpenPluginFolder); + this.Controls.Add(this.buttonOK); + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(600, 350); + this.Name = "PluginsGet"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Plugins"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.PluginsGet_KeyDown); + this.tabControlPlugins.ResumeLayout(false); + this.tabPageInstalledPlugins.ResumeLayout(false); + this.tabPageGetPlugins.ResumeLayout(false); + this.tabPageGetPlugins.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label labelClickDownload; + private System.Windows.Forms.Button buttonDownload; + private System.Windows.Forms.Label labelDescription1; + private System.Windows.Forms.LinkLabel linkLabelOpenPluginFolder; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.ListView listViewGetPlugins; + private System.Windows.Forms.ColumnHeader columnHeaderName; + private System.Windows.Forms.ColumnHeader columnHeaderVersion; + private System.Windows.Forms.ColumnHeader columnHeaderDescription; + private System.Windows.Forms.ColumnHeader columnHeaderDate; + private System.Windows.Forms.TabControl tabControlPlugins; + private System.Windows.Forms.TabPage tabPageInstalledPlugins; + private System.Windows.Forms.Button buttonRemove; + private System.Windows.Forms.ListView listViewInstalledPlugins; + private System.Windows.Forms.ColumnHeader columnHeaderInsName; + private System.Windows.Forms.ColumnHeader columnHeaderInsDescription; + private System.Windows.Forms.ColumnHeader columnHeaderInsVersion; + private System.Windows.Forms.ColumnHeader columnHeaderInsType; + private System.Windows.Forms.TabPage tabPageGetPlugins; + private System.Windows.Forms.Label labelPleaseWait; + private System.Windows.Forms.Button buttonUpdateAll; + private System.Windows.Forms.Button buttonSearchClear; + private System.Windows.Forms.Label labelShortcutsSearch; + private System.Windows.Forms.TextBox textBoxSearch; + } } \ No newline at end of file diff --git a/src/Forms/PluginsGet.cs b/src/ui/Forms/PluginsGet.cs similarity index 97% rename from src/Forms/PluginsGet.cs rename to src/ui/Forms/PluginsGet.cs index 2323d3cad..957fb4c99 100644 --- a/src/Forms/PluginsGet.cs +++ b/src/ui/Forms/PluginsGet.cs @@ -1,484 +1,484 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Globalization; -using System.IO; -using System.Net; -using System.Net.Cache; -using System.Windows.Forms; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class PluginsGet : Form - { - - public class PluginInfoItem - { - public string Version { get; set; } - public string Name { get; set; } - public string Description { get; set; } - public string Date { get; set; } - public string Url { get; set; } - } - - private List _downloadList; - - private string _downloadedPluginName; - private readonly LanguageStructure.PluginsGet _language; - private List _updateAllListUrls; - private bool _updatingAllPlugins; - private int _updatingAllPluginsCount; - private bool _fetchingData; - - private static string GetPluginXmlFileUrl() - { - if (Environment.Version.Major < 4) - { - return "https://raw.github.com/SubtitleEdit/plugins/master/Plugins2.xml"; // .net 2-3.5 - } - - return "https://raw.github.com/SubtitleEdit/plugins/master/Plugins4.xml"; // .net 4-? - } - - public PluginsGet() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - _language = Configuration.Settings.Language.PluginsGet; - Text = _language.Title; - tabPageInstalledPlugins.Text = _language.InstalledPlugins; - tabPageGetPlugins.Text = _language.GetPlugins; - - buttonDownload.Text = _language.Download; - buttonRemove.Text = _language.Remove; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - linkLabelOpenPluginFolder.Text = _language.OpenPluginsFolder; - labelDescription1.Text = _language.GetPluginsInfo1; - labelClickDownload.Text = _language.GetPluginsInfo2; - - columnHeaderName.Text = Configuration.Settings.Language.General.Name; - columnHeaderDescription.Text = _language.Description; - columnHeaderVersion.Text = _language.Version; - columnHeaderDate.Text = _language.Date; - - columnHeaderInsName.Text = Configuration.Settings.Language.General.Name; - columnHeaderInsDescription.Text = _language.Description; - columnHeaderInsVersion.Text = _language.Version; - columnHeaderInsType.Text = _language.Type; - - labelShortcutsSearch.Text = Configuration.Settings.Language.General.Search; - labelShortcutsSearch.Left = textBoxSearch.Left - labelShortcutsSearch.Width - 9; - buttonSearchClear.Text = Configuration.Settings.Language.DvdSubRip.Clear; - - buttonUpdateAll.Visible = false; - DownloadPluginMetadataInfos(); - } - - private void DownloadPluginMetadataInfos() - { - try - { - labelPleaseWait.Text = Configuration.Settings.Language.General.PleaseWait; - Refresh(); - ShowInstalledPlugins(); - string url = GetPluginXmlFileUrl(); - var wc = new WebClient - { - Proxy = Utilities.GetProxy(), - Encoding = System.Text.Encoding.UTF8, - CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore) - }; - wc.Headers.Add("Accept-Encoding", ""); - wc.DownloadStringCompleted += wc_DownloadStringCompleted; - _fetchingData = true; - wc.DownloadStringAsync(new Uri(url)); - } - catch (Exception exception) - { - ChangeControlsState(true); - MessageBox.Show(exception.Message + Environment.NewLine + Environment.NewLine + exception.StackTrace); - } - } - - private void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) - { - _fetchingData = false; - labelPleaseWait.Text = string.Empty; - if (e.Error != null) - { - MessageBox.Show(string.Format(_language.UnableToDownloadPluginListX, e.Error.Message)); - if (e.Error.InnerException != null) - { - MessageBox.Show(e.Error.InnerException.Source + ": " + e.Error.InnerException.Message + Environment.NewLine + Environment.NewLine + e.Error.InnerException.StackTrace); - } - return; - } - - var pluginDoc = new XmlDocument(); - _downloadList = new List(); - listViewGetPlugins.BeginUpdate(); - try - { - pluginDoc.LoadXml(e.Result); - string[] arr = pluginDoc.DocumentElement.SelectSingleNode("SubtitleEditVersion").InnerText.Split(new[] { '.', ',', ' ' }, StringSplitOptions.RemoveEmptyEntries); - double requiredVersion = Convert.ToDouble(arr[0] + "." + arr[1], CultureInfo.InvariantCulture); - - string[] versionInfo = Utilities.AssemblyVersion.Split('.'); - double currentVersion = Convert.ToDouble(versionInfo[0] + "." + versionInfo[1], CultureInfo.InvariantCulture); - - if (currentVersion < requiredVersion) - { - MessageBox.Show(_language.NewVersionOfSubtitleEditRequired); - DialogResult = DialogResult.Cancel; - return; - } - - _updateAllListUrls = new List(); - LoadAvailablePlugins(pluginDoc); - ShowAvailablePlugins(); - } - catch (Exception exception) - { - MessageBox.Show(string.Format(_language.UnableToDownloadPluginListX, exception.Source + ": " + exception.Message + Environment.NewLine + Environment.NewLine + exception.StackTrace)); - } - listViewGetPlugins.EndUpdate(); - - if (_updateAllListUrls.Count > 0) - { - buttonUpdateAll.BackColor = Color.LightGreen; - if (Configuration.Settings.Language.PluginsGet.UpdateAllX != null) - { - buttonUpdateAll.Text = string.Format(Configuration.Settings.Language.PluginsGet.UpdateAllX, _updateAllListUrls.Count); - } - else - { - buttonUpdateAll.Text = Configuration.Settings.Language.PluginsGet.UpdateAll; - } - - buttonUpdateAll.Visible = true; - } - } - - private void LoadAvailablePlugins(XmlDocument doc) - { - foreach (XmlNode node in doc.DocumentElement.SelectNodes("Plugin")) - { - var item = new PluginInfoItem - { - Name = node.SelectSingleNode("Name").InnerText.Trim('.'), - Description = node.SelectSingleNode("Description").InnerText.Trim('.'), - Version = node.SelectSingleNode("Version").InnerText, - Date = node.SelectSingleNode("Date").InnerText, - Url = node.SelectSingleNode("Url").InnerText, - }; - _downloadList.Add(item); - - foreach (ListViewItem installed in listViewInstalledPlugins.Items) - { - var installedVer = Convert.ToDouble(installed.SubItems[2].Text.Replace(',', '.').Replace(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, "."), CultureInfo.InvariantCulture); - var currentVer = Convert.ToDouble(node.SelectSingleNode("Version").InnerText.Replace(',', '.').Replace(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, "."), CultureInfo.InvariantCulture); - - if (string.Compare(installed.Text, node.SelectSingleNode("Name").InnerText.Trim('.'), StringComparison.OrdinalIgnoreCase) == 0 && installedVer < currentVer) - { - installed.BackColor = Color.LightPink; - installed.SubItems[1].Text = $"{_language.UpdateAvailable} {installed.SubItems[1].Text}"; - buttonUpdateAll.Visible = true; - _updateAllListUrls.Add(item.Url); - } - } - } - } - - private void ShowAvailablePlugins() - { - bool search = textBoxSearch.Text.Length > 1; - string searchText = textBoxSearch.Text; - listViewGetPlugins.BeginUpdate(); - if (listViewGetPlugins.Items.Count > 0) - { - listViewGetPlugins.Items.Clear(); - } - foreach (var plugin in _downloadList) - { - var item = new ListViewItem(plugin.Name) { Tag = plugin }; - item.SubItems.Add(plugin.Description); - item.SubItems.Add(plugin.Version); - item.SubItems.Add(plugin.Date); - - if (!search || - plugin.Name.Contains(searchText, StringComparison.OrdinalIgnoreCase) || - plugin.Description.Contains(searchText, StringComparison.OrdinalIgnoreCase) || - plugin.Version.Contains(searchText, StringComparison.OrdinalIgnoreCase)) - { - listViewGetPlugins.Items.Add(item); - } - } - listViewGetPlugins.EndUpdate(); - } - - private void ShowInstalledPlugins() - { - string path = Configuration.PluginsDirectory; - if (!Directory.Exists(path)) - { - return; - } - - listViewInstalledPlugins.BeginUpdate(); - listViewInstalledPlugins.Items.Clear(); - foreach (string pluginFileName in Directory.GetFiles(path, "*.DLL")) - { - Main.GetPropertiesAndDoAction(pluginFileName, out var name, out _, out var version, out var description, out var actionType, out _, out var mi); - if (!string.IsNullOrEmpty(name) && !string.IsNullOrEmpty(actionType) && mi != null) - { - try - { - var item = new ListViewItem(name.Trim('.')) { Tag = pluginFileName }; - item.SubItems.Add(description); - item.SubItems.Add(version.ToString(CultureInfo.InvariantCulture)); - item.SubItems.Add(actionType); - listViewInstalledPlugins.Items.Add(item); - } - catch (Exception exception) - { - MessageBox.Show($"Error loading plugin \"{pluginFileName}\": {exception.Message}"); - } - } - } - listViewInstalledPlugins.EndUpdate(); - } - - private void buttonDownload_Click(object sender, EventArgs e) - { - if (listViewGetPlugins.SelectedItems.Count == 0) - { - return; - } - - try - { - labelPleaseWait.Text = Configuration.Settings.Language.General.PleaseWait; - ChangeControlsState(false); - Refresh(); - Cursor = Cursors.WaitCursor; - - var plugin = (PluginInfoItem)listViewGetPlugins.SelectedItems[0].Tag; - - string url = plugin.Url; - _downloadedPluginName = plugin.Name; - - var wc = new WebClient { Proxy = Utilities.GetProxy(), CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore) }; - wc.DownloadDataCompleted += wc_DownloadDataCompleted; - wc.DownloadDataAsync(new Uri(url)); - } - catch (Exception exception) - { - ChangeControlsState(true); - Cursor = Cursors.Default; - MessageBox.Show(exception.Message + Environment.NewLine + Environment.NewLine + exception.StackTrace); - } - } - - private void wc_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e) - { - labelPleaseWait.Text = string.Empty; - if (e.Error != null) - { - MessageBox.Show(Configuration.Settings.Language.GetTesseractDictionaries.DownloadFailed); - ChangeControlsState(true); - Cursor = Cursors.Default; - DialogResult = DialogResult.Cancel; - return; - } - - string pluginsFolder = Configuration.PluginsDirectory; - if (!Directory.Exists(pluginsFolder)) - { - try - { - Directory.CreateDirectory(pluginsFolder); - } - catch (Exception exception) - { - MessageBox.Show($"Unable to create plugin folder {pluginsFolder}: {exception.Message}"); - ChangeControlsState(true); - Cursor = Cursors.Default; - return; - } - } - - var ms = new MemoryStream(e.Result); - using (ZipExtractor zip = ZipExtractor.Open(ms)) - { - List dir = zip.ReadCentralDir(); - - // Extract dic/aff files in dictionary folder - foreach (ZipExtractor.ZipFileEntry entry in dir) - { - string fileName = Path.GetFileName(entry.FilenameInZip); - string fullPath = Path.Combine(pluginsFolder, fileName); - if (File.Exists(fullPath)) - { - try - { - File.Delete(fullPath); - } - catch - { - MessageBox.Show($"{fullPath} already exists - unable to overwrite it"); - Cursor = Cursors.Default; - ChangeControlsState(true); - return; - } - } - zip.ExtractFile(entry, fullPath); - } - } - Cursor = Cursors.Default; - ChangeControlsState(true); - if (_updatingAllPlugins) - { - _updatingAllPluginsCount++; - if (_updatingAllPluginsCount == _updateAllListUrls.Count) - { - MessageBox.Show(string.Format(_language.XPluginsUpdated, _updatingAllPluginsCount)); - } - } - else - { - MessageBox.Show(string.Format(_language.PluginXDownloaded, _downloadedPluginName)); - } - ShowInstalledPlugins(); - - ((WebClient)sender).Dispose(); - } - - private void ChangeControlsState(bool enable) - { - if (enable) - { - labelPleaseWait.Text = string.Empty; - } - buttonOK.Enabled = enable; - buttonDownload.Enabled = enable; - listViewGetPlugins.Enabled = enable; - } - - private void linkLabelOpenDictionaryFolder_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) - { - string pluginsFolder = Configuration.PluginsDirectory; - if (!Directory.Exists(pluginsFolder)) - { - try - { - Directory.CreateDirectory(pluginsFolder); - } - catch (Exception exception) - { - MessageBox.Show($"Unable to create plugin folder {pluginsFolder}: {exception.Message}"); - return; - } - } - UiUtil.OpenFolder(pluginsFolder); - } - - private void PluginsGet_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - else if (e.KeyCode == UiUtil.HelpKeys) - { - Utilities.ShowHelp("#plugins"); - e.SuppressKeyPress = true; - } - else if (e.KeyCode == Keys.F5 && !_fetchingData) - { - DownloadPluginMetadataInfos(); - } - } - - private void buttonRemove_Click(object sender, EventArgs e) - { - if (listViewInstalledPlugins.SelectedItems.Count < 1) - { - return; - } - - string fileName = listViewInstalledPlugins.SelectedItems[0].Tag.ToString(); - int index = listViewInstalledPlugins.SelectedItems[0].Index; - if (File.Exists(fileName)) - { - try - { - File.Delete(fileName); - } - catch (Exception exception) - { - MessageBox.Show(exception.Message); - return; - } - } - listViewInstalledPlugins.Items.RemoveAt(index); - if (index >= listViewInstalledPlugins.Items.Count) - { - index--; - } - - if (index >= 0) - { - listViewInstalledPlugins.Items[index].Selected = true; - listViewInstalledPlugins.Items[index].Focused = true; - } - buttonUpdateAll.Visible = false; - DownloadPluginMetadataInfos(); - } - - private void buttonUpdateAll_Click(object sender, EventArgs e) - { - buttonUpdateAll.Enabled = false; - buttonUpdateAll.BackColor = DefaultBackColor; - try - { - labelPleaseWait.Text = Configuration.Settings.Language.General.PleaseWait; - ChangeControlsState(false); - Refresh(); - Cursor = Cursors.WaitCursor; - _updatingAllPluginsCount = 0; - _updatingAllPlugins = true; - for (int i = 0; i < _updateAllListUrls.Count; i++) - { - var wc = new WebClient { Proxy = Utilities.GetProxy() }; - wc.DownloadDataCompleted += wc_DownloadDataCompleted; - wc.DownloadDataAsync(new Uri(_updateAllListUrls[i])); - } - } - catch (Exception exception) - { - ChangeControlsState(true); - Cursor = Cursors.Default; - MessageBox.Show(exception.Message + Environment.NewLine + Environment.NewLine + exception.StackTrace); - } - } - - private void buttonSearchClear_Click(object sender, EventArgs e) - { - textBoxSearch.Text = string.Empty; - } - - private void textBoxSearch_TextChanged(object sender, EventArgs e) - { - listViewGetPlugins.BeginUpdate(); - listViewGetPlugins.Items.Clear(); - ShowAvailablePlugins(); - listViewGetPlugins.EndUpdate(); - buttonSearchClear.Enabled = textBoxSearch.Text.Length > 0; - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Globalization; +using System.IO; +using System.Net; +using System.Net.Cache; +using System.Windows.Forms; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class PluginsGet : Form + { + + public class PluginInfoItem + { + public string Version { get; set; } + public string Name { get; set; } + public string Description { get; set; } + public string Date { get; set; } + public string Url { get; set; } + } + + private List _downloadList; + + private string _downloadedPluginName; + private readonly LanguageStructure.PluginsGet _language; + private List _updateAllListUrls; + private bool _updatingAllPlugins; + private int _updatingAllPluginsCount; + private bool _fetchingData; + + private static string GetPluginXmlFileUrl() + { + if (Environment.Version.Major < 4) + { + return "https://raw.github.com/SubtitleEdit/plugins/master/Plugins2.xml"; // .net 2-3.5 + } + + return "https://raw.github.com/SubtitleEdit/plugins/master/Plugins4.xml"; // .net 4-? + } + + public PluginsGet() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + _language = Configuration.Settings.Language.PluginsGet; + Text = _language.Title; + tabPageInstalledPlugins.Text = _language.InstalledPlugins; + tabPageGetPlugins.Text = _language.GetPlugins; + + buttonDownload.Text = _language.Download; + buttonRemove.Text = _language.Remove; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + linkLabelOpenPluginFolder.Text = _language.OpenPluginsFolder; + labelDescription1.Text = _language.GetPluginsInfo1; + labelClickDownload.Text = _language.GetPluginsInfo2; + + columnHeaderName.Text = Configuration.Settings.Language.General.Name; + columnHeaderDescription.Text = _language.Description; + columnHeaderVersion.Text = _language.Version; + columnHeaderDate.Text = _language.Date; + + columnHeaderInsName.Text = Configuration.Settings.Language.General.Name; + columnHeaderInsDescription.Text = _language.Description; + columnHeaderInsVersion.Text = _language.Version; + columnHeaderInsType.Text = _language.Type; + + labelShortcutsSearch.Text = Configuration.Settings.Language.General.Search; + labelShortcutsSearch.Left = textBoxSearch.Left - labelShortcutsSearch.Width - 9; + buttonSearchClear.Text = Configuration.Settings.Language.DvdSubRip.Clear; + + buttonUpdateAll.Visible = false; + DownloadPluginMetadataInfos(); + } + + private void DownloadPluginMetadataInfos() + { + try + { + labelPleaseWait.Text = Configuration.Settings.Language.General.PleaseWait; + Refresh(); + ShowInstalledPlugins(); + string url = GetPluginXmlFileUrl(); + var wc = new WebClient + { + Proxy = Utilities.GetProxy(), + Encoding = System.Text.Encoding.UTF8, + CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore) + }; + wc.Headers.Add("Accept-Encoding", ""); + wc.DownloadStringCompleted += wc_DownloadStringCompleted; + _fetchingData = true; + wc.DownloadStringAsync(new Uri(url)); + } + catch (Exception exception) + { + ChangeControlsState(true); + MessageBox.Show(exception.Message + Environment.NewLine + Environment.NewLine + exception.StackTrace); + } + } + + private void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) + { + _fetchingData = false; + labelPleaseWait.Text = string.Empty; + if (e.Error != null) + { + MessageBox.Show(string.Format(_language.UnableToDownloadPluginListX, e.Error.Message)); + if (e.Error.InnerException != null) + { + MessageBox.Show(e.Error.InnerException.Source + ": " + e.Error.InnerException.Message + Environment.NewLine + Environment.NewLine + e.Error.InnerException.StackTrace); + } + return; + } + + var pluginDoc = new XmlDocument(); + _downloadList = new List(); + listViewGetPlugins.BeginUpdate(); + try + { + pluginDoc.LoadXml(e.Result); + string[] arr = pluginDoc.DocumentElement.SelectSingleNode("SubtitleEditVersion").InnerText.Split(new[] { '.', ',', ' ' }, StringSplitOptions.RemoveEmptyEntries); + double requiredVersion = Convert.ToDouble(arr[0] + "." + arr[1], CultureInfo.InvariantCulture); + + string[] versionInfo = Utilities.AssemblyVersion.Split('.'); + double currentVersion = Convert.ToDouble(versionInfo[0] + "." + versionInfo[1], CultureInfo.InvariantCulture); + + if (currentVersion < requiredVersion) + { + MessageBox.Show(_language.NewVersionOfSubtitleEditRequired); + DialogResult = DialogResult.Cancel; + return; + } + + _updateAllListUrls = new List(); + LoadAvailablePlugins(pluginDoc); + ShowAvailablePlugins(); + } + catch (Exception exception) + { + MessageBox.Show(string.Format(_language.UnableToDownloadPluginListX, exception.Source + ": " + exception.Message + Environment.NewLine + Environment.NewLine + exception.StackTrace)); + } + listViewGetPlugins.EndUpdate(); + + if (_updateAllListUrls.Count > 0) + { + buttonUpdateAll.BackColor = Color.LightGreen; + if (Configuration.Settings.Language.PluginsGet.UpdateAllX != null) + { + buttonUpdateAll.Text = string.Format(Configuration.Settings.Language.PluginsGet.UpdateAllX, _updateAllListUrls.Count); + } + else + { + buttonUpdateAll.Text = Configuration.Settings.Language.PluginsGet.UpdateAll; + } + + buttonUpdateAll.Visible = true; + } + } + + private void LoadAvailablePlugins(XmlDocument doc) + { + foreach (XmlNode node in doc.DocumentElement.SelectNodes("Plugin")) + { + var item = new PluginInfoItem + { + Name = node.SelectSingleNode("Name").InnerText.Trim('.'), + Description = node.SelectSingleNode("Description").InnerText.Trim('.'), + Version = node.SelectSingleNode("Version").InnerText, + Date = node.SelectSingleNode("Date").InnerText, + Url = node.SelectSingleNode("Url").InnerText, + }; + _downloadList.Add(item); + + foreach (ListViewItem installed in listViewInstalledPlugins.Items) + { + var installedVer = Convert.ToDouble(installed.SubItems[2].Text.Replace(',', '.').Replace(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, "."), CultureInfo.InvariantCulture); + var currentVer = Convert.ToDouble(node.SelectSingleNode("Version").InnerText.Replace(',', '.').Replace(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, "."), CultureInfo.InvariantCulture); + + if (string.Compare(installed.Text, node.SelectSingleNode("Name").InnerText.Trim('.'), StringComparison.OrdinalIgnoreCase) == 0 && installedVer < currentVer) + { + installed.BackColor = Color.LightPink; + installed.SubItems[1].Text = $"{_language.UpdateAvailable} {installed.SubItems[1].Text}"; + buttonUpdateAll.Visible = true; + _updateAllListUrls.Add(item.Url); + } + } + } + } + + private void ShowAvailablePlugins() + { + bool search = textBoxSearch.Text.Length > 1; + string searchText = textBoxSearch.Text; + listViewGetPlugins.BeginUpdate(); + if (listViewGetPlugins.Items.Count > 0) + { + listViewGetPlugins.Items.Clear(); + } + foreach (var plugin in _downloadList) + { + var item = new ListViewItem(plugin.Name) { Tag = plugin }; + item.SubItems.Add(plugin.Description); + item.SubItems.Add(plugin.Version); + item.SubItems.Add(plugin.Date); + + if (!search || + plugin.Name.Contains(searchText, StringComparison.OrdinalIgnoreCase) || + plugin.Description.Contains(searchText, StringComparison.OrdinalIgnoreCase) || + plugin.Version.Contains(searchText, StringComparison.OrdinalIgnoreCase)) + { + listViewGetPlugins.Items.Add(item); + } + } + listViewGetPlugins.EndUpdate(); + } + + private void ShowInstalledPlugins() + { + string path = Configuration.PluginsDirectory; + if (!Directory.Exists(path)) + { + return; + } + + listViewInstalledPlugins.BeginUpdate(); + listViewInstalledPlugins.Items.Clear(); + foreach (string pluginFileName in Directory.GetFiles(path, "*.DLL")) + { + Main.GetPropertiesAndDoAction(pluginFileName, out var name, out _, out var version, out var description, out var actionType, out _, out var mi); + if (!string.IsNullOrEmpty(name) && !string.IsNullOrEmpty(actionType) && mi != null) + { + try + { + var item = new ListViewItem(name.Trim('.')) { Tag = pluginFileName }; + item.SubItems.Add(description); + item.SubItems.Add(version.ToString(CultureInfo.InvariantCulture)); + item.SubItems.Add(actionType); + listViewInstalledPlugins.Items.Add(item); + } + catch (Exception exception) + { + MessageBox.Show($"Error loading plugin \"{pluginFileName}\": {exception.Message}"); + } + } + } + listViewInstalledPlugins.EndUpdate(); + } + + private void buttonDownload_Click(object sender, EventArgs e) + { + if (listViewGetPlugins.SelectedItems.Count == 0) + { + return; + } + + try + { + labelPleaseWait.Text = Configuration.Settings.Language.General.PleaseWait; + ChangeControlsState(false); + Refresh(); + Cursor = Cursors.WaitCursor; + + var plugin = (PluginInfoItem)listViewGetPlugins.SelectedItems[0].Tag; + + string url = plugin.Url; + _downloadedPluginName = plugin.Name; + + var wc = new WebClient { Proxy = Utilities.GetProxy(), CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore) }; + wc.DownloadDataCompleted += wc_DownloadDataCompleted; + wc.DownloadDataAsync(new Uri(url)); + } + catch (Exception exception) + { + ChangeControlsState(true); + Cursor = Cursors.Default; + MessageBox.Show(exception.Message + Environment.NewLine + Environment.NewLine + exception.StackTrace); + } + } + + private void wc_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e) + { + labelPleaseWait.Text = string.Empty; + if (e.Error != null) + { + MessageBox.Show(Configuration.Settings.Language.GetTesseractDictionaries.DownloadFailed); + ChangeControlsState(true); + Cursor = Cursors.Default; + DialogResult = DialogResult.Cancel; + return; + } + + string pluginsFolder = Configuration.PluginsDirectory; + if (!Directory.Exists(pluginsFolder)) + { + try + { + Directory.CreateDirectory(pluginsFolder); + } + catch (Exception exception) + { + MessageBox.Show($"Unable to create plugin folder {pluginsFolder}: {exception.Message}"); + ChangeControlsState(true); + Cursor = Cursors.Default; + return; + } + } + + var ms = new MemoryStream(e.Result); + using (ZipExtractor zip = ZipExtractor.Open(ms)) + { + List dir = zip.ReadCentralDir(); + + // Extract dic/aff files in dictionary folder + foreach (ZipExtractor.ZipFileEntry entry in dir) + { + string fileName = Path.GetFileName(entry.FilenameInZip); + string fullPath = Path.Combine(pluginsFolder, fileName); + if (File.Exists(fullPath)) + { + try + { + File.Delete(fullPath); + } + catch + { + MessageBox.Show($"{fullPath} already exists - unable to overwrite it"); + Cursor = Cursors.Default; + ChangeControlsState(true); + return; + } + } + zip.ExtractFile(entry, fullPath); + } + } + Cursor = Cursors.Default; + ChangeControlsState(true); + if (_updatingAllPlugins) + { + _updatingAllPluginsCount++; + if (_updatingAllPluginsCount == _updateAllListUrls.Count) + { + MessageBox.Show(string.Format(_language.XPluginsUpdated, _updatingAllPluginsCount)); + } + } + else + { + MessageBox.Show(string.Format(_language.PluginXDownloaded, _downloadedPluginName)); + } + ShowInstalledPlugins(); + + ((WebClient)sender).Dispose(); + } + + private void ChangeControlsState(bool enable) + { + if (enable) + { + labelPleaseWait.Text = string.Empty; + } + buttonOK.Enabled = enable; + buttonDownload.Enabled = enable; + listViewGetPlugins.Enabled = enable; + } + + private void linkLabelOpenDictionaryFolder_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + string pluginsFolder = Configuration.PluginsDirectory; + if (!Directory.Exists(pluginsFolder)) + { + try + { + Directory.CreateDirectory(pluginsFolder); + } + catch (Exception exception) + { + MessageBox.Show($"Unable to create plugin folder {pluginsFolder}: {exception.Message}"); + return; + } + } + UiUtil.OpenFolder(pluginsFolder); + } + + private void PluginsGet_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + else if (e.KeyCode == UiUtil.HelpKeys) + { + Utilities.ShowHelp("#plugins"); + e.SuppressKeyPress = true; + } + else if (e.KeyCode == Keys.F5 && !_fetchingData) + { + DownloadPluginMetadataInfos(); + } + } + + private void buttonRemove_Click(object sender, EventArgs e) + { + if (listViewInstalledPlugins.SelectedItems.Count < 1) + { + return; + } + + string fileName = listViewInstalledPlugins.SelectedItems[0].Tag.ToString(); + int index = listViewInstalledPlugins.SelectedItems[0].Index; + if (File.Exists(fileName)) + { + try + { + File.Delete(fileName); + } + catch (Exception exception) + { + MessageBox.Show(exception.Message); + return; + } + } + listViewInstalledPlugins.Items.RemoveAt(index); + if (index >= listViewInstalledPlugins.Items.Count) + { + index--; + } + + if (index >= 0) + { + listViewInstalledPlugins.Items[index].Selected = true; + listViewInstalledPlugins.Items[index].Focused = true; + } + buttonUpdateAll.Visible = false; + DownloadPluginMetadataInfos(); + } + + private void buttonUpdateAll_Click(object sender, EventArgs e) + { + buttonUpdateAll.Enabled = false; + buttonUpdateAll.BackColor = DefaultBackColor; + try + { + labelPleaseWait.Text = Configuration.Settings.Language.General.PleaseWait; + ChangeControlsState(false); + Refresh(); + Cursor = Cursors.WaitCursor; + _updatingAllPluginsCount = 0; + _updatingAllPlugins = true; + for (int i = 0; i < _updateAllListUrls.Count; i++) + { + var wc = new WebClient { Proxy = Utilities.GetProxy() }; + wc.DownloadDataCompleted += wc_DownloadDataCompleted; + wc.DownloadDataAsync(new Uri(_updateAllListUrls[i])); + } + } + catch (Exception exception) + { + ChangeControlsState(true); + Cursor = Cursors.Default; + MessageBox.Show(exception.Message + Environment.NewLine + Environment.NewLine + exception.StackTrace); + } + } + + private void buttonSearchClear_Click(object sender, EventArgs e) + { + textBoxSearch.Text = string.Empty; + } + + private void textBoxSearch_TextChanged(object sender, EventArgs e) + { + listViewGetPlugins.BeginUpdate(); + listViewGetPlugins.Items.Clear(); + ShowAvailablePlugins(); + listViewGetPlugins.EndUpdate(); + buttonSearchClear.Enabled = textBoxSearch.Text.Length > 0; + } + } +} diff --git a/src/Forms/PluginsGet.resx b/src/ui/Forms/PluginsGet.resx similarity index 97% rename from src/Forms/PluginsGet.resx rename to src/ui/Forms/PluginsGet.resx index 29dcb1b3a..1af7de150 100644 --- a/src/Forms/PluginsGet.resx +++ b/src/ui/Forms/PluginsGet.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Forms/PositionAndSizeForm.cs b/src/ui/Forms/PositionAndSizeForm.cs similarity index 100% rename from src/Forms/PositionAndSizeForm.cs rename to src/ui/Forms/PositionAndSizeForm.cs diff --git a/src/Forms/ProfileChoose.Designer.cs b/src/ui/Forms/ProfileChoose.Designer.cs similarity index 100% rename from src/Forms/ProfileChoose.Designer.cs rename to src/ui/Forms/ProfileChoose.Designer.cs diff --git a/src/Forms/ProfileChoose.cs b/src/ui/Forms/ProfileChoose.cs similarity index 100% rename from src/Forms/ProfileChoose.cs rename to src/ui/Forms/ProfileChoose.cs diff --git a/src/ui/Forms/ProfileChoose.resx b/src/ui/Forms/ProfileChoose.resx new file mode 100644 index 000000000..1af7de150 --- /dev/null +++ b/src/ui/Forms/ProfileChoose.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/src/Forms/RemoveTextFromHearImpaired.Designer.cs b/src/ui/Forms/RemoveTextFromHearImpaired.Designer.cs similarity index 98% rename from src/Forms/RemoveTextFromHearImpaired.Designer.cs rename to src/ui/Forms/RemoveTextFromHearImpaired.Designer.cs index 46abed379..ed85b5caa 100644 --- a/src/Forms/RemoveTextFromHearImpaired.Designer.cs +++ b/src/ui/Forms/RemoveTextFromHearImpaired.Designer.cs @@ -1,532 +1,532 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class FormRemoveTextForHearImpaired - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.buttonOK = new System.Windows.Forms.Button(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.groupBoxLinesFound = new System.Windows.Forms.GroupBox(); - this.listViewFixes = new System.Windows.Forms.ListView(); - this.columnHeaderApply = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderLine = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderBefore = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderAfter = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); - this.toolStripMenuItemSelAll = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemInvertSel = new System.Windows.Forms.ToolStripMenuItem(); - this.checkBoxRemoveTextBeforeColon = new System.Windows.Forms.CheckBox(); - this.groupBoxRemoveTextConditions = new System.Windows.Forms.GroupBox(); - this.checkBoxInterjectionOnlySeparateLine = new System.Windows.Forms.CheckBox(); - this.checkBoxRemoveIfAllUppercase = new System.Windows.Forms.CheckBox(); - this.checkBoxColonSeparateLine = new System.Windows.Forms.CheckBox(); - this.buttonEditInterjections = new System.Windows.Forms.Button(); - this.checkBoxRemoveInterjections = new System.Windows.Forms.CheckBox(); - this.labelRemoveTextBetween = new System.Windows.Forms.Label(); - this.comboBoxRemoveIfTextContains = new System.Windows.Forms.ComboBox(); - this.checkBoxRemoveWhereContains = new System.Windows.Forms.CheckBox(); - this.comboBoxCustomEnd = new System.Windows.Forms.ComboBox(); - this.comboBoxCustomStart = new System.Windows.Forms.ComboBox(); - this.checkBoxRemoveTextBeforeColonOnlyUppercase = new System.Windows.Forms.CheckBox(); - this.checkBoxOnlyIfInSeparateLine = new System.Windows.Forms.CheckBox(); - this.checkBoxRemoveTextBetweenCustomTags = new System.Windows.Forms.CheckBox(); - this.checkBoxRemoveTextBetweenQuestionMarks = new System.Windows.Forms.CheckBox(); - this.checkBoxRemoveTextBetweenParentheses = new System.Windows.Forms.CheckBox(); - this.checkBoxRemoveTextBetweenBrackets = new System.Windows.Forms.CheckBox(); - this.checkBoxRemoveTextBetweenSquares = new System.Windows.Forms.CheckBox(); - this.labelAnd = new System.Windows.Forms.Label(); - this.buttonApply = new System.Windows.Forms.Button(); - this.textBoxAfterText = new System.Windows.Forms.TextBox(); - this.labelText = new System.Windows.Forms.Label(); - this.groupBoxLinesFound.SuspendLayout(); - this.contextMenuStrip1.SuspendLayout(); - this.groupBoxRemoveTextConditions.SuspendLayout(); - this.SuspendLayout(); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.Location = new System.Drawing.Point(716, 563); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 3; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.Location = new System.Drawing.Point(797, 563); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 4; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - // - // groupBoxLinesFound - // - this.groupBoxLinesFound.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxLinesFound.Controls.Add(this.listViewFixes); - this.groupBoxLinesFound.Location = new System.Drawing.Point(12, 222); - this.groupBoxLinesFound.Name = "groupBoxLinesFound"; - this.groupBoxLinesFound.Size = new System.Drawing.Size(941, 291); - this.groupBoxLinesFound.TabIndex = 1; - this.groupBoxLinesFound.TabStop = false; - this.groupBoxLinesFound.Text = "Lines found"; - // - // listViewFixes - // - this.listViewFixes.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.listViewFixes.CheckBoxes = true; - this.listViewFixes.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeaderApply, - this.columnHeaderLine, - this.columnHeaderBefore, - this.columnHeaderAfter}); - this.listViewFixes.ContextMenuStrip = this.contextMenuStrip1; - this.listViewFixes.FullRowSelect = true; - this.listViewFixes.HideSelection = false; - this.listViewFixes.Location = new System.Drawing.Point(6, 17); - this.listViewFixes.Name = "listViewFixes"; - this.listViewFixes.Size = new System.Drawing.Size(929, 268); - this.listViewFixes.TabIndex = 0; - this.listViewFixes.UseCompatibleStateImageBehavior = false; - this.listViewFixes.View = System.Windows.Forms.View.Details; - this.listViewFixes.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.listViewFixes_ItemChecked); - this.listViewFixes.SelectedIndexChanged += new System.EventHandler(this.listViewFixes_SelectedIndexChanged); - // - // columnHeaderApply - // - this.columnHeaderApply.Text = "Apply"; - this.columnHeaderApply.Width = 45; - // - // columnHeaderLine - // - this.columnHeaderLine.Text = "Line#"; - this.columnHeaderLine.Width = 61; - // - // columnHeaderBefore - // - this.columnHeaderBefore.Text = "Before"; - this.columnHeaderBefore.Width = 401; - // - // columnHeaderAfter - // - this.columnHeaderAfter.Text = "After"; - this.columnHeaderAfter.Width = 395; - // - // contextMenuStrip1 - // - this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripMenuItemSelAll, - this.toolStripMenuItemInvertSel}); - this.contextMenuStrip1.Name = "contextMenuStrip1"; - this.contextMenuStrip1.Size = new System.Drawing.Size(155, 48); - // - // toolStripMenuItemSelAll - // - this.toolStripMenuItemSelAll.Name = "toolStripMenuItemSelAll"; - this.toolStripMenuItemSelAll.Size = new System.Drawing.Size(154, 22); - this.toolStripMenuItemSelAll.Text = "Select all"; - this.toolStripMenuItemSelAll.Click += new System.EventHandler(this.toolStripMenuItemSelAll_Click); - // - // toolStripMenuItemInvertSel - // - this.toolStripMenuItemInvertSel.Name = "toolStripMenuItemInvertSel"; - this.toolStripMenuItemInvertSel.Size = new System.Drawing.Size(154, 22); - this.toolStripMenuItemInvertSel.Text = "Invert selection"; - this.toolStripMenuItemInvertSel.Click += new System.EventHandler(this.toolStripMenuItemInvertSel_Click); - // - // checkBoxRemoveTextBeforeColon - // - this.checkBoxRemoveTextBeforeColon.AutoSize = true; - this.checkBoxRemoveTextBeforeColon.Checked = true; - this.checkBoxRemoveTextBeforeColon.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxRemoveTextBeforeColon.Location = new System.Drawing.Point(241, 26); - this.checkBoxRemoveTextBeforeColon.Name = "checkBoxRemoveTextBeforeColon"; - this.checkBoxRemoveTextBeforeColon.Size = new System.Drawing.Size(175, 17); - this.checkBoxRemoveTextBeforeColon.TabIndex = 10; - this.checkBoxRemoveTextBeforeColon.Text = "Remove text before a colon (:)"; - this.checkBoxRemoveTextBeforeColon.UseVisualStyleBackColor = true; - this.checkBoxRemoveTextBeforeColon.CheckedChanged += new System.EventHandler(this.checkBoxRemoveTextBeforeColon_CheckedChanged); - // - // groupBoxRemoveTextConditions - // - this.groupBoxRemoveTextConditions.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxRemoveTextConditions.Controls.Add(this.checkBoxInterjectionOnlySeparateLine); - this.groupBoxRemoveTextConditions.Controls.Add(this.checkBoxRemoveIfAllUppercase); - this.groupBoxRemoveTextConditions.Controls.Add(this.checkBoxColonSeparateLine); - this.groupBoxRemoveTextConditions.Controls.Add(this.buttonEditInterjections); - this.groupBoxRemoveTextConditions.Controls.Add(this.checkBoxRemoveInterjections); - this.groupBoxRemoveTextConditions.Controls.Add(this.labelRemoveTextBetween); - this.groupBoxRemoveTextConditions.Controls.Add(this.comboBoxRemoveIfTextContains); - this.groupBoxRemoveTextConditions.Controls.Add(this.checkBoxRemoveWhereContains); - this.groupBoxRemoveTextConditions.Controls.Add(this.comboBoxCustomEnd); - this.groupBoxRemoveTextConditions.Controls.Add(this.comboBoxCustomStart); - this.groupBoxRemoveTextConditions.Controls.Add(this.checkBoxRemoveTextBeforeColonOnlyUppercase); - this.groupBoxRemoveTextConditions.Controls.Add(this.checkBoxRemoveTextBeforeColon); - this.groupBoxRemoveTextConditions.Controls.Add(this.checkBoxOnlyIfInSeparateLine); - this.groupBoxRemoveTextConditions.Controls.Add(this.checkBoxRemoveTextBetweenCustomTags); - this.groupBoxRemoveTextConditions.Controls.Add(this.checkBoxRemoveTextBetweenQuestionMarks); - this.groupBoxRemoveTextConditions.Controls.Add(this.checkBoxRemoveTextBetweenParentheses); - this.groupBoxRemoveTextConditions.Controls.Add(this.checkBoxRemoveTextBetweenBrackets); - this.groupBoxRemoveTextConditions.Controls.Add(this.checkBoxRemoveTextBetweenSquares); - this.groupBoxRemoveTextConditions.Controls.Add(this.labelAnd); - this.groupBoxRemoveTextConditions.Location = new System.Drawing.Point(12, 12); - this.groupBoxRemoveTextConditions.Name = "groupBoxRemoveTextConditions"; - this.groupBoxRemoveTextConditions.Size = new System.Drawing.Size(941, 204); - this.groupBoxRemoveTextConditions.TabIndex = 0; - this.groupBoxRemoveTextConditions.TabStop = false; - this.groupBoxRemoveTextConditions.Text = "Remove text conditions"; - // - // checkBoxInterjectionOnlySeparateLine - // - this.checkBoxInterjectionOnlySeparateLine.AutoSize = true; - this.checkBoxInterjectionOnlySeparateLine.Location = new System.Drawing.Point(600, 53); - this.checkBoxInterjectionOnlySeparateLine.Name = "checkBoxInterjectionOnlySeparateLine"; - this.checkBoxInterjectionOnlySeparateLine.Size = new System.Drawing.Size(137, 17); - this.checkBoxInterjectionOnlySeparateLine.TabIndex = 18; - this.checkBoxInterjectionOnlySeparateLine.Text = "Only if on separate line"; - this.checkBoxInterjectionOnlySeparateLine.UseVisualStyleBackColor = true; - this.checkBoxInterjectionOnlySeparateLine.CheckedChanged += new System.EventHandler(this.checkBoxInterjectionOnlySeparateLine_CheckedChanged); - // - // checkBoxRemoveIfAllUppercase - // - this.checkBoxRemoveIfAllUppercase.AutoSize = true; - this.checkBoxRemoveIfAllUppercase.Checked = true; - this.checkBoxRemoveIfAllUppercase.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxRemoveIfAllUppercase.Location = new System.Drawing.Point(241, 102); - this.checkBoxRemoveIfAllUppercase.Name = "checkBoxRemoveIfAllUppercase"; - this.checkBoxRemoveIfAllUppercase.Size = new System.Drawing.Size(142, 17); - this.checkBoxRemoveIfAllUppercase.TabIndex = 13; - this.checkBoxRemoveIfAllUppercase.Text = "Remove uppercase lines"; - this.checkBoxRemoveIfAllUppercase.UseVisualStyleBackColor = true; - this.checkBoxRemoveIfAllUppercase.CheckedChanged += new System.EventHandler(this.checkBoxRemoveIfAllUppercase_CheckedChanged); - // - // checkBoxColonSeparateLine - // - this.checkBoxColonSeparateLine.AutoSize = true; - this.checkBoxColonSeparateLine.Location = new System.Drawing.Point(261, 69); - this.checkBoxColonSeparateLine.Name = "checkBoxColonSeparateLine"; - this.checkBoxColonSeparateLine.Size = new System.Drawing.Size(137, 17); - this.checkBoxColonSeparateLine.TabIndex = 12; - this.checkBoxColonSeparateLine.Text = "Only if on separate line"; - this.checkBoxColonSeparateLine.UseVisualStyleBackColor = true; - this.checkBoxColonSeparateLine.CheckedChanged += new System.EventHandler(this.CheckBoxRemoveTextBetweenCheckedChanged); - // - // buttonEditInterjections - // - this.buttonEditInterjections.Location = new System.Drawing.Point(718, 26); - this.buttonEditInterjections.Name = "buttonEditInterjections"; - this.buttonEditInterjections.Size = new System.Drawing.Size(103, 23); - this.buttonEditInterjections.TabIndex = 17; - this.buttonEditInterjections.Text = "Edit..."; - this.buttonEditInterjections.UseVisualStyleBackColor = true; - this.buttonEditInterjections.Click += new System.EventHandler(this.buttonEditInterjections_Click); - // - // checkBoxRemoveInterjections - // - this.checkBoxRemoveInterjections.AutoSize = true; - this.checkBoxRemoveInterjections.Location = new System.Drawing.Point(582, 30); - this.checkBoxRemoveInterjections.Name = "checkBoxRemoveInterjections"; - this.checkBoxRemoveInterjections.Size = new System.Drawing.Size(130, 17); - this.checkBoxRemoveInterjections.TabIndex = 16; - this.checkBoxRemoveInterjections.Text = "Remove interjections "; - this.checkBoxRemoveInterjections.UseVisualStyleBackColor = true; - this.checkBoxRemoveInterjections.CheckedChanged += new System.EventHandler(this.checkBoxRemoveInterjections_CheckedChanged); - // - // labelRemoveTextBetween - // - this.labelRemoveTextBetween.AutoSize = true; - this.labelRemoveTextBetween.Location = new System.Drawing.Point(8, 26); - this.labelRemoveTextBetween.Name = "labelRemoveTextBetween"; - this.labelRemoveTextBetween.Size = new System.Drawing.Size(114, 13); - this.labelRemoveTextBetween.TabIndex = 0; - this.labelRemoveTextBetween.Text = "Remove text between"; - // - // comboBoxRemoveIfTextContains - // - this.comboBoxRemoveIfTextContains.FormattingEnabled = true; - this.comboBoxRemoveIfTextContains.Items.AddRange(new object[] { - "¶", - "♪", - "♫", - "♪,♫"}); - this.comboBoxRemoveIfTextContains.Location = new System.Drawing.Point(427, 131); - this.comboBoxRemoveIfTextContains.MaxLength = 10; - this.comboBoxRemoveIfTextContains.Name = "comboBoxRemoveIfTextContains"; - this.comboBoxRemoveIfTextContains.Size = new System.Drawing.Size(100, 21); - this.comboBoxRemoveIfTextContains.TabIndex = 15; - this.comboBoxRemoveIfTextContains.Text = "¶"; - this.comboBoxRemoveIfTextContains.TextChanged += new System.EventHandler(this.CheckBoxRemoveTextBetweenCheckedChanged); - // - // checkBoxRemoveWhereContains - // - this.checkBoxRemoveWhereContains.AutoSize = true; - this.checkBoxRemoveWhereContains.Location = new System.Drawing.Point(241, 135); - this.checkBoxRemoveWhereContains.Name = "checkBoxRemoveWhereContains"; - this.checkBoxRemoveWhereContains.Size = new System.Drawing.Size(153, 17); - this.checkBoxRemoveWhereContains.TabIndex = 14; - this.checkBoxRemoveWhereContains.Text = "Remove text if it contains:"; - this.checkBoxRemoveWhereContains.UseVisualStyleBackColor = true; - this.checkBoxRemoveWhereContains.CheckedChanged += new System.EventHandler(this.CheckBoxRemoveTextBetweenCheckedChanged); - // - // comboBoxCustomEnd - // - this.comboBoxCustomEnd.FormattingEnabled = true; - this.comboBoxCustomEnd.Items.AddRange(new object[] { - "¶", - "♪", - "♫"}); - this.comboBoxCustomEnd.Location = new System.Drawing.Point(116, 135); - this.comboBoxCustomEnd.MaxLength = 2; - this.comboBoxCustomEnd.Name = "comboBoxCustomEnd"; - this.comboBoxCustomEnd.Size = new System.Drawing.Size(38, 21); - this.comboBoxCustomEnd.TabIndex = 8; - this.comboBoxCustomEnd.Text = "¶"; - this.comboBoxCustomEnd.TextChanged += new System.EventHandler(this.CheckBoxRemoveTextBetweenCheckedChanged); - // - // comboBoxCustomStart - // - this.comboBoxCustomStart.FormattingEnabled = true; - this.comboBoxCustomStart.Items.AddRange(new object[] { - "¶", - "♪", - "♫"}); - this.comboBoxCustomStart.Location = new System.Drawing.Point(41, 135); - this.comboBoxCustomStart.MaxLength = 2; - this.comboBoxCustomStart.Name = "comboBoxCustomStart"; - this.comboBoxCustomStart.Size = new System.Drawing.Size(38, 21); - this.comboBoxCustomStart.TabIndex = 6; - this.comboBoxCustomStart.Text = "¶"; - this.comboBoxCustomStart.TextChanged += new System.EventHandler(this.CheckBoxRemoveTextBetweenCheckedChanged); - // - // checkBoxRemoveTextBeforeColonOnlyUppercase - // - this.checkBoxRemoveTextBeforeColonOnlyUppercase.AutoSize = true; - this.checkBoxRemoveTextBeforeColonOnlyUppercase.Location = new System.Drawing.Point(261, 46); - this.checkBoxRemoveTextBeforeColonOnlyUppercase.Name = "checkBoxRemoveTextBeforeColonOnlyUppercase"; - this.checkBoxRemoveTextBeforeColonOnlyUppercase.Size = new System.Drawing.Size(151, 17); - this.checkBoxRemoveTextBeforeColonOnlyUppercase.TabIndex = 11; - this.checkBoxRemoveTextBeforeColonOnlyUppercase.Text = "Only if text is UPPERCASE"; - this.checkBoxRemoveTextBeforeColonOnlyUppercase.UseVisualStyleBackColor = true; - this.checkBoxRemoveTextBeforeColonOnlyUppercase.CheckedChanged += new System.EventHandler(this.CheckBoxRemoveTextBetweenCheckedChanged); - // - // checkBoxOnlyIfInSeparateLine - // - this.checkBoxOnlyIfInSeparateLine.AutoSize = true; - this.checkBoxOnlyIfInSeparateLine.Location = new System.Drawing.Point(21, 172); - this.checkBoxOnlyIfInSeparateLine.Name = "checkBoxOnlyIfInSeparateLine"; - this.checkBoxOnlyIfInSeparateLine.Size = new System.Drawing.Size(137, 17); - this.checkBoxOnlyIfInSeparateLine.TabIndex = 9; - this.checkBoxOnlyIfInSeparateLine.Text = "Only if on separate line"; - this.checkBoxOnlyIfInSeparateLine.UseVisualStyleBackColor = true; - this.checkBoxOnlyIfInSeparateLine.CheckedChanged += new System.EventHandler(this.CheckBoxRemoveTextBetweenCheckedChanged); - // - // checkBoxRemoveTextBetweenCustomTags - // - this.checkBoxRemoveTextBetweenCustomTags.AutoSize = true; - this.checkBoxRemoveTextBetweenCustomTags.Checked = true; - this.checkBoxRemoveTextBetweenCustomTags.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxRemoveTextBetweenCustomTags.Location = new System.Drawing.Point(20, 138); - this.checkBoxRemoveTextBetweenCustomTags.Name = "checkBoxRemoveTextBetweenCustomTags"; - this.checkBoxRemoveTextBetweenCustomTags.Size = new System.Drawing.Size(15, 14); - this.checkBoxRemoveTextBetweenCustomTags.TabIndex = 5; - this.checkBoxRemoveTextBetweenCustomTags.UseVisualStyleBackColor = true; - this.checkBoxRemoveTextBetweenCustomTags.CheckedChanged += new System.EventHandler(this.CheckBoxRemoveTextBetweenCheckedChanged); - // - // checkBoxRemoveTextBetweenQuestionMarks - // - this.checkBoxRemoveTextBetweenQuestionMarks.AutoSize = true; - this.checkBoxRemoveTextBetweenQuestionMarks.Checked = true; - this.checkBoxRemoveTextBetweenQuestionMarks.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxRemoveTextBetweenQuestionMarks.Location = new System.Drawing.Point(20, 115); - this.checkBoxRemoveTextBetweenQuestionMarks.Name = "checkBoxRemoveTextBetweenQuestionMarks"; - this.checkBoxRemoveTextBetweenQuestionMarks.Size = new System.Drawing.Size(76, 17); - this.checkBoxRemoveTextBetweenQuestionMarks.TabIndex = 4; - this.checkBoxRemoveTextBetweenQuestionMarks.Text = "\"?\" and \"?\""; - this.checkBoxRemoveTextBetweenQuestionMarks.UseVisualStyleBackColor = true; - this.checkBoxRemoveTextBetweenQuestionMarks.CheckedChanged += new System.EventHandler(this.CheckBoxRemoveTextBetweenCheckedChanged); - // - // checkBoxRemoveTextBetweenParentheses - // - this.checkBoxRemoveTextBetweenParentheses.AutoSize = true; - this.checkBoxRemoveTextBetweenParentheses.Checked = true; - this.checkBoxRemoveTextBetweenParentheses.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxRemoveTextBetweenParentheses.Location = new System.Drawing.Point(20, 69); - this.checkBoxRemoveTextBetweenParentheses.Name = "checkBoxRemoveTextBetweenParentheses"; - this.checkBoxRemoveTextBetweenParentheses.Size = new System.Drawing.Size(74, 17); - this.checkBoxRemoveTextBetweenParentheses.TabIndex = 2; - this.checkBoxRemoveTextBetweenParentheses.Text = "\"(\" and \")\""; - this.checkBoxRemoveTextBetweenParentheses.UseVisualStyleBackColor = true; - this.checkBoxRemoveTextBetweenParentheses.CheckedChanged += new System.EventHandler(this.CheckBoxRemoveTextBetweenCheckedChanged); - // - // checkBoxRemoveTextBetweenBrackets - // - this.checkBoxRemoveTextBetweenBrackets.AutoSize = true; - this.checkBoxRemoveTextBetweenBrackets.Checked = true; - this.checkBoxRemoveTextBetweenBrackets.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxRemoveTextBetweenBrackets.Location = new System.Drawing.Point(20, 92); - this.checkBoxRemoveTextBetweenBrackets.Name = "checkBoxRemoveTextBetweenBrackets"; - this.checkBoxRemoveTextBetweenBrackets.Size = new System.Drawing.Size(76, 17); - this.checkBoxRemoveTextBetweenBrackets.TabIndex = 3; - this.checkBoxRemoveTextBetweenBrackets.Text = "\"{\" and \"}\""; - this.checkBoxRemoveTextBetweenBrackets.UseVisualStyleBackColor = true; - this.checkBoxRemoveTextBetweenBrackets.CheckedChanged += new System.EventHandler(this.CheckBoxRemoveTextBetweenCheckedChanged); - // - // checkBoxRemoveTextBetweenSquares - // - this.checkBoxRemoveTextBetweenSquares.AutoSize = true; - this.checkBoxRemoveTextBetweenSquares.Checked = true; - this.checkBoxRemoveTextBetweenSquares.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxRemoveTextBetweenSquares.Location = new System.Drawing.Point(20, 45); - this.checkBoxRemoveTextBetweenSquares.Name = "checkBoxRemoveTextBetweenSquares"; - this.checkBoxRemoveTextBetweenSquares.Size = new System.Drawing.Size(74, 17); - this.checkBoxRemoveTextBetweenSquares.TabIndex = 1; - this.checkBoxRemoveTextBetweenSquares.Text = "\"[\" and \"]\""; - this.checkBoxRemoveTextBetweenSquares.UseVisualStyleBackColor = true; - this.checkBoxRemoveTextBetweenSquares.CheckedChanged += new System.EventHandler(this.CheckBoxRemoveTextBetweenCheckedChanged); - // - // labelAnd - // - this.labelAnd.AutoSize = true; - this.labelAnd.Location = new System.Drawing.Point(85, 141); - this.labelAnd.Name = "labelAnd"; - this.labelAnd.Size = new System.Drawing.Size(25, 13); - this.labelAnd.TabIndex = 7; - this.labelAnd.Text = "and"; - // - // buttonApply - // - this.buttonApply.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonApply.Location = new System.Drawing.Point(878, 563); - this.buttonApply.Name = "buttonApply"; - this.buttonApply.Size = new System.Drawing.Size(75, 23); - this.buttonApply.TabIndex = 5; - this.buttonApply.Text = "Apply"; - this.buttonApply.UseVisualStyleBackColor = true; - this.buttonApply.Click += new System.EventHandler(this.buttonApply_Click); - // - // textBoxAfterText - // - this.textBoxAfterText.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.textBoxAfterText.Location = new System.Drawing.Point(12, 543); - this.textBoxAfterText.Multiline = true; - this.textBoxAfterText.Name = "textBoxAfterText"; - this.textBoxAfterText.Size = new System.Drawing.Size(394, 43); - this.textBoxAfterText.TabIndex = 2; - this.textBoxAfterText.TextChanged += new System.EventHandler(this.textBoxAfterText_TextChanged); - // - // labelText - // - this.labelText.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelText.AutoSize = true; - this.labelText.Location = new System.Drawing.Point(12, 527); - this.labelText.Name = "labelText"; - this.labelText.Size = new System.Drawing.Size(29, 13); - this.labelText.TabIndex = 6; - this.labelText.Text = "Text"; - // - // FormRemoveTextForHearImpaired - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(965, 598); - this.Controls.Add(this.labelText); - this.Controls.Add(this.textBoxAfterText); - this.Controls.Add(this.buttonApply); - this.Controls.Add(this.groupBoxRemoveTextConditions); - this.Controls.Add(this.groupBoxLinesFound); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.buttonCancel); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.KeyPreview = true; - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(705, 514); - this.Name = "FormRemoveTextForHearImpaired"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Remove text for hearing impaired"; - this.Load += new System.EventHandler(this.FormRemoveTextForHearImpaired_Load); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormRemoveTextForHearImpaired_KeyDown); - this.Resize += new System.EventHandler(this.FormRemoveTextForHearImpaired_Resize); - this.groupBoxLinesFound.ResumeLayout(false); - this.contextMenuStrip1.ResumeLayout(false); - this.groupBoxRemoveTextConditions.ResumeLayout(false); - this.groupBoxRemoveTextConditions.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.GroupBox groupBoxLinesFound; - private System.Windows.Forms.ListView listViewFixes; - private System.Windows.Forms.ColumnHeader columnHeaderApply; - private System.Windows.Forms.ColumnHeader columnHeaderLine; - private System.Windows.Forms.ColumnHeader columnHeaderBefore; - private System.Windows.Forms.ColumnHeader columnHeaderAfter; - private System.Windows.Forms.CheckBox checkBoxRemoveTextBeforeColon; - private System.Windows.Forms.GroupBox groupBoxRemoveTextConditions; - private System.Windows.Forms.CheckBox checkBoxRemoveTextBetweenCustomTags; - private System.Windows.Forms.CheckBox checkBoxRemoveTextBetweenQuestionMarks; - private System.Windows.Forms.CheckBox checkBoxRemoveTextBetweenParentheses; - private System.Windows.Forms.CheckBox checkBoxRemoveTextBetweenBrackets; - private System.Windows.Forms.CheckBox checkBoxRemoveTextBetweenSquares; - private System.Windows.Forms.Label labelAnd; - private System.Windows.Forms.CheckBox checkBoxRemoveTextBeforeColonOnlyUppercase; - private System.Windows.Forms.CheckBox checkBoxOnlyIfInSeparateLine; - private System.Windows.Forms.ComboBox comboBoxCustomStart; - private System.Windows.Forms.ComboBox comboBoxCustomEnd; - private System.Windows.Forms.ComboBox comboBoxRemoveIfTextContains; - private System.Windows.Forms.CheckBox checkBoxRemoveWhereContains; - private System.Windows.Forms.Label labelRemoveTextBetween; - private System.Windows.Forms.CheckBox checkBoxRemoveInterjections; - private System.Windows.Forms.Button buttonEditInterjections; - private System.Windows.Forms.CheckBox checkBoxColonSeparateLine; - private System.Windows.Forms.CheckBox checkBoxRemoveIfAllUppercase; - private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSelAll; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInvertSel; - private System.Windows.Forms.Button buttonApply; - private System.Windows.Forms.CheckBox checkBoxInterjectionOnlySeparateLine; - private System.Windows.Forms.TextBox textBoxAfterText; - private System.Windows.Forms.Label labelText; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class FormRemoveTextForHearImpaired + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.buttonOK = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.groupBoxLinesFound = new System.Windows.Forms.GroupBox(); + this.listViewFixes = new System.Windows.Forms.ListView(); + this.columnHeaderApply = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderLine = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderBefore = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderAfter = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItemSelAll = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemInvertSel = new System.Windows.Forms.ToolStripMenuItem(); + this.checkBoxRemoveTextBeforeColon = new System.Windows.Forms.CheckBox(); + this.groupBoxRemoveTextConditions = new System.Windows.Forms.GroupBox(); + this.checkBoxInterjectionOnlySeparateLine = new System.Windows.Forms.CheckBox(); + this.checkBoxRemoveIfAllUppercase = new System.Windows.Forms.CheckBox(); + this.checkBoxColonSeparateLine = new System.Windows.Forms.CheckBox(); + this.buttonEditInterjections = new System.Windows.Forms.Button(); + this.checkBoxRemoveInterjections = new System.Windows.Forms.CheckBox(); + this.labelRemoveTextBetween = new System.Windows.Forms.Label(); + this.comboBoxRemoveIfTextContains = new System.Windows.Forms.ComboBox(); + this.checkBoxRemoveWhereContains = new System.Windows.Forms.CheckBox(); + this.comboBoxCustomEnd = new System.Windows.Forms.ComboBox(); + this.comboBoxCustomStart = new System.Windows.Forms.ComboBox(); + this.checkBoxRemoveTextBeforeColonOnlyUppercase = new System.Windows.Forms.CheckBox(); + this.checkBoxOnlyIfInSeparateLine = new System.Windows.Forms.CheckBox(); + this.checkBoxRemoveTextBetweenCustomTags = new System.Windows.Forms.CheckBox(); + this.checkBoxRemoveTextBetweenQuestionMarks = new System.Windows.Forms.CheckBox(); + this.checkBoxRemoveTextBetweenParentheses = new System.Windows.Forms.CheckBox(); + this.checkBoxRemoveTextBetweenBrackets = new System.Windows.Forms.CheckBox(); + this.checkBoxRemoveTextBetweenSquares = new System.Windows.Forms.CheckBox(); + this.labelAnd = new System.Windows.Forms.Label(); + this.buttonApply = new System.Windows.Forms.Button(); + this.textBoxAfterText = new System.Windows.Forms.TextBox(); + this.labelText = new System.Windows.Forms.Label(); + this.groupBoxLinesFound.SuspendLayout(); + this.contextMenuStrip1.SuspendLayout(); + this.groupBoxRemoveTextConditions.SuspendLayout(); + this.SuspendLayout(); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.Location = new System.Drawing.Point(716, 563); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 3; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.Location = new System.Drawing.Point(797, 563); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 4; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + // + // groupBoxLinesFound + // + this.groupBoxLinesFound.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxLinesFound.Controls.Add(this.listViewFixes); + this.groupBoxLinesFound.Location = new System.Drawing.Point(12, 222); + this.groupBoxLinesFound.Name = "groupBoxLinesFound"; + this.groupBoxLinesFound.Size = new System.Drawing.Size(941, 291); + this.groupBoxLinesFound.TabIndex = 1; + this.groupBoxLinesFound.TabStop = false; + this.groupBoxLinesFound.Text = "Lines found"; + // + // listViewFixes + // + this.listViewFixes.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listViewFixes.CheckBoxes = true; + this.listViewFixes.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeaderApply, + this.columnHeaderLine, + this.columnHeaderBefore, + this.columnHeaderAfter}); + this.listViewFixes.ContextMenuStrip = this.contextMenuStrip1; + this.listViewFixes.FullRowSelect = true; + this.listViewFixes.HideSelection = false; + this.listViewFixes.Location = new System.Drawing.Point(6, 17); + this.listViewFixes.Name = "listViewFixes"; + this.listViewFixes.Size = new System.Drawing.Size(929, 268); + this.listViewFixes.TabIndex = 0; + this.listViewFixes.UseCompatibleStateImageBehavior = false; + this.listViewFixes.View = System.Windows.Forms.View.Details; + this.listViewFixes.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.listViewFixes_ItemChecked); + this.listViewFixes.SelectedIndexChanged += new System.EventHandler(this.listViewFixes_SelectedIndexChanged); + // + // columnHeaderApply + // + this.columnHeaderApply.Text = "Apply"; + this.columnHeaderApply.Width = 45; + // + // columnHeaderLine + // + this.columnHeaderLine.Text = "Line#"; + this.columnHeaderLine.Width = 61; + // + // columnHeaderBefore + // + this.columnHeaderBefore.Text = "Before"; + this.columnHeaderBefore.Width = 401; + // + // columnHeaderAfter + // + this.columnHeaderAfter.Text = "After"; + this.columnHeaderAfter.Width = 395; + // + // contextMenuStrip1 + // + this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItemSelAll, + this.toolStripMenuItemInvertSel}); + this.contextMenuStrip1.Name = "contextMenuStrip1"; + this.contextMenuStrip1.Size = new System.Drawing.Size(155, 48); + // + // toolStripMenuItemSelAll + // + this.toolStripMenuItemSelAll.Name = "toolStripMenuItemSelAll"; + this.toolStripMenuItemSelAll.Size = new System.Drawing.Size(154, 22); + this.toolStripMenuItemSelAll.Text = "Select all"; + this.toolStripMenuItemSelAll.Click += new System.EventHandler(this.toolStripMenuItemSelAll_Click); + // + // toolStripMenuItemInvertSel + // + this.toolStripMenuItemInvertSel.Name = "toolStripMenuItemInvertSel"; + this.toolStripMenuItemInvertSel.Size = new System.Drawing.Size(154, 22); + this.toolStripMenuItemInvertSel.Text = "Invert selection"; + this.toolStripMenuItemInvertSel.Click += new System.EventHandler(this.toolStripMenuItemInvertSel_Click); + // + // checkBoxRemoveTextBeforeColon + // + this.checkBoxRemoveTextBeforeColon.AutoSize = true; + this.checkBoxRemoveTextBeforeColon.Checked = true; + this.checkBoxRemoveTextBeforeColon.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxRemoveTextBeforeColon.Location = new System.Drawing.Point(241, 26); + this.checkBoxRemoveTextBeforeColon.Name = "checkBoxRemoveTextBeforeColon"; + this.checkBoxRemoveTextBeforeColon.Size = new System.Drawing.Size(175, 17); + this.checkBoxRemoveTextBeforeColon.TabIndex = 10; + this.checkBoxRemoveTextBeforeColon.Text = "Remove text before a colon (:)"; + this.checkBoxRemoveTextBeforeColon.UseVisualStyleBackColor = true; + this.checkBoxRemoveTextBeforeColon.CheckedChanged += new System.EventHandler(this.checkBoxRemoveTextBeforeColon_CheckedChanged); + // + // groupBoxRemoveTextConditions + // + this.groupBoxRemoveTextConditions.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxRemoveTextConditions.Controls.Add(this.checkBoxInterjectionOnlySeparateLine); + this.groupBoxRemoveTextConditions.Controls.Add(this.checkBoxRemoveIfAllUppercase); + this.groupBoxRemoveTextConditions.Controls.Add(this.checkBoxColonSeparateLine); + this.groupBoxRemoveTextConditions.Controls.Add(this.buttonEditInterjections); + this.groupBoxRemoveTextConditions.Controls.Add(this.checkBoxRemoveInterjections); + this.groupBoxRemoveTextConditions.Controls.Add(this.labelRemoveTextBetween); + this.groupBoxRemoveTextConditions.Controls.Add(this.comboBoxRemoveIfTextContains); + this.groupBoxRemoveTextConditions.Controls.Add(this.checkBoxRemoveWhereContains); + this.groupBoxRemoveTextConditions.Controls.Add(this.comboBoxCustomEnd); + this.groupBoxRemoveTextConditions.Controls.Add(this.comboBoxCustomStart); + this.groupBoxRemoveTextConditions.Controls.Add(this.checkBoxRemoveTextBeforeColonOnlyUppercase); + this.groupBoxRemoveTextConditions.Controls.Add(this.checkBoxRemoveTextBeforeColon); + this.groupBoxRemoveTextConditions.Controls.Add(this.checkBoxOnlyIfInSeparateLine); + this.groupBoxRemoveTextConditions.Controls.Add(this.checkBoxRemoveTextBetweenCustomTags); + this.groupBoxRemoveTextConditions.Controls.Add(this.checkBoxRemoveTextBetweenQuestionMarks); + this.groupBoxRemoveTextConditions.Controls.Add(this.checkBoxRemoveTextBetweenParentheses); + this.groupBoxRemoveTextConditions.Controls.Add(this.checkBoxRemoveTextBetweenBrackets); + this.groupBoxRemoveTextConditions.Controls.Add(this.checkBoxRemoveTextBetweenSquares); + this.groupBoxRemoveTextConditions.Controls.Add(this.labelAnd); + this.groupBoxRemoveTextConditions.Location = new System.Drawing.Point(12, 12); + this.groupBoxRemoveTextConditions.Name = "groupBoxRemoveTextConditions"; + this.groupBoxRemoveTextConditions.Size = new System.Drawing.Size(941, 204); + this.groupBoxRemoveTextConditions.TabIndex = 0; + this.groupBoxRemoveTextConditions.TabStop = false; + this.groupBoxRemoveTextConditions.Text = "Remove text conditions"; + // + // checkBoxInterjectionOnlySeparateLine + // + this.checkBoxInterjectionOnlySeparateLine.AutoSize = true; + this.checkBoxInterjectionOnlySeparateLine.Location = new System.Drawing.Point(600, 53); + this.checkBoxInterjectionOnlySeparateLine.Name = "checkBoxInterjectionOnlySeparateLine"; + this.checkBoxInterjectionOnlySeparateLine.Size = new System.Drawing.Size(137, 17); + this.checkBoxInterjectionOnlySeparateLine.TabIndex = 18; + this.checkBoxInterjectionOnlySeparateLine.Text = "Only if on separate line"; + this.checkBoxInterjectionOnlySeparateLine.UseVisualStyleBackColor = true; + this.checkBoxInterjectionOnlySeparateLine.CheckedChanged += new System.EventHandler(this.checkBoxInterjectionOnlySeparateLine_CheckedChanged); + // + // checkBoxRemoveIfAllUppercase + // + this.checkBoxRemoveIfAllUppercase.AutoSize = true; + this.checkBoxRemoveIfAllUppercase.Checked = true; + this.checkBoxRemoveIfAllUppercase.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxRemoveIfAllUppercase.Location = new System.Drawing.Point(241, 102); + this.checkBoxRemoveIfAllUppercase.Name = "checkBoxRemoveIfAllUppercase"; + this.checkBoxRemoveIfAllUppercase.Size = new System.Drawing.Size(142, 17); + this.checkBoxRemoveIfAllUppercase.TabIndex = 13; + this.checkBoxRemoveIfAllUppercase.Text = "Remove uppercase lines"; + this.checkBoxRemoveIfAllUppercase.UseVisualStyleBackColor = true; + this.checkBoxRemoveIfAllUppercase.CheckedChanged += new System.EventHandler(this.checkBoxRemoveIfAllUppercase_CheckedChanged); + // + // checkBoxColonSeparateLine + // + this.checkBoxColonSeparateLine.AutoSize = true; + this.checkBoxColonSeparateLine.Location = new System.Drawing.Point(261, 69); + this.checkBoxColonSeparateLine.Name = "checkBoxColonSeparateLine"; + this.checkBoxColonSeparateLine.Size = new System.Drawing.Size(137, 17); + this.checkBoxColonSeparateLine.TabIndex = 12; + this.checkBoxColonSeparateLine.Text = "Only if on separate line"; + this.checkBoxColonSeparateLine.UseVisualStyleBackColor = true; + this.checkBoxColonSeparateLine.CheckedChanged += new System.EventHandler(this.CheckBoxRemoveTextBetweenCheckedChanged); + // + // buttonEditInterjections + // + this.buttonEditInterjections.Location = new System.Drawing.Point(718, 26); + this.buttonEditInterjections.Name = "buttonEditInterjections"; + this.buttonEditInterjections.Size = new System.Drawing.Size(103, 23); + this.buttonEditInterjections.TabIndex = 17; + this.buttonEditInterjections.Text = "Edit..."; + this.buttonEditInterjections.UseVisualStyleBackColor = true; + this.buttonEditInterjections.Click += new System.EventHandler(this.buttonEditInterjections_Click); + // + // checkBoxRemoveInterjections + // + this.checkBoxRemoveInterjections.AutoSize = true; + this.checkBoxRemoveInterjections.Location = new System.Drawing.Point(582, 30); + this.checkBoxRemoveInterjections.Name = "checkBoxRemoveInterjections"; + this.checkBoxRemoveInterjections.Size = new System.Drawing.Size(130, 17); + this.checkBoxRemoveInterjections.TabIndex = 16; + this.checkBoxRemoveInterjections.Text = "Remove interjections "; + this.checkBoxRemoveInterjections.UseVisualStyleBackColor = true; + this.checkBoxRemoveInterjections.CheckedChanged += new System.EventHandler(this.checkBoxRemoveInterjections_CheckedChanged); + // + // labelRemoveTextBetween + // + this.labelRemoveTextBetween.AutoSize = true; + this.labelRemoveTextBetween.Location = new System.Drawing.Point(8, 26); + this.labelRemoveTextBetween.Name = "labelRemoveTextBetween"; + this.labelRemoveTextBetween.Size = new System.Drawing.Size(114, 13); + this.labelRemoveTextBetween.TabIndex = 0; + this.labelRemoveTextBetween.Text = "Remove text between"; + // + // comboBoxRemoveIfTextContains + // + this.comboBoxRemoveIfTextContains.FormattingEnabled = true; + this.comboBoxRemoveIfTextContains.Items.AddRange(new object[] { + "¶", + "♪", + "♫", + "♪,♫"}); + this.comboBoxRemoveIfTextContains.Location = new System.Drawing.Point(427, 131); + this.comboBoxRemoveIfTextContains.MaxLength = 10; + this.comboBoxRemoveIfTextContains.Name = "comboBoxRemoveIfTextContains"; + this.comboBoxRemoveIfTextContains.Size = new System.Drawing.Size(100, 21); + this.comboBoxRemoveIfTextContains.TabIndex = 15; + this.comboBoxRemoveIfTextContains.Text = "¶"; + this.comboBoxRemoveIfTextContains.TextChanged += new System.EventHandler(this.CheckBoxRemoveTextBetweenCheckedChanged); + // + // checkBoxRemoveWhereContains + // + this.checkBoxRemoveWhereContains.AutoSize = true; + this.checkBoxRemoveWhereContains.Location = new System.Drawing.Point(241, 135); + this.checkBoxRemoveWhereContains.Name = "checkBoxRemoveWhereContains"; + this.checkBoxRemoveWhereContains.Size = new System.Drawing.Size(153, 17); + this.checkBoxRemoveWhereContains.TabIndex = 14; + this.checkBoxRemoveWhereContains.Text = "Remove text if it contains:"; + this.checkBoxRemoveWhereContains.UseVisualStyleBackColor = true; + this.checkBoxRemoveWhereContains.CheckedChanged += new System.EventHandler(this.CheckBoxRemoveTextBetweenCheckedChanged); + // + // comboBoxCustomEnd + // + this.comboBoxCustomEnd.FormattingEnabled = true; + this.comboBoxCustomEnd.Items.AddRange(new object[] { + "¶", + "♪", + "♫"}); + this.comboBoxCustomEnd.Location = new System.Drawing.Point(116, 135); + this.comboBoxCustomEnd.MaxLength = 2; + this.comboBoxCustomEnd.Name = "comboBoxCustomEnd"; + this.comboBoxCustomEnd.Size = new System.Drawing.Size(38, 21); + this.comboBoxCustomEnd.TabIndex = 8; + this.comboBoxCustomEnd.Text = "¶"; + this.comboBoxCustomEnd.TextChanged += new System.EventHandler(this.CheckBoxRemoveTextBetweenCheckedChanged); + // + // comboBoxCustomStart + // + this.comboBoxCustomStart.FormattingEnabled = true; + this.comboBoxCustomStart.Items.AddRange(new object[] { + "¶", + "♪", + "♫"}); + this.comboBoxCustomStart.Location = new System.Drawing.Point(41, 135); + this.comboBoxCustomStart.MaxLength = 2; + this.comboBoxCustomStart.Name = "comboBoxCustomStart"; + this.comboBoxCustomStart.Size = new System.Drawing.Size(38, 21); + this.comboBoxCustomStart.TabIndex = 6; + this.comboBoxCustomStart.Text = "¶"; + this.comboBoxCustomStart.TextChanged += new System.EventHandler(this.CheckBoxRemoveTextBetweenCheckedChanged); + // + // checkBoxRemoveTextBeforeColonOnlyUppercase + // + this.checkBoxRemoveTextBeforeColonOnlyUppercase.AutoSize = true; + this.checkBoxRemoveTextBeforeColonOnlyUppercase.Location = new System.Drawing.Point(261, 46); + this.checkBoxRemoveTextBeforeColonOnlyUppercase.Name = "checkBoxRemoveTextBeforeColonOnlyUppercase"; + this.checkBoxRemoveTextBeforeColonOnlyUppercase.Size = new System.Drawing.Size(151, 17); + this.checkBoxRemoveTextBeforeColonOnlyUppercase.TabIndex = 11; + this.checkBoxRemoveTextBeforeColonOnlyUppercase.Text = "Only if text is UPPERCASE"; + this.checkBoxRemoveTextBeforeColonOnlyUppercase.UseVisualStyleBackColor = true; + this.checkBoxRemoveTextBeforeColonOnlyUppercase.CheckedChanged += new System.EventHandler(this.CheckBoxRemoveTextBetweenCheckedChanged); + // + // checkBoxOnlyIfInSeparateLine + // + this.checkBoxOnlyIfInSeparateLine.AutoSize = true; + this.checkBoxOnlyIfInSeparateLine.Location = new System.Drawing.Point(21, 172); + this.checkBoxOnlyIfInSeparateLine.Name = "checkBoxOnlyIfInSeparateLine"; + this.checkBoxOnlyIfInSeparateLine.Size = new System.Drawing.Size(137, 17); + this.checkBoxOnlyIfInSeparateLine.TabIndex = 9; + this.checkBoxOnlyIfInSeparateLine.Text = "Only if on separate line"; + this.checkBoxOnlyIfInSeparateLine.UseVisualStyleBackColor = true; + this.checkBoxOnlyIfInSeparateLine.CheckedChanged += new System.EventHandler(this.CheckBoxRemoveTextBetweenCheckedChanged); + // + // checkBoxRemoveTextBetweenCustomTags + // + this.checkBoxRemoveTextBetweenCustomTags.AutoSize = true; + this.checkBoxRemoveTextBetweenCustomTags.Checked = true; + this.checkBoxRemoveTextBetweenCustomTags.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxRemoveTextBetweenCustomTags.Location = new System.Drawing.Point(20, 138); + this.checkBoxRemoveTextBetweenCustomTags.Name = "checkBoxRemoveTextBetweenCustomTags"; + this.checkBoxRemoveTextBetweenCustomTags.Size = new System.Drawing.Size(15, 14); + this.checkBoxRemoveTextBetweenCustomTags.TabIndex = 5; + this.checkBoxRemoveTextBetweenCustomTags.UseVisualStyleBackColor = true; + this.checkBoxRemoveTextBetweenCustomTags.CheckedChanged += new System.EventHandler(this.CheckBoxRemoveTextBetweenCheckedChanged); + // + // checkBoxRemoveTextBetweenQuestionMarks + // + this.checkBoxRemoveTextBetweenQuestionMarks.AutoSize = true; + this.checkBoxRemoveTextBetweenQuestionMarks.Checked = true; + this.checkBoxRemoveTextBetweenQuestionMarks.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxRemoveTextBetweenQuestionMarks.Location = new System.Drawing.Point(20, 115); + this.checkBoxRemoveTextBetweenQuestionMarks.Name = "checkBoxRemoveTextBetweenQuestionMarks"; + this.checkBoxRemoveTextBetweenQuestionMarks.Size = new System.Drawing.Size(76, 17); + this.checkBoxRemoveTextBetweenQuestionMarks.TabIndex = 4; + this.checkBoxRemoveTextBetweenQuestionMarks.Text = "\"?\" and \"?\""; + this.checkBoxRemoveTextBetweenQuestionMarks.UseVisualStyleBackColor = true; + this.checkBoxRemoveTextBetweenQuestionMarks.CheckedChanged += new System.EventHandler(this.CheckBoxRemoveTextBetweenCheckedChanged); + // + // checkBoxRemoveTextBetweenParentheses + // + this.checkBoxRemoveTextBetweenParentheses.AutoSize = true; + this.checkBoxRemoveTextBetweenParentheses.Checked = true; + this.checkBoxRemoveTextBetweenParentheses.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxRemoveTextBetweenParentheses.Location = new System.Drawing.Point(20, 69); + this.checkBoxRemoveTextBetweenParentheses.Name = "checkBoxRemoveTextBetweenParentheses"; + this.checkBoxRemoveTextBetweenParentheses.Size = new System.Drawing.Size(74, 17); + this.checkBoxRemoveTextBetweenParentheses.TabIndex = 2; + this.checkBoxRemoveTextBetweenParentheses.Text = "\"(\" and \")\""; + this.checkBoxRemoveTextBetweenParentheses.UseVisualStyleBackColor = true; + this.checkBoxRemoveTextBetweenParentheses.CheckedChanged += new System.EventHandler(this.CheckBoxRemoveTextBetweenCheckedChanged); + // + // checkBoxRemoveTextBetweenBrackets + // + this.checkBoxRemoveTextBetweenBrackets.AutoSize = true; + this.checkBoxRemoveTextBetweenBrackets.Checked = true; + this.checkBoxRemoveTextBetweenBrackets.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxRemoveTextBetweenBrackets.Location = new System.Drawing.Point(20, 92); + this.checkBoxRemoveTextBetweenBrackets.Name = "checkBoxRemoveTextBetweenBrackets"; + this.checkBoxRemoveTextBetweenBrackets.Size = new System.Drawing.Size(76, 17); + this.checkBoxRemoveTextBetweenBrackets.TabIndex = 3; + this.checkBoxRemoveTextBetweenBrackets.Text = "\"{\" and \"}\""; + this.checkBoxRemoveTextBetweenBrackets.UseVisualStyleBackColor = true; + this.checkBoxRemoveTextBetweenBrackets.CheckedChanged += new System.EventHandler(this.CheckBoxRemoveTextBetweenCheckedChanged); + // + // checkBoxRemoveTextBetweenSquares + // + this.checkBoxRemoveTextBetweenSquares.AutoSize = true; + this.checkBoxRemoveTextBetweenSquares.Checked = true; + this.checkBoxRemoveTextBetweenSquares.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxRemoveTextBetweenSquares.Location = new System.Drawing.Point(20, 45); + this.checkBoxRemoveTextBetweenSquares.Name = "checkBoxRemoveTextBetweenSquares"; + this.checkBoxRemoveTextBetweenSquares.Size = new System.Drawing.Size(74, 17); + this.checkBoxRemoveTextBetweenSquares.TabIndex = 1; + this.checkBoxRemoveTextBetweenSquares.Text = "\"[\" and \"]\""; + this.checkBoxRemoveTextBetweenSquares.UseVisualStyleBackColor = true; + this.checkBoxRemoveTextBetweenSquares.CheckedChanged += new System.EventHandler(this.CheckBoxRemoveTextBetweenCheckedChanged); + // + // labelAnd + // + this.labelAnd.AutoSize = true; + this.labelAnd.Location = new System.Drawing.Point(85, 141); + this.labelAnd.Name = "labelAnd"; + this.labelAnd.Size = new System.Drawing.Size(25, 13); + this.labelAnd.TabIndex = 7; + this.labelAnd.Text = "and"; + // + // buttonApply + // + this.buttonApply.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonApply.Location = new System.Drawing.Point(878, 563); + this.buttonApply.Name = "buttonApply"; + this.buttonApply.Size = new System.Drawing.Size(75, 23); + this.buttonApply.TabIndex = 5; + this.buttonApply.Text = "Apply"; + this.buttonApply.UseVisualStyleBackColor = true; + this.buttonApply.Click += new System.EventHandler(this.buttonApply_Click); + // + // textBoxAfterText + // + this.textBoxAfterText.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.textBoxAfterText.Location = new System.Drawing.Point(12, 543); + this.textBoxAfterText.Multiline = true; + this.textBoxAfterText.Name = "textBoxAfterText"; + this.textBoxAfterText.Size = new System.Drawing.Size(394, 43); + this.textBoxAfterText.TabIndex = 2; + this.textBoxAfterText.TextChanged += new System.EventHandler(this.textBoxAfterText_TextChanged); + // + // labelText + // + this.labelText.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelText.AutoSize = true; + this.labelText.Location = new System.Drawing.Point(12, 527); + this.labelText.Name = "labelText"; + this.labelText.Size = new System.Drawing.Size(29, 13); + this.labelText.TabIndex = 6; + this.labelText.Text = "Text"; + // + // FormRemoveTextForHearImpaired + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(965, 598); + this.Controls.Add(this.labelText); + this.Controls.Add(this.textBoxAfterText); + this.Controls.Add(this.buttonApply); + this.Controls.Add(this.groupBoxRemoveTextConditions); + this.Controls.Add(this.groupBoxLinesFound); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.buttonCancel); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.KeyPreview = true; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(705, 514); + this.Name = "FormRemoveTextForHearImpaired"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Remove text for hearing impaired"; + this.Load += new System.EventHandler(this.FormRemoveTextForHearImpaired_Load); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormRemoveTextForHearImpaired_KeyDown); + this.Resize += new System.EventHandler(this.FormRemoveTextForHearImpaired_Resize); + this.groupBoxLinesFound.ResumeLayout(false); + this.contextMenuStrip1.ResumeLayout(false); + this.groupBoxRemoveTextConditions.ResumeLayout(false); + this.groupBoxRemoveTextConditions.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.GroupBox groupBoxLinesFound; + private System.Windows.Forms.ListView listViewFixes; + private System.Windows.Forms.ColumnHeader columnHeaderApply; + private System.Windows.Forms.ColumnHeader columnHeaderLine; + private System.Windows.Forms.ColumnHeader columnHeaderBefore; + private System.Windows.Forms.ColumnHeader columnHeaderAfter; + private System.Windows.Forms.CheckBox checkBoxRemoveTextBeforeColon; + private System.Windows.Forms.GroupBox groupBoxRemoveTextConditions; + private System.Windows.Forms.CheckBox checkBoxRemoveTextBetweenCustomTags; + private System.Windows.Forms.CheckBox checkBoxRemoveTextBetweenQuestionMarks; + private System.Windows.Forms.CheckBox checkBoxRemoveTextBetweenParentheses; + private System.Windows.Forms.CheckBox checkBoxRemoveTextBetweenBrackets; + private System.Windows.Forms.CheckBox checkBoxRemoveTextBetweenSquares; + private System.Windows.Forms.Label labelAnd; + private System.Windows.Forms.CheckBox checkBoxRemoveTextBeforeColonOnlyUppercase; + private System.Windows.Forms.CheckBox checkBoxOnlyIfInSeparateLine; + private System.Windows.Forms.ComboBox comboBoxCustomStart; + private System.Windows.Forms.ComboBox comboBoxCustomEnd; + private System.Windows.Forms.ComboBox comboBoxRemoveIfTextContains; + private System.Windows.Forms.CheckBox checkBoxRemoveWhereContains; + private System.Windows.Forms.Label labelRemoveTextBetween; + private System.Windows.Forms.CheckBox checkBoxRemoveInterjections; + private System.Windows.Forms.Button buttonEditInterjections; + private System.Windows.Forms.CheckBox checkBoxColonSeparateLine; + private System.Windows.Forms.CheckBox checkBoxRemoveIfAllUppercase; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSelAll; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInvertSel; + private System.Windows.Forms.Button buttonApply; + private System.Windows.Forms.CheckBox checkBoxInterjectionOnlySeparateLine; + private System.Windows.Forms.TextBox textBoxAfterText; + private System.Windows.Forms.Label labelText; + } } \ No newline at end of file diff --git a/src/Forms/RemoveTextFromHearImpaired.cs b/src/ui/Forms/RemoveTextFromHearImpaired.cs similarity index 97% rename from src/Forms/RemoveTextFromHearImpaired.cs rename to src/ui/Forms/RemoveTextFromHearImpaired.cs index ba3d81d2f..a1ab12493 100644 --- a/src/Forms/RemoveTextFromHearImpaired.cs +++ b/src/ui/Forms/RemoveTextFromHearImpaired.cs @@ -1,420 +1,420 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.Forms; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Globalization; -using System.Linq; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class FormRemoveTextForHearImpaired : PositionAndSizeForm - { - public Subtitle Subtitle; - public int TotalFixes { get; private set; } - private readonly LanguageStructure.RemoveTextFromHearImpaired _language; - private readonly RemoveTextForHI _removeTextForHiLib; - private Dictionary _fixes; - private readonly Main _mainForm; - private readonly List _unchecked = new List(); - private readonly List _edited = new List(); - private readonly List _editedOld = new List(); - - public FormRemoveTextForHearImpaired(Main main, Subtitle subtitle) - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - _mainForm = main; - _removeTextForHiLib = new RemoveTextForHI(GetSettings(subtitle)); - - checkBoxRemoveTextBetweenSquares.Checked = Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBetweenBrackets; - checkBoxRemoveTextBetweenParentheses.Checked = Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBetweenParentheses; - checkBoxRemoveTextBetweenBrackets.Checked = Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBetweenCurlyBrackets; - checkBoxRemoveTextBetweenQuestionMarks.Checked = Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBetweenQuestionMarks; - checkBoxRemoveTextBetweenCustomTags.Checked = Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBetweenCustom; - checkBoxOnlyIfInSeparateLine.Checked = Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBetweenOnlySeparateLines; - checkBoxRemoveTextBeforeColon.Checked = Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBeforeColon; - checkBoxRemoveTextBeforeColonOnlyUppercase.Checked = Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBeforeColonOnlyIfUppercase; - checkBoxColonSeparateLine.Checked = Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBeforeColonOnlyOnSeparateLine; - checkBoxRemoveInterjections.Checked = Configuration.Settings.RemoveTextForHearingImpaired.RemoveInterjections; - checkBoxInterjectionOnlySeparateLine.Checked = Configuration.Settings.RemoveTextForHearingImpaired.RemoveInterjectionsOnlyOnSeparateLine; - checkBoxRemoveWhereContains.Checked = Configuration.Settings.RemoveTextForHearingImpaired.RemoveIfContains; - checkBoxRemoveIfAllUppercase.Checked = Configuration.Settings.RemoveTextForHearingImpaired.RemoveIfAllUppercase; - checkBoxInterjectionOnlySeparateLine.Enabled = checkBoxRemoveInterjections.Checked; - - contextMenuStrip1.Items[0].Text = Configuration.Settings.Language.Main.Menu.ContextMenu.SelectAll; - contextMenuStrip1.Items[1].Text = Configuration.Settings.Language.Main.Menu.Edit.InverseSelection; - - _language = Configuration.Settings.Language.RemoveTextFromHearImpaired; - Text = _language.Title; - groupBoxRemoveTextConditions.Text = _language.RemoveTextConditions; - labelAnd.Text = _language.And; - labelRemoveTextBetween.Text = _language.RemoveTextBetween; - checkBoxRemoveTextBeforeColon.Text = _language.RemoveTextBeforeColon; - checkBoxRemoveTextBeforeColonOnlyUppercase.Text = _language.OnlyIfTextIsUppercase; - checkBoxOnlyIfInSeparateLine.Text = _language.OnlyIfInSeparateLine; - checkBoxColonSeparateLine.Text = _language.OnlyIfInSeparateLine; - checkBoxRemoveTextBetweenBrackets.Text = _language.Brackets; - checkBoxRemoveTextBetweenParentheses.Text = _language.Parentheses; - checkBoxRemoveTextBetweenQuestionMarks.Text = _language.QuestionMarks; - checkBoxRemoveTextBetweenSquares.Text = _language.SquareBrackets; - checkBoxRemoveWhereContains.Text = _language.RemoveTextIfContains; - checkBoxRemoveIfAllUppercase.Text = _language.RemoveTextIfAllUppercase; - checkBoxRemoveInterjections.Text = _language.RemoveInterjections; - checkBoxInterjectionOnlySeparateLine.Text = _language.OnlyIfInSeparateLine; - buttonEditInterjections.Text = _language.EditInterjections; - buttonEditInterjections.Left = checkBoxRemoveInterjections.Left + checkBoxRemoveInterjections.Width; - listViewFixes.Columns[0].Text = Configuration.Settings.Language.General.Apply; - listViewFixes.Columns[1].Text = Configuration.Settings.Language.General.LineNumber; - listViewFixes.Columns[2].Text = Configuration.Settings.Language.General.Before; - listViewFixes.Columns[3].Text = Configuration.Settings.Language.General.After; - labelText.Text = Configuration.Settings.Language.General.Text; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - buttonApply.Text = Configuration.Settings.Language.General.Apply; - UiUtil.FixLargeFonts(this, buttonOK); - listViewFixes_SelectedIndexChanged(null, null); - } - - public void Initialize(Subtitle subtitle) - { - if (Environment.OSVersion.Version.Major < 6) // 6 == Vista/Win2008Server/Win7 - { - const string unicodeFontName = Utilities.WinXP2KUnicodeFontName; - float fontSize = comboBoxCustomStart.Font.Size; - comboBoxCustomStart.Font = new Font(unicodeFontName, fontSize); - comboBoxCustomEnd.Font = new Font(unicodeFontName, fontSize); - comboBoxRemoveIfTextContains.Font = new Font(unicodeFontName, fontSize); - } - comboBoxRemoveIfTextContains.Left = checkBoxRemoveWhereContains.Left + checkBoxRemoveWhereContains.Width; - Subtitle = new Subtitle(subtitle); - GeneratePreview(); - } - - public void InitializeSettingsOnly() - { - comboBoxRemoveIfTextContains.Left = checkBoxRemoveWhereContains.Left + checkBoxRemoveWhereContains.Width; - groupBoxLinesFound.Visible = false; - int h = groupBoxRemoveTextConditions.Top + groupBoxRemoveTextConditions.Height + buttonOK.Height + 50; - MinimumSize = new Size(MinimumSize.Width, h); - Height = h; - } - - private void GeneratePreview() - { - if (Subtitle == null) - { - return; - } - - Cursor.Current = Cursors.WaitCursor; - _removeTextForHiLib.Settings = GetSettings(Subtitle); - _removeTextForHiLib.Warnings = new List(); - listViewFixes.BeginUpdate(); - listViewFixes.Items.Clear(); - int count = 0; - _fixes = new Dictionary(); - for (int index = 0; index < Subtitle.Paragraphs.Count; index++) - { - Paragraph p = Subtitle.Paragraphs[index]; - _removeTextForHiLib.WarningIndex = index - 1; - if (_edited.Contains(p)) - { - count++; - var old = _editedOld.First(x => x.Id == p.Id); - AddToListView(old, p.Text); - _fixes.Add(old, p.Text); - } - else - { - string newText = _removeTextForHiLib.RemoveTextFromHearImpaired(p.Text, Subtitle, index); - if (p.Text.RemoveChar(' ') != newText.RemoveChar(' ')) - { - count++; - AddToListView(p, newText); - _fixes.Add(p, newText); - } - } - - } - listViewFixes.EndUpdate(); - groupBoxLinesFound.Text = string.Format(_language.LinesFoundX, count); - Cursor.Current = Cursors.Default; - } - - private void AddToListView(Paragraph p, string newText) - { - var item = new ListViewItem(string.Empty) { Tag = p, Checked = !_unchecked.Contains(p) }; - if (_removeTextForHiLib.Warnings != null && _removeTextForHiLib.Warnings.Contains(_removeTextForHiLib.WarningIndex)) - { - item.UseItemStyleForSubItems = true; - item.BackColor = Color.PeachPuff; - } - item.SubItems.Add(p.Number.ToString(CultureInfo.InvariantCulture)); - item.SubItems.Add(UiUtil.GetListViewTextFromString(p.Text)); - item.SubItems.Add(UiUtil.GetListViewTextFromString(newText)); - listViewFixes.Items.Add(item); - } - - private void FormRemoveTextForHearImpaired_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - else if (e.KeyCode == UiUtil.HelpKeys) - { - Utilities.ShowHelp("#remove_text_for_hi"); - } - } - - private void ButtonOkClick(object sender, EventArgs e) - { - Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBetweenBrackets = checkBoxRemoveTextBetweenSquares.Checked; - Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBetweenParentheses = checkBoxRemoveTextBetweenParentheses.Checked; - Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBetweenCurlyBrackets = checkBoxRemoveTextBetweenBrackets.Checked; - Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBetweenQuestionMarks = checkBoxRemoveTextBetweenQuestionMarks.Checked; - Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBetweenCustom = checkBoxRemoveTextBetweenCustomTags.Checked; - Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBetweenCustomBefore = comboBoxCustomStart.Text; - Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBetweenCustomAfter = comboBoxCustomEnd.Text; - Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBetweenOnlySeparateLines = checkBoxOnlyIfInSeparateLine.Checked; - Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBeforeColon = checkBoxRemoveTextBeforeColon.Checked; - Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBeforeColonOnlyIfUppercase = checkBoxRemoveTextBeforeColonOnlyUppercase.Checked; - Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBeforeColonOnlyOnSeparateLine = checkBoxColonSeparateLine.Checked; - Configuration.Settings.RemoveTextForHearingImpaired.RemoveInterjections = checkBoxRemoveInterjections.Checked; - Configuration.Settings.RemoveTextForHearingImpaired.RemoveInterjectionsOnlyOnSeparateLine = checkBoxInterjectionOnlySeparateLine.Checked; - Configuration.Settings.RemoveTextForHearingImpaired.RemoveIfContains = checkBoxRemoveWhereContains.Checked; - Configuration.Settings.RemoveTextForHearingImpaired.RemoveIfAllUppercase = checkBoxRemoveIfAllUppercase.Checked; - Configuration.Settings.RemoveTextForHearingImpaired.RemoveIfContainsText = comboBoxRemoveIfTextContains.Text; - - ApplyChanges(); - DialogResult = DialogResult.OK; - } - - private void buttonApply_Click(object sender, EventArgs e) - { - ApplyChanges(); - GeneratePreview(); - } - - private void ApplyChanges() - { - if (Subtitle == null) - { - return; - } - - int fixes = RemoveTextFromHearImpaired(); - Subtitle.Renumber(); - if (_mainForm != null && fixes > 0) - { - TotalFixes += fixes; - _mainForm.ReloadFromSubtitle(new Subtitle(Subtitle), Configuration.Settings.Language.Main.BeforeRemovalOfTextingForHearingImpaired); - } - } - - public int RemoveTextFromHearImpaired() - { - _unchecked.Clear(); - int fixes = 0; - - for (int i = listViewFixes.Items.Count - 1; i >= 0; i--) - { - var item = listViewFixes.Items[i]; - var p = (Paragraph)item.Tag; - if (item.Checked) - { - string newText = _fixes[p]; - if (string.IsNullOrWhiteSpace(newText)) - { - Subtitle.Paragraphs.Remove(p); - } - else - { - p.Text = newText; - } - fixes++; - } - else - { - _unchecked.Add(p); - } - } - return fixes; - } - - private void CheckBoxRemoveTextBetweenCheckedChanged(object sender, EventArgs e) - { - GeneratePreview(); - } - - private void checkBoxRemoveInterjections_CheckedChanged(object sender, EventArgs e) - { - checkBoxInterjectionOnlySeparateLine.Enabled = checkBoxRemoveInterjections.Checked; - GeneratePreview(); - } - - private void buttonEditInterjections_Click(object sender, EventArgs e) - { - using (var editInterjections = new Interjections()) - { - editInterjections.Initialize(Configuration.Settings.Tools.Interjections); - if (editInterjections.ShowDialog(this) == DialogResult.OK) - { - Configuration.Settings.Tools.Interjections = editInterjections.GetInterjectionsSemiColonSeparatedString(); - _removeTextForHiLib.ReloadInterjection(); - if (checkBoxRemoveInterjections.Checked) - { - GeneratePreview(); - } - } - } - } - - private void FormRemoveTextForHearImpaired_Resize(object sender, EventArgs e) - { - int availableWidth = (listViewFixes.Width - (columnHeaderApply.Width + columnHeaderLine.Width + 20)) / 2; - - columnHeaderBefore.Width = availableWidth; - columnHeaderAfter.Width = availableWidth; - } - - private void checkBoxRemoveTextBeforeColon_CheckedChanged(object sender, EventArgs e) - { - checkBoxRemoveTextBeforeColonOnlyUppercase.Enabled = checkBoxRemoveTextBeforeColon.Checked; - checkBoxColonSeparateLine.Enabled = checkBoxRemoveTextBeforeColon.Checked; - GeneratePreview(); - } - - private void checkBoxRemoveIfAllUppercase_CheckedChanged(object sender, EventArgs e) - { - GeneratePreview(); - } - - public RemoveTextForHISettings GetSettings(Subtitle subtitle) - { - var settings = new RemoveTextForHISettings(subtitle) - { - OnlyIfInSeparateLine = checkBoxOnlyIfInSeparateLine.Checked, - RemoveIfAllUppercase = checkBoxRemoveIfAllUppercase.Checked, - RemoveTextBeforeColon = checkBoxRemoveTextBeforeColon.Checked, - RemoveTextBeforeColonOnlyUppercase = checkBoxRemoveTextBeforeColonOnlyUppercase.Checked, - ColonSeparateLine = checkBoxColonSeparateLine.Checked, - RemoveWhereContains = checkBoxRemoveWhereContains.Checked, - RemoveIfTextContains = new List(), - RemoveTextBetweenCustomTags = checkBoxRemoveTextBetweenCustomTags.Checked, - RemoveInterjections = checkBoxRemoveInterjections.Checked, - RemoveInterjectionsOnlySeparateLine = checkBoxRemoveInterjections.Checked && checkBoxInterjectionOnlySeparateLine.Checked, - RemoveTextBetweenSquares = checkBoxRemoveTextBetweenSquares.Checked, - RemoveTextBetweenBrackets = checkBoxRemoveTextBetweenBrackets.Checked, - RemoveTextBetweenQuestionMarks = checkBoxRemoveTextBetweenQuestionMarks.Checked, - RemoveTextBetweenParentheses = checkBoxRemoveTextBetweenParentheses.Checked, - CustomStart = comboBoxCustomStart.Text, - CustomEnd = comboBoxCustomEnd.Text - }; - foreach (string item in comboBoxRemoveIfTextContains.Text.Split(new[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries)) - { - settings.RemoveIfTextContains.Add(item.Trim()); - } - return settings; - } - - private void FormRemoveTextForHearImpaired_Load(object sender, EventArgs e) - { - // only works when used from "Form Load" - comboBoxCustomStart.Text = Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBetweenCustomBefore; - comboBoxCustomEnd.Text = Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBetweenCustomAfter; - comboBoxRemoveIfTextContains.Text = Configuration.Settings.RemoveTextForHearingImpaired.RemoveIfContainsText; - } - - private void toolStripMenuItemSelAll_Click(object sender, EventArgs e) - { - DoSelection(true); - } - - private void toolStripMenuItemInvertSel_Click(object sender, EventArgs e) - { - DoSelection(false); - } - - private void DoSelection(bool selectAll) - { - if (listViewFixes.Items.Count == 0) - { - return; - } - - foreach (ListViewItem item in listViewFixes.Items) - { - item.Checked = selectAll || !item.Checked; - } - } - - private void listViewFixes_ItemChecked(object sender, ItemCheckedEventArgs e) - { - if (!(e.Item.Tag is Paragraph p)) - { - return; - } - - if (e.Item.Checked) - { - if (_unchecked.Contains(p)) - { - _unchecked.Add(p); - } - } - else - { - if (!_unchecked.Contains(p)) - { - _unchecked.Remove(p); - } - } - } - - private void checkBoxInterjectionOnlySeparateLine_CheckedChanged(object sender, EventArgs e) - { - GeneratePreview(); - } - - private void listViewFixes_SelectedIndexChanged(object sender, EventArgs e) - { - var idx = listViewFixes.SelectedIndices.Count == 1 ? listViewFixes.SelectedIndices[0] : -1; - if (idx < 0) - { - textBoxAfterText.Visible = false; - labelText.Visible = false; - return; - } - - textBoxAfterText.TextChanged -= textBoxAfterText_TextChanged; - textBoxAfterText.Visible = true; - labelText.Visible = true; - var item = listViewFixes.Items[idx]; - var p = (Paragraph)item.Tag; - textBoxAfterText.Tag = item; - var text = _fixes[p]; - textBoxAfterText.Text = text; - textBoxAfterText.TextChanged += textBoxAfterText_TextChanged; - } - - private void textBoxAfterText_TextChanged(object sender, EventArgs e) - { - var text = textBoxAfterText.Text.Trim(); - var item = (ListViewItem)textBoxAfterText.Tag; - var p = (Paragraph)item.Tag; - _editedOld.Add(new Paragraph(p, false) { Text = p.Text }); - item.SubItems[3].Text = text; - _fixes[p] = text; - var o = Subtitle.GetParagraphOrDefaultById(p.Id); - o.Text = text; - _edited.Add(p); - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.Forms; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Globalization; +using System.Linq; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class FormRemoveTextForHearImpaired : PositionAndSizeForm + { + public Subtitle Subtitle; + public int TotalFixes { get; private set; } + private readonly LanguageStructure.RemoveTextFromHearImpaired _language; + private readonly RemoveTextForHI _removeTextForHiLib; + private Dictionary _fixes; + private readonly Main _mainForm; + private readonly List _unchecked = new List(); + private readonly List _edited = new List(); + private readonly List _editedOld = new List(); + + public FormRemoveTextForHearImpaired(Main main, Subtitle subtitle) + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + _mainForm = main; + _removeTextForHiLib = new RemoveTextForHI(GetSettings(subtitle)); + + checkBoxRemoveTextBetweenSquares.Checked = Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBetweenBrackets; + checkBoxRemoveTextBetweenParentheses.Checked = Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBetweenParentheses; + checkBoxRemoveTextBetweenBrackets.Checked = Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBetweenCurlyBrackets; + checkBoxRemoveTextBetweenQuestionMarks.Checked = Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBetweenQuestionMarks; + checkBoxRemoveTextBetweenCustomTags.Checked = Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBetweenCustom; + checkBoxOnlyIfInSeparateLine.Checked = Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBetweenOnlySeparateLines; + checkBoxRemoveTextBeforeColon.Checked = Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBeforeColon; + checkBoxRemoveTextBeforeColonOnlyUppercase.Checked = Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBeforeColonOnlyIfUppercase; + checkBoxColonSeparateLine.Checked = Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBeforeColonOnlyOnSeparateLine; + checkBoxRemoveInterjections.Checked = Configuration.Settings.RemoveTextForHearingImpaired.RemoveInterjections; + checkBoxInterjectionOnlySeparateLine.Checked = Configuration.Settings.RemoveTextForHearingImpaired.RemoveInterjectionsOnlyOnSeparateLine; + checkBoxRemoveWhereContains.Checked = Configuration.Settings.RemoveTextForHearingImpaired.RemoveIfContains; + checkBoxRemoveIfAllUppercase.Checked = Configuration.Settings.RemoveTextForHearingImpaired.RemoveIfAllUppercase; + checkBoxInterjectionOnlySeparateLine.Enabled = checkBoxRemoveInterjections.Checked; + + contextMenuStrip1.Items[0].Text = Configuration.Settings.Language.Main.Menu.ContextMenu.SelectAll; + contextMenuStrip1.Items[1].Text = Configuration.Settings.Language.Main.Menu.Edit.InverseSelection; + + _language = Configuration.Settings.Language.RemoveTextFromHearImpaired; + Text = _language.Title; + groupBoxRemoveTextConditions.Text = _language.RemoveTextConditions; + labelAnd.Text = _language.And; + labelRemoveTextBetween.Text = _language.RemoveTextBetween; + checkBoxRemoveTextBeforeColon.Text = _language.RemoveTextBeforeColon; + checkBoxRemoveTextBeforeColonOnlyUppercase.Text = _language.OnlyIfTextIsUppercase; + checkBoxOnlyIfInSeparateLine.Text = _language.OnlyIfInSeparateLine; + checkBoxColonSeparateLine.Text = _language.OnlyIfInSeparateLine; + checkBoxRemoveTextBetweenBrackets.Text = _language.Brackets; + checkBoxRemoveTextBetweenParentheses.Text = _language.Parentheses; + checkBoxRemoveTextBetweenQuestionMarks.Text = _language.QuestionMarks; + checkBoxRemoveTextBetweenSquares.Text = _language.SquareBrackets; + checkBoxRemoveWhereContains.Text = _language.RemoveTextIfContains; + checkBoxRemoveIfAllUppercase.Text = _language.RemoveTextIfAllUppercase; + checkBoxRemoveInterjections.Text = _language.RemoveInterjections; + checkBoxInterjectionOnlySeparateLine.Text = _language.OnlyIfInSeparateLine; + buttonEditInterjections.Text = _language.EditInterjections; + buttonEditInterjections.Left = checkBoxRemoveInterjections.Left + checkBoxRemoveInterjections.Width; + listViewFixes.Columns[0].Text = Configuration.Settings.Language.General.Apply; + listViewFixes.Columns[1].Text = Configuration.Settings.Language.General.LineNumber; + listViewFixes.Columns[2].Text = Configuration.Settings.Language.General.Before; + listViewFixes.Columns[3].Text = Configuration.Settings.Language.General.After; + labelText.Text = Configuration.Settings.Language.General.Text; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + buttonApply.Text = Configuration.Settings.Language.General.Apply; + UiUtil.FixLargeFonts(this, buttonOK); + listViewFixes_SelectedIndexChanged(null, null); + } + + public void Initialize(Subtitle subtitle) + { + if (Environment.OSVersion.Version.Major < 6) // 6 == Vista/Win2008Server/Win7 + { + const string unicodeFontName = Utilities.WinXP2KUnicodeFontName; + float fontSize = comboBoxCustomStart.Font.Size; + comboBoxCustomStart.Font = new Font(unicodeFontName, fontSize); + comboBoxCustomEnd.Font = new Font(unicodeFontName, fontSize); + comboBoxRemoveIfTextContains.Font = new Font(unicodeFontName, fontSize); + } + comboBoxRemoveIfTextContains.Left = checkBoxRemoveWhereContains.Left + checkBoxRemoveWhereContains.Width; + Subtitle = new Subtitle(subtitle); + GeneratePreview(); + } + + public void InitializeSettingsOnly() + { + comboBoxRemoveIfTextContains.Left = checkBoxRemoveWhereContains.Left + checkBoxRemoveWhereContains.Width; + groupBoxLinesFound.Visible = false; + int h = groupBoxRemoveTextConditions.Top + groupBoxRemoveTextConditions.Height + buttonOK.Height + 50; + MinimumSize = new Size(MinimumSize.Width, h); + Height = h; + } + + private void GeneratePreview() + { + if (Subtitle == null) + { + return; + } + + Cursor.Current = Cursors.WaitCursor; + _removeTextForHiLib.Settings = GetSettings(Subtitle); + _removeTextForHiLib.Warnings = new List(); + listViewFixes.BeginUpdate(); + listViewFixes.Items.Clear(); + int count = 0; + _fixes = new Dictionary(); + for (int index = 0; index < Subtitle.Paragraphs.Count; index++) + { + Paragraph p = Subtitle.Paragraphs[index]; + _removeTextForHiLib.WarningIndex = index - 1; + if (_edited.Contains(p)) + { + count++; + var old = _editedOld.First(x => x.Id == p.Id); + AddToListView(old, p.Text); + _fixes.Add(old, p.Text); + } + else + { + string newText = _removeTextForHiLib.RemoveTextFromHearImpaired(p.Text, Subtitle, index); + if (p.Text.RemoveChar(' ') != newText.RemoveChar(' ')) + { + count++; + AddToListView(p, newText); + _fixes.Add(p, newText); + } + } + + } + listViewFixes.EndUpdate(); + groupBoxLinesFound.Text = string.Format(_language.LinesFoundX, count); + Cursor.Current = Cursors.Default; + } + + private void AddToListView(Paragraph p, string newText) + { + var item = new ListViewItem(string.Empty) { Tag = p, Checked = !_unchecked.Contains(p) }; + if (_removeTextForHiLib.Warnings != null && _removeTextForHiLib.Warnings.Contains(_removeTextForHiLib.WarningIndex)) + { + item.UseItemStyleForSubItems = true; + item.BackColor = Color.PeachPuff; + } + item.SubItems.Add(p.Number.ToString(CultureInfo.InvariantCulture)); + item.SubItems.Add(UiUtil.GetListViewTextFromString(p.Text)); + item.SubItems.Add(UiUtil.GetListViewTextFromString(newText)); + listViewFixes.Items.Add(item); + } + + private void FormRemoveTextForHearImpaired_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + else if (e.KeyCode == UiUtil.HelpKeys) + { + Utilities.ShowHelp("#remove_text_for_hi"); + } + } + + private void ButtonOkClick(object sender, EventArgs e) + { + Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBetweenBrackets = checkBoxRemoveTextBetweenSquares.Checked; + Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBetweenParentheses = checkBoxRemoveTextBetweenParentheses.Checked; + Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBetweenCurlyBrackets = checkBoxRemoveTextBetweenBrackets.Checked; + Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBetweenQuestionMarks = checkBoxRemoveTextBetweenQuestionMarks.Checked; + Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBetweenCustom = checkBoxRemoveTextBetweenCustomTags.Checked; + Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBetweenCustomBefore = comboBoxCustomStart.Text; + Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBetweenCustomAfter = comboBoxCustomEnd.Text; + Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBetweenOnlySeparateLines = checkBoxOnlyIfInSeparateLine.Checked; + Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBeforeColon = checkBoxRemoveTextBeforeColon.Checked; + Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBeforeColonOnlyIfUppercase = checkBoxRemoveTextBeforeColonOnlyUppercase.Checked; + Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBeforeColonOnlyOnSeparateLine = checkBoxColonSeparateLine.Checked; + Configuration.Settings.RemoveTextForHearingImpaired.RemoveInterjections = checkBoxRemoveInterjections.Checked; + Configuration.Settings.RemoveTextForHearingImpaired.RemoveInterjectionsOnlyOnSeparateLine = checkBoxInterjectionOnlySeparateLine.Checked; + Configuration.Settings.RemoveTextForHearingImpaired.RemoveIfContains = checkBoxRemoveWhereContains.Checked; + Configuration.Settings.RemoveTextForHearingImpaired.RemoveIfAllUppercase = checkBoxRemoveIfAllUppercase.Checked; + Configuration.Settings.RemoveTextForHearingImpaired.RemoveIfContainsText = comboBoxRemoveIfTextContains.Text; + + ApplyChanges(); + DialogResult = DialogResult.OK; + } + + private void buttonApply_Click(object sender, EventArgs e) + { + ApplyChanges(); + GeneratePreview(); + } + + private void ApplyChanges() + { + if (Subtitle == null) + { + return; + } + + int fixes = RemoveTextFromHearImpaired(); + Subtitle.Renumber(); + if (_mainForm != null && fixes > 0) + { + TotalFixes += fixes; + _mainForm.ReloadFromSubtitle(new Subtitle(Subtitle), Configuration.Settings.Language.Main.BeforeRemovalOfTextingForHearingImpaired); + } + } + + public int RemoveTextFromHearImpaired() + { + _unchecked.Clear(); + int fixes = 0; + + for (int i = listViewFixes.Items.Count - 1; i >= 0; i--) + { + var item = listViewFixes.Items[i]; + var p = (Paragraph)item.Tag; + if (item.Checked) + { + string newText = _fixes[p]; + if (string.IsNullOrWhiteSpace(newText)) + { + Subtitle.Paragraphs.Remove(p); + } + else + { + p.Text = newText; + } + fixes++; + } + else + { + _unchecked.Add(p); + } + } + return fixes; + } + + private void CheckBoxRemoveTextBetweenCheckedChanged(object sender, EventArgs e) + { + GeneratePreview(); + } + + private void checkBoxRemoveInterjections_CheckedChanged(object sender, EventArgs e) + { + checkBoxInterjectionOnlySeparateLine.Enabled = checkBoxRemoveInterjections.Checked; + GeneratePreview(); + } + + private void buttonEditInterjections_Click(object sender, EventArgs e) + { + using (var editInterjections = new Interjections()) + { + editInterjections.Initialize(Configuration.Settings.Tools.Interjections); + if (editInterjections.ShowDialog(this) == DialogResult.OK) + { + Configuration.Settings.Tools.Interjections = editInterjections.GetInterjectionsSemiColonSeparatedString(); + _removeTextForHiLib.ReloadInterjection(); + if (checkBoxRemoveInterjections.Checked) + { + GeneratePreview(); + } + } + } + } + + private void FormRemoveTextForHearImpaired_Resize(object sender, EventArgs e) + { + int availableWidth = (listViewFixes.Width - (columnHeaderApply.Width + columnHeaderLine.Width + 20)) / 2; + + columnHeaderBefore.Width = availableWidth; + columnHeaderAfter.Width = availableWidth; + } + + private void checkBoxRemoveTextBeforeColon_CheckedChanged(object sender, EventArgs e) + { + checkBoxRemoveTextBeforeColonOnlyUppercase.Enabled = checkBoxRemoveTextBeforeColon.Checked; + checkBoxColonSeparateLine.Enabled = checkBoxRemoveTextBeforeColon.Checked; + GeneratePreview(); + } + + private void checkBoxRemoveIfAllUppercase_CheckedChanged(object sender, EventArgs e) + { + GeneratePreview(); + } + + public RemoveTextForHISettings GetSettings(Subtitle subtitle) + { + var settings = new RemoveTextForHISettings(subtitle) + { + OnlyIfInSeparateLine = checkBoxOnlyIfInSeparateLine.Checked, + RemoveIfAllUppercase = checkBoxRemoveIfAllUppercase.Checked, + RemoveTextBeforeColon = checkBoxRemoveTextBeforeColon.Checked, + RemoveTextBeforeColonOnlyUppercase = checkBoxRemoveTextBeforeColonOnlyUppercase.Checked, + ColonSeparateLine = checkBoxColonSeparateLine.Checked, + RemoveWhereContains = checkBoxRemoveWhereContains.Checked, + RemoveIfTextContains = new List(), + RemoveTextBetweenCustomTags = checkBoxRemoveTextBetweenCustomTags.Checked, + RemoveInterjections = checkBoxRemoveInterjections.Checked, + RemoveInterjectionsOnlySeparateLine = checkBoxRemoveInterjections.Checked && checkBoxInterjectionOnlySeparateLine.Checked, + RemoveTextBetweenSquares = checkBoxRemoveTextBetweenSquares.Checked, + RemoveTextBetweenBrackets = checkBoxRemoveTextBetweenBrackets.Checked, + RemoveTextBetweenQuestionMarks = checkBoxRemoveTextBetweenQuestionMarks.Checked, + RemoveTextBetweenParentheses = checkBoxRemoveTextBetweenParentheses.Checked, + CustomStart = comboBoxCustomStart.Text, + CustomEnd = comboBoxCustomEnd.Text + }; + foreach (string item in comboBoxRemoveIfTextContains.Text.Split(new[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries)) + { + settings.RemoveIfTextContains.Add(item.Trim()); + } + return settings; + } + + private void FormRemoveTextForHearImpaired_Load(object sender, EventArgs e) + { + // only works when used from "Form Load" + comboBoxCustomStart.Text = Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBetweenCustomBefore; + comboBoxCustomEnd.Text = Configuration.Settings.RemoveTextForHearingImpaired.RemoveTextBetweenCustomAfter; + comboBoxRemoveIfTextContains.Text = Configuration.Settings.RemoveTextForHearingImpaired.RemoveIfContainsText; + } + + private void toolStripMenuItemSelAll_Click(object sender, EventArgs e) + { + DoSelection(true); + } + + private void toolStripMenuItemInvertSel_Click(object sender, EventArgs e) + { + DoSelection(false); + } + + private void DoSelection(bool selectAll) + { + if (listViewFixes.Items.Count == 0) + { + return; + } + + foreach (ListViewItem item in listViewFixes.Items) + { + item.Checked = selectAll || !item.Checked; + } + } + + private void listViewFixes_ItemChecked(object sender, ItemCheckedEventArgs e) + { + if (!(e.Item.Tag is Paragraph p)) + { + return; + } + + if (e.Item.Checked) + { + if (_unchecked.Contains(p)) + { + _unchecked.Add(p); + } + } + else + { + if (!_unchecked.Contains(p)) + { + _unchecked.Remove(p); + } + } + } + + private void checkBoxInterjectionOnlySeparateLine_CheckedChanged(object sender, EventArgs e) + { + GeneratePreview(); + } + + private void listViewFixes_SelectedIndexChanged(object sender, EventArgs e) + { + var idx = listViewFixes.SelectedIndices.Count == 1 ? listViewFixes.SelectedIndices[0] : -1; + if (idx < 0) + { + textBoxAfterText.Visible = false; + labelText.Visible = false; + return; + } + + textBoxAfterText.TextChanged -= textBoxAfterText_TextChanged; + textBoxAfterText.Visible = true; + labelText.Visible = true; + var item = listViewFixes.Items[idx]; + var p = (Paragraph)item.Tag; + textBoxAfterText.Tag = item; + var text = _fixes[p]; + textBoxAfterText.Text = text; + textBoxAfterText.TextChanged += textBoxAfterText_TextChanged; + } + + private void textBoxAfterText_TextChanged(object sender, EventArgs e) + { + var text = textBoxAfterText.Text.Trim(); + var item = (ListViewItem)textBoxAfterText.Tag; + var p = (Paragraph)item.Tag; + _editedOld.Add(new Paragraph(p, false) { Text = p.Text }); + item.SubItems[3].Text = text; + _fixes[p] = text; + var o = Subtitle.GetParagraphOrDefaultById(p.Id); + o.Text = text; + _edited.Add(p); + } + } +} diff --git a/src/Forms/RemoveTextFromHearImpaired.resx b/src/ui/Forms/RemoveTextFromHearImpaired.resx similarity index 97% rename from src/Forms/RemoveTextFromHearImpaired.resx rename to src/ui/Forms/RemoveTextFromHearImpaired.resx index 98381cccc..15f75b3cd 100644 --- a/src/Forms/RemoveTextFromHearImpaired.resx +++ b/src/ui/Forms/RemoveTextFromHearImpaired.resx @@ -1,123 +1,123 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + \ No newline at end of file diff --git a/src/Forms/ReplaceDialog.Designer.cs b/src/ui/Forms/ReplaceDialog.Designer.cs similarity index 98% rename from src/Forms/ReplaceDialog.Designer.cs rename to src/ui/Forms/ReplaceDialog.Designer.cs index 61f07f3a8..fca8430e1 100644 --- a/src/Forms/ReplaceDialog.Designer.cs +++ b/src/ui/Forms/ReplaceDialog.Designer.cs @@ -1,206 +1,206 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class ReplaceDialog - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.radioButtonRegEx = new System.Windows.Forms.RadioButton(); - this.radioButtonCaseSensitive = new System.Windows.Forms.RadioButton(); - this.radioButtonNormal = new System.Windows.Forms.RadioButton(); - this.buttonReplace = new System.Windows.Forms.Button(); - this.textBoxFind = new System.Windows.Forms.TextBox(); - this.buttonReplaceAll = new System.Windows.Forms.Button(); - this.textBoxReplace = new System.Windows.Forms.TextBox(); - this.labelReplaceWith = new System.Windows.Forms.Label(); - this.labelFindWhat = new System.Windows.Forms.Label(); - this.buttonFind = new System.Windows.Forms.Button(); - this.checkBoxWholeWord = new System.Windows.Forms.CheckBox(); - this.SuspendLayout(); - // - // radioButtonRegEx - // - this.radioButtonRegEx.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.radioButtonRegEx.AutoSize = true; - this.radioButtonRegEx.Location = new System.Drawing.Point(15, 182); - this.radioButtonRegEx.Name = "radioButtonRegEx"; - this.radioButtonRegEx.Size = new System.Drawing.Size(56, 17); - this.radioButtonRegEx.TabIndex = 5; - this.radioButtonRegEx.Text = "RegEx"; - this.radioButtonRegEx.UseVisualStyleBackColor = true; - this.radioButtonRegEx.CheckedChanged += new System.EventHandler(this.RadioButtonCheckedChanged); - // - // radioButtonCaseSensitive - // - this.radioButtonCaseSensitive.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.radioButtonCaseSensitive.AutoSize = true; - this.radioButtonCaseSensitive.Location = new System.Drawing.Point(15, 159); - this.radioButtonCaseSensitive.Name = "radioButtonCaseSensitive"; - this.radioButtonCaseSensitive.Size = new System.Drawing.Size(94, 17); - this.radioButtonCaseSensitive.TabIndex = 4; - this.radioButtonCaseSensitive.Text = "Case sensitive"; - this.radioButtonCaseSensitive.UseVisualStyleBackColor = true; - this.radioButtonCaseSensitive.CheckedChanged += new System.EventHandler(this.RadioButtonCheckedChanged); - // - // radioButtonNormal - // - this.radioButtonNormal.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.radioButtonNormal.AutoSize = true; - this.radioButtonNormal.Checked = true; - this.radioButtonNormal.Location = new System.Drawing.Point(15, 136); - this.radioButtonNormal.Name = "radioButtonNormal"; - this.radioButtonNormal.Size = new System.Drawing.Size(58, 17); - this.radioButtonNormal.TabIndex = 3; - this.radioButtonNormal.TabStop = true; - this.radioButtonNormal.Text = "Normal"; - this.radioButtonNormal.UseVisualStyleBackColor = true; - this.radioButtonNormal.CheckedChanged += new System.EventHandler(this.RadioButtonCheckedChanged); - // - // buttonReplace - // - this.buttonReplace.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonReplace.Location = new System.Drawing.Point(93, 206); - this.buttonReplace.Name = "buttonReplace"; - this.buttonReplace.Size = new System.Drawing.Size(75, 23); - this.buttonReplace.TabIndex = 7; - this.buttonReplace.Text = "Replace"; - this.buttonReplace.UseVisualStyleBackColor = true; - this.buttonReplace.Click += new System.EventHandler(this.ButtonReplaceClick); - // - // textBoxFind - // - this.textBoxFind.Location = new System.Drawing.Point(15, 25); - this.textBoxFind.Name = "textBoxFind"; - this.textBoxFind.Size = new System.Drawing.Size(265, 21); - this.textBoxFind.TabIndex = 0; - this.textBoxFind.TextChanged += new System.EventHandler(this.textBoxFind_TextChanged); - this.textBoxFind.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxFindKeyDown); - // - // buttonReplaceAll - // - this.buttonReplaceAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonReplaceAll.Location = new System.Drawing.Point(174, 206); - this.buttonReplaceAll.Name = "buttonReplaceAll"; - this.buttonReplaceAll.Size = new System.Drawing.Size(103, 23); - this.buttonReplaceAll.TabIndex = 8; - this.buttonReplaceAll.Text = "Replace all"; - this.buttonReplaceAll.UseVisualStyleBackColor = true; - this.buttonReplaceAll.Click += new System.EventHandler(this.ButtonReplaceAllClick); - // - // textBoxReplace - // - this.textBoxReplace.Location = new System.Drawing.Point(15, 71); - this.textBoxReplace.Name = "textBoxReplace"; - this.textBoxReplace.Size = new System.Drawing.Size(265, 21); - this.textBoxReplace.TabIndex = 1; - this.textBoxReplace.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxFindKeyDown); - // - // labelReplaceWith - // - this.labelReplaceWith.AutoSize = true; - this.labelReplaceWith.Location = new System.Drawing.Point(12, 54); - this.labelReplaceWith.Name = "labelReplaceWith"; - this.labelReplaceWith.Size = new System.Drawing.Size(72, 13); - this.labelReplaceWith.TabIndex = 14; - this.labelReplaceWith.Text = "Replace with:"; - // - // labelFindWhat - // - this.labelFindWhat.AutoSize = true; - this.labelFindWhat.Location = new System.Drawing.Point(12, 8); - this.labelFindWhat.Name = "labelFindWhat"; - this.labelFindWhat.Size = new System.Drawing.Size(58, 13); - this.labelFindWhat.TabIndex = 9; - this.labelFindWhat.Text = "Find what:"; - // - // buttonFind - // - this.buttonFind.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonFind.Location = new System.Drawing.Point(12, 206); - this.buttonFind.Name = "buttonFind"; - this.buttonFind.Size = new System.Drawing.Size(75, 23); - this.buttonFind.TabIndex = 6; - this.buttonFind.Text = "Find"; - this.buttonFind.UseVisualStyleBackColor = true; - this.buttonFind.Click += new System.EventHandler(this.ButtonFindClick); - // - // checkBoxWholeWord - // - this.checkBoxWholeWord.AutoSize = true; - this.checkBoxWholeWord.Location = new System.Drawing.Point(15, 114); - this.checkBoxWholeWord.Name = "checkBoxWholeWord"; - this.checkBoxWholeWord.Size = new System.Drawing.Size(83, 17); - this.checkBoxWholeWord.TabIndex = 2; - this.checkBoxWholeWord.Text = "Whole word"; - this.checkBoxWholeWord.UseVisualStyleBackColor = true; - // - // ReplaceDialog - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(330, 241); - this.Controls.Add(this.checkBoxWholeWord); - this.Controls.Add(this.buttonFind); - this.Controls.Add(this.labelFindWhat); - this.Controls.Add(this.labelReplaceWith); - this.Controls.Add(this.textBoxReplace); - this.Controls.Add(this.buttonReplaceAll); - this.Controls.Add(this.radioButtonRegEx); - this.Controls.Add(this.radioButtonCaseSensitive); - this.Controls.Add(this.radioButtonNormal); - this.Controls.Add(this.buttonReplace); - this.Controls.Add(this.textBoxFind); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "ReplaceDialog"; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Replace"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.ReplaceDialog_FormClosing); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormReplaceDialog_KeyDown); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.RadioButton radioButtonRegEx; - private System.Windows.Forms.RadioButton radioButtonCaseSensitive; - private System.Windows.Forms.RadioButton radioButtonNormal; - private System.Windows.Forms.Button buttonReplace; - private System.Windows.Forms.TextBox textBoxFind; - private System.Windows.Forms.Button buttonReplaceAll; - private System.Windows.Forms.TextBox textBoxReplace; - private System.Windows.Forms.Label labelReplaceWith; - private System.Windows.Forms.Label labelFindWhat; - private System.Windows.Forms.Button buttonFind; - private System.Windows.Forms.CheckBox checkBoxWholeWord; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class ReplaceDialog + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.radioButtonRegEx = new System.Windows.Forms.RadioButton(); + this.radioButtonCaseSensitive = new System.Windows.Forms.RadioButton(); + this.radioButtonNormal = new System.Windows.Forms.RadioButton(); + this.buttonReplace = new System.Windows.Forms.Button(); + this.textBoxFind = new System.Windows.Forms.TextBox(); + this.buttonReplaceAll = new System.Windows.Forms.Button(); + this.textBoxReplace = new System.Windows.Forms.TextBox(); + this.labelReplaceWith = new System.Windows.Forms.Label(); + this.labelFindWhat = new System.Windows.Forms.Label(); + this.buttonFind = new System.Windows.Forms.Button(); + this.checkBoxWholeWord = new System.Windows.Forms.CheckBox(); + this.SuspendLayout(); + // + // radioButtonRegEx + // + this.radioButtonRegEx.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.radioButtonRegEx.AutoSize = true; + this.radioButtonRegEx.Location = new System.Drawing.Point(15, 182); + this.radioButtonRegEx.Name = "radioButtonRegEx"; + this.radioButtonRegEx.Size = new System.Drawing.Size(56, 17); + this.radioButtonRegEx.TabIndex = 5; + this.radioButtonRegEx.Text = "RegEx"; + this.radioButtonRegEx.UseVisualStyleBackColor = true; + this.radioButtonRegEx.CheckedChanged += new System.EventHandler(this.RadioButtonCheckedChanged); + // + // radioButtonCaseSensitive + // + this.radioButtonCaseSensitive.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.radioButtonCaseSensitive.AutoSize = true; + this.radioButtonCaseSensitive.Location = new System.Drawing.Point(15, 159); + this.radioButtonCaseSensitive.Name = "radioButtonCaseSensitive"; + this.radioButtonCaseSensitive.Size = new System.Drawing.Size(94, 17); + this.radioButtonCaseSensitive.TabIndex = 4; + this.radioButtonCaseSensitive.Text = "Case sensitive"; + this.radioButtonCaseSensitive.UseVisualStyleBackColor = true; + this.radioButtonCaseSensitive.CheckedChanged += new System.EventHandler(this.RadioButtonCheckedChanged); + // + // radioButtonNormal + // + this.radioButtonNormal.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.radioButtonNormal.AutoSize = true; + this.radioButtonNormal.Checked = true; + this.radioButtonNormal.Location = new System.Drawing.Point(15, 136); + this.radioButtonNormal.Name = "radioButtonNormal"; + this.radioButtonNormal.Size = new System.Drawing.Size(58, 17); + this.radioButtonNormal.TabIndex = 3; + this.radioButtonNormal.TabStop = true; + this.radioButtonNormal.Text = "Normal"; + this.radioButtonNormal.UseVisualStyleBackColor = true; + this.radioButtonNormal.CheckedChanged += new System.EventHandler(this.RadioButtonCheckedChanged); + // + // buttonReplace + // + this.buttonReplace.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonReplace.Location = new System.Drawing.Point(93, 206); + this.buttonReplace.Name = "buttonReplace"; + this.buttonReplace.Size = new System.Drawing.Size(75, 23); + this.buttonReplace.TabIndex = 7; + this.buttonReplace.Text = "Replace"; + this.buttonReplace.UseVisualStyleBackColor = true; + this.buttonReplace.Click += new System.EventHandler(this.ButtonReplaceClick); + // + // textBoxFind + // + this.textBoxFind.Location = new System.Drawing.Point(15, 25); + this.textBoxFind.Name = "textBoxFind"; + this.textBoxFind.Size = new System.Drawing.Size(265, 21); + this.textBoxFind.TabIndex = 0; + this.textBoxFind.TextChanged += new System.EventHandler(this.textBoxFind_TextChanged); + this.textBoxFind.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxFindKeyDown); + // + // buttonReplaceAll + // + this.buttonReplaceAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonReplaceAll.Location = new System.Drawing.Point(174, 206); + this.buttonReplaceAll.Name = "buttonReplaceAll"; + this.buttonReplaceAll.Size = new System.Drawing.Size(103, 23); + this.buttonReplaceAll.TabIndex = 8; + this.buttonReplaceAll.Text = "Replace all"; + this.buttonReplaceAll.UseVisualStyleBackColor = true; + this.buttonReplaceAll.Click += new System.EventHandler(this.ButtonReplaceAllClick); + // + // textBoxReplace + // + this.textBoxReplace.Location = new System.Drawing.Point(15, 71); + this.textBoxReplace.Name = "textBoxReplace"; + this.textBoxReplace.Size = new System.Drawing.Size(265, 21); + this.textBoxReplace.TabIndex = 1; + this.textBoxReplace.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxFindKeyDown); + // + // labelReplaceWith + // + this.labelReplaceWith.AutoSize = true; + this.labelReplaceWith.Location = new System.Drawing.Point(12, 54); + this.labelReplaceWith.Name = "labelReplaceWith"; + this.labelReplaceWith.Size = new System.Drawing.Size(72, 13); + this.labelReplaceWith.TabIndex = 14; + this.labelReplaceWith.Text = "Replace with:"; + // + // labelFindWhat + // + this.labelFindWhat.AutoSize = true; + this.labelFindWhat.Location = new System.Drawing.Point(12, 8); + this.labelFindWhat.Name = "labelFindWhat"; + this.labelFindWhat.Size = new System.Drawing.Size(58, 13); + this.labelFindWhat.TabIndex = 9; + this.labelFindWhat.Text = "Find what:"; + // + // buttonFind + // + this.buttonFind.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonFind.Location = new System.Drawing.Point(12, 206); + this.buttonFind.Name = "buttonFind"; + this.buttonFind.Size = new System.Drawing.Size(75, 23); + this.buttonFind.TabIndex = 6; + this.buttonFind.Text = "Find"; + this.buttonFind.UseVisualStyleBackColor = true; + this.buttonFind.Click += new System.EventHandler(this.ButtonFindClick); + // + // checkBoxWholeWord + // + this.checkBoxWholeWord.AutoSize = true; + this.checkBoxWholeWord.Location = new System.Drawing.Point(15, 114); + this.checkBoxWholeWord.Name = "checkBoxWholeWord"; + this.checkBoxWholeWord.Size = new System.Drawing.Size(83, 17); + this.checkBoxWholeWord.TabIndex = 2; + this.checkBoxWholeWord.Text = "Whole word"; + this.checkBoxWholeWord.UseVisualStyleBackColor = true; + // + // ReplaceDialog + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(330, 241); + this.Controls.Add(this.checkBoxWholeWord); + this.Controls.Add(this.buttonFind); + this.Controls.Add(this.labelFindWhat); + this.Controls.Add(this.labelReplaceWith); + this.Controls.Add(this.textBoxReplace); + this.Controls.Add(this.buttonReplaceAll); + this.Controls.Add(this.radioButtonRegEx); + this.Controls.Add(this.radioButtonCaseSensitive); + this.Controls.Add(this.radioButtonNormal); + this.Controls.Add(this.buttonReplace); + this.Controls.Add(this.textBoxFind); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "ReplaceDialog"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Replace"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.ReplaceDialog_FormClosing); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormReplaceDialog_KeyDown); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.RadioButton radioButtonRegEx; + private System.Windows.Forms.RadioButton radioButtonCaseSensitive; + private System.Windows.Forms.RadioButton radioButtonNormal; + private System.Windows.Forms.Button buttonReplace; + private System.Windows.Forms.TextBox textBoxFind; + private System.Windows.Forms.Button buttonReplaceAll; + private System.Windows.Forms.TextBox textBoxReplace; + private System.Windows.Forms.Label labelReplaceWith; + private System.Windows.Forms.Label labelFindWhat; + private System.Windows.Forms.Button buttonFind; + private System.Windows.Forms.CheckBox checkBoxWholeWord; + } } \ No newline at end of file diff --git a/src/Forms/ReplaceDialog.cs b/src/ui/Forms/ReplaceDialog.cs similarity index 96% rename from src/Forms/ReplaceDialog.cs rename to src/ui/Forms/ReplaceDialog.cs index 491e4c27f..f6e7ab5fa 100644 --- a/src/Forms/ReplaceDialog.cs +++ b/src/ui/Forms/ReplaceDialog.cs @@ -1,217 +1,217 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.Enums; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Drawing; -using System.Text.RegularExpressions; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class ReplaceDialog : PositionAndSizeForm - { - private Regex _regEx; - private bool _userAction; - private bool _findNext; - private FindReplaceDialogHelper _findHelper; - - public ReplaceDialog() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - Text = Configuration.Settings.Language.ReplaceDialog.Title; - labelFindWhat.Text = Configuration.Settings.Language.ReplaceDialog.FindWhat; - radioButtonNormal.Text = Configuration.Settings.Language.ReplaceDialog.Normal; - radioButtonCaseSensitive.Text = Configuration.Settings.Language.ReplaceDialog.CaseSensitive; - radioButtonRegEx.Text = Configuration.Settings.Language.ReplaceDialog.RegularExpression; - labelReplaceWith.Text = Configuration.Settings.Language.ReplaceDialog.ReplaceWith; - checkBoxWholeWord.Text = Configuration.Settings.Language.FindDialog.WholeWord; - buttonFind.Text = Configuration.Settings.Language.ReplaceDialog.Find; - buttonReplace.Text = Configuration.Settings.Language.ReplaceDialog.Replace; - buttonReplaceAll.Text = Configuration.Settings.Language.ReplaceDialog.ReplaceAll; - - if (Width < radioButtonRegEx.Right + 5) - { - Width = radioButtonRegEx.Right + 5; - } - - UiUtil.FixLargeFonts(this, buttonReplace); - } - - public bool ReplaceAll { get; set; } - public bool FindOnly { get; set; } - - public ReplaceType GetFindType() - { - var result = new ReplaceType(); - if (radioButtonNormal.Checked) - { - result.FindType = FindType.Normal; - } - else if (radioButtonCaseSensitive.Checked) - { - result.FindType = FindType.CaseSensitive; - } - else - { - result.FindType = FindType.RegEx; - } - - result.WholeWord = checkBoxWholeWord.Checked; - return result; - } - - public FindReplaceDialogHelper GetFindDialogHelper(int startLineIndex) - { - return new FindReplaceDialogHelper(GetFindType(), textBoxFind.Text, _regEx, textBoxReplace.Text, startLineIndex); - } - - private void FormReplaceDialog_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - internal void Initialize(string selectedText, FindReplaceDialogHelper findHelper) - { - _findHelper = findHelper; - textBoxFind.Text = selectedText; - if (FindOnly && !string.IsNullOrEmpty(selectedText)) - { - _findNext = true; - } - - //if we are searching for the same thing, then keep the replace text the same. - if (selectedText == findHelper.FindText) - { - textBoxReplace.Text = findHelper.ReplaceText.Replace(Environment.NewLine, "\\n"); - } - textBoxFind.SelectAll(); - if (findHelper.FindReplaceType.FindType == FindType.RegEx) - { - radioButtonRegEx.Checked = true; - } - else if (findHelper.FindReplaceType.FindType == FindType.CaseSensitive) - { - radioButtonCaseSensitive.Checked = true; - } - else - { - radioButtonNormal.Checked = true; - } - - if (findHelper.FindReplaceType.FindType != FindType.RegEx) - { - checkBoxWholeWord.Checked = findHelper.FindReplaceType.WholeWord; - } - } - - private void ButtonReplaceClick(object sender, EventArgs e) - { - ReplaceAll = false; - FindOnly = false; - - Validate(textBoxFind.Text); - } - - private void ButtonReplaceAllClick(object sender, EventArgs e) - { - ReplaceAll = true; - FindOnly = false; - - Validate(textBoxFind.Text); - } - - private void Validate(string searchText) - { - if (searchText.Length == 0) - { - DialogResult = DialogResult.Cancel; - } - else if (radioButtonNormal.Checked) - { - DialogResult = DialogResult.OK; - _userAction = true; - } - else if (radioButtonCaseSensitive.Checked) - { - DialogResult = DialogResult.OK; - _userAction = true; - } - else if (radioButtonRegEx.Checked) - { - try - { - _regEx = new Regex(RegexUtils.FixNewLine(textBoxFind.Text), RegexOptions.Compiled); - DialogResult = DialogResult.OK; - _userAction = true; - } - catch (Exception exception) - { - MessageBox.Show(exception.Message); - } - } - } - - private void ButtonFindClick(object sender, EventArgs e) - { - if (_findNext && _findHelper != null) - { - _findHelper.ReplaceFromPosition++; - } - - ReplaceAll = false; - FindOnly = true; - - Validate(textBoxFind.Text); - } - - private void RadioButtonCheckedChanged(object sender, EventArgs e) - { - if (sender == radioButtonRegEx) - { - textBoxFind.ContextMenu = FindReplaceDialogHelper.GetRegExContextMenu(textBoxFind); - } - else - { - textBoxFind.ContextMenu = null; - } - checkBoxWholeWord.Enabled = !radioButtonRegEx.Checked; - } - - private void TextBoxFindKeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Enter) - { - ButtonFindClick(null, null); - e.SuppressKeyPress = true; - } - } - - internal void SetIcon(Bitmap bitmap) - { - if (bitmap != null) - { - Icon = Icon.FromHandle(bitmap.GetHicon()); - } - } - - private void ReplaceDialog_FormClosing(object sender, FormClosingEventArgs e) - { - if (!_userAction) - { - DialogResult = DialogResult.Cancel; - } - } - - private void textBoxFind_TextChanged(object sender, EventArgs e) - { - _findNext = false; - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.Enums; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Drawing; +using System.Text.RegularExpressions; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class ReplaceDialog : PositionAndSizeForm + { + private Regex _regEx; + private bool _userAction; + private bool _findNext; + private FindReplaceDialogHelper _findHelper; + + public ReplaceDialog() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + Text = Configuration.Settings.Language.ReplaceDialog.Title; + labelFindWhat.Text = Configuration.Settings.Language.ReplaceDialog.FindWhat; + radioButtonNormal.Text = Configuration.Settings.Language.ReplaceDialog.Normal; + radioButtonCaseSensitive.Text = Configuration.Settings.Language.ReplaceDialog.CaseSensitive; + radioButtonRegEx.Text = Configuration.Settings.Language.ReplaceDialog.RegularExpression; + labelReplaceWith.Text = Configuration.Settings.Language.ReplaceDialog.ReplaceWith; + checkBoxWholeWord.Text = Configuration.Settings.Language.FindDialog.WholeWord; + buttonFind.Text = Configuration.Settings.Language.ReplaceDialog.Find; + buttonReplace.Text = Configuration.Settings.Language.ReplaceDialog.Replace; + buttonReplaceAll.Text = Configuration.Settings.Language.ReplaceDialog.ReplaceAll; + + if (Width < radioButtonRegEx.Right + 5) + { + Width = radioButtonRegEx.Right + 5; + } + + UiUtil.FixLargeFonts(this, buttonReplace); + } + + public bool ReplaceAll { get; set; } + public bool FindOnly { get; set; } + + public ReplaceType GetFindType() + { + var result = new ReplaceType(); + if (radioButtonNormal.Checked) + { + result.FindType = FindType.Normal; + } + else if (radioButtonCaseSensitive.Checked) + { + result.FindType = FindType.CaseSensitive; + } + else + { + result.FindType = FindType.RegEx; + } + + result.WholeWord = checkBoxWholeWord.Checked; + return result; + } + + public FindReplaceDialogHelper GetFindDialogHelper(int startLineIndex) + { + return new FindReplaceDialogHelper(GetFindType(), textBoxFind.Text, _regEx, textBoxReplace.Text, startLineIndex); + } + + private void FormReplaceDialog_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + internal void Initialize(string selectedText, FindReplaceDialogHelper findHelper) + { + _findHelper = findHelper; + textBoxFind.Text = selectedText; + if (FindOnly && !string.IsNullOrEmpty(selectedText)) + { + _findNext = true; + } + + //if we are searching for the same thing, then keep the replace text the same. + if (selectedText == findHelper.FindText) + { + textBoxReplace.Text = findHelper.ReplaceText.Replace(Environment.NewLine, "\\n"); + } + textBoxFind.SelectAll(); + if (findHelper.FindReplaceType.FindType == FindType.RegEx) + { + radioButtonRegEx.Checked = true; + } + else if (findHelper.FindReplaceType.FindType == FindType.CaseSensitive) + { + radioButtonCaseSensitive.Checked = true; + } + else + { + radioButtonNormal.Checked = true; + } + + if (findHelper.FindReplaceType.FindType != FindType.RegEx) + { + checkBoxWholeWord.Checked = findHelper.FindReplaceType.WholeWord; + } + } + + private void ButtonReplaceClick(object sender, EventArgs e) + { + ReplaceAll = false; + FindOnly = false; + + Validate(textBoxFind.Text); + } + + private void ButtonReplaceAllClick(object sender, EventArgs e) + { + ReplaceAll = true; + FindOnly = false; + + Validate(textBoxFind.Text); + } + + private void Validate(string searchText) + { + if (searchText.Length == 0) + { + DialogResult = DialogResult.Cancel; + } + else if (radioButtonNormal.Checked) + { + DialogResult = DialogResult.OK; + _userAction = true; + } + else if (radioButtonCaseSensitive.Checked) + { + DialogResult = DialogResult.OK; + _userAction = true; + } + else if (radioButtonRegEx.Checked) + { + try + { + _regEx = new Regex(RegexUtils.FixNewLine(textBoxFind.Text), RegexOptions.Compiled); + DialogResult = DialogResult.OK; + _userAction = true; + } + catch (Exception exception) + { + MessageBox.Show(exception.Message); + } + } + } + + private void ButtonFindClick(object sender, EventArgs e) + { + if (_findNext && _findHelper != null) + { + _findHelper.ReplaceFromPosition++; + } + + ReplaceAll = false; + FindOnly = true; + + Validate(textBoxFind.Text); + } + + private void RadioButtonCheckedChanged(object sender, EventArgs e) + { + if (sender == radioButtonRegEx) + { + textBoxFind.ContextMenu = FindReplaceDialogHelper.GetRegExContextMenu(textBoxFind); + } + else + { + textBoxFind.ContextMenu = null; + } + checkBoxWholeWord.Enabled = !radioButtonRegEx.Checked; + } + + private void TextBoxFindKeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + ButtonFindClick(null, null); + e.SuppressKeyPress = true; + } + } + + internal void SetIcon(Bitmap bitmap) + { + if (bitmap != null) + { + Icon = Icon.FromHandle(bitmap.GetHicon()); + } + } + + private void ReplaceDialog_FormClosing(object sender, FormClosingEventArgs e) + { + if (!_userAction) + { + DialogResult = DialogResult.Cancel; + } + } + + private void textBoxFind_TextChanged(object sender, EventArgs e) + { + _findNext = false; + } + } +} diff --git a/src/Forms/ReplaceDialog.resx b/src/ui/Forms/ReplaceDialog.resx similarity index 97% rename from src/Forms/ReplaceDialog.resx rename to src/ui/Forms/ReplaceDialog.resx index c7e0d4bdf..d58980a38 100644 --- a/src/Forms/ReplaceDialog.resx +++ b/src/ui/Forms/ReplaceDialog.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Forms/RestoreAutoBackup.Designer.cs b/src/ui/Forms/RestoreAutoBackup.Designer.cs similarity index 98% rename from src/Forms/RestoreAutoBackup.Designer.cs rename to src/ui/Forms/RestoreAutoBackup.Designer.cs index 755176840..52f271a75 100644 --- a/src/Forms/RestoreAutoBackup.Designer.cs +++ b/src/ui/Forms/RestoreAutoBackup.Designer.cs @@ -1,180 +1,180 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class RestoreAutoBackup - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.listViewBackups = new System.Windows.Forms.ListView(); - this.columnHeaderDateTime = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderFileName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderExtension = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderSize = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.labelInfo = new System.Windows.Forms.Label(); - this.linkLabelOpenContainingFolder = new System.Windows.Forms.LinkLabel(); - this.labelStatus = new System.Windows.Forms.Label(); - this.SuspendLayout(); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(552, 383); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 5; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(471, 383); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 4; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // listViewBackups - // - this.listViewBackups.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.listViewBackups.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeaderDateTime, - this.columnHeaderFileName, - this.columnHeaderExtension, - this.columnHeaderSize}); - this.listViewBackups.FullRowSelect = true; - this.listViewBackups.HideSelection = false; - this.listViewBackups.Location = new System.Drawing.Point(12, 37); - this.listViewBackups.MultiSelect = false; - this.listViewBackups.Name = "listViewBackups"; - this.listViewBackups.Size = new System.Drawing.Size(615, 333); - this.listViewBackups.TabIndex = 1; - this.listViewBackups.UseCompatibleStateImageBehavior = false; - this.listViewBackups.View = System.Windows.Forms.View.Details; - this.listViewBackups.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.listViewBackups_MouseDoubleClick); - // - // columnHeaderDateTime - // - this.columnHeaderDateTime.Text = "Date and time"; - this.columnHeaderDateTime.Width = 130; - // - // columnHeaderFileName - // - this.columnHeaderFileName.Text = "File name"; - this.columnHeaderFileName.Width = 300; - // - // columnHeaderExtension - // - this.columnHeaderExtension.Text = "Extension"; - this.columnHeaderExtension.Width = 80; - // - // columnHeaderSize - // - this.columnHeaderSize.Text = "Size"; - this.columnHeaderSize.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; - this.columnHeaderSize.Width = 101; - // - // labelInfo - // - this.labelInfo.AutoSize = true; - this.labelInfo.Location = new System.Drawing.Point(13, 13); - this.labelInfo.Name = "labelInfo"; - this.labelInfo.Size = new System.Drawing.Size(122, 13); - this.labelInfo.TabIndex = 0; - this.labelInfo.Text = "Open auto save backup"; - // - // linkLabelOpenContainingFolder - // - this.linkLabelOpenContainingFolder.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.linkLabelOpenContainingFolder.AutoSize = true; - this.linkLabelOpenContainingFolder.Location = new System.Drawing.Point(13, 387); - this.linkLabelOpenContainingFolder.Name = "linkLabelOpenContainingFolder"; - this.linkLabelOpenContainingFolder.Size = new System.Drawing.Size(124, 13); - this.linkLabelOpenContainingFolder.TabIndex = 2; - this.linkLabelOpenContainingFolder.TabStop = true; - this.linkLabelOpenContainingFolder.Text = "Open \'Dictionaries\' folder"; - this.linkLabelOpenContainingFolder.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabelOpenContainingFolder_LinkClicked); - // - // labelStatus - // - this.labelStatus.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelStatus.AutoSize = true; - this.labelStatus.Location = new System.Drawing.Point(186, 387); - this.labelStatus.Name = "labelStatus"; - this.labelStatus.Size = new System.Drawing.Size(59, 13); - this.labelStatus.TabIndex = 3; - this.labelStatus.Text = "labelStatus"; - // - // RestoreAutoBackup - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(639, 414); - this.Controls.Add(this.labelStatus); - this.Controls.Add(this.linkLabelOpenContainingFolder); - this.Controls.Add(this.labelInfo); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.listViewBackups); - this.KeyPreview = true; - this.MinimumSize = new System.Drawing.Size(500, 400); - this.Name = "RestoreAutoBackup"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Restore auto-backup"; - this.Shown += new System.EventHandler(this.RestoreAutoBackup_Shown); - this.ResizeEnd += new System.EventHandler(this.RestoreAutoBackup_ResizeEnd); - this.SizeChanged += new System.EventHandler(this.RestoreAutoBackup_SizeChanged); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.RestoreAutoBackup_KeyDown); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.ListView listViewBackups; - private System.Windows.Forms.ColumnHeader columnHeaderDateTime; - private System.Windows.Forms.ColumnHeader columnHeaderFileName; - private System.Windows.Forms.ColumnHeader columnHeaderExtension; - private System.Windows.Forms.Label labelInfo; - private System.Windows.Forms.LinkLabel linkLabelOpenContainingFolder; - private System.Windows.Forms.Label labelStatus; - private System.Windows.Forms.ColumnHeader columnHeaderSize; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class RestoreAutoBackup + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.listViewBackups = new System.Windows.Forms.ListView(); + this.columnHeaderDateTime = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderFileName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderExtension = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderSize = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.labelInfo = new System.Windows.Forms.Label(); + this.linkLabelOpenContainingFolder = new System.Windows.Forms.LinkLabel(); + this.labelStatus = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(552, 383); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 5; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(471, 383); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 4; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // listViewBackups + // + this.listViewBackups.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listViewBackups.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeaderDateTime, + this.columnHeaderFileName, + this.columnHeaderExtension, + this.columnHeaderSize}); + this.listViewBackups.FullRowSelect = true; + this.listViewBackups.HideSelection = false; + this.listViewBackups.Location = new System.Drawing.Point(12, 37); + this.listViewBackups.MultiSelect = false; + this.listViewBackups.Name = "listViewBackups"; + this.listViewBackups.Size = new System.Drawing.Size(615, 333); + this.listViewBackups.TabIndex = 1; + this.listViewBackups.UseCompatibleStateImageBehavior = false; + this.listViewBackups.View = System.Windows.Forms.View.Details; + this.listViewBackups.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.listViewBackups_MouseDoubleClick); + // + // columnHeaderDateTime + // + this.columnHeaderDateTime.Text = "Date and time"; + this.columnHeaderDateTime.Width = 130; + // + // columnHeaderFileName + // + this.columnHeaderFileName.Text = "File name"; + this.columnHeaderFileName.Width = 300; + // + // columnHeaderExtension + // + this.columnHeaderExtension.Text = "Extension"; + this.columnHeaderExtension.Width = 80; + // + // columnHeaderSize + // + this.columnHeaderSize.Text = "Size"; + this.columnHeaderSize.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + this.columnHeaderSize.Width = 101; + // + // labelInfo + // + this.labelInfo.AutoSize = true; + this.labelInfo.Location = new System.Drawing.Point(13, 13); + this.labelInfo.Name = "labelInfo"; + this.labelInfo.Size = new System.Drawing.Size(122, 13); + this.labelInfo.TabIndex = 0; + this.labelInfo.Text = "Open auto save backup"; + // + // linkLabelOpenContainingFolder + // + this.linkLabelOpenContainingFolder.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.linkLabelOpenContainingFolder.AutoSize = true; + this.linkLabelOpenContainingFolder.Location = new System.Drawing.Point(13, 387); + this.linkLabelOpenContainingFolder.Name = "linkLabelOpenContainingFolder"; + this.linkLabelOpenContainingFolder.Size = new System.Drawing.Size(124, 13); + this.linkLabelOpenContainingFolder.TabIndex = 2; + this.linkLabelOpenContainingFolder.TabStop = true; + this.linkLabelOpenContainingFolder.Text = "Open \'Dictionaries\' folder"; + this.linkLabelOpenContainingFolder.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabelOpenContainingFolder_LinkClicked); + // + // labelStatus + // + this.labelStatus.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelStatus.AutoSize = true; + this.labelStatus.Location = new System.Drawing.Point(186, 387); + this.labelStatus.Name = "labelStatus"; + this.labelStatus.Size = new System.Drawing.Size(59, 13); + this.labelStatus.TabIndex = 3; + this.labelStatus.Text = "labelStatus"; + // + // RestoreAutoBackup + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(639, 414); + this.Controls.Add(this.labelStatus); + this.Controls.Add(this.linkLabelOpenContainingFolder); + this.Controls.Add(this.labelInfo); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.listViewBackups); + this.KeyPreview = true; + this.MinimumSize = new System.Drawing.Size(500, 400); + this.Name = "RestoreAutoBackup"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Restore auto-backup"; + this.Shown += new System.EventHandler(this.RestoreAutoBackup_Shown); + this.ResizeEnd += new System.EventHandler(this.RestoreAutoBackup_ResizeEnd); + this.SizeChanged += new System.EventHandler(this.RestoreAutoBackup_SizeChanged); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.RestoreAutoBackup_KeyDown); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.ListView listViewBackups; + private System.Windows.Forms.ColumnHeader columnHeaderDateTime; + private System.Windows.Forms.ColumnHeader columnHeaderFileName; + private System.Windows.Forms.ColumnHeader columnHeaderExtension; + private System.Windows.Forms.Label labelInfo; + private System.Windows.Forms.LinkLabel linkLabelOpenContainingFolder; + private System.Windows.Forms.Label labelStatus; + private System.Windows.Forms.ColumnHeader columnHeaderSize; + } } \ No newline at end of file diff --git a/src/Forms/RestoreAutoBackup.cs b/src/ui/Forms/RestoreAutoBackup.cs similarity index 97% rename from src/Forms/RestoreAutoBackup.cs rename to src/ui/Forms/RestoreAutoBackup.cs index 0cc2ef39a..dfc300a82 100644 --- a/src/Forms/RestoreAutoBackup.cs +++ b/src/ui/Forms/RestoreAutoBackup.cs @@ -1,198 +1,198 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Globalization; -using System.IO; -using System.Text.RegularExpressions; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class RestoreAutoBackup : PositionAndSizeForm - { - private static readonly object _locker = new object(); - - //2011-12-13_20-19-18_title - private static readonly Regex RegexFileNamePattern = new Regex(@"^\d\d\d\d-\d\d-\d\d_\d\d-\d\d-\d\d", RegexOptions.Compiled); - private string[] _files; - public string AutoBackupFileName { get; set; } - - public RestoreAutoBackup() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - labelStatus.Text = string.Empty; - - var l = Configuration.Settings.Language.RestoreAutoBackup; - Text = l.Title; - linkLabelOpenContainingFolder.Text = Configuration.Settings.Language.Main.Menu.File.OpenContainingFolder; - listViewBackups.Columns[0].Text = l.DateAndTime; - listViewBackups.Columns[1].Text = l.FileName; - listViewBackups.Columns[2].Text = l.Extension; - listViewBackups.Columns[3].Text = Configuration.Settings.Language.General.Size; - labelInfo.Text = l.Information; - - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - - UiUtil.FixLargeFonts(this, buttonCancel); - } - - private void RestoreAutoBackup_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - private void RestoreAutoBackup_Shown(object sender, EventArgs e) - { - listViewBackups.Columns[2].Width = -2; - if (Directory.Exists(Configuration.AutoBackupDirectory)) - { - _files = Directory.GetFiles(Configuration.AutoBackupDirectory, "*.*"); - foreach (string fileName in _files) - { - var path = Path.GetFileName(fileName); - if (path != null && RegexFileNamePattern.IsMatch(path)) - { - AddBackupToListView(fileName); - } - } - listViewBackups.Sorting = SortOrder.Descending; - listViewBackups.Sort(); - if (_files.Length > 0) - { - return; - } - } - linkLabelOpenContainingFolder.Visible = false; - labelStatus.Left = linkLabelOpenContainingFolder.Left; - labelStatus.Text = Configuration.Settings.Language.RestoreAutoBackup.NoBackedUpFilesFound; - } - - private void AddBackupToListView(string fileName) - { - var path = Path.GetFileName(fileName); - if (path == null) - { - return; - } - - string displayDate = path.Substring(0, 19).Replace('_', ' '); - displayDate = displayDate.Remove(13, 1).Insert(13, ":"); - displayDate = displayDate.Remove(16, 1).Insert(16, ":"); - - string displayName = path.Remove(0, 20); - if (displayName == "srt") - { - displayName = "Untitled.srt"; - } - - var item = new ListViewItem(displayDate) - { - UseItemStyleForSubItems = false, - Tag = fileName - }; - item.SubItems.Add(Path.GetFileNameWithoutExtension(displayName)); - item.SubItems.Add(Path.GetExtension(fileName)); - - try - { - item.SubItems.Add(new FileInfo(fileName).Length + " bytes"); - } - catch - { - // ignored - } - - listViewBackups.Items.Add(item); - } - - private void SetAutoBackupFileName() - { - AutoBackupFileName = listViewBackups.SelectedItems[0].Tag.ToString(); - } - - private void buttonOK_Click(object sender, EventArgs e) - { - if (listViewBackups.SelectedItems.Count == 1) - { - SetAutoBackupFileName(); - } - - DialogResult = DialogResult.OK; - } - - private void listViewBackups_MouseDoubleClick(object sender, MouseEventArgs e) - { - if (listViewBackups.SelectedItems.Count == 1) - { - SetAutoBackupFileName(); - DialogResult = DialogResult.OK; - } - } - - private void RestoreAutoBackup_ResizeEnd(object sender, EventArgs e) - { - listViewBackups.Columns[2].Width = -2; - } - - private void RestoreAutoBackup_SizeChanged(object sender, EventArgs e) - { - listViewBackups.Columns[2].Width = -2; - } - - private void linkLabelOpenContainingFolder_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) - { - string folderName = Configuration.AutoBackupDirectory; - if (Utilities.IsRunningOnMono()) - { - UiUtil.OpenFolder(folderName); - } - else - { - if (listViewBackups.SelectedItems.Count == 1) - { - string argument = @"/select, " + listViewBackups.SelectedItems[0].Tag; - System.Diagnostics.Process.Start("explorer.exe", argument); - } - else - { - UiUtil.OpenFolder(folderName); - } - } - } - - public static void CleanAutoBackupFolder(string autoBackupFolder, int autoBackupDeleteAfterMonths) - { - lock (_locker) // only allow one thread - { - if (Directory.Exists(autoBackupFolder)) - { - var targetDate = DateTime.Now.AddMonths(-autoBackupDeleteAfterMonths); - var files = Directory.GetFiles(autoBackupFolder, "*.*"); - foreach (string fileName in files) - { - try - { - var name = Path.GetFileName(fileName); - if (RegexFileNamePattern.IsMatch(name) && Convert.ToDateTime(name.Substring(0, 10), CultureInfo.InvariantCulture) <= targetDate) - { - File.Delete(fileName); - } - } - catch - { - // ignore - } - } - } - } - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Globalization; +using System.IO; +using System.Text.RegularExpressions; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class RestoreAutoBackup : PositionAndSizeForm + { + private static readonly object _locker = new object(); + + //2011-12-13_20-19-18_title + private static readonly Regex RegexFileNamePattern = new Regex(@"^\d\d\d\d-\d\d-\d\d_\d\d-\d\d-\d\d", RegexOptions.Compiled); + private string[] _files; + public string AutoBackupFileName { get; set; } + + public RestoreAutoBackup() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + labelStatus.Text = string.Empty; + + var l = Configuration.Settings.Language.RestoreAutoBackup; + Text = l.Title; + linkLabelOpenContainingFolder.Text = Configuration.Settings.Language.Main.Menu.File.OpenContainingFolder; + listViewBackups.Columns[0].Text = l.DateAndTime; + listViewBackups.Columns[1].Text = l.FileName; + listViewBackups.Columns[2].Text = l.Extension; + listViewBackups.Columns[3].Text = Configuration.Settings.Language.General.Size; + labelInfo.Text = l.Information; + + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + + UiUtil.FixLargeFonts(this, buttonCancel); + } + + private void RestoreAutoBackup_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + private void RestoreAutoBackup_Shown(object sender, EventArgs e) + { + listViewBackups.Columns[2].Width = -2; + if (Directory.Exists(Configuration.AutoBackupDirectory)) + { + _files = Directory.GetFiles(Configuration.AutoBackupDirectory, "*.*"); + foreach (string fileName in _files) + { + var path = Path.GetFileName(fileName); + if (path != null && RegexFileNamePattern.IsMatch(path)) + { + AddBackupToListView(fileName); + } + } + listViewBackups.Sorting = SortOrder.Descending; + listViewBackups.Sort(); + if (_files.Length > 0) + { + return; + } + } + linkLabelOpenContainingFolder.Visible = false; + labelStatus.Left = linkLabelOpenContainingFolder.Left; + labelStatus.Text = Configuration.Settings.Language.RestoreAutoBackup.NoBackedUpFilesFound; + } + + private void AddBackupToListView(string fileName) + { + var path = Path.GetFileName(fileName); + if (path == null) + { + return; + } + + string displayDate = path.Substring(0, 19).Replace('_', ' '); + displayDate = displayDate.Remove(13, 1).Insert(13, ":"); + displayDate = displayDate.Remove(16, 1).Insert(16, ":"); + + string displayName = path.Remove(0, 20); + if (displayName == "srt") + { + displayName = "Untitled.srt"; + } + + var item = new ListViewItem(displayDate) + { + UseItemStyleForSubItems = false, + Tag = fileName + }; + item.SubItems.Add(Path.GetFileNameWithoutExtension(displayName)); + item.SubItems.Add(Path.GetExtension(fileName)); + + try + { + item.SubItems.Add(new FileInfo(fileName).Length + " bytes"); + } + catch + { + // ignored + } + + listViewBackups.Items.Add(item); + } + + private void SetAutoBackupFileName() + { + AutoBackupFileName = listViewBackups.SelectedItems[0].Tag.ToString(); + } + + private void buttonOK_Click(object sender, EventArgs e) + { + if (listViewBackups.SelectedItems.Count == 1) + { + SetAutoBackupFileName(); + } + + DialogResult = DialogResult.OK; + } + + private void listViewBackups_MouseDoubleClick(object sender, MouseEventArgs e) + { + if (listViewBackups.SelectedItems.Count == 1) + { + SetAutoBackupFileName(); + DialogResult = DialogResult.OK; + } + } + + private void RestoreAutoBackup_ResizeEnd(object sender, EventArgs e) + { + listViewBackups.Columns[2].Width = -2; + } + + private void RestoreAutoBackup_SizeChanged(object sender, EventArgs e) + { + listViewBackups.Columns[2].Width = -2; + } + + private void linkLabelOpenContainingFolder_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + string folderName = Configuration.AutoBackupDirectory; + if (Utilities.IsRunningOnMono()) + { + UiUtil.OpenFolder(folderName); + } + else + { + if (listViewBackups.SelectedItems.Count == 1) + { + string argument = @"/select, " + listViewBackups.SelectedItems[0].Tag; + System.Diagnostics.Process.Start("explorer.exe", argument); + } + else + { + UiUtil.OpenFolder(folderName); + } + } + } + + public static void CleanAutoBackupFolder(string autoBackupFolder, int autoBackupDeleteAfterMonths) + { + lock (_locker) // only allow one thread + { + if (Directory.Exists(autoBackupFolder)) + { + var targetDate = DateTime.Now.AddMonths(-autoBackupDeleteAfterMonths); + var files = Directory.GetFiles(autoBackupFolder, "*.*"); + foreach (string fileName in files) + { + try + { + var name = Path.GetFileName(fileName); + if (RegexFileNamePattern.IsMatch(name) && Convert.ToDateTime(name.Substring(0, 10), CultureInfo.InvariantCulture) <= targetDate) + { + File.Delete(fileName); + } + } + catch + { + // ignore + } + } + } + } + } + + } +} diff --git a/src/Forms/RestoreAutoBackup.resx b/src/ui/Forms/RestoreAutoBackup.resx similarity index 97% rename from src/Forms/RestoreAutoBackup.resx rename to src/ui/Forms/RestoreAutoBackup.resx index 29dcb1b3a..1af7de150 100644 --- a/src/Forms/RestoreAutoBackup.resx +++ b/src/ui/Forms/RestoreAutoBackup.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Forms/RubyJapanese.Designer.cs b/src/ui/Forms/RubyJapanese.Designer.cs similarity index 100% rename from src/Forms/RubyJapanese.Designer.cs rename to src/ui/Forms/RubyJapanese.Designer.cs diff --git a/src/Forms/RubyJapanese.cs b/src/ui/Forms/RubyJapanese.cs similarity index 100% rename from src/Forms/RubyJapanese.cs rename to src/ui/Forms/RubyJapanese.cs diff --git a/src/ui/Forms/RubyJapanese.resx b/src/ui/Forms/RubyJapanese.resx new file mode 100644 index 000000000..1af7de150 --- /dev/null +++ b/src/ui/Forms/RubyJapanese.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/src/Forms/SeekSilence.Designer.cs b/src/ui/Forms/SeekSilence.Designer.cs similarity index 97% rename from src/Forms/SeekSilence.Designer.cs rename to src/ui/Forms/SeekSilence.Designer.cs index d00f4f2fd..6db5cc5cf 100644 --- a/src/Forms/SeekSilence.Designer.cs +++ b/src/ui/Forms/SeekSilence.Designer.cs @@ -1,211 +1,211 @@ -namespace Nikse.SubtitleEdit.Forms -{ - partial class SeekSilence - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.groupBoxSearchDirection = new System.Windows.Forms.GroupBox(); - this.radioButtonBack = new System.Windows.Forms.RadioButton(); - this.radioButtonForward = new System.Windows.Forms.RadioButton(); - this.numericUpDownSeconds = new System.Windows.Forms.NumericUpDown(); - this.numericUpDownVolume = new System.Windows.Forms.NumericUpDown(); - this.labelDuration = new System.Windows.Forms.Label(); - this.labelVolumeBelow = new System.Windows.Forms.Label(); - this.groupBoxSearchDirection.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSeconds)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownVolume)).BeginInit(); - this.SuspendLayout(); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(247, 152); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 4; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(166, 152); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 3; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // groupBoxSearchDirection - // - this.groupBoxSearchDirection.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxSearchDirection.Controls.Add(this.radioButtonBack); - this.groupBoxSearchDirection.Controls.Add(this.radioButtonForward); - this.groupBoxSearchDirection.Location = new System.Drawing.Point(12, 12); - this.groupBoxSearchDirection.Name = "groupBoxSearchDirection"; - this.groupBoxSearchDirection.Size = new System.Drawing.Size(310, 73); - this.groupBoxSearchDirection.TabIndex = 5; - this.groupBoxSearchDirection.TabStop = false; - this.groupBoxSearchDirection.Text = "Search direction"; - // - // radioButtonBack - // - this.radioButtonBack.AutoSize = true; - this.radioButtonBack.Location = new System.Drawing.Point(7, 44); - this.radioButtonBack.Name = "radioButtonBack"; - this.radioButtonBack.Size = new System.Drawing.Size(50, 17); - this.radioButtonBack.TabIndex = 1; - this.radioButtonBack.Text = "Back"; - this.radioButtonBack.UseVisualStyleBackColor = true; - // - // radioButtonForward - // - this.radioButtonForward.AutoSize = true; - this.radioButtonForward.Checked = true; - this.radioButtonForward.Location = new System.Drawing.Point(7, 20); - this.radioButtonForward.Name = "radioButtonForward"; - this.radioButtonForward.Size = new System.Drawing.Size(63, 17); - this.radioButtonForward.TabIndex = 0; - this.radioButtonForward.TabStop = true; - this.radioButtonForward.Text = "Forward"; - this.radioButtonForward.UseVisualStyleBackColor = true; - // - // numericUpDownSeconds - // - this.numericUpDownSeconds.DecimalPlaces = 1; - this.numericUpDownSeconds.Increment = new decimal(new int[] { - 1, - 0, - 0, - 65536}); - this.numericUpDownSeconds.Location = new System.Drawing.Point(247, 91); - this.numericUpDownSeconds.Maximum = new decimal(new int[] { - 5, - 0, - 0, - 0}); - this.numericUpDownSeconds.Minimum = new decimal(new int[] { - 1, - 0, - 0, - 65536}); - this.numericUpDownSeconds.Name = "numericUpDownSeconds"; - this.numericUpDownSeconds.Size = new System.Drawing.Size(75, 20); - this.numericUpDownSeconds.TabIndex = 6; - this.numericUpDownSeconds.Value = new decimal(new int[] { - 3, - 0, - 0, - 65536}); - // - // numericUpDownVolume - // - this.numericUpDownVolume.DecimalPlaces = 2; - this.numericUpDownVolume.Increment = new decimal(new int[] { - 1, - 0, - 0, - 65536}); - this.numericUpDownVolume.Location = new System.Drawing.Point(247, 117); - this.numericUpDownVolume.Name = "numericUpDownVolume"; - this.numericUpDownVolume.Size = new System.Drawing.Size(75, 20); - this.numericUpDownVolume.TabIndex = 7; - this.numericUpDownVolume.Value = new decimal(new int[] { - 3, - 0, - 0, - 65536}); - // - // labelDuration - // - this.labelDuration.AutoSize = true; - this.labelDuration.Location = new System.Drawing.Point(12, 93); - this.labelDuration.Name = "labelDuration"; - this.labelDuration.Size = new System.Drawing.Size(180, 13); - this.labelDuration.TabIndex = 8; - this.labelDuration.Text = "Silence must be at at least (seconds)"; - // - // labelVolumeBelow - // - this.labelVolumeBelow.AutoSize = true; - this.labelVolumeBelow.Location = new System.Drawing.Point(12, 119); - this.labelVolumeBelow.Name = "labelVolumeBelow"; - this.labelVolumeBelow.Size = new System.Drawing.Size(113, 13); - this.labelVolumeBelow.TabIndex = 9; - this.labelVolumeBelow.Text = "Volume must be below"; - // - // SeekSilence - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(334, 185); - this.Controls.Add(this.labelVolumeBelow); - this.Controls.Add(this.labelDuration); - this.Controls.Add(this.numericUpDownVolume); - this.Controls.Add(this.numericUpDownSeconds); - this.Controls.Add(this.groupBoxSearchDirection); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "SeekSilence"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Seek silence"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.SeekSilence_KeyDown); - this.groupBoxSearchDirection.ResumeLayout(false); - this.groupBoxSearchDirection.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSeconds)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownVolume)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.GroupBox groupBoxSearchDirection; - private System.Windows.Forms.RadioButton radioButtonBack; - private System.Windows.Forms.RadioButton radioButtonForward; - private System.Windows.Forms.NumericUpDown numericUpDownSeconds; - private System.Windows.Forms.NumericUpDown numericUpDownVolume; - private System.Windows.Forms.Label labelDuration; - private System.Windows.Forms.Label labelVolumeBelow; - } +namespace Nikse.SubtitleEdit.Forms +{ + partial class SeekSilence + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.groupBoxSearchDirection = new System.Windows.Forms.GroupBox(); + this.radioButtonBack = new System.Windows.Forms.RadioButton(); + this.radioButtonForward = new System.Windows.Forms.RadioButton(); + this.numericUpDownSeconds = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownVolume = new System.Windows.Forms.NumericUpDown(); + this.labelDuration = new System.Windows.Forms.Label(); + this.labelVolumeBelow = new System.Windows.Forms.Label(); + this.groupBoxSearchDirection.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSeconds)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownVolume)).BeginInit(); + this.SuspendLayout(); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(247, 152); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 4; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(166, 152); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 3; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // groupBoxSearchDirection + // + this.groupBoxSearchDirection.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxSearchDirection.Controls.Add(this.radioButtonBack); + this.groupBoxSearchDirection.Controls.Add(this.radioButtonForward); + this.groupBoxSearchDirection.Location = new System.Drawing.Point(12, 12); + this.groupBoxSearchDirection.Name = "groupBoxSearchDirection"; + this.groupBoxSearchDirection.Size = new System.Drawing.Size(310, 73); + this.groupBoxSearchDirection.TabIndex = 5; + this.groupBoxSearchDirection.TabStop = false; + this.groupBoxSearchDirection.Text = "Search direction"; + // + // radioButtonBack + // + this.radioButtonBack.AutoSize = true; + this.radioButtonBack.Location = new System.Drawing.Point(7, 44); + this.radioButtonBack.Name = "radioButtonBack"; + this.radioButtonBack.Size = new System.Drawing.Size(50, 17); + this.radioButtonBack.TabIndex = 1; + this.radioButtonBack.Text = "Back"; + this.radioButtonBack.UseVisualStyleBackColor = true; + // + // radioButtonForward + // + this.radioButtonForward.AutoSize = true; + this.radioButtonForward.Checked = true; + this.radioButtonForward.Location = new System.Drawing.Point(7, 20); + this.radioButtonForward.Name = "radioButtonForward"; + this.radioButtonForward.Size = new System.Drawing.Size(63, 17); + this.radioButtonForward.TabIndex = 0; + this.radioButtonForward.TabStop = true; + this.radioButtonForward.Text = "Forward"; + this.radioButtonForward.UseVisualStyleBackColor = true; + // + // numericUpDownSeconds + // + this.numericUpDownSeconds.DecimalPlaces = 1; + this.numericUpDownSeconds.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.numericUpDownSeconds.Location = new System.Drawing.Point(247, 91); + this.numericUpDownSeconds.Maximum = new decimal(new int[] { + 5, + 0, + 0, + 0}); + this.numericUpDownSeconds.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.numericUpDownSeconds.Name = "numericUpDownSeconds"; + this.numericUpDownSeconds.Size = new System.Drawing.Size(75, 20); + this.numericUpDownSeconds.TabIndex = 6; + this.numericUpDownSeconds.Value = new decimal(new int[] { + 3, + 0, + 0, + 65536}); + // + // numericUpDownVolume + // + this.numericUpDownVolume.DecimalPlaces = 2; + this.numericUpDownVolume.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.numericUpDownVolume.Location = new System.Drawing.Point(247, 117); + this.numericUpDownVolume.Name = "numericUpDownVolume"; + this.numericUpDownVolume.Size = new System.Drawing.Size(75, 20); + this.numericUpDownVolume.TabIndex = 7; + this.numericUpDownVolume.Value = new decimal(new int[] { + 3, + 0, + 0, + 65536}); + // + // labelDuration + // + this.labelDuration.AutoSize = true; + this.labelDuration.Location = new System.Drawing.Point(12, 93); + this.labelDuration.Name = "labelDuration"; + this.labelDuration.Size = new System.Drawing.Size(180, 13); + this.labelDuration.TabIndex = 8; + this.labelDuration.Text = "Silence must be at at least (seconds)"; + // + // labelVolumeBelow + // + this.labelVolumeBelow.AutoSize = true; + this.labelVolumeBelow.Location = new System.Drawing.Point(12, 119); + this.labelVolumeBelow.Name = "labelVolumeBelow"; + this.labelVolumeBelow.Size = new System.Drawing.Size(113, 13); + this.labelVolumeBelow.TabIndex = 9; + this.labelVolumeBelow.Text = "Volume must be below"; + // + // SeekSilence + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(334, 185); + this.Controls.Add(this.labelVolumeBelow); + this.Controls.Add(this.labelDuration); + this.Controls.Add(this.numericUpDownVolume); + this.Controls.Add(this.numericUpDownSeconds); + this.Controls.Add(this.groupBoxSearchDirection); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "SeekSilence"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Seek silence"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.SeekSilence_KeyDown); + this.groupBoxSearchDirection.ResumeLayout(false); + this.groupBoxSearchDirection.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSeconds)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownVolume)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.GroupBox groupBoxSearchDirection; + private System.Windows.Forms.RadioButton radioButtonBack; + private System.Windows.Forms.RadioButton radioButtonForward; + private System.Windows.Forms.NumericUpDown numericUpDownSeconds; + private System.Windows.Forms.NumericUpDown numericUpDownVolume; + private System.Windows.Forms.Label labelDuration; + private System.Windows.Forms.Label labelVolumeBelow; + } } \ No newline at end of file diff --git a/src/Forms/SeekSilence.cs b/src/ui/Forms/SeekSilence.cs similarity index 97% rename from src/Forms/SeekSilence.cs rename to src/ui/Forms/SeekSilence.cs index 61c30bbaf..02ea65fa8 100644 --- a/src/Forms/SeekSilence.cs +++ b/src/ui/Forms/SeekSilence.cs @@ -1,58 +1,58 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class SeekSilence : Form - { - public bool SeekForward { get; set; } - public double SecondsDuration { get; set; } - public double VolumeBelow { get; set; } - - public SeekSilence() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - Text = Configuration.Settings.Language.SeekSilence.Title; - groupBoxSearchDirection.Text = Configuration.Settings.Language.SeekSilence.SearchDirection; - radioButtonForward.Text = Configuration.Settings.Language.SeekSilence.Forward; - radioButtonBack.Text = Configuration.Settings.Language.SeekSilence.Back; - labelDuration.Text = Configuration.Settings.Language.SeekSilence.LengthInSeconds; - labelVolumeBelow.Text = Configuration.Settings.Language.SeekSilence.MaxVolume; - numericUpDownSeconds.Value = (decimal)Configuration.Settings.VideoControls.WaveformSeeksSilenceDurationSeconds; - numericUpDownVolume.Value = (decimal)Configuration.Settings.VideoControls.WaveformSeeksSilenceMaxVolume; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - UiUtil.FixLargeFonts(this, buttonOK); - } - - private void SeekSilence_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - private void buttonOK_Click(object sender, EventArgs e) - { - SeekForward = radioButtonForward.Checked; - SecondsDuration = (double)numericUpDownSeconds.Value; - VolumeBelow = (double)numericUpDownVolume.Value; - Configuration.Settings.VideoControls.WaveformSeeksSilenceDurationSeconds = SecondsDuration; - Configuration.Settings.VideoControls.WaveformSeeksSilenceMaxVolume = VolumeBelow; - DialogResult = DialogResult.OK; - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class SeekSilence : Form + { + public bool SeekForward { get; set; } + public double SecondsDuration { get; set; } + public double VolumeBelow { get; set; } + + public SeekSilence() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + Text = Configuration.Settings.Language.SeekSilence.Title; + groupBoxSearchDirection.Text = Configuration.Settings.Language.SeekSilence.SearchDirection; + radioButtonForward.Text = Configuration.Settings.Language.SeekSilence.Forward; + radioButtonBack.Text = Configuration.Settings.Language.SeekSilence.Back; + labelDuration.Text = Configuration.Settings.Language.SeekSilence.LengthInSeconds; + labelVolumeBelow.Text = Configuration.Settings.Language.SeekSilence.MaxVolume; + numericUpDownSeconds.Value = (decimal)Configuration.Settings.VideoControls.WaveformSeeksSilenceDurationSeconds; + numericUpDownVolume.Value = (decimal)Configuration.Settings.VideoControls.WaveformSeeksSilenceMaxVolume; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + UiUtil.FixLargeFonts(this, buttonOK); + } + + private void SeekSilence_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + private void buttonOK_Click(object sender, EventArgs e) + { + SeekForward = radioButtonForward.Checked; + SecondsDuration = (double)numericUpDownSeconds.Value; + VolumeBelow = (double)numericUpDownVolume.Value; + Configuration.Settings.VideoControls.WaveformSeeksSilenceDurationSeconds = SecondsDuration; + Configuration.Settings.VideoControls.WaveformSeeksSilenceMaxVolume = VolumeBelow; + DialogResult = DialogResult.OK; + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + } +} diff --git a/src/Forms/SeekSilence.resx b/src/ui/Forms/SeekSilence.resx similarity index 97% rename from src/Forms/SeekSilence.resx rename to src/ui/Forms/SeekSilence.resx index 29dcb1b3a..1af7de150 100644 --- a/src/Forms/SeekSilence.resx +++ b/src/ui/Forms/SeekSilence.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Forms/SetMinimumDisplayTimeBetweenParagraphs.Designer.cs b/src/ui/Forms/SetMinimumDisplayTimeBetweenParagraphs.Designer.cs similarity index 98% rename from src/Forms/SetMinimumDisplayTimeBetweenParagraphs.Designer.cs rename to src/ui/Forms/SetMinimumDisplayTimeBetweenParagraphs.Designer.cs index b5fa8d03c..80a59f208 100644 --- a/src/Forms/SetMinimumDisplayTimeBetweenParagraphs.Designer.cs +++ b/src/ui/Forms/SetMinimumDisplayTimeBetweenParagraphs.Designer.cs @@ -1,258 +1,258 @@ -namespace Nikse.SubtitleEdit.Forms -{ - partial class SetMinimumDisplayTimeBetweenParagraphs - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.groupBoxLinesFound = new System.Windows.Forms.GroupBox(); - this.SubtitleListview1 = new Nikse.SubtitleEdit.Controls.SubtitleListView(); - this.numericUpDownMinMillisecondsBetweenLines = new System.Windows.Forms.NumericUpDown(); - this.labelMaxMillisecondsBetweenLines = new System.Windows.Forms.Label(); - this.buttonOK = new System.Windows.Forms.Button(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.checkBoxShowOnlyChangedLines = new System.Windows.Forms.CheckBox(); - this.comboBoxFrameRate = new System.Windows.Forms.ComboBox(); - this.labelFrames = new System.Windows.Forms.Label(); - this.numericUpDownFrames = new System.Windows.Forms.NumericUpDown(); - this.labelXFrameIsXMS = new System.Windows.Forms.Label(); - this.groupBoxFrameInfo = new System.Windows.Forms.GroupBox(); - this.groupBoxLinesFound.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinMillisecondsBetweenLines)).BeginInit(); - this.groupBoxFrameInfo.SuspendLayout(); - this.SuspendLayout(); - // - // groupBoxLinesFound - // - this.groupBoxLinesFound.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxLinesFound.Controls.Add(this.SubtitleListview1); - this.groupBoxLinesFound.Location = new System.Drawing.Point(18, 94); - this.groupBoxLinesFound.Name = "groupBoxLinesFound"; - this.groupBoxLinesFound.Size = new System.Drawing.Size(726, 347); - this.groupBoxLinesFound.TabIndex = 3; - this.groupBoxLinesFound.TabStop = false; - this.groupBoxLinesFound.Text = "Preview"; - // - // SubtitleListview1 - // - this.SubtitleListview1.AllowColumnReorder = true; - this.SubtitleListview1.AllowDrop = true; - this.SubtitleListview1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.SubtitleListview1.FirstVisibleIndex = -1; - this.SubtitleListview1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.SubtitleListview1.FullRowSelect = true; - this.SubtitleListview1.GridLines = true; - this.SubtitleListview1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; - this.SubtitleListview1.HideSelection = false; - this.SubtitleListview1.Location = new System.Drawing.Point(6, 19); - this.SubtitleListview1.Name = "SubtitleListview1"; - this.SubtitleListview1.OwnerDraw = true; - this.SubtitleListview1.Size = new System.Drawing.Size(714, 322); - this.SubtitleListview1.SubtitleFontBold = false; - this.SubtitleListview1.SubtitleFontName = "Tahoma"; - this.SubtitleListview1.SubtitleFontSize = 8; - this.SubtitleListview1.TabIndex = 0; - this.SubtitleListview1.UseCompatibleStateImageBehavior = false; - this.SubtitleListview1.UseSyntaxColoring = true; - this.SubtitleListview1.View = System.Windows.Forms.View.Details; - // - // numericUpDownMinMillisecondsBetweenLines - // - this.numericUpDownMinMillisecondsBetweenLines.Location = new System.Drawing.Point(18, 34); - this.numericUpDownMinMillisecondsBetweenLines.Maximum = new decimal(new int[] { - 1000, - 0, - 0, - 0}); - this.numericUpDownMinMillisecondsBetweenLines.Name = "numericUpDownMinMillisecondsBetweenLines"; - this.numericUpDownMinMillisecondsBetweenLines.Size = new System.Drawing.Size(64, 21); - this.numericUpDownMinMillisecondsBetweenLines.TabIndex = 1; - this.numericUpDownMinMillisecondsBetweenLines.Value = new decimal(new int[] { - 50, - 0, - 0, - 0}); - this.numericUpDownMinMillisecondsBetweenLines.ValueChanged += new System.EventHandler(this.numericUpDownMinMillisecondsBetweenLines_ValueChanged); - this.numericUpDownMinMillisecondsBetweenLines.KeyUp += new System.Windows.Forms.KeyEventHandler(this.numericUpDownMinMillisecondsBetweenLines_KeyUp); - // - // labelMaxMillisecondsBetweenLines - // - this.labelMaxMillisecondsBetweenLines.AutoSize = true; - this.labelMaxMillisecondsBetweenLines.Location = new System.Drawing.Point(15, 18); - this.labelMaxMillisecondsBetweenLines.Name = "labelMaxMillisecondsBetweenLines"; - this.labelMaxMillisecondsBetweenLines.Size = new System.Drawing.Size(174, 13); - this.labelMaxMillisecondsBetweenLines.TabIndex = 2; - this.labelMaxMillisecondsBetweenLines.Text = "Minimum milliseconds between lines"; - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.Location = new System.Drawing.Point(595, 447); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 5; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.Location = new System.Drawing.Point(676, 447); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 6; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // checkBoxShowOnlyChangedLines - // - this.checkBoxShowOnlyChangedLines.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.checkBoxShowOnlyChangedLines.AutoSize = true; - this.checkBoxShowOnlyChangedLines.Location = new System.Drawing.Point(18, 448); - this.checkBoxShowOnlyChangedLines.Name = "checkBoxShowOnlyChangedLines"; - this.checkBoxShowOnlyChangedLines.Size = new System.Drawing.Size(142, 17); - this.checkBoxShowOnlyChangedLines.TabIndex = 4; - this.checkBoxShowOnlyChangedLines.Text = "Show only modified lines"; - this.checkBoxShowOnlyChangedLines.UseVisualStyleBackColor = true; - this.checkBoxShowOnlyChangedLines.CheckedChanged += new System.EventHandler(this.checkBoxShowOnlyChangedLines_CheckedChanged); - // - // comboBoxFrameRate - // - this.comboBoxFrameRate.FormattingEnabled = true; - this.comboBoxFrameRate.Location = new System.Drawing.Point(7, 25); - this.comboBoxFrameRate.Margin = new System.Windows.Forms.Padding(4); - this.comboBoxFrameRate.MaxLength = 10; - this.comboBoxFrameRate.Name = "comboBoxFrameRate"; - this.comboBoxFrameRate.Size = new System.Drawing.Size(160, 21); - this.comboBoxFrameRate.TabIndex = 0; - this.comboBoxFrameRate.SelectedIndexChanged += new System.EventHandler(this.comboBoxFrameRate_SelectedIndexChanged); - this.comboBoxFrameRate.KeyUp += new System.Windows.Forms.KeyEventHandler(this.comboBoxFrameRate_KeyUp); - // - // labelFrames - // - this.labelFrames.AutoSize = true; - this.labelFrames.Location = new System.Drawing.Point(174, 29); - this.labelFrames.Name = "labelFrames"; - this.labelFrames.Size = new System.Drawing.Size(174, 13); - this.labelFrames.TabIndex = 1; - this.labelFrames.Text = "Frames:"; - // - // numericUpDownFrames - // - this.numericUpDownFrames.Location = new System.Drawing.Point(220, 25); - this.numericUpDownFrames.Maximum = new decimal(new int[] { - 25, - 0, - 0, - 0}); - this.numericUpDownFrames.Name = "numericUpDownFrames"; - this.numericUpDownFrames.Size = new System.Drawing.Size(56, 20); - this.numericUpDownFrames.TabIndex = 52; - this.numericUpDownFrames.Value = new decimal(new int[] { - 2, - 0, - 0, - 0}); - this.numericUpDownFrames.ValueChanged += new System.EventHandler(this.numericUpDownFrames_ValueChanged); - // - // labelXFrameIsXMS - // - this.labelXFrameIsXMS.AutoSize = true; - this.labelXFrameIsXMS.Location = new System.Drawing.Point(6, 57); - this.labelXFrameIsXMS.Name = "labelXFrameIsXMS"; - this.labelXFrameIsXMS.Size = new System.Drawing.Size(135, 13); - this.labelXFrameIsXMS.TabIndex = 3; - this.labelXFrameIsXMS.Text = "x frame is y milliseconds"; - // - // groupBoxFrameInfo - // - this.groupBoxFrameInfo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxFrameInfo.Controls.Add(this.comboBoxFrameRate); - this.groupBoxFrameInfo.Controls.Add(this.labelFrames); - this.groupBoxFrameInfo.Controls.Add(this.numericUpDownFrames); - this.groupBoxFrameInfo.Controls.Add(this.labelXFrameIsXMS); - this.groupBoxFrameInfo.Location = new System.Drawing.Point(355, 12); - this.groupBoxFrameInfo.Name = "groupBoxFrameInfo"; - this.groupBoxFrameInfo.Size = new System.Drawing.Size(383, 76); - this.groupBoxFrameInfo.TabIndex = 2; - this.groupBoxFrameInfo.TabStop = false; - this.groupBoxFrameInfo.Text = "Frame rate info"; - // - // SetMinimumDisplayTimeBetweenParagraphs - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(754, 480); - this.Controls.Add(this.groupBoxFrameInfo); - this.Controls.Add(this.checkBoxShowOnlyChangedLines); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.numericUpDownMinMillisecondsBetweenLines); - this.Controls.Add(this.labelMaxMillisecondsBetweenLines); - this.Controls.Add(this.groupBoxLinesFound); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.KeyPreview = true; - this.MinimumSize = new System.Drawing.Size(750, 500); - this.Name = "SetMinimumDisplayTimeBetweenParagraphs"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Set minimum display time between paragraphs"; - this.Shown += new System.EventHandler(this.SetMinimumDisplayTimeBetweenParagraphs_Shown); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.SetMinimalDisplayTimeDifference_KeyDown); - this.groupBoxLinesFound.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinMillisecondsBetweenLines)).EndInit(); - this.groupBoxFrameInfo.ResumeLayout(false); - this.groupBoxFrameInfo.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.GroupBox groupBoxLinesFound; - private System.Windows.Forms.NumericUpDown numericUpDownMinMillisecondsBetweenLines; - private System.Windows.Forms.Label labelMaxMillisecondsBetweenLines; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Button buttonCancel; - private Controls.SubtitleListView SubtitleListview1; - private System.Windows.Forms.CheckBox checkBoxShowOnlyChangedLines; - private System.Windows.Forms.ComboBox comboBoxFrameRate; - private System.Windows.Forms.Label labelXFrameIsXMS; - private System.Windows.Forms.Label labelFrames; - private System.Windows.Forms.NumericUpDown numericUpDownFrames; - private System.Windows.Forms.GroupBox groupBoxFrameInfo; - } +namespace Nikse.SubtitleEdit.Forms +{ + partial class SetMinimumDisplayTimeBetweenParagraphs + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.groupBoxLinesFound = new System.Windows.Forms.GroupBox(); + this.SubtitleListview1 = new Nikse.SubtitleEdit.Controls.SubtitleListView(); + this.numericUpDownMinMillisecondsBetweenLines = new System.Windows.Forms.NumericUpDown(); + this.labelMaxMillisecondsBetweenLines = new System.Windows.Forms.Label(); + this.buttonOK = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.checkBoxShowOnlyChangedLines = new System.Windows.Forms.CheckBox(); + this.comboBoxFrameRate = new System.Windows.Forms.ComboBox(); + this.labelFrames = new System.Windows.Forms.Label(); + this.numericUpDownFrames = new System.Windows.Forms.NumericUpDown(); + this.labelXFrameIsXMS = new System.Windows.Forms.Label(); + this.groupBoxFrameInfo = new System.Windows.Forms.GroupBox(); + this.groupBoxLinesFound.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinMillisecondsBetweenLines)).BeginInit(); + this.groupBoxFrameInfo.SuspendLayout(); + this.SuspendLayout(); + // + // groupBoxLinesFound + // + this.groupBoxLinesFound.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxLinesFound.Controls.Add(this.SubtitleListview1); + this.groupBoxLinesFound.Location = new System.Drawing.Point(18, 94); + this.groupBoxLinesFound.Name = "groupBoxLinesFound"; + this.groupBoxLinesFound.Size = new System.Drawing.Size(726, 347); + this.groupBoxLinesFound.TabIndex = 3; + this.groupBoxLinesFound.TabStop = false; + this.groupBoxLinesFound.Text = "Preview"; + // + // SubtitleListview1 + // + this.SubtitleListview1.AllowColumnReorder = true; + this.SubtitleListview1.AllowDrop = true; + this.SubtitleListview1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.SubtitleListview1.FirstVisibleIndex = -1; + this.SubtitleListview1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.SubtitleListview1.FullRowSelect = true; + this.SubtitleListview1.GridLines = true; + this.SubtitleListview1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.SubtitleListview1.HideSelection = false; + this.SubtitleListview1.Location = new System.Drawing.Point(6, 19); + this.SubtitleListview1.Name = "SubtitleListview1"; + this.SubtitleListview1.OwnerDraw = true; + this.SubtitleListview1.Size = new System.Drawing.Size(714, 322); + this.SubtitleListview1.SubtitleFontBold = false; + this.SubtitleListview1.SubtitleFontName = "Tahoma"; + this.SubtitleListview1.SubtitleFontSize = 8; + this.SubtitleListview1.TabIndex = 0; + this.SubtitleListview1.UseCompatibleStateImageBehavior = false; + this.SubtitleListview1.UseSyntaxColoring = true; + this.SubtitleListview1.View = System.Windows.Forms.View.Details; + // + // numericUpDownMinMillisecondsBetweenLines + // + this.numericUpDownMinMillisecondsBetweenLines.Location = new System.Drawing.Point(18, 34); + this.numericUpDownMinMillisecondsBetweenLines.Maximum = new decimal(new int[] { + 1000, + 0, + 0, + 0}); + this.numericUpDownMinMillisecondsBetweenLines.Name = "numericUpDownMinMillisecondsBetweenLines"; + this.numericUpDownMinMillisecondsBetweenLines.Size = new System.Drawing.Size(64, 21); + this.numericUpDownMinMillisecondsBetweenLines.TabIndex = 1; + this.numericUpDownMinMillisecondsBetweenLines.Value = new decimal(new int[] { + 50, + 0, + 0, + 0}); + this.numericUpDownMinMillisecondsBetweenLines.ValueChanged += new System.EventHandler(this.numericUpDownMinMillisecondsBetweenLines_ValueChanged); + this.numericUpDownMinMillisecondsBetweenLines.KeyUp += new System.Windows.Forms.KeyEventHandler(this.numericUpDownMinMillisecondsBetweenLines_KeyUp); + // + // labelMaxMillisecondsBetweenLines + // + this.labelMaxMillisecondsBetweenLines.AutoSize = true; + this.labelMaxMillisecondsBetweenLines.Location = new System.Drawing.Point(15, 18); + this.labelMaxMillisecondsBetweenLines.Name = "labelMaxMillisecondsBetweenLines"; + this.labelMaxMillisecondsBetweenLines.Size = new System.Drawing.Size(174, 13); + this.labelMaxMillisecondsBetweenLines.TabIndex = 2; + this.labelMaxMillisecondsBetweenLines.Text = "Minimum milliseconds between lines"; + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.Location = new System.Drawing.Point(595, 447); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 5; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.Location = new System.Drawing.Point(676, 447); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 6; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // checkBoxShowOnlyChangedLines + // + this.checkBoxShowOnlyChangedLines.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.checkBoxShowOnlyChangedLines.AutoSize = true; + this.checkBoxShowOnlyChangedLines.Location = new System.Drawing.Point(18, 448); + this.checkBoxShowOnlyChangedLines.Name = "checkBoxShowOnlyChangedLines"; + this.checkBoxShowOnlyChangedLines.Size = new System.Drawing.Size(142, 17); + this.checkBoxShowOnlyChangedLines.TabIndex = 4; + this.checkBoxShowOnlyChangedLines.Text = "Show only modified lines"; + this.checkBoxShowOnlyChangedLines.UseVisualStyleBackColor = true; + this.checkBoxShowOnlyChangedLines.CheckedChanged += new System.EventHandler(this.checkBoxShowOnlyChangedLines_CheckedChanged); + // + // comboBoxFrameRate + // + this.comboBoxFrameRate.FormattingEnabled = true; + this.comboBoxFrameRate.Location = new System.Drawing.Point(7, 25); + this.comboBoxFrameRate.Margin = new System.Windows.Forms.Padding(4); + this.comboBoxFrameRate.MaxLength = 10; + this.comboBoxFrameRate.Name = "comboBoxFrameRate"; + this.comboBoxFrameRate.Size = new System.Drawing.Size(160, 21); + this.comboBoxFrameRate.TabIndex = 0; + this.comboBoxFrameRate.SelectedIndexChanged += new System.EventHandler(this.comboBoxFrameRate_SelectedIndexChanged); + this.comboBoxFrameRate.KeyUp += new System.Windows.Forms.KeyEventHandler(this.comboBoxFrameRate_KeyUp); + // + // labelFrames + // + this.labelFrames.AutoSize = true; + this.labelFrames.Location = new System.Drawing.Point(174, 29); + this.labelFrames.Name = "labelFrames"; + this.labelFrames.Size = new System.Drawing.Size(174, 13); + this.labelFrames.TabIndex = 1; + this.labelFrames.Text = "Frames:"; + // + // numericUpDownFrames + // + this.numericUpDownFrames.Location = new System.Drawing.Point(220, 25); + this.numericUpDownFrames.Maximum = new decimal(new int[] { + 25, + 0, + 0, + 0}); + this.numericUpDownFrames.Name = "numericUpDownFrames"; + this.numericUpDownFrames.Size = new System.Drawing.Size(56, 20); + this.numericUpDownFrames.TabIndex = 52; + this.numericUpDownFrames.Value = new decimal(new int[] { + 2, + 0, + 0, + 0}); + this.numericUpDownFrames.ValueChanged += new System.EventHandler(this.numericUpDownFrames_ValueChanged); + // + // labelXFrameIsXMS + // + this.labelXFrameIsXMS.AutoSize = true; + this.labelXFrameIsXMS.Location = new System.Drawing.Point(6, 57); + this.labelXFrameIsXMS.Name = "labelXFrameIsXMS"; + this.labelXFrameIsXMS.Size = new System.Drawing.Size(135, 13); + this.labelXFrameIsXMS.TabIndex = 3; + this.labelXFrameIsXMS.Text = "x frame is y milliseconds"; + // + // groupBoxFrameInfo + // + this.groupBoxFrameInfo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxFrameInfo.Controls.Add(this.comboBoxFrameRate); + this.groupBoxFrameInfo.Controls.Add(this.labelFrames); + this.groupBoxFrameInfo.Controls.Add(this.numericUpDownFrames); + this.groupBoxFrameInfo.Controls.Add(this.labelXFrameIsXMS); + this.groupBoxFrameInfo.Location = new System.Drawing.Point(355, 12); + this.groupBoxFrameInfo.Name = "groupBoxFrameInfo"; + this.groupBoxFrameInfo.Size = new System.Drawing.Size(383, 76); + this.groupBoxFrameInfo.TabIndex = 2; + this.groupBoxFrameInfo.TabStop = false; + this.groupBoxFrameInfo.Text = "Frame rate info"; + // + // SetMinimumDisplayTimeBetweenParagraphs + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(754, 480); + this.Controls.Add(this.groupBoxFrameInfo); + this.Controls.Add(this.checkBoxShowOnlyChangedLines); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.numericUpDownMinMillisecondsBetweenLines); + this.Controls.Add(this.labelMaxMillisecondsBetweenLines); + this.Controls.Add(this.groupBoxLinesFound); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.KeyPreview = true; + this.MinimumSize = new System.Drawing.Size(750, 500); + this.Name = "SetMinimumDisplayTimeBetweenParagraphs"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Set minimum display time between paragraphs"; + this.Shown += new System.EventHandler(this.SetMinimumDisplayTimeBetweenParagraphs_Shown); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.SetMinimalDisplayTimeDifference_KeyDown); + this.groupBoxLinesFound.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinMillisecondsBetweenLines)).EndInit(); + this.groupBoxFrameInfo.ResumeLayout(false); + this.groupBoxFrameInfo.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBoxLinesFound; + private System.Windows.Forms.NumericUpDown numericUpDownMinMillisecondsBetweenLines; + private System.Windows.Forms.Label labelMaxMillisecondsBetweenLines; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Button buttonCancel; + private Controls.SubtitleListView SubtitleListview1; + private System.Windows.Forms.CheckBox checkBoxShowOnlyChangedLines; + private System.Windows.Forms.ComboBox comboBoxFrameRate; + private System.Windows.Forms.Label labelXFrameIsXMS; + private System.Windows.Forms.Label labelFrames; + private System.Windows.Forms.NumericUpDown numericUpDownFrames; + private System.Windows.Forms.GroupBox groupBoxFrameInfo; + } } \ No newline at end of file diff --git a/src/Forms/SetMinimumDisplayTimeBetweenParagraphs.cs b/src/ui/Forms/SetMinimumDisplayTimeBetweenParagraphs.cs similarity index 97% rename from src/Forms/SetMinimumDisplayTimeBetweenParagraphs.cs rename to src/ui/Forms/SetMinimumDisplayTimeBetweenParagraphs.cs index 7c8b4f152..76cc77e45 100644 --- a/src/Forms/SetMinimumDisplayTimeBetweenParagraphs.cs +++ b/src/ui/Forms/SetMinimumDisplayTimeBetweenParagraphs.cs @@ -1,212 +1,212 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Globalization; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public partial class SetMinimumDisplayTimeBetweenParagraphs : PositionAndSizeForm - { - - private Subtitle _subtitle; - public int FixCount { get; private set; } - public int MinGapMs { get; internal set; } - - public SetMinimumDisplayTimeBetweenParagraphs() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - Text = Configuration.Settings.Language.SetMinimumDisplayTimeBetweenParagraphs.Title; - labelMaxMillisecondsBetweenLines.Text = Configuration.Settings.Language.SetMinimumDisplayTimeBetweenParagraphs.MinimumMillisecondsBetweenParagraphs; - checkBoxShowOnlyChangedLines.Text = Configuration.Settings.Language.SetMinimumDisplayTimeBetweenParagraphs.ShowOnlyModifiedLines; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - SubtitleListview1.InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings); - UiUtil.InitializeSubtitleFont(SubtitleListview1); - SubtitleListview1.AutoSizeAllColumns(this); - UiUtil.FixLargeFonts(this, buttonOK); - - groupBoxFrameInfo.Text = Configuration.Settings.Language.SetMinimumDisplayTimeBetweenParagraphs.FrameInfo; - comboBoxFrameRate.Items.Add(23.976.ToString(CultureInfo.CurrentCulture)); - comboBoxFrameRate.Items.Add(24.0.ToString(CultureInfo.CurrentCulture)); - comboBoxFrameRate.Items.Add(25.0.ToString(CultureInfo.CurrentCulture)); - comboBoxFrameRate.Items.Add(29.97.ToString(CultureInfo.CurrentCulture)); - comboBoxFrameRate.Items.Add(30.0.ToString(CultureInfo.CurrentCulture)); - comboBoxFrameRate.Items.Add(59.94.ToString(CultureInfo.CurrentCulture)); - comboBoxFrameRate.Items.Add(60.ToString(CultureInfo.CurrentCulture)); - if (Math.Abs(Configuration.Settings.General.CurrentFrameRate - 23.976) < 0.1) - { - comboBoxFrameRate.SelectedIndex = 0; - } - else if (Math.Abs(Configuration.Settings.General.CurrentFrameRate - 24) < 0.1) - { - comboBoxFrameRate.SelectedIndex = 1; - } - else if (Math.Abs(Configuration.Settings.General.CurrentFrameRate - 25) < 0.1) - { - comboBoxFrameRate.SelectedIndex = 2; - } - else if (Math.Abs(Configuration.Settings.General.CurrentFrameRate - 29.97) < 0.01) - { - comboBoxFrameRate.SelectedIndex = 3; - } - else if (Math.Abs(Configuration.Settings.General.CurrentFrameRate - 30) < 0.1) - { - comboBoxFrameRate.SelectedIndex = 4; - } - else if (Math.Abs(Configuration.Settings.General.CurrentFrameRate - 59.94) < 0.1) - { - comboBoxFrameRate.SelectedIndex = 5; - } - else if (Math.Abs(Configuration.Settings.General.CurrentFrameRate - 60) < 0.1) - { - comboBoxFrameRate.SelectedIndex = 6; - } - else - { - comboBoxFrameRate.SelectedIndex = 3; - } - } - - public sealed override string Text - { - get => base.Text; - set => base.Text = value; - } - - public Subtitle FixedSubtitle { get; private set; } - - public void Initialize(Subtitle subtitle) - { - _subtitle = subtitle; - numericUpDownMinMillisecondsBetweenLines.Value = Configuration.Settings.General.MinimumMillisecondsBetweenLines != 0 - ? Configuration.Settings.General.MinimumMillisecondsBetweenLines - : 1; - } - - private void GeneratePreview() - { - var fixes = new List(); - if (_subtitle == null) - { - return; - } - - FixedSubtitle = new Subtitle(_subtitle); - var onlyFixedSubtitle = new Subtitle(); - - double minumumMillisecondsBetweenLines = (double)numericUpDownMinMillisecondsBetweenLines.Value; - for (int i = 0; i < FixedSubtitle.Paragraphs.Count - 1; i++) - { - Paragraph p = FixedSubtitle.GetParagraphOrDefault(i); - Paragraph next = FixedSubtitle.GetParagraphOrDefault(i + 1); - if (next.StartTime.TotalMilliseconds - p.EndTime.TotalMilliseconds < minumumMillisecondsBetweenLines) - { - p.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - minumumMillisecondsBetweenLines; - fixes.Add(i); - onlyFixedSubtitle.Paragraphs.Add(new Paragraph(p)); - } - } - - SubtitleListview1.BeginUpdate(); - groupBoxLinesFound.Text = string.Format(Configuration.Settings.Language.SetMinimumDisplayTimeBetweenParagraphs.PreviewLinesModifiedX, fixes.Count); - if (checkBoxShowOnlyChangedLines.Checked) - { - SubtitleListview1.Fill(onlyFixedSubtitle); - } - else - { - SubtitleListview1.Fill(FixedSubtitle); - foreach (int index in fixes) - { - SubtitleListview1.SetBackgroundColor(index, Color.Silver); - } - } - SubtitleListview1.EndUpdate(); - FixCount = fixes.Count; - } - - private void CalcMilliseconds() - { - var frameRate = GetFrameRate(); - MinGapMs = (int)Math.Round(1000.0 / frameRate * (double)numericUpDownFrames.Value); - labelXFrameIsXMS.Text = string.Format(Configuration.Settings.Language.SetMinimumDisplayTimeBetweenParagraphs.XFrameYisZMilliseconds, numericUpDownFrames.Value, frameRate, MinGapMs); - } - - private double GetFrameRate() - { - if (double.TryParse(comboBoxFrameRate.Text, NumberStyles.AllowDecimalPoint, CultureInfo.CurrentCulture, out var frameRate)) - { - return frameRate; - } - - return Configuration.Settings.General.CurrentFrameRate; - } - - private void buttonOK_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.OK; - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private void SetMinimalDisplayTimeDifference_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - e.SuppressKeyPress = true; - } - } - - private void numericUpDownMinMillisecondsBetweenLines_ValueChanged(object sender, EventArgs e) - { - GeneratePreview(); - Configuration.Settings.General.MinimumMillisecondsBetweenLines = (int)numericUpDownMinMillisecondsBetweenLines.Value; - } - - private void checkBoxShowOnlyChangedLines_CheckedChanged(object sender, EventArgs e) - { - GeneratePreview(); - } - - private void numericUpDownMinMillisecondsBetweenLines_KeyUp(object sender, KeyEventArgs e) - { - numericUpDownMinMillisecondsBetweenLines.ValueChanged -= numericUpDownMinMillisecondsBetweenLines_ValueChanged; - GeneratePreview(); - numericUpDownMinMillisecondsBetweenLines.ValueChanged += numericUpDownMinMillisecondsBetweenLines_ValueChanged; - Configuration.Settings.General.MinimumMillisecondsBetweenLines = (int)numericUpDownMinMillisecondsBetweenLines.Value; - } - - private void comboBoxFrameRate_SelectedIndexChanged(object sender, EventArgs e) - { - CalcMilliseconds(); - } - - private void comboBoxFrameRate_KeyUp(object sender, KeyEventArgs e) - { - comboBoxFrameRate_SelectedIndexChanged(sender, e); - } - - private void SetMinimumDisplayTimeBetweenParagraphs_Shown(object sender, EventArgs e) - { - SubtitleListview1.Focus(); - } - - private void numericUpDownFrames_ValueChanged(object sender, EventArgs e) - { - CalcMilliseconds(); - } - - } - -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Globalization; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public partial class SetMinimumDisplayTimeBetweenParagraphs : PositionAndSizeForm + { + + private Subtitle _subtitle; + public int FixCount { get; private set; } + public int MinGapMs { get; internal set; } + + public SetMinimumDisplayTimeBetweenParagraphs() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + Text = Configuration.Settings.Language.SetMinimumDisplayTimeBetweenParagraphs.Title; + labelMaxMillisecondsBetweenLines.Text = Configuration.Settings.Language.SetMinimumDisplayTimeBetweenParagraphs.MinimumMillisecondsBetweenParagraphs; + checkBoxShowOnlyChangedLines.Text = Configuration.Settings.Language.SetMinimumDisplayTimeBetweenParagraphs.ShowOnlyModifiedLines; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + SubtitleListview1.InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings); + UiUtil.InitializeSubtitleFont(SubtitleListview1); + SubtitleListview1.AutoSizeAllColumns(this); + UiUtil.FixLargeFonts(this, buttonOK); + + groupBoxFrameInfo.Text = Configuration.Settings.Language.SetMinimumDisplayTimeBetweenParagraphs.FrameInfo; + comboBoxFrameRate.Items.Add(23.976.ToString(CultureInfo.CurrentCulture)); + comboBoxFrameRate.Items.Add(24.0.ToString(CultureInfo.CurrentCulture)); + comboBoxFrameRate.Items.Add(25.0.ToString(CultureInfo.CurrentCulture)); + comboBoxFrameRate.Items.Add(29.97.ToString(CultureInfo.CurrentCulture)); + comboBoxFrameRate.Items.Add(30.0.ToString(CultureInfo.CurrentCulture)); + comboBoxFrameRate.Items.Add(59.94.ToString(CultureInfo.CurrentCulture)); + comboBoxFrameRate.Items.Add(60.ToString(CultureInfo.CurrentCulture)); + if (Math.Abs(Configuration.Settings.General.CurrentFrameRate - 23.976) < 0.1) + { + comboBoxFrameRate.SelectedIndex = 0; + } + else if (Math.Abs(Configuration.Settings.General.CurrentFrameRate - 24) < 0.1) + { + comboBoxFrameRate.SelectedIndex = 1; + } + else if (Math.Abs(Configuration.Settings.General.CurrentFrameRate - 25) < 0.1) + { + comboBoxFrameRate.SelectedIndex = 2; + } + else if (Math.Abs(Configuration.Settings.General.CurrentFrameRate - 29.97) < 0.01) + { + comboBoxFrameRate.SelectedIndex = 3; + } + else if (Math.Abs(Configuration.Settings.General.CurrentFrameRate - 30) < 0.1) + { + comboBoxFrameRate.SelectedIndex = 4; + } + else if (Math.Abs(Configuration.Settings.General.CurrentFrameRate - 59.94) < 0.1) + { + comboBoxFrameRate.SelectedIndex = 5; + } + else if (Math.Abs(Configuration.Settings.General.CurrentFrameRate - 60) < 0.1) + { + comboBoxFrameRate.SelectedIndex = 6; + } + else + { + comboBoxFrameRate.SelectedIndex = 3; + } + } + + public sealed override string Text + { + get => base.Text; + set => base.Text = value; + } + + public Subtitle FixedSubtitle { get; private set; } + + public void Initialize(Subtitle subtitle) + { + _subtitle = subtitle; + numericUpDownMinMillisecondsBetweenLines.Value = Configuration.Settings.General.MinimumMillisecondsBetweenLines != 0 + ? Configuration.Settings.General.MinimumMillisecondsBetweenLines + : 1; + } + + private void GeneratePreview() + { + var fixes = new List(); + if (_subtitle == null) + { + return; + } + + FixedSubtitle = new Subtitle(_subtitle); + var onlyFixedSubtitle = new Subtitle(); + + double minumumMillisecondsBetweenLines = (double)numericUpDownMinMillisecondsBetweenLines.Value; + for (int i = 0; i < FixedSubtitle.Paragraphs.Count - 1; i++) + { + Paragraph p = FixedSubtitle.GetParagraphOrDefault(i); + Paragraph next = FixedSubtitle.GetParagraphOrDefault(i + 1); + if (next.StartTime.TotalMilliseconds - p.EndTime.TotalMilliseconds < minumumMillisecondsBetweenLines) + { + p.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - minumumMillisecondsBetweenLines; + fixes.Add(i); + onlyFixedSubtitle.Paragraphs.Add(new Paragraph(p)); + } + } + + SubtitleListview1.BeginUpdate(); + groupBoxLinesFound.Text = string.Format(Configuration.Settings.Language.SetMinimumDisplayTimeBetweenParagraphs.PreviewLinesModifiedX, fixes.Count); + if (checkBoxShowOnlyChangedLines.Checked) + { + SubtitleListview1.Fill(onlyFixedSubtitle); + } + else + { + SubtitleListview1.Fill(FixedSubtitle); + foreach (int index in fixes) + { + SubtitleListview1.SetBackgroundColor(index, Color.Silver); + } + } + SubtitleListview1.EndUpdate(); + FixCount = fixes.Count; + } + + private void CalcMilliseconds() + { + var frameRate = GetFrameRate(); + MinGapMs = (int)Math.Round(1000.0 / frameRate * (double)numericUpDownFrames.Value); + labelXFrameIsXMS.Text = string.Format(Configuration.Settings.Language.SetMinimumDisplayTimeBetweenParagraphs.XFrameYisZMilliseconds, numericUpDownFrames.Value, frameRate, MinGapMs); + } + + private double GetFrameRate() + { + if (double.TryParse(comboBoxFrameRate.Text, NumberStyles.AllowDecimalPoint, CultureInfo.CurrentCulture, out var frameRate)) + { + return frameRate; + } + + return Configuration.Settings.General.CurrentFrameRate; + } + + private void buttonOK_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.OK; + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void SetMinimalDisplayTimeDifference_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + e.SuppressKeyPress = true; + } + } + + private void numericUpDownMinMillisecondsBetweenLines_ValueChanged(object sender, EventArgs e) + { + GeneratePreview(); + Configuration.Settings.General.MinimumMillisecondsBetweenLines = (int)numericUpDownMinMillisecondsBetweenLines.Value; + } + + private void checkBoxShowOnlyChangedLines_CheckedChanged(object sender, EventArgs e) + { + GeneratePreview(); + } + + private void numericUpDownMinMillisecondsBetweenLines_KeyUp(object sender, KeyEventArgs e) + { + numericUpDownMinMillisecondsBetweenLines.ValueChanged -= numericUpDownMinMillisecondsBetweenLines_ValueChanged; + GeneratePreview(); + numericUpDownMinMillisecondsBetweenLines.ValueChanged += numericUpDownMinMillisecondsBetweenLines_ValueChanged; + Configuration.Settings.General.MinimumMillisecondsBetweenLines = (int)numericUpDownMinMillisecondsBetweenLines.Value; + } + + private void comboBoxFrameRate_SelectedIndexChanged(object sender, EventArgs e) + { + CalcMilliseconds(); + } + + private void comboBoxFrameRate_KeyUp(object sender, KeyEventArgs e) + { + comboBoxFrameRate_SelectedIndexChanged(sender, e); + } + + private void SetMinimumDisplayTimeBetweenParagraphs_Shown(object sender, EventArgs e) + { + SubtitleListview1.Focus(); + } + + private void numericUpDownFrames_ValueChanged(object sender, EventArgs e) + { + CalcMilliseconds(); + } + + } + +} diff --git a/src/Forms/SetMinimumDisplayTimeBetweenParagraphs.resx b/src/ui/Forms/SetMinimumDisplayTimeBetweenParagraphs.resx similarity index 97% rename from src/Forms/SetMinimumDisplayTimeBetweenParagraphs.resx rename to src/ui/Forms/SetMinimumDisplayTimeBetweenParagraphs.resx index 29dcb1b3a..1af7de150 100644 --- a/src/Forms/SetMinimumDisplayTimeBetweenParagraphs.resx +++ b/src/ui/Forms/SetMinimumDisplayTimeBetweenParagraphs.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Forms/SetSyncPoint.Designer.cs b/src/ui/Forms/SetSyncPoint.Designer.cs similarity index 98% rename from src/Forms/SetSyncPoint.Designer.cs rename to src/ui/Forms/SetSyncPoint.Designer.cs index a554c8540..39aa635a2 100644 --- a/src/Forms/SetSyncPoint.Designer.cs +++ b/src/ui/Forms/SetSyncPoint.Designer.cs @@ -1,346 +1,346 @@ -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - partial class SetSyncPoint - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - TimeCode timeCode1 = new TimeCode(); - this.groupBoxSyncPointTimeCode = new System.Windows.Forms.GroupBox(); - this.timeUpDownLine = new Nikse.SubtitleEdit.Controls.TimeUpDown(); - this.groupBox2 = new System.Windows.Forms.GroupBox(); - this.subtitleListView1 = new Nikse.SubtitleEdit.Controls.SubtitleListView(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonSetSyncPoint = new System.Windows.Forms.Button(); - this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); - this.buttonOpenMovie = new System.Windows.Forms.Button(); - this.timer1 = new System.Windows.Forms.Timer(this.components); - this.labelVideoFileName = new System.Windows.Forms.Label(); - this.buttonHalfASecondBack = new System.Windows.Forms.Button(); - this.buttonThreeSecondsBack = new System.Windows.Forms.Button(); - this.buttonThreeSecondsAhead = new System.Windows.Forms.Button(); - this.buttonHalfASecondAhead = new System.Windows.Forms.Button(); - this.buttonVerify = new System.Windows.Forms.Button(); - this.labelSubtitle = new System.Windows.Forms.Label(); - this.videoPlayerContainer1 = new Nikse.SubtitleEdit.Controls.VideoPlayerContainer(); - this.buttonFindTextEnd = new System.Windows.Forms.Button(); - this.groupBoxSyncPointTimeCode.SuspendLayout(); - this.groupBox2.SuspendLayout(); - this.SuspendLayout(); - // - // groupBoxSyncPointTimeCode - // - this.groupBoxSyncPointTimeCode.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left))); - this.groupBoxSyncPointTimeCode.Controls.Add(this.timeUpDownLine); - this.groupBoxSyncPointTimeCode.Location = new System.Drawing.Point(12, 12); - this.groupBoxSyncPointTimeCode.Name = "groupBoxSyncPointTimeCode"; - this.groupBoxSyncPointTimeCode.Size = new System.Drawing.Size(172, 224); - this.groupBoxSyncPointTimeCode.TabIndex = 1; - this.groupBoxSyncPointTimeCode.TabStop = false; - this.groupBoxSyncPointTimeCode.Text = "Sync point time code"; - // - // timeUpDownLine - // - this.timeUpDownLine.AutoSize = true; - this.timeUpDownLine.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.timeUpDownLine.Font = new System.Drawing.Font("Segoe UI", 9F); - this.timeUpDownLine.Location = new System.Drawing.Point(18, 19); - this.timeUpDownLine.Margin = new System.Windows.Forms.Padding(4); - this.timeUpDownLine.Name = "timeUpDownLine"; - this.timeUpDownLine.Size = new System.Drawing.Size(111, 27); - this.timeUpDownLine.TabIndex = 1; - timeCode1.Hours = 0; - timeCode1.Milliseconds = 0; - timeCode1.Minutes = 0; - timeCode1.Seconds = 0; - timeCode1.TimeSpan = System.TimeSpan.Parse("00:00:00"); - timeCode1.TotalMilliseconds = 0D; - timeCode1.TotalSeconds = 0D; - this.timeUpDownLine.TimeCode = timeCode1; - this.timeUpDownLine.UseVideoOffset = false; - this.timeUpDownLine.KeyDown += new System.Windows.Forms.KeyEventHandler(this.timeUpDownLine_KeyDown); - // - // groupBox2 - // - this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBox2.Controls.Add(this.subtitleListView1); - this.groupBox2.Location = new System.Drawing.Point(190, 13); - this.groupBox2.Name = "groupBox2"; - this.groupBox2.Size = new System.Drawing.Size(605, 223); - this.groupBox2.TabIndex = 10; - this.groupBox2.TabStop = false; - // - // subtitleListView1 - // - this.subtitleListView1.AllowColumnReorder = true; - this.subtitleListView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.subtitleListView1.FirstVisibleIndex = -1; - this.subtitleListView1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.subtitleListView1.FullRowSelect = true; - this.subtitleListView1.GridLines = true; - this.subtitleListView1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; - this.subtitleListView1.HideSelection = false; - this.subtitleListView1.Location = new System.Drawing.Point(6, 18); - this.subtitleListView1.Name = "subtitleListView1"; - this.subtitleListView1.OwnerDraw = true; - this.subtitleListView1.Size = new System.Drawing.Size(593, 199); - this.subtitleListView1.SubtitleFontBold = false; - this.subtitleListView1.SubtitleFontName = "Tahoma"; - this.subtitleListView1.SubtitleFontSize = 8; - this.subtitleListView1.TabIndex = 11; - this.subtitleListView1.UseCompatibleStateImageBehavior = false; - this.subtitleListView1.UseSyntaxColoring = true; - this.subtitleListView1.View = System.Windows.Forms.View.Details; - this.subtitleListView1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.SubtitleListView1MouseDoubleClick); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(713, 584); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 31; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // buttonSetSyncPoint - // - this.buttonSetSyncPoint.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonSetSyncPoint.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonSetSyncPoint.Location = new System.Drawing.Point(584, 584); - this.buttonSetSyncPoint.Name = "buttonSetSyncPoint"; - this.buttonSetSyncPoint.Size = new System.Drawing.Size(123, 23); - this.buttonSetSyncPoint.TabIndex = 30; - this.buttonSetSyncPoint.Text = "&Set sync point"; - this.buttonSetSyncPoint.UseVisualStyleBackColor = true; - this.buttonSetSyncPoint.Click += new System.EventHandler(this.buttonOK_Click); - // - // openFileDialog1 - // - this.openFileDialog1.FileName = "openFileDialog1"; - // - // buttonOpenMovie - // - this.buttonOpenMovie.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOpenMovie.Location = new System.Drawing.Point(682, 241); - this.buttonOpenMovie.Name = "buttonOpenMovie"; - this.buttonOpenMovie.Size = new System.Drawing.Size(109, 23); - this.buttonOpenMovie.TabIndex = 12; - this.buttonOpenMovie.Text = "Open movie..."; - this.buttonOpenMovie.UseVisualStyleBackColor = true; - this.buttonOpenMovie.Click += new System.EventHandler(this.buttonOpenMovie_Click); - // - // timer1 - // - this.timer1.Interval = 50; - this.timer1.Tick += new System.EventHandler(this.timer1_Tick); - // - // labelVideoFileName - // - this.labelVideoFileName.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelVideoFileName.AutoSize = true; - this.labelVideoFileName.Location = new System.Drawing.Point(12, 250); - this.labelVideoFileName.Name = "labelVideoFileName"; - this.labelVideoFileName.Size = new System.Drawing.Size(98, 13); - this.labelVideoFileName.TabIndex = 21; - this.labelVideoFileName.Text = "labelVideoFileName"; - // - // buttonHalfASecondBack - // - this.buttonHalfASecondBack.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonHalfASecondBack.Location = new System.Drawing.Point(12, 560); - this.buttonHalfASecondBack.Name = "buttonHalfASecondBack"; - this.buttonHalfASecondBack.Size = new System.Drawing.Size(77, 23); - this.buttonHalfASecondBack.TabIndex = 20; - this.buttonHalfASecondBack.Text = "&½ second <"; - this.buttonHalfASecondBack.UseVisualStyleBackColor = true; - this.buttonHalfASecondBack.Click += new System.EventHandler(this.buttonStartHalfASecondBack_Click); - // - // buttonThreeSecondsBack - // - this.buttonThreeSecondsBack.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonThreeSecondsBack.Location = new System.Drawing.Point(95, 560); - this.buttonThreeSecondsBack.Name = "buttonThreeSecondsBack"; - this.buttonThreeSecondsBack.Size = new System.Drawing.Size(77, 23); - this.buttonThreeSecondsBack.TabIndex = 21; - this.buttonThreeSecondsBack.Text = "&3 seconds <"; - this.buttonThreeSecondsBack.UseVisualStyleBackColor = true; - this.buttonThreeSecondsBack.Click += new System.EventHandler(this.buttonStartThreeSecondsBack_Click); - // - // buttonThreeSecondsAhead - // - this.buttonThreeSecondsAhead.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonThreeSecondsAhead.Location = new System.Drawing.Point(303, 560); - this.buttonThreeSecondsAhead.Name = "buttonThreeSecondsAhead"; - this.buttonThreeSecondsAhead.Size = new System.Drawing.Size(77, 23); - this.buttonThreeSecondsAhead.TabIndex = 23; - this.buttonThreeSecondsAhead.Text = "3 seconds >"; - this.buttonThreeSecondsAhead.UseVisualStyleBackColor = true; - this.buttonThreeSecondsAhead.Click += new System.EventHandler(this.buttonStartThreeSecondsAhead_Click); - // - // buttonHalfASecondAhead - // - this.buttonHalfASecondAhead.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonHalfASecondAhead.Location = new System.Drawing.Point(386, 560); - this.buttonHalfASecondAhead.Name = "buttonHalfASecondAhead"; - this.buttonHalfASecondAhead.Size = new System.Drawing.Size(77, 23); - this.buttonHalfASecondAhead.TabIndex = 24; - this.buttonHalfASecondAhead.Text = "½ second >"; - this.buttonHalfASecondAhead.UseVisualStyleBackColor = true; - this.buttonHalfASecondAhead.Click += new System.EventHandler(this.buttonStartHalfASecondAhead_Click); - // - // buttonVerify - // - this.buttonVerify.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonVerify.Location = new System.Drawing.Point(178, 560); - this.buttonVerify.Name = "buttonVerify"; - this.buttonVerify.Size = new System.Drawing.Size(119, 23); - this.buttonVerify.TabIndex = 22; - this.buttonVerify.Text = "Play 2 s and back"; - this.buttonVerify.UseVisualStyleBackColor = true; - this.buttonVerify.Click += new System.EventHandler(this.buttonStartVerify_Click); - // - // labelSubtitle - // - this.labelSubtitle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.labelSubtitle.BackColor = System.Drawing.Color.Black; - this.labelSubtitle.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelSubtitle.ForeColor = System.Drawing.Color.White; - this.labelSubtitle.Location = new System.Drawing.Point(12, 529); - this.labelSubtitle.Name = "labelSubtitle"; - this.labelSubtitle.Size = new System.Drawing.Size(779, 28); - this.labelSubtitle.TabIndex = 27; - this.labelSubtitle.Text = "labelSubtitle"; - this.labelSubtitle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; - // - // videoPlayerContainer1 - // - this.videoPlayerContainer1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.videoPlayerContainer1.BackColor = System.Drawing.Color.Black; - this.videoPlayerContainer1.CurrentPosition = 0D; - this.videoPlayerContainer1.FontSizeFactor = 1F; - this.videoPlayerContainer1.LastParagraph = null; - this.videoPlayerContainer1.Location = new System.Drawing.Point(12, 267); - this.videoPlayerContainer1.Name = "videoPlayerContainer1"; - this.videoPlayerContainer1.ShowFullscreenButton = true; - this.videoPlayerContainer1.ShowMuteButton = true; - this.videoPlayerContainer1.ShowStopButton = true; - this.videoPlayerContainer1.Size = new System.Drawing.Size(779, 263); - this.videoPlayerContainer1.SmpteMode = false; - this.videoPlayerContainer1.SubtitleText = ""; - this.videoPlayerContainer1.TabIndex = 13; - this.videoPlayerContainer1.TextRightToLeft = System.Windows.Forms.RightToLeft.No; - this.videoPlayerContainer1.VideoHeight = 0; - this.videoPlayerContainer1.VideoPlayer = null; - this.videoPlayerContainer1.VideoWidth = 0; - this.videoPlayerContainer1.Volume = 0D; - // - // buttonFindTextEnd - // - this.buttonFindTextEnd.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonFindTextEnd.Location = new System.Drawing.Point(469, 560); - this.buttonFindTextEnd.Name = "buttonFindTextEnd"; - this.buttonFindTextEnd.Size = new System.Drawing.Size(106, 23); - this.buttonFindTextEnd.TabIndex = 25; - this.buttonFindTextEnd.Text = "Find text..."; - this.buttonFindTextEnd.UseVisualStyleBackColor = true; - this.buttonFindTextEnd.Click += new System.EventHandler(this.ButtonFindTextEndClick); - // - // SetSyncPoint - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(800, 609); - this.Controls.Add(this.buttonFindTextEnd); - this.Controls.Add(this.labelSubtitle); - this.Controls.Add(this.buttonVerify); - this.Controls.Add(this.buttonHalfASecondBack); - this.Controls.Add(this.buttonThreeSecondsBack); - this.Controls.Add(this.buttonThreeSecondsAhead); - this.Controls.Add(this.buttonHalfASecondAhead); - this.Controls.Add(this.labelVideoFileName); - this.Controls.Add(this.buttonOpenMovie); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonSetSyncPoint); - this.Controls.Add(this.groupBox2); - this.Controls.Add(this.groupBoxSyncPointTimeCode); - this.Controls.Add(this.videoPlayerContainer1); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(700, 600); - this.Name = "SetSyncPoint"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Set sync point"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.GetTime_FormClosing); - this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.GetTime_FormClosed); - this.Load += new System.EventHandler(this.GetTimeLoad); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.GetTime_KeyDown); - this.groupBoxSyncPointTimeCode.ResumeLayout(false); - this.groupBoxSyncPointTimeCode.PerformLayout(); - this.groupBox2.ResumeLayout(false); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private Controls.VideoPlayerContainer videoPlayerContainer1; - private Controls.TimeUpDown timeUpDownLine; - private System.Windows.Forms.GroupBox groupBoxSyncPointTimeCode; - private System.Windows.Forms.GroupBox groupBox2; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonSetSyncPoint; - private System.Windows.Forms.OpenFileDialog openFileDialog1; - private System.Windows.Forms.Button buttonOpenMovie; - private System.Windows.Forms.Timer timer1; - private System.Windows.Forms.Label labelVideoFileName; - private System.Windows.Forms.Button buttonHalfASecondBack; - private System.Windows.Forms.Button buttonThreeSecondsBack; - private System.Windows.Forms.Button buttonThreeSecondsAhead; - private System.Windows.Forms.Button buttonHalfASecondAhead; - private System.Windows.Forms.Button buttonVerify; - private System.Windows.Forms.Label labelSubtitle; - private Controls.SubtitleListView subtitleListView1; - private System.Windows.Forms.Button buttonFindTextEnd; - } +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + partial class SetSyncPoint + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + TimeCode timeCode1 = new TimeCode(); + this.groupBoxSyncPointTimeCode = new System.Windows.Forms.GroupBox(); + this.timeUpDownLine = new Nikse.SubtitleEdit.Controls.TimeUpDown(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.subtitleListView1 = new Nikse.SubtitleEdit.Controls.SubtitleListView(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonSetSyncPoint = new System.Windows.Forms.Button(); + this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); + this.buttonOpenMovie = new System.Windows.Forms.Button(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.labelVideoFileName = new System.Windows.Forms.Label(); + this.buttonHalfASecondBack = new System.Windows.Forms.Button(); + this.buttonThreeSecondsBack = new System.Windows.Forms.Button(); + this.buttonThreeSecondsAhead = new System.Windows.Forms.Button(); + this.buttonHalfASecondAhead = new System.Windows.Forms.Button(); + this.buttonVerify = new System.Windows.Forms.Button(); + this.labelSubtitle = new System.Windows.Forms.Label(); + this.videoPlayerContainer1 = new Nikse.SubtitleEdit.Controls.VideoPlayerContainer(); + this.buttonFindTextEnd = new System.Windows.Forms.Button(); + this.groupBoxSyncPointTimeCode.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.SuspendLayout(); + // + // groupBoxSyncPointTimeCode + // + this.groupBoxSyncPointTimeCode.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.groupBoxSyncPointTimeCode.Controls.Add(this.timeUpDownLine); + this.groupBoxSyncPointTimeCode.Location = new System.Drawing.Point(12, 12); + this.groupBoxSyncPointTimeCode.Name = "groupBoxSyncPointTimeCode"; + this.groupBoxSyncPointTimeCode.Size = new System.Drawing.Size(172, 224); + this.groupBoxSyncPointTimeCode.TabIndex = 1; + this.groupBoxSyncPointTimeCode.TabStop = false; + this.groupBoxSyncPointTimeCode.Text = "Sync point time code"; + // + // timeUpDownLine + // + this.timeUpDownLine.AutoSize = true; + this.timeUpDownLine.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.timeUpDownLine.Font = new System.Drawing.Font("Segoe UI", 9F); + this.timeUpDownLine.Location = new System.Drawing.Point(18, 19); + this.timeUpDownLine.Margin = new System.Windows.Forms.Padding(4); + this.timeUpDownLine.Name = "timeUpDownLine"; + this.timeUpDownLine.Size = new System.Drawing.Size(111, 27); + this.timeUpDownLine.TabIndex = 1; + timeCode1.Hours = 0; + timeCode1.Milliseconds = 0; + timeCode1.Minutes = 0; + timeCode1.Seconds = 0; + timeCode1.TimeSpan = System.TimeSpan.Parse("00:00:00"); + timeCode1.TotalMilliseconds = 0D; + timeCode1.TotalSeconds = 0D; + this.timeUpDownLine.TimeCode = timeCode1; + this.timeUpDownLine.UseVideoOffset = false; + this.timeUpDownLine.KeyDown += new System.Windows.Forms.KeyEventHandler(this.timeUpDownLine_KeyDown); + // + // groupBox2 + // + this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBox2.Controls.Add(this.subtitleListView1); + this.groupBox2.Location = new System.Drawing.Point(190, 13); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(605, 223); + this.groupBox2.TabIndex = 10; + this.groupBox2.TabStop = false; + // + // subtitleListView1 + // + this.subtitleListView1.AllowColumnReorder = true; + this.subtitleListView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.subtitleListView1.FirstVisibleIndex = -1; + this.subtitleListView1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.subtitleListView1.FullRowSelect = true; + this.subtitleListView1.GridLines = true; + this.subtitleListView1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.subtitleListView1.HideSelection = false; + this.subtitleListView1.Location = new System.Drawing.Point(6, 18); + this.subtitleListView1.Name = "subtitleListView1"; + this.subtitleListView1.OwnerDraw = true; + this.subtitleListView1.Size = new System.Drawing.Size(593, 199); + this.subtitleListView1.SubtitleFontBold = false; + this.subtitleListView1.SubtitleFontName = "Tahoma"; + this.subtitleListView1.SubtitleFontSize = 8; + this.subtitleListView1.TabIndex = 11; + this.subtitleListView1.UseCompatibleStateImageBehavior = false; + this.subtitleListView1.UseSyntaxColoring = true; + this.subtitleListView1.View = System.Windows.Forms.View.Details; + this.subtitleListView1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.SubtitleListView1MouseDoubleClick); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(713, 584); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 31; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // buttonSetSyncPoint + // + this.buttonSetSyncPoint.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonSetSyncPoint.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonSetSyncPoint.Location = new System.Drawing.Point(584, 584); + this.buttonSetSyncPoint.Name = "buttonSetSyncPoint"; + this.buttonSetSyncPoint.Size = new System.Drawing.Size(123, 23); + this.buttonSetSyncPoint.TabIndex = 30; + this.buttonSetSyncPoint.Text = "&Set sync point"; + this.buttonSetSyncPoint.UseVisualStyleBackColor = true; + this.buttonSetSyncPoint.Click += new System.EventHandler(this.buttonOK_Click); + // + // openFileDialog1 + // + this.openFileDialog1.FileName = "openFileDialog1"; + // + // buttonOpenMovie + // + this.buttonOpenMovie.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOpenMovie.Location = new System.Drawing.Point(682, 241); + this.buttonOpenMovie.Name = "buttonOpenMovie"; + this.buttonOpenMovie.Size = new System.Drawing.Size(109, 23); + this.buttonOpenMovie.TabIndex = 12; + this.buttonOpenMovie.Text = "Open movie..."; + this.buttonOpenMovie.UseVisualStyleBackColor = true; + this.buttonOpenMovie.Click += new System.EventHandler(this.buttonOpenMovie_Click); + // + // timer1 + // + this.timer1.Interval = 50; + this.timer1.Tick += new System.EventHandler(this.timer1_Tick); + // + // labelVideoFileName + // + this.labelVideoFileName.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelVideoFileName.AutoSize = true; + this.labelVideoFileName.Location = new System.Drawing.Point(12, 250); + this.labelVideoFileName.Name = "labelVideoFileName"; + this.labelVideoFileName.Size = new System.Drawing.Size(98, 13); + this.labelVideoFileName.TabIndex = 21; + this.labelVideoFileName.Text = "labelVideoFileName"; + // + // buttonHalfASecondBack + // + this.buttonHalfASecondBack.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonHalfASecondBack.Location = new System.Drawing.Point(12, 560); + this.buttonHalfASecondBack.Name = "buttonHalfASecondBack"; + this.buttonHalfASecondBack.Size = new System.Drawing.Size(77, 23); + this.buttonHalfASecondBack.TabIndex = 20; + this.buttonHalfASecondBack.Text = "&½ second <"; + this.buttonHalfASecondBack.UseVisualStyleBackColor = true; + this.buttonHalfASecondBack.Click += new System.EventHandler(this.buttonStartHalfASecondBack_Click); + // + // buttonThreeSecondsBack + // + this.buttonThreeSecondsBack.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonThreeSecondsBack.Location = new System.Drawing.Point(95, 560); + this.buttonThreeSecondsBack.Name = "buttonThreeSecondsBack"; + this.buttonThreeSecondsBack.Size = new System.Drawing.Size(77, 23); + this.buttonThreeSecondsBack.TabIndex = 21; + this.buttonThreeSecondsBack.Text = "&3 seconds <"; + this.buttonThreeSecondsBack.UseVisualStyleBackColor = true; + this.buttonThreeSecondsBack.Click += new System.EventHandler(this.buttonStartThreeSecondsBack_Click); + // + // buttonThreeSecondsAhead + // + this.buttonThreeSecondsAhead.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonThreeSecondsAhead.Location = new System.Drawing.Point(303, 560); + this.buttonThreeSecondsAhead.Name = "buttonThreeSecondsAhead"; + this.buttonThreeSecondsAhead.Size = new System.Drawing.Size(77, 23); + this.buttonThreeSecondsAhead.TabIndex = 23; + this.buttonThreeSecondsAhead.Text = "3 seconds >"; + this.buttonThreeSecondsAhead.UseVisualStyleBackColor = true; + this.buttonThreeSecondsAhead.Click += new System.EventHandler(this.buttonStartThreeSecondsAhead_Click); + // + // buttonHalfASecondAhead + // + this.buttonHalfASecondAhead.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonHalfASecondAhead.Location = new System.Drawing.Point(386, 560); + this.buttonHalfASecondAhead.Name = "buttonHalfASecondAhead"; + this.buttonHalfASecondAhead.Size = new System.Drawing.Size(77, 23); + this.buttonHalfASecondAhead.TabIndex = 24; + this.buttonHalfASecondAhead.Text = "½ second >"; + this.buttonHalfASecondAhead.UseVisualStyleBackColor = true; + this.buttonHalfASecondAhead.Click += new System.EventHandler(this.buttonStartHalfASecondAhead_Click); + // + // buttonVerify + // + this.buttonVerify.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonVerify.Location = new System.Drawing.Point(178, 560); + this.buttonVerify.Name = "buttonVerify"; + this.buttonVerify.Size = new System.Drawing.Size(119, 23); + this.buttonVerify.TabIndex = 22; + this.buttonVerify.Text = "Play 2 s and back"; + this.buttonVerify.UseVisualStyleBackColor = true; + this.buttonVerify.Click += new System.EventHandler(this.buttonStartVerify_Click); + // + // labelSubtitle + // + this.labelSubtitle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.labelSubtitle.BackColor = System.Drawing.Color.Black; + this.labelSubtitle.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelSubtitle.ForeColor = System.Drawing.Color.White; + this.labelSubtitle.Location = new System.Drawing.Point(12, 529); + this.labelSubtitle.Name = "labelSubtitle"; + this.labelSubtitle.Size = new System.Drawing.Size(779, 28); + this.labelSubtitle.TabIndex = 27; + this.labelSubtitle.Text = "labelSubtitle"; + this.labelSubtitle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // videoPlayerContainer1 + // + this.videoPlayerContainer1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.videoPlayerContainer1.BackColor = System.Drawing.Color.Black; + this.videoPlayerContainer1.CurrentPosition = 0D; + this.videoPlayerContainer1.FontSizeFactor = 1F; + this.videoPlayerContainer1.LastParagraph = null; + this.videoPlayerContainer1.Location = new System.Drawing.Point(12, 267); + this.videoPlayerContainer1.Name = "videoPlayerContainer1"; + this.videoPlayerContainer1.ShowFullscreenButton = true; + this.videoPlayerContainer1.ShowMuteButton = true; + this.videoPlayerContainer1.ShowStopButton = true; + this.videoPlayerContainer1.Size = new System.Drawing.Size(779, 263); + this.videoPlayerContainer1.SmpteMode = false; + this.videoPlayerContainer1.SubtitleText = ""; + this.videoPlayerContainer1.TabIndex = 13; + this.videoPlayerContainer1.TextRightToLeft = System.Windows.Forms.RightToLeft.No; + this.videoPlayerContainer1.VideoHeight = 0; + this.videoPlayerContainer1.VideoPlayer = null; + this.videoPlayerContainer1.VideoWidth = 0; + this.videoPlayerContainer1.Volume = 0D; + // + // buttonFindTextEnd + // + this.buttonFindTextEnd.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonFindTextEnd.Location = new System.Drawing.Point(469, 560); + this.buttonFindTextEnd.Name = "buttonFindTextEnd"; + this.buttonFindTextEnd.Size = new System.Drawing.Size(106, 23); + this.buttonFindTextEnd.TabIndex = 25; + this.buttonFindTextEnd.Text = "Find text..."; + this.buttonFindTextEnd.UseVisualStyleBackColor = true; + this.buttonFindTextEnd.Click += new System.EventHandler(this.ButtonFindTextEndClick); + // + // SetSyncPoint + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 609); + this.Controls.Add(this.buttonFindTextEnd); + this.Controls.Add(this.labelSubtitle); + this.Controls.Add(this.buttonVerify); + this.Controls.Add(this.buttonHalfASecondBack); + this.Controls.Add(this.buttonThreeSecondsBack); + this.Controls.Add(this.buttonThreeSecondsAhead); + this.Controls.Add(this.buttonHalfASecondAhead); + this.Controls.Add(this.labelVideoFileName); + this.Controls.Add(this.buttonOpenMovie); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonSetSyncPoint); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.groupBoxSyncPointTimeCode); + this.Controls.Add(this.videoPlayerContainer1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(700, 600); + this.Name = "SetSyncPoint"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Set sync point"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.GetTime_FormClosing); + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.GetTime_FormClosed); + this.Load += new System.EventHandler(this.GetTimeLoad); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.GetTime_KeyDown); + this.groupBoxSyncPointTimeCode.ResumeLayout(false); + this.groupBoxSyncPointTimeCode.PerformLayout(); + this.groupBox2.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private Controls.VideoPlayerContainer videoPlayerContainer1; + private Controls.TimeUpDown timeUpDownLine; + private System.Windows.Forms.GroupBox groupBoxSyncPointTimeCode; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonSetSyncPoint; + private System.Windows.Forms.OpenFileDialog openFileDialog1; + private System.Windows.Forms.Button buttonOpenMovie; + private System.Windows.Forms.Timer timer1; + private System.Windows.Forms.Label labelVideoFileName; + private System.Windows.Forms.Button buttonHalfASecondBack; + private System.Windows.Forms.Button buttonThreeSecondsBack; + private System.Windows.Forms.Button buttonThreeSecondsAhead; + private System.Windows.Forms.Button buttonHalfASecondAhead; + private System.Windows.Forms.Button buttonVerify; + private System.Windows.Forms.Label labelSubtitle; + private Controls.SubtitleListView subtitleListView1; + private System.Windows.Forms.Button buttonFindTextEnd; + } } \ No newline at end of file diff --git a/src/Forms/SetSyncPoint.cs b/src/ui/Forms/SetSyncPoint.cs similarity index 97% rename from src/Forms/SetSyncPoint.cs rename to src/ui/Forms/SetSyncPoint.cs index 449e6bd47..4857ff622 100644 --- a/src/Forms/SetSyncPoint.cs +++ b/src/ui/Forms/SetSyncPoint.cs @@ -1,388 +1,388 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using Nikse.SubtitleEdit.Logic.VideoPlayers; -using System; -using System.IO; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class SetSyncPoint : Form - { - private double _lastPosition; - private TimeSpan _guess; - private double _goBackPosition; - private double _stopPosition = -1.0; - private Subtitle _subtitle; - private int _audioTrackNumber = -1; - private readonly Keys _mainGeneralGoToNextSubtitle = UiUtil.GetKeys(Configuration.Settings.Shortcuts.GeneralGoToNextSubtitle); - private readonly Keys _mainGeneralGoToPrevSubtitle = UiUtil.GetKeys(Configuration.Settings.Shortcuts.GeneralGoToPrevSubtitle); - private string _subtitleFileName; - public string VideoFileName { get; private set; } - - public SetSyncPoint() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - groupBoxSyncPointTimeCode.Text = Configuration.Settings.Language.SetSyncPoint.SyncPointTimeCode; - buttonThreeSecondsBack.Text = Configuration.Settings.Language.SetSyncPoint.ThreeSecondsBack; - buttonHalfASecondBack.Text = Configuration.Settings.Language.SetSyncPoint.HalfASecondBack; - buttonVerify.Text = string.Format(Configuration.Settings.Language.VisualSync.PlayXSecondsAndBack, Configuration.Settings.Tools.VerifyPlaySeconds); - buttonHalfASecondAhead.Text = Configuration.Settings.Language.SetSyncPoint.HalfASecondForward; - buttonThreeSecondsAhead.Text = Configuration.Settings.Language.SetSyncPoint.ThreeSecondsForward; - buttonOpenMovie.Text = Configuration.Settings.Language.General.OpenVideoFile; - buttonSetSyncPoint.Text = Configuration.Settings.Language.PointSync.SetSyncPoint; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - subtitleListView1.InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings); - UiUtil.InitializeSubtitleFont(subtitleListView1); - subtitleListView1.AutoSizeAllColumns(this); - buttonFindTextEnd.Text = Configuration.Settings.Language.VisualSync.FindText; - UiUtil.FixLargeFonts(this, buttonSetSyncPoint); - } - - public TimeSpan SynchronizationPoint => timeUpDownLine.TimeCode.TimeSpan; - - public void Initialize(Subtitle subtitle, string subtitleFileName, int index, string videoFileName, int audioTrackNumber) - { - _subtitleFileName = subtitleFileName; - _subtitle = subtitle; - _audioTrackNumber = audioTrackNumber; - subtitleListView1.Fill(subtitle); - _guess = subtitle.Paragraphs[index].StartTime.TimeSpan; - subtitleListView1.Items[index].Selected = true; - Text = string.Format(Configuration.Settings.Language.SetSyncPoint.Title, subtitle.Paragraphs[index].Number + ": " + subtitle.Paragraphs[index]); - labelSubtitle.Text = string.Empty; - labelVideoFileName.Text = Configuration.Settings.Language.General.NoVideoLoaded; - - timeUpDownLine.TimeCode = subtitle.Paragraphs[index].StartTime; - - if (!string.IsNullOrEmpty(videoFileName) && File.Exists(videoFileName)) - { - OpenVideo(videoFileName); - } - else if (!string.IsNullOrEmpty(subtitleFileName)) - { - TryToFindAndOpenVideoFile(Path.GetDirectoryName(subtitleFileName) + Path.DirectorySeparatorChar + - Path.GetFileNameWithoutExtension(subtitleFileName)); - } - } - - private void TryToFindAndOpenVideoFile(string fileNameNoExtension) - { - string movieFileName = null; - - foreach (string extension in Utilities.VideoFileExtensions) - { - movieFileName = fileNameNoExtension + extension; - if (File.Exists(movieFileName)) - { - break; - } - } - - if (movieFileName != null && File.Exists(movieFileName)) - { - OpenVideo(movieFileName); - } - else if (fileNameNoExtension.Contains('.')) - { - fileNameNoExtension = fileNameNoExtension.Substring(0, fileNameNoExtension.LastIndexOf('.')); - TryToFindAndOpenVideoFile(fileNameNoExtension); - } - } - - private void buttonOpenMovie_Click(object sender, EventArgs e) - { - openFileDialog1.Title = Configuration.Settings.Language.General.OpenVideoFileTitle; - openFileDialog1.FileName = string.Empty; - openFileDialog1.Filter = Utilities.GetVideoFileFilter(false); - if (File.Exists(_subtitleFileName)) - { - var videoFileExt = Utilities.GetVideoFileFilter(false); - var folder = Path.GetDirectoryName(_subtitleFileName); - if (folder != null) - { - foreach (var file in Directory.GetFiles(folder)) - { - if (file.EndsWith(".nfo", StringComparison.OrdinalIgnoreCase) - || file.EndsWith(".srt", StringComparison.OrdinalIgnoreCase) - || file.EndsWith(".sub", StringComparison.OrdinalIgnoreCase)) - { - continue; - } - - if (videoFileExt.Contains(Path.GetExtension(file))) - { - openFileDialog1.InitialDirectory = Path.GetDirectoryName(file); - break; - } - } - } - } - if (openFileDialog1.ShowDialog() == DialogResult.OK) - { - _audioTrackNumber = -1; - openFileDialog1.InitialDirectory = Path.GetDirectoryName(openFileDialog1.FileName); - OpenVideo(openFileDialog1.FileName); - } - } - - private void OpenVideo(string fileName) - { - if (File.Exists(fileName)) - { - var fi = new FileInfo(fileName); - if (fi.Length < 1000) - { - return; - } - - labelVideoFileName.Text = fileName; - VideoFileName = fileName; - if (videoPlayerContainer1.VideoPlayer != null) - { - videoPlayerContainer1.Pause(); - videoPlayerContainer1.VideoPlayer.DisposeVideoPlayer(); - } - - VideoInfo videoInfo = UiUtil.GetVideoInfo(fileName); - - UiUtil.InitializeVideoPlayerAndContainer(fileName, videoInfo, videoPlayerContainer1, VideoStartLoaded, VideoStartEnded); - } - } - - private void VideoStartEnded(object sender, EventArgs e) - { - videoPlayerContainer1.Pause(); - } - - private void VideoStartLoaded(object sender, EventArgs e) - { - timer1.Start(); - - videoPlayerContainer1.Pause(); - - if (_guess.TotalMilliseconds > 0 && _guess.TotalMilliseconds / TimeCode.BaseUnit < videoPlayerContainer1.VideoPlayer.Duration) - { - videoPlayerContainer1.VideoPlayer.CurrentPosition = _guess.TotalMilliseconds / TimeCode.BaseUnit; - videoPlayerContainer1.RefreshProgressBar(); - } - - if (_audioTrackNumber >= 0 && videoPlayerContainer1.VideoPlayer is LibVlcDynamic libVlc) - { - libVlc.AudioTrackNumber = _audioTrackNumber; - } - else if (_audioTrackNumber >= 0 && videoPlayerContainer1.VideoPlayer is LibMpvDynamic libMpv) - { - libMpv.AudioTrackNumber = _audioTrackNumber; - } - } - - private void timer1_Tick(object sender, EventArgs e) - { - if (videoPlayerContainer1 != null) - { - double pos; - - if (_stopPosition >= 0 && videoPlayerContainer1.CurrentPosition > _stopPosition) - { - videoPlayerContainer1.Pause(); - videoPlayerContainer1.CurrentPosition = _goBackPosition; - _stopPosition = -1; - } - - if (!videoPlayerContainer1.IsPaused) - { - videoPlayerContainer1.RefreshProgressBar(); - pos = videoPlayerContainer1.CurrentPosition; - } - else - { - pos = videoPlayerContainer1.CurrentPosition; - } - if (Math.Abs(pos - _lastPosition) > 0.01) - { - UiUtil.ShowSubtitle(_subtitle, videoPlayerContainer1); - timeUpDownLine.TimeCode = TimeCode.FromSeconds(pos); - _lastPosition = pos; - } - } - } - - private void buttonOK_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.OK; - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private void GetTime_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - else if (e.KeyCode == Keys.S && e.Modifiers == Keys.Control) - { - videoPlayerContainer1.Pause(); - e.SuppressKeyPress = true; - } - else if (e.KeyCode == Keys.P && e.Control) - { - videoPlayerContainer1.VideoPlayer.Pause(); - e.SuppressKeyPress = true; - } - else if (e.Modifiers == Keys.Alt && e.KeyCode == Keys.Left) - { - GoBackSeconds(0.5, videoPlayerContainer1.VideoPlayer); - e.SuppressKeyPress = true; - } - else if (e.Modifiers == Keys.Alt && e.KeyCode == Keys.Right) - { - GoBackSeconds(-0.5, videoPlayerContainer1.VideoPlayer); - e.SuppressKeyPress = true; - } - else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.Left) - { - GoBackSeconds(0.1, videoPlayerContainer1.VideoPlayer); - e.SuppressKeyPress = true; - } - else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.Right) - { - GoBackSeconds(-0.1, videoPlayerContainer1.VideoPlayer); - e.SuppressKeyPress = true; - } - else if (e.KeyCode == UiUtil.HelpKeys) - { - Utilities.ShowHelp("#sync"); - e.SuppressKeyPress = true; - } - else if (_mainGeneralGoToNextSubtitle == e.KeyData || (e.KeyCode == Keys.Down && e.Modifiers == Keys.Alt)) - { - int selectedIndex = 0; - if (subtitleListView1.SelectedItems.Count > 0) - { - selectedIndex = subtitleListView1.SelectedItems[0].Index; - selectedIndex++; - } - subtitleListView1.SelectIndexAndEnsureVisible(selectedIndex); - e.SuppressKeyPress = true; - } - else if (_mainGeneralGoToPrevSubtitle == e.KeyData || (e.KeyCode == Keys.Up && e.Modifiers == Keys.Alt)) - { - int selectedIndex = 0; - if (subtitleListView1.SelectedItems.Count > 0) - { - selectedIndex = subtitleListView1.SelectedItems[0].Index; - selectedIndex--; - } - subtitleListView1.SelectIndexAndEnsureVisible(selectedIndex); - e.SuppressKeyPress = true; - } - } - - private void GetTime_FormClosing(object sender, FormClosingEventArgs e) - { - timer1.Stop(); - videoPlayerContainer1?.Pause(); - } - - private void GetTime_FormClosed(object sender, FormClosedEventArgs e) - { - videoPlayerContainer1.VideoPlayer?.DisposeVideoPlayer(); - } - - private void GoBackSeconds(double seconds, VideoPlayer mediaPlayer) - { - if (mediaPlayer != null) - { - if (mediaPlayer.CurrentPosition > seconds) - { - mediaPlayer.CurrentPosition -= seconds; - } - else - { - mediaPlayer.CurrentPosition = 0; - } - - videoPlayerContainer1.RefreshProgressBar(); - } - } - - private void buttonStartHalfASecondBack_Click(object sender, EventArgs e) - { - GoBackSeconds(0.5, videoPlayerContainer1.VideoPlayer); - } - - private void buttonStartThreeSecondsBack_Click(object sender, EventArgs e) - { - GoBackSeconds(3, videoPlayerContainer1.VideoPlayer); - } - - private void buttonStartThreeSecondsAhead_Click(object sender, EventArgs e) - { - GoBackSeconds(-3.0, videoPlayerContainer1.VideoPlayer); - } - - private void buttonStartHalfASecondAhead_Click(object sender, EventArgs e) - { - GoBackSeconds(-0.5, videoPlayerContainer1.VideoPlayer); - } - - private void buttonStartVerify_Click(object sender, EventArgs e) - { - if (videoPlayerContainer1?.VideoPlayer != null) - { - _goBackPosition = videoPlayerContainer1.CurrentPosition; - _stopPosition = _goBackPosition + Configuration.Settings.Tools.VerifyPlaySeconds; - videoPlayerContainer1.Play(); - } - } - - private void GetTimeLoad(object sender, EventArgs e) - { - if (subtitleListView1.SelectedItems.Count == 1) - { - subtitleListView1.SelectIndexAndEnsureVisible(subtitleListView1.SelectedItems[0].Index); - } - } - - private void SubtitleListView1MouseDoubleClick(object sender, MouseEventArgs e) - { - if (subtitleListView1.SelectedItems.Count == 1) - { - int index = subtitleListView1.SelectedItems[0].Index; - - videoPlayerContainer1.Pause(); - videoPlayerContainer1.CurrentPosition = _subtitle.Paragraphs[index].StartTime.TotalMilliseconds / TimeCode.BaseUnit; - } - } - - private void ButtonFindTextEndClick(object sender, EventArgs e) - { - using (var findSubtitle = new FindSubtitleLine()) - { - findSubtitle.Initialize(_subtitle.Paragraphs, string.Empty); - findSubtitle.ShowDialog(); - if (findSubtitle.SelectedIndex >= 0) - { - subtitleListView1.SelectIndexAndEnsureVisible(findSubtitle.SelectedIndex); - } - } - } - - private void timeUpDownLine_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Enter) - { - buttonOK_Click(sender, e); - } - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using Nikse.SubtitleEdit.Logic.VideoPlayers; +using System; +using System.IO; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class SetSyncPoint : Form + { + private double _lastPosition; + private TimeSpan _guess; + private double _goBackPosition; + private double _stopPosition = -1.0; + private Subtitle _subtitle; + private int _audioTrackNumber = -1; + private readonly Keys _mainGeneralGoToNextSubtitle = UiUtil.GetKeys(Configuration.Settings.Shortcuts.GeneralGoToNextSubtitle); + private readonly Keys _mainGeneralGoToPrevSubtitle = UiUtil.GetKeys(Configuration.Settings.Shortcuts.GeneralGoToPrevSubtitle); + private string _subtitleFileName; + public string VideoFileName { get; private set; } + + public SetSyncPoint() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + groupBoxSyncPointTimeCode.Text = Configuration.Settings.Language.SetSyncPoint.SyncPointTimeCode; + buttonThreeSecondsBack.Text = Configuration.Settings.Language.SetSyncPoint.ThreeSecondsBack; + buttonHalfASecondBack.Text = Configuration.Settings.Language.SetSyncPoint.HalfASecondBack; + buttonVerify.Text = string.Format(Configuration.Settings.Language.VisualSync.PlayXSecondsAndBack, Configuration.Settings.Tools.VerifyPlaySeconds); + buttonHalfASecondAhead.Text = Configuration.Settings.Language.SetSyncPoint.HalfASecondForward; + buttonThreeSecondsAhead.Text = Configuration.Settings.Language.SetSyncPoint.ThreeSecondsForward; + buttonOpenMovie.Text = Configuration.Settings.Language.General.OpenVideoFile; + buttonSetSyncPoint.Text = Configuration.Settings.Language.PointSync.SetSyncPoint; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + subtitleListView1.InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings); + UiUtil.InitializeSubtitleFont(subtitleListView1); + subtitleListView1.AutoSizeAllColumns(this); + buttonFindTextEnd.Text = Configuration.Settings.Language.VisualSync.FindText; + UiUtil.FixLargeFonts(this, buttonSetSyncPoint); + } + + public TimeSpan SynchronizationPoint => timeUpDownLine.TimeCode.TimeSpan; + + public void Initialize(Subtitle subtitle, string subtitleFileName, int index, string videoFileName, int audioTrackNumber) + { + _subtitleFileName = subtitleFileName; + _subtitle = subtitle; + _audioTrackNumber = audioTrackNumber; + subtitleListView1.Fill(subtitle); + _guess = subtitle.Paragraphs[index].StartTime.TimeSpan; + subtitleListView1.Items[index].Selected = true; + Text = string.Format(Configuration.Settings.Language.SetSyncPoint.Title, subtitle.Paragraphs[index].Number + ": " + subtitle.Paragraphs[index]); + labelSubtitle.Text = string.Empty; + labelVideoFileName.Text = Configuration.Settings.Language.General.NoVideoLoaded; + + timeUpDownLine.TimeCode = subtitle.Paragraphs[index].StartTime; + + if (!string.IsNullOrEmpty(videoFileName) && File.Exists(videoFileName)) + { + OpenVideo(videoFileName); + } + else if (!string.IsNullOrEmpty(subtitleFileName)) + { + TryToFindAndOpenVideoFile(Path.GetDirectoryName(subtitleFileName) + Path.DirectorySeparatorChar + + Path.GetFileNameWithoutExtension(subtitleFileName)); + } + } + + private void TryToFindAndOpenVideoFile(string fileNameNoExtension) + { + string movieFileName = null; + + foreach (string extension in Utilities.VideoFileExtensions) + { + movieFileName = fileNameNoExtension + extension; + if (File.Exists(movieFileName)) + { + break; + } + } + + if (movieFileName != null && File.Exists(movieFileName)) + { + OpenVideo(movieFileName); + } + else if (fileNameNoExtension.Contains('.')) + { + fileNameNoExtension = fileNameNoExtension.Substring(0, fileNameNoExtension.LastIndexOf('.')); + TryToFindAndOpenVideoFile(fileNameNoExtension); + } + } + + private void buttonOpenMovie_Click(object sender, EventArgs e) + { + openFileDialog1.Title = Configuration.Settings.Language.General.OpenVideoFileTitle; + openFileDialog1.FileName = string.Empty; + openFileDialog1.Filter = Utilities.GetVideoFileFilter(false); + if (File.Exists(_subtitleFileName)) + { + var videoFileExt = Utilities.GetVideoFileFilter(false); + var folder = Path.GetDirectoryName(_subtitleFileName); + if (folder != null) + { + foreach (var file in Directory.GetFiles(folder)) + { + if (file.EndsWith(".nfo", StringComparison.OrdinalIgnoreCase) + || file.EndsWith(".srt", StringComparison.OrdinalIgnoreCase) + || file.EndsWith(".sub", StringComparison.OrdinalIgnoreCase)) + { + continue; + } + + if (videoFileExt.Contains(Path.GetExtension(file))) + { + openFileDialog1.InitialDirectory = Path.GetDirectoryName(file); + break; + } + } + } + } + if (openFileDialog1.ShowDialog() == DialogResult.OK) + { + _audioTrackNumber = -1; + openFileDialog1.InitialDirectory = Path.GetDirectoryName(openFileDialog1.FileName); + OpenVideo(openFileDialog1.FileName); + } + } + + private void OpenVideo(string fileName) + { + if (File.Exists(fileName)) + { + var fi = new FileInfo(fileName); + if (fi.Length < 1000) + { + return; + } + + labelVideoFileName.Text = fileName; + VideoFileName = fileName; + if (videoPlayerContainer1.VideoPlayer != null) + { + videoPlayerContainer1.Pause(); + videoPlayerContainer1.VideoPlayer.DisposeVideoPlayer(); + } + + VideoInfo videoInfo = UiUtil.GetVideoInfo(fileName); + + UiUtil.InitializeVideoPlayerAndContainer(fileName, videoInfo, videoPlayerContainer1, VideoStartLoaded, VideoStartEnded); + } + } + + private void VideoStartEnded(object sender, EventArgs e) + { + videoPlayerContainer1.Pause(); + } + + private void VideoStartLoaded(object sender, EventArgs e) + { + timer1.Start(); + + videoPlayerContainer1.Pause(); + + if (_guess.TotalMilliseconds > 0 && _guess.TotalMilliseconds / TimeCode.BaseUnit < videoPlayerContainer1.VideoPlayer.Duration) + { + videoPlayerContainer1.VideoPlayer.CurrentPosition = _guess.TotalMilliseconds / TimeCode.BaseUnit; + videoPlayerContainer1.RefreshProgressBar(); + } + + if (_audioTrackNumber >= 0 && videoPlayerContainer1.VideoPlayer is LibVlcDynamic libVlc) + { + libVlc.AudioTrackNumber = _audioTrackNumber; + } + else if (_audioTrackNumber >= 0 && videoPlayerContainer1.VideoPlayer is LibMpvDynamic libMpv) + { + libMpv.AudioTrackNumber = _audioTrackNumber; + } + } + + private void timer1_Tick(object sender, EventArgs e) + { + if (videoPlayerContainer1 != null) + { + double pos; + + if (_stopPosition >= 0 && videoPlayerContainer1.CurrentPosition > _stopPosition) + { + videoPlayerContainer1.Pause(); + videoPlayerContainer1.CurrentPosition = _goBackPosition; + _stopPosition = -1; + } + + if (!videoPlayerContainer1.IsPaused) + { + videoPlayerContainer1.RefreshProgressBar(); + pos = videoPlayerContainer1.CurrentPosition; + } + else + { + pos = videoPlayerContainer1.CurrentPosition; + } + if (Math.Abs(pos - _lastPosition) > 0.01) + { + UiUtil.ShowSubtitle(_subtitle, videoPlayerContainer1); + timeUpDownLine.TimeCode = TimeCode.FromSeconds(pos); + _lastPosition = pos; + } + } + } + + private void buttonOK_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.OK; + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void GetTime_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + else if (e.KeyCode == Keys.S && e.Modifiers == Keys.Control) + { + videoPlayerContainer1.Pause(); + e.SuppressKeyPress = true; + } + else if (e.KeyCode == Keys.P && e.Control) + { + videoPlayerContainer1.VideoPlayer.Pause(); + e.SuppressKeyPress = true; + } + else if (e.Modifiers == Keys.Alt && e.KeyCode == Keys.Left) + { + GoBackSeconds(0.5, videoPlayerContainer1.VideoPlayer); + e.SuppressKeyPress = true; + } + else if (e.Modifiers == Keys.Alt && e.KeyCode == Keys.Right) + { + GoBackSeconds(-0.5, videoPlayerContainer1.VideoPlayer); + e.SuppressKeyPress = true; + } + else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.Left) + { + GoBackSeconds(0.1, videoPlayerContainer1.VideoPlayer); + e.SuppressKeyPress = true; + } + else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.Right) + { + GoBackSeconds(-0.1, videoPlayerContainer1.VideoPlayer); + e.SuppressKeyPress = true; + } + else if (e.KeyCode == UiUtil.HelpKeys) + { + Utilities.ShowHelp("#sync"); + e.SuppressKeyPress = true; + } + else if (_mainGeneralGoToNextSubtitle == e.KeyData || (e.KeyCode == Keys.Down && e.Modifiers == Keys.Alt)) + { + int selectedIndex = 0; + if (subtitleListView1.SelectedItems.Count > 0) + { + selectedIndex = subtitleListView1.SelectedItems[0].Index; + selectedIndex++; + } + subtitleListView1.SelectIndexAndEnsureVisible(selectedIndex); + e.SuppressKeyPress = true; + } + else if (_mainGeneralGoToPrevSubtitle == e.KeyData || (e.KeyCode == Keys.Up && e.Modifiers == Keys.Alt)) + { + int selectedIndex = 0; + if (subtitleListView1.SelectedItems.Count > 0) + { + selectedIndex = subtitleListView1.SelectedItems[0].Index; + selectedIndex--; + } + subtitleListView1.SelectIndexAndEnsureVisible(selectedIndex); + e.SuppressKeyPress = true; + } + } + + private void GetTime_FormClosing(object sender, FormClosingEventArgs e) + { + timer1.Stop(); + videoPlayerContainer1?.Pause(); + } + + private void GetTime_FormClosed(object sender, FormClosedEventArgs e) + { + videoPlayerContainer1.VideoPlayer?.DisposeVideoPlayer(); + } + + private void GoBackSeconds(double seconds, VideoPlayer mediaPlayer) + { + if (mediaPlayer != null) + { + if (mediaPlayer.CurrentPosition > seconds) + { + mediaPlayer.CurrentPosition -= seconds; + } + else + { + mediaPlayer.CurrentPosition = 0; + } + + videoPlayerContainer1.RefreshProgressBar(); + } + } + + private void buttonStartHalfASecondBack_Click(object sender, EventArgs e) + { + GoBackSeconds(0.5, videoPlayerContainer1.VideoPlayer); + } + + private void buttonStartThreeSecondsBack_Click(object sender, EventArgs e) + { + GoBackSeconds(3, videoPlayerContainer1.VideoPlayer); + } + + private void buttonStartThreeSecondsAhead_Click(object sender, EventArgs e) + { + GoBackSeconds(-3.0, videoPlayerContainer1.VideoPlayer); + } + + private void buttonStartHalfASecondAhead_Click(object sender, EventArgs e) + { + GoBackSeconds(-0.5, videoPlayerContainer1.VideoPlayer); + } + + private void buttonStartVerify_Click(object sender, EventArgs e) + { + if (videoPlayerContainer1?.VideoPlayer != null) + { + _goBackPosition = videoPlayerContainer1.CurrentPosition; + _stopPosition = _goBackPosition + Configuration.Settings.Tools.VerifyPlaySeconds; + videoPlayerContainer1.Play(); + } + } + + private void GetTimeLoad(object sender, EventArgs e) + { + if (subtitleListView1.SelectedItems.Count == 1) + { + subtitleListView1.SelectIndexAndEnsureVisible(subtitleListView1.SelectedItems[0].Index); + } + } + + private void SubtitleListView1MouseDoubleClick(object sender, MouseEventArgs e) + { + if (subtitleListView1.SelectedItems.Count == 1) + { + int index = subtitleListView1.SelectedItems[0].Index; + + videoPlayerContainer1.Pause(); + videoPlayerContainer1.CurrentPosition = _subtitle.Paragraphs[index].StartTime.TotalMilliseconds / TimeCode.BaseUnit; + } + } + + private void ButtonFindTextEndClick(object sender, EventArgs e) + { + using (var findSubtitle = new FindSubtitleLine()) + { + findSubtitle.Initialize(_subtitle.Paragraphs, string.Empty); + findSubtitle.ShowDialog(); + if (findSubtitle.SelectedIndex >= 0) + { + subtitleListView1.SelectIndexAndEnsureVisible(findSubtitle.SelectedIndex); + } + } + } + + private void timeUpDownLine_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + buttonOK_Click(sender, e); + } + } + } +} diff --git a/src/Forms/SetSyncPoint.resx b/src/ui/Forms/SetSyncPoint.resx similarity index 97% rename from src/Forms/SetSyncPoint.resx rename to src/ui/Forms/SetSyncPoint.resx index 98176d239..dea6a18d5 100644 --- a/src/Forms/SetSyncPoint.resx +++ b/src/ui/Forms/SetSyncPoint.resx @@ -1,126 +1,126 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - 157, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 157, 17 + \ No newline at end of file diff --git a/src/Forms/SetVideoOffset.Designer.cs b/src/ui/Forms/SetVideoOffset.Designer.cs similarity index 98% rename from src/Forms/SetVideoOffset.Designer.cs rename to src/ui/Forms/SetVideoOffset.Designer.cs index e7f8a68ef..8bae16901 100644 --- a/src/Forms/SetVideoOffset.Designer.cs +++ b/src/ui/Forms/SetVideoOffset.Designer.cs @@ -1,165 +1,165 @@ -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class SetVideoOffset - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - TimeCode timeCode1 = new TimeCode(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.labelDescription = new System.Windows.Forms.Label(); - this.checkBoxFromCurrentPosition = new System.Windows.Forms.CheckBox(); - this.timeUpDownVideoPosition = new Nikse.SubtitleEdit.Controls.TimeUpDown(); - this.buttonReset = new System.Windows.Forms.Button(); - this.checkBoxKeepTimeCodes = new System.Windows.Forms.CheckBox(); - this.SuspendLayout(); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(386, 129); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 5; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(194, 129); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 3; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // labelDescription - // - this.labelDescription.AutoSize = true; - this.labelDescription.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.labelDescription.Location = new System.Drawing.Point(12, 22); - this.labelDescription.Name = "labelDescription"; - this.labelDescription.Size = new System.Drawing.Size(81, 13); - this.labelDescription.TabIndex = 0; - this.labelDescription.Text = "Set video offset"; - // - // checkBoxFromCurrentPosition - // - this.checkBoxFromCurrentPosition.AutoSize = true; - this.checkBoxFromCurrentPosition.Location = new System.Drawing.Point(15, 71); - this.checkBoxFromCurrentPosition.Name = "checkBoxFromCurrentPosition"; - this.checkBoxFromCurrentPosition.Size = new System.Drawing.Size(153, 17); - this.checkBoxFromCurrentPosition.TabIndex = 2; - this.checkBoxFromCurrentPosition.Text = "From current video position"; - this.checkBoxFromCurrentPosition.UseVisualStyleBackColor = true; - // - // timeUpDownVideoPosition - // - this.timeUpDownVideoPosition.AutoSize = true; - this.timeUpDownVideoPosition.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.timeUpDownVideoPosition.Font = new System.Drawing.Font("Segoe UI", 9F); - this.timeUpDownVideoPosition.Location = new System.Drawing.Point(13, 39); - this.timeUpDownVideoPosition.Margin = new System.Windows.Forms.Padding(4); - this.timeUpDownVideoPosition.Name = "timeUpDownVideoPosition"; - this.timeUpDownVideoPosition.Size = new System.Drawing.Size(96, 27); - this.timeUpDownVideoPosition.TabIndex = 1; - timeCode1.Hours = 0; - timeCode1.Milliseconds = 0; - timeCode1.Minutes = 0; - timeCode1.Seconds = 0; - timeCode1.TimeSpan = System.TimeSpan.Parse("00:00:00"); - timeCode1.TotalMilliseconds = 0D; - timeCode1.TotalSeconds = 0D; - this.timeUpDownVideoPosition.TimeCode = timeCode1; - this.timeUpDownVideoPosition.UseVideoOffset = false; - // - // buttonReset - // - this.buttonReset.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonReset.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonReset.Location = new System.Drawing.Point(275, 129); - this.buttonReset.Name = "buttonReset"; - this.buttonReset.Size = new System.Drawing.Size(105, 23); - this.buttonReset.TabIndex = 4; - this.buttonReset.Text = "Reset"; - this.buttonReset.UseVisualStyleBackColor = true; - this.buttonReset.Click += new System.EventHandler(this.buttonReset_Click); - // - // checkBoxKeepTimeCodes - // - this.checkBoxKeepTimeCodes.AutoSize = true; - this.checkBoxKeepTimeCodes.Location = new System.Drawing.Point(15, 94); - this.checkBoxKeepTimeCodes.Name = "checkBoxKeepTimeCodes"; - this.checkBoxKeepTimeCodes.Size = new System.Drawing.Size(261, 17); - this.checkBoxKeepTimeCodes.TabIndex = 6; - this.checkBoxKeepTimeCodes.Text = "Keep existing time codes (do not add video offset)"; - this.checkBoxKeepTimeCodes.UseVisualStyleBackColor = true; - // - // SetVideoOffset - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(473, 162); - this.Controls.Add(this.checkBoxKeepTimeCodes); - this.Controls.Add(this.buttonReset); - this.Controls.Add(this.checkBoxFromCurrentPosition); - this.Controls.Add(this.timeUpDownVideoPosition); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.labelDescription); - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "SetVideoOffset"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "SetVideoOffset"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.SetVideoOffset_FormClosing); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Label labelDescription; - private Controls.TimeUpDown timeUpDownVideoPosition; - private System.Windows.Forms.CheckBox checkBoxFromCurrentPosition; - private System.Windows.Forms.Button buttonReset; - private System.Windows.Forms.CheckBox checkBoxKeepTimeCodes; - } +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class SetVideoOffset + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + TimeCode timeCode1 = new TimeCode(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.labelDescription = new System.Windows.Forms.Label(); + this.checkBoxFromCurrentPosition = new System.Windows.Forms.CheckBox(); + this.timeUpDownVideoPosition = new Nikse.SubtitleEdit.Controls.TimeUpDown(); + this.buttonReset = new System.Windows.Forms.Button(); + this.checkBoxKeepTimeCodes = new System.Windows.Forms.CheckBox(); + this.SuspendLayout(); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(386, 129); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 5; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(194, 129); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 3; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // labelDescription + // + this.labelDescription.AutoSize = true; + this.labelDescription.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.labelDescription.Location = new System.Drawing.Point(12, 22); + this.labelDescription.Name = "labelDescription"; + this.labelDescription.Size = new System.Drawing.Size(81, 13); + this.labelDescription.TabIndex = 0; + this.labelDescription.Text = "Set video offset"; + // + // checkBoxFromCurrentPosition + // + this.checkBoxFromCurrentPosition.AutoSize = true; + this.checkBoxFromCurrentPosition.Location = new System.Drawing.Point(15, 71); + this.checkBoxFromCurrentPosition.Name = "checkBoxFromCurrentPosition"; + this.checkBoxFromCurrentPosition.Size = new System.Drawing.Size(153, 17); + this.checkBoxFromCurrentPosition.TabIndex = 2; + this.checkBoxFromCurrentPosition.Text = "From current video position"; + this.checkBoxFromCurrentPosition.UseVisualStyleBackColor = true; + // + // timeUpDownVideoPosition + // + this.timeUpDownVideoPosition.AutoSize = true; + this.timeUpDownVideoPosition.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.timeUpDownVideoPosition.Font = new System.Drawing.Font("Segoe UI", 9F); + this.timeUpDownVideoPosition.Location = new System.Drawing.Point(13, 39); + this.timeUpDownVideoPosition.Margin = new System.Windows.Forms.Padding(4); + this.timeUpDownVideoPosition.Name = "timeUpDownVideoPosition"; + this.timeUpDownVideoPosition.Size = new System.Drawing.Size(96, 27); + this.timeUpDownVideoPosition.TabIndex = 1; + timeCode1.Hours = 0; + timeCode1.Milliseconds = 0; + timeCode1.Minutes = 0; + timeCode1.Seconds = 0; + timeCode1.TimeSpan = System.TimeSpan.Parse("00:00:00"); + timeCode1.TotalMilliseconds = 0D; + timeCode1.TotalSeconds = 0D; + this.timeUpDownVideoPosition.TimeCode = timeCode1; + this.timeUpDownVideoPosition.UseVideoOffset = false; + // + // buttonReset + // + this.buttonReset.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonReset.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonReset.Location = new System.Drawing.Point(275, 129); + this.buttonReset.Name = "buttonReset"; + this.buttonReset.Size = new System.Drawing.Size(105, 23); + this.buttonReset.TabIndex = 4; + this.buttonReset.Text = "Reset"; + this.buttonReset.UseVisualStyleBackColor = true; + this.buttonReset.Click += new System.EventHandler(this.buttonReset_Click); + // + // checkBoxKeepTimeCodes + // + this.checkBoxKeepTimeCodes.AutoSize = true; + this.checkBoxKeepTimeCodes.Location = new System.Drawing.Point(15, 94); + this.checkBoxKeepTimeCodes.Name = "checkBoxKeepTimeCodes"; + this.checkBoxKeepTimeCodes.Size = new System.Drawing.Size(261, 17); + this.checkBoxKeepTimeCodes.TabIndex = 6; + this.checkBoxKeepTimeCodes.Text = "Keep existing time codes (do not add video offset)"; + this.checkBoxKeepTimeCodes.UseVisualStyleBackColor = true; + // + // SetVideoOffset + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(473, 162); + this.Controls.Add(this.checkBoxKeepTimeCodes); + this.Controls.Add(this.buttonReset); + this.Controls.Add(this.checkBoxFromCurrentPosition); + this.Controls.Add(this.timeUpDownVideoPosition); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.labelDescription); + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "SetVideoOffset"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "SetVideoOffset"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.SetVideoOffset_FormClosing); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Label labelDescription; + private Controls.TimeUpDown timeUpDownVideoPosition; + private System.Windows.Forms.CheckBox checkBoxFromCurrentPosition; + private System.Windows.Forms.Button buttonReset; + private System.Windows.Forms.CheckBox checkBoxKeepTimeCodes; + } } \ No newline at end of file diff --git a/src/Forms/SetVideoOffset.cs b/src/ui/Forms/SetVideoOffset.cs similarity index 97% rename from src/Forms/SetVideoOffset.cs rename to src/ui/Forms/SetVideoOffset.cs index 18d487de4..ec747adc6 100644 --- a/src/Forms/SetVideoOffset.cs +++ b/src/ui/Forms/SetVideoOffset.cs @@ -1,70 +1,70 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class SetVideoOffset : PositionAndSizeForm - { - public bool FromCurrentVideoPosition { get; set; } - public bool DoNotaddVideoOffsetToTimeCodes { get; set; } - public bool Reset { get; set; } - - private readonly TimeCode _videoOffset; - - public TimeCode VideoOffset - { - get => _videoOffset; - set - { - _videoOffset.TotalMilliseconds = value.TotalMilliseconds; - timeUpDownVideoPosition.SetTotalMilliseconds(value.TotalMilliseconds); - } - } - - public SetVideoOffset() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - _videoOffset = new TimeCode(); - checkBoxKeepTimeCodes.Checked = Configuration.Settings.Tools.VideoOffsetKeepTimeCodes; - Text = Configuration.Settings.Language.SetVideoOffset.Title; - labelDescription.Text = Configuration.Settings.Language.SetVideoOffset.Description; - checkBoxFromCurrentPosition.Text = Configuration.Settings.Language.SetVideoOffset.RelativeToCurrentVideoPosition; - checkBoxKeepTimeCodes.Text = Configuration.Settings.Language.SetVideoOffset.KeepTimeCodes; - buttonReset.Text = Configuration.Settings.Language.SetVideoOffset.Reset; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - UiUtil.FixLargeFonts(this, buttonOK); - } - - private void buttonOK_Click(object sender, EventArgs e) - { - VideoOffset = timeUpDownVideoPosition.TimeCode; - FromCurrentVideoPosition = checkBoxFromCurrentPosition.Checked; - DoNotaddVideoOffsetToTimeCodes = checkBoxKeepTimeCodes.Checked; - DialogResult = DialogResult.OK; - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private void buttonReset_Click(object sender, EventArgs e) - { - VideoOffset = new TimeCode(); - DoNotaddVideoOffsetToTimeCodes = checkBoxKeepTimeCodes.Checked; - Reset = true; - DialogResult = DialogResult.OK; - } - - private void SetVideoOffset_FormClosing(object sender, FormClosingEventArgs e) - { - Configuration.Settings.Tools.VideoOffsetKeepTimeCodes = checkBoxKeepTimeCodes.Checked; - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class SetVideoOffset : PositionAndSizeForm + { + public bool FromCurrentVideoPosition { get; set; } + public bool DoNotaddVideoOffsetToTimeCodes { get; set; } + public bool Reset { get; set; } + + private readonly TimeCode _videoOffset; + + public TimeCode VideoOffset + { + get => _videoOffset; + set + { + _videoOffset.TotalMilliseconds = value.TotalMilliseconds; + timeUpDownVideoPosition.SetTotalMilliseconds(value.TotalMilliseconds); + } + } + + public SetVideoOffset() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + _videoOffset = new TimeCode(); + checkBoxKeepTimeCodes.Checked = Configuration.Settings.Tools.VideoOffsetKeepTimeCodes; + Text = Configuration.Settings.Language.SetVideoOffset.Title; + labelDescription.Text = Configuration.Settings.Language.SetVideoOffset.Description; + checkBoxFromCurrentPosition.Text = Configuration.Settings.Language.SetVideoOffset.RelativeToCurrentVideoPosition; + checkBoxKeepTimeCodes.Text = Configuration.Settings.Language.SetVideoOffset.KeepTimeCodes; + buttonReset.Text = Configuration.Settings.Language.SetVideoOffset.Reset; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + UiUtil.FixLargeFonts(this, buttonOK); + } + + private void buttonOK_Click(object sender, EventArgs e) + { + VideoOffset = timeUpDownVideoPosition.TimeCode; + FromCurrentVideoPosition = checkBoxFromCurrentPosition.Checked; + DoNotaddVideoOffsetToTimeCodes = checkBoxKeepTimeCodes.Checked; + DialogResult = DialogResult.OK; + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void buttonReset_Click(object sender, EventArgs e) + { + VideoOffset = new TimeCode(); + DoNotaddVideoOffsetToTimeCodes = checkBoxKeepTimeCodes.Checked; + Reset = true; + DialogResult = DialogResult.OK; + } + + private void SetVideoOffset_FormClosing(object sender, FormClosingEventArgs e) + { + Configuration.Settings.Tools.VideoOffsetKeepTimeCodes = checkBoxKeepTimeCodes.Checked; + } + } +} diff --git a/src/ui/Forms/SetVideoOffset.resx b/src/ui/Forms/SetVideoOffset.resx new file mode 100644 index 000000000..1af7de150 --- /dev/null +++ b/src/ui/Forms/SetVideoOffset.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/src/Forms/Settings.Designer.cs b/src/ui/Forms/Settings.Designer.cs similarity index 98% rename from src/Forms/Settings.Designer.cs rename to src/ui/Forms/Settings.Designer.cs index 475355fe9..c6a76972d 100644 --- a/src/Forms/Settings.Designer.cs +++ b/src/ui/Forms/Settings.Designer.cs @@ -1,5283 +1,5283 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class Settings - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.buttonOK = new System.Windows.Forms.Button(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.tabControlSettings = new System.Windows.Forms.TabControl(); - this.tabPageGeneral = new System.Windows.Forms.TabPage(); - this.groupBoxMiscellaneous = new System.Windows.Forms.GroupBox(); - this.labelSplitBehavior = new System.Windows.Forms.Label(); - this.comboBoxSplitBehavior = new System.Windows.Forms.ComboBox(); - this.checkBoxAutoSave = new System.Windows.Forms.CheckBox(); - this.comboBoxSaveAsFileNameFrom = new System.Windows.Forms.ComboBox(); - this.labelSaveAsFileNameFrom = new System.Windows.Forms.Label(); - this.groupBoxGeneralRules = new System.Windows.Forms.GroupBox(); - this.buttonGapChoose = new System.Windows.Forms.Button(); - this.comboBoxContinuationStyle = new System.Windows.Forms.ComboBox(); - this.labelContinuationStyle = new System.Windows.Forms.Label(); - this.labelDialogStyle = new System.Windows.Forms.Label(); - this.comboBoxDialogStyle = new System.Windows.Forms.ComboBox(); - this.checkBoxCpsIncludeWhiteSpace = new System.Windows.Forms.CheckBox(); - this.buttonEditProfile = new System.Windows.Forms.Button(); - this.comboBoxRulesProfileName = new System.Windows.Forms.ComboBox(); - this.labelRulesProfileName = new System.Windows.Forms.Label(); - this.labelOptimalCharsPerSecond = new System.Windows.Forms.Label(); - this.numericUpDownOptimalCharsSec = new System.Windows.Forms.NumericUpDown(); - this.labelSubMaxLen = new System.Windows.Forms.Label(); - this.numericUpDownMaxWordsMin = new System.Windows.Forms.NumericUpDown(); - this.labelMergeShortLines = new System.Windows.Forms.Label(); - this.labelMaxWordsPerMin = new System.Windows.Forms.Label(); - this.labelMinDuration = new System.Windows.Forms.Label(); - this.numericUpDownMaxNumberOfLines = new System.Windows.Forms.NumericUpDown(); - this.labelMaxDuration = new System.Windows.Forms.Label(); - this.labelMaxLines = new System.Windows.Forms.Label(); - this.numericUpDownDurationMin = new System.Windows.Forms.NumericUpDown(); - this.numericUpDownDurationMax = new System.Windows.Forms.NumericUpDown(); - this.comboBoxMergeShortLineLength = new System.Windows.Forms.ComboBox(); - this.labelMaxCharsPerSecond = new System.Windows.Forms.Label(); - this.numericUpDownMinGapMs = new System.Windows.Forms.NumericUpDown(); - this.numericUpDownMaxCharsSec = new System.Windows.Forms.NumericUpDown(); - this.labelMinGapMs = new System.Windows.Forms.Label(); - this.numericUpDownSubtitleLineMaximumLength = new System.Windows.Forms.NumericUpDown(); - this.comboBoxAutoBackupDeleteAfter = new System.Windows.Forms.ComboBox(); - this.labelAutoBackupDeleteAfter = new System.Windows.Forms.Label(); - this.checkBoxCheckForUpdates = new System.Windows.Forms.CheckBox(); - this.labelSpellChecker = new System.Windows.Forms.Label(); - this.comboBoxTimeCodeMode = new System.Windows.Forms.ComboBox(); - this.labelTimeCodeMode = new System.Windows.Forms.Label(); - this.comboBoxEncoding = new System.Windows.Forms.ComboBox(); - this.checkBoxAutoDetectAnsiEncoding = new System.Windows.Forms.CheckBox(); - this.textBoxShowLineBreaksAs = new System.Windows.Forms.TextBox(); - this.checkBoxAutoWrapWhileTyping = new System.Windows.Forms.CheckBox(); - this.checkBoxPromptDeleteLines = new System.Windows.Forms.CheckBox(); - this.checkBoxAllowEditOfOriginalSubtitle = new System.Windows.Forms.CheckBox(); - this.comboBoxSpellChecker = new System.Windows.Forms.ComboBox(); - this.comboBoxAutoBackup = new System.Windows.Forms.ComboBox(); - this.labelAutoBackup = new System.Windows.Forms.Label(); - this.checkBoxRememberSelectedLine = new System.Windows.Forms.CheckBox(); - this.checkBoxRemoveBlankLinesWhenOpening = new System.Windows.Forms.CheckBox(); - this.labelAutoDetectAnsiEncoding = new System.Windows.Forms.Label(); - this.comboBoxListViewDoubleClickEvent = new System.Windows.Forms.ComboBox(); - this.labelListViewDoubleClickEvent = new System.Windows.Forms.Label(); - this.labelShowLineBreaksAs = new System.Windows.Forms.Label(); - this.checkBoxRememberWindowPosition = new System.Windows.Forms.CheckBox(); - this.checkBoxStartInSourceView = new System.Windows.Forms.CheckBox(); - this.checkBoxReopenLastOpened = new System.Windows.Forms.CheckBox(); - this.checkBoxRememberRecentFiles = new System.Windows.Forms.CheckBox(); - this.labelDefaultFileEncoding = new System.Windows.Forms.Label(); - this.comboBoxFrameRate = new System.Windows.Forms.ComboBox(); - this.labelDefaultFrameRate = new System.Windows.Forms.Label(); - this.tabPageShortcuts = new System.Windows.Forms.TabPage(); - this.groupBoxShortcuts = new System.Windows.Forms.GroupBox(); - this.buttonShortcutsClear = new System.Windows.Forms.Button(); - this.labelShortcutsSearch = new System.Windows.Forms.Label(); - this.textBoxShortcutSearch = new System.Windows.Forms.TextBox(); - this.buttonClearShortcut = new System.Windows.Forms.Button(); - this.comboBoxShortcutKey = new System.Windows.Forms.ComboBox(); - this.labelShortcutKey = new System.Windows.Forms.Label(); - this.checkBoxShortcutsShift = new System.Windows.Forms.CheckBox(); - this.checkBoxShortcutsAlt = new System.Windows.Forms.CheckBox(); - this.checkBoxShortcutsControl = new System.Windows.Forms.CheckBox(); - this.buttonUpdateShortcut = new System.Windows.Forms.Button(); - this.treeViewShortcuts = new System.Windows.Forms.TreeView(); - this.contextMenuStripShortcuts = new System.Windows.Forms.ContextMenuStrip(this.components); - this.toolStripMenuItemShortcutsCollapse = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); - this.importShortcutsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.exportShortcutsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.labelShortcut = new System.Windows.Forms.Label(); - this.tabPageSyntaxColoring = new System.Windows.Forms.TabPage(); - this.groupBoxListViewSyntaxColoring = new System.Windows.Forms.GroupBox(); - this.buttonLineWidthSettings = new System.Windows.Forms.Button(); - this.checkBoxSyntaxColorTextTooWide = new System.Windows.Forms.CheckBox(); - this.checkBoxSyntaxColorGapTooSmall = new System.Windows.Forms.CheckBox(); - this.checkBoxSyntaxColorTextMoreThanTwoLines = new System.Windows.Forms.CheckBox(); - this.checkBoxSyntaxOverlap = new System.Windows.Forms.CheckBox(); - this.checkBoxSyntaxColorDurationTooSmall = new System.Windows.Forms.CheckBox(); - this.buttonListViewSyntaxColorError = new System.Windows.Forms.Button(); - this.checkBoxSyntaxColorTextTooLong = new System.Windows.Forms.CheckBox(); - this.checkBoxSyntaxColorDurationTooLarge = new System.Windows.Forms.CheckBox(); - this.panelListViewSyntaxColorError = new System.Windows.Forms.Panel(); - this.tabPageVideoPlayer = new System.Windows.Forms.TabPage(); - this.groupBoxMainWindowVideoControls = new System.Windows.Forms.GroupBox(); - this.labelCustomSearch5 = new System.Windows.Forms.Label(); - this.textBoxCustomSearchUrl5 = new System.Windows.Forms.TextBox(); - this.comboBoxCustomSearch5 = new System.Windows.Forms.ComboBox(); - this.labelCustomSearch4 = new System.Windows.Forms.Label(); - this.textBoxCustomSearchUrl4 = new System.Windows.Forms.TextBox(); - this.comboBoxCustomSearch4 = new System.Windows.Forms.ComboBox(); - this.labelCustomSearch3 = new System.Windows.Forms.Label(); - this.textBoxCustomSearchUrl3 = new System.Windows.Forms.TextBox(); - this.comboBoxCustomSearch3 = new System.Windows.Forms.ComboBox(); - this.labelCustomSearch2 = new System.Windows.Forms.Label(); - this.textBoxCustomSearchUrl2 = new System.Windows.Forms.TextBox(); - this.comboBoxCustomSearch2 = new System.Windows.Forms.ComboBox(); - this.labelCustomSearch1 = new System.Windows.Forms.Label(); - this.textBoxCustomSearchUrl1 = new System.Windows.Forms.TextBox(); - this.labelCustomSearch = new System.Windows.Forms.Label(); - this.comboBoxCustomSearch1 = new System.Windows.Forms.ComboBox(); - this.groupBoxVideoPlayerDefault = new System.Windows.Forms.GroupBox(); - this.checkBoxAllowVolumeBoost = new System.Windows.Forms.CheckBox(); - this.checkBoxVideoAutoOpen = new System.Windows.Forms.CheckBox(); - this.checkBoxVideoPlayerPreviewFontBold = new System.Windows.Forms.CheckBox(); - this.checkBoxVideoPlayerShowFullscreenButton = new System.Windows.Forms.CheckBox(); - this.checkBoxVideoPlayerShowMuteButton = new System.Windows.Forms.CheckBox(); - this.labelVideoPlayerPreviewFontSize = new System.Windows.Forms.Label(); - this.comboBoxlVideoPlayerPreviewFontSize = new System.Windows.Forms.ComboBox(); - this.checkBoxVideoPlayerShowStopButton = new System.Windows.Forms.CheckBox(); - this.groupBoxVideoEngine = new System.Windows.Forms.GroupBox(); - this.checkBoxMpvHandlesPreviewText = new System.Windows.Forms.CheckBox(); - this.labelMpvSettings = new System.Windows.Forms.Label(); - this.buttonMpvSettings = new System.Windows.Forms.Button(); - this.labelPlatform = new System.Windows.Forms.Label(); - this.buttonVlcPathBrowse = new System.Windows.Forms.Button(); - this.textBoxVlcPath = new System.Windows.Forms.TextBox(); - this.labelVlcPath = new System.Windows.Forms.Label(); - this.labelVideoPlayerVLC = new System.Windows.Forms.Label(); - this.radioButtonVideoPlayerVLC = new System.Windows.Forms.RadioButton(); - this.labelVideoPlayerMPlayer = new System.Windows.Forms.Label(); - this.labelDirectShowDescription = new System.Windows.Forms.Label(); - this.labelMpcHcDescription = new System.Windows.Forms.Label(); - this.radioButtonVideoPlayerMPV = new System.Windows.Forms.RadioButton(); - this.radioButtonVideoPlayerDirectShow = new System.Windows.Forms.RadioButton(); - this.radioButtonVideoPlayerMpcHc = new System.Windows.Forms.RadioButton(); - this.tabPageWaveform = new System.Windows.Forms.TabPage(); - this.groupBoxFfmpeg = new System.Windows.Forms.GroupBox(); - this.buttonDownloadFfmpeg = new System.Windows.Forms.Button(); - this.buttonBrowseToFFmpeg = new System.Windows.Forms.Button(); - this.textBoxFFmpegPath = new System.Windows.Forms.TextBox(); - this.labelFFmpegPath = new System.Windows.Forms.Label(); - this.checkBoxUseFFmpeg = new System.Windows.Forms.CheckBox(); - this.groupBoxSpectrogram = new System.Windows.Forms.GroupBox(); - this.labelSpectrogramAppearance = new System.Windows.Forms.Label(); - this.comboBoxSpectrogramAppearance = new System.Windows.Forms.ComboBox(); - this.checkBoxGenerateSpectrogram = new System.Windows.Forms.CheckBox(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.buttonWaveformsFolderEmpty = new System.Windows.Forms.Button(); - this.labelWaveformsFolderInfo = new System.Windows.Forms.Label(); - this.groupBoxWaveformAppearence = new System.Windows.Forms.GroupBox(); - this.panelWaveformCursorColor = new System.Windows.Forms.Panel(); - this.buttonWaveformCursorColor = new System.Windows.Forms.Button(); - this.checkBoxWaveformSnapToSceneChanges = new System.Windows.Forms.CheckBox(); - this.checkBoxWaveformSingleClickSelect = new System.Windows.Forms.CheckBox(); - this.checkBoxWaveformShowWpm = new System.Windows.Forms.CheckBox(); - this.checkBoxWaveformShowCps = new System.Windows.Forms.CheckBox(); - this.checkBoxWaveformSetVideoPosMoveStartEnd = new System.Windows.Forms.CheckBox(); - this.labelWaveformTextSize = new System.Windows.Forms.Label(); - this.checkBoxWaveformTextBold = new System.Windows.Forms.CheckBox(); - this.comboBoxWaveformTextSize = new System.Windows.Forms.ComboBox(); - this.checkBoxListViewMouseEnterFocus = new System.Windows.Forms.CheckBox(); - this.checkBoxWaveformHoverFocus = new System.Windows.Forms.CheckBox(); - this.labelWaveformBorderHitMs2 = new System.Windows.Forms.Label(); - this.numericUpDownWaveformBorderHitMs = new System.Windows.Forms.NumericUpDown(); - this.labelWaveformBorderHitMs1 = new System.Windows.Forms.Label(); - this.checkBoxAllowOverlap = new System.Windows.Forms.CheckBox(); - this.checkBoxReverseMouseWheelScrollDirection = new System.Windows.Forms.CheckBox(); - this.panelWaveformTextColor = new System.Windows.Forms.Panel(); - this.buttonWaveformTextColor = new System.Windows.Forms.Button(); - this.panelWaveformGridColor = new System.Windows.Forms.Panel(); - this.buttonWaveformGridColor = new System.Windows.Forms.Button(); - this.panelWaveformBackgroundColor = new System.Windows.Forms.Panel(); - this.buttonWaveformBackgroundColor = new System.Windows.Forms.Button(); - this.panelWaveformColor = new System.Windows.Forms.Panel(); - this.buttonWaveformColor = new System.Windows.Forms.Button(); - this.panelWaveformSelectedColor = new System.Windows.Forms.Panel(); - this.buttonWaveformSelectedColor = new System.Windows.Forms.Button(); - this.checkBoxWaveformShowGrid = new System.Windows.Forms.CheckBox(); - this.tabPageTools = new System.Windows.Forms.TabPage(); - this.groupBoxGoogleTranslate = new System.Windows.Forms.GroupBox(); - this.labelGoogleTranslateApiKey = new System.Windows.Forms.Label(); - this.textBoxGoogleTransleApiKey = new System.Windows.Forms.TextBox(); - this.linkLabelGoogleTranslateSignUp = new System.Windows.Forms.LinkLabel(); - this.label3 = new System.Windows.Forms.Label(); - this.groupBoxBing = new System.Windows.Forms.GroupBox(); - this.comboBoxBoxBingTokenEndpoint = new System.Windows.Forms.ComboBox(); - this.labelBingTokenEndpoint = new System.Windows.Forms.Label(); - this.labelBingApiKey = new System.Windows.Forms.Label(); - this.textBoxBingClientSecret = new System.Windows.Forms.TextBox(); - this.linkLabelBingSubscribe = new System.Windows.Forms.LinkLabel(); - this.label1 = new System.Windows.Forms.Label(); - this.groupBoxToolsAutoBr = new System.Windows.Forms.GroupBox(); - this.labelToolsBreakBottomHeavyPercent = new System.Windows.Forms.Label(); - this.numericUpDownToolsBreakPreferBottomHeavy = new System.Windows.Forms.NumericUpDown(); - this.checkBoxToolsBreakPreferBottomHeavy = new System.Windows.Forms.CheckBox(); - this.checkBoxToolsBreakByPixelWidth = new System.Windows.Forms.CheckBox(); - this.checkBoxToolsBreakEarlyLineEnding = new System.Windows.Forms.CheckBox(); - this.checkBoxToolsBreakEarlyComma = new System.Windows.Forms.CheckBox(); - this.checkBoxToolsBreakEarlyDash = new System.Windows.Forms.CheckBox(); - this.labelUserBingApiId = new System.Windows.Forms.Label(); - this.buttonEditDoNotBreakAfterList = new System.Windows.Forms.Button(); - this.checkBoxUseDoNotBreakAfterList = new System.Windows.Forms.CheckBox(); - this.groupBoxSpellCheck = new System.Windows.Forms.GroupBox(); - this.checkBoxSpellCheckAutoChangeNamesViaSuggestions = new System.Windows.Forms.CheckBox(); - this.checkBoxUseAlwaysToFile = new System.Windows.Forms.CheckBox(); - this.checkBoxTreatINQuoteAsING = new System.Windows.Forms.CheckBox(); - this.checkBoxSpellCheckOneLetterWords = new System.Windows.Forms.CheckBox(); - this.checkBoxSpellCheckAutoChangeNames = new System.Windows.Forms.CheckBox(); - this.groupBoxFixCommonErrors = new System.Windows.Forms.GroupBox(); - this.buttonFixContinuationStyleSettings = new System.Windows.Forms.Button(); - this.checkBoxFceSkipStep1 = new System.Windows.Forms.CheckBox(); - this.checkBoxFixShortDisplayTimesAllowMoveStartTime = new System.Windows.Forms.CheckBox(); - this.checkBoxFixCommonOcrErrorsUsingHardcodedRules = new System.Windows.Forms.CheckBox(); - this.comboBoxToolsMusicSymbol = new System.Windows.Forms.ComboBox(); - this.textBoxMusicSymbolsToReplace = new System.Windows.Forms.TextBox(); - this.labelToolsMusicSymbolsToReplace = new System.Windows.Forms.Label(); - this.labelToolsMusicSymbol = new System.Windows.Forms.Label(); - this.groupBoxToolsVisualSync = new System.Windows.Forms.GroupBox(); - this.labelToolsEndScene = new System.Windows.Forms.Label(); - this.comboBoxToolsEndSceneIndex = new System.Windows.Forms.ComboBox(); - this.labelToolsStartScene = new System.Windows.Forms.Label(); - this.comboBoxToolsStartSceneIndex = new System.Windows.Forms.ComboBox(); - this.comboBoxToolsVerifySeconds = new System.Windows.Forms.ComboBox(); - this.labelVerifyButton = new System.Windows.Forms.Label(); - this.tabPageWordLists = new System.Windows.Forms.TabPage(); - this.groupBoxWordLists = new System.Windows.Forms.GroupBox(); - this.linkLabelOpenDictionaryFolder = new System.Windows.Forms.LinkLabel(); - this.groupBoxOcrFixList = new System.Windows.Forms.GroupBox(); - this.textBoxOcrFixValue = new System.Windows.Forms.TextBox(); - this.buttonRemoveOcrFix = new System.Windows.Forms.Button(); - this.listBoxOcrFixList = new System.Windows.Forms.ListBox(); - this.textBoxOcrFixKey = new System.Windows.Forms.TextBox(); - this.buttonAddOcrFix = new System.Windows.Forms.Button(); - this.groupBoxUserWordList = new System.Windows.Forms.GroupBox(); - this.buttonRemoveUserWord = new System.Windows.Forms.Button(); - this.listBoxUserWordLists = new System.Windows.Forms.ListBox(); - this.textBoxUserWord = new System.Windows.Forms.TextBox(); - this.buttonAddUserWord = new System.Windows.Forms.Button(); - this.groupBoxWordListLocation = new System.Windows.Forms.GroupBox(); - this.checkBoxNamesOnline = new System.Windows.Forms.CheckBox(); - this.textBoxNamesOnline = new System.Windows.Forms.TextBox(); - this.groupBoxNamesIgonoreLists = new System.Windows.Forms.GroupBox(); - this.buttonRemoveNameEtc = new System.Windows.Forms.Button(); - this.listBoxNames = new System.Windows.Forms.ListBox(); - this.textBoxNameEtc = new System.Windows.Forms.TextBox(); - this.buttonAddNames = new System.Windows.Forms.Button(); - this.labelWordListLanguage = new System.Windows.Forms.Label(); - this.comboBoxWordListLanguage = new System.Windows.Forms.ComboBox(); - this.tabPageToolBar = new System.Windows.Forms.TabPage(); - this.groupBox2 = new System.Windows.Forms.GroupBox(); - this.checkBoxShowFrameRate = new System.Windows.Forms.CheckBox(); - this.groupBoxShowToolBarButtons = new System.Windows.Forms.GroupBox(); - this.labelTBNetflixQualityCheck = new System.Windows.Forms.Label(); - this.pictureBoxNetflixQualityCheck = new System.Windows.Forms.PictureBox(); - this.checkBoxNetflixQualityCheck = new System.Windows.Forms.CheckBox(); - this.labelTBRemoveTextForHi = new System.Windows.Forms.Label(); - this.pictureBoxTBRemoveTextForHi = new System.Windows.Forms.PictureBox(); - this.checkBoxTBRemoveTextForHi = new System.Windows.Forms.CheckBox(); - this.labelTBFixCommonErrors = new System.Windows.Forms.Label(); - this.pictureBoxTBFixCommonErrors = new System.Windows.Forms.PictureBox(); - this.checkBoxTBFixCommonErrors = new System.Windows.Forms.CheckBox(); - this.labelTBHelp = new System.Windows.Forms.Label(); - this.pictureBoxHelp = new System.Windows.Forms.PictureBox(); - this.checkBoxHelp = new System.Windows.Forms.CheckBox(); - this.labelTBSettings = new System.Windows.Forms.Label(); - this.pictureBoxSettings = new System.Windows.Forms.PictureBox(); - this.checkBoxSettings = new System.Windows.Forms.CheckBox(); - this.labelTBSpellCheck = new System.Windows.Forms.Label(); - this.pictureBoxSpellCheck = new System.Windows.Forms.PictureBox(); - this.checkBoxSpellCheck = new System.Windows.Forms.CheckBox(); - this.labelTBVisualSync = new System.Windows.Forms.Label(); - this.pictureBoxVisualSync = new System.Windows.Forms.PictureBox(); - this.checkBoxVisualSync = new System.Windows.Forms.CheckBox(); - this.labelTBReplace = new System.Windows.Forms.Label(); - this.pictureBoxReplace = new System.Windows.Forms.PictureBox(); - this.checkBoxReplace = new System.Windows.Forms.CheckBox(); - this.labelTBFind = new System.Windows.Forms.Label(); - this.pictureBoxFind = new System.Windows.Forms.PictureBox(); - this.checkBoxToolbarFind = new System.Windows.Forms.CheckBox(); - this.labelTBSaveAs = new System.Windows.Forms.Label(); - this.pictureBoxSaveAs = new System.Windows.Forms.PictureBox(); - this.checkBoxToolbarSaveAs = new System.Windows.Forms.CheckBox(); - this.labelTBSave = new System.Windows.Forms.Label(); - this.pictureBoxSave = new System.Windows.Forms.PictureBox(); - this.checkBoxToolbarSave = new System.Windows.Forms.CheckBox(); - this.labelTBOpen = new System.Windows.Forms.Label(); - this.pictureBoxOpen = new System.Windows.Forms.PictureBox(); - this.checkBoxToolbarOpen = new System.Windows.Forms.CheckBox(); - this.labelTBNew = new System.Windows.Forms.Label(); - this.pictureBoxNew = new System.Windows.Forms.PictureBox(); - this.checkBoxToolbarNew = new System.Windows.Forms.CheckBox(); - this.tabPageFont = new System.Windows.Forms.TabPage(); - this.groupBoxFont = new System.Windows.Forms.GroupBox(); - this.labelFontNote = new System.Windows.Forms.Label(); - this.groupBoxFontTextBox = new System.Windows.Forms.GroupBox(); - this.panelTextBoxAssColor = new System.Windows.Forms.Panel(); - this.buttonTextBoxAssColor = new System.Windows.Forms.Button(); - this.panelTextBoxHtmlColor = new System.Windows.Forms.Panel(); - this.buttonTextBoxHtmlColor = new System.Windows.Forms.Button(); - this.checkBoxSubtitleTextBoxSyntaxColor = new System.Windows.Forms.CheckBox(); - this.labelSubtitleFontSize = new System.Windows.Forms.Label(); - this.comboBoxSubtitleFontSize = new System.Windows.Forms.ComboBox(); - this.checkBoxSubtitleFontBold = new System.Windows.Forms.CheckBox(); - this.checkBoxSubtitleCenter = new System.Windows.Forms.CheckBox(); - this.groupBoxFontListViews = new System.Windows.Forms.GroupBox(); - this.labelSubtitleListViewFontSize = new System.Windows.Forms.Label(); - this.comboBoxSubtitleListViewFontSize = new System.Windows.Forms.ComboBox(); - this.checkBoxSubtitleListViewFontBold = new System.Windows.Forms.CheckBox(); - this.groupBoxFontGeneral = new System.Windows.Forms.GroupBox(); - this.comboBoxSubtitleFont = new System.Windows.Forms.ComboBox(); - this.labelSubtitleFont = new System.Windows.Forms.Label(); - this.panelSubtitleFontColor = new System.Windows.Forms.Panel(); - this.labelSubtitleFontColor = new System.Windows.Forms.Label(); - this.panelSubtitleBackgroundColor = new System.Windows.Forms.Panel(); - this.labelSubtitleFontBackgroundColor = new System.Windows.Forms.Label(); - this.tabPageSsaStyle = new System.Windows.Forms.TabPage(); - this.groupBoxSsaStyle = new System.Windows.Forms.GroupBox(); - this.groupBoxSsaBorder = new System.Windows.Forms.GroupBox(); - this.numericUpDownSsaOutline = new System.Windows.Forms.NumericUpDown(); - this.labelSsaShadow = new System.Windows.Forms.Label(); - this.numericUpDownSsaShadow = new System.Windows.Forms.NumericUpDown(); - this.checkBoxSsaOpaqueBox = new System.Windows.Forms.CheckBox(); - this.labelSsaOutline = new System.Windows.Forms.Label(); - this.groupSsaBoxFont = new System.Windows.Forms.GroupBox(); - this.checkBoxSsaFontBold = new System.Windows.Forms.CheckBox(); - this.buttonSsaColor = new System.Windows.Forms.Button(); - this.panelPrimaryColor = new System.Windows.Forms.Panel(); - this.numericUpDownFontSize = new System.Windows.Forms.NumericUpDown(); - this.comboBoxFontName = new System.Windows.Forms.ComboBox(); - this.labelSsaFontSize = new System.Windows.Forms.Label(); - this.labelFontName = new System.Windows.Forms.Label(); - this.groupBoxMargins = new System.Windows.Forms.GroupBox(); - this.numericUpDownSsaMarginVertical = new System.Windows.Forms.NumericUpDown(); - this.numericUpDownSsaMarginRight = new System.Windows.Forms.NumericUpDown(); - this.numericUpDownSsaMarginLeft = new System.Windows.Forms.NumericUpDown(); - this.labelMarginVertical = new System.Windows.Forms.Label(); - this.labelMarginRight = new System.Windows.Forms.Label(); - this.labelMarginLeft = new System.Windows.Forms.Label(); - this.groupBoxPreview = new System.Windows.Forms.GroupBox(); - this.pictureBoxPreview = new System.Windows.Forms.PictureBox(); - this.tabPageNetwork = new System.Windows.Forms.TabPage(); - this.groupBoxNetworkSession = new System.Windows.Forms.GroupBox(); - this.buttonNetworkSessionNewMessageSound = new System.Windows.Forms.Button(); - this.textBoxNetworkSessionNewMessageSound = new System.Windows.Forms.TextBox(); - this.labelNetworkSessionNewMessageSound = new System.Windows.Forms.Label(); - this.groupBoxProxySettings = new System.Windows.Forms.GroupBox(); - this.groupBoxProxyAuthentication = new System.Windows.Forms.GroupBox(); - this.textBoxProxyDomain = new System.Windows.Forms.TextBox(); - this.labelProxyDomain = new System.Windows.Forms.Label(); - this.textBoxProxyUserName = new System.Windows.Forms.TextBox(); - this.labelProxyPassword = new System.Windows.Forms.Label(); - this.labelProxyUserName = new System.Windows.Forms.Label(); - this.textBoxProxyPassword = new System.Windows.Forms.TextBox(); - this.textBoxProxyAddress = new System.Windows.Forms.TextBox(); - this.labelProxyAddress = new System.Windows.Forms.Label(); - this.colorDialogSSAStyle = new System.Windows.Forms.ColorDialog(); - this.labelStatus = new System.Windows.Forms.Label(); - this.openFileDialogFFmpeg = new System.Windows.Forms.OpenFileDialog(); - this.buttonReset = new System.Windows.Forms.Button(); - this.toolTipContinuationPreview = new System.Windows.Forms.ToolTip(this.components); - this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog(); - this.tabControlSettings.SuspendLayout(); - this.tabPageGeneral.SuspendLayout(); - this.groupBoxMiscellaneous.SuspendLayout(); - this.groupBoxGeneralRules.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownOptimalCharsSec)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxWordsMin)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxNumberOfLines)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDurationMin)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDurationMax)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinGapMs)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxCharsSec)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSubtitleLineMaximumLength)).BeginInit(); - this.tabPageShortcuts.SuspendLayout(); - this.groupBoxShortcuts.SuspendLayout(); - this.contextMenuStripShortcuts.SuspendLayout(); - this.tabPageSyntaxColoring.SuspendLayout(); - this.groupBoxListViewSyntaxColoring.SuspendLayout(); - this.tabPageVideoPlayer.SuspendLayout(); - this.groupBoxMainWindowVideoControls.SuspendLayout(); - this.groupBoxVideoPlayerDefault.SuspendLayout(); - this.groupBoxVideoEngine.SuspendLayout(); - this.tabPageWaveform.SuspendLayout(); - this.groupBoxFfmpeg.SuspendLayout(); - this.groupBoxSpectrogram.SuspendLayout(); - this.groupBox1.SuspendLayout(); - this.groupBoxWaveformAppearence.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownWaveformBorderHitMs)).BeginInit(); - this.tabPageTools.SuspendLayout(); - this.groupBoxGoogleTranslate.SuspendLayout(); - this.groupBoxBing.SuspendLayout(); - this.groupBoxToolsAutoBr.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownToolsBreakPreferBottomHeavy)).BeginInit(); - this.groupBoxSpellCheck.SuspendLayout(); - this.groupBoxFixCommonErrors.SuspendLayout(); - this.groupBoxToolsVisualSync.SuspendLayout(); - this.tabPageWordLists.SuspendLayout(); - this.groupBoxWordLists.SuspendLayout(); - this.groupBoxOcrFixList.SuspendLayout(); - this.groupBoxUserWordList.SuspendLayout(); - this.groupBoxWordListLocation.SuspendLayout(); - this.groupBoxNamesIgonoreLists.SuspendLayout(); - this.tabPageToolBar.SuspendLayout(); - this.groupBox2.SuspendLayout(); - this.groupBoxShowToolBarButtons.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxNetflixQualityCheck)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxTBRemoveTextForHi)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxTBFixCommonErrors)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxHelp)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxSettings)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxSpellCheck)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxVisualSync)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxReplace)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxFind)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxSaveAs)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxSave)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxOpen)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxNew)).BeginInit(); - this.tabPageFont.SuspendLayout(); - this.groupBoxFont.SuspendLayout(); - this.groupBoxFontTextBox.SuspendLayout(); - this.groupBoxFontListViews.SuspendLayout(); - this.groupBoxFontGeneral.SuspendLayout(); - this.tabPageSsaStyle.SuspendLayout(); - this.groupBoxSsaStyle.SuspendLayout(); - this.groupBoxSsaBorder.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSsaOutline)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSsaShadow)).BeginInit(); - this.groupSsaBoxFont.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownFontSize)).BeginInit(); - this.groupBoxMargins.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSsaMarginVertical)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSsaMarginRight)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSsaMarginLeft)).BeginInit(); - this.groupBoxPreview.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxPreview)).BeginInit(); - this.tabPageNetwork.SuspendLayout(); - this.groupBoxNetworkSession.SuspendLayout(); - this.groupBoxProxySettings.SuspendLayout(); - this.groupBoxProxyAuthentication.SuspendLayout(); - this.SuspendLayout(); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; - this.buttonOK.Location = new System.Drawing.Point(506, 563); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 0; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.Location = new System.Drawing.Point(587, 563); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 1; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // tabControlSettings - // - this.tabControlSettings.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.tabControlSettings.Controls.Add(this.tabPageGeneral); - this.tabControlSettings.Controls.Add(this.tabPageShortcuts); - this.tabControlSettings.Controls.Add(this.tabPageSyntaxColoring); - this.tabControlSettings.Controls.Add(this.tabPageVideoPlayer); - this.tabControlSettings.Controls.Add(this.tabPageWaveform); - this.tabControlSettings.Controls.Add(this.tabPageTools); - this.tabControlSettings.Controls.Add(this.tabPageWordLists); - this.tabControlSettings.Controls.Add(this.tabPageToolBar); - this.tabControlSettings.Controls.Add(this.tabPageFont); - this.tabControlSettings.Controls.Add(this.tabPageSsaStyle); - this.tabControlSettings.Controls.Add(this.tabPageNetwork); - this.tabControlSettings.Location = new System.Drawing.Point(13, 13); - this.tabControlSettings.Name = "tabControlSettings"; - this.tabControlSettings.SelectedIndex = 0; - this.tabControlSettings.Size = new System.Drawing.Size(840, 546); - this.tabControlSettings.TabIndex = 2; - this.tabControlSettings.SelectedIndexChanged += new System.EventHandler(this.TabControlSettingsSelectedIndexChanged); - // - // tabPageGeneral - // - this.tabPageGeneral.Controls.Add(this.groupBoxMiscellaneous); - this.tabPageGeneral.Location = new System.Drawing.Point(4, 22); - this.tabPageGeneral.Name = "tabPageGeneral"; - this.tabPageGeneral.Padding = new System.Windows.Forms.Padding(3); - this.tabPageGeneral.Size = new System.Drawing.Size(832, 520); - this.tabPageGeneral.TabIndex = 0; - this.tabPageGeneral.Text = "General"; - this.tabPageGeneral.UseVisualStyleBackColor = true; - // - // groupBoxMiscellaneous - // - this.groupBoxMiscellaneous.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxMiscellaneous.Controls.Add(this.labelSplitBehavior); - this.groupBoxMiscellaneous.Controls.Add(this.comboBoxSplitBehavior); - this.groupBoxMiscellaneous.Controls.Add(this.checkBoxAutoSave); - this.groupBoxMiscellaneous.Controls.Add(this.comboBoxSaveAsFileNameFrom); - this.groupBoxMiscellaneous.Controls.Add(this.labelSaveAsFileNameFrom); - this.groupBoxMiscellaneous.Controls.Add(this.groupBoxGeneralRules); - this.groupBoxMiscellaneous.Controls.Add(this.comboBoxAutoBackupDeleteAfter); - this.groupBoxMiscellaneous.Controls.Add(this.labelAutoBackupDeleteAfter); - this.groupBoxMiscellaneous.Controls.Add(this.checkBoxCheckForUpdates); - this.groupBoxMiscellaneous.Controls.Add(this.labelSpellChecker); - this.groupBoxMiscellaneous.Controls.Add(this.comboBoxTimeCodeMode); - this.groupBoxMiscellaneous.Controls.Add(this.labelTimeCodeMode); - this.groupBoxMiscellaneous.Controls.Add(this.comboBoxEncoding); - this.groupBoxMiscellaneous.Controls.Add(this.checkBoxAutoDetectAnsiEncoding); - this.groupBoxMiscellaneous.Controls.Add(this.textBoxShowLineBreaksAs); - this.groupBoxMiscellaneous.Controls.Add(this.checkBoxAutoWrapWhileTyping); - this.groupBoxMiscellaneous.Controls.Add(this.checkBoxPromptDeleteLines); - this.groupBoxMiscellaneous.Controls.Add(this.checkBoxAllowEditOfOriginalSubtitle); - this.groupBoxMiscellaneous.Controls.Add(this.comboBoxSpellChecker); - this.groupBoxMiscellaneous.Controls.Add(this.comboBoxAutoBackup); - this.groupBoxMiscellaneous.Controls.Add(this.labelAutoBackup); - this.groupBoxMiscellaneous.Controls.Add(this.checkBoxRememberSelectedLine); - this.groupBoxMiscellaneous.Controls.Add(this.checkBoxRemoveBlankLinesWhenOpening); - this.groupBoxMiscellaneous.Controls.Add(this.labelAutoDetectAnsiEncoding); - this.groupBoxMiscellaneous.Controls.Add(this.comboBoxListViewDoubleClickEvent); - this.groupBoxMiscellaneous.Controls.Add(this.labelListViewDoubleClickEvent); - this.groupBoxMiscellaneous.Controls.Add(this.labelShowLineBreaksAs); - this.groupBoxMiscellaneous.Controls.Add(this.checkBoxRememberWindowPosition); - this.groupBoxMiscellaneous.Controls.Add(this.checkBoxStartInSourceView); - this.groupBoxMiscellaneous.Controls.Add(this.checkBoxReopenLastOpened); - this.groupBoxMiscellaneous.Controls.Add(this.checkBoxRememberRecentFiles); - this.groupBoxMiscellaneous.Controls.Add(this.labelDefaultFileEncoding); - this.groupBoxMiscellaneous.Controls.Add(this.comboBoxFrameRate); - this.groupBoxMiscellaneous.Controls.Add(this.labelDefaultFrameRate); - this.groupBoxMiscellaneous.Location = new System.Drawing.Point(6, 6); - this.groupBoxMiscellaneous.Name = "groupBoxMiscellaneous"; - this.groupBoxMiscellaneous.Size = new System.Drawing.Size(819, 508); - this.groupBoxMiscellaneous.TabIndex = 0; - this.groupBoxMiscellaneous.TabStop = false; - this.groupBoxMiscellaneous.Text = "Miscellaneous"; - // - // labelSplitBehavior - // - this.labelSplitBehavior.AutoSize = true; - this.labelSplitBehavior.Location = new System.Drawing.Point(438, 291); - this.labelSplitBehavior.Name = "labelSplitBehavior"; - this.labelSplitBehavior.Size = new System.Drawing.Size(72, 13); - this.labelSplitBehavior.TabIndex = 20; - this.labelSplitBehavior.Text = "Split behavior"; - // - // comboBoxSplitBehavior - // - this.comboBoxSplitBehavior.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxSplitBehavior.FormattingEnabled = true; - this.comboBoxSplitBehavior.Location = new System.Drawing.Point(528, 288); - this.comboBoxSplitBehavior.Name = "comboBoxSplitBehavior"; - this.comboBoxSplitBehavior.Size = new System.Drawing.Size(207, 21); - this.comboBoxSplitBehavior.TabIndex = 21; - // - // checkBoxAutoSave - // - this.checkBoxAutoSave.AutoSize = true; - this.checkBoxAutoSave.Location = new System.Drawing.Point(441, 453); - this.checkBoxAutoSave.Name = "checkBoxAutoSave"; - this.checkBoxAutoSave.Size = new System.Drawing.Size(75, 17); - this.checkBoxAutoSave.TabIndex = 30; - this.checkBoxAutoSave.Text = "Auto save"; - this.checkBoxAutoSave.UseVisualStyleBackColor = true; - // - // comboBoxSaveAsFileNameFrom - // - this.comboBoxSaveAsFileNameFrom.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxSaveAsFileNameFrom.FormattingEnabled = true; - this.comboBoxSaveAsFileNameFrom.Location = new System.Drawing.Point(441, 386); - this.comboBoxSaveAsFileNameFrom.Name = "comboBoxSaveAsFileNameFrom"; - this.comboBoxSaveAsFileNameFrom.Size = new System.Drawing.Size(332, 21); - this.comboBoxSaveAsFileNameFrom.TabIndex = 25; - // - // labelSaveAsFileNameFrom - // - this.labelSaveAsFileNameFrom.AutoSize = true; - this.labelSaveAsFileNameFrom.Location = new System.Drawing.Point(438, 370); - this.labelSaveAsFileNameFrom.Name = "labelSaveAsFileNameFrom"; - this.labelSaveAsFileNameFrom.Size = new System.Drawing.Size(160, 13); - this.labelSaveAsFileNameFrom.TabIndex = 24; - this.labelSaveAsFileNameFrom.Text = "\"Save as...\" will take name from"; - // - // groupBoxGeneralRules - // - this.groupBoxGeneralRules.Controls.Add(this.buttonGapChoose); - this.groupBoxGeneralRules.Controls.Add(this.comboBoxContinuationStyle); - this.groupBoxGeneralRules.Controls.Add(this.labelContinuationStyle); - this.groupBoxGeneralRules.Controls.Add(this.labelDialogStyle); - this.groupBoxGeneralRules.Controls.Add(this.comboBoxDialogStyle); - this.groupBoxGeneralRules.Controls.Add(this.checkBoxCpsIncludeWhiteSpace); - this.groupBoxGeneralRules.Controls.Add(this.buttonEditProfile); - this.groupBoxGeneralRules.Controls.Add(this.comboBoxRulesProfileName); - this.groupBoxGeneralRules.Controls.Add(this.labelRulesProfileName); - this.groupBoxGeneralRules.Controls.Add(this.labelOptimalCharsPerSecond); - this.groupBoxGeneralRules.Controls.Add(this.numericUpDownOptimalCharsSec); - this.groupBoxGeneralRules.Controls.Add(this.labelSubMaxLen); - this.groupBoxGeneralRules.Controls.Add(this.numericUpDownMaxWordsMin); - this.groupBoxGeneralRules.Controls.Add(this.labelMergeShortLines); - this.groupBoxGeneralRules.Controls.Add(this.labelMaxWordsPerMin); - this.groupBoxGeneralRules.Controls.Add(this.labelMinDuration); - this.groupBoxGeneralRules.Controls.Add(this.numericUpDownMaxNumberOfLines); - this.groupBoxGeneralRules.Controls.Add(this.labelMaxDuration); - this.groupBoxGeneralRules.Controls.Add(this.labelMaxLines); - this.groupBoxGeneralRules.Controls.Add(this.numericUpDownDurationMin); - this.groupBoxGeneralRules.Controls.Add(this.numericUpDownDurationMax); - this.groupBoxGeneralRules.Controls.Add(this.comboBoxMergeShortLineLength); - this.groupBoxGeneralRules.Controls.Add(this.labelMaxCharsPerSecond); - this.groupBoxGeneralRules.Controls.Add(this.numericUpDownMinGapMs); - this.groupBoxGeneralRules.Controls.Add(this.numericUpDownMaxCharsSec); - this.groupBoxGeneralRules.Controls.Add(this.labelMinGapMs); - this.groupBoxGeneralRules.Controls.Add(this.numericUpDownSubtitleLineMaximumLength); - this.groupBoxGeneralRules.Location = new System.Drawing.Point(6, 23); - this.groupBoxGeneralRules.Name = "groupBoxGeneralRules"; - this.groupBoxGeneralRules.Size = new System.Drawing.Size(387, 381); - this.groupBoxGeneralRules.TabIndex = 0; - this.groupBoxGeneralRules.TabStop = false; - this.groupBoxGeneralRules.Text = "Rules"; - // - // buttonGapChoose - // - this.buttonGapChoose.Location = new System.Drawing.Point(265, 213); - this.buttonGapChoose.Name = "buttonGapChoose"; - this.buttonGapChoose.Size = new System.Drawing.Size(28, 23); - this.buttonGapChoose.TabIndex = 46; - this.buttonGapChoose.Text = "..."; - this.buttonGapChoose.UseVisualStyleBackColor = true; - this.buttonGapChoose.Click += new System.EventHandler(this.buttonGapChoose_Click); - // - // comboBoxContinuationStyle - // - this.comboBoxContinuationStyle.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxContinuationStyle.DropDownWidth = 170; - this.comboBoxContinuationStyle.FormattingEnabled = true; - this.comboBoxContinuationStyle.Location = new System.Drawing.Point(203, 324); - this.comboBoxContinuationStyle.Name = "comboBoxContinuationStyle"; - this.comboBoxContinuationStyle.Size = new System.Drawing.Size(170, 21); - this.comboBoxContinuationStyle.TabIndex = 58; - this.comboBoxContinuationStyle.SelectedIndexChanged += new System.EventHandler(this.ProfileUiValueChanged); - // - // labelContinuationStyle - // - this.labelContinuationStyle.AutoSize = true; - this.labelContinuationStyle.Location = new System.Drawing.Point(6, 327); - this.labelContinuationStyle.Name = "labelContinuationStyle"; - this.labelContinuationStyle.Size = new System.Drawing.Size(140, 13); - this.labelContinuationStyle.TabIndex = 63; - this.labelContinuationStyle.Text = "Sentence continuation style"; - // - // labelDialogStyle - // - this.labelDialogStyle.AutoSize = true; - this.labelDialogStyle.Location = new System.Drawing.Point(6, 300); - this.labelDialogStyle.Name = "labelDialogStyle"; - this.labelDialogStyle.Size = new System.Drawing.Size(62, 13); - this.labelDialogStyle.TabIndex = 61; - this.labelDialogStyle.Text = "Dialog style"; - // - // comboBoxDialogStyle - // - this.comboBoxDialogStyle.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxDialogStyle.FormattingEnabled = true; - this.comboBoxDialogStyle.Items.AddRange(new object[] { - "Dash both lines with space", - "Dash both lines without space", - "Dash second line with space", - "Dash second line without space"}); - this.comboBoxDialogStyle.Location = new System.Drawing.Point(203, 297); - this.comboBoxDialogStyle.Name = "comboBoxDialogStyle"; - this.comboBoxDialogStyle.Size = new System.Drawing.Size(170, 21); - this.comboBoxDialogStyle.TabIndex = 57; - this.comboBoxDialogStyle.SelectedIndexChanged += new System.EventHandler(this.ProfileUiValueChanged); - // - // checkBoxCpsIncludeWhiteSpace - // - this.checkBoxCpsIncludeWhiteSpace.AutoSize = true; - this.checkBoxCpsIncludeWhiteSpace.Location = new System.Drawing.Point(9, 354); - this.checkBoxCpsIncludeWhiteSpace.Name = "checkBoxCpsIncludeWhiteSpace"; - this.checkBoxCpsIncludeWhiteSpace.Size = new System.Drawing.Size(271, 17); - this.checkBoxCpsIncludeWhiteSpace.TabIndex = 65; - this.checkBoxCpsIncludeWhiteSpace.Text = "Characters per second (CPS) includes white spaces"; - this.checkBoxCpsIncludeWhiteSpace.UseVisualStyleBackColor = true; - this.checkBoxCpsIncludeWhiteSpace.CheckedChanged += new System.EventHandler(this.ProfileUiValueChanged); - // - // buttonEditProfile - // - this.buttonEditProfile.Location = new System.Drawing.Point(322, 19); - this.buttonEditProfile.Name = "buttonEditProfile"; - this.buttonEditProfile.Size = new System.Drawing.Size(28, 23); - this.buttonEditProfile.TabIndex = 10; - this.buttonEditProfile.Text = "..."; - this.buttonEditProfile.UseVisualStyleBackColor = true; - this.buttonEditProfile.Click += new System.EventHandler(this.buttonEditProfile_Click); - // - // comboBoxRulesProfileName - // - this.comboBoxRulesProfileName.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxRulesProfileName.FormattingEnabled = true; - this.comboBoxRulesProfileName.Location = new System.Drawing.Point(78, 20); - this.comboBoxRulesProfileName.Name = "comboBoxRulesProfileName"; - this.comboBoxRulesProfileName.Size = new System.Drawing.Size(238, 21); - this.comboBoxRulesProfileName.TabIndex = 5; - this.comboBoxRulesProfileName.SelectedIndexChanged += new System.EventHandler(this.comboBoxRulesProfileName_SelectedIndexChanged); - // - // labelRulesProfileName - // - this.labelRulesProfileName.AutoSize = true; - this.labelRulesProfileName.Location = new System.Drawing.Point(6, 24); - this.labelRulesProfileName.Name = "labelRulesProfileName"; - this.labelRulesProfileName.Size = new System.Drawing.Size(37, 13); - this.labelRulesProfileName.TabIndex = 50; - this.labelRulesProfileName.Text = "Profile"; - // - // labelOptimalCharsPerSecond - // - this.labelOptimalCharsPerSecond.AutoSize = true; - this.labelOptimalCharsPerSecond.Location = new System.Drawing.Point(6, 84); - this.labelOptimalCharsPerSecond.Name = "labelOptimalCharsPerSecond"; - this.labelOptimalCharsPerSecond.Size = new System.Drawing.Size(92, 13); - this.labelOptimalCharsPerSecond.TabIndex = 8; - this.labelOptimalCharsPerSecond.Text = "Optimal chars/sec"; - // - // numericUpDownOptimalCharsSec - // - this.numericUpDownOptimalCharsSec.DecimalPlaces = 1; - this.numericUpDownOptimalCharsSec.Increment = new decimal(new int[] { - 1, - 0, - 0, - 65536}); - this.numericUpDownOptimalCharsSec.Location = new System.Drawing.Point(203, 82); - this.numericUpDownOptimalCharsSec.Minimum = new decimal(new int[] { - 4, - 0, - 0, - 0}); - this.numericUpDownOptimalCharsSec.Name = "numericUpDownOptimalCharsSec"; - this.numericUpDownOptimalCharsSec.Size = new System.Drawing.Size(56, 21); - this.numericUpDownOptimalCharsSec.TabIndex = 20; - this.numericUpDownOptimalCharsSec.Value = new decimal(new int[] { - 11, - 0, - 0, - 0}); - this.numericUpDownOptimalCharsSec.ValueChanged += new System.EventHandler(this.ProfileUiValueChanged); - // - // labelSubMaxLen - // - this.labelSubMaxLen.AutoSize = true; - this.labelSubMaxLen.Location = new System.Drawing.Point(6, 57); - this.labelSubMaxLen.Name = "labelSubMaxLen"; - this.labelSubMaxLen.Size = new System.Drawing.Size(103, 13); - this.labelSubMaxLen.TabIndex = 6; - this.labelSubMaxLen.Text = "Subtitle max. length"; - // - // numericUpDownMaxWordsMin - // - this.numericUpDownMaxWordsMin.Location = new System.Drawing.Point(203, 136); - this.numericUpDownMaxWordsMin.Maximum = new decimal(new int[] { - 1000, - 0, - 0, - 0}); - this.numericUpDownMaxWordsMin.Minimum = new decimal(new int[] { - 4, - 0, - 0, - 0}); - this.numericUpDownMaxWordsMin.Name = "numericUpDownMaxWordsMin"; - this.numericUpDownMaxWordsMin.Size = new System.Drawing.Size(56, 21); - this.numericUpDownMaxWordsMin.TabIndex = 30; - this.numericUpDownMaxWordsMin.Value = new decimal(new int[] { - 300, - 0, - 0, - 0}); - this.numericUpDownMaxWordsMin.ValueChanged += new System.EventHandler(this.ProfileUiValueChanged); - // - // labelMergeShortLines - // - this.labelMergeShortLines.AutoSize = true; - this.labelMergeShortLines.Location = new System.Drawing.Point(6, 273); - this.labelMergeShortLines.Name = "labelMergeShortLines"; - this.labelMergeShortLines.Size = new System.Drawing.Size(124, 13); - this.labelMergeShortLines.TabIndex = 16; - this.labelMergeShortLines.Text = "Merge lines shorter than"; - // - // labelMaxWordsPerMin - // - this.labelMaxWordsPerMin.AutoSize = true; - this.labelMaxWordsPerMin.Location = new System.Drawing.Point(6, 138); - this.labelMaxWordsPerMin.Name = "labelMaxWordsPerMin"; - this.labelMaxWordsPerMin.Size = new System.Drawing.Size(83, 13); - this.labelMaxWordsPerMin.TabIndex = 49; - this.labelMaxWordsPerMin.Text = "Max. words/min"; - // - // labelMinDuration - // - this.labelMinDuration.AutoSize = true; - this.labelMinDuration.Location = new System.Drawing.Point(6, 165); - this.labelMinDuration.Name = "labelMinDuration"; - this.labelMinDuration.Size = new System.Drawing.Size(132, 13); - this.labelMinDuration.TabIndex = 10; - this.labelMinDuration.Text = "Min. duration, milliseconds"; - // - // numericUpDownMaxNumberOfLines - // - this.numericUpDownMaxNumberOfLines.Location = new System.Drawing.Point(203, 242); - this.numericUpDownMaxNumberOfLines.Maximum = new decimal(new int[] { - 25, - 0, - 0, - 0}); - this.numericUpDownMaxNumberOfLines.Minimum = new decimal(new int[] { - 1, - 0, - 0, - 0}); - this.numericUpDownMaxNumberOfLines.Name = "numericUpDownMaxNumberOfLines"; - this.numericUpDownMaxNumberOfLines.Size = new System.Drawing.Size(56, 21); - this.numericUpDownMaxNumberOfLines.TabIndex = 50; - this.numericUpDownMaxNumberOfLines.Value = new decimal(new int[] { - 2, - 0, - 0, - 0}); - this.numericUpDownMaxNumberOfLines.ValueChanged += new System.EventHandler(this.numericUpDownMaxNumberOfLines_ValueChanged); - // - // labelMaxDuration - // - this.labelMaxDuration.AutoSize = true; - this.labelMaxDuration.Location = new System.Drawing.Point(6, 191); - this.labelMaxDuration.Name = "labelMaxDuration"; - this.labelMaxDuration.Size = new System.Drawing.Size(136, 13); - this.labelMaxDuration.TabIndex = 12; - this.labelMaxDuration.Text = "Max. duration, milliseconds"; - // - // labelMaxLines - // - this.labelMaxLines.AutoSize = true; - this.labelMaxLines.Location = new System.Drawing.Point(6, 244); - this.labelMaxLines.Name = "labelMaxLines"; - this.labelMaxLines.Size = new System.Drawing.Size(107, 13); - this.labelMaxLines.TabIndex = 47; - this.labelMaxLines.Text = "Max. number of lines"; - // - // numericUpDownDurationMin - // - this.numericUpDownDurationMin.Location = new System.Drawing.Point(203, 163); - this.numericUpDownDurationMin.Maximum = new decimal(new int[] { - 3000, - 0, - 0, - 0}); - this.numericUpDownDurationMin.Minimum = new decimal(new int[] { - 100, - 0, - 0, - 0}); - this.numericUpDownDurationMin.Name = "numericUpDownDurationMin"; - this.numericUpDownDurationMin.Size = new System.Drawing.Size(56, 21); - this.numericUpDownDurationMin.TabIndex = 35; - this.numericUpDownDurationMin.Value = new decimal(new int[] { - 100, - 0, - 0, - 0}); - this.numericUpDownDurationMin.ValueChanged += new System.EventHandler(this.ProfileUiValueChanged); - // - // numericUpDownDurationMax - // - this.numericUpDownDurationMax.Location = new System.Drawing.Point(203, 189); - this.numericUpDownDurationMax.Maximum = new decimal(new int[] { - 50000, - 0, - 0, - 0}); - this.numericUpDownDurationMax.Minimum = new decimal(new int[] { - 3000, - 0, - 0, - 0}); - this.numericUpDownDurationMax.Name = "numericUpDownDurationMax"; - this.numericUpDownDurationMax.Size = new System.Drawing.Size(56, 21); - this.numericUpDownDurationMax.TabIndex = 40; - this.numericUpDownDurationMax.Value = new decimal(new int[] { - 50000, - 0, - 0, - 0}); - this.numericUpDownDurationMax.ValueChanged += new System.EventHandler(this.ProfileUiValueChanged); - // - // comboBoxMergeShortLineLength - // - this.comboBoxMergeShortLineLength.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxMergeShortLineLength.FormattingEnabled = true; - this.comboBoxMergeShortLineLength.Location = new System.Drawing.Point(203, 270); - this.comboBoxMergeShortLineLength.Name = "comboBoxMergeShortLineLength"; - this.comboBoxMergeShortLineLength.Size = new System.Drawing.Size(73, 21); - this.comboBoxMergeShortLineLength.TabIndex = 55; - this.comboBoxMergeShortLineLength.SelectedIndexChanged += new System.EventHandler(this.ProfileUiValueChanged); - // - // labelMaxCharsPerSecond - // - this.labelMaxCharsPerSecond.AutoSize = true; - this.labelMaxCharsPerSecond.Location = new System.Drawing.Point(6, 111); - this.labelMaxCharsPerSecond.Name = "labelMaxCharsPerSecond"; - this.labelMaxCharsPerSecond.Size = new System.Drawing.Size(80, 13); - this.labelMaxCharsPerSecond.TabIndex = 9; - this.labelMaxCharsPerSecond.Text = "Max. chars/sec"; - // - // numericUpDownMinGapMs - // - this.numericUpDownMinGapMs.Location = new System.Drawing.Point(203, 215); - this.numericUpDownMinGapMs.Maximum = new decimal(new int[] { - 1000, - 0, - 0, - 0}); - this.numericUpDownMinGapMs.Name = "numericUpDownMinGapMs"; - this.numericUpDownMinGapMs.Size = new System.Drawing.Size(56, 21); - this.numericUpDownMinGapMs.TabIndex = 45; - this.numericUpDownMinGapMs.Value = new decimal(new int[] { - 25, - 0, - 0, - 0}); - this.numericUpDownMinGapMs.ValueChanged += new System.EventHandler(this.ProfileUiValueChanged); - // - // numericUpDownMaxCharsSec - // - this.numericUpDownMaxCharsSec.DecimalPlaces = 1; - this.numericUpDownMaxCharsSec.Increment = new decimal(new int[] { - 1, - 0, - 0, - 65536}); - this.numericUpDownMaxCharsSec.Location = new System.Drawing.Point(203, 109); - this.numericUpDownMaxCharsSec.Minimum = new decimal(new int[] { - 4, - 0, - 0, - 0}); - this.numericUpDownMaxCharsSec.Name = "numericUpDownMaxCharsSec"; - this.numericUpDownMaxCharsSec.Size = new System.Drawing.Size(56, 21); - this.numericUpDownMaxCharsSec.TabIndex = 25; - this.numericUpDownMaxCharsSec.Value = new decimal(new int[] { - 24, - 0, - 0, - 0}); - this.numericUpDownMaxCharsSec.ValueChanged += new System.EventHandler(this.ProfileUiValueChanged); - // - // labelMinGapMs - // - this.labelMinGapMs.AutoSize = true; - this.labelMinGapMs.Location = new System.Drawing.Point(6, 217); - this.labelMinGapMs.Name = "labelMinGapMs"; - this.labelMinGapMs.Size = new System.Drawing.Size(136, 13); - this.labelMinGapMs.TabIndex = 14; - this.labelMinGapMs.Text = "Min. gap between subtitles"; - // - // numericUpDownSubtitleLineMaximumLength - // - this.numericUpDownSubtitleLineMaximumLength.Location = new System.Drawing.Point(203, 55); - this.numericUpDownSubtitleLineMaximumLength.Maximum = new decimal(new int[] { - 999, - 0, - 0, - 0}); - this.numericUpDownSubtitleLineMaximumLength.Minimum = new decimal(new int[] { - 10, - 0, - 0, - 0}); - this.numericUpDownSubtitleLineMaximumLength.Name = "numericUpDownSubtitleLineMaximumLength"; - this.numericUpDownSubtitleLineMaximumLength.Size = new System.Drawing.Size(56, 21); - this.numericUpDownSubtitleLineMaximumLength.TabIndex = 15; - this.numericUpDownSubtitleLineMaximumLength.Value = new decimal(new int[] { - 100, - 0, - 0, - 0}); - this.numericUpDownSubtitleLineMaximumLength.ValueChanged += new System.EventHandler(this.ProfileUiValueChanged); - // - // comboBoxAutoBackupDeleteAfter - // - this.comboBoxAutoBackupDeleteAfter.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxAutoBackupDeleteAfter.FormattingEnabled = true; - this.comboBoxAutoBackupDeleteAfter.Items.AddRange(new object[] { - "1 month", - "3 months", - "6 months"}); - this.comboBoxAutoBackupDeleteAfter.Location = new System.Drawing.Point(707, 421); - this.comboBoxAutoBackupDeleteAfter.Name = "comboBoxAutoBackupDeleteAfter"; - this.comboBoxAutoBackupDeleteAfter.Size = new System.Drawing.Size(88, 21); - this.comboBoxAutoBackupDeleteAfter.TabIndex = 29; - // - // labelAutoBackupDeleteAfter - // - this.labelAutoBackupDeleteAfter.AutoSize = true; - this.labelAutoBackupDeleteAfter.Location = new System.Drawing.Point(639, 424); - this.labelAutoBackupDeleteAfter.Name = "labelAutoBackupDeleteAfter"; - this.labelAutoBackupDeleteAfter.Size = new System.Drawing.Size(65, 13); - this.labelAutoBackupDeleteAfter.TabIndex = 28; - this.labelAutoBackupDeleteAfter.Text = "Delete after"; - // - // checkBoxCheckForUpdates - // - this.checkBoxCheckForUpdates.AutoSize = true; - this.checkBoxCheckForUpdates.Location = new System.Drawing.Point(522, 453); - this.checkBoxCheckForUpdates.Name = "checkBoxCheckForUpdates"; - this.checkBoxCheckForUpdates.Size = new System.Drawing.Size(114, 17); - this.checkBoxCheckForUpdates.TabIndex = 31; - this.checkBoxCheckForUpdates.Text = "Check for updates"; - this.checkBoxCheckForUpdates.UseVisualStyleBackColor = true; - // - // labelSpellChecker - // - this.labelSpellChecker.AutoSize = true; - this.labelSpellChecker.Location = new System.Drawing.Point(669, 19); - this.labelSpellChecker.Name = "labelSpellChecker"; - this.labelSpellChecker.Size = new System.Drawing.Size(69, 13); - this.labelSpellChecker.TabIndex = 30; - this.labelSpellChecker.Text = "Spell checker"; - this.labelSpellChecker.Visible = false; - // - // comboBoxTimeCodeMode - // - this.comboBoxTimeCodeMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxTimeCodeMode.FormattingEnabled = true; - this.comboBoxTimeCodeMode.Items.AddRange(new object[] { - "HH:MM:SS:MSEC (00:00:00.000)", - "HH:MM:SS:FF (00:00:00.00)"}); - this.comboBoxTimeCodeMode.Location = new System.Drawing.Point(528, 261); - this.comboBoxTimeCodeMode.Name = "comboBoxTimeCodeMode"; - this.comboBoxTimeCodeMode.Size = new System.Drawing.Size(207, 21); - this.comboBoxTimeCodeMode.TabIndex = 19; - // - // labelTimeCodeMode - // - this.labelTimeCodeMode.AutoSize = true; - this.labelTimeCodeMode.Location = new System.Drawing.Point(438, 264); - this.labelTimeCodeMode.Name = "labelTimeCodeMode"; - this.labelTimeCodeMode.Size = new System.Drawing.Size(84, 13); - this.labelTimeCodeMode.TabIndex = 18; - this.labelTimeCodeMode.Text = "Time code mode"; - // - // comboBoxEncoding - // - this.comboBoxEncoding.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxEncoding.FormattingEnabled = true; - this.comboBoxEncoding.Items.AddRange(new object[] { - "ANSI", - "UTF-7", - "UTF-8", - "Unicode"}); - this.comboBoxEncoding.Location = new System.Drawing.Point(205, 438); - this.comboBoxEncoding.Name = "comboBoxEncoding"; - this.comboBoxEncoding.Size = new System.Drawing.Size(188, 21); - this.comboBoxEncoding.TabIndex = 4; - // - // checkBoxAutoDetectAnsiEncoding - // - this.checkBoxAutoDetectAnsiEncoding.AutoSize = true; - this.checkBoxAutoDetectAnsiEncoding.Location = new System.Drawing.Point(205, 467); - this.checkBoxAutoDetectAnsiEncoding.Name = "checkBoxAutoDetectAnsiEncoding"; - this.checkBoxAutoDetectAnsiEncoding.Size = new System.Drawing.Size(15, 14); - this.checkBoxAutoDetectAnsiEncoding.TabIndex = 6; - this.checkBoxAutoDetectAnsiEncoding.UseVisualStyleBackColor = true; - // - // textBoxShowLineBreaksAs - // - this.textBoxShowLineBreaksAs.Location = new System.Drawing.Point(594, 233); - this.textBoxShowLineBreaksAs.MaxLength = 10; - this.textBoxShowLineBreaksAs.Name = "textBoxShowLineBreaksAs"; - this.textBoxShowLineBreaksAs.Size = new System.Drawing.Size(60, 21); - this.textBoxShowLineBreaksAs.TabIndex = 17; - // - // checkBoxAutoWrapWhileTyping - // - this.checkBoxAutoWrapWhileTyping.AutoSize = true; - this.checkBoxAutoWrapWhileTyping.Location = new System.Drawing.Point(441, 210); - this.checkBoxAutoWrapWhileTyping.Name = "checkBoxAutoWrapWhileTyping"; - this.checkBoxAutoWrapWhileTyping.Size = new System.Drawing.Size(137, 17); - this.checkBoxAutoWrapWhileTyping.TabIndex = 15; - this.checkBoxAutoWrapWhileTyping.Text = "Auto-wrap while typing"; - this.checkBoxAutoWrapWhileTyping.UseVisualStyleBackColor = true; - // - // checkBoxPromptDeleteLines - // - this.checkBoxPromptDeleteLines.AutoSize = true; - this.checkBoxPromptDeleteLines.Location = new System.Drawing.Point(441, 187); - this.checkBoxPromptDeleteLines.Name = "checkBoxPromptDeleteLines"; - this.checkBoxPromptDeleteLines.Size = new System.Drawing.Size(142, 17); - this.checkBoxPromptDeleteLines.TabIndex = 14; - this.checkBoxPromptDeleteLines.Text = "Prompt for deleting lines"; - this.checkBoxPromptDeleteLines.UseVisualStyleBackColor = true; - // - // checkBoxAllowEditOfOriginalSubtitle - // - this.checkBoxAllowEditOfOriginalSubtitle.AutoSize = true; - this.checkBoxAllowEditOfOriginalSubtitle.Location = new System.Drawing.Point(441, 164); - this.checkBoxAllowEditOfOriginalSubtitle.Name = "checkBoxAllowEditOfOriginalSubtitle"; - this.checkBoxAllowEditOfOriginalSubtitle.Size = new System.Drawing.Size(160, 17); - this.checkBoxAllowEditOfOriginalSubtitle.TabIndex = 13; - this.checkBoxAllowEditOfOriginalSubtitle.Text = "Allow edit of original subtitle"; - this.checkBoxAllowEditOfOriginalSubtitle.UseVisualStyleBackColor = true; - // - // comboBoxSpellChecker - // - this.comboBoxSpellChecker.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxSpellChecker.FormattingEnabled = true; - this.comboBoxSpellChecker.Items.AddRange(new object[] { - "Hunspell", - "Word"}); - this.comboBoxSpellChecker.Location = new System.Drawing.Point(692, 16); - this.comboBoxSpellChecker.Name = "comboBoxSpellChecker"; - this.comboBoxSpellChecker.Size = new System.Drawing.Size(121, 21); - this.comboBoxSpellChecker.TabIndex = 31; - this.comboBoxSpellChecker.Visible = false; - // - // comboBoxAutoBackup - // - this.comboBoxAutoBackup.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxAutoBackup.FormattingEnabled = true; - this.comboBoxAutoBackup.Items.AddRange(new object[] { - "None", - "Every minute", - "Every 5 minutes", - "Every 15 minutes"}); - this.comboBoxAutoBackup.Location = new System.Drawing.Point(512, 421); - this.comboBoxAutoBackup.Name = "comboBoxAutoBackup"; - this.comboBoxAutoBackup.Size = new System.Drawing.Size(121, 21); - this.comboBoxAutoBackup.TabIndex = 27; - // - // labelAutoBackup - // - this.labelAutoBackup.AutoSize = true; - this.labelAutoBackup.Location = new System.Drawing.Point(438, 424); - this.labelAutoBackup.Name = "labelAutoBackup"; - this.labelAutoBackup.Size = new System.Drawing.Size(68, 13); - this.labelAutoBackup.TabIndex = 26; - this.labelAutoBackup.Text = "Auto-backup"; - // - // checkBoxRememberSelectedLine - // - this.checkBoxRememberSelectedLine.AutoSize = true; - this.checkBoxRememberSelectedLine.Location = new System.Drawing.Point(449, 69); - this.checkBoxRememberSelectedLine.Name = "checkBoxRememberSelectedLine"; - this.checkBoxRememberSelectedLine.Size = new System.Drawing.Size(139, 17); - this.checkBoxRememberSelectedLine.TabIndex = 9; - this.checkBoxRememberSelectedLine.Text = "Remember selected line"; - this.checkBoxRememberSelectedLine.UseVisualStyleBackColor = true; - // - // checkBoxRemoveBlankLinesWhenOpening - // - this.checkBoxRemoveBlankLinesWhenOpening.AutoSize = true; - this.checkBoxRemoveBlankLinesWhenOpening.Location = new System.Drawing.Point(441, 141); - this.checkBoxRemoveBlankLinesWhenOpening.Name = "checkBoxRemoveBlankLinesWhenOpening"; - this.checkBoxRemoveBlankLinesWhenOpening.Size = new System.Drawing.Size(225, 17); - this.checkBoxRemoveBlankLinesWhenOpening.TabIndex = 12; - this.checkBoxRemoveBlankLinesWhenOpening.Text = "Remove blank lines when opening subtitle"; - this.checkBoxRemoveBlankLinesWhenOpening.UseVisualStyleBackColor = true; - // - // labelAutoDetectAnsiEncoding - // - this.labelAutoDetectAnsiEncoding.AutoSize = true; - this.labelAutoDetectAnsiEncoding.Location = new System.Drawing.Point(8, 466); - this.labelAutoDetectAnsiEncoding.Name = "labelAutoDetectAnsiEncoding"; - this.labelAutoDetectAnsiEncoding.Size = new System.Drawing.Size(137, 13); - this.labelAutoDetectAnsiEncoding.TabIndex = 5; - this.labelAutoDetectAnsiEncoding.Text = "Auto detect ANSI encoding"; - // - // comboBoxListViewDoubleClickEvent - // - this.comboBoxListViewDoubleClickEvent.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxListViewDoubleClickEvent.FormattingEnabled = true; - this.comboBoxListViewDoubleClickEvent.Items.AddRange(new object[] { - "ANSI", - "UTF-7", - "UTF-8", - "Unicode"}); - this.comboBoxListViewDoubleClickEvent.Location = new System.Drawing.Point(441, 337); - this.comboBoxListViewDoubleClickEvent.Name = "comboBoxListViewDoubleClickEvent"; - this.comboBoxListViewDoubleClickEvent.Size = new System.Drawing.Size(332, 21); - this.comboBoxListViewDoubleClickEvent.TabIndex = 23; - // - // labelListViewDoubleClickEvent - // - this.labelListViewDoubleClickEvent.AutoSize = true; - this.labelListViewDoubleClickEvent.Location = new System.Drawing.Point(438, 321); - this.labelListViewDoubleClickEvent.Name = "labelListViewDoubleClickEvent"; - this.labelListViewDoubleClickEvent.Size = new System.Drawing.Size(227, 13); - this.labelListViewDoubleClickEvent.TabIndex = 22; - this.labelListViewDoubleClickEvent.Text = "Double-click on line in main window listview will"; - // - // labelShowLineBreaksAs - // - this.labelShowLineBreaksAs.AutoSize = true; - this.labelShowLineBreaksAs.Location = new System.Drawing.Point(438, 236); - this.labelShowLineBreaksAs.Name = "labelShowLineBreaksAs"; - this.labelShowLineBreaksAs.Size = new System.Drawing.Size(150, 13); - this.labelShowLineBreaksAs.TabIndex = 16; - this.labelShowLineBreaksAs.Text = "Show line breaks in listview as"; - // - // checkBoxRememberWindowPosition - // - this.checkBoxRememberWindowPosition.AutoSize = true; - this.checkBoxRememberWindowPosition.Location = new System.Drawing.Point(441, 95); - this.checkBoxRememberWindowPosition.Name = "checkBoxRememberWindowPosition"; - this.checkBoxRememberWindowPosition.Size = new System.Drawing.Size(223, 17); - this.checkBoxRememberWindowPosition.TabIndex = 10; - this.checkBoxRememberWindowPosition.Text = "Remember main window position and size"; - this.checkBoxRememberWindowPosition.UseVisualStyleBackColor = true; - // - // checkBoxStartInSourceView - // - this.checkBoxStartInSourceView.AutoSize = true; - this.checkBoxStartInSourceView.Location = new System.Drawing.Point(441, 118); - this.checkBoxStartInSourceView.Name = "checkBoxStartInSourceView"; - this.checkBoxStartInSourceView.Size = new System.Drawing.Size(121, 17); - this.checkBoxStartInSourceView.TabIndex = 11; - this.checkBoxStartInSourceView.Text = "Start in source view"; - this.checkBoxStartInSourceView.UseVisualStyleBackColor = true; - // - // checkBoxReopenLastOpened - // - this.checkBoxReopenLastOpened.AutoSize = true; - this.checkBoxReopenLastOpened.Location = new System.Drawing.Point(449, 46); - this.checkBoxReopenLastOpened.Name = "checkBoxReopenLastOpened"; - this.checkBoxReopenLastOpened.Size = new System.Drawing.Size(145, 17); - this.checkBoxReopenLastOpened.TabIndex = 8; - this.checkBoxReopenLastOpened.Text = "Start with last file loaded"; - this.checkBoxReopenLastOpened.UseVisualStyleBackColor = true; - // - // checkBoxRememberRecentFiles - // - this.checkBoxRememberRecentFiles.AutoSize = true; - this.checkBoxRememberRecentFiles.Location = new System.Drawing.Point(441, 22); - this.checkBoxRememberRecentFiles.Name = "checkBoxRememberRecentFiles"; - this.checkBoxRememberRecentFiles.Size = new System.Drawing.Size(195, 17); - this.checkBoxRememberRecentFiles.TabIndex = 7; - this.checkBoxRememberRecentFiles.Text = "Remember recent files (for reopen)"; - this.checkBoxRememberRecentFiles.UseVisualStyleBackColor = true; - this.checkBoxRememberRecentFiles.CheckedChanged += new System.EventHandler(this.checkBoxRememberRecentFiles_CheckedChanged); - // - // labelDefaultFileEncoding - // - this.labelDefaultFileEncoding.AutoSize = true; - this.labelDefaultFileEncoding.Location = new System.Drawing.Point(8, 442); - this.labelDefaultFileEncoding.Name = "labelDefaultFileEncoding"; - this.labelDefaultFileEncoding.Size = new System.Drawing.Size(105, 13); - this.labelDefaultFileEncoding.TabIndex = 3; - this.labelDefaultFileEncoding.Text = "Default file encoding"; - // - // comboBoxFrameRate - // - this.comboBoxFrameRate.FormattingEnabled = true; - this.comboBoxFrameRate.Location = new System.Drawing.Point(205, 410); - this.comboBoxFrameRate.Name = "comboBoxFrameRate"; - this.comboBoxFrameRate.Size = new System.Drawing.Size(121, 21); - this.comboBoxFrameRate.TabIndex = 2; - // - // labelDefaultFrameRate - // - this.labelDefaultFrameRate.AutoSize = true; - this.labelDefaultFrameRate.Location = new System.Drawing.Point(8, 415); - this.labelDefaultFrameRate.Name = "labelDefaultFrameRate"; - this.labelDefaultFrameRate.Size = new System.Drawing.Size(96, 13); - this.labelDefaultFrameRate.TabIndex = 1; - this.labelDefaultFrameRate.Text = "Default frame rate"; - // - // tabPageShortcuts - // - this.tabPageShortcuts.Controls.Add(this.groupBoxShortcuts); - this.tabPageShortcuts.Location = new System.Drawing.Point(4, 22); - this.tabPageShortcuts.Name = "tabPageShortcuts"; - this.tabPageShortcuts.Padding = new System.Windows.Forms.Padding(3); - this.tabPageShortcuts.Size = new System.Drawing.Size(832, 520); - this.tabPageShortcuts.TabIndex = 8; - this.tabPageShortcuts.Text = "Shortcuts"; - this.tabPageShortcuts.UseVisualStyleBackColor = true; - // - // groupBoxShortcuts - // - this.groupBoxShortcuts.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxShortcuts.Controls.Add(this.buttonShortcutsClear); - this.groupBoxShortcuts.Controls.Add(this.labelShortcutsSearch); - this.groupBoxShortcuts.Controls.Add(this.textBoxShortcutSearch); - this.groupBoxShortcuts.Controls.Add(this.buttonClearShortcut); - this.groupBoxShortcuts.Controls.Add(this.comboBoxShortcutKey); - this.groupBoxShortcuts.Controls.Add(this.labelShortcutKey); - this.groupBoxShortcuts.Controls.Add(this.checkBoxShortcutsShift); - this.groupBoxShortcuts.Controls.Add(this.checkBoxShortcutsAlt); - this.groupBoxShortcuts.Controls.Add(this.checkBoxShortcutsControl); - this.groupBoxShortcuts.Controls.Add(this.buttonUpdateShortcut); - this.groupBoxShortcuts.Controls.Add(this.treeViewShortcuts); - this.groupBoxShortcuts.Controls.Add(this.labelShortcut); - this.groupBoxShortcuts.Location = new System.Drawing.Point(6, 6); - this.groupBoxShortcuts.Name = "groupBoxShortcuts"; - this.groupBoxShortcuts.Size = new System.Drawing.Size(819, 499); - this.groupBoxShortcuts.TabIndex = 2; - this.groupBoxShortcuts.TabStop = false; - this.groupBoxShortcuts.Text = "Shortcuts"; - // - // buttonShortcutsClear - // - this.buttonShortcutsClear.Enabled = false; - this.buttonShortcutsClear.Location = new System.Drawing.Point(221, 18); - this.buttonShortcutsClear.Name = "buttonShortcutsClear"; - this.buttonShortcutsClear.Size = new System.Drawing.Size(111, 23); - this.buttonShortcutsClear.TabIndex = 38; - this.buttonShortcutsClear.Text = "Clear"; - this.buttonShortcutsClear.UseVisualStyleBackColor = true; - this.buttonShortcutsClear.Click += new System.EventHandler(this.buttonShortcutsClear_Click); - // - // labelShortcutsSearch - // - this.labelShortcutsSearch.AutoSize = true; - this.labelShortcutsSearch.Location = new System.Drawing.Point(18, 23); - this.labelShortcutsSearch.Name = "labelShortcutsSearch"; - this.labelShortcutsSearch.Size = new System.Drawing.Size(40, 13); - this.labelShortcutsSearch.TabIndex = 37; - this.labelShortcutsSearch.Text = "Search"; - // - // textBoxShortcutSearch - // - this.textBoxShortcutSearch.Location = new System.Drawing.Point(64, 20); - this.textBoxShortcutSearch.Name = "textBoxShortcutSearch"; - this.textBoxShortcutSearch.Size = new System.Drawing.Size(151, 21); - this.textBoxShortcutSearch.TabIndex = 36; - this.textBoxShortcutSearch.TextChanged += new System.EventHandler(this.textBoxShortcutSearch_TextChanged); - // - // buttonClearShortcut - // - this.buttonClearShortcut.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonClearShortcut.Enabled = false; - this.buttonClearShortcut.Location = new System.Drawing.Point(582, 470); - this.buttonClearShortcut.Name = "buttonClearShortcut"; - this.buttonClearShortcut.Size = new System.Drawing.Size(111, 23); - this.buttonClearShortcut.TabIndex = 6; - this.buttonClearShortcut.Text = "&Clear"; - this.buttonClearShortcut.UseVisualStyleBackColor = true; - this.buttonClearShortcut.Click += new System.EventHandler(this.buttonClearShortcut_Click); - // - // comboBoxShortcutKey - // - this.comboBoxShortcutKey.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.comboBoxShortcutKey.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxShortcutKey.Enabled = false; - this.comboBoxShortcutKey.FormattingEnabled = true; - this.comboBoxShortcutKey.Items.AddRange(new object[] { - "None", - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "I", - "J", - "K", - "L", - "M", - "N", - "O", - "P", - "Q", - "R", - "S", - "T", - "U", - "V", - "W", - "X", - "Y", - "Z", - "D0", - "D1", - "D2", - "D3", - "D4", - "D5", - "D6", - "D7", - "D8", - "D9", - "F1", - "F2", - "F3", - "F4", - "F5", - "F6", - "F7", - "F8", - "F9", - "F10", - "F11", - "F12", - "Delete", - "Down", - "Home", - "End", - "Escape", - "Insert", - "Left", - "Pause", - "Return", - "Right", - "Space", - "Tab", - "Up", - "Back", - "NumPad0", - "NumPad1", - "NumPad2", - "NumPad3", - "NumPad4", - "NumPad5", - "NumPad6", - "NumPad7", - "NumPad8", - "NumPad9", - "PageDown", - "PageUp", - "Sleep", - "Multiply", - "Add", - "Separator", - "Subtract", - "Decimal", - "Divide", - "CapsLock", - "NumLock", - "Scroll", - "VolumeMute", - "VolumeDown", - "VolumeUp", - "MediaNextTrack", - "MediaPreviousTrack", - "MediaStop", - "MediaPlayPause", - "LaunchMail", - "SelectMedia", - "LaunchApplication1", - "LaunchApplication2", - "Oem1", - "Oemplus", - "Oemcomma", - "OemMinus", - "OemPeriod", - "OemQuestion", - "OemSemicolon", - "Oemtilde", - "OemOpenBrackets", - "Oem5", - "Oem6", - "Oem7", - "Oem8", - "OemBackslash", - "ProcessKey", - "Packet", - "Attn", - "Crsel", - "Exsel", - "EraseEof", - "Play", - "Zoom", - "NoName", - "Pa1", - "OemClear", - "KeyCode", - "F13", - "F14", - "F15", - "F16", - "F17", - "F18", - "F19", - "F20", - "F21", - "F22", - "F23", - "F24"}); - this.comboBoxShortcutKey.Location = new System.Drawing.Point(353, 470); - this.comboBoxShortcutKey.Name = "comboBoxShortcutKey"; - this.comboBoxShortcutKey.Size = new System.Drawing.Size(92, 21); - this.comboBoxShortcutKey.TabIndex = 4; - this.comboBoxShortcutKey.SelectedIndexChanged += new System.EventHandler(this.ValidateShortcut); - this.comboBoxShortcutKey.KeyDown += new System.Windows.Forms.KeyEventHandler(this.comboBoxShortcutKey_KeyDown); - // - // labelShortcutKey - // - this.labelShortcutKey.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelShortcutKey.AutoSize = true; - this.labelShortcutKey.Location = new System.Drawing.Point(322, 472); - this.labelShortcutKey.Name = "labelShortcutKey"; - this.labelShortcutKey.Size = new System.Drawing.Size(25, 13); - this.labelShortcutKey.TabIndex = 35; - this.labelShortcutKey.Text = "Key"; - // - // checkBoxShortcutsShift - // - this.checkBoxShortcutsShift.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.checkBoxShortcutsShift.AutoSize = true; - this.checkBoxShortcutsShift.Enabled = false; - this.checkBoxShortcutsShift.Location = new System.Drawing.Point(245, 472); - this.checkBoxShortcutsShift.Name = "checkBoxShortcutsShift"; - this.checkBoxShortcutsShift.Size = new System.Drawing.Size(48, 17); - this.checkBoxShortcutsShift.TabIndex = 3; - this.checkBoxShortcutsShift.Text = "Shift"; - this.checkBoxShortcutsShift.UseVisualStyleBackColor = true; - this.checkBoxShortcutsShift.CheckedChanged += new System.EventHandler(this.ValidateShortcut); - // - // checkBoxShortcutsAlt - // - this.checkBoxShortcutsAlt.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.checkBoxShortcutsAlt.AutoSize = true; - this.checkBoxShortcutsAlt.Enabled = false; - this.checkBoxShortcutsAlt.Location = new System.Drawing.Point(176, 472); - this.checkBoxShortcutsAlt.Name = "checkBoxShortcutsAlt"; - this.checkBoxShortcutsAlt.Size = new System.Drawing.Size(39, 17); - this.checkBoxShortcutsAlt.TabIndex = 2; - this.checkBoxShortcutsAlt.Text = "Alt"; - this.checkBoxShortcutsAlt.UseVisualStyleBackColor = true; - this.checkBoxShortcutsAlt.CheckedChanged += new System.EventHandler(this.ValidateShortcut); - // - // checkBoxShortcutsControl - // - this.checkBoxShortcutsControl.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.checkBoxShortcutsControl.AutoSize = true; - this.checkBoxShortcutsControl.Enabled = false; - this.checkBoxShortcutsControl.Location = new System.Drawing.Point(89, 472); - this.checkBoxShortcutsControl.Name = "checkBoxShortcutsControl"; - this.checkBoxShortcutsControl.Size = new System.Drawing.Size(61, 17); - this.checkBoxShortcutsControl.TabIndex = 1; - this.checkBoxShortcutsControl.Text = "Control"; - this.checkBoxShortcutsControl.UseVisualStyleBackColor = true; - this.checkBoxShortcutsControl.CheckedChanged += new System.EventHandler(this.ValidateShortcut); - // - // buttonUpdateShortcut - // - this.buttonUpdateShortcut.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonUpdateShortcut.Enabled = false; - this.buttonUpdateShortcut.Location = new System.Drawing.Point(465, 470); - this.buttonUpdateShortcut.Name = "buttonUpdateShortcut"; - this.buttonUpdateShortcut.Size = new System.Drawing.Size(111, 23); - this.buttonUpdateShortcut.TabIndex = 5; - this.buttonUpdateShortcut.Text = "&Update"; - this.buttonUpdateShortcut.UseVisualStyleBackColor = true; - this.buttonUpdateShortcut.Click += new System.EventHandler(this.buttonUpdateShortcut_Click); - // - // treeViewShortcuts - // - this.treeViewShortcuts.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.treeViewShortcuts.ContextMenuStrip = this.contextMenuStripShortcuts; - this.treeViewShortcuts.HideSelection = false; - this.treeViewShortcuts.Location = new System.Drawing.Point(16, 47); - this.treeViewShortcuts.Name = "treeViewShortcuts"; - this.treeViewShortcuts.Size = new System.Drawing.Size(797, 417); - this.treeViewShortcuts.TabIndex = 0; - this.treeViewShortcuts.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeViewShortcuts_AfterSelect); - // - // contextMenuStripShortcuts - // - this.contextMenuStripShortcuts.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripMenuItemShortcutsCollapse, - this.toolStripSeparator1, - this.importShortcutsToolStripMenuItem, - this.exportShortcutsToolStripMenuItem}); - this.contextMenuStripShortcuts.Name = "contextMenuStripShortcuts"; - this.contextMenuStripShortcuts.Size = new System.Drawing.Size(120, 76); - // - // toolStripMenuItemShortcutsCollapse - // - this.toolStripMenuItemShortcutsCollapse.Name = "toolStripMenuItemShortcutsCollapse"; - this.toolStripMenuItemShortcutsCollapse.Size = new System.Drawing.Size(119, 22); - this.toolStripMenuItemShortcutsCollapse.Text = "Collapse"; - this.toolStripMenuItemShortcutsCollapse.Click += new System.EventHandler(this.toolStripMenuItemShortcutsCollapse_Click); - // - // toolStripSeparator1 - // - this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(116, 6); - // - // importShortcutsToolStripMenuItem - // - this.importShortcutsToolStripMenuItem.Name = "importShortcutsToolStripMenuItem"; - this.importShortcutsToolStripMenuItem.Size = new System.Drawing.Size(119, 22); - this.importShortcutsToolStripMenuItem.Text = "Import..."; - this.importShortcutsToolStripMenuItem.Click += new System.EventHandler(this.importShortcutsToolStripMenuItem_Click); - // - // exportShortcutsToolStripMenuItem - // - this.exportShortcutsToolStripMenuItem.Name = "exportShortcutsToolStripMenuItem"; - this.exportShortcutsToolStripMenuItem.Size = new System.Drawing.Size(119, 22); - this.exportShortcutsToolStripMenuItem.Text = "Export..."; - this.exportShortcutsToolStripMenuItem.Click += new System.EventHandler(this.exportShortcutsToolStripMenuItem_Click); - // - // labelShortcut - // - this.labelShortcut.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelShortcut.AutoSize = true; - this.labelShortcut.Location = new System.Drawing.Point(15, 472); - this.labelShortcut.Name = "labelShortcut"; - this.labelShortcut.Size = new System.Drawing.Size(52, 13); - this.labelShortcut.TabIndex = 3; - this.labelShortcut.Text = "Shortcut:"; - // - // tabPageSyntaxColoring - // - this.tabPageSyntaxColoring.Controls.Add(this.groupBoxListViewSyntaxColoring); - this.tabPageSyntaxColoring.Location = new System.Drawing.Point(4, 22); - this.tabPageSyntaxColoring.Name = "tabPageSyntaxColoring"; - this.tabPageSyntaxColoring.Padding = new System.Windows.Forms.Padding(3); - this.tabPageSyntaxColoring.Size = new System.Drawing.Size(832, 520); - this.tabPageSyntaxColoring.TabIndex = 9; - this.tabPageSyntaxColoring.Text = "Syntax coloring"; - this.tabPageSyntaxColoring.UseVisualStyleBackColor = true; - // - // groupBoxListViewSyntaxColoring - // - this.groupBoxListViewSyntaxColoring.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxListViewSyntaxColoring.Controls.Add(this.buttonLineWidthSettings); - this.groupBoxListViewSyntaxColoring.Controls.Add(this.checkBoxSyntaxColorTextTooWide); - this.groupBoxListViewSyntaxColoring.Controls.Add(this.checkBoxSyntaxColorGapTooSmall); - this.groupBoxListViewSyntaxColoring.Controls.Add(this.checkBoxSyntaxColorTextMoreThanTwoLines); - this.groupBoxListViewSyntaxColoring.Controls.Add(this.checkBoxSyntaxOverlap); - this.groupBoxListViewSyntaxColoring.Controls.Add(this.checkBoxSyntaxColorDurationTooSmall); - this.groupBoxListViewSyntaxColoring.Controls.Add(this.buttonListViewSyntaxColorError); - this.groupBoxListViewSyntaxColoring.Controls.Add(this.checkBoxSyntaxColorTextTooLong); - this.groupBoxListViewSyntaxColoring.Controls.Add(this.checkBoxSyntaxColorDurationTooLarge); - this.groupBoxListViewSyntaxColoring.Controls.Add(this.panelListViewSyntaxColorError); - this.groupBoxListViewSyntaxColoring.Location = new System.Drawing.Point(6, 6); - this.groupBoxListViewSyntaxColoring.Name = "groupBoxListViewSyntaxColoring"; - this.groupBoxListViewSyntaxColoring.Size = new System.Drawing.Size(820, 523); - this.groupBoxListViewSyntaxColoring.TabIndex = 0; - this.groupBoxListViewSyntaxColoring.TabStop = false; - this.groupBoxListViewSyntaxColoring.Text = "List view syntax coloring"; - // - // buttonLineWidthSettings - // - this.buttonLineWidthSettings.Location = new System.Drawing.Point(160, 112); - this.buttonLineWidthSettings.Name = "buttonLineWidthSettings"; - this.buttonLineWidthSettings.Size = new System.Drawing.Size(112, 23); - this.buttonLineWidthSettings.TabIndex = 4; - this.buttonLineWidthSettings.Text = "Settings..."; - this.buttonLineWidthSettings.UseVisualStyleBackColor = true; - this.buttonLineWidthSettings.Click += new System.EventHandler(this.buttonLineWidthSettings_Click); - // - // checkBoxSyntaxColorTextTooWide - // - this.checkBoxSyntaxColorTextTooWide.AutoSize = true; - this.checkBoxSyntaxColorTextTooWide.Location = new System.Drawing.Point(20, 116); - this.checkBoxSyntaxColorTextTooWide.Name = "checkBoxSyntaxColorTextTooWide"; - this.checkBoxSyntaxColorTextTooWide.Size = new System.Drawing.Size(134, 17); - this.checkBoxSyntaxColorTextTooWide.TabIndex = 3; - this.checkBoxSyntaxColorTextTooWide.Text = "Text - color if too wide"; - this.checkBoxSyntaxColorTextTooWide.UseVisualStyleBackColor = true; - // - // checkBoxSyntaxColorGapTooSmall - // - this.checkBoxSyntaxColorGapTooSmall.AutoSize = true; - this.checkBoxSyntaxColorGapTooSmall.Location = new System.Drawing.Point(20, 209); - this.checkBoxSyntaxColorGapTooSmall.Name = "checkBoxSyntaxColorGapTooSmall"; - this.checkBoxSyntaxColorGapTooSmall.Size = new System.Drawing.Size(132, 17); - this.checkBoxSyntaxColorGapTooSmall.TabIndex = 7; - this.checkBoxSyntaxColorGapTooSmall.Text = "Gap - color if too small"; - this.checkBoxSyntaxColorGapTooSmall.UseVisualStyleBackColor = true; - // - // checkBoxSyntaxColorTextMoreThanTwoLines - // - this.checkBoxSyntaxColorTextMoreThanTwoLines.AutoSize = true; - this.checkBoxSyntaxColorTextMoreThanTwoLines.Location = new System.Drawing.Point(20, 139); - this.checkBoxSyntaxColorTextMoreThanTwoLines.Name = "checkBoxSyntaxColorTextMoreThanTwoLines"; - this.checkBoxSyntaxColorTextMoreThanTwoLines.Size = new System.Drawing.Size(170, 17); - this.checkBoxSyntaxColorTextMoreThanTwoLines.TabIndex = 5; - this.checkBoxSyntaxColorTextMoreThanTwoLines.Text = "Text - color if more than lines:"; - this.checkBoxSyntaxColorTextMoreThanTwoLines.UseVisualStyleBackColor = true; - // - // checkBoxSyntaxOverlap - // - this.checkBoxSyntaxOverlap.AutoSize = true; - this.checkBoxSyntaxOverlap.Location = new System.Drawing.Point(20, 174); - this.checkBoxSyntaxOverlap.Name = "checkBoxSyntaxOverlap"; - this.checkBoxSyntaxOverlap.Size = new System.Drawing.Size(129, 17); - this.checkBoxSyntaxOverlap.TabIndex = 6; - this.checkBoxSyntaxOverlap.Text = "Time - color if overlap"; - this.checkBoxSyntaxOverlap.UseVisualStyleBackColor = true; - // - // checkBoxSyntaxColorDurationTooSmall - // - this.checkBoxSyntaxColorDurationTooSmall.AutoSize = true; - this.checkBoxSyntaxColorDurationTooSmall.Location = new System.Drawing.Point(20, 35); - this.checkBoxSyntaxColorDurationTooSmall.Name = "checkBoxSyntaxColorDurationTooSmall"; - this.checkBoxSyntaxColorDurationTooSmall.Size = new System.Drawing.Size(154, 17); - this.checkBoxSyntaxColorDurationTooSmall.TabIndex = 0; - this.checkBoxSyntaxColorDurationTooSmall.Text = "Duration - color if too small"; - this.checkBoxSyntaxColorDurationTooSmall.UseVisualStyleBackColor = true; - // - // buttonListViewSyntaxColorError - // - this.buttonListViewSyntaxColorError.Location = new System.Drawing.Point(20, 247); - this.buttonListViewSyntaxColorError.Name = "buttonListViewSyntaxColorError"; - this.buttonListViewSyntaxColorError.Size = new System.Drawing.Size(112, 23); - this.buttonListViewSyntaxColorError.TabIndex = 8; - this.buttonListViewSyntaxColorError.Text = "Error color"; - this.buttonListViewSyntaxColorError.UseVisualStyleBackColor = true; - this.buttonListViewSyntaxColorError.Click += new System.EventHandler(this.buttonListViewSyntaxColorError_Click); - // - // checkBoxSyntaxColorTextTooLong - // - this.checkBoxSyntaxColorTextTooLong.AutoSize = true; - this.checkBoxSyntaxColorTextTooLong.Location = new System.Drawing.Point(20, 93); - this.checkBoxSyntaxColorTextTooLong.Name = "checkBoxSyntaxColorTextTooLong"; - this.checkBoxSyntaxColorTextTooLong.Size = new System.Drawing.Size(132, 17); - this.checkBoxSyntaxColorTextTooLong.TabIndex = 2; - this.checkBoxSyntaxColorTextTooLong.Text = "Text - color if too long"; - this.checkBoxSyntaxColorTextTooLong.UseVisualStyleBackColor = true; - // - // checkBoxSyntaxColorDurationTooLarge - // - this.checkBoxSyntaxColorDurationTooLarge.AutoSize = true; - this.checkBoxSyntaxColorDurationTooLarge.Location = new System.Drawing.Point(20, 58); - this.checkBoxSyntaxColorDurationTooLarge.Name = "checkBoxSyntaxColorDurationTooLarge"; - this.checkBoxSyntaxColorDurationTooLarge.Size = new System.Drawing.Size(155, 17); - this.checkBoxSyntaxColorDurationTooLarge.TabIndex = 1; - this.checkBoxSyntaxColorDurationTooLarge.Text = "Duration - color if too large"; - this.checkBoxSyntaxColorDurationTooLarge.UseVisualStyleBackColor = true; - // - // panelListViewSyntaxColorError - // - this.panelListViewSyntaxColorError.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.panelListViewSyntaxColorError.Location = new System.Drawing.Point(142, 247); - this.panelListViewSyntaxColorError.Name = "panelListViewSyntaxColorError"; - this.panelListViewSyntaxColorError.Size = new System.Drawing.Size(21, 20); - this.panelListViewSyntaxColorError.TabIndex = 8; - this.panelListViewSyntaxColorError.Click += new System.EventHandler(this.buttonListViewSyntaxColorError_Click); - // - // tabPageVideoPlayer - // - this.tabPageVideoPlayer.Controls.Add(this.groupBoxMainWindowVideoControls); - this.tabPageVideoPlayer.Controls.Add(this.groupBoxVideoPlayerDefault); - this.tabPageVideoPlayer.Controls.Add(this.groupBoxVideoEngine); - this.tabPageVideoPlayer.Location = new System.Drawing.Point(4, 22); - this.tabPageVideoPlayer.Name = "tabPageVideoPlayer"; - this.tabPageVideoPlayer.Padding = new System.Windows.Forms.Padding(3); - this.tabPageVideoPlayer.Size = new System.Drawing.Size(832, 520); - this.tabPageVideoPlayer.TabIndex = 2; - this.tabPageVideoPlayer.Text = "Video player"; - this.tabPageVideoPlayer.UseVisualStyleBackColor = true; - // - // groupBoxMainWindowVideoControls - // - this.groupBoxMainWindowVideoControls.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxMainWindowVideoControls.Controls.Add(this.labelCustomSearch5); - this.groupBoxMainWindowVideoControls.Controls.Add(this.textBoxCustomSearchUrl5); - this.groupBoxMainWindowVideoControls.Controls.Add(this.comboBoxCustomSearch5); - this.groupBoxMainWindowVideoControls.Controls.Add(this.labelCustomSearch4); - this.groupBoxMainWindowVideoControls.Controls.Add(this.textBoxCustomSearchUrl4); - this.groupBoxMainWindowVideoControls.Controls.Add(this.comboBoxCustomSearch4); - this.groupBoxMainWindowVideoControls.Controls.Add(this.labelCustomSearch3); - this.groupBoxMainWindowVideoControls.Controls.Add(this.textBoxCustomSearchUrl3); - this.groupBoxMainWindowVideoControls.Controls.Add(this.comboBoxCustomSearch3); - this.groupBoxMainWindowVideoControls.Controls.Add(this.labelCustomSearch2); - this.groupBoxMainWindowVideoControls.Controls.Add(this.textBoxCustomSearchUrl2); - this.groupBoxMainWindowVideoControls.Controls.Add(this.comboBoxCustomSearch2); - this.groupBoxMainWindowVideoControls.Controls.Add(this.labelCustomSearch1); - this.groupBoxMainWindowVideoControls.Controls.Add(this.textBoxCustomSearchUrl1); - this.groupBoxMainWindowVideoControls.Controls.Add(this.labelCustomSearch); - this.groupBoxMainWindowVideoControls.Controls.Add(this.comboBoxCustomSearch1); - this.groupBoxMainWindowVideoControls.Location = new System.Drawing.Point(7, 281); - this.groupBoxMainWindowVideoControls.Name = "groupBoxMainWindowVideoControls"; - this.groupBoxMainWindowVideoControls.Size = new System.Drawing.Size(819, 233); - this.groupBoxMainWindowVideoControls.TabIndex = 15; - this.groupBoxMainWindowVideoControls.TabStop = false; - this.groupBoxMainWindowVideoControls.Text = "Main window video controls"; - // - // labelCustomSearch5 - // - this.labelCustomSearch5.AutoSize = true; - this.labelCustomSearch5.Location = new System.Drawing.Point(12, 149); - this.labelCustomSearch5.Name = "labelCustomSearch5"; - this.labelCustomSearch5.Size = new System.Drawing.Size(13, 13); - this.labelCustomSearch5.TabIndex = 15; - this.labelCustomSearch5.Text = "5"; - // - // textBoxCustomSearchUrl5 - // - this.textBoxCustomSearchUrl5.Location = new System.Drawing.Point(185, 146); - this.textBoxCustomSearchUrl5.Name = "textBoxCustomSearchUrl5"; - this.textBoxCustomSearchUrl5.Size = new System.Drawing.Size(574, 21); - this.textBoxCustomSearchUrl5.TabIndex = 14; - // - // comboBoxCustomSearch5 - // - this.comboBoxCustomSearch5.FormattingEnabled = true; - this.comboBoxCustomSearch5.Items.AddRange(new object[] { - "Dictionary.com", - "learnersdictionary.com", - "Merriam-Webster", - "The Free Dictionary", - "Thesaurus.com", - "urbandictionary.com", - "VISUWORDS", - "Wikipedia"}); - this.comboBoxCustomSearch5.Location = new System.Drawing.Point(31, 146); - this.comboBoxCustomSearch5.Name = "comboBoxCustomSearch5"; - this.comboBoxCustomSearch5.Size = new System.Drawing.Size(148, 21); - this.comboBoxCustomSearch5.TabIndex = 13; - this.comboBoxCustomSearch5.SelectedIndexChanged += new System.EventHandler(this.comboBoxCustomSearch_SelectedIndexChanged); - // - // labelCustomSearch4 - // - this.labelCustomSearch4.AutoSize = true; - this.labelCustomSearch4.Location = new System.Drawing.Point(12, 122); - this.labelCustomSearch4.Name = "labelCustomSearch4"; - this.labelCustomSearch4.Size = new System.Drawing.Size(13, 13); - this.labelCustomSearch4.TabIndex = 12; - this.labelCustomSearch4.Text = "4"; - // - // textBoxCustomSearchUrl4 - // - this.textBoxCustomSearchUrl4.Location = new System.Drawing.Point(185, 119); - this.textBoxCustomSearchUrl4.Name = "textBoxCustomSearchUrl4"; - this.textBoxCustomSearchUrl4.Size = new System.Drawing.Size(574, 21); - this.textBoxCustomSearchUrl4.TabIndex = 11; - // - // comboBoxCustomSearch4 - // - this.comboBoxCustomSearch4.FormattingEnabled = true; - this.comboBoxCustomSearch4.Items.AddRange(new object[] { - "Dictionary.com", - "learnersdictionary.com", - "Merriam-Webster", - "The Free Dictionary", - "Thesaurus.com", - "urbandictionary.com", - "VISUWORDS", - "Wikipedia"}); - this.comboBoxCustomSearch4.Location = new System.Drawing.Point(31, 119); - this.comboBoxCustomSearch4.Name = "comboBoxCustomSearch4"; - this.comboBoxCustomSearch4.Size = new System.Drawing.Size(148, 21); - this.comboBoxCustomSearch4.TabIndex = 10; - this.comboBoxCustomSearch4.SelectedIndexChanged += new System.EventHandler(this.comboBoxCustomSearch_SelectedIndexChanged); - // - // labelCustomSearch3 - // - this.labelCustomSearch3.AutoSize = true; - this.labelCustomSearch3.Location = new System.Drawing.Point(12, 95); - this.labelCustomSearch3.Name = "labelCustomSearch3"; - this.labelCustomSearch3.Size = new System.Drawing.Size(13, 13); - this.labelCustomSearch3.TabIndex = 9; - this.labelCustomSearch3.Text = "3"; - // - // textBoxCustomSearchUrl3 - // - this.textBoxCustomSearchUrl3.Location = new System.Drawing.Point(185, 92); - this.textBoxCustomSearchUrl3.Name = "textBoxCustomSearchUrl3"; - this.textBoxCustomSearchUrl3.Size = new System.Drawing.Size(574, 21); - this.textBoxCustomSearchUrl3.TabIndex = 8; - // - // comboBoxCustomSearch3 - // - this.comboBoxCustomSearch3.FormattingEnabled = true; - this.comboBoxCustomSearch3.Items.AddRange(new object[] { - "Dictionary.com", - "learnersdictionary.com", - "Merriam-Webster", - "The Free Dictionary", - "Thesaurus.com", - "urbandictionary.com", - "VISUWORDS", - "Wikipedia"}); - this.comboBoxCustomSearch3.Location = new System.Drawing.Point(31, 92); - this.comboBoxCustomSearch3.Name = "comboBoxCustomSearch3"; - this.comboBoxCustomSearch3.Size = new System.Drawing.Size(148, 21); - this.comboBoxCustomSearch3.TabIndex = 7; - this.comboBoxCustomSearch3.SelectedIndexChanged += new System.EventHandler(this.comboBoxCustomSearch_SelectedIndexChanged); - // - // labelCustomSearch2 - // - this.labelCustomSearch2.AutoSize = true; - this.labelCustomSearch2.Location = new System.Drawing.Point(12, 68); - this.labelCustomSearch2.Name = "labelCustomSearch2"; - this.labelCustomSearch2.Size = new System.Drawing.Size(13, 13); - this.labelCustomSearch2.TabIndex = 6; - this.labelCustomSearch2.Text = "2"; - // - // textBoxCustomSearchUrl2 - // - this.textBoxCustomSearchUrl2.Location = new System.Drawing.Point(185, 65); - this.textBoxCustomSearchUrl2.Name = "textBoxCustomSearchUrl2"; - this.textBoxCustomSearchUrl2.Size = new System.Drawing.Size(574, 21); - this.textBoxCustomSearchUrl2.TabIndex = 5; - // - // comboBoxCustomSearch2 - // - this.comboBoxCustomSearch2.FormattingEnabled = true; - this.comboBoxCustomSearch2.Items.AddRange(new object[] { - "Dictionary.com", - "learnersdictionary.com", - "Merriam-Webster", - "The Free Dictionary", - "Thesaurus.com", - "urbandictionary.com", - "VISUWORDS", - "Wikipedia"}); - this.comboBoxCustomSearch2.Location = new System.Drawing.Point(31, 65); - this.comboBoxCustomSearch2.Name = "comboBoxCustomSearch2"; - this.comboBoxCustomSearch2.Size = new System.Drawing.Size(148, 21); - this.comboBoxCustomSearch2.TabIndex = 4; - this.comboBoxCustomSearch2.SelectedIndexChanged += new System.EventHandler(this.comboBoxCustomSearch_SelectedIndexChanged); - // - // labelCustomSearch1 - // - this.labelCustomSearch1.AutoSize = true; - this.labelCustomSearch1.Location = new System.Drawing.Point(12, 41); - this.labelCustomSearch1.Name = "labelCustomSearch1"; - this.labelCustomSearch1.Size = new System.Drawing.Size(13, 13); - this.labelCustomSearch1.TabIndex = 3; - this.labelCustomSearch1.Text = "1"; - // - // textBoxCustomSearchUrl1 - // - this.textBoxCustomSearchUrl1.Location = new System.Drawing.Point(185, 38); - this.textBoxCustomSearchUrl1.Name = "textBoxCustomSearchUrl1"; - this.textBoxCustomSearchUrl1.Size = new System.Drawing.Size(574, 21); - this.textBoxCustomSearchUrl1.TabIndex = 2; - // - // labelCustomSearch - // - this.labelCustomSearch.AutoSize = true; - this.labelCustomSearch.Location = new System.Drawing.Point(12, 20); - this.labelCustomSearch.Name = "labelCustomSearch"; - this.labelCustomSearch.Size = new System.Drawing.Size(144, 13); - this.labelCustomSearch.TabIndex = 1; - this.labelCustomSearch.Text = "Custom search text and URL"; - // - // comboBoxCustomSearch1 - // - this.comboBoxCustomSearch1.FormattingEnabled = true; - this.comboBoxCustomSearch1.Items.AddRange(new object[] { - "Dictionary.com", - "learnersdictionary.com", - "Merriam-Webster", - "The Free Dictionary", - "Thesaurus.com", - "urbandictionary.com", - "VISUWORDS", - "Wikipedia"}); - this.comboBoxCustomSearch1.Location = new System.Drawing.Point(31, 38); - this.comboBoxCustomSearch1.Name = "comboBoxCustomSearch1"; - this.comboBoxCustomSearch1.Size = new System.Drawing.Size(148, 21); - this.comboBoxCustomSearch1.TabIndex = 0; - this.comboBoxCustomSearch1.SelectedIndexChanged += new System.EventHandler(this.comboBoxCustomSearch_SelectedIndexChanged); - // - // groupBoxVideoPlayerDefault - // - this.groupBoxVideoPlayerDefault.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxVideoPlayerDefault.Controls.Add(this.checkBoxAllowVolumeBoost); - this.groupBoxVideoPlayerDefault.Controls.Add(this.checkBoxVideoAutoOpen); - this.groupBoxVideoPlayerDefault.Controls.Add(this.checkBoxVideoPlayerPreviewFontBold); - this.groupBoxVideoPlayerDefault.Controls.Add(this.checkBoxVideoPlayerShowFullscreenButton); - this.groupBoxVideoPlayerDefault.Controls.Add(this.checkBoxVideoPlayerShowMuteButton); - this.groupBoxVideoPlayerDefault.Controls.Add(this.labelVideoPlayerPreviewFontSize); - this.groupBoxVideoPlayerDefault.Controls.Add(this.comboBoxlVideoPlayerPreviewFontSize); - this.groupBoxVideoPlayerDefault.Controls.Add(this.checkBoxVideoPlayerShowStopButton); - this.groupBoxVideoPlayerDefault.Location = new System.Drawing.Point(7, 155); - this.groupBoxVideoPlayerDefault.Name = "groupBoxVideoPlayerDefault"; - this.groupBoxVideoPlayerDefault.Size = new System.Drawing.Size(819, 120); - this.groupBoxVideoPlayerDefault.TabIndex = 14; - this.groupBoxVideoPlayerDefault.TabStop = false; - // - // checkBoxAllowVolumeBoost - // - this.checkBoxAllowVolumeBoost.AutoSize = true; - this.checkBoxAllowVolumeBoost.Location = new System.Drawing.Point(334, 97); - this.checkBoxAllowVolumeBoost.Name = "checkBoxAllowVolumeBoost"; - this.checkBoxAllowVolumeBoost.Size = new System.Drawing.Size(118, 17); - this.checkBoxAllowVolumeBoost.TabIndex = 25; - this.checkBoxAllowVolumeBoost.Text = "Allow volume boost"; - this.checkBoxAllowVolumeBoost.UseVisualStyleBackColor = true; - // - // checkBoxVideoAutoOpen - // - this.checkBoxVideoAutoOpen.AutoSize = true; - this.checkBoxVideoAutoOpen.Location = new System.Drawing.Point(334, 74); - this.checkBoxVideoAutoOpen.Name = "checkBoxVideoAutoOpen"; - this.checkBoxVideoAutoOpen.Size = new System.Drawing.Size(213, 17); - this.checkBoxVideoAutoOpen.TabIndex = 24; - this.checkBoxVideoAutoOpen.Text = "Auto open video when opening subtitle"; - this.checkBoxVideoAutoOpen.UseVisualStyleBackColor = true; - // - // checkBoxVideoPlayerPreviewFontBold - // - this.checkBoxVideoPlayerPreviewFontBold.AutoSize = true; - this.checkBoxVideoPlayerPreviewFontBold.Location = new System.Drawing.Point(465, 45); - this.checkBoxVideoPlayerPreviewFontBold.Name = "checkBoxVideoPlayerPreviewFontBold"; - this.checkBoxVideoPlayerPreviewFontBold.Size = new System.Drawing.Size(46, 17); - this.checkBoxVideoPlayerPreviewFontBold.TabIndex = 23; - this.checkBoxVideoPlayerPreviewFontBold.Text = "Bold"; - this.checkBoxVideoPlayerPreviewFontBold.UseVisualStyleBackColor = true; - // - // checkBoxVideoPlayerShowFullscreenButton - // - this.checkBoxVideoPlayerShowFullscreenButton.AutoSize = true; - this.checkBoxVideoPlayerShowFullscreenButton.Location = new System.Drawing.Point(9, 65); - this.checkBoxVideoPlayerShowFullscreenButton.Name = "checkBoxVideoPlayerShowFullscreenButton"; - this.checkBoxVideoPlayerShowFullscreenButton.Size = new System.Drawing.Size(136, 17); - this.checkBoxVideoPlayerShowFullscreenButton.TabIndex = 12; - this.checkBoxVideoPlayerShowFullscreenButton.Text = "Show fullscreen button"; - this.checkBoxVideoPlayerShowFullscreenButton.UseVisualStyleBackColor = true; - // - // checkBoxVideoPlayerShowMuteButton - // - this.checkBoxVideoPlayerShowMuteButton.AutoSize = true; - this.checkBoxVideoPlayerShowMuteButton.Location = new System.Drawing.Point(9, 42); - this.checkBoxVideoPlayerShowMuteButton.Name = "checkBoxVideoPlayerShowMuteButton"; - this.checkBoxVideoPlayerShowMuteButton.Size = new System.Drawing.Size(114, 17); - this.checkBoxVideoPlayerShowMuteButton.TabIndex = 11; - this.checkBoxVideoPlayerShowMuteButton.Text = "Show mute button"; - this.checkBoxVideoPlayerShowMuteButton.UseVisualStyleBackColor = true; - // - // labelVideoPlayerPreviewFontSize - // - this.labelVideoPlayerPreviewFontSize.AutoSize = true; - this.labelVideoPlayerPreviewFontSize.Location = new System.Drawing.Point(331, 21); - this.labelVideoPlayerPreviewFontSize.Name = "labelVideoPlayerPreviewFontSize"; - this.labelVideoPlayerPreviewFontSize.Size = new System.Drawing.Size(128, 13); - this.labelVideoPlayerPreviewFontSize.TabIndex = 14; - this.labelVideoPlayerPreviewFontSize.Text = "Subtitle preview font size"; - // - // comboBoxlVideoPlayerPreviewFontSize - // - this.comboBoxlVideoPlayerPreviewFontSize.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxlVideoPlayerPreviewFontSize.FormattingEnabled = true; - this.comboBoxlVideoPlayerPreviewFontSize.Items.AddRange(new object[] { - "8", - "9", - "10", - "11", - "12", - "13", - "14", - "15", - "16", - "17", - "18", - "19", - "20", - "21", - "22", - "23", - "24", - "25", - "26", - "27", - "28", - "29", - "30"}); - this.comboBoxlVideoPlayerPreviewFontSize.Location = new System.Drawing.Point(465, 18); - this.comboBoxlVideoPlayerPreviewFontSize.Name = "comboBoxlVideoPlayerPreviewFontSize"; - this.comboBoxlVideoPlayerPreviewFontSize.Size = new System.Drawing.Size(121, 21); - this.comboBoxlVideoPlayerPreviewFontSize.TabIndex = 13; - // - // checkBoxVideoPlayerShowStopButton - // - this.checkBoxVideoPlayerShowStopButton.AutoSize = true; - this.checkBoxVideoPlayerShowStopButton.Location = new System.Drawing.Point(9, 19); - this.checkBoxVideoPlayerShowStopButton.Name = "checkBoxVideoPlayerShowStopButton"; - this.checkBoxVideoPlayerShowStopButton.Size = new System.Drawing.Size(111, 17); - this.checkBoxVideoPlayerShowStopButton.TabIndex = 10; - this.checkBoxVideoPlayerShowStopButton.Text = "Show stop button"; - this.checkBoxVideoPlayerShowStopButton.UseVisualStyleBackColor = true; - // - // groupBoxVideoEngine - // - this.groupBoxVideoEngine.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxVideoEngine.Controls.Add(this.checkBoxMpvHandlesPreviewText); - this.groupBoxVideoEngine.Controls.Add(this.labelMpvSettings); - this.groupBoxVideoEngine.Controls.Add(this.buttonMpvSettings); - this.groupBoxVideoEngine.Controls.Add(this.labelPlatform); - this.groupBoxVideoEngine.Controls.Add(this.buttonVlcPathBrowse); - this.groupBoxVideoEngine.Controls.Add(this.textBoxVlcPath); - this.groupBoxVideoEngine.Controls.Add(this.labelVlcPath); - this.groupBoxVideoEngine.Controls.Add(this.labelVideoPlayerVLC); - this.groupBoxVideoEngine.Controls.Add(this.radioButtonVideoPlayerVLC); - this.groupBoxVideoEngine.Controls.Add(this.labelVideoPlayerMPlayer); - this.groupBoxVideoEngine.Controls.Add(this.labelDirectShowDescription); - this.groupBoxVideoEngine.Controls.Add(this.labelMpcHcDescription); - this.groupBoxVideoEngine.Controls.Add(this.radioButtonVideoPlayerMPV); - this.groupBoxVideoEngine.Controls.Add(this.radioButtonVideoPlayerDirectShow); - this.groupBoxVideoEngine.Controls.Add(this.radioButtonVideoPlayerMpcHc); - this.groupBoxVideoEngine.Location = new System.Drawing.Point(6, 6); - this.groupBoxVideoEngine.Name = "groupBoxVideoEngine"; - this.groupBoxVideoEngine.Size = new System.Drawing.Size(820, 143); - this.groupBoxVideoEngine.TabIndex = 0; - this.groupBoxVideoEngine.TabStop = false; - this.groupBoxVideoEngine.Text = "Video engine"; - // - // checkBoxMpvHandlesPreviewText - // - this.checkBoxMpvHandlesPreviewText.AutoSize = true; - this.checkBoxMpvHandlesPreviewText.Location = new System.Drawing.Point(169, 111); - this.checkBoxMpvHandlesPreviewText.Name = "checkBoxMpvHandlesPreviewText"; - this.checkBoxMpvHandlesPreviewText.Size = new System.Drawing.Size(150, 17); - this.checkBoxMpvHandlesPreviewText.TabIndex = 31; - this.checkBoxMpvHandlesPreviewText.Text = "mpv handles preview text"; - this.checkBoxMpvHandlesPreviewText.UseVisualStyleBackColor = true; - // - // labelMpvSettings - // - this.labelMpvSettings.AutoSize = true; - this.labelMpvSettings.Font = new System.Drawing.Font("Tahoma", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelMpvSettings.ForeColor = System.Drawing.Color.Gray; - this.labelMpvSettings.Location = new System.Drawing.Point(709, 93); - this.labelMpvSettings.Name = "labelMpvSettings"; - this.labelMpvSettings.Size = new System.Drawing.Size(40, 13); - this.labelMpvSettings.TabIndex = 30; - this.labelMpvSettings.Text = "--vo=?"; - // - // buttonMpvSettings - // - this.buttonMpvSettings.Location = new System.Drawing.Point(510, 89); - this.buttonMpvSettings.Name = "buttonMpvSettings"; - this.buttonMpvSettings.Size = new System.Drawing.Size(179, 23); - this.buttonMpvSettings.TabIndex = 29; - this.buttonMpvSettings.Text = "Download mpv dll"; - this.buttonMpvSettings.UseVisualStyleBackColor = true; - this.buttonMpvSettings.Click += new System.EventHandler(this.buttonMpvSettings_Click); - // - // labelPlatform - // - this.labelPlatform.Font = new System.Drawing.Font("Tahoma", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelPlatform.ForeColor = System.Drawing.Color.Gray; - this.labelPlatform.Location = new System.Drawing.Point(724, 13); - this.labelPlatform.Name = "labelPlatform"; - this.labelPlatform.Size = new System.Drawing.Size(83, 11); - this.labelPlatform.TabIndex = 27; - this.labelPlatform.Text = "x-bit"; - this.labelPlatform.TextAlign = System.Drawing.ContentAlignment.TopRight; - // - // buttonVlcPathBrowse - // - this.buttonVlcPathBrowse.Location = new System.Drawing.Point(778, 44); - this.buttonVlcPathBrowse.Name = "buttonVlcPathBrowse"; - this.buttonVlcPathBrowse.Size = new System.Drawing.Size(29, 21); - this.buttonVlcPathBrowse.TabIndex = 26; - this.buttonVlcPathBrowse.Text = "..."; - this.buttonVlcPathBrowse.UseVisualStyleBackColor = true; - this.buttonVlcPathBrowse.Click += new System.EventHandler(this.buttonVlcPathBrowse_Click); - // - // textBoxVlcPath - // - this.textBoxVlcPath.Location = new System.Drawing.Point(410, 45); - this.textBoxVlcPath.MaxLength = 1000; - this.textBoxVlcPath.Name = "textBoxVlcPath"; - this.textBoxVlcPath.Size = new System.Drawing.Size(362, 21); - this.textBoxVlcPath.TabIndex = 25; - this.textBoxVlcPath.MouseLeave += new System.EventHandler(this.textBoxVlcPath_MouseLeave); - // - // labelVlcPath - // - this.labelVlcPath.AutoSize = true; - this.labelVlcPath.Location = new System.Drawing.Point(379, 29); - this.labelVlcPath.Name = "labelVlcPath"; - this.labelVlcPath.Size = new System.Drawing.Size(315, 13); - this.labelVlcPath.TabIndex = 24; - this.labelVlcPath.Text = "VLC path (only needed if you using the portable version of VLC)"; - // - // labelVideoPlayerVLC - // - this.labelVideoPlayerVLC.AutoSize = true; - this.labelVideoPlayerVLC.Font = new System.Drawing.Font("Tahoma", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelVideoPlayerVLC.ForeColor = System.Drawing.Color.Gray; - this.labelVideoPlayerVLC.Location = new System.Drawing.Point(167, 49); - this.labelVideoPlayerVLC.Name = "labelVideoPlayerVLC"; - this.labelVideoPlayerVLC.Size = new System.Drawing.Size(237, 13); - this.labelVideoPlayerVLC.TabIndex = 13; - this.labelVideoPlayerVLC.Text = "libvlc.dll from VLC media player (1.1.0 or newer)"; - // - // radioButtonVideoPlayerVLC - // - this.radioButtonVideoPlayerVLC.AutoSize = true; - this.radioButtonVideoPlayerVLC.Location = new System.Drawing.Point(10, 46); - this.radioButtonVideoPlayerVLC.Name = "radioButtonVideoPlayerVLC"; - this.radioButtonVideoPlayerVLC.Size = new System.Drawing.Size(43, 17); - this.radioButtonVideoPlayerVLC.TabIndex = 4; - this.radioButtonVideoPlayerVLC.TabStop = true; - this.radioButtonVideoPlayerVLC.Text = "VLC"; - this.radioButtonVideoPlayerVLC.UseVisualStyleBackColor = true; - // - // labelVideoPlayerMPlayer - // - this.labelVideoPlayerMPlayer.AutoSize = true; - this.labelVideoPlayerMPlayer.Font = new System.Drawing.Font("Tahoma", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelVideoPlayerMPlayer.ForeColor = System.Drawing.Color.Gray; - this.labelVideoPlayerMPlayer.Location = new System.Drawing.Point(167, 93); - this.labelVideoPlayerMPlayer.Name = "labelVideoPlayerMPlayer"; - this.labelVideoPlayerMPlayer.Size = new System.Drawing.Size(337, 13); - this.labelVideoPlayerMPlayer.TabIndex = 11; - this.labelVideoPlayerMPlayer.Text = "https://mpv.io/ - free, open source, and cross-platform media player"; - // - // labelDirectShowDescription - // - this.labelDirectShowDescription.AutoSize = true; - this.labelDirectShowDescription.Font = new System.Drawing.Font("Tahoma", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelDirectShowDescription.ForeColor = System.Drawing.Color.Gray; - this.labelDirectShowDescription.Location = new System.Drawing.Point(167, 26); - this.labelDirectShowDescription.Name = "labelDirectShowDescription"; - this.labelDirectShowDescription.Size = new System.Drawing.Size(114, 13); - this.labelDirectShowDescription.TabIndex = 10; - this.labelDirectShowDescription.Text = "Quartz.dll in system32"; - // - // labelMpcHcDescription - // - this.labelMpcHcDescription.AutoSize = true; - this.labelMpcHcDescription.Font = new System.Drawing.Font("Tahoma", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelMpcHcDescription.ForeColor = System.Drawing.Color.Gray; - this.labelMpcHcDescription.Location = new System.Drawing.Point(167, 70); - this.labelMpcHcDescription.Name = "labelMpcHcDescription"; - this.labelMpcHcDescription.Size = new System.Drawing.Size(178, 13); - this.labelMpcHcDescription.TabIndex = 9; - this.labelMpcHcDescription.Text = "Media Player Classic - Home Cinema"; - // - // radioButtonVideoPlayerMPV - // - this.radioButtonVideoPlayerMPV.AutoSize = true; - this.radioButtonVideoPlayerMPV.Location = new System.Drawing.Point(10, 89); - this.radioButtonVideoPlayerMPV.Name = "radioButtonVideoPlayerMPV"; - this.radioButtonVideoPlayerMPV.Size = new System.Drawing.Size(45, 17); - this.radioButtonVideoPlayerMPV.TabIndex = 28; - this.radioButtonVideoPlayerMPV.TabStop = true; - this.radioButtonVideoPlayerMPV.Text = "mpv"; - this.radioButtonVideoPlayerMPV.UseVisualStyleBackColor = true; - this.radioButtonVideoPlayerMPV.CheckedChanged += new System.EventHandler(this.radioButtonVideoPlayerMPV_CheckedChanged); - // - // radioButtonVideoPlayerDirectShow - // - this.radioButtonVideoPlayerDirectShow.AutoSize = true; - this.radioButtonVideoPlayerDirectShow.Location = new System.Drawing.Point(10, 23); - this.radioButtonVideoPlayerDirectShow.Name = "radioButtonVideoPlayerDirectShow"; - this.radioButtonVideoPlayerDirectShow.Size = new System.Drawing.Size(82, 17); - this.radioButtonVideoPlayerDirectShow.TabIndex = 1; - this.radioButtonVideoPlayerDirectShow.TabStop = true; - this.radioButtonVideoPlayerDirectShow.Text = "DirectShow "; - this.radioButtonVideoPlayerDirectShow.UseVisualStyleBackColor = true; - // - // radioButtonVideoPlayerMpcHc - // - this.radioButtonVideoPlayerMpcHc.AutoSize = true; - this.radioButtonVideoPlayerMpcHc.Location = new System.Drawing.Point(10, 66); - this.radioButtonVideoPlayerMpcHc.Name = "radioButtonVideoPlayerMpcHc"; - this.radioButtonVideoPlayerMpcHc.Size = new System.Drawing.Size(64, 17); - this.radioButtonVideoPlayerMpcHc.TabIndex = 27; - this.radioButtonVideoPlayerMpcHc.TabStop = true; - this.radioButtonVideoPlayerMpcHc.Text = "MPC-HC"; - this.radioButtonVideoPlayerMpcHc.UseVisualStyleBackColor = true; - // - // tabPageWaveform - // - this.tabPageWaveform.Controls.Add(this.groupBoxFfmpeg); - this.tabPageWaveform.Controls.Add(this.groupBoxSpectrogram); - this.tabPageWaveform.Controls.Add(this.groupBox1); - this.tabPageWaveform.Controls.Add(this.groupBoxWaveformAppearence); - this.tabPageWaveform.Location = new System.Drawing.Point(4, 22); - this.tabPageWaveform.Name = "tabPageWaveform"; - this.tabPageWaveform.Size = new System.Drawing.Size(832, 520); - this.tabPageWaveform.TabIndex = 6; - this.tabPageWaveform.Text = "Waveform/spectrogram"; - this.tabPageWaveform.UseVisualStyleBackColor = true; - // - // groupBoxFfmpeg - // - this.groupBoxFfmpeg.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxFfmpeg.Controls.Add(this.buttonDownloadFfmpeg); - this.groupBoxFfmpeg.Controls.Add(this.buttonBrowseToFFmpeg); - this.groupBoxFfmpeg.Controls.Add(this.textBoxFFmpegPath); - this.groupBoxFfmpeg.Controls.Add(this.labelFFmpegPath); - this.groupBoxFfmpeg.Controls.Add(this.checkBoxUseFFmpeg); - this.groupBoxFfmpeg.Location = new System.Drawing.Point(406, 299); - this.groupBoxFfmpeg.Name = "groupBoxFfmpeg"; - this.groupBoxFfmpeg.Size = new System.Drawing.Size(419, 118); - this.groupBoxFfmpeg.TabIndex = 2; - this.groupBoxFfmpeg.TabStop = false; - this.groupBoxFfmpeg.Text = "FFmpeg"; - // - // buttonDownloadFfmpeg - // - this.buttonDownloadFfmpeg.Location = new System.Drawing.Point(274, 17); - this.buttonDownloadFfmpeg.Name = "buttonDownloadFfmpeg"; - this.buttonDownloadFfmpeg.Size = new System.Drawing.Size(136, 23); - this.buttonDownloadFfmpeg.TabIndex = 2; - this.buttonDownloadFfmpeg.Text = "Download ffmpeg"; - this.buttonDownloadFfmpeg.UseVisualStyleBackColor = true; - this.buttonDownloadFfmpeg.Click += new System.EventHandler(this.buttonDownloadFfmpeg_Click); - // - // buttonBrowseToFFmpeg - // - this.buttonBrowseToFFmpeg.Location = new System.Drawing.Point(381, 65); - this.buttonBrowseToFFmpeg.Name = "buttonBrowseToFFmpeg"; - this.buttonBrowseToFFmpeg.Size = new System.Drawing.Size(29, 21); - this.buttonBrowseToFFmpeg.TabIndex = 23; - this.buttonBrowseToFFmpeg.Text = "..."; - this.buttonBrowseToFFmpeg.UseVisualStyleBackColor = true; - this.buttonBrowseToFFmpeg.Click += new System.EventHandler(this.buttonBrowseToFFmpeg_Click); - // - // textBoxFFmpegPath - // - this.textBoxFFmpegPath.Location = new System.Drawing.Point(9, 65); - this.textBoxFFmpegPath.MaxLength = 1000; - this.textBoxFFmpegPath.Name = "textBoxFFmpegPath"; - this.textBoxFFmpegPath.Size = new System.Drawing.Size(366, 21); - this.textBoxFFmpegPath.TabIndex = 22; - // - // labelFFmpegPath - // - this.labelFFmpegPath.AutoSize = true; - this.labelFFmpegPath.Location = new System.Drawing.Point(6, 49); - this.labelFFmpegPath.Name = "labelFFmpegPath"; - this.labelFFmpegPath.Size = new System.Drawing.Size(70, 13); - this.labelFFmpegPath.TabIndex = 2; - this.labelFFmpegPath.Text = "FFmpeg path"; - // - // checkBoxUseFFmpeg - // - this.checkBoxUseFFmpeg.AutoSize = true; - this.checkBoxUseFFmpeg.Location = new System.Drawing.Point(6, 20); - this.checkBoxUseFFmpeg.Name = "checkBoxUseFFmpeg"; - this.checkBoxUseFFmpeg.Size = new System.Drawing.Size(200, 17); - this.checkBoxUseFFmpeg.TabIndex = 1; - this.checkBoxUseFFmpeg.Text = "Use FFmpeg for wave file extraction"; - this.checkBoxUseFFmpeg.UseVisualStyleBackColor = true; - // - // groupBoxSpectrogram - // - this.groupBoxSpectrogram.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxSpectrogram.Controls.Add(this.labelSpectrogramAppearance); - this.groupBoxSpectrogram.Controls.Add(this.comboBoxSpectrogramAppearance); - this.groupBoxSpectrogram.Controls.Add(this.checkBoxGenerateSpectrogram); - this.groupBoxSpectrogram.Location = new System.Drawing.Point(6, 299); - this.groupBoxSpectrogram.Name = "groupBoxSpectrogram"; - this.groupBoxSpectrogram.Size = new System.Drawing.Size(394, 118); - this.groupBoxSpectrogram.TabIndex = 1; - this.groupBoxSpectrogram.TabStop = false; - this.groupBoxSpectrogram.Text = "Spectrogram"; - // - // labelSpectrogramAppearance - // - this.labelSpectrogramAppearance.AutoSize = true; - this.labelSpectrogramAppearance.Location = new System.Drawing.Point(10, 52); - this.labelSpectrogramAppearance.Name = "labelSpectrogramAppearance"; - this.labelSpectrogramAppearance.Size = new System.Drawing.Size(164, 13); - this.labelSpectrogramAppearance.TabIndex = 1; - this.labelSpectrogramAppearance.Text = "Appearance (at generation time)"; - // - // comboBoxSpectrogramAppearance - // - this.comboBoxSpectrogramAppearance.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxSpectrogramAppearance.FormattingEnabled = true; - this.comboBoxSpectrogramAppearance.Items.AddRange(new object[] { - "Classic", - "Use waveform color (one color gradient)"}); - this.comboBoxSpectrogramAppearance.Location = new System.Drawing.Point(10, 70); - this.comboBoxSpectrogramAppearance.Name = "comboBoxSpectrogramAppearance"; - this.comboBoxSpectrogramAppearance.Size = new System.Drawing.Size(325, 21); - this.comboBoxSpectrogramAppearance.TabIndex = 2; - // - // checkBoxGenerateSpectrogram - // - this.checkBoxGenerateSpectrogram.AutoSize = true; - this.checkBoxGenerateSpectrogram.Location = new System.Drawing.Point(10, 20); - this.checkBoxGenerateSpectrogram.Name = "checkBoxGenerateSpectrogram"; - this.checkBoxGenerateSpectrogram.Size = new System.Drawing.Size(134, 17); - this.checkBoxGenerateSpectrogram.TabIndex = 0; - this.checkBoxGenerateSpectrogram.Text = "Generate spectrogram"; - this.checkBoxGenerateSpectrogram.UseVisualStyleBackColor = true; - // - // groupBox1 - // - this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left))); - this.groupBox1.Controls.Add(this.buttonWaveformsFolderEmpty); - this.groupBox1.Controls.Add(this.labelWaveformsFolderInfo); - this.groupBox1.Location = new System.Drawing.Point(10, 423); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(819, 80); - this.groupBox1.TabIndex = 3; - this.groupBox1.TabStop = false; - // - // buttonWaveformsFolderEmpty - // - this.buttonWaveformsFolderEmpty.Location = new System.Drawing.Point(10, 37); - this.buttonWaveformsFolderEmpty.Name = "buttonWaveformsFolderEmpty"; - this.buttonWaveformsFolderEmpty.Size = new System.Drawing.Size(325, 23); - this.buttonWaveformsFolderEmpty.TabIndex = 1; - this.buttonWaveformsFolderEmpty.Text = "Empty \'Waveforms\' folder"; - this.buttonWaveformsFolderEmpty.UseVisualStyleBackColor = true; - this.buttonWaveformsFolderEmpty.Click += new System.EventHandler(this.buttonWaveformsFolderEmpty_Click); - // - // labelWaveformsFolderInfo - // - this.labelWaveformsFolderInfo.AutoSize = true; - this.labelWaveformsFolderInfo.Location = new System.Drawing.Point(10, 20); - this.labelWaveformsFolderInfo.Name = "labelWaveformsFolderInfo"; - this.labelWaveformsFolderInfo.Size = new System.Drawing.Size(205, 13); - this.labelWaveformsFolderInfo.TabIndex = 0; - this.labelWaveformsFolderInfo.Text = "\'Waveforms\' folder contains x files (x mb)"; - // - // groupBoxWaveformAppearence - // - this.groupBoxWaveformAppearence.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxWaveformAppearence.Controls.Add(this.panelWaveformCursorColor); - this.groupBoxWaveformAppearence.Controls.Add(this.buttonWaveformCursorColor); - this.groupBoxWaveformAppearence.Controls.Add(this.checkBoxWaveformSnapToSceneChanges); - this.groupBoxWaveformAppearence.Controls.Add(this.checkBoxWaveformSingleClickSelect); - this.groupBoxWaveformAppearence.Controls.Add(this.checkBoxWaveformShowWpm); - this.groupBoxWaveformAppearence.Controls.Add(this.checkBoxWaveformShowCps); - this.groupBoxWaveformAppearence.Controls.Add(this.checkBoxWaveformSetVideoPosMoveStartEnd); - this.groupBoxWaveformAppearence.Controls.Add(this.labelWaveformTextSize); - this.groupBoxWaveformAppearence.Controls.Add(this.checkBoxWaveformTextBold); - this.groupBoxWaveformAppearence.Controls.Add(this.comboBoxWaveformTextSize); - this.groupBoxWaveformAppearence.Controls.Add(this.checkBoxListViewMouseEnterFocus); - this.groupBoxWaveformAppearence.Controls.Add(this.checkBoxWaveformHoverFocus); - this.groupBoxWaveformAppearence.Controls.Add(this.labelWaveformBorderHitMs2); - this.groupBoxWaveformAppearence.Controls.Add(this.numericUpDownWaveformBorderHitMs); - this.groupBoxWaveformAppearence.Controls.Add(this.labelWaveformBorderHitMs1); - this.groupBoxWaveformAppearence.Controls.Add(this.checkBoxAllowOverlap); - this.groupBoxWaveformAppearence.Controls.Add(this.checkBoxReverseMouseWheelScrollDirection); - this.groupBoxWaveformAppearence.Controls.Add(this.panelWaveformTextColor); - this.groupBoxWaveformAppearence.Controls.Add(this.buttonWaveformTextColor); - this.groupBoxWaveformAppearence.Controls.Add(this.panelWaveformGridColor); - this.groupBoxWaveformAppearence.Controls.Add(this.buttonWaveformGridColor); - this.groupBoxWaveformAppearence.Controls.Add(this.panelWaveformBackgroundColor); - this.groupBoxWaveformAppearence.Controls.Add(this.buttonWaveformBackgroundColor); - this.groupBoxWaveformAppearence.Controls.Add(this.panelWaveformColor); - this.groupBoxWaveformAppearence.Controls.Add(this.buttonWaveformColor); - this.groupBoxWaveformAppearence.Controls.Add(this.panelWaveformSelectedColor); - this.groupBoxWaveformAppearence.Controls.Add(this.buttonWaveformSelectedColor); - this.groupBoxWaveformAppearence.Controls.Add(this.checkBoxWaveformShowGrid); - this.groupBoxWaveformAppearence.Location = new System.Drawing.Point(6, 6); - this.groupBoxWaveformAppearence.Name = "groupBoxWaveformAppearence"; - this.groupBoxWaveformAppearence.Size = new System.Drawing.Size(819, 287); - this.groupBoxWaveformAppearence.TabIndex = 0; - this.groupBoxWaveformAppearence.TabStop = false; - this.groupBoxWaveformAppearence.Text = "Waveform appearance"; - // - // panelWaveformCursorColor - // - this.panelWaveformCursorColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.panelWaveformCursorColor.Location = new System.Drawing.Point(138, 142); - this.panelWaveformCursorColor.Name = "panelWaveformCursorColor"; - this.panelWaveformCursorColor.Size = new System.Drawing.Size(21, 20); - this.panelWaveformCursorColor.TabIndex = 34; - this.panelWaveformCursorColor.Click += new System.EventHandler(this.buttonWaveformCursorColor_Click); - // - // buttonWaveformCursorColor - // - this.buttonWaveformCursorColor.Location = new System.Drawing.Point(14, 141); - this.buttonWaveformCursorColor.Name = "buttonWaveformCursorColor"; - this.buttonWaveformCursorColor.Size = new System.Drawing.Size(112, 23); - this.buttonWaveformCursorColor.TabIndex = 4; - this.buttonWaveformCursorColor.Text = "Cursor color"; - this.buttonWaveformCursorColor.UseVisualStyleBackColor = true; - this.buttonWaveformCursorColor.Click += new System.EventHandler(this.buttonWaveformCursorColor_Click); - // - // checkBoxWaveformSnapToSceneChanges - // - this.checkBoxWaveformSnapToSceneChanges.AutoSize = true; - this.checkBoxWaveformSnapToSceneChanges.Location = new System.Drawing.Point(262, 161); - this.checkBoxWaveformSnapToSceneChanges.Name = "checkBoxWaveformSnapToSceneChanges"; - this.checkBoxWaveformSnapToSceneChanges.Size = new System.Drawing.Size(249, 17); - this.checkBoxWaveformSnapToSceneChanges.TabIndex = 26; - this.checkBoxWaveformSnapToSceneChanges.Text = "Snap to scene changes (hold Shift to override)"; - this.checkBoxWaveformSnapToSceneChanges.UseVisualStyleBackColor = true; - // - // checkBoxWaveformSingleClickSelect - // - this.checkBoxWaveformSingleClickSelect.AutoSize = true; - this.checkBoxWaveformSingleClickSelect.Location = new System.Drawing.Point(262, 138); - this.checkBoxWaveformSingleClickSelect.Name = "checkBoxWaveformSingleClickSelect"; - this.checkBoxWaveformSingleClickSelect.Size = new System.Drawing.Size(178, 17); - this.checkBoxWaveformSingleClickSelect.TabIndex = 25; - this.checkBoxWaveformSingleClickSelect.Text = "Single click to select paragraphs"; - this.checkBoxWaveformSingleClickSelect.UseVisualStyleBackColor = true; - // - // checkBoxWaveformShowWpm - // - this.checkBoxWaveformShowWpm.AutoSize = true; - this.checkBoxWaveformShowWpm.Location = new System.Drawing.Point(16, 256); - this.checkBoxWaveformShowWpm.Name = "checkBoxWaveformShowWpm"; - this.checkBoxWaveformShowWpm.Size = new System.Drawing.Size(104, 17); - this.checkBoxWaveformShowWpm.TabIndex = 8; - this.checkBoxWaveformShowWpm.Text = "Show words/min"; - this.checkBoxWaveformShowWpm.UseVisualStyleBackColor = true; - // - // checkBoxWaveformShowCps - // - this.checkBoxWaveformShowCps.AutoSize = true; - this.checkBoxWaveformShowCps.Location = new System.Drawing.Point(16, 233); - this.checkBoxWaveformShowCps.Name = "checkBoxWaveformShowCps"; - this.checkBoxWaveformShowCps.Size = new System.Drawing.Size(96, 17); - this.checkBoxWaveformShowCps.TabIndex = 7; - this.checkBoxWaveformShowCps.Text = "Show char/sec"; - this.checkBoxWaveformShowCps.UseVisualStyleBackColor = true; - // - // checkBoxWaveformSetVideoPosMoveStartEnd - // - this.checkBoxWaveformSetVideoPosMoveStartEnd.AutoSize = true; - this.checkBoxWaveformSetVideoPosMoveStartEnd.Location = new System.Drawing.Point(262, 73); - this.checkBoxWaveformSetVideoPosMoveStartEnd.Name = "checkBoxWaveformSetVideoPosMoveStartEnd"; - this.checkBoxWaveformSetVideoPosMoveStartEnd.Size = new System.Drawing.Size(225, 17); - this.checkBoxWaveformSetVideoPosMoveStartEnd.TabIndex = 22; - this.checkBoxWaveformSetVideoPosMoveStartEnd.Text = "Set video position when moving start/end"; - this.checkBoxWaveformSetVideoPosMoveStartEnd.UseVisualStyleBackColor = true; - // - // labelWaveformTextSize - // - this.labelWaveformTextSize.AutoSize = true; - this.labelWaveformTextSize.Location = new System.Drawing.Point(259, 194); - this.labelWaveformTextSize.Name = "labelWaveformTextSize"; - this.labelWaveformTextSize.Size = new System.Drawing.Size(73, 13); - this.labelWaveformTextSize.TabIndex = 27; - this.labelWaveformTextSize.Text = "Text font size"; - // - // checkBoxWaveformTextBold - // - this.checkBoxWaveformTextBold.AutoSize = true; - this.checkBoxWaveformTextBold.Location = new System.Drawing.Point(463, 195); - this.checkBoxWaveformTextBold.Name = "checkBoxWaveformTextBold"; - this.checkBoxWaveformTextBold.Size = new System.Drawing.Size(46, 17); - this.checkBoxWaveformTextBold.TabIndex = 29; - this.checkBoxWaveformTextBold.Text = "Bold"; - this.checkBoxWaveformTextBold.UseVisualStyleBackColor = true; - // - // comboBoxWaveformTextSize - // - this.comboBoxWaveformTextSize.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxWaveformTextSize.FormattingEnabled = true; - this.comboBoxWaveformTextSize.Items.AddRange(new object[] { - "7", - "8", - "9", - "10", - "11", - "12", - "13", - "14", - "15", - "16", - "17", - "18", - "19", - "20"}); - this.comboBoxWaveformTextSize.Location = new System.Drawing.Point(336, 191); - this.comboBoxWaveformTextSize.Name = "comboBoxWaveformTextSize"; - this.comboBoxWaveformTextSize.Size = new System.Drawing.Size(121, 21); - this.comboBoxWaveformTextSize.TabIndex = 28; - // - // checkBoxListViewMouseEnterFocus - // - this.checkBoxListViewMouseEnterFocus.AutoSize = true; - this.checkBoxListViewMouseEnterFocus.Location = new System.Drawing.Point(281, 115); - this.checkBoxListViewMouseEnterFocus.Name = "checkBoxListViewMouseEnterFocus"; - this.checkBoxListViewMouseEnterFocus.Size = new System.Drawing.Size(214, 17); - this.checkBoxListViewMouseEnterFocus.TabIndex = 24; - this.checkBoxListViewMouseEnterFocus.Text = "Focus list view on list view mouse enter"; - this.checkBoxListViewMouseEnterFocus.UseVisualStyleBackColor = true; - // - // checkBoxWaveformHoverFocus - // - this.checkBoxWaveformHoverFocus.AutoSize = true; - this.checkBoxWaveformHoverFocus.Location = new System.Drawing.Point(262, 96); - this.checkBoxWaveformHoverFocus.Name = "checkBoxWaveformHoverFocus"; - this.checkBoxWaveformHoverFocus.Size = new System.Drawing.Size(149, 17); - this.checkBoxWaveformHoverFocus.TabIndex = 23; - this.checkBoxWaveformHoverFocus.Text = "Set focus on mouse enter"; - this.checkBoxWaveformHoverFocus.UseVisualStyleBackColor = true; - this.checkBoxWaveformHoverFocus.CheckedChanged += new System.EventHandler(this.checkBoxWaveformHoverFocus_CheckedChanged); - // - // labelWaveformBorderHitMs2 - // - this.labelWaveformBorderHitMs2.AutoSize = true; - this.labelWaveformBorderHitMs2.Location = new System.Drawing.Point(454, 224); - this.labelWaveformBorderHitMs2.Name = "labelWaveformBorderHitMs2"; - this.labelWaveformBorderHitMs2.Size = new System.Drawing.Size(62, 13); - this.labelWaveformBorderHitMs2.TabIndex = 32; - this.labelWaveformBorderHitMs2.Text = "milliseconds"; - // - // numericUpDownWaveformBorderHitMs - // - this.numericUpDownWaveformBorderHitMs.Location = new System.Drawing.Point(392, 222); - this.numericUpDownWaveformBorderHitMs.Minimum = new decimal(new int[] { - 10, - 0, - 0, - 0}); - this.numericUpDownWaveformBorderHitMs.Name = "numericUpDownWaveformBorderHitMs"; - this.numericUpDownWaveformBorderHitMs.Size = new System.Drawing.Size(44, 21); - this.numericUpDownWaveformBorderHitMs.TabIndex = 31; - this.numericUpDownWaveformBorderHitMs.Value = new decimal(new int[] { - 18, - 0, - 0, - 0}); - // - // labelWaveformBorderHitMs1 - // - this.labelWaveformBorderHitMs1.AutoSize = true; - this.labelWaveformBorderHitMs1.Location = new System.Drawing.Point(259, 224); - this.labelWaveformBorderHitMs1.Name = "labelWaveformBorderHitMs1"; - this.labelWaveformBorderHitMs1.Size = new System.Drawing.Size(127, 13); - this.labelWaveformBorderHitMs1.TabIndex = 30; - this.labelWaveformBorderHitMs1.Text = "Marker hit must be within"; - // - // checkBoxAllowOverlap - // - this.checkBoxAllowOverlap.AutoSize = true; - this.checkBoxAllowOverlap.Location = new System.Drawing.Point(262, 50); - this.checkBoxAllowOverlap.Name = "checkBoxAllowOverlap"; - this.checkBoxAllowOverlap.Size = new System.Drawing.Size(212, 17); - this.checkBoxAllowOverlap.TabIndex = 21; - this.checkBoxAllowOverlap.Text = "Allow overlap (when dragging/resizing)"; - this.checkBoxAllowOverlap.UseVisualStyleBackColor = true; - // - // checkBoxReverseMouseWheelScrollDirection - // - this.checkBoxReverseMouseWheelScrollDirection.AutoSize = true; - this.checkBoxReverseMouseWheelScrollDirection.Location = new System.Drawing.Point(262, 27); - this.checkBoxReverseMouseWheelScrollDirection.Name = "checkBoxReverseMouseWheelScrollDirection"; - this.checkBoxReverseMouseWheelScrollDirection.Size = new System.Drawing.Size(202, 17); - this.checkBoxReverseMouseWheelScrollDirection.TabIndex = 20; - this.checkBoxReverseMouseWheelScrollDirection.Text = "Reverse mouse wheel scroll direction"; - this.checkBoxReverseMouseWheelScrollDirection.UseVisualStyleBackColor = true; - // - // panelWaveformTextColor - // - this.panelWaveformTextColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.panelWaveformTextColor.Location = new System.Drawing.Point(138, 113); - this.panelWaveformTextColor.Name = "panelWaveformTextColor"; - this.panelWaveformTextColor.Size = new System.Drawing.Size(21, 20); - this.panelWaveformTextColor.TabIndex = 7; - this.panelWaveformTextColor.Click += new System.EventHandler(this.buttonWaveformTextColor_Click); - // - // buttonWaveformTextColor - // - this.buttonWaveformTextColor.Location = new System.Drawing.Point(14, 112); - this.buttonWaveformTextColor.Name = "buttonWaveformTextColor"; - this.buttonWaveformTextColor.Size = new System.Drawing.Size(112, 23); - this.buttonWaveformTextColor.TabIndex = 3; - this.buttonWaveformTextColor.Text = "Text color"; - this.buttonWaveformTextColor.UseVisualStyleBackColor = true; - this.buttonWaveformTextColor.Click += new System.EventHandler(this.buttonWaveformTextColor_Click); - // - // panelWaveformGridColor - // - this.panelWaveformGridColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.panelWaveformGridColor.Location = new System.Drawing.Point(138, 171); - this.panelWaveformGridColor.Name = "panelWaveformGridColor"; - this.panelWaveformGridColor.Size = new System.Drawing.Size(21, 20); - this.panelWaveformGridColor.TabIndex = 9; - this.panelWaveformGridColor.Click += new System.EventHandler(this.buttonWaveformGridColor_Click); - // - // buttonWaveformGridColor - // - this.buttonWaveformGridColor.Location = new System.Drawing.Point(14, 170); - this.buttonWaveformGridColor.Name = "buttonWaveformGridColor"; - this.buttonWaveformGridColor.Size = new System.Drawing.Size(112, 23); - this.buttonWaveformGridColor.TabIndex = 5; - this.buttonWaveformGridColor.Text = "Grid color"; - this.buttonWaveformGridColor.UseVisualStyleBackColor = true; - this.buttonWaveformGridColor.Click += new System.EventHandler(this.buttonWaveformGridColor_Click); - // - // panelWaveformBackgroundColor - // - this.panelWaveformBackgroundColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.panelWaveformBackgroundColor.Location = new System.Drawing.Point(138, 84); - this.panelWaveformBackgroundColor.Name = "panelWaveformBackgroundColor"; - this.panelWaveformBackgroundColor.Size = new System.Drawing.Size(21, 20); - this.panelWaveformBackgroundColor.TabIndex = 5; - this.panelWaveformBackgroundColor.Click += new System.EventHandler(this.buttonWaveformBackgroundColor_Click); - // - // buttonWaveformBackgroundColor - // - this.buttonWaveformBackgroundColor.Location = new System.Drawing.Point(14, 83); - this.buttonWaveformBackgroundColor.Name = "buttonWaveformBackgroundColor"; - this.buttonWaveformBackgroundColor.Size = new System.Drawing.Size(112, 23); - this.buttonWaveformBackgroundColor.TabIndex = 2; - this.buttonWaveformBackgroundColor.Text = "Back color"; - this.buttonWaveformBackgroundColor.UseVisualStyleBackColor = true; - this.buttonWaveformBackgroundColor.Click += new System.EventHandler(this.buttonWaveformBackgroundColor_Click); - // - // panelWaveformColor - // - this.panelWaveformColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.panelWaveformColor.Location = new System.Drawing.Point(138, 55); - this.panelWaveformColor.Name = "panelWaveformColor"; - this.panelWaveformColor.Size = new System.Drawing.Size(21, 20); - this.panelWaveformColor.TabIndex = 3; - this.panelWaveformColor.Click += new System.EventHandler(this.buttonWaveformColor_Click); - // - // buttonWaveformColor - // - this.buttonWaveformColor.Location = new System.Drawing.Point(14, 54); - this.buttonWaveformColor.Name = "buttonWaveformColor"; - this.buttonWaveformColor.Size = new System.Drawing.Size(112, 23); - this.buttonWaveformColor.TabIndex = 1; - this.buttonWaveformColor.Text = "Color"; - this.buttonWaveformColor.UseVisualStyleBackColor = true; - this.buttonWaveformColor.Click += new System.EventHandler(this.buttonWaveformColor_Click); - // - // panelWaveformSelectedColor - // - this.panelWaveformSelectedColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.panelWaveformSelectedColor.Location = new System.Drawing.Point(138, 26); - this.panelWaveformSelectedColor.Name = "panelWaveformSelectedColor"; - this.panelWaveformSelectedColor.Size = new System.Drawing.Size(21, 20); - this.panelWaveformSelectedColor.TabIndex = 1; - this.panelWaveformSelectedColor.MouseClick += new System.Windows.Forms.MouseEventHandler(this.buttonWaveformSelectedColor_Click); - // - // buttonWaveformSelectedColor - // - this.buttonWaveformSelectedColor.Location = new System.Drawing.Point(14, 25); - this.buttonWaveformSelectedColor.Name = "buttonWaveformSelectedColor"; - this.buttonWaveformSelectedColor.Size = new System.Drawing.Size(112, 23); - this.buttonWaveformSelectedColor.TabIndex = 0; - this.buttonWaveformSelectedColor.Text = "Selected color"; - this.buttonWaveformSelectedColor.UseVisualStyleBackColor = true; - this.buttonWaveformSelectedColor.Click += new System.EventHandler(this.buttonWaveformSelectedColor_Click); - // - // checkBoxWaveformShowGrid - // - this.checkBoxWaveformShowGrid.AutoSize = true; - this.checkBoxWaveformShowGrid.Location = new System.Drawing.Point(16, 201); - this.checkBoxWaveformShowGrid.Name = "checkBoxWaveformShowGrid"; - this.checkBoxWaveformShowGrid.Size = new System.Drawing.Size(73, 17); - this.checkBoxWaveformShowGrid.TabIndex = 6; - this.checkBoxWaveformShowGrid.Text = "Show grid"; - this.checkBoxWaveformShowGrid.UseVisualStyleBackColor = true; - // - // tabPageTools - // - this.tabPageTools.Controls.Add(this.groupBoxGoogleTranslate); - this.tabPageTools.Controls.Add(this.groupBoxBing); - this.tabPageTools.Controls.Add(this.groupBoxToolsAutoBr); - this.tabPageTools.Controls.Add(this.groupBoxSpellCheck); - this.tabPageTools.Controls.Add(this.groupBoxFixCommonErrors); - this.tabPageTools.Controls.Add(this.groupBoxToolsVisualSync); - this.tabPageTools.Location = new System.Drawing.Point(4, 22); - this.tabPageTools.Name = "tabPageTools"; - this.tabPageTools.Padding = new System.Windows.Forms.Padding(3); - this.tabPageTools.Size = new System.Drawing.Size(832, 520); - this.tabPageTools.TabIndex = 5; - this.tabPageTools.Text = "Tools"; - this.tabPageTools.UseVisualStyleBackColor = true; - // - // groupBoxGoogleTranslate - // - this.groupBoxGoogleTranslate.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxGoogleTranslate.Controls.Add(this.labelGoogleTranslateApiKey); - this.groupBoxGoogleTranslate.Controls.Add(this.textBoxGoogleTransleApiKey); - this.groupBoxGoogleTranslate.Controls.Add(this.linkLabelGoogleTranslateSignUp); - this.groupBoxGoogleTranslate.Controls.Add(this.label3); - this.groupBoxGoogleTranslate.Location = new System.Drawing.Point(421, 244); - this.groupBoxGoogleTranslate.Name = "groupBoxGoogleTranslate"; - this.groupBoxGoogleTranslate.Size = new System.Drawing.Size(404, 78); - this.groupBoxGoogleTranslate.TabIndex = 31; - this.groupBoxGoogleTranslate.TabStop = false; - this.groupBoxGoogleTranslate.Text = "Google translate"; - // - // labelGoogleTranslateApiKey - // - this.labelGoogleTranslateApiKey.AutoSize = true; - this.labelGoogleTranslateApiKey.Location = new System.Drawing.Point(13, 47); - this.labelGoogleTranslateApiKey.Name = "labelGoogleTranslateApiKey"; - this.labelGoogleTranslateApiKey.Size = new System.Drawing.Size(44, 13); - this.labelGoogleTranslateApiKey.TabIndex = 30; - this.labelGoogleTranslateApiKey.Text = "API key"; - // - // textBoxGoogleTransleApiKey - // - this.textBoxGoogleTransleApiKey.Location = new System.Drawing.Point(94, 47); - this.textBoxGoogleTransleApiKey.Name = "textBoxGoogleTransleApiKey"; - this.textBoxGoogleTransleApiKey.Size = new System.Drawing.Size(290, 21); - this.textBoxGoogleTransleApiKey.TabIndex = 26; - // - // linkLabelGoogleTranslateSignUp - // - this.linkLabelGoogleTranslateSignUp.AutoSize = true; - this.linkLabelGoogleTranslateSignUp.Location = new System.Drawing.Point(306, 19); - this.linkLabelGoogleTranslateSignUp.Name = "linkLabelGoogleTranslateSignUp"; - this.linkLabelGoogleTranslateSignUp.Size = new System.Drawing.Size(78, 13); - this.linkLabelGoogleTranslateSignUp.TabIndex = 24; - this.linkLabelGoogleTranslateSignUp.TabStop = true; - this.linkLabelGoogleTranslateSignUp.Text = "How to sign up"; - this.linkLabelGoogleTranslateSignUp.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabelGoogleTranslateSignUp_LinkClicked); - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(16, 106); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(0, 13); - this.label3.TabIndex = 25; - // - // groupBoxBing - // - this.groupBoxBing.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxBing.Controls.Add(this.comboBoxBoxBingTokenEndpoint); - this.groupBoxBing.Controls.Add(this.labelBingTokenEndpoint); - this.groupBoxBing.Controls.Add(this.labelBingApiKey); - this.groupBoxBing.Controls.Add(this.textBoxBingClientSecret); - this.groupBoxBing.Controls.Add(this.linkLabelBingSubscribe); - this.groupBoxBing.Controls.Add(this.label1); - this.groupBoxBing.Location = new System.Drawing.Point(421, 331); - this.groupBoxBing.Name = "groupBoxBing"; - this.groupBoxBing.Size = new System.Drawing.Size(404, 183); - this.groupBoxBing.TabIndex = 32; - this.groupBoxBing.TabStop = false; - this.groupBoxBing.Text = "Bing translator"; - // - // comboBoxBoxBingTokenEndpoint - // - this.comboBoxBoxBingTokenEndpoint.FormattingEnabled = true; - this.comboBoxBoxBingTokenEndpoint.Items.AddRange(new object[] { - "https://api.cognitive.microsoft.com/sts/v1.0/issueToken", - "https://.api.cognitive.microsoft.com/sts/v1.0/issueToken"}); - this.comboBoxBoxBingTokenEndpoint.Location = new System.Drawing.Point(9, 101); - this.comboBoxBoxBingTokenEndpoint.Name = "comboBoxBoxBingTokenEndpoint"; - this.comboBoxBoxBingTokenEndpoint.Size = new System.Drawing.Size(375, 21); - this.comboBoxBoxBingTokenEndpoint.TabIndex = 33; - // - // labelBingTokenEndpoint - // - this.labelBingTokenEndpoint.AutoSize = true; - this.labelBingTokenEndpoint.Location = new System.Drawing.Point(6, 83); - this.labelBingTokenEndpoint.Name = "labelBingTokenEndpoint"; - this.labelBingTokenEndpoint.Size = new System.Drawing.Size(81, 13); - this.labelBingTokenEndpoint.TabIndex = 32; - this.labelBingTokenEndpoint.Text = "Token endpoint"; - // - // labelBingApiKey - // - this.labelBingApiKey.AutoSize = true; - this.labelBingApiKey.Location = new System.Drawing.Point(6, 29); - this.labelBingApiKey.Name = "labelBingApiKey"; - this.labelBingApiKey.Size = new System.Drawing.Size(44, 13); - this.labelBingApiKey.TabIndex = 30; - this.labelBingApiKey.Text = "API key"; - // - // textBoxBingClientSecret - // - this.textBoxBingClientSecret.Location = new System.Drawing.Point(10, 45); - this.textBoxBingClientSecret.Name = "textBoxBingClientSecret"; - this.textBoxBingClientSecret.Size = new System.Drawing.Size(374, 21); - this.textBoxBingClientSecret.TabIndex = 26; - // - // linkLabelBingSubscribe - // - this.linkLabelBingSubscribe.AutoSize = true; - this.linkLabelBingSubscribe.Location = new System.Drawing.Point(306, 17); - this.linkLabelBingSubscribe.Name = "linkLabelBingSubscribe"; - this.linkLabelBingSubscribe.Size = new System.Drawing.Size(78, 13); - this.linkLabelBingSubscribe.TabIndex = 24; - this.linkLabelBingSubscribe.TabStop = true; - this.linkLabelBingSubscribe.Text = "How to sign up"; - this.linkLabelBingSubscribe.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabelBingSubscribe_LinkClicked); - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(16, 106); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(0, 13); - this.label1.TabIndex = 25; - // - // groupBoxToolsAutoBr - // - this.groupBoxToolsAutoBr.Controls.Add(this.labelToolsBreakBottomHeavyPercent); - this.groupBoxToolsAutoBr.Controls.Add(this.numericUpDownToolsBreakPreferBottomHeavy); - this.groupBoxToolsAutoBr.Controls.Add(this.checkBoxToolsBreakPreferBottomHeavy); - this.groupBoxToolsAutoBr.Controls.Add(this.checkBoxToolsBreakByPixelWidth); - this.groupBoxToolsAutoBr.Controls.Add(this.checkBoxToolsBreakEarlyLineEnding); - this.groupBoxToolsAutoBr.Controls.Add(this.checkBoxToolsBreakEarlyComma); - this.groupBoxToolsAutoBr.Controls.Add(this.checkBoxToolsBreakEarlyDash); - this.groupBoxToolsAutoBr.Controls.Add(this.labelUserBingApiId); - this.groupBoxToolsAutoBr.Controls.Add(this.buttonEditDoNotBreakAfterList); - this.groupBoxToolsAutoBr.Controls.Add(this.checkBoxUseDoNotBreakAfterList); - this.groupBoxToolsAutoBr.Location = new System.Drawing.Point(421, 6); - this.groupBoxToolsAutoBr.Name = "groupBoxToolsAutoBr"; - this.groupBoxToolsAutoBr.Size = new System.Drawing.Size(404, 232); - this.groupBoxToolsAutoBr.TabIndex = 5; - this.groupBoxToolsAutoBr.TabStop = false; - this.groupBoxToolsAutoBr.Text = "Auto br"; - // - // labelToolsBreakBottomHeavyPercent - // - this.labelToolsBreakBottomHeavyPercent.AutoSize = true; - this.labelToolsBreakBottomHeavyPercent.Location = new System.Drawing.Point(226, 142); - this.labelToolsBreakBottomHeavyPercent.Name = "labelToolsBreakBottomHeavyPercent"; - this.labelToolsBreakBottomHeavyPercent.Size = new System.Drawing.Size(18, 13); - this.labelToolsBreakBottomHeavyPercent.TabIndex = 63; - this.labelToolsBreakBottomHeavyPercent.Text = "%"; - // - // numericUpDownToolsBreakPreferBottomHeavy - // - this.numericUpDownToolsBreakPreferBottomHeavy.DecimalPlaces = 1; - this.numericUpDownToolsBreakPreferBottomHeavy.Increment = new decimal(new int[] { - 1, - 0, - 0, - 65536}); - this.numericUpDownToolsBreakPreferBottomHeavy.Location = new System.Drawing.Point(164, 140); - this.numericUpDownToolsBreakPreferBottomHeavy.Maximum = new decimal(new int[] { - 50, - 0, - 0, - 0}); - this.numericUpDownToolsBreakPreferBottomHeavy.Name = "numericUpDownToolsBreakPreferBottomHeavy"; - this.numericUpDownToolsBreakPreferBottomHeavy.Size = new System.Drawing.Size(56, 21); - this.numericUpDownToolsBreakPreferBottomHeavy.TabIndex = 62; - this.numericUpDownToolsBreakPreferBottomHeavy.Value = new decimal(new int[] { - 11, - 0, - 0, - 0}); - // - // checkBoxToolsBreakPreferBottomHeavy - // - this.checkBoxToolsBreakPreferBottomHeavy.AutoSize = true; - this.checkBoxToolsBreakPreferBottomHeavy.Location = new System.Drawing.Point(32, 141); - this.checkBoxToolsBreakPreferBottomHeavy.Name = "checkBoxToolsBreakPreferBottomHeavy"; - this.checkBoxToolsBreakPreferBottomHeavy.Size = new System.Drawing.Size(126, 17); - this.checkBoxToolsBreakPreferBottomHeavy.TabIndex = 61; - this.checkBoxToolsBreakPreferBottomHeavy.Text = "Prefer bottom heavy"; - this.checkBoxToolsBreakPreferBottomHeavy.UseVisualStyleBackColor = true; - // - // checkBoxToolsBreakByPixelWidth - // - this.checkBoxToolsBreakByPixelWidth.AutoSize = true; - this.checkBoxToolsBreakByPixelWidth.Location = new System.Drawing.Point(15, 118); - this.checkBoxToolsBreakByPixelWidth.Name = "checkBoxToolsBreakByPixelWidth"; - this.checkBoxToolsBreakByPixelWidth.Size = new System.Drawing.Size(172, 17); - this.checkBoxToolsBreakByPixelWidth.TabIndex = 60; - this.checkBoxToolsBreakByPixelWidth.Text = "Break by estimated pixel width"; - this.checkBoxToolsBreakByPixelWidth.UseVisualStyleBackColor = true; - this.checkBoxToolsBreakByPixelWidth.CheckedChanged += new System.EventHandler(this.checkBoxToolsBreakByPixelWidth_CheckedChanged); - // - // checkBoxToolsBreakEarlyLineEnding - // - this.checkBoxToolsBreakEarlyLineEnding.AutoSize = true; - this.checkBoxToolsBreakEarlyLineEnding.Location = new System.Drawing.Point(15, 72); - this.checkBoxToolsBreakEarlyLineEnding.Name = "checkBoxToolsBreakEarlyLineEnding"; - this.checkBoxToolsBreakEarlyLineEnding.Size = new System.Drawing.Size(175, 17); - this.checkBoxToolsBreakEarlyLineEnding.TabIndex = 40; - this.checkBoxToolsBreakEarlyLineEnding.Text = "Break early for line ending (.!?)"; - this.checkBoxToolsBreakEarlyLineEnding.UseVisualStyleBackColor = true; - // - // checkBoxToolsBreakEarlyComma - // - this.checkBoxToolsBreakEarlyComma.AutoSize = true; - this.checkBoxToolsBreakEarlyComma.Location = new System.Drawing.Point(15, 95); - this.checkBoxToolsBreakEarlyComma.Name = "checkBoxToolsBreakEarlyComma"; - this.checkBoxToolsBreakEarlyComma.Size = new System.Drawing.Size(133, 17); - this.checkBoxToolsBreakEarlyComma.TabIndex = 50; - this.checkBoxToolsBreakEarlyComma.Text = "Break early for comma"; - this.checkBoxToolsBreakEarlyComma.UseVisualStyleBackColor = true; - // - // checkBoxToolsBreakEarlyDash - // - this.checkBoxToolsBreakEarlyDash.AutoSize = true; - this.checkBoxToolsBreakEarlyDash.Location = new System.Drawing.Point(15, 49); - this.checkBoxToolsBreakEarlyDash.Name = "checkBoxToolsBreakEarlyDash"; - this.checkBoxToolsBreakEarlyDash.Size = new System.Drawing.Size(123, 17); - this.checkBoxToolsBreakEarlyDash.TabIndex = 30; - this.checkBoxToolsBreakEarlyDash.Text = "Break early for dash"; - this.checkBoxToolsBreakEarlyDash.UseVisualStyleBackColor = true; - // - // labelUserBingApiId - // - this.labelUserBingApiId.AutoSize = true; - this.labelUserBingApiId.Location = new System.Drawing.Point(16, 106); - this.labelUserBingApiId.Name = "labelUserBingApiId"; - this.labelUserBingApiId.Size = new System.Drawing.Size(0, 13); - this.labelUserBingApiId.TabIndex = 25; - // - // buttonEditDoNotBreakAfterList - // - this.buttonEditDoNotBreakAfterList.Location = new System.Drawing.Point(239, 22); - this.buttonEditDoNotBreakAfterList.Name = "buttonEditDoNotBreakAfterList"; - this.buttonEditDoNotBreakAfterList.Size = new System.Drawing.Size(75, 23); - this.buttonEditDoNotBreakAfterList.TabIndex = 20; - this.buttonEditDoNotBreakAfterList.Text = "Edit"; - this.buttonEditDoNotBreakAfterList.UseVisualStyleBackColor = true; - this.buttonEditDoNotBreakAfterList.Click += new System.EventHandler(this.buttonEditDoNotBreakAfterList_Click); - // - // checkBoxUseDoNotBreakAfterList - // - this.checkBoxUseDoNotBreakAfterList.AutoSize = true; - this.checkBoxUseDoNotBreakAfterList.Location = new System.Drawing.Point(15, 26); - this.checkBoxUseDoNotBreakAfterList.Name = "checkBoxUseDoNotBreakAfterList"; - this.checkBoxUseDoNotBreakAfterList.Size = new System.Drawing.Size(154, 17); - this.checkBoxUseDoNotBreakAfterList.TabIndex = 1; - this.checkBoxUseDoNotBreakAfterList.Text = "Use \'do-not-beak-after\' list"; - this.checkBoxUseDoNotBreakAfterList.UseVisualStyleBackColor = true; - // - // groupBoxSpellCheck - // - this.groupBoxSpellCheck.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxSpellCheck.Controls.Add(this.checkBoxSpellCheckAutoChangeNamesViaSuggestions); - this.groupBoxSpellCheck.Controls.Add(this.checkBoxUseAlwaysToFile); - this.groupBoxSpellCheck.Controls.Add(this.checkBoxTreatINQuoteAsING); - this.groupBoxSpellCheck.Controls.Add(this.checkBoxSpellCheckOneLetterWords); - this.groupBoxSpellCheck.Controls.Add(this.checkBoxSpellCheckAutoChangeNames); - this.groupBoxSpellCheck.Location = new System.Drawing.Point(7, 360); - this.groupBoxSpellCheck.Name = "groupBoxSpellCheck"; - this.groupBoxSpellCheck.Size = new System.Drawing.Size(408, 154); - this.groupBoxSpellCheck.TabIndex = 4; - this.groupBoxSpellCheck.TabStop = false; - this.groupBoxSpellCheck.Text = "Spell check"; - // - // checkBoxSpellCheckAutoChangeNamesViaSuggestions - // - this.checkBoxSpellCheckAutoChangeNamesViaSuggestions.AutoSize = true; - this.checkBoxSpellCheckAutoChangeNamesViaSuggestions.Location = new System.Drawing.Point(30, 43); - this.checkBoxSpellCheckAutoChangeNamesViaSuggestions.Name = "checkBoxSpellCheckAutoChangeNamesViaSuggestions"; - this.checkBoxSpellCheckAutoChangeNamesViaSuggestions.Size = new System.Drawing.Size(184, 17); - this.checkBoxSpellCheckAutoChangeNamesViaSuggestions.TabIndex = 1; - this.checkBoxSpellCheckAutoChangeNamesViaSuggestions.Text = "Also use \'spell check suggestions\'"; - this.checkBoxSpellCheckAutoChangeNamesViaSuggestions.UseVisualStyleBackColor = true; - // - // checkBoxUseAlwaysToFile - // - this.checkBoxUseAlwaysToFile.AutoSize = true; - this.checkBoxUseAlwaysToFile.Location = new System.Drawing.Point(15, 118); - this.checkBoxUseAlwaysToFile.Name = "checkBoxUseAlwaysToFile"; - this.checkBoxUseAlwaysToFile.Size = new System.Drawing.Size(192, 17); - this.checkBoxUseAlwaysToFile.TabIndex = 12; - this.checkBoxUseAlwaysToFile.Text = "Remember \"Use always\" / \"Skip all\""; - this.checkBoxUseAlwaysToFile.UseVisualStyleBackColor = true; - // - // checkBoxTreatINQuoteAsING - // - this.checkBoxTreatINQuoteAsING.AutoSize = true; - this.checkBoxTreatINQuoteAsING.Location = new System.Drawing.Point(15, 95); - this.checkBoxTreatINQuoteAsING.Name = "checkBoxTreatINQuoteAsING"; - this.checkBoxTreatINQuoteAsING.Size = new System.Drawing.Size(253, 17); - this.checkBoxTreatINQuoteAsING.TabIndex = 8; - this.checkBoxTreatINQuoteAsING.Text = "Treat word ending \" in\' \" as \" ing \" (English only)"; - this.checkBoxTreatINQuoteAsING.UseVisualStyleBackColor = true; - // - // checkBoxSpellCheckOneLetterWords - // - this.checkBoxSpellCheckOneLetterWords.AutoSize = true; - this.checkBoxSpellCheckOneLetterWords.Location = new System.Drawing.Point(15, 72); - this.checkBoxSpellCheckOneLetterWords.Name = "checkBoxSpellCheckOneLetterWords"; - this.checkBoxSpellCheckOneLetterWords.Size = new System.Drawing.Size(205, 17); - this.checkBoxSpellCheckOneLetterWords.TabIndex = 4; - this.checkBoxSpellCheckOneLetterWords.Text = "Prompt for unknown one letter words"; - this.checkBoxSpellCheckOneLetterWords.UseVisualStyleBackColor = true; - // - // checkBoxSpellCheckAutoChangeNames - // - this.checkBoxSpellCheckAutoChangeNames.AutoSize = true; - this.checkBoxSpellCheckAutoChangeNames.Location = new System.Drawing.Point(15, 20); - this.checkBoxSpellCheckAutoChangeNames.Name = "checkBoxSpellCheckAutoChangeNames"; - this.checkBoxSpellCheckAutoChangeNames.Size = new System.Drawing.Size(216, 17); - this.checkBoxSpellCheckAutoChangeNames.TabIndex = 0; - this.checkBoxSpellCheckAutoChangeNames.Text = "Auto fix names where only casing differ"; - this.checkBoxSpellCheckAutoChangeNames.UseVisualStyleBackColor = true; - // - // groupBoxFixCommonErrors - // - this.groupBoxFixCommonErrors.Controls.Add(this.buttonFixContinuationStyleSettings); - this.groupBoxFixCommonErrors.Controls.Add(this.checkBoxFceSkipStep1); - this.groupBoxFixCommonErrors.Controls.Add(this.checkBoxFixShortDisplayTimesAllowMoveStartTime); - this.groupBoxFixCommonErrors.Controls.Add(this.checkBoxFixCommonOcrErrorsUsingHardcodedRules); - this.groupBoxFixCommonErrors.Controls.Add(this.comboBoxToolsMusicSymbol); - this.groupBoxFixCommonErrors.Controls.Add(this.textBoxMusicSymbolsToReplace); - this.groupBoxFixCommonErrors.Controls.Add(this.labelToolsMusicSymbolsToReplace); - this.groupBoxFixCommonErrors.Controls.Add(this.labelToolsMusicSymbol); - this.groupBoxFixCommonErrors.Location = new System.Drawing.Point(7, 129); - this.groupBoxFixCommonErrors.Name = "groupBoxFixCommonErrors"; - this.groupBoxFixCommonErrors.Size = new System.Drawing.Size(408, 225); - this.groupBoxFixCommonErrors.TabIndex = 3; - this.groupBoxFixCommonErrors.TabStop = false; - this.groupBoxFixCommonErrors.Text = "Fix common errors"; - // - // buttonFixContinuationStyleSettings - // - this.buttonFixContinuationStyleSettings.Location = new System.Drawing.Point(15, 189); - this.buttonFixContinuationStyleSettings.Name = "buttonFixContinuationStyleSettings"; - this.buttonFixContinuationStyleSettings.Size = new System.Drawing.Size(271, 23); - this.buttonFixContinuationStyleSettings.TabIndex = 37; - this.buttonFixContinuationStyleSettings.Text = "Edit settings for fixing continuation style..."; - this.buttonFixContinuationStyleSettings.UseVisualStyleBackColor = true; - this.buttonFixContinuationStyleSettings.Click += new System.EventHandler(this.buttonFixContinuationStyleSettings_Click); - // - // checkBoxFceSkipStep1 - // - this.checkBoxFceSkipStep1.AutoSize = true; - this.checkBoxFceSkipStep1.Location = new System.Drawing.Point(15, 161); - this.checkBoxFceSkipStep1.Name = "checkBoxFceSkipStep1"; - this.checkBoxFceSkipStep1.Size = new System.Drawing.Size(176, 17); - this.checkBoxFceSkipStep1.TabIndex = 36; - this.checkBoxFceSkipStep1.Text = "Skip step one (choose fix rules)"; - this.checkBoxFceSkipStep1.UseVisualStyleBackColor = true; - // - // checkBoxFixShortDisplayTimesAllowMoveStartTime - // - this.checkBoxFixShortDisplayTimesAllowMoveStartTime.AutoSize = true; - this.checkBoxFixShortDisplayTimesAllowMoveStartTime.Location = new System.Drawing.Point(15, 138); - this.checkBoxFixShortDisplayTimesAllowMoveStartTime.Name = "checkBoxFixShortDisplayTimesAllowMoveStartTime"; - this.checkBoxFixShortDisplayTimesAllowMoveStartTime.Size = new System.Drawing.Size(252, 17); - this.checkBoxFixShortDisplayTimesAllowMoveStartTime.TabIndex = 35; - this.checkBoxFixShortDisplayTimesAllowMoveStartTime.Text = "Fix short display time - allow move of start time"; - this.checkBoxFixShortDisplayTimesAllowMoveStartTime.UseVisualStyleBackColor = true; - // - // checkBoxFixCommonOcrErrorsUsingHardcodedRules - // - this.checkBoxFixCommonOcrErrorsUsingHardcodedRules.AutoSize = true; - this.checkBoxFixCommonOcrErrorsUsingHardcodedRules.Location = new System.Drawing.Point(15, 115); - this.checkBoxFixCommonOcrErrorsUsingHardcodedRules.Name = "checkBoxFixCommonOcrErrorsUsingHardcodedRules"; - this.checkBoxFixCommonOcrErrorsUsingHardcodedRules.Size = new System.Drawing.Size(268, 17); - this.checkBoxFixCommonOcrErrorsUsingHardcodedRules.TabIndex = 2; - this.checkBoxFixCommonOcrErrorsUsingHardcodedRules.Text = "Fix common OCR errors - also use hardcoded rules"; - this.checkBoxFixCommonOcrErrorsUsingHardcodedRules.UseVisualStyleBackColor = true; - // - // comboBoxToolsMusicSymbol - // - this.comboBoxToolsMusicSymbol.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxToolsMusicSymbol.FormattingEnabled = true; - this.comboBoxToolsMusicSymbol.Items.AddRange(new object[] { - "♪", - "♪♪", - "*", - "#"}); - this.comboBoxToolsMusicSymbol.Location = new System.Drawing.Point(200, 71); - this.comboBoxToolsMusicSymbol.Name = "comboBoxToolsMusicSymbol"; - this.comboBoxToolsMusicSymbol.Size = new System.Drawing.Size(86, 21); - this.comboBoxToolsMusicSymbol.TabIndex = 1; - // - // textBoxMusicSymbolsToReplace - // - this.textBoxMusicSymbolsToReplace.Location = new System.Drawing.Point(11, 41); - this.textBoxMusicSymbolsToReplace.MaxLength = 100; - this.textBoxMusicSymbolsToReplace.Name = "textBoxMusicSymbolsToReplace"; - this.textBoxMusicSymbolsToReplace.Size = new System.Drawing.Size(274, 21); - this.textBoxMusicSymbolsToReplace.TabIndex = 0; - // - // labelToolsMusicSymbolsToReplace - // - this.labelToolsMusicSymbolsToReplace.AutoSize = true; - this.labelToolsMusicSymbolsToReplace.Location = new System.Drawing.Point(8, 25); - this.labelToolsMusicSymbolsToReplace.Name = "labelToolsMusicSymbolsToReplace"; - this.labelToolsMusicSymbolsToReplace.Size = new System.Drawing.Size(230, 13); - this.labelToolsMusicSymbolsToReplace.TabIndex = 34; - this.labelToolsMusicSymbolsToReplace.Text = "Music symbols to replace (separate by comma)"; - // - // labelToolsMusicSymbol - // - this.labelToolsMusicSymbol.AutoSize = true; - this.labelToolsMusicSymbol.Location = new System.Drawing.Point(8, 74); - this.labelToolsMusicSymbol.Name = "labelToolsMusicSymbol"; - this.labelToolsMusicSymbol.Size = new System.Drawing.Size(69, 13); - this.labelToolsMusicSymbol.TabIndex = 32; - this.labelToolsMusicSymbol.Text = "Music symbol"; - // - // groupBoxToolsVisualSync - // - this.groupBoxToolsVisualSync.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxToolsVisualSync.Controls.Add(this.labelToolsEndScene); - this.groupBoxToolsVisualSync.Controls.Add(this.comboBoxToolsEndSceneIndex); - this.groupBoxToolsVisualSync.Controls.Add(this.labelToolsStartScene); - this.groupBoxToolsVisualSync.Controls.Add(this.comboBoxToolsStartSceneIndex); - this.groupBoxToolsVisualSync.Controls.Add(this.comboBoxToolsVerifySeconds); - this.groupBoxToolsVisualSync.Controls.Add(this.labelVerifyButton); - this.groupBoxToolsVisualSync.Location = new System.Drawing.Point(6, 6); - this.groupBoxToolsVisualSync.Name = "groupBoxToolsVisualSync"; - this.groupBoxToolsVisualSync.Size = new System.Drawing.Size(409, 116); - this.groupBoxToolsVisualSync.TabIndex = 2; - this.groupBoxToolsVisualSync.TabStop = false; - this.groupBoxToolsVisualSync.Text = "Visual sync"; - // - // labelToolsEndScene - // - this.labelToolsEndScene.AutoSize = true; - this.labelToolsEndScene.Location = new System.Drawing.Point(13, 79); - this.labelToolsEndScene.Name = "labelToolsEndScene"; - this.labelToolsEndScene.Size = new System.Drawing.Size(122, 13); - this.labelToolsEndScene.TabIndex = 29; - this.labelToolsEndScene.Text = "End scene paragraph is "; - // - // comboBoxToolsEndSceneIndex - // - this.comboBoxToolsEndSceneIndex.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxToolsEndSceneIndex.FormattingEnabled = true; - this.comboBoxToolsEndSceneIndex.Items.AddRange(new object[] { - "Last", - "Last - 1", - "Last - 2", - "Last - 3"}); - this.comboBoxToolsEndSceneIndex.Location = new System.Drawing.Point(200, 76); - this.comboBoxToolsEndSceneIndex.Name = "comboBoxToolsEndSceneIndex"; - this.comboBoxToolsEndSceneIndex.Size = new System.Drawing.Size(86, 21); - this.comboBoxToolsEndSceneIndex.TabIndex = 2; - // - // labelToolsStartScene - // - this.labelToolsStartScene.AutoSize = true; - this.labelToolsStartScene.Location = new System.Drawing.Point(13, 52); - this.labelToolsStartScene.Name = "labelToolsStartScene"; - this.labelToolsStartScene.Size = new System.Drawing.Size(125, 13); - this.labelToolsStartScene.TabIndex = 27; - this.labelToolsStartScene.Text = "Start scene paragraph is"; - // - // comboBoxToolsStartSceneIndex - // - this.comboBoxToolsStartSceneIndex.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxToolsStartSceneIndex.FormattingEnabled = true; - this.comboBoxToolsStartSceneIndex.Items.AddRange(new object[] { - "First", - "First +1", - "First +2", - "First +3"}); - this.comboBoxToolsStartSceneIndex.Location = new System.Drawing.Point(200, 49); - this.comboBoxToolsStartSceneIndex.Name = "comboBoxToolsStartSceneIndex"; - this.comboBoxToolsStartSceneIndex.Size = new System.Drawing.Size(86, 21); - this.comboBoxToolsStartSceneIndex.TabIndex = 1; - // - // comboBoxToolsVerifySeconds - // - this.comboBoxToolsVerifySeconds.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxToolsVerifySeconds.FormattingEnabled = true; - this.comboBoxToolsVerifySeconds.Items.AddRange(new object[] { - "2", - "3", - "4", - "5"}); - this.comboBoxToolsVerifySeconds.Location = new System.Drawing.Point(200, 22); - this.comboBoxToolsVerifySeconds.Name = "comboBoxToolsVerifySeconds"; - this.comboBoxToolsVerifySeconds.Size = new System.Drawing.Size(86, 21); - this.comboBoxToolsVerifySeconds.TabIndex = 0; - // - // labelVerifyButton - // - this.labelVerifyButton.AutoSize = true; - this.labelVerifyButton.Location = new System.Drawing.Point(13, 25); - this.labelVerifyButton.Name = "labelVerifyButton"; - this.labelVerifyButton.Size = new System.Drawing.Size(147, 13); - this.labelVerifyButton.TabIndex = 3; - this.labelVerifyButton.Text = "Play X seconds and back, X is"; - // - // tabPageWordLists - // - this.tabPageWordLists.Controls.Add(this.groupBoxWordLists); - this.tabPageWordLists.Location = new System.Drawing.Point(4, 22); - this.tabPageWordLists.Name = "tabPageWordLists"; - this.tabPageWordLists.Padding = new System.Windows.Forms.Padding(3); - this.tabPageWordLists.Size = new System.Drawing.Size(832, 520); - this.tabPageWordLists.TabIndex = 3; - this.tabPageWordLists.Text = "Word lists"; - this.tabPageWordLists.UseVisualStyleBackColor = true; - // - // groupBoxWordLists - // - this.groupBoxWordLists.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxWordLists.Controls.Add(this.linkLabelOpenDictionaryFolder); - this.groupBoxWordLists.Controls.Add(this.groupBoxOcrFixList); - this.groupBoxWordLists.Controls.Add(this.groupBoxUserWordList); - this.groupBoxWordLists.Controls.Add(this.groupBoxWordListLocation); - this.groupBoxWordLists.Controls.Add(this.groupBoxNamesIgonoreLists); - this.groupBoxWordLists.Controls.Add(this.labelWordListLanguage); - this.groupBoxWordLists.Controls.Add(this.comboBoxWordListLanguage); - this.groupBoxWordLists.Location = new System.Drawing.Point(6, 6); - this.groupBoxWordLists.Name = "groupBoxWordLists"; - this.groupBoxWordLists.Size = new System.Drawing.Size(819, 503); - this.groupBoxWordLists.TabIndex = 2; - this.groupBoxWordLists.TabStop = false; - this.groupBoxWordLists.Text = "Word lists"; - // - // linkLabelOpenDictionaryFolder - // - this.linkLabelOpenDictionaryFolder.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.linkLabelOpenDictionaryFolder.AutoSize = true; - this.linkLabelOpenDictionaryFolder.Location = new System.Drawing.Point(6, 464); - this.linkLabelOpenDictionaryFolder.Name = "linkLabelOpenDictionaryFolder"; - this.linkLabelOpenDictionaryFolder.Size = new System.Drawing.Size(126, 13); - this.linkLabelOpenDictionaryFolder.TabIndex = 29; - this.linkLabelOpenDictionaryFolder.TabStop = true; - this.linkLabelOpenDictionaryFolder.Text = "Open \'Dictionaries\' folder"; - this.linkLabelOpenDictionaryFolder.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabelOpenDictionaryFolder_LinkClicked); - // - // groupBoxOcrFixList - // - this.groupBoxOcrFixList.Controls.Add(this.textBoxOcrFixValue); - this.groupBoxOcrFixList.Controls.Add(this.buttonRemoveOcrFix); - this.groupBoxOcrFixList.Controls.Add(this.listBoxOcrFixList); - this.groupBoxOcrFixList.Controls.Add(this.textBoxOcrFixKey); - this.groupBoxOcrFixList.Controls.Add(this.buttonAddOcrFix); - this.groupBoxOcrFixList.Location = new System.Drawing.Point(510, 43); - this.groupBoxOcrFixList.Name = "groupBoxOcrFixList"; - this.groupBoxOcrFixList.Size = new System.Drawing.Size(293, 279); - this.groupBoxOcrFixList.TabIndex = 6; - this.groupBoxOcrFixList.TabStop = false; - this.groupBoxOcrFixList.Text = "OCR fix list"; - // - // textBoxOcrFixValue - // - this.textBoxOcrFixValue.Location = new System.Drawing.Point(100, 248); - this.textBoxOcrFixValue.Name = "textBoxOcrFixValue"; - this.textBoxOcrFixValue.Size = new System.Drawing.Size(85, 21); - this.textBoxOcrFixValue.TabIndex = 45; - this.textBoxOcrFixValue.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxOcrFixValueKeyDown); - // - // buttonRemoveOcrFix - // - this.buttonRemoveOcrFix.Location = new System.Drawing.Point(191, 16); - this.buttonRemoveOcrFix.Name = "buttonRemoveOcrFix"; - this.buttonRemoveOcrFix.Size = new System.Drawing.Size(75, 23); - this.buttonRemoveOcrFix.TabIndex = 42; - this.buttonRemoveOcrFix.Text = "Remove"; - this.buttonRemoveOcrFix.UseVisualStyleBackColor = true; - this.buttonRemoveOcrFix.Click += new System.EventHandler(this.ButtonRemoveOcrFixClick); - // - // listBoxOcrFixList - // - this.listBoxOcrFixList.FormattingEnabled = true; - this.listBoxOcrFixList.Location = new System.Drawing.Point(6, 16); - this.listBoxOcrFixList.Name = "listBoxOcrFixList"; - this.listBoxOcrFixList.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended; - this.listBoxOcrFixList.Size = new System.Drawing.Size(179, 225); - this.listBoxOcrFixList.TabIndex = 40; - this.listBoxOcrFixList.SelectedIndexChanged += new System.EventHandler(this.ListBoxOcrFixListSelectedIndexChanged); - this.listBoxOcrFixList.DoubleClick += new System.EventHandler(this.listBoxOcrFixList_DoubleClick); - this.listBoxOcrFixList.Enter += new System.EventHandler(this.ListBoxSearchReset); - this.listBoxOcrFixList.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ListBoxKeyDownSearch); - // - // textBoxOcrFixKey - // - this.textBoxOcrFixKey.Location = new System.Drawing.Point(6, 248); - this.textBoxOcrFixKey.Name = "textBoxOcrFixKey"; - this.textBoxOcrFixKey.Size = new System.Drawing.Size(88, 21); - this.textBoxOcrFixKey.TabIndex = 44; - // - // buttonAddOcrFix - // - this.buttonAddOcrFix.Location = new System.Drawing.Point(191, 247); - this.buttonAddOcrFix.Name = "buttonAddOcrFix"; - this.buttonAddOcrFix.Size = new System.Drawing.Size(75, 23); - this.buttonAddOcrFix.TabIndex = 46; - this.buttonAddOcrFix.Text = "Add pair"; - this.buttonAddOcrFix.UseVisualStyleBackColor = true; - this.buttonAddOcrFix.Click += new System.EventHandler(this.ButtonAddOcrFixClick); - // - // groupBoxUserWordList - // - this.groupBoxUserWordList.Controls.Add(this.buttonRemoveUserWord); - this.groupBoxUserWordList.Controls.Add(this.listBoxUserWordLists); - this.groupBoxUserWordList.Controls.Add(this.textBoxUserWord); - this.groupBoxUserWordList.Controls.Add(this.buttonAddUserWord); - this.groupBoxUserWordList.Location = new System.Drawing.Point(259, 43); - this.groupBoxUserWordList.Name = "groupBoxUserWordList"; - this.groupBoxUserWordList.Size = new System.Drawing.Size(241, 279); - this.groupBoxUserWordList.TabIndex = 4; - this.groupBoxUserWordList.TabStop = false; - this.groupBoxUserWordList.Text = "User word list"; - // - // buttonRemoveUserWord - // - this.buttonRemoveUserWord.Location = new System.Drawing.Point(159, 16); - this.buttonRemoveUserWord.Name = "buttonRemoveUserWord"; - this.buttonRemoveUserWord.Size = new System.Drawing.Size(75, 23); - this.buttonRemoveUserWord.TabIndex = 32; - this.buttonRemoveUserWord.Text = "Remove"; - this.buttonRemoveUserWord.UseVisualStyleBackColor = true; - this.buttonRemoveUserWord.Click += new System.EventHandler(this.ButtonRemoveUserWordClick); - // - // listBoxUserWordLists - // - this.listBoxUserWordLists.FormattingEnabled = true; - this.listBoxUserWordLists.Location = new System.Drawing.Point(3, 16); - this.listBoxUserWordLists.Name = "listBoxUserWordLists"; - this.listBoxUserWordLists.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended; - this.listBoxUserWordLists.Size = new System.Drawing.Size(150, 225); - this.listBoxUserWordLists.TabIndex = 30; - this.listBoxUserWordLists.SelectedIndexChanged += new System.EventHandler(this.ListBoxUserWordListsSelectedIndexChanged); - this.listBoxUserWordLists.DoubleClick += new System.EventHandler(this.listBoxUserWordLists_DoubleClick); - this.listBoxUserWordLists.Enter += new System.EventHandler(this.ListBoxSearchReset); - this.listBoxUserWordLists.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ListBoxKeyDownSearch); - // - // textBoxUserWord - // - this.textBoxUserWord.Location = new System.Drawing.Point(3, 248); - this.textBoxUserWord.Name = "textBoxUserWord"; - this.textBoxUserWord.Size = new System.Drawing.Size(150, 21); - this.textBoxUserWord.TabIndex = 34; - this.textBoxUserWord.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxUserWordKeyDown); - // - // buttonAddUserWord - // - this.buttonAddUserWord.Location = new System.Drawing.Point(157, 247); - this.buttonAddUserWord.Name = "buttonAddUserWord"; - this.buttonAddUserWord.Size = new System.Drawing.Size(75, 23); - this.buttonAddUserWord.TabIndex = 36; - this.buttonAddUserWord.Text = "Add word"; - this.buttonAddUserWord.UseVisualStyleBackColor = true; - this.buttonAddUserWord.Click += new System.EventHandler(this.ButtonAddUserWordClick); - // - // groupBoxWordListLocation - // - this.groupBoxWordListLocation.Controls.Add(this.checkBoxNamesOnline); - this.groupBoxWordListLocation.Controls.Add(this.textBoxNamesOnline); - this.groupBoxWordListLocation.Location = new System.Drawing.Point(6, 328); - this.groupBoxWordListLocation.Name = "groupBoxWordListLocation"; - this.groupBoxWordListLocation.Size = new System.Drawing.Size(797, 92); - this.groupBoxWordListLocation.TabIndex = 8; - this.groupBoxWordListLocation.TabStop = false; - this.groupBoxWordListLocation.Text = "Location"; - // - // checkBoxNamesOnline - // - this.checkBoxNamesOnline.AutoSize = true; - this.checkBoxNamesOnline.Location = new System.Drawing.Point(7, 22); - this.checkBoxNamesOnline.Name = "checkBoxNamesOnline"; - this.checkBoxNamesOnline.Size = new System.Drawing.Size(145, 17); - this.checkBoxNamesOnline.TabIndex = 26; - this.checkBoxNamesOnline.Text = "Use online names xml file"; - this.checkBoxNamesOnline.UseVisualStyleBackColor = true; - // - // textBoxNamesOnline - // - this.textBoxNamesOnline.Location = new System.Drawing.Point(6, 45); - this.textBoxNamesOnline.Name = "textBoxNamesOnline"; - this.textBoxNamesOnline.Size = new System.Drawing.Size(764, 21); - this.textBoxNamesOnline.TabIndex = 28; - this.textBoxNamesOnline.Text = "https://raw.githubusercontent.com/SubtitleEdit/subtitleedit/master/Dictionaries/n" + - "ames.xml"; - // - // groupBoxNamesIgonoreLists - // - this.groupBoxNamesIgonoreLists.Controls.Add(this.buttonRemoveNameEtc); - this.groupBoxNamesIgonoreLists.Controls.Add(this.listBoxNames); - this.groupBoxNamesIgonoreLists.Controls.Add(this.textBoxNameEtc); - this.groupBoxNamesIgonoreLists.Controls.Add(this.buttonAddNames); - this.groupBoxNamesIgonoreLists.Location = new System.Drawing.Point(6, 43); - this.groupBoxNamesIgonoreLists.Name = "groupBoxNamesIgonoreLists"; - this.groupBoxNamesIgonoreLists.Size = new System.Drawing.Size(241, 279); - this.groupBoxNamesIgonoreLists.TabIndex = 2; - this.groupBoxNamesIgonoreLists.TabStop = false; - this.groupBoxNamesIgonoreLists.Text = "Names/ignore lists"; - // - // buttonRemoveNameEtc - // - this.buttonRemoveNameEtc.Location = new System.Drawing.Point(159, 16); - this.buttonRemoveNameEtc.Name = "buttonRemoveNameEtc"; - this.buttonRemoveNameEtc.Size = new System.Drawing.Size(75, 23); - this.buttonRemoveNameEtc.TabIndex = 22; - this.buttonRemoveNameEtc.Text = "Remove"; - this.buttonRemoveNameEtc.UseVisualStyleBackColor = true; - this.buttonRemoveNameEtc.Click += new System.EventHandler(this.ButtonRemoveNameEtcClick); - // - // listBoxNames - // - this.listBoxNames.FormattingEnabled = true; - this.listBoxNames.Location = new System.Drawing.Point(3, 16); - this.listBoxNames.Name = "listBoxNames"; - this.listBoxNames.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended; - this.listBoxNames.Size = new System.Drawing.Size(150, 225); - this.listBoxNames.TabIndex = 20; - this.listBoxNames.SelectedIndexChanged += new System.EventHandler(this.ListBoxNamesSelectedIndexChanged); - this.listBoxNames.DoubleClick += new System.EventHandler(this.listBoxNames_DoubleClick); - this.listBoxNames.Enter += new System.EventHandler(this.ListBoxSearchReset); - this.listBoxNames.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ListBoxKeyDownSearch); - // - // textBoxNameEtc - // - this.textBoxNameEtc.Location = new System.Drawing.Point(3, 248); - this.textBoxNameEtc.Name = "textBoxNameEtc"; - this.textBoxNameEtc.Size = new System.Drawing.Size(151, 21); - this.textBoxNameEtc.TabIndex = 24; - this.textBoxNameEtc.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxNameEtcKeyDown); - // - // buttonAddNames - // - this.buttonAddNames.Location = new System.Drawing.Point(160, 247); - this.buttonAddNames.Name = "buttonAddNames"; - this.buttonAddNames.Size = new System.Drawing.Size(75, 23); - this.buttonAddNames.TabIndex = 26; - this.buttonAddNames.Text = "Add name"; - this.buttonAddNames.UseVisualStyleBackColor = true; - this.buttonAddNames.Click += new System.EventHandler(this.ButtonAddNamesClick); - // - // labelWordListLanguage - // - this.labelWordListLanguage.AutoSize = true; - this.labelWordListLanguage.Location = new System.Drawing.Point(6, 19); - this.labelWordListLanguage.Name = "labelWordListLanguage"; - this.labelWordListLanguage.Size = new System.Drawing.Size(54, 13); - this.labelWordListLanguage.TabIndex = 1; - this.labelWordListLanguage.Text = "Language"; - // - // comboBoxWordListLanguage - // - this.comboBoxWordListLanguage.FormattingEnabled = true; - this.comboBoxWordListLanguage.Location = new System.Drawing.Point(67, 16); - this.comboBoxWordListLanguage.Name = "comboBoxWordListLanguage"; - this.comboBoxWordListLanguage.Size = new System.Drawing.Size(155, 21); - this.comboBoxWordListLanguage.TabIndex = 0; - this.comboBoxWordListLanguage.SelectedIndexChanged += new System.EventHandler(this.ComboBoxWordListLanguageSelectedIndexChanged); - // - // tabPageToolBar - // - this.tabPageToolBar.Controls.Add(this.groupBox2); - this.tabPageToolBar.Controls.Add(this.groupBoxShowToolBarButtons); - this.tabPageToolBar.Location = new System.Drawing.Point(4, 22); - this.tabPageToolBar.Name = "tabPageToolBar"; - this.tabPageToolBar.Padding = new System.Windows.Forms.Padding(3); - this.tabPageToolBar.Size = new System.Drawing.Size(832, 520); - this.tabPageToolBar.TabIndex = 7; - this.tabPageToolBar.Text = "Toolbar "; - this.tabPageToolBar.UseVisualStyleBackColor = true; - // - // groupBox2 - // - this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBox2.Controls.Add(this.checkBoxShowFrameRate); - this.groupBox2.Location = new System.Drawing.Point(7, 248); - this.groupBox2.Name = "groupBox2"; - this.groupBox2.Size = new System.Drawing.Size(818, 261); - this.groupBox2.TabIndex = 35; - this.groupBox2.TabStop = false; - // - // checkBoxShowFrameRate - // - this.checkBoxShowFrameRate.AutoSize = true; - this.checkBoxShowFrameRate.Location = new System.Drawing.Point(16, 20); - this.checkBoxShowFrameRate.Name = "checkBoxShowFrameRate"; - this.checkBoxShowFrameRate.Size = new System.Drawing.Size(154, 17); - this.checkBoxShowFrameRate.TabIndex = 34; - this.checkBoxShowFrameRate.Text = "Show frame rate in toolbar"; - this.checkBoxShowFrameRate.UseVisualStyleBackColor = true; - // - // groupBoxShowToolBarButtons - // - this.groupBoxShowToolBarButtons.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxShowToolBarButtons.Controls.Add(this.labelTBNetflixQualityCheck); - this.groupBoxShowToolBarButtons.Controls.Add(this.pictureBoxNetflixQualityCheck); - this.groupBoxShowToolBarButtons.Controls.Add(this.checkBoxNetflixQualityCheck); - this.groupBoxShowToolBarButtons.Controls.Add(this.labelTBRemoveTextForHi); - this.groupBoxShowToolBarButtons.Controls.Add(this.pictureBoxTBRemoveTextForHi); - this.groupBoxShowToolBarButtons.Controls.Add(this.checkBoxTBRemoveTextForHi); - this.groupBoxShowToolBarButtons.Controls.Add(this.labelTBFixCommonErrors); - this.groupBoxShowToolBarButtons.Controls.Add(this.pictureBoxTBFixCommonErrors); - this.groupBoxShowToolBarButtons.Controls.Add(this.checkBoxTBFixCommonErrors); - this.groupBoxShowToolBarButtons.Controls.Add(this.labelTBHelp); - this.groupBoxShowToolBarButtons.Controls.Add(this.pictureBoxHelp); - this.groupBoxShowToolBarButtons.Controls.Add(this.checkBoxHelp); - this.groupBoxShowToolBarButtons.Controls.Add(this.labelTBSettings); - this.groupBoxShowToolBarButtons.Controls.Add(this.pictureBoxSettings); - this.groupBoxShowToolBarButtons.Controls.Add(this.checkBoxSettings); - this.groupBoxShowToolBarButtons.Controls.Add(this.labelTBSpellCheck); - this.groupBoxShowToolBarButtons.Controls.Add(this.pictureBoxSpellCheck); - this.groupBoxShowToolBarButtons.Controls.Add(this.checkBoxSpellCheck); - this.groupBoxShowToolBarButtons.Controls.Add(this.labelTBVisualSync); - this.groupBoxShowToolBarButtons.Controls.Add(this.pictureBoxVisualSync); - this.groupBoxShowToolBarButtons.Controls.Add(this.checkBoxVisualSync); - this.groupBoxShowToolBarButtons.Controls.Add(this.labelTBReplace); - this.groupBoxShowToolBarButtons.Controls.Add(this.pictureBoxReplace); - this.groupBoxShowToolBarButtons.Controls.Add(this.checkBoxReplace); - this.groupBoxShowToolBarButtons.Controls.Add(this.labelTBFind); - this.groupBoxShowToolBarButtons.Controls.Add(this.pictureBoxFind); - this.groupBoxShowToolBarButtons.Controls.Add(this.checkBoxToolbarFind); - this.groupBoxShowToolBarButtons.Controls.Add(this.labelTBSaveAs); - this.groupBoxShowToolBarButtons.Controls.Add(this.pictureBoxSaveAs); - this.groupBoxShowToolBarButtons.Controls.Add(this.checkBoxToolbarSaveAs); - this.groupBoxShowToolBarButtons.Controls.Add(this.labelTBSave); - this.groupBoxShowToolBarButtons.Controls.Add(this.pictureBoxSave); - this.groupBoxShowToolBarButtons.Controls.Add(this.checkBoxToolbarSave); - this.groupBoxShowToolBarButtons.Controls.Add(this.labelTBOpen); - this.groupBoxShowToolBarButtons.Controls.Add(this.pictureBoxOpen); - this.groupBoxShowToolBarButtons.Controls.Add(this.checkBoxToolbarOpen); - this.groupBoxShowToolBarButtons.Controls.Add(this.labelTBNew); - this.groupBoxShowToolBarButtons.Controls.Add(this.pictureBoxNew); - this.groupBoxShowToolBarButtons.Controls.Add(this.checkBoxToolbarNew); - this.groupBoxShowToolBarButtons.Location = new System.Drawing.Point(6, 6); - this.groupBoxShowToolBarButtons.Name = "groupBoxShowToolBarButtons"; - this.groupBoxShowToolBarButtons.Size = new System.Drawing.Size(819, 236); - this.groupBoxShowToolBarButtons.TabIndex = 0; - this.groupBoxShowToolBarButtons.TabStop = false; - this.groupBoxShowToolBarButtons.Text = "Show toolbar buttons"; - // - // labelTBNetflixQualityCheck - // - this.labelTBNetflixQualityCheck.AutoSize = true; - this.labelTBNetflixQualityCheck.Location = new System.Drawing.Point(636, 136); - this.labelTBNetflixQualityCheck.Name = "labelTBNetflixQualityCheck"; - this.labelTBNetflixQualityCheck.Size = new System.Drawing.Size(103, 13); - this.labelTBNetflixQualityCheck.TabIndex = 42; - this.labelTBNetflixQualityCheck.Text = "Netflix quality check"; - // - // pictureBoxNetflixQualityCheck - // - this.pictureBoxNetflixQualityCheck.Location = new System.Drawing.Point(649, 155); - this.pictureBoxNetflixQualityCheck.Name = "pictureBoxNetflixQualityCheck"; - this.pictureBoxNetflixQualityCheck.Size = new System.Drawing.Size(32, 32); - this.pictureBoxNetflixQualityCheck.TabIndex = 41; - this.pictureBoxNetflixQualityCheck.TabStop = false; - // - // checkBoxNetflixQualityCheck - // - this.checkBoxNetflixQualityCheck.AutoSize = true; - this.checkBoxNetflixQualityCheck.Location = new System.Drawing.Point(652, 195); - this.checkBoxNetflixQualityCheck.Name = "checkBoxNetflixQualityCheck"; - this.checkBoxNetflixQualityCheck.Size = new System.Drawing.Size(55, 17); - this.checkBoxNetflixQualityCheck.TabIndex = 40; - this.checkBoxNetflixQualityCheck.Text = "Visible"; - this.checkBoxNetflixQualityCheck.UseVisualStyleBackColor = true; - // - // labelTBRemoveTextForHi - // - this.labelTBRemoveTextForHi.AutoSize = true; - this.labelTBRemoveTextForHi.Location = new System.Drawing.Point(124, 136); - this.labelTBRemoveTextForHi.Name = "labelTBRemoveTextForHi"; - this.labelTBRemoveTextForHi.Size = new System.Drawing.Size(100, 13); - this.labelTBRemoveTextForHi.TabIndex = 39; - this.labelTBRemoveTextForHi.Text = "Remove text for HI"; - // - // pictureBoxTBRemoveTextForHi - // - this.pictureBoxTBRemoveTextForHi.Location = new System.Drawing.Point(137, 155); - this.pictureBoxTBRemoveTextForHi.Name = "pictureBoxTBRemoveTextForHi"; - this.pictureBoxTBRemoveTextForHi.Size = new System.Drawing.Size(32, 32); - this.pictureBoxTBRemoveTextForHi.TabIndex = 38; - this.pictureBoxTBRemoveTextForHi.TabStop = false; - // - // checkBoxTBRemoveTextForHi - // - this.checkBoxTBRemoveTextForHi.AutoSize = true; - this.checkBoxTBRemoveTextForHi.Location = new System.Drawing.Point(140, 195); - this.checkBoxTBRemoveTextForHi.Name = "checkBoxTBRemoveTextForHi"; - this.checkBoxTBRemoveTextForHi.Size = new System.Drawing.Size(55, 17); - this.checkBoxTBRemoveTextForHi.TabIndex = 18; - this.checkBoxTBRemoveTextForHi.Text = "Visible"; - this.checkBoxTBRemoveTextForHi.UseVisualStyleBackColor = true; - // - // labelTBFixCommonErrors - // - this.labelTBFixCommonErrors.AutoSize = true; - this.labelTBFixCommonErrors.Location = new System.Drawing.Point(9, 136); - this.labelTBFixCommonErrors.Name = "labelTBFixCommonErrors"; - this.labelTBFixCommonErrors.Size = new System.Drawing.Size(95, 13); - this.labelTBFixCommonErrors.TabIndex = 36; - this.labelTBFixCommonErrors.Text = "Fix common errors"; - // - // pictureBoxTBFixCommonErrors - // - this.pictureBoxTBFixCommonErrors.Location = new System.Drawing.Point(22, 155); - this.pictureBoxTBFixCommonErrors.Name = "pictureBoxTBFixCommonErrors"; - this.pictureBoxTBFixCommonErrors.Size = new System.Drawing.Size(32, 32); - this.pictureBoxTBFixCommonErrors.TabIndex = 35; - this.pictureBoxTBFixCommonErrors.TabStop = false; - // - // checkBoxTBFixCommonErrors - // - this.checkBoxTBFixCommonErrors.AutoSize = true; - this.checkBoxTBFixCommonErrors.Location = new System.Drawing.Point(25, 195); - this.checkBoxTBFixCommonErrors.Name = "checkBoxTBFixCommonErrors"; - this.checkBoxTBFixCommonErrors.Size = new System.Drawing.Size(55, 17); - this.checkBoxTBFixCommonErrors.TabIndex = 17; - this.checkBoxTBFixCommonErrors.Text = "Visible"; - this.checkBoxTBFixCommonErrors.UseVisualStyleBackColor = true; - // - // labelTBHelp - // - this.labelTBHelp.AutoSize = true; - this.labelTBHelp.Location = new System.Drawing.Point(561, 136); - this.labelTBHelp.Name = "labelTBHelp"; - this.labelTBHelp.Size = new System.Drawing.Size(28, 13); - this.labelTBHelp.TabIndex = 33; - this.labelTBHelp.Text = "Help"; - // - // pictureBoxHelp - // - this.pictureBoxHelp.Location = new System.Drawing.Point(560, 155); - this.pictureBoxHelp.Name = "pictureBoxHelp"; - this.pictureBoxHelp.Size = new System.Drawing.Size(32, 32); - this.pictureBoxHelp.TabIndex = 32; - this.pictureBoxHelp.TabStop = false; - // - // checkBoxHelp - // - this.checkBoxHelp.AutoSize = true; - this.checkBoxHelp.Location = new System.Drawing.Point(563, 195); - this.checkBoxHelp.Name = "checkBoxHelp"; - this.checkBoxHelp.Size = new System.Drawing.Size(55, 17); - this.checkBoxHelp.TabIndex = 22; - this.checkBoxHelp.Text = "Visible"; - this.checkBoxHelp.UseVisualStyleBackColor = true; - // - // labelTBSettings - // - this.labelTBSettings.AutoSize = true; - this.labelTBSettings.Location = new System.Drawing.Point(456, 136); - this.labelTBSettings.Name = "labelTBSettings"; - this.labelTBSettings.Size = new System.Drawing.Size(46, 13); - this.labelTBSettings.TabIndex = 30; - this.labelTBSettings.Text = "Settings"; - // - // pictureBoxSettings - // - this.pictureBoxSettings.Location = new System.Drawing.Point(459, 155); - this.pictureBoxSettings.Name = "pictureBoxSettings"; - this.pictureBoxSettings.Size = new System.Drawing.Size(32, 32); - this.pictureBoxSettings.TabIndex = 29; - this.pictureBoxSettings.TabStop = false; - // - // checkBoxSettings - // - this.checkBoxSettings.AutoSize = true; - this.checkBoxSettings.Location = new System.Drawing.Point(462, 195); - this.checkBoxSettings.Name = "checkBoxSettings"; - this.checkBoxSettings.Size = new System.Drawing.Size(55, 17); - this.checkBoxSettings.TabIndex = 21; - this.checkBoxSettings.Text = "Visible"; - this.checkBoxSettings.UseVisualStyleBackColor = true; - // - // labelTBSpellCheck - // - this.labelTBSpellCheck.AutoSize = true; - this.labelTBSpellCheck.Location = new System.Drawing.Point(357, 136); - this.labelTBSpellCheck.Name = "labelTBSpellCheck"; - this.labelTBSpellCheck.Size = new System.Drawing.Size(59, 13); - this.labelTBSpellCheck.TabIndex = 27; - this.labelTBSpellCheck.Text = "Spell check"; - // - // pictureBoxSpellCheck - // - this.pictureBoxSpellCheck.Location = new System.Drawing.Point(361, 155); - this.pictureBoxSpellCheck.Name = "pictureBoxSpellCheck"; - this.pictureBoxSpellCheck.Size = new System.Drawing.Size(32, 32); - this.pictureBoxSpellCheck.TabIndex = 26; - this.pictureBoxSpellCheck.TabStop = false; - // - // checkBoxSpellCheck - // - this.checkBoxSpellCheck.AutoSize = true; - this.checkBoxSpellCheck.Location = new System.Drawing.Point(362, 195); - this.checkBoxSpellCheck.Name = "checkBoxSpellCheck"; - this.checkBoxSpellCheck.Size = new System.Drawing.Size(55, 17); - this.checkBoxSpellCheck.TabIndex = 20; - this.checkBoxSpellCheck.Text = "Visible"; - this.checkBoxSpellCheck.UseVisualStyleBackColor = true; - // - // labelTBVisualSync - // - this.labelTBVisualSync.AutoSize = true; - this.labelTBVisualSync.Location = new System.Drawing.Point(247, 136); - this.labelTBVisualSync.Name = "labelTBVisualSync"; - this.labelTBVisualSync.Size = new System.Drawing.Size(59, 13); - this.labelTBVisualSync.TabIndex = 21; - this.labelTBVisualSync.Text = "Visual sync"; - // - // pictureBoxVisualSync - // - this.pictureBoxVisualSync.Location = new System.Drawing.Point(260, 155); - this.pictureBoxVisualSync.Name = "pictureBoxVisualSync"; - this.pictureBoxVisualSync.Size = new System.Drawing.Size(32, 32); - this.pictureBoxVisualSync.TabIndex = 20; - this.pictureBoxVisualSync.TabStop = false; - // - // checkBoxVisualSync - // - this.checkBoxVisualSync.AutoSize = true; - this.checkBoxVisualSync.Location = new System.Drawing.Point(263, 195); - this.checkBoxVisualSync.Name = "checkBoxVisualSync"; - this.checkBoxVisualSync.Size = new System.Drawing.Size(55, 17); - this.checkBoxVisualSync.TabIndex = 19; - this.checkBoxVisualSync.Text = "Visible"; - this.checkBoxVisualSync.UseVisualStyleBackColor = true; - // - // labelTBReplace - // - this.labelTBReplace.AutoSize = true; - this.labelTBReplace.Location = new System.Drawing.Point(521, 22); - this.labelTBReplace.Name = "labelTBReplace"; - this.labelTBReplace.Size = new System.Drawing.Size(45, 13); - this.labelTBReplace.TabIndex = 18; - this.labelTBReplace.Text = "Replace"; - // - // pictureBoxReplace - // - this.pictureBoxReplace.Location = new System.Drawing.Point(526, 41); - this.pictureBoxReplace.Name = "pictureBoxReplace"; - this.pictureBoxReplace.Size = new System.Drawing.Size(32, 32); - this.pictureBoxReplace.TabIndex = 17; - this.pictureBoxReplace.TabStop = false; - // - // checkBoxReplace - // - this.checkBoxReplace.AutoSize = true; - this.checkBoxReplace.Location = new System.Drawing.Point(529, 81); - this.checkBoxReplace.Name = "checkBoxReplace"; - this.checkBoxReplace.Size = new System.Drawing.Size(55, 17); - this.checkBoxReplace.TabIndex = 16; - this.checkBoxReplace.Text = "Visible"; - this.checkBoxReplace.UseVisualStyleBackColor = true; - // - // labelTBFind - // - this.labelTBFind.AutoSize = true; - this.labelTBFind.Location = new System.Drawing.Point(425, 22); - this.labelTBFind.Name = "labelTBFind"; - this.labelTBFind.Size = new System.Drawing.Size(27, 13); - this.labelTBFind.TabIndex = 15; - this.labelTBFind.Text = "Find"; - // - // pictureBoxFind - // - this.pictureBoxFind.Location = new System.Drawing.Point(423, 41); - this.pictureBoxFind.Name = "pictureBoxFind"; - this.pictureBoxFind.Size = new System.Drawing.Size(32, 32); - this.pictureBoxFind.TabIndex = 14; - this.pictureBoxFind.TabStop = false; - // - // checkBoxToolbarFind - // - this.checkBoxToolbarFind.AutoSize = true; - this.checkBoxToolbarFind.Location = new System.Drawing.Point(426, 81); - this.checkBoxToolbarFind.Name = "checkBoxToolbarFind"; - this.checkBoxToolbarFind.Size = new System.Drawing.Size(55, 17); - this.checkBoxToolbarFind.TabIndex = 13; - this.checkBoxToolbarFind.Text = "Visible"; - this.checkBoxToolbarFind.UseVisualStyleBackColor = true; - // - // labelTBSaveAs - // - this.labelTBSaveAs.AutoSize = true; - this.labelTBSaveAs.Location = new System.Drawing.Point(316, 22); - this.labelTBSaveAs.Name = "labelTBSaveAs"; - this.labelTBSaveAs.Size = new System.Drawing.Size(45, 13); - this.labelTBSaveAs.TabIndex = 12; - this.labelTBSaveAs.Text = "Save as"; - // - // pictureBoxSaveAs - // - this.pictureBoxSaveAs.Location = new System.Drawing.Point(322, 41); - this.pictureBoxSaveAs.Name = "pictureBoxSaveAs"; - this.pictureBoxSaveAs.Size = new System.Drawing.Size(32, 32); - this.pictureBoxSaveAs.TabIndex = 11; - this.pictureBoxSaveAs.TabStop = false; - // - // checkBoxToolbarSaveAs - // - this.checkBoxToolbarSaveAs.AutoSize = true; - this.checkBoxToolbarSaveAs.Location = new System.Drawing.Point(325, 81); - this.checkBoxToolbarSaveAs.Name = "checkBoxToolbarSaveAs"; - this.checkBoxToolbarSaveAs.Size = new System.Drawing.Size(55, 17); - this.checkBoxToolbarSaveAs.TabIndex = 10; - this.checkBoxToolbarSaveAs.Text = "Visible"; - this.checkBoxToolbarSaveAs.UseVisualStyleBackColor = true; - // - // labelTBSave - // - this.labelTBSave.AutoSize = true; - this.labelTBSave.Location = new System.Drawing.Point(225, 22); - this.labelTBSave.Name = "labelTBSave"; - this.labelTBSave.Size = new System.Drawing.Size(31, 13); - this.labelTBSave.TabIndex = 9; - this.labelTBSave.Text = "Save"; - // - // pictureBoxSave - // - this.pictureBoxSave.Location = new System.Drawing.Point(224, 41); - this.pictureBoxSave.Name = "pictureBoxSave"; - this.pictureBoxSave.Size = new System.Drawing.Size(32, 32); - this.pictureBoxSave.TabIndex = 8; - this.pictureBoxSave.TabStop = false; - // - // checkBoxToolbarSave - // - this.checkBoxToolbarSave.AutoSize = true; - this.checkBoxToolbarSave.Location = new System.Drawing.Point(227, 81); - this.checkBoxToolbarSave.Name = "checkBoxToolbarSave"; - this.checkBoxToolbarSave.Size = new System.Drawing.Size(55, 17); - this.checkBoxToolbarSave.TabIndex = 7; - this.checkBoxToolbarSave.Text = "Visible"; - this.checkBoxToolbarSave.UseVisualStyleBackColor = true; - // - // labelTBOpen - // - this.labelTBOpen.AutoSize = true; - this.labelTBOpen.Location = new System.Drawing.Point(124, 22); - this.labelTBOpen.Name = "labelTBOpen"; - this.labelTBOpen.Size = new System.Drawing.Size(33, 13); - this.labelTBOpen.TabIndex = 6; - this.labelTBOpen.Text = "Open"; - // - // pictureBoxOpen - // - this.pictureBoxOpen.Location = new System.Drawing.Point(123, 41); - this.pictureBoxOpen.Name = "pictureBoxOpen"; - this.pictureBoxOpen.Size = new System.Drawing.Size(32, 32); - this.pictureBoxOpen.TabIndex = 5; - this.pictureBoxOpen.TabStop = false; - // - // checkBoxToolbarOpen - // - this.checkBoxToolbarOpen.AutoSize = true; - this.checkBoxToolbarOpen.Location = new System.Drawing.Point(126, 81); - this.checkBoxToolbarOpen.Name = "checkBoxToolbarOpen"; - this.checkBoxToolbarOpen.Size = new System.Drawing.Size(55, 17); - this.checkBoxToolbarOpen.TabIndex = 4; - this.checkBoxToolbarOpen.Text = "Visible"; - this.checkBoxToolbarOpen.UseVisualStyleBackColor = true; - // - // labelTBNew - // - this.labelTBNew.AutoSize = true; - this.labelTBNew.Location = new System.Drawing.Point(24, 22); - this.labelTBNew.Name = "labelTBNew"; - this.labelTBNew.Size = new System.Drawing.Size(28, 13); - this.labelTBNew.TabIndex = 3; - this.labelTBNew.Text = "New"; - // - // pictureBoxNew - // - this.pictureBoxNew.Location = new System.Drawing.Point(22, 41); - this.pictureBoxNew.Name = "pictureBoxNew"; - this.pictureBoxNew.Size = new System.Drawing.Size(32, 32); - this.pictureBoxNew.TabIndex = 2; - this.pictureBoxNew.TabStop = false; - // - // checkBoxToolbarNew - // - this.checkBoxToolbarNew.AutoSize = true; - this.checkBoxToolbarNew.Location = new System.Drawing.Point(25, 81); - this.checkBoxToolbarNew.Name = "checkBoxToolbarNew"; - this.checkBoxToolbarNew.Size = new System.Drawing.Size(55, 17); - this.checkBoxToolbarNew.TabIndex = 1; - this.checkBoxToolbarNew.Text = "Visible"; - this.checkBoxToolbarNew.UseVisualStyleBackColor = true; - // - // tabPageFont - // - this.tabPageFont.Controls.Add(this.groupBoxFont); - this.tabPageFont.Location = new System.Drawing.Point(4, 22); - this.tabPageFont.Name = "tabPageFont"; - this.tabPageFont.Size = new System.Drawing.Size(832, 520); - this.tabPageFont.TabIndex = 10; - this.tabPageFont.Text = "Font"; - this.tabPageFont.UseVisualStyleBackColor = true; - // - // groupBoxFont - // - this.groupBoxFont.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxFont.Controls.Add(this.labelFontNote); - this.groupBoxFont.Controls.Add(this.groupBoxFontTextBox); - this.groupBoxFont.Controls.Add(this.groupBoxFontListViews); - this.groupBoxFont.Controls.Add(this.groupBoxFontGeneral); - this.groupBoxFont.Location = new System.Drawing.Point(3, 3); - this.groupBoxFont.Name = "groupBoxFont"; - this.groupBoxFont.Size = new System.Drawing.Size(826, 509); - this.groupBoxFont.TabIndex = 0; - this.groupBoxFont.TabStop = false; - this.groupBoxFont.Text = "Font in UI"; - // - // labelFontNote - // - this.labelFontNote.AutoSize = true; - this.labelFontNote.Location = new System.Drawing.Point(11, 352); - this.labelFontNote.Name = "labelFontNote"; - this.labelFontNote.Size = new System.Drawing.Size(278, 13); - this.labelFontNote.TabIndex = 41; - this.labelFontNote.Text = "Note: This is only to set the font in the Subtitle Edit UI..."; - // - // groupBoxFontTextBox - // - this.groupBoxFontTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxFontTextBox.Controls.Add(this.panelTextBoxAssColor); - this.groupBoxFontTextBox.Controls.Add(this.buttonTextBoxAssColor); - this.groupBoxFontTextBox.Controls.Add(this.panelTextBoxHtmlColor); - this.groupBoxFontTextBox.Controls.Add(this.buttonTextBoxHtmlColor); - this.groupBoxFontTextBox.Controls.Add(this.checkBoxSubtitleTextBoxSyntaxColor); - this.groupBoxFontTextBox.Controls.Add(this.labelSubtitleFontSize); - this.groupBoxFontTextBox.Controls.Add(this.comboBoxSubtitleFontSize); - this.groupBoxFontTextBox.Controls.Add(this.checkBoxSubtitleFontBold); - this.groupBoxFontTextBox.Controls.Add(this.checkBoxSubtitleCenter); - this.groupBoxFontTextBox.Location = new System.Drawing.Point(14, 228); - this.groupBoxFontTextBox.Name = "groupBoxFontTextBox"; - this.groupBoxFontTextBox.Size = new System.Drawing.Size(806, 116); - this.groupBoxFontTextBox.TabIndex = 40; - this.groupBoxFontTextBox.TabStop = false; - this.groupBoxFontTextBox.Text = "Text box"; - // - // panelTextBoxAssColor - // - this.panelTextBoxAssColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.panelTextBoxAssColor.Location = new System.Drawing.Point(520, 73); - this.panelTextBoxAssColor.Name = "panelTextBoxAssColor"; - this.panelTextBoxAssColor.Size = new System.Drawing.Size(21, 20); - this.panelTextBoxAssColor.TabIndex = 38; - this.panelTextBoxAssColor.MouseClick += new System.Windows.Forms.MouseEventHandler(this.panelTextBoxAssColor_MouseClick); - // - // buttonTextBoxAssColor - // - this.buttonTextBoxAssColor.Location = new System.Drawing.Point(396, 72); - this.buttonTextBoxAssColor.Name = "buttonTextBoxAssColor"; - this.buttonTextBoxAssColor.Size = new System.Drawing.Size(112, 23); - this.buttonTextBoxAssColor.TabIndex = 36; - this.buttonTextBoxAssColor.Text = "ASSA color"; - this.buttonTextBoxAssColor.UseVisualStyleBackColor = true; - this.buttonTextBoxAssColor.Click += new System.EventHandler(this.buttonTextBoxAssColor_Click); - // - // panelTextBoxHtmlColor - // - this.panelTextBoxHtmlColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.panelTextBoxHtmlColor.Location = new System.Drawing.Point(520, 44); - this.panelTextBoxHtmlColor.Name = "panelTextBoxHtmlColor"; - this.panelTextBoxHtmlColor.Size = new System.Drawing.Size(21, 20); - this.panelTextBoxHtmlColor.TabIndex = 37; - this.panelTextBoxHtmlColor.MouseClick += new System.Windows.Forms.MouseEventHandler(this.panelTextBoxHtmlColor_MouseClick); - // - // buttonTextBoxHtmlColor - // - this.buttonTextBoxHtmlColor.Location = new System.Drawing.Point(396, 43); - this.buttonTextBoxHtmlColor.Name = "buttonTextBoxHtmlColor"; - this.buttonTextBoxHtmlColor.Size = new System.Drawing.Size(112, 23); - this.buttonTextBoxHtmlColor.TabIndex = 35; - this.buttonTextBoxHtmlColor.Text = "Html color"; - this.buttonTextBoxHtmlColor.UseVisualStyleBackColor = true; - this.buttonTextBoxHtmlColor.Click += new System.EventHandler(this.buttonTextBoxHtmlColor_Click); - // - // checkBoxSubtitleTextBoxSyntaxColor - // - this.checkBoxSubtitleTextBoxSyntaxColor.AutoSize = true; - this.checkBoxSubtitleTextBoxSyntaxColor.Location = new System.Drawing.Point(396, 20); - this.checkBoxSubtitleTextBoxSyntaxColor.Name = "checkBoxSubtitleTextBoxSyntaxColor"; - this.checkBoxSubtitleTextBoxSyntaxColor.Size = new System.Drawing.Size(120, 17); - this.checkBoxSubtitleTextBoxSyntaxColor.TabIndex = 34; - this.checkBoxSubtitleTextBoxSyntaxColor.Text = "Use syntax coloring"; - this.checkBoxSubtitleTextBoxSyntaxColor.UseVisualStyleBackColor = true; - this.checkBoxSubtitleTextBoxSyntaxColor.CheckedChanged += new System.EventHandler(this.checkBoxSubtitleTextBoxSyntaxColor_CheckedChanged); - // - // labelSubtitleFontSize - // - this.labelSubtitleFontSize.AutoSize = true; - this.labelSubtitleFontSize.Location = new System.Drawing.Point(18, 17); - this.labelSubtitleFontSize.Name = "labelSubtitleFontSize"; - this.labelSubtitleFontSize.Size = new System.Drawing.Size(87, 13); - this.labelSubtitleFontSize.TabIndex = 30; - this.labelSubtitleFontSize.Text = "Subtitle font size"; - // - // comboBoxSubtitleFontSize - // - this.comboBoxSubtitleFontSize.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxSubtitleFontSize.FormattingEnabled = true; - this.comboBoxSubtitleFontSize.Items.AddRange(new object[] { - "7", - "8", - "9", - "10", - "11", - "12", - "13", - "14", - "15", - "16", - "17", - "18", - "19", - "20", - "21", - "22", - "23", - "24", - "25", - "26", - "27", - "28", - "29", - "30"}); - this.comboBoxSubtitleFontSize.Location = new System.Drawing.Point(215, 14); - this.comboBoxSubtitleFontSize.Name = "comboBoxSubtitleFontSize"; - this.comboBoxSubtitleFontSize.Size = new System.Drawing.Size(73, 21); - this.comboBoxSubtitleFontSize.TabIndex = 31; - // - // checkBoxSubtitleFontBold - // - this.checkBoxSubtitleFontBold.AutoSize = true; - this.checkBoxSubtitleFontBold.Location = new System.Drawing.Point(215, 41); - this.checkBoxSubtitleFontBold.Name = "checkBoxSubtitleFontBold"; - this.checkBoxSubtitleFontBold.Size = new System.Drawing.Size(46, 17); - this.checkBoxSubtitleFontBold.TabIndex = 32; - this.checkBoxSubtitleFontBold.Text = "Bold"; - this.checkBoxSubtitleFontBold.UseVisualStyleBackColor = true; - // - // checkBoxSubtitleCenter - // - this.checkBoxSubtitleCenter.AutoSize = true; - this.checkBoxSubtitleCenter.Location = new System.Drawing.Point(215, 64); - this.checkBoxSubtitleCenter.Name = "checkBoxSubtitleCenter"; - this.checkBoxSubtitleCenter.Size = new System.Drawing.Size(59, 17); - this.checkBoxSubtitleCenter.TabIndex = 33; - this.checkBoxSubtitleCenter.Text = "Center"; - this.checkBoxSubtitleCenter.UseVisualStyleBackColor = true; - // - // groupBoxFontListViews - // - this.groupBoxFontListViews.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxFontListViews.Controls.Add(this.labelSubtitleListViewFontSize); - this.groupBoxFontListViews.Controls.Add(this.comboBoxSubtitleListViewFontSize); - this.groupBoxFontListViews.Controls.Add(this.checkBoxSubtitleListViewFontBold); - this.groupBoxFontListViews.Location = new System.Drawing.Point(14, 141); - this.groupBoxFontListViews.Name = "groupBoxFontListViews"; - this.groupBoxFontListViews.Size = new System.Drawing.Size(806, 81); - this.groupBoxFontListViews.TabIndex = 39; - this.groupBoxFontListViews.TabStop = false; - this.groupBoxFontListViews.Text = "List view"; - // - // labelSubtitleListViewFontSize - // - this.labelSubtitleListViewFontSize.AutoSize = true; - this.labelSubtitleListViewFontSize.Location = new System.Drawing.Point(13, 17); - this.labelSubtitleListViewFontSize.Name = "labelSubtitleListViewFontSize"; - this.labelSubtitleListViewFontSize.Size = new System.Drawing.Size(87, 13); - this.labelSubtitleListViewFontSize.TabIndex = 33; - this.labelSubtitleListViewFontSize.Text = "Subtitle font size"; - // - // comboBoxSubtitleListViewFontSize - // - this.comboBoxSubtitleListViewFontSize.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxSubtitleListViewFontSize.FormattingEnabled = true; - this.comboBoxSubtitleListViewFontSize.Items.AddRange(new object[] { - "7", - "8", - "9", - "10", - "11", - "12", - "13", - "14", - "15", - "16", - "17", - "18", - "19", - "20"}); - this.comboBoxSubtitleListViewFontSize.Location = new System.Drawing.Point(210, 14); - this.comboBoxSubtitleListViewFontSize.Name = "comboBoxSubtitleListViewFontSize"; - this.comboBoxSubtitleListViewFontSize.Size = new System.Drawing.Size(73, 21); - this.comboBoxSubtitleListViewFontSize.TabIndex = 34; - // - // checkBoxSubtitleListViewFontBold - // - this.checkBoxSubtitleListViewFontBold.AutoSize = true; - this.checkBoxSubtitleListViewFontBold.Location = new System.Drawing.Point(210, 41); - this.checkBoxSubtitleListViewFontBold.Name = "checkBoxSubtitleListViewFontBold"; - this.checkBoxSubtitleListViewFontBold.Size = new System.Drawing.Size(46, 17); - this.checkBoxSubtitleListViewFontBold.TabIndex = 35; - this.checkBoxSubtitleListViewFontBold.Text = "Bold"; - this.checkBoxSubtitleListViewFontBold.UseVisualStyleBackColor = true; - // - // groupBoxFontGeneral - // - this.groupBoxFontGeneral.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxFontGeneral.Controls.Add(this.comboBoxSubtitleFont); - this.groupBoxFontGeneral.Controls.Add(this.labelSubtitleFont); - this.groupBoxFontGeneral.Controls.Add(this.panelSubtitleFontColor); - this.groupBoxFontGeneral.Controls.Add(this.labelSubtitleFontColor); - this.groupBoxFontGeneral.Controls.Add(this.panelSubtitleBackgroundColor); - this.groupBoxFontGeneral.Controls.Add(this.labelSubtitleFontBackgroundColor); - this.groupBoxFontGeneral.Location = new System.Drawing.Point(14, 20); - this.groupBoxFontGeneral.Name = "groupBoxFontGeneral"; - this.groupBoxFontGeneral.Size = new System.Drawing.Size(806, 115); - this.groupBoxFontGeneral.TabIndex = 38; - this.groupBoxFontGeneral.TabStop = false; - this.groupBoxFontGeneral.Text = "General"; - // - // comboBoxSubtitleFont - // - this.comboBoxSubtitleFont.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxSubtitleFont.FormattingEnabled = true; - this.comboBoxSubtitleFont.Location = new System.Drawing.Point(210, 20); - this.comboBoxSubtitleFont.Name = "comboBoxSubtitleFont"; - this.comboBoxSubtitleFont.Size = new System.Drawing.Size(188, 21); - this.comboBoxSubtitleFont.TabIndex = 29; - // - // labelSubtitleFont - // - this.labelSubtitleFont.AutoSize = true; - this.labelSubtitleFont.Location = new System.Drawing.Point(13, 26); - this.labelSubtitleFont.Name = "labelSubtitleFont"; - this.labelSubtitleFont.Size = new System.Drawing.Size(66, 13); - this.labelSubtitleFont.TabIndex = 28; - this.labelSubtitleFont.Text = "Subtitle font"; - // - // panelSubtitleFontColor - // - this.panelSubtitleFontColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.panelSubtitleFontColor.Location = new System.Drawing.Point(210, 51); - this.panelSubtitleFontColor.Name = "panelSubtitleFontColor"; - this.panelSubtitleFontColor.Size = new System.Drawing.Size(46, 15); - this.panelSubtitleFontColor.TabIndex = 35; - this.panelSubtitleFontColor.Click += new System.EventHandler(this.panelSubtitleFontColor_Click); - // - // labelSubtitleFontColor - // - this.labelSubtitleFontColor.AutoSize = true; - this.labelSubtitleFontColor.Location = new System.Drawing.Point(13, 50); - this.labelSubtitleFontColor.Name = "labelSubtitleFontColor"; - this.labelSubtitleFontColor.Size = new System.Drawing.Size(92, 13); - this.labelSubtitleFontColor.TabIndex = 34; - this.labelSubtitleFontColor.Text = "Subtitle font color"; - // - // panelSubtitleBackgroundColor - // - this.panelSubtitleBackgroundColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.panelSubtitleBackgroundColor.Location = new System.Drawing.Point(210, 71); - this.panelSubtitleBackgroundColor.Name = "panelSubtitleBackgroundColor"; - this.panelSubtitleBackgroundColor.Size = new System.Drawing.Size(46, 15); - this.panelSubtitleBackgroundColor.TabIndex = 37; - this.panelSubtitleBackgroundColor.Click += new System.EventHandler(this.panelSubtitleBackgroundColor_Click); - // - // labelSubtitleFontBackgroundColor - // - this.labelSubtitleFontBackgroundColor.AutoSize = true; - this.labelSubtitleFontBackgroundColor.Location = new System.Drawing.Point(13, 70); - this.labelSubtitleFontBackgroundColor.Name = "labelSubtitleFontBackgroundColor"; - this.labelSubtitleFontBackgroundColor.Size = new System.Drawing.Size(151, 13); - this.labelSubtitleFontBackgroundColor.TabIndex = 36; - this.labelSubtitleFontBackgroundColor.Text = "Subtitle font background color"; - // - // tabPageSsaStyle - // - this.tabPageSsaStyle.Controls.Add(this.groupBoxSsaStyle); - this.tabPageSsaStyle.Location = new System.Drawing.Point(4, 22); - this.tabPageSsaStyle.Name = "tabPageSsaStyle"; - this.tabPageSsaStyle.Padding = new System.Windows.Forms.Padding(3); - this.tabPageSsaStyle.Size = new System.Drawing.Size(832, 520); - this.tabPageSsaStyle.TabIndex = 1; - this.tabPageSsaStyle.Text = "SSA style"; - this.tabPageSsaStyle.UseVisualStyleBackColor = true; - // - // groupBoxSsaStyle - // - this.groupBoxSsaStyle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxSsaStyle.Controls.Add(this.groupBoxSsaBorder); - this.groupBoxSsaStyle.Controls.Add(this.groupSsaBoxFont); - this.groupBoxSsaStyle.Controls.Add(this.groupBoxMargins); - this.groupBoxSsaStyle.Controls.Add(this.groupBoxPreview); - this.groupBoxSsaStyle.Location = new System.Drawing.Point(6, 6); - this.groupBoxSsaStyle.Name = "groupBoxSsaStyle"; - this.groupBoxSsaStyle.Size = new System.Drawing.Size(819, 456); - this.groupBoxSsaStyle.TabIndex = 0; - this.groupBoxSsaStyle.TabStop = false; - this.groupBoxSsaStyle.Text = "Sub Station Alpha style"; - // - // groupBoxSsaBorder - // - this.groupBoxSsaBorder.Controls.Add(this.numericUpDownSsaOutline); - this.groupBoxSsaBorder.Controls.Add(this.labelSsaShadow); - this.groupBoxSsaBorder.Controls.Add(this.numericUpDownSsaShadow); - this.groupBoxSsaBorder.Controls.Add(this.checkBoxSsaOpaqueBox); - this.groupBoxSsaBorder.Controls.Add(this.labelSsaOutline); - this.groupBoxSsaBorder.Location = new System.Drawing.Point(329, 21); - this.groupBoxSsaBorder.Name = "groupBoxSsaBorder"; - this.groupBoxSsaBorder.Size = new System.Drawing.Size(185, 96); - this.groupBoxSsaBorder.TabIndex = 8; - this.groupBoxSsaBorder.TabStop = false; - this.groupBoxSsaBorder.Text = "Border"; - // - // numericUpDownSsaOutline - // - this.numericUpDownSsaOutline.Location = new System.Drawing.Point(64, 16); - this.numericUpDownSsaOutline.Maximum = new decimal(new int[] { - 9, - 0, - 0, - 0}); - this.numericUpDownSsaOutline.Name = "numericUpDownSsaOutline"; - this.numericUpDownSsaOutline.Size = new System.Drawing.Size(44, 21); - this.numericUpDownSsaOutline.TabIndex = 5; - this.numericUpDownSsaOutline.ValueChanged += new System.EventHandler(this.numericUpDownSsaOutline_ValueChanged); - // - // labelSsaShadow - // - this.labelSsaShadow.AutoSize = true; - this.labelSsaShadow.Location = new System.Drawing.Point(10, 45); - this.labelSsaShadow.Name = "labelSsaShadow"; - this.labelSsaShadow.Size = new System.Drawing.Size(45, 13); - this.labelSsaShadow.TabIndex = 6; - this.labelSsaShadow.Text = "Shadow"; - // - // numericUpDownSsaShadow - // - this.numericUpDownSsaShadow.Location = new System.Drawing.Point(64, 43); - this.numericUpDownSsaShadow.Maximum = new decimal(new int[] { - 9, - 0, - 0, - 0}); - this.numericUpDownSsaShadow.Name = "numericUpDownSsaShadow"; - this.numericUpDownSsaShadow.Size = new System.Drawing.Size(44, 21); - this.numericUpDownSsaShadow.TabIndex = 7; - this.numericUpDownSsaShadow.ValueChanged += new System.EventHandler(this.numericUpDownSsaShadow_ValueChanged); - // - // checkBoxSsaOpaqueBox - // - this.checkBoxSsaOpaqueBox.AutoSize = true; - this.checkBoxSsaOpaqueBox.Location = new System.Drawing.Point(13, 71); - this.checkBoxSsaOpaqueBox.Name = "checkBoxSsaOpaqueBox"; - this.checkBoxSsaOpaqueBox.Size = new System.Drawing.Size(85, 17); - this.checkBoxSsaOpaqueBox.TabIndex = 8; - this.checkBoxSsaOpaqueBox.Text = "Opaque box"; - this.checkBoxSsaOpaqueBox.UseVisualStyleBackColor = true; - this.checkBoxSsaOpaqueBox.CheckedChanged += new System.EventHandler(this.checkBoxSsaOpaqueBox_CheckedChanged); - // - // labelSsaOutline - // - this.labelSsaOutline.AutoSize = true; - this.labelSsaOutline.Location = new System.Drawing.Point(10, 20); - this.labelSsaOutline.Name = "labelSsaOutline"; - this.labelSsaOutline.Size = new System.Drawing.Size(41, 13); - this.labelSsaOutline.TabIndex = 4; - this.labelSsaOutline.Text = "Outline"; - // - // groupSsaBoxFont - // - this.groupSsaBoxFont.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupSsaBoxFont.Controls.Add(this.checkBoxSsaFontBold); - this.groupSsaBoxFont.Controls.Add(this.buttonSsaColor); - this.groupSsaBoxFont.Controls.Add(this.panelPrimaryColor); - this.groupSsaBoxFont.Controls.Add(this.numericUpDownFontSize); - this.groupSsaBoxFont.Controls.Add(this.comboBoxFontName); - this.groupSsaBoxFont.Controls.Add(this.labelSsaFontSize); - this.groupSsaBoxFont.Controls.Add(this.labelFontName); - this.groupSsaBoxFont.Location = new System.Drawing.Point(6, 20); - this.groupSsaBoxFont.Name = "groupSsaBoxFont"; - this.groupSsaBoxFont.Size = new System.Drawing.Size(323, 97); - this.groupSsaBoxFont.TabIndex = 7; - this.groupSsaBoxFont.TabStop = false; - this.groupSsaBoxFont.Text = "Font"; - // - // checkBoxSsaFontBold - // - this.checkBoxSsaFontBold.AutoSize = true; - this.checkBoxSsaFontBold.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.checkBoxSsaFontBold.Location = new System.Drawing.Point(184, 45); - this.checkBoxSsaFontBold.Name = "checkBoxSsaFontBold"; - this.checkBoxSsaFontBold.Size = new System.Drawing.Size(51, 17); - this.checkBoxSsaFontBold.TabIndex = 7; - this.checkBoxSsaFontBold.Text = "Bold"; - this.checkBoxSsaFontBold.UseVisualStyleBackColor = true; - this.checkBoxSsaFontBold.CheckedChanged += new System.EventHandler(this.checkBoxSsaFontBold_CheckedChanged); - // - // buttonSsaColor - // - this.buttonSsaColor.Location = new System.Drawing.Point(6, 66); - this.buttonSsaColor.Name = "buttonSsaColor"; - this.buttonSsaColor.Size = new System.Drawing.Size(109, 23); - this.buttonSsaColor.TabIndex = 6; - this.buttonSsaColor.Text = "Choose color"; - this.buttonSsaColor.UseVisualStyleBackColor = true; - this.buttonSsaColor.Click += new System.EventHandler(this.buttonSsaColor_Click); - // - // panelPrimaryColor - // - this.panelPrimaryColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.panelPrimaryColor.Location = new System.Drawing.Point(121, 68); - this.panelPrimaryColor.Name = "panelPrimaryColor"; - this.panelPrimaryColor.Size = new System.Drawing.Size(21, 20); - this.panelPrimaryColor.TabIndex = 4; - this.panelPrimaryColor.MouseClick += new System.Windows.Forms.MouseEventHandler(this.panelPrimaryColor_MouseClick); - // - // numericUpDownFontSize - // - this.numericUpDownFontSize.Location = new System.Drawing.Point(121, 44); - this.numericUpDownFontSize.Maximum = new decimal(new int[] { - 200, - 0, - 0, - 0}); - this.numericUpDownFontSize.Name = "numericUpDownFontSize"; - this.numericUpDownFontSize.Size = new System.Drawing.Size(51, 21); - this.numericUpDownFontSize.TabIndex = 3; - this.numericUpDownFontSize.ValueChanged += new System.EventHandler(this.numericUpDownFontSize_ValueChanged); - // - // comboBoxFontName - // - this.comboBoxFontName.FormattingEnabled = true; - this.comboBoxFontName.Location = new System.Drawing.Point(121, 17); - this.comboBoxFontName.Name = "comboBoxFontName"; - this.comboBoxFontName.Size = new System.Drawing.Size(188, 21); - this.comboBoxFontName.TabIndex = 1; - this.comboBoxFontName.TextChanged += new System.EventHandler(this.comboBoxFontName_TextChanged); - // - // labelSsaFontSize - // - this.labelSsaFontSize.AutoSize = true; - this.labelSsaFontSize.Location = new System.Drawing.Point(10, 46); - this.labelSsaFontSize.Name = "labelSsaFontSize"; - this.labelSsaFontSize.Size = new System.Drawing.Size(50, 13); - this.labelSsaFontSize.TabIndex = 2; - this.labelSsaFontSize.Text = "Font size"; - // - // labelFontName - // - this.labelFontName.AutoSize = true; - this.labelFontName.Location = new System.Drawing.Point(10, 20); - this.labelFontName.Name = "labelFontName"; - this.labelFontName.Size = new System.Drawing.Size(58, 13); - this.labelFontName.TabIndex = 0; - this.labelFontName.Text = "Font name"; - // - // groupBoxMargins - // - this.groupBoxMargins.Controls.Add(this.numericUpDownSsaMarginVertical); - this.groupBoxMargins.Controls.Add(this.numericUpDownSsaMarginRight); - this.groupBoxMargins.Controls.Add(this.numericUpDownSsaMarginLeft); - this.groupBoxMargins.Controls.Add(this.labelMarginVertical); - this.groupBoxMargins.Controls.Add(this.labelMarginRight); - this.groupBoxMargins.Controls.Add(this.labelMarginLeft); - this.groupBoxMargins.Location = new System.Drawing.Point(520, 20); - this.groupBoxMargins.Name = "groupBoxMargins"; - this.groupBoxMargins.Size = new System.Drawing.Size(281, 97); - this.groupBoxMargins.TabIndex = 9; - this.groupBoxMargins.TabStop = false; - this.groupBoxMargins.Text = "Margins"; - // - // numericUpDownSsaMarginVertical - // - this.numericUpDownSsaMarginVertical.Location = new System.Drawing.Point(168, 33); - this.numericUpDownSsaMarginVertical.Maximum = new decimal(new int[] { - 1000, - 0, - 0, - 0}); - this.numericUpDownSsaMarginVertical.Name = "numericUpDownSsaMarginVertical"; - this.numericUpDownSsaMarginVertical.Size = new System.Drawing.Size(44, 21); - this.numericUpDownSsaMarginVertical.TabIndex = 5; - this.numericUpDownSsaMarginVertical.ValueChanged += new System.EventHandler(this.numericUpDownSsaMarginVertical_ValueChanged); - // - // numericUpDownSsaMarginRight - // - this.numericUpDownSsaMarginRight.Location = new System.Drawing.Point(93, 33); - this.numericUpDownSsaMarginRight.Maximum = new decimal(new int[] { - 1000, - 0, - 0, - 0}); - this.numericUpDownSsaMarginRight.Name = "numericUpDownSsaMarginRight"; - this.numericUpDownSsaMarginRight.Size = new System.Drawing.Size(44, 21); - this.numericUpDownSsaMarginRight.TabIndex = 3; - // - // numericUpDownSsaMarginLeft - // - this.numericUpDownSsaMarginLeft.Location = new System.Drawing.Point(16, 33); - this.numericUpDownSsaMarginLeft.Maximum = new decimal(new int[] { - 1000, - 0, - 0, - 0}); - this.numericUpDownSsaMarginLeft.Name = "numericUpDownSsaMarginLeft"; - this.numericUpDownSsaMarginLeft.Size = new System.Drawing.Size(44, 21); - this.numericUpDownSsaMarginLeft.TabIndex = 1; - // - // labelMarginVertical - // - this.labelMarginVertical.AutoSize = true; - this.labelMarginVertical.Location = new System.Drawing.Point(165, 17); - this.labelMarginVertical.Name = "labelMarginVertical"; - this.labelMarginVertical.Size = new System.Drawing.Size(42, 13); - this.labelMarginVertical.TabIndex = 4; - this.labelMarginVertical.Text = "Vertical"; - // - // labelMarginRight - // - this.labelMarginRight.AutoSize = true; - this.labelMarginRight.Location = new System.Drawing.Point(90, 16); - this.labelMarginRight.Name = "labelMarginRight"; - this.labelMarginRight.Size = new System.Drawing.Size(32, 13); - this.labelMarginRight.TabIndex = 2; - this.labelMarginRight.Text = "Right"; - // - // labelMarginLeft - // - this.labelMarginLeft.AutoSize = true; - this.labelMarginLeft.Location = new System.Drawing.Point(13, 16); - this.labelMarginLeft.Name = "labelMarginLeft"; - this.labelMarginLeft.Size = new System.Drawing.Size(26, 13); - this.labelMarginLeft.TabIndex = 0; - this.labelMarginLeft.Text = "Left"; - // - // groupBoxPreview - // - this.groupBoxPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxPreview.Controls.Add(this.pictureBoxPreview); - this.groupBoxPreview.Location = new System.Drawing.Point(6, 118); - this.groupBoxPreview.Name = "groupBoxPreview"; - this.groupBoxPreview.Size = new System.Drawing.Size(807, 332); - this.groupBoxPreview.TabIndex = 10; - this.groupBoxPreview.TabStop = false; - this.groupBoxPreview.Text = "Preview"; - // - // pictureBoxPreview - // - this.pictureBoxPreview.Dock = System.Windows.Forms.DockStyle.Fill; - this.pictureBoxPreview.Location = new System.Drawing.Point(3, 17); - this.pictureBoxPreview.Name = "pictureBoxPreview"; - this.pictureBoxPreview.Size = new System.Drawing.Size(801, 312); - this.pictureBoxPreview.TabIndex = 0; - this.pictureBoxPreview.TabStop = false; - this.pictureBoxPreview.Click += new System.EventHandler(this.pictureBoxPreview_Click); - // - // tabPageNetwork - // - this.tabPageNetwork.Controls.Add(this.groupBoxNetworkSession); - this.tabPageNetwork.Controls.Add(this.groupBoxProxySettings); - this.tabPageNetwork.Location = new System.Drawing.Point(4, 22); - this.tabPageNetwork.Name = "tabPageNetwork"; - this.tabPageNetwork.Padding = new System.Windows.Forms.Padding(3); - this.tabPageNetwork.Size = new System.Drawing.Size(832, 520); - this.tabPageNetwork.TabIndex = 4; - this.tabPageNetwork.Text = "Network"; - this.tabPageNetwork.UseVisualStyleBackColor = true; - // - // groupBoxNetworkSession - // - this.groupBoxNetworkSession.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxNetworkSession.Controls.Add(this.buttonNetworkSessionNewMessageSound); - this.groupBoxNetworkSession.Controls.Add(this.textBoxNetworkSessionNewMessageSound); - this.groupBoxNetworkSession.Controls.Add(this.labelNetworkSessionNewMessageSound); - this.groupBoxNetworkSession.Location = new System.Drawing.Point(6, 189); - this.groupBoxNetworkSession.Name = "groupBoxNetworkSession"; - this.groupBoxNetworkSession.Size = new System.Drawing.Size(819, 320); - this.groupBoxNetworkSession.TabIndex = 30; - this.groupBoxNetworkSession.TabStop = false; - this.groupBoxNetworkSession.Text = "Network session settings"; - // - // buttonNetworkSessionNewMessageSound - // - this.buttonNetworkSessionNewMessageSound.Location = new System.Drawing.Point(352, 49); - this.buttonNetworkSessionNewMessageSound.Name = "buttonNetworkSessionNewMessageSound"; - this.buttonNetworkSessionNewMessageSound.Size = new System.Drawing.Size(29, 21); - this.buttonNetworkSessionNewMessageSound.TabIndex = 24; - this.buttonNetworkSessionNewMessageSound.Text = "..."; - this.buttonNetworkSessionNewMessageSound.UseVisualStyleBackColor = true; - this.buttonNetworkSessionNewMessageSound.Click += new System.EventHandler(this.buttonNetworkSessionNewMessageSound_Click); - // - // textBoxNetworkSessionNewMessageSound - // - this.textBoxNetworkSessionNewMessageSound.Location = new System.Drawing.Point(28, 50); - this.textBoxNetworkSessionNewMessageSound.Name = "textBoxNetworkSessionNewMessageSound"; - this.textBoxNetworkSessionNewMessageSound.Size = new System.Drawing.Size(318, 21); - this.textBoxNetworkSessionNewMessageSound.TabIndex = 20; - // - // labelNetworkSessionNewMessageSound - // - this.labelNetworkSessionNewMessageSound.AutoSize = true; - this.labelNetworkSessionNewMessageSound.Location = new System.Drawing.Point(25, 34); - this.labelNetworkSessionNewMessageSound.Name = "labelNetworkSessionNewMessageSound"; - this.labelNetworkSessionNewMessageSound.Size = new System.Drawing.Size(209, 13); - this.labelNetworkSessionNewMessageSound.TabIndex = 3; - this.labelNetworkSessionNewMessageSound.Text = "Play sound file when new message arrives"; - // - // groupBoxProxySettings - // - this.groupBoxProxySettings.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxProxySettings.Controls.Add(this.groupBoxProxyAuthentication); - this.groupBoxProxySettings.Controls.Add(this.textBoxProxyAddress); - this.groupBoxProxySettings.Controls.Add(this.labelProxyAddress); - this.groupBoxProxySettings.Location = new System.Drawing.Point(6, 6); - this.groupBoxProxySettings.Name = "groupBoxProxySettings"; - this.groupBoxProxySettings.Size = new System.Drawing.Size(819, 177); - this.groupBoxProxySettings.TabIndex = 1; - this.groupBoxProxySettings.TabStop = false; - this.groupBoxProxySettings.Text = "Proxy server settings"; - // - // groupBoxProxyAuthentication - // - this.groupBoxProxyAuthentication.Controls.Add(this.textBoxProxyDomain); - this.groupBoxProxyAuthentication.Controls.Add(this.labelProxyDomain); - this.groupBoxProxyAuthentication.Controls.Add(this.textBoxProxyUserName); - this.groupBoxProxyAuthentication.Controls.Add(this.labelProxyPassword); - this.groupBoxProxyAuthentication.Controls.Add(this.labelProxyUserName); - this.groupBoxProxyAuthentication.Controls.Add(this.textBoxProxyPassword); - this.groupBoxProxyAuthentication.Location = new System.Drawing.Point(28, 60); - this.groupBoxProxyAuthentication.Name = "groupBoxProxyAuthentication"; - this.groupBoxProxyAuthentication.Size = new System.Drawing.Size(318, 101); - this.groupBoxProxyAuthentication.TabIndex = 29; - this.groupBoxProxyAuthentication.TabStop = false; - this.groupBoxProxyAuthentication.Text = "Authentication"; - // - // textBoxProxyDomain - // - this.textBoxProxyDomain.Location = new System.Drawing.Point(106, 71); - this.textBoxProxyDomain.Name = "textBoxProxyDomain"; - this.textBoxProxyDomain.Size = new System.Drawing.Size(192, 21); - this.textBoxProxyDomain.TabIndex = 30; - // - // labelProxyDomain - // - this.labelProxyDomain.AutoSize = true; - this.labelProxyDomain.Location = new System.Drawing.Point(12, 74); - this.labelProxyDomain.Name = "labelProxyDomain"; - this.labelProxyDomain.Size = new System.Drawing.Size(42, 13); - this.labelProxyDomain.TabIndex = 29; - this.labelProxyDomain.Text = "Domain"; - // - // textBoxProxyUserName - // - this.textBoxProxyUserName.Location = new System.Drawing.Point(106, 19); - this.textBoxProxyUserName.Name = "textBoxProxyUserName"; - this.textBoxProxyUserName.Size = new System.Drawing.Size(192, 21); - this.textBoxProxyUserName.TabIndex = 22; - // - // labelProxyPassword - // - this.labelProxyPassword.AutoSize = true; - this.labelProxyPassword.Location = new System.Drawing.Point(12, 48); - this.labelProxyPassword.Name = "labelProxyPassword"; - this.labelProxyPassword.Size = new System.Drawing.Size(53, 13); - this.labelProxyPassword.TabIndex = 28; - this.labelProxyPassword.Text = "Password"; - // - // labelProxyUserName - // - this.labelProxyUserName.AutoSize = true; - this.labelProxyUserName.Location = new System.Drawing.Point(12, 22); - this.labelProxyUserName.Name = "labelProxyUserName"; - this.labelProxyUserName.Size = new System.Drawing.Size(58, 13); - this.labelProxyUserName.TabIndex = 2; - this.labelProxyUserName.Text = "User name"; - // - // textBoxProxyPassword - // - this.textBoxProxyPassword.Location = new System.Drawing.Point(106, 45); - this.textBoxProxyPassword.Name = "textBoxProxyPassword"; - this.textBoxProxyPassword.Size = new System.Drawing.Size(192, 21); - this.textBoxProxyPassword.TabIndex = 24; - this.textBoxProxyPassword.UseSystemPasswordChar = true; - // - // textBoxProxyAddress - // - this.textBoxProxyAddress.Location = new System.Drawing.Point(134, 34); - this.textBoxProxyAddress.Name = "textBoxProxyAddress"; - this.textBoxProxyAddress.Size = new System.Drawing.Size(192, 21); - this.textBoxProxyAddress.TabIndex = 20; - // - // labelProxyAddress - // - this.labelProxyAddress.AutoSize = true; - this.labelProxyAddress.Location = new System.Drawing.Point(25, 34); - this.labelProxyAddress.Name = "labelProxyAddress"; - this.labelProxyAddress.Size = new System.Drawing.Size(76, 13); - this.labelProxyAddress.TabIndex = 3; - this.labelProxyAddress.Text = "Proxy address"; - // - // labelStatus - // - this.labelStatus.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelStatus.AutoSize = true; - this.labelStatus.Location = new System.Drawing.Point(12, 573); - this.labelStatus.Name = "labelStatus"; - this.labelStatus.Size = new System.Drawing.Size(60, 13); - this.labelStatus.TabIndex = 3; - this.labelStatus.Text = "labelStatus"; - // - // openFileDialogFFmpeg - // - this.openFileDialogFFmpeg.FileName = "openFileDialog1"; - // - // buttonReset - // - this.buttonReset.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonReset.Location = new System.Drawing.Point(668, 563); - this.buttonReset.Name = "buttonReset"; - this.buttonReset.Size = new System.Drawing.Size(185, 23); - this.buttonReset.TabIndex = 2; - this.buttonReset.Text = "Restore default settings"; - this.buttonReset.UseVisualStyleBackColor = true; - this.buttonReset.Click += new System.EventHandler(this.buttonReset_Click); - // - // toolTipContinuationPreview - // - this.toolTipContinuationPreview.AutoPopDelay = 60000; - this.toolTipContinuationPreview.InitialDelay = 500; - this.toolTipContinuationPreview.ReshowDelay = 100; - // - // Settings - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(865, 598); - this.Controls.Add(this.buttonReset); - this.Controls.Add(this.labelStatus); - this.Controls.Add(this.tabControlSettings); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "Settings"; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Settings"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormSettings_KeyDown); - this.tabControlSettings.ResumeLayout(false); - this.tabPageGeneral.ResumeLayout(false); - this.groupBoxMiscellaneous.ResumeLayout(false); - this.groupBoxMiscellaneous.PerformLayout(); - this.groupBoxGeneralRules.ResumeLayout(false); - this.groupBoxGeneralRules.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownOptimalCharsSec)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxWordsMin)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxNumberOfLines)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDurationMin)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDurationMax)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinGapMs)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxCharsSec)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSubtitleLineMaximumLength)).EndInit(); - this.tabPageShortcuts.ResumeLayout(false); - this.groupBoxShortcuts.ResumeLayout(false); - this.groupBoxShortcuts.PerformLayout(); - this.contextMenuStripShortcuts.ResumeLayout(false); - this.tabPageSyntaxColoring.ResumeLayout(false); - this.groupBoxListViewSyntaxColoring.ResumeLayout(false); - this.groupBoxListViewSyntaxColoring.PerformLayout(); - this.tabPageVideoPlayer.ResumeLayout(false); - this.groupBoxMainWindowVideoControls.ResumeLayout(false); - this.groupBoxMainWindowVideoControls.PerformLayout(); - this.groupBoxVideoPlayerDefault.ResumeLayout(false); - this.groupBoxVideoPlayerDefault.PerformLayout(); - this.groupBoxVideoEngine.ResumeLayout(false); - this.groupBoxVideoEngine.PerformLayout(); - this.tabPageWaveform.ResumeLayout(false); - this.groupBoxFfmpeg.ResumeLayout(false); - this.groupBoxFfmpeg.PerformLayout(); - this.groupBoxSpectrogram.ResumeLayout(false); - this.groupBoxSpectrogram.PerformLayout(); - this.groupBox1.ResumeLayout(false); - this.groupBox1.PerformLayout(); - this.groupBoxWaveformAppearence.ResumeLayout(false); - this.groupBoxWaveformAppearence.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownWaveformBorderHitMs)).EndInit(); - this.tabPageTools.ResumeLayout(false); - this.groupBoxGoogleTranslate.ResumeLayout(false); - this.groupBoxGoogleTranslate.PerformLayout(); - this.groupBoxBing.ResumeLayout(false); - this.groupBoxBing.PerformLayout(); - this.groupBoxToolsAutoBr.ResumeLayout(false); - this.groupBoxToolsAutoBr.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownToolsBreakPreferBottomHeavy)).EndInit(); - this.groupBoxSpellCheck.ResumeLayout(false); - this.groupBoxSpellCheck.PerformLayout(); - this.groupBoxFixCommonErrors.ResumeLayout(false); - this.groupBoxFixCommonErrors.PerformLayout(); - this.groupBoxToolsVisualSync.ResumeLayout(false); - this.groupBoxToolsVisualSync.PerformLayout(); - this.tabPageWordLists.ResumeLayout(false); - this.groupBoxWordLists.ResumeLayout(false); - this.groupBoxWordLists.PerformLayout(); - this.groupBoxOcrFixList.ResumeLayout(false); - this.groupBoxOcrFixList.PerformLayout(); - this.groupBoxUserWordList.ResumeLayout(false); - this.groupBoxUserWordList.PerformLayout(); - this.groupBoxWordListLocation.ResumeLayout(false); - this.groupBoxWordListLocation.PerformLayout(); - this.groupBoxNamesIgonoreLists.ResumeLayout(false); - this.groupBoxNamesIgonoreLists.PerformLayout(); - this.tabPageToolBar.ResumeLayout(false); - this.groupBox2.ResumeLayout(false); - this.groupBox2.PerformLayout(); - this.groupBoxShowToolBarButtons.ResumeLayout(false); - this.groupBoxShowToolBarButtons.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxNetflixQualityCheck)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxTBRemoveTextForHi)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxTBFixCommonErrors)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxHelp)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxSettings)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxSpellCheck)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxVisualSync)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxReplace)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxFind)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxSaveAs)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxSave)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxOpen)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxNew)).EndInit(); - this.tabPageFont.ResumeLayout(false); - this.groupBoxFont.ResumeLayout(false); - this.groupBoxFont.PerformLayout(); - this.groupBoxFontTextBox.ResumeLayout(false); - this.groupBoxFontTextBox.PerformLayout(); - this.groupBoxFontListViews.ResumeLayout(false); - this.groupBoxFontListViews.PerformLayout(); - this.groupBoxFontGeneral.ResumeLayout(false); - this.groupBoxFontGeneral.PerformLayout(); - this.tabPageSsaStyle.ResumeLayout(false); - this.groupBoxSsaStyle.ResumeLayout(false); - this.groupBoxSsaBorder.ResumeLayout(false); - this.groupBoxSsaBorder.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSsaOutline)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSsaShadow)).EndInit(); - this.groupSsaBoxFont.ResumeLayout(false); - this.groupSsaBoxFont.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownFontSize)).EndInit(); - this.groupBoxMargins.ResumeLayout(false); - this.groupBoxMargins.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSsaMarginVertical)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSsaMarginRight)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSsaMarginLeft)).EndInit(); - this.groupBoxPreview.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxPreview)).EndInit(); - this.tabPageNetwork.ResumeLayout(false); - this.groupBoxNetworkSession.ResumeLayout(false); - this.groupBoxNetworkSession.PerformLayout(); - this.groupBoxProxySettings.ResumeLayout(false); - this.groupBoxProxySettings.PerformLayout(); - this.groupBoxProxyAuthentication.ResumeLayout(false); - this.groupBoxProxyAuthentication.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.TabControl tabControlSettings; - private System.Windows.Forms.TabPage tabPageGeneral; - private System.Windows.Forms.TabPage tabPageSsaStyle; - private System.Windows.Forms.GroupBox groupBoxMiscellaneous; - private System.Windows.Forms.GroupBox groupBoxShowToolBarButtons; - private System.Windows.Forms.PictureBox pictureBoxNew; - private System.Windows.Forms.CheckBox checkBoxToolbarNew; - private System.Windows.Forms.Label labelTBSpellCheck; - private System.Windows.Forms.PictureBox pictureBoxSpellCheck; - private System.Windows.Forms.CheckBox checkBoxSpellCheck; - private System.Windows.Forms.Label labelTBVisualSync; - private System.Windows.Forms.PictureBox pictureBoxVisualSync; - private System.Windows.Forms.CheckBox checkBoxVisualSync; - private System.Windows.Forms.Label labelTBReplace; - private System.Windows.Forms.PictureBox pictureBoxReplace; - private System.Windows.Forms.CheckBox checkBoxReplace; - private System.Windows.Forms.Label labelTBFind; - private System.Windows.Forms.PictureBox pictureBoxFind; - private System.Windows.Forms.CheckBox checkBoxToolbarFind; - private System.Windows.Forms.Label labelTBSaveAs; - private System.Windows.Forms.PictureBox pictureBoxSaveAs; - private System.Windows.Forms.CheckBox checkBoxToolbarSaveAs; - private System.Windows.Forms.Label labelTBSave; - private System.Windows.Forms.PictureBox pictureBoxSave; - private System.Windows.Forms.CheckBox checkBoxToolbarSave; - private System.Windows.Forms.Label labelTBOpen; - private System.Windows.Forms.PictureBox pictureBoxOpen; - private System.Windows.Forms.CheckBox checkBoxToolbarOpen; - private System.Windows.Forms.Label labelTBNew; - private System.Windows.Forms.Label labelTBHelp; - private System.Windows.Forms.PictureBox pictureBoxHelp; - private System.Windows.Forms.CheckBox checkBoxHelp; - private System.Windows.Forms.Label labelTBSettings; - private System.Windows.Forms.PictureBox pictureBoxSettings; - private System.Windows.Forms.CheckBox checkBoxSettings; - private System.Windows.Forms.Label labelDefaultFrameRate; - private System.Windows.Forms.Label labelDefaultFileEncoding; - private System.Windows.Forms.ComboBox comboBoxFrameRate; - private System.Windows.Forms.ComboBox comboBoxEncoding; - private System.Windows.Forms.CheckBox checkBoxRememberRecentFiles; - private System.Windows.Forms.GroupBox groupBoxSsaStyle; - private System.Windows.Forms.ColorDialog colorDialogSSAStyle; - private System.Windows.Forms.CheckBox checkBoxStartInSourceView; - private System.Windows.Forms.CheckBox checkBoxReopenLastOpened; - private System.Windows.Forms.Label labelSubMaxLen; - private System.Windows.Forms.TabPage tabPageVideoPlayer; - private System.Windows.Forms.CheckBox checkBoxVideoPlayerShowStopButton; - private System.Windows.Forms.GroupBox groupBoxVideoEngine; - private System.Windows.Forms.Label labelVideoPlayerMPlayer; - private System.Windows.Forms.Label labelDirectShowDescription; - private System.Windows.Forms.Label labelMpcHcDescription; - private System.Windows.Forms.RadioButton radioButtonVideoPlayerMPV; - private System.Windows.Forms.RadioButton radioButtonVideoPlayerDirectShow; - private System.Windows.Forms.RadioButton radioButtonVideoPlayerMpcHc; - private System.Windows.Forms.CheckBox checkBoxRememberWindowPosition; - private System.Windows.Forms.TextBox textBoxShowLineBreaksAs; - private System.Windows.Forms.Label labelShowLineBreaksAs; - private System.Windows.Forms.TabPage tabPageWordLists; - private System.Windows.Forms.GroupBox groupBoxWordLists; - private System.Windows.Forms.GroupBox groupBoxWordListLocation; - private System.Windows.Forms.GroupBox groupBoxOcrFixList; - private System.Windows.Forms.GroupBox groupBoxNamesIgonoreLists; - private System.Windows.Forms.TextBox textBoxNameEtc; - private System.Windows.Forms.Label labelWordListLanguage; - private System.Windows.Forms.Button buttonAddNames; - private System.Windows.Forms.ComboBox comboBoxWordListLanguage; - private System.Windows.Forms.Button buttonRemoveNameEtc; - private System.Windows.Forms.ListBox listBoxNames; - private System.Windows.Forms.Button buttonRemoveOcrFix; - private System.Windows.Forms.ListBox listBoxOcrFixList; - private System.Windows.Forms.TextBox textBoxOcrFixKey; - private System.Windows.Forms.Button buttonAddOcrFix; - private System.Windows.Forms.GroupBox groupBoxUserWordList; - private System.Windows.Forms.Button buttonRemoveUserWord; - private System.Windows.Forms.ListBox listBoxUserWordLists; - private System.Windows.Forms.TextBox textBoxUserWord; - private System.Windows.Forms.Button buttonAddUserWord; - private System.Windows.Forms.TabPage tabPageNetwork; - private System.Windows.Forms.GroupBox groupBoxProxySettings; - private System.Windows.Forms.Label labelProxyPassword; - private System.Windows.Forms.TextBox textBoxProxyAddress; - private System.Windows.Forms.TextBox textBoxProxyUserName; - private System.Windows.Forms.TextBox textBoxProxyPassword; - private System.Windows.Forms.Label labelProxyAddress; - private System.Windows.Forms.Label labelProxyUserName; - private System.Windows.Forms.CheckBox checkBoxNamesOnline; - private System.Windows.Forms.TextBox textBoxNamesOnline; - private System.Windows.Forms.TextBox textBoxOcrFixValue; - private System.Windows.Forms.TabPage tabPageTools; - private System.Windows.Forms.GroupBox groupBoxToolsVisualSync; - private System.Windows.Forms.ComboBox comboBoxToolsVerifySeconds; - private System.Windows.Forms.Label labelVerifyButton; - private System.Windows.Forms.Label labelToolsEndScene; - private System.Windows.Forms.ComboBox comboBoxToolsEndSceneIndex; - private System.Windows.Forms.Label labelToolsStartScene; - private System.Windows.Forms.ComboBox comboBoxToolsStartSceneIndex; - private System.Windows.Forms.GroupBox groupBoxFixCommonErrors; - private System.Windows.Forms.Label labelToolsMusicSymbol; - private System.Windows.Forms.ComboBox comboBoxListViewDoubleClickEvent; - private System.Windows.Forms.Label labelListViewDoubleClickEvent; - private System.Windows.Forms.Label labelStatus; - private System.Windows.Forms.TextBox textBoxMusicSymbolsToReplace; - private System.Windows.Forms.Label labelToolsMusicSymbolsToReplace; - private System.Windows.Forms.ComboBox comboBoxToolsMusicSymbol; - private System.Windows.Forms.GroupBox groupBoxSpellCheck; - private System.Windows.Forms.CheckBox checkBoxSpellCheckAutoChangeNames; - private System.Windows.Forms.GroupBox groupBoxProxyAuthentication; - private System.Windows.Forms.TextBox textBoxProxyDomain; - private System.Windows.Forms.Label labelProxyDomain; - private System.Windows.Forms.CheckBox checkBoxAutoDetectAnsiEncoding; - private System.Windows.Forms.Label labelAutoDetectAnsiEncoding; - private System.Windows.Forms.Label labelVideoPlayerVLC; - private System.Windows.Forms.RadioButton radioButtonVideoPlayerVLC; - private System.Windows.Forms.CheckBox checkBoxRemoveBlankLinesWhenOpening; - private System.Windows.Forms.GroupBox groupBoxMainWindowVideoControls; - private System.Windows.Forms.GroupBox groupBoxVideoPlayerDefault; - private System.Windows.Forms.TextBox textBoxCustomSearchUrl1; - private System.Windows.Forms.Label labelCustomSearch; - private System.Windows.Forms.ComboBox comboBoxCustomSearch1; - private System.Windows.Forms.TabPage tabPageWaveform; - private System.Windows.Forms.GroupBox groupBoxWaveformAppearence; - private System.Windows.Forms.Panel panelWaveformBackgroundColor; - private System.Windows.Forms.Button buttonWaveformBackgroundColor; - private System.Windows.Forms.Panel panelWaveformColor; - private System.Windows.Forms.Button buttonWaveformColor; - private System.Windows.Forms.Panel panelWaveformSelectedColor; - private System.Windows.Forms.Button buttonWaveformSelectedColor; - private System.Windows.Forms.CheckBox checkBoxWaveformShowGrid; - private System.Windows.Forms.Panel panelWaveformGridColor; - private System.Windows.Forms.Button buttonWaveformGridColor; - private System.Windows.Forms.Panel panelWaveformTextColor; - private System.Windows.Forms.Button buttonWaveformTextColor; - private System.Windows.Forms.GroupBox groupBox1; - private System.Windows.Forms.Button buttonWaveformsFolderEmpty; - private System.Windows.Forms.Label labelWaveformsFolderInfo; - private System.Windows.Forms.CheckBox checkBoxRememberSelectedLine; - private System.Windows.Forms.ComboBox comboBoxAutoBackup; - private System.Windows.Forms.Label labelAutoBackup; - private System.Windows.Forms.TabPage tabPageToolBar; - private System.Windows.Forms.CheckBox checkBoxShowFrameRate; - private System.Windows.Forms.ComboBox comboBoxSpellChecker; - private System.Windows.Forms.Label labelSpellChecker; - private System.Windows.Forms.GroupBox groupBox2; - private System.Windows.Forms.CheckBox checkBoxAllowEditOfOriginalSubtitle; - private System.Windows.Forms.Label labelMergeShortLines; - private System.Windows.Forms.ComboBox comboBoxMergeShortLineLength; - private System.Windows.Forms.CheckBox checkBoxAutoWrapWhileTyping; - private System.Windows.Forms.CheckBox checkBoxFixCommonOcrErrorsUsingHardcodedRules; - private System.Windows.Forms.Label labelVideoPlayerPreviewFontSize; - private System.Windows.Forms.ComboBox comboBoxlVideoPlayerPreviewFontSize; - private System.Windows.Forms.TabPage tabPageShortcuts; - private System.Windows.Forms.GroupBox groupBoxShortcuts; - private System.Windows.Forms.Button buttonUpdateShortcut; - private System.Windows.Forms.TreeView treeViewShortcuts; - private System.Windows.Forms.Label labelShortcut; - private System.Windows.Forms.Label labelShortcutKey; - private System.Windows.Forms.ComboBox comboBoxShortcutKey; - private System.Windows.Forms.CheckBox checkBoxShortcutsShift; - private System.Windows.Forms.CheckBox checkBoxShortcutsAlt; - private System.Windows.Forms.CheckBox checkBoxShortcutsControl; - private System.Windows.Forms.CheckBox checkBoxPromptDeleteLines; - private System.Windows.Forms.GroupBox groupBoxSpectrogram; - private System.Windows.Forms.CheckBox checkBoxGenerateSpectrogram; - private System.Windows.Forms.Label labelSpectrogramAppearance; - private System.Windows.Forms.ComboBox comboBoxSpectrogramAppearance; - private System.Windows.Forms.CheckBox checkBoxReverseMouseWheelScrollDirection; - private System.Windows.Forms.Label labelMaxDuration; - private System.Windows.Forms.Label labelMinDuration; - private System.Windows.Forms.NumericUpDown numericUpDownDurationMax; - private System.Windows.Forms.NumericUpDown numericUpDownDurationMin; - private System.Windows.Forms.ComboBox comboBoxTimeCodeMode; - private System.Windows.Forms.Label labelTimeCodeMode; - private System.Windows.Forms.TabPage tabPageSyntaxColoring; - private System.Windows.Forms.GroupBox groupBoxListViewSyntaxColoring; - private System.Windows.Forms.CheckBox checkBoxSyntaxOverlap; - private System.Windows.Forms.CheckBox checkBoxSyntaxColorTextTooLong; - private System.Windows.Forms.CheckBox checkBoxSyntaxColorDurationTooLarge; - private System.Windows.Forms.CheckBox checkBoxSyntaxColorDurationTooSmall; - private System.Windows.Forms.CheckBox checkBoxSyntaxColorTextMoreThanTwoLines; - private System.Windows.Forms.Button buttonListViewSyntaxColorError; - private System.Windows.Forms.Panel panelListViewSyntaxColorError; - private System.Windows.Forms.Label labelMaxCharsPerSecond; - private System.Windows.Forms.NumericUpDown numericUpDownMaxCharsSec; - private System.Windows.Forms.NumericUpDown numericUpDownSubtitleLineMaximumLength; - private System.Windows.Forms.CheckBox checkBoxVideoPlayerShowFullscreenButton; - private System.Windows.Forms.CheckBox checkBoxVideoPlayerShowMuteButton; - private System.Windows.Forms.Label labelCustomSearch1; - private System.Windows.Forms.Label labelCustomSearch2; - private System.Windows.Forms.TextBox textBoxCustomSearchUrl2; - private System.Windows.Forms.ComboBox comboBoxCustomSearch2; - private System.Windows.Forms.Label labelCustomSearch5; - private System.Windows.Forms.TextBox textBoxCustomSearchUrl5; - private System.Windows.Forms.ComboBox comboBoxCustomSearch5; - private System.Windows.Forms.Label labelCustomSearch4; - private System.Windows.Forms.TextBox textBoxCustomSearchUrl4; - private System.Windows.Forms.ComboBox comboBoxCustomSearch4; - private System.Windows.Forms.Label labelCustomSearch3; - private System.Windows.Forms.TextBox textBoxCustomSearchUrl3; - private System.Windows.Forms.ComboBox comboBoxCustomSearch3; - private System.Windows.Forms.CheckBox checkBoxAllowOverlap; - private System.Windows.Forms.Label labelWaveformBorderHitMs2; - private System.Windows.Forms.NumericUpDown numericUpDownWaveformBorderHitMs; - private System.Windows.Forms.Label labelWaveformBorderHitMs1; - private System.Windows.Forms.Label labelSsaOutline; - private System.Windows.Forms.NumericUpDown numericUpDownSsaShadow; - private System.Windows.Forms.NumericUpDown numericUpDownSsaOutline; - private System.Windows.Forms.Label labelSsaShadow; - private System.Windows.Forms.GroupBox groupBoxPreview; - private System.Windows.Forms.PictureBox pictureBoxPreview; - private System.Windows.Forms.CheckBox checkBoxSsaOpaqueBox; - private System.Windows.Forms.CheckBox checkBoxSpellCheckOneLetterWords; - private System.Windows.Forms.CheckBox checkBoxTreatINQuoteAsING; - private System.Windows.Forms.GroupBox groupBoxFfmpeg; - private System.Windows.Forms.Button buttonBrowseToFFmpeg; - private System.Windows.Forms.TextBox textBoxFFmpegPath; - private System.Windows.Forms.Label labelFFmpegPath; - private System.Windows.Forms.CheckBox checkBoxUseFFmpeg; - private System.Windows.Forms.OpenFileDialog openFileDialogFFmpeg; - private System.Windows.Forms.CheckBox checkBoxWaveformHoverFocus; - private System.Windows.Forms.CheckBox checkBoxListViewMouseEnterFocus; - private System.Windows.Forms.NumericUpDown numericUpDownMinGapMs; - private System.Windows.Forms.Label labelMinGapMs; - private System.Windows.Forms.Label labelTBFixCommonErrors; - private System.Windows.Forms.PictureBox pictureBoxTBFixCommonErrors; - private System.Windows.Forms.CheckBox checkBoxTBFixCommonErrors; - private System.Windows.Forms.CheckBox checkBoxFixShortDisplayTimesAllowMoveStartTime; - private System.Windows.Forms.Button buttonVlcPathBrowse; - private System.Windows.Forms.TextBox textBoxVlcPath; - private System.Windows.Forms.Label labelVlcPath; - private System.Windows.Forms.GroupBox groupBoxToolsAutoBr; - private System.Windows.Forms.CheckBox checkBoxUseDoNotBreakAfterList; - private System.Windows.Forms.Button buttonEditDoNotBreakAfterList; - private System.Windows.Forms.CheckBox checkBoxCheckForUpdates; - private System.Windows.Forms.Label labelPlatform; - private System.Windows.Forms.CheckBox checkBoxVideoPlayerPreviewFontBold; - private System.Windows.Forms.Label labelWaveformTextSize; - private System.Windows.Forms.CheckBox checkBoxWaveformTextBold; - private System.Windows.Forms.ComboBox comboBoxWaveformTextSize; - private System.Windows.Forms.LinkLabel linkLabelOpenDictionaryFolder; - private System.Windows.Forms.GroupBox groupBoxNetworkSession; - private System.Windows.Forms.Button buttonNetworkSessionNewMessageSound; - private System.Windows.Forms.TextBox textBoxNetworkSessionNewMessageSound; - private System.Windows.Forms.Label labelNetworkSessionNewMessageSound; - private System.Windows.Forms.GroupBox groupBoxMargins; - private System.Windows.Forms.NumericUpDown numericUpDownSsaMarginVertical; - private System.Windows.Forms.NumericUpDown numericUpDownSsaMarginRight; - private System.Windows.Forms.NumericUpDown numericUpDownSsaMarginLeft; - private System.Windows.Forms.Label labelMarginVertical; - private System.Windows.Forms.Label labelMarginRight; - private System.Windows.Forms.Label labelMarginLeft; - private System.Windows.Forms.GroupBox groupBoxSsaBorder; - private System.Windows.Forms.GroupBox groupSsaBoxFont; - private System.Windows.Forms.NumericUpDown numericUpDownFontSize; - private System.Windows.Forms.ComboBox comboBoxFontName; - private System.Windows.Forms.Label labelSsaFontSize; - private System.Windows.Forms.Label labelFontName; - private System.Windows.Forms.Panel panelPrimaryColor; - private System.Windows.Forms.Button buttonSsaColor; - private System.Windows.Forms.CheckBox checkBoxSsaFontBold; - private System.Windows.Forms.CheckBox checkBoxFceSkipStep1; - private System.Windows.Forms.Button buttonMpvSettings; - private System.Windows.Forms.Label labelMpvSettings; - private System.Windows.Forms.LinkLabel linkLabelBingSubscribe; - private System.Windows.Forms.Label labelUserBingApiId; - private System.Windows.Forms.GroupBox groupBoxBing; - private System.Windows.Forms.Label labelBingApiKey; - private System.Windows.Forms.TextBox textBoxBingClientSecret; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.ComboBox comboBoxAutoBackupDeleteAfter; - private System.Windows.Forms.Label labelAutoBackupDeleteAfter; - private System.Windows.Forms.Label labelTBRemoveTextForHi; - private System.Windows.Forms.PictureBox pictureBoxTBRemoveTextForHi; - private System.Windows.Forms.CheckBox checkBoxTBRemoveTextForHi; - private System.Windows.Forms.NumericUpDown numericUpDownMaxNumberOfLines; - private System.Windows.Forms.Label labelMaxLines; - private System.Windows.Forms.Label labelTBNetflixQualityCheck; - private System.Windows.Forms.PictureBox pictureBoxNetflixQualityCheck; - private System.Windows.Forms.CheckBox checkBoxNetflixQualityCheck; - private System.Windows.Forms.CheckBox checkBoxWaveformSetVideoPosMoveStartEnd; - private System.Windows.Forms.CheckBox checkBoxWaveformShowWpm; - private System.Windows.Forms.CheckBox checkBoxWaveformShowCps; - private System.Windows.Forms.NumericUpDown numericUpDownMaxWordsMin; - private System.Windows.Forms.Label labelMaxWordsPerMin; - private System.Windows.Forms.CheckBox checkBoxMpvHandlesPreviewText; - private System.Windows.Forms.CheckBox checkBoxVideoAutoOpen; - private System.Windows.Forms.Button buttonClearShortcut; - private System.Windows.Forms.CheckBox checkBoxAllowVolumeBoost; - private System.Windows.Forms.TabPage tabPageFont; - private System.Windows.Forms.GroupBox groupBoxFont; - private System.Windows.Forms.CheckBox checkBoxSubtitleCenter; - private System.Windows.Forms.Panel panelSubtitleFontColor; - private System.Windows.Forms.Panel panelSubtitleBackgroundColor; - private System.Windows.Forms.Label labelSubtitleFontBackgroundColor; - private System.Windows.Forms.Label labelSubtitleFontColor; - private System.Windows.Forms.Label labelSubtitleFontSize; - private System.Windows.Forms.ComboBox comboBoxSubtitleFont; - private System.Windows.Forms.CheckBox checkBoxSubtitleFontBold; - private System.Windows.Forms.ComboBox comboBoxSubtitleFontSize; - private System.Windows.Forms.Label labelSubtitleFont; - private System.Windows.Forms.ComboBox comboBoxSaveAsFileNameFrom; - private System.Windows.Forms.Label labelSaveAsFileNameFrom; - private System.Windows.Forms.GroupBox groupBoxGeneralRules; - private System.Windows.Forms.GroupBox groupBoxFontTextBox; - private System.Windows.Forms.GroupBox groupBoxFontListViews; - private System.Windows.Forms.Label labelSubtitleListViewFontSize; - private System.Windows.Forms.ComboBox comboBoxSubtitleListViewFontSize; - private System.Windows.Forms.CheckBox checkBoxSubtitleListViewFontBold; - private System.Windows.Forms.GroupBox groupBoxFontGeneral; - private System.Windows.Forms.Label labelFontNote; - private System.Windows.Forms.Button buttonDownloadFfmpeg; - private System.Windows.Forms.Button buttonShortcutsClear; - private System.Windows.Forms.Label labelShortcutsSearch; - private System.Windows.Forms.TextBox textBoxShortcutSearch; - private System.Windows.Forms.GroupBox groupBoxGoogleTranslate; - private System.Windows.Forms.Label labelGoogleTranslateApiKey; - private System.Windows.Forms.TextBox textBoxGoogleTransleApiKey; - private System.Windows.Forms.LinkLabel linkLabelGoogleTranslateSignUp; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.CheckBox checkBoxAutoSave; - private System.Windows.Forms.CheckBox checkBoxUseAlwaysToFile; - private System.Windows.Forms.Label labelOptimalCharsPerSecond; - private System.Windows.Forms.NumericUpDown numericUpDownOptimalCharsSec; - private System.Windows.Forms.Button buttonEditProfile; - private System.Windows.Forms.ComboBox comboBoxRulesProfileName; - private System.Windows.Forms.Label labelRulesProfileName; - private System.Windows.Forms.CheckBox checkBoxCpsIncludeWhiteSpace; - private System.Windows.Forms.Label labelBingTokenEndpoint; - private System.Windows.Forms.CheckBox checkBoxToolsBreakEarlyComma; - private System.Windows.Forms.CheckBox checkBoxToolsBreakEarlyDash; - private System.Windows.Forms.CheckBox checkBoxToolsBreakEarlyLineEnding; - private System.Windows.Forms.CheckBox checkBoxToolsBreakByPixelWidth; - private System.Windows.Forms.NumericUpDown numericUpDownToolsBreakPreferBottomHeavy; - private System.Windows.Forms.CheckBox checkBoxToolsBreakPreferBottomHeavy; - private System.Windows.Forms.Label labelToolsBreakBottomHeavyPercent; - private System.Windows.Forms.CheckBox checkBoxSyntaxColorGapTooSmall; - private System.Windows.Forms.Button buttonReset; - private System.Windows.Forms.Label labelDialogStyle; - private System.Windows.Forms.ComboBox comboBoxDialogStyle; - private System.Windows.Forms.ContextMenuStrip contextMenuStripShortcuts; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemShortcutsCollapse; - private System.Windows.Forms.CheckBox checkBoxWaveformSnapToSceneChanges; - private System.Windows.Forms.CheckBox checkBoxWaveformSingleClickSelect; - private System.Windows.Forms.Label labelSplitBehavior; - private System.Windows.Forms.ComboBox comboBoxSplitBehavior; - private System.Windows.Forms.Button buttonLineWidthSettings; - private System.Windows.Forms.CheckBox checkBoxSyntaxColorTextTooWide; - private System.Windows.Forms.Label labelContinuationStyle; - private System.Windows.Forms.Button buttonFixContinuationStyleSettings; - private System.Windows.Forms.ComboBox comboBoxContinuationStyle; - private System.Windows.Forms.ToolTip toolTipContinuationPreview; - private System.Windows.Forms.Panel panelWaveformCursorColor; - private System.Windows.Forms.Button buttonWaveformCursorColor; - private System.Windows.Forms.Button buttonGapChoose; - private System.Windows.Forms.CheckBox checkBoxSpellCheckAutoChangeNamesViaSuggestions; - private System.Windows.Forms.ComboBox comboBoxBoxBingTokenEndpoint; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; - private System.Windows.Forms.ToolStripMenuItem importShortcutsToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem exportShortcutsToolStripMenuItem; - private System.Windows.Forms.SaveFileDialog saveFileDialog1; - private System.Windows.Forms.Panel panelTextBoxAssColor; - private System.Windows.Forms.Button buttonTextBoxAssColor; - private System.Windows.Forms.Panel panelTextBoxHtmlColor; - private System.Windows.Forms.Button buttonTextBoxHtmlColor; - private System.Windows.Forms.CheckBox checkBoxSubtitleTextBoxSyntaxColor; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class Settings + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.buttonOK = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.tabControlSettings = new System.Windows.Forms.TabControl(); + this.tabPageGeneral = new System.Windows.Forms.TabPage(); + this.groupBoxMiscellaneous = new System.Windows.Forms.GroupBox(); + this.labelSplitBehavior = new System.Windows.Forms.Label(); + this.comboBoxSplitBehavior = new System.Windows.Forms.ComboBox(); + this.checkBoxAutoSave = new System.Windows.Forms.CheckBox(); + this.comboBoxSaveAsFileNameFrom = new System.Windows.Forms.ComboBox(); + this.labelSaveAsFileNameFrom = new System.Windows.Forms.Label(); + this.groupBoxGeneralRules = new System.Windows.Forms.GroupBox(); + this.buttonGapChoose = new System.Windows.Forms.Button(); + this.comboBoxContinuationStyle = new System.Windows.Forms.ComboBox(); + this.labelContinuationStyle = new System.Windows.Forms.Label(); + this.labelDialogStyle = new System.Windows.Forms.Label(); + this.comboBoxDialogStyle = new System.Windows.Forms.ComboBox(); + this.checkBoxCpsIncludeWhiteSpace = new System.Windows.Forms.CheckBox(); + this.buttonEditProfile = new System.Windows.Forms.Button(); + this.comboBoxRulesProfileName = new System.Windows.Forms.ComboBox(); + this.labelRulesProfileName = new System.Windows.Forms.Label(); + this.labelOptimalCharsPerSecond = new System.Windows.Forms.Label(); + this.numericUpDownOptimalCharsSec = new System.Windows.Forms.NumericUpDown(); + this.labelSubMaxLen = new System.Windows.Forms.Label(); + this.numericUpDownMaxWordsMin = new System.Windows.Forms.NumericUpDown(); + this.labelMergeShortLines = new System.Windows.Forms.Label(); + this.labelMaxWordsPerMin = new System.Windows.Forms.Label(); + this.labelMinDuration = new System.Windows.Forms.Label(); + this.numericUpDownMaxNumberOfLines = new System.Windows.Forms.NumericUpDown(); + this.labelMaxDuration = new System.Windows.Forms.Label(); + this.labelMaxLines = new System.Windows.Forms.Label(); + this.numericUpDownDurationMin = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownDurationMax = new System.Windows.Forms.NumericUpDown(); + this.comboBoxMergeShortLineLength = new System.Windows.Forms.ComboBox(); + this.labelMaxCharsPerSecond = new System.Windows.Forms.Label(); + this.numericUpDownMinGapMs = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownMaxCharsSec = new System.Windows.Forms.NumericUpDown(); + this.labelMinGapMs = new System.Windows.Forms.Label(); + this.numericUpDownSubtitleLineMaximumLength = new System.Windows.Forms.NumericUpDown(); + this.comboBoxAutoBackupDeleteAfter = new System.Windows.Forms.ComboBox(); + this.labelAutoBackupDeleteAfter = new System.Windows.Forms.Label(); + this.checkBoxCheckForUpdates = new System.Windows.Forms.CheckBox(); + this.labelSpellChecker = new System.Windows.Forms.Label(); + this.comboBoxTimeCodeMode = new System.Windows.Forms.ComboBox(); + this.labelTimeCodeMode = new System.Windows.Forms.Label(); + this.comboBoxEncoding = new System.Windows.Forms.ComboBox(); + this.checkBoxAutoDetectAnsiEncoding = new System.Windows.Forms.CheckBox(); + this.textBoxShowLineBreaksAs = new System.Windows.Forms.TextBox(); + this.checkBoxAutoWrapWhileTyping = new System.Windows.Forms.CheckBox(); + this.checkBoxPromptDeleteLines = new System.Windows.Forms.CheckBox(); + this.checkBoxAllowEditOfOriginalSubtitle = new System.Windows.Forms.CheckBox(); + this.comboBoxSpellChecker = new System.Windows.Forms.ComboBox(); + this.comboBoxAutoBackup = new System.Windows.Forms.ComboBox(); + this.labelAutoBackup = new System.Windows.Forms.Label(); + this.checkBoxRememberSelectedLine = new System.Windows.Forms.CheckBox(); + this.checkBoxRemoveBlankLinesWhenOpening = new System.Windows.Forms.CheckBox(); + this.labelAutoDetectAnsiEncoding = new System.Windows.Forms.Label(); + this.comboBoxListViewDoubleClickEvent = new System.Windows.Forms.ComboBox(); + this.labelListViewDoubleClickEvent = new System.Windows.Forms.Label(); + this.labelShowLineBreaksAs = new System.Windows.Forms.Label(); + this.checkBoxRememberWindowPosition = new System.Windows.Forms.CheckBox(); + this.checkBoxStartInSourceView = new System.Windows.Forms.CheckBox(); + this.checkBoxReopenLastOpened = new System.Windows.Forms.CheckBox(); + this.checkBoxRememberRecentFiles = new System.Windows.Forms.CheckBox(); + this.labelDefaultFileEncoding = new System.Windows.Forms.Label(); + this.comboBoxFrameRate = new System.Windows.Forms.ComboBox(); + this.labelDefaultFrameRate = new System.Windows.Forms.Label(); + this.tabPageShortcuts = new System.Windows.Forms.TabPage(); + this.groupBoxShortcuts = new System.Windows.Forms.GroupBox(); + this.buttonShortcutsClear = new System.Windows.Forms.Button(); + this.labelShortcutsSearch = new System.Windows.Forms.Label(); + this.textBoxShortcutSearch = new System.Windows.Forms.TextBox(); + this.buttonClearShortcut = new System.Windows.Forms.Button(); + this.comboBoxShortcutKey = new System.Windows.Forms.ComboBox(); + this.labelShortcutKey = new System.Windows.Forms.Label(); + this.checkBoxShortcutsShift = new System.Windows.Forms.CheckBox(); + this.checkBoxShortcutsAlt = new System.Windows.Forms.CheckBox(); + this.checkBoxShortcutsControl = new System.Windows.Forms.CheckBox(); + this.buttonUpdateShortcut = new System.Windows.Forms.Button(); + this.treeViewShortcuts = new System.Windows.Forms.TreeView(); + this.contextMenuStripShortcuts = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItemShortcutsCollapse = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.importShortcutsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.exportShortcutsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.labelShortcut = new System.Windows.Forms.Label(); + this.tabPageSyntaxColoring = new System.Windows.Forms.TabPage(); + this.groupBoxListViewSyntaxColoring = new System.Windows.Forms.GroupBox(); + this.buttonLineWidthSettings = new System.Windows.Forms.Button(); + this.checkBoxSyntaxColorTextTooWide = new System.Windows.Forms.CheckBox(); + this.checkBoxSyntaxColorGapTooSmall = new System.Windows.Forms.CheckBox(); + this.checkBoxSyntaxColorTextMoreThanTwoLines = new System.Windows.Forms.CheckBox(); + this.checkBoxSyntaxOverlap = new System.Windows.Forms.CheckBox(); + this.checkBoxSyntaxColorDurationTooSmall = new System.Windows.Forms.CheckBox(); + this.buttonListViewSyntaxColorError = new System.Windows.Forms.Button(); + this.checkBoxSyntaxColorTextTooLong = new System.Windows.Forms.CheckBox(); + this.checkBoxSyntaxColorDurationTooLarge = new System.Windows.Forms.CheckBox(); + this.panelListViewSyntaxColorError = new System.Windows.Forms.Panel(); + this.tabPageVideoPlayer = new System.Windows.Forms.TabPage(); + this.groupBoxMainWindowVideoControls = new System.Windows.Forms.GroupBox(); + this.labelCustomSearch5 = new System.Windows.Forms.Label(); + this.textBoxCustomSearchUrl5 = new System.Windows.Forms.TextBox(); + this.comboBoxCustomSearch5 = new System.Windows.Forms.ComboBox(); + this.labelCustomSearch4 = new System.Windows.Forms.Label(); + this.textBoxCustomSearchUrl4 = new System.Windows.Forms.TextBox(); + this.comboBoxCustomSearch4 = new System.Windows.Forms.ComboBox(); + this.labelCustomSearch3 = new System.Windows.Forms.Label(); + this.textBoxCustomSearchUrl3 = new System.Windows.Forms.TextBox(); + this.comboBoxCustomSearch3 = new System.Windows.Forms.ComboBox(); + this.labelCustomSearch2 = new System.Windows.Forms.Label(); + this.textBoxCustomSearchUrl2 = new System.Windows.Forms.TextBox(); + this.comboBoxCustomSearch2 = new System.Windows.Forms.ComboBox(); + this.labelCustomSearch1 = new System.Windows.Forms.Label(); + this.textBoxCustomSearchUrl1 = new System.Windows.Forms.TextBox(); + this.labelCustomSearch = new System.Windows.Forms.Label(); + this.comboBoxCustomSearch1 = new System.Windows.Forms.ComboBox(); + this.groupBoxVideoPlayerDefault = new System.Windows.Forms.GroupBox(); + this.checkBoxAllowVolumeBoost = new System.Windows.Forms.CheckBox(); + this.checkBoxVideoAutoOpen = new System.Windows.Forms.CheckBox(); + this.checkBoxVideoPlayerPreviewFontBold = new System.Windows.Forms.CheckBox(); + this.checkBoxVideoPlayerShowFullscreenButton = new System.Windows.Forms.CheckBox(); + this.checkBoxVideoPlayerShowMuteButton = new System.Windows.Forms.CheckBox(); + this.labelVideoPlayerPreviewFontSize = new System.Windows.Forms.Label(); + this.comboBoxlVideoPlayerPreviewFontSize = new System.Windows.Forms.ComboBox(); + this.checkBoxVideoPlayerShowStopButton = new System.Windows.Forms.CheckBox(); + this.groupBoxVideoEngine = new System.Windows.Forms.GroupBox(); + this.checkBoxMpvHandlesPreviewText = new System.Windows.Forms.CheckBox(); + this.labelMpvSettings = new System.Windows.Forms.Label(); + this.buttonMpvSettings = new System.Windows.Forms.Button(); + this.labelPlatform = new System.Windows.Forms.Label(); + this.buttonVlcPathBrowse = new System.Windows.Forms.Button(); + this.textBoxVlcPath = new System.Windows.Forms.TextBox(); + this.labelVlcPath = new System.Windows.Forms.Label(); + this.labelVideoPlayerVLC = new System.Windows.Forms.Label(); + this.radioButtonVideoPlayerVLC = new System.Windows.Forms.RadioButton(); + this.labelVideoPlayerMPlayer = new System.Windows.Forms.Label(); + this.labelDirectShowDescription = new System.Windows.Forms.Label(); + this.labelMpcHcDescription = new System.Windows.Forms.Label(); + this.radioButtonVideoPlayerMPV = new System.Windows.Forms.RadioButton(); + this.radioButtonVideoPlayerDirectShow = new System.Windows.Forms.RadioButton(); + this.radioButtonVideoPlayerMpcHc = new System.Windows.Forms.RadioButton(); + this.tabPageWaveform = new System.Windows.Forms.TabPage(); + this.groupBoxFfmpeg = new System.Windows.Forms.GroupBox(); + this.buttonDownloadFfmpeg = new System.Windows.Forms.Button(); + this.buttonBrowseToFFmpeg = new System.Windows.Forms.Button(); + this.textBoxFFmpegPath = new System.Windows.Forms.TextBox(); + this.labelFFmpegPath = new System.Windows.Forms.Label(); + this.checkBoxUseFFmpeg = new System.Windows.Forms.CheckBox(); + this.groupBoxSpectrogram = new System.Windows.Forms.GroupBox(); + this.labelSpectrogramAppearance = new System.Windows.Forms.Label(); + this.comboBoxSpectrogramAppearance = new System.Windows.Forms.ComboBox(); + this.checkBoxGenerateSpectrogram = new System.Windows.Forms.CheckBox(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.buttonWaveformsFolderEmpty = new System.Windows.Forms.Button(); + this.labelWaveformsFolderInfo = new System.Windows.Forms.Label(); + this.groupBoxWaveformAppearence = new System.Windows.Forms.GroupBox(); + this.panelWaveformCursorColor = new System.Windows.Forms.Panel(); + this.buttonWaveformCursorColor = new System.Windows.Forms.Button(); + this.checkBoxWaveformSnapToSceneChanges = new System.Windows.Forms.CheckBox(); + this.checkBoxWaveformSingleClickSelect = new System.Windows.Forms.CheckBox(); + this.checkBoxWaveformShowWpm = new System.Windows.Forms.CheckBox(); + this.checkBoxWaveformShowCps = new System.Windows.Forms.CheckBox(); + this.checkBoxWaveformSetVideoPosMoveStartEnd = new System.Windows.Forms.CheckBox(); + this.labelWaveformTextSize = new System.Windows.Forms.Label(); + this.checkBoxWaveformTextBold = new System.Windows.Forms.CheckBox(); + this.comboBoxWaveformTextSize = new System.Windows.Forms.ComboBox(); + this.checkBoxListViewMouseEnterFocus = new System.Windows.Forms.CheckBox(); + this.checkBoxWaveformHoverFocus = new System.Windows.Forms.CheckBox(); + this.labelWaveformBorderHitMs2 = new System.Windows.Forms.Label(); + this.numericUpDownWaveformBorderHitMs = new System.Windows.Forms.NumericUpDown(); + this.labelWaveformBorderHitMs1 = new System.Windows.Forms.Label(); + this.checkBoxAllowOverlap = new System.Windows.Forms.CheckBox(); + this.checkBoxReverseMouseWheelScrollDirection = new System.Windows.Forms.CheckBox(); + this.panelWaveformTextColor = new System.Windows.Forms.Panel(); + this.buttonWaveformTextColor = new System.Windows.Forms.Button(); + this.panelWaveformGridColor = new System.Windows.Forms.Panel(); + this.buttonWaveformGridColor = new System.Windows.Forms.Button(); + this.panelWaveformBackgroundColor = new System.Windows.Forms.Panel(); + this.buttonWaveformBackgroundColor = new System.Windows.Forms.Button(); + this.panelWaveformColor = new System.Windows.Forms.Panel(); + this.buttonWaveformColor = new System.Windows.Forms.Button(); + this.panelWaveformSelectedColor = new System.Windows.Forms.Panel(); + this.buttonWaveformSelectedColor = new System.Windows.Forms.Button(); + this.checkBoxWaveformShowGrid = new System.Windows.Forms.CheckBox(); + this.tabPageTools = new System.Windows.Forms.TabPage(); + this.groupBoxGoogleTranslate = new System.Windows.Forms.GroupBox(); + this.labelGoogleTranslateApiKey = new System.Windows.Forms.Label(); + this.textBoxGoogleTransleApiKey = new System.Windows.Forms.TextBox(); + this.linkLabelGoogleTranslateSignUp = new System.Windows.Forms.LinkLabel(); + this.label3 = new System.Windows.Forms.Label(); + this.groupBoxBing = new System.Windows.Forms.GroupBox(); + this.comboBoxBoxBingTokenEndpoint = new System.Windows.Forms.ComboBox(); + this.labelBingTokenEndpoint = new System.Windows.Forms.Label(); + this.labelBingApiKey = new System.Windows.Forms.Label(); + this.textBoxBingClientSecret = new System.Windows.Forms.TextBox(); + this.linkLabelBingSubscribe = new System.Windows.Forms.LinkLabel(); + this.label1 = new System.Windows.Forms.Label(); + this.groupBoxToolsAutoBr = new System.Windows.Forms.GroupBox(); + this.labelToolsBreakBottomHeavyPercent = new System.Windows.Forms.Label(); + this.numericUpDownToolsBreakPreferBottomHeavy = new System.Windows.Forms.NumericUpDown(); + this.checkBoxToolsBreakPreferBottomHeavy = new System.Windows.Forms.CheckBox(); + this.checkBoxToolsBreakByPixelWidth = new System.Windows.Forms.CheckBox(); + this.checkBoxToolsBreakEarlyLineEnding = new System.Windows.Forms.CheckBox(); + this.checkBoxToolsBreakEarlyComma = new System.Windows.Forms.CheckBox(); + this.checkBoxToolsBreakEarlyDash = new System.Windows.Forms.CheckBox(); + this.labelUserBingApiId = new System.Windows.Forms.Label(); + this.buttonEditDoNotBreakAfterList = new System.Windows.Forms.Button(); + this.checkBoxUseDoNotBreakAfterList = new System.Windows.Forms.CheckBox(); + this.groupBoxSpellCheck = new System.Windows.Forms.GroupBox(); + this.checkBoxSpellCheckAutoChangeNamesViaSuggestions = new System.Windows.Forms.CheckBox(); + this.checkBoxUseAlwaysToFile = new System.Windows.Forms.CheckBox(); + this.checkBoxTreatINQuoteAsING = new System.Windows.Forms.CheckBox(); + this.checkBoxSpellCheckOneLetterWords = new System.Windows.Forms.CheckBox(); + this.checkBoxSpellCheckAutoChangeNames = new System.Windows.Forms.CheckBox(); + this.groupBoxFixCommonErrors = new System.Windows.Forms.GroupBox(); + this.buttonFixContinuationStyleSettings = new System.Windows.Forms.Button(); + this.checkBoxFceSkipStep1 = new System.Windows.Forms.CheckBox(); + this.checkBoxFixShortDisplayTimesAllowMoveStartTime = new System.Windows.Forms.CheckBox(); + this.checkBoxFixCommonOcrErrorsUsingHardcodedRules = new System.Windows.Forms.CheckBox(); + this.comboBoxToolsMusicSymbol = new System.Windows.Forms.ComboBox(); + this.textBoxMusicSymbolsToReplace = new System.Windows.Forms.TextBox(); + this.labelToolsMusicSymbolsToReplace = new System.Windows.Forms.Label(); + this.labelToolsMusicSymbol = new System.Windows.Forms.Label(); + this.groupBoxToolsVisualSync = new System.Windows.Forms.GroupBox(); + this.labelToolsEndScene = new System.Windows.Forms.Label(); + this.comboBoxToolsEndSceneIndex = new System.Windows.Forms.ComboBox(); + this.labelToolsStartScene = new System.Windows.Forms.Label(); + this.comboBoxToolsStartSceneIndex = new System.Windows.Forms.ComboBox(); + this.comboBoxToolsVerifySeconds = new System.Windows.Forms.ComboBox(); + this.labelVerifyButton = new System.Windows.Forms.Label(); + this.tabPageWordLists = new System.Windows.Forms.TabPage(); + this.groupBoxWordLists = new System.Windows.Forms.GroupBox(); + this.linkLabelOpenDictionaryFolder = new System.Windows.Forms.LinkLabel(); + this.groupBoxOcrFixList = new System.Windows.Forms.GroupBox(); + this.textBoxOcrFixValue = new System.Windows.Forms.TextBox(); + this.buttonRemoveOcrFix = new System.Windows.Forms.Button(); + this.listBoxOcrFixList = new System.Windows.Forms.ListBox(); + this.textBoxOcrFixKey = new System.Windows.Forms.TextBox(); + this.buttonAddOcrFix = new System.Windows.Forms.Button(); + this.groupBoxUserWordList = new System.Windows.Forms.GroupBox(); + this.buttonRemoveUserWord = new System.Windows.Forms.Button(); + this.listBoxUserWordLists = new System.Windows.Forms.ListBox(); + this.textBoxUserWord = new System.Windows.Forms.TextBox(); + this.buttonAddUserWord = new System.Windows.Forms.Button(); + this.groupBoxWordListLocation = new System.Windows.Forms.GroupBox(); + this.checkBoxNamesOnline = new System.Windows.Forms.CheckBox(); + this.textBoxNamesOnline = new System.Windows.Forms.TextBox(); + this.groupBoxNamesIgonoreLists = new System.Windows.Forms.GroupBox(); + this.buttonRemoveNameEtc = new System.Windows.Forms.Button(); + this.listBoxNames = new System.Windows.Forms.ListBox(); + this.textBoxNameEtc = new System.Windows.Forms.TextBox(); + this.buttonAddNames = new System.Windows.Forms.Button(); + this.labelWordListLanguage = new System.Windows.Forms.Label(); + this.comboBoxWordListLanguage = new System.Windows.Forms.ComboBox(); + this.tabPageToolBar = new System.Windows.Forms.TabPage(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.checkBoxShowFrameRate = new System.Windows.Forms.CheckBox(); + this.groupBoxShowToolBarButtons = new System.Windows.Forms.GroupBox(); + this.labelTBNetflixQualityCheck = new System.Windows.Forms.Label(); + this.pictureBoxNetflixQualityCheck = new System.Windows.Forms.PictureBox(); + this.checkBoxNetflixQualityCheck = new System.Windows.Forms.CheckBox(); + this.labelTBRemoveTextForHi = new System.Windows.Forms.Label(); + this.pictureBoxTBRemoveTextForHi = new System.Windows.Forms.PictureBox(); + this.checkBoxTBRemoveTextForHi = new System.Windows.Forms.CheckBox(); + this.labelTBFixCommonErrors = new System.Windows.Forms.Label(); + this.pictureBoxTBFixCommonErrors = new System.Windows.Forms.PictureBox(); + this.checkBoxTBFixCommonErrors = new System.Windows.Forms.CheckBox(); + this.labelTBHelp = new System.Windows.Forms.Label(); + this.pictureBoxHelp = new System.Windows.Forms.PictureBox(); + this.checkBoxHelp = new System.Windows.Forms.CheckBox(); + this.labelTBSettings = new System.Windows.Forms.Label(); + this.pictureBoxSettings = new System.Windows.Forms.PictureBox(); + this.checkBoxSettings = new System.Windows.Forms.CheckBox(); + this.labelTBSpellCheck = new System.Windows.Forms.Label(); + this.pictureBoxSpellCheck = new System.Windows.Forms.PictureBox(); + this.checkBoxSpellCheck = new System.Windows.Forms.CheckBox(); + this.labelTBVisualSync = new System.Windows.Forms.Label(); + this.pictureBoxVisualSync = new System.Windows.Forms.PictureBox(); + this.checkBoxVisualSync = new System.Windows.Forms.CheckBox(); + this.labelTBReplace = new System.Windows.Forms.Label(); + this.pictureBoxReplace = new System.Windows.Forms.PictureBox(); + this.checkBoxReplace = new System.Windows.Forms.CheckBox(); + this.labelTBFind = new System.Windows.Forms.Label(); + this.pictureBoxFind = new System.Windows.Forms.PictureBox(); + this.checkBoxToolbarFind = new System.Windows.Forms.CheckBox(); + this.labelTBSaveAs = new System.Windows.Forms.Label(); + this.pictureBoxSaveAs = new System.Windows.Forms.PictureBox(); + this.checkBoxToolbarSaveAs = new System.Windows.Forms.CheckBox(); + this.labelTBSave = new System.Windows.Forms.Label(); + this.pictureBoxSave = new System.Windows.Forms.PictureBox(); + this.checkBoxToolbarSave = new System.Windows.Forms.CheckBox(); + this.labelTBOpen = new System.Windows.Forms.Label(); + this.pictureBoxOpen = new System.Windows.Forms.PictureBox(); + this.checkBoxToolbarOpen = new System.Windows.Forms.CheckBox(); + this.labelTBNew = new System.Windows.Forms.Label(); + this.pictureBoxNew = new System.Windows.Forms.PictureBox(); + this.checkBoxToolbarNew = new System.Windows.Forms.CheckBox(); + this.tabPageFont = new System.Windows.Forms.TabPage(); + this.groupBoxFont = new System.Windows.Forms.GroupBox(); + this.labelFontNote = new System.Windows.Forms.Label(); + this.groupBoxFontTextBox = new System.Windows.Forms.GroupBox(); + this.panelTextBoxAssColor = new System.Windows.Forms.Panel(); + this.buttonTextBoxAssColor = new System.Windows.Forms.Button(); + this.panelTextBoxHtmlColor = new System.Windows.Forms.Panel(); + this.buttonTextBoxHtmlColor = new System.Windows.Forms.Button(); + this.checkBoxSubtitleTextBoxSyntaxColor = new System.Windows.Forms.CheckBox(); + this.labelSubtitleFontSize = new System.Windows.Forms.Label(); + this.comboBoxSubtitleFontSize = new System.Windows.Forms.ComboBox(); + this.checkBoxSubtitleFontBold = new System.Windows.Forms.CheckBox(); + this.checkBoxSubtitleCenter = new System.Windows.Forms.CheckBox(); + this.groupBoxFontListViews = new System.Windows.Forms.GroupBox(); + this.labelSubtitleListViewFontSize = new System.Windows.Forms.Label(); + this.comboBoxSubtitleListViewFontSize = new System.Windows.Forms.ComboBox(); + this.checkBoxSubtitleListViewFontBold = new System.Windows.Forms.CheckBox(); + this.groupBoxFontGeneral = new System.Windows.Forms.GroupBox(); + this.comboBoxSubtitleFont = new System.Windows.Forms.ComboBox(); + this.labelSubtitleFont = new System.Windows.Forms.Label(); + this.panelSubtitleFontColor = new System.Windows.Forms.Panel(); + this.labelSubtitleFontColor = new System.Windows.Forms.Label(); + this.panelSubtitleBackgroundColor = new System.Windows.Forms.Panel(); + this.labelSubtitleFontBackgroundColor = new System.Windows.Forms.Label(); + this.tabPageSsaStyle = new System.Windows.Forms.TabPage(); + this.groupBoxSsaStyle = new System.Windows.Forms.GroupBox(); + this.groupBoxSsaBorder = new System.Windows.Forms.GroupBox(); + this.numericUpDownSsaOutline = new System.Windows.Forms.NumericUpDown(); + this.labelSsaShadow = new System.Windows.Forms.Label(); + this.numericUpDownSsaShadow = new System.Windows.Forms.NumericUpDown(); + this.checkBoxSsaOpaqueBox = new System.Windows.Forms.CheckBox(); + this.labelSsaOutline = new System.Windows.Forms.Label(); + this.groupSsaBoxFont = new System.Windows.Forms.GroupBox(); + this.checkBoxSsaFontBold = new System.Windows.Forms.CheckBox(); + this.buttonSsaColor = new System.Windows.Forms.Button(); + this.panelPrimaryColor = new System.Windows.Forms.Panel(); + this.numericUpDownFontSize = new System.Windows.Forms.NumericUpDown(); + this.comboBoxFontName = new System.Windows.Forms.ComboBox(); + this.labelSsaFontSize = new System.Windows.Forms.Label(); + this.labelFontName = new System.Windows.Forms.Label(); + this.groupBoxMargins = new System.Windows.Forms.GroupBox(); + this.numericUpDownSsaMarginVertical = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownSsaMarginRight = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownSsaMarginLeft = new System.Windows.Forms.NumericUpDown(); + this.labelMarginVertical = new System.Windows.Forms.Label(); + this.labelMarginRight = new System.Windows.Forms.Label(); + this.labelMarginLeft = new System.Windows.Forms.Label(); + this.groupBoxPreview = new System.Windows.Forms.GroupBox(); + this.pictureBoxPreview = new System.Windows.Forms.PictureBox(); + this.tabPageNetwork = new System.Windows.Forms.TabPage(); + this.groupBoxNetworkSession = new System.Windows.Forms.GroupBox(); + this.buttonNetworkSessionNewMessageSound = new System.Windows.Forms.Button(); + this.textBoxNetworkSessionNewMessageSound = new System.Windows.Forms.TextBox(); + this.labelNetworkSessionNewMessageSound = new System.Windows.Forms.Label(); + this.groupBoxProxySettings = new System.Windows.Forms.GroupBox(); + this.groupBoxProxyAuthentication = new System.Windows.Forms.GroupBox(); + this.textBoxProxyDomain = new System.Windows.Forms.TextBox(); + this.labelProxyDomain = new System.Windows.Forms.Label(); + this.textBoxProxyUserName = new System.Windows.Forms.TextBox(); + this.labelProxyPassword = new System.Windows.Forms.Label(); + this.labelProxyUserName = new System.Windows.Forms.Label(); + this.textBoxProxyPassword = new System.Windows.Forms.TextBox(); + this.textBoxProxyAddress = new System.Windows.Forms.TextBox(); + this.labelProxyAddress = new System.Windows.Forms.Label(); + this.colorDialogSSAStyle = new System.Windows.Forms.ColorDialog(); + this.labelStatus = new System.Windows.Forms.Label(); + this.openFileDialogFFmpeg = new System.Windows.Forms.OpenFileDialog(); + this.buttonReset = new System.Windows.Forms.Button(); + this.toolTipContinuationPreview = new System.Windows.Forms.ToolTip(this.components); + this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog(); + this.tabControlSettings.SuspendLayout(); + this.tabPageGeneral.SuspendLayout(); + this.groupBoxMiscellaneous.SuspendLayout(); + this.groupBoxGeneralRules.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownOptimalCharsSec)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxWordsMin)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxNumberOfLines)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDurationMin)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDurationMax)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinGapMs)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxCharsSec)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSubtitleLineMaximumLength)).BeginInit(); + this.tabPageShortcuts.SuspendLayout(); + this.groupBoxShortcuts.SuspendLayout(); + this.contextMenuStripShortcuts.SuspendLayout(); + this.tabPageSyntaxColoring.SuspendLayout(); + this.groupBoxListViewSyntaxColoring.SuspendLayout(); + this.tabPageVideoPlayer.SuspendLayout(); + this.groupBoxMainWindowVideoControls.SuspendLayout(); + this.groupBoxVideoPlayerDefault.SuspendLayout(); + this.groupBoxVideoEngine.SuspendLayout(); + this.tabPageWaveform.SuspendLayout(); + this.groupBoxFfmpeg.SuspendLayout(); + this.groupBoxSpectrogram.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.groupBoxWaveformAppearence.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownWaveformBorderHitMs)).BeginInit(); + this.tabPageTools.SuspendLayout(); + this.groupBoxGoogleTranslate.SuspendLayout(); + this.groupBoxBing.SuspendLayout(); + this.groupBoxToolsAutoBr.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownToolsBreakPreferBottomHeavy)).BeginInit(); + this.groupBoxSpellCheck.SuspendLayout(); + this.groupBoxFixCommonErrors.SuspendLayout(); + this.groupBoxToolsVisualSync.SuspendLayout(); + this.tabPageWordLists.SuspendLayout(); + this.groupBoxWordLists.SuspendLayout(); + this.groupBoxOcrFixList.SuspendLayout(); + this.groupBoxUserWordList.SuspendLayout(); + this.groupBoxWordListLocation.SuspendLayout(); + this.groupBoxNamesIgonoreLists.SuspendLayout(); + this.tabPageToolBar.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.groupBoxShowToolBarButtons.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxNetflixQualityCheck)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxTBRemoveTextForHi)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxTBFixCommonErrors)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxHelp)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxSettings)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxSpellCheck)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxVisualSync)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxReplace)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxFind)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxSaveAs)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxSave)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxOpen)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxNew)).BeginInit(); + this.tabPageFont.SuspendLayout(); + this.groupBoxFont.SuspendLayout(); + this.groupBoxFontTextBox.SuspendLayout(); + this.groupBoxFontListViews.SuspendLayout(); + this.groupBoxFontGeneral.SuspendLayout(); + this.tabPageSsaStyle.SuspendLayout(); + this.groupBoxSsaStyle.SuspendLayout(); + this.groupBoxSsaBorder.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSsaOutline)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSsaShadow)).BeginInit(); + this.groupSsaBoxFont.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownFontSize)).BeginInit(); + this.groupBoxMargins.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSsaMarginVertical)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSsaMarginRight)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSsaMarginLeft)).BeginInit(); + this.groupBoxPreview.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxPreview)).BeginInit(); + this.tabPageNetwork.SuspendLayout(); + this.groupBoxNetworkSession.SuspendLayout(); + this.groupBoxProxySettings.SuspendLayout(); + this.groupBoxProxyAuthentication.SuspendLayout(); + this.SuspendLayout(); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; + this.buttonOK.Location = new System.Drawing.Point(506, 563); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 0; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.Location = new System.Drawing.Point(587, 563); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 1; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // tabControlSettings + // + this.tabControlSettings.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tabControlSettings.Controls.Add(this.tabPageGeneral); + this.tabControlSettings.Controls.Add(this.tabPageShortcuts); + this.tabControlSettings.Controls.Add(this.tabPageSyntaxColoring); + this.tabControlSettings.Controls.Add(this.tabPageVideoPlayer); + this.tabControlSettings.Controls.Add(this.tabPageWaveform); + this.tabControlSettings.Controls.Add(this.tabPageTools); + this.tabControlSettings.Controls.Add(this.tabPageWordLists); + this.tabControlSettings.Controls.Add(this.tabPageToolBar); + this.tabControlSettings.Controls.Add(this.tabPageFont); + this.tabControlSettings.Controls.Add(this.tabPageSsaStyle); + this.tabControlSettings.Controls.Add(this.tabPageNetwork); + this.tabControlSettings.Location = new System.Drawing.Point(13, 13); + this.tabControlSettings.Name = "tabControlSettings"; + this.tabControlSettings.SelectedIndex = 0; + this.tabControlSettings.Size = new System.Drawing.Size(840, 546); + this.tabControlSettings.TabIndex = 2; + this.tabControlSettings.SelectedIndexChanged += new System.EventHandler(this.TabControlSettingsSelectedIndexChanged); + // + // tabPageGeneral + // + this.tabPageGeneral.Controls.Add(this.groupBoxMiscellaneous); + this.tabPageGeneral.Location = new System.Drawing.Point(4, 22); + this.tabPageGeneral.Name = "tabPageGeneral"; + this.tabPageGeneral.Padding = new System.Windows.Forms.Padding(3); + this.tabPageGeneral.Size = new System.Drawing.Size(832, 520); + this.tabPageGeneral.TabIndex = 0; + this.tabPageGeneral.Text = "General"; + this.tabPageGeneral.UseVisualStyleBackColor = true; + // + // groupBoxMiscellaneous + // + this.groupBoxMiscellaneous.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxMiscellaneous.Controls.Add(this.labelSplitBehavior); + this.groupBoxMiscellaneous.Controls.Add(this.comboBoxSplitBehavior); + this.groupBoxMiscellaneous.Controls.Add(this.checkBoxAutoSave); + this.groupBoxMiscellaneous.Controls.Add(this.comboBoxSaveAsFileNameFrom); + this.groupBoxMiscellaneous.Controls.Add(this.labelSaveAsFileNameFrom); + this.groupBoxMiscellaneous.Controls.Add(this.groupBoxGeneralRules); + this.groupBoxMiscellaneous.Controls.Add(this.comboBoxAutoBackupDeleteAfter); + this.groupBoxMiscellaneous.Controls.Add(this.labelAutoBackupDeleteAfter); + this.groupBoxMiscellaneous.Controls.Add(this.checkBoxCheckForUpdates); + this.groupBoxMiscellaneous.Controls.Add(this.labelSpellChecker); + this.groupBoxMiscellaneous.Controls.Add(this.comboBoxTimeCodeMode); + this.groupBoxMiscellaneous.Controls.Add(this.labelTimeCodeMode); + this.groupBoxMiscellaneous.Controls.Add(this.comboBoxEncoding); + this.groupBoxMiscellaneous.Controls.Add(this.checkBoxAutoDetectAnsiEncoding); + this.groupBoxMiscellaneous.Controls.Add(this.textBoxShowLineBreaksAs); + this.groupBoxMiscellaneous.Controls.Add(this.checkBoxAutoWrapWhileTyping); + this.groupBoxMiscellaneous.Controls.Add(this.checkBoxPromptDeleteLines); + this.groupBoxMiscellaneous.Controls.Add(this.checkBoxAllowEditOfOriginalSubtitle); + this.groupBoxMiscellaneous.Controls.Add(this.comboBoxSpellChecker); + this.groupBoxMiscellaneous.Controls.Add(this.comboBoxAutoBackup); + this.groupBoxMiscellaneous.Controls.Add(this.labelAutoBackup); + this.groupBoxMiscellaneous.Controls.Add(this.checkBoxRememberSelectedLine); + this.groupBoxMiscellaneous.Controls.Add(this.checkBoxRemoveBlankLinesWhenOpening); + this.groupBoxMiscellaneous.Controls.Add(this.labelAutoDetectAnsiEncoding); + this.groupBoxMiscellaneous.Controls.Add(this.comboBoxListViewDoubleClickEvent); + this.groupBoxMiscellaneous.Controls.Add(this.labelListViewDoubleClickEvent); + this.groupBoxMiscellaneous.Controls.Add(this.labelShowLineBreaksAs); + this.groupBoxMiscellaneous.Controls.Add(this.checkBoxRememberWindowPosition); + this.groupBoxMiscellaneous.Controls.Add(this.checkBoxStartInSourceView); + this.groupBoxMiscellaneous.Controls.Add(this.checkBoxReopenLastOpened); + this.groupBoxMiscellaneous.Controls.Add(this.checkBoxRememberRecentFiles); + this.groupBoxMiscellaneous.Controls.Add(this.labelDefaultFileEncoding); + this.groupBoxMiscellaneous.Controls.Add(this.comboBoxFrameRate); + this.groupBoxMiscellaneous.Controls.Add(this.labelDefaultFrameRate); + this.groupBoxMiscellaneous.Location = new System.Drawing.Point(6, 6); + this.groupBoxMiscellaneous.Name = "groupBoxMiscellaneous"; + this.groupBoxMiscellaneous.Size = new System.Drawing.Size(819, 508); + this.groupBoxMiscellaneous.TabIndex = 0; + this.groupBoxMiscellaneous.TabStop = false; + this.groupBoxMiscellaneous.Text = "Miscellaneous"; + // + // labelSplitBehavior + // + this.labelSplitBehavior.AutoSize = true; + this.labelSplitBehavior.Location = new System.Drawing.Point(438, 291); + this.labelSplitBehavior.Name = "labelSplitBehavior"; + this.labelSplitBehavior.Size = new System.Drawing.Size(72, 13); + this.labelSplitBehavior.TabIndex = 20; + this.labelSplitBehavior.Text = "Split behavior"; + // + // comboBoxSplitBehavior + // + this.comboBoxSplitBehavior.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxSplitBehavior.FormattingEnabled = true; + this.comboBoxSplitBehavior.Location = new System.Drawing.Point(528, 288); + this.comboBoxSplitBehavior.Name = "comboBoxSplitBehavior"; + this.comboBoxSplitBehavior.Size = new System.Drawing.Size(207, 21); + this.comboBoxSplitBehavior.TabIndex = 21; + // + // checkBoxAutoSave + // + this.checkBoxAutoSave.AutoSize = true; + this.checkBoxAutoSave.Location = new System.Drawing.Point(441, 453); + this.checkBoxAutoSave.Name = "checkBoxAutoSave"; + this.checkBoxAutoSave.Size = new System.Drawing.Size(75, 17); + this.checkBoxAutoSave.TabIndex = 30; + this.checkBoxAutoSave.Text = "Auto save"; + this.checkBoxAutoSave.UseVisualStyleBackColor = true; + // + // comboBoxSaveAsFileNameFrom + // + this.comboBoxSaveAsFileNameFrom.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxSaveAsFileNameFrom.FormattingEnabled = true; + this.comboBoxSaveAsFileNameFrom.Location = new System.Drawing.Point(441, 386); + this.comboBoxSaveAsFileNameFrom.Name = "comboBoxSaveAsFileNameFrom"; + this.comboBoxSaveAsFileNameFrom.Size = new System.Drawing.Size(332, 21); + this.comboBoxSaveAsFileNameFrom.TabIndex = 25; + // + // labelSaveAsFileNameFrom + // + this.labelSaveAsFileNameFrom.AutoSize = true; + this.labelSaveAsFileNameFrom.Location = new System.Drawing.Point(438, 370); + this.labelSaveAsFileNameFrom.Name = "labelSaveAsFileNameFrom"; + this.labelSaveAsFileNameFrom.Size = new System.Drawing.Size(160, 13); + this.labelSaveAsFileNameFrom.TabIndex = 24; + this.labelSaveAsFileNameFrom.Text = "\"Save as...\" will take name from"; + // + // groupBoxGeneralRules + // + this.groupBoxGeneralRules.Controls.Add(this.buttonGapChoose); + this.groupBoxGeneralRules.Controls.Add(this.comboBoxContinuationStyle); + this.groupBoxGeneralRules.Controls.Add(this.labelContinuationStyle); + this.groupBoxGeneralRules.Controls.Add(this.labelDialogStyle); + this.groupBoxGeneralRules.Controls.Add(this.comboBoxDialogStyle); + this.groupBoxGeneralRules.Controls.Add(this.checkBoxCpsIncludeWhiteSpace); + this.groupBoxGeneralRules.Controls.Add(this.buttonEditProfile); + this.groupBoxGeneralRules.Controls.Add(this.comboBoxRulesProfileName); + this.groupBoxGeneralRules.Controls.Add(this.labelRulesProfileName); + this.groupBoxGeneralRules.Controls.Add(this.labelOptimalCharsPerSecond); + this.groupBoxGeneralRules.Controls.Add(this.numericUpDownOptimalCharsSec); + this.groupBoxGeneralRules.Controls.Add(this.labelSubMaxLen); + this.groupBoxGeneralRules.Controls.Add(this.numericUpDownMaxWordsMin); + this.groupBoxGeneralRules.Controls.Add(this.labelMergeShortLines); + this.groupBoxGeneralRules.Controls.Add(this.labelMaxWordsPerMin); + this.groupBoxGeneralRules.Controls.Add(this.labelMinDuration); + this.groupBoxGeneralRules.Controls.Add(this.numericUpDownMaxNumberOfLines); + this.groupBoxGeneralRules.Controls.Add(this.labelMaxDuration); + this.groupBoxGeneralRules.Controls.Add(this.labelMaxLines); + this.groupBoxGeneralRules.Controls.Add(this.numericUpDownDurationMin); + this.groupBoxGeneralRules.Controls.Add(this.numericUpDownDurationMax); + this.groupBoxGeneralRules.Controls.Add(this.comboBoxMergeShortLineLength); + this.groupBoxGeneralRules.Controls.Add(this.labelMaxCharsPerSecond); + this.groupBoxGeneralRules.Controls.Add(this.numericUpDownMinGapMs); + this.groupBoxGeneralRules.Controls.Add(this.numericUpDownMaxCharsSec); + this.groupBoxGeneralRules.Controls.Add(this.labelMinGapMs); + this.groupBoxGeneralRules.Controls.Add(this.numericUpDownSubtitleLineMaximumLength); + this.groupBoxGeneralRules.Location = new System.Drawing.Point(6, 23); + this.groupBoxGeneralRules.Name = "groupBoxGeneralRules"; + this.groupBoxGeneralRules.Size = new System.Drawing.Size(387, 381); + this.groupBoxGeneralRules.TabIndex = 0; + this.groupBoxGeneralRules.TabStop = false; + this.groupBoxGeneralRules.Text = "Rules"; + // + // buttonGapChoose + // + this.buttonGapChoose.Location = new System.Drawing.Point(265, 213); + this.buttonGapChoose.Name = "buttonGapChoose"; + this.buttonGapChoose.Size = new System.Drawing.Size(28, 23); + this.buttonGapChoose.TabIndex = 46; + this.buttonGapChoose.Text = "..."; + this.buttonGapChoose.UseVisualStyleBackColor = true; + this.buttonGapChoose.Click += new System.EventHandler(this.buttonGapChoose_Click); + // + // comboBoxContinuationStyle + // + this.comboBoxContinuationStyle.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxContinuationStyle.DropDownWidth = 170; + this.comboBoxContinuationStyle.FormattingEnabled = true; + this.comboBoxContinuationStyle.Location = new System.Drawing.Point(203, 324); + this.comboBoxContinuationStyle.Name = "comboBoxContinuationStyle"; + this.comboBoxContinuationStyle.Size = new System.Drawing.Size(170, 21); + this.comboBoxContinuationStyle.TabIndex = 58; + this.comboBoxContinuationStyle.SelectedIndexChanged += new System.EventHandler(this.ProfileUiValueChanged); + // + // labelContinuationStyle + // + this.labelContinuationStyle.AutoSize = true; + this.labelContinuationStyle.Location = new System.Drawing.Point(6, 327); + this.labelContinuationStyle.Name = "labelContinuationStyle"; + this.labelContinuationStyle.Size = new System.Drawing.Size(140, 13); + this.labelContinuationStyle.TabIndex = 63; + this.labelContinuationStyle.Text = "Sentence continuation style"; + // + // labelDialogStyle + // + this.labelDialogStyle.AutoSize = true; + this.labelDialogStyle.Location = new System.Drawing.Point(6, 300); + this.labelDialogStyle.Name = "labelDialogStyle"; + this.labelDialogStyle.Size = new System.Drawing.Size(62, 13); + this.labelDialogStyle.TabIndex = 61; + this.labelDialogStyle.Text = "Dialog style"; + // + // comboBoxDialogStyle + // + this.comboBoxDialogStyle.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxDialogStyle.FormattingEnabled = true; + this.comboBoxDialogStyle.Items.AddRange(new object[] { + "Dash both lines with space", + "Dash both lines without space", + "Dash second line with space", + "Dash second line without space"}); + this.comboBoxDialogStyle.Location = new System.Drawing.Point(203, 297); + this.comboBoxDialogStyle.Name = "comboBoxDialogStyle"; + this.comboBoxDialogStyle.Size = new System.Drawing.Size(170, 21); + this.comboBoxDialogStyle.TabIndex = 57; + this.comboBoxDialogStyle.SelectedIndexChanged += new System.EventHandler(this.ProfileUiValueChanged); + // + // checkBoxCpsIncludeWhiteSpace + // + this.checkBoxCpsIncludeWhiteSpace.AutoSize = true; + this.checkBoxCpsIncludeWhiteSpace.Location = new System.Drawing.Point(9, 354); + this.checkBoxCpsIncludeWhiteSpace.Name = "checkBoxCpsIncludeWhiteSpace"; + this.checkBoxCpsIncludeWhiteSpace.Size = new System.Drawing.Size(271, 17); + this.checkBoxCpsIncludeWhiteSpace.TabIndex = 65; + this.checkBoxCpsIncludeWhiteSpace.Text = "Characters per second (CPS) includes white spaces"; + this.checkBoxCpsIncludeWhiteSpace.UseVisualStyleBackColor = true; + this.checkBoxCpsIncludeWhiteSpace.CheckedChanged += new System.EventHandler(this.ProfileUiValueChanged); + // + // buttonEditProfile + // + this.buttonEditProfile.Location = new System.Drawing.Point(322, 19); + this.buttonEditProfile.Name = "buttonEditProfile"; + this.buttonEditProfile.Size = new System.Drawing.Size(28, 23); + this.buttonEditProfile.TabIndex = 10; + this.buttonEditProfile.Text = "..."; + this.buttonEditProfile.UseVisualStyleBackColor = true; + this.buttonEditProfile.Click += new System.EventHandler(this.buttonEditProfile_Click); + // + // comboBoxRulesProfileName + // + this.comboBoxRulesProfileName.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxRulesProfileName.FormattingEnabled = true; + this.comboBoxRulesProfileName.Location = new System.Drawing.Point(78, 20); + this.comboBoxRulesProfileName.Name = "comboBoxRulesProfileName"; + this.comboBoxRulesProfileName.Size = new System.Drawing.Size(238, 21); + this.comboBoxRulesProfileName.TabIndex = 5; + this.comboBoxRulesProfileName.SelectedIndexChanged += new System.EventHandler(this.comboBoxRulesProfileName_SelectedIndexChanged); + // + // labelRulesProfileName + // + this.labelRulesProfileName.AutoSize = true; + this.labelRulesProfileName.Location = new System.Drawing.Point(6, 24); + this.labelRulesProfileName.Name = "labelRulesProfileName"; + this.labelRulesProfileName.Size = new System.Drawing.Size(37, 13); + this.labelRulesProfileName.TabIndex = 50; + this.labelRulesProfileName.Text = "Profile"; + // + // labelOptimalCharsPerSecond + // + this.labelOptimalCharsPerSecond.AutoSize = true; + this.labelOptimalCharsPerSecond.Location = new System.Drawing.Point(6, 84); + this.labelOptimalCharsPerSecond.Name = "labelOptimalCharsPerSecond"; + this.labelOptimalCharsPerSecond.Size = new System.Drawing.Size(92, 13); + this.labelOptimalCharsPerSecond.TabIndex = 8; + this.labelOptimalCharsPerSecond.Text = "Optimal chars/sec"; + // + // numericUpDownOptimalCharsSec + // + this.numericUpDownOptimalCharsSec.DecimalPlaces = 1; + this.numericUpDownOptimalCharsSec.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.numericUpDownOptimalCharsSec.Location = new System.Drawing.Point(203, 82); + this.numericUpDownOptimalCharsSec.Minimum = new decimal(new int[] { + 4, + 0, + 0, + 0}); + this.numericUpDownOptimalCharsSec.Name = "numericUpDownOptimalCharsSec"; + this.numericUpDownOptimalCharsSec.Size = new System.Drawing.Size(56, 21); + this.numericUpDownOptimalCharsSec.TabIndex = 20; + this.numericUpDownOptimalCharsSec.Value = new decimal(new int[] { + 11, + 0, + 0, + 0}); + this.numericUpDownOptimalCharsSec.ValueChanged += new System.EventHandler(this.ProfileUiValueChanged); + // + // labelSubMaxLen + // + this.labelSubMaxLen.AutoSize = true; + this.labelSubMaxLen.Location = new System.Drawing.Point(6, 57); + this.labelSubMaxLen.Name = "labelSubMaxLen"; + this.labelSubMaxLen.Size = new System.Drawing.Size(103, 13); + this.labelSubMaxLen.TabIndex = 6; + this.labelSubMaxLen.Text = "Subtitle max. length"; + // + // numericUpDownMaxWordsMin + // + this.numericUpDownMaxWordsMin.Location = new System.Drawing.Point(203, 136); + this.numericUpDownMaxWordsMin.Maximum = new decimal(new int[] { + 1000, + 0, + 0, + 0}); + this.numericUpDownMaxWordsMin.Minimum = new decimal(new int[] { + 4, + 0, + 0, + 0}); + this.numericUpDownMaxWordsMin.Name = "numericUpDownMaxWordsMin"; + this.numericUpDownMaxWordsMin.Size = new System.Drawing.Size(56, 21); + this.numericUpDownMaxWordsMin.TabIndex = 30; + this.numericUpDownMaxWordsMin.Value = new decimal(new int[] { + 300, + 0, + 0, + 0}); + this.numericUpDownMaxWordsMin.ValueChanged += new System.EventHandler(this.ProfileUiValueChanged); + // + // labelMergeShortLines + // + this.labelMergeShortLines.AutoSize = true; + this.labelMergeShortLines.Location = new System.Drawing.Point(6, 273); + this.labelMergeShortLines.Name = "labelMergeShortLines"; + this.labelMergeShortLines.Size = new System.Drawing.Size(124, 13); + this.labelMergeShortLines.TabIndex = 16; + this.labelMergeShortLines.Text = "Merge lines shorter than"; + // + // labelMaxWordsPerMin + // + this.labelMaxWordsPerMin.AutoSize = true; + this.labelMaxWordsPerMin.Location = new System.Drawing.Point(6, 138); + this.labelMaxWordsPerMin.Name = "labelMaxWordsPerMin"; + this.labelMaxWordsPerMin.Size = new System.Drawing.Size(83, 13); + this.labelMaxWordsPerMin.TabIndex = 49; + this.labelMaxWordsPerMin.Text = "Max. words/min"; + // + // labelMinDuration + // + this.labelMinDuration.AutoSize = true; + this.labelMinDuration.Location = new System.Drawing.Point(6, 165); + this.labelMinDuration.Name = "labelMinDuration"; + this.labelMinDuration.Size = new System.Drawing.Size(132, 13); + this.labelMinDuration.TabIndex = 10; + this.labelMinDuration.Text = "Min. duration, milliseconds"; + // + // numericUpDownMaxNumberOfLines + // + this.numericUpDownMaxNumberOfLines.Location = new System.Drawing.Point(203, 242); + this.numericUpDownMaxNumberOfLines.Maximum = new decimal(new int[] { + 25, + 0, + 0, + 0}); + this.numericUpDownMaxNumberOfLines.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownMaxNumberOfLines.Name = "numericUpDownMaxNumberOfLines"; + this.numericUpDownMaxNumberOfLines.Size = new System.Drawing.Size(56, 21); + this.numericUpDownMaxNumberOfLines.TabIndex = 50; + this.numericUpDownMaxNumberOfLines.Value = new decimal(new int[] { + 2, + 0, + 0, + 0}); + this.numericUpDownMaxNumberOfLines.ValueChanged += new System.EventHandler(this.numericUpDownMaxNumberOfLines_ValueChanged); + // + // labelMaxDuration + // + this.labelMaxDuration.AutoSize = true; + this.labelMaxDuration.Location = new System.Drawing.Point(6, 191); + this.labelMaxDuration.Name = "labelMaxDuration"; + this.labelMaxDuration.Size = new System.Drawing.Size(136, 13); + this.labelMaxDuration.TabIndex = 12; + this.labelMaxDuration.Text = "Max. duration, milliseconds"; + // + // labelMaxLines + // + this.labelMaxLines.AutoSize = true; + this.labelMaxLines.Location = new System.Drawing.Point(6, 244); + this.labelMaxLines.Name = "labelMaxLines"; + this.labelMaxLines.Size = new System.Drawing.Size(107, 13); + this.labelMaxLines.TabIndex = 47; + this.labelMaxLines.Text = "Max. number of lines"; + // + // numericUpDownDurationMin + // + this.numericUpDownDurationMin.Location = new System.Drawing.Point(203, 163); + this.numericUpDownDurationMin.Maximum = new decimal(new int[] { + 3000, + 0, + 0, + 0}); + this.numericUpDownDurationMin.Minimum = new decimal(new int[] { + 100, + 0, + 0, + 0}); + this.numericUpDownDurationMin.Name = "numericUpDownDurationMin"; + this.numericUpDownDurationMin.Size = new System.Drawing.Size(56, 21); + this.numericUpDownDurationMin.TabIndex = 35; + this.numericUpDownDurationMin.Value = new decimal(new int[] { + 100, + 0, + 0, + 0}); + this.numericUpDownDurationMin.ValueChanged += new System.EventHandler(this.ProfileUiValueChanged); + // + // numericUpDownDurationMax + // + this.numericUpDownDurationMax.Location = new System.Drawing.Point(203, 189); + this.numericUpDownDurationMax.Maximum = new decimal(new int[] { + 50000, + 0, + 0, + 0}); + this.numericUpDownDurationMax.Minimum = new decimal(new int[] { + 3000, + 0, + 0, + 0}); + this.numericUpDownDurationMax.Name = "numericUpDownDurationMax"; + this.numericUpDownDurationMax.Size = new System.Drawing.Size(56, 21); + this.numericUpDownDurationMax.TabIndex = 40; + this.numericUpDownDurationMax.Value = new decimal(new int[] { + 50000, + 0, + 0, + 0}); + this.numericUpDownDurationMax.ValueChanged += new System.EventHandler(this.ProfileUiValueChanged); + // + // comboBoxMergeShortLineLength + // + this.comboBoxMergeShortLineLength.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxMergeShortLineLength.FormattingEnabled = true; + this.comboBoxMergeShortLineLength.Location = new System.Drawing.Point(203, 270); + this.comboBoxMergeShortLineLength.Name = "comboBoxMergeShortLineLength"; + this.comboBoxMergeShortLineLength.Size = new System.Drawing.Size(73, 21); + this.comboBoxMergeShortLineLength.TabIndex = 55; + this.comboBoxMergeShortLineLength.SelectedIndexChanged += new System.EventHandler(this.ProfileUiValueChanged); + // + // labelMaxCharsPerSecond + // + this.labelMaxCharsPerSecond.AutoSize = true; + this.labelMaxCharsPerSecond.Location = new System.Drawing.Point(6, 111); + this.labelMaxCharsPerSecond.Name = "labelMaxCharsPerSecond"; + this.labelMaxCharsPerSecond.Size = new System.Drawing.Size(80, 13); + this.labelMaxCharsPerSecond.TabIndex = 9; + this.labelMaxCharsPerSecond.Text = "Max. chars/sec"; + // + // numericUpDownMinGapMs + // + this.numericUpDownMinGapMs.Location = new System.Drawing.Point(203, 215); + this.numericUpDownMinGapMs.Maximum = new decimal(new int[] { + 1000, + 0, + 0, + 0}); + this.numericUpDownMinGapMs.Name = "numericUpDownMinGapMs"; + this.numericUpDownMinGapMs.Size = new System.Drawing.Size(56, 21); + this.numericUpDownMinGapMs.TabIndex = 45; + this.numericUpDownMinGapMs.Value = new decimal(new int[] { + 25, + 0, + 0, + 0}); + this.numericUpDownMinGapMs.ValueChanged += new System.EventHandler(this.ProfileUiValueChanged); + // + // numericUpDownMaxCharsSec + // + this.numericUpDownMaxCharsSec.DecimalPlaces = 1; + this.numericUpDownMaxCharsSec.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.numericUpDownMaxCharsSec.Location = new System.Drawing.Point(203, 109); + this.numericUpDownMaxCharsSec.Minimum = new decimal(new int[] { + 4, + 0, + 0, + 0}); + this.numericUpDownMaxCharsSec.Name = "numericUpDownMaxCharsSec"; + this.numericUpDownMaxCharsSec.Size = new System.Drawing.Size(56, 21); + this.numericUpDownMaxCharsSec.TabIndex = 25; + this.numericUpDownMaxCharsSec.Value = new decimal(new int[] { + 24, + 0, + 0, + 0}); + this.numericUpDownMaxCharsSec.ValueChanged += new System.EventHandler(this.ProfileUiValueChanged); + // + // labelMinGapMs + // + this.labelMinGapMs.AutoSize = true; + this.labelMinGapMs.Location = new System.Drawing.Point(6, 217); + this.labelMinGapMs.Name = "labelMinGapMs"; + this.labelMinGapMs.Size = new System.Drawing.Size(136, 13); + this.labelMinGapMs.TabIndex = 14; + this.labelMinGapMs.Text = "Min. gap between subtitles"; + // + // numericUpDownSubtitleLineMaximumLength + // + this.numericUpDownSubtitleLineMaximumLength.Location = new System.Drawing.Point(203, 55); + this.numericUpDownSubtitleLineMaximumLength.Maximum = new decimal(new int[] { + 999, + 0, + 0, + 0}); + this.numericUpDownSubtitleLineMaximumLength.Minimum = new decimal(new int[] { + 10, + 0, + 0, + 0}); + this.numericUpDownSubtitleLineMaximumLength.Name = "numericUpDownSubtitleLineMaximumLength"; + this.numericUpDownSubtitleLineMaximumLength.Size = new System.Drawing.Size(56, 21); + this.numericUpDownSubtitleLineMaximumLength.TabIndex = 15; + this.numericUpDownSubtitleLineMaximumLength.Value = new decimal(new int[] { + 100, + 0, + 0, + 0}); + this.numericUpDownSubtitleLineMaximumLength.ValueChanged += new System.EventHandler(this.ProfileUiValueChanged); + // + // comboBoxAutoBackupDeleteAfter + // + this.comboBoxAutoBackupDeleteAfter.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxAutoBackupDeleteAfter.FormattingEnabled = true; + this.comboBoxAutoBackupDeleteAfter.Items.AddRange(new object[] { + "1 month", + "3 months", + "6 months"}); + this.comboBoxAutoBackupDeleteAfter.Location = new System.Drawing.Point(707, 421); + this.comboBoxAutoBackupDeleteAfter.Name = "comboBoxAutoBackupDeleteAfter"; + this.comboBoxAutoBackupDeleteAfter.Size = new System.Drawing.Size(88, 21); + this.comboBoxAutoBackupDeleteAfter.TabIndex = 29; + // + // labelAutoBackupDeleteAfter + // + this.labelAutoBackupDeleteAfter.AutoSize = true; + this.labelAutoBackupDeleteAfter.Location = new System.Drawing.Point(639, 424); + this.labelAutoBackupDeleteAfter.Name = "labelAutoBackupDeleteAfter"; + this.labelAutoBackupDeleteAfter.Size = new System.Drawing.Size(65, 13); + this.labelAutoBackupDeleteAfter.TabIndex = 28; + this.labelAutoBackupDeleteAfter.Text = "Delete after"; + // + // checkBoxCheckForUpdates + // + this.checkBoxCheckForUpdates.AutoSize = true; + this.checkBoxCheckForUpdates.Location = new System.Drawing.Point(522, 453); + this.checkBoxCheckForUpdates.Name = "checkBoxCheckForUpdates"; + this.checkBoxCheckForUpdates.Size = new System.Drawing.Size(114, 17); + this.checkBoxCheckForUpdates.TabIndex = 31; + this.checkBoxCheckForUpdates.Text = "Check for updates"; + this.checkBoxCheckForUpdates.UseVisualStyleBackColor = true; + // + // labelSpellChecker + // + this.labelSpellChecker.AutoSize = true; + this.labelSpellChecker.Location = new System.Drawing.Point(669, 19); + this.labelSpellChecker.Name = "labelSpellChecker"; + this.labelSpellChecker.Size = new System.Drawing.Size(69, 13); + this.labelSpellChecker.TabIndex = 30; + this.labelSpellChecker.Text = "Spell checker"; + this.labelSpellChecker.Visible = false; + // + // comboBoxTimeCodeMode + // + this.comboBoxTimeCodeMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxTimeCodeMode.FormattingEnabled = true; + this.comboBoxTimeCodeMode.Items.AddRange(new object[] { + "HH:MM:SS:MSEC (00:00:00.000)", + "HH:MM:SS:FF (00:00:00.00)"}); + this.comboBoxTimeCodeMode.Location = new System.Drawing.Point(528, 261); + this.comboBoxTimeCodeMode.Name = "comboBoxTimeCodeMode"; + this.comboBoxTimeCodeMode.Size = new System.Drawing.Size(207, 21); + this.comboBoxTimeCodeMode.TabIndex = 19; + // + // labelTimeCodeMode + // + this.labelTimeCodeMode.AutoSize = true; + this.labelTimeCodeMode.Location = new System.Drawing.Point(438, 264); + this.labelTimeCodeMode.Name = "labelTimeCodeMode"; + this.labelTimeCodeMode.Size = new System.Drawing.Size(84, 13); + this.labelTimeCodeMode.TabIndex = 18; + this.labelTimeCodeMode.Text = "Time code mode"; + // + // comboBoxEncoding + // + this.comboBoxEncoding.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxEncoding.FormattingEnabled = true; + this.comboBoxEncoding.Items.AddRange(new object[] { + "ANSI", + "UTF-7", + "UTF-8", + "Unicode"}); + this.comboBoxEncoding.Location = new System.Drawing.Point(205, 438); + this.comboBoxEncoding.Name = "comboBoxEncoding"; + this.comboBoxEncoding.Size = new System.Drawing.Size(188, 21); + this.comboBoxEncoding.TabIndex = 4; + // + // checkBoxAutoDetectAnsiEncoding + // + this.checkBoxAutoDetectAnsiEncoding.AutoSize = true; + this.checkBoxAutoDetectAnsiEncoding.Location = new System.Drawing.Point(205, 467); + this.checkBoxAutoDetectAnsiEncoding.Name = "checkBoxAutoDetectAnsiEncoding"; + this.checkBoxAutoDetectAnsiEncoding.Size = new System.Drawing.Size(15, 14); + this.checkBoxAutoDetectAnsiEncoding.TabIndex = 6; + this.checkBoxAutoDetectAnsiEncoding.UseVisualStyleBackColor = true; + // + // textBoxShowLineBreaksAs + // + this.textBoxShowLineBreaksAs.Location = new System.Drawing.Point(594, 233); + this.textBoxShowLineBreaksAs.MaxLength = 10; + this.textBoxShowLineBreaksAs.Name = "textBoxShowLineBreaksAs"; + this.textBoxShowLineBreaksAs.Size = new System.Drawing.Size(60, 21); + this.textBoxShowLineBreaksAs.TabIndex = 17; + // + // checkBoxAutoWrapWhileTyping + // + this.checkBoxAutoWrapWhileTyping.AutoSize = true; + this.checkBoxAutoWrapWhileTyping.Location = new System.Drawing.Point(441, 210); + this.checkBoxAutoWrapWhileTyping.Name = "checkBoxAutoWrapWhileTyping"; + this.checkBoxAutoWrapWhileTyping.Size = new System.Drawing.Size(137, 17); + this.checkBoxAutoWrapWhileTyping.TabIndex = 15; + this.checkBoxAutoWrapWhileTyping.Text = "Auto-wrap while typing"; + this.checkBoxAutoWrapWhileTyping.UseVisualStyleBackColor = true; + // + // checkBoxPromptDeleteLines + // + this.checkBoxPromptDeleteLines.AutoSize = true; + this.checkBoxPromptDeleteLines.Location = new System.Drawing.Point(441, 187); + this.checkBoxPromptDeleteLines.Name = "checkBoxPromptDeleteLines"; + this.checkBoxPromptDeleteLines.Size = new System.Drawing.Size(142, 17); + this.checkBoxPromptDeleteLines.TabIndex = 14; + this.checkBoxPromptDeleteLines.Text = "Prompt for deleting lines"; + this.checkBoxPromptDeleteLines.UseVisualStyleBackColor = true; + // + // checkBoxAllowEditOfOriginalSubtitle + // + this.checkBoxAllowEditOfOriginalSubtitle.AutoSize = true; + this.checkBoxAllowEditOfOriginalSubtitle.Location = new System.Drawing.Point(441, 164); + this.checkBoxAllowEditOfOriginalSubtitle.Name = "checkBoxAllowEditOfOriginalSubtitle"; + this.checkBoxAllowEditOfOriginalSubtitle.Size = new System.Drawing.Size(160, 17); + this.checkBoxAllowEditOfOriginalSubtitle.TabIndex = 13; + this.checkBoxAllowEditOfOriginalSubtitle.Text = "Allow edit of original subtitle"; + this.checkBoxAllowEditOfOriginalSubtitle.UseVisualStyleBackColor = true; + // + // comboBoxSpellChecker + // + this.comboBoxSpellChecker.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxSpellChecker.FormattingEnabled = true; + this.comboBoxSpellChecker.Items.AddRange(new object[] { + "Hunspell", + "Word"}); + this.comboBoxSpellChecker.Location = new System.Drawing.Point(692, 16); + this.comboBoxSpellChecker.Name = "comboBoxSpellChecker"; + this.comboBoxSpellChecker.Size = new System.Drawing.Size(121, 21); + this.comboBoxSpellChecker.TabIndex = 31; + this.comboBoxSpellChecker.Visible = false; + // + // comboBoxAutoBackup + // + this.comboBoxAutoBackup.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxAutoBackup.FormattingEnabled = true; + this.comboBoxAutoBackup.Items.AddRange(new object[] { + "None", + "Every minute", + "Every 5 minutes", + "Every 15 minutes"}); + this.comboBoxAutoBackup.Location = new System.Drawing.Point(512, 421); + this.comboBoxAutoBackup.Name = "comboBoxAutoBackup"; + this.comboBoxAutoBackup.Size = new System.Drawing.Size(121, 21); + this.comboBoxAutoBackup.TabIndex = 27; + // + // labelAutoBackup + // + this.labelAutoBackup.AutoSize = true; + this.labelAutoBackup.Location = new System.Drawing.Point(438, 424); + this.labelAutoBackup.Name = "labelAutoBackup"; + this.labelAutoBackup.Size = new System.Drawing.Size(68, 13); + this.labelAutoBackup.TabIndex = 26; + this.labelAutoBackup.Text = "Auto-backup"; + // + // checkBoxRememberSelectedLine + // + this.checkBoxRememberSelectedLine.AutoSize = true; + this.checkBoxRememberSelectedLine.Location = new System.Drawing.Point(449, 69); + this.checkBoxRememberSelectedLine.Name = "checkBoxRememberSelectedLine"; + this.checkBoxRememberSelectedLine.Size = new System.Drawing.Size(139, 17); + this.checkBoxRememberSelectedLine.TabIndex = 9; + this.checkBoxRememberSelectedLine.Text = "Remember selected line"; + this.checkBoxRememberSelectedLine.UseVisualStyleBackColor = true; + // + // checkBoxRemoveBlankLinesWhenOpening + // + this.checkBoxRemoveBlankLinesWhenOpening.AutoSize = true; + this.checkBoxRemoveBlankLinesWhenOpening.Location = new System.Drawing.Point(441, 141); + this.checkBoxRemoveBlankLinesWhenOpening.Name = "checkBoxRemoveBlankLinesWhenOpening"; + this.checkBoxRemoveBlankLinesWhenOpening.Size = new System.Drawing.Size(225, 17); + this.checkBoxRemoveBlankLinesWhenOpening.TabIndex = 12; + this.checkBoxRemoveBlankLinesWhenOpening.Text = "Remove blank lines when opening subtitle"; + this.checkBoxRemoveBlankLinesWhenOpening.UseVisualStyleBackColor = true; + // + // labelAutoDetectAnsiEncoding + // + this.labelAutoDetectAnsiEncoding.AutoSize = true; + this.labelAutoDetectAnsiEncoding.Location = new System.Drawing.Point(8, 466); + this.labelAutoDetectAnsiEncoding.Name = "labelAutoDetectAnsiEncoding"; + this.labelAutoDetectAnsiEncoding.Size = new System.Drawing.Size(137, 13); + this.labelAutoDetectAnsiEncoding.TabIndex = 5; + this.labelAutoDetectAnsiEncoding.Text = "Auto detect ANSI encoding"; + // + // comboBoxListViewDoubleClickEvent + // + this.comboBoxListViewDoubleClickEvent.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxListViewDoubleClickEvent.FormattingEnabled = true; + this.comboBoxListViewDoubleClickEvent.Items.AddRange(new object[] { + "ANSI", + "UTF-7", + "UTF-8", + "Unicode"}); + this.comboBoxListViewDoubleClickEvent.Location = new System.Drawing.Point(441, 337); + this.comboBoxListViewDoubleClickEvent.Name = "comboBoxListViewDoubleClickEvent"; + this.comboBoxListViewDoubleClickEvent.Size = new System.Drawing.Size(332, 21); + this.comboBoxListViewDoubleClickEvent.TabIndex = 23; + // + // labelListViewDoubleClickEvent + // + this.labelListViewDoubleClickEvent.AutoSize = true; + this.labelListViewDoubleClickEvent.Location = new System.Drawing.Point(438, 321); + this.labelListViewDoubleClickEvent.Name = "labelListViewDoubleClickEvent"; + this.labelListViewDoubleClickEvent.Size = new System.Drawing.Size(227, 13); + this.labelListViewDoubleClickEvent.TabIndex = 22; + this.labelListViewDoubleClickEvent.Text = "Double-click on line in main window listview will"; + // + // labelShowLineBreaksAs + // + this.labelShowLineBreaksAs.AutoSize = true; + this.labelShowLineBreaksAs.Location = new System.Drawing.Point(438, 236); + this.labelShowLineBreaksAs.Name = "labelShowLineBreaksAs"; + this.labelShowLineBreaksAs.Size = new System.Drawing.Size(150, 13); + this.labelShowLineBreaksAs.TabIndex = 16; + this.labelShowLineBreaksAs.Text = "Show line breaks in listview as"; + // + // checkBoxRememberWindowPosition + // + this.checkBoxRememberWindowPosition.AutoSize = true; + this.checkBoxRememberWindowPosition.Location = new System.Drawing.Point(441, 95); + this.checkBoxRememberWindowPosition.Name = "checkBoxRememberWindowPosition"; + this.checkBoxRememberWindowPosition.Size = new System.Drawing.Size(223, 17); + this.checkBoxRememberWindowPosition.TabIndex = 10; + this.checkBoxRememberWindowPosition.Text = "Remember main window position and size"; + this.checkBoxRememberWindowPosition.UseVisualStyleBackColor = true; + // + // checkBoxStartInSourceView + // + this.checkBoxStartInSourceView.AutoSize = true; + this.checkBoxStartInSourceView.Location = new System.Drawing.Point(441, 118); + this.checkBoxStartInSourceView.Name = "checkBoxStartInSourceView"; + this.checkBoxStartInSourceView.Size = new System.Drawing.Size(121, 17); + this.checkBoxStartInSourceView.TabIndex = 11; + this.checkBoxStartInSourceView.Text = "Start in source view"; + this.checkBoxStartInSourceView.UseVisualStyleBackColor = true; + // + // checkBoxReopenLastOpened + // + this.checkBoxReopenLastOpened.AutoSize = true; + this.checkBoxReopenLastOpened.Location = new System.Drawing.Point(449, 46); + this.checkBoxReopenLastOpened.Name = "checkBoxReopenLastOpened"; + this.checkBoxReopenLastOpened.Size = new System.Drawing.Size(145, 17); + this.checkBoxReopenLastOpened.TabIndex = 8; + this.checkBoxReopenLastOpened.Text = "Start with last file loaded"; + this.checkBoxReopenLastOpened.UseVisualStyleBackColor = true; + // + // checkBoxRememberRecentFiles + // + this.checkBoxRememberRecentFiles.AutoSize = true; + this.checkBoxRememberRecentFiles.Location = new System.Drawing.Point(441, 22); + this.checkBoxRememberRecentFiles.Name = "checkBoxRememberRecentFiles"; + this.checkBoxRememberRecentFiles.Size = new System.Drawing.Size(195, 17); + this.checkBoxRememberRecentFiles.TabIndex = 7; + this.checkBoxRememberRecentFiles.Text = "Remember recent files (for reopen)"; + this.checkBoxRememberRecentFiles.UseVisualStyleBackColor = true; + this.checkBoxRememberRecentFiles.CheckedChanged += new System.EventHandler(this.checkBoxRememberRecentFiles_CheckedChanged); + // + // labelDefaultFileEncoding + // + this.labelDefaultFileEncoding.AutoSize = true; + this.labelDefaultFileEncoding.Location = new System.Drawing.Point(8, 442); + this.labelDefaultFileEncoding.Name = "labelDefaultFileEncoding"; + this.labelDefaultFileEncoding.Size = new System.Drawing.Size(105, 13); + this.labelDefaultFileEncoding.TabIndex = 3; + this.labelDefaultFileEncoding.Text = "Default file encoding"; + // + // comboBoxFrameRate + // + this.comboBoxFrameRate.FormattingEnabled = true; + this.comboBoxFrameRate.Location = new System.Drawing.Point(205, 410); + this.comboBoxFrameRate.Name = "comboBoxFrameRate"; + this.comboBoxFrameRate.Size = new System.Drawing.Size(121, 21); + this.comboBoxFrameRate.TabIndex = 2; + // + // labelDefaultFrameRate + // + this.labelDefaultFrameRate.AutoSize = true; + this.labelDefaultFrameRate.Location = new System.Drawing.Point(8, 415); + this.labelDefaultFrameRate.Name = "labelDefaultFrameRate"; + this.labelDefaultFrameRate.Size = new System.Drawing.Size(96, 13); + this.labelDefaultFrameRate.TabIndex = 1; + this.labelDefaultFrameRate.Text = "Default frame rate"; + // + // tabPageShortcuts + // + this.tabPageShortcuts.Controls.Add(this.groupBoxShortcuts); + this.tabPageShortcuts.Location = new System.Drawing.Point(4, 22); + this.tabPageShortcuts.Name = "tabPageShortcuts"; + this.tabPageShortcuts.Padding = new System.Windows.Forms.Padding(3); + this.tabPageShortcuts.Size = new System.Drawing.Size(832, 520); + this.tabPageShortcuts.TabIndex = 8; + this.tabPageShortcuts.Text = "Shortcuts"; + this.tabPageShortcuts.UseVisualStyleBackColor = true; + // + // groupBoxShortcuts + // + this.groupBoxShortcuts.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxShortcuts.Controls.Add(this.buttonShortcutsClear); + this.groupBoxShortcuts.Controls.Add(this.labelShortcutsSearch); + this.groupBoxShortcuts.Controls.Add(this.textBoxShortcutSearch); + this.groupBoxShortcuts.Controls.Add(this.buttonClearShortcut); + this.groupBoxShortcuts.Controls.Add(this.comboBoxShortcutKey); + this.groupBoxShortcuts.Controls.Add(this.labelShortcutKey); + this.groupBoxShortcuts.Controls.Add(this.checkBoxShortcutsShift); + this.groupBoxShortcuts.Controls.Add(this.checkBoxShortcutsAlt); + this.groupBoxShortcuts.Controls.Add(this.checkBoxShortcutsControl); + this.groupBoxShortcuts.Controls.Add(this.buttonUpdateShortcut); + this.groupBoxShortcuts.Controls.Add(this.treeViewShortcuts); + this.groupBoxShortcuts.Controls.Add(this.labelShortcut); + this.groupBoxShortcuts.Location = new System.Drawing.Point(6, 6); + this.groupBoxShortcuts.Name = "groupBoxShortcuts"; + this.groupBoxShortcuts.Size = new System.Drawing.Size(819, 499); + this.groupBoxShortcuts.TabIndex = 2; + this.groupBoxShortcuts.TabStop = false; + this.groupBoxShortcuts.Text = "Shortcuts"; + // + // buttonShortcutsClear + // + this.buttonShortcutsClear.Enabled = false; + this.buttonShortcutsClear.Location = new System.Drawing.Point(221, 18); + this.buttonShortcutsClear.Name = "buttonShortcutsClear"; + this.buttonShortcutsClear.Size = new System.Drawing.Size(111, 23); + this.buttonShortcutsClear.TabIndex = 38; + this.buttonShortcutsClear.Text = "Clear"; + this.buttonShortcutsClear.UseVisualStyleBackColor = true; + this.buttonShortcutsClear.Click += new System.EventHandler(this.buttonShortcutsClear_Click); + // + // labelShortcutsSearch + // + this.labelShortcutsSearch.AutoSize = true; + this.labelShortcutsSearch.Location = new System.Drawing.Point(18, 23); + this.labelShortcutsSearch.Name = "labelShortcutsSearch"; + this.labelShortcutsSearch.Size = new System.Drawing.Size(40, 13); + this.labelShortcutsSearch.TabIndex = 37; + this.labelShortcutsSearch.Text = "Search"; + // + // textBoxShortcutSearch + // + this.textBoxShortcutSearch.Location = new System.Drawing.Point(64, 20); + this.textBoxShortcutSearch.Name = "textBoxShortcutSearch"; + this.textBoxShortcutSearch.Size = new System.Drawing.Size(151, 21); + this.textBoxShortcutSearch.TabIndex = 36; + this.textBoxShortcutSearch.TextChanged += new System.EventHandler(this.textBoxShortcutSearch_TextChanged); + // + // buttonClearShortcut + // + this.buttonClearShortcut.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonClearShortcut.Enabled = false; + this.buttonClearShortcut.Location = new System.Drawing.Point(582, 470); + this.buttonClearShortcut.Name = "buttonClearShortcut"; + this.buttonClearShortcut.Size = new System.Drawing.Size(111, 23); + this.buttonClearShortcut.TabIndex = 6; + this.buttonClearShortcut.Text = "&Clear"; + this.buttonClearShortcut.UseVisualStyleBackColor = true; + this.buttonClearShortcut.Click += new System.EventHandler(this.buttonClearShortcut_Click); + // + // comboBoxShortcutKey + // + this.comboBoxShortcutKey.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.comboBoxShortcutKey.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxShortcutKey.Enabled = false; + this.comboBoxShortcutKey.FormattingEnabled = true; + this.comboBoxShortcutKey.Items.AddRange(new object[] { + "None", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "D0", + "D1", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "F1", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "F10", + "F11", + "F12", + "Delete", + "Down", + "Home", + "End", + "Escape", + "Insert", + "Left", + "Pause", + "Return", + "Right", + "Space", + "Tab", + "Up", + "Back", + "NumPad0", + "NumPad1", + "NumPad2", + "NumPad3", + "NumPad4", + "NumPad5", + "NumPad6", + "NumPad7", + "NumPad8", + "NumPad9", + "PageDown", + "PageUp", + "Sleep", + "Multiply", + "Add", + "Separator", + "Subtract", + "Decimal", + "Divide", + "CapsLock", + "NumLock", + "Scroll", + "VolumeMute", + "VolumeDown", + "VolumeUp", + "MediaNextTrack", + "MediaPreviousTrack", + "MediaStop", + "MediaPlayPause", + "LaunchMail", + "SelectMedia", + "LaunchApplication1", + "LaunchApplication2", + "Oem1", + "Oemplus", + "Oemcomma", + "OemMinus", + "OemPeriod", + "OemQuestion", + "OemSemicolon", + "Oemtilde", + "OemOpenBrackets", + "Oem5", + "Oem6", + "Oem7", + "Oem8", + "OemBackslash", + "ProcessKey", + "Packet", + "Attn", + "Crsel", + "Exsel", + "EraseEof", + "Play", + "Zoom", + "NoName", + "Pa1", + "OemClear", + "KeyCode", + "F13", + "F14", + "F15", + "F16", + "F17", + "F18", + "F19", + "F20", + "F21", + "F22", + "F23", + "F24"}); + this.comboBoxShortcutKey.Location = new System.Drawing.Point(353, 470); + this.comboBoxShortcutKey.Name = "comboBoxShortcutKey"; + this.comboBoxShortcutKey.Size = new System.Drawing.Size(92, 21); + this.comboBoxShortcutKey.TabIndex = 4; + this.comboBoxShortcutKey.SelectedIndexChanged += new System.EventHandler(this.ValidateShortcut); + this.comboBoxShortcutKey.KeyDown += new System.Windows.Forms.KeyEventHandler(this.comboBoxShortcutKey_KeyDown); + // + // labelShortcutKey + // + this.labelShortcutKey.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelShortcutKey.AutoSize = true; + this.labelShortcutKey.Location = new System.Drawing.Point(322, 472); + this.labelShortcutKey.Name = "labelShortcutKey"; + this.labelShortcutKey.Size = new System.Drawing.Size(25, 13); + this.labelShortcutKey.TabIndex = 35; + this.labelShortcutKey.Text = "Key"; + // + // checkBoxShortcutsShift + // + this.checkBoxShortcutsShift.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.checkBoxShortcutsShift.AutoSize = true; + this.checkBoxShortcutsShift.Enabled = false; + this.checkBoxShortcutsShift.Location = new System.Drawing.Point(245, 472); + this.checkBoxShortcutsShift.Name = "checkBoxShortcutsShift"; + this.checkBoxShortcutsShift.Size = new System.Drawing.Size(48, 17); + this.checkBoxShortcutsShift.TabIndex = 3; + this.checkBoxShortcutsShift.Text = "Shift"; + this.checkBoxShortcutsShift.UseVisualStyleBackColor = true; + this.checkBoxShortcutsShift.CheckedChanged += new System.EventHandler(this.ValidateShortcut); + // + // checkBoxShortcutsAlt + // + this.checkBoxShortcutsAlt.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.checkBoxShortcutsAlt.AutoSize = true; + this.checkBoxShortcutsAlt.Enabled = false; + this.checkBoxShortcutsAlt.Location = new System.Drawing.Point(176, 472); + this.checkBoxShortcutsAlt.Name = "checkBoxShortcutsAlt"; + this.checkBoxShortcutsAlt.Size = new System.Drawing.Size(39, 17); + this.checkBoxShortcutsAlt.TabIndex = 2; + this.checkBoxShortcutsAlt.Text = "Alt"; + this.checkBoxShortcutsAlt.UseVisualStyleBackColor = true; + this.checkBoxShortcutsAlt.CheckedChanged += new System.EventHandler(this.ValidateShortcut); + // + // checkBoxShortcutsControl + // + this.checkBoxShortcutsControl.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.checkBoxShortcutsControl.AutoSize = true; + this.checkBoxShortcutsControl.Enabled = false; + this.checkBoxShortcutsControl.Location = new System.Drawing.Point(89, 472); + this.checkBoxShortcutsControl.Name = "checkBoxShortcutsControl"; + this.checkBoxShortcutsControl.Size = new System.Drawing.Size(61, 17); + this.checkBoxShortcutsControl.TabIndex = 1; + this.checkBoxShortcutsControl.Text = "Control"; + this.checkBoxShortcutsControl.UseVisualStyleBackColor = true; + this.checkBoxShortcutsControl.CheckedChanged += new System.EventHandler(this.ValidateShortcut); + // + // buttonUpdateShortcut + // + this.buttonUpdateShortcut.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonUpdateShortcut.Enabled = false; + this.buttonUpdateShortcut.Location = new System.Drawing.Point(465, 470); + this.buttonUpdateShortcut.Name = "buttonUpdateShortcut"; + this.buttonUpdateShortcut.Size = new System.Drawing.Size(111, 23); + this.buttonUpdateShortcut.TabIndex = 5; + this.buttonUpdateShortcut.Text = "&Update"; + this.buttonUpdateShortcut.UseVisualStyleBackColor = true; + this.buttonUpdateShortcut.Click += new System.EventHandler(this.buttonUpdateShortcut_Click); + // + // treeViewShortcuts + // + this.treeViewShortcuts.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.treeViewShortcuts.ContextMenuStrip = this.contextMenuStripShortcuts; + this.treeViewShortcuts.HideSelection = false; + this.treeViewShortcuts.Location = new System.Drawing.Point(16, 47); + this.treeViewShortcuts.Name = "treeViewShortcuts"; + this.treeViewShortcuts.Size = new System.Drawing.Size(797, 417); + this.treeViewShortcuts.TabIndex = 0; + this.treeViewShortcuts.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeViewShortcuts_AfterSelect); + // + // contextMenuStripShortcuts + // + this.contextMenuStripShortcuts.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItemShortcutsCollapse, + this.toolStripSeparator1, + this.importShortcutsToolStripMenuItem, + this.exportShortcutsToolStripMenuItem}); + this.contextMenuStripShortcuts.Name = "contextMenuStripShortcuts"; + this.contextMenuStripShortcuts.Size = new System.Drawing.Size(120, 76); + // + // toolStripMenuItemShortcutsCollapse + // + this.toolStripMenuItemShortcutsCollapse.Name = "toolStripMenuItemShortcutsCollapse"; + this.toolStripMenuItemShortcutsCollapse.Size = new System.Drawing.Size(119, 22); + this.toolStripMenuItemShortcutsCollapse.Text = "Collapse"; + this.toolStripMenuItemShortcutsCollapse.Click += new System.EventHandler(this.toolStripMenuItemShortcutsCollapse_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(116, 6); + // + // importShortcutsToolStripMenuItem + // + this.importShortcutsToolStripMenuItem.Name = "importShortcutsToolStripMenuItem"; + this.importShortcutsToolStripMenuItem.Size = new System.Drawing.Size(119, 22); + this.importShortcutsToolStripMenuItem.Text = "Import..."; + this.importShortcutsToolStripMenuItem.Click += new System.EventHandler(this.importShortcutsToolStripMenuItem_Click); + // + // exportShortcutsToolStripMenuItem + // + this.exportShortcutsToolStripMenuItem.Name = "exportShortcutsToolStripMenuItem"; + this.exportShortcutsToolStripMenuItem.Size = new System.Drawing.Size(119, 22); + this.exportShortcutsToolStripMenuItem.Text = "Export..."; + this.exportShortcutsToolStripMenuItem.Click += new System.EventHandler(this.exportShortcutsToolStripMenuItem_Click); + // + // labelShortcut + // + this.labelShortcut.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelShortcut.AutoSize = true; + this.labelShortcut.Location = new System.Drawing.Point(15, 472); + this.labelShortcut.Name = "labelShortcut"; + this.labelShortcut.Size = new System.Drawing.Size(52, 13); + this.labelShortcut.TabIndex = 3; + this.labelShortcut.Text = "Shortcut:"; + // + // tabPageSyntaxColoring + // + this.tabPageSyntaxColoring.Controls.Add(this.groupBoxListViewSyntaxColoring); + this.tabPageSyntaxColoring.Location = new System.Drawing.Point(4, 22); + this.tabPageSyntaxColoring.Name = "tabPageSyntaxColoring"; + this.tabPageSyntaxColoring.Padding = new System.Windows.Forms.Padding(3); + this.tabPageSyntaxColoring.Size = new System.Drawing.Size(832, 520); + this.tabPageSyntaxColoring.TabIndex = 9; + this.tabPageSyntaxColoring.Text = "Syntax coloring"; + this.tabPageSyntaxColoring.UseVisualStyleBackColor = true; + // + // groupBoxListViewSyntaxColoring + // + this.groupBoxListViewSyntaxColoring.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxListViewSyntaxColoring.Controls.Add(this.buttonLineWidthSettings); + this.groupBoxListViewSyntaxColoring.Controls.Add(this.checkBoxSyntaxColorTextTooWide); + this.groupBoxListViewSyntaxColoring.Controls.Add(this.checkBoxSyntaxColorGapTooSmall); + this.groupBoxListViewSyntaxColoring.Controls.Add(this.checkBoxSyntaxColorTextMoreThanTwoLines); + this.groupBoxListViewSyntaxColoring.Controls.Add(this.checkBoxSyntaxOverlap); + this.groupBoxListViewSyntaxColoring.Controls.Add(this.checkBoxSyntaxColorDurationTooSmall); + this.groupBoxListViewSyntaxColoring.Controls.Add(this.buttonListViewSyntaxColorError); + this.groupBoxListViewSyntaxColoring.Controls.Add(this.checkBoxSyntaxColorTextTooLong); + this.groupBoxListViewSyntaxColoring.Controls.Add(this.checkBoxSyntaxColorDurationTooLarge); + this.groupBoxListViewSyntaxColoring.Controls.Add(this.panelListViewSyntaxColorError); + this.groupBoxListViewSyntaxColoring.Location = new System.Drawing.Point(6, 6); + this.groupBoxListViewSyntaxColoring.Name = "groupBoxListViewSyntaxColoring"; + this.groupBoxListViewSyntaxColoring.Size = new System.Drawing.Size(820, 523); + this.groupBoxListViewSyntaxColoring.TabIndex = 0; + this.groupBoxListViewSyntaxColoring.TabStop = false; + this.groupBoxListViewSyntaxColoring.Text = "List view syntax coloring"; + // + // buttonLineWidthSettings + // + this.buttonLineWidthSettings.Location = new System.Drawing.Point(160, 112); + this.buttonLineWidthSettings.Name = "buttonLineWidthSettings"; + this.buttonLineWidthSettings.Size = new System.Drawing.Size(112, 23); + this.buttonLineWidthSettings.TabIndex = 4; + this.buttonLineWidthSettings.Text = "Settings..."; + this.buttonLineWidthSettings.UseVisualStyleBackColor = true; + this.buttonLineWidthSettings.Click += new System.EventHandler(this.buttonLineWidthSettings_Click); + // + // checkBoxSyntaxColorTextTooWide + // + this.checkBoxSyntaxColorTextTooWide.AutoSize = true; + this.checkBoxSyntaxColorTextTooWide.Location = new System.Drawing.Point(20, 116); + this.checkBoxSyntaxColorTextTooWide.Name = "checkBoxSyntaxColorTextTooWide"; + this.checkBoxSyntaxColorTextTooWide.Size = new System.Drawing.Size(134, 17); + this.checkBoxSyntaxColorTextTooWide.TabIndex = 3; + this.checkBoxSyntaxColorTextTooWide.Text = "Text - color if too wide"; + this.checkBoxSyntaxColorTextTooWide.UseVisualStyleBackColor = true; + // + // checkBoxSyntaxColorGapTooSmall + // + this.checkBoxSyntaxColorGapTooSmall.AutoSize = true; + this.checkBoxSyntaxColorGapTooSmall.Location = new System.Drawing.Point(20, 209); + this.checkBoxSyntaxColorGapTooSmall.Name = "checkBoxSyntaxColorGapTooSmall"; + this.checkBoxSyntaxColorGapTooSmall.Size = new System.Drawing.Size(132, 17); + this.checkBoxSyntaxColorGapTooSmall.TabIndex = 7; + this.checkBoxSyntaxColorGapTooSmall.Text = "Gap - color if too small"; + this.checkBoxSyntaxColorGapTooSmall.UseVisualStyleBackColor = true; + // + // checkBoxSyntaxColorTextMoreThanTwoLines + // + this.checkBoxSyntaxColorTextMoreThanTwoLines.AutoSize = true; + this.checkBoxSyntaxColorTextMoreThanTwoLines.Location = new System.Drawing.Point(20, 139); + this.checkBoxSyntaxColorTextMoreThanTwoLines.Name = "checkBoxSyntaxColorTextMoreThanTwoLines"; + this.checkBoxSyntaxColorTextMoreThanTwoLines.Size = new System.Drawing.Size(170, 17); + this.checkBoxSyntaxColorTextMoreThanTwoLines.TabIndex = 5; + this.checkBoxSyntaxColorTextMoreThanTwoLines.Text = "Text - color if more than lines:"; + this.checkBoxSyntaxColorTextMoreThanTwoLines.UseVisualStyleBackColor = true; + // + // checkBoxSyntaxOverlap + // + this.checkBoxSyntaxOverlap.AutoSize = true; + this.checkBoxSyntaxOverlap.Location = new System.Drawing.Point(20, 174); + this.checkBoxSyntaxOverlap.Name = "checkBoxSyntaxOverlap"; + this.checkBoxSyntaxOverlap.Size = new System.Drawing.Size(129, 17); + this.checkBoxSyntaxOverlap.TabIndex = 6; + this.checkBoxSyntaxOverlap.Text = "Time - color if overlap"; + this.checkBoxSyntaxOverlap.UseVisualStyleBackColor = true; + // + // checkBoxSyntaxColorDurationTooSmall + // + this.checkBoxSyntaxColorDurationTooSmall.AutoSize = true; + this.checkBoxSyntaxColorDurationTooSmall.Location = new System.Drawing.Point(20, 35); + this.checkBoxSyntaxColorDurationTooSmall.Name = "checkBoxSyntaxColorDurationTooSmall"; + this.checkBoxSyntaxColorDurationTooSmall.Size = new System.Drawing.Size(154, 17); + this.checkBoxSyntaxColorDurationTooSmall.TabIndex = 0; + this.checkBoxSyntaxColorDurationTooSmall.Text = "Duration - color if too small"; + this.checkBoxSyntaxColorDurationTooSmall.UseVisualStyleBackColor = true; + // + // buttonListViewSyntaxColorError + // + this.buttonListViewSyntaxColorError.Location = new System.Drawing.Point(20, 247); + this.buttonListViewSyntaxColorError.Name = "buttonListViewSyntaxColorError"; + this.buttonListViewSyntaxColorError.Size = new System.Drawing.Size(112, 23); + this.buttonListViewSyntaxColorError.TabIndex = 8; + this.buttonListViewSyntaxColorError.Text = "Error color"; + this.buttonListViewSyntaxColorError.UseVisualStyleBackColor = true; + this.buttonListViewSyntaxColorError.Click += new System.EventHandler(this.buttonListViewSyntaxColorError_Click); + // + // checkBoxSyntaxColorTextTooLong + // + this.checkBoxSyntaxColorTextTooLong.AutoSize = true; + this.checkBoxSyntaxColorTextTooLong.Location = new System.Drawing.Point(20, 93); + this.checkBoxSyntaxColorTextTooLong.Name = "checkBoxSyntaxColorTextTooLong"; + this.checkBoxSyntaxColorTextTooLong.Size = new System.Drawing.Size(132, 17); + this.checkBoxSyntaxColorTextTooLong.TabIndex = 2; + this.checkBoxSyntaxColorTextTooLong.Text = "Text - color if too long"; + this.checkBoxSyntaxColorTextTooLong.UseVisualStyleBackColor = true; + // + // checkBoxSyntaxColorDurationTooLarge + // + this.checkBoxSyntaxColorDurationTooLarge.AutoSize = true; + this.checkBoxSyntaxColorDurationTooLarge.Location = new System.Drawing.Point(20, 58); + this.checkBoxSyntaxColorDurationTooLarge.Name = "checkBoxSyntaxColorDurationTooLarge"; + this.checkBoxSyntaxColorDurationTooLarge.Size = new System.Drawing.Size(155, 17); + this.checkBoxSyntaxColorDurationTooLarge.TabIndex = 1; + this.checkBoxSyntaxColorDurationTooLarge.Text = "Duration - color if too large"; + this.checkBoxSyntaxColorDurationTooLarge.UseVisualStyleBackColor = true; + // + // panelListViewSyntaxColorError + // + this.panelListViewSyntaxColorError.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelListViewSyntaxColorError.Location = new System.Drawing.Point(142, 247); + this.panelListViewSyntaxColorError.Name = "panelListViewSyntaxColorError"; + this.panelListViewSyntaxColorError.Size = new System.Drawing.Size(21, 20); + this.panelListViewSyntaxColorError.TabIndex = 8; + this.panelListViewSyntaxColorError.Click += new System.EventHandler(this.buttonListViewSyntaxColorError_Click); + // + // tabPageVideoPlayer + // + this.tabPageVideoPlayer.Controls.Add(this.groupBoxMainWindowVideoControls); + this.tabPageVideoPlayer.Controls.Add(this.groupBoxVideoPlayerDefault); + this.tabPageVideoPlayer.Controls.Add(this.groupBoxVideoEngine); + this.tabPageVideoPlayer.Location = new System.Drawing.Point(4, 22); + this.tabPageVideoPlayer.Name = "tabPageVideoPlayer"; + this.tabPageVideoPlayer.Padding = new System.Windows.Forms.Padding(3); + this.tabPageVideoPlayer.Size = new System.Drawing.Size(832, 520); + this.tabPageVideoPlayer.TabIndex = 2; + this.tabPageVideoPlayer.Text = "Video player"; + this.tabPageVideoPlayer.UseVisualStyleBackColor = true; + // + // groupBoxMainWindowVideoControls + // + this.groupBoxMainWindowVideoControls.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxMainWindowVideoControls.Controls.Add(this.labelCustomSearch5); + this.groupBoxMainWindowVideoControls.Controls.Add(this.textBoxCustomSearchUrl5); + this.groupBoxMainWindowVideoControls.Controls.Add(this.comboBoxCustomSearch5); + this.groupBoxMainWindowVideoControls.Controls.Add(this.labelCustomSearch4); + this.groupBoxMainWindowVideoControls.Controls.Add(this.textBoxCustomSearchUrl4); + this.groupBoxMainWindowVideoControls.Controls.Add(this.comboBoxCustomSearch4); + this.groupBoxMainWindowVideoControls.Controls.Add(this.labelCustomSearch3); + this.groupBoxMainWindowVideoControls.Controls.Add(this.textBoxCustomSearchUrl3); + this.groupBoxMainWindowVideoControls.Controls.Add(this.comboBoxCustomSearch3); + this.groupBoxMainWindowVideoControls.Controls.Add(this.labelCustomSearch2); + this.groupBoxMainWindowVideoControls.Controls.Add(this.textBoxCustomSearchUrl2); + this.groupBoxMainWindowVideoControls.Controls.Add(this.comboBoxCustomSearch2); + this.groupBoxMainWindowVideoControls.Controls.Add(this.labelCustomSearch1); + this.groupBoxMainWindowVideoControls.Controls.Add(this.textBoxCustomSearchUrl1); + this.groupBoxMainWindowVideoControls.Controls.Add(this.labelCustomSearch); + this.groupBoxMainWindowVideoControls.Controls.Add(this.comboBoxCustomSearch1); + this.groupBoxMainWindowVideoControls.Location = new System.Drawing.Point(7, 281); + this.groupBoxMainWindowVideoControls.Name = "groupBoxMainWindowVideoControls"; + this.groupBoxMainWindowVideoControls.Size = new System.Drawing.Size(819, 233); + this.groupBoxMainWindowVideoControls.TabIndex = 15; + this.groupBoxMainWindowVideoControls.TabStop = false; + this.groupBoxMainWindowVideoControls.Text = "Main window video controls"; + // + // labelCustomSearch5 + // + this.labelCustomSearch5.AutoSize = true; + this.labelCustomSearch5.Location = new System.Drawing.Point(12, 149); + this.labelCustomSearch5.Name = "labelCustomSearch5"; + this.labelCustomSearch5.Size = new System.Drawing.Size(13, 13); + this.labelCustomSearch5.TabIndex = 15; + this.labelCustomSearch5.Text = "5"; + // + // textBoxCustomSearchUrl5 + // + this.textBoxCustomSearchUrl5.Location = new System.Drawing.Point(185, 146); + this.textBoxCustomSearchUrl5.Name = "textBoxCustomSearchUrl5"; + this.textBoxCustomSearchUrl5.Size = new System.Drawing.Size(574, 21); + this.textBoxCustomSearchUrl5.TabIndex = 14; + // + // comboBoxCustomSearch5 + // + this.comboBoxCustomSearch5.FormattingEnabled = true; + this.comboBoxCustomSearch5.Items.AddRange(new object[] { + "Dictionary.com", + "learnersdictionary.com", + "Merriam-Webster", + "The Free Dictionary", + "Thesaurus.com", + "urbandictionary.com", + "VISUWORDS", + "Wikipedia"}); + this.comboBoxCustomSearch5.Location = new System.Drawing.Point(31, 146); + this.comboBoxCustomSearch5.Name = "comboBoxCustomSearch5"; + this.comboBoxCustomSearch5.Size = new System.Drawing.Size(148, 21); + this.comboBoxCustomSearch5.TabIndex = 13; + this.comboBoxCustomSearch5.SelectedIndexChanged += new System.EventHandler(this.comboBoxCustomSearch_SelectedIndexChanged); + // + // labelCustomSearch4 + // + this.labelCustomSearch4.AutoSize = true; + this.labelCustomSearch4.Location = new System.Drawing.Point(12, 122); + this.labelCustomSearch4.Name = "labelCustomSearch4"; + this.labelCustomSearch4.Size = new System.Drawing.Size(13, 13); + this.labelCustomSearch4.TabIndex = 12; + this.labelCustomSearch4.Text = "4"; + // + // textBoxCustomSearchUrl4 + // + this.textBoxCustomSearchUrl4.Location = new System.Drawing.Point(185, 119); + this.textBoxCustomSearchUrl4.Name = "textBoxCustomSearchUrl4"; + this.textBoxCustomSearchUrl4.Size = new System.Drawing.Size(574, 21); + this.textBoxCustomSearchUrl4.TabIndex = 11; + // + // comboBoxCustomSearch4 + // + this.comboBoxCustomSearch4.FormattingEnabled = true; + this.comboBoxCustomSearch4.Items.AddRange(new object[] { + "Dictionary.com", + "learnersdictionary.com", + "Merriam-Webster", + "The Free Dictionary", + "Thesaurus.com", + "urbandictionary.com", + "VISUWORDS", + "Wikipedia"}); + this.comboBoxCustomSearch4.Location = new System.Drawing.Point(31, 119); + this.comboBoxCustomSearch4.Name = "comboBoxCustomSearch4"; + this.comboBoxCustomSearch4.Size = new System.Drawing.Size(148, 21); + this.comboBoxCustomSearch4.TabIndex = 10; + this.comboBoxCustomSearch4.SelectedIndexChanged += new System.EventHandler(this.comboBoxCustomSearch_SelectedIndexChanged); + // + // labelCustomSearch3 + // + this.labelCustomSearch3.AutoSize = true; + this.labelCustomSearch3.Location = new System.Drawing.Point(12, 95); + this.labelCustomSearch3.Name = "labelCustomSearch3"; + this.labelCustomSearch3.Size = new System.Drawing.Size(13, 13); + this.labelCustomSearch3.TabIndex = 9; + this.labelCustomSearch3.Text = "3"; + // + // textBoxCustomSearchUrl3 + // + this.textBoxCustomSearchUrl3.Location = new System.Drawing.Point(185, 92); + this.textBoxCustomSearchUrl3.Name = "textBoxCustomSearchUrl3"; + this.textBoxCustomSearchUrl3.Size = new System.Drawing.Size(574, 21); + this.textBoxCustomSearchUrl3.TabIndex = 8; + // + // comboBoxCustomSearch3 + // + this.comboBoxCustomSearch3.FormattingEnabled = true; + this.comboBoxCustomSearch3.Items.AddRange(new object[] { + "Dictionary.com", + "learnersdictionary.com", + "Merriam-Webster", + "The Free Dictionary", + "Thesaurus.com", + "urbandictionary.com", + "VISUWORDS", + "Wikipedia"}); + this.comboBoxCustomSearch3.Location = new System.Drawing.Point(31, 92); + this.comboBoxCustomSearch3.Name = "comboBoxCustomSearch3"; + this.comboBoxCustomSearch3.Size = new System.Drawing.Size(148, 21); + this.comboBoxCustomSearch3.TabIndex = 7; + this.comboBoxCustomSearch3.SelectedIndexChanged += new System.EventHandler(this.comboBoxCustomSearch_SelectedIndexChanged); + // + // labelCustomSearch2 + // + this.labelCustomSearch2.AutoSize = true; + this.labelCustomSearch2.Location = new System.Drawing.Point(12, 68); + this.labelCustomSearch2.Name = "labelCustomSearch2"; + this.labelCustomSearch2.Size = new System.Drawing.Size(13, 13); + this.labelCustomSearch2.TabIndex = 6; + this.labelCustomSearch2.Text = "2"; + // + // textBoxCustomSearchUrl2 + // + this.textBoxCustomSearchUrl2.Location = new System.Drawing.Point(185, 65); + this.textBoxCustomSearchUrl2.Name = "textBoxCustomSearchUrl2"; + this.textBoxCustomSearchUrl2.Size = new System.Drawing.Size(574, 21); + this.textBoxCustomSearchUrl2.TabIndex = 5; + // + // comboBoxCustomSearch2 + // + this.comboBoxCustomSearch2.FormattingEnabled = true; + this.comboBoxCustomSearch2.Items.AddRange(new object[] { + "Dictionary.com", + "learnersdictionary.com", + "Merriam-Webster", + "The Free Dictionary", + "Thesaurus.com", + "urbandictionary.com", + "VISUWORDS", + "Wikipedia"}); + this.comboBoxCustomSearch2.Location = new System.Drawing.Point(31, 65); + this.comboBoxCustomSearch2.Name = "comboBoxCustomSearch2"; + this.comboBoxCustomSearch2.Size = new System.Drawing.Size(148, 21); + this.comboBoxCustomSearch2.TabIndex = 4; + this.comboBoxCustomSearch2.SelectedIndexChanged += new System.EventHandler(this.comboBoxCustomSearch_SelectedIndexChanged); + // + // labelCustomSearch1 + // + this.labelCustomSearch1.AutoSize = true; + this.labelCustomSearch1.Location = new System.Drawing.Point(12, 41); + this.labelCustomSearch1.Name = "labelCustomSearch1"; + this.labelCustomSearch1.Size = new System.Drawing.Size(13, 13); + this.labelCustomSearch1.TabIndex = 3; + this.labelCustomSearch1.Text = "1"; + // + // textBoxCustomSearchUrl1 + // + this.textBoxCustomSearchUrl1.Location = new System.Drawing.Point(185, 38); + this.textBoxCustomSearchUrl1.Name = "textBoxCustomSearchUrl1"; + this.textBoxCustomSearchUrl1.Size = new System.Drawing.Size(574, 21); + this.textBoxCustomSearchUrl1.TabIndex = 2; + // + // labelCustomSearch + // + this.labelCustomSearch.AutoSize = true; + this.labelCustomSearch.Location = new System.Drawing.Point(12, 20); + this.labelCustomSearch.Name = "labelCustomSearch"; + this.labelCustomSearch.Size = new System.Drawing.Size(144, 13); + this.labelCustomSearch.TabIndex = 1; + this.labelCustomSearch.Text = "Custom search text and URL"; + // + // comboBoxCustomSearch1 + // + this.comboBoxCustomSearch1.FormattingEnabled = true; + this.comboBoxCustomSearch1.Items.AddRange(new object[] { + "Dictionary.com", + "learnersdictionary.com", + "Merriam-Webster", + "The Free Dictionary", + "Thesaurus.com", + "urbandictionary.com", + "VISUWORDS", + "Wikipedia"}); + this.comboBoxCustomSearch1.Location = new System.Drawing.Point(31, 38); + this.comboBoxCustomSearch1.Name = "comboBoxCustomSearch1"; + this.comboBoxCustomSearch1.Size = new System.Drawing.Size(148, 21); + this.comboBoxCustomSearch1.TabIndex = 0; + this.comboBoxCustomSearch1.SelectedIndexChanged += new System.EventHandler(this.comboBoxCustomSearch_SelectedIndexChanged); + // + // groupBoxVideoPlayerDefault + // + this.groupBoxVideoPlayerDefault.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxVideoPlayerDefault.Controls.Add(this.checkBoxAllowVolumeBoost); + this.groupBoxVideoPlayerDefault.Controls.Add(this.checkBoxVideoAutoOpen); + this.groupBoxVideoPlayerDefault.Controls.Add(this.checkBoxVideoPlayerPreviewFontBold); + this.groupBoxVideoPlayerDefault.Controls.Add(this.checkBoxVideoPlayerShowFullscreenButton); + this.groupBoxVideoPlayerDefault.Controls.Add(this.checkBoxVideoPlayerShowMuteButton); + this.groupBoxVideoPlayerDefault.Controls.Add(this.labelVideoPlayerPreviewFontSize); + this.groupBoxVideoPlayerDefault.Controls.Add(this.comboBoxlVideoPlayerPreviewFontSize); + this.groupBoxVideoPlayerDefault.Controls.Add(this.checkBoxVideoPlayerShowStopButton); + this.groupBoxVideoPlayerDefault.Location = new System.Drawing.Point(7, 155); + this.groupBoxVideoPlayerDefault.Name = "groupBoxVideoPlayerDefault"; + this.groupBoxVideoPlayerDefault.Size = new System.Drawing.Size(819, 120); + this.groupBoxVideoPlayerDefault.TabIndex = 14; + this.groupBoxVideoPlayerDefault.TabStop = false; + // + // checkBoxAllowVolumeBoost + // + this.checkBoxAllowVolumeBoost.AutoSize = true; + this.checkBoxAllowVolumeBoost.Location = new System.Drawing.Point(334, 97); + this.checkBoxAllowVolumeBoost.Name = "checkBoxAllowVolumeBoost"; + this.checkBoxAllowVolumeBoost.Size = new System.Drawing.Size(118, 17); + this.checkBoxAllowVolumeBoost.TabIndex = 25; + this.checkBoxAllowVolumeBoost.Text = "Allow volume boost"; + this.checkBoxAllowVolumeBoost.UseVisualStyleBackColor = true; + // + // checkBoxVideoAutoOpen + // + this.checkBoxVideoAutoOpen.AutoSize = true; + this.checkBoxVideoAutoOpen.Location = new System.Drawing.Point(334, 74); + this.checkBoxVideoAutoOpen.Name = "checkBoxVideoAutoOpen"; + this.checkBoxVideoAutoOpen.Size = new System.Drawing.Size(213, 17); + this.checkBoxVideoAutoOpen.TabIndex = 24; + this.checkBoxVideoAutoOpen.Text = "Auto open video when opening subtitle"; + this.checkBoxVideoAutoOpen.UseVisualStyleBackColor = true; + // + // checkBoxVideoPlayerPreviewFontBold + // + this.checkBoxVideoPlayerPreviewFontBold.AutoSize = true; + this.checkBoxVideoPlayerPreviewFontBold.Location = new System.Drawing.Point(465, 45); + this.checkBoxVideoPlayerPreviewFontBold.Name = "checkBoxVideoPlayerPreviewFontBold"; + this.checkBoxVideoPlayerPreviewFontBold.Size = new System.Drawing.Size(46, 17); + this.checkBoxVideoPlayerPreviewFontBold.TabIndex = 23; + this.checkBoxVideoPlayerPreviewFontBold.Text = "Bold"; + this.checkBoxVideoPlayerPreviewFontBold.UseVisualStyleBackColor = true; + // + // checkBoxVideoPlayerShowFullscreenButton + // + this.checkBoxVideoPlayerShowFullscreenButton.AutoSize = true; + this.checkBoxVideoPlayerShowFullscreenButton.Location = new System.Drawing.Point(9, 65); + this.checkBoxVideoPlayerShowFullscreenButton.Name = "checkBoxVideoPlayerShowFullscreenButton"; + this.checkBoxVideoPlayerShowFullscreenButton.Size = new System.Drawing.Size(136, 17); + this.checkBoxVideoPlayerShowFullscreenButton.TabIndex = 12; + this.checkBoxVideoPlayerShowFullscreenButton.Text = "Show fullscreen button"; + this.checkBoxVideoPlayerShowFullscreenButton.UseVisualStyleBackColor = true; + // + // checkBoxVideoPlayerShowMuteButton + // + this.checkBoxVideoPlayerShowMuteButton.AutoSize = true; + this.checkBoxVideoPlayerShowMuteButton.Location = new System.Drawing.Point(9, 42); + this.checkBoxVideoPlayerShowMuteButton.Name = "checkBoxVideoPlayerShowMuteButton"; + this.checkBoxVideoPlayerShowMuteButton.Size = new System.Drawing.Size(114, 17); + this.checkBoxVideoPlayerShowMuteButton.TabIndex = 11; + this.checkBoxVideoPlayerShowMuteButton.Text = "Show mute button"; + this.checkBoxVideoPlayerShowMuteButton.UseVisualStyleBackColor = true; + // + // labelVideoPlayerPreviewFontSize + // + this.labelVideoPlayerPreviewFontSize.AutoSize = true; + this.labelVideoPlayerPreviewFontSize.Location = new System.Drawing.Point(331, 21); + this.labelVideoPlayerPreviewFontSize.Name = "labelVideoPlayerPreviewFontSize"; + this.labelVideoPlayerPreviewFontSize.Size = new System.Drawing.Size(128, 13); + this.labelVideoPlayerPreviewFontSize.TabIndex = 14; + this.labelVideoPlayerPreviewFontSize.Text = "Subtitle preview font size"; + // + // comboBoxlVideoPlayerPreviewFontSize + // + this.comboBoxlVideoPlayerPreviewFontSize.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxlVideoPlayerPreviewFontSize.FormattingEnabled = true; + this.comboBoxlVideoPlayerPreviewFontSize.Items.AddRange(new object[] { + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15", + "16", + "17", + "18", + "19", + "20", + "21", + "22", + "23", + "24", + "25", + "26", + "27", + "28", + "29", + "30"}); + this.comboBoxlVideoPlayerPreviewFontSize.Location = new System.Drawing.Point(465, 18); + this.comboBoxlVideoPlayerPreviewFontSize.Name = "comboBoxlVideoPlayerPreviewFontSize"; + this.comboBoxlVideoPlayerPreviewFontSize.Size = new System.Drawing.Size(121, 21); + this.comboBoxlVideoPlayerPreviewFontSize.TabIndex = 13; + // + // checkBoxVideoPlayerShowStopButton + // + this.checkBoxVideoPlayerShowStopButton.AutoSize = true; + this.checkBoxVideoPlayerShowStopButton.Location = new System.Drawing.Point(9, 19); + this.checkBoxVideoPlayerShowStopButton.Name = "checkBoxVideoPlayerShowStopButton"; + this.checkBoxVideoPlayerShowStopButton.Size = new System.Drawing.Size(111, 17); + this.checkBoxVideoPlayerShowStopButton.TabIndex = 10; + this.checkBoxVideoPlayerShowStopButton.Text = "Show stop button"; + this.checkBoxVideoPlayerShowStopButton.UseVisualStyleBackColor = true; + // + // groupBoxVideoEngine + // + this.groupBoxVideoEngine.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxVideoEngine.Controls.Add(this.checkBoxMpvHandlesPreviewText); + this.groupBoxVideoEngine.Controls.Add(this.labelMpvSettings); + this.groupBoxVideoEngine.Controls.Add(this.buttonMpvSettings); + this.groupBoxVideoEngine.Controls.Add(this.labelPlatform); + this.groupBoxVideoEngine.Controls.Add(this.buttonVlcPathBrowse); + this.groupBoxVideoEngine.Controls.Add(this.textBoxVlcPath); + this.groupBoxVideoEngine.Controls.Add(this.labelVlcPath); + this.groupBoxVideoEngine.Controls.Add(this.labelVideoPlayerVLC); + this.groupBoxVideoEngine.Controls.Add(this.radioButtonVideoPlayerVLC); + this.groupBoxVideoEngine.Controls.Add(this.labelVideoPlayerMPlayer); + this.groupBoxVideoEngine.Controls.Add(this.labelDirectShowDescription); + this.groupBoxVideoEngine.Controls.Add(this.labelMpcHcDescription); + this.groupBoxVideoEngine.Controls.Add(this.radioButtonVideoPlayerMPV); + this.groupBoxVideoEngine.Controls.Add(this.radioButtonVideoPlayerDirectShow); + this.groupBoxVideoEngine.Controls.Add(this.radioButtonVideoPlayerMpcHc); + this.groupBoxVideoEngine.Location = new System.Drawing.Point(6, 6); + this.groupBoxVideoEngine.Name = "groupBoxVideoEngine"; + this.groupBoxVideoEngine.Size = new System.Drawing.Size(820, 143); + this.groupBoxVideoEngine.TabIndex = 0; + this.groupBoxVideoEngine.TabStop = false; + this.groupBoxVideoEngine.Text = "Video engine"; + // + // checkBoxMpvHandlesPreviewText + // + this.checkBoxMpvHandlesPreviewText.AutoSize = true; + this.checkBoxMpvHandlesPreviewText.Location = new System.Drawing.Point(169, 111); + this.checkBoxMpvHandlesPreviewText.Name = "checkBoxMpvHandlesPreviewText"; + this.checkBoxMpvHandlesPreviewText.Size = new System.Drawing.Size(150, 17); + this.checkBoxMpvHandlesPreviewText.TabIndex = 31; + this.checkBoxMpvHandlesPreviewText.Text = "mpv handles preview text"; + this.checkBoxMpvHandlesPreviewText.UseVisualStyleBackColor = true; + // + // labelMpvSettings + // + this.labelMpvSettings.AutoSize = true; + this.labelMpvSettings.Font = new System.Drawing.Font("Tahoma", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelMpvSettings.ForeColor = System.Drawing.Color.Gray; + this.labelMpvSettings.Location = new System.Drawing.Point(709, 93); + this.labelMpvSettings.Name = "labelMpvSettings"; + this.labelMpvSettings.Size = new System.Drawing.Size(40, 13); + this.labelMpvSettings.TabIndex = 30; + this.labelMpvSettings.Text = "--vo=?"; + // + // buttonMpvSettings + // + this.buttonMpvSettings.Location = new System.Drawing.Point(510, 89); + this.buttonMpvSettings.Name = "buttonMpvSettings"; + this.buttonMpvSettings.Size = new System.Drawing.Size(179, 23); + this.buttonMpvSettings.TabIndex = 29; + this.buttonMpvSettings.Text = "Download mpv dll"; + this.buttonMpvSettings.UseVisualStyleBackColor = true; + this.buttonMpvSettings.Click += new System.EventHandler(this.buttonMpvSettings_Click); + // + // labelPlatform + // + this.labelPlatform.Font = new System.Drawing.Font("Tahoma", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelPlatform.ForeColor = System.Drawing.Color.Gray; + this.labelPlatform.Location = new System.Drawing.Point(724, 13); + this.labelPlatform.Name = "labelPlatform"; + this.labelPlatform.Size = new System.Drawing.Size(83, 11); + this.labelPlatform.TabIndex = 27; + this.labelPlatform.Text = "x-bit"; + this.labelPlatform.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // buttonVlcPathBrowse + // + this.buttonVlcPathBrowse.Location = new System.Drawing.Point(778, 44); + this.buttonVlcPathBrowse.Name = "buttonVlcPathBrowse"; + this.buttonVlcPathBrowse.Size = new System.Drawing.Size(29, 21); + this.buttonVlcPathBrowse.TabIndex = 26; + this.buttonVlcPathBrowse.Text = "..."; + this.buttonVlcPathBrowse.UseVisualStyleBackColor = true; + this.buttonVlcPathBrowse.Click += new System.EventHandler(this.buttonVlcPathBrowse_Click); + // + // textBoxVlcPath + // + this.textBoxVlcPath.Location = new System.Drawing.Point(410, 45); + this.textBoxVlcPath.MaxLength = 1000; + this.textBoxVlcPath.Name = "textBoxVlcPath"; + this.textBoxVlcPath.Size = new System.Drawing.Size(362, 21); + this.textBoxVlcPath.TabIndex = 25; + this.textBoxVlcPath.MouseLeave += new System.EventHandler(this.textBoxVlcPath_MouseLeave); + // + // labelVlcPath + // + this.labelVlcPath.AutoSize = true; + this.labelVlcPath.Location = new System.Drawing.Point(379, 29); + this.labelVlcPath.Name = "labelVlcPath"; + this.labelVlcPath.Size = new System.Drawing.Size(315, 13); + this.labelVlcPath.TabIndex = 24; + this.labelVlcPath.Text = "VLC path (only needed if you using the portable version of VLC)"; + // + // labelVideoPlayerVLC + // + this.labelVideoPlayerVLC.AutoSize = true; + this.labelVideoPlayerVLC.Font = new System.Drawing.Font("Tahoma", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelVideoPlayerVLC.ForeColor = System.Drawing.Color.Gray; + this.labelVideoPlayerVLC.Location = new System.Drawing.Point(167, 49); + this.labelVideoPlayerVLC.Name = "labelVideoPlayerVLC"; + this.labelVideoPlayerVLC.Size = new System.Drawing.Size(237, 13); + this.labelVideoPlayerVLC.TabIndex = 13; + this.labelVideoPlayerVLC.Text = "libvlc.dll from VLC media player (1.1.0 or newer)"; + // + // radioButtonVideoPlayerVLC + // + this.radioButtonVideoPlayerVLC.AutoSize = true; + this.radioButtonVideoPlayerVLC.Location = new System.Drawing.Point(10, 46); + this.radioButtonVideoPlayerVLC.Name = "radioButtonVideoPlayerVLC"; + this.radioButtonVideoPlayerVLC.Size = new System.Drawing.Size(43, 17); + this.radioButtonVideoPlayerVLC.TabIndex = 4; + this.radioButtonVideoPlayerVLC.TabStop = true; + this.radioButtonVideoPlayerVLC.Text = "VLC"; + this.radioButtonVideoPlayerVLC.UseVisualStyleBackColor = true; + // + // labelVideoPlayerMPlayer + // + this.labelVideoPlayerMPlayer.AutoSize = true; + this.labelVideoPlayerMPlayer.Font = new System.Drawing.Font("Tahoma", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelVideoPlayerMPlayer.ForeColor = System.Drawing.Color.Gray; + this.labelVideoPlayerMPlayer.Location = new System.Drawing.Point(167, 93); + this.labelVideoPlayerMPlayer.Name = "labelVideoPlayerMPlayer"; + this.labelVideoPlayerMPlayer.Size = new System.Drawing.Size(337, 13); + this.labelVideoPlayerMPlayer.TabIndex = 11; + this.labelVideoPlayerMPlayer.Text = "https://mpv.io/ - free, open source, and cross-platform media player"; + // + // labelDirectShowDescription + // + this.labelDirectShowDescription.AutoSize = true; + this.labelDirectShowDescription.Font = new System.Drawing.Font("Tahoma", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelDirectShowDescription.ForeColor = System.Drawing.Color.Gray; + this.labelDirectShowDescription.Location = new System.Drawing.Point(167, 26); + this.labelDirectShowDescription.Name = "labelDirectShowDescription"; + this.labelDirectShowDescription.Size = new System.Drawing.Size(114, 13); + this.labelDirectShowDescription.TabIndex = 10; + this.labelDirectShowDescription.Text = "Quartz.dll in system32"; + // + // labelMpcHcDescription + // + this.labelMpcHcDescription.AutoSize = true; + this.labelMpcHcDescription.Font = new System.Drawing.Font("Tahoma", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelMpcHcDescription.ForeColor = System.Drawing.Color.Gray; + this.labelMpcHcDescription.Location = new System.Drawing.Point(167, 70); + this.labelMpcHcDescription.Name = "labelMpcHcDescription"; + this.labelMpcHcDescription.Size = new System.Drawing.Size(178, 13); + this.labelMpcHcDescription.TabIndex = 9; + this.labelMpcHcDescription.Text = "Media Player Classic - Home Cinema"; + // + // radioButtonVideoPlayerMPV + // + this.radioButtonVideoPlayerMPV.AutoSize = true; + this.radioButtonVideoPlayerMPV.Location = new System.Drawing.Point(10, 89); + this.radioButtonVideoPlayerMPV.Name = "radioButtonVideoPlayerMPV"; + this.radioButtonVideoPlayerMPV.Size = new System.Drawing.Size(45, 17); + this.radioButtonVideoPlayerMPV.TabIndex = 28; + this.radioButtonVideoPlayerMPV.TabStop = true; + this.radioButtonVideoPlayerMPV.Text = "mpv"; + this.radioButtonVideoPlayerMPV.UseVisualStyleBackColor = true; + this.radioButtonVideoPlayerMPV.CheckedChanged += new System.EventHandler(this.radioButtonVideoPlayerMPV_CheckedChanged); + // + // radioButtonVideoPlayerDirectShow + // + this.radioButtonVideoPlayerDirectShow.AutoSize = true; + this.radioButtonVideoPlayerDirectShow.Location = new System.Drawing.Point(10, 23); + this.radioButtonVideoPlayerDirectShow.Name = "radioButtonVideoPlayerDirectShow"; + this.radioButtonVideoPlayerDirectShow.Size = new System.Drawing.Size(82, 17); + this.radioButtonVideoPlayerDirectShow.TabIndex = 1; + this.radioButtonVideoPlayerDirectShow.TabStop = true; + this.radioButtonVideoPlayerDirectShow.Text = "DirectShow "; + this.radioButtonVideoPlayerDirectShow.UseVisualStyleBackColor = true; + // + // radioButtonVideoPlayerMpcHc + // + this.radioButtonVideoPlayerMpcHc.AutoSize = true; + this.radioButtonVideoPlayerMpcHc.Location = new System.Drawing.Point(10, 66); + this.radioButtonVideoPlayerMpcHc.Name = "radioButtonVideoPlayerMpcHc"; + this.radioButtonVideoPlayerMpcHc.Size = new System.Drawing.Size(64, 17); + this.radioButtonVideoPlayerMpcHc.TabIndex = 27; + this.radioButtonVideoPlayerMpcHc.TabStop = true; + this.radioButtonVideoPlayerMpcHc.Text = "MPC-HC"; + this.radioButtonVideoPlayerMpcHc.UseVisualStyleBackColor = true; + // + // tabPageWaveform + // + this.tabPageWaveform.Controls.Add(this.groupBoxFfmpeg); + this.tabPageWaveform.Controls.Add(this.groupBoxSpectrogram); + this.tabPageWaveform.Controls.Add(this.groupBox1); + this.tabPageWaveform.Controls.Add(this.groupBoxWaveformAppearence); + this.tabPageWaveform.Location = new System.Drawing.Point(4, 22); + this.tabPageWaveform.Name = "tabPageWaveform"; + this.tabPageWaveform.Size = new System.Drawing.Size(832, 520); + this.tabPageWaveform.TabIndex = 6; + this.tabPageWaveform.Text = "Waveform/spectrogram"; + this.tabPageWaveform.UseVisualStyleBackColor = true; + // + // groupBoxFfmpeg + // + this.groupBoxFfmpeg.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxFfmpeg.Controls.Add(this.buttonDownloadFfmpeg); + this.groupBoxFfmpeg.Controls.Add(this.buttonBrowseToFFmpeg); + this.groupBoxFfmpeg.Controls.Add(this.textBoxFFmpegPath); + this.groupBoxFfmpeg.Controls.Add(this.labelFFmpegPath); + this.groupBoxFfmpeg.Controls.Add(this.checkBoxUseFFmpeg); + this.groupBoxFfmpeg.Location = new System.Drawing.Point(406, 299); + this.groupBoxFfmpeg.Name = "groupBoxFfmpeg"; + this.groupBoxFfmpeg.Size = new System.Drawing.Size(419, 118); + this.groupBoxFfmpeg.TabIndex = 2; + this.groupBoxFfmpeg.TabStop = false; + this.groupBoxFfmpeg.Text = "FFmpeg"; + // + // buttonDownloadFfmpeg + // + this.buttonDownloadFfmpeg.Location = new System.Drawing.Point(274, 17); + this.buttonDownloadFfmpeg.Name = "buttonDownloadFfmpeg"; + this.buttonDownloadFfmpeg.Size = new System.Drawing.Size(136, 23); + this.buttonDownloadFfmpeg.TabIndex = 2; + this.buttonDownloadFfmpeg.Text = "Download ffmpeg"; + this.buttonDownloadFfmpeg.UseVisualStyleBackColor = true; + this.buttonDownloadFfmpeg.Click += new System.EventHandler(this.buttonDownloadFfmpeg_Click); + // + // buttonBrowseToFFmpeg + // + this.buttonBrowseToFFmpeg.Location = new System.Drawing.Point(381, 65); + this.buttonBrowseToFFmpeg.Name = "buttonBrowseToFFmpeg"; + this.buttonBrowseToFFmpeg.Size = new System.Drawing.Size(29, 21); + this.buttonBrowseToFFmpeg.TabIndex = 23; + this.buttonBrowseToFFmpeg.Text = "..."; + this.buttonBrowseToFFmpeg.UseVisualStyleBackColor = true; + this.buttonBrowseToFFmpeg.Click += new System.EventHandler(this.buttonBrowseToFFmpeg_Click); + // + // textBoxFFmpegPath + // + this.textBoxFFmpegPath.Location = new System.Drawing.Point(9, 65); + this.textBoxFFmpegPath.MaxLength = 1000; + this.textBoxFFmpegPath.Name = "textBoxFFmpegPath"; + this.textBoxFFmpegPath.Size = new System.Drawing.Size(366, 21); + this.textBoxFFmpegPath.TabIndex = 22; + // + // labelFFmpegPath + // + this.labelFFmpegPath.AutoSize = true; + this.labelFFmpegPath.Location = new System.Drawing.Point(6, 49); + this.labelFFmpegPath.Name = "labelFFmpegPath"; + this.labelFFmpegPath.Size = new System.Drawing.Size(70, 13); + this.labelFFmpegPath.TabIndex = 2; + this.labelFFmpegPath.Text = "FFmpeg path"; + // + // checkBoxUseFFmpeg + // + this.checkBoxUseFFmpeg.AutoSize = true; + this.checkBoxUseFFmpeg.Location = new System.Drawing.Point(6, 20); + this.checkBoxUseFFmpeg.Name = "checkBoxUseFFmpeg"; + this.checkBoxUseFFmpeg.Size = new System.Drawing.Size(200, 17); + this.checkBoxUseFFmpeg.TabIndex = 1; + this.checkBoxUseFFmpeg.Text = "Use FFmpeg for wave file extraction"; + this.checkBoxUseFFmpeg.UseVisualStyleBackColor = true; + // + // groupBoxSpectrogram + // + this.groupBoxSpectrogram.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxSpectrogram.Controls.Add(this.labelSpectrogramAppearance); + this.groupBoxSpectrogram.Controls.Add(this.comboBoxSpectrogramAppearance); + this.groupBoxSpectrogram.Controls.Add(this.checkBoxGenerateSpectrogram); + this.groupBoxSpectrogram.Location = new System.Drawing.Point(6, 299); + this.groupBoxSpectrogram.Name = "groupBoxSpectrogram"; + this.groupBoxSpectrogram.Size = new System.Drawing.Size(394, 118); + this.groupBoxSpectrogram.TabIndex = 1; + this.groupBoxSpectrogram.TabStop = false; + this.groupBoxSpectrogram.Text = "Spectrogram"; + // + // labelSpectrogramAppearance + // + this.labelSpectrogramAppearance.AutoSize = true; + this.labelSpectrogramAppearance.Location = new System.Drawing.Point(10, 52); + this.labelSpectrogramAppearance.Name = "labelSpectrogramAppearance"; + this.labelSpectrogramAppearance.Size = new System.Drawing.Size(164, 13); + this.labelSpectrogramAppearance.TabIndex = 1; + this.labelSpectrogramAppearance.Text = "Appearance (at generation time)"; + // + // comboBoxSpectrogramAppearance + // + this.comboBoxSpectrogramAppearance.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxSpectrogramAppearance.FormattingEnabled = true; + this.comboBoxSpectrogramAppearance.Items.AddRange(new object[] { + "Classic", + "Use waveform color (one color gradient)"}); + this.comboBoxSpectrogramAppearance.Location = new System.Drawing.Point(10, 70); + this.comboBoxSpectrogramAppearance.Name = "comboBoxSpectrogramAppearance"; + this.comboBoxSpectrogramAppearance.Size = new System.Drawing.Size(325, 21); + this.comboBoxSpectrogramAppearance.TabIndex = 2; + // + // checkBoxGenerateSpectrogram + // + this.checkBoxGenerateSpectrogram.AutoSize = true; + this.checkBoxGenerateSpectrogram.Location = new System.Drawing.Point(10, 20); + this.checkBoxGenerateSpectrogram.Name = "checkBoxGenerateSpectrogram"; + this.checkBoxGenerateSpectrogram.Size = new System.Drawing.Size(134, 17); + this.checkBoxGenerateSpectrogram.TabIndex = 0; + this.checkBoxGenerateSpectrogram.Text = "Generate spectrogram"; + this.checkBoxGenerateSpectrogram.UseVisualStyleBackColor = true; + // + // groupBox1 + // + this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.groupBox1.Controls.Add(this.buttonWaveformsFolderEmpty); + this.groupBox1.Controls.Add(this.labelWaveformsFolderInfo); + this.groupBox1.Location = new System.Drawing.Point(10, 423); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(819, 80); + this.groupBox1.TabIndex = 3; + this.groupBox1.TabStop = false; + // + // buttonWaveformsFolderEmpty + // + this.buttonWaveformsFolderEmpty.Location = new System.Drawing.Point(10, 37); + this.buttonWaveformsFolderEmpty.Name = "buttonWaveformsFolderEmpty"; + this.buttonWaveformsFolderEmpty.Size = new System.Drawing.Size(325, 23); + this.buttonWaveformsFolderEmpty.TabIndex = 1; + this.buttonWaveformsFolderEmpty.Text = "Empty \'Waveforms\' folder"; + this.buttonWaveformsFolderEmpty.UseVisualStyleBackColor = true; + this.buttonWaveformsFolderEmpty.Click += new System.EventHandler(this.buttonWaveformsFolderEmpty_Click); + // + // labelWaveformsFolderInfo + // + this.labelWaveformsFolderInfo.AutoSize = true; + this.labelWaveformsFolderInfo.Location = new System.Drawing.Point(10, 20); + this.labelWaveformsFolderInfo.Name = "labelWaveformsFolderInfo"; + this.labelWaveformsFolderInfo.Size = new System.Drawing.Size(205, 13); + this.labelWaveformsFolderInfo.TabIndex = 0; + this.labelWaveformsFolderInfo.Text = "\'Waveforms\' folder contains x files (x mb)"; + // + // groupBoxWaveformAppearence + // + this.groupBoxWaveformAppearence.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxWaveformAppearence.Controls.Add(this.panelWaveformCursorColor); + this.groupBoxWaveformAppearence.Controls.Add(this.buttonWaveformCursorColor); + this.groupBoxWaveformAppearence.Controls.Add(this.checkBoxWaveformSnapToSceneChanges); + this.groupBoxWaveformAppearence.Controls.Add(this.checkBoxWaveformSingleClickSelect); + this.groupBoxWaveformAppearence.Controls.Add(this.checkBoxWaveformShowWpm); + this.groupBoxWaveformAppearence.Controls.Add(this.checkBoxWaveformShowCps); + this.groupBoxWaveformAppearence.Controls.Add(this.checkBoxWaveformSetVideoPosMoveStartEnd); + this.groupBoxWaveformAppearence.Controls.Add(this.labelWaveformTextSize); + this.groupBoxWaveformAppearence.Controls.Add(this.checkBoxWaveformTextBold); + this.groupBoxWaveformAppearence.Controls.Add(this.comboBoxWaveformTextSize); + this.groupBoxWaveformAppearence.Controls.Add(this.checkBoxListViewMouseEnterFocus); + this.groupBoxWaveformAppearence.Controls.Add(this.checkBoxWaveformHoverFocus); + this.groupBoxWaveformAppearence.Controls.Add(this.labelWaveformBorderHitMs2); + this.groupBoxWaveformAppearence.Controls.Add(this.numericUpDownWaveformBorderHitMs); + this.groupBoxWaveformAppearence.Controls.Add(this.labelWaveformBorderHitMs1); + this.groupBoxWaveformAppearence.Controls.Add(this.checkBoxAllowOverlap); + this.groupBoxWaveformAppearence.Controls.Add(this.checkBoxReverseMouseWheelScrollDirection); + this.groupBoxWaveformAppearence.Controls.Add(this.panelWaveformTextColor); + this.groupBoxWaveformAppearence.Controls.Add(this.buttonWaveformTextColor); + this.groupBoxWaveformAppearence.Controls.Add(this.panelWaveformGridColor); + this.groupBoxWaveformAppearence.Controls.Add(this.buttonWaveformGridColor); + this.groupBoxWaveformAppearence.Controls.Add(this.panelWaveformBackgroundColor); + this.groupBoxWaveformAppearence.Controls.Add(this.buttonWaveformBackgroundColor); + this.groupBoxWaveformAppearence.Controls.Add(this.panelWaveformColor); + this.groupBoxWaveformAppearence.Controls.Add(this.buttonWaveformColor); + this.groupBoxWaveformAppearence.Controls.Add(this.panelWaveformSelectedColor); + this.groupBoxWaveformAppearence.Controls.Add(this.buttonWaveformSelectedColor); + this.groupBoxWaveformAppearence.Controls.Add(this.checkBoxWaveformShowGrid); + this.groupBoxWaveformAppearence.Location = new System.Drawing.Point(6, 6); + this.groupBoxWaveformAppearence.Name = "groupBoxWaveformAppearence"; + this.groupBoxWaveformAppearence.Size = new System.Drawing.Size(819, 287); + this.groupBoxWaveformAppearence.TabIndex = 0; + this.groupBoxWaveformAppearence.TabStop = false; + this.groupBoxWaveformAppearence.Text = "Waveform appearance"; + // + // panelWaveformCursorColor + // + this.panelWaveformCursorColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelWaveformCursorColor.Location = new System.Drawing.Point(138, 142); + this.panelWaveformCursorColor.Name = "panelWaveformCursorColor"; + this.panelWaveformCursorColor.Size = new System.Drawing.Size(21, 20); + this.panelWaveformCursorColor.TabIndex = 34; + this.panelWaveformCursorColor.Click += new System.EventHandler(this.buttonWaveformCursorColor_Click); + // + // buttonWaveformCursorColor + // + this.buttonWaveformCursorColor.Location = new System.Drawing.Point(14, 141); + this.buttonWaveformCursorColor.Name = "buttonWaveformCursorColor"; + this.buttonWaveformCursorColor.Size = new System.Drawing.Size(112, 23); + this.buttonWaveformCursorColor.TabIndex = 4; + this.buttonWaveformCursorColor.Text = "Cursor color"; + this.buttonWaveformCursorColor.UseVisualStyleBackColor = true; + this.buttonWaveformCursorColor.Click += new System.EventHandler(this.buttonWaveformCursorColor_Click); + // + // checkBoxWaveformSnapToSceneChanges + // + this.checkBoxWaveformSnapToSceneChanges.AutoSize = true; + this.checkBoxWaveformSnapToSceneChanges.Location = new System.Drawing.Point(262, 161); + this.checkBoxWaveformSnapToSceneChanges.Name = "checkBoxWaveformSnapToSceneChanges"; + this.checkBoxWaveformSnapToSceneChanges.Size = new System.Drawing.Size(249, 17); + this.checkBoxWaveformSnapToSceneChanges.TabIndex = 26; + this.checkBoxWaveformSnapToSceneChanges.Text = "Snap to scene changes (hold Shift to override)"; + this.checkBoxWaveformSnapToSceneChanges.UseVisualStyleBackColor = true; + // + // checkBoxWaveformSingleClickSelect + // + this.checkBoxWaveformSingleClickSelect.AutoSize = true; + this.checkBoxWaveformSingleClickSelect.Location = new System.Drawing.Point(262, 138); + this.checkBoxWaveformSingleClickSelect.Name = "checkBoxWaveformSingleClickSelect"; + this.checkBoxWaveformSingleClickSelect.Size = new System.Drawing.Size(178, 17); + this.checkBoxWaveformSingleClickSelect.TabIndex = 25; + this.checkBoxWaveformSingleClickSelect.Text = "Single click to select paragraphs"; + this.checkBoxWaveformSingleClickSelect.UseVisualStyleBackColor = true; + // + // checkBoxWaveformShowWpm + // + this.checkBoxWaveformShowWpm.AutoSize = true; + this.checkBoxWaveformShowWpm.Location = new System.Drawing.Point(16, 256); + this.checkBoxWaveformShowWpm.Name = "checkBoxWaveformShowWpm"; + this.checkBoxWaveformShowWpm.Size = new System.Drawing.Size(104, 17); + this.checkBoxWaveformShowWpm.TabIndex = 8; + this.checkBoxWaveformShowWpm.Text = "Show words/min"; + this.checkBoxWaveformShowWpm.UseVisualStyleBackColor = true; + // + // checkBoxWaveformShowCps + // + this.checkBoxWaveformShowCps.AutoSize = true; + this.checkBoxWaveformShowCps.Location = new System.Drawing.Point(16, 233); + this.checkBoxWaveformShowCps.Name = "checkBoxWaveformShowCps"; + this.checkBoxWaveformShowCps.Size = new System.Drawing.Size(96, 17); + this.checkBoxWaveformShowCps.TabIndex = 7; + this.checkBoxWaveformShowCps.Text = "Show char/sec"; + this.checkBoxWaveformShowCps.UseVisualStyleBackColor = true; + // + // checkBoxWaveformSetVideoPosMoveStartEnd + // + this.checkBoxWaveformSetVideoPosMoveStartEnd.AutoSize = true; + this.checkBoxWaveformSetVideoPosMoveStartEnd.Location = new System.Drawing.Point(262, 73); + this.checkBoxWaveformSetVideoPosMoveStartEnd.Name = "checkBoxWaveformSetVideoPosMoveStartEnd"; + this.checkBoxWaveformSetVideoPosMoveStartEnd.Size = new System.Drawing.Size(225, 17); + this.checkBoxWaveformSetVideoPosMoveStartEnd.TabIndex = 22; + this.checkBoxWaveformSetVideoPosMoveStartEnd.Text = "Set video position when moving start/end"; + this.checkBoxWaveformSetVideoPosMoveStartEnd.UseVisualStyleBackColor = true; + // + // labelWaveformTextSize + // + this.labelWaveformTextSize.AutoSize = true; + this.labelWaveformTextSize.Location = new System.Drawing.Point(259, 194); + this.labelWaveformTextSize.Name = "labelWaveformTextSize"; + this.labelWaveformTextSize.Size = new System.Drawing.Size(73, 13); + this.labelWaveformTextSize.TabIndex = 27; + this.labelWaveformTextSize.Text = "Text font size"; + // + // checkBoxWaveformTextBold + // + this.checkBoxWaveformTextBold.AutoSize = true; + this.checkBoxWaveformTextBold.Location = new System.Drawing.Point(463, 195); + this.checkBoxWaveformTextBold.Name = "checkBoxWaveformTextBold"; + this.checkBoxWaveformTextBold.Size = new System.Drawing.Size(46, 17); + this.checkBoxWaveformTextBold.TabIndex = 29; + this.checkBoxWaveformTextBold.Text = "Bold"; + this.checkBoxWaveformTextBold.UseVisualStyleBackColor = true; + // + // comboBoxWaveformTextSize + // + this.comboBoxWaveformTextSize.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxWaveformTextSize.FormattingEnabled = true; + this.comboBoxWaveformTextSize.Items.AddRange(new object[] { + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15", + "16", + "17", + "18", + "19", + "20"}); + this.comboBoxWaveformTextSize.Location = new System.Drawing.Point(336, 191); + this.comboBoxWaveformTextSize.Name = "comboBoxWaveformTextSize"; + this.comboBoxWaveformTextSize.Size = new System.Drawing.Size(121, 21); + this.comboBoxWaveformTextSize.TabIndex = 28; + // + // checkBoxListViewMouseEnterFocus + // + this.checkBoxListViewMouseEnterFocus.AutoSize = true; + this.checkBoxListViewMouseEnterFocus.Location = new System.Drawing.Point(281, 115); + this.checkBoxListViewMouseEnterFocus.Name = "checkBoxListViewMouseEnterFocus"; + this.checkBoxListViewMouseEnterFocus.Size = new System.Drawing.Size(214, 17); + this.checkBoxListViewMouseEnterFocus.TabIndex = 24; + this.checkBoxListViewMouseEnterFocus.Text = "Focus list view on list view mouse enter"; + this.checkBoxListViewMouseEnterFocus.UseVisualStyleBackColor = true; + // + // checkBoxWaveformHoverFocus + // + this.checkBoxWaveformHoverFocus.AutoSize = true; + this.checkBoxWaveformHoverFocus.Location = new System.Drawing.Point(262, 96); + this.checkBoxWaveformHoverFocus.Name = "checkBoxWaveformHoverFocus"; + this.checkBoxWaveformHoverFocus.Size = new System.Drawing.Size(149, 17); + this.checkBoxWaveformHoverFocus.TabIndex = 23; + this.checkBoxWaveformHoverFocus.Text = "Set focus on mouse enter"; + this.checkBoxWaveformHoverFocus.UseVisualStyleBackColor = true; + this.checkBoxWaveformHoverFocus.CheckedChanged += new System.EventHandler(this.checkBoxWaveformHoverFocus_CheckedChanged); + // + // labelWaveformBorderHitMs2 + // + this.labelWaveformBorderHitMs2.AutoSize = true; + this.labelWaveformBorderHitMs2.Location = new System.Drawing.Point(454, 224); + this.labelWaveformBorderHitMs2.Name = "labelWaveformBorderHitMs2"; + this.labelWaveformBorderHitMs2.Size = new System.Drawing.Size(62, 13); + this.labelWaveformBorderHitMs2.TabIndex = 32; + this.labelWaveformBorderHitMs2.Text = "milliseconds"; + // + // numericUpDownWaveformBorderHitMs + // + this.numericUpDownWaveformBorderHitMs.Location = new System.Drawing.Point(392, 222); + this.numericUpDownWaveformBorderHitMs.Minimum = new decimal(new int[] { + 10, + 0, + 0, + 0}); + this.numericUpDownWaveformBorderHitMs.Name = "numericUpDownWaveformBorderHitMs"; + this.numericUpDownWaveformBorderHitMs.Size = new System.Drawing.Size(44, 21); + this.numericUpDownWaveformBorderHitMs.TabIndex = 31; + this.numericUpDownWaveformBorderHitMs.Value = new decimal(new int[] { + 18, + 0, + 0, + 0}); + // + // labelWaveformBorderHitMs1 + // + this.labelWaveformBorderHitMs1.AutoSize = true; + this.labelWaveformBorderHitMs1.Location = new System.Drawing.Point(259, 224); + this.labelWaveformBorderHitMs1.Name = "labelWaveformBorderHitMs1"; + this.labelWaveformBorderHitMs1.Size = new System.Drawing.Size(127, 13); + this.labelWaveformBorderHitMs1.TabIndex = 30; + this.labelWaveformBorderHitMs1.Text = "Marker hit must be within"; + // + // checkBoxAllowOverlap + // + this.checkBoxAllowOverlap.AutoSize = true; + this.checkBoxAllowOverlap.Location = new System.Drawing.Point(262, 50); + this.checkBoxAllowOverlap.Name = "checkBoxAllowOverlap"; + this.checkBoxAllowOverlap.Size = new System.Drawing.Size(212, 17); + this.checkBoxAllowOverlap.TabIndex = 21; + this.checkBoxAllowOverlap.Text = "Allow overlap (when dragging/resizing)"; + this.checkBoxAllowOverlap.UseVisualStyleBackColor = true; + // + // checkBoxReverseMouseWheelScrollDirection + // + this.checkBoxReverseMouseWheelScrollDirection.AutoSize = true; + this.checkBoxReverseMouseWheelScrollDirection.Location = new System.Drawing.Point(262, 27); + this.checkBoxReverseMouseWheelScrollDirection.Name = "checkBoxReverseMouseWheelScrollDirection"; + this.checkBoxReverseMouseWheelScrollDirection.Size = new System.Drawing.Size(202, 17); + this.checkBoxReverseMouseWheelScrollDirection.TabIndex = 20; + this.checkBoxReverseMouseWheelScrollDirection.Text = "Reverse mouse wheel scroll direction"; + this.checkBoxReverseMouseWheelScrollDirection.UseVisualStyleBackColor = true; + // + // panelWaveformTextColor + // + this.panelWaveformTextColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelWaveformTextColor.Location = new System.Drawing.Point(138, 113); + this.panelWaveformTextColor.Name = "panelWaveformTextColor"; + this.panelWaveformTextColor.Size = new System.Drawing.Size(21, 20); + this.panelWaveformTextColor.TabIndex = 7; + this.panelWaveformTextColor.Click += new System.EventHandler(this.buttonWaveformTextColor_Click); + // + // buttonWaveformTextColor + // + this.buttonWaveformTextColor.Location = new System.Drawing.Point(14, 112); + this.buttonWaveformTextColor.Name = "buttonWaveformTextColor"; + this.buttonWaveformTextColor.Size = new System.Drawing.Size(112, 23); + this.buttonWaveformTextColor.TabIndex = 3; + this.buttonWaveformTextColor.Text = "Text color"; + this.buttonWaveformTextColor.UseVisualStyleBackColor = true; + this.buttonWaveformTextColor.Click += new System.EventHandler(this.buttonWaveformTextColor_Click); + // + // panelWaveformGridColor + // + this.panelWaveformGridColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelWaveformGridColor.Location = new System.Drawing.Point(138, 171); + this.panelWaveformGridColor.Name = "panelWaveformGridColor"; + this.panelWaveformGridColor.Size = new System.Drawing.Size(21, 20); + this.panelWaveformGridColor.TabIndex = 9; + this.panelWaveformGridColor.Click += new System.EventHandler(this.buttonWaveformGridColor_Click); + // + // buttonWaveformGridColor + // + this.buttonWaveformGridColor.Location = new System.Drawing.Point(14, 170); + this.buttonWaveformGridColor.Name = "buttonWaveformGridColor"; + this.buttonWaveformGridColor.Size = new System.Drawing.Size(112, 23); + this.buttonWaveformGridColor.TabIndex = 5; + this.buttonWaveformGridColor.Text = "Grid color"; + this.buttonWaveformGridColor.UseVisualStyleBackColor = true; + this.buttonWaveformGridColor.Click += new System.EventHandler(this.buttonWaveformGridColor_Click); + // + // panelWaveformBackgroundColor + // + this.panelWaveformBackgroundColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelWaveformBackgroundColor.Location = new System.Drawing.Point(138, 84); + this.panelWaveformBackgroundColor.Name = "panelWaveformBackgroundColor"; + this.panelWaveformBackgroundColor.Size = new System.Drawing.Size(21, 20); + this.panelWaveformBackgroundColor.TabIndex = 5; + this.panelWaveformBackgroundColor.Click += new System.EventHandler(this.buttonWaveformBackgroundColor_Click); + // + // buttonWaveformBackgroundColor + // + this.buttonWaveformBackgroundColor.Location = new System.Drawing.Point(14, 83); + this.buttonWaveformBackgroundColor.Name = "buttonWaveformBackgroundColor"; + this.buttonWaveformBackgroundColor.Size = new System.Drawing.Size(112, 23); + this.buttonWaveformBackgroundColor.TabIndex = 2; + this.buttonWaveformBackgroundColor.Text = "Back color"; + this.buttonWaveformBackgroundColor.UseVisualStyleBackColor = true; + this.buttonWaveformBackgroundColor.Click += new System.EventHandler(this.buttonWaveformBackgroundColor_Click); + // + // panelWaveformColor + // + this.panelWaveformColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelWaveformColor.Location = new System.Drawing.Point(138, 55); + this.panelWaveformColor.Name = "panelWaveformColor"; + this.panelWaveformColor.Size = new System.Drawing.Size(21, 20); + this.panelWaveformColor.TabIndex = 3; + this.panelWaveformColor.Click += new System.EventHandler(this.buttonWaveformColor_Click); + // + // buttonWaveformColor + // + this.buttonWaveformColor.Location = new System.Drawing.Point(14, 54); + this.buttonWaveformColor.Name = "buttonWaveformColor"; + this.buttonWaveformColor.Size = new System.Drawing.Size(112, 23); + this.buttonWaveformColor.TabIndex = 1; + this.buttonWaveformColor.Text = "Color"; + this.buttonWaveformColor.UseVisualStyleBackColor = true; + this.buttonWaveformColor.Click += new System.EventHandler(this.buttonWaveformColor_Click); + // + // panelWaveformSelectedColor + // + this.panelWaveformSelectedColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelWaveformSelectedColor.Location = new System.Drawing.Point(138, 26); + this.panelWaveformSelectedColor.Name = "panelWaveformSelectedColor"; + this.panelWaveformSelectedColor.Size = new System.Drawing.Size(21, 20); + this.panelWaveformSelectedColor.TabIndex = 1; + this.panelWaveformSelectedColor.MouseClick += new System.Windows.Forms.MouseEventHandler(this.buttonWaveformSelectedColor_Click); + // + // buttonWaveformSelectedColor + // + this.buttonWaveformSelectedColor.Location = new System.Drawing.Point(14, 25); + this.buttonWaveformSelectedColor.Name = "buttonWaveformSelectedColor"; + this.buttonWaveformSelectedColor.Size = new System.Drawing.Size(112, 23); + this.buttonWaveformSelectedColor.TabIndex = 0; + this.buttonWaveformSelectedColor.Text = "Selected color"; + this.buttonWaveformSelectedColor.UseVisualStyleBackColor = true; + this.buttonWaveformSelectedColor.Click += new System.EventHandler(this.buttonWaveformSelectedColor_Click); + // + // checkBoxWaveformShowGrid + // + this.checkBoxWaveformShowGrid.AutoSize = true; + this.checkBoxWaveformShowGrid.Location = new System.Drawing.Point(16, 201); + this.checkBoxWaveformShowGrid.Name = "checkBoxWaveformShowGrid"; + this.checkBoxWaveformShowGrid.Size = new System.Drawing.Size(73, 17); + this.checkBoxWaveformShowGrid.TabIndex = 6; + this.checkBoxWaveformShowGrid.Text = "Show grid"; + this.checkBoxWaveformShowGrid.UseVisualStyleBackColor = true; + // + // tabPageTools + // + this.tabPageTools.Controls.Add(this.groupBoxGoogleTranslate); + this.tabPageTools.Controls.Add(this.groupBoxBing); + this.tabPageTools.Controls.Add(this.groupBoxToolsAutoBr); + this.tabPageTools.Controls.Add(this.groupBoxSpellCheck); + this.tabPageTools.Controls.Add(this.groupBoxFixCommonErrors); + this.tabPageTools.Controls.Add(this.groupBoxToolsVisualSync); + this.tabPageTools.Location = new System.Drawing.Point(4, 22); + this.tabPageTools.Name = "tabPageTools"; + this.tabPageTools.Padding = new System.Windows.Forms.Padding(3); + this.tabPageTools.Size = new System.Drawing.Size(832, 520); + this.tabPageTools.TabIndex = 5; + this.tabPageTools.Text = "Tools"; + this.tabPageTools.UseVisualStyleBackColor = true; + // + // groupBoxGoogleTranslate + // + this.groupBoxGoogleTranslate.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxGoogleTranslate.Controls.Add(this.labelGoogleTranslateApiKey); + this.groupBoxGoogleTranslate.Controls.Add(this.textBoxGoogleTransleApiKey); + this.groupBoxGoogleTranslate.Controls.Add(this.linkLabelGoogleTranslateSignUp); + this.groupBoxGoogleTranslate.Controls.Add(this.label3); + this.groupBoxGoogleTranslate.Location = new System.Drawing.Point(421, 244); + this.groupBoxGoogleTranslate.Name = "groupBoxGoogleTranslate"; + this.groupBoxGoogleTranslate.Size = new System.Drawing.Size(404, 78); + this.groupBoxGoogleTranslate.TabIndex = 31; + this.groupBoxGoogleTranslate.TabStop = false; + this.groupBoxGoogleTranslate.Text = "Google translate"; + // + // labelGoogleTranslateApiKey + // + this.labelGoogleTranslateApiKey.AutoSize = true; + this.labelGoogleTranslateApiKey.Location = new System.Drawing.Point(13, 47); + this.labelGoogleTranslateApiKey.Name = "labelGoogleTranslateApiKey"; + this.labelGoogleTranslateApiKey.Size = new System.Drawing.Size(44, 13); + this.labelGoogleTranslateApiKey.TabIndex = 30; + this.labelGoogleTranslateApiKey.Text = "API key"; + // + // textBoxGoogleTransleApiKey + // + this.textBoxGoogleTransleApiKey.Location = new System.Drawing.Point(94, 47); + this.textBoxGoogleTransleApiKey.Name = "textBoxGoogleTransleApiKey"; + this.textBoxGoogleTransleApiKey.Size = new System.Drawing.Size(290, 21); + this.textBoxGoogleTransleApiKey.TabIndex = 26; + // + // linkLabelGoogleTranslateSignUp + // + this.linkLabelGoogleTranslateSignUp.AutoSize = true; + this.linkLabelGoogleTranslateSignUp.Location = new System.Drawing.Point(306, 19); + this.linkLabelGoogleTranslateSignUp.Name = "linkLabelGoogleTranslateSignUp"; + this.linkLabelGoogleTranslateSignUp.Size = new System.Drawing.Size(78, 13); + this.linkLabelGoogleTranslateSignUp.TabIndex = 24; + this.linkLabelGoogleTranslateSignUp.TabStop = true; + this.linkLabelGoogleTranslateSignUp.Text = "How to sign up"; + this.linkLabelGoogleTranslateSignUp.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabelGoogleTranslateSignUp_LinkClicked); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(16, 106); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(0, 13); + this.label3.TabIndex = 25; + // + // groupBoxBing + // + this.groupBoxBing.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxBing.Controls.Add(this.comboBoxBoxBingTokenEndpoint); + this.groupBoxBing.Controls.Add(this.labelBingTokenEndpoint); + this.groupBoxBing.Controls.Add(this.labelBingApiKey); + this.groupBoxBing.Controls.Add(this.textBoxBingClientSecret); + this.groupBoxBing.Controls.Add(this.linkLabelBingSubscribe); + this.groupBoxBing.Controls.Add(this.label1); + this.groupBoxBing.Location = new System.Drawing.Point(421, 331); + this.groupBoxBing.Name = "groupBoxBing"; + this.groupBoxBing.Size = new System.Drawing.Size(404, 183); + this.groupBoxBing.TabIndex = 32; + this.groupBoxBing.TabStop = false; + this.groupBoxBing.Text = "Bing translator"; + // + // comboBoxBoxBingTokenEndpoint + // + this.comboBoxBoxBingTokenEndpoint.FormattingEnabled = true; + this.comboBoxBoxBingTokenEndpoint.Items.AddRange(new object[] { + "https://api.cognitive.microsoft.com/sts/v1.0/issueToken", + "https://.api.cognitive.microsoft.com/sts/v1.0/issueToken"}); + this.comboBoxBoxBingTokenEndpoint.Location = new System.Drawing.Point(9, 101); + this.comboBoxBoxBingTokenEndpoint.Name = "comboBoxBoxBingTokenEndpoint"; + this.comboBoxBoxBingTokenEndpoint.Size = new System.Drawing.Size(375, 21); + this.comboBoxBoxBingTokenEndpoint.TabIndex = 33; + // + // labelBingTokenEndpoint + // + this.labelBingTokenEndpoint.AutoSize = true; + this.labelBingTokenEndpoint.Location = new System.Drawing.Point(6, 83); + this.labelBingTokenEndpoint.Name = "labelBingTokenEndpoint"; + this.labelBingTokenEndpoint.Size = new System.Drawing.Size(81, 13); + this.labelBingTokenEndpoint.TabIndex = 32; + this.labelBingTokenEndpoint.Text = "Token endpoint"; + // + // labelBingApiKey + // + this.labelBingApiKey.AutoSize = true; + this.labelBingApiKey.Location = new System.Drawing.Point(6, 29); + this.labelBingApiKey.Name = "labelBingApiKey"; + this.labelBingApiKey.Size = new System.Drawing.Size(44, 13); + this.labelBingApiKey.TabIndex = 30; + this.labelBingApiKey.Text = "API key"; + // + // textBoxBingClientSecret + // + this.textBoxBingClientSecret.Location = new System.Drawing.Point(10, 45); + this.textBoxBingClientSecret.Name = "textBoxBingClientSecret"; + this.textBoxBingClientSecret.Size = new System.Drawing.Size(374, 21); + this.textBoxBingClientSecret.TabIndex = 26; + // + // linkLabelBingSubscribe + // + this.linkLabelBingSubscribe.AutoSize = true; + this.linkLabelBingSubscribe.Location = new System.Drawing.Point(306, 17); + this.linkLabelBingSubscribe.Name = "linkLabelBingSubscribe"; + this.linkLabelBingSubscribe.Size = new System.Drawing.Size(78, 13); + this.linkLabelBingSubscribe.TabIndex = 24; + this.linkLabelBingSubscribe.TabStop = true; + this.linkLabelBingSubscribe.Text = "How to sign up"; + this.linkLabelBingSubscribe.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabelBingSubscribe_LinkClicked); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(16, 106); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(0, 13); + this.label1.TabIndex = 25; + // + // groupBoxToolsAutoBr + // + this.groupBoxToolsAutoBr.Controls.Add(this.labelToolsBreakBottomHeavyPercent); + this.groupBoxToolsAutoBr.Controls.Add(this.numericUpDownToolsBreakPreferBottomHeavy); + this.groupBoxToolsAutoBr.Controls.Add(this.checkBoxToolsBreakPreferBottomHeavy); + this.groupBoxToolsAutoBr.Controls.Add(this.checkBoxToolsBreakByPixelWidth); + this.groupBoxToolsAutoBr.Controls.Add(this.checkBoxToolsBreakEarlyLineEnding); + this.groupBoxToolsAutoBr.Controls.Add(this.checkBoxToolsBreakEarlyComma); + this.groupBoxToolsAutoBr.Controls.Add(this.checkBoxToolsBreakEarlyDash); + this.groupBoxToolsAutoBr.Controls.Add(this.labelUserBingApiId); + this.groupBoxToolsAutoBr.Controls.Add(this.buttonEditDoNotBreakAfterList); + this.groupBoxToolsAutoBr.Controls.Add(this.checkBoxUseDoNotBreakAfterList); + this.groupBoxToolsAutoBr.Location = new System.Drawing.Point(421, 6); + this.groupBoxToolsAutoBr.Name = "groupBoxToolsAutoBr"; + this.groupBoxToolsAutoBr.Size = new System.Drawing.Size(404, 232); + this.groupBoxToolsAutoBr.TabIndex = 5; + this.groupBoxToolsAutoBr.TabStop = false; + this.groupBoxToolsAutoBr.Text = "Auto br"; + // + // labelToolsBreakBottomHeavyPercent + // + this.labelToolsBreakBottomHeavyPercent.AutoSize = true; + this.labelToolsBreakBottomHeavyPercent.Location = new System.Drawing.Point(226, 142); + this.labelToolsBreakBottomHeavyPercent.Name = "labelToolsBreakBottomHeavyPercent"; + this.labelToolsBreakBottomHeavyPercent.Size = new System.Drawing.Size(18, 13); + this.labelToolsBreakBottomHeavyPercent.TabIndex = 63; + this.labelToolsBreakBottomHeavyPercent.Text = "%"; + // + // numericUpDownToolsBreakPreferBottomHeavy + // + this.numericUpDownToolsBreakPreferBottomHeavy.DecimalPlaces = 1; + this.numericUpDownToolsBreakPreferBottomHeavy.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.numericUpDownToolsBreakPreferBottomHeavy.Location = new System.Drawing.Point(164, 140); + this.numericUpDownToolsBreakPreferBottomHeavy.Maximum = new decimal(new int[] { + 50, + 0, + 0, + 0}); + this.numericUpDownToolsBreakPreferBottomHeavy.Name = "numericUpDownToolsBreakPreferBottomHeavy"; + this.numericUpDownToolsBreakPreferBottomHeavy.Size = new System.Drawing.Size(56, 21); + this.numericUpDownToolsBreakPreferBottomHeavy.TabIndex = 62; + this.numericUpDownToolsBreakPreferBottomHeavy.Value = new decimal(new int[] { + 11, + 0, + 0, + 0}); + // + // checkBoxToolsBreakPreferBottomHeavy + // + this.checkBoxToolsBreakPreferBottomHeavy.AutoSize = true; + this.checkBoxToolsBreakPreferBottomHeavy.Location = new System.Drawing.Point(32, 141); + this.checkBoxToolsBreakPreferBottomHeavy.Name = "checkBoxToolsBreakPreferBottomHeavy"; + this.checkBoxToolsBreakPreferBottomHeavy.Size = new System.Drawing.Size(126, 17); + this.checkBoxToolsBreakPreferBottomHeavy.TabIndex = 61; + this.checkBoxToolsBreakPreferBottomHeavy.Text = "Prefer bottom heavy"; + this.checkBoxToolsBreakPreferBottomHeavy.UseVisualStyleBackColor = true; + // + // checkBoxToolsBreakByPixelWidth + // + this.checkBoxToolsBreakByPixelWidth.AutoSize = true; + this.checkBoxToolsBreakByPixelWidth.Location = new System.Drawing.Point(15, 118); + this.checkBoxToolsBreakByPixelWidth.Name = "checkBoxToolsBreakByPixelWidth"; + this.checkBoxToolsBreakByPixelWidth.Size = new System.Drawing.Size(172, 17); + this.checkBoxToolsBreakByPixelWidth.TabIndex = 60; + this.checkBoxToolsBreakByPixelWidth.Text = "Break by estimated pixel width"; + this.checkBoxToolsBreakByPixelWidth.UseVisualStyleBackColor = true; + this.checkBoxToolsBreakByPixelWidth.CheckedChanged += new System.EventHandler(this.checkBoxToolsBreakByPixelWidth_CheckedChanged); + // + // checkBoxToolsBreakEarlyLineEnding + // + this.checkBoxToolsBreakEarlyLineEnding.AutoSize = true; + this.checkBoxToolsBreakEarlyLineEnding.Location = new System.Drawing.Point(15, 72); + this.checkBoxToolsBreakEarlyLineEnding.Name = "checkBoxToolsBreakEarlyLineEnding"; + this.checkBoxToolsBreakEarlyLineEnding.Size = new System.Drawing.Size(175, 17); + this.checkBoxToolsBreakEarlyLineEnding.TabIndex = 40; + this.checkBoxToolsBreakEarlyLineEnding.Text = "Break early for line ending (.!?)"; + this.checkBoxToolsBreakEarlyLineEnding.UseVisualStyleBackColor = true; + // + // checkBoxToolsBreakEarlyComma + // + this.checkBoxToolsBreakEarlyComma.AutoSize = true; + this.checkBoxToolsBreakEarlyComma.Location = new System.Drawing.Point(15, 95); + this.checkBoxToolsBreakEarlyComma.Name = "checkBoxToolsBreakEarlyComma"; + this.checkBoxToolsBreakEarlyComma.Size = new System.Drawing.Size(133, 17); + this.checkBoxToolsBreakEarlyComma.TabIndex = 50; + this.checkBoxToolsBreakEarlyComma.Text = "Break early for comma"; + this.checkBoxToolsBreakEarlyComma.UseVisualStyleBackColor = true; + // + // checkBoxToolsBreakEarlyDash + // + this.checkBoxToolsBreakEarlyDash.AutoSize = true; + this.checkBoxToolsBreakEarlyDash.Location = new System.Drawing.Point(15, 49); + this.checkBoxToolsBreakEarlyDash.Name = "checkBoxToolsBreakEarlyDash"; + this.checkBoxToolsBreakEarlyDash.Size = new System.Drawing.Size(123, 17); + this.checkBoxToolsBreakEarlyDash.TabIndex = 30; + this.checkBoxToolsBreakEarlyDash.Text = "Break early for dash"; + this.checkBoxToolsBreakEarlyDash.UseVisualStyleBackColor = true; + // + // labelUserBingApiId + // + this.labelUserBingApiId.AutoSize = true; + this.labelUserBingApiId.Location = new System.Drawing.Point(16, 106); + this.labelUserBingApiId.Name = "labelUserBingApiId"; + this.labelUserBingApiId.Size = new System.Drawing.Size(0, 13); + this.labelUserBingApiId.TabIndex = 25; + // + // buttonEditDoNotBreakAfterList + // + this.buttonEditDoNotBreakAfterList.Location = new System.Drawing.Point(239, 22); + this.buttonEditDoNotBreakAfterList.Name = "buttonEditDoNotBreakAfterList"; + this.buttonEditDoNotBreakAfterList.Size = new System.Drawing.Size(75, 23); + this.buttonEditDoNotBreakAfterList.TabIndex = 20; + this.buttonEditDoNotBreakAfterList.Text = "Edit"; + this.buttonEditDoNotBreakAfterList.UseVisualStyleBackColor = true; + this.buttonEditDoNotBreakAfterList.Click += new System.EventHandler(this.buttonEditDoNotBreakAfterList_Click); + // + // checkBoxUseDoNotBreakAfterList + // + this.checkBoxUseDoNotBreakAfterList.AutoSize = true; + this.checkBoxUseDoNotBreakAfterList.Location = new System.Drawing.Point(15, 26); + this.checkBoxUseDoNotBreakAfterList.Name = "checkBoxUseDoNotBreakAfterList"; + this.checkBoxUseDoNotBreakAfterList.Size = new System.Drawing.Size(154, 17); + this.checkBoxUseDoNotBreakAfterList.TabIndex = 1; + this.checkBoxUseDoNotBreakAfterList.Text = "Use \'do-not-beak-after\' list"; + this.checkBoxUseDoNotBreakAfterList.UseVisualStyleBackColor = true; + // + // groupBoxSpellCheck + // + this.groupBoxSpellCheck.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxSpellCheck.Controls.Add(this.checkBoxSpellCheckAutoChangeNamesViaSuggestions); + this.groupBoxSpellCheck.Controls.Add(this.checkBoxUseAlwaysToFile); + this.groupBoxSpellCheck.Controls.Add(this.checkBoxTreatINQuoteAsING); + this.groupBoxSpellCheck.Controls.Add(this.checkBoxSpellCheckOneLetterWords); + this.groupBoxSpellCheck.Controls.Add(this.checkBoxSpellCheckAutoChangeNames); + this.groupBoxSpellCheck.Location = new System.Drawing.Point(7, 360); + this.groupBoxSpellCheck.Name = "groupBoxSpellCheck"; + this.groupBoxSpellCheck.Size = new System.Drawing.Size(408, 154); + this.groupBoxSpellCheck.TabIndex = 4; + this.groupBoxSpellCheck.TabStop = false; + this.groupBoxSpellCheck.Text = "Spell check"; + // + // checkBoxSpellCheckAutoChangeNamesViaSuggestions + // + this.checkBoxSpellCheckAutoChangeNamesViaSuggestions.AutoSize = true; + this.checkBoxSpellCheckAutoChangeNamesViaSuggestions.Location = new System.Drawing.Point(30, 43); + this.checkBoxSpellCheckAutoChangeNamesViaSuggestions.Name = "checkBoxSpellCheckAutoChangeNamesViaSuggestions"; + this.checkBoxSpellCheckAutoChangeNamesViaSuggestions.Size = new System.Drawing.Size(184, 17); + this.checkBoxSpellCheckAutoChangeNamesViaSuggestions.TabIndex = 1; + this.checkBoxSpellCheckAutoChangeNamesViaSuggestions.Text = "Also use \'spell check suggestions\'"; + this.checkBoxSpellCheckAutoChangeNamesViaSuggestions.UseVisualStyleBackColor = true; + // + // checkBoxUseAlwaysToFile + // + this.checkBoxUseAlwaysToFile.AutoSize = true; + this.checkBoxUseAlwaysToFile.Location = new System.Drawing.Point(15, 118); + this.checkBoxUseAlwaysToFile.Name = "checkBoxUseAlwaysToFile"; + this.checkBoxUseAlwaysToFile.Size = new System.Drawing.Size(192, 17); + this.checkBoxUseAlwaysToFile.TabIndex = 12; + this.checkBoxUseAlwaysToFile.Text = "Remember \"Use always\" / \"Skip all\""; + this.checkBoxUseAlwaysToFile.UseVisualStyleBackColor = true; + // + // checkBoxTreatINQuoteAsING + // + this.checkBoxTreatINQuoteAsING.AutoSize = true; + this.checkBoxTreatINQuoteAsING.Location = new System.Drawing.Point(15, 95); + this.checkBoxTreatINQuoteAsING.Name = "checkBoxTreatINQuoteAsING"; + this.checkBoxTreatINQuoteAsING.Size = new System.Drawing.Size(253, 17); + this.checkBoxTreatINQuoteAsING.TabIndex = 8; + this.checkBoxTreatINQuoteAsING.Text = "Treat word ending \" in\' \" as \" ing \" (English only)"; + this.checkBoxTreatINQuoteAsING.UseVisualStyleBackColor = true; + // + // checkBoxSpellCheckOneLetterWords + // + this.checkBoxSpellCheckOneLetterWords.AutoSize = true; + this.checkBoxSpellCheckOneLetterWords.Location = new System.Drawing.Point(15, 72); + this.checkBoxSpellCheckOneLetterWords.Name = "checkBoxSpellCheckOneLetterWords"; + this.checkBoxSpellCheckOneLetterWords.Size = new System.Drawing.Size(205, 17); + this.checkBoxSpellCheckOneLetterWords.TabIndex = 4; + this.checkBoxSpellCheckOneLetterWords.Text = "Prompt for unknown one letter words"; + this.checkBoxSpellCheckOneLetterWords.UseVisualStyleBackColor = true; + // + // checkBoxSpellCheckAutoChangeNames + // + this.checkBoxSpellCheckAutoChangeNames.AutoSize = true; + this.checkBoxSpellCheckAutoChangeNames.Location = new System.Drawing.Point(15, 20); + this.checkBoxSpellCheckAutoChangeNames.Name = "checkBoxSpellCheckAutoChangeNames"; + this.checkBoxSpellCheckAutoChangeNames.Size = new System.Drawing.Size(216, 17); + this.checkBoxSpellCheckAutoChangeNames.TabIndex = 0; + this.checkBoxSpellCheckAutoChangeNames.Text = "Auto fix names where only casing differ"; + this.checkBoxSpellCheckAutoChangeNames.UseVisualStyleBackColor = true; + // + // groupBoxFixCommonErrors + // + this.groupBoxFixCommonErrors.Controls.Add(this.buttonFixContinuationStyleSettings); + this.groupBoxFixCommonErrors.Controls.Add(this.checkBoxFceSkipStep1); + this.groupBoxFixCommonErrors.Controls.Add(this.checkBoxFixShortDisplayTimesAllowMoveStartTime); + this.groupBoxFixCommonErrors.Controls.Add(this.checkBoxFixCommonOcrErrorsUsingHardcodedRules); + this.groupBoxFixCommonErrors.Controls.Add(this.comboBoxToolsMusicSymbol); + this.groupBoxFixCommonErrors.Controls.Add(this.textBoxMusicSymbolsToReplace); + this.groupBoxFixCommonErrors.Controls.Add(this.labelToolsMusicSymbolsToReplace); + this.groupBoxFixCommonErrors.Controls.Add(this.labelToolsMusicSymbol); + this.groupBoxFixCommonErrors.Location = new System.Drawing.Point(7, 129); + this.groupBoxFixCommonErrors.Name = "groupBoxFixCommonErrors"; + this.groupBoxFixCommonErrors.Size = new System.Drawing.Size(408, 225); + this.groupBoxFixCommonErrors.TabIndex = 3; + this.groupBoxFixCommonErrors.TabStop = false; + this.groupBoxFixCommonErrors.Text = "Fix common errors"; + // + // buttonFixContinuationStyleSettings + // + this.buttonFixContinuationStyleSettings.Location = new System.Drawing.Point(15, 189); + this.buttonFixContinuationStyleSettings.Name = "buttonFixContinuationStyleSettings"; + this.buttonFixContinuationStyleSettings.Size = new System.Drawing.Size(271, 23); + this.buttonFixContinuationStyleSettings.TabIndex = 37; + this.buttonFixContinuationStyleSettings.Text = "Edit settings for fixing continuation style..."; + this.buttonFixContinuationStyleSettings.UseVisualStyleBackColor = true; + this.buttonFixContinuationStyleSettings.Click += new System.EventHandler(this.buttonFixContinuationStyleSettings_Click); + // + // checkBoxFceSkipStep1 + // + this.checkBoxFceSkipStep1.AutoSize = true; + this.checkBoxFceSkipStep1.Location = new System.Drawing.Point(15, 161); + this.checkBoxFceSkipStep1.Name = "checkBoxFceSkipStep1"; + this.checkBoxFceSkipStep1.Size = new System.Drawing.Size(176, 17); + this.checkBoxFceSkipStep1.TabIndex = 36; + this.checkBoxFceSkipStep1.Text = "Skip step one (choose fix rules)"; + this.checkBoxFceSkipStep1.UseVisualStyleBackColor = true; + // + // checkBoxFixShortDisplayTimesAllowMoveStartTime + // + this.checkBoxFixShortDisplayTimesAllowMoveStartTime.AutoSize = true; + this.checkBoxFixShortDisplayTimesAllowMoveStartTime.Location = new System.Drawing.Point(15, 138); + this.checkBoxFixShortDisplayTimesAllowMoveStartTime.Name = "checkBoxFixShortDisplayTimesAllowMoveStartTime"; + this.checkBoxFixShortDisplayTimesAllowMoveStartTime.Size = new System.Drawing.Size(252, 17); + this.checkBoxFixShortDisplayTimesAllowMoveStartTime.TabIndex = 35; + this.checkBoxFixShortDisplayTimesAllowMoveStartTime.Text = "Fix short display time - allow move of start time"; + this.checkBoxFixShortDisplayTimesAllowMoveStartTime.UseVisualStyleBackColor = true; + // + // checkBoxFixCommonOcrErrorsUsingHardcodedRules + // + this.checkBoxFixCommonOcrErrorsUsingHardcodedRules.AutoSize = true; + this.checkBoxFixCommonOcrErrorsUsingHardcodedRules.Location = new System.Drawing.Point(15, 115); + this.checkBoxFixCommonOcrErrorsUsingHardcodedRules.Name = "checkBoxFixCommonOcrErrorsUsingHardcodedRules"; + this.checkBoxFixCommonOcrErrorsUsingHardcodedRules.Size = new System.Drawing.Size(268, 17); + this.checkBoxFixCommonOcrErrorsUsingHardcodedRules.TabIndex = 2; + this.checkBoxFixCommonOcrErrorsUsingHardcodedRules.Text = "Fix common OCR errors - also use hardcoded rules"; + this.checkBoxFixCommonOcrErrorsUsingHardcodedRules.UseVisualStyleBackColor = true; + // + // comboBoxToolsMusicSymbol + // + this.comboBoxToolsMusicSymbol.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxToolsMusicSymbol.FormattingEnabled = true; + this.comboBoxToolsMusicSymbol.Items.AddRange(new object[] { + "♪", + "♪♪", + "*", + "#"}); + this.comboBoxToolsMusicSymbol.Location = new System.Drawing.Point(200, 71); + this.comboBoxToolsMusicSymbol.Name = "comboBoxToolsMusicSymbol"; + this.comboBoxToolsMusicSymbol.Size = new System.Drawing.Size(86, 21); + this.comboBoxToolsMusicSymbol.TabIndex = 1; + // + // textBoxMusicSymbolsToReplace + // + this.textBoxMusicSymbolsToReplace.Location = new System.Drawing.Point(11, 41); + this.textBoxMusicSymbolsToReplace.MaxLength = 100; + this.textBoxMusicSymbolsToReplace.Name = "textBoxMusicSymbolsToReplace"; + this.textBoxMusicSymbolsToReplace.Size = new System.Drawing.Size(274, 21); + this.textBoxMusicSymbolsToReplace.TabIndex = 0; + // + // labelToolsMusicSymbolsToReplace + // + this.labelToolsMusicSymbolsToReplace.AutoSize = true; + this.labelToolsMusicSymbolsToReplace.Location = new System.Drawing.Point(8, 25); + this.labelToolsMusicSymbolsToReplace.Name = "labelToolsMusicSymbolsToReplace"; + this.labelToolsMusicSymbolsToReplace.Size = new System.Drawing.Size(230, 13); + this.labelToolsMusicSymbolsToReplace.TabIndex = 34; + this.labelToolsMusicSymbolsToReplace.Text = "Music symbols to replace (separate by comma)"; + // + // labelToolsMusicSymbol + // + this.labelToolsMusicSymbol.AutoSize = true; + this.labelToolsMusicSymbol.Location = new System.Drawing.Point(8, 74); + this.labelToolsMusicSymbol.Name = "labelToolsMusicSymbol"; + this.labelToolsMusicSymbol.Size = new System.Drawing.Size(69, 13); + this.labelToolsMusicSymbol.TabIndex = 32; + this.labelToolsMusicSymbol.Text = "Music symbol"; + // + // groupBoxToolsVisualSync + // + this.groupBoxToolsVisualSync.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxToolsVisualSync.Controls.Add(this.labelToolsEndScene); + this.groupBoxToolsVisualSync.Controls.Add(this.comboBoxToolsEndSceneIndex); + this.groupBoxToolsVisualSync.Controls.Add(this.labelToolsStartScene); + this.groupBoxToolsVisualSync.Controls.Add(this.comboBoxToolsStartSceneIndex); + this.groupBoxToolsVisualSync.Controls.Add(this.comboBoxToolsVerifySeconds); + this.groupBoxToolsVisualSync.Controls.Add(this.labelVerifyButton); + this.groupBoxToolsVisualSync.Location = new System.Drawing.Point(6, 6); + this.groupBoxToolsVisualSync.Name = "groupBoxToolsVisualSync"; + this.groupBoxToolsVisualSync.Size = new System.Drawing.Size(409, 116); + this.groupBoxToolsVisualSync.TabIndex = 2; + this.groupBoxToolsVisualSync.TabStop = false; + this.groupBoxToolsVisualSync.Text = "Visual sync"; + // + // labelToolsEndScene + // + this.labelToolsEndScene.AutoSize = true; + this.labelToolsEndScene.Location = new System.Drawing.Point(13, 79); + this.labelToolsEndScene.Name = "labelToolsEndScene"; + this.labelToolsEndScene.Size = new System.Drawing.Size(122, 13); + this.labelToolsEndScene.TabIndex = 29; + this.labelToolsEndScene.Text = "End scene paragraph is "; + // + // comboBoxToolsEndSceneIndex + // + this.comboBoxToolsEndSceneIndex.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxToolsEndSceneIndex.FormattingEnabled = true; + this.comboBoxToolsEndSceneIndex.Items.AddRange(new object[] { + "Last", + "Last - 1", + "Last - 2", + "Last - 3"}); + this.comboBoxToolsEndSceneIndex.Location = new System.Drawing.Point(200, 76); + this.comboBoxToolsEndSceneIndex.Name = "comboBoxToolsEndSceneIndex"; + this.comboBoxToolsEndSceneIndex.Size = new System.Drawing.Size(86, 21); + this.comboBoxToolsEndSceneIndex.TabIndex = 2; + // + // labelToolsStartScene + // + this.labelToolsStartScene.AutoSize = true; + this.labelToolsStartScene.Location = new System.Drawing.Point(13, 52); + this.labelToolsStartScene.Name = "labelToolsStartScene"; + this.labelToolsStartScene.Size = new System.Drawing.Size(125, 13); + this.labelToolsStartScene.TabIndex = 27; + this.labelToolsStartScene.Text = "Start scene paragraph is"; + // + // comboBoxToolsStartSceneIndex + // + this.comboBoxToolsStartSceneIndex.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxToolsStartSceneIndex.FormattingEnabled = true; + this.comboBoxToolsStartSceneIndex.Items.AddRange(new object[] { + "First", + "First +1", + "First +2", + "First +3"}); + this.comboBoxToolsStartSceneIndex.Location = new System.Drawing.Point(200, 49); + this.comboBoxToolsStartSceneIndex.Name = "comboBoxToolsStartSceneIndex"; + this.comboBoxToolsStartSceneIndex.Size = new System.Drawing.Size(86, 21); + this.comboBoxToolsStartSceneIndex.TabIndex = 1; + // + // comboBoxToolsVerifySeconds + // + this.comboBoxToolsVerifySeconds.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxToolsVerifySeconds.FormattingEnabled = true; + this.comboBoxToolsVerifySeconds.Items.AddRange(new object[] { + "2", + "3", + "4", + "5"}); + this.comboBoxToolsVerifySeconds.Location = new System.Drawing.Point(200, 22); + this.comboBoxToolsVerifySeconds.Name = "comboBoxToolsVerifySeconds"; + this.comboBoxToolsVerifySeconds.Size = new System.Drawing.Size(86, 21); + this.comboBoxToolsVerifySeconds.TabIndex = 0; + // + // labelVerifyButton + // + this.labelVerifyButton.AutoSize = true; + this.labelVerifyButton.Location = new System.Drawing.Point(13, 25); + this.labelVerifyButton.Name = "labelVerifyButton"; + this.labelVerifyButton.Size = new System.Drawing.Size(147, 13); + this.labelVerifyButton.TabIndex = 3; + this.labelVerifyButton.Text = "Play X seconds and back, X is"; + // + // tabPageWordLists + // + this.tabPageWordLists.Controls.Add(this.groupBoxWordLists); + this.tabPageWordLists.Location = new System.Drawing.Point(4, 22); + this.tabPageWordLists.Name = "tabPageWordLists"; + this.tabPageWordLists.Padding = new System.Windows.Forms.Padding(3); + this.tabPageWordLists.Size = new System.Drawing.Size(832, 520); + this.tabPageWordLists.TabIndex = 3; + this.tabPageWordLists.Text = "Word lists"; + this.tabPageWordLists.UseVisualStyleBackColor = true; + // + // groupBoxWordLists + // + this.groupBoxWordLists.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxWordLists.Controls.Add(this.linkLabelOpenDictionaryFolder); + this.groupBoxWordLists.Controls.Add(this.groupBoxOcrFixList); + this.groupBoxWordLists.Controls.Add(this.groupBoxUserWordList); + this.groupBoxWordLists.Controls.Add(this.groupBoxWordListLocation); + this.groupBoxWordLists.Controls.Add(this.groupBoxNamesIgonoreLists); + this.groupBoxWordLists.Controls.Add(this.labelWordListLanguage); + this.groupBoxWordLists.Controls.Add(this.comboBoxWordListLanguage); + this.groupBoxWordLists.Location = new System.Drawing.Point(6, 6); + this.groupBoxWordLists.Name = "groupBoxWordLists"; + this.groupBoxWordLists.Size = new System.Drawing.Size(819, 503); + this.groupBoxWordLists.TabIndex = 2; + this.groupBoxWordLists.TabStop = false; + this.groupBoxWordLists.Text = "Word lists"; + // + // linkLabelOpenDictionaryFolder + // + this.linkLabelOpenDictionaryFolder.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.linkLabelOpenDictionaryFolder.AutoSize = true; + this.linkLabelOpenDictionaryFolder.Location = new System.Drawing.Point(6, 464); + this.linkLabelOpenDictionaryFolder.Name = "linkLabelOpenDictionaryFolder"; + this.linkLabelOpenDictionaryFolder.Size = new System.Drawing.Size(126, 13); + this.linkLabelOpenDictionaryFolder.TabIndex = 29; + this.linkLabelOpenDictionaryFolder.TabStop = true; + this.linkLabelOpenDictionaryFolder.Text = "Open \'Dictionaries\' folder"; + this.linkLabelOpenDictionaryFolder.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabelOpenDictionaryFolder_LinkClicked); + // + // groupBoxOcrFixList + // + this.groupBoxOcrFixList.Controls.Add(this.textBoxOcrFixValue); + this.groupBoxOcrFixList.Controls.Add(this.buttonRemoveOcrFix); + this.groupBoxOcrFixList.Controls.Add(this.listBoxOcrFixList); + this.groupBoxOcrFixList.Controls.Add(this.textBoxOcrFixKey); + this.groupBoxOcrFixList.Controls.Add(this.buttonAddOcrFix); + this.groupBoxOcrFixList.Location = new System.Drawing.Point(510, 43); + this.groupBoxOcrFixList.Name = "groupBoxOcrFixList"; + this.groupBoxOcrFixList.Size = new System.Drawing.Size(293, 279); + this.groupBoxOcrFixList.TabIndex = 6; + this.groupBoxOcrFixList.TabStop = false; + this.groupBoxOcrFixList.Text = "OCR fix list"; + // + // textBoxOcrFixValue + // + this.textBoxOcrFixValue.Location = new System.Drawing.Point(100, 248); + this.textBoxOcrFixValue.Name = "textBoxOcrFixValue"; + this.textBoxOcrFixValue.Size = new System.Drawing.Size(85, 21); + this.textBoxOcrFixValue.TabIndex = 45; + this.textBoxOcrFixValue.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxOcrFixValueKeyDown); + // + // buttonRemoveOcrFix + // + this.buttonRemoveOcrFix.Location = new System.Drawing.Point(191, 16); + this.buttonRemoveOcrFix.Name = "buttonRemoveOcrFix"; + this.buttonRemoveOcrFix.Size = new System.Drawing.Size(75, 23); + this.buttonRemoveOcrFix.TabIndex = 42; + this.buttonRemoveOcrFix.Text = "Remove"; + this.buttonRemoveOcrFix.UseVisualStyleBackColor = true; + this.buttonRemoveOcrFix.Click += new System.EventHandler(this.ButtonRemoveOcrFixClick); + // + // listBoxOcrFixList + // + this.listBoxOcrFixList.FormattingEnabled = true; + this.listBoxOcrFixList.Location = new System.Drawing.Point(6, 16); + this.listBoxOcrFixList.Name = "listBoxOcrFixList"; + this.listBoxOcrFixList.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended; + this.listBoxOcrFixList.Size = new System.Drawing.Size(179, 225); + this.listBoxOcrFixList.TabIndex = 40; + this.listBoxOcrFixList.SelectedIndexChanged += new System.EventHandler(this.ListBoxOcrFixListSelectedIndexChanged); + this.listBoxOcrFixList.DoubleClick += new System.EventHandler(this.listBoxOcrFixList_DoubleClick); + this.listBoxOcrFixList.Enter += new System.EventHandler(this.ListBoxSearchReset); + this.listBoxOcrFixList.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ListBoxKeyDownSearch); + // + // textBoxOcrFixKey + // + this.textBoxOcrFixKey.Location = new System.Drawing.Point(6, 248); + this.textBoxOcrFixKey.Name = "textBoxOcrFixKey"; + this.textBoxOcrFixKey.Size = new System.Drawing.Size(88, 21); + this.textBoxOcrFixKey.TabIndex = 44; + // + // buttonAddOcrFix + // + this.buttonAddOcrFix.Location = new System.Drawing.Point(191, 247); + this.buttonAddOcrFix.Name = "buttonAddOcrFix"; + this.buttonAddOcrFix.Size = new System.Drawing.Size(75, 23); + this.buttonAddOcrFix.TabIndex = 46; + this.buttonAddOcrFix.Text = "Add pair"; + this.buttonAddOcrFix.UseVisualStyleBackColor = true; + this.buttonAddOcrFix.Click += new System.EventHandler(this.ButtonAddOcrFixClick); + // + // groupBoxUserWordList + // + this.groupBoxUserWordList.Controls.Add(this.buttonRemoveUserWord); + this.groupBoxUserWordList.Controls.Add(this.listBoxUserWordLists); + this.groupBoxUserWordList.Controls.Add(this.textBoxUserWord); + this.groupBoxUserWordList.Controls.Add(this.buttonAddUserWord); + this.groupBoxUserWordList.Location = new System.Drawing.Point(259, 43); + this.groupBoxUserWordList.Name = "groupBoxUserWordList"; + this.groupBoxUserWordList.Size = new System.Drawing.Size(241, 279); + this.groupBoxUserWordList.TabIndex = 4; + this.groupBoxUserWordList.TabStop = false; + this.groupBoxUserWordList.Text = "User word list"; + // + // buttonRemoveUserWord + // + this.buttonRemoveUserWord.Location = new System.Drawing.Point(159, 16); + this.buttonRemoveUserWord.Name = "buttonRemoveUserWord"; + this.buttonRemoveUserWord.Size = new System.Drawing.Size(75, 23); + this.buttonRemoveUserWord.TabIndex = 32; + this.buttonRemoveUserWord.Text = "Remove"; + this.buttonRemoveUserWord.UseVisualStyleBackColor = true; + this.buttonRemoveUserWord.Click += new System.EventHandler(this.ButtonRemoveUserWordClick); + // + // listBoxUserWordLists + // + this.listBoxUserWordLists.FormattingEnabled = true; + this.listBoxUserWordLists.Location = new System.Drawing.Point(3, 16); + this.listBoxUserWordLists.Name = "listBoxUserWordLists"; + this.listBoxUserWordLists.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended; + this.listBoxUserWordLists.Size = new System.Drawing.Size(150, 225); + this.listBoxUserWordLists.TabIndex = 30; + this.listBoxUserWordLists.SelectedIndexChanged += new System.EventHandler(this.ListBoxUserWordListsSelectedIndexChanged); + this.listBoxUserWordLists.DoubleClick += new System.EventHandler(this.listBoxUserWordLists_DoubleClick); + this.listBoxUserWordLists.Enter += new System.EventHandler(this.ListBoxSearchReset); + this.listBoxUserWordLists.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ListBoxKeyDownSearch); + // + // textBoxUserWord + // + this.textBoxUserWord.Location = new System.Drawing.Point(3, 248); + this.textBoxUserWord.Name = "textBoxUserWord"; + this.textBoxUserWord.Size = new System.Drawing.Size(150, 21); + this.textBoxUserWord.TabIndex = 34; + this.textBoxUserWord.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxUserWordKeyDown); + // + // buttonAddUserWord + // + this.buttonAddUserWord.Location = new System.Drawing.Point(157, 247); + this.buttonAddUserWord.Name = "buttonAddUserWord"; + this.buttonAddUserWord.Size = new System.Drawing.Size(75, 23); + this.buttonAddUserWord.TabIndex = 36; + this.buttonAddUserWord.Text = "Add word"; + this.buttonAddUserWord.UseVisualStyleBackColor = true; + this.buttonAddUserWord.Click += new System.EventHandler(this.ButtonAddUserWordClick); + // + // groupBoxWordListLocation + // + this.groupBoxWordListLocation.Controls.Add(this.checkBoxNamesOnline); + this.groupBoxWordListLocation.Controls.Add(this.textBoxNamesOnline); + this.groupBoxWordListLocation.Location = new System.Drawing.Point(6, 328); + this.groupBoxWordListLocation.Name = "groupBoxWordListLocation"; + this.groupBoxWordListLocation.Size = new System.Drawing.Size(797, 92); + this.groupBoxWordListLocation.TabIndex = 8; + this.groupBoxWordListLocation.TabStop = false; + this.groupBoxWordListLocation.Text = "Location"; + // + // checkBoxNamesOnline + // + this.checkBoxNamesOnline.AutoSize = true; + this.checkBoxNamesOnline.Location = new System.Drawing.Point(7, 22); + this.checkBoxNamesOnline.Name = "checkBoxNamesOnline"; + this.checkBoxNamesOnline.Size = new System.Drawing.Size(145, 17); + this.checkBoxNamesOnline.TabIndex = 26; + this.checkBoxNamesOnline.Text = "Use online names xml file"; + this.checkBoxNamesOnline.UseVisualStyleBackColor = true; + // + // textBoxNamesOnline + // + this.textBoxNamesOnline.Location = new System.Drawing.Point(6, 45); + this.textBoxNamesOnline.Name = "textBoxNamesOnline"; + this.textBoxNamesOnline.Size = new System.Drawing.Size(764, 21); + this.textBoxNamesOnline.TabIndex = 28; + this.textBoxNamesOnline.Text = "https://raw.githubusercontent.com/SubtitleEdit/subtitleedit/master/Dictionaries/n" + + "ames.xml"; + // + // groupBoxNamesIgonoreLists + // + this.groupBoxNamesIgonoreLists.Controls.Add(this.buttonRemoveNameEtc); + this.groupBoxNamesIgonoreLists.Controls.Add(this.listBoxNames); + this.groupBoxNamesIgonoreLists.Controls.Add(this.textBoxNameEtc); + this.groupBoxNamesIgonoreLists.Controls.Add(this.buttonAddNames); + this.groupBoxNamesIgonoreLists.Location = new System.Drawing.Point(6, 43); + this.groupBoxNamesIgonoreLists.Name = "groupBoxNamesIgonoreLists"; + this.groupBoxNamesIgonoreLists.Size = new System.Drawing.Size(241, 279); + this.groupBoxNamesIgonoreLists.TabIndex = 2; + this.groupBoxNamesIgonoreLists.TabStop = false; + this.groupBoxNamesIgonoreLists.Text = "Names/ignore lists"; + // + // buttonRemoveNameEtc + // + this.buttonRemoveNameEtc.Location = new System.Drawing.Point(159, 16); + this.buttonRemoveNameEtc.Name = "buttonRemoveNameEtc"; + this.buttonRemoveNameEtc.Size = new System.Drawing.Size(75, 23); + this.buttonRemoveNameEtc.TabIndex = 22; + this.buttonRemoveNameEtc.Text = "Remove"; + this.buttonRemoveNameEtc.UseVisualStyleBackColor = true; + this.buttonRemoveNameEtc.Click += new System.EventHandler(this.ButtonRemoveNameEtcClick); + // + // listBoxNames + // + this.listBoxNames.FormattingEnabled = true; + this.listBoxNames.Location = new System.Drawing.Point(3, 16); + this.listBoxNames.Name = "listBoxNames"; + this.listBoxNames.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended; + this.listBoxNames.Size = new System.Drawing.Size(150, 225); + this.listBoxNames.TabIndex = 20; + this.listBoxNames.SelectedIndexChanged += new System.EventHandler(this.ListBoxNamesSelectedIndexChanged); + this.listBoxNames.DoubleClick += new System.EventHandler(this.listBoxNames_DoubleClick); + this.listBoxNames.Enter += new System.EventHandler(this.ListBoxSearchReset); + this.listBoxNames.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ListBoxKeyDownSearch); + // + // textBoxNameEtc + // + this.textBoxNameEtc.Location = new System.Drawing.Point(3, 248); + this.textBoxNameEtc.Name = "textBoxNameEtc"; + this.textBoxNameEtc.Size = new System.Drawing.Size(151, 21); + this.textBoxNameEtc.TabIndex = 24; + this.textBoxNameEtc.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxNameEtcKeyDown); + // + // buttonAddNames + // + this.buttonAddNames.Location = new System.Drawing.Point(160, 247); + this.buttonAddNames.Name = "buttonAddNames"; + this.buttonAddNames.Size = new System.Drawing.Size(75, 23); + this.buttonAddNames.TabIndex = 26; + this.buttonAddNames.Text = "Add name"; + this.buttonAddNames.UseVisualStyleBackColor = true; + this.buttonAddNames.Click += new System.EventHandler(this.ButtonAddNamesClick); + // + // labelWordListLanguage + // + this.labelWordListLanguage.AutoSize = true; + this.labelWordListLanguage.Location = new System.Drawing.Point(6, 19); + this.labelWordListLanguage.Name = "labelWordListLanguage"; + this.labelWordListLanguage.Size = new System.Drawing.Size(54, 13); + this.labelWordListLanguage.TabIndex = 1; + this.labelWordListLanguage.Text = "Language"; + // + // comboBoxWordListLanguage + // + this.comboBoxWordListLanguage.FormattingEnabled = true; + this.comboBoxWordListLanguage.Location = new System.Drawing.Point(67, 16); + this.comboBoxWordListLanguage.Name = "comboBoxWordListLanguage"; + this.comboBoxWordListLanguage.Size = new System.Drawing.Size(155, 21); + this.comboBoxWordListLanguage.TabIndex = 0; + this.comboBoxWordListLanguage.SelectedIndexChanged += new System.EventHandler(this.ComboBoxWordListLanguageSelectedIndexChanged); + // + // tabPageToolBar + // + this.tabPageToolBar.Controls.Add(this.groupBox2); + this.tabPageToolBar.Controls.Add(this.groupBoxShowToolBarButtons); + this.tabPageToolBar.Location = new System.Drawing.Point(4, 22); + this.tabPageToolBar.Name = "tabPageToolBar"; + this.tabPageToolBar.Padding = new System.Windows.Forms.Padding(3); + this.tabPageToolBar.Size = new System.Drawing.Size(832, 520); + this.tabPageToolBar.TabIndex = 7; + this.tabPageToolBar.Text = "Toolbar "; + this.tabPageToolBar.UseVisualStyleBackColor = true; + // + // groupBox2 + // + this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBox2.Controls.Add(this.checkBoxShowFrameRate); + this.groupBox2.Location = new System.Drawing.Point(7, 248); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(818, 261); + this.groupBox2.TabIndex = 35; + this.groupBox2.TabStop = false; + // + // checkBoxShowFrameRate + // + this.checkBoxShowFrameRate.AutoSize = true; + this.checkBoxShowFrameRate.Location = new System.Drawing.Point(16, 20); + this.checkBoxShowFrameRate.Name = "checkBoxShowFrameRate"; + this.checkBoxShowFrameRate.Size = new System.Drawing.Size(154, 17); + this.checkBoxShowFrameRate.TabIndex = 34; + this.checkBoxShowFrameRate.Text = "Show frame rate in toolbar"; + this.checkBoxShowFrameRate.UseVisualStyleBackColor = true; + // + // groupBoxShowToolBarButtons + // + this.groupBoxShowToolBarButtons.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxShowToolBarButtons.Controls.Add(this.labelTBNetflixQualityCheck); + this.groupBoxShowToolBarButtons.Controls.Add(this.pictureBoxNetflixQualityCheck); + this.groupBoxShowToolBarButtons.Controls.Add(this.checkBoxNetflixQualityCheck); + this.groupBoxShowToolBarButtons.Controls.Add(this.labelTBRemoveTextForHi); + this.groupBoxShowToolBarButtons.Controls.Add(this.pictureBoxTBRemoveTextForHi); + this.groupBoxShowToolBarButtons.Controls.Add(this.checkBoxTBRemoveTextForHi); + this.groupBoxShowToolBarButtons.Controls.Add(this.labelTBFixCommonErrors); + this.groupBoxShowToolBarButtons.Controls.Add(this.pictureBoxTBFixCommonErrors); + this.groupBoxShowToolBarButtons.Controls.Add(this.checkBoxTBFixCommonErrors); + this.groupBoxShowToolBarButtons.Controls.Add(this.labelTBHelp); + this.groupBoxShowToolBarButtons.Controls.Add(this.pictureBoxHelp); + this.groupBoxShowToolBarButtons.Controls.Add(this.checkBoxHelp); + this.groupBoxShowToolBarButtons.Controls.Add(this.labelTBSettings); + this.groupBoxShowToolBarButtons.Controls.Add(this.pictureBoxSettings); + this.groupBoxShowToolBarButtons.Controls.Add(this.checkBoxSettings); + this.groupBoxShowToolBarButtons.Controls.Add(this.labelTBSpellCheck); + this.groupBoxShowToolBarButtons.Controls.Add(this.pictureBoxSpellCheck); + this.groupBoxShowToolBarButtons.Controls.Add(this.checkBoxSpellCheck); + this.groupBoxShowToolBarButtons.Controls.Add(this.labelTBVisualSync); + this.groupBoxShowToolBarButtons.Controls.Add(this.pictureBoxVisualSync); + this.groupBoxShowToolBarButtons.Controls.Add(this.checkBoxVisualSync); + this.groupBoxShowToolBarButtons.Controls.Add(this.labelTBReplace); + this.groupBoxShowToolBarButtons.Controls.Add(this.pictureBoxReplace); + this.groupBoxShowToolBarButtons.Controls.Add(this.checkBoxReplace); + this.groupBoxShowToolBarButtons.Controls.Add(this.labelTBFind); + this.groupBoxShowToolBarButtons.Controls.Add(this.pictureBoxFind); + this.groupBoxShowToolBarButtons.Controls.Add(this.checkBoxToolbarFind); + this.groupBoxShowToolBarButtons.Controls.Add(this.labelTBSaveAs); + this.groupBoxShowToolBarButtons.Controls.Add(this.pictureBoxSaveAs); + this.groupBoxShowToolBarButtons.Controls.Add(this.checkBoxToolbarSaveAs); + this.groupBoxShowToolBarButtons.Controls.Add(this.labelTBSave); + this.groupBoxShowToolBarButtons.Controls.Add(this.pictureBoxSave); + this.groupBoxShowToolBarButtons.Controls.Add(this.checkBoxToolbarSave); + this.groupBoxShowToolBarButtons.Controls.Add(this.labelTBOpen); + this.groupBoxShowToolBarButtons.Controls.Add(this.pictureBoxOpen); + this.groupBoxShowToolBarButtons.Controls.Add(this.checkBoxToolbarOpen); + this.groupBoxShowToolBarButtons.Controls.Add(this.labelTBNew); + this.groupBoxShowToolBarButtons.Controls.Add(this.pictureBoxNew); + this.groupBoxShowToolBarButtons.Controls.Add(this.checkBoxToolbarNew); + this.groupBoxShowToolBarButtons.Location = new System.Drawing.Point(6, 6); + this.groupBoxShowToolBarButtons.Name = "groupBoxShowToolBarButtons"; + this.groupBoxShowToolBarButtons.Size = new System.Drawing.Size(819, 236); + this.groupBoxShowToolBarButtons.TabIndex = 0; + this.groupBoxShowToolBarButtons.TabStop = false; + this.groupBoxShowToolBarButtons.Text = "Show toolbar buttons"; + // + // labelTBNetflixQualityCheck + // + this.labelTBNetflixQualityCheck.AutoSize = true; + this.labelTBNetflixQualityCheck.Location = new System.Drawing.Point(636, 136); + this.labelTBNetflixQualityCheck.Name = "labelTBNetflixQualityCheck"; + this.labelTBNetflixQualityCheck.Size = new System.Drawing.Size(103, 13); + this.labelTBNetflixQualityCheck.TabIndex = 42; + this.labelTBNetflixQualityCheck.Text = "Netflix quality check"; + // + // pictureBoxNetflixQualityCheck + // + this.pictureBoxNetflixQualityCheck.Location = new System.Drawing.Point(649, 155); + this.pictureBoxNetflixQualityCheck.Name = "pictureBoxNetflixQualityCheck"; + this.pictureBoxNetflixQualityCheck.Size = new System.Drawing.Size(32, 32); + this.pictureBoxNetflixQualityCheck.TabIndex = 41; + this.pictureBoxNetflixQualityCheck.TabStop = false; + // + // checkBoxNetflixQualityCheck + // + this.checkBoxNetflixQualityCheck.AutoSize = true; + this.checkBoxNetflixQualityCheck.Location = new System.Drawing.Point(652, 195); + this.checkBoxNetflixQualityCheck.Name = "checkBoxNetflixQualityCheck"; + this.checkBoxNetflixQualityCheck.Size = new System.Drawing.Size(55, 17); + this.checkBoxNetflixQualityCheck.TabIndex = 40; + this.checkBoxNetflixQualityCheck.Text = "Visible"; + this.checkBoxNetflixQualityCheck.UseVisualStyleBackColor = true; + // + // labelTBRemoveTextForHi + // + this.labelTBRemoveTextForHi.AutoSize = true; + this.labelTBRemoveTextForHi.Location = new System.Drawing.Point(124, 136); + this.labelTBRemoveTextForHi.Name = "labelTBRemoveTextForHi"; + this.labelTBRemoveTextForHi.Size = new System.Drawing.Size(100, 13); + this.labelTBRemoveTextForHi.TabIndex = 39; + this.labelTBRemoveTextForHi.Text = "Remove text for HI"; + // + // pictureBoxTBRemoveTextForHi + // + this.pictureBoxTBRemoveTextForHi.Location = new System.Drawing.Point(137, 155); + this.pictureBoxTBRemoveTextForHi.Name = "pictureBoxTBRemoveTextForHi"; + this.pictureBoxTBRemoveTextForHi.Size = new System.Drawing.Size(32, 32); + this.pictureBoxTBRemoveTextForHi.TabIndex = 38; + this.pictureBoxTBRemoveTextForHi.TabStop = false; + // + // checkBoxTBRemoveTextForHi + // + this.checkBoxTBRemoveTextForHi.AutoSize = true; + this.checkBoxTBRemoveTextForHi.Location = new System.Drawing.Point(140, 195); + this.checkBoxTBRemoveTextForHi.Name = "checkBoxTBRemoveTextForHi"; + this.checkBoxTBRemoveTextForHi.Size = new System.Drawing.Size(55, 17); + this.checkBoxTBRemoveTextForHi.TabIndex = 18; + this.checkBoxTBRemoveTextForHi.Text = "Visible"; + this.checkBoxTBRemoveTextForHi.UseVisualStyleBackColor = true; + // + // labelTBFixCommonErrors + // + this.labelTBFixCommonErrors.AutoSize = true; + this.labelTBFixCommonErrors.Location = new System.Drawing.Point(9, 136); + this.labelTBFixCommonErrors.Name = "labelTBFixCommonErrors"; + this.labelTBFixCommonErrors.Size = new System.Drawing.Size(95, 13); + this.labelTBFixCommonErrors.TabIndex = 36; + this.labelTBFixCommonErrors.Text = "Fix common errors"; + // + // pictureBoxTBFixCommonErrors + // + this.pictureBoxTBFixCommonErrors.Location = new System.Drawing.Point(22, 155); + this.pictureBoxTBFixCommonErrors.Name = "pictureBoxTBFixCommonErrors"; + this.pictureBoxTBFixCommonErrors.Size = new System.Drawing.Size(32, 32); + this.pictureBoxTBFixCommonErrors.TabIndex = 35; + this.pictureBoxTBFixCommonErrors.TabStop = false; + // + // checkBoxTBFixCommonErrors + // + this.checkBoxTBFixCommonErrors.AutoSize = true; + this.checkBoxTBFixCommonErrors.Location = new System.Drawing.Point(25, 195); + this.checkBoxTBFixCommonErrors.Name = "checkBoxTBFixCommonErrors"; + this.checkBoxTBFixCommonErrors.Size = new System.Drawing.Size(55, 17); + this.checkBoxTBFixCommonErrors.TabIndex = 17; + this.checkBoxTBFixCommonErrors.Text = "Visible"; + this.checkBoxTBFixCommonErrors.UseVisualStyleBackColor = true; + // + // labelTBHelp + // + this.labelTBHelp.AutoSize = true; + this.labelTBHelp.Location = new System.Drawing.Point(561, 136); + this.labelTBHelp.Name = "labelTBHelp"; + this.labelTBHelp.Size = new System.Drawing.Size(28, 13); + this.labelTBHelp.TabIndex = 33; + this.labelTBHelp.Text = "Help"; + // + // pictureBoxHelp + // + this.pictureBoxHelp.Location = new System.Drawing.Point(560, 155); + this.pictureBoxHelp.Name = "pictureBoxHelp"; + this.pictureBoxHelp.Size = new System.Drawing.Size(32, 32); + this.pictureBoxHelp.TabIndex = 32; + this.pictureBoxHelp.TabStop = false; + // + // checkBoxHelp + // + this.checkBoxHelp.AutoSize = true; + this.checkBoxHelp.Location = new System.Drawing.Point(563, 195); + this.checkBoxHelp.Name = "checkBoxHelp"; + this.checkBoxHelp.Size = new System.Drawing.Size(55, 17); + this.checkBoxHelp.TabIndex = 22; + this.checkBoxHelp.Text = "Visible"; + this.checkBoxHelp.UseVisualStyleBackColor = true; + // + // labelTBSettings + // + this.labelTBSettings.AutoSize = true; + this.labelTBSettings.Location = new System.Drawing.Point(456, 136); + this.labelTBSettings.Name = "labelTBSettings"; + this.labelTBSettings.Size = new System.Drawing.Size(46, 13); + this.labelTBSettings.TabIndex = 30; + this.labelTBSettings.Text = "Settings"; + // + // pictureBoxSettings + // + this.pictureBoxSettings.Location = new System.Drawing.Point(459, 155); + this.pictureBoxSettings.Name = "pictureBoxSettings"; + this.pictureBoxSettings.Size = new System.Drawing.Size(32, 32); + this.pictureBoxSettings.TabIndex = 29; + this.pictureBoxSettings.TabStop = false; + // + // checkBoxSettings + // + this.checkBoxSettings.AutoSize = true; + this.checkBoxSettings.Location = new System.Drawing.Point(462, 195); + this.checkBoxSettings.Name = "checkBoxSettings"; + this.checkBoxSettings.Size = new System.Drawing.Size(55, 17); + this.checkBoxSettings.TabIndex = 21; + this.checkBoxSettings.Text = "Visible"; + this.checkBoxSettings.UseVisualStyleBackColor = true; + // + // labelTBSpellCheck + // + this.labelTBSpellCheck.AutoSize = true; + this.labelTBSpellCheck.Location = new System.Drawing.Point(357, 136); + this.labelTBSpellCheck.Name = "labelTBSpellCheck"; + this.labelTBSpellCheck.Size = new System.Drawing.Size(59, 13); + this.labelTBSpellCheck.TabIndex = 27; + this.labelTBSpellCheck.Text = "Spell check"; + // + // pictureBoxSpellCheck + // + this.pictureBoxSpellCheck.Location = new System.Drawing.Point(361, 155); + this.pictureBoxSpellCheck.Name = "pictureBoxSpellCheck"; + this.pictureBoxSpellCheck.Size = new System.Drawing.Size(32, 32); + this.pictureBoxSpellCheck.TabIndex = 26; + this.pictureBoxSpellCheck.TabStop = false; + // + // checkBoxSpellCheck + // + this.checkBoxSpellCheck.AutoSize = true; + this.checkBoxSpellCheck.Location = new System.Drawing.Point(362, 195); + this.checkBoxSpellCheck.Name = "checkBoxSpellCheck"; + this.checkBoxSpellCheck.Size = new System.Drawing.Size(55, 17); + this.checkBoxSpellCheck.TabIndex = 20; + this.checkBoxSpellCheck.Text = "Visible"; + this.checkBoxSpellCheck.UseVisualStyleBackColor = true; + // + // labelTBVisualSync + // + this.labelTBVisualSync.AutoSize = true; + this.labelTBVisualSync.Location = new System.Drawing.Point(247, 136); + this.labelTBVisualSync.Name = "labelTBVisualSync"; + this.labelTBVisualSync.Size = new System.Drawing.Size(59, 13); + this.labelTBVisualSync.TabIndex = 21; + this.labelTBVisualSync.Text = "Visual sync"; + // + // pictureBoxVisualSync + // + this.pictureBoxVisualSync.Location = new System.Drawing.Point(260, 155); + this.pictureBoxVisualSync.Name = "pictureBoxVisualSync"; + this.pictureBoxVisualSync.Size = new System.Drawing.Size(32, 32); + this.pictureBoxVisualSync.TabIndex = 20; + this.pictureBoxVisualSync.TabStop = false; + // + // checkBoxVisualSync + // + this.checkBoxVisualSync.AutoSize = true; + this.checkBoxVisualSync.Location = new System.Drawing.Point(263, 195); + this.checkBoxVisualSync.Name = "checkBoxVisualSync"; + this.checkBoxVisualSync.Size = new System.Drawing.Size(55, 17); + this.checkBoxVisualSync.TabIndex = 19; + this.checkBoxVisualSync.Text = "Visible"; + this.checkBoxVisualSync.UseVisualStyleBackColor = true; + // + // labelTBReplace + // + this.labelTBReplace.AutoSize = true; + this.labelTBReplace.Location = new System.Drawing.Point(521, 22); + this.labelTBReplace.Name = "labelTBReplace"; + this.labelTBReplace.Size = new System.Drawing.Size(45, 13); + this.labelTBReplace.TabIndex = 18; + this.labelTBReplace.Text = "Replace"; + // + // pictureBoxReplace + // + this.pictureBoxReplace.Location = new System.Drawing.Point(526, 41); + this.pictureBoxReplace.Name = "pictureBoxReplace"; + this.pictureBoxReplace.Size = new System.Drawing.Size(32, 32); + this.pictureBoxReplace.TabIndex = 17; + this.pictureBoxReplace.TabStop = false; + // + // checkBoxReplace + // + this.checkBoxReplace.AutoSize = true; + this.checkBoxReplace.Location = new System.Drawing.Point(529, 81); + this.checkBoxReplace.Name = "checkBoxReplace"; + this.checkBoxReplace.Size = new System.Drawing.Size(55, 17); + this.checkBoxReplace.TabIndex = 16; + this.checkBoxReplace.Text = "Visible"; + this.checkBoxReplace.UseVisualStyleBackColor = true; + // + // labelTBFind + // + this.labelTBFind.AutoSize = true; + this.labelTBFind.Location = new System.Drawing.Point(425, 22); + this.labelTBFind.Name = "labelTBFind"; + this.labelTBFind.Size = new System.Drawing.Size(27, 13); + this.labelTBFind.TabIndex = 15; + this.labelTBFind.Text = "Find"; + // + // pictureBoxFind + // + this.pictureBoxFind.Location = new System.Drawing.Point(423, 41); + this.pictureBoxFind.Name = "pictureBoxFind"; + this.pictureBoxFind.Size = new System.Drawing.Size(32, 32); + this.pictureBoxFind.TabIndex = 14; + this.pictureBoxFind.TabStop = false; + // + // checkBoxToolbarFind + // + this.checkBoxToolbarFind.AutoSize = true; + this.checkBoxToolbarFind.Location = new System.Drawing.Point(426, 81); + this.checkBoxToolbarFind.Name = "checkBoxToolbarFind"; + this.checkBoxToolbarFind.Size = new System.Drawing.Size(55, 17); + this.checkBoxToolbarFind.TabIndex = 13; + this.checkBoxToolbarFind.Text = "Visible"; + this.checkBoxToolbarFind.UseVisualStyleBackColor = true; + // + // labelTBSaveAs + // + this.labelTBSaveAs.AutoSize = true; + this.labelTBSaveAs.Location = new System.Drawing.Point(316, 22); + this.labelTBSaveAs.Name = "labelTBSaveAs"; + this.labelTBSaveAs.Size = new System.Drawing.Size(45, 13); + this.labelTBSaveAs.TabIndex = 12; + this.labelTBSaveAs.Text = "Save as"; + // + // pictureBoxSaveAs + // + this.pictureBoxSaveAs.Location = new System.Drawing.Point(322, 41); + this.pictureBoxSaveAs.Name = "pictureBoxSaveAs"; + this.pictureBoxSaveAs.Size = new System.Drawing.Size(32, 32); + this.pictureBoxSaveAs.TabIndex = 11; + this.pictureBoxSaveAs.TabStop = false; + // + // checkBoxToolbarSaveAs + // + this.checkBoxToolbarSaveAs.AutoSize = true; + this.checkBoxToolbarSaveAs.Location = new System.Drawing.Point(325, 81); + this.checkBoxToolbarSaveAs.Name = "checkBoxToolbarSaveAs"; + this.checkBoxToolbarSaveAs.Size = new System.Drawing.Size(55, 17); + this.checkBoxToolbarSaveAs.TabIndex = 10; + this.checkBoxToolbarSaveAs.Text = "Visible"; + this.checkBoxToolbarSaveAs.UseVisualStyleBackColor = true; + // + // labelTBSave + // + this.labelTBSave.AutoSize = true; + this.labelTBSave.Location = new System.Drawing.Point(225, 22); + this.labelTBSave.Name = "labelTBSave"; + this.labelTBSave.Size = new System.Drawing.Size(31, 13); + this.labelTBSave.TabIndex = 9; + this.labelTBSave.Text = "Save"; + // + // pictureBoxSave + // + this.pictureBoxSave.Location = new System.Drawing.Point(224, 41); + this.pictureBoxSave.Name = "pictureBoxSave"; + this.pictureBoxSave.Size = new System.Drawing.Size(32, 32); + this.pictureBoxSave.TabIndex = 8; + this.pictureBoxSave.TabStop = false; + // + // checkBoxToolbarSave + // + this.checkBoxToolbarSave.AutoSize = true; + this.checkBoxToolbarSave.Location = new System.Drawing.Point(227, 81); + this.checkBoxToolbarSave.Name = "checkBoxToolbarSave"; + this.checkBoxToolbarSave.Size = new System.Drawing.Size(55, 17); + this.checkBoxToolbarSave.TabIndex = 7; + this.checkBoxToolbarSave.Text = "Visible"; + this.checkBoxToolbarSave.UseVisualStyleBackColor = true; + // + // labelTBOpen + // + this.labelTBOpen.AutoSize = true; + this.labelTBOpen.Location = new System.Drawing.Point(124, 22); + this.labelTBOpen.Name = "labelTBOpen"; + this.labelTBOpen.Size = new System.Drawing.Size(33, 13); + this.labelTBOpen.TabIndex = 6; + this.labelTBOpen.Text = "Open"; + // + // pictureBoxOpen + // + this.pictureBoxOpen.Location = new System.Drawing.Point(123, 41); + this.pictureBoxOpen.Name = "pictureBoxOpen"; + this.pictureBoxOpen.Size = new System.Drawing.Size(32, 32); + this.pictureBoxOpen.TabIndex = 5; + this.pictureBoxOpen.TabStop = false; + // + // checkBoxToolbarOpen + // + this.checkBoxToolbarOpen.AutoSize = true; + this.checkBoxToolbarOpen.Location = new System.Drawing.Point(126, 81); + this.checkBoxToolbarOpen.Name = "checkBoxToolbarOpen"; + this.checkBoxToolbarOpen.Size = new System.Drawing.Size(55, 17); + this.checkBoxToolbarOpen.TabIndex = 4; + this.checkBoxToolbarOpen.Text = "Visible"; + this.checkBoxToolbarOpen.UseVisualStyleBackColor = true; + // + // labelTBNew + // + this.labelTBNew.AutoSize = true; + this.labelTBNew.Location = new System.Drawing.Point(24, 22); + this.labelTBNew.Name = "labelTBNew"; + this.labelTBNew.Size = new System.Drawing.Size(28, 13); + this.labelTBNew.TabIndex = 3; + this.labelTBNew.Text = "New"; + // + // pictureBoxNew + // + this.pictureBoxNew.Location = new System.Drawing.Point(22, 41); + this.pictureBoxNew.Name = "pictureBoxNew"; + this.pictureBoxNew.Size = new System.Drawing.Size(32, 32); + this.pictureBoxNew.TabIndex = 2; + this.pictureBoxNew.TabStop = false; + // + // checkBoxToolbarNew + // + this.checkBoxToolbarNew.AutoSize = true; + this.checkBoxToolbarNew.Location = new System.Drawing.Point(25, 81); + this.checkBoxToolbarNew.Name = "checkBoxToolbarNew"; + this.checkBoxToolbarNew.Size = new System.Drawing.Size(55, 17); + this.checkBoxToolbarNew.TabIndex = 1; + this.checkBoxToolbarNew.Text = "Visible"; + this.checkBoxToolbarNew.UseVisualStyleBackColor = true; + // + // tabPageFont + // + this.tabPageFont.Controls.Add(this.groupBoxFont); + this.tabPageFont.Location = new System.Drawing.Point(4, 22); + this.tabPageFont.Name = "tabPageFont"; + this.tabPageFont.Size = new System.Drawing.Size(832, 520); + this.tabPageFont.TabIndex = 10; + this.tabPageFont.Text = "Font"; + this.tabPageFont.UseVisualStyleBackColor = true; + // + // groupBoxFont + // + this.groupBoxFont.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxFont.Controls.Add(this.labelFontNote); + this.groupBoxFont.Controls.Add(this.groupBoxFontTextBox); + this.groupBoxFont.Controls.Add(this.groupBoxFontListViews); + this.groupBoxFont.Controls.Add(this.groupBoxFontGeneral); + this.groupBoxFont.Location = new System.Drawing.Point(3, 3); + this.groupBoxFont.Name = "groupBoxFont"; + this.groupBoxFont.Size = new System.Drawing.Size(826, 509); + this.groupBoxFont.TabIndex = 0; + this.groupBoxFont.TabStop = false; + this.groupBoxFont.Text = "Font in UI"; + // + // labelFontNote + // + this.labelFontNote.AutoSize = true; + this.labelFontNote.Location = new System.Drawing.Point(11, 352); + this.labelFontNote.Name = "labelFontNote"; + this.labelFontNote.Size = new System.Drawing.Size(278, 13); + this.labelFontNote.TabIndex = 41; + this.labelFontNote.Text = "Note: This is only to set the font in the Subtitle Edit UI..."; + // + // groupBoxFontTextBox + // + this.groupBoxFontTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxFontTextBox.Controls.Add(this.panelTextBoxAssColor); + this.groupBoxFontTextBox.Controls.Add(this.buttonTextBoxAssColor); + this.groupBoxFontTextBox.Controls.Add(this.panelTextBoxHtmlColor); + this.groupBoxFontTextBox.Controls.Add(this.buttonTextBoxHtmlColor); + this.groupBoxFontTextBox.Controls.Add(this.checkBoxSubtitleTextBoxSyntaxColor); + this.groupBoxFontTextBox.Controls.Add(this.labelSubtitleFontSize); + this.groupBoxFontTextBox.Controls.Add(this.comboBoxSubtitleFontSize); + this.groupBoxFontTextBox.Controls.Add(this.checkBoxSubtitleFontBold); + this.groupBoxFontTextBox.Controls.Add(this.checkBoxSubtitleCenter); + this.groupBoxFontTextBox.Location = new System.Drawing.Point(14, 228); + this.groupBoxFontTextBox.Name = "groupBoxFontTextBox"; + this.groupBoxFontTextBox.Size = new System.Drawing.Size(806, 116); + this.groupBoxFontTextBox.TabIndex = 40; + this.groupBoxFontTextBox.TabStop = false; + this.groupBoxFontTextBox.Text = "Text box"; + // + // panelTextBoxAssColor + // + this.panelTextBoxAssColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelTextBoxAssColor.Location = new System.Drawing.Point(520, 73); + this.panelTextBoxAssColor.Name = "panelTextBoxAssColor"; + this.panelTextBoxAssColor.Size = new System.Drawing.Size(21, 20); + this.panelTextBoxAssColor.TabIndex = 38; + this.panelTextBoxAssColor.MouseClick += new System.Windows.Forms.MouseEventHandler(this.panelTextBoxAssColor_MouseClick); + // + // buttonTextBoxAssColor + // + this.buttonTextBoxAssColor.Location = new System.Drawing.Point(396, 72); + this.buttonTextBoxAssColor.Name = "buttonTextBoxAssColor"; + this.buttonTextBoxAssColor.Size = new System.Drawing.Size(112, 23); + this.buttonTextBoxAssColor.TabIndex = 36; + this.buttonTextBoxAssColor.Text = "ASSA color"; + this.buttonTextBoxAssColor.UseVisualStyleBackColor = true; + this.buttonTextBoxAssColor.Click += new System.EventHandler(this.buttonTextBoxAssColor_Click); + // + // panelTextBoxHtmlColor + // + this.panelTextBoxHtmlColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelTextBoxHtmlColor.Location = new System.Drawing.Point(520, 44); + this.panelTextBoxHtmlColor.Name = "panelTextBoxHtmlColor"; + this.panelTextBoxHtmlColor.Size = new System.Drawing.Size(21, 20); + this.panelTextBoxHtmlColor.TabIndex = 37; + this.panelTextBoxHtmlColor.MouseClick += new System.Windows.Forms.MouseEventHandler(this.panelTextBoxHtmlColor_MouseClick); + // + // buttonTextBoxHtmlColor + // + this.buttonTextBoxHtmlColor.Location = new System.Drawing.Point(396, 43); + this.buttonTextBoxHtmlColor.Name = "buttonTextBoxHtmlColor"; + this.buttonTextBoxHtmlColor.Size = new System.Drawing.Size(112, 23); + this.buttonTextBoxHtmlColor.TabIndex = 35; + this.buttonTextBoxHtmlColor.Text = "Html color"; + this.buttonTextBoxHtmlColor.UseVisualStyleBackColor = true; + this.buttonTextBoxHtmlColor.Click += new System.EventHandler(this.buttonTextBoxHtmlColor_Click); + // + // checkBoxSubtitleTextBoxSyntaxColor + // + this.checkBoxSubtitleTextBoxSyntaxColor.AutoSize = true; + this.checkBoxSubtitleTextBoxSyntaxColor.Location = new System.Drawing.Point(396, 20); + this.checkBoxSubtitleTextBoxSyntaxColor.Name = "checkBoxSubtitleTextBoxSyntaxColor"; + this.checkBoxSubtitleTextBoxSyntaxColor.Size = new System.Drawing.Size(120, 17); + this.checkBoxSubtitleTextBoxSyntaxColor.TabIndex = 34; + this.checkBoxSubtitleTextBoxSyntaxColor.Text = "Use syntax coloring"; + this.checkBoxSubtitleTextBoxSyntaxColor.UseVisualStyleBackColor = true; + this.checkBoxSubtitleTextBoxSyntaxColor.CheckedChanged += new System.EventHandler(this.checkBoxSubtitleTextBoxSyntaxColor_CheckedChanged); + // + // labelSubtitleFontSize + // + this.labelSubtitleFontSize.AutoSize = true; + this.labelSubtitleFontSize.Location = new System.Drawing.Point(18, 17); + this.labelSubtitleFontSize.Name = "labelSubtitleFontSize"; + this.labelSubtitleFontSize.Size = new System.Drawing.Size(87, 13); + this.labelSubtitleFontSize.TabIndex = 30; + this.labelSubtitleFontSize.Text = "Subtitle font size"; + // + // comboBoxSubtitleFontSize + // + this.comboBoxSubtitleFontSize.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxSubtitleFontSize.FormattingEnabled = true; + this.comboBoxSubtitleFontSize.Items.AddRange(new object[] { + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15", + "16", + "17", + "18", + "19", + "20", + "21", + "22", + "23", + "24", + "25", + "26", + "27", + "28", + "29", + "30"}); + this.comboBoxSubtitleFontSize.Location = new System.Drawing.Point(215, 14); + this.comboBoxSubtitleFontSize.Name = "comboBoxSubtitleFontSize"; + this.comboBoxSubtitleFontSize.Size = new System.Drawing.Size(73, 21); + this.comboBoxSubtitleFontSize.TabIndex = 31; + // + // checkBoxSubtitleFontBold + // + this.checkBoxSubtitleFontBold.AutoSize = true; + this.checkBoxSubtitleFontBold.Location = new System.Drawing.Point(215, 41); + this.checkBoxSubtitleFontBold.Name = "checkBoxSubtitleFontBold"; + this.checkBoxSubtitleFontBold.Size = new System.Drawing.Size(46, 17); + this.checkBoxSubtitleFontBold.TabIndex = 32; + this.checkBoxSubtitleFontBold.Text = "Bold"; + this.checkBoxSubtitleFontBold.UseVisualStyleBackColor = true; + // + // checkBoxSubtitleCenter + // + this.checkBoxSubtitleCenter.AutoSize = true; + this.checkBoxSubtitleCenter.Location = new System.Drawing.Point(215, 64); + this.checkBoxSubtitleCenter.Name = "checkBoxSubtitleCenter"; + this.checkBoxSubtitleCenter.Size = new System.Drawing.Size(59, 17); + this.checkBoxSubtitleCenter.TabIndex = 33; + this.checkBoxSubtitleCenter.Text = "Center"; + this.checkBoxSubtitleCenter.UseVisualStyleBackColor = true; + // + // groupBoxFontListViews + // + this.groupBoxFontListViews.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxFontListViews.Controls.Add(this.labelSubtitleListViewFontSize); + this.groupBoxFontListViews.Controls.Add(this.comboBoxSubtitleListViewFontSize); + this.groupBoxFontListViews.Controls.Add(this.checkBoxSubtitleListViewFontBold); + this.groupBoxFontListViews.Location = new System.Drawing.Point(14, 141); + this.groupBoxFontListViews.Name = "groupBoxFontListViews"; + this.groupBoxFontListViews.Size = new System.Drawing.Size(806, 81); + this.groupBoxFontListViews.TabIndex = 39; + this.groupBoxFontListViews.TabStop = false; + this.groupBoxFontListViews.Text = "List view"; + // + // labelSubtitleListViewFontSize + // + this.labelSubtitleListViewFontSize.AutoSize = true; + this.labelSubtitleListViewFontSize.Location = new System.Drawing.Point(13, 17); + this.labelSubtitleListViewFontSize.Name = "labelSubtitleListViewFontSize"; + this.labelSubtitleListViewFontSize.Size = new System.Drawing.Size(87, 13); + this.labelSubtitleListViewFontSize.TabIndex = 33; + this.labelSubtitleListViewFontSize.Text = "Subtitle font size"; + // + // comboBoxSubtitleListViewFontSize + // + this.comboBoxSubtitleListViewFontSize.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxSubtitleListViewFontSize.FormattingEnabled = true; + this.comboBoxSubtitleListViewFontSize.Items.AddRange(new object[] { + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15", + "16", + "17", + "18", + "19", + "20"}); + this.comboBoxSubtitleListViewFontSize.Location = new System.Drawing.Point(210, 14); + this.comboBoxSubtitleListViewFontSize.Name = "comboBoxSubtitleListViewFontSize"; + this.comboBoxSubtitleListViewFontSize.Size = new System.Drawing.Size(73, 21); + this.comboBoxSubtitleListViewFontSize.TabIndex = 34; + // + // checkBoxSubtitleListViewFontBold + // + this.checkBoxSubtitleListViewFontBold.AutoSize = true; + this.checkBoxSubtitleListViewFontBold.Location = new System.Drawing.Point(210, 41); + this.checkBoxSubtitleListViewFontBold.Name = "checkBoxSubtitleListViewFontBold"; + this.checkBoxSubtitleListViewFontBold.Size = new System.Drawing.Size(46, 17); + this.checkBoxSubtitleListViewFontBold.TabIndex = 35; + this.checkBoxSubtitleListViewFontBold.Text = "Bold"; + this.checkBoxSubtitleListViewFontBold.UseVisualStyleBackColor = true; + // + // groupBoxFontGeneral + // + this.groupBoxFontGeneral.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxFontGeneral.Controls.Add(this.comboBoxSubtitleFont); + this.groupBoxFontGeneral.Controls.Add(this.labelSubtitleFont); + this.groupBoxFontGeneral.Controls.Add(this.panelSubtitleFontColor); + this.groupBoxFontGeneral.Controls.Add(this.labelSubtitleFontColor); + this.groupBoxFontGeneral.Controls.Add(this.panelSubtitleBackgroundColor); + this.groupBoxFontGeneral.Controls.Add(this.labelSubtitleFontBackgroundColor); + this.groupBoxFontGeneral.Location = new System.Drawing.Point(14, 20); + this.groupBoxFontGeneral.Name = "groupBoxFontGeneral"; + this.groupBoxFontGeneral.Size = new System.Drawing.Size(806, 115); + this.groupBoxFontGeneral.TabIndex = 38; + this.groupBoxFontGeneral.TabStop = false; + this.groupBoxFontGeneral.Text = "General"; + // + // comboBoxSubtitleFont + // + this.comboBoxSubtitleFont.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxSubtitleFont.FormattingEnabled = true; + this.comboBoxSubtitleFont.Location = new System.Drawing.Point(210, 20); + this.comboBoxSubtitleFont.Name = "comboBoxSubtitleFont"; + this.comboBoxSubtitleFont.Size = new System.Drawing.Size(188, 21); + this.comboBoxSubtitleFont.TabIndex = 29; + // + // labelSubtitleFont + // + this.labelSubtitleFont.AutoSize = true; + this.labelSubtitleFont.Location = new System.Drawing.Point(13, 26); + this.labelSubtitleFont.Name = "labelSubtitleFont"; + this.labelSubtitleFont.Size = new System.Drawing.Size(66, 13); + this.labelSubtitleFont.TabIndex = 28; + this.labelSubtitleFont.Text = "Subtitle font"; + // + // panelSubtitleFontColor + // + this.panelSubtitleFontColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelSubtitleFontColor.Location = new System.Drawing.Point(210, 51); + this.panelSubtitleFontColor.Name = "panelSubtitleFontColor"; + this.panelSubtitleFontColor.Size = new System.Drawing.Size(46, 15); + this.panelSubtitleFontColor.TabIndex = 35; + this.panelSubtitleFontColor.Click += new System.EventHandler(this.panelSubtitleFontColor_Click); + // + // labelSubtitleFontColor + // + this.labelSubtitleFontColor.AutoSize = true; + this.labelSubtitleFontColor.Location = new System.Drawing.Point(13, 50); + this.labelSubtitleFontColor.Name = "labelSubtitleFontColor"; + this.labelSubtitleFontColor.Size = new System.Drawing.Size(92, 13); + this.labelSubtitleFontColor.TabIndex = 34; + this.labelSubtitleFontColor.Text = "Subtitle font color"; + // + // panelSubtitleBackgroundColor + // + this.panelSubtitleBackgroundColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelSubtitleBackgroundColor.Location = new System.Drawing.Point(210, 71); + this.panelSubtitleBackgroundColor.Name = "panelSubtitleBackgroundColor"; + this.panelSubtitleBackgroundColor.Size = new System.Drawing.Size(46, 15); + this.panelSubtitleBackgroundColor.TabIndex = 37; + this.panelSubtitleBackgroundColor.Click += new System.EventHandler(this.panelSubtitleBackgroundColor_Click); + // + // labelSubtitleFontBackgroundColor + // + this.labelSubtitleFontBackgroundColor.AutoSize = true; + this.labelSubtitleFontBackgroundColor.Location = new System.Drawing.Point(13, 70); + this.labelSubtitleFontBackgroundColor.Name = "labelSubtitleFontBackgroundColor"; + this.labelSubtitleFontBackgroundColor.Size = new System.Drawing.Size(151, 13); + this.labelSubtitleFontBackgroundColor.TabIndex = 36; + this.labelSubtitleFontBackgroundColor.Text = "Subtitle font background color"; + // + // tabPageSsaStyle + // + this.tabPageSsaStyle.Controls.Add(this.groupBoxSsaStyle); + this.tabPageSsaStyle.Location = new System.Drawing.Point(4, 22); + this.tabPageSsaStyle.Name = "tabPageSsaStyle"; + this.tabPageSsaStyle.Padding = new System.Windows.Forms.Padding(3); + this.tabPageSsaStyle.Size = new System.Drawing.Size(832, 520); + this.tabPageSsaStyle.TabIndex = 1; + this.tabPageSsaStyle.Text = "SSA style"; + this.tabPageSsaStyle.UseVisualStyleBackColor = true; + // + // groupBoxSsaStyle + // + this.groupBoxSsaStyle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxSsaStyle.Controls.Add(this.groupBoxSsaBorder); + this.groupBoxSsaStyle.Controls.Add(this.groupSsaBoxFont); + this.groupBoxSsaStyle.Controls.Add(this.groupBoxMargins); + this.groupBoxSsaStyle.Controls.Add(this.groupBoxPreview); + this.groupBoxSsaStyle.Location = new System.Drawing.Point(6, 6); + this.groupBoxSsaStyle.Name = "groupBoxSsaStyle"; + this.groupBoxSsaStyle.Size = new System.Drawing.Size(819, 456); + this.groupBoxSsaStyle.TabIndex = 0; + this.groupBoxSsaStyle.TabStop = false; + this.groupBoxSsaStyle.Text = "Sub Station Alpha style"; + // + // groupBoxSsaBorder + // + this.groupBoxSsaBorder.Controls.Add(this.numericUpDownSsaOutline); + this.groupBoxSsaBorder.Controls.Add(this.labelSsaShadow); + this.groupBoxSsaBorder.Controls.Add(this.numericUpDownSsaShadow); + this.groupBoxSsaBorder.Controls.Add(this.checkBoxSsaOpaqueBox); + this.groupBoxSsaBorder.Controls.Add(this.labelSsaOutline); + this.groupBoxSsaBorder.Location = new System.Drawing.Point(329, 21); + this.groupBoxSsaBorder.Name = "groupBoxSsaBorder"; + this.groupBoxSsaBorder.Size = new System.Drawing.Size(185, 96); + this.groupBoxSsaBorder.TabIndex = 8; + this.groupBoxSsaBorder.TabStop = false; + this.groupBoxSsaBorder.Text = "Border"; + // + // numericUpDownSsaOutline + // + this.numericUpDownSsaOutline.Location = new System.Drawing.Point(64, 16); + this.numericUpDownSsaOutline.Maximum = new decimal(new int[] { + 9, + 0, + 0, + 0}); + this.numericUpDownSsaOutline.Name = "numericUpDownSsaOutline"; + this.numericUpDownSsaOutline.Size = new System.Drawing.Size(44, 21); + this.numericUpDownSsaOutline.TabIndex = 5; + this.numericUpDownSsaOutline.ValueChanged += new System.EventHandler(this.numericUpDownSsaOutline_ValueChanged); + // + // labelSsaShadow + // + this.labelSsaShadow.AutoSize = true; + this.labelSsaShadow.Location = new System.Drawing.Point(10, 45); + this.labelSsaShadow.Name = "labelSsaShadow"; + this.labelSsaShadow.Size = new System.Drawing.Size(45, 13); + this.labelSsaShadow.TabIndex = 6; + this.labelSsaShadow.Text = "Shadow"; + // + // numericUpDownSsaShadow + // + this.numericUpDownSsaShadow.Location = new System.Drawing.Point(64, 43); + this.numericUpDownSsaShadow.Maximum = new decimal(new int[] { + 9, + 0, + 0, + 0}); + this.numericUpDownSsaShadow.Name = "numericUpDownSsaShadow"; + this.numericUpDownSsaShadow.Size = new System.Drawing.Size(44, 21); + this.numericUpDownSsaShadow.TabIndex = 7; + this.numericUpDownSsaShadow.ValueChanged += new System.EventHandler(this.numericUpDownSsaShadow_ValueChanged); + // + // checkBoxSsaOpaqueBox + // + this.checkBoxSsaOpaqueBox.AutoSize = true; + this.checkBoxSsaOpaqueBox.Location = new System.Drawing.Point(13, 71); + this.checkBoxSsaOpaqueBox.Name = "checkBoxSsaOpaqueBox"; + this.checkBoxSsaOpaqueBox.Size = new System.Drawing.Size(85, 17); + this.checkBoxSsaOpaqueBox.TabIndex = 8; + this.checkBoxSsaOpaqueBox.Text = "Opaque box"; + this.checkBoxSsaOpaqueBox.UseVisualStyleBackColor = true; + this.checkBoxSsaOpaqueBox.CheckedChanged += new System.EventHandler(this.checkBoxSsaOpaqueBox_CheckedChanged); + // + // labelSsaOutline + // + this.labelSsaOutline.AutoSize = true; + this.labelSsaOutline.Location = new System.Drawing.Point(10, 20); + this.labelSsaOutline.Name = "labelSsaOutline"; + this.labelSsaOutline.Size = new System.Drawing.Size(41, 13); + this.labelSsaOutline.TabIndex = 4; + this.labelSsaOutline.Text = "Outline"; + // + // groupSsaBoxFont + // + this.groupSsaBoxFont.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupSsaBoxFont.Controls.Add(this.checkBoxSsaFontBold); + this.groupSsaBoxFont.Controls.Add(this.buttonSsaColor); + this.groupSsaBoxFont.Controls.Add(this.panelPrimaryColor); + this.groupSsaBoxFont.Controls.Add(this.numericUpDownFontSize); + this.groupSsaBoxFont.Controls.Add(this.comboBoxFontName); + this.groupSsaBoxFont.Controls.Add(this.labelSsaFontSize); + this.groupSsaBoxFont.Controls.Add(this.labelFontName); + this.groupSsaBoxFont.Location = new System.Drawing.Point(6, 20); + this.groupSsaBoxFont.Name = "groupSsaBoxFont"; + this.groupSsaBoxFont.Size = new System.Drawing.Size(323, 97); + this.groupSsaBoxFont.TabIndex = 7; + this.groupSsaBoxFont.TabStop = false; + this.groupSsaBoxFont.Text = "Font"; + // + // checkBoxSsaFontBold + // + this.checkBoxSsaFontBold.AutoSize = true; + this.checkBoxSsaFontBold.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.checkBoxSsaFontBold.Location = new System.Drawing.Point(184, 45); + this.checkBoxSsaFontBold.Name = "checkBoxSsaFontBold"; + this.checkBoxSsaFontBold.Size = new System.Drawing.Size(51, 17); + this.checkBoxSsaFontBold.TabIndex = 7; + this.checkBoxSsaFontBold.Text = "Bold"; + this.checkBoxSsaFontBold.UseVisualStyleBackColor = true; + this.checkBoxSsaFontBold.CheckedChanged += new System.EventHandler(this.checkBoxSsaFontBold_CheckedChanged); + // + // buttonSsaColor + // + this.buttonSsaColor.Location = new System.Drawing.Point(6, 66); + this.buttonSsaColor.Name = "buttonSsaColor"; + this.buttonSsaColor.Size = new System.Drawing.Size(109, 23); + this.buttonSsaColor.TabIndex = 6; + this.buttonSsaColor.Text = "Choose color"; + this.buttonSsaColor.UseVisualStyleBackColor = true; + this.buttonSsaColor.Click += new System.EventHandler(this.buttonSsaColor_Click); + // + // panelPrimaryColor + // + this.panelPrimaryColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelPrimaryColor.Location = new System.Drawing.Point(121, 68); + this.panelPrimaryColor.Name = "panelPrimaryColor"; + this.panelPrimaryColor.Size = new System.Drawing.Size(21, 20); + this.panelPrimaryColor.TabIndex = 4; + this.panelPrimaryColor.MouseClick += new System.Windows.Forms.MouseEventHandler(this.panelPrimaryColor_MouseClick); + // + // numericUpDownFontSize + // + this.numericUpDownFontSize.Location = new System.Drawing.Point(121, 44); + this.numericUpDownFontSize.Maximum = new decimal(new int[] { + 200, + 0, + 0, + 0}); + this.numericUpDownFontSize.Name = "numericUpDownFontSize"; + this.numericUpDownFontSize.Size = new System.Drawing.Size(51, 21); + this.numericUpDownFontSize.TabIndex = 3; + this.numericUpDownFontSize.ValueChanged += new System.EventHandler(this.numericUpDownFontSize_ValueChanged); + // + // comboBoxFontName + // + this.comboBoxFontName.FormattingEnabled = true; + this.comboBoxFontName.Location = new System.Drawing.Point(121, 17); + this.comboBoxFontName.Name = "comboBoxFontName"; + this.comboBoxFontName.Size = new System.Drawing.Size(188, 21); + this.comboBoxFontName.TabIndex = 1; + this.comboBoxFontName.TextChanged += new System.EventHandler(this.comboBoxFontName_TextChanged); + // + // labelSsaFontSize + // + this.labelSsaFontSize.AutoSize = true; + this.labelSsaFontSize.Location = new System.Drawing.Point(10, 46); + this.labelSsaFontSize.Name = "labelSsaFontSize"; + this.labelSsaFontSize.Size = new System.Drawing.Size(50, 13); + this.labelSsaFontSize.TabIndex = 2; + this.labelSsaFontSize.Text = "Font size"; + // + // labelFontName + // + this.labelFontName.AutoSize = true; + this.labelFontName.Location = new System.Drawing.Point(10, 20); + this.labelFontName.Name = "labelFontName"; + this.labelFontName.Size = new System.Drawing.Size(58, 13); + this.labelFontName.TabIndex = 0; + this.labelFontName.Text = "Font name"; + // + // groupBoxMargins + // + this.groupBoxMargins.Controls.Add(this.numericUpDownSsaMarginVertical); + this.groupBoxMargins.Controls.Add(this.numericUpDownSsaMarginRight); + this.groupBoxMargins.Controls.Add(this.numericUpDownSsaMarginLeft); + this.groupBoxMargins.Controls.Add(this.labelMarginVertical); + this.groupBoxMargins.Controls.Add(this.labelMarginRight); + this.groupBoxMargins.Controls.Add(this.labelMarginLeft); + this.groupBoxMargins.Location = new System.Drawing.Point(520, 20); + this.groupBoxMargins.Name = "groupBoxMargins"; + this.groupBoxMargins.Size = new System.Drawing.Size(281, 97); + this.groupBoxMargins.TabIndex = 9; + this.groupBoxMargins.TabStop = false; + this.groupBoxMargins.Text = "Margins"; + // + // numericUpDownSsaMarginVertical + // + this.numericUpDownSsaMarginVertical.Location = new System.Drawing.Point(168, 33); + this.numericUpDownSsaMarginVertical.Maximum = new decimal(new int[] { + 1000, + 0, + 0, + 0}); + this.numericUpDownSsaMarginVertical.Name = "numericUpDownSsaMarginVertical"; + this.numericUpDownSsaMarginVertical.Size = new System.Drawing.Size(44, 21); + this.numericUpDownSsaMarginVertical.TabIndex = 5; + this.numericUpDownSsaMarginVertical.ValueChanged += new System.EventHandler(this.numericUpDownSsaMarginVertical_ValueChanged); + // + // numericUpDownSsaMarginRight + // + this.numericUpDownSsaMarginRight.Location = new System.Drawing.Point(93, 33); + this.numericUpDownSsaMarginRight.Maximum = new decimal(new int[] { + 1000, + 0, + 0, + 0}); + this.numericUpDownSsaMarginRight.Name = "numericUpDownSsaMarginRight"; + this.numericUpDownSsaMarginRight.Size = new System.Drawing.Size(44, 21); + this.numericUpDownSsaMarginRight.TabIndex = 3; + // + // numericUpDownSsaMarginLeft + // + this.numericUpDownSsaMarginLeft.Location = new System.Drawing.Point(16, 33); + this.numericUpDownSsaMarginLeft.Maximum = new decimal(new int[] { + 1000, + 0, + 0, + 0}); + this.numericUpDownSsaMarginLeft.Name = "numericUpDownSsaMarginLeft"; + this.numericUpDownSsaMarginLeft.Size = new System.Drawing.Size(44, 21); + this.numericUpDownSsaMarginLeft.TabIndex = 1; + // + // labelMarginVertical + // + this.labelMarginVertical.AutoSize = true; + this.labelMarginVertical.Location = new System.Drawing.Point(165, 17); + this.labelMarginVertical.Name = "labelMarginVertical"; + this.labelMarginVertical.Size = new System.Drawing.Size(42, 13); + this.labelMarginVertical.TabIndex = 4; + this.labelMarginVertical.Text = "Vertical"; + // + // labelMarginRight + // + this.labelMarginRight.AutoSize = true; + this.labelMarginRight.Location = new System.Drawing.Point(90, 16); + this.labelMarginRight.Name = "labelMarginRight"; + this.labelMarginRight.Size = new System.Drawing.Size(32, 13); + this.labelMarginRight.TabIndex = 2; + this.labelMarginRight.Text = "Right"; + // + // labelMarginLeft + // + this.labelMarginLeft.AutoSize = true; + this.labelMarginLeft.Location = new System.Drawing.Point(13, 16); + this.labelMarginLeft.Name = "labelMarginLeft"; + this.labelMarginLeft.Size = new System.Drawing.Size(26, 13); + this.labelMarginLeft.TabIndex = 0; + this.labelMarginLeft.Text = "Left"; + // + // groupBoxPreview + // + this.groupBoxPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxPreview.Controls.Add(this.pictureBoxPreview); + this.groupBoxPreview.Location = new System.Drawing.Point(6, 118); + this.groupBoxPreview.Name = "groupBoxPreview"; + this.groupBoxPreview.Size = new System.Drawing.Size(807, 332); + this.groupBoxPreview.TabIndex = 10; + this.groupBoxPreview.TabStop = false; + this.groupBoxPreview.Text = "Preview"; + // + // pictureBoxPreview + // + this.pictureBoxPreview.Dock = System.Windows.Forms.DockStyle.Fill; + this.pictureBoxPreview.Location = new System.Drawing.Point(3, 17); + this.pictureBoxPreview.Name = "pictureBoxPreview"; + this.pictureBoxPreview.Size = new System.Drawing.Size(801, 312); + this.pictureBoxPreview.TabIndex = 0; + this.pictureBoxPreview.TabStop = false; + this.pictureBoxPreview.Click += new System.EventHandler(this.pictureBoxPreview_Click); + // + // tabPageNetwork + // + this.tabPageNetwork.Controls.Add(this.groupBoxNetworkSession); + this.tabPageNetwork.Controls.Add(this.groupBoxProxySettings); + this.tabPageNetwork.Location = new System.Drawing.Point(4, 22); + this.tabPageNetwork.Name = "tabPageNetwork"; + this.tabPageNetwork.Padding = new System.Windows.Forms.Padding(3); + this.tabPageNetwork.Size = new System.Drawing.Size(832, 520); + this.tabPageNetwork.TabIndex = 4; + this.tabPageNetwork.Text = "Network"; + this.tabPageNetwork.UseVisualStyleBackColor = true; + // + // groupBoxNetworkSession + // + this.groupBoxNetworkSession.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxNetworkSession.Controls.Add(this.buttonNetworkSessionNewMessageSound); + this.groupBoxNetworkSession.Controls.Add(this.textBoxNetworkSessionNewMessageSound); + this.groupBoxNetworkSession.Controls.Add(this.labelNetworkSessionNewMessageSound); + this.groupBoxNetworkSession.Location = new System.Drawing.Point(6, 189); + this.groupBoxNetworkSession.Name = "groupBoxNetworkSession"; + this.groupBoxNetworkSession.Size = new System.Drawing.Size(819, 320); + this.groupBoxNetworkSession.TabIndex = 30; + this.groupBoxNetworkSession.TabStop = false; + this.groupBoxNetworkSession.Text = "Network session settings"; + // + // buttonNetworkSessionNewMessageSound + // + this.buttonNetworkSessionNewMessageSound.Location = new System.Drawing.Point(352, 49); + this.buttonNetworkSessionNewMessageSound.Name = "buttonNetworkSessionNewMessageSound"; + this.buttonNetworkSessionNewMessageSound.Size = new System.Drawing.Size(29, 21); + this.buttonNetworkSessionNewMessageSound.TabIndex = 24; + this.buttonNetworkSessionNewMessageSound.Text = "..."; + this.buttonNetworkSessionNewMessageSound.UseVisualStyleBackColor = true; + this.buttonNetworkSessionNewMessageSound.Click += new System.EventHandler(this.buttonNetworkSessionNewMessageSound_Click); + // + // textBoxNetworkSessionNewMessageSound + // + this.textBoxNetworkSessionNewMessageSound.Location = new System.Drawing.Point(28, 50); + this.textBoxNetworkSessionNewMessageSound.Name = "textBoxNetworkSessionNewMessageSound"; + this.textBoxNetworkSessionNewMessageSound.Size = new System.Drawing.Size(318, 21); + this.textBoxNetworkSessionNewMessageSound.TabIndex = 20; + // + // labelNetworkSessionNewMessageSound + // + this.labelNetworkSessionNewMessageSound.AutoSize = true; + this.labelNetworkSessionNewMessageSound.Location = new System.Drawing.Point(25, 34); + this.labelNetworkSessionNewMessageSound.Name = "labelNetworkSessionNewMessageSound"; + this.labelNetworkSessionNewMessageSound.Size = new System.Drawing.Size(209, 13); + this.labelNetworkSessionNewMessageSound.TabIndex = 3; + this.labelNetworkSessionNewMessageSound.Text = "Play sound file when new message arrives"; + // + // groupBoxProxySettings + // + this.groupBoxProxySettings.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxProxySettings.Controls.Add(this.groupBoxProxyAuthentication); + this.groupBoxProxySettings.Controls.Add(this.textBoxProxyAddress); + this.groupBoxProxySettings.Controls.Add(this.labelProxyAddress); + this.groupBoxProxySettings.Location = new System.Drawing.Point(6, 6); + this.groupBoxProxySettings.Name = "groupBoxProxySettings"; + this.groupBoxProxySettings.Size = new System.Drawing.Size(819, 177); + this.groupBoxProxySettings.TabIndex = 1; + this.groupBoxProxySettings.TabStop = false; + this.groupBoxProxySettings.Text = "Proxy server settings"; + // + // groupBoxProxyAuthentication + // + this.groupBoxProxyAuthentication.Controls.Add(this.textBoxProxyDomain); + this.groupBoxProxyAuthentication.Controls.Add(this.labelProxyDomain); + this.groupBoxProxyAuthentication.Controls.Add(this.textBoxProxyUserName); + this.groupBoxProxyAuthentication.Controls.Add(this.labelProxyPassword); + this.groupBoxProxyAuthentication.Controls.Add(this.labelProxyUserName); + this.groupBoxProxyAuthentication.Controls.Add(this.textBoxProxyPassword); + this.groupBoxProxyAuthentication.Location = new System.Drawing.Point(28, 60); + this.groupBoxProxyAuthentication.Name = "groupBoxProxyAuthentication"; + this.groupBoxProxyAuthentication.Size = new System.Drawing.Size(318, 101); + this.groupBoxProxyAuthentication.TabIndex = 29; + this.groupBoxProxyAuthentication.TabStop = false; + this.groupBoxProxyAuthentication.Text = "Authentication"; + // + // textBoxProxyDomain + // + this.textBoxProxyDomain.Location = new System.Drawing.Point(106, 71); + this.textBoxProxyDomain.Name = "textBoxProxyDomain"; + this.textBoxProxyDomain.Size = new System.Drawing.Size(192, 21); + this.textBoxProxyDomain.TabIndex = 30; + // + // labelProxyDomain + // + this.labelProxyDomain.AutoSize = true; + this.labelProxyDomain.Location = new System.Drawing.Point(12, 74); + this.labelProxyDomain.Name = "labelProxyDomain"; + this.labelProxyDomain.Size = new System.Drawing.Size(42, 13); + this.labelProxyDomain.TabIndex = 29; + this.labelProxyDomain.Text = "Domain"; + // + // textBoxProxyUserName + // + this.textBoxProxyUserName.Location = new System.Drawing.Point(106, 19); + this.textBoxProxyUserName.Name = "textBoxProxyUserName"; + this.textBoxProxyUserName.Size = new System.Drawing.Size(192, 21); + this.textBoxProxyUserName.TabIndex = 22; + // + // labelProxyPassword + // + this.labelProxyPassword.AutoSize = true; + this.labelProxyPassword.Location = new System.Drawing.Point(12, 48); + this.labelProxyPassword.Name = "labelProxyPassword"; + this.labelProxyPassword.Size = new System.Drawing.Size(53, 13); + this.labelProxyPassword.TabIndex = 28; + this.labelProxyPassword.Text = "Password"; + // + // labelProxyUserName + // + this.labelProxyUserName.AutoSize = true; + this.labelProxyUserName.Location = new System.Drawing.Point(12, 22); + this.labelProxyUserName.Name = "labelProxyUserName"; + this.labelProxyUserName.Size = new System.Drawing.Size(58, 13); + this.labelProxyUserName.TabIndex = 2; + this.labelProxyUserName.Text = "User name"; + // + // textBoxProxyPassword + // + this.textBoxProxyPassword.Location = new System.Drawing.Point(106, 45); + this.textBoxProxyPassword.Name = "textBoxProxyPassword"; + this.textBoxProxyPassword.Size = new System.Drawing.Size(192, 21); + this.textBoxProxyPassword.TabIndex = 24; + this.textBoxProxyPassword.UseSystemPasswordChar = true; + // + // textBoxProxyAddress + // + this.textBoxProxyAddress.Location = new System.Drawing.Point(134, 34); + this.textBoxProxyAddress.Name = "textBoxProxyAddress"; + this.textBoxProxyAddress.Size = new System.Drawing.Size(192, 21); + this.textBoxProxyAddress.TabIndex = 20; + // + // labelProxyAddress + // + this.labelProxyAddress.AutoSize = true; + this.labelProxyAddress.Location = new System.Drawing.Point(25, 34); + this.labelProxyAddress.Name = "labelProxyAddress"; + this.labelProxyAddress.Size = new System.Drawing.Size(76, 13); + this.labelProxyAddress.TabIndex = 3; + this.labelProxyAddress.Text = "Proxy address"; + // + // labelStatus + // + this.labelStatus.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelStatus.AutoSize = true; + this.labelStatus.Location = new System.Drawing.Point(12, 573); + this.labelStatus.Name = "labelStatus"; + this.labelStatus.Size = new System.Drawing.Size(60, 13); + this.labelStatus.TabIndex = 3; + this.labelStatus.Text = "labelStatus"; + // + // openFileDialogFFmpeg + // + this.openFileDialogFFmpeg.FileName = "openFileDialog1"; + // + // buttonReset + // + this.buttonReset.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonReset.Location = new System.Drawing.Point(668, 563); + this.buttonReset.Name = "buttonReset"; + this.buttonReset.Size = new System.Drawing.Size(185, 23); + this.buttonReset.TabIndex = 2; + this.buttonReset.Text = "Restore default settings"; + this.buttonReset.UseVisualStyleBackColor = true; + this.buttonReset.Click += new System.EventHandler(this.buttonReset_Click); + // + // toolTipContinuationPreview + // + this.toolTipContinuationPreview.AutoPopDelay = 60000; + this.toolTipContinuationPreview.InitialDelay = 500; + this.toolTipContinuationPreview.ReshowDelay = 100; + // + // Settings + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(865, 598); + this.Controls.Add(this.buttonReset); + this.Controls.Add(this.labelStatus); + this.Controls.Add(this.tabControlSettings); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "Settings"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Settings"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormSettings_KeyDown); + this.tabControlSettings.ResumeLayout(false); + this.tabPageGeneral.ResumeLayout(false); + this.groupBoxMiscellaneous.ResumeLayout(false); + this.groupBoxMiscellaneous.PerformLayout(); + this.groupBoxGeneralRules.ResumeLayout(false); + this.groupBoxGeneralRules.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownOptimalCharsSec)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxWordsMin)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxNumberOfLines)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDurationMin)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDurationMax)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinGapMs)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxCharsSec)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSubtitleLineMaximumLength)).EndInit(); + this.tabPageShortcuts.ResumeLayout(false); + this.groupBoxShortcuts.ResumeLayout(false); + this.groupBoxShortcuts.PerformLayout(); + this.contextMenuStripShortcuts.ResumeLayout(false); + this.tabPageSyntaxColoring.ResumeLayout(false); + this.groupBoxListViewSyntaxColoring.ResumeLayout(false); + this.groupBoxListViewSyntaxColoring.PerformLayout(); + this.tabPageVideoPlayer.ResumeLayout(false); + this.groupBoxMainWindowVideoControls.ResumeLayout(false); + this.groupBoxMainWindowVideoControls.PerformLayout(); + this.groupBoxVideoPlayerDefault.ResumeLayout(false); + this.groupBoxVideoPlayerDefault.PerformLayout(); + this.groupBoxVideoEngine.ResumeLayout(false); + this.groupBoxVideoEngine.PerformLayout(); + this.tabPageWaveform.ResumeLayout(false); + this.groupBoxFfmpeg.ResumeLayout(false); + this.groupBoxFfmpeg.PerformLayout(); + this.groupBoxSpectrogram.ResumeLayout(false); + this.groupBoxSpectrogram.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.groupBoxWaveformAppearence.ResumeLayout(false); + this.groupBoxWaveformAppearence.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownWaveformBorderHitMs)).EndInit(); + this.tabPageTools.ResumeLayout(false); + this.groupBoxGoogleTranslate.ResumeLayout(false); + this.groupBoxGoogleTranslate.PerformLayout(); + this.groupBoxBing.ResumeLayout(false); + this.groupBoxBing.PerformLayout(); + this.groupBoxToolsAutoBr.ResumeLayout(false); + this.groupBoxToolsAutoBr.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownToolsBreakPreferBottomHeavy)).EndInit(); + this.groupBoxSpellCheck.ResumeLayout(false); + this.groupBoxSpellCheck.PerformLayout(); + this.groupBoxFixCommonErrors.ResumeLayout(false); + this.groupBoxFixCommonErrors.PerformLayout(); + this.groupBoxToolsVisualSync.ResumeLayout(false); + this.groupBoxToolsVisualSync.PerformLayout(); + this.tabPageWordLists.ResumeLayout(false); + this.groupBoxWordLists.ResumeLayout(false); + this.groupBoxWordLists.PerformLayout(); + this.groupBoxOcrFixList.ResumeLayout(false); + this.groupBoxOcrFixList.PerformLayout(); + this.groupBoxUserWordList.ResumeLayout(false); + this.groupBoxUserWordList.PerformLayout(); + this.groupBoxWordListLocation.ResumeLayout(false); + this.groupBoxWordListLocation.PerformLayout(); + this.groupBoxNamesIgonoreLists.ResumeLayout(false); + this.groupBoxNamesIgonoreLists.PerformLayout(); + this.tabPageToolBar.ResumeLayout(false); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBoxShowToolBarButtons.ResumeLayout(false); + this.groupBoxShowToolBarButtons.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxNetflixQualityCheck)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxTBRemoveTextForHi)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxTBFixCommonErrors)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxHelp)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxSettings)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxSpellCheck)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxVisualSync)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxReplace)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxFind)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxSaveAs)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxSave)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxOpen)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxNew)).EndInit(); + this.tabPageFont.ResumeLayout(false); + this.groupBoxFont.ResumeLayout(false); + this.groupBoxFont.PerformLayout(); + this.groupBoxFontTextBox.ResumeLayout(false); + this.groupBoxFontTextBox.PerformLayout(); + this.groupBoxFontListViews.ResumeLayout(false); + this.groupBoxFontListViews.PerformLayout(); + this.groupBoxFontGeneral.ResumeLayout(false); + this.groupBoxFontGeneral.PerformLayout(); + this.tabPageSsaStyle.ResumeLayout(false); + this.groupBoxSsaStyle.ResumeLayout(false); + this.groupBoxSsaBorder.ResumeLayout(false); + this.groupBoxSsaBorder.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSsaOutline)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSsaShadow)).EndInit(); + this.groupSsaBoxFont.ResumeLayout(false); + this.groupSsaBoxFont.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownFontSize)).EndInit(); + this.groupBoxMargins.ResumeLayout(false); + this.groupBoxMargins.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSsaMarginVertical)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSsaMarginRight)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSsaMarginLeft)).EndInit(); + this.groupBoxPreview.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxPreview)).EndInit(); + this.tabPageNetwork.ResumeLayout(false); + this.groupBoxNetworkSession.ResumeLayout(false); + this.groupBoxNetworkSession.PerformLayout(); + this.groupBoxProxySettings.ResumeLayout(false); + this.groupBoxProxySettings.PerformLayout(); + this.groupBoxProxyAuthentication.ResumeLayout(false); + this.groupBoxProxyAuthentication.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.TabControl tabControlSettings; + private System.Windows.Forms.TabPage tabPageGeneral; + private System.Windows.Forms.TabPage tabPageSsaStyle; + private System.Windows.Forms.GroupBox groupBoxMiscellaneous; + private System.Windows.Forms.GroupBox groupBoxShowToolBarButtons; + private System.Windows.Forms.PictureBox pictureBoxNew; + private System.Windows.Forms.CheckBox checkBoxToolbarNew; + private System.Windows.Forms.Label labelTBSpellCheck; + private System.Windows.Forms.PictureBox pictureBoxSpellCheck; + private System.Windows.Forms.CheckBox checkBoxSpellCheck; + private System.Windows.Forms.Label labelTBVisualSync; + private System.Windows.Forms.PictureBox pictureBoxVisualSync; + private System.Windows.Forms.CheckBox checkBoxVisualSync; + private System.Windows.Forms.Label labelTBReplace; + private System.Windows.Forms.PictureBox pictureBoxReplace; + private System.Windows.Forms.CheckBox checkBoxReplace; + private System.Windows.Forms.Label labelTBFind; + private System.Windows.Forms.PictureBox pictureBoxFind; + private System.Windows.Forms.CheckBox checkBoxToolbarFind; + private System.Windows.Forms.Label labelTBSaveAs; + private System.Windows.Forms.PictureBox pictureBoxSaveAs; + private System.Windows.Forms.CheckBox checkBoxToolbarSaveAs; + private System.Windows.Forms.Label labelTBSave; + private System.Windows.Forms.PictureBox pictureBoxSave; + private System.Windows.Forms.CheckBox checkBoxToolbarSave; + private System.Windows.Forms.Label labelTBOpen; + private System.Windows.Forms.PictureBox pictureBoxOpen; + private System.Windows.Forms.CheckBox checkBoxToolbarOpen; + private System.Windows.Forms.Label labelTBNew; + private System.Windows.Forms.Label labelTBHelp; + private System.Windows.Forms.PictureBox pictureBoxHelp; + private System.Windows.Forms.CheckBox checkBoxHelp; + private System.Windows.Forms.Label labelTBSettings; + private System.Windows.Forms.PictureBox pictureBoxSettings; + private System.Windows.Forms.CheckBox checkBoxSettings; + private System.Windows.Forms.Label labelDefaultFrameRate; + private System.Windows.Forms.Label labelDefaultFileEncoding; + private System.Windows.Forms.ComboBox comboBoxFrameRate; + private System.Windows.Forms.ComboBox comboBoxEncoding; + private System.Windows.Forms.CheckBox checkBoxRememberRecentFiles; + private System.Windows.Forms.GroupBox groupBoxSsaStyle; + private System.Windows.Forms.ColorDialog colorDialogSSAStyle; + private System.Windows.Forms.CheckBox checkBoxStartInSourceView; + private System.Windows.Forms.CheckBox checkBoxReopenLastOpened; + private System.Windows.Forms.Label labelSubMaxLen; + private System.Windows.Forms.TabPage tabPageVideoPlayer; + private System.Windows.Forms.CheckBox checkBoxVideoPlayerShowStopButton; + private System.Windows.Forms.GroupBox groupBoxVideoEngine; + private System.Windows.Forms.Label labelVideoPlayerMPlayer; + private System.Windows.Forms.Label labelDirectShowDescription; + private System.Windows.Forms.Label labelMpcHcDescription; + private System.Windows.Forms.RadioButton radioButtonVideoPlayerMPV; + private System.Windows.Forms.RadioButton radioButtonVideoPlayerDirectShow; + private System.Windows.Forms.RadioButton radioButtonVideoPlayerMpcHc; + private System.Windows.Forms.CheckBox checkBoxRememberWindowPosition; + private System.Windows.Forms.TextBox textBoxShowLineBreaksAs; + private System.Windows.Forms.Label labelShowLineBreaksAs; + private System.Windows.Forms.TabPage tabPageWordLists; + private System.Windows.Forms.GroupBox groupBoxWordLists; + private System.Windows.Forms.GroupBox groupBoxWordListLocation; + private System.Windows.Forms.GroupBox groupBoxOcrFixList; + private System.Windows.Forms.GroupBox groupBoxNamesIgonoreLists; + private System.Windows.Forms.TextBox textBoxNameEtc; + private System.Windows.Forms.Label labelWordListLanguage; + private System.Windows.Forms.Button buttonAddNames; + private System.Windows.Forms.ComboBox comboBoxWordListLanguage; + private System.Windows.Forms.Button buttonRemoveNameEtc; + private System.Windows.Forms.ListBox listBoxNames; + private System.Windows.Forms.Button buttonRemoveOcrFix; + private System.Windows.Forms.ListBox listBoxOcrFixList; + private System.Windows.Forms.TextBox textBoxOcrFixKey; + private System.Windows.Forms.Button buttonAddOcrFix; + private System.Windows.Forms.GroupBox groupBoxUserWordList; + private System.Windows.Forms.Button buttonRemoveUserWord; + private System.Windows.Forms.ListBox listBoxUserWordLists; + private System.Windows.Forms.TextBox textBoxUserWord; + private System.Windows.Forms.Button buttonAddUserWord; + private System.Windows.Forms.TabPage tabPageNetwork; + private System.Windows.Forms.GroupBox groupBoxProxySettings; + private System.Windows.Forms.Label labelProxyPassword; + private System.Windows.Forms.TextBox textBoxProxyAddress; + private System.Windows.Forms.TextBox textBoxProxyUserName; + private System.Windows.Forms.TextBox textBoxProxyPassword; + private System.Windows.Forms.Label labelProxyAddress; + private System.Windows.Forms.Label labelProxyUserName; + private System.Windows.Forms.CheckBox checkBoxNamesOnline; + private System.Windows.Forms.TextBox textBoxNamesOnline; + private System.Windows.Forms.TextBox textBoxOcrFixValue; + private System.Windows.Forms.TabPage tabPageTools; + private System.Windows.Forms.GroupBox groupBoxToolsVisualSync; + private System.Windows.Forms.ComboBox comboBoxToolsVerifySeconds; + private System.Windows.Forms.Label labelVerifyButton; + private System.Windows.Forms.Label labelToolsEndScene; + private System.Windows.Forms.ComboBox comboBoxToolsEndSceneIndex; + private System.Windows.Forms.Label labelToolsStartScene; + private System.Windows.Forms.ComboBox comboBoxToolsStartSceneIndex; + private System.Windows.Forms.GroupBox groupBoxFixCommonErrors; + private System.Windows.Forms.Label labelToolsMusicSymbol; + private System.Windows.Forms.ComboBox comboBoxListViewDoubleClickEvent; + private System.Windows.Forms.Label labelListViewDoubleClickEvent; + private System.Windows.Forms.Label labelStatus; + private System.Windows.Forms.TextBox textBoxMusicSymbolsToReplace; + private System.Windows.Forms.Label labelToolsMusicSymbolsToReplace; + private System.Windows.Forms.ComboBox comboBoxToolsMusicSymbol; + private System.Windows.Forms.GroupBox groupBoxSpellCheck; + private System.Windows.Forms.CheckBox checkBoxSpellCheckAutoChangeNames; + private System.Windows.Forms.GroupBox groupBoxProxyAuthentication; + private System.Windows.Forms.TextBox textBoxProxyDomain; + private System.Windows.Forms.Label labelProxyDomain; + private System.Windows.Forms.CheckBox checkBoxAutoDetectAnsiEncoding; + private System.Windows.Forms.Label labelAutoDetectAnsiEncoding; + private System.Windows.Forms.Label labelVideoPlayerVLC; + private System.Windows.Forms.RadioButton radioButtonVideoPlayerVLC; + private System.Windows.Forms.CheckBox checkBoxRemoveBlankLinesWhenOpening; + private System.Windows.Forms.GroupBox groupBoxMainWindowVideoControls; + private System.Windows.Forms.GroupBox groupBoxVideoPlayerDefault; + private System.Windows.Forms.TextBox textBoxCustomSearchUrl1; + private System.Windows.Forms.Label labelCustomSearch; + private System.Windows.Forms.ComboBox comboBoxCustomSearch1; + private System.Windows.Forms.TabPage tabPageWaveform; + private System.Windows.Forms.GroupBox groupBoxWaveformAppearence; + private System.Windows.Forms.Panel panelWaveformBackgroundColor; + private System.Windows.Forms.Button buttonWaveformBackgroundColor; + private System.Windows.Forms.Panel panelWaveformColor; + private System.Windows.Forms.Button buttonWaveformColor; + private System.Windows.Forms.Panel panelWaveformSelectedColor; + private System.Windows.Forms.Button buttonWaveformSelectedColor; + private System.Windows.Forms.CheckBox checkBoxWaveformShowGrid; + private System.Windows.Forms.Panel panelWaveformGridColor; + private System.Windows.Forms.Button buttonWaveformGridColor; + private System.Windows.Forms.Panel panelWaveformTextColor; + private System.Windows.Forms.Button buttonWaveformTextColor; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Button buttonWaveformsFolderEmpty; + private System.Windows.Forms.Label labelWaveformsFolderInfo; + private System.Windows.Forms.CheckBox checkBoxRememberSelectedLine; + private System.Windows.Forms.ComboBox comboBoxAutoBackup; + private System.Windows.Forms.Label labelAutoBackup; + private System.Windows.Forms.TabPage tabPageToolBar; + private System.Windows.Forms.CheckBox checkBoxShowFrameRate; + private System.Windows.Forms.ComboBox comboBoxSpellChecker; + private System.Windows.Forms.Label labelSpellChecker; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.CheckBox checkBoxAllowEditOfOriginalSubtitle; + private System.Windows.Forms.Label labelMergeShortLines; + private System.Windows.Forms.ComboBox comboBoxMergeShortLineLength; + private System.Windows.Forms.CheckBox checkBoxAutoWrapWhileTyping; + private System.Windows.Forms.CheckBox checkBoxFixCommonOcrErrorsUsingHardcodedRules; + private System.Windows.Forms.Label labelVideoPlayerPreviewFontSize; + private System.Windows.Forms.ComboBox comboBoxlVideoPlayerPreviewFontSize; + private System.Windows.Forms.TabPage tabPageShortcuts; + private System.Windows.Forms.GroupBox groupBoxShortcuts; + private System.Windows.Forms.Button buttonUpdateShortcut; + private System.Windows.Forms.TreeView treeViewShortcuts; + private System.Windows.Forms.Label labelShortcut; + private System.Windows.Forms.Label labelShortcutKey; + private System.Windows.Forms.ComboBox comboBoxShortcutKey; + private System.Windows.Forms.CheckBox checkBoxShortcutsShift; + private System.Windows.Forms.CheckBox checkBoxShortcutsAlt; + private System.Windows.Forms.CheckBox checkBoxShortcutsControl; + private System.Windows.Forms.CheckBox checkBoxPromptDeleteLines; + private System.Windows.Forms.GroupBox groupBoxSpectrogram; + private System.Windows.Forms.CheckBox checkBoxGenerateSpectrogram; + private System.Windows.Forms.Label labelSpectrogramAppearance; + private System.Windows.Forms.ComboBox comboBoxSpectrogramAppearance; + private System.Windows.Forms.CheckBox checkBoxReverseMouseWheelScrollDirection; + private System.Windows.Forms.Label labelMaxDuration; + private System.Windows.Forms.Label labelMinDuration; + private System.Windows.Forms.NumericUpDown numericUpDownDurationMax; + private System.Windows.Forms.NumericUpDown numericUpDownDurationMin; + private System.Windows.Forms.ComboBox comboBoxTimeCodeMode; + private System.Windows.Forms.Label labelTimeCodeMode; + private System.Windows.Forms.TabPage tabPageSyntaxColoring; + private System.Windows.Forms.GroupBox groupBoxListViewSyntaxColoring; + private System.Windows.Forms.CheckBox checkBoxSyntaxOverlap; + private System.Windows.Forms.CheckBox checkBoxSyntaxColorTextTooLong; + private System.Windows.Forms.CheckBox checkBoxSyntaxColorDurationTooLarge; + private System.Windows.Forms.CheckBox checkBoxSyntaxColorDurationTooSmall; + private System.Windows.Forms.CheckBox checkBoxSyntaxColorTextMoreThanTwoLines; + private System.Windows.Forms.Button buttonListViewSyntaxColorError; + private System.Windows.Forms.Panel panelListViewSyntaxColorError; + private System.Windows.Forms.Label labelMaxCharsPerSecond; + private System.Windows.Forms.NumericUpDown numericUpDownMaxCharsSec; + private System.Windows.Forms.NumericUpDown numericUpDownSubtitleLineMaximumLength; + private System.Windows.Forms.CheckBox checkBoxVideoPlayerShowFullscreenButton; + private System.Windows.Forms.CheckBox checkBoxVideoPlayerShowMuteButton; + private System.Windows.Forms.Label labelCustomSearch1; + private System.Windows.Forms.Label labelCustomSearch2; + private System.Windows.Forms.TextBox textBoxCustomSearchUrl2; + private System.Windows.Forms.ComboBox comboBoxCustomSearch2; + private System.Windows.Forms.Label labelCustomSearch5; + private System.Windows.Forms.TextBox textBoxCustomSearchUrl5; + private System.Windows.Forms.ComboBox comboBoxCustomSearch5; + private System.Windows.Forms.Label labelCustomSearch4; + private System.Windows.Forms.TextBox textBoxCustomSearchUrl4; + private System.Windows.Forms.ComboBox comboBoxCustomSearch4; + private System.Windows.Forms.Label labelCustomSearch3; + private System.Windows.Forms.TextBox textBoxCustomSearchUrl3; + private System.Windows.Forms.ComboBox comboBoxCustomSearch3; + private System.Windows.Forms.CheckBox checkBoxAllowOverlap; + private System.Windows.Forms.Label labelWaveformBorderHitMs2; + private System.Windows.Forms.NumericUpDown numericUpDownWaveformBorderHitMs; + private System.Windows.Forms.Label labelWaveformBorderHitMs1; + private System.Windows.Forms.Label labelSsaOutline; + private System.Windows.Forms.NumericUpDown numericUpDownSsaShadow; + private System.Windows.Forms.NumericUpDown numericUpDownSsaOutline; + private System.Windows.Forms.Label labelSsaShadow; + private System.Windows.Forms.GroupBox groupBoxPreview; + private System.Windows.Forms.PictureBox pictureBoxPreview; + private System.Windows.Forms.CheckBox checkBoxSsaOpaqueBox; + private System.Windows.Forms.CheckBox checkBoxSpellCheckOneLetterWords; + private System.Windows.Forms.CheckBox checkBoxTreatINQuoteAsING; + private System.Windows.Forms.GroupBox groupBoxFfmpeg; + private System.Windows.Forms.Button buttonBrowseToFFmpeg; + private System.Windows.Forms.TextBox textBoxFFmpegPath; + private System.Windows.Forms.Label labelFFmpegPath; + private System.Windows.Forms.CheckBox checkBoxUseFFmpeg; + private System.Windows.Forms.OpenFileDialog openFileDialogFFmpeg; + private System.Windows.Forms.CheckBox checkBoxWaveformHoverFocus; + private System.Windows.Forms.CheckBox checkBoxListViewMouseEnterFocus; + private System.Windows.Forms.NumericUpDown numericUpDownMinGapMs; + private System.Windows.Forms.Label labelMinGapMs; + private System.Windows.Forms.Label labelTBFixCommonErrors; + private System.Windows.Forms.PictureBox pictureBoxTBFixCommonErrors; + private System.Windows.Forms.CheckBox checkBoxTBFixCommonErrors; + private System.Windows.Forms.CheckBox checkBoxFixShortDisplayTimesAllowMoveStartTime; + private System.Windows.Forms.Button buttonVlcPathBrowse; + private System.Windows.Forms.TextBox textBoxVlcPath; + private System.Windows.Forms.Label labelVlcPath; + private System.Windows.Forms.GroupBox groupBoxToolsAutoBr; + private System.Windows.Forms.CheckBox checkBoxUseDoNotBreakAfterList; + private System.Windows.Forms.Button buttonEditDoNotBreakAfterList; + private System.Windows.Forms.CheckBox checkBoxCheckForUpdates; + private System.Windows.Forms.Label labelPlatform; + private System.Windows.Forms.CheckBox checkBoxVideoPlayerPreviewFontBold; + private System.Windows.Forms.Label labelWaveformTextSize; + private System.Windows.Forms.CheckBox checkBoxWaveformTextBold; + private System.Windows.Forms.ComboBox comboBoxWaveformTextSize; + private System.Windows.Forms.LinkLabel linkLabelOpenDictionaryFolder; + private System.Windows.Forms.GroupBox groupBoxNetworkSession; + private System.Windows.Forms.Button buttonNetworkSessionNewMessageSound; + private System.Windows.Forms.TextBox textBoxNetworkSessionNewMessageSound; + private System.Windows.Forms.Label labelNetworkSessionNewMessageSound; + private System.Windows.Forms.GroupBox groupBoxMargins; + private System.Windows.Forms.NumericUpDown numericUpDownSsaMarginVertical; + private System.Windows.Forms.NumericUpDown numericUpDownSsaMarginRight; + private System.Windows.Forms.NumericUpDown numericUpDownSsaMarginLeft; + private System.Windows.Forms.Label labelMarginVertical; + private System.Windows.Forms.Label labelMarginRight; + private System.Windows.Forms.Label labelMarginLeft; + private System.Windows.Forms.GroupBox groupBoxSsaBorder; + private System.Windows.Forms.GroupBox groupSsaBoxFont; + private System.Windows.Forms.NumericUpDown numericUpDownFontSize; + private System.Windows.Forms.ComboBox comboBoxFontName; + private System.Windows.Forms.Label labelSsaFontSize; + private System.Windows.Forms.Label labelFontName; + private System.Windows.Forms.Panel panelPrimaryColor; + private System.Windows.Forms.Button buttonSsaColor; + private System.Windows.Forms.CheckBox checkBoxSsaFontBold; + private System.Windows.Forms.CheckBox checkBoxFceSkipStep1; + private System.Windows.Forms.Button buttonMpvSettings; + private System.Windows.Forms.Label labelMpvSettings; + private System.Windows.Forms.LinkLabel linkLabelBingSubscribe; + private System.Windows.Forms.Label labelUserBingApiId; + private System.Windows.Forms.GroupBox groupBoxBing; + private System.Windows.Forms.Label labelBingApiKey; + private System.Windows.Forms.TextBox textBoxBingClientSecret; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox comboBoxAutoBackupDeleteAfter; + private System.Windows.Forms.Label labelAutoBackupDeleteAfter; + private System.Windows.Forms.Label labelTBRemoveTextForHi; + private System.Windows.Forms.PictureBox pictureBoxTBRemoveTextForHi; + private System.Windows.Forms.CheckBox checkBoxTBRemoveTextForHi; + private System.Windows.Forms.NumericUpDown numericUpDownMaxNumberOfLines; + private System.Windows.Forms.Label labelMaxLines; + private System.Windows.Forms.Label labelTBNetflixQualityCheck; + private System.Windows.Forms.PictureBox pictureBoxNetflixQualityCheck; + private System.Windows.Forms.CheckBox checkBoxNetflixQualityCheck; + private System.Windows.Forms.CheckBox checkBoxWaveformSetVideoPosMoveStartEnd; + private System.Windows.Forms.CheckBox checkBoxWaveformShowWpm; + private System.Windows.Forms.CheckBox checkBoxWaveformShowCps; + private System.Windows.Forms.NumericUpDown numericUpDownMaxWordsMin; + private System.Windows.Forms.Label labelMaxWordsPerMin; + private System.Windows.Forms.CheckBox checkBoxMpvHandlesPreviewText; + private System.Windows.Forms.CheckBox checkBoxVideoAutoOpen; + private System.Windows.Forms.Button buttonClearShortcut; + private System.Windows.Forms.CheckBox checkBoxAllowVolumeBoost; + private System.Windows.Forms.TabPage tabPageFont; + private System.Windows.Forms.GroupBox groupBoxFont; + private System.Windows.Forms.CheckBox checkBoxSubtitleCenter; + private System.Windows.Forms.Panel panelSubtitleFontColor; + private System.Windows.Forms.Panel panelSubtitleBackgroundColor; + private System.Windows.Forms.Label labelSubtitleFontBackgroundColor; + private System.Windows.Forms.Label labelSubtitleFontColor; + private System.Windows.Forms.Label labelSubtitleFontSize; + private System.Windows.Forms.ComboBox comboBoxSubtitleFont; + private System.Windows.Forms.CheckBox checkBoxSubtitleFontBold; + private System.Windows.Forms.ComboBox comboBoxSubtitleFontSize; + private System.Windows.Forms.Label labelSubtitleFont; + private System.Windows.Forms.ComboBox comboBoxSaveAsFileNameFrom; + private System.Windows.Forms.Label labelSaveAsFileNameFrom; + private System.Windows.Forms.GroupBox groupBoxGeneralRules; + private System.Windows.Forms.GroupBox groupBoxFontTextBox; + private System.Windows.Forms.GroupBox groupBoxFontListViews; + private System.Windows.Forms.Label labelSubtitleListViewFontSize; + private System.Windows.Forms.ComboBox comboBoxSubtitleListViewFontSize; + private System.Windows.Forms.CheckBox checkBoxSubtitleListViewFontBold; + private System.Windows.Forms.GroupBox groupBoxFontGeneral; + private System.Windows.Forms.Label labelFontNote; + private System.Windows.Forms.Button buttonDownloadFfmpeg; + private System.Windows.Forms.Button buttonShortcutsClear; + private System.Windows.Forms.Label labelShortcutsSearch; + private System.Windows.Forms.TextBox textBoxShortcutSearch; + private System.Windows.Forms.GroupBox groupBoxGoogleTranslate; + private System.Windows.Forms.Label labelGoogleTranslateApiKey; + private System.Windows.Forms.TextBox textBoxGoogleTransleApiKey; + private System.Windows.Forms.LinkLabel linkLabelGoogleTranslateSignUp; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.CheckBox checkBoxAutoSave; + private System.Windows.Forms.CheckBox checkBoxUseAlwaysToFile; + private System.Windows.Forms.Label labelOptimalCharsPerSecond; + private System.Windows.Forms.NumericUpDown numericUpDownOptimalCharsSec; + private System.Windows.Forms.Button buttonEditProfile; + private System.Windows.Forms.ComboBox comboBoxRulesProfileName; + private System.Windows.Forms.Label labelRulesProfileName; + private System.Windows.Forms.CheckBox checkBoxCpsIncludeWhiteSpace; + private System.Windows.Forms.Label labelBingTokenEndpoint; + private System.Windows.Forms.CheckBox checkBoxToolsBreakEarlyComma; + private System.Windows.Forms.CheckBox checkBoxToolsBreakEarlyDash; + private System.Windows.Forms.CheckBox checkBoxToolsBreakEarlyLineEnding; + private System.Windows.Forms.CheckBox checkBoxToolsBreakByPixelWidth; + private System.Windows.Forms.NumericUpDown numericUpDownToolsBreakPreferBottomHeavy; + private System.Windows.Forms.CheckBox checkBoxToolsBreakPreferBottomHeavy; + private System.Windows.Forms.Label labelToolsBreakBottomHeavyPercent; + private System.Windows.Forms.CheckBox checkBoxSyntaxColorGapTooSmall; + private System.Windows.Forms.Button buttonReset; + private System.Windows.Forms.Label labelDialogStyle; + private System.Windows.Forms.ComboBox comboBoxDialogStyle; + private System.Windows.Forms.ContextMenuStrip contextMenuStripShortcuts; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemShortcutsCollapse; + private System.Windows.Forms.CheckBox checkBoxWaveformSnapToSceneChanges; + private System.Windows.Forms.CheckBox checkBoxWaveformSingleClickSelect; + private System.Windows.Forms.Label labelSplitBehavior; + private System.Windows.Forms.ComboBox comboBoxSplitBehavior; + private System.Windows.Forms.Button buttonLineWidthSettings; + private System.Windows.Forms.CheckBox checkBoxSyntaxColorTextTooWide; + private System.Windows.Forms.Label labelContinuationStyle; + private System.Windows.Forms.Button buttonFixContinuationStyleSettings; + private System.Windows.Forms.ComboBox comboBoxContinuationStyle; + private System.Windows.Forms.ToolTip toolTipContinuationPreview; + private System.Windows.Forms.Panel panelWaveformCursorColor; + private System.Windows.Forms.Button buttonWaveformCursorColor; + private System.Windows.Forms.Button buttonGapChoose; + private System.Windows.Forms.CheckBox checkBoxSpellCheckAutoChangeNamesViaSuggestions; + private System.Windows.Forms.ComboBox comboBoxBoxBingTokenEndpoint; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem importShortcutsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem exportShortcutsToolStripMenuItem; + private System.Windows.Forms.SaveFileDialog saveFileDialog1; + private System.Windows.Forms.Panel panelTextBoxAssColor; + private System.Windows.Forms.Button buttonTextBoxAssColor; + private System.Windows.Forms.Panel panelTextBoxHtmlColor; + private System.Windows.Forms.Button buttonTextBoxHtmlColor; + private System.Windows.Forms.CheckBox checkBoxSubtitleTextBoxSyntaxColor; + } } \ No newline at end of file diff --git a/src/Forms/Settings.cs b/src/ui/Forms/Settings.cs similarity index 98% rename from src/Forms/Settings.cs rename to src/ui/Forms/Settings.cs index 4d019a2c7..b7f41df47 100644 --- a/src/Forms/Settings.cs +++ b/src/ui/Forms/Settings.cs @@ -1,3497 +1,3497 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.Dictionaries; -using Nikse.SubtitleEdit.Core.Enums; -using Nikse.SubtitleEdit.Core.Translate; -using Nikse.SubtitleEdit.Logic; -using Nikse.SubtitleEdit.Logic.VideoPlayers; -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class Settings : PositionAndSizeForm - { - private string _ssaFontName; - private double _ssaFontSize; - private int _ssaFontColor; - private string _listBoxSearchString = string.Empty; - private DateTime _listBoxSearchStringLastUsed = DateTime.Now; - private List _wordListNames = new List(); - private List _userWordList = new List(); - private OcrFixReplaceList _ocrFixReplaceList; - private string _oldVlcLocation; - private string _oldVlcLocationRelative; - private bool _oldListViewShowCps; - private bool _oldListViewShowWpm; - private readonly Dictionary _newShortcuts = new Dictionary(); - private List _rulesProfiles; - private bool _loading = true; - private bool _backgroundImageDark; - - private class ComboBoxLanguage - { - public CultureInfo CultureInfo { get; set; } - public override string ToString() - { - return CultureInfo.NativeName.CapitalizeFirstLetter(); - } - } - - public class ShortcutNode - { - public string Text { get; set; } - public string ShortcutText { get; set; } - public ShortcutHelper Shortcut { get; set; } - public List Nodes { get; set; } - - public ShortcutNode() - { - Nodes = new List(); - } - - public ShortcutNode(string text) - { - Text = text; - Nodes = new List(); - } - } - - public class ShortcutHelper - { - public ShortcutHelper(PropertyInfo shortcut, bool isMenuItem) - { - Shortcut = shortcut; - IsMenuItem = isMenuItem; - } - - public PropertyInfo Shortcut { get; set; } - public bool IsMenuItem { get; set; } - } - - private static string GetRelativePath(string fileName) - { - string folder = Configuration.BaseDirectory; - - if (string.IsNullOrEmpty(fileName) || !fileName.StartsWith(folder.Substring(0, 2), StringComparison.OrdinalIgnoreCase)) - { - return string.Empty; - } - - var pathUri = new Uri(fileName); - if (!folder.EndsWith(Path.DirectorySeparatorChar)) - { - folder += Path.DirectorySeparatorChar; - } - - var folderUri = new Uri(folder); - return Uri.UnescapeDataString(folderUri.MakeRelativeUri(pathUri).ToString().Replace('/', Path.DirectorySeparatorChar)); - } - - public Settings() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - UiUtil.FixLargeFonts(this, buttonOK); - Init(); - } - - public void Init() - { - _loading = true; - labelStatus.Text = string.Empty; - _rulesProfiles = new List(Configuration.Settings.General.Profiles); - var gs = Configuration.Settings.General; - - checkBoxToolbarNew.Checked = gs.ShowToolbarNew; - checkBoxToolbarOpen.Checked = gs.ShowToolbarOpen; - checkBoxToolbarSave.Checked = gs.ShowToolbarSave; - checkBoxToolbarSaveAs.Checked = gs.ShowToolbarSaveAs; - checkBoxToolbarFind.Checked = gs.ShowToolbarFind; - checkBoxReplace.Checked = gs.ShowToolbarReplace; - checkBoxTBFixCommonErrors.Checked = gs.ShowToolbarFixCommonErrors; - checkBoxTBRemoveTextForHi.Checked = gs.ShowToolbarRemoveTextForHi; - checkBoxVisualSync.Checked = gs.ShowToolbarVisualSync; - checkBoxSettings.Checked = gs.ShowToolbarSettings; - checkBoxSpellCheck.Checked = gs.ShowToolbarSpellCheck; - checkBoxNetflixQualityCheck.Checked = gs.ShowToolbarNetflixGlyphCheck; - checkBoxHelp.Checked = gs.ShowToolbarHelp; - - comboBoxFrameRate.Items.Clear(); - comboBoxFrameRate.Items.Add(23.976.ToString(CultureInfo.CurrentCulture)); - comboBoxFrameRate.Items.Add(24.0.ToString(CultureInfo.CurrentCulture)); - comboBoxFrameRate.Items.Add(25.0.ToString(CultureInfo.CurrentCulture)); - comboBoxFrameRate.Items.Add(29.97.ToString(CultureInfo.CurrentCulture)); - comboBoxFrameRate.Items.Add(30.00.ToString(CultureInfo.CurrentCulture)); - comboBoxFrameRate.Items.Add(50.00.ToString(CultureInfo.CurrentCulture)); - comboBoxFrameRate.Items.Add(59.94.ToString(CultureInfo.CurrentCulture)); - comboBoxFrameRate.Items.Add(60.00.ToString(CultureInfo.CurrentCulture)); - - checkBoxShowFrameRate.Checked = gs.ShowFrameRate; - comboBoxFrameRate.Text = gs.DefaultFrameRate.ToString(CultureInfo.CurrentCulture); - - UiUtil.InitializeTextEncodingComboBox(comboBoxEncoding); - - checkBoxAutoDetectAnsiEncoding.Checked = gs.AutoGuessAnsiEncoding; - comboBoxSubtitleFontSize.Text = gs.SubtitleTextBoxFontSize.ToString(CultureInfo.InvariantCulture); - comboBoxSubtitleListViewFontSize.Text = gs.SubtitleListViewFontSize.ToString(CultureInfo.InvariantCulture); - checkBoxSubtitleFontBold.Checked = gs.SubtitleTextBoxFontBold; - checkBoxSubtitleTextBoxSyntaxColor.Checked = gs.SubtitleTextBoxSyntaxColor; - panelTextBoxHtmlColor.BackColor = gs.SubtitleTextBoxHtmlColor; - panelTextBoxAssColor.BackColor = gs.SubtitleTextBoxAssColor; - checkBoxSubtitleListViewFontBold.Checked = gs.SubtitleListViewFontBold; - checkBoxSubtitleCenter.Checked = gs.CenterSubtitleInTextBox; - panelSubtitleFontColor.BackColor = gs.SubtitleFontColor; - panelSubtitleBackgroundColor.BackColor = gs.SubtitleBackgroundColor; - checkBoxRememberRecentFiles.Checked = gs.ShowRecentFiles; - checkBoxRememberRecentFiles_CheckedChanged(null, null); - checkBoxRememberSelectedLine.Checked = gs.RememberSelectedLine; - checkBoxReopenLastOpened.Checked = gs.StartLoadLastFile; - checkBoxStartInSourceView.Checked = gs.StartInSourceView; - checkBoxRemoveBlankLinesWhenOpening.Checked = gs.RemoveBlankLinesWhenOpening; - checkBoxRememberWindowPosition.Checked = gs.StartRememberPositionAndSize; - numericUpDownSubtitleLineMaximumLength.Value = gs.SubtitleLineMaximumLength; - numericUpDownOptimalCharsSec.Value = (decimal)gs.SubtitleOptimalCharactersPerSeconds; - numericUpDownMaxCharsSec.Value = (decimal)gs.SubtitleMaximumCharactersPerSeconds; - numericUpDownMaxWordsMin.Value = (decimal)gs.SubtitleMaximumWordsPerMinute; - checkBoxAutoWrapWhileTyping.Checked = gs.AutoWrapLineWhileTyping; - textBoxShowLineBreaksAs.Text = gs.ListViewLineSeparatorString; - - numericUpDownDurationMin.Value = gs.SubtitleMinimumDisplayMilliseconds; - numericUpDownDurationMax.Value = gs.SubtitleMaximumDisplayMilliseconds; - - if (gs.MinimumMillisecondsBetweenLines >= numericUpDownMinGapMs.Minimum && - gs.MinimumMillisecondsBetweenLines <= numericUpDownMinGapMs.Maximum) - { - numericUpDownMinGapMs.Value = gs.MinimumMillisecondsBetweenLines; - } - - if (gs.VideoPlayer.Trim().Equals("VLC", StringComparison.OrdinalIgnoreCase) && LibVlcDynamic.IsInstalled) - { - radioButtonVideoPlayerVLC.Checked = true; - } - else if (gs.VideoPlayer.Trim().Equals("MPV", StringComparison.OrdinalIgnoreCase) && LibMpvDynamic.IsInstalled) - { - radioButtonVideoPlayerMPV.Checked = true; - } - else if (gs.VideoPlayer.Trim().Equals("MPC-HC", StringComparison.OrdinalIgnoreCase) && UiUtil.IsMpcHcInstalled) - { - radioButtonVideoPlayerMpcHc.Checked = true; - } - else if (UiUtil.IsQuartsDllInstalled) - { - radioButtonVideoPlayerDirectShow.Checked = true; - } - else if (LibMpvDynamic.IsInstalled) - { - radioButtonVideoPlayerMPV.Checked = true; - } - else if (LibVlcDynamic.IsInstalled) - { - radioButtonVideoPlayerVLC.Checked = true; - } - - if (!LibVlcDynamic.IsInstalled) - { - radioButtonVideoPlayerVLC.Enabled = false; - } - - if (!UiUtil.IsQuartsDllInstalled) - { - radioButtonVideoPlayerDirectShow.Enabled = false; - } - - if (Logic.VideoPlayers.MpcHC.MpcHc.GetMpcHcFileName() == null) - { - radioButtonVideoPlayerMpcHc.Enabled = false; - } - - RefreshMpvSettings(); - buttonMpvSettings.Text = Configuration.Settings.Language.SettingsMpv.DownloadMpv; - checkBoxMpvHandlesPreviewText.Checked = gs.MpvHandlesPreviewText; - - textBoxVlcPath.Text = gs.VlcLocation; - textBoxVlcPath.Left = labelVideoPlayerVLC.Left + labelVideoPlayerVLC.Width + 5; - textBoxVlcPath.Width = buttonVlcPathBrowse.Left - textBoxVlcPath.Left - 5; - - labelVlcPath.Text = Configuration.Settings.Language.Settings.VlcBrowseToLabel; - - checkBoxVideoPlayerShowStopButton.Checked = gs.VideoPlayerShowStopButton; - checkBoxVideoPlayerShowMuteButton.Checked = gs.VideoPlayerShowMuteButton; - checkBoxVideoPlayerShowFullscreenButton.Checked = gs.VideoPlayerShowFullscreenButton; - - int videoPlayerPreviewFontSizeIndex = gs.VideoPlayerPreviewFontSize - int.Parse(comboBoxlVideoPlayerPreviewFontSize.Items[0].ToString()); - if (videoPlayerPreviewFontSizeIndex >= 0 && videoPlayerPreviewFontSizeIndex < comboBoxlVideoPlayerPreviewFontSize.Items.Count) - { - comboBoxlVideoPlayerPreviewFontSize.SelectedIndex = videoPlayerPreviewFontSizeIndex; - } - else - { - comboBoxlVideoPlayerPreviewFontSize.SelectedIndex = 3; - } - - checkBoxVideoPlayerPreviewFontBold.Checked = gs.VideoPlayerPreviewFontBold; - - checkBoxVideoAutoOpen.Checked = !gs.DisableVideoAutoLoading; - checkBoxAllowVolumeBoost.Checked = gs.AllowVolumeBoost; - - comboBoxCustomSearch1.Text = Configuration.Settings.VideoControls.CustomSearchText1; - comboBoxCustomSearch2.Text = Configuration.Settings.VideoControls.CustomSearchText2; - comboBoxCustomSearch3.Text = Configuration.Settings.VideoControls.CustomSearchText3; - comboBoxCustomSearch4.Text = Configuration.Settings.VideoControls.CustomSearchText4; - comboBoxCustomSearch5.Text = Configuration.Settings.VideoControls.CustomSearchText5; - textBoxCustomSearchUrl1.Text = Configuration.Settings.VideoControls.CustomSearchUrl1; - textBoxCustomSearchUrl2.Text = Configuration.Settings.VideoControls.CustomSearchUrl2; - textBoxCustomSearchUrl3.Text = Configuration.Settings.VideoControls.CustomSearchUrl3; - textBoxCustomSearchUrl4.Text = Configuration.Settings.VideoControls.CustomSearchUrl4; - textBoxCustomSearchUrl5.Text = Configuration.Settings.VideoControls.CustomSearchUrl5; - - comboBoxFontName.BeginUpdate(); - comboBoxSubtitleFont.BeginUpdate(); - comboBoxFontName.Items.Clear(); - comboBoxSubtitleFont.Items.Clear(); - var comboBoxFontNameList = new List(); - var comboBoxSubtitleFontList = new List(); - var comboBoxSubtitleFontIndex = 0; - foreach (var x in FontFamily.Families.OrderBy(p => p.Name)) - { - comboBoxFontNameList.Add(x.Name); - if (x.IsStyleAvailable(FontStyle.Regular) && x.IsStyleAvailable(FontStyle.Bold)) - { - comboBoxSubtitleFontList.Add(x.Name); - if (x.Name.Equals(gs.SubtitleFontName, StringComparison.OrdinalIgnoreCase)) - { - comboBoxSubtitleFontIndex = comboBoxSubtitleFontList.Count - 1; - } - } - } - comboBoxFontName.Items.AddRange(comboBoxFontNameList.ToArray()); - comboBoxSubtitleFont.Items.AddRange(comboBoxSubtitleFontList.ToArray()); - comboBoxSubtitleFont.SelectedIndex = comboBoxSubtitleFontIndex; - comboBoxFontName.EndUpdate(); - comboBoxSubtitleFont.EndUpdate(); - - var wordListSettings = Configuration.Settings.WordLists; - checkBoxNamesOnline.Checked = wordListSettings.UseOnlineNames; - textBoxNamesOnline.Text = wordListSettings.NamesUrl; - - var ssa = Configuration.Settings.SubtitleSettings; - _ssaFontName = ssa.SsaFontName; - _ssaFontSize = ssa.SsaFontSize; - _ssaFontColor = ssa.SsaFontColorArgb; - if (ssa.SsaOutline >= numericUpDownSsaOutline.Minimum && ssa.SsaOutline <= numericUpDownSsaOutline.Maximum) - { - numericUpDownSsaOutline.Value = ssa.SsaOutline; - } - - if (ssa.SsaShadow >= numericUpDownSsaShadow.Minimum && ssa.SsaShadow <= numericUpDownSsaShadow.Maximum) - { - numericUpDownSsaShadow.Value = ssa.SsaShadow; - } - - numericUpDownSsaMarginLeft.Value = ssa.SsaMarginLeft; - numericUpDownSsaMarginRight.Value = ssa.SsaMarginRight; - numericUpDownSsaMarginVertical.Value = ssa.SsaMarginTopBottom; - checkBoxSsaFontBold.Checked = ssa.SsaFontBold; - checkBoxSsaOpaqueBox.Checked = ssa.SsaOpaqueBox; - numericUpDownFontSize.Value = (decimal)ssa.SsaFontSize; - comboBoxFontName.Text = ssa.SsaFontName; - panelPrimaryColor.BackColor = Color.FromArgb(_ssaFontColor); - - var proxy = Configuration.Settings.Proxy; - textBoxProxyAddress.Text = proxy.ProxyAddress; - textBoxProxyUserName.Text = proxy.UserName; - textBoxProxyPassword.Text = proxy.Password == null ? string.Empty : proxy.DecodePassword(); - textBoxProxyDomain.Text = proxy.Domain; - - textBoxNetworkSessionNewMessageSound.Text = Configuration.Settings.NetworkSettings.NewMessageSound; - - checkBoxSyntaxColorDurationTooSmall.Checked = Configuration.Settings.Tools.ListViewSyntaxColorDurationSmall; - checkBoxSyntaxColorDurationTooLarge.Checked = Configuration.Settings.Tools.ListViewSyntaxColorDurationBig; - checkBoxSyntaxColorTextTooLong.Checked = Configuration.Settings.Tools.ListViewSyntaxColorLongLines; - checkBoxSyntaxColorTextTooWide.Checked = Configuration.Settings.Tools.ListViewSyntaxColorWideLines; - checkBoxSyntaxColorTextMoreThanTwoLines.Checked = Configuration.Settings.Tools.ListViewSyntaxMoreThanXLines; - if (Configuration.Settings.General.MaxNumberOfLines >= numericUpDownMaxNumberOfLines.Minimum && - Configuration.Settings.General.MaxNumberOfLines <= numericUpDownMaxNumberOfLines.Maximum) - { - numericUpDownMaxNumberOfLines.Value = Configuration.Settings.General.MaxNumberOfLines; - } - checkBoxSyntaxOverlap.Checked = Configuration.Settings.Tools.ListViewSyntaxColorOverlap; - checkBoxSyntaxColorGapTooSmall.Checked = Configuration.Settings.Tools.ListViewSyntaxColorGap; - panelListViewSyntaxColorError.BackColor = Configuration.Settings.Tools.ListViewSyntaxErrorColor; - - // Language - var language = Configuration.Settings.Language.Settings; - Text = language.Title; - tabPageGeneral.Text = language.General; - tabPageVideoPlayer.Text = language.VideoPlayer; - tabPageWaveform.Text = language.WaveformAndSpectrogram; - tabPageWordLists.Text = language.WordLists; - tabPageTools.Text = language.Tools; - tabPageSsaStyle.Text = language.SsaStyle; - tabPageNetwork.Text = language.Network; - tabPageToolBar.Text = language.Toolbar; - tabPageFont.Text = Configuration.Settings.Language.DCinemaProperties.Font; - tabPageShortcuts.Text = language.Shortcuts; - tabPageSyntaxColoring.Text = language.SyntaxColoring; - groupBoxShowToolBarButtons.Text = language.ShowToolBarButtons; - labelTBNew.Text = language.New; - labelTBOpen.Text = language.Open; - labelTBSave.Text = language.Save; - labelTBSaveAs.Text = language.SaveAs; - labelTBFind.Text = language.Find; - labelTBReplace.Text = language.Replace; - labelTBFixCommonErrors.Text = language.FixCommonerrors; - labelTBRemoveTextForHi.Text = language.RemoveTextForHi; - labelTBVisualSync.Text = language.VisualSync; - labelTBSpellCheck.Text = language.SpellCheck; - labelTBNetflixQualityCheck.Text = language.NetflixQualityCheck; - labelTBSettings.Text = language.SettingsName; - labelTBHelp.Text = language.Help; - checkBoxToolbarNew.Text = Configuration.Settings.Language.General.Visible; - checkBoxToolbarOpen.Text = Configuration.Settings.Language.General.Visible; - checkBoxToolbarSave.Text = Configuration.Settings.Language.General.Visible; - checkBoxToolbarSaveAs.Text = Configuration.Settings.Language.General.Visible; - checkBoxToolbarFind.Text = Configuration.Settings.Language.General.Visible; - checkBoxReplace.Text = Configuration.Settings.Language.General.Visible; - checkBoxTBFixCommonErrors.Text = Configuration.Settings.Language.General.Visible; - checkBoxTBRemoveTextForHi.Text = Configuration.Settings.Language.General.Visible; - checkBoxVisualSync.Text = Configuration.Settings.Language.General.Visible; - checkBoxSpellCheck.Text = Configuration.Settings.Language.General.Visible; - checkBoxNetflixQualityCheck.Text = Configuration.Settings.Language.General.Visible; - checkBoxSettings.Text = Configuration.Settings.Language.General.Visible; - checkBoxHelp.Text = Configuration.Settings.Language.General.Visible; - - groupBoxMiscellaneous.Text = language.General; - groupBoxGeneralRules.Text = language.Rules; - labelRulesProfileName.Text = language.Profile; - checkBoxShowFrameRate.Text = language.ShowFrameRate; - labelDefaultFrameRate.Text = language.DefaultFrameRate; - labelDefaultFileEncoding.Text = language.DefaultFileEncoding; - labelAutoDetectAnsiEncoding.Text = language.AutoDetectAnsiEncoding; - labelSubMaxLen.Text = language.SubtitleLineMaximumLength; - labelOptimalCharsPerSecond.Text = language.OptimalCharactersPerSecond; - labelMaxCharsPerSecond.Text = language.MaximumCharactersPerSecond; - labelMaxWordsPerMin.Text = language.MaximumWordssPerMinute; - checkBoxAutoWrapWhileTyping.Text = language.AutoWrapWhileTyping; - groupBoxFont.Text = language.FontInUi; - groupBoxFontGeneral.Text = language.General; - groupBoxFontListViews.Text = language.ListView; - groupBoxFontTextBox.Text = language.TextBox; - labelFontNote.Text = language.FontNote; - labelMinDuration.Text = language.DurationMinimumMilliseconds; - labelMaxDuration.Text = language.DurationMaximumMilliseconds; - labelMinGapMs.Text = language.MinimumGapMilliseconds; - buttonGapChoose.Left = numericUpDownMinGapMs.Left + numericUpDownMinGapMs.Width + 5; - labelMaxLines.Text = language.MaximumLines; - if (labelSubMaxLen.Left + labelSubMaxLen.Width > numericUpDownSubtitleLineMaximumLength.Left) - { - numericUpDownSubtitleLineMaximumLength.Left = labelSubMaxLen.Left + labelSubMaxLen.Width + 3; - } - - if (labelMaxCharsPerSecond.Left + labelMaxCharsPerSecond.Width > numericUpDownMaxCharsSec.Left) - { - numericUpDownMaxCharsSec.Left = labelMaxCharsPerSecond.Left + labelMaxCharsPerSecond.Width + 3; - } - - if (labelMaxWordsPerMin.Left + labelMaxWordsPerMin.Width > numericUpDownMaxWordsMin.Left) - { - numericUpDownMaxWordsMin.Left = labelMaxWordsPerMin.Left + labelMaxWordsPerMin.Width + 3; - } - - if (labelMinDuration.Left + labelMinDuration.Width > numericUpDownDurationMin.Left) - { - numericUpDownDurationMin.Left = labelMinDuration.Left + labelMinDuration.Width + 3; - } - - if (labelMaxDuration.Left + labelMaxDuration.Width > numericUpDownDurationMax.Left) - { - numericUpDownDurationMax.Left = labelMaxDuration.Left + labelMaxDuration.Width + 3; - } - - if (labelMinGapMs.Left + labelMinGapMs.Width > numericUpDownMinGapMs.Left) - { - numericUpDownMinGapMs.Left = labelMinGapMs.Left + labelMinGapMs.Width + 3; - } - - if (labelMergeShortLines.Left + labelMergeShortLines.Width > comboBoxMergeShortLineLength.Left) - { - comboBoxMergeShortLineLength.Left = labelMergeShortLines.Left + labelMergeShortLines.Width + 3; - } - - labelSubtitleFont.Text = language.SubtitleFont; - labelSubtitleFontSize.Text = language.SubtitleFontSize; - labelSubtitleListViewFontSize.Text = language.SubtitleFontSize; - checkBoxSubtitleFontBold.Text = language.SubtitleBold; - checkBoxSubtitleTextBoxSyntaxColor.Text = language.UseSyntaxColoring; - buttonTextBoxHtmlColor.Text = language.HtmlColor; - buttonTextBoxAssColor.Text = language.AssaColor; - checkBoxSubtitleListViewFontBold.Text = language.SubtitleBold; - checkBoxSubtitleCenter.Text = language.SubtitleCenter; - checkBoxSubtitleCenter.Left = checkBoxSubtitleFontBold.Left; - labelSubtitleFontColor.Text = language.SubtitleFontColor; - labelSubtitleFontBackgroundColor.Text = language.SubtitleBackgroundColor; - labelSpellChecker.Text = language.SpellChecker; - comboBoxSpellChecker.Left = labelSpellChecker.Left + labelSpellChecker.Width + 4; - checkBoxRememberRecentFiles.Text = language.RememberRecentFiles; - checkBoxReopenLastOpened.Text = language.StartWithLastFileLoaded; - checkBoxRememberSelectedLine.Text = language.RememberSelectedLine; - checkBoxStartInSourceView.Text = language.StartInSourceView; - checkBoxRemoveBlankLinesWhenOpening.Text = language.RemoveBlankLinesWhenOpening; - checkBoxRememberWindowPosition.Text = language.RememberPositionAndSize; - - labelShowLineBreaksAs.Text = language.ShowLineBreaksAs; - textBoxShowLineBreaksAs.Left = labelShowLineBreaksAs.Left + labelShowLineBreaksAs.Width; - labelListViewDoubleClickEvent.Text = language.MainListViewDoubleClickAction; - labelSaveAsFileNameFrom.Text = language.SaveAsFileNameFrom; - labelAutoBackup.Text = language.AutoBackup; - labelAutoBackupDeleteAfter.Text = language.AutoBackupDeleteAfter; - comboBoxAutoBackup.Left = labelAutoBackup.Left + labelAutoBackup.Width + 3; - labelAutoBackupDeleteAfter.Left = comboBoxAutoBackup.Left + comboBoxAutoBackup.Width + 5; - comboBoxAutoBackupDeleteAfter.Left = labelAutoBackupDeleteAfter.Left + labelAutoBackupDeleteAfter.Width + 3; - checkBoxCheckForUpdates.Text = language.CheckForUpdates; - checkBoxAutoSave.Text = language.AutoSave; - checkBoxCheckForUpdates.Left = checkBoxAutoSave.Left + checkBoxAutoSave.Width + 15; - checkBoxAllowEditOfOriginalSubtitle.Text = language.AllowEditOfOriginalSubtitle; - checkBoxPromptDeleteLines.Text = language.PromptDeleteLines; - - comboBoxTimeCodeMode.Items.Clear(); - comboBoxTimeCodeMode.Items.Add(language.TimeCodeModeHHMMSSMS); - comboBoxTimeCodeMode.Items.Add(language.TimeCodeModeHHMMSSFF); - comboBoxTimeCodeMode.SelectedIndex = gs.UseTimeFormatHHMMSSFF ? 1 : 0; - labelTimeCodeMode.Text = language.TimeCodeMode; - comboBoxTimeCodeMode.Left = labelTimeCodeMode.Left + labelTimeCodeMode.Width + 4; - - comboBoxSplitBehavior.Items.Clear(); - comboBoxSplitBehavior.Items.Add(language.SplitBehaviorPrevious); - comboBoxSplitBehavior.Items.Add(language.SplitBehaviorHalf); - comboBoxSplitBehavior.Items.Add(language.SplitBehaviorNext); - comboBoxSplitBehavior.SelectedIndex = gs.SplitBehavior; - labelSplitBehavior.Text = language.SplitBehavior; - comboBoxSplitBehavior.Left = labelTimeCodeMode.Left + labelTimeCodeMode.Width + 4; - if (labelSplitBehavior.Width > labelTimeCodeMode.Width) - { - comboBoxSplitBehavior.Left = labelSplitBehavior.Left + labelSplitBehavior.Width + 4; - } - - var dropDownSplitBehaviorWidth = comboBoxSplitBehavior.Width; - using (var g = Graphics.FromHwnd(IntPtr.Zero)) - { - foreach (var item in comboBoxSplitBehavior.Items) - { - var itemWidth = (int)g.MeasureString((string)item, Font).Width + 5; - dropDownSplitBehaviorWidth = Math.Max(itemWidth, dropDownSplitBehaviorWidth); - } - } - comboBoxSplitBehavior.DropDownWidth = dropDownSplitBehaviorWidth; - - - comboBoxAutoBackup.Items[0] = Configuration.Settings.Language.General.None; - comboBoxAutoBackup.Items[1] = language.AutoBackupEveryMinute; - comboBoxAutoBackup.Items[2] = language.AutoBackupEveryFiveMinutes; - comboBoxAutoBackup.Items[3] = language.AutoBackupEveryFifteenMinutes; - - comboBoxAutoBackupDeleteAfter.Items[0] = language.AutoBackupDeleteAfterOneMonth; - comboBoxAutoBackupDeleteAfter.Items[1] = language.AutoBackupDeleteAfterThreeMonths; - comboBoxAutoBackupDeleteAfter.Items[2] = language.AutoBackupDeleteAfterSixMonths; - - groupBoxVideoEngine.Text = language.VideoEngine; - radioButtonVideoPlayerDirectShow.Text = language.DirectShow; - - labelDirectShowDescription.Text = language.DirectShowDescription; - - radioButtonVideoPlayerMpcHc.Text = language.MpcHc; - labelMpcHcDescription.Text = language.MpcHcDescription; - - radioButtonVideoPlayerMPV.Text = language.MpvPlayer; - labelVideoPlayerMPlayer.Text = language.MpvPlayerDescription; - buttonMpvSettings.Left = labelVideoPlayerMPlayer.Left + labelVideoPlayerMPlayer.Width + 5; - labelMpvSettings.Left = buttonMpvSettings.Left + buttonMpvSettings.Width + 5; - checkBoxMpvHandlesPreviewText.Text = language.MpvHandlesPreviewText; - - radioButtonVideoPlayerVLC.Text = language.VlcMediaPlayer; - labelVideoPlayerVLC.Text = language.VlcMediaPlayerDescription; - gs.VlcLocation = textBoxVlcPath.Text; - - checkBoxVideoPlayerShowStopButton.Text = language.ShowStopButton; - checkBoxVideoPlayerShowMuteButton.Text = language.ShowMuteButton; - checkBoxVideoPlayerShowFullscreenButton.Text = language.ShowFullscreenButton; - - labelVideoPlayerPreviewFontSize.Text = language.PreviewFontSize; - comboBoxlVideoPlayerPreviewFontSize.Left = labelVideoPlayerPreviewFontSize.Left + labelVideoPlayerPreviewFontSize.Width; - checkBoxVideoPlayerPreviewFontBold.Text = language.SubtitleBold; - checkBoxVideoPlayerPreviewFontBold.Left = comboBoxlVideoPlayerPreviewFontSize.Left; - - checkBoxVideoAutoOpen.Text = language.VideoAutoOpen; - checkBoxAllowVolumeBoost.Text = language.AllowVolumeBoost; - - groupBoxMainWindowVideoControls.Text = language.MainWindowVideoControls; - labelCustomSearch.Text = language.CustomSearchTextAndUrl; - - groupBoxWaveformAppearence.Text = language.WaveformAppearance; - checkBoxWaveformShowGrid.Text = language.WaveformShowGridLines; - checkBoxWaveformShowCps.Text = language.WaveformShowCps; - checkBoxWaveformShowWpm.Text = language.WaveformShowWpm; - checkBoxReverseMouseWheelScrollDirection.Text = language.ReverseMouseWheelScrollDirection; - checkBoxAllowOverlap.Text = language.WaveformAllowOverlap; - checkBoxWaveformSetVideoPosMoveStartEnd.Text = language.WaveformSetVideoPosMoveStartEnd; - checkBoxWaveformHoverFocus.Text = language.WaveformFocusMouseEnter; - checkBoxListViewMouseEnterFocus.Text = language.WaveformListViewFocusMouseEnter; - checkBoxWaveformSingleClickSelect.Text = language.WaveformSingleClickSelect; - checkBoxWaveformSnapToSceneChanges.Text = language.WaveformSnapToSceneChanges; - labelWaveformBorderHitMs1.Text = language.WaveformBorderHitMs1; - labelWaveformBorderHitMs2.Text = language.WaveformBorderHitMs2; - numericUpDownWaveformBorderHitMs.Left = labelWaveformBorderHitMs1.Left + labelWaveformBorderHitMs1.Width; - labelWaveformBorderHitMs2.Left = numericUpDownWaveformBorderHitMs.Left + numericUpDownWaveformBorderHitMs.Width + 2; - - buttonWaveformGridColor.Text = language.WaveformGridColor; - buttonWaveformColor.Text = language.WaveformColor; - buttonWaveformSelectedColor.Text = language.WaveformSelectedColor; - buttonWaveformTextColor.Text = language.WaveformTextColor; - buttonWaveformBackgroundColor.Text = language.WaveformBackgroundColor; - buttonWaveformCursorColor.Text = language.WaveformCursorColor; - groupBoxSpectrogram.Text = language.Spectrogram; - checkBoxGenerateSpectrogram.Text = language.GenerateSpectrogram; - labelSpectrogramAppearance.Text = language.SpectrogramAppearance; - comboBoxSpectrogramAppearance.Items.Clear(); - comboBoxSpectrogramAppearance.Items.Add(language.SpectrogramOneColorGradient); - comboBoxSpectrogramAppearance.Items.Add(language.SpectrogramClassic); - labelWaveformTextSize.Text = language.WaveformTextFontSize; - comboBoxWaveformTextSize.Left = labelWaveformTextSize.Left + labelWaveformTextSize.Width + 5; - checkBoxWaveformTextBold.Text = language.SubtitleBold; - checkBoxWaveformTextBold.Left = comboBoxWaveformTextSize.Left + comboBoxWaveformTextSize.Width + 5; - - buttonWaveformsFolderEmpty.Text = language.WaveformAndSpectrogramsFolderEmpty; - InitializeWaveformsAndSpectrogramsFolderEmpty(language); - - checkBoxUseFFmpeg.Text = language.WaveformUseFFmpeg; - buttonDownloadFfmpeg.Text = language.DownloadFFmpeg; - if (!Configuration.IsRunningOnWindows) - { - buttonDownloadFfmpeg.Visible = false; - labelFFmpegPath.Visible = false; - textBoxFFmpegPath.Visible = false; - buttonBrowseToFFmpeg.Visible = false; - - buttonMpvSettings.Visible = false; - radioButtonVideoPlayerDirectShow.Enabled = false; - radioButtonVideoPlayerMpcHc.Enabled = false; - var isLibVlcInstalled = LibVlcDynamic.IsInstalled; - radioButtonVideoPlayerVLC.Enabled = isLibVlcInstalled; - if (gs.VideoPlayer.Trim().Equals("VLC", StringComparison.OrdinalIgnoreCase) && isLibVlcInstalled) - { - radioButtonVideoPlayerVLC.Checked = true; - } - if (LibMpvDynamic.IsInstalled) - { - radioButtonVideoPlayerMPV.Enabled = true; - radioButtonVideoPlayerMPV.Checked = !(gs.VideoPlayer.Trim().Equals("VLC", StringComparison.OrdinalIgnoreCase) && isLibVlcInstalled); - labelMpvSettings.Text = "--vo=" + Configuration.Settings.General.MpvVideoOutputLinux; - } - textBoxVlcPath.Visible = false; - labelVlcPath.Visible = false; - buttonVlcPathBrowse.Visible = false; - } - - labelFFmpegPath.Text = language.WaveformFFmpegPath; - - groupBoxSsaStyle.Text = language.SubStationAlphaStyle; - - var ssaStyles = Configuration.Settings.Language.SubStationAlphaStyles; - labelSsaFontSize.Text = ssaStyles.FontSize; - labelFontName.Text = ssaStyles.FontName; - buttonSsaColor.Text = Configuration.Settings.Language.Settings.ChooseColor; - groupSsaBoxFont.Text = ssaStyles.Font; - groupBoxSsaBorder.Text = ssaStyles.Border; - groupBoxMargins.Text = ssaStyles.Margins; - labelMarginLeft.Text = ssaStyles.MarginLeft; - labelMarginRight.Text = ssaStyles.MarginRight; - labelMarginVertical.Text = ssaStyles.MarginVertical; - labelSsaOutline.Text = language.SsaOutline; - labelSsaShadow.Text = language.SsaShadow; - checkBoxSsaOpaqueBox.Text = language.SsaOpaqueBox; - checkBoxSsaFontBold.Text = Configuration.Settings.Language.General.Bold; - - groupBoxPreview.Text = Configuration.Settings.Language.General.Preview; - - numericUpDownSsaOutline.Left = labelSsaOutline.Left + labelSsaOutline.Width + 4; - numericUpDownSsaShadow.Left = labelSsaShadow.Left + labelSsaShadow.Width + 4; - if (Math.Abs(numericUpDownSsaOutline.Left - numericUpDownSsaShadow.Left) < 9) - { - if (numericUpDownSsaOutline.Left > numericUpDownSsaShadow.Left) - { - numericUpDownSsaShadow.Left = numericUpDownSsaOutline.Left; - } - else - { - numericUpDownSsaOutline.Left = numericUpDownSsaShadow.Left; - } - } - - groupBoxWordLists.Text = language.WordLists; - labelWordListLanguage.Text = language.Language; - comboBoxWordListLanguage.Left = labelWordListLanguage.Left + labelWordListLanguage.Width + 4; - groupBoxNamesIgonoreLists.Text = language.NamesIgnoreLists; - groupBoxUserWordList.Text = language.UserWordList; - groupBoxOcrFixList.Text = language.OcrFixList; - buttonRemoveNameEtc.Text = language.Remove; - buttonRemoveUserWord.Text = language.Remove; - buttonRemoveOcrFix.Text = language.Remove; - buttonAddNames.Text = language.AddName; - buttonAddUserWord.Text = language.AddWord; - buttonAddOcrFix.Text = language.AddPair; - groupBoxWordListLocation.Text = language.Location; - checkBoxNamesOnline.Text = language.UseOnlineNames; - linkLabelOpenDictionaryFolder.Text = Configuration.Settings.Language.GetDictionaries.OpenDictionariesFolder; - - groupBoxProxySettings.Text = language.ProxyServerSettings; - labelProxyAddress.Text = language.ProxyAddress; - groupBoxProxyAuthentication.Text = language.ProxyAuthentication; - labelProxyUserName.Text = language.ProxyUserName; - labelProxyPassword.Text = language.ProxyPassword; - labelProxyDomain.Text = language.ProxyDomain; - - groupBoxNetworkSession.Text = language.NetworkSessionSettings; - labelNetworkSessionNewMessageSound.Text = language.NetworkSessionNewSound; - - groupBoxToolsVisualSync.Text = language.VisualSync; - labelVerifyButton.Text = language.PlayXSecondsAndBack; - labelToolsStartScene.Text = language.StartSceneIndex; - labelToolsEndScene.Text = language.EndSceneIndex; - comboBoxToolsStartSceneIndex.Items.Clear(); - comboBoxToolsStartSceneIndex.Items.Add(string.Format(language.FirstPlusX, 0)); - comboBoxToolsStartSceneIndex.Items.Add(string.Format(language.FirstPlusX, 1)); - comboBoxToolsStartSceneIndex.Items.Add(string.Format(language.FirstPlusX, 2)); - comboBoxToolsStartSceneIndex.Items.Add(string.Format(language.FirstPlusX, 3)); - comboBoxToolsEndSceneIndex.Items.Clear(); - comboBoxToolsEndSceneIndex.Items.Add(string.Format(language.LastMinusX, 0)); - comboBoxToolsEndSceneIndex.Items.Add(string.Format(language.LastMinusX, 1)); - comboBoxToolsEndSceneIndex.Items.Add(string.Format(language.LastMinusX, 2)); - comboBoxToolsEndSceneIndex.Items.Add(string.Format(language.LastMinusX, 3)); - int visAdjustTextMax = Math.Max(labelVerifyButton.Width, labelToolsStartScene.Width); - visAdjustTextMax = Math.Max(visAdjustTextMax, labelToolsEndScene.Width); - comboBoxToolsVerifySeconds.Left = groupBoxToolsVisualSync.Left + visAdjustTextMax + 12; - comboBoxToolsStartSceneIndex.Left = comboBoxToolsVerifySeconds.Left; - comboBoxToolsEndSceneIndex.Left = comboBoxToolsVerifySeconds.Left; - - groupBoxFixCommonErrors.Text = language.FixCommonerrors; - labelMergeShortLines.Text = language.MergeLinesShorterThan; - labelDialogStyle.Text = language.DialogStyle; - labelContinuationStyle.Text = language.ContinuationStyle; - labelToolsMusicSymbol.Text = language.MusicSymbol; - labelToolsMusicSymbolsToReplace.Text = language.MusicSymbolsReplace; - checkBoxFixCommonOcrErrorsUsingHardcodedRules.Text = language.FixCommonOcrErrorsUseHardcodedRules; - checkBoxFixShortDisplayTimesAllowMoveStartTime.Text = language.FixCommonerrorsFixShortDisplayTimesAllowMoveStartTime; - checkBoxFceSkipStep1.Text = language.FixCommonErrorsSkipStepOne; - groupBoxSpellCheck.Text = language.SpellCheck; - checkBoxSpellCheckAutoChangeNames.Text = Configuration.Settings.Language.SpellCheck.AutoFixNames; - checkBoxSpellCheckAutoChangeNamesViaSuggestions.Text = Configuration.Settings.Language.SpellCheck.AutoFixNamesViaSuggestions; - checkBoxSpellCheckOneLetterWords.Text = Configuration.Settings.Language.SpellCheck.CheckOneLetterWords; - checkBoxTreatINQuoteAsING.Text = Configuration.Settings.Language.SpellCheck.TreatINQuoteAsING; - checkBoxUseAlwaysToFile.Text = Configuration.Settings.Language.SpellCheck.RememberUseAlwaysList; - buttonFixContinuationStyleSettings.Text = language.EditFixContinuationStyleSettings; - - groupBoxToolsAutoBr.Text = Configuration.Settings.Language.Main.Controls.AutoBreak.Replace("&", string.Empty); - checkBoxUseDoNotBreakAfterList.Text = language.UseDoNotBreakAfterList; - checkBoxToolsBreakEarlyComma.Text = language.BreakEarlyForComma; - checkBoxToolsBreakEarlyDash.Text = language.BreakEarlyForDashDialog; - checkBoxToolsBreakEarlyLineEnding.Text = language.BreakEarlyForLineEnding; - checkBoxToolsBreakByPixelWidth.Text = language.BreakByPixelWidth; - checkBoxToolsBreakPreferBottomHeavy.Text = language.BreakPreferBottomHeavy; - numericUpDownToolsBreakPreferBottomHeavy.Left = checkBoxToolsBreakPreferBottomHeavy.Left + checkBoxToolsBreakPreferBottomHeavy.Width + 9; - labelToolsBreakBottomHeavyPercent.Left = numericUpDownToolsBreakPreferBottomHeavy.Left + numericUpDownToolsBreakPreferBottomHeavy.Width + 2; - checkBoxCpsIncludeWhiteSpace.Text = language.CpsIncludesSpace; - buttonEditDoNotBreakAfterList.Text = Configuration.Settings.Language.VobSubOcr.Edit; - - groupBoxGoogleTranslate.Text = language.GoogleTranslate; - labelGoogleTranslateApiKey.Text = language.GoogleTranslateApiKey; - linkLabelGoogleTranslateSignUp.Text = language.HowToSignUp; - linkLabelGoogleTranslateSignUp.Left = textBoxGoogleTransleApiKey.Left + textBoxGoogleTransleApiKey.Width - linkLabelGoogleTranslateSignUp.Width; - - groupBoxBing.Text = language.MicrosoftBingTranslator; - labelBingApiKey.Text = language.MicrosoftTranslateApiKey; - labelBingTokenEndpoint.Text = language.MicrosoftTranslateTokenEndpoint; - linkLabelBingSubscribe.Text = language.HowToSignUp; - linkLabelBingSubscribe.Left = textBoxBingClientSecret.Left + textBoxBingClientSecret.Width - linkLabelGoogleTranslateSignUp.Width; - - comboBoxListViewDoubleClickEvent.Items.Clear(); - comboBoxListViewDoubleClickEvent.Items.Add(language.MainListViewNothing); - comboBoxListViewDoubleClickEvent.Items.Add(language.MainListViewVideoGoToPositionAndPause); - comboBoxListViewDoubleClickEvent.Items.Add(language.MainListViewVideoGoToPositionAndPlay); - comboBoxListViewDoubleClickEvent.Items.Add(language.MainListViewVideoGoToPositionMinusHalfSecAndPause); - comboBoxListViewDoubleClickEvent.Items.Add(language.MainListViewVideoGoToPositionMinus1SecAndPause); - comboBoxListViewDoubleClickEvent.Items.Add(language.MainListViewVideoGoToPositionMinus1SecAndPlay); - comboBoxListViewDoubleClickEvent.Items.Add(language.MainListViewEditTextAndPause); - comboBoxListViewDoubleClickEvent.Items.Add(language.MainListViewEditText); - - comboBoxSaveAsFileNameFrom.Items.Clear(); - comboBoxSaveAsFileNameFrom.Items.Add(language.VideoFileName); - comboBoxSaveAsFileNameFrom.Items.Add(language.ExistingFileName); - - if (gs.ListViewDoubleClickAction >= 0 && gs.ListViewDoubleClickAction < comboBoxListViewDoubleClickEvent.Items.Count) - { - comboBoxListViewDoubleClickEvent.SelectedIndex = gs.ListViewDoubleClickAction; - } - - comboBoxSaveAsFileNameFrom.SelectedIndex = gs.SaveAsUseFileNameFrom.Equals("video", StringComparison.OrdinalIgnoreCase) ? 0 : 1; - - if (gs.AutoBackupSeconds == 60) - { - comboBoxAutoBackup.SelectedIndex = 1; - } - else if (gs.AutoBackupSeconds == 60 * 5) - { - comboBoxAutoBackup.SelectedIndex = 2; - } - else if (gs.AutoBackupSeconds == 60 * 15) - { - comboBoxAutoBackup.SelectedIndex = 3; - } - else - { - comboBoxAutoBackup.SelectedIndex = 0; - } - - if (gs.AutoBackupDeleteAfterMonths == 3) - { - comboBoxAutoBackupDeleteAfter.SelectedIndex = 1; - } - else if (gs.AutoBackupDeleteAfterMonths == 1) - { - comboBoxAutoBackupDeleteAfter.SelectedIndex = 0; - } - else - { - comboBoxAutoBackupDeleteAfter.SelectedIndex = 2; - } - - checkBoxCheckForUpdates.Checked = gs.CheckForUpdates; - checkBoxAutoSave.Checked = gs.AutoSave; - - comboBoxSpellChecker.SelectedIndex = gs.SpellChecker.Contains("word", StringComparison.OrdinalIgnoreCase) ? 1 : 0; - - if (Configuration.IsRunningOnLinux || Configuration.IsRunningOnMac) - { - comboBoxSpellChecker.SelectedIndex = 0; - comboBoxSpellChecker.Enabled = false; - } - - checkBoxAllowEditOfOriginalSubtitle.Checked = gs.AllowEditOfOriginalSubtitle; - checkBoxPromptDeleteLines.Checked = gs.PromptDeleteLines; - - ToolsSettings toolsSettings = Configuration.Settings.Tools; - if (toolsSettings.VerifyPlaySeconds - 2 >= 0 && toolsSettings.VerifyPlaySeconds - 2 < comboBoxToolsVerifySeconds.Items.Count) - { - comboBoxToolsVerifySeconds.SelectedIndex = toolsSettings.VerifyPlaySeconds - 2; - } - else - { - comboBoxToolsVerifySeconds.SelectedIndex = 0; - } - - if (toolsSettings.StartSceneIndex >= 0 && toolsSettings.StartSceneIndex < comboBoxToolsStartSceneIndex.Items.Count) - { - comboBoxToolsStartSceneIndex.SelectedIndex = toolsSettings.StartSceneIndex; - } - else - { - comboBoxToolsStartSceneIndex.SelectedIndex = 0; - } - - if (toolsSettings.EndSceneIndex >= 0 && toolsSettings.EndSceneIndex < comboBoxToolsEndSceneIndex.Items.Count) - { - comboBoxToolsEndSceneIndex.SelectedIndex = toolsSettings.EndSceneIndex; - } - else - { - comboBoxToolsEndSceneIndex.SelectedIndex = 0; - } - - comboBoxMergeShortLineLength.Items.Clear(); - var comboBoxMergeShortLineLengthList = new List(95); - for (int i = 5; i < 100; i++) - { - comboBoxMergeShortLineLengthList.Add(i.ToString(CultureInfo.InvariantCulture)); - } - comboBoxMergeShortLineLength.Items.AddRange(comboBoxMergeShortLineLengthList.ToArray()); - - if (gs.MergeLinesShorterThan >= 5 && gs.MergeLinesShorterThan - 5 < comboBoxMergeShortLineLength.Items.Count) - { - comboBoxMergeShortLineLength.SelectedIndex = gs.MergeLinesShorterThan - 5; - } - else - { - comboBoxMergeShortLineLength.SelectedIndex = 0; - } - - SetDialogStyle(Configuration.Settings.General.DialogStyle); - SetContinuationStyle(Configuration.Settings.General.ContinuationStyle); - - UpdateProfileNames(gs.Profiles); - - // Music notes / music symbols - if (!Utilities.IsRunningOnMono() && Environment.OSVersion.Version.Major < 6) // 6 == Vista/Win2008Server/Win7 - { - float fontSize = comboBoxToolsMusicSymbol.Font.Size; - const string unicodeFontName = Utilities.WinXP2KUnicodeFontName; - listBoxNames.Font = new Font(unicodeFontName, fontSize); - listBoxUserWordLists.Font = new Font(unicodeFontName, fontSize); - listBoxOcrFixList.Font = new Font(unicodeFontName, fontSize); - comboBoxToolsMusicSymbol.Font = new Font(unicodeFontName, fontSize); - textBoxMusicSymbolsToReplace.Font = new Font(unicodeFontName, fontSize); - textBoxNameEtc.Font = new Font(unicodeFontName, fontSize); - textBoxUserWord.Font = new Font(unicodeFontName, fontSize); - textBoxOcrFixKey.Font = new Font(unicodeFontName, fontSize); - textBoxOcrFixValue.Font = new Font(unicodeFontName, fontSize); - } - - comboBoxToolsMusicSymbol.Items.Clear(); - comboBoxToolsMusicSymbol.Items.Add("♪"); - comboBoxToolsMusicSymbol.Items.Add("♫"); - comboBoxToolsMusicSymbol.Items.Add("♪♪"); - comboBoxToolsMusicSymbol.Items.Add("*"); - comboBoxToolsMusicSymbol.Items.Add("#"); - if (toolsSettings.MusicSymbol == "♪") - { - comboBoxToolsMusicSymbol.SelectedIndex = 0; - } - else if (toolsSettings.MusicSymbol == "♫") - { - comboBoxToolsMusicSymbol.SelectedIndex = 1; - } - else if (toolsSettings.MusicSymbol == "♪♪") - { - comboBoxToolsMusicSymbol.SelectedIndex = 2; - } - else if (toolsSettings.MusicSymbol == "*") - { - comboBoxToolsMusicSymbol.SelectedIndex = 3; - } - else if (toolsSettings.MusicSymbol == "#") - { - comboBoxToolsMusicSymbol.SelectedIndex = 4; - } - else - { - comboBoxToolsMusicSymbol.Items.Add(toolsSettings.MusicSymbol); - comboBoxToolsMusicSymbol.SelectedIndex = 5; - } - - textBoxMusicSymbolsToReplace.Text = toolsSettings.MusicSymbolReplace; - checkBoxFixCommonOcrErrorsUsingHardcodedRules.Checked = toolsSettings.OcrFixUseHardcodedRules; - checkBoxFixShortDisplayTimesAllowMoveStartTime.Checked = toolsSettings.FixShortDisplayTimesAllowMoveStartTime; - checkBoxFceSkipStep1.Checked = toolsSettings.FixCommonErrorsSkipStepOne; - checkBoxSpellCheckAutoChangeNames.Checked = toolsSettings.SpellCheckAutoChangeNames; - checkBoxSpellCheckAutoChangeNamesViaSuggestions.Checked = toolsSettings.SpellCheckAutoChangeNamesUseSuggestions; - checkBoxSpellCheckOneLetterWords.Checked = toolsSettings.CheckOneLetterWords; - checkBoxTreatINQuoteAsING.Checked = toolsSettings.SpellCheckEnglishAllowInQuoteAsIng; - checkBoxUseAlwaysToFile.Checked = toolsSettings.RememberUseAlwaysList; - checkBoxUseDoNotBreakAfterList.Checked = toolsSettings.UseNoLineBreakAfter; - checkBoxToolsBreakEarlyComma.Checked = toolsSettings.AutoBreakCommaBreakEarly; - checkBoxToolsBreakEarlyDash.Checked = toolsSettings.AutoBreakDashEarly; - checkBoxToolsBreakEarlyLineEnding.Checked = toolsSettings.AutoBreakLineEndingEarly; - checkBoxToolsBreakByPixelWidth.Checked = toolsSettings.AutoBreakUsePixelWidth; - checkBoxToolsBreakPreferBottomHeavy.Checked = toolsSettings.AutoBreakPreferBottomHeavy; - numericUpDownToolsBreakPreferBottomHeavy.Value = (decimal)toolsSettings.AutoBreakPreferBottomPercent; - checkBoxCpsIncludeWhiteSpace.Checked = !Configuration.Settings.General.CharactersPerSecondsIgnoreWhiteSpace; - - textBoxBingClientSecret.Text = Configuration.Settings.Tools.MicrosoftTranslatorApiKey; - comboBoxBoxBingTokenEndpoint.Text = Configuration.Settings.Tools.MicrosoftTranslatorTokenEndpoint; - textBoxGoogleTransleApiKey.Text = toolsSettings.GoogleApiV2Key; - - buttonReset.Text = Configuration.Settings.Language.Settings.RestoreDefaultSettings; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - - InitComboBoxWordListLanguages(); - - checkBoxWaveformShowGrid.Checked = Configuration.Settings.VideoControls.WaveformDrawGrid; - checkBoxWaveformShowCps.Checked = Configuration.Settings.VideoControls.WaveformDrawCps; - checkBoxWaveformShowWpm.Checked = Configuration.Settings.VideoControls.WaveformDrawWpm; - panelWaveformGridColor.BackColor = Configuration.Settings.VideoControls.WaveformGridColor; - panelWaveformSelectedColor.BackColor = Configuration.Settings.VideoControls.WaveformSelectedColor; - panelWaveformColor.BackColor = Configuration.Settings.VideoControls.WaveformColor; - panelWaveformBackgroundColor.BackColor = Configuration.Settings.VideoControls.WaveformBackgroundColor; - panelWaveformTextColor.BackColor = Configuration.Settings.VideoControls.WaveformTextColor; - panelWaveformCursorColor.BackColor = Configuration.Settings.VideoControls.WaveformCursorColor; - checkBoxGenerateSpectrogram.Checked = Configuration.Settings.VideoControls.GenerateSpectrogram; - comboBoxSpectrogramAppearance.SelectedIndex = Configuration.Settings.VideoControls.SpectrogramAppearance == "OneColorGradient" ? 0 : 1; - comboBoxWaveformTextSize.Text = Configuration.Settings.VideoControls.WaveformTextSize.ToString(CultureInfo.InvariantCulture); - checkBoxWaveformTextBold.Checked = Configuration.Settings.VideoControls.WaveformTextBold; - checkBoxReverseMouseWheelScrollDirection.Checked = Configuration.Settings.VideoControls.WaveformMouseWheelScrollUpIsForward; - checkBoxAllowOverlap.Checked = Configuration.Settings.VideoControls.WaveformAllowOverlap; - checkBoxWaveformSetVideoPosMoveStartEnd.Checked = Configuration.Settings.VideoControls.WaveformSetVideoPositionOnMoveStartEnd; - checkBoxWaveformHoverFocus.Checked = Configuration.Settings.VideoControls.WaveformFocusOnMouseEnter; - checkBoxListViewMouseEnterFocus.Checked = Configuration.Settings.VideoControls.WaveformListViewFocusOnMouseEnter; - checkBoxWaveformSingleClickSelect.Checked = Configuration.Settings.VideoControls.WaveformSingleClickSelect; - checkBoxWaveformSnapToSceneChanges.Checked = Configuration.Settings.VideoControls.WaveformSnapToSceneChanges; - if (Configuration.Settings.VideoControls.WaveformBorderHitMs >= numericUpDownWaveformBorderHitMs.Minimum && - Configuration.Settings.VideoControls.WaveformBorderHitMs <= numericUpDownWaveformBorderHitMs.Maximum) - { - numericUpDownWaveformBorderHitMs.Value = Configuration.Settings.VideoControls.WaveformBorderHitMs; - } - - checkBoxUseFFmpeg.Checked = gs.UseFFmpegForWaveExtraction; - textBoxFFmpegPath.Text = gs.FFmpegLocation; - if (string.IsNullOrEmpty(textBoxFFmpegPath.Text) && Configuration.IsRunningOnWindows) - { - var guessPath = Path.Combine(Configuration.DataDirectory, "ffmpeg", "ffmpeg.exe"); - if (File.Exists(guessPath)) - { - textBoxFFmpegPath.Text = guessPath; - checkBoxUseFFmpeg.Checked = true; - } - } - - MakeShortcutsTreeView(language); - ShowShortcutsTreeView(); - toolStripMenuItemShortcutsCollapse.Text = Configuration.Settings.Language.General.Collapse; - importShortcutsToolStripMenuItem.Text = Configuration.Settings.Language.MultipleReplace.Import; - exportShortcutsToolStripMenuItem.Text = Configuration.Settings.Language.MultipleReplace.Export; - labelShortcutsSearch.Text = Configuration.Settings.Language.General.Search; - buttonShortcutsClear.Text = Configuration.Settings.Language.DvdSubRip.Clear; - textBoxShortcutSearch.Left = labelShortcutsSearch.Left + labelShortcutsSearch.Width + 5; - buttonShortcutsClear.Left = textBoxShortcutSearch.Left + textBoxShortcutSearch.Width + 5; - - groupBoxShortcuts.Text = language.Shortcuts; - labelShortcut.Text = language.Shortcut; - checkBoxShortcutsControl.Text = language.Control; - checkBoxShortcutsAlt.Text = language.Alt; - checkBoxShortcutsShift.Text = language.Shift; - buttonUpdateShortcut.Text = language.UpdateShortcut; - buttonClearShortcut.Text = Configuration.Settings.Language.DvdSubRip.Clear; - - labelShortcutKey.Text = language.Key; - comboBoxShortcutKey.Left = labelShortcutKey.Left + labelShortcutKey.Width; - comboBoxShortcutKey.Items[0] = Configuration.Settings.Language.General.None; - - groupBoxListViewSyntaxColoring.Text = language.ListViewSyntaxColoring; - checkBoxSyntaxColorDurationTooSmall.Text = language.SyntaxColorDurationIfTooSmall; - checkBoxSyntaxColorDurationTooLarge.Text = language.SyntaxColorDurationIfTooLarge; - checkBoxSyntaxColorTextTooLong.Text = language.SyntaxColorTextIfTooLong; - checkBoxSyntaxColorTextTooWide.Text = language.SyntaxColorTextIfTooWide; - buttonLineWidthSettings.Text = language.SyntaxLineWidthSettings; - checkBoxSyntaxColorTextMoreThanTwoLines.Text = string.Format(language.SyntaxColorTextMoreThanMaxLines, Configuration.Settings.General.MaxNumberOfLines); - checkBoxSyntaxOverlap.Text = language.SyntaxColorOverlap; - checkBoxSyntaxColorGapTooSmall.Text = language.SyntaxColorGap; - buttonListViewSyntaxColorError.Text = language.SyntaxErrorColor; - - UiUtil.FixLargeFonts(this, buttonOK); - - checkBoxShortcutsControl.Left = labelShortcut.Left + labelShortcut.Width + 9; - checkBoxShortcutsAlt.Left = checkBoxShortcutsControl.Left + checkBoxShortcutsControl.Width + 9; - checkBoxShortcutsShift.Left = checkBoxShortcutsAlt.Left + checkBoxShortcutsAlt.Width + 9; - labelShortcutKey.Left = checkBoxShortcutsShift.Left + checkBoxShortcutsShift.Width + 9; - comboBoxShortcutKey.Left = labelShortcutKey.Left + labelShortcutKey.Width + 2; - buttonUpdateShortcut.Left = comboBoxShortcutKey.Left + comboBoxShortcutKey.Width + 15; - buttonClearShortcut.Left = buttonUpdateShortcut.Left + buttonUpdateShortcut.Width + 15; - buttonLineWidthSettings.Left = checkBoxSyntaxColorTextTooWide.Left + checkBoxSyntaxColorTextTooWide.Width + 9; - - _oldVlcLocation = gs.VlcLocation; - _oldVlcLocationRelative = gs.VlcLocationRelative; - - _oldListViewShowCps = Configuration.Settings.Tools.ListViewShowColumnCharsPerSec; - _oldListViewShowWpm = Configuration.Settings.Tools.ListViewShowColumnWordsPerMin; - - labelPlatform.Text = (IntPtr.Size * 8) + "-bit"; - - _loading = false; - UpdateSsaExample(); - } - - private void SetDialogStyle(DialogType dialogStyle) - { - comboBoxDialogStyle.Items.Clear(); - comboBoxDialogStyle.Items.Add(Configuration.Settings.Language.Settings.DialogStyleDashBothLinesWithSpace); - comboBoxDialogStyle.Items.Add(Configuration.Settings.Language.Settings.DialogStyleDashBothLinesWithoutSpace); - comboBoxDialogStyle.Items.Add(Configuration.Settings.Language.Settings.DialogStyleDashSecondLineWithSpace); - comboBoxDialogStyle.Items.Add(Configuration.Settings.Language.Settings.DialogStyleDashSecondLineWithoutSpace); - comboBoxDialogStyle.SelectedIndex = 0; - switch (dialogStyle) - { - case DialogType.DashBothLinesWithSpace: - comboBoxDialogStyle.SelectedIndex = 0; - break; - case DialogType.DashBothLinesWithoutSpace: - comboBoxDialogStyle.SelectedIndex = 1; - break; - case DialogType.DashSecondLineWithSpace: - comboBoxDialogStyle.SelectedIndex = 2; - break; - case DialogType.DashSecondLineWithoutSpace: - comboBoxDialogStyle.SelectedIndex = 3; - break; - } - } - - private void SetContinuationStyle(ContinuationStyle continuationStyle) - { - comboBoxContinuationStyle.Items.Clear(); - comboBoxContinuationStyle.Items.Add(Configuration.Settings.Language.Settings.ContinuationStyleNone); - comboBoxContinuationStyle.Items.Add(Configuration.Settings.Language.Settings.ContinuationStyleNoneTrailingDots); - comboBoxContinuationStyle.Items.Add(Configuration.Settings.Language.Settings.ContinuationStyleNoneLeadingTrailingDots); - comboBoxContinuationStyle.Items.Add(Configuration.Settings.Language.Settings.ContinuationStyleOnlyTrailingDots); - comboBoxContinuationStyle.Items.Add(Configuration.Settings.Language.Settings.ContinuationStyleLeadingTrailingDots); - comboBoxContinuationStyle.Items.Add(Configuration.Settings.Language.Settings.ContinuationStyleLeadingTrailingDash); - comboBoxContinuationStyle.Items.Add(Configuration.Settings.Language.Settings.ContinuationStyleLeadingTrailingDashDots); - comboBoxContinuationStyle.SelectedIndex = 0; - toolTipContinuationPreview.RemoveAll(); - toolTipContinuationPreview.SetToolTip(comboBoxContinuationStyle, ContinuationUtilities.GetContinuationStylePreview(continuationStyle)); - comboBoxContinuationStyle.SelectedIndex = ContinuationUtilities.GetIndexFromContinuationStyle(continuationStyle); - - var dropDownContinuationWidth = comboBoxContinuationStyle.Width; - var dropDownDialogStyleWidth = comboBoxDialogStyle.Width; - using (var g = Graphics.FromHwnd(IntPtr.Zero)) - { - foreach (var item in comboBoxContinuationStyle.Items) - { - var itemWidth = (int)g.MeasureString((string)item, Font).Width + 5; - dropDownContinuationWidth = Math.Max(itemWidth, dropDownContinuationWidth); - } - - foreach (var item in comboBoxDialogStyle.Items) - { - var itemWidth = (int)g.MeasureString((string)item, Font).Width + 5; - dropDownDialogStyleWidth = Math.Max(itemWidth, dropDownDialogStyleWidth); - } - } - - comboBoxContinuationStyle.DropDownWidth = dropDownContinuationWidth; - comboBoxDialogStyle.DropDownWidth = dropDownDialogStyleWidth; - } - - private Guid _oldProfileId = Guid.Empty; - private void UpdateProfileNames(List profiles) - { - comboBoxRulesProfileName.BeginUpdate(); - comboBoxRulesProfileName.Items.Clear(); - foreach (var profile in profiles) - { - comboBoxRulesProfileName.Items.Add(profile.Name); - if (_oldProfileId == Guid.Empty && profile.Name == Configuration.Settings.General.CurrentProfile || profile.Id == _oldProfileId) - { - comboBoxRulesProfileName.SelectedIndex = comboBoxRulesProfileName.Items.Count - 1; - _oldProfileId = profile.Id; - } - } - comboBoxRulesProfileName.EndUpdate(); - if (comboBoxRulesProfileName.SelectedIndex < 0 && comboBoxRulesProfileName.Items.Count > 0 && comboBoxRulesProfileName.Items.Count > 0) - { - comboBoxRulesProfileName.SelectedIndex = 0; - } - } - - ShortcutNode _shortcuts = new ShortcutNode("root"); - - private void MakeShortcutsTreeView(LanguageStructure.Settings language) - { - _shortcuts = new ShortcutNode("root"); - - var generalNode = new ShortcutNode(Configuration.Settings.Language.General.GeneralText); - AddNode(generalNode, language.MergeSelectedLines, nameof(Configuration.Settings.Shortcuts.GeneralMergeSelectedLines)); - AddNode(generalNode, language.MergeWithPrevious, nameof(Configuration.Settings.Shortcuts.GeneralMergeWithPrevious)); - AddNode(generalNode, language.MergeWithNext, nameof(Configuration.Settings.Shortcuts.GeneralMergeWithNext)); - AddNode(generalNode, language.MergeSelectedLinesAndAutoBreak, nameof(Configuration.Settings.Shortcuts.GeneralMergeSelectedLinesAndAutoBreak)); - AddNode(generalNode, language.MergeSelectedLinesAndUnbreak, nameof(Configuration.Settings.Shortcuts.GeneralMergeSelectedLinesAndUnbreak)); - AddNode(generalNode, language.MergeSelectedLinesAndUnbreakCjk, nameof(Configuration.Settings.Shortcuts.GeneralMergeSelectedLinesAndUnbreakCjk)); - AddNode(generalNode, language.MergeSelectedLinesOnlyFirstText, nameof(Configuration.Settings.Shortcuts.GeneralMergeSelectedLinesOnlyFirstText)); - AddNode(generalNode, language.MergeSelectedLinesBilingual, nameof(Configuration.Settings.Shortcuts.GeneralMergeSelectedLinesBilingual)); - AddNode(generalNode, language.MergeOriginalAndTranslation, nameof(Configuration.Settings.Shortcuts.GeneralMergeOriginalAndTranslation)); - AddNode(generalNode, language.ToggleTranslationMode, nameof(Configuration.Settings.Shortcuts.GeneralToggleTranslationMode)); - AddNode(generalNode, language.SwitchOriginalAndTranslation, nameof(Configuration.Settings.Shortcuts.GeneralSwitchOriginalAndTranslation)); - AddNode(generalNode, language.WaveformPlayFirstSelectedSubtitle, nameof(Configuration.Settings.Shortcuts.GeneralPlayFirstSelected)); - AddNode(generalNode, language.GoToFirstSelectedLine, nameof(Configuration.Settings.Shortcuts.GeneralGoToFirstSelectedLine)); - AddNode(generalNode, language.GoToNextEmptyLine, nameof(Configuration.Settings.Shortcuts.GeneralGoToNextEmptyLine)); - AddNode(generalNode, language.GoToNext, nameof(Configuration.Settings.Shortcuts.GeneralGoToNextSubtitle)); - AddNode(generalNode, language.GoToNextCursorAtEnd, nameof(Configuration.Settings.Shortcuts.GeneralGoToNextSubtitleCursorAtEnd)); - AddNode(generalNode, language.GoToPrevious, nameof(Configuration.Settings.Shortcuts.GeneralGoToPrevSubtitle)); - AddNode(generalNode, language.GoToCurrentSubtitleStart, nameof(Configuration.Settings.Shortcuts.GeneralGoToStartOfCurrentSubtitle)); - AddNode(generalNode, language.GoToCurrentSubtitleEnd, nameof(Configuration.Settings.Shortcuts.GeneralGoToEndOfCurrentSubtitle)); - AddNode(generalNode, language.GoToPreviousSubtitleAndFocusVideo, nameof(Configuration.Settings.Shortcuts.GeneralGoToPreviousSubtitleAndFocusVideo)); - AddNode(generalNode, language.GoToNextSubtitleAndFocusVideo, nameof(Configuration.Settings.Shortcuts.GeneralGoToNextSubtitleAndFocusVideo)); - AddNode(generalNode, language.GoToPrevSubtitleAndPlay, nameof(Configuration.Settings.Shortcuts.GeneralGoToPrevSubtitleAndPlay)); - AddNode(generalNode, language.GoToNextSubtitleAndPlay, nameof(Configuration.Settings.Shortcuts.GeneralGoToNextSubtitleAndPlay)); - AddNode(generalNode, language.Help, nameof(Configuration.Settings.Shortcuts.GeneralHelp), true); - AddNode(generalNode, language.UnbreakNoSpace, nameof(Configuration.Settings.Shortcuts.GeneralUnbrekNoSpace)); - AddNode(generalNode, language.ToggleBookmarks, nameof(Configuration.Settings.Shortcuts.GeneralToggleBookmarks)); - AddNode(generalNode, language.ToggleBookmarksWithComment, nameof(Configuration.Settings.Shortcuts.GeneralToggleBookmarksWithText), true); - AddNode(generalNode, language.ClearBookmarks, nameof(Configuration.Settings.Shortcuts.GeneralClearBookmarks)); - AddNode(generalNode, language.GoToBookmark, nameof(Configuration.Settings.Shortcuts.GeneralGoToBookmark)); - AddNode(generalNode, language.GoToPreviousBookmark, nameof(Configuration.Settings.Shortcuts.GeneralGoToPreviousBookmark)); - AddNode(generalNode, language.GoToNextBookmark, nameof(Configuration.Settings.Shortcuts.GeneralGoToNextBookmark)); - AddNode(generalNode, language.ChooseProfile, nameof(Configuration.Settings.Shortcuts.ChooseProfile)); - AddNode(generalNode, language.DuplicateLine, nameof(Configuration.Settings.Shortcuts.DuplicateLine)); - if (generalNode.Nodes.Count > 0) - { - _shortcuts.Nodes.Add(generalNode); - } - - var fileNode = new ShortcutNode(Configuration.Settings.Language.Main.Menu.File.Title); - AddNode(fileNode, Configuration.Settings.Language.Main.Menu.File.New, nameof(Configuration.Settings.Shortcuts.MainFileNew), true); - AddNode(fileNode, Configuration.Settings.Language.Main.Menu.File.Open, nameof(Configuration.Settings.Shortcuts.MainFileOpen), true); - AddNode(fileNode, Configuration.Settings.Language.Main.Menu.File.OpenKeepVideo, nameof(Configuration.Settings.Shortcuts.MainFileOpenKeepVideo), true); - AddNode(fileNode, Configuration.Settings.Language.Main.Menu.File.Save, nameof(Configuration.Settings.Shortcuts.MainFileSave), true); - AddNode(fileNode, Configuration.Settings.Language.Main.Menu.File.SaveAs, nameof(Configuration.Settings.Shortcuts.MainFileSaveAs), true); - AddNode(fileNode, Configuration.Settings.Language.Main.Menu.File.SaveOriginal, nameof(Configuration.Settings.Shortcuts.MainFileSaveOriginal), true); - AddNode(fileNode, Configuration.Settings.Language.Main.SaveOriginalSubtitleAs, nameof(Configuration.Settings.Shortcuts.MainFileSaveOriginalAs), true); - AddNode(fileNode, Configuration.Settings.Language.Main.Menu.File.OpenOriginal, nameof(Configuration.Settings.Shortcuts.MainFileOpenOriginal), true); - AddNode(fileNode, Configuration.Settings.Language.Main.Menu.File.CloseOriginal, nameof(Configuration.Settings.Shortcuts.MainFileCloseOriginal), true); - AddNode(fileNode, language.MainFileSaveAll, nameof(Configuration.Settings.Shortcuts.MainFileSaveAll)); - AddNode(fileNode, Configuration.Settings.Language.Main.Menu.File.Compare, nameof(Configuration.Settings.Shortcuts.MainFileCompare), true); - AddNode(fileNode, Configuration.Settings.Language.Main.Menu.File.ImportText, nameof(Configuration.Settings.Shortcuts.MainFileImportPlainText), true); - AddNode(fileNode, Configuration.Settings.Language.Main.Menu.File.ImportTimecodes, nameof(Configuration.Settings.Shortcuts.MainFileImportTimeCodes), true); - AddNode(fileNode, Configuration.Settings.Language.Main.Menu.File.Export + " -> " + Configuration.Settings.Language.Main.Menu.File.ExportEbu, nameof(Configuration.Settings.Shortcuts.MainFileExportEbu), true); - AddNode(fileNode, Configuration.Settings.Language.Main.Menu.File.Export + " -> " + Configuration.Settings.Language.Main.Menu.File.ExportPac, nameof(Configuration.Settings.Shortcuts.MainFileExportPac), true); - AddNode(fileNode, Configuration.Settings.Language.Main.Menu.File.Export + " -> " + Configuration.Settings.Language.Main.Menu.File.ExportPlainText, nameof(Configuration.Settings.Shortcuts.MainFileExportPlainText), true); - if (fileNode.Nodes.Count > 0) - { - _shortcuts.Nodes.Add(fileNode); - } - - var editNode = new ShortcutNode(Configuration.Settings.Language.Main.Menu.Edit.Title); - AddNode(editNode, Configuration.Settings.Language.Main.Menu.Edit.Undo, nameof(Configuration.Settings.Shortcuts.MainEditUndo), true); - AddNode(editNode, Configuration.Settings.Language.Main.Menu.Edit.Redo, nameof(Configuration.Settings.Shortcuts.MainEditRedo), true); - AddNode(editNode, Configuration.Settings.Language.Main.Menu.Edit.Find, nameof(Configuration.Settings.Shortcuts.MainEditFind), true); - AddNode(editNode, Configuration.Settings.Language.Main.Menu.Edit.FindNext, nameof(Configuration.Settings.Shortcuts.MainEditFindNext), true); - AddNode(editNode, Configuration.Settings.Language.Main.Menu.Edit.Replace, nameof(Configuration.Settings.Shortcuts.MainEditReplace), true); - AddNode(editNode, Configuration.Settings.Language.Main.Menu.Edit.MultipleReplace, nameof(Configuration.Settings.Shortcuts.MainEditMultipleReplace), true); - AddNode(editNode, Configuration.Settings.Language.Main.Menu.Edit.ModifySelection, nameof(Configuration.Settings.Shortcuts.MainEditModifySelection), true); - AddNode(editNode, Configuration.Settings.Language.Main.Menu.Edit.GoToSubtitleNumber, nameof(Configuration.Settings.Shortcuts.MainEditGoToLineNumber), true); - AddNode(editNode, Configuration.Settings.Language.VobSubOcr.RightToLeft, nameof(Configuration.Settings.Shortcuts.MainEditRightToLeft), true); - AddNode(editNode, language.FixRTLViaUnicodeChars, nameof(Configuration.Settings.Shortcuts.MainEditFixRTLViaUnicodeChars), true); - AddNode(editNode, language.RemoveRTLUnicodeChars, nameof(Configuration.Settings.Shortcuts.MainEditRemoveRTLUnicodeChars), true); - AddNode(editNode, language.ReverseStartAndEndingForRtl, nameof(Configuration.Settings.Shortcuts.MainEditReverseStartAndEndingForRTL), true); - AddNode(editNode, language.ToggleTranslationAndOriginalInPreviews, nameof(Configuration.Settings.Shortcuts.MainEditToggleTranslationOriginalInPreviews), true); - if (editNode.Nodes.Count > 0) - { - _shortcuts.Nodes.Add(editNode); - } - - var toolsNode = new ShortcutNode(Configuration.Settings.Language.Main.Menu.Tools.Title); - AddNode(toolsNode, Configuration.Settings.Language.Main.Menu.Tools.SubtitlesBridgeGaps, nameof(Configuration.Settings.Shortcuts.MainToolsDurationsBridgeGap), true); - AddNode(toolsNode, Configuration.Settings.Language.Main.Menu.Tools.MinimumDisplayTimeBetweenParagraphs, nameof(Configuration.Settings.Shortcuts.MainToolsMinimumDisplayTimeBetweenParagraphs), true); - AddNode(toolsNode, Configuration.Settings.Language.Main.Menu.Tools.FixCommonErrors, nameof(Configuration.Settings.Shortcuts.MainToolsFixCommonErrors), true); - AddNode(toolsNode, Configuration.Settings.Language.Main.Menu.Tools.StartNumberingFrom, nameof(Configuration.Settings.Shortcuts.MainToolsRenumber), true); - AddNode(toolsNode, Configuration.Settings.Language.Main.Menu.Tools.RemoveTextForHearingImpaired, nameof(Configuration.Settings.Shortcuts.MainToolsRemoveTextForHI), true); - AddNode(toolsNode, Configuration.Settings.Language.Main.Menu.Tools.ChangeCasing, nameof(Configuration.Settings.Shortcuts.MainToolsChangeCasing), true); - AddNode(toolsNode, Configuration.Settings.Language.Main.Menu.Tools.MakeNewEmptyTranslationFromCurrentSubtitle, nameof(Configuration.Settings.Shortcuts.MainToolsMakeEmptyFromCurrent), true); - AddNode(toolsNode, Configuration.Settings.Language.Main.Menu.Tools.MergeShortLines, nameof(Configuration.Settings.Shortcuts.MainToolsMergeShortLines), true); - AddNode(toolsNode, Configuration.Settings.Language.Main.Menu.Tools.MergeDuplicateText, nameof(Configuration.Settings.Shortcuts.MainToolsMergeDuplicateText), true); - AddNode(toolsNode, Configuration.Settings.Language.Main.Menu.Tools.MergeSameTimeCodes, nameof(Configuration.Settings.Shortcuts.MainToolsMergeSameTimeCodes), true); - AddNode(toolsNode, Configuration.Settings.Language.Main.Menu.Tools.SplitLongLines, nameof(Configuration.Settings.Shortcuts.MainToolsSplitLongLines), true); - AddNode(toolsNode, Configuration.Settings.Language.Main.Menu.Tools.BatchConvert, nameof(Configuration.Settings.Shortcuts.MainToolsBatchConvert)); - AddNode(toolsNode, Configuration.Settings.Language.Main.Menu.Tools.MeasurementConverter, nameof(Configuration.Settings.Shortcuts.MainToolsMeasurementConverter), true); - AddNode(toolsNode, Configuration.Settings.Language.Main.Menu.Tools.SplitSubtitle, nameof(Configuration.Settings.Shortcuts.MainToolsSplit), true); - AddNode(toolsNode, Configuration.Settings.Language.Main.Menu.Tools.AppendSubtitle, nameof(Configuration.Settings.Shortcuts.MainToolsAppend), true); - AddNode(toolsNode, Configuration.Settings.Language.Main.Menu.Tools.JoinSubtitles, nameof(Configuration.Settings.Shortcuts.MainToolsJoin), true); - AddNode(toolsNode, Configuration.Settings.Language.Main.Menu.ContextMenu.AutoDurationCurrentLine, nameof(Configuration.Settings.Shortcuts.MainToolsAutoDuration)); - AddNode(toolsNode, language.ShowBeamer, nameof(Configuration.Settings.Shortcuts.MainToolsBeamer)); - if (toolsNode.Nodes.Count > 0) - { - _shortcuts.Nodes.Add(toolsNode); - } - - var videoNode = new ShortcutNode(Configuration.Settings.Language.Main.Menu.Video.Title); - AddNode(videoNode, Configuration.Settings.Language.Main.Menu.Video.OpenVideo, nameof(Configuration.Settings.Shortcuts.MainVideoOpen), true); - AddNode(videoNode, Configuration.Settings.Language.Main.Menu.Video.CloseVideo, nameof(Configuration.Settings.Shortcuts.MainVideoClose), true); - AddNode(videoNode, language.TogglePlayPause, nameof(Configuration.Settings.Shortcuts.MainVideoPlayPauseToggle)); - AddNode(videoNode, language.Pause, nameof(Configuration.Settings.Shortcuts.MainVideoPause)); - AddNode(videoNode, Configuration.Settings.Language.Main.VideoControls.PlayFromJustBeforeText, nameof(Configuration.Settings.Shortcuts.MainVideoPlayFromJustBefore)); - AddNode(videoNode, Configuration.Settings.Language.Main.Menu.Video.ShowHideVideo, nameof(Configuration.Settings.Shortcuts.MainVideoShowHideVideo), true); - AddNode(videoNode, language.FoucsSetVideoPosition, nameof(Configuration.Settings.Shortcuts.MainVideoFoucsSetVideoPosition)); - AddNode(videoNode, language.ToggleDockUndockOfVideoControls, nameof(Configuration.Settings.Shortcuts.MainVideoToggleVideoControls), true); - AddNode(videoNode, language.GoBack1Frame, nameof(Configuration.Settings.Shortcuts.MainVideo1FrameLeft)); - AddNode(videoNode, language.GoForward1Frame, nameof(Configuration.Settings.Shortcuts.MainVideo1FrameRight)); - AddNode(videoNode, language.GoBack1FrameWithPlay, nameof(Configuration.Settings.Shortcuts.MainVideo1FrameLeftWithPlay)); - AddNode(videoNode, language.GoForward1FrameWithPlay, nameof(Configuration.Settings.Shortcuts.MainVideo1FrameRightWithPlay)); - AddNode(videoNode, language.GoBack100Milliseconds, nameof(Configuration.Settings.Shortcuts.MainVideo100MsLeft)); - AddNode(videoNode, language.GoForward100Milliseconds, nameof(Configuration.Settings.Shortcuts.MainVideo100MsRight)); - AddNode(videoNode, language.GoBack500Milliseconds, nameof(Configuration.Settings.Shortcuts.MainVideo500MsLeft)); - AddNode(videoNode, language.GoForward500Milliseconds, nameof(Configuration.Settings.Shortcuts.MainVideo500MsRight)); - AddNode(videoNode, language.GoBack1Second, nameof(Configuration.Settings.Shortcuts.MainVideo1000MsLeft)); - AddNode(videoNode, language.GoForward1Second, nameof(Configuration.Settings.Shortcuts.MainVideo1000MsRight)); - AddNode(videoNode, language.GoBack5Seconds, nameof(Configuration.Settings.Shortcuts.MainVideo5000MsLeft)); - AddNode(videoNode, language.GoForward5Seconds, nameof(Configuration.Settings.Shortcuts.MainVideo5000MsRight)); - AddNode(videoNode, language.GoBackXSSeconds, nameof(Configuration.Settings.Shortcuts.MainVideoXSMsLeft)); - AddNode(videoNode, language.GoForwardXSSeconds, nameof(Configuration.Settings.Shortcuts.MainVideoXSMsRight)); - AddNode(videoNode, language.GoBackXLSeconds, nameof(Configuration.Settings.Shortcuts.MainVideoXLMsLeft)); - AddNode(videoNode, language.GoForwardXLSeconds, nameof(Configuration.Settings.Shortcuts.MainVideoXLMsRight)); - AddNode(videoNode, language.GoBack3Second, nameof(Configuration.Settings.Shortcuts.MainVideo3000MsLeft)); - AddNode(videoNode, language.GoToStartCurrent, nameof(Configuration.Settings.Shortcuts.MainVideoGoToStartCurrent)); - AddNode(videoNode, language.ToggleStartEndCurrent, nameof(Configuration.Settings.Shortcuts.MainVideoToggleStartEndCurrent)); - AddNode(videoNode, language.PlayCurrent, nameof(Configuration.Settings.Shortcuts.MainVideoPlayCurrent)); - AddNode(videoNode, language.WaveformGoToPrevSubtitle, nameof(Configuration.Settings.Shortcuts.MainVideoGoToPrevSubtitle)); - AddNode(videoNode, language.WaveformGoToNextSubtitle, nameof(Configuration.Settings.Shortcuts.MainVideoGoToNextSubtitle)); - AddNode(videoNode, language.WaveformGoToPrevChapter, nameof(Configuration.Settings.Shortcuts.MainVideoGoToPrevChapter)); - AddNode(videoNode, language.WaveformGoToNextChapter, nameof(Configuration.Settings.Shortcuts.MainVideoGoToNextChapter)); - AddNode(videoNode, language.WaveformSelectNextSubtitle, nameof(Configuration.Settings.Shortcuts.MainVideoSelectNextSubtitle)); - AddNode(videoNode, language.Fullscreen, nameof(Configuration.Settings.Shortcuts.MainVideoFullscreen)); - AddNode(videoNode, language.PlayRateSlower, nameof(Configuration.Settings.Shortcuts.MainVideoSlower)); - AddNode(videoNode, language.PlayRateFaster, nameof(Configuration.Settings.Shortcuts.MainVideoFaster)); - AddNode(videoNode, language.VideoResetSpeedAndZoom, nameof(Configuration.Settings.Shortcuts.MainVideoReset)); - if (videoNode.Nodes.Count > 0) - { - _shortcuts.Nodes.Add(videoNode); - } - - var spellCheckNode = new ShortcutNode(Configuration.Settings.Language.Main.Menu.SpellCheck.Title); - AddNode(spellCheckNode, Configuration.Settings.Language.Main.Menu.SpellCheck.Title, nameof(Configuration.Settings.Shortcuts.MainSpellCheck), true); - AddNode(spellCheckNode, Configuration.Settings.Language.Main.Menu.SpellCheck.FindDoubleWords, nameof(Configuration.Settings.Shortcuts.MainSpellCheckFindDoubleWords), true); - AddNode(spellCheckNode, Configuration.Settings.Language.Main.Menu.SpellCheck.AddToNameList, nameof(Configuration.Settings.Shortcuts.MainSpellCheckAddWordToNames), true); - if (spellCheckNode.Nodes.Count > 0) - { - _shortcuts.Nodes.Add(spellCheckNode); - } - - var syncNode = new ShortcutNode(Configuration.Settings.Language.Main.Menu.Synchronization.Title); - AddNode(syncNode, Configuration.Settings.Language.Main.Menu.Synchronization.AdjustAllTimes, nameof(Configuration.Settings.Shortcuts.MainSynchronizationAdjustTimes), true); - AddNode(syncNode, Configuration.Settings.Language.Main.Menu.Synchronization.VisualSync, nameof(Configuration.Settings.Shortcuts.MainSynchronizationVisualSync), true); - AddNode(syncNode, Configuration.Settings.Language.Main.Menu.Synchronization.PointSync, nameof(Configuration.Settings.Shortcuts.MainSynchronizationPointSync), true); - AddNode(syncNode, Configuration.Settings.Language.Main.Menu.Synchronization.PointSyncViaOtherSubtitle, nameof(Configuration.Settings.Shortcuts.MainSynchronizationPointSyncViaFile), true); - AddNode(syncNode, Configuration.Settings.Language.Main.Menu.Tools.ChangeFrameRate, nameof(Configuration.Settings.Shortcuts.MainSynchronizationChangeFrameRate), true); - if (syncNode.Nodes.Count > 0) - { - _shortcuts.Nodes.Add(syncNode); - } - - var listViewAndTextBoxNode = new ShortcutNode(language.ListViewAndTextBox); - AddNode(listViewAndTextBoxNode, Configuration.Settings.Language.Main.Menu.ContextMenu.InsertAfter, nameof(Configuration.Settings.Shortcuts.MainInsertAfter)); - AddNode(listViewAndTextBoxNode, Configuration.Settings.Language.Main.Menu.ContextMenu.InsertBefore, nameof(Configuration.Settings.Shortcuts.MainInsertBefore)); - AddNode(listViewAndTextBoxNode, Configuration.Settings.Language.General.Italic, nameof(Configuration.Settings.Shortcuts.MainListViewItalic), true); - AddNode(listViewAndTextBoxNode, Configuration.Settings.Language.General.Bold, nameof(Configuration.Settings.Shortcuts.MainListViewBold), true); - AddNode(listViewAndTextBoxNode, Configuration.Settings.Language.General.Underline, nameof(Configuration.Settings.Shortcuts.MainListViewUnderline), true); - AddNode(listViewAndTextBoxNode, Configuration.Settings.Language.Main.Menu.ContextMenu.Box, nameof(Configuration.Settings.Shortcuts.MainListViewBox), true); - AddNode(listViewAndTextBoxNode, Configuration.Settings.Language.General.SplitLine.Replace("!", string.Empty), nameof(Configuration.Settings.Shortcuts.MainListViewSplit), true); - AddNode(listViewAndTextBoxNode, language.ToggleMusicSymbols, nameof(Configuration.Settings.Shortcuts.MainListViewToggleMusicSymbols), true); - AddNode(listViewAndTextBoxNode, language.AlignmentN1, nameof(Configuration.Settings.Shortcuts.MainListViewAlignmentN1)); - AddNode(listViewAndTextBoxNode, language.AlignmentN2, nameof(Configuration.Settings.Shortcuts.MainListViewAlignmentN2)); - AddNode(listViewAndTextBoxNode, language.AlignmentN3, nameof(Configuration.Settings.Shortcuts.MainListViewAlignmentN3)); - AddNode(listViewAndTextBoxNode, language.AlignmentN4, nameof(Configuration.Settings.Shortcuts.MainListViewAlignmentN4)); - AddNode(listViewAndTextBoxNode, language.AlignmentN5, nameof(Configuration.Settings.Shortcuts.MainListViewAlignmentN5)); - AddNode(listViewAndTextBoxNode, language.AlignmentN6, nameof(Configuration.Settings.Shortcuts.MainListViewAlignmentN6)); - AddNode(listViewAndTextBoxNode, language.AlignmentN7, nameof(Configuration.Settings.Shortcuts.MainListViewAlignmentN7)); - AddNode(listViewAndTextBoxNode, language.AlignmentN8, nameof(Configuration.Settings.Shortcuts.MainListViewAlignmentN8)); - AddNode(listViewAndTextBoxNode, language.AlignmentN9, nameof(Configuration.Settings.Shortcuts.MainListViewAlignmentN9)); - AddNode(listViewAndTextBoxNode, Configuration.Settings.Language.Main.Menu.ContextMenu.RemoveFormattingAll, nameof(Configuration.Settings.Shortcuts.MainRemoveFormatting), true); - AddNode(listViewAndTextBoxNode, language.RemoveTimeCodes, nameof(Configuration.Settings.Shortcuts.MainListViewRemoveTimeCodes)); - if (listViewAndTextBoxNode.Nodes.Count > 0) - { - _shortcuts.Nodes.Add(listViewAndTextBoxNode); - } - - var listViewNode = new ShortcutNode(Configuration.Settings.Language.Main.Controls.ListView); - AddNode(listViewNode, language.MergeDialog, nameof(Configuration.Settings.Shortcuts.MainMergeDialog)); - AddNode(listViewNode, language.ToggleFocus, nameof(Configuration.Settings.Shortcuts.MainToggleFocus)); - AddNode(listViewNode, language.ToggleDialogDashes, nameof(Configuration.Settings.Shortcuts.MainListViewToggleDashes)); - AddNode(listViewNode, language.Alignment, nameof(Configuration.Settings.Shortcuts.MainListViewAlignment), true); - AddNode(listViewNode, language.CopyTextOnly, nameof(Configuration.Settings.Shortcuts.MainListViewCopyText)); - AddNode(listViewNode, language.CopyTextOnlyFromOriginalToCurrent, nameof(Configuration.Settings.Shortcuts.MainListViewCopyTextFromOriginalToCurrent), true); - AddNode(listViewNode, language.AutoDurationSelectedLines, nameof(Configuration.Settings.Shortcuts.MainListViewAutoDuration)); - AddNode(listViewNode, language.ListViewColumnDelete, nameof(Configuration.Settings.Shortcuts.MainListViewColumnDeleteText), true); - AddNode(listViewNode, language.ListViewColumnDeleteAndShiftUp, nameof(Configuration.Settings.Shortcuts.MainListViewColumnDeleteTextAndShiftUp), true); - AddNode(listViewNode, language.ListViewColumnInsert, nameof(Configuration.Settings.Shortcuts.MainListViewColumnInsertText), true); - AddNode(listViewNode, language.ListViewColumnPaste, nameof(Configuration.Settings.Shortcuts.MainListViewColumnPaste), true); - AddNode(listViewNode, language.ListViewColumnTextUp, nameof(Configuration.Settings.Shortcuts.MainListViewColumnTextUp), true); - AddNode(listViewNode, language.ListViewColumnTextDown, nameof(Configuration.Settings.Shortcuts.MainListViewColumnTextDown), true); - AddNode(listViewNode, language.ListViewFocusWaveform, nameof(Configuration.Settings.Shortcuts.MainListViewFocusWaveform)); - AddNode(listViewNode, language.ListViewGoToNextError, nameof(Configuration.Settings.Shortcuts.MainListViewGoToNextError)); - if (listViewNode.Nodes.Count > 0) - { - _shortcuts.Nodes.Add(listViewNode); - } - - var textBoxNode = new ShortcutNode(language.TextBox); - AddNode(textBoxNode, Configuration.Settings.Language.Main.Menu.ContextMenu.SplitLineAtCursorPosition, nameof(Configuration.Settings.Shortcuts.MainTextBoxSplitAtCursor)); - AddNode(textBoxNode, Configuration.Settings.Language.Main.Menu.ContextMenu.SplitLineAtCursorAndWaveformPosition, nameof(Configuration.Settings.Shortcuts.MainTextBoxSplitAtCursorAndVideoPos)); - AddNode(textBoxNode, language.SplitSelectedLineBilingual, nameof(Configuration.Settings.Shortcuts.MainTextBoxSplitSelectedLineBilingual)); - AddNode(textBoxNode, language.MainTextBoxMoveLastWordDown, nameof(Configuration.Settings.Shortcuts.MainTextBoxMoveLastWordDown)); - AddNode(textBoxNode, language.MainTextBoxMoveFirstWordFromNextUp, nameof(Configuration.Settings.Shortcuts.MainTextBoxMoveFirstWordFromNextUp)); - AddNode(textBoxNode, language.MainTextBoxMoveLastWordDownCurrent, nameof(Configuration.Settings.Shortcuts.MainTextBoxMoveLastWordDownCurrent)); - AddNode(textBoxNode, language.MainTextBoxMoveFirstWordUpCurrent, nameof(Configuration.Settings.Shortcuts.MainTextBoxMoveFirstWordUpCurrent)); - AddNode(textBoxNode, language.MainTextBoxSelectionToLower, nameof(Configuration.Settings.Shortcuts.MainTextBoxSelectionToLower)); - AddNode(textBoxNode, language.MainTextBoxSelectionToUpper, nameof(Configuration.Settings.Shortcuts.MainTextBoxSelectionToUpper)); - AddNode(textBoxNode, language.MainTextBoxSelectionToggleCasing, nameof(Configuration.Settings.Shortcuts.MainTextBoxSelectionToggleCasing)); - AddNode(textBoxNode, language.MainTextBoxSelectionToRuby, nameof(Configuration.Settings.Shortcuts.MainTextBoxSelectionToRuby), true); - AddNode(textBoxNode, language.MainTextBoxToggleAutoDuration, nameof(Configuration.Settings.Shortcuts.MainTextBoxToggleAutoDuration)); - AddNode(textBoxNode, language.MainTextBoxAutoBreak, nameof(Configuration.Settings.Shortcuts.MainTextBoxAutoBreak)); - AddNode(textBoxNode, language.MainTextBoxAutoBreakFromPos, nameof(Configuration.Settings.Shortcuts.MainTextBoxBreakAtPosition)); - AddNode(textBoxNode, language.MainTextBoxAutoBreakFromPosAndGoToNext, nameof(Configuration.Settings.Shortcuts.MainTextBoxBreakAtPositionAndGoToNext)); - AddNode(textBoxNode, language.MainTextBoxUnbreak, nameof(Configuration.Settings.Shortcuts.MainTextBoxUnbreak)); - if (textBoxNode.Nodes.Count > 0) - { - _shortcuts.Nodes.Add(textBoxNode); - } - - var translateNode = new ShortcutNode(Configuration.Settings.Language.Main.VideoControls.Translate); - AddNode(translateNode, Configuration.Settings.Language.Main.VideoControls.GoogleIt, nameof(Configuration.Settings.Shortcuts.MainTranslateGoogleIt)); - AddNode(translateNode, Configuration.Settings.Language.Main.VideoControls.GoogleTranslate, nameof(Configuration.Settings.Shortcuts.MainTranslateGoogleTranslate), true); - AddNode(translateNode, language.CustomSearch1, nameof(Configuration.Settings.Shortcuts.MainTranslateCustomSearch1)); - AddNode(translateNode, language.CustomSearch2, nameof(Configuration.Settings.Shortcuts.MainTranslateCustomSearch2)); - AddNode(translateNode, language.CustomSearch3, nameof(Configuration.Settings.Shortcuts.MainTranslateCustomSearch3)); - AddNode(translateNode, language.CustomSearch4, nameof(Configuration.Settings.Shortcuts.MainTranslateCustomSearch4)); - AddNode(translateNode, language.CustomSearch5, nameof(Configuration.Settings.Shortcuts.MainTranslateCustomSearch5)); - if (translateNode.Nodes.Count > 0) - { - _shortcuts.Nodes.Add(translateNode); - } - - var createAndAdjustNode = new ShortcutNode(Configuration.Settings.Language.Main.VideoControls.CreateAndAdjust); - AddNode(createAndAdjustNode, Configuration.Settings.Language.Main.VideoControls.InsertNewSubtitleAtVideoPosition, nameof(Configuration.Settings.Shortcuts.MainCreateInsertSubAtVideoPos)); - AddNode(createAndAdjustNode, Configuration.Settings.Language.Main.VideoControls.InsertNewSubtitleAtVideoPositionNoTextBoxFocus, nameof(Configuration.Settings.Shortcuts.MainCreateInsertSubAtVideoPosNoTextBoxFocus)); - AddNode(createAndAdjustNode, language.MainCreateStartDownEndUp, nameof(Configuration.Settings.Shortcuts.MainCreateStartDownEndUp)); - AddNode(createAndAdjustNode, Configuration.Settings.Language.Main.VideoControls.SetStartTime, nameof(Configuration.Settings.Shortcuts.MainCreateSetStart)); - AddNode(createAndAdjustNode, language.AdjustSetStartTimeKeepDuration, nameof(Configuration.Settings.Shortcuts.MainAdjustSetStartKeepDuration)); - AddNode(createAndAdjustNode, Configuration.Settings.Language.Main.VideoControls.SetstartTimeAndOffsetOfRest, nameof(Configuration.Settings.Shortcuts.MainAdjustSetStartAndOffsetTheRest)); - AddNode(createAndAdjustNode, Configuration.Settings.Language.Main.VideoControls.SetstartTimeAndOffsetOfRest, nameof(Configuration.Settings.Shortcuts.MainAdjustSetStartAndOffsetTheRest2)); - AddNode(createAndAdjustNode, language.AdjustSetStartAutoDurationAndGoToNext, nameof(Configuration.Settings.Shortcuts.MainAdjustSetStartAutoDurationAndGoToNext)); - AddNode(createAndAdjustNode, language.AdjustStartDownEndUpAndGoToNext, nameof(Configuration.Settings.Shortcuts.MainAdjustStartDownEndUpAndGoToNext)); - AddNode(createAndAdjustNode, language.AdjustSetStartAndEndOfPrevious, nameof(Configuration.Settings.Shortcuts.MainAdjustSetStartAndEndOfPrevious)); - AddNode(createAndAdjustNode, language.AdjustSetStartAndEndOfPreviousAndGoToNext, nameof(Configuration.Settings.Shortcuts.MainAdjustSetStartAndEndOfPreviousAndGoToNext)); - AddNode(createAndAdjustNode, Configuration.Settings.Language.Main.VideoControls.SetEndTime, nameof(Configuration.Settings.Shortcuts.MainCreateSetEnd)); - AddNode(createAndAdjustNode, language.AdjustSetEndTimeAndPause, nameof(Configuration.Settings.Shortcuts.MainAdjustSetEndAndPause)); - AddNode(createAndAdjustNode, language.CreateSetEndAddNewAndGoToNew, nameof(Configuration.Settings.Shortcuts.MainCreateSetEndAddNewAndGoToNew)); - AddNode(createAndAdjustNode, language.AdjustSetEndTimeAndGoToNext, nameof(Configuration.Settings.Shortcuts.MainAdjustSetEndAndGotoNext)); - AddNode(createAndAdjustNode, language.AdjustSetEndAndOffsetTheRest, nameof(Configuration.Settings.Shortcuts.MainAdjustSetEndAndOffsetTheRest)); - AddNode(createAndAdjustNode, language.AdjustSetEndAndOffsetTheRestAndGoToNext, nameof(Configuration.Settings.Shortcuts.MainAdjustSetEndAndOffsetTheRestAndGoToNext)); - AddNode(createAndAdjustNode, language.AdjustSetEndNextStartAndGoToNext, nameof(Configuration.Settings.Shortcuts.MainAdjustSetEndNextStartAndGoToNext)); - AddNode(createAndAdjustNode, language.AdjustViaEndAutoStart, nameof(Configuration.Settings.Shortcuts.MainAdjustViaEndAutoStart)); - AddNode(createAndAdjustNode, language.AdjustViaEndAutoStartAndGoToNext, nameof(Configuration.Settings.Shortcuts.MainAdjustViaEndAutoStartAndGoToNext)); - AddNode(createAndAdjustNode, language.AdjustSelected100MsBack, nameof(Configuration.Settings.Shortcuts.MainAdjustSelected100MsBack)); - AddNode(createAndAdjustNode, language.AdjustSelected100MsForward, nameof(Configuration.Settings.Shortcuts.MainAdjustSelected100MsForward)); - AddNode(createAndAdjustNode, string.Format(language.AdjustStartXMsBack, Configuration.Settings.Tools.MoveStartEndMs), nameof(Configuration.Settings.Shortcuts.MainAdjustStartXMsBack)); - AddNode(createAndAdjustNode, string.Format(language.AdjustStartXMsForward, Configuration.Settings.Tools.MoveStartEndMs), nameof(Configuration.Settings.Shortcuts.MainAdjustStartXMsForward)); - AddNode(createAndAdjustNode, string.Format(language.AdjustEndXMsBack, Configuration.Settings.Tools.MoveStartEndMs), nameof(Configuration.Settings.Shortcuts.MainAdjustEndXMsBack)); - AddNode(createAndAdjustNode, string.Format(language.AdjustEndXMsForward, Configuration.Settings.Tools.MoveStartEndMs), nameof(Configuration.Settings.Shortcuts.MainAdjustEndXMsForward)); - AddNode(createAndAdjustNode, language.AdjustStartOneFrameBack, nameof(Configuration.Settings.Shortcuts.MoveStartOneFrameBack)); - AddNode(createAndAdjustNode, language.AdjustStartOneFrameForward, nameof(Configuration.Settings.Shortcuts.MoveStartOneFrameForward)); - AddNode(createAndAdjustNode, language.AdjustEndOneFrameBack, nameof(Configuration.Settings.Shortcuts.MoveEndOneFrameBack)); - AddNode(createAndAdjustNode, language.AdjustEndOneFrameForward, nameof(Configuration.Settings.Shortcuts.MoveEndOneFrameForward)); - AddNode(createAndAdjustNode, language.AdjustStartOneFrameBackKeepGapPrev, nameof(Configuration.Settings.Shortcuts.MoveStartOneFrameBackKeepGapPrev)); - AddNode(createAndAdjustNode, language.AdjustStartOneFrameForwardKeepGapPrev, nameof(Configuration.Settings.Shortcuts.MoveStartOneFrameForwardKeepGapPrev)); - AddNode(createAndAdjustNode, language.AdjustEndOneFrameBackKeepGapNext, nameof(Configuration.Settings.Shortcuts.MoveEndOneFrameBackKeepGapNext)); - AddNode(createAndAdjustNode, language.AdjustEndOneFrameForwardKeepGapNext, nameof(Configuration.Settings.Shortcuts.MoveEndOneFrameForwardKeepGapNext)); - AddNode(createAndAdjustNode, language.RecalculateDurationOfCurrentSubtitle, nameof(Configuration.Settings.Shortcuts.GeneralAutoCalcCurrentDuration)); - AddNode(createAndAdjustNode, language.AdjustSnapStartToNextSceneChange, nameof(Configuration.Settings.Shortcuts.MainAdjustSnapStartToNextSceneChange)); - AddNode(createAndAdjustNode, language.AdjustSnapStartToNextSceneChangeWithGap, nameof(Configuration.Settings.Shortcuts.MainAdjustSnapStartToNextSceneChangeWithGap)); - AddNode(createAndAdjustNode, language.AdjustSnapEndToPreviousSceneChange, nameof(Configuration.Settings.Shortcuts.MainAdjustSnapEndToPreviousSceneChange)); - AddNode(createAndAdjustNode, language.AdjustSnapEndToPreviousSceneChangeWithGap, nameof(Configuration.Settings.Shortcuts.MainAdjustSnapEndToPreviousSceneChangeWithGap)); - AddNode(createAndAdjustNode, language.AdjustExtendToNextSceneChange, nameof(Configuration.Settings.Shortcuts.MainAdjustExtendToNextSceneChange)); - AddNode(createAndAdjustNode, language.AdjustExtendToNextSceneChangeWithGap, nameof(Configuration.Settings.Shortcuts.MainAdjustExtendToNextSceneChangeWithGap)); - AddNode(createAndAdjustNode, language.AdjustExtendToPreviousSceneChange, nameof(Configuration.Settings.Shortcuts.MainAdjustExtendToPreviousSceneChange)); - AddNode(createAndAdjustNode, language.AdjustExtendToPreviousSceneChangeWithGap, nameof(Configuration.Settings.Shortcuts.MainAdjustExtendToPreviousSceneChangeWithGap)); - AddNode(createAndAdjustNode, language.AdjustExtendToNextSubtitle, nameof(Configuration.Settings.Shortcuts.MainAdjustExtendToNextSubtitle)); - AddNode(createAndAdjustNode, language.AdjustExtendToPreviousSubtitle, nameof(Configuration.Settings.Shortcuts.MainAdjustExtendToPreviousSubtitle)); - AddNode(createAndAdjustNode, language.AdjustExtendCurrentSubtitle, nameof(Configuration.Settings.Shortcuts.MainAdjustExtendCurrentSubtitle)); - AddNode(createAndAdjustNode, language.AdjustExtendPreviousLineEndToCurrentStart, nameof(Configuration.Settings.Shortcuts.MainAdjustExtendPreviousLineEndToCurrentStart)); - AddNode(createAndAdjustNode, language.AdjustExtendNextLineStartToCurrentEnd, nameof(Configuration.Settings.Shortcuts.MainAdjustExtendNextLineStartToCurrentEnd)); - if (createAndAdjustNode.Nodes.Count > 0) - { - _shortcuts.Nodes.Add(createAndAdjustNode); - } - - var audioVisualizerNode = new ShortcutNode(language.WaveformAndSpectrogram); - AddNode(audioVisualizerNode, Configuration.Settings.Language.Waveform.ClickToAddWaveformAndSpectrogram, nameof(Configuration.Settings.Shortcuts.WaveformAdd)); - AddNode(audioVisualizerNode, Configuration.Settings.Language.Waveform.ZoomIn, nameof(Configuration.Settings.Shortcuts.WaveformZoomIn)); - AddNode(audioVisualizerNode, Configuration.Settings.Language.Waveform.ZoomOut, nameof(Configuration.Settings.Shortcuts.WaveformZoomOut)); - AddNode(audioVisualizerNode, language.VerticalZoom, nameof(Configuration.Settings.Shortcuts.WaveformVerticalZoom)); - AddNode(audioVisualizerNode, language.VerticalZoomOut, nameof(Configuration.Settings.Shortcuts.WaveformVerticalZoomOut)); - AddNode(audioVisualizerNode, Configuration.Settings.Language.Main.Menu.ContextMenu.Split, nameof(Configuration.Settings.Shortcuts.WaveformSplit)); - AddNode(audioVisualizerNode, language.WaveformSeekSilenceForward, nameof(Configuration.Settings.Shortcuts.WaveformSearchSilenceForward)); - AddNode(audioVisualizerNode, language.WaveformSeekSilenceBack, nameof(Configuration.Settings.Shortcuts.WaveformSearchSilenceBack)); - AddNode(audioVisualizerNode, language.WaveformAddTextHere, nameof(Configuration.Settings.Shortcuts.WaveformAddTextHere)); - AddNode(audioVisualizerNode, language.WaveformAddTextHereFromClipboard, nameof(Configuration.Settings.Shortcuts.WaveformAddTextHereFromClipboard)); - AddNode(audioVisualizerNode, language.SetParagraphAsSelection, nameof(Configuration.Settings.Shortcuts.WaveformSetParagraphAsSelection)); - AddNode(audioVisualizerNode, language.WaveformPlayNewSelection, nameof(Configuration.Settings.Shortcuts.WaveformPlaySelection)); - AddNode(audioVisualizerNode, language.WaveformPlayNewSelectionEnd, nameof(Configuration.Settings.Shortcuts.WaveformPlaySelectionEnd)); - AddNode(audioVisualizerNode, Configuration.Settings.Language.Main.VideoControls.InsertNewSubtitleAtVideoPosition, nameof(Configuration.Settings.Shortcuts.MainWaveformInsertAtCurrentPosition)); - AddNode(audioVisualizerNode, language.WaveformFocusListView, nameof(Configuration.Settings.Shortcuts.WaveformFocusListView)); - AddNode(audioVisualizerNode, language.WaveformGoToPreviousSceneChange, nameof(Configuration.Settings.Shortcuts.WaveformGoToPreviousSceneChange)); - AddNode(audioVisualizerNode, language.WaveformGoToNextSceneChange, nameof(Configuration.Settings.Shortcuts.WaveformGoToNextSceneChange)); - AddNode(audioVisualizerNode, language.WaveformToggleSceneChange, nameof(Configuration.Settings.Shortcuts.WaveformToggleSceneChange)); - AddNode(audioVisualizerNode, language.WaveformGuessStart, nameof(Configuration.Settings.Shortcuts.WaveformGuessStart)); - AddNode(audioVisualizerNode, language.GoBack100Milliseconds, nameof(Configuration.Settings.Shortcuts.Waveform100MsLeft)); - AddNode(audioVisualizerNode, language.GoForward100Milliseconds, nameof(Configuration.Settings.Shortcuts.Waveform100MsRight)); - AddNode(audioVisualizerNode, language.GoBack1Second, nameof(Configuration.Settings.Shortcuts.Waveform1000MsLeft)); - AddNode(audioVisualizerNode, language.GoForward1Second, nameof(Configuration.Settings.Shortcuts.Waveform1000MsRight)); - if (audioVisualizerNode.Nodes.Count > 0) - { - _shortcuts.Nodes.Add(audioVisualizerNode); - } - } - - private void ShowShortcutsTreeView() - { - treeViewShortcuts.BeginUpdate(); - treeViewShortcuts.Nodes.Clear(); - - foreach (var parent in _shortcuts.Nodes) - { - var parentNode = new TreeNode(parent.Text); - foreach (ShortcutNode node in parent.Nodes) - { - AddNode(parentNode, node.Text, node.Shortcut); - } - if (parentNode.Nodes.Count > 0) - { - treeViewShortcuts.Nodes.Add(parentNode); - } - } - foreach (TreeNode node in treeViewShortcuts.Nodes) - { - node.Text = node.Text.RemoveChar('&'); - foreach (TreeNode subNode in node.Nodes) - { - subNode.Text = subNode.Text.RemoveChar('&'); - foreach (TreeNode subSubNode in subNode.Nodes) - { - subSubNode.Text = subSubNode.Text.RemoveChar('&'); - } - } - } - - treeViewShortcuts.ExpandAll(); - treeViewShortcuts.EndUpdate(); - if (treeViewShortcuts.Nodes.Count > 0) - { - treeViewShortcuts.SelectedNode = treeViewShortcuts.Nodes[0]; - } - } - - private void AddNode(TreeNode parentNode, string text, ShortcutHelper shortcut) - { - var normalizeAmpersand = text.Replace("&&", "@_____@").Replace("&", string.Empty).Replace("@_____@", "&"); - if (textBoxShortcutSearch.Left < 2 || normalizeAmpersand.Contains(textBoxShortcutSearch.Text, StringComparison.OrdinalIgnoreCase)) - { - parentNode.Nodes.Add(new TreeNode(text) { Tag = shortcut }); - } - } - - private void AddNode(ShortcutNode node, string text, string shortcut, bool isMenuItem = false) - { - var prop = Configuration.Settings.Shortcuts.GetType().GetProperty(shortcut); - if (prop != null) - { - var s = text + GetShortcutText((string)prop.GetValue(Configuration.Settings.Shortcuts, null)); - node.Nodes.Add(new ShortcutNode(s) { Shortcut = new ShortcutHelper(prop, isMenuItem), ShortcutText = shortcut }); - } - } - - private static string GetShortcutText(string shortcut) - { - if (string.IsNullOrEmpty(shortcut)) - { - shortcut = Configuration.Settings.Language.General.None; - } - - return $" [{shortcut}]"; - } - - private void InitializeWaveformsAndSpectrogramsFolderEmpty(LanguageStructure.Settings language) - { - string waveformsFolder = Configuration.WaveformsDirectory.TrimEnd(Path.DirectorySeparatorChar); - string spectrogramsFolder = Configuration.SpectrogramsDirectory.TrimEnd(Path.DirectorySeparatorChar); - long bytes = 0; - int count = 0; - - if (Directory.Exists(waveformsFolder)) - { - var di = new DirectoryInfo(waveformsFolder); - - // waveform data - bytes = 0; - count = 0; - foreach (FileInfo fi in di.GetFiles("*.wav")) - { - bytes += fi.Length; - count++; - } - } - - if (Directory.Exists(spectrogramsFolder)) - { - var di = new DirectoryInfo(spectrogramsFolder); - - // spectrogram data - foreach (var dir in di.GetDirectories()) - { - var spectrogramDir = new DirectoryInfo(dir.FullName); - foreach (var fi in spectrogramDir.GetFiles("*.gif")) - { - bytes += fi.Length; - count++; - } - foreach (var fi in spectrogramDir.GetFiles("*.db")) - { - bytes += fi.Length; - count++; - } - string xmlFileName = Path.Combine(dir.FullName, "Info.xml"); - if (File.Exists(xmlFileName)) - { - var fi = new FileInfo(xmlFileName); - bytes += fi.Length; - count++; - } - } - } - - if (count > 0) - { - buttonWaveformsFolderEmpty.Enabled = true; - labelWaveformsFolderInfo.Text = string.Format(language.WaveformAndSpectrogramsFolderInfo, count, bytes / 1024.0 / 1024.0); - } - else - { - buttonWaveformsFolderEmpty.Enabled = false; - labelWaveformsFolderInfo.Text = string.Format(language.WaveformAndSpectrogramsFolderInfo, 0, 0); - } - } - - public void Initialize(Icon icon, Image newFile, Image openFile, Image saveFile, Image saveFileAs, Image find, Image replace, Image fixCommonErrors, Image removeTextForHi, - Image visualSync, Image spellCheck, Image netflixGlyphCheck, Image settings, Image help) - { - Icon = (Icon)icon.Clone(); - pictureBoxNew.Image = (Image)newFile.Clone(); - pictureBoxOpen.Image = (Image)openFile.Clone(); - pictureBoxSave.Image = (Image)saveFile.Clone(); - pictureBoxSaveAs.Image = (Image)saveFileAs.Clone(); - pictureBoxFind.Image = (Image)find.Clone(); - pictureBoxReplace.Image = (Image)replace.Clone(); - pictureBoxTBFixCommonErrors.Image = (Image)fixCommonErrors.Clone(); - pictureBoxTBRemoveTextForHi.Image = (Image)removeTextForHi.Clone(); - pictureBoxVisualSync.Image = (Image)visualSync.Clone(); - pictureBoxSpellCheck.Image = (Image)spellCheck.Clone(); - pictureBoxNetflixQualityCheck.Image = (Image)netflixGlyphCheck.Clone(); - pictureBoxSettings.Image = (Image)settings.Clone(); - pictureBoxHelp.Image = (Image)help.Clone(); - } - - private void InitComboBoxWordListLanguages() - { - //Examples: da_DK_user.xml, eng_OCRFixReplaceList.xml, en_names.xml - string dir = Utilities.DictionaryFolder; - if (Directory.Exists(dir)) - { - var cultures = new List(); - // Specific culture e.g: en-US, en-GB... - foreach (var culture in CultureInfo.GetCultures(CultureTypes.SpecificCultures)) - { - if (File.Exists(Path.Combine(dir, culture.Name.Replace('-', '_') + "_user.xml"))) - { - if (!cultures.Contains(culture)) - { - cultures.Add(culture); - } - } - } - // Neutral culture e.g: "en" for all (en-US, en-GB, en-JM...) - foreach (var culture in CultureInfo.GetCultures(CultureTypes.NeutralCultures)) - { - string ocrFixGeneralFile = Path.Combine(dir, culture.GetThreeLetterIsoLanguageName() + "_OCRFixReplaceList.xml"); - string ocrFixUserFile = Path.Combine(dir, culture.GetThreeLetterIsoLanguageName() + "_OCRFixReplaceList_User.xml"); - string namesFile = Path.Combine(dir, culture.TwoLetterISOLanguageName + "_names.xml"); - if (File.Exists(ocrFixGeneralFile) || File.Exists(ocrFixUserFile) || File.Exists(namesFile)) - { - bool alreadyInList = false; - foreach (var ci in cultures) - { - // If culture is already added to the list, it doesn't matter if it's "culture specific" do not re-add. - if (ci.GetThreeLetterIsoLanguageName().Equals(culture.GetThreeLetterIsoLanguageName(), StringComparison.Ordinal)) - { - alreadyInList = true; - break; - } - } - if (!alreadyInList) - { - cultures.Add(culture); - } - } - } - - // English is the default selected language - Configuration.Settings.WordLists.LastLanguage = Configuration.Settings.WordLists.LastLanguage ?? "en-US"; - comboBoxWordListLanguage.BeginUpdate(); - var list = new List(cultures.Count); - var idx = 0; - for (var index = 0; index < cultures.Count; index++) - { - var ci = cultures[index]; - list.Add(new ComboBoxLanguage { CultureInfo = ci }); - if (ci.Name.Equals(Configuration.Settings.WordLists.LastLanguage, StringComparison.Ordinal)) - { - idx = index; - } - } - comboBoxWordListLanguage.Items.AddRange(list.ToArray()); - if (comboBoxWordListLanguage.Items.Count > 0) - { - comboBoxWordListLanguage.SelectedIndex = idx; - } - comboBoxWordListLanguage.EndUpdate(); - } - else - { - groupBoxWordLists.Enabled = false; - } - } - - private void ButtonOkClick(object sender, EventArgs e) - { - var gs = Configuration.Settings.General; - - gs.ShowToolbarNew = checkBoxToolbarNew.Checked; - gs.ShowToolbarOpen = checkBoxToolbarOpen.Checked; - gs.ShowToolbarSave = checkBoxToolbarSave.Checked; - gs.ShowToolbarSaveAs = checkBoxToolbarSaveAs.Checked; - gs.ShowToolbarFind = checkBoxToolbarFind.Checked; - gs.ShowToolbarReplace = checkBoxReplace.Checked; - gs.ShowToolbarFixCommonErrors = checkBoxTBFixCommonErrors.Checked; - gs.ShowToolbarRemoveTextForHi = checkBoxTBRemoveTextForHi.Checked; - gs.ShowToolbarVisualSync = checkBoxVisualSync.Checked; - gs.ShowToolbarSettings = checkBoxSettings.Checked; - gs.ShowToolbarSpellCheck = checkBoxSpellCheck.Checked; - gs.ShowToolbarNetflixGlyphCheck = checkBoxNetflixQualityCheck.Checked; - gs.ShowToolbarHelp = checkBoxHelp.Checked; - - gs.ShowFrameRate = checkBoxShowFrameRate.Checked; - if (double.TryParse(comboBoxFrameRate.Text.Replace(',', '.').Replace(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, "."), NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var outFrameRate)) - { - gs.DefaultFrameRate = outFrameRate; - } - - gs.DefaultEncoding = ((TextEncoding)comboBoxEncoding.Items[comboBoxEncoding.SelectedIndex]).ToString(); - - gs.AutoGuessAnsiEncoding = checkBoxAutoDetectAnsiEncoding.Checked; - gs.SubtitleTextBoxFontSize = int.Parse(comboBoxSubtitleFontSize.Text); - gs.SubtitleListViewFontSize = int.Parse(comboBoxSubtitleListViewFontSize.Text); - gs.SubtitleTextBoxFontBold = checkBoxSubtitleFontBold.Checked; - gs.SubtitleTextBoxSyntaxColor = checkBoxSubtitleTextBoxSyntaxColor.Checked; - gs.SubtitleTextBoxHtmlColor = panelTextBoxHtmlColor.BackColor; - gs.SubtitleTextBoxAssColor = panelTextBoxAssColor.BackColor; - gs.SubtitleListViewFontBold = checkBoxSubtitleListViewFontBold.Checked; - gs.CenterSubtitleInTextBox = checkBoxSubtitleCenter.Checked; - gs.SubtitleFontColor = panelSubtitleFontColor.BackColor; - gs.SubtitleBackgroundColor = panelSubtitleBackgroundColor.BackColor; - gs.ShowRecentFiles = checkBoxRememberRecentFiles.Checked; - gs.RememberSelectedLine = checkBoxRememberSelectedLine.Checked; - gs.StartLoadLastFile = checkBoxReopenLastOpened.Checked; - gs.StartRememberPositionAndSize = checkBoxRememberWindowPosition.Checked; - gs.StartInSourceView = checkBoxStartInSourceView.Checked; - gs.RemoveBlankLinesWhenOpening = checkBoxRemoveBlankLinesWhenOpening.Checked; - gs.ListViewLineSeparatorString = textBoxShowLineBreaksAs.Text; - if (string.IsNullOrWhiteSpace(gs.ListViewLineSeparatorString)) - { - gs.ListViewLineSeparatorString = "
"; - } - - gs.ListViewDoubleClickAction = comboBoxListViewDoubleClickEvent.SelectedIndex; - - gs.Profiles = _rulesProfiles; - - gs.SaveAsUseFileNameFrom = comboBoxSaveAsFileNameFrom.SelectedIndex == 0 ? "video" : "file"; - - gs.SubtitleMinimumDisplayMilliseconds = (int)numericUpDownDurationMin.Value; - gs.SubtitleMaximumDisplayMilliseconds = (int)numericUpDownDurationMax.Value; - gs.MinimumMillisecondsBetweenLines = (int)numericUpDownMinGapMs.Value; - gs.CurrentProfile = comboBoxRulesProfileName.Text; - - if (comboBoxAutoBackup.SelectedIndex == 1) - { - gs.AutoBackupSeconds = 60; - } - else if (comboBoxAutoBackup.SelectedIndex == 2) - { - gs.AutoBackupSeconds = 60 * 5; - } - else if (comboBoxAutoBackup.SelectedIndex == 3) - { - gs.AutoBackupSeconds = 60 * 15; - } - else - { - gs.AutoBackupSeconds = 0; - } - - if (comboBoxAutoBackupDeleteAfter.SelectedIndex == 2) - { - gs.AutoBackupDeleteAfterMonths = 6; - } - else if (comboBoxAutoBackupDeleteAfter.SelectedIndex == 1) - { - gs.AutoBackupDeleteAfterMonths = 3; - } - else - { - gs.AutoBackupDeleteAfterMonths = 1; - } - - gs.CheckForUpdates = checkBoxCheckForUpdates.Checked; - gs.AutoSave = checkBoxAutoSave.Checked; - - if (comboBoxTimeCodeMode.Visible) - { - gs.UseTimeFormatHHMMSSFF = comboBoxTimeCodeMode.SelectedIndex == 1; - } - - gs.SplitBehavior = comboBoxSplitBehavior.SelectedIndex; - - gs.SpellChecker = comboBoxSpellChecker.SelectedIndex == 1 ? "word" : "hunspell"; - - gs.AllowEditOfOriginalSubtitle = checkBoxAllowEditOfOriginalSubtitle.Checked; - gs.PromptDeleteLines = checkBoxPromptDeleteLines.Checked; - - if (radioButtonVideoPlayerMPV.Checked) - { - gs.VideoPlayer = "MPV"; - } - else if (radioButtonVideoPlayerMpcHc.Checked) - { - gs.VideoPlayer = "MPC-HC"; - } - else if (radioButtonVideoPlayerVLC.Checked) - { - gs.VideoPlayer = "VLC"; - } - else - { - gs.VideoPlayer = "DirectShow"; - } - - gs.MpvHandlesPreviewText = checkBoxMpvHandlesPreviewText.Checked; - gs.VlcLocation = textBoxVlcPath.Text; - - gs.VideoPlayerShowStopButton = checkBoxVideoPlayerShowStopButton.Checked; - gs.VideoPlayerShowMuteButton = checkBoxVideoPlayerShowMuteButton.Checked; - gs.VideoPlayerShowFullscreenButton = checkBoxVideoPlayerShowFullscreenButton.Checked; - gs.VideoPlayerPreviewFontSize = int.Parse(comboBoxlVideoPlayerPreviewFontSize.Items[0].ToString()) + comboBoxlVideoPlayerPreviewFontSize.SelectedIndex; - gs.VideoPlayerPreviewFontBold = checkBoxVideoPlayerPreviewFontBold.Checked; - gs.DisableVideoAutoLoading = !checkBoxVideoAutoOpen.Checked; - gs.AllowVolumeBoost = checkBoxAllowVolumeBoost.Checked; - - Configuration.Settings.VideoControls.CustomSearchText1 = comboBoxCustomSearch1.Text; - Configuration.Settings.VideoControls.CustomSearchText2 = comboBoxCustomSearch2.Text; - Configuration.Settings.VideoControls.CustomSearchText3 = comboBoxCustomSearch3.Text; - Configuration.Settings.VideoControls.CustomSearchText4 = comboBoxCustomSearch4.Text; - Configuration.Settings.VideoControls.CustomSearchText5 = comboBoxCustomSearch5.Text; - Configuration.Settings.VideoControls.CustomSearchUrl1 = textBoxCustomSearchUrl1.Text; - Configuration.Settings.VideoControls.CustomSearchUrl2 = textBoxCustomSearchUrl2.Text; - Configuration.Settings.VideoControls.CustomSearchUrl3 = textBoxCustomSearchUrl3.Text; - Configuration.Settings.VideoControls.CustomSearchUrl4 = textBoxCustomSearchUrl4.Text; - Configuration.Settings.VideoControls.CustomSearchUrl5 = textBoxCustomSearchUrl5.Text; - - int maxLength = (int)numericUpDownSubtitleLineMaximumLength.Value; - if (maxLength > 9 && maxLength < 1000) - { - gs.SubtitleLineMaximumLength = maxLength; - } - else if (maxLength > 999) - { - gs.SubtitleLineMaximumLength = 999; - } - else - { - gs.SubtitleLineMaximumLength = 45; - } - - gs.SubtitleOptimalCharactersPerSeconds = (double)numericUpDownOptimalCharsSec.Value; - gs.SubtitleMaximumCharactersPerSeconds = (double)numericUpDownMaxCharsSec.Value; - gs.SubtitleMaximumWordsPerMinute = (double)numericUpDownMaxWordsMin.Value; - gs.MaxNumberOfLines = (int)numericUpDownMaxNumberOfLines.Value; - - gs.AutoWrapLineWhileTyping = checkBoxAutoWrapWhileTyping.Checked; - - if (comboBoxSubtitleFont.SelectedItem != null) - { - gs.SubtitleFontName = comboBoxSubtitleFont.SelectedItem.ToString(); - } - - var toolsSettings = Configuration.Settings.Tools; - toolsSettings.VerifyPlaySeconds = comboBoxToolsVerifySeconds.SelectedIndex + 2; - toolsSettings.StartSceneIndex = comboBoxToolsStartSceneIndex.SelectedIndex; - toolsSettings.EndSceneIndex = comboBoxToolsEndSceneIndex.SelectedIndex; - gs.MergeLinesShorterThan = comboBoxMergeShortLineLength.SelectedIndex + 5; - if (gs.MergeLinesShorterThan > gs.SubtitleLineMaximumLength + 1) - { - gs.MergeLinesShorterThan = gs.SubtitleLineMaximumLength; - } - - gs.DialogStyle = DialogSplitMerge.GetDialogStyleFromIndex(comboBoxDialogStyle.SelectedIndex); - gs.ContinuationStyle = ContinuationUtilities.GetContinuationStyleFromIndex(comboBoxContinuationStyle.SelectedIndex); - - toolsSettings.MusicSymbol = comboBoxToolsMusicSymbol.SelectedItem.ToString(); - toolsSettings.MusicSymbolReplace = textBoxMusicSymbolsToReplace.Text; - toolsSettings.SpellCheckAutoChangeNames = checkBoxSpellCheckAutoChangeNames.Checked; - toolsSettings.SpellCheckAutoChangeNamesUseSuggestions = checkBoxSpellCheckAutoChangeNamesViaSuggestions.Checked; - toolsSettings.CheckOneLetterWords = checkBoxSpellCheckOneLetterWords.Checked; - toolsSettings.SpellCheckEnglishAllowInQuoteAsIng = checkBoxTreatINQuoteAsING.Checked; - toolsSettings.RememberUseAlwaysList = checkBoxUseAlwaysToFile.Checked; - toolsSettings.UseNoLineBreakAfter = checkBoxUseDoNotBreakAfterList.Checked; - toolsSettings.AutoBreakCommaBreakEarly = checkBoxToolsBreakEarlyComma.Checked; - toolsSettings.AutoBreakLineEndingEarly = checkBoxToolsBreakEarlyLineEnding.Checked; - toolsSettings.AutoBreakUsePixelWidth = checkBoxToolsBreakByPixelWidth.Checked; - toolsSettings.AutoBreakPreferBottomHeavy = checkBoxToolsBreakPreferBottomHeavy.Checked; - toolsSettings.AutoBreakPreferBottomPercent = (double)numericUpDownToolsBreakPreferBottomHeavy.Value; - toolsSettings.AutoBreakDashEarly = checkBoxToolsBreakEarlyDash.Checked; - - Configuration.Settings.General.CharactersPerSecondsIgnoreWhiteSpace = !checkBoxCpsIncludeWhiteSpace.Checked; - toolsSettings.OcrFixUseHardcodedRules = checkBoxFixCommonOcrErrorsUsingHardcodedRules.Checked; - toolsSettings.FixShortDisplayTimesAllowMoveStartTime = checkBoxFixShortDisplayTimesAllowMoveStartTime.Checked; - toolsSettings.FixCommonErrorsSkipStepOne = checkBoxFceSkipStep1.Checked; - toolsSettings.MicrosoftTranslatorApiKey = textBoxBingClientSecret.Text.Trim(); - toolsSettings.MicrosoftTranslatorTokenEndpoint = comboBoxBoxBingTokenEndpoint.Text.Trim(); - toolsSettings.GoogleApiV2Key = textBoxGoogleTransleApiKey.Text.Trim(); - - var wordListSettings = Configuration.Settings.WordLists; - wordListSettings.UseOnlineNames = checkBoxNamesOnline.Checked; - wordListSettings.NamesUrl = textBoxNamesOnline.Text; - if (comboBoxWordListLanguage.Items.Count > 0 && comboBoxWordListLanguage.SelectedIndex >= 0) - { - if (comboBoxWordListLanguage.Items[comboBoxWordListLanguage.SelectedIndex] is ComboBoxLanguage ci) - { - Configuration.Settings.WordLists.LastLanguage = ci.CultureInfo.Name; - } - } - - var ssa = Configuration.Settings.SubtitleSettings; - ssa.SsaFontName = _ssaFontName; - ssa.SsaFontSize = _ssaFontSize; - ssa.SsaFontColorArgb = _ssaFontColor; - ssa.SsaFontBold = checkBoxSsaFontBold.Checked; - ssa.SsaOutline = (int)numericUpDownSsaOutline.Value; - ssa.SsaShadow = (int)numericUpDownSsaShadow.Value; - ssa.SsaOpaqueBox = checkBoxSsaOpaqueBox.Checked; - ssa.SsaMarginLeft = (int)numericUpDownSsaMarginLeft.Value; - ssa.SsaMarginRight = (int)numericUpDownSsaMarginRight.Value; - ssa.SsaMarginTopBottom = (int)numericUpDownSsaMarginVertical.Value; - - var proxy = Configuration.Settings.Proxy; - proxy.ProxyAddress = textBoxProxyAddress.Text; - proxy.UserName = textBoxProxyUserName.Text; - if (string.IsNullOrWhiteSpace(textBoxProxyPassword.Text)) - { - proxy.Password = null; - } - else - { - proxy.EncodePassword(textBoxProxyPassword.Text); - } - - proxy.Domain = textBoxProxyDomain.Text; - - Configuration.Settings.NetworkSettings.NewMessageSound = textBoxNetworkSessionNewMessageSound.Text; - - Configuration.Settings.Tools.ListViewSyntaxColorDurationSmall = checkBoxSyntaxColorDurationTooSmall.Checked; - Configuration.Settings.Tools.ListViewSyntaxColorDurationBig = checkBoxSyntaxColorDurationTooLarge.Checked; - Configuration.Settings.Tools.ListViewSyntaxColorLongLines = checkBoxSyntaxColorTextTooLong.Checked; - Configuration.Settings.Tools.ListViewSyntaxColorWideLines = checkBoxSyntaxColorTextTooWide.Checked; - Configuration.Settings.Tools.ListViewSyntaxMoreThanXLines = checkBoxSyntaxColorTextMoreThanTwoLines.Checked; - Configuration.Settings.Tools.ListViewSyntaxColorOverlap = checkBoxSyntaxOverlap.Checked; - Configuration.Settings.Tools.ListViewSyntaxColorGap = checkBoxSyntaxColorGapTooSmall.Checked; - Configuration.Settings.Tools.ListViewSyntaxErrorColor = panelListViewSyntaxColorError.BackColor; - - Configuration.Settings.VideoControls.WaveformDrawGrid = checkBoxWaveformShowGrid.Checked; - Configuration.Settings.VideoControls.WaveformDrawCps = checkBoxWaveformShowCps.Checked; - Configuration.Settings.VideoControls.WaveformDrawWpm = checkBoxWaveformShowWpm.Checked; - Configuration.Settings.VideoControls.WaveformGridColor = panelWaveformGridColor.BackColor; - Configuration.Settings.VideoControls.WaveformSelectedColor = panelWaveformSelectedColor.BackColor; - Configuration.Settings.VideoControls.WaveformColor = panelWaveformColor.BackColor; - Configuration.Settings.VideoControls.WaveformBackgroundColor = panelWaveformBackgroundColor.BackColor; - Configuration.Settings.VideoControls.WaveformTextColor = panelWaveformTextColor.BackColor; - Configuration.Settings.VideoControls.WaveformCursorColor = panelWaveformCursorColor.BackColor; - Configuration.Settings.VideoControls.GenerateSpectrogram = checkBoxGenerateSpectrogram.Checked; - Configuration.Settings.VideoControls.SpectrogramAppearance = comboBoxSpectrogramAppearance.SelectedIndex == 0 ? "OneColorGradient" : "Classic"; - - Configuration.Settings.VideoControls.WaveformTextSize = int.Parse(comboBoxWaveformTextSize.Text); - Configuration.Settings.VideoControls.WaveformTextBold = checkBoxWaveformTextBold.Checked; - Configuration.Settings.VideoControls.WaveformMouseWheelScrollUpIsForward = checkBoxReverseMouseWheelScrollDirection.Checked; - Configuration.Settings.VideoControls.WaveformAllowOverlap = checkBoxAllowOverlap.Checked; - Configuration.Settings.VideoControls.WaveformSetVideoPositionOnMoveStartEnd = checkBoxWaveformSetVideoPosMoveStartEnd.Checked; - Configuration.Settings.VideoControls.WaveformFocusOnMouseEnter = checkBoxWaveformHoverFocus.Checked; - Configuration.Settings.VideoControls.WaveformListViewFocusOnMouseEnter = checkBoxListViewMouseEnterFocus.Checked; - Configuration.Settings.VideoControls.WaveformSingleClickSelect = checkBoxWaveformSingleClickSelect.Checked; - Configuration.Settings.VideoControls.WaveformSnapToSceneChanges = checkBoxWaveformSnapToSceneChanges.Checked; - Configuration.Settings.VideoControls.WaveformBorderHitMs = Convert.ToInt32(numericUpDownWaveformBorderHitMs.Value); - gs.UseFFmpegForWaveExtraction = checkBoxUseFFmpeg.Checked; - gs.FFmpegLocation = textBoxFFmpegPath.Text; - - // save shortcuts - foreach (var kvp in _newShortcuts) - { - kvp.Key.Shortcut.SetValue(Configuration.Settings.Shortcuts, kvp.Value, null); - } - - Configuration.Settings.Save(); - } - - private void FormSettings_KeyDown(object sender, KeyEventArgs e) - { - if (comboBoxShortcutKey.Focused) - { - return; - } - - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - else if (e.KeyCode == UiUtil.HelpKeys) - { - Utilities.ShowHelp("#Settings"); - e.SuppressKeyPress = true; - } - } - - private void UpdateSsaExample() - { - GeneratePreviewReal(); - } - - private void GeneratePreviewReal() - { - if (_loading) - { - return; - } - - pictureBoxPreview.Image?.Dispose(); - var backgroundImage = TextDesigner.MakeBackgroundImage(pictureBoxPreview.Width, pictureBoxPreview.Height, 9, _backgroundImageDark); - var outlineWidth = (float)numericUpDownSsaOutline.Value; - var shadowWidth = (float)numericUpDownSsaShadow.Value; - var outlineColor = Color.Black; - - Font font; - try - { - font = new Font(comboBoxFontName.Text, (float)numericUpDownFontSize.Value * 1.1f, checkBoxSsaFontBold.Checked ? FontStyle.Bold : FontStyle.Regular); - } - catch - { - font = new Font(Font, FontStyle.Regular); - } - - var measureBmp = TextDesigner.MakeTextBitmapAssa( - Configuration.Settings.General.PreviewAssaText, - 0, - 0, - font, - pictureBoxPreview.Width, - pictureBoxPreview.Height, - outlineWidth, - shadowWidth, - null, - panelPrimaryColor.BackColor, - outlineColor, - Color.FromArgb(100, Color.Black), - checkBoxSsaOpaqueBox.Checked); - var nBmp = new NikseBitmap(measureBmp); - var measuredWidth = nBmp.GetNonTransparentWidth(); - var measuredHeight = nBmp.GetNonTransparentHeight(); - - float left = (pictureBoxPreview.Width - measuredWidth) / 2.0f; - float top = pictureBoxPreview.Height - measuredHeight - (int)numericUpDownSsaMarginVertical.Value; - var designedText = TextDesigner.MakeTextBitmapAssa( - Configuration.Settings.General.PreviewAssaText, - (int)Math.Round(left), - (int)Math.Round(top), - font, - pictureBoxPreview.Width, - pictureBoxPreview.Height, - outlineWidth, - shadowWidth, - backgroundImage, - panelPrimaryColor.BackColor, - Color.Black, - Color.FromArgb(200, Color.Black), - checkBoxSsaOpaqueBox.Checked); - - pictureBoxPreview.Image?.Dispose(); - pictureBoxPreview.Image = designedText; - font.Dispose(); - } - - private void ComboBoxWordListLanguageSelectedIndexChanged(object sender, EventArgs e) - { - buttonRemoveNameEtc.Enabled = false; - buttonAddNames.Enabled = false; - buttonRemoveUserWord.Enabled = false; - buttonAddUserWord.Enabled = false; - buttonRemoveOcrFix.Enabled = false; - buttonAddOcrFix.Enabled = false; - listBoxNames.Items.Clear(); - listBoxUserWordLists.Items.Clear(); - listBoxOcrFixList.Items.Clear(); - if (comboBoxWordListLanguage.Items.Count > 0 && comboBoxWordListLanguage.Items[comboBoxWordListLanguage.SelectedIndex] is ComboBoxLanguage) - { - string language = GetCurrentWordListLanguage(); - - buttonAddNames.Enabled = true; - buttonAddUserWord.Enabled = true; - buttonAddOcrFix.Enabled = true; - - // user word list - LoadUserWords(language, true); - - // OCR fix words - LoadOcrFixList(true); - - LoadNames(language, true); - } - } - - private void LoadOcrFixList(bool reloadListBox) - { - if (comboBoxWordListLanguage.Items.Count == 0 || !(comboBoxWordListLanguage.Items[comboBoxWordListLanguage.SelectedIndex] is ComboBoxLanguage cb)) - { - return; - } - - _ocrFixReplaceList = OcrFixReplaceList.FromLanguageId(cb.CultureInfo.GetThreeLetterIsoLanguageName()); - if (reloadListBox) - { - listBoxOcrFixList.BeginUpdate(); - listBoxOcrFixList.Items.Clear(); - listBoxOcrFixList.Items.AddRange(_ocrFixReplaceList.WordReplaceList.Select(p => p.Key + " --> " + p.Value).ToArray()); - listBoxOcrFixList.Items.AddRange(_ocrFixReplaceList.PartialLineWordBoundaryReplaceList.Select(p => p.Key + " --> " + p.Value).ToArray()); - listBoxOcrFixList.Sorted = true; - listBoxOcrFixList.EndUpdate(); - } - } - - private void LoadUserWords(string language, bool reloadListBox) - { - _userWordList = new List(); - Utilities.LoadUserWordList(_userWordList, language); - _userWordList.Sort(); - - if (reloadListBox) - { - listBoxUserWordLists.Items.Clear(); - listBoxUserWordLists.Items.AddRange(_userWordList.ToArray()); - } - } - - private void LoadNames(string language, bool reloadListBox) - { - var task = Task.Factory.StartNew(() => - { - // names etc - var nameList = new NameList(Configuration.DictionariesDirectory, language, Configuration.Settings.WordLists.UseOnlineNames, Configuration.Settings.WordLists.NamesUrl); - _wordListNames = nameList.GetAllNames(); - _wordListNames.Sort(); - return _wordListNames; - }); - - if (reloadListBox) - { - // reload the listbox on a continuation ui thead - var uiContext = TaskScheduler.FromCurrentSynchronizationContext(); - task.ContinueWith(originalTask => - { - listBoxNames.BeginUpdate(); - listBoxNames.Items.Clear(); - listBoxNames.Items.AddRange(originalTask.Result.ToArray()); - listBoxNames.EndUpdate(); - }, uiContext); - } - } - - private string GetCurrentWordListLanguage() - { - var idx = comboBoxWordListLanguage.SelectedIndex; - if (idx < 0) - { - return null; - } - - var cb = comboBoxWordListLanguage.Items[idx] as ComboBoxLanguage; - return cb?.CultureInfo.Name.Replace('-', '_'); - } - - private void ButtonAddNamesClick(object sender, EventArgs e) - { - var languageIndex = comboBoxWordListLanguage.SelectedIndex; - if (languageIndex < 0) - { - return; - } - - string language = GetCurrentWordListLanguage(); - string text = textBoxNameEtc.Text.RemoveControlCharacters().Trim(); - if (!string.IsNullOrEmpty(language) && text.Length > 1 && !_wordListNames.Contains(text)) - { - var nameList = new NameList(Configuration.DictionariesDirectory, language, Configuration.Settings.WordLists.UseOnlineNames, Configuration.Settings.WordLists.NamesUrl); - nameList.Add(text); - LoadNames(language, true); - labelStatus.Text = string.Format(Configuration.Settings.Language.Settings.WordAddedX, text); - textBoxNameEtc.Text = string.Empty; - textBoxNameEtc.Focus(); - for (int i = 0; i < listBoxNames.Items.Count; i++) - { - if (listBoxNames.Items[i].ToString() == text) - { - listBoxNames.SelectedIndex = i; - int top = i - 5; - if (top < 0) - { - top = 0; - } - - listBoxNames.TopIndex = top; - break; - } - } - } - else - { - MessageBox.Show(Configuration.Settings.Language.Settings.WordAlreadyExists); - } - } - - private void ListBoxNamesSelectedIndexChanged(object sender, EventArgs e) - { - buttonRemoveNameEtc.Enabled = listBoxNames.SelectedIndex >= 0; - } - - private void ButtonRemoveNameEtcClick(object sender, EventArgs e) - { - if (listBoxNames.SelectedIndices.Count == 0) - { - return; - } - - string language = GetCurrentWordListLanguage(); - int index = listBoxNames.SelectedIndex; - string text = listBoxNames.Items[index].ToString(); - int itemsToRemoveCount = listBoxNames.SelectedIndices.Count; - if (!string.IsNullOrEmpty(language) && index >= 0) - { - DialogResult result; - if (itemsToRemoveCount == 1) - { - result = MessageBox.Show(string.Format(Configuration.Settings.Language.Settings.RemoveX, text), "Subtitle Edit", MessageBoxButtons.YesNo); - } - else - { - result = MessageBox.Show(string.Format(Configuration.Settings.Language.Main.DeleteXLinesPrompt, itemsToRemoveCount), "Subtitle Edit", MessageBoxButtons.YesNo); - } - - if (result == DialogResult.Yes) - { - int removeCount = 0; - var namesList = new NameList(Configuration.DictionariesDirectory, language, Configuration.Settings.WordLists.UseOnlineNames, Configuration.Settings.WordLists.NamesUrl); - for (int idx = listBoxNames.SelectedIndices.Count - 1; idx >= 0; idx--) - { - index = listBoxNames.SelectedIndices[idx]; - text = listBoxNames.Items[index].ToString(); - namesList.Remove(text); - removeCount++; - listBoxNames.Items.RemoveAt(index); - } - - if (removeCount > 0) - { - LoadNames(language, true); // reload - - if (index < listBoxNames.Items.Count) - { - listBoxNames.SelectedIndex = index; - } - else if (listBoxNames.Items.Count > 0) - { - listBoxNames.SelectedIndex = index - 1; - } - - listBoxNames.Focus(); - - buttonRemoveNameEtc.Enabled = false; - return; - } - - if (removeCount < itemsToRemoveCount && Configuration.Settings.WordLists.UseOnlineNames && !string.IsNullOrEmpty(Configuration.Settings.WordLists.NamesUrl)) - { - MessageBox.Show(Configuration.Settings.Language.Settings.CannotUpdateNamesOnline); - return; - } - - if (removeCount == 0) - { - MessageBox.Show(Configuration.Settings.Language.Settings.WordNotFound); - } - } - } - } - - private void TextBoxNameEtcKeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Enter) - { - e.SuppressKeyPress = true; - ButtonAddNamesClick(null, null); - } - } - - private void ButtonAddUserWordClick(object sender, EventArgs e) - { - var languageIndex = comboBoxWordListLanguage.SelectedIndex; - if (languageIndex < 0) - { - return; - } - - string language = GetCurrentWordListLanguage(); - string text = textBoxUserWord.Text.RemoveControlCharacters().Trim().ToLowerInvariant(); - if (!string.IsNullOrEmpty(language) && text.Length > 0 && !_userWordList.Contains(text)) - { - Utilities.AddToUserDictionary(text, language); - LoadUserWords(language, true); - labelStatus.Text = string.Format(Configuration.Settings.Language.Settings.WordAddedX, text); - textBoxUserWord.Text = string.Empty; - textBoxUserWord.Focus(); - - for (int i = 0; i < listBoxUserWordLists.Items.Count; i++) - { - if (listBoxUserWordLists.Items[i].ToString() == text) - { - listBoxUserWordLists.SelectedIndex = i; - int top = i - 5; - if (top < 0) - { - top = 0; - } - - listBoxUserWordLists.TopIndex = top; - break; - } - } - } - else - { - MessageBox.Show(Configuration.Settings.Language.Settings.WordAlreadyExists); - } - } - - private void TextBoxUserWordKeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Enter) - { - e.SuppressKeyPress = true; - ButtonAddUserWordClick(null, null); - } - } - - private void ButtonRemoveUserWordClick(object sender, EventArgs e) - { - if (listBoxUserWordLists.SelectedIndices.Count == 0) - { - return; - } - - string language = GetCurrentWordListLanguage(); - int index = listBoxUserWordLists.SelectedIndex; - int itemsToRemoveCount = listBoxUserWordLists.SelectedIndices.Count; - string text = listBoxUserWordLists.Items[index].ToString(); - if (!string.IsNullOrEmpty(language) && index >= 0) - { - DialogResult result; - if (itemsToRemoveCount == 1) - { - result = MessageBox.Show(string.Format(Configuration.Settings.Language.Settings.RemoveX, text), "Subtitle Edit", MessageBoxButtons.YesNo); - } - else - { - result = MessageBox.Show(string.Format(Configuration.Settings.Language.Main.DeleteXLinesPrompt, itemsToRemoveCount), "Subtitle Edit", MessageBoxButtons.YesNo); - } - - if (result == DialogResult.Yes) - { - int removeCount = 0; - var words = new List(); - string userWordFileName = Utilities.LoadUserWordList(words, language); - - for (int idx = listBoxUserWordLists.SelectedIndices.Count - 1; idx >= 0; idx--) - { - index = listBoxUserWordLists.SelectedIndices[idx]; - text = listBoxUserWordLists.Items[index].ToString(); - - if (words.Contains(text)) - { - words.Remove(text); - removeCount++; - } - listBoxUserWordLists.Items.RemoveAt(index); - } - - if (removeCount > 0) - { - words.Sort(); - var doc = new XmlDocument(); - doc.Load(userWordFileName); - doc.DocumentElement.RemoveAll(); - foreach (string word in words) - { - XmlNode node = doc.CreateElement("word"); - node.InnerText = word; - doc.DocumentElement.AppendChild(node); - } - doc.Save(userWordFileName); - LoadUserWords(language, false); // reload - buttonRemoveUserWord.Enabled = false; - - if (index < listBoxUserWordLists.Items.Count) - { - listBoxUserWordLists.SelectedIndex = index; - } - else if (listBoxUserWordLists.Items.Count > 0) - { - listBoxUserWordLists.SelectedIndex = index - 1; - } - - listBoxUserWordLists.Focus(); - return; - } - - if (removeCount < itemsToRemoveCount) - { - MessageBox.Show(Configuration.Settings.Language.Settings.WordNotFound); - } - } - } - } - - private void ListBoxUserWordListsSelectedIndexChanged(object sender, EventArgs e) - { - buttonRemoveUserWord.Enabled = listBoxUserWordLists.SelectedIndex >= 0; - } - - private void ButtonAddOcrFixClick(object sender, EventArgs e) - { - string key = textBoxOcrFixKey.Text.RemoveControlCharacters().Trim(); - string value = textBoxOcrFixValue.Text.RemoveControlCharacters().Trim(); - if (key.Length == 0 || value.Length == 0 || key == value || Utilities.IsInteger(key)) - { - return; - } - - if (comboBoxWordListLanguage.Items.Count == 0 || !(comboBoxWordListLanguage.Items[comboBoxWordListLanguage.SelectedIndex] is ComboBoxLanguage)) - { - return; - } - - var added = _ocrFixReplaceList.AddWordOrPartial(key, value); - if (!added) - { - MessageBox.Show(Configuration.Settings.Language.Settings.WordAlreadyExists); - return; - } - - LoadOcrFixList(true); - textBoxOcrFixKey.Text = string.Empty; - textBoxOcrFixValue.Text = string.Empty; - textBoxOcrFixKey.Focus(); - - for (int i = 0; i < listBoxOcrFixList.Items.Count; i++) - { - if (listBoxOcrFixList.Items[i].ToString() == key + " --> " + value) - { - listBoxOcrFixList.SelectedIndex = i; - int top = i - 5; - if (top < 0) - { - top = 0; - } - - listBoxOcrFixList.TopIndex = top; - break; - } - } - } - - private void ListBoxOcrFixListSelectedIndexChanged(object sender, EventArgs e) - { - buttonRemoveOcrFix.Enabled = listBoxOcrFixList.SelectedIndex >= 0; - } - - private void ButtonRemoveOcrFixClick(object sender, EventArgs e) - { - var languageIndex = comboBoxWordListLanguage.SelectedIndex; - if (languageIndex < 0) - { - return; - } - - if (!(comboBoxWordListLanguage.Items[languageIndex] is ComboBoxLanguage)) - { - return; - } - - if (listBoxOcrFixList.SelectedIndices.Count == 0) - { - return; - } - - int itemsToRemoveCount = listBoxOcrFixList.SelectedIndices.Count; - - int index = listBoxOcrFixList.SelectedIndex; - string text = listBoxOcrFixList.Items[index].ToString(); - string key = text.Substring(0, text.IndexOf(" --> ", StringComparison.Ordinal)); - - if (_ocrFixReplaceList.WordReplaceList.ContainsKey(key) || _ocrFixReplaceList.PartialLineWordBoundaryReplaceList.ContainsKey(key)) - { - DialogResult result; - if (itemsToRemoveCount == 1) - { - result = MessageBox.Show(string.Format(Configuration.Settings.Language.Settings.RemoveX, text), "Subtitle Edit", MessageBoxButtons.YesNo); - } - else - { - result = MessageBox.Show(string.Format(Configuration.Settings.Language.Main.DeleteXLinesPrompt, itemsToRemoveCount), "Subtitle Edit", MessageBoxButtons.YesNo); - } - - if (result == DialogResult.Yes) - { - listBoxOcrFixList.BeginUpdate(); - for (int idx = listBoxOcrFixList.SelectedIndices.Count - 1; idx >= 0; idx--) - { - index = listBoxOcrFixList.SelectedIndices[idx]; - text = listBoxOcrFixList.Items[index].ToString(); - key = text.Substring(0, text.IndexOf(" --> ", StringComparison.Ordinal)); - - if (_ocrFixReplaceList.WordReplaceList.ContainsKey(key) || _ocrFixReplaceList.PartialLineWordBoundaryReplaceList.ContainsKey(key)) - { - _ocrFixReplaceList.RemoveWordOrPartial(key); - } - listBoxOcrFixList.Items.RemoveAt(index); - } - listBoxOcrFixList.EndUpdate(); - - LoadOcrFixList(false); - buttonRemoveOcrFix.Enabled = false; - - if (index < listBoxOcrFixList.Items.Count) - { - listBoxOcrFixList.SelectedIndex = index; - } - else if (listBoxOcrFixList.Items.Count > 0) - { - listBoxOcrFixList.SelectedIndex = index - 1; - } - - listBoxOcrFixList.Focus(); - } - } - } - - private void TextBoxOcrFixValueKeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Enter) - { - e.SuppressKeyPress = true; - ButtonAddOcrFixClick(null, null); - } - } - - private void TabControlSettingsSelectedIndexChanged(object sender, EventArgs e) - { - labelStatus.Text = string.Empty; - } - - private void ListBoxKeyDownSearch(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape || - e.KeyCode == Keys.Tab || - e.KeyCode == Keys.Return || - e.KeyCode == Keys.Enter || - e.KeyCode == Keys.Down || - e.KeyCode == Keys.Up || - e.KeyCode == Keys.PageDown || - e.KeyCode == Keys.PageUp || - e.KeyCode == Keys.None || - e.KeyCode == UiUtil.HelpKeys || - e.KeyCode == Keys.Home || - e.KeyCode == Keys.End) - { - return; - } - - if (TimeSpan.FromTicks(_listBoxSearchStringLastUsed.Ticks).TotalMilliseconds + 1800 < - TimeSpan.FromTicks(DateTime.Now.Ticks).TotalMilliseconds) - { - _listBoxSearchString = string.Empty; - } - - if (e.KeyCode == Keys.Delete) - { - if (_listBoxSearchString.Length > 0) - { - _listBoxSearchString = _listBoxSearchString.Remove(_listBoxSearchString.Length - 1, 1); - } - } - else - { - _listBoxSearchString += e.KeyCode.ToString(); - } - - _listBoxSearchStringLastUsed = DateTime.Now; - FindAndSelectListBoxItem(sender as ListBox); - e.SuppressKeyPress = true; - } - - private void FindAndSelectListBoxItem(ListBox listBox) - { - int i = 0; - foreach (string s in listBox.Items) - { - if (s.StartsWith(_listBoxSearchString, StringComparison.OrdinalIgnoreCase)) - { - listBox.SelectedIndex = i; - break; - } - i++; - } - } - - private void ListBoxSearchReset(object sender, EventArgs e) - { - _listBoxSearchString = string.Empty; - } - - private void comboBoxCustomSearch_SelectedIndexChanged(object sender, EventArgs e) - { - var cb = (ComboBox)sender; - var tb = textBoxCustomSearchUrl1; - if (cb == comboBoxCustomSearch2) - { - tb = textBoxCustomSearchUrl2; - } - else if (cb == comboBoxCustomSearch3) - { - tb = textBoxCustomSearchUrl3; - } - else if (cb == comboBoxCustomSearch4) - { - tb = textBoxCustomSearchUrl4; - } - else if (cb == comboBoxCustomSearch5) - { - tb = textBoxCustomSearchUrl5; - } - - if (cb.SelectedIndex >= 0) - { - if (cb.SelectedIndex == 0) - { - tb.Text = "https://www.dictionary.com/browse/{0}"; - } - else if (cb.SelectedIndex == 1) - { - tb.Text = "http://www.learnersdictionary.com/search/{0}"; - } - else if (cb.SelectedIndex == 2) - { - tb.Text = "https://www.merriam-webster.com/dictionary/{0}"; - } - else if (cb.SelectedIndex == 3) - { - tb.Text = "https://www.thefreedictionary.com/{0}"; - } - else if (cb.SelectedIndex == 4) - { - tb.Text = "https://www.thesaurus.com/browse/{0}"; - } - else if (cb.SelectedIndex == 5) - { - tb.Text = "https://www.urbandictionary.com/define.php?term={0}"; - } - else if (cb.SelectedIndex == 6) - { - tb.Text = "https://visuwords.com/?word={0}"; - } - else if (cb.SelectedIndex == 7) - { - tb.Text = "https://en.wikipedia.org/wiki?search={0}"; - } - } - } - - private void buttonWaveformSelectedColor_Click(object sender, EventArgs e) - { - colorDialogSSAStyle.Color = panelWaveformSelectedColor.BackColor; - if (colorDialogSSAStyle.ShowDialog() == DialogResult.OK) - { - panelWaveformSelectedColor.BackColor = colorDialogSSAStyle.Color; - } - } - - private void buttonWaveformColor_Click(object sender, EventArgs e) - { - colorDialogSSAStyle.Color = panelWaveformColor.BackColor; - if (colorDialogSSAStyle.ShowDialog() == DialogResult.OK) - { - panelWaveformColor.BackColor = colorDialogSSAStyle.Color; - } - } - - private void buttonWaveformBackgroundColor_Click(object sender, EventArgs e) - { - colorDialogSSAStyle.Color = panelWaveformBackgroundColor.BackColor; - if (colorDialogSSAStyle.ShowDialog() == DialogResult.OK) - { - panelWaveformBackgroundColor.BackColor = colorDialogSSAStyle.Color; - } - } - - private void buttonWaveformGridColor_Click(object sender, EventArgs e) - { - colorDialogSSAStyle.Color = panelWaveformGridColor.BackColor; - if (colorDialogSSAStyle.ShowDialog() == DialogResult.OK) - { - panelWaveformGridColor.BackColor = colorDialogSSAStyle.Color; - } - } - - private void buttonWaveformTextColor_Click(object sender, EventArgs e) - { - colorDialogSSAStyle.Color = panelWaveformTextColor.BackColor; - if (colorDialogSSAStyle.ShowDialog() == DialogResult.OK) - { - panelWaveformTextColor.BackColor = colorDialogSSAStyle.Color; - } - } - - private void buttonWaveformCursorColor_Click(object sender, EventArgs e) - { - colorDialogSSAStyle.Color = panelWaveformCursorColor.BackColor; - if (colorDialogSSAStyle.ShowDialog() == DialogResult.OK) - { - panelWaveformCursorColor.BackColor = colorDialogSSAStyle.Color; - } - } - - private void buttonWaveformsFolderEmpty_Click(object sender, EventArgs e) - { - string waveformsFolder = Configuration.WaveformsDirectory.TrimEnd(Path.DirectorySeparatorChar); - if (Directory.Exists(waveformsFolder)) - { - var di = new DirectoryInfo(waveformsFolder); - - foreach (var fileName in di.GetFiles("*.wav")) - { - try - { - File.Delete(fileName.FullName); - } - catch (Exception exception) - { - MessageBox.Show(exception.Message); - } - } - } - - string spectrogramsFolder = Configuration.SpectrogramsDirectory.TrimEnd(Path.DirectorySeparatorChar); - if (Directory.Exists(spectrogramsFolder)) - { - var di = new DirectoryInfo(spectrogramsFolder); - - foreach (var dir in di.GetDirectories()) - { - var spectrogramDir = new DirectoryInfo(dir.FullName); - foreach (var fileName in spectrogramDir.GetFiles("*.gif")) - { - File.Delete(fileName.FullName); - } - string imageDbFileName = Path.Combine(dir.FullName, "Images.db"); - if (File.Exists(imageDbFileName)) - { - File.Delete(imageDbFileName); - } - - string xmlFileName = Path.Combine(dir.FullName, "Info.xml"); - if (File.Exists(xmlFileName)) - { - File.Delete(xmlFileName); - } - - Directory.Delete(dir.FullName); - } - } - - InitializeWaveformsAndSpectrogramsFolderEmpty(Configuration.Settings.Language.Settings); - } - - private void checkBoxRememberRecentFiles_CheckedChanged(object sender, EventArgs e) - { - checkBoxReopenLastOpened.Enabled = checkBoxRememberRecentFiles.Checked; - checkBoxRememberSelectedLine.Enabled = checkBoxRememberRecentFiles.Checked; - } - - private void buttonWaveformSelectedColor_Click(object sender, MouseEventArgs e) - { - colorDialogSSAStyle.Color = panelWaveformSelectedColor.BackColor; - if (colorDialogSSAStyle.ShowDialog() == DialogResult.OK) - { - panelWaveformSelectedColor.BackColor = colorDialogSSAStyle.Color; - } - } - - private void panelSubtitleFontColor_Click(object sender, EventArgs e) - { - colorDialogSSAStyle.Color = panelSubtitleFontColor.BackColor; - if (colorDialogSSAStyle.ShowDialog() == DialogResult.OK) - { - panelSubtitleFontColor.BackColor = colorDialogSSAStyle.Color; - } - } - - private void panelSubtitleBackgroundColor_Click(object sender, EventArgs e) - { - colorDialogSSAStyle.Color = panelSubtitleBackgroundColor.BackColor; - if (colorDialogSSAStyle.ShowDialog() == DialogResult.OK) - { - panelSubtitleBackgroundColor.BackColor = colorDialogSSAStyle.Color; - } - } - - private void treeViewShortcuts_AfterSelect(object sender, TreeViewEventArgs e) - { - if (e?.Node?.Nodes.Count == 0) - { - checkBoxShortcutsControl.Checked = false; - checkBoxShortcutsAlt.Checked = false; - checkBoxShortcutsShift.Checked = false; - - checkBoxShortcutsControl.Enabled = true; - checkBoxShortcutsAlt.Enabled = true; - checkBoxShortcutsShift.Enabled = true; - - comboBoxShortcutKey.SelectedIndex = 0; - - comboBoxShortcutKey.Enabled = true; - buttonUpdateShortcut.Enabled = true; - buttonClearShortcut.Enabled = true; - - string shortcut = GetShortcut(e.Node.Text); - - string[] parts = shortcut.ToLowerInvariant().Split(new[] { '+' }, StringSplitOptions.RemoveEmptyEntries); - foreach (string k in parts) - { - if (k.Equals("CONTROL", StringComparison.OrdinalIgnoreCase)) - { - checkBoxShortcutsControl.Checked = true; - } - else if (k.Equals("ALT", StringComparison.OrdinalIgnoreCase)) - { - checkBoxShortcutsAlt.Checked = true; - } - else if (k.Equals("SHIFT", StringComparison.OrdinalIgnoreCase)) - { - checkBoxShortcutsShift.Checked = true; - } - else - { - int i = 0; - foreach (string value in comboBoxShortcutKey.Items) - { - if (value.Equals(k, StringComparison.OrdinalIgnoreCase)) - { - comboBoxShortcutKey.SelectedIndex = i; - break; - } - i++; - } - } - } - } - } - - private static string GetShortcut(string text) - { - string shortcut = text.Substring(text.IndexOf('[')); - shortcut = shortcut.TrimEnd(']').TrimStart('['); - if (shortcut == Configuration.Settings.Language.General.None) - { - return string.Empty; - } - - return shortcut; - } - - private string GetCurrentShortcutText() - { - var sb = new StringBuilder(@"["); - if (checkBoxShortcutsControl.Checked) - { - sb.Append("Control+"); - } - - if (checkBoxShortcutsAlt.Checked) - { - sb.Append("Alt+"); - } - - if (checkBoxShortcutsShift.Checked) - { - sb.Append("Shift+"); - } - - sb.Append(comboBoxShortcutKey.Items[comboBoxShortcutKey.SelectedIndex]); - sb.Append(']'); - return sb.ToString(); - } - - private void buttonUpdateShortcut_Click(object sender, EventArgs e) - { - if (!IsShortcutValid()) - { - return; - } - - string text = treeViewShortcuts.SelectedNode.Text.Substring(0, treeViewShortcuts.SelectedNode.Text.IndexOf('[')).Trim(); - var shortcutText = GetCurrentShortcutText(); - var existsIn = new StringBuilder(); - var sh = (ShortcutHelper)treeViewShortcuts.SelectedNode.Tag; - foreach (ShortcutNode parent in _shortcuts.Nodes) - { - foreach (ShortcutNode subNode in parent.Nodes) - { - if (sh != null && subNode.Shortcut.Shortcut.Name == sh.Shortcut.Name) - { - subNode.Text = text + " " + shortcutText; - } - else if (subNode.Text.Contains(shortcutText) && treeViewShortcuts.SelectedNode.Text != subNode.Text) - { - existsIn.AppendLine(string.Format(Configuration.Settings.Language.Settings.ShortcutIsAlreadyDefinedX, parent.Text + " -> " + subNode.Text)); - } - } - } - if (existsIn.Length > 0 && comboBoxShortcutKey.SelectedIndex > 0) - { - if (MessageBox.Show(existsIn.ToString(), string.Empty, MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.Cancel) - { - return; - } - } - treeViewShortcuts.SelectedNode.Text = text + " " + shortcutText; - AddToSaveList((ShortcutHelper)treeViewShortcuts.SelectedNode.Tag, shortcutText); - treeViewShortcuts.Focus(); - } - - private void AddToSaveList(ShortcutHelper helper, string shortcutText) - { - if (_newShortcuts.ContainsKey(helper)) - { - _newShortcuts[helper] = GetShortcut(shortcutText); - } - else - { - _newShortcuts.Add(helper, GetShortcut(shortcutText)); - } - } - - private void buttonListViewSyntaxColorError_Click(object sender, EventArgs e) - { - colorDialogSSAStyle.Color = panelListViewSyntaxColorError.BackColor; - if (colorDialogSSAStyle.ShowDialog() == DialogResult.OK) - { - panelListViewSyntaxColorError.BackColor = colorDialogSSAStyle.Color; - } - } - - private void comboBoxShortcutKey_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Tab || - e.KeyCode == Keys.Down || - e.KeyCode == Keys.Up || - e.KeyCode == Keys.Enter || - e.KeyCode == Keys.None) - { - return; - } - - int i = 0; - foreach (var item in comboBoxShortcutKey.Items) - { - if (item.ToString() == e.KeyCode.ToString()) - { - comboBoxShortcutKey.SelectedIndex = i; - e.SuppressKeyPress = true; - return; - } - i++; - } - } - - private void numericUpDownSsaOutline_ValueChanged(object sender, EventArgs e) - { - UpdateSsaExample(); - } - - private void numericUpDownSsaShadow_ValueChanged(object sender, EventArgs e) - { - UpdateSsaExample(); - } - - private void checkBoxSsaOpaqueBox_CheckedChanged(object sender, EventArgs e) - { - numericUpDownSsaOutline.Enabled = !checkBoxSsaOpaqueBox.Checked; - numericUpDownSsaShadow.Enabled = !checkBoxSsaOpaqueBox.Checked; - UpdateSsaExample(); - } - - private void buttonBrowseToFFmpeg_Click(object sender, EventArgs e) - { - openFileDialogFFmpeg.FileName = string.Empty; - openFileDialogFFmpeg.Title = Configuration.Settings.Language.Settings.WaveformBrowseToFFmpeg; - if (Configuration.IsRunningOnWindows) - { - openFileDialogFFmpeg.Filter = "FFmpeg (ffmpeg.exe)|ffmpeg.exe"; - } - if (openFileDialogFFmpeg.ShowDialog(this) == DialogResult.OK) - { - textBoxFFmpegPath.Text = openFileDialogFFmpeg.FileName; - } - } - - private void checkBoxWaveformHoverFocus_CheckedChanged(object sender, EventArgs e) - { - checkBoxListViewMouseEnterFocus.Enabled = checkBoxWaveformHoverFocus.Checked; - } - - private void buttonVlcPathBrowse_Click(object sender, EventArgs e) - { - openFileDialogFFmpeg.FileName = string.Empty; - openFileDialogFFmpeg.Title = Configuration.Settings.Language.Settings.WaveformBrowseToVLC; - if (Configuration.IsRunningOnWindows) - { - openFileDialogFFmpeg.Filter = $"{Configuration.Settings.Language.Settings.VlcMediaPlayer} (vlc.exe)|vlc.exe"; - } - if (openFileDialogFFmpeg.ShowDialog(this) == DialogResult.OK) - { - EnableVlc(openFileDialogFFmpeg.FileName); - } - } - - private void EnableVlc(string fileName) - { - textBoxVlcPath.Text = Path.GetDirectoryName(fileName); - Configuration.Settings.General.VlcLocation = textBoxVlcPath.Text; - Configuration.Settings.General.VlcLocationRelative = GetRelativePath(textBoxVlcPath.Text); - radioButtonVideoPlayerVLC.Enabled = LibVlcDynamic.IsInstalled; - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - Configuration.Settings.General.VlcLocation = _oldVlcLocation; - Configuration.Settings.General.VlcLocationRelative = _oldVlcLocationRelative; - Configuration.Settings.Tools.ListViewShowColumnCharsPerSec = _oldListViewShowCps; - Configuration.Settings.Tools.ListViewShowColumnWordsPerMin = _oldListViewShowWpm; - - DialogResult = DialogResult.Cancel; - } - - private void buttonEditDoNotBreakAfterList_Click(object sender, EventArgs e) - { - using (var form = new DoNotBreakAfterListEdit()) - { - form.ShowDialog(this); - } - } - - private void linkLabelOpenDictionaryFolder_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) - { - string dictionaryFolder = Utilities.DictionaryFolder; - if (!Directory.Exists(dictionaryFolder)) - { - Directory.CreateDirectory(dictionaryFolder); - } - - UiUtil.OpenFolder(dictionaryFolder); - } - - private void textBoxVlcPath_MouseLeave(object sender, EventArgs e) - { - try - { - var path = textBoxVlcPath.Text.Trim('\"'); - if (path.Length > 3 && Path.IsPathRooted(path) && Path.GetFileName(path).Equals("vlc.exe", StringComparison.OrdinalIgnoreCase) && File.Exists(path)) - { - EnableVlc(path); - } - } - catch - { - // ignored - } - } - - private void buttonNetworkSessionNewMessageSound_Click(object sender, EventArgs e) - { - openFileDialogFFmpeg.FileName = string.Empty; - openFileDialogFFmpeg.Title = Configuration.Settings.Language.Settings.WaveformBrowseToFFmpeg; - openFileDialogFFmpeg.Filter = $"{Configuration.Settings.Language.General.AudioFiles} (*.wav)|*.wav"; - if (openFileDialogFFmpeg.ShowDialog(this) == DialogResult.OK) - { - textBoxNetworkSessionNewMessageSound.Text = openFileDialogFFmpeg.FileName; - } - } - - private void panelPrimaryColor_MouseClick(object sender, MouseEventArgs e) - { - colorDialogSSAStyle.Color = Color.FromArgb(_ssaFontColor); - if (colorDialogSSAStyle.ShowDialog() == DialogResult.OK) - { - _ssaFontColor = colorDialogSSAStyle.Color.ToArgb(); - panelPrimaryColor.BackColor = colorDialogSSAStyle.Color; - UpdateSsaExample(); - } - } - - private void numericUpDownSsaMarginVertical_ValueChanged(object sender, EventArgs e) - { - UpdateSsaExample(); - } - - private void comboBoxFontName_TextChanged(object sender, EventArgs e) - { - _ssaFontName = comboBoxFontName.Text; - UpdateSsaExample(); - } - - private void numericUpDownFontSize_ValueChanged(object sender, EventArgs e) - { - _ssaFontSize = (int)numericUpDownFontSize.Value; - UpdateSsaExample(); - } - - private void buttonSsaColor_Click(object sender, EventArgs e) - { - panelPrimaryColor_MouseClick(sender, null); - } - - private void checkBoxSsaFontBold_CheckedChanged(object sender, EventArgs e) - { - UpdateSsaExample(); - } - - private void buttonMpvSettings_Click(object sender, EventArgs e) - { - using (var form = new SettingsMpv(LibMpvDynamic.IsInstalled)) - { - var oldMpvEnabled = radioButtonVideoPlayerMPV.Enabled; - if (form.ShowDialog(this) == DialogResult.OK) - { - RefreshMpvSettings(); - if (radioButtonVideoPlayerMPV.Enabled && !oldMpvEnabled) - { - radioButtonVideoPlayerMPV.Checked = true; - } - } - else - { - RefreshMpvSettings(); - } - } - } - - private void RefreshMpvSettings() - { - radioButtonVideoPlayerMPV.Enabled = LibMpvDynamic.IsInstalled; - checkBoxMpvHandlesPreviewText.Enabled = radioButtonVideoPlayerMPV.Enabled; - if (!radioButtonVideoPlayerMPV.Enabled) - { - buttonMpvSettings.Font = new Font(buttonMpvSettings.Font.FontFamily, buttonMpvSettings.Font.Size, FontStyle.Bold); - } - - labelMpvSettings.Text = "--vo=" + Configuration.Settings.General.MpvVideoOutputWindows; - } - - private void linkLabelBingSubscribe_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) - { - UiUtil.OpenURL(MicrosoftTranslator.SignUpUrl); - } - - private void ValidateShortcut(object sender, EventArgs e) - { - buttonUpdateShortcut.Enabled = IsShortcutValid(); - } - - private bool IsShortcutValid() - { - if (treeViewShortcuts.SelectedNode == null || !treeViewShortcuts.SelectedNode.Text.Contains('[')) - { - return false; - } - - var shortcutText = GetCurrentShortcutText(); - if (shortcutText == "[CapsLock]" || shortcutText.Length < 3 || shortcutText.EndsWith("+]")) - { - return false; - } - - if (comboBoxShortcutKey.SelectedIndex == 0 && !checkBoxShortcutsControl.Checked && !checkBoxShortcutsAlt.Checked && !checkBoxShortcutsShift.Checked) - { - return true; - } - - var helper = (ShortcutHelper)treeViewShortcuts.SelectedNode.Tag; - if (helper.IsMenuItem) - { - try - { - new ToolStripMenuItem().ShortcutKeys = UiUtil.GetKeys(GetShortcut(shortcutText)); - } - catch (InvalidEnumArgumentException) - { - return false; - } - } - return true; - } - - private void numericUpDownMaxNumberOfLines_ValueChanged(object sender, EventArgs e) - { - checkBoxSyntaxColorTextMoreThanTwoLines.Text = string.Format(Configuration.Settings.Language.Settings.SyntaxColorTextMoreThanMaxLines, numericUpDownMaxNumberOfLines.Value); - ProfileUiValueChanged(sender, e); - } - - private void radioButtonVideoPlayerMPV_CheckedChanged(object sender, EventArgs e) - { - checkBoxMpvHandlesPreviewText.Enabled = radioButtonVideoPlayerMPV.Checked; - } - - private void buttonClearShortcut_Click(object sender, EventArgs e) - { - checkBoxShortcutsControl.Checked = false; - checkBoxShortcutsAlt.Checked = false; - checkBoxShortcutsShift.Checked = false; - comboBoxShortcutKey.SelectedIndex = 0; - buttonUpdateShortcut_Click(null, null); - } - - private void buttonDownloadFfmpeg_Click(object sender, EventArgs e) - { - using (var form = new DownloadFfmpeg()) - { - if (form.ShowDialog(this) == DialogResult.OK && !string.IsNullOrEmpty(form.FFmpegPath)) - { - textBoxFFmpegPath.Text = form.FFmpegPath; - } - } - } - - private void textBoxShortcutSearch_TextChanged(object sender, EventArgs e) - { - var selected = treeViewShortcuts.SelectedNode?.Tag as ShortcutHelper; - var oldControl = checkBoxShortcutsControl.Checked; - var oldAlt = checkBoxShortcutsAlt.Checked; - var oldShift = checkBoxShortcutsShift.Checked; - var oldKeyIndex = comboBoxShortcutKey.SelectedIndex; - ShowShortcutsTreeView(); - buttonShortcutsClear.Enabled = textBoxShortcutSearch.Text.Length > 0; - if (selected != null) - { - foreach (TreeNode parentNode in treeViewShortcuts.Nodes) - { - foreach (TreeNode node in parentNode.Nodes) - { - if (node.Tag is ShortcutHelper sh && sh.Shortcut.Name == selected.Shortcut.Name) - { - treeViewShortcuts.SelectedNode = node; - checkBoxShortcutsControl.Checked = oldControl; - checkBoxShortcutsAlt.Checked = oldAlt; - checkBoxShortcutsShift.Checked = oldShift; - comboBoxShortcutKey.SelectedIndex = oldKeyIndex; - return; - } - } - } - } - comboBoxShortcutKey.Enabled = false; - buttonUpdateShortcut.Enabled = false; - buttonClearShortcut.Enabled = false; - } - - private void buttonShortcutsClear_Click(object sender, EventArgs e) - { - textBoxShortcutSearch.Text = string.Empty; - } - - private void linkLabelGoogleTranslateSignUp_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) - { - UiUtil.OpenURL("https://www.google.com/search?q=google+cloud+get+api+key"); - } - - private void buttonEditProfile_Click(object sender, EventArgs e) - { - using (var form = new SettingsProfile(_rulesProfiles, comboBoxRulesProfileName.Text)) - { - if (form.ShowDialog(this) == DialogResult.OK) - { - _rulesProfiles = form.RulesProfiles; - UpdateProfileNames(_rulesProfiles); - } - } - } - - private bool _editProfileOn; - private void comboBoxRulesProfileName_SelectedIndexChanged(object sender, EventArgs e) - { - _editProfileOn = true; - var profile = _rulesProfiles.First(p => p.Name == comboBoxRulesProfileName.Text); - numericUpDownSubtitleLineMaximumLength.Value = profile.SubtitleLineMaximumLength; - numericUpDownOptimalCharsSec.Value = profile.SubtitleOptimalCharactersPerSeconds; - numericUpDownMaxCharsSec.Value = profile.SubtitleMaximumCharactersPerSeconds; - numericUpDownMaxWordsMin.Value = profile.SubtitleMaximumWordsPerMinute; - numericUpDownDurationMin.Value = profile.SubtitleMinimumDisplayMilliseconds; - numericUpDownDurationMax.Value = profile.SubtitleMaximumDisplayMilliseconds; - if (profile.MinimumMillisecondsBetweenLines >= numericUpDownMinGapMs.Minimum && - profile.MinimumMillisecondsBetweenLines <= numericUpDownMinGapMs.Maximum) - { - numericUpDownMinGapMs.Value = profile.MinimumMillisecondsBetweenLines; - } - if (profile.MaxNumberOfLines >= numericUpDownMaxNumberOfLines.Minimum && - profile.MaxNumberOfLines <= numericUpDownMaxNumberOfLines.Maximum) - { - numericUpDownMaxNumberOfLines.Value = profile.MaxNumberOfLines; - } - else - { - numericUpDownMaxNumberOfLines.Value = numericUpDownMaxNumberOfLines.Minimum; - } - - if (profile.MergeLinesShorterThan >= 5 && profile.MergeLinesShorterThan - 5 < comboBoxMergeShortLineLength.Items.Count) - { - comboBoxMergeShortLineLength.SelectedIndex = profile.MergeLinesShorterThan - 5; - } - else - { - comboBoxMergeShortLineLength.SelectedIndex = 0; - } - - SetDialogStyle(profile.DialogStyle); - SetContinuationStyle(profile.ContinuationStyle); - - checkBoxCpsIncludeWhiteSpace.Checked = profile.CpsIncludesSpace; - _oldProfileId = profile.Id; - _editProfileOn = false; - } - - private void ProfileUiValueChanged(object sender, EventArgs e) - { - var idx = comboBoxRulesProfileName.SelectedIndex; - if (idx < 0 || _editProfileOn || idx >= _rulesProfiles.Count) - { - return; - } - _rulesProfiles[idx].SubtitleLineMaximumLength = (int)numericUpDownSubtitleLineMaximumLength.Value; - _rulesProfiles[idx].SubtitleOptimalCharactersPerSeconds = numericUpDownOptimalCharsSec.Value; - _rulesProfiles[idx].SubtitleMaximumCharactersPerSeconds = numericUpDownMaxCharsSec.Value; - _rulesProfiles[idx].SubtitleMinimumDisplayMilliseconds = (int)numericUpDownDurationMin.Value; - _rulesProfiles[idx].SubtitleMaximumDisplayMilliseconds = (int)numericUpDownDurationMax.Value; - _rulesProfiles[idx].MinimumMillisecondsBetweenLines = (int)numericUpDownMinGapMs.Value; - _rulesProfiles[idx].MaxNumberOfLines = (int)numericUpDownMaxNumberOfLines.Value; - _rulesProfiles[idx].SubtitleMaximumWordsPerMinute = (int)numericUpDownMaxWordsMin.Value; - _rulesProfiles[idx].CpsIncludesSpace = checkBoxCpsIncludeWhiteSpace.Checked; - _rulesProfiles[idx].MergeLinesShorterThan = comboBoxMergeShortLineLength.SelectedIndex + 5; - _rulesProfiles[idx].DialogStyle = DialogSplitMerge.GetDialogStyleFromIndex(comboBoxDialogStyle.SelectedIndex); - _rulesProfiles[idx].ContinuationStyle = ContinuationUtilities.GetContinuationStyleFromIndex(comboBoxContinuationStyle.SelectedIndex); - - toolTipContinuationPreview.RemoveAll(); - toolTipContinuationPreview.SetToolTip(comboBoxContinuationStyle, ContinuationUtilities.GetContinuationStylePreview(_rulesProfiles[idx].ContinuationStyle)); - } - - private void checkBoxToolsBreakByPixelWidth_CheckedChanged(object sender, EventArgs e) - { - checkBoxToolsBreakPreferBottomHeavy.Enabled = checkBoxToolsBreakByPixelWidth.Checked; - numericUpDownToolsBreakPreferBottomHeavy.Enabled = checkBoxToolsBreakByPixelWidth.Checked; - } - - private void buttonReset_Click(object sender, EventArgs e) - { - var result = MessageBox.Show(Configuration.Settings.Language.Settings.RestoreDefaultSettingsMsg, Configuration.Settings.Language.General.Title, MessageBoxButtons.YesNo); - if (result == DialogResult.Yes) - { - Configuration.Settings.Reset(); - Configuration.Settings.General.VideoPlayer = "MPV"; - Init(); - } - } - - private void toolStripMenuItemShortcutsCollapse_Click(object sender, EventArgs e) - { - treeViewShortcuts.CollapseAll(); - } - - private void listBoxNames_DoubleClick(object sender, EventArgs e) - { - var idx = listBoxNames.SelectedIndex; - if (idx >= 0) - { - textBoxNameEtc.Text = (string)listBoxNames.Items[idx]; - } - } - - private void listBoxUserWordLists_DoubleClick(object sender, EventArgs e) - { - var idx = listBoxUserWordLists.SelectedIndex; - if (idx >= 0) - { - textBoxUserWord.Text = (string)listBoxUserWordLists.Items[idx]; - } - } - - private void listBoxOcrFixList_DoubleClick(object sender, EventArgs e) - { - var idx = listBoxOcrFixList.SelectedIndex; - if (idx >= 0) - { - var text = (string)listBoxOcrFixList.Items[idx]; - var splitIdx = text.IndexOf(" --> ", StringComparison.Ordinal); - if (splitIdx > 0) - { - textBoxOcrFixKey.Text = text.Substring(0, splitIdx); - textBoxOcrFixValue.Text = text.Remove(0, splitIdx + " --> ".Length); - } - } - } - - private void buttonLineWidthSettings_Click(object sender, EventArgs e) - { - using (var form = new SettingsLineWidth()) - { - if (form.ShowDialog(this) == DialogResult.OK) - { - // Saving settings handled by dialog - } - } - } - - private void buttonFixContinuationStyleSettings_Click(object sender, EventArgs e) - { - using (var form = new SettingsFixContinuationStyle()) - { - if (form.ShowDialog(this) == DialogResult.OK) - { - // Saving settings handled by dialog - } - } - } - - private void buttonGapChoose_Click(object sender, EventArgs e) - { - using (var form = new SettingsGapChoose()) - { - if (form.ShowDialog(this) == DialogResult.OK) - { - numericUpDownMinGapMs.Value = form.MinGapMs; - } - } - } - - private void importShortcutsToolStripMenuItem_Click(object sender, EventArgs e) - { - openFileDialogFFmpeg.Title = null; - openFileDialogFFmpeg.Filter = "Xml files|*.xml"; - openFileDialogFFmpeg.FileName = "SE_Shortcuts"; - if (openFileDialogFFmpeg.ShowDialog(this) != DialogResult.OK) - { - return; - } - - try - { - Configuration.Settings.Shortcuts = Shortcuts.Load(openFileDialogFFmpeg.FileName); - textBoxShortcutSearch.Text = string.Empty; - MakeShortcutsTreeView(Configuration.Settings.Language.Settings); - ShowShortcutsTreeView(); - } - catch (Exception exception) - { - MessageBox.Show("Shortcuts not imported!" + Environment.NewLine + Environment.NewLine + - exception.Message + Environment.NewLine + - exception.StackTrace); - SeLogger.Error(exception, "Failed to import shortcuts"); - } - } - - private void exportShortcutsToolStripMenuItem_Click(object sender, EventArgs e) - { - saveFileDialog1.Filter = "Xml files|*.xml"; - saveFileDialog1.FileName = "SE_Shortcuts"; - if (saveFileDialog1.ShowDialog(this) != DialogResult.OK) - { - return; - } - - try - { - var shortcuts = Configuration.Settings.Shortcuts.Clone(); - foreach (var kvp in _newShortcuts) - { - kvp.Key.Shortcut.SetValue(shortcuts, kvp.Value, null); - } - - Shortcuts.Save(saveFileDialog1.FileName, shortcuts); - } - catch (Exception exception) - { - MessageBox.Show(exception.Message + Environment.NewLine + - exception.StackTrace); - SeLogger.Error(exception, "Failed to export shortcuts"); - } - } - - private void pictureBoxPreview_Click(object sender, EventArgs e) - { - _backgroundImageDark = !_backgroundImageDark; - GeneratePreviewReal(); - } - - private void buttonTextBoxHtmlColor_Click(object sender, EventArgs e) - { - colorDialogSSAStyle.Color = panelTextBoxHtmlColor.BackColor; - if (colorDialogSSAStyle.ShowDialog() == DialogResult.OK) - { - panelTextBoxHtmlColor.BackColor = colorDialogSSAStyle.Color; - } - } - - private void buttonTextBoxAssColor_Click(object sender, EventArgs e) - { - colorDialogSSAStyle.Color = panelTextBoxAssColor.BackColor; - if (colorDialogSSAStyle.ShowDialog() == DialogResult.OK) - { - panelTextBoxAssColor.BackColor = colorDialogSSAStyle.Color; - } - } - - private void checkBoxSubtitleTextBoxSyntaxColor_CheckedChanged(object sender, EventArgs e) - { - buttonTextBoxHtmlColor.Enabled = checkBoxSubtitleTextBoxSyntaxColor.Checked; - panelTextBoxHtmlColor.Enabled = checkBoxSubtitleTextBoxSyntaxColor.Checked; - buttonTextBoxAssColor.Enabled = checkBoxSubtitleTextBoxSyntaxColor.Checked; - panelTextBoxAssColor.Enabled = checkBoxSubtitleTextBoxSyntaxColor.Checked; - } - - private void panelTextBoxHtmlColor_MouseClick(object sender, MouseEventArgs e) - { - buttonTextBoxHtmlColor_Click(null, null); - } - - private void panelTextBoxAssColor_MouseClick(object sender, MouseEventArgs e) - { - buttonTextBoxAssColor_Click(null, null); - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.Dictionaries; +using Nikse.SubtitleEdit.Core.Enums; +using Nikse.SubtitleEdit.Core.Translate; +using Nikse.SubtitleEdit.Logic; +using Nikse.SubtitleEdit.Logic.VideoPlayers; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class Settings : PositionAndSizeForm + { + private string _ssaFontName; + private double _ssaFontSize; + private int _ssaFontColor; + private string _listBoxSearchString = string.Empty; + private DateTime _listBoxSearchStringLastUsed = DateTime.Now; + private List _wordListNames = new List(); + private List _userWordList = new List(); + private OcrFixReplaceList _ocrFixReplaceList; + private string _oldVlcLocation; + private string _oldVlcLocationRelative; + private bool _oldListViewShowCps; + private bool _oldListViewShowWpm; + private readonly Dictionary _newShortcuts = new Dictionary(); + private List _rulesProfiles; + private bool _loading = true; + private bool _backgroundImageDark; + + private class ComboBoxLanguage + { + public CultureInfo CultureInfo { get; set; } + public override string ToString() + { + return CultureInfo.NativeName.CapitalizeFirstLetter(); + } + } + + public class ShortcutNode + { + public string Text { get; set; } + public string ShortcutText { get; set; } + public ShortcutHelper Shortcut { get; set; } + public List Nodes { get; set; } + + public ShortcutNode() + { + Nodes = new List(); + } + + public ShortcutNode(string text) + { + Text = text; + Nodes = new List(); + } + } + + public class ShortcutHelper + { + public ShortcutHelper(PropertyInfo shortcut, bool isMenuItem) + { + Shortcut = shortcut; + IsMenuItem = isMenuItem; + } + + public PropertyInfo Shortcut { get; set; } + public bool IsMenuItem { get; set; } + } + + private static string GetRelativePath(string fileName) + { + string folder = Configuration.BaseDirectory; + + if (string.IsNullOrEmpty(fileName) || !fileName.StartsWith(folder.Substring(0, 2), StringComparison.OrdinalIgnoreCase)) + { + return string.Empty; + } + + var pathUri = new Uri(fileName); + if (!folder.EndsWith(Path.DirectorySeparatorChar)) + { + folder += Path.DirectorySeparatorChar; + } + + var folderUri = new Uri(folder); + return Uri.UnescapeDataString(folderUri.MakeRelativeUri(pathUri).ToString().Replace('/', Path.DirectorySeparatorChar)); + } + + public Settings() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + UiUtil.FixLargeFonts(this, buttonOK); + Init(); + } + + public void Init() + { + _loading = true; + labelStatus.Text = string.Empty; + _rulesProfiles = new List(Configuration.Settings.General.Profiles); + var gs = Configuration.Settings.General; + + checkBoxToolbarNew.Checked = gs.ShowToolbarNew; + checkBoxToolbarOpen.Checked = gs.ShowToolbarOpen; + checkBoxToolbarSave.Checked = gs.ShowToolbarSave; + checkBoxToolbarSaveAs.Checked = gs.ShowToolbarSaveAs; + checkBoxToolbarFind.Checked = gs.ShowToolbarFind; + checkBoxReplace.Checked = gs.ShowToolbarReplace; + checkBoxTBFixCommonErrors.Checked = gs.ShowToolbarFixCommonErrors; + checkBoxTBRemoveTextForHi.Checked = gs.ShowToolbarRemoveTextForHi; + checkBoxVisualSync.Checked = gs.ShowToolbarVisualSync; + checkBoxSettings.Checked = gs.ShowToolbarSettings; + checkBoxSpellCheck.Checked = gs.ShowToolbarSpellCheck; + checkBoxNetflixQualityCheck.Checked = gs.ShowToolbarNetflixGlyphCheck; + checkBoxHelp.Checked = gs.ShowToolbarHelp; + + comboBoxFrameRate.Items.Clear(); + comboBoxFrameRate.Items.Add(23.976.ToString(CultureInfo.CurrentCulture)); + comboBoxFrameRate.Items.Add(24.0.ToString(CultureInfo.CurrentCulture)); + comboBoxFrameRate.Items.Add(25.0.ToString(CultureInfo.CurrentCulture)); + comboBoxFrameRate.Items.Add(29.97.ToString(CultureInfo.CurrentCulture)); + comboBoxFrameRate.Items.Add(30.00.ToString(CultureInfo.CurrentCulture)); + comboBoxFrameRate.Items.Add(50.00.ToString(CultureInfo.CurrentCulture)); + comboBoxFrameRate.Items.Add(59.94.ToString(CultureInfo.CurrentCulture)); + comboBoxFrameRate.Items.Add(60.00.ToString(CultureInfo.CurrentCulture)); + + checkBoxShowFrameRate.Checked = gs.ShowFrameRate; + comboBoxFrameRate.Text = gs.DefaultFrameRate.ToString(CultureInfo.CurrentCulture); + + UiUtil.InitializeTextEncodingComboBox(comboBoxEncoding); + + checkBoxAutoDetectAnsiEncoding.Checked = gs.AutoGuessAnsiEncoding; + comboBoxSubtitleFontSize.Text = gs.SubtitleTextBoxFontSize.ToString(CultureInfo.InvariantCulture); + comboBoxSubtitleListViewFontSize.Text = gs.SubtitleListViewFontSize.ToString(CultureInfo.InvariantCulture); + checkBoxSubtitleFontBold.Checked = gs.SubtitleTextBoxFontBold; + checkBoxSubtitleTextBoxSyntaxColor.Checked = gs.SubtitleTextBoxSyntaxColor; + panelTextBoxHtmlColor.BackColor = gs.SubtitleTextBoxHtmlColor; + panelTextBoxAssColor.BackColor = gs.SubtitleTextBoxAssColor; + checkBoxSubtitleListViewFontBold.Checked = gs.SubtitleListViewFontBold; + checkBoxSubtitleCenter.Checked = gs.CenterSubtitleInTextBox; + panelSubtitleFontColor.BackColor = gs.SubtitleFontColor; + panelSubtitleBackgroundColor.BackColor = gs.SubtitleBackgroundColor; + checkBoxRememberRecentFiles.Checked = gs.ShowRecentFiles; + checkBoxRememberRecentFiles_CheckedChanged(null, null); + checkBoxRememberSelectedLine.Checked = gs.RememberSelectedLine; + checkBoxReopenLastOpened.Checked = gs.StartLoadLastFile; + checkBoxStartInSourceView.Checked = gs.StartInSourceView; + checkBoxRemoveBlankLinesWhenOpening.Checked = gs.RemoveBlankLinesWhenOpening; + checkBoxRememberWindowPosition.Checked = gs.StartRememberPositionAndSize; + numericUpDownSubtitleLineMaximumLength.Value = gs.SubtitleLineMaximumLength; + numericUpDownOptimalCharsSec.Value = (decimal)gs.SubtitleOptimalCharactersPerSeconds; + numericUpDownMaxCharsSec.Value = (decimal)gs.SubtitleMaximumCharactersPerSeconds; + numericUpDownMaxWordsMin.Value = (decimal)gs.SubtitleMaximumWordsPerMinute; + checkBoxAutoWrapWhileTyping.Checked = gs.AutoWrapLineWhileTyping; + textBoxShowLineBreaksAs.Text = gs.ListViewLineSeparatorString; + + numericUpDownDurationMin.Value = gs.SubtitleMinimumDisplayMilliseconds; + numericUpDownDurationMax.Value = gs.SubtitleMaximumDisplayMilliseconds; + + if (gs.MinimumMillisecondsBetweenLines >= numericUpDownMinGapMs.Minimum && + gs.MinimumMillisecondsBetweenLines <= numericUpDownMinGapMs.Maximum) + { + numericUpDownMinGapMs.Value = gs.MinimumMillisecondsBetweenLines; + } + + if (gs.VideoPlayer.Trim().Equals("VLC", StringComparison.OrdinalIgnoreCase) && LibVlcDynamic.IsInstalled) + { + radioButtonVideoPlayerVLC.Checked = true; + } + else if (gs.VideoPlayer.Trim().Equals("MPV", StringComparison.OrdinalIgnoreCase) && LibMpvDynamic.IsInstalled) + { + radioButtonVideoPlayerMPV.Checked = true; + } + else if (gs.VideoPlayer.Trim().Equals("MPC-HC", StringComparison.OrdinalIgnoreCase) && UiUtil.IsMpcHcInstalled) + { + radioButtonVideoPlayerMpcHc.Checked = true; + } + else if (UiUtil.IsQuartsDllInstalled) + { + radioButtonVideoPlayerDirectShow.Checked = true; + } + else if (LibMpvDynamic.IsInstalled) + { + radioButtonVideoPlayerMPV.Checked = true; + } + else if (LibVlcDynamic.IsInstalled) + { + radioButtonVideoPlayerVLC.Checked = true; + } + + if (!LibVlcDynamic.IsInstalled) + { + radioButtonVideoPlayerVLC.Enabled = false; + } + + if (!UiUtil.IsQuartsDllInstalled) + { + radioButtonVideoPlayerDirectShow.Enabled = false; + } + + if (Logic.VideoPlayers.MpcHC.MpcHc.GetMpcHcFileName() == null) + { + radioButtonVideoPlayerMpcHc.Enabled = false; + } + + RefreshMpvSettings(); + buttonMpvSettings.Text = Configuration.Settings.Language.SettingsMpv.DownloadMpv; + checkBoxMpvHandlesPreviewText.Checked = gs.MpvHandlesPreviewText; + + textBoxVlcPath.Text = gs.VlcLocation; + textBoxVlcPath.Left = labelVideoPlayerVLC.Left + labelVideoPlayerVLC.Width + 5; + textBoxVlcPath.Width = buttonVlcPathBrowse.Left - textBoxVlcPath.Left - 5; + + labelVlcPath.Text = Configuration.Settings.Language.Settings.VlcBrowseToLabel; + + checkBoxVideoPlayerShowStopButton.Checked = gs.VideoPlayerShowStopButton; + checkBoxVideoPlayerShowMuteButton.Checked = gs.VideoPlayerShowMuteButton; + checkBoxVideoPlayerShowFullscreenButton.Checked = gs.VideoPlayerShowFullscreenButton; + + int videoPlayerPreviewFontSizeIndex = gs.VideoPlayerPreviewFontSize - int.Parse(comboBoxlVideoPlayerPreviewFontSize.Items[0].ToString()); + if (videoPlayerPreviewFontSizeIndex >= 0 && videoPlayerPreviewFontSizeIndex < comboBoxlVideoPlayerPreviewFontSize.Items.Count) + { + comboBoxlVideoPlayerPreviewFontSize.SelectedIndex = videoPlayerPreviewFontSizeIndex; + } + else + { + comboBoxlVideoPlayerPreviewFontSize.SelectedIndex = 3; + } + + checkBoxVideoPlayerPreviewFontBold.Checked = gs.VideoPlayerPreviewFontBold; + + checkBoxVideoAutoOpen.Checked = !gs.DisableVideoAutoLoading; + checkBoxAllowVolumeBoost.Checked = gs.AllowVolumeBoost; + + comboBoxCustomSearch1.Text = Configuration.Settings.VideoControls.CustomSearchText1; + comboBoxCustomSearch2.Text = Configuration.Settings.VideoControls.CustomSearchText2; + comboBoxCustomSearch3.Text = Configuration.Settings.VideoControls.CustomSearchText3; + comboBoxCustomSearch4.Text = Configuration.Settings.VideoControls.CustomSearchText4; + comboBoxCustomSearch5.Text = Configuration.Settings.VideoControls.CustomSearchText5; + textBoxCustomSearchUrl1.Text = Configuration.Settings.VideoControls.CustomSearchUrl1; + textBoxCustomSearchUrl2.Text = Configuration.Settings.VideoControls.CustomSearchUrl2; + textBoxCustomSearchUrl3.Text = Configuration.Settings.VideoControls.CustomSearchUrl3; + textBoxCustomSearchUrl4.Text = Configuration.Settings.VideoControls.CustomSearchUrl4; + textBoxCustomSearchUrl5.Text = Configuration.Settings.VideoControls.CustomSearchUrl5; + + comboBoxFontName.BeginUpdate(); + comboBoxSubtitleFont.BeginUpdate(); + comboBoxFontName.Items.Clear(); + comboBoxSubtitleFont.Items.Clear(); + var comboBoxFontNameList = new List(); + var comboBoxSubtitleFontList = new List(); + var comboBoxSubtitleFontIndex = 0; + foreach (var x in FontFamily.Families.OrderBy(p => p.Name)) + { + comboBoxFontNameList.Add(x.Name); + if (x.IsStyleAvailable(FontStyle.Regular) && x.IsStyleAvailable(FontStyle.Bold)) + { + comboBoxSubtitleFontList.Add(x.Name); + if (x.Name.Equals(gs.SubtitleFontName, StringComparison.OrdinalIgnoreCase)) + { + comboBoxSubtitleFontIndex = comboBoxSubtitleFontList.Count - 1; + } + } + } + comboBoxFontName.Items.AddRange(comboBoxFontNameList.ToArray()); + comboBoxSubtitleFont.Items.AddRange(comboBoxSubtitleFontList.ToArray()); + comboBoxSubtitleFont.SelectedIndex = comboBoxSubtitleFontIndex; + comboBoxFontName.EndUpdate(); + comboBoxSubtitleFont.EndUpdate(); + + var wordListSettings = Configuration.Settings.WordLists; + checkBoxNamesOnline.Checked = wordListSettings.UseOnlineNames; + textBoxNamesOnline.Text = wordListSettings.NamesUrl; + + var ssa = Configuration.Settings.SubtitleSettings; + _ssaFontName = ssa.SsaFontName; + _ssaFontSize = ssa.SsaFontSize; + _ssaFontColor = ssa.SsaFontColorArgb; + if (ssa.SsaOutline >= numericUpDownSsaOutline.Minimum && ssa.SsaOutline <= numericUpDownSsaOutline.Maximum) + { + numericUpDownSsaOutline.Value = ssa.SsaOutline; + } + + if (ssa.SsaShadow >= numericUpDownSsaShadow.Minimum && ssa.SsaShadow <= numericUpDownSsaShadow.Maximum) + { + numericUpDownSsaShadow.Value = ssa.SsaShadow; + } + + numericUpDownSsaMarginLeft.Value = ssa.SsaMarginLeft; + numericUpDownSsaMarginRight.Value = ssa.SsaMarginRight; + numericUpDownSsaMarginVertical.Value = ssa.SsaMarginTopBottom; + checkBoxSsaFontBold.Checked = ssa.SsaFontBold; + checkBoxSsaOpaqueBox.Checked = ssa.SsaOpaqueBox; + numericUpDownFontSize.Value = (decimal)ssa.SsaFontSize; + comboBoxFontName.Text = ssa.SsaFontName; + panelPrimaryColor.BackColor = Color.FromArgb(_ssaFontColor); + + var proxy = Configuration.Settings.Proxy; + textBoxProxyAddress.Text = proxy.ProxyAddress; + textBoxProxyUserName.Text = proxy.UserName; + textBoxProxyPassword.Text = proxy.Password == null ? string.Empty : proxy.DecodePassword(); + textBoxProxyDomain.Text = proxy.Domain; + + textBoxNetworkSessionNewMessageSound.Text = Configuration.Settings.NetworkSettings.NewMessageSound; + + checkBoxSyntaxColorDurationTooSmall.Checked = Configuration.Settings.Tools.ListViewSyntaxColorDurationSmall; + checkBoxSyntaxColorDurationTooLarge.Checked = Configuration.Settings.Tools.ListViewSyntaxColorDurationBig; + checkBoxSyntaxColorTextTooLong.Checked = Configuration.Settings.Tools.ListViewSyntaxColorLongLines; + checkBoxSyntaxColorTextTooWide.Checked = Configuration.Settings.Tools.ListViewSyntaxColorWideLines; + checkBoxSyntaxColorTextMoreThanTwoLines.Checked = Configuration.Settings.Tools.ListViewSyntaxMoreThanXLines; + if (Configuration.Settings.General.MaxNumberOfLines >= numericUpDownMaxNumberOfLines.Minimum && + Configuration.Settings.General.MaxNumberOfLines <= numericUpDownMaxNumberOfLines.Maximum) + { + numericUpDownMaxNumberOfLines.Value = Configuration.Settings.General.MaxNumberOfLines; + } + checkBoxSyntaxOverlap.Checked = Configuration.Settings.Tools.ListViewSyntaxColorOverlap; + checkBoxSyntaxColorGapTooSmall.Checked = Configuration.Settings.Tools.ListViewSyntaxColorGap; + panelListViewSyntaxColorError.BackColor = Configuration.Settings.Tools.ListViewSyntaxErrorColor; + + // Language + var language = Configuration.Settings.Language.Settings; + Text = language.Title; + tabPageGeneral.Text = language.General; + tabPageVideoPlayer.Text = language.VideoPlayer; + tabPageWaveform.Text = language.WaveformAndSpectrogram; + tabPageWordLists.Text = language.WordLists; + tabPageTools.Text = language.Tools; + tabPageSsaStyle.Text = language.SsaStyle; + tabPageNetwork.Text = language.Network; + tabPageToolBar.Text = language.Toolbar; + tabPageFont.Text = Configuration.Settings.Language.DCinemaProperties.Font; + tabPageShortcuts.Text = language.Shortcuts; + tabPageSyntaxColoring.Text = language.SyntaxColoring; + groupBoxShowToolBarButtons.Text = language.ShowToolBarButtons; + labelTBNew.Text = language.New; + labelTBOpen.Text = language.Open; + labelTBSave.Text = language.Save; + labelTBSaveAs.Text = language.SaveAs; + labelTBFind.Text = language.Find; + labelTBReplace.Text = language.Replace; + labelTBFixCommonErrors.Text = language.FixCommonerrors; + labelTBRemoveTextForHi.Text = language.RemoveTextForHi; + labelTBVisualSync.Text = language.VisualSync; + labelTBSpellCheck.Text = language.SpellCheck; + labelTBNetflixQualityCheck.Text = language.NetflixQualityCheck; + labelTBSettings.Text = language.SettingsName; + labelTBHelp.Text = language.Help; + checkBoxToolbarNew.Text = Configuration.Settings.Language.General.Visible; + checkBoxToolbarOpen.Text = Configuration.Settings.Language.General.Visible; + checkBoxToolbarSave.Text = Configuration.Settings.Language.General.Visible; + checkBoxToolbarSaveAs.Text = Configuration.Settings.Language.General.Visible; + checkBoxToolbarFind.Text = Configuration.Settings.Language.General.Visible; + checkBoxReplace.Text = Configuration.Settings.Language.General.Visible; + checkBoxTBFixCommonErrors.Text = Configuration.Settings.Language.General.Visible; + checkBoxTBRemoveTextForHi.Text = Configuration.Settings.Language.General.Visible; + checkBoxVisualSync.Text = Configuration.Settings.Language.General.Visible; + checkBoxSpellCheck.Text = Configuration.Settings.Language.General.Visible; + checkBoxNetflixQualityCheck.Text = Configuration.Settings.Language.General.Visible; + checkBoxSettings.Text = Configuration.Settings.Language.General.Visible; + checkBoxHelp.Text = Configuration.Settings.Language.General.Visible; + + groupBoxMiscellaneous.Text = language.General; + groupBoxGeneralRules.Text = language.Rules; + labelRulesProfileName.Text = language.Profile; + checkBoxShowFrameRate.Text = language.ShowFrameRate; + labelDefaultFrameRate.Text = language.DefaultFrameRate; + labelDefaultFileEncoding.Text = language.DefaultFileEncoding; + labelAutoDetectAnsiEncoding.Text = language.AutoDetectAnsiEncoding; + labelSubMaxLen.Text = language.SubtitleLineMaximumLength; + labelOptimalCharsPerSecond.Text = language.OptimalCharactersPerSecond; + labelMaxCharsPerSecond.Text = language.MaximumCharactersPerSecond; + labelMaxWordsPerMin.Text = language.MaximumWordssPerMinute; + checkBoxAutoWrapWhileTyping.Text = language.AutoWrapWhileTyping; + groupBoxFont.Text = language.FontInUi; + groupBoxFontGeneral.Text = language.General; + groupBoxFontListViews.Text = language.ListView; + groupBoxFontTextBox.Text = language.TextBox; + labelFontNote.Text = language.FontNote; + labelMinDuration.Text = language.DurationMinimumMilliseconds; + labelMaxDuration.Text = language.DurationMaximumMilliseconds; + labelMinGapMs.Text = language.MinimumGapMilliseconds; + buttonGapChoose.Left = numericUpDownMinGapMs.Left + numericUpDownMinGapMs.Width + 5; + labelMaxLines.Text = language.MaximumLines; + if (labelSubMaxLen.Left + labelSubMaxLen.Width > numericUpDownSubtitleLineMaximumLength.Left) + { + numericUpDownSubtitleLineMaximumLength.Left = labelSubMaxLen.Left + labelSubMaxLen.Width + 3; + } + + if (labelMaxCharsPerSecond.Left + labelMaxCharsPerSecond.Width > numericUpDownMaxCharsSec.Left) + { + numericUpDownMaxCharsSec.Left = labelMaxCharsPerSecond.Left + labelMaxCharsPerSecond.Width + 3; + } + + if (labelMaxWordsPerMin.Left + labelMaxWordsPerMin.Width > numericUpDownMaxWordsMin.Left) + { + numericUpDownMaxWordsMin.Left = labelMaxWordsPerMin.Left + labelMaxWordsPerMin.Width + 3; + } + + if (labelMinDuration.Left + labelMinDuration.Width > numericUpDownDurationMin.Left) + { + numericUpDownDurationMin.Left = labelMinDuration.Left + labelMinDuration.Width + 3; + } + + if (labelMaxDuration.Left + labelMaxDuration.Width > numericUpDownDurationMax.Left) + { + numericUpDownDurationMax.Left = labelMaxDuration.Left + labelMaxDuration.Width + 3; + } + + if (labelMinGapMs.Left + labelMinGapMs.Width > numericUpDownMinGapMs.Left) + { + numericUpDownMinGapMs.Left = labelMinGapMs.Left + labelMinGapMs.Width + 3; + } + + if (labelMergeShortLines.Left + labelMergeShortLines.Width > comboBoxMergeShortLineLength.Left) + { + comboBoxMergeShortLineLength.Left = labelMergeShortLines.Left + labelMergeShortLines.Width + 3; + } + + labelSubtitleFont.Text = language.SubtitleFont; + labelSubtitleFontSize.Text = language.SubtitleFontSize; + labelSubtitleListViewFontSize.Text = language.SubtitleFontSize; + checkBoxSubtitleFontBold.Text = language.SubtitleBold; + checkBoxSubtitleTextBoxSyntaxColor.Text = language.UseSyntaxColoring; + buttonTextBoxHtmlColor.Text = language.HtmlColor; + buttonTextBoxAssColor.Text = language.AssaColor; + checkBoxSubtitleListViewFontBold.Text = language.SubtitleBold; + checkBoxSubtitleCenter.Text = language.SubtitleCenter; + checkBoxSubtitleCenter.Left = checkBoxSubtitleFontBold.Left; + labelSubtitleFontColor.Text = language.SubtitleFontColor; + labelSubtitleFontBackgroundColor.Text = language.SubtitleBackgroundColor; + labelSpellChecker.Text = language.SpellChecker; + comboBoxSpellChecker.Left = labelSpellChecker.Left + labelSpellChecker.Width + 4; + checkBoxRememberRecentFiles.Text = language.RememberRecentFiles; + checkBoxReopenLastOpened.Text = language.StartWithLastFileLoaded; + checkBoxRememberSelectedLine.Text = language.RememberSelectedLine; + checkBoxStartInSourceView.Text = language.StartInSourceView; + checkBoxRemoveBlankLinesWhenOpening.Text = language.RemoveBlankLinesWhenOpening; + checkBoxRememberWindowPosition.Text = language.RememberPositionAndSize; + + labelShowLineBreaksAs.Text = language.ShowLineBreaksAs; + textBoxShowLineBreaksAs.Left = labelShowLineBreaksAs.Left + labelShowLineBreaksAs.Width; + labelListViewDoubleClickEvent.Text = language.MainListViewDoubleClickAction; + labelSaveAsFileNameFrom.Text = language.SaveAsFileNameFrom; + labelAutoBackup.Text = language.AutoBackup; + labelAutoBackupDeleteAfter.Text = language.AutoBackupDeleteAfter; + comboBoxAutoBackup.Left = labelAutoBackup.Left + labelAutoBackup.Width + 3; + labelAutoBackupDeleteAfter.Left = comboBoxAutoBackup.Left + comboBoxAutoBackup.Width + 5; + comboBoxAutoBackupDeleteAfter.Left = labelAutoBackupDeleteAfter.Left + labelAutoBackupDeleteAfter.Width + 3; + checkBoxCheckForUpdates.Text = language.CheckForUpdates; + checkBoxAutoSave.Text = language.AutoSave; + checkBoxCheckForUpdates.Left = checkBoxAutoSave.Left + checkBoxAutoSave.Width + 15; + checkBoxAllowEditOfOriginalSubtitle.Text = language.AllowEditOfOriginalSubtitle; + checkBoxPromptDeleteLines.Text = language.PromptDeleteLines; + + comboBoxTimeCodeMode.Items.Clear(); + comboBoxTimeCodeMode.Items.Add(language.TimeCodeModeHHMMSSMS); + comboBoxTimeCodeMode.Items.Add(language.TimeCodeModeHHMMSSFF); + comboBoxTimeCodeMode.SelectedIndex = gs.UseTimeFormatHHMMSSFF ? 1 : 0; + labelTimeCodeMode.Text = language.TimeCodeMode; + comboBoxTimeCodeMode.Left = labelTimeCodeMode.Left + labelTimeCodeMode.Width + 4; + + comboBoxSplitBehavior.Items.Clear(); + comboBoxSplitBehavior.Items.Add(language.SplitBehaviorPrevious); + comboBoxSplitBehavior.Items.Add(language.SplitBehaviorHalf); + comboBoxSplitBehavior.Items.Add(language.SplitBehaviorNext); + comboBoxSplitBehavior.SelectedIndex = gs.SplitBehavior; + labelSplitBehavior.Text = language.SplitBehavior; + comboBoxSplitBehavior.Left = labelTimeCodeMode.Left + labelTimeCodeMode.Width + 4; + if (labelSplitBehavior.Width > labelTimeCodeMode.Width) + { + comboBoxSplitBehavior.Left = labelSplitBehavior.Left + labelSplitBehavior.Width + 4; + } + + var dropDownSplitBehaviorWidth = comboBoxSplitBehavior.Width; + using (var g = Graphics.FromHwnd(IntPtr.Zero)) + { + foreach (var item in comboBoxSplitBehavior.Items) + { + var itemWidth = (int)g.MeasureString((string)item, Font).Width + 5; + dropDownSplitBehaviorWidth = Math.Max(itemWidth, dropDownSplitBehaviorWidth); + } + } + comboBoxSplitBehavior.DropDownWidth = dropDownSplitBehaviorWidth; + + + comboBoxAutoBackup.Items[0] = Configuration.Settings.Language.General.None; + comboBoxAutoBackup.Items[1] = language.AutoBackupEveryMinute; + comboBoxAutoBackup.Items[2] = language.AutoBackupEveryFiveMinutes; + comboBoxAutoBackup.Items[3] = language.AutoBackupEveryFifteenMinutes; + + comboBoxAutoBackupDeleteAfter.Items[0] = language.AutoBackupDeleteAfterOneMonth; + comboBoxAutoBackupDeleteAfter.Items[1] = language.AutoBackupDeleteAfterThreeMonths; + comboBoxAutoBackupDeleteAfter.Items[2] = language.AutoBackupDeleteAfterSixMonths; + + groupBoxVideoEngine.Text = language.VideoEngine; + radioButtonVideoPlayerDirectShow.Text = language.DirectShow; + + labelDirectShowDescription.Text = language.DirectShowDescription; + + radioButtonVideoPlayerMpcHc.Text = language.MpcHc; + labelMpcHcDescription.Text = language.MpcHcDescription; + + radioButtonVideoPlayerMPV.Text = language.MpvPlayer; + labelVideoPlayerMPlayer.Text = language.MpvPlayerDescription; + buttonMpvSettings.Left = labelVideoPlayerMPlayer.Left + labelVideoPlayerMPlayer.Width + 5; + labelMpvSettings.Left = buttonMpvSettings.Left + buttonMpvSettings.Width + 5; + checkBoxMpvHandlesPreviewText.Text = language.MpvHandlesPreviewText; + + radioButtonVideoPlayerVLC.Text = language.VlcMediaPlayer; + labelVideoPlayerVLC.Text = language.VlcMediaPlayerDescription; + gs.VlcLocation = textBoxVlcPath.Text; + + checkBoxVideoPlayerShowStopButton.Text = language.ShowStopButton; + checkBoxVideoPlayerShowMuteButton.Text = language.ShowMuteButton; + checkBoxVideoPlayerShowFullscreenButton.Text = language.ShowFullscreenButton; + + labelVideoPlayerPreviewFontSize.Text = language.PreviewFontSize; + comboBoxlVideoPlayerPreviewFontSize.Left = labelVideoPlayerPreviewFontSize.Left + labelVideoPlayerPreviewFontSize.Width; + checkBoxVideoPlayerPreviewFontBold.Text = language.SubtitleBold; + checkBoxVideoPlayerPreviewFontBold.Left = comboBoxlVideoPlayerPreviewFontSize.Left; + + checkBoxVideoAutoOpen.Text = language.VideoAutoOpen; + checkBoxAllowVolumeBoost.Text = language.AllowVolumeBoost; + + groupBoxMainWindowVideoControls.Text = language.MainWindowVideoControls; + labelCustomSearch.Text = language.CustomSearchTextAndUrl; + + groupBoxWaveformAppearence.Text = language.WaveformAppearance; + checkBoxWaveformShowGrid.Text = language.WaveformShowGridLines; + checkBoxWaveformShowCps.Text = language.WaveformShowCps; + checkBoxWaveformShowWpm.Text = language.WaveformShowWpm; + checkBoxReverseMouseWheelScrollDirection.Text = language.ReverseMouseWheelScrollDirection; + checkBoxAllowOverlap.Text = language.WaveformAllowOverlap; + checkBoxWaveformSetVideoPosMoveStartEnd.Text = language.WaveformSetVideoPosMoveStartEnd; + checkBoxWaveformHoverFocus.Text = language.WaveformFocusMouseEnter; + checkBoxListViewMouseEnterFocus.Text = language.WaveformListViewFocusMouseEnter; + checkBoxWaveformSingleClickSelect.Text = language.WaveformSingleClickSelect; + checkBoxWaveformSnapToSceneChanges.Text = language.WaveformSnapToSceneChanges; + labelWaveformBorderHitMs1.Text = language.WaveformBorderHitMs1; + labelWaveformBorderHitMs2.Text = language.WaveformBorderHitMs2; + numericUpDownWaveformBorderHitMs.Left = labelWaveformBorderHitMs1.Left + labelWaveformBorderHitMs1.Width; + labelWaveformBorderHitMs2.Left = numericUpDownWaveformBorderHitMs.Left + numericUpDownWaveformBorderHitMs.Width + 2; + + buttonWaveformGridColor.Text = language.WaveformGridColor; + buttonWaveformColor.Text = language.WaveformColor; + buttonWaveformSelectedColor.Text = language.WaveformSelectedColor; + buttonWaveformTextColor.Text = language.WaveformTextColor; + buttonWaveformBackgroundColor.Text = language.WaveformBackgroundColor; + buttonWaveformCursorColor.Text = language.WaveformCursorColor; + groupBoxSpectrogram.Text = language.Spectrogram; + checkBoxGenerateSpectrogram.Text = language.GenerateSpectrogram; + labelSpectrogramAppearance.Text = language.SpectrogramAppearance; + comboBoxSpectrogramAppearance.Items.Clear(); + comboBoxSpectrogramAppearance.Items.Add(language.SpectrogramOneColorGradient); + comboBoxSpectrogramAppearance.Items.Add(language.SpectrogramClassic); + labelWaveformTextSize.Text = language.WaveformTextFontSize; + comboBoxWaveformTextSize.Left = labelWaveformTextSize.Left + labelWaveformTextSize.Width + 5; + checkBoxWaveformTextBold.Text = language.SubtitleBold; + checkBoxWaveformTextBold.Left = comboBoxWaveformTextSize.Left + comboBoxWaveformTextSize.Width + 5; + + buttonWaveformsFolderEmpty.Text = language.WaveformAndSpectrogramsFolderEmpty; + InitializeWaveformsAndSpectrogramsFolderEmpty(language); + + checkBoxUseFFmpeg.Text = language.WaveformUseFFmpeg; + buttonDownloadFfmpeg.Text = language.DownloadFFmpeg; + if (!Configuration.IsRunningOnWindows) + { + buttonDownloadFfmpeg.Visible = false; + labelFFmpegPath.Visible = false; + textBoxFFmpegPath.Visible = false; + buttonBrowseToFFmpeg.Visible = false; + + buttonMpvSettings.Visible = false; + radioButtonVideoPlayerDirectShow.Enabled = false; + radioButtonVideoPlayerMpcHc.Enabled = false; + var isLibVlcInstalled = LibVlcDynamic.IsInstalled; + radioButtonVideoPlayerVLC.Enabled = isLibVlcInstalled; + if (gs.VideoPlayer.Trim().Equals("VLC", StringComparison.OrdinalIgnoreCase) && isLibVlcInstalled) + { + radioButtonVideoPlayerVLC.Checked = true; + } + if (LibMpvDynamic.IsInstalled) + { + radioButtonVideoPlayerMPV.Enabled = true; + radioButtonVideoPlayerMPV.Checked = !(gs.VideoPlayer.Trim().Equals("VLC", StringComparison.OrdinalIgnoreCase) && isLibVlcInstalled); + labelMpvSettings.Text = "--vo=" + Configuration.Settings.General.MpvVideoOutputLinux; + } + textBoxVlcPath.Visible = false; + labelVlcPath.Visible = false; + buttonVlcPathBrowse.Visible = false; + } + + labelFFmpegPath.Text = language.WaveformFFmpegPath; + + groupBoxSsaStyle.Text = language.SubStationAlphaStyle; + + var ssaStyles = Configuration.Settings.Language.SubStationAlphaStyles; + labelSsaFontSize.Text = ssaStyles.FontSize; + labelFontName.Text = ssaStyles.FontName; + buttonSsaColor.Text = Configuration.Settings.Language.Settings.ChooseColor; + groupSsaBoxFont.Text = ssaStyles.Font; + groupBoxSsaBorder.Text = ssaStyles.Border; + groupBoxMargins.Text = ssaStyles.Margins; + labelMarginLeft.Text = ssaStyles.MarginLeft; + labelMarginRight.Text = ssaStyles.MarginRight; + labelMarginVertical.Text = ssaStyles.MarginVertical; + labelSsaOutline.Text = language.SsaOutline; + labelSsaShadow.Text = language.SsaShadow; + checkBoxSsaOpaqueBox.Text = language.SsaOpaqueBox; + checkBoxSsaFontBold.Text = Configuration.Settings.Language.General.Bold; + + groupBoxPreview.Text = Configuration.Settings.Language.General.Preview; + + numericUpDownSsaOutline.Left = labelSsaOutline.Left + labelSsaOutline.Width + 4; + numericUpDownSsaShadow.Left = labelSsaShadow.Left + labelSsaShadow.Width + 4; + if (Math.Abs(numericUpDownSsaOutline.Left - numericUpDownSsaShadow.Left) < 9) + { + if (numericUpDownSsaOutline.Left > numericUpDownSsaShadow.Left) + { + numericUpDownSsaShadow.Left = numericUpDownSsaOutline.Left; + } + else + { + numericUpDownSsaOutline.Left = numericUpDownSsaShadow.Left; + } + } + + groupBoxWordLists.Text = language.WordLists; + labelWordListLanguage.Text = language.Language; + comboBoxWordListLanguage.Left = labelWordListLanguage.Left + labelWordListLanguage.Width + 4; + groupBoxNamesIgonoreLists.Text = language.NamesIgnoreLists; + groupBoxUserWordList.Text = language.UserWordList; + groupBoxOcrFixList.Text = language.OcrFixList; + buttonRemoveNameEtc.Text = language.Remove; + buttonRemoveUserWord.Text = language.Remove; + buttonRemoveOcrFix.Text = language.Remove; + buttonAddNames.Text = language.AddName; + buttonAddUserWord.Text = language.AddWord; + buttonAddOcrFix.Text = language.AddPair; + groupBoxWordListLocation.Text = language.Location; + checkBoxNamesOnline.Text = language.UseOnlineNames; + linkLabelOpenDictionaryFolder.Text = Configuration.Settings.Language.GetDictionaries.OpenDictionariesFolder; + + groupBoxProxySettings.Text = language.ProxyServerSettings; + labelProxyAddress.Text = language.ProxyAddress; + groupBoxProxyAuthentication.Text = language.ProxyAuthentication; + labelProxyUserName.Text = language.ProxyUserName; + labelProxyPassword.Text = language.ProxyPassword; + labelProxyDomain.Text = language.ProxyDomain; + + groupBoxNetworkSession.Text = language.NetworkSessionSettings; + labelNetworkSessionNewMessageSound.Text = language.NetworkSessionNewSound; + + groupBoxToolsVisualSync.Text = language.VisualSync; + labelVerifyButton.Text = language.PlayXSecondsAndBack; + labelToolsStartScene.Text = language.StartSceneIndex; + labelToolsEndScene.Text = language.EndSceneIndex; + comboBoxToolsStartSceneIndex.Items.Clear(); + comboBoxToolsStartSceneIndex.Items.Add(string.Format(language.FirstPlusX, 0)); + comboBoxToolsStartSceneIndex.Items.Add(string.Format(language.FirstPlusX, 1)); + comboBoxToolsStartSceneIndex.Items.Add(string.Format(language.FirstPlusX, 2)); + comboBoxToolsStartSceneIndex.Items.Add(string.Format(language.FirstPlusX, 3)); + comboBoxToolsEndSceneIndex.Items.Clear(); + comboBoxToolsEndSceneIndex.Items.Add(string.Format(language.LastMinusX, 0)); + comboBoxToolsEndSceneIndex.Items.Add(string.Format(language.LastMinusX, 1)); + comboBoxToolsEndSceneIndex.Items.Add(string.Format(language.LastMinusX, 2)); + comboBoxToolsEndSceneIndex.Items.Add(string.Format(language.LastMinusX, 3)); + int visAdjustTextMax = Math.Max(labelVerifyButton.Width, labelToolsStartScene.Width); + visAdjustTextMax = Math.Max(visAdjustTextMax, labelToolsEndScene.Width); + comboBoxToolsVerifySeconds.Left = groupBoxToolsVisualSync.Left + visAdjustTextMax + 12; + comboBoxToolsStartSceneIndex.Left = comboBoxToolsVerifySeconds.Left; + comboBoxToolsEndSceneIndex.Left = comboBoxToolsVerifySeconds.Left; + + groupBoxFixCommonErrors.Text = language.FixCommonerrors; + labelMergeShortLines.Text = language.MergeLinesShorterThan; + labelDialogStyle.Text = language.DialogStyle; + labelContinuationStyle.Text = language.ContinuationStyle; + labelToolsMusicSymbol.Text = language.MusicSymbol; + labelToolsMusicSymbolsToReplace.Text = language.MusicSymbolsReplace; + checkBoxFixCommonOcrErrorsUsingHardcodedRules.Text = language.FixCommonOcrErrorsUseHardcodedRules; + checkBoxFixShortDisplayTimesAllowMoveStartTime.Text = language.FixCommonerrorsFixShortDisplayTimesAllowMoveStartTime; + checkBoxFceSkipStep1.Text = language.FixCommonErrorsSkipStepOne; + groupBoxSpellCheck.Text = language.SpellCheck; + checkBoxSpellCheckAutoChangeNames.Text = Configuration.Settings.Language.SpellCheck.AutoFixNames; + checkBoxSpellCheckAutoChangeNamesViaSuggestions.Text = Configuration.Settings.Language.SpellCheck.AutoFixNamesViaSuggestions; + checkBoxSpellCheckOneLetterWords.Text = Configuration.Settings.Language.SpellCheck.CheckOneLetterWords; + checkBoxTreatINQuoteAsING.Text = Configuration.Settings.Language.SpellCheck.TreatINQuoteAsING; + checkBoxUseAlwaysToFile.Text = Configuration.Settings.Language.SpellCheck.RememberUseAlwaysList; + buttonFixContinuationStyleSettings.Text = language.EditFixContinuationStyleSettings; + + groupBoxToolsAutoBr.Text = Configuration.Settings.Language.Main.Controls.AutoBreak.Replace("&", string.Empty); + checkBoxUseDoNotBreakAfterList.Text = language.UseDoNotBreakAfterList; + checkBoxToolsBreakEarlyComma.Text = language.BreakEarlyForComma; + checkBoxToolsBreakEarlyDash.Text = language.BreakEarlyForDashDialog; + checkBoxToolsBreakEarlyLineEnding.Text = language.BreakEarlyForLineEnding; + checkBoxToolsBreakByPixelWidth.Text = language.BreakByPixelWidth; + checkBoxToolsBreakPreferBottomHeavy.Text = language.BreakPreferBottomHeavy; + numericUpDownToolsBreakPreferBottomHeavy.Left = checkBoxToolsBreakPreferBottomHeavy.Left + checkBoxToolsBreakPreferBottomHeavy.Width + 9; + labelToolsBreakBottomHeavyPercent.Left = numericUpDownToolsBreakPreferBottomHeavy.Left + numericUpDownToolsBreakPreferBottomHeavy.Width + 2; + checkBoxCpsIncludeWhiteSpace.Text = language.CpsIncludesSpace; + buttonEditDoNotBreakAfterList.Text = Configuration.Settings.Language.VobSubOcr.Edit; + + groupBoxGoogleTranslate.Text = language.GoogleTranslate; + labelGoogleTranslateApiKey.Text = language.GoogleTranslateApiKey; + linkLabelGoogleTranslateSignUp.Text = language.HowToSignUp; + linkLabelGoogleTranslateSignUp.Left = textBoxGoogleTransleApiKey.Left + textBoxGoogleTransleApiKey.Width - linkLabelGoogleTranslateSignUp.Width; + + groupBoxBing.Text = language.MicrosoftBingTranslator; + labelBingApiKey.Text = language.MicrosoftTranslateApiKey; + labelBingTokenEndpoint.Text = language.MicrosoftTranslateTokenEndpoint; + linkLabelBingSubscribe.Text = language.HowToSignUp; + linkLabelBingSubscribe.Left = textBoxBingClientSecret.Left + textBoxBingClientSecret.Width - linkLabelGoogleTranslateSignUp.Width; + + comboBoxListViewDoubleClickEvent.Items.Clear(); + comboBoxListViewDoubleClickEvent.Items.Add(language.MainListViewNothing); + comboBoxListViewDoubleClickEvent.Items.Add(language.MainListViewVideoGoToPositionAndPause); + comboBoxListViewDoubleClickEvent.Items.Add(language.MainListViewVideoGoToPositionAndPlay); + comboBoxListViewDoubleClickEvent.Items.Add(language.MainListViewVideoGoToPositionMinusHalfSecAndPause); + comboBoxListViewDoubleClickEvent.Items.Add(language.MainListViewVideoGoToPositionMinus1SecAndPause); + comboBoxListViewDoubleClickEvent.Items.Add(language.MainListViewVideoGoToPositionMinus1SecAndPlay); + comboBoxListViewDoubleClickEvent.Items.Add(language.MainListViewEditTextAndPause); + comboBoxListViewDoubleClickEvent.Items.Add(language.MainListViewEditText); + + comboBoxSaveAsFileNameFrom.Items.Clear(); + comboBoxSaveAsFileNameFrom.Items.Add(language.VideoFileName); + comboBoxSaveAsFileNameFrom.Items.Add(language.ExistingFileName); + + if (gs.ListViewDoubleClickAction >= 0 && gs.ListViewDoubleClickAction < comboBoxListViewDoubleClickEvent.Items.Count) + { + comboBoxListViewDoubleClickEvent.SelectedIndex = gs.ListViewDoubleClickAction; + } + + comboBoxSaveAsFileNameFrom.SelectedIndex = gs.SaveAsUseFileNameFrom.Equals("video", StringComparison.OrdinalIgnoreCase) ? 0 : 1; + + if (gs.AutoBackupSeconds == 60) + { + comboBoxAutoBackup.SelectedIndex = 1; + } + else if (gs.AutoBackupSeconds == 60 * 5) + { + comboBoxAutoBackup.SelectedIndex = 2; + } + else if (gs.AutoBackupSeconds == 60 * 15) + { + comboBoxAutoBackup.SelectedIndex = 3; + } + else + { + comboBoxAutoBackup.SelectedIndex = 0; + } + + if (gs.AutoBackupDeleteAfterMonths == 3) + { + comboBoxAutoBackupDeleteAfter.SelectedIndex = 1; + } + else if (gs.AutoBackupDeleteAfterMonths == 1) + { + comboBoxAutoBackupDeleteAfter.SelectedIndex = 0; + } + else + { + comboBoxAutoBackupDeleteAfter.SelectedIndex = 2; + } + + checkBoxCheckForUpdates.Checked = gs.CheckForUpdates; + checkBoxAutoSave.Checked = gs.AutoSave; + + comboBoxSpellChecker.SelectedIndex = gs.SpellChecker.Contains("word", StringComparison.OrdinalIgnoreCase) ? 1 : 0; + + if (Configuration.IsRunningOnLinux || Configuration.IsRunningOnMac) + { + comboBoxSpellChecker.SelectedIndex = 0; + comboBoxSpellChecker.Enabled = false; + } + + checkBoxAllowEditOfOriginalSubtitle.Checked = gs.AllowEditOfOriginalSubtitle; + checkBoxPromptDeleteLines.Checked = gs.PromptDeleteLines; + + ToolsSettings toolsSettings = Configuration.Settings.Tools; + if (toolsSettings.VerifyPlaySeconds - 2 >= 0 && toolsSettings.VerifyPlaySeconds - 2 < comboBoxToolsVerifySeconds.Items.Count) + { + comboBoxToolsVerifySeconds.SelectedIndex = toolsSettings.VerifyPlaySeconds - 2; + } + else + { + comboBoxToolsVerifySeconds.SelectedIndex = 0; + } + + if (toolsSettings.StartSceneIndex >= 0 && toolsSettings.StartSceneIndex < comboBoxToolsStartSceneIndex.Items.Count) + { + comboBoxToolsStartSceneIndex.SelectedIndex = toolsSettings.StartSceneIndex; + } + else + { + comboBoxToolsStartSceneIndex.SelectedIndex = 0; + } + + if (toolsSettings.EndSceneIndex >= 0 && toolsSettings.EndSceneIndex < comboBoxToolsEndSceneIndex.Items.Count) + { + comboBoxToolsEndSceneIndex.SelectedIndex = toolsSettings.EndSceneIndex; + } + else + { + comboBoxToolsEndSceneIndex.SelectedIndex = 0; + } + + comboBoxMergeShortLineLength.Items.Clear(); + var comboBoxMergeShortLineLengthList = new List(95); + for (int i = 5; i < 100; i++) + { + comboBoxMergeShortLineLengthList.Add(i.ToString(CultureInfo.InvariantCulture)); + } + comboBoxMergeShortLineLength.Items.AddRange(comboBoxMergeShortLineLengthList.ToArray()); + + if (gs.MergeLinesShorterThan >= 5 && gs.MergeLinesShorterThan - 5 < comboBoxMergeShortLineLength.Items.Count) + { + comboBoxMergeShortLineLength.SelectedIndex = gs.MergeLinesShorterThan - 5; + } + else + { + comboBoxMergeShortLineLength.SelectedIndex = 0; + } + + SetDialogStyle(Configuration.Settings.General.DialogStyle); + SetContinuationStyle(Configuration.Settings.General.ContinuationStyle); + + UpdateProfileNames(gs.Profiles); + + // Music notes / music symbols + if (!Utilities.IsRunningOnMono() && Environment.OSVersion.Version.Major < 6) // 6 == Vista/Win2008Server/Win7 + { + float fontSize = comboBoxToolsMusicSymbol.Font.Size; + const string unicodeFontName = Utilities.WinXP2KUnicodeFontName; + listBoxNames.Font = new Font(unicodeFontName, fontSize); + listBoxUserWordLists.Font = new Font(unicodeFontName, fontSize); + listBoxOcrFixList.Font = new Font(unicodeFontName, fontSize); + comboBoxToolsMusicSymbol.Font = new Font(unicodeFontName, fontSize); + textBoxMusicSymbolsToReplace.Font = new Font(unicodeFontName, fontSize); + textBoxNameEtc.Font = new Font(unicodeFontName, fontSize); + textBoxUserWord.Font = new Font(unicodeFontName, fontSize); + textBoxOcrFixKey.Font = new Font(unicodeFontName, fontSize); + textBoxOcrFixValue.Font = new Font(unicodeFontName, fontSize); + } + + comboBoxToolsMusicSymbol.Items.Clear(); + comboBoxToolsMusicSymbol.Items.Add("♪"); + comboBoxToolsMusicSymbol.Items.Add("♫"); + comboBoxToolsMusicSymbol.Items.Add("♪♪"); + comboBoxToolsMusicSymbol.Items.Add("*"); + comboBoxToolsMusicSymbol.Items.Add("#"); + if (toolsSettings.MusicSymbol == "♪") + { + comboBoxToolsMusicSymbol.SelectedIndex = 0; + } + else if (toolsSettings.MusicSymbol == "♫") + { + comboBoxToolsMusicSymbol.SelectedIndex = 1; + } + else if (toolsSettings.MusicSymbol == "♪♪") + { + comboBoxToolsMusicSymbol.SelectedIndex = 2; + } + else if (toolsSettings.MusicSymbol == "*") + { + comboBoxToolsMusicSymbol.SelectedIndex = 3; + } + else if (toolsSettings.MusicSymbol == "#") + { + comboBoxToolsMusicSymbol.SelectedIndex = 4; + } + else + { + comboBoxToolsMusicSymbol.Items.Add(toolsSettings.MusicSymbol); + comboBoxToolsMusicSymbol.SelectedIndex = 5; + } + + textBoxMusicSymbolsToReplace.Text = toolsSettings.MusicSymbolReplace; + checkBoxFixCommonOcrErrorsUsingHardcodedRules.Checked = toolsSettings.OcrFixUseHardcodedRules; + checkBoxFixShortDisplayTimesAllowMoveStartTime.Checked = toolsSettings.FixShortDisplayTimesAllowMoveStartTime; + checkBoxFceSkipStep1.Checked = toolsSettings.FixCommonErrorsSkipStepOne; + checkBoxSpellCheckAutoChangeNames.Checked = toolsSettings.SpellCheckAutoChangeNames; + checkBoxSpellCheckAutoChangeNamesViaSuggestions.Checked = toolsSettings.SpellCheckAutoChangeNamesUseSuggestions; + checkBoxSpellCheckOneLetterWords.Checked = toolsSettings.CheckOneLetterWords; + checkBoxTreatINQuoteAsING.Checked = toolsSettings.SpellCheckEnglishAllowInQuoteAsIng; + checkBoxUseAlwaysToFile.Checked = toolsSettings.RememberUseAlwaysList; + checkBoxUseDoNotBreakAfterList.Checked = toolsSettings.UseNoLineBreakAfter; + checkBoxToolsBreakEarlyComma.Checked = toolsSettings.AutoBreakCommaBreakEarly; + checkBoxToolsBreakEarlyDash.Checked = toolsSettings.AutoBreakDashEarly; + checkBoxToolsBreakEarlyLineEnding.Checked = toolsSettings.AutoBreakLineEndingEarly; + checkBoxToolsBreakByPixelWidth.Checked = toolsSettings.AutoBreakUsePixelWidth; + checkBoxToolsBreakPreferBottomHeavy.Checked = toolsSettings.AutoBreakPreferBottomHeavy; + numericUpDownToolsBreakPreferBottomHeavy.Value = (decimal)toolsSettings.AutoBreakPreferBottomPercent; + checkBoxCpsIncludeWhiteSpace.Checked = !Configuration.Settings.General.CharactersPerSecondsIgnoreWhiteSpace; + + textBoxBingClientSecret.Text = Configuration.Settings.Tools.MicrosoftTranslatorApiKey; + comboBoxBoxBingTokenEndpoint.Text = Configuration.Settings.Tools.MicrosoftTranslatorTokenEndpoint; + textBoxGoogleTransleApiKey.Text = toolsSettings.GoogleApiV2Key; + + buttonReset.Text = Configuration.Settings.Language.Settings.RestoreDefaultSettings; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + + InitComboBoxWordListLanguages(); + + checkBoxWaveformShowGrid.Checked = Configuration.Settings.VideoControls.WaveformDrawGrid; + checkBoxWaveformShowCps.Checked = Configuration.Settings.VideoControls.WaveformDrawCps; + checkBoxWaveformShowWpm.Checked = Configuration.Settings.VideoControls.WaveformDrawWpm; + panelWaveformGridColor.BackColor = Configuration.Settings.VideoControls.WaveformGridColor; + panelWaveformSelectedColor.BackColor = Configuration.Settings.VideoControls.WaveformSelectedColor; + panelWaveformColor.BackColor = Configuration.Settings.VideoControls.WaveformColor; + panelWaveformBackgroundColor.BackColor = Configuration.Settings.VideoControls.WaveformBackgroundColor; + panelWaveformTextColor.BackColor = Configuration.Settings.VideoControls.WaveformTextColor; + panelWaveformCursorColor.BackColor = Configuration.Settings.VideoControls.WaveformCursorColor; + checkBoxGenerateSpectrogram.Checked = Configuration.Settings.VideoControls.GenerateSpectrogram; + comboBoxSpectrogramAppearance.SelectedIndex = Configuration.Settings.VideoControls.SpectrogramAppearance == "OneColorGradient" ? 0 : 1; + comboBoxWaveformTextSize.Text = Configuration.Settings.VideoControls.WaveformTextSize.ToString(CultureInfo.InvariantCulture); + checkBoxWaveformTextBold.Checked = Configuration.Settings.VideoControls.WaveformTextBold; + checkBoxReverseMouseWheelScrollDirection.Checked = Configuration.Settings.VideoControls.WaveformMouseWheelScrollUpIsForward; + checkBoxAllowOverlap.Checked = Configuration.Settings.VideoControls.WaveformAllowOverlap; + checkBoxWaveformSetVideoPosMoveStartEnd.Checked = Configuration.Settings.VideoControls.WaveformSetVideoPositionOnMoveStartEnd; + checkBoxWaveformHoverFocus.Checked = Configuration.Settings.VideoControls.WaveformFocusOnMouseEnter; + checkBoxListViewMouseEnterFocus.Checked = Configuration.Settings.VideoControls.WaveformListViewFocusOnMouseEnter; + checkBoxWaveformSingleClickSelect.Checked = Configuration.Settings.VideoControls.WaveformSingleClickSelect; + checkBoxWaveformSnapToSceneChanges.Checked = Configuration.Settings.VideoControls.WaveformSnapToSceneChanges; + if (Configuration.Settings.VideoControls.WaveformBorderHitMs >= numericUpDownWaveformBorderHitMs.Minimum && + Configuration.Settings.VideoControls.WaveformBorderHitMs <= numericUpDownWaveformBorderHitMs.Maximum) + { + numericUpDownWaveformBorderHitMs.Value = Configuration.Settings.VideoControls.WaveformBorderHitMs; + } + + checkBoxUseFFmpeg.Checked = gs.UseFFmpegForWaveExtraction; + textBoxFFmpegPath.Text = gs.FFmpegLocation; + if (string.IsNullOrEmpty(textBoxFFmpegPath.Text) && Configuration.IsRunningOnWindows) + { + var guessPath = Path.Combine(Configuration.DataDirectory, "ffmpeg", "ffmpeg.exe"); + if (File.Exists(guessPath)) + { + textBoxFFmpegPath.Text = guessPath; + checkBoxUseFFmpeg.Checked = true; + } + } + + MakeShortcutsTreeView(language); + ShowShortcutsTreeView(); + toolStripMenuItemShortcutsCollapse.Text = Configuration.Settings.Language.General.Collapse; + importShortcutsToolStripMenuItem.Text = Configuration.Settings.Language.MultipleReplace.Import; + exportShortcutsToolStripMenuItem.Text = Configuration.Settings.Language.MultipleReplace.Export; + labelShortcutsSearch.Text = Configuration.Settings.Language.General.Search; + buttonShortcutsClear.Text = Configuration.Settings.Language.DvdSubRip.Clear; + textBoxShortcutSearch.Left = labelShortcutsSearch.Left + labelShortcutsSearch.Width + 5; + buttonShortcutsClear.Left = textBoxShortcutSearch.Left + textBoxShortcutSearch.Width + 5; + + groupBoxShortcuts.Text = language.Shortcuts; + labelShortcut.Text = language.Shortcut; + checkBoxShortcutsControl.Text = language.Control; + checkBoxShortcutsAlt.Text = language.Alt; + checkBoxShortcutsShift.Text = language.Shift; + buttonUpdateShortcut.Text = language.UpdateShortcut; + buttonClearShortcut.Text = Configuration.Settings.Language.DvdSubRip.Clear; + + labelShortcutKey.Text = language.Key; + comboBoxShortcutKey.Left = labelShortcutKey.Left + labelShortcutKey.Width; + comboBoxShortcutKey.Items[0] = Configuration.Settings.Language.General.None; + + groupBoxListViewSyntaxColoring.Text = language.ListViewSyntaxColoring; + checkBoxSyntaxColorDurationTooSmall.Text = language.SyntaxColorDurationIfTooSmall; + checkBoxSyntaxColorDurationTooLarge.Text = language.SyntaxColorDurationIfTooLarge; + checkBoxSyntaxColorTextTooLong.Text = language.SyntaxColorTextIfTooLong; + checkBoxSyntaxColorTextTooWide.Text = language.SyntaxColorTextIfTooWide; + buttonLineWidthSettings.Text = language.SyntaxLineWidthSettings; + checkBoxSyntaxColorTextMoreThanTwoLines.Text = string.Format(language.SyntaxColorTextMoreThanMaxLines, Configuration.Settings.General.MaxNumberOfLines); + checkBoxSyntaxOverlap.Text = language.SyntaxColorOverlap; + checkBoxSyntaxColorGapTooSmall.Text = language.SyntaxColorGap; + buttonListViewSyntaxColorError.Text = language.SyntaxErrorColor; + + UiUtil.FixLargeFonts(this, buttonOK); + + checkBoxShortcutsControl.Left = labelShortcut.Left + labelShortcut.Width + 9; + checkBoxShortcutsAlt.Left = checkBoxShortcutsControl.Left + checkBoxShortcutsControl.Width + 9; + checkBoxShortcutsShift.Left = checkBoxShortcutsAlt.Left + checkBoxShortcutsAlt.Width + 9; + labelShortcutKey.Left = checkBoxShortcutsShift.Left + checkBoxShortcutsShift.Width + 9; + comboBoxShortcutKey.Left = labelShortcutKey.Left + labelShortcutKey.Width + 2; + buttonUpdateShortcut.Left = comboBoxShortcutKey.Left + comboBoxShortcutKey.Width + 15; + buttonClearShortcut.Left = buttonUpdateShortcut.Left + buttonUpdateShortcut.Width + 15; + buttonLineWidthSettings.Left = checkBoxSyntaxColorTextTooWide.Left + checkBoxSyntaxColorTextTooWide.Width + 9; + + _oldVlcLocation = gs.VlcLocation; + _oldVlcLocationRelative = gs.VlcLocationRelative; + + _oldListViewShowCps = Configuration.Settings.Tools.ListViewShowColumnCharsPerSec; + _oldListViewShowWpm = Configuration.Settings.Tools.ListViewShowColumnWordsPerMin; + + labelPlatform.Text = (IntPtr.Size * 8) + "-bit"; + + _loading = false; + UpdateSsaExample(); + } + + private void SetDialogStyle(DialogType dialogStyle) + { + comboBoxDialogStyle.Items.Clear(); + comboBoxDialogStyle.Items.Add(Configuration.Settings.Language.Settings.DialogStyleDashBothLinesWithSpace); + comboBoxDialogStyle.Items.Add(Configuration.Settings.Language.Settings.DialogStyleDashBothLinesWithoutSpace); + comboBoxDialogStyle.Items.Add(Configuration.Settings.Language.Settings.DialogStyleDashSecondLineWithSpace); + comboBoxDialogStyle.Items.Add(Configuration.Settings.Language.Settings.DialogStyleDashSecondLineWithoutSpace); + comboBoxDialogStyle.SelectedIndex = 0; + switch (dialogStyle) + { + case DialogType.DashBothLinesWithSpace: + comboBoxDialogStyle.SelectedIndex = 0; + break; + case DialogType.DashBothLinesWithoutSpace: + comboBoxDialogStyle.SelectedIndex = 1; + break; + case DialogType.DashSecondLineWithSpace: + comboBoxDialogStyle.SelectedIndex = 2; + break; + case DialogType.DashSecondLineWithoutSpace: + comboBoxDialogStyle.SelectedIndex = 3; + break; + } + } + + private void SetContinuationStyle(ContinuationStyle continuationStyle) + { + comboBoxContinuationStyle.Items.Clear(); + comboBoxContinuationStyle.Items.Add(Configuration.Settings.Language.Settings.ContinuationStyleNone); + comboBoxContinuationStyle.Items.Add(Configuration.Settings.Language.Settings.ContinuationStyleNoneTrailingDots); + comboBoxContinuationStyle.Items.Add(Configuration.Settings.Language.Settings.ContinuationStyleNoneLeadingTrailingDots); + comboBoxContinuationStyle.Items.Add(Configuration.Settings.Language.Settings.ContinuationStyleOnlyTrailingDots); + comboBoxContinuationStyle.Items.Add(Configuration.Settings.Language.Settings.ContinuationStyleLeadingTrailingDots); + comboBoxContinuationStyle.Items.Add(Configuration.Settings.Language.Settings.ContinuationStyleLeadingTrailingDash); + comboBoxContinuationStyle.Items.Add(Configuration.Settings.Language.Settings.ContinuationStyleLeadingTrailingDashDots); + comboBoxContinuationStyle.SelectedIndex = 0; + toolTipContinuationPreview.RemoveAll(); + toolTipContinuationPreview.SetToolTip(comboBoxContinuationStyle, ContinuationUtilities.GetContinuationStylePreview(continuationStyle)); + comboBoxContinuationStyle.SelectedIndex = ContinuationUtilities.GetIndexFromContinuationStyle(continuationStyle); + + var dropDownContinuationWidth = comboBoxContinuationStyle.Width; + var dropDownDialogStyleWidth = comboBoxDialogStyle.Width; + using (var g = Graphics.FromHwnd(IntPtr.Zero)) + { + foreach (var item in comboBoxContinuationStyle.Items) + { + var itemWidth = (int)g.MeasureString((string)item, Font).Width + 5; + dropDownContinuationWidth = Math.Max(itemWidth, dropDownContinuationWidth); + } + + foreach (var item in comboBoxDialogStyle.Items) + { + var itemWidth = (int)g.MeasureString((string)item, Font).Width + 5; + dropDownDialogStyleWidth = Math.Max(itemWidth, dropDownDialogStyleWidth); + } + } + + comboBoxContinuationStyle.DropDownWidth = dropDownContinuationWidth; + comboBoxDialogStyle.DropDownWidth = dropDownDialogStyleWidth; + } + + private Guid _oldProfileId = Guid.Empty; + private void UpdateProfileNames(List profiles) + { + comboBoxRulesProfileName.BeginUpdate(); + comboBoxRulesProfileName.Items.Clear(); + foreach (var profile in profiles) + { + comboBoxRulesProfileName.Items.Add(profile.Name); + if (_oldProfileId == Guid.Empty && profile.Name == Configuration.Settings.General.CurrentProfile || profile.Id == _oldProfileId) + { + comboBoxRulesProfileName.SelectedIndex = comboBoxRulesProfileName.Items.Count - 1; + _oldProfileId = profile.Id; + } + } + comboBoxRulesProfileName.EndUpdate(); + if (comboBoxRulesProfileName.SelectedIndex < 0 && comboBoxRulesProfileName.Items.Count > 0 && comboBoxRulesProfileName.Items.Count > 0) + { + comboBoxRulesProfileName.SelectedIndex = 0; + } + } + + ShortcutNode _shortcuts = new ShortcutNode("root"); + + private void MakeShortcutsTreeView(LanguageStructure.Settings language) + { + _shortcuts = new ShortcutNode("root"); + + var generalNode = new ShortcutNode(Configuration.Settings.Language.General.GeneralText); + AddNode(generalNode, language.MergeSelectedLines, nameof(Configuration.Settings.Shortcuts.GeneralMergeSelectedLines)); + AddNode(generalNode, language.MergeWithPrevious, nameof(Configuration.Settings.Shortcuts.GeneralMergeWithPrevious)); + AddNode(generalNode, language.MergeWithNext, nameof(Configuration.Settings.Shortcuts.GeneralMergeWithNext)); + AddNode(generalNode, language.MergeSelectedLinesAndAutoBreak, nameof(Configuration.Settings.Shortcuts.GeneralMergeSelectedLinesAndAutoBreak)); + AddNode(generalNode, language.MergeSelectedLinesAndUnbreak, nameof(Configuration.Settings.Shortcuts.GeneralMergeSelectedLinesAndUnbreak)); + AddNode(generalNode, language.MergeSelectedLinesAndUnbreakCjk, nameof(Configuration.Settings.Shortcuts.GeneralMergeSelectedLinesAndUnbreakCjk)); + AddNode(generalNode, language.MergeSelectedLinesOnlyFirstText, nameof(Configuration.Settings.Shortcuts.GeneralMergeSelectedLinesOnlyFirstText)); + AddNode(generalNode, language.MergeSelectedLinesBilingual, nameof(Configuration.Settings.Shortcuts.GeneralMergeSelectedLinesBilingual)); + AddNode(generalNode, language.MergeOriginalAndTranslation, nameof(Configuration.Settings.Shortcuts.GeneralMergeOriginalAndTranslation)); + AddNode(generalNode, language.ToggleTranslationMode, nameof(Configuration.Settings.Shortcuts.GeneralToggleTranslationMode)); + AddNode(generalNode, language.SwitchOriginalAndTranslation, nameof(Configuration.Settings.Shortcuts.GeneralSwitchOriginalAndTranslation)); + AddNode(generalNode, language.WaveformPlayFirstSelectedSubtitle, nameof(Configuration.Settings.Shortcuts.GeneralPlayFirstSelected)); + AddNode(generalNode, language.GoToFirstSelectedLine, nameof(Configuration.Settings.Shortcuts.GeneralGoToFirstSelectedLine)); + AddNode(generalNode, language.GoToNextEmptyLine, nameof(Configuration.Settings.Shortcuts.GeneralGoToNextEmptyLine)); + AddNode(generalNode, language.GoToNext, nameof(Configuration.Settings.Shortcuts.GeneralGoToNextSubtitle)); + AddNode(generalNode, language.GoToNextCursorAtEnd, nameof(Configuration.Settings.Shortcuts.GeneralGoToNextSubtitleCursorAtEnd)); + AddNode(generalNode, language.GoToPrevious, nameof(Configuration.Settings.Shortcuts.GeneralGoToPrevSubtitle)); + AddNode(generalNode, language.GoToCurrentSubtitleStart, nameof(Configuration.Settings.Shortcuts.GeneralGoToStartOfCurrentSubtitle)); + AddNode(generalNode, language.GoToCurrentSubtitleEnd, nameof(Configuration.Settings.Shortcuts.GeneralGoToEndOfCurrentSubtitle)); + AddNode(generalNode, language.GoToPreviousSubtitleAndFocusVideo, nameof(Configuration.Settings.Shortcuts.GeneralGoToPreviousSubtitleAndFocusVideo)); + AddNode(generalNode, language.GoToNextSubtitleAndFocusVideo, nameof(Configuration.Settings.Shortcuts.GeneralGoToNextSubtitleAndFocusVideo)); + AddNode(generalNode, language.GoToPrevSubtitleAndPlay, nameof(Configuration.Settings.Shortcuts.GeneralGoToPrevSubtitleAndPlay)); + AddNode(generalNode, language.GoToNextSubtitleAndPlay, nameof(Configuration.Settings.Shortcuts.GeneralGoToNextSubtitleAndPlay)); + AddNode(generalNode, language.Help, nameof(Configuration.Settings.Shortcuts.GeneralHelp), true); + AddNode(generalNode, language.UnbreakNoSpace, nameof(Configuration.Settings.Shortcuts.GeneralUnbrekNoSpace)); + AddNode(generalNode, language.ToggleBookmarks, nameof(Configuration.Settings.Shortcuts.GeneralToggleBookmarks)); + AddNode(generalNode, language.ToggleBookmarksWithComment, nameof(Configuration.Settings.Shortcuts.GeneralToggleBookmarksWithText), true); + AddNode(generalNode, language.ClearBookmarks, nameof(Configuration.Settings.Shortcuts.GeneralClearBookmarks)); + AddNode(generalNode, language.GoToBookmark, nameof(Configuration.Settings.Shortcuts.GeneralGoToBookmark)); + AddNode(generalNode, language.GoToPreviousBookmark, nameof(Configuration.Settings.Shortcuts.GeneralGoToPreviousBookmark)); + AddNode(generalNode, language.GoToNextBookmark, nameof(Configuration.Settings.Shortcuts.GeneralGoToNextBookmark)); + AddNode(generalNode, language.ChooseProfile, nameof(Configuration.Settings.Shortcuts.ChooseProfile)); + AddNode(generalNode, language.DuplicateLine, nameof(Configuration.Settings.Shortcuts.DuplicateLine)); + if (generalNode.Nodes.Count > 0) + { + _shortcuts.Nodes.Add(generalNode); + } + + var fileNode = new ShortcutNode(Configuration.Settings.Language.Main.Menu.File.Title); + AddNode(fileNode, Configuration.Settings.Language.Main.Menu.File.New, nameof(Configuration.Settings.Shortcuts.MainFileNew), true); + AddNode(fileNode, Configuration.Settings.Language.Main.Menu.File.Open, nameof(Configuration.Settings.Shortcuts.MainFileOpen), true); + AddNode(fileNode, Configuration.Settings.Language.Main.Menu.File.OpenKeepVideo, nameof(Configuration.Settings.Shortcuts.MainFileOpenKeepVideo), true); + AddNode(fileNode, Configuration.Settings.Language.Main.Menu.File.Save, nameof(Configuration.Settings.Shortcuts.MainFileSave), true); + AddNode(fileNode, Configuration.Settings.Language.Main.Menu.File.SaveAs, nameof(Configuration.Settings.Shortcuts.MainFileSaveAs), true); + AddNode(fileNode, Configuration.Settings.Language.Main.Menu.File.SaveOriginal, nameof(Configuration.Settings.Shortcuts.MainFileSaveOriginal), true); + AddNode(fileNode, Configuration.Settings.Language.Main.SaveOriginalSubtitleAs, nameof(Configuration.Settings.Shortcuts.MainFileSaveOriginalAs), true); + AddNode(fileNode, Configuration.Settings.Language.Main.Menu.File.OpenOriginal, nameof(Configuration.Settings.Shortcuts.MainFileOpenOriginal), true); + AddNode(fileNode, Configuration.Settings.Language.Main.Menu.File.CloseOriginal, nameof(Configuration.Settings.Shortcuts.MainFileCloseOriginal), true); + AddNode(fileNode, language.MainFileSaveAll, nameof(Configuration.Settings.Shortcuts.MainFileSaveAll)); + AddNode(fileNode, Configuration.Settings.Language.Main.Menu.File.Compare, nameof(Configuration.Settings.Shortcuts.MainFileCompare), true); + AddNode(fileNode, Configuration.Settings.Language.Main.Menu.File.ImportText, nameof(Configuration.Settings.Shortcuts.MainFileImportPlainText), true); + AddNode(fileNode, Configuration.Settings.Language.Main.Menu.File.ImportTimecodes, nameof(Configuration.Settings.Shortcuts.MainFileImportTimeCodes), true); + AddNode(fileNode, Configuration.Settings.Language.Main.Menu.File.Export + " -> " + Configuration.Settings.Language.Main.Menu.File.ExportEbu, nameof(Configuration.Settings.Shortcuts.MainFileExportEbu), true); + AddNode(fileNode, Configuration.Settings.Language.Main.Menu.File.Export + " -> " + Configuration.Settings.Language.Main.Menu.File.ExportPac, nameof(Configuration.Settings.Shortcuts.MainFileExportPac), true); + AddNode(fileNode, Configuration.Settings.Language.Main.Menu.File.Export + " -> " + Configuration.Settings.Language.Main.Menu.File.ExportPlainText, nameof(Configuration.Settings.Shortcuts.MainFileExportPlainText), true); + if (fileNode.Nodes.Count > 0) + { + _shortcuts.Nodes.Add(fileNode); + } + + var editNode = new ShortcutNode(Configuration.Settings.Language.Main.Menu.Edit.Title); + AddNode(editNode, Configuration.Settings.Language.Main.Menu.Edit.Undo, nameof(Configuration.Settings.Shortcuts.MainEditUndo), true); + AddNode(editNode, Configuration.Settings.Language.Main.Menu.Edit.Redo, nameof(Configuration.Settings.Shortcuts.MainEditRedo), true); + AddNode(editNode, Configuration.Settings.Language.Main.Menu.Edit.Find, nameof(Configuration.Settings.Shortcuts.MainEditFind), true); + AddNode(editNode, Configuration.Settings.Language.Main.Menu.Edit.FindNext, nameof(Configuration.Settings.Shortcuts.MainEditFindNext), true); + AddNode(editNode, Configuration.Settings.Language.Main.Menu.Edit.Replace, nameof(Configuration.Settings.Shortcuts.MainEditReplace), true); + AddNode(editNode, Configuration.Settings.Language.Main.Menu.Edit.MultipleReplace, nameof(Configuration.Settings.Shortcuts.MainEditMultipleReplace), true); + AddNode(editNode, Configuration.Settings.Language.Main.Menu.Edit.ModifySelection, nameof(Configuration.Settings.Shortcuts.MainEditModifySelection), true); + AddNode(editNode, Configuration.Settings.Language.Main.Menu.Edit.GoToSubtitleNumber, nameof(Configuration.Settings.Shortcuts.MainEditGoToLineNumber), true); + AddNode(editNode, Configuration.Settings.Language.VobSubOcr.RightToLeft, nameof(Configuration.Settings.Shortcuts.MainEditRightToLeft), true); + AddNode(editNode, language.FixRTLViaUnicodeChars, nameof(Configuration.Settings.Shortcuts.MainEditFixRTLViaUnicodeChars), true); + AddNode(editNode, language.RemoveRTLUnicodeChars, nameof(Configuration.Settings.Shortcuts.MainEditRemoveRTLUnicodeChars), true); + AddNode(editNode, language.ReverseStartAndEndingForRtl, nameof(Configuration.Settings.Shortcuts.MainEditReverseStartAndEndingForRTL), true); + AddNode(editNode, language.ToggleTranslationAndOriginalInPreviews, nameof(Configuration.Settings.Shortcuts.MainEditToggleTranslationOriginalInPreviews), true); + if (editNode.Nodes.Count > 0) + { + _shortcuts.Nodes.Add(editNode); + } + + var toolsNode = new ShortcutNode(Configuration.Settings.Language.Main.Menu.Tools.Title); + AddNode(toolsNode, Configuration.Settings.Language.Main.Menu.Tools.SubtitlesBridgeGaps, nameof(Configuration.Settings.Shortcuts.MainToolsDurationsBridgeGap), true); + AddNode(toolsNode, Configuration.Settings.Language.Main.Menu.Tools.MinimumDisplayTimeBetweenParagraphs, nameof(Configuration.Settings.Shortcuts.MainToolsMinimumDisplayTimeBetweenParagraphs), true); + AddNode(toolsNode, Configuration.Settings.Language.Main.Menu.Tools.FixCommonErrors, nameof(Configuration.Settings.Shortcuts.MainToolsFixCommonErrors), true); + AddNode(toolsNode, Configuration.Settings.Language.Main.Menu.Tools.StartNumberingFrom, nameof(Configuration.Settings.Shortcuts.MainToolsRenumber), true); + AddNode(toolsNode, Configuration.Settings.Language.Main.Menu.Tools.RemoveTextForHearingImpaired, nameof(Configuration.Settings.Shortcuts.MainToolsRemoveTextForHI), true); + AddNode(toolsNode, Configuration.Settings.Language.Main.Menu.Tools.ChangeCasing, nameof(Configuration.Settings.Shortcuts.MainToolsChangeCasing), true); + AddNode(toolsNode, Configuration.Settings.Language.Main.Menu.Tools.MakeNewEmptyTranslationFromCurrentSubtitle, nameof(Configuration.Settings.Shortcuts.MainToolsMakeEmptyFromCurrent), true); + AddNode(toolsNode, Configuration.Settings.Language.Main.Menu.Tools.MergeShortLines, nameof(Configuration.Settings.Shortcuts.MainToolsMergeShortLines), true); + AddNode(toolsNode, Configuration.Settings.Language.Main.Menu.Tools.MergeDuplicateText, nameof(Configuration.Settings.Shortcuts.MainToolsMergeDuplicateText), true); + AddNode(toolsNode, Configuration.Settings.Language.Main.Menu.Tools.MergeSameTimeCodes, nameof(Configuration.Settings.Shortcuts.MainToolsMergeSameTimeCodes), true); + AddNode(toolsNode, Configuration.Settings.Language.Main.Menu.Tools.SplitLongLines, nameof(Configuration.Settings.Shortcuts.MainToolsSplitLongLines), true); + AddNode(toolsNode, Configuration.Settings.Language.Main.Menu.Tools.BatchConvert, nameof(Configuration.Settings.Shortcuts.MainToolsBatchConvert)); + AddNode(toolsNode, Configuration.Settings.Language.Main.Menu.Tools.MeasurementConverter, nameof(Configuration.Settings.Shortcuts.MainToolsMeasurementConverter), true); + AddNode(toolsNode, Configuration.Settings.Language.Main.Menu.Tools.SplitSubtitle, nameof(Configuration.Settings.Shortcuts.MainToolsSplit), true); + AddNode(toolsNode, Configuration.Settings.Language.Main.Menu.Tools.AppendSubtitle, nameof(Configuration.Settings.Shortcuts.MainToolsAppend), true); + AddNode(toolsNode, Configuration.Settings.Language.Main.Menu.Tools.JoinSubtitles, nameof(Configuration.Settings.Shortcuts.MainToolsJoin), true); + AddNode(toolsNode, Configuration.Settings.Language.Main.Menu.ContextMenu.AutoDurationCurrentLine, nameof(Configuration.Settings.Shortcuts.MainToolsAutoDuration)); + AddNode(toolsNode, language.ShowBeamer, nameof(Configuration.Settings.Shortcuts.MainToolsBeamer)); + if (toolsNode.Nodes.Count > 0) + { + _shortcuts.Nodes.Add(toolsNode); + } + + var videoNode = new ShortcutNode(Configuration.Settings.Language.Main.Menu.Video.Title); + AddNode(videoNode, Configuration.Settings.Language.Main.Menu.Video.OpenVideo, nameof(Configuration.Settings.Shortcuts.MainVideoOpen), true); + AddNode(videoNode, Configuration.Settings.Language.Main.Menu.Video.CloseVideo, nameof(Configuration.Settings.Shortcuts.MainVideoClose), true); + AddNode(videoNode, language.TogglePlayPause, nameof(Configuration.Settings.Shortcuts.MainVideoPlayPauseToggle)); + AddNode(videoNode, language.Pause, nameof(Configuration.Settings.Shortcuts.MainVideoPause)); + AddNode(videoNode, Configuration.Settings.Language.Main.VideoControls.PlayFromJustBeforeText, nameof(Configuration.Settings.Shortcuts.MainVideoPlayFromJustBefore)); + AddNode(videoNode, Configuration.Settings.Language.Main.Menu.Video.ShowHideVideo, nameof(Configuration.Settings.Shortcuts.MainVideoShowHideVideo), true); + AddNode(videoNode, language.FoucsSetVideoPosition, nameof(Configuration.Settings.Shortcuts.MainVideoFoucsSetVideoPosition)); + AddNode(videoNode, language.ToggleDockUndockOfVideoControls, nameof(Configuration.Settings.Shortcuts.MainVideoToggleVideoControls), true); + AddNode(videoNode, language.GoBack1Frame, nameof(Configuration.Settings.Shortcuts.MainVideo1FrameLeft)); + AddNode(videoNode, language.GoForward1Frame, nameof(Configuration.Settings.Shortcuts.MainVideo1FrameRight)); + AddNode(videoNode, language.GoBack1FrameWithPlay, nameof(Configuration.Settings.Shortcuts.MainVideo1FrameLeftWithPlay)); + AddNode(videoNode, language.GoForward1FrameWithPlay, nameof(Configuration.Settings.Shortcuts.MainVideo1FrameRightWithPlay)); + AddNode(videoNode, language.GoBack100Milliseconds, nameof(Configuration.Settings.Shortcuts.MainVideo100MsLeft)); + AddNode(videoNode, language.GoForward100Milliseconds, nameof(Configuration.Settings.Shortcuts.MainVideo100MsRight)); + AddNode(videoNode, language.GoBack500Milliseconds, nameof(Configuration.Settings.Shortcuts.MainVideo500MsLeft)); + AddNode(videoNode, language.GoForward500Milliseconds, nameof(Configuration.Settings.Shortcuts.MainVideo500MsRight)); + AddNode(videoNode, language.GoBack1Second, nameof(Configuration.Settings.Shortcuts.MainVideo1000MsLeft)); + AddNode(videoNode, language.GoForward1Second, nameof(Configuration.Settings.Shortcuts.MainVideo1000MsRight)); + AddNode(videoNode, language.GoBack5Seconds, nameof(Configuration.Settings.Shortcuts.MainVideo5000MsLeft)); + AddNode(videoNode, language.GoForward5Seconds, nameof(Configuration.Settings.Shortcuts.MainVideo5000MsRight)); + AddNode(videoNode, language.GoBackXSSeconds, nameof(Configuration.Settings.Shortcuts.MainVideoXSMsLeft)); + AddNode(videoNode, language.GoForwardXSSeconds, nameof(Configuration.Settings.Shortcuts.MainVideoXSMsRight)); + AddNode(videoNode, language.GoBackXLSeconds, nameof(Configuration.Settings.Shortcuts.MainVideoXLMsLeft)); + AddNode(videoNode, language.GoForwardXLSeconds, nameof(Configuration.Settings.Shortcuts.MainVideoXLMsRight)); + AddNode(videoNode, language.GoBack3Second, nameof(Configuration.Settings.Shortcuts.MainVideo3000MsLeft)); + AddNode(videoNode, language.GoToStartCurrent, nameof(Configuration.Settings.Shortcuts.MainVideoGoToStartCurrent)); + AddNode(videoNode, language.ToggleStartEndCurrent, nameof(Configuration.Settings.Shortcuts.MainVideoToggleStartEndCurrent)); + AddNode(videoNode, language.PlayCurrent, nameof(Configuration.Settings.Shortcuts.MainVideoPlayCurrent)); + AddNode(videoNode, language.WaveformGoToPrevSubtitle, nameof(Configuration.Settings.Shortcuts.MainVideoGoToPrevSubtitle)); + AddNode(videoNode, language.WaveformGoToNextSubtitle, nameof(Configuration.Settings.Shortcuts.MainVideoGoToNextSubtitle)); + AddNode(videoNode, language.WaveformGoToPrevChapter, nameof(Configuration.Settings.Shortcuts.MainVideoGoToPrevChapter)); + AddNode(videoNode, language.WaveformGoToNextChapter, nameof(Configuration.Settings.Shortcuts.MainVideoGoToNextChapter)); + AddNode(videoNode, language.WaveformSelectNextSubtitle, nameof(Configuration.Settings.Shortcuts.MainVideoSelectNextSubtitle)); + AddNode(videoNode, language.Fullscreen, nameof(Configuration.Settings.Shortcuts.MainVideoFullscreen)); + AddNode(videoNode, language.PlayRateSlower, nameof(Configuration.Settings.Shortcuts.MainVideoSlower)); + AddNode(videoNode, language.PlayRateFaster, nameof(Configuration.Settings.Shortcuts.MainVideoFaster)); + AddNode(videoNode, language.VideoResetSpeedAndZoom, nameof(Configuration.Settings.Shortcuts.MainVideoReset)); + if (videoNode.Nodes.Count > 0) + { + _shortcuts.Nodes.Add(videoNode); + } + + var spellCheckNode = new ShortcutNode(Configuration.Settings.Language.Main.Menu.SpellCheck.Title); + AddNode(spellCheckNode, Configuration.Settings.Language.Main.Menu.SpellCheck.Title, nameof(Configuration.Settings.Shortcuts.MainSpellCheck), true); + AddNode(spellCheckNode, Configuration.Settings.Language.Main.Menu.SpellCheck.FindDoubleWords, nameof(Configuration.Settings.Shortcuts.MainSpellCheckFindDoubleWords), true); + AddNode(spellCheckNode, Configuration.Settings.Language.Main.Menu.SpellCheck.AddToNameList, nameof(Configuration.Settings.Shortcuts.MainSpellCheckAddWordToNames), true); + if (spellCheckNode.Nodes.Count > 0) + { + _shortcuts.Nodes.Add(spellCheckNode); + } + + var syncNode = new ShortcutNode(Configuration.Settings.Language.Main.Menu.Synchronization.Title); + AddNode(syncNode, Configuration.Settings.Language.Main.Menu.Synchronization.AdjustAllTimes, nameof(Configuration.Settings.Shortcuts.MainSynchronizationAdjustTimes), true); + AddNode(syncNode, Configuration.Settings.Language.Main.Menu.Synchronization.VisualSync, nameof(Configuration.Settings.Shortcuts.MainSynchronizationVisualSync), true); + AddNode(syncNode, Configuration.Settings.Language.Main.Menu.Synchronization.PointSync, nameof(Configuration.Settings.Shortcuts.MainSynchronizationPointSync), true); + AddNode(syncNode, Configuration.Settings.Language.Main.Menu.Synchronization.PointSyncViaOtherSubtitle, nameof(Configuration.Settings.Shortcuts.MainSynchronizationPointSyncViaFile), true); + AddNode(syncNode, Configuration.Settings.Language.Main.Menu.Tools.ChangeFrameRate, nameof(Configuration.Settings.Shortcuts.MainSynchronizationChangeFrameRate), true); + if (syncNode.Nodes.Count > 0) + { + _shortcuts.Nodes.Add(syncNode); + } + + var listViewAndTextBoxNode = new ShortcutNode(language.ListViewAndTextBox); + AddNode(listViewAndTextBoxNode, Configuration.Settings.Language.Main.Menu.ContextMenu.InsertAfter, nameof(Configuration.Settings.Shortcuts.MainInsertAfter)); + AddNode(listViewAndTextBoxNode, Configuration.Settings.Language.Main.Menu.ContextMenu.InsertBefore, nameof(Configuration.Settings.Shortcuts.MainInsertBefore)); + AddNode(listViewAndTextBoxNode, Configuration.Settings.Language.General.Italic, nameof(Configuration.Settings.Shortcuts.MainListViewItalic), true); + AddNode(listViewAndTextBoxNode, Configuration.Settings.Language.General.Bold, nameof(Configuration.Settings.Shortcuts.MainListViewBold), true); + AddNode(listViewAndTextBoxNode, Configuration.Settings.Language.General.Underline, nameof(Configuration.Settings.Shortcuts.MainListViewUnderline), true); + AddNode(listViewAndTextBoxNode, Configuration.Settings.Language.Main.Menu.ContextMenu.Box, nameof(Configuration.Settings.Shortcuts.MainListViewBox), true); + AddNode(listViewAndTextBoxNode, Configuration.Settings.Language.General.SplitLine.Replace("!", string.Empty), nameof(Configuration.Settings.Shortcuts.MainListViewSplit), true); + AddNode(listViewAndTextBoxNode, language.ToggleMusicSymbols, nameof(Configuration.Settings.Shortcuts.MainListViewToggleMusicSymbols), true); + AddNode(listViewAndTextBoxNode, language.AlignmentN1, nameof(Configuration.Settings.Shortcuts.MainListViewAlignmentN1)); + AddNode(listViewAndTextBoxNode, language.AlignmentN2, nameof(Configuration.Settings.Shortcuts.MainListViewAlignmentN2)); + AddNode(listViewAndTextBoxNode, language.AlignmentN3, nameof(Configuration.Settings.Shortcuts.MainListViewAlignmentN3)); + AddNode(listViewAndTextBoxNode, language.AlignmentN4, nameof(Configuration.Settings.Shortcuts.MainListViewAlignmentN4)); + AddNode(listViewAndTextBoxNode, language.AlignmentN5, nameof(Configuration.Settings.Shortcuts.MainListViewAlignmentN5)); + AddNode(listViewAndTextBoxNode, language.AlignmentN6, nameof(Configuration.Settings.Shortcuts.MainListViewAlignmentN6)); + AddNode(listViewAndTextBoxNode, language.AlignmentN7, nameof(Configuration.Settings.Shortcuts.MainListViewAlignmentN7)); + AddNode(listViewAndTextBoxNode, language.AlignmentN8, nameof(Configuration.Settings.Shortcuts.MainListViewAlignmentN8)); + AddNode(listViewAndTextBoxNode, language.AlignmentN9, nameof(Configuration.Settings.Shortcuts.MainListViewAlignmentN9)); + AddNode(listViewAndTextBoxNode, Configuration.Settings.Language.Main.Menu.ContextMenu.RemoveFormattingAll, nameof(Configuration.Settings.Shortcuts.MainRemoveFormatting), true); + AddNode(listViewAndTextBoxNode, language.RemoveTimeCodes, nameof(Configuration.Settings.Shortcuts.MainListViewRemoveTimeCodes)); + if (listViewAndTextBoxNode.Nodes.Count > 0) + { + _shortcuts.Nodes.Add(listViewAndTextBoxNode); + } + + var listViewNode = new ShortcutNode(Configuration.Settings.Language.Main.Controls.ListView); + AddNode(listViewNode, language.MergeDialog, nameof(Configuration.Settings.Shortcuts.MainMergeDialog)); + AddNode(listViewNode, language.ToggleFocus, nameof(Configuration.Settings.Shortcuts.MainToggleFocus)); + AddNode(listViewNode, language.ToggleDialogDashes, nameof(Configuration.Settings.Shortcuts.MainListViewToggleDashes)); + AddNode(listViewNode, language.Alignment, nameof(Configuration.Settings.Shortcuts.MainListViewAlignment), true); + AddNode(listViewNode, language.CopyTextOnly, nameof(Configuration.Settings.Shortcuts.MainListViewCopyText)); + AddNode(listViewNode, language.CopyTextOnlyFromOriginalToCurrent, nameof(Configuration.Settings.Shortcuts.MainListViewCopyTextFromOriginalToCurrent), true); + AddNode(listViewNode, language.AutoDurationSelectedLines, nameof(Configuration.Settings.Shortcuts.MainListViewAutoDuration)); + AddNode(listViewNode, language.ListViewColumnDelete, nameof(Configuration.Settings.Shortcuts.MainListViewColumnDeleteText), true); + AddNode(listViewNode, language.ListViewColumnDeleteAndShiftUp, nameof(Configuration.Settings.Shortcuts.MainListViewColumnDeleteTextAndShiftUp), true); + AddNode(listViewNode, language.ListViewColumnInsert, nameof(Configuration.Settings.Shortcuts.MainListViewColumnInsertText), true); + AddNode(listViewNode, language.ListViewColumnPaste, nameof(Configuration.Settings.Shortcuts.MainListViewColumnPaste), true); + AddNode(listViewNode, language.ListViewColumnTextUp, nameof(Configuration.Settings.Shortcuts.MainListViewColumnTextUp), true); + AddNode(listViewNode, language.ListViewColumnTextDown, nameof(Configuration.Settings.Shortcuts.MainListViewColumnTextDown), true); + AddNode(listViewNode, language.ListViewFocusWaveform, nameof(Configuration.Settings.Shortcuts.MainListViewFocusWaveform)); + AddNode(listViewNode, language.ListViewGoToNextError, nameof(Configuration.Settings.Shortcuts.MainListViewGoToNextError)); + if (listViewNode.Nodes.Count > 0) + { + _shortcuts.Nodes.Add(listViewNode); + } + + var textBoxNode = new ShortcutNode(language.TextBox); + AddNode(textBoxNode, Configuration.Settings.Language.Main.Menu.ContextMenu.SplitLineAtCursorPosition, nameof(Configuration.Settings.Shortcuts.MainTextBoxSplitAtCursor)); + AddNode(textBoxNode, Configuration.Settings.Language.Main.Menu.ContextMenu.SplitLineAtCursorAndWaveformPosition, nameof(Configuration.Settings.Shortcuts.MainTextBoxSplitAtCursorAndVideoPos)); + AddNode(textBoxNode, language.SplitSelectedLineBilingual, nameof(Configuration.Settings.Shortcuts.MainTextBoxSplitSelectedLineBilingual)); + AddNode(textBoxNode, language.MainTextBoxMoveLastWordDown, nameof(Configuration.Settings.Shortcuts.MainTextBoxMoveLastWordDown)); + AddNode(textBoxNode, language.MainTextBoxMoveFirstWordFromNextUp, nameof(Configuration.Settings.Shortcuts.MainTextBoxMoveFirstWordFromNextUp)); + AddNode(textBoxNode, language.MainTextBoxMoveLastWordDownCurrent, nameof(Configuration.Settings.Shortcuts.MainTextBoxMoveLastWordDownCurrent)); + AddNode(textBoxNode, language.MainTextBoxMoveFirstWordUpCurrent, nameof(Configuration.Settings.Shortcuts.MainTextBoxMoveFirstWordUpCurrent)); + AddNode(textBoxNode, language.MainTextBoxSelectionToLower, nameof(Configuration.Settings.Shortcuts.MainTextBoxSelectionToLower)); + AddNode(textBoxNode, language.MainTextBoxSelectionToUpper, nameof(Configuration.Settings.Shortcuts.MainTextBoxSelectionToUpper)); + AddNode(textBoxNode, language.MainTextBoxSelectionToggleCasing, nameof(Configuration.Settings.Shortcuts.MainTextBoxSelectionToggleCasing)); + AddNode(textBoxNode, language.MainTextBoxSelectionToRuby, nameof(Configuration.Settings.Shortcuts.MainTextBoxSelectionToRuby), true); + AddNode(textBoxNode, language.MainTextBoxToggleAutoDuration, nameof(Configuration.Settings.Shortcuts.MainTextBoxToggleAutoDuration)); + AddNode(textBoxNode, language.MainTextBoxAutoBreak, nameof(Configuration.Settings.Shortcuts.MainTextBoxAutoBreak)); + AddNode(textBoxNode, language.MainTextBoxAutoBreakFromPos, nameof(Configuration.Settings.Shortcuts.MainTextBoxBreakAtPosition)); + AddNode(textBoxNode, language.MainTextBoxAutoBreakFromPosAndGoToNext, nameof(Configuration.Settings.Shortcuts.MainTextBoxBreakAtPositionAndGoToNext)); + AddNode(textBoxNode, language.MainTextBoxUnbreak, nameof(Configuration.Settings.Shortcuts.MainTextBoxUnbreak)); + if (textBoxNode.Nodes.Count > 0) + { + _shortcuts.Nodes.Add(textBoxNode); + } + + var translateNode = new ShortcutNode(Configuration.Settings.Language.Main.VideoControls.Translate); + AddNode(translateNode, Configuration.Settings.Language.Main.VideoControls.GoogleIt, nameof(Configuration.Settings.Shortcuts.MainTranslateGoogleIt)); + AddNode(translateNode, Configuration.Settings.Language.Main.VideoControls.GoogleTranslate, nameof(Configuration.Settings.Shortcuts.MainTranslateGoogleTranslate), true); + AddNode(translateNode, language.CustomSearch1, nameof(Configuration.Settings.Shortcuts.MainTranslateCustomSearch1)); + AddNode(translateNode, language.CustomSearch2, nameof(Configuration.Settings.Shortcuts.MainTranslateCustomSearch2)); + AddNode(translateNode, language.CustomSearch3, nameof(Configuration.Settings.Shortcuts.MainTranslateCustomSearch3)); + AddNode(translateNode, language.CustomSearch4, nameof(Configuration.Settings.Shortcuts.MainTranslateCustomSearch4)); + AddNode(translateNode, language.CustomSearch5, nameof(Configuration.Settings.Shortcuts.MainTranslateCustomSearch5)); + if (translateNode.Nodes.Count > 0) + { + _shortcuts.Nodes.Add(translateNode); + } + + var createAndAdjustNode = new ShortcutNode(Configuration.Settings.Language.Main.VideoControls.CreateAndAdjust); + AddNode(createAndAdjustNode, Configuration.Settings.Language.Main.VideoControls.InsertNewSubtitleAtVideoPosition, nameof(Configuration.Settings.Shortcuts.MainCreateInsertSubAtVideoPos)); + AddNode(createAndAdjustNode, Configuration.Settings.Language.Main.VideoControls.InsertNewSubtitleAtVideoPositionNoTextBoxFocus, nameof(Configuration.Settings.Shortcuts.MainCreateInsertSubAtVideoPosNoTextBoxFocus)); + AddNode(createAndAdjustNode, language.MainCreateStartDownEndUp, nameof(Configuration.Settings.Shortcuts.MainCreateStartDownEndUp)); + AddNode(createAndAdjustNode, Configuration.Settings.Language.Main.VideoControls.SetStartTime, nameof(Configuration.Settings.Shortcuts.MainCreateSetStart)); + AddNode(createAndAdjustNode, language.AdjustSetStartTimeKeepDuration, nameof(Configuration.Settings.Shortcuts.MainAdjustSetStartKeepDuration)); + AddNode(createAndAdjustNode, Configuration.Settings.Language.Main.VideoControls.SetstartTimeAndOffsetOfRest, nameof(Configuration.Settings.Shortcuts.MainAdjustSetStartAndOffsetTheRest)); + AddNode(createAndAdjustNode, Configuration.Settings.Language.Main.VideoControls.SetstartTimeAndOffsetOfRest, nameof(Configuration.Settings.Shortcuts.MainAdjustSetStartAndOffsetTheRest2)); + AddNode(createAndAdjustNode, language.AdjustSetStartAutoDurationAndGoToNext, nameof(Configuration.Settings.Shortcuts.MainAdjustSetStartAutoDurationAndGoToNext)); + AddNode(createAndAdjustNode, language.AdjustStartDownEndUpAndGoToNext, nameof(Configuration.Settings.Shortcuts.MainAdjustStartDownEndUpAndGoToNext)); + AddNode(createAndAdjustNode, language.AdjustSetStartAndEndOfPrevious, nameof(Configuration.Settings.Shortcuts.MainAdjustSetStartAndEndOfPrevious)); + AddNode(createAndAdjustNode, language.AdjustSetStartAndEndOfPreviousAndGoToNext, nameof(Configuration.Settings.Shortcuts.MainAdjustSetStartAndEndOfPreviousAndGoToNext)); + AddNode(createAndAdjustNode, Configuration.Settings.Language.Main.VideoControls.SetEndTime, nameof(Configuration.Settings.Shortcuts.MainCreateSetEnd)); + AddNode(createAndAdjustNode, language.AdjustSetEndTimeAndPause, nameof(Configuration.Settings.Shortcuts.MainAdjustSetEndAndPause)); + AddNode(createAndAdjustNode, language.CreateSetEndAddNewAndGoToNew, nameof(Configuration.Settings.Shortcuts.MainCreateSetEndAddNewAndGoToNew)); + AddNode(createAndAdjustNode, language.AdjustSetEndTimeAndGoToNext, nameof(Configuration.Settings.Shortcuts.MainAdjustSetEndAndGotoNext)); + AddNode(createAndAdjustNode, language.AdjustSetEndAndOffsetTheRest, nameof(Configuration.Settings.Shortcuts.MainAdjustSetEndAndOffsetTheRest)); + AddNode(createAndAdjustNode, language.AdjustSetEndAndOffsetTheRestAndGoToNext, nameof(Configuration.Settings.Shortcuts.MainAdjustSetEndAndOffsetTheRestAndGoToNext)); + AddNode(createAndAdjustNode, language.AdjustSetEndNextStartAndGoToNext, nameof(Configuration.Settings.Shortcuts.MainAdjustSetEndNextStartAndGoToNext)); + AddNode(createAndAdjustNode, language.AdjustViaEndAutoStart, nameof(Configuration.Settings.Shortcuts.MainAdjustViaEndAutoStart)); + AddNode(createAndAdjustNode, language.AdjustViaEndAutoStartAndGoToNext, nameof(Configuration.Settings.Shortcuts.MainAdjustViaEndAutoStartAndGoToNext)); + AddNode(createAndAdjustNode, language.AdjustSelected100MsBack, nameof(Configuration.Settings.Shortcuts.MainAdjustSelected100MsBack)); + AddNode(createAndAdjustNode, language.AdjustSelected100MsForward, nameof(Configuration.Settings.Shortcuts.MainAdjustSelected100MsForward)); + AddNode(createAndAdjustNode, string.Format(language.AdjustStartXMsBack, Configuration.Settings.Tools.MoveStartEndMs), nameof(Configuration.Settings.Shortcuts.MainAdjustStartXMsBack)); + AddNode(createAndAdjustNode, string.Format(language.AdjustStartXMsForward, Configuration.Settings.Tools.MoveStartEndMs), nameof(Configuration.Settings.Shortcuts.MainAdjustStartXMsForward)); + AddNode(createAndAdjustNode, string.Format(language.AdjustEndXMsBack, Configuration.Settings.Tools.MoveStartEndMs), nameof(Configuration.Settings.Shortcuts.MainAdjustEndXMsBack)); + AddNode(createAndAdjustNode, string.Format(language.AdjustEndXMsForward, Configuration.Settings.Tools.MoveStartEndMs), nameof(Configuration.Settings.Shortcuts.MainAdjustEndXMsForward)); + AddNode(createAndAdjustNode, language.AdjustStartOneFrameBack, nameof(Configuration.Settings.Shortcuts.MoveStartOneFrameBack)); + AddNode(createAndAdjustNode, language.AdjustStartOneFrameForward, nameof(Configuration.Settings.Shortcuts.MoveStartOneFrameForward)); + AddNode(createAndAdjustNode, language.AdjustEndOneFrameBack, nameof(Configuration.Settings.Shortcuts.MoveEndOneFrameBack)); + AddNode(createAndAdjustNode, language.AdjustEndOneFrameForward, nameof(Configuration.Settings.Shortcuts.MoveEndOneFrameForward)); + AddNode(createAndAdjustNode, language.AdjustStartOneFrameBackKeepGapPrev, nameof(Configuration.Settings.Shortcuts.MoveStartOneFrameBackKeepGapPrev)); + AddNode(createAndAdjustNode, language.AdjustStartOneFrameForwardKeepGapPrev, nameof(Configuration.Settings.Shortcuts.MoveStartOneFrameForwardKeepGapPrev)); + AddNode(createAndAdjustNode, language.AdjustEndOneFrameBackKeepGapNext, nameof(Configuration.Settings.Shortcuts.MoveEndOneFrameBackKeepGapNext)); + AddNode(createAndAdjustNode, language.AdjustEndOneFrameForwardKeepGapNext, nameof(Configuration.Settings.Shortcuts.MoveEndOneFrameForwardKeepGapNext)); + AddNode(createAndAdjustNode, language.RecalculateDurationOfCurrentSubtitle, nameof(Configuration.Settings.Shortcuts.GeneralAutoCalcCurrentDuration)); + AddNode(createAndAdjustNode, language.AdjustSnapStartToNextSceneChange, nameof(Configuration.Settings.Shortcuts.MainAdjustSnapStartToNextSceneChange)); + AddNode(createAndAdjustNode, language.AdjustSnapStartToNextSceneChangeWithGap, nameof(Configuration.Settings.Shortcuts.MainAdjustSnapStartToNextSceneChangeWithGap)); + AddNode(createAndAdjustNode, language.AdjustSnapEndToPreviousSceneChange, nameof(Configuration.Settings.Shortcuts.MainAdjustSnapEndToPreviousSceneChange)); + AddNode(createAndAdjustNode, language.AdjustSnapEndToPreviousSceneChangeWithGap, nameof(Configuration.Settings.Shortcuts.MainAdjustSnapEndToPreviousSceneChangeWithGap)); + AddNode(createAndAdjustNode, language.AdjustExtendToNextSceneChange, nameof(Configuration.Settings.Shortcuts.MainAdjustExtendToNextSceneChange)); + AddNode(createAndAdjustNode, language.AdjustExtendToNextSceneChangeWithGap, nameof(Configuration.Settings.Shortcuts.MainAdjustExtendToNextSceneChangeWithGap)); + AddNode(createAndAdjustNode, language.AdjustExtendToPreviousSceneChange, nameof(Configuration.Settings.Shortcuts.MainAdjustExtendToPreviousSceneChange)); + AddNode(createAndAdjustNode, language.AdjustExtendToPreviousSceneChangeWithGap, nameof(Configuration.Settings.Shortcuts.MainAdjustExtendToPreviousSceneChangeWithGap)); + AddNode(createAndAdjustNode, language.AdjustExtendToNextSubtitle, nameof(Configuration.Settings.Shortcuts.MainAdjustExtendToNextSubtitle)); + AddNode(createAndAdjustNode, language.AdjustExtendToPreviousSubtitle, nameof(Configuration.Settings.Shortcuts.MainAdjustExtendToPreviousSubtitle)); + AddNode(createAndAdjustNode, language.AdjustExtendCurrentSubtitle, nameof(Configuration.Settings.Shortcuts.MainAdjustExtendCurrentSubtitle)); + AddNode(createAndAdjustNode, language.AdjustExtendPreviousLineEndToCurrentStart, nameof(Configuration.Settings.Shortcuts.MainAdjustExtendPreviousLineEndToCurrentStart)); + AddNode(createAndAdjustNode, language.AdjustExtendNextLineStartToCurrentEnd, nameof(Configuration.Settings.Shortcuts.MainAdjustExtendNextLineStartToCurrentEnd)); + if (createAndAdjustNode.Nodes.Count > 0) + { + _shortcuts.Nodes.Add(createAndAdjustNode); + } + + var audioVisualizerNode = new ShortcutNode(language.WaveformAndSpectrogram); + AddNode(audioVisualizerNode, Configuration.Settings.Language.Waveform.ClickToAddWaveformAndSpectrogram, nameof(Configuration.Settings.Shortcuts.WaveformAdd)); + AddNode(audioVisualizerNode, Configuration.Settings.Language.Waveform.ZoomIn, nameof(Configuration.Settings.Shortcuts.WaveformZoomIn)); + AddNode(audioVisualizerNode, Configuration.Settings.Language.Waveform.ZoomOut, nameof(Configuration.Settings.Shortcuts.WaveformZoomOut)); + AddNode(audioVisualizerNode, language.VerticalZoom, nameof(Configuration.Settings.Shortcuts.WaveformVerticalZoom)); + AddNode(audioVisualizerNode, language.VerticalZoomOut, nameof(Configuration.Settings.Shortcuts.WaveformVerticalZoomOut)); + AddNode(audioVisualizerNode, Configuration.Settings.Language.Main.Menu.ContextMenu.Split, nameof(Configuration.Settings.Shortcuts.WaveformSplit)); + AddNode(audioVisualizerNode, language.WaveformSeekSilenceForward, nameof(Configuration.Settings.Shortcuts.WaveformSearchSilenceForward)); + AddNode(audioVisualizerNode, language.WaveformSeekSilenceBack, nameof(Configuration.Settings.Shortcuts.WaveformSearchSilenceBack)); + AddNode(audioVisualizerNode, language.WaveformAddTextHere, nameof(Configuration.Settings.Shortcuts.WaveformAddTextHere)); + AddNode(audioVisualizerNode, language.WaveformAddTextHereFromClipboard, nameof(Configuration.Settings.Shortcuts.WaveformAddTextHereFromClipboard)); + AddNode(audioVisualizerNode, language.SetParagraphAsSelection, nameof(Configuration.Settings.Shortcuts.WaveformSetParagraphAsSelection)); + AddNode(audioVisualizerNode, language.WaveformPlayNewSelection, nameof(Configuration.Settings.Shortcuts.WaveformPlaySelection)); + AddNode(audioVisualizerNode, language.WaveformPlayNewSelectionEnd, nameof(Configuration.Settings.Shortcuts.WaveformPlaySelectionEnd)); + AddNode(audioVisualizerNode, Configuration.Settings.Language.Main.VideoControls.InsertNewSubtitleAtVideoPosition, nameof(Configuration.Settings.Shortcuts.MainWaveformInsertAtCurrentPosition)); + AddNode(audioVisualizerNode, language.WaveformFocusListView, nameof(Configuration.Settings.Shortcuts.WaveformFocusListView)); + AddNode(audioVisualizerNode, language.WaveformGoToPreviousSceneChange, nameof(Configuration.Settings.Shortcuts.WaveformGoToPreviousSceneChange)); + AddNode(audioVisualizerNode, language.WaveformGoToNextSceneChange, nameof(Configuration.Settings.Shortcuts.WaveformGoToNextSceneChange)); + AddNode(audioVisualizerNode, language.WaveformToggleSceneChange, nameof(Configuration.Settings.Shortcuts.WaveformToggleSceneChange)); + AddNode(audioVisualizerNode, language.WaveformGuessStart, nameof(Configuration.Settings.Shortcuts.WaveformGuessStart)); + AddNode(audioVisualizerNode, language.GoBack100Milliseconds, nameof(Configuration.Settings.Shortcuts.Waveform100MsLeft)); + AddNode(audioVisualizerNode, language.GoForward100Milliseconds, nameof(Configuration.Settings.Shortcuts.Waveform100MsRight)); + AddNode(audioVisualizerNode, language.GoBack1Second, nameof(Configuration.Settings.Shortcuts.Waveform1000MsLeft)); + AddNode(audioVisualizerNode, language.GoForward1Second, nameof(Configuration.Settings.Shortcuts.Waveform1000MsRight)); + if (audioVisualizerNode.Nodes.Count > 0) + { + _shortcuts.Nodes.Add(audioVisualizerNode); + } + } + + private void ShowShortcutsTreeView() + { + treeViewShortcuts.BeginUpdate(); + treeViewShortcuts.Nodes.Clear(); + + foreach (var parent in _shortcuts.Nodes) + { + var parentNode = new TreeNode(parent.Text); + foreach (ShortcutNode node in parent.Nodes) + { + AddNode(parentNode, node.Text, node.Shortcut); + } + if (parentNode.Nodes.Count > 0) + { + treeViewShortcuts.Nodes.Add(parentNode); + } + } + foreach (TreeNode node in treeViewShortcuts.Nodes) + { + node.Text = node.Text.RemoveChar('&'); + foreach (TreeNode subNode in node.Nodes) + { + subNode.Text = subNode.Text.RemoveChar('&'); + foreach (TreeNode subSubNode in subNode.Nodes) + { + subSubNode.Text = subSubNode.Text.RemoveChar('&'); + } + } + } + + treeViewShortcuts.ExpandAll(); + treeViewShortcuts.EndUpdate(); + if (treeViewShortcuts.Nodes.Count > 0) + { + treeViewShortcuts.SelectedNode = treeViewShortcuts.Nodes[0]; + } + } + + private void AddNode(TreeNode parentNode, string text, ShortcutHelper shortcut) + { + var normalizeAmpersand = text.Replace("&&", "@_____@").Replace("&", string.Empty).Replace("@_____@", "&"); + if (textBoxShortcutSearch.Left < 2 || normalizeAmpersand.Contains(textBoxShortcutSearch.Text, StringComparison.OrdinalIgnoreCase)) + { + parentNode.Nodes.Add(new TreeNode(text) { Tag = shortcut }); + } + } + + private void AddNode(ShortcutNode node, string text, string shortcut, bool isMenuItem = false) + { + var prop = Configuration.Settings.Shortcuts.GetType().GetProperty(shortcut); + if (prop != null) + { + var s = text + GetShortcutText((string)prop.GetValue(Configuration.Settings.Shortcuts, null)); + node.Nodes.Add(new ShortcutNode(s) { Shortcut = new ShortcutHelper(prop, isMenuItem), ShortcutText = shortcut }); + } + } + + private static string GetShortcutText(string shortcut) + { + if (string.IsNullOrEmpty(shortcut)) + { + shortcut = Configuration.Settings.Language.General.None; + } + + return $" [{shortcut}]"; + } + + private void InitializeWaveformsAndSpectrogramsFolderEmpty(LanguageStructure.Settings language) + { + string waveformsFolder = Configuration.WaveformsDirectory.TrimEnd(Path.DirectorySeparatorChar); + string spectrogramsFolder = Configuration.SpectrogramsDirectory.TrimEnd(Path.DirectorySeparatorChar); + long bytes = 0; + int count = 0; + + if (Directory.Exists(waveformsFolder)) + { + var di = new DirectoryInfo(waveformsFolder); + + // waveform data + bytes = 0; + count = 0; + foreach (FileInfo fi in di.GetFiles("*.wav")) + { + bytes += fi.Length; + count++; + } + } + + if (Directory.Exists(spectrogramsFolder)) + { + var di = new DirectoryInfo(spectrogramsFolder); + + // spectrogram data + foreach (var dir in di.GetDirectories()) + { + var spectrogramDir = new DirectoryInfo(dir.FullName); + foreach (var fi in spectrogramDir.GetFiles("*.gif")) + { + bytes += fi.Length; + count++; + } + foreach (var fi in spectrogramDir.GetFiles("*.db")) + { + bytes += fi.Length; + count++; + } + string xmlFileName = Path.Combine(dir.FullName, "Info.xml"); + if (File.Exists(xmlFileName)) + { + var fi = new FileInfo(xmlFileName); + bytes += fi.Length; + count++; + } + } + } + + if (count > 0) + { + buttonWaveformsFolderEmpty.Enabled = true; + labelWaveformsFolderInfo.Text = string.Format(language.WaveformAndSpectrogramsFolderInfo, count, bytes / 1024.0 / 1024.0); + } + else + { + buttonWaveformsFolderEmpty.Enabled = false; + labelWaveformsFolderInfo.Text = string.Format(language.WaveformAndSpectrogramsFolderInfo, 0, 0); + } + } + + public void Initialize(Icon icon, Image newFile, Image openFile, Image saveFile, Image saveFileAs, Image find, Image replace, Image fixCommonErrors, Image removeTextForHi, + Image visualSync, Image spellCheck, Image netflixGlyphCheck, Image settings, Image help) + { + Icon = (Icon)icon.Clone(); + pictureBoxNew.Image = (Image)newFile.Clone(); + pictureBoxOpen.Image = (Image)openFile.Clone(); + pictureBoxSave.Image = (Image)saveFile.Clone(); + pictureBoxSaveAs.Image = (Image)saveFileAs.Clone(); + pictureBoxFind.Image = (Image)find.Clone(); + pictureBoxReplace.Image = (Image)replace.Clone(); + pictureBoxTBFixCommonErrors.Image = (Image)fixCommonErrors.Clone(); + pictureBoxTBRemoveTextForHi.Image = (Image)removeTextForHi.Clone(); + pictureBoxVisualSync.Image = (Image)visualSync.Clone(); + pictureBoxSpellCheck.Image = (Image)spellCheck.Clone(); + pictureBoxNetflixQualityCheck.Image = (Image)netflixGlyphCheck.Clone(); + pictureBoxSettings.Image = (Image)settings.Clone(); + pictureBoxHelp.Image = (Image)help.Clone(); + } + + private void InitComboBoxWordListLanguages() + { + //Examples: da_DK_user.xml, eng_OCRFixReplaceList.xml, en_names.xml + string dir = Utilities.DictionaryFolder; + if (Directory.Exists(dir)) + { + var cultures = new List(); + // Specific culture e.g: en-US, en-GB... + foreach (var culture in CultureInfo.GetCultures(CultureTypes.SpecificCultures)) + { + if (File.Exists(Path.Combine(dir, culture.Name.Replace('-', '_') + "_user.xml"))) + { + if (!cultures.Contains(culture)) + { + cultures.Add(culture); + } + } + } + // Neutral culture e.g: "en" for all (en-US, en-GB, en-JM...) + foreach (var culture in CultureInfo.GetCultures(CultureTypes.NeutralCultures)) + { + string ocrFixGeneralFile = Path.Combine(dir, culture.GetThreeLetterIsoLanguageName() + "_OCRFixReplaceList.xml"); + string ocrFixUserFile = Path.Combine(dir, culture.GetThreeLetterIsoLanguageName() + "_OCRFixReplaceList_User.xml"); + string namesFile = Path.Combine(dir, culture.TwoLetterISOLanguageName + "_names.xml"); + if (File.Exists(ocrFixGeneralFile) || File.Exists(ocrFixUserFile) || File.Exists(namesFile)) + { + bool alreadyInList = false; + foreach (var ci in cultures) + { + // If culture is already added to the list, it doesn't matter if it's "culture specific" do not re-add. + if (ci.GetThreeLetterIsoLanguageName().Equals(culture.GetThreeLetterIsoLanguageName(), StringComparison.Ordinal)) + { + alreadyInList = true; + break; + } + } + if (!alreadyInList) + { + cultures.Add(culture); + } + } + } + + // English is the default selected language + Configuration.Settings.WordLists.LastLanguage = Configuration.Settings.WordLists.LastLanguage ?? "en-US"; + comboBoxWordListLanguage.BeginUpdate(); + var list = new List(cultures.Count); + var idx = 0; + for (var index = 0; index < cultures.Count; index++) + { + var ci = cultures[index]; + list.Add(new ComboBoxLanguage { CultureInfo = ci }); + if (ci.Name.Equals(Configuration.Settings.WordLists.LastLanguage, StringComparison.Ordinal)) + { + idx = index; + } + } + comboBoxWordListLanguage.Items.AddRange(list.ToArray()); + if (comboBoxWordListLanguage.Items.Count > 0) + { + comboBoxWordListLanguage.SelectedIndex = idx; + } + comboBoxWordListLanguage.EndUpdate(); + } + else + { + groupBoxWordLists.Enabled = false; + } + } + + private void ButtonOkClick(object sender, EventArgs e) + { + var gs = Configuration.Settings.General; + + gs.ShowToolbarNew = checkBoxToolbarNew.Checked; + gs.ShowToolbarOpen = checkBoxToolbarOpen.Checked; + gs.ShowToolbarSave = checkBoxToolbarSave.Checked; + gs.ShowToolbarSaveAs = checkBoxToolbarSaveAs.Checked; + gs.ShowToolbarFind = checkBoxToolbarFind.Checked; + gs.ShowToolbarReplace = checkBoxReplace.Checked; + gs.ShowToolbarFixCommonErrors = checkBoxTBFixCommonErrors.Checked; + gs.ShowToolbarRemoveTextForHi = checkBoxTBRemoveTextForHi.Checked; + gs.ShowToolbarVisualSync = checkBoxVisualSync.Checked; + gs.ShowToolbarSettings = checkBoxSettings.Checked; + gs.ShowToolbarSpellCheck = checkBoxSpellCheck.Checked; + gs.ShowToolbarNetflixGlyphCheck = checkBoxNetflixQualityCheck.Checked; + gs.ShowToolbarHelp = checkBoxHelp.Checked; + + gs.ShowFrameRate = checkBoxShowFrameRate.Checked; + if (double.TryParse(comboBoxFrameRate.Text.Replace(',', '.').Replace(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, "."), NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var outFrameRate)) + { + gs.DefaultFrameRate = outFrameRate; + } + + gs.DefaultEncoding = ((TextEncoding)comboBoxEncoding.Items[comboBoxEncoding.SelectedIndex]).ToString(); + + gs.AutoGuessAnsiEncoding = checkBoxAutoDetectAnsiEncoding.Checked; + gs.SubtitleTextBoxFontSize = int.Parse(comboBoxSubtitleFontSize.Text); + gs.SubtitleListViewFontSize = int.Parse(comboBoxSubtitleListViewFontSize.Text); + gs.SubtitleTextBoxFontBold = checkBoxSubtitleFontBold.Checked; + gs.SubtitleTextBoxSyntaxColor = checkBoxSubtitleTextBoxSyntaxColor.Checked; + gs.SubtitleTextBoxHtmlColor = panelTextBoxHtmlColor.BackColor; + gs.SubtitleTextBoxAssColor = panelTextBoxAssColor.BackColor; + gs.SubtitleListViewFontBold = checkBoxSubtitleListViewFontBold.Checked; + gs.CenterSubtitleInTextBox = checkBoxSubtitleCenter.Checked; + gs.SubtitleFontColor = panelSubtitleFontColor.BackColor; + gs.SubtitleBackgroundColor = panelSubtitleBackgroundColor.BackColor; + gs.ShowRecentFiles = checkBoxRememberRecentFiles.Checked; + gs.RememberSelectedLine = checkBoxRememberSelectedLine.Checked; + gs.StartLoadLastFile = checkBoxReopenLastOpened.Checked; + gs.StartRememberPositionAndSize = checkBoxRememberWindowPosition.Checked; + gs.StartInSourceView = checkBoxStartInSourceView.Checked; + gs.RemoveBlankLinesWhenOpening = checkBoxRemoveBlankLinesWhenOpening.Checked; + gs.ListViewLineSeparatorString = textBoxShowLineBreaksAs.Text; + if (string.IsNullOrWhiteSpace(gs.ListViewLineSeparatorString)) + { + gs.ListViewLineSeparatorString = "
"; + } + + gs.ListViewDoubleClickAction = comboBoxListViewDoubleClickEvent.SelectedIndex; + + gs.Profiles = _rulesProfiles; + + gs.SaveAsUseFileNameFrom = comboBoxSaveAsFileNameFrom.SelectedIndex == 0 ? "video" : "file"; + + gs.SubtitleMinimumDisplayMilliseconds = (int)numericUpDownDurationMin.Value; + gs.SubtitleMaximumDisplayMilliseconds = (int)numericUpDownDurationMax.Value; + gs.MinimumMillisecondsBetweenLines = (int)numericUpDownMinGapMs.Value; + gs.CurrentProfile = comboBoxRulesProfileName.Text; + + if (comboBoxAutoBackup.SelectedIndex == 1) + { + gs.AutoBackupSeconds = 60; + } + else if (comboBoxAutoBackup.SelectedIndex == 2) + { + gs.AutoBackupSeconds = 60 * 5; + } + else if (comboBoxAutoBackup.SelectedIndex == 3) + { + gs.AutoBackupSeconds = 60 * 15; + } + else + { + gs.AutoBackupSeconds = 0; + } + + if (comboBoxAutoBackupDeleteAfter.SelectedIndex == 2) + { + gs.AutoBackupDeleteAfterMonths = 6; + } + else if (comboBoxAutoBackupDeleteAfter.SelectedIndex == 1) + { + gs.AutoBackupDeleteAfterMonths = 3; + } + else + { + gs.AutoBackupDeleteAfterMonths = 1; + } + + gs.CheckForUpdates = checkBoxCheckForUpdates.Checked; + gs.AutoSave = checkBoxAutoSave.Checked; + + if (comboBoxTimeCodeMode.Visible) + { + gs.UseTimeFormatHHMMSSFF = comboBoxTimeCodeMode.SelectedIndex == 1; + } + + gs.SplitBehavior = comboBoxSplitBehavior.SelectedIndex; + + gs.SpellChecker = comboBoxSpellChecker.SelectedIndex == 1 ? "word" : "hunspell"; + + gs.AllowEditOfOriginalSubtitle = checkBoxAllowEditOfOriginalSubtitle.Checked; + gs.PromptDeleteLines = checkBoxPromptDeleteLines.Checked; + + if (radioButtonVideoPlayerMPV.Checked) + { + gs.VideoPlayer = "MPV"; + } + else if (radioButtonVideoPlayerMpcHc.Checked) + { + gs.VideoPlayer = "MPC-HC"; + } + else if (radioButtonVideoPlayerVLC.Checked) + { + gs.VideoPlayer = "VLC"; + } + else + { + gs.VideoPlayer = "DirectShow"; + } + + gs.MpvHandlesPreviewText = checkBoxMpvHandlesPreviewText.Checked; + gs.VlcLocation = textBoxVlcPath.Text; + + gs.VideoPlayerShowStopButton = checkBoxVideoPlayerShowStopButton.Checked; + gs.VideoPlayerShowMuteButton = checkBoxVideoPlayerShowMuteButton.Checked; + gs.VideoPlayerShowFullscreenButton = checkBoxVideoPlayerShowFullscreenButton.Checked; + gs.VideoPlayerPreviewFontSize = int.Parse(comboBoxlVideoPlayerPreviewFontSize.Items[0].ToString()) + comboBoxlVideoPlayerPreviewFontSize.SelectedIndex; + gs.VideoPlayerPreviewFontBold = checkBoxVideoPlayerPreviewFontBold.Checked; + gs.DisableVideoAutoLoading = !checkBoxVideoAutoOpen.Checked; + gs.AllowVolumeBoost = checkBoxAllowVolumeBoost.Checked; + + Configuration.Settings.VideoControls.CustomSearchText1 = comboBoxCustomSearch1.Text; + Configuration.Settings.VideoControls.CustomSearchText2 = comboBoxCustomSearch2.Text; + Configuration.Settings.VideoControls.CustomSearchText3 = comboBoxCustomSearch3.Text; + Configuration.Settings.VideoControls.CustomSearchText4 = comboBoxCustomSearch4.Text; + Configuration.Settings.VideoControls.CustomSearchText5 = comboBoxCustomSearch5.Text; + Configuration.Settings.VideoControls.CustomSearchUrl1 = textBoxCustomSearchUrl1.Text; + Configuration.Settings.VideoControls.CustomSearchUrl2 = textBoxCustomSearchUrl2.Text; + Configuration.Settings.VideoControls.CustomSearchUrl3 = textBoxCustomSearchUrl3.Text; + Configuration.Settings.VideoControls.CustomSearchUrl4 = textBoxCustomSearchUrl4.Text; + Configuration.Settings.VideoControls.CustomSearchUrl5 = textBoxCustomSearchUrl5.Text; + + int maxLength = (int)numericUpDownSubtitleLineMaximumLength.Value; + if (maxLength > 9 && maxLength < 1000) + { + gs.SubtitleLineMaximumLength = maxLength; + } + else if (maxLength > 999) + { + gs.SubtitleLineMaximumLength = 999; + } + else + { + gs.SubtitleLineMaximumLength = 45; + } + + gs.SubtitleOptimalCharactersPerSeconds = (double)numericUpDownOptimalCharsSec.Value; + gs.SubtitleMaximumCharactersPerSeconds = (double)numericUpDownMaxCharsSec.Value; + gs.SubtitleMaximumWordsPerMinute = (double)numericUpDownMaxWordsMin.Value; + gs.MaxNumberOfLines = (int)numericUpDownMaxNumberOfLines.Value; + + gs.AutoWrapLineWhileTyping = checkBoxAutoWrapWhileTyping.Checked; + + if (comboBoxSubtitleFont.SelectedItem != null) + { + gs.SubtitleFontName = comboBoxSubtitleFont.SelectedItem.ToString(); + } + + var toolsSettings = Configuration.Settings.Tools; + toolsSettings.VerifyPlaySeconds = comboBoxToolsVerifySeconds.SelectedIndex + 2; + toolsSettings.StartSceneIndex = comboBoxToolsStartSceneIndex.SelectedIndex; + toolsSettings.EndSceneIndex = comboBoxToolsEndSceneIndex.SelectedIndex; + gs.MergeLinesShorterThan = comboBoxMergeShortLineLength.SelectedIndex + 5; + if (gs.MergeLinesShorterThan > gs.SubtitleLineMaximumLength + 1) + { + gs.MergeLinesShorterThan = gs.SubtitleLineMaximumLength; + } + + gs.DialogStyle = DialogSplitMerge.GetDialogStyleFromIndex(comboBoxDialogStyle.SelectedIndex); + gs.ContinuationStyle = ContinuationUtilities.GetContinuationStyleFromIndex(comboBoxContinuationStyle.SelectedIndex); + + toolsSettings.MusicSymbol = comboBoxToolsMusicSymbol.SelectedItem.ToString(); + toolsSettings.MusicSymbolReplace = textBoxMusicSymbolsToReplace.Text; + toolsSettings.SpellCheckAutoChangeNames = checkBoxSpellCheckAutoChangeNames.Checked; + toolsSettings.SpellCheckAutoChangeNamesUseSuggestions = checkBoxSpellCheckAutoChangeNamesViaSuggestions.Checked; + toolsSettings.CheckOneLetterWords = checkBoxSpellCheckOneLetterWords.Checked; + toolsSettings.SpellCheckEnglishAllowInQuoteAsIng = checkBoxTreatINQuoteAsING.Checked; + toolsSettings.RememberUseAlwaysList = checkBoxUseAlwaysToFile.Checked; + toolsSettings.UseNoLineBreakAfter = checkBoxUseDoNotBreakAfterList.Checked; + toolsSettings.AutoBreakCommaBreakEarly = checkBoxToolsBreakEarlyComma.Checked; + toolsSettings.AutoBreakLineEndingEarly = checkBoxToolsBreakEarlyLineEnding.Checked; + toolsSettings.AutoBreakUsePixelWidth = checkBoxToolsBreakByPixelWidth.Checked; + toolsSettings.AutoBreakPreferBottomHeavy = checkBoxToolsBreakPreferBottomHeavy.Checked; + toolsSettings.AutoBreakPreferBottomPercent = (double)numericUpDownToolsBreakPreferBottomHeavy.Value; + toolsSettings.AutoBreakDashEarly = checkBoxToolsBreakEarlyDash.Checked; + + Configuration.Settings.General.CharactersPerSecondsIgnoreWhiteSpace = !checkBoxCpsIncludeWhiteSpace.Checked; + toolsSettings.OcrFixUseHardcodedRules = checkBoxFixCommonOcrErrorsUsingHardcodedRules.Checked; + toolsSettings.FixShortDisplayTimesAllowMoveStartTime = checkBoxFixShortDisplayTimesAllowMoveStartTime.Checked; + toolsSettings.FixCommonErrorsSkipStepOne = checkBoxFceSkipStep1.Checked; + toolsSettings.MicrosoftTranslatorApiKey = textBoxBingClientSecret.Text.Trim(); + toolsSettings.MicrosoftTranslatorTokenEndpoint = comboBoxBoxBingTokenEndpoint.Text.Trim(); + toolsSettings.GoogleApiV2Key = textBoxGoogleTransleApiKey.Text.Trim(); + + var wordListSettings = Configuration.Settings.WordLists; + wordListSettings.UseOnlineNames = checkBoxNamesOnline.Checked; + wordListSettings.NamesUrl = textBoxNamesOnline.Text; + if (comboBoxWordListLanguage.Items.Count > 0 && comboBoxWordListLanguage.SelectedIndex >= 0) + { + if (comboBoxWordListLanguage.Items[comboBoxWordListLanguage.SelectedIndex] is ComboBoxLanguage ci) + { + Configuration.Settings.WordLists.LastLanguage = ci.CultureInfo.Name; + } + } + + var ssa = Configuration.Settings.SubtitleSettings; + ssa.SsaFontName = _ssaFontName; + ssa.SsaFontSize = _ssaFontSize; + ssa.SsaFontColorArgb = _ssaFontColor; + ssa.SsaFontBold = checkBoxSsaFontBold.Checked; + ssa.SsaOutline = (int)numericUpDownSsaOutline.Value; + ssa.SsaShadow = (int)numericUpDownSsaShadow.Value; + ssa.SsaOpaqueBox = checkBoxSsaOpaqueBox.Checked; + ssa.SsaMarginLeft = (int)numericUpDownSsaMarginLeft.Value; + ssa.SsaMarginRight = (int)numericUpDownSsaMarginRight.Value; + ssa.SsaMarginTopBottom = (int)numericUpDownSsaMarginVertical.Value; + + var proxy = Configuration.Settings.Proxy; + proxy.ProxyAddress = textBoxProxyAddress.Text; + proxy.UserName = textBoxProxyUserName.Text; + if (string.IsNullOrWhiteSpace(textBoxProxyPassword.Text)) + { + proxy.Password = null; + } + else + { + proxy.EncodePassword(textBoxProxyPassword.Text); + } + + proxy.Domain = textBoxProxyDomain.Text; + + Configuration.Settings.NetworkSettings.NewMessageSound = textBoxNetworkSessionNewMessageSound.Text; + + Configuration.Settings.Tools.ListViewSyntaxColorDurationSmall = checkBoxSyntaxColorDurationTooSmall.Checked; + Configuration.Settings.Tools.ListViewSyntaxColorDurationBig = checkBoxSyntaxColorDurationTooLarge.Checked; + Configuration.Settings.Tools.ListViewSyntaxColorLongLines = checkBoxSyntaxColorTextTooLong.Checked; + Configuration.Settings.Tools.ListViewSyntaxColorWideLines = checkBoxSyntaxColorTextTooWide.Checked; + Configuration.Settings.Tools.ListViewSyntaxMoreThanXLines = checkBoxSyntaxColorTextMoreThanTwoLines.Checked; + Configuration.Settings.Tools.ListViewSyntaxColorOverlap = checkBoxSyntaxOverlap.Checked; + Configuration.Settings.Tools.ListViewSyntaxColorGap = checkBoxSyntaxColorGapTooSmall.Checked; + Configuration.Settings.Tools.ListViewSyntaxErrorColor = panelListViewSyntaxColorError.BackColor; + + Configuration.Settings.VideoControls.WaveformDrawGrid = checkBoxWaveformShowGrid.Checked; + Configuration.Settings.VideoControls.WaveformDrawCps = checkBoxWaveformShowCps.Checked; + Configuration.Settings.VideoControls.WaveformDrawWpm = checkBoxWaveformShowWpm.Checked; + Configuration.Settings.VideoControls.WaveformGridColor = panelWaveformGridColor.BackColor; + Configuration.Settings.VideoControls.WaveformSelectedColor = panelWaveformSelectedColor.BackColor; + Configuration.Settings.VideoControls.WaveformColor = panelWaveformColor.BackColor; + Configuration.Settings.VideoControls.WaveformBackgroundColor = panelWaveformBackgroundColor.BackColor; + Configuration.Settings.VideoControls.WaveformTextColor = panelWaveformTextColor.BackColor; + Configuration.Settings.VideoControls.WaveformCursorColor = panelWaveformCursorColor.BackColor; + Configuration.Settings.VideoControls.GenerateSpectrogram = checkBoxGenerateSpectrogram.Checked; + Configuration.Settings.VideoControls.SpectrogramAppearance = comboBoxSpectrogramAppearance.SelectedIndex == 0 ? "OneColorGradient" : "Classic"; + + Configuration.Settings.VideoControls.WaveformTextSize = int.Parse(comboBoxWaveformTextSize.Text); + Configuration.Settings.VideoControls.WaveformTextBold = checkBoxWaveformTextBold.Checked; + Configuration.Settings.VideoControls.WaveformMouseWheelScrollUpIsForward = checkBoxReverseMouseWheelScrollDirection.Checked; + Configuration.Settings.VideoControls.WaveformAllowOverlap = checkBoxAllowOverlap.Checked; + Configuration.Settings.VideoControls.WaveformSetVideoPositionOnMoveStartEnd = checkBoxWaveformSetVideoPosMoveStartEnd.Checked; + Configuration.Settings.VideoControls.WaveformFocusOnMouseEnter = checkBoxWaveformHoverFocus.Checked; + Configuration.Settings.VideoControls.WaveformListViewFocusOnMouseEnter = checkBoxListViewMouseEnterFocus.Checked; + Configuration.Settings.VideoControls.WaveformSingleClickSelect = checkBoxWaveformSingleClickSelect.Checked; + Configuration.Settings.VideoControls.WaveformSnapToSceneChanges = checkBoxWaveformSnapToSceneChanges.Checked; + Configuration.Settings.VideoControls.WaveformBorderHitMs = Convert.ToInt32(numericUpDownWaveformBorderHitMs.Value); + gs.UseFFmpegForWaveExtraction = checkBoxUseFFmpeg.Checked; + gs.FFmpegLocation = textBoxFFmpegPath.Text; + + // save shortcuts + foreach (var kvp in _newShortcuts) + { + kvp.Key.Shortcut.SetValue(Configuration.Settings.Shortcuts, kvp.Value, null); + } + + Configuration.Settings.Save(); + } + + private void FormSettings_KeyDown(object sender, KeyEventArgs e) + { + if (comboBoxShortcutKey.Focused) + { + return; + } + + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + else if (e.KeyCode == UiUtil.HelpKeys) + { + Utilities.ShowHelp("#Settings"); + e.SuppressKeyPress = true; + } + } + + private void UpdateSsaExample() + { + GeneratePreviewReal(); + } + + private void GeneratePreviewReal() + { + if (_loading) + { + return; + } + + pictureBoxPreview.Image?.Dispose(); + var backgroundImage = TextDesigner.MakeBackgroundImage(pictureBoxPreview.Width, pictureBoxPreview.Height, 9, _backgroundImageDark); + var outlineWidth = (float)numericUpDownSsaOutline.Value; + var shadowWidth = (float)numericUpDownSsaShadow.Value; + var outlineColor = Color.Black; + + Font font; + try + { + font = new Font(comboBoxFontName.Text, (float)numericUpDownFontSize.Value * 1.1f, checkBoxSsaFontBold.Checked ? FontStyle.Bold : FontStyle.Regular); + } + catch + { + font = new Font(Font, FontStyle.Regular); + } + + var measureBmp = TextDesigner.MakeTextBitmapAssa( + Configuration.Settings.General.PreviewAssaText, + 0, + 0, + font, + pictureBoxPreview.Width, + pictureBoxPreview.Height, + outlineWidth, + shadowWidth, + null, + panelPrimaryColor.BackColor, + outlineColor, + Color.FromArgb(100, Color.Black), + checkBoxSsaOpaqueBox.Checked); + var nBmp = new NikseBitmap(measureBmp); + var measuredWidth = nBmp.GetNonTransparentWidth(); + var measuredHeight = nBmp.GetNonTransparentHeight(); + + float left = (pictureBoxPreview.Width - measuredWidth) / 2.0f; + float top = pictureBoxPreview.Height - measuredHeight - (int)numericUpDownSsaMarginVertical.Value; + var designedText = TextDesigner.MakeTextBitmapAssa( + Configuration.Settings.General.PreviewAssaText, + (int)Math.Round(left), + (int)Math.Round(top), + font, + pictureBoxPreview.Width, + pictureBoxPreview.Height, + outlineWidth, + shadowWidth, + backgroundImage, + panelPrimaryColor.BackColor, + Color.Black, + Color.FromArgb(200, Color.Black), + checkBoxSsaOpaqueBox.Checked); + + pictureBoxPreview.Image?.Dispose(); + pictureBoxPreview.Image = designedText; + font.Dispose(); + } + + private void ComboBoxWordListLanguageSelectedIndexChanged(object sender, EventArgs e) + { + buttonRemoveNameEtc.Enabled = false; + buttonAddNames.Enabled = false; + buttonRemoveUserWord.Enabled = false; + buttonAddUserWord.Enabled = false; + buttonRemoveOcrFix.Enabled = false; + buttonAddOcrFix.Enabled = false; + listBoxNames.Items.Clear(); + listBoxUserWordLists.Items.Clear(); + listBoxOcrFixList.Items.Clear(); + if (comboBoxWordListLanguage.Items.Count > 0 && comboBoxWordListLanguage.Items[comboBoxWordListLanguage.SelectedIndex] is ComboBoxLanguage) + { + string language = GetCurrentWordListLanguage(); + + buttonAddNames.Enabled = true; + buttonAddUserWord.Enabled = true; + buttonAddOcrFix.Enabled = true; + + // user word list + LoadUserWords(language, true); + + // OCR fix words + LoadOcrFixList(true); + + LoadNames(language, true); + } + } + + private void LoadOcrFixList(bool reloadListBox) + { + if (comboBoxWordListLanguage.Items.Count == 0 || !(comboBoxWordListLanguage.Items[comboBoxWordListLanguage.SelectedIndex] is ComboBoxLanguage cb)) + { + return; + } + + _ocrFixReplaceList = OcrFixReplaceList.FromLanguageId(cb.CultureInfo.GetThreeLetterIsoLanguageName()); + if (reloadListBox) + { + listBoxOcrFixList.BeginUpdate(); + listBoxOcrFixList.Items.Clear(); + listBoxOcrFixList.Items.AddRange(_ocrFixReplaceList.WordReplaceList.Select(p => p.Key + " --> " + p.Value).ToArray()); + listBoxOcrFixList.Items.AddRange(_ocrFixReplaceList.PartialLineWordBoundaryReplaceList.Select(p => p.Key + " --> " + p.Value).ToArray()); + listBoxOcrFixList.Sorted = true; + listBoxOcrFixList.EndUpdate(); + } + } + + private void LoadUserWords(string language, bool reloadListBox) + { + _userWordList = new List(); + Utilities.LoadUserWordList(_userWordList, language); + _userWordList.Sort(); + + if (reloadListBox) + { + listBoxUserWordLists.Items.Clear(); + listBoxUserWordLists.Items.AddRange(_userWordList.ToArray()); + } + } + + private void LoadNames(string language, bool reloadListBox) + { + var task = Task.Factory.StartNew(() => + { + // names etc + var nameList = new NameList(Configuration.DictionariesDirectory, language, Configuration.Settings.WordLists.UseOnlineNames, Configuration.Settings.WordLists.NamesUrl); + _wordListNames = nameList.GetAllNames(); + _wordListNames.Sort(); + return _wordListNames; + }); + + if (reloadListBox) + { + // reload the listbox on a continuation ui thead + var uiContext = TaskScheduler.FromCurrentSynchronizationContext(); + task.ContinueWith(originalTask => + { + listBoxNames.BeginUpdate(); + listBoxNames.Items.Clear(); + listBoxNames.Items.AddRange(originalTask.Result.ToArray()); + listBoxNames.EndUpdate(); + }, uiContext); + } + } + + private string GetCurrentWordListLanguage() + { + var idx = comboBoxWordListLanguage.SelectedIndex; + if (idx < 0) + { + return null; + } + + var cb = comboBoxWordListLanguage.Items[idx] as ComboBoxLanguage; + return cb?.CultureInfo.Name.Replace('-', '_'); + } + + private void ButtonAddNamesClick(object sender, EventArgs e) + { + var languageIndex = comboBoxWordListLanguage.SelectedIndex; + if (languageIndex < 0) + { + return; + } + + string language = GetCurrentWordListLanguage(); + string text = textBoxNameEtc.Text.RemoveControlCharacters().Trim(); + if (!string.IsNullOrEmpty(language) && text.Length > 1 && !_wordListNames.Contains(text)) + { + var nameList = new NameList(Configuration.DictionariesDirectory, language, Configuration.Settings.WordLists.UseOnlineNames, Configuration.Settings.WordLists.NamesUrl); + nameList.Add(text); + LoadNames(language, true); + labelStatus.Text = string.Format(Configuration.Settings.Language.Settings.WordAddedX, text); + textBoxNameEtc.Text = string.Empty; + textBoxNameEtc.Focus(); + for (int i = 0; i < listBoxNames.Items.Count; i++) + { + if (listBoxNames.Items[i].ToString() == text) + { + listBoxNames.SelectedIndex = i; + int top = i - 5; + if (top < 0) + { + top = 0; + } + + listBoxNames.TopIndex = top; + break; + } + } + } + else + { + MessageBox.Show(Configuration.Settings.Language.Settings.WordAlreadyExists); + } + } + + private void ListBoxNamesSelectedIndexChanged(object sender, EventArgs e) + { + buttonRemoveNameEtc.Enabled = listBoxNames.SelectedIndex >= 0; + } + + private void ButtonRemoveNameEtcClick(object sender, EventArgs e) + { + if (listBoxNames.SelectedIndices.Count == 0) + { + return; + } + + string language = GetCurrentWordListLanguage(); + int index = listBoxNames.SelectedIndex; + string text = listBoxNames.Items[index].ToString(); + int itemsToRemoveCount = listBoxNames.SelectedIndices.Count; + if (!string.IsNullOrEmpty(language) && index >= 0) + { + DialogResult result; + if (itemsToRemoveCount == 1) + { + result = MessageBox.Show(string.Format(Configuration.Settings.Language.Settings.RemoveX, text), "Subtitle Edit", MessageBoxButtons.YesNo); + } + else + { + result = MessageBox.Show(string.Format(Configuration.Settings.Language.Main.DeleteXLinesPrompt, itemsToRemoveCount), "Subtitle Edit", MessageBoxButtons.YesNo); + } + + if (result == DialogResult.Yes) + { + int removeCount = 0; + var namesList = new NameList(Configuration.DictionariesDirectory, language, Configuration.Settings.WordLists.UseOnlineNames, Configuration.Settings.WordLists.NamesUrl); + for (int idx = listBoxNames.SelectedIndices.Count - 1; idx >= 0; idx--) + { + index = listBoxNames.SelectedIndices[idx]; + text = listBoxNames.Items[index].ToString(); + namesList.Remove(text); + removeCount++; + listBoxNames.Items.RemoveAt(index); + } + + if (removeCount > 0) + { + LoadNames(language, true); // reload + + if (index < listBoxNames.Items.Count) + { + listBoxNames.SelectedIndex = index; + } + else if (listBoxNames.Items.Count > 0) + { + listBoxNames.SelectedIndex = index - 1; + } + + listBoxNames.Focus(); + + buttonRemoveNameEtc.Enabled = false; + return; + } + + if (removeCount < itemsToRemoveCount && Configuration.Settings.WordLists.UseOnlineNames && !string.IsNullOrEmpty(Configuration.Settings.WordLists.NamesUrl)) + { + MessageBox.Show(Configuration.Settings.Language.Settings.CannotUpdateNamesOnline); + return; + } + + if (removeCount == 0) + { + MessageBox.Show(Configuration.Settings.Language.Settings.WordNotFound); + } + } + } + } + + private void TextBoxNameEtcKeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + e.SuppressKeyPress = true; + ButtonAddNamesClick(null, null); + } + } + + private void ButtonAddUserWordClick(object sender, EventArgs e) + { + var languageIndex = comboBoxWordListLanguage.SelectedIndex; + if (languageIndex < 0) + { + return; + } + + string language = GetCurrentWordListLanguage(); + string text = textBoxUserWord.Text.RemoveControlCharacters().Trim().ToLowerInvariant(); + if (!string.IsNullOrEmpty(language) && text.Length > 0 && !_userWordList.Contains(text)) + { + Utilities.AddToUserDictionary(text, language); + LoadUserWords(language, true); + labelStatus.Text = string.Format(Configuration.Settings.Language.Settings.WordAddedX, text); + textBoxUserWord.Text = string.Empty; + textBoxUserWord.Focus(); + + for (int i = 0; i < listBoxUserWordLists.Items.Count; i++) + { + if (listBoxUserWordLists.Items[i].ToString() == text) + { + listBoxUserWordLists.SelectedIndex = i; + int top = i - 5; + if (top < 0) + { + top = 0; + } + + listBoxUserWordLists.TopIndex = top; + break; + } + } + } + else + { + MessageBox.Show(Configuration.Settings.Language.Settings.WordAlreadyExists); + } + } + + private void TextBoxUserWordKeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + e.SuppressKeyPress = true; + ButtonAddUserWordClick(null, null); + } + } + + private void ButtonRemoveUserWordClick(object sender, EventArgs e) + { + if (listBoxUserWordLists.SelectedIndices.Count == 0) + { + return; + } + + string language = GetCurrentWordListLanguage(); + int index = listBoxUserWordLists.SelectedIndex; + int itemsToRemoveCount = listBoxUserWordLists.SelectedIndices.Count; + string text = listBoxUserWordLists.Items[index].ToString(); + if (!string.IsNullOrEmpty(language) && index >= 0) + { + DialogResult result; + if (itemsToRemoveCount == 1) + { + result = MessageBox.Show(string.Format(Configuration.Settings.Language.Settings.RemoveX, text), "Subtitle Edit", MessageBoxButtons.YesNo); + } + else + { + result = MessageBox.Show(string.Format(Configuration.Settings.Language.Main.DeleteXLinesPrompt, itemsToRemoveCount), "Subtitle Edit", MessageBoxButtons.YesNo); + } + + if (result == DialogResult.Yes) + { + int removeCount = 0; + var words = new List(); + string userWordFileName = Utilities.LoadUserWordList(words, language); + + for (int idx = listBoxUserWordLists.SelectedIndices.Count - 1; idx >= 0; idx--) + { + index = listBoxUserWordLists.SelectedIndices[idx]; + text = listBoxUserWordLists.Items[index].ToString(); + + if (words.Contains(text)) + { + words.Remove(text); + removeCount++; + } + listBoxUserWordLists.Items.RemoveAt(index); + } + + if (removeCount > 0) + { + words.Sort(); + var doc = new XmlDocument(); + doc.Load(userWordFileName); + doc.DocumentElement.RemoveAll(); + foreach (string word in words) + { + XmlNode node = doc.CreateElement("word"); + node.InnerText = word; + doc.DocumentElement.AppendChild(node); + } + doc.Save(userWordFileName); + LoadUserWords(language, false); // reload + buttonRemoveUserWord.Enabled = false; + + if (index < listBoxUserWordLists.Items.Count) + { + listBoxUserWordLists.SelectedIndex = index; + } + else if (listBoxUserWordLists.Items.Count > 0) + { + listBoxUserWordLists.SelectedIndex = index - 1; + } + + listBoxUserWordLists.Focus(); + return; + } + + if (removeCount < itemsToRemoveCount) + { + MessageBox.Show(Configuration.Settings.Language.Settings.WordNotFound); + } + } + } + } + + private void ListBoxUserWordListsSelectedIndexChanged(object sender, EventArgs e) + { + buttonRemoveUserWord.Enabled = listBoxUserWordLists.SelectedIndex >= 0; + } + + private void ButtonAddOcrFixClick(object sender, EventArgs e) + { + string key = textBoxOcrFixKey.Text.RemoveControlCharacters().Trim(); + string value = textBoxOcrFixValue.Text.RemoveControlCharacters().Trim(); + if (key.Length == 0 || value.Length == 0 || key == value || Utilities.IsInteger(key)) + { + return; + } + + if (comboBoxWordListLanguage.Items.Count == 0 || !(comboBoxWordListLanguage.Items[comboBoxWordListLanguage.SelectedIndex] is ComboBoxLanguage)) + { + return; + } + + var added = _ocrFixReplaceList.AddWordOrPartial(key, value); + if (!added) + { + MessageBox.Show(Configuration.Settings.Language.Settings.WordAlreadyExists); + return; + } + + LoadOcrFixList(true); + textBoxOcrFixKey.Text = string.Empty; + textBoxOcrFixValue.Text = string.Empty; + textBoxOcrFixKey.Focus(); + + for (int i = 0; i < listBoxOcrFixList.Items.Count; i++) + { + if (listBoxOcrFixList.Items[i].ToString() == key + " --> " + value) + { + listBoxOcrFixList.SelectedIndex = i; + int top = i - 5; + if (top < 0) + { + top = 0; + } + + listBoxOcrFixList.TopIndex = top; + break; + } + } + } + + private void ListBoxOcrFixListSelectedIndexChanged(object sender, EventArgs e) + { + buttonRemoveOcrFix.Enabled = listBoxOcrFixList.SelectedIndex >= 0; + } + + private void ButtonRemoveOcrFixClick(object sender, EventArgs e) + { + var languageIndex = comboBoxWordListLanguage.SelectedIndex; + if (languageIndex < 0) + { + return; + } + + if (!(comboBoxWordListLanguage.Items[languageIndex] is ComboBoxLanguage)) + { + return; + } + + if (listBoxOcrFixList.SelectedIndices.Count == 0) + { + return; + } + + int itemsToRemoveCount = listBoxOcrFixList.SelectedIndices.Count; + + int index = listBoxOcrFixList.SelectedIndex; + string text = listBoxOcrFixList.Items[index].ToString(); + string key = text.Substring(0, text.IndexOf(" --> ", StringComparison.Ordinal)); + + if (_ocrFixReplaceList.WordReplaceList.ContainsKey(key) || _ocrFixReplaceList.PartialLineWordBoundaryReplaceList.ContainsKey(key)) + { + DialogResult result; + if (itemsToRemoveCount == 1) + { + result = MessageBox.Show(string.Format(Configuration.Settings.Language.Settings.RemoveX, text), "Subtitle Edit", MessageBoxButtons.YesNo); + } + else + { + result = MessageBox.Show(string.Format(Configuration.Settings.Language.Main.DeleteXLinesPrompt, itemsToRemoveCount), "Subtitle Edit", MessageBoxButtons.YesNo); + } + + if (result == DialogResult.Yes) + { + listBoxOcrFixList.BeginUpdate(); + for (int idx = listBoxOcrFixList.SelectedIndices.Count - 1; idx >= 0; idx--) + { + index = listBoxOcrFixList.SelectedIndices[idx]; + text = listBoxOcrFixList.Items[index].ToString(); + key = text.Substring(0, text.IndexOf(" --> ", StringComparison.Ordinal)); + + if (_ocrFixReplaceList.WordReplaceList.ContainsKey(key) || _ocrFixReplaceList.PartialLineWordBoundaryReplaceList.ContainsKey(key)) + { + _ocrFixReplaceList.RemoveWordOrPartial(key); + } + listBoxOcrFixList.Items.RemoveAt(index); + } + listBoxOcrFixList.EndUpdate(); + + LoadOcrFixList(false); + buttonRemoveOcrFix.Enabled = false; + + if (index < listBoxOcrFixList.Items.Count) + { + listBoxOcrFixList.SelectedIndex = index; + } + else if (listBoxOcrFixList.Items.Count > 0) + { + listBoxOcrFixList.SelectedIndex = index - 1; + } + + listBoxOcrFixList.Focus(); + } + } + } + + private void TextBoxOcrFixValueKeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + e.SuppressKeyPress = true; + ButtonAddOcrFixClick(null, null); + } + } + + private void TabControlSettingsSelectedIndexChanged(object sender, EventArgs e) + { + labelStatus.Text = string.Empty; + } + + private void ListBoxKeyDownSearch(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape || + e.KeyCode == Keys.Tab || + e.KeyCode == Keys.Return || + e.KeyCode == Keys.Enter || + e.KeyCode == Keys.Down || + e.KeyCode == Keys.Up || + e.KeyCode == Keys.PageDown || + e.KeyCode == Keys.PageUp || + e.KeyCode == Keys.None || + e.KeyCode == UiUtil.HelpKeys || + e.KeyCode == Keys.Home || + e.KeyCode == Keys.End) + { + return; + } + + if (TimeSpan.FromTicks(_listBoxSearchStringLastUsed.Ticks).TotalMilliseconds + 1800 < + TimeSpan.FromTicks(DateTime.Now.Ticks).TotalMilliseconds) + { + _listBoxSearchString = string.Empty; + } + + if (e.KeyCode == Keys.Delete) + { + if (_listBoxSearchString.Length > 0) + { + _listBoxSearchString = _listBoxSearchString.Remove(_listBoxSearchString.Length - 1, 1); + } + } + else + { + _listBoxSearchString += e.KeyCode.ToString(); + } + + _listBoxSearchStringLastUsed = DateTime.Now; + FindAndSelectListBoxItem(sender as ListBox); + e.SuppressKeyPress = true; + } + + private void FindAndSelectListBoxItem(ListBox listBox) + { + int i = 0; + foreach (string s in listBox.Items) + { + if (s.StartsWith(_listBoxSearchString, StringComparison.OrdinalIgnoreCase)) + { + listBox.SelectedIndex = i; + break; + } + i++; + } + } + + private void ListBoxSearchReset(object sender, EventArgs e) + { + _listBoxSearchString = string.Empty; + } + + private void comboBoxCustomSearch_SelectedIndexChanged(object sender, EventArgs e) + { + var cb = (ComboBox)sender; + var tb = textBoxCustomSearchUrl1; + if (cb == comboBoxCustomSearch2) + { + tb = textBoxCustomSearchUrl2; + } + else if (cb == comboBoxCustomSearch3) + { + tb = textBoxCustomSearchUrl3; + } + else if (cb == comboBoxCustomSearch4) + { + tb = textBoxCustomSearchUrl4; + } + else if (cb == comboBoxCustomSearch5) + { + tb = textBoxCustomSearchUrl5; + } + + if (cb.SelectedIndex >= 0) + { + if (cb.SelectedIndex == 0) + { + tb.Text = "https://www.dictionary.com/browse/{0}"; + } + else if (cb.SelectedIndex == 1) + { + tb.Text = "http://www.learnersdictionary.com/search/{0}"; + } + else if (cb.SelectedIndex == 2) + { + tb.Text = "https://www.merriam-webster.com/dictionary/{0}"; + } + else if (cb.SelectedIndex == 3) + { + tb.Text = "https://www.thefreedictionary.com/{0}"; + } + else if (cb.SelectedIndex == 4) + { + tb.Text = "https://www.thesaurus.com/browse/{0}"; + } + else if (cb.SelectedIndex == 5) + { + tb.Text = "https://www.urbandictionary.com/define.php?term={0}"; + } + else if (cb.SelectedIndex == 6) + { + tb.Text = "https://visuwords.com/?word={0}"; + } + else if (cb.SelectedIndex == 7) + { + tb.Text = "https://en.wikipedia.org/wiki?search={0}"; + } + } + } + + private void buttonWaveformSelectedColor_Click(object sender, EventArgs e) + { + colorDialogSSAStyle.Color = panelWaveformSelectedColor.BackColor; + if (colorDialogSSAStyle.ShowDialog() == DialogResult.OK) + { + panelWaveformSelectedColor.BackColor = colorDialogSSAStyle.Color; + } + } + + private void buttonWaveformColor_Click(object sender, EventArgs e) + { + colorDialogSSAStyle.Color = panelWaveformColor.BackColor; + if (colorDialogSSAStyle.ShowDialog() == DialogResult.OK) + { + panelWaveformColor.BackColor = colorDialogSSAStyle.Color; + } + } + + private void buttonWaveformBackgroundColor_Click(object sender, EventArgs e) + { + colorDialogSSAStyle.Color = panelWaveformBackgroundColor.BackColor; + if (colorDialogSSAStyle.ShowDialog() == DialogResult.OK) + { + panelWaveformBackgroundColor.BackColor = colorDialogSSAStyle.Color; + } + } + + private void buttonWaveformGridColor_Click(object sender, EventArgs e) + { + colorDialogSSAStyle.Color = panelWaveformGridColor.BackColor; + if (colorDialogSSAStyle.ShowDialog() == DialogResult.OK) + { + panelWaveformGridColor.BackColor = colorDialogSSAStyle.Color; + } + } + + private void buttonWaveformTextColor_Click(object sender, EventArgs e) + { + colorDialogSSAStyle.Color = panelWaveformTextColor.BackColor; + if (colorDialogSSAStyle.ShowDialog() == DialogResult.OK) + { + panelWaveformTextColor.BackColor = colorDialogSSAStyle.Color; + } + } + + private void buttonWaveformCursorColor_Click(object sender, EventArgs e) + { + colorDialogSSAStyle.Color = panelWaveformCursorColor.BackColor; + if (colorDialogSSAStyle.ShowDialog() == DialogResult.OK) + { + panelWaveformCursorColor.BackColor = colorDialogSSAStyle.Color; + } + } + + private void buttonWaveformsFolderEmpty_Click(object sender, EventArgs e) + { + string waveformsFolder = Configuration.WaveformsDirectory.TrimEnd(Path.DirectorySeparatorChar); + if (Directory.Exists(waveformsFolder)) + { + var di = new DirectoryInfo(waveformsFolder); + + foreach (var fileName in di.GetFiles("*.wav")) + { + try + { + File.Delete(fileName.FullName); + } + catch (Exception exception) + { + MessageBox.Show(exception.Message); + } + } + } + + string spectrogramsFolder = Configuration.SpectrogramsDirectory.TrimEnd(Path.DirectorySeparatorChar); + if (Directory.Exists(spectrogramsFolder)) + { + var di = new DirectoryInfo(spectrogramsFolder); + + foreach (var dir in di.GetDirectories()) + { + var spectrogramDir = new DirectoryInfo(dir.FullName); + foreach (var fileName in spectrogramDir.GetFiles("*.gif")) + { + File.Delete(fileName.FullName); + } + string imageDbFileName = Path.Combine(dir.FullName, "Images.db"); + if (File.Exists(imageDbFileName)) + { + File.Delete(imageDbFileName); + } + + string xmlFileName = Path.Combine(dir.FullName, "Info.xml"); + if (File.Exists(xmlFileName)) + { + File.Delete(xmlFileName); + } + + Directory.Delete(dir.FullName); + } + } + + InitializeWaveformsAndSpectrogramsFolderEmpty(Configuration.Settings.Language.Settings); + } + + private void checkBoxRememberRecentFiles_CheckedChanged(object sender, EventArgs e) + { + checkBoxReopenLastOpened.Enabled = checkBoxRememberRecentFiles.Checked; + checkBoxRememberSelectedLine.Enabled = checkBoxRememberRecentFiles.Checked; + } + + private void buttonWaveformSelectedColor_Click(object sender, MouseEventArgs e) + { + colorDialogSSAStyle.Color = panelWaveformSelectedColor.BackColor; + if (colorDialogSSAStyle.ShowDialog() == DialogResult.OK) + { + panelWaveformSelectedColor.BackColor = colorDialogSSAStyle.Color; + } + } + + private void panelSubtitleFontColor_Click(object sender, EventArgs e) + { + colorDialogSSAStyle.Color = panelSubtitleFontColor.BackColor; + if (colorDialogSSAStyle.ShowDialog() == DialogResult.OK) + { + panelSubtitleFontColor.BackColor = colorDialogSSAStyle.Color; + } + } + + private void panelSubtitleBackgroundColor_Click(object sender, EventArgs e) + { + colorDialogSSAStyle.Color = panelSubtitleBackgroundColor.BackColor; + if (colorDialogSSAStyle.ShowDialog() == DialogResult.OK) + { + panelSubtitleBackgroundColor.BackColor = colorDialogSSAStyle.Color; + } + } + + private void treeViewShortcuts_AfterSelect(object sender, TreeViewEventArgs e) + { + if (e?.Node?.Nodes.Count == 0) + { + checkBoxShortcutsControl.Checked = false; + checkBoxShortcutsAlt.Checked = false; + checkBoxShortcutsShift.Checked = false; + + checkBoxShortcutsControl.Enabled = true; + checkBoxShortcutsAlt.Enabled = true; + checkBoxShortcutsShift.Enabled = true; + + comboBoxShortcutKey.SelectedIndex = 0; + + comboBoxShortcutKey.Enabled = true; + buttonUpdateShortcut.Enabled = true; + buttonClearShortcut.Enabled = true; + + string shortcut = GetShortcut(e.Node.Text); + + string[] parts = shortcut.ToLowerInvariant().Split(new[] { '+' }, StringSplitOptions.RemoveEmptyEntries); + foreach (string k in parts) + { + if (k.Equals("CONTROL", StringComparison.OrdinalIgnoreCase)) + { + checkBoxShortcutsControl.Checked = true; + } + else if (k.Equals("ALT", StringComparison.OrdinalIgnoreCase)) + { + checkBoxShortcutsAlt.Checked = true; + } + else if (k.Equals("SHIFT", StringComparison.OrdinalIgnoreCase)) + { + checkBoxShortcutsShift.Checked = true; + } + else + { + int i = 0; + foreach (string value in comboBoxShortcutKey.Items) + { + if (value.Equals(k, StringComparison.OrdinalIgnoreCase)) + { + comboBoxShortcutKey.SelectedIndex = i; + break; + } + i++; + } + } + } + } + } + + private static string GetShortcut(string text) + { + string shortcut = text.Substring(text.IndexOf('[')); + shortcut = shortcut.TrimEnd(']').TrimStart('['); + if (shortcut == Configuration.Settings.Language.General.None) + { + return string.Empty; + } + + return shortcut; + } + + private string GetCurrentShortcutText() + { + var sb = new StringBuilder(@"["); + if (checkBoxShortcutsControl.Checked) + { + sb.Append("Control+"); + } + + if (checkBoxShortcutsAlt.Checked) + { + sb.Append("Alt+"); + } + + if (checkBoxShortcutsShift.Checked) + { + sb.Append("Shift+"); + } + + sb.Append(comboBoxShortcutKey.Items[comboBoxShortcutKey.SelectedIndex]); + sb.Append(']'); + return sb.ToString(); + } + + private void buttonUpdateShortcut_Click(object sender, EventArgs e) + { + if (!IsShortcutValid()) + { + return; + } + + string text = treeViewShortcuts.SelectedNode.Text.Substring(0, treeViewShortcuts.SelectedNode.Text.IndexOf('[')).Trim(); + var shortcutText = GetCurrentShortcutText(); + var existsIn = new StringBuilder(); + var sh = (ShortcutHelper)treeViewShortcuts.SelectedNode.Tag; + foreach (ShortcutNode parent in _shortcuts.Nodes) + { + foreach (ShortcutNode subNode in parent.Nodes) + { + if (sh != null && subNode.Shortcut.Shortcut.Name == sh.Shortcut.Name) + { + subNode.Text = text + " " + shortcutText; + } + else if (subNode.Text.Contains(shortcutText) && treeViewShortcuts.SelectedNode.Text != subNode.Text) + { + existsIn.AppendLine(string.Format(Configuration.Settings.Language.Settings.ShortcutIsAlreadyDefinedX, parent.Text + " -> " + subNode.Text)); + } + } + } + if (existsIn.Length > 0 && comboBoxShortcutKey.SelectedIndex > 0) + { + if (MessageBox.Show(existsIn.ToString(), string.Empty, MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.Cancel) + { + return; + } + } + treeViewShortcuts.SelectedNode.Text = text + " " + shortcutText; + AddToSaveList((ShortcutHelper)treeViewShortcuts.SelectedNode.Tag, shortcutText); + treeViewShortcuts.Focus(); + } + + private void AddToSaveList(ShortcutHelper helper, string shortcutText) + { + if (_newShortcuts.ContainsKey(helper)) + { + _newShortcuts[helper] = GetShortcut(shortcutText); + } + else + { + _newShortcuts.Add(helper, GetShortcut(shortcutText)); + } + } + + private void buttonListViewSyntaxColorError_Click(object sender, EventArgs e) + { + colorDialogSSAStyle.Color = panelListViewSyntaxColorError.BackColor; + if (colorDialogSSAStyle.ShowDialog() == DialogResult.OK) + { + panelListViewSyntaxColorError.BackColor = colorDialogSSAStyle.Color; + } + } + + private void comboBoxShortcutKey_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Tab || + e.KeyCode == Keys.Down || + e.KeyCode == Keys.Up || + e.KeyCode == Keys.Enter || + e.KeyCode == Keys.None) + { + return; + } + + int i = 0; + foreach (var item in comboBoxShortcutKey.Items) + { + if (item.ToString() == e.KeyCode.ToString()) + { + comboBoxShortcutKey.SelectedIndex = i; + e.SuppressKeyPress = true; + return; + } + i++; + } + } + + private void numericUpDownSsaOutline_ValueChanged(object sender, EventArgs e) + { + UpdateSsaExample(); + } + + private void numericUpDownSsaShadow_ValueChanged(object sender, EventArgs e) + { + UpdateSsaExample(); + } + + private void checkBoxSsaOpaqueBox_CheckedChanged(object sender, EventArgs e) + { + numericUpDownSsaOutline.Enabled = !checkBoxSsaOpaqueBox.Checked; + numericUpDownSsaShadow.Enabled = !checkBoxSsaOpaqueBox.Checked; + UpdateSsaExample(); + } + + private void buttonBrowseToFFmpeg_Click(object sender, EventArgs e) + { + openFileDialogFFmpeg.FileName = string.Empty; + openFileDialogFFmpeg.Title = Configuration.Settings.Language.Settings.WaveformBrowseToFFmpeg; + if (Configuration.IsRunningOnWindows) + { + openFileDialogFFmpeg.Filter = "FFmpeg (ffmpeg.exe)|ffmpeg.exe"; + } + if (openFileDialogFFmpeg.ShowDialog(this) == DialogResult.OK) + { + textBoxFFmpegPath.Text = openFileDialogFFmpeg.FileName; + } + } + + private void checkBoxWaveformHoverFocus_CheckedChanged(object sender, EventArgs e) + { + checkBoxListViewMouseEnterFocus.Enabled = checkBoxWaveformHoverFocus.Checked; + } + + private void buttonVlcPathBrowse_Click(object sender, EventArgs e) + { + openFileDialogFFmpeg.FileName = string.Empty; + openFileDialogFFmpeg.Title = Configuration.Settings.Language.Settings.WaveformBrowseToVLC; + if (Configuration.IsRunningOnWindows) + { + openFileDialogFFmpeg.Filter = $"{Configuration.Settings.Language.Settings.VlcMediaPlayer} (vlc.exe)|vlc.exe"; + } + if (openFileDialogFFmpeg.ShowDialog(this) == DialogResult.OK) + { + EnableVlc(openFileDialogFFmpeg.FileName); + } + } + + private void EnableVlc(string fileName) + { + textBoxVlcPath.Text = Path.GetDirectoryName(fileName); + Configuration.Settings.General.VlcLocation = textBoxVlcPath.Text; + Configuration.Settings.General.VlcLocationRelative = GetRelativePath(textBoxVlcPath.Text); + radioButtonVideoPlayerVLC.Enabled = LibVlcDynamic.IsInstalled; + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + Configuration.Settings.General.VlcLocation = _oldVlcLocation; + Configuration.Settings.General.VlcLocationRelative = _oldVlcLocationRelative; + Configuration.Settings.Tools.ListViewShowColumnCharsPerSec = _oldListViewShowCps; + Configuration.Settings.Tools.ListViewShowColumnWordsPerMin = _oldListViewShowWpm; + + DialogResult = DialogResult.Cancel; + } + + private void buttonEditDoNotBreakAfterList_Click(object sender, EventArgs e) + { + using (var form = new DoNotBreakAfterListEdit()) + { + form.ShowDialog(this); + } + } + + private void linkLabelOpenDictionaryFolder_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + string dictionaryFolder = Utilities.DictionaryFolder; + if (!Directory.Exists(dictionaryFolder)) + { + Directory.CreateDirectory(dictionaryFolder); + } + + UiUtil.OpenFolder(dictionaryFolder); + } + + private void textBoxVlcPath_MouseLeave(object sender, EventArgs e) + { + try + { + var path = textBoxVlcPath.Text.Trim('\"'); + if (path.Length > 3 && Path.IsPathRooted(path) && Path.GetFileName(path).Equals("vlc.exe", StringComparison.OrdinalIgnoreCase) && File.Exists(path)) + { + EnableVlc(path); + } + } + catch + { + // ignored + } + } + + private void buttonNetworkSessionNewMessageSound_Click(object sender, EventArgs e) + { + openFileDialogFFmpeg.FileName = string.Empty; + openFileDialogFFmpeg.Title = Configuration.Settings.Language.Settings.WaveformBrowseToFFmpeg; + openFileDialogFFmpeg.Filter = $"{Configuration.Settings.Language.General.AudioFiles} (*.wav)|*.wav"; + if (openFileDialogFFmpeg.ShowDialog(this) == DialogResult.OK) + { + textBoxNetworkSessionNewMessageSound.Text = openFileDialogFFmpeg.FileName; + } + } + + private void panelPrimaryColor_MouseClick(object sender, MouseEventArgs e) + { + colorDialogSSAStyle.Color = Color.FromArgb(_ssaFontColor); + if (colorDialogSSAStyle.ShowDialog() == DialogResult.OK) + { + _ssaFontColor = colorDialogSSAStyle.Color.ToArgb(); + panelPrimaryColor.BackColor = colorDialogSSAStyle.Color; + UpdateSsaExample(); + } + } + + private void numericUpDownSsaMarginVertical_ValueChanged(object sender, EventArgs e) + { + UpdateSsaExample(); + } + + private void comboBoxFontName_TextChanged(object sender, EventArgs e) + { + _ssaFontName = comboBoxFontName.Text; + UpdateSsaExample(); + } + + private void numericUpDownFontSize_ValueChanged(object sender, EventArgs e) + { + _ssaFontSize = (int)numericUpDownFontSize.Value; + UpdateSsaExample(); + } + + private void buttonSsaColor_Click(object sender, EventArgs e) + { + panelPrimaryColor_MouseClick(sender, null); + } + + private void checkBoxSsaFontBold_CheckedChanged(object sender, EventArgs e) + { + UpdateSsaExample(); + } + + private void buttonMpvSettings_Click(object sender, EventArgs e) + { + using (var form = new SettingsMpv(LibMpvDynamic.IsInstalled)) + { + var oldMpvEnabled = radioButtonVideoPlayerMPV.Enabled; + if (form.ShowDialog(this) == DialogResult.OK) + { + RefreshMpvSettings(); + if (radioButtonVideoPlayerMPV.Enabled && !oldMpvEnabled) + { + radioButtonVideoPlayerMPV.Checked = true; + } + } + else + { + RefreshMpvSettings(); + } + } + } + + private void RefreshMpvSettings() + { + radioButtonVideoPlayerMPV.Enabled = LibMpvDynamic.IsInstalled; + checkBoxMpvHandlesPreviewText.Enabled = radioButtonVideoPlayerMPV.Enabled; + if (!radioButtonVideoPlayerMPV.Enabled) + { + buttonMpvSettings.Font = new Font(buttonMpvSettings.Font.FontFamily, buttonMpvSettings.Font.Size, FontStyle.Bold); + } + + labelMpvSettings.Text = "--vo=" + Configuration.Settings.General.MpvVideoOutputWindows; + } + + private void linkLabelBingSubscribe_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + UiUtil.OpenURL(MicrosoftTranslator.SignUpUrl); + } + + private void ValidateShortcut(object sender, EventArgs e) + { + buttonUpdateShortcut.Enabled = IsShortcutValid(); + } + + private bool IsShortcutValid() + { + if (treeViewShortcuts.SelectedNode == null || !treeViewShortcuts.SelectedNode.Text.Contains('[')) + { + return false; + } + + var shortcutText = GetCurrentShortcutText(); + if (shortcutText == "[CapsLock]" || shortcutText.Length < 3 || shortcutText.EndsWith("+]")) + { + return false; + } + + if (comboBoxShortcutKey.SelectedIndex == 0 && !checkBoxShortcutsControl.Checked && !checkBoxShortcutsAlt.Checked && !checkBoxShortcutsShift.Checked) + { + return true; + } + + var helper = (ShortcutHelper)treeViewShortcuts.SelectedNode.Tag; + if (helper.IsMenuItem) + { + try + { + new ToolStripMenuItem().ShortcutKeys = UiUtil.GetKeys(GetShortcut(shortcutText)); + } + catch (InvalidEnumArgumentException) + { + return false; + } + } + return true; + } + + private void numericUpDownMaxNumberOfLines_ValueChanged(object sender, EventArgs e) + { + checkBoxSyntaxColorTextMoreThanTwoLines.Text = string.Format(Configuration.Settings.Language.Settings.SyntaxColorTextMoreThanMaxLines, numericUpDownMaxNumberOfLines.Value); + ProfileUiValueChanged(sender, e); + } + + private void radioButtonVideoPlayerMPV_CheckedChanged(object sender, EventArgs e) + { + checkBoxMpvHandlesPreviewText.Enabled = radioButtonVideoPlayerMPV.Checked; + } + + private void buttonClearShortcut_Click(object sender, EventArgs e) + { + checkBoxShortcutsControl.Checked = false; + checkBoxShortcutsAlt.Checked = false; + checkBoxShortcutsShift.Checked = false; + comboBoxShortcutKey.SelectedIndex = 0; + buttonUpdateShortcut_Click(null, null); + } + + private void buttonDownloadFfmpeg_Click(object sender, EventArgs e) + { + using (var form = new DownloadFfmpeg()) + { + if (form.ShowDialog(this) == DialogResult.OK && !string.IsNullOrEmpty(form.FFmpegPath)) + { + textBoxFFmpegPath.Text = form.FFmpegPath; + } + } + } + + private void textBoxShortcutSearch_TextChanged(object sender, EventArgs e) + { + var selected = treeViewShortcuts.SelectedNode?.Tag as ShortcutHelper; + var oldControl = checkBoxShortcutsControl.Checked; + var oldAlt = checkBoxShortcutsAlt.Checked; + var oldShift = checkBoxShortcutsShift.Checked; + var oldKeyIndex = comboBoxShortcutKey.SelectedIndex; + ShowShortcutsTreeView(); + buttonShortcutsClear.Enabled = textBoxShortcutSearch.Text.Length > 0; + if (selected != null) + { + foreach (TreeNode parentNode in treeViewShortcuts.Nodes) + { + foreach (TreeNode node in parentNode.Nodes) + { + if (node.Tag is ShortcutHelper sh && sh.Shortcut.Name == selected.Shortcut.Name) + { + treeViewShortcuts.SelectedNode = node; + checkBoxShortcutsControl.Checked = oldControl; + checkBoxShortcutsAlt.Checked = oldAlt; + checkBoxShortcutsShift.Checked = oldShift; + comboBoxShortcutKey.SelectedIndex = oldKeyIndex; + return; + } + } + } + } + comboBoxShortcutKey.Enabled = false; + buttonUpdateShortcut.Enabled = false; + buttonClearShortcut.Enabled = false; + } + + private void buttonShortcutsClear_Click(object sender, EventArgs e) + { + textBoxShortcutSearch.Text = string.Empty; + } + + private void linkLabelGoogleTranslateSignUp_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + UiUtil.OpenURL("https://www.google.com/search?q=google+cloud+get+api+key"); + } + + private void buttonEditProfile_Click(object sender, EventArgs e) + { + using (var form = new SettingsProfile(_rulesProfiles, comboBoxRulesProfileName.Text)) + { + if (form.ShowDialog(this) == DialogResult.OK) + { + _rulesProfiles = form.RulesProfiles; + UpdateProfileNames(_rulesProfiles); + } + } + } + + private bool _editProfileOn; + private void comboBoxRulesProfileName_SelectedIndexChanged(object sender, EventArgs e) + { + _editProfileOn = true; + var profile = _rulesProfiles.First(p => p.Name == comboBoxRulesProfileName.Text); + numericUpDownSubtitleLineMaximumLength.Value = profile.SubtitleLineMaximumLength; + numericUpDownOptimalCharsSec.Value = profile.SubtitleOptimalCharactersPerSeconds; + numericUpDownMaxCharsSec.Value = profile.SubtitleMaximumCharactersPerSeconds; + numericUpDownMaxWordsMin.Value = profile.SubtitleMaximumWordsPerMinute; + numericUpDownDurationMin.Value = profile.SubtitleMinimumDisplayMilliseconds; + numericUpDownDurationMax.Value = profile.SubtitleMaximumDisplayMilliseconds; + if (profile.MinimumMillisecondsBetweenLines >= numericUpDownMinGapMs.Minimum && + profile.MinimumMillisecondsBetweenLines <= numericUpDownMinGapMs.Maximum) + { + numericUpDownMinGapMs.Value = profile.MinimumMillisecondsBetweenLines; + } + if (profile.MaxNumberOfLines >= numericUpDownMaxNumberOfLines.Minimum && + profile.MaxNumberOfLines <= numericUpDownMaxNumberOfLines.Maximum) + { + numericUpDownMaxNumberOfLines.Value = profile.MaxNumberOfLines; + } + else + { + numericUpDownMaxNumberOfLines.Value = numericUpDownMaxNumberOfLines.Minimum; + } + + if (profile.MergeLinesShorterThan >= 5 && profile.MergeLinesShorterThan - 5 < comboBoxMergeShortLineLength.Items.Count) + { + comboBoxMergeShortLineLength.SelectedIndex = profile.MergeLinesShorterThan - 5; + } + else + { + comboBoxMergeShortLineLength.SelectedIndex = 0; + } + + SetDialogStyle(profile.DialogStyle); + SetContinuationStyle(profile.ContinuationStyle); + + checkBoxCpsIncludeWhiteSpace.Checked = profile.CpsIncludesSpace; + _oldProfileId = profile.Id; + _editProfileOn = false; + } + + private void ProfileUiValueChanged(object sender, EventArgs e) + { + var idx = comboBoxRulesProfileName.SelectedIndex; + if (idx < 0 || _editProfileOn || idx >= _rulesProfiles.Count) + { + return; + } + _rulesProfiles[idx].SubtitleLineMaximumLength = (int)numericUpDownSubtitleLineMaximumLength.Value; + _rulesProfiles[idx].SubtitleOptimalCharactersPerSeconds = numericUpDownOptimalCharsSec.Value; + _rulesProfiles[idx].SubtitleMaximumCharactersPerSeconds = numericUpDownMaxCharsSec.Value; + _rulesProfiles[idx].SubtitleMinimumDisplayMilliseconds = (int)numericUpDownDurationMin.Value; + _rulesProfiles[idx].SubtitleMaximumDisplayMilliseconds = (int)numericUpDownDurationMax.Value; + _rulesProfiles[idx].MinimumMillisecondsBetweenLines = (int)numericUpDownMinGapMs.Value; + _rulesProfiles[idx].MaxNumberOfLines = (int)numericUpDownMaxNumberOfLines.Value; + _rulesProfiles[idx].SubtitleMaximumWordsPerMinute = (int)numericUpDownMaxWordsMin.Value; + _rulesProfiles[idx].CpsIncludesSpace = checkBoxCpsIncludeWhiteSpace.Checked; + _rulesProfiles[idx].MergeLinesShorterThan = comboBoxMergeShortLineLength.SelectedIndex + 5; + _rulesProfiles[idx].DialogStyle = DialogSplitMerge.GetDialogStyleFromIndex(comboBoxDialogStyle.SelectedIndex); + _rulesProfiles[idx].ContinuationStyle = ContinuationUtilities.GetContinuationStyleFromIndex(comboBoxContinuationStyle.SelectedIndex); + + toolTipContinuationPreview.RemoveAll(); + toolTipContinuationPreview.SetToolTip(comboBoxContinuationStyle, ContinuationUtilities.GetContinuationStylePreview(_rulesProfiles[idx].ContinuationStyle)); + } + + private void checkBoxToolsBreakByPixelWidth_CheckedChanged(object sender, EventArgs e) + { + checkBoxToolsBreakPreferBottomHeavy.Enabled = checkBoxToolsBreakByPixelWidth.Checked; + numericUpDownToolsBreakPreferBottomHeavy.Enabled = checkBoxToolsBreakByPixelWidth.Checked; + } + + private void buttonReset_Click(object sender, EventArgs e) + { + var result = MessageBox.Show(Configuration.Settings.Language.Settings.RestoreDefaultSettingsMsg, Configuration.Settings.Language.General.Title, MessageBoxButtons.YesNo); + if (result == DialogResult.Yes) + { + Configuration.Settings.Reset(); + Configuration.Settings.General.VideoPlayer = "MPV"; + Init(); + } + } + + private void toolStripMenuItemShortcutsCollapse_Click(object sender, EventArgs e) + { + treeViewShortcuts.CollapseAll(); + } + + private void listBoxNames_DoubleClick(object sender, EventArgs e) + { + var idx = listBoxNames.SelectedIndex; + if (idx >= 0) + { + textBoxNameEtc.Text = (string)listBoxNames.Items[idx]; + } + } + + private void listBoxUserWordLists_DoubleClick(object sender, EventArgs e) + { + var idx = listBoxUserWordLists.SelectedIndex; + if (idx >= 0) + { + textBoxUserWord.Text = (string)listBoxUserWordLists.Items[idx]; + } + } + + private void listBoxOcrFixList_DoubleClick(object sender, EventArgs e) + { + var idx = listBoxOcrFixList.SelectedIndex; + if (idx >= 0) + { + var text = (string)listBoxOcrFixList.Items[idx]; + var splitIdx = text.IndexOf(" --> ", StringComparison.Ordinal); + if (splitIdx > 0) + { + textBoxOcrFixKey.Text = text.Substring(0, splitIdx); + textBoxOcrFixValue.Text = text.Remove(0, splitIdx + " --> ".Length); + } + } + } + + private void buttonLineWidthSettings_Click(object sender, EventArgs e) + { + using (var form = new SettingsLineWidth()) + { + if (form.ShowDialog(this) == DialogResult.OK) + { + // Saving settings handled by dialog + } + } + } + + private void buttonFixContinuationStyleSettings_Click(object sender, EventArgs e) + { + using (var form = new SettingsFixContinuationStyle()) + { + if (form.ShowDialog(this) == DialogResult.OK) + { + // Saving settings handled by dialog + } + } + } + + private void buttonGapChoose_Click(object sender, EventArgs e) + { + using (var form = new SettingsGapChoose()) + { + if (form.ShowDialog(this) == DialogResult.OK) + { + numericUpDownMinGapMs.Value = form.MinGapMs; + } + } + } + + private void importShortcutsToolStripMenuItem_Click(object sender, EventArgs e) + { + openFileDialogFFmpeg.Title = null; + openFileDialogFFmpeg.Filter = "Xml files|*.xml"; + openFileDialogFFmpeg.FileName = "SE_Shortcuts"; + if (openFileDialogFFmpeg.ShowDialog(this) != DialogResult.OK) + { + return; + } + + try + { + Configuration.Settings.Shortcuts = Shortcuts.Load(openFileDialogFFmpeg.FileName); + textBoxShortcutSearch.Text = string.Empty; + MakeShortcutsTreeView(Configuration.Settings.Language.Settings); + ShowShortcutsTreeView(); + } + catch (Exception exception) + { + MessageBox.Show("Shortcuts not imported!" + Environment.NewLine + Environment.NewLine + + exception.Message + Environment.NewLine + + exception.StackTrace); + SeLogger.Error(exception, "Failed to import shortcuts"); + } + } + + private void exportShortcutsToolStripMenuItem_Click(object sender, EventArgs e) + { + saveFileDialog1.Filter = "Xml files|*.xml"; + saveFileDialog1.FileName = "SE_Shortcuts"; + if (saveFileDialog1.ShowDialog(this) != DialogResult.OK) + { + return; + } + + try + { + var shortcuts = Configuration.Settings.Shortcuts.Clone(); + foreach (var kvp in _newShortcuts) + { + kvp.Key.Shortcut.SetValue(shortcuts, kvp.Value, null); + } + + Shortcuts.Save(saveFileDialog1.FileName, shortcuts); + } + catch (Exception exception) + { + MessageBox.Show(exception.Message + Environment.NewLine + + exception.StackTrace); + SeLogger.Error(exception, "Failed to export shortcuts"); + } + } + + private void pictureBoxPreview_Click(object sender, EventArgs e) + { + _backgroundImageDark = !_backgroundImageDark; + GeneratePreviewReal(); + } + + private void buttonTextBoxHtmlColor_Click(object sender, EventArgs e) + { + colorDialogSSAStyle.Color = panelTextBoxHtmlColor.BackColor; + if (colorDialogSSAStyle.ShowDialog() == DialogResult.OK) + { + panelTextBoxHtmlColor.BackColor = colorDialogSSAStyle.Color; + } + } + + private void buttonTextBoxAssColor_Click(object sender, EventArgs e) + { + colorDialogSSAStyle.Color = panelTextBoxAssColor.BackColor; + if (colorDialogSSAStyle.ShowDialog() == DialogResult.OK) + { + panelTextBoxAssColor.BackColor = colorDialogSSAStyle.Color; + } + } + + private void checkBoxSubtitleTextBoxSyntaxColor_CheckedChanged(object sender, EventArgs e) + { + buttonTextBoxHtmlColor.Enabled = checkBoxSubtitleTextBoxSyntaxColor.Checked; + panelTextBoxHtmlColor.Enabled = checkBoxSubtitleTextBoxSyntaxColor.Checked; + buttonTextBoxAssColor.Enabled = checkBoxSubtitleTextBoxSyntaxColor.Checked; + panelTextBoxAssColor.Enabled = checkBoxSubtitleTextBoxSyntaxColor.Checked; + } + + private void panelTextBoxHtmlColor_MouseClick(object sender, MouseEventArgs e) + { + buttonTextBoxHtmlColor_Click(null, null); + } + + private void panelTextBoxAssColor_MouseClick(object sender, MouseEventArgs e) + { + buttonTextBoxAssColor_Click(null, null); + } + } +} diff --git a/src/Forms/Settings.resx b/src/ui/Forms/Settings.resx similarity index 98% rename from src/Forms/Settings.resx rename to src/ui/Forms/Settings.resx index dac0a5333..683a8b0b8 100644 --- a/src/Forms/Settings.resx +++ b/src/ui/Forms/Settings.resx @@ -1,135 +1,135 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 464, 17 - - - 17, 17 - - - 287, 17 - - - 664, 17 - - - 867, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 464, 17 + + + 17, 17 + + + 287, 17 + + + 664, 17 + + + 867, 17 + \ No newline at end of file diff --git a/src/Forms/SettingsFixContinuationStyle.Designer.cs b/src/ui/Forms/SettingsFixContinuationStyle.Designer.cs similarity index 100% rename from src/Forms/SettingsFixContinuationStyle.Designer.cs rename to src/ui/Forms/SettingsFixContinuationStyle.Designer.cs diff --git a/src/Forms/SettingsFixContinuationStyle.cs b/src/ui/Forms/SettingsFixContinuationStyle.cs similarity index 100% rename from src/Forms/SettingsFixContinuationStyle.cs rename to src/ui/Forms/SettingsFixContinuationStyle.cs diff --git a/src/ui/Forms/SettingsFixContinuationStyle.resx b/src/ui/Forms/SettingsFixContinuationStyle.resx new file mode 100644 index 000000000..1af7de150 --- /dev/null +++ b/src/ui/Forms/SettingsFixContinuationStyle.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/src/Forms/SettingsGapChoose.Designer.cs b/src/ui/Forms/SettingsGapChoose.Designer.cs similarity index 100% rename from src/Forms/SettingsGapChoose.Designer.cs rename to src/ui/Forms/SettingsGapChoose.Designer.cs diff --git a/src/Forms/SettingsGapChoose.cs b/src/ui/Forms/SettingsGapChoose.cs similarity index 100% rename from src/Forms/SettingsGapChoose.cs rename to src/ui/Forms/SettingsGapChoose.cs diff --git a/src/ui/Forms/SettingsGapChoose.resx b/src/ui/Forms/SettingsGapChoose.resx new file mode 100644 index 000000000..1af7de150 --- /dev/null +++ b/src/ui/Forms/SettingsGapChoose.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/src/Forms/SettingsLineWidth.Designer.cs b/src/ui/Forms/SettingsLineWidth.Designer.cs similarity index 100% rename from src/Forms/SettingsLineWidth.Designer.cs rename to src/ui/Forms/SettingsLineWidth.Designer.cs diff --git a/src/Forms/SettingsLineWidth.cs b/src/ui/Forms/SettingsLineWidth.cs similarity index 100% rename from src/Forms/SettingsLineWidth.cs rename to src/ui/Forms/SettingsLineWidth.cs diff --git a/src/ui/Forms/SettingsLineWidth.resx b/src/ui/Forms/SettingsLineWidth.resx new file mode 100644 index 000000000..1af7de150 --- /dev/null +++ b/src/ui/Forms/SettingsLineWidth.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/src/Forms/SettingsMpv.Designer.cs b/src/ui/Forms/SettingsMpv.Designer.cs similarity index 97% rename from src/Forms/SettingsMpv.Designer.cs rename to src/ui/Forms/SettingsMpv.Designer.cs index 40ed1c8e0..fddb961f0 100644 --- a/src/Forms/SettingsMpv.Designer.cs +++ b/src/ui/Forms/SettingsMpv.Designer.cs @@ -1,144 +1,144 @@ -namespace Nikse.SubtitleEdit.Forms -{ - using Nikse.SubtitleEdit.Core; - - sealed partial class SettingsMpv - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.buttonDownload = new System.Windows.Forms.Button(); - this.comboBoxVideoOutput = new System.Windows.Forms.ComboBox(); - this.label1 = new System.Windows.Forms.Label(); - this.buttonOK = new System.Windows.Forms.Button(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.labelPleaseWait = new System.Windows.Forms.Label(); - this.SuspendLayout(); - // - // buttonDownload - // - this.buttonDownload.Location = new System.Drawing.Point(12, 24); - this.buttonDownload.Name = "buttonDownload"; - this.buttonDownload.Size = new System.Drawing.Size(186, 23); - this.buttonDownload.TabIndex = 0; - this.buttonDownload.Text = "Download mpv dll"; - this.buttonDownload.UseVisualStyleBackColor = true; - this.buttonDownload.Click += new System.EventHandler(this.ButtonDownloadClick); - // - // comboBoxVideoOutput - // - this.comboBoxVideoOutput.FormattingEnabled = true; - this.comboBoxVideoOutput.Items.AddRange(new object[] { - "gpu", - "direct3d", - "opengl", - "sdl", - "vaapi", - "vdpau"}); - this.comboBoxVideoOutput.Location = new System.Drawing.Point(12, 109); - this.comboBoxVideoOutput.Name = "comboBoxVideoOutput"; - this.comboBoxVideoOutput.Size = new System.Drawing.Size(186, 21); - this.comboBoxVideoOutput.TabIndex = 1; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(12, 93); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(67, 13); - this.label1.TabIndex = 2; - this.label1.Text = "Video output"; - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(129, 163); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 4; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(210, 163); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 5; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // labelPleaseWait - // - this.labelPleaseWait.AutoSize = true; - this.labelPleaseWait.Location = new System.Drawing.Point(12, 50); - this.labelPleaseWait.Name = "labelPleaseWait"; - this.labelPleaseWait.Size = new System.Drawing.Size(70, 13); - this.labelPleaseWait.TabIndex = 13; - this.labelPleaseWait.Text = "Please wait..."; - // - // SettingsMpv - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(297, 198); - this.Controls.Add(this.labelPleaseWait); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.label1); - this.Controls.Add(this.comboBoxVideoOutput); - this.Controls.Add(this.buttonDownload); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "SettingsMpv"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Settings for mpv"; - this.Load += new System.EventHandler(this.SettingsMpv_Load); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button buttonDownload; - private System.Windows.Forms.ComboBox comboBoxVideoOutput; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Label labelPleaseWait; - } +namespace Nikse.SubtitleEdit.Forms +{ + using Nikse.SubtitleEdit.Core; + + sealed partial class SettingsMpv + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.buttonDownload = new System.Windows.Forms.Button(); + this.comboBoxVideoOutput = new System.Windows.Forms.ComboBox(); + this.label1 = new System.Windows.Forms.Label(); + this.buttonOK = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.labelPleaseWait = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // buttonDownload + // + this.buttonDownload.Location = new System.Drawing.Point(12, 24); + this.buttonDownload.Name = "buttonDownload"; + this.buttonDownload.Size = new System.Drawing.Size(186, 23); + this.buttonDownload.TabIndex = 0; + this.buttonDownload.Text = "Download mpv dll"; + this.buttonDownload.UseVisualStyleBackColor = true; + this.buttonDownload.Click += new System.EventHandler(this.ButtonDownloadClick); + // + // comboBoxVideoOutput + // + this.comboBoxVideoOutput.FormattingEnabled = true; + this.comboBoxVideoOutput.Items.AddRange(new object[] { + "gpu", + "direct3d", + "opengl", + "sdl", + "vaapi", + "vdpau"}); + this.comboBoxVideoOutput.Location = new System.Drawing.Point(12, 109); + this.comboBoxVideoOutput.Name = "comboBoxVideoOutput"; + this.comboBoxVideoOutput.Size = new System.Drawing.Size(186, 21); + this.comboBoxVideoOutput.TabIndex = 1; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(12, 93); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(67, 13); + this.label1.TabIndex = 2; + this.label1.Text = "Video output"; + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(129, 163); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 4; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(210, 163); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 5; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // labelPleaseWait + // + this.labelPleaseWait.AutoSize = true; + this.labelPleaseWait.Location = new System.Drawing.Point(12, 50); + this.labelPleaseWait.Name = "labelPleaseWait"; + this.labelPleaseWait.Size = new System.Drawing.Size(70, 13); + this.labelPleaseWait.TabIndex = 13; + this.labelPleaseWait.Text = "Please wait..."; + // + // SettingsMpv + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(297, 198); + this.Controls.Add(this.labelPleaseWait); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.label1); + this.Controls.Add(this.comboBoxVideoOutput); + this.Controls.Add(this.buttonDownload); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "SettingsMpv"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Settings for mpv"; + this.Load += new System.EventHandler(this.SettingsMpv_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonDownload; + private System.Windows.Forms.ComboBox comboBoxVideoOutput; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Label labelPleaseWait; + } } \ No newline at end of file diff --git a/src/Forms/SettingsMpv.cs b/src/ui/Forms/SettingsMpv.cs similarity index 97% rename from src/Forms/SettingsMpv.cs rename to src/ui/Forms/SettingsMpv.cs index 444e9d391..fda5a917c 100644 --- a/src/Forms/SettingsMpv.cs +++ b/src/ui/Forms/SettingsMpv.cs @@ -1,163 +1,163 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.IO; -using System.Net; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; -using Nikse.SubtitleEdit.Logic.VideoPlayers; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class SettingsMpv : Form - { - - private readonly bool _justDownload; - private string _downloadUrl; - - public SettingsMpv(bool justDownload) - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - _justDownload = justDownload; - labelPleaseWait.Text = string.Empty; - if (Configuration.IsRunningOnLinux) - { - comboBoxVideoOutput.Text = Configuration.Settings.General.MpvVideoOutputLinux; - } - else - { - comboBoxVideoOutput.Text = Configuration.Settings.General.MpvVideoOutputWindows; - } - - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - Text = Configuration.Settings.Language.SettingsMpv.Title; - if (!Configuration.IsRunningOnLinux) - { - buttonDownload.Text = Configuration.Settings.Language.SettingsMpv.DownloadMpv; - } - - if (Configuration.IsRunningOnLinux) - { - comboBoxVideoOutput.Items.Clear(); - comboBoxVideoOutput.Items.AddRange(new object[] { "vaapi", "opengl", "sdl", "vdpau" }); - Controls.Remove(buttonDownload); - } - UiUtil.FixLargeFonts(this, buttonOK); - - if (justDownload) - { - comboBoxVideoOutput.Enabled = false; - } - } - - private void wc_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e) - { - if (e.Error != null) - { - MessageBox.Show(Configuration.Settings.Language.SettingsMpv.DownloadMpvFailed + Environment.NewLine + - Environment.NewLine + - $"Manual action: Download \"{_downloadUrl}\" and unpack to \"{Configuration.DataDirectory}\"." + Environment.NewLine + - Environment.NewLine + - e.Error.Message); - labelPleaseWait.Text = string.Empty; - buttonOK.Enabled = true; - buttonDownload.Enabled = !Configuration.IsRunningOnLinux; - Cursor = Cursors.Default; - return; - } - - string dictionaryFolder = Configuration.DataDirectory; - using (var ms = new MemoryStream(e.Result)) - using (ZipExtractor zip = ZipExtractor.Open(ms)) - { - List dir = zip.ReadCentralDir(); - foreach (ZipExtractor.ZipFileEntry entry in dir) - { - if (entry.FilenameInZip.EndsWith(".dll", StringComparison.OrdinalIgnoreCase)) - { - string fileName = Path.GetFileName(entry.FilenameInZip); - string path = Path.Combine(dictionaryFolder, fileName); - - try - { - zip.ExtractFile(entry, path); - } - catch - { - path = Path.Combine(dictionaryFolder, fileName + ".new-mpv"); - zip.ExtractFile(entry, path); - } - } - } - } - - Cursor = Cursors.Default; - labelPleaseWait.Text = string.Empty; - buttonOK.Enabled = true; - buttonDownload.Enabled = !Configuration.IsRunningOnLinux; - - MessageBox.Show(Configuration.Settings.Language.SettingsMpv.DownloadMpvOk); - if (_justDownload) - { - DialogResult = DialogResult.OK; - } - } - - - private void ButtonDownloadClick(object sender, EventArgs e) - { - try - { - labelPleaseWait.Text = Configuration.Settings.Language.General.PleaseWait; - buttonOK.Enabled = false; - buttonDownload.Enabled = false; - Refresh(); - Cursor = Cursors.WaitCursor; - _downloadUrl = "https://github.com/SubtitleEdit/support-files/blob/master/mpv/libmpv" + IntPtr.Size * 8 + ".zip?raw=true"; - var wc = new WebClient { Proxy = Utilities.GetProxy() }; - - wc.DownloadDataCompleted += wc_DownloadDataCompleted; - wc.DownloadProgressChanged += (o, args) => - { - labelPleaseWait.Text = Configuration.Settings.Language.General.PleaseWait + " " + args.ProgressPercentage + "%"; - }; - wc.DownloadDataAsync(new Uri(_downloadUrl)); - } - catch (Exception exception) - { - labelPleaseWait.Text = string.Empty; - buttonOK.Enabled = true; - buttonDownload.Enabled = !Configuration.IsRunningOnLinux; - Cursor = Cursors.Default; - MessageBox.Show(exception.Message + Environment.NewLine + Environment.NewLine + exception.StackTrace); - } - } - - private void buttonOK_Click(object sender, EventArgs e) - { - if (!string.IsNullOrWhiteSpace(comboBoxVideoOutput.Text)) - { - Configuration.Settings.General.MpvVideoOutputWindows = comboBoxVideoOutput.Text; - } - - DialogResult = DialogResult.OK; - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private void SettingsMpv_Load(object sender, EventArgs e) - { - if (Configuration.IsRunningOnWindows && !LibMpvDynamic.IsInstalled) - { - ButtonDownloadClick(null, null); - } - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Logic.VideoPlayers; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class SettingsMpv : Form + { + + private readonly bool _justDownload; + private string _downloadUrl; + + public SettingsMpv(bool justDownload) + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + _justDownload = justDownload; + labelPleaseWait.Text = string.Empty; + if (Configuration.IsRunningOnLinux) + { + comboBoxVideoOutput.Text = Configuration.Settings.General.MpvVideoOutputLinux; + } + else + { + comboBoxVideoOutput.Text = Configuration.Settings.General.MpvVideoOutputWindows; + } + + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + Text = Configuration.Settings.Language.SettingsMpv.Title; + if (!Configuration.IsRunningOnLinux) + { + buttonDownload.Text = Configuration.Settings.Language.SettingsMpv.DownloadMpv; + } + + if (Configuration.IsRunningOnLinux) + { + comboBoxVideoOutput.Items.Clear(); + comboBoxVideoOutput.Items.AddRange(new object[] { "vaapi", "opengl", "sdl", "vdpau" }); + Controls.Remove(buttonDownload); + } + UiUtil.FixLargeFonts(this, buttonOK); + + if (justDownload) + { + comboBoxVideoOutput.Enabled = false; + } + } + + private void wc_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e) + { + if (e.Error != null) + { + MessageBox.Show(Configuration.Settings.Language.SettingsMpv.DownloadMpvFailed + Environment.NewLine + + Environment.NewLine + + $"Manual action: Download \"{_downloadUrl}\" and unpack to \"{Configuration.DataDirectory}\"." + Environment.NewLine + + Environment.NewLine + + e.Error.Message); + labelPleaseWait.Text = string.Empty; + buttonOK.Enabled = true; + buttonDownload.Enabled = !Configuration.IsRunningOnLinux; + Cursor = Cursors.Default; + return; + } + + string dictionaryFolder = Configuration.DataDirectory; + using (var ms = new MemoryStream(e.Result)) + using (ZipExtractor zip = ZipExtractor.Open(ms)) + { + List dir = zip.ReadCentralDir(); + foreach (ZipExtractor.ZipFileEntry entry in dir) + { + if (entry.FilenameInZip.EndsWith(".dll", StringComparison.OrdinalIgnoreCase)) + { + string fileName = Path.GetFileName(entry.FilenameInZip); + string path = Path.Combine(dictionaryFolder, fileName); + + try + { + zip.ExtractFile(entry, path); + } + catch + { + path = Path.Combine(dictionaryFolder, fileName + ".new-mpv"); + zip.ExtractFile(entry, path); + } + } + } + } + + Cursor = Cursors.Default; + labelPleaseWait.Text = string.Empty; + buttonOK.Enabled = true; + buttonDownload.Enabled = !Configuration.IsRunningOnLinux; + + MessageBox.Show(Configuration.Settings.Language.SettingsMpv.DownloadMpvOk); + if (_justDownload) + { + DialogResult = DialogResult.OK; + } + } + + + private void ButtonDownloadClick(object sender, EventArgs e) + { + try + { + labelPleaseWait.Text = Configuration.Settings.Language.General.PleaseWait; + buttonOK.Enabled = false; + buttonDownload.Enabled = false; + Refresh(); + Cursor = Cursors.WaitCursor; + _downloadUrl = "https://github.com/SubtitleEdit/support-files/blob/master/mpv/libmpv" + IntPtr.Size * 8 + ".zip?raw=true"; + var wc = new WebClient { Proxy = Utilities.GetProxy() }; + + wc.DownloadDataCompleted += wc_DownloadDataCompleted; + wc.DownloadProgressChanged += (o, args) => + { + labelPleaseWait.Text = Configuration.Settings.Language.General.PleaseWait + " " + args.ProgressPercentage + "%"; + }; + wc.DownloadDataAsync(new Uri(_downloadUrl)); + } + catch (Exception exception) + { + labelPleaseWait.Text = string.Empty; + buttonOK.Enabled = true; + buttonDownload.Enabled = !Configuration.IsRunningOnLinux; + Cursor = Cursors.Default; + MessageBox.Show(exception.Message + Environment.NewLine + Environment.NewLine + exception.StackTrace); + } + } + + private void buttonOK_Click(object sender, EventArgs e) + { + if (!string.IsNullOrWhiteSpace(comboBoxVideoOutput.Text)) + { + Configuration.Settings.General.MpvVideoOutputWindows = comboBoxVideoOutput.Text; + } + + DialogResult = DialogResult.OK; + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void SettingsMpv_Load(object sender, EventArgs e) + { + if (Configuration.IsRunningOnWindows && !LibMpvDynamic.IsInstalled) + { + ButtonDownloadClick(null, null); + } + } + } +} diff --git a/src/Forms/SettingsMpv.resx b/src/ui/Forms/SettingsMpv.resx similarity index 97% rename from src/Forms/SettingsMpv.resx rename to src/ui/Forms/SettingsMpv.resx index 29dcb1b3a..1af7de150 100644 --- a/src/Forms/SettingsMpv.resx +++ b/src/ui/Forms/SettingsMpv.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Forms/SettingsProfile.Designer.cs b/src/ui/Forms/SettingsProfile.Designer.cs similarity index 100% rename from src/Forms/SettingsProfile.Designer.cs rename to src/ui/Forms/SettingsProfile.Designer.cs diff --git a/src/Forms/SettingsProfile.cs b/src/ui/Forms/SettingsProfile.cs similarity index 100% rename from src/Forms/SettingsProfile.cs rename to src/ui/Forms/SettingsProfile.cs diff --git a/src/Forms/SettingsProfile.resx b/src/ui/Forms/SettingsProfile.resx similarity index 100% rename from src/Forms/SettingsProfile.resx rename to src/ui/Forms/SettingsProfile.resx diff --git a/src/Forms/SettingsProfileExport.Designer.cs b/src/ui/Forms/SettingsProfileExport.Designer.cs similarity index 100% rename from src/Forms/SettingsProfileExport.Designer.cs rename to src/ui/Forms/SettingsProfileExport.Designer.cs diff --git a/src/Forms/SettingsProfileExport.cs b/src/ui/Forms/SettingsProfileExport.cs similarity index 100% rename from src/Forms/SettingsProfileExport.cs rename to src/ui/Forms/SettingsProfileExport.cs diff --git a/src/Forms/SettingsProfileExport.resx b/src/ui/Forms/SettingsProfileExport.resx similarity index 100% rename from src/Forms/SettingsProfileExport.resx rename to src/ui/Forms/SettingsProfileExport.resx diff --git a/src/Forms/ShowEarlierLater.Designer.cs b/src/ui/Forms/ShowEarlierLater.Designer.cs similarity index 98% rename from src/Forms/ShowEarlierLater.Designer.cs rename to src/ui/Forms/ShowEarlierLater.Designer.cs index 20193cc14..40733f66e 100644 --- a/src/Forms/ShowEarlierLater.Designer.cs +++ b/src/ui/Forms/ShowEarlierLater.Designer.cs @@ -1,185 +1,185 @@ -using Nikse.SubtitleEdit.Controls; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class ShowEarlierLater - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - TimeCode timeCode1 = new TimeCode(); - this.labelHourMinSecMilliSecond = new System.Windows.Forms.Label(); - this.buttonShowLater = new System.Windows.Forms.Button(); - this.buttonShowEarlier = new System.Windows.Forms.Button(); - this.labelTotalAdjustment = new System.Windows.Forms.Label(); - this.timer1 = new System.Windows.Forms.Timer(this.components); - this.radioButtonAllLines = new System.Windows.Forms.RadioButton(); - this.radioButtonSelectedLinesOnly = new System.Windows.Forms.RadioButton(); - this.timeUpDownAdjust = new Nikse.SubtitleEdit.Controls.TimeUpDown(); - this.radioButtonSelectedLineAndForward = new System.Windows.Forms.RadioButton(); - this.SuspendLayout(); - // - // labelHourMinSecMilliSecond - // - this.labelHourMinSecMilliSecond.AutoSize = true; - this.labelHourMinSecMilliSecond.Location = new System.Drawing.Point(11, 6); - this.labelHourMinSecMilliSecond.Name = "labelHourMinSecMilliSecond"; - this.labelHourMinSecMilliSecond.Size = new System.Drawing.Size(108, 13); - this.labelHourMinSecMilliSecond.TabIndex = 18; - this.labelHourMinSecMilliSecond.Text = "Hours:min:sec.msecs"; - // - // buttonShowLater - // - this.buttonShowLater.Location = new System.Drawing.Point(145, 55); - this.buttonShowLater.Name = "buttonShowLater"; - this.buttonShowLater.Size = new System.Drawing.Size(119, 23); - this.buttonShowLater.TabIndex = 20; - this.buttonShowLater.Text = "Show later"; - this.buttonShowLater.UseVisualStyleBackColor = true; - this.buttonShowLater.Click += new System.EventHandler(this.ButtonShowLaterClick); - // - // buttonShowEarlier - // - this.buttonShowEarlier.Location = new System.Drawing.Point(145, 26); - this.buttonShowEarlier.Name = "buttonShowEarlier"; - this.buttonShowEarlier.Size = new System.Drawing.Size(120, 23); - this.buttonShowEarlier.TabIndex = 19; - this.buttonShowEarlier.Text = "Show earlier"; - this.buttonShowEarlier.UseVisualStyleBackColor = true; - this.buttonShowEarlier.Click += new System.EventHandler(this.ButtonShowEarlierClick); - // - // labelTotalAdjustment - // - this.labelTotalAdjustment.AutoSize = true; - this.labelTotalAdjustment.Location = new System.Drawing.Point(9, 148); - this.labelTotalAdjustment.Name = "labelTotalAdjustment"; - this.labelTotalAdjustment.Size = new System.Drawing.Size(108, 13); - this.labelTotalAdjustment.TabIndex = 38; - this.labelTotalAdjustment.Text = "labelTotalAdjustment"; - // - // timer1 - // - this.timer1.Interval = 250; - // - // radioButtonAllLines - // - this.radioButtonAllLines.AutoSize = true; - this.radioButtonAllLines.Location = new System.Drawing.Point(14, 70); - this.radioButtonAllLines.Name = "radioButtonAllLines"; - this.radioButtonAllLines.Size = new System.Drawing.Size(60, 17); - this.radioButtonAllLines.TabIndex = 39; - this.radioButtonAllLines.TabStop = true; - this.radioButtonAllLines.Text = "All lines"; - this.radioButtonAllLines.UseVisualStyleBackColor = true; - this.radioButtonAllLines.CheckedChanged += new System.EventHandler(this.RadioButtonCheckedChanged); - // - // radioButtonSelectedLinesOnly - // - this.radioButtonSelectedLinesOnly.AutoSize = true; - this.radioButtonSelectedLinesOnly.Location = new System.Drawing.Point(14, 93); - this.radioButtonSelectedLinesOnly.Name = "radioButtonSelectedLinesOnly"; - this.radioButtonSelectedLinesOnly.Size = new System.Drawing.Size(113, 17); - this.radioButtonSelectedLinesOnly.TabIndex = 40; - this.radioButtonSelectedLinesOnly.TabStop = true; - this.radioButtonSelectedLinesOnly.Text = "Selected lines only"; - this.radioButtonSelectedLinesOnly.UseVisualStyleBackColor = true; - this.radioButtonSelectedLinesOnly.CheckedChanged += new System.EventHandler(this.RadioButtonCheckedChanged); - // - // timeUpDownAdjust - // - this.timeUpDownAdjust.AutoSize = true; - this.timeUpDownAdjust.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.timeUpDownAdjust.Font = new System.Drawing.Font("Segoe UI", 9F); - this.timeUpDownAdjust.Location = new System.Drawing.Point(12, 23); - this.timeUpDownAdjust.Margin = new System.Windows.Forms.Padding(4); - this.timeUpDownAdjust.Name = "timeUpDownAdjust"; - this.timeUpDownAdjust.Size = new System.Drawing.Size(96, 27); - this.timeUpDownAdjust.TabIndex = 21; - timeCode1.Hours = 0; - timeCode1.Milliseconds = 0; - timeCode1.Minutes = 0; - timeCode1.Seconds = 0; - timeCode1.TimeSpan = System.TimeSpan.Parse("00:00:00"); - timeCode1.TotalMilliseconds = 0D; - timeCode1.TotalSeconds = 0D; - this.timeUpDownAdjust.TimeCode = timeCode1; - this.timeUpDownAdjust.UseVideoOffset = false; - // - // radioButtonSelectedLineAndForward - // - this.radioButtonSelectedLineAndForward.AutoSize = true; - this.radioButtonSelectedLineAndForward.Location = new System.Drawing.Point(14, 116); - this.radioButtonSelectedLineAndForward.Name = "radioButtonSelectedLineAndForward"; - this.radioButtonSelectedLineAndForward.Size = new System.Drawing.Size(160, 17); - this.radioButtonSelectedLineAndForward.TabIndex = 41; - this.radioButtonSelectedLineAndForward.TabStop = true; - this.radioButtonSelectedLineAndForward.Text = "Selected line(s) and forward"; - this.radioButtonSelectedLineAndForward.UseVisualStyleBackColor = true; - this.radioButtonSelectedLineAndForward.CheckedChanged += new System.EventHandler(this.RadioButtonCheckedChanged); - // - // ShowEarlierLater - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(301, 170); - this.Controls.Add(this.radioButtonSelectedLineAndForward); - this.Controls.Add(this.radioButtonSelectedLinesOnly); - this.Controls.Add(this.radioButtonAllLines); - this.Controls.Add(this.buttonShowLater); - this.Controls.Add(this.buttonShowEarlier); - this.Controls.Add(this.labelTotalAdjustment); - this.Controls.Add(this.timeUpDownAdjust); - this.Controls.Add(this.labelHourMinSecMilliSecond); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "ShowEarlierLater"; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Show selected lines earlier/later"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.ShowEarlierLater_FormClosing); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ShowEarlierLater_KeyDown); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private Nikse.SubtitleEdit.Controls.TimeUpDown timeUpDownAdjust; - private System.Windows.Forms.Label labelHourMinSecMilliSecond; - private System.Windows.Forms.Button buttonShowLater; - private System.Windows.Forms.Button buttonShowEarlier; - private System.Windows.Forms.Label labelTotalAdjustment; - private System.Windows.Forms.Timer timer1; - private System.Windows.Forms.RadioButton radioButtonAllLines; - private System.Windows.Forms.RadioButton radioButtonSelectedLinesOnly; - private System.Windows.Forms.RadioButton radioButtonSelectedLineAndForward; - } +using Nikse.SubtitleEdit.Controls; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class ShowEarlierLater + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + TimeCode timeCode1 = new TimeCode(); + this.labelHourMinSecMilliSecond = new System.Windows.Forms.Label(); + this.buttonShowLater = new System.Windows.Forms.Button(); + this.buttonShowEarlier = new System.Windows.Forms.Button(); + this.labelTotalAdjustment = new System.Windows.Forms.Label(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.radioButtonAllLines = new System.Windows.Forms.RadioButton(); + this.radioButtonSelectedLinesOnly = new System.Windows.Forms.RadioButton(); + this.timeUpDownAdjust = new Nikse.SubtitleEdit.Controls.TimeUpDown(); + this.radioButtonSelectedLineAndForward = new System.Windows.Forms.RadioButton(); + this.SuspendLayout(); + // + // labelHourMinSecMilliSecond + // + this.labelHourMinSecMilliSecond.AutoSize = true; + this.labelHourMinSecMilliSecond.Location = new System.Drawing.Point(11, 6); + this.labelHourMinSecMilliSecond.Name = "labelHourMinSecMilliSecond"; + this.labelHourMinSecMilliSecond.Size = new System.Drawing.Size(108, 13); + this.labelHourMinSecMilliSecond.TabIndex = 18; + this.labelHourMinSecMilliSecond.Text = "Hours:min:sec.msecs"; + // + // buttonShowLater + // + this.buttonShowLater.Location = new System.Drawing.Point(145, 55); + this.buttonShowLater.Name = "buttonShowLater"; + this.buttonShowLater.Size = new System.Drawing.Size(119, 23); + this.buttonShowLater.TabIndex = 20; + this.buttonShowLater.Text = "Show later"; + this.buttonShowLater.UseVisualStyleBackColor = true; + this.buttonShowLater.Click += new System.EventHandler(this.ButtonShowLaterClick); + // + // buttonShowEarlier + // + this.buttonShowEarlier.Location = new System.Drawing.Point(145, 26); + this.buttonShowEarlier.Name = "buttonShowEarlier"; + this.buttonShowEarlier.Size = new System.Drawing.Size(120, 23); + this.buttonShowEarlier.TabIndex = 19; + this.buttonShowEarlier.Text = "Show earlier"; + this.buttonShowEarlier.UseVisualStyleBackColor = true; + this.buttonShowEarlier.Click += new System.EventHandler(this.ButtonShowEarlierClick); + // + // labelTotalAdjustment + // + this.labelTotalAdjustment.AutoSize = true; + this.labelTotalAdjustment.Location = new System.Drawing.Point(9, 148); + this.labelTotalAdjustment.Name = "labelTotalAdjustment"; + this.labelTotalAdjustment.Size = new System.Drawing.Size(108, 13); + this.labelTotalAdjustment.TabIndex = 38; + this.labelTotalAdjustment.Text = "labelTotalAdjustment"; + // + // timer1 + // + this.timer1.Interval = 250; + // + // radioButtonAllLines + // + this.radioButtonAllLines.AutoSize = true; + this.radioButtonAllLines.Location = new System.Drawing.Point(14, 70); + this.radioButtonAllLines.Name = "radioButtonAllLines"; + this.radioButtonAllLines.Size = new System.Drawing.Size(60, 17); + this.radioButtonAllLines.TabIndex = 39; + this.radioButtonAllLines.TabStop = true; + this.radioButtonAllLines.Text = "All lines"; + this.radioButtonAllLines.UseVisualStyleBackColor = true; + this.radioButtonAllLines.CheckedChanged += new System.EventHandler(this.RadioButtonCheckedChanged); + // + // radioButtonSelectedLinesOnly + // + this.radioButtonSelectedLinesOnly.AutoSize = true; + this.radioButtonSelectedLinesOnly.Location = new System.Drawing.Point(14, 93); + this.radioButtonSelectedLinesOnly.Name = "radioButtonSelectedLinesOnly"; + this.radioButtonSelectedLinesOnly.Size = new System.Drawing.Size(113, 17); + this.radioButtonSelectedLinesOnly.TabIndex = 40; + this.radioButtonSelectedLinesOnly.TabStop = true; + this.radioButtonSelectedLinesOnly.Text = "Selected lines only"; + this.radioButtonSelectedLinesOnly.UseVisualStyleBackColor = true; + this.radioButtonSelectedLinesOnly.CheckedChanged += new System.EventHandler(this.RadioButtonCheckedChanged); + // + // timeUpDownAdjust + // + this.timeUpDownAdjust.AutoSize = true; + this.timeUpDownAdjust.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.timeUpDownAdjust.Font = new System.Drawing.Font("Segoe UI", 9F); + this.timeUpDownAdjust.Location = new System.Drawing.Point(12, 23); + this.timeUpDownAdjust.Margin = new System.Windows.Forms.Padding(4); + this.timeUpDownAdjust.Name = "timeUpDownAdjust"; + this.timeUpDownAdjust.Size = new System.Drawing.Size(96, 27); + this.timeUpDownAdjust.TabIndex = 21; + timeCode1.Hours = 0; + timeCode1.Milliseconds = 0; + timeCode1.Minutes = 0; + timeCode1.Seconds = 0; + timeCode1.TimeSpan = System.TimeSpan.Parse("00:00:00"); + timeCode1.TotalMilliseconds = 0D; + timeCode1.TotalSeconds = 0D; + this.timeUpDownAdjust.TimeCode = timeCode1; + this.timeUpDownAdjust.UseVideoOffset = false; + // + // radioButtonSelectedLineAndForward + // + this.radioButtonSelectedLineAndForward.AutoSize = true; + this.radioButtonSelectedLineAndForward.Location = new System.Drawing.Point(14, 116); + this.radioButtonSelectedLineAndForward.Name = "radioButtonSelectedLineAndForward"; + this.radioButtonSelectedLineAndForward.Size = new System.Drawing.Size(160, 17); + this.radioButtonSelectedLineAndForward.TabIndex = 41; + this.radioButtonSelectedLineAndForward.TabStop = true; + this.radioButtonSelectedLineAndForward.Text = "Selected line(s) and forward"; + this.radioButtonSelectedLineAndForward.UseVisualStyleBackColor = true; + this.radioButtonSelectedLineAndForward.CheckedChanged += new System.EventHandler(this.RadioButtonCheckedChanged); + // + // ShowEarlierLater + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(301, 170); + this.Controls.Add(this.radioButtonSelectedLineAndForward); + this.Controls.Add(this.radioButtonSelectedLinesOnly); + this.Controls.Add(this.radioButtonAllLines); + this.Controls.Add(this.buttonShowLater); + this.Controls.Add(this.buttonShowEarlier); + this.Controls.Add(this.labelTotalAdjustment); + this.Controls.Add(this.timeUpDownAdjust); + this.Controls.Add(this.labelHourMinSecMilliSecond); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "ShowEarlierLater"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Show selected lines earlier/later"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.ShowEarlierLater_FormClosing); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ShowEarlierLater_KeyDown); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private Nikse.SubtitleEdit.Controls.TimeUpDown timeUpDownAdjust; + private System.Windows.Forms.Label labelHourMinSecMilliSecond; + private System.Windows.Forms.Button buttonShowLater; + private System.Windows.Forms.Button buttonShowEarlier; + private System.Windows.Forms.Label labelTotalAdjustment; + private System.Windows.Forms.Timer timer1; + private System.Windows.Forms.RadioButton radioButtonAllLines; + private System.Windows.Forms.RadioButton radioButtonSelectedLinesOnly; + private System.Windows.Forms.RadioButton radioButtonSelectedLineAndForward; + } } \ No newline at end of file diff --git a/src/Forms/ShowEarlierLater.cs b/src/ui/Forms/ShowEarlierLater.cs similarity index 97% rename from src/Forms/ShowEarlierLater.cs rename to src/ui/Forms/ShowEarlierLater.cs index 28cd2703a..e4d350720 100644 --- a/src/Forms/ShowEarlierLater.cs +++ b/src/ui/Forms/ShowEarlierLater.cs @@ -1,140 +1,140 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.Enums; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class ShowEarlierLater : PositionAndSizeForm - { - public delegate void AdjustEventHandler(double adjustMilliseconds, SelectionChoice selection); - - private TimeSpan _totalAdjustment; - private AdjustEventHandler _adjustCallback; - - public ShowEarlierLater() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - ResetTotalAdjustment(); - timeUpDownAdjust.MaskedTextBox.Text = "000000000"; - Text = Configuration.Settings.Language.ShowEarlierLater.Title.RemoveChar('&'); - labelHourMinSecMilliSecond.Text = Configuration.Settings.General.UseTimeFormatHHMMSSFF ? Configuration.Settings.Language.General.HourMinutesSecondsFrames : Configuration.Settings.Language.General.HourMinutesSecondsMilliseconds; - buttonShowEarlier.Text = Configuration.Settings.Language.ShowEarlierLater.ShowEarlier; - buttonShowLater.Text = Configuration.Settings.Language.ShowEarlierLater.ShowLater; - radioButtonAllLines.Text = Configuration.Settings.Language.ShowEarlierLater.AllLines; - radioButtonSelectedLinesOnly.Text = Configuration.Settings.Language.ShowEarlierLater.SelectedLinesOnly; - radioButtonSelectedLineAndForward.Text = Configuration.Settings.Language.ShowEarlierLater.SelectedLinesAndForward; - UiUtil.FixLargeFonts(this, buttonShowEarlier); - - timeUpDownAdjust.MaskedTextBox.TextChanged += (sender, args) => - { - if (timeUpDownAdjust.GetTotalMilliseconds() < 0) - { - timeUpDownAdjust.SetTotalMilliseconds(0); - System.Threading.SynchronizationContext.Current.Post(TimeSpan.FromMilliseconds(10), () => - { - timeUpDownAdjust.SetTotalMilliseconds(0); - }); - } - }; - } - - public void ResetTotalAdjustment() - { - _totalAdjustment = TimeSpan.FromMilliseconds(0); - labelTotalAdjustment.Text = string.Empty; - } - - private void ShowEarlierLater_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - Close(); - } - else if (e.KeyCode == UiUtil.HelpKeys) - { - Utilities.ShowHelp("#sync"); - e.SuppressKeyPress = true; - } - } - - internal void Initialize(AdjustEventHandler adjustCallback, bool onlySelected) - { - if (onlySelected) - { - radioButtonSelectedLinesOnly.Checked = true; - } - else if (Configuration.Settings.Tools.LastShowEarlierOrLaterSelection == SelectionChoice.SelectionAndForward.ToString()) - { - radioButtonSelectedLineAndForward.Checked = true; - } - else - { - radioButtonAllLines.Checked = true; - } - - _adjustCallback = adjustCallback; - timeUpDownAdjust.TimeCode = new TimeCode(Configuration.Settings.General.DefaultAdjustMilliseconds); - } - - private SelectionChoice GetSelectionChoice() - { - if (radioButtonSelectedLinesOnly.Checked) - { - return SelectionChoice.SelectionOnly; - } - - if (radioButtonSelectedLineAndForward.Checked) - { - return SelectionChoice.SelectionAndForward; - } - - return SelectionChoice.AllLines; - } - - private void ButtonShowEarlierClick(object sender, EventArgs e) - { - TimeCode tc = timeUpDownAdjust.TimeCode; - if (tc != null && tc.TotalMilliseconds > 0) - { - _adjustCallback.Invoke(-tc.TotalMilliseconds, GetSelectionChoice()); - _totalAdjustment = TimeSpan.FromMilliseconds(_totalAdjustment.TotalMilliseconds - tc.TotalMilliseconds); - ShowTotalAdjustMent(); - Configuration.Settings.General.DefaultAdjustMilliseconds = (int)tc.TotalMilliseconds; - } - } - - private void ShowTotalAdjustMent() - { - TimeCode tc = new TimeCode(_totalAdjustment); - labelTotalAdjustment.Text = string.Format(Configuration.Settings.Language.ShowEarlierLater.TotalAdjustmentX, tc.ToShortString()); - } - - private void ButtonShowLaterClick(object sender, EventArgs e) - { - TimeCode tc = timeUpDownAdjust.TimeCode; - if (tc != null && tc.TotalMilliseconds > 0) - { - _adjustCallback.Invoke(tc.TotalMilliseconds, GetSelectionChoice()); - _totalAdjustment = TimeSpan.FromMilliseconds(_totalAdjustment.TotalMilliseconds + tc.TotalMilliseconds); - ShowTotalAdjustMent(); - Configuration.Settings.General.DefaultAdjustMilliseconds = (int)tc.TotalMilliseconds; - } - } - - private void RadioButtonCheckedChanged(object sender, EventArgs e) - { - Text = ((RadioButton)sender).Text.RemoveChar('&'); - } - - private void ShowEarlierLater_FormClosing(object sender, FormClosingEventArgs e) - { - Configuration.Settings.Tools.LastShowEarlierOrLaterSelection = GetSelectionChoice().ToString(); - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.Enums; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class ShowEarlierLater : PositionAndSizeForm + { + public delegate void AdjustEventHandler(double adjustMilliseconds, SelectionChoice selection); + + private TimeSpan _totalAdjustment; + private AdjustEventHandler _adjustCallback; + + public ShowEarlierLater() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + ResetTotalAdjustment(); + timeUpDownAdjust.MaskedTextBox.Text = "000000000"; + Text = Configuration.Settings.Language.ShowEarlierLater.Title.RemoveChar('&'); + labelHourMinSecMilliSecond.Text = Configuration.Settings.General.UseTimeFormatHHMMSSFF ? Configuration.Settings.Language.General.HourMinutesSecondsFrames : Configuration.Settings.Language.General.HourMinutesSecondsMilliseconds; + buttonShowEarlier.Text = Configuration.Settings.Language.ShowEarlierLater.ShowEarlier; + buttonShowLater.Text = Configuration.Settings.Language.ShowEarlierLater.ShowLater; + radioButtonAllLines.Text = Configuration.Settings.Language.ShowEarlierLater.AllLines; + radioButtonSelectedLinesOnly.Text = Configuration.Settings.Language.ShowEarlierLater.SelectedLinesOnly; + radioButtonSelectedLineAndForward.Text = Configuration.Settings.Language.ShowEarlierLater.SelectedLinesAndForward; + UiUtil.FixLargeFonts(this, buttonShowEarlier); + + timeUpDownAdjust.MaskedTextBox.TextChanged += (sender, args) => + { + if (timeUpDownAdjust.GetTotalMilliseconds() < 0) + { + timeUpDownAdjust.SetTotalMilliseconds(0); + System.Threading.SynchronizationContext.Current.Post(TimeSpan.FromMilliseconds(10), () => + { + timeUpDownAdjust.SetTotalMilliseconds(0); + }); + } + }; + } + + public void ResetTotalAdjustment() + { + _totalAdjustment = TimeSpan.FromMilliseconds(0); + labelTotalAdjustment.Text = string.Empty; + } + + private void ShowEarlierLater_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + Close(); + } + else if (e.KeyCode == UiUtil.HelpKeys) + { + Utilities.ShowHelp("#sync"); + e.SuppressKeyPress = true; + } + } + + internal void Initialize(AdjustEventHandler adjustCallback, bool onlySelected) + { + if (onlySelected) + { + radioButtonSelectedLinesOnly.Checked = true; + } + else if (Configuration.Settings.Tools.LastShowEarlierOrLaterSelection == SelectionChoice.SelectionAndForward.ToString()) + { + radioButtonSelectedLineAndForward.Checked = true; + } + else + { + radioButtonAllLines.Checked = true; + } + + _adjustCallback = adjustCallback; + timeUpDownAdjust.TimeCode = new TimeCode(Configuration.Settings.General.DefaultAdjustMilliseconds); + } + + private SelectionChoice GetSelectionChoice() + { + if (radioButtonSelectedLinesOnly.Checked) + { + return SelectionChoice.SelectionOnly; + } + + if (radioButtonSelectedLineAndForward.Checked) + { + return SelectionChoice.SelectionAndForward; + } + + return SelectionChoice.AllLines; + } + + private void ButtonShowEarlierClick(object sender, EventArgs e) + { + TimeCode tc = timeUpDownAdjust.TimeCode; + if (tc != null && tc.TotalMilliseconds > 0) + { + _adjustCallback.Invoke(-tc.TotalMilliseconds, GetSelectionChoice()); + _totalAdjustment = TimeSpan.FromMilliseconds(_totalAdjustment.TotalMilliseconds - tc.TotalMilliseconds); + ShowTotalAdjustMent(); + Configuration.Settings.General.DefaultAdjustMilliseconds = (int)tc.TotalMilliseconds; + } + } + + private void ShowTotalAdjustMent() + { + TimeCode tc = new TimeCode(_totalAdjustment); + labelTotalAdjustment.Text = string.Format(Configuration.Settings.Language.ShowEarlierLater.TotalAdjustmentX, tc.ToShortString()); + } + + private void ButtonShowLaterClick(object sender, EventArgs e) + { + TimeCode tc = timeUpDownAdjust.TimeCode; + if (tc != null && tc.TotalMilliseconds > 0) + { + _adjustCallback.Invoke(tc.TotalMilliseconds, GetSelectionChoice()); + _totalAdjustment = TimeSpan.FromMilliseconds(_totalAdjustment.TotalMilliseconds + tc.TotalMilliseconds); + ShowTotalAdjustMent(); + Configuration.Settings.General.DefaultAdjustMilliseconds = (int)tc.TotalMilliseconds; + } + } + + private void RadioButtonCheckedChanged(object sender, EventArgs e) + { + Text = ((RadioButton)sender).Text.RemoveChar('&'); + } + + private void ShowEarlierLater_FormClosing(object sender, FormClosingEventArgs e) + { + Configuration.Settings.Tools.LastShowEarlierOrLaterSelection = GetSelectionChoice().ToString(); + } + + } +} diff --git a/src/Forms/ShowEarlierLater.resx b/src/ui/Forms/ShowEarlierLater.resx similarity index 97% rename from src/Forms/ShowEarlierLater.resx rename to src/ui/Forms/ShowEarlierLater.resx index bb3c53021..d55421f05 100644 --- a/src/Forms/ShowEarlierLater.resx +++ b/src/ui/Forms/ShowEarlierLater.resx @@ -1,123 +1,123 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + \ No newline at end of file diff --git a/src/Forms/ShowHistory.Designer.cs b/src/ui/Forms/ShowHistory.Designer.cs similarity index 97% rename from src/Forms/ShowHistory.Designer.cs rename to src/ui/Forms/ShowHistory.Designer.cs index 42ef31be5..8deddac71 100644 --- a/src/Forms/ShowHistory.Designer.cs +++ b/src/ui/Forms/ShowHistory.Designer.cs @@ -1,158 +1,158 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class ShowHistory - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.listViewHistory = new System.Windows.Forms.ListView(); - this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.buttonRollback = new System.Windows.Forms.Button(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.label1 = new System.Windows.Forms.Label(); - this.buttonCompare = new System.Windows.Forms.Button(); - this.buttonCompareHistory = new System.Windows.Forms.Button(); - this.SuspendLayout(); - // - // listViewHistory - // - this.listViewHistory.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeader1, - this.columnHeader2}); - this.listViewHistory.FullRowSelect = true; - this.listViewHistory.HideSelection = false; - this.listViewHistory.Location = new System.Drawing.Point(12, 37); - this.listViewHistory.Name = "listViewHistory"; - this.listViewHistory.Size = new System.Drawing.Size(472, 324); - this.listViewHistory.TabIndex = 0; - this.listViewHistory.UseCompatibleStateImageBehavior = false; - this.listViewHistory.View = System.Windows.Forms.View.Details; - this.listViewHistory.SelectedIndexChanged += new System.EventHandler(this.ListViewHistorySelectedIndexChanged); - // - // columnHeader1 - // - this.columnHeader1.Text = "Time"; - this.columnHeader1.Width = 80; - // - // columnHeader2 - // - this.columnHeader2.Text = "Description"; - this.columnHeader2.Width = 365; - // - // buttonRollback - // - this.buttonRollback.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonRollback.Location = new System.Drawing.Point(489, 338); - this.buttonRollback.Name = "buttonRollback"; - this.buttonRollback.Size = new System.Drawing.Size(98, 23); - this.buttonRollback.TabIndex = 6; - this.buttonRollback.Text = "&Rollback"; - this.buttonRollback.UseVisualStyleBackColor = true; - this.buttonRollback.Click += new System.EventHandler(this.ButtonOkClick); - // - // buttonCancel - // - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(594, 338); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 8; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(12, 18); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(171, 13); - this.label1.TabIndex = 10; - this.label1.Text = "Select time/description for rollback"; - // - // buttonCompare - // - this.buttonCompare.Enabled = false; - this.buttonCompare.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCompare.Location = new System.Drawing.Point(489, 200); - this.buttonCompare.Name = "buttonCompare"; - this.buttonCompare.Size = new System.Drawing.Size(179, 23); - this.buttonCompare.TabIndex = 4; - this.buttonCompare.Text = "&Compare with current"; - this.buttonCompare.UseVisualStyleBackColor = true; - this.buttonCompare.Click += new System.EventHandler(this.ButtonCompareClick); - // - // buttonCompareHistory - // - this.buttonCompareHistory.Enabled = false; - this.buttonCompareHistory.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCompareHistory.Location = new System.Drawing.Point(490, 171); - this.buttonCompareHistory.Name = "buttonCompareHistory"; - this.buttonCompareHistory.Size = new System.Drawing.Size(179, 23); - this.buttonCompareHistory.TabIndex = 2; - this.buttonCompareHistory.Text = "&Compare history items"; - this.buttonCompareHistory.UseVisualStyleBackColor = true; - this.buttonCompareHistory.Click += new System.EventHandler(this.ButtonCompareHistoryClick); - // - // ShowHistory - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(680, 373); - this.Controls.Add(this.buttonCompareHistory); - this.Controls.Add(this.buttonCompare); - this.Controls.Add(this.label1); - this.Controls.Add(this.buttonRollback); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.listViewHistory); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "ShowHistory"; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "History (for undo)"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormShowHistory_KeyDown); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.ListView listViewHistory; - private System.Windows.Forms.ColumnHeader columnHeader1; - private System.Windows.Forms.ColumnHeader columnHeader2; - private System.Windows.Forms.Button buttonRollback; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.Button buttonCompare; - private System.Windows.Forms.Button buttonCompareHistory; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class ShowHistory + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.listViewHistory = new System.Windows.Forms.ListView(); + this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.buttonRollback = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.buttonCompare = new System.Windows.Forms.Button(); + this.buttonCompareHistory = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // listViewHistory + // + this.listViewHistory.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader1, + this.columnHeader2}); + this.listViewHistory.FullRowSelect = true; + this.listViewHistory.HideSelection = false; + this.listViewHistory.Location = new System.Drawing.Point(12, 37); + this.listViewHistory.Name = "listViewHistory"; + this.listViewHistory.Size = new System.Drawing.Size(472, 324); + this.listViewHistory.TabIndex = 0; + this.listViewHistory.UseCompatibleStateImageBehavior = false; + this.listViewHistory.View = System.Windows.Forms.View.Details; + this.listViewHistory.SelectedIndexChanged += new System.EventHandler(this.ListViewHistorySelectedIndexChanged); + // + // columnHeader1 + // + this.columnHeader1.Text = "Time"; + this.columnHeader1.Width = 80; + // + // columnHeader2 + // + this.columnHeader2.Text = "Description"; + this.columnHeader2.Width = 365; + // + // buttonRollback + // + this.buttonRollback.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonRollback.Location = new System.Drawing.Point(489, 338); + this.buttonRollback.Name = "buttonRollback"; + this.buttonRollback.Size = new System.Drawing.Size(98, 23); + this.buttonRollback.TabIndex = 6; + this.buttonRollback.Text = "&Rollback"; + this.buttonRollback.UseVisualStyleBackColor = true; + this.buttonRollback.Click += new System.EventHandler(this.ButtonOkClick); + // + // buttonCancel + // + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(594, 338); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 8; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(12, 18); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(171, 13); + this.label1.TabIndex = 10; + this.label1.Text = "Select time/description for rollback"; + // + // buttonCompare + // + this.buttonCompare.Enabled = false; + this.buttonCompare.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCompare.Location = new System.Drawing.Point(489, 200); + this.buttonCompare.Name = "buttonCompare"; + this.buttonCompare.Size = new System.Drawing.Size(179, 23); + this.buttonCompare.TabIndex = 4; + this.buttonCompare.Text = "&Compare with current"; + this.buttonCompare.UseVisualStyleBackColor = true; + this.buttonCompare.Click += new System.EventHandler(this.ButtonCompareClick); + // + // buttonCompareHistory + // + this.buttonCompareHistory.Enabled = false; + this.buttonCompareHistory.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCompareHistory.Location = new System.Drawing.Point(490, 171); + this.buttonCompareHistory.Name = "buttonCompareHistory"; + this.buttonCompareHistory.Size = new System.Drawing.Size(179, 23); + this.buttonCompareHistory.TabIndex = 2; + this.buttonCompareHistory.Text = "&Compare history items"; + this.buttonCompareHistory.UseVisualStyleBackColor = true; + this.buttonCompareHistory.Click += new System.EventHandler(this.ButtonCompareHistoryClick); + // + // ShowHistory + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(680, 373); + this.Controls.Add(this.buttonCompareHistory); + this.Controls.Add(this.buttonCompare); + this.Controls.Add(this.label1); + this.Controls.Add(this.buttonRollback); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.listViewHistory); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "ShowHistory"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "History (for undo)"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormShowHistory_KeyDown); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ListView listViewHistory; + private System.Windows.Forms.ColumnHeader columnHeader1; + private System.Windows.Forms.ColumnHeader columnHeader2; + private System.Windows.Forms.Button buttonRollback; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button buttonCompare; + private System.Windows.Forms.Button buttonCompareHistory; + } } \ No newline at end of file diff --git a/src/Forms/ShowHistory.cs b/src/ui/Forms/ShowHistory.cs similarity index 97% rename from src/Forms/ShowHistory.cs rename to src/ui/Forms/ShowHistory.cs index 12bba9a3f..2202dec28 100644 --- a/src/Forms/ShowHistory.cs +++ b/src/ui/Forms/ShowHistory.cs @@ -1,128 +1,128 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Drawing; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class ShowHistory : Form - { - private int _selectedIndex = -1; - private Subtitle _subtitle; - private int _undoIndex; - - public ShowHistory() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - Text = Configuration.Settings.Language.ShowHistory.Title; - label1.Text = Configuration.Settings.Language.ShowHistory.SelectRollbackPoint; - listViewHistory.Columns[0].Text = Configuration.Settings.Language.ShowHistory.Time; - listViewHistory.Columns[1].Text = Configuration.Settings.Language.ShowHistory.Description; - buttonCompare.Text = Configuration.Settings.Language.ShowHistory.CompareWithCurrent; - buttonCompareHistory.Text = Configuration.Settings.Language.ShowHistory.CompareHistoryItems; - buttonRollback.Text = Configuration.Settings.Language.ShowHistory.Rollback; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - UiUtil.FixLargeFonts(this, buttonRollback); - } - - public int SelectedIndex => _selectedIndex; - - public void Initialize(Subtitle subtitle, int undoIndex) - { - _subtitle = subtitle; - _undoIndex = undoIndex; - int i = 0; - foreach (HistoryItem item in subtitle.HistoryItems) - { - AddHistoryItemToListView(item, i++); - } - ListViewHistorySelectedIndexChanged(null, null); - if (listViewHistory.Items.Count > 0 && _undoIndex >= 0 && _undoIndex < listViewHistory.Items.Count) - { - listViewHistory.Items[_undoIndex].Selected = true; - } - } - - private void AddHistoryItemToListView(HistoryItem hi, int index) - { - var item = new ListViewItem(string.Empty) - { - Tag = hi, - Text = hi.ToHHMMSS() - }; - - if (index > _undoIndex) - { - item.UseItemStyleForSubItems = true; - item.Font = new Font(item.Font.FontFamily, item.Font.SizeInPoints, FontStyle.Italic); - item.ForeColor = Color.Gray; - } - item.SubItems.Add(hi.Description); - listViewHistory.Items.Add(item); - } - - private void FormShowHistory_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - private void ButtonOkClick(object sender, EventArgs e) - { - if (listViewHistory.SelectedItems.Count > 0) - { - _selectedIndex = listViewHistory.SelectedItems[0].Index; - DialogResult = DialogResult.OK; - } - else - { - DialogResult = DialogResult.Cancel; - } - } - - private void ButtonCompareClick(object sender, EventArgs e) - { - if (listViewHistory.SelectedItems.Count == 1) - { - HistoryItem h2 = _subtitle.HistoryItems[listViewHistory.SelectedItems[0].Index]; - string descr2 = h2.ToHHMMSS() + " - " + h2.Description; - using (var compareForm = new Compare()) - { - compareForm.Initialize(_subtitle, Configuration.Settings.Language.General.CurrentSubtitle, h2.Subtitle, descr2); - compareForm.ShowDialog(this); - } - } - } - - private void ListViewHistorySelectedIndexChanged(object sender, EventArgs e) - { - buttonCompare.Enabled = listViewHistory.SelectedItems.Count == 1; - buttonCompareHistory.Enabled = listViewHistory.SelectedItems.Count == 2; - buttonRollback.Enabled = listViewHistory.SelectedItems.Count == 1 && listViewHistory.SelectedItems[0].Index <= _undoIndex; - } - - private void ButtonCompareHistoryClick(object sender, EventArgs e) - { - if (listViewHistory.SelectedItems.Count == 2) - { - HistoryItem h1 = _subtitle.HistoryItems[listViewHistory.SelectedItems[0].Index]; - HistoryItem h2 = _subtitle.HistoryItems[listViewHistory.SelectedItems[1].Index]; - string descr1 = h1.ToHHMMSS() + " - " + h1.Description; - string descr2 = h2.ToHHMMSS() + " - " + h2.Description; - using (var compareForm = new Compare()) - { - compareForm.Initialize(h1.Subtitle, descr1, h2.Subtitle, descr2); - compareForm.ShowDialog(this); - } - } - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Drawing; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class ShowHistory : Form + { + private int _selectedIndex = -1; + private Subtitle _subtitle; + private int _undoIndex; + + public ShowHistory() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + Text = Configuration.Settings.Language.ShowHistory.Title; + label1.Text = Configuration.Settings.Language.ShowHistory.SelectRollbackPoint; + listViewHistory.Columns[0].Text = Configuration.Settings.Language.ShowHistory.Time; + listViewHistory.Columns[1].Text = Configuration.Settings.Language.ShowHistory.Description; + buttonCompare.Text = Configuration.Settings.Language.ShowHistory.CompareWithCurrent; + buttonCompareHistory.Text = Configuration.Settings.Language.ShowHistory.CompareHistoryItems; + buttonRollback.Text = Configuration.Settings.Language.ShowHistory.Rollback; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + UiUtil.FixLargeFonts(this, buttonRollback); + } + + public int SelectedIndex => _selectedIndex; + + public void Initialize(Subtitle subtitle, int undoIndex) + { + _subtitle = subtitle; + _undoIndex = undoIndex; + int i = 0; + foreach (HistoryItem item in subtitle.HistoryItems) + { + AddHistoryItemToListView(item, i++); + } + ListViewHistorySelectedIndexChanged(null, null); + if (listViewHistory.Items.Count > 0 && _undoIndex >= 0 && _undoIndex < listViewHistory.Items.Count) + { + listViewHistory.Items[_undoIndex].Selected = true; + } + } + + private void AddHistoryItemToListView(HistoryItem hi, int index) + { + var item = new ListViewItem(string.Empty) + { + Tag = hi, + Text = hi.ToHHMMSS() + }; + + if (index > _undoIndex) + { + item.UseItemStyleForSubItems = true; + item.Font = new Font(item.Font.FontFamily, item.Font.SizeInPoints, FontStyle.Italic); + item.ForeColor = Color.Gray; + } + item.SubItems.Add(hi.Description); + listViewHistory.Items.Add(item); + } + + private void FormShowHistory_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + private void ButtonOkClick(object sender, EventArgs e) + { + if (listViewHistory.SelectedItems.Count > 0) + { + _selectedIndex = listViewHistory.SelectedItems[0].Index; + DialogResult = DialogResult.OK; + } + else + { + DialogResult = DialogResult.Cancel; + } + } + + private void ButtonCompareClick(object sender, EventArgs e) + { + if (listViewHistory.SelectedItems.Count == 1) + { + HistoryItem h2 = _subtitle.HistoryItems[listViewHistory.SelectedItems[0].Index]; + string descr2 = h2.ToHHMMSS() + " - " + h2.Description; + using (var compareForm = new Compare()) + { + compareForm.Initialize(_subtitle, Configuration.Settings.Language.General.CurrentSubtitle, h2.Subtitle, descr2); + compareForm.ShowDialog(this); + } + } + } + + private void ListViewHistorySelectedIndexChanged(object sender, EventArgs e) + { + buttonCompare.Enabled = listViewHistory.SelectedItems.Count == 1; + buttonCompareHistory.Enabled = listViewHistory.SelectedItems.Count == 2; + buttonRollback.Enabled = listViewHistory.SelectedItems.Count == 1 && listViewHistory.SelectedItems[0].Index <= _undoIndex; + } + + private void ButtonCompareHistoryClick(object sender, EventArgs e) + { + if (listViewHistory.SelectedItems.Count == 2) + { + HistoryItem h1 = _subtitle.HistoryItems[listViewHistory.SelectedItems[0].Index]; + HistoryItem h2 = _subtitle.HistoryItems[listViewHistory.SelectedItems[1].Index]; + string descr1 = h1.ToHHMMSS() + " - " + h1.Description; + string descr2 = h2.ToHHMMSS() + " - " + h2.Description; + using (var compareForm = new Compare()) + { + compareForm.Initialize(h1.Subtitle, descr1, h2.Subtitle, descr2); + compareForm.ShowDialog(this); + } + } + } + + } +} diff --git a/src/Forms/ShowHistory.resx b/src/ui/Forms/ShowHistory.resx similarity index 97% rename from src/Forms/ShowHistory.resx rename to src/ui/Forms/ShowHistory.resx index c7e0d4bdf..d58980a38 100644 --- a/src/Forms/ShowHistory.resx +++ b/src/ui/Forms/ShowHistory.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Forms/SpellCheck.Designer.cs b/src/ui/Forms/SpellCheck.Designer.cs similarity index 98% rename from src/Forms/SpellCheck.Designer.cs rename to src/ui/Forms/SpellCheck.Designer.cs index d895f55dc..97a870bfe 100644 --- a/src/Forms/SpellCheck.Designer.cs +++ b/src/ui/Forms/SpellCheck.Designer.cs @@ -1,469 +1,469 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class SpellCheck - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.buttonAddToDictionary = new System.Windows.Forms.Button(); - this.buttonSkipOnce = new System.Windows.Forms.Button(); - this.comboBoxDictionaries = new System.Windows.Forms.ComboBox(); - this.labelLanguage = new System.Windows.Forms.Label(); - this.richTextBoxParagraph = new System.Windows.Forms.RichTextBox(); - this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); - this.addXToNamesnoiseListToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.addXToUserDictionaryToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); - this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.listBoxSuggestions = new System.Windows.Forms.ListBox(); - this.labelFullText = new System.Windows.Forms.Label(); - this.textBoxWord = new System.Windows.Forms.TextBox(); - this.buttonAbort = new System.Windows.Forms.Button(); - this.buttonSkipAll = new System.Windows.Forms.Button(); - this.buttonChange = new System.Windows.Forms.Button(); - this.buttonUseSuggestion = new System.Windows.Forms.Button(); - this.buttonChangeAll = new System.Windows.Forms.Button(); - this.buttonUseSuggestionAlways = new System.Windows.Forms.Button(); - this.buttonAddToNames = new System.Windows.Forms.Button(); - this.groupBoxWordNotFound = new System.Windows.Forms.GroupBox(); - this.buttonGoogleIt = new System.Windows.Forms.Button(); - this.buttonUndo = new System.Windows.Forms.Button(); - this.groupBoxSuggestions = new System.Windows.Forms.GroupBox(); - this.checkBoxAutoChangeNames = new System.Windows.Forms.CheckBox(); - this.buttonEditWholeText = new System.Windows.Forms.Button(); - this.groupBoxEditWholeText = new System.Windows.Forms.GroupBox(); - this.buttonSkipText = new System.Windows.Forms.Button(); - this.buttonChangeWholeText = new System.Windows.Forms.Button(); - this.textBoxWholeText = new System.Windows.Forms.TextBox(); - this.labelActionInfo = new System.Windows.Forms.Label(); - this.buttonSpellCheckDownload = new System.Windows.Forms.Button(); - this.contextMenuStrip1.SuspendLayout(); - this.groupBoxWordNotFound.SuspendLayout(); - this.groupBoxSuggestions.SuspendLayout(); - this.groupBoxEditWholeText.SuspendLayout(); - this.SuspendLayout(); - // - // buttonAddToDictionary - // - this.buttonAddToDictionary.Location = new System.Drawing.Point(6, 134); - this.buttonAddToDictionary.Name = "buttonAddToDictionary"; - this.buttonAddToDictionary.Size = new System.Drawing.Size(280, 23); - this.buttonAddToDictionary.TabIndex = 6; - this.buttonAddToDictionary.Text = "Add to user dictionary (not case sensitive)"; - this.buttonAddToDictionary.UseVisualStyleBackColor = true; - this.buttonAddToDictionary.Click += new System.EventHandler(this.ButtonAddToDictionaryClick); - this.buttonAddToDictionary.MouseEnter += new System.EventHandler(this.buttonAddToDictionary_MouseEnter); - this.buttonAddToDictionary.MouseLeave += new System.EventHandler(this.buttonAddToDictionary_MouseLeave); - // - // buttonSkipOnce - // - this.buttonSkipOnce.Location = new System.Drawing.Point(6, 76); - this.buttonSkipOnce.Name = "buttonSkipOnce"; - this.buttonSkipOnce.Size = new System.Drawing.Size(136, 23); - this.buttonSkipOnce.TabIndex = 3; - this.buttonSkipOnce.Text = "Skip &once"; - this.buttonSkipOnce.UseVisualStyleBackColor = true; - this.buttonSkipOnce.Click += new System.EventHandler(this.ButtonSkipOnceClick); - this.buttonSkipOnce.MouseEnter += new System.EventHandler(this.buttonSkipOnce_MouseEnter); - this.buttonSkipOnce.MouseLeave += new System.EventHandler(this.buttonSkipOnce_MouseLeave); - // - // comboBoxDictionaries - // - this.comboBoxDictionaries.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxDictionaries.FormattingEnabled = true; - this.comboBoxDictionaries.Location = new System.Drawing.Point(317, 33); - this.comboBoxDictionaries.Name = "comboBoxDictionaries"; - this.comboBoxDictionaries.Size = new System.Drawing.Size(237, 21); - this.comboBoxDictionaries.TabIndex = 8; - this.comboBoxDictionaries.SelectedIndexChanged += new System.EventHandler(this.ComboBoxDictionariesSelectedIndexChanged); - // - // labelLanguage - // - this.labelLanguage.AutoSize = true; - this.labelLanguage.Location = new System.Drawing.Point(314, 14); - this.labelLanguage.Name = "labelLanguage"; - this.labelLanguage.Size = new System.Drawing.Size(54, 13); - this.labelLanguage.TabIndex = 7; - this.labelLanguage.Text = "Language"; - // - // richTextBoxParagraph - // - this.richTextBoxParagraph.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.richTextBoxParagraph.ContextMenuStrip = this.contextMenuStrip1; - this.richTextBoxParagraph.Location = new System.Drawing.Point(11, 33); - this.richTextBoxParagraph.Name = "richTextBoxParagraph"; - this.richTextBoxParagraph.ReadOnly = true; - this.richTextBoxParagraph.Size = new System.Drawing.Size(292, 54); - this.richTextBoxParagraph.TabIndex = 5; - this.richTextBoxParagraph.Text = ""; - // - // contextMenuStrip1 - // - this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.addXToNamesnoiseListToolStripMenuItem, - this.addXToUserDictionaryToolStripMenuItem, - this.toolStripSeparator1, - this.deleteToolStripMenuItem}); - this.contextMenuStrip1.Name = "contextMenuStrip1"; - this.contextMenuStrip1.Size = new System.Drawing.Size(209, 76); - this.contextMenuStrip1.Opening += new System.ComponentModel.CancelEventHandler(this.ContextMenuStrip1Opening); - // - // addXToNamesnoiseListToolStripMenuItem - // - this.addXToNamesnoiseListToolStripMenuItem.Name = "addXToNamesnoiseListToolStripMenuItem"; - this.addXToNamesnoiseListToolStripMenuItem.Size = new System.Drawing.Size(208, 22); - this.addXToNamesnoiseListToolStripMenuItem.Text = "Add x to names/noise list"; - this.addXToNamesnoiseListToolStripMenuItem.Click += new System.EventHandler(this.AddXToNamesnoiseListToolStripMenuItemClick); - // - // addXToUserDictionaryToolStripMenuItem - // - this.addXToUserDictionaryToolStripMenuItem.Name = "addXToUserDictionaryToolStripMenuItem"; - this.addXToUserDictionaryToolStripMenuItem.Size = new System.Drawing.Size(208, 22); - this.addXToUserDictionaryToolStripMenuItem.Text = "Add x to user dictionary"; - this.addXToUserDictionaryToolStripMenuItem.Click += new System.EventHandler(this.AddXToUserDictionaryToolStripMenuItem_Click); - // - // toolStripSeparator1 - // - this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(205, 6); - // - // deleteToolStripMenuItem - // - this.deleteToolStripMenuItem.Name = "deleteToolStripMenuItem"; - this.deleteToolStripMenuItem.Size = new System.Drawing.Size(208, 22); - this.deleteToolStripMenuItem.Text = "Delete..."; - this.deleteToolStripMenuItem.Click += new System.EventHandler(this.deleteToolStripMenuItem_Click); - // - // listBoxSuggestions - // - this.listBoxSuggestions.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left))); - this.listBoxSuggestions.FormattingEnabled = true; - this.listBoxSuggestions.Location = new System.Drawing.Point(8, 47); - this.listBoxSuggestions.Name = "listBoxSuggestions"; - this.listBoxSuggestions.Size = new System.Drawing.Size(272, 121); - this.listBoxSuggestions.TabIndex = 2; - this.listBoxSuggestions.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.ListBoxSuggestionsMouseDoubleClick); - // - // labelFullText - // - this.labelFullText.AutoSize = true; - this.labelFullText.Location = new System.Drawing.Point(8, 14); - this.labelFullText.Name = "labelFullText"; - this.labelFullText.Size = new System.Drawing.Size(46, 13); - this.labelFullText.TabIndex = 4; - this.labelFullText.Text = "Full text"; - // - // textBoxWord - // - this.textBoxWord.Location = new System.Drawing.Point(6, 20); - this.textBoxWord.Name = "textBoxWord"; - this.textBoxWord.Size = new System.Drawing.Size(280, 21); - this.textBoxWord.TabIndex = 0; - this.textBoxWord.TextChanged += new System.EventHandler(this.textBoxWord_TextChanged); - // - // buttonAbort - // - this.buttonAbort.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonAbort.Location = new System.Drawing.Point(515, 351); - this.buttonAbort.Name = "buttonAbort"; - this.buttonAbort.Size = new System.Drawing.Size(85, 23); - this.buttonAbort.TabIndex = 3; - this.buttonAbort.Text = "Abort"; - this.buttonAbort.UseVisualStyleBackColor = true; - this.buttonAbort.Click += new System.EventHandler(this.ButtonAbortClick); - // - // buttonSkipAll - // - this.buttonSkipAll.Location = new System.Drawing.Point(147, 76); - this.buttonSkipAll.Name = "buttonSkipAll"; - this.buttonSkipAll.Size = new System.Drawing.Size(138, 23); - this.buttonSkipAll.TabIndex = 4; - this.buttonSkipAll.Text = "&Skip all"; - this.buttonSkipAll.UseVisualStyleBackColor = true; - this.buttonSkipAll.Click += new System.EventHandler(this.ButtonSkipAllClick); - this.buttonSkipAll.MouseEnter += new System.EventHandler(this.buttonSkipAll_MouseEnter); - this.buttonSkipAll.MouseLeave += new System.EventHandler(this.buttonSkipAll_MouseLeave); - // - // buttonChange - // - this.buttonChange.Location = new System.Drawing.Point(6, 47); - this.buttonChange.Name = "buttonChange"; - this.buttonChange.Size = new System.Drawing.Size(136, 23); - this.buttonChange.TabIndex = 1; - this.buttonChange.Text = "Change"; - this.buttonChange.UseVisualStyleBackColor = true; - this.buttonChange.Click += new System.EventHandler(this.ButtonChangeClick); - this.buttonChange.MouseEnter += new System.EventHandler(this.buttonChange_MouseEnter); - this.buttonChange.MouseLeave += new System.EventHandler(this.buttonChange_MouseLeave); - // - // buttonUseSuggestion - // - this.buttonUseSuggestion.Location = new System.Drawing.Point(68, 17); - this.buttonUseSuggestion.Name = "buttonUseSuggestion"; - this.buttonUseSuggestion.Size = new System.Drawing.Size(90, 23); - this.buttonUseSuggestion.TabIndex = 0; - this.buttonUseSuggestion.Text = "Use"; - this.buttonUseSuggestion.UseVisualStyleBackColor = true; - this.buttonUseSuggestion.Click += new System.EventHandler(this.ButtonUseSuggestionClick); - // - // buttonChangeAll - // - this.buttonChangeAll.Location = new System.Drawing.Point(148, 47); - this.buttonChangeAll.Name = "buttonChangeAll"; - this.buttonChangeAll.Size = new System.Drawing.Size(138, 23); - this.buttonChangeAll.TabIndex = 2; - this.buttonChangeAll.Text = "Change all"; - this.buttonChangeAll.UseVisualStyleBackColor = true; - this.buttonChangeAll.Click += new System.EventHandler(this.ButtonChangeAllClick); - this.buttonChangeAll.MouseEnter += new System.EventHandler(this.buttonChangeAll_MouseEnter); - this.buttonChangeAll.MouseLeave += new System.EventHandler(this.buttonChangeAll_MouseLeave); - // - // buttonUseSuggestionAlways - // - this.buttonUseSuggestionAlways.Location = new System.Drawing.Point(164, 17); - this.buttonUseSuggestionAlways.Name = "buttonUseSuggestionAlways"; - this.buttonUseSuggestionAlways.Size = new System.Drawing.Size(115, 23); - this.buttonUseSuggestionAlways.TabIndex = 1; - this.buttonUseSuggestionAlways.Text = "Use always"; - this.buttonUseSuggestionAlways.UseVisualStyleBackColor = true; - this.buttonUseSuggestionAlways.Click += new System.EventHandler(this.ButtonUseSuggestionAlwaysClick); - // - // buttonAddToNames - // - this.buttonAddToNames.Location = new System.Drawing.Point(5, 105); - this.buttonAddToNames.Name = "buttonAddToNames"; - this.buttonAddToNames.Size = new System.Drawing.Size(280, 23); - this.buttonAddToNames.TabIndex = 5; - this.buttonAddToNames.Text = "Add to names/noise list (case sensitive)"; - this.buttonAddToNames.UseVisualStyleBackColor = true; - this.buttonAddToNames.Click += new System.EventHandler(this.ButtonAddToNamesClick); - this.buttonAddToNames.MouseEnter += new System.EventHandler(this.buttonAddToNames_MouseEnter); - this.buttonAddToNames.MouseLeave += new System.EventHandler(this.buttonAddToNames_MouseLeave); - // - // groupBoxWordNotFound - // - this.groupBoxWordNotFound.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left))); - this.groupBoxWordNotFound.Controls.Add(this.buttonGoogleIt); - this.groupBoxWordNotFound.Controls.Add(this.buttonUndo); - this.groupBoxWordNotFound.Controls.Add(this.buttonAddToNames); - this.groupBoxWordNotFound.Controls.Add(this.buttonAddToDictionary); - this.groupBoxWordNotFound.Controls.Add(this.buttonSkipOnce); - this.groupBoxWordNotFound.Controls.Add(this.buttonChangeAll); - this.groupBoxWordNotFound.Controls.Add(this.textBoxWord); - this.groupBoxWordNotFound.Controls.Add(this.buttonSkipAll); - this.groupBoxWordNotFound.Controls.Add(this.buttonChange); - this.groupBoxWordNotFound.Location = new System.Drawing.Point(11, 120); - this.groupBoxWordNotFound.Name = "groupBoxWordNotFound"; - this.groupBoxWordNotFound.Size = new System.Drawing.Size(292, 225); - this.groupBoxWordNotFound.TabIndex = 0; - this.groupBoxWordNotFound.TabStop = false; - this.groupBoxWordNotFound.Text = "Word not found"; - // - // buttonGoogleIt - // - this.buttonGoogleIt.Location = new System.Drawing.Point(6, 163); - this.buttonGoogleIt.Name = "buttonGoogleIt"; - this.buttonGoogleIt.Size = new System.Drawing.Size(280, 23); - this.buttonGoogleIt.TabIndex = 7; - this.buttonGoogleIt.Text = "&Google it"; - this.buttonGoogleIt.UseVisualStyleBackColor = true; - this.buttonGoogleIt.Click += new System.EventHandler(this.buttonGoogleIt_Click); - // - // buttonUndo - // - this.buttonUndo.Location = new System.Drawing.Point(6, 192); - this.buttonUndo.Name = "buttonUndo"; - this.buttonUndo.Size = new System.Drawing.Size(280, 23); - this.buttonUndo.TabIndex = 8; - this.buttonUndo.Text = "Undo: skip all \'A\'"; - this.buttonUndo.UseVisualStyleBackColor = true; - this.buttonUndo.Visible = false; - this.buttonUndo.Click += new System.EventHandler(this.buttonUndo_Click); - // - // groupBoxSuggestions - // - this.groupBoxSuggestions.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxSuggestions.Controls.Add(this.buttonUseSuggestion); - this.groupBoxSuggestions.Controls.Add(this.buttonUseSuggestionAlways); - this.groupBoxSuggestions.Controls.Add(this.checkBoxAutoChangeNames); - this.groupBoxSuggestions.Controls.Add(this.listBoxSuggestions); - this.groupBoxSuggestions.Location = new System.Drawing.Point(309, 120); - this.groupBoxSuggestions.Name = "groupBoxSuggestions"; - this.groupBoxSuggestions.Size = new System.Drawing.Size(291, 225); - this.groupBoxSuggestions.TabIndex = 1; - this.groupBoxSuggestions.TabStop = false; - this.groupBoxSuggestions.Text = "Suggestions"; - // - // checkBoxAutoChangeNames - // - this.checkBoxAutoChangeNames.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.checkBoxAutoChangeNames.AutoSize = true; - this.checkBoxAutoChangeNames.Location = new System.Drawing.Point(8, 201); - this.checkBoxAutoChangeNames.Name = "checkBoxAutoChangeNames"; - this.checkBoxAutoChangeNames.Size = new System.Drawing.Size(216, 17); - this.checkBoxAutoChangeNames.TabIndex = 3; - this.checkBoxAutoChangeNames.Text = "Auto fix names where only casing differ"; - this.checkBoxAutoChangeNames.UseVisualStyleBackColor = true; - this.checkBoxAutoChangeNames.CheckedChanged += new System.EventHandler(this.CheckBoxAutoChangeNamesCheckedChanged); - // - // buttonEditWholeText - // - this.buttonEditWholeText.Location = new System.Drawing.Point(175, 91); - this.buttonEditWholeText.Name = "buttonEditWholeText"; - this.buttonEditWholeText.Size = new System.Drawing.Size(128, 23); - this.buttonEditWholeText.TabIndex = 6; - this.buttonEditWholeText.Text = "Edit whole text"; - this.buttonEditWholeText.UseVisualStyleBackColor = true; - this.buttonEditWholeText.Click += new System.EventHandler(this.ButtonEditWholeTextClick); - // - // groupBoxEditWholeText - // - this.groupBoxEditWholeText.Controls.Add(this.buttonSkipText); - this.groupBoxEditWholeText.Controls.Add(this.buttonChangeWholeText); - this.groupBoxEditWholeText.Controls.Add(this.textBoxWholeText); - this.groupBoxEditWholeText.Location = new System.Drawing.Point(11, 120); - this.groupBoxEditWholeText.Name = "groupBoxEditWholeText"; - this.groupBoxEditWholeText.Size = new System.Drawing.Size(292, 192); - this.groupBoxEditWholeText.TabIndex = 40; - this.groupBoxEditWholeText.TabStop = false; - this.groupBoxEditWholeText.Text = "Edit whole text"; - // - // buttonSkipText - // - this.buttonSkipText.Location = new System.Drawing.Point(151, 88); - this.buttonSkipText.Name = "buttonSkipText"; - this.buttonSkipText.Size = new System.Drawing.Size(135, 21); - this.buttonSkipText.TabIndex = 35; - this.buttonSkipText.Text = "Skip once"; - this.buttonSkipText.UseVisualStyleBackColor = true; - this.buttonSkipText.Click += new System.EventHandler(this.ButtonSkipTextClick); - // - // buttonChangeWholeText - // - this.buttonChangeWholeText.Location = new System.Drawing.Point(6, 88); - this.buttonChangeWholeText.Name = "buttonChangeWholeText"; - this.buttonChangeWholeText.Size = new System.Drawing.Size(135, 21); - this.buttonChangeWholeText.TabIndex = 0; - this.buttonChangeWholeText.Text = "Change"; - this.buttonChangeWholeText.UseVisualStyleBackColor = true; - this.buttonChangeWholeText.Click += new System.EventHandler(this.ButtonChangeWholeTextClick); - // - // textBoxWholeText - // - this.textBoxWholeText.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.textBoxWholeText.Location = new System.Drawing.Point(6, 19); - this.textBoxWholeText.Multiline = true; - this.textBoxWholeText.Name = "textBoxWholeText"; - this.textBoxWholeText.Size = new System.Drawing.Size(280, 63); - this.textBoxWholeText.TabIndex = 31; - // - // labelActionInfo - // - this.labelActionInfo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelActionInfo.AutoSize = true; - this.labelActionInfo.Location = new System.Drawing.Point(12, 364); - this.labelActionInfo.Name = "labelActionInfo"; - this.labelActionInfo.Size = new System.Drawing.Size(79, 13); - this.labelActionInfo.TabIndex = 2; - this.labelActionInfo.Text = "labelActionInfo"; - // - // buttonSpellCheckDownload - // - this.buttonSpellCheckDownload.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonSpellCheckDownload.Location = new System.Drawing.Point(560, 32); - this.buttonSpellCheckDownload.Name = "buttonSpellCheckDownload"; - this.buttonSpellCheckDownload.Size = new System.Drawing.Size(28, 23); - this.buttonSpellCheckDownload.TabIndex = 9; - this.buttonSpellCheckDownload.Text = "..."; - this.buttonSpellCheckDownload.UseVisualStyleBackColor = true; - this.buttonSpellCheckDownload.Click += new System.EventHandler(this.buttonSpellCheckDownload_Click); - // - // SpellCheck - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(612, 386); - this.Controls.Add(this.buttonSpellCheckDownload); - this.Controls.Add(this.labelActionInfo); - this.Controls.Add(this.richTextBoxParagraph); - this.Controls.Add(this.comboBoxDictionaries); - this.Controls.Add(this.buttonEditWholeText); - this.Controls.Add(this.groupBoxSuggestions); - this.Controls.Add(this.labelFullText); - this.Controls.Add(this.buttonAbort); - this.Controls.Add(this.labelLanguage); - this.Controls.Add(this.groupBoxWordNotFound); - this.Controls.Add(this.groupBoxEditWholeText); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "SpellCheck"; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Spell check"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.SpellCheck_FormClosing); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormSpellCheck_KeyDown); - this.contextMenuStrip1.ResumeLayout(false); - this.groupBoxWordNotFound.ResumeLayout(false); - this.groupBoxWordNotFound.PerformLayout(); - this.groupBoxSuggestions.ResumeLayout(false); - this.groupBoxSuggestions.PerformLayout(); - this.groupBoxEditWholeText.ResumeLayout(false); - this.groupBoxEditWholeText.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button buttonAddToDictionary; - private System.Windows.Forms.Button buttonSkipOnce; - private System.Windows.Forms.ComboBox comboBoxDictionaries; - private System.Windows.Forms.Label labelLanguage; - private System.Windows.Forms.RichTextBox richTextBoxParagraph; - private System.Windows.Forms.ListBox listBoxSuggestions; - private System.Windows.Forms.Label labelFullText; - private System.Windows.Forms.TextBox textBoxWord; - private System.Windows.Forms.Button buttonAbort; - private System.Windows.Forms.Button buttonSkipAll; - private System.Windows.Forms.Button buttonChange; - private System.Windows.Forms.Button buttonUseSuggestion; - private System.Windows.Forms.Button buttonChangeAll; - private System.Windows.Forms.Button buttonUseSuggestionAlways; - private System.Windows.Forms.Button buttonAddToNames; - private System.Windows.Forms.GroupBox groupBoxWordNotFound; - private System.Windows.Forms.GroupBox groupBoxSuggestions; - private System.Windows.Forms.Button buttonEditWholeText; - private System.Windows.Forms.GroupBox groupBoxEditWholeText; - private System.Windows.Forms.Button buttonSkipText; - private System.Windows.Forms.Button buttonChangeWholeText; - private System.Windows.Forms.TextBox textBoxWholeText; - private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; - private System.Windows.Forms.ToolStripMenuItem addXToNamesnoiseListToolStripMenuItem; - private System.Windows.Forms.CheckBox checkBoxAutoChangeNames; - private System.Windows.Forms.Label labelActionInfo; - private System.Windows.Forms.Button buttonSpellCheckDownload; - private System.Windows.Forms.Button buttonUndo; - private System.Windows.Forms.Button buttonGoogleIt; - private System.Windows.Forms.ToolStripMenuItem addXToUserDictionaryToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; - private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class SpellCheck + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.buttonAddToDictionary = new System.Windows.Forms.Button(); + this.buttonSkipOnce = new System.Windows.Forms.Button(); + this.comboBoxDictionaries = new System.Windows.Forms.ComboBox(); + this.labelLanguage = new System.Windows.Forms.Label(); + this.richTextBoxParagraph = new System.Windows.Forms.RichTextBox(); + this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); + this.addXToNamesnoiseListToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.addXToUserDictionaryToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.listBoxSuggestions = new System.Windows.Forms.ListBox(); + this.labelFullText = new System.Windows.Forms.Label(); + this.textBoxWord = new System.Windows.Forms.TextBox(); + this.buttonAbort = new System.Windows.Forms.Button(); + this.buttonSkipAll = new System.Windows.Forms.Button(); + this.buttonChange = new System.Windows.Forms.Button(); + this.buttonUseSuggestion = new System.Windows.Forms.Button(); + this.buttonChangeAll = new System.Windows.Forms.Button(); + this.buttonUseSuggestionAlways = new System.Windows.Forms.Button(); + this.buttonAddToNames = new System.Windows.Forms.Button(); + this.groupBoxWordNotFound = new System.Windows.Forms.GroupBox(); + this.buttonGoogleIt = new System.Windows.Forms.Button(); + this.buttonUndo = new System.Windows.Forms.Button(); + this.groupBoxSuggestions = new System.Windows.Forms.GroupBox(); + this.checkBoxAutoChangeNames = new System.Windows.Forms.CheckBox(); + this.buttonEditWholeText = new System.Windows.Forms.Button(); + this.groupBoxEditWholeText = new System.Windows.Forms.GroupBox(); + this.buttonSkipText = new System.Windows.Forms.Button(); + this.buttonChangeWholeText = new System.Windows.Forms.Button(); + this.textBoxWholeText = new System.Windows.Forms.TextBox(); + this.labelActionInfo = new System.Windows.Forms.Label(); + this.buttonSpellCheckDownload = new System.Windows.Forms.Button(); + this.contextMenuStrip1.SuspendLayout(); + this.groupBoxWordNotFound.SuspendLayout(); + this.groupBoxSuggestions.SuspendLayout(); + this.groupBoxEditWholeText.SuspendLayout(); + this.SuspendLayout(); + // + // buttonAddToDictionary + // + this.buttonAddToDictionary.Location = new System.Drawing.Point(6, 134); + this.buttonAddToDictionary.Name = "buttonAddToDictionary"; + this.buttonAddToDictionary.Size = new System.Drawing.Size(280, 23); + this.buttonAddToDictionary.TabIndex = 6; + this.buttonAddToDictionary.Text = "Add to user dictionary (not case sensitive)"; + this.buttonAddToDictionary.UseVisualStyleBackColor = true; + this.buttonAddToDictionary.Click += new System.EventHandler(this.ButtonAddToDictionaryClick); + this.buttonAddToDictionary.MouseEnter += new System.EventHandler(this.buttonAddToDictionary_MouseEnter); + this.buttonAddToDictionary.MouseLeave += new System.EventHandler(this.buttonAddToDictionary_MouseLeave); + // + // buttonSkipOnce + // + this.buttonSkipOnce.Location = new System.Drawing.Point(6, 76); + this.buttonSkipOnce.Name = "buttonSkipOnce"; + this.buttonSkipOnce.Size = new System.Drawing.Size(136, 23); + this.buttonSkipOnce.TabIndex = 3; + this.buttonSkipOnce.Text = "Skip &once"; + this.buttonSkipOnce.UseVisualStyleBackColor = true; + this.buttonSkipOnce.Click += new System.EventHandler(this.ButtonSkipOnceClick); + this.buttonSkipOnce.MouseEnter += new System.EventHandler(this.buttonSkipOnce_MouseEnter); + this.buttonSkipOnce.MouseLeave += new System.EventHandler(this.buttonSkipOnce_MouseLeave); + // + // comboBoxDictionaries + // + this.comboBoxDictionaries.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxDictionaries.FormattingEnabled = true; + this.comboBoxDictionaries.Location = new System.Drawing.Point(317, 33); + this.comboBoxDictionaries.Name = "comboBoxDictionaries"; + this.comboBoxDictionaries.Size = new System.Drawing.Size(237, 21); + this.comboBoxDictionaries.TabIndex = 8; + this.comboBoxDictionaries.SelectedIndexChanged += new System.EventHandler(this.ComboBoxDictionariesSelectedIndexChanged); + // + // labelLanguage + // + this.labelLanguage.AutoSize = true; + this.labelLanguage.Location = new System.Drawing.Point(314, 14); + this.labelLanguage.Name = "labelLanguage"; + this.labelLanguage.Size = new System.Drawing.Size(54, 13); + this.labelLanguage.TabIndex = 7; + this.labelLanguage.Text = "Language"; + // + // richTextBoxParagraph + // + this.richTextBoxParagraph.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.richTextBoxParagraph.ContextMenuStrip = this.contextMenuStrip1; + this.richTextBoxParagraph.Location = new System.Drawing.Point(11, 33); + this.richTextBoxParagraph.Name = "richTextBoxParagraph"; + this.richTextBoxParagraph.ReadOnly = true; + this.richTextBoxParagraph.Size = new System.Drawing.Size(292, 54); + this.richTextBoxParagraph.TabIndex = 5; + this.richTextBoxParagraph.Text = ""; + // + // contextMenuStrip1 + // + this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.addXToNamesnoiseListToolStripMenuItem, + this.addXToUserDictionaryToolStripMenuItem, + this.toolStripSeparator1, + this.deleteToolStripMenuItem}); + this.contextMenuStrip1.Name = "contextMenuStrip1"; + this.contextMenuStrip1.Size = new System.Drawing.Size(209, 76); + this.contextMenuStrip1.Opening += new System.ComponentModel.CancelEventHandler(this.ContextMenuStrip1Opening); + // + // addXToNamesnoiseListToolStripMenuItem + // + this.addXToNamesnoiseListToolStripMenuItem.Name = "addXToNamesnoiseListToolStripMenuItem"; + this.addXToNamesnoiseListToolStripMenuItem.Size = new System.Drawing.Size(208, 22); + this.addXToNamesnoiseListToolStripMenuItem.Text = "Add x to names/noise list"; + this.addXToNamesnoiseListToolStripMenuItem.Click += new System.EventHandler(this.AddXToNamesnoiseListToolStripMenuItemClick); + // + // addXToUserDictionaryToolStripMenuItem + // + this.addXToUserDictionaryToolStripMenuItem.Name = "addXToUserDictionaryToolStripMenuItem"; + this.addXToUserDictionaryToolStripMenuItem.Size = new System.Drawing.Size(208, 22); + this.addXToUserDictionaryToolStripMenuItem.Text = "Add x to user dictionary"; + this.addXToUserDictionaryToolStripMenuItem.Click += new System.EventHandler(this.AddXToUserDictionaryToolStripMenuItem_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(205, 6); + // + // deleteToolStripMenuItem + // + this.deleteToolStripMenuItem.Name = "deleteToolStripMenuItem"; + this.deleteToolStripMenuItem.Size = new System.Drawing.Size(208, 22); + this.deleteToolStripMenuItem.Text = "Delete..."; + this.deleteToolStripMenuItem.Click += new System.EventHandler(this.deleteToolStripMenuItem_Click); + // + // listBoxSuggestions + // + this.listBoxSuggestions.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.listBoxSuggestions.FormattingEnabled = true; + this.listBoxSuggestions.Location = new System.Drawing.Point(8, 47); + this.listBoxSuggestions.Name = "listBoxSuggestions"; + this.listBoxSuggestions.Size = new System.Drawing.Size(272, 121); + this.listBoxSuggestions.TabIndex = 2; + this.listBoxSuggestions.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.ListBoxSuggestionsMouseDoubleClick); + // + // labelFullText + // + this.labelFullText.AutoSize = true; + this.labelFullText.Location = new System.Drawing.Point(8, 14); + this.labelFullText.Name = "labelFullText"; + this.labelFullText.Size = new System.Drawing.Size(46, 13); + this.labelFullText.TabIndex = 4; + this.labelFullText.Text = "Full text"; + // + // textBoxWord + // + this.textBoxWord.Location = new System.Drawing.Point(6, 20); + this.textBoxWord.Name = "textBoxWord"; + this.textBoxWord.Size = new System.Drawing.Size(280, 21); + this.textBoxWord.TabIndex = 0; + this.textBoxWord.TextChanged += new System.EventHandler(this.textBoxWord_TextChanged); + // + // buttonAbort + // + this.buttonAbort.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonAbort.Location = new System.Drawing.Point(515, 351); + this.buttonAbort.Name = "buttonAbort"; + this.buttonAbort.Size = new System.Drawing.Size(85, 23); + this.buttonAbort.TabIndex = 3; + this.buttonAbort.Text = "Abort"; + this.buttonAbort.UseVisualStyleBackColor = true; + this.buttonAbort.Click += new System.EventHandler(this.ButtonAbortClick); + // + // buttonSkipAll + // + this.buttonSkipAll.Location = new System.Drawing.Point(147, 76); + this.buttonSkipAll.Name = "buttonSkipAll"; + this.buttonSkipAll.Size = new System.Drawing.Size(138, 23); + this.buttonSkipAll.TabIndex = 4; + this.buttonSkipAll.Text = "&Skip all"; + this.buttonSkipAll.UseVisualStyleBackColor = true; + this.buttonSkipAll.Click += new System.EventHandler(this.ButtonSkipAllClick); + this.buttonSkipAll.MouseEnter += new System.EventHandler(this.buttonSkipAll_MouseEnter); + this.buttonSkipAll.MouseLeave += new System.EventHandler(this.buttonSkipAll_MouseLeave); + // + // buttonChange + // + this.buttonChange.Location = new System.Drawing.Point(6, 47); + this.buttonChange.Name = "buttonChange"; + this.buttonChange.Size = new System.Drawing.Size(136, 23); + this.buttonChange.TabIndex = 1; + this.buttonChange.Text = "Change"; + this.buttonChange.UseVisualStyleBackColor = true; + this.buttonChange.Click += new System.EventHandler(this.ButtonChangeClick); + this.buttonChange.MouseEnter += new System.EventHandler(this.buttonChange_MouseEnter); + this.buttonChange.MouseLeave += new System.EventHandler(this.buttonChange_MouseLeave); + // + // buttonUseSuggestion + // + this.buttonUseSuggestion.Location = new System.Drawing.Point(68, 17); + this.buttonUseSuggestion.Name = "buttonUseSuggestion"; + this.buttonUseSuggestion.Size = new System.Drawing.Size(90, 23); + this.buttonUseSuggestion.TabIndex = 0; + this.buttonUseSuggestion.Text = "Use"; + this.buttonUseSuggestion.UseVisualStyleBackColor = true; + this.buttonUseSuggestion.Click += new System.EventHandler(this.ButtonUseSuggestionClick); + // + // buttonChangeAll + // + this.buttonChangeAll.Location = new System.Drawing.Point(148, 47); + this.buttonChangeAll.Name = "buttonChangeAll"; + this.buttonChangeAll.Size = new System.Drawing.Size(138, 23); + this.buttonChangeAll.TabIndex = 2; + this.buttonChangeAll.Text = "Change all"; + this.buttonChangeAll.UseVisualStyleBackColor = true; + this.buttonChangeAll.Click += new System.EventHandler(this.ButtonChangeAllClick); + this.buttonChangeAll.MouseEnter += new System.EventHandler(this.buttonChangeAll_MouseEnter); + this.buttonChangeAll.MouseLeave += new System.EventHandler(this.buttonChangeAll_MouseLeave); + // + // buttonUseSuggestionAlways + // + this.buttonUseSuggestionAlways.Location = new System.Drawing.Point(164, 17); + this.buttonUseSuggestionAlways.Name = "buttonUseSuggestionAlways"; + this.buttonUseSuggestionAlways.Size = new System.Drawing.Size(115, 23); + this.buttonUseSuggestionAlways.TabIndex = 1; + this.buttonUseSuggestionAlways.Text = "Use always"; + this.buttonUseSuggestionAlways.UseVisualStyleBackColor = true; + this.buttonUseSuggestionAlways.Click += new System.EventHandler(this.ButtonUseSuggestionAlwaysClick); + // + // buttonAddToNames + // + this.buttonAddToNames.Location = new System.Drawing.Point(5, 105); + this.buttonAddToNames.Name = "buttonAddToNames"; + this.buttonAddToNames.Size = new System.Drawing.Size(280, 23); + this.buttonAddToNames.TabIndex = 5; + this.buttonAddToNames.Text = "Add to names/noise list (case sensitive)"; + this.buttonAddToNames.UseVisualStyleBackColor = true; + this.buttonAddToNames.Click += new System.EventHandler(this.ButtonAddToNamesClick); + this.buttonAddToNames.MouseEnter += new System.EventHandler(this.buttonAddToNames_MouseEnter); + this.buttonAddToNames.MouseLeave += new System.EventHandler(this.buttonAddToNames_MouseLeave); + // + // groupBoxWordNotFound + // + this.groupBoxWordNotFound.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.groupBoxWordNotFound.Controls.Add(this.buttonGoogleIt); + this.groupBoxWordNotFound.Controls.Add(this.buttonUndo); + this.groupBoxWordNotFound.Controls.Add(this.buttonAddToNames); + this.groupBoxWordNotFound.Controls.Add(this.buttonAddToDictionary); + this.groupBoxWordNotFound.Controls.Add(this.buttonSkipOnce); + this.groupBoxWordNotFound.Controls.Add(this.buttonChangeAll); + this.groupBoxWordNotFound.Controls.Add(this.textBoxWord); + this.groupBoxWordNotFound.Controls.Add(this.buttonSkipAll); + this.groupBoxWordNotFound.Controls.Add(this.buttonChange); + this.groupBoxWordNotFound.Location = new System.Drawing.Point(11, 120); + this.groupBoxWordNotFound.Name = "groupBoxWordNotFound"; + this.groupBoxWordNotFound.Size = new System.Drawing.Size(292, 225); + this.groupBoxWordNotFound.TabIndex = 0; + this.groupBoxWordNotFound.TabStop = false; + this.groupBoxWordNotFound.Text = "Word not found"; + // + // buttonGoogleIt + // + this.buttonGoogleIt.Location = new System.Drawing.Point(6, 163); + this.buttonGoogleIt.Name = "buttonGoogleIt"; + this.buttonGoogleIt.Size = new System.Drawing.Size(280, 23); + this.buttonGoogleIt.TabIndex = 7; + this.buttonGoogleIt.Text = "&Google it"; + this.buttonGoogleIt.UseVisualStyleBackColor = true; + this.buttonGoogleIt.Click += new System.EventHandler(this.buttonGoogleIt_Click); + // + // buttonUndo + // + this.buttonUndo.Location = new System.Drawing.Point(6, 192); + this.buttonUndo.Name = "buttonUndo"; + this.buttonUndo.Size = new System.Drawing.Size(280, 23); + this.buttonUndo.TabIndex = 8; + this.buttonUndo.Text = "Undo: skip all \'A\'"; + this.buttonUndo.UseVisualStyleBackColor = true; + this.buttonUndo.Visible = false; + this.buttonUndo.Click += new System.EventHandler(this.buttonUndo_Click); + // + // groupBoxSuggestions + // + this.groupBoxSuggestions.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxSuggestions.Controls.Add(this.buttonUseSuggestion); + this.groupBoxSuggestions.Controls.Add(this.buttonUseSuggestionAlways); + this.groupBoxSuggestions.Controls.Add(this.checkBoxAutoChangeNames); + this.groupBoxSuggestions.Controls.Add(this.listBoxSuggestions); + this.groupBoxSuggestions.Location = new System.Drawing.Point(309, 120); + this.groupBoxSuggestions.Name = "groupBoxSuggestions"; + this.groupBoxSuggestions.Size = new System.Drawing.Size(291, 225); + this.groupBoxSuggestions.TabIndex = 1; + this.groupBoxSuggestions.TabStop = false; + this.groupBoxSuggestions.Text = "Suggestions"; + // + // checkBoxAutoChangeNames + // + this.checkBoxAutoChangeNames.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.checkBoxAutoChangeNames.AutoSize = true; + this.checkBoxAutoChangeNames.Location = new System.Drawing.Point(8, 201); + this.checkBoxAutoChangeNames.Name = "checkBoxAutoChangeNames"; + this.checkBoxAutoChangeNames.Size = new System.Drawing.Size(216, 17); + this.checkBoxAutoChangeNames.TabIndex = 3; + this.checkBoxAutoChangeNames.Text = "Auto fix names where only casing differ"; + this.checkBoxAutoChangeNames.UseVisualStyleBackColor = true; + this.checkBoxAutoChangeNames.CheckedChanged += new System.EventHandler(this.CheckBoxAutoChangeNamesCheckedChanged); + // + // buttonEditWholeText + // + this.buttonEditWholeText.Location = new System.Drawing.Point(175, 91); + this.buttonEditWholeText.Name = "buttonEditWholeText"; + this.buttonEditWholeText.Size = new System.Drawing.Size(128, 23); + this.buttonEditWholeText.TabIndex = 6; + this.buttonEditWholeText.Text = "Edit whole text"; + this.buttonEditWholeText.UseVisualStyleBackColor = true; + this.buttonEditWholeText.Click += new System.EventHandler(this.ButtonEditWholeTextClick); + // + // groupBoxEditWholeText + // + this.groupBoxEditWholeText.Controls.Add(this.buttonSkipText); + this.groupBoxEditWholeText.Controls.Add(this.buttonChangeWholeText); + this.groupBoxEditWholeText.Controls.Add(this.textBoxWholeText); + this.groupBoxEditWholeText.Location = new System.Drawing.Point(11, 120); + this.groupBoxEditWholeText.Name = "groupBoxEditWholeText"; + this.groupBoxEditWholeText.Size = new System.Drawing.Size(292, 192); + this.groupBoxEditWholeText.TabIndex = 40; + this.groupBoxEditWholeText.TabStop = false; + this.groupBoxEditWholeText.Text = "Edit whole text"; + // + // buttonSkipText + // + this.buttonSkipText.Location = new System.Drawing.Point(151, 88); + this.buttonSkipText.Name = "buttonSkipText"; + this.buttonSkipText.Size = new System.Drawing.Size(135, 21); + this.buttonSkipText.TabIndex = 35; + this.buttonSkipText.Text = "Skip once"; + this.buttonSkipText.UseVisualStyleBackColor = true; + this.buttonSkipText.Click += new System.EventHandler(this.ButtonSkipTextClick); + // + // buttonChangeWholeText + // + this.buttonChangeWholeText.Location = new System.Drawing.Point(6, 88); + this.buttonChangeWholeText.Name = "buttonChangeWholeText"; + this.buttonChangeWholeText.Size = new System.Drawing.Size(135, 21); + this.buttonChangeWholeText.TabIndex = 0; + this.buttonChangeWholeText.Text = "Change"; + this.buttonChangeWholeText.UseVisualStyleBackColor = true; + this.buttonChangeWholeText.Click += new System.EventHandler(this.ButtonChangeWholeTextClick); + // + // textBoxWholeText + // + this.textBoxWholeText.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.textBoxWholeText.Location = new System.Drawing.Point(6, 19); + this.textBoxWholeText.Multiline = true; + this.textBoxWholeText.Name = "textBoxWholeText"; + this.textBoxWholeText.Size = new System.Drawing.Size(280, 63); + this.textBoxWholeText.TabIndex = 31; + // + // labelActionInfo + // + this.labelActionInfo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelActionInfo.AutoSize = true; + this.labelActionInfo.Location = new System.Drawing.Point(12, 364); + this.labelActionInfo.Name = "labelActionInfo"; + this.labelActionInfo.Size = new System.Drawing.Size(79, 13); + this.labelActionInfo.TabIndex = 2; + this.labelActionInfo.Text = "labelActionInfo"; + // + // buttonSpellCheckDownload + // + this.buttonSpellCheckDownload.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.buttonSpellCheckDownload.Location = new System.Drawing.Point(560, 32); + this.buttonSpellCheckDownload.Name = "buttonSpellCheckDownload"; + this.buttonSpellCheckDownload.Size = new System.Drawing.Size(28, 23); + this.buttonSpellCheckDownload.TabIndex = 9; + this.buttonSpellCheckDownload.Text = "..."; + this.buttonSpellCheckDownload.UseVisualStyleBackColor = true; + this.buttonSpellCheckDownload.Click += new System.EventHandler(this.buttonSpellCheckDownload_Click); + // + // SpellCheck + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(612, 386); + this.Controls.Add(this.buttonSpellCheckDownload); + this.Controls.Add(this.labelActionInfo); + this.Controls.Add(this.richTextBoxParagraph); + this.Controls.Add(this.comboBoxDictionaries); + this.Controls.Add(this.buttonEditWholeText); + this.Controls.Add(this.groupBoxSuggestions); + this.Controls.Add(this.labelFullText); + this.Controls.Add(this.buttonAbort); + this.Controls.Add(this.labelLanguage); + this.Controls.Add(this.groupBoxWordNotFound); + this.Controls.Add(this.groupBoxEditWholeText); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "SpellCheck"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Spell check"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.SpellCheck_FormClosing); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormSpellCheck_KeyDown); + this.contextMenuStrip1.ResumeLayout(false); + this.groupBoxWordNotFound.ResumeLayout(false); + this.groupBoxWordNotFound.PerformLayout(); + this.groupBoxSuggestions.ResumeLayout(false); + this.groupBoxSuggestions.PerformLayout(); + this.groupBoxEditWholeText.ResumeLayout(false); + this.groupBoxEditWholeText.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonAddToDictionary; + private System.Windows.Forms.Button buttonSkipOnce; + private System.Windows.Forms.ComboBox comboBoxDictionaries; + private System.Windows.Forms.Label labelLanguage; + private System.Windows.Forms.RichTextBox richTextBoxParagraph; + private System.Windows.Forms.ListBox listBoxSuggestions; + private System.Windows.Forms.Label labelFullText; + private System.Windows.Forms.TextBox textBoxWord; + private System.Windows.Forms.Button buttonAbort; + private System.Windows.Forms.Button buttonSkipAll; + private System.Windows.Forms.Button buttonChange; + private System.Windows.Forms.Button buttonUseSuggestion; + private System.Windows.Forms.Button buttonChangeAll; + private System.Windows.Forms.Button buttonUseSuggestionAlways; + private System.Windows.Forms.Button buttonAddToNames; + private System.Windows.Forms.GroupBox groupBoxWordNotFound; + private System.Windows.Forms.GroupBox groupBoxSuggestions; + private System.Windows.Forms.Button buttonEditWholeText; + private System.Windows.Forms.GroupBox groupBoxEditWholeText; + private System.Windows.Forms.Button buttonSkipText; + private System.Windows.Forms.Button buttonChangeWholeText; + private System.Windows.Forms.TextBox textBoxWholeText; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; + private System.Windows.Forms.ToolStripMenuItem addXToNamesnoiseListToolStripMenuItem; + private System.Windows.Forms.CheckBox checkBoxAutoChangeNames; + private System.Windows.Forms.Label labelActionInfo; + private System.Windows.Forms.Button buttonSpellCheckDownload; + private System.Windows.Forms.Button buttonUndo; + private System.Windows.Forms.Button buttonGoogleIt; + private System.Windows.Forms.ToolStripMenuItem addXToUserDictionaryToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem; + } } \ No newline at end of file diff --git a/src/Forms/SpellCheck.cs b/src/ui/Forms/SpellCheck.cs similarity index 97% rename from src/Forms/SpellCheck.cs rename to src/ui/Forms/SpellCheck.cs index c8e930d78..d04b15962 100644 --- a/src/Forms/SpellCheck.cs +++ b/src/ui/Forms/SpellCheck.cs @@ -1,1298 +1,1298 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.Enums; -using Nikse.SubtitleEdit.Core.Interfaces; -using Nikse.SubtitleEdit.Core.SpellCheck; -using Nikse.SubtitleEdit.Logic; -using Nikse.SubtitleEdit.Logic.SpellCheck; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.IO; -using System.Text.RegularExpressions; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class SpellCheck : Form, IDoSpell - { - private List _undoList = new List(); - private List _suggestions; - private string _currentAction; - public SpellCheckAction Action { get; set; } = SpellCheckAction.Skip; - public string ChangeWord - { - get => textBoxWord.Text; - set => textBoxWord.Text = value; - } - public string ChangeWholeText => textBoxWholeText.Text; - public bool AutoFixNames => checkBoxAutoChangeNames.Checked; - - private SpellCheckWordLists _spellCheckWordLists; - private List _skipAllList = new List(); - private HashSet _skipOneList = new HashSet(); - private Dictionary _changeAllDictionary; - private string _prefix = string.Empty; - private string _postfix = string.Empty; - private Hunspell _hunspell; - private Paragraph _currentParagraph; - private int _currentIndex; - private string _currentWord; - private SpellCheckWord _currentSpellCheckWord; - private List _words; - private int _wordsIndex; - private Subtitle _subtitle; - private string _originalWord; - private int _noOfSkippedWords; - private int _noOfChangedWords; - private int _noOfCorrectWords; - private int _noOfNames; - private int _noOfAddedWords; - private bool _firstChange = true; - private string _languageName; - private Main _mainWindow; - private string _currentDictionary; - - public class SuggestionParameter - { - public string InputWord { get; set; } - public List Suggestions { get; set; } - public Hunspell Hunspell { get; set; } - public bool Success { get; set; } - - public SuggestionParameter(string word, Hunspell hunspell) - { - InputWord = word; - Suggestions = new List(); - Hunspell = hunspell; - Success = false; - } - } - - public string LanguageString - { - get - { - string name = comboBoxDictionaries.SelectedItem.ToString(); - int start = name.LastIndexOf('['); - int end = name.LastIndexOf(']'); - if (start >= 0 && end > start) - { - start++; - name = name.Substring(start, end - start); - return name; - } - return null; - } - } - - public SpellCheck() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - labelActionInfo.Text = string.Empty; - Text = Configuration.Settings.Language.SpellCheck.Title; - labelFullText.Text = Configuration.Settings.Language.SpellCheck.FullText; - labelLanguage.Text = Configuration.Settings.Language.SpellCheck.Language; - groupBoxWordNotFound.Text = Configuration.Settings.Language.SpellCheck.WordNotFound; - buttonAddToDictionary.Text = Configuration.Settings.Language.SpellCheck.AddToUserDictionary; - buttonChange.Text = Configuration.Settings.Language.SpellCheck.Change; - buttonChangeAll.Text = Configuration.Settings.Language.SpellCheck.ChangeAll; - buttonSkipAll.Text = Configuration.Settings.Language.SpellCheck.SkipAll; - buttonSkipOnce.Text = Configuration.Settings.Language.SpellCheck.SkipOnce; - buttonUseSuggestion.Text = Configuration.Settings.Language.SpellCheck.Use; - buttonUseSuggestionAlways.Text = Configuration.Settings.Language.SpellCheck.UseAlways; - buttonAbort.Text = Configuration.Settings.Language.SpellCheck.Abort; - buttonEditWholeText.Text = Configuration.Settings.Language.SpellCheck.EditWholeText; - checkBoxAutoChangeNames.Text = Configuration.Settings.Language.SpellCheck.AutoFixNames; - checkBoxAutoChangeNames.Checked = Configuration.Settings.Tools.SpellCheckAutoChangeNames; - groupBoxEditWholeText.Text = Configuration.Settings.Language.SpellCheck.EditWholeText; - buttonChangeWholeText.Text = Configuration.Settings.Language.SpellCheck.Change; - buttonSkipText.Text = Configuration.Settings.Language.SpellCheck.SkipOnce; - groupBoxSuggestions.Text = Configuration.Settings.Language.SpellCheck.Suggestions; - buttonAddToNames.Text = Configuration.Settings.Language.SpellCheck.AddToNamesAndIgnoreList; - buttonGoogleIt.Text = Configuration.Settings.Language.Main.VideoControls.GoogleIt; - deleteToolStripMenuItem.Text = Configuration.Settings.Language.General.DeleteCurrentLine; - UiUtil.FixLargeFonts(this, buttonAbort); - } - - public void Initialize(string languageName, SpellCheckWord word, List suggestions, string paragraph, string progress) - { - _originalWord = word.Text; - _suggestions = suggestions; - groupBoxWordNotFound.Visible = true; - groupBoxEditWholeText.Visible = false; - buttonEditWholeText.Text = Configuration.Settings.Language.SpellCheck.EditWholeText; - Text = Configuration.Settings.Language.SpellCheck.Title + " [" + languageName + "] - " + progress; - textBoxWord.Text = word.Text; - textBoxWholeText.Text = paragraph; - listBoxSuggestions.Items.Clear(); - foreach (string suggestion in suggestions) - { - listBoxSuggestions.Items.Add(suggestion); - } - if (listBoxSuggestions.Items.Count > 0) - { - listBoxSuggestions.SelectedIndex = 0; - } - - richTextBoxParagraph.Text = paragraph; - - FillSpellCheckDictionaries(languageName); - ShowActiveWordWithColor(word); - Action = SpellCheckAction.Skip; - DialogResult = DialogResult.None; - } - - private void FillSpellCheckDictionaries(string languageName) - { - comboBoxDictionaries.SelectedIndexChanged -= ComboBoxDictionariesSelectedIndexChanged; - comboBoxDictionaries.Items.Clear(); - foreach (string name in Utilities.GetDictionaryLanguages()) - { - comboBoxDictionaries.Items.Add(name); - if (name.Contains("[" + languageName + "]")) - { - comboBoxDictionaries.SelectedIndex = comboBoxDictionaries.Items.Count - 1; - } - } - comboBoxDictionaries.AutoCompleteSource = AutoCompleteSource.ListItems; - comboBoxDictionaries.AutoCompleteMode = AutoCompleteMode.Append; - comboBoxDictionaries.SelectedIndexChanged += ComboBoxDictionariesSelectedIndexChanged; - } - - private void ShowActiveWordWithColor(SpellCheckWord word) - { - richTextBoxParagraph.SelectAll(); - richTextBoxParagraph.SelectionColor = Color.Black; - richTextBoxParagraph.SelectionLength = 0; - - for (int i = 0; i < 10; i++) - { - int idx = word.Index - i; - if (idx >= 0 && idx < richTextBoxParagraph.Text.Length && richTextBoxParagraph.Text.Substring(idx).StartsWith(word.Text, StringComparison.Ordinal)) - { - richTextBoxParagraph.SelectionStart = idx; - richTextBoxParagraph.SelectionLength = word.Text.Length; - richTextBoxParagraph.SelectionColor = Color.Red; - break; - } - idx = word.Index + i; - if (idx >= 0 && idx < richTextBoxParagraph.Text.Length && richTextBoxParagraph.Text.Substring(idx).StartsWith(word.Text, StringComparison.Ordinal)) - { - richTextBoxParagraph.SelectionStart = idx; - richTextBoxParagraph.SelectionLength = word.Text.Length; - richTextBoxParagraph.SelectionColor = Color.Red; - break; - } - } - } - - private void FormSpellCheck_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - Action = SpellCheckAction.Abort; - DialogResult = DialogResult.Cancel; - } - else if (e.KeyCode == UiUtil.HelpKeys) - { - Utilities.ShowHelp("#spellcheck"); - e.SuppressKeyPress = true; - } - else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.G) - { - e.SuppressKeyPress = true; - UiUtil.OpenURL("https://www.google.com/search?q=" + Utilities.UrlEncode(textBoxWord.Text)); - } - else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.Z) - { - if (buttonUndo.Visible) - { - buttonUndo_Click(null, null); - e.SuppressKeyPress = true; - } - } - } - - private void ButtonAbortClick(object sender, EventArgs e) - { - ShowEndStatusMessage(Configuration.Settings.Language.SpellCheck.SpellCheckAborted); - DialogResult = DialogResult.Abort; - } - - private void ButtonChangeClick(object sender, EventArgs e) - { - PushUndo($"{Configuration.Settings.Language.SpellCheck.Change}: {_currentWord + " > " + textBoxWord.Text}", SpellCheckAction.Change); - DoAction(SpellCheckAction.Change); - } - - private void ButtonUseSuggestionClick(object sender, EventArgs e) - { - if (listBoxSuggestions.SelectedIndex >= 0) - { - textBoxWord.Text = listBoxSuggestions.SelectedItem.ToString(); - PushUndo($"{Configuration.Settings.Language.SpellCheck.Change}: {_currentWord + " > " + textBoxWord.Text}", SpellCheckAction.Change); - DoAction(SpellCheckAction.Change); - } - } - - private void ButtonSkipAllClick(object sender, EventArgs e) - { - PushUndo($"{Configuration.Settings.Language.SpellCheck.SkipAll}: {textBoxWord.Text}", SpellCheckAction.SkipAll); - DoAction(SpellCheckAction.SkipAll); - } - - private void ButtonSkipOnceClick(object sender, EventArgs e) - { - PushUndo($"{Configuration.Settings.Language.SpellCheck.SkipOnce}: {textBoxWord.Text}", SpellCheckAction.Skip); - DoAction(SpellCheckAction.Skip); - } - - private void ButtonAddToDictionaryClick(object sender, EventArgs e) - { - PushUndo($"{Configuration.Settings.Language.SpellCheck.AddToUserDictionary}: {textBoxWord.Text}", SpellCheckAction.AddToDictionary); - DoAction(SpellCheckAction.AddToDictionary); - } - - private void ComboBoxDictionariesSelectedIndexChanged(object sender, EventArgs e) - { - Configuration.Settings.General.SpellCheckLanguage = LanguageString; - Configuration.Settings.Save(); - _languageName = LanguageString; - string dictionary = Utilities.DictionaryFolder + _languageName; - LoadDictionaries(Utilities.DictionaryFolder, dictionary, _languageName); - _wordsIndex--; - PrepareNextWord(); - } - - private void LoadHunspell(string dictionary) - { - _currentDictionary = dictionary; - _hunspell?.Dispose(); - _hunspell = Hunspell.GetHunspell(dictionary); - } - - public bool DoSpell(string word) - { - return _hunspell.Spell(word); - } - - public List DoSuggest(string word) - { - var parameter = new SuggestionParameter(word, _hunspell); - var suggestThread = new System.Threading.Thread(DoWork); - suggestThread.Start(parameter); - suggestThread.Join(3000); // wait max 3 seconds - suggestThread.Abort(); - if (!parameter.Success) - { - LoadHunspell(_currentDictionary); - } - - return parameter.Suggestions; - } - - public static void DoWork(object data) - { - var parameter = (SuggestionParameter)data; - parameter.Suggestions = parameter.Hunspell.Suggest(parameter.InputWord); - parameter.Success = true; - } - - private void ButtonChangeAllClick(object sender, EventArgs e) - { - PushUndo($"{Configuration.Settings.Language.SpellCheck.ChangeAll}: {_currentWord + " > " + textBoxWord.Text}", SpellCheckAction.ChangeAll); - DoAction(SpellCheckAction.ChangeAll); - } - - private void ButtonUseSuggestionAlwaysClick(object sender, EventArgs e) - { - if (listBoxSuggestions.SelectedIndex >= 0) - { - textBoxWord.Text = listBoxSuggestions.SelectedItem.ToString(); - PushUndo($"{Configuration.Settings.Language.SpellCheck.ChangeAll}: {_currentWord + " > " + textBoxWord.Text}", SpellCheckAction.ChangeAll); - DoAction(SpellCheckAction.ChangeAll); - } - } - - private void SpellCheck_FormClosing(object sender, FormClosingEventArgs e) - { - Configuration.Settings.Tools.SpellCheckAutoChangeNames = AutoFixNames; - if (e.CloseReason == CloseReason.UserClosing) - { - DialogResult = DialogResult.Abort; - } - } - - private void ButtonAddToNamesClick(object sender, EventArgs e) - { - PushUndo($"{Configuration.Settings.Language.SpellCheck.AddToNamesAndIgnoreList}: {textBoxWord.Text}", SpellCheckAction.AddToNames); - DoAction(SpellCheckAction.AddToNames); - } - - private void ButtonEditWholeTextClick(object sender, EventArgs e) - { - if (groupBoxWordNotFound.Visible) - { - groupBoxWordNotFound.Visible = false; - groupBoxEditWholeText.Visible = true; - buttonEditWholeText.Text = Configuration.Settings.Language.SpellCheck.EditWordOnly; - textBoxWholeText.Focus(); - } - else - { - groupBoxWordNotFound.Visible = true; - groupBoxEditWholeText.Visible = false; - buttonEditWholeText.Text = Configuration.Settings.Language.SpellCheck.EditWholeText; - textBoxWord.Focus(); - } - } - - private void ButtonSkipTextClick(object sender, EventArgs e) - { - PushUndo($"{Configuration.Settings.Language.SpellCheck.SkipOnce}", SpellCheckAction.Skip); - DoAction(SpellCheckAction.SkipWholeLine); - } - - private void ButtonChangeWholeTextClick(object sender, EventArgs e) - { - PushUndo($"{Configuration.Settings.Language.SpellCheck.EditWholeText}", SpellCheckAction.ChangeWholeText); - DoAction(SpellCheckAction.ChangeWholeText); - } - - private void ContextMenuStrip1Opening(object sender, System.ComponentModel.CancelEventArgs e) - { - bool showAddItems = false; - if (!string.IsNullOrWhiteSpace(richTextBoxParagraph.SelectedText)) - { - string word = richTextBoxParagraph.SelectedText.Trim(); - addXToNamesnoiseListToolStripMenuItem.Text = string.Format(Configuration.Settings.Language.SpellCheck.AddXToNames, word); - addXToUserDictionaryToolStripMenuItem.Text = string.Format(Configuration.Settings.Language.SpellCheck.AddXToUserDictionary, word); - showAddItems = true; - } - addXToNamesnoiseListToolStripMenuItem.Visible = showAddItems; - addXToUserDictionaryToolStripMenuItem.Visible = showAddItems; - toolStripSeparator1.Visible = showAddItems; - } - - private void AddXToNamesnoiseListToolStripMenuItemClick(object sender, EventArgs e) - { - if (!string.IsNullOrWhiteSpace(richTextBoxParagraph.SelectedText)) - { - ChangeWord = richTextBoxParagraph.SelectedText.Trim(); - DoAction(SpellCheckAction.AddToNamesOnly); - } - } - - private void AddXToUserDictionaryToolStripMenuItem_Click(object sender, EventArgs e) - { - if (!string.IsNullOrWhiteSpace(richTextBoxParagraph.SelectedText)) - { - ChangeWord = richTextBoxParagraph.SelectedText.Trim(); - DoAction(SpellCheckAction.AddToDictionary); - } - } - - private void CheckBoxAutoChangeNamesCheckedChanged(object sender, EventArgs e) - { - if (textBoxWord.Text.Length < 2) - { - return; - } - - DoAutoFixNames(textBoxWord.Text, _suggestions); - } - - private void ListBoxSuggestionsMouseDoubleClick(object sender, MouseEventArgs e) - { - ButtonUseSuggestionAlwaysClick(null, null); - } - - public void DoAction(SpellCheckAction action) - { - switch (action) - { - case SpellCheckAction.Change: - _noOfChangedWords++; - _mainWindow.CorrectWord(_prefix + ChangeWord + _postfix, _currentParagraph, _prefix + _currentWord + _postfix, ref _firstChange, _wordsIndex); - break; - case SpellCheckAction.ChangeAll: - _noOfChangedWords++; - if (!_changeAllDictionary.ContainsKey(_currentWord)) - { - _changeAllDictionary.Add(_currentWord, ChangeWord); - _spellCheckWordLists.UseAlwaysListAdd(_currentWord, ChangeWord); - } - _mainWindow.CorrectWord(_prefix + ChangeWord + _postfix, _currentParagraph, _prefix + _currentWord + _postfix, ref _firstChange, -1); - break; - case SpellCheckAction.Skip: - _noOfSkippedWords++; - string key = _currentIndex + "-" + _wordsIndex + "-" + _currentWord; - if (!_skipOneList.Contains(key)) - { - _skipOneList.Add(key); - } - - break; - case SpellCheckAction.SkipWholeLine: - _wordsIndex = int.MaxValue - 1; // Go to next line - break; - case SpellCheckAction.SkipAll: - _noOfSkippedWords++; - _skipAllList.Add(ChangeWord.ToUpperInvariant()); - if (ChangeWord.EndsWith('\'') || ChangeWord.StartsWith('\'')) - { - _skipAllList.Add(ChangeWord.ToUpperInvariant().Trim('\'')); - } - - break; - case SpellCheckAction.AddToDictionary: - if (_spellCheckWordLists.AddUserWord(ChangeWord)) - { - _noOfAddedWords++; - } - - break; - case SpellCheckAction.AddToNames: - _spellCheckWordLists.AddName(ChangeWord); - if (string.Compare(ChangeWord, _currentWord, StringComparison.OrdinalIgnoreCase) != 0) - { - return; // don't prepare next word if change was more than just casing - } - - if (ChangeWord != _currentWord) - { - _changeAllDictionary.Add(_currentWord, ChangeWord); - _mainWindow.CorrectWord(_prefix + ChangeWord + _postfix, _currentParagraph, _prefix + _currentWord + _postfix, ref _firstChange, -1); - } - break; - case SpellCheckAction.AddToNamesOnly: - _spellCheckWordLists.AddName(ChangeWord); - SetWords(_currentParagraph.Text); - break; - case SpellCheckAction.ChangeWholeText: - _mainWindow.ShowStatus(string.Format(Configuration.Settings.Language.Main.SpellCheckChangedXToY, _currentParagraph.Text.Replace(Environment.NewLine, " "), ChangeWholeText.Replace(Environment.NewLine, " "))); - _currentParagraph.Text = ChangeWholeText; - _mainWindow.ChangeWholeTextMainPart(ref _noOfChangedWords, ref _firstChange, _currentIndex, _currentParagraph); - _currentIndex--; // re-spellcheck current line - _wordsIndex = int.MaxValue - 1; - break; - case SpellCheckAction.DeleteLine: - _mainWindow.DeleteLine(); - _currentIndex--; // re-spellcheck current line - _wordsIndex = int.MaxValue - 1; - break; - } - labelActionInfo.Text = string.Empty; - PrepareNextWord(); - CheckActions(); - } - - private void CheckActions() - { - if (string.IsNullOrEmpty(_currentAction)) - { - return; - } - - if (_currentAction == Configuration.Settings.Language.SpellCheck.Change) - { - ShowActionInfo(_currentAction, _currentWord + " > " + textBoxWord.Text); - } - else if (_currentAction == Configuration.Settings.Language.SpellCheck.ChangeAll) - { - ShowActionInfo(_currentAction, _currentWord + " > " + textBoxWord.Text); - } - else - { - ShowActionInfo(_currentAction, textBoxWord.Text); - } - } - - private void PrepareNextWord() - { - while (true) - { - if (_wordsIndex + 1 < _words.Count) - { - _wordsIndex++; - _currentWord = _words[_wordsIndex].Text; - _currentSpellCheckWord = _words[_wordsIndex]; - } - else - { - if (_wordsIndex != int.MaxValue - 1 && _skipOneList.Count > 0) - { - _skipOneList = new HashSet(); - } - - if (_currentIndex + 1 < _subtitle.Paragraphs.Count) - { - _currentIndex++; - _currentParagraph = _subtitle.Paragraphs[_currentIndex]; - SetWords(_currentParagraph.Text); - _wordsIndex = 0; - if (_words.Count == 0) - { - _currentWord = string.Empty; - } - else - { - _currentWord = _words[_wordsIndex].Text; - _currentSpellCheckWord = _words[_wordsIndex]; - } - } - else - { - ShowEndStatusMessage(Configuration.Settings.Language.SpellCheck.SpellCheckCompleted); - DialogResult = DialogResult.OK; - return; - } - } - - int minLength = 2; - if (Configuration.Settings.Tools.CheckOneLetterWords) - { - minLength = 1; - } - - if (_currentWord.RemoveControlCharacters().Trim().Length >= minLength) - { - _prefix = string.Empty; - _postfix = string.Empty; - if (_currentWord.Length > 0) - { - var trimChars = "'`*#\u200E\u200F\u202A\u202B\u202C\u202D\u202E\u200B\uFEFF"; - var charHit = true; - while (charHit) - { - charHit = false; - foreach (char c in trimChars) - { - if (_currentWord.StartsWith(c)) - { - _prefix += c; - _currentWord = _currentWord.Substring(1); - charHit = true; - } - if (_currentWord.EndsWith(c)) - { - _postfix = c + _postfix; - _currentWord = _currentWord.Remove(_currentWord.Length - 1); - charHit = true; - } - } - } - } - string key = _currentIndex + "-" + _wordsIndex + "-" + _currentWord; - if (_currentWord.Length < minLength || _currentWord == "&") - { - // ignore short/empty words and special chars - } - else if (_spellCheckWordLists.HasName(_currentWord)) - { - _noOfNames++; - } - else if (_skipAllList.Contains(_currentWord.ToUpperInvariant()) - || (_currentWord.StartsWith('\'') || _currentWord.EndsWith('\'')) && _skipAllList.Contains(_currentWord.Trim('\'').ToUpperInvariant())) - { - _noOfSkippedWords++; - } - else if (_skipOneList.Contains(key)) - { - // "skip one" again (after change whole text) - } - else if (IsNumber(_currentWord)) - { - _noOfSkippedWords++; - } - else if (_spellCheckWordLists.HasUserWord(_currentWord)) - { - _noOfCorrectWords++; - } - else if (_changeAllDictionary.ContainsKey(_currentWord)) - { - _noOfChangedWords++; - _mainWindow.CorrectWord(_changeAllDictionary[_currentWord], _currentParagraph, _currentWord, ref _firstChange, -1); - } - else if (_changeAllDictionary.ContainsKey(_currentWord.Trim('\''))) - { - _noOfChangedWords++; - _mainWindow.CorrectWord(_changeAllDictionary[_currentWord.Trim('\'')], _currentParagraph, _currentWord.Trim('\''), ref _firstChange, -1); - } - else if (_spellCheckWordLists.HasNameExtended(_currentWord, _currentParagraph.Text)) // TODO: Verify this! - { - _noOfNames++; - } - else if (_spellCheckWordLists.IsWordInUserPhrases(_wordsIndex, _words)) - { - _noOfCorrectWords++; - } - else - { - bool correct; - - if (_prefix == "'" && _currentWord.Length >= 1 && (DoSpell(_prefix + _currentWord) || _spellCheckWordLists.HasUserWord(_prefix + _currentWord))) - { - correct = true; - } - else if (_currentWord.Length > 1) - { - correct = DoSpell(_currentWord); - if (!correct && "`'".Contains(_currentWord[_currentWord.Length - 1])) - { - correct = DoSpell(_currentWord.TrimEnd('\'').TrimEnd('`')); - } - - if (!correct && _currentWord.EndsWith("'s", StringComparison.Ordinal) && _currentWord.Length > 4) - { - correct = DoSpell(_currentWord.TrimEnd('s').TrimEnd('\'')); - } - - if (!correct && _currentWord.EndsWith('\'') && DoSpell(_currentWord.TrimEnd('\''))) - { - _currentWord = _currentWord.TrimEnd('\''); - correct = true; - } - - if (!correct) - { - string removeUnicode = _currentWord.Replace("\u200b", string.Empty); // zero width space - removeUnicode = removeUnicode.Replace("\u2060", string.Empty); // word joiner - removeUnicode = removeUnicode.Replace("\ufeff", string.Empty); // zero width no-break space - correct = DoSpell(removeUnicode); - } - - if (!correct && _wordsIndex > 1 && _words.Count > _wordsIndex && - _words[_wordsIndex - 1].Text.ToLowerInvariant() == "www" && - (_words[_wordsIndex + 1].Text.ToLowerInvariant() == "com" || - _words[_wordsIndex + 1].Text.ToLowerInvariant() == "org" || - _words[_wordsIndex + 1].Text.ToLowerInvariant() == "net") && - _currentParagraph.Text.IndexOf(_words[_wordsIndex - 1].Text + "." + - _currentWord + "." + - _words[_wordsIndex + 1].Text, StringComparison.OrdinalIgnoreCase) >= 0) - { - correct = true; // do not spell check urls - } - - if (!correct && (_languageName.StartsWith("ar_", StringComparison.Ordinal) || _languageName == "ar")) - { - var trimmed = _currentWord.Trim('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', ',', '،'); - if (trimmed != _currentWord) - { - if (_spellCheckWordLists.HasName(trimmed)) - { - _noOfNames++; - correct = true; - } - - if (!correct && (_skipAllList.Contains(trimmed.ToUpperInvariant()) || _spellCheckWordLists.HasUserWord(trimmed) || DoSpell(trimmed))) - { - correct = true; - } - } - } - - // check if dash concatenated word with previous or next word is in spell check dictionary - if (!correct && _wordsIndex > 0 && (_currentParagraph.Text[_currentSpellCheckWord.Index - 1] == '-' || _currentParagraph.Text[_currentSpellCheckWord.Index - 1] == '‑')) - { - var wordWithDash = _words[_wordsIndex - 1].Text + "-" + _currentWord; - correct = DoSpell(wordWithDash); - if (!correct) - { - wordWithDash = _words[_wordsIndex - 1].Text + "‑" + _currentWord; // non break hyphen - correct = DoSpell(wordWithDash); - } - if (!correct) - { - correct = _spellCheckWordLists.HasUserWord(wordWithDash); - } - if (!correct) - { - correct = _spellCheckWordLists.HasUserWord(wordWithDash.Replace("‑", "-")); - } - - if (!correct && _spellCheckWordLists.HasUserWord("-" + _currentWord)) - { - correct = true; - } - } - if (!correct && _wordsIndex < _words.Count - 1 && _words[_wordsIndex + 1].Index - 1 < _currentParagraph.Text.Length && - (_currentParagraph.Text[_words[_wordsIndex + 1].Index - 1] == '-' || _currentParagraph.Text[_words[_wordsIndex + 1].Index - 1] == '‑')) - { - var wordWithDash = _currentWord + "-" + _words[_wordsIndex + 1].Text; - correct = DoSpell(wordWithDash); - if (!correct) - { - wordWithDash = _currentWord + "‑" + _words[_wordsIndex + 1].Text; // non break hyphen - correct = DoSpell(wordWithDash); - } - if (!correct) - { - correct = _spellCheckWordLists.HasUserWord(wordWithDash); - } - if (!correct) - { - correct = _spellCheckWordLists.HasUserWord(wordWithDash.Replace("‑", "-")); - } - } - } - else - { - correct = false; - if (_currentWord == "'") - { - correct = true; - } - else if (_languageName.StartsWith("en_", StringComparison.Ordinal) && (_currentWord.Equals("a", StringComparison.OrdinalIgnoreCase) || _currentWord == "I")) - { - correct = true; - } - else if (_languageName.StartsWith("da_", StringComparison.Ordinal) && _currentWord.Equals("i", StringComparison.OrdinalIgnoreCase)) - { - correct = true; - } - } - - if (!correct && Configuration.Settings.Tools.SpellCheckEnglishAllowInQuoteAsIng && - _languageName.StartsWith("en_", StringComparison.Ordinal) && _words[_wordsIndex].Text.EndsWith("in'", StringComparison.OrdinalIgnoreCase)) - { - correct = DoSpell(_currentWord.TrimEnd('\'') + "g"); - } - - if (correct) - { - _noOfCorrectWords++; - } - else - { - _mainWindow.FocusParagraph(_currentIndex); - - var suggestions = new List(); - - if ((_currentWord == "Lt's" || _currentWord == "Lt'S") && _languageName.StartsWith("en_", StringComparison.Ordinal)) - { - suggestions.Add("It's"); - } - else - { - if (_currentWord.ToUpperInvariant() != "LT'S" && _currentWord.ToUpperInvariant() != "SOX'S" && !_currentWord.ToUpperInvariant().StartsWith("HTTP", StringComparison.Ordinal)) // TODO: Get fixed nhunspell - { - suggestions = DoSuggest(_currentWord); // TODO: 0.9.6 fails on "Lt'S" - } - - if (_languageName.StartsWith("fr_", StringComparison.Ordinal) && (_currentWord.StartsWith("I'", StringComparison.Ordinal) || _currentWord.StartsWith("I’", StringComparison.Ordinal))) - { - if (_currentWord.Length > 3 && char.IsLower(_currentWord[2]) && _currentSpellCheckWord.Index > 3) - { - string ending = _currentParagraph.Text.Substring(0, _currentSpellCheckWord.Index - 1).Trim(); - if (ending.Length > 1 && !".!?".Contains(ending[ending.Length - 1])) - { - for (int i = 0; i < suggestions.Count; i++) - { - if (suggestions[i].StartsWith("L'", StringComparison.Ordinal) || suggestions[i].StartsWith("L’", StringComparison.Ordinal)) - { - suggestions[i] = @"l" + suggestions[i].Substring(1); - } - } - } - } - } - } - - suggestions.Remove(_currentWord); - if (_currentWord.Length == 1 && _currentWord == "L" && _languageName.StartsWith("en_", StringComparison.Ordinal)) - { - suggestions.Remove("I"); - suggestions.Insert(0, "I"); - } - - if (DoAutoFixNames(_currentWord, suggestions)) - { - return; - } - - if (_prefix != null && _prefix == "''" && _currentWord.EndsWith("''", StringComparison.Ordinal)) - { - _prefix = string.Empty; - _currentSpellCheckWord.Index += 2; - _currentWord = _currentWord.Trim('\''); - } - if (_prefix != null && _prefix == "'" && _currentWord.EndsWith('\'')) - { - _prefix = string.Empty; - _currentSpellCheckWord.Index++; - _currentWord = _currentWord.Trim('\''); - } - - if (_postfix != null && _postfix == "'") - { - _currentSpellCheckWord.Text = _currentWord + _postfix; - Initialize(_languageName, _currentSpellCheckWord, suggestions, _currentParagraph.Text, string.Format(Configuration.Settings.Language.Main.LineXOfY, (_currentIndex + 1), _subtitle.Paragraphs.Count)); - } - else - { - _currentSpellCheckWord.Text = _currentWord; - Initialize(_languageName, _currentSpellCheckWord, suggestions, _currentParagraph.Text, string.Format(Configuration.Settings.Language.Main.LineXOfY, (_currentIndex + 1), _subtitle.Paragraphs.Count)); - } - if (!Visible) - { - ShowDialog(_mainWindow); - } - - return; // wait for user input - } - } - } - } - } - - private bool DoAutoFixNames(string word, List suggestions) - { - if (AutoFixNames && word.Length > 3) - { - if (Configuration.Settings.Tools.SpellCheckAutoChangeNamesUseSuggestions) - { - if (suggestions.Contains(word.ToUpperInvariant())) - { // does not work well with two letter words like "da" and "de" which get auto-corrected to "DA" and "DE" - ChangeWord = word.ToUpperInvariant(); - DoAction(SpellCheckAction.ChangeAll); - return true; - } - - if (suggestions.Contains(char.ToUpperInvariant(word[0]) + word.Substring(1))) - { - ChangeWord = char.ToUpperInvariant(word[0]) + word.Substring(1); - DoAction(SpellCheckAction.ChangeAll); - return true; - } - } - - if (_spellCheckWordLists.HasName(char.ToUpper(word[0]) + word.Substring(1))) - { - ChangeWord = char.ToUpper(word[0]) + word.Substring(1); - DoAction(SpellCheckAction.ChangeAll); - return true; - } - - if (word.StartsWith("mc", StringComparison.InvariantCultureIgnoreCase) && _spellCheckWordLists.HasName(char.ToUpper(word[0]) + word.Substring(1, 1) + char.ToUpper(word[2]) + word.Remove(0, 3))) - { - ChangeWord = char.ToUpper(word[0]) + word.Substring(1, 1) + char.ToUpper(word[2]) + word.Remove(0, 3); - DoAction(SpellCheckAction.ChangeAll); - return true; - } - - if (_spellCheckWordLists.HasName(word.ToUpperInvariant())) - { - ChangeWord = word.ToUpperInvariant(); - DoAction(SpellCheckAction.ChangeAll); - return true; - } - } - return false; - } - - private static readonly Regex RegexIsNumber = new Regex("^\\d+$", RegexOptions.Compiled); - private static readonly Regex RegexIsEpisodeNumber = new Regex("^\\d+x\\d+$", RegexOptions.Compiled); // e.g. 12x02 - private static bool IsNumber(string s) - { - s = s.Trim('$', '£', '%', '*'); - if (RegexIsNumber.IsMatch(s)) - { - return true; - } - - if (RegexIsEpisodeNumber.IsMatch(s)) - { - return true; - } - - return false; - } - - private void SetWords(string s) - { - s = _spellCheckWordLists.ReplaceHtmlTagsWithBlanks(s); - s = _spellCheckWordLists.ReplaceAssTagsWithBlanks(s); - s = _spellCheckWordLists.ReplaceKnownWordsOrNamesWithBlanks(s); - _words = SpellCheckWordLists.Split(s); - } - - private void ShowEndStatusMessage(string completedMessage) - { - LanguageStructure.Main mainLanguage = Configuration.Settings.Language.Main; - if (_noOfChangedWords > 0 || _noOfAddedWords > 0 || _noOfSkippedWords > 0 || completedMessage == Configuration.Settings.Language.SpellCheck.SpellCheckCompleted) - { - Hide(); - if (Configuration.Settings.Tools.SpellCheckShowCompletedMessage) - { - var form = new DialogDoNotShowAgain(_mainWindow.Title + " - " + mainLanguage.SpellCheck, - completedMessage + Environment.NewLine + - Environment.NewLine + - string.Format(mainLanguage.NumberOfCorrectedWords, _noOfChangedWords) + Environment.NewLine + - string.Format(mainLanguage.NumberOfSkippedWords, _noOfSkippedWords) + Environment.NewLine + - string.Format(mainLanguage.NumberOfCorrectWords, _noOfCorrectWords) + Environment.NewLine + - string.Format(mainLanguage.NumberOfWordsAddedToDictionary, _noOfAddedWords) + Environment.NewLine + - string.Format(mainLanguage.NumberOfNameHits, _noOfNames)); - form.ShowDialog(_mainWindow); - Configuration.Settings.Tools.SpellCheckShowCompletedMessage = !form.DoNoDisplayAgain; - form.Dispose(); - } - else - { - if (_noOfChangedWords > 0) - { - _mainWindow.ShowStatus(completedMessage + " " + string.Format(mainLanguage.NumberOfCorrectedWords, _noOfChangedWords)); - } - else - { - _mainWindow.ShowStatus(completedMessage); - } - } - } - } - - public void ContinueSpellCheck(Subtitle subtitle) - { - _subtitle = subtitle; - - buttonUndo.Visible = false; - _undoList = new List(); - - if (_currentIndex >= subtitle.Paragraphs.Count) - { - _currentIndex = 0; - } - - _currentParagraph = _subtitle.GetParagraphOrDefault(_currentIndex); - if (_currentParagraph == null) - { - return; - } - - SetWords(_currentParagraph.Text); - _wordsIndex = -1; - - PrepareNextWord(); - } - - public void DoSpellCheck(bool autoDetect, Subtitle subtitle, string dictionaryFolder, Main mainWindow, int startLine) - { - _subtitle = subtitle; - LanguageStructure.Main mainLanguage = Configuration.Settings.Language.Main; - _mainWindow = mainWindow; - - _skipAllList = new List(); - - _noOfSkippedWords = 0; - _noOfChangedWords = 0; - _noOfCorrectWords = 0; - _noOfNames = 0; - _noOfAddedWords = 0; - _firstChange = true; - - if (!string.IsNullOrEmpty(Configuration.Settings.General.SpellCheckLanguage) && File.Exists(Path.Combine(dictionaryFolder, Configuration.Settings.General.SpellCheckLanguage + ".dic"))) - { - _languageName = Configuration.Settings.General.SpellCheckLanguage; - } - else - { - string name = Utilities.GetDictionaryLanguages()[0]; - int start = name.LastIndexOf('['); - int end = name.LastIndexOf(']'); - if (start > 0 && end > start) - { - start++; - name = name.Substring(start, end - start); - _languageName = name; - } - else - { - MessageBox.Show(string.Format(mainLanguage.InvalidLanguageNameX, name)); - return; - } - } - if (autoDetect || string.IsNullOrEmpty(_languageName)) - { - _languageName = LanguageAutoDetect.AutoDetectLanguageName(_languageName, subtitle); - if (_languageName != null && _languageName.Length > 3) - { - string start = _languageName.Substring(0, 2); - if (_languageName.StartsWith(start, StringComparison.Ordinal) && Configuration.Settings.General.SpellCheckLanguage != null && - Configuration.Settings.General.SpellCheckLanguage.StartsWith(start, StringComparison.Ordinal) && _languageName != Configuration.Settings.General.SpellCheckLanguage) - { - foreach (var dictionaryName in Utilities.GetDictionaryLanguages()) - { - if (dictionaryName.Contains(Configuration.Settings.General.SpellCheckLanguage)) - { - _languageName = Configuration.Settings.General.SpellCheckLanguage; - break; - } - } - } - } - } - string dictionary = Utilities.DictionaryFolder + _languageName; - - LoadDictionaries(dictionaryFolder, dictionary, _languageName); - - _currentIndex = 0; - if (startLine >= 0 && startLine < _subtitle.Paragraphs.Count) - { - _currentIndex = startLine; - } - - _currentParagraph = _subtitle.Paragraphs[_currentIndex]; - SetWords(_currentParagraph.Text); - _wordsIndex = -1; - - PrepareNextWord(); - } - - private void LoadDictionaries(string dictionaryFolder, string dictionary, string languageName) - { - _skipAllList = new List(); - _spellCheckWordLists = new SpellCheckWordLists(dictionaryFolder, languageName, this); - _changeAllDictionary = _spellCheckWordLists.GetUseAlwaysList(); - LoadHunspell(dictionary); - } - - private void textBoxWord_TextChanged(object sender, EventArgs e) - { - buttonChange.Enabled = textBoxWord.Text != _originalWord; - buttonChangeAll.Enabled = buttonChange.Enabled; - } - - private void buttonAddToDictionary_MouseEnter(object sender, EventArgs e) - { - ShowActionInfo(Configuration.Settings.Language.SpellCheck.AddToUserDictionary, textBoxWord.Text); - } - - private void ShowActionInfo(string label, string text) - { - labelActionInfo.Text = $"{label}: {text.Trim()}"; - _currentAction = label; - } - - private void buttonAddToDictionary_MouseLeave(object sender, EventArgs e) - { - labelActionInfo.Text = string.Empty; - _currentAction = null; - } - - private void buttonAddToNames_MouseEnter(object sender, EventArgs e) - { - ShowActionInfo(Configuration.Settings.Language.SpellCheck.AddToNamesAndIgnoreList, textBoxWord.Text); - } - - private void buttonAddToNames_MouseLeave(object sender, EventArgs e) - { - labelActionInfo.Text = string.Empty; - _currentAction = null; - } - - private void buttonSkipOnce_MouseEnter(object sender, EventArgs e) - { - ShowActionInfo(Configuration.Settings.Language.SpellCheck.SkipOnce, textBoxWord.Text); - } - - private void buttonSkipOnce_MouseLeave(object sender, EventArgs e) - { - labelActionInfo.Text = string.Empty; - _currentAction = null; - } - - private void buttonSkipAll_MouseEnter(object sender, EventArgs e) - { - ShowActionInfo(Configuration.Settings.Language.SpellCheck.SkipAll, textBoxWord.Text); - } - - private void buttonSkipAll_MouseLeave(object sender, EventArgs e) - { - labelActionInfo.Text = string.Empty; - _currentAction = null; - } - - private void buttonChange_MouseEnter(object sender, EventArgs e) - { - ShowActionInfo(Configuration.Settings.Language.SpellCheck.Change, _currentWord + " > " + textBoxWord.Text); - } - - private void buttonChange_MouseLeave(object sender, EventArgs e) - { - labelActionInfo.Text = string.Empty; - _currentAction = null; - } - - private void buttonChangeAll_MouseEnter(object sender, EventArgs e) - { - ShowActionInfo(Configuration.Settings.Language.SpellCheck.ChangeAll, _currentWord + " > " + textBoxWord.Text); - } - - private void buttonChangeAll_MouseLeave(object sender, EventArgs e) - { - labelActionInfo.Text = string.Empty; - _currentAction = null; - } - - private void buttonSpellCheckDownload_Click(object sender, EventArgs e) - { - using (var gd = new GetDictionaries()) - { - gd.ShowDialog(this); - - FillSpellCheckDictionaries(LanguageAutoDetect.AutoDetectLanguageName(null, _subtitle)); - if (gd.LastDownload != null && gd.LastDownload.Length > 3 && comboBoxDictionaries.Items.Count > 0) - { - var lc = Path.GetFileNameWithoutExtension(gd.LastDownload.Substring(0, 4).Replace('_', '-')); - for (int i = 0; i < comboBoxDictionaries.Items.Count; i++) - { - string item = (string)comboBoxDictionaries.Items[i]; - if (item.Contains("[" + lc) || item.Contains(gd.SelectedEnglishName)) - { - comboBoxDictionaries.SelectedIndex = i; - break; - } - } - } - if (comboBoxDictionaries.Items.Count > 0 && comboBoxDictionaries.SelectedIndex < 0) - { - comboBoxDictionaries.SelectedIndex = 0; - } - ComboBoxDictionariesSelectedIndexChanged(null, null); - } - } - - private void PushUndo(string text, SpellCheckAction action) - { - if (string.IsNullOrWhiteSpace(text)) - { - return; - } - - if (action == SpellCheckAction.ChangeAll && _changeAllDictionary.ContainsKey(_currentWord)) - { - return; - } - - string format = Configuration.Settings.Language.SpellCheck.UndoX; - if (string.IsNullOrEmpty(format)) - { - format = "Undo: {0}"; - } - - string undoText = string.Format(format, text); - - _undoList.Add(new UndoObject - { - CurrentIndex = _currentIndex, - UndoText = undoText, - UndoWord = textBoxWord.Text.Trim(), - Action = action, - CurrentWord = _currentWord, - Subtitle = new Subtitle(_subtitle), - NoOfSkippedWords = _noOfSkippedWords, - NoOfChangedWords = _noOfChangedWords, - NoOfCorrectWords = _noOfCorrectWords, - NoOfNames = _noOfNames, - NoOfAddedWords = _noOfAddedWords, - }); - buttonUndo.Text = undoText; - buttonUndo.Visible = true; - } - - private void buttonUndo_Click(object sender, EventArgs e) - { - if (_undoList.Count > 0) - { - var undo = _undoList[_undoList.Count - 1]; - _currentIndex = undo.CurrentIndex - 1; - _wordsIndex = int.MaxValue - 1; - _noOfSkippedWords = undo.NoOfSkippedWords; - _noOfChangedWords = undo.NoOfChangedWords; - _noOfCorrectWords = undo.NoOfCorrectWords; - _noOfNames = undo.NoOfNames; - _noOfAddedWords = undo.NoOfAddedWords; - - switch (undo.Action) - { - case SpellCheckAction.Change: - _subtitle = _mainWindow.UndoFromSpellCheck(undo.Subtitle); - break; - case SpellCheckAction.ChangeAll: - _subtitle = _mainWindow.UndoFromSpellCheck(undo.Subtitle); - _changeAllDictionary.Remove(undo.CurrentWord); - _spellCheckWordLists.UseAlwaysListRemove(undo.CurrentWord); - break; - case SpellCheckAction.Skip: - break; - case SpellCheckAction.SkipAll: - _skipAllList.Remove(undo.UndoWord.ToUpperInvariant()); - if (undo.UndoWord.EndsWith('\'') || undo.UndoWord.StartsWith('\'')) - { - _skipAllList.Remove(undo.UndoWord.ToUpperInvariant().Trim('\'')); - } - - break; - case SpellCheckAction.AddToDictionary: - _spellCheckWordLists.RemoveUserWord(undo.UndoWord); - break; - case SpellCheckAction.AddToNames: - _spellCheckWordLists.RemoveName(undo.UndoWord); - break; - case SpellCheckAction.ChangeWholeText: - _subtitle = _mainWindow.UndoFromSpellCheck(undo.Subtitle); - break; - } - - _undoList.RemoveAt(_undoList.Count - 1); - if (_undoList.Count > 0) - { - buttonUndo.Text = _undoList[_undoList.Count - 1].UndoText; - } - else - { - buttonUndo.Visible = false; - } - } - PrepareNextWord(); - } - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - if (_hunspell != null) - { - _hunspell.Dispose(); - _hunspell = null; - } - components.Dispose(); - } - base.Dispose(disposing); - } - - private void buttonGoogleIt_Click(object sender, EventArgs e) - { - string text = textBoxWord.Text.Trim(); - if (!string.IsNullOrWhiteSpace(text)) - { - UiUtil.OpenURL("https://www.google.com/search?q=" + Utilities.UrlEncode(text)); - } - } - - private void deleteToolStripMenuItem_Click(object sender, EventArgs e) - { - if (!Configuration.Settings.General.PromptDeleteLines || MessageBox.Show(Configuration.Settings.Language.Main.DeleteOneLinePrompt, Configuration.Settings.Language.SpellCheck.Title, MessageBoxButtons.YesNoCancel) == DialogResult.Yes) - { - DoAction(SpellCheckAction.DeleteLine); - } - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.Enums; +using Nikse.SubtitleEdit.Core.Interfaces; +using Nikse.SubtitleEdit.Core.SpellCheck; +using Nikse.SubtitleEdit.Logic; +using Nikse.SubtitleEdit.Logic.SpellCheck; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Text.RegularExpressions; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class SpellCheck : Form, IDoSpell + { + private List _undoList = new List(); + private List _suggestions; + private string _currentAction; + public SpellCheckAction Action { get; set; } = SpellCheckAction.Skip; + public string ChangeWord + { + get => textBoxWord.Text; + set => textBoxWord.Text = value; + } + public string ChangeWholeText => textBoxWholeText.Text; + public bool AutoFixNames => checkBoxAutoChangeNames.Checked; + + private SpellCheckWordLists _spellCheckWordLists; + private List _skipAllList = new List(); + private HashSet _skipOneList = new HashSet(); + private Dictionary _changeAllDictionary; + private string _prefix = string.Empty; + private string _postfix = string.Empty; + private Hunspell _hunspell; + private Paragraph _currentParagraph; + private int _currentIndex; + private string _currentWord; + private SpellCheckWord _currentSpellCheckWord; + private List _words; + private int _wordsIndex; + private Subtitle _subtitle; + private string _originalWord; + private int _noOfSkippedWords; + private int _noOfChangedWords; + private int _noOfCorrectWords; + private int _noOfNames; + private int _noOfAddedWords; + private bool _firstChange = true; + private string _languageName; + private Main _mainWindow; + private string _currentDictionary; + + public class SuggestionParameter + { + public string InputWord { get; set; } + public List Suggestions { get; set; } + public Hunspell Hunspell { get; set; } + public bool Success { get; set; } + + public SuggestionParameter(string word, Hunspell hunspell) + { + InputWord = word; + Suggestions = new List(); + Hunspell = hunspell; + Success = false; + } + } + + public string LanguageString + { + get + { + string name = comboBoxDictionaries.SelectedItem.ToString(); + int start = name.LastIndexOf('['); + int end = name.LastIndexOf(']'); + if (start >= 0 && end > start) + { + start++; + name = name.Substring(start, end - start); + return name; + } + return null; + } + } + + public SpellCheck() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + labelActionInfo.Text = string.Empty; + Text = Configuration.Settings.Language.SpellCheck.Title; + labelFullText.Text = Configuration.Settings.Language.SpellCheck.FullText; + labelLanguage.Text = Configuration.Settings.Language.SpellCheck.Language; + groupBoxWordNotFound.Text = Configuration.Settings.Language.SpellCheck.WordNotFound; + buttonAddToDictionary.Text = Configuration.Settings.Language.SpellCheck.AddToUserDictionary; + buttonChange.Text = Configuration.Settings.Language.SpellCheck.Change; + buttonChangeAll.Text = Configuration.Settings.Language.SpellCheck.ChangeAll; + buttonSkipAll.Text = Configuration.Settings.Language.SpellCheck.SkipAll; + buttonSkipOnce.Text = Configuration.Settings.Language.SpellCheck.SkipOnce; + buttonUseSuggestion.Text = Configuration.Settings.Language.SpellCheck.Use; + buttonUseSuggestionAlways.Text = Configuration.Settings.Language.SpellCheck.UseAlways; + buttonAbort.Text = Configuration.Settings.Language.SpellCheck.Abort; + buttonEditWholeText.Text = Configuration.Settings.Language.SpellCheck.EditWholeText; + checkBoxAutoChangeNames.Text = Configuration.Settings.Language.SpellCheck.AutoFixNames; + checkBoxAutoChangeNames.Checked = Configuration.Settings.Tools.SpellCheckAutoChangeNames; + groupBoxEditWholeText.Text = Configuration.Settings.Language.SpellCheck.EditWholeText; + buttonChangeWholeText.Text = Configuration.Settings.Language.SpellCheck.Change; + buttonSkipText.Text = Configuration.Settings.Language.SpellCheck.SkipOnce; + groupBoxSuggestions.Text = Configuration.Settings.Language.SpellCheck.Suggestions; + buttonAddToNames.Text = Configuration.Settings.Language.SpellCheck.AddToNamesAndIgnoreList; + buttonGoogleIt.Text = Configuration.Settings.Language.Main.VideoControls.GoogleIt; + deleteToolStripMenuItem.Text = Configuration.Settings.Language.General.DeleteCurrentLine; + UiUtil.FixLargeFonts(this, buttonAbort); + } + + public void Initialize(string languageName, SpellCheckWord word, List suggestions, string paragraph, string progress) + { + _originalWord = word.Text; + _suggestions = suggestions; + groupBoxWordNotFound.Visible = true; + groupBoxEditWholeText.Visible = false; + buttonEditWholeText.Text = Configuration.Settings.Language.SpellCheck.EditWholeText; + Text = Configuration.Settings.Language.SpellCheck.Title + " [" + languageName + "] - " + progress; + textBoxWord.Text = word.Text; + textBoxWholeText.Text = paragraph; + listBoxSuggestions.Items.Clear(); + foreach (string suggestion in suggestions) + { + listBoxSuggestions.Items.Add(suggestion); + } + if (listBoxSuggestions.Items.Count > 0) + { + listBoxSuggestions.SelectedIndex = 0; + } + + richTextBoxParagraph.Text = paragraph; + + FillSpellCheckDictionaries(languageName); + ShowActiveWordWithColor(word); + Action = SpellCheckAction.Skip; + DialogResult = DialogResult.None; + } + + private void FillSpellCheckDictionaries(string languageName) + { + comboBoxDictionaries.SelectedIndexChanged -= ComboBoxDictionariesSelectedIndexChanged; + comboBoxDictionaries.Items.Clear(); + foreach (string name in Utilities.GetDictionaryLanguages()) + { + comboBoxDictionaries.Items.Add(name); + if (name.Contains("[" + languageName + "]")) + { + comboBoxDictionaries.SelectedIndex = comboBoxDictionaries.Items.Count - 1; + } + } + comboBoxDictionaries.AutoCompleteSource = AutoCompleteSource.ListItems; + comboBoxDictionaries.AutoCompleteMode = AutoCompleteMode.Append; + comboBoxDictionaries.SelectedIndexChanged += ComboBoxDictionariesSelectedIndexChanged; + } + + private void ShowActiveWordWithColor(SpellCheckWord word) + { + richTextBoxParagraph.SelectAll(); + richTextBoxParagraph.SelectionColor = Color.Black; + richTextBoxParagraph.SelectionLength = 0; + + for (int i = 0; i < 10; i++) + { + int idx = word.Index - i; + if (idx >= 0 && idx < richTextBoxParagraph.Text.Length && richTextBoxParagraph.Text.Substring(idx).StartsWith(word.Text, StringComparison.Ordinal)) + { + richTextBoxParagraph.SelectionStart = idx; + richTextBoxParagraph.SelectionLength = word.Text.Length; + richTextBoxParagraph.SelectionColor = Color.Red; + break; + } + idx = word.Index + i; + if (idx >= 0 && idx < richTextBoxParagraph.Text.Length && richTextBoxParagraph.Text.Substring(idx).StartsWith(word.Text, StringComparison.Ordinal)) + { + richTextBoxParagraph.SelectionStart = idx; + richTextBoxParagraph.SelectionLength = word.Text.Length; + richTextBoxParagraph.SelectionColor = Color.Red; + break; + } + } + } + + private void FormSpellCheck_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + Action = SpellCheckAction.Abort; + DialogResult = DialogResult.Cancel; + } + else if (e.KeyCode == UiUtil.HelpKeys) + { + Utilities.ShowHelp("#spellcheck"); + e.SuppressKeyPress = true; + } + else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.G) + { + e.SuppressKeyPress = true; + UiUtil.OpenURL("https://www.google.com/search?q=" + Utilities.UrlEncode(textBoxWord.Text)); + } + else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.Z) + { + if (buttonUndo.Visible) + { + buttonUndo_Click(null, null); + e.SuppressKeyPress = true; + } + } + } + + private void ButtonAbortClick(object sender, EventArgs e) + { + ShowEndStatusMessage(Configuration.Settings.Language.SpellCheck.SpellCheckAborted); + DialogResult = DialogResult.Abort; + } + + private void ButtonChangeClick(object sender, EventArgs e) + { + PushUndo($"{Configuration.Settings.Language.SpellCheck.Change}: {_currentWord + " > " + textBoxWord.Text}", SpellCheckAction.Change); + DoAction(SpellCheckAction.Change); + } + + private void ButtonUseSuggestionClick(object sender, EventArgs e) + { + if (listBoxSuggestions.SelectedIndex >= 0) + { + textBoxWord.Text = listBoxSuggestions.SelectedItem.ToString(); + PushUndo($"{Configuration.Settings.Language.SpellCheck.Change}: {_currentWord + " > " + textBoxWord.Text}", SpellCheckAction.Change); + DoAction(SpellCheckAction.Change); + } + } + + private void ButtonSkipAllClick(object sender, EventArgs e) + { + PushUndo($"{Configuration.Settings.Language.SpellCheck.SkipAll}: {textBoxWord.Text}", SpellCheckAction.SkipAll); + DoAction(SpellCheckAction.SkipAll); + } + + private void ButtonSkipOnceClick(object sender, EventArgs e) + { + PushUndo($"{Configuration.Settings.Language.SpellCheck.SkipOnce}: {textBoxWord.Text}", SpellCheckAction.Skip); + DoAction(SpellCheckAction.Skip); + } + + private void ButtonAddToDictionaryClick(object sender, EventArgs e) + { + PushUndo($"{Configuration.Settings.Language.SpellCheck.AddToUserDictionary}: {textBoxWord.Text}", SpellCheckAction.AddToDictionary); + DoAction(SpellCheckAction.AddToDictionary); + } + + private void ComboBoxDictionariesSelectedIndexChanged(object sender, EventArgs e) + { + Configuration.Settings.General.SpellCheckLanguage = LanguageString; + Configuration.Settings.Save(); + _languageName = LanguageString; + string dictionary = Utilities.DictionaryFolder + _languageName; + LoadDictionaries(Utilities.DictionaryFolder, dictionary, _languageName); + _wordsIndex--; + PrepareNextWord(); + } + + private void LoadHunspell(string dictionary) + { + _currentDictionary = dictionary; + _hunspell?.Dispose(); + _hunspell = Hunspell.GetHunspell(dictionary); + } + + public bool DoSpell(string word) + { + return _hunspell.Spell(word); + } + + public List DoSuggest(string word) + { + var parameter = new SuggestionParameter(word, _hunspell); + var suggestThread = new System.Threading.Thread(DoWork); + suggestThread.Start(parameter); + suggestThread.Join(3000); // wait max 3 seconds + suggestThread.Abort(); + if (!parameter.Success) + { + LoadHunspell(_currentDictionary); + } + + return parameter.Suggestions; + } + + public static void DoWork(object data) + { + var parameter = (SuggestionParameter)data; + parameter.Suggestions = parameter.Hunspell.Suggest(parameter.InputWord); + parameter.Success = true; + } + + private void ButtonChangeAllClick(object sender, EventArgs e) + { + PushUndo($"{Configuration.Settings.Language.SpellCheck.ChangeAll}: {_currentWord + " > " + textBoxWord.Text}", SpellCheckAction.ChangeAll); + DoAction(SpellCheckAction.ChangeAll); + } + + private void ButtonUseSuggestionAlwaysClick(object sender, EventArgs e) + { + if (listBoxSuggestions.SelectedIndex >= 0) + { + textBoxWord.Text = listBoxSuggestions.SelectedItem.ToString(); + PushUndo($"{Configuration.Settings.Language.SpellCheck.ChangeAll}: {_currentWord + " > " + textBoxWord.Text}", SpellCheckAction.ChangeAll); + DoAction(SpellCheckAction.ChangeAll); + } + } + + private void SpellCheck_FormClosing(object sender, FormClosingEventArgs e) + { + Configuration.Settings.Tools.SpellCheckAutoChangeNames = AutoFixNames; + if (e.CloseReason == CloseReason.UserClosing) + { + DialogResult = DialogResult.Abort; + } + } + + private void ButtonAddToNamesClick(object sender, EventArgs e) + { + PushUndo($"{Configuration.Settings.Language.SpellCheck.AddToNamesAndIgnoreList}: {textBoxWord.Text}", SpellCheckAction.AddToNames); + DoAction(SpellCheckAction.AddToNames); + } + + private void ButtonEditWholeTextClick(object sender, EventArgs e) + { + if (groupBoxWordNotFound.Visible) + { + groupBoxWordNotFound.Visible = false; + groupBoxEditWholeText.Visible = true; + buttonEditWholeText.Text = Configuration.Settings.Language.SpellCheck.EditWordOnly; + textBoxWholeText.Focus(); + } + else + { + groupBoxWordNotFound.Visible = true; + groupBoxEditWholeText.Visible = false; + buttonEditWholeText.Text = Configuration.Settings.Language.SpellCheck.EditWholeText; + textBoxWord.Focus(); + } + } + + private void ButtonSkipTextClick(object sender, EventArgs e) + { + PushUndo($"{Configuration.Settings.Language.SpellCheck.SkipOnce}", SpellCheckAction.Skip); + DoAction(SpellCheckAction.SkipWholeLine); + } + + private void ButtonChangeWholeTextClick(object sender, EventArgs e) + { + PushUndo($"{Configuration.Settings.Language.SpellCheck.EditWholeText}", SpellCheckAction.ChangeWholeText); + DoAction(SpellCheckAction.ChangeWholeText); + } + + private void ContextMenuStrip1Opening(object sender, System.ComponentModel.CancelEventArgs e) + { + bool showAddItems = false; + if (!string.IsNullOrWhiteSpace(richTextBoxParagraph.SelectedText)) + { + string word = richTextBoxParagraph.SelectedText.Trim(); + addXToNamesnoiseListToolStripMenuItem.Text = string.Format(Configuration.Settings.Language.SpellCheck.AddXToNames, word); + addXToUserDictionaryToolStripMenuItem.Text = string.Format(Configuration.Settings.Language.SpellCheck.AddXToUserDictionary, word); + showAddItems = true; + } + addXToNamesnoiseListToolStripMenuItem.Visible = showAddItems; + addXToUserDictionaryToolStripMenuItem.Visible = showAddItems; + toolStripSeparator1.Visible = showAddItems; + } + + private void AddXToNamesnoiseListToolStripMenuItemClick(object sender, EventArgs e) + { + if (!string.IsNullOrWhiteSpace(richTextBoxParagraph.SelectedText)) + { + ChangeWord = richTextBoxParagraph.SelectedText.Trim(); + DoAction(SpellCheckAction.AddToNamesOnly); + } + } + + private void AddXToUserDictionaryToolStripMenuItem_Click(object sender, EventArgs e) + { + if (!string.IsNullOrWhiteSpace(richTextBoxParagraph.SelectedText)) + { + ChangeWord = richTextBoxParagraph.SelectedText.Trim(); + DoAction(SpellCheckAction.AddToDictionary); + } + } + + private void CheckBoxAutoChangeNamesCheckedChanged(object sender, EventArgs e) + { + if (textBoxWord.Text.Length < 2) + { + return; + } + + DoAutoFixNames(textBoxWord.Text, _suggestions); + } + + private void ListBoxSuggestionsMouseDoubleClick(object sender, MouseEventArgs e) + { + ButtonUseSuggestionAlwaysClick(null, null); + } + + public void DoAction(SpellCheckAction action) + { + switch (action) + { + case SpellCheckAction.Change: + _noOfChangedWords++; + _mainWindow.CorrectWord(_prefix + ChangeWord + _postfix, _currentParagraph, _prefix + _currentWord + _postfix, ref _firstChange, _wordsIndex); + break; + case SpellCheckAction.ChangeAll: + _noOfChangedWords++; + if (!_changeAllDictionary.ContainsKey(_currentWord)) + { + _changeAllDictionary.Add(_currentWord, ChangeWord); + _spellCheckWordLists.UseAlwaysListAdd(_currentWord, ChangeWord); + } + _mainWindow.CorrectWord(_prefix + ChangeWord + _postfix, _currentParagraph, _prefix + _currentWord + _postfix, ref _firstChange, -1); + break; + case SpellCheckAction.Skip: + _noOfSkippedWords++; + string key = _currentIndex + "-" + _wordsIndex + "-" + _currentWord; + if (!_skipOneList.Contains(key)) + { + _skipOneList.Add(key); + } + + break; + case SpellCheckAction.SkipWholeLine: + _wordsIndex = int.MaxValue - 1; // Go to next line + break; + case SpellCheckAction.SkipAll: + _noOfSkippedWords++; + _skipAllList.Add(ChangeWord.ToUpperInvariant()); + if (ChangeWord.EndsWith('\'') || ChangeWord.StartsWith('\'')) + { + _skipAllList.Add(ChangeWord.ToUpperInvariant().Trim('\'')); + } + + break; + case SpellCheckAction.AddToDictionary: + if (_spellCheckWordLists.AddUserWord(ChangeWord)) + { + _noOfAddedWords++; + } + + break; + case SpellCheckAction.AddToNames: + _spellCheckWordLists.AddName(ChangeWord); + if (string.Compare(ChangeWord, _currentWord, StringComparison.OrdinalIgnoreCase) != 0) + { + return; // don't prepare next word if change was more than just casing + } + + if (ChangeWord != _currentWord) + { + _changeAllDictionary.Add(_currentWord, ChangeWord); + _mainWindow.CorrectWord(_prefix + ChangeWord + _postfix, _currentParagraph, _prefix + _currentWord + _postfix, ref _firstChange, -1); + } + break; + case SpellCheckAction.AddToNamesOnly: + _spellCheckWordLists.AddName(ChangeWord); + SetWords(_currentParagraph.Text); + break; + case SpellCheckAction.ChangeWholeText: + _mainWindow.ShowStatus(string.Format(Configuration.Settings.Language.Main.SpellCheckChangedXToY, _currentParagraph.Text.Replace(Environment.NewLine, " "), ChangeWholeText.Replace(Environment.NewLine, " "))); + _currentParagraph.Text = ChangeWholeText; + _mainWindow.ChangeWholeTextMainPart(ref _noOfChangedWords, ref _firstChange, _currentIndex, _currentParagraph); + _currentIndex--; // re-spellcheck current line + _wordsIndex = int.MaxValue - 1; + break; + case SpellCheckAction.DeleteLine: + _mainWindow.DeleteLine(); + _currentIndex--; // re-spellcheck current line + _wordsIndex = int.MaxValue - 1; + break; + } + labelActionInfo.Text = string.Empty; + PrepareNextWord(); + CheckActions(); + } + + private void CheckActions() + { + if (string.IsNullOrEmpty(_currentAction)) + { + return; + } + + if (_currentAction == Configuration.Settings.Language.SpellCheck.Change) + { + ShowActionInfo(_currentAction, _currentWord + " > " + textBoxWord.Text); + } + else if (_currentAction == Configuration.Settings.Language.SpellCheck.ChangeAll) + { + ShowActionInfo(_currentAction, _currentWord + " > " + textBoxWord.Text); + } + else + { + ShowActionInfo(_currentAction, textBoxWord.Text); + } + } + + private void PrepareNextWord() + { + while (true) + { + if (_wordsIndex + 1 < _words.Count) + { + _wordsIndex++; + _currentWord = _words[_wordsIndex].Text; + _currentSpellCheckWord = _words[_wordsIndex]; + } + else + { + if (_wordsIndex != int.MaxValue - 1 && _skipOneList.Count > 0) + { + _skipOneList = new HashSet(); + } + + if (_currentIndex + 1 < _subtitle.Paragraphs.Count) + { + _currentIndex++; + _currentParagraph = _subtitle.Paragraphs[_currentIndex]; + SetWords(_currentParagraph.Text); + _wordsIndex = 0; + if (_words.Count == 0) + { + _currentWord = string.Empty; + } + else + { + _currentWord = _words[_wordsIndex].Text; + _currentSpellCheckWord = _words[_wordsIndex]; + } + } + else + { + ShowEndStatusMessage(Configuration.Settings.Language.SpellCheck.SpellCheckCompleted); + DialogResult = DialogResult.OK; + return; + } + } + + int minLength = 2; + if (Configuration.Settings.Tools.CheckOneLetterWords) + { + minLength = 1; + } + + if (_currentWord.RemoveControlCharacters().Trim().Length >= minLength) + { + _prefix = string.Empty; + _postfix = string.Empty; + if (_currentWord.Length > 0) + { + var trimChars = "'`*#\u200E\u200F\u202A\u202B\u202C\u202D\u202E\u200B\uFEFF"; + var charHit = true; + while (charHit) + { + charHit = false; + foreach (char c in trimChars) + { + if (_currentWord.StartsWith(c)) + { + _prefix += c; + _currentWord = _currentWord.Substring(1); + charHit = true; + } + if (_currentWord.EndsWith(c)) + { + _postfix = c + _postfix; + _currentWord = _currentWord.Remove(_currentWord.Length - 1); + charHit = true; + } + } + } + } + string key = _currentIndex + "-" + _wordsIndex + "-" + _currentWord; + if (_currentWord.Length < minLength || _currentWord == "&") + { + // ignore short/empty words and special chars + } + else if (_spellCheckWordLists.HasName(_currentWord)) + { + _noOfNames++; + } + else if (_skipAllList.Contains(_currentWord.ToUpperInvariant()) + || (_currentWord.StartsWith('\'') || _currentWord.EndsWith('\'')) && _skipAllList.Contains(_currentWord.Trim('\'').ToUpperInvariant())) + { + _noOfSkippedWords++; + } + else if (_skipOneList.Contains(key)) + { + // "skip one" again (after change whole text) + } + else if (IsNumber(_currentWord)) + { + _noOfSkippedWords++; + } + else if (_spellCheckWordLists.HasUserWord(_currentWord)) + { + _noOfCorrectWords++; + } + else if (_changeAllDictionary.ContainsKey(_currentWord)) + { + _noOfChangedWords++; + _mainWindow.CorrectWord(_changeAllDictionary[_currentWord], _currentParagraph, _currentWord, ref _firstChange, -1); + } + else if (_changeAllDictionary.ContainsKey(_currentWord.Trim('\''))) + { + _noOfChangedWords++; + _mainWindow.CorrectWord(_changeAllDictionary[_currentWord.Trim('\'')], _currentParagraph, _currentWord.Trim('\''), ref _firstChange, -1); + } + else if (_spellCheckWordLists.HasNameExtended(_currentWord, _currentParagraph.Text)) // TODO: Verify this! + { + _noOfNames++; + } + else if (_spellCheckWordLists.IsWordInUserPhrases(_wordsIndex, _words)) + { + _noOfCorrectWords++; + } + else + { + bool correct; + + if (_prefix == "'" && _currentWord.Length >= 1 && (DoSpell(_prefix + _currentWord) || _spellCheckWordLists.HasUserWord(_prefix + _currentWord))) + { + correct = true; + } + else if (_currentWord.Length > 1) + { + correct = DoSpell(_currentWord); + if (!correct && "`'".Contains(_currentWord[_currentWord.Length - 1])) + { + correct = DoSpell(_currentWord.TrimEnd('\'').TrimEnd('`')); + } + + if (!correct && _currentWord.EndsWith("'s", StringComparison.Ordinal) && _currentWord.Length > 4) + { + correct = DoSpell(_currentWord.TrimEnd('s').TrimEnd('\'')); + } + + if (!correct && _currentWord.EndsWith('\'') && DoSpell(_currentWord.TrimEnd('\''))) + { + _currentWord = _currentWord.TrimEnd('\''); + correct = true; + } + + if (!correct) + { + string removeUnicode = _currentWord.Replace("\u200b", string.Empty); // zero width space + removeUnicode = removeUnicode.Replace("\u2060", string.Empty); // word joiner + removeUnicode = removeUnicode.Replace("\ufeff", string.Empty); // zero width no-break space + correct = DoSpell(removeUnicode); + } + + if (!correct && _wordsIndex > 1 && _words.Count > _wordsIndex && + _words[_wordsIndex - 1].Text.ToLowerInvariant() == "www" && + (_words[_wordsIndex + 1].Text.ToLowerInvariant() == "com" || + _words[_wordsIndex + 1].Text.ToLowerInvariant() == "org" || + _words[_wordsIndex + 1].Text.ToLowerInvariant() == "net") && + _currentParagraph.Text.IndexOf(_words[_wordsIndex - 1].Text + "." + + _currentWord + "." + + _words[_wordsIndex + 1].Text, StringComparison.OrdinalIgnoreCase) >= 0) + { + correct = true; // do not spell check urls + } + + if (!correct && (_languageName.StartsWith("ar_", StringComparison.Ordinal) || _languageName == "ar")) + { + var trimmed = _currentWord.Trim('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', ',', '،'); + if (trimmed != _currentWord) + { + if (_spellCheckWordLists.HasName(trimmed)) + { + _noOfNames++; + correct = true; + } + + if (!correct && (_skipAllList.Contains(trimmed.ToUpperInvariant()) || _spellCheckWordLists.HasUserWord(trimmed) || DoSpell(trimmed))) + { + correct = true; + } + } + } + + // check if dash concatenated word with previous or next word is in spell check dictionary + if (!correct && _wordsIndex > 0 && (_currentParagraph.Text[_currentSpellCheckWord.Index - 1] == '-' || _currentParagraph.Text[_currentSpellCheckWord.Index - 1] == '‑')) + { + var wordWithDash = _words[_wordsIndex - 1].Text + "-" + _currentWord; + correct = DoSpell(wordWithDash); + if (!correct) + { + wordWithDash = _words[_wordsIndex - 1].Text + "‑" + _currentWord; // non break hyphen + correct = DoSpell(wordWithDash); + } + if (!correct) + { + correct = _spellCheckWordLists.HasUserWord(wordWithDash); + } + if (!correct) + { + correct = _spellCheckWordLists.HasUserWord(wordWithDash.Replace("‑", "-")); + } + + if (!correct && _spellCheckWordLists.HasUserWord("-" + _currentWord)) + { + correct = true; + } + } + if (!correct && _wordsIndex < _words.Count - 1 && _words[_wordsIndex + 1].Index - 1 < _currentParagraph.Text.Length && + (_currentParagraph.Text[_words[_wordsIndex + 1].Index - 1] == '-' || _currentParagraph.Text[_words[_wordsIndex + 1].Index - 1] == '‑')) + { + var wordWithDash = _currentWord + "-" + _words[_wordsIndex + 1].Text; + correct = DoSpell(wordWithDash); + if (!correct) + { + wordWithDash = _currentWord + "‑" + _words[_wordsIndex + 1].Text; // non break hyphen + correct = DoSpell(wordWithDash); + } + if (!correct) + { + correct = _spellCheckWordLists.HasUserWord(wordWithDash); + } + if (!correct) + { + correct = _spellCheckWordLists.HasUserWord(wordWithDash.Replace("‑", "-")); + } + } + } + else + { + correct = false; + if (_currentWord == "'") + { + correct = true; + } + else if (_languageName.StartsWith("en_", StringComparison.Ordinal) && (_currentWord.Equals("a", StringComparison.OrdinalIgnoreCase) || _currentWord == "I")) + { + correct = true; + } + else if (_languageName.StartsWith("da_", StringComparison.Ordinal) && _currentWord.Equals("i", StringComparison.OrdinalIgnoreCase)) + { + correct = true; + } + } + + if (!correct && Configuration.Settings.Tools.SpellCheckEnglishAllowInQuoteAsIng && + _languageName.StartsWith("en_", StringComparison.Ordinal) && _words[_wordsIndex].Text.EndsWith("in'", StringComparison.OrdinalIgnoreCase)) + { + correct = DoSpell(_currentWord.TrimEnd('\'') + "g"); + } + + if (correct) + { + _noOfCorrectWords++; + } + else + { + _mainWindow.FocusParagraph(_currentIndex); + + var suggestions = new List(); + + if ((_currentWord == "Lt's" || _currentWord == "Lt'S") && _languageName.StartsWith("en_", StringComparison.Ordinal)) + { + suggestions.Add("It's"); + } + else + { + if (_currentWord.ToUpperInvariant() != "LT'S" && _currentWord.ToUpperInvariant() != "SOX'S" && !_currentWord.ToUpperInvariant().StartsWith("HTTP", StringComparison.Ordinal)) // TODO: Get fixed nhunspell + { + suggestions = DoSuggest(_currentWord); // TODO: 0.9.6 fails on "Lt'S" + } + + if (_languageName.StartsWith("fr_", StringComparison.Ordinal) && (_currentWord.StartsWith("I'", StringComparison.Ordinal) || _currentWord.StartsWith("I’", StringComparison.Ordinal))) + { + if (_currentWord.Length > 3 && char.IsLower(_currentWord[2]) && _currentSpellCheckWord.Index > 3) + { + string ending = _currentParagraph.Text.Substring(0, _currentSpellCheckWord.Index - 1).Trim(); + if (ending.Length > 1 && !".!?".Contains(ending[ending.Length - 1])) + { + for (int i = 0; i < suggestions.Count; i++) + { + if (suggestions[i].StartsWith("L'", StringComparison.Ordinal) || suggestions[i].StartsWith("L’", StringComparison.Ordinal)) + { + suggestions[i] = @"l" + suggestions[i].Substring(1); + } + } + } + } + } + } + + suggestions.Remove(_currentWord); + if (_currentWord.Length == 1 && _currentWord == "L" && _languageName.StartsWith("en_", StringComparison.Ordinal)) + { + suggestions.Remove("I"); + suggestions.Insert(0, "I"); + } + + if (DoAutoFixNames(_currentWord, suggestions)) + { + return; + } + + if (_prefix != null && _prefix == "''" && _currentWord.EndsWith("''", StringComparison.Ordinal)) + { + _prefix = string.Empty; + _currentSpellCheckWord.Index += 2; + _currentWord = _currentWord.Trim('\''); + } + if (_prefix != null && _prefix == "'" && _currentWord.EndsWith('\'')) + { + _prefix = string.Empty; + _currentSpellCheckWord.Index++; + _currentWord = _currentWord.Trim('\''); + } + + if (_postfix != null && _postfix == "'") + { + _currentSpellCheckWord.Text = _currentWord + _postfix; + Initialize(_languageName, _currentSpellCheckWord, suggestions, _currentParagraph.Text, string.Format(Configuration.Settings.Language.Main.LineXOfY, (_currentIndex + 1), _subtitle.Paragraphs.Count)); + } + else + { + _currentSpellCheckWord.Text = _currentWord; + Initialize(_languageName, _currentSpellCheckWord, suggestions, _currentParagraph.Text, string.Format(Configuration.Settings.Language.Main.LineXOfY, (_currentIndex + 1), _subtitle.Paragraphs.Count)); + } + if (!Visible) + { + ShowDialog(_mainWindow); + } + + return; // wait for user input + } + } + } + } + } + + private bool DoAutoFixNames(string word, List suggestions) + { + if (AutoFixNames && word.Length > 3) + { + if (Configuration.Settings.Tools.SpellCheckAutoChangeNamesUseSuggestions) + { + if (suggestions.Contains(word.ToUpperInvariant())) + { // does not work well with two letter words like "da" and "de" which get auto-corrected to "DA" and "DE" + ChangeWord = word.ToUpperInvariant(); + DoAction(SpellCheckAction.ChangeAll); + return true; + } + + if (suggestions.Contains(char.ToUpperInvariant(word[0]) + word.Substring(1))) + { + ChangeWord = char.ToUpperInvariant(word[0]) + word.Substring(1); + DoAction(SpellCheckAction.ChangeAll); + return true; + } + } + + if (_spellCheckWordLists.HasName(char.ToUpper(word[0]) + word.Substring(1))) + { + ChangeWord = char.ToUpper(word[0]) + word.Substring(1); + DoAction(SpellCheckAction.ChangeAll); + return true; + } + + if (word.StartsWith("mc", StringComparison.InvariantCultureIgnoreCase) && _spellCheckWordLists.HasName(char.ToUpper(word[0]) + word.Substring(1, 1) + char.ToUpper(word[2]) + word.Remove(0, 3))) + { + ChangeWord = char.ToUpper(word[0]) + word.Substring(1, 1) + char.ToUpper(word[2]) + word.Remove(0, 3); + DoAction(SpellCheckAction.ChangeAll); + return true; + } + + if (_spellCheckWordLists.HasName(word.ToUpperInvariant())) + { + ChangeWord = word.ToUpperInvariant(); + DoAction(SpellCheckAction.ChangeAll); + return true; + } + } + return false; + } + + private static readonly Regex RegexIsNumber = new Regex("^\\d+$", RegexOptions.Compiled); + private static readonly Regex RegexIsEpisodeNumber = new Regex("^\\d+x\\d+$", RegexOptions.Compiled); // e.g. 12x02 + private static bool IsNumber(string s) + { + s = s.Trim('$', '£', '%', '*'); + if (RegexIsNumber.IsMatch(s)) + { + return true; + } + + if (RegexIsEpisodeNumber.IsMatch(s)) + { + return true; + } + + return false; + } + + private void SetWords(string s) + { + s = _spellCheckWordLists.ReplaceHtmlTagsWithBlanks(s); + s = _spellCheckWordLists.ReplaceAssTagsWithBlanks(s); + s = _spellCheckWordLists.ReplaceKnownWordsOrNamesWithBlanks(s); + _words = SpellCheckWordLists.Split(s); + } + + private void ShowEndStatusMessage(string completedMessage) + { + LanguageStructure.Main mainLanguage = Configuration.Settings.Language.Main; + if (_noOfChangedWords > 0 || _noOfAddedWords > 0 || _noOfSkippedWords > 0 || completedMessage == Configuration.Settings.Language.SpellCheck.SpellCheckCompleted) + { + Hide(); + if (Configuration.Settings.Tools.SpellCheckShowCompletedMessage) + { + var form = new DialogDoNotShowAgain(_mainWindow.Title + " - " + mainLanguage.SpellCheck, + completedMessage + Environment.NewLine + + Environment.NewLine + + string.Format(mainLanguage.NumberOfCorrectedWords, _noOfChangedWords) + Environment.NewLine + + string.Format(mainLanguage.NumberOfSkippedWords, _noOfSkippedWords) + Environment.NewLine + + string.Format(mainLanguage.NumberOfCorrectWords, _noOfCorrectWords) + Environment.NewLine + + string.Format(mainLanguage.NumberOfWordsAddedToDictionary, _noOfAddedWords) + Environment.NewLine + + string.Format(mainLanguage.NumberOfNameHits, _noOfNames)); + form.ShowDialog(_mainWindow); + Configuration.Settings.Tools.SpellCheckShowCompletedMessage = !form.DoNoDisplayAgain; + form.Dispose(); + } + else + { + if (_noOfChangedWords > 0) + { + _mainWindow.ShowStatus(completedMessage + " " + string.Format(mainLanguage.NumberOfCorrectedWords, _noOfChangedWords)); + } + else + { + _mainWindow.ShowStatus(completedMessage); + } + } + } + } + + public void ContinueSpellCheck(Subtitle subtitle) + { + _subtitle = subtitle; + + buttonUndo.Visible = false; + _undoList = new List(); + + if (_currentIndex >= subtitle.Paragraphs.Count) + { + _currentIndex = 0; + } + + _currentParagraph = _subtitle.GetParagraphOrDefault(_currentIndex); + if (_currentParagraph == null) + { + return; + } + + SetWords(_currentParagraph.Text); + _wordsIndex = -1; + + PrepareNextWord(); + } + + public void DoSpellCheck(bool autoDetect, Subtitle subtitle, string dictionaryFolder, Main mainWindow, int startLine) + { + _subtitle = subtitle; + LanguageStructure.Main mainLanguage = Configuration.Settings.Language.Main; + _mainWindow = mainWindow; + + _skipAllList = new List(); + + _noOfSkippedWords = 0; + _noOfChangedWords = 0; + _noOfCorrectWords = 0; + _noOfNames = 0; + _noOfAddedWords = 0; + _firstChange = true; + + if (!string.IsNullOrEmpty(Configuration.Settings.General.SpellCheckLanguage) && File.Exists(Path.Combine(dictionaryFolder, Configuration.Settings.General.SpellCheckLanguage + ".dic"))) + { + _languageName = Configuration.Settings.General.SpellCheckLanguage; + } + else + { + string name = Utilities.GetDictionaryLanguages()[0]; + int start = name.LastIndexOf('['); + int end = name.LastIndexOf(']'); + if (start > 0 && end > start) + { + start++; + name = name.Substring(start, end - start); + _languageName = name; + } + else + { + MessageBox.Show(string.Format(mainLanguage.InvalidLanguageNameX, name)); + return; + } + } + if (autoDetect || string.IsNullOrEmpty(_languageName)) + { + _languageName = LanguageAutoDetect.AutoDetectLanguageName(_languageName, subtitle); + if (_languageName != null && _languageName.Length > 3) + { + string start = _languageName.Substring(0, 2); + if (_languageName.StartsWith(start, StringComparison.Ordinal) && Configuration.Settings.General.SpellCheckLanguage != null && + Configuration.Settings.General.SpellCheckLanguage.StartsWith(start, StringComparison.Ordinal) && _languageName != Configuration.Settings.General.SpellCheckLanguage) + { + foreach (var dictionaryName in Utilities.GetDictionaryLanguages()) + { + if (dictionaryName.Contains(Configuration.Settings.General.SpellCheckLanguage)) + { + _languageName = Configuration.Settings.General.SpellCheckLanguage; + break; + } + } + } + } + } + string dictionary = Utilities.DictionaryFolder + _languageName; + + LoadDictionaries(dictionaryFolder, dictionary, _languageName); + + _currentIndex = 0; + if (startLine >= 0 && startLine < _subtitle.Paragraphs.Count) + { + _currentIndex = startLine; + } + + _currentParagraph = _subtitle.Paragraphs[_currentIndex]; + SetWords(_currentParagraph.Text); + _wordsIndex = -1; + + PrepareNextWord(); + } + + private void LoadDictionaries(string dictionaryFolder, string dictionary, string languageName) + { + _skipAllList = new List(); + _spellCheckWordLists = new SpellCheckWordLists(dictionaryFolder, languageName, this); + _changeAllDictionary = _spellCheckWordLists.GetUseAlwaysList(); + LoadHunspell(dictionary); + } + + private void textBoxWord_TextChanged(object sender, EventArgs e) + { + buttonChange.Enabled = textBoxWord.Text != _originalWord; + buttonChangeAll.Enabled = buttonChange.Enabled; + } + + private void buttonAddToDictionary_MouseEnter(object sender, EventArgs e) + { + ShowActionInfo(Configuration.Settings.Language.SpellCheck.AddToUserDictionary, textBoxWord.Text); + } + + private void ShowActionInfo(string label, string text) + { + labelActionInfo.Text = $"{label}: {text.Trim()}"; + _currentAction = label; + } + + private void buttonAddToDictionary_MouseLeave(object sender, EventArgs e) + { + labelActionInfo.Text = string.Empty; + _currentAction = null; + } + + private void buttonAddToNames_MouseEnter(object sender, EventArgs e) + { + ShowActionInfo(Configuration.Settings.Language.SpellCheck.AddToNamesAndIgnoreList, textBoxWord.Text); + } + + private void buttonAddToNames_MouseLeave(object sender, EventArgs e) + { + labelActionInfo.Text = string.Empty; + _currentAction = null; + } + + private void buttonSkipOnce_MouseEnter(object sender, EventArgs e) + { + ShowActionInfo(Configuration.Settings.Language.SpellCheck.SkipOnce, textBoxWord.Text); + } + + private void buttonSkipOnce_MouseLeave(object sender, EventArgs e) + { + labelActionInfo.Text = string.Empty; + _currentAction = null; + } + + private void buttonSkipAll_MouseEnter(object sender, EventArgs e) + { + ShowActionInfo(Configuration.Settings.Language.SpellCheck.SkipAll, textBoxWord.Text); + } + + private void buttonSkipAll_MouseLeave(object sender, EventArgs e) + { + labelActionInfo.Text = string.Empty; + _currentAction = null; + } + + private void buttonChange_MouseEnter(object sender, EventArgs e) + { + ShowActionInfo(Configuration.Settings.Language.SpellCheck.Change, _currentWord + " > " + textBoxWord.Text); + } + + private void buttonChange_MouseLeave(object sender, EventArgs e) + { + labelActionInfo.Text = string.Empty; + _currentAction = null; + } + + private void buttonChangeAll_MouseEnter(object sender, EventArgs e) + { + ShowActionInfo(Configuration.Settings.Language.SpellCheck.ChangeAll, _currentWord + " > " + textBoxWord.Text); + } + + private void buttonChangeAll_MouseLeave(object sender, EventArgs e) + { + labelActionInfo.Text = string.Empty; + _currentAction = null; + } + + private void buttonSpellCheckDownload_Click(object sender, EventArgs e) + { + using (var gd = new GetDictionaries()) + { + gd.ShowDialog(this); + + FillSpellCheckDictionaries(LanguageAutoDetect.AutoDetectLanguageName(null, _subtitle)); + if (gd.LastDownload != null && gd.LastDownload.Length > 3 && comboBoxDictionaries.Items.Count > 0) + { + var lc = Path.GetFileNameWithoutExtension(gd.LastDownload.Substring(0, 4).Replace('_', '-')); + for (int i = 0; i < comboBoxDictionaries.Items.Count; i++) + { + string item = (string)comboBoxDictionaries.Items[i]; + if (item.Contains("[" + lc) || item.Contains(gd.SelectedEnglishName)) + { + comboBoxDictionaries.SelectedIndex = i; + break; + } + } + } + if (comboBoxDictionaries.Items.Count > 0 && comboBoxDictionaries.SelectedIndex < 0) + { + comboBoxDictionaries.SelectedIndex = 0; + } + ComboBoxDictionariesSelectedIndexChanged(null, null); + } + } + + private void PushUndo(string text, SpellCheckAction action) + { + if (string.IsNullOrWhiteSpace(text)) + { + return; + } + + if (action == SpellCheckAction.ChangeAll && _changeAllDictionary.ContainsKey(_currentWord)) + { + return; + } + + string format = Configuration.Settings.Language.SpellCheck.UndoX; + if (string.IsNullOrEmpty(format)) + { + format = "Undo: {0}"; + } + + string undoText = string.Format(format, text); + + _undoList.Add(new UndoObject + { + CurrentIndex = _currentIndex, + UndoText = undoText, + UndoWord = textBoxWord.Text.Trim(), + Action = action, + CurrentWord = _currentWord, + Subtitle = new Subtitle(_subtitle), + NoOfSkippedWords = _noOfSkippedWords, + NoOfChangedWords = _noOfChangedWords, + NoOfCorrectWords = _noOfCorrectWords, + NoOfNames = _noOfNames, + NoOfAddedWords = _noOfAddedWords, + }); + buttonUndo.Text = undoText; + buttonUndo.Visible = true; + } + + private void buttonUndo_Click(object sender, EventArgs e) + { + if (_undoList.Count > 0) + { + var undo = _undoList[_undoList.Count - 1]; + _currentIndex = undo.CurrentIndex - 1; + _wordsIndex = int.MaxValue - 1; + _noOfSkippedWords = undo.NoOfSkippedWords; + _noOfChangedWords = undo.NoOfChangedWords; + _noOfCorrectWords = undo.NoOfCorrectWords; + _noOfNames = undo.NoOfNames; + _noOfAddedWords = undo.NoOfAddedWords; + + switch (undo.Action) + { + case SpellCheckAction.Change: + _subtitle = _mainWindow.UndoFromSpellCheck(undo.Subtitle); + break; + case SpellCheckAction.ChangeAll: + _subtitle = _mainWindow.UndoFromSpellCheck(undo.Subtitle); + _changeAllDictionary.Remove(undo.CurrentWord); + _spellCheckWordLists.UseAlwaysListRemove(undo.CurrentWord); + break; + case SpellCheckAction.Skip: + break; + case SpellCheckAction.SkipAll: + _skipAllList.Remove(undo.UndoWord.ToUpperInvariant()); + if (undo.UndoWord.EndsWith('\'') || undo.UndoWord.StartsWith('\'')) + { + _skipAllList.Remove(undo.UndoWord.ToUpperInvariant().Trim('\'')); + } + + break; + case SpellCheckAction.AddToDictionary: + _spellCheckWordLists.RemoveUserWord(undo.UndoWord); + break; + case SpellCheckAction.AddToNames: + _spellCheckWordLists.RemoveName(undo.UndoWord); + break; + case SpellCheckAction.ChangeWholeText: + _subtitle = _mainWindow.UndoFromSpellCheck(undo.Subtitle); + break; + } + + _undoList.RemoveAt(_undoList.Count - 1); + if (_undoList.Count > 0) + { + buttonUndo.Text = _undoList[_undoList.Count - 1].UndoText; + } + else + { + buttonUndo.Visible = false; + } + } + PrepareNextWord(); + } + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + if (_hunspell != null) + { + _hunspell.Dispose(); + _hunspell = null; + } + components.Dispose(); + } + base.Dispose(disposing); + } + + private void buttonGoogleIt_Click(object sender, EventArgs e) + { + string text = textBoxWord.Text.Trim(); + if (!string.IsNullOrWhiteSpace(text)) + { + UiUtil.OpenURL("https://www.google.com/search?q=" + Utilities.UrlEncode(text)); + } + } + + private void deleteToolStripMenuItem_Click(object sender, EventArgs e) + { + if (!Configuration.Settings.General.PromptDeleteLines || MessageBox.Show(Configuration.Settings.Language.Main.DeleteOneLinePrompt, Configuration.Settings.Language.SpellCheck.Title, MessageBoxButtons.YesNoCancel) == DialogResult.Yes) + { + DoAction(SpellCheckAction.DeleteLine); + } + } + } +} diff --git a/src/Forms/SpellCheck.resx b/src/ui/Forms/SpellCheck.resx similarity index 97% rename from src/Forms/SpellCheck.resx rename to src/ui/Forms/SpellCheck.resx index 98381cccc..15f75b3cd 100644 --- a/src/Forms/SpellCheck.resx +++ b/src/ui/Forms/SpellCheck.resx @@ -1,123 +1,123 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + \ No newline at end of file diff --git a/src/Forms/Split.Designer.cs b/src/ui/Forms/Split.Designer.cs similarity index 98% rename from src/Forms/Split.Designer.cs rename to src/ui/Forms/Split.Designer.cs index ae5e3bfb1..29442abbf 100644 --- a/src/Forms/Split.Designer.cs +++ b/src/ui/Forms/Split.Designer.cs @@ -1,423 +1,423 @@ -namespace Nikse.SubtitleEdit.Forms -{ - partial class Split - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.groupBoxSplitOptions = new System.Windows.Forms.GroupBox(); - this.groupBoxSubtitleInfo = new System.Windows.Forms.GroupBox(); - this.labelCharacters = new System.Windows.Forms.Label(); - this.labelLines = new System.Windows.Forms.Label(); - this.labelNumberOfParts = new System.Windows.Forms.Label(); - this.numericUpDownParts = new System.Windows.Forms.NumericUpDown(); - this.radioButtonCharacters = new System.Windows.Forms.RadioButton(); - this.RadioButtonLines = new System.Windows.Forms.RadioButton(); - this.groupBoxOutput = new System.Windows.Forms.GroupBox(); - this.buttonOpenOutputFolder = new System.Windows.Forms.Button(); - this.labelFileName = new System.Windows.Forms.Label(); - this.textBoxFileName = new System.Windows.Forms.TextBox(); - this.comboBoxSubtitleFormats = new System.Windows.Forms.ComboBox(); - this.labelEncoding = new System.Windows.Forms.Label(); - this.comboBoxEncoding = new System.Windows.Forms.ComboBox(); - this.labelOutputFormat = new System.Windows.Forms.Label(); - this.labelChooseOutputFolder = new System.Windows.Forms.Label(); - this.buttonChooseFolder = new System.Windows.Forms.Button(); - this.textBoxOutputFolder = new System.Windows.Forms.TextBox(); - this.folderBrowserDialog1 = new System.Windows.Forms.FolderBrowserDialog(); - this.groupBoxPreview = new System.Windows.Forms.GroupBox(); - this.listViewParts = new System.Windows.Forms.ListView(); - this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader6 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeaderFileName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonSplit = new System.Windows.Forms.Button(); - this.buttonBasic = new System.Windows.Forms.Button(); - this.groupBoxSplitOptions.SuspendLayout(); - this.groupBoxSubtitleInfo.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownParts)).BeginInit(); - this.groupBoxOutput.SuspendLayout(); - this.groupBoxPreview.SuspendLayout(); - this.SuspendLayout(); - // - // groupBoxSplitOptions - // - this.groupBoxSplitOptions.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxSplitOptions.Controls.Add(this.groupBoxSubtitleInfo); - this.groupBoxSplitOptions.Controls.Add(this.labelNumberOfParts); - this.groupBoxSplitOptions.Controls.Add(this.numericUpDownParts); - this.groupBoxSplitOptions.Controls.Add(this.radioButtonCharacters); - this.groupBoxSplitOptions.Controls.Add(this.RadioButtonLines); - this.groupBoxSplitOptions.Location = new System.Drawing.Point(13, 13); - this.groupBoxSplitOptions.Name = "groupBoxSplitOptions"; - this.groupBoxSplitOptions.Size = new System.Drawing.Size(684, 86); - this.groupBoxSplitOptions.TabIndex = 0; - this.groupBoxSplitOptions.TabStop = false; - this.groupBoxSplitOptions.Text = "Split options"; - // - // groupBoxSubtitleInfo - // - this.groupBoxSubtitleInfo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxSubtitleInfo.Controls.Add(this.labelCharacters); - this.groupBoxSubtitleInfo.Controls.Add(this.labelLines); - this.groupBoxSubtitleInfo.Location = new System.Drawing.Point(311, 13); - this.groupBoxSubtitleInfo.Name = "groupBoxSubtitleInfo"; - this.groupBoxSubtitleInfo.Size = new System.Drawing.Size(367, 67); - this.groupBoxSubtitleInfo.TabIndex = 2; - this.groupBoxSubtitleInfo.TabStop = false; - this.groupBoxSubtitleInfo.Text = "Subtitle info"; - // - // labelCharacters - // - this.labelCharacters.AutoSize = true; - this.labelCharacters.Location = new System.Drawing.Point(7, 46); - this.labelCharacters.Name = "labelCharacters"; - this.labelCharacters.Size = new System.Drawing.Size(122, 13); - this.labelCharacters.TabIndex = 1; - this.labelCharacters.Text = "Number of characters: X"; - // - // labelLines - // - this.labelLines.AutoSize = true; - this.labelLines.Location = new System.Drawing.Point(7, 27); - this.labelLines.Name = "labelLines"; - this.labelLines.Size = new System.Drawing.Size(93, 13); - this.labelLines.TabIndex = 0; - this.labelLines.Text = "Number of lines: X"; - // - // labelNumberOfParts - // - this.labelNumberOfParts.AutoSize = true; - this.labelNumberOfParts.Location = new System.Drawing.Point(148, 22); - this.labelNumberOfParts.Name = "labelNumberOfParts"; - this.labelNumberOfParts.Size = new System.Drawing.Size(111, 13); - this.labelNumberOfParts.TabIndex = 3; - this.labelNumberOfParts.Text = "Number of equal parts"; - // - // numericUpDownParts - // - this.numericUpDownParts.Location = new System.Drawing.Point(151, 38); - this.numericUpDownParts.Minimum = new decimal(new int[] { - 2, - 0, - 0, - 0}); - this.numericUpDownParts.Name = "numericUpDownParts"; - this.numericUpDownParts.Size = new System.Drawing.Size(50, 20); - this.numericUpDownParts.TabIndex = 1; - this.numericUpDownParts.Value = new decimal(new int[] { - 2, - 0, - 0, - 0}); - this.numericUpDownParts.ValueChanged += new System.EventHandler(this.numericUpDownParts_ValueChanged); - // - // radioButtonCharacters - // - this.radioButtonCharacters.AutoSize = true; - this.radioButtonCharacters.Location = new System.Drawing.Point(15, 43); - this.radioButtonCharacters.Name = "radioButtonCharacters"; - this.radioButtonCharacters.Size = new System.Drawing.Size(76, 17); - this.radioButtonCharacters.TabIndex = 0; - this.radioButtonCharacters.Text = "Characters"; - this.radioButtonCharacters.UseVisualStyleBackColor = true; - this.radioButtonCharacters.CheckedChanged += new System.EventHandler(this.radioButtonCharacters_CheckedChanged); - // - // RadioButtonLines - // - this.RadioButtonLines.AutoSize = true; - this.RadioButtonLines.Checked = true; - this.RadioButtonLines.Location = new System.Drawing.Point(15, 20); - this.RadioButtonLines.Name = "RadioButtonLines"; - this.RadioButtonLines.Size = new System.Drawing.Size(50, 17); - this.RadioButtonLines.TabIndex = 0; - this.RadioButtonLines.TabStop = true; - this.RadioButtonLines.Text = "Lines"; - this.RadioButtonLines.UseVisualStyleBackColor = true; - this.RadioButtonLines.CheckedChanged += new System.EventHandler(this.RadioButtonLines_CheckedChanged); - // - // groupBoxOutput - // - this.groupBoxOutput.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxOutput.Controls.Add(this.buttonOpenOutputFolder); - this.groupBoxOutput.Controls.Add(this.labelFileName); - this.groupBoxOutput.Controls.Add(this.textBoxFileName); - this.groupBoxOutput.Controls.Add(this.comboBoxSubtitleFormats); - this.groupBoxOutput.Controls.Add(this.labelEncoding); - this.groupBoxOutput.Controls.Add(this.comboBoxEncoding); - this.groupBoxOutput.Controls.Add(this.labelOutputFormat); - this.groupBoxOutput.Controls.Add(this.labelChooseOutputFolder); - this.groupBoxOutput.Controls.Add(this.buttonChooseFolder); - this.groupBoxOutput.Controls.Add(this.textBoxOutputFolder); - this.groupBoxOutput.Location = new System.Drawing.Point(12, 105); - this.groupBoxOutput.Name = "groupBoxOutput"; - this.groupBoxOutput.Size = new System.Drawing.Size(688, 143); - this.groupBoxOutput.TabIndex = 1; - this.groupBoxOutput.TabStop = false; - this.groupBoxOutput.Text = "Output"; - // - // buttonOpenOutputFolder - // - this.buttonOpenOutputFolder.Location = new System.Drawing.Point(574, 75); - this.buttonOpenOutputFolder.Name = "buttonOpenOutputFolder"; - this.buttonOpenOutputFolder.Size = new System.Drawing.Size(81, 23); - this.buttonOpenOutputFolder.TabIndex = 5; - this.buttonOpenOutputFolder.Text = "Open..."; - this.buttonOpenOutputFolder.UseVisualStyleBackColor = true; - this.buttonOpenOutputFolder.Click += new System.EventHandler(this.buttonOpenOutputFolder_Click); - // - // labelFileName - // - this.labelFileName.AutoSize = true; - this.labelFileName.Location = new System.Drawing.Point(6, 16); - this.labelFileName.Name = "labelFileName"; - this.labelFileName.Size = new System.Drawing.Size(52, 13); - this.labelFileName.TabIndex = 0; - this.labelFileName.Text = "File name"; - // - // textBoxFileName - // - this.textBoxFileName.Location = new System.Drawing.Point(7, 32); - this.textBoxFileName.Name = "textBoxFileName"; - this.textBoxFileName.Size = new System.Drawing.Size(529, 20); - this.textBoxFileName.TabIndex = 1; - this.textBoxFileName.TextChanged += new System.EventHandler(this.textBoxFileName_TextChanged); - // - // comboBoxSubtitleFormats - // - this.comboBoxSubtitleFormats.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxSubtitleFormats.FormattingEnabled = true; - this.comboBoxSubtitleFormats.Location = new System.Drawing.Point(51, 107); - this.comboBoxSubtitleFormats.Name = "comboBoxSubtitleFormats"; - this.comboBoxSubtitleFormats.Size = new System.Drawing.Size(225, 21); - this.comboBoxSubtitleFormats.TabIndex = 7; - this.comboBoxSubtitleFormats.SelectedIndexChanged += new System.EventHandler(this.comboBoxSubtitleFormats_SelectedIndexChanged); - // - // labelEncoding - // - this.labelEncoding.AutoSize = true; - this.labelEncoding.Location = new System.Drawing.Point(336, 110); - this.labelEncoding.Name = "labelEncoding"; - this.labelEncoding.Size = new System.Drawing.Size(52, 13); - this.labelEncoding.TabIndex = 8; - this.labelEncoding.Text = "Encoding"; - // - // comboBoxEncoding - // - this.comboBoxEncoding.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxEncoding.FormattingEnabled = true; - this.comboBoxEncoding.Location = new System.Drawing.Point(394, 107); - this.comboBoxEncoding.Name = "comboBoxEncoding"; - this.comboBoxEncoding.Size = new System.Drawing.Size(221, 21); - this.comboBoxEncoding.TabIndex = 9; - // - // labelOutputFormat - // - this.labelOutputFormat.AutoSize = true; - this.labelOutputFormat.Location = new System.Drawing.Point(6, 110); - this.labelOutputFormat.Name = "labelOutputFormat"; - this.labelOutputFormat.Size = new System.Drawing.Size(39, 13); - this.labelOutputFormat.TabIndex = 6; - this.labelOutputFormat.Text = "Format"; - // - // labelChooseOutputFolder - // - this.labelChooseOutputFolder.AutoSize = true; - this.labelChooseOutputFolder.Location = new System.Drawing.Point(6, 61); - this.labelChooseOutputFolder.Name = "labelChooseOutputFolder"; - this.labelChooseOutputFolder.Size = new System.Drawing.Size(105, 13); - this.labelChooseOutputFolder.TabIndex = 2; - this.labelChooseOutputFolder.Text = "Choose output folder"; - // - // buttonChooseFolder - // - this.buttonChooseFolder.Location = new System.Drawing.Point(542, 75); - this.buttonChooseFolder.Name = "buttonChooseFolder"; - this.buttonChooseFolder.Size = new System.Drawing.Size(26, 23); - this.buttonChooseFolder.TabIndex = 4; - this.buttonChooseFolder.Text = "..."; - this.buttonChooseFolder.UseVisualStyleBackColor = true; - this.buttonChooseFolder.Click += new System.EventHandler(this.buttonChooseFolder_Click); - // - // textBoxOutputFolder - // - this.textBoxOutputFolder.Location = new System.Drawing.Point(7, 77); - this.textBoxOutputFolder.Name = "textBoxOutputFolder"; - this.textBoxOutputFolder.Size = new System.Drawing.Size(529, 20); - this.textBoxOutputFolder.TabIndex = 3; - this.textBoxOutputFolder.TextChanged += new System.EventHandler(this.textBoxOutputFolder_TextChanged); - // - // groupBoxPreview - // - this.groupBoxPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxPreview.Controls.Add(this.listViewParts); - this.groupBoxPreview.Location = new System.Drawing.Point(12, 254); - this.groupBoxPreview.Name = "groupBoxPreview"; - this.groupBoxPreview.Size = new System.Drawing.Size(688, 245); - this.groupBoxPreview.TabIndex = 2; - this.groupBoxPreview.TabStop = false; - this.groupBoxPreview.Text = "Preview"; - // - // listViewParts - // - this.listViewParts.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeader5, - this.columnHeader6, - this.columnHeaderFileName}); - this.listViewParts.Dock = System.Windows.Forms.DockStyle.Fill; - this.listViewParts.FullRowSelect = true; - this.listViewParts.HideSelection = false; - this.listViewParts.Location = new System.Drawing.Point(3, 16); - this.listViewParts.Name = "listViewParts"; - this.listViewParts.Size = new System.Drawing.Size(682, 226); - this.listViewParts.TabIndex = 0; - this.listViewParts.UseCompatibleStateImageBehavior = false; - this.listViewParts.View = System.Windows.Forms.View.Details; - // - // columnHeader5 - // - this.columnHeader5.Text = "#Lines"; - this.columnHeader5.Width = 61; - // - // columnHeader6 - // - this.columnHeader6.Text = "#Characters"; - this.columnHeader6.Width = 75; - // - // columnHeaderFileName - // - this.columnHeaderFileName.Text = "File name"; - this.columnHeaderFileName.Width = 463; - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(625, 505); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 5; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // buttonSplit - // - this.buttonSplit.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonSplit.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonSplit.Location = new System.Drawing.Point(544, 505); - this.buttonSplit.Name = "buttonSplit"; - this.buttonSplit.Size = new System.Drawing.Size(75, 23); - this.buttonSplit.TabIndex = 4; - this.buttonSplit.Text = "&Split"; - this.buttonSplit.UseVisualStyleBackColor = true; - this.buttonSplit.Click += new System.EventHandler(this.buttonSplit_Click); - // - // buttonBasic - // - this.buttonBasic.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonBasic.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonBasic.Location = new System.Drawing.Point(440, 505); - this.buttonBasic.Name = "buttonBasic"; - this.buttonBasic.Size = new System.Drawing.Size(98, 23); - this.buttonBasic.TabIndex = 3; - this.buttonBasic.Text = "&Basic"; - this.buttonBasic.UseVisualStyleBackColor = true; - this.buttonBasic.Click += new System.EventHandler(this.buttonBasic_Click); - // - // Split - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(712, 537); - this.Controls.Add(this.buttonBasic); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonSplit); - this.Controls.Add(this.groupBoxPreview); - this.Controls.Add(this.groupBoxOutput); - this.Controls.Add(this.groupBoxSplitOptions); - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(640, 420); - this.Name = "Split"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Split"; - this.Shown += new System.EventHandler(this.Split_Shown); - this.ResizeEnd += new System.EventHandler(this.Split_ResizeEnd); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Split_KeyDown); - this.Resize += new System.EventHandler(this.Split_Resize); - this.groupBoxSplitOptions.ResumeLayout(false); - this.groupBoxSplitOptions.PerformLayout(); - this.groupBoxSubtitleInfo.ResumeLayout(false); - this.groupBoxSubtitleInfo.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownParts)).EndInit(); - this.groupBoxOutput.ResumeLayout(false); - this.groupBoxOutput.PerformLayout(); - this.groupBoxPreview.ResumeLayout(false); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.GroupBox groupBoxSplitOptions; - private System.Windows.Forms.Label labelNumberOfParts; - private System.Windows.Forms.NumericUpDown numericUpDownParts; - private System.Windows.Forms.RadioButton radioButtonCharacters; - private System.Windows.Forms.RadioButton RadioButtonLines; - private System.Windows.Forms.GroupBox groupBoxOutput; - private System.Windows.Forms.ComboBox comboBoxEncoding; - private System.Windows.Forms.Label labelOutputFormat; - private System.Windows.Forms.Label labelChooseOutputFolder; - private System.Windows.Forms.Button buttonChooseFolder; - private System.Windows.Forms.TextBox textBoxOutputFolder; - private System.Windows.Forms.FolderBrowserDialog folderBrowserDialog1; - private System.Windows.Forms.GroupBox groupBoxPreview; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonSplit; - private System.Windows.Forms.ListView listViewParts; - private System.Windows.Forms.ColumnHeader columnHeaderFileName; - private System.Windows.Forms.ColumnHeader columnHeader5; - private System.Windows.Forms.ColumnHeader columnHeader6; - private System.Windows.Forms.Button buttonBasic; - private System.Windows.Forms.GroupBox groupBoxSubtitleInfo; - private System.Windows.Forms.Label labelCharacters; - private System.Windows.Forms.Label labelLines; - private System.Windows.Forms.ComboBox comboBoxSubtitleFormats; - private System.Windows.Forms.Label labelEncoding; - private System.Windows.Forms.Label labelFileName; - private System.Windows.Forms.TextBox textBoxFileName; - private System.Windows.Forms.Button buttonOpenOutputFolder; - } +namespace Nikse.SubtitleEdit.Forms +{ + partial class Split + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.groupBoxSplitOptions = new System.Windows.Forms.GroupBox(); + this.groupBoxSubtitleInfo = new System.Windows.Forms.GroupBox(); + this.labelCharacters = new System.Windows.Forms.Label(); + this.labelLines = new System.Windows.Forms.Label(); + this.labelNumberOfParts = new System.Windows.Forms.Label(); + this.numericUpDownParts = new System.Windows.Forms.NumericUpDown(); + this.radioButtonCharacters = new System.Windows.Forms.RadioButton(); + this.RadioButtonLines = new System.Windows.Forms.RadioButton(); + this.groupBoxOutput = new System.Windows.Forms.GroupBox(); + this.buttonOpenOutputFolder = new System.Windows.Forms.Button(); + this.labelFileName = new System.Windows.Forms.Label(); + this.textBoxFileName = new System.Windows.Forms.TextBox(); + this.comboBoxSubtitleFormats = new System.Windows.Forms.ComboBox(); + this.labelEncoding = new System.Windows.Forms.Label(); + this.comboBoxEncoding = new System.Windows.Forms.ComboBox(); + this.labelOutputFormat = new System.Windows.Forms.Label(); + this.labelChooseOutputFolder = new System.Windows.Forms.Label(); + this.buttonChooseFolder = new System.Windows.Forms.Button(); + this.textBoxOutputFolder = new System.Windows.Forms.TextBox(); + this.folderBrowserDialog1 = new System.Windows.Forms.FolderBrowserDialog(); + this.groupBoxPreview = new System.Windows.Forms.GroupBox(); + this.listViewParts = new System.Windows.Forms.ListView(); + this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader6 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderFileName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonSplit = new System.Windows.Forms.Button(); + this.buttonBasic = new System.Windows.Forms.Button(); + this.groupBoxSplitOptions.SuspendLayout(); + this.groupBoxSubtitleInfo.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownParts)).BeginInit(); + this.groupBoxOutput.SuspendLayout(); + this.groupBoxPreview.SuspendLayout(); + this.SuspendLayout(); + // + // groupBoxSplitOptions + // + this.groupBoxSplitOptions.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxSplitOptions.Controls.Add(this.groupBoxSubtitleInfo); + this.groupBoxSplitOptions.Controls.Add(this.labelNumberOfParts); + this.groupBoxSplitOptions.Controls.Add(this.numericUpDownParts); + this.groupBoxSplitOptions.Controls.Add(this.radioButtonCharacters); + this.groupBoxSplitOptions.Controls.Add(this.RadioButtonLines); + this.groupBoxSplitOptions.Location = new System.Drawing.Point(13, 13); + this.groupBoxSplitOptions.Name = "groupBoxSplitOptions"; + this.groupBoxSplitOptions.Size = new System.Drawing.Size(684, 86); + this.groupBoxSplitOptions.TabIndex = 0; + this.groupBoxSplitOptions.TabStop = false; + this.groupBoxSplitOptions.Text = "Split options"; + // + // groupBoxSubtitleInfo + // + this.groupBoxSubtitleInfo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxSubtitleInfo.Controls.Add(this.labelCharacters); + this.groupBoxSubtitleInfo.Controls.Add(this.labelLines); + this.groupBoxSubtitleInfo.Location = new System.Drawing.Point(311, 13); + this.groupBoxSubtitleInfo.Name = "groupBoxSubtitleInfo"; + this.groupBoxSubtitleInfo.Size = new System.Drawing.Size(367, 67); + this.groupBoxSubtitleInfo.TabIndex = 2; + this.groupBoxSubtitleInfo.TabStop = false; + this.groupBoxSubtitleInfo.Text = "Subtitle info"; + // + // labelCharacters + // + this.labelCharacters.AutoSize = true; + this.labelCharacters.Location = new System.Drawing.Point(7, 46); + this.labelCharacters.Name = "labelCharacters"; + this.labelCharacters.Size = new System.Drawing.Size(122, 13); + this.labelCharacters.TabIndex = 1; + this.labelCharacters.Text = "Number of characters: X"; + // + // labelLines + // + this.labelLines.AutoSize = true; + this.labelLines.Location = new System.Drawing.Point(7, 27); + this.labelLines.Name = "labelLines"; + this.labelLines.Size = new System.Drawing.Size(93, 13); + this.labelLines.TabIndex = 0; + this.labelLines.Text = "Number of lines: X"; + // + // labelNumberOfParts + // + this.labelNumberOfParts.AutoSize = true; + this.labelNumberOfParts.Location = new System.Drawing.Point(148, 22); + this.labelNumberOfParts.Name = "labelNumberOfParts"; + this.labelNumberOfParts.Size = new System.Drawing.Size(111, 13); + this.labelNumberOfParts.TabIndex = 3; + this.labelNumberOfParts.Text = "Number of equal parts"; + // + // numericUpDownParts + // + this.numericUpDownParts.Location = new System.Drawing.Point(151, 38); + this.numericUpDownParts.Minimum = new decimal(new int[] { + 2, + 0, + 0, + 0}); + this.numericUpDownParts.Name = "numericUpDownParts"; + this.numericUpDownParts.Size = new System.Drawing.Size(50, 20); + this.numericUpDownParts.TabIndex = 1; + this.numericUpDownParts.Value = new decimal(new int[] { + 2, + 0, + 0, + 0}); + this.numericUpDownParts.ValueChanged += new System.EventHandler(this.numericUpDownParts_ValueChanged); + // + // radioButtonCharacters + // + this.radioButtonCharacters.AutoSize = true; + this.radioButtonCharacters.Location = new System.Drawing.Point(15, 43); + this.radioButtonCharacters.Name = "radioButtonCharacters"; + this.radioButtonCharacters.Size = new System.Drawing.Size(76, 17); + this.radioButtonCharacters.TabIndex = 0; + this.radioButtonCharacters.Text = "Characters"; + this.radioButtonCharacters.UseVisualStyleBackColor = true; + this.radioButtonCharacters.CheckedChanged += new System.EventHandler(this.radioButtonCharacters_CheckedChanged); + // + // RadioButtonLines + // + this.RadioButtonLines.AutoSize = true; + this.RadioButtonLines.Checked = true; + this.RadioButtonLines.Location = new System.Drawing.Point(15, 20); + this.RadioButtonLines.Name = "RadioButtonLines"; + this.RadioButtonLines.Size = new System.Drawing.Size(50, 17); + this.RadioButtonLines.TabIndex = 0; + this.RadioButtonLines.TabStop = true; + this.RadioButtonLines.Text = "Lines"; + this.RadioButtonLines.UseVisualStyleBackColor = true; + this.RadioButtonLines.CheckedChanged += new System.EventHandler(this.RadioButtonLines_CheckedChanged); + // + // groupBoxOutput + // + this.groupBoxOutput.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxOutput.Controls.Add(this.buttonOpenOutputFolder); + this.groupBoxOutput.Controls.Add(this.labelFileName); + this.groupBoxOutput.Controls.Add(this.textBoxFileName); + this.groupBoxOutput.Controls.Add(this.comboBoxSubtitleFormats); + this.groupBoxOutput.Controls.Add(this.labelEncoding); + this.groupBoxOutput.Controls.Add(this.comboBoxEncoding); + this.groupBoxOutput.Controls.Add(this.labelOutputFormat); + this.groupBoxOutput.Controls.Add(this.labelChooseOutputFolder); + this.groupBoxOutput.Controls.Add(this.buttonChooseFolder); + this.groupBoxOutput.Controls.Add(this.textBoxOutputFolder); + this.groupBoxOutput.Location = new System.Drawing.Point(12, 105); + this.groupBoxOutput.Name = "groupBoxOutput"; + this.groupBoxOutput.Size = new System.Drawing.Size(688, 143); + this.groupBoxOutput.TabIndex = 1; + this.groupBoxOutput.TabStop = false; + this.groupBoxOutput.Text = "Output"; + // + // buttonOpenOutputFolder + // + this.buttonOpenOutputFolder.Location = new System.Drawing.Point(574, 75); + this.buttonOpenOutputFolder.Name = "buttonOpenOutputFolder"; + this.buttonOpenOutputFolder.Size = new System.Drawing.Size(81, 23); + this.buttonOpenOutputFolder.TabIndex = 5; + this.buttonOpenOutputFolder.Text = "Open..."; + this.buttonOpenOutputFolder.UseVisualStyleBackColor = true; + this.buttonOpenOutputFolder.Click += new System.EventHandler(this.buttonOpenOutputFolder_Click); + // + // labelFileName + // + this.labelFileName.AutoSize = true; + this.labelFileName.Location = new System.Drawing.Point(6, 16); + this.labelFileName.Name = "labelFileName"; + this.labelFileName.Size = new System.Drawing.Size(52, 13); + this.labelFileName.TabIndex = 0; + this.labelFileName.Text = "File name"; + // + // textBoxFileName + // + this.textBoxFileName.Location = new System.Drawing.Point(7, 32); + this.textBoxFileName.Name = "textBoxFileName"; + this.textBoxFileName.Size = new System.Drawing.Size(529, 20); + this.textBoxFileName.TabIndex = 1; + this.textBoxFileName.TextChanged += new System.EventHandler(this.textBoxFileName_TextChanged); + // + // comboBoxSubtitleFormats + // + this.comboBoxSubtitleFormats.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxSubtitleFormats.FormattingEnabled = true; + this.comboBoxSubtitleFormats.Location = new System.Drawing.Point(51, 107); + this.comboBoxSubtitleFormats.Name = "comboBoxSubtitleFormats"; + this.comboBoxSubtitleFormats.Size = new System.Drawing.Size(225, 21); + this.comboBoxSubtitleFormats.TabIndex = 7; + this.comboBoxSubtitleFormats.SelectedIndexChanged += new System.EventHandler(this.comboBoxSubtitleFormats_SelectedIndexChanged); + // + // labelEncoding + // + this.labelEncoding.AutoSize = true; + this.labelEncoding.Location = new System.Drawing.Point(336, 110); + this.labelEncoding.Name = "labelEncoding"; + this.labelEncoding.Size = new System.Drawing.Size(52, 13); + this.labelEncoding.TabIndex = 8; + this.labelEncoding.Text = "Encoding"; + // + // comboBoxEncoding + // + this.comboBoxEncoding.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxEncoding.FormattingEnabled = true; + this.comboBoxEncoding.Location = new System.Drawing.Point(394, 107); + this.comboBoxEncoding.Name = "comboBoxEncoding"; + this.comboBoxEncoding.Size = new System.Drawing.Size(221, 21); + this.comboBoxEncoding.TabIndex = 9; + // + // labelOutputFormat + // + this.labelOutputFormat.AutoSize = true; + this.labelOutputFormat.Location = new System.Drawing.Point(6, 110); + this.labelOutputFormat.Name = "labelOutputFormat"; + this.labelOutputFormat.Size = new System.Drawing.Size(39, 13); + this.labelOutputFormat.TabIndex = 6; + this.labelOutputFormat.Text = "Format"; + // + // labelChooseOutputFolder + // + this.labelChooseOutputFolder.AutoSize = true; + this.labelChooseOutputFolder.Location = new System.Drawing.Point(6, 61); + this.labelChooseOutputFolder.Name = "labelChooseOutputFolder"; + this.labelChooseOutputFolder.Size = new System.Drawing.Size(105, 13); + this.labelChooseOutputFolder.TabIndex = 2; + this.labelChooseOutputFolder.Text = "Choose output folder"; + // + // buttonChooseFolder + // + this.buttonChooseFolder.Location = new System.Drawing.Point(542, 75); + this.buttonChooseFolder.Name = "buttonChooseFolder"; + this.buttonChooseFolder.Size = new System.Drawing.Size(26, 23); + this.buttonChooseFolder.TabIndex = 4; + this.buttonChooseFolder.Text = "..."; + this.buttonChooseFolder.UseVisualStyleBackColor = true; + this.buttonChooseFolder.Click += new System.EventHandler(this.buttonChooseFolder_Click); + // + // textBoxOutputFolder + // + this.textBoxOutputFolder.Location = new System.Drawing.Point(7, 77); + this.textBoxOutputFolder.Name = "textBoxOutputFolder"; + this.textBoxOutputFolder.Size = new System.Drawing.Size(529, 20); + this.textBoxOutputFolder.TabIndex = 3; + this.textBoxOutputFolder.TextChanged += new System.EventHandler(this.textBoxOutputFolder_TextChanged); + // + // groupBoxPreview + // + this.groupBoxPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxPreview.Controls.Add(this.listViewParts); + this.groupBoxPreview.Location = new System.Drawing.Point(12, 254); + this.groupBoxPreview.Name = "groupBoxPreview"; + this.groupBoxPreview.Size = new System.Drawing.Size(688, 245); + this.groupBoxPreview.TabIndex = 2; + this.groupBoxPreview.TabStop = false; + this.groupBoxPreview.Text = "Preview"; + // + // listViewParts + // + this.listViewParts.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader5, + this.columnHeader6, + this.columnHeaderFileName}); + this.listViewParts.Dock = System.Windows.Forms.DockStyle.Fill; + this.listViewParts.FullRowSelect = true; + this.listViewParts.HideSelection = false; + this.listViewParts.Location = new System.Drawing.Point(3, 16); + this.listViewParts.Name = "listViewParts"; + this.listViewParts.Size = new System.Drawing.Size(682, 226); + this.listViewParts.TabIndex = 0; + this.listViewParts.UseCompatibleStateImageBehavior = false; + this.listViewParts.View = System.Windows.Forms.View.Details; + // + // columnHeader5 + // + this.columnHeader5.Text = "#Lines"; + this.columnHeader5.Width = 61; + // + // columnHeader6 + // + this.columnHeader6.Text = "#Characters"; + this.columnHeader6.Width = 75; + // + // columnHeaderFileName + // + this.columnHeaderFileName.Text = "File name"; + this.columnHeaderFileName.Width = 463; + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(625, 505); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 5; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // buttonSplit + // + this.buttonSplit.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonSplit.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonSplit.Location = new System.Drawing.Point(544, 505); + this.buttonSplit.Name = "buttonSplit"; + this.buttonSplit.Size = new System.Drawing.Size(75, 23); + this.buttonSplit.TabIndex = 4; + this.buttonSplit.Text = "&Split"; + this.buttonSplit.UseVisualStyleBackColor = true; + this.buttonSplit.Click += new System.EventHandler(this.buttonSplit_Click); + // + // buttonBasic + // + this.buttonBasic.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonBasic.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonBasic.Location = new System.Drawing.Point(440, 505); + this.buttonBasic.Name = "buttonBasic"; + this.buttonBasic.Size = new System.Drawing.Size(98, 23); + this.buttonBasic.TabIndex = 3; + this.buttonBasic.Text = "&Basic"; + this.buttonBasic.UseVisualStyleBackColor = true; + this.buttonBasic.Click += new System.EventHandler(this.buttonBasic_Click); + // + // Split + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(712, 537); + this.Controls.Add(this.buttonBasic); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonSplit); + this.Controls.Add(this.groupBoxPreview); + this.Controls.Add(this.groupBoxOutput); + this.Controls.Add(this.groupBoxSplitOptions); + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(640, 420); + this.Name = "Split"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Split"; + this.Shown += new System.EventHandler(this.Split_Shown); + this.ResizeEnd += new System.EventHandler(this.Split_ResizeEnd); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Split_KeyDown); + this.Resize += new System.EventHandler(this.Split_Resize); + this.groupBoxSplitOptions.ResumeLayout(false); + this.groupBoxSplitOptions.PerformLayout(); + this.groupBoxSubtitleInfo.ResumeLayout(false); + this.groupBoxSubtitleInfo.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownParts)).EndInit(); + this.groupBoxOutput.ResumeLayout(false); + this.groupBoxOutput.PerformLayout(); + this.groupBoxPreview.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBoxSplitOptions; + private System.Windows.Forms.Label labelNumberOfParts; + private System.Windows.Forms.NumericUpDown numericUpDownParts; + private System.Windows.Forms.RadioButton radioButtonCharacters; + private System.Windows.Forms.RadioButton RadioButtonLines; + private System.Windows.Forms.GroupBox groupBoxOutput; + private System.Windows.Forms.ComboBox comboBoxEncoding; + private System.Windows.Forms.Label labelOutputFormat; + private System.Windows.Forms.Label labelChooseOutputFolder; + private System.Windows.Forms.Button buttonChooseFolder; + private System.Windows.Forms.TextBox textBoxOutputFolder; + private System.Windows.Forms.FolderBrowserDialog folderBrowserDialog1; + private System.Windows.Forms.GroupBox groupBoxPreview; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonSplit; + private System.Windows.Forms.ListView listViewParts; + private System.Windows.Forms.ColumnHeader columnHeaderFileName; + private System.Windows.Forms.ColumnHeader columnHeader5; + private System.Windows.Forms.ColumnHeader columnHeader6; + private System.Windows.Forms.Button buttonBasic; + private System.Windows.Forms.GroupBox groupBoxSubtitleInfo; + private System.Windows.Forms.Label labelCharacters; + private System.Windows.Forms.Label labelLines; + private System.Windows.Forms.ComboBox comboBoxSubtitleFormats; + private System.Windows.Forms.Label labelEncoding; + private System.Windows.Forms.Label labelFileName; + private System.Windows.Forms.TextBox textBoxFileName; + private System.Windows.Forms.Button buttonOpenOutputFolder; + } } \ No newline at end of file diff --git a/src/Forms/Split.cs b/src/ui/Forms/Split.cs similarity index 97% rename from src/Forms/Split.cs rename to src/ui/Forms/Split.cs index 5995f0682..ffdce784e 100644 --- a/src/Forms/Split.cs +++ b/src/ui/Forms/Split.cs @@ -1,353 +1,353 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.SubtitleFormats; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.IO; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class Split : Form - { - private Subtitle _subtitle; - public bool ShowBasic { get; private set; } - private int _totalNumberOfCharacters; - private bool _loading = true; - private List _parts; - private string _fileName; - - public Split() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - var l = Configuration.Settings.Language.Split; - Text = l.Title; - groupBoxSplitOptions.Text = l.SplitOptions; - RadioButtonLines.Text = l.Lines; - radioButtonCharacters.Text = l.Characters; - labelNumberOfParts.Text = l.NumberOfEqualParts; - groupBoxSubtitleInfo.Text = l.SubtitleInfo; - groupBoxOutput.Text = l.Output; - labelFileName.Text = l.FileName; - labelChooseOutputFolder.Text = l.OutputFolder; - labelOutputFormat.Text = Configuration.Settings.Language.Main.Controls.SubtitleFormat; - labelEncoding.Text = Configuration.Settings.Language.Main.Controls.FileEncoding; - groupBoxPreview.Text = Configuration.Settings.Language.General.Preview; - buttonOpenOutputFolder.Text = Configuration.Settings.Language.Main.Menu.File.Open; - - listViewParts.Columns[0].Text = l.Lines; - listViewParts.Columns[1].Text = l.Characters; - listViewParts.Columns[2].Text = l.FileName; - - buttonSplit.Text = l.DoSplit; - buttonBasic.Text = l.Basic; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - - comboBoxSubtitleFormats.Left = labelOutputFormat.Left + labelOutputFormat.Width + 3; - comboBoxEncoding.Left = labelEncoding.Left + labelEncoding.Width + 3; - - UiUtil.FixLargeFonts(this, buttonSplit); - } - - public void Initialize(Subtitle subtitle, string fileName, SubtitleFormat format) - { - ShowBasic = false; - _subtitle = subtitle; - if (string.IsNullOrEmpty(fileName)) - { - textBoxFileName.Text = Configuration.Settings.Language.SplitSubtitle.Untitled; - } - else - { - textBoxFileName.Text = fileName; - } - - _fileName = fileName; - foreach (Paragraph p in _subtitle.Paragraphs) - { - _totalNumberOfCharacters += HtmlUtil.RemoveHtmlTags(p.Text, true).Length; - } - - labelLines.Text = string.Format(Configuration.Settings.Language.Split.NumberOfLinesX, _subtitle.Paragraphs.Count); - labelCharacters.Text = string.Format(Configuration.Settings.Language.Split.NumberOfCharactersX, _totalNumberOfCharacters); - - try - { - numericUpDownParts.Value = Configuration.Settings.Tools.SplitNumberOfParts; - } - catch - { - // ignored - } - - if (Configuration.Settings.Tools.SplitVia.Trim().Equals("lines", StringComparison.OrdinalIgnoreCase)) - { - RadioButtonLines.Checked = true; - } - else - { - radioButtonCharacters.Checked = true; - } - - UiUtil.InitializeSubtitleFormatComboBox(comboBoxSubtitleFormats, format.FriendlyName); - - UiUtil.InitializeTextEncodingComboBox(comboBoxEncoding); - - if (numericUpDownParts.Maximum > _subtitle.Paragraphs.Count) - { - numericUpDownParts.Maximum = (int)Math.Round(_subtitle.Paragraphs.Count / 2.0); - } - - if (!string.IsNullOrEmpty(_fileName)) - { - textBoxOutputFolder.Text = Path.GetDirectoryName(_fileName); - } - else if (string.IsNullOrEmpty(Configuration.Settings.Tools.SplitOutputFolder) || !Directory.Exists(Configuration.Settings.Tools.SplitOutputFolder)) - { - textBoxOutputFolder.Text = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); - } - else - { - textBoxOutputFolder.Text = Configuration.Settings.Tools.SplitOutputFolder; - } - } - - private void CalculateParts() - { - if (_loading) - { - return; - } - - _loading = true; - _parts = new List(); - if (string.IsNullOrEmpty(textBoxOutputFolder.Text) || !Directory.Exists(textBoxOutputFolder.Text)) - { - textBoxOutputFolder.Text = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); - } - - var format = Utilities.GetSubtitleFormatByFriendlyName(comboBoxSubtitleFormats.SelectedItem.ToString()); - string fileNameNoExt = Path.GetFileNameWithoutExtension(textBoxFileName.Text); - if (string.IsNullOrWhiteSpace(fileNameNoExt)) - { - fileNameNoExt = Configuration.Settings.Language.SplitSubtitle.Untitled; - } - - if (numericUpDownParts.Value == 0) - { - buttonSplit.Enabled = false; - return; - } - - listViewParts.Items.Clear(); - int startNumber = 0; - if (RadioButtonLines.Checked) - { - int partSize = (int)(_subtitle.Paragraphs.Count / numericUpDownParts.Value); - for (int i = 0; i < numericUpDownParts.Value; i++) - { - int noOfLines = partSize; - if (i == numericUpDownParts.Value - 1) - { - noOfLines = (int)(_subtitle.Paragraphs.Count - (numericUpDownParts.Value - 1) * partSize); - } - - var temp = new Subtitle { Header = _subtitle.Header }; - int size = 0; - for (int number = 0; number < noOfLines; number++) - { - Paragraph p = _subtitle.Paragraphs[startNumber + number]; - temp.Paragraphs.Add(new Paragraph(p)); - size += HtmlUtil.RemoveHtmlTags(p.Text, true).Length; - } - startNumber += noOfLines; - _parts.Add(temp); - - var lvi = new ListViewItem($"{noOfLines:#,###,###}"); - lvi.SubItems.Add($"{size:#,###,###}"); - lvi.SubItems.Add(fileNameNoExt + ".Part" + (i + 1) + format.Extension); - listViewParts.Items.Add(lvi); - } - } - else if (radioButtonCharacters.Checked) - { - int partSize = (int)(_totalNumberOfCharacters / numericUpDownParts.Value); - int nextLimit = partSize; - int currentSize = 0; - Subtitle temp = new Subtitle { Header = _subtitle.Header }; - for (int i = 0; i < _subtitle.Paragraphs.Count; i++) - { - Paragraph p = _subtitle.Paragraphs[i]; - int size = HtmlUtil.RemoveHtmlTags(p.Text, true).Length; - if (currentSize + size > nextLimit + 4 && _parts.Count < numericUpDownParts.Value - 1) - { - _parts.Add(temp); - var lvi = new ListViewItem($"{temp.Paragraphs.Count:#,###,###}"); - lvi.SubItems.Add($"{currentSize:#,###,###}"); - lvi.SubItems.Add(fileNameNoExt + ".Part" + _parts.Count + format.Extension); - listViewParts.Items.Add(lvi); - currentSize = size; - temp = new Subtitle { Header = _subtitle.Header }; - temp.Paragraphs.Add(new Paragraph(p)); - } - else - { - currentSize += size; - temp.Paragraphs.Add(new Paragraph(p)); - } - } - _parts.Add(temp); - var lvi2 = new ListViewItem($"{temp.Paragraphs.Count:#,###,###}"); - lvi2.SubItems.Add($"{currentSize:#,###,###}"); - lvi2.SubItems.Add(fileNameNoExt + ".Part" + numericUpDownParts.Value + ".srt"); - listViewParts.Items.Add(lvi2); - } - _loading = false; - } - - private void buttonBasic_Click(object sender, EventArgs e) - { - ShowBasic = true; - DialogResult = DialogResult.Cancel; - } - - private void buttonSplit_Click(object sender, EventArgs e) - { - bool overwrite = false; - var format = Utilities.GetSubtitleFormatByFriendlyName(comboBoxSubtitleFormats.SelectedItem.ToString()); - string fileNameNoExt = Path.GetFileNameWithoutExtension(textBoxFileName.Text); - if (string.IsNullOrWhiteSpace(fileNameNoExt)) - { - fileNameNoExt = Configuration.Settings.Language.SplitSubtitle.Untitled; - } - - int number = 1; - try - { - foreach (Subtitle sub in _parts) - { - string fileName = Path.Combine(textBoxOutputFolder.Text, fileNameNoExt + ".Part" + number + format.Extension); - string allText = sub.ToText(format); - if (File.Exists(fileName) && !overwrite) - { - if (MessageBox.Show(Configuration.Settings.Language.SplitSubtitle.OverwriteExistingFiles, "", MessageBoxButtons.YesNo) == DialogResult.No) - { - return; - } - - overwrite = true; - } - FileUtil.WriteAllText(fileName, allText, GetCurrentEncoding()); - number++; - } - } - catch (Exception exception) - { - MessageBox.Show(exception.Message); - return; - } - - Configuration.Settings.Tools.SplitNumberOfParts = (int)numericUpDownParts.Value; - Configuration.Settings.Tools.SplitOutputFolder = textBoxOutputFolder.Text; - if (RadioButtonLines.Checked) - { - Configuration.Settings.Tools.SplitVia = "Lines"; - } - else - { - Configuration.Settings.Tools.SplitVia = "Characters"; - } - - DialogResult = DialogResult.OK; - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private void numericUpDownParts_ValueChanged(object sender, EventArgs e) - { - CalculateParts(); - } - - private void radioButtonCharacters_CheckedChanged(object sender, EventArgs e) - { - CalculateParts(); - } - - private void RadioButtonLines_CheckedChanged(object sender, EventArgs e) - { - CalculateParts(); - } - - private void textBoxOutputFolder_TextChanged(object sender, EventArgs e) - { - CalculateParts(); - } - - private void Split_ResizeEnd(object sender, EventArgs e) - { - columnHeaderFileName.Width = -2; - } - - private void buttonChooseFolder_Click(object sender, EventArgs e) - { - if (folderBrowserDialog1.ShowDialog() == DialogResult.OK) - { - textBoxOutputFolder.Text = folderBrowserDialog1.SelectedPath; - } - } - - private TextEncoding GetCurrentEncoding() - { - return UiUtil.GetTextEncodingComboBoxCurrentEncoding(comboBoxEncoding); - } - - private void Split_Shown(object sender, EventArgs e) - { - _loading = false; - CalculateParts(); - } - - private void Split_Resize(object sender, EventArgs e) - { - columnHeaderFileName.Width = -2; - } - - private void Split_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - private void textBoxFileName_TextChanged(object sender, EventArgs e) - { - CalculateParts(); - } - - private void comboBoxSubtitleFormats_SelectedIndexChanged(object sender, EventArgs e) - { - CalculateParts(); - } - - private void buttonOpenOutputFolder_Click(object sender, EventArgs e) - { - if (Directory.Exists(textBoxOutputFolder.Text)) - { - UiUtil.OpenFolder(textBoxOutputFolder.Text); - } - else - { - MessageBox.Show(string.Format(Configuration.Settings.Language.SplitSubtitle.FolderNotFoundX, textBoxOutputFolder.Text)); - } - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.SubtitleFormats; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.IO; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class Split : Form + { + private Subtitle _subtitle; + public bool ShowBasic { get; private set; } + private int _totalNumberOfCharacters; + private bool _loading = true; + private List _parts; + private string _fileName; + + public Split() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + var l = Configuration.Settings.Language.Split; + Text = l.Title; + groupBoxSplitOptions.Text = l.SplitOptions; + RadioButtonLines.Text = l.Lines; + radioButtonCharacters.Text = l.Characters; + labelNumberOfParts.Text = l.NumberOfEqualParts; + groupBoxSubtitleInfo.Text = l.SubtitleInfo; + groupBoxOutput.Text = l.Output; + labelFileName.Text = l.FileName; + labelChooseOutputFolder.Text = l.OutputFolder; + labelOutputFormat.Text = Configuration.Settings.Language.Main.Controls.SubtitleFormat; + labelEncoding.Text = Configuration.Settings.Language.Main.Controls.FileEncoding; + groupBoxPreview.Text = Configuration.Settings.Language.General.Preview; + buttonOpenOutputFolder.Text = Configuration.Settings.Language.Main.Menu.File.Open; + + listViewParts.Columns[0].Text = l.Lines; + listViewParts.Columns[1].Text = l.Characters; + listViewParts.Columns[2].Text = l.FileName; + + buttonSplit.Text = l.DoSplit; + buttonBasic.Text = l.Basic; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + + comboBoxSubtitleFormats.Left = labelOutputFormat.Left + labelOutputFormat.Width + 3; + comboBoxEncoding.Left = labelEncoding.Left + labelEncoding.Width + 3; + + UiUtil.FixLargeFonts(this, buttonSplit); + } + + public void Initialize(Subtitle subtitle, string fileName, SubtitleFormat format) + { + ShowBasic = false; + _subtitle = subtitle; + if (string.IsNullOrEmpty(fileName)) + { + textBoxFileName.Text = Configuration.Settings.Language.SplitSubtitle.Untitled; + } + else + { + textBoxFileName.Text = fileName; + } + + _fileName = fileName; + foreach (Paragraph p in _subtitle.Paragraphs) + { + _totalNumberOfCharacters += HtmlUtil.RemoveHtmlTags(p.Text, true).Length; + } + + labelLines.Text = string.Format(Configuration.Settings.Language.Split.NumberOfLinesX, _subtitle.Paragraphs.Count); + labelCharacters.Text = string.Format(Configuration.Settings.Language.Split.NumberOfCharactersX, _totalNumberOfCharacters); + + try + { + numericUpDownParts.Value = Configuration.Settings.Tools.SplitNumberOfParts; + } + catch + { + // ignored + } + + if (Configuration.Settings.Tools.SplitVia.Trim().Equals("lines", StringComparison.OrdinalIgnoreCase)) + { + RadioButtonLines.Checked = true; + } + else + { + radioButtonCharacters.Checked = true; + } + + UiUtil.InitializeSubtitleFormatComboBox(comboBoxSubtitleFormats, format.FriendlyName); + + UiUtil.InitializeTextEncodingComboBox(comboBoxEncoding); + + if (numericUpDownParts.Maximum > _subtitle.Paragraphs.Count) + { + numericUpDownParts.Maximum = (int)Math.Round(_subtitle.Paragraphs.Count / 2.0); + } + + if (!string.IsNullOrEmpty(_fileName)) + { + textBoxOutputFolder.Text = Path.GetDirectoryName(_fileName); + } + else if (string.IsNullOrEmpty(Configuration.Settings.Tools.SplitOutputFolder) || !Directory.Exists(Configuration.Settings.Tools.SplitOutputFolder)) + { + textBoxOutputFolder.Text = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); + } + else + { + textBoxOutputFolder.Text = Configuration.Settings.Tools.SplitOutputFolder; + } + } + + private void CalculateParts() + { + if (_loading) + { + return; + } + + _loading = true; + _parts = new List(); + if (string.IsNullOrEmpty(textBoxOutputFolder.Text) || !Directory.Exists(textBoxOutputFolder.Text)) + { + textBoxOutputFolder.Text = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); + } + + var format = Utilities.GetSubtitleFormatByFriendlyName(comboBoxSubtitleFormats.SelectedItem.ToString()); + string fileNameNoExt = Path.GetFileNameWithoutExtension(textBoxFileName.Text); + if (string.IsNullOrWhiteSpace(fileNameNoExt)) + { + fileNameNoExt = Configuration.Settings.Language.SplitSubtitle.Untitled; + } + + if (numericUpDownParts.Value == 0) + { + buttonSplit.Enabled = false; + return; + } + + listViewParts.Items.Clear(); + int startNumber = 0; + if (RadioButtonLines.Checked) + { + int partSize = (int)(_subtitle.Paragraphs.Count / numericUpDownParts.Value); + for (int i = 0; i < numericUpDownParts.Value; i++) + { + int noOfLines = partSize; + if (i == numericUpDownParts.Value - 1) + { + noOfLines = (int)(_subtitle.Paragraphs.Count - (numericUpDownParts.Value - 1) * partSize); + } + + var temp = new Subtitle { Header = _subtitle.Header }; + int size = 0; + for (int number = 0; number < noOfLines; number++) + { + Paragraph p = _subtitle.Paragraphs[startNumber + number]; + temp.Paragraphs.Add(new Paragraph(p)); + size += HtmlUtil.RemoveHtmlTags(p.Text, true).Length; + } + startNumber += noOfLines; + _parts.Add(temp); + + var lvi = new ListViewItem($"{noOfLines:#,###,###}"); + lvi.SubItems.Add($"{size:#,###,###}"); + lvi.SubItems.Add(fileNameNoExt + ".Part" + (i + 1) + format.Extension); + listViewParts.Items.Add(lvi); + } + } + else if (radioButtonCharacters.Checked) + { + int partSize = (int)(_totalNumberOfCharacters / numericUpDownParts.Value); + int nextLimit = partSize; + int currentSize = 0; + Subtitle temp = new Subtitle { Header = _subtitle.Header }; + for (int i = 0; i < _subtitle.Paragraphs.Count; i++) + { + Paragraph p = _subtitle.Paragraphs[i]; + int size = HtmlUtil.RemoveHtmlTags(p.Text, true).Length; + if (currentSize + size > nextLimit + 4 && _parts.Count < numericUpDownParts.Value - 1) + { + _parts.Add(temp); + var lvi = new ListViewItem($"{temp.Paragraphs.Count:#,###,###}"); + lvi.SubItems.Add($"{currentSize:#,###,###}"); + lvi.SubItems.Add(fileNameNoExt + ".Part" + _parts.Count + format.Extension); + listViewParts.Items.Add(lvi); + currentSize = size; + temp = new Subtitle { Header = _subtitle.Header }; + temp.Paragraphs.Add(new Paragraph(p)); + } + else + { + currentSize += size; + temp.Paragraphs.Add(new Paragraph(p)); + } + } + _parts.Add(temp); + var lvi2 = new ListViewItem($"{temp.Paragraphs.Count:#,###,###}"); + lvi2.SubItems.Add($"{currentSize:#,###,###}"); + lvi2.SubItems.Add(fileNameNoExt + ".Part" + numericUpDownParts.Value + ".srt"); + listViewParts.Items.Add(lvi2); + } + _loading = false; + } + + private void buttonBasic_Click(object sender, EventArgs e) + { + ShowBasic = true; + DialogResult = DialogResult.Cancel; + } + + private void buttonSplit_Click(object sender, EventArgs e) + { + bool overwrite = false; + var format = Utilities.GetSubtitleFormatByFriendlyName(comboBoxSubtitleFormats.SelectedItem.ToString()); + string fileNameNoExt = Path.GetFileNameWithoutExtension(textBoxFileName.Text); + if (string.IsNullOrWhiteSpace(fileNameNoExt)) + { + fileNameNoExt = Configuration.Settings.Language.SplitSubtitle.Untitled; + } + + int number = 1; + try + { + foreach (Subtitle sub in _parts) + { + string fileName = Path.Combine(textBoxOutputFolder.Text, fileNameNoExt + ".Part" + number + format.Extension); + string allText = sub.ToText(format); + if (File.Exists(fileName) && !overwrite) + { + if (MessageBox.Show(Configuration.Settings.Language.SplitSubtitle.OverwriteExistingFiles, "", MessageBoxButtons.YesNo) == DialogResult.No) + { + return; + } + + overwrite = true; + } + FileUtil.WriteAllText(fileName, allText, GetCurrentEncoding()); + number++; + } + } + catch (Exception exception) + { + MessageBox.Show(exception.Message); + return; + } + + Configuration.Settings.Tools.SplitNumberOfParts = (int)numericUpDownParts.Value; + Configuration.Settings.Tools.SplitOutputFolder = textBoxOutputFolder.Text; + if (RadioButtonLines.Checked) + { + Configuration.Settings.Tools.SplitVia = "Lines"; + } + else + { + Configuration.Settings.Tools.SplitVia = "Characters"; + } + + DialogResult = DialogResult.OK; + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void numericUpDownParts_ValueChanged(object sender, EventArgs e) + { + CalculateParts(); + } + + private void radioButtonCharacters_CheckedChanged(object sender, EventArgs e) + { + CalculateParts(); + } + + private void RadioButtonLines_CheckedChanged(object sender, EventArgs e) + { + CalculateParts(); + } + + private void textBoxOutputFolder_TextChanged(object sender, EventArgs e) + { + CalculateParts(); + } + + private void Split_ResizeEnd(object sender, EventArgs e) + { + columnHeaderFileName.Width = -2; + } + + private void buttonChooseFolder_Click(object sender, EventArgs e) + { + if (folderBrowserDialog1.ShowDialog() == DialogResult.OK) + { + textBoxOutputFolder.Text = folderBrowserDialog1.SelectedPath; + } + } + + private TextEncoding GetCurrentEncoding() + { + return UiUtil.GetTextEncodingComboBoxCurrentEncoding(comboBoxEncoding); + } + + private void Split_Shown(object sender, EventArgs e) + { + _loading = false; + CalculateParts(); + } + + private void Split_Resize(object sender, EventArgs e) + { + columnHeaderFileName.Width = -2; + } + + private void Split_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + private void textBoxFileName_TextChanged(object sender, EventArgs e) + { + CalculateParts(); + } + + private void comboBoxSubtitleFormats_SelectedIndexChanged(object sender, EventArgs e) + { + CalculateParts(); + } + + private void buttonOpenOutputFolder_Click(object sender, EventArgs e) + { + if (Directory.Exists(textBoxOutputFolder.Text)) + { + UiUtil.OpenFolder(textBoxOutputFolder.Text); + } + else + { + MessageBox.Show(string.Format(Configuration.Settings.Language.SplitSubtitle.FolderNotFoundX, textBoxOutputFolder.Text)); + } + } + + } +} diff --git a/src/Forms/Split.resx b/src/ui/Forms/Split.resx similarity index 97% rename from src/Forms/Split.resx rename to src/ui/Forms/Split.resx index 913dd0dab..69f943da9 100644 --- a/src/Forms/Split.resx +++ b/src/ui/Forms/Split.resx @@ -1,123 +1,123 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + \ No newline at end of file diff --git a/src/Forms/SplitLongLines.Designer.cs b/src/ui/Forms/SplitLongLines.Designer.cs similarity index 98% rename from src/Forms/SplitLongLines.Designer.cs rename to src/ui/Forms/SplitLongLines.Designer.cs index c028bee8d..1beca80d1 100644 --- a/src/Forms/SplitLongLines.Designer.cs +++ b/src/ui/Forms/SplitLongLines.Designer.cs @@ -1,359 +1,359 @@ -namespace Nikse.SubtitleEdit.Forms -{ - partial class SplitLongLines - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.groupBoxLinesFound = new System.Windows.Forms.GroupBox(); - this.listViewFixes = new System.Windows.Forms.ListView(); - this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader7 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.numericUpDownSingleLineMaxCharacters = new System.Windows.Forms.NumericUpDown(); - this.labelLineMaxLength = new System.Windows.Forms.Label(); - this.labelSingleLineMaxLength = new System.Windows.Forms.Label(); - this.buttonOK = new System.Windows.Forms.Button(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.numericUpDownLineMaxCharacters = new System.Windows.Forms.NumericUpDown(); - this.labelMaxSingleLineLengthIs = new System.Windows.Forms.Label(); - this.labelMaxLineLengthIs = new System.Windows.Forms.Label(); - this.comboBoxLineContinuationBegin = new System.Windows.Forms.ComboBox(); - this.labelLineContinuationBeginEnd = new System.Windows.Forms.Label(); - this.comboBoxLineContinuationEnd = new System.Windows.Forms.ComboBox(); - this.SubtitleListview1 = new Nikse.SubtitleEdit.Controls.SubtitleListView(); - this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); - this.toolStripMenuItemSelectAll = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItemInverseSelection = new System.Windows.Forms.ToolStripMenuItem(); - this.groupBoxLinesFound.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSingleLineMaxCharacters)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownLineMaxCharacters)).BeginInit(); - this.contextMenuStrip1.SuspendLayout(); - this.SuspendLayout(); - // - // groupBoxLinesFound - // - this.groupBoxLinesFound.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxLinesFound.Controls.Add(this.listViewFixes); - this.groupBoxLinesFound.Location = new System.Drawing.Point(12, 64); - this.groupBoxLinesFound.Name = "groupBoxLinesFound"; - this.groupBoxLinesFound.Size = new System.Drawing.Size(750, 200); - this.groupBoxLinesFound.TabIndex = 4; - this.groupBoxLinesFound.TabStop = false; - this.groupBoxLinesFound.Text = "Lines that will be split"; - // - // listViewFixes - // - this.listViewFixes.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.listViewFixes.CheckBoxes = true; - this.listViewFixes.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeader4, - this.columnHeader5, - this.columnHeader7}); - this.listViewFixes.ContextMenuStrip = this.contextMenuStrip1; - this.listViewFixes.FullRowSelect = true; - this.listViewFixes.HideSelection = false; - this.listViewFixes.Location = new System.Drawing.Point(6, 23); - this.listViewFixes.Name = "listViewFixes"; - this.listViewFixes.Size = new System.Drawing.Size(738, 171); - this.listViewFixes.TabIndex = 0; - this.listViewFixes.UseCompatibleStateImageBehavior = false; - this.listViewFixes.View = System.Windows.Forms.View.Details; - this.listViewFixes.SelectedIndexChanged += new System.EventHandler(this.listViewFixes_SelectedIndexChanged); - // - // columnHeader4 - // - this.columnHeader4.Text = "Apply"; - this.columnHeader4.Width = 45; - // - // columnHeader5 - // - this.columnHeader5.Text = "Line#"; - this.columnHeader5.Width = 122; - // - // columnHeader7 - // - this.columnHeader7.Text = "New text"; - this.columnHeader7.Width = 500; - // - // numericUpDownSingleLineMaxCharacters - // - this.numericUpDownSingleLineMaxCharacters.Location = new System.Drawing.Point(28, 33); - this.numericUpDownSingleLineMaxCharacters.Maximum = new decimal(new int[] { - 200, - 0, - 0, - 0}); - this.numericUpDownSingleLineMaxCharacters.Minimum = new decimal(new int[] { - 10, - 0, - 0, - 0}); - this.numericUpDownSingleLineMaxCharacters.Name = "numericUpDownSingleLineMaxCharacters"; - this.numericUpDownSingleLineMaxCharacters.Size = new System.Drawing.Size(64, 20); - this.numericUpDownSingleLineMaxCharacters.TabIndex = 0; - this.numericUpDownSingleLineMaxCharacters.Value = new decimal(new int[] { - 50, - 0, - 0, - 0}); - this.numericUpDownSingleLineMaxCharacters.ValueChanged += new System.EventHandler(this.NumericUpDownMaxCharactersValueChanged); - // - // labelLineMaxLength - // - this.labelLineMaxLength.AutoSize = true; - this.labelLineMaxLength.Location = new System.Drawing.Point(240, 16); - this.labelLineMaxLength.Name = "labelLineMaxLength"; - this.labelLineMaxLength.Size = new System.Drawing.Size(105, 13); - this.labelLineMaxLength.TabIndex = 43; - this.labelLineMaxLength.Text = "Line maximum length"; - // - // labelSingleLineMaxLength - // - this.labelSingleLineMaxLength.AutoSize = true; - this.labelSingleLineMaxLength.Location = new System.Drawing.Point(25, 16); - this.labelSingleLineMaxLength.Name = "labelSingleLineMaxLength"; - this.labelSingleLineMaxLength.Size = new System.Drawing.Size(133, 13); - this.labelSingleLineMaxLength.TabIndex = 42; - this.labelSingleLineMaxLength.Text = "Single line maximum length"; - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(606, 581); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 6; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(687, 581); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 7; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // numericUpDownLineMaxCharacters - // - this.numericUpDownLineMaxCharacters.Location = new System.Drawing.Point(243, 33); - this.numericUpDownLineMaxCharacters.Maximum = new decimal(new int[] { - 200, - 0, - 0, - 0}); - this.numericUpDownLineMaxCharacters.Minimum = new decimal(new int[] { - 10, - 0, - 0, - 0}); - this.numericUpDownLineMaxCharacters.Name = "numericUpDownLineMaxCharacters"; - this.numericUpDownLineMaxCharacters.Size = new System.Drawing.Size(64, 20); - this.numericUpDownLineMaxCharacters.TabIndex = 1; - this.numericUpDownLineMaxCharacters.Value = new decimal(new int[] { - 90, - 0, - 0, - 0}); - this.numericUpDownLineMaxCharacters.ValueChanged += new System.EventHandler(this.NumericUpDownMaxCharactersValueChanged); - // - // labelMaxSingleLineLengthIs - // - this.labelMaxSingleLineLengthIs.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelMaxSingleLineLengthIs.AutoSize = true; - this.labelMaxSingleLineLengthIs.Cursor = System.Windows.Forms.Cursors.Hand; - this.labelMaxSingleLineLengthIs.Location = new System.Drawing.Point(9, 579); - this.labelMaxSingleLineLengthIs.Name = "labelMaxSingleLineLengthIs"; - this.labelMaxSingleLineLengthIs.Size = new System.Drawing.Size(133, 13); - this.labelMaxSingleLineLengthIs.TabIndex = 45; - this.labelMaxSingleLineLengthIs.Text = "Single line maximum length"; - this.labelMaxSingleLineLengthIs.Click += new System.EventHandler(this.labelMaxSingleLineLengthIs_Click); - // - // labelMaxLineLengthIs - // - this.labelMaxLineLengthIs.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelMaxLineLengthIs.AutoSize = true; - this.labelMaxLineLengthIs.Cursor = System.Windows.Forms.Cursors.Hand; - this.labelMaxLineLengthIs.Location = new System.Drawing.Point(9, 597); - this.labelMaxLineLengthIs.Name = "labelMaxLineLengthIs"; - this.labelMaxLineLengthIs.Size = new System.Drawing.Size(83, 13); - this.labelMaxLineLengthIs.TabIndex = 46; - this.labelMaxLineLengthIs.Text = "Maximum length"; - this.labelMaxLineLengthIs.Click += new System.EventHandler(this.labelMaxLineLengthIs_Click); - // - // comboBoxLineContinuationBegin - // - this.comboBoxLineContinuationBegin.FormattingEnabled = true; - this.comboBoxLineContinuationBegin.Items.AddRange(new object[] { - "", - "- ", - "..."}); - this.comboBoxLineContinuationBegin.Location = new System.Drawing.Point(478, 33); - this.comboBoxLineContinuationBegin.Name = "comboBoxLineContinuationBegin"; - this.comboBoxLineContinuationBegin.Size = new System.Drawing.Size(80, 21); - this.comboBoxLineContinuationBegin.TabIndex = 2; - this.comboBoxLineContinuationBegin.SelectedIndexChanged += new System.EventHandler(this.ContinuationBeginEndChanged); - // - // labelLineContinuationBeginEnd - // - this.labelLineContinuationBeginEnd.AutoSize = true; - this.labelLineContinuationBeginEnd.Location = new System.Drawing.Point(475, 16); - this.labelLineContinuationBeginEnd.Name = "labelLineContinuationBeginEnd"; - this.labelLineContinuationBeginEnd.Size = new System.Drawing.Size(173, 13); - this.labelLineContinuationBeginEnd.TabIndex = 48; - this.labelLineContinuationBeginEnd.Text = "Line continuation begin/end strings"; - // - // comboBoxLineContinuationEnd - // - this.comboBoxLineContinuationEnd.FormattingEnabled = true; - this.comboBoxLineContinuationEnd.Items.AddRange(new object[] { - "", - " -", - "..."}); - this.comboBoxLineContinuationEnd.Location = new System.Drawing.Point(564, 33); - this.comboBoxLineContinuationEnd.Name = "comboBoxLineContinuationEnd"; - this.comboBoxLineContinuationEnd.Size = new System.Drawing.Size(80, 21); - this.comboBoxLineContinuationEnd.TabIndex = 3; - this.comboBoxLineContinuationEnd.SelectedIndexChanged += new System.EventHandler(this.ContinuationBeginEndChanged); - // - // SubtitleListview1 - // - this.SubtitleListview1.AllowColumnReorder = true; - this.SubtitleListview1.AllowDrop = true; - this.SubtitleListview1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.SubtitleListview1.FirstVisibleIndex = -1; - this.SubtitleListview1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.SubtitleListview1.FullRowSelect = true; - this.SubtitleListview1.GridLines = true; - this.SubtitleListview1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; - this.SubtitleListview1.HideSelection = false; - this.SubtitleListview1.Location = new System.Drawing.Point(12, 270); - this.SubtitleListview1.Name = "SubtitleListview1"; - this.SubtitleListview1.OwnerDraw = true; - this.SubtitleListview1.Size = new System.Drawing.Size(750, 301); - this.SubtitleListview1.SubtitleFontBold = false; - this.SubtitleListview1.SubtitleFontName = "Tahoma"; - this.SubtitleListview1.SubtitleFontSize = 8; - this.SubtitleListview1.TabIndex = 5; - this.SubtitleListview1.UseCompatibleStateImageBehavior = false; - this.SubtitleListview1.UseSyntaxColoring = true; - this.SubtitleListview1.View = System.Windows.Forms.View.Details; - // - // contextMenuStrip1 - // - this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripMenuItemSelectAll, - this.toolStripMenuItemInverseSelection}); - this.contextMenuStrip1.Name = "contextMenuStrip1"; - this.contextMenuStrip1.Size = new System.Drawing.Size(181, 70); - // - // toolStripMenuItemSelectAll - // - this.toolStripMenuItemSelectAll.Name = "toolStripMenuItemSelectAll"; - this.toolStripMenuItemSelectAll.Size = new System.Drawing.Size(180, 22); - this.toolStripMenuItemSelectAll.Text = "Select all"; - this.toolStripMenuItemSelectAll.Click += new System.EventHandler(this.toolStripMenuItemSelectAll_Click); - // - // toolStripMenuItemInverseSelection - // - this.toolStripMenuItemInverseSelection.Name = "toolStripMenuItemInverseSelection"; - this.toolStripMenuItemInverseSelection.Size = new System.Drawing.Size(180, 22); - this.toolStripMenuItemInverseSelection.Text = "Inverse selection"; - this.toolStripMenuItemInverseSelection.Click += new System.EventHandler(this.toolStripMenuItemInverseSelection_Click); - // - // SplitLongLines - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(774, 614); - this.Controls.Add(this.comboBoxLineContinuationEnd); - this.Controls.Add(this.labelLineContinuationBeginEnd); - this.Controls.Add(this.comboBoxLineContinuationBegin); - this.Controls.Add(this.labelMaxLineLengthIs); - this.Controls.Add(this.labelMaxSingleLineLengthIs); - this.Controls.Add(this.numericUpDownLineMaxCharacters); - this.Controls.Add(this.groupBoxLinesFound); - this.Controls.Add(this.numericUpDownSingleLineMaxCharacters); - this.Controls.Add(this.labelLineMaxLength); - this.Controls.Add(this.labelSingleLineMaxLength); - this.Controls.Add(this.SubtitleListview1); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.buttonCancel); - this.KeyPreview = true; - this.MinimumSize = new System.Drawing.Size(780, 500); - this.Name = "SplitLongLines"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Split long lines"; - this.Shown += new System.EventHandler(this.SplitLongLines_Shown); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.SplitLongLines_KeyDown); - this.groupBoxLinesFound.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSingleLineMaxCharacters)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownLineMaxCharacters)).EndInit(); - this.contextMenuStrip1.ResumeLayout(false); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.GroupBox groupBoxLinesFound; - private System.Windows.Forms.ListView listViewFixes; - private System.Windows.Forms.ColumnHeader columnHeader4; - private System.Windows.Forms.ColumnHeader columnHeader5; - private System.Windows.Forms.ColumnHeader columnHeader7; - private System.Windows.Forms.NumericUpDown numericUpDownSingleLineMaxCharacters; - private System.Windows.Forms.Label labelLineMaxLength; - private System.Windows.Forms.Label labelSingleLineMaxLength; - private Controls.SubtitleListView SubtitleListview1; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.NumericUpDown numericUpDownLineMaxCharacters; - private System.Windows.Forms.Label labelMaxSingleLineLengthIs; - private System.Windows.Forms.Label labelMaxLineLengthIs; - private System.Windows.Forms.ComboBox comboBoxLineContinuationBegin; - private System.Windows.Forms.Label labelLineContinuationBeginEnd; - private System.Windows.Forms.ComboBox comboBoxLineContinuationEnd; - private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSelectAll; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInverseSelection; - } +namespace Nikse.SubtitleEdit.Forms +{ + partial class SplitLongLines + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.groupBoxLinesFound = new System.Windows.Forms.GroupBox(); + this.listViewFixes = new System.Windows.Forms.ListView(); + this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader7 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.numericUpDownSingleLineMaxCharacters = new System.Windows.Forms.NumericUpDown(); + this.labelLineMaxLength = new System.Windows.Forms.Label(); + this.labelSingleLineMaxLength = new System.Windows.Forms.Label(); + this.buttonOK = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.numericUpDownLineMaxCharacters = new System.Windows.Forms.NumericUpDown(); + this.labelMaxSingleLineLengthIs = new System.Windows.Forms.Label(); + this.labelMaxLineLengthIs = new System.Windows.Forms.Label(); + this.comboBoxLineContinuationBegin = new System.Windows.Forms.ComboBox(); + this.labelLineContinuationBeginEnd = new System.Windows.Forms.Label(); + this.comboBoxLineContinuationEnd = new System.Windows.Forms.ComboBox(); + this.SubtitleListview1 = new Nikse.SubtitleEdit.Controls.SubtitleListView(); + this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItemSelectAll = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemInverseSelection = new System.Windows.Forms.ToolStripMenuItem(); + this.groupBoxLinesFound.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSingleLineMaxCharacters)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownLineMaxCharacters)).BeginInit(); + this.contextMenuStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // groupBoxLinesFound + // + this.groupBoxLinesFound.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxLinesFound.Controls.Add(this.listViewFixes); + this.groupBoxLinesFound.Location = new System.Drawing.Point(12, 64); + this.groupBoxLinesFound.Name = "groupBoxLinesFound"; + this.groupBoxLinesFound.Size = new System.Drawing.Size(750, 200); + this.groupBoxLinesFound.TabIndex = 4; + this.groupBoxLinesFound.TabStop = false; + this.groupBoxLinesFound.Text = "Lines that will be split"; + // + // listViewFixes + // + this.listViewFixes.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listViewFixes.CheckBoxes = true; + this.listViewFixes.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader4, + this.columnHeader5, + this.columnHeader7}); + this.listViewFixes.ContextMenuStrip = this.contextMenuStrip1; + this.listViewFixes.FullRowSelect = true; + this.listViewFixes.HideSelection = false; + this.listViewFixes.Location = new System.Drawing.Point(6, 23); + this.listViewFixes.Name = "listViewFixes"; + this.listViewFixes.Size = new System.Drawing.Size(738, 171); + this.listViewFixes.TabIndex = 0; + this.listViewFixes.UseCompatibleStateImageBehavior = false; + this.listViewFixes.View = System.Windows.Forms.View.Details; + this.listViewFixes.SelectedIndexChanged += new System.EventHandler(this.listViewFixes_SelectedIndexChanged); + // + // columnHeader4 + // + this.columnHeader4.Text = "Apply"; + this.columnHeader4.Width = 45; + // + // columnHeader5 + // + this.columnHeader5.Text = "Line#"; + this.columnHeader5.Width = 122; + // + // columnHeader7 + // + this.columnHeader7.Text = "New text"; + this.columnHeader7.Width = 500; + // + // numericUpDownSingleLineMaxCharacters + // + this.numericUpDownSingleLineMaxCharacters.Location = new System.Drawing.Point(28, 33); + this.numericUpDownSingleLineMaxCharacters.Maximum = new decimal(new int[] { + 200, + 0, + 0, + 0}); + this.numericUpDownSingleLineMaxCharacters.Minimum = new decimal(new int[] { + 10, + 0, + 0, + 0}); + this.numericUpDownSingleLineMaxCharacters.Name = "numericUpDownSingleLineMaxCharacters"; + this.numericUpDownSingleLineMaxCharacters.Size = new System.Drawing.Size(64, 20); + this.numericUpDownSingleLineMaxCharacters.TabIndex = 0; + this.numericUpDownSingleLineMaxCharacters.Value = new decimal(new int[] { + 50, + 0, + 0, + 0}); + this.numericUpDownSingleLineMaxCharacters.ValueChanged += new System.EventHandler(this.NumericUpDownMaxCharactersValueChanged); + // + // labelLineMaxLength + // + this.labelLineMaxLength.AutoSize = true; + this.labelLineMaxLength.Location = new System.Drawing.Point(240, 16); + this.labelLineMaxLength.Name = "labelLineMaxLength"; + this.labelLineMaxLength.Size = new System.Drawing.Size(105, 13); + this.labelLineMaxLength.TabIndex = 43; + this.labelLineMaxLength.Text = "Line maximum length"; + // + // labelSingleLineMaxLength + // + this.labelSingleLineMaxLength.AutoSize = true; + this.labelSingleLineMaxLength.Location = new System.Drawing.Point(25, 16); + this.labelSingleLineMaxLength.Name = "labelSingleLineMaxLength"; + this.labelSingleLineMaxLength.Size = new System.Drawing.Size(133, 13); + this.labelSingleLineMaxLength.TabIndex = 42; + this.labelSingleLineMaxLength.Text = "Single line maximum length"; + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(606, 581); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 6; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(687, 581); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 7; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // numericUpDownLineMaxCharacters + // + this.numericUpDownLineMaxCharacters.Location = new System.Drawing.Point(243, 33); + this.numericUpDownLineMaxCharacters.Maximum = new decimal(new int[] { + 200, + 0, + 0, + 0}); + this.numericUpDownLineMaxCharacters.Minimum = new decimal(new int[] { + 10, + 0, + 0, + 0}); + this.numericUpDownLineMaxCharacters.Name = "numericUpDownLineMaxCharacters"; + this.numericUpDownLineMaxCharacters.Size = new System.Drawing.Size(64, 20); + this.numericUpDownLineMaxCharacters.TabIndex = 1; + this.numericUpDownLineMaxCharacters.Value = new decimal(new int[] { + 90, + 0, + 0, + 0}); + this.numericUpDownLineMaxCharacters.ValueChanged += new System.EventHandler(this.NumericUpDownMaxCharactersValueChanged); + // + // labelMaxSingleLineLengthIs + // + this.labelMaxSingleLineLengthIs.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelMaxSingleLineLengthIs.AutoSize = true; + this.labelMaxSingleLineLengthIs.Cursor = System.Windows.Forms.Cursors.Hand; + this.labelMaxSingleLineLengthIs.Location = new System.Drawing.Point(9, 579); + this.labelMaxSingleLineLengthIs.Name = "labelMaxSingleLineLengthIs"; + this.labelMaxSingleLineLengthIs.Size = new System.Drawing.Size(133, 13); + this.labelMaxSingleLineLengthIs.TabIndex = 45; + this.labelMaxSingleLineLengthIs.Text = "Single line maximum length"; + this.labelMaxSingleLineLengthIs.Click += new System.EventHandler(this.labelMaxSingleLineLengthIs_Click); + // + // labelMaxLineLengthIs + // + this.labelMaxLineLengthIs.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelMaxLineLengthIs.AutoSize = true; + this.labelMaxLineLengthIs.Cursor = System.Windows.Forms.Cursors.Hand; + this.labelMaxLineLengthIs.Location = new System.Drawing.Point(9, 597); + this.labelMaxLineLengthIs.Name = "labelMaxLineLengthIs"; + this.labelMaxLineLengthIs.Size = new System.Drawing.Size(83, 13); + this.labelMaxLineLengthIs.TabIndex = 46; + this.labelMaxLineLengthIs.Text = "Maximum length"; + this.labelMaxLineLengthIs.Click += new System.EventHandler(this.labelMaxLineLengthIs_Click); + // + // comboBoxLineContinuationBegin + // + this.comboBoxLineContinuationBegin.FormattingEnabled = true; + this.comboBoxLineContinuationBegin.Items.AddRange(new object[] { + "", + "- ", + "..."}); + this.comboBoxLineContinuationBegin.Location = new System.Drawing.Point(478, 33); + this.comboBoxLineContinuationBegin.Name = "comboBoxLineContinuationBegin"; + this.comboBoxLineContinuationBegin.Size = new System.Drawing.Size(80, 21); + this.comboBoxLineContinuationBegin.TabIndex = 2; + this.comboBoxLineContinuationBegin.SelectedIndexChanged += new System.EventHandler(this.ContinuationBeginEndChanged); + // + // labelLineContinuationBeginEnd + // + this.labelLineContinuationBeginEnd.AutoSize = true; + this.labelLineContinuationBeginEnd.Location = new System.Drawing.Point(475, 16); + this.labelLineContinuationBeginEnd.Name = "labelLineContinuationBeginEnd"; + this.labelLineContinuationBeginEnd.Size = new System.Drawing.Size(173, 13); + this.labelLineContinuationBeginEnd.TabIndex = 48; + this.labelLineContinuationBeginEnd.Text = "Line continuation begin/end strings"; + // + // comboBoxLineContinuationEnd + // + this.comboBoxLineContinuationEnd.FormattingEnabled = true; + this.comboBoxLineContinuationEnd.Items.AddRange(new object[] { + "", + " -", + "..."}); + this.comboBoxLineContinuationEnd.Location = new System.Drawing.Point(564, 33); + this.comboBoxLineContinuationEnd.Name = "comboBoxLineContinuationEnd"; + this.comboBoxLineContinuationEnd.Size = new System.Drawing.Size(80, 21); + this.comboBoxLineContinuationEnd.TabIndex = 3; + this.comboBoxLineContinuationEnd.SelectedIndexChanged += new System.EventHandler(this.ContinuationBeginEndChanged); + // + // SubtitleListview1 + // + this.SubtitleListview1.AllowColumnReorder = true; + this.SubtitleListview1.AllowDrop = true; + this.SubtitleListview1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.SubtitleListview1.FirstVisibleIndex = -1; + this.SubtitleListview1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.SubtitleListview1.FullRowSelect = true; + this.SubtitleListview1.GridLines = true; + this.SubtitleListview1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.SubtitleListview1.HideSelection = false; + this.SubtitleListview1.Location = new System.Drawing.Point(12, 270); + this.SubtitleListview1.Name = "SubtitleListview1"; + this.SubtitleListview1.OwnerDraw = true; + this.SubtitleListview1.Size = new System.Drawing.Size(750, 301); + this.SubtitleListview1.SubtitleFontBold = false; + this.SubtitleListview1.SubtitleFontName = "Tahoma"; + this.SubtitleListview1.SubtitleFontSize = 8; + this.SubtitleListview1.TabIndex = 5; + this.SubtitleListview1.UseCompatibleStateImageBehavior = false; + this.SubtitleListview1.UseSyntaxColoring = true; + this.SubtitleListview1.View = System.Windows.Forms.View.Details; + // + // contextMenuStrip1 + // + this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItemSelectAll, + this.toolStripMenuItemInverseSelection}); + this.contextMenuStrip1.Name = "contextMenuStrip1"; + this.contextMenuStrip1.Size = new System.Drawing.Size(181, 70); + // + // toolStripMenuItemSelectAll + // + this.toolStripMenuItemSelectAll.Name = "toolStripMenuItemSelectAll"; + this.toolStripMenuItemSelectAll.Size = new System.Drawing.Size(180, 22); + this.toolStripMenuItemSelectAll.Text = "Select all"; + this.toolStripMenuItemSelectAll.Click += new System.EventHandler(this.toolStripMenuItemSelectAll_Click); + // + // toolStripMenuItemInverseSelection + // + this.toolStripMenuItemInverseSelection.Name = "toolStripMenuItemInverseSelection"; + this.toolStripMenuItemInverseSelection.Size = new System.Drawing.Size(180, 22); + this.toolStripMenuItemInverseSelection.Text = "Inverse selection"; + this.toolStripMenuItemInverseSelection.Click += new System.EventHandler(this.toolStripMenuItemInverseSelection_Click); + // + // SplitLongLines + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(774, 614); + this.Controls.Add(this.comboBoxLineContinuationEnd); + this.Controls.Add(this.labelLineContinuationBeginEnd); + this.Controls.Add(this.comboBoxLineContinuationBegin); + this.Controls.Add(this.labelMaxLineLengthIs); + this.Controls.Add(this.labelMaxSingleLineLengthIs); + this.Controls.Add(this.numericUpDownLineMaxCharacters); + this.Controls.Add(this.groupBoxLinesFound); + this.Controls.Add(this.numericUpDownSingleLineMaxCharacters); + this.Controls.Add(this.labelLineMaxLength); + this.Controls.Add(this.labelSingleLineMaxLength); + this.Controls.Add(this.SubtitleListview1); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.buttonCancel); + this.KeyPreview = true; + this.MinimumSize = new System.Drawing.Size(780, 500); + this.Name = "SplitLongLines"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Split long lines"; + this.Shown += new System.EventHandler(this.SplitLongLines_Shown); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.SplitLongLines_KeyDown); + this.groupBoxLinesFound.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSingleLineMaxCharacters)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownLineMaxCharacters)).EndInit(); + this.contextMenuStrip1.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBoxLinesFound; + private System.Windows.Forms.ListView listViewFixes; + private System.Windows.Forms.ColumnHeader columnHeader4; + private System.Windows.Forms.ColumnHeader columnHeader5; + private System.Windows.Forms.ColumnHeader columnHeader7; + private System.Windows.Forms.NumericUpDown numericUpDownSingleLineMaxCharacters; + private System.Windows.Forms.Label labelLineMaxLength; + private System.Windows.Forms.Label labelSingleLineMaxLength; + private Controls.SubtitleListView SubtitleListview1; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.NumericUpDown numericUpDownLineMaxCharacters; + private System.Windows.Forms.Label labelMaxSingleLineLengthIs; + private System.Windows.Forms.Label labelMaxLineLengthIs; + private System.Windows.Forms.ComboBox comboBoxLineContinuationBegin; + private System.Windows.Forms.Label labelLineContinuationBeginEnd; + private System.Windows.Forms.ComboBox comboBoxLineContinuationEnd; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSelectAll; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemInverseSelection; + } } \ No newline at end of file diff --git a/src/Forms/SplitLongLines.cs b/src/ui/Forms/SplitLongLines.cs similarity index 97% rename from src/Forms/SplitLongLines.cs rename to src/ui/Forms/SplitLongLines.cs index 5f43064c6..b3834579a 100644 --- a/src/Forms/SplitLongLines.cs +++ b/src/ui/Forms/SplitLongLines.cs @@ -1,424 +1,424 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.Forms; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Globalization; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class SplitLongLines : PositionAndSizeForm - { - private Subtitle _subtitle; - - public int NumberOfSplits { get; private set; } - - public Subtitle SplitSubtitle { get; private set; } - - public SplitLongLines() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - UiUtil.FixLargeFonts(this, buttonOK); - } - - private void SplitLongLines_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - public void Initialize(Subtitle subtitle) - { - if (subtitle.Paragraphs.Count > 0) - { - subtitle.Renumber(subtitle.Paragraphs[0].Number); - } - - Text = Configuration.Settings.Language.SplitLongLines.Title; - labelSingleLineMaxLength.Text = Configuration.Settings.Language.SplitLongLines.SingleLineMaximumLength; - labelLineMaxLength.Text = Configuration.Settings.Language.SplitLongLines.LineMaximumLength; - labelLineContinuationBeginEnd.Text = Configuration.Settings.Language.SplitLongLines.LineContinuationBeginEndStrings; - - listViewFixes.Columns[0].Text = Configuration.Settings.Language.General.Apply; - listViewFixes.Columns[1].Text = Configuration.Settings.Language.General.LineNumber; - listViewFixes.Columns[2].Text = Configuration.Settings.Language.General.Text; - - var continuationProfile = ContinuationUtilities.GetContinuationProfile(Configuration.Settings.General.ContinuationStyle); - comboBoxLineContinuationBegin.Text = continuationProfile.Prefix; - comboBoxLineContinuationEnd.Text = continuationProfile.Suffix; - - toolStripMenuItemInverseSelection.Text = Configuration.Settings.Language.Main.Menu.Edit.InverseSelection; - toolStripMenuItemSelectAll.Text = Configuration.Settings.Language.Main.Menu.ContextMenu.SelectAll; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - SubtitleListview1.InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings); - UiUtil.InitializeSubtitleFont(SubtitleListview1); - SubtitleListview1.AutoSizeAllColumns(this); - NumberOfSplits = 0; - numericUpDownSingleLineMaxCharacters.Value = Configuration.Settings.General.SubtitleLineMaximumLength; - _subtitle = subtitle; - } - - private void AddToListView(Paragraph p, string lineNumbers, string newText) - { - var item = new ListViewItem(string.Empty) { Tag = p, Checked = true }; - item.SubItems.Add(lineNumbers); - item.SubItems.Add(UiUtil.GetListViewTextFromString(newText)); - listViewFixes.Items.Add(item); - } - - private void listViewFixes_ItemChecked(object sender, ItemCheckedEventArgs e) - { - GeneratePreview(false); - } - - private void GeneratePreview(bool clearFixes) - { - if (_subtitle == null) - { - return; - } - - var splitIndexes = new List(); - var autoBreakIndexes = new List(); - - NumberOfSplits = 0; - SubtitleListview1.Items.Clear(); - SubtitleListview1.BeginUpdate(); - SplitSubtitle = SplitLongLinesInSubtitle(_subtitle, splitIndexes, autoBreakIndexes, out var count, (int)numericUpDownLineMaxCharacters.Value, (int)numericUpDownSingleLineMaxCharacters.Value, clearFixes); - NumberOfSplits = count; - - SubtitleListview1.Fill(SplitSubtitle); - - foreach (var index in splitIndexes) - { - SubtitleListview1.SetBackgroundColor(index, Color.Green); - } - - foreach (var index in autoBreakIndexes) - { - SubtitleListview1.SetBackgroundColor(index, Color.LightGreen); - } - - SubtitleListview1.EndUpdate(); - groupBoxLinesFound.Text = string.Format(Configuration.Settings.Language.SplitLongLines.NumberOfSplits, NumberOfSplits); - UpdateLongestLinesInfo(SplitSubtitle); - } - - private void UpdateLongestLinesInfo(Subtitle subtitle) - { - int maxLength = -1; - int maxLengthIndex = -1; - int singleLineMaxLength = -1; - int singleLineMaxLengthIndex = -1; - int i = 0; - foreach (var p in subtitle.Paragraphs) - { - string s = HtmlUtil.RemoveHtmlTags(p.Text, true); - if (s.Length > maxLength) - { - maxLength = s.Length; - maxLengthIndex = i; - } - var arr = s.SplitToLines(); - foreach (string line in arr) - { - if (line.Length > singleLineMaxLengthIndex) - { - singleLineMaxLength = line.Length; - singleLineMaxLengthIndex = i; - } - } - i++; - } - labelMaxSingleLineLengthIs.Text = string.Format(Configuration.Settings.Language.SplitLongLines.LongestSingleLineIsXAtY, singleLineMaxLength, singleLineMaxLengthIndex + 1); - labelMaxSingleLineLengthIs.Tag = singleLineMaxLengthIndex.ToString(CultureInfo.InvariantCulture); - labelMaxLineLengthIs.Text = string.Format(Configuration.Settings.Language.SplitLongLines.LongestLineIsXAtY, maxLength, maxLengthIndex + 1); - labelMaxLineLengthIs.Tag = maxLengthIndex.ToString(CultureInfo.InvariantCulture); - } - - private bool IsFixAllowed(Paragraph p) - { - foreach (ListViewItem item in listViewFixes.Items) - { - if (item.Tag as Paragraph == p) - { - return item.Checked; - } - } - return true; - } - - public Subtitle SplitLongLinesInSubtitle(Subtitle subtitle, List splitIndexes, List autoBreakIndexes, out int numberOfSplits, int totalLineMaxCharacters, int singleLineMaxCharacters, bool clearFixes) - { - listViewFixes.ItemChecked -= listViewFixes_ItemChecked; - if (clearFixes) - { - listViewFixes.Items.Clear(); - } - - numberOfSplits = 0; - string language = LanguageAutoDetect.AutoDetectGoogleLanguage(subtitle); - var splitSubtitle = new Subtitle(); - string[] expectedPunctuations = { ". -", "! -", "? -" }; - for (int i = 0; i < subtitle.Paragraphs.Count; i++) - { - bool added = false; - var p = subtitle.Paragraphs[i]; - if (p?.Text != null) - { - if (SplitLongLinesHelper.QualifiesForSplit(p.Text, singleLineMaxCharacters, totalLineMaxCharacters) && IsFixAllowed(p)) - { - string oldText = HtmlUtil.RemoveHtmlTags(p.Text); - bool isDialog = false; - string dialogText = string.Empty; - if (p.Text.Contains('-')) - { - dialogText = Utilities.AutoBreakLine(p.Text, 5, 1, language); - - var tempText = p.Text.Replace(Environment.NewLine, " ").Replace(" ", " "); - if (Utilities.CountTagInText(tempText, '-') == 2 && (p.Text.StartsWith('-') || p.Text.StartsWith("-", StringComparison.Ordinal))) - { - int idx = tempText.IndexOfAny(expectedPunctuations, StringComparison.Ordinal); - if (idx > 1) - { - dialogText = tempText.Remove(idx + 1, 1).Insert(idx + 1, Environment.NewLine); - } - } - - var dialogHelper = new DialogSplitMerge(); - if (dialogHelper.IsDialog(dialogText.SplitToLines())) - { - isDialog = true; - } - } - - if (!isDialog && !SplitLongLinesHelper.QualifiesForSplit(Utilities.AutoBreakLine(p.Text, language), singleLineMaxCharacters, totalLineMaxCharacters)) - { - var newParagraph = new Paragraph(p) { Text = Utilities.AutoBreakLine(p.Text, language) }; - if (clearFixes) - { - AddToListView(p, (splitSubtitle.Paragraphs.Count + 1).ToString(CultureInfo.InvariantCulture), oldText); - } - - autoBreakIndexes.Add(splitSubtitle.Paragraphs.Count); - splitSubtitle.Paragraphs.Add(newParagraph); - added = true; - numberOfSplits++; - } - else - { - string text = Utilities.AutoBreakLine(p.Text, language); - if (isDialog) - { - text = dialogText; - } - - if (isDialog || text.Contains(Environment.NewLine)) - { - var arr = text.SplitToLines(); - if (arr.Count == 2) - { - int spacing1 = Configuration.Settings.General.MinimumMillisecondsBetweenLines / 2; - int spacing2 = Configuration.Settings.General.MinimumMillisecondsBetweenLines / 2; - if (Configuration.Settings.General.MinimumMillisecondsBetweenLines % 2 == 1) - { - spacing2++; - } - - var newParagraph1 = new Paragraph(p); - var newParagraph2 = new Paragraph(p); - newParagraph1.Text = Utilities.AutoBreakLine(arr[0], language); - - double middle = p.StartTime.TotalMilliseconds + p.Duration.TotalMilliseconds / 2; - if (!string.IsNullOrWhiteSpace(oldText)) - { - var startFactor = (double)HtmlUtil.RemoveHtmlTags(newParagraph1.Text).Length / oldText.Length; - if (startFactor < 0.25) - { - startFactor = 0.25; - } - - if (startFactor > 0.75) - { - startFactor = 0.75; - } - - middle = p.StartTime.TotalMilliseconds + p.Duration.TotalMilliseconds * startFactor; - } - - newParagraph1.EndTime.TotalMilliseconds = middle - spacing1; - newParagraph2.Text = Utilities.AutoBreakLine(arr[1], language); - newParagraph2.StartTime.TotalMilliseconds = newParagraph1.EndTime.TotalMilliseconds + spacing2; - - if (Configuration.Settings.General.SplitRemovesDashes && isDialog) - { - newParagraph1.Text = DialogSplitMerge.RemoveStartDash(newParagraph1.Text); - newParagraph2.Text = DialogSplitMerge.RemoveStartDash(newParagraph2.Text); - } - - if (clearFixes) - { - AddToListView(p, (splitSubtitle.Paragraphs.Count + 1).ToString(CultureInfo.InvariantCulture), oldText); - } - - splitIndexes.Add(splitSubtitle.Paragraphs.Count); - splitIndexes.Add(splitSubtitle.Paragraphs.Count + 1); - - string p1 = HtmlUtil.RemoveHtmlTags(newParagraph1.Text).TrimEnd(); - if (!p1.EndsWith('.') && !p1.EndsWith('!') && !p1.EndsWith('?') && !p1.EndsWith(':') && !p1.EndsWith(')') && !p1.EndsWith(']') && !p1.EndsWith('♪')) - { - bool endsWithComma = newParagraph1.Text.EndsWith(',') || newParagraph1.Text.EndsWith(",", StringComparison.Ordinal); - - string post = string.Empty; - if (newParagraph1.Text.EndsWith("", StringComparison.Ordinal)) - { - post = ""; - newParagraph1.Text = newParagraph1.Text.Remove(newParagraph1.Text.Length - post.Length); - } - - if (endsWithComma) - { - newParagraph1.Text += post; - } - else - { - newParagraph1.Text += comboBoxLineContinuationEnd.Text.TrimEnd() + post; - } - - string pre = string.Empty; - if (newParagraph2.Text.StartsWith("", StringComparison.Ordinal)) - { - pre = ""; - newParagraph2.Text = newParagraph2.Text.Remove(0, pre.Length); - } - - if (endsWithComma) - { - newParagraph2.Text = pre + newParagraph2.Text; - } - else - { - newParagraph2.Text = pre + comboBoxLineContinuationBegin.Text + newParagraph2.Text; - } - } - - var italicStart1 = newParagraph1.Text.IndexOf("", StringComparison.Ordinal); - if (italicStart1 >= 0 && italicStart1 < 10 && newParagraph1.Text.IndexOf("", StringComparison.Ordinal) < 0 && - newParagraph2.Text.Contains("") && newParagraph2.Text.IndexOf("", StringComparison.Ordinal) < 0) - { - newParagraph1.Text += ""; - newParagraph2.Text = "" + newParagraph2.Text; - } - - splitSubtitle.Paragraphs.Add(newParagraph1); - splitSubtitle.Paragraphs.Add(newParagraph2); - added = true; - numberOfSplits++; - } - } - } - } - if (!added) - { - splitSubtitle.Paragraphs.Add(new Paragraph(p)); - } - } - } - listViewFixes.ItemChecked += listViewFixes_ItemChecked; - splitSubtitle.Renumber(); - return splitSubtitle; - } - - private void NumericUpDownMaxCharactersValueChanged(object sender, EventArgs e) - { - Cursor = Cursors.WaitCursor; - GeneratePreview(true); - Cursor = Cursors.Default; - } - - private void listViewFixes_SelectedIndexChanged(object sender, EventArgs e) - { - if (listViewFixes.SelectedIndices.Count > 0) - { - int index = listViewFixes.SelectedIndices[0]; - ListViewItem item = listViewFixes.Items[index]; - index = int.Parse(item.SubItems[1].Text) - 1; - SubtitleListview1.SelectIndexAndEnsureVisible(index); - } - } - - private void SplitLongLines_Shown(object sender, EventArgs e) - { - GeneratePreview(true); - listViewFixes.Focus(); - if (listViewFixes.Items.Count > 0) - { - listViewFixes.Items[0].Selected = true; - } - } - - private void buttonOK_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.OK; - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private void labelMaxSingleLineLengthIs_Click(object sender, EventArgs e) - { - int index = int.Parse(labelMaxSingleLineLengthIs.Tag.ToString()); - SubtitleListview1.SelectIndexAndEnsureVisible(index); - } - - private void labelMaxLineLengthIs_Click(object sender, EventArgs e) - { - int index = int.Parse(labelMaxLineLengthIs.Tag.ToString()); - SubtitleListview1.SelectIndexAndEnsureVisible(index); - } - - private void ContinuationBeginEndChanged(object sender, EventArgs e) - { - Cursor = Cursors.WaitCursor; - if (listViewFixes.SelectedItems.Count > 0) - { - var index = listViewFixes.SelectedItems[0].Index; - listViewFixes.Items[index].Selected = true; - } - GeneratePreview(true); - Cursor = Cursors.Default; - } - - private void toolStripMenuItemSelectAll_Click(object sender, EventArgs e) - { - listViewFixes.ItemChecked -= listViewFixes_ItemChecked; - foreach (ListViewItem item in listViewFixes.Items) - { - item.Checked = true; - } - listViewFixes.ItemChecked += listViewFixes_ItemChecked; - GeneratePreview(false); - } - - private void toolStripMenuItemInverseSelection_Click(object sender, EventArgs e) - { - listViewFixes.ItemChecked -= listViewFixes_ItemChecked; - foreach (ListViewItem item in listViewFixes.Items) - { - item.Checked = !item.Checked; - } - listViewFixes.ItemChecked += listViewFixes_ItemChecked; - GeneratePreview(false); - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.Forms; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Globalization; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class SplitLongLines : PositionAndSizeForm + { + private Subtitle _subtitle; + + public int NumberOfSplits { get; private set; } + + public Subtitle SplitSubtitle { get; private set; } + + public SplitLongLines() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + UiUtil.FixLargeFonts(this, buttonOK); + } + + private void SplitLongLines_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + public void Initialize(Subtitle subtitle) + { + if (subtitle.Paragraphs.Count > 0) + { + subtitle.Renumber(subtitle.Paragraphs[0].Number); + } + + Text = Configuration.Settings.Language.SplitLongLines.Title; + labelSingleLineMaxLength.Text = Configuration.Settings.Language.SplitLongLines.SingleLineMaximumLength; + labelLineMaxLength.Text = Configuration.Settings.Language.SplitLongLines.LineMaximumLength; + labelLineContinuationBeginEnd.Text = Configuration.Settings.Language.SplitLongLines.LineContinuationBeginEndStrings; + + listViewFixes.Columns[0].Text = Configuration.Settings.Language.General.Apply; + listViewFixes.Columns[1].Text = Configuration.Settings.Language.General.LineNumber; + listViewFixes.Columns[2].Text = Configuration.Settings.Language.General.Text; + + var continuationProfile = ContinuationUtilities.GetContinuationProfile(Configuration.Settings.General.ContinuationStyle); + comboBoxLineContinuationBegin.Text = continuationProfile.Prefix; + comboBoxLineContinuationEnd.Text = continuationProfile.Suffix; + + toolStripMenuItemInverseSelection.Text = Configuration.Settings.Language.Main.Menu.Edit.InverseSelection; + toolStripMenuItemSelectAll.Text = Configuration.Settings.Language.Main.Menu.ContextMenu.SelectAll; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + SubtitleListview1.InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings); + UiUtil.InitializeSubtitleFont(SubtitleListview1); + SubtitleListview1.AutoSizeAllColumns(this); + NumberOfSplits = 0; + numericUpDownSingleLineMaxCharacters.Value = Configuration.Settings.General.SubtitleLineMaximumLength; + _subtitle = subtitle; + } + + private void AddToListView(Paragraph p, string lineNumbers, string newText) + { + var item = new ListViewItem(string.Empty) { Tag = p, Checked = true }; + item.SubItems.Add(lineNumbers); + item.SubItems.Add(UiUtil.GetListViewTextFromString(newText)); + listViewFixes.Items.Add(item); + } + + private void listViewFixes_ItemChecked(object sender, ItemCheckedEventArgs e) + { + GeneratePreview(false); + } + + private void GeneratePreview(bool clearFixes) + { + if (_subtitle == null) + { + return; + } + + var splitIndexes = new List(); + var autoBreakIndexes = new List(); + + NumberOfSplits = 0; + SubtitleListview1.Items.Clear(); + SubtitleListview1.BeginUpdate(); + SplitSubtitle = SplitLongLinesInSubtitle(_subtitle, splitIndexes, autoBreakIndexes, out var count, (int)numericUpDownLineMaxCharacters.Value, (int)numericUpDownSingleLineMaxCharacters.Value, clearFixes); + NumberOfSplits = count; + + SubtitleListview1.Fill(SplitSubtitle); + + foreach (var index in splitIndexes) + { + SubtitleListview1.SetBackgroundColor(index, Color.Green); + } + + foreach (var index in autoBreakIndexes) + { + SubtitleListview1.SetBackgroundColor(index, Color.LightGreen); + } + + SubtitleListview1.EndUpdate(); + groupBoxLinesFound.Text = string.Format(Configuration.Settings.Language.SplitLongLines.NumberOfSplits, NumberOfSplits); + UpdateLongestLinesInfo(SplitSubtitle); + } + + private void UpdateLongestLinesInfo(Subtitle subtitle) + { + int maxLength = -1; + int maxLengthIndex = -1; + int singleLineMaxLength = -1; + int singleLineMaxLengthIndex = -1; + int i = 0; + foreach (var p in subtitle.Paragraphs) + { + string s = HtmlUtil.RemoveHtmlTags(p.Text, true); + if (s.Length > maxLength) + { + maxLength = s.Length; + maxLengthIndex = i; + } + var arr = s.SplitToLines(); + foreach (string line in arr) + { + if (line.Length > singleLineMaxLengthIndex) + { + singleLineMaxLength = line.Length; + singleLineMaxLengthIndex = i; + } + } + i++; + } + labelMaxSingleLineLengthIs.Text = string.Format(Configuration.Settings.Language.SplitLongLines.LongestSingleLineIsXAtY, singleLineMaxLength, singleLineMaxLengthIndex + 1); + labelMaxSingleLineLengthIs.Tag = singleLineMaxLengthIndex.ToString(CultureInfo.InvariantCulture); + labelMaxLineLengthIs.Text = string.Format(Configuration.Settings.Language.SplitLongLines.LongestLineIsXAtY, maxLength, maxLengthIndex + 1); + labelMaxLineLengthIs.Tag = maxLengthIndex.ToString(CultureInfo.InvariantCulture); + } + + private bool IsFixAllowed(Paragraph p) + { + foreach (ListViewItem item in listViewFixes.Items) + { + if (item.Tag as Paragraph == p) + { + return item.Checked; + } + } + return true; + } + + public Subtitle SplitLongLinesInSubtitle(Subtitle subtitle, List splitIndexes, List autoBreakIndexes, out int numberOfSplits, int totalLineMaxCharacters, int singleLineMaxCharacters, bool clearFixes) + { + listViewFixes.ItemChecked -= listViewFixes_ItemChecked; + if (clearFixes) + { + listViewFixes.Items.Clear(); + } + + numberOfSplits = 0; + string language = LanguageAutoDetect.AutoDetectGoogleLanguage(subtitle); + var splitSubtitle = new Subtitle(); + string[] expectedPunctuations = { ". -", "! -", "? -" }; + for (int i = 0; i < subtitle.Paragraphs.Count; i++) + { + bool added = false; + var p = subtitle.Paragraphs[i]; + if (p?.Text != null) + { + if (SplitLongLinesHelper.QualifiesForSplit(p.Text, singleLineMaxCharacters, totalLineMaxCharacters) && IsFixAllowed(p)) + { + string oldText = HtmlUtil.RemoveHtmlTags(p.Text); + bool isDialog = false; + string dialogText = string.Empty; + if (p.Text.Contains('-')) + { + dialogText = Utilities.AutoBreakLine(p.Text, 5, 1, language); + + var tempText = p.Text.Replace(Environment.NewLine, " ").Replace(" ", " "); + if (Utilities.CountTagInText(tempText, '-') == 2 && (p.Text.StartsWith('-') || p.Text.StartsWith("-", StringComparison.Ordinal))) + { + int idx = tempText.IndexOfAny(expectedPunctuations, StringComparison.Ordinal); + if (idx > 1) + { + dialogText = tempText.Remove(idx + 1, 1).Insert(idx + 1, Environment.NewLine); + } + } + + var dialogHelper = new DialogSplitMerge(); + if (dialogHelper.IsDialog(dialogText.SplitToLines())) + { + isDialog = true; + } + } + + if (!isDialog && !SplitLongLinesHelper.QualifiesForSplit(Utilities.AutoBreakLine(p.Text, language), singleLineMaxCharacters, totalLineMaxCharacters)) + { + var newParagraph = new Paragraph(p) { Text = Utilities.AutoBreakLine(p.Text, language) }; + if (clearFixes) + { + AddToListView(p, (splitSubtitle.Paragraphs.Count + 1).ToString(CultureInfo.InvariantCulture), oldText); + } + + autoBreakIndexes.Add(splitSubtitle.Paragraphs.Count); + splitSubtitle.Paragraphs.Add(newParagraph); + added = true; + numberOfSplits++; + } + else + { + string text = Utilities.AutoBreakLine(p.Text, language); + if (isDialog) + { + text = dialogText; + } + + if (isDialog || text.Contains(Environment.NewLine)) + { + var arr = text.SplitToLines(); + if (arr.Count == 2) + { + int spacing1 = Configuration.Settings.General.MinimumMillisecondsBetweenLines / 2; + int spacing2 = Configuration.Settings.General.MinimumMillisecondsBetweenLines / 2; + if (Configuration.Settings.General.MinimumMillisecondsBetweenLines % 2 == 1) + { + spacing2++; + } + + var newParagraph1 = new Paragraph(p); + var newParagraph2 = new Paragraph(p); + newParagraph1.Text = Utilities.AutoBreakLine(arr[0], language); + + double middle = p.StartTime.TotalMilliseconds + p.Duration.TotalMilliseconds / 2; + if (!string.IsNullOrWhiteSpace(oldText)) + { + var startFactor = (double)HtmlUtil.RemoveHtmlTags(newParagraph1.Text).Length / oldText.Length; + if (startFactor < 0.25) + { + startFactor = 0.25; + } + + if (startFactor > 0.75) + { + startFactor = 0.75; + } + + middle = p.StartTime.TotalMilliseconds + p.Duration.TotalMilliseconds * startFactor; + } + + newParagraph1.EndTime.TotalMilliseconds = middle - spacing1; + newParagraph2.Text = Utilities.AutoBreakLine(arr[1], language); + newParagraph2.StartTime.TotalMilliseconds = newParagraph1.EndTime.TotalMilliseconds + spacing2; + + if (Configuration.Settings.General.SplitRemovesDashes && isDialog) + { + newParagraph1.Text = DialogSplitMerge.RemoveStartDash(newParagraph1.Text); + newParagraph2.Text = DialogSplitMerge.RemoveStartDash(newParagraph2.Text); + } + + if (clearFixes) + { + AddToListView(p, (splitSubtitle.Paragraphs.Count + 1).ToString(CultureInfo.InvariantCulture), oldText); + } + + splitIndexes.Add(splitSubtitle.Paragraphs.Count); + splitIndexes.Add(splitSubtitle.Paragraphs.Count + 1); + + string p1 = HtmlUtil.RemoveHtmlTags(newParagraph1.Text).TrimEnd(); + if (!p1.EndsWith('.') && !p1.EndsWith('!') && !p1.EndsWith('?') && !p1.EndsWith(':') && !p1.EndsWith(')') && !p1.EndsWith(']') && !p1.EndsWith('♪')) + { + bool endsWithComma = newParagraph1.Text.EndsWith(',') || newParagraph1.Text.EndsWith(",", StringComparison.Ordinal); + + string post = string.Empty; + if (newParagraph1.Text.EndsWith("", StringComparison.Ordinal)) + { + post = ""; + newParagraph1.Text = newParagraph1.Text.Remove(newParagraph1.Text.Length - post.Length); + } + + if (endsWithComma) + { + newParagraph1.Text += post; + } + else + { + newParagraph1.Text += comboBoxLineContinuationEnd.Text.TrimEnd() + post; + } + + string pre = string.Empty; + if (newParagraph2.Text.StartsWith("", StringComparison.Ordinal)) + { + pre = ""; + newParagraph2.Text = newParagraph2.Text.Remove(0, pre.Length); + } + + if (endsWithComma) + { + newParagraph2.Text = pre + newParagraph2.Text; + } + else + { + newParagraph2.Text = pre + comboBoxLineContinuationBegin.Text + newParagraph2.Text; + } + } + + var italicStart1 = newParagraph1.Text.IndexOf("", StringComparison.Ordinal); + if (italicStart1 >= 0 && italicStart1 < 10 && newParagraph1.Text.IndexOf("", StringComparison.Ordinal) < 0 && + newParagraph2.Text.Contains("") && newParagraph2.Text.IndexOf("", StringComparison.Ordinal) < 0) + { + newParagraph1.Text += ""; + newParagraph2.Text = "" + newParagraph2.Text; + } + + splitSubtitle.Paragraphs.Add(newParagraph1); + splitSubtitle.Paragraphs.Add(newParagraph2); + added = true; + numberOfSplits++; + } + } + } + } + if (!added) + { + splitSubtitle.Paragraphs.Add(new Paragraph(p)); + } + } + } + listViewFixes.ItemChecked += listViewFixes_ItemChecked; + splitSubtitle.Renumber(); + return splitSubtitle; + } + + private void NumericUpDownMaxCharactersValueChanged(object sender, EventArgs e) + { + Cursor = Cursors.WaitCursor; + GeneratePreview(true); + Cursor = Cursors.Default; + } + + private void listViewFixes_SelectedIndexChanged(object sender, EventArgs e) + { + if (listViewFixes.SelectedIndices.Count > 0) + { + int index = listViewFixes.SelectedIndices[0]; + ListViewItem item = listViewFixes.Items[index]; + index = int.Parse(item.SubItems[1].Text) - 1; + SubtitleListview1.SelectIndexAndEnsureVisible(index); + } + } + + private void SplitLongLines_Shown(object sender, EventArgs e) + { + GeneratePreview(true); + listViewFixes.Focus(); + if (listViewFixes.Items.Count > 0) + { + listViewFixes.Items[0].Selected = true; + } + } + + private void buttonOK_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.OK; + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void labelMaxSingleLineLengthIs_Click(object sender, EventArgs e) + { + int index = int.Parse(labelMaxSingleLineLengthIs.Tag.ToString()); + SubtitleListview1.SelectIndexAndEnsureVisible(index); + } + + private void labelMaxLineLengthIs_Click(object sender, EventArgs e) + { + int index = int.Parse(labelMaxLineLengthIs.Tag.ToString()); + SubtitleListview1.SelectIndexAndEnsureVisible(index); + } + + private void ContinuationBeginEndChanged(object sender, EventArgs e) + { + Cursor = Cursors.WaitCursor; + if (listViewFixes.SelectedItems.Count > 0) + { + var index = listViewFixes.SelectedItems[0].Index; + listViewFixes.Items[index].Selected = true; + } + GeneratePreview(true); + Cursor = Cursors.Default; + } + + private void toolStripMenuItemSelectAll_Click(object sender, EventArgs e) + { + listViewFixes.ItemChecked -= listViewFixes_ItemChecked; + foreach (ListViewItem item in listViewFixes.Items) + { + item.Checked = true; + } + listViewFixes.ItemChecked += listViewFixes_ItemChecked; + GeneratePreview(false); + } + + private void toolStripMenuItemInverseSelection_Click(object sender, EventArgs e) + { + listViewFixes.ItemChecked -= listViewFixes_ItemChecked; + foreach (ListViewItem item in listViewFixes.Items) + { + item.Checked = !item.Checked; + } + listViewFixes.ItemChecked += listViewFixes_ItemChecked; + GeneratePreview(false); + } + } +} diff --git a/src/Forms/SplitLongLines.resx b/src/ui/Forms/SplitLongLines.resx similarity index 97% rename from src/Forms/SplitLongLines.resx rename to src/ui/Forms/SplitLongLines.resx index 661dc1126..ad537526f 100644 --- a/src/Forms/SplitLongLines.resx +++ b/src/ui/Forms/SplitLongLines.resx @@ -1,123 +1,123 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + \ No newline at end of file diff --git a/src/Forms/SplitSubtitle.Designer.cs b/src/ui/Forms/SplitSubtitle.Designer.cs similarity index 97% rename from src/Forms/SplitSubtitle.Designer.cs rename to src/ui/Forms/SplitSubtitle.Designer.cs index a01d6ed37..a88e3454f 100644 --- a/src/Forms/SplitSubtitle.Designer.cs +++ b/src/ui/Forms/SplitSubtitle.Designer.cs @@ -1,181 +1,181 @@ -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class SplitSubtitle - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - TimeCode timeCode1 = new TimeCode(); - this.buttonGetFrameRate = new System.Windows.Forms.Button(); - this.buttonDone = new System.Windows.Forms.Button(); - this.buttonSplit = new System.Windows.Forms.Button(); - this.label1 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); - this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog(); - this.labelHourMinSecMilliSecond = new System.Windows.Forms.Label(); - this.splitTimeUpDownAdjust = new Nikse.SubtitleEdit.Controls.TimeUpDown(); - this.buttonAdvanced = new System.Windows.Forms.Button(); - this.SuspendLayout(); - // - // buttonGetFrameRate - // - this.buttonGetFrameRate.Location = new System.Drawing.Point(137, 69); - this.buttonGetFrameRate.Name = "buttonGetFrameRate"; - this.buttonGetFrameRate.Size = new System.Drawing.Size(25, 23); - this.buttonGetFrameRate.TabIndex = 8; - this.buttonGetFrameRate.Text = "..."; - this.buttonGetFrameRate.UseVisualStyleBackColor = true; - this.buttonGetFrameRate.Click += new System.EventHandler(this.buttonGetFrameRate_Click); - // - // buttonDone - // - this.buttonDone.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonDone.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonDone.Location = new System.Drawing.Point(239, 109); - this.buttonDone.Name = "buttonDone"; - this.buttonDone.Size = new System.Drawing.Size(75, 23); - this.buttonDone.TabIndex = 18; - this.buttonDone.Text = "&Done"; - this.buttonDone.UseVisualStyleBackColor = true; - // - // buttonSplit - // - this.buttonSplit.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonSplit.Location = new System.Drawing.Point(158, 109); - this.buttonSplit.Name = "buttonSplit"; - this.buttonSplit.Size = new System.Drawing.Size(75, 23); - this.buttonSplit.TabIndex = 17; - this.buttonSplit.Text = "&Split"; - this.buttonSplit.UseVisualStyleBackColor = true; - this.buttonSplit.Click += new System.EventHandler(this.ButtonSplitClick); - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(16, 12); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(217, 13); - this.label1.TabIndex = 19; - this.label1.Text = "Enter length of first part of video or browse"; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(16, 29); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(152, 13); - this.label2.TabIndex = 20; - this.label2.Text = "and get length from video file:"; - // - // openFileDialog1 - // - this.openFileDialog1.FileName = "openFileDialog1"; - // - // labelHourMinSecMilliSecond - // - this.labelHourMinSecMilliSecond.AutoSize = true; - this.labelHourMinSecMilliSecond.Location = new System.Drawing.Point(26, 52); - this.labelHourMinSecMilliSecond.Name = "labelHourMinSecMilliSecond"; - this.labelHourMinSecMilliSecond.Size = new System.Drawing.Size(108, 13); - this.labelHourMinSecMilliSecond.TabIndex = 22; - this.labelHourMinSecMilliSecond.Text = "Hours:min:sec.msecs"; - // - // splitTimeUpDownAdjust - // - this.splitTimeUpDownAdjust.AutoSize = true; - this.splitTimeUpDownAdjust.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.splitTimeUpDownAdjust.Font = new System.Drawing.Font("Segoe UI", 9F); - this.splitTimeUpDownAdjust.Location = new System.Drawing.Point(29, 69); - this.splitTimeUpDownAdjust.Margin = new System.Windows.Forms.Padding(4); - this.splitTimeUpDownAdjust.Name = "splitTimeUpDownAdjust"; - this.splitTimeUpDownAdjust.Size = new System.Drawing.Size(96, 27); - this.splitTimeUpDownAdjust.TabIndex = 21; - timeCode1.Hours = 0; - timeCode1.Milliseconds = 0; - timeCode1.Minutes = 0; - timeCode1.Seconds = 0; - timeCode1.TimeSpan = System.TimeSpan.Parse("00:00:00"); - timeCode1.TotalMilliseconds = 0D; - timeCode1.TotalSeconds = 0D; - this.splitTimeUpDownAdjust.TimeCode = timeCode1; - this.splitTimeUpDownAdjust.UseVideoOffset = false; - // - // buttonAdvanced - // - this.buttonAdvanced.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonAdvanced.Location = new System.Drawing.Point(54, 109); - this.buttonAdvanced.Name = "buttonAdvanced"; - this.buttonAdvanced.Size = new System.Drawing.Size(98, 23); - this.buttonAdvanced.TabIndex = 23; - this.buttonAdvanced.Text = "&Advanced"; - this.buttonAdvanced.UseVisualStyleBackColor = true; - this.buttonAdvanced.Click += new System.EventHandler(this.buttonAdvanced_Click); - // - // SplitSubtitle - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(325, 140); - this.Controls.Add(this.buttonAdvanced); - this.Controls.Add(this.buttonGetFrameRate); - this.Controls.Add(this.splitTimeUpDownAdjust); - this.Controls.Add(this.labelHourMinSecMilliSecond); - this.Controls.Add(this.label2); - this.Controls.Add(this.label1); - this.Controls.Add(this.buttonDone); - this.Controls.Add(this.buttonSplit); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "SplitSubtitle"; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Split subtitle"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormSplitSubtitle_KeyDown); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button buttonGetFrameRate; - private System.Windows.Forms.Button buttonDone; - private System.Windows.Forms.Button buttonSplit; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.OpenFileDialog openFileDialog1; - private System.Windows.Forms.SaveFileDialog saveFileDialog1; - private Nikse.SubtitleEdit.Controls.TimeUpDown splitTimeUpDownAdjust; - private System.Windows.Forms.Label labelHourMinSecMilliSecond; - private System.Windows.Forms.Button buttonAdvanced; - } +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class SplitSubtitle + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + TimeCode timeCode1 = new TimeCode(); + this.buttonGetFrameRate = new System.Windows.Forms.Button(); + this.buttonDone = new System.Windows.Forms.Button(); + this.buttonSplit = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); + this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog(); + this.labelHourMinSecMilliSecond = new System.Windows.Forms.Label(); + this.splitTimeUpDownAdjust = new Nikse.SubtitleEdit.Controls.TimeUpDown(); + this.buttonAdvanced = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // buttonGetFrameRate + // + this.buttonGetFrameRate.Location = new System.Drawing.Point(137, 69); + this.buttonGetFrameRate.Name = "buttonGetFrameRate"; + this.buttonGetFrameRate.Size = new System.Drawing.Size(25, 23); + this.buttonGetFrameRate.TabIndex = 8; + this.buttonGetFrameRate.Text = "..."; + this.buttonGetFrameRate.UseVisualStyleBackColor = true; + this.buttonGetFrameRate.Click += new System.EventHandler(this.buttonGetFrameRate_Click); + // + // buttonDone + // + this.buttonDone.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonDone.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonDone.Location = new System.Drawing.Point(239, 109); + this.buttonDone.Name = "buttonDone"; + this.buttonDone.Size = new System.Drawing.Size(75, 23); + this.buttonDone.TabIndex = 18; + this.buttonDone.Text = "&Done"; + this.buttonDone.UseVisualStyleBackColor = true; + // + // buttonSplit + // + this.buttonSplit.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonSplit.Location = new System.Drawing.Point(158, 109); + this.buttonSplit.Name = "buttonSplit"; + this.buttonSplit.Size = new System.Drawing.Size(75, 23); + this.buttonSplit.TabIndex = 17; + this.buttonSplit.Text = "&Split"; + this.buttonSplit.UseVisualStyleBackColor = true; + this.buttonSplit.Click += new System.EventHandler(this.ButtonSplitClick); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(16, 12); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(217, 13); + this.label1.TabIndex = 19; + this.label1.Text = "Enter length of first part of video or browse"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(16, 29); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(152, 13); + this.label2.TabIndex = 20; + this.label2.Text = "and get length from video file:"; + // + // openFileDialog1 + // + this.openFileDialog1.FileName = "openFileDialog1"; + // + // labelHourMinSecMilliSecond + // + this.labelHourMinSecMilliSecond.AutoSize = true; + this.labelHourMinSecMilliSecond.Location = new System.Drawing.Point(26, 52); + this.labelHourMinSecMilliSecond.Name = "labelHourMinSecMilliSecond"; + this.labelHourMinSecMilliSecond.Size = new System.Drawing.Size(108, 13); + this.labelHourMinSecMilliSecond.TabIndex = 22; + this.labelHourMinSecMilliSecond.Text = "Hours:min:sec.msecs"; + // + // splitTimeUpDownAdjust + // + this.splitTimeUpDownAdjust.AutoSize = true; + this.splitTimeUpDownAdjust.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.splitTimeUpDownAdjust.Font = new System.Drawing.Font("Segoe UI", 9F); + this.splitTimeUpDownAdjust.Location = new System.Drawing.Point(29, 69); + this.splitTimeUpDownAdjust.Margin = new System.Windows.Forms.Padding(4); + this.splitTimeUpDownAdjust.Name = "splitTimeUpDownAdjust"; + this.splitTimeUpDownAdjust.Size = new System.Drawing.Size(96, 27); + this.splitTimeUpDownAdjust.TabIndex = 21; + timeCode1.Hours = 0; + timeCode1.Milliseconds = 0; + timeCode1.Minutes = 0; + timeCode1.Seconds = 0; + timeCode1.TimeSpan = System.TimeSpan.Parse("00:00:00"); + timeCode1.TotalMilliseconds = 0D; + timeCode1.TotalSeconds = 0D; + this.splitTimeUpDownAdjust.TimeCode = timeCode1; + this.splitTimeUpDownAdjust.UseVideoOffset = false; + // + // buttonAdvanced + // + this.buttonAdvanced.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonAdvanced.Location = new System.Drawing.Point(54, 109); + this.buttonAdvanced.Name = "buttonAdvanced"; + this.buttonAdvanced.Size = new System.Drawing.Size(98, 23); + this.buttonAdvanced.TabIndex = 23; + this.buttonAdvanced.Text = "&Advanced"; + this.buttonAdvanced.UseVisualStyleBackColor = true; + this.buttonAdvanced.Click += new System.EventHandler(this.buttonAdvanced_Click); + // + // SplitSubtitle + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(325, 140); + this.Controls.Add(this.buttonAdvanced); + this.Controls.Add(this.buttonGetFrameRate); + this.Controls.Add(this.splitTimeUpDownAdjust); + this.Controls.Add(this.labelHourMinSecMilliSecond); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.buttonDone); + this.Controls.Add(this.buttonSplit); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "SplitSubtitle"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Split subtitle"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormSplitSubtitle_KeyDown); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonGetFrameRate; + private System.Windows.Forms.Button buttonDone; + private System.Windows.Forms.Button buttonSplit; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.OpenFileDialog openFileDialog1; + private System.Windows.Forms.SaveFileDialog saveFileDialog1; + private Nikse.SubtitleEdit.Controls.TimeUpDown splitTimeUpDownAdjust; + private System.Windows.Forms.Label labelHourMinSecMilliSecond; + private System.Windows.Forms.Button buttonAdvanced; + } } \ No newline at end of file diff --git a/src/Forms/SplitSubtitle.cs b/src/ui/Forms/SplitSubtitle.cs similarity index 97% rename from src/Forms/SplitSubtitle.cs rename to src/ui/Forms/SplitSubtitle.cs index 647dccd3b..61e4b4427 100644 --- a/src/Forms/SplitSubtitle.cs +++ b/src/ui/Forms/SplitSubtitle.cs @@ -1,171 +1,171 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.SubtitleFormats; -using Nikse.SubtitleEdit.Logic; -using System; -using System.IO; -using System.Text; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class SplitSubtitle : Form - { - private Subtitle _subtitle; - private SubtitleFormat _format; - private Encoding _encoding; - private string _fileName; - public bool ShowAdvanced { get; private set; } - - public SplitSubtitle() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - Text = Configuration.Settings.Language.SplitSubtitle.Title; - label1.Text = Configuration.Settings.Language.SplitSubtitle.Description1; - label2.Text = Configuration.Settings.Language.SplitSubtitle.Description2; - buttonSplit.Text = Configuration.Settings.Language.SplitSubtitle.Split; - buttonDone.Text = Configuration.Settings.Language.SplitSubtitle.Done; - buttonAdvanced.Text = Configuration.Settings.Language.General.Advanced; - labelHourMinSecMilliSecond.Text = Configuration.Settings.General.UseTimeFormatHHMMSSFF ? Configuration.Settings.Language.General.HourMinutesSecondsFrames : Configuration.Settings.Language.General.HourMinutesSecondsMilliseconds; - buttonGetFrameRate.Left = splitTimeUpDownAdjust.Left + splitTimeUpDownAdjust.Width; - - label2.Top = label1.Bottom; - if (Width < label1.Right + 5) - { - Width = label1.Right + 5; - } - - UiUtil.FixLargeFonts(this, buttonSplit); - } - - public void Initialize(Subtitle subtitle, string fileName, SubtitleFormat format, Encoding encoding, double lengthInSeconds) - { - ShowAdvanced = false; - _subtitle = subtitle; - _fileName = fileName; - _format = format; - _encoding = encoding; - splitTimeUpDownAdjust.TimeCode = TimeCode.FromSeconds(lengthInSeconds); - } - - private void FormSplitSubtitle_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - private void ButtonSplitClick(object sender, EventArgs e) - { - var splitTimeTotalMilliseconds = splitTimeUpDownAdjust.TimeCode.TotalMilliseconds; - if (splitTimeTotalMilliseconds > 0) - { - var part1 = new Subtitle(); - var part2 = new Subtitle(); - part1.Header = _subtitle.Header; - part1.Footer = _subtitle.Footer; - part2.Header = _subtitle.Header; - part2.Footer = _subtitle.Footer; - - foreach (Paragraph p in _subtitle.Paragraphs) - { - if (p.StartTime.TotalMilliseconds < splitTimeTotalMilliseconds) - { - part1.Paragraphs.Add(new Paragraph(p)); - } - - if (p.StartTime.TotalMilliseconds >= splitTimeTotalMilliseconds) - { - part2.Paragraphs.Add(new Paragraph(p)); - } - else if (p.EndTime.TotalMilliseconds > splitTimeTotalMilliseconds) - { - part1.Paragraphs[part1.Paragraphs.Count - 1].EndTime = new TimeCode(splitTimeTotalMilliseconds); - part2.Paragraphs.Add(new Paragraph(p) { StartTime = new TimeCode(splitTimeTotalMilliseconds) }); - } - } - if (part1.Paragraphs.Count > 0 && part2.Paragraphs.Count > 0) - { - SavePart(part1, Configuration.Settings.Language.SplitSubtitle.SavePartOneAs, Configuration.Settings.Language.SplitSubtitle.Part1); - - part2.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(-splitTimeTotalMilliseconds)); - part2.Renumber(); - SavePart(part2, Configuration.Settings.Language.SplitSubtitle.SavePartTwoAs, Configuration.Settings.Language.SplitSubtitle.Part2); - - DialogResult = DialogResult.OK; - return; - } - MessageBox.Show(Configuration.Settings.Language.SplitSubtitle.NothingToSplit); - } - DialogResult = DialogResult.Cancel; - } - - private void SavePart(Subtitle part, string title, string name) - { - saveFileDialog1.Title = title; - saveFileDialog1.FileName = name; - UiUtil.SetSaveDialogFilter(saveFileDialog1, _format); - saveFileDialog1.DefaultExt = "*" + _format.Extension; - saveFileDialog1.AddExtension = true; - - if (saveFileDialog1.ShowDialog() == DialogResult.OK) - { - string fileName = saveFileDialog1.FileName; - - try - { - if (File.Exists(fileName)) - { - File.Delete(fileName); - } - - int index = 0; - foreach (SubtitleFormat format in SubtitleFormat.AllSubtitleFormats) - { - if (saveFileDialog1.FilterIndex == index + 1) - { - File.WriteAllText(fileName, part.ToText(format), _encoding); - } - index++; - } - } - catch - { - MessageBox.Show(string.Format(Configuration.Settings.Language.SplitSubtitle.UnableToSaveFileX, fileName)); - } - } - } - - private void buttonGetFrameRate_Click(object sender, EventArgs e) - { - if (string.IsNullOrEmpty(openFileDialog1.InitialDirectory) && !string.IsNullOrEmpty(_fileName)) - { - openFileDialog1.InitialDirectory = Path.GetDirectoryName(_fileName); - } - - openFileDialog1.Title = Configuration.Settings.Language.General.OpenVideoFileTitle; - openFileDialog1.FileName = string.Empty; - openFileDialog1.Filter = Utilities.GetVideoFileFilter(true); - openFileDialog1.FileName = string.Empty; - if (openFileDialog1.ShowDialog() == DialogResult.OK) - { - VideoInfo info = UiUtil.GetVideoInfo(openFileDialog1.FileName); - if (info != null && info.Success) - { - splitTimeUpDownAdjust.TimeCode = new TimeCode(info.TotalMilliseconds); - } - } - } - - private void buttonAdvanced_Click(object sender, EventArgs e) - { - ShowAdvanced = true; - DialogResult = DialogResult.Cancel; - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.SubtitleFormats; +using Nikse.SubtitleEdit.Logic; +using System; +using System.IO; +using System.Text; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class SplitSubtitle : Form + { + private Subtitle _subtitle; + private SubtitleFormat _format; + private Encoding _encoding; + private string _fileName; + public bool ShowAdvanced { get; private set; } + + public SplitSubtitle() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + Text = Configuration.Settings.Language.SplitSubtitle.Title; + label1.Text = Configuration.Settings.Language.SplitSubtitle.Description1; + label2.Text = Configuration.Settings.Language.SplitSubtitle.Description2; + buttonSplit.Text = Configuration.Settings.Language.SplitSubtitle.Split; + buttonDone.Text = Configuration.Settings.Language.SplitSubtitle.Done; + buttonAdvanced.Text = Configuration.Settings.Language.General.Advanced; + labelHourMinSecMilliSecond.Text = Configuration.Settings.General.UseTimeFormatHHMMSSFF ? Configuration.Settings.Language.General.HourMinutesSecondsFrames : Configuration.Settings.Language.General.HourMinutesSecondsMilliseconds; + buttonGetFrameRate.Left = splitTimeUpDownAdjust.Left + splitTimeUpDownAdjust.Width; + + label2.Top = label1.Bottom; + if (Width < label1.Right + 5) + { + Width = label1.Right + 5; + } + + UiUtil.FixLargeFonts(this, buttonSplit); + } + + public void Initialize(Subtitle subtitle, string fileName, SubtitleFormat format, Encoding encoding, double lengthInSeconds) + { + ShowAdvanced = false; + _subtitle = subtitle; + _fileName = fileName; + _format = format; + _encoding = encoding; + splitTimeUpDownAdjust.TimeCode = TimeCode.FromSeconds(lengthInSeconds); + } + + private void FormSplitSubtitle_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + private void ButtonSplitClick(object sender, EventArgs e) + { + var splitTimeTotalMilliseconds = splitTimeUpDownAdjust.TimeCode.TotalMilliseconds; + if (splitTimeTotalMilliseconds > 0) + { + var part1 = new Subtitle(); + var part2 = new Subtitle(); + part1.Header = _subtitle.Header; + part1.Footer = _subtitle.Footer; + part2.Header = _subtitle.Header; + part2.Footer = _subtitle.Footer; + + foreach (Paragraph p in _subtitle.Paragraphs) + { + if (p.StartTime.TotalMilliseconds < splitTimeTotalMilliseconds) + { + part1.Paragraphs.Add(new Paragraph(p)); + } + + if (p.StartTime.TotalMilliseconds >= splitTimeTotalMilliseconds) + { + part2.Paragraphs.Add(new Paragraph(p)); + } + else if (p.EndTime.TotalMilliseconds > splitTimeTotalMilliseconds) + { + part1.Paragraphs[part1.Paragraphs.Count - 1].EndTime = new TimeCode(splitTimeTotalMilliseconds); + part2.Paragraphs.Add(new Paragraph(p) { StartTime = new TimeCode(splitTimeTotalMilliseconds) }); + } + } + if (part1.Paragraphs.Count > 0 && part2.Paragraphs.Count > 0) + { + SavePart(part1, Configuration.Settings.Language.SplitSubtitle.SavePartOneAs, Configuration.Settings.Language.SplitSubtitle.Part1); + + part2.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(-splitTimeTotalMilliseconds)); + part2.Renumber(); + SavePart(part2, Configuration.Settings.Language.SplitSubtitle.SavePartTwoAs, Configuration.Settings.Language.SplitSubtitle.Part2); + + DialogResult = DialogResult.OK; + return; + } + MessageBox.Show(Configuration.Settings.Language.SplitSubtitle.NothingToSplit); + } + DialogResult = DialogResult.Cancel; + } + + private void SavePart(Subtitle part, string title, string name) + { + saveFileDialog1.Title = title; + saveFileDialog1.FileName = name; + UiUtil.SetSaveDialogFilter(saveFileDialog1, _format); + saveFileDialog1.DefaultExt = "*" + _format.Extension; + saveFileDialog1.AddExtension = true; + + if (saveFileDialog1.ShowDialog() == DialogResult.OK) + { + string fileName = saveFileDialog1.FileName; + + try + { + if (File.Exists(fileName)) + { + File.Delete(fileName); + } + + int index = 0; + foreach (SubtitleFormat format in SubtitleFormat.AllSubtitleFormats) + { + if (saveFileDialog1.FilterIndex == index + 1) + { + File.WriteAllText(fileName, part.ToText(format), _encoding); + } + index++; + } + } + catch + { + MessageBox.Show(string.Format(Configuration.Settings.Language.SplitSubtitle.UnableToSaveFileX, fileName)); + } + } + } + + private void buttonGetFrameRate_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(openFileDialog1.InitialDirectory) && !string.IsNullOrEmpty(_fileName)) + { + openFileDialog1.InitialDirectory = Path.GetDirectoryName(_fileName); + } + + openFileDialog1.Title = Configuration.Settings.Language.General.OpenVideoFileTitle; + openFileDialog1.FileName = string.Empty; + openFileDialog1.Filter = Utilities.GetVideoFileFilter(true); + openFileDialog1.FileName = string.Empty; + if (openFileDialog1.ShowDialog() == DialogResult.OK) + { + VideoInfo info = UiUtil.GetVideoInfo(openFileDialog1.FileName); + if (info != null && info.Success) + { + splitTimeUpDownAdjust.TimeCode = new TimeCode(info.TotalMilliseconds); + } + } + } + + private void buttonAdvanced_Click(object sender, EventArgs e) + { + ShowAdvanced = true; + DialogResult = DialogResult.Cancel; + } + + } +} diff --git a/src/Forms/SplitSubtitle.resx b/src/ui/Forms/SplitSubtitle.resx similarity index 97% rename from src/Forms/SplitSubtitle.resx rename to src/ui/Forms/SplitSubtitle.resx index dadfc1c4b..c19168183 100644 --- a/src/Forms/SplitSubtitle.resx +++ b/src/ui/Forms/SplitSubtitle.resx @@ -1,126 +1,126 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - 147, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 147, 17 + \ No newline at end of file diff --git a/src/Forms/StartNumberingFrom.Designer.cs b/src/ui/Forms/StartNumberingFrom.Designer.cs similarity index 97% rename from src/Forms/StartNumberingFrom.Designer.cs rename to src/ui/Forms/StartNumberingFrom.Designer.cs index 0f23e0766..b6d201588 100644 --- a/src/Forms/StartNumberingFrom.Designer.cs +++ b/src/ui/Forms/StartNumberingFrom.Designer.cs @@ -1,106 +1,106 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class StartNumberingFrom - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.label1 = new System.Windows.Forms.Label(); - this.textBox1 = new System.Windows.Forms.TextBox(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.SuspendLayout(); - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(24, 23); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(99, 13); - this.label1.TabIndex = 1; - this.label1.Text = "Start from number:"; - // - // textBox1 - // - this.textBox1.Location = new System.Drawing.Point(27, 41); - this.textBox1.Name = "textBox1"; - this.textBox1.Size = new System.Drawing.Size(104, 21); - this.textBox1.TabIndex = 0; - this.textBox1.Text = "1"; - this.textBox1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBox1KeyDown); - // - // buttonCancel - // - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.Location = new System.Drawing.Point(113, 78); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 2; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - // - // buttonOK - // - this.buttonOK.Location = new System.Drawing.Point(31, 78); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 1; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); - // - // StartNumberingFrom - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(261, 113); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.textBox1); - this.Controls.Add(this.label1); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "StartNumberingFrom"; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Start numbering from..."; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormStartNumberingFrom_KeyDown); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Label label1; - private System.Windows.Forms.TextBox textBox1; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonOK; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class StartNumberingFrom + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.label1 = new System.Windows.Forms.Label(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(24, 23); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(99, 13); + this.label1.TabIndex = 1; + this.label1.Text = "Start from number:"; + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(27, 41); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(104, 21); + this.textBox1.TabIndex = 0; + this.textBox1.Text = "1"; + this.textBox1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBox1KeyDown); + // + // buttonCancel + // + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.Location = new System.Drawing.Point(113, 78); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 2; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + // + // buttonOK + // + this.buttonOK.Location = new System.Drawing.Point(31, 78); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 1; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick); + // + // StartNumberingFrom + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(261, 113); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.label1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "StartNumberingFrom"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Start numbering from..."; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormStartNumberingFrom_KeyDown); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + } } \ No newline at end of file diff --git a/src/Forms/StartNumberingFrom.cs b/src/ui/Forms/StartNumberingFrom.cs similarity index 97% rename from src/Forms/StartNumberingFrom.cs rename to src/ui/Forms/StartNumberingFrom.cs index 70c9edef8..d686e9ab1 100644 --- a/src/Forms/StartNumberingFrom.cs +++ b/src/ui/Forms/StartNumberingFrom.cs @@ -1,76 +1,76 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class StartNumberingFrom : PositionAndSizeForm - { - private int _startFromNumber; - - public StartNumberingFrom() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - Text = Configuration.Settings.Language.StartNumberingFrom.Title; - label1.Text = Configuration.Settings.Language.StartNumberingFrom.StartFromNumber; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - UiUtil.FixLargeFonts(this, buttonOK); - } - - private void FormStartNumberingFrom_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - private void TextBox1KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Enter) - { - ButtonOkClick(null, null); - } - else - { - if (e.KeyCode != Keys.D0 && e.KeyCode != Keys.D1 && e.KeyCode != Keys.D2 && e.KeyCode != Keys.D3 && e.KeyCode != Keys.D4 && e.KeyCode != Keys.D5 && e.KeyCode != Keys.D6 && e.KeyCode != Keys.D7 && e.KeyCode != Keys.D8 && e.KeyCode != Keys.D9 && e.KeyCode != Keys.Delete && e.KeyCode != Keys.Left && e.KeyCode != Keys.Right && e.KeyCode != Keys.Back && e.KeyCode != Keys.Home && e.KeyCode != Keys.End && (e.KeyValue < 96 || e.KeyValue > 105)) - { - if (e.KeyData == (Keys.Control | Keys.V) && Clipboard.GetText(TextDataFormat.UnicodeText).Length > 0) - { - var p = Clipboard.GetText(TextDataFormat.UnicodeText); - if (!int.TryParse(p, out _)) - { - e.SuppressKeyPress = true; - } - } - else if (e.Modifiers != Keys.Control && e.Modifiers != Keys.Alt) - { - e.SuppressKeyPress = true; - } - } - } - } - - private void ButtonOkClick(object sender, EventArgs e) - { - if (int.TryParse(textBox1.Text, out _startFromNumber)) - { - DialogResult = DialogResult.OK; - } - else - { - MessageBox.Show(Configuration.Settings.Language.StartNumberingFrom.PleaseEnterAValidNumber); - textBox1.Focus(); - textBox1.SelectAll(); - } - } - - public int StartFromNumber => _startFromNumber; - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class StartNumberingFrom : PositionAndSizeForm + { + private int _startFromNumber; + + public StartNumberingFrom() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + Text = Configuration.Settings.Language.StartNumberingFrom.Title; + label1.Text = Configuration.Settings.Language.StartNumberingFrom.StartFromNumber; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + UiUtil.FixLargeFonts(this, buttonOK); + } + + private void FormStartNumberingFrom_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + private void TextBox1KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + ButtonOkClick(null, null); + } + else + { + if (e.KeyCode != Keys.D0 && e.KeyCode != Keys.D1 && e.KeyCode != Keys.D2 && e.KeyCode != Keys.D3 && e.KeyCode != Keys.D4 && e.KeyCode != Keys.D5 && e.KeyCode != Keys.D6 && e.KeyCode != Keys.D7 && e.KeyCode != Keys.D8 && e.KeyCode != Keys.D9 && e.KeyCode != Keys.Delete && e.KeyCode != Keys.Left && e.KeyCode != Keys.Right && e.KeyCode != Keys.Back && e.KeyCode != Keys.Home && e.KeyCode != Keys.End && (e.KeyValue < 96 || e.KeyValue > 105)) + { + if (e.KeyData == (Keys.Control | Keys.V) && Clipboard.GetText(TextDataFormat.UnicodeText).Length > 0) + { + var p = Clipboard.GetText(TextDataFormat.UnicodeText); + if (!int.TryParse(p, out _)) + { + e.SuppressKeyPress = true; + } + } + else if (e.Modifiers != Keys.Control && e.Modifiers != Keys.Alt) + { + e.SuppressKeyPress = true; + } + } + } + } + + private void ButtonOkClick(object sender, EventArgs e) + { + if (int.TryParse(textBox1.Text, out _startFromNumber)) + { + DialogResult = DialogResult.OK; + } + else + { + MessageBox.Show(Configuration.Settings.Language.StartNumberingFrom.PleaseEnterAValidNumber); + textBox1.Focus(); + textBox1.SelectAll(); + } + } + + public int StartFromNumber => _startFromNumber; + } +} diff --git a/src/Forms/StartNumberingFrom.resx b/src/ui/Forms/StartNumberingFrom.resx similarity index 97% rename from src/Forms/StartNumberingFrom.resx rename to src/ui/Forms/StartNumberingFrom.resx index c7e0d4bdf..d58980a38 100644 --- a/src/Forms/StartNumberingFrom.resx +++ b/src/ui/Forms/StartNumberingFrom.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Forms/Statistics.Designer.cs b/src/ui/Forms/Statistics.Designer.cs similarity index 98% rename from src/Forms/Statistics.Designer.cs rename to src/ui/Forms/Statistics.Designer.cs index 7d88c9281..6b125faa3 100644 --- a/src/Forms/Statistics.Designer.cs +++ b/src/ui/Forms/Statistics.Designer.cs @@ -1,190 +1,190 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class Statistics - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.buttonOK = new System.Windows.Forms.Button(); - this.groupBoxGeneral = new System.Windows.Forms.GroupBox(); - this.textBoxGeneral = new System.Windows.Forms.TextBox(); - this.groupBoxMostUsed = new System.Windows.Forms.GroupBox(); - this.labelMostUsedLines = new System.Windows.Forms.Label(); - this.labelMostUsedWords = new System.Windows.Forms.Label(); - this.textBoxMostUsedLines = new System.Windows.Forms.TextBox(); - this.textBoxMostUsedWords = new System.Windows.Forms.TextBox(); - this.buttonExport = new System.Windows.Forms.Button(); - this.groupBoxGeneral.SuspendLayout(); - this.groupBoxMostUsed.SuspendLayout(); - this.SuspendLayout(); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(642, 632); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 3; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // groupBoxGeneral - // - this.groupBoxGeneral.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxGeneral.Controls.Add(this.textBoxGeneral); - this.groupBoxGeneral.Location = new System.Drawing.Point(15, 12); - this.groupBoxGeneral.Name = "groupBoxGeneral"; - this.groupBoxGeneral.Size = new System.Drawing.Size(705, 376); - this.groupBoxGeneral.TabIndex = 0; - this.groupBoxGeneral.TabStop = false; - this.groupBoxGeneral.Text = "General statistics"; - // - // textBoxGeneral - // - this.textBoxGeneral.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.textBoxGeneral.Location = new System.Drawing.Point(6, 19); - this.textBoxGeneral.Multiline = true; - this.textBoxGeneral.Name = "textBoxGeneral"; - this.textBoxGeneral.ReadOnly = true; - this.textBoxGeneral.ScrollBars = System.Windows.Forms.ScrollBars.Both; - this.textBoxGeneral.Size = new System.Drawing.Size(694, 351); - this.textBoxGeneral.TabIndex = 0; - // - // groupBoxMostUsed - // - this.groupBoxMostUsed.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxMostUsed.Controls.Add(this.labelMostUsedLines); - this.groupBoxMostUsed.Controls.Add(this.labelMostUsedWords); - this.groupBoxMostUsed.Controls.Add(this.textBoxMostUsedLines); - this.groupBoxMostUsed.Controls.Add(this.textBoxMostUsedWords); - this.groupBoxMostUsed.Location = new System.Drawing.Point(12, 394); - this.groupBoxMostUsed.Name = "groupBoxMostUsed"; - this.groupBoxMostUsed.Size = new System.Drawing.Size(705, 232); - this.groupBoxMostUsed.TabIndex = 1; - this.groupBoxMostUsed.TabStop = false; - this.groupBoxMostUsed.Text = "Most used"; - // - // labelMostUsedLines - // - this.labelMostUsedLines.AutoSize = true; - this.labelMostUsedLines.Location = new System.Drawing.Point(329, 27); - this.labelMostUsedLines.Name = "labelMostUsedLines"; - this.labelMostUsedLines.Size = new System.Drawing.Size(80, 13); - this.labelMostUsedLines.TabIndex = 2; - this.labelMostUsedLines.Text = "Most used lines"; - // - // labelMostUsedWords - // - this.labelMostUsedWords.AutoSize = true; - this.labelMostUsedWords.Location = new System.Drawing.Point(6, 27); - this.labelMostUsedWords.Name = "labelMostUsedWords"; - this.labelMostUsedWords.Size = new System.Drawing.Size(87, 13); - this.labelMostUsedWords.TabIndex = 0; - this.labelMostUsedWords.Text = "Most used words"; - // - // textBoxMostUsedLines - // - this.textBoxMostUsedLines.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.textBoxMostUsedLines.Location = new System.Drawing.Point(332, 43); - this.textBoxMostUsedLines.Multiline = true; - this.textBoxMostUsedLines.Name = "textBoxMostUsedLines"; - this.textBoxMostUsedLines.ReadOnly = true; - this.textBoxMostUsedLines.ScrollBars = System.Windows.Forms.ScrollBars.Both; - this.textBoxMostUsedLines.Size = new System.Drawing.Size(371, 183); - this.textBoxMostUsedLines.TabIndex = 3; - // - // textBoxMostUsedWords - // - this.textBoxMostUsedWords.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left))); - this.textBoxMostUsedWords.Location = new System.Drawing.Point(9, 43); - this.textBoxMostUsedWords.Multiline = true; - this.textBoxMostUsedWords.Name = "textBoxMostUsedWords"; - this.textBoxMostUsedWords.ReadOnly = true; - this.textBoxMostUsedWords.ScrollBars = System.Windows.Forms.ScrollBars.Both; - this.textBoxMostUsedWords.Size = new System.Drawing.Size(320, 183); - this.textBoxMostUsedWords.TabIndex = 1; - // - // buttonExport - // - this.buttonExport.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonExport.Location = new System.Drawing.Point(532, 632); - this.buttonExport.Name = "buttonExport"; - this.buttonExport.Size = new System.Drawing.Size(104, 23); - this.buttonExport.TabIndex = 2; - this.buttonExport.Text = "Export"; - this.buttonExport.UseVisualStyleBackColor = true; - this.buttonExport.Click += new System.EventHandler(this.buttonExport_Click); - // - // Statistics - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(732, 665); - this.Controls.Add(this.buttonExport); - this.Controls.Add(this.groupBoxMostUsed); - this.Controls.Add(this.groupBoxGeneral); - this.Controls.Add(this.buttonOK); - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(700, 600); - this.Name = "Statistics"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Statistics"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Statistics_KeyDown); - this.groupBoxGeneral.ResumeLayout(false); - this.groupBoxGeneral.PerformLayout(); - this.groupBoxMostUsed.ResumeLayout(false); - this.groupBoxMostUsed.PerformLayout(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.GroupBox groupBoxGeneral; - private System.Windows.Forms.TextBox textBoxGeneral; - private System.Windows.Forms.GroupBox groupBoxMostUsed; - private System.Windows.Forms.TextBox textBoxMostUsedWords; - private System.Windows.Forms.TextBox textBoxMostUsedLines; - private System.Windows.Forms.Label labelMostUsedLines; - private System.Windows.Forms.Label labelMostUsedWords; - private System.Windows.Forms.Button buttonExport; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class Statistics + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.buttonOK = new System.Windows.Forms.Button(); + this.groupBoxGeneral = new System.Windows.Forms.GroupBox(); + this.textBoxGeneral = new System.Windows.Forms.TextBox(); + this.groupBoxMostUsed = new System.Windows.Forms.GroupBox(); + this.labelMostUsedLines = new System.Windows.Forms.Label(); + this.labelMostUsedWords = new System.Windows.Forms.Label(); + this.textBoxMostUsedLines = new System.Windows.Forms.TextBox(); + this.textBoxMostUsedWords = new System.Windows.Forms.TextBox(); + this.buttonExport = new System.Windows.Forms.Button(); + this.groupBoxGeneral.SuspendLayout(); + this.groupBoxMostUsed.SuspendLayout(); + this.SuspendLayout(); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(642, 632); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 3; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // groupBoxGeneral + // + this.groupBoxGeneral.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxGeneral.Controls.Add(this.textBoxGeneral); + this.groupBoxGeneral.Location = new System.Drawing.Point(15, 12); + this.groupBoxGeneral.Name = "groupBoxGeneral"; + this.groupBoxGeneral.Size = new System.Drawing.Size(705, 376); + this.groupBoxGeneral.TabIndex = 0; + this.groupBoxGeneral.TabStop = false; + this.groupBoxGeneral.Text = "General statistics"; + // + // textBoxGeneral + // + this.textBoxGeneral.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxGeneral.Location = new System.Drawing.Point(6, 19); + this.textBoxGeneral.Multiline = true; + this.textBoxGeneral.Name = "textBoxGeneral"; + this.textBoxGeneral.ReadOnly = true; + this.textBoxGeneral.ScrollBars = System.Windows.Forms.ScrollBars.Both; + this.textBoxGeneral.Size = new System.Drawing.Size(694, 351); + this.textBoxGeneral.TabIndex = 0; + // + // groupBoxMostUsed + // + this.groupBoxMostUsed.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxMostUsed.Controls.Add(this.labelMostUsedLines); + this.groupBoxMostUsed.Controls.Add(this.labelMostUsedWords); + this.groupBoxMostUsed.Controls.Add(this.textBoxMostUsedLines); + this.groupBoxMostUsed.Controls.Add(this.textBoxMostUsedWords); + this.groupBoxMostUsed.Location = new System.Drawing.Point(12, 394); + this.groupBoxMostUsed.Name = "groupBoxMostUsed"; + this.groupBoxMostUsed.Size = new System.Drawing.Size(705, 232); + this.groupBoxMostUsed.TabIndex = 1; + this.groupBoxMostUsed.TabStop = false; + this.groupBoxMostUsed.Text = "Most used"; + // + // labelMostUsedLines + // + this.labelMostUsedLines.AutoSize = true; + this.labelMostUsedLines.Location = new System.Drawing.Point(329, 27); + this.labelMostUsedLines.Name = "labelMostUsedLines"; + this.labelMostUsedLines.Size = new System.Drawing.Size(80, 13); + this.labelMostUsedLines.TabIndex = 2; + this.labelMostUsedLines.Text = "Most used lines"; + // + // labelMostUsedWords + // + this.labelMostUsedWords.AutoSize = true; + this.labelMostUsedWords.Location = new System.Drawing.Point(6, 27); + this.labelMostUsedWords.Name = "labelMostUsedWords"; + this.labelMostUsedWords.Size = new System.Drawing.Size(87, 13); + this.labelMostUsedWords.TabIndex = 0; + this.labelMostUsedWords.Text = "Most used words"; + // + // textBoxMostUsedLines + // + this.textBoxMostUsedLines.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxMostUsedLines.Location = new System.Drawing.Point(332, 43); + this.textBoxMostUsedLines.Multiline = true; + this.textBoxMostUsedLines.Name = "textBoxMostUsedLines"; + this.textBoxMostUsedLines.ReadOnly = true; + this.textBoxMostUsedLines.ScrollBars = System.Windows.Forms.ScrollBars.Both; + this.textBoxMostUsedLines.Size = new System.Drawing.Size(371, 183); + this.textBoxMostUsedLines.TabIndex = 3; + // + // textBoxMostUsedWords + // + this.textBoxMostUsedWords.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.textBoxMostUsedWords.Location = new System.Drawing.Point(9, 43); + this.textBoxMostUsedWords.Multiline = true; + this.textBoxMostUsedWords.Name = "textBoxMostUsedWords"; + this.textBoxMostUsedWords.ReadOnly = true; + this.textBoxMostUsedWords.ScrollBars = System.Windows.Forms.ScrollBars.Both; + this.textBoxMostUsedWords.Size = new System.Drawing.Size(320, 183); + this.textBoxMostUsedWords.TabIndex = 1; + // + // buttonExport + // + this.buttonExport.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonExport.Location = new System.Drawing.Point(532, 632); + this.buttonExport.Name = "buttonExport"; + this.buttonExport.Size = new System.Drawing.Size(104, 23); + this.buttonExport.TabIndex = 2; + this.buttonExport.Text = "Export"; + this.buttonExport.UseVisualStyleBackColor = true; + this.buttonExport.Click += new System.EventHandler(this.buttonExport_Click); + // + // Statistics + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(732, 665); + this.Controls.Add(this.buttonExport); + this.Controls.Add(this.groupBoxMostUsed); + this.Controls.Add(this.groupBoxGeneral); + this.Controls.Add(this.buttonOK); + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(700, 600); + this.Name = "Statistics"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Statistics"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Statistics_KeyDown); + this.groupBoxGeneral.ResumeLayout(false); + this.groupBoxGeneral.PerformLayout(); + this.groupBoxMostUsed.ResumeLayout(false); + this.groupBoxMostUsed.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.GroupBox groupBoxGeneral; + private System.Windows.Forms.TextBox textBoxGeneral; + private System.Windows.Forms.GroupBox groupBoxMostUsed; + private System.Windows.Forms.TextBox textBoxMostUsedWords; + private System.Windows.Forms.TextBox textBoxMostUsedLines; + private System.Windows.Forms.Label labelMostUsedLines; + private System.Windows.Forms.Label labelMostUsedWords; + private System.Windows.Forms.Button buttonExport; + } } \ No newline at end of file diff --git a/src/Forms/Statistics.cs b/src/ui/Forms/Statistics.cs similarity index 97% rename from src/Forms/Statistics.cs rename to src/ui/Forms/Statistics.cs index 415d3379f..e3e95beff 100644 --- a/src/Forms/Statistics.cs +++ b/src/ui/Forms/Statistics.cs @@ -1,516 +1,516 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.SubtitleFormats; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Text; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class Statistics : PositionAndSizeForm - { - - public class StingOrdinalComparer : IEqualityComparer, IComparer - { - public bool Equals(string x, string y) - { - if (x == null) - { - return y == null; - } - - return x.Equals(y, StringComparison.Ordinal); - } - - public int GetHashCode(string x) - { - return x.GetHashCode(); - } - - public int Compare(string x, string y) - { - return string.CompareOrdinal(x, y); - } - } - - private readonly Subtitle _subtitle; - private readonly SubtitleFormat _format; - private readonly LanguageStructure.Statistics _l; - private string _mostUsedLines; - private string _general; - private int _totalWords; - private string _mostUsedWords; - private const string WriteFormat = @"File generated by: Subtitle Edit -https://www.nikse.dk/subtitleedit/ -https://github.com/SubtitleEdit/subtitleedit -============================= General ============================= -{0} -============================= Most Used Words ============================= -{1} -============================= Most Used Lines ============================= -{2}"; - private readonly string _fileName; - - private static readonly char[] ExpectedChars = { '♪', '♫', '"', '(', ')', '[', ']', ' ', ',', '!', '?', '.', ':', ';', '-', '_', '@', '<', '>', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '،', '؟', '؛' }; - - public Statistics(Subtitle subtitle, string fileName, SubtitleFormat format) - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - _subtitle = subtitle; - _format = format; - _fileName = fileName; - - _l = Configuration.Settings.Language.Statistics; - Text = string.IsNullOrEmpty(fileName) ? _l.Title : string.Format(_l.TitleWithFileName, fileName); - groupBoxGeneral.Text = _l.GeneralStatistics; - groupBoxMostUsed.Text = _l.MostUsed; - labelMostUsedWords.Text = _l.MostUsedWords; - labelMostUsedLines.Text = _l.MostUsedLines; - buttonExport.Text = _l.Export; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - UiUtil.FixLargeFonts(this, buttonOK); - - CalculateWordStatistics(); - CalculateGeneralStatistics(); - textBoxGeneral.Text = _general; - textBoxGeneral.SelectionStart = 0; - textBoxGeneral.SelectionLength = 0; - textBoxGeneral.ScrollToCaret(); - textBoxMostUsedWords.Text = _mostUsedWords; - - CalculateMostUsedLines(); - textBoxMostUsedLines.Text = _mostUsedLines; - } - - private void CalculateGeneralStatistics() - { - if (_subtitle == null || _subtitle.Paragraphs.Count == 0) - { - textBoxGeneral.Text = _l.NothingFound; - return; - } - - var allText = new StringBuilder(); - int minimumLineLength = 99999999; - int maximumLineLength = 0; - long totalLineLength = 0; - int minimumSingleLineLength = 99999999; - int maximumSingleLineLength = 0; - long totalSingleLineLength = 0; - long totalSingleLines = 0; - int minimumSingleLineWidth = 99999999; - int maximumSingleLineWidth = 0; - long totalSingleLineWidth = 0; - double minimumDuration = 100000000; - double maximumDuration = 0; - double totalDuration = 0; - double minimumCharsSec = 100000000; - double maximumCharsSec = 0; - double totalCharsSec = 0; - foreach (Paragraph p in _subtitle.Paragraphs) - { - allText.Append(p.Text); - - int len = GetLineLength(p); - minimumLineLength = Math.Min(minimumLineLength, len); - maximumLineLength = Math.Max(len, maximumLineLength); - totalLineLength += len; - - double duration = p.Duration.TotalMilliseconds; - minimumDuration = Math.Min(duration, minimumDuration); - maximumDuration = Math.Max(duration, maximumDuration); - totalDuration += duration; - - var charsSec = Utilities.GetCharactersPerSecond(p); - minimumCharsSec = Math.Min(charsSec, minimumCharsSec); - maximumCharsSec = Math.Max(charsSec, maximumCharsSec); - totalCharsSec += charsSec; - - foreach (string line in p.Text.SplitToLines()) - { - var l = GetSingleLineLength(line); - minimumSingleLineLength = Math.Min(l, minimumSingleLineLength); - maximumSingleLineLength = Math.Max(l, maximumSingleLineLength); - totalSingleLineLength += l; - - if (Configuration.Settings.Tools.ListViewSyntaxColorWideLines) - { - var w = GetSingleLineWidth(line); - minimumSingleLineWidth = Math.Min(w, minimumSingleLineWidth); - maximumSingleLineWidth = Math.Max(w, maximumSingleLineWidth); - totalSingleLineWidth += w; - } - - totalSingleLines++; - } - } - - var sb = new StringBuilder(); - int sourceLength = _subtitle.ToText(_format).Length; - var allTextToLower = allText.ToString().ToLowerInvariant(); - - sb.AppendLine(string.Format(_l.NumberOfLinesX, _subtitle.Paragraphs.Count)); - sb.AppendLine(string.Format(_l.LengthInFormatXinCharactersY, _format.FriendlyName, sourceLength)); - sb.AppendLine(string.Format(_l.NumberOfCharactersInTextOnly, allText.ToString().CountCharacters(false, Configuration.Settings.General.IgnoreArabicDiacritics))); - sb.AppendLine(string.Format(_l.TotalDuration, new TimeCode(totalDuration).ToDisplayString())); - sb.AppendLine(string.Format(_l.TotalCharsPerSecond, allText.ToString().CountCharacters(false, Configuration.Settings.General.IgnoreArabicDiacritics) / (totalDuration / TimeCode.BaseUnit))); - sb.AppendLine(string.Format(_l.TotalWords, _totalWords)); - sb.AppendLine(string.Format(_l.NumberOfItalicTags, Utilities.CountTagInText(allTextToLower, ""))); - sb.AppendLine(string.Format(_l.NumberOfBoldTags, Utilities.CountTagInText(allTextToLower, ""))); - sb.AppendLine(string.Format(_l.NumberOfUnderlineTags, Utilities.CountTagInText(allTextToLower, ""))); - sb.AppendLine(string.Format(_l.NumberOfFontTags, Utilities.CountTagInText(allTextToLower, "(); - for (int i = 0; i < _subtitle.Paragraphs.Count; i++) - { - var p = _subtitle.Paragraphs[i]; - if (Math.Abs(p.Duration.TotalMilliseconds - duration) < 0.01) - { - if (indices.Count >= NumberOfLinesToShow) - { - indices.Add("..."); - break; - } - indices.Add("#" + (i + 1).ToString(CultureInfo.InvariantCulture)); - } - } - return string.Join(", ", indices); - } - - private string GetIndicesWithCps(double cps) - { - var indices = new List(); - for (int i = 0; i < _subtitle.Paragraphs.Count; i++) - { - var p = _subtitle.Paragraphs[i]; - if (Math.Abs(Utilities.GetCharactersPerSecond(p) - cps) < 0.01) - { - if (indices.Count >= NumberOfLinesToShow) - { - indices.Add("..."); - break; - } - indices.Add("#" + (i + 1).ToString(CultureInfo.InvariantCulture)); - } - } - return string.Join(", ", indices); - } - - private string GetIndicesWithLength(int length) - { - var indices = new List(); - for (int i = 0; i < _subtitle.Paragraphs.Count; i++) - { - var p = _subtitle.Paragraphs[i]; - if (GetLineLength(p) == length) - { - if (indices.Count >= NumberOfLinesToShow) - { - indices.Add("..."); - break; - } - indices.Add("#" + (i + 1).ToString(CultureInfo.InvariantCulture)); - } - } - return string.Join(", ", indices); - } - - private string GetIndicesWithSingleLineLength(int length) - { - var indices = new List(); - for (int i = 0; i < _subtitle.Paragraphs.Count; i++) - { - var p = _subtitle.Paragraphs[i]; - foreach (var line in p.Text.SplitToLines()) - { - if (GetSingleLineLength(line) == length) - { - if (indices.Count >= NumberOfLinesToShow) - { - indices.Add("..."); - return string.Join(", ", indices); - } - indices.Add("#" + (i + 1).ToString(CultureInfo.InvariantCulture)); - break; - } - } - } - return string.Join(", ", indices); - } - - private string GetIndicesWithSingleLineWidth(int width) - { - var indices = new List(); - for (int i = 0; i < _subtitle.Paragraphs.Count; i++) - { - var p = _subtitle.Paragraphs[i]; - foreach (var line in p.Text.SplitToLines()) - { - if (GetSingleLineWidth(line) == width) - { - if (indices.Count >= NumberOfLinesToShow) - { - indices.Add("..."); - return string.Join(", ", indices); - } - indices.Add("#" + (i + 1).ToString(CultureInfo.InvariantCulture)); - break; - } - } - } - return string.Join(", ", indices); - } - - private void Statistics_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - else if (e.KeyData == (Keys.Control | Keys.C)) - { - Clipboard.SetText(string.Format(WriteFormat, _general, _mostUsedWords, _mostUsedLines), TextDataFormat.UnicodeText); - } - } - - private void MostUsedWordsAdd(Dictionary hashtable, string input) - { - var text = input; - if (text.Contains("< ")) - { - text = HtmlUtil.FixInvalidItalicTags(text); - } - - text = StripHtmlTags(text); - - var idx = text.IndexOf("= 0) - { - var endIdx = text.IndexOf('>', idx + 5); - if (endIdx < idx) - { - error = true; - break; - } - endIdx++; - text = text.Remove(idx, endIdx - idx); - idx = text.IndexOf("", "."); - } - - foreach (var word in Utilities.RemoveSsaTags(text).Split(ExpectedChars, StringSplitOptions.RemoveEmptyEntries)) - { - var s = word.Trim(); - if (s.Length > 1 && hashtable.ContainsKey(s)) - { - hashtable[s]++; - } - else if (s.Length > 1) - { - hashtable.Add(s, 1); - } - } - } - - private static void MostUsedLinesAdd(Dictionary hashtable, string input) - { - var text = StripHtmlTags(input) - .Replace('!', '.') - .Replace('?', '.') - .Replace("...", ".") - .Replace("..", ".") - .Replace('-', ' ') - .FixExtraSpaces(); - - text = Utilities.RemoveSsaTags(text); - - foreach (string line in text.Split('.')) - { - var s = line.Trim(); - if (hashtable.ContainsKey(s)) - { - hashtable[s]++; - } - else if (s.Length > 0 && s.Contains(' ')) - { - hashtable.Add(s, 1); - } - } - } - - private static string StripHtmlTags(string input) - { - var text = input.Trim('\'').Replace("\"", string.Empty); - - if (text.Length < 8) - { - return text; - } - - text = text.Replace("", string.Empty); - text = text.Replace("", "."); - text = text.Replace("", string.Empty); - text = text.Replace("", "."); - text = text.Replace("", string.Empty); - text = text.Replace("", "."); - text = text.Replace("", string.Empty); - text = text.Replace("", "."); - text = text.Replace("", string.Empty); - text = text.Replace("", "."); - text = text.Replace("", string.Empty); - text = text.Replace("", "."); - return text; - } - - private void CalculateWordStatistics() - { - var hashtable = new Dictionary(new StingOrdinalComparer()); - - foreach (Paragraph p in _subtitle.Paragraphs) - { - MostUsedWordsAdd(hashtable, p.Text); - _totalWords += p.Text.CountWords(); - } - - var sortedTable = new SortedDictionary(new StingOrdinalComparer()); - foreach (KeyValuePair item in hashtable) - { - if (item.Value > 1) - { - sortedTable.Add($"{item.Value:0000}" + "_" + item.Key, item.Value + ": " + item.Key); - } - } - - var sb = new StringBuilder(); - if (sortedTable.Count > 0) - { - var temp = string.Empty; - foreach (KeyValuePair item in sortedTable) - { - temp = item.Value + Environment.NewLine + temp; - } - sb.AppendLine(temp); - } - else - { - sb.AppendLine(_l.NothingFound); - } - _mostUsedWords = sb.ToString(); - } - - private void CalculateMostUsedLines() - { - var hashtable = new Dictionary(); - - foreach (Paragraph p in _subtitle.Paragraphs) - { - MostUsedLinesAdd(hashtable, p.Text.Replace(Environment.NewLine, " ").Replace(" ", " ")); - } - - var sortedTable = new SortedDictionary(new StingOrdinalComparer()); - foreach (KeyValuePair item in hashtable) - { - if (item.Value > 1) - { - sortedTable.Add($"{item.Value:0000}" + "_" + item.Key, item.Value + ": " + item.Key); - } - } - - var sb = new StringBuilder(); - if (sortedTable.Count > 0) - { - var temp = string.Empty; - foreach (KeyValuePair item in sortedTable) - { - temp = item.Value + Environment.NewLine + temp; - } - sb.AppendLine(temp); - } - else - { - sb.AppendLine(_l.NothingFound); - } - _mostUsedLines = sb.ToString(); - } - - private void buttonOK_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.OK; - } - - private void buttonExport_Click(object sender, EventArgs e) - { - string preViewFileName = Path.GetFileNameWithoutExtension(_fileName) + ".Stats"; - using (var saveDialog = new SaveFileDialog { FileName = preViewFileName, Filter = Configuration.Settings.Language.Main.TextFiles + " (*.txt)|*.txt|NFO files (*.nfo)|*.nfo" }) - { - if (saveDialog.ShowDialog(this) == DialogResult.OK) - { - string fileName = saveDialog.FileName; - var statistic = string.Format(WriteFormat, _general, _mostUsedWords, _mostUsedLines); - File.WriteAllText(fileName, statistic); - } - } - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.SubtitleFormats; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Text; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class Statistics : PositionAndSizeForm + { + + public class StingOrdinalComparer : IEqualityComparer, IComparer + { + public bool Equals(string x, string y) + { + if (x == null) + { + return y == null; + } + + return x.Equals(y, StringComparison.Ordinal); + } + + public int GetHashCode(string x) + { + return x.GetHashCode(); + } + + public int Compare(string x, string y) + { + return string.CompareOrdinal(x, y); + } + } + + private readonly Subtitle _subtitle; + private readonly SubtitleFormat _format; + private readonly LanguageStructure.Statistics _l; + private string _mostUsedLines; + private string _general; + private int _totalWords; + private string _mostUsedWords; + private const string WriteFormat = @"File generated by: Subtitle Edit +https://www.nikse.dk/subtitleedit/ +https://github.com/SubtitleEdit/subtitleedit +============================= General ============================= +{0} +============================= Most Used Words ============================= +{1} +============================= Most Used Lines ============================= +{2}"; + private readonly string _fileName; + + private static readonly char[] ExpectedChars = { '♪', '♫', '"', '(', ')', '[', ']', ' ', ',', '!', '?', '.', ':', ';', '-', '_', '@', '<', '>', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '،', '؟', '؛' }; + + public Statistics(Subtitle subtitle, string fileName, SubtitleFormat format) + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + _subtitle = subtitle; + _format = format; + _fileName = fileName; + + _l = Configuration.Settings.Language.Statistics; + Text = string.IsNullOrEmpty(fileName) ? _l.Title : string.Format(_l.TitleWithFileName, fileName); + groupBoxGeneral.Text = _l.GeneralStatistics; + groupBoxMostUsed.Text = _l.MostUsed; + labelMostUsedWords.Text = _l.MostUsedWords; + labelMostUsedLines.Text = _l.MostUsedLines; + buttonExport.Text = _l.Export; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + UiUtil.FixLargeFonts(this, buttonOK); + + CalculateWordStatistics(); + CalculateGeneralStatistics(); + textBoxGeneral.Text = _general; + textBoxGeneral.SelectionStart = 0; + textBoxGeneral.SelectionLength = 0; + textBoxGeneral.ScrollToCaret(); + textBoxMostUsedWords.Text = _mostUsedWords; + + CalculateMostUsedLines(); + textBoxMostUsedLines.Text = _mostUsedLines; + } + + private void CalculateGeneralStatistics() + { + if (_subtitle == null || _subtitle.Paragraphs.Count == 0) + { + textBoxGeneral.Text = _l.NothingFound; + return; + } + + var allText = new StringBuilder(); + int minimumLineLength = 99999999; + int maximumLineLength = 0; + long totalLineLength = 0; + int minimumSingleLineLength = 99999999; + int maximumSingleLineLength = 0; + long totalSingleLineLength = 0; + long totalSingleLines = 0; + int minimumSingleLineWidth = 99999999; + int maximumSingleLineWidth = 0; + long totalSingleLineWidth = 0; + double minimumDuration = 100000000; + double maximumDuration = 0; + double totalDuration = 0; + double minimumCharsSec = 100000000; + double maximumCharsSec = 0; + double totalCharsSec = 0; + foreach (Paragraph p in _subtitle.Paragraphs) + { + allText.Append(p.Text); + + int len = GetLineLength(p); + minimumLineLength = Math.Min(minimumLineLength, len); + maximumLineLength = Math.Max(len, maximumLineLength); + totalLineLength += len; + + double duration = p.Duration.TotalMilliseconds; + minimumDuration = Math.Min(duration, minimumDuration); + maximumDuration = Math.Max(duration, maximumDuration); + totalDuration += duration; + + var charsSec = Utilities.GetCharactersPerSecond(p); + minimumCharsSec = Math.Min(charsSec, minimumCharsSec); + maximumCharsSec = Math.Max(charsSec, maximumCharsSec); + totalCharsSec += charsSec; + + foreach (string line in p.Text.SplitToLines()) + { + var l = GetSingleLineLength(line); + minimumSingleLineLength = Math.Min(l, minimumSingleLineLength); + maximumSingleLineLength = Math.Max(l, maximumSingleLineLength); + totalSingleLineLength += l; + + if (Configuration.Settings.Tools.ListViewSyntaxColorWideLines) + { + var w = GetSingleLineWidth(line); + minimumSingleLineWidth = Math.Min(w, minimumSingleLineWidth); + maximumSingleLineWidth = Math.Max(w, maximumSingleLineWidth); + totalSingleLineWidth += w; + } + + totalSingleLines++; + } + } + + var sb = new StringBuilder(); + int sourceLength = _subtitle.ToText(_format).Length; + var allTextToLower = allText.ToString().ToLowerInvariant(); + + sb.AppendLine(string.Format(_l.NumberOfLinesX, _subtitle.Paragraphs.Count)); + sb.AppendLine(string.Format(_l.LengthInFormatXinCharactersY, _format.FriendlyName, sourceLength)); + sb.AppendLine(string.Format(_l.NumberOfCharactersInTextOnly, allText.ToString().CountCharacters(false, Configuration.Settings.General.IgnoreArabicDiacritics))); + sb.AppendLine(string.Format(_l.TotalDuration, new TimeCode(totalDuration).ToDisplayString())); + sb.AppendLine(string.Format(_l.TotalCharsPerSecond, allText.ToString().CountCharacters(false, Configuration.Settings.General.IgnoreArabicDiacritics) / (totalDuration / TimeCode.BaseUnit))); + sb.AppendLine(string.Format(_l.TotalWords, _totalWords)); + sb.AppendLine(string.Format(_l.NumberOfItalicTags, Utilities.CountTagInText(allTextToLower, ""))); + sb.AppendLine(string.Format(_l.NumberOfBoldTags, Utilities.CountTagInText(allTextToLower, ""))); + sb.AppendLine(string.Format(_l.NumberOfUnderlineTags, Utilities.CountTagInText(allTextToLower, ""))); + sb.AppendLine(string.Format(_l.NumberOfFontTags, Utilities.CountTagInText(allTextToLower, "(); + for (int i = 0; i < _subtitle.Paragraphs.Count; i++) + { + var p = _subtitle.Paragraphs[i]; + if (Math.Abs(p.Duration.TotalMilliseconds - duration) < 0.01) + { + if (indices.Count >= NumberOfLinesToShow) + { + indices.Add("..."); + break; + } + indices.Add("#" + (i + 1).ToString(CultureInfo.InvariantCulture)); + } + } + return string.Join(", ", indices); + } + + private string GetIndicesWithCps(double cps) + { + var indices = new List(); + for (int i = 0; i < _subtitle.Paragraphs.Count; i++) + { + var p = _subtitle.Paragraphs[i]; + if (Math.Abs(Utilities.GetCharactersPerSecond(p) - cps) < 0.01) + { + if (indices.Count >= NumberOfLinesToShow) + { + indices.Add("..."); + break; + } + indices.Add("#" + (i + 1).ToString(CultureInfo.InvariantCulture)); + } + } + return string.Join(", ", indices); + } + + private string GetIndicesWithLength(int length) + { + var indices = new List(); + for (int i = 0; i < _subtitle.Paragraphs.Count; i++) + { + var p = _subtitle.Paragraphs[i]; + if (GetLineLength(p) == length) + { + if (indices.Count >= NumberOfLinesToShow) + { + indices.Add("..."); + break; + } + indices.Add("#" + (i + 1).ToString(CultureInfo.InvariantCulture)); + } + } + return string.Join(", ", indices); + } + + private string GetIndicesWithSingleLineLength(int length) + { + var indices = new List(); + for (int i = 0; i < _subtitle.Paragraphs.Count; i++) + { + var p = _subtitle.Paragraphs[i]; + foreach (var line in p.Text.SplitToLines()) + { + if (GetSingleLineLength(line) == length) + { + if (indices.Count >= NumberOfLinesToShow) + { + indices.Add("..."); + return string.Join(", ", indices); + } + indices.Add("#" + (i + 1).ToString(CultureInfo.InvariantCulture)); + break; + } + } + } + return string.Join(", ", indices); + } + + private string GetIndicesWithSingleLineWidth(int width) + { + var indices = new List(); + for (int i = 0; i < _subtitle.Paragraphs.Count; i++) + { + var p = _subtitle.Paragraphs[i]; + foreach (var line in p.Text.SplitToLines()) + { + if (GetSingleLineWidth(line) == width) + { + if (indices.Count >= NumberOfLinesToShow) + { + indices.Add("..."); + return string.Join(", ", indices); + } + indices.Add("#" + (i + 1).ToString(CultureInfo.InvariantCulture)); + break; + } + } + } + return string.Join(", ", indices); + } + + private void Statistics_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + else if (e.KeyData == (Keys.Control | Keys.C)) + { + Clipboard.SetText(string.Format(WriteFormat, _general, _mostUsedWords, _mostUsedLines), TextDataFormat.UnicodeText); + } + } + + private void MostUsedWordsAdd(Dictionary hashtable, string input) + { + var text = input; + if (text.Contains("< ")) + { + text = HtmlUtil.FixInvalidItalicTags(text); + } + + text = StripHtmlTags(text); + + var idx = text.IndexOf("= 0) + { + var endIdx = text.IndexOf('>', idx + 5); + if (endIdx < idx) + { + error = true; + break; + } + endIdx++; + text = text.Remove(idx, endIdx - idx); + idx = text.IndexOf("", "."); + } + + foreach (var word in Utilities.RemoveSsaTags(text).Split(ExpectedChars, StringSplitOptions.RemoveEmptyEntries)) + { + var s = word.Trim(); + if (s.Length > 1 && hashtable.ContainsKey(s)) + { + hashtable[s]++; + } + else if (s.Length > 1) + { + hashtable.Add(s, 1); + } + } + } + + private static void MostUsedLinesAdd(Dictionary hashtable, string input) + { + var text = StripHtmlTags(input) + .Replace('!', '.') + .Replace('?', '.') + .Replace("...", ".") + .Replace("..", ".") + .Replace('-', ' ') + .FixExtraSpaces(); + + text = Utilities.RemoveSsaTags(text); + + foreach (string line in text.Split('.')) + { + var s = line.Trim(); + if (hashtable.ContainsKey(s)) + { + hashtable[s]++; + } + else if (s.Length > 0 && s.Contains(' ')) + { + hashtable.Add(s, 1); + } + } + } + + private static string StripHtmlTags(string input) + { + var text = input.Trim('\'').Replace("\"", string.Empty); + + if (text.Length < 8) + { + return text; + } + + text = text.Replace("", string.Empty); + text = text.Replace("", "."); + text = text.Replace("", string.Empty); + text = text.Replace("", "."); + text = text.Replace("", string.Empty); + text = text.Replace("", "."); + text = text.Replace("", string.Empty); + text = text.Replace("", "."); + text = text.Replace("", string.Empty); + text = text.Replace("", "."); + text = text.Replace("", string.Empty); + text = text.Replace("", "."); + return text; + } + + private void CalculateWordStatistics() + { + var hashtable = new Dictionary(new StingOrdinalComparer()); + + foreach (Paragraph p in _subtitle.Paragraphs) + { + MostUsedWordsAdd(hashtable, p.Text); + _totalWords += p.Text.CountWords(); + } + + var sortedTable = new SortedDictionary(new StingOrdinalComparer()); + foreach (KeyValuePair item in hashtable) + { + if (item.Value > 1) + { + sortedTable.Add($"{item.Value:0000}" + "_" + item.Key, item.Value + ": " + item.Key); + } + } + + var sb = new StringBuilder(); + if (sortedTable.Count > 0) + { + var temp = string.Empty; + foreach (KeyValuePair item in sortedTable) + { + temp = item.Value + Environment.NewLine + temp; + } + sb.AppendLine(temp); + } + else + { + sb.AppendLine(_l.NothingFound); + } + _mostUsedWords = sb.ToString(); + } + + private void CalculateMostUsedLines() + { + var hashtable = new Dictionary(); + + foreach (Paragraph p in _subtitle.Paragraphs) + { + MostUsedLinesAdd(hashtable, p.Text.Replace(Environment.NewLine, " ").Replace(" ", " ")); + } + + var sortedTable = new SortedDictionary(new StingOrdinalComparer()); + foreach (KeyValuePair item in hashtable) + { + if (item.Value > 1) + { + sortedTable.Add($"{item.Value:0000}" + "_" + item.Key, item.Value + ": " + item.Key); + } + } + + var sb = new StringBuilder(); + if (sortedTable.Count > 0) + { + var temp = string.Empty; + foreach (KeyValuePair item in sortedTable) + { + temp = item.Value + Environment.NewLine + temp; + } + sb.AppendLine(temp); + } + else + { + sb.AppendLine(_l.NothingFound); + } + _mostUsedLines = sb.ToString(); + } + + private void buttonOK_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.OK; + } + + private void buttonExport_Click(object sender, EventArgs e) + { + string preViewFileName = Path.GetFileNameWithoutExtension(_fileName) + ".Stats"; + using (var saveDialog = new SaveFileDialog { FileName = preViewFileName, Filter = Configuration.Settings.Language.Main.TextFiles + " (*.txt)|*.txt|NFO files (*.nfo)|*.nfo" }) + { + if (saveDialog.ShowDialog(this) == DialogResult.OK) + { + string fileName = saveDialog.FileName; + var statistic = string.Format(WriteFormat, _general, _mostUsedWords, _mostUsedLines); + File.WriteAllText(fileName, statistic); + } + } + } + + } +} diff --git a/src/Forms/Statistics.resx b/src/ui/Forms/Statistics.resx similarity index 97% rename from src/Forms/Statistics.resx rename to src/ui/Forms/Statistics.resx index 29dcb1b3a..1af7de150 100644 --- a/src/Forms/Statistics.resx +++ b/src/ui/Forms/Statistics.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Forms/StatusLog.Designer.cs b/src/ui/Forms/StatusLog.Designer.cs similarity index 97% rename from src/Forms/StatusLog.Designer.cs rename to src/ui/Forms/StatusLog.Designer.cs index 506b7c5d7..a2f63afb1 100644 --- a/src/Forms/StatusLog.Designer.cs +++ b/src/ui/Forms/StatusLog.Designer.cs @@ -1,95 +1,95 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class StatusLog - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.buttonOK = new System.Windows.Forms.Button(); - this.textBoxStatusLog = new System.Windows.Forms.TextBox(); - this.timer1 = new System.Windows.Forms.Timer(this.components); - this.SuspendLayout(); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; - this.buttonOK.Location = new System.Drawing.Point(877, 407); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 1; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // textBoxStatusLog - // - this.textBoxStatusLog.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.textBoxStatusLog.Location = new System.Drawing.Point(13, 13); - this.textBoxStatusLog.Multiline = true; - this.textBoxStatusLog.Name = "textBoxStatusLog"; - this.textBoxStatusLog.ReadOnly = true; - this.textBoxStatusLog.ScrollBars = System.Windows.Forms.ScrollBars.Both; - this.textBoxStatusLog.Size = new System.Drawing.Size(939, 388); - this.textBoxStatusLog.TabIndex = 2; - // - // timer1 - // - this.timer1.Interval = 1000; - this.timer1.Tick += new System.EventHandler(this.timer1_Tick); - // - // StatusLog - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(964, 440); - this.Controls.Add(this.textBoxStatusLog); - this.Controls.Add(this.buttonOK); - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(400, 200); - this.Name = "StatusLog"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Status messages"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.StatusLog_KeyDown); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.TextBox textBoxStatusLog; - private System.Windows.Forms.Timer timer1; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class StatusLog + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.buttonOK = new System.Windows.Forms.Button(); + this.textBoxStatusLog = new System.Windows.Forms.TextBox(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.SuspendLayout(); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; + this.buttonOK.Location = new System.Drawing.Point(877, 407); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 1; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // textBoxStatusLog + // + this.textBoxStatusLog.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxStatusLog.Location = new System.Drawing.Point(13, 13); + this.textBoxStatusLog.Multiline = true; + this.textBoxStatusLog.Name = "textBoxStatusLog"; + this.textBoxStatusLog.ReadOnly = true; + this.textBoxStatusLog.ScrollBars = System.Windows.Forms.ScrollBars.Both; + this.textBoxStatusLog.Size = new System.Drawing.Size(939, 388); + this.textBoxStatusLog.TabIndex = 2; + // + // timer1 + // + this.timer1.Interval = 1000; + this.timer1.Tick += new System.EventHandler(this.timer1_Tick); + // + // StatusLog + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(964, 440); + this.Controls.Add(this.textBoxStatusLog); + this.Controls.Add(this.buttonOK); + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(400, 200); + this.Name = "StatusLog"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Status messages"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.StatusLog_KeyDown); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.TextBox textBoxStatusLog; + private System.Windows.Forms.Timer timer1; + } } \ No newline at end of file diff --git a/src/Forms/StatusLog.cs b/src/ui/Forms/StatusLog.cs similarity index 96% rename from src/Forms/StatusLog.cs rename to src/ui/Forms/StatusLog.cs index 56cfc973f..5c561aba0 100644 --- a/src/Forms/StatusLog.cs +++ b/src/ui/Forms/StatusLog.cs @@ -1,60 +1,60 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System.Collections.Generic; -using System.Text; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class StatusLog : PositionAndSizeForm - { - private readonly List _log; - private int _logCount = -1; - - public StatusLog(List log) - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - Text = Configuration.Settings.Language.Main.StatusLog; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - _log = log; - timer1_Tick(null, null); - } - - private void StatusLog_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - buttonOK_Click(null, null); - } - else if (e.KeyCode == Keys.Delete && e.Modifiers == Keys.Control) - { - _log.Clear(); - timer1_Tick(null, null); - } - } - - private void timer1_Tick(object sender, System.EventArgs e) - { - timer1.Stop(); - if (_logCount != _log.Count) - { - _logCount = _log.Count; - var sb = new StringBuilder(); - for (int i = _logCount - 1; i >= 0; i--) - { - sb.AppendLine(_log[i]); - } - textBoxStatusLog.Text = sb.ToString(); - } - timer1.Start(); - } - - private void buttonOK_Click(object sender, System.EventArgs e) - { - Close(); - } - } +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class StatusLog : PositionAndSizeForm + { + private readonly List _log; + private int _logCount = -1; + + public StatusLog(List log) + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + Text = Configuration.Settings.Language.Main.StatusLog; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + _log = log; + timer1_Tick(null, null); + } + + private void StatusLog_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + buttonOK_Click(null, null); + } + else if (e.KeyCode == Keys.Delete && e.Modifiers == Keys.Control) + { + _log.Clear(); + timer1_Tick(null, null); + } + } + + private void timer1_Tick(object sender, System.EventArgs e) + { + timer1.Stop(); + if (_logCount != _log.Count) + { + _logCount = _log.Count; + var sb = new StringBuilder(); + for (int i = _logCount - 1; i >= 0; i--) + { + sb.AppendLine(_log[i]); + } + textBoxStatusLog.Text = sb.ToString(); + } + timer1.Start(); + } + + private void buttonOK_Click(object sender, System.EventArgs e) + { + Close(); + } + } } \ No newline at end of file diff --git a/src/Forms/StatusLog.resx b/src/ui/Forms/StatusLog.resx similarity index 97% rename from src/Forms/StatusLog.resx rename to src/ui/Forms/StatusLog.resx index aac33d5a2..1f666f268 100644 --- a/src/Forms/StatusLog.resx +++ b/src/ui/Forms/StatusLog.resx @@ -1,123 +1,123 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + \ No newline at end of file diff --git a/src/Forms/Styles/StylesForm.cs b/src/ui/Forms/Styles/StylesForm.cs similarity index 100% rename from src/Forms/Styles/StylesForm.cs rename to src/ui/Forms/Styles/StylesForm.cs diff --git a/src/Forms/Styles/SubStationAlphaStyles.Designer.cs b/src/ui/Forms/Styles/SubStationAlphaStyles.Designer.cs similarity index 100% rename from src/Forms/Styles/SubStationAlphaStyles.Designer.cs rename to src/ui/Forms/Styles/SubStationAlphaStyles.Designer.cs diff --git a/src/Forms/Styles/SubStationAlphaStyles.cs b/src/ui/Forms/Styles/SubStationAlphaStyles.cs similarity index 100% rename from src/Forms/Styles/SubStationAlphaStyles.cs rename to src/ui/Forms/Styles/SubStationAlphaStyles.cs diff --git a/src/Forms/Styles/SubStationAlphaStyles.resx b/src/ui/Forms/Styles/SubStationAlphaStyles.resx similarity index 100% rename from src/Forms/Styles/SubStationAlphaStyles.resx rename to src/ui/Forms/Styles/SubStationAlphaStyles.resx diff --git a/src/Forms/Styles/SubStationAlphaStylesBatchConvert.Designer.cs b/src/ui/Forms/Styles/SubStationAlphaStylesBatchConvert.Designer.cs similarity index 100% rename from src/Forms/Styles/SubStationAlphaStylesBatchConvert.Designer.cs rename to src/ui/Forms/Styles/SubStationAlphaStylesBatchConvert.Designer.cs diff --git a/src/Forms/Styles/SubStationAlphaStylesBatchConvert.cs b/src/ui/Forms/Styles/SubStationAlphaStylesBatchConvert.cs similarity index 100% rename from src/Forms/Styles/SubStationAlphaStylesBatchConvert.cs rename to src/ui/Forms/Styles/SubStationAlphaStylesBatchConvert.cs diff --git a/src/Forms/Styles/SubStationAlphaStylesBatchConvert.resx b/src/ui/Forms/Styles/SubStationAlphaStylesBatchConvert.resx similarity index 100% rename from src/Forms/Styles/SubStationAlphaStylesBatchConvert.resx rename to src/ui/Forms/Styles/SubStationAlphaStylesBatchConvert.resx diff --git a/src/Forms/Styles/SubStationAlphaStylesExport.Designer.cs b/src/ui/Forms/Styles/SubStationAlphaStylesExport.Designer.cs similarity index 100% rename from src/Forms/Styles/SubStationAlphaStylesExport.Designer.cs rename to src/ui/Forms/Styles/SubStationAlphaStylesExport.Designer.cs diff --git a/src/Forms/Styles/SubStationAlphaStylesExport.cs b/src/ui/Forms/Styles/SubStationAlphaStylesExport.cs similarity index 100% rename from src/Forms/Styles/SubStationAlphaStylesExport.cs rename to src/ui/Forms/Styles/SubStationAlphaStylesExport.cs diff --git a/src/Forms/Styles/SubStationAlphaStylesExport.resx b/src/ui/Forms/Styles/SubStationAlphaStylesExport.resx similarity index 100% rename from src/Forms/Styles/SubStationAlphaStylesExport.resx rename to src/ui/Forms/Styles/SubStationAlphaStylesExport.resx diff --git a/src/Forms/Styles/TimedTextStyles.Designer.cs b/src/ui/Forms/Styles/TimedTextStyles.Designer.cs similarity index 100% rename from src/Forms/Styles/TimedTextStyles.Designer.cs rename to src/ui/Forms/Styles/TimedTextStyles.Designer.cs diff --git a/src/Forms/Styles/TimedTextStyles.cs b/src/ui/Forms/Styles/TimedTextStyles.cs similarity index 100% rename from src/Forms/Styles/TimedTextStyles.cs rename to src/ui/Forms/Styles/TimedTextStyles.cs diff --git a/src/Forms/Styles/TimedTextStyles.resx b/src/ui/Forms/Styles/TimedTextStyles.resx similarity index 100% rename from src/Forms/Styles/TimedTextStyles.resx rename to src/ui/Forms/Styles/TimedTextStyles.resx diff --git a/src/Forms/SubStationAlphaProperties.Designer.cs b/src/ui/Forms/SubStationAlphaProperties.Designer.cs similarity index 98% rename from src/Forms/SubStationAlphaProperties.Designer.cs rename to src/ui/Forms/SubStationAlphaProperties.Designer.cs index 8ef1391a9..8c2a8a0e2 100644 --- a/src/Forms/SubStationAlphaProperties.Designer.cs +++ b/src/ui/Forms/SubStationAlphaProperties.Designer.cs @@ -1,455 +1,455 @@ -namespace Nikse.SubtitleEdit.Forms -{ - partial class SubStationAlphaProperties - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.groupBoxScript = new System.Windows.Forms.GroupBox(); - this.labelUpdateDetails = new System.Windows.Forms.Label(); - this.labelUpdatedBy = new System.Windows.Forms.Label(); - this.textBoxSyncPoint = new System.Windows.Forms.TextBox(); - this.textBoxUpdatedBy = new System.Windows.Forms.TextBox(); - this.textBoxUpdateDetails = new System.Windows.Forms.TextBox(); - this.labelSyncPoint = new System.Windows.Forms.Label(); - this.labelTiming = new System.Windows.Forms.Label(); - this.labelEditing = new System.Windows.Forms.Label(); - this.labelTranslation = new System.Windows.Forms.Label(); - this.textBoxTranslation = new System.Windows.Forms.TextBox(); - this.textBoxEditing = new System.Windows.Forms.TextBox(); - this.textBoxTiming = new System.Windows.Forms.TextBox(); - this.textBoxOriginalScript = new System.Windows.Forms.TextBox(); - this.labelOriginalScript = new System.Windows.Forms.Label(); - this.textBoxTitle = new System.Windows.Forms.TextBox(); - this.labelTitle = new System.Windows.Forms.Label(); - this.groupBoxOptions = new System.Windows.Forms.GroupBox(); - this.checkBoxScaleBorderAndShadow = new System.Windows.Forms.CheckBox(); - this.comboBoxCollision = new System.Windows.Forms.ComboBox(); - this.labelCollision = new System.Windows.Forms.Label(); - this.comboBoxWrapStyle = new System.Windows.Forms.ComboBox(); - this.labelWrapStyle = new System.Windows.Forms.Label(); - this.groupBoxResolution = new System.Windows.Forms.GroupBox(); - this.labelVideoResolution = new System.Windows.Forms.Label(); - this.numericUpDownVideoHeight = new System.Windows.Forms.NumericUpDown(); - this.buttonGetResolutionFromVideo = new System.Windows.Forms.Button(); - this.labelX = new System.Windows.Forms.Label(); - this.numericUpDownVideoWidth = new System.Windows.Forms.NumericUpDown(); - this.buttonOK = new System.Windows.Forms.Button(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); - this.groupBoxScript.SuspendLayout(); - this.groupBoxOptions.SuspendLayout(); - this.groupBoxResolution.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownVideoHeight)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownVideoWidth)).BeginInit(); - this.SuspendLayout(); - // - // groupBoxScript - // - this.groupBoxScript.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxScript.Controls.Add(this.labelUpdateDetails); - this.groupBoxScript.Controls.Add(this.labelUpdatedBy); - this.groupBoxScript.Controls.Add(this.textBoxSyncPoint); - this.groupBoxScript.Controls.Add(this.textBoxUpdatedBy); - this.groupBoxScript.Controls.Add(this.textBoxUpdateDetails); - this.groupBoxScript.Controls.Add(this.labelSyncPoint); - this.groupBoxScript.Controls.Add(this.labelTiming); - this.groupBoxScript.Controls.Add(this.labelEditing); - this.groupBoxScript.Controls.Add(this.labelTranslation); - this.groupBoxScript.Controls.Add(this.textBoxTranslation); - this.groupBoxScript.Controls.Add(this.textBoxEditing); - this.groupBoxScript.Controls.Add(this.textBoxTiming); - this.groupBoxScript.Controls.Add(this.textBoxOriginalScript); - this.groupBoxScript.Controls.Add(this.labelOriginalScript); - this.groupBoxScript.Controls.Add(this.textBoxTitle); - this.groupBoxScript.Controls.Add(this.labelTitle); - this.groupBoxScript.Location = new System.Drawing.Point(12, 12); - this.groupBoxScript.Name = "groupBoxScript"; - this.groupBoxScript.Size = new System.Drawing.Size(471, 233); - this.groupBoxScript.TabIndex = 0; - this.groupBoxScript.TabStop = false; - this.groupBoxScript.Text = "Script"; - // - // labelUpdateDetails - // - this.labelUpdateDetails.AutoSize = true; - this.labelUpdateDetails.Location = new System.Drawing.Point(7, 205); - this.labelUpdateDetails.Name = "labelUpdateDetails"; - this.labelUpdateDetails.Size = new System.Drawing.Size(75, 13); - this.labelUpdateDetails.TabIndex = 15; - this.labelUpdateDetails.Text = "Update details"; - // - // labelUpdatedBy - // - this.labelUpdatedBy.AutoSize = true; - this.labelUpdatedBy.Location = new System.Drawing.Point(6, 179); - this.labelUpdatedBy.Name = "labelUpdatedBy"; - this.labelUpdatedBy.Size = new System.Drawing.Size(62, 13); - this.labelUpdatedBy.TabIndex = 14; - this.labelUpdatedBy.Text = "Updated by"; - // - // textBoxSyncPoint - // - this.textBoxSyncPoint.Location = new System.Drawing.Point(191, 150); - this.textBoxSyncPoint.Name = "textBoxSyncPoint"; - this.textBoxSyncPoint.Size = new System.Drawing.Size(263, 20); - this.textBoxSyncPoint.TabIndex = 5; - // - // textBoxUpdatedBy - // - this.textBoxUpdatedBy.Location = new System.Drawing.Point(191, 176); - this.textBoxUpdatedBy.Name = "textBoxUpdatedBy"; - this.textBoxUpdatedBy.Size = new System.Drawing.Size(263, 20); - this.textBoxUpdatedBy.TabIndex = 6; - // - // textBoxUpdateDetails - // - this.textBoxUpdateDetails.Location = new System.Drawing.Point(191, 202); - this.textBoxUpdateDetails.Name = "textBoxUpdateDetails"; - this.textBoxUpdateDetails.Size = new System.Drawing.Size(263, 20); - this.textBoxUpdateDetails.TabIndex = 7; - // - // labelSyncPoint - // - this.labelSyncPoint.AutoSize = true; - this.labelSyncPoint.Location = new System.Drawing.Point(6, 153); - this.labelSyncPoint.Name = "labelSyncPoint"; - this.labelSyncPoint.Size = new System.Drawing.Size(63, 13); - this.labelSyncPoint.TabIndex = 10; - this.labelSyncPoint.Text = "Synch point"; - // - // labelTiming - // - this.labelTiming.AutoSize = true; - this.labelTiming.Location = new System.Drawing.Point(6, 127); - this.labelTiming.Name = "labelTiming"; - this.labelTiming.Size = new System.Drawing.Size(38, 13); - this.labelTiming.TabIndex = 9; - this.labelTiming.Text = "Timing"; - // - // labelEditing - // - this.labelEditing.AutoSize = true; - this.labelEditing.Location = new System.Drawing.Point(6, 101); - this.labelEditing.Name = "labelEditing"; - this.labelEditing.Size = new System.Drawing.Size(39, 13); - this.labelEditing.TabIndex = 8; - this.labelEditing.Text = "Editing"; - // - // labelTranslation - // - this.labelTranslation.AutoSize = true; - this.labelTranslation.Location = new System.Drawing.Point(6, 75); - this.labelTranslation.Name = "labelTranslation"; - this.labelTranslation.Size = new System.Drawing.Size(59, 13); - this.labelTranslation.TabIndex = 7; - this.labelTranslation.Text = "Translation"; - // - // textBoxTranslation - // - this.textBoxTranslation.Location = new System.Drawing.Point(191, 72); - this.textBoxTranslation.Name = "textBoxTranslation"; - this.textBoxTranslation.Size = new System.Drawing.Size(263, 20); - this.textBoxTranslation.TabIndex = 2; - // - // textBoxEditing - // - this.textBoxEditing.Location = new System.Drawing.Point(191, 98); - this.textBoxEditing.Name = "textBoxEditing"; - this.textBoxEditing.Size = new System.Drawing.Size(263, 20); - this.textBoxEditing.TabIndex = 3; - // - // textBoxTiming - // - this.textBoxTiming.Location = new System.Drawing.Point(191, 124); - this.textBoxTiming.Name = "textBoxTiming"; - this.textBoxTiming.Size = new System.Drawing.Size(263, 20); - this.textBoxTiming.TabIndex = 4; - // - // textBoxOriginalScript - // - this.textBoxOriginalScript.Location = new System.Drawing.Point(191, 46); - this.textBoxOriginalScript.Name = "textBoxOriginalScript"; - this.textBoxOriginalScript.Size = new System.Drawing.Size(263, 20); - this.textBoxOriginalScript.TabIndex = 1; - // - // labelOriginalScript - // - this.labelOriginalScript.AutoSize = true; - this.labelOriginalScript.Location = new System.Drawing.Point(6, 49); - this.labelOriginalScript.Name = "labelOriginalScript"; - this.labelOriginalScript.Size = new System.Drawing.Size(70, 13); - this.labelOriginalScript.TabIndex = 2; - this.labelOriginalScript.Text = "Original script"; - // - // textBoxTitle - // - this.textBoxTitle.Location = new System.Drawing.Point(191, 20); - this.textBoxTitle.Name = "textBoxTitle"; - this.textBoxTitle.Size = new System.Drawing.Size(263, 20); - this.textBoxTitle.TabIndex = 0; - // - // labelTitle - // - this.labelTitle.AutoSize = true; - this.labelTitle.Location = new System.Drawing.Point(6, 23); - this.labelTitle.Name = "labelTitle"; - this.labelTitle.Size = new System.Drawing.Size(27, 13); - this.labelTitle.TabIndex = 0; - this.labelTitle.Text = "Title"; - // - // groupBoxOptions - // - this.groupBoxOptions.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxOptions.Controls.Add(this.checkBoxScaleBorderAndShadow); - this.groupBoxOptions.Controls.Add(this.comboBoxCollision); - this.groupBoxOptions.Controls.Add(this.labelCollision); - this.groupBoxOptions.Controls.Add(this.comboBoxWrapStyle); - this.groupBoxOptions.Controls.Add(this.labelWrapStyle); - this.groupBoxOptions.Location = new System.Drawing.Point(12, 314); - this.groupBoxOptions.Name = "groupBoxOptions"; - this.groupBoxOptions.Size = new System.Drawing.Size(471, 100); - this.groupBoxOptions.TabIndex = 2; - this.groupBoxOptions.TabStop = false; - this.groupBoxOptions.Text = "Options"; - // - // checkBoxScaleBorderAndShadow - // - this.checkBoxScaleBorderAndShadow.AutoSize = true; - this.checkBoxScaleBorderAndShadow.Location = new System.Drawing.Point(191, 70); - this.checkBoxScaleBorderAndShadow.Name = "checkBoxScaleBorderAndShadow"; - this.checkBoxScaleBorderAndShadow.Size = new System.Drawing.Size(147, 17); - this.checkBoxScaleBorderAndShadow.TabIndex = 2; - this.checkBoxScaleBorderAndShadow.Text = "Scale border and shadow"; - this.checkBoxScaleBorderAndShadow.UseVisualStyleBackColor = true; - // - // comboBoxCollision - // - this.comboBoxCollision.FormattingEnabled = true; - this.comboBoxCollision.Items.AddRange(new object[] { - "Normal", - "Reverse"}); - this.comboBoxCollision.Location = new System.Drawing.Point(191, 16); - this.comboBoxCollision.Name = "comboBoxCollision"; - this.comboBoxCollision.Size = new System.Drawing.Size(263, 21); - this.comboBoxCollision.TabIndex = 0; - // - // labelCollision - // - this.labelCollision.AutoSize = true; - this.labelCollision.Location = new System.Drawing.Point(6, 19); - this.labelCollision.Name = "labelCollision"; - this.labelCollision.Size = new System.Drawing.Size(45, 13); - this.labelCollision.TabIndex = 3; - this.labelCollision.Text = "Collision"; - // - // comboBoxWrapStyle - // - this.comboBoxWrapStyle.FormattingEnabled = true; - this.comboBoxWrapStyle.Items.AddRange(new object[] { - "0: Smart wrapping, top line is wider", - "1: End-of-line word wrapping, only \\N breaks", - "2: No word wrapping, both \\n and \\N break", - "3: Smart wrapping, bottom line is wider"}); - this.comboBoxWrapStyle.Location = new System.Drawing.Point(191, 43); - this.comboBoxWrapStyle.Name = "comboBoxWrapStyle"; - this.comboBoxWrapStyle.Size = new System.Drawing.Size(263, 21); - this.comboBoxWrapStyle.TabIndex = 1; - // - // labelWrapStyle - // - this.labelWrapStyle.AutoSize = true; - this.labelWrapStyle.Location = new System.Drawing.Point(6, 46); - this.labelWrapStyle.Name = "labelWrapStyle"; - this.labelWrapStyle.Size = new System.Drawing.Size(57, 13); - this.labelWrapStyle.TabIndex = 1; - this.labelWrapStyle.Text = "Wrap style"; - // - // groupBoxResolution - // - this.groupBoxResolution.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxResolution.Controls.Add(this.labelVideoResolution); - this.groupBoxResolution.Controls.Add(this.numericUpDownVideoHeight); - this.groupBoxResolution.Controls.Add(this.buttonGetResolutionFromVideo); - this.groupBoxResolution.Controls.Add(this.labelX); - this.groupBoxResolution.Controls.Add(this.numericUpDownVideoWidth); - this.groupBoxResolution.Location = new System.Drawing.Point(12, 251); - this.groupBoxResolution.Name = "groupBoxResolution"; - this.groupBoxResolution.Size = new System.Drawing.Size(471, 57); - this.groupBoxResolution.TabIndex = 1; - this.groupBoxResolution.TabStop = false; - this.groupBoxResolution.Text = "Resolution"; - // - // labelVideoResolution - // - this.labelVideoResolution.AutoSize = true; - this.labelVideoResolution.Location = new System.Drawing.Point(7, 21); - this.labelVideoResolution.Name = "labelVideoResolution"; - this.labelVideoResolution.Size = new System.Drawing.Size(82, 13); - this.labelVideoResolution.TabIndex = 16; - this.labelVideoResolution.Text = "Video resolution"; - // - // numericUpDownVideoHeight - // - this.numericUpDownVideoHeight.Location = new System.Drawing.Point(264, 19); - this.numericUpDownVideoHeight.Maximum = new decimal(new int[] { - 10000, - 0, - 0, - 0}); - this.numericUpDownVideoHeight.Name = "numericUpDownVideoHeight"; - this.numericUpDownVideoHeight.Size = new System.Drawing.Size(47, 20); - this.numericUpDownVideoHeight.TabIndex = 1; - // - // buttonGetResolutionFromVideo - // - this.buttonGetResolutionFromVideo.Location = new System.Drawing.Point(317, 17); - this.buttonGetResolutionFromVideo.Name = "buttonGetResolutionFromVideo"; - this.buttonGetResolutionFromVideo.Size = new System.Drawing.Size(27, 23); - this.buttonGetResolutionFromVideo.TabIndex = 2; - this.buttonGetResolutionFromVideo.Text = "..."; - this.buttonGetResolutionFromVideo.UseVisualStyleBackColor = true; - this.buttonGetResolutionFromVideo.Click += new System.EventHandler(this.buttonGetResolutionFromVideo_Click); - // - // labelX - // - this.labelX.AutoSize = true; - this.labelX.Location = new System.Drawing.Point(244, 21); - this.labelX.Name = "labelX"; - this.labelX.Size = new System.Drawing.Size(14, 13); - this.labelX.TabIndex = 2; - this.labelX.Text = "X"; - // - // numericUpDownVideoWidth - // - this.numericUpDownVideoWidth.Location = new System.Drawing.Point(191, 19); - this.numericUpDownVideoWidth.Maximum = new decimal(new int[] { - 10000, - 0, - 0, - 0}); - this.numericUpDownVideoWidth.Name = "numericUpDownVideoWidth"; - this.numericUpDownVideoWidth.Size = new System.Drawing.Size(47, 20); - this.numericUpDownVideoWidth.TabIndex = 0; - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.Location = new System.Drawing.Point(327, 427); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 3; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.Location = new System.Drawing.Point(409, 427); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 4; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // openFileDialog1 - // - this.openFileDialog1.FileName = "openFileDialog1"; - // - // SubStationAlphaProperties - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(498, 460); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.groupBoxResolution); - this.Controls.Add(this.groupBoxOptions); - this.Controls.Add(this.groupBoxScript); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.Name = "SubStationAlphaProperties"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Sub Station Alpha properties"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.SubStationAlphaProperties_KeyDown); - this.groupBoxScript.ResumeLayout(false); - this.groupBoxScript.PerformLayout(); - this.groupBoxOptions.ResumeLayout(false); - this.groupBoxOptions.PerformLayout(); - this.groupBoxResolution.ResumeLayout(false); - this.groupBoxResolution.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownVideoHeight)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownVideoWidth)).EndInit(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.GroupBox groupBoxScript; - private System.Windows.Forms.GroupBox groupBoxOptions; - private System.Windows.Forms.Label labelUpdateDetails; - private System.Windows.Forms.Label labelUpdatedBy; - private System.Windows.Forms.TextBox textBoxSyncPoint; - private System.Windows.Forms.TextBox textBoxUpdatedBy; - private System.Windows.Forms.TextBox textBoxUpdateDetails; - private System.Windows.Forms.Label labelSyncPoint; - private System.Windows.Forms.Label labelTiming; - private System.Windows.Forms.Label labelEditing; - private System.Windows.Forms.Label labelTranslation; - private System.Windows.Forms.TextBox textBoxTranslation; - private System.Windows.Forms.TextBox textBoxEditing; - private System.Windows.Forms.TextBox textBoxTiming; - private System.Windows.Forms.TextBox textBoxOriginalScript; - private System.Windows.Forms.Label labelOriginalScript; - private System.Windows.Forms.TextBox textBoxTitle; - private System.Windows.Forms.Label labelTitle; - private System.Windows.Forms.CheckBox checkBoxScaleBorderAndShadow; - private System.Windows.Forms.ComboBox comboBoxCollision; - private System.Windows.Forms.Label labelCollision; - private System.Windows.Forms.ComboBox comboBoxWrapStyle; - private System.Windows.Forms.Label labelWrapStyle; - private System.Windows.Forms.GroupBox groupBoxResolution; - private System.Windows.Forms.Label labelVideoResolution; - private System.Windows.Forms.NumericUpDown numericUpDownVideoHeight; - private System.Windows.Forms.Button buttonGetResolutionFromVideo; - private System.Windows.Forms.Label labelX; - private System.Windows.Forms.NumericUpDown numericUpDownVideoWidth; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.OpenFileDialog openFileDialog1; - } +namespace Nikse.SubtitleEdit.Forms +{ + partial class SubStationAlphaProperties + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.groupBoxScript = new System.Windows.Forms.GroupBox(); + this.labelUpdateDetails = new System.Windows.Forms.Label(); + this.labelUpdatedBy = new System.Windows.Forms.Label(); + this.textBoxSyncPoint = new System.Windows.Forms.TextBox(); + this.textBoxUpdatedBy = new System.Windows.Forms.TextBox(); + this.textBoxUpdateDetails = new System.Windows.Forms.TextBox(); + this.labelSyncPoint = new System.Windows.Forms.Label(); + this.labelTiming = new System.Windows.Forms.Label(); + this.labelEditing = new System.Windows.Forms.Label(); + this.labelTranslation = new System.Windows.Forms.Label(); + this.textBoxTranslation = new System.Windows.Forms.TextBox(); + this.textBoxEditing = new System.Windows.Forms.TextBox(); + this.textBoxTiming = new System.Windows.Forms.TextBox(); + this.textBoxOriginalScript = new System.Windows.Forms.TextBox(); + this.labelOriginalScript = new System.Windows.Forms.Label(); + this.textBoxTitle = new System.Windows.Forms.TextBox(); + this.labelTitle = new System.Windows.Forms.Label(); + this.groupBoxOptions = new System.Windows.Forms.GroupBox(); + this.checkBoxScaleBorderAndShadow = new System.Windows.Forms.CheckBox(); + this.comboBoxCollision = new System.Windows.Forms.ComboBox(); + this.labelCollision = new System.Windows.Forms.Label(); + this.comboBoxWrapStyle = new System.Windows.Forms.ComboBox(); + this.labelWrapStyle = new System.Windows.Forms.Label(); + this.groupBoxResolution = new System.Windows.Forms.GroupBox(); + this.labelVideoResolution = new System.Windows.Forms.Label(); + this.numericUpDownVideoHeight = new System.Windows.Forms.NumericUpDown(); + this.buttonGetResolutionFromVideo = new System.Windows.Forms.Button(); + this.labelX = new System.Windows.Forms.Label(); + this.numericUpDownVideoWidth = new System.Windows.Forms.NumericUpDown(); + this.buttonOK = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); + this.groupBoxScript.SuspendLayout(); + this.groupBoxOptions.SuspendLayout(); + this.groupBoxResolution.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownVideoHeight)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownVideoWidth)).BeginInit(); + this.SuspendLayout(); + // + // groupBoxScript + // + this.groupBoxScript.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxScript.Controls.Add(this.labelUpdateDetails); + this.groupBoxScript.Controls.Add(this.labelUpdatedBy); + this.groupBoxScript.Controls.Add(this.textBoxSyncPoint); + this.groupBoxScript.Controls.Add(this.textBoxUpdatedBy); + this.groupBoxScript.Controls.Add(this.textBoxUpdateDetails); + this.groupBoxScript.Controls.Add(this.labelSyncPoint); + this.groupBoxScript.Controls.Add(this.labelTiming); + this.groupBoxScript.Controls.Add(this.labelEditing); + this.groupBoxScript.Controls.Add(this.labelTranslation); + this.groupBoxScript.Controls.Add(this.textBoxTranslation); + this.groupBoxScript.Controls.Add(this.textBoxEditing); + this.groupBoxScript.Controls.Add(this.textBoxTiming); + this.groupBoxScript.Controls.Add(this.textBoxOriginalScript); + this.groupBoxScript.Controls.Add(this.labelOriginalScript); + this.groupBoxScript.Controls.Add(this.textBoxTitle); + this.groupBoxScript.Controls.Add(this.labelTitle); + this.groupBoxScript.Location = new System.Drawing.Point(12, 12); + this.groupBoxScript.Name = "groupBoxScript"; + this.groupBoxScript.Size = new System.Drawing.Size(471, 233); + this.groupBoxScript.TabIndex = 0; + this.groupBoxScript.TabStop = false; + this.groupBoxScript.Text = "Script"; + // + // labelUpdateDetails + // + this.labelUpdateDetails.AutoSize = true; + this.labelUpdateDetails.Location = new System.Drawing.Point(7, 205); + this.labelUpdateDetails.Name = "labelUpdateDetails"; + this.labelUpdateDetails.Size = new System.Drawing.Size(75, 13); + this.labelUpdateDetails.TabIndex = 15; + this.labelUpdateDetails.Text = "Update details"; + // + // labelUpdatedBy + // + this.labelUpdatedBy.AutoSize = true; + this.labelUpdatedBy.Location = new System.Drawing.Point(6, 179); + this.labelUpdatedBy.Name = "labelUpdatedBy"; + this.labelUpdatedBy.Size = new System.Drawing.Size(62, 13); + this.labelUpdatedBy.TabIndex = 14; + this.labelUpdatedBy.Text = "Updated by"; + // + // textBoxSyncPoint + // + this.textBoxSyncPoint.Location = new System.Drawing.Point(191, 150); + this.textBoxSyncPoint.Name = "textBoxSyncPoint"; + this.textBoxSyncPoint.Size = new System.Drawing.Size(263, 20); + this.textBoxSyncPoint.TabIndex = 5; + // + // textBoxUpdatedBy + // + this.textBoxUpdatedBy.Location = new System.Drawing.Point(191, 176); + this.textBoxUpdatedBy.Name = "textBoxUpdatedBy"; + this.textBoxUpdatedBy.Size = new System.Drawing.Size(263, 20); + this.textBoxUpdatedBy.TabIndex = 6; + // + // textBoxUpdateDetails + // + this.textBoxUpdateDetails.Location = new System.Drawing.Point(191, 202); + this.textBoxUpdateDetails.Name = "textBoxUpdateDetails"; + this.textBoxUpdateDetails.Size = new System.Drawing.Size(263, 20); + this.textBoxUpdateDetails.TabIndex = 7; + // + // labelSyncPoint + // + this.labelSyncPoint.AutoSize = true; + this.labelSyncPoint.Location = new System.Drawing.Point(6, 153); + this.labelSyncPoint.Name = "labelSyncPoint"; + this.labelSyncPoint.Size = new System.Drawing.Size(63, 13); + this.labelSyncPoint.TabIndex = 10; + this.labelSyncPoint.Text = "Synch point"; + // + // labelTiming + // + this.labelTiming.AutoSize = true; + this.labelTiming.Location = new System.Drawing.Point(6, 127); + this.labelTiming.Name = "labelTiming"; + this.labelTiming.Size = new System.Drawing.Size(38, 13); + this.labelTiming.TabIndex = 9; + this.labelTiming.Text = "Timing"; + // + // labelEditing + // + this.labelEditing.AutoSize = true; + this.labelEditing.Location = new System.Drawing.Point(6, 101); + this.labelEditing.Name = "labelEditing"; + this.labelEditing.Size = new System.Drawing.Size(39, 13); + this.labelEditing.TabIndex = 8; + this.labelEditing.Text = "Editing"; + // + // labelTranslation + // + this.labelTranslation.AutoSize = true; + this.labelTranslation.Location = new System.Drawing.Point(6, 75); + this.labelTranslation.Name = "labelTranslation"; + this.labelTranslation.Size = new System.Drawing.Size(59, 13); + this.labelTranslation.TabIndex = 7; + this.labelTranslation.Text = "Translation"; + // + // textBoxTranslation + // + this.textBoxTranslation.Location = new System.Drawing.Point(191, 72); + this.textBoxTranslation.Name = "textBoxTranslation"; + this.textBoxTranslation.Size = new System.Drawing.Size(263, 20); + this.textBoxTranslation.TabIndex = 2; + // + // textBoxEditing + // + this.textBoxEditing.Location = new System.Drawing.Point(191, 98); + this.textBoxEditing.Name = "textBoxEditing"; + this.textBoxEditing.Size = new System.Drawing.Size(263, 20); + this.textBoxEditing.TabIndex = 3; + // + // textBoxTiming + // + this.textBoxTiming.Location = new System.Drawing.Point(191, 124); + this.textBoxTiming.Name = "textBoxTiming"; + this.textBoxTiming.Size = new System.Drawing.Size(263, 20); + this.textBoxTiming.TabIndex = 4; + // + // textBoxOriginalScript + // + this.textBoxOriginalScript.Location = new System.Drawing.Point(191, 46); + this.textBoxOriginalScript.Name = "textBoxOriginalScript"; + this.textBoxOriginalScript.Size = new System.Drawing.Size(263, 20); + this.textBoxOriginalScript.TabIndex = 1; + // + // labelOriginalScript + // + this.labelOriginalScript.AutoSize = true; + this.labelOriginalScript.Location = new System.Drawing.Point(6, 49); + this.labelOriginalScript.Name = "labelOriginalScript"; + this.labelOriginalScript.Size = new System.Drawing.Size(70, 13); + this.labelOriginalScript.TabIndex = 2; + this.labelOriginalScript.Text = "Original script"; + // + // textBoxTitle + // + this.textBoxTitle.Location = new System.Drawing.Point(191, 20); + this.textBoxTitle.Name = "textBoxTitle"; + this.textBoxTitle.Size = new System.Drawing.Size(263, 20); + this.textBoxTitle.TabIndex = 0; + // + // labelTitle + // + this.labelTitle.AutoSize = true; + this.labelTitle.Location = new System.Drawing.Point(6, 23); + this.labelTitle.Name = "labelTitle"; + this.labelTitle.Size = new System.Drawing.Size(27, 13); + this.labelTitle.TabIndex = 0; + this.labelTitle.Text = "Title"; + // + // groupBoxOptions + // + this.groupBoxOptions.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxOptions.Controls.Add(this.checkBoxScaleBorderAndShadow); + this.groupBoxOptions.Controls.Add(this.comboBoxCollision); + this.groupBoxOptions.Controls.Add(this.labelCollision); + this.groupBoxOptions.Controls.Add(this.comboBoxWrapStyle); + this.groupBoxOptions.Controls.Add(this.labelWrapStyle); + this.groupBoxOptions.Location = new System.Drawing.Point(12, 314); + this.groupBoxOptions.Name = "groupBoxOptions"; + this.groupBoxOptions.Size = new System.Drawing.Size(471, 100); + this.groupBoxOptions.TabIndex = 2; + this.groupBoxOptions.TabStop = false; + this.groupBoxOptions.Text = "Options"; + // + // checkBoxScaleBorderAndShadow + // + this.checkBoxScaleBorderAndShadow.AutoSize = true; + this.checkBoxScaleBorderAndShadow.Location = new System.Drawing.Point(191, 70); + this.checkBoxScaleBorderAndShadow.Name = "checkBoxScaleBorderAndShadow"; + this.checkBoxScaleBorderAndShadow.Size = new System.Drawing.Size(147, 17); + this.checkBoxScaleBorderAndShadow.TabIndex = 2; + this.checkBoxScaleBorderAndShadow.Text = "Scale border and shadow"; + this.checkBoxScaleBorderAndShadow.UseVisualStyleBackColor = true; + // + // comboBoxCollision + // + this.comboBoxCollision.FormattingEnabled = true; + this.comboBoxCollision.Items.AddRange(new object[] { + "Normal", + "Reverse"}); + this.comboBoxCollision.Location = new System.Drawing.Point(191, 16); + this.comboBoxCollision.Name = "comboBoxCollision"; + this.comboBoxCollision.Size = new System.Drawing.Size(263, 21); + this.comboBoxCollision.TabIndex = 0; + // + // labelCollision + // + this.labelCollision.AutoSize = true; + this.labelCollision.Location = new System.Drawing.Point(6, 19); + this.labelCollision.Name = "labelCollision"; + this.labelCollision.Size = new System.Drawing.Size(45, 13); + this.labelCollision.TabIndex = 3; + this.labelCollision.Text = "Collision"; + // + // comboBoxWrapStyle + // + this.comboBoxWrapStyle.FormattingEnabled = true; + this.comboBoxWrapStyle.Items.AddRange(new object[] { + "0: Smart wrapping, top line is wider", + "1: End-of-line word wrapping, only \\N breaks", + "2: No word wrapping, both \\n and \\N break", + "3: Smart wrapping, bottom line is wider"}); + this.comboBoxWrapStyle.Location = new System.Drawing.Point(191, 43); + this.comboBoxWrapStyle.Name = "comboBoxWrapStyle"; + this.comboBoxWrapStyle.Size = new System.Drawing.Size(263, 21); + this.comboBoxWrapStyle.TabIndex = 1; + // + // labelWrapStyle + // + this.labelWrapStyle.AutoSize = true; + this.labelWrapStyle.Location = new System.Drawing.Point(6, 46); + this.labelWrapStyle.Name = "labelWrapStyle"; + this.labelWrapStyle.Size = new System.Drawing.Size(57, 13); + this.labelWrapStyle.TabIndex = 1; + this.labelWrapStyle.Text = "Wrap style"; + // + // groupBoxResolution + // + this.groupBoxResolution.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxResolution.Controls.Add(this.labelVideoResolution); + this.groupBoxResolution.Controls.Add(this.numericUpDownVideoHeight); + this.groupBoxResolution.Controls.Add(this.buttonGetResolutionFromVideo); + this.groupBoxResolution.Controls.Add(this.labelX); + this.groupBoxResolution.Controls.Add(this.numericUpDownVideoWidth); + this.groupBoxResolution.Location = new System.Drawing.Point(12, 251); + this.groupBoxResolution.Name = "groupBoxResolution"; + this.groupBoxResolution.Size = new System.Drawing.Size(471, 57); + this.groupBoxResolution.TabIndex = 1; + this.groupBoxResolution.TabStop = false; + this.groupBoxResolution.Text = "Resolution"; + // + // labelVideoResolution + // + this.labelVideoResolution.AutoSize = true; + this.labelVideoResolution.Location = new System.Drawing.Point(7, 21); + this.labelVideoResolution.Name = "labelVideoResolution"; + this.labelVideoResolution.Size = new System.Drawing.Size(82, 13); + this.labelVideoResolution.TabIndex = 16; + this.labelVideoResolution.Text = "Video resolution"; + // + // numericUpDownVideoHeight + // + this.numericUpDownVideoHeight.Location = new System.Drawing.Point(264, 19); + this.numericUpDownVideoHeight.Maximum = new decimal(new int[] { + 10000, + 0, + 0, + 0}); + this.numericUpDownVideoHeight.Name = "numericUpDownVideoHeight"; + this.numericUpDownVideoHeight.Size = new System.Drawing.Size(47, 20); + this.numericUpDownVideoHeight.TabIndex = 1; + // + // buttonGetResolutionFromVideo + // + this.buttonGetResolutionFromVideo.Location = new System.Drawing.Point(317, 17); + this.buttonGetResolutionFromVideo.Name = "buttonGetResolutionFromVideo"; + this.buttonGetResolutionFromVideo.Size = new System.Drawing.Size(27, 23); + this.buttonGetResolutionFromVideo.TabIndex = 2; + this.buttonGetResolutionFromVideo.Text = "..."; + this.buttonGetResolutionFromVideo.UseVisualStyleBackColor = true; + this.buttonGetResolutionFromVideo.Click += new System.EventHandler(this.buttonGetResolutionFromVideo_Click); + // + // labelX + // + this.labelX.AutoSize = true; + this.labelX.Location = new System.Drawing.Point(244, 21); + this.labelX.Name = "labelX"; + this.labelX.Size = new System.Drawing.Size(14, 13); + this.labelX.TabIndex = 2; + this.labelX.Text = "X"; + // + // numericUpDownVideoWidth + // + this.numericUpDownVideoWidth.Location = new System.Drawing.Point(191, 19); + this.numericUpDownVideoWidth.Maximum = new decimal(new int[] { + 10000, + 0, + 0, + 0}); + this.numericUpDownVideoWidth.Name = "numericUpDownVideoWidth"; + this.numericUpDownVideoWidth.Size = new System.Drawing.Size(47, 20); + this.numericUpDownVideoWidth.TabIndex = 0; + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.Location = new System.Drawing.Point(327, 427); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 3; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.Location = new System.Drawing.Point(409, 427); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 4; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // openFileDialog1 + // + this.openFileDialog1.FileName = "openFileDialog1"; + // + // SubStationAlphaProperties + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(498, 460); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.groupBoxResolution); + this.Controls.Add(this.groupBoxOptions); + this.Controls.Add(this.groupBoxScript); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.Name = "SubStationAlphaProperties"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Sub Station Alpha properties"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.SubStationAlphaProperties_KeyDown); + this.groupBoxScript.ResumeLayout(false); + this.groupBoxScript.PerformLayout(); + this.groupBoxOptions.ResumeLayout(false); + this.groupBoxOptions.PerformLayout(); + this.groupBoxResolution.ResumeLayout(false); + this.groupBoxResolution.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownVideoHeight)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownVideoWidth)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBoxScript; + private System.Windows.Forms.GroupBox groupBoxOptions; + private System.Windows.Forms.Label labelUpdateDetails; + private System.Windows.Forms.Label labelUpdatedBy; + private System.Windows.Forms.TextBox textBoxSyncPoint; + private System.Windows.Forms.TextBox textBoxUpdatedBy; + private System.Windows.Forms.TextBox textBoxUpdateDetails; + private System.Windows.Forms.Label labelSyncPoint; + private System.Windows.Forms.Label labelTiming; + private System.Windows.Forms.Label labelEditing; + private System.Windows.Forms.Label labelTranslation; + private System.Windows.Forms.TextBox textBoxTranslation; + private System.Windows.Forms.TextBox textBoxEditing; + private System.Windows.Forms.TextBox textBoxTiming; + private System.Windows.Forms.TextBox textBoxOriginalScript; + private System.Windows.Forms.Label labelOriginalScript; + private System.Windows.Forms.TextBox textBoxTitle; + private System.Windows.Forms.Label labelTitle; + private System.Windows.Forms.CheckBox checkBoxScaleBorderAndShadow; + private System.Windows.Forms.ComboBox comboBoxCollision; + private System.Windows.Forms.Label labelCollision; + private System.Windows.Forms.ComboBox comboBoxWrapStyle; + private System.Windows.Forms.Label labelWrapStyle; + private System.Windows.Forms.GroupBox groupBoxResolution; + private System.Windows.Forms.Label labelVideoResolution; + private System.Windows.Forms.NumericUpDown numericUpDownVideoHeight; + private System.Windows.Forms.Button buttonGetResolutionFromVideo; + private System.Windows.Forms.Label labelX; + private System.Windows.Forms.NumericUpDown numericUpDownVideoWidth; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.OpenFileDialog openFileDialog1; + } } \ No newline at end of file diff --git a/src/Forms/SubStationAlphaProperties.cs b/src/ui/Forms/SubStationAlphaProperties.cs similarity index 97% rename from src/Forms/SubStationAlphaProperties.cs rename to src/ui/Forms/SubStationAlphaProperties.cs index c4dd4e8be..de7cb910c 100644 --- a/src/Forms/SubStationAlphaProperties.cs +++ b/src/ui/Forms/SubStationAlphaProperties.cs @@ -1,309 +1,309 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.SubtitleFormats; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Globalization; -using System.IO; -using System.Text; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class SubStationAlphaProperties : PositionAndSizeForm - { - private readonly Subtitle _subtitle; - private readonly bool _isSubStationAlpha; - private readonly string _videoFileName; - - public SubStationAlphaProperties(Subtitle subtitle, SubtitleFormat format, string videoFileName, string subtitleFileName) - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - _subtitle = subtitle; - _isSubStationAlpha = format.Name == SubStationAlpha.NameOfFormat; - _videoFileName = videoFileName; - - var l = Configuration.Settings.Language.SubStationAlphaProperties; - if (_isSubStationAlpha) - { - Text = l.TitleSubstationAlpha; - labelWrapStyle.Visible = false; - comboBoxWrapStyle.Visible = false; - checkBoxScaleBorderAndShadow.Visible = false; - Height = Height - (comboBoxWrapStyle.Height + checkBoxScaleBorderAndShadow.Height + 8); - } - else - { - Text = l.Title; - } - - comboBoxWrapStyle.SelectedIndex = 2; - comboBoxCollision.SelectedIndex = 0; - - string header = subtitle.Header; - if (subtitle.Header == null) - { - var ssa = new SubStationAlpha(); - var sub = new Subtitle(); - var lines = subtitle.ToText(ssa).SplitToLines(); - string title = "Untitled"; - if (!string.IsNullOrEmpty(subtitleFileName)) - { - title = Path.GetFileNameWithoutExtension(subtitleFileName); - } - else if (!string.IsNullOrEmpty(videoFileName)) - { - title = Path.GetFileNameWithoutExtension(videoFileName); - } - - ssa.LoadSubtitle(sub, lines, title); - header = sub.Header; - } - - if (header != null) - { - foreach (string line in header.SplitToLines()) - { - string s = line.ToLowerInvariant().Trim(); - if (s.StartsWith("title:", StringComparison.Ordinal)) - { - textBoxTitle.Text = s.Remove(0, 6).Trim(); - } - else if (s.StartsWith("original script:", StringComparison.Ordinal)) - { - textBoxOriginalScript.Text = s.Remove(0, 16).Trim(); - } - else if (s.StartsWith("original translation:", StringComparison.Ordinal)) - { - textBoxTranslation.Text = s.Remove(0, 21).Trim(); - } - else if (s.StartsWith("original editing:", StringComparison.Ordinal)) - { - textBoxEditing.Text = s.Remove(0, 17).Trim(); - } - else if (s.StartsWith("original timing:", StringComparison.Ordinal)) - { - textBoxTiming.Text = s.Remove(0, 16).Trim(); - } - else if (s.StartsWith("synch point:", StringComparison.Ordinal)) - { - textBoxSyncPoint.Text = s.Remove(0, 12).Trim(); - } - else if (s.StartsWith("script updated by:", StringComparison.Ordinal)) - { - textBoxUpdatedBy.Text = s.Remove(0, 18).Trim(); - } - else if (s.StartsWith("update details:", StringComparison.Ordinal)) - { - textBoxUpdateDetails.Text = s.Remove(0, 15).Trim(); - } - else if (s.StartsWith("collisions:", StringComparison.Ordinal)) - { - if (s.Remove(0, 11).Trim() == "reverse") - { - comboBoxCollision.SelectedIndex = 1; - } - } - else if (s.StartsWith("playresx:", StringComparison.Ordinal)) - { - if (int.TryParse(s.Remove(0, 9).Trim(), out var number)) - { - numericUpDownVideoWidth.Value = number; - } - } - else if (s.StartsWith("playresy:", StringComparison.Ordinal)) - { - if (int.TryParse(s.Remove(0, 9).Trim(), out var number)) - { - numericUpDownVideoHeight.Value = number; - } - } - else if (s.StartsWith("scaledborderandshadow:", StringComparison.Ordinal)) - { - checkBoxScaleBorderAndShadow.Checked = s.Remove(0, 22).Trim().ToLowerInvariant().Equals("yes"); - } - else if (s.StartsWith("wrapstyle:", StringComparison.Ordinal)) - { - var wrapStyle = s.Remove(0, 10).Trim(); - for (int i = 0; i < comboBoxWrapStyle.Items.Count; i++) - { - if (i.ToString(CultureInfo.InvariantCulture) == wrapStyle) - { - comboBoxWrapStyle.SelectedIndex = i; - } - } - } - } - } - - groupBoxScript.Text = l.Script; - labelTitle.Text = l.ScriptTitle; - labelOriginalScript.Text = l.OriginalScript; - labelTranslation.Text = l.Translation; - labelEditing.Text = l.Editing; - labelTiming.Text = l.Timing; - labelSyncPoint.Text = l.SyncPoint; - labelUpdatedBy.Text = l.UpdatedBy; - labelUpdateDetails.Text = l.UpdateDetails; - groupBoxResolution.Text = l.Resolution; - labelVideoResolution.Text = l.VideoResolution; - groupBoxOptions.Text = l.Options; - labelCollision.Text = l.Collision; - labelWrapStyle.Text = l.WrapStyle; - checkBoxScaleBorderAndShadow.Text = l.ScaleBorderAndShadow; - - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - - UiUtil.FixLargeFonts(this, buttonCancel); - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private string GetDefaultHeader() - { - SubtitleFormat format; - if (_isSubStationAlpha) - { - format = new SubStationAlpha(); - } - else - { - format = new AdvancedSubStationAlpha(); - } - - var sub = new Subtitle(); - string text = format.ToText(sub, string.Empty); - var lines = text.SplitToLines(); - format.LoadSubtitle(sub, lines, string.Empty); - return sub.Header.Trim(); - } - - private void buttonOK_Click(object sender, EventArgs e) - { - if (_subtitle.Header == null || !_subtitle.Header.Contains("[script info]", StringComparison.OrdinalIgnoreCase)) - { - _subtitle.Header = GetDefaultHeader(); - } - - string title = textBoxTitle.Text; - if (string.IsNullOrWhiteSpace(title)) - { - title = "untitled"; - } - - UpdateTag("Title", title, false); - UpdateTag("Original Script", textBoxOriginalScript.Text, string.IsNullOrWhiteSpace(textBoxOriginalScript.Text)); - UpdateTag("Original Translation", textBoxTranslation.Text, string.IsNullOrWhiteSpace(textBoxTranslation.Text)); - UpdateTag("Original Editing", textBoxEditing.Text, string.IsNullOrWhiteSpace(textBoxEditing.Text)); - UpdateTag("Original Timing", textBoxTiming.Text, string.IsNullOrWhiteSpace(textBoxTiming.Text)); - UpdateTag("Synch Point", textBoxSyncPoint.Text, string.IsNullOrWhiteSpace(textBoxSyncPoint.Text)); - UpdateTag("Script Updated By", textBoxUpdatedBy.Text, string.IsNullOrWhiteSpace(textBoxUpdatedBy.Text)); - UpdateTag("Update Details", textBoxUpdateDetails.Text, string.IsNullOrWhiteSpace(textBoxUpdateDetails.Text)); - UpdateTag("PlayResX", numericUpDownVideoWidth.Value.ToString(CultureInfo.InvariantCulture), numericUpDownVideoWidth.Value == 0); - UpdateTag("PlayResY", numericUpDownVideoHeight.Value.ToString(CultureInfo.InvariantCulture), numericUpDownVideoHeight.Value == 0); - if (comboBoxCollision.SelectedIndex == 0) - { - UpdateTag("collisions", "Normal", false); // normal - } - else - { - UpdateTag("collisions", "Reverse", false); // reverse - } - - if (!_isSubStationAlpha) - { - UpdateTag("WrapStyle", comboBoxWrapStyle.SelectedIndex.ToString(CultureInfo.InvariantCulture), false); - if (checkBoxScaleBorderAndShadow.Checked) - { - UpdateTag("ScaledBorderAndShadow", "Yes", false); - } - else - { - UpdateTag("ScaledBorderAndShadow", "No", false); - } - } - - DialogResult = DialogResult.OK; - } - - private void UpdateTag(string tag, string text, bool remove) - { - bool scriptInfoOn = false; - var sb = new StringBuilder(); - bool found = false; - foreach (string line in _subtitle.Header.SplitToLines()) - { - if (line.StartsWith("[script info]", StringComparison.OrdinalIgnoreCase)) - { - scriptInfoOn = true; - } - else if (line.StartsWith('[')) - { - if (!found && scriptInfoOn && !remove) - { - sb = new StringBuilder(sb.ToString().Trim() + Environment.NewLine); - sb.AppendLine(tag + ": " + text); - } - sb = new StringBuilder(sb.ToString().TrimEnd()); - sb.AppendLine(); - sb.AppendLine(); - scriptInfoOn = false; - } - - string s = line.ToLowerInvariant(); - if (s.StartsWith(tag.ToLowerInvariant() + ":", StringComparison.Ordinal)) - { - if (!remove) - { - sb.AppendLine(line.Substring(0, tag.Length) + ": " + text); - } - - found = true; - } - else - { - sb.AppendLine(line); - } - } - _subtitle.Header = sb.ToString().Trim(); - } - - private void SubStationAlphaProperties_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - private void buttonGetResolutionFromVideo_Click(object sender, EventArgs e) - { - openFileDialog1.Title = Configuration.Settings.Language.General.OpenVideoFileTitle; - openFileDialog1.FileName = string.Empty; - openFileDialog1.Filter = Utilities.GetVideoFileFilter(false); - openFileDialog1.FileName = string.Empty; - if (string.IsNullOrEmpty(openFileDialog1.InitialDirectory) && !string.IsNullOrEmpty(_videoFileName)) - { - openFileDialog1.InitialDirectory = Path.GetDirectoryName(_videoFileName); - openFileDialog1.FileName = Path.GetFileName(_videoFileName); - } - - if (openFileDialog1.ShowDialog() == DialogResult.OK) - { - VideoInfo info = UiUtil.GetVideoInfo(openFileDialog1.FileName); - if (info != null && info.Success) - { - numericUpDownVideoWidth.Value = info.Width; - numericUpDownVideoHeight.Value = info.Height; - } - } - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.SubtitleFormats; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Globalization; +using System.IO; +using System.Text; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class SubStationAlphaProperties : PositionAndSizeForm + { + private readonly Subtitle _subtitle; + private readonly bool _isSubStationAlpha; + private readonly string _videoFileName; + + public SubStationAlphaProperties(Subtitle subtitle, SubtitleFormat format, string videoFileName, string subtitleFileName) + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + _subtitle = subtitle; + _isSubStationAlpha = format.Name == SubStationAlpha.NameOfFormat; + _videoFileName = videoFileName; + + var l = Configuration.Settings.Language.SubStationAlphaProperties; + if (_isSubStationAlpha) + { + Text = l.TitleSubstationAlpha; + labelWrapStyle.Visible = false; + comboBoxWrapStyle.Visible = false; + checkBoxScaleBorderAndShadow.Visible = false; + Height = Height - (comboBoxWrapStyle.Height + checkBoxScaleBorderAndShadow.Height + 8); + } + else + { + Text = l.Title; + } + + comboBoxWrapStyle.SelectedIndex = 2; + comboBoxCollision.SelectedIndex = 0; + + string header = subtitle.Header; + if (subtitle.Header == null) + { + var ssa = new SubStationAlpha(); + var sub = new Subtitle(); + var lines = subtitle.ToText(ssa).SplitToLines(); + string title = "Untitled"; + if (!string.IsNullOrEmpty(subtitleFileName)) + { + title = Path.GetFileNameWithoutExtension(subtitleFileName); + } + else if (!string.IsNullOrEmpty(videoFileName)) + { + title = Path.GetFileNameWithoutExtension(videoFileName); + } + + ssa.LoadSubtitle(sub, lines, title); + header = sub.Header; + } + + if (header != null) + { + foreach (string line in header.SplitToLines()) + { + string s = line.ToLowerInvariant().Trim(); + if (s.StartsWith("title:", StringComparison.Ordinal)) + { + textBoxTitle.Text = s.Remove(0, 6).Trim(); + } + else if (s.StartsWith("original script:", StringComparison.Ordinal)) + { + textBoxOriginalScript.Text = s.Remove(0, 16).Trim(); + } + else if (s.StartsWith("original translation:", StringComparison.Ordinal)) + { + textBoxTranslation.Text = s.Remove(0, 21).Trim(); + } + else if (s.StartsWith("original editing:", StringComparison.Ordinal)) + { + textBoxEditing.Text = s.Remove(0, 17).Trim(); + } + else if (s.StartsWith("original timing:", StringComparison.Ordinal)) + { + textBoxTiming.Text = s.Remove(0, 16).Trim(); + } + else if (s.StartsWith("synch point:", StringComparison.Ordinal)) + { + textBoxSyncPoint.Text = s.Remove(0, 12).Trim(); + } + else if (s.StartsWith("script updated by:", StringComparison.Ordinal)) + { + textBoxUpdatedBy.Text = s.Remove(0, 18).Trim(); + } + else if (s.StartsWith("update details:", StringComparison.Ordinal)) + { + textBoxUpdateDetails.Text = s.Remove(0, 15).Trim(); + } + else if (s.StartsWith("collisions:", StringComparison.Ordinal)) + { + if (s.Remove(0, 11).Trim() == "reverse") + { + comboBoxCollision.SelectedIndex = 1; + } + } + else if (s.StartsWith("playresx:", StringComparison.Ordinal)) + { + if (int.TryParse(s.Remove(0, 9).Trim(), out var number)) + { + numericUpDownVideoWidth.Value = number; + } + } + else if (s.StartsWith("playresy:", StringComparison.Ordinal)) + { + if (int.TryParse(s.Remove(0, 9).Trim(), out var number)) + { + numericUpDownVideoHeight.Value = number; + } + } + else if (s.StartsWith("scaledborderandshadow:", StringComparison.Ordinal)) + { + checkBoxScaleBorderAndShadow.Checked = s.Remove(0, 22).Trim().ToLowerInvariant().Equals("yes"); + } + else if (s.StartsWith("wrapstyle:", StringComparison.Ordinal)) + { + var wrapStyle = s.Remove(0, 10).Trim(); + for (int i = 0; i < comboBoxWrapStyle.Items.Count; i++) + { + if (i.ToString(CultureInfo.InvariantCulture) == wrapStyle) + { + comboBoxWrapStyle.SelectedIndex = i; + } + } + } + } + } + + groupBoxScript.Text = l.Script; + labelTitle.Text = l.ScriptTitle; + labelOriginalScript.Text = l.OriginalScript; + labelTranslation.Text = l.Translation; + labelEditing.Text = l.Editing; + labelTiming.Text = l.Timing; + labelSyncPoint.Text = l.SyncPoint; + labelUpdatedBy.Text = l.UpdatedBy; + labelUpdateDetails.Text = l.UpdateDetails; + groupBoxResolution.Text = l.Resolution; + labelVideoResolution.Text = l.VideoResolution; + groupBoxOptions.Text = l.Options; + labelCollision.Text = l.Collision; + labelWrapStyle.Text = l.WrapStyle; + checkBoxScaleBorderAndShadow.Text = l.ScaleBorderAndShadow; + + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + + UiUtil.FixLargeFonts(this, buttonCancel); + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private string GetDefaultHeader() + { + SubtitleFormat format; + if (_isSubStationAlpha) + { + format = new SubStationAlpha(); + } + else + { + format = new AdvancedSubStationAlpha(); + } + + var sub = new Subtitle(); + string text = format.ToText(sub, string.Empty); + var lines = text.SplitToLines(); + format.LoadSubtitle(sub, lines, string.Empty); + return sub.Header.Trim(); + } + + private void buttonOK_Click(object sender, EventArgs e) + { + if (_subtitle.Header == null || !_subtitle.Header.Contains("[script info]", StringComparison.OrdinalIgnoreCase)) + { + _subtitle.Header = GetDefaultHeader(); + } + + string title = textBoxTitle.Text; + if (string.IsNullOrWhiteSpace(title)) + { + title = "untitled"; + } + + UpdateTag("Title", title, false); + UpdateTag("Original Script", textBoxOriginalScript.Text, string.IsNullOrWhiteSpace(textBoxOriginalScript.Text)); + UpdateTag("Original Translation", textBoxTranslation.Text, string.IsNullOrWhiteSpace(textBoxTranslation.Text)); + UpdateTag("Original Editing", textBoxEditing.Text, string.IsNullOrWhiteSpace(textBoxEditing.Text)); + UpdateTag("Original Timing", textBoxTiming.Text, string.IsNullOrWhiteSpace(textBoxTiming.Text)); + UpdateTag("Synch Point", textBoxSyncPoint.Text, string.IsNullOrWhiteSpace(textBoxSyncPoint.Text)); + UpdateTag("Script Updated By", textBoxUpdatedBy.Text, string.IsNullOrWhiteSpace(textBoxUpdatedBy.Text)); + UpdateTag("Update Details", textBoxUpdateDetails.Text, string.IsNullOrWhiteSpace(textBoxUpdateDetails.Text)); + UpdateTag("PlayResX", numericUpDownVideoWidth.Value.ToString(CultureInfo.InvariantCulture), numericUpDownVideoWidth.Value == 0); + UpdateTag("PlayResY", numericUpDownVideoHeight.Value.ToString(CultureInfo.InvariantCulture), numericUpDownVideoHeight.Value == 0); + if (comboBoxCollision.SelectedIndex == 0) + { + UpdateTag("collisions", "Normal", false); // normal + } + else + { + UpdateTag("collisions", "Reverse", false); // reverse + } + + if (!_isSubStationAlpha) + { + UpdateTag("WrapStyle", comboBoxWrapStyle.SelectedIndex.ToString(CultureInfo.InvariantCulture), false); + if (checkBoxScaleBorderAndShadow.Checked) + { + UpdateTag("ScaledBorderAndShadow", "Yes", false); + } + else + { + UpdateTag("ScaledBorderAndShadow", "No", false); + } + } + + DialogResult = DialogResult.OK; + } + + private void UpdateTag(string tag, string text, bool remove) + { + bool scriptInfoOn = false; + var sb = new StringBuilder(); + bool found = false; + foreach (string line in _subtitle.Header.SplitToLines()) + { + if (line.StartsWith("[script info]", StringComparison.OrdinalIgnoreCase)) + { + scriptInfoOn = true; + } + else if (line.StartsWith('[')) + { + if (!found && scriptInfoOn && !remove) + { + sb = new StringBuilder(sb.ToString().Trim() + Environment.NewLine); + sb.AppendLine(tag + ": " + text); + } + sb = new StringBuilder(sb.ToString().TrimEnd()); + sb.AppendLine(); + sb.AppendLine(); + scriptInfoOn = false; + } + + string s = line.ToLowerInvariant(); + if (s.StartsWith(tag.ToLowerInvariant() + ":", StringComparison.Ordinal)) + { + if (!remove) + { + sb.AppendLine(line.Substring(0, tag.Length) + ": " + text); + } + + found = true; + } + else + { + sb.AppendLine(line); + } + } + _subtitle.Header = sb.ToString().Trim(); + } + + private void SubStationAlphaProperties_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + private void buttonGetResolutionFromVideo_Click(object sender, EventArgs e) + { + openFileDialog1.Title = Configuration.Settings.Language.General.OpenVideoFileTitle; + openFileDialog1.FileName = string.Empty; + openFileDialog1.Filter = Utilities.GetVideoFileFilter(false); + openFileDialog1.FileName = string.Empty; + if (string.IsNullOrEmpty(openFileDialog1.InitialDirectory) && !string.IsNullOrEmpty(_videoFileName)) + { + openFileDialog1.InitialDirectory = Path.GetDirectoryName(_videoFileName); + openFileDialog1.FileName = Path.GetFileName(_videoFileName); + } + + if (openFileDialog1.ShowDialog() == DialogResult.OK) + { + VideoInfo info = UiUtil.GetVideoInfo(openFileDialog1.FileName); + if (info != null && info.Success) + { + numericUpDownVideoWidth.Value = info.Width; + numericUpDownVideoHeight.Value = info.Height; + } + } + } + + } +} diff --git a/src/Forms/SubStationAlphaProperties.resx b/src/ui/Forms/SubStationAlphaProperties.resx similarity index 97% rename from src/Forms/SubStationAlphaProperties.resx rename to src/ui/Forms/SubStationAlphaProperties.resx index 3a7d67153..9bad2f599 100644 --- a/src/Forms/SubStationAlphaProperties.resx +++ b/src/ui/Forms/SubStationAlphaProperties.resx @@ -1,123 +1,123 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + \ No newline at end of file diff --git a/src/Forms/SyncPointsSync.Designer.cs b/src/ui/Forms/SyncPointsSync.Designer.cs similarity index 98% rename from src/Forms/SyncPointsSync.Designer.cs rename to src/ui/Forms/SyncPointsSync.Designer.cs index 5a709883b..b071d4e29 100644 --- a/src/Forms/SyncPointsSync.Designer.cs +++ b/src/ui/Forms/SyncPointsSync.Designer.cs @@ -1,310 +1,310 @@ -namespace Nikse.SubtitleEdit.Forms -{ - partial class SyncPointsSync - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.groupBoxImportResult = new System.Windows.Forms.GroupBox(); - this.labelAdjustFactor = new System.Windows.Forms.Label(); - this.buttonFindTextOther = new System.Windows.Forms.Button(); - this.buttonFindText = new System.Windows.Forms.Button(); - this.labelOtherSubtitleFileName = new System.Windows.Forms.Label(); - this.labelSubtitleFileName = new System.Windows.Forms.Label(); - this.subtitleListView2 = new Nikse.SubtitleEdit.Controls.SubtitleListView(); - this.listBoxSyncPoints = new System.Windows.Forms.ListBox(); - this.labelNoOfSyncPoints = new System.Windows.Forms.Label(); - this.buttonRemoveSyncPoint = new System.Windows.Forms.Button(); - this.buttonSetSyncPoint = new System.Windows.Forms.Button(); - this.SubtitleListview1 = new Nikse.SubtitleEdit.Controls.SubtitleListView(); - this.labelSyncInfo = new System.Windows.Forms.Label(); - this.buttonApplySync = new System.Windows.Forms.Button(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.groupBoxImportResult.SuspendLayout(); - this.SuspendLayout(); - // - // groupBoxImportResult - // - this.groupBoxImportResult.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxImportResult.Controls.Add(this.labelAdjustFactor); - this.groupBoxImportResult.Controls.Add(this.buttonFindTextOther); - this.groupBoxImportResult.Controls.Add(this.buttonFindText); - this.groupBoxImportResult.Controls.Add(this.labelOtherSubtitleFileName); - this.groupBoxImportResult.Controls.Add(this.labelSubtitleFileName); - this.groupBoxImportResult.Controls.Add(this.subtitleListView2); - this.groupBoxImportResult.Controls.Add(this.listBoxSyncPoints); - this.groupBoxImportResult.Controls.Add(this.labelNoOfSyncPoints); - this.groupBoxImportResult.Controls.Add(this.buttonRemoveSyncPoint); - this.groupBoxImportResult.Controls.Add(this.buttonSetSyncPoint); - this.groupBoxImportResult.Controls.Add(this.SubtitleListview1); - this.groupBoxImportResult.Location = new System.Drawing.Point(12, 12); - this.groupBoxImportResult.Name = "groupBoxImportResult"; - this.groupBoxImportResult.Size = new System.Drawing.Size(1096, 434); - this.groupBoxImportResult.TabIndex = 16; - this.groupBoxImportResult.TabStop = false; - // - // labelAdjustFactor - // - this.labelAdjustFactor.AutoSize = true; - this.labelAdjustFactor.Font = new System.Drawing.Font("Tahoma", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelAdjustFactor.ForeColor = System.Drawing.Color.Gray; - this.labelAdjustFactor.Location = new System.Drawing.Point(482, 299); - this.labelAdjustFactor.Name = "labelAdjustFactor"; - this.labelAdjustFactor.Size = new System.Drawing.Size(58, 11); - this.labelAdjustFactor.TabIndex = 35; - this.labelAdjustFactor.Text = "AdjustFactor"; - // - // buttonFindTextOther - // - this.buttonFindTextOther.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonFindTextOther.Location = new System.Drawing.Point(976, 407); - this.buttonFindTextOther.Name = "buttonFindTextOther"; - this.buttonFindTextOther.Size = new System.Drawing.Size(106, 23); - this.buttonFindTextOther.TabIndex = 34; - this.buttonFindTextOther.Text = "Find text..."; - this.buttonFindTextOther.UseVisualStyleBackColor = true; - this.buttonFindTextOther.Click += new System.EventHandler(this.ButtonFindTextOtherClick); - // - // buttonFindText - // - this.buttonFindText.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonFindText.Location = new System.Drawing.Point(369, 407); - this.buttonFindText.Name = "buttonFindText"; - this.buttonFindText.Size = new System.Drawing.Size(106, 23); - this.buttonFindText.TabIndex = 33; - this.buttonFindText.Text = "Find text..."; - this.buttonFindText.UseVisualStyleBackColor = true; - this.buttonFindText.Click += new System.EventHandler(this.ButtonFindTextClick); - // - // labelOtherSubtitleFileName - // - this.labelOtherSubtitleFileName.AutoSize = true; - this.labelOtherSubtitleFileName.Location = new System.Drawing.Point(626, 15); - this.labelOtherSubtitleFileName.Name = "labelOtherSubtitleFileName"; - this.labelOtherSubtitleFileName.Size = new System.Drawing.Size(136, 13); - this.labelOtherSubtitleFileName.TabIndex = 21; - this.labelOtherSubtitleFileName.Text = "labelOtherSubtitleFileName"; - // - // labelSubtitleFileName - // - this.labelSubtitleFileName.AutoSize = true; - this.labelSubtitleFileName.Location = new System.Drawing.Point(6, 15); - this.labelSubtitleFileName.Name = "labelSubtitleFileName"; - this.labelSubtitleFileName.Size = new System.Drawing.Size(108, 13); - this.labelSubtitleFileName.TabIndex = 20; - this.labelSubtitleFileName.Text = "labelSubtitleFileName"; - // - // subtitleListView2 - // - this.subtitleListView2.AllowColumnReorder = true; - this.subtitleListView2.AllowDrop = true; - this.subtitleListView2.Anchor = System.Windows.Forms.AnchorStyles.Left; - this.subtitleListView2.FirstVisibleIndex = -1; - this.subtitleListView2.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.subtitleListView2.FullRowSelect = true; - this.subtitleListView2.GridLines = true; - this.subtitleListView2.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; - this.subtitleListView2.HideSelection = false; - this.subtitleListView2.Location = new System.Drawing.Point(629, 33); - this.subtitleListView2.MultiSelect = false; - this.subtitleListView2.Name = "subtitleListView2"; - this.subtitleListView2.OwnerDraw = true; - this.subtitleListView2.Size = new System.Drawing.Size(453, 368); - this.subtitleListView2.SubtitleFontBold = false; - this.subtitleListView2.SubtitleFontName = "Tahoma"; - this.subtitleListView2.SubtitleFontSize = 8; - this.subtitleListView2.TabIndex = 19; - this.subtitleListView2.UseCompatibleStateImageBehavior = false; - this.subtitleListView2.UseSyntaxColoring = true; - this.subtitleListView2.View = System.Windows.Forms.View.Details; - // - // listBoxSyncPoints - // - this.listBoxSyncPoints.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.listBoxSyncPoints.FormattingEnabled = true; - this.listBoxSyncPoints.Location = new System.Drawing.Point(482, 214); - this.listBoxSyncPoints.Name = "listBoxSyncPoints"; - this.listBoxSyncPoints.Size = new System.Drawing.Size(140, 82); - this.listBoxSyncPoints.TabIndex = 18; - this.listBoxSyncPoints.SelectedIndexChanged += new System.EventHandler(this.listBoxSyncPoints_SelectedIndexChanged); - // - // labelNoOfSyncPoints - // - this.labelNoOfSyncPoints.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.labelNoOfSyncPoints.AutoSize = true; - this.labelNoOfSyncPoints.Location = new System.Drawing.Point(481, 196); - this.labelNoOfSyncPoints.Name = "labelNoOfSyncPoints"; - this.labelNoOfSyncPoints.Size = new System.Drawing.Size(75, 13); - this.labelNoOfSyncPoints.TabIndex = 16; - this.labelNoOfSyncPoints.Text = "Sync points: 0"; - // - // buttonRemoveSyncPoint - // - this.buttonRemoveSyncPoint.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.buttonRemoveSyncPoint.Location = new System.Drawing.Point(484, 170); - this.buttonRemoveSyncPoint.Name = "buttonRemoveSyncPoint"; - this.buttonRemoveSyncPoint.Size = new System.Drawing.Size(138, 23); - this.buttonRemoveSyncPoint.TabIndex = 14; - this.buttonRemoveSyncPoint.Text = "Remove sync point"; - this.buttonRemoveSyncPoint.UseVisualStyleBackColor = true; - this.buttonRemoveSyncPoint.Click += new System.EventHandler(this.buttonRemoveSyncPoint_Click); - // - // buttonSetSyncPoint - // - this.buttonSetSyncPoint.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.buttonSetSyncPoint.Location = new System.Drawing.Point(484, 141); - this.buttonSetSyncPoint.Name = "buttonSetSyncPoint"; - this.buttonSetSyncPoint.Size = new System.Drawing.Size(138, 23); - this.buttonSetSyncPoint.TabIndex = 13; - this.buttonSetSyncPoint.Text = "Set sync point"; - this.buttonSetSyncPoint.UseVisualStyleBackColor = true; - this.buttonSetSyncPoint.Click += new System.EventHandler(this.buttonSetSyncPoint_Click); - // - // SubtitleListview1 - // - this.SubtitleListview1.AllowColumnReorder = true; - this.SubtitleListview1.AllowDrop = true; - this.SubtitleListview1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.SubtitleListview1.FirstVisibleIndex = -1; - this.SubtitleListview1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.SubtitleListview1.FullRowSelect = true; - this.SubtitleListview1.GridLines = true; - this.SubtitleListview1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; - this.SubtitleListview1.HideSelection = false; - this.SubtitleListview1.Location = new System.Drawing.Point(9, 33); - this.SubtitleListview1.MultiSelect = false; - this.SubtitleListview1.Name = "SubtitleListview1"; - this.SubtitleListview1.OwnerDraw = true; - this.SubtitleListview1.Size = new System.Drawing.Size(466, 368); - this.SubtitleListview1.SubtitleFontBold = false; - this.SubtitleListview1.SubtitleFontName = "Tahoma"; - this.SubtitleListview1.SubtitleFontSize = 8; - this.SubtitleListview1.TabIndex = 12; - this.SubtitleListview1.UseCompatibleStateImageBehavior = false; - this.SubtitleListview1.UseSyntaxColoring = true; - this.SubtitleListview1.View = System.Windows.Forms.View.Details; - this.SubtitleListview1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.SubtitleListview1_MouseDoubleClick); - // - // labelSyncInfo - // - this.labelSyncInfo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelSyncInfo.AutoSize = true; - this.labelSyncInfo.Location = new System.Drawing.Point(18, 456); - this.labelSyncInfo.Name = "labelSyncInfo"; - this.labelSyncInfo.Size = new System.Drawing.Size(290, 13); - this.labelSyncInfo.TabIndex = 17; - this.labelSyncInfo.Text = "Set at least two sync points to make rough synchronization"; - // - // buttonApplySync - // - this.buttonApplySync.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonApplySync.Enabled = false; - this.buttonApplySync.Location = new System.Drawing.Point(1029, 452); - this.buttonApplySync.Name = "buttonApplySync"; - this.buttonApplySync.Size = new System.Drawing.Size(80, 23); - this.buttonApplySync.TabIndex = 15; - this.buttonApplySync.Text = "Apply"; - this.buttonApplySync.UseVisualStyleBackColor = true; - this.buttonApplySync.Click += new System.EventHandler(this.buttonSync_Click); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(948, 452); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 19; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(867, 452); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 18; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // SyncPointsSync - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(1120, 485); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.buttonApplySync); - this.Controls.Add(this.groupBoxImportResult); - this.Controls.Add(this.labelSyncInfo); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.KeyPreview = true; - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(600, 400); - this.Name = "SyncPointsSync"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "SyncPointsSync"; - this.Shown += new System.EventHandler(this.SyncPointsSyncShown); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.SyncPointsSync_KeyDown); - this.Resize += new System.EventHandler(this.SyncPointsSyncResize); - this.groupBoxImportResult.ResumeLayout(false); - this.groupBoxImportResult.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.GroupBox groupBoxImportResult; - private System.Windows.Forms.Label labelSyncInfo; - private System.Windows.Forms.Label labelNoOfSyncPoints; - private System.Windows.Forms.Button buttonSetSyncPoint; - private System.Windows.Forms.Button buttonApplySync; - private System.Windows.Forms.Button buttonRemoveSyncPoint; - private Controls.SubtitleListView SubtitleListview1; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.ListBox listBoxSyncPoints; - private System.Windows.Forms.Label labelOtherSubtitleFileName; - private System.Windows.Forms.Label labelSubtitleFileName; - private Controls.SubtitleListView subtitleListView2; - private System.Windows.Forms.Button buttonFindText; - private System.Windows.Forms.Button buttonFindTextOther; - private System.Windows.Forms.Label labelAdjustFactor; - } +namespace Nikse.SubtitleEdit.Forms +{ + partial class SyncPointsSync + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.groupBoxImportResult = new System.Windows.Forms.GroupBox(); + this.labelAdjustFactor = new System.Windows.Forms.Label(); + this.buttonFindTextOther = new System.Windows.Forms.Button(); + this.buttonFindText = new System.Windows.Forms.Button(); + this.labelOtherSubtitleFileName = new System.Windows.Forms.Label(); + this.labelSubtitleFileName = new System.Windows.Forms.Label(); + this.subtitleListView2 = new Nikse.SubtitleEdit.Controls.SubtitleListView(); + this.listBoxSyncPoints = new System.Windows.Forms.ListBox(); + this.labelNoOfSyncPoints = new System.Windows.Forms.Label(); + this.buttonRemoveSyncPoint = new System.Windows.Forms.Button(); + this.buttonSetSyncPoint = new System.Windows.Forms.Button(); + this.SubtitleListview1 = new Nikse.SubtitleEdit.Controls.SubtitleListView(); + this.labelSyncInfo = new System.Windows.Forms.Label(); + this.buttonApplySync = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.groupBoxImportResult.SuspendLayout(); + this.SuspendLayout(); + // + // groupBoxImportResult + // + this.groupBoxImportResult.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxImportResult.Controls.Add(this.labelAdjustFactor); + this.groupBoxImportResult.Controls.Add(this.buttonFindTextOther); + this.groupBoxImportResult.Controls.Add(this.buttonFindText); + this.groupBoxImportResult.Controls.Add(this.labelOtherSubtitleFileName); + this.groupBoxImportResult.Controls.Add(this.labelSubtitleFileName); + this.groupBoxImportResult.Controls.Add(this.subtitleListView2); + this.groupBoxImportResult.Controls.Add(this.listBoxSyncPoints); + this.groupBoxImportResult.Controls.Add(this.labelNoOfSyncPoints); + this.groupBoxImportResult.Controls.Add(this.buttonRemoveSyncPoint); + this.groupBoxImportResult.Controls.Add(this.buttonSetSyncPoint); + this.groupBoxImportResult.Controls.Add(this.SubtitleListview1); + this.groupBoxImportResult.Location = new System.Drawing.Point(12, 12); + this.groupBoxImportResult.Name = "groupBoxImportResult"; + this.groupBoxImportResult.Size = new System.Drawing.Size(1096, 434); + this.groupBoxImportResult.TabIndex = 16; + this.groupBoxImportResult.TabStop = false; + // + // labelAdjustFactor + // + this.labelAdjustFactor.AutoSize = true; + this.labelAdjustFactor.Font = new System.Drawing.Font("Tahoma", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelAdjustFactor.ForeColor = System.Drawing.Color.Gray; + this.labelAdjustFactor.Location = new System.Drawing.Point(482, 299); + this.labelAdjustFactor.Name = "labelAdjustFactor"; + this.labelAdjustFactor.Size = new System.Drawing.Size(58, 11); + this.labelAdjustFactor.TabIndex = 35; + this.labelAdjustFactor.Text = "AdjustFactor"; + // + // buttonFindTextOther + // + this.buttonFindTextOther.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonFindTextOther.Location = new System.Drawing.Point(976, 407); + this.buttonFindTextOther.Name = "buttonFindTextOther"; + this.buttonFindTextOther.Size = new System.Drawing.Size(106, 23); + this.buttonFindTextOther.TabIndex = 34; + this.buttonFindTextOther.Text = "Find text..."; + this.buttonFindTextOther.UseVisualStyleBackColor = true; + this.buttonFindTextOther.Click += new System.EventHandler(this.ButtonFindTextOtherClick); + // + // buttonFindText + // + this.buttonFindText.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonFindText.Location = new System.Drawing.Point(369, 407); + this.buttonFindText.Name = "buttonFindText"; + this.buttonFindText.Size = new System.Drawing.Size(106, 23); + this.buttonFindText.TabIndex = 33; + this.buttonFindText.Text = "Find text..."; + this.buttonFindText.UseVisualStyleBackColor = true; + this.buttonFindText.Click += new System.EventHandler(this.ButtonFindTextClick); + // + // labelOtherSubtitleFileName + // + this.labelOtherSubtitleFileName.AutoSize = true; + this.labelOtherSubtitleFileName.Location = new System.Drawing.Point(626, 15); + this.labelOtherSubtitleFileName.Name = "labelOtherSubtitleFileName"; + this.labelOtherSubtitleFileName.Size = new System.Drawing.Size(136, 13); + this.labelOtherSubtitleFileName.TabIndex = 21; + this.labelOtherSubtitleFileName.Text = "labelOtherSubtitleFileName"; + // + // labelSubtitleFileName + // + this.labelSubtitleFileName.AutoSize = true; + this.labelSubtitleFileName.Location = new System.Drawing.Point(6, 15); + this.labelSubtitleFileName.Name = "labelSubtitleFileName"; + this.labelSubtitleFileName.Size = new System.Drawing.Size(108, 13); + this.labelSubtitleFileName.TabIndex = 20; + this.labelSubtitleFileName.Text = "labelSubtitleFileName"; + // + // subtitleListView2 + // + this.subtitleListView2.AllowColumnReorder = true; + this.subtitleListView2.AllowDrop = true; + this.subtitleListView2.Anchor = System.Windows.Forms.AnchorStyles.Left; + this.subtitleListView2.FirstVisibleIndex = -1; + this.subtitleListView2.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.subtitleListView2.FullRowSelect = true; + this.subtitleListView2.GridLines = true; + this.subtitleListView2.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.subtitleListView2.HideSelection = false; + this.subtitleListView2.Location = new System.Drawing.Point(629, 33); + this.subtitleListView2.MultiSelect = false; + this.subtitleListView2.Name = "subtitleListView2"; + this.subtitleListView2.OwnerDraw = true; + this.subtitleListView2.Size = new System.Drawing.Size(453, 368); + this.subtitleListView2.SubtitleFontBold = false; + this.subtitleListView2.SubtitleFontName = "Tahoma"; + this.subtitleListView2.SubtitleFontSize = 8; + this.subtitleListView2.TabIndex = 19; + this.subtitleListView2.UseCompatibleStateImageBehavior = false; + this.subtitleListView2.UseSyntaxColoring = true; + this.subtitleListView2.View = System.Windows.Forms.View.Details; + // + // listBoxSyncPoints + // + this.listBoxSyncPoints.Anchor = System.Windows.Forms.AnchorStyles.Right; + this.listBoxSyncPoints.FormattingEnabled = true; + this.listBoxSyncPoints.Location = new System.Drawing.Point(482, 214); + this.listBoxSyncPoints.Name = "listBoxSyncPoints"; + this.listBoxSyncPoints.Size = new System.Drawing.Size(140, 82); + this.listBoxSyncPoints.TabIndex = 18; + this.listBoxSyncPoints.SelectedIndexChanged += new System.EventHandler(this.listBoxSyncPoints_SelectedIndexChanged); + // + // labelNoOfSyncPoints + // + this.labelNoOfSyncPoints.Anchor = System.Windows.Forms.AnchorStyles.Right; + this.labelNoOfSyncPoints.AutoSize = true; + this.labelNoOfSyncPoints.Location = new System.Drawing.Point(481, 196); + this.labelNoOfSyncPoints.Name = "labelNoOfSyncPoints"; + this.labelNoOfSyncPoints.Size = new System.Drawing.Size(75, 13); + this.labelNoOfSyncPoints.TabIndex = 16; + this.labelNoOfSyncPoints.Text = "Sync points: 0"; + // + // buttonRemoveSyncPoint + // + this.buttonRemoveSyncPoint.Anchor = System.Windows.Forms.AnchorStyles.Right; + this.buttonRemoveSyncPoint.Location = new System.Drawing.Point(484, 170); + this.buttonRemoveSyncPoint.Name = "buttonRemoveSyncPoint"; + this.buttonRemoveSyncPoint.Size = new System.Drawing.Size(138, 23); + this.buttonRemoveSyncPoint.TabIndex = 14; + this.buttonRemoveSyncPoint.Text = "Remove sync point"; + this.buttonRemoveSyncPoint.UseVisualStyleBackColor = true; + this.buttonRemoveSyncPoint.Click += new System.EventHandler(this.buttonRemoveSyncPoint_Click); + // + // buttonSetSyncPoint + // + this.buttonSetSyncPoint.Anchor = System.Windows.Forms.AnchorStyles.Right; + this.buttonSetSyncPoint.Location = new System.Drawing.Point(484, 141); + this.buttonSetSyncPoint.Name = "buttonSetSyncPoint"; + this.buttonSetSyncPoint.Size = new System.Drawing.Size(138, 23); + this.buttonSetSyncPoint.TabIndex = 13; + this.buttonSetSyncPoint.Text = "Set sync point"; + this.buttonSetSyncPoint.UseVisualStyleBackColor = true; + this.buttonSetSyncPoint.Click += new System.EventHandler(this.buttonSetSyncPoint_Click); + // + // SubtitleListview1 + // + this.SubtitleListview1.AllowColumnReorder = true; + this.SubtitleListview1.AllowDrop = true; + this.SubtitleListview1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.SubtitleListview1.FirstVisibleIndex = -1; + this.SubtitleListview1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.SubtitleListview1.FullRowSelect = true; + this.SubtitleListview1.GridLines = true; + this.SubtitleListview1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.SubtitleListview1.HideSelection = false; + this.SubtitleListview1.Location = new System.Drawing.Point(9, 33); + this.SubtitleListview1.MultiSelect = false; + this.SubtitleListview1.Name = "SubtitleListview1"; + this.SubtitleListview1.OwnerDraw = true; + this.SubtitleListview1.Size = new System.Drawing.Size(466, 368); + this.SubtitleListview1.SubtitleFontBold = false; + this.SubtitleListview1.SubtitleFontName = "Tahoma"; + this.SubtitleListview1.SubtitleFontSize = 8; + this.SubtitleListview1.TabIndex = 12; + this.SubtitleListview1.UseCompatibleStateImageBehavior = false; + this.SubtitleListview1.UseSyntaxColoring = true; + this.SubtitleListview1.View = System.Windows.Forms.View.Details; + this.SubtitleListview1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.SubtitleListview1_MouseDoubleClick); + // + // labelSyncInfo + // + this.labelSyncInfo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelSyncInfo.AutoSize = true; + this.labelSyncInfo.Location = new System.Drawing.Point(18, 456); + this.labelSyncInfo.Name = "labelSyncInfo"; + this.labelSyncInfo.Size = new System.Drawing.Size(290, 13); + this.labelSyncInfo.TabIndex = 17; + this.labelSyncInfo.Text = "Set at least two sync points to make rough synchronization"; + // + // buttonApplySync + // + this.buttonApplySync.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonApplySync.Enabled = false; + this.buttonApplySync.Location = new System.Drawing.Point(1029, 452); + this.buttonApplySync.Name = "buttonApplySync"; + this.buttonApplySync.Size = new System.Drawing.Size(80, 23); + this.buttonApplySync.TabIndex = 15; + this.buttonApplySync.Text = "Apply"; + this.buttonApplySync.UseVisualStyleBackColor = true; + this.buttonApplySync.Click += new System.EventHandler(this.buttonSync_Click); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(948, 452); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 19; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(867, 452); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 18; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // SyncPointsSync + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1120, 485); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.buttonApplySync); + this.Controls.Add(this.groupBoxImportResult); + this.Controls.Add(this.labelSyncInfo); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.KeyPreview = true; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(600, 400); + this.Name = "SyncPointsSync"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "SyncPointsSync"; + this.Shown += new System.EventHandler(this.SyncPointsSyncShown); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.SyncPointsSync_KeyDown); + this.Resize += new System.EventHandler(this.SyncPointsSyncResize); + this.groupBoxImportResult.ResumeLayout(false); + this.groupBoxImportResult.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBoxImportResult; + private System.Windows.Forms.Label labelSyncInfo; + private System.Windows.Forms.Label labelNoOfSyncPoints; + private System.Windows.Forms.Button buttonSetSyncPoint; + private System.Windows.Forms.Button buttonApplySync; + private System.Windows.Forms.Button buttonRemoveSyncPoint; + private Controls.SubtitleListView SubtitleListview1; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.ListBox listBoxSyncPoints; + private System.Windows.Forms.Label labelOtherSubtitleFileName; + private System.Windows.Forms.Label labelSubtitleFileName; + private Controls.SubtitleListView subtitleListView2; + private System.Windows.Forms.Button buttonFindText; + private System.Windows.Forms.Button buttonFindTextOther; + private System.Windows.Forms.Label labelAdjustFactor; + } } \ No newline at end of file diff --git a/src/Forms/SyncPointsSync.cs b/src/ui/Forms/SyncPointsSync.cs similarity index 97% rename from src/Forms/SyncPointsSync.cs rename to src/ui/Forms/SyncPointsSync.cs index 4c42529a8..b7eacd7bb 100644 --- a/src/Forms/SyncPointsSync.cs +++ b/src/ui/Forms/SyncPointsSync.cs @@ -1,506 +1,506 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Globalization; -using System.Linq; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class SyncPointsSync : PositionAndSizeForm - { - public class ListBoxSyncPoint - { - public int Index { get; set; } - public string Text { get; set; } - - public override string ToString() - { - return Text; - } - } - - private string _subtitleFileName; - private int _audioTrackNumber; - private Subtitle _subtitle; - private Subtitle _originalSubtitle; - private Subtitle _otherSubtitle; - private SortedDictionary _synchronizationPoints = new SortedDictionary(); - private readonly Keys _mainGeneralGoToNextSubtitle = UiUtil.GetKeys(Configuration.Settings.Shortcuts.GeneralGoToNextSubtitle); - private readonly Keys _mainGeneralGoToPrevSubtitle = UiUtil.GetKeys(Configuration.Settings.Shortcuts.GeneralGoToPrevSubtitle); - - public string VideoFileName { get; private set; } - - public Subtitle FixedSubtitle => _subtitle; - - public SyncPointsSync() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - buttonSetSyncPoint.Text = Configuration.Settings.Language.PointSync.SetSyncPoint; - buttonRemoveSyncPoint.Text = Configuration.Settings.Language.PointSync.RemoveSyncPoint; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonApplySync.Text = Configuration.Settings.Language.PointSync.ApplySync; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - labelNoOfSyncPoints.Text = string.Format(Configuration.Settings.Language.PointSync.SyncPointsX, 0); - labelSyncInfo.Text = Configuration.Settings.Language.PointSync.Info; - buttonFindText.Text = Configuration.Settings.Language.VisualSync.FindText; - buttonFindTextOther.Text = Configuration.Settings.Language.VisualSync.FindText; - SubtitleListview1.InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings); - subtitleListView2.InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings); - SubtitleListview1.InitializeTimestampColumnWidths(this); - subtitleListView2.InitializeTimestampColumnWidths(this); - UiUtil.InitializeSubtitleFont(SubtitleListview1); - UiUtil.InitializeSubtitleFont(subtitleListView2); - SubtitleListview1.AutoSizeAllColumns(this); - subtitleListView2.AutoSizeAllColumns(this); - UiUtil.FixLargeFonts(this, buttonOK); - labelAdjustFactor.Text = string.Empty; - } - - public void Initialize(Subtitle subtitle, string subtitleFileName, string videoFileName, int audioTrackNumber) - { - Text = Configuration.Settings.Language.PointSync.Title; - labelSubtitleFileName.Text = subtitleFileName; - _subtitle = new Subtitle(subtitle); - _originalSubtitle = subtitle; - _subtitleFileName = subtitleFileName; - VideoFileName = videoFileName; - _audioTrackNumber = audioTrackNumber; - SubtitleListview1.Fill(subtitle); - if (SubtitleListview1.Items.Count > 0) - { - SubtitleListview1.Items[0].Selected = true; - } - - SubtitleListview1.Anchor = AnchorStyles.Left; - buttonSetSyncPoint.Anchor = AnchorStyles.Left; - buttonRemoveSyncPoint.Anchor = AnchorStyles.Left; - labelNoOfSyncPoints.Anchor = AnchorStyles.Left; - listBoxSyncPoints.Anchor = AnchorStyles.Left; - groupBoxImportResult.Anchor = AnchorStyles.Left; - labelOtherSubtitleFileName.Visible = false; - subtitleListView2.Visible = false; - buttonFindTextOther.Visible = false; - groupBoxImportResult.Width = listBoxSyncPoints.Left + listBoxSyncPoints.Width + 20; - Width = groupBoxImportResult.Left + groupBoxImportResult.Width + 15; - SubtitleListview1.Anchor = AnchorStyles.Left | AnchorStyles.Bottom | AnchorStyles.Top | AnchorStyles.Right; - buttonSetSyncPoint.Anchor = AnchorStyles.Right; - buttonRemoveSyncPoint.Anchor = AnchorStyles.Right; - labelNoOfSyncPoints.Anchor = AnchorStyles.Right; - listBoxSyncPoints.Anchor = AnchorStyles.Right; - groupBoxImportResult.Anchor = AnchorStyles.Left | AnchorStyles.Bottom | AnchorStyles.Top | AnchorStyles.Right; - buttonFindText.Left = SubtitleListview1.Left + SubtitleListview1.Width - buttonFindText.Width; - Width = 900; - groupBoxImportResult.Width = Width - groupBoxImportResult.Left * 3; - labelAdjustFactor.Left = listBoxSyncPoints.Left; - labelAdjustFactor.Anchor = listBoxSyncPoints.Anchor; - MinimumSize = new Size(Width - 50, MinimumSize.Height); - } - - public void Initialize(Subtitle subtitle, string subtitleFileName, string videoFileName, int audioTrackNumber, string otherSubtitleFileName, Subtitle otherSubtitle) - { - Text = Configuration.Settings.Language.PointSync.TitleViaOtherSubtitle; - labelSubtitleFileName.Text = subtitleFileName; - _subtitle = new Subtitle(subtitle); - _otherSubtitle = otherSubtitle; - _originalSubtitle = subtitle; - _subtitleFileName = subtitleFileName; - VideoFileName = videoFileName; - _audioTrackNumber = audioTrackNumber; - SubtitleListview1.Fill(subtitle); - if (SubtitleListview1.Items.Count > 0) - { - SubtitleListview1.Items[0].Selected = true; - } - - labelOtherSubtitleFileName.Text = otherSubtitleFileName; - subtitleListView2.Fill(otherSubtitle); - - SubtitleListview1.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom; - subtitleListView2.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom; - buttonSetSyncPoint.Anchor = AnchorStyles.Left; - buttonRemoveSyncPoint.Anchor = AnchorStyles.Left; - labelNoOfSyncPoints.Anchor = AnchorStyles.Left; - listBoxSyncPoints.Anchor = AnchorStyles.Left; - labelAdjustFactor.Anchor = listBoxSyncPoints.Anchor; - labelOtherSubtitleFileName.Visible = true; - subtitleListView2.Visible = true; - buttonFindTextOther.Visible = true; - Width = subtitleListView2.Width * 2 + 250; - MinimumSize = new Size(Width - 50, MinimumSize.Height); - } - - private void RefreshSynchronizationPointsUi() - { - buttonApplySync.Enabled = _synchronizationPoints.Count > 0; - labelNoOfSyncPoints.Text = string.Format(Configuration.Settings.Language.PointSync.SyncPointsX, _synchronizationPoints.Count); - - listBoxSyncPoints.Items.Clear(); - - for (int i = 0; i < SubtitleListview1.Items.Count; i++) - { - if (_synchronizationPoints.ContainsKey(i)) - { - var p = new Paragraph { StartTime = { TotalMilliseconds = _synchronizationPoints[i].TotalMilliseconds } }; - p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + _subtitle.Paragraphs[i].Duration.TotalMilliseconds; - SubtitleListview1.SetStartTimeAndDuration(i, p, _subtitle.GetParagraphOrDefault(i + 1), _subtitle.GetParagraphOrDefault(i - 1)); - - var item = new ListBoxSyncPoint { Index = i, Text = _subtitle.Paragraphs[i].Number + " - " + p.StartTime }; - listBoxSyncPoints.Items.Add(item); - SubtitleListview1.SetBackgroundColor(i, Color.Green); - SubtitleListview1.SetNumber(_subtitle.Paragraphs[i].Number, "* * * *"); - } - else - { - SubtitleListview1.SetBackgroundColor(i, SubtitleListview1.BackColor); - SubtitleListview1.SetNumber(i, _subtitle.Paragraphs[i].Number.ToString(CultureInfo.InvariantCulture)); - SubtitleListview1.SetStartTimeAndDuration(i, _subtitle.Paragraphs[i], _subtitle.GetParagraphOrDefault(i + 1), _subtitle.GetParagraphOrDefault(i - 1)); - } - } - } - - private void buttonSetSyncPoint_Click(object sender, EventArgs e) - { - if (subtitleListView2.Visible) - { - SetSyncPointViaOthersubtitle(); - } - else - { - if (SubtitleListview1.SelectedItems.Count == 1 && _subtitle != null) - { - using (var getTime = new SetSyncPoint()) - { - int index = SubtitleListview1.SelectedItems[0].Index; - getTime.Initialize(_subtitle, _subtitleFileName, index, VideoFileName, _audioTrackNumber); - if (getTime.ShowDialog(this) == DialogResult.OK) - { - if (_synchronizationPoints.ContainsKey(index)) - { - _synchronizationPoints[index] = getTime.SynchronizationPoint; - } - else - { - _synchronizationPoints.Add(index, getTime.SynchronizationPoint); - } - - RefreshSynchronizationPointsUi(); - VideoFileName = getTime.VideoFileName; - } - Activate(); - VideoFileName = getTime.VideoFileName; - } - } - } - SetSyncFactorLabel(); - } - - private void SetSyncPointViaOthersubtitle() - { - if (_otherSubtitle != null && subtitleListView2.SelectedItems.Count == 1) - { - int index = SubtitleListview1.SelectedItems[0].Index; - int indexOther = subtitleListView2.SelectedItems[0].Index; - - if (_synchronizationPoints.ContainsKey(index)) - { - _synchronizationPoints[index] = TimeSpan.FromMilliseconds(_otherSubtitle.Paragraphs[indexOther].StartTime.TotalMilliseconds); - } - else - { - _synchronizationPoints.Add(index, TimeSpan.FromMilliseconds(_otherSubtitle.Paragraphs[indexOther].StartTime.TotalMilliseconds)); - } - - RefreshSynchronizationPointsUi(); - } - SetSyncFactorLabel(); - } - - private void buttonRemoveSyncPoint_Click(object sender, EventArgs e) - { - if (SubtitleListview1.SelectedItems.Count == 1 && _subtitle != null) - { - int index = SubtitleListview1.SelectedItems[0].Index; - if (_synchronizationPoints.ContainsKey(index)) - { - _synchronizationPoints.Remove(index); - } - - RefreshSynchronizationPointsUi(); - } - SetSyncFactorLabel(); - } - - private void buttonOK_Click(object sender, EventArgs e) - { - if (buttonApplySync.Enabled) - { - buttonSync_Click(null, null); - } - - DialogResult = DialogResult.OK; - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private void SyncPointsSync_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - else if (e.KeyCode == UiUtil.HelpKeys) - { - Utilities.ShowHelp("#sync"); - e.SuppressKeyPress = true; - } - else if (_mainGeneralGoToNextSubtitle == e.KeyData || (e.KeyCode == Keys.Down && e.Modifiers == Keys.Alt)) - { - int selectedIndex = 0; - if (SubtitleListview1.SelectedItems.Count > 0) - { - selectedIndex = SubtitleListview1.SelectedItems[0].Index; - selectedIndex++; - } - SubtitleListview1.SelectIndexAndEnsureVisible(selectedIndex); - e.SuppressKeyPress = true; - } - else if (_mainGeneralGoToPrevSubtitle == e.KeyData || (e.KeyCode == Keys.Up && e.Modifiers == Keys.Alt)) - { - int selectedIndex = 0; - if (SubtitleListview1.SelectedItems.Count > 0) - { - selectedIndex = SubtitleListview1.SelectedItems[0].Index; - selectedIndex--; - } - SubtitleListview1.SelectIndexAndEnsureVisible(selectedIndex); - e.SuppressKeyPress = true; - } - else if (e.KeyData == (Keys.Control | Keys.G)) - { - var subView = SubtitleListview1; - if (subtitleListView2 != null && subtitleListView2.Visible && !SubtitleListview1.Focused) - { - var x = PointToClient(MousePosition).X; - if (x >= subtitleListView2.Left && x <= subtitleListView2.Left + subtitleListView2.Width) - { - subView = subtitleListView2; - } - } - using (var gotoForm = new GoToLine()) - { - gotoForm.Initialize(1, subView.Items.Count); - if (gotoForm.ShowDialog() == DialogResult.OK) - { - subView.SelectIndexAndEnsureVisible(gotoForm.LineNumber - 1, true); - } - } - } - } - - private void SetSyncFactorLabel() - { - labelAdjustFactor.Text = string.Empty; - if (_synchronizationPoints.Count == 1) - { - double startPos = _synchronizationPoints.First().Value.TotalMilliseconds / TimeCode.BaseUnit; - double subStart = _originalSubtitle.Paragraphs[_synchronizationPoints.First().Key].StartTime.TotalMilliseconds / TimeCode.BaseUnit; - - var adjustment = startPos - subStart; - labelAdjustFactor.Text = $"{adjustment:+0.000;-0.000}"; - } - else if (_synchronizationPoints.Count == 2) - { - double startPos = _synchronizationPoints.First().Value.TotalMilliseconds / TimeCode.BaseUnit; - double endPos = _synchronizationPoints.Last().Value.TotalMilliseconds / TimeCode.BaseUnit; - - double subStart = _originalSubtitle.Paragraphs[_synchronizationPoints.First().Key].StartTime.TotalMilliseconds / TimeCode.BaseUnit; - double subEnd = _originalSubtitle.Paragraphs[_synchronizationPoints.Last().Key].StartTime.TotalMilliseconds / TimeCode.BaseUnit; - - double subDiff = subEnd - subStart; - double realDiff = endPos - startPos; - - // speed factor - double factor = realDiff / subDiff; - - // adjust to starting position - double adjust = startPos - subStart * factor; - - labelAdjustFactor.Text = $"*{factor:0.000}, {adjust:+0.000;-0.000}"; - } - } - - private void Sync(int startIndex, int endIndex, int minIndex, int maxIndex, double startPos, double endPos) - { - if (endPos > startPos) - { - double subStart = _originalSubtitle.Paragraphs[startIndex].StartTime.TotalMilliseconds / TimeCode.BaseUnit; - double subEnd = _originalSubtitle.Paragraphs[endIndex].StartTime.TotalMilliseconds / TimeCode.BaseUnit; - - double subDiff = subEnd - subStart; - double realDiff = endPos - startPos; - - // speed factor - double factor = Math.Abs(subDiff) < 0.001 ? 1 : realDiff / subDiff; - - // adjust to starting position - double adjust = startPos - subStart * factor; - - for (int i = minIndex; i < _subtitle.Paragraphs.Count; i++) - { - if (i <= maxIndex) - { - Paragraph p = _subtitle.Paragraphs[i]; - p.StartTime.TotalMilliseconds = _originalSubtitle.Paragraphs[i].StartTime.TotalMilliseconds; - p.EndTime.TotalMilliseconds = _originalSubtitle.Paragraphs[i].EndTime.TotalMilliseconds; - p.Adjust(factor, adjust); - } - } - } - } - - private void buttonSync_Click(object sender, EventArgs e) - { - if (_synchronizationPoints.Count == 1) - { - foreach (KeyValuePair kvp in _synchronizationPoints) - { - AdjustViaShowEarlierLater(kvp.Key, kvp.Value.TotalMilliseconds); - } - - _synchronizationPoints = new SortedDictionary(); - SubtitleListview1.Fill(_subtitle); - RefreshSynchronizationPointsUi(); - return; - } - - int endIndex = -1; - int minIndex = 0; - var syncIndices = new List(); - foreach (var kvp in _synchronizationPoints) - { - syncIndices.Add(kvp.Key); - } - - for (int i = 0; i < syncIndices.Count; i++) - { - if (i == 0) - { - endIndex = syncIndices[i]; - } - else - { - var startIndex = endIndex; - endIndex = syncIndices[i]; - - int maxIndex; - if (i == syncIndices.Count - 1) - { - maxIndex = _subtitle.Paragraphs.Count; - } - else - { - maxIndex = syncIndices[i]; - } - - Sync(startIndex, endIndex, minIndex, maxIndex, _synchronizationPoints[startIndex].TotalMilliseconds / TimeCode.BaseUnit, _synchronizationPoints[endIndex].TotalMilliseconds / TimeCode.BaseUnit); - - minIndex = endIndex; - } - } - SubtitleListview1.Fill(_subtitle); - RefreshSynchronizationPointsUi(); - } - - private void AdjustViaShowEarlierLater(int index, double newTotalMilliseconds) - { - var oldTotalMilliseconds = _subtitle.Paragraphs[index].StartTime.TotalMilliseconds; - var diff = newTotalMilliseconds - oldTotalMilliseconds; - _subtitle.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(diff)); - } - - private void listBoxSyncPoints_SelectedIndexChanged(object sender, EventArgs e) - { - if (listBoxSyncPoints.SelectedIndex >= 0) - { - var item = (ListBoxSyncPoint)listBoxSyncPoints.Items[listBoxSyncPoints.SelectedIndex]; - SubtitleListview1.SelectIndexAndEnsureVisible(item.Index); - } - } - - private void SubtitleListview1_MouseDoubleClick(object sender, MouseEventArgs e) - { - if (SubtitleListview1.SelectedItems.Count == 1) - { - int index = SubtitleListview1.SelectedItems[0].Index; - if (_synchronizationPoints.ContainsKey(index)) - { - buttonRemoveSyncPoint_Click(null, null); - } - else - { - buttonSetSyncPoint_Click(null, null); - } - } - } - - private void SyncPointsSyncResize(object sender, EventArgs e) - { - if (subtitleListView2.Visible) - { - int widthInMiddle = listBoxSyncPoints.Width; - SubtitleListview1.Width = (groupBoxImportResult.Width - widthInMiddle) / 2 - 12; - subtitleListView2.Width = SubtitleListview1.Width; - subtitleListView2.Left = SubtitleListview1.Left + SubtitleListview1.Width + widthInMiddle + 10; - listBoxSyncPoints.Left = SubtitleListview1.Left + SubtitleListview1.Width + 5; - buttonSetSyncPoint.Left = listBoxSyncPoints.Left; - buttonRemoveSyncPoint.Left = listBoxSyncPoints.Left; - labelAdjustFactor.Left = listBoxSyncPoints.Left; - labelNoOfSyncPoints.Left = listBoxSyncPoints.Left; - labelOtherSubtitleFileName.Left = subtitleListView2.Left; - buttonFindText.Left = SubtitleListview1.Left + SubtitleListview1.Width - buttonFindText.Width; - } - } - - private void SyncPointsSyncShown(object sender, EventArgs e) - { - SyncPointsSyncResize(null, null); - } - - private void ButtonFindTextClick(object sender, EventArgs e) - { - using (var findSubtitle = new FindSubtitleLine()) - { - findSubtitle.Initialize(_subtitle.Paragraphs, string.Empty); - findSubtitle.ShowDialog(); - if (findSubtitle.SelectedIndex >= 0) - { - SubtitleListview1.SelectIndexAndEnsureVisible(findSubtitle.SelectedIndex); - } - } - } - - private void ButtonFindTextOtherClick(object sender, EventArgs e) - { - using (var findSubtitle = new FindSubtitleLine()) - { - findSubtitle.Initialize(_otherSubtitle.Paragraphs, string.Empty); - findSubtitle.ShowDialog(); - if (findSubtitle.SelectedIndex >= 0) - { - subtitleListView2.SelectIndexAndEnsureVisible(findSubtitle.SelectedIndex); - } - } - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Globalization; +using System.Linq; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class SyncPointsSync : PositionAndSizeForm + { + public class ListBoxSyncPoint + { + public int Index { get; set; } + public string Text { get; set; } + + public override string ToString() + { + return Text; + } + } + + private string _subtitleFileName; + private int _audioTrackNumber; + private Subtitle _subtitle; + private Subtitle _originalSubtitle; + private Subtitle _otherSubtitle; + private SortedDictionary _synchronizationPoints = new SortedDictionary(); + private readonly Keys _mainGeneralGoToNextSubtitle = UiUtil.GetKeys(Configuration.Settings.Shortcuts.GeneralGoToNextSubtitle); + private readonly Keys _mainGeneralGoToPrevSubtitle = UiUtil.GetKeys(Configuration.Settings.Shortcuts.GeneralGoToPrevSubtitle); + + public string VideoFileName { get; private set; } + + public Subtitle FixedSubtitle => _subtitle; + + public SyncPointsSync() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + buttonSetSyncPoint.Text = Configuration.Settings.Language.PointSync.SetSyncPoint; + buttonRemoveSyncPoint.Text = Configuration.Settings.Language.PointSync.RemoveSyncPoint; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonApplySync.Text = Configuration.Settings.Language.PointSync.ApplySync; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + labelNoOfSyncPoints.Text = string.Format(Configuration.Settings.Language.PointSync.SyncPointsX, 0); + labelSyncInfo.Text = Configuration.Settings.Language.PointSync.Info; + buttonFindText.Text = Configuration.Settings.Language.VisualSync.FindText; + buttonFindTextOther.Text = Configuration.Settings.Language.VisualSync.FindText; + SubtitleListview1.InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings); + subtitleListView2.InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings); + SubtitleListview1.InitializeTimestampColumnWidths(this); + subtitleListView2.InitializeTimestampColumnWidths(this); + UiUtil.InitializeSubtitleFont(SubtitleListview1); + UiUtil.InitializeSubtitleFont(subtitleListView2); + SubtitleListview1.AutoSizeAllColumns(this); + subtitleListView2.AutoSizeAllColumns(this); + UiUtil.FixLargeFonts(this, buttonOK); + labelAdjustFactor.Text = string.Empty; + } + + public void Initialize(Subtitle subtitle, string subtitleFileName, string videoFileName, int audioTrackNumber) + { + Text = Configuration.Settings.Language.PointSync.Title; + labelSubtitleFileName.Text = subtitleFileName; + _subtitle = new Subtitle(subtitle); + _originalSubtitle = subtitle; + _subtitleFileName = subtitleFileName; + VideoFileName = videoFileName; + _audioTrackNumber = audioTrackNumber; + SubtitleListview1.Fill(subtitle); + if (SubtitleListview1.Items.Count > 0) + { + SubtitleListview1.Items[0].Selected = true; + } + + SubtitleListview1.Anchor = AnchorStyles.Left; + buttonSetSyncPoint.Anchor = AnchorStyles.Left; + buttonRemoveSyncPoint.Anchor = AnchorStyles.Left; + labelNoOfSyncPoints.Anchor = AnchorStyles.Left; + listBoxSyncPoints.Anchor = AnchorStyles.Left; + groupBoxImportResult.Anchor = AnchorStyles.Left; + labelOtherSubtitleFileName.Visible = false; + subtitleListView2.Visible = false; + buttonFindTextOther.Visible = false; + groupBoxImportResult.Width = listBoxSyncPoints.Left + listBoxSyncPoints.Width + 20; + Width = groupBoxImportResult.Left + groupBoxImportResult.Width + 15; + SubtitleListview1.Anchor = AnchorStyles.Left | AnchorStyles.Bottom | AnchorStyles.Top | AnchorStyles.Right; + buttonSetSyncPoint.Anchor = AnchorStyles.Right; + buttonRemoveSyncPoint.Anchor = AnchorStyles.Right; + labelNoOfSyncPoints.Anchor = AnchorStyles.Right; + listBoxSyncPoints.Anchor = AnchorStyles.Right; + groupBoxImportResult.Anchor = AnchorStyles.Left | AnchorStyles.Bottom | AnchorStyles.Top | AnchorStyles.Right; + buttonFindText.Left = SubtitleListview1.Left + SubtitleListview1.Width - buttonFindText.Width; + Width = 900; + groupBoxImportResult.Width = Width - groupBoxImportResult.Left * 3; + labelAdjustFactor.Left = listBoxSyncPoints.Left; + labelAdjustFactor.Anchor = listBoxSyncPoints.Anchor; + MinimumSize = new Size(Width - 50, MinimumSize.Height); + } + + public void Initialize(Subtitle subtitle, string subtitleFileName, string videoFileName, int audioTrackNumber, string otherSubtitleFileName, Subtitle otherSubtitle) + { + Text = Configuration.Settings.Language.PointSync.TitleViaOtherSubtitle; + labelSubtitleFileName.Text = subtitleFileName; + _subtitle = new Subtitle(subtitle); + _otherSubtitle = otherSubtitle; + _originalSubtitle = subtitle; + _subtitleFileName = subtitleFileName; + VideoFileName = videoFileName; + _audioTrackNumber = audioTrackNumber; + SubtitleListview1.Fill(subtitle); + if (SubtitleListview1.Items.Count > 0) + { + SubtitleListview1.Items[0].Selected = true; + } + + labelOtherSubtitleFileName.Text = otherSubtitleFileName; + subtitleListView2.Fill(otherSubtitle); + + SubtitleListview1.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom; + subtitleListView2.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom; + buttonSetSyncPoint.Anchor = AnchorStyles.Left; + buttonRemoveSyncPoint.Anchor = AnchorStyles.Left; + labelNoOfSyncPoints.Anchor = AnchorStyles.Left; + listBoxSyncPoints.Anchor = AnchorStyles.Left; + labelAdjustFactor.Anchor = listBoxSyncPoints.Anchor; + labelOtherSubtitleFileName.Visible = true; + subtitleListView2.Visible = true; + buttonFindTextOther.Visible = true; + Width = subtitleListView2.Width * 2 + 250; + MinimumSize = new Size(Width - 50, MinimumSize.Height); + } + + private void RefreshSynchronizationPointsUi() + { + buttonApplySync.Enabled = _synchronizationPoints.Count > 0; + labelNoOfSyncPoints.Text = string.Format(Configuration.Settings.Language.PointSync.SyncPointsX, _synchronizationPoints.Count); + + listBoxSyncPoints.Items.Clear(); + + for (int i = 0; i < SubtitleListview1.Items.Count; i++) + { + if (_synchronizationPoints.ContainsKey(i)) + { + var p = new Paragraph { StartTime = { TotalMilliseconds = _synchronizationPoints[i].TotalMilliseconds } }; + p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + _subtitle.Paragraphs[i].Duration.TotalMilliseconds; + SubtitleListview1.SetStartTimeAndDuration(i, p, _subtitle.GetParagraphOrDefault(i + 1), _subtitle.GetParagraphOrDefault(i - 1)); + + var item = new ListBoxSyncPoint { Index = i, Text = _subtitle.Paragraphs[i].Number + " - " + p.StartTime }; + listBoxSyncPoints.Items.Add(item); + SubtitleListview1.SetBackgroundColor(i, Color.Green); + SubtitleListview1.SetNumber(_subtitle.Paragraphs[i].Number, "* * * *"); + } + else + { + SubtitleListview1.SetBackgroundColor(i, SubtitleListview1.BackColor); + SubtitleListview1.SetNumber(i, _subtitle.Paragraphs[i].Number.ToString(CultureInfo.InvariantCulture)); + SubtitleListview1.SetStartTimeAndDuration(i, _subtitle.Paragraphs[i], _subtitle.GetParagraphOrDefault(i + 1), _subtitle.GetParagraphOrDefault(i - 1)); + } + } + } + + private void buttonSetSyncPoint_Click(object sender, EventArgs e) + { + if (subtitleListView2.Visible) + { + SetSyncPointViaOthersubtitle(); + } + else + { + if (SubtitleListview1.SelectedItems.Count == 1 && _subtitle != null) + { + using (var getTime = new SetSyncPoint()) + { + int index = SubtitleListview1.SelectedItems[0].Index; + getTime.Initialize(_subtitle, _subtitleFileName, index, VideoFileName, _audioTrackNumber); + if (getTime.ShowDialog(this) == DialogResult.OK) + { + if (_synchronizationPoints.ContainsKey(index)) + { + _synchronizationPoints[index] = getTime.SynchronizationPoint; + } + else + { + _synchronizationPoints.Add(index, getTime.SynchronizationPoint); + } + + RefreshSynchronizationPointsUi(); + VideoFileName = getTime.VideoFileName; + } + Activate(); + VideoFileName = getTime.VideoFileName; + } + } + } + SetSyncFactorLabel(); + } + + private void SetSyncPointViaOthersubtitle() + { + if (_otherSubtitle != null && subtitleListView2.SelectedItems.Count == 1) + { + int index = SubtitleListview1.SelectedItems[0].Index; + int indexOther = subtitleListView2.SelectedItems[0].Index; + + if (_synchronizationPoints.ContainsKey(index)) + { + _synchronizationPoints[index] = TimeSpan.FromMilliseconds(_otherSubtitle.Paragraphs[indexOther].StartTime.TotalMilliseconds); + } + else + { + _synchronizationPoints.Add(index, TimeSpan.FromMilliseconds(_otherSubtitle.Paragraphs[indexOther].StartTime.TotalMilliseconds)); + } + + RefreshSynchronizationPointsUi(); + } + SetSyncFactorLabel(); + } + + private void buttonRemoveSyncPoint_Click(object sender, EventArgs e) + { + if (SubtitleListview1.SelectedItems.Count == 1 && _subtitle != null) + { + int index = SubtitleListview1.SelectedItems[0].Index; + if (_synchronizationPoints.ContainsKey(index)) + { + _synchronizationPoints.Remove(index); + } + + RefreshSynchronizationPointsUi(); + } + SetSyncFactorLabel(); + } + + private void buttonOK_Click(object sender, EventArgs e) + { + if (buttonApplySync.Enabled) + { + buttonSync_Click(null, null); + } + + DialogResult = DialogResult.OK; + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void SyncPointsSync_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + else if (e.KeyCode == UiUtil.HelpKeys) + { + Utilities.ShowHelp("#sync"); + e.SuppressKeyPress = true; + } + else if (_mainGeneralGoToNextSubtitle == e.KeyData || (e.KeyCode == Keys.Down && e.Modifiers == Keys.Alt)) + { + int selectedIndex = 0; + if (SubtitleListview1.SelectedItems.Count > 0) + { + selectedIndex = SubtitleListview1.SelectedItems[0].Index; + selectedIndex++; + } + SubtitleListview1.SelectIndexAndEnsureVisible(selectedIndex); + e.SuppressKeyPress = true; + } + else if (_mainGeneralGoToPrevSubtitle == e.KeyData || (e.KeyCode == Keys.Up && e.Modifiers == Keys.Alt)) + { + int selectedIndex = 0; + if (SubtitleListview1.SelectedItems.Count > 0) + { + selectedIndex = SubtitleListview1.SelectedItems[0].Index; + selectedIndex--; + } + SubtitleListview1.SelectIndexAndEnsureVisible(selectedIndex); + e.SuppressKeyPress = true; + } + else if (e.KeyData == (Keys.Control | Keys.G)) + { + var subView = SubtitleListview1; + if (subtitleListView2 != null && subtitleListView2.Visible && !SubtitleListview1.Focused) + { + var x = PointToClient(MousePosition).X; + if (x >= subtitleListView2.Left && x <= subtitleListView2.Left + subtitleListView2.Width) + { + subView = subtitleListView2; + } + } + using (var gotoForm = new GoToLine()) + { + gotoForm.Initialize(1, subView.Items.Count); + if (gotoForm.ShowDialog() == DialogResult.OK) + { + subView.SelectIndexAndEnsureVisible(gotoForm.LineNumber - 1, true); + } + } + } + } + + private void SetSyncFactorLabel() + { + labelAdjustFactor.Text = string.Empty; + if (_synchronizationPoints.Count == 1) + { + double startPos = _synchronizationPoints.First().Value.TotalMilliseconds / TimeCode.BaseUnit; + double subStart = _originalSubtitle.Paragraphs[_synchronizationPoints.First().Key].StartTime.TotalMilliseconds / TimeCode.BaseUnit; + + var adjustment = startPos - subStart; + labelAdjustFactor.Text = $"{adjustment:+0.000;-0.000}"; + } + else if (_synchronizationPoints.Count == 2) + { + double startPos = _synchronizationPoints.First().Value.TotalMilliseconds / TimeCode.BaseUnit; + double endPos = _synchronizationPoints.Last().Value.TotalMilliseconds / TimeCode.BaseUnit; + + double subStart = _originalSubtitle.Paragraphs[_synchronizationPoints.First().Key].StartTime.TotalMilliseconds / TimeCode.BaseUnit; + double subEnd = _originalSubtitle.Paragraphs[_synchronizationPoints.Last().Key].StartTime.TotalMilliseconds / TimeCode.BaseUnit; + + double subDiff = subEnd - subStart; + double realDiff = endPos - startPos; + + // speed factor + double factor = realDiff / subDiff; + + // adjust to starting position + double adjust = startPos - subStart * factor; + + labelAdjustFactor.Text = $"*{factor:0.000}, {adjust:+0.000;-0.000}"; + } + } + + private void Sync(int startIndex, int endIndex, int minIndex, int maxIndex, double startPos, double endPos) + { + if (endPos > startPos) + { + double subStart = _originalSubtitle.Paragraphs[startIndex].StartTime.TotalMilliseconds / TimeCode.BaseUnit; + double subEnd = _originalSubtitle.Paragraphs[endIndex].StartTime.TotalMilliseconds / TimeCode.BaseUnit; + + double subDiff = subEnd - subStart; + double realDiff = endPos - startPos; + + // speed factor + double factor = Math.Abs(subDiff) < 0.001 ? 1 : realDiff / subDiff; + + // adjust to starting position + double adjust = startPos - subStart * factor; + + for (int i = minIndex; i < _subtitle.Paragraphs.Count; i++) + { + if (i <= maxIndex) + { + Paragraph p = _subtitle.Paragraphs[i]; + p.StartTime.TotalMilliseconds = _originalSubtitle.Paragraphs[i].StartTime.TotalMilliseconds; + p.EndTime.TotalMilliseconds = _originalSubtitle.Paragraphs[i].EndTime.TotalMilliseconds; + p.Adjust(factor, adjust); + } + } + } + } + + private void buttonSync_Click(object sender, EventArgs e) + { + if (_synchronizationPoints.Count == 1) + { + foreach (KeyValuePair kvp in _synchronizationPoints) + { + AdjustViaShowEarlierLater(kvp.Key, kvp.Value.TotalMilliseconds); + } + + _synchronizationPoints = new SortedDictionary(); + SubtitleListview1.Fill(_subtitle); + RefreshSynchronizationPointsUi(); + return; + } + + int endIndex = -1; + int minIndex = 0; + var syncIndices = new List(); + foreach (var kvp in _synchronizationPoints) + { + syncIndices.Add(kvp.Key); + } + + for (int i = 0; i < syncIndices.Count; i++) + { + if (i == 0) + { + endIndex = syncIndices[i]; + } + else + { + var startIndex = endIndex; + endIndex = syncIndices[i]; + + int maxIndex; + if (i == syncIndices.Count - 1) + { + maxIndex = _subtitle.Paragraphs.Count; + } + else + { + maxIndex = syncIndices[i]; + } + + Sync(startIndex, endIndex, minIndex, maxIndex, _synchronizationPoints[startIndex].TotalMilliseconds / TimeCode.BaseUnit, _synchronizationPoints[endIndex].TotalMilliseconds / TimeCode.BaseUnit); + + minIndex = endIndex; + } + } + SubtitleListview1.Fill(_subtitle); + RefreshSynchronizationPointsUi(); + } + + private void AdjustViaShowEarlierLater(int index, double newTotalMilliseconds) + { + var oldTotalMilliseconds = _subtitle.Paragraphs[index].StartTime.TotalMilliseconds; + var diff = newTotalMilliseconds - oldTotalMilliseconds; + _subtitle.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(diff)); + } + + private void listBoxSyncPoints_SelectedIndexChanged(object sender, EventArgs e) + { + if (listBoxSyncPoints.SelectedIndex >= 0) + { + var item = (ListBoxSyncPoint)listBoxSyncPoints.Items[listBoxSyncPoints.SelectedIndex]; + SubtitleListview1.SelectIndexAndEnsureVisible(item.Index); + } + } + + private void SubtitleListview1_MouseDoubleClick(object sender, MouseEventArgs e) + { + if (SubtitleListview1.SelectedItems.Count == 1) + { + int index = SubtitleListview1.SelectedItems[0].Index; + if (_synchronizationPoints.ContainsKey(index)) + { + buttonRemoveSyncPoint_Click(null, null); + } + else + { + buttonSetSyncPoint_Click(null, null); + } + } + } + + private void SyncPointsSyncResize(object sender, EventArgs e) + { + if (subtitleListView2.Visible) + { + int widthInMiddle = listBoxSyncPoints.Width; + SubtitleListview1.Width = (groupBoxImportResult.Width - widthInMiddle) / 2 - 12; + subtitleListView2.Width = SubtitleListview1.Width; + subtitleListView2.Left = SubtitleListview1.Left + SubtitleListview1.Width + widthInMiddle + 10; + listBoxSyncPoints.Left = SubtitleListview1.Left + SubtitleListview1.Width + 5; + buttonSetSyncPoint.Left = listBoxSyncPoints.Left; + buttonRemoveSyncPoint.Left = listBoxSyncPoints.Left; + labelAdjustFactor.Left = listBoxSyncPoints.Left; + labelNoOfSyncPoints.Left = listBoxSyncPoints.Left; + labelOtherSubtitleFileName.Left = subtitleListView2.Left; + buttonFindText.Left = SubtitleListview1.Left + SubtitleListview1.Width - buttonFindText.Width; + } + } + + private void SyncPointsSyncShown(object sender, EventArgs e) + { + SyncPointsSyncResize(null, null); + } + + private void ButtonFindTextClick(object sender, EventArgs e) + { + using (var findSubtitle = new FindSubtitleLine()) + { + findSubtitle.Initialize(_subtitle.Paragraphs, string.Empty); + findSubtitle.ShowDialog(); + if (findSubtitle.SelectedIndex >= 0) + { + SubtitleListview1.SelectIndexAndEnsureVisible(findSubtitle.SelectedIndex); + } + } + } + + private void ButtonFindTextOtherClick(object sender, EventArgs e) + { + using (var findSubtitle = new FindSubtitleLine()) + { + findSubtitle.Initialize(_otherSubtitle.Paragraphs, string.Empty); + findSubtitle.ShowDialog(); + if (findSubtitle.SelectedIndex >= 0) + { + subtitleListView2.SelectIndexAndEnsureVisible(findSubtitle.SelectedIndex); + } + } + } + + } +} diff --git a/src/Forms/SyncPointsSync.resx b/src/ui/Forms/SyncPointsSync.resx similarity index 97% rename from src/Forms/SyncPointsSync.resx rename to src/ui/Forms/SyncPointsSync.resx index 29dcb1b3a..1af7de150 100644 --- a/src/Forms/SyncPointsSync.resx +++ b/src/ui/Forms/SyncPointsSync.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Forms/TextPrompt.Designer.cs b/src/ui/Forms/TextPrompt.Designer.cs similarity index 100% rename from src/Forms/TextPrompt.Designer.cs rename to src/ui/Forms/TextPrompt.Designer.cs diff --git a/src/Forms/TextPrompt.cs b/src/ui/Forms/TextPrompt.cs similarity index 100% rename from src/Forms/TextPrompt.cs rename to src/ui/Forms/TextPrompt.cs diff --git a/src/ui/Forms/TextPrompt.resx b/src/ui/Forms/TextPrompt.resx new file mode 100644 index 000000000..1af7de150 --- /dev/null +++ b/src/ui/Forms/TextPrompt.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/src/Forms/TimedTextNewLanguage.Designer.cs b/src/ui/Forms/TimedTextNewLanguage.Designer.cs similarity index 100% rename from src/Forms/TimedTextNewLanguage.Designer.cs rename to src/ui/Forms/TimedTextNewLanguage.Designer.cs diff --git a/src/Forms/TimedTextNewLanguage.cs b/src/ui/Forms/TimedTextNewLanguage.cs similarity index 100% rename from src/Forms/TimedTextNewLanguage.cs rename to src/ui/Forms/TimedTextNewLanguage.cs diff --git a/src/ui/Forms/TimedTextNewLanguage.resx b/src/ui/Forms/TimedTextNewLanguage.resx new file mode 100644 index 000000000..1af7de150 --- /dev/null +++ b/src/ui/Forms/TimedTextNewLanguage.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/src/Forms/TimedTextProperties.Designer.cs b/src/ui/Forms/TimedTextProperties.Designer.cs similarity index 98% rename from src/Forms/TimedTextProperties.Designer.cs rename to src/ui/Forms/TimedTextProperties.Designer.cs index 36916131b..efa7d25cd 100644 --- a/src/Forms/TimedTextProperties.Designer.cs +++ b/src/ui/Forms/TimedTextProperties.Designer.cs @@ -1,384 +1,384 @@ -namespace Nikse.SubtitleEdit.Forms -{ - partial class TimedTextProperties - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.buttonOK = new System.Windows.Forms.Button(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.groupBoxOptions = new System.Windows.Forms.GroupBox(); - this.comboBoxTimeCodeFormat = new System.Windows.Forms.ComboBox(); - this.labelTimeCode = new System.Windows.Forms.Label(); - this.comboBoxFrameRateMultiplier = new System.Windows.Forms.ComboBox(); - this.textBoxDescription = new System.Windows.Forms.TextBox(); - this.label7 = new System.Windows.Forms.Label(); - this.textBoxTitle = new System.Windows.Forms.TextBox(); - this.label6 = new System.Windows.Forms.Label(); - this.comboBoxDefaultRegion = new System.Windows.Forms.ComboBox(); - this.labelDefaultRegion = new System.Windows.Forms.Label(); - this.comboBoxDropMode = new System.Windows.Forms.ComboBox(); - this.label4 = new System.Windows.Forms.Label(); - this.label3 = new System.Windows.Forms.Label(); - this.comboBoxFrameRate = new System.Windows.Forms.ComboBox(); - this.label2 = new System.Windows.Forms.Label(); - this.comboBoxTimeBase = new System.Windows.Forms.ComboBox(); - this.label1 = new System.Windows.Forms.Label(); - this.comboBoxLanguage = new System.Windows.Forms.ComboBox(); - this.labelCollision = new System.Windows.Forms.Label(); - this.comboBoxDefaultStyle = new System.Windows.Forms.ComboBox(); - this.labelWrapStyle = new System.Windows.Forms.Label(); - this.comboBoxFileExtensions = new System.Windows.Forms.ComboBox(); - this.labelFileExtension = new System.Windows.Forms.Label(); - this.groupBoxOptions.SuspendLayout(); - this.SuspendLayout(); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.Location = new System.Drawing.Point(335, 401); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 1; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.Location = new System.Drawing.Point(416, 401); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 2; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // groupBoxOptions - // - this.groupBoxOptions.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxOptions.Controls.Add(this.comboBoxFileExtensions); - this.groupBoxOptions.Controls.Add(this.labelFileExtension); - this.groupBoxOptions.Controls.Add(this.comboBoxTimeCodeFormat); - this.groupBoxOptions.Controls.Add(this.labelTimeCode); - this.groupBoxOptions.Controls.Add(this.comboBoxFrameRateMultiplier); - this.groupBoxOptions.Controls.Add(this.textBoxDescription); - this.groupBoxOptions.Controls.Add(this.label7); - this.groupBoxOptions.Controls.Add(this.textBoxTitle); - this.groupBoxOptions.Controls.Add(this.label6); - this.groupBoxOptions.Controls.Add(this.comboBoxDefaultRegion); - this.groupBoxOptions.Controls.Add(this.labelDefaultRegion); - this.groupBoxOptions.Controls.Add(this.comboBoxDropMode); - this.groupBoxOptions.Controls.Add(this.label4); - this.groupBoxOptions.Controls.Add(this.label3); - this.groupBoxOptions.Controls.Add(this.comboBoxFrameRate); - this.groupBoxOptions.Controls.Add(this.label2); - this.groupBoxOptions.Controls.Add(this.comboBoxTimeBase); - this.groupBoxOptions.Controls.Add(this.label1); - this.groupBoxOptions.Controls.Add(this.comboBoxLanguage); - this.groupBoxOptions.Controls.Add(this.labelCollision); - this.groupBoxOptions.Controls.Add(this.comboBoxDefaultStyle); - this.groupBoxOptions.Controls.Add(this.labelWrapStyle); - this.groupBoxOptions.Location = new System.Drawing.Point(12, 12); - this.groupBoxOptions.Name = "groupBoxOptions"; - this.groupBoxOptions.Size = new System.Drawing.Size(479, 383); - this.groupBoxOptions.TabIndex = 0; - this.groupBoxOptions.TabStop = false; - // - // comboBoxTimeCodeFormat - // - this.comboBoxTimeCodeFormat.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxTimeCodeFormat.FormattingEnabled = true; - this.comboBoxTimeCodeFormat.Items.AddRange(new object[] { - "Source", - "Seconds", - "Milliseconds", - "Ticks", - "hh:mm:ss:ff", - "hh:mm:ss.ms", - "hh:mm:ss.ms-two-digits", - "hh:mm:ss,ms"}); - this.comboBoxTimeCodeFormat.Location = new System.Drawing.Point(191, 309); - this.comboBoxTimeCodeFormat.Name = "comboBoxTimeCodeFormat"; - this.comboBoxTimeCodeFormat.Size = new System.Drawing.Size(263, 21); - this.comboBoxTimeCodeFormat.TabIndex = 19; - // - // labelTimeCode - // - this.labelTimeCode.AutoSize = true; - this.labelTimeCode.Location = new System.Drawing.Point(6, 312); - this.labelTimeCode.Name = "labelTimeCode"; - this.labelTimeCode.Size = new System.Drawing.Size(89, 13); - this.labelTimeCode.TabIndex = 20; - this.labelTimeCode.Text = "Time code format"; - // - // comboBoxFrameRateMultiplier - // - this.comboBoxFrameRateMultiplier.FormattingEnabled = true; - this.comboBoxFrameRateMultiplier.Items.AddRange(new object[] { - "999 1000", - "1 1", - "1000 1001"}); - this.comboBoxFrameRateMultiplier.Location = new System.Drawing.Point(191, 176); - this.comboBoxFrameRateMultiplier.Name = "comboBoxFrameRateMultiplier"; - this.comboBoxFrameRateMultiplier.Size = new System.Drawing.Size(263, 21); - this.comboBoxFrameRateMultiplier.TabIndex = 18; - // - // textBoxDescription - // - this.textBoxDescription.Location = new System.Drawing.Point(191, 56); - this.textBoxDescription.Name = "textBoxDescription"; - this.textBoxDescription.Size = new System.Drawing.Size(263, 20); - this.textBoxDescription.TabIndex = 1; - // - // label7 - // - this.label7.AutoSize = true; - this.label7.Location = new System.Drawing.Point(6, 58); - this.label7.Name = "label7"; - this.label7.Size = new System.Drawing.Size(60, 13); - this.label7.TabIndex = 17; - this.label7.Text = "Description"; - // - // textBoxTitle - // - this.textBoxTitle.Location = new System.Drawing.Point(191, 30); - this.textBoxTitle.Name = "textBoxTitle"; - this.textBoxTitle.Size = new System.Drawing.Size(263, 20); - this.textBoxTitle.TabIndex = 0; - // - // label6 - // - this.label6.AutoSize = true; - this.label6.Location = new System.Drawing.Point(6, 32); - this.label6.Name = "label6"; - this.label6.Size = new System.Drawing.Size(27, 13); - this.label6.TabIndex = 15; - this.label6.Text = "Title"; - // - // comboBoxDefaultRegion - // - this.comboBoxDefaultRegion.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxDefaultRegion.FormattingEnabled = true; - this.comboBoxDefaultRegion.Location = new System.Drawing.Point(191, 270); - this.comboBoxDefaultRegion.Name = "comboBoxDefaultRegion"; - this.comboBoxDefaultRegion.Size = new System.Drawing.Size(263, 21); - this.comboBoxDefaultRegion.TabIndex = 8; - // - // labelDefaultRegion - // - this.labelDefaultRegion.AutoSize = true; - this.labelDefaultRegion.Location = new System.Drawing.Point(6, 273); - this.labelDefaultRegion.Name = "labelDefaultRegion"; - this.labelDefaultRegion.Size = new System.Drawing.Size(73, 13); - this.labelDefaultRegion.TabIndex = 12; - this.labelDefaultRegion.Text = "Default region"; - // - // comboBoxDropMode - // - this.comboBoxDropMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxDropMode.FormattingEnabled = true; - this.comboBoxDropMode.Items.AddRange(new object[] { - "[N/A]", - "dropNTSC", - "dropPAL", - "nonDrop"}); - this.comboBoxDropMode.Location = new System.Drawing.Point(191, 203); - this.comboBoxDropMode.Name = "comboBoxDropMode"; - this.comboBoxDropMode.Size = new System.Drawing.Size(263, 21); - this.comboBoxDropMode.TabIndex = 6; - // - // label4 - // - this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(6, 206); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(59, 13); - this.label4.TabIndex = 10; - this.label4.Text = "Drop mode"; - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(6, 179); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(100, 13); - this.label3.TabIndex = 8; - this.label3.Text = "Frame rate multiplier"; - // - // comboBoxFrameRate - // - this.comboBoxFrameRate.FormattingEnabled = true; - this.comboBoxFrameRate.Location = new System.Drawing.Point(191, 149); - this.comboBoxFrameRate.Name = "comboBoxFrameRate"; - this.comboBoxFrameRate.Size = new System.Drawing.Size(263, 21); - this.comboBoxFrameRate.TabIndex = 4; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(6, 152); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(57, 13); - this.label2.TabIndex = 6; - this.label2.Text = "Frame rate"; - // - // comboBoxTimeBase - // - this.comboBoxTimeBase.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxTimeBase.FormattingEnabled = true; - this.comboBoxTimeBase.Items.AddRange(new object[] { - "[N/A]", - "media", - "smpte", - "clock"}); - this.comboBoxTimeBase.Location = new System.Drawing.Point(191, 122); - this.comboBoxTimeBase.Name = "comboBoxTimeBase"; - this.comboBoxTimeBase.Size = new System.Drawing.Size(263, 21); - this.comboBoxTimeBase.TabIndex = 3; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(6, 125); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(56, 13); - this.label1.TabIndex = 4; - this.label1.Text = "Time base"; - // - // comboBoxLanguage - // - this.comboBoxLanguage.FormattingEnabled = true; - this.comboBoxLanguage.Location = new System.Drawing.Point(191, 95); - this.comboBoxLanguage.Name = "comboBoxLanguage"; - this.comboBoxLanguage.Size = new System.Drawing.Size(263, 21); - this.comboBoxLanguage.TabIndex = 2; - // - // labelCollision - // - this.labelCollision.AutoSize = true; - this.labelCollision.Location = new System.Drawing.Point(6, 98); - this.labelCollision.Name = "labelCollision"; - this.labelCollision.Size = new System.Drawing.Size(55, 13); - this.labelCollision.TabIndex = 3; - this.labelCollision.Text = "Language"; - // - // comboBoxDefaultStyle - // - this.comboBoxDefaultStyle.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxDefaultStyle.FormattingEnabled = true; - this.comboBoxDefaultStyle.Location = new System.Drawing.Point(191, 243); - this.comboBoxDefaultStyle.Name = "comboBoxDefaultStyle"; - this.comboBoxDefaultStyle.Size = new System.Drawing.Size(263, 21); - this.comboBoxDefaultStyle.TabIndex = 7; - // - // labelWrapStyle - // - this.labelWrapStyle.AutoSize = true; - this.labelWrapStyle.Location = new System.Drawing.Point(6, 246); - this.labelWrapStyle.Name = "labelWrapStyle"; - this.labelWrapStyle.Size = new System.Drawing.Size(65, 13); - this.labelWrapStyle.TabIndex = 1; - this.labelWrapStyle.Text = "Default style"; - // - // comboBoxFileExtensions - // - this.comboBoxFileExtensions.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxFileExtensions.FormattingEnabled = true; - this.comboBoxFileExtensions.Items.AddRange(new object[] { - ".xml", - ".ttml", - ".dfxp"}); - this.comboBoxFileExtensions.Location = new System.Drawing.Point(191, 346); - this.comboBoxFileExtensions.Name = "comboBoxFileExtensions"; - this.comboBoxFileExtensions.Size = new System.Drawing.Size(263, 21); - this.comboBoxFileExtensions.TabIndex = 21; - // - // labelFileExtension - // - this.labelFileExtension.AutoSize = true; - this.labelFileExtension.Location = new System.Drawing.Point(6, 349); - this.labelFileExtension.Name = "labelFileExtension"; - this.labelFileExtension.Size = new System.Drawing.Size(71, 13); - this.labelFileExtension.TabIndex = 22; - this.labelFileExtension.Text = "File extension"; - // - // TimedTextProperties - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(503, 434); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.groupBoxOptions); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "TimedTextProperties"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Timed Text properties"; - this.groupBoxOptions.ResumeLayout(false); - this.groupBoxOptions.PerformLayout(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.GroupBox groupBoxOptions; - private System.Windows.Forms.ComboBox comboBoxDropMode; - private System.Windows.Forms.Label label4; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.ComboBox comboBoxFrameRate; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.ComboBox comboBoxTimeBase; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.ComboBox comboBoxLanguage; - private System.Windows.Forms.Label labelCollision; - private System.Windows.Forms.ComboBox comboBoxDefaultStyle; - private System.Windows.Forms.Label labelWrapStyle; - private System.Windows.Forms.ComboBox comboBoxDefaultRegion; - private System.Windows.Forms.Label labelDefaultRegion; - private System.Windows.Forms.TextBox textBoxDescription; - private System.Windows.Forms.Label label7; - private System.Windows.Forms.TextBox textBoxTitle; - private System.Windows.Forms.Label label6; - private System.Windows.Forms.ComboBox comboBoxFrameRateMultiplier; - private System.Windows.Forms.ComboBox comboBoxTimeCodeFormat; - private System.Windows.Forms.Label labelTimeCode; - private System.Windows.Forms.ComboBox comboBoxFileExtensions; - private System.Windows.Forms.Label labelFileExtension; - } +namespace Nikse.SubtitleEdit.Forms +{ + partial class TimedTextProperties + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.buttonOK = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.groupBoxOptions = new System.Windows.Forms.GroupBox(); + this.comboBoxTimeCodeFormat = new System.Windows.Forms.ComboBox(); + this.labelTimeCode = new System.Windows.Forms.Label(); + this.comboBoxFrameRateMultiplier = new System.Windows.Forms.ComboBox(); + this.textBoxDescription = new System.Windows.Forms.TextBox(); + this.label7 = new System.Windows.Forms.Label(); + this.textBoxTitle = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.comboBoxDefaultRegion = new System.Windows.Forms.ComboBox(); + this.labelDefaultRegion = new System.Windows.Forms.Label(); + this.comboBoxDropMode = new System.Windows.Forms.ComboBox(); + this.label4 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.comboBoxFrameRate = new System.Windows.Forms.ComboBox(); + this.label2 = new System.Windows.Forms.Label(); + this.comboBoxTimeBase = new System.Windows.Forms.ComboBox(); + this.label1 = new System.Windows.Forms.Label(); + this.comboBoxLanguage = new System.Windows.Forms.ComboBox(); + this.labelCollision = new System.Windows.Forms.Label(); + this.comboBoxDefaultStyle = new System.Windows.Forms.ComboBox(); + this.labelWrapStyle = new System.Windows.Forms.Label(); + this.comboBoxFileExtensions = new System.Windows.Forms.ComboBox(); + this.labelFileExtension = new System.Windows.Forms.Label(); + this.groupBoxOptions.SuspendLayout(); + this.SuspendLayout(); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.Location = new System.Drawing.Point(335, 401); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 1; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.Location = new System.Drawing.Point(416, 401); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 2; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // groupBoxOptions + // + this.groupBoxOptions.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxOptions.Controls.Add(this.comboBoxFileExtensions); + this.groupBoxOptions.Controls.Add(this.labelFileExtension); + this.groupBoxOptions.Controls.Add(this.comboBoxTimeCodeFormat); + this.groupBoxOptions.Controls.Add(this.labelTimeCode); + this.groupBoxOptions.Controls.Add(this.comboBoxFrameRateMultiplier); + this.groupBoxOptions.Controls.Add(this.textBoxDescription); + this.groupBoxOptions.Controls.Add(this.label7); + this.groupBoxOptions.Controls.Add(this.textBoxTitle); + this.groupBoxOptions.Controls.Add(this.label6); + this.groupBoxOptions.Controls.Add(this.comboBoxDefaultRegion); + this.groupBoxOptions.Controls.Add(this.labelDefaultRegion); + this.groupBoxOptions.Controls.Add(this.comboBoxDropMode); + this.groupBoxOptions.Controls.Add(this.label4); + this.groupBoxOptions.Controls.Add(this.label3); + this.groupBoxOptions.Controls.Add(this.comboBoxFrameRate); + this.groupBoxOptions.Controls.Add(this.label2); + this.groupBoxOptions.Controls.Add(this.comboBoxTimeBase); + this.groupBoxOptions.Controls.Add(this.label1); + this.groupBoxOptions.Controls.Add(this.comboBoxLanguage); + this.groupBoxOptions.Controls.Add(this.labelCollision); + this.groupBoxOptions.Controls.Add(this.comboBoxDefaultStyle); + this.groupBoxOptions.Controls.Add(this.labelWrapStyle); + this.groupBoxOptions.Location = new System.Drawing.Point(12, 12); + this.groupBoxOptions.Name = "groupBoxOptions"; + this.groupBoxOptions.Size = new System.Drawing.Size(479, 383); + this.groupBoxOptions.TabIndex = 0; + this.groupBoxOptions.TabStop = false; + // + // comboBoxTimeCodeFormat + // + this.comboBoxTimeCodeFormat.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxTimeCodeFormat.FormattingEnabled = true; + this.comboBoxTimeCodeFormat.Items.AddRange(new object[] { + "Source", + "Seconds", + "Milliseconds", + "Ticks", + "hh:mm:ss:ff", + "hh:mm:ss.ms", + "hh:mm:ss.ms-two-digits", + "hh:mm:ss,ms"}); + this.comboBoxTimeCodeFormat.Location = new System.Drawing.Point(191, 309); + this.comboBoxTimeCodeFormat.Name = "comboBoxTimeCodeFormat"; + this.comboBoxTimeCodeFormat.Size = new System.Drawing.Size(263, 21); + this.comboBoxTimeCodeFormat.TabIndex = 19; + // + // labelTimeCode + // + this.labelTimeCode.AutoSize = true; + this.labelTimeCode.Location = new System.Drawing.Point(6, 312); + this.labelTimeCode.Name = "labelTimeCode"; + this.labelTimeCode.Size = new System.Drawing.Size(89, 13); + this.labelTimeCode.TabIndex = 20; + this.labelTimeCode.Text = "Time code format"; + // + // comboBoxFrameRateMultiplier + // + this.comboBoxFrameRateMultiplier.FormattingEnabled = true; + this.comboBoxFrameRateMultiplier.Items.AddRange(new object[] { + "999 1000", + "1 1", + "1000 1001"}); + this.comboBoxFrameRateMultiplier.Location = new System.Drawing.Point(191, 176); + this.comboBoxFrameRateMultiplier.Name = "comboBoxFrameRateMultiplier"; + this.comboBoxFrameRateMultiplier.Size = new System.Drawing.Size(263, 21); + this.comboBoxFrameRateMultiplier.TabIndex = 18; + // + // textBoxDescription + // + this.textBoxDescription.Location = new System.Drawing.Point(191, 56); + this.textBoxDescription.Name = "textBoxDescription"; + this.textBoxDescription.Size = new System.Drawing.Size(263, 20); + this.textBoxDescription.TabIndex = 1; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(6, 58); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(60, 13); + this.label7.TabIndex = 17; + this.label7.Text = "Description"; + // + // textBoxTitle + // + this.textBoxTitle.Location = new System.Drawing.Point(191, 30); + this.textBoxTitle.Name = "textBoxTitle"; + this.textBoxTitle.Size = new System.Drawing.Size(263, 20); + this.textBoxTitle.TabIndex = 0; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(6, 32); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(27, 13); + this.label6.TabIndex = 15; + this.label6.Text = "Title"; + // + // comboBoxDefaultRegion + // + this.comboBoxDefaultRegion.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxDefaultRegion.FormattingEnabled = true; + this.comboBoxDefaultRegion.Location = new System.Drawing.Point(191, 270); + this.comboBoxDefaultRegion.Name = "comboBoxDefaultRegion"; + this.comboBoxDefaultRegion.Size = new System.Drawing.Size(263, 21); + this.comboBoxDefaultRegion.TabIndex = 8; + // + // labelDefaultRegion + // + this.labelDefaultRegion.AutoSize = true; + this.labelDefaultRegion.Location = new System.Drawing.Point(6, 273); + this.labelDefaultRegion.Name = "labelDefaultRegion"; + this.labelDefaultRegion.Size = new System.Drawing.Size(73, 13); + this.labelDefaultRegion.TabIndex = 12; + this.labelDefaultRegion.Text = "Default region"; + // + // comboBoxDropMode + // + this.comboBoxDropMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxDropMode.FormattingEnabled = true; + this.comboBoxDropMode.Items.AddRange(new object[] { + "[N/A]", + "dropNTSC", + "dropPAL", + "nonDrop"}); + this.comboBoxDropMode.Location = new System.Drawing.Point(191, 203); + this.comboBoxDropMode.Name = "comboBoxDropMode"; + this.comboBoxDropMode.Size = new System.Drawing.Size(263, 21); + this.comboBoxDropMode.TabIndex = 6; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(6, 206); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(59, 13); + this.label4.TabIndex = 10; + this.label4.Text = "Drop mode"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(6, 179); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(100, 13); + this.label3.TabIndex = 8; + this.label3.Text = "Frame rate multiplier"; + // + // comboBoxFrameRate + // + this.comboBoxFrameRate.FormattingEnabled = true; + this.comboBoxFrameRate.Location = new System.Drawing.Point(191, 149); + this.comboBoxFrameRate.Name = "comboBoxFrameRate"; + this.comboBoxFrameRate.Size = new System.Drawing.Size(263, 21); + this.comboBoxFrameRate.TabIndex = 4; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(6, 152); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(57, 13); + this.label2.TabIndex = 6; + this.label2.Text = "Frame rate"; + // + // comboBoxTimeBase + // + this.comboBoxTimeBase.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxTimeBase.FormattingEnabled = true; + this.comboBoxTimeBase.Items.AddRange(new object[] { + "[N/A]", + "media", + "smpte", + "clock"}); + this.comboBoxTimeBase.Location = new System.Drawing.Point(191, 122); + this.comboBoxTimeBase.Name = "comboBoxTimeBase"; + this.comboBoxTimeBase.Size = new System.Drawing.Size(263, 21); + this.comboBoxTimeBase.TabIndex = 3; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(6, 125); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(56, 13); + this.label1.TabIndex = 4; + this.label1.Text = "Time base"; + // + // comboBoxLanguage + // + this.comboBoxLanguage.FormattingEnabled = true; + this.comboBoxLanguage.Location = new System.Drawing.Point(191, 95); + this.comboBoxLanguage.Name = "comboBoxLanguage"; + this.comboBoxLanguage.Size = new System.Drawing.Size(263, 21); + this.comboBoxLanguage.TabIndex = 2; + // + // labelCollision + // + this.labelCollision.AutoSize = true; + this.labelCollision.Location = new System.Drawing.Point(6, 98); + this.labelCollision.Name = "labelCollision"; + this.labelCollision.Size = new System.Drawing.Size(55, 13); + this.labelCollision.TabIndex = 3; + this.labelCollision.Text = "Language"; + // + // comboBoxDefaultStyle + // + this.comboBoxDefaultStyle.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxDefaultStyle.FormattingEnabled = true; + this.comboBoxDefaultStyle.Location = new System.Drawing.Point(191, 243); + this.comboBoxDefaultStyle.Name = "comboBoxDefaultStyle"; + this.comboBoxDefaultStyle.Size = new System.Drawing.Size(263, 21); + this.comboBoxDefaultStyle.TabIndex = 7; + // + // labelWrapStyle + // + this.labelWrapStyle.AutoSize = true; + this.labelWrapStyle.Location = new System.Drawing.Point(6, 246); + this.labelWrapStyle.Name = "labelWrapStyle"; + this.labelWrapStyle.Size = new System.Drawing.Size(65, 13); + this.labelWrapStyle.TabIndex = 1; + this.labelWrapStyle.Text = "Default style"; + // + // comboBoxFileExtensions + // + this.comboBoxFileExtensions.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxFileExtensions.FormattingEnabled = true; + this.comboBoxFileExtensions.Items.AddRange(new object[] { + ".xml", + ".ttml", + ".dfxp"}); + this.comboBoxFileExtensions.Location = new System.Drawing.Point(191, 346); + this.comboBoxFileExtensions.Name = "comboBoxFileExtensions"; + this.comboBoxFileExtensions.Size = new System.Drawing.Size(263, 21); + this.comboBoxFileExtensions.TabIndex = 21; + // + // labelFileExtension + // + this.labelFileExtension.AutoSize = true; + this.labelFileExtension.Location = new System.Drawing.Point(6, 349); + this.labelFileExtension.Name = "labelFileExtension"; + this.labelFileExtension.Size = new System.Drawing.Size(71, 13); + this.labelFileExtension.TabIndex = 22; + this.labelFileExtension.Text = "File extension"; + // + // TimedTextProperties + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(503, 434); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.groupBoxOptions); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "TimedTextProperties"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Timed Text properties"; + this.groupBoxOptions.ResumeLayout(false); + this.groupBoxOptions.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.GroupBox groupBoxOptions; + private System.Windows.Forms.ComboBox comboBoxDropMode; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.ComboBox comboBoxFrameRate; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.ComboBox comboBoxTimeBase; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox comboBoxLanguage; + private System.Windows.Forms.Label labelCollision; + private System.Windows.Forms.ComboBox comboBoxDefaultStyle; + private System.Windows.Forms.Label labelWrapStyle; + private System.Windows.Forms.ComboBox comboBoxDefaultRegion; + private System.Windows.Forms.Label labelDefaultRegion; + private System.Windows.Forms.TextBox textBoxDescription; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.TextBox textBoxTitle; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.ComboBox comboBoxFrameRateMultiplier; + private System.Windows.Forms.ComboBox comboBoxTimeCodeFormat; + private System.Windows.Forms.Label labelTimeCode; + private System.Windows.Forms.ComboBox comboBoxFileExtensions; + private System.Windows.Forms.Label labelFileExtension; + } } \ No newline at end of file diff --git a/src/Forms/TimedTextProperties.cs b/src/ui/Forms/TimedTextProperties.cs similarity index 97% rename from src/Forms/TimedTextProperties.cs rename to src/ui/Forms/TimedTextProperties.cs index 0bb4dbb66..9a58d06af 100644 --- a/src/Forms/TimedTextProperties.cs +++ b/src/ui/Forms/TimedTextProperties.cs @@ -1,320 +1,320 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.SubtitleFormats; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Globalization; -using System.Windows.Forms; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public partial class TimedTextProperties : PositionAndSizeForm - { - private Subtitle _subtitle; - private XmlDocument _xml; - private XmlNamespaceManager _nsmgr; - private string _NA; - - public TimedTextProperties(Subtitle subtitle) - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - Application.DoEvents(); - - _subtitle = subtitle; - _NA = "[" + Configuration.Settings.Language.General.NotAvailable + "]"; - comboBoxDropMode.Items[0] = _NA; - comboBoxTimeBase.Items[0] = _NA; - comboBoxDefaultStyle.Items.Add(_NA); - comboBoxDefaultRegion.Items.Add(_NA); - - _xml = new XmlDocument(); - try - { - _xml.LoadXml(subtitle.Header); - } - catch - { - subtitle.Header = new TimedText10().ToText(new Subtitle(), "tt"); - _xml.LoadXml(subtitle.Header); // load default xml - } - _nsmgr = new XmlNamespaceManager(_xml.NameTable); - _nsmgr.AddNamespace("ttml", "http://www.w3.org/ns/ttml"); - - XmlNode node = _xml.DocumentElement.SelectSingleNode("ttml:head/ttml:metadata/ttml:title", _nsmgr); - if (node != null) - { - textBoxTitle.Text = node.InnerText; - } - - node = _xml.DocumentElement.SelectSingleNode("ttml:head/ttml:metadata/ttml:desc", _nsmgr); - if (node != null) - { - textBoxDescription.Text = node.InnerText; - } - - foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.SpecificCultures)) - { - comboBoxLanguage.Items.Add(ci.Name); - } - XmlAttribute attr = _xml.DocumentElement.Attributes["xml:lang"]; - if (attr != null) - { - comboBoxLanguage.Text = attr.InnerText; - } - - attr = _xml.DocumentElement.Attributes["ttp:timeBase"]; - if (attr != null) - { - comboBoxTimeBase.Text = attr.InnerText; - } - - comboBoxFrameRate.Items.Add("23.976"); - comboBoxFrameRate.Items.Add("24.0"); - comboBoxFrameRate.Items.Add("25.0"); - comboBoxFrameRate.Items.Add("29.97"); - comboBoxFrameRate.Items.Add("30.0"); - attr = _xml.DocumentElement.Attributes["ttp:frameRate"]; - if (attr != null) - { - comboBoxFrameRate.Text = attr.InnerText; - } - - attr = _xml.DocumentElement.Attributes["ttp:frameRateMultiplier"]; - if (attr != null) - { - comboBoxFrameRateMultiplier.Text = attr.InnerText; - } - - attr = _xml.DocumentElement.Attributes["ttp:dropMode"]; - if (attr != null) - { - comboBoxDropMode.Text = attr.InnerText; - } - - foreach (string style in TimedText10.GetStylesFromHeader(_subtitle.Header)) - { - comboBoxDefaultStyle.Items.Add(style); - node = _xml.DocumentElement.SelectSingleNode("ttml:body", _nsmgr); - if (node?.Attributes?["style"] != null && style == node.Attributes["style"].Value) - { - comboBoxDefaultStyle.SelectedIndex = comboBoxDefaultStyle.Items.Count - 1; - } - } - foreach (string region in TimedText10.GetRegionsFromHeader(_subtitle.Header)) - { - comboBoxDefaultRegion.Items.Add(region); - node = _xml.DocumentElement.SelectSingleNode("ttml:body", _nsmgr); - if (node?.Attributes?["region"] != null && region == node.Attributes["region"].Value) - { - comboBoxDefaultRegion.SelectedIndex = comboBoxDefaultRegion.Items.Count - 1; - } - } - - var timeCodeFormat = Configuration.Settings.SubtitleSettings.TimedText10TimeCodeFormat.Trim().ToLowerInvariant(); - comboBoxTimeCodeFormat.SelectedIndex = 0; - for (int index = 0; index < comboBoxTimeCodeFormat.Items.Count; index++) - { - var item = comboBoxTimeCodeFormat.Items[index]; - if (item.ToString().ToLowerInvariant() == timeCodeFormat) - { - comboBoxTimeCodeFormat.SelectedIndex = index; - break; - } - } - - var ext = Configuration.Settings.SubtitleSettings.TimedText10FileExtension; - comboBoxFileExtensions.SelectedIndex = 0; - for (var index = 0; index < comboBoxFileExtensions.Items.Count; index++) - { - var item = comboBoxFileExtensions.Items[index]; - if (item.ToString() == ext) - { - comboBoxFileExtensions.SelectedIndex = index; - break; - } - } - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private void buttonOK_Click(object sender, EventArgs e) - { - XmlNode node = _xml.DocumentElement.SelectSingleNode("ttml:head/ttml:metadata/ttml:title", _nsmgr); - if (node != null) - { - if (string.IsNullOrWhiteSpace(textBoxTitle.Text) && string.IsNullOrWhiteSpace(textBoxDescription.Text)) - { - _xml.DocumentElement.SelectSingleNode("ttml:head", _nsmgr).RemoveChild(_xml.DocumentElement.SelectSingleNode("ttml:head/ttml:metadata", _nsmgr)); - } - else - { - node.InnerText = textBoxTitle.Text; - } - } - else if (!string.IsNullOrWhiteSpace(textBoxTitle.Text)) - { - var head = _xml.DocumentElement.SelectSingleNode("ttml:head", _nsmgr); - if (head == null) - { - head = _xml.CreateElement("ttml", "head", _nsmgr.LookupNamespace("ttml")); - _xml.DocumentElement.PrependChild(head); - } - - var metadata = _xml.DocumentElement.SelectSingleNode("ttml:head/ttml:metadata", _nsmgr); - if (metadata == null) - { - metadata = _xml.CreateElement("ttml", "metadata", _nsmgr.LookupNamespace("ttml")); - head.PrependChild(metadata); - } - - var title = _xml.CreateElement("ttml", "title", _nsmgr.LookupNamespace("ttml")); - metadata.InnerText = textBoxTitle.Text; - metadata.AppendChild(title); - } - - node = _xml.DocumentElement.SelectSingleNode("ttml:head/ttml:metadata/ttml:desc", _nsmgr); - if (node != null) - { - node.InnerText = textBoxDescription.Text; - } - else if (!string.IsNullOrWhiteSpace(textBoxDescription.Text)) - { - var head = _xml.DocumentElement.SelectSingleNode("ttml:head", _nsmgr); - if (head == null) - { - head = _xml.CreateElement("ttml", "head", _nsmgr.LookupNamespace("ttml")); - _xml.DocumentElement.PrependChild(head); - } - - var metadata = _xml.DocumentElement.SelectSingleNode("ttml:head/ttml:metadata", _nsmgr); - if (metadata == null) - { - metadata = _xml.CreateElement("ttml", "metadata", _nsmgr.LookupNamespace("ttml")); - head.PrependChild(metadata); - } - - var desc = _xml.CreateElement("ttml", "desc", _nsmgr.LookupNamespace("ttml")); - desc.InnerText = textBoxDescription.Text; - metadata.AppendChild(desc); - } - - XmlAttribute attr = _xml.DocumentElement.Attributes["xml:lang"]; - if (attr != null) - { - attr.Value = comboBoxLanguage.Text; - if (attr.Value.Length == 0) - { - _xml.DocumentElement.Attributes.Remove(attr); - } - } - else if (comboBoxLanguage.Text.Length > 0) - { - attr = _xml.CreateAttribute("xml", "lang", _nsmgr.LookupNamespace("xml")); - attr.Value = comboBoxLanguage.Text; - _xml.DocumentElement.Attributes.Prepend(attr); - } - - attr = _xml.DocumentElement.Attributes["ttp:timeBase"]; - if (attr != null) - { - attr.InnerText = comboBoxTimeBase.Text; - if (attr.Value.Length == 0) - { - _xml.DocumentElement.Attributes.Remove(attr); - } - } - else if (comboBoxTimeBase.Text.Length > 0) - { - attr = _xml.CreateAttribute("ttp", "timeBase", _nsmgr.LookupNamespace("ttp")); - attr.Value = comboBoxTimeBase.Text; - _xml.DocumentElement.Attributes.Append(attr); - } - - attr = _xml.DocumentElement.Attributes["ttp:frameRate"]; - if (attr != null) - { - attr.InnerText = comboBoxFrameRate.Text; - if (attr.Value.Length == 0) - { - _xml.DocumentElement.Attributes.Remove(attr); - } - } - else if (comboBoxFrameRate.Text.Length > 0) - { - attr = _xml.CreateAttribute("ttp", "frameRate", _nsmgr.LookupNamespace("ttp")); - attr.Value = comboBoxFrameRate.Text; - _xml.DocumentElement.Attributes.Append(attr); - } - - attr = _xml.DocumentElement.Attributes["ttp:frameRateMultiplier"]; - if (attr != null) - { - attr.InnerText = comboBoxFrameRateMultiplier.Text; - if (attr.Value.Length == 0) - { - _xml.DocumentElement.Attributes.Remove(attr); - } - } - else if (comboBoxFrameRateMultiplier.Text.Length > 0) - { - attr = _xml.CreateAttribute("ttp", "frameRateMultiplier", _nsmgr.LookupNamespace("ttp")); - attr.Value = comboBoxFrameRateMultiplier.Text; - _xml.DocumentElement.Attributes.Append(attr); - } - - attr = _xml.DocumentElement.Attributes["ttp:dropMode"]; - if (attr != null) - { - attr.InnerText = comboBoxDropMode.Text; - if (attr.Value.Length == 0) - { - _xml.DocumentElement.Attributes.Remove(attr); - } - } - else if (comboBoxDropMode.Text.Length > 0) - { - attr = _xml.CreateAttribute("ttp", "dropMode", _nsmgr.LookupNamespace("ttp")); - attr.Value = comboBoxDropMode.Text; - _xml.DocumentElement.Attributes.Append(attr); - } - - node = _xml.DocumentElement.SelectSingleNode("ttml:body", _nsmgr); - if (node != null && node.Attributes["style"] != null) - { - node.Attributes["style"].Value = comboBoxDefaultStyle.Text; - } - else if (comboBoxDefaultStyle.Text.Length > 0 && node != null) - { - attr = _xml.CreateAttribute("style"); - attr.Value = comboBoxDefaultStyle.Text; - node.Attributes.Append(attr); - } - - node = _xml.DocumentElement.SelectSingleNode("ttml:body", _nsmgr); - if (node != null && node.Attributes["region"] != null) - { - node.Attributes["region"].Value = comboBoxDefaultRegion.Text; - } - else if (comboBoxDefaultRegion.Text.Length > 0 && node != null) - { - attr = _xml.CreateAttribute("region"); - attr.Value = comboBoxDefaultRegion.Text; - node.Attributes.Append(attr); - } - - _subtitle.Header = _xml.OuterXml; - - Configuration.Settings.SubtitleSettings.TimedText10TimeCodeFormat = comboBoxTimeCodeFormat.SelectedItem.ToString(); - Configuration.Settings.SubtitleSettings.TimedText10FileExtension= comboBoxFileExtensions.SelectedItem.ToString(); - - DialogResult = DialogResult.OK; - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.SubtitleFormats; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Globalization; +using System.Windows.Forms; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public partial class TimedTextProperties : PositionAndSizeForm + { + private Subtitle _subtitle; + private XmlDocument _xml; + private XmlNamespaceManager _nsmgr; + private string _NA; + + public TimedTextProperties(Subtitle subtitle) + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + Application.DoEvents(); + + _subtitle = subtitle; + _NA = "[" + Configuration.Settings.Language.General.NotAvailable + "]"; + comboBoxDropMode.Items[0] = _NA; + comboBoxTimeBase.Items[0] = _NA; + comboBoxDefaultStyle.Items.Add(_NA); + comboBoxDefaultRegion.Items.Add(_NA); + + _xml = new XmlDocument(); + try + { + _xml.LoadXml(subtitle.Header); + } + catch + { + subtitle.Header = new TimedText10().ToText(new Subtitle(), "tt"); + _xml.LoadXml(subtitle.Header); // load default xml + } + _nsmgr = new XmlNamespaceManager(_xml.NameTable); + _nsmgr.AddNamespace("ttml", "http://www.w3.org/ns/ttml"); + + XmlNode node = _xml.DocumentElement.SelectSingleNode("ttml:head/ttml:metadata/ttml:title", _nsmgr); + if (node != null) + { + textBoxTitle.Text = node.InnerText; + } + + node = _xml.DocumentElement.SelectSingleNode("ttml:head/ttml:metadata/ttml:desc", _nsmgr); + if (node != null) + { + textBoxDescription.Text = node.InnerText; + } + + foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.SpecificCultures)) + { + comboBoxLanguage.Items.Add(ci.Name); + } + XmlAttribute attr = _xml.DocumentElement.Attributes["xml:lang"]; + if (attr != null) + { + comboBoxLanguage.Text = attr.InnerText; + } + + attr = _xml.DocumentElement.Attributes["ttp:timeBase"]; + if (attr != null) + { + comboBoxTimeBase.Text = attr.InnerText; + } + + comboBoxFrameRate.Items.Add("23.976"); + comboBoxFrameRate.Items.Add("24.0"); + comboBoxFrameRate.Items.Add("25.0"); + comboBoxFrameRate.Items.Add("29.97"); + comboBoxFrameRate.Items.Add("30.0"); + attr = _xml.DocumentElement.Attributes["ttp:frameRate"]; + if (attr != null) + { + comboBoxFrameRate.Text = attr.InnerText; + } + + attr = _xml.DocumentElement.Attributes["ttp:frameRateMultiplier"]; + if (attr != null) + { + comboBoxFrameRateMultiplier.Text = attr.InnerText; + } + + attr = _xml.DocumentElement.Attributes["ttp:dropMode"]; + if (attr != null) + { + comboBoxDropMode.Text = attr.InnerText; + } + + foreach (string style in TimedText10.GetStylesFromHeader(_subtitle.Header)) + { + comboBoxDefaultStyle.Items.Add(style); + node = _xml.DocumentElement.SelectSingleNode("ttml:body", _nsmgr); + if (node?.Attributes?["style"] != null && style == node.Attributes["style"].Value) + { + comboBoxDefaultStyle.SelectedIndex = comboBoxDefaultStyle.Items.Count - 1; + } + } + foreach (string region in TimedText10.GetRegionsFromHeader(_subtitle.Header)) + { + comboBoxDefaultRegion.Items.Add(region); + node = _xml.DocumentElement.SelectSingleNode("ttml:body", _nsmgr); + if (node?.Attributes?["region"] != null && region == node.Attributes["region"].Value) + { + comboBoxDefaultRegion.SelectedIndex = comboBoxDefaultRegion.Items.Count - 1; + } + } + + var timeCodeFormat = Configuration.Settings.SubtitleSettings.TimedText10TimeCodeFormat.Trim().ToLowerInvariant(); + comboBoxTimeCodeFormat.SelectedIndex = 0; + for (int index = 0; index < comboBoxTimeCodeFormat.Items.Count; index++) + { + var item = comboBoxTimeCodeFormat.Items[index]; + if (item.ToString().ToLowerInvariant() == timeCodeFormat) + { + comboBoxTimeCodeFormat.SelectedIndex = index; + break; + } + } + + var ext = Configuration.Settings.SubtitleSettings.TimedText10FileExtension; + comboBoxFileExtensions.SelectedIndex = 0; + for (var index = 0; index < comboBoxFileExtensions.Items.Count; index++) + { + var item = comboBoxFileExtensions.Items[index]; + if (item.ToString() == ext) + { + comboBoxFileExtensions.SelectedIndex = index; + break; + } + } + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void buttonOK_Click(object sender, EventArgs e) + { + XmlNode node = _xml.DocumentElement.SelectSingleNode("ttml:head/ttml:metadata/ttml:title", _nsmgr); + if (node != null) + { + if (string.IsNullOrWhiteSpace(textBoxTitle.Text) && string.IsNullOrWhiteSpace(textBoxDescription.Text)) + { + _xml.DocumentElement.SelectSingleNode("ttml:head", _nsmgr).RemoveChild(_xml.DocumentElement.SelectSingleNode("ttml:head/ttml:metadata", _nsmgr)); + } + else + { + node.InnerText = textBoxTitle.Text; + } + } + else if (!string.IsNullOrWhiteSpace(textBoxTitle.Text)) + { + var head = _xml.DocumentElement.SelectSingleNode("ttml:head", _nsmgr); + if (head == null) + { + head = _xml.CreateElement("ttml", "head", _nsmgr.LookupNamespace("ttml")); + _xml.DocumentElement.PrependChild(head); + } + + var metadata = _xml.DocumentElement.SelectSingleNode("ttml:head/ttml:metadata", _nsmgr); + if (metadata == null) + { + metadata = _xml.CreateElement("ttml", "metadata", _nsmgr.LookupNamespace("ttml")); + head.PrependChild(metadata); + } + + var title = _xml.CreateElement("ttml", "title", _nsmgr.LookupNamespace("ttml")); + metadata.InnerText = textBoxTitle.Text; + metadata.AppendChild(title); + } + + node = _xml.DocumentElement.SelectSingleNode("ttml:head/ttml:metadata/ttml:desc", _nsmgr); + if (node != null) + { + node.InnerText = textBoxDescription.Text; + } + else if (!string.IsNullOrWhiteSpace(textBoxDescription.Text)) + { + var head = _xml.DocumentElement.SelectSingleNode("ttml:head", _nsmgr); + if (head == null) + { + head = _xml.CreateElement("ttml", "head", _nsmgr.LookupNamespace("ttml")); + _xml.DocumentElement.PrependChild(head); + } + + var metadata = _xml.DocumentElement.SelectSingleNode("ttml:head/ttml:metadata", _nsmgr); + if (metadata == null) + { + metadata = _xml.CreateElement("ttml", "metadata", _nsmgr.LookupNamespace("ttml")); + head.PrependChild(metadata); + } + + var desc = _xml.CreateElement("ttml", "desc", _nsmgr.LookupNamespace("ttml")); + desc.InnerText = textBoxDescription.Text; + metadata.AppendChild(desc); + } + + XmlAttribute attr = _xml.DocumentElement.Attributes["xml:lang"]; + if (attr != null) + { + attr.Value = comboBoxLanguage.Text; + if (attr.Value.Length == 0) + { + _xml.DocumentElement.Attributes.Remove(attr); + } + } + else if (comboBoxLanguage.Text.Length > 0) + { + attr = _xml.CreateAttribute("xml", "lang", _nsmgr.LookupNamespace("xml")); + attr.Value = comboBoxLanguage.Text; + _xml.DocumentElement.Attributes.Prepend(attr); + } + + attr = _xml.DocumentElement.Attributes["ttp:timeBase"]; + if (attr != null) + { + attr.InnerText = comboBoxTimeBase.Text; + if (attr.Value.Length == 0) + { + _xml.DocumentElement.Attributes.Remove(attr); + } + } + else if (comboBoxTimeBase.Text.Length > 0) + { + attr = _xml.CreateAttribute("ttp", "timeBase", _nsmgr.LookupNamespace("ttp")); + attr.Value = comboBoxTimeBase.Text; + _xml.DocumentElement.Attributes.Append(attr); + } + + attr = _xml.DocumentElement.Attributes["ttp:frameRate"]; + if (attr != null) + { + attr.InnerText = comboBoxFrameRate.Text; + if (attr.Value.Length == 0) + { + _xml.DocumentElement.Attributes.Remove(attr); + } + } + else if (comboBoxFrameRate.Text.Length > 0) + { + attr = _xml.CreateAttribute("ttp", "frameRate", _nsmgr.LookupNamespace("ttp")); + attr.Value = comboBoxFrameRate.Text; + _xml.DocumentElement.Attributes.Append(attr); + } + + attr = _xml.DocumentElement.Attributes["ttp:frameRateMultiplier"]; + if (attr != null) + { + attr.InnerText = comboBoxFrameRateMultiplier.Text; + if (attr.Value.Length == 0) + { + _xml.DocumentElement.Attributes.Remove(attr); + } + } + else if (comboBoxFrameRateMultiplier.Text.Length > 0) + { + attr = _xml.CreateAttribute("ttp", "frameRateMultiplier", _nsmgr.LookupNamespace("ttp")); + attr.Value = comboBoxFrameRateMultiplier.Text; + _xml.DocumentElement.Attributes.Append(attr); + } + + attr = _xml.DocumentElement.Attributes["ttp:dropMode"]; + if (attr != null) + { + attr.InnerText = comboBoxDropMode.Text; + if (attr.Value.Length == 0) + { + _xml.DocumentElement.Attributes.Remove(attr); + } + } + else if (comboBoxDropMode.Text.Length > 0) + { + attr = _xml.CreateAttribute("ttp", "dropMode", _nsmgr.LookupNamespace("ttp")); + attr.Value = comboBoxDropMode.Text; + _xml.DocumentElement.Attributes.Append(attr); + } + + node = _xml.DocumentElement.SelectSingleNode("ttml:body", _nsmgr); + if (node != null && node.Attributes["style"] != null) + { + node.Attributes["style"].Value = comboBoxDefaultStyle.Text; + } + else if (comboBoxDefaultStyle.Text.Length > 0 && node != null) + { + attr = _xml.CreateAttribute("style"); + attr.Value = comboBoxDefaultStyle.Text; + node.Attributes.Append(attr); + } + + node = _xml.DocumentElement.SelectSingleNode("ttml:body", _nsmgr); + if (node != null && node.Attributes["region"] != null) + { + node.Attributes["region"].Value = comboBoxDefaultRegion.Text; + } + else if (comboBoxDefaultRegion.Text.Length > 0 && node != null) + { + attr = _xml.CreateAttribute("region"); + attr.Value = comboBoxDefaultRegion.Text; + node.Attributes.Append(attr); + } + + _subtitle.Header = _xml.OuterXml; + + Configuration.Settings.SubtitleSettings.TimedText10TimeCodeFormat = comboBoxTimeCodeFormat.SelectedItem.ToString(); + Configuration.Settings.SubtitleSettings.TimedText10FileExtension= comboBoxFileExtensions.SelectedItem.ToString(); + + DialogResult = DialogResult.OK; + } + + } +} diff --git a/src/Forms/TimedTextProperties.resx b/src/ui/Forms/TimedTextProperties.resx similarity index 97% rename from src/Forms/TimedTextProperties.resx rename to src/ui/Forms/TimedTextProperties.resx index 29dcb1b3a..1af7de150 100644 --- a/src/Forms/TimedTextProperties.resx +++ b/src/ui/Forms/TimedTextProperties.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Forms/TransportStreamSubtitleChooser.Designer.cs b/src/ui/Forms/TransportStreamSubtitleChooser.Designer.cs similarity index 98% rename from src/Forms/TransportStreamSubtitleChooser.Designer.cs rename to src/ui/Forms/TransportStreamSubtitleChooser.Designer.cs index 2e1a65189..82c88c3bf 100644 --- a/src/Forms/TransportStreamSubtitleChooser.Designer.cs +++ b/src/ui/Forms/TransportStreamSubtitleChooser.Designer.cs @@ -1,244 +1,244 @@ -namespace Nikse.SubtitleEdit.Forms -{ - partial class TransportStreamSubtitleChooser - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.labelChoose = new System.Windows.Forms.Label(); - this.listBoxTracks = new System.Windows.Forms.ListBox(); - this.contextMenuStripListview = new System.Windows.Forms.ContextMenuStrip(this.components); - this.toolStripMenuItemExport = new System.Windows.Forms.ToolStripMenuItem(); - this.bDNXMLToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.bluraySupToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.vobSubToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.dOSTToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.saveAllImagesWithHtmlIndexViewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.saveSubtitleAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.listBoxSubtitles = new System.Windows.Forms.ListBox(); - this.pictureBox1 = new System.Windows.Forms.PictureBox(); - this.textBoxTeletext = new System.Windows.Forms.TextBox(); - this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog(); - this.contextMenuStripListview.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); - this.SuspendLayout(); - // - // labelChoose - // - this.labelChoose.AutoSize = true; - this.labelChoose.Location = new System.Drawing.Point(9, 15); - this.labelChoose.Name = "labelChoose"; - this.labelChoose.Size = new System.Drawing.Size(220, 13); - this.labelChoose.TabIndex = 52; - this.labelChoose.Text = "More than one subtitle found - please choose"; - // - // listBoxTracks - // - this.listBoxTracks.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.listBoxTracks.ContextMenuStrip = this.contextMenuStripListview; - this.listBoxTracks.FormattingEnabled = true; - this.listBoxTracks.Location = new System.Drawing.Point(13, 31); - this.listBoxTracks.Name = "listBoxTracks"; - this.listBoxTracks.Size = new System.Drawing.Size(589, 134); - this.listBoxTracks.TabIndex = 51; - this.listBoxTracks.SelectedIndexChanged += new System.EventHandler(this.listBoxTracks_SelectedIndexChanged); - // - // contextMenuStripListview - // - this.contextMenuStripListview.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripMenuItemExport, - this.saveAllImagesWithHtmlIndexViewToolStripMenuItem, - this.saveSubtitleAsToolStripMenuItem}); - this.contextMenuStripListview.Name = "contextMenuStripListview"; - this.contextMenuStripListview.Size = new System.Drawing.Size(284, 70); - this.contextMenuStripListview.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStripListview_Opening); - // - // toolStripMenuItemExport - // - this.toolStripMenuItemExport.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.bDNXMLToolStripMenuItem, - this.bluraySupToolStripMenuItem, - this.vobSubToolStripMenuItem, - this.dOSTToolStripMenuItem}); - this.toolStripMenuItemExport.Name = "toolStripMenuItemExport"; - this.toolStripMenuItemExport.Size = new System.Drawing.Size(283, 22); - this.toolStripMenuItemExport.Text = "Export all images as..."; - // - // bDNXMLToolStripMenuItem - // - this.bDNXMLToolStripMenuItem.Name = "bDNXMLToolStripMenuItem"; - this.bDNXMLToolStripMenuItem.Size = new System.Drawing.Size(143, 22); - this.bDNXMLToolStripMenuItem.Text = "BDN XML..."; - this.bDNXMLToolStripMenuItem.Click += new System.EventHandler(this.BDNXMLToolStripMenuItem_Click); - // - // bluraySupToolStripMenuItem - // - this.bluraySupToolStripMenuItem.Name = "bluraySupToolStripMenuItem"; - this.bluraySupToolStripMenuItem.Size = new System.Drawing.Size(143, 22); - this.bluraySupToolStripMenuItem.Text = "Blu-ray sup..."; - this.bluraySupToolStripMenuItem.Click += new System.EventHandler(this.BluraySupToolStripMenuItem_Click); - // - // vobSubToolStripMenuItem - // - this.vobSubToolStripMenuItem.Name = "vobSubToolStripMenuItem"; - this.vobSubToolStripMenuItem.Size = new System.Drawing.Size(143, 22); - this.vobSubToolStripMenuItem.Text = "VobSub..."; - this.vobSubToolStripMenuItem.Click += new System.EventHandler(this.VobSubToolStripMenuItem_Click); - // - // dOSTToolStripMenuItem - // - this.dOSTToolStripMenuItem.Name = "dOSTToolStripMenuItem"; - this.dOSTToolStripMenuItem.Size = new System.Drawing.Size(143, 22); - this.dOSTToolStripMenuItem.Text = "DOST..."; - this.dOSTToolStripMenuItem.Click += new System.EventHandler(this.DOSTToolStripMenuItem_Click); - // - // saveAllImagesWithHtmlIndexViewToolStripMenuItem - // - this.saveAllImagesWithHtmlIndexViewToolStripMenuItem.Name = "saveAllImagesWithHtmlIndexViewToolStripMenuItem"; - this.saveAllImagesWithHtmlIndexViewToolStripMenuItem.Size = new System.Drawing.Size(283, 22); - this.saveAllImagesWithHtmlIndexViewToolStripMenuItem.Text = "Save all images with HTML index view..."; - this.saveAllImagesWithHtmlIndexViewToolStripMenuItem.Click += new System.EventHandler(this.SaveAllImagesWithHtmlIndexViewToolStripMenuItem_Click); - // - // saveSubtitleAsToolStripMenuItem - // - this.saveSubtitleAsToolStripMenuItem.Name = "saveSubtitleAsToolStripMenuItem"; - this.saveSubtitleAsToolStripMenuItem.Size = new System.Drawing.Size(283, 22); - this.saveSubtitleAsToolStripMenuItem.Text = "Save subtitle as..."; - this.saveSubtitleAsToolStripMenuItem.Click += new System.EventHandler(this.saveSubtitleAsToolStripMenuItem_Click); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.BackColor = System.Drawing.SystemColors.Control; - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.Location = new System.Drawing.Point(526, 450); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 60; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = false; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.Location = new System.Drawing.Point(445, 450); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 54; - this.buttonOK.Text = "OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // listBoxSubtitles - // - this.listBoxSubtitles.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.listBoxSubtitles.FormattingEnabled = true; - this.listBoxSubtitles.Location = new System.Drawing.Point(12, 171); - this.listBoxSubtitles.Name = "listBoxSubtitles"; - this.listBoxSubtitles.Size = new System.Drawing.Size(589, 147); - this.listBoxSubtitles.TabIndex = 53; - this.listBoxSubtitles.SelectedIndexChanged += new System.EventHandler(this.listBoxSubtitles_SelectedIndexChanged); - // - // pictureBox1 - // - this.pictureBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.pictureBox1.Location = new System.Drawing.Point(13, 324); - this.pictureBox1.Name = "pictureBox1"; - this.pictureBox1.Size = new System.Drawing.Size(588, 116); - this.pictureBox1.TabIndex = 54; - this.pictureBox1.TabStop = false; - // - // textBoxTeletext - // - this.textBoxTeletext.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.textBoxTeletext.Location = new System.Drawing.Point(12, 167); - this.textBoxTeletext.Multiline = true; - this.textBoxTeletext.Name = "textBoxTeletext"; - this.textBoxTeletext.ReadOnly = true; - this.textBoxTeletext.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.textBoxTeletext.Size = new System.Drawing.Size(589, 273); - this.textBoxTeletext.TabIndex = 61; - // - // TransportStreamSubtitleChooser - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(613, 483); - this.Controls.Add(this.textBoxTeletext); - this.Controls.Add(this.pictureBox1); - this.Controls.Add(this.listBoxSubtitles); - this.Controls.Add(this.labelChoose); - this.Controls.Add(this.listBoxTracks); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(600, 510); - this.Name = "TransportStreamSubtitleChooser"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Transport stream subtitle chooser"; - this.Shown += new System.EventHandler(this.TransportStreamSubtitleChooser_Shown); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TransportStreamSubtitleChooser_KeyDown); - this.contextMenuStripListview.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Label labelChoose; - private System.Windows.Forms.ListBox listBoxTracks; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.ListBox listBoxSubtitles; - private System.Windows.Forms.PictureBox pictureBox1; - private System.Windows.Forms.ContextMenuStrip contextMenuStripListview; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemExport; - private System.Windows.Forms.ToolStripMenuItem bDNXMLToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem bluraySupToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem vobSubToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem dOSTToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem saveAllImagesWithHtmlIndexViewToolStripMenuItem; - private System.Windows.Forms.TextBox textBoxTeletext; - private System.Windows.Forms.ToolStripMenuItem saveSubtitleAsToolStripMenuItem; - private System.Windows.Forms.SaveFileDialog saveFileDialog1; - } +namespace Nikse.SubtitleEdit.Forms +{ + partial class TransportStreamSubtitleChooser + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.labelChoose = new System.Windows.Forms.Label(); + this.listBoxTracks = new System.Windows.Forms.ListBox(); + this.contextMenuStripListview = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItemExport = new System.Windows.Forms.ToolStripMenuItem(); + this.bDNXMLToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.bluraySupToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.vobSubToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.dOSTToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.saveAllImagesWithHtmlIndexViewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.saveSubtitleAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.listBoxSubtitles = new System.Windows.Forms.ListBox(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.textBoxTeletext = new System.Windows.Forms.TextBox(); + this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog(); + this.contextMenuStripListview.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.SuspendLayout(); + // + // labelChoose + // + this.labelChoose.AutoSize = true; + this.labelChoose.Location = new System.Drawing.Point(9, 15); + this.labelChoose.Name = "labelChoose"; + this.labelChoose.Size = new System.Drawing.Size(220, 13); + this.labelChoose.TabIndex = 52; + this.labelChoose.Text = "More than one subtitle found - please choose"; + // + // listBoxTracks + // + this.listBoxTracks.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listBoxTracks.ContextMenuStrip = this.contextMenuStripListview; + this.listBoxTracks.FormattingEnabled = true; + this.listBoxTracks.Location = new System.Drawing.Point(13, 31); + this.listBoxTracks.Name = "listBoxTracks"; + this.listBoxTracks.Size = new System.Drawing.Size(589, 134); + this.listBoxTracks.TabIndex = 51; + this.listBoxTracks.SelectedIndexChanged += new System.EventHandler(this.listBoxTracks_SelectedIndexChanged); + // + // contextMenuStripListview + // + this.contextMenuStripListview.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItemExport, + this.saveAllImagesWithHtmlIndexViewToolStripMenuItem, + this.saveSubtitleAsToolStripMenuItem}); + this.contextMenuStripListview.Name = "contextMenuStripListview"; + this.contextMenuStripListview.Size = new System.Drawing.Size(284, 70); + this.contextMenuStripListview.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStripListview_Opening); + // + // toolStripMenuItemExport + // + this.toolStripMenuItemExport.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.bDNXMLToolStripMenuItem, + this.bluraySupToolStripMenuItem, + this.vobSubToolStripMenuItem, + this.dOSTToolStripMenuItem}); + this.toolStripMenuItemExport.Name = "toolStripMenuItemExport"; + this.toolStripMenuItemExport.Size = new System.Drawing.Size(283, 22); + this.toolStripMenuItemExport.Text = "Export all images as..."; + // + // bDNXMLToolStripMenuItem + // + this.bDNXMLToolStripMenuItem.Name = "bDNXMLToolStripMenuItem"; + this.bDNXMLToolStripMenuItem.Size = new System.Drawing.Size(143, 22); + this.bDNXMLToolStripMenuItem.Text = "BDN XML..."; + this.bDNXMLToolStripMenuItem.Click += new System.EventHandler(this.BDNXMLToolStripMenuItem_Click); + // + // bluraySupToolStripMenuItem + // + this.bluraySupToolStripMenuItem.Name = "bluraySupToolStripMenuItem"; + this.bluraySupToolStripMenuItem.Size = new System.Drawing.Size(143, 22); + this.bluraySupToolStripMenuItem.Text = "Blu-ray sup..."; + this.bluraySupToolStripMenuItem.Click += new System.EventHandler(this.BluraySupToolStripMenuItem_Click); + // + // vobSubToolStripMenuItem + // + this.vobSubToolStripMenuItem.Name = "vobSubToolStripMenuItem"; + this.vobSubToolStripMenuItem.Size = new System.Drawing.Size(143, 22); + this.vobSubToolStripMenuItem.Text = "VobSub..."; + this.vobSubToolStripMenuItem.Click += new System.EventHandler(this.VobSubToolStripMenuItem_Click); + // + // dOSTToolStripMenuItem + // + this.dOSTToolStripMenuItem.Name = "dOSTToolStripMenuItem"; + this.dOSTToolStripMenuItem.Size = new System.Drawing.Size(143, 22); + this.dOSTToolStripMenuItem.Text = "DOST..."; + this.dOSTToolStripMenuItem.Click += new System.EventHandler(this.DOSTToolStripMenuItem_Click); + // + // saveAllImagesWithHtmlIndexViewToolStripMenuItem + // + this.saveAllImagesWithHtmlIndexViewToolStripMenuItem.Name = "saveAllImagesWithHtmlIndexViewToolStripMenuItem"; + this.saveAllImagesWithHtmlIndexViewToolStripMenuItem.Size = new System.Drawing.Size(283, 22); + this.saveAllImagesWithHtmlIndexViewToolStripMenuItem.Text = "Save all images with HTML index view..."; + this.saveAllImagesWithHtmlIndexViewToolStripMenuItem.Click += new System.EventHandler(this.SaveAllImagesWithHtmlIndexViewToolStripMenuItem_Click); + // + // saveSubtitleAsToolStripMenuItem + // + this.saveSubtitleAsToolStripMenuItem.Name = "saveSubtitleAsToolStripMenuItem"; + this.saveSubtitleAsToolStripMenuItem.Size = new System.Drawing.Size(283, 22); + this.saveSubtitleAsToolStripMenuItem.Text = "Save subtitle as..."; + this.saveSubtitleAsToolStripMenuItem.Click += new System.EventHandler(this.saveSubtitleAsToolStripMenuItem_Click); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.BackColor = System.Drawing.SystemColors.Control; + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.Location = new System.Drawing.Point(526, 450); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 60; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = false; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.Location = new System.Drawing.Point(445, 450); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 54; + this.buttonOK.Text = "OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // listBoxSubtitles + // + this.listBoxSubtitles.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listBoxSubtitles.FormattingEnabled = true; + this.listBoxSubtitles.Location = new System.Drawing.Point(12, 171); + this.listBoxSubtitles.Name = "listBoxSubtitles"; + this.listBoxSubtitles.Size = new System.Drawing.Size(589, 147); + this.listBoxSubtitles.TabIndex = 53; + this.listBoxSubtitles.SelectedIndexChanged += new System.EventHandler(this.listBoxSubtitles_SelectedIndexChanged); + // + // pictureBox1 + // + this.pictureBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pictureBox1.Location = new System.Drawing.Point(13, 324); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(588, 116); + this.pictureBox1.TabIndex = 54; + this.pictureBox1.TabStop = false; + // + // textBoxTeletext + // + this.textBoxTeletext.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxTeletext.Location = new System.Drawing.Point(12, 167); + this.textBoxTeletext.Multiline = true; + this.textBoxTeletext.Name = "textBoxTeletext"; + this.textBoxTeletext.ReadOnly = true; + this.textBoxTeletext.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.textBoxTeletext.Size = new System.Drawing.Size(589, 273); + this.textBoxTeletext.TabIndex = 61; + // + // TransportStreamSubtitleChooser + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(613, 483); + this.Controls.Add(this.textBoxTeletext); + this.Controls.Add(this.pictureBox1); + this.Controls.Add(this.listBoxSubtitles); + this.Controls.Add(this.labelChoose); + this.Controls.Add(this.listBoxTracks); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(600, 510); + this.Name = "TransportStreamSubtitleChooser"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Transport stream subtitle chooser"; + this.Shown += new System.EventHandler(this.TransportStreamSubtitleChooser_Shown); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TransportStreamSubtitleChooser_KeyDown); + this.contextMenuStripListview.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label labelChoose; + private System.Windows.Forms.ListBox listBoxTracks; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.ListBox listBoxSubtitles; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.ContextMenuStrip contextMenuStripListview; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemExport; + private System.Windows.Forms.ToolStripMenuItem bDNXMLToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem bluraySupToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem vobSubToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem dOSTToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem saveAllImagesWithHtmlIndexViewToolStripMenuItem; + private System.Windows.Forms.TextBox textBoxTeletext; + private System.Windows.Forms.ToolStripMenuItem saveSubtitleAsToolStripMenuItem; + private System.Windows.Forms.SaveFileDialog saveFileDialog1; + } } \ No newline at end of file diff --git a/src/Forms/TransportStreamSubtitleChooser.cs b/src/ui/Forms/TransportStreamSubtitleChooser.cs similarity index 97% rename from src/Forms/TransportStreamSubtitleChooser.cs rename to src/ui/Forms/TransportStreamSubtitleChooser.cs index 8fbe3f803..87d8715cf 100644 --- a/src/Forms/TransportStreamSubtitleChooser.cs +++ b/src/ui/Forms/TransportStreamSubtitleChooser.cs @@ -1,345 +1,345 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.SubtitleFormats; -using Nikse.SubtitleEdit.Forms.Ocr; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Globalization; -using System.IO; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; -using Nikse.SubtitleEdit.Core.ContainerFormats.TransportStream; - -namespace Nikse.SubtitleEdit.Forms -{ - public partial class TransportStreamSubtitleChooser : PositionAndSizeForm - { - public int SelectedIndex => listBoxTracks.SelectedIndex; - public bool IsTeletext { get; private set; } - public string Srt { get; private set; } - - public class StreamTrackItem - { - public string Text { get; set; } - public bool IsTeletext { get; set; } - public string Srt { get; set; } - public int Pid { get; set; } - public int PageNumber { get; set; } - public string Language { get; set; } - - public override string ToString() - { - return Text; - } - } - - private TransportStreamParser _tsParser; - private string _fileName; - private ProgramMapTableParser _programMapTableParser; - - public TransportStreamSubtitleChooser() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - labelChoose.Text = Configuration.Settings.Language.MatroskaSubtitleChooser.PleaseChoose; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - toolStripMenuItemExport.Text = Configuration.Settings.Language.Main.Menu.File.Export; - vobSubToolStripMenuItem.Text = Configuration.Settings.Language.Main.Menu.File.ExportVobSub; - bDNXMLToolStripMenuItem.Text = Configuration.Settings.Language.Main.Menu.File.ExportBdnXml; - bluraySupToolStripMenuItem.Text = Configuration.Settings.Language.Main.Menu.File.ExportBluRaySup; - saveAllImagesWithHtmlIndexViewToolStripMenuItem.Text = Configuration.Settings.Language.VobSubOcr.SaveAllSubtitleImagesWithHtml; - UiUtil.FixLargeFonts(this, buttonOK); - } - - private void buttonOK_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.OK; - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - private void TransportStreamSubtitleChooser_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - internal void Initialize(TransportStreamParser tsParser, string fileName) - { - _programMapTableParser = new ProgramMapTableParser(); - _programMapTableParser.Parse(fileName); // get languages - _tsParser = tsParser; - _fileName = fileName; - Text = string.Format(Configuration.Settings.Language.TransportStreamSubtitleChooser.Title, fileName); - - foreach (int id in tsParser.SubtitlePacketIds) - { - var language = _programMapTableParser.GetSubtitleLanguage(id); - if (string.IsNullOrEmpty(language)) - { - language = "unknown"; - } - - listBoxTracks.Items.Add(new StreamTrackItem - { - Text = string.Format(Configuration.Settings.Language.TransportStreamSubtitleChooser.PidLineImage, id, language, tsParser.GetDvbSubtitles(id).Count), - IsTeletext = false, - Pid = id, - Language = language - }); - } - - foreach (var program in tsParser.TeletextSubtitlesLookup) - { - var language = _programMapTableParser.GetSubtitleLanguage(program.Key); - if (string.IsNullOrEmpty(language)) - { - language = "unknown"; - } - - foreach (var kvp in program.Value) - { - var subtitle = new Subtitle(kvp.Value); - subtitle.Renumber(); - listBoxTracks.Items.Add(new StreamTrackItem - { - Text = string.Format(Configuration.Settings.Language.TransportStreamSubtitleChooser.PidLineTeletext, kvp.Key, program.Key, language, kvp.Value.Count), - IsTeletext = true, - Pid = program.Key, - PageNumber = kvp.Key, - Srt = new SubRip().ToText(subtitle, null) - }); - } - } - - listBoxTracks.SelectedIndex = 0; - } - - private void listBoxTracks_SelectedIndexChanged(object sender, EventArgs e) - { - int idx = listBoxTracks.SelectedIndex; - if (idx < 0) - { - return; - } - - var item = (StreamTrackItem)listBoxTracks.SelectedItem; - if (item.IsTeletext) - { - textBoxTeletext.Visible = true; - textBoxTeletext.Text = item.Srt; - IsTeletext = true; - Srt = item.Srt; - return; - } - - IsTeletext = false; - Srt = string.Empty; - textBoxTeletext.Visible = false; - listBoxSubtitles.Items.Clear(); - int pid = _tsParser.SubtitlePacketIds[idx]; - var list = _tsParser.GetDvbSubtitles(pid); - int i = 0; - foreach (var sub in list) - { - i++; - var start = new TimeCode(sub.StartMilliseconds); - var end = new TimeCode(sub.EndMilliseconds); - listBoxSubtitles.Items.Add(string.Format(Configuration.Settings.Language.TransportStreamSubtitleChooser.SubLine, i, start, end, sub.NumberOfImages)); - } - if (list.Count > 0) - { - listBoxSubtitles.SelectedIndex = 0; - } - } - - private void listBoxSubtitles_SelectedIndexChanged(object sender, EventArgs e) - { - int idx = listBoxSubtitles.SelectedIndex; - if (idx < 0) - { - return; - } - - int pid = _tsParser.SubtitlePacketIds[listBoxTracks.SelectedIndex]; - var list = _tsParser.GetDvbSubtitles(pid); - - var dvbBmp = list[idx].GetBitmap(); - var nDvbBmp = new NikseBitmap(dvbBmp); - nDvbBmp.CropTopTransparent(2); - nDvbBmp.CropTransparentSidesAndBottom(2, true); - dvbBmp.Dispose(); - var oldImage = pictureBox1.Image; - pictureBox1.Image = nDvbBmp.GetBitmap(); - oldImage?.Dispose(); - } - - private List GetSelectedSubtitles() - { - int idx = listBoxSubtitles.SelectedIndex; - if (idx < 0) - { - return null; - } - - int pid = _tsParser.SubtitlePacketIds[listBoxTracks.SelectedIndex]; - return _tsParser.GetDvbSubtitles(pid); - } - - private string GetSelectedLanguage() - { - int idx = listBoxSubtitles.SelectedIndex; - if (idx < 0) - { - return null; - } - - int pid = _tsParser.SubtitlePacketIds[listBoxTracks.SelectedIndex]; - return _programMapTableParser.GetSubtitleLanguage(pid); - } - - private void BluraySupToolStripMenuItem_Click(object sender, EventArgs e) - { - ExportTo(ExportPngXml.ExportFormats.BluraySup); - } - - private void BDNXMLToolStripMenuItem_Click(object sender, EventArgs e) - { - ExportTo(ExportPngXml.ExportFormats.BdnXml); - } - - private void VobSubToolStripMenuItem_Click(object sender, EventArgs e) - { - ExportTo(ExportPngXml.ExportFormats.VobSub); - } - - private void DOSTToolStripMenuItem_Click(object sender, EventArgs e) - { - ExportTo(ExportPngXml.ExportFormats.Dost); - } - - private Point GetResolution() - { - int idx = listBoxTracks.SelectedIndex; - if (idx < 0) - { - return new Point(DvbSubPes.DefaultScreenWidth, DvbSubPes.DefaultScreenHeight); - } - - int pid = _tsParser.SubtitlePacketIds[idx]; - var list = _tsParser.GetDvbSubtitles(pid); - if (list.Count > 0) - { - using (var bmp = list[0].GetBitmap()) - { - return new Point(bmp.Width, bmp.Height); - } - } - return new Point(DvbSubPes.DefaultScreenWidth, DvbSubPes.DefaultScreenHeight); - } - - private void ExportTo(string exportType) - { - var subtitles = GetSelectedSubtitles(); - if (subtitles == null) - { - return; - } - - using (var formSubOcr = new VobSubOcr()) - { - formSubOcr.Initialize(subtitles, Configuration.Settings.VobSubOcr, _fileName, GetSelectedLanguage(), true); - using (var exportBdnXmlPng = new ExportPngXml()) - { - exportBdnXmlPng.InitializeFromVobSubOcr(formSubOcr.SubtitleFromOcr, new SubRip(), exportType, _fileName, formSubOcr, GetSelectedLanguage()); - exportBdnXmlPng.SetResolution(GetResolution()); - exportBdnXmlPng.ShowDialog(this); - } - } - } - - private void SaveAllImagesWithHtmlIndexViewToolStripMenuItem_Click(object sender, EventArgs e) - { - var subtitles = GetSelectedSubtitles(); - if (subtitles == null) - { - return; - } - - using (var formSubOcr = new VobSubOcr()) - { - formSubOcr.Initialize(subtitles, Configuration.Settings.VobSubOcr, _fileName, GetSelectedLanguage()); - formSubOcr.SaveAllImagesWithHtmlIndexViewToolStripMenuItem_Click(sender, e); - } - } - - private void TransportStreamSubtitleChooser_Shown(object sender, EventArgs e) - { - BringToFront(); - } - - private void contextMenuStripListview_Opening(object sender, System.ComponentModel.CancelEventArgs e) - { - int idx = listBoxTracks.SelectedIndex; - if (idx < 0) - { - e.Cancel = true; - return; - } - - var item = (StreamTrackItem)listBoxTracks.SelectedItem; - if (item.IsTeletext) - { - toolStripMenuItemExport.Visible = false; - saveAllImagesWithHtmlIndexViewToolStripMenuItem.Visible = false; - saveSubtitleAsToolStripMenuItem.Visible = true; - } - else - { - toolStripMenuItemExport.Visible = true; - saveAllImagesWithHtmlIndexViewToolStripMenuItem.Visible = true; - saveSubtitleAsToolStripMenuItem.Visible = false; - } - } - - private void saveSubtitleAsToolStripMenuItem_Click(object sender, EventArgs e) - { - int idx = listBoxTracks.SelectedIndex; - if (idx < 0) - { - return; - } - - var item = (StreamTrackItem)listBoxTracks.SelectedItem; - if (item.IsTeletext) - { - saveFileDialog1.Title = Configuration.Settings.Language.ExportCustomText.SaveSubtitleAs; - var fileName = Utilities.GetPathAndFileNameWithoutExtension(_fileName); - if (item.PageNumber > 0) - { - fileName += "." + item.PageNumber.ToString(CultureInfo.InvariantCulture); - } - if (!string.IsNullOrEmpty(item.Language)) - { - fileName += "." + _programMapTableParser.GetSubtitleLanguageTwoLetter(item.Pid); - } - saveFileDialog1.InitialDirectory = Path.GetDirectoryName(fileName); - saveFileDialog1.FileName = Path.GetFileName(fileName) + ".srt"; - - if (saveFileDialog1.ShowDialog(this) == DialogResult.OK) - { - File.WriteAllText(saveFileDialog1.FileName, item.Srt); - } - } - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.SubtitleFormats; +using Nikse.SubtitleEdit.Forms.Ocr; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Globalization; +using System.IO; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.ContainerFormats.TransportStream; + +namespace Nikse.SubtitleEdit.Forms +{ + public partial class TransportStreamSubtitleChooser : PositionAndSizeForm + { + public int SelectedIndex => listBoxTracks.SelectedIndex; + public bool IsTeletext { get; private set; } + public string Srt { get; private set; } + + public class StreamTrackItem + { + public string Text { get; set; } + public bool IsTeletext { get; set; } + public string Srt { get; set; } + public int Pid { get; set; } + public int PageNumber { get; set; } + public string Language { get; set; } + + public override string ToString() + { + return Text; + } + } + + private TransportStreamParser _tsParser; + private string _fileName; + private ProgramMapTableParser _programMapTableParser; + + public TransportStreamSubtitleChooser() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + labelChoose.Text = Configuration.Settings.Language.MatroskaSubtitleChooser.PleaseChoose; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + toolStripMenuItemExport.Text = Configuration.Settings.Language.Main.Menu.File.Export; + vobSubToolStripMenuItem.Text = Configuration.Settings.Language.Main.Menu.File.ExportVobSub; + bDNXMLToolStripMenuItem.Text = Configuration.Settings.Language.Main.Menu.File.ExportBdnXml; + bluraySupToolStripMenuItem.Text = Configuration.Settings.Language.Main.Menu.File.ExportBluRaySup; + saveAllImagesWithHtmlIndexViewToolStripMenuItem.Text = Configuration.Settings.Language.VobSubOcr.SaveAllSubtitleImagesWithHtml; + UiUtil.FixLargeFonts(this, buttonOK); + } + + private void buttonOK_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.OK; + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void TransportStreamSubtitleChooser_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + internal void Initialize(TransportStreamParser tsParser, string fileName) + { + _programMapTableParser = new ProgramMapTableParser(); + _programMapTableParser.Parse(fileName); // get languages + _tsParser = tsParser; + _fileName = fileName; + Text = string.Format(Configuration.Settings.Language.TransportStreamSubtitleChooser.Title, fileName); + + foreach (int id in tsParser.SubtitlePacketIds) + { + var language = _programMapTableParser.GetSubtitleLanguage(id); + if (string.IsNullOrEmpty(language)) + { + language = "unknown"; + } + + listBoxTracks.Items.Add(new StreamTrackItem + { + Text = string.Format(Configuration.Settings.Language.TransportStreamSubtitleChooser.PidLineImage, id, language, tsParser.GetDvbSubtitles(id).Count), + IsTeletext = false, + Pid = id, + Language = language + }); + } + + foreach (var program in tsParser.TeletextSubtitlesLookup) + { + var language = _programMapTableParser.GetSubtitleLanguage(program.Key); + if (string.IsNullOrEmpty(language)) + { + language = "unknown"; + } + + foreach (var kvp in program.Value) + { + var subtitle = new Subtitle(kvp.Value); + subtitle.Renumber(); + listBoxTracks.Items.Add(new StreamTrackItem + { + Text = string.Format(Configuration.Settings.Language.TransportStreamSubtitleChooser.PidLineTeletext, kvp.Key, program.Key, language, kvp.Value.Count), + IsTeletext = true, + Pid = program.Key, + PageNumber = kvp.Key, + Srt = new SubRip().ToText(subtitle, null) + }); + } + } + + listBoxTracks.SelectedIndex = 0; + } + + private void listBoxTracks_SelectedIndexChanged(object sender, EventArgs e) + { + int idx = listBoxTracks.SelectedIndex; + if (idx < 0) + { + return; + } + + var item = (StreamTrackItem)listBoxTracks.SelectedItem; + if (item.IsTeletext) + { + textBoxTeletext.Visible = true; + textBoxTeletext.Text = item.Srt; + IsTeletext = true; + Srt = item.Srt; + return; + } + + IsTeletext = false; + Srt = string.Empty; + textBoxTeletext.Visible = false; + listBoxSubtitles.Items.Clear(); + int pid = _tsParser.SubtitlePacketIds[idx]; + var list = _tsParser.GetDvbSubtitles(pid); + int i = 0; + foreach (var sub in list) + { + i++; + var start = new TimeCode(sub.StartMilliseconds); + var end = new TimeCode(sub.EndMilliseconds); + listBoxSubtitles.Items.Add(string.Format(Configuration.Settings.Language.TransportStreamSubtitleChooser.SubLine, i, start, end, sub.NumberOfImages)); + } + if (list.Count > 0) + { + listBoxSubtitles.SelectedIndex = 0; + } + } + + private void listBoxSubtitles_SelectedIndexChanged(object sender, EventArgs e) + { + int idx = listBoxSubtitles.SelectedIndex; + if (idx < 0) + { + return; + } + + int pid = _tsParser.SubtitlePacketIds[listBoxTracks.SelectedIndex]; + var list = _tsParser.GetDvbSubtitles(pid); + + var dvbBmp = list[idx].GetBitmap(); + var nDvbBmp = new NikseBitmap(dvbBmp); + nDvbBmp.CropTopTransparent(2); + nDvbBmp.CropTransparentSidesAndBottom(2, true); + dvbBmp.Dispose(); + var oldImage = pictureBox1.Image; + pictureBox1.Image = nDvbBmp.GetBitmap(); + oldImage?.Dispose(); + } + + private List GetSelectedSubtitles() + { + int idx = listBoxSubtitles.SelectedIndex; + if (idx < 0) + { + return null; + } + + int pid = _tsParser.SubtitlePacketIds[listBoxTracks.SelectedIndex]; + return _tsParser.GetDvbSubtitles(pid); + } + + private string GetSelectedLanguage() + { + int idx = listBoxSubtitles.SelectedIndex; + if (idx < 0) + { + return null; + } + + int pid = _tsParser.SubtitlePacketIds[listBoxTracks.SelectedIndex]; + return _programMapTableParser.GetSubtitleLanguage(pid); + } + + private void BluraySupToolStripMenuItem_Click(object sender, EventArgs e) + { + ExportTo(ExportPngXml.ExportFormats.BluraySup); + } + + private void BDNXMLToolStripMenuItem_Click(object sender, EventArgs e) + { + ExportTo(ExportPngXml.ExportFormats.BdnXml); + } + + private void VobSubToolStripMenuItem_Click(object sender, EventArgs e) + { + ExportTo(ExportPngXml.ExportFormats.VobSub); + } + + private void DOSTToolStripMenuItem_Click(object sender, EventArgs e) + { + ExportTo(ExportPngXml.ExportFormats.Dost); + } + + private Point GetResolution() + { + int idx = listBoxTracks.SelectedIndex; + if (idx < 0) + { + return new Point(DvbSubPes.DefaultScreenWidth, DvbSubPes.DefaultScreenHeight); + } + + int pid = _tsParser.SubtitlePacketIds[idx]; + var list = _tsParser.GetDvbSubtitles(pid); + if (list.Count > 0) + { + using (var bmp = list[0].GetBitmap()) + { + return new Point(bmp.Width, bmp.Height); + } + } + return new Point(DvbSubPes.DefaultScreenWidth, DvbSubPes.DefaultScreenHeight); + } + + private void ExportTo(string exportType) + { + var subtitles = GetSelectedSubtitles(); + if (subtitles == null) + { + return; + } + + using (var formSubOcr = new VobSubOcr()) + { + formSubOcr.Initialize(subtitles, Configuration.Settings.VobSubOcr, _fileName, GetSelectedLanguage(), true); + using (var exportBdnXmlPng = new ExportPngXml()) + { + exportBdnXmlPng.InitializeFromVobSubOcr(formSubOcr.SubtitleFromOcr, new SubRip(), exportType, _fileName, formSubOcr, GetSelectedLanguage()); + exportBdnXmlPng.SetResolution(GetResolution()); + exportBdnXmlPng.ShowDialog(this); + } + } + } + + private void SaveAllImagesWithHtmlIndexViewToolStripMenuItem_Click(object sender, EventArgs e) + { + var subtitles = GetSelectedSubtitles(); + if (subtitles == null) + { + return; + } + + using (var formSubOcr = new VobSubOcr()) + { + formSubOcr.Initialize(subtitles, Configuration.Settings.VobSubOcr, _fileName, GetSelectedLanguage()); + formSubOcr.SaveAllImagesWithHtmlIndexViewToolStripMenuItem_Click(sender, e); + } + } + + private void TransportStreamSubtitleChooser_Shown(object sender, EventArgs e) + { + BringToFront(); + } + + private void contextMenuStripListview_Opening(object sender, System.ComponentModel.CancelEventArgs e) + { + int idx = listBoxTracks.SelectedIndex; + if (idx < 0) + { + e.Cancel = true; + return; + } + + var item = (StreamTrackItem)listBoxTracks.SelectedItem; + if (item.IsTeletext) + { + toolStripMenuItemExport.Visible = false; + saveAllImagesWithHtmlIndexViewToolStripMenuItem.Visible = false; + saveSubtitleAsToolStripMenuItem.Visible = true; + } + else + { + toolStripMenuItemExport.Visible = true; + saveAllImagesWithHtmlIndexViewToolStripMenuItem.Visible = true; + saveSubtitleAsToolStripMenuItem.Visible = false; + } + } + + private void saveSubtitleAsToolStripMenuItem_Click(object sender, EventArgs e) + { + int idx = listBoxTracks.SelectedIndex; + if (idx < 0) + { + return; + } + + var item = (StreamTrackItem)listBoxTracks.SelectedItem; + if (item.IsTeletext) + { + saveFileDialog1.Title = Configuration.Settings.Language.ExportCustomText.SaveSubtitleAs; + var fileName = Utilities.GetPathAndFileNameWithoutExtension(_fileName); + if (item.PageNumber > 0) + { + fileName += "." + item.PageNumber.ToString(CultureInfo.InvariantCulture); + } + if (!string.IsNullOrEmpty(item.Language)) + { + fileName += "." + _programMapTableParser.GetSubtitleLanguageTwoLetter(item.Pid); + } + saveFileDialog1.InitialDirectory = Path.GetDirectoryName(fileName); + saveFileDialog1.FileName = Path.GetFileName(fileName) + ".srt"; + + if (saveFileDialog1.ShowDialog(this) == DialogResult.OK) + { + File.WriteAllText(saveFileDialog1.FileName, item.Srt); + } + } + } + + } +} diff --git a/src/Forms/TransportStreamSubtitleChooser.resx b/src/ui/Forms/TransportStreamSubtitleChooser.resx similarity index 97% rename from src/Forms/TransportStreamSubtitleChooser.resx rename to src/ui/Forms/TransportStreamSubtitleChooser.resx index 1d7897027..3227d2eca 100644 --- a/src/Forms/TransportStreamSubtitleChooser.resx +++ b/src/ui/Forms/TransportStreamSubtitleChooser.resx @@ -1,126 +1,126 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - 208, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 208, 17 + \ No newline at end of file diff --git a/src/Forms/UnknownSubtitle.Designer.cs b/src/ui/Forms/UnknownSubtitle.Designer.cs similarity index 98% rename from src/Forms/UnknownSubtitle.Designer.cs rename to src/ui/Forms/UnknownSubtitle.Designer.cs index 9df2fb3f9..a82b24da1 100644 --- a/src/Forms/UnknownSubtitle.Designer.cs +++ b/src/ui/Forms/UnknownSubtitle.Designer.cs @@ -1,146 +1,146 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class UnknownSubtitle - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.labelTitle = new System.Windows.Forms.Label(); - this.buttonOK = new System.Windows.Forms.Button(); - this.richTextBoxMessage = new System.Windows.Forms.RichTextBox(); - this.buttonImportPlainText = new System.Windows.Forms.Button(); - this.LabelPreview = new System.Windows.Forms.Label(); - this.textBoxPreview = new System.Windows.Forms.TextBox(); - this.SuspendLayout(); - // - // labelTitle - // - this.labelTitle.AutoSize = true; - this.labelTitle.Location = new System.Drawing.Point(15, 25); - this.labelTitle.Name = "labelTitle"; - this.labelTitle.Size = new System.Drawing.Size(114, 13); - this.labelTitle.TabIndex = 0; - this.labelTitle.Text = "Unknown subtitle type"; - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(457, 272); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(100, 27); - this.buttonOK.TabIndex = 8; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - // - // richTextBoxMessage - // - this.richTextBoxMessage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.richTextBoxMessage.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.richTextBoxMessage.Location = new System.Drawing.Point(18, 54); - this.richTextBoxMessage.Name = "richTextBoxMessage"; - this.richTextBoxMessage.ReadOnly = true; - this.richTextBoxMessage.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical; - this.richTextBoxMessage.Size = new System.Drawing.Size(539, 47); - this.richTextBoxMessage.TabIndex = 41; - this.richTextBoxMessage.TabStop = false; - this.richTextBoxMessage.Text = "If you want this fixed please send an email to mailto:niksedk@gmail.com and inclu" + - "de a copy of the subtitle."; - // - // buttonImportPlainText - // - this.buttonImportPlainText.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonImportPlainText.DialogResult = System.Windows.Forms.DialogResult.OK; - this.buttonImportPlainText.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonImportPlainText.Location = new System.Drawing.Point(260, 272); - this.buttonImportPlainText.Name = "buttonImportPlainText"; - this.buttonImportPlainText.Size = new System.Drawing.Size(191, 27); - this.buttonImportPlainText.TabIndex = 4; - this.buttonImportPlainText.Text = "Import plain text..."; - this.buttonImportPlainText.UseVisualStyleBackColor = true; - this.buttonImportPlainText.Click += new System.EventHandler(this.buttonImportPlainText_Click); - // - // LabelPreview - // - this.LabelPreview.AutoSize = true; - this.LabelPreview.Location = new System.Drawing.Point(17, 101); - this.LabelPreview.Name = "LabelPreview"; - this.LabelPreview.Size = new System.Drawing.Size(45, 13); - this.LabelPreview.TabIndex = 44; - this.LabelPreview.Text = "Preview"; - // - // textBoxPreview - // - this.textBoxPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.textBoxPreview.Location = new System.Drawing.Point(18, 118); - this.textBoxPreview.Multiline = true; - this.textBoxPreview.Name = "textBoxPreview"; - this.textBoxPreview.ReadOnly = true; - this.textBoxPreview.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.textBoxPreview.Size = new System.Drawing.Size(539, 141); - this.textBoxPreview.TabIndex = 2; - // - // UnknownSubtitle - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(569, 311); - this.Controls.Add(this.LabelPreview); - this.Controls.Add(this.textBoxPreview); - this.Controls.Add(this.buttonImportPlainText); - this.Controls.Add(this.richTextBoxMessage); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.labelTitle); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "UnknownSubtitle"; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Unknown subtitle"; - this.Shown += new System.EventHandler(this.UnknownSubtitle_Shown); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormUnknownSubtitle_KeyDown); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Label labelTitle; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.RichTextBox richTextBoxMessage; - private System.Windows.Forms.Button buttonImportPlainText; - private System.Windows.Forms.Label LabelPreview; - private System.Windows.Forms.TextBox textBoxPreview; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class UnknownSubtitle + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.labelTitle = new System.Windows.Forms.Label(); + this.buttonOK = new System.Windows.Forms.Button(); + this.richTextBoxMessage = new System.Windows.Forms.RichTextBox(); + this.buttonImportPlainText = new System.Windows.Forms.Button(); + this.LabelPreview = new System.Windows.Forms.Label(); + this.textBoxPreview = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // labelTitle + // + this.labelTitle.AutoSize = true; + this.labelTitle.Location = new System.Drawing.Point(15, 25); + this.labelTitle.Name = "labelTitle"; + this.labelTitle.Size = new System.Drawing.Size(114, 13); + this.labelTitle.TabIndex = 0; + this.labelTitle.Text = "Unknown subtitle type"; + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(457, 272); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(100, 27); + this.buttonOK.TabIndex = 8; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + // + // richTextBoxMessage + // + this.richTextBoxMessage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.richTextBoxMessage.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.richTextBoxMessage.Location = new System.Drawing.Point(18, 54); + this.richTextBoxMessage.Name = "richTextBoxMessage"; + this.richTextBoxMessage.ReadOnly = true; + this.richTextBoxMessage.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical; + this.richTextBoxMessage.Size = new System.Drawing.Size(539, 47); + this.richTextBoxMessage.TabIndex = 41; + this.richTextBoxMessage.TabStop = false; + this.richTextBoxMessage.Text = "If you want this fixed please send an email to mailto:niksedk@gmail.com and inclu" + + "de a copy of the subtitle."; + // + // buttonImportPlainText + // + this.buttonImportPlainText.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonImportPlainText.DialogResult = System.Windows.Forms.DialogResult.OK; + this.buttonImportPlainText.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonImportPlainText.Location = new System.Drawing.Point(260, 272); + this.buttonImportPlainText.Name = "buttonImportPlainText"; + this.buttonImportPlainText.Size = new System.Drawing.Size(191, 27); + this.buttonImportPlainText.TabIndex = 4; + this.buttonImportPlainText.Text = "Import plain text..."; + this.buttonImportPlainText.UseVisualStyleBackColor = true; + this.buttonImportPlainText.Click += new System.EventHandler(this.buttonImportPlainText_Click); + // + // LabelPreview + // + this.LabelPreview.AutoSize = true; + this.LabelPreview.Location = new System.Drawing.Point(17, 101); + this.LabelPreview.Name = "LabelPreview"; + this.LabelPreview.Size = new System.Drawing.Size(45, 13); + this.LabelPreview.TabIndex = 44; + this.LabelPreview.Text = "Preview"; + // + // textBoxPreview + // + this.textBoxPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxPreview.Location = new System.Drawing.Point(18, 118); + this.textBoxPreview.Multiline = true; + this.textBoxPreview.Name = "textBoxPreview"; + this.textBoxPreview.ReadOnly = true; + this.textBoxPreview.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.textBoxPreview.Size = new System.Drawing.Size(539, 141); + this.textBoxPreview.TabIndex = 2; + // + // UnknownSubtitle + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(569, 311); + this.Controls.Add(this.LabelPreview); + this.Controls.Add(this.textBoxPreview); + this.Controls.Add(this.buttonImportPlainText); + this.Controls.Add(this.richTextBoxMessage); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.labelTitle); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "UnknownSubtitle"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Unknown subtitle"; + this.Shown += new System.EventHandler(this.UnknownSubtitle_Shown); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormUnknownSubtitle_KeyDown); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label labelTitle; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.RichTextBox richTextBoxMessage; + private System.Windows.Forms.Button buttonImportPlainText; + private System.Windows.Forms.Label LabelPreview; + private System.Windows.Forms.TextBox textBoxPreview; + } } \ No newline at end of file diff --git a/src/Forms/UnknownSubtitle.cs b/src/ui/Forms/UnknownSubtitle.cs similarity index 97% rename from src/Forms/UnknownSubtitle.cs rename to src/ui/Forms/UnknownSubtitle.cs index 88a190375..b2a91a9d5 100644 --- a/src/Forms/UnknownSubtitle.cs +++ b/src/ui/Forms/UnknownSubtitle.cs @@ -1,75 +1,75 @@ -using System.IO; -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class UnknownSubtitle : Form - { - public bool ImportPlainText { get; set; } - - public UnknownSubtitle() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - Text = Configuration.Settings.Language.UnknownSubtitle.Title; - labelTitle.Text = Configuration.Settings.Language.UnknownSubtitle.Title; - richTextBoxMessage.Text = Configuration.Settings.Language.UnknownSubtitle.Message; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonImportPlainText.Text = Configuration.Settings.Language.UnknownSubtitle.ImportAsPlainText; - UiUtil.FixLargeFonts(this, buttonOK); - } - - public void Initialize(string title, string fileName, bool allowImportPlainText) - { - Text = title; - try - { - var file = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); - - int length = (int)file.Length; - if (length > 100000) - { - length = 100000; - } - - file.Position = 0; - var fileBuffer = new byte[length]; - file.Read(fileBuffer, 0, length); - file.Close(); - - var encoding = LanguageAutoDetect.DetectAnsiEncoding(fileBuffer); - LabelPreview.Text = Configuration.Settings.Language.General.Preview + " - " + fileName; - textBoxPreview.Text = encoding.GetString(fileBuffer).Replace("\0", " "); - buttonImportPlainText.Visible = allowImportPlainText && !string.IsNullOrWhiteSpace(textBoxPreview.Text); - } - catch - { - // ignored - } - } - - private void FormUnknownSubtitle_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - private void buttonImportPlainText_Click(object sender, System.EventArgs e) - { - ImportPlainText = true; - DialogResult = DialogResult.OK; - } - - private void UnknownSubtitle_Shown(object sender, System.EventArgs e) - { - buttonOK.Focus(); - } - } -} +using System.IO; +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class UnknownSubtitle : Form + { + public bool ImportPlainText { get; set; } + + public UnknownSubtitle() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + Text = Configuration.Settings.Language.UnknownSubtitle.Title; + labelTitle.Text = Configuration.Settings.Language.UnknownSubtitle.Title; + richTextBoxMessage.Text = Configuration.Settings.Language.UnknownSubtitle.Message; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonImportPlainText.Text = Configuration.Settings.Language.UnknownSubtitle.ImportAsPlainText; + UiUtil.FixLargeFonts(this, buttonOK); + } + + public void Initialize(string title, string fileName, bool allowImportPlainText) + { + Text = title; + try + { + var file = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + + int length = (int)file.Length; + if (length > 100000) + { + length = 100000; + } + + file.Position = 0; + var fileBuffer = new byte[length]; + file.Read(fileBuffer, 0, length); + file.Close(); + + var encoding = LanguageAutoDetect.DetectAnsiEncoding(fileBuffer); + LabelPreview.Text = Configuration.Settings.Language.General.Preview + " - " + fileName; + textBoxPreview.Text = encoding.GetString(fileBuffer).Replace("\0", " "); + buttonImportPlainText.Visible = allowImportPlainText && !string.IsNullOrWhiteSpace(textBoxPreview.Text); + } + catch + { + // ignored + } + } + + private void FormUnknownSubtitle_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + private void buttonImportPlainText_Click(object sender, System.EventArgs e) + { + ImportPlainText = true; + DialogResult = DialogResult.OK; + } + + private void UnknownSubtitle_Shown(object sender, System.EventArgs e) + { + buttonOK.Focus(); + } + } +} diff --git a/src/Forms/UnknownSubtitle.resx b/src/ui/Forms/UnknownSubtitle.resx similarity index 97% rename from src/Forms/UnknownSubtitle.resx rename to src/ui/Forms/UnknownSubtitle.resx index c7e0d4bdf..d58980a38 100644 --- a/src/Forms/UnknownSubtitle.resx +++ b/src/ui/Forms/UnknownSubtitle.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Forms/VideoControlsUndocked.Designer.cs b/src/ui/Forms/VideoControlsUndocked.Designer.cs similarity index 97% rename from src/Forms/VideoControlsUndocked.Designer.cs rename to src/ui/Forms/VideoControlsUndocked.Designer.cs index 8c45fe41a..cf6006cd5 100644 --- a/src/Forms/VideoControlsUndocked.Designer.cs +++ b/src/ui/Forms/VideoControlsUndocked.Designer.cs @@ -1,62 +1,62 @@ -namespace Nikse.SubtitleEdit.Forms -{ - partial class VideoControlsUndocked - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.panelContainer = new System.Windows.Forms.Panel(); - this.SuspendLayout(); - // - // panelContainer - // - this.panelContainer.Dock = System.Windows.Forms.DockStyle.Fill; - this.panelContainer.Location = new System.Drawing.Point(0, 0); - this.panelContainer.Name = "panelContainer"; - this.panelContainer.Size = new System.Drawing.Size(458, 311); - this.panelContainer.TabIndex = 2; - // - // VideoControlsUndocked - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(458, 311); - this.Controls.Add(this.panelContainer); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow; - this.KeyPreview = true; - this.Name = "VideoControlsUndocked"; - this.Text = "VideoControlsUndocked"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.VideoControlsUndocked_FormClosing); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.VideoControlsUndocked_KeyDown); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Panel panelContainer; - } +namespace Nikse.SubtitleEdit.Forms +{ + partial class VideoControlsUndocked + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.panelContainer = new System.Windows.Forms.Panel(); + this.SuspendLayout(); + // + // panelContainer + // + this.panelContainer.Dock = System.Windows.Forms.DockStyle.Fill; + this.panelContainer.Location = new System.Drawing.Point(0, 0); + this.panelContainer.Name = "panelContainer"; + this.panelContainer.Size = new System.Drawing.Size(458, 311); + this.panelContainer.TabIndex = 2; + // + // VideoControlsUndocked + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(458, 311); + this.Controls.Add(this.panelContainer); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow; + this.KeyPreview = true; + this.Name = "VideoControlsUndocked"; + this.Text = "VideoControlsUndocked"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.VideoControlsUndocked_FormClosing); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.VideoControlsUndocked_KeyDown); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel panelContainer; + } } \ No newline at end of file diff --git a/src/Forms/VideoControlsUndocked.cs b/src/ui/Forms/VideoControlsUndocked.cs similarity index 96% rename from src/Forms/VideoControlsUndocked.cs rename to src/ui/Forms/VideoControlsUndocked.cs index 6b71cd4e4..1143721db 100644 --- a/src/Forms/VideoControlsUndocked.cs +++ b/src/ui/Forms/VideoControlsUndocked.cs @@ -1,57 +1,57 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System.Drawing; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public partial class VideoControlsUndocked : PositionAndSizeForm - { - private readonly Main _mainForm; - private readonly Keys _redockKeys; - - public Panel PanelContainer => panelContainer; - - public VideoControlsUndocked(Main mainForm) - { - AutoScaleMode = AutoScaleMode.Dpi; - InitializeComponent(); - _mainForm = mainForm; - Icon = (Icon)mainForm.Icon.Clone(); - _redockKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainVideoToggleVideoControls); - } - - public VideoControlsUndocked() - { - } - - private void VideoControlsUndocked_FormClosing(object sender, FormClosingEventArgs e) - { - if (e.CloseReason == CloseReason.UserClosing && panelContainer.Controls.Count > 0) - { - ReDock(); - } - } - - private void ReDock() - { - var control = panelContainer.Controls[0]; - var controlCheckBox = panelContainer.Controls[1]; - panelContainer.Controls.Clear(); - _mainForm.ReDockVideoButtons(control, controlCheckBox); - } - - private void VideoControlsUndocked_KeyDown(object sender, KeyEventArgs e) - { - if (_redockKeys == e.KeyData) - { - _mainForm.RedockVideoControlsToolStripMenuItemClick(null, null); - } - else - { - _mainForm.MainKeyDown(sender, e); - } - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System.Drawing; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public partial class VideoControlsUndocked : PositionAndSizeForm + { + private readonly Main _mainForm; + private readonly Keys _redockKeys; + + public Panel PanelContainer => panelContainer; + + public VideoControlsUndocked(Main mainForm) + { + AutoScaleMode = AutoScaleMode.Dpi; + InitializeComponent(); + _mainForm = mainForm; + Icon = (Icon)mainForm.Icon.Clone(); + _redockKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainVideoToggleVideoControls); + } + + public VideoControlsUndocked() + { + } + + private void VideoControlsUndocked_FormClosing(object sender, FormClosingEventArgs e) + { + if (e.CloseReason == CloseReason.UserClosing && panelContainer.Controls.Count > 0) + { + ReDock(); + } + } + + private void ReDock() + { + var control = panelContainer.Controls[0]; + var controlCheckBox = panelContainer.Controls[1]; + panelContainer.Controls.Clear(); + _mainForm.ReDockVideoButtons(control, controlCheckBox); + } + + private void VideoControlsUndocked_KeyDown(object sender, KeyEventArgs e) + { + if (_redockKeys == e.KeyData) + { + _mainForm.RedockVideoControlsToolStripMenuItemClick(null, null); + } + else + { + _mainForm.MainKeyDown(sender, e); + } + } + } +} diff --git a/src/Forms/VideoControlsUndocked.resx b/src/ui/Forms/VideoControlsUndocked.resx similarity index 97% rename from src/Forms/VideoControlsUndocked.resx rename to src/ui/Forms/VideoControlsUndocked.resx index 4f24d55cd..8b2ff64a1 100644 --- a/src/Forms/VideoControlsUndocked.resx +++ b/src/ui/Forms/VideoControlsUndocked.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Forms/VideoError.Designer.cs b/src/ui/Forms/VideoError.Designer.cs similarity index 98% rename from src/Forms/VideoError.Designer.cs rename to src/ui/Forms/VideoError.Designer.cs index d4f1e4873..ae76792b1 100644 --- a/src/Forms/VideoError.Designer.cs +++ b/src/ui/Forms/VideoError.Designer.cs @@ -1,147 +1,147 @@ -namespace Nikse.SubtitleEdit.Forms -{ - partial class VideoError - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.textBoxError = new System.Windows.Forms.TextBox(); - this.richTextBoxMessage = new System.Windows.Forms.RichTextBox(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonMpvSettings = new System.Windows.Forms.Button(); - this.labelMpvInfo = new System.Windows.Forms.Label(); - this.groupBox1.SuspendLayout(); - this.SuspendLayout(); - // - // groupBox1 - // - this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBox1.Controls.Add(this.textBoxError); - this.groupBox1.Location = new System.Drawing.Point(12, 180); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(674, 142); - this.groupBox1.TabIndex = 0; - this.groupBox1.TabStop = false; - this.groupBox1.Text = "Error message"; - // - // textBoxError - // - this.textBoxError.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.textBoxError.Location = new System.Drawing.Point(7, 20); - this.textBoxError.Multiline = true; - this.textBoxError.Name = "textBoxError"; - this.textBoxError.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.textBoxError.Size = new System.Drawing.Size(661, 116); - this.textBoxError.TabIndex = 0; - // - // richTextBoxMessage - // - this.richTextBoxMessage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.richTextBoxMessage.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.richTextBoxMessage.Location = new System.Drawing.Point(13, 23); - this.richTextBoxMessage.Name = "richTextBoxMessage"; - this.richTextBoxMessage.ReadOnly = true; - this.richTextBoxMessage.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical; - this.richTextBoxMessage.Size = new System.Drawing.Size(674, 87); - this.richTextBoxMessage.TabIndex = 1; - this.richTextBoxMessage.Text = ""; - this.richTextBoxMessage.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.richTextBoxMessage_LinkClicked); - // - // buttonCancel - // - this.buttonCancel.Anchor = System.Windows.Forms.AnchorStyles.Bottom; - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(612, 328); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 11; - this.buttonCancel.Text = "&OK"; - this.buttonCancel.UseVisualStyleBackColor = true; - // - // buttonMpvSettings - // - this.buttonMpvSettings.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.buttonMpvSettings.Location = new System.Drawing.Point(20, 134); - this.buttonMpvSettings.Name = "buttonMpvSettings"; - this.buttonMpvSettings.Size = new System.Drawing.Size(272, 23); - this.buttonMpvSettings.TabIndex = 30; - this.buttonMpvSettings.Text = "Download and use \"mpv\" as video player"; - this.buttonMpvSettings.UseVisualStyleBackColor = true; - this.buttonMpvSettings.Click += new System.EventHandler(this.buttonMpvSettings_Click); - // - // labelMpvInfo - // - this.labelMpvInfo.AutoSize = true; - this.labelMpvInfo.Location = new System.Drawing.Point(17, 118); - this.labelMpvInfo.Name = "labelMpvInfo"; - this.labelMpvInfo.Size = new System.Drawing.Size(69, 13); - this.labelMpvInfo.TabIndex = 31; - this.labelMpvInfo.Text = "labelMpvInfo"; - // - // VideoError - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(699, 361); - this.Controls.Add(this.labelMpvInfo); - this.Controls.Add(this.buttonMpvSettings); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.richTextBoxMessage); - this.Controls.Add(this.groupBox1); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(700, 350); - this.Name = "VideoError"; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Error playing video file - "; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.VideoError_KeyDown); - this.groupBox1.ResumeLayout(false); - this.groupBox1.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.GroupBox groupBox1; - private System.Windows.Forms.TextBox textBoxError; - private System.Windows.Forms.RichTextBox richTextBoxMessage; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonMpvSettings; - private System.Windows.Forms.Label labelMpvInfo; - } +namespace Nikse.SubtitleEdit.Forms +{ + partial class VideoError + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.textBoxError = new System.Windows.Forms.TextBox(); + this.richTextBoxMessage = new System.Windows.Forms.RichTextBox(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonMpvSettings = new System.Windows.Forms.Button(); + this.labelMpvInfo = new System.Windows.Forms.Label(); + this.groupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox1 + // + this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBox1.Controls.Add(this.textBoxError); + this.groupBox1.Location = new System.Drawing.Point(12, 180); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(674, 142); + this.groupBox1.TabIndex = 0; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Error message"; + // + // textBoxError + // + this.textBoxError.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxError.Location = new System.Drawing.Point(7, 20); + this.textBoxError.Multiline = true; + this.textBoxError.Name = "textBoxError"; + this.textBoxError.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.textBoxError.Size = new System.Drawing.Size(661, 116); + this.textBoxError.TabIndex = 0; + // + // richTextBoxMessage + // + this.richTextBoxMessage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.richTextBoxMessage.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.richTextBoxMessage.Location = new System.Drawing.Point(13, 23); + this.richTextBoxMessage.Name = "richTextBoxMessage"; + this.richTextBoxMessage.ReadOnly = true; + this.richTextBoxMessage.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical; + this.richTextBoxMessage.Size = new System.Drawing.Size(674, 87); + this.richTextBoxMessage.TabIndex = 1; + this.richTextBoxMessage.Text = ""; + this.richTextBoxMessage.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.richTextBoxMessage_LinkClicked); + // + // buttonCancel + // + this.buttonCancel.Anchor = System.Windows.Forms.AnchorStyles.Bottom; + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(612, 328); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 11; + this.buttonCancel.Text = "&OK"; + this.buttonCancel.UseVisualStyleBackColor = true; + // + // buttonMpvSettings + // + this.buttonMpvSettings.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.buttonMpvSettings.Location = new System.Drawing.Point(20, 134); + this.buttonMpvSettings.Name = "buttonMpvSettings"; + this.buttonMpvSettings.Size = new System.Drawing.Size(272, 23); + this.buttonMpvSettings.TabIndex = 30; + this.buttonMpvSettings.Text = "Download and use \"mpv\" as video player"; + this.buttonMpvSettings.UseVisualStyleBackColor = true; + this.buttonMpvSettings.Click += new System.EventHandler(this.buttonMpvSettings_Click); + // + // labelMpvInfo + // + this.labelMpvInfo.AutoSize = true; + this.labelMpvInfo.Location = new System.Drawing.Point(17, 118); + this.labelMpvInfo.Name = "labelMpvInfo"; + this.labelMpvInfo.Size = new System.Drawing.Size(69, 13); + this.labelMpvInfo.TabIndex = 31; + this.labelMpvInfo.Text = "labelMpvInfo"; + // + // VideoError + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(699, 361); + this.Controls.Add(this.labelMpvInfo); + this.Controls.Add(this.buttonMpvSettings); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.richTextBoxMessage); + this.Controls.Add(this.groupBox1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(700, 350); + this.Name = "VideoError"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Error playing video file - "; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.VideoError_KeyDown); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TextBox textBoxError; + private System.Windows.Forms.RichTextBox richTextBoxMessage; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonMpvSettings; + private System.Windows.Forms.Label labelMpvInfo; + } } \ No newline at end of file diff --git a/src/Forms/VideoError.cs b/src/ui/Forms/VideoError.cs similarity index 97% rename from src/Forms/VideoError.cs rename to src/ui/Forms/VideoError.cs index 3ef6b125c..072f947c9 100644 --- a/src/Forms/VideoError.cs +++ b/src/ui/Forms/VideoError.cs @@ -1,126 +1,126 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using Nikse.SubtitleEdit.Logic.VideoPlayers; -using System; -using System.Text; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public partial class VideoError : Form - { - public VideoError() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - UiUtil.FixLargeFonts(this, buttonCancel); - } - - public void Initialize(string fileName, Exception exception) - { - var sb = new StringBuilder(); - sb.AppendLine("There seems to be missing a codec (or file is not a valid video/audio file)!"); - sb.AppendLine(); - - var currentVideoPlayer = Configuration.Settings.General.VideoPlayer; - - var isLibMpvInstalled = LibMpvDynamic.IsInstalled; - if (currentVideoPlayer == "MPV" && !isLibMpvInstalled) - { - currentVideoPlayer = "DirectShow"; - } - - if (currentVideoPlayer == "VLC" && !LibVlcDynamic.IsInstalled) - { - currentVideoPlayer = "DirectShow"; - } - - if (Configuration.IsRunningOnLinux) - { - sb.AppendLine("Try installing latest version of libmpv and libvlc!"); - sb.Append("Read more about Subtitle Edit on Linux here: https://nikse.dk/SubtitleEdit/Help#linux"); - } - else if (currentVideoPlayer == "DirectShow") - { - sb.AppendLine("Try installing/updating \"LAV Filters - DirectShow Media Splitter and Decoders\": https://github.com/Nevcairiel/LAVFilters/releases"); - sb.Append("Note that Subtitle Edit is a " + IntPtr.Size * 8 + "-bit program, and hence requires " + IntPtr.Size * 8 + "-bit codecs!"); - sb.AppendLine(); - } - else if (currentVideoPlayer == "VLC") - { - sb.AppendLine("VLC media player was unable to play this file (perhaps it's not a valid video/audio file) - you can change video player via Options -> Settings -> Video Player"); - sb.AppendLine("Latest version of VLC is available here: http://www.videolan.org/vlc/ (get the " + IntPtr.Size * 8 + "-bit version!)"); - sb.AppendLine(); - } - else if (currentVideoPlayer == "MPV" && Configuration.IsRunningOnWindows) - { - sb.AppendLine("You can re-download mpv or change video player via Options -> Settings -> Video Player"); - sb.AppendLine(); - } - richTextBoxMessage.Text = sb.ToString(); - - if (!Configuration.IsRunningOnWindows || currentVideoPlayer == "MPV") - { - buttonMpvSettings.Visible = false; - labelMpvInfo.Visible = false; - } - else if (currentVideoPlayer != "MPV") - { - labelMpvInfo.Text = $"You could also switch video player from \"{currentVideoPlayer}\" to \"mpv\"."; - if (isLibMpvInstalled) - { - buttonMpvSettings.Text = "Use \"mpv\" as video player"; - } - } - - if (exception != null) - { - var source = string.Empty; - if (!string.IsNullOrEmpty(exception.Source)) - { - source = "Source: " + exception.Source.Trim() + Environment.NewLine + Environment.NewLine; - } - - textBoxError.Text = "Message: " + exception.Message.Trim() + Environment.NewLine + - source + - "Stack Trace: " + Environment.NewLine + - exception.StackTrace.Trim(); - } - Text += fileName; - } - - private void VideoError_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - - private void richTextBoxMessage_LinkClicked(object sender, LinkClickedEventArgs e) - { - UiUtil.OpenURL(e.LinkText); - } - - private void buttonMpvSettings_Click(object sender, EventArgs e) - { - if (LibMpvDynamic.IsInstalled) - { - Configuration.Settings.General.VideoPlayer = "MPV"; - DialogResult = DialogResult.OK; - return; - } - - using (var form = new SettingsMpv(true)) - { - if (form.ShowDialog(this) == DialogResult.OK) - { - Configuration.Settings.General.VideoPlayer = "MPV"; - DialogResult = DialogResult.OK; - } - } - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using Nikse.SubtitleEdit.Logic.VideoPlayers; +using System; +using System.Text; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public partial class VideoError : Form + { + public VideoError() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + UiUtil.FixLargeFonts(this, buttonCancel); + } + + public void Initialize(string fileName, Exception exception) + { + var sb = new StringBuilder(); + sb.AppendLine("There seems to be missing a codec (or file is not a valid video/audio file)!"); + sb.AppendLine(); + + var currentVideoPlayer = Configuration.Settings.General.VideoPlayer; + + var isLibMpvInstalled = LibMpvDynamic.IsInstalled; + if (currentVideoPlayer == "MPV" && !isLibMpvInstalled) + { + currentVideoPlayer = "DirectShow"; + } + + if (currentVideoPlayer == "VLC" && !LibVlcDynamic.IsInstalled) + { + currentVideoPlayer = "DirectShow"; + } + + if (Configuration.IsRunningOnLinux) + { + sb.AppendLine("Try installing latest version of libmpv and libvlc!"); + sb.Append("Read more about Subtitle Edit on Linux here: https://nikse.dk/SubtitleEdit/Help#linux"); + } + else if (currentVideoPlayer == "DirectShow") + { + sb.AppendLine("Try installing/updating \"LAV Filters - DirectShow Media Splitter and Decoders\": https://github.com/Nevcairiel/LAVFilters/releases"); + sb.Append("Note that Subtitle Edit is a " + IntPtr.Size * 8 + "-bit program, and hence requires " + IntPtr.Size * 8 + "-bit codecs!"); + sb.AppendLine(); + } + else if (currentVideoPlayer == "VLC") + { + sb.AppendLine("VLC media player was unable to play this file (perhaps it's not a valid video/audio file) - you can change video player via Options -> Settings -> Video Player"); + sb.AppendLine("Latest version of VLC is available here: http://www.videolan.org/vlc/ (get the " + IntPtr.Size * 8 + "-bit version!)"); + sb.AppendLine(); + } + else if (currentVideoPlayer == "MPV" && Configuration.IsRunningOnWindows) + { + sb.AppendLine("You can re-download mpv or change video player via Options -> Settings -> Video Player"); + sb.AppendLine(); + } + richTextBoxMessage.Text = sb.ToString(); + + if (!Configuration.IsRunningOnWindows || currentVideoPlayer == "MPV") + { + buttonMpvSettings.Visible = false; + labelMpvInfo.Visible = false; + } + else if (currentVideoPlayer != "MPV") + { + labelMpvInfo.Text = $"You could also switch video player from \"{currentVideoPlayer}\" to \"mpv\"."; + if (isLibMpvInstalled) + { + buttonMpvSettings.Text = "Use \"mpv\" as video player"; + } + } + + if (exception != null) + { + var source = string.Empty; + if (!string.IsNullOrEmpty(exception.Source)) + { + source = "Source: " + exception.Source.Trim() + Environment.NewLine + Environment.NewLine; + } + + textBoxError.Text = "Message: " + exception.Message.Trim() + Environment.NewLine + + source + + "Stack Trace: " + Environment.NewLine + + exception.StackTrace.Trim(); + } + Text += fileName; + } + + private void VideoError_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + + private void richTextBoxMessage_LinkClicked(object sender, LinkClickedEventArgs e) + { + UiUtil.OpenURL(e.LinkText); + } + + private void buttonMpvSettings_Click(object sender, EventArgs e) + { + if (LibMpvDynamic.IsInstalled) + { + Configuration.Settings.General.VideoPlayer = "MPV"; + DialogResult = DialogResult.OK; + return; + } + + using (var form = new SettingsMpv(true)) + { + if (form.ShowDialog(this) == DialogResult.OK) + { + Configuration.Settings.General.VideoPlayer = "MPV"; + DialogResult = DialogResult.OK; + } + } + } + } +} diff --git a/src/Forms/VideoError.resx b/src/ui/Forms/VideoError.resx similarity index 97% rename from src/Forms/VideoError.resx rename to src/ui/Forms/VideoError.resx index c7e0d4bdf..d58980a38 100644 --- a/src/Forms/VideoError.resx +++ b/src/ui/Forms/VideoError.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Forms/VideoPlayerUndocked.Designer.cs b/src/ui/Forms/VideoPlayerUndocked.Designer.cs similarity index 97% rename from src/Forms/VideoPlayerUndocked.Designer.cs rename to src/ui/Forms/VideoPlayerUndocked.Designer.cs index d38cd8473..7cbafb3af 100644 --- a/src/Forms/VideoPlayerUndocked.Designer.cs +++ b/src/ui/Forms/VideoPlayerUndocked.Designer.cs @@ -1,74 +1,74 @@ -namespace Nikse.SubtitleEdit.Forms -{ - partial class VideoPlayerUndocked - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.panelContainer = new System.Windows.Forms.Panel(); - this.timer1 = new System.Windows.Forms.Timer(this.components); - this.SuspendLayout(); - // - // panelContainer - // - this.panelContainer.BackColor = System.Drawing.Color.Black; - this.panelContainer.Dock = System.Windows.Forms.DockStyle.Fill; - this.panelContainer.Location = new System.Drawing.Point(0, 0); - this.panelContainer.Margin = new System.Windows.Forms.Padding(0); - this.panelContainer.Name = "panelContainer"; - this.panelContainer.Size = new System.Drawing.Size(614, 323); - this.panelContainer.TabIndex = 0; - // - // timer1 - // - this.timer1.Interval = 3000; - this.timer1.Tick += new System.EventHandler(this.timer1_Tick); - // - // VideoPlayerUndocked - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(614, 323); - this.Controls.Add(this.panelContainer); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow; - this.KeyPreview = true; - this.Name = "VideoPlayerUndocked"; - this.Text = "VideoPlayerUndocked"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.VideoPlayerUndocked_FormClosing); - this.Shown += new System.EventHandler(this.VideoPlayerUndocked_Shown); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.VideoPlayerUndocked_KeyDown); - this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.VideoPlayerUndocked_MouseMove); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Panel panelContainer; - private System.Windows.Forms.Timer timer1; - } +namespace Nikse.SubtitleEdit.Forms +{ + partial class VideoPlayerUndocked + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.panelContainer = new System.Windows.Forms.Panel(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.SuspendLayout(); + // + // panelContainer + // + this.panelContainer.BackColor = System.Drawing.Color.Black; + this.panelContainer.Dock = System.Windows.Forms.DockStyle.Fill; + this.panelContainer.Location = new System.Drawing.Point(0, 0); + this.panelContainer.Margin = new System.Windows.Forms.Padding(0); + this.panelContainer.Name = "panelContainer"; + this.panelContainer.Size = new System.Drawing.Size(614, 323); + this.panelContainer.TabIndex = 0; + // + // timer1 + // + this.timer1.Interval = 3000; + this.timer1.Tick += new System.EventHandler(this.timer1_Tick); + // + // VideoPlayerUndocked + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(614, 323); + this.Controls.Add(this.panelContainer); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow; + this.KeyPreview = true; + this.Name = "VideoPlayerUndocked"; + this.Text = "VideoPlayerUndocked"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.VideoPlayerUndocked_FormClosing); + this.Shown += new System.EventHandler(this.VideoPlayerUndocked_Shown); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.VideoPlayerUndocked_KeyDown); + this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.VideoPlayerUndocked_MouseMove); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel panelContainer; + private System.Windows.Forms.Timer timer1; + } } \ No newline at end of file diff --git a/src/Forms/VideoPlayerUndocked.cs b/src/ui/Forms/VideoPlayerUndocked.cs similarity index 97% rename from src/Forms/VideoPlayerUndocked.cs rename to src/ui/Forms/VideoPlayerUndocked.cs index 23713e3ce..db096923b 100644 --- a/src/Forms/VideoPlayerUndocked.cs +++ b/src/ui/Forms/VideoPlayerUndocked.cs @@ -1,173 +1,173 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Drawing; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public partial class VideoPlayerUndocked : PositionAndSizeForm - { - private readonly Main _mainForm; - private readonly Controls.VideoPlayerContainer _videoPlayerContainer; - private readonly Keys _redockKeys; - - public bool RedockOnFullscreenEnd { get; set; } - - public Panel PanelContainer => panelContainer; - - public VideoPlayerUndocked(Main main, Controls.VideoPlayerContainer videoPlayerContainer) - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - _mainForm = main; - Icon = (Icon)_mainForm.Icon.Clone(); - _videoPlayerContainer = videoPlayerContainer; - _redockKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainVideoToggleVideoControls); - RedockOnFullscreenEnd = false; - videoPlayerContainer.TextBox.MouseMove += VideoPlayerUndocked_MouseMove; - } - - public VideoPlayerUndocked() - { - } - - private void VideoPlayerUndocked_FormClosing(object sender, FormClosingEventArgs e) - { - _videoPlayerContainer.ShowCursor(); - if (RedockOnFullscreenEnd) - { - _mainForm.RedockVideoControlsToolStripMenuItemClick(null, null); - } - else if (e.CloseReason == CloseReason.UserClosing && panelContainer.Controls.Count > 0) - { - var control = panelContainer.Controls[0]; - if (control is Panel) - { - panelContainer.Controls.Clear(); - _mainForm.ReDockVideoPlayer(control); - _mainForm.SetVideoPlayerToggleOff(); - } - } - } - - private void VideoPlayerUndocked_KeyDown(object sender, KeyEventArgs e) - { - VideoPlayerUndocked_MouseMove(null, null); - - if (e.Modifiers == Keys.None && e.KeyCode == Keys.Space) - { - _videoPlayerContainer.TogglePlayPause(); - e.SuppressKeyPress = true; - } - else if (e.Modifiers == Keys.Alt && e.KeyCode == Keys.Enter) - { - if (IsFullscreen) - { - e.SuppressKeyPress = true; - NoFullscreen(); - } - else if (WindowState == FormWindowState.Normal) - { - GoFullscreen(); - } - e.SuppressKeyPress = true; - } - else if (e.Modifiers == Keys.None && e.KeyCode == Keys.Escape && IsFullscreen) - { - e.SuppressKeyPress = true; - NoFullscreen(); - } - else if (e.Modifiers == Keys.Alt && e.KeyCode == Keys.A) - { - if (_videoPlayerContainer.VideoWidth > 0 && _videoPlayerContainer.VideoHeight > 0) - { - int wDiff = _videoPlayerContainer.VideoWidth - _videoPlayerContainer.PanelPlayer.Width; - int hDiff = _videoPlayerContainer.VideoHeight - _videoPlayerContainer.PanelPlayer.Height; - Width += wDiff; - Height += hDiff; - e.SuppressKeyPress = true; - } - } - else if (e.KeyCode == Keys.Up && e.Modifiers == Keys.Alt && IsFullscreen) - { - _mainForm.GotoPrevSubPosFromvideoPos(); - e.SuppressKeyPress = true; - } - else if (e.Modifiers == Keys.Alt && e.KeyCode == Keys.Down && IsFullscreen) - { - _mainForm.GotoNextSubPosFromVideoPos(); - e.SuppressKeyPress = true; - } - else if (_redockKeys == e.KeyData) - { - _mainForm.RedockVideoControlsToolStripMenuItemClick(null, null); - e.SuppressKeyPress = true; - } - else - { - _mainForm.MainKeyDown(sender, e); - } - } - - private void VideoPlayerUndocked_MouseMove(object sender, MouseEventArgs e) - { - if (timer1.Enabled) - { - timer1.Stop(); - } - - _videoPlayerContainer.ShowControls(); - timer1.Start(); - } - - private void timer1_Tick(object sender, EventArgs e) - { - timer1.Stop(); - if (IsFullscreen) - { - var videoScreen = Screen.FromControl(_videoPlayerContainer); - var mainScreen = Screen.FromControl(_mainForm); - _videoPlayerContainer.HideControls(videoScreen.DeviceName == mainScreen.DeviceName); - } - } - - internal void GoFullscreen() - { - IsFullscreen = true; - FormBorderStyle = FormBorderStyle.None; - WindowState = FormWindowState.Maximized; - _videoPlayerContainer.FontSizeFactor = 1.5F; - _videoPlayerContainer.SetSubtitleFont(); - _videoPlayerContainer.SubtitleText = string.Empty; - _videoPlayerContainer.ShowFullScreenControls(); - timer1.Start(); - } - - internal bool IsFullscreen { get; set; } - - internal void NoFullscreen() - { - IsFullscreen = false; - FormBorderStyle = FormBorderStyle.SizableToolWindow; - WindowState = FormWindowState.Normal; - _videoPlayerContainer.FontSizeFactor = 1.0F; - _videoPlayerContainer.SetSubtitleFont(); - _videoPlayerContainer.SubtitleText = string.Empty; - _videoPlayerContainer.ShowFullscreenButton = Configuration.Settings.General.VideoPlayerShowFullscreenButton; - _videoPlayerContainer.ShowNonFullScreenControls(); - if (RedockOnFullscreenEnd) - { - Close(); - } - } - - private void VideoPlayerUndocked_Shown(object sender, EventArgs e) - { - Refresh(); - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Drawing; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public partial class VideoPlayerUndocked : PositionAndSizeForm + { + private readonly Main _mainForm; + private readonly Controls.VideoPlayerContainer _videoPlayerContainer; + private readonly Keys _redockKeys; + + public bool RedockOnFullscreenEnd { get; set; } + + public Panel PanelContainer => panelContainer; + + public VideoPlayerUndocked(Main main, Controls.VideoPlayerContainer videoPlayerContainer) + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + _mainForm = main; + Icon = (Icon)_mainForm.Icon.Clone(); + _videoPlayerContainer = videoPlayerContainer; + _redockKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainVideoToggleVideoControls); + RedockOnFullscreenEnd = false; + videoPlayerContainer.TextBox.MouseMove += VideoPlayerUndocked_MouseMove; + } + + public VideoPlayerUndocked() + { + } + + private void VideoPlayerUndocked_FormClosing(object sender, FormClosingEventArgs e) + { + _videoPlayerContainer.ShowCursor(); + if (RedockOnFullscreenEnd) + { + _mainForm.RedockVideoControlsToolStripMenuItemClick(null, null); + } + else if (e.CloseReason == CloseReason.UserClosing && panelContainer.Controls.Count > 0) + { + var control = panelContainer.Controls[0]; + if (control is Panel) + { + panelContainer.Controls.Clear(); + _mainForm.ReDockVideoPlayer(control); + _mainForm.SetVideoPlayerToggleOff(); + } + } + } + + private void VideoPlayerUndocked_KeyDown(object sender, KeyEventArgs e) + { + VideoPlayerUndocked_MouseMove(null, null); + + if (e.Modifiers == Keys.None && e.KeyCode == Keys.Space) + { + _videoPlayerContainer.TogglePlayPause(); + e.SuppressKeyPress = true; + } + else if (e.Modifiers == Keys.Alt && e.KeyCode == Keys.Enter) + { + if (IsFullscreen) + { + e.SuppressKeyPress = true; + NoFullscreen(); + } + else if (WindowState == FormWindowState.Normal) + { + GoFullscreen(); + } + e.SuppressKeyPress = true; + } + else if (e.Modifiers == Keys.None && e.KeyCode == Keys.Escape && IsFullscreen) + { + e.SuppressKeyPress = true; + NoFullscreen(); + } + else if (e.Modifiers == Keys.Alt && e.KeyCode == Keys.A) + { + if (_videoPlayerContainer.VideoWidth > 0 && _videoPlayerContainer.VideoHeight > 0) + { + int wDiff = _videoPlayerContainer.VideoWidth - _videoPlayerContainer.PanelPlayer.Width; + int hDiff = _videoPlayerContainer.VideoHeight - _videoPlayerContainer.PanelPlayer.Height; + Width += wDiff; + Height += hDiff; + e.SuppressKeyPress = true; + } + } + else if (e.KeyCode == Keys.Up && e.Modifiers == Keys.Alt && IsFullscreen) + { + _mainForm.GotoPrevSubPosFromvideoPos(); + e.SuppressKeyPress = true; + } + else if (e.Modifiers == Keys.Alt && e.KeyCode == Keys.Down && IsFullscreen) + { + _mainForm.GotoNextSubPosFromVideoPos(); + e.SuppressKeyPress = true; + } + else if (_redockKeys == e.KeyData) + { + _mainForm.RedockVideoControlsToolStripMenuItemClick(null, null); + e.SuppressKeyPress = true; + } + else + { + _mainForm.MainKeyDown(sender, e); + } + } + + private void VideoPlayerUndocked_MouseMove(object sender, MouseEventArgs e) + { + if (timer1.Enabled) + { + timer1.Stop(); + } + + _videoPlayerContainer.ShowControls(); + timer1.Start(); + } + + private void timer1_Tick(object sender, EventArgs e) + { + timer1.Stop(); + if (IsFullscreen) + { + var videoScreen = Screen.FromControl(_videoPlayerContainer); + var mainScreen = Screen.FromControl(_mainForm); + _videoPlayerContainer.HideControls(videoScreen.DeviceName == mainScreen.DeviceName); + } + } + + internal void GoFullscreen() + { + IsFullscreen = true; + FormBorderStyle = FormBorderStyle.None; + WindowState = FormWindowState.Maximized; + _videoPlayerContainer.FontSizeFactor = 1.5F; + _videoPlayerContainer.SetSubtitleFont(); + _videoPlayerContainer.SubtitleText = string.Empty; + _videoPlayerContainer.ShowFullScreenControls(); + timer1.Start(); + } + + internal bool IsFullscreen { get; set; } + + internal void NoFullscreen() + { + IsFullscreen = false; + FormBorderStyle = FormBorderStyle.SizableToolWindow; + WindowState = FormWindowState.Normal; + _videoPlayerContainer.FontSizeFactor = 1.0F; + _videoPlayerContainer.SetSubtitleFont(); + _videoPlayerContainer.SubtitleText = string.Empty; + _videoPlayerContainer.ShowFullscreenButton = Configuration.Settings.General.VideoPlayerShowFullscreenButton; + _videoPlayerContainer.ShowNonFullScreenControls(); + if (RedockOnFullscreenEnd) + { + Close(); + } + } + + private void VideoPlayerUndocked_Shown(object sender, EventArgs e) + { + Refresh(); + } + + } +} diff --git a/src/Forms/VideoPlayerUndocked.resx b/src/ui/Forms/VideoPlayerUndocked.resx similarity index 97% rename from src/Forms/VideoPlayerUndocked.resx rename to src/ui/Forms/VideoPlayerUndocked.resx index aac33d5a2..1f666f268 100644 --- a/src/Forms/VideoPlayerUndocked.resx +++ b/src/ui/Forms/VideoPlayerUndocked.resx @@ -1,123 +1,123 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + \ No newline at end of file diff --git a/src/Forms/VisualSync.Designer.cs b/src/ui/Forms/VisualSync.Designer.cs similarity index 98% rename from src/Forms/VisualSync.Designer.cs rename to src/ui/Forms/VisualSync.Designer.cs index 7863520c1..d89e77db4 100644 --- a/src/Forms/VisualSync.Designer.cs +++ b/src/ui/Forms/VisualSync.Designer.cs @@ -1,457 +1,457 @@ -using Nikse.SubtitleEdit.Logic; -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class VisualSync - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.buttonOpenMovie = new System.Windows.Forms.Button(); - this.timer1 = new System.Windows.Forms.Timer(this.components); - this.buttonOK = new System.Windows.Forms.Button(); - this.groupBoxStartScene = new System.Windows.Forms.GroupBox(); - this.MediaPlayerStart = new Nikse.SubtitleEdit.Controls.VideoPlayerContainer(); - this.panelControlsStart = new System.Windows.Forms.Panel(); - this.buttonStartVerify = new System.Windows.Forms.Button(); - this.buttonGotoStartSubtitlePosition = new System.Windows.Forms.Button(); - this.buttonFindTextStart = new System.Windows.Forms.Button(); - this.buttonStartThreeSecondsBack = new System.Windows.Forms.Button(); - this.buttonStartHalfASecondBack = new System.Windows.Forms.Button(); - this.comboBoxStartTexts = new System.Windows.Forms.ComboBox(); - this.groupBoxEndScene = new System.Windows.Forms.GroupBox(); - this.MediaPlayerEnd = new Nikse.SubtitleEdit.Controls.VideoPlayerContainer(); - this.panelControlsEnd = new System.Windows.Forms.Panel(); - this.buttonEndVerify = new System.Windows.Forms.Button(); - this.buttonGotoEndSubtitlePosition = new System.Windows.Forms.Button(); - this.buttonFindTextEnd = new System.Windows.Forms.Button(); - this.buttonThreeSecondsBack = new System.Windows.Forms.Button(); - this.buttonEndHalfASecondBack = new System.Windows.Forms.Button(); - this.comboBoxEndTexts = new System.Windows.Forms.ComboBox(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.labelVideoInfo = new System.Windows.Forms.Label(); - this.groupBoxMovieInfo = new System.Windows.Forms.GroupBox(); - this.buttonSync = new System.Windows.Forms.Button(); - this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); - this.labelTip = new System.Windows.Forms.Label(); - this.timerProgressBarRefresh = new System.Windows.Forms.Timer(this.components); - this.labelSyncDone = new System.Windows.Forms.Label(); - this.groupBoxStartScene.SuspendLayout(); - this.panelControlsStart.SuspendLayout(); - this.groupBoxEndScene.SuspendLayout(); - this.panelControlsEnd.SuspendLayout(); - this.groupBoxMovieInfo.SuspendLayout(); - this.SuspendLayout(); - // - // buttonOpenMovie - // - this.buttonOpenMovie.Location = new System.Drawing.Point(12, 12); - this.buttonOpenMovie.Name = "buttonOpenMovie"; - this.buttonOpenMovie.Size = new System.Drawing.Size(100, 23); - this.buttonOpenMovie.TabIndex = 5; - this.buttonOpenMovie.Text = "Open movie..."; - this.buttonOpenMovie.UseVisualStyleBackColor = true; - this.buttonOpenMovie.Click += new System.EventHandler(this.ButtonOpenMovieClick); - // - // timer1 - // - this.timer1.Interval = 50; - this.timer1.Tick += new System.EventHandler(this.Timer1Tick); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; - this.buttonOK.Location = new System.Drawing.Point(754, 490); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 3; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // groupBoxStartScene - // - this.groupBoxStartScene.Controls.Add(this.MediaPlayerStart); - this.groupBoxStartScene.Controls.Add(this.panelControlsStart); - this.groupBoxStartScene.Location = new System.Drawing.Point(12, 65); - this.groupBoxStartScene.Name = "groupBoxStartScene"; - this.groupBoxStartScene.Size = new System.Drawing.Size(450, 399); - this.groupBoxStartScene.TabIndex = 0; - this.groupBoxStartScene.TabStop = false; - this.groupBoxStartScene.Text = "Start scene"; - this.groupBoxStartScene.Enter += new System.EventHandler(this.GroupBoxStartSceneEnter); - // - // MediaPlayerStart - // - this.MediaPlayerStart.BackColor = System.Drawing.Color.Black; - this.MediaPlayerStart.CurrentPosition = 0D; - this.MediaPlayerStart.FontSizeFactor = 1F; - this.MediaPlayerStart.LastParagraph = null; - this.MediaPlayerStart.Location = new System.Drawing.Point(6, 34); - this.MediaPlayerStart.Name = "MediaPlayerStart"; - this.MediaPlayerStart.ShowFullscreenButton = true; - this.MediaPlayerStart.ShowMuteButton = true; - this.MediaPlayerStart.ShowStopButton = true; - this.MediaPlayerStart.Size = new System.Drawing.Size(450, 287); - this.MediaPlayerStart.SmpteMode = false; - this.MediaPlayerStart.SubtitleText = ""; - this.MediaPlayerStart.TabIndex = 13; - this.MediaPlayerStart.TextRightToLeft = System.Windows.Forms.RightToLeft.No; - this.MediaPlayerStart.VideoHeight = 0; - this.MediaPlayerStart.VideoPlayer = null; - this.MediaPlayerStart.VideoWidth = 0; - this.MediaPlayerStart.Volume = 0D; - this.MediaPlayerStart.OnButtonClicked += new System.EventHandler(this.MediaPlayerStart_OnButtonClicked); - // - // panelControlsStart - // - this.panelControlsStart.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.panelControlsStart.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.panelControlsStart.Controls.Add(this.buttonStartVerify); - this.panelControlsStart.Controls.Add(this.buttonGotoStartSubtitlePosition); - this.panelControlsStart.Controls.Add(this.buttonFindTextStart); - this.panelControlsStart.Controls.Add(this.buttonStartThreeSecondsBack); - this.panelControlsStart.Controls.Add(this.buttonStartHalfASecondBack); - this.panelControlsStart.Controls.Add(this.comboBoxStartTexts); - this.panelControlsStart.Location = new System.Drawing.Point(6, 327); - this.panelControlsStart.Name = "panelControlsStart"; - this.panelControlsStart.Size = new System.Drawing.Size(438, 68); - this.panelControlsStart.TabIndex = 1; - // - // buttonStartVerify - // - this.buttonStartVerify.Location = new System.Drawing.Point(138, 37); - this.buttonStartVerify.Name = "buttonStartVerify"; - this.buttonStartVerify.Size = new System.Drawing.Size(119, 23); - this.buttonStartVerify.TabIndex = 3; - this.buttonStartVerify.Text = "Play 2 s and back"; - this.buttonStartVerify.UseVisualStyleBackColor = true; - this.buttonStartVerify.Click += new System.EventHandler(this.ButtonStartVerifyClick); - // - // buttonGotoStartSubtitlePosition - // - this.buttonGotoStartSubtitlePosition.Location = new System.Drawing.Point(263, 37); - this.buttonGotoStartSubtitlePosition.Name = "buttonGotoStartSubtitlePosition"; - this.buttonGotoStartSubtitlePosition.Size = new System.Drawing.Size(90, 23); - this.buttonGotoStartSubtitlePosition.TabIndex = 4; - this.buttonGotoStartSubtitlePosition.Text = "Goto sub Position"; - this.buttonGotoStartSubtitlePosition.UseVisualStyleBackColor = true; - this.buttonGotoStartSubtitlePosition.Click += new System.EventHandler(this.ButtonGotoStartSubtitlePositionClick); - // - // buttonFindTextStart - // - this.buttonFindTextStart.Location = new System.Drawing.Point(359, 37); - this.buttonFindTextStart.Name = "buttonFindTextStart"; - this.buttonFindTextStart.Size = new System.Drawing.Size(70, 23); - this.buttonFindTextStart.TabIndex = 5; - this.buttonFindTextStart.Text = "Find text..."; - this.buttonFindTextStart.UseVisualStyleBackColor = true; - this.buttonFindTextStart.Click += new System.EventHandler(this.ButtonFindTextStartClick); - // - // buttonStartThreeSecondsBack - // - this.buttonStartThreeSecondsBack.Location = new System.Drawing.Point(6, 37); - this.buttonStartThreeSecondsBack.Name = "buttonStartThreeSecondsBack"; - this.buttonStartThreeSecondsBack.Size = new System.Drawing.Size(60, 23); - this.buttonStartThreeSecondsBack.TabIndex = 1; - this.buttonStartThreeSecondsBack.Text = "< 3 s"; - this.buttonStartThreeSecondsBack.UseVisualStyleBackColor = true; - this.buttonStartThreeSecondsBack.Click += new System.EventHandler(this.ButtonStartThreeSecondsBackClick); - // - // buttonStartHalfASecondBack - // - this.buttonStartHalfASecondBack.Location = new System.Drawing.Point(72, 37); - this.buttonStartHalfASecondBack.Name = "buttonStartHalfASecondBack"; - this.buttonStartHalfASecondBack.Size = new System.Drawing.Size(60, 23); - this.buttonStartHalfASecondBack.TabIndex = 2; - this.buttonStartHalfASecondBack.Text = "< ½ s"; - this.buttonStartHalfASecondBack.UseVisualStyleBackColor = true; - this.buttonStartHalfASecondBack.Click += new System.EventHandler(this.ButtonStartHalfASecondBackClick); - // - // comboBoxStartTexts - // - this.comboBoxStartTexts.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxStartTexts.FormattingEnabled = true; - this.comboBoxStartTexts.Location = new System.Drawing.Point(7, 10); - this.comboBoxStartTexts.Name = "comboBoxStartTexts"; - this.comboBoxStartTexts.Size = new System.Drawing.Size(422, 21); - this.comboBoxStartTexts.TabIndex = 0; - // - // groupBoxEndScene - // - this.groupBoxEndScene.Controls.Add(this.MediaPlayerEnd); - this.groupBoxEndScene.Controls.Add(this.panelControlsEnd); - this.groupBoxEndScene.Location = new System.Drawing.Point(468, 65); - this.groupBoxEndScene.Name = "groupBoxEndScene"; - this.groupBoxEndScene.Size = new System.Drawing.Size(450, 399); - this.groupBoxEndScene.TabIndex = 1; - this.groupBoxEndScene.TabStop = false; - this.groupBoxEndScene.Text = "End scene"; - this.groupBoxEndScene.Enter += new System.EventHandler(this.GroupBoxEndSceneEnter); - // - // MediaPlayerEnd - // - this.MediaPlayerEnd.BackColor = System.Drawing.Color.Black; - this.MediaPlayerEnd.CurrentPosition = 0D; - this.MediaPlayerEnd.FontSizeFactor = 1F; - this.MediaPlayerEnd.LastParagraph = null; - this.MediaPlayerEnd.Location = new System.Drawing.Point(6, 34); - this.MediaPlayerEnd.Name = "MediaPlayerEnd"; - this.MediaPlayerEnd.ShowFullscreenButton = true; - this.MediaPlayerEnd.ShowMuteButton = true; - this.MediaPlayerEnd.ShowStopButton = true; - this.MediaPlayerEnd.Size = new System.Drawing.Size(438, 287); - this.MediaPlayerEnd.SmpteMode = false; - this.MediaPlayerEnd.SubtitleText = ""; - this.MediaPlayerEnd.TabIndex = 14; - this.MediaPlayerEnd.TextRightToLeft = System.Windows.Forms.RightToLeft.No; - this.MediaPlayerEnd.VideoHeight = 0; - this.MediaPlayerEnd.VideoPlayer = null; - this.MediaPlayerEnd.VideoWidth = 0; - this.MediaPlayerEnd.Volume = 0D; - this.MediaPlayerEnd.OnButtonClicked += new System.EventHandler(this.MediaPlayerEnd_OnButtonClicked); - // - // panelControlsEnd - // - this.panelControlsEnd.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.panelControlsEnd.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.panelControlsEnd.Controls.Add(this.buttonEndVerify); - this.panelControlsEnd.Controls.Add(this.buttonGotoEndSubtitlePosition); - this.panelControlsEnd.Controls.Add(this.buttonFindTextEnd); - this.panelControlsEnd.Controls.Add(this.buttonThreeSecondsBack); - this.panelControlsEnd.Controls.Add(this.buttonEndHalfASecondBack); - this.panelControlsEnd.Controls.Add(this.comboBoxEndTexts); - this.panelControlsEnd.Location = new System.Drawing.Point(7, 327); - this.panelControlsEnd.Name = "panelControlsEnd"; - this.panelControlsEnd.Size = new System.Drawing.Size(438, 68); - this.panelControlsEnd.TabIndex = 1; - // - // buttonEndVerify - // - this.buttonEndVerify.Location = new System.Drawing.Point(139, 37); - this.buttonEndVerify.Name = "buttonEndVerify"; - this.buttonEndVerify.Size = new System.Drawing.Size(118, 23); - this.buttonEndVerify.TabIndex = 3; - this.buttonEndVerify.Text = "Play 2 s and back"; - this.buttonEndVerify.UseVisualStyleBackColor = true; - this.buttonEndVerify.Click += new System.EventHandler(this.ButtonEndVerifyClick); - // - // buttonGotoEndSubtitlePosition - // - this.buttonGotoEndSubtitlePosition.Location = new System.Drawing.Point(263, 37); - this.buttonGotoEndSubtitlePosition.Name = "buttonGotoEndSubtitlePosition"; - this.buttonGotoEndSubtitlePosition.Size = new System.Drawing.Size(90, 23); - this.buttonGotoEndSubtitlePosition.TabIndex = 4; - this.buttonGotoEndSubtitlePosition.Text = "Goto sub Position"; - this.buttonGotoEndSubtitlePosition.UseVisualStyleBackColor = true; - this.buttonGotoEndSubtitlePosition.Click += new System.EventHandler(this.ButtonGotoEndSubtitlePositionClick); - // - // buttonFindTextEnd - // - this.buttonFindTextEnd.Location = new System.Drawing.Point(359, 37); - this.buttonFindTextEnd.Name = "buttonFindTextEnd"; - this.buttonFindTextEnd.Size = new System.Drawing.Size(70, 23); - this.buttonFindTextEnd.TabIndex = 5; - this.buttonFindTextEnd.Text = "Find text..."; - this.buttonFindTextEnd.UseVisualStyleBackColor = true; - this.buttonFindTextEnd.Click += new System.EventHandler(this.ButtonFindTextEndClick); - // - // buttonThreeSecondsBack - // - this.buttonThreeSecondsBack.Location = new System.Drawing.Point(7, 37); - this.buttonThreeSecondsBack.Name = "buttonThreeSecondsBack"; - this.buttonThreeSecondsBack.Size = new System.Drawing.Size(60, 23); - this.buttonThreeSecondsBack.TabIndex = 1; - this.buttonThreeSecondsBack.Text = "< 3 s"; - this.buttonThreeSecondsBack.UseVisualStyleBackColor = true; - this.buttonThreeSecondsBack.Click += new System.EventHandler(this.ButtonThreeSecondsBackClick); - // - // buttonEndHalfASecondBack - // - this.buttonEndHalfASecondBack.Location = new System.Drawing.Point(73, 37); - this.buttonEndHalfASecondBack.Name = "buttonEndHalfASecondBack"; - this.buttonEndHalfASecondBack.Size = new System.Drawing.Size(60, 23); - this.buttonEndHalfASecondBack.TabIndex = 2; - this.buttonEndHalfASecondBack.Text = "< ½ s"; - this.buttonEndHalfASecondBack.UseVisualStyleBackColor = true; - this.buttonEndHalfASecondBack.Click += new System.EventHandler(this.ButtonEndHalfASecondBackClick); - // - // comboBoxEndTexts - // - this.comboBoxEndTexts.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxEndTexts.FormattingEnabled = true; - this.comboBoxEndTexts.Location = new System.Drawing.Point(7, 10); - this.comboBoxEndTexts.Name = "comboBoxEndTexts"; - this.comboBoxEndTexts.Size = new System.Drawing.Size(422, 21); - this.comboBoxEndTexts.TabIndex = 0; - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.Location = new System.Drawing.Point(835, 490); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 4; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - // - // labelVideoInfo - // - this.labelVideoInfo.AutoSize = true; - this.labelVideoInfo.Location = new System.Drawing.Point(6, 16); - this.labelVideoInfo.Name = "labelVideoInfo"; - this.labelVideoInfo.Size = new System.Drawing.Size(84, 13); - this.labelVideoInfo.TabIndex = 13; - this.labelVideoInfo.Text = "No video loaded"; - // - // groupBoxMovieInfo - // - this.groupBoxMovieInfo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxMovieInfo.Controls.Add(this.labelVideoInfo); - this.groupBoxMovieInfo.Location = new System.Drawing.Point(132, 8); - this.groupBoxMovieInfo.Name = "groupBoxMovieInfo"; - this.groupBoxMovieInfo.Size = new System.Drawing.Size(786, 53); - this.groupBoxMovieInfo.TabIndex = 14; - this.groupBoxMovieInfo.TabStop = false; - this.groupBoxMovieInfo.Text = "Movie info"; - // - // buttonSync - // - this.buttonSync.Anchor = System.Windows.Forms.AnchorStyles.Bottom; - this.buttonSync.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.buttonSync.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; - this.buttonSync.Location = new System.Drawing.Point(395, 488); - this.buttonSync.Name = "buttonSync"; - this.buttonSync.Size = new System.Drawing.Size(148, 31); - this.buttonSync.TabIndex = 2; - this.buttonSync.Text = "Sync!"; - this.buttonSync.UseVisualStyleBackColor = true; - this.buttonSync.Click += new System.EventHandler(this.ButtonSyncClick); - // - // openFileDialog1 - // - this.openFileDialog1.FileName = "openFileDialog1"; - // - // labelTip - // - this.labelTip.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.labelTip.AutoSize = true; - this.labelTip.ForeColor = System.Drawing.Color.Gray; - this.labelTip.Location = new System.Drawing.Point(12, 473); - this.labelTip.Name = "labelTip"; - this.labelTip.Size = new System.Drawing.Size(332, 13); - this.labelTip.TabIndex = 15; - this.labelTip.Text = "Tip: Use keys to move 100 ms back/forward"; - // - // timerProgressBarRefresh - // - this.timerProgressBarRefresh.Tick += new System.EventHandler(this.timerProgressBarRefresh_Tick); - // - // labelSyncDone - // - this.labelSyncDone.Anchor = System.Windows.Forms.AnchorStyles.Bottom; - this.labelSyncDone.AutoSize = true; - this.labelSyncDone.ForeColor = System.Drawing.Color.Gray; - this.labelSyncDone.Location = new System.Drawing.Point(546, 502); - this.labelSyncDone.Name = "labelSyncDone"; - this.labelSyncDone.Size = new System.Drawing.Size(77, 13); - this.labelSyncDone.TabIndex = 16; - this.labelSyncDone.Text = "labelSyncDone"; - // - // VisualSync - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(927, 525); - this.Controls.Add(this.labelSyncDone); - this.Controls.Add(this.buttonSync); - this.Controls.Add(this.labelTip); - this.Controls.Add(this.groupBoxMovieInfo); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.groupBoxEndScene); - this.Controls.Add(this.groupBoxStartScene); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.buttonOpenMovie); - this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.KeyPreview = true; - this.MinimumSize = new System.Drawing.Size(935, 540); - this.Name = "VisualSync"; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Visual Sync"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormVisualSync_FormClosing); - this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.VisualSync_FormClosed); - this.Load += new System.EventHandler(this.VisualSync_Load); - this.Shown += new System.EventHandler(this.VisualSync_Shown); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.VisualSync_KeyDown); - this.Resize += new System.EventHandler(this.FormVisualSync_Resize); - this.groupBoxStartScene.ResumeLayout(false); - this.panelControlsStart.ResumeLayout(false); - this.groupBoxEndScene.ResumeLayout(false); - this.panelControlsEnd.ResumeLayout(false); - this.groupBoxMovieInfo.ResumeLayout(false); - this.groupBoxMovieInfo.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button buttonOpenMovie; - private System.Windows.Forms.Timer timer1; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.GroupBox groupBoxStartScene; - private System.Windows.Forms.GroupBox groupBoxEndScene; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Panel panelControlsStart; - private System.Windows.Forms.ComboBox comboBoxStartTexts; - private System.Windows.Forms.Button buttonGotoStartSubtitlePosition; - private System.Windows.Forms.Button buttonFindTextStart; - private System.Windows.Forms.Button buttonStartThreeSecondsBack; - private System.Windows.Forms.Button buttonStartHalfASecondBack; - private System.Windows.Forms.Label labelVideoInfo; - private System.Windows.Forms.GroupBox groupBoxMovieInfo; - private System.Windows.Forms.Panel panelControlsEnd; - private System.Windows.Forms.Button buttonGotoEndSubtitlePosition; - private System.Windows.Forms.Button buttonFindTextEnd; - private System.Windows.Forms.Button buttonThreeSecondsBack; - private System.Windows.Forms.Button buttonEndHalfASecondBack; - private System.Windows.Forms.ComboBox comboBoxEndTexts; - private System.Windows.Forms.Button buttonSync; - private System.Windows.Forms.OpenFileDialog openFileDialog1; - private System.Windows.Forms.Button buttonStartVerify; - private System.Windows.Forms.Button buttonEndVerify; - private Nikse.SubtitleEdit.Controls.VideoPlayerContainer MediaPlayerStart; - private Nikse.SubtitleEdit.Controls.VideoPlayerContainer MediaPlayerEnd; - private System.Windows.Forms.Label labelTip; - private System.Windows.Forms.Timer timerProgressBarRefresh; - private System.Windows.Forms.Label labelSyncDone; - } +using Nikse.SubtitleEdit.Logic; +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class VisualSync + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.buttonOpenMovie = new System.Windows.Forms.Button(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.buttonOK = new System.Windows.Forms.Button(); + this.groupBoxStartScene = new System.Windows.Forms.GroupBox(); + this.MediaPlayerStart = new Nikse.SubtitleEdit.Controls.VideoPlayerContainer(); + this.panelControlsStart = new System.Windows.Forms.Panel(); + this.buttonStartVerify = new System.Windows.Forms.Button(); + this.buttonGotoStartSubtitlePosition = new System.Windows.Forms.Button(); + this.buttonFindTextStart = new System.Windows.Forms.Button(); + this.buttonStartThreeSecondsBack = new System.Windows.Forms.Button(); + this.buttonStartHalfASecondBack = new System.Windows.Forms.Button(); + this.comboBoxStartTexts = new System.Windows.Forms.ComboBox(); + this.groupBoxEndScene = new System.Windows.Forms.GroupBox(); + this.MediaPlayerEnd = new Nikse.SubtitleEdit.Controls.VideoPlayerContainer(); + this.panelControlsEnd = new System.Windows.Forms.Panel(); + this.buttonEndVerify = new System.Windows.Forms.Button(); + this.buttonGotoEndSubtitlePosition = new System.Windows.Forms.Button(); + this.buttonFindTextEnd = new System.Windows.Forms.Button(); + this.buttonThreeSecondsBack = new System.Windows.Forms.Button(); + this.buttonEndHalfASecondBack = new System.Windows.Forms.Button(); + this.comboBoxEndTexts = new System.Windows.Forms.ComboBox(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.labelVideoInfo = new System.Windows.Forms.Label(); + this.groupBoxMovieInfo = new System.Windows.Forms.GroupBox(); + this.buttonSync = new System.Windows.Forms.Button(); + this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); + this.labelTip = new System.Windows.Forms.Label(); + this.timerProgressBarRefresh = new System.Windows.Forms.Timer(this.components); + this.labelSyncDone = new System.Windows.Forms.Label(); + this.groupBoxStartScene.SuspendLayout(); + this.panelControlsStart.SuspendLayout(); + this.groupBoxEndScene.SuspendLayout(); + this.panelControlsEnd.SuspendLayout(); + this.groupBoxMovieInfo.SuspendLayout(); + this.SuspendLayout(); + // + // buttonOpenMovie + // + this.buttonOpenMovie.Location = new System.Drawing.Point(12, 12); + this.buttonOpenMovie.Name = "buttonOpenMovie"; + this.buttonOpenMovie.Size = new System.Drawing.Size(100, 23); + this.buttonOpenMovie.TabIndex = 5; + this.buttonOpenMovie.Text = "Open movie..."; + this.buttonOpenMovie.UseVisualStyleBackColor = true; + this.buttonOpenMovie.Click += new System.EventHandler(this.ButtonOpenMovieClick); + // + // timer1 + // + this.timer1.Interval = 50; + this.timer1.Tick += new System.EventHandler(this.Timer1Tick); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; + this.buttonOK.Location = new System.Drawing.Point(754, 490); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 3; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // groupBoxStartScene + // + this.groupBoxStartScene.Controls.Add(this.MediaPlayerStart); + this.groupBoxStartScene.Controls.Add(this.panelControlsStart); + this.groupBoxStartScene.Location = new System.Drawing.Point(12, 65); + this.groupBoxStartScene.Name = "groupBoxStartScene"; + this.groupBoxStartScene.Size = new System.Drawing.Size(450, 399); + this.groupBoxStartScene.TabIndex = 0; + this.groupBoxStartScene.TabStop = false; + this.groupBoxStartScene.Text = "Start scene"; + this.groupBoxStartScene.Enter += new System.EventHandler(this.GroupBoxStartSceneEnter); + // + // MediaPlayerStart + // + this.MediaPlayerStart.BackColor = System.Drawing.Color.Black; + this.MediaPlayerStart.CurrentPosition = 0D; + this.MediaPlayerStart.FontSizeFactor = 1F; + this.MediaPlayerStart.LastParagraph = null; + this.MediaPlayerStart.Location = new System.Drawing.Point(6, 34); + this.MediaPlayerStart.Name = "MediaPlayerStart"; + this.MediaPlayerStart.ShowFullscreenButton = true; + this.MediaPlayerStart.ShowMuteButton = true; + this.MediaPlayerStart.ShowStopButton = true; + this.MediaPlayerStart.Size = new System.Drawing.Size(450, 287); + this.MediaPlayerStart.SmpteMode = false; + this.MediaPlayerStart.SubtitleText = ""; + this.MediaPlayerStart.TabIndex = 13; + this.MediaPlayerStart.TextRightToLeft = System.Windows.Forms.RightToLeft.No; + this.MediaPlayerStart.VideoHeight = 0; + this.MediaPlayerStart.VideoPlayer = null; + this.MediaPlayerStart.VideoWidth = 0; + this.MediaPlayerStart.Volume = 0D; + this.MediaPlayerStart.OnButtonClicked += new System.EventHandler(this.MediaPlayerStart_OnButtonClicked); + // + // panelControlsStart + // + this.panelControlsStart.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.panelControlsStart.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelControlsStart.Controls.Add(this.buttonStartVerify); + this.panelControlsStart.Controls.Add(this.buttonGotoStartSubtitlePosition); + this.panelControlsStart.Controls.Add(this.buttonFindTextStart); + this.panelControlsStart.Controls.Add(this.buttonStartThreeSecondsBack); + this.panelControlsStart.Controls.Add(this.buttonStartHalfASecondBack); + this.panelControlsStart.Controls.Add(this.comboBoxStartTexts); + this.panelControlsStart.Location = new System.Drawing.Point(6, 327); + this.panelControlsStart.Name = "panelControlsStart"; + this.panelControlsStart.Size = new System.Drawing.Size(438, 68); + this.panelControlsStart.TabIndex = 1; + // + // buttonStartVerify + // + this.buttonStartVerify.Location = new System.Drawing.Point(138, 37); + this.buttonStartVerify.Name = "buttonStartVerify"; + this.buttonStartVerify.Size = new System.Drawing.Size(119, 23); + this.buttonStartVerify.TabIndex = 3; + this.buttonStartVerify.Text = "Play 2 s and back"; + this.buttonStartVerify.UseVisualStyleBackColor = true; + this.buttonStartVerify.Click += new System.EventHandler(this.ButtonStartVerifyClick); + // + // buttonGotoStartSubtitlePosition + // + this.buttonGotoStartSubtitlePosition.Location = new System.Drawing.Point(263, 37); + this.buttonGotoStartSubtitlePosition.Name = "buttonGotoStartSubtitlePosition"; + this.buttonGotoStartSubtitlePosition.Size = new System.Drawing.Size(90, 23); + this.buttonGotoStartSubtitlePosition.TabIndex = 4; + this.buttonGotoStartSubtitlePosition.Text = "Goto sub Position"; + this.buttonGotoStartSubtitlePosition.UseVisualStyleBackColor = true; + this.buttonGotoStartSubtitlePosition.Click += new System.EventHandler(this.ButtonGotoStartSubtitlePositionClick); + // + // buttonFindTextStart + // + this.buttonFindTextStart.Location = new System.Drawing.Point(359, 37); + this.buttonFindTextStart.Name = "buttonFindTextStart"; + this.buttonFindTextStart.Size = new System.Drawing.Size(70, 23); + this.buttonFindTextStart.TabIndex = 5; + this.buttonFindTextStart.Text = "Find text..."; + this.buttonFindTextStart.UseVisualStyleBackColor = true; + this.buttonFindTextStart.Click += new System.EventHandler(this.ButtonFindTextStartClick); + // + // buttonStartThreeSecondsBack + // + this.buttonStartThreeSecondsBack.Location = new System.Drawing.Point(6, 37); + this.buttonStartThreeSecondsBack.Name = "buttonStartThreeSecondsBack"; + this.buttonStartThreeSecondsBack.Size = new System.Drawing.Size(60, 23); + this.buttonStartThreeSecondsBack.TabIndex = 1; + this.buttonStartThreeSecondsBack.Text = "< 3 s"; + this.buttonStartThreeSecondsBack.UseVisualStyleBackColor = true; + this.buttonStartThreeSecondsBack.Click += new System.EventHandler(this.ButtonStartThreeSecondsBackClick); + // + // buttonStartHalfASecondBack + // + this.buttonStartHalfASecondBack.Location = new System.Drawing.Point(72, 37); + this.buttonStartHalfASecondBack.Name = "buttonStartHalfASecondBack"; + this.buttonStartHalfASecondBack.Size = new System.Drawing.Size(60, 23); + this.buttonStartHalfASecondBack.TabIndex = 2; + this.buttonStartHalfASecondBack.Text = "< ½ s"; + this.buttonStartHalfASecondBack.UseVisualStyleBackColor = true; + this.buttonStartHalfASecondBack.Click += new System.EventHandler(this.ButtonStartHalfASecondBackClick); + // + // comboBoxStartTexts + // + this.comboBoxStartTexts.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxStartTexts.FormattingEnabled = true; + this.comboBoxStartTexts.Location = new System.Drawing.Point(7, 10); + this.comboBoxStartTexts.Name = "comboBoxStartTexts"; + this.comboBoxStartTexts.Size = new System.Drawing.Size(422, 21); + this.comboBoxStartTexts.TabIndex = 0; + // + // groupBoxEndScene + // + this.groupBoxEndScene.Controls.Add(this.MediaPlayerEnd); + this.groupBoxEndScene.Controls.Add(this.panelControlsEnd); + this.groupBoxEndScene.Location = new System.Drawing.Point(468, 65); + this.groupBoxEndScene.Name = "groupBoxEndScene"; + this.groupBoxEndScene.Size = new System.Drawing.Size(450, 399); + this.groupBoxEndScene.TabIndex = 1; + this.groupBoxEndScene.TabStop = false; + this.groupBoxEndScene.Text = "End scene"; + this.groupBoxEndScene.Enter += new System.EventHandler(this.GroupBoxEndSceneEnter); + // + // MediaPlayerEnd + // + this.MediaPlayerEnd.BackColor = System.Drawing.Color.Black; + this.MediaPlayerEnd.CurrentPosition = 0D; + this.MediaPlayerEnd.FontSizeFactor = 1F; + this.MediaPlayerEnd.LastParagraph = null; + this.MediaPlayerEnd.Location = new System.Drawing.Point(6, 34); + this.MediaPlayerEnd.Name = "MediaPlayerEnd"; + this.MediaPlayerEnd.ShowFullscreenButton = true; + this.MediaPlayerEnd.ShowMuteButton = true; + this.MediaPlayerEnd.ShowStopButton = true; + this.MediaPlayerEnd.Size = new System.Drawing.Size(438, 287); + this.MediaPlayerEnd.SmpteMode = false; + this.MediaPlayerEnd.SubtitleText = ""; + this.MediaPlayerEnd.TabIndex = 14; + this.MediaPlayerEnd.TextRightToLeft = System.Windows.Forms.RightToLeft.No; + this.MediaPlayerEnd.VideoHeight = 0; + this.MediaPlayerEnd.VideoPlayer = null; + this.MediaPlayerEnd.VideoWidth = 0; + this.MediaPlayerEnd.Volume = 0D; + this.MediaPlayerEnd.OnButtonClicked += new System.EventHandler(this.MediaPlayerEnd_OnButtonClicked); + // + // panelControlsEnd + // + this.panelControlsEnd.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.panelControlsEnd.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelControlsEnd.Controls.Add(this.buttonEndVerify); + this.panelControlsEnd.Controls.Add(this.buttonGotoEndSubtitlePosition); + this.panelControlsEnd.Controls.Add(this.buttonFindTextEnd); + this.panelControlsEnd.Controls.Add(this.buttonThreeSecondsBack); + this.panelControlsEnd.Controls.Add(this.buttonEndHalfASecondBack); + this.panelControlsEnd.Controls.Add(this.comboBoxEndTexts); + this.panelControlsEnd.Location = new System.Drawing.Point(7, 327); + this.panelControlsEnd.Name = "panelControlsEnd"; + this.panelControlsEnd.Size = new System.Drawing.Size(438, 68); + this.panelControlsEnd.TabIndex = 1; + // + // buttonEndVerify + // + this.buttonEndVerify.Location = new System.Drawing.Point(139, 37); + this.buttonEndVerify.Name = "buttonEndVerify"; + this.buttonEndVerify.Size = new System.Drawing.Size(118, 23); + this.buttonEndVerify.TabIndex = 3; + this.buttonEndVerify.Text = "Play 2 s and back"; + this.buttonEndVerify.UseVisualStyleBackColor = true; + this.buttonEndVerify.Click += new System.EventHandler(this.ButtonEndVerifyClick); + // + // buttonGotoEndSubtitlePosition + // + this.buttonGotoEndSubtitlePosition.Location = new System.Drawing.Point(263, 37); + this.buttonGotoEndSubtitlePosition.Name = "buttonGotoEndSubtitlePosition"; + this.buttonGotoEndSubtitlePosition.Size = new System.Drawing.Size(90, 23); + this.buttonGotoEndSubtitlePosition.TabIndex = 4; + this.buttonGotoEndSubtitlePosition.Text = "Goto sub Position"; + this.buttonGotoEndSubtitlePosition.UseVisualStyleBackColor = true; + this.buttonGotoEndSubtitlePosition.Click += new System.EventHandler(this.ButtonGotoEndSubtitlePositionClick); + // + // buttonFindTextEnd + // + this.buttonFindTextEnd.Location = new System.Drawing.Point(359, 37); + this.buttonFindTextEnd.Name = "buttonFindTextEnd"; + this.buttonFindTextEnd.Size = new System.Drawing.Size(70, 23); + this.buttonFindTextEnd.TabIndex = 5; + this.buttonFindTextEnd.Text = "Find text..."; + this.buttonFindTextEnd.UseVisualStyleBackColor = true; + this.buttonFindTextEnd.Click += new System.EventHandler(this.ButtonFindTextEndClick); + // + // buttonThreeSecondsBack + // + this.buttonThreeSecondsBack.Location = new System.Drawing.Point(7, 37); + this.buttonThreeSecondsBack.Name = "buttonThreeSecondsBack"; + this.buttonThreeSecondsBack.Size = new System.Drawing.Size(60, 23); + this.buttonThreeSecondsBack.TabIndex = 1; + this.buttonThreeSecondsBack.Text = "< 3 s"; + this.buttonThreeSecondsBack.UseVisualStyleBackColor = true; + this.buttonThreeSecondsBack.Click += new System.EventHandler(this.ButtonThreeSecondsBackClick); + // + // buttonEndHalfASecondBack + // + this.buttonEndHalfASecondBack.Location = new System.Drawing.Point(73, 37); + this.buttonEndHalfASecondBack.Name = "buttonEndHalfASecondBack"; + this.buttonEndHalfASecondBack.Size = new System.Drawing.Size(60, 23); + this.buttonEndHalfASecondBack.TabIndex = 2; + this.buttonEndHalfASecondBack.Text = "< ½ s"; + this.buttonEndHalfASecondBack.UseVisualStyleBackColor = true; + this.buttonEndHalfASecondBack.Click += new System.EventHandler(this.ButtonEndHalfASecondBackClick); + // + // comboBoxEndTexts + // + this.comboBoxEndTexts.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxEndTexts.FormattingEnabled = true; + this.comboBoxEndTexts.Location = new System.Drawing.Point(7, 10); + this.comboBoxEndTexts.Name = "comboBoxEndTexts"; + this.comboBoxEndTexts.Size = new System.Drawing.Size(422, 21); + this.comboBoxEndTexts.TabIndex = 0; + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.Location = new System.Drawing.Point(835, 490); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 4; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + // + // labelVideoInfo + // + this.labelVideoInfo.AutoSize = true; + this.labelVideoInfo.Location = new System.Drawing.Point(6, 16); + this.labelVideoInfo.Name = "labelVideoInfo"; + this.labelVideoInfo.Size = new System.Drawing.Size(84, 13); + this.labelVideoInfo.TabIndex = 13; + this.labelVideoInfo.Text = "No video loaded"; + // + // groupBoxMovieInfo + // + this.groupBoxMovieInfo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxMovieInfo.Controls.Add(this.labelVideoInfo); + this.groupBoxMovieInfo.Location = new System.Drawing.Point(132, 8); + this.groupBoxMovieInfo.Name = "groupBoxMovieInfo"; + this.groupBoxMovieInfo.Size = new System.Drawing.Size(786, 53); + this.groupBoxMovieInfo.TabIndex = 14; + this.groupBoxMovieInfo.TabStop = false; + this.groupBoxMovieInfo.Text = "Movie info"; + // + // buttonSync + // + this.buttonSync.Anchor = System.Windows.Forms.AnchorStyles.Bottom; + this.buttonSync.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.buttonSync.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.buttonSync.Location = new System.Drawing.Point(395, 488); + this.buttonSync.Name = "buttonSync"; + this.buttonSync.Size = new System.Drawing.Size(148, 31); + this.buttonSync.TabIndex = 2; + this.buttonSync.Text = "Sync!"; + this.buttonSync.UseVisualStyleBackColor = true; + this.buttonSync.Click += new System.EventHandler(this.ButtonSyncClick); + // + // openFileDialog1 + // + this.openFileDialog1.FileName = "openFileDialog1"; + // + // labelTip + // + this.labelTip.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelTip.AutoSize = true; + this.labelTip.ForeColor = System.Drawing.Color.Gray; + this.labelTip.Location = new System.Drawing.Point(12, 473); + this.labelTip.Name = "labelTip"; + this.labelTip.Size = new System.Drawing.Size(332, 13); + this.labelTip.TabIndex = 15; + this.labelTip.Text = "Tip: Use keys to move 100 ms back/forward"; + // + // timerProgressBarRefresh + // + this.timerProgressBarRefresh.Tick += new System.EventHandler(this.timerProgressBarRefresh_Tick); + // + // labelSyncDone + // + this.labelSyncDone.Anchor = System.Windows.Forms.AnchorStyles.Bottom; + this.labelSyncDone.AutoSize = true; + this.labelSyncDone.ForeColor = System.Drawing.Color.Gray; + this.labelSyncDone.Location = new System.Drawing.Point(546, 502); + this.labelSyncDone.Name = "labelSyncDone"; + this.labelSyncDone.Size = new System.Drawing.Size(77, 13); + this.labelSyncDone.TabIndex = 16; + this.labelSyncDone.Text = "labelSyncDone"; + // + // VisualSync + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(927, 525); + this.Controls.Add(this.labelSyncDone); + this.Controls.Add(this.buttonSync); + this.Controls.Add(this.labelTip); + this.Controls.Add(this.groupBoxMovieInfo); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.groupBoxEndScene); + this.Controls.Add(this.groupBoxStartScene); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.buttonOpenMovie); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.KeyPreview = true; + this.MinimumSize = new System.Drawing.Size(935, 540); + this.Name = "VisualSync"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Visual Sync"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormVisualSync_FormClosing); + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.VisualSync_FormClosed); + this.Load += new System.EventHandler(this.VisualSync_Load); + this.Shown += new System.EventHandler(this.VisualSync_Shown); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.VisualSync_KeyDown); + this.Resize += new System.EventHandler(this.FormVisualSync_Resize); + this.groupBoxStartScene.ResumeLayout(false); + this.panelControlsStart.ResumeLayout(false); + this.groupBoxEndScene.ResumeLayout(false); + this.panelControlsEnd.ResumeLayout(false); + this.groupBoxMovieInfo.ResumeLayout(false); + this.groupBoxMovieInfo.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonOpenMovie; + private System.Windows.Forms.Timer timer1; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.GroupBox groupBoxStartScene; + private System.Windows.Forms.GroupBox groupBoxEndScene; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Panel panelControlsStart; + private System.Windows.Forms.ComboBox comboBoxStartTexts; + private System.Windows.Forms.Button buttonGotoStartSubtitlePosition; + private System.Windows.Forms.Button buttonFindTextStart; + private System.Windows.Forms.Button buttonStartThreeSecondsBack; + private System.Windows.Forms.Button buttonStartHalfASecondBack; + private System.Windows.Forms.Label labelVideoInfo; + private System.Windows.Forms.GroupBox groupBoxMovieInfo; + private System.Windows.Forms.Panel panelControlsEnd; + private System.Windows.Forms.Button buttonGotoEndSubtitlePosition; + private System.Windows.Forms.Button buttonFindTextEnd; + private System.Windows.Forms.Button buttonThreeSecondsBack; + private System.Windows.Forms.Button buttonEndHalfASecondBack; + private System.Windows.Forms.ComboBox comboBoxEndTexts; + private System.Windows.Forms.Button buttonSync; + private System.Windows.Forms.OpenFileDialog openFileDialog1; + private System.Windows.Forms.Button buttonStartVerify; + private System.Windows.Forms.Button buttonEndVerify; + private Nikse.SubtitleEdit.Controls.VideoPlayerContainer MediaPlayerStart; + private Nikse.SubtitleEdit.Controls.VideoPlayerContainer MediaPlayerEnd; + private System.Windows.Forms.Label labelTip; + private System.Windows.Forms.Timer timerProgressBarRefresh; + private System.Windows.Forms.Label labelSyncDone; + } } \ No newline at end of file diff --git a/src/Forms/VisualSync.cs b/src/ui/Forms/VisualSync.cs similarity index 97% rename from src/Forms/VisualSync.cs rename to src/ui/Forms/VisualSync.cs index 8f74bdfad..ec64ac075 100644 --- a/src/Forms/VisualSync.cs +++ b/src/ui/Forms/VisualSync.cs @@ -1,898 +1,898 @@ -using Nikse.SubtitleEdit.Controls; -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.Forms.FixCommonErrors; -using Nikse.SubtitleEdit.Logic; -using Nikse.SubtitleEdit.Logic.VideoPlayers; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.IO; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class VisualSync : PositionAndSizeForm - { - private List _paragraphs; - private List _paragraphsAlternate; - private VideoInfo _videoInfo; - private string _subtitleFileName; - private Subtitle _inputSubtitle; - private Subtitle _inputAlternateSubtitle; - private double _oldFrameRate; - private bool _isStartSceneActive; - private double _startGoBackPosition; - private double _startStopPosition = -1.0; - private double _endGoBackPosition; - private double _endStopPosition = -1.0; - private readonly LanguageStructure.VisualSync _language; - private readonly LanguageStructure.General _languageGeneral; - private readonly Timer _timerHideSyncLabel = new Timer(); - private string _adjustInfo = string.Empty; - - public string VideoFileName { get; set; } - public int AudioTrackNumber { get; set; } - - public bool OkPressed { get; set; } - - public bool FrameRateChanged { get; private set; } - - public double FrameRate => _videoInfo?.FramesPerSecond ?? 0; - - public List Paragraphs => _paragraphs; - - public List ParagraphsAlternate => _paragraphsAlternate; - - public VisualSync() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - openFileDialog1.InitialDirectory = string.Empty; - - MediaPlayerStart.InitializeVolume(Configuration.Settings.General.VideoPlayerDefaultVolume); - MediaPlayerEnd.InitializeVolume(Configuration.Settings.General.VideoPlayerDefaultVolume); - - labelSyncDone.Text = string.Empty; - _language = Configuration.Settings.Language.VisualSync; - _languageGeneral = Configuration.Settings.Language.General; - Text = _language.Title; - buttonOpenMovie.Text = _languageGeneral.OpenVideoFile; - groupBoxMovieInfo.Text = _languageGeneral.VideoInformation; - labelVideoInfo.Text = _languageGeneral.NoVideoLoaded; - groupBoxStartScene.Text = _language.StartScene; - groupBoxEndScene.Text = _language.EndScene; - buttonStartThreeSecondsBack.Text = _language.ThreeSecondsBack; - buttonThreeSecondsBack.Text = _language.ThreeSecondsBack; - buttonStartHalfASecondBack.Text = _language.HalfASecondBack; - buttonEndHalfASecondBack.Text = _language.HalfASecondBack; - buttonStartVerify.Text = string.Format(_language.PlayXSecondsAndBack, Configuration.Settings.Tools.VerifyPlaySeconds); - buttonEndVerify.Text = buttonStartVerify.Text; - buttonGotoStartSubtitlePosition.Text = _language.GoToSubPosition; - buttonGotoEndSubtitlePosition.Text = _language.GoToSubPosition; - buttonFindTextStart.Text = _language.FindText; - buttonFindTextEnd.Text = _language.FindText; - buttonSync.Text = _language.Synchronize; - buttonOK.Text = _languageGeneral.Ok; - buttonCancel.Text = _languageGeneral.Cancel; - labelTip.Text = _language.Tip; - UiUtil.FixLargeFonts(this, buttonCancel); - _timerHideSyncLabel.Tick += timerHideSyncLabel_Tick; - _timerHideSyncLabel.Interval = 1000; - } - - private void timerHideSyncLabel_Tick(object sender, EventArgs e) - { - labelSyncDone.Text = _adjustInfo; - } - - private void GotoSubtitlePosition(VideoPlayerContainer mediaPlayer) - { - int index; - if (mediaPlayer == MediaPlayerStart) - { - index = comboBoxStartTexts.SelectedIndex; - } - else - { - index = comboBoxEndTexts.SelectedIndex; - } - - mediaPlayer.Pause(); - if (index != -1) - { - double indexPositionInSeconds = _paragraphs[index].StartTime.TotalMilliseconds / TimeCode.BaseUnit; - - if (indexPositionInSeconds > mediaPlayer.Duration) - { - indexPositionInSeconds = mediaPlayer.Duration - (2 * 60); - } - - if (indexPositionInSeconds < 0) - { - indexPositionInSeconds = 0; - } - - mediaPlayer.CurrentPosition = indexPositionInSeconds; - mediaPlayer.RefreshProgressBar(); - } - } - - private void OpenVideo(string fileName) - { - if (File.Exists(fileName)) - { - timer1.Stop(); - timerProgressBarRefresh.Stop(); - - VideoFileName = fileName; - - var fi = new FileInfo(fileName); - if (fi.Length < 1000) - { - return; - } - - if (MediaPlayerStart.VideoPlayer != null) - { - MediaPlayerStart.Pause(); - MediaPlayerStart.VideoPlayer.DisposeVideoPlayer(); - } - if (MediaPlayerEnd.VideoPlayer != null) - { - MediaPlayerEnd.Pause(); - MediaPlayerEnd.VideoPlayer.DisposeVideoPlayer(); - } - - VideoInfo videoInfo = ShowVideoInfo(fileName); - UiUtil.InitializeVideoPlayerAndContainer(fileName, videoInfo, MediaPlayerStart, VideoStartLoaded, VideoStartEnded); - } - } - - private void VideoStartEnded(object sender, EventArgs e) - { - MediaPlayerStart.Pause(); - } - - private void VideoStartLoaded(object sender, EventArgs e) - { - MediaPlayerStart.Pause(); - GotoSubtitlePosition(MediaPlayerStart); - - _startGoBackPosition = MediaPlayerStart.CurrentPosition; - _startStopPosition = _startGoBackPosition + 0.1; - MediaPlayerStart.Play(); - - if (MediaPlayerStart.VideoPlayer.GetType() == typeof(LibVlcDynamic)) - { - MediaPlayerEnd.VideoPlayer = (MediaPlayerStart.VideoPlayer as LibVlcDynamic).MakeSecondMediaPlayer(MediaPlayerEnd.PanelPlayer, VideoFileName, VideoEndLoaded, VideoEndEnded); - } - else - { - UiUtil.InitializeVideoPlayerAndContainer(VideoFileName, _videoInfo, MediaPlayerEnd, VideoEndLoaded, VideoEndEnded); - } - timer1.Start(); - timerProgressBarRefresh.Start(); - - if (AudioTrackNumber >= 0 && MediaPlayerStart.VideoPlayer is LibVlcDynamic) - { - var libVlc = (LibVlcDynamic)MediaPlayerStart.VideoPlayer; - libVlc.AudioTrackNumber = AudioTrackNumber; - } - else if (AudioTrackNumber >= 0 && MediaPlayerStart.VideoPlayer is LibMpvDynamic) - { - var libMpv = (LibMpvDynamic)MediaPlayerStart.VideoPlayer; - libMpv.AudioTrackNumber = AudioTrackNumber; - } - } - - private void VideoEndEnded(object sender, EventArgs e) - { - MediaPlayerEnd.Pause(); - } - - private void VideoEndLoaded(object sender, EventArgs e) - { - MediaPlayerEnd.Pause(); - GotoSubtitlePosition(MediaPlayerEnd); - - _endGoBackPosition = MediaPlayerEnd.CurrentPosition; - _endStopPosition = _endGoBackPosition + 0.1; - MediaPlayerEnd.Play(); - - if (AudioTrackNumber >= 0 && MediaPlayerEnd.VideoPlayer is LibVlcDynamic) - { - var libVlc = (LibVlcDynamic)MediaPlayerEnd.VideoPlayer; - libVlc.AudioTrackNumber = AudioTrackNumber; - } - else if (AudioTrackNumber >= 0 && MediaPlayerEnd.VideoPlayer is LibMpvDynamic) - { - var libMpv = (LibMpvDynamic)MediaPlayerEnd.VideoPlayer; - libMpv.AudioTrackNumber = AudioTrackNumber; - } - } - - private VideoInfo ShowVideoInfo(string fileName) - { - _videoInfo = UiUtil.GetVideoInfo(fileName); - var info = new FileInfo(fileName); - long fileSizeInBytes = info.Length; - - labelVideoInfo.Text = string.Format(_languageGeneral.FileNameXAndSize, fileName, Utilities.FormatBytesToDisplayFileSize(fileSizeInBytes)) + Environment.NewLine + - string.Format(_languageGeneral.ResolutionX, +_videoInfo.Width + "x" + _videoInfo.Height) + " "; - if (_videoInfo.FramesPerSecond > 5 && _videoInfo.FramesPerSecond < 200) - { - labelVideoInfo.Text += string.Format(_languageGeneral.FrameRateX + " ", _videoInfo.FramesPerSecond); - } - - if (_videoInfo.TotalFrames > 10) - { - labelVideoInfo.Text += string.Format(_languageGeneral.TotalFramesX + " ", (int)_videoInfo.TotalFrames); - } - - if (!string.IsNullOrEmpty(_videoInfo.VideoCodec)) - { - labelVideoInfo.Text += string.Format(_languageGeneral.VideoEncodingX, _videoInfo.VideoCodec) + " "; - } - - return _videoInfo; - } - - private void Timer1Tick(object sender, EventArgs e) - { - if (MediaPlayerStart != null) - { - if (!MediaPlayerStart.IsPaused) - { - MediaPlayerStart.RefreshProgressBar(); - if (_startStopPosition >= 0 && MediaPlayerStart.CurrentPosition > _startStopPosition) - { - MediaPlayerStart.Pause(); - MediaPlayerStart.CurrentPosition = _startGoBackPosition; - _startStopPosition = -1; - } - UiUtil.ShowSubtitle(new Subtitle(_paragraphs), MediaPlayerStart); - } - if (!MediaPlayerEnd.IsPaused) - { - MediaPlayerEnd.RefreshProgressBar(); - if (_endStopPosition >= 0 && MediaPlayerEnd.CurrentPosition > _endStopPosition) - { - MediaPlayerEnd.Pause(); - MediaPlayerEnd.CurrentPosition = _endGoBackPosition; - _endStopPosition = -1; - } - UiUtil.ShowSubtitle(new Subtitle(_paragraphs), MediaPlayerEnd); - } - } - } - - private void FormVisualSync_FormClosing(object sender, FormClosingEventArgs e) - { - _timerHideSyncLabel.Stop(); - labelSyncDone.Text = string.Empty; - timer1.Stop(); - timerProgressBarRefresh.Stop(); - MediaPlayerStart?.Pause(); - MediaPlayerEnd?.Pause(); - - bool change = false; - for (int i = 0; i < _paragraphs.Count; i++) - { - if (_paragraphs[i].ToString() != _inputSubtitle.Paragraphs[i].ToString()) - { - change = true; - break; - } - } - - if (!change) - { - DialogResult = DialogResult.Cancel; - return; - } - - DialogResult dr; - if (DialogResult == DialogResult.OK) - { - dr = DialogResult.Yes; - } - else - { - dr = MessageBox.Show(_language.KeepChangesMessage, _language.KeepChangesTitle, MessageBoxButtons.YesNoCancel); - } - - if (dr == DialogResult.Cancel) - { - e.Cancel = true; - timer1.Start(); - timerProgressBarRefresh.Start(); - } - else if (dr == DialogResult.Yes) - { - DialogResult = DialogResult.OK; - } - else - { - DialogResult = DialogResult.Cancel; - } - } - - internal void Initialize(Bitmap bitmap, Subtitle subtitle, Subtitle alternate, string fileName, string title, double frameRate) - { - if (bitmap != null) - { - IntPtr iconHandle = bitmap.GetHicon(); - Icon = Icon.FromHandle(iconHandle); - } - - _inputSubtitle = subtitle; - _inputAlternateSubtitle = alternate; - _oldFrameRate = frameRate; - _subtitleFileName = fileName; - Text = title; - } - - private void LoadAndShowOriginalSubtitle() - { - _paragraphs = new List(); - foreach (Paragraph p in _inputSubtitle.Paragraphs) - { - _paragraphs.Add(new Paragraph(p)); - } - - if (_inputAlternateSubtitle != null) - { - _paragraphsAlternate = new List(); - foreach (Paragraph p in _inputAlternateSubtitle.Paragraphs) - { - _paragraphsAlternate.Add(new Paragraph(p)); - } - } - - FillStartAndEndTexts(); - - if (comboBoxStartTexts.Items.Count > Configuration.Settings.Tools.StartSceneIndex) - { - comboBoxStartTexts.SelectedIndex = Configuration.Settings.Tools.StartSceneIndex; - } - else - { - comboBoxStartTexts.SelectedIndex = 0; - } - - if (comboBoxEndTexts.Items.Count > Configuration.Settings.Tools.EndSceneIndex) - { - comboBoxEndTexts.SelectedIndex = comboBoxEndTexts.Items.Count - (Configuration.Settings.Tools.EndSceneIndex + 1); - } - else - { - comboBoxEndTexts.SelectedIndex = comboBoxEndTexts.Items.Count - 1; - } - } - - private void FillStartAndEndTexts() - { - comboBoxStartTexts.BeginUpdate(); - comboBoxEndTexts.BeginUpdate(); - comboBoxStartTexts.Items.Clear(); - comboBoxEndTexts.Items.Clear(); - foreach (Paragraph p in _paragraphs) - { - string s = p.StartTime + " - " + UiUtil.GetListViewTextFromString(p.Text); - comboBoxStartTexts.Items.Add(s); - comboBoxEndTexts.Items.Add(s); - } - comboBoxStartTexts.EndUpdate(); - comboBoxEndTexts.EndUpdate(); - } - - private void TryToFindAndOpenMovieFile(string fileNameNoExtension) - { - string movieFileName = null; - - foreach (string extension in Utilities.VideoFileExtensions) - { - movieFileName = fileNameNoExtension + extension; - if (File.Exists(movieFileName)) - { - break; - } - } - - if (movieFileName != null && File.Exists(movieFileName)) - { - OpenVideo(movieFileName); - } - else if (fileNameNoExtension.Contains('.')) - { - fileNameNoExtension = fileNameNoExtension.Substring(0, fileNameNoExtension.LastIndexOf('.')); - TryToFindAndOpenMovieFile(fileNameNoExtension); - } - } - - private void ButtonGotoStartSubtitlePositionClick(object sender, EventArgs e) - { - GotoSubtitlePosition(MediaPlayerStart); - } - - private void ButtonGotoEndSubtitlePositionClick(object sender, EventArgs e) - { - GotoSubtitlePosition(MediaPlayerEnd); - } - - private void ButtonSyncClick(object sender, EventArgs e) - { - // Video player current start and end position. - double videoPlayerCurrentStartPos = MediaPlayerStart.CurrentPosition; - double videoPlayerCurrentEndPos = MediaPlayerEnd.CurrentPosition; - - // Subtitle start and end time in seconds. - double subStart = _paragraphs[comboBoxStartTexts.SelectedIndex].StartTime.TotalMilliseconds / TimeCode.BaseUnit; - double subEnd = _paragraphs[comboBoxEndTexts.SelectedIndex].StartTime.TotalMilliseconds / TimeCode.BaseUnit; - - // Both end times must be greater than start time. - if (!(videoPlayerCurrentEndPos > videoPlayerCurrentStartPos && subEnd > videoPlayerCurrentStartPos)) - { - MessageBox.Show(_language.StartSceneMustComeBeforeEndScene, "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); - return; - } - - SetSyncFactorLabel(videoPlayerCurrentStartPos, videoPlayerCurrentEndPos); - - double subDiff = subEnd - subStart; - double realDiff = videoPlayerCurrentEndPos - videoPlayerCurrentStartPos; - - // speed factor - double factor = realDiff / subDiff; - - // adjust to starting position - double adjust = videoPlayerCurrentStartPos - subStart * factor; - - foreach (Paragraph p in _paragraphs) - { - p.Adjust(factor, adjust); - } - if (_inputAlternateSubtitle != null) - { - foreach (Paragraph p in _paragraphsAlternate) - { - p.Adjust(factor, adjust); - } - } - - // fix overlapping time codes - var tmpSubtitle = new Subtitle(); - foreach (Paragraph p in _paragraphs) - { - tmpSubtitle.Paragraphs.Add(new Paragraph(p)); - } - - new FixOverlappingDisplayTimes().Fix(tmpSubtitle, new EmptyFixCallback()); - _paragraphs = tmpSubtitle.Paragraphs; - - // fix overlapping time codes for alternate subtitle (translation) - if (_inputAlternateSubtitle != null) - { - tmpSubtitle = new Subtitle(); - foreach (Paragraph p in _paragraphsAlternate) - { - tmpSubtitle.Paragraphs.Add(new Paragraph(p)); - } - - new FixOverlappingDisplayTimes().Fix(tmpSubtitle, new EmptyFixCallback()); - _paragraphsAlternate = tmpSubtitle.Paragraphs; - } - - // update comboboxes - int startSaveIdx = comboBoxStartTexts.SelectedIndex; - int endSaveIdx = comboBoxEndTexts.SelectedIndex; - FillStartAndEndTexts(); - comboBoxStartTexts.SelectedIndex = startSaveIdx; - comboBoxEndTexts.SelectedIndex = endSaveIdx; - - labelSyncDone.Text = _language.SynchronizationDone; - _timerHideSyncLabel.Start(); - } - - private void GoBackSeconds(double seconds, VideoPlayerContainer mediaPlayer) - { - if (mediaPlayer.CurrentPosition > seconds) - { - mediaPlayer.CurrentPosition -= seconds; - } - else - { - mediaPlayer.CurrentPosition = 0; - } - - UiUtil.ShowSubtitle(new Subtitle(_paragraphs), mediaPlayer); - } - - private void ButtonStartHalfASecondBackClick(object sender, EventArgs e) - { - GoBackSeconds(0.5, MediaPlayerStart); - } - - private void ButtonStartThreeSecondsBackClick(object sender, EventArgs e) - { - GoBackSeconds(3.0, MediaPlayerStart); - } - - private void ButtonEndHalfASecondBackClick(object sender, EventArgs e) - { - GoBackSeconds(0.5, MediaPlayerEnd); - } - - private void ButtonThreeSecondsBackClick(object sender, EventArgs e) - { - GoBackSeconds(3.0, MediaPlayerEnd); - } - - private void ButtonOpenMovieClick(object sender, EventArgs e) - { - if (string.IsNullOrEmpty(openFileDialog1.InitialDirectory) && !string.IsNullOrEmpty(_subtitleFileName)) - { - openFileDialog1.InitialDirectory = Path.GetDirectoryName(_subtitleFileName); - } - - openFileDialog1.Title = _languageGeneral.OpenVideoFileTitle; - openFileDialog1.FileName = string.Empty; - openFileDialog1.Filter = Utilities.GetVideoFileFilter(true); - openFileDialog1.FileName = string.Empty; - if (openFileDialog1.ShowDialog() == DialogResult.OK) - { - AudioTrackNumber = -1; - openFileDialog1.InitialDirectory = Path.GetDirectoryName(openFileDialog1.FileName); - OpenVideo(openFileDialog1.FileName); - } - } - - private void SizeWmp() - { - MediaPlayerStart.Height = panelControlsStart.Top - (MediaPlayerStart.Top + 2); - MediaPlayerEnd.Height = MediaPlayerStart.Height; - MediaPlayerEnd.RefreshProgressBar(); - } - - private void FormVisualSync_Resize(object sender, EventArgs e) - { - int halfWidth = Width / 2; - groupBoxStartScene.Width = halfWidth - 18; - MediaPlayerStart.Width = groupBoxStartScene.Width - 12; - panelControlsStart.Width = MediaPlayerStart.Width; - groupBoxEndScene.Left = halfWidth + 3; - groupBoxEndScene.Width = halfWidth - 18; - MediaPlayerEnd.Width = groupBoxEndScene.Width - 12; - SizeWmp(); - panelControlsEnd.Width = MediaPlayerEnd.Width; - groupBoxStartScene.Height = Height - groupBoxEndScene.Top - 90; - groupBoxEndScene.Height = Height - groupBoxEndScene.Top - 90; - SizeWmp(); - } - - private void ButtonFindTextStartClick(object sender, EventArgs e) - { - using (var findSubtitle = new FindSubtitleLine()) - { - findSubtitle.Initialize(_paragraphs, " " + "(" + _language.StartScene.ToLowerInvariant() + ")"); - findSubtitle.ShowDialog(); - if (findSubtitle.SelectedIndex >= 0) - { - comboBoxStartTexts.SelectedIndex = findSubtitle.SelectedIndex; - } - } - } - - private void ButtonFindTextEndClick(object sender, EventArgs e) - { - using (var findSubtitle = new FindSubtitleLine()) - { - findSubtitle.Initialize(_paragraphs, " " + "(" + _language.EndScene.ToLowerInvariant() + ")"); - findSubtitle.ShowDialog(); - if (findSubtitle.SelectedIndex >= 0) - { - comboBoxEndTexts.SelectedIndex = findSubtitle.SelectedIndex; - } - } - } - - private void HighlightStartScene() - { - _isStartSceneActive = true; - panelControlsStart.BorderStyle = BorderStyle.FixedSingle; - panelControlsEnd.BorderStyle = BorderStyle.None; - } - - private void HighlightEndScene() - { - _isStartSceneActive = false; - panelControlsEnd.BorderStyle = BorderStyle.FixedSingle; - panelControlsStart.BorderStyle = BorderStyle.None; - } - - private void GroupBoxStartSceneEnter(object sender, EventArgs e) - { - HighlightStartScene(); - } - - private void GroupBoxEndSceneEnter(object sender, EventArgs e) - { - HighlightEndScene(); - } - - private void VisualSync_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - else if (e.KeyCode == UiUtil.HelpKeys) - { - Utilities.ShowHelp("#visual_sync"); - } - else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.O) - { - ButtonOpenMovieClick(null, null); - } - else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.F) - { - if (_isStartSceneActive) - { - ButtonFindTextStartClick(null, null); - } - else - { - ButtonFindTextEndClick(null, null); - } - } - else if (MediaPlayerStart != null && MediaPlayerEnd != null) - { - if (e.Modifiers == Keys.Control && e.KeyCode == Keys.S) - { - if (_isStartSceneActive) - { - _startStopPosition = -1; - if (!MediaPlayerStart.IsPaused) - { - MediaPlayerStart.Pause(); - } - } - else - { - _endStopPosition = -1; - if (!MediaPlayerEnd.IsPaused) - { - MediaPlayerEnd.Pause(); - } - } - } - else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.P) - { - if (_isStartSceneActive) - { - _startStopPosition = -1; - MediaPlayerStart.TogglePlayPause(); - } - else - { - _endStopPosition = -1; - MediaPlayerStart.TogglePlayPause(); - } - } - else if (e.Modifiers == Keys.Alt && e.KeyCode == Keys.Left) - { - if (_isStartSceneActive) - { - GoBackSeconds(0.5, MediaPlayerStart); - } - else - { - GoBackSeconds(0.5, MediaPlayerEnd); - } - - e.SuppressKeyPress = true; - } - else if (e.Modifiers == Keys.Alt && e.KeyCode == Keys.Right) - { - if (_isStartSceneActive) - { - GoBackSeconds(-0.5, MediaPlayerStart); - } - else - { - GoBackSeconds(-0.5, MediaPlayerEnd); - } - - e.SuppressKeyPress = true; - } - else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.Left) - { - if (_isStartSceneActive) - { - GoBackSeconds(0.1, MediaPlayerStart); - } - else - { - GoBackSeconds(0.1, MediaPlayerEnd); - } - - e.SuppressKeyPress = true; - } - else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.Right) - { - if (_isStartSceneActive) - { - GoBackSeconds(-0.1, MediaPlayerStart); - } - else - { - GoBackSeconds(-0.1, MediaPlayerEnd); - } - - e.SuppressKeyPress = true; - } - else if (e.Modifiers == (Keys.Control | Keys.Shift) && e.KeyCode == Keys.Right) - { - if (_isStartSceneActive) - { - GoBackSeconds(1.0, MediaPlayerStart); - } - else - { - GoBackSeconds(1.0, MediaPlayerEnd); - } - - e.SuppressKeyPress = true; - } - else if (e.Modifiers == (Keys.Control | Keys.Shift) && e.KeyCode == Keys.Left) - { - if (_isStartSceneActive) - { - GoBackSeconds(-1.0, MediaPlayerStart); - } - else - { - GoBackSeconds(-1.0, MediaPlayerEnd); - } - - e.SuppressKeyPress = true; - } - else if (e.Modifiers == Keys.None && e.KeyCode == Keys.Space) - { - if (_isStartSceneActive) - { - MediaPlayerStart.TogglePlayPause(); - } - else - { - MediaPlayerEnd.TogglePlayPause(); - } - - e.SuppressKeyPress = true; - } - } - } - - private void VisualSync_Shown(object sender, EventArgs e) - { - comboBoxStartTexts.Focus(); - } - - private void ButtonStartVerifyClick(object sender, EventArgs e) - { - if (MediaPlayerStart != null && MediaPlayerStart.VideoPlayer != null) - { - _startGoBackPosition = MediaPlayerStart.CurrentPosition; - _startStopPosition = _startGoBackPosition + Configuration.Settings.Tools.VerifyPlaySeconds; - MediaPlayerStart.Play(); - } - } - - private void ButtonEndVerifyClick(object sender, EventArgs e) - { - if (MediaPlayerEnd != null && MediaPlayerEnd.VideoPlayer != null) - { - _endGoBackPosition = MediaPlayerEnd.CurrentPosition; - _endStopPosition = _endGoBackPosition + Configuration.Settings.Tools.VerifyPlaySeconds; - MediaPlayerEnd.Play(); - } - } - - private void VisualSync_Load(object sender, EventArgs e) - { - LoadAndShowOriginalSubtitle(); - if (!string.IsNullOrEmpty(VideoFileName) && File.Exists(VideoFileName)) - { - OpenVideo(VideoFileName); - } - else if (!string.IsNullOrEmpty(_subtitleFileName)) - { - TryToFindAndOpenMovieFile(Path.GetDirectoryName(_subtitleFileName) + Path.DirectorySeparatorChar + Path.GetFileNameWithoutExtension(_subtitleFileName)); - } - - FormVisualSync_Resize(null, null); - } - - private void MediaPlayerStart_OnButtonClicked(object sender, EventArgs e) - { - if (!_isStartSceneActive) - { - HighlightStartScene(); - } - } - - private void MediaPlayerEnd_OnButtonClicked(object sender, EventArgs e) - { - if (_isStartSceneActive) - { - HighlightEndScene(); - } - } - - private void VisualSync_FormClosed(object sender, FormClosedEventArgs e) - { - if (MediaPlayerStart.VideoPlayer != null) // && MediaPlayerStart.VideoPlayer.GetType() == typeof(QuartsPlayer)) - { - MediaPlayerStart.VideoPlayer.Pause(); - MediaPlayerStart.VideoPlayer.DisposeVideoPlayer(); - } - if (MediaPlayerEnd.VideoPlayer != null) // && MediaPlayerEnd.VideoPlayer.GetType() == typeof(QuartsPlayer)) - { - MediaPlayerEnd.VideoPlayer.Pause(); - MediaPlayerEnd.VideoPlayer.DisposeVideoPlayer(); - } - } - - private void buttonOK_Click(object sender, EventArgs e) - { - OkPressed = true; - } - - private void timerProgressBarRefresh_Tick(object sender, EventArgs e) - { - timerProgressBarRefresh.Stop(); - if (MediaPlayerStart.VideoPlayer != null) // && MediaPlayerStart.VideoPlayer.GetType() == typeof(QuartsPlayer)) - { - MediaPlayerStart.RefreshProgressBar(); - } - if (MediaPlayerEnd.VideoPlayer != null) // && MediaPlayerEnd.VideoPlayer.GetType() == typeof(QuartsPlayer)) - { - MediaPlayerEnd.RefreshProgressBar(); - } - timerProgressBarRefresh.Start(); - } - - private void SetSyncFactorLabel(double videoPlayerCurrentStartPos, double videoPlayerCurrentEndPos) - { - if (string.IsNullOrWhiteSpace(VideoFileName)) - { - return; - } - - _adjustInfo = string.Empty; - if (videoPlayerCurrentEndPos > videoPlayerCurrentStartPos) - { - double subStart = _paragraphs[comboBoxStartTexts.SelectedIndex].StartTime.TotalMilliseconds / TimeCode.BaseUnit; - double subEnd = _paragraphs[comboBoxEndTexts.SelectedIndex].StartTime.TotalMilliseconds / TimeCode.BaseUnit; - - double subDiff = subEnd - subStart; - double realDiff = videoPlayerCurrentEndPos - videoPlayerCurrentStartPos; - - // speed factor - double factor = realDiff / subDiff; - - // adjust to starting position - double adjust = videoPlayerCurrentStartPos - subStart * factor; - - if (Math.Abs(adjust) > 0.001 || (Math.Abs(1 - factor)) > 0.001) - { - _adjustInfo = string.Format("*{0:0.000}, {1:+0.000;-0.000}", factor, adjust); - } - } - } - - } -} +using Nikse.SubtitleEdit.Controls; +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.Forms.FixCommonErrors; +using Nikse.SubtitleEdit.Logic; +using Nikse.SubtitleEdit.Logic.VideoPlayers; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class VisualSync : PositionAndSizeForm + { + private List _paragraphs; + private List _paragraphsAlternate; + private VideoInfo _videoInfo; + private string _subtitleFileName; + private Subtitle _inputSubtitle; + private Subtitle _inputAlternateSubtitle; + private double _oldFrameRate; + private bool _isStartSceneActive; + private double _startGoBackPosition; + private double _startStopPosition = -1.0; + private double _endGoBackPosition; + private double _endStopPosition = -1.0; + private readonly LanguageStructure.VisualSync _language; + private readonly LanguageStructure.General _languageGeneral; + private readonly Timer _timerHideSyncLabel = new Timer(); + private string _adjustInfo = string.Empty; + + public string VideoFileName { get; set; } + public int AudioTrackNumber { get; set; } + + public bool OkPressed { get; set; } + + public bool FrameRateChanged { get; private set; } + + public double FrameRate => _videoInfo?.FramesPerSecond ?? 0; + + public List Paragraphs => _paragraphs; + + public List ParagraphsAlternate => _paragraphsAlternate; + + public VisualSync() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + openFileDialog1.InitialDirectory = string.Empty; + + MediaPlayerStart.InitializeVolume(Configuration.Settings.General.VideoPlayerDefaultVolume); + MediaPlayerEnd.InitializeVolume(Configuration.Settings.General.VideoPlayerDefaultVolume); + + labelSyncDone.Text = string.Empty; + _language = Configuration.Settings.Language.VisualSync; + _languageGeneral = Configuration.Settings.Language.General; + Text = _language.Title; + buttonOpenMovie.Text = _languageGeneral.OpenVideoFile; + groupBoxMovieInfo.Text = _languageGeneral.VideoInformation; + labelVideoInfo.Text = _languageGeneral.NoVideoLoaded; + groupBoxStartScene.Text = _language.StartScene; + groupBoxEndScene.Text = _language.EndScene; + buttonStartThreeSecondsBack.Text = _language.ThreeSecondsBack; + buttonThreeSecondsBack.Text = _language.ThreeSecondsBack; + buttonStartHalfASecondBack.Text = _language.HalfASecondBack; + buttonEndHalfASecondBack.Text = _language.HalfASecondBack; + buttonStartVerify.Text = string.Format(_language.PlayXSecondsAndBack, Configuration.Settings.Tools.VerifyPlaySeconds); + buttonEndVerify.Text = buttonStartVerify.Text; + buttonGotoStartSubtitlePosition.Text = _language.GoToSubPosition; + buttonGotoEndSubtitlePosition.Text = _language.GoToSubPosition; + buttonFindTextStart.Text = _language.FindText; + buttonFindTextEnd.Text = _language.FindText; + buttonSync.Text = _language.Synchronize; + buttonOK.Text = _languageGeneral.Ok; + buttonCancel.Text = _languageGeneral.Cancel; + labelTip.Text = _language.Tip; + UiUtil.FixLargeFonts(this, buttonCancel); + _timerHideSyncLabel.Tick += timerHideSyncLabel_Tick; + _timerHideSyncLabel.Interval = 1000; + } + + private void timerHideSyncLabel_Tick(object sender, EventArgs e) + { + labelSyncDone.Text = _adjustInfo; + } + + private void GotoSubtitlePosition(VideoPlayerContainer mediaPlayer) + { + int index; + if (mediaPlayer == MediaPlayerStart) + { + index = comboBoxStartTexts.SelectedIndex; + } + else + { + index = comboBoxEndTexts.SelectedIndex; + } + + mediaPlayer.Pause(); + if (index != -1) + { + double indexPositionInSeconds = _paragraphs[index].StartTime.TotalMilliseconds / TimeCode.BaseUnit; + + if (indexPositionInSeconds > mediaPlayer.Duration) + { + indexPositionInSeconds = mediaPlayer.Duration - (2 * 60); + } + + if (indexPositionInSeconds < 0) + { + indexPositionInSeconds = 0; + } + + mediaPlayer.CurrentPosition = indexPositionInSeconds; + mediaPlayer.RefreshProgressBar(); + } + } + + private void OpenVideo(string fileName) + { + if (File.Exists(fileName)) + { + timer1.Stop(); + timerProgressBarRefresh.Stop(); + + VideoFileName = fileName; + + var fi = new FileInfo(fileName); + if (fi.Length < 1000) + { + return; + } + + if (MediaPlayerStart.VideoPlayer != null) + { + MediaPlayerStart.Pause(); + MediaPlayerStart.VideoPlayer.DisposeVideoPlayer(); + } + if (MediaPlayerEnd.VideoPlayer != null) + { + MediaPlayerEnd.Pause(); + MediaPlayerEnd.VideoPlayer.DisposeVideoPlayer(); + } + + VideoInfo videoInfo = ShowVideoInfo(fileName); + UiUtil.InitializeVideoPlayerAndContainer(fileName, videoInfo, MediaPlayerStart, VideoStartLoaded, VideoStartEnded); + } + } + + private void VideoStartEnded(object sender, EventArgs e) + { + MediaPlayerStart.Pause(); + } + + private void VideoStartLoaded(object sender, EventArgs e) + { + MediaPlayerStart.Pause(); + GotoSubtitlePosition(MediaPlayerStart); + + _startGoBackPosition = MediaPlayerStart.CurrentPosition; + _startStopPosition = _startGoBackPosition + 0.1; + MediaPlayerStart.Play(); + + if (MediaPlayerStart.VideoPlayer.GetType() == typeof(LibVlcDynamic)) + { + MediaPlayerEnd.VideoPlayer = (MediaPlayerStart.VideoPlayer as LibVlcDynamic).MakeSecondMediaPlayer(MediaPlayerEnd.PanelPlayer, VideoFileName, VideoEndLoaded, VideoEndEnded); + } + else + { + UiUtil.InitializeVideoPlayerAndContainer(VideoFileName, _videoInfo, MediaPlayerEnd, VideoEndLoaded, VideoEndEnded); + } + timer1.Start(); + timerProgressBarRefresh.Start(); + + if (AudioTrackNumber >= 0 && MediaPlayerStart.VideoPlayer is LibVlcDynamic) + { + var libVlc = (LibVlcDynamic)MediaPlayerStart.VideoPlayer; + libVlc.AudioTrackNumber = AudioTrackNumber; + } + else if (AudioTrackNumber >= 0 && MediaPlayerStart.VideoPlayer is LibMpvDynamic) + { + var libMpv = (LibMpvDynamic)MediaPlayerStart.VideoPlayer; + libMpv.AudioTrackNumber = AudioTrackNumber; + } + } + + private void VideoEndEnded(object sender, EventArgs e) + { + MediaPlayerEnd.Pause(); + } + + private void VideoEndLoaded(object sender, EventArgs e) + { + MediaPlayerEnd.Pause(); + GotoSubtitlePosition(MediaPlayerEnd); + + _endGoBackPosition = MediaPlayerEnd.CurrentPosition; + _endStopPosition = _endGoBackPosition + 0.1; + MediaPlayerEnd.Play(); + + if (AudioTrackNumber >= 0 && MediaPlayerEnd.VideoPlayer is LibVlcDynamic) + { + var libVlc = (LibVlcDynamic)MediaPlayerEnd.VideoPlayer; + libVlc.AudioTrackNumber = AudioTrackNumber; + } + else if (AudioTrackNumber >= 0 && MediaPlayerEnd.VideoPlayer is LibMpvDynamic) + { + var libMpv = (LibMpvDynamic)MediaPlayerEnd.VideoPlayer; + libMpv.AudioTrackNumber = AudioTrackNumber; + } + } + + private VideoInfo ShowVideoInfo(string fileName) + { + _videoInfo = UiUtil.GetVideoInfo(fileName); + var info = new FileInfo(fileName); + long fileSizeInBytes = info.Length; + + labelVideoInfo.Text = string.Format(_languageGeneral.FileNameXAndSize, fileName, Utilities.FormatBytesToDisplayFileSize(fileSizeInBytes)) + Environment.NewLine + + string.Format(_languageGeneral.ResolutionX, +_videoInfo.Width + "x" + _videoInfo.Height) + " "; + if (_videoInfo.FramesPerSecond > 5 && _videoInfo.FramesPerSecond < 200) + { + labelVideoInfo.Text += string.Format(_languageGeneral.FrameRateX + " ", _videoInfo.FramesPerSecond); + } + + if (_videoInfo.TotalFrames > 10) + { + labelVideoInfo.Text += string.Format(_languageGeneral.TotalFramesX + " ", (int)_videoInfo.TotalFrames); + } + + if (!string.IsNullOrEmpty(_videoInfo.VideoCodec)) + { + labelVideoInfo.Text += string.Format(_languageGeneral.VideoEncodingX, _videoInfo.VideoCodec) + " "; + } + + return _videoInfo; + } + + private void Timer1Tick(object sender, EventArgs e) + { + if (MediaPlayerStart != null) + { + if (!MediaPlayerStart.IsPaused) + { + MediaPlayerStart.RefreshProgressBar(); + if (_startStopPosition >= 0 && MediaPlayerStart.CurrentPosition > _startStopPosition) + { + MediaPlayerStart.Pause(); + MediaPlayerStart.CurrentPosition = _startGoBackPosition; + _startStopPosition = -1; + } + UiUtil.ShowSubtitle(new Subtitle(_paragraphs), MediaPlayerStart); + } + if (!MediaPlayerEnd.IsPaused) + { + MediaPlayerEnd.RefreshProgressBar(); + if (_endStopPosition >= 0 && MediaPlayerEnd.CurrentPosition > _endStopPosition) + { + MediaPlayerEnd.Pause(); + MediaPlayerEnd.CurrentPosition = _endGoBackPosition; + _endStopPosition = -1; + } + UiUtil.ShowSubtitle(new Subtitle(_paragraphs), MediaPlayerEnd); + } + } + } + + private void FormVisualSync_FormClosing(object sender, FormClosingEventArgs e) + { + _timerHideSyncLabel.Stop(); + labelSyncDone.Text = string.Empty; + timer1.Stop(); + timerProgressBarRefresh.Stop(); + MediaPlayerStart?.Pause(); + MediaPlayerEnd?.Pause(); + + bool change = false; + for (int i = 0; i < _paragraphs.Count; i++) + { + if (_paragraphs[i].ToString() != _inputSubtitle.Paragraphs[i].ToString()) + { + change = true; + break; + } + } + + if (!change) + { + DialogResult = DialogResult.Cancel; + return; + } + + DialogResult dr; + if (DialogResult == DialogResult.OK) + { + dr = DialogResult.Yes; + } + else + { + dr = MessageBox.Show(_language.KeepChangesMessage, _language.KeepChangesTitle, MessageBoxButtons.YesNoCancel); + } + + if (dr == DialogResult.Cancel) + { + e.Cancel = true; + timer1.Start(); + timerProgressBarRefresh.Start(); + } + else if (dr == DialogResult.Yes) + { + DialogResult = DialogResult.OK; + } + else + { + DialogResult = DialogResult.Cancel; + } + } + + internal void Initialize(Bitmap bitmap, Subtitle subtitle, Subtitle alternate, string fileName, string title, double frameRate) + { + if (bitmap != null) + { + IntPtr iconHandle = bitmap.GetHicon(); + Icon = Icon.FromHandle(iconHandle); + } + + _inputSubtitle = subtitle; + _inputAlternateSubtitle = alternate; + _oldFrameRate = frameRate; + _subtitleFileName = fileName; + Text = title; + } + + private void LoadAndShowOriginalSubtitle() + { + _paragraphs = new List(); + foreach (Paragraph p in _inputSubtitle.Paragraphs) + { + _paragraphs.Add(new Paragraph(p)); + } + + if (_inputAlternateSubtitle != null) + { + _paragraphsAlternate = new List(); + foreach (Paragraph p in _inputAlternateSubtitle.Paragraphs) + { + _paragraphsAlternate.Add(new Paragraph(p)); + } + } + + FillStartAndEndTexts(); + + if (comboBoxStartTexts.Items.Count > Configuration.Settings.Tools.StartSceneIndex) + { + comboBoxStartTexts.SelectedIndex = Configuration.Settings.Tools.StartSceneIndex; + } + else + { + comboBoxStartTexts.SelectedIndex = 0; + } + + if (comboBoxEndTexts.Items.Count > Configuration.Settings.Tools.EndSceneIndex) + { + comboBoxEndTexts.SelectedIndex = comboBoxEndTexts.Items.Count - (Configuration.Settings.Tools.EndSceneIndex + 1); + } + else + { + comboBoxEndTexts.SelectedIndex = comboBoxEndTexts.Items.Count - 1; + } + } + + private void FillStartAndEndTexts() + { + comboBoxStartTexts.BeginUpdate(); + comboBoxEndTexts.BeginUpdate(); + comboBoxStartTexts.Items.Clear(); + comboBoxEndTexts.Items.Clear(); + foreach (Paragraph p in _paragraphs) + { + string s = p.StartTime + " - " + UiUtil.GetListViewTextFromString(p.Text); + comboBoxStartTexts.Items.Add(s); + comboBoxEndTexts.Items.Add(s); + } + comboBoxStartTexts.EndUpdate(); + comboBoxEndTexts.EndUpdate(); + } + + private void TryToFindAndOpenMovieFile(string fileNameNoExtension) + { + string movieFileName = null; + + foreach (string extension in Utilities.VideoFileExtensions) + { + movieFileName = fileNameNoExtension + extension; + if (File.Exists(movieFileName)) + { + break; + } + } + + if (movieFileName != null && File.Exists(movieFileName)) + { + OpenVideo(movieFileName); + } + else if (fileNameNoExtension.Contains('.')) + { + fileNameNoExtension = fileNameNoExtension.Substring(0, fileNameNoExtension.LastIndexOf('.')); + TryToFindAndOpenMovieFile(fileNameNoExtension); + } + } + + private void ButtonGotoStartSubtitlePositionClick(object sender, EventArgs e) + { + GotoSubtitlePosition(MediaPlayerStart); + } + + private void ButtonGotoEndSubtitlePositionClick(object sender, EventArgs e) + { + GotoSubtitlePosition(MediaPlayerEnd); + } + + private void ButtonSyncClick(object sender, EventArgs e) + { + // Video player current start and end position. + double videoPlayerCurrentStartPos = MediaPlayerStart.CurrentPosition; + double videoPlayerCurrentEndPos = MediaPlayerEnd.CurrentPosition; + + // Subtitle start and end time in seconds. + double subStart = _paragraphs[comboBoxStartTexts.SelectedIndex].StartTime.TotalMilliseconds / TimeCode.BaseUnit; + double subEnd = _paragraphs[comboBoxEndTexts.SelectedIndex].StartTime.TotalMilliseconds / TimeCode.BaseUnit; + + // Both end times must be greater than start time. + if (!(videoPlayerCurrentEndPos > videoPlayerCurrentStartPos && subEnd > videoPlayerCurrentStartPos)) + { + MessageBox.Show(_language.StartSceneMustComeBeforeEndScene, "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + return; + } + + SetSyncFactorLabel(videoPlayerCurrentStartPos, videoPlayerCurrentEndPos); + + double subDiff = subEnd - subStart; + double realDiff = videoPlayerCurrentEndPos - videoPlayerCurrentStartPos; + + // speed factor + double factor = realDiff / subDiff; + + // adjust to starting position + double adjust = videoPlayerCurrentStartPos - subStart * factor; + + foreach (Paragraph p in _paragraphs) + { + p.Adjust(factor, adjust); + } + if (_inputAlternateSubtitle != null) + { + foreach (Paragraph p in _paragraphsAlternate) + { + p.Adjust(factor, adjust); + } + } + + // fix overlapping time codes + var tmpSubtitle = new Subtitle(); + foreach (Paragraph p in _paragraphs) + { + tmpSubtitle.Paragraphs.Add(new Paragraph(p)); + } + + new FixOverlappingDisplayTimes().Fix(tmpSubtitle, new EmptyFixCallback()); + _paragraphs = tmpSubtitle.Paragraphs; + + // fix overlapping time codes for alternate subtitle (translation) + if (_inputAlternateSubtitle != null) + { + tmpSubtitle = new Subtitle(); + foreach (Paragraph p in _paragraphsAlternate) + { + tmpSubtitle.Paragraphs.Add(new Paragraph(p)); + } + + new FixOverlappingDisplayTimes().Fix(tmpSubtitle, new EmptyFixCallback()); + _paragraphsAlternate = tmpSubtitle.Paragraphs; + } + + // update comboboxes + int startSaveIdx = comboBoxStartTexts.SelectedIndex; + int endSaveIdx = comboBoxEndTexts.SelectedIndex; + FillStartAndEndTexts(); + comboBoxStartTexts.SelectedIndex = startSaveIdx; + comboBoxEndTexts.SelectedIndex = endSaveIdx; + + labelSyncDone.Text = _language.SynchronizationDone; + _timerHideSyncLabel.Start(); + } + + private void GoBackSeconds(double seconds, VideoPlayerContainer mediaPlayer) + { + if (mediaPlayer.CurrentPosition > seconds) + { + mediaPlayer.CurrentPosition -= seconds; + } + else + { + mediaPlayer.CurrentPosition = 0; + } + + UiUtil.ShowSubtitle(new Subtitle(_paragraphs), mediaPlayer); + } + + private void ButtonStartHalfASecondBackClick(object sender, EventArgs e) + { + GoBackSeconds(0.5, MediaPlayerStart); + } + + private void ButtonStartThreeSecondsBackClick(object sender, EventArgs e) + { + GoBackSeconds(3.0, MediaPlayerStart); + } + + private void ButtonEndHalfASecondBackClick(object sender, EventArgs e) + { + GoBackSeconds(0.5, MediaPlayerEnd); + } + + private void ButtonThreeSecondsBackClick(object sender, EventArgs e) + { + GoBackSeconds(3.0, MediaPlayerEnd); + } + + private void ButtonOpenMovieClick(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(openFileDialog1.InitialDirectory) && !string.IsNullOrEmpty(_subtitleFileName)) + { + openFileDialog1.InitialDirectory = Path.GetDirectoryName(_subtitleFileName); + } + + openFileDialog1.Title = _languageGeneral.OpenVideoFileTitle; + openFileDialog1.FileName = string.Empty; + openFileDialog1.Filter = Utilities.GetVideoFileFilter(true); + openFileDialog1.FileName = string.Empty; + if (openFileDialog1.ShowDialog() == DialogResult.OK) + { + AudioTrackNumber = -1; + openFileDialog1.InitialDirectory = Path.GetDirectoryName(openFileDialog1.FileName); + OpenVideo(openFileDialog1.FileName); + } + } + + private void SizeWmp() + { + MediaPlayerStart.Height = panelControlsStart.Top - (MediaPlayerStart.Top + 2); + MediaPlayerEnd.Height = MediaPlayerStart.Height; + MediaPlayerEnd.RefreshProgressBar(); + } + + private void FormVisualSync_Resize(object sender, EventArgs e) + { + int halfWidth = Width / 2; + groupBoxStartScene.Width = halfWidth - 18; + MediaPlayerStart.Width = groupBoxStartScene.Width - 12; + panelControlsStart.Width = MediaPlayerStart.Width; + groupBoxEndScene.Left = halfWidth + 3; + groupBoxEndScene.Width = halfWidth - 18; + MediaPlayerEnd.Width = groupBoxEndScene.Width - 12; + SizeWmp(); + panelControlsEnd.Width = MediaPlayerEnd.Width; + groupBoxStartScene.Height = Height - groupBoxEndScene.Top - 90; + groupBoxEndScene.Height = Height - groupBoxEndScene.Top - 90; + SizeWmp(); + } + + private void ButtonFindTextStartClick(object sender, EventArgs e) + { + using (var findSubtitle = new FindSubtitleLine()) + { + findSubtitle.Initialize(_paragraphs, " " + "(" + _language.StartScene.ToLowerInvariant() + ")"); + findSubtitle.ShowDialog(); + if (findSubtitle.SelectedIndex >= 0) + { + comboBoxStartTexts.SelectedIndex = findSubtitle.SelectedIndex; + } + } + } + + private void ButtonFindTextEndClick(object sender, EventArgs e) + { + using (var findSubtitle = new FindSubtitleLine()) + { + findSubtitle.Initialize(_paragraphs, " " + "(" + _language.EndScene.ToLowerInvariant() + ")"); + findSubtitle.ShowDialog(); + if (findSubtitle.SelectedIndex >= 0) + { + comboBoxEndTexts.SelectedIndex = findSubtitle.SelectedIndex; + } + } + } + + private void HighlightStartScene() + { + _isStartSceneActive = true; + panelControlsStart.BorderStyle = BorderStyle.FixedSingle; + panelControlsEnd.BorderStyle = BorderStyle.None; + } + + private void HighlightEndScene() + { + _isStartSceneActive = false; + panelControlsEnd.BorderStyle = BorderStyle.FixedSingle; + panelControlsStart.BorderStyle = BorderStyle.None; + } + + private void GroupBoxStartSceneEnter(object sender, EventArgs e) + { + HighlightStartScene(); + } + + private void GroupBoxEndSceneEnter(object sender, EventArgs e) + { + HighlightEndScene(); + } + + private void VisualSync_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + else if (e.KeyCode == UiUtil.HelpKeys) + { + Utilities.ShowHelp("#visual_sync"); + } + else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.O) + { + ButtonOpenMovieClick(null, null); + } + else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.F) + { + if (_isStartSceneActive) + { + ButtonFindTextStartClick(null, null); + } + else + { + ButtonFindTextEndClick(null, null); + } + } + else if (MediaPlayerStart != null && MediaPlayerEnd != null) + { + if (e.Modifiers == Keys.Control && e.KeyCode == Keys.S) + { + if (_isStartSceneActive) + { + _startStopPosition = -1; + if (!MediaPlayerStart.IsPaused) + { + MediaPlayerStart.Pause(); + } + } + else + { + _endStopPosition = -1; + if (!MediaPlayerEnd.IsPaused) + { + MediaPlayerEnd.Pause(); + } + } + } + else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.P) + { + if (_isStartSceneActive) + { + _startStopPosition = -1; + MediaPlayerStart.TogglePlayPause(); + } + else + { + _endStopPosition = -1; + MediaPlayerStart.TogglePlayPause(); + } + } + else if (e.Modifiers == Keys.Alt && e.KeyCode == Keys.Left) + { + if (_isStartSceneActive) + { + GoBackSeconds(0.5, MediaPlayerStart); + } + else + { + GoBackSeconds(0.5, MediaPlayerEnd); + } + + e.SuppressKeyPress = true; + } + else if (e.Modifiers == Keys.Alt && e.KeyCode == Keys.Right) + { + if (_isStartSceneActive) + { + GoBackSeconds(-0.5, MediaPlayerStart); + } + else + { + GoBackSeconds(-0.5, MediaPlayerEnd); + } + + e.SuppressKeyPress = true; + } + else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.Left) + { + if (_isStartSceneActive) + { + GoBackSeconds(0.1, MediaPlayerStart); + } + else + { + GoBackSeconds(0.1, MediaPlayerEnd); + } + + e.SuppressKeyPress = true; + } + else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.Right) + { + if (_isStartSceneActive) + { + GoBackSeconds(-0.1, MediaPlayerStart); + } + else + { + GoBackSeconds(-0.1, MediaPlayerEnd); + } + + e.SuppressKeyPress = true; + } + else if (e.Modifiers == (Keys.Control | Keys.Shift) && e.KeyCode == Keys.Right) + { + if (_isStartSceneActive) + { + GoBackSeconds(1.0, MediaPlayerStart); + } + else + { + GoBackSeconds(1.0, MediaPlayerEnd); + } + + e.SuppressKeyPress = true; + } + else if (e.Modifiers == (Keys.Control | Keys.Shift) && e.KeyCode == Keys.Left) + { + if (_isStartSceneActive) + { + GoBackSeconds(-1.0, MediaPlayerStart); + } + else + { + GoBackSeconds(-1.0, MediaPlayerEnd); + } + + e.SuppressKeyPress = true; + } + else if (e.Modifiers == Keys.None && e.KeyCode == Keys.Space) + { + if (_isStartSceneActive) + { + MediaPlayerStart.TogglePlayPause(); + } + else + { + MediaPlayerEnd.TogglePlayPause(); + } + + e.SuppressKeyPress = true; + } + } + } + + private void VisualSync_Shown(object sender, EventArgs e) + { + comboBoxStartTexts.Focus(); + } + + private void ButtonStartVerifyClick(object sender, EventArgs e) + { + if (MediaPlayerStart != null && MediaPlayerStart.VideoPlayer != null) + { + _startGoBackPosition = MediaPlayerStart.CurrentPosition; + _startStopPosition = _startGoBackPosition + Configuration.Settings.Tools.VerifyPlaySeconds; + MediaPlayerStart.Play(); + } + } + + private void ButtonEndVerifyClick(object sender, EventArgs e) + { + if (MediaPlayerEnd != null && MediaPlayerEnd.VideoPlayer != null) + { + _endGoBackPosition = MediaPlayerEnd.CurrentPosition; + _endStopPosition = _endGoBackPosition + Configuration.Settings.Tools.VerifyPlaySeconds; + MediaPlayerEnd.Play(); + } + } + + private void VisualSync_Load(object sender, EventArgs e) + { + LoadAndShowOriginalSubtitle(); + if (!string.IsNullOrEmpty(VideoFileName) && File.Exists(VideoFileName)) + { + OpenVideo(VideoFileName); + } + else if (!string.IsNullOrEmpty(_subtitleFileName)) + { + TryToFindAndOpenMovieFile(Path.GetDirectoryName(_subtitleFileName) + Path.DirectorySeparatorChar + Path.GetFileNameWithoutExtension(_subtitleFileName)); + } + + FormVisualSync_Resize(null, null); + } + + private void MediaPlayerStart_OnButtonClicked(object sender, EventArgs e) + { + if (!_isStartSceneActive) + { + HighlightStartScene(); + } + } + + private void MediaPlayerEnd_OnButtonClicked(object sender, EventArgs e) + { + if (_isStartSceneActive) + { + HighlightEndScene(); + } + } + + private void VisualSync_FormClosed(object sender, FormClosedEventArgs e) + { + if (MediaPlayerStart.VideoPlayer != null) // && MediaPlayerStart.VideoPlayer.GetType() == typeof(QuartsPlayer)) + { + MediaPlayerStart.VideoPlayer.Pause(); + MediaPlayerStart.VideoPlayer.DisposeVideoPlayer(); + } + if (MediaPlayerEnd.VideoPlayer != null) // && MediaPlayerEnd.VideoPlayer.GetType() == typeof(QuartsPlayer)) + { + MediaPlayerEnd.VideoPlayer.Pause(); + MediaPlayerEnd.VideoPlayer.DisposeVideoPlayer(); + } + } + + private void buttonOK_Click(object sender, EventArgs e) + { + OkPressed = true; + } + + private void timerProgressBarRefresh_Tick(object sender, EventArgs e) + { + timerProgressBarRefresh.Stop(); + if (MediaPlayerStart.VideoPlayer != null) // && MediaPlayerStart.VideoPlayer.GetType() == typeof(QuartsPlayer)) + { + MediaPlayerStart.RefreshProgressBar(); + } + if (MediaPlayerEnd.VideoPlayer != null) // && MediaPlayerEnd.VideoPlayer.GetType() == typeof(QuartsPlayer)) + { + MediaPlayerEnd.RefreshProgressBar(); + } + timerProgressBarRefresh.Start(); + } + + private void SetSyncFactorLabel(double videoPlayerCurrentStartPos, double videoPlayerCurrentEndPos) + { + if (string.IsNullOrWhiteSpace(VideoFileName)) + { + return; + } + + _adjustInfo = string.Empty; + if (videoPlayerCurrentEndPos > videoPlayerCurrentStartPos) + { + double subStart = _paragraphs[comboBoxStartTexts.SelectedIndex].StartTime.TotalMilliseconds / TimeCode.BaseUnit; + double subEnd = _paragraphs[comboBoxEndTexts.SelectedIndex].StartTime.TotalMilliseconds / TimeCode.BaseUnit; + + double subDiff = subEnd - subStart; + double realDiff = videoPlayerCurrentEndPos - videoPlayerCurrentStartPos; + + // speed factor + double factor = realDiff / subDiff; + + // adjust to starting position + double adjust = videoPlayerCurrentStartPos - subStart * factor; + + if (Math.Abs(adjust) > 0.001 || (Math.Abs(1 - factor)) > 0.001) + { + _adjustInfo = string.Format("*{0:0.000}, {1:+0.000;-0.000}", factor, adjust); + } + } + } + + } +} diff --git a/src/Forms/VisualSync.resx b/src/ui/Forms/VisualSync.resx similarity index 98% rename from src/Forms/VisualSync.resx rename to src/ui/Forms/VisualSync.resx index 085cb3321..4405cc98f 100644 --- a/src/Forms/VisualSync.resx +++ b/src/ui/Forms/VisualSync.resx @@ -1,129 +1,129 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - 100, 17 - - - 327, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 100, 17 + + + 327, 17 + \ No newline at end of file diff --git a/src/Forms/Watermark.Designer.cs b/src/ui/Forms/Watermark.Designer.cs similarity index 97% rename from src/Forms/Watermark.Designer.cs rename to src/ui/Forms/Watermark.Designer.cs index 1f33b8eb7..d7ad25312 100644 --- a/src/Forms/Watermark.Designer.cs +++ b/src/ui/Forms/Watermark.Designer.cs @@ -1,160 +1,160 @@ -namespace Nikse.SubtitleEdit.Forms -{ - partial class Watermark - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.labelWatermark = new System.Windows.Forms.Label(); - this.groupBoxGenerate = new System.Windows.Forms.GroupBox(); - this.textBoxWatermark = new System.Windows.Forms.TextBox(); - this.radioButtonSpread = new System.Windows.Forms.RadioButton(); - this.radioButtonCurrentLine = new System.Windows.Forms.RadioButton(); - this.buttonGenerate = new System.Windows.Forms.Button(); - this.buttonRemove = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.groupBoxGenerate.SuspendLayout(); - this.SuspendLayout(); - // - // labelWatermark - // - this.labelWatermark.AutoSize = true; - this.labelWatermark.Location = new System.Drawing.Point(4, 19); - this.labelWatermark.Name = "labelWatermark"; - this.labelWatermark.Size = new System.Drawing.Size(62, 13); - this.labelWatermark.TabIndex = 0; - this.labelWatermark.Text = "Watermark:"; - // - // groupBoxGenerate - // - this.groupBoxGenerate.Controls.Add(this.textBoxWatermark); - this.groupBoxGenerate.Controls.Add(this.radioButtonSpread); - this.groupBoxGenerate.Controls.Add(this.radioButtonCurrentLine); - this.groupBoxGenerate.Controls.Add(this.buttonGenerate); - this.groupBoxGenerate.Location = new System.Drawing.Point(7, 69); - this.groupBoxGenerate.Name = "groupBoxGenerate"; - this.groupBoxGenerate.Size = new System.Drawing.Size(344, 100); - this.groupBoxGenerate.TabIndex = 1; - this.groupBoxGenerate.TabStop = false; - this.groupBoxGenerate.Text = "Generate watermark"; - // - // textBoxWatermark - // - this.textBoxWatermark.Location = new System.Drawing.Point(87, 68); - this.textBoxWatermark.MaxLength = 50; - this.textBoxWatermark.Name = "textBoxWatermark"; - this.textBoxWatermark.Size = new System.Drawing.Size(195, 20); - this.textBoxWatermark.TabIndex = 1; - // - // radioButtonSpread - // - this.radioButtonSpread.AutoSize = true; - this.radioButtonSpread.Checked = true; - this.radioButtonSpread.Location = new System.Drawing.Point(6, 19); - this.radioButtonSpread.Name = "radioButtonSpread"; - this.radioButtonSpread.Size = new System.Drawing.Size(148, 17); - this.radioButtonSpread.TabIndex = 2; - this.radioButtonSpread.TabStop = true; - this.radioButtonSpread.Text = "Spread over entire subtitle"; - this.radioButtonSpread.UseVisualStyleBackColor = true; - // - // radioButtonCurrentLine - // - this.radioButtonCurrentLine.AutoSize = true; - this.radioButtonCurrentLine.Location = new System.Drawing.Point(6, 42); - this.radioButtonCurrentLine.Name = "radioButtonCurrentLine"; - this.radioButtonCurrentLine.Size = new System.Drawing.Size(119, 17); - this.radioButtonCurrentLine.TabIndex = 1; - this.radioButtonCurrentLine.Text = "Only on current line:"; - this.radioButtonCurrentLine.UseVisualStyleBackColor = true; - // - // buttonGenerate - // - this.buttonGenerate.Location = new System.Drawing.Point(6, 65); - this.buttonGenerate.Name = "buttonGenerate"; - this.buttonGenerate.Size = new System.Drawing.Size(75, 23); - this.buttonGenerate.TabIndex = 0; - this.buttonGenerate.Text = "Generate"; - this.buttonGenerate.UseVisualStyleBackColor = true; - this.buttonGenerate.Click += new System.EventHandler(this.buttonGenerate_Click); - // - // buttonRemove - // - this.buttonRemove.Location = new System.Drawing.Point(7, 38); - this.buttonRemove.Name = "buttonRemove"; - this.buttonRemove.Size = new System.Drawing.Size(75, 23); - this.buttonRemove.TabIndex = 0; - this.buttonRemove.Text = "Remove"; - this.buttonRemove.UseVisualStyleBackColor = true; - this.buttonRemove.Click += new System.EventHandler(this.buttonRemove_Click); - // - // buttonOK - // - this.buttonOK.Location = new System.Drawing.Point(276, 175); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 1; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // Watermark - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(356, 202); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.buttonRemove); - this.Controls.Add(this.groupBoxGenerate); - this.Controls.Add(this.labelWatermark); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "Watermark"; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Watermark"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Watermark_KeyDown); - this.groupBoxGenerate.ResumeLayout(false); - this.groupBoxGenerate.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Label labelWatermark; - private System.Windows.Forms.GroupBox groupBoxGenerate; - private System.Windows.Forms.RadioButton radioButtonSpread; - private System.Windows.Forms.RadioButton radioButtonCurrentLine; - private System.Windows.Forms.Button buttonGenerate; - private System.Windows.Forms.Button buttonRemove; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.TextBox textBoxWatermark; - } +namespace Nikse.SubtitleEdit.Forms +{ + partial class Watermark + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.labelWatermark = new System.Windows.Forms.Label(); + this.groupBoxGenerate = new System.Windows.Forms.GroupBox(); + this.textBoxWatermark = new System.Windows.Forms.TextBox(); + this.radioButtonSpread = new System.Windows.Forms.RadioButton(); + this.radioButtonCurrentLine = new System.Windows.Forms.RadioButton(); + this.buttonGenerate = new System.Windows.Forms.Button(); + this.buttonRemove = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.groupBoxGenerate.SuspendLayout(); + this.SuspendLayout(); + // + // labelWatermark + // + this.labelWatermark.AutoSize = true; + this.labelWatermark.Location = new System.Drawing.Point(4, 19); + this.labelWatermark.Name = "labelWatermark"; + this.labelWatermark.Size = new System.Drawing.Size(62, 13); + this.labelWatermark.TabIndex = 0; + this.labelWatermark.Text = "Watermark:"; + // + // groupBoxGenerate + // + this.groupBoxGenerate.Controls.Add(this.textBoxWatermark); + this.groupBoxGenerate.Controls.Add(this.radioButtonSpread); + this.groupBoxGenerate.Controls.Add(this.radioButtonCurrentLine); + this.groupBoxGenerate.Controls.Add(this.buttonGenerate); + this.groupBoxGenerate.Location = new System.Drawing.Point(7, 69); + this.groupBoxGenerate.Name = "groupBoxGenerate"; + this.groupBoxGenerate.Size = new System.Drawing.Size(344, 100); + this.groupBoxGenerate.TabIndex = 1; + this.groupBoxGenerate.TabStop = false; + this.groupBoxGenerate.Text = "Generate watermark"; + // + // textBoxWatermark + // + this.textBoxWatermark.Location = new System.Drawing.Point(87, 68); + this.textBoxWatermark.MaxLength = 50; + this.textBoxWatermark.Name = "textBoxWatermark"; + this.textBoxWatermark.Size = new System.Drawing.Size(195, 20); + this.textBoxWatermark.TabIndex = 1; + // + // radioButtonSpread + // + this.radioButtonSpread.AutoSize = true; + this.radioButtonSpread.Checked = true; + this.radioButtonSpread.Location = new System.Drawing.Point(6, 19); + this.radioButtonSpread.Name = "radioButtonSpread"; + this.radioButtonSpread.Size = new System.Drawing.Size(148, 17); + this.radioButtonSpread.TabIndex = 2; + this.radioButtonSpread.TabStop = true; + this.radioButtonSpread.Text = "Spread over entire subtitle"; + this.radioButtonSpread.UseVisualStyleBackColor = true; + // + // radioButtonCurrentLine + // + this.radioButtonCurrentLine.AutoSize = true; + this.radioButtonCurrentLine.Location = new System.Drawing.Point(6, 42); + this.radioButtonCurrentLine.Name = "radioButtonCurrentLine"; + this.radioButtonCurrentLine.Size = new System.Drawing.Size(119, 17); + this.radioButtonCurrentLine.TabIndex = 1; + this.radioButtonCurrentLine.Text = "Only on current line:"; + this.radioButtonCurrentLine.UseVisualStyleBackColor = true; + // + // buttonGenerate + // + this.buttonGenerate.Location = new System.Drawing.Point(6, 65); + this.buttonGenerate.Name = "buttonGenerate"; + this.buttonGenerate.Size = new System.Drawing.Size(75, 23); + this.buttonGenerate.TabIndex = 0; + this.buttonGenerate.Text = "Generate"; + this.buttonGenerate.UseVisualStyleBackColor = true; + this.buttonGenerate.Click += new System.EventHandler(this.buttonGenerate_Click); + // + // buttonRemove + // + this.buttonRemove.Location = new System.Drawing.Point(7, 38); + this.buttonRemove.Name = "buttonRemove"; + this.buttonRemove.Size = new System.Drawing.Size(75, 23); + this.buttonRemove.TabIndex = 0; + this.buttonRemove.Text = "Remove"; + this.buttonRemove.UseVisualStyleBackColor = true; + this.buttonRemove.Click += new System.EventHandler(this.buttonRemove_Click); + // + // buttonOK + // + this.buttonOK.Location = new System.Drawing.Point(276, 175); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 1; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // Watermark + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(356, 202); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.buttonRemove); + this.Controls.Add(this.groupBoxGenerate); + this.Controls.Add(this.labelWatermark); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "Watermark"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Watermark"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Watermark_KeyDown); + this.groupBoxGenerate.ResumeLayout(false); + this.groupBoxGenerate.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label labelWatermark; + private System.Windows.Forms.GroupBox groupBoxGenerate; + private System.Windows.Forms.RadioButton radioButtonSpread; + private System.Windows.Forms.RadioButton radioButtonCurrentLine; + private System.Windows.Forms.Button buttonGenerate; + private System.Windows.Forms.Button buttonRemove; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.TextBox textBoxWatermark; + } } \ No newline at end of file diff --git a/src/Forms/Watermark.cs b/src/ui/Forms/Watermark.cs similarity index 96% rename from src/Forms/Watermark.cs rename to src/ui/Forms/Watermark.cs index af43475d4..d5b16f41f 100644 --- a/src/Forms/Watermark.cs +++ b/src/ui/Forms/Watermark.cs @@ -1,233 +1,233 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Text; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class Watermark : Form - { - private const char ZeroWidthSpace = '\u200B'; - private const char ZeroWidthNoBreakSpace = '\uFEFF'; - - private readonly LanguageStructure.Watermark _language; - - private int _firstSelectedIndex; - - public Watermark() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - _language = Configuration.Settings.Language.Watermark; - Text = _language.Title; - groupBoxGenerate.Text = _language.GenerateWatermarkTitle; - radioButtonSpread.Text = _language.SpreadOverEntireSubtitle; - buttonGenerate.Text = _language.Generate; - buttonRemove.Text = _language.Remove; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - - UiUtil.FixLargeFonts(this, buttonOK); - } - - internal void Initialize(Subtitle subtitle, int firstSelectedIndex) - { - var watermark = ReadWaterMark(subtitle.GetAllTexts().Trim()); - labelWatermark.Text = string.Format(_language.WatermarkX, watermark); - if (watermark.Length == 0) - { - buttonRemove.Enabled = false; - textBoxWatermark.Focus(); - } - else - { - groupBoxGenerate.Enabled = false; - buttonOK.Focus(); - } - - _firstSelectedIndex = firstSelectedIndex; - var current = subtitle.GetParagraphOrDefault(_firstSelectedIndex); - if (current != null) - { - radioButtonCurrentLine.Text = string.Format(_language.CurrentLineOnlyX, UiUtil.GetListViewTextFromString(current.Text)); - } - else - { - radioButtonCurrentLine.Text = string.Format(_language.CurrentLineOnlyX, string.Empty); - radioButtonCurrentLine.Enabled = false; - } - } - - private static string ReadWaterMark(string input) - { - if (!input.Contains(ZeroWidthSpace)) - { - return string.Empty; - } - - int i = 0; - var sb = new StringBuilder(); - bool letterOn = false; - int letter = 0; - while (i < input.Length) - { - var c = input[i]; - if (c == ZeroWidthSpace) - { - if (letter > 0) - { - sb.Append(Encoding.ASCII.GetString(new[] { (byte)letter })); - } - - letterOn = true; - letter = 0; - } - else if (c == ZeroWidthNoBreakSpace && letterOn) - { - letter++; - } - else - { - if (letter > 0) - { - sb.Append(Encoding.ASCII.GetString(new[] { (byte)letter })); - } - - letterOn = false; - letter = 0; - } - i++; - } - return sb.ToString(); - } - - private void AddWaterMark(Subtitle subtitle, string input) - { - if (subtitle == null || subtitle.Paragraphs.Count == 0) - { - return; - } - - byte[] buffer = Encoding.ASCII.GetBytes(input); - - if (radioButtonCurrentLine.Checked) - { - StringBuilder sb = new StringBuilder(); - foreach (byte b in buffer) - { - sb.Append(ZeroWidthSpace); - for (int i = 0; i < b; i++) - { - sb.Append(ZeroWidthNoBreakSpace); - } - } - Paragraph p = subtitle.GetParagraphOrDefault(_firstSelectedIndex); - if (p != null) - { - if (p.Text.Length > 1) - { - p.Text = p.Text.Insert(p.Text.Length / 2, sb.ToString()); - } - else - { - p.Text = sb + p.Text; - } - } - } - else - { - Random r = new Random(); - List indices = new List(); - foreach (byte b in buffer) - { - int number = r.Next(subtitle.Paragraphs.Count - 1); - if (indices.Contains(number)) - { - number = r.Next(subtitle.Paragraphs.Count - 1); - } - - if (indices.Contains(number)) - { - number = r.Next(subtitle.Paragraphs.Count - 1); - } - - indices.Add(number); - } - - indices.Sort(); - int j = 0; - foreach (byte b in buffer) - { - StringBuilder sb = new StringBuilder(); - Paragraph p = subtitle.Paragraphs[indices[j]]; - sb.Append(ZeroWidthSpace); - for (int i = 0; i < b; i++) - { - sb.Append(ZeroWidthNoBreakSpace); - } - - if (p.Text.Length > 1) - { - p.Text = p.Text.Insert(p.Text.Length / 2, sb.ToString()); - } - else - { - p.Text = sb + p.Text; - } - - j++; - } - } - } - - private void buttonOK_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - internal void AddOrRemove(Subtitle subtitle) - { - if (groupBoxGenerate.Enabled) - { - AddWaterMark(subtitle, textBoxWatermark.Text); - } - else - { - RemoveWaterMark(subtitle); - } - } - - private static void RemoveWaterMark(Subtitle subtitle) - { - var zws = ZeroWidthSpace.ToString(CultureInfo.InvariantCulture); - var zwnbs = ZeroWidthNoBreakSpace.ToString(CultureInfo.InvariantCulture); - foreach (Paragraph p in subtitle.Paragraphs) - { - p.Text = p.Text.Replace(zws, string.Empty).Replace(zwnbs, string.Empty); - } - } - - private void buttonGenerate_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.OK; - } - - private void buttonRemove_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.OK; - } - - private void Watermark_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class Watermark : Form + { + private const char ZeroWidthSpace = '\u200B'; + private const char ZeroWidthNoBreakSpace = '\uFEFF'; + + private readonly LanguageStructure.Watermark _language; + + private int _firstSelectedIndex; + + public Watermark() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + _language = Configuration.Settings.Language.Watermark; + Text = _language.Title; + groupBoxGenerate.Text = _language.GenerateWatermarkTitle; + radioButtonSpread.Text = _language.SpreadOverEntireSubtitle; + buttonGenerate.Text = _language.Generate; + buttonRemove.Text = _language.Remove; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + + UiUtil.FixLargeFonts(this, buttonOK); + } + + internal void Initialize(Subtitle subtitle, int firstSelectedIndex) + { + var watermark = ReadWaterMark(subtitle.GetAllTexts().Trim()); + labelWatermark.Text = string.Format(_language.WatermarkX, watermark); + if (watermark.Length == 0) + { + buttonRemove.Enabled = false; + textBoxWatermark.Focus(); + } + else + { + groupBoxGenerate.Enabled = false; + buttonOK.Focus(); + } + + _firstSelectedIndex = firstSelectedIndex; + var current = subtitle.GetParagraphOrDefault(_firstSelectedIndex); + if (current != null) + { + radioButtonCurrentLine.Text = string.Format(_language.CurrentLineOnlyX, UiUtil.GetListViewTextFromString(current.Text)); + } + else + { + radioButtonCurrentLine.Text = string.Format(_language.CurrentLineOnlyX, string.Empty); + radioButtonCurrentLine.Enabled = false; + } + } + + private static string ReadWaterMark(string input) + { + if (!input.Contains(ZeroWidthSpace)) + { + return string.Empty; + } + + int i = 0; + var sb = new StringBuilder(); + bool letterOn = false; + int letter = 0; + while (i < input.Length) + { + var c = input[i]; + if (c == ZeroWidthSpace) + { + if (letter > 0) + { + sb.Append(Encoding.ASCII.GetString(new[] { (byte)letter })); + } + + letterOn = true; + letter = 0; + } + else if (c == ZeroWidthNoBreakSpace && letterOn) + { + letter++; + } + else + { + if (letter > 0) + { + sb.Append(Encoding.ASCII.GetString(new[] { (byte)letter })); + } + + letterOn = false; + letter = 0; + } + i++; + } + return sb.ToString(); + } + + private void AddWaterMark(Subtitle subtitle, string input) + { + if (subtitle == null || subtitle.Paragraphs.Count == 0) + { + return; + } + + byte[] buffer = Encoding.ASCII.GetBytes(input); + + if (radioButtonCurrentLine.Checked) + { + StringBuilder sb = new StringBuilder(); + foreach (byte b in buffer) + { + sb.Append(ZeroWidthSpace); + for (int i = 0; i < b; i++) + { + sb.Append(ZeroWidthNoBreakSpace); + } + } + Paragraph p = subtitle.GetParagraphOrDefault(_firstSelectedIndex); + if (p != null) + { + if (p.Text.Length > 1) + { + p.Text = p.Text.Insert(p.Text.Length / 2, sb.ToString()); + } + else + { + p.Text = sb + p.Text; + } + } + } + else + { + Random r = new Random(); + List indices = new List(); + foreach (byte b in buffer) + { + int number = r.Next(subtitle.Paragraphs.Count - 1); + if (indices.Contains(number)) + { + number = r.Next(subtitle.Paragraphs.Count - 1); + } + + if (indices.Contains(number)) + { + number = r.Next(subtitle.Paragraphs.Count - 1); + } + + indices.Add(number); + } + + indices.Sort(); + int j = 0; + foreach (byte b in buffer) + { + StringBuilder sb = new StringBuilder(); + Paragraph p = subtitle.Paragraphs[indices[j]]; + sb.Append(ZeroWidthSpace); + for (int i = 0; i < b; i++) + { + sb.Append(ZeroWidthNoBreakSpace); + } + + if (p.Text.Length > 1) + { + p.Text = p.Text.Insert(p.Text.Length / 2, sb.ToString()); + } + else + { + p.Text = sb + p.Text; + } + + j++; + } + } + } + + private void buttonOK_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + internal void AddOrRemove(Subtitle subtitle) + { + if (groupBoxGenerate.Enabled) + { + AddWaterMark(subtitle, textBoxWatermark.Text); + } + else + { + RemoveWaterMark(subtitle); + } + } + + private static void RemoveWaterMark(Subtitle subtitle) + { + var zws = ZeroWidthSpace.ToString(CultureInfo.InvariantCulture); + var zwnbs = ZeroWidthNoBreakSpace.ToString(CultureInfo.InvariantCulture); + foreach (Paragraph p in subtitle.Paragraphs) + { + p.Text = p.Text.Replace(zws, string.Empty).Replace(zwnbs, string.Empty); + } + } + + private void buttonGenerate_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.OK; + } + + private void buttonRemove_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.OK; + } + + private void Watermark_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + } +} diff --git a/src/Forms/Watermark.resx b/src/ui/Forms/Watermark.resx similarity index 97% rename from src/Forms/Watermark.resx rename to src/ui/Forms/Watermark.resx index 29dcb1b3a..1af7de150 100644 --- a/src/Forms/Watermark.resx +++ b/src/ui/Forms/Watermark.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Forms/WaveformGenerateTimeCodes.Designer.cs b/src/ui/Forms/WaveformGenerateTimeCodes.Designer.cs similarity index 98% rename from src/Forms/WaveformGenerateTimeCodes.Designer.cs rename to src/ui/Forms/WaveformGenerateTimeCodes.Designer.cs index e2f87cc7c..59d35e685 100644 --- a/src/Forms/WaveformGenerateTimeCodes.Designer.cs +++ b/src/ui/Forms/WaveformGenerateTimeCodes.Designer.cs @@ -1,400 +1,400 @@ -namespace Nikse.SubtitleEdit.Forms -{ - sealed partial class WaveformGenerateTimeCodes - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonOK = new System.Windows.Forms.Button(); - this.groupBoxStartFrom = new System.Windows.Forms.GroupBox(); - this.radioButtonStartFromPos = new System.Windows.Forms.RadioButton(); - this.radioButtonStartFromStart = new System.Windows.Forms.RadioButton(); - this.labelAbove1 = new System.Windows.Forms.Label(); - this.numericUpDownMinVol = new System.Windows.Forms.NumericUpDown(); - this.groupBoxDeleteLines = new System.Windows.Forms.GroupBox(); - this.radioButtonDeleteNone = new System.Windows.Forms.RadioButton(); - this.radioButtonForward = new System.Windows.Forms.RadioButton(); - this.radioButtonDeleteAll = new System.Windows.Forms.RadioButton(); - this.groupBoxDetectOptions = new System.Windows.Forms.GroupBox(); - this.labelBelow2 = new System.Windows.Forms.Label(); - this.labelAbove2 = new System.Windows.Forms.Label(); - this.numericUpDownBlockSize = new System.Windows.Forms.NumericUpDown(); - this.labelScanBlocksMs = new System.Windows.Forms.Label(); - this.labelBelow1 = new System.Windows.Forms.Label(); - this.numericUpDownMaxVol = new System.Windows.Forms.NumericUpDown(); - this.groupBoxOther = new System.Windows.Forms.GroupBox(); - this.labelSplit2 = new System.Windows.Forms.Label(); - this.labelSplit1 = new System.Windows.Forms.Label(); - this.numericUpDownDefaultMilliseconds = new System.Windows.Forms.NumericUpDown(); - this.groupBoxStartFrom.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinVol)).BeginInit(); - this.groupBoxDeleteLines.SuspendLayout(); - this.groupBoxDetectOptions.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownBlockSize)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxVol)).BeginInit(); - this.groupBoxOther.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDefaultMilliseconds)).BeginInit(); - this.SuspendLayout(); - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonCancel.Location = new System.Drawing.Point(598, 389); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 4; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.buttonOK.Location = new System.Drawing.Point(517, 389); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 3; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // groupBoxStartFrom - // - this.groupBoxStartFrom.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxStartFrom.Controls.Add(this.radioButtonStartFromPos); - this.groupBoxStartFrom.Controls.Add(this.radioButtonStartFromStart); - this.groupBoxStartFrom.Location = new System.Drawing.Point(12, 12); - this.groupBoxStartFrom.Name = "groupBoxStartFrom"; - this.groupBoxStartFrom.Size = new System.Drawing.Size(661, 76); - this.groupBoxStartFrom.TabIndex = 5; - this.groupBoxStartFrom.TabStop = false; - this.groupBoxStartFrom.Text = "Start from"; - // - // radioButtonStartFromPos - // - this.radioButtonStartFromPos.AutoSize = true; - this.radioButtonStartFromPos.Checked = true; - this.radioButtonStartFromPos.Location = new System.Drawing.Point(10, 24); - this.radioButtonStartFromPos.Name = "radioButtonStartFromPos"; - this.radioButtonStartFromPos.Size = new System.Drawing.Size(127, 17); - this.radioButtonStartFromPos.TabIndex = 2; - this.radioButtonStartFromPos.TabStop = true; - this.radioButtonStartFromPos.Text = "Current video position"; - this.radioButtonStartFromPos.UseVisualStyleBackColor = true; - // - // radioButtonStartFromStart - // - this.radioButtonStartFromStart.AutoSize = true; - this.radioButtonStartFromStart.Location = new System.Drawing.Point(10, 47); - this.radioButtonStartFromStart.Name = "radioButtonStartFromStart"; - this.radioButtonStartFromStart.Size = new System.Drawing.Size(47, 17); - this.radioButtonStartFromStart.TabIndex = 0; - this.radioButtonStartFromStart.Text = "Start"; - this.radioButtonStartFromStart.UseVisualStyleBackColor = true; - // - // labelAbove1 - // - this.labelAbove1.AutoSize = true; - this.labelAbove1.Location = new System.Drawing.Point(6, 62); - this.labelAbove1.Name = "labelAbove1"; - this.labelAbove1.Size = new System.Drawing.Size(186, 13); - this.labelAbove1.TabIndex = 6; - this.labelAbove1.Text = "Block average volume must be above"; - // - // numericUpDownMinVol - // - this.numericUpDownMinVol.Location = new System.Drawing.Point(208, 60); - this.numericUpDownMinVol.Minimum = new decimal(new int[] { - 1, - 0, - 0, - 0}); - this.numericUpDownMinVol.Name = "numericUpDownMinVol"; - this.numericUpDownMinVol.Size = new System.Drawing.Size(51, 20); - this.numericUpDownMinVol.TabIndex = 7; - this.numericUpDownMinVol.Value = new decimal(new int[] { - 35, - 0, - 0, - 0}); - // - // groupBoxDeleteLines - // - this.groupBoxDeleteLines.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxDeleteLines.Controls.Add(this.radioButtonDeleteNone); - this.groupBoxDeleteLines.Controls.Add(this.radioButtonForward); - this.groupBoxDeleteLines.Controls.Add(this.radioButtonDeleteAll); - this.groupBoxDeleteLines.Location = new System.Drawing.Point(12, 94); - this.groupBoxDeleteLines.Name = "groupBoxDeleteLines"; - this.groupBoxDeleteLines.Size = new System.Drawing.Size(661, 99); - this.groupBoxDeleteLines.TabIndex = 6; - this.groupBoxDeleteLines.TabStop = false; - this.groupBoxDeleteLines.Text = "Delete lines"; - // - // radioButtonDeleteNone - // - this.radioButtonDeleteNone.AutoSize = true; - this.radioButtonDeleteNone.Location = new System.Drawing.Point(10, 47); - this.radioButtonDeleteNone.Name = "radioButtonDeleteNone"; - this.radioButtonDeleteNone.Size = new System.Drawing.Size(51, 17); - this.radioButtonDeleteNone.TabIndex = 2; - this.radioButtonDeleteNone.Text = "None"; - this.radioButtonDeleteNone.UseVisualStyleBackColor = true; - // - // radioButtonForward - // - this.radioButtonForward.AutoSize = true; - this.radioButtonForward.Checked = true; - this.radioButtonForward.Location = new System.Drawing.Point(10, 70); - this.radioButtonForward.Name = "radioButtonForward"; - this.radioButtonForward.Size = new System.Drawing.Size(152, 17); - this.radioButtonForward.TabIndex = 1; - this.radioButtonForward.TabStop = true; - this.radioButtonForward.Text = "From current video position"; - this.radioButtonForward.UseVisualStyleBackColor = true; - // - // radioButtonDeleteAll - // - this.radioButtonDeleteAll.AutoSize = true; - this.radioButtonDeleteAll.Location = new System.Drawing.Point(10, 24); - this.radioButtonDeleteAll.Name = "radioButtonDeleteAll"; - this.radioButtonDeleteAll.Size = new System.Drawing.Size(36, 17); - this.radioButtonDeleteAll.TabIndex = 0; - this.radioButtonDeleteAll.Text = "All"; - this.radioButtonDeleteAll.UseVisualStyleBackColor = true; - // - // groupBoxDetectOptions - // - this.groupBoxDetectOptions.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxDetectOptions.Controls.Add(this.labelBelow2); - this.groupBoxDetectOptions.Controls.Add(this.labelAbove2); - this.groupBoxDetectOptions.Controls.Add(this.numericUpDownBlockSize); - this.groupBoxDetectOptions.Controls.Add(this.labelScanBlocksMs); - this.groupBoxDetectOptions.Controls.Add(this.labelBelow1); - this.groupBoxDetectOptions.Controls.Add(this.numericUpDownMaxVol); - this.groupBoxDetectOptions.Controls.Add(this.labelAbove1); - this.groupBoxDetectOptions.Controls.Add(this.numericUpDownMinVol); - this.groupBoxDetectOptions.Location = new System.Drawing.Point(12, 199); - this.groupBoxDetectOptions.Name = "groupBoxDetectOptions"; - this.groupBoxDetectOptions.Size = new System.Drawing.Size(661, 121); - this.groupBoxDetectOptions.TabIndex = 6; - this.groupBoxDetectOptions.TabStop = false; - this.groupBoxDetectOptions.Text = "Detect options"; - // - // labelBelow2 - // - this.labelBelow2.AutoSize = true; - this.labelBelow2.Location = new System.Drawing.Point(265, 91); - this.labelBelow2.Name = "labelBelow2"; - this.labelBelow2.Size = new System.Drawing.Size(109, 13); - this.labelBelow2.TabIndex = 15; - this.labelBelow2.Text = "% of total max volume"; - // - // labelAbove2 - // - this.labelAbove2.AutoSize = true; - this.labelAbove2.Location = new System.Drawing.Point(265, 62); - this.labelAbove2.Name = "labelAbove2"; - this.labelAbove2.Size = new System.Drawing.Size(129, 13); - this.labelAbove2.TabIndex = 14; - this.labelAbove2.Text = "% of total average volume"; - // - // numericUpDownBlockSize - // - this.numericUpDownBlockSize.Location = new System.Drawing.Point(149, 24); - this.numericUpDownBlockSize.Maximum = new decimal(new int[] { - 300, - 0, - 0, - 0}); - this.numericUpDownBlockSize.Minimum = new decimal(new int[] { - 50, - 0, - 0, - 0}); - this.numericUpDownBlockSize.Name = "numericUpDownBlockSize"; - this.numericUpDownBlockSize.Size = new System.Drawing.Size(51, 20); - this.numericUpDownBlockSize.TabIndex = 13; - this.numericUpDownBlockSize.Value = new decimal(new int[] { - 100, - 0, - 0, - 0}); - // - // labelScanBlocksMs - // - this.labelScanBlocksMs.AutoSize = true; - this.labelScanBlocksMs.Location = new System.Drawing.Point(6, 26); - this.labelScanBlocksMs.Name = "labelScanBlocksMs"; - this.labelScanBlocksMs.Size = new System.Drawing.Size(137, 13); - this.labelScanBlocksMs.TabIndex = 12; - this.labelScanBlocksMs.Text = "Scan blocks of milliseconds"; - // - // labelBelow1 - // - this.labelBelow1.AutoSize = true; - this.labelBelow1.Location = new System.Drawing.Point(7, 89); - this.labelBelow1.Name = "labelBelow1"; - this.labelBelow1.Size = new System.Drawing.Size(184, 13); - this.labelBelow1.TabIndex = 9; - this.labelBelow1.Text = "Block average volume must be below"; - // - // numericUpDownMaxVol - // - this.numericUpDownMaxVol.Location = new System.Drawing.Point(208, 89); - this.numericUpDownMaxVol.Minimum = new decimal(new int[] { - 1, - 0, - 0, - 0}); - this.numericUpDownMaxVol.Name = "numericUpDownMaxVol"; - this.numericUpDownMaxVol.Size = new System.Drawing.Size(51, 20); - this.numericUpDownMaxVol.TabIndex = 10; - this.numericUpDownMaxVol.Value = new decimal(new int[] { - 70, - 0, - 0, - 0}); - // - // groupBoxOther - // - this.groupBoxOther.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBoxOther.Controls.Add(this.labelSplit2); - this.groupBoxOther.Controls.Add(this.labelSplit1); - this.groupBoxOther.Controls.Add(this.numericUpDownDefaultMilliseconds); - this.groupBoxOther.Location = new System.Drawing.Point(12, 326); - this.groupBoxOther.Name = "groupBoxOther"; - this.groupBoxOther.Size = new System.Drawing.Size(661, 57); - this.groupBoxOther.TabIndex = 7; - this.groupBoxOther.TabStop = false; - this.groupBoxOther.Text = "Other"; - // - // labelSplit2 - // - this.labelSplit2.AutoSize = true; - this.labelSplit2.Location = new System.Drawing.Point(185, 28); - this.labelSplit2.Name = "labelSplit2"; - this.labelSplit2.Size = new System.Drawing.Size(63, 13); - this.labelSplit2.TabIndex = 13; - this.labelSplit2.Text = "milliseconds"; - // - // labelSplit1 - // - this.labelSplit1.AutoSize = true; - this.labelSplit1.Location = new System.Drawing.Point(6, 28); - this.labelSplit1.Name = "labelSplit1"; - this.labelSplit1.Size = new System.Drawing.Size(103, 13); - this.labelSplit1.TabIndex = 12; - this.labelSplit1.Text = "Split long subtitles at"; - // - // numericUpDownDefaultMilliseconds - // - this.numericUpDownDefaultMilliseconds.Location = new System.Drawing.Point(111, 26); - this.numericUpDownDefaultMilliseconds.Maximum = new decimal(new int[] { - 99999, - 0, - 0, - 0}); - this.numericUpDownDefaultMilliseconds.Minimum = new decimal(new int[] { - 2000, - 0, - 0, - 0}); - this.numericUpDownDefaultMilliseconds.Name = "numericUpDownDefaultMilliseconds"; - this.numericUpDownDefaultMilliseconds.Size = new System.Drawing.Size(51, 20); - this.numericUpDownDefaultMilliseconds.TabIndex = 11; - this.numericUpDownDefaultMilliseconds.Value = new decimal(new int[] { - 3500, - 0, - 0, - 0}); - // - // WaveformGenerateTimeCodes - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(685, 422); - this.Controls.Add(this.groupBoxOther); - this.Controls.Add(this.groupBoxDetectOptions); - this.Controls.Add(this.groupBoxDeleteLines); - this.Controls.Add(this.groupBoxStartFrom); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.KeyPreview = true; - this.Name = "WaveformGenerateTimeCodes"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Guess time codes"; - this.groupBoxStartFrom.ResumeLayout(false); - this.groupBoxStartFrom.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinVol)).EndInit(); - this.groupBoxDeleteLines.ResumeLayout(false); - this.groupBoxDeleteLines.PerformLayout(); - this.groupBoxDetectOptions.ResumeLayout(false); - this.groupBoxDetectOptions.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownBlockSize)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxVol)).EndInit(); - this.groupBoxOther.ResumeLayout(false); - this.groupBoxOther.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDefaultMilliseconds)).EndInit(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.GroupBox groupBoxStartFrom; - private System.Windows.Forms.RadioButton radioButtonStartFromStart; - private System.Windows.Forms.Label labelAbove1; - private System.Windows.Forms.NumericUpDown numericUpDownMinVol; - private System.Windows.Forms.RadioButton radioButtonStartFromPos; - private System.Windows.Forms.GroupBox groupBoxDeleteLines; - private System.Windows.Forms.RadioButton radioButtonDeleteNone; - private System.Windows.Forms.RadioButton radioButtonForward; - private System.Windows.Forms.RadioButton radioButtonDeleteAll; - private System.Windows.Forms.GroupBox groupBoxDetectOptions; - private System.Windows.Forms.Label labelBelow1; - private System.Windows.Forms.NumericUpDown numericUpDownMaxVol; - private System.Windows.Forms.NumericUpDown numericUpDownBlockSize; - private System.Windows.Forms.Label labelScanBlocksMs; - private System.Windows.Forms.Label labelBelow2; - private System.Windows.Forms.Label labelAbove2; - private System.Windows.Forms.GroupBox groupBoxOther; - private System.Windows.Forms.Label labelSplit1; - private System.Windows.Forms.NumericUpDown numericUpDownDefaultMilliseconds; - private System.Windows.Forms.Label labelSplit2; - } +namespace Nikse.SubtitleEdit.Forms +{ + sealed partial class WaveformGenerateTimeCodes + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.groupBoxStartFrom = new System.Windows.Forms.GroupBox(); + this.radioButtonStartFromPos = new System.Windows.Forms.RadioButton(); + this.radioButtonStartFromStart = new System.Windows.Forms.RadioButton(); + this.labelAbove1 = new System.Windows.Forms.Label(); + this.numericUpDownMinVol = new System.Windows.Forms.NumericUpDown(); + this.groupBoxDeleteLines = new System.Windows.Forms.GroupBox(); + this.radioButtonDeleteNone = new System.Windows.Forms.RadioButton(); + this.radioButtonForward = new System.Windows.Forms.RadioButton(); + this.radioButtonDeleteAll = new System.Windows.Forms.RadioButton(); + this.groupBoxDetectOptions = new System.Windows.Forms.GroupBox(); + this.labelBelow2 = new System.Windows.Forms.Label(); + this.labelAbove2 = new System.Windows.Forms.Label(); + this.numericUpDownBlockSize = new System.Windows.Forms.NumericUpDown(); + this.labelScanBlocksMs = new System.Windows.Forms.Label(); + this.labelBelow1 = new System.Windows.Forms.Label(); + this.numericUpDownMaxVol = new System.Windows.Forms.NumericUpDown(); + this.groupBoxOther = new System.Windows.Forms.GroupBox(); + this.labelSplit2 = new System.Windows.Forms.Label(); + this.labelSplit1 = new System.Windows.Forms.Label(); + this.numericUpDownDefaultMilliseconds = new System.Windows.Forms.NumericUpDown(); + this.groupBoxStartFrom.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinVol)).BeginInit(); + this.groupBoxDeleteLines.SuspendLayout(); + this.groupBoxDetectOptions.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownBlockSize)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxVol)).BeginInit(); + this.groupBoxOther.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDefaultMilliseconds)).BeginInit(); + this.SuspendLayout(); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(598, 389); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 4; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(517, 389); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 3; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // groupBoxStartFrom + // + this.groupBoxStartFrom.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxStartFrom.Controls.Add(this.radioButtonStartFromPos); + this.groupBoxStartFrom.Controls.Add(this.radioButtonStartFromStart); + this.groupBoxStartFrom.Location = new System.Drawing.Point(12, 12); + this.groupBoxStartFrom.Name = "groupBoxStartFrom"; + this.groupBoxStartFrom.Size = new System.Drawing.Size(661, 76); + this.groupBoxStartFrom.TabIndex = 5; + this.groupBoxStartFrom.TabStop = false; + this.groupBoxStartFrom.Text = "Start from"; + // + // radioButtonStartFromPos + // + this.radioButtonStartFromPos.AutoSize = true; + this.radioButtonStartFromPos.Checked = true; + this.radioButtonStartFromPos.Location = new System.Drawing.Point(10, 24); + this.radioButtonStartFromPos.Name = "radioButtonStartFromPos"; + this.radioButtonStartFromPos.Size = new System.Drawing.Size(127, 17); + this.radioButtonStartFromPos.TabIndex = 2; + this.radioButtonStartFromPos.TabStop = true; + this.radioButtonStartFromPos.Text = "Current video position"; + this.radioButtonStartFromPos.UseVisualStyleBackColor = true; + // + // radioButtonStartFromStart + // + this.radioButtonStartFromStart.AutoSize = true; + this.radioButtonStartFromStart.Location = new System.Drawing.Point(10, 47); + this.radioButtonStartFromStart.Name = "radioButtonStartFromStart"; + this.radioButtonStartFromStart.Size = new System.Drawing.Size(47, 17); + this.radioButtonStartFromStart.TabIndex = 0; + this.radioButtonStartFromStart.Text = "Start"; + this.radioButtonStartFromStart.UseVisualStyleBackColor = true; + // + // labelAbove1 + // + this.labelAbove1.AutoSize = true; + this.labelAbove1.Location = new System.Drawing.Point(6, 62); + this.labelAbove1.Name = "labelAbove1"; + this.labelAbove1.Size = new System.Drawing.Size(186, 13); + this.labelAbove1.TabIndex = 6; + this.labelAbove1.Text = "Block average volume must be above"; + // + // numericUpDownMinVol + // + this.numericUpDownMinVol.Location = new System.Drawing.Point(208, 60); + this.numericUpDownMinVol.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownMinVol.Name = "numericUpDownMinVol"; + this.numericUpDownMinVol.Size = new System.Drawing.Size(51, 20); + this.numericUpDownMinVol.TabIndex = 7; + this.numericUpDownMinVol.Value = new decimal(new int[] { + 35, + 0, + 0, + 0}); + // + // groupBoxDeleteLines + // + this.groupBoxDeleteLines.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxDeleteLines.Controls.Add(this.radioButtonDeleteNone); + this.groupBoxDeleteLines.Controls.Add(this.radioButtonForward); + this.groupBoxDeleteLines.Controls.Add(this.radioButtonDeleteAll); + this.groupBoxDeleteLines.Location = new System.Drawing.Point(12, 94); + this.groupBoxDeleteLines.Name = "groupBoxDeleteLines"; + this.groupBoxDeleteLines.Size = new System.Drawing.Size(661, 99); + this.groupBoxDeleteLines.TabIndex = 6; + this.groupBoxDeleteLines.TabStop = false; + this.groupBoxDeleteLines.Text = "Delete lines"; + // + // radioButtonDeleteNone + // + this.radioButtonDeleteNone.AutoSize = true; + this.radioButtonDeleteNone.Location = new System.Drawing.Point(10, 47); + this.radioButtonDeleteNone.Name = "radioButtonDeleteNone"; + this.radioButtonDeleteNone.Size = new System.Drawing.Size(51, 17); + this.radioButtonDeleteNone.TabIndex = 2; + this.radioButtonDeleteNone.Text = "None"; + this.radioButtonDeleteNone.UseVisualStyleBackColor = true; + // + // radioButtonForward + // + this.radioButtonForward.AutoSize = true; + this.radioButtonForward.Checked = true; + this.radioButtonForward.Location = new System.Drawing.Point(10, 70); + this.radioButtonForward.Name = "radioButtonForward"; + this.radioButtonForward.Size = new System.Drawing.Size(152, 17); + this.radioButtonForward.TabIndex = 1; + this.radioButtonForward.TabStop = true; + this.radioButtonForward.Text = "From current video position"; + this.radioButtonForward.UseVisualStyleBackColor = true; + // + // radioButtonDeleteAll + // + this.radioButtonDeleteAll.AutoSize = true; + this.radioButtonDeleteAll.Location = new System.Drawing.Point(10, 24); + this.radioButtonDeleteAll.Name = "radioButtonDeleteAll"; + this.radioButtonDeleteAll.Size = new System.Drawing.Size(36, 17); + this.radioButtonDeleteAll.TabIndex = 0; + this.radioButtonDeleteAll.Text = "All"; + this.radioButtonDeleteAll.UseVisualStyleBackColor = true; + // + // groupBoxDetectOptions + // + this.groupBoxDetectOptions.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxDetectOptions.Controls.Add(this.labelBelow2); + this.groupBoxDetectOptions.Controls.Add(this.labelAbove2); + this.groupBoxDetectOptions.Controls.Add(this.numericUpDownBlockSize); + this.groupBoxDetectOptions.Controls.Add(this.labelScanBlocksMs); + this.groupBoxDetectOptions.Controls.Add(this.labelBelow1); + this.groupBoxDetectOptions.Controls.Add(this.numericUpDownMaxVol); + this.groupBoxDetectOptions.Controls.Add(this.labelAbove1); + this.groupBoxDetectOptions.Controls.Add(this.numericUpDownMinVol); + this.groupBoxDetectOptions.Location = new System.Drawing.Point(12, 199); + this.groupBoxDetectOptions.Name = "groupBoxDetectOptions"; + this.groupBoxDetectOptions.Size = new System.Drawing.Size(661, 121); + this.groupBoxDetectOptions.TabIndex = 6; + this.groupBoxDetectOptions.TabStop = false; + this.groupBoxDetectOptions.Text = "Detect options"; + // + // labelBelow2 + // + this.labelBelow2.AutoSize = true; + this.labelBelow2.Location = new System.Drawing.Point(265, 91); + this.labelBelow2.Name = "labelBelow2"; + this.labelBelow2.Size = new System.Drawing.Size(109, 13); + this.labelBelow2.TabIndex = 15; + this.labelBelow2.Text = "% of total max volume"; + // + // labelAbove2 + // + this.labelAbove2.AutoSize = true; + this.labelAbove2.Location = new System.Drawing.Point(265, 62); + this.labelAbove2.Name = "labelAbove2"; + this.labelAbove2.Size = new System.Drawing.Size(129, 13); + this.labelAbove2.TabIndex = 14; + this.labelAbove2.Text = "% of total average volume"; + // + // numericUpDownBlockSize + // + this.numericUpDownBlockSize.Location = new System.Drawing.Point(149, 24); + this.numericUpDownBlockSize.Maximum = new decimal(new int[] { + 300, + 0, + 0, + 0}); + this.numericUpDownBlockSize.Minimum = new decimal(new int[] { + 50, + 0, + 0, + 0}); + this.numericUpDownBlockSize.Name = "numericUpDownBlockSize"; + this.numericUpDownBlockSize.Size = new System.Drawing.Size(51, 20); + this.numericUpDownBlockSize.TabIndex = 13; + this.numericUpDownBlockSize.Value = new decimal(new int[] { + 100, + 0, + 0, + 0}); + // + // labelScanBlocksMs + // + this.labelScanBlocksMs.AutoSize = true; + this.labelScanBlocksMs.Location = new System.Drawing.Point(6, 26); + this.labelScanBlocksMs.Name = "labelScanBlocksMs"; + this.labelScanBlocksMs.Size = new System.Drawing.Size(137, 13); + this.labelScanBlocksMs.TabIndex = 12; + this.labelScanBlocksMs.Text = "Scan blocks of milliseconds"; + // + // labelBelow1 + // + this.labelBelow1.AutoSize = true; + this.labelBelow1.Location = new System.Drawing.Point(7, 89); + this.labelBelow1.Name = "labelBelow1"; + this.labelBelow1.Size = new System.Drawing.Size(184, 13); + this.labelBelow1.TabIndex = 9; + this.labelBelow1.Text = "Block average volume must be below"; + // + // numericUpDownMaxVol + // + this.numericUpDownMaxVol.Location = new System.Drawing.Point(208, 89); + this.numericUpDownMaxVol.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownMaxVol.Name = "numericUpDownMaxVol"; + this.numericUpDownMaxVol.Size = new System.Drawing.Size(51, 20); + this.numericUpDownMaxVol.TabIndex = 10; + this.numericUpDownMaxVol.Value = new decimal(new int[] { + 70, + 0, + 0, + 0}); + // + // groupBoxOther + // + this.groupBoxOther.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxOther.Controls.Add(this.labelSplit2); + this.groupBoxOther.Controls.Add(this.labelSplit1); + this.groupBoxOther.Controls.Add(this.numericUpDownDefaultMilliseconds); + this.groupBoxOther.Location = new System.Drawing.Point(12, 326); + this.groupBoxOther.Name = "groupBoxOther"; + this.groupBoxOther.Size = new System.Drawing.Size(661, 57); + this.groupBoxOther.TabIndex = 7; + this.groupBoxOther.TabStop = false; + this.groupBoxOther.Text = "Other"; + // + // labelSplit2 + // + this.labelSplit2.AutoSize = true; + this.labelSplit2.Location = new System.Drawing.Point(185, 28); + this.labelSplit2.Name = "labelSplit2"; + this.labelSplit2.Size = new System.Drawing.Size(63, 13); + this.labelSplit2.TabIndex = 13; + this.labelSplit2.Text = "milliseconds"; + // + // labelSplit1 + // + this.labelSplit1.AutoSize = true; + this.labelSplit1.Location = new System.Drawing.Point(6, 28); + this.labelSplit1.Name = "labelSplit1"; + this.labelSplit1.Size = new System.Drawing.Size(103, 13); + this.labelSplit1.TabIndex = 12; + this.labelSplit1.Text = "Split long subtitles at"; + // + // numericUpDownDefaultMilliseconds + // + this.numericUpDownDefaultMilliseconds.Location = new System.Drawing.Point(111, 26); + this.numericUpDownDefaultMilliseconds.Maximum = new decimal(new int[] { + 99999, + 0, + 0, + 0}); + this.numericUpDownDefaultMilliseconds.Minimum = new decimal(new int[] { + 2000, + 0, + 0, + 0}); + this.numericUpDownDefaultMilliseconds.Name = "numericUpDownDefaultMilliseconds"; + this.numericUpDownDefaultMilliseconds.Size = new System.Drawing.Size(51, 20); + this.numericUpDownDefaultMilliseconds.TabIndex = 11; + this.numericUpDownDefaultMilliseconds.Value = new decimal(new int[] { + 3500, + 0, + 0, + 0}); + // + // WaveformGenerateTimeCodes + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(685, 422); + this.Controls.Add(this.groupBoxOther); + this.Controls.Add(this.groupBoxDetectOptions); + this.Controls.Add(this.groupBoxDeleteLines); + this.Controls.Add(this.groupBoxStartFrom); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.KeyPreview = true; + this.Name = "WaveformGenerateTimeCodes"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Guess time codes"; + this.groupBoxStartFrom.ResumeLayout(false); + this.groupBoxStartFrom.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinVol)).EndInit(); + this.groupBoxDeleteLines.ResumeLayout(false); + this.groupBoxDeleteLines.PerformLayout(); + this.groupBoxDetectOptions.ResumeLayout(false); + this.groupBoxDetectOptions.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownBlockSize)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxVol)).EndInit(); + this.groupBoxOther.ResumeLayout(false); + this.groupBoxOther.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDefaultMilliseconds)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.GroupBox groupBoxStartFrom; + private System.Windows.Forms.RadioButton radioButtonStartFromStart; + private System.Windows.Forms.Label labelAbove1; + private System.Windows.Forms.NumericUpDown numericUpDownMinVol; + private System.Windows.Forms.RadioButton radioButtonStartFromPos; + private System.Windows.Forms.GroupBox groupBoxDeleteLines; + private System.Windows.Forms.RadioButton radioButtonDeleteNone; + private System.Windows.Forms.RadioButton radioButtonForward; + private System.Windows.Forms.RadioButton radioButtonDeleteAll; + private System.Windows.Forms.GroupBox groupBoxDetectOptions; + private System.Windows.Forms.Label labelBelow1; + private System.Windows.Forms.NumericUpDown numericUpDownMaxVol; + private System.Windows.Forms.NumericUpDown numericUpDownBlockSize; + private System.Windows.Forms.Label labelScanBlocksMs; + private System.Windows.Forms.Label labelBelow2; + private System.Windows.Forms.Label labelAbove2; + private System.Windows.Forms.GroupBox groupBoxOther; + private System.Windows.Forms.Label labelSplit1; + private System.Windows.Forms.NumericUpDown numericUpDownDefaultMilliseconds; + private System.Windows.Forms.Label labelSplit2; + } } \ No newline at end of file diff --git a/src/Forms/WaveformGenerateTimeCodes.cs b/src/ui/Forms/WaveformGenerateTimeCodes.cs similarity index 97% rename from src/Forms/WaveformGenerateTimeCodes.cs rename to src/ui/Forms/WaveformGenerateTimeCodes.cs index f78f1854c..14008f769 100644 --- a/src/Forms/WaveformGenerateTimeCodes.cs +++ b/src/ui/Forms/WaveformGenerateTimeCodes.cs @@ -1,75 +1,75 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class WaveformGenerateTimeCodes : Form - { - public bool StartFromVideoPosition { get; set; } - public bool DeleteAll { get; set; } - public bool DeleteForward { get; set; } - public int BlockSize { get; set; } - public int VolumeMinimum { get; set; } - public int VolumeMaximum { get; set; } - public int DefaultMilliseconds { get; set; } - - public WaveformGenerateTimeCodes() - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - var l = Configuration.Settings.Language.WaveformGenerateTimeCodes; - Text = l.Title; - groupBoxStartFrom.Text = l.StartFrom; - radioButtonStartFromPos.Text = l.CurrentVideoPosition; - radioButtonStartFromStart.Text = l.Beginning; - groupBoxDeleteLines.Text = l.DeleteLines; - groupBoxDetectOptions.Text = l.DetectOptions; - labelScanBlocksMs.Text = l.ScanBlocksOfMs; - labelAbove1.Text = l.BlockAverageVolMin1; - labelAbove2.Text = l.BlockAverageVolMin2; - labelBelow1.Text = l.BlockAverageVolMax1; - labelBelow2.Text = l.BlockAverageVolMax2; - groupBoxOther.Text = l.Other; - labelSplit1.Text = l.SplitLongLinesAt1; - labelSplit2.Text = l.SplitLongLinesAt2; - radioButtonDeleteAll.Text = Configuration.Settings.Language.General.All; - radioButtonDeleteNone.Text = Configuration.Settings.Language.General.None; - radioButtonForward.Text = l.FromCurrentVideoPosition; - - numericUpDownBlockSize.Left = labelScanBlocksMs.Left + labelScanBlocksMs.Width + 3; - numericUpDownMinVol.Left = labelAbove1.Left + labelAbove1.Width + 3; - labelAbove2.Left = numericUpDownMinVol.Left + numericUpDownMinVol.Width + 3; - numericUpDownMaxVol.Left = labelBelow1.Left + labelBelow1.Width + 3; - labelBelow2.Left = numericUpDownMaxVol.Left + numericUpDownMaxVol.Width + 3; - numericUpDownDefaultMilliseconds.Left = labelSplit1.Left + labelSplit1.Width + 3; - labelSplit2.Left = numericUpDownDefaultMilliseconds.Left + numericUpDownDefaultMilliseconds.Width + 3; - - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - UiUtil.FixLargeFonts(this, buttonOK); - } - - private void buttonOK_Click(object sender, EventArgs e) - { - StartFromVideoPosition = radioButtonStartFromPos.Checked; - DeleteAll = radioButtonDeleteAll.Checked; - DeleteForward = radioButtonForward.Checked; - BlockSize = (int)numericUpDownBlockSize.Value; - VolumeMinimum = (int)numericUpDownMinVol.Value; - VolumeMaximum = (int)numericUpDownMaxVol.Value; - DefaultMilliseconds = (int)numericUpDownDefaultMilliseconds.Value; - DialogResult = DialogResult.OK; - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class WaveformGenerateTimeCodes : Form + { + public bool StartFromVideoPosition { get; set; } + public bool DeleteAll { get; set; } + public bool DeleteForward { get; set; } + public int BlockSize { get; set; } + public int VolumeMinimum { get; set; } + public int VolumeMaximum { get; set; } + public int DefaultMilliseconds { get; set; } + + public WaveformGenerateTimeCodes() + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + var l = Configuration.Settings.Language.WaveformGenerateTimeCodes; + Text = l.Title; + groupBoxStartFrom.Text = l.StartFrom; + radioButtonStartFromPos.Text = l.CurrentVideoPosition; + radioButtonStartFromStart.Text = l.Beginning; + groupBoxDeleteLines.Text = l.DeleteLines; + groupBoxDetectOptions.Text = l.DetectOptions; + labelScanBlocksMs.Text = l.ScanBlocksOfMs; + labelAbove1.Text = l.BlockAverageVolMin1; + labelAbove2.Text = l.BlockAverageVolMin2; + labelBelow1.Text = l.BlockAverageVolMax1; + labelBelow2.Text = l.BlockAverageVolMax2; + groupBoxOther.Text = l.Other; + labelSplit1.Text = l.SplitLongLinesAt1; + labelSplit2.Text = l.SplitLongLinesAt2; + radioButtonDeleteAll.Text = Configuration.Settings.Language.General.All; + radioButtonDeleteNone.Text = Configuration.Settings.Language.General.None; + radioButtonForward.Text = l.FromCurrentVideoPosition; + + numericUpDownBlockSize.Left = labelScanBlocksMs.Left + labelScanBlocksMs.Width + 3; + numericUpDownMinVol.Left = labelAbove1.Left + labelAbove1.Width + 3; + labelAbove2.Left = numericUpDownMinVol.Left + numericUpDownMinVol.Width + 3; + numericUpDownMaxVol.Left = labelBelow1.Left + labelBelow1.Width + 3; + labelBelow2.Left = numericUpDownMaxVol.Left + numericUpDownMaxVol.Width + 3; + numericUpDownDefaultMilliseconds.Left = labelSplit1.Left + labelSplit1.Width + 3; + labelSplit2.Left = numericUpDownDefaultMilliseconds.Left + numericUpDownDefaultMilliseconds.Width + 3; + + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + UiUtil.FixLargeFonts(this, buttonOK); + } + + private void buttonOK_Click(object sender, EventArgs e) + { + StartFromVideoPosition = radioButtonStartFromPos.Checked; + DeleteAll = radioButtonDeleteAll.Checked; + DeleteForward = radioButtonForward.Checked; + BlockSize = (int)numericUpDownBlockSize.Value; + VolumeMinimum = (int)numericUpDownMinVol.Value; + VolumeMaximum = (int)numericUpDownMaxVol.Value; + DefaultMilliseconds = (int)numericUpDownDefaultMilliseconds.Value; + DialogResult = DialogResult.OK; + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + } +} diff --git a/src/Forms/WaveformGenerateTimeCodes.resx b/src/ui/Forms/WaveformGenerateTimeCodes.resx similarity index 97% rename from src/Forms/WaveformGenerateTimeCodes.resx rename to src/ui/Forms/WaveformGenerateTimeCodes.resx index 29dcb1b3a..1af7de150 100644 --- a/src/Forms/WaveformGenerateTimeCodes.resx +++ b/src/ui/Forms/WaveformGenerateTimeCodes.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Forms/WaveformUndocked.Designer.cs b/src/ui/Forms/WaveformUndocked.Designer.cs similarity index 97% rename from src/Forms/WaveformUndocked.Designer.cs rename to src/ui/Forms/WaveformUndocked.Designer.cs index 3bb8ecc15..f33a5592b 100644 --- a/src/Forms/WaveformUndocked.Designer.cs +++ b/src/ui/Forms/WaveformUndocked.Designer.cs @@ -1,64 +1,64 @@ -namespace Nikse.SubtitleEdit.Forms -{ - partial class WaveformUndocked - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.panelContainer = new System.Windows.Forms.Panel(); - this.SuspendLayout(); - // - // panelContainer - // - this.panelContainer.Dock = System.Windows.Forms.DockStyle.Fill; - this.panelContainer.Location = new System.Drawing.Point(0, 0); - this.panelContainer.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); - this.panelContainer.Name = "panelContainer"; - this.panelContainer.Size = new System.Drawing.Size(843, 250); - this.panelContainer.TabIndex = 1; - // - // WaveformUndocked - // - this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(843, 250); - this.Controls.Add(this.panelContainer); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow; - this.KeyPreview = true; - this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); - this.Name = "WaveformUndocked"; - this.Text = "WaveformUndocked"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.WaveformUndocked_FormClosing); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.WaveformUndocked_KeyDown); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Panel panelContainer; - } +namespace Nikse.SubtitleEdit.Forms +{ + partial class WaveformUndocked + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.panelContainer = new System.Windows.Forms.Panel(); + this.SuspendLayout(); + // + // panelContainer + // + this.panelContainer.Dock = System.Windows.Forms.DockStyle.Fill; + this.panelContainer.Location = new System.Drawing.Point(0, 0); + this.panelContainer.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.panelContainer.Name = "panelContainer"; + this.panelContainer.Size = new System.Drawing.Size(843, 250); + this.panelContainer.TabIndex = 1; + // + // WaveformUndocked + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(843, 250); + this.Controls.Add(this.panelContainer); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow; + this.KeyPreview = true; + this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.Name = "WaveformUndocked"; + this.Text = "WaveformUndocked"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.WaveformUndocked_FormClosing); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.WaveformUndocked_KeyDown); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel panelContainer; + } } \ No newline at end of file diff --git a/src/Forms/WaveformUndocked.cs b/src/ui/Forms/WaveformUndocked.cs similarity index 97% rename from src/Forms/WaveformUndocked.cs rename to src/ui/Forms/WaveformUndocked.cs index 273c8e37f..503c1f77c 100644 --- a/src/Forms/WaveformUndocked.cs +++ b/src/ui/Forms/WaveformUndocked.cs @@ -1,55 +1,55 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System.Drawing; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public partial class WaveformUndocked : PositionAndSizeForm - { - private readonly Main _mainForm; - private readonly Keys _redockKeys; - - public Panel PanelContainer => panelContainer; - - public WaveformUndocked(Main mainForm) - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - _mainForm = mainForm; - Icon = (Icon)mainForm.Icon.Clone(); - _redockKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainVideoToggleVideoControls); - } - - public WaveformUndocked() - { - } - - private void WaveformUndocked_FormClosing(object sender, FormClosingEventArgs e) - { - if (e.CloseReason == CloseReason.UserClosing && panelContainer.Controls.Count > 0) - { - var controlWaveform = panelContainer.Controls[0]; - var controlButtons = panelContainer.Controls[1]; - var controlTrackBar = panelContainer.Controls[2]; - panelContainer.Controls.Clear(); - _mainForm.ReDockWaveform(controlWaveform, controlButtons, controlTrackBar); - _mainForm.SetWaveformToggleOff(); - } - } - - private void WaveformUndocked_KeyDown(object sender, KeyEventArgs e) - { - if (_redockKeys == e.KeyData) - { - _mainForm.RedockVideoControlsToolStripMenuItemClick(null, null); - } - else - { - _mainForm.MainKeyDown(sender, e); - } - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System.Drawing; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public partial class WaveformUndocked : PositionAndSizeForm + { + private readonly Main _mainForm; + private readonly Keys _redockKeys; + + public Panel PanelContainer => panelContainer; + + public WaveformUndocked(Main mainForm) + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + _mainForm = mainForm; + Icon = (Icon)mainForm.Icon.Clone(); + _redockKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainVideoToggleVideoControls); + } + + public WaveformUndocked() + { + } + + private void WaveformUndocked_FormClosing(object sender, FormClosingEventArgs e) + { + if (e.CloseReason == CloseReason.UserClosing && panelContainer.Controls.Count > 0) + { + var controlWaveform = panelContainer.Controls[0]; + var controlButtons = panelContainer.Controls[1]; + var controlTrackBar = panelContainer.Controls[2]; + panelContainer.Controls.Clear(); + _mainForm.ReDockWaveform(controlWaveform, controlButtons, controlTrackBar); + _mainForm.SetWaveformToggleOff(); + } + } + + private void WaveformUndocked_KeyDown(object sender, KeyEventArgs e) + { + if (_redockKeys == e.KeyData) + { + _mainForm.RedockVideoControlsToolStripMenuItemClick(null, null); + } + else + { + _mainForm.MainKeyDown(sender, e); + } + } + } +} diff --git a/src/Forms/WaveformUndocked.resx b/src/ui/Forms/WaveformUndocked.resx similarity index 97% rename from src/Forms/WaveformUndocked.resx rename to src/ui/Forms/WaveformUndocked.resx index 4f24d55cd..8b2ff64a1 100644 --- a/src/Forms/WaveformUndocked.resx +++ b/src/ui/Forms/WaveformUndocked.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Forms/YouTubeAnnotationsImport.Designer.cs b/src/ui/Forms/YouTubeAnnotationsImport.Designer.cs similarity index 97% rename from src/Forms/YouTubeAnnotationsImport.Designer.cs rename to src/ui/Forms/YouTubeAnnotationsImport.Designer.cs index 2ff3c608e..ccffb65f0 100644 --- a/src/Forms/YouTubeAnnotationsImport.Designer.cs +++ b/src/ui/Forms/YouTubeAnnotationsImport.Designer.cs @@ -1,125 +1,125 @@ -namespace Nikse.SubtitleEdit.Forms -{ - partial class YouTubeAnnotationsImport - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.buttonOK = new System.Windows.Forms.Button(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.listViewFixes = new System.Windows.Forms.ListView(); - this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader7 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.SuspendLayout(); - // - // buttonOK - // - this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; - this.buttonOK.Location = new System.Drawing.Point(360, 259); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(75, 23); - this.buttonOK.TabIndex = 3; - this.buttonOK.Text = "&OK"; - this.buttonOK.UseVisualStyleBackColor = true; - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.Location = new System.Drawing.Point(442, 259); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 23); - this.buttonCancel.TabIndex = 4; - this.buttonCancel.Text = "C&ancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - // - // listViewFixes - // - this.listViewFixes.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.listViewFixes.CheckBoxes = true; - this.listViewFixes.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeader4, - this.columnHeader5, - this.columnHeader7}); - this.listViewFixes.FullRowSelect = true; - this.listViewFixes.HideSelection = false; - this.listViewFixes.Location = new System.Drawing.Point(12, 12); - this.listViewFixes.Name = "listViewFixes"; - this.listViewFixes.Size = new System.Drawing.Size(505, 241); - this.listViewFixes.TabIndex = 5; - this.listViewFixes.UseCompatibleStateImageBehavior = false; - this.listViewFixes.View = System.Windows.Forms.View.Details; - // - // columnHeader4 - // - this.columnHeader4.Text = "Apply"; - this.columnHeader4.Width = 45; - // - // columnHeader5 - // - this.columnHeader5.Text = "Style"; - this.columnHeader5.Width = 150; - // - // columnHeader7 - // - this.columnHeader7.Text = "#"; - this.columnHeader7.Width = 300; - // - // YouTubeAnnotationsImport - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(529, 292); - this.Controls.Add(this.listViewFixes); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.buttonCancel); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.KeyPreview = true; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "YouTubeAnnotationsImport"; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "YouTubeAnnotationsImport"; - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.YouTubeAnnotationsImport_KeyDown); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.ListView listViewFixes; - private System.Windows.Forms.ColumnHeader columnHeader4; - private System.Windows.Forms.ColumnHeader columnHeader5; - private System.Windows.Forms.ColumnHeader columnHeader7; - } +namespace Nikse.SubtitleEdit.Forms +{ + partial class YouTubeAnnotationsImport + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.buttonOK = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.listViewFixes = new System.Windows.Forms.ListView(); + this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader7 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.SuspendLayout(); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; + this.buttonOK.Location = new System.Drawing.Point(360, 259); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 3; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.Location = new System.Drawing.Point(442, 259); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 4; + this.buttonCancel.Text = "C&ancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + // + // listViewFixes + // + this.listViewFixes.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listViewFixes.CheckBoxes = true; + this.listViewFixes.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader4, + this.columnHeader5, + this.columnHeader7}); + this.listViewFixes.FullRowSelect = true; + this.listViewFixes.HideSelection = false; + this.listViewFixes.Location = new System.Drawing.Point(12, 12); + this.listViewFixes.Name = "listViewFixes"; + this.listViewFixes.Size = new System.Drawing.Size(505, 241); + this.listViewFixes.TabIndex = 5; + this.listViewFixes.UseCompatibleStateImageBehavior = false; + this.listViewFixes.View = System.Windows.Forms.View.Details; + // + // columnHeader4 + // + this.columnHeader4.Text = "Apply"; + this.columnHeader4.Width = 45; + // + // columnHeader5 + // + this.columnHeader5.Text = "Style"; + this.columnHeader5.Width = 150; + // + // columnHeader7 + // + this.columnHeader7.Text = "#"; + this.columnHeader7.Width = 300; + // + // YouTubeAnnotationsImport + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(529, 292); + this.Controls.Add(this.listViewFixes); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.buttonCancel); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "YouTubeAnnotationsImport"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "YouTubeAnnotationsImport"; + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.YouTubeAnnotationsImport_KeyDown); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.ListView listViewFixes; + private System.Windows.Forms.ColumnHeader columnHeader4; + private System.Windows.Forms.ColumnHeader columnHeader5; + private System.Windows.Forms.ColumnHeader columnHeader7; + } } \ No newline at end of file diff --git a/src/Forms/YouTubeAnnotationsImport.cs b/src/ui/Forms/YouTubeAnnotationsImport.cs similarity index 97% rename from src/Forms/YouTubeAnnotationsImport.cs rename to src/ui/Forms/YouTubeAnnotationsImport.cs index 7104eae7c..a954d5b1b 100644 --- a/src/Forms/YouTubeAnnotationsImport.cs +++ b/src/ui/Forms/YouTubeAnnotationsImport.cs @@ -1,57 +1,57 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Logic; -using System.Collections.Generic; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Forms -{ - public sealed partial class YouTubeAnnotationsImport : Form - { - public YouTubeAnnotationsImport(Dictionary stylesWithCount) - { - UiUtil.PreInitialize(this); - InitializeComponent(); - UiUtil.FixFonts(this); - - Text = "YouTube Annotations"; - buttonOK.Text = Configuration.Settings.Language.General.Ok; - buttonCancel.Text = Configuration.Settings.Language.General.Cancel; - listViewFixes.Columns[1].Text = string.Empty; // style // TODO: Add better text + help text - UiUtil.FixLargeFonts(this, buttonOK); - - foreach (KeyValuePair kvp in stylesWithCount) - { - ListViewItem item = new ListViewItem(); - item.SubItems.Add(kvp.Key); - item.SubItems.Add(kvp.Value.ToString()); - item.Checked = kvp.Key.Trim() == "speech"; - listViewFixes.Items.Add(item); - } - } - - public List SelectedStyles - { - get - { - List styles = new List(); - foreach (ListViewItem item in listViewFixes.Items) - { - if (item.Checked) - { - styles.Add(item.SubItems[1].Text); - } - } - return styles; - } - } - - private void YouTubeAnnotationsImport_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - DialogResult = DialogResult.Cancel; - } - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Logic; +using System.Collections.Generic; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Forms +{ + public sealed partial class YouTubeAnnotationsImport : Form + { + public YouTubeAnnotationsImport(Dictionary stylesWithCount) + { + UiUtil.PreInitialize(this); + InitializeComponent(); + UiUtil.FixFonts(this); + + Text = "YouTube Annotations"; + buttonOK.Text = Configuration.Settings.Language.General.Ok; + buttonCancel.Text = Configuration.Settings.Language.General.Cancel; + listViewFixes.Columns[1].Text = string.Empty; // style // TODO: Add better text + help text + UiUtil.FixLargeFonts(this, buttonOK); + + foreach (KeyValuePair kvp in stylesWithCount) + { + ListViewItem item = new ListViewItem(); + item.SubItems.Add(kvp.Key); + item.SubItems.Add(kvp.Value.ToString()); + item.Checked = kvp.Key.Trim() == "speech"; + listViewFixes.Items.Add(item); + } + } + + public List SelectedStyles + { + get + { + List styles = new List(); + foreach (ListViewItem item in listViewFixes.Items) + { + if (item.Checked) + { + styles.Add(item.SubItems[1].Text); + } + } + return styles; + } + } + + private void YouTubeAnnotationsImport_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + DialogResult = DialogResult.Cancel; + } + } + } +} diff --git a/src/Forms/YouTubeAnnotationsImport.resx b/src/ui/Forms/YouTubeAnnotationsImport.resx similarity index 97% rename from src/Forms/YouTubeAnnotationsImport.resx rename to src/ui/Forms/YouTubeAnnotationsImport.resx index 29dcb1b3a..1af7de150 100644 --- a/src/Forms/YouTubeAnnotationsImport.resx +++ b/src/ui/Forms/YouTubeAnnotationsImport.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/src/Icons/Donate.png b/src/ui/Icons/Donate.png similarity index 100% rename from src/Icons/Donate.png rename to src/ui/Icons/Donate.png diff --git a/src/Icons/Find.png b/src/ui/Icons/Find.png similarity index 100% rename from src/Icons/Find.png rename to src/ui/Icons/Find.png diff --git a/src/Icons/FixCommonErrors.png b/src/ui/Icons/FixCommonErrors.png similarity index 100% rename from src/Icons/FixCommonErrors.png rename to src/ui/Icons/FixCommonErrors.png diff --git a/src/Icons/Help.png b/src/ui/Icons/Help.png similarity index 100% rename from src/Icons/Help.png rename to src/ui/Icons/Help.png diff --git a/src/Icons/New.png b/src/ui/Icons/New.png similarity index 100% rename from src/Icons/New.png rename to src/ui/Icons/New.png diff --git a/src/Icons/Open.png b/src/ui/Icons/Open.png similarity index 100% rename from src/Icons/Open.png rename to src/ui/Icons/Open.png diff --git a/src/Icons/RemoveTextForHI.png b/src/ui/Icons/RemoveTextForHI.png similarity index 100% rename from src/Icons/RemoveTextForHI.png rename to src/ui/Icons/RemoveTextForHI.png diff --git a/src/Icons/Replace.png b/src/ui/Icons/Replace.png similarity index 100% rename from src/Icons/Replace.png rename to src/ui/Icons/Replace.png diff --git a/src/Icons/SE.ico b/src/ui/Icons/SE.ico similarity index 100% rename from src/Icons/SE.ico rename to src/ui/Icons/SE.ico diff --git a/src/Icons/Save.png b/src/ui/Icons/Save.png similarity index 100% rename from src/Icons/Save.png rename to src/ui/Icons/Save.png diff --git a/src/Icons/SaveAs.png b/src/ui/Icons/SaveAs.png similarity index 100% rename from src/Icons/SaveAs.png rename to src/ui/Icons/SaveAs.png diff --git a/src/Icons/Settings.png b/src/ui/Icons/Settings.png similarity index 100% rename from src/Icons/Settings.png rename to src/ui/Icons/Settings.png diff --git a/src/Icons/SpellCheck.png b/src/ui/Icons/SpellCheck.png similarity index 100% rename from src/Icons/SpellCheck.png rename to src/ui/Icons/SpellCheck.png diff --git a/src/Icons/VideoToggle.png b/src/ui/Icons/VideoToggle.png similarity index 100% rename from src/Icons/VideoToggle.png rename to src/ui/Icons/VideoToggle.png diff --git a/src/Icons/VisualSync.png b/src/ui/Icons/VisualSync.png similarity index 100% rename from src/Icons/VisualSync.png rename to src/ui/Icons/VisualSync.png diff --git a/src/Icons/WaveformToggle.png b/src/ui/Icons/WaveformToggle.png similarity index 100% rename from src/Icons/WaveformToggle.png rename to src/ui/Icons/WaveformToggle.png diff --git a/src/Icons/connect.png b/src/ui/Icons/connect.png similarity index 100% rename from src/Icons/connect.png rename to src/ui/Icons/connect.png diff --git a/src/ui/Languages/XmlContentTranslator.exe b/src/ui/Languages/XmlContentTranslator.exe new file mode 100644 index 0000000000000000000000000000000000000000..97d2596723f591b8d167d33178d34982a78ed77c GIT binary patch literal 83968 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

Tp)EC25#kbZ8Jr-0Sh92)Yt~{UWBAT?(@5L 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 literal 0 HcmV?d00001 diff --git a/src/Languages/ar-EG.xml b/src/ui/Languages/ar-EG.xml similarity index 100% rename from src/Languages/ar-EG.xml rename to src/ui/Languages/ar-EG.xml diff --git a/src/Languages/bg-BG.xml b/src/ui/Languages/bg-BG.xml similarity index 100% rename from src/Languages/bg-BG.xml rename to src/ui/Languages/bg-BG.xml diff --git a/src/Languages/br-FR.xml b/src/ui/Languages/br-FR.xml similarity index 100% rename from src/Languages/br-FR.xml rename to src/ui/Languages/br-FR.xml diff --git a/src/Languages/ca-ES.xml b/src/ui/Languages/ca-ES.xml similarity index 100% rename from src/Languages/ca-ES.xml rename to src/ui/Languages/ca-ES.xml diff --git a/src/Languages/cs-CZ.xml b/src/ui/Languages/cs-CZ.xml similarity index 100% rename from src/Languages/cs-CZ.xml rename to src/ui/Languages/cs-CZ.xml diff --git a/src/Languages/da-DK.xml b/src/ui/Languages/da-DK.xml similarity index 100% rename from src/Languages/da-DK.xml rename to src/ui/Languages/da-DK.xml diff --git a/src/Languages/de-DE.xml b/src/ui/Languages/de-DE.xml similarity index 100% rename from src/Languages/de-DE.xml rename to src/ui/Languages/de-DE.xml diff --git a/src/Languages/el-GR.xml b/src/ui/Languages/el-GR.xml similarity index 98% rename from src/Languages/el-GR.xml rename to src/ui/Languages/el-GR.xml index a546f150e..43a26582f 100644 --- a/src/Languages/el-GR.xml +++ b/src/ui/Languages/el-GR.xml @@ -1,2783 +1,2783 @@ - - - - Subtitle Edit - 3.5.18 - Μετάφραση: Παναγιώτης Μητσάκης - el-GR - - &Εντάξει - &Ακύρωση - Εφαρμογή - Κανένα - Όλα - Προεπισκόπηση - Αρχεία υπότιτλου - Όλα τα αρχεία - Αρχεία βίντεο - Αρχεία ήχου - Άνοιγμα υπότιτλου... - Άνοιγμα αρχείου βίντεο... - Άνοιγμα αρχείου βίντεο... - Μη φορτωμένο βίντεο - Πληροφορίες βίντεο - Έναρξη - Λήξη - Διάρκεια - Χαρακτήρες/δευτερόλεπτο - Λέξεις/λεπτό - Ηθοποιός - Κενό - Περιοχή - # - Αριθμός - Κείμενο - Ώρες:λεπτά:δευτ.:χιλ. - Ώρες:λεπτά:δευτ:καρέ - Έντονα - Πλαγιαστά - Υπογραμμισμένα - Ορατό - Ρυθμός καρέ - Όνομα - Όνομα αρχείου: {0} ({1}) - Ανάλυση: {0} - Ρυθμός καρέ: {0:0.0###} - Σύνολο καρέ: {0:#,##0.##} - Κωδικοποίηση βίντεο: {0} - Μήκος ενιαίας γραμμής: - Συνολικό μήκος: {0} - Συνολικό μήκος: {0} (Διαχωρισμός!) - Διαχωρισμός! - Μη διαθέσιμο - Επικάλυψη προηγούμενης ({0:#,##0.###}) - Επικάλυψη ({0:#,##0.###}) - Επικάλυψη επόμενης ({0:#,##0.###}) - Αρνητικό - Η τυπική έκφραση δεν είναι έγκυρη! - Τρέχων υπότιτλος - Αρχικό κείμενο - Άνοιγμα αρχικού αρχείου υπότιτλου... - Παρακαλώ περιμένετε... - Κλειδί συνεδρίας - Όνομα χρήστη - Μη διαθέσιμο όνομα - Διεύθυνση ιστοσελίδας - Διεύθυνση IP - Βίντεο - {0} - Ήχος - {0} - Στοιχεία ελέγχου - {0} - Προηγμένες - - Στυλ/Γλώσσα - Χαρακτήρας - Κατηγορία - Γενικά - Γραμμή# - Προηγούμενη - Επόμενη - Μέγεθος - Αναζήτηση - Διαγραφή επιλεγμένης γραμμής - Πλάτος - Ύψος - Κατάρρευση - Συντόμευση: {0} - Παράδειγμα: {0} - - - Σχετικά με το Subtitle Edit - Το Subtitle Edit είναι ένα δωρεάν λογισμικό -υπό την άδεια δημόσιας χρήσης GNU. -Μπορείτε να το διανείμετε, να το τροποποιείτε -και να το χρησιμοποιείτε ελεύθερα. - -Ο κώδικας C# είναι διαθέσιμος στο https://github.com/SubtitleEdit/subtitleedit - -Επισκεφτείτε το www.nikse.dk για την τελευταία έκδοση. - -Οι προτάσεις σας είναι ευπρόσδεκτες. - -Email: mailto:nikse.dk@gmail.com - - - Προσθήκη στη λίστα ονομάτων - Προσθήκη στη λίστα ονομάτων (διάκριση πεζών-κεφαλαίων) - - - Προσθήκη στη λίστα αντικατάστασης του OCR - Προσθήκη ζεύγους στη λίστα αντικατάστασης του OCR (ευαίσθητο στα πεζά) - - - Προσθήκη στο λεξικό του χρήστη - Προσθήκη λέξης στο λεξικό του χρήστη (όχι ευαίσθητο στα πεζά) - - - Δημιουργία δεδομένων κυματομορφής - Πηγαίο αρχείο βίντεο: - Δημιουργία δεδομένων κυματομορφής - Αυτό μπορεί να πάρει μερικά λεπτά - παρακαλώ περιμένετε - Δεν βρέθηκε το πρόγραμμα VLC media player - Χρήση του VLC media player 1.1.χ ή νεότερο για την εξαγωγή δεδομένων ήχου. - Μετάβαση στην αρχική σελίδα του VLC media player; - Δημιουργία αρχείου αιχμής... - Δημιουργία φασματογραφήματος... - Εξαγωγή ήχου: {0:0.0} δευτερόλεπτα - Εξαγωγή ήχου: {0}.{1:00} λεπτά - Αδυναμία εύρεσης αρχείου κυματομορφής! -Αυτή η λειτουργεία απαιτεί VLC media player 1.1.x ή νεότερο ({ο}-bit). -Γραμμή εντολών: {1} {2} - Το {0} δεν εξήγαγε δεδομένα ήχου στο αρχείο κυματομορφής -Γραμμή εντολών: {1} {2} -Σημείωση: Ελέγξτε τον ελεύθερο χώρο δίσκου. - Μικρός χώρος δίσκου! - {0} ελεύθερου χώρου - Αδυναμία εύρεσης κομματιών ήχου! Δημιουργία κενής κυματομορφής; - - - Μαζική δημιουργία δεδομένων κυματομορφής - Εξαγωγή ήχου... - Υπολογισμός... - Έτοιμο - Σφάλμα - - - Προσαρμογή διαρκειών - Προσαρμογή μέσω - Δευτερολέπτων - Ποσοστού - Επαναϋπολογισμός - Προσθήκη δευτ. - Ορισμός ως ποσοστό διάρκειας - Σημείωση: Ο χρόνος εμφάνισης δεν θα επικαλύπτει την ώρα έναρξης του επόμενου κειμένου - Διορθωμένα - Χιλ. δευτερολέπτου - Μόνο επέκταση - - - Εφαρμογή ορίων διάρκειας - Διαθέσιμες διορθώσεις: {0} - Αδυναμία διόρθωσης: {0} - - - Ήχος σε κείμενο - Εξαγωγή ήχου χρησιμοποιώντας {0}... - Εξαγωγή κειμένου από ήχο χρησιμοποιώντας {0}... - Εξαγωγή κειμένου μέσω {0} πρόοδος: {1}% - Λιγότερα ▲ - Περισσότερα ▼ - - - Αυτόματη ισορροπία γραμμών - Αφαίρεση διασπάσεων από τις γραμμές - Εύρεση γραμμών: {0} - Διάσπαση γραμμών μεγαλύτερες από - Συνένωση γραμμών μεγαλύτερες από - - - Μαζική μετατροπή - Εισαγωγή - Εισαγωγή αρχείων (περιήγηση ή σύρσιμο) - Κατάσταση - Εξαγωγή - Αποθήκευση στον αρχικό φάκελο - Αποθήκευση στον φάκελο εξαγωγής - Αντικατάσταση αρχείων - - Χρήση αρχικού στυλ - Επιλογές μετατροπής - Αφαίρεση ετικετών μορφοποίησης - Αφαίρεση στυλ/ηθοποιού - Αφαίρεση κειμένου για κωφούς - Αντικατάσταση αρχικών αρχείων (νέα επέκταση, για αλλαγμένη μορφή) - Επανάληψη αρχικού γράμματος - Μετατροπή - Τίποτα για μετατροπή! - Παρακαλώ, επιλέξτε τον φάκελο εξαγωγής - Αποτυχία - Μετατράπηκαν - Ρυθμίσεις - Διόρθωση RTL - Διόρθωση RTL μέσω ετικετών Unicode - Αφαίρεση ετικετών Unicode RTL - Αντιστροφή αρχής/τέλους RTL - Διαχωρισμός μεγάλων γραμμών - Αυτόματη ισορροπία γραμμών - Σάρωση φακέλου... - Συμπερίληψη υποφακέλων - Ένωση κενών - Καθαρό κείμενο</PlainText> - <Ocr>OCR...</Ocr> - <Filter>Φίλτρο</Filter> - <FilterSkipped>Παραλείφτηκαν μέσω φίλτρου</FilterSkipped> - <FilterSrtNoUtf8BOM>Αρχεία SubRip (.srt) χωρίς UTF-8 BOM</FilterSrtNoUtf8BOM> - <FilterMoreThanTwoLines>Περισσότερες από δύο γραμμές</FilterMoreThanTwoLines> - <FilterContains>Το κείμενο περιέχει...</FilterContains> - <FilterFileNameContains>Το όνομα αρχείου περιέχει...</FilterFileNameContains> - <MkvLanguageCodeContains>Ο κωδικός γλώσσας Matroska (.mkv) περιέχει...</MkvLanguageCodeContains> - <FixCommonErrorsErrorX>Επιδιόρθωση σφαλμάτων: {0}</FixCommonErrorsErrorX> - <MultipleReplaceErrorX>Πολλαπλή αντικατάσταση: {0}</MultipleReplaceErrorX> - <AutoBalanceErrorX>Αυτόματη ισορρόπηση: {0}</AutoBalanceErrorX> - <OffsetTimeCodes>Αντιστάθμιση κωδικών χρόνου</OffsetTimeCodes> - <TransportStreamSettings>Μεταφορά ρυθμίσεων ροής</TransportStreamSettings> - <TransportStreamOverrideXPosition>Παράκαμψη αρχικής θέσης Χ</TransportStreamOverrideXPosition> - <TransportStreamOverrideYPosition>Παράκαμψη αρχικής θέσης Υ</TransportStreamOverrideYPosition> - <TransportStreamOverrideVideoSize>Παράκαμψη αρχικού μεγέθους βίντεο</TransportStreamOverrideVideoSize> - <TransportStreamFileNameEnding>Κατάληξη ονόματος αρχείου</TransportStreamFileNameEnding> - <TransportStreamSettingsButton>Ρυθμίσεις TS...</TransportStreamSettingsButton> - <RemoveLineBreaks>Αφαίρεση διάσπασης γραμμών</RemoveLineBreaks> - <DeleteLines>Διαγραφή γραμμών</DeleteLines> - <TryToUseSourceEncoding>Προσπάθεια χρήσης αρχικής κωδικοποίησης</TryToUseSourceEncoding> - <DeleteFirstLines>Διαγραφή πρώτων γραμμών</DeleteFirstLines> - <DeleteLastLines>Διαγραφή τελευταίων γραμμών</DeleteLastLines> - <DeleteContaining>Διαγραφή γραμμών που περιέχουν</DeleteContaining> - <MkvLanguageInOutputFileName>"Γλώσσα" στην εξαγωγή ονόματος αρχείου</MkvLanguageInOutputFileName> - <MkvLanguageInOutputFileNameX>Matroska (.mkv) "Γλώσσα" στην εξαγωγή ονόματος αρχείου: {0}</MkvLanguageInOutputFileNameX> - <MkvLanguageStyleTwoLetter>Κώδικες γλωσσών δύο γραμμάτων</MkvLanguageStyleTwoLetter> - <MkvLanguageStyleThreeLetter>Κώδικες γλωσσών τριών γραμμάτων</MkvLanguageStyleThreeLetter> - <MkvLanguageStyleEmpty>Χωρίς κώδικα γλώσσας</MkvLanguageStyleEmpty> - </BatchConvert> - <Beamer> - <Title>Βιντεοπροβολέας</Title> - </Beamer> - <Bookmarks> - <EditBookmark>Επεξεργασία σημείωσης</EditBookmark> - <AddBookmark>Προσθήκη σημείωσης</AddBookmark> - <GoToBookmark>Μετάβαση σε σημείωση</GoToBookmark> - </Bookmarks> - <ChangeCasing> - <Title>Αλλαγή πεζών-κεφαλαίων</Title> - <ChangeCasingTo>Αλλαγή πεζών-κεφαλαίων σε</ChangeCasingTo> - <NormalCasing>Κανονική. Οι προτάσεις ξεκινούν με κεφαλαίο γράμμα.</NormalCasing> - <FixNamesCasing>Διόρθωση ονομάτων (μέσω Dictionaries\NamesEtc.xml)</FixNamesCasing> - <FixOnlyNamesCasing>Διόρθωση μόνο ονομάτων (μέσω Dictionaries\NamesEtc.xml)</FixOnlyNamesCasing> - <OnlyChangeAllUppercaseLines>Αλλαγή μόνο των γραμμών με κεφαλαία.</OnlyChangeAllUppercaseLines> - <AllUppercase>Όλα κεφαλαία</AllUppercase> - <AllLowercase>Όλα πεζά</AllLowercase> - </ChangeCasing> - <ChangeCasingNames> - <Title>Αλλαγή πεζών-κεφαλαίων - Ονόματα</Title> - <NamesFoundInSubtitleX>Εύρεση ονομάτων στον υπότιτλο: {0}</NamesFoundInSubtitleX> - <Enabled>Ενεργοποιημένο</Enabled> - <Name>Όνομα</Name> - <LinesFoundX>Εύρεση γραμμών: {0}</LinesFoundX> - </ChangeCasingNames> - <ChangeFrameRate> - <Title>Αλλαγή ρυθμού καρέ</Title> - <ConvertFrameRateOfSubtitle>Μετατροπή ρυθμού καρέ του υπότιτλου</ConvertFrameRateOfSubtitle> - <FromFrameRate>Από ρυθμό καρέ</FromFrameRate> - <ToFrameRate>Σε ρυθμό καρέ</ToFrameRate> - <FrameRateNotCorrect>Λανθασμένος ρυθμός καρέ</FrameRateNotCorrect> - <FrameRateNotChanged>Ο Ρυθμός καρέ είναι ίδιος - τίποτα για μετατροπή</FrameRateNotChanged> - </ChangeFrameRate> - <ChangeSpeedInPercent> - <Title>Ρύθμιση ταχύτητας σε ποσοστό</Title> - <TitleShort>Ρύθμιση ταχύτητας</TitleShort> - <Info>Αλλαγή ταχύτητας των υποτίτλων σε ποσοστό</Info> - <Custom>Προσαρμοσμένη</Custom> - <ToDropFrame>Ρήξη καρέ</ToDropFrame> - <FromDropFrame>Από ρήξη καρέ</FromDropFrame> - </ChangeSpeedInPercent> - <CheckForUpdates> - <Title>Έλεγχος ενημερώσεων</Title> - <CheckingForUpdates>Έλεγχος για ενημερώσεις...</CheckingForUpdates> - <CheckingForUpdatesFailedX>Αποτυχία ελέγχου ενημέρωσης: {0}</CheckingForUpdatesFailedX> - <CheckingForUpdatesNoneAvailable>Χρήση της τελευταία έκδοσης του Subtitle Edit</CheckingForUpdatesNoneAvailable> - <CheckingForUpdatesNewVersion>Νέα διαθέσιμη έκδοση!</CheckingForUpdatesNewVersion> - <InstallUpdate>Μετάβαση στην ιστοσελίδα λήψης</InstallUpdate> - <NoUpdates>Ακύρωση ενημέρωσης</NoUpdates> - </CheckForUpdates> - <ChooseAudioTrack> - <Title>Επιλογή κομματιού ήχου</Title> - </ChooseAudioTrack> - <ChooseEncoding> - <Title>Επιλογή κωδικοποίησης</Title> - <CodePage>Σελίδα κώδικα</CodePage> - <DisplayName>Εμφάνιση ονόματος</DisplayName> - <PleaseSelectAnEncoding>Παρακαλώ, επιλέξτε μια κωδικοποίηση</PleaseSelectAnEncoding> - </ChooseEncoding> - <ChooseLanguage> - <Title>Επιλογή γλώσσας</Title> - <Language>Γλώσσα</Language> - </ChooseLanguage> - <ColorChooser> - <Title>Επιλογή χρώματος</Title> - <Red>Κόκκινο</Red> - <Green>Πράσινο</Green> - <Blue>Μπλε</Blue> - <Alpha>Άλφα</Alpha> - </ColorChooser> - <ColumnPaste> - <Title>Επικόλληση στηλών</Title> - <ChooseColumn>Επιλογή στηλών</ChooseColumn> - <OverwriteShiftCellsDown>Αντικατάσταση/Μετατόπιση κελιών κάτω</OverwriteShiftCellsDown> - <Overwrite>Αντικατάσταση</Overwrite> - <ShiftCellsDown>Μετατόπιση κελιών κάτω</ShiftCellsDown> - <TimeCodesOnly>Μόνο την κωδικοποίηση χρόνων</TimeCodesOnly> - <TextOnly>Μόνο το κείμενο</TextOnly> - <OriginalTextOnly>Μόνο το αρχικό κείμενο</OriginalTextOnly> - </ColumnPaste> - <CompareSubtitles> - <Title>Σύγκριση υπότιτλων</Title> - <PreviousDifference>&amp;Προηγούμενη διαφορά</PreviousDifference> - <NextDifference>&amp;Επόμενη διαφορά</NextDifference> - <SubtitlesNotAlike>Οι υπότιτλοι δεν έχουν ομοιότητες</SubtitlesNotAlike> - <XNumberOfDifference>Σύνολο διαφορών: {0}</XNumberOfDifference> - <XNumberOfDifferenceAndPercentChanged>Αριθμός διαφορών: {0} ({1:0.##}% αλλαγή των λέξεων)</XNumberOfDifferenceAndPercentChanged> - <XNumberOfDifferenceAndPercentLettersChanged>Αριθμός διαφορών: {0} ({1:0.##}% αλλαγή των γραμμάτων)</XNumberOfDifferenceAndPercentLettersChanged> - <ShowOnlyDifferences>Εμφάνιση μόνο διαφορών</ShowOnlyDifferences> - <IgnoreLineBreaks>Αγνόηση διάσπασης γραμμών</IgnoreLineBreaks> - <IgnoreFormatting>Αγνόηση μορφοποίησης</IgnoreFormatting> - <OnlyLookForDifferencesInText>Αναζήτηση μόνο διαφορών στο κείμενο</OnlyLookForDifferencesInText> - <CannotCompareWithImageBasedSubtitles>Δεν γίνεται σύγκριση με υπότιτλους από εικόνα</CannotCompareWithImageBasedSubtitles> - </CompareSubtitles> - <DCinemaProperties> - <Title>Ιδιότητες D-Cinema (interop)</Title> - <TitleSmpte>Ιδιότητες D-Cinema (SMPTE)</TitleSmpte> - <SubtitleId>Ταυτότητα υποτίτλου</SubtitleId> - <GenerateId>Δημιουργία ταυτότητας</GenerateId> - <MovieTitle>Τίτλος ταινίας</MovieTitle> - <ReelNumber>Αριθμός μπομπίνας</ReelNumber> - <Language>Γλώσσα</Language> - <IssueDate>Ημερομηνία έκδοσης</IssueDate> - <EditRate>Επεξεργασία ρυθμού</EditRate> - <TimeCodeRate>Ρυθμός κώδικα χρόνου</TimeCodeRate> - <StartTime>Έναρξη</StartTime> - <Font>Γραμματοσειρά</Font> - <FontId>Ταυτότητα</FontId> - <FontUri>URI</FontUri> - <FontColor>Χρώμα</FontColor> - <FontEffect>Εφέ</FontEffect> - <FontEffectColor>Χρώμα εφέ</FontEffectColor> - <FontSize>Μέγεθος</FontSize> - <TopBottomMargin>Περιθώριο πάνω/κάτω</TopBottomMargin> - <FadeUpTime>Χρόνος εμφάνισης εφέ</FadeUpTime> - <FadeDownTime>Χρόνος εξαφάνισης εφέ</FadeDownTime> - <ZPosition>Κάθετη θέση</ZPosition> - <ZPositionHelp>Θετικοί αριθμοί μετακινούν το κείμενο μακριά, αρνητικοί αριθμοί μετακινούν το κείμενο κοντά. -Εάν η κάθετη θέση είναι μηδέν, τότε είναι 2D.</ZPositionHelp> - <ChooseColor>Επιλογή χρώματος...</ChooseColor> - <Generate>Δημιουργία</Generate> - </DCinemaProperties> - <DurationsBridgeGaps> - <Title>Ένωση μικρών κενών μεταξύ γραμμών</Title> - <GapsBridgedX>Αριθμός ενωμένων μικρών κενών: {0}</GapsBridgedX> - <GapToNext>Κενό ως το επόμενο σε δευτερόλεπτα</GapToNext> - <GapToNextFrames>Κενό ως το επόμενο σε καρέ</GapToNextFrames> - <BridgeGapsSmallerThanXPart1>Ένωση κενών μικρότερων από</BridgeGapsSmallerThanXPart1> - <BridgeGapsSmallerThanXPart2>χιλιοστά δευτερολέπτου</BridgeGapsSmallerThanXPart2> - <BridgeGapsSmallerThanXPart1Frames>Ένωση κενών μικρότερων από</BridgeGapsSmallerThanXPart1Frames> - <BridgeGapsSmallerThanXPart2Frames>καρέ</BridgeGapsSmallerThanXPart2Frames> - <MinMillisecondsBetweenLines>Ελάχιστα χιλ. δευτερολέπτου μεταξύ των γραμμών</MinMillisecondsBetweenLines> - <MinFramesBetweenLines>Ελάχιστα καρέ μεταξύ γραμμών</MinFramesBetweenLines> - <ProlongEndTime>Το προηγούμενο κείμενο παίρνει όλα τα κενά χρόνου</ProlongEndTime> - <DivideEven>Το κείμενο χωρίζει τα κενά χρόνου</DivideEven> - </DurationsBridgeGaps> - <DvdSubRip> - <Title>Αντιγραφή υποτίτλων από IFO/VOB (DVD)</Title> - <DvdGroupTitle>Αρχεία/Πληροφορίες DVD</DvdGroupTitle> - <IfoFile>Αρχείο IFO</IfoFile> - <IfoFiles>Αρχεία IFO</IfoFiles> - <VobFiles>Αρχεία VOB</VobFiles> - <Add>Προσθήκη</Add> - <Remove>Αφαίρεση</Remove> - <Clear>Καθαρισμός</Clear> - <MoveUp>Μετακίνηση επάνω</MoveUp> - <MoveDown>Μετακίνηση κάτω</MoveDown> - <Languages>Γλώσσες</Languages> - <PalNtsc>PAL/NTSC</PalNtsc> - <Pal>PAL (25 fps)</Pal> - <Ntsc>NTSC (29.9 fps)</Ntsc> - <StartRipping>Εκκίνηση αντιγραφής</StartRipping> - <Abort>Ματαίωση</Abort> - <AbortedByUser>Ματαιώθηκε από τον χρήστη</AbortedByUser> - <ReadingSubtitleData>Ανάγνωση δεδομένων υποτίτλου...</ReadingSubtitleData> - <RippingVobFileXofYZ>Αντιγραφή αρχείων vob {1} από {2}: {0}</RippingVobFileXofYZ> - <WrongIfoType>Ο τύπος IFO είναι '{0}' και όχι 'DVDVIDEO-VTS'.{1}Προσπαθείστε με ένα άλλο αρχείο εκτός του {2}</WrongIfoType> - </DvdSubRip> - <DvdSubRipChooseLanguage> - <Title>Επιλογή γλώσσας</Title> - <ChooseLanguageStreamId>Επιλογή γλώσσας (id-ροής)</ChooseLanguageStreamId> - <UnknownLanguage>Άγνωστη γλώσσα</UnknownLanguage> - <SubtitleImageXofYAndWidthXHeight>Εικόνα υπότιτλου {0}/{1} - {2}x{3}</SubtitleImageXofYAndWidthXHeight> - <SubtitleImage>Εικόνα υπότιτλου</SubtitleImage> - </DvdSubRipChooseLanguage> - <EbuSaveOptions> - <Title>Επιλογές αποθήκευσης τύπου EBU</Title> - <GeneralSubtitleInformation>Γενικές πληροφορίες υπότιτλου</GeneralSubtitleInformation> - <CodePageNumber>Αριθμός σελίδας κώδικα</CodePageNumber> - <DiskFormatCode>Κωδικός μορφής δίσκου</DiskFormatCode> - <DisplayStandardCode>Προβολή τυπικού κώδικα</DisplayStandardCode> - <ColorRequiresTeletext>Τα χρώματα απαιτούν τηλεκείμενο!</ColorRequiresTeletext> - <AlignmentRequiresTeletext>Η στοίχιση απαιτεί τηλεκείμενο!</AlignmentRequiresTeletext> - <TeletextCharsShouldBe38>Οι μέγιστοι χαρακτήρες τηλεκειμένου ανά σειρά θα πρέπει να είναι 38!</TeletextCharsShouldBe38> - <CharacterCodeTable>Πίνακας χαρακτήρων</CharacterCodeTable> - <LanguageCode>Κωδικός γλώσσας</LanguageCode> - <OriginalProgramTitle>Πρωτότυπος τίτλος προγράμματος</OriginalProgramTitle> - <OriginalEpisodeTitle>Πρωτότυπος τίτλος επεισόδιου</OriginalEpisodeTitle> - <TranslatedProgramTitle>Μεταφρασμένος τίτλος προγράμματος</TranslatedProgramTitle> - <TranslatedEpisodeTitle>Μεταφρασμένος τίτλος επεισοδίου</TranslatedEpisodeTitle> - <TranslatorsName>Όνομα του μεταφραστή</TranslatorsName> - <SubtitleListReferenceCode>Κωδικός αναφοράς της λίστας υπότιτλων</SubtitleListReferenceCode> - <CountryOfOrigin>Χώρα καταγωγής</CountryOfOrigin> - <TimeCodeStatus>Κατάσταση χρόνου κώδικα</TimeCodeStatus> - <TimeCodeStartOfProgramme>Χρόνος κώδικα: Έναρξη προγράμματος</TimeCodeStartOfProgramme> - <RevisionNumber>Αριθμός αναθεώρησης</RevisionNumber> - <MaxNoOfDisplayableChars>Μέγιστος αριθμός χαρακτήρων ανά σειρά</MaxNoOfDisplayableChars> - <MaxNumberOfDisplayableRows>Μέγιστος αριθμός γραμμών</MaxNumberOfDisplayableRows> - <DiskSequenceNumber>Αύξων αριθμός δίσκου</DiskSequenceNumber> - <TotalNumberOfDisks>Συνολικός αριθμός δίσκων</TotalNumberOfDisks> - <Import>Εισαγωγή...</Import> - <TextAndTimingInformation>Πληροφορίες κειμένου και χρονισμού</TextAndTimingInformation> - <JustificationCode>Κωδικός αιτιολόγησης</JustificationCode> - <VerticalPosition>Κάθετη θέση</VerticalPosition> - <MarginTop>Άνω περιθώριο (για άνω στοιχισμένους υπότιτλους)</MarginTop> - <MarginBottom>Κάτω περιθώριο (για κάτω στοιχισμένους υπότιτλους)</MarginBottom> - <NewLineRows>Αριθμός προσθήκης σειρών μετά από νέα σειρά</NewLineRows> - <Teletext>Τηλεκείμενο</Teletext> - <UseBox>Χρήση πλαισίου για το κείμενο</UseBox> - <DoubleHeight>Χρήση διπλού ύψους για το κείμενο</DoubleHeight> - <Errors>Λάθη</Errors> - <ErrorsX>Λάθη: {0}</ErrorsX> - <MaxLengthError>Η Γραμμή {0} υπερβαίνει το μέγιστο μήκος ({1}) κατά {2}: {3}</MaxLengthError> - <TextUnchangedPresentation>Αμετάβλητη παρουσίαση</TextUnchangedPresentation> - <TextLeftJustifiedText>Αριστερά στοιχισμένο κείμενο</TextLeftJustifiedText> - <TextCenteredText>Κεντραρισμένο κείμενο</TextCenteredText> - <TextRightJustifiedText>Δεξιά στοιχισμένο κείμενο</TextRightJustifiedText> - <UseBoxForOneNewLine>Επιλογή 'Χρήση πλαισίου κειμένου' μόνο για μία νέα γραμμή</UseBoxForOneNewLine> - </EbuSaveOptions> - <EffectKaraoke> - <Title>Εφέ καραόκε</Title> - <ChooseColor>Επιλογή χρώματος:</ChooseColor> - <TotalMilliseconds>Συνολικά χιλ. δευτερολέπτου:</TotalMilliseconds> - <EndDelayInMilliseconds>Καθυστέρηση λήξης σε χιλ. δευτερολέπτου:</EndDelayInMilliseconds> - </EffectKaraoke> - <EffectTypewriter> - <Title>Εφέ γραφομηχανής</Title> - <TotalMilliseconds>Συνολικά χιλ. δευτερολέπτου:</TotalMilliseconds> - <EndDelayInMilliseconds>Καθυστέρηση λήξης σε χιλ. δευτερολέπτου:</EndDelayInMilliseconds> - </EffectTypewriter> - <ExportCustomText> - <Title>Εξαγωγή προσαρμοσμένης μορφής κειμένου</Title> - <Formats>Μορφές</Formats> - <New>Νέο</New> - <Edit>Επεξεργασία</Edit> - <Delete>Διαγραφή</Delete> - <SaveAs>Α&amp;ποθήκευση ως...</SaveAs> - <SaveSubtitleAs>Αποθήκευση υπότιτλου ως...</SaveSubtitleAs> - <SubtitleExportedInCustomFormatToX>Οι υπότιτλοι εξάγωνται σε προσαρμοσμένη μορφή στο: {0}</SubtitleExportedInCustomFormatToX> - </ExportCustomText> - <ExportCustomTextFormat> - <Title>Πρότυπο προσαρμοσμένης μορφής κειμένου</Title> - <Template>Πρότυπο</Template> - <Header>Επικεφαλίδα</Header> - <TextLine>Γραμμή κειμένου (παράγραφος)</TextLine> - <TimeCode>Κωδικός χρόνου</TimeCode> - <NewLine>Νέα γραμμή</NewLine> - <Footer>Υποσέλιδο</Footer> - <DoNotModify>[Χωρίς επεξεργασία]</DoNotModify> - </ExportCustomTextFormat> - <ExportFcpXmlAdvanced> - <Title>Εξαγωγή Final Cut Pro XML advanced</Title> - <FontName>Όνομα γραμματοσειράς</FontName> - <FontSize>Μέγεθος γραμματοσειράς</FontSize> - <FontFace>Όψη γραμματοσειράς</FontFace> - <FontFaceRegular>Κλασική</FontFaceRegular> - <Alignment>Ευθυγράμμιση</Alignment> - <Baseline>Κανονική</Baseline> - </ExportFcpXmlAdvanced> - <ExportPngXml> - <Title>Εξαγωγή XML/PNG</Title> - <ImageSettings>Ρυθμίσεις εικόνας</ImageSettings> - <FontFamily>Οικογένεια γραμματοσειράς</FontFamily> - <FontSize>Μέγεθος γραμματοσειράς</FontSize> - <FontColor>Χρώμα γραμματοσειράς</FontColor> - <BorderColor>Χρώμα περιγράμματος</BorderColor> - <BorderWidth>Πλάτος περιγράμματος</BorderWidth> - <BorderStyle>Στυλ περιγράμματος</BorderStyle> - <BorderStyleOneBox>Ένα πλαίσιο</BorderStyleOneBox> - <BorderStyleBoxForEachLine>Πλαίσιο για κάθε γραμμή</BorderStyleBoxForEachLine> - <BorderStyleNormalWidthX>Κανονικό, πάχος={0}</BorderStyleNormalWidthX> - <ShadowColor>Χρώμα σκιάς</ShadowColor> - <ShadowWidth>Πάχος σκιάς</ShadowWidth> - <Transparency>Αρχική</Transparency> - <ImageFormat>Μορφή εικόνας</ImageFormat> - <FullFrameImage>Εικόνα πλήρης απεικόνισης</FullFrameImage> - <SimpleRendering>Απλή απεικόνιση</SimpleRendering> - <AntiAliasingWithTransparency>Διαφανής εξομάλυνση</AntiAliasingWithTransparency> - <Text3D>3D</Text3D> - <SideBySide3D>Κέντρο - Δεξιά - Αριστερά</SideBySide3D> - <HalfTopBottom3D>Κέντρο - Πάνω/Κάτω</HalfTopBottom3D> - <Depth>Βάθος</Depth> - <ExportAllLines>Εξαγωγή όλων των γραμμών...</ExportAllLines> - <XImagesSavedInY>{0} εικόνες αποθηκεύτηκαν στον φάκελο {1}</XImagesSavedInY> - <VideoResolution>Ανάλυση βίντεο</VideoResolution> - <Align>Στοίχιση</Align> - <Left>Αριστερά</Left> - <Right>Δεξιά</Right> - <Center>Κέντρο</Center> - <CenterLeftJustify>Κέντρο, στοίχιση αριστερά</CenterLeftJustify> - <CenterLeftJustifyDialogs>Κέντρο, αριστερή στοίχιση διαλόγου</CenterLeftJustifyDialogs> - <CenterTopJustify>Κέντρο, άνω στοίχιση</CenterTopJustify> - <CenterRightJustify>Κέντρο, δεξιά στοίχιση</CenterRightJustify> - <BottomMargin>Κάτω περιθώριο</BottomMargin> - <LeftRightMargin>Αριστερό/δεξί περιθώριο</LeftRightMargin> - <SaveBluRraySupAs>Επιλογή ονόματος αρχείου Blu-ray sup</SaveBluRraySupAs> - <SaveVobSubAs>Επιλογή ονόματος αρχείου VobSub</SaveVobSubAs> - <SaveFabImageScriptAs>Επιλογή ονόματος αρχείου Blu-ray sup</SaveFabImageScriptAs> - <SaveDvdStudioProStlAs>Επιλογή ονόματος αρχείου DVD Studio Pro STL</SaveDvdStudioProStlAs> - <SaveDigitalCinemaInteropAs>Επιλογή ονόματος αρχείου Digital Cinema Interop</SaveDigitalCinemaInteropAs> - <SaveDigitalCinemaSmpte2014>Επιλογή ονόματος αρχείου Digital SMPTE 2014</SaveDigitalCinemaSmpte2014> - <SavePremiereEdlAs>Επιλογή ονόματος αρχείου Premiere EDL</SavePremiereEdlAs> - <SaveFcpAs>Επιλογή ονόματος αρχείου Final Cut Pro xml</SaveFcpAs> - <SaveDostAs>Επιλογή ονόματος αρχείου DoStudio dost</SaveDostAs> - <SomeLinesWereTooLongX>Μερικές πολύ μεγάλες γραμμές:{0}</SomeLinesWereTooLongX> - <LineHeight>Ύψος γραμμής</LineHeight> - <BoxSingleLine>Πλαίσιο - ενιαία γραμμή</BoxSingleLine> - <BoxMultiLine>Πλαίσιο - πολλαπλή γραμμή</BoxMultiLine> - <Forced>Επιβολή</Forced> - <ChooseBackgroundColor>Επιλογή χρώματος φόντου</ChooseBackgroundColor> - <SaveImageAs>Αποθήκευση εικόνας ως...</SaveImageAs> - <FcpUseFullPathUrl>Χρήση πλήρης διεύθυνσης url εικόνας για FCP xml</FcpUseFullPathUrl> - </ExportPngXml> - <ExportText> - <Title>Εξαγωγή κειμένου</Title> - <Preview>Προεπισκόπηση</Preview> - <ExportOptions>Εξαγωγή επιλογών</ExportOptions> - <FormatText>Μορφοποίηση κειμένου</FormatText> - <None>Κανένα</None> - <MergeAllLines>Συγχώνευση όλων των γραμμών</MergeAllLines> - <UnbreakLines>Συνένωση γραμμών</UnbreakLines> - <RemoveStyling>Αφαίρεση ύφους</RemoveStyling> - <ShowLineNumbers>Προβολή αριθμών γραμμής</ShowLineNumbers> - <AddNewLineAfterLineNumber>Προσθήκη νέας γραμμής μετά από τον αριθμό γραμμής</AddNewLineAfterLineNumber> - <ShowTimeCode>Εμφάνιση κωδικοποίησης χρόνου</ShowTimeCode> - <AddNewLineAfterTimeCode>Προσθήκη νέας γραμμής μετά την κωδικοποίηση χρόνου</AddNewLineAfterTimeCode> - <AddNewLineAfterTexts>Προσθήκη νέας γραμμής μετά το κείμενο</AddNewLineAfterTexts> - <AddNewLineBetweenSubtitles>Προσθήκη νέας γραμμής μεταξύ των υποτίτλων</AddNewLineBetweenSubtitles> - <TimeCodeFormat>Μορφή κώδικοποίησης χρόνου</TimeCodeFormat> - <Srt>.srt</Srt> - <Milliseconds>Χιλιοστά δευτερολέπτου</Milliseconds> - <HHMMSSFF>ΩΩ:ΛΛ:ΔΔ:ΚΚ</HHMMSSFF> - <TimeCodeSeparator>Διαχωρισμός κωδικοποίησης χρόνου</TimeCodeSeparator> - </ExportText> - <ExtractDateTimeInfo> - <Title>Δημιουργία χρόνου ως κείμενο</Title> - <OpenVideoFile>Επιλογή αρχείου βίντεο από όπου θα εξαχθούν οι πληροφορίες ημέρας/χρόνου</OpenVideoFile> - <StartFrom>Έναρξη από</StartFrom> - <DateTimeFormat>Μορφή ημέρας/χρόνου</DateTimeFormat> - <Example>Παράδειγμα</Example> - <GenerateSubtitle>&amp;Δημιουργία υποτίτλων</GenerateSubtitle> - </ExtractDateTimeInfo> - <FindDialog> - <Title>Εύρεση</Title> - <Find>Εύρεση</Find> - <Normal>&amp;Κανονική</Normal> - <CaseSensitive>&amp;Διάκριση πεζών-κεφαλαίων</CaseSensitive> - <RegularExpression>Τυπική έκφραση</RegularExpression> - <WholeWord>Ολόκληρη τη λέξη</WholeWord> - <Count>Μέτρηση</Count> - <XNumberOfMatches>{0:#,##0} αντιστοιχίες</XNumberOfMatches> - <OneMatch>Μία αντιστοιχία</OneMatch> - </FindDialog> - <FindSubtitleLine> - <Title>Εύρεση γραμμής υπότιτλου</Title> - <Find>&amp;Εύρεση</Find> - <FindNext>Εύρεση ε&amp;πόμενου</FindNext> - </FindSubtitleLine> - <FixCommonErrors> - <Title>Επιδιόρθωση σφαλμάτων</Title> - <Step1>Βήμα 1/2 - Επιλογή σφαλμάτων</Step1> - <WhatToFix>Προς διόρθωση</WhatToFix> - <Example>Παράδειγμα</Example> - <SelectAll>Όλα</SelectAll> - <InverseSelection>Αντιστροφή</InverseSelection> - <Back>&lt; &amp;Πίσω</Back> - <Next>&amp;Επόμενο &gt;</Next> - <Step2>Βήμα 2/2 - Επαλήθευση διορθώσεων</Step2> - <Fixes>Επιδιορθώσεις</Fixes> - <Log>Αρχείο καταγραφής</Log> - <Function>Συνάρτηση</Function> - <RemovedEmptyLine>Αφαίρεση κενής γραμμής</RemovedEmptyLine> - <RemovedEmptyLineAtTop>Αφαίρεση κενής γραμμής στην κορυφή</RemovedEmptyLineAtTop> - <RemovedEmptyLineAtBottom>Αφαίρεση κενής γραμμής στο τέλος</RemovedEmptyLineAtBottom> - <RemovedEmptyLineInMiddle>Αφαίρεση κενής γραμμής στο κέντρο</RemovedEmptyLineInMiddle> - <RemovedEmptyLinesUnsedLineBreaks>Αφαίρεση κενών γραμμών/άχρηστες αλλαγές γραμμής</RemovedEmptyLinesUnsedLineBreaks> - <EmptyLinesRemovedX>Αφαιρεμένες κενές γραμμές: {0}</EmptyLinesRemovedX> - <FixOverlappingDisplayTimes>Επιδιόρθωση επικαλυπτόμενων χρόνων εμφάνισης</FixOverlappingDisplayTimes> - <FixShortDisplayTimes>Επιδιόρθωση σύντομων χρόνων εμφάνισης</FixShortDisplayTimes> - <FixLongDisplayTimes>Επιδιόρθωση μεγάλων χρόνων εμφάνισης</FixLongDisplayTimes> - <FixShortGaps>Επιδιόρθωση μικρών κενών</FixShortGaps> - <FixInvalidItalicTags>Επιδιόρθωση λανθασμένων ετικετών πλαγιαστής γραφής</FixInvalidItalicTags> - <RemoveUnneededSpaces>Αφαίρεση περιττών διαστημάτων</RemoveUnneededSpaces> - <RemoveUnneededPeriods>Αφαίρεση περιττών τελειών</RemoveUnneededPeriods> - <FixCommas>Επιδιόρθωση κομμάτων</FixCommas> - <FixMissingSpaces>Επιδιόρθωση διαστημάτων</FixMissingSpaces> - <BreakLongLines>Διάσπαση μεγάλων γραμμών</BreakLongLines> - <RemoveLineBreaks>Αφαίρεση αλλαγών γραμμής σε μικρά κείμενα με μία μόνο πρόταση</RemoveLineBreaks> - <RemoveLineBreaksAll>Αφαίρεση αλλαγών γραμμής σε μικρά κείμενα (εκτός διαλόγου)</RemoveLineBreaksAll> - <FixUppercaseIInsindeLowercaseWords>Επιδιόρθωση κεφαλαίου 'i' σε πεζές λέξεις (σφάλμα OCR)</FixUppercaseIInsindeLowercaseWords> - <FixDoubleApostrophes>Επιδιόρθωση διπλής αποστρόφου ('') σε εισαγωγικό (")</FixDoubleApostrophes> - <AddPeriods>Προσθήκη τελείας</AddPeriods> - <StartWithUppercaseLetterAfterParagraph>Έναρξη με κεφαλαίο γράμμα μετά από παράγραφο</StartWithUppercaseLetterAfterParagraph> - <StartWithUppercaseLetterAfterPeriodInsideParagraph>Έναρξη με κεφαλαίο γράμμα μετά από τελεία</StartWithUppercaseLetterAfterPeriodInsideParagraph> - <StartWithUppercaseLetterAfterColon>Έναρξη με κεφαλαίο γράμμα μετά από σημεία στίξης</StartWithUppercaseLetterAfterColon> - <FixLowercaseIToUppercaseI>Επιδιόρθωση πεζού 'i' σε 'Ι' (Αγγλικά)</FixLowercaseIToUppercaseI> - <FixCommonOcrErrors>Επιδιόρθωση κοινών σφαλμάτων OCR (με χρήση καταλόγου αντικατάστασης OCR)</FixCommonOcrErrors> - <CommonOcrErrorsFixed>Επιδιορθώσεις κοινών σφαλμάτων OCR (χρήση του αρχείου OcrReplaceList): {0}</CommonOcrErrorsFixed> - <RemoveSpaceBetweenNumber>Αφαίρεση διαστήματος μεταξύ αριθμών</RemoveSpaceBetweenNumber> - <FixDialogsOnOneLine>Επιδιόρθωση διαλόγων</FixDialogsOnOneLine> - <NormalizeStrings>Κανονικοποίηση συμβολοσειρών</NormalizeStrings> - <RemoveSpaceBetweenNumbersFixed>Επιδιορθώσεις αφαίρεσης διαστήματος μεταξύ αριθμών: {0}</RemoveSpaceBetweenNumbersFixed> - <FixTurkishAnsi>Επιδιόρθωση Τουρκικών ANSI (Ισλανδικών) γραμμάτων σε Unicode</FixTurkishAnsi> - <FixDanishLetterI>Επιδιόρθωση δανικού γράμματος 'i'</FixDanishLetterI> - <FixSpanishInvertedQuestionAndExclamationMarks>Επιδιόρθωση ισπανικών αντεστραμμένων σημείων στίξης</FixSpanishInvertedQuestionAndExclamationMarks> - <AddMissingQuote>Προσθήκη εισαγωγικού (")</AddMissingQuote> - <AddMissingQuotes>Προσθήκη εισαγωγικών (")</AddMissingQuotes> - <RemoveHyphensSingleLine>Αφαίρεση παύλας σε ενιαίες γραμμές</RemoveHyphensSingleLine> - <XHyphensSingleLineRemoved>Αφαίρεση παυλών: {0}</XHyphensSingleLineRemoved> - <FixHyphensInDialogs>Επιδιόρθωση παυλών μέσω στυλ διαλόγου: {0}</FixHyphensInDialogs> - <XHyphensInDialogsFixed>Επιδιόρθωση παυλών: {0}</XHyphensInDialogsFixed> - <AddMissingQuotesExample>"Πώς είσαι; -&gt; "Πώς είσαι;"</AddMissingQuotesExample> - <XMissingQuotesAdded>Προσθήκη εισαγωγικών: {0}</XMissingQuotesAdded> - <Fix3PlusLines>Επιδιόρθωση υποτίτλων με περισσότερες από δύο γραμμές</Fix3PlusLines> - <Fix3PlusLine>Επιδιόρθωση υπότιτλου με περισσότερες από δύο γραμμές</Fix3PlusLine> - <X3PlusLinesFixed>Επιδιόρθωση υποτίτλων με περισσότερες από δύο γραμμές: {0}</X3PlusLinesFixed> - <Analysing>Ανάλυση...</Analysing> - <NothingToFix>Τίποτα για επιδιόρθωση</NothingToFix> - <FixesFoundX>Εύρεση επιδιορθώσεων: {0}</FixesFoundX> - <XFixesApplied>Εφαρμοσμένες επιδιορθώσεις: {0}</XFixesApplied> - <NothingFixableBut>Τίποτα για αυτόματη επιδιόρθωση. Ο υπότιτλος περιέχει σφάλμα(τα) - προβολή αρχείου καταγραφής</NothingFixableBut> - <XFixedBut>Επιδιόρθωση {0} θέματος(ων), αλλά υπάρχουν ακόμη σφάλματα - προβολή αρχείου καταγραφής</XFixedBut> - <XCouldBeFixedBut>Επιδιόρθωση {0} θέματος(ων), αλλά θα υπάρχουν ακόμη σφάλματα - προβολή αρχείου καταγραφής</XCouldBeFixedBut> - <UncheckedFixLowercaseIToUppercaseI>Αποεπιλογή "Επιδιόρθωση μονού πεζού 'i' σε 'Ι' (Αγγλικά)"</UncheckedFixLowercaseIToUppercaseI> - <XIsChangedToUppercase>{0} άλλαγή(ές) σε κεφαλαία</XIsChangedToUppercase> - <FixFirstLetterToUppercaseAfterParagraph>Επιδιόρθωση αρχικού γράμματος σε κεφαλαίο μετά από παράγραφο</FixFirstLetterToUppercaseAfterParagraph> - <MergeShortLine>Συγχώνευση γραμμών</MergeShortLine> - <MergeShortLineAll>Συγχώνευση γραμμών (εκτός διαλόγου)</MergeShortLineAll> - <XLineBreaksAdded>Προσθήκη {0} αλλαγής(ών) γραμμής</XLineBreaksAdded> - <BreakLongLine>Διάσπαση γραμμής</BreakLongLine> - <FixLongDisplayTime>Επιδιόρθωση μεγάλου χρόνου</FixLongDisplayTime> - <FixInvalidItalicTag>Επιδιόρθωση ετικέτας πλαγιαστής γραφής</FixInvalidItalicTag> - <FixShortDisplayTime>Επιδιόρθωση σύντομου χρόνου</FixShortDisplayTime> - <FixOverlappingDisplayTime>Επιδιόρθωση επικαλυπτόμενου χρόνου</FixOverlappingDisplayTime> - <FixShortGap>Επιδιόρθωση μικρών κενών</FixShortGap> - <FixInvalidItalicTagsExample>&lt;i&gt;Δεν με ενδιαφέρει.&lt;i&gt; -&gt; &lt;i&gt;Δεν με ενδιαφέρει.&lt;/i&gt;</FixInvalidItalicTagsExample> - <RemoveUnneededSpacesExample>Εσύ , εκεί. -&gt; Εσύ, εκεί.</RemoveUnneededSpacesExample> - <RemoveUnneededPeriodsExample>Εσύ!. -&gt; Εσύ!</RemoveUnneededPeriodsExample> - <FixMissingSpacesExample>Έι.Εσύ. -&gt; Έι. Εσύ.</FixMissingSpacesExample> - <FixUppercaseIInsindeLowercaseWordsExample>The Earth is fIat. -&gt; The Earth is flat.</FixUppercaseIInsindeLowercaseWordsExample> - <FixLowercaseIToUppercaseIExample>What do i care. -&gt; What do I care.</FixLowercaseIToUppercaseIExample> - <StartTimeLaterThanEndTime>Κείμενο με αριθμό {0}: Έναρξη αργότερα από λήξη: {4}{1} -&gt; {2} {3}</StartTimeLaterThanEndTime> - <UnableToFixStartTimeLaterThanEndTime>Αδυναμία επιδιόρθωσης του κειμένου με αριθμό {0}: Έναρξη αργότερα από λήξη: {1}</UnableToFixStartTimeLaterThanEndTime> - <XFixedToYZ>Επιδιόρθωση {0} σε: {1}{2}</XFixedToYZ> - <UnableToFixTextXY>Αδυναμία επιδιόρθωσης του κειμένου με αριθμό {0}: {1}</UnableToFixTextXY> - <XOverlappingTimestampsFixed>Επιδιόρθωση {0} επικαλυπτόμενου(ων) χρόνου(ων)</XOverlappingTimestampsFixed> - <XDisplayTimesProlonged>Επέκταση {0} χρόνου(ων) εμφάνισης</XDisplayTimesProlonged> - <XInvalidHtmlTagsFixed>Επιδιόρθωση {0} λανθασμένης(ων) ετικέτας(ών) HTML</XInvalidHtmlTagsFixed> - <XDisplayTimesShortned>Σμίκρυνση {0} χρόνου(ων) εμφάνισης</XDisplayTimesShortned> - <XGapsFixed>Επιδιόρθωση {0} μικρού(ών) κενού(ών)</XGapsFixed> - <XLinesUnbreaked>Συνένωση {0} γραμμής(ών)</XLinesUnbreaked> - <UnneededSpace>Αχρείαστο διάστημα</UnneededSpace> - <XUnneededSpacesRemoved>Αφαίρεση {0} αχρείαστου(ων) διαστήματος(ων)</XUnneededSpacesRemoved> - <UnneededPeriod>Αχρείαστη τελεία</UnneededPeriod> - <XUnneededPeriodsRemoved>Αφαίρεση {0} αχρείαστης(ων) τελείας(ών)</XUnneededPeriodsRemoved> - <FixMissingSpace>Επιδιόρθωση διαστήματος</FixMissingSpace> - <XMissingSpacesAdded>Προσθήκη {0} διαστήματος(ων)</XMissingSpacesAdded> - <FixUppercaseIInsideLowercaseWord>Επιδιόρθωση κεφαλαίου 'i' μέσα σε λέξη</FixUppercaseIInsideLowercaseWord> - <XPeriodsAdded>Προσθήκη {0} τελείας(ών)</XPeriodsAdded> - <FixMissingPeriodAtEndOfLine>Προσθήκη τελείας στο τέλος πρότασης</FixMissingPeriodAtEndOfLine> - <XDoubleApostrophesFixed>Επιδιόρθωση {0} διπλών αποστρόφων</XDoubleApostrophesFixed> - <XUppercaseIsFoundInsideLowercaseWords>Εύρεση {0} κεφαλαίου(ων) 'i' μέσα σε λέξη(εις)</XUppercaseIsFoundInsideLowercaseWords> - <RefreshFixes>Ανανέωση</RefreshFixes> - <ApplyFixes>Εφαρμογή</ApplyFixes> - <AutoBreak>&amp;Διάσπαση</AutoBreak> - <Unbreak>&amp;Συνένωση</Unbreak> - <FixDoubleDash>Επιδιόρθωση '--' -&gt; '...'</FixDoubleDash> - <FixDoubleGreaterThan>Αφαίρεση '&gt;&gt;'</FixDoubleGreaterThan> - <FixEllipsesStart>Αφαίρεση αρχικού '...'</FixEllipsesStart> - <FixMissingOpenBracket>Επιδιόρθωση ελλιπής [</FixMissingOpenBracket> - <FixMusicNotation>Αντικατάσταση μουσικού συμβόλου (π.χ. âTª)</FixMusicNotation> - <XFixDoubleDash>Επιδιόρθωση {0} '--'</XFixDoubleDash> - <XFixDoubleGreaterThan>Αφαίρεση {0} &gt;&gt;</XFixDoubleGreaterThan> - <XFixEllipsesStart>Αφαίρεση {0} '...' από αρχή γραμμής</XFixEllipsesStart> - <XFixMissingOpenBracket>Επιδιόρθωση {0} ελλιπούςς(ών) [</XFixMissingOpenBracket> - <XFixMusicNotation>Αντικατάσταση {0} μουσικού(ών) συμβόλου(ων)</XFixMusicNotation> - <FixDoubleDashExample>'Τι-- αα ναι!' -&gt; 'Τι... αα ναι!'</FixDoubleDashExample> - <FixDoubleGreaterThanExample>'&gt;&gt; Ρόμπερτ: Τι τρέχει;' -&gt; 'Ρόμπερτ: Τι τρέχει;'</FixDoubleGreaterThanExample> - <FixEllipsesStartExample>'... και τότε εμείς' -&gt; 'και τότε εμείς'</FixEllipsesStartExample> - <FixMissingOpenBracketExample>'κλανκ] Πρόσεξε!' -&gt; '[κλανκ] Πρόσεξε!'</FixMissingOpenBracketExample> - <FixMusicNotationExample>'âTª sweet dreams are' -&gt; '♫ sweet dreams are'</FixMusicNotationExample> - <NumberOfImportantLogMessages>{0} σημαντικό(ά) μήνυμα(τα) του αρχείου καταγραφής</NumberOfImportantLogMessages> - <FixedOkXY>Επιδιορθωμένα και εντάξει - '{0}': {1}</FixedOkXY> - <FixOcrErrorExample>D0n't -&gt; Don't</FixOcrErrorExample> - <FixSpaceBetweenNumbersExample>1 100 -&gt; 1100</FixSpaceBetweenNumbersExample> - <FixDialogsOneLineExample>Γεια, Τζον. - Γεια, Άιντα. -&gt; Γεια, Τζον.&lt;br/&gt; - Γεια, Άιντα.</FixDialogsOneLineExample> - <SelectDefault>Προεπιλεγμένα</SelectDefault> - <SetDefault>Ορισμός προεπιλεγμένων</SetDefault> - <FixContinuationStyleX>Επιδιόρθωση στυλ συνέχισης: {0}</FixContinuationStyleX> - <XFixContinuationStyle>Επιδιόρθωση {0} στυλ συνέχισης</XFixContinuationStyle> - <FixUnnecessaryLeadingDots>Αφαίρεση αρχικών αποσιωπητικών</FixUnnecessaryLeadingDots> - <XFixUnnecessaryLeadingDots>Αφαίρεση {0} αρχικών αποσιωπητικών</XFixUnnecessaryLeadingDots> - </FixCommonErrors> - <GetDictionaries> - <Title>Χρειάζεστε λεξικά;</Title> - <DescriptionLine1>Ο ορθογραφικός έλεγχος του Subtitle Edit βασίζεται στη μηχανή NHunspell</DescriptionLine1> - <DescriptionLine2>που χρησιμοποιεί τα λεξικά ορθογραφικού ελέγχου του LibreOffice.</DescriptionLine2> - <ChooseLanguageAndClickDownload>Επιλογή γλώσσας και πατήστε λήψη</ChooseLanguageAndClickDownload> - <OpenDictionariesFolder>Άνοιγμα του φακέλου 'Dictionaries'</OpenDictionariesFolder> - <Download>Λήψη</Download> - <XDownloaded>Λήψη και εγκατάσταση {0}</XDownloaded> - </GetDictionaries> - <GetTesseractDictionaries> - <Title>Χρήση λεξικών;</Title> - <DescriptionLine1>Βρείτε λεξικά Tesseract OCR από το διαδίκτυο</DescriptionLine1> - <DownloadFailed>Αποτυχία λήψης!</DownloadFailed> - <GetDictionariesHere>Εύρεση λεξικών εδώ:</GetDictionariesHere> - <ChooseLanguageAndClickDownload>Επιλογή γλώσσας και λήψη</ChooseLanguageAndClickDownload> - <OpenDictionariesFolder>Άνοιγμα φακέλου 'Dictionaries'</OpenDictionariesFolder> - <Download>Λήψη</Download> - <XDownloaded>Λήψη και εγκατάσταση {0}</XDownloaded> - </GetTesseractDictionaries> - <GoogleTranslate> - <Title>Μετάφραση Google</Title> - <From>Από:</From> - <To>Σε:</To> - <Translate>Μετάφραση</Translate> - <PleaseWait>Παρακαλώ περιμένετε... αυτό μπορεί να αργήσει λίγο</PleaseWait> - <PoweredByGoogleTranslate>Τροφοδοτείται από τη Μετάφραση Google</PoweredByGoogleTranslate> - <PoweredByMicrosoftTranslate>Τροφοδοτείται από τη Μετάφραση Microsoft</PoweredByMicrosoftTranslate> - <MsClientSecretNeeded>Συγγνώμη, χρειάζεστε ένα γνωστικό κλειδί εξυπηρέτησης 'μετάφρασης κειμένου' από τη Microsoft για τη χρήση του. -Μετάβαση σε "Επιλογές -&gt; Ρυθμίσεις -&gt; Εργαλεία" για την εισαγωγή κλειδιού.</MsClientSecretNeeded> - <GoogleApiKeyNeeded>Συγγνώμη, χρειάζεστε ένα κλειδί API από τη Google για τη χρήση του. -Μετάβαση σε "Επιλογές -&gt; Ρυθμίσεις -&gt; Εργαλεία" για την εισαγωγή κλειδιού.</GoogleApiKeyNeeded> - <GoogleNoApiKeyWarning>Μετάφραση χωρίς κλειδί API... (αργά και περιορισμένα δεδομένα)</GoogleNoApiKeyWarning> - </GoogleTranslate> - <GoogleOrMicrosoftTranslate> - <Title>Μετάφραση Google vs Bing</Title> - <From>Από:</From> - <To>Έως:</To> - <Translate>Μετάφραση</Translate> - <SourceText>Αρχικό κείμενο</SourceText> - <GoogleTranslate>Μετάφραση Google</GoogleTranslate> - <MicrosoftTranslate>Μετάφραση Bing</MicrosoftTranslate> - </GoogleOrMicrosoftTranslate> - <GoToLine> - <Title>Μετάβαση σε υπότιτλο με αριθμό</Title> - <XIsNotAValidNumber>Το {0} δεν είναι έγκυρος αριθμός</XIsNotAValidNumber> - </GoToLine> - <ImportImages> - <Title>Εισαγωγή εικόνων</Title> - <ImageFiles>Αρχεία εικόνας</ImageFiles> - <Input>Εισαγωγή</Input> - <InputDescription>Επιλογή αρχείων για εισαγωγή (περιήγηση ή σύρσιμο)</InputDescription> - <Remove>Αφαίρεση</Remove> - <RemoveAll>Αφαίρεση όλων</RemoveAll> - </ImportImages> - <ImportSceneChanges> - <Title>Δημιουργία/εισαγωγή αλλαγών σκηνών</Title> - <OpenTextFile>Άνοιγμα αρχείου κειμένου...</OpenTextFile> - <Generate>Δημιουργία αλλαγών σκηνών</Generate> - <Import>Εισαγωγή αλλαγών σκηνών</Import> - <TextFiles>Αρχεία κειμένου</TextFiles> - <TimeCodes>Κώδικες χρόνων</TimeCodes> - <Frames>Καρέ</Frames> - <Seconds>Δευτερόλεπτα</Seconds> - <Milliseconds>Χιλιοστά δευτερολέπτου</Milliseconds> - <GetSceneChangesWithFfmpeg>Δημιουργία αλλαγών σκηνών με FFmpeg</GetSceneChangesWithFfmpeg> - <Sensitivity>Ευαισθησία</Sensitivity> - <SensitivityDescription>Μικρότερη τιμή δίνει περισσότερες αλλαγές σκηνών</SensitivityDescription> - <NoSceneChangesFound>Αδυναμία εύρεσης αλλαγών σκηνών.</NoSceneChangesFound> - </ImportSceneChanges> - <ImportText> - <Title>Εισαγωγή απλού κειμένου</Title> - <OneSubtitleIsOneFile>Πολλαπλά αρχεία - κάθε αρχείο είναι ένας υπότιτλος</OneSubtitleIsOneFile> - <OpenTextFile>Άνοιγμα αρχείου κειμένου...</OpenTextFile> - <OpenTextFiles>Άνοιγμα αρχείων κειμένου...</OpenTextFiles> - <ImportOptions>Επιλογές εισαγωγής</ImportOptions> - <Splitting>Διαχωρισμός</Splitting> - <AutoSplitText>Αυτόματος διαχωρισμός κειμένου</AutoSplitText> - <OneLineIsOneSubtitle>Μία γραμμή είναι ένας υπότιτλος</OneLineIsOneSubtitle> - <TwoLinesAreOneSubtitle>Δύο γραμμές είναι ένας υπότιτλος</TwoLinesAreOneSubtitle> - <LineBreak>Αλλαγή γραμμής</LineBreak> - <SplitAtBlankLines>Διαχωρισμός σε κενές γραμμές</SplitAtBlankLines> - <MergeShortLines>Συγχώνευση σύντομων γραμμών με συνέχιση</MergeShortLines> - <RemoveEmptyLines>Αφαίρεση κενών γραμμών</RemoveEmptyLines> - <RemoveLinesWithoutLetters>Αφαίρεση γραμμών χωρίς γράμματα</RemoveLinesWithoutLetters> - <GenerateTimeCodes>Δημιουργία κωδικών χρόνου</GenerateTimeCodes> - <TakeTimeFromFileName>Μεταφορά χρόνου από όνομα αρχείου</TakeTimeFromFileName> - <GapBetweenSubtitles>Κενό μεταξύ υποτίτλων (χιλ. δευτερολέπτου)</GapBetweenSubtitles> - <Auto>Αυτόματο</Auto> - <Fixed>Σταθερό</Fixed> - <Refresh>&amp;Ανανέωση</Refresh> - <TextFiles>Αρχεία κειμένου</TextFiles> - <PreviewLinesModifiedX>Προεπισκόπηση - τροποποιημένοι υπότιτλοι: {0}</PreviewLinesModifiedX> - <TimeCodes>Κώδικες χρόνων</TimeCodes> - <SplitAtEndChars>Διαχωρισμός στο τέλος χαρακτήρων</SplitAtEndChars> - </ImportText> - <Interjections> - <Title>Παρεμβολές</Title> - </Interjections> - <JoinSubtitles> - <Title>Ένωση υποτίτλων</Title> - <Information>Προσθήκη υποτίτλων για ένωση (η απόθεση υποστηρίζεται)</Information> - <NumberOfLines>#Γραμμές</NumberOfLines> - <StartTime>Έναρξη</StartTime> - <EndTime>Λήξη</EndTime> - <FileName>Όνομα αρχείου</FileName> - <Join>Ένωση</Join> - <TotalNumberOfLinesX>Συνολικός αριθμός γραμμών: {0:#,###,###}</TotalNumberOfLinesX> - <AlreadyCorrectTimeCodes>Τα αρχεία έχουν σωστούς κώδικες χρόνων</AlreadyCorrectTimeCodes> - <AppendTimeCodes>Προσθήκη χρόνου λήξης από προηγούμενο αρχείο</AppendTimeCodes> - <AddMs>Προσθήκη χιλ. δευτερολέπτου μετά από κάθε αρχείο</AddMs> - </JoinSubtitles> - <LanguageNames> - <NotSpecified>Αόριστο</NotSpecified> - <UnknownCodeX>Άγνωστο ({0})</UnknownCodeX> - <aaName>Αφάρ</aaName> - <abName>Αμπχαζικά</abName> - <afName>Αφρικάανς</afName> - <amName>Αμαρικά</amName> - <arName>Αραβικά</arName> - <asName>Ασαμεζικά</asName> - <ayName>Αϊμάρα</ayName> - <azName>Αζερμπαϊτζανικά</azName> - <baName>Μπασκίρ</baName> - <beName>Λευκορωσικά</beName> - <bgName>Βουλγαρικά</bgName> - <bhName>Ινδικά Μπιχάρ</bhName> - <biName>Μπισλάμα</biName> - <bnName>Μπενγκάλι</bnName> - <boName>Θιβετιανά</boName> - <brName>Βρετονικά</brName> - <caName>Καταλανικά</caName> - <coName>Κορσικανικά</coName> - <csName>Τσεχικά</csName> - <cyName>Ουαλικά</cyName> - <daName>Δανικά</daName> - <deName>Γερμανικά</deName> - <dzName>Ντζόνγκχα</dzName> - <elName>Ελληνικά</elName> - <enName>Αγγλικά</enName> - <eoName>Εσπεράντο</eoName> - <esName>Ισπανικά</esName> - <etName>Εσθονικά</etName> - <euName>Βασκικά</euName> - <faName>Περσικά</faName> - <fiName>Φινλανδικά</fiName> - <fjName>Φίτζι</fjName> - <foName>Φαρόε</foName> - <frName>Γαλλικά</frName> - <fyName>Δυτικά Φριζιανά</fyName> - <gaName>Ιρλανδικά</gaName> - <gdName>Σκωτικά Κελτικά</gdName> - <glName>Γαλικιακά</glName> - <gnName>Γκουαρανί</gnName> - <guName>Γκουγιαράτι</guName> - <haName>Χάουσα</haName> - <heName>Εβραϊκά</heName> - <hiName>Χίντι</hiName> - <hrName>Κροατικά</hrName> - <huName>Ουγγρικά</huName> - <hyName>Αρμενικά</hyName> - <iaName>Ιντερλίνγκουα</iaName> - <idName>Ινδονησιακά</idName> - <ieName>Ιντερλίνγκουε</ieName> - <ikName>Ινουπιάκ</ikName> - <isName>Ισλανδικά</isName> - <itName>Ιταλικά</itName> - <iuName>Ινουκτιτούτ</iuName> - <jaName>Ιαπωνικά</jaName> - <jvName>Ιαβανεζικά</jvName> - <kaName>Γεωργιανά</kaName> - <kkName>Καζακικά</kkName> - <klName>Καλαάλισουτ</klName> - <kmName>Καμποτζιανά</kmName> - <knName>Κανάντα</knName> - <koName>Κορεατικά</koName> - <ksName>Κασμίρι</ksName> - <kuName>Κουρδικά</kuName> - <kyName>Κυργιζικά</kyName> - <laName>Λατινικά</laName> - <lbName>Λουξεμβουργιανά</lbName> - <lnName>Λινγκάλα</lnName> - <loName>Λαοθιανά</loName> - <ltName>Λιθουανικά</ltName> - <lvName>Λετονικά</lvName> - <mgName>Μαλαγάσι</mgName> - <miName>Μάορι</miName> - <mkName>Σλαβομακεδονικά</mkName> - <mlName>Μαλαγιαλάμ</mlName> - <mnName>Μογγολικά</mnName> - <moName>Ρουμανικά Μολδαβίας</moName> - <mrName>Μαράθι</mrName> - <msName>Μαλάι</msName> - <mtName>Μαλτεζικά</mtName> - <myName>Βιρμανικά</myName> - <naName>Ναούρου</naName> - <neName>Νεπάλι</neName> - <nlName>Ολλανδικά</nlName> - <noName>Νορβηγικά</noName> - <ocName>Οκσιτανικά</ocName> - <omName>Ορόμο</omName> - <orName>Ορίγια</orName> - <paName>Παντζαπικά</paName> - <plName>Πολωνικά</plName> - <psName>Πάστο</psName> - <ptName>Πορτογαλικά</ptName> - <quName>Κετσούα</quName> - <rmName>Ρομανικά</rmName> - <rnName>Ρούντι</rnName> - <roName>Ρουμανικά</roName> - <ruName>Ρωσικά</ruName> - <rwName>Κινιαρβάντα</rwName> - <saName>Σανσκριτικά</saName> - <sdName>Σίντι</sdName> - <sgName>Σάνγκο</sgName> - <shName>Σερβοκροατικά</shName> - <siName>Σινχαλεζικά</siName> - <skName>Σλοβακικά</skName> - <slName>Σλοβενικά</slName> - <smName>Σαμόαν</smName> - <snName>Σχόνα</snName> - <soName>Σομάλι</soName> - <sqName>Αλβανικά</sqName> - <srName>Σερβικά</srName> - <ssName>Σουάτι</ssName> - <stName>Νότια Σόθο</stName> - <suName>Σουνδανικά</suName> - <svName>Σουηδικά</svName> - <swName>Σουαχίλι</swName> - <taName>Ταμίλ</taName> - <teName>Τελούγκου</teName> - <tgName>Τατζίκ</tgName> - <thName>Ταϊλανδικά</thName> - <tiName>Τιγκρίνυα</tiName> - <tkName>Τουρκμενικά</tkName> - <tlName>Ταγκαλόγκ</tlName> - <tnName>Τσιγουάνα</tnName> - <toName>Τονγκανικά</toName> - <trName>Τουρκικά</trName> - <tsName>Τσόνγκα</tsName> - <ttName>Τατάρ</ttName> - <twName>Τούι</twName> - <ugName>Ουιγουρικά</ugName> - <ukName>Ουκρανικά</ukName> - <urName>Ουρντού</urName> - <uzName>Ουζμπεκικά</uzName> - <viName>Βιετναμικά</viName> - <voName>Βόλαπικ</voName> - <woName>Γουόλοφ</woName> - <xhName>Ζόσα</xhName> - <yiName>Γίντις</yiName> - <yoName>Γιορούμπα</yoName> - <zaName>Ζουάνγκ</zaName> - <zhName>Κινεζικά</zhName> - <zuName>Ζουλού</zuName> - </LanguageNames> - <Main> - <Menu> - <File> - <Title>&amp;Αρχείο</Title> - <New>&amp;Νέο</New> - <Open>Ά&amp;νοιγμα</Open> - <OpenKeepVideo>Άνοιγμα (κράτηση βίντεο)</OpenKeepVideo> - <Reopen>Άνοιγμα &amp;ξανά</Reopen> - <Save>Α&amp;ποθήκευση</Save> - <SaveAs>Αποθήκευση &amp;ως...</SaveAs> - <RestoreAutoBackup>Επαναφορά αυτόματου αντίγραφου ασφαλείας</RestoreAutoBackup> - <AdvancedSubStationAlphaProperties>Προηγμένες ιδιότητες Sub Station Alpha...</AdvancedSubStationAlphaProperties> - <SubStationAlphaProperties>Ιδιότητες Sub Station Alpha...</SubStationAlphaProperties> - <EbuProperties>Ιδιότητες EBU STL...</EbuProperties> - <DvdStuioProProperties>Ιδιότητες DVD Studio Pro...</DvdStuioProProperties> - <TimedTextProperties>Ιδιότητες Timed Text...</TimedTextProperties> - <PacProperties>Ιδιότητες PAC...</PacProperties> - <OpenOriginal>Άνοιγμα αρχικού υπότιτλου (λειτουργία μετάφρασης)...</OpenOriginal> - <SaveOriginal>Αποθήκευση αρχικού υπότιτλου</SaveOriginal> - <CloseOriginal>Κλείσιμο αρχικού υπότιτλου</CloseOriginal> - <OpenContainingFolder>Άνοιγμα περιέχοντα φακέλου</OpenContainingFolder> - <Compare>&amp;Σύγκριση...</Compare> - <Statistics>Στατιστι&amp;κά...</Statistics> - <Plugins>Πρόσθετα...</Plugins> - <ImportOcrFromDvd>Εισαγωγή/OCR υπότιτλου από VOB/IFO (DVD)...</ImportOcrFromDvd> - <ImportOcrVobSubSubtitle>Εισαγωγή/OCR υπότιτλου VobSub (sub/idx)...</ImportOcrVobSubSubtitle> - <ImportBluRaySupFile>Εισαγωγή/OCR αρχείου Blu-ray sup...</ImportBluRaySupFile> - <ImportXSub>Εισαγωγή/OCR XSub από DivX/avi...</ImportXSub> - <ImportSubtitleFromMatroskaFile>Εισαγωγή/OCR υπότιτλου από αρχείο Matroska...</ImportSubtitleFromMatroskaFile> - <ImportSubtitleWithManualChosenEncoding>Εισαγωγή υπότιτλου με επιλογή κωδικοποίησης...</ImportSubtitleWithManualChosenEncoding> - <ImportText>Εισαγωγή απλού κειμένου...</ImportText> - <ImportImages>Εισαγωγή εικόνων...</ImportImages> - <ImportTimecodes>Εισαγωγή κωδικών χρόνου...</ImportTimecodes> - <Export>Εξαγωγή</Export> - <ExportBdnXml>BDN xml/png...</ExportBdnXml> - <ExportBluRaySup>Blu-ray sup...</ExportBluRaySup> - <ExportVobSub>VobSub (sub/idx)...</ExportVobSub> - <ExportCavena890>Cavena 890...</ExportCavena890> - <ExportEbu>EBU STL...</ExportEbu> - <ExportPac>PAC (Ηλεκτρονικά οθόνης)...</ExportPac> - <ExportPlainText>Απλό κείμενο...</ExportPlainText> - <ExportAdobeEncoreFabImageScript>Εικόνα κειμένου Adobe Encore FAB...</ExportAdobeEncoreFabImageScript> - <ExportKoreanAtsFilePair>Ζεύγος αρχείων Korean ATS...</ExportKoreanAtsFilePair> - <ExportAvidStl>Avid STL...</ExportAvidStl> - <ExportDvdStudioProStl>DVD Studio Pro STL...</ExportDvdStudioProStl> - <ExportCapMakerPlus>CapMaker Plus...</ExportCapMakerPlus> - <ExportCaptionsInc>Captions Inc...</ExportCaptionsInc> - <ExportCheetahCap>Cheetah CAP...</ExportCheetahCap> - <ExportUltech130>Λεζάντα Ultech...</ExportUltech130> - <ExportCustomTextFormat>Εξαγωγή προσαρμοσμένης μορφής κειμένου...</ExportCustomTextFormat> - <Exit>Έ&amp;ξοδος</Exit> - </File> - <Edit> - <Title>Επεξεργασία</Title> - <Undo>Αναίρεση</Undo> - <Redo>Επανάληψη</Redo> - <ShowUndoHistory>Εμφάνιση ιστορικού (αναίρεσης)</ShowUndoHistory> - <InsertUnicodeSymbol>Εισαγωγή συμβόλου Unicode</InsertUnicodeSymbol> - <InsertUnicodeControlCharacters>Εισαγωγή χαρακτήρων ελέγχου Unicode</InsertUnicodeControlCharacters> - <InsertUnicodeControlCharactersLRM>Σημείο αριστερά προς δεξιά</InsertUnicodeControlCharactersLRM> - <InsertUnicodeControlCharactersRLM>Σημείο δεξιά προς αριστερά</InsertUnicodeControlCharactersRLM> - <InsertUnicodeControlCharactersLRE>Έναρξη ενσωμάτωσης από αριστερά προς δεξιά</InsertUnicodeControlCharactersLRE> - <InsertUnicodeControlCharactersRLE>Έναρξη ενσωμάτωσης από δεξιά προς αριστερά</InsertUnicodeControlCharactersRLE> - <InsertUnicodeControlCharactersLRO>Έναρξη παράκαμψης από αριστερά προς δεξιά</InsertUnicodeControlCharactersLRO> - <InsertUnicodeControlCharactersRLO>Έναρξη παράκαμψης από δεξιά προς αριστερά</InsertUnicodeControlCharactersRLO> - <Find>Εύ&amp;ρεση</Find> - <FindNext>Εύρεση &amp;επόμενου</FindNext> - <Replace>Α&amp;ντικατάσταση</Replace> - <MultipleReplace>&amp;Πολλαπλή αντικατάστση...</MultipleReplace> - <GoToSubtitleNumber>&amp;Μετάβαση σε αριθμό υπότιτλου...</GoToSubtitleNumber> - <RightToLeftMode>Λειτουργία από δεξιά προς αριστερά</RightToLeftMode> - <FixRtlViaUnicodeControlCharacters>Επιδιόρθωση RTL μέσω χαρακτήρων ελέγχου Unicode (επιλεγμένων γραμμών)</FixRtlViaUnicodeControlCharacters> - <RemoveUnicodeControlCharacters>Αφαίρεση χαρακτήρων ελέγχου Unicode (επιλεγμένων γραμμών)</RemoveUnicodeControlCharacters> - <ReverseRightToLeftStartEnd>Αντιστροφή έναρξης/λήξης του RTL (επιλεγμένες γραμμές)</ReverseRightToLeftStartEnd> - <ShowOriginalTextInAudioAndVideoPreview>Προβολή αρχικού κειμένου στις προεπισκόπήσεις ήχου/βίντεο</ShowOriginalTextInAudioAndVideoPreview> - <ModifySelection>Επεξεργασία επιλογής...</ModifySelection> - <InverseSelection>Αντιστροφή</InverseSelection> - </Edit> - <Tools> - <Title>Εργαλεία</Title> - <AdjustDisplayDuration>&amp;Προσαρμογή διαρκειών...</AdjustDisplayDuration> - <ApplyDurationLimits>Εφαρμογή ορίων διάρκειας...</ApplyDurationLimits> - <SubtitlesBridgeGaps>Ένωση κενών στις διάρκειες...</SubtitlesBridgeGaps> - <FixCommonErrors>&amp;Επιδιόρθωση σφαλμάτων...</FixCommonErrors> - <StartNumberingFrom>Επαναρίθμηση...</StartNumberingFrom> - <RemoveTextForHearingImpaired>Αφαίρεση κειμένου για κωφούς...</RemoveTextForHearingImpaired> - <ChangeCasing>Αλλαγή πεζών-κεφαλαίων...</ChangeCasing> - <ChangeFrameRate>Αλλαγή ρυθμού καρέ...</ChangeFrameRate> - <ChangeSpeedInPercent>Αλλαγή ταχύτητας (επί τοις εκατό)...</ChangeSpeedInPercent> - <MergeShortLines>Συγχώνευση σύντομων γραμμών...</MergeShortLines> - <MergeDuplicateText>Συγχώνευση γραμμών με ίδιο κείμενο...</MergeDuplicateText> - <MergeSameTimeCodes>Συγχώνευση γραμμών με ίδιο χρόνο...</MergeSameTimeCodes> - <SplitLongLines>Διαχωρισμός μεγάλων γραμμών...</SplitLongLines> - <MinimumDisplayTimeBetweenParagraphs>Ελάχιστος χρόνος εμφάνισης μεταξύ παραγράφων...</MinimumDisplayTimeBetweenParagraphs> - <SortBy>Ταξινόμηση</SortBy> - <NetflixQualityCheck>Έλεγχος ποιότητας Netflix...</NetflixQualityCheck> - <Number>Αριθμός</Number> - <StartTime>Έναρξη</StartTime> - <EndTime>Λήξη</EndTime> - <Duration>Διάρκεια</Duration> - <TextAlphabetically>Κείμενο - αλφαβητικά</TextAlphabetically> - <TextSingleLineMaximumLength>Κείμενο - μέγιστο μήκος γραμμής</TextSingleLineMaximumLength> - <TextTotalLength>Κείμενο - συνολικό μήκος</TextTotalLength> - <TextNumberOfLines>Κείμενο - σύνολο γραμμών</TextNumberOfLines> - <TextNumberOfCharactersPerSeconds>Κείμενο - σύνολο χαρακτήρων/δευτ.</TextNumberOfCharactersPerSeconds> - <WordsPerMinute>Κείμενο - λέξεις ανά λεπτό (λαλ)</WordsPerMinute> - <Style>Στυλ</Style> - <Ascending>Αύξουσα</Ascending> - <Descending>Φθίνουσα</Descending> - <MakeNewEmptyTranslationFromCurrentSubtitle>Δημιουργία νέας κενής μετάφρασης</MakeNewEmptyTranslationFromCurrentSubtitle> - <BatchConvert>Μαζική μετατροπή...</BatchConvert> - <GenerateTimeAsText>Παραγωγή χρόνου ως κείμενο...</GenerateTimeAsText> - <MeasurementConverter>Μετατροπέας μονάδων μέτρησης...</MeasurementConverter> - <SplitSubtitle>Διάσπαση υπότιτλου...</SplitSubtitle> - <AppendSubtitle>Προσάρτηση υπότιτλου...</AppendSubtitle> - <JoinSubtitles>Ένωση υποτίτλων...</JoinSubtitles> - </Tools> - <Video> - <Title>Βίντεο</Title> - <OpenVideo>Άνοιγμα αρχείου βίντεο...</OpenVideo> - <OpenVideoFromUrl>Άνοιγμα βίντεο από διεύθυνση url...</OpenVideoFromUrl> - <OpenDvd>Άνοιγμα DVD...</OpenDvd> - <ChooseAudioTrack>Επιλέξτε κομματιού ήχου</ChooseAudioTrack> - <CloseVideo>Κλείσιμο βίντεο</CloseVideo> - <OpenSecondSubtitle>Άνοιγμα δεύτερου υποτίτλου...</OpenSecondSubtitle> - <SetVideoOffset>Αντιστάθμιση έναρξης βίντεο...</SetVideoOffset> - <SmptTimeMode>Χρονισμός SMPTE (ρήξη καρέ)</SmptTimeMode> - <GenerateTextFromVideo>Δημιουργία κειμένου από βίντεο...</GenerateTextFromVideo> - <ImportChaptersFromVideo>Εισαγωγή κεφαλαίων από βίντεο</ImportChaptersFromVideo> - <GenerateImportSceneChanges>Δημιουργία/εισαγωγή αλλαγών σκηνών...</GenerateImportSceneChanges> - <RemoveSceneChanges>Αφαίρεση σκηνών αλλαγής</RemoveSceneChanges> - <WaveformBatchGenerate>Μαζική δημιουργία κυματομορφών...</WaveformBatchGenerate> - <ShowHideVideo>Εμφάνιση/απόκρυψη βίντεο</ShowHideVideo> - <ShowHideWaveform>Εμφάνιση/απόκρυψη κυματομορφής</ShowHideWaveform> - <ShowHideWaveformAndSpectrogram>Εμφάνιση/απόκρυψη κυματομορφής και φασματογράμματος</ShowHideWaveformAndSpectrogram> - <UnDockVideoControls>Απαγκύρωση στοιχείων ελέγχου βίντεο</UnDockVideoControls> - <ReDockVideoControls>Επαναγκύρωση στοιχείων ελέγχου βίντεο</ReDockVideoControls> - </Video> - <SpellCheck> - <Title>Ορθογραφικός έλεγχος</Title> - <SpellCheck>&amp;Ορθογραφικός έλεγχος...</SpellCheck> - <SpellCheckFromCurrentLine>Ορθογραφικός έλεγχος από τρέχουσα γραμμή...</SpellCheckFromCurrentLine> - <FindDoubleWords>Εύρεση διπλών λέξεων</FindDoubleWords> - <FindDoubleLines>Εύρεση διπλών γραμμών</FindDoubleLines> - <GetDictionaries>Λήψη λεξικών...</GetDictionaries> - <AddToNameList>Προσθήκη λέξης στη λίστα ονομάτων</AddToNameList> - </SpellCheck> - <Synchronization> - <Title>Συγχρονισμός</Title> - <AdjustAllTimes>Προσαρμογή όλων των χρόνων (εμφάνιση νωρίτερα/αργότερα)...</AdjustAllTimes> - <VisualSync>&amp;Οπτικός συγχρονισμός...</VisualSync> - <PointSync>Συγχρονισμός σημείων...</PointSync> - <PointSyncViaOtherSubtitle>Συγχρονισμός σημείων μέσω υπότιτλου...</PointSyncViaOtherSubtitle> - </Synchronization> - <AutoTranslate> - <Title>Αυτόματη μετάφραση</Title> - <TranslatePoweredByGoogle>Μετάφραση Google...</TranslatePoweredByGoogle> - <TranslatePoweredByMicrosoft>Μετάφραση Bing...</TranslatePoweredByMicrosoft> - <TranslateFromSwedishToDanish>Μετάφραση από Σουηδικά σε Δανικά (τροφοδοτείται από nikse.dk)...</TranslateFromSwedishToDanish> - </AutoTranslate> - <Options> - <Title>Επιλογές</Title> - <Settings>&amp;Ρυθμίσεις...</Settings> - <ChooseLanguage>&amp;Επιλογή γλώσσας...</ChooseLanguage> - </Options> - <Networking> - <Title>Δίκτυο</Title> - <StartNewSession>Έναρξη νέας συνεδρίας</StartNewSession> - <JoinSession>Συμμετοχή</JoinSession> - <ShowSessionInfoAndLog>Προβολή πληροφοριών και αρχείου καταγραφής</ShowSessionInfoAndLog> - <Chat>Συνομιλία</Chat> - <LeaveSession>Έξοδος</LeaveSession> - </Networking> - <Help> - <CheckForUpdates>Έλεγχος ενημερώσεων...</CheckForUpdates> - <Title>Βοήθεια</Title> - <Help>&amp;Βοήθεια</Help> - <About>&amp;Πληροφορίες</About> - </Help> - <ToolBar> - <New>Νέο</New> - <Open>Άνοιγμα</Open> - <Save>Αποθήκευση</Save> - <SaveAs>Αποθήκευση ως</SaveAs> - <Find>Εύρεση</Find> - <Replace>Αντικατάσταση</Replace> - <FixCommonErrors>Διόρθωση συνηθισμένων σφαλμάτων</FixCommonErrors> - <RemoveTextForHi>Αφαίρεση κειμένου για κωφούς</RemoveTextForHi> - <VisualSync>Οπτικός συγχρονισμός</VisualSync> - <SpellCheck>Ορθογραφικός έλεγχος</SpellCheck> - <NetflixQualityCheck>Έλεγχος ποιότητας Netflix</NetflixQualityCheck> - <Settings>Ρυθμίσεις</Settings> - <Help>Βοήθεια</Help> - <ShowHideWaveform>Εμφάνιση/απόκρυψη κυματομορφής</ShowHideWaveform> - <ShowHideVideo>Εμφάνιση/απόκρυψη βίντεο</ShowHideVideo> - </ToolBar> - <ContextMenu> - <SizeAllColumnsToFit>Αλλαγή μεγέθους στηλών για να χωρούν</SizeAllColumnsToFit> - <AdvancedSubStationAlphaSetStyle>Προηγμένο Sub Station Alpha - ορισμός στυλ</AdvancedSubStationAlphaSetStyle> - <SubStationAlphaSetStyle>Sub Station Alpha - Ορισμός στυλ</SubStationAlphaSetStyle> - <SetActor>Ορισμός παράγοντα</SetActor> - <SubStationAlphaStyles>Στυλ Sub Station Alpha...</SubStationAlphaStyles> - <AdvancedSubStationAlphaStyles>Προηγμένο στυλ Sub Station Alpha...</AdvancedSubStationAlphaStyles> - <TimedTextSetRegion>Timed Text - ορισμός περιοχής</TimedTextSetRegion> - <TimedTextSetStyle>Timed Text - ορισμός στυλ</TimedTextSetStyle> - <TimedTextStyles>Στυλ Timed Text...</TimedTextStyles> - <TimedTextSetLanguage>Timed Text - ορισμός γλώσσας</TimedTextSetLanguage> - <SamiSetStyle>Sami - ορισμός κλάσης</SamiSetStyle> - <NuendoSetStyle>Nuendo - ορισμός χαρακτήρα</NuendoSetStyle> - <Cut>Αποκοπή</Cut> - <Copy>Αντιγραφή</Copy> - <Paste>Επικόλληση</Paste> - <Delete>Διαγραφή</Delete> - <SplitLineAtCursorPosition>Διαχωρισμός γραμμής στην θέση του δείκτη</SplitLineAtCursorPosition> - <SplitLineAtCursorAndWaveformPosition>Διαχωρισμός γραμμής στη θέση δείκτη/βίντεο</SplitLineAtCursorAndWaveformPosition> - <AutoDurationCurrentLine>Αυτόματη διάρκεια (τρέχουσα γραμμή)</AutoDurationCurrentLine> - <SelectAll>Επιλογή όλων</SelectAll> - <InsertFirstLine>Εισαγωγή γραμμής</InsertFirstLine> - <InsertBefore>Εισαγωγή πριν</InsertBefore> - <InsertAfter>Εισαγωγή μετά</InsertAfter> - <InsertSubtitleAfter>Εισαγωγή υπότιτλου έπειτα της γραμμής...</InsertSubtitleAfter> - <CopyToClipboard>Αντιγραφή κειμένου στο πρόχειρο</CopyToClipboard> - <Column>Στήλη</Column> - <ColumnDeleteText>Διαγραφή κειμένου</ColumnDeleteText> - <ColumnDeleteTextAndShiftCellsUp>Διαγραφή κειμένου και ανέβασμα κελιών</ColumnDeleteTextAndShiftCellsUp> - <ColumnInsertEmptyTextAndShiftCellsDown>Εισαγωγή κενού κειμένου και κατέβασμα κελιών</ColumnInsertEmptyTextAndShiftCellsDown> - <ColumnInsertTextFromSubtitle>Εισαγωγή κειμένου από υπότιτλο...</ColumnInsertTextFromSubtitle> - <ColumnImportTextAndShiftCellsDown>Εισαγωγή κειμένου και κατέβασμα κελιών</ColumnImportTextAndShiftCellsDown> - <ColumnPasteFromClipboard>Επικόλληση από το πρόχειρο...</ColumnPasteFromClipboard> - <ColumnTextUp>Κείμενο πάνω</ColumnTextUp> - <ColumnTextDown>Κείμενο κάτω</ColumnTextDown> - <ColumnCopyOriginalTextToCurrent>Αντιγραφή κειμένου από το αρχικό στο τρέχων</ColumnCopyOriginalTextToCurrent> - <Split>Διαχωρισμός</Split> - <MergeSelectedLines>Συγχώνευση γραμμών</MergeSelectedLines> - <MergeSelectedLinesAsDialog>Συγχώνευση γραμμών ως διάλογο</MergeSelectedLinesAsDialog> - <MergeWithLineBefore>Συγχώνευση με τη γραμμή πριν</MergeWithLineBefore> - <MergeWithLineAfter>Συγχώνευση με τη γραμμή μετά</MergeWithLineAfter> - <ExtendToLineBefore>Επέκταση στην προηγούμενη γραμμή</ExtendToLineBefore> - <ExtendToLineAfter>Επέκταση στην επόμενη γραμμή</ExtendToLineAfter> - <RemoveFormatting>Αφαίρεση μορφοποίησης</RemoveFormatting> - <RemoveFormattingAll>Αφαίρεση όλης της μορφοποίησης</RemoveFormattingAll> - <RemoveFormattingBold>Αφαίρεση έντονων</RemoveFormattingBold> - <RemoveFormattingItalic>Αφαίρεση πλαγιαστών</RemoveFormattingItalic> - <RemoveFormattingUnderline>Αφαίρεση υπογράμμισης</RemoveFormattingUnderline> - <RemoveFormattingColor>Αφαίρεση χρώματος</RemoveFormattingColor> - <RemoveFormattingFontName>Αφαίρεση ονόματος γραμματοσειράς</RemoveFormattingFontName> - <RemoveFormattingAlignment>Αφαίρεση στοίχισης</RemoveFormattingAlignment> - <Underline>Υπογράμμιση</Underline> - <Box>Πλαίσιο</Box> - <Color>Χρώμα...</Color> - <FontName>Όνομα γραμματοσειράς...</FontName> - <Superscript>Εκθέτης</Superscript> - <Subscript>Δείκτης</Subscript> - <Alignment>Στοίχιση...</Alignment> - <AutoBalanceSelectedLines>Αυτόματη ισορρόπηση γραμμών...</AutoBalanceSelectedLines> - <RemoveLineBreaksFromSelectedLines>Αφαίρεση αλλαγών γραμμής από γραμμές...</RemoveLineBreaksFromSelectedLines> - <TypewriterEffect>Εφέ γραφομηχανής...</TypewriterEffect> - <KaraokeEffect>Εφέ καραόκε...</KaraokeEffect> - <ShowSelectedLinesEarlierLater>Εμφάνιση γραμμών νωρίτερα/αργότερα...</ShowSelectedLinesEarlierLater> - <VisualSyncSelectedLines>Οπτικός συγχρονισμός γραμμών...</VisualSyncSelectedLines> - <GoogleAndMicrosoftTranslateSelectedLine>Μετάφραση αρχικής γραμμής μέσω Google/Microsoft</GoogleAndMicrosoftTranslateSelectedLine> - <TranslateSelectedLines>Μετάφραση γραμμών...</TranslateSelectedLines> - <AdjustDisplayDurationForSelectedLines>Προσαρμογή διαρκειών γραμμών...</AdjustDisplayDurationForSelectedLines> - <FixCommonErrorsInSelectedLines>Επιδιόρθωση κοινών σφαλμάτων στις γραμμές...</FixCommonErrorsInSelectedLines> - <ChangeCasingForSelectedLines>Αλλαγή πεζών-κεφαλαίων στις γραμμές...</ChangeCasingForSelectedLines> - <SaveSelectedLines>Αποθήκευση γραμμών ως...</SaveSelectedLines> - <WebVTTSetNewVoice>Καθορισμός νέας φωνής...</WebVTTSetNewVoice> - <WebVTTRemoveVoices>Αφαίρεση φωνών</WebVTTRemoveVoices> - <NewActor>Νέος ηθοποιός...</NewActor> - <RemoveActors>Αφαίρεση ηθοποιών</RemoveActors> - <EditBookmark>Επεξεργασία σημείωσης</EditBookmark> - <RemoveBookmark>Αφαίρεση σημείωσης</RemoveBookmark> - </ContextMenu> - </Menu> - <Controls> - <SubtitleFormat>Μορφή</SubtitleFormat> - <FileEncoding>Κωδικοποίηση</FileEncoding> - <ListView>Προβολή λίστας</ListView> - <SourceView>Προβολή πηγής</SourceView> - <UndoChangesInEditPanel>Αναίρεση αλλαγών στον πίνακα επεξεργασίας</UndoChangesInEditPanel> - <Previous>&lt; Προηγούμενο</Previous> - <Next>Επόμενο &gt;</Next> - <AutoBreak>&amp;Διάσπαση</AutoBreak> - <Unbreak>Συνένωση</Unbreak> - </Controls> - <VideoControls> - <Translate>Μετάφραση</Translate> - <CreateAndAdjust>Δημιουργία/προσαρμογή</CreateAndAdjust> - <Create>Δημιουργία</Create> - <Adjust>Προσαρμογή</Adjust> - <SelectCurrentElementWhilePlaying>Επιλογή τρέχοντος υπότιτλου κατά την αναπαραγωγή</SelectCurrentElementWhilePlaying> - <AutoRepeat>Αυτόματη επανάληψη</AutoRepeat> - <AutoRepeatOn>Ενεργοποίηση αυτόματης επανάληψης</AutoRepeatOn> - <AutoRepeatCount>Μετρητής επαναλήψεων (φορές)</AutoRepeatCount> - <AutoContinue>Αυτόματη συνέχιση</AutoContinue> - <AutoContinueOn>Ενεργοποίηση αυτόματης συνέχισης</AutoContinueOn> - <DelayInSeconds>Καθυστέρηση (δευτ.)</DelayInSeconds> - <OriginalText>Αρχικό κείμενο</OriginalText> - <Previous>&lt; &amp;Προηγούμενο</Previous> - <Stop>&amp;Διακοπή</Stop> - <PlayCurrent>&amp;Αναπαραγωγή τρέχοντος</PlayCurrent> - <Next>&amp;Επόμενο &gt;</Next> - <Playing>Σε αναπαραγωγή...</Playing> - <RepeatingLastTime>Επανάληψη... τελευταία φορά</RepeatingLastTime> - <RepeatingXTimesLeft>Επανάληψη... {0} φορές που απέμειναν</RepeatingXTimesLeft> - <AutoContinueInOneSecond>Αυτόματη συνέχιση σε ένα δευτ.</AutoContinueInOneSecond> - <AutoContinueInXSeconds>Αυτόματη συνέχιση σε {0} δευτ.</AutoContinueInXSeconds> - <StillTypingAutoContinueStopped>Πληκτρολόγηση σε εξέλιξη... διακοπή αυτόματης συνέχισης</StillTypingAutoContinueStopped> - <InsertNewSubtitleAtVideoPosition>&amp;Εισαγωγή νέου υποτίτλου</InsertNewSubtitleAtVideoPosition> - <InsertNewSubtitleAtVideoPositionNoTextBoxFocus>Εισαγωγή υποτίτλου στη θέση βίντεο (μη εστίαση πλαισίου)</InsertNewSubtitleAtVideoPositionNoTextBoxFocus> - <Auto>Αυτόματη</Auto> - <PlayFromJustBeforeText>Αναπαραγωγή &amp;πριν από</PlayFromJustBeforeText> - <Pause>Παύση</Pause> - <GoToSubtitlePositionAndPause>Μετάβαση και παύση</GoToSubtitlePositionAndPause> - <SetStartTime>Ορισμός έ&amp;ναρξης</SetStartTime> - <SetEndTimeAndGoToNext>Ο&amp;ρισμός λήξης &amp;&amp; μετάβαση</SetEndTimeAndGoToNext> - <AdjustedViaEndTime>Προσάρμοση μέσω χρόνου λήξης {0}</AdjustedViaEndTime> - <SetEndTime>Ορισμός λή&amp;ξης</SetEndTime> - <SetstartTimeAndOffsetOfRest>Έναρ&amp;ξη και αντιστάθμιση</SetstartTimeAndOffsetOfRest> - <SearchTextOnline>Αναζήτηση κειμένου διαδικτυακά</SearchTextOnline> - <GoogleTranslate>Μετάφραση Google</GoogleTranslate> - <GoogleIt>Αναζήτηση</GoogleIt> - <SecondsBackShort>&lt;&lt;</SecondsBackShort> - <SecondsForwardShort>&gt;&gt;</SecondsForwardShort> - <VideoPosition>Θέση βίντεο:</VideoPosition> - <TranslateTip>Συμβουλή: Χρησιμοποιήστε &lt;alt+βέλη πάνω/κάτω&gt; για μετάβαση σε προηγούμενο/επόμενο υπότιτλο</TranslateTip> - <BeforeChangingTimeInWaveformX>Πριν την αλλαγή χρόνου στην κυματομορφή: {0}</BeforeChangingTimeInWaveformX> - <NewTextInsertAtX>Νέο κείμενο εισήχθει στο {0}</NewTextInsertAtX> - <Center>Κέντρο</Center> - <PlayRate>Ρυθμός αναπαραγωγής (ταχύτητα)</PlayRate> - </VideoControls> - <SaveChangesToUntitled>Αποθήκευση αλλαγών στο άτιτλο;</SaveChangesToUntitled> - <SaveChangesToX>Αποθήκευση αλλαγών στο {0};</SaveChangesToX> - <SaveChangesToUntitledOriginal>Αποθήκευση αλλαγών στον αρχικό άτιτλο;</SaveChangesToUntitledOriginal> - <SaveChangesToOriginalX>Αποθήκευση αλλαγών στον αρχικό {0};</SaveChangesToOriginalX> - <SaveSubtitleAs>Αποθήκευση υποτίτλου ως...</SaveSubtitleAs> - <SaveOriginalSubtitleAs>Αποθήκευση αρχικού υποτίτλου ως...</SaveOriginalSubtitleAs> - <NoSubtitleLoaded>Μη φορτωμένος υπότιτλος</NoSubtitleLoaded> - <VisualSyncSelectedLines>Οπτικός συγχρονισμός - επιλεγμένες γραμμές</VisualSyncSelectedLines> - <VisualSyncTitle>Οπτικός συγχρονισμός</VisualSyncTitle> - <BeforeVisualSync>Πριν οπτικού συγχρονισμού</BeforeVisualSync> - <VisualSyncPerformedOnSelectedLines>Εκτελέστηκε οπτικός συγχρονισμός στις επιλεγμένες γραμμές</VisualSyncPerformedOnSelectedLines> - <VisualSyncPerformed>Εκτελέστηκε οπτικός συγχρονισμός</VisualSyncPerformed> - <FileXIsLargerThan10MB>Το αρχείο {0} είναι μεγαλύτερο από 10 MB</FileXIsLargerThan10MB> - <ContinueAnyway>Συνέχιση;</ContinueAnyway> - <BeforeLoadOf>Πριν τη φόρτωση του {0}</BeforeLoadOf> - <LoadedSubtitleX>Φόρτωση υποτίτλου {0}</LoadedSubtitleX> - <LoadedEmptyOrShort>Φόρτωση κενού ή σύντομου υποτίτλου {0}</LoadedEmptyOrShort> - <FileIsEmptyOrShort>Το αρχείο είναι κενό ή μικρό!</FileIsEmptyOrShort> - <FileNotFound>Αδυναμία εύρεσης αρχείου: {0}</FileNotFound> - <SavedSubtitleX>Αποθήκευση υποτίτλου {0}</SavedSubtitleX> - <SavedOriginalSubtitleX>Αποθήκευση αρχικού υποτίτλου {0}</SavedOriginalSubtitleX> - <FileOnDiskModified>Τροποποίηση αρχείου δίσκου</FileOnDiskModified> - <OverwriteModifiedFile>Αντικατάσταση του αρχείου {0} που τροποποιήθηκε στο {1} {2}{3} με το τρέχον αρχείο που φορτώθηκε από το δίσκο στο {4} {5};</OverwriteModifiedFile> - <FileXIsReadOnly>Αδυναμία αποθήκευσης {0} -Το αρχείο είναι μόνο για ανάγνωση!</FileXIsReadOnly> - <UnableToSaveSubtitleX>Αδυναμία αποθήκευσης του αρχείου υπότιτλων {0} -Ο υπότιτλος μοιάζει να είναι άδειος - προσπαθήστε να τον ξανασώσεται, εάν δουλεύεται σε έγκυρο αρχείο</UnableToSaveSubtitleX> - <FormatXShouldUseUft8>Να χρησιμοποιείται η κωδικοποίηση UTF-8 κατά την αποθήκευση {0} αρχείων!</FormatXShouldUseUft8> - <BeforeNew>Πριν από νέο</BeforeNew> - <New>Νέο</New> - <BeforeConvertingToX>Πριν από μετατροπή σε {0}</BeforeConvertingToX> - <ConvertedToX>Μετατράπηκε σε {0}</ConvertedToX> - <BeforeShowEarlier>Πριν από εμφάνιση νωρίτερα</BeforeShowEarlier> - <BeforeShowLater>Πριν από εμφάνιση αργότερα</BeforeShowLater> - <LineNumberX>Γραμμή με αριθμό: {0:#,##0.##}</LineNumberX> - <OpenVideoFile>Άνοιγμα βίντεο...</OpenVideoFile> - <NewFrameRateUsedToCalculateTimeCodes>Ο νέος ρυθμός καρέ ({0}) χρησιμοποιήθηκε για τον υπολογισμό των κωδικών χρόνου έναρξης/λήξης</NewFrameRateUsedToCalculateTimeCodes> - <NewFrameRateUsedToCalculateFrameNumbers>Ο νέος ρυθμός καρέ ({0}) χρησιμοποιήθηκε για τον υπολογισμό των αριθμών καρέ έναρξης/λήξης</NewFrameRateUsedToCalculateFrameNumbers> - <FindContinue>Αδυναμία εύρεσης στοιχείου. -Επανάληψη αναζήτησης από την αρχή;</FindContinue> - <FindContinueTitle>Συνέχιση εύρεσης;</FindContinueTitle> - <ReplaceContinueNotFound>Αδυναμία εύρεσης στοιχείου. -Επανάληψη αναζήτησης και αντικατάστασης από την αρχή;</ReplaceContinueNotFound> - <ReplaceXContinue>Εύρεση και αντικατάσταση στοιχείου {0} φορά(ες). -Επανάληψη αναζήτησης και αντικατάστασης από την αρχή;</ReplaceXContinue> - <ReplaceContinueTitle>Συνέχιση 'αντικατάστασης';</ReplaceContinueTitle> - <SearchingForXFromLineY>Αναζήτηση για '{0}' από αριθμό γραμμής {1}...</SearchingForXFromLineY> - <XFoundAtLineNumberY>Εύρεση '{0}' στη γραμμή με αριθμό {1}</XFoundAtLineNumberY> - <XNotFound>Αδυναμία εύρεσης '{0}'</XNotFound> - <BeforeReplace>Πριν από αντικατάσταση: {0}</BeforeReplace> - <MatchFoundX>Εύρεση αντιστοιχίας: {0}</MatchFoundX> - <NoMatchFoundX>Αδυναμία εύρεσης αντιστοιχίας: {0}</NoMatchFoundX> - <FoundNothingToReplace>Αδυναμία εύρεσης για αντικατάσταση</FoundNothingToReplace> - <ReplaceCountX>Αριθμός αντικαταστάσεων: {0}</ReplaceCountX> - <NoXFoundAtLineY>Εύρεση αντιστοιχίας στη γραμμή {0}: {1}</NoXFoundAtLineY> - <OneReplacementMade>Αντικατάσταση ενός.</OneReplacementMade> - <BeforeChangesMadeInSourceView>Πριν των αλλαγν στην προβολή πηγής</BeforeChangesMadeInSourceView> - <UnableToParseSourceView>Αδυναμία ανάλυσης κειμένου στην προβολή πηγής!</UnableToParseSourceView> - <GoToLineNumberX>Μετάβαση στη γραμμή με αριθμό {0}</GoToLineNumberX> - <CreateAdjustChangesApplied>Δημιουργία/προσαρμογή γραμμών εφαρμοσμένων αλλαγών</CreateAdjustChangesApplied> - <SelectedLines>επιλεγμένες γραμμές</SelectedLines> - <BeforeDisplayTimeAdjustment>Πριν από προσαρμογή χρόνου εμφάνισης</BeforeDisplayTimeAdjustment> - <DisplayTimeAdjustedX>Προσαρμοσμένος χρόνος εμφάνισης: {0}</DisplayTimeAdjustedX> - <DisplayTimesAdjustedX>Προσαρμοσμένοι χρόνοι εμφάνισης: {0}</DisplayTimesAdjustedX> - <StarTimeAdjustedX>Προσαρμοσμένος χρόνος έναρξης: {0}</StarTimeAdjustedX> - <BeforeCommonErrorFixes>Πριν από επιδιορθώσεις κοινών σφαλμάτων</BeforeCommonErrorFixes> - <CommonErrorsFixedInSelectedLines>Επιδιορθώσεις κοινών σφαλμάτων σε επιλεγμένες γραμμές</CommonErrorsFixedInSelectedLines> - <CommonErrorsFixed>Επιδιόρθωση κοινών σφαλμάτων</CommonErrorsFixed> - <BeforeRenumbering>Πριν επαναρίθμησης</BeforeRenumbering> - <RenumberedStartingFromX>Έναρξη επαναρίθμησης από: {0}</RenumberedStartingFromX> - <BeforeRemovalOfTextingForHearingImpaired>Πριν από αφαίρεση κειμένου για κωφούς</BeforeRemovalOfTextingForHearingImpaired> - <TextingForHearingImpairedRemovedOneLine>Αφαίρεση κειμένου για κωφούς: Μία γραμμή</TextingForHearingImpairedRemovedOneLine> - <TextingForHearingImpairedRemovedXLines>Αφαίρεση κειμένου για κωφούς: {0} γραμμή(ές)</TextingForHearingImpairedRemovedXLines> - <SubtitleSplitted>Διαχώριση υποτίτλου</SubtitleSplitted> - <SubtitleAppendPrompt>Προσάρτηση υποτίτλου στον φορτωμένο υπότιτλο που ίσως -είναι ήδη συγχρονισμένος με το αρχείο βίντεο. Συνέχιση;</SubtitleAppendPrompt> - <SubtitleAppendPromptTitle>Προσάρτηση υπότιτλου</SubtitleAppendPromptTitle> - <OpenSubtitleToAppend>Άνοιγμα υπότιτλου για προσάρτηση...</OpenSubtitleToAppend> - <AppendViaVisualSyncTitle>Οπτικός συγχρονισμός - προσάρτηση δεύτερου μέρους υπότιτλου</AppendViaVisualSyncTitle> - <AppendSynchronizedSubtitlePrompt>Προσάρτηση του συγχρονισμένου υπότιτλου;</AppendSynchronizedSubtitlePrompt> - <BeforeAppend>Πριν από προσάρτηση</BeforeAppend> - <SubtitleAppendedX>Προσάρτηση υποτίτλου: {0}</SubtitleAppendedX> - <SubtitleNotAppended>Μη προσάρτηση υποτίτλου!</SubtitleNotAppended> - <GoogleTranslate>Μετάφραση Google</GoogleTranslate> - <MicrosoftTranslate>Μετάφραση Bing</MicrosoftTranslate> - <BeforeGoogleTranslation>Πριν από μετάφραση Google</BeforeGoogleTranslation> - <SelectedLinesTranslated>Μετάφραση επιλεγμένων γρραμμών</SelectedLinesTranslated> - <SubtitleTranslated>Μετάφραση υποτίτλου</SubtitleTranslated> - <TranslateSwedishToDanish>Μετάφραση φορτωμένου σουηδικού υποτίτλου σε Δανικά</TranslateSwedishToDanish> - <TranslateSwedishToDanishWarning>Μετάφραση φορτωμένου σουηδικού (σίγουρα είναι σουηδικός;) υπότιτλου σε Δανικά;</TranslateSwedishToDanishWarning> - <TranslatingViaNikseDkMt>Μετάφραση μέσω www.nikse.dk/mt...</TranslatingViaNikseDkMt> - <BeforeSwedishToDanishTranslation>Πριν από μετάφραση Σουηδικών σε Δανικά</BeforeSwedishToDanishTranslation> - <TranslationFromSwedishToDanishComplete>Ολοκλήρωση μετάφρασης Σουηδικών σε Δανικά</TranslationFromSwedishToDanishComplete> - <TranslationFromSwedishToDanishFailed>Αποτυχία μετάφρασης Σουηδικών σε Δανικά</TranslationFromSwedishToDanishFailed> - <UndoPerformed>Εκτέλεση αναίρεσης</UndoPerformed> - <RedoPerformed>Εκτέλεση επανάληψης</RedoPerformed> - <NothingToUndo>Τίποτα για αναίρεση</NothingToUndo> - <InvalidLanguageNameX>Μη έγκυρο όνομα γλώσσας: {0}</InvalidLanguageNameX> - <DoNotDisplayMessageAgain>Απόκρυψη μηνύματος</DoNotDisplayMessageAgain> - <NumberOfCorrectedWords>Σύνολο διορθωμένων λέξεων: {0}</NumberOfCorrectedWords> - <NumberOfSkippedWords>Σύνολο παραλειπόμενων λέξεων: {0}</NumberOfSkippedWords> - <NumberOfCorrectWords>Σύνολο σωστών λέξεων: {0}</NumberOfCorrectWords> - <NumberOfWordsAddedToDictionary>Σύνολο πρόσθετων λέξεων στο λεξικό: {0}</NumberOfWordsAddedToDictionary> - <NumberOfNameHits>Σύνολο ευρέσεων ονομάτων: {0}</NumberOfNameHits> - <SpellCheck>Ορθογραφικός έλεγχος</SpellCheck> - <BeforeSpellCheck>Πριν από ορθογραφικό έλεγχο</BeforeSpellCheck> - <SpellCheckChangedXToY>Ορθογραφικός έλεγχος: Αλλαγή του '{0}' σε '{1}'</SpellCheckChangedXToY> - <BeforeAddingTagX>Πριν από προσθήκη ετικετών &lt;{0}&gt;</BeforeAddingTagX> - <TagXAdded>Προσθήκη &lt;{0}&gt; ετικέτας(ών)</TagXAdded> - <LineXOfY>γραμμή {0} από {1}</LineXOfY> - <XLinesSavedAsY>Αποθήκευση {0} γραμμής(ών) ως {1}</XLinesSavedAsY> - <XLinesDeleted>Διαγραφή {0} γραμμής(ών)</XLinesDeleted> - <BeforeDeletingXLines>Πριν από διαγραφή {0} γραμμών</BeforeDeletingXLines> - <DeleteXLinesPrompt>Διαγραφή {0:#,##0} γραμμών;</DeleteXLinesPrompt> - <OneLineDeleted>Διαγραφή μίας γραμμής</OneLineDeleted> - <BeforeDeletingOneLine>Πριν από διαγραφή μίας γραμμής</BeforeDeletingOneLine> - <DeleteOneLinePrompt>Διαγραφή μίας γραμμής;</DeleteOneLinePrompt> - <BeforeInsertLine>Πριν από εισαγωγή γραμμής</BeforeInsertLine> - <LineInserted>Εισαγωγή γραμμής</LineInserted> - <BeforeLineUpdatedInListView>Πριν από ενημέρωση γραμμής σε προβολή λίστας</BeforeLineUpdatedInListView> - <BeforeSplitLine>Πριν από διαχωρισμό γραμμής</BeforeSplitLine> - <LineSplitted>Διαχώριση γραμμής</LineSplitted> - <BeforeMergeLines>Πριν από συγχώνευση γραμμών</BeforeMergeLines> - <LinesMerged>Συγχώνευση γραμμών</LinesMerged> - <BeforeSettingColor>Πριν από ρύθμιση χρώματος</BeforeSettingColor> - <BeforeSettingFontName>Πριν από ρύθμιση ονόματος γραμματοσειράς</BeforeSettingFontName> - <BeforeTypeWriterEffect>Πριν από εφέ γραφομηχανής</BeforeTypeWriterEffect> - <BeforeKaraokeEffect>Πριν από εφέ καραόκε</BeforeKaraokeEffect> - <BeforeImportingDvdSubtitle>Πριν από εισαγωγή υποτίτλων από DVD</BeforeImportingDvdSubtitle> - <OpenMatroskaFile>Άνοιγμα αρχείου Matroska...</OpenMatroskaFile> - <MatroskaFiles>Αρχεία Matroska</MatroskaFiles> - <NoSubtitlesFound>Αδυναμία εύρεσης υποτίτλων</NoSubtitlesFound> - <NotAValidMatroskaFileX>Μη έγκυρο αρχείο Matroska: {0}</NotAValidMatroskaFileX> - <BlurayNotSubtitlesFound>Το αρχείο Blu-ray .sup δεν περιέχει υπότιτλους ή περιέχει σφάλματα - προσπαθήστε ξανά</BlurayNotSubtitlesFound> - <ImportingChapters>Εισαγωγή κεφαλαίων...</ImportingChapters> - <XChaptersImported>{0} εισαγωγή κεφαλαίου(ων)</XChaptersImported> - <ParsingMatroskaFile>Ανάλυση αρχείου Matroska. Παρακαλώ, περιμένετε...</ParsingMatroskaFile> - <ParsingTransportStreamFile>Ανάλυση αρχείου Trasport Stream. Παρακαλώ, περιμένετε...</ParsingTransportStreamFile> - <BeforeImportFromMatroskaFile>Πριν από εισαγωγή υπότιτλου από αρχείο Matroska</BeforeImportFromMatroskaFile> - <SubtitleImportedFromMatroskaFile>Εισαγωγή υποτίτλου από αρχείο Matroska</SubtitleImportedFromMatroskaFile> - <DropFileXNotAccepted>Απόρριψη συρμένου αρχείου '{0}' - το αρχείο είναι πολύ μεγάλο</DropFileXNotAccepted> - <DropOnlyOneFile>Μπορείτε να σύρετε μόνο ένα αρχείο</DropOnlyOneFile> - <OpenAnsiSubtitle>Άνοιγμα υπότιτλου...</OpenAnsiSubtitle> - <BeforeChangeCasing>Πριν από αλλαγή πεζών-κεφαλαίων</BeforeChangeCasing> - <CasingCompleteMessageNoNames>Σύνολο γραμμών με αλλαγή πεζών-κεφαλαίων: {0}/{1}</CasingCompleteMessageNoNames> - <CasingCompleteMessageOnlyNames>Σύνολο γραμμών με αλλαγή πεζών-κεφαλαίων με ονόματα: {0}/{1}</CasingCompleteMessageOnlyNames> - <CasingCompleteMessage>Σύνολο γραμμών με αλλαγή πεζών-κεφαλαίων: {0}/{1}, αλλαγή πεζών-κεφαλαίων με ονόματα: {2}</CasingCompleteMessage> - <BeforeChangeFrameRate>Πριν από αλλαγή ρυθμού καρέ</BeforeChangeFrameRate> - <BeforeAdjustSpeedInPercent>Πριν ρύθμισης της ταχύτητας σε ποσοστό</BeforeAdjustSpeedInPercent> - <FrameRateChangedFromXToY>Αλλαγή ρυθμού καρέ από {0} σε {1}</FrameRateChangedFromXToY> - <IdxFileNotFoundWarning>Αδυναμία εύρεσης {0}! Εισαγωγή αρχείου VobSub;</IdxFileNotFoundWarning> - <InvalidVobSubHeader>Μη έγκυρη κεφαλίδα του αρχείου VobSub: {0}</InvalidVobSubHeader> - <OpenVobSubFile>Άνοιγμα υπότιτλου VobSub (sub/idx)...</OpenVobSubFile> - <VobSubFiles>Αρχεία υποτίτλων VobSub</VobSubFiles> - <OpenBluRaySupFile>Άνοιγμα αρχείου Blu-ray .sup...</OpenBluRaySupFile> - <BluRaySupFiles>Αρχεία Blu-ray .sup</BluRaySupFiles> - <OpenXSubFiles>Άνοιγμα αρχείου XSub...</OpenXSubFiles> - <XSubFiles>Αρχεία XSub</XSubFiles> - <BeforeImportingVobSubFile>Πριν από εισαγωγή αρχείου VobSub</BeforeImportingVobSubFile> - <BeforeImportingBluRaySupFile>Πριν από εισαγωγή αρχείου Blu-ray sup</BeforeImportingBluRaySupFile> - <BeforeImportingBdnXml>Πριν από εισαγωγή αρχείου BDN xml</BeforeImportingBdnXml> - <BeforeShowSelectedLinesEarlierLater>Πριν από εμφάνιση γραμμών νωρίτερα/αργότερα</BeforeShowSelectedLinesEarlierLater> - <ShowAllLinesXSecondsLinesEarlier>Εμφάνιση όλων των γραμμών {0:0.0##} δευτερόλεπτα νωρίτερα</ShowAllLinesXSecondsLinesEarlier> - <ShowAllLinesXSecondsLinesLater>Εμφάνιση όλων των γραμμών {0:0.0##} δευτερόλεπτα αργότερα</ShowAllLinesXSecondsLinesLater> - <ShowSelectedLinesXSecondsLinesEarlier>Εμφάνιση γραμμών {0:0.0##} δευτερόλεπτα νωρίτερα</ShowSelectedLinesXSecondsLinesEarlier> - <ShowSelectedLinesXSecondsLinesLater>Εμφάνιση γραμμών {0:0.0##} δευτερόλεπτα αργότερα</ShowSelectedLinesXSecondsLinesLater> - <ShowSelectionAndForwardXSecondsLinesEarlier>Εμφάνιση επιλογής και προώθηση {0:0.0##} δευτερόλεπτα νωρίτερα</ShowSelectionAndForwardXSecondsLinesEarlier> - <ShowSelectionAndForwardXSecondsLinesLater>Εμφάνιση επιλογής και προώθηση {0:0.0##} δευτερόλεπτα αργότερα</ShowSelectionAndForwardXSecondsLinesLater> - <DoubleWordsViaRegEx>Διπλές λέξεις μέσω τυπικής έκφρασης {0}</DoubleWordsViaRegEx> - <BeforeSortX>Πριν από ταξινόμηση: {0}</BeforeSortX> - <SortedByX>Ταξινόμηση κατά: {0}</SortedByX> - <BeforeAutoBalanceSelectedLines>Πριν από αυτόματη ισορρόπιση γραμμών</BeforeAutoBalanceSelectedLines> - <NumberOfLinesAutoBalancedX>Σύνολο αυτόματων ισορροπημένων γραμμών: {0}</NumberOfLinesAutoBalancedX> - <BeforeRemoveLineBreaksInSelectedLines>Πριν από αφαίρεση διάσπασης επιλεγμένων γραμμών</BeforeRemoveLineBreaksInSelectedLines> - <NumberOfWithRemovedLineBreakX>Σύνολο γραμμών που αφαιρέθηκαν διασπάσεις γραμμής: {0}</NumberOfWithRemovedLineBreakX> - <BeforeMultipleReplace>Πριν από πολλαπλή αντικατάσταση</BeforeMultipleReplace> - <NumberOfLinesReplacedX>Σύνολο γραμμών αντικατεστημένου κειμένου: {0}</NumberOfLinesReplacedX> - <NameXAddedToNameList>Προσθήκη ονόματος '{0}' στη λίστα ονομάτων</NameXAddedToNameList> - <NameXNotAddedToNameList>Μη προσθήκη ονόματος '{0}' στη λίστα ονομάτων</NameXNotAddedToNameList> - <WordXAddedToUserDic>Προσθήκη λέξης '{0}' στο λεξικό χρήστη</WordXAddedToUserDic> - <WordXNotAddedToUserDic>Μη προσθήκη λέξης '{0}' στο λεξικό χρήστη</WordXNotAddedToUserDic> - <OcrReplacePairXAdded>Τα ζεύγη των λιστών αντικατάστασης του OCR '{0} -&gt; {1}' προστέθηκαν στις λίστες αντικατάστασης του OCR</OcrReplacePairXAdded> - <OcrReplacePairXNotAdded>Τα ζεύγη των λιστών αντικατάστασης του OCR '{0} -&gt; {1}' δεν προστέθηκαν στις λίστες αντικατάστασης του OCR</OcrReplacePairXNotAdded> - <XLinesSelected>Επιλογή {0} γραμμής(ών)</XLinesSelected> - <UnicodeMusicSymbolsAnsiWarning>Ο υπότιτλος περιέχει unicode μουσικές νότες. Αν αποθηκευτεί χρησιμοποιώντας κωδικοποίηση ANSI θα χαθούν. Συνέχιση αποθήκευσης;</UnicodeMusicSymbolsAnsiWarning> - <NegativeTimeWarning>Ο υπότιτλος περιέχει αρνητικούς κωδικούς χρόνου. Συνέχιση αποθήκευσης;</NegativeTimeWarning> - <BeforeMergeShortLines>Πριν από συγχώνευση μικρών γραμμών</BeforeMergeShortLines> - <MergedShortLinesX>Σύνολο συγχωνευμένων γραμμών: {0}</MergedShortLinesX> - <BeforeSplitLongLines>Πριν από διαχωρισμό μεγάλων γραμμών</BeforeSplitLongLines> - <LongLinesSplitX>Σύνολο διαχωρισμένων γραμμών: {0}</LongLinesSplitX> - <BeforeDurationsBridgeGap>Πριν την ένωση μικρών κενών</BeforeDurationsBridgeGap> - <BeforeSetMinimumDisplayTimeBetweenParagraphs>Πριν από ορισμό ελάχιστου χρόνου εμφάνισης μεταξύ υποτίτλων</BeforeSetMinimumDisplayTimeBetweenParagraphs> - <XMinimumDisplayTimeBetweenParagraphsChanged>Σύνολο γραμμών αλλαγής ελάχιστου χρόνου εμφάνισης μεταξύ υποτίτλων: {0}</XMinimumDisplayTimeBetweenParagraphsChanged> - <BeforeImportText>Πριν από εισαγωγή απλού κειμένου</BeforeImportText> - <TextImported>Εισαγωγή κειμένου</TextImported> - <BeforePointSynchronization>Πριν από συγχρονισμό σημείων</BeforePointSynchronization> - <PointSynchronizationDone>Ολοκλήρωση συγχρονισμού σημείων</PointSynchronizationDone> - <BeforeTimeCodeImport>Πριν από εισαγωγή κωδικών χρόνου</BeforeTimeCodeImport> - <TimeCodeImportedFromXY>Εισαγωγή κωδικών χρόνων από {0}: {1}</TimeCodeImportedFromXY> - <BeforeInsertSubtitleAtVideoPosition>Πριν από εισαγωγή υπότιτλου στη θέση βίντεο</BeforeInsertSubtitleAtVideoPosition> - <BeforeSetStartTimeAndOffsetTheRest>Πριν ορισμού χρόνου έναρξης και αντιστάθμισης</BeforeSetStartTimeAndOffsetTheRest> - <BeforeSetEndTimeAndOffsetTheRest>Πριν ορισμού χρόνου λήξης και αντιστάθμισης</BeforeSetEndTimeAndOffsetTheRest> - <BeforeSetEndAndVideoPosition>Πριν ορισμού χρόνου λήξης στη θέση βίντεο και αυτόματος υπολογισμός έναρξης</BeforeSetEndAndVideoPosition> - <ContinueWithCurrentSpellCheck>Συνέχιση τρέχοντος ορθογραφικού ελέγχου;</ContinueWithCurrentSpellCheck> - <CharactersPerSecond>Χαρακτήρες/δευτ.: {0:0.00}</CharactersPerSecond> - <GetFrameRateFromVideoFile>Λήψη ρυθμού καρέ από αρχείο βίντεο</GetFrameRateFromVideoFile> - <NetworkMessage>Νέο μήνυμα: {0} ({1}): {2}</NetworkMessage> - <NetworkUpdate>Ενημέρωση γραμμής: {0} ({1}): Δείκτης={2}, Κείμενο={3}</NetworkUpdate> - <NetworkInsert>Εισαγωγή γραμμής: {0} ({1}): Δείκτης={2}, Κείμενο={3}</NetworkInsert> - <NetworkDelete>Διαγραφή γραμμής: {0} ({1}): Δείκτης={2}</NetworkDelete> - <NetworkNewUser>Νέος χρήστης: {0} ({1})</NetworkNewUser> - <NetworkByeUser>Αντίο {0} ({1})</NetworkByeUser> - <NetworkUnableToConnectToServer>Αδυναμία σύνδεσης με τον διακομιστή: {0}</NetworkUnableToConnectToServer> - <UserAndAction>Χρήστης/ενέργεια</UserAndAction> - <NetworkMode>Λειτουργία δικτύου</NetworkMode> - <XStartedSessionYAtZ>{0}: Έναρξη συνεδρίας {1} στο {2}</XStartedSessionYAtZ> - <OpenOtherSubtitle>Άνοιγμα άλλου υπότιτλου</OpenOtherSubtitle> - <BeforeToggleDialogDashes>Πριν την εναλλαγή παυλών διαλόγου</BeforeToggleDialogDashes> - <ExportPlainTextAs>Εξαγωγή απλού αρχείου κειμένου ως</ExportPlainTextAs> - <TextFiles>Αρχεία κειμένου</TextFiles> - <SubtitleExported>Εξαγωγή υποτίτλου</SubtitleExported> - <LineNumberXErrorReadingFromSourceLineY>Γραμμή {0} - σφάλμα ανάγνωσης: {1}</LineNumberXErrorReadingFromSourceLineY> - <LineNumberXErrorReadingTimeCodeFromSourceLineY>Γραμμή {0} - σφάλμα ανάγνωσης κώδικα χρόνου: {1}</LineNumberXErrorReadingTimeCodeFromSourceLineY> - <LineNumberXExpectedNumberFromSourceLineY>Γραμμή {0} - αναμενόμενος αριθμός υποτίτλου: {1}</LineNumberXExpectedNumberFromSourceLineY> - <LineNumberXExpectedEmptyLine>Γραμμή {0} - αναμενόμενη κενή γραμμή, αλλά βρέθηκε αριθμός + κώδικας χρόνου (παραλειπόμενος αριθμός): {1}</LineNumberXExpectedEmptyLine> - <BeforeGuessingTimeCodes>Πριν τον υπολογισμό κωδικών χρόνου</BeforeGuessingTimeCodes> - <BeforeAutoDuration>Πριν την αυτόματη διάρκεια επιλεγμένων γραμμών</BeforeAutoDuration> - <BeforeColumnPaste>Πριν την επικόλληση στήλης</BeforeColumnPaste> - <BeforeColumnDelete>Πριν την διαγραφή στήλης</BeforeColumnDelete> - <BeforeColumnImportText>Πριν την εισαγωγή κειμένου στήλης</BeforeColumnImportText> - <BeforeColumnShiftCellsDown>Πριν την μετατόπιση των κελιών στήλης προς τα κάτω</BeforeColumnShiftCellsDown> - <BeforeX>Πριν: {0}</BeforeX> - <LinesUpdatedX>Ενημερωμένες γραμμές: {0}</LinesUpdatedX> - <ErrorLoadingPluginXErrorY>Σφάλμα φόρτωσης πρόσθετου: {0}: {1}</ErrorLoadingPluginXErrorY> - <BeforeRunningPluginXVersionY>Πριν την εκτέλεση πρόσθετου: {0}: {1}</BeforeRunningPluginXVersionY> - <UnableToReadPluginResult>Αδυναμία ανάγνωσης αποτελέσματος υποτίτλου από το πρόσθετο!</UnableToReadPluginResult> - <UnableToCreateBackupDirectory>Αδυναμία δημιουργίας φακέλου αντίγραφου ασφαλείας {0}: {1}</UnableToCreateBackupDirectory> - <BeforeDisplaySubtitleJoin>Πριν την ένωση υποτίτλων</BeforeDisplaySubtitleJoin> - <SubtitlesJoined>Ένωση υποτίτλων</SubtitlesJoined> - <StatusLog>Κατάσταση αρχείου καταγραφής</StatusLog> - <XSceneChangesImported>Εισαγωγή {0} αλλαγής(ών) σκηνής</XSceneChangesImported> - <PluginXExecuted>Εκτέλεση πρόσθετου '{0}'.</PluginXExecuted> - <NotAValidXSubFile>Μη έγκυρο αρχείο XSub!</NotAValidXSubFile> - <BeforeMergeLinesWithSameText>Πριν από συγχώνευση γραμμών ίδιου κειμένου</BeforeMergeLinesWithSameText> - <ImportTimeCodesDifferentNumberOfLinesWarning>Ο υπότιτλος με τους κώδικες χρόνου έχει διαφορετικό αριθμό γραμμών ({0}) από τον τρέχων υπότιτλο ({1}) - Συνέχιση;</ImportTimeCodesDifferentNumberOfLinesWarning> - <ParsingTransportStream>Ανάλυση αρχείου TS - παρακαλώ, περιμένετε...</ParsingTransportStream> - <XPercentCompleted>{0}%</XPercentCompleted> - <NextX>Επόμενο: {0}</NextX> - <PromptInsertSubtitleOverlap>Η εισαγωγή υπότιτλου στη θέση κυματομορφής θα προκαλέσει επικάλυψη! -Συνέχιση;</PromptInsertSubtitleOverlap> - <SubtitleContainsNegativeDurationsX>Εύρεση αρνητικής διάρκειας γραμμής(ών): {0}</SubtitleContainsNegativeDurationsX> - <SetPlayRateX>Ορισμός ρυθμού αναπαραγωγής σε {0}%</SetPlayRateX> - <ErrorLoadIdx>Αδυναμία ανάγνωσης/επεξεργασίας αρχείων .idx. Τα αρχεία .idx είναι μέλη από τα ζεύγη idx/sub αρχείων (γνωστά ως VobSub) και ο Subtitle Edit δεν μπορεί να ανοίξει αρχείο .sub.</ErrorLoadIdx> - <ErrorLoadRar>Πιθανό συμπιεσμένο αρχείο .rar. Το Subtitle Edit δεν μπορεί να ανοίξει συμπιεσμένα αρχεία.</ErrorLoadRar> - <ErrorLoadZip>Πιθανό συμπιεσμένο αρχείο .zip. Το Subtitle Edit δεν μπορεί να ανοίξει συμπιεσμένα αρχεία.</ErrorLoadZip> - <ErrorLoad7Zip>Πιθανό συμπιεσμένο αρχείο 7-Zip. Το Subtitle Edit δεν μπορεί να ανοίξει συμπιεσμένα αρχεία.</ErrorLoad7Zip> - <ErrorLoadPng>Πιθανό αρχείο εικόνας PNG. Το Subtitle Edit δεν μπορεί να ανοίξει αρχεία PNG.</ErrorLoadPng> - <ErrorLoadJpg>Πιθανό αρχείο εικόνας JPG. Το Subtitle Edit δεν μπορεί να ανοίξει αρχεία JPG.</ErrorLoadJpg> - <ErrorLoadSrr>Πιθανό αρχείο .srr - όχι αρχείο υπότιτλου.</ErrorLoadSrr> - <ErrorLoadTorrent>Πιθανό αρχείο BitTorrent - όχι αρχείο υπότιτλου.</ErrorLoadTorrent> - <ErrorLoadBinaryZeroes>Συγγνώμη, το αρχείο περιέχει μόνο δυαδικά μηδενικά! -Αν είναι επεξεργασμένο με το Subtitle Edit, ίσως βρείτε αντίγραφο ασφαλείας μέσω της επιλογής Αρχείο -&gt; Επαναφορά αντίγραφου ασφαλείας...</ErrorLoadBinaryZeroes> - <ErrorDirectoryDropNotAllowed>Το σύρσιμο φακέλων δεν υποστηρίζεται.</ErrorDirectoryDropNotAllowed> - <NoSupportEncryptedVobSub>Το κρυπτογραφημένο περιεχόμενο VobSub δεν υποστηρίζεται.</NoSupportEncryptedVobSub> - <NoSupportHereBluRaySup>Τα αρχεία Blu-ray sup δεν υποστηρίζονται.</NoSupportHereBluRaySup> - <NoSupportHereDvdSup>Τα αρχεία DVD sup δεν υποστηρίζονται.</NoSupportHereDvdSup> - <NoSupportHereVobSub>Τα αρχεία VoSub δεν υποστηρίζονται.</NoSupportHereVobSub> - <NoSupportHereDivx>Τα αρχεία Divx δεν υποστηρίζονται.</NoSupportHereDivx> - <NoChapters>Αδυναμία εύρεσης κεφαλαίων βίντεο.</NoChapters> - </Main> - <MatroskaSubtitleChooser> - <Title>Επιλογή υπότιτλου από αρχείο Matroska</Title> - <TitleMp4>Επιλογή υπότιτλου από αρχείο MP4</TitleMp4> - <PleaseChoose>Βρέθηκαν περισσότεροι από έναν υπότιτλο - παρακαλώ, επιλέξτε</PleaseChoose> - <TrackXLanguageYTypeZ>Κομμάτι {0} - γλώσσα: {1} - τύπος: {2}</TrackXLanguageYTypeZ> - </MatroskaSubtitleChooser> - <MeasurementConverter> - <Title>Μετατροπέας μονάδων μέτρησης</Title> - <ConvertFrom>Μετατροπή από</ConvertFrom> - <ConvertTo>Μετατροπή σε</ConvertTo> - <CopyToClipboard>Αντιγραφή στο πρόχειρο</CopyToClipboard> - <Length>Μήκος</Length> - <Mass>Μάζα</Mass> - <Volume>Όγκος</Volume> - <Area>Έκταση</Area> - <Time>Χρόνος</Time> - <Temperature>Θερμοκρασία</Temperature> - <Velocity>Ταχύτητα</Velocity> - <Force>Ισχύς</Force> - <Energy>Ενέργεια</Energy> - <Power>Ρεύμα</Power> - <Pressure>Πίεση</Pressure> - <Kilometers>Χιλιόμετρα</Kilometers> - <Meters>Μέτρα</Meters> - <Centimeters>Εκατοστά</Centimeters> - <Millimeters>Χιλιοστά</Millimeters> - <Micrometers>Μικρόμετρα</Micrometers> - <Nanometers>Νανόμετρα</Nanometers> - <Angstroms>Άνγκστρομα</Angstroms> - <MilesTerrestial>Μίλια</MilesTerrestial> - <MilesNautical>Ναυτικά μίλια</MilesNautical> - <Yards>Γιάρδες</Yards> - <Feet>Πόδια</Feet> - <Inches>Ίντσες</Inches> - <Chains>Τσέιν (μήκος)</Chains> - <Fathoms>Οργιές</Fathoms> - <Hands>Δείκτες</Hands> - <Rods>Ράβδοι</Rods> - <Spans>Ανοίγματα</Spans> - <LongTonnes>Τόνοι (ΗΒ)</LongTonnes> - <ShortTonnes>Τόνοι (ΗΠΑ)</ShortTonnes> - <Tonnes>Τόνοι</Tonnes> - <Kilos>Κιλά</Kilos> - <Grams>Γραμμάρια</Grams> - <Milligrams>Χιλιόγραμμα</Milligrams> - <Micrograms>Μικρογραμμάρια</Micrograms> - <Pounds>Λίβρες</Pounds> - <Ounces>Ουγγιές</Ounces> - <Carats>Καράτια</Carats> - <Drams>Δράμια</Drams> - <Grains>Κόκοι</Grains> - <Stones>Κιλά (βάρος σώματος)</Stones> - <CubicKilometers>Κυβικά χιλιόμετρα</CubicKilometers> - <CubicMeters>Κυβικά μέτρα</CubicMeters> - <Litres>Λίτρα</Litres> - <CubicCentimeters>Κυβικά εκατοστά</CubicCentimeters> - <CubicMillimeters>Κυβικά χιλιοστά</CubicMillimeters> - <CubicMiles>Κυβικά μίλια</CubicMiles> - <CubicYards>Κυβικές γιάρδες</CubicYards> - <CubicFTs>Κυβικά πόδια</CubicFTs> - <CubicInches>Κυβικές ίντσες</CubicInches> - <OilBarrels>Βαρέλια πετρελαίου</OilBarrels> - <GallonUS>Γαλόνι (ΗΠΑ)</GallonUS> - <QuartsUS>Λίτρα (ΗΠΑ)</QuartsUS> - <PintsUS>Πίντες (ΗΠΑ)</PintsUS> - <FluidOuncesUS>Ουγγιές υγρών (ΗΠΑ)</FluidOuncesUS> - <Bushels>Μόδια</Bushels> - <Pecks>Πεκς (μονάδα μέτρησης στερεών)</Pecks> - <GallonsUK>Γαλόνια (ΗΒ)</GallonsUK> - <QuartsUK>Λίτρα (ΗΒ)</QuartsUK> - <PintsUK>Πίντες (ΗΒ)</PintsUK> - <FluidOuncesUK>Ουγγιές υγρών (ΗΒ)</FluidOuncesUK> - <SquareKilometers>Τετραγωνικά χιλιόμετρα</SquareKilometers> - <SquareMeters>Τετραγωνικά μέτρα</SquareMeters> - <SquareCentimeters>Τετραγωνικά εκατοστά</SquareCentimeters> - <SquareMillimeters>Τετραγωνικά χιλιοστά</SquareMillimeters> - <SquareMiles>Τετραγωνικά μίλια</SquareMiles> - <SquareYards>Τετραγωνικές γιάρδες</SquareYards> - <SquareFTs>Τετραγωνικά πόδια</SquareFTs> - <SquareInches>Τετραγωνικές ίντσες</SquareInches> - <Hectares>Εκτάρια</Hectares> - <Acres>Στρέμματα</Acres> - <Ares>Άρια</Ares> - <Hours>¨Ωρες</Hours> - <Minutes>Λεπτά</Minutes> - <Seconds>Δευτερόλεπτα</Seconds> - <Milliseconds>Χιλιοστά δευτερολέπτου</Milliseconds> - <Microseconds>Μικροδευτερόλεπτα</Microseconds> - <Fahrenheit>Φαρενάιτ</Fahrenheit> - <Celsius>Κελσίου</Celsius> - <Kelvin>Κέλβιν</Kelvin> - <KilometersPerHour>Χλμ/ώρα</KilometersPerHour> - <MetersPerSecond>Μέτρα/δευτερόλεπτο</MetersPerSecond> - <MilesPerHour>Μίλια/ώρα</MilesPerHour> - <YardsPerMinute>Γιάρδες/λεπτό</YardsPerMinute> - <FTsPerSecond>Πόδια/δευτερόλεπτο</FTsPerSecond> - <Knots>Κόμβοι</Knots> - <PoundsForce>Λίβρες ισχύος</PoundsForce> - <Newtons>Νιούτον</Newtons> - <KilosForce>Κιλά ισχύος</KilosForce> - <Jouls>Τζάουλ</Jouls> - <Calories>Θερμίδες</Calories> - <Ergs>Έργια</Ergs> - <ElectronVolts>Ηλεκτρονιοβόλτ</ElectronVolts> - <Btus>BTU</Btus> - <Watts>Βατ</Watts> - <Horsepower>Ιπποδύναμη</Horsepower> - <Atmospheres>Ατμόσφαιρες</Atmospheres> - <Bars>Μπαρ</Bars> - <Pascals>Πασκάλ</Pascals> - <MillimetersOfMercury>Χιλιοστά υδραργύρου (πίεση)</MillimetersOfMercury> - <PoundPerSquareInch>Λίβρες ισχύος ανά τετραγωνική ίντσα</PoundPerSquareInch> - <KilogramPerSquareCentimeter>Κιλά ισχύος ανά τετραγωνικό εκατοστό</KilogramPerSquareCentimeter> - <KiloPascals>Κιλοπασκάλ</KiloPascals> - </MeasurementConverter> - <MergeDoubleLines> - <Title>Συγχώνευση γραμμών με ίδιο κείμενο</Title> - <MaxMillisecondsBetweenLines>Μέγιστα χιλ. δευτερολέπτου μεταξύ των γραμμών</MaxMillisecondsBetweenLines> - <IncludeIncrementing>Συμπερίληψη προσαυξημένων γραμμών</IncludeIncrementing> - </MergeDoubleLines> - <MergedShortLines> - <Title>Συγχώνευση μικρών γραμμών</Title> - <MaximumCharacters>Μέγιστος αριθμός χαρακτήρων ανα παράγραφο</MaximumCharacters> - <MaximumMillisecondsBetween>Μέγιστος αριθμός χιλ. δευτερολέπτου μεταξύ των γραμμών</MaximumMillisecondsBetween> - <NumberOfMergesX>Σύνολο συγχωνεύσεων: {0}</NumberOfMergesX> - <MergedText>Συγχωνευμένο κείμενο</MergedText> - <OnlyMergeContinuationLines>Συγχώνευση μόνο συνεχόμενων γραμμών</OnlyMergeContinuationLines> - </MergedShortLines> - <MergeTextWithSameTimeCodes> - <Title>Συγχώνευση γραμμών με ίδιους κωδικούς χρόνου</Title> - <MaxDifferenceMilliseconds>Μέγιστη διαφορά χιλιοστών δευτερολέπτου</MaxDifferenceMilliseconds> - <ReBreakLines>Επαναδιάσπαση γραμμών</ReBreakLines> - <NumberOfMergesX>Αριθμός συγχωνεύσεων: {0}</NumberOfMergesX> - <MergedText>Συγχωνευμένο κείμενο</MergedText> - </MergeTextWithSameTimeCodes> - <ModifySelection> - <Title>Επεξεργασία επιλογής</Title> - <Rule>Κανόνας</Rule> - <CaseSensitive>Διάκριση πεζών</CaseSensitive> - <DoWithMatches>Ενέργεια με τις αντιστοιχίες</DoWithMatches> - <MakeNewSelection>Δημιουργία νέας επιλογής</MakeNewSelection> - <AddToCurrentSelection>Προσθήκη στην τρέχουσα επιλογή</AddToCurrentSelection> - <SubtractFromCurrentSelection>Αφαίρεση από την τρέχουσα επιλογή</SubtractFromCurrentSelection> - <IntersectWithCurrentSelection>Διασταύρωση με την τρέχουσα επιλογή</IntersectWithCurrentSelection> - <MatchingLinesX>Γραμμές που ταιριάζουν: {0}</MatchingLinesX> - <Contains>Περιέχει</Contains> - <StartsWith>Ξεκινά με</StartsWith> - <EndsWith>Τελειώνει με</EndsWith> - <NoContains>Δεν περιέχει</NoContains> - <RegEx>Τυπική έκφραση</RegEx> - <UnequalLines>Άνισες γραμμές</UnequalLines> - <EqualLines>Ίσες γραμμές</EqualLines> - <DurationLessThan>Διάρκεια μικρότερη από</DurationLessThan> - <DurationGreaterThan>Διάρκεια μεγαλύτερη από</DurationGreaterThan> - <MoreThanTwoLines>Πάνω από δύο γραμμές</MoreThanTwoLines> - </ModifySelection> - <MultipleReplace> - <Title>Πολλαπλή αντικατάσταση</Title> - <FindWhat>Εύρεση του</FindWhat> - <ReplaceWith>Αντικατάσταση με</ReplaceWith> - <Normal>Κανονική</Normal> - <CaseSensitive>Διάκριση πεζών-κεφαλαίων</CaseSensitive> - <RegularExpression>Τυπική έκφραση</RegularExpression> - <Description>Περιγραφή</Description> - <LinesFoundX>Γραμμές που βρέθηκαν: {0}</LinesFoundX> - <Remove>Αφαίρεση</Remove> - <Add>Προσθήκη</Add> - <Update>&amp;Ενημέρωση</Update> - <Enabled>Ενεργοποίηση</Enabled> - <SearchType>Τύπος αναζήτησης</SearchType> - <RemoveAll>Αφαίρεση όλων</RemoveAll> - <Import>Εισαγωγή...</Import> - <Export>Εξαγωγή...</Export> - <ImportRulesTitle>Εισαγωγή κανόνων αντικατάστασης από...</ImportRulesTitle> - <ExportRulesTitle>Εξαγωγή κανόνων αντικατάστασης σε...</ExportRulesTitle> - <ChooseGroupsToImport>Επιλογή ομάδων εισαγωγής</ChooseGroupsToImport> - <ChooseGroupsToExport>Επιλογή ομάδων εξαγωγής</ChooseGroupsToExport> - <Rules>Εξαγωγή κανόνων</Rules> - <MoveToTop>Νετακίνηση στην κορυφή</MoveToTop> - <MoveToBottom>Μετακίνηση στο τέλος</MoveToBottom> - <MoveSelectedRulesToGroup>Μετακίνηση επιλεγμένων κανόνων στην ομάδα</MoveSelectedRulesToGroup> - <Groups>Ομάδες</Groups> - <RulesForGroupX>Κανόνες ομάδας "{0}"</RulesForGroupX> - <GroupName>Όνομα ομάδας</GroupName> - <RenameGroup>Μετονομασία ομάδας...</RenameGroup> - <NewGroup>Νέα ομάδα...</NewGroup> - <NothingToImport>Τίποτα προς εισαγωγή</NothingToImport> - </MultipleReplace> - <NetworkChat> - <Title>Συνομιλία</Title> - <Send>Αποστολή</Send> - </NetworkChat> - <NetworkJoin> - <Title>Συμμετοχή σε δικτυακή συνεδρία</Title> - <Information>Συμμετοχή σε υπάρχουσα συνεδρία όπου πολλά άτομα -μπορούν να επεξεργαστούν το ίδιο αρχείο υπότιτλου (συνεργασία)</Information> - <Join>Συμμετοχή</Join> - </NetworkJoin> - <NetworkLogAndInfo> - <Title>Πληροφορίες και καταγραφή συνεδρίας</Title> - <Log>Αρχείο καταγραφής:</Log> - </NetworkLogAndInfo> - <NetworkStart> - <Title>Έναρξη δικτυακής συνεδρίας</Title> - <ConnectionTo>Σύνδεση με {0}...</ConnectionTo> - <Information>Έναρξη νέας συνεδρίας όπου πολλά άτομα -μπορούν να επεξεργαστούν το ίδιο αρχείο υπότιτλου (συνεργασία)</Information> - <Start>Έναρξη</Start> - </NetworkStart> - <OpenVideoDvd> - <Title>Άνοιγμα DVD με το VLC</Title> - <OpenDvdFrom>Άνοιγμα DVD με...</OpenDvdFrom> - <Disc>Δίσκος</Disc> - <Folder>Φάκελος</Folder> - <ChooseDrive>Επιλογή οδηγού</ChooseDrive> - <ChooseFolder>Επιλογή φακέλου</ChooseFolder> - </OpenVideoDvd> - <PluginsGet> - <Title>Πρόσθετα</Title> - <InstalledPlugins>Εγκαταστημένα πρόσθετα</InstalledPlugins> - <GetPlugins>Λήψη πρόσθετων</GetPlugins> - <Description>Περιγραφή</Description> - <Version>Έκδοση</Version> - <Date>Ημερομηνία</Date> - <Type>Τύπος</Type> - <OpenPluginsFolder>Άνοιγμα φακέλου 'Plugins'</OpenPluginsFolder> - <GetPluginsInfo1>Λήψη πρόσθετων του Subtitle Edit στον φάκελο 'Plugins'</GetPluginsInfo1> - <GetPluginsInfo2>Επιλογή πρόσθετου και κάντε κλικ στο 'Λήψη'</GetPluginsInfo2> - <PluginXDownloaded>Λήψη πρόσθετου {0}</PluginXDownloaded> - <Download>&amp;Λήψη</Download> - <Remove>&amp;Αφαίρεση</Remove> - <UpdateAllX>Ενημέρωση όλων ({0})</UpdateAllX> - <UnableToDownloadPluginListX>Αδυναμία λήψης λίστας πρόσθετων: {0}</UnableToDownloadPluginListX> - <NewVersionOfSubtitleEditRequired>Απαιτείται νεότερη έκδοση του Subtitle Edit!</NewVersionOfSubtitleEditRequired> - <UpdateAvailable>[Διαθέσιμη ενημέρωση!]</UpdateAvailable> - <UpdateAll>Ενημέρωση όλων</UpdateAll> - <XPluginsUpdated>{0} πρόσθετο/α ενημερώθηκαν</XPluginsUpdated> - </PluginsGet> - <RegularExpressionContextMenu> - <WordBoundary>Όριο λέξης (\b)</WordBoundary> - <NonWordBoundary>Δίχως όριο λέξης (\B)</NonWordBoundary> - <NewLine>Νέα γραμμή (\r\n)</NewLine> - <NewLineShort>Νέα γραμμή (\n)</NewLineShort> - <AnyDigit>Οποιοδήποτε ψηφίο (\d)</AnyDigit> - <NonDigit>Μη ψηφίο (\D)</NonDigit> - <AnyCharacter>Οποιοσδήποτε χαρακτήρας (.)</AnyCharacter> - <AnyWhitespace>Οποιοδήποτε κενό (\s)</AnyWhitespace> - <NonSpaceCharacter>Μη χαρακτήρας κενού (\S)</NonSpaceCharacter> - <ZeroOrMore>Μηδέν ή περισσότερα (*)</ZeroOrMore> - <OneOrMore>Ένα ή περισσότερα (+)</OneOrMore> - <InCharacterGroup>Στο σύνολο χαρακτήρων ([δοκιμή])</InCharacterGroup> - <NotInCharacterGroup>Όχι στο σύνολο χαρακτήρων ([^δοκιμή])</NotInCharacterGroup> - </RegularExpressionContextMenu> - <RemoveTextFromHearImpaired> - <Title>Αφαίρεση κειμένου για κωφούς</Title> - <RemoveTextConditions>Αφαίρεση συνθηκών κειμένου</RemoveTextConditions> - <RemoveTextBetween>Αφαίρεση κειμένου μεταξύ</RemoveTextBetween> - <SquareBrackets>'[' και ']'</SquareBrackets> - <Brackets>'{' και '}'</Brackets> - <Parentheses>'(' και ')'</Parentheses> - <QuestionMarks>'?' και '?'</QuestionMarks> - <And>και</And> - <RemoveTextBeforeColon>Αφαίρεση κειμένου πριν άνω και κάτω τελείας (':')</RemoveTextBeforeColon> - <OnlyIfTextIsUppercase>Μόνο κείμενο σε κεφαλαία</OnlyIfTextIsUppercase> - <OnlyIfInSeparateLine>Μόνο σε ξεχωριστή γραμμή</OnlyIfInSeparateLine> - <LinesFoundX>Εύρεση γραμμής(ών): {0}</LinesFoundX> - <RemoveTextIfContains>Αφαίρεση κειμένου εάν περιέχει:</RemoveTextIfContains> - <RemoveTextIfAllUppercase>Αφαίρεση γραμμής με κεφαλαία</RemoveTextIfAllUppercase> - <RemoveInterjections>Αφαίρεση επιφωνημάτων</RemoveInterjections> - <EditInterjections>Επεξεργασία...</EditInterjections> - </RemoveTextFromHearImpaired> - <ReplaceDialog> - <Title>Αντικατάσταση</Title> - <FindWhat>Εύρεση του:</FindWhat> - <Normal>Κανονική</Normal> - <CaseSensitive>Διάκριση πεζών-κεφαλαίων</CaseSensitive> - <RegularExpression>Τυπική έκφραση</RegularExpression> - <ReplaceWith>Αντικατάσταση με</ReplaceWith> - <Find>&amp;Εύρεση</Find> - <Replace>&amp;Αντικατάσταση</Replace> - <ReplaceAll>Αντικατάσταση ό&amp;λων</ReplaceAll> - </ReplaceDialog> - <RestoreAutoBackup> - <Title>Επαναφορά αντιγράφων ασφαλείας</Title> - <Information>Άνοιγμα αντιγράφων ασφαλείας</Information> - <DateAndTime>Ημερομηνία</DateAndTime> - <FileName>Όνομα αρχείου</FileName> - <Extension>Επέκταση</Extension> - <NoBackedUpFilesFound>Αδυναμία εύρεσης αντιγράφων ασφαλείας!</NoBackedUpFilesFound> - </RestoreAutoBackup> - <SeekSilence> - <Title>Αναζήτηση σιωπής</Title> - <SearchDirection>Κατεύθυνση αναζήτησης</SearchDirection> - <Forward>Εμπρός</Forward> - <Back>Πίσω</Back> - <LengthInSeconds>Ελάχιστη σιωπή (δευτερόλεπτα)</LengthInSeconds> - <MaxVolume>Ένταση ήχου κάτω από</MaxVolume> - </SeekSilence> - <SetMinimumDisplayTimeBetweenParagraphs> - <Title>Ορισμός ελάχιστου κενού υπότίτλων</Title> - <PreviewLinesModifiedX>Προεπισκόπηση - τροποποιημένοι υπότιτλοι: {0}</PreviewLinesModifiedX> - <ShowOnlyModifiedLines>Εμφάνιση μόνο τροποποιημένων γραμμών</ShowOnlyModifiedLines> - <MinimumMillisecondsBetweenParagraphs>Ελάχιστα χιλ. δευτερολέπτου μεταξύ γραμμών</MinimumMillisecondsBetweenParagraphs> - <FrameInfo>Πληροφορίες ρυθμού καρέ</FrameInfo> - <Frames>Καρέ</Frames> - <XFrameYisZMilliseconds>{0} καρέ στα {1} καρέ/δευτερόλεπτο είναι {2} χιλ. του δευτερολέπτου</XFrameYisZMilliseconds> - </SetMinimumDisplayTimeBetweenParagraphs> - <SetSyncPoint> - <Title>Ορισμός σημείου συγχρονισμού για τη γραμμή {0}</Title> - <SyncPointTimeCode>Κωδικός χρόνου σημείου συγχρονισμού</SyncPointTimeCode> - <ThreeSecondsBack>&lt;&lt; 3 δευτ.</ThreeSecondsBack> - <HalfASecondBack>&lt;&lt; ½ δευτ.</HalfASecondBack> - <HalfASecondForward>½ δευτ. &gt;&gt;</HalfASecondForward> - <ThreeSecondsForward>3 δευτ. &gt;&gt;</ThreeSecondsForward> - </SetSyncPoint> - <Settings> - <Title>Ρυθμίσεις</Title> - <General>Γενικά</General> - <Toolbar>Γραμμή εργαλείων</Toolbar> - <VideoPlayer>Πρόγραμμα αναπαραγωγής</VideoPlayer> - <WaveformAndSpectrogram>Κυματομορφή/φασματογράφημα</WaveformAndSpectrogram> - <Tools>Εργαλεία</Tools> - <WordLists>Λίστες λέξεων</WordLists> - <SsaStyle>Στυλ ASS/SSA</SsaStyle> - <Network>Δίκτυο</Network> - <Rules>Κανόνες</Rules> - <ShowToolBarButtons>Εμφάνιση κουμπιών της γραμμής εργαλείων</ShowToolBarButtons> - <New>Νέο</New> - <Open>Άνοιγμα</Open> - <Save>Αποθήκευση</Save> - <SaveAs>Αποθήκευση ως</SaveAs> - <Find>Εύρεση</Find> - <Replace>Αντικατάσταση</Replace> - <VisualSync>Οπτικός συγχρονισμός</VisualSync> - <SpellCheck>Ορθογραφικός έλεγχος</SpellCheck> - <NetflixQualityCheck>Έλεγχος ποιότητας Netflix</NetflixQualityCheck> - <SettingsName>Ρυθμίσεις</SettingsName> - <Help>Βοήθεια</Help> - <UnbreakNoSpace>Συνένωση χωρίς κενό (CJK)</UnbreakNoSpace> - <ToggleBookmarks>Εναλλαγή σημειώσεων</ToggleBookmarks> - <ToggleBookmarksWithComment>Εναλλαγή σημειώσεων - προσθήκη σχόλιου</ToggleBookmarksWithComment> - <ClearBookmarks>Καθαρισμός σημειώσεων</ClearBookmarks> - <GoToBookmark>Μετάβαση σε σημείωση</GoToBookmark> - <GoToPreviousBookmark>Προηγούμενη σημείωση</GoToPreviousBookmark> - <GoToNextBookmark>Επόμενη σημείωση</GoToNextBookmark> - <ChooseProfile>Επιλογή προφίλ</ChooseProfile> - <DuplicateLine>Αντιγραφή γραμμής</DuplicateLine> - <FontInUi>Γραμματοσειρά γραφικού περιβάλλοντος</FontInUi> - <ShowFrameRate>Εμφάνιση ρυθμού καρέ στη γραμμή εργαλείων</ShowFrameRate> - <DefaultFrameRate>Προεπιλεγμένος ρυθμός καρέ</DefaultFrameRate> - <DefaultFileEncoding>Προεπιλεγμένη κωδικοποίηση</DefaultFileEncoding> - <AutoDetectAnsiEncoding>Ανίχνευση κωδικοποίησης ANSI</AutoDetectAnsiEncoding> - <Profile>Προφίλ</Profile> - <Profiles>Προφίλ</Profiles> - <ImportProfiles>Εισαγωγή</ImportProfiles> - <ExportProfiles>Εξαγωγή</ExportProfiles> - <SubtitleLineMaximumLength>Μέγιστο μήκος γραμμής</SubtitleLineMaximumLength> - <OptimalCharactersPerSecond>Βέλτιστοι χαρακτήρες/δευτερόλεπτο</OptimalCharactersPerSecond> - <MaximumCharactersPerSecond>Μέγιστοι χαρακτήρες/δευτερόλεπτο</MaximumCharactersPerSecond> - <MaximumWordssPerMinute>Μέγιστος αριθμός λέξεων/λεπτό</MaximumWordssPerMinute> - <AutoWrapWhileTyping>Αυτόματη διάσπαση</AutoWrapWhileTyping> - <DurationMinimumMilliseconds>Ελάχιστη διάρκεια, χιλ. δευτερολέπτου</DurationMinimumMilliseconds> - <DurationMaximumMilliseconds>Μέγιστη διάρκεια, χιλ. δευτερολέπτου</DurationMaximumMilliseconds> - <MinimumGapMilliseconds>Ελάχιστο κενό σε χιλ. δευτ.</MinimumGapMilliseconds> - <MaximumLines>Μέγιστος αριθμός γραμμών</MaximumLines> - <SubtitleFont>Γραμματοσειρά υποτίτλου</SubtitleFont> - <SubtitleFontSize>Μέγεθος γραμματοσειράς</SubtitleFontSize> - <SubtitleBold>Έντονα</SubtitleBold> - <VideoAutoOpen>Αυτόματο άνοιγμα βίντεο με υπότιτλο</VideoAutoOpen> - <AllowVolumeBoost>Ώθηση ήχου</AllowVolumeBoost> - <SubtitleCenter>Κέντρο</SubtitleCenter> - <SubtitleFontColor>Χρώμα γραμματοσειράς υποτίτλου</SubtitleFontColor> - <SubtitleBackgroundColor>Χρώμα φόντου υποτίτλου</SubtitleBackgroundColor> - <SpellChecker>Ορθογραφικός έλεγκτής</SpellChecker> - <RememberRecentFiles>Εμφάνιση πρόσφατων αρχείων</RememberRecentFiles> - <StartWithLastFileLoaded>Έναρξη με φόρτωση τελευταίου αρχείου</StartWithLastFileLoaded> - <RememberSelectedLine>Απομνημόνευση γραμμής</RememberSelectedLine> - <RememberPositionAndSize>Απομνημόνευση θέσης και μεγέθους κύριου παραθύρου</RememberPositionAndSize> - <StartInSourceView>Έναρξη σε προβολή πηγής</StartInSourceView> - <RemoveBlankLinesWhenOpening>Αφαίρεση κενών γραμμών κατά το άνοιγμα</RemoveBlankLinesWhenOpening> - <ShowLineBreaksAs>Εμφάνιση διασπάσεων σε προβολή λίστας ως</ShowLineBreaksAs> - <SaveAsFileNameFrom>Η "Αποθήκευση ως..." έχει το όνομα από</SaveAsFileNameFrom> - <MainListViewDoubleClickAction>Ενέργεια διπλού κλικ σε γραμμή στο κύριο παράθυρο προβολής λίστας</MainListViewDoubleClickAction> - <MainListViewColumnsInfo>Επιλογή ορατής λίστας προβολής στηλών</MainListViewColumnsInfo> - <MainListViewNothing>Τίποτα</MainListViewNothing> - <MainListViewVideoGoToPositionAndPause>Μετάβαση σε θέση βίντεο και παύση</MainListViewVideoGoToPositionAndPause> - <MainListViewVideoGoToPositionAndPlay>Μετάβαση σε θέση βίντεο και αναπαραγωγή</MainListViewVideoGoToPositionAndPlay> - <MainListViewEditText>Μετάβαση στο πλαίσιο επεξεργασίας κειμένου</MainListViewEditText> - <MainListViewVideoGoToPositionMinus1SecAndPause>Πήγαινε στη θέση βίντεο - 1 δευτ. και παύση</MainListViewVideoGoToPositionMinus1SecAndPause> - <MainListViewVideoGoToPositionMinusHalfSecAndPause>Πήγαινε στη θέση βίντεο - 0.5 δευτ. και παύση</MainListViewVideoGoToPositionMinusHalfSecAndPause> - <MainListViewVideoGoToPositionMinus1SecAndPlay>Πήγαινε στη θέση βίντεο - 1 δευτ. και αναπαραγωγή</MainListViewVideoGoToPositionMinus1SecAndPlay> - <MainListViewEditTextAndPause>Μετάβαση σε επεξαργασία πλαίσιου κειμένου και παύση στη θέση</MainListViewEditTextAndPause> - <VideoFileName>Όνομα αρχείου βίντεο</VideoFileName> - <ExistingFileName>Υπάρχον όνομα</ExistingFileName> - <AutoBackup>Aντίγραφα ασφαλείας</AutoBackup> - <AutoBackupEveryMinute>Κάθε 1 λεπτό</AutoBackupEveryMinute> - <AutoBackupEveryFiveMinutes>Κάθε 5 λεπτά</AutoBackupEveryFiveMinutes> - <AutoBackupEveryFifteenMinutes>Κάθε 15 λεπτά</AutoBackupEveryFifteenMinutes> - <AutoBackupDeleteAfter>Διαγραφή σε</AutoBackupDeleteAfter> - <AutoBackupDeleteAfterOneMonth>1 μήνα</AutoBackupDeleteAfterOneMonth> - <AutoBackupDeleteAfterThreeMonths>3 μήνες</AutoBackupDeleteAfterThreeMonths> - <AutoBackupDeleteAfterSixMonths>6 μήνες</AutoBackupDeleteAfterSixMonths> - <CheckForUpdates>Έλεγχος ενημερώσεων</CheckForUpdates> - <AutoSave>Αυτόματη αποθήκευση</AutoSave> - <AllowEditOfOriginalSubtitle>Να επιτρέπεται η επεξεργασία του αρχικού υπότιτλου</AllowEditOfOriginalSubtitle> - <PromptDeleteLines>Ερώτηση για διαγραφή γραμμών</PromptDeleteLines> - <TimeCodeMode>Ύφος κωδικοποίησης χρόνου</TimeCodeMode> - <TimeCodeModeHHMMSSMS>ΩΩ:ΛΛ:ΔΔ.ΧΔ (00:00:01.500)</TimeCodeModeHHMMSSMS> - <TimeCodeModeHHMMSSFF>ΩΩ:ΛΛ:ΔΔ:ΚΚ (00:00:01:12)</TimeCodeModeHHMMSSFF> - <SplitBehavior>Συμπεριφορά διαχωρισμού</SplitBehavior> - <SplitBehaviorPrevious>Προσθήκη κενού αριστερά του σημείου διαχωρισμού</SplitBehaviorPrevious> - <SplitBehaviorHalf>Προσθήκη κενού κεντρικά του σημείου διαχωρισμού</SplitBehaviorHalf> - <SplitBehaviorNext>Προσθήκη κενού δεξιά του σημείου διαχωρισμού</SplitBehaviorNext> - <VideoEngine>Μηχανισμός απόδοσης βίντεο</VideoEngine> - <DirectShow>DirectShow</DirectShow> - <DirectShowDescription>quartz.dll στον φάκελο system32</DirectShowDescription> - <MpcHc>MPC-HC</MpcHc> - <MpcHcDescription>Media Player Classic - Home Cinema</MpcHcDescription> - <MpvPlayer>mpv</MpvPlayer> - <MpvPlayerDescription>https://mpv.io</MpvPlayerDescription> - <MpvHandlesPreviewText>Προεπισκόπηση κειμένου από mpv</MpvHandlesPreviewText> - <VlcMediaPlayer>VLC media player</VlcMediaPlayer> - <VlcMediaPlayerDescription>libvlc.dll από VLC media player 1.1.0 ή νεότερο</VlcMediaPlayerDescription> - <VlcBrowseToLabel>Διαδρομή του VLC (μόνο για τη φορητή έκδοση VLC)</VlcBrowseToLabel> - <ShowStopButton>Εμφάνιση κουμπιού διακοπής</ShowStopButton> - <ShowMuteButton>Εμφάνιση κουμπιού σίγασης</ShowMuteButton> - <ShowFullscreenButton>Εμφάνιση κουμπιού πλήρους οθόνης</ShowFullscreenButton> - <PreviewFontSize>Μέγεθος γραμματοσειράς προεπισκόπησης υπότιτλου</PreviewFontSize> - <MainWindowVideoControls>Στοιχεία ελέγχου βίντεο κύριου παραθύρου</MainWindowVideoControls> - <CustomSearchTextAndUrl>Προσαρμοσμένη αναζήτηση κειμένου και διεύθυνσης URL</CustomSearchTextAndUrl> - <WaveformAppearance>Όψη κυματομορφής</WaveformAppearance> - <WaveformGridColor>Χρώμα πλέγματος</WaveformGridColor> - <WaveformShowGridLines>Εμφάνιση γραμμών πλέγματος</WaveformShowGridLines> - <WaveformShowCps>Εμφάνιση χαρ/δευτ</WaveformShowCps> - <WaveformShowWpm>Εμφάνιση λέξεων/λεπτό</WaveformShowWpm> - <ReverseMouseWheelScrollDirection>Εναλλαγή κατεύθυνσης κύλισης με τη ρόδα του ποντικιού</ReverseMouseWheelScrollDirection> - <WaveformAllowOverlap>Να επιτρέπεται η επικάλυψη (κατά τη μετακίνηση/αλλαγή μεγέθους)</WaveformAllowOverlap> - <WaveformSetVideoPosMoveStartEnd>Καθορισμός θέσης βίντεο κατά τη μετακίνηση αρχής/λήξης</WaveformSetVideoPosMoveStartEnd> - <WaveformFocusMouseEnter>Καθορισμός εστίασης όταν το ποντίκι εισέρχεται</WaveformFocusMouseEnter> - <WaveformListViewFocusMouseEnter>Επίσης καθορίστε την εστίαση στην προβολή λίστας, όταν το ποντίκι εισέρχεται στην προβολή λίστας</WaveformListViewFocusMouseEnter> - <WaveformSingleClickSelect>Μονό κλικ επιλογής υπότιτλου</WaveformSingleClickSelect> - <WaveformSnapToSceneChanges>Εικόνα για την αλλαγή σκηνών (κράτημα Shift για παράκαμψη)</WaveformSnapToSceneChanges> - <WaveformBorderHitMs1>Το χτύπημα του πλαισίου σήμανσης πρέπει να βρίσκεται μεταξύ</WaveformBorderHitMs1> - <WaveformBorderHitMs2>χιλιοστά δευτερολέπτου</WaveformBorderHitMs2> - <WaveformColor>Χρώμα</WaveformColor> - <WaveformSelectedColor>Επιλεγμένο χρώμα</WaveformSelectedColor> - <WaveformBackgroundColor>Χρώμα φόντου</WaveformBackgroundColor> - <WaveformCursorColor>Χρώμα δείκτη</WaveformCursorColor> - <WaveformTextColor>Χρώμα κειμένου</WaveformTextColor> - <WaveformTextFontSize>Μέγεθος γραμματοσειράς κειμένου</WaveformTextFontSize> - <WaveformAndSpectrogramsFolderEmpty>Άδειασμα φακέλων 'Spectrograms' και 'Waveforms'</WaveformAndSpectrogramsFolderEmpty> - <WaveformAndSpectrogramsFolderInfo>Οι φάκελοι 'Waveforms' και 'Spectrograms' περιέχουν {0} αρχεία ({1:0.00} MB)</WaveformAndSpectrogramsFolderInfo> - <Spectrogram>Φασματογράφημα</Spectrogram> - <GenerateSpectrogram>Δημιουργία φασματογράμματος</GenerateSpectrogram> - <SpectrogramAppearance>Όψη φασματογράμματος</SpectrogramAppearance> - <SpectrogramOneColorGradient>Διαβάθμιση ενός χρώματος</SpectrogramOneColorGradient> - <SpectrogramClassic>Κλασικό</SpectrogramClassic> - <WaveformUseFFmpeg>Χρήση FFmpeg για εξαγωγή κυματομορφής</WaveformUseFFmpeg> - <DownloadFFmpeg>Λήψη FFmpeg</DownloadFFmpeg> - <WaveformFFmpegPath>Διαδρομή του FFmpeg</WaveformFFmpegPath> - <WaveformBrowseToFFmpeg>Περιήγηση για FFmpeg</WaveformBrowseToFFmpeg> - <WaveformBrowseToVLC>Περιήγηση για φορητό VLC</WaveformBrowseToVLC> - <SubStationAlphaStyle>Στυλ Sub Station Alpha</SubStationAlphaStyle> - <ChooseColor>Επιλογή χρώματος</ChooseColor> - <SsaOutline>Περίγραμμα</SsaOutline> - <SsaShadow>Σκιά</SsaShadow> - <SsaOpaqueBox>Αδιαφανές κουτί</SsaOpaqueBox> - <Testing123>Δοκιμή 123...</Testing123> - <Language>Γλώσσα</Language> - <NamesIgnoreLists>Λίστα ονομάτων/παραλείψεων (διάκριση πεζών-κεφαλαίων)</NamesIgnoreLists> - <AddName>Προσθήκη ονόματος</AddName> - <AddWord>Προσθήκη λέξης</AddWord> - <Remove>Αφαίρεση</Remove> - <AddPair>Προσθήκη ζευγαριού</AddPair> - <UserWordList>Λίστα λέξεων χρήστη</UserWordList> - <OcrFixList>Λίστα επιδιορθώσεων OCR</OcrFixList> - <Location>Τοποθεσία</Location> - <UseOnlineNames>Χρήση διαδικτυακού αρχείου xml ονομάτων</UseOnlineNames> - <WordAddedX>Λέξη προστέθηκε: {0}</WordAddedX> - <WordAlreadyExists>Υπάρχουσα λέξη!</WordAlreadyExists> - <WordNotFound>Η λέξη δεν βρέθηκε</WordNotFound> - <RemoveX>Αφαίρεση του {0};</RemoveX> - <CannotUpdateNamesOnline>Αδυναμία ενημέρωσης του διαδικτυακού xml ονομάτων!</CannotUpdateNamesOnline> - <ProxyServerSettings>Ρυθμίσεις διακομιστή μεσολάβησης</ProxyServerSettings> - <ProxyAddress>Διεύθυνση διακομιστή μεσολάβησης</ProxyAddress> - <ProxyAuthentication>Επικύρωση</ProxyAuthentication> - <ProxyUserName>Όνομα χρήστη</ProxyUserName> - <ProxyPassword>Κωδικός</ProxyPassword> - <ProxyDomain>Τομέας</ProxyDomain> - <NetworkSessionSettings>Ρυθμίσεις συνεδρίας δικτύου</NetworkSessionSettings> - <NetworkSessionNewSound>Αναπαραγωγή ήχου νέων μηνυμάτων</NetworkSessionNewSound> - <PlayXSecondsAndBack>Αναπαραγωγή Χ δευτερολέπτων και πίσω, το Χ είναι</PlayXSecondsAndBack> - <StartSceneIndex>Η αρχική παράγραφος σκηνής είναι</StartSceneIndex> - <EndSceneIndex>Η τελική παράγραφος σκηνής είναι</EndSceneIndex> - <FirstPlusX>Αρχή + {0}</FirstPlusX> - <LastMinusX>Τέλος - {0}</LastMinusX> - <FixCommonerrors>Επιδιόρθωση κοινών σφαλμάτων</FixCommonerrors> - <RemoveTextForHi>Αφαίρεση κειμένου για κωφούς</RemoveTextForHi> - <MergeLinesShorterThan>Συνένωση γραμμών μικρότερες από</MergeLinesShorterThan> - <DialogStyle>Στυλ διαλόγου</DialogStyle> - <DialogStyleDashBothLinesWithSpace>Παύλες με κενό</DialogStyleDashBothLinesWithSpace> - <DialogStyleDashBothLinesWithoutSpace>Παύλες χωρίς κενό</DialogStyleDashBothLinesWithoutSpace> - <DialogStyleDashSecondLineWithSpace>Μία παύλα με κενό</DialogStyleDashSecondLineWithSpace> - <DialogStyleDashSecondLineWithoutSpace>Δεύτερη γραμμή χωρίς κενό</DialogStyleDashSecondLineWithoutSpace> - <ContinuationStyle>Στυλ συνέχισης</ContinuationStyle> - <ContinuationStyleNone>Χωρίς</ContinuationStyleNone> - <ContinuationStyleNoneTrailingDots>Χωρίς, αποσιωπητικά για παύσεις (μόνο συνέχιση)</ContinuationStyleNoneTrailingDots> - <ContinuationStyleNoneLeadingTrailingDots>Χωρίς, αποσιωπητικά για παύσεις</ContinuationStyleNoneLeadingTrailingDots> - <ContinuationStyleOnlyTrailingDots>Αποσιωπητικά (μόνο συνέχιση)</ContinuationStyleOnlyTrailingDots> - <ContinuationStyleLeadingTrailingDots>Αποσιωπητικά</ContinuationStyleLeadingTrailingDots> - <ContinuationStyleLeadingTrailingDash>Παύλα</ContinuationStyleLeadingTrailingDash> - <ContinuationStyleLeadingTrailingDashDots>Παύλα, αποσιωπητικά για παύσεις</ContinuationStyleLeadingTrailingDashDots> - <MusicSymbol>Μουσικό σύμβολο</MusicSymbol> - <MusicSymbolsReplace>Αντικατάσταση μουσικών συμβόλων (χωρισμένα με κόμμα)</MusicSymbolsReplace> - <FixCommonOcrErrorsUseHardcodedRules>Επιδιόρθωση κοινών σφαλμάτων OCR - χρήση ενσωματωμένων κανόνων</FixCommonOcrErrorsUseHardcodedRules> - <FixCommonerrorsFixShortDisplayTimesAllowMoveStartTime>Επιδιόρθωση του σύντομου χρόνου εμφάνισης - αλλαγή χρόνου έναρξης</FixCommonerrorsFixShortDisplayTimesAllowMoveStartTime> - <FixCommonErrorsSkipStepOne>Παράβλεψη πρώτου βήματος (προκαθορισμένες επιλογές)</FixCommonErrorsSkipStepOne> - <Shortcuts>Συντομεύσεις</Shortcuts> - <Shortcut>Συντόμευση</Shortcut> - <Control>Ctrl</Control> - <Alt>Alt</Alt> - <Shift>Shift</Shift> - <Key>Πλήκτρο</Key> - <ListViewAndTextBox>Προβολή λίστας και πλαισίου κειμένου</ListViewAndTextBox> - <ListView>Προβολή λίστας</ListView> - <TextBox>Πλαίσιο κειμένου</TextBox> - <UseSyntaxColoring>Χρήση χρωματισμού σύνταξης</UseSyntaxColoring> - <HtmlColor>Χρώμα HTML</HtmlColor> - <AssaColor>Χρώμα ASSA</AssaColor> - <UpdateShortcut>Ενημέρωση</UpdateShortcut> - <FoucsSetVideoPosition>Εστίαση ορισμού θέσης βίντεο</FoucsSetVideoPosition> - <ToggleDockUndockOfVideoControls>Εναλλαγή αγκύστρωσης/απαγκύστρωσης των στοιχείων ελέγχου βίντεο</ToggleDockUndockOfVideoControls> - <CreateSetEndAddNewAndGoToNew>Ορισμός τέλους, προσθήκη νέου και μετάβαση</CreateSetEndAddNewAndGoToNew> - <AdjustViaEndAutoStart>Προσαρμογή μέσω τελικής θέσης</AdjustViaEndAutoStart> - <AdjustViaEndAutoStartAndGoToNext>Προσαρμογή μέσω τελικής θέσης και επόμενο</AdjustViaEndAutoStartAndGoToNext> - <AdjustSetEndTimeAndGoToNext>Ορισμός λήξης και επόμενο</AdjustSetEndTimeAndGoToNext> - <AdjustSetEndTimeAndPause>Ορισμός λήξης και παύση</AdjustSetEndTimeAndPause> - <AdjustSetStartAutoDurationAndGoToNext>Προσαρμογή μέσω αρχικής θέσης και επόμενο</AdjustSetStartAutoDurationAndGoToNext> - <AdjustSetEndNextStartAndGoToNext>Ορισμός λήξης, έναρξη επομένου εκκίνηση και επόμενο</AdjustSetEndNextStartAndGoToNext> - <AdjustStartDownEndUpAndGoToNext>Κάτω βέλος = ορισμός έναρξης, Πάνω βέλος = ορισμός λήξης και μετάβαση σε επόμενο</AdjustStartDownEndUpAndGoToNext> - <AdjustSetStartAndEndOfPrevious>Ορισμός έναρξης και λήξης προηγούμενου (πλην ελάχιστο κενό)</AdjustSetStartAndEndOfPrevious> - <AdjustSetStartAndEndOfPreviousAndGoToNext>Ορισμός έναρξης και λήξης προηγούμενου και μετάβαση σε επόμενο (πλην ελάχιστο κενό)</AdjustSetStartAndEndOfPreviousAndGoToNext> - <AdjustSelected100MsForward>Μετακίνηση γραμμών 100 χιλ. δ. εμπρός</AdjustSelected100MsForward> - <AdjustSelected100MsBack>Μετακίνηση γραμμών 100 χιλ. δ. πίσω</AdjustSelected100MsBack> - <AdjustStartXMsBack>Μετακίνηση αρχής {0} χιλ. δ. πίσω</AdjustStartXMsBack> - <AdjustStartXMsForward>Μετακίνηση αρχής {0} χιλ. δ. εμπρός</AdjustStartXMsForward> - <AdjustEndXMsBack>Μετακίνηση λήξης {0} χιλ. δ. πίσω</AdjustEndXMsBack> - <AdjustEndXMsForward>Μετακίνηση λήξης {0} χιλ. δ. εμπρός</AdjustEndXMsForward> - <AdjustStartOneFrameBack>Μετακίνηση αρχής 1 καρέ πίσω</AdjustStartOneFrameBack> - <AdjustStartOneFrameForward>Μετακίνηση αρχής 1 καρέ εμπρός</AdjustStartOneFrameForward> - <AdjustEndOneFrameBack>Μετακίνηση λήξης 1 καρέ πίσω</AdjustEndOneFrameBack> - <AdjustEndOneFrameForward>Μετακίνηση λήξης 1 καρέ εμπρός</AdjustEndOneFrameForward> - <AdjustStartOneFrameBackKeepGapPrev>Μετακίνηση αρχής 1 καρέ πίσω (κράτημα κενού στο προηγούμενο)</AdjustStartOneFrameBackKeepGapPrev> - <AdjustStartOneFrameForwardKeepGapPrev>Μετακίνηση αρχής 1 καρέ εμπρός (κράτημα κενού στο προηγούμενο)</AdjustStartOneFrameForwardKeepGapPrev> - <AdjustEndOneFrameBackKeepGapNext>Μετακίνηση λήξης 1 καρέ πίσω (κράτημα κενού στο επόμενο)</AdjustEndOneFrameBackKeepGapNext> - <AdjustEndOneFrameForwardKeepGapNext>Μετακίνηση λήξης 1 καρέ εμπρός (κράτημα κενού στο επόμενο)</AdjustEndOneFrameForwardKeepGapNext> - <AdjustSetStartTimeKeepDuration>Ορισμός έναρξης, διατήρηση διάρκειας</AdjustSetStartTimeKeepDuration> - <AdjustSetEndAndOffsetTheRest>Ορισμός τέλους, αντιστάθμιση υπολοίπων</AdjustSetEndAndOffsetTheRest> - <AdjustSetEndAndOffsetTheRestAndGoToNext>Ορισμός τέλους, αντιστάθμιση υπολοίπων και μετάβαση σε επόμενο</AdjustSetEndAndOffsetTheRestAndGoToNext> - <AdjustSnapStartToNextSceneChange>Σπάσιμο έναρξης γραμμής σε επόμενη αλλαγή σκηνής</AdjustSnapStartToNextSceneChange> - <AdjustSnapStartToNextSceneChangeWithGap>Σπάσιμο έναρξης γραμμής σε επόμενη αλλαγή σκηνής με ελάχιστο κενό</AdjustSnapStartToNextSceneChangeWithGap> - <AdjustSnapEndToPreviousSceneChange>Σπάσιμο έναρξης γραμμής σε προηγούμενη αλλαγή σκηνής</AdjustSnapEndToPreviousSceneChange> - <AdjustSnapEndToPreviousSceneChangeWithGap>Σπάσιμο έναρξης γραμμής σε προηγούμενη αλλαγή σκηνής με ελάχιστο κενό</AdjustSnapEndToPreviousSceneChangeWithGap> - <AdjustExtendToNextSceneChange>Επέκταση γραμμών μέχρι την επόμενη αλλαγή σκηνής (ή επόμενο υπότιτλο)</AdjustExtendToNextSceneChange> - <AdjustExtendToNextSceneChangeWithGap>Επέκταση γραμμών σε επόμενη αλλαγή σκηνής με ελάχιστο κενό (ή επόμενο υπότιτλο)</AdjustExtendToNextSceneChangeWithGap> - <AdjustExtendToPreviousSceneChange>Επέκταση γραμμών μέχρι την προηγούμενη αλλαγή σκηνής (ή προηγούμενο υπότιτλο)</AdjustExtendToPreviousSceneChange> - <AdjustExtendToPreviousSceneChangeWithGap>Επέκταση γραμμών σε προηγούμενη αλλαγή σκηνής με ελάχιστο κενό (ή προηγούμενο υπότιτλο)</AdjustExtendToPreviousSceneChangeWithGap> - <AdjustExtendToNextSubtitle>Επέκταση γραμμών μέχρι τον επόμενο υπότιτλο</AdjustExtendToNextSubtitle> - <AdjustExtendToPreviousSubtitle>Επέκταση γραμμών μέχρι τον προηγούμενο υπότιλο</AdjustExtendToPreviousSubtitle> - <AdjustExtendCurrentSubtitle>Επέκταση γραμμής μέχρι τον επόμενο υπότιτλο ή μέγιστη διάρκεια</AdjustExtendCurrentSubtitle> - <AdjustExtendPreviousLineEndToCurrentStart>Επέκταση λήξης προηγούμενης γραμμής σε έναρξη τρέχουσας</AdjustExtendPreviousLineEndToCurrentStart> - <AdjustExtendNextLineStartToCurrentEnd>Επέκταση έναρξης επόμενης γραμμής σε λήξη τρέχουσας</AdjustExtendNextLineStartToCurrentEnd> - <RecalculateDurationOfCurrentSubtitle>Επαναϋπολογισμός διάρκειας υπότιτλου</RecalculateDurationOfCurrentSubtitle> - <MainCreateStartDownEndUp>Δημιουργία νέου στο πάτημα του κάτω βέλους, ορισμός χρόνου λήξης στο πάτημα του πάνω βέλους</MainCreateStartDownEndUp> - <MergeDialog>Συγχώνευση διαλόγου (εισαγωγή παυλών)</MergeDialog> - <GoToNext>Μετάβαση σε επόμενη γραμμή</GoToNext> - <GoToNextCursorAtEnd>Μετάβαση σε επόμενη γραμμή και ορισμός δείκτη στη λήξη</GoToNextCursorAtEnd> - <GoToPrevious>Μετάβαση σε προηγούμενη γραμμή</GoToPrevious> - <GoToCurrentSubtitleStart>Μετάβαση στην αρχή της τρέχουσας γραμμής</GoToCurrentSubtitleStart> - <GoToCurrentSubtitleEnd>Μετάβαση στο τέλος της τρέχουσας γραμμής</GoToCurrentSubtitleEnd> - <GoToPreviousSubtitleAndFocusVideo>Μετάβαση σε προηγούμενη γραμμή και ορισμός θέσης βίντεο</GoToPreviousSubtitleAndFocusVideo> - <GoToNextSubtitleAndFocusVideo>Μετάβαση σε επόμενη γραμμή και ορισμός θέσης βίντεο</GoToNextSubtitleAndFocusVideo> - <GoToPrevSubtitleAndPlay>Μετάβαση σε προηγούμενη γραμμή και αναπαραγωγή</GoToPrevSubtitleAndPlay> - <GoToNextSubtitleAndPlay>Μετάβαση σε επόμενη γραμμή και αναπαραγωγή</GoToNextSubtitleAndPlay> - <ToggleFocus>Εναλλαγή εστίασης υποτίτλου μεταξύ προβολής λίστας και πλαισίου κειμένου</ToggleFocus> - <ToggleDialogDashes>Εναλλαγή γραμμών διαλόγου</ToggleDialogDashes> - <ToggleMusicSymbols>Εναλλαγή μουσικών συμβόλων</ToggleMusicSymbols> - <Alignment>Στοίχιση (επιλεγμένες γραμμές)</Alignment> - <AlignmentN1>Στοίχιση κάτω αριστερά - {\an1}</AlignmentN1> - <AlignmentN2>Στοίχιση κάτω κεντρικά - {\an2}</AlignmentN2> - <AlignmentN3>Στοίχιση κάτω δεξιά - {\an1}</AlignmentN3> - <AlignmentN4>Στοίχιση μέση αριστερά - {\an4}</AlignmentN4> - <AlignmentN5>Στοίχιση μέση κέντρο - {\an5}</AlignmentN5> - <AlignmentN6>Στοίχιση μέση δεξιά - {\an6}</AlignmentN6> - <AlignmentN7>Στοίχιση πάνω αριστερά - {\an7}</AlignmentN7> - <AlignmentN8>Στοίχιση πάνω κεντρικά - {\an8}</AlignmentN8> - <AlignmentN9>Στοίχιση πάνω δεξιά - {\an9}</AlignmentN9> - <CopyTextOnly>Αντιγραφή μόνο του κειμένου στο πρόχειρο (επιλεγμένες γραμμές)</CopyTextOnly> - <CopyTextOnlyFromOriginalToCurrent>Αντιγραφή κειμένου από αρχικό στον τρέχων</CopyTextOnlyFromOriginalToCurrent> - <AutoDurationSelectedLines>Αυτόματη διάρκεια (επιλεγμένες γραμμές)</AutoDurationSelectedLines> - <FixRTLViaUnicodeChars>Επιδιόρθωση RTL μέσω χαρακτήρων ελέγχου Unicode</FixRTLViaUnicodeChars> - <RemoveRTLUnicodeChars>Αφαίρεση χαρακτήρων ελέγχου Unicode</RemoveRTLUnicodeChars> - <ReverseStartAndEndingForRtl>Αντιστροφή έναρξης/λήξης RTL</ReverseStartAndEndingForRtl> - <VerticalZoom>Κάθετη μεγέθυνση</VerticalZoom> - <VerticalZoomOut>Κάθετη σμίκρυνση</VerticalZoomOut> - <WaveformSeekSilenceForward>Αναζήτηση σιωπής εμπρός</WaveformSeekSilenceForward> - <WaveformSeekSilenceBack>Αναζήτηση σιωπής πίσω</WaveformSeekSilenceBack> - <WaveformAddTextHere>Προσθήκη κειμένου (για νέα επιλογή)</WaveformAddTextHere> - <WaveformAddTextHereFromClipboard>Προσθήκη κειμένου (για νέα επιλογή από πρόχειρο)</WaveformAddTextHereFromClipboard> - <SetParagraphAsSelection>Ορισμός επιλεγμένου ως νέα επιλογή</SetParagraphAsSelection> - <WaveformPlayNewSelection>Αναπαραγωγή επιλεγμένου</WaveformPlayNewSelection> - <WaveformPlayNewSelectionEnd>Αναπαραγωγή λήξης επιλεγμένου</WaveformPlayNewSelectionEnd> - <WaveformPlayFirstSelectedSubtitle>Αναπαραγωγή του πρώτου υπότιτλου</WaveformPlayFirstSelectedSubtitle> - <WaveformFocusListView>Εστίαση σε προβολή λίστας</WaveformFocusListView> - <WaveformGoToPreviousSceneChange>Μετάβαση σε προηγούμενη αλλαγή σκηνής</WaveformGoToPreviousSceneChange> - <WaveformGoToNextSceneChange>Μετάβαση σε επόμενη αλλαγή σκηνής</WaveformGoToNextSceneChange> - <WaveformToggleSceneChange>Εναλλαγή αλλαγή σκηνής</WaveformToggleSceneChange> - <WaveformGuessStart>Αυτόματη προσαρμογή έναρξης μέσω έντασης/αλλαγή σκηνής</WaveformGuessStart> - <GoBack1Frame>Πίσω ένα καρέ</GoBack1Frame> - <GoForward1Frame>Μπροστά ένα καρέ</GoForward1Frame> - <GoBack1FrameWithPlay>Πίσω ένα καρέ (με αναπαραγωγή)</GoBack1FrameWithPlay> - <GoForward1FrameWithPlay>Μπροστά ένα καρέ (με αναπαραγωγή)</GoForward1FrameWithPlay> - <GoBack100Milliseconds>Πίσω 100 χιλ. δ.</GoBack100Milliseconds> - <GoForward100Milliseconds>Μπροστά 100 χιλ. δ.</GoForward100Milliseconds> - <GoBack500Milliseconds>Πίσω 500 χιλ. δ.</GoBack500Milliseconds> - <GoForward500Milliseconds>Μπροστά 500 χιλ. δ.</GoForward500Milliseconds> - <GoBack1Second>Πίσω 1 δευτερόλεπτο</GoBack1Second> - <GoForward1Second>Μπροστά 1 δευτερόλεπτο</GoForward1Second> - <GoBack5Seconds>Πίσω 5 δευτερόλεπτα</GoBack5Seconds> - <GoForward5Seconds>Μπροστά 5 δευτερόλεπτα</GoForward5Seconds> - <GoBackXSSeconds>Μικρή προώθηση χρόνου πίσω</GoBackXSSeconds> - <GoForwardXSSeconds>Μικρή προώθηση χρόνου εμπρός</GoForwardXSSeconds> - <GoBackXLSeconds>Μεγάλη προώθηση χρόνου πίσω</GoBackXLSeconds> - <GoForwardXLSeconds>Μεγάλη προώθηση χρόνου εμπρός</GoForwardXLSeconds> - <GoBack3Second>Πίσω 3 δευτερόλεπτα</GoBack3Second> - <GoToStartCurrent>Ορισμός θέσης βίντεο στην έναρξη του τρέχοντος υπότιτλου</GoToStartCurrent> - <ToggleStartEndCurrent>Εναλλαγή θέσης βίντεο μεταξύ έναρξης/λήξης τρέχοντος υπότιτλου</ToggleStartEndCurrent> - <PlayCurrent>Αναπαραγωγή τρέχοντος υπότιτλου</PlayCurrent> - <WaveformGoToPrevSubtitle>Μετάβαση σε προηγούμενο υπότιτλο (από θέση βίντεο)</WaveformGoToPrevSubtitle> - <WaveformGoToNextSubtitle>Μετάβαση σε επόμενο υπότιτλο (από θέση βίντεο)</WaveformGoToNextSubtitle> - <WaveformGoToPrevChapter>Μετάβαση σε προηγούμενο κεφάλαιο</WaveformGoToPrevChapter> - <WaveformGoToNextChapter>Μετάβαση σε επόμενο κεφάλαιο</WaveformGoToNextChapter> - <WaveformSelectNextSubtitle>Επιλογή επόμενου υπότιτλου (από θέση βίντεο, χωρίς αλλαγή)</WaveformSelectNextSubtitle> - <TogglePlayPause>Εναλλαγή αναπαραγωγής/παύσης</TogglePlayPause> - <Pause>Παύση</Pause> - <Fullscreen>Πλήρη οθόνη</Fullscreen> - <PlayRateSlower>Πιο αργός ρυθμός αναπαραγωγής</PlayRateSlower> - <PlayRateFaster>Ταχύτερος ρυθμός αναπαραγωγής</PlayRateFaster> - <VideoResetSpeedAndZoom>Επαναφορά ταχύτητας/μεγένθυσης</VideoResetSpeedAndZoom> - <CustomSearch1>Μετάφραση, προσαρμοσμένη αναζήτηση 1</CustomSearch1> - <CustomSearch2>Μετάφραση, προσαρμοσμένη αναζήτηση 2</CustomSearch2> - <CustomSearch3>Μετάφραση, προσαρμοσμένη αναζήτηση 3</CustomSearch3> - <CustomSearch4>Μετάφραση, προσαρμοσμένη αναζήτηση 4</CustomSearch4> - <CustomSearch5>Μετάφραση, προσαρμοσμένη αναζήτηση 5</CustomSearch5> - <SyntaxColoring>Χρωματισμός σύνταξης</SyntaxColoring> - <ListViewSyntaxColoring>Χρωματισμός σύνταξης στην προβολή λίστας</ListViewSyntaxColoring> - <SyntaxColorDurationIfTooSmall>Χρώμα διάρκειας εάν είναι πολύ μικρός</SyntaxColorDurationIfTooSmall> - <SyntaxColorDurationIfTooLarge>Χρώμα διάρκειας εάν είναι πολύ μεγάλος</SyntaxColorDurationIfTooLarge> - <SyntaxColorTextIfTooLong>Χρώμα κειμένου εάν είναι πολύ μακρύ</SyntaxColorTextIfTooLong> - <SyntaxColorTextIfTooWide>Χρώμα κειμένου αν είναι ευρύ (εικονοστοιχεία)</SyntaxColorTextIfTooWide> - <SyntaxColorTextMoreThanMaxLines>Χρώμα κειμένου αν είναι περισσότερες από {0} γραμμές</SyntaxColorTextMoreThanMaxLines> - <SyntaxColorOverlap>Χρώμα κωδικών χρόνου που επικαλύπτονται</SyntaxColorOverlap> - <SyntaxColorGap>Χρώμα κενού αν είναι μικρότερο</SyntaxColorGap> - <SyntaxErrorColor>Χρώμα σφάλματος</SyntaxErrorColor> - <SyntaxLineWidthSettings>Ρυθμίσεις...</SyntaxLineWidthSettings> - <LineWidthSettings>Ρυθμίσεις εύρους γραμμής</LineWidthSettings> - <MaximumLineWidth>Μέγιστο εύρος γραμμής:</MaximumLineWidth> - <Pixels>εικονοστοιχεία</Pixels> - <MeasureFont>Μέτρηση γραμματοσειράς:</MeasureFont> - <GoToFirstSelectedLine>Μετάβαση σε πρώτη επιλεγμένη γραμμή</GoToFirstSelectedLine> - <GoToNextEmptyLine>Μετάβαση σε επόμενη κενή γραμμή</GoToNextEmptyLine> - <MergeSelectedLines>Συγχώνευση γραμμών</MergeSelectedLines> - <MergeSelectedLinesAndAutoBreak>Συγχώνευση γραμμών και αυτόματη διάσπαση</MergeSelectedLinesAndAutoBreak> - <MergeSelectedLinesAndUnbreak>Συγχώνευση γραμμών και συνένωση</MergeSelectedLinesAndUnbreak> - <MergeSelectedLinesAndUnbreakCjk>Συγχώνευση γραμμών και συνένωση χωρίς κενό</MergeSelectedLinesAndUnbreakCjk> - <MergeSelectedLinesOnlyFirstText>Συγχώνευση γραμμών, κράτημα μόνο του πρώτου κειμένου</MergeSelectedLinesOnlyFirstText> - <MergeSelectedLinesBilingual>Συγχώνευση γραμμών δίγλωσσα</MergeSelectedLinesBilingual> - <SplitSelectedLineBilingual>Διαχωρισμός γραμμής δίγλωσσα</SplitSelectedLineBilingual> - <ToggleTranslationMode>Εναλλαγή τρόπου μετάφρασης</ToggleTranslationMode> - <SwitchOriginalAndTranslation>Εναλλαγή αρχικού και μετάφρασης</SwitchOriginalAndTranslation> - <MergeOriginalAndTranslation>Συγχώνευση αρχικού και μετάφρασης</MergeOriginalAndTranslation> - <MergeWithNext>Συγχώνευση με επόμενη</MergeWithNext> - <MergeWithPrevious>Συγχώνευση με προηγούμενη</MergeWithPrevious> - <ShortcutIsAlreadyDefinedX>Ορισμένη συντόμευση: {0}</ShortcutIsAlreadyDefinedX> - <ToggleTranslationAndOriginalInPreviews>Εναλλαγή μετάφρασης και αρχικού στην προεπισκόπηση βίντεο/ήχου</ToggleTranslationAndOriginalInPreviews> - <ListViewColumnDelete>Στήλη, διαγραφή κειμένου</ListViewColumnDelete> - <ListViewColumnDeleteAndShiftUp>Στήλη, διαγραφή κειμένου και άνω μετατόπιση</ListViewColumnDeleteAndShiftUp> - <ListViewColumnInsert>Στήλη, εισαγωγή κειμένου</ListViewColumnInsert> - <ListViewColumnPaste>Στήλη, επικόλληση</ListViewColumnPaste> - <ListViewColumnTextUp>Στήλη, κείμενο προς τα πάνω</ListViewColumnTextUp> - <ListViewColumnTextDown>Στήλη, κείμενο προς τα κάτω</ListViewColumnTextDown> - <ListViewFocusWaveform>Εστίαση κυματομορφής/φασματογραφήματος</ListViewFocusWaveform> - <ListViewGoToNextError>Μετάβαση σε επόμενο σφάλμα</ListViewGoToNextError> - <ShowBeamer>Ξεκινήστε υπότιτλο σε πλήρη οθόνη βιντεοπροβολέα</ShowBeamer> - <MainTextBoxMoveLastWordDown>Μετακίνηση τελευταίας λέξης στην επόμενη γραμμή</MainTextBoxMoveLastWordDown> - <MainTextBoxMoveFirstWordFromNextUp>Μετακίνηση πρώτης λέξης από την επόμενη γραμμή επάνω</MainTextBoxMoveFirstWordFromNextUp> - <MainTextBoxMoveFirstWordUpCurrent>Μετακίνηση πρώτης λέξης της κάτω γραμμής πάνω</MainTextBoxMoveFirstWordUpCurrent> - <MainTextBoxMoveLastWordDownCurrent>Μετακίνηση τελευταίας λέξης της άνω γραμμής κάτω</MainTextBoxMoveLastWordDownCurrent> - <MainTextBoxSelectionToLower>Επιλογή σε μικρά</MainTextBoxSelectionToLower> - <MainTextBoxSelectionToUpper>Επιλογή σε κεφαλαία</MainTextBoxSelectionToUpper> - <MainTextBoxSelectionToggleCasing>Εναλλαγή πεζών-κεφαλαίων επιλογής (κανονικά/κεφαλαία/πεζά)</MainTextBoxSelectionToggleCasing> - <MainTextBoxSelectionToRuby>Επιλογή σε Ruby (Ιαπωνικά)</MainTextBoxSelectionToRuby> - <MainTextBoxToggleAutoDuration>Εναλλαγή αυτόματης διάρκειας</MainTextBoxToggleAutoDuration> - <MainTextBoxAutoBreak>Αυτόματη διάσπαση κειμένου</MainTextBoxAutoBreak> - <MainTextBoxAutoBreakFromPos>Διάσπαση σε κενό από τη θέση δείκτη</MainTextBoxAutoBreakFromPos> - <MainTextBoxAutoBreakFromPosAndGoToNext>Διάσπαση σε κενό από τη θέση δείκτη και μετάβαση σε επόμενο</MainTextBoxAutoBreakFromPosAndGoToNext> - <MainTextBoxUnbreak>Συνένωση κειμένου</MainTextBoxUnbreak> - <MainFileSaveAll>Αποθήκευση όλων</MainFileSaveAll> - <Miscellaneous>Διάφορα</Miscellaneous> - <CpsIncludesSpace>Συμπερίληψη κενών στους χαρακτήρες/δευτερόλεπτο</CpsIncludesSpace> - <UseDoNotBreakAfterList>Χρήση της λίστας μη διάσπασης μετά από</UseDoNotBreakAfterList> - <BreakEarlyForLineEnding>Διάσπαση σε σημεία στίξης</BreakEarlyForLineEnding> - <BreakByPixelWidth>Διάσπαση βάσει εύρους εικονοστοιχείων</BreakByPixelWidth> - <BreakPreferBottomHeavy>Προτίμηση μεγαλύτερης κάτω γραμμής</BreakPreferBottomHeavy> - <BreakEarlyForDashDialog>Διάσπαση σε παύλα διάλογου</BreakEarlyForDashDialog> - <BreakEarlyForComma>Διάσπαση σε κόμμα</BreakEarlyForComma> - <GoogleTranslate>Μετάφραση Google</GoogleTranslate> - <GoogleTranslateApiKey>Κλειδί API</GoogleTranslateApiKey> - <MicrosoftBingTranslator>Μετάφραση Microsoft</MicrosoftBingTranslator> - <HowToSignUp>Βοήθεια εγγραφής</HowToSignUp> - <MicrosoftTranslateApiKey>Κλειδί</MicrosoftTranslateApiKey> - <MicrosoftTranslateTokenEndpoint>Δείγμα τελειώματος</MicrosoftTranslateTokenEndpoint> - <FontNote>Σημείωση: Οι ρυθμίσεις γραμματοσειράς αφορούν μόνο το περιβάλλον χρήση του Subtitle Edit.</FontNote> - <RestoreDefaultSettings>Επαναφορά ρυθμίσεων</RestoreDefaultSettings> - <RestoreDefaultSettingsMsg>Επαναφορά ρυθμίσεων σε προεπιλεγμένες τιμές. -Συνέχιση;</RestoreDefaultSettingsMsg> - <RemoveTimeCodes>Αφαίρεση κωδικών χρόνου</RemoveTimeCodes> - <EditFixContinuationStyleSettings>Επεξεργασία ρυθμίσεων για διόρθωση στυλ συνέχισης...</EditFixContinuationStyleSettings> - <FixContinuationStyleSettings>Ρυθμίσεις διόρθωσης στυλ συνέχισης</FixContinuationStyleSettings> - <UncheckInsertsAllCaps>Εντοπισμός και αποεπιλογή κεφαλαίων τίτλων μίας γραμμής</UncheckInsertsAllCaps> - <UncheckInsertsItalic>Εντοπισμός και αποεπιλογή τίτλων ή στίχων σε πλαγιαστά</UncheckInsertsItalic> - <UncheckInsertsLowercase>Εντοπισμός και αποεπιλογή πεζών τίτλων ή στίχων μίας γραμμής</UncheckInsertsLowercase> - <HideContinuationCandidatesWithoutName>Απόκρυψη απίθανων προτάσεων συνέχισης</HideContinuationCandidatesWithoutName> - <IgnoreLyrics>Αγνόηση στίχων μεταξύ μουσικών συμβόλων</IgnoreLyrics> - <MinFrameGap>Ελάχιστο κενό σε καρέ</MinFrameGap> - <XFramesAtYFrameRateGivesZMs>{0} καρέ ανά {1} καρέ είναι {2} χιλ. δευτερολέπτου.</XFramesAtYFrameRateGivesZMs> - <UseXAsNewGap>Χρήση "{0}" χιλ. δευτερολέπτου ως ελάχιστο κενό;</UseXAsNewGap> - </Settings> - <SettingsMpv> - <Title>Ρυθμίσεις mpv</Title> - <DownloadMpv>Λήψη mpv lib</DownloadMpv> - <DownloadMpvFailed>Αδυναμία λήψης mpv - παρακαλώ, προσπαθήστε αργότερα!</DownloadMpvFailed> - <DownloadMpvOk>Ολοκλήρωση λήψης mpv lib και έτοιμο προς χρήση.</DownloadMpvOk> - </SettingsMpv> - <SettingsFfmpeg> - <Title>Λήψη FFmpeg</Title> - <XDownloadFailed>Αδυναμία λήψης {0} - παρακαλώ, προσπαθήστε αργότερα!</XDownloadFailed> - <XDownloadOk>Λήψη {0} και έτοιμο προς χρήση.</XDownloadOk> - </SettingsFfmpeg> - <SetVideoOffset> - <Title>Ορισμός έναρξης βίντεο</Title> - <Description>Ορισμός έναρξης βίντεο (μη ακουλούθηση πραγματικού χρόνου βίντεο)</Description> - <RelativeToCurrentVideoPosition>Σχετικά με την τρέχουσα θέση βίντεο</RelativeToCurrentVideoPosition> - <KeepTimeCodes>Κράτημα υπαρχόντων κωδικών χρόνου (μη προσθήκη έναρξης βίντεο)</KeepTimeCodes> - <Reset>Επαναφορά</Reset> - </SetVideoOffset> - <ShowEarlierLater> - <Title>Εμφάνιση γραμμών νωρίτερα/αργότερα</Title> - <TitleAll>Εμφάνιση όλων των γραμμών νωρίτερα/αργότερα</TitleAll> - <ShowEarlier>Εμφάνιση νωρίτερα</ShowEarlier> - <ShowLater>Εμφάνιση αργότερα</ShowLater> - <TotalAdjustmentX>Συνολική προσαρμογή: {0}</TotalAdjustmentX> - <AllLines>Όλες οι γραμμές</AllLines> - <SelectedLinesOnly>Μόνο τις επιλεγμένες γραμμές</SelectedLinesOnly> - <SelectedLinesAndForward>Επιλογή από τη(ις) γραμμή(ές) και εμπρός</SelectedLinesAndForward> - </ShowEarlierLater> - <ShowHistory> - <Title>Ιστορικό (για αναίρεση)</Title> - <SelectRollbackPoint>Επιλέξτε χρόνο/περιγραφή για επαναφορά</SelectRollbackPoint> - <Time>Χρόνος</Time> - <Description>Περιγραφή</Description> - <CompareHistoryItems>Σύγκριση στοιχείων ιστορικού</CompareHistoryItems> - <CompareWithCurrent>Σύγκριση με τρέχον</CompareWithCurrent> - <Rollback>Επαναφορά</Rollback> - </ShowHistory> - <SpellCheck> - <Title>Ορθογραφικός έλεγχος</Title> - <FullText>Πλήρους κειμένου</FullText> - <WordNotFound>Λέξη δεν βρέθηκε</WordNotFound> - <Language>Γλώσσα</Language> - <Change>Αλλαγή</Change> - <ChangeAll>Αλλαγή όλων</ChangeAll> - <SkipOnce>Παράλειψη &amp;ενός</SkipOnce> - <SkipAll>&amp;Παράλειψη όλων</SkipAll> - <AddToUserDictionary>Προσθήκη στο λεξικό του χρήστη</AddToUserDictionary> - <AddToNamesAndIgnoreList>Προσθήκη στη λίστα ονομάτων/παραλείψεων (διάκριση πεζών-κεφαλαίων)</AddToNamesAndIgnoreList> - <AddToOcrReplaceList>Προσθήκη ζεύγους στη λίστα αντικατάστασης του OCR</AddToOcrReplaceList> - <Abort>Ματαίωση</Abort> - <Use>Χρήση</Use> - <UseAlways>&amp;Χρήση πάντα</UseAlways> - <Suggestions>Προτάσεις</Suggestions> - <SpellCheckProgress>Ορθογραφικός έλεγχος [{0}] - {1}</SpellCheckProgress> - <EditWholeText>Επεξεργασία ολόκληρου κειμένου</EditWholeText> - <EditWordOnly>Επεξεργασία λέξης</EditWordOnly> - <AddXToNames>Προσθήκη '{0}' στη λίστα ονομάτων</AddXToNames> - <AddXToUserDictionary>Προσθήκη {0} στο λεξικό χρήστη</AddXToUserDictionary> - <AutoFixNames>Αυτόματη επιδιόρθωση ονομάτων μόνο για διαφορά πεζών-κεφαλαίων</AutoFixNames> - <AutoFixNamesViaSuggestions>Διόρθωση ονομάτων μέσω 'προτάσεων ορθογραφικού ελέγχου'</AutoFixNamesViaSuggestions> - <CheckOneLetterWords>Ερώτηση για άγνωστες λέξεις ένός γράμματος</CheckOneLetterWords> - <TreatINQuoteAsING>Αντιμετώπιση κατάληξης " in' " ως " ing " (Μόνο Αγγλικά)</TreatINQuoteAsING> - <RememberUseAlwaysList>Απομνημόνευση λίστας "Χρήση πάντα"</RememberUseAlwaysList> - <ImageText>Κείμενο εικόνας</ImageText> - <SpellCheckCompleted>Ολοκλήρωση ορθογραφικού ελέγχου</SpellCheckCompleted> - <SpellCheckAborted>Ματαίωση ορθογραφικού ελέγχου</SpellCheckAborted> - <SpacesNotAllowed>Απαγορεύονται τα κενά σε λέξη!</SpacesNotAllowed> - <UndoX>Αναιρέθηκαν: {0}</UndoX> - </SpellCheck> - <NetflixQualityCheck> - <GlyphCheckReport>Μη έγκυρος χαρακτήρας {0} στη στήλη {1}</GlyphCheckReport> - <WhiteSpaceCheckReport>Μη έγκυρο κενό στη στήλη {0}</WhiteSpaceCheckReport> - <ReportPrompt>Δείτε την αναφορά εδώ: {0}.</ReportPrompt> - <OpenReportInFolder>Άνοιγμα φακέλου αναφοράς</OpenReportInFolder> - <FoundXIssues>Ο έλεγχος ποιότητας Netflix εντόπισε {0:#,###} προβλήματα.</FoundXIssues> - <CheckOk>Χωρίς προβλήματα</CheckOk> - <MaximumXCharsPerSecond>Μέγιστοι {0} χαρακτήρες/ δευτ (εξαίρεση κενών)</MaximumXCharsPerSecond> - <MaximumLineLength>Μέγιστο μήκος γραμμής ({0})</MaximumLineLength> - <MinimumDuration>Ελάχιστη διάρκεια: 5/6 δευτερολέπτου (833 χ.δ.)</MinimumDuration> - </NetflixQualityCheck> - <Split> - <Title>Διαχωρισμός</Title> - <SplitOptions>Επιλογές διαχωρισμού</SplitOptions> - <Lines>Γραμμές</Lines> - <Characters>Χαρακτήρες</Characters> - <NumberOfEqualParts>Αριθμός ίσων κομματιών</NumberOfEqualParts> - <SubtitleInfo>Πληροφορίες υπότιτλου</SubtitleInfo> - <NumberOfLinesX>Αριθμός γραμμών: {0:#,###}</NumberOfLinesX> - <NumberOfCharactersX>Αριθμός χαρακτήρων: {0:#,###,###}</NumberOfCharactersX> - <Output>Εξαγωγή</Output> - <FileName>Όνομα αρχείου</FileName> - <OutputFolder>Φάκελος εξαγωγής</OutputFolder> - <DoSplit>Διαχωρισμός</DoSplit> - <Basic>Βασικός</Basic> - </Split> - <SplitLongLines> - <Title>Διάσπαση/διαχωρισμός μεγάλων γραμμών</Title> - <SingleLineMaximumLength>Μέγιστο μήκος μονής γραμμής</SingleLineMaximumLength> - <LineMaximumLength>Μέγιστο μήκος γραμμής</LineMaximumLength> - <LineContinuationBeginEndStrings>Συμβολοσειρές έναρξης/λήξης συνέχισης της γραμμής</LineContinuationBeginEndStrings> - <NumberOfSplits>Σύνολο διαχωρισμών: {0}</NumberOfSplits> - <LongestSingleLineIsXAtY>Το μεγαλύτερο μήκος μονής γραμμής είναι {0} στη γραμμή {1}</LongestSingleLineIsXAtY> - <LongestLineIsXAtY>Το μεγαλύτερο μήκος μήκος ολικής γραμμής είναι {0} στη γραμμή {1}</LongestLineIsXAtY> - </SplitLongLines> - <SplitSubtitle> - <Title>Διαχωρισμός υπότιτλου</Title> - <Description1>Εισαγωγή μήκους πρώτου μέρους βίντεο ή περιήγηση</Description1> - <Description2>και πάρτε το μήκος από αρχείο βίντεο:</Description2> - <Split>&amp;Διαχωρισμός</Split> - <Done>&amp;Ολοκληρώθηκε</Done> - <NothingToSplit>Τίποτα για διαχωρισμό !</NothingToSplit> - <SavePartOneAs>Αποθήκευση μέρους 1 ως...</SavePartOneAs> - <SavePartTwoAs>Αποθήκευση μέρους 2 ως...</SavePartTwoAs> - <Part1>Μέρος1</Part1> - <Part2>Μέρος2</Part2> - <UnableToSaveFileX>Αδυναμία αποθήκευσης {0}</UnableToSaveFileX> - <OverwriteExistingFiles>Αντικατάσταση υπαρχόντων αρχείων;</OverwriteExistingFiles> - <FolderNotFoundX>Ο φάκελος δεν βρέθηκε: {0}</FolderNotFoundX> - <Untitled>Χωρίς τίτλο</Untitled> - </SplitSubtitle> - <StartNumberingFrom> - <Title>Επαναρίθμησης από...</Title> - <StartFromNumber>Έναρξη από τον αριθμό:</StartFromNumber> - <PleaseEnterAValidNumber>Εισαγωγή έγκυρου αριθμού</PleaseEnterAValidNumber> - </StartNumberingFrom> - <Statistics> - <Title>Στατιστικά</Title> - <TitleWithFileName>Στατιστικά - {0}</TitleWithFileName> - <GeneralStatistics>Γενικά στατιστικά</GeneralStatistics> - <MostUsed>Περισσότερη χρήση...</MostUsed> - <MostUsedLines>Οι περισσότερες χρησιμοποιούμενες γραμμές</MostUsedLines> - <MostUsedWords>Οι περισσότερες χρησιμοποιούμενες λέξεις</MostUsedWords> - <NothingFound>Δεν βρέθηκε τίποτα</NothingFound> - <NumberOfLinesX>Αριθμός γραμμών υποτίτλου: {0:#,###}</NumberOfLinesX> - <LengthInFormatXinCharactersY>Αριθμός χαρακτήρων όπως {0}: {1:#,###,##0}</LengthInFormatXinCharactersY> - <NumberOfCharactersInTextOnly>Αριθμός χαρακτήρων μόνο στο κείμενο: {0:#,###,##0}</NumberOfCharactersInTextOnly> - <TotalDuration>Συνολική διάρκεια των υποτίτλων: {0:#,##0}</TotalDuration> - <TotalCharsPerSecond>Σύνολο χαρακτήρων/δευτερόλεπτο: {0:0.0} δευτερόλεπτα</TotalCharsPerSecond> - <TotalWords>Σύνολο λέξεων: {0:#,##0}</TotalWords> - <NumberOfItalicTags>Αριθμός ετικετών πλάγιας γραφής: {0}</NumberOfItalicTags> - <NumberOfBoldTags>Αριθμός ετικετών έντονης γραφής: {0}</NumberOfBoldTags> - <NumberOfUnderlineTags>Αριθμός ετικετών υπογραμμισμένης γραφής: {0}</NumberOfUnderlineTags> - <NumberOfFontTags>Αριθμός ετικετών γραμματοσειράς: {0}</NumberOfFontTags> - <NumberOfAlignmentTags>Αριθμός ετικετών στοίχισης: {0}</NumberOfAlignmentTags> - <LineLengthMinimum>Μήκος υποτίτλου - ελάχιστο: {0}</LineLengthMinimum> - <LineLengthMaximum>Μήκος υποτίτλου - μέγιστο: {0}</LineLengthMaximum> - <LineLengthAverage>Μήκος υποτίτλου - μέσο: {0}</LineLengthAverage> - <LinesPerSubtitleAverage>Αριθμός γραμμών υποτίτλων - μέσος: {0:0.0}</LinesPerSubtitleAverage> - <SingleLineLengthMinimum>Μήκος μονής γραμμής - ελάχιστο: {0}</SingleLineLengthMinimum> - <SingleLineLengthMaximum>Μήκος μονής γραμμής - μέγιστο: {0}</SingleLineLengthMaximum> - <SingleLineLengthAverage>Μήκος μονής γραμμής - μέσο: {0}</SingleLineLengthAverage> - <SingleLineWidthMinimum>Εύρος μονής γραμμής - ελάχιστο: {0} εικονοστοιχεία</SingleLineWidthMinimum> - <SingleLineWidthMaximum>Εύρος μονής γραμμής - μέγιστο: {0} εικονοστοιχεία</SingleLineWidthMaximum> - <SingleLineWidthAverage>Εύρος μονής γραμμής - μέσο: {0} εικονοστοιχεία</SingleLineWidthAverage> - <DurationMinimum>Διάρκεια - ελάχιστη: {0:0.000} δευτερόλεπτα</DurationMinimum> - <DurationMaximum>Διάρκεια - μέγιστη: {0:0.000} δευτερόλεπτα</DurationMaximum> - <DurationAverage>Διάρκεια - μέση: {0:0.000} δευτερόλεπτα</DurationAverage> - <CharactersPerSecondMinimum>Χαρακτήρες/ δευτ - ελάχιστοι: {0:0.000}</CharactersPerSecondMinimum> - <CharactersPerSecondMaximum>Χαρακτήρες/ δευτ - μέγιστοι: {0:0.000}</CharactersPerSecondMaximum> - <CharactersPerSecondAverage>Χαρακτήρες/ δευτ - μέσοι: {0:0.000}</CharactersPerSecondAverage> - <Export>Εξαγωγή...</Export> - </Statistics> - <SubStationAlphaProperties> - <Title>Προχωρημένες ιδιότητες Sub Station Alpha</Title> - <TitleSubstationAlpha>Ιδιότητες Sub Station Alpha</TitleSubstationAlpha> - <Script>Σενάριο</Script> - <ScriptTitle>Τίτλος</ScriptTitle> - <OriginalScript>Αρχικό σενάριο</OriginalScript> - <Translation>Μετάφραση</Translation> - <Editing>Επιμέλεια</Editing> - <Timing>Χρονισμός</Timing> - <SyncPoint>Σημείο συγχρονισμού</SyncPoint> - <UpdatedBy>Ενημερωμένο από</UpdatedBy> - <UpdateDetails>Λεπτομέρειες ενημέρωσης</UpdateDetails> - <Resolution>Ανάλυση</Resolution> - <VideoResolution>Ανάλυση βίντεοVideo resolution</VideoResolution> - <Options>Επιλογές</Options> - <WrapStyle>Στυλ αναδίπλωσης</WrapStyle> - <Collision>Σύγκρουση</Collision> - <ScaleBorderAndShadow>Κλίμακα ορίων και σκιάς</ScaleBorderAndShadow> - </SubStationAlphaProperties> - <SubStationAlphaStyles> - <Title>Προχωρημένα στυλ Sub Station Alpha</Title> - <TitleSubstationAlpha>Στυλ Sub Station Alpha</TitleSubstationAlpha> - <Styles>Στυλ</Styles> - <Properties>Ιδιότητες</Properties> - <Name>Όνομα</Name> - <Font>Γραμματοσειρά</Font> - <FontName>Όνομα γραμματοσειράς</FontName> - <FontSize>Μέγεθος γραμματοσειράς</FontSize> - <UseCount>Χρησιμοποιημένα</UseCount> - <Primary>Πρωτογενής</Primary> - <Secondary>Δευτερογενής</Secondary> - <Tertiary>Τριτογενής</Tertiary> - <Outline>Περίγραμμα</Outline> - <Shadow>Σκιά</Shadow> - <Back>Πίσω</Back> - <Alignment>Στοίχιση</Alignment> - <TopLeft>Επάνω/αριστερά</TopLeft> - <TopCenter>Επάνω/κέντρο</TopCenter> - <TopRight>Επάνω/δεξιά</TopRight> - <MiddleLeft>Μέση/αριστερά</MiddleLeft> - <MiddleCenter>Μέση/κέντρο</MiddleCenter> - <MiddleRight>Μέση/δεξιά</MiddleRight> - <BottomLeft>Κάτω/αριστερά</BottomLeft> - <BottomCenter>Κάτω/κέντρο</BottomCenter> - <BottomRight>Κάτω/δεξιά</BottomRight> - <Colors>Χρώματα</Colors> - <Margins>Περιθώρια</Margins> - <MarginLeft>Περιθώριο αριστερά</MarginLeft> - <MarginRight>Περιθώριο δεξιά</MarginRight> - <MarginVertical>Περιθώριο κάθετα</MarginVertical> - <Border>Όριο</Border> - <PlusShadow>+ Σκιά</PlusShadow> - <OpaqueBox>Αδιαφανές πλαίσιο (χρήση χρώματος περιγράμματος)</OpaqueBox> - <Import>Εισαγωγή...</Import> - <Export>Εξαγωγή...</Export> - <Copy>Αντιγραφή</Copy> - <CopyOfY>Αντιγραφή από {0}</CopyOfY> - <CopyXOfY>Αντιγραφή {0} από {1}</CopyXOfY> - <New>Νέο</New> - <Remove>Αφαίρεση</Remove> - <RemoveAll>Αφ. όλων</RemoveAll> - <ImportStyleFromFile>Εισαγωγή στυλ από αρχείο...</ImportStyleFromFile> - <ExportStyleToFile>Εξαγωγή στυλ σε αρχείο... (προσθήκη σε περίπτωση υπάρχοντος στυλ)</ExportStyleToFile> - <ChooseStyle>Επιλογή στυλ για εισαγωγή</ChooseStyle> - <StyleAlreadyExits>Υπάρχον στυλ: {0}</StyleAlreadyExits> - <StyleXExportedToFileY>Το στυλ '{0}' έχει εξαχθεί στο αρχείο '{1}'</StyleXExportedToFileY> - <StyleXImportedFromFileY>Το στυλ '{0}' έχει εισαχθεί από το αρχείο '{1}'</StyleXImportedFromFileY> - </SubStationAlphaStyles> - <PointSync> - <Title>Συγχρονισμός σημείων</Title> - <TitleViaOtherSubtitle>Συγχρονισμός σημείων μέσω άλλου υπότιτλου</TitleViaOtherSubtitle> - <SyncHelp>Ορισμός δύο σημείων συγχρονισμού για πρόχειρο συγχρονισμό</SyncHelp> - <SetSyncPoint>Ορισμός σημείου συγχρονισμού</SetSyncPoint> - <RemoveSyncPoint>Αφαίρεση σημείου συγχρονισμού</RemoveSyncPoint> - <SyncPointsX>Σημείο συγχρονισμού: {0}</SyncPointsX> - <Info>Ένα σημείο συγχρονισμού θα προσαρμόσει τη θέση, δύο ή περισσότερα θα προσαρμόσουν τη θέση και την ταχύτητα</Info> - <ApplySync>Εφαρμογή</ApplySync> - </PointSync> - <TransportStreamSubtitleChooser> - <Title>Επιλογέας ροής μεταφοράς υποτίτλου - {0}</Title> - <PidLineImage>Εικόνες - Αναγνωριστικό πακέτου μεταφοράς = {0}, γλώσσα = {1}, αριθμός υποτίτλων = {2}</PidLineImage> - <PidLineTeletext>Τηλεκίμενο - Αναγνωριστικό πακέτου μεταφοράς = {1}, σελίδα = {0}, γλώσσα = {2}, αριθμός υποτίτλων = {3}</PidLineTeletext> - <SubLine>{0}: {1} -&gt; {2}, {3} εικόνα(ες)</SubLine> - </TransportStreamSubtitleChooser> - <UnknownSubtitle> - <Title>Άγνωστος τύπος υπότιτλου</Title> - <Message>Αν θέλετε αυτό να φτιαχτεί παρακαλώ στείλτε email στο mailto:niksedk@gmail.com και συμπεριλάβετε ένα αντίγραφο του υπότιτλου.</Message> - <ImportAsPlainText>Εισαγωγή ως απλό κείμενο...</ImportAsPlainText> - </UnknownSubtitle> - <VisualSync> - <Title>Οπτικός συγχρονισμός</Title> - <StartScene>Αρχική σκηνή</StartScene> - <EndScene>Τελική σκηνή</EndScene> - <Synchronize>Συγχρονισμός</Synchronize> - <HalfASecondBack>&lt; ½ δευτ.</HalfASecondBack> - <ThreeSecondsBack>&lt; 3 δευτ.</ThreeSecondsBack> - <PlayXSecondsAndBack>Αναπαραγωγή {0} δευτ. και πίσω</PlayXSecondsAndBack> - <FindText>Εύρεση κειμένου</FindText> - <GoToSubPosition>Μετάβαση στη θέση του υπότιτλου</GoToSubPosition> - <KeepChangesTitle>Διατήρηση αλλαγών;</KeepChangesTitle> - <KeepChangesMessage>Έχουν γίνει αλλαγές στον υπότιτλο μέσω 'Οπτικού συγχρονισμού'. -Διατήρηση αλλαγών;</KeepChangesMessage> - <SynchronizationDone>Ο συγχρονισμός ολοκληρώθηκε!</SynchronizationDone> - <StartSceneMustComeBeforeEndScene>Η αρχική σκηνή πρέπει να είναι πριν από την τελική!</StartSceneMustComeBeforeEndScene> - <Tip>Συμβουλή: Χρησιμοποιήστε &lt;ctrl+βέλη αριστερά/δεξιά&gt; για να μετακινηθείτε 100 χιλ. δευτ. πίσω/εμπρός</Tip> - </VisualSync> - <VobSubEditCharacters> - <Title>Επεξεργασία βάσης δεδομένων σύγκρισης εικόνων</Title> - <ChooseCharacter>Επιλογή χαρακτήρα(ων)</ChooseCharacter> - <ImageCompareFiles>Αρχεία σύγκρισης εικόνων</ImageCompareFiles> - <CurrentCompareImage>Τρέχουσα εικόνα σύγκρισης</CurrentCompareImage> - <TextAssociatedWithImage>Κείμενο που σχετίζεται με την εικόνα</TextAssociatedWithImage> - <IsItalic>Είναι &amp;πλαγιαστό</IsItalic> - <Update>&amp;Ενημέρωση</Update> - <Delete>&amp;Διαγραφή</Delete> - <ImageDoubleSize>Διπλό μέγεθος εικόνας</ImageDoubleSize> - <ImageFileNotFound>Το αρχείο εικόνας δεν βρέθηκε</ImageFileNotFound> - <Image>Εικόνα</Image> - </VobSubEditCharacters> - <VobSubOcr> - <Title>Εισαγωγή/OCR υπότιτλου VobSub (sub/idx)</Title> - <TitleBluRay>Εισαγωγή/OCR υπότιτλου Blu-ray (.sup)</TitleBluRay> - <OcrMethod>Μέθοδος OCR</OcrMethod> - <OcrViaTesseractVersionX>Tesseract {0}</OcrViaTesseractVersionX> - <OcrViaImageCompare>OCR μέσω σύγκρισης εικόνων</OcrViaImageCompare> - <OcrViaModi>OCR μέσω Microsoft Office Document Imaging (MODI). Προϋποθέτει Microsoft Office</OcrViaModi> - <OcrViaNOCR>OCR μέσω nOCR</OcrViaNOCR> - <TesseractEngineMode>Λειτουργία μηχανής</TesseractEngineMode> - <TesseractEngineModeLegacy>Αρχικό Tesseract (ανίχνευση πλαγιαστών)</TesseractEngineModeLegacy> - <TesseractEngineModeNeural>Δίκτυα LSTM</TesseractEngineModeNeural> - <TesseractEngineModeBoth>Tesseract + LSTM</TesseractEngineModeBoth> - <TesseractEngineModeDefault>Προεπιλεγμένο, βάσει διαθέσιμων</TesseractEngineModeDefault> - <Language>Γλώσσα</Language> - <ImageDatabase>Βάση δεδομένων εικόνων</ImageDatabase> - <NoOfPixelsIsSpace>Σύνολο εικονοστοιχείων διαστημάτων</NoOfPixelsIsSpace> - <MaxErrorPercent>Μέγιστο σφάλμα%</MaxErrorPercent> - <New>Νέο</New> - <Edit>Επεξεργασία</Edit> - <StartOcr>Έναρξη OCR</StartOcr> - <Stop>Διακοπή</Stop> - <StartOcrFrom>Έναρξη OCR από τον αριθμό υπότιτλου:</StartOcrFrom> - <LoadingVobSubImages>Φόρτωση εικόνων VobSub...</LoadingVobSubImages> - <LoadingImageCompareDatabase>Φόρτωση βάσης δεδομένων εικόνων σύγκρισης...</LoadingImageCompareDatabase> - <ConvertingImageCompareDatabase>Μετατροπή βάσης δεδομένων εικόνων σύγκρισης σε νέο τύπο (images.db/images.xml)...</ConvertingImageCompareDatabase> - <SubtitleImage>Εικόνα υπότιτλου</SubtitleImage> - <SubtitleText>Κείμενο υπότιτλου</SubtitleText> - <UnableToCreateCharacterDatabaseFolder>Αδυναμία δημιουργίας φακέλου 'Character Database Folder': {0}</UnableToCreateCharacterDatabaseFolder> - <SubtitleImageXofY>Εικόνα υπότιτλου {0} από {1}</SubtitleImageXofY> - <ImagePalette>Παλέτα εικόνας</ImagePalette> - <UseCustomColors>Χρήση προσαρμοσμένων χρωμάτων</UseCustomColors> - <Transparent>Χωρίς φόντο</Transparent> - <TransparentMinAlpha>Ελάχιστη τιμή άλφα (0=διαφανές, 255=πλήρως ορατό)</TransparentMinAlpha> - <TransportStream>Ροή μεταφοράς</TransportStream> - <TransportStreamGrayscale>Κλίμακα του γκρι</TransportStreamGrayscale> - <TransportStreamGetColor>Χρήση χρώματος (θα συμπεριληφθούν μερικές σπασμένες γραμμές)</TransportStreamGetColor> - <PromptForUnknownWords>Ερώτηση για άγνωστες λέξεις</PromptForUnknownWords> - <TryToGuessUnkownWords>Προσπάθεια μαντέματος άγνωστων λέξεων</TryToGuessUnkownWords> - <AutoBreakSubtitleIfMoreThanTwoLines>Αυτόματος διαχορισμός παραγράφου εάν έχει περισσότερες από δύο γραμμές</AutoBreakSubtitleIfMoreThanTwoLines> - <AllFixes>Όλες οι επιδιορθώσεις</AllFixes> - <GuessesUsed>Μαντεψιές</GuessesUsed> - <UnknownWords>Άγνωστες λέξεις</UnknownWords> - <UnknownWordToGuessInLine>{0} {1} μέσω λίστας διόρθωσης/αντικατάστασης OCR στη γραμμή: {2}</UnknownWordToGuessInLine> - <OcrAutoCorrectionSpellChecking>Αυτόματη διόρθωση/ορθογραφικός έλεγχος OCR</OcrAutoCorrectionSpellChecking> - <FixOcrErrors>Επιδιόρθωση σφαλμάτων OCR</FixOcrErrors> - <ImportTextWithMatchingTimeCodes>Εισαγωγή κειμένου με αντιστοιχία κωδικών χρόνου...</ImportTextWithMatchingTimeCodes> - <ImportNewTimeCodes>Εισαγωγή νέων κωδικών χρόνου</ImportNewTimeCodes> - <SaveSubtitleImageAs>Αποθήκευση εικόνας υπότιτλου ως...</SaveSubtitleImageAs> - <SaveAllSubtitleImagesAsBdnXml>Αποθήκευση όλων των εικόνων (png/bdn xml)...</SaveAllSubtitleImagesAsBdnXml> - <SaveAllSubtitleImagesWithHtml>Αποθήκευση όλων των εικόνων με HTML...</SaveAllSubtitleImagesWithHtml> - <XImagesSavedInY>{0} εικόνες αποθηκεύτηκαν στο {1}</XImagesSavedInY> - <DictionaryX>Λεξικό: {0}</DictionaryX> - <RightToLeft>Δεξιά προς αριστερά</RightToLeft> - <ShowOnlyForcedSubtitles>Εμφάνιση μόνο υποχρεωτικών υποτίτλων</ShowOnlyForcedSubtitles> - <UseTimeCodesFromIdx>Χρήση κωδικών χρόνου από αρχείο .idx</UseTimeCodesFromIdx> - <NoMatch>&lt;Καμία αντιστοιχία&gt;</NoMatch> - <AutoTransparentBackground>Αυτόματη διαφάνεια φόντου</AutoTransparentBackground> - <CaptureTopAlign>Λήψη άνω στοίχισης</CaptureTopAlign> - <InspectCompareMatchesForCurrentImage>Έλεγχος αντιστοιχιών σύγκρισης για την τρέχουσα εικόνα...</InspectCompareMatchesForCurrentImage> - <EditLastAdditions>Επεξεργασία προσθηκών της τελευταίας σύγκρισης εικόνας...</EditLastAdditions> - <SetItalicAngle>Ορισμός κλίσης πλαγιαστών...</SetItalicAngle> - <ItalicAngle>Κλίση πλαγιαστών</ItalicAngle> - <DiscardTitle>Απόρριψη αλλαγών του OCR;</DiscardTitle> - <DiscardText>Απόρριψη αλλαγών του OCR στην τρέχουσα συνεδρία;</DiscardText> - <MinLineSplitHeight>Ελάχιστο ύψος γραμμής (διαχωρισμός)</MinLineSplitHeight> - <FallbackToX>Επαναφορά σε {0}</FallbackToX> - <ImagePreProcessing>Προ-επεξεργασία εικόνας...</ImagePreProcessing> - <EditImageDb>Επεξεργασία βάσης δεδομένων εικόνας</EditImageDb> - <OcrTraining>Εκμάθηση OCR...</OcrTraining> - <SubtitleTrainingFile>Εκμάθηση με αρχείο υπότιτλου</SubtitleTrainingFile> - <LetterCombinations>Συνδυασμοί γράμματος που είναι χωρισμένο ως μία εικόνα</LetterCombinations> - <TrainingOptions>Επιλογές εκμάθησης</TrainingOptions> - <NumberOfSegments>Αριθμός τμημάτων ανά γράμμα</NumberOfSegments> - <AlsoTrainItalic>Εκμάθηση πλαγιαστών</AlsoTrainItalic> - <AlsoTrainBold>Εκμάθηση έντονων</AlsoTrainBold> - <StartTraining>Έναρξη εκμάθησης</StartTraining> - <NowTraining>Εκμάθηση γραμματοσειράς '{1}. Σύνολο χαρακτήρων που μαθεύτηκαν: {0:#,###,##0}, {2:#,###,##0} γνωστά</NowTraining> - </VobSubOcr> - <VobSubOcrCharacter> - <Title>OCR - Εικόνα σε κείμενο χειροκίνητα</Title> - <ShrinkSelection>Σμίκρυνση επιλογής</ShrinkSelection> - <ExpandSelection>Επέκταση επιλογής</ExpandSelection> - <SubtitleImage>Εικόνα υπότιτλου</SubtitleImage> - <Characters>Χαρακτήρας(ες)</Characters> - <CharactersAsText>Χαρακτήρας(ες) ως κείμενο</CharactersAsText> - <Italic>&amp;Πλαγιστά</Italic> - <Abort>&amp;Ματαίωση</Abort> - <Skip>Π&amp;αράβλεψη</Skip> - <Nordic>Σκανδιναβικά</Nordic> - <Spanish>Ισπανικά</Spanish> - <German>Γερμανικά</German> - <AutoSubmitOnFirstChar>Αυτόματη αποστολή στον &amp;πρώτο χαρακτήρα</AutoSubmitOnFirstChar> - <EditLastX>Επεξεργασία τελευταίου: {0}</EditLastX> - </VobSubOcrCharacter> - <VobSubOcrCharacterInspect> - <Title>Έλεγχος αντιστοιχιών σύγκρισης για την τρέχουσα εικόνα</Title> - <InspectItems>Έλεγχος στοιχείων</InspectItems> - <AddBetterMatch>Προσθήκη καλύτερης αντιστοιχίας</AddBetterMatch> - <Add>Προσθήκη</Add> - </VobSubOcrCharacterInspect> - <VobSubOcrNewFolder> - <Title>Νέος φάκελος</Title> - <Message>Όνομα νέου φακέλου βάσης δεδομένων χαρακτήρων</Message> - </VobSubOcrNewFolder> - <VobSubOcrSetItalicAngle> - <Title>Ορισμός κλίσης πλαγιαστών</Title> - <Description>Προσαρμογή τιμής μέχρι το στυλ κειμένου να είναι κανονικό. Το αρχικό κείμενο έχει πλαγιαστό στυλ.</Description> - </VobSubOcrSetItalicAngle> - <OcrPreprocessing> - <Title>Προ-επεξεργασία εικόνας με OCR</Title> - <Colors>Χρώματα</Colors> - <AdjustAlpha>Προσαρμογή τιμής μέχρι το κείμενο να είναι ορατό (εύρος τιμών μεταξύ 200 έως 300)</AdjustAlpha> - <OriginalImage>Αρχική εικόνα</OriginalImage> - <PostImage>Εικόνα μετά την προ-επεξεργασία</PostImage> - <BinaryThreshold>Όριο σύγκρισης δυαδικής εικόνας</BinaryThreshold> - <InvertColors>Αντιστροφή χρωμάτων</InvertColors> - <YellowToWhite>Κίτρινο σε άσπρο</YellowToWhite> - <ColorToWhite>Χρώμα σε άσπρο</ColorToWhite> - <ColorToRemove>Αφαίρεση χρώματος</ColorToRemove> - <Cropping>Κόψιμο</Cropping> - <CropTransparentColors>Κόψιμο διαφανών χρωμάτων</CropTransparentColors> - </OcrPreprocessing> - <Watermark> - <Title>Υδατόσημο</Title> - <WatermarkX>Υδατόσημο: {0}</WatermarkX> - <GenerateWatermarkTitle>Δημιουργία υδατόσημου</GenerateWatermarkTitle> - <SpreadOverEntireSubtitle>Εξάπλωση σε όλον τον υπότιτλο</SpreadOverEntireSubtitle> - <CurrentLineOnlyX>Μόνο σε τρέχουσα γραμμή: {0}</CurrentLineOnlyX> - <Generate>Δημιουργία</Generate> - <Remove>Αφαίρεση</Remove> - <BeforeWatermark>Πριν του υδατόσημου</BeforeWatermark> - <ErrorUnicodeEncodingOnly>Το υδατόσημολειτουργεί μόνο με κωδικοποίηση αρχείου unicode.</ErrorUnicodeEncodingOnly> - </Watermark> - <Waveform> - <ClickToAddWaveform>Κάντε κλικ για προσθήκη κυματομορφής</ClickToAddWaveform> - <ClickToAddWaveformAndSpectrogram>Κάντε κλικ για προσθήκη κυματομορφής/φασματογράμματος</ClickToAddWaveformAndSpectrogram> - <Seconds>δευτ.</Seconds> - <ZoomIn>Μεγέθυνση</ZoomIn> - <ZoomOut>Σμίκρυνση</ZoomOut> - <AddParagraphHere>Προσθήκη κειμένου</AddParagraphHere> - <AddParagraphHereAndPasteText>Προσθήκη κειμένου από το πρόχειρο</AddParagraphHereAndPasteText> - <SetParagraphAsSelection>Καθορισμός ως νέας επιλογής</SetParagraphAsSelection> - <FocusTextBox>Εστίαση πλαισίου κειμένου</FocusTextBox> - <GoToPrevious>Μετάβαση στον προηγούμενο υπότιτλο</GoToPrevious> - <GoToNext>Μετάβαση στον επόμενο υπότιτλο</GoToNext> - <DeleteParagraph>Διαγραφή κειμένου</DeleteParagraph> - <Split>Διαχωρισμός</Split> - <SplitAtCursor>Διαχωρισμός στη θέση του δείκτη</SplitAtCursor> - <MergeWithPrevious>Συγχώνευση με προηγούμενο</MergeWithPrevious> - <MergeWithNext>Συγχώνευση με επόμενο</MergeWithNext> - <ExtendToPrevious>Επέκταση μέχρι το προηγούμενο</ExtendToPrevious> - <ExtendToNext>Επέκταση μέχρι το επόμενο</ExtendToNext> - <PlaySelection>Αναπαραγωγή επιλογής</PlaySelection> - <ShowWaveformAndSpectrogram>Εμφάνιση κυματομορφής και φασματογράμματος</ShowWaveformAndSpectrogram> - <ShowWaveformOnly>Εμφάνιση μόνο κυματομορφής</ShowWaveformOnly> - <ShowSpectrogramOnly>Εμφάνιση μόνο φασματογράμματος</ShowSpectrogramOnly> - <AddSceneChange>Προσθήκη αλλαγής σκηνής</AddSceneChange> - <RemoveSceneChange>Αφαίρεση αλλαγής σκηνής</RemoveSceneChange> - <GuessTimeCodes>Μάντεψε τους κώδικες χρόνου...</GuessTimeCodes> - <SeekSilence>Αναζήτηση σιωπής...</SeekSilence> - <InsertSubtitleHere>Εισαγωγή υπότιτλου εδώ...</InsertSubtitleHere> - <CharsSecX>Χαρ/δευτ: {0:0.00}</CharsSecX> - <WordsMinX>Λέξεις/λεπτό: {0:0.00}</WordsMinX> - </Waveform> - <WaveformGenerateTimeCodes> - <Title>Εικασία κωδικών χρόνου</Title> - <StartFrom>Έναρξη από</StartFrom> - <CurrentVideoPosition>Τρέχουσα θέση βίντεο</CurrentVideoPosition> - <Beginning>Έναρξη</Beginning> - <DeleteLines>Διαγραφή γραμμών</DeleteLines> - <FromCurrentVideoPosition>Από την τρέχουσα θέση βίντεο</FromCurrentVideoPosition> - <DetectOptions>Εντοπισμός επιλογών</DetectOptions> - <ScanBlocksOfMs>Σάρωση των μπλοκ χιλιοστών του δευτερολέπτου</ScanBlocksOfMs> - <BlockAverageVolMin1>Η μέση τιμή των μπλοκ έντασης πρέπει να είναι πάνω από</BlockAverageVolMin1> - <BlockAverageVolMin2>% από τη μέση συνολική ένταση</BlockAverageVolMin2> - <BlockAverageVolMax1>Η μέση τιμή των μπλοκ έντασης πρέπει να είναι κάτω από</BlockAverageVolMax1> - <BlockAverageVolMax2>% από την μέγιστη συνολική ένταση</BlockAverageVolMax2> - <SplitLongLinesAt1>Διαχωρισμός μεγάλων υποτίτλων σε</SplitLongLinesAt1> - <SplitLongLinesAt2>χιλιοστά δευτερολέπτου</SplitLongLinesAt2> - <Other>Άλλο</Other> - </WaveformGenerateTimeCodes> - <WebVttNewVoice> - <Title>WebVTT - καθορισμός νέας φωνής</Title> - <VoiceName>Όνομα φωνής</VoiceName> - </WebVttNewVoice> +<?xml version="1.0" encoding="utf-8"?> +<Language Name="Ελληνικά"> + <General> + <Title>Subtitle Edit</Title> + <Version>3.5.18</Version> + <TranslatedBy>Μετάφραση: Παναγιώτης Μητσάκης</TranslatedBy> + <CultureName>el-GR</CultureName> + <HelpFile /> + <Ok>&amp;Εντάξει</Ok> + <Cancel>&amp;Ακύρωση</Cancel> + <Apply>Εφαρμογή</Apply> + <None>Κανένα</None> + <All>Όλα</All> + <Preview>Προεπισκόπηση</Preview> + <SubtitleFiles>Αρχεία υπότιτλου</SubtitleFiles> + <AllFiles>Όλα τα αρχεία</AllFiles> + <VideoFiles>Αρχεία βίντεο</VideoFiles> + <AudioFiles>Αρχεία ήχου</AudioFiles> + <OpenSubtitle>Άνοιγμα υπότιτλου...</OpenSubtitle> + <OpenVideoFile>Άνοιγμα αρχείου βίντεο...</OpenVideoFile> + <OpenVideoFileTitle>Άνοιγμα αρχείου βίντεο...</OpenVideoFileTitle> + <NoVideoLoaded>Μη φορτωμένο βίντεο</NoVideoLoaded> + <VideoInformation>Πληροφορίες βίντεο</VideoInformation> + <StartTime>Έναρξη</StartTime> + <EndTime>Λήξη</EndTime> + <Duration>Διάρκεια</Duration> + <CharsPerSec>Χαρακτήρες/δευτερόλεπτο</CharsPerSec> + <WordsPerMin>Λέξεις/λεπτό</WordsPerMin> + <Actor>Ηθοποιός</Actor> + <Gap>Κενό</Gap> + <Region>Περιοχή</Region> + <NumberSymbol>#</NumberSymbol> + <Number>Αριθμός</Number> + <Text>Κείμενο</Text> + <HourMinutesSecondsMilliseconds>Ώρες:λεπτά:δευτ.:χιλ.</HourMinutesSecondsMilliseconds> + <HourMinutesSecondsFrames>Ώρες:λεπτά:δευτ:καρέ</HourMinutesSecondsFrames> + <Bold>Έντονα</Bold> + <Italic>Πλαγιαστά</Italic> + <Underline>Υπογραμμισμένα</Underline> + <Visible>Ορατό</Visible> + <FrameRate>Ρυθμός καρέ</FrameRate> + <Name>Όνομα</Name> + <FileNameXAndSize>Όνομα αρχείου: {0} ({1})</FileNameXAndSize> + <ResolutionX>Ανάλυση: {0}</ResolutionX> + <FrameRateX>Ρυθμός καρέ: {0:0.0###}</FrameRateX> + <TotalFramesX>Σύνολο καρέ: {0:#,##0.##}</TotalFramesX> + <VideoEncodingX>Κωδικοποίηση βίντεο: {0}</VideoEncodingX> + <SingleLineLengths>Μήκος ενιαίας γραμμής:</SingleLineLengths> + <TotalLengthX>Συνολικό μήκος: {0}</TotalLengthX> + <TotalLengthXSplitLine>Συνολικό μήκος: {0} (Διαχωρισμός!)</TotalLengthXSplitLine> + <SplitLine>Διαχωρισμός!</SplitLine> + <NotAvailable>Μη διαθέσιμο</NotAvailable> + <OverlapPreviousLineX>Επικάλυψη προηγούμενης ({0:#,##0.###})</OverlapPreviousLineX> + <OverlapX>Επικάλυψη ({0:#,##0.###})</OverlapX> + <OverlapNextX>Επικάλυψη επόμενης ({0:#,##0.###})</OverlapNextX> + <Negative>Αρνητικό</Negative> + <RegularExpressionIsNotValid>Η τυπική έκφραση δεν είναι έγκυρη!</RegularExpressionIsNotValid> + <CurrentSubtitle>Τρέχων υπότιτλος</CurrentSubtitle> + <OriginalText>Αρχικό κείμενο</OriginalText> + <OpenOriginalSubtitleFile>Άνοιγμα αρχικού αρχείου υπότιτλου...</OpenOriginalSubtitleFile> + <PleaseWait>Παρακαλώ περιμένετε...</PleaseWait> + <SessionKey>Κλειδί συνεδρίας</SessionKey> + <UserName>Όνομα χρήστη</UserName> + <UserNameAlreadyInUse>Μη διαθέσιμο όνομα</UserNameAlreadyInUse> + <WebServiceUrl>Διεύθυνση ιστοσελίδας</WebServiceUrl> + <IP>Διεύθυνση IP</IP> + <VideoWindowTitle>Βίντεο - {0}</VideoWindowTitle> + <AudioWindowTitle>Ήχος - {0}</AudioWindowTitle> + <ControlsWindowTitle>Στοιχεία ελέγχου - {0}</ControlsWindowTitle> + <Advanced>Προηγμένες</Advanced> + <Style>Στυλ</Style> + <StyleLanguage>Στυλ/Γλώσσα</StyleLanguage> + <Character>Χαρακτήρας</Character> + <Class>Κατηγορία</Class> + <GeneralText>Γενικά</GeneralText> + <LineNumber>Γραμμή#</LineNumber> + <Before>Προηγούμενη</Before> + <After>Επόμενη</After> + <Size>Μέγεθος</Size> + <Search>Αναζήτηση</Search> + <DeleteCurrentLine>Διαγραφή επιλεγμένης γραμμής</DeleteCurrentLine> + <Width>Πλάτος</Width> + <Height>Ύψος</Height> + <Collapse>Κατάρρευση</Collapse> + <ShortcutX>Συντόμευση: {0}</ShortcutX> + <ExampleX>Παράδειγμα: {0}</ExampleX> + </General> + <About> + <Title>Σχετικά με το Subtitle Edit</Title> + <AboutText1>Το Subtitle Edit είναι ένα δωρεάν λογισμικό +υπό την άδεια δημόσιας χρήσης GNU. +Μπορείτε να το διανείμετε, να το τροποποιείτε +και να το χρησιμοποιείτε ελεύθερα. + +Ο κώδικας C# είναι διαθέσιμος στο https://github.com/SubtitleEdit/subtitleedit + +Επισκεφτείτε το www.nikse.dk για την τελευταία έκδοση. + +Οι προτάσεις σας είναι ευπρόσδεκτες. + +Email: mailto:nikse.dk@gmail.com</AboutText1> + </About> + <AddToNames> + <Title>Προσθήκη στη λίστα ονομάτων</Title> + <Description>Προσθήκη στη λίστα ονομάτων (διάκριση πεζών-κεφαλαίων)</Description> + </AddToNames> + <AddToOcrReplaceList> + <Title>Προσθήκη στη λίστα αντικατάστασης του OCR</Title> + <Description>Προσθήκη ζεύγους στη λίστα αντικατάστασης του OCR (ευαίσθητο στα πεζά)</Description> + </AddToOcrReplaceList> + <AddToUserDictionary> + <Title>Προσθήκη στο λεξικό του χρήστη</Title> + <Description>Προσθήκη λέξης στο λεξικό του χρήστη (όχι ευαίσθητο στα πεζά)</Description> + </AddToUserDictionary> + <AddWaveform> + <Title>Δημιουργία δεδομένων κυματομορφής</Title> + <SourceVideoFile>Πηγαίο αρχείο βίντεο:</SourceVideoFile> + <GenerateWaveformData>Δημιουργία δεδομένων κυματομορφής</GenerateWaveformData> + <PleaseWait>Αυτό μπορεί να πάρει μερικά λεπτά - παρακαλώ περιμένετε</PleaseWait> + <VlcMediaPlayerNotFoundTitle>Δεν βρέθηκε το πρόγραμμα VLC media player</VlcMediaPlayerNotFoundTitle> + <VlcMediaPlayerNotFound>Χρήση του VLC media player 1.1.χ ή νεότερο για την εξαγωγή δεδομένων ήχου.</VlcMediaPlayerNotFound> + <GoToVlcMediaPlayerHomePage>Μετάβαση στην αρχική σελίδα του VLC media player;</GoToVlcMediaPlayerHomePage> + <GeneratingPeakFile>Δημιουργία αρχείου αιχμής...</GeneratingPeakFile> + <GeneratingSpectrogram>Δημιουργία φασματογραφήματος...</GeneratingSpectrogram> + <ExtractingSeconds>Εξαγωγή ήχου: {0:0.0} δευτερόλεπτα</ExtractingSeconds> + <ExtractingMinutes>Εξαγωγή ήχου: {0}.{1:00} λεπτά</ExtractingMinutes> + <WaveFileNotFound>Αδυναμία εύρεσης αρχείου κυματομορφής! +Αυτή η λειτουργεία απαιτεί VLC media player 1.1.x ή νεότερο ({ο}-bit). +Γραμμή εντολών: {1} {2}</WaveFileNotFound> + <WaveFileMalformed>Το {0} δεν εξήγαγε δεδομένα ήχου στο αρχείο κυματομορφής +Γραμμή εντολών: {1} {2} +Σημείωση: Ελέγξτε τον ελεύθερο χώρο δίσκου.</WaveFileMalformed> + <LowDiskSpace>Μικρός χώρος δίσκου!</LowDiskSpace> + <FreeDiskSpace>{0} ελεύθερου χώρου</FreeDiskSpace> + <NoAudioTracksFoundGenerateEmptyWaveform>Αδυναμία εύρεσης κομματιών ήχου! Δημιουργία κενής κυματομορφής;</NoAudioTracksFoundGenerateEmptyWaveform> + </AddWaveform> + <AddWaveformBatch> + <Title>Μαζική δημιουργία δεδομένων κυματομορφής</Title> + <ExtractingAudio>Εξαγωγή ήχου...</ExtractingAudio> + <Calculating>Υπολογισμός...</Calculating> + <Done>Έτοιμο</Done> + <Error>Σφάλμα</Error> + </AddWaveformBatch> + <AdjustDisplayDuration> + <Title>Προσαρμογή διαρκειών</Title> + <AdjustVia>Προσαρμογή μέσω</AdjustVia> + <Seconds>Δευτερολέπτων</Seconds> + <Percent>Ποσοστού</Percent> + <Recalculate>Επαναϋπολογισμός</Recalculate> + <AddSeconds>Προσθήκη δευτ.</AddSeconds> + <SetAsPercent>Ορισμός ως ποσοστό διάρκειας</SetAsPercent> + <Note>Σημείωση: Ο χρόνος εμφάνισης δεν θα επικαλύπτει την ώρα έναρξης του επόμενου κειμένου</Note> + <Fixed>Διορθωμένα</Fixed> + <Milliseconds>Χιλ. δευτερολέπτου</Milliseconds> + <ExtendOnly>Μόνο επέκταση</ExtendOnly> + </AdjustDisplayDuration> + <ApplyDurationLimits> + <Title>Εφαρμογή ορίων διάρκειας</Title> + <FixesAvailable>Διαθέσιμες διορθώσεις: {0}</FixesAvailable> + <UnableToFix>Αδυναμία διόρθωσης: {0}</UnableToFix> + </ApplyDurationLimits> + <AudioToText> + <Title>Ήχος σε κείμενο</Title> + <ExtractingAudioUsingX>Εξαγωγή ήχου χρησιμοποιώντας {0}...</ExtractingAudioUsingX> + <ExtractingTextUsingX>Εξαγωγή κειμένου από ήχο χρησιμοποιώντας {0}...</ExtractingTextUsingX> + <ProgessViaXy>Εξαγωγή κειμένου μέσω {0} πρόοδος: {1}%</ProgessViaXy> + <ShowLess>Λιγότερα ▲</ShowLess> + <ShowMore>Περισσότερα ▼</ShowMore> + </AudioToText> + <AutoBreakUnbreakLines> + <TitleAutoBreak>Αυτόματη ισορροπία γραμμών</TitleAutoBreak> + <TitleUnbreak>Αφαίρεση διασπάσεων από τις γραμμές</TitleUnbreak> + <LinesFoundX>Εύρεση γραμμών: {0}</LinesFoundX> + <OnlyBreakLinesLongerThan>Διάσπαση γραμμών μεγαλύτερες από</OnlyBreakLinesLongerThan> + <OnlyUnbreakLinesLongerThan>Συνένωση γραμμών μεγαλύτερες από</OnlyUnbreakLinesLongerThan> + </AutoBreakUnbreakLines> + <BatchConvert> + <Title>Μαζική μετατροπή</Title> + <Input>Εισαγωγή</Input> + <InputDescription>Εισαγωγή αρχείων (περιήγηση ή σύρσιμο)</InputDescription> + <Status>Κατάσταση</Status> + <Output>Εξαγωγή</Output> + <SaveInSourceFolder>Αποθήκευση στον αρχικό φάκελο</SaveInSourceFolder> + <SaveInOutputFolder>Αποθήκευση στον φάκελο εξαγωγής</SaveInOutputFolder> + <OverwriteFiles>Αντικατάσταση αρχείων</OverwriteFiles> + <Style>Στυλ...</Style> + <UseStyleFromSource>Χρήση αρχικού στυλ</UseStyleFromSource> + <ConvertOptions>Επιλογές μετατροπής</ConvertOptions> + <RemoveFormatting>Αφαίρεση ετικετών μορφοποίησης</RemoveFormatting> + <RemoveStyleActor>Αφαίρεση στυλ/ηθοποιού</RemoveStyleActor> + <RemoveTextForHI>Αφαίρεση κειμένου για κωφούς</RemoveTextForHI> + <OverwriteOriginalFiles>Αντικατάσταση αρχικών αρχείων (νέα επέκταση, για αλλαγμένη μορφή)</OverwriteOriginalFiles> + <RedoCasing>Επανάληψη αρχικού γράμματος</RedoCasing> + <Convert>Μετατροπή</Convert> + <NothingToConvert>Τίποτα για μετατροπή!</NothingToConvert> + <PleaseChooseOutputFolder>Παρακαλώ, επιλέξτε τον φάκελο εξαγωγής</PleaseChooseOutputFolder> + <NotConverted>Αποτυχία</NotConverted> + <Converted>Μετατράπηκαν</Converted> + <Settings>Ρυθμίσεις</Settings> + <FixRtl>Διόρθωση RTL</FixRtl> + <FixRtlAddUnicode>Διόρθωση RTL μέσω ετικετών Unicode</FixRtlAddUnicode> + <FixRtlRemoveUnicode>Αφαίρεση ετικετών Unicode RTL</FixRtlRemoveUnicode> + <FixRtlReverseStartEnd>Αντιστροφή αρχής/τέλους RTL</FixRtlReverseStartEnd> + <SplitLongLines>Διαχωρισμός μεγάλων γραμμών</SplitLongLines> + <AutoBalance>Αυτόματη ισορροπία γραμμών</AutoBalance> + <ScanFolder>Σάρωση φακέλου...</ScanFolder> + <Recursive>Συμπερίληψη υποφακέλων</Recursive> + <BridgeGaps>Ένωση κενών</BridgeGaps> + <PlainText>Καθαρό κείμενο</PlainText> + <Ocr>OCR...</Ocr> + <Filter>Φίλτρο</Filter> + <FilterSkipped>Παραλείφτηκαν μέσω φίλτρου</FilterSkipped> + <FilterSrtNoUtf8BOM>Αρχεία SubRip (.srt) χωρίς UTF-8 BOM</FilterSrtNoUtf8BOM> + <FilterMoreThanTwoLines>Περισσότερες από δύο γραμμές</FilterMoreThanTwoLines> + <FilterContains>Το κείμενο περιέχει...</FilterContains> + <FilterFileNameContains>Το όνομα αρχείου περιέχει...</FilterFileNameContains> + <MkvLanguageCodeContains>Ο κωδικός γλώσσας Matroska (.mkv) περιέχει...</MkvLanguageCodeContains> + <FixCommonErrorsErrorX>Επιδιόρθωση σφαλμάτων: {0}</FixCommonErrorsErrorX> + <MultipleReplaceErrorX>Πολλαπλή αντικατάσταση: {0}</MultipleReplaceErrorX> + <AutoBalanceErrorX>Αυτόματη ισορρόπηση: {0}</AutoBalanceErrorX> + <OffsetTimeCodes>Αντιστάθμιση κωδικών χρόνου</OffsetTimeCodes> + <TransportStreamSettings>Μεταφορά ρυθμίσεων ροής</TransportStreamSettings> + <TransportStreamOverrideXPosition>Παράκαμψη αρχικής θέσης Χ</TransportStreamOverrideXPosition> + <TransportStreamOverrideYPosition>Παράκαμψη αρχικής θέσης Υ</TransportStreamOverrideYPosition> + <TransportStreamOverrideVideoSize>Παράκαμψη αρχικού μεγέθους βίντεο</TransportStreamOverrideVideoSize> + <TransportStreamFileNameEnding>Κατάληξη ονόματος αρχείου</TransportStreamFileNameEnding> + <TransportStreamSettingsButton>Ρυθμίσεις TS...</TransportStreamSettingsButton> + <RemoveLineBreaks>Αφαίρεση διάσπασης γραμμών</RemoveLineBreaks> + <DeleteLines>Διαγραφή γραμμών</DeleteLines> + <TryToUseSourceEncoding>Προσπάθεια χρήσης αρχικής κωδικοποίησης</TryToUseSourceEncoding> + <DeleteFirstLines>Διαγραφή πρώτων γραμμών</DeleteFirstLines> + <DeleteLastLines>Διαγραφή τελευταίων γραμμών</DeleteLastLines> + <DeleteContaining>Διαγραφή γραμμών που περιέχουν</DeleteContaining> + <MkvLanguageInOutputFileName>"Γλώσσα" στην εξαγωγή ονόματος αρχείου</MkvLanguageInOutputFileName> + <MkvLanguageInOutputFileNameX>Matroska (.mkv) "Γλώσσα" στην εξαγωγή ονόματος αρχείου: {0}</MkvLanguageInOutputFileNameX> + <MkvLanguageStyleTwoLetter>Κώδικες γλωσσών δύο γραμμάτων</MkvLanguageStyleTwoLetter> + <MkvLanguageStyleThreeLetter>Κώδικες γλωσσών τριών γραμμάτων</MkvLanguageStyleThreeLetter> + <MkvLanguageStyleEmpty>Χωρίς κώδικα γλώσσας</MkvLanguageStyleEmpty> + </BatchConvert> + <Beamer> + <Title>Βιντεοπροβολέας</Title> + </Beamer> + <Bookmarks> + <EditBookmark>Επεξεργασία σημείωσης</EditBookmark> + <AddBookmark>Προσθήκη σημείωσης</AddBookmark> + <GoToBookmark>Μετάβαση σε σημείωση</GoToBookmark> + </Bookmarks> + <ChangeCasing> + <Title>Αλλαγή πεζών-κεφαλαίων</Title> + <ChangeCasingTo>Αλλαγή πεζών-κεφαλαίων σε</ChangeCasingTo> + <NormalCasing>Κανονική. Οι προτάσεις ξεκινούν με κεφαλαίο γράμμα.</NormalCasing> + <FixNamesCasing>Διόρθωση ονομάτων (μέσω Dictionaries\NamesEtc.xml)</FixNamesCasing> + <FixOnlyNamesCasing>Διόρθωση μόνο ονομάτων (μέσω Dictionaries\NamesEtc.xml)</FixOnlyNamesCasing> + <OnlyChangeAllUppercaseLines>Αλλαγή μόνο των γραμμών με κεφαλαία.</OnlyChangeAllUppercaseLines> + <AllUppercase>Όλα κεφαλαία</AllUppercase> + <AllLowercase>Όλα πεζά</AllLowercase> + </ChangeCasing> + <ChangeCasingNames> + <Title>Αλλαγή πεζών-κεφαλαίων - Ονόματα</Title> + <NamesFoundInSubtitleX>Εύρεση ονομάτων στον υπότιτλο: {0}</NamesFoundInSubtitleX> + <Enabled>Ενεργοποιημένο</Enabled> + <Name>Όνομα</Name> + <LinesFoundX>Εύρεση γραμμών: {0}</LinesFoundX> + </ChangeCasingNames> + <ChangeFrameRate> + <Title>Αλλαγή ρυθμού καρέ</Title> + <ConvertFrameRateOfSubtitle>Μετατροπή ρυθμού καρέ του υπότιτλου</ConvertFrameRateOfSubtitle> + <FromFrameRate>Από ρυθμό καρέ</FromFrameRate> + <ToFrameRate>Σε ρυθμό καρέ</ToFrameRate> + <FrameRateNotCorrect>Λανθασμένος ρυθμός καρέ</FrameRateNotCorrect> + <FrameRateNotChanged>Ο Ρυθμός καρέ είναι ίδιος - τίποτα για μετατροπή</FrameRateNotChanged> + </ChangeFrameRate> + <ChangeSpeedInPercent> + <Title>Ρύθμιση ταχύτητας σε ποσοστό</Title> + <TitleShort>Ρύθμιση ταχύτητας</TitleShort> + <Info>Αλλαγή ταχύτητας των υποτίτλων σε ποσοστό</Info> + <Custom>Προσαρμοσμένη</Custom> + <ToDropFrame>Ρήξη καρέ</ToDropFrame> + <FromDropFrame>Από ρήξη καρέ</FromDropFrame> + </ChangeSpeedInPercent> + <CheckForUpdates> + <Title>Έλεγχος ενημερώσεων</Title> + <CheckingForUpdates>Έλεγχος για ενημερώσεις...</CheckingForUpdates> + <CheckingForUpdatesFailedX>Αποτυχία ελέγχου ενημέρωσης: {0}</CheckingForUpdatesFailedX> + <CheckingForUpdatesNoneAvailable>Χρήση της τελευταία έκδοσης του Subtitle Edit</CheckingForUpdatesNoneAvailable> + <CheckingForUpdatesNewVersion>Νέα διαθέσιμη έκδοση!</CheckingForUpdatesNewVersion> + <InstallUpdate>Μετάβαση στην ιστοσελίδα λήψης</InstallUpdate> + <NoUpdates>Ακύρωση ενημέρωσης</NoUpdates> + </CheckForUpdates> + <ChooseAudioTrack> + <Title>Επιλογή κομματιού ήχου</Title> + </ChooseAudioTrack> + <ChooseEncoding> + <Title>Επιλογή κωδικοποίησης</Title> + <CodePage>Σελίδα κώδικα</CodePage> + <DisplayName>Εμφάνιση ονόματος</DisplayName> + <PleaseSelectAnEncoding>Παρακαλώ, επιλέξτε μια κωδικοποίηση</PleaseSelectAnEncoding> + </ChooseEncoding> + <ChooseLanguage> + <Title>Επιλογή γλώσσας</Title> + <Language>Γλώσσα</Language> + </ChooseLanguage> + <ColorChooser> + <Title>Επιλογή χρώματος</Title> + <Red>Κόκκινο</Red> + <Green>Πράσινο</Green> + <Blue>Μπλε</Blue> + <Alpha>Άλφα</Alpha> + </ColorChooser> + <ColumnPaste> + <Title>Επικόλληση στηλών</Title> + <ChooseColumn>Επιλογή στηλών</ChooseColumn> + <OverwriteShiftCellsDown>Αντικατάσταση/Μετατόπιση κελιών κάτω</OverwriteShiftCellsDown> + <Overwrite>Αντικατάσταση</Overwrite> + <ShiftCellsDown>Μετατόπιση κελιών κάτω</ShiftCellsDown> + <TimeCodesOnly>Μόνο την κωδικοποίηση χρόνων</TimeCodesOnly> + <TextOnly>Μόνο το κείμενο</TextOnly> + <OriginalTextOnly>Μόνο το αρχικό κείμενο</OriginalTextOnly> + </ColumnPaste> + <CompareSubtitles> + <Title>Σύγκριση υπότιτλων</Title> + <PreviousDifference>&amp;Προηγούμενη διαφορά</PreviousDifference> + <NextDifference>&amp;Επόμενη διαφορά</NextDifference> + <SubtitlesNotAlike>Οι υπότιτλοι δεν έχουν ομοιότητες</SubtitlesNotAlike> + <XNumberOfDifference>Σύνολο διαφορών: {0}</XNumberOfDifference> + <XNumberOfDifferenceAndPercentChanged>Αριθμός διαφορών: {0} ({1:0.##}% αλλαγή των λέξεων)</XNumberOfDifferenceAndPercentChanged> + <XNumberOfDifferenceAndPercentLettersChanged>Αριθμός διαφορών: {0} ({1:0.##}% αλλαγή των γραμμάτων)</XNumberOfDifferenceAndPercentLettersChanged> + <ShowOnlyDifferences>Εμφάνιση μόνο διαφορών</ShowOnlyDifferences> + <IgnoreLineBreaks>Αγνόηση διάσπασης γραμμών</IgnoreLineBreaks> + <IgnoreFormatting>Αγνόηση μορφοποίησης</IgnoreFormatting> + <OnlyLookForDifferencesInText>Αναζήτηση μόνο διαφορών στο κείμενο</OnlyLookForDifferencesInText> + <CannotCompareWithImageBasedSubtitles>Δεν γίνεται σύγκριση με υπότιτλους από εικόνα</CannotCompareWithImageBasedSubtitles> + </CompareSubtitles> + <DCinemaProperties> + <Title>Ιδιότητες D-Cinema (interop)</Title> + <TitleSmpte>Ιδιότητες D-Cinema (SMPTE)</TitleSmpte> + <SubtitleId>Ταυτότητα υποτίτλου</SubtitleId> + <GenerateId>Δημιουργία ταυτότητας</GenerateId> + <MovieTitle>Τίτλος ταινίας</MovieTitle> + <ReelNumber>Αριθμός μπομπίνας</ReelNumber> + <Language>Γλώσσα</Language> + <IssueDate>Ημερομηνία έκδοσης</IssueDate> + <EditRate>Επεξεργασία ρυθμού</EditRate> + <TimeCodeRate>Ρυθμός κώδικα χρόνου</TimeCodeRate> + <StartTime>Έναρξη</StartTime> + <Font>Γραμματοσειρά</Font> + <FontId>Ταυτότητα</FontId> + <FontUri>URI</FontUri> + <FontColor>Χρώμα</FontColor> + <FontEffect>Εφέ</FontEffect> + <FontEffectColor>Χρώμα εφέ</FontEffectColor> + <FontSize>Μέγεθος</FontSize> + <TopBottomMargin>Περιθώριο πάνω/κάτω</TopBottomMargin> + <FadeUpTime>Χρόνος εμφάνισης εφέ</FadeUpTime> + <FadeDownTime>Χρόνος εξαφάνισης εφέ</FadeDownTime> + <ZPosition>Κάθετη θέση</ZPosition> + <ZPositionHelp>Θετικοί αριθμοί μετακινούν το κείμενο μακριά, αρνητικοί αριθμοί μετακινούν το κείμενο κοντά. +Εάν η κάθετη θέση είναι μηδέν, τότε είναι 2D.</ZPositionHelp> + <ChooseColor>Επιλογή χρώματος...</ChooseColor> + <Generate>Δημιουργία</Generate> + </DCinemaProperties> + <DurationsBridgeGaps> + <Title>Ένωση μικρών κενών μεταξύ γραμμών</Title> + <GapsBridgedX>Αριθμός ενωμένων μικρών κενών: {0}</GapsBridgedX> + <GapToNext>Κενό ως το επόμενο σε δευτερόλεπτα</GapToNext> + <GapToNextFrames>Κενό ως το επόμενο σε καρέ</GapToNextFrames> + <BridgeGapsSmallerThanXPart1>Ένωση κενών μικρότερων από</BridgeGapsSmallerThanXPart1> + <BridgeGapsSmallerThanXPart2>χιλιοστά δευτερολέπτου</BridgeGapsSmallerThanXPart2> + <BridgeGapsSmallerThanXPart1Frames>Ένωση κενών μικρότερων από</BridgeGapsSmallerThanXPart1Frames> + <BridgeGapsSmallerThanXPart2Frames>καρέ</BridgeGapsSmallerThanXPart2Frames> + <MinMillisecondsBetweenLines>Ελάχιστα χιλ. δευτερολέπτου μεταξύ των γραμμών</MinMillisecondsBetweenLines> + <MinFramesBetweenLines>Ελάχιστα καρέ μεταξύ γραμμών</MinFramesBetweenLines> + <ProlongEndTime>Το προηγούμενο κείμενο παίρνει όλα τα κενά χρόνου</ProlongEndTime> + <DivideEven>Το κείμενο χωρίζει τα κενά χρόνου</DivideEven> + </DurationsBridgeGaps> + <DvdSubRip> + <Title>Αντιγραφή υποτίτλων από IFO/VOB (DVD)</Title> + <DvdGroupTitle>Αρχεία/Πληροφορίες DVD</DvdGroupTitle> + <IfoFile>Αρχείο IFO</IfoFile> + <IfoFiles>Αρχεία IFO</IfoFiles> + <VobFiles>Αρχεία VOB</VobFiles> + <Add>Προσθήκη</Add> + <Remove>Αφαίρεση</Remove> + <Clear>Καθαρισμός</Clear> + <MoveUp>Μετακίνηση επάνω</MoveUp> + <MoveDown>Μετακίνηση κάτω</MoveDown> + <Languages>Γλώσσες</Languages> + <PalNtsc>PAL/NTSC</PalNtsc> + <Pal>PAL (25 fps)</Pal> + <Ntsc>NTSC (29.9 fps)</Ntsc> + <StartRipping>Εκκίνηση αντιγραφής</StartRipping> + <Abort>Ματαίωση</Abort> + <AbortedByUser>Ματαιώθηκε από τον χρήστη</AbortedByUser> + <ReadingSubtitleData>Ανάγνωση δεδομένων υποτίτλου...</ReadingSubtitleData> + <RippingVobFileXofYZ>Αντιγραφή αρχείων vob {1} από {2}: {0}</RippingVobFileXofYZ> + <WrongIfoType>Ο τύπος IFO είναι '{0}' και όχι 'DVDVIDEO-VTS'.{1}Προσπαθείστε με ένα άλλο αρχείο εκτός του {2}</WrongIfoType> + </DvdSubRip> + <DvdSubRipChooseLanguage> + <Title>Επιλογή γλώσσας</Title> + <ChooseLanguageStreamId>Επιλογή γλώσσας (id-ροής)</ChooseLanguageStreamId> + <UnknownLanguage>Άγνωστη γλώσσα</UnknownLanguage> + <SubtitleImageXofYAndWidthXHeight>Εικόνα υπότιτλου {0}/{1} - {2}x{3}</SubtitleImageXofYAndWidthXHeight> + <SubtitleImage>Εικόνα υπότιτλου</SubtitleImage> + </DvdSubRipChooseLanguage> + <EbuSaveOptions> + <Title>Επιλογές αποθήκευσης τύπου EBU</Title> + <GeneralSubtitleInformation>Γενικές πληροφορίες υπότιτλου</GeneralSubtitleInformation> + <CodePageNumber>Αριθμός σελίδας κώδικα</CodePageNumber> + <DiskFormatCode>Κωδικός μορφής δίσκου</DiskFormatCode> + <DisplayStandardCode>Προβολή τυπικού κώδικα</DisplayStandardCode> + <ColorRequiresTeletext>Τα χρώματα απαιτούν τηλεκείμενο!</ColorRequiresTeletext> + <AlignmentRequiresTeletext>Η στοίχιση απαιτεί τηλεκείμενο!</AlignmentRequiresTeletext> + <TeletextCharsShouldBe38>Οι μέγιστοι χαρακτήρες τηλεκειμένου ανά σειρά θα πρέπει να είναι 38!</TeletextCharsShouldBe38> + <CharacterCodeTable>Πίνακας χαρακτήρων</CharacterCodeTable> + <LanguageCode>Κωδικός γλώσσας</LanguageCode> + <OriginalProgramTitle>Πρωτότυπος τίτλος προγράμματος</OriginalProgramTitle> + <OriginalEpisodeTitle>Πρωτότυπος τίτλος επεισόδιου</OriginalEpisodeTitle> + <TranslatedProgramTitle>Μεταφρασμένος τίτλος προγράμματος</TranslatedProgramTitle> + <TranslatedEpisodeTitle>Μεταφρασμένος τίτλος επεισοδίου</TranslatedEpisodeTitle> + <TranslatorsName>Όνομα του μεταφραστή</TranslatorsName> + <SubtitleListReferenceCode>Κωδικός αναφοράς της λίστας υπότιτλων</SubtitleListReferenceCode> + <CountryOfOrigin>Χώρα καταγωγής</CountryOfOrigin> + <TimeCodeStatus>Κατάσταση χρόνου κώδικα</TimeCodeStatus> + <TimeCodeStartOfProgramme>Χρόνος κώδικα: Έναρξη προγράμματος</TimeCodeStartOfProgramme> + <RevisionNumber>Αριθμός αναθεώρησης</RevisionNumber> + <MaxNoOfDisplayableChars>Μέγιστος αριθμός χαρακτήρων ανά σειρά</MaxNoOfDisplayableChars> + <MaxNumberOfDisplayableRows>Μέγιστος αριθμός γραμμών</MaxNumberOfDisplayableRows> + <DiskSequenceNumber>Αύξων αριθμός δίσκου</DiskSequenceNumber> + <TotalNumberOfDisks>Συνολικός αριθμός δίσκων</TotalNumberOfDisks> + <Import>Εισαγωγή...</Import> + <TextAndTimingInformation>Πληροφορίες κειμένου και χρονισμού</TextAndTimingInformation> + <JustificationCode>Κωδικός αιτιολόγησης</JustificationCode> + <VerticalPosition>Κάθετη θέση</VerticalPosition> + <MarginTop>Άνω περιθώριο (για άνω στοιχισμένους υπότιτλους)</MarginTop> + <MarginBottom>Κάτω περιθώριο (για κάτω στοιχισμένους υπότιτλους)</MarginBottom> + <NewLineRows>Αριθμός προσθήκης σειρών μετά από νέα σειρά</NewLineRows> + <Teletext>Τηλεκείμενο</Teletext> + <UseBox>Χρήση πλαισίου για το κείμενο</UseBox> + <DoubleHeight>Χρήση διπλού ύψους για το κείμενο</DoubleHeight> + <Errors>Λάθη</Errors> + <ErrorsX>Λάθη: {0}</ErrorsX> + <MaxLengthError>Η Γραμμή {0} υπερβαίνει το μέγιστο μήκος ({1}) κατά {2}: {3}</MaxLengthError> + <TextUnchangedPresentation>Αμετάβλητη παρουσίαση</TextUnchangedPresentation> + <TextLeftJustifiedText>Αριστερά στοιχισμένο κείμενο</TextLeftJustifiedText> + <TextCenteredText>Κεντραρισμένο κείμενο</TextCenteredText> + <TextRightJustifiedText>Δεξιά στοιχισμένο κείμενο</TextRightJustifiedText> + <UseBoxForOneNewLine>Επιλογή 'Χρήση πλαισίου κειμένου' μόνο για μία νέα γραμμή</UseBoxForOneNewLine> + </EbuSaveOptions> + <EffectKaraoke> + <Title>Εφέ καραόκε</Title> + <ChooseColor>Επιλογή χρώματος:</ChooseColor> + <TotalMilliseconds>Συνολικά χιλ. δευτερολέπτου:</TotalMilliseconds> + <EndDelayInMilliseconds>Καθυστέρηση λήξης σε χιλ. δευτερολέπτου:</EndDelayInMilliseconds> + </EffectKaraoke> + <EffectTypewriter> + <Title>Εφέ γραφομηχανής</Title> + <TotalMilliseconds>Συνολικά χιλ. δευτερολέπτου:</TotalMilliseconds> + <EndDelayInMilliseconds>Καθυστέρηση λήξης σε χιλ. δευτερολέπτου:</EndDelayInMilliseconds> + </EffectTypewriter> + <ExportCustomText> + <Title>Εξαγωγή προσαρμοσμένης μορφής κειμένου</Title> + <Formats>Μορφές</Formats> + <New>Νέο</New> + <Edit>Επεξεργασία</Edit> + <Delete>Διαγραφή</Delete> + <SaveAs>Α&amp;ποθήκευση ως...</SaveAs> + <SaveSubtitleAs>Αποθήκευση υπότιτλου ως...</SaveSubtitleAs> + <SubtitleExportedInCustomFormatToX>Οι υπότιτλοι εξάγωνται σε προσαρμοσμένη μορφή στο: {0}</SubtitleExportedInCustomFormatToX> + </ExportCustomText> + <ExportCustomTextFormat> + <Title>Πρότυπο προσαρμοσμένης μορφής κειμένου</Title> + <Template>Πρότυπο</Template> + <Header>Επικεφαλίδα</Header> + <TextLine>Γραμμή κειμένου (παράγραφος)</TextLine> + <TimeCode>Κωδικός χρόνου</TimeCode> + <NewLine>Νέα γραμμή</NewLine> + <Footer>Υποσέλιδο</Footer> + <DoNotModify>[Χωρίς επεξεργασία]</DoNotModify> + </ExportCustomTextFormat> + <ExportFcpXmlAdvanced> + <Title>Εξαγωγή Final Cut Pro XML advanced</Title> + <FontName>Όνομα γραμματοσειράς</FontName> + <FontSize>Μέγεθος γραμματοσειράς</FontSize> + <FontFace>Όψη γραμματοσειράς</FontFace> + <FontFaceRegular>Κλασική</FontFaceRegular> + <Alignment>Ευθυγράμμιση</Alignment> + <Baseline>Κανονική</Baseline> + </ExportFcpXmlAdvanced> + <ExportPngXml> + <Title>Εξαγωγή XML/PNG</Title> + <ImageSettings>Ρυθμίσεις εικόνας</ImageSettings> + <FontFamily>Οικογένεια γραμματοσειράς</FontFamily> + <FontSize>Μέγεθος γραμματοσειράς</FontSize> + <FontColor>Χρώμα γραμματοσειράς</FontColor> + <BorderColor>Χρώμα περιγράμματος</BorderColor> + <BorderWidth>Πλάτος περιγράμματος</BorderWidth> + <BorderStyle>Στυλ περιγράμματος</BorderStyle> + <BorderStyleOneBox>Ένα πλαίσιο</BorderStyleOneBox> + <BorderStyleBoxForEachLine>Πλαίσιο για κάθε γραμμή</BorderStyleBoxForEachLine> + <BorderStyleNormalWidthX>Κανονικό, πάχος={0}</BorderStyleNormalWidthX> + <ShadowColor>Χρώμα σκιάς</ShadowColor> + <ShadowWidth>Πάχος σκιάς</ShadowWidth> + <Transparency>Αρχική</Transparency> + <ImageFormat>Μορφή εικόνας</ImageFormat> + <FullFrameImage>Εικόνα πλήρης απεικόνισης</FullFrameImage> + <SimpleRendering>Απλή απεικόνιση</SimpleRendering> + <AntiAliasingWithTransparency>Διαφανής εξομάλυνση</AntiAliasingWithTransparency> + <Text3D>3D</Text3D> + <SideBySide3D>Κέντρο - Δεξιά - Αριστερά</SideBySide3D> + <HalfTopBottom3D>Κέντρο - Πάνω/Κάτω</HalfTopBottom3D> + <Depth>Βάθος</Depth> + <ExportAllLines>Εξαγωγή όλων των γραμμών...</ExportAllLines> + <XImagesSavedInY>{0} εικόνες αποθηκεύτηκαν στον φάκελο {1}</XImagesSavedInY> + <VideoResolution>Ανάλυση βίντεο</VideoResolution> + <Align>Στοίχιση</Align> + <Left>Αριστερά</Left> + <Right>Δεξιά</Right> + <Center>Κέντρο</Center> + <CenterLeftJustify>Κέντρο, στοίχιση αριστερά</CenterLeftJustify> + <CenterLeftJustifyDialogs>Κέντρο, αριστερή στοίχιση διαλόγου</CenterLeftJustifyDialogs> + <CenterTopJustify>Κέντρο, άνω στοίχιση</CenterTopJustify> + <CenterRightJustify>Κέντρο, δεξιά στοίχιση</CenterRightJustify> + <BottomMargin>Κάτω περιθώριο</BottomMargin> + <LeftRightMargin>Αριστερό/δεξί περιθώριο</LeftRightMargin> + <SaveBluRraySupAs>Επιλογή ονόματος αρχείου Blu-ray sup</SaveBluRraySupAs> + <SaveVobSubAs>Επιλογή ονόματος αρχείου VobSub</SaveVobSubAs> + <SaveFabImageScriptAs>Επιλογή ονόματος αρχείου Blu-ray sup</SaveFabImageScriptAs> + <SaveDvdStudioProStlAs>Επιλογή ονόματος αρχείου DVD Studio Pro STL</SaveDvdStudioProStlAs> + <SaveDigitalCinemaInteropAs>Επιλογή ονόματος αρχείου Digital Cinema Interop</SaveDigitalCinemaInteropAs> + <SaveDigitalCinemaSmpte2014>Επιλογή ονόματος αρχείου Digital SMPTE 2014</SaveDigitalCinemaSmpte2014> + <SavePremiereEdlAs>Επιλογή ονόματος αρχείου Premiere EDL</SavePremiereEdlAs> + <SaveFcpAs>Επιλογή ονόματος αρχείου Final Cut Pro xml</SaveFcpAs> + <SaveDostAs>Επιλογή ονόματος αρχείου DoStudio dost</SaveDostAs> + <SomeLinesWereTooLongX>Μερικές πολύ μεγάλες γραμμές:{0}</SomeLinesWereTooLongX> + <LineHeight>Ύψος γραμμής</LineHeight> + <BoxSingleLine>Πλαίσιο - ενιαία γραμμή</BoxSingleLine> + <BoxMultiLine>Πλαίσιο - πολλαπλή γραμμή</BoxMultiLine> + <Forced>Επιβολή</Forced> + <ChooseBackgroundColor>Επιλογή χρώματος φόντου</ChooseBackgroundColor> + <SaveImageAs>Αποθήκευση εικόνας ως...</SaveImageAs> + <FcpUseFullPathUrl>Χρήση πλήρης διεύθυνσης url εικόνας για FCP xml</FcpUseFullPathUrl> + </ExportPngXml> + <ExportText> + <Title>Εξαγωγή κειμένου</Title> + <Preview>Προεπισκόπηση</Preview> + <ExportOptions>Εξαγωγή επιλογών</ExportOptions> + <FormatText>Μορφοποίηση κειμένου</FormatText> + <None>Κανένα</None> + <MergeAllLines>Συγχώνευση όλων των γραμμών</MergeAllLines> + <UnbreakLines>Συνένωση γραμμών</UnbreakLines> + <RemoveStyling>Αφαίρεση ύφους</RemoveStyling> + <ShowLineNumbers>Προβολή αριθμών γραμμής</ShowLineNumbers> + <AddNewLineAfterLineNumber>Προσθήκη νέας γραμμής μετά από τον αριθμό γραμμής</AddNewLineAfterLineNumber> + <ShowTimeCode>Εμφάνιση κωδικοποίησης χρόνου</ShowTimeCode> + <AddNewLineAfterTimeCode>Προσθήκη νέας γραμμής μετά την κωδικοποίηση χρόνου</AddNewLineAfterTimeCode> + <AddNewLineAfterTexts>Προσθήκη νέας γραμμής μετά το κείμενο</AddNewLineAfterTexts> + <AddNewLineBetweenSubtitles>Προσθήκη νέας γραμμής μεταξύ των υποτίτλων</AddNewLineBetweenSubtitles> + <TimeCodeFormat>Μορφή κώδικοποίησης χρόνου</TimeCodeFormat> + <Srt>.srt</Srt> + <Milliseconds>Χιλιοστά δευτερολέπτου</Milliseconds> + <HHMMSSFF>ΩΩ:ΛΛ:ΔΔ:ΚΚ</HHMMSSFF> + <TimeCodeSeparator>Διαχωρισμός κωδικοποίησης χρόνου</TimeCodeSeparator> + </ExportText> + <ExtractDateTimeInfo> + <Title>Δημιουργία χρόνου ως κείμενο</Title> + <OpenVideoFile>Επιλογή αρχείου βίντεο από όπου θα εξαχθούν οι πληροφορίες ημέρας/χρόνου</OpenVideoFile> + <StartFrom>Έναρξη από</StartFrom> + <DateTimeFormat>Μορφή ημέρας/χρόνου</DateTimeFormat> + <Example>Παράδειγμα</Example> + <GenerateSubtitle>&amp;Δημιουργία υποτίτλων</GenerateSubtitle> + </ExtractDateTimeInfo> + <FindDialog> + <Title>Εύρεση</Title> + <Find>Εύρεση</Find> + <Normal>&amp;Κανονική</Normal> + <CaseSensitive>&amp;Διάκριση πεζών-κεφαλαίων</CaseSensitive> + <RegularExpression>Τυπική έκφραση</RegularExpression> + <WholeWord>Ολόκληρη τη λέξη</WholeWord> + <Count>Μέτρηση</Count> + <XNumberOfMatches>{0:#,##0} αντιστοιχίες</XNumberOfMatches> + <OneMatch>Μία αντιστοιχία</OneMatch> + </FindDialog> + <FindSubtitleLine> + <Title>Εύρεση γραμμής υπότιτλου</Title> + <Find>&amp;Εύρεση</Find> + <FindNext>Εύρεση ε&amp;πόμενου</FindNext> + </FindSubtitleLine> + <FixCommonErrors> + <Title>Επιδιόρθωση σφαλμάτων</Title> + <Step1>Βήμα 1/2 - Επιλογή σφαλμάτων</Step1> + <WhatToFix>Προς διόρθωση</WhatToFix> + <Example>Παράδειγμα</Example> + <SelectAll>Όλα</SelectAll> + <InverseSelection>Αντιστροφή</InverseSelection> + <Back>&lt; &amp;Πίσω</Back> + <Next>&amp;Επόμενο &gt;</Next> + <Step2>Βήμα 2/2 - Επαλήθευση διορθώσεων</Step2> + <Fixes>Επιδιορθώσεις</Fixes> + <Log>Αρχείο καταγραφής</Log> + <Function>Συνάρτηση</Function> + <RemovedEmptyLine>Αφαίρεση κενής γραμμής</RemovedEmptyLine> + <RemovedEmptyLineAtTop>Αφαίρεση κενής γραμμής στην κορυφή</RemovedEmptyLineAtTop> + <RemovedEmptyLineAtBottom>Αφαίρεση κενής γραμμής στο τέλος</RemovedEmptyLineAtBottom> + <RemovedEmptyLineInMiddle>Αφαίρεση κενής γραμμής στο κέντρο</RemovedEmptyLineInMiddle> + <RemovedEmptyLinesUnsedLineBreaks>Αφαίρεση κενών γραμμών/άχρηστες αλλαγές γραμμής</RemovedEmptyLinesUnsedLineBreaks> + <EmptyLinesRemovedX>Αφαιρεμένες κενές γραμμές: {0}</EmptyLinesRemovedX> + <FixOverlappingDisplayTimes>Επιδιόρθωση επικαλυπτόμενων χρόνων εμφάνισης</FixOverlappingDisplayTimes> + <FixShortDisplayTimes>Επιδιόρθωση σύντομων χρόνων εμφάνισης</FixShortDisplayTimes> + <FixLongDisplayTimes>Επιδιόρθωση μεγάλων χρόνων εμφάνισης</FixLongDisplayTimes> + <FixShortGaps>Επιδιόρθωση μικρών κενών</FixShortGaps> + <FixInvalidItalicTags>Επιδιόρθωση λανθασμένων ετικετών πλαγιαστής γραφής</FixInvalidItalicTags> + <RemoveUnneededSpaces>Αφαίρεση περιττών διαστημάτων</RemoveUnneededSpaces> + <RemoveUnneededPeriods>Αφαίρεση περιττών τελειών</RemoveUnneededPeriods> + <FixCommas>Επιδιόρθωση κομμάτων</FixCommas> + <FixMissingSpaces>Επιδιόρθωση διαστημάτων</FixMissingSpaces> + <BreakLongLines>Διάσπαση μεγάλων γραμμών</BreakLongLines> + <RemoveLineBreaks>Αφαίρεση αλλαγών γραμμής σε μικρά κείμενα με μία μόνο πρόταση</RemoveLineBreaks> + <RemoveLineBreaksAll>Αφαίρεση αλλαγών γραμμής σε μικρά κείμενα (εκτός διαλόγου)</RemoveLineBreaksAll> + <FixUppercaseIInsindeLowercaseWords>Επιδιόρθωση κεφαλαίου 'i' σε πεζές λέξεις (σφάλμα OCR)</FixUppercaseIInsindeLowercaseWords> + <FixDoubleApostrophes>Επιδιόρθωση διπλής αποστρόφου ('') σε εισαγωγικό (")</FixDoubleApostrophes> + <AddPeriods>Προσθήκη τελείας</AddPeriods> + <StartWithUppercaseLetterAfterParagraph>Έναρξη με κεφαλαίο γράμμα μετά από παράγραφο</StartWithUppercaseLetterAfterParagraph> + <StartWithUppercaseLetterAfterPeriodInsideParagraph>Έναρξη με κεφαλαίο γράμμα μετά από τελεία</StartWithUppercaseLetterAfterPeriodInsideParagraph> + <StartWithUppercaseLetterAfterColon>Έναρξη με κεφαλαίο γράμμα μετά από σημεία στίξης</StartWithUppercaseLetterAfterColon> + <FixLowercaseIToUppercaseI>Επιδιόρθωση πεζού 'i' σε 'Ι' (Αγγλικά)</FixLowercaseIToUppercaseI> + <FixCommonOcrErrors>Επιδιόρθωση κοινών σφαλμάτων OCR (με χρήση καταλόγου αντικατάστασης OCR)</FixCommonOcrErrors> + <CommonOcrErrorsFixed>Επιδιορθώσεις κοινών σφαλμάτων OCR (χρήση του αρχείου OcrReplaceList): {0}</CommonOcrErrorsFixed> + <RemoveSpaceBetweenNumber>Αφαίρεση διαστήματος μεταξύ αριθμών</RemoveSpaceBetweenNumber> + <FixDialogsOnOneLine>Επιδιόρθωση διαλόγων</FixDialogsOnOneLine> + <NormalizeStrings>Κανονικοποίηση συμβολοσειρών</NormalizeStrings> + <RemoveSpaceBetweenNumbersFixed>Επιδιορθώσεις αφαίρεσης διαστήματος μεταξύ αριθμών: {0}</RemoveSpaceBetweenNumbersFixed> + <FixTurkishAnsi>Επιδιόρθωση Τουρκικών ANSI (Ισλανδικών) γραμμάτων σε Unicode</FixTurkishAnsi> + <FixDanishLetterI>Επιδιόρθωση δανικού γράμματος 'i'</FixDanishLetterI> + <FixSpanishInvertedQuestionAndExclamationMarks>Επιδιόρθωση ισπανικών αντεστραμμένων σημείων στίξης</FixSpanishInvertedQuestionAndExclamationMarks> + <AddMissingQuote>Προσθήκη εισαγωγικού (")</AddMissingQuote> + <AddMissingQuotes>Προσθήκη εισαγωγικών (")</AddMissingQuotes> + <RemoveHyphensSingleLine>Αφαίρεση παύλας σε ενιαίες γραμμές</RemoveHyphensSingleLine> + <XHyphensSingleLineRemoved>Αφαίρεση παυλών: {0}</XHyphensSingleLineRemoved> + <FixHyphensInDialogs>Επιδιόρθωση παυλών μέσω στυλ διαλόγου: {0}</FixHyphensInDialogs> + <XHyphensInDialogsFixed>Επιδιόρθωση παυλών: {0}</XHyphensInDialogsFixed> + <AddMissingQuotesExample>"Πώς είσαι; -&gt; "Πώς είσαι;"</AddMissingQuotesExample> + <XMissingQuotesAdded>Προσθήκη εισαγωγικών: {0}</XMissingQuotesAdded> + <Fix3PlusLines>Επιδιόρθωση υποτίτλων με περισσότερες από δύο γραμμές</Fix3PlusLines> + <Fix3PlusLine>Επιδιόρθωση υπότιτλου με περισσότερες από δύο γραμμές</Fix3PlusLine> + <X3PlusLinesFixed>Επιδιόρθωση υποτίτλων με περισσότερες από δύο γραμμές: {0}</X3PlusLinesFixed> + <Analysing>Ανάλυση...</Analysing> + <NothingToFix>Τίποτα για επιδιόρθωση</NothingToFix> + <FixesFoundX>Εύρεση επιδιορθώσεων: {0}</FixesFoundX> + <XFixesApplied>Εφαρμοσμένες επιδιορθώσεις: {0}</XFixesApplied> + <NothingFixableBut>Τίποτα για αυτόματη επιδιόρθωση. Ο υπότιτλος περιέχει σφάλμα(τα) - προβολή αρχείου καταγραφής</NothingFixableBut> + <XFixedBut>Επιδιόρθωση {0} θέματος(ων), αλλά υπάρχουν ακόμη σφάλματα - προβολή αρχείου καταγραφής</XFixedBut> + <XCouldBeFixedBut>Επιδιόρθωση {0} θέματος(ων), αλλά θα υπάρχουν ακόμη σφάλματα - προβολή αρχείου καταγραφής</XCouldBeFixedBut> + <UncheckedFixLowercaseIToUppercaseI>Αποεπιλογή "Επιδιόρθωση μονού πεζού 'i' σε 'Ι' (Αγγλικά)"</UncheckedFixLowercaseIToUppercaseI> + <XIsChangedToUppercase>{0} άλλαγή(ές) σε κεφαλαία</XIsChangedToUppercase> + <FixFirstLetterToUppercaseAfterParagraph>Επιδιόρθωση αρχικού γράμματος σε κεφαλαίο μετά από παράγραφο</FixFirstLetterToUppercaseAfterParagraph> + <MergeShortLine>Συγχώνευση γραμμών</MergeShortLine> + <MergeShortLineAll>Συγχώνευση γραμμών (εκτός διαλόγου)</MergeShortLineAll> + <XLineBreaksAdded>Προσθήκη {0} αλλαγής(ών) γραμμής</XLineBreaksAdded> + <BreakLongLine>Διάσπαση γραμμής</BreakLongLine> + <FixLongDisplayTime>Επιδιόρθωση μεγάλου χρόνου</FixLongDisplayTime> + <FixInvalidItalicTag>Επιδιόρθωση ετικέτας πλαγιαστής γραφής</FixInvalidItalicTag> + <FixShortDisplayTime>Επιδιόρθωση σύντομου χρόνου</FixShortDisplayTime> + <FixOverlappingDisplayTime>Επιδιόρθωση επικαλυπτόμενου χρόνου</FixOverlappingDisplayTime> + <FixShortGap>Επιδιόρθωση μικρών κενών</FixShortGap> + <FixInvalidItalicTagsExample>&lt;i&gt;Δεν με ενδιαφέρει.&lt;i&gt; -&gt; &lt;i&gt;Δεν με ενδιαφέρει.&lt;/i&gt;</FixInvalidItalicTagsExample> + <RemoveUnneededSpacesExample>Εσύ , εκεί. -&gt; Εσύ, εκεί.</RemoveUnneededSpacesExample> + <RemoveUnneededPeriodsExample>Εσύ!. -&gt; Εσύ!</RemoveUnneededPeriodsExample> + <FixMissingSpacesExample>Έι.Εσύ. -&gt; Έι. Εσύ.</FixMissingSpacesExample> + <FixUppercaseIInsindeLowercaseWordsExample>The Earth is fIat. -&gt; The Earth is flat.</FixUppercaseIInsindeLowercaseWordsExample> + <FixLowercaseIToUppercaseIExample>What do i care. -&gt; What do I care.</FixLowercaseIToUppercaseIExample> + <StartTimeLaterThanEndTime>Κείμενο με αριθμό {0}: Έναρξη αργότερα από λήξη: {4}{1} -&gt; {2} {3}</StartTimeLaterThanEndTime> + <UnableToFixStartTimeLaterThanEndTime>Αδυναμία επιδιόρθωσης του κειμένου με αριθμό {0}: Έναρξη αργότερα από λήξη: {1}</UnableToFixStartTimeLaterThanEndTime> + <XFixedToYZ>Επιδιόρθωση {0} σε: {1}{2}</XFixedToYZ> + <UnableToFixTextXY>Αδυναμία επιδιόρθωσης του κειμένου με αριθμό {0}: {1}</UnableToFixTextXY> + <XOverlappingTimestampsFixed>Επιδιόρθωση {0} επικαλυπτόμενου(ων) χρόνου(ων)</XOverlappingTimestampsFixed> + <XDisplayTimesProlonged>Επέκταση {0} χρόνου(ων) εμφάνισης</XDisplayTimesProlonged> + <XInvalidHtmlTagsFixed>Επιδιόρθωση {0} λανθασμένης(ων) ετικέτας(ών) HTML</XInvalidHtmlTagsFixed> + <XDisplayTimesShortned>Σμίκρυνση {0} χρόνου(ων) εμφάνισης</XDisplayTimesShortned> + <XGapsFixed>Επιδιόρθωση {0} μικρού(ών) κενού(ών)</XGapsFixed> + <XLinesUnbreaked>Συνένωση {0} γραμμής(ών)</XLinesUnbreaked> + <UnneededSpace>Αχρείαστο διάστημα</UnneededSpace> + <XUnneededSpacesRemoved>Αφαίρεση {0} αχρείαστου(ων) διαστήματος(ων)</XUnneededSpacesRemoved> + <UnneededPeriod>Αχρείαστη τελεία</UnneededPeriod> + <XUnneededPeriodsRemoved>Αφαίρεση {0} αχρείαστης(ων) τελείας(ών)</XUnneededPeriodsRemoved> + <FixMissingSpace>Επιδιόρθωση διαστήματος</FixMissingSpace> + <XMissingSpacesAdded>Προσθήκη {0} διαστήματος(ων)</XMissingSpacesAdded> + <FixUppercaseIInsideLowercaseWord>Επιδιόρθωση κεφαλαίου 'i' μέσα σε λέξη</FixUppercaseIInsideLowercaseWord> + <XPeriodsAdded>Προσθήκη {0} τελείας(ών)</XPeriodsAdded> + <FixMissingPeriodAtEndOfLine>Προσθήκη τελείας στο τέλος πρότασης</FixMissingPeriodAtEndOfLine> + <XDoubleApostrophesFixed>Επιδιόρθωση {0} διπλών αποστρόφων</XDoubleApostrophesFixed> + <XUppercaseIsFoundInsideLowercaseWords>Εύρεση {0} κεφαλαίου(ων) 'i' μέσα σε λέξη(εις)</XUppercaseIsFoundInsideLowercaseWords> + <RefreshFixes>Ανανέωση</RefreshFixes> + <ApplyFixes>Εφαρμογή</ApplyFixes> + <AutoBreak>&amp;Διάσπαση</AutoBreak> + <Unbreak>&amp;Συνένωση</Unbreak> + <FixDoubleDash>Επιδιόρθωση '--' -&gt; '...'</FixDoubleDash> + <FixDoubleGreaterThan>Αφαίρεση '&gt;&gt;'</FixDoubleGreaterThan> + <FixEllipsesStart>Αφαίρεση αρχικού '...'</FixEllipsesStart> + <FixMissingOpenBracket>Επιδιόρθωση ελλιπής [</FixMissingOpenBracket> + <FixMusicNotation>Αντικατάσταση μουσικού συμβόλου (π.χ. âTª)</FixMusicNotation> + <XFixDoubleDash>Επιδιόρθωση {0} '--'</XFixDoubleDash> + <XFixDoubleGreaterThan>Αφαίρεση {0} &gt;&gt;</XFixDoubleGreaterThan> + <XFixEllipsesStart>Αφαίρεση {0} '...' από αρχή γραμμής</XFixEllipsesStart> + <XFixMissingOpenBracket>Επιδιόρθωση {0} ελλιπούςς(ών) [</XFixMissingOpenBracket> + <XFixMusicNotation>Αντικατάσταση {0} μουσικού(ών) συμβόλου(ων)</XFixMusicNotation> + <FixDoubleDashExample>'Τι-- αα ναι!' -&gt; 'Τι... αα ναι!'</FixDoubleDashExample> + <FixDoubleGreaterThanExample>'&gt;&gt; Ρόμπερτ: Τι τρέχει;' -&gt; 'Ρόμπερτ: Τι τρέχει;'</FixDoubleGreaterThanExample> + <FixEllipsesStartExample>'... και τότε εμείς' -&gt; 'και τότε εμείς'</FixEllipsesStartExample> + <FixMissingOpenBracketExample>'κλανκ] Πρόσεξε!' -&gt; '[κλανκ] Πρόσεξε!'</FixMissingOpenBracketExample> + <FixMusicNotationExample>'âTª sweet dreams are' -&gt; '♫ sweet dreams are'</FixMusicNotationExample> + <NumberOfImportantLogMessages>{0} σημαντικό(ά) μήνυμα(τα) του αρχείου καταγραφής</NumberOfImportantLogMessages> + <FixedOkXY>Επιδιορθωμένα και εντάξει - '{0}': {1}</FixedOkXY> + <FixOcrErrorExample>D0n't -&gt; Don't</FixOcrErrorExample> + <FixSpaceBetweenNumbersExample>1 100 -&gt; 1100</FixSpaceBetweenNumbersExample> + <FixDialogsOneLineExample>Γεια, Τζον. - Γεια, Άιντα. -&gt; Γεια, Τζον.&lt;br/&gt; - Γεια, Άιντα.</FixDialogsOneLineExample> + <SelectDefault>Προεπιλεγμένα</SelectDefault> + <SetDefault>Ορισμός προεπιλεγμένων</SetDefault> + <FixContinuationStyleX>Επιδιόρθωση στυλ συνέχισης: {0}</FixContinuationStyleX> + <XFixContinuationStyle>Επιδιόρθωση {0} στυλ συνέχισης</XFixContinuationStyle> + <FixUnnecessaryLeadingDots>Αφαίρεση αρχικών αποσιωπητικών</FixUnnecessaryLeadingDots> + <XFixUnnecessaryLeadingDots>Αφαίρεση {0} αρχικών αποσιωπητικών</XFixUnnecessaryLeadingDots> + </FixCommonErrors> + <GetDictionaries> + <Title>Χρειάζεστε λεξικά;</Title> + <DescriptionLine1>Ο ορθογραφικός έλεγχος του Subtitle Edit βασίζεται στη μηχανή NHunspell</DescriptionLine1> + <DescriptionLine2>που χρησιμοποιεί τα λεξικά ορθογραφικού ελέγχου του LibreOffice.</DescriptionLine2> + <ChooseLanguageAndClickDownload>Επιλογή γλώσσας και πατήστε λήψη</ChooseLanguageAndClickDownload> + <OpenDictionariesFolder>Άνοιγμα του φακέλου 'Dictionaries'</OpenDictionariesFolder> + <Download>Λήψη</Download> + <XDownloaded>Λήψη και εγκατάσταση {0}</XDownloaded> + </GetDictionaries> + <GetTesseractDictionaries> + <Title>Χρήση λεξικών;</Title> + <DescriptionLine1>Βρείτε λεξικά Tesseract OCR από το διαδίκτυο</DescriptionLine1> + <DownloadFailed>Αποτυχία λήψης!</DownloadFailed> + <GetDictionariesHere>Εύρεση λεξικών εδώ:</GetDictionariesHere> + <ChooseLanguageAndClickDownload>Επιλογή γλώσσας και λήψη</ChooseLanguageAndClickDownload> + <OpenDictionariesFolder>Άνοιγμα φακέλου 'Dictionaries'</OpenDictionariesFolder> + <Download>Λήψη</Download> + <XDownloaded>Λήψη και εγκατάσταση {0}</XDownloaded> + </GetTesseractDictionaries> + <GoogleTranslate> + <Title>Μετάφραση Google</Title> + <From>Από:</From> + <To>Σε:</To> + <Translate>Μετάφραση</Translate> + <PleaseWait>Παρακαλώ περιμένετε... αυτό μπορεί να αργήσει λίγο</PleaseWait> + <PoweredByGoogleTranslate>Τροφοδοτείται από τη Μετάφραση Google</PoweredByGoogleTranslate> + <PoweredByMicrosoftTranslate>Τροφοδοτείται από τη Μετάφραση Microsoft</PoweredByMicrosoftTranslate> + <MsClientSecretNeeded>Συγγνώμη, χρειάζεστε ένα γνωστικό κλειδί εξυπηρέτησης 'μετάφρασης κειμένου' από τη Microsoft για τη χρήση του. +Μετάβαση σε "Επιλογές -&gt; Ρυθμίσεις -&gt; Εργαλεία" για την εισαγωγή κλειδιού.</MsClientSecretNeeded> + <GoogleApiKeyNeeded>Συγγνώμη, χρειάζεστε ένα κλειδί API από τη Google για τη χρήση του. +Μετάβαση σε "Επιλογές -&gt; Ρυθμίσεις -&gt; Εργαλεία" για την εισαγωγή κλειδιού.</GoogleApiKeyNeeded> + <GoogleNoApiKeyWarning>Μετάφραση χωρίς κλειδί API... (αργά και περιορισμένα δεδομένα)</GoogleNoApiKeyWarning> + </GoogleTranslate> + <GoogleOrMicrosoftTranslate> + <Title>Μετάφραση Google vs Bing</Title> + <From>Από:</From> + <To>Έως:</To> + <Translate>Μετάφραση</Translate> + <SourceText>Αρχικό κείμενο</SourceText> + <GoogleTranslate>Μετάφραση Google</GoogleTranslate> + <MicrosoftTranslate>Μετάφραση Bing</MicrosoftTranslate> + </GoogleOrMicrosoftTranslate> + <GoToLine> + <Title>Μετάβαση σε υπότιτλο με αριθμό</Title> + <XIsNotAValidNumber>Το {0} δεν είναι έγκυρος αριθμός</XIsNotAValidNumber> + </GoToLine> + <ImportImages> + <Title>Εισαγωγή εικόνων</Title> + <ImageFiles>Αρχεία εικόνας</ImageFiles> + <Input>Εισαγωγή</Input> + <InputDescription>Επιλογή αρχείων για εισαγωγή (περιήγηση ή σύρσιμο)</InputDescription> + <Remove>Αφαίρεση</Remove> + <RemoveAll>Αφαίρεση όλων</RemoveAll> + </ImportImages> + <ImportSceneChanges> + <Title>Δημιουργία/εισαγωγή αλλαγών σκηνών</Title> + <OpenTextFile>Άνοιγμα αρχείου κειμένου...</OpenTextFile> + <Generate>Δημιουργία αλλαγών σκηνών</Generate> + <Import>Εισαγωγή αλλαγών σκηνών</Import> + <TextFiles>Αρχεία κειμένου</TextFiles> + <TimeCodes>Κώδικες χρόνων</TimeCodes> + <Frames>Καρέ</Frames> + <Seconds>Δευτερόλεπτα</Seconds> + <Milliseconds>Χιλιοστά δευτερολέπτου</Milliseconds> + <GetSceneChangesWithFfmpeg>Δημιουργία αλλαγών σκηνών με FFmpeg</GetSceneChangesWithFfmpeg> + <Sensitivity>Ευαισθησία</Sensitivity> + <SensitivityDescription>Μικρότερη τιμή δίνει περισσότερες αλλαγές σκηνών</SensitivityDescription> + <NoSceneChangesFound>Αδυναμία εύρεσης αλλαγών σκηνών.</NoSceneChangesFound> + </ImportSceneChanges> + <ImportText> + <Title>Εισαγωγή απλού κειμένου</Title> + <OneSubtitleIsOneFile>Πολλαπλά αρχεία - κάθε αρχείο είναι ένας υπότιτλος</OneSubtitleIsOneFile> + <OpenTextFile>Άνοιγμα αρχείου κειμένου...</OpenTextFile> + <OpenTextFiles>Άνοιγμα αρχείων κειμένου...</OpenTextFiles> + <ImportOptions>Επιλογές εισαγωγής</ImportOptions> + <Splitting>Διαχωρισμός</Splitting> + <AutoSplitText>Αυτόματος διαχωρισμός κειμένου</AutoSplitText> + <OneLineIsOneSubtitle>Μία γραμμή είναι ένας υπότιτλος</OneLineIsOneSubtitle> + <TwoLinesAreOneSubtitle>Δύο γραμμές είναι ένας υπότιτλος</TwoLinesAreOneSubtitle> + <LineBreak>Αλλαγή γραμμής</LineBreak> + <SplitAtBlankLines>Διαχωρισμός σε κενές γραμμές</SplitAtBlankLines> + <MergeShortLines>Συγχώνευση σύντομων γραμμών με συνέχιση</MergeShortLines> + <RemoveEmptyLines>Αφαίρεση κενών γραμμών</RemoveEmptyLines> + <RemoveLinesWithoutLetters>Αφαίρεση γραμμών χωρίς γράμματα</RemoveLinesWithoutLetters> + <GenerateTimeCodes>Δημιουργία κωδικών χρόνου</GenerateTimeCodes> + <TakeTimeFromFileName>Μεταφορά χρόνου από όνομα αρχείου</TakeTimeFromFileName> + <GapBetweenSubtitles>Κενό μεταξύ υποτίτλων (χιλ. δευτερολέπτου)</GapBetweenSubtitles> + <Auto>Αυτόματο</Auto> + <Fixed>Σταθερό</Fixed> + <Refresh>&amp;Ανανέωση</Refresh> + <TextFiles>Αρχεία κειμένου</TextFiles> + <PreviewLinesModifiedX>Προεπισκόπηση - τροποποιημένοι υπότιτλοι: {0}</PreviewLinesModifiedX> + <TimeCodes>Κώδικες χρόνων</TimeCodes> + <SplitAtEndChars>Διαχωρισμός στο τέλος χαρακτήρων</SplitAtEndChars> + </ImportText> + <Interjections> + <Title>Παρεμβολές</Title> + </Interjections> + <JoinSubtitles> + <Title>Ένωση υποτίτλων</Title> + <Information>Προσθήκη υποτίτλων για ένωση (η απόθεση υποστηρίζεται)</Information> + <NumberOfLines>#Γραμμές</NumberOfLines> + <StartTime>Έναρξη</StartTime> + <EndTime>Λήξη</EndTime> + <FileName>Όνομα αρχείου</FileName> + <Join>Ένωση</Join> + <TotalNumberOfLinesX>Συνολικός αριθμός γραμμών: {0:#,###,###}</TotalNumberOfLinesX> + <AlreadyCorrectTimeCodes>Τα αρχεία έχουν σωστούς κώδικες χρόνων</AlreadyCorrectTimeCodes> + <AppendTimeCodes>Προσθήκη χρόνου λήξης από προηγούμενο αρχείο</AppendTimeCodes> + <AddMs>Προσθήκη χιλ. δευτερολέπτου μετά από κάθε αρχείο</AddMs> + </JoinSubtitles> + <LanguageNames> + <NotSpecified>Αόριστο</NotSpecified> + <UnknownCodeX>Άγνωστο ({0})</UnknownCodeX> + <aaName>Αφάρ</aaName> + <abName>Αμπχαζικά</abName> + <afName>Αφρικάανς</afName> + <amName>Αμαρικά</amName> + <arName>Αραβικά</arName> + <asName>Ασαμεζικά</asName> + <ayName>Αϊμάρα</ayName> + <azName>Αζερμπαϊτζανικά</azName> + <baName>Μπασκίρ</baName> + <beName>Λευκορωσικά</beName> + <bgName>Βουλγαρικά</bgName> + <bhName>Ινδικά Μπιχάρ</bhName> + <biName>Μπισλάμα</biName> + <bnName>Μπενγκάλι</bnName> + <boName>Θιβετιανά</boName> + <brName>Βρετονικά</brName> + <caName>Καταλανικά</caName> + <coName>Κορσικανικά</coName> + <csName>Τσεχικά</csName> + <cyName>Ουαλικά</cyName> + <daName>Δανικά</daName> + <deName>Γερμανικά</deName> + <dzName>Ντζόνγκχα</dzName> + <elName>Ελληνικά</elName> + <enName>Αγγλικά</enName> + <eoName>Εσπεράντο</eoName> + <esName>Ισπανικά</esName> + <etName>Εσθονικά</etName> + <euName>Βασκικά</euName> + <faName>Περσικά</faName> + <fiName>Φινλανδικά</fiName> + <fjName>Φίτζι</fjName> + <foName>Φαρόε</foName> + <frName>Γαλλικά</frName> + <fyName>Δυτικά Φριζιανά</fyName> + <gaName>Ιρλανδικά</gaName> + <gdName>Σκωτικά Κελτικά</gdName> + <glName>Γαλικιακά</glName> + <gnName>Γκουαρανί</gnName> + <guName>Γκουγιαράτι</guName> + <haName>Χάουσα</haName> + <heName>Εβραϊκά</heName> + <hiName>Χίντι</hiName> + <hrName>Κροατικά</hrName> + <huName>Ουγγρικά</huName> + <hyName>Αρμενικά</hyName> + <iaName>Ιντερλίνγκουα</iaName> + <idName>Ινδονησιακά</idName> + <ieName>Ιντερλίνγκουε</ieName> + <ikName>Ινουπιάκ</ikName> + <isName>Ισλανδικά</isName> + <itName>Ιταλικά</itName> + <iuName>Ινουκτιτούτ</iuName> + <jaName>Ιαπωνικά</jaName> + <jvName>Ιαβανεζικά</jvName> + <kaName>Γεωργιανά</kaName> + <kkName>Καζακικά</kkName> + <klName>Καλαάλισουτ</klName> + <kmName>Καμποτζιανά</kmName> + <knName>Κανάντα</knName> + <koName>Κορεατικά</koName> + <ksName>Κασμίρι</ksName> + <kuName>Κουρδικά</kuName> + <kyName>Κυργιζικά</kyName> + <laName>Λατινικά</laName> + <lbName>Λουξεμβουργιανά</lbName> + <lnName>Λινγκάλα</lnName> + <loName>Λαοθιανά</loName> + <ltName>Λιθουανικά</ltName> + <lvName>Λετονικά</lvName> + <mgName>Μαλαγάσι</mgName> + <miName>Μάορι</miName> + <mkName>Σλαβομακεδονικά</mkName> + <mlName>Μαλαγιαλάμ</mlName> + <mnName>Μογγολικά</mnName> + <moName>Ρουμανικά Μολδαβίας</moName> + <mrName>Μαράθι</mrName> + <msName>Μαλάι</msName> + <mtName>Μαλτεζικά</mtName> + <myName>Βιρμανικά</myName> + <naName>Ναούρου</naName> + <neName>Νεπάλι</neName> + <nlName>Ολλανδικά</nlName> + <noName>Νορβηγικά</noName> + <ocName>Οκσιτανικά</ocName> + <omName>Ορόμο</omName> + <orName>Ορίγια</orName> + <paName>Παντζαπικά</paName> + <plName>Πολωνικά</plName> + <psName>Πάστο</psName> + <ptName>Πορτογαλικά</ptName> + <quName>Κετσούα</quName> + <rmName>Ρομανικά</rmName> + <rnName>Ρούντι</rnName> + <roName>Ρουμανικά</roName> + <ruName>Ρωσικά</ruName> + <rwName>Κινιαρβάντα</rwName> + <saName>Σανσκριτικά</saName> + <sdName>Σίντι</sdName> + <sgName>Σάνγκο</sgName> + <shName>Σερβοκροατικά</shName> + <siName>Σινχαλεζικά</siName> + <skName>Σλοβακικά</skName> + <slName>Σλοβενικά</slName> + <smName>Σαμόαν</smName> + <snName>Σχόνα</snName> + <soName>Σομάλι</soName> + <sqName>Αλβανικά</sqName> + <srName>Σερβικά</srName> + <ssName>Σουάτι</ssName> + <stName>Νότια Σόθο</stName> + <suName>Σουνδανικά</suName> + <svName>Σουηδικά</svName> + <swName>Σουαχίλι</swName> + <taName>Ταμίλ</taName> + <teName>Τελούγκου</teName> + <tgName>Τατζίκ</tgName> + <thName>Ταϊλανδικά</thName> + <tiName>Τιγκρίνυα</tiName> + <tkName>Τουρκμενικά</tkName> + <tlName>Ταγκαλόγκ</tlName> + <tnName>Τσιγουάνα</tnName> + <toName>Τονγκανικά</toName> + <trName>Τουρκικά</trName> + <tsName>Τσόνγκα</tsName> + <ttName>Τατάρ</ttName> + <twName>Τούι</twName> + <ugName>Ουιγουρικά</ugName> + <ukName>Ουκρανικά</ukName> + <urName>Ουρντού</urName> + <uzName>Ουζμπεκικά</uzName> + <viName>Βιετναμικά</viName> + <voName>Βόλαπικ</voName> + <woName>Γουόλοφ</woName> + <xhName>Ζόσα</xhName> + <yiName>Γίντις</yiName> + <yoName>Γιορούμπα</yoName> + <zaName>Ζουάνγκ</zaName> + <zhName>Κινεζικά</zhName> + <zuName>Ζουλού</zuName> + </LanguageNames> + <Main> + <Menu> + <File> + <Title>&amp;Αρχείο</Title> + <New>&amp;Νέο</New> + <Open>Ά&amp;νοιγμα</Open> + <OpenKeepVideo>Άνοιγμα (κράτηση βίντεο)</OpenKeepVideo> + <Reopen>Άνοιγμα &amp;ξανά</Reopen> + <Save>Α&amp;ποθήκευση</Save> + <SaveAs>Αποθήκευση &amp;ως...</SaveAs> + <RestoreAutoBackup>Επαναφορά αυτόματου αντίγραφου ασφαλείας</RestoreAutoBackup> + <AdvancedSubStationAlphaProperties>Προηγμένες ιδιότητες Sub Station Alpha...</AdvancedSubStationAlphaProperties> + <SubStationAlphaProperties>Ιδιότητες Sub Station Alpha...</SubStationAlphaProperties> + <EbuProperties>Ιδιότητες EBU STL...</EbuProperties> + <DvdStuioProProperties>Ιδιότητες DVD Studio Pro...</DvdStuioProProperties> + <TimedTextProperties>Ιδιότητες Timed Text...</TimedTextProperties> + <PacProperties>Ιδιότητες PAC...</PacProperties> + <OpenOriginal>Άνοιγμα αρχικού υπότιτλου (λειτουργία μετάφρασης)...</OpenOriginal> + <SaveOriginal>Αποθήκευση αρχικού υπότιτλου</SaveOriginal> + <CloseOriginal>Κλείσιμο αρχικού υπότιτλου</CloseOriginal> + <OpenContainingFolder>Άνοιγμα περιέχοντα φακέλου</OpenContainingFolder> + <Compare>&amp;Σύγκριση...</Compare> + <Statistics>Στατιστι&amp;κά...</Statistics> + <Plugins>Πρόσθετα...</Plugins> + <ImportOcrFromDvd>Εισαγωγή/OCR υπότιτλου από VOB/IFO (DVD)...</ImportOcrFromDvd> + <ImportOcrVobSubSubtitle>Εισαγωγή/OCR υπότιτλου VobSub (sub/idx)...</ImportOcrVobSubSubtitle> + <ImportBluRaySupFile>Εισαγωγή/OCR αρχείου Blu-ray sup...</ImportBluRaySupFile> + <ImportXSub>Εισαγωγή/OCR XSub από DivX/avi...</ImportXSub> + <ImportSubtitleFromMatroskaFile>Εισαγωγή/OCR υπότιτλου από αρχείο Matroska...</ImportSubtitleFromMatroskaFile> + <ImportSubtitleWithManualChosenEncoding>Εισαγωγή υπότιτλου με επιλογή κωδικοποίησης...</ImportSubtitleWithManualChosenEncoding> + <ImportText>Εισαγωγή απλού κειμένου...</ImportText> + <ImportImages>Εισαγωγή εικόνων...</ImportImages> + <ImportTimecodes>Εισαγωγή κωδικών χρόνου...</ImportTimecodes> + <Export>Εξαγωγή</Export> + <ExportBdnXml>BDN xml/png...</ExportBdnXml> + <ExportBluRaySup>Blu-ray sup...</ExportBluRaySup> + <ExportVobSub>VobSub (sub/idx)...</ExportVobSub> + <ExportCavena890>Cavena 890...</ExportCavena890> + <ExportEbu>EBU STL...</ExportEbu> + <ExportPac>PAC (Ηλεκτρονικά οθόνης)...</ExportPac> + <ExportPlainText>Απλό κείμενο...</ExportPlainText> + <ExportAdobeEncoreFabImageScript>Εικόνα κειμένου Adobe Encore FAB...</ExportAdobeEncoreFabImageScript> + <ExportKoreanAtsFilePair>Ζεύγος αρχείων Korean ATS...</ExportKoreanAtsFilePair> + <ExportAvidStl>Avid STL...</ExportAvidStl> + <ExportDvdStudioProStl>DVD Studio Pro STL...</ExportDvdStudioProStl> + <ExportCapMakerPlus>CapMaker Plus...</ExportCapMakerPlus> + <ExportCaptionsInc>Captions Inc...</ExportCaptionsInc> + <ExportCheetahCap>Cheetah CAP...</ExportCheetahCap> + <ExportUltech130>Λεζάντα Ultech...</ExportUltech130> + <ExportCustomTextFormat>Εξαγωγή προσαρμοσμένης μορφής κειμένου...</ExportCustomTextFormat> + <Exit>Έ&amp;ξοδος</Exit> + </File> + <Edit> + <Title>Επεξεργασία</Title> + <Undo>Αναίρεση</Undo> + <Redo>Επανάληψη</Redo> + <ShowUndoHistory>Εμφάνιση ιστορικού (αναίρεσης)</ShowUndoHistory> + <InsertUnicodeSymbol>Εισαγωγή συμβόλου Unicode</InsertUnicodeSymbol> + <InsertUnicodeControlCharacters>Εισαγωγή χαρακτήρων ελέγχου Unicode</InsertUnicodeControlCharacters> + <InsertUnicodeControlCharactersLRM>Σημείο αριστερά προς δεξιά</InsertUnicodeControlCharactersLRM> + <InsertUnicodeControlCharactersRLM>Σημείο δεξιά προς αριστερά</InsertUnicodeControlCharactersRLM> + <InsertUnicodeControlCharactersLRE>Έναρξη ενσωμάτωσης από αριστερά προς δεξιά</InsertUnicodeControlCharactersLRE> + <InsertUnicodeControlCharactersRLE>Έναρξη ενσωμάτωσης από δεξιά προς αριστερά</InsertUnicodeControlCharactersRLE> + <InsertUnicodeControlCharactersLRO>Έναρξη παράκαμψης από αριστερά προς δεξιά</InsertUnicodeControlCharactersLRO> + <InsertUnicodeControlCharactersRLO>Έναρξη παράκαμψης από δεξιά προς αριστερά</InsertUnicodeControlCharactersRLO> + <Find>Εύ&amp;ρεση</Find> + <FindNext>Εύρεση &amp;επόμενου</FindNext> + <Replace>Α&amp;ντικατάσταση</Replace> + <MultipleReplace>&amp;Πολλαπλή αντικατάστση...</MultipleReplace> + <GoToSubtitleNumber>&amp;Μετάβαση σε αριθμό υπότιτλου...</GoToSubtitleNumber> + <RightToLeftMode>Λειτουργία από δεξιά προς αριστερά</RightToLeftMode> + <FixRtlViaUnicodeControlCharacters>Επιδιόρθωση RTL μέσω χαρακτήρων ελέγχου Unicode (επιλεγμένων γραμμών)</FixRtlViaUnicodeControlCharacters> + <RemoveUnicodeControlCharacters>Αφαίρεση χαρακτήρων ελέγχου Unicode (επιλεγμένων γραμμών)</RemoveUnicodeControlCharacters> + <ReverseRightToLeftStartEnd>Αντιστροφή έναρξης/λήξης του RTL (επιλεγμένες γραμμές)</ReverseRightToLeftStartEnd> + <ShowOriginalTextInAudioAndVideoPreview>Προβολή αρχικού κειμένου στις προεπισκόπήσεις ήχου/βίντεο</ShowOriginalTextInAudioAndVideoPreview> + <ModifySelection>Επεξεργασία επιλογής...</ModifySelection> + <InverseSelection>Αντιστροφή</InverseSelection> + </Edit> + <Tools> + <Title>Εργαλεία</Title> + <AdjustDisplayDuration>&amp;Προσαρμογή διαρκειών...</AdjustDisplayDuration> + <ApplyDurationLimits>Εφαρμογή ορίων διάρκειας...</ApplyDurationLimits> + <SubtitlesBridgeGaps>Ένωση κενών στις διάρκειες...</SubtitlesBridgeGaps> + <FixCommonErrors>&amp;Επιδιόρθωση σφαλμάτων...</FixCommonErrors> + <StartNumberingFrom>Επαναρίθμηση...</StartNumberingFrom> + <RemoveTextForHearingImpaired>Αφαίρεση κειμένου για κωφούς...</RemoveTextForHearingImpaired> + <ChangeCasing>Αλλαγή πεζών-κεφαλαίων...</ChangeCasing> + <ChangeFrameRate>Αλλαγή ρυθμού καρέ...</ChangeFrameRate> + <ChangeSpeedInPercent>Αλλαγή ταχύτητας (επί τοις εκατό)...</ChangeSpeedInPercent> + <MergeShortLines>Συγχώνευση σύντομων γραμμών...</MergeShortLines> + <MergeDuplicateText>Συγχώνευση γραμμών με ίδιο κείμενο...</MergeDuplicateText> + <MergeSameTimeCodes>Συγχώνευση γραμμών με ίδιο χρόνο...</MergeSameTimeCodes> + <SplitLongLines>Διαχωρισμός μεγάλων γραμμών...</SplitLongLines> + <MinimumDisplayTimeBetweenParagraphs>Ελάχιστος χρόνος εμφάνισης μεταξύ παραγράφων...</MinimumDisplayTimeBetweenParagraphs> + <SortBy>Ταξινόμηση</SortBy> + <NetflixQualityCheck>Έλεγχος ποιότητας Netflix...</NetflixQualityCheck> + <Number>Αριθμός</Number> + <StartTime>Έναρξη</StartTime> + <EndTime>Λήξη</EndTime> + <Duration>Διάρκεια</Duration> + <TextAlphabetically>Κείμενο - αλφαβητικά</TextAlphabetically> + <TextSingleLineMaximumLength>Κείμενο - μέγιστο μήκος γραμμής</TextSingleLineMaximumLength> + <TextTotalLength>Κείμενο - συνολικό μήκος</TextTotalLength> + <TextNumberOfLines>Κείμενο - σύνολο γραμμών</TextNumberOfLines> + <TextNumberOfCharactersPerSeconds>Κείμενο - σύνολο χαρακτήρων/δευτ.</TextNumberOfCharactersPerSeconds> + <WordsPerMinute>Κείμενο - λέξεις ανά λεπτό (λαλ)</WordsPerMinute> + <Style>Στυλ</Style> + <Ascending>Αύξουσα</Ascending> + <Descending>Φθίνουσα</Descending> + <MakeNewEmptyTranslationFromCurrentSubtitle>Δημιουργία νέας κενής μετάφρασης</MakeNewEmptyTranslationFromCurrentSubtitle> + <BatchConvert>Μαζική μετατροπή...</BatchConvert> + <GenerateTimeAsText>Παραγωγή χρόνου ως κείμενο...</GenerateTimeAsText> + <MeasurementConverter>Μετατροπέας μονάδων μέτρησης...</MeasurementConverter> + <SplitSubtitle>Διάσπαση υπότιτλου...</SplitSubtitle> + <AppendSubtitle>Προσάρτηση υπότιτλου...</AppendSubtitle> + <JoinSubtitles>Ένωση υποτίτλων...</JoinSubtitles> + </Tools> + <Video> + <Title>Βίντεο</Title> + <OpenVideo>Άνοιγμα αρχείου βίντεο...</OpenVideo> + <OpenVideoFromUrl>Άνοιγμα βίντεο από διεύθυνση url...</OpenVideoFromUrl> + <OpenDvd>Άνοιγμα DVD...</OpenDvd> + <ChooseAudioTrack>Επιλέξτε κομματιού ήχου</ChooseAudioTrack> + <CloseVideo>Κλείσιμο βίντεο</CloseVideo> + <OpenSecondSubtitle>Άνοιγμα δεύτερου υποτίτλου...</OpenSecondSubtitle> + <SetVideoOffset>Αντιστάθμιση έναρξης βίντεο...</SetVideoOffset> + <SmptTimeMode>Χρονισμός SMPTE (ρήξη καρέ)</SmptTimeMode> + <GenerateTextFromVideo>Δημιουργία κειμένου από βίντεο...</GenerateTextFromVideo> + <ImportChaptersFromVideo>Εισαγωγή κεφαλαίων από βίντεο</ImportChaptersFromVideo> + <GenerateImportSceneChanges>Δημιουργία/εισαγωγή αλλαγών σκηνών...</GenerateImportSceneChanges> + <RemoveSceneChanges>Αφαίρεση σκηνών αλλαγής</RemoveSceneChanges> + <WaveformBatchGenerate>Μαζική δημιουργία κυματομορφών...</WaveformBatchGenerate> + <ShowHideVideo>Εμφάνιση/απόκρυψη βίντεο</ShowHideVideo> + <ShowHideWaveform>Εμφάνιση/απόκρυψη κυματομορφής</ShowHideWaveform> + <ShowHideWaveformAndSpectrogram>Εμφάνιση/απόκρυψη κυματομορφής και φασματογράμματος</ShowHideWaveformAndSpectrogram> + <UnDockVideoControls>Απαγκύρωση στοιχείων ελέγχου βίντεο</UnDockVideoControls> + <ReDockVideoControls>Επαναγκύρωση στοιχείων ελέγχου βίντεο</ReDockVideoControls> + </Video> + <SpellCheck> + <Title>Ορθογραφικός έλεγχος</Title> + <SpellCheck>&amp;Ορθογραφικός έλεγχος...</SpellCheck> + <SpellCheckFromCurrentLine>Ορθογραφικός έλεγχος από τρέχουσα γραμμή...</SpellCheckFromCurrentLine> + <FindDoubleWords>Εύρεση διπλών λέξεων</FindDoubleWords> + <FindDoubleLines>Εύρεση διπλών γραμμών</FindDoubleLines> + <GetDictionaries>Λήψη λεξικών...</GetDictionaries> + <AddToNameList>Προσθήκη λέξης στη λίστα ονομάτων</AddToNameList> + </SpellCheck> + <Synchronization> + <Title>Συγχρονισμός</Title> + <AdjustAllTimes>Προσαρμογή όλων των χρόνων (εμφάνιση νωρίτερα/αργότερα)...</AdjustAllTimes> + <VisualSync>&amp;Οπτικός συγχρονισμός...</VisualSync> + <PointSync>Συγχρονισμός σημείων...</PointSync> + <PointSyncViaOtherSubtitle>Συγχρονισμός σημείων μέσω υπότιτλου...</PointSyncViaOtherSubtitle> + </Synchronization> + <AutoTranslate> + <Title>Αυτόματη μετάφραση</Title> + <TranslatePoweredByGoogle>Μετάφραση Google...</TranslatePoweredByGoogle> + <TranslatePoweredByMicrosoft>Μετάφραση Bing...</TranslatePoweredByMicrosoft> + <TranslateFromSwedishToDanish>Μετάφραση από Σουηδικά σε Δανικά (τροφοδοτείται από nikse.dk)...</TranslateFromSwedishToDanish> + </AutoTranslate> + <Options> + <Title>Επιλογές</Title> + <Settings>&amp;Ρυθμίσεις...</Settings> + <ChooseLanguage>&amp;Επιλογή γλώσσας...</ChooseLanguage> + </Options> + <Networking> + <Title>Δίκτυο</Title> + <StartNewSession>Έναρξη νέας συνεδρίας</StartNewSession> + <JoinSession>Συμμετοχή</JoinSession> + <ShowSessionInfoAndLog>Προβολή πληροφοριών και αρχείου καταγραφής</ShowSessionInfoAndLog> + <Chat>Συνομιλία</Chat> + <LeaveSession>Έξοδος</LeaveSession> + </Networking> + <Help> + <CheckForUpdates>Έλεγχος ενημερώσεων...</CheckForUpdates> + <Title>Βοήθεια</Title> + <Help>&amp;Βοήθεια</Help> + <About>&amp;Πληροφορίες</About> + </Help> + <ToolBar> + <New>Νέο</New> + <Open>Άνοιγμα</Open> + <Save>Αποθήκευση</Save> + <SaveAs>Αποθήκευση ως</SaveAs> + <Find>Εύρεση</Find> + <Replace>Αντικατάσταση</Replace> + <FixCommonErrors>Διόρθωση συνηθισμένων σφαλμάτων</FixCommonErrors> + <RemoveTextForHi>Αφαίρεση κειμένου για κωφούς</RemoveTextForHi> + <VisualSync>Οπτικός συγχρονισμός</VisualSync> + <SpellCheck>Ορθογραφικός έλεγχος</SpellCheck> + <NetflixQualityCheck>Έλεγχος ποιότητας Netflix</NetflixQualityCheck> + <Settings>Ρυθμίσεις</Settings> + <Help>Βοήθεια</Help> + <ShowHideWaveform>Εμφάνιση/απόκρυψη κυματομορφής</ShowHideWaveform> + <ShowHideVideo>Εμφάνιση/απόκρυψη βίντεο</ShowHideVideo> + </ToolBar> + <ContextMenu> + <SizeAllColumnsToFit>Αλλαγή μεγέθους στηλών για να χωρούν</SizeAllColumnsToFit> + <AdvancedSubStationAlphaSetStyle>Προηγμένο Sub Station Alpha - ορισμός στυλ</AdvancedSubStationAlphaSetStyle> + <SubStationAlphaSetStyle>Sub Station Alpha - Ορισμός στυλ</SubStationAlphaSetStyle> + <SetActor>Ορισμός παράγοντα</SetActor> + <SubStationAlphaStyles>Στυλ Sub Station Alpha...</SubStationAlphaStyles> + <AdvancedSubStationAlphaStyles>Προηγμένο στυλ Sub Station Alpha...</AdvancedSubStationAlphaStyles> + <TimedTextSetRegion>Timed Text - ορισμός περιοχής</TimedTextSetRegion> + <TimedTextSetStyle>Timed Text - ορισμός στυλ</TimedTextSetStyle> + <TimedTextStyles>Στυλ Timed Text...</TimedTextStyles> + <TimedTextSetLanguage>Timed Text - ορισμός γλώσσας</TimedTextSetLanguage> + <SamiSetStyle>Sami - ορισμός κλάσης</SamiSetStyle> + <NuendoSetStyle>Nuendo - ορισμός χαρακτήρα</NuendoSetStyle> + <Cut>Αποκοπή</Cut> + <Copy>Αντιγραφή</Copy> + <Paste>Επικόλληση</Paste> + <Delete>Διαγραφή</Delete> + <SplitLineAtCursorPosition>Διαχωρισμός γραμμής στην θέση του δείκτη</SplitLineAtCursorPosition> + <SplitLineAtCursorAndWaveformPosition>Διαχωρισμός γραμμής στη θέση δείκτη/βίντεο</SplitLineAtCursorAndWaveformPosition> + <AutoDurationCurrentLine>Αυτόματη διάρκεια (τρέχουσα γραμμή)</AutoDurationCurrentLine> + <SelectAll>Επιλογή όλων</SelectAll> + <InsertFirstLine>Εισαγωγή γραμμής</InsertFirstLine> + <InsertBefore>Εισαγωγή πριν</InsertBefore> + <InsertAfter>Εισαγωγή μετά</InsertAfter> + <InsertSubtitleAfter>Εισαγωγή υπότιτλου έπειτα της γραμμής...</InsertSubtitleAfter> + <CopyToClipboard>Αντιγραφή κειμένου στο πρόχειρο</CopyToClipboard> + <Column>Στήλη</Column> + <ColumnDeleteText>Διαγραφή κειμένου</ColumnDeleteText> + <ColumnDeleteTextAndShiftCellsUp>Διαγραφή κειμένου και ανέβασμα κελιών</ColumnDeleteTextAndShiftCellsUp> + <ColumnInsertEmptyTextAndShiftCellsDown>Εισαγωγή κενού κειμένου και κατέβασμα κελιών</ColumnInsertEmptyTextAndShiftCellsDown> + <ColumnInsertTextFromSubtitle>Εισαγωγή κειμένου από υπότιτλο...</ColumnInsertTextFromSubtitle> + <ColumnImportTextAndShiftCellsDown>Εισαγωγή κειμένου και κατέβασμα κελιών</ColumnImportTextAndShiftCellsDown> + <ColumnPasteFromClipboard>Επικόλληση από το πρόχειρο...</ColumnPasteFromClipboard> + <ColumnTextUp>Κείμενο πάνω</ColumnTextUp> + <ColumnTextDown>Κείμενο κάτω</ColumnTextDown> + <ColumnCopyOriginalTextToCurrent>Αντιγραφή κειμένου από το αρχικό στο τρέχων</ColumnCopyOriginalTextToCurrent> + <Split>Διαχωρισμός</Split> + <MergeSelectedLines>Συγχώνευση γραμμών</MergeSelectedLines> + <MergeSelectedLinesAsDialog>Συγχώνευση γραμμών ως διάλογο</MergeSelectedLinesAsDialog> + <MergeWithLineBefore>Συγχώνευση με τη γραμμή πριν</MergeWithLineBefore> + <MergeWithLineAfter>Συγχώνευση με τη γραμμή μετά</MergeWithLineAfter> + <ExtendToLineBefore>Επέκταση στην προηγούμενη γραμμή</ExtendToLineBefore> + <ExtendToLineAfter>Επέκταση στην επόμενη γραμμή</ExtendToLineAfter> + <RemoveFormatting>Αφαίρεση μορφοποίησης</RemoveFormatting> + <RemoveFormattingAll>Αφαίρεση όλης της μορφοποίησης</RemoveFormattingAll> + <RemoveFormattingBold>Αφαίρεση έντονων</RemoveFormattingBold> + <RemoveFormattingItalic>Αφαίρεση πλαγιαστών</RemoveFormattingItalic> + <RemoveFormattingUnderline>Αφαίρεση υπογράμμισης</RemoveFormattingUnderline> + <RemoveFormattingColor>Αφαίρεση χρώματος</RemoveFormattingColor> + <RemoveFormattingFontName>Αφαίρεση ονόματος γραμματοσειράς</RemoveFormattingFontName> + <RemoveFormattingAlignment>Αφαίρεση στοίχισης</RemoveFormattingAlignment> + <Underline>Υπογράμμιση</Underline> + <Box>Πλαίσιο</Box> + <Color>Χρώμα...</Color> + <FontName>Όνομα γραμματοσειράς...</FontName> + <Superscript>Εκθέτης</Superscript> + <Subscript>Δείκτης</Subscript> + <Alignment>Στοίχιση...</Alignment> + <AutoBalanceSelectedLines>Αυτόματη ισορρόπηση γραμμών...</AutoBalanceSelectedLines> + <RemoveLineBreaksFromSelectedLines>Αφαίρεση αλλαγών γραμμής από γραμμές...</RemoveLineBreaksFromSelectedLines> + <TypewriterEffect>Εφέ γραφομηχανής...</TypewriterEffect> + <KaraokeEffect>Εφέ καραόκε...</KaraokeEffect> + <ShowSelectedLinesEarlierLater>Εμφάνιση γραμμών νωρίτερα/αργότερα...</ShowSelectedLinesEarlierLater> + <VisualSyncSelectedLines>Οπτικός συγχρονισμός γραμμών...</VisualSyncSelectedLines> + <GoogleAndMicrosoftTranslateSelectedLine>Μετάφραση αρχικής γραμμής μέσω Google/Microsoft</GoogleAndMicrosoftTranslateSelectedLine> + <TranslateSelectedLines>Μετάφραση γραμμών...</TranslateSelectedLines> + <AdjustDisplayDurationForSelectedLines>Προσαρμογή διαρκειών γραμμών...</AdjustDisplayDurationForSelectedLines> + <FixCommonErrorsInSelectedLines>Επιδιόρθωση κοινών σφαλμάτων στις γραμμές...</FixCommonErrorsInSelectedLines> + <ChangeCasingForSelectedLines>Αλλαγή πεζών-κεφαλαίων στις γραμμές...</ChangeCasingForSelectedLines> + <SaveSelectedLines>Αποθήκευση γραμμών ως...</SaveSelectedLines> + <WebVTTSetNewVoice>Καθορισμός νέας φωνής...</WebVTTSetNewVoice> + <WebVTTRemoveVoices>Αφαίρεση φωνών</WebVTTRemoveVoices> + <NewActor>Νέος ηθοποιός...</NewActor> + <RemoveActors>Αφαίρεση ηθοποιών</RemoveActors> + <EditBookmark>Επεξεργασία σημείωσης</EditBookmark> + <RemoveBookmark>Αφαίρεση σημείωσης</RemoveBookmark> + </ContextMenu> + </Menu> + <Controls> + <SubtitleFormat>Μορφή</SubtitleFormat> + <FileEncoding>Κωδικοποίηση</FileEncoding> + <ListView>Προβολή λίστας</ListView> + <SourceView>Προβολή πηγής</SourceView> + <UndoChangesInEditPanel>Αναίρεση αλλαγών στον πίνακα επεξεργασίας</UndoChangesInEditPanel> + <Previous>&lt; Προηγούμενο</Previous> + <Next>Επόμενο &gt;</Next> + <AutoBreak>&amp;Διάσπαση</AutoBreak> + <Unbreak>Συνένωση</Unbreak> + </Controls> + <VideoControls> + <Translate>Μετάφραση</Translate> + <CreateAndAdjust>Δημιουργία/προσαρμογή</CreateAndAdjust> + <Create>Δημιουργία</Create> + <Adjust>Προσαρμογή</Adjust> + <SelectCurrentElementWhilePlaying>Επιλογή τρέχοντος υπότιτλου κατά την αναπαραγωγή</SelectCurrentElementWhilePlaying> + <AutoRepeat>Αυτόματη επανάληψη</AutoRepeat> + <AutoRepeatOn>Ενεργοποίηση αυτόματης επανάληψης</AutoRepeatOn> + <AutoRepeatCount>Μετρητής επαναλήψεων (φορές)</AutoRepeatCount> + <AutoContinue>Αυτόματη συνέχιση</AutoContinue> + <AutoContinueOn>Ενεργοποίηση αυτόματης συνέχισης</AutoContinueOn> + <DelayInSeconds>Καθυστέρηση (δευτ.)</DelayInSeconds> + <OriginalText>Αρχικό κείμενο</OriginalText> + <Previous>&lt; &amp;Προηγούμενο</Previous> + <Stop>&amp;Διακοπή</Stop> + <PlayCurrent>&amp;Αναπαραγωγή τρέχοντος</PlayCurrent> + <Next>&amp;Επόμενο &gt;</Next> + <Playing>Σε αναπαραγωγή...</Playing> + <RepeatingLastTime>Επανάληψη... τελευταία φορά</RepeatingLastTime> + <RepeatingXTimesLeft>Επανάληψη... {0} φορές που απέμειναν</RepeatingXTimesLeft> + <AutoContinueInOneSecond>Αυτόματη συνέχιση σε ένα δευτ.</AutoContinueInOneSecond> + <AutoContinueInXSeconds>Αυτόματη συνέχιση σε {0} δευτ.</AutoContinueInXSeconds> + <StillTypingAutoContinueStopped>Πληκτρολόγηση σε εξέλιξη... διακοπή αυτόματης συνέχισης</StillTypingAutoContinueStopped> + <InsertNewSubtitleAtVideoPosition>&amp;Εισαγωγή νέου υποτίτλου</InsertNewSubtitleAtVideoPosition> + <InsertNewSubtitleAtVideoPositionNoTextBoxFocus>Εισαγωγή υποτίτλου στη θέση βίντεο (μη εστίαση πλαισίου)</InsertNewSubtitleAtVideoPositionNoTextBoxFocus> + <Auto>Αυτόματη</Auto> + <PlayFromJustBeforeText>Αναπαραγωγή &amp;πριν από</PlayFromJustBeforeText> + <Pause>Παύση</Pause> + <GoToSubtitlePositionAndPause>Μετάβαση και παύση</GoToSubtitlePositionAndPause> + <SetStartTime>Ορισμός έ&amp;ναρξης</SetStartTime> + <SetEndTimeAndGoToNext>Ο&amp;ρισμός λήξης &amp;&amp; μετάβαση</SetEndTimeAndGoToNext> + <AdjustedViaEndTime>Προσάρμοση μέσω χρόνου λήξης {0}</AdjustedViaEndTime> + <SetEndTime>Ορισμός λή&amp;ξης</SetEndTime> + <SetstartTimeAndOffsetOfRest>Έναρ&amp;ξη και αντιστάθμιση</SetstartTimeAndOffsetOfRest> + <SearchTextOnline>Αναζήτηση κειμένου διαδικτυακά</SearchTextOnline> + <GoogleTranslate>Μετάφραση Google</GoogleTranslate> + <GoogleIt>Αναζήτηση</GoogleIt> + <SecondsBackShort>&lt;&lt;</SecondsBackShort> + <SecondsForwardShort>&gt;&gt;</SecondsForwardShort> + <VideoPosition>Θέση βίντεο:</VideoPosition> + <TranslateTip>Συμβουλή: Χρησιμοποιήστε &lt;alt+βέλη πάνω/κάτω&gt; για μετάβαση σε προηγούμενο/επόμενο υπότιτλο</TranslateTip> + <BeforeChangingTimeInWaveformX>Πριν την αλλαγή χρόνου στην κυματομορφή: {0}</BeforeChangingTimeInWaveformX> + <NewTextInsertAtX>Νέο κείμενο εισήχθει στο {0}</NewTextInsertAtX> + <Center>Κέντρο</Center> + <PlayRate>Ρυθμός αναπαραγωγής (ταχύτητα)</PlayRate> + </VideoControls> + <SaveChangesToUntitled>Αποθήκευση αλλαγών στο άτιτλο;</SaveChangesToUntitled> + <SaveChangesToX>Αποθήκευση αλλαγών στο {0};</SaveChangesToX> + <SaveChangesToUntitledOriginal>Αποθήκευση αλλαγών στον αρχικό άτιτλο;</SaveChangesToUntitledOriginal> + <SaveChangesToOriginalX>Αποθήκευση αλλαγών στον αρχικό {0};</SaveChangesToOriginalX> + <SaveSubtitleAs>Αποθήκευση υποτίτλου ως...</SaveSubtitleAs> + <SaveOriginalSubtitleAs>Αποθήκευση αρχικού υποτίτλου ως...</SaveOriginalSubtitleAs> + <NoSubtitleLoaded>Μη φορτωμένος υπότιτλος</NoSubtitleLoaded> + <VisualSyncSelectedLines>Οπτικός συγχρονισμός - επιλεγμένες γραμμές</VisualSyncSelectedLines> + <VisualSyncTitle>Οπτικός συγχρονισμός</VisualSyncTitle> + <BeforeVisualSync>Πριν οπτικού συγχρονισμού</BeforeVisualSync> + <VisualSyncPerformedOnSelectedLines>Εκτελέστηκε οπτικός συγχρονισμός στις επιλεγμένες γραμμές</VisualSyncPerformedOnSelectedLines> + <VisualSyncPerformed>Εκτελέστηκε οπτικός συγχρονισμός</VisualSyncPerformed> + <FileXIsLargerThan10MB>Το αρχείο {0} είναι μεγαλύτερο από 10 MB</FileXIsLargerThan10MB> + <ContinueAnyway>Συνέχιση;</ContinueAnyway> + <BeforeLoadOf>Πριν τη φόρτωση του {0}</BeforeLoadOf> + <LoadedSubtitleX>Φόρτωση υποτίτλου {0}</LoadedSubtitleX> + <LoadedEmptyOrShort>Φόρτωση κενού ή σύντομου υποτίτλου {0}</LoadedEmptyOrShort> + <FileIsEmptyOrShort>Το αρχείο είναι κενό ή μικρό!</FileIsEmptyOrShort> + <FileNotFound>Αδυναμία εύρεσης αρχείου: {0}</FileNotFound> + <SavedSubtitleX>Αποθήκευση υποτίτλου {0}</SavedSubtitleX> + <SavedOriginalSubtitleX>Αποθήκευση αρχικού υποτίτλου {0}</SavedOriginalSubtitleX> + <FileOnDiskModified>Τροποποίηση αρχείου δίσκου</FileOnDiskModified> + <OverwriteModifiedFile>Αντικατάσταση του αρχείου {0} που τροποποιήθηκε στο {1} {2}{3} με το τρέχον αρχείο που φορτώθηκε από το δίσκο στο {4} {5};</OverwriteModifiedFile> + <FileXIsReadOnly>Αδυναμία αποθήκευσης {0} +Το αρχείο είναι μόνο για ανάγνωση!</FileXIsReadOnly> + <UnableToSaveSubtitleX>Αδυναμία αποθήκευσης του αρχείου υπότιτλων {0} +Ο υπότιτλος μοιάζει να είναι άδειος - προσπαθήστε να τον ξανασώσεται, εάν δουλεύεται σε έγκυρο αρχείο</UnableToSaveSubtitleX> + <FormatXShouldUseUft8>Να χρησιμοποιείται η κωδικοποίηση UTF-8 κατά την αποθήκευση {0} αρχείων!</FormatXShouldUseUft8> + <BeforeNew>Πριν από νέο</BeforeNew> + <New>Νέο</New> + <BeforeConvertingToX>Πριν από μετατροπή σε {0}</BeforeConvertingToX> + <ConvertedToX>Μετατράπηκε σε {0}</ConvertedToX> + <BeforeShowEarlier>Πριν από εμφάνιση νωρίτερα</BeforeShowEarlier> + <BeforeShowLater>Πριν από εμφάνιση αργότερα</BeforeShowLater> + <LineNumberX>Γραμμή με αριθμό: {0:#,##0.##}</LineNumberX> + <OpenVideoFile>Άνοιγμα βίντεο...</OpenVideoFile> + <NewFrameRateUsedToCalculateTimeCodes>Ο νέος ρυθμός καρέ ({0}) χρησιμοποιήθηκε για τον υπολογισμό των κωδικών χρόνου έναρξης/λήξης</NewFrameRateUsedToCalculateTimeCodes> + <NewFrameRateUsedToCalculateFrameNumbers>Ο νέος ρυθμός καρέ ({0}) χρησιμοποιήθηκε για τον υπολογισμό των αριθμών καρέ έναρξης/λήξης</NewFrameRateUsedToCalculateFrameNumbers> + <FindContinue>Αδυναμία εύρεσης στοιχείου. +Επανάληψη αναζήτησης από την αρχή;</FindContinue> + <FindContinueTitle>Συνέχιση εύρεσης;</FindContinueTitle> + <ReplaceContinueNotFound>Αδυναμία εύρεσης στοιχείου. +Επανάληψη αναζήτησης και αντικατάστασης από την αρχή;</ReplaceContinueNotFound> + <ReplaceXContinue>Εύρεση και αντικατάσταση στοιχείου {0} φορά(ες). +Επανάληψη αναζήτησης και αντικατάστασης από την αρχή;</ReplaceXContinue> + <ReplaceContinueTitle>Συνέχιση 'αντικατάστασης';</ReplaceContinueTitle> + <SearchingForXFromLineY>Αναζήτηση για '{0}' από αριθμό γραμμής {1}...</SearchingForXFromLineY> + <XFoundAtLineNumberY>Εύρεση '{0}' στη γραμμή με αριθμό {1}</XFoundAtLineNumberY> + <XNotFound>Αδυναμία εύρεσης '{0}'</XNotFound> + <BeforeReplace>Πριν από αντικατάσταση: {0}</BeforeReplace> + <MatchFoundX>Εύρεση αντιστοιχίας: {0}</MatchFoundX> + <NoMatchFoundX>Αδυναμία εύρεσης αντιστοιχίας: {0}</NoMatchFoundX> + <FoundNothingToReplace>Αδυναμία εύρεσης για αντικατάσταση</FoundNothingToReplace> + <ReplaceCountX>Αριθμός αντικαταστάσεων: {0}</ReplaceCountX> + <NoXFoundAtLineY>Εύρεση αντιστοιχίας στη γραμμή {0}: {1}</NoXFoundAtLineY> + <OneReplacementMade>Αντικατάσταση ενός.</OneReplacementMade> + <BeforeChangesMadeInSourceView>Πριν των αλλαγν στην προβολή πηγής</BeforeChangesMadeInSourceView> + <UnableToParseSourceView>Αδυναμία ανάλυσης κειμένου στην προβολή πηγής!</UnableToParseSourceView> + <GoToLineNumberX>Μετάβαση στη γραμμή με αριθμό {0}</GoToLineNumberX> + <CreateAdjustChangesApplied>Δημιουργία/προσαρμογή γραμμών εφαρμοσμένων αλλαγών</CreateAdjustChangesApplied> + <SelectedLines>επιλεγμένες γραμμές</SelectedLines> + <BeforeDisplayTimeAdjustment>Πριν από προσαρμογή χρόνου εμφάνισης</BeforeDisplayTimeAdjustment> + <DisplayTimeAdjustedX>Προσαρμοσμένος χρόνος εμφάνισης: {0}</DisplayTimeAdjustedX> + <DisplayTimesAdjustedX>Προσαρμοσμένοι χρόνοι εμφάνισης: {0}</DisplayTimesAdjustedX> + <StarTimeAdjustedX>Προσαρμοσμένος χρόνος έναρξης: {0}</StarTimeAdjustedX> + <BeforeCommonErrorFixes>Πριν από επιδιορθώσεις κοινών σφαλμάτων</BeforeCommonErrorFixes> + <CommonErrorsFixedInSelectedLines>Επιδιορθώσεις κοινών σφαλμάτων σε επιλεγμένες γραμμές</CommonErrorsFixedInSelectedLines> + <CommonErrorsFixed>Επιδιόρθωση κοινών σφαλμάτων</CommonErrorsFixed> + <BeforeRenumbering>Πριν επαναρίθμησης</BeforeRenumbering> + <RenumberedStartingFromX>Έναρξη επαναρίθμησης από: {0}</RenumberedStartingFromX> + <BeforeRemovalOfTextingForHearingImpaired>Πριν από αφαίρεση κειμένου για κωφούς</BeforeRemovalOfTextingForHearingImpaired> + <TextingForHearingImpairedRemovedOneLine>Αφαίρεση κειμένου για κωφούς: Μία γραμμή</TextingForHearingImpairedRemovedOneLine> + <TextingForHearingImpairedRemovedXLines>Αφαίρεση κειμένου για κωφούς: {0} γραμμή(ές)</TextingForHearingImpairedRemovedXLines> + <SubtitleSplitted>Διαχώριση υποτίτλου</SubtitleSplitted> + <SubtitleAppendPrompt>Προσάρτηση υποτίτλου στον φορτωμένο υπότιτλο που ίσως +είναι ήδη συγχρονισμένος με το αρχείο βίντεο. Συνέχιση;</SubtitleAppendPrompt> + <SubtitleAppendPromptTitle>Προσάρτηση υπότιτλου</SubtitleAppendPromptTitle> + <OpenSubtitleToAppend>Άνοιγμα υπότιτλου για προσάρτηση...</OpenSubtitleToAppend> + <AppendViaVisualSyncTitle>Οπτικός συγχρονισμός - προσάρτηση δεύτερου μέρους υπότιτλου</AppendViaVisualSyncTitle> + <AppendSynchronizedSubtitlePrompt>Προσάρτηση του συγχρονισμένου υπότιτλου;</AppendSynchronizedSubtitlePrompt> + <BeforeAppend>Πριν από προσάρτηση</BeforeAppend> + <SubtitleAppendedX>Προσάρτηση υποτίτλου: {0}</SubtitleAppendedX> + <SubtitleNotAppended>Μη προσάρτηση υποτίτλου!</SubtitleNotAppended> + <GoogleTranslate>Μετάφραση Google</GoogleTranslate> + <MicrosoftTranslate>Μετάφραση Bing</MicrosoftTranslate> + <BeforeGoogleTranslation>Πριν από μετάφραση Google</BeforeGoogleTranslation> + <SelectedLinesTranslated>Μετάφραση επιλεγμένων γρραμμών</SelectedLinesTranslated> + <SubtitleTranslated>Μετάφραση υποτίτλου</SubtitleTranslated> + <TranslateSwedishToDanish>Μετάφραση φορτωμένου σουηδικού υποτίτλου σε Δανικά</TranslateSwedishToDanish> + <TranslateSwedishToDanishWarning>Μετάφραση φορτωμένου σουηδικού (σίγουρα είναι σουηδικός;) υπότιτλου σε Δανικά;</TranslateSwedishToDanishWarning> + <TranslatingViaNikseDkMt>Μετάφραση μέσω www.nikse.dk/mt...</TranslatingViaNikseDkMt> + <BeforeSwedishToDanishTranslation>Πριν από μετάφραση Σουηδικών σε Δανικά</BeforeSwedishToDanishTranslation> + <TranslationFromSwedishToDanishComplete>Ολοκλήρωση μετάφρασης Σουηδικών σε Δανικά</TranslationFromSwedishToDanishComplete> + <TranslationFromSwedishToDanishFailed>Αποτυχία μετάφρασης Σουηδικών σε Δανικά</TranslationFromSwedishToDanishFailed> + <UndoPerformed>Εκτέλεση αναίρεσης</UndoPerformed> + <RedoPerformed>Εκτέλεση επανάληψης</RedoPerformed> + <NothingToUndo>Τίποτα για αναίρεση</NothingToUndo> + <InvalidLanguageNameX>Μη έγκυρο όνομα γλώσσας: {0}</InvalidLanguageNameX> + <DoNotDisplayMessageAgain>Απόκρυψη μηνύματος</DoNotDisplayMessageAgain> + <NumberOfCorrectedWords>Σύνολο διορθωμένων λέξεων: {0}</NumberOfCorrectedWords> + <NumberOfSkippedWords>Σύνολο παραλειπόμενων λέξεων: {0}</NumberOfSkippedWords> + <NumberOfCorrectWords>Σύνολο σωστών λέξεων: {0}</NumberOfCorrectWords> + <NumberOfWordsAddedToDictionary>Σύνολο πρόσθετων λέξεων στο λεξικό: {0}</NumberOfWordsAddedToDictionary> + <NumberOfNameHits>Σύνολο ευρέσεων ονομάτων: {0}</NumberOfNameHits> + <SpellCheck>Ορθογραφικός έλεγχος</SpellCheck> + <BeforeSpellCheck>Πριν από ορθογραφικό έλεγχο</BeforeSpellCheck> + <SpellCheckChangedXToY>Ορθογραφικός έλεγχος: Αλλαγή του '{0}' σε '{1}'</SpellCheckChangedXToY> + <BeforeAddingTagX>Πριν από προσθήκη ετικετών &lt;{0}&gt;</BeforeAddingTagX> + <TagXAdded>Προσθήκη &lt;{0}&gt; ετικέτας(ών)</TagXAdded> + <LineXOfY>γραμμή {0} από {1}</LineXOfY> + <XLinesSavedAsY>Αποθήκευση {0} γραμμής(ών) ως {1}</XLinesSavedAsY> + <XLinesDeleted>Διαγραφή {0} γραμμής(ών)</XLinesDeleted> + <BeforeDeletingXLines>Πριν από διαγραφή {0} γραμμών</BeforeDeletingXLines> + <DeleteXLinesPrompt>Διαγραφή {0:#,##0} γραμμών;</DeleteXLinesPrompt> + <OneLineDeleted>Διαγραφή μίας γραμμής</OneLineDeleted> + <BeforeDeletingOneLine>Πριν από διαγραφή μίας γραμμής</BeforeDeletingOneLine> + <DeleteOneLinePrompt>Διαγραφή μίας γραμμής;</DeleteOneLinePrompt> + <BeforeInsertLine>Πριν από εισαγωγή γραμμής</BeforeInsertLine> + <LineInserted>Εισαγωγή γραμμής</LineInserted> + <BeforeLineUpdatedInListView>Πριν από ενημέρωση γραμμής σε προβολή λίστας</BeforeLineUpdatedInListView> + <BeforeSplitLine>Πριν από διαχωρισμό γραμμής</BeforeSplitLine> + <LineSplitted>Διαχώριση γραμμής</LineSplitted> + <BeforeMergeLines>Πριν από συγχώνευση γραμμών</BeforeMergeLines> + <LinesMerged>Συγχώνευση γραμμών</LinesMerged> + <BeforeSettingColor>Πριν από ρύθμιση χρώματος</BeforeSettingColor> + <BeforeSettingFontName>Πριν από ρύθμιση ονόματος γραμματοσειράς</BeforeSettingFontName> + <BeforeTypeWriterEffect>Πριν από εφέ γραφομηχανής</BeforeTypeWriterEffect> + <BeforeKaraokeEffect>Πριν από εφέ καραόκε</BeforeKaraokeEffect> + <BeforeImportingDvdSubtitle>Πριν από εισαγωγή υποτίτλων από DVD</BeforeImportingDvdSubtitle> + <OpenMatroskaFile>Άνοιγμα αρχείου Matroska...</OpenMatroskaFile> + <MatroskaFiles>Αρχεία Matroska</MatroskaFiles> + <NoSubtitlesFound>Αδυναμία εύρεσης υποτίτλων</NoSubtitlesFound> + <NotAValidMatroskaFileX>Μη έγκυρο αρχείο Matroska: {0}</NotAValidMatroskaFileX> + <BlurayNotSubtitlesFound>Το αρχείο Blu-ray .sup δεν περιέχει υπότιτλους ή περιέχει σφάλματα - προσπαθήστε ξανά</BlurayNotSubtitlesFound> + <ImportingChapters>Εισαγωγή κεφαλαίων...</ImportingChapters> + <XChaptersImported>{0} εισαγωγή κεφαλαίου(ων)</XChaptersImported> + <ParsingMatroskaFile>Ανάλυση αρχείου Matroska. Παρακαλώ, περιμένετε...</ParsingMatroskaFile> + <ParsingTransportStreamFile>Ανάλυση αρχείου Trasport Stream. Παρακαλώ, περιμένετε...</ParsingTransportStreamFile> + <BeforeImportFromMatroskaFile>Πριν από εισαγωγή υπότιτλου από αρχείο Matroska</BeforeImportFromMatroskaFile> + <SubtitleImportedFromMatroskaFile>Εισαγωγή υποτίτλου από αρχείο Matroska</SubtitleImportedFromMatroskaFile> + <DropFileXNotAccepted>Απόρριψη συρμένου αρχείου '{0}' - το αρχείο είναι πολύ μεγάλο</DropFileXNotAccepted> + <DropOnlyOneFile>Μπορείτε να σύρετε μόνο ένα αρχείο</DropOnlyOneFile> + <OpenAnsiSubtitle>Άνοιγμα υπότιτλου...</OpenAnsiSubtitle> + <BeforeChangeCasing>Πριν από αλλαγή πεζών-κεφαλαίων</BeforeChangeCasing> + <CasingCompleteMessageNoNames>Σύνολο γραμμών με αλλαγή πεζών-κεφαλαίων: {0}/{1}</CasingCompleteMessageNoNames> + <CasingCompleteMessageOnlyNames>Σύνολο γραμμών με αλλαγή πεζών-κεφαλαίων με ονόματα: {0}/{1}</CasingCompleteMessageOnlyNames> + <CasingCompleteMessage>Σύνολο γραμμών με αλλαγή πεζών-κεφαλαίων: {0}/{1}, αλλαγή πεζών-κεφαλαίων με ονόματα: {2}</CasingCompleteMessage> + <BeforeChangeFrameRate>Πριν από αλλαγή ρυθμού καρέ</BeforeChangeFrameRate> + <BeforeAdjustSpeedInPercent>Πριν ρύθμισης της ταχύτητας σε ποσοστό</BeforeAdjustSpeedInPercent> + <FrameRateChangedFromXToY>Αλλαγή ρυθμού καρέ από {0} σε {1}</FrameRateChangedFromXToY> + <IdxFileNotFoundWarning>Αδυναμία εύρεσης {0}! Εισαγωγή αρχείου VobSub;</IdxFileNotFoundWarning> + <InvalidVobSubHeader>Μη έγκυρη κεφαλίδα του αρχείου VobSub: {0}</InvalidVobSubHeader> + <OpenVobSubFile>Άνοιγμα υπότιτλου VobSub (sub/idx)...</OpenVobSubFile> + <VobSubFiles>Αρχεία υποτίτλων VobSub</VobSubFiles> + <OpenBluRaySupFile>Άνοιγμα αρχείου Blu-ray .sup...</OpenBluRaySupFile> + <BluRaySupFiles>Αρχεία Blu-ray .sup</BluRaySupFiles> + <OpenXSubFiles>Άνοιγμα αρχείου XSub...</OpenXSubFiles> + <XSubFiles>Αρχεία XSub</XSubFiles> + <BeforeImportingVobSubFile>Πριν από εισαγωγή αρχείου VobSub</BeforeImportingVobSubFile> + <BeforeImportingBluRaySupFile>Πριν από εισαγωγή αρχείου Blu-ray sup</BeforeImportingBluRaySupFile> + <BeforeImportingBdnXml>Πριν από εισαγωγή αρχείου BDN xml</BeforeImportingBdnXml> + <BeforeShowSelectedLinesEarlierLater>Πριν από εμφάνιση γραμμών νωρίτερα/αργότερα</BeforeShowSelectedLinesEarlierLater> + <ShowAllLinesXSecondsLinesEarlier>Εμφάνιση όλων των γραμμών {0:0.0##} δευτερόλεπτα νωρίτερα</ShowAllLinesXSecondsLinesEarlier> + <ShowAllLinesXSecondsLinesLater>Εμφάνιση όλων των γραμμών {0:0.0##} δευτερόλεπτα αργότερα</ShowAllLinesXSecondsLinesLater> + <ShowSelectedLinesXSecondsLinesEarlier>Εμφάνιση γραμμών {0:0.0##} δευτερόλεπτα νωρίτερα</ShowSelectedLinesXSecondsLinesEarlier> + <ShowSelectedLinesXSecondsLinesLater>Εμφάνιση γραμμών {0:0.0##} δευτερόλεπτα αργότερα</ShowSelectedLinesXSecondsLinesLater> + <ShowSelectionAndForwardXSecondsLinesEarlier>Εμφάνιση επιλογής και προώθηση {0:0.0##} δευτερόλεπτα νωρίτερα</ShowSelectionAndForwardXSecondsLinesEarlier> + <ShowSelectionAndForwardXSecondsLinesLater>Εμφάνιση επιλογής και προώθηση {0:0.0##} δευτερόλεπτα αργότερα</ShowSelectionAndForwardXSecondsLinesLater> + <DoubleWordsViaRegEx>Διπλές λέξεις μέσω τυπικής έκφρασης {0}</DoubleWordsViaRegEx> + <BeforeSortX>Πριν από ταξινόμηση: {0}</BeforeSortX> + <SortedByX>Ταξινόμηση κατά: {0}</SortedByX> + <BeforeAutoBalanceSelectedLines>Πριν από αυτόματη ισορρόπιση γραμμών</BeforeAutoBalanceSelectedLines> + <NumberOfLinesAutoBalancedX>Σύνολο αυτόματων ισορροπημένων γραμμών: {0}</NumberOfLinesAutoBalancedX> + <BeforeRemoveLineBreaksInSelectedLines>Πριν από αφαίρεση διάσπασης επιλεγμένων γραμμών</BeforeRemoveLineBreaksInSelectedLines> + <NumberOfWithRemovedLineBreakX>Σύνολο γραμμών που αφαιρέθηκαν διασπάσεις γραμμής: {0}</NumberOfWithRemovedLineBreakX> + <BeforeMultipleReplace>Πριν από πολλαπλή αντικατάσταση</BeforeMultipleReplace> + <NumberOfLinesReplacedX>Σύνολο γραμμών αντικατεστημένου κειμένου: {0}</NumberOfLinesReplacedX> + <NameXAddedToNameList>Προσθήκη ονόματος '{0}' στη λίστα ονομάτων</NameXAddedToNameList> + <NameXNotAddedToNameList>Μη προσθήκη ονόματος '{0}' στη λίστα ονομάτων</NameXNotAddedToNameList> + <WordXAddedToUserDic>Προσθήκη λέξης '{0}' στο λεξικό χρήστη</WordXAddedToUserDic> + <WordXNotAddedToUserDic>Μη προσθήκη λέξης '{0}' στο λεξικό χρήστη</WordXNotAddedToUserDic> + <OcrReplacePairXAdded>Τα ζεύγη των λιστών αντικατάστασης του OCR '{0} -&gt; {1}' προστέθηκαν στις λίστες αντικατάστασης του OCR</OcrReplacePairXAdded> + <OcrReplacePairXNotAdded>Τα ζεύγη των λιστών αντικατάστασης του OCR '{0} -&gt; {1}' δεν προστέθηκαν στις λίστες αντικατάστασης του OCR</OcrReplacePairXNotAdded> + <XLinesSelected>Επιλογή {0} γραμμής(ών)</XLinesSelected> + <UnicodeMusicSymbolsAnsiWarning>Ο υπότιτλος περιέχει unicode μουσικές νότες. Αν αποθηκευτεί χρησιμοποιώντας κωδικοποίηση ANSI θα χαθούν. Συνέχιση αποθήκευσης;</UnicodeMusicSymbolsAnsiWarning> + <NegativeTimeWarning>Ο υπότιτλος περιέχει αρνητικούς κωδικούς χρόνου. Συνέχιση αποθήκευσης;</NegativeTimeWarning> + <BeforeMergeShortLines>Πριν από συγχώνευση μικρών γραμμών</BeforeMergeShortLines> + <MergedShortLinesX>Σύνολο συγχωνευμένων γραμμών: {0}</MergedShortLinesX> + <BeforeSplitLongLines>Πριν από διαχωρισμό μεγάλων γραμμών</BeforeSplitLongLines> + <LongLinesSplitX>Σύνολο διαχωρισμένων γραμμών: {0}</LongLinesSplitX> + <BeforeDurationsBridgeGap>Πριν την ένωση μικρών κενών</BeforeDurationsBridgeGap> + <BeforeSetMinimumDisplayTimeBetweenParagraphs>Πριν από ορισμό ελάχιστου χρόνου εμφάνισης μεταξύ υποτίτλων</BeforeSetMinimumDisplayTimeBetweenParagraphs> + <XMinimumDisplayTimeBetweenParagraphsChanged>Σύνολο γραμμών αλλαγής ελάχιστου χρόνου εμφάνισης μεταξύ υποτίτλων: {0}</XMinimumDisplayTimeBetweenParagraphsChanged> + <BeforeImportText>Πριν από εισαγωγή απλού κειμένου</BeforeImportText> + <TextImported>Εισαγωγή κειμένου</TextImported> + <BeforePointSynchronization>Πριν από συγχρονισμό σημείων</BeforePointSynchronization> + <PointSynchronizationDone>Ολοκλήρωση συγχρονισμού σημείων</PointSynchronizationDone> + <BeforeTimeCodeImport>Πριν από εισαγωγή κωδικών χρόνου</BeforeTimeCodeImport> + <TimeCodeImportedFromXY>Εισαγωγή κωδικών χρόνων από {0}: {1}</TimeCodeImportedFromXY> + <BeforeInsertSubtitleAtVideoPosition>Πριν από εισαγωγή υπότιτλου στη θέση βίντεο</BeforeInsertSubtitleAtVideoPosition> + <BeforeSetStartTimeAndOffsetTheRest>Πριν ορισμού χρόνου έναρξης και αντιστάθμισης</BeforeSetStartTimeAndOffsetTheRest> + <BeforeSetEndTimeAndOffsetTheRest>Πριν ορισμού χρόνου λήξης και αντιστάθμισης</BeforeSetEndTimeAndOffsetTheRest> + <BeforeSetEndAndVideoPosition>Πριν ορισμού χρόνου λήξης στη θέση βίντεο και αυτόματος υπολογισμός έναρξης</BeforeSetEndAndVideoPosition> + <ContinueWithCurrentSpellCheck>Συνέχιση τρέχοντος ορθογραφικού ελέγχου;</ContinueWithCurrentSpellCheck> + <CharactersPerSecond>Χαρακτήρες/δευτ.: {0:0.00}</CharactersPerSecond> + <GetFrameRateFromVideoFile>Λήψη ρυθμού καρέ από αρχείο βίντεο</GetFrameRateFromVideoFile> + <NetworkMessage>Νέο μήνυμα: {0} ({1}): {2}</NetworkMessage> + <NetworkUpdate>Ενημέρωση γραμμής: {0} ({1}): Δείκτης={2}, Κείμενο={3}</NetworkUpdate> + <NetworkInsert>Εισαγωγή γραμμής: {0} ({1}): Δείκτης={2}, Κείμενο={3}</NetworkInsert> + <NetworkDelete>Διαγραφή γραμμής: {0} ({1}): Δείκτης={2}</NetworkDelete> + <NetworkNewUser>Νέος χρήστης: {0} ({1})</NetworkNewUser> + <NetworkByeUser>Αντίο {0} ({1})</NetworkByeUser> + <NetworkUnableToConnectToServer>Αδυναμία σύνδεσης με τον διακομιστή: {0}</NetworkUnableToConnectToServer> + <UserAndAction>Χρήστης/ενέργεια</UserAndAction> + <NetworkMode>Λειτουργία δικτύου</NetworkMode> + <XStartedSessionYAtZ>{0}: Έναρξη συνεδρίας {1} στο {2}</XStartedSessionYAtZ> + <OpenOtherSubtitle>Άνοιγμα άλλου υπότιτλου</OpenOtherSubtitle> + <BeforeToggleDialogDashes>Πριν την εναλλαγή παυλών διαλόγου</BeforeToggleDialogDashes> + <ExportPlainTextAs>Εξαγωγή απλού αρχείου κειμένου ως</ExportPlainTextAs> + <TextFiles>Αρχεία κειμένου</TextFiles> + <SubtitleExported>Εξαγωγή υποτίτλου</SubtitleExported> + <LineNumberXErrorReadingFromSourceLineY>Γραμμή {0} - σφάλμα ανάγνωσης: {1}</LineNumberXErrorReadingFromSourceLineY> + <LineNumberXErrorReadingTimeCodeFromSourceLineY>Γραμμή {0} - σφάλμα ανάγνωσης κώδικα χρόνου: {1}</LineNumberXErrorReadingTimeCodeFromSourceLineY> + <LineNumberXExpectedNumberFromSourceLineY>Γραμμή {0} - αναμενόμενος αριθμός υποτίτλου: {1}</LineNumberXExpectedNumberFromSourceLineY> + <LineNumberXExpectedEmptyLine>Γραμμή {0} - αναμενόμενη κενή γραμμή, αλλά βρέθηκε αριθμός + κώδικας χρόνου (παραλειπόμενος αριθμός): {1}</LineNumberXExpectedEmptyLine> + <BeforeGuessingTimeCodes>Πριν τον υπολογισμό κωδικών χρόνου</BeforeGuessingTimeCodes> + <BeforeAutoDuration>Πριν την αυτόματη διάρκεια επιλεγμένων γραμμών</BeforeAutoDuration> + <BeforeColumnPaste>Πριν την επικόλληση στήλης</BeforeColumnPaste> + <BeforeColumnDelete>Πριν την διαγραφή στήλης</BeforeColumnDelete> + <BeforeColumnImportText>Πριν την εισαγωγή κειμένου στήλης</BeforeColumnImportText> + <BeforeColumnShiftCellsDown>Πριν την μετατόπιση των κελιών στήλης προς τα κάτω</BeforeColumnShiftCellsDown> + <BeforeX>Πριν: {0}</BeforeX> + <LinesUpdatedX>Ενημερωμένες γραμμές: {0}</LinesUpdatedX> + <ErrorLoadingPluginXErrorY>Σφάλμα φόρτωσης πρόσθετου: {0}: {1}</ErrorLoadingPluginXErrorY> + <BeforeRunningPluginXVersionY>Πριν την εκτέλεση πρόσθετου: {0}: {1}</BeforeRunningPluginXVersionY> + <UnableToReadPluginResult>Αδυναμία ανάγνωσης αποτελέσματος υποτίτλου από το πρόσθετο!</UnableToReadPluginResult> + <UnableToCreateBackupDirectory>Αδυναμία δημιουργίας φακέλου αντίγραφου ασφαλείας {0}: {1}</UnableToCreateBackupDirectory> + <BeforeDisplaySubtitleJoin>Πριν την ένωση υποτίτλων</BeforeDisplaySubtitleJoin> + <SubtitlesJoined>Ένωση υποτίτλων</SubtitlesJoined> + <StatusLog>Κατάσταση αρχείου καταγραφής</StatusLog> + <XSceneChangesImported>Εισαγωγή {0} αλλαγής(ών) σκηνής</XSceneChangesImported> + <PluginXExecuted>Εκτέλεση πρόσθετου '{0}'.</PluginXExecuted> + <NotAValidXSubFile>Μη έγκυρο αρχείο XSub!</NotAValidXSubFile> + <BeforeMergeLinesWithSameText>Πριν από συγχώνευση γραμμών ίδιου κειμένου</BeforeMergeLinesWithSameText> + <ImportTimeCodesDifferentNumberOfLinesWarning>Ο υπότιτλος με τους κώδικες χρόνου έχει διαφορετικό αριθμό γραμμών ({0}) από τον τρέχων υπότιτλο ({1}) - Συνέχιση;</ImportTimeCodesDifferentNumberOfLinesWarning> + <ParsingTransportStream>Ανάλυση αρχείου TS - παρακαλώ, περιμένετε...</ParsingTransportStream> + <XPercentCompleted>{0}%</XPercentCompleted> + <NextX>Επόμενο: {0}</NextX> + <PromptInsertSubtitleOverlap>Η εισαγωγή υπότιτλου στη θέση κυματομορφής θα προκαλέσει επικάλυψη! +Συνέχιση;</PromptInsertSubtitleOverlap> + <SubtitleContainsNegativeDurationsX>Εύρεση αρνητικής διάρκειας γραμμής(ών): {0}</SubtitleContainsNegativeDurationsX> + <SetPlayRateX>Ορισμός ρυθμού αναπαραγωγής σε {0}%</SetPlayRateX> + <ErrorLoadIdx>Αδυναμία ανάγνωσης/επεξεργασίας αρχείων .idx. Τα αρχεία .idx είναι μέλη από τα ζεύγη idx/sub αρχείων (γνωστά ως VobSub) και ο Subtitle Edit δεν μπορεί να ανοίξει αρχείο .sub.</ErrorLoadIdx> + <ErrorLoadRar>Πιθανό συμπιεσμένο αρχείο .rar. Το Subtitle Edit δεν μπορεί να ανοίξει συμπιεσμένα αρχεία.</ErrorLoadRar> + <ErrorLoadZip>Πιθανό συμπιεσμένο αρχείο .zip. Το Subtitle Edit δεν μπορεί να ανοίξει συμπιεσμένα αρχεία.</ErrorLoadZip> + <ErrorLoad7Zip>Πιθανό συμπιεσμένο αρχείο 7-Zip. Το Subtitle Edit δεν μπορεί να ανοίξει συμπιεσμένα αρχεία.</ErrorLoad7Zip> + <ErrorLoadPng>Πιθανό αρχείο εικόνας PNG. Το Subtitle Edit δεν μπορεί να ανοίξει αρχεία PNG.</ErrorLoadPng> + <ErrorLoadJpg>Πιθανό αρχείο εικόνας JPG. Το Subtitle Edit δεν μπορεί να ανοίξει αρχεία JPG.</ErrorLoadJpg> + <ErrorLoadSrr>Πιθανό αρχείο .srr - όχι αρχείο υπότιτλου.</ErrorLoadSrr> + <ErrorLoadTorrent>Πιθανό αρχείο BitTorrent - όχι αρχείο υπότιτλου.</ErrorLoadTorrent> + <ErrorLoadBinaryZeroes>Συγγνώμη, το αρχείο περιέχει μόνο δυαδικά μηδενικά! +Αν είναι επεξεργασμένο με το Subtitle Edit, ίσως βρείτε αντίγραφο ασφαλείας μέσω της επιλογής Αρχείο -&gt; Επαναφορά αντίγραφου ασφαλείας...</ErrorLoadBinaryZeroes> + <ErrorDirectoryDropNotAllowed>Το σύρσιμο φακέλων δεν υποστηρίζεται.</ErrorDirectoryDropNotAllowed> + <NoSupportEncryptedVobSub>Το κρυπτογραφημένο περιεχόμενο VobSub δεν υποστηρίζεται.</NoSupportEncryptedVobSub> + <NoSupportHereBluRaySup>Τα αρχεία Blu-ray sup δεν υποστηρίζονται.</NoSupportHereBluRaySup> + <NoSupportHereDvdSup>Τα αρχεία DVD sup δεν υποστηρίζονται.</NoSupportHereDvdSup> + <NoSupportHereVobSub>Τα αρχεία VoSub δεν υποστηρίζονται.</NoSupportHereVobSub> + <NoSupportHereDivx>Τα αρχεία Divx δεν υποστηρίζονται.</NoSupportHereDivx> + <NoChapters>Αδυναμία εύρεσης κεφαλαίων βίντεο.</NoChapters> + </Main> + <MatroskaSubtitleChooser> + <Title>Επιλογή υπότιτλου από αρχείο Matroska</Title> + <TitleMp4>Επιλογή υπότιτλου από αρχείο MP4</TitleMp4> + <PleaseChoose>Βρέθηκαν περισσότεροι από έναν υπότιτλο - παρακαλώ, επιλέξτε</PleaseChoose> + <TrackXLanguageYTypeZ>Κομμάτι {0} - γλώσσα: {1} - τύπος: {2}</TrackXLanguageYTypeZ> + </MatroskaSubtitleChooser> + <MeasurementConverter> + <Title>Μετατροπέας μονάδων μέτρησης</Title> + <ConvertFrom>Μετατροπή από</ConvertFrom> + <ConvertTo>Μετατροπή σε</ConvertTo> + <CopyToClipboard>Αντιγραφή στο πρόχειρο</CopyToClipboard> + <Length>Μήκος</Length> + <Mass>Μάζα</Mass> + <Volume>Όγκος</Volume> + <Area>Έκταση</Area> + <Time>Χρόνος</Time> + <Temperature>Θερμοκρασία</Temperature> + <Velocity>Ταχύτητα</Velocity> + <Force>Ισχύς</Force> + <Energy>Ενέργεια</Energy> + <Power>Ρεύμα</Power> + <Pressure>Πίεση</Pressure> + <Kilometers>Χιλιόμετρα</Kilometers> + <Meters>Μέτρα</Meters> + <Centimeters>Εκατοστά</Centimeters> + <Millimeters>Χιλιοστά</Millimeters> + <Micrometers>Μικρόμετρα</Micrometers> + <Nanometers>Νανόμετρα</Nanometers> + <Angstroms>Άνγκστρομα</Angstroms> + <MilesTerrestial>Μίλια</MilesTerrestial> + <MilesNautical>Ναυτικά μίλια</MilesNautical> + <Yards>Γιάρδες</Yards> + <Feet>Πόδια</Feet> + <Inches>Ίντσες</Inches> + <Chains>Τσέιν (μήκος)</Chains> + <Fathoms>Οργιές</Fathoms> + <Hands>Δείκτες</Hands> + <Rods>Ράβδοι</Rods> + <Spans>Ανοίγματα</Spans> + <LongTonnes>Τόνοι (ΗΒ)</LongTonnes> + <ShortTonnes>Τόνοι (ΗΠΑ)</ShortTonnes> + <Tonnes>Τόνοι</Tonnes> + <Kilos>Κιλά</Kilos> + <Grams>Γραμμάρια</Grams> + <Milligrams>Χιλιόγραμμα</Milligrams> + <Micrograms>Μικρογραμμάρια</Micrograms> + <Pounds>Λίβρες</Pounds> + <Ounces>Ουγγιές</Ounces> + <Carats>Καράτια</Carats> + <Drams>Δράμια</Drams> + <Grains>Κόκοι</Grains> + <Stones>Κιλά (βάρος σώματος)</Stones> + <CubicKilometers>Κυβικά χιλιόμετρα</CubicKilometers> + <CubicMeters>Κυβικά μέτρα</CubicMeters> + <Litres>Λίτρα</Litres> + <CubicCentimeters>Κυβικά εκατοστά</CubicCentimeters> + <CubicMillimeters>Κυβικά χιλιοστά</CubicMillimeters> + <CubicMiles>Κυβικά μίλια</CubicMiles> + <CubicYards>Κυβικές γιάρδες</CubicYards> + <CubicFTs>Κυβικά πόδια</CubicFTs> + <CubicInches>Κυβικές ίντσες</CubicInches> + <OilBarrels>Βαρέλια πετρελαίου</OilBarrels> + <GallonUS>Γαλόνι (ΗΠΑ)</GallonUS> + <QuartsUS>Λίτρα (ΗΠΑ)</QuartsUS> + <PintsUS>Πίντες (ΗΠΑ)</PintsUS> + <FluidOuncesUS>Ουγγιές υγρών (ΗΠΑ)</FluidOuncesUS> + <Bushels>Μόδια</Bushels> + <Pecks>Πεκς (μονάδα μέτρησης στερεών)</Pecks> + <GallonsUK>Γαλόνια (ΗΒ)</GallonsUK> + <QuartsUK>Λίτρα (ΗΒ)</QuartsUK> + <PintsUK>Πίντες (ΗΒ)</PintsUK> + <FluidOuncesUK>Ουγγιές υγρών (ΗΒ)</FluidOuncesUK> + <SquareKilometers>Τετραγωνικά χιλιόμετρα</SquareKilometers> + <SquareMeters>Τετραγωνικά μέτρα</SquareMeters> + <SquareCentimeters>Τετραγωνικά εκατοστά</SquareCentimeters> + <SquareMillimeters>Τετραγωνικά χιλιοστά</SquareMillimeters> + <SquareMiles>Τετραγωνικά μίλια</SquareMiles> + <SquareYards>Τετραγωνικές γιάρδες</SquareYards> + <SquareFTs>Τετραγωνικά πόδια</SquareFTs> + <SquareInches>Τετραγωνικές ίντσες</SquareInches> + <Hectares>Εκτάρια</Hectares> + <Acres>Στρέμματα</Acres> + <Ares>Άρια</Ares> + <Hours>¨Ωρες</Hours> + <Minutes>Λεπτά</Minutes> + <Seconds>Δευτερόλεπτα</Seconds> + <Milliseconds>Χιλιοστά δευτερολέπτου</Milliseconds> + <Microseconds>Μικροδευτερόλεπτα</Microseconds> + <Fahrenheit>Φαρενάιτ</Fahrenheit> + <Celsius>Κελσίου</Celsius> + <Kelvin>Κέλβιν</Kelvin> + <KilometersPerHour>Χλμ/ώρα</KilometersPerHour> + <MetersPerSecond>Μέτρα/δευτερόλεπτο</MetersPerSecond> + <MilesPerHour>Μίλια/ώρα</MilesPerHour> + <YardsPerMinute>Γιάρδες/λεπτό</YardsPerMinute> + <FTsPerSecond>Πόδια/δευτερόλεπτο</FTsPerSecond> + <Knots>Κόμβοι</Knots> + <PoundsForce>Λίβρες ισχύος</PoundsForce> + <Newtons>Νιούτον</Newtons> + <KilosForce>Κιλά ισχύος</KilosForce> + <Jouls>Τζάουλ</Jouls> + <Calories>Θερμίδες</Calories> + <Ergs>Έργια</Ergs> + <ElectronVolts>Ηλεκτρονιοβόλτ</ElectronVolts> + <Btus>BTU</Btus> + <Watts>Βατ</Watts> + <Horsepower>Ιπποδύναμη</Horsepower> + <Atmospheres>Ατμόσφαιρες</Atmospheres> + <Bars>Μπαρ</Bars> + <Pascals>Πασκάλ</Pascals> + <MillimetersOfMercury>Χιλιοστά υδραργύρου (πίεση)</MillimetersOfMercury> + <PoundPerSquareInch>Λίβρες ισχύος ανά τετραγωνική ίντσα</PoundPerSquareInch> + <KilogramPerSquareCentimeter>Κιλά ισχύος ανά τετραγωνικό εκατοστό</KilogramPerSquareCentimeter> + <KiloPascals>Κιλοπασκάλ</KiloPascals> + </MeasurementConverter> + <MergeDoubleLines> + <Title>Συγχώνευση γραμμών με ίδιο κείμενο</Title> + <MaxMillisecondsBetweenLines>Μέγιστα χιλ. δευτερολέπτου μεταξύ των γραμμών</MaxMillisecondsBetweenLines> + <IncludeIncrementing>Συμπερίληψη προσαυξημένων γραμμών</IncludeIncrementing> + </MergeDoubleLines> + <MergedShortLines> + <Title>Συγχώνευση μικρών γραμμών</Title> + <MaximumCharacters>Μέγιστος αριθμός χαρακτήρων ανα παράγραφο</MaximumCharacters> + <MaximumMillisecondsBetween>Μέγιστος αριθμός χιλ. δευτερολέπτου μεταξύ των γραμμών</MaximumMillisecondsBetween> + <NumberOfMergesX>Σύνολο συγχωνεύσεων: {0}</NumberOfMergesX> + <MergedText>Συγχωνευμένο κείμενο</MergedText> + <OnlyMergeContinuationLines>Συγχώνευση μόνο συνεχόμενων γραμμών</OnlyMergeContinuationLines> + </MergedShortLines> + <MergeTextWithSameTimeCodes> + <Title>Συγχώνευση γραμμών με ίδιους κωδικούς χρόνου</Title> + <MaxDifferenceMilliseconds>Μέγιστη διαφορά χιλιοστών δευτερολέπτου</MaxDifferenceMilliseconds> + <ReBreakLines>Επαναδιάσπαση γραμμών</ReBreakLines> + <NumberOfMergesX>Αριθμός συγχωνεύσεων: {0}</NumberOfMergesX> + <MergedText>Συγχωνευμένο κείμενο</MergedText> + </MergeTextWithSameTimeCodes> + <ModifySelection> + <Title>Επεξεργασία επιλογής</Title> + <Rule>Κανόνας</Rule> + <CaseSensitive>Διάκριση πεζών</CaseSensitive> + <DoWithMatches>Ενέργεια με τις αντιστοιχίες</DoWithMatches> + <MakeNewSelection>Δημιουργία νέας επιλογής</MakeNewSelection> + <AddToCurrentSelection>Προσθήκη στην τρέχουσα επιλογή</AddToCurrentSelection> + <SubtractFromCurrentSelection>Αφαίρεση από την τρέχουσα επιλογή</SubtractFromCurrentSelection> + <IntersectWithCurrentSelection>Διασταύρωση με την τρέχουσα επιλογή</IntersectWithCurrentSelection> + <MatchingLinesX>Γραμμές που ταιριάζουν: {0}</MatchingLinesX> + <Contains>Περιέχει</Contains> + <StartsWith>Ξεκινά με</StartsWith> + <EndsWith>Τελειώνει με</EndsWith> + <NoContains>Δεν περιέχει</NoContains> + <RegEx>Τυπική έκφραση</RegEx> + <UnequalLines>Άνισες γραμμές</UnequalLines> + <EqualLines>Ίσες γραμμές</EqualLines> + <DurationLessThan>Διάρκεια μικρότερη από</DurationLessThan> + <DurationGreaterThan>Διάρκεια μεγαλύτερη από</DurationGreaterThan> + <MoreThanTwoLines>Πάνω από δύο γραμμές</MoreThanTwoLines> + </ModifySelection> + <MultipleReplace> + <Title>Πολλαπλή αντικατάσταση</Title> + <FindWhat>Εύρεση του</FindWhat> + <ReplaceWith>Αντικατάσταση με</ReplaceWith> + <Normal>Κανονική</Normal> + <CaseSensitive>Διάκριση πεζών-κεφαλαίων</CaseSensitive> + <RegularExpression>Τυπική έκφραση</RegularExpression> + <Description>Περιγραφή</Description> + <LinesFoundX>Γραμμές που βρέθηκαν: {0}</LinesFoundX> + <Remove>Αφαίρεση</Remove> + <Add>Προσθήκη</Add> + <Update>&amp;Ενημέρωση</Update> + <Enabled>Ενεργοποίηση</Enabled> + <SearchType>Τύπος αναζήτησης</SearchType> + <RemoveAll>Αφαίρεση όλων</RemoveAll> + <Import>Εισαγωγή...</Import> + <Export>Εξαγωγή...</Export> + <ImportRulesTitle>Εισαγωγή κανόνων αντικατάστασης από...</ImportRulesTitle> + <ExportRulesTitle>Εξαγωγή κανόνων αντικατάστασης σε...</ExportRulesTitle> + <ChooseGroupsToImport>Επιλογή ομάδων εισαγωγής</ChooseGroupsToImport> + <ChooseGroupsToExport>Επιλογή ομάδων εξαγωγής</ChooseGroupsToExport> + <Rules>Εξαγωγή κανόνων</Rules> + <MoveToTop>Νετακίνηση στην κορυφή</MoveToTop> + <MoveToBottom>Μετακίνηση στο τέλος</MoveToBottom> + <MoveSelectedRulesToGroup>Μετακίνηση επιλεγμένων κανόνων στην ομάδα</MoveSelectedRulesToGroup> + <Groups>Ομάδες</Groups> + <RulesForGroupX>Κανόνες ομάδας "{0}"</RulesForGroupX> + <GroupName>Όνομα ομάδας</GroupName> + <RenameGroup>Μετονομασία ομάδας...</RenameGroup> + <NewGroup>Νέα ομάδα...</NewGroup> + <NothingToImport>Τίποτα προς εισαγωγή</NothingToImport> + </MultipleReplace> + <NetworkChat> + <Title>Συνομιλία</Title> + <Send>Αποστολή</Send> + </NetworkChat> + <NetworkJoin> + <Title>Συμμετοχή σε δικτυακή συνεδρία</Title> + <Information>Συμμετοχή σε υπάρχουσα συνεδρία όπου πολλά άτομα +μπορούν να επεξεργαστούν το ίδιο αρχείο υπότιτλου (συνεργασία)</Information> + <Join>Συμμετοχή</Join> + </NetworkJoin> + <NetworkLogAndInfo> + <Title>Πληροφορίες και καταγραφή συνεδρίας</Title> + <Log>Αρχείο καταγραφής:</Log> + </NetworkLogAndInfo> + <NetworkStart> + <Title>Έναρξη δικτυακής συνεδρίας</Title> + <ConnectionTo>Σύνδεση με {0}...</ConnectionTo> + <Information>Έναρξη νέας συνεδρίας όπου πολλά άτομα +μπορούν να επεξεργαστούν το ίδιο αρχείο υπότιτλου (συνεργασία)</Information> + <Start>Έναρξη</Start> + </NetworkStart> + <OpenVideoDvd> + <Title>Άνοιγμα DVD με το VLC</Title> + <OpenDvdFrom>Άνοιγμα DVD με...</OpenDvdFrom> + <Disc>Δίσκος</Disc> + <Folder>Φάκελος</Folder> + <ChooseDrive>Επιλογή οδηγού</ChooseDrive> + <ChooseFolder>Επιλογή φακέλου</ChooseFolder> + </OpenVideoDvd> + <PluginsGet> + <Title>Πρόσθετα</Title> + <InstalledPlugins>Εγκαταστημένα πρόσθετα</InstalledPlugins> + <GetPlugins>Λήψη πρόσθετων</GetPlugins> + <Description>Περιγραφή</Description> + <Version>Έκδοση</Version> + <Date>Ημερομηνία</Date> + <Type>Τύπος</Type> + <OpenPluginsFolder>Άνοιγμα φακέλου 'Plugins'</OpenPluginsFolder> + <GetPluginsInfo1>Λήψη πρόσθετων του Subtitle Edit στον φάκελο 'Plugins'</GetPluginsInfo1> + <GetPluginsInfo2>Επιλογή πρόσθετου και κάντε κλικ στο 'Λήψη'</GetPluginsInfo2> + <PluginXDownloaded>Λήψη πρόσθετου {0}</PluginXDownloaded> + <Download>&amp;Λήψη</Download> + <Remove>&amp;Αφαίρεση</Remove> + <UpdateAllX>Ενημέρωση όλων ({0})</UpdateAllX> + <UnableToDownloadPluginListX>Αδυναμία λήψης λίστας πρόσθετων: {0}</UnableToDownloadPluginListX> + <NewVersionOfSubtitleEditRequired>Απαιτείται νεότερη έκδοση του Subtitle Edit!</NewVersionOfSubtitleEditRequired> + <UpdateAvailable>[Διαθέσιμη ενημέρωση!]</UpdateAvailable> + <UpdateAll>Ενημέρωση όλων</UpdateAll> + <XPluginsUpdated>{0} πρόσθετο/α ενημερώθηκαν</XPluginsUpdated> + </PluginsGet> + <RegularExpressionContextMenu> + <WordBoundary>Όριο λέξης (\b)</WordBoundary> + <NonWordBoundary>Δίχως όριο λέξης (\B)</NonWordBoundary> + <NewLine>Νέα γραμμή (\r\n)</NewLine> + <NewLineShort>Νέα γραμμή (\n)</NewLineShort> + <AnyDigit>Οποιοδήποτε ψηφίο (\d)</AnyDigit> + <NonDigit>Μη ψηφίο (\D)</NonDigit> + <AnyCharacter>Οποιοσδήποτε χαρακτήρας (.)</AnyCharacter> + <AnyWhitespace>Οποιοδήποτε κενό (\s)</AnyWhitespace> + <NonSpaceCharacter>Μη χαρακτήρας κενού (\S)</NonSpaceCharacter> + <ZeroOrMore>Μηδέν ή περισσότερα (*)</ZeroOrMore> + <OneOrMore>Ένα ή περισσότερα (+)</OneOrMore> + <InCharacterGroup>Στο σύνολο χαρακτήρων ([δοκιμή])</InCharacterGroup> + <NotInCharacterGroup>Όχι στο σύνολο χαρακτήρων ([^δοκιμή])</NotInCharacterGroup> + </RegularExpressionContextMenu> + <RemoveTextFromHearImpaired> + <Title>Αφαίρεση κειμένου για κωφούς</Title> + <RemoveTextConditions>Αφαίρεση συνθηκών κειμένου</RemoveTextConditions> + <RemoveTextBetween>Αφαίρεση κειμένου μεταξύ</RemoveTextBetween> + <SquareBrackets>'[' και ']'</SquareBrackets> + <Brackets>'{' και '}'</Brackets> + <Parentheses>'(' και ')'</Parentheses> + <QuestionMarks>'?' και '?'</QuestionMarks> + <And>και</And> + <RemoveTextBeforeColon>Αφαίρεση κειμένου πριν άνω και κάτω τελείας (':')</RemoveTextBeforeColon> + <OnlyIfTextIsUppercase>Μόνο κείμενο σε κεφαλαία</OnlyIfTextIsUppercase> + <OnlyIfInSeparateLine>Μόνο σε ξεχωριστή γραμμή</OnlyIfInSeparateLine> + <LinesFoundX>Εύρεση γραμμής(ών): {0}</LinesFoundX> + <RemoveTextIfContains>Αφαίρεση κειμένου εάν περιέχει:</RemoveTextIfContains> + <RemoveTextIfAllUppercase>Αφαίρεση γραμμής με κεφαλαία</RemoveTextIfAllUppercase> + <RemoveInterjections>Αφαίρεση επιφωνημάτων</RemoveInterjections> + <EditInterjections>Επεξεργασία...</EditInterjections> + </RemoveTextFromHearImpaired> + <ReplaceDialog> + <Title>Αντικατάσταση</Title> + <FindWhat>Εύρεση του:</FindWhat> + <Normal>Κανονική</Normal> + <CaseSensitive>Διάκριση πεζών-κεφαλαίων</CaseSensitive> + <RegularExpression>Τυπική έκφραση</RegularExpression> + <ReplaceWith>Αντικατάσταση με</ReplaceWith> + <Find>&amp;Εύρεση</Find> + <Replace>&amp;Αντικατάσταση</Replace> + <ReplaceAll>Αντικατάσταση ό&amp;λων</ReplaceAll> + </ReplaceDialog> + <RestoreAutoBackup> + <Title>Επαναφορά αντιγράφων ασφαλείας</Title> + <Information>Άνοιγμα αντιγράφων ασφαλείας</Information> + <DateAndTime>Ημερομηνία</DateAndTime> + <FileName>Όνομα αρχείου</FileName> + <Extension>Επέκταση</Extension> + <NoBackedUpFilesFound>Αδυναμία εύρεσης αντιγράφων ασφαλείας!</NoBackedUpFilesFound> + </RestoreAutoBackup> + <SeekSilence> + <Title>Αναζήτηση σιωπής</Title> + <SearchDirection>Κατεύθυνση αναζήτησης</SearchDirection> + <Forward>Εμπρός</Forward> + <Back>Πίσω</Back> + <LengthInSeconds>Ελάχιστη σιωπή (δευτερόλεπτα)</LengthInSeconds> + <MaxVolume>Ένταση ήχου κάτω από</MaxVolume> + </SeekSilence> + <SetMinimumDisplayTimeBetweenParagraphs> + <Title>Ορισμός ελάχιστου κενού υπότίτλων</Title> + <PreviewLinesModifiedX>Προεπισκόπηση - τροποποιημένοι υπότιτλοι: {0}</PreviewLinesModifiedX> + <ShowOnlyModifiedLines>Εμφάνιση μόνο τροποποιημένων γραμμών</ShowOnlyModifiedLines> + <MinimumMillisecondsBetweenParagraphs>Ελάχιστα χιλ. δευτερολέπτου μεταξύ γραμμών</MinimumMillisecondsBetweenParagraphs> + <FrameInfo>Πληροφορίες ρυθμού καρέ</FrameInfo> + <Frames>Καρέ</Frames> + <XFrameYisZMilliseconds>{0} καρέ στα {1} καρέ/δευτερόλεπτο είναι {2} χιλ. του δευτερολέπτου</XFrameYisZMilliseconds> + </SetMinimumDisplayTimeBetweenParagraphs> + <SetSyncPoint> + <Title>Ορισμός σημείου συγχρονισμού για τη γραμμή {0}</Title> + <SyncPointTimeCode>Κωδικός χρόνου σημείου συγχρονισμού</SyncPointTimeCode> + <ThreeSecondsBack>&lt;&lt; 3 δευτ.</ThreeSecondsBack> + <HalfASecondBack>&lt;&lt; ½ δευτ.</HalfASecondBack> + <HalfASecondForward>½ δευτ. &gt;&gt;</HalfASecondForward> + <ThreeSecondsForward>3 δευτ. &gt;&gt;</ThreeSecondsForward> + </SetSyncPoint> + <Settings> + <Title>Ρυθμίσεις</Title> + <General>Γενικά</General> + <Toolbar>Γραμμή εργαλείων</Toolbar> + <VideoPlayer>Πρόγραμμα αναπαραγωγής</VideoPlayer> + <WaveformAndSpectrogram>Κυματομορφή/φασματογράφημα</WaveformAndSpectrogram> + <Tools>Εργαλεία</Tools> + <WordLists>Λίστες λέξεων</WordLists> + <SsaStyle>Στυλ ASS/SSA</SsaStyle> + <Network>Δίκτυο</Network> + <Rules>Κανόνες</Rules> + <ShowToolBarButtons>Εμφάνιση κουμπιών της γραμμής εργαλείων</ShowToolBarButtons> + <New>Νέο</New> + <Open>Άνοιγμα</Open> + <Save>Αποθήκευση</Save> + <SaveAs>Αποθήκευση ως</SaveAs> + <Find>Εύρεση</Find> + <Replace>Αντικατάσταση</Replace> + <VisualSync>Οπτικός συγχρονισμός</VisualSync> + <SpellCheck>Ορθογραφικός έλεγχος</SpellCheck> + <NetflixQualityCheck>Έλεγχος ποιότητας Netflix</NetflixQualityCheck> + <SettingsName>Ρυθμίσεις</SettingsName> + <Help>Βοήθεια</Help> + <UnbreakNoSpace>Συνένωση χωρίς κενό (CJK)</UnbreakNoSpace> + <ToggleBookmarks>Εναλλαγή σημειώσεων</ToggleBookmarks> + <ToggleBookmarksWithComment>Εναλλαγή σημειώσεων - προσθήκη σχόλιου</ToggleBookmarksWithComment> + <ClearBookmarks>Καθαρισμός σημειώσεων</ClearBookmarks> + <GoToBookmark>Μετάβαση σε σημείωση</GoToBookmark> + <GoToPreviousBookmark>Προηγούμενη σημείωση</GoToPreviousBookmark> + <GoToNextBookmark>Επόμενη σημείωση</GoToNextBookmark> + <ChooseProfile>Επιλογή προφίλ</ChooseProfile> + <DuplicateLine>Αντιγραφή γραμμής</DuplicateLine> + <FontInUi>Γραμματοσειρά γραφικού περιβάλλοντος</FontInUi> + <ShowFrameRate>Εμφάνιση ρυθμού καρέ στη γραμμή εργαλείων</ShowFrameRate> + <DefaultFrameRate>Προεπιλεγμένος ρυθμός καρέ</DefaultFrameRate> + <DefaultFileEncoding>Προεπιλεγμένη κωδικοποίηση</DefaultFileEncoding> + <AutoDetectAnsiEncoding>Ανίχνευση κωδικοποίησης ANSI</AutoDetectAnsiEncoding> + <Profile>Προφίλ</Profile> + <Profiles>Προφίλ</Profiles> + <ImportProfiles>Εισαγωγή</ImportProfiles> + <ExportProfiles>Εξαγωγή</ExportProfiles> + <SubtitleLineMaximumLength>Μέγιστο μήκος γραμμής</SubtitleLineMaximumLength> + <OptimalCharactersPerSecond>Βέλτιστοι χαρακτήρες/δευτερόλεπτο</OptimalCharactersPerSecond> + <MaximumCharactersPerSecond>Μέγιστοι χαρακτήρες/δευτερόλεπτο</MaximumCharactersPerSecond> + <MaximumWordssPerMinute>Μέγιστος αριθμός λέξεων/λεπτό</MaximumWordssPerMinute> + <AutoWrapWhileTyping>Αυτόματη διάσπαση</AutoWrapWhileTyping> + <DurationMinimumMilliseconds>Ελάχιστη διάρκεια, χιλ. δευτερολέπτου</DurationMinimumMilliseconds> + <DurationMaximumMilliseconds>Μέγιστη διάρκεια, χιλ. δευτερολέπτου</DurationMaximumMilliseconds> + <MinimumGapMilliseconds>Ελάχιστο κενό σε χιλ. δευτ.</MinimumGapMilliseconds> + <MaximumLines>Μέγιστος αριθμός γραμμών</MaximumLines> + <SubtitleFont>Γραμματοσειρά υποτίτλου</SubtitleFont> + <SubtitleFontSize>Μέγεθος γραμματοσειράς</SubtitleFontSize> + <SubtitleBold>Έντονα</SubtitleBold> + <VideoAutoOpen>Αυτόματο άνοιγμα βίντεο με υπότιτλο</VideoAutoOpen> + <AllowVolumeBoost>Ώθηση ήχου</AllowVolumeBoost> + <SubtitleCenter>Κέντρο</SubtitleCenter> + <SubtitleFontColor>Χρώμα γραμματοσειράς υποτίτλου</SubtitleFontColor> + <SubtitleBackgroundColor>Χρώμα φόντου υποτίτλου</SubtitleBackgroundColor> + <SpellChecker>Ορθογραφικός έλεγκτής</SpellChecker> + <RememberRecentFiles>Εμφάνιση πρόσφατων αρχείων</RememberRecentFiles> + <StartWithLastFileLoaded>Έναρξη με φόρτωση τελευταίου αρχείου</StartWithLastFileLoaded> + <RememberSelectedLine>Απομνημόνευση γραμμής</RememberSelectedLine> + <RememberPositionAndSize>Απομνημόνευση θέσης και μεγέθους κύριου παραθύρου</RememberPositionAndSize> + <StartInSourceView>Έναρξη σε προβολή πηγής</StartInSourceView> + <RemoveBlankLinesWhenOpening>Αφαίρεση κενών γραμμών κατά το άνοιγμα</RemoveBlankLinesWhenOpening> + <ShowLineBreaksAs>Εμφάνιση διασπάσεων σε προβολή λίστας ως</ShowLineBreaksAs> + <SaveAsFileNameFrom>Η "Αποθήκευση ως..." έχει το όνομα από</SaveAsFileNameFrom> + <MainListViewDoubleClickAction>Ενέργεια διπλού κλικ σε γραμμή στο κύριο παράθυρο προβολής λίστας</MainListViewDoubleClickAction> + <MainListViewColumnsInfo>Επιλογή ορατής λίστας προβολής στηλών</MainListViewColumnsInfo> + <MainListViewNothing>Τίποτα</MainListViewNothing> + <MainListViewVideoGoToPositionAndPause>Μετάβαση σε θέση βίντεο και παύση</MainListViewVideoGoToPositionAndPause> + <MainListViewVideoGoToPositionAndPlay>Μετάβαση σε θέση βίντεο και αναπαραγωγή</MainListViewVideoGoToPositionAndPlay> + <MainListViewEditText>Μετάβαση στο πλαίσιο επεξεργασίας κειμένου</MainListViewEditText> + <MainListViewVideoGoToPositionMinus1SecAndPause>Πήγαινε στη θέση βίντεο - 1 δευτ. και παύση</MainListViewVideoGoToPositionMinus1SecAndPause> + <MainListViewVideoGoToPositionMinusHalfSecAndPause>Πήγαινε στη θέση βίντεο - 0.5 δευτ. και παύση</MainListViewVideoGoToPositionMinusHalfSecAndPause> + <MainListViewVideoGoToPositionMinus1SecAndPlay>Πήγαινε στη θέση βίντεο - 1 δευτ. και αναπαραγωγή</MainListViewVideoGoToPositionMinus1SecAndPlay> + <MainListViewEditTextAndPause>Μετάβαση σε επεξαργασία πλαίσιου κειμένου και παύση στη θέση</MainListViewEditTextAndPause> + <VideoFileName>Όνομα αρχείου βίντεο</VideoFileName> + <ExistingFileName>Υπάρχον όνομα</ExistingFileName> + <AutoBackup>Aντίγραφα ασφαλείας</AutoBackup> + <AutoBackupEveryMinute>Κάθε 1 λεπτό</AutoBackupEveryMinute> + <AutoBackupEveryFiveMinutes>Κάθε 5 λεπτά</AutoBackupEveryFiveMinutes> + <AutoBackupEveryFifteenMinutes>Κάθε 15 λεπτά</AutoBackupEveryFifteenMinutes> + <AutoBackupDeleteAfter>Διαγραφή σε</AutoBackupDeleteAfter> + <AutoBackupDeleteAfterOneMonth>1 μήνα</AutoBackupDeleteAfterOneMonth> + <AutoBackupDeleteAfterThreeMonths>3 μήνες</AutoBackupDeleteAfterThreeMonths> + <AutoBackupDeleteAfterSixMonths>6 μήνες</AutoBackupDeleteAfterSixMonths> + <CheckForUpdates>Έλεγχος ενημερώσεων</CheckForUpdates> + <AutoSave>Αυτόματη αποθήκευση</AutoSave> + <AllowEditOfOriginalSubtitle>Να επιτρέπεται η επεξεργασία του αρχικού υπότιτλου</AllowEditOfOriginalSubtitle> + <PromptDeleteLines>Ερώτηση για διαγραφή γραμμών</PromptDeleteLines> + <TimeCodeMode>Ύφος κωδικοποίησης χρόνου</TimeCodeMode> + <TimeCodeModeHHMMSSMS>ΩΩ:ΛΛ:ΔΔ.ΧΔ (00:00:01.500)</TimeCodeModeHHMMSSMS> + <TimeCodeModeHHMMSSFF>ΩΩ:ΛΛ:ΔΔ:ΚΚ (00:00:01:12)</TimeCodeModeHHMMSSFF> + <SplitBehavior>Συμπεριφορά διαχωρισμού</SplitBehavior> + <SplitBehaviorPrevious>Προσθήκη κενού αριστερά του σημείου διαχωρισμού</SplitBehaviorPrevious> + <SplitBehaviorHalf>Προσθήκη κενού κεντρικά του σημείου διαχωρισμού</SplitBehaviorHalf> + <SplitBehaviorNext>Προσθήκη κενού δεξιά του σημείου διαχωρισμού</SplitBehaviorNext> + <VideoEngine>Μηχανισμός απόδοσης βίντεο</VideoEngine> + <DirectShow>DirectShow</DirectShow> + <DirectShowDescription>quartz.dll στον φάκελο system32</DirectShowDescription> + <MpcHc>MPC-HC</MpcHc> + <MpcHcDescription>Media Player Classic - Home Cinema</MpcHcDescription> + <MpvPlayer>mpv</MpvPlayer> + <MpvPlayerDescription>https://mpv.io</MpvPlayerDescription> + <MpvHandlesPreviewText>Προεπισκόπηση κειμένου από mpv</MpvHandlesPreviewText> + <VlcMediaPlayer>VLC media player</VlcMediaPlayer> + <VlcMediaPlayerDescription>libvlc.dll από VLC media player 1.1.0 ή νεότερο</VlcMediaPlayerDescription> + <VlcBrowseToLabel>Διαδρομή του VLC (μόνο για τη φορητή έκδοση VLC)</VlcBrowseToLabel> + <ShowStopButton>Εμφάνιση κουμπιού διακοπής</ShowStopButton> + <ShowMuteButton>Εμφάνιση κουμπιού σίγασης</ShowMuteButton> + <ShowFullscreenButton>Εμφάνιση κουμπιού πλήρους οθόνης</ShowFullscreenButton> + <PreviewFontSize>Μέγεθος γραμματοσειράς προεπισκόπησης υπότιτλου</PreviewFontSize> + <MainWindowVideoControls>Στοιχεία ελέγχου βίντεο κύριου παραθύρου</MainWindowVideoControls> + <CustomSearchTextAndUrl>Προσαρμοσμένη αναζήτηση κειμένου και διεύθυνσης URL</CustomSearchTextAndUrl> + <WaveformAppearance>Όψη κυματομορφής</WaveformAppearance> + <WaveformGridColor>Χρώμα πλέγματος</WaveformGridColor> + <WaveformShowGridLines>Εμφάνιση γραμμών πλέγματος</WaveformShowGridLines> + <WaveformShowCps>Εμφάνιση χαρ/δευτ</WaveformShowCps> + <WaveformShowWpm>Εμφάνιση λέξεων/λεπτό</WaveformShowWpm> + <ReverseMouseWheelScrollDirection>Εναλλαγή κατεύθυνσης κύλισης με τη ρόδα του ποντικιού</ReverseMouseWheelScrollDirection> + <WaveformAllowOverlap>Να επιτρέπεται η επικάλυψη (κατά τη μετακίνηση/αλλαγή μεγέθους)</WaveformAllowOverlap> + <WaveformSetVideoPosMoveStartEnd>Καθορισμός θέσης βίντεο κατά τη μετακίνηση αρχής/λήξης</WaveformSetVideoPosMoveStartEnd> + <WaveformFocusMouseEnter>Καθορισμός εστίασης όταν το ποντίκι εισέρχεται</WaveformFocusMouseEnter> + <WaveformListViewFocusMouseEnter>Επίσης καθορίστε την εστίαση στην προβολή λίστας, όταν το ποντίκι εισέρχεται στην προβολή λίστας</WaveformListViewFocusMouseEnter> + <WaveformSingleClickSelect>Μονό κλικ επιλογής υπότιτλου</WaveformSingleClickSelect> + <WaveformSnapToSceneChanges>Εικόνα για την αλλαγή σκηνών (κράτημα Shift για παράκαμψη)</WaveformSnapToSceneChanges> + <WaveformBorderHitMs1>Το χτύπημα του πλαισίου σήμανσης πρέπει να βρίσκεται μεταξύ</WaveformBorderHitMs1> + <WaveformBorderHitMs2>χιλιοστά δευτερολέπτου</WaveformBorderHitMs2> + <WaveformColor>Χρώμα</WaveformColor> + <WaveformSelectedColor>Επιλεγμένο χρώμα</WaveformSelectedColor> + <WaveformBackgroundColor>Χρώμα φόντου</WaveformBackgroundColor> + <WaveformCursorColor>Χρώμα δείκτη</WaveformCursorColor> + <WaveformTextColor>Χρώμα κειμένου</WaveformTextColor> + <WaveformTextFontSize>Μέγεθος γραμματοσειράς κειμένου</WaveformTextFontSize> + <WaveformAndSpectrogramsFolderEmpty>Άδειασμα φακέλων 'Spectrograms' και 'Waveforms'</WaveformAndSpectrogramsFolderEmpty> + <WaveformAndSpectrogramsFolderInfo>Οι φάκελοι 'Waveforms' και 'Spectrograms' περιέχουν {0} αρχεία ({1:0.00} MB)</WaveformAndSpectrogramsFolderInfo> + <Spectrogram>Φασματογράφημα</Spectrogram> + <GenerateSpectrogram>Δημιουργία φασματογράμματος</GenerateSpectrogram> + <SpectrogramAppearance>Όψη φασματογράμματος</SpectrogramAppearance> + <SpectrogramOneColorGradient>Διαβάθμιση ενός χρώματος</SpectrogramOneColorGradient> + <SpectrogramClassic>Κλασικό</SpectrogramClassic> + <WaveformUseFFmpeg>Χρήση FFmpeg για εξαγωγή κυματομορφής</WaveformUseFFmpeg> + <DownloadFFmpeg>Λήψη FFmpeg</DownloadFFmpeg> + <WaveformFFmpegPath>Διαδρομή του FFmpeg</WaveformFFmpegPath> + <WaveformBrowseToFFmpeg>Περιήγηση για FFmpeg</WaveformBrowseToFFmpeg> + <WaveformBrowseToVLC>Περιήγηση για φορητό VLC</WaveformBrowseToVLC> + <SubStationAlphaStyle>Στυλ Sub Station Alpha</SubStationAlphaStyle> + <ChooseColor>Επιλογή χρώματος</ChooseColor> + <SsaOutline>Περίγραμμα</SsaOutline> + <SsaShadow>Σκιά</SsaShadow> + <SsaOpaqueBox>Αδιαφανές κουτί</SsaOpaqueBox> + <Testing123>Δοκιμή 123...</Testing123> + <Language>Γλώσσα</Language> + <NamesIgnoreLists>Λίστα ονομάτων/παραλείψεων (διάκριση πεζών-κεφαλαίων)</NamesIgnoreLists> + <AddName>Προσθήκη ονόματος</AddName> + <AddWord>Προσθήκη λέξης</AddWord> + <Remove>Αφαίρεση</Remove> + <AddPair>Προσθήκη ζευγαριού</AddPair> + <UserWordList>Λίστα λέξεων χρήστη</UserWordList> + <OcrFixList>Λίστα επιδιορθώσεων OCR</OcrFixList> + <Location>Τοποθεσία</Location> + <UseOnlineNames>Χρήση διαδικτυακού αρχείου xml ονομάτων</UseOnlineNames> + <WordAddedX>Λέξη προστέθηκε: {0}</WordAddedX> + <WordAlreadyExists>Υπάρχουσα λέξη!</WordAlreadyExists> + <WordNotFound>Η λέξη δεν βρέθηκε</WordNotFound> + <RemoveX>Αφαίρεση του {0};</RemoveX> + <CannotUpdateNamesOnline>Αδυναμία ενημέρωσης του διαδικτυακού xml ονομάτων!</CannotUpdateNamesOnline> + <ProxyServerSettings>Ρυθμίσεις διακομιστή μεσολάβησης</ProxyServerSettings> + <ProxyAddress>Διεύθυνση διακομιστή μεσολάβησης</ProxyAddress> + <ProxyAuthentication>Επικύρωση</ProxyAuthentication> + <ProxyUserName>Όνομα χρήστη</ProxyUserName> + <ProxyPassword>Κωδικός</ProxyPassword> + <ProxyDomain>Τομέας</ProxyDomain> + <NetworkSessionSettings>Ρυθμίσεις συνεδρίας δικτύου</NetworkSessionSettings> + <NetworkSessionNewSound>Αναπαραγωγή ήχου νέων μηνυμάτων</NetworkSessionNewSound> + <PlayXSecondsAndBack>Αναπαραγωγή Χ δευτερολέπτων και πίσω, το Χ είναι</PlayXSecondsAndBack> + <StartSceneIndex>Η αρχική παράγραφος σκηνής είναι</StartSceneIndex> + <EndSceneIndex>Η τελική παράγραφος σκηνής είναι</EndSceneIndex> + <FirstPlusX>Αρχή + {0}</FirstPlusX> + <LastMinusX>Τέλος - {0}</LastMinusX> + <FixCommonerrors>Επιδιόρθωση κοινών σφαλμάτων</FixCommonerrors> + <RemoveTextForHi>Αφαίρεση κειμένου για κωφούς</RemoveTextForHi> + <MergeLinesShorterThan>Συνένωση γραμμών μικρότερες από</MergeLinesShorterThan> + <DialogStyle>Στυλ διαλόγου</DialogStyle> + <DialogStyleDashBothLinesWithSpace>Παύλες με κενό</DialogStyleDashBothLinesWithSpace> + <DialogStyleDashBothLinesWithoutSpace>Παύλες χωρίς κενό</DialogStyleDashBothLinesWithoutSpace> + <DialogStyleDashSecondLineWithSpace>Μία παύλα με κενό</DialogStyleDashSecondLineWithSpace> + <DialogStyleDashSecondLineWithoutSpace>Δεύτερη γραμμή χωρίς κενό</DialogStyleDashSecondLineWithoutSpace> + <ContinuationStyle>Στυλ συνέχισης</ContinuationStyle> + <ContinuationStyleNone>Χωρίς</ContinuationStyleNone> + <ContinuationStyleNoneTrailingDots>Χωρίς, αποσιωπητικά για παύσεις (μόνο συνέχιση)</ContinuationStyleNoneTrailingDots> + <ContinuationStyleNoneLeadingTrailingDots>Χωρίς, αποσιωπητικά για παύσεις</ContinuationStyleNoneLeadingTrailingDots> + <ContinuationStyleOnlyTrailingDots>Αποσιωπητικά (μόνο συνέχιση)</ContinuationStyleOnlyTrailingDots> + <ContinuationStyleLeadingTrailingDots>Αποσιωπητικά</ContinuationStyleLeadingTrailingDots> + <ContinuationStyleLeadingTrailingDash>Παύλα</ContinuationStyleLeadingTrailingDash> + <ContinuationStyleLeadingTrailingDashDots>Παύλα, αποσιωπητικά για παύσεις</ContinuationStyleLeadingTrailingDashDots> + <MusicSymbol>Μουσικό σύμβολο</MusicSymbol> + <MusicSymbolsReplace>Αντικατάσταση μουσικών συμβόλων (χωρισμένα με κόμμα)</MusicSymbolsReplace> + <FixCommonOcrErrorsUseHardcodedRules>Επιδιόρθωση κοινών σφαλμάτων OCR - χρήση ενσωματωμένων κανόνων</FixCommonOcrErrorsUseHardcodedRules> + <FixCommonerrorsFixShortDisplayTimesAllowMoveStartTime>Επιδιόρθωση του σύντομου χρόνου εμφάνισης - αλλαγή χρόνου έναρξης</FixCommonerrorsFixShortDisplayTimesAllowMoveStartTime> + <FixCommonErrorsSkipStepOne>Παράβλεψη πρώτου βήματος (προκαθορισμένες επιλογές)</FixCommonErrorsSkipStepOne> + <Shortcuts>Συντομεύσεις</Shortcuts> + <Shortcut>Συντόμευση</Shortcut> + <Control>Ctrl</Control> + <Alt>Alt</Alt> + <Shift>Shift</Shift> + <Key>Πλήκτρο</Key> + <ListViewAndTextBox>Προβολή λίστας και πλαισίου κειμένου</ListViewAndTextBox> + <ListView>Προβολή λίστας</ListView> + <TextBox>Πλαίσιο κειμένου</TextBox> + <UseSyntaxColoring>Χρήση χρωματισμού σύνταξης</UseSyntaxColoring> + <HtmlColor>Χρώμα HTML</HtmlColor> + <AssaColor>Χρώμα ASSA</AssaColor> + <UpdateShortcut>Ενημέρωση</UpdateShortcut> + <FoucsSetVideoPosition>Εστίαση ορισμού θέσης βίντεο</FoucsSetVideoPosition> + <ToggleDockUndockOfVideoControls>Εναλλαγή αγκύστρωσης/απαγκύστρωσης των στοιχείων ελέγχου βίντεο</ToggleDockUndockOfVideoControls> + <CreateSetEndAddNewAndGoToNew>Ορισμός τέλους, προσθήκη νέου και μετάβαση</CreateSetEndAddNewAndGoToNew> + <AdjustViaEndAutoStart>Προσαρμογή μέσω τελικής θέσης</AdjustViaEndAutoStart> + <AdjustViaEndAutoStartAndGoToNext>Προσαρμογή μέσω τελικής θέσης και επόμενο</AdjustViaEndAutoStartAndGoToNext> + <AdjustSetEndTimeAndGoToNext>Ορισμός λήξης και επόμενο</AdjustSetEndTimeAndGoToNext> + <AdjustSetEndTimeAndPause>Ορισμός λήξης και παύση</AdjustSetEndTimeAndPause> + <AdjustSetStartAutoDurationAndGoToNext>Προσαρμογή μέσω αρχικής θέσης και επόμενο</AdjustSetStartAutoDurationAndGoToNext> + <AdjustSetEndNextStartAndGoToNext>Ορισμός λήξης, έναρξη επομένου εκκίνηση και επόμενο</AdjustSetEndNextStartAndGoToNext> + <AdjustStartDownEndUpAndGoToNext>Κάτω βέλος = ορισμός έναρξης, Πάνω βέλος = ορισμός λήξης και μετάβαση σε επόμενο</AdjustStartDownEndUpAndGoToNext> + <AdjustSetStartAndEndOfPrevious>Ορισμός έναρξης και λήξης προηγούμενου (πλην ελάχιστο κενό)</AdjustSetStartAndEndOfPrevious> + <AdjustSetStartAndEndOfPreviousAndGoToNext>Ορισμός έναρξης και λήξης προηγούμενου και μετάβαση σε επόμενο (πλην ελάχιστο κενό)</AdjustSetStartAndEndOfPreviousAndGoToNext> + <AdjustSelected100MsForward>Μετακίνηση γραμμών 100 χιλ. δ. εμπρός</AdjustSelected100MsForward> + <AdjustSelected100MsBack>Μετακίνηση γραμμών 100 χιλ. δ. πίσω</AdjustSelected100MsBack> + <AdjustStartXMsBack>Μετακίνηση αρχής {0} χιλ. δ. πίσω</AdjustStartXMsBack> + <AdjustStartXMsForward>Μετακίνηση αρχής {0} χιλ. δ. εμπρός</AdjustStartXMsForward> + <AdjustEndXMsBack>Μετακίνηση λήξης {0} χιλ. δ. πίσω</AdjustEndXMsBack> + <AdjustEndXMsForward>Μετακίνηση λήξης {0} χιλ. δ. εμπρός</AdjustEndXMsForward> + <AdjustStartOneFrameBack>Μετακίνηση αρχής 1 καρέ πίσω</AdjustStartOneFrameBack> + <AdjustStartOneFrameForward>Μετακίνηση αρχής 1 καρέ εμπρός</AdjustStartOneFrameForward> + <AdjustEndOneFrameBack>Μετακίνηση λήξης 1 καρέ πίσω</AdjustEndOneFrameBack> + <AdjustEndOneFrameForward>Μετακίνηση λήξης 1 καρέ εμπρός</AdjustEndOneFrameForward> + <AdjustStartOneFrameBackKeepGapPrev>Μετακίνηση αρχής 1 καρέ πίσω (κράτημα κενού στο προηγούμενο)</AdjustStartOneFrameBackKeepGapPrev> + <AdjustStartOneFrameForwardKeepGapPrev>Μετακίνηση αρχής 1 καρέ εμπρός (κράτημα κενού στο προηγούμενο)</AdjustStartOneFrameForwardKeepGapPrev> + <AdjustEndOneFrameBackKeepGapNext>Μετακίνηση λήξης 1 καρέ πίσω (κράτημα κενού στο επόμενο)</AdjustEndOneFrameBackKeepGapNext> + <AdjustEndOneFrameForwardKeepGapNext>Μετακίνηση λήξης 1 καρέ εμπρός (κράτημα κενού στο επόμενο)</AdjustEndOneFrameForwardKeepGapNext> + <AdjustSetStartTimeKeepDuration>Ορισμός έναρξης, διατήρηση διάρκειας</AdjustSetStartTimeKeepDuration> + <AdjustSetEndAndOffsetTheRest>Ορισμός τέλους, αντιστάθμιση υπολοίπων</AdjustSetEndAndOffsetTheRest> + <AdjustSetEndAndOffsetTheRestAndGoToNext>Ορισμός τέλους, αντιστάθμιση υπολοίπων και μετάβαση σε επόμενο</AdjustSetEndAndOffsetTheRestAndGoToNext> + <AdjustSnapStartToNextSceneChange>Σπάσιμο έναρξης γραμμής σε επόμενη αλλαγή σκηνής</AdjustSnapStartToNextSceneChange> + <AdjustSnapStartToNextSceneChangeWithGap>Σπάσιμο έναρξης γραμμής σε επόμενη αλλαγή σκηνής με ελάχιστο κενό</AdjustSnapStartToNextSceneChangeWithGap> + <AdjustSnapEndToPreviousSceneChange>Σπάσιμο έναρξης γραμμής σε προηγούμενη αλλαγή σκηνής</AdjustSnapEndToPreviousSceneChange> + <AdjustSnapEndToPreviousSceneChangeWithGap>Σπάσιμο έναρξης γραμμής σε προηγούμενη αλλαγή σκηνής με ελάχιστο κενό</AdjustSnapEndToPreviousSceneChangeWithGap> + <AdjustExtendToNextSceneChange>Επέκταση γραμμών μέχρι την επόμενη αλλαγή σκηνής (ή επόμενο υπότιτλο)</AdjustExtendToNextSceneChange> + <AdjustExtendToNextSceneChangeWithGap>Επέκταση γραμμών σε επόμενη αλλαγή σκηνής με ελάχιστο κενό (ή επόμενο υπότιτλο)</AdjustExtendToNextSceneChangeWithGap> + <AdjustExtendToPreviousSceneChange>Επέκταση γραμμών μέχρι την προηγούμενη αλλαγή σκηνής (ή προηγούμενο υπότιτλο)</AdjustExtendToPreviousSceneChange> + <AdjustExtendToPreviousSceneChangeWithGap>Επέκταση γραμμών σε προηγούμενη αλλαγή σκηνής με ελάχιστο κενό (ή προηγούμενο υπότιτλο)</AdjustExtendToPreviousSceneChangeWithGap> + <AdjustExtendToNextSubtitle>Επέκταση γραμμών μέχρι τον επόμενο υπότιτλο</AdjustExtendToNextSubtitle> + <AdjustExtendToPreviousSubtitle>Επέκταση γραμμών μέχρι τον προηγούμενο υπότιλο</AdjustExtendToPreviousSubtitle> + <AdjustExtendCurrentSubtitle>Επέκταση γραμμής μέχρι τον επόμενο υπότιτλο ή μέγιστη διάρκεια</AdjustExtendCurrentSubtitle> + <AdjustExtendPreviousLineEndToCurrentStart>Επέκταση λήξης προηγούμενης γραμμής σε έναρξη τρέχουσας</AdjustExtendPreviousLineEndToCurrentStart> + <AdjustExtendNextLineStartToCurrentEnd>Επέκταση έναρξης επόμενης γραμμής σε λήξη τρέχουσας</AdjustExtendNextLineStartToCurrentEnd> + <RecalculateDurationOfCurrentSubtitle>Επαναϋπολογισμός διάρκειας υπότιτλου</RecalculateDurationOfCurrentSubtitle> + <MainCreateStartDownEndUp>Δημιουργία νέου στο πάτημα του κάτω βέλους, ορισμός χρόνου λήξης στο πάτημα του πάνω βέλους</MainCreateStartDownEndUp> + <MergeDialog>Συγχώνευση διαλόγου (εισαγωγή παυλών)</MergeDialog> + <GoToNext>Μετάβαση σε επόμενη γραμμή</GoToNext> + <GoToNextCursorAtEnd>Μετάβαση σε επόμενη γραμμή και ορισμός δείκτη στη λήξη</GoToNextCursorAtEnd> + <GoToPrevious>Μετάβαση σε προηγούμενη γραμμή</GoToPrevious> + <GoToCurrentSubtitleStart>Μετάβαση στην αρχή της τρέχουσας γραμμής</GoToCurrentSubtitleStart> + <GoToCurrentSubtitleEnd>Μετάβαση στο τέλος της τρέχουσας γραμμής</GoToCurrentSubtitleEnd> + <GoToPreviousSubtitleAndFocusVideo>Μετάβαση σε προηγούμενη γραμμή και ορισμός θέσης βίντεο</GoToPreviousSubtitleAndFocusVideo> + <GoToNextSubtitleAndFocusVideo>Μετάβαση σε επόμενη γραμμή και ορισμός θέσης βίντεο</GoToNextSubtitleAndFocusVideo> + <GoToPrevSubtitleAndPlay>Μετάβαση σε προηγούμενη γραμμή και αναπαραγωγή</GoToPrevSubtitleAndPlay> + <GoToNextSubtitleAndPlay>Μετάβαση σε επόμενη γραμμή και αναπαραγωγή</GoToNextSubtitleAndPlay> + <ToggleFocus>Εναλλαγή εστίασης υποτίτλου μεταξύ προβολής λίστας και πλαισίου κειμένου</ToggleFocus> + <ToggleDialogDashes>Εναλλαγή γραμμών διαλόγου</ToggleDialogDashes> + <ToggleMusicSymbols>Εναλλαγή μουσικών συμβόλων</ToggleMusicSymbols> + <Alignment>Στοίχιση (επιλεγμένες γραμμές)</Alignment> + <AlignmentN1>Στοίχιση κάτω αριστερά - {\an1}</AlignmentN1> + <AlignmentN2>Στοίχιση κάτω κεντρικά - {\an2}</AlignmentN2> + <AlignmentN3>Στοίχιση κάτω δεξιά - {\an1}</AlignmentN3> + <AlignmentN4>Στοίχιση μέση αριστερά - {\an4}</AlignmentN4> + <AlignmentN5>Στοίχιση μέση κέντρο - {\an5}</AlignmentN5> + <AlignmentN6>Στοίχιση μέση δεξιά - {\an6}</AlignmentN6> + <AlignmentN7>Στοίχιση πάνω αριστερά - {\an7}</AlignmentN7> + <AlignmentN8>Στοίχιση πάνω κεντρικά - {\an8}</AlignmentN8> + <AlignmentN9>Στοίχιση πάνω δεξιά - {\an9}</AlignmentN9> + <CopyTextOnly>Αντιγραφή μόνο του κειμένου στο πρόχειρο (επιλεγμένες γραμμές)</CopyTextOnly> + <CopyTextOnlyFromOriginalToCurrent>Αντιγραφή κειμένου από αρχικό στον τρέχων</CopyTextOnlyFromOriginalToCurrent> + <AutoDurationSelectedLines>Αυτόματη διάρκεια (επιλεγμένες γραμμές)</AutoDurationSelectedLines> + <FixRTLViaUnicodeChars>Επιδιόρθωση RTL μέσω χαρακτήρων ελέγχου Unicode</FixRTLViaUnicodeChars> + <RemoveRTLUnicodeChars>Αφαίρεση χαρακτήρων ελέγχου Unicode</RemoveRTLUnicodeChars> + <ReverseStartAndEndingForRtl>Αντιστροφή έναρξης/λήξης RTL</ReverseStartAndEndingForRtl> + <VerticalZoom>Κάθετη μεγέθυνση</VerticalZoom> + <VerticalZoomOut>Κάθετη σμίκρυνση</VerticalZoomOut> + <WaveformSeekSilenceForward>Αναζήτηση σιωπής εμπρός</WaveformSeekSilenceForward> + <WaveformSeekSilenceBack>Αναζήτηση σιωπής πίσω</WaveformSeekSilenceBack> + <WaveformAddTextHere>Προσθήκη κειμένου (για νέα επιλογή)</WaveformAddTextHere> + <WaveformAddTextHereFromClipboard>Προσθήκη κειμένου (για νέα επιλογή από πρόχειρο)</WaveformAddTextHereFromClipboard> + <SetParagraphAsSelection>Ορισμός επιλεγμένου ως νέα επιλογή</SetParagraphAsSelection> + <WaveformPlayNewSelection>Αναπαραγωγή επιλεγμένου</WaveformPlayNewSelection> + <WaveformPlayNewSelectionEnd>Αναπαραγωγή λήξης επιλεγμένου</WaveformPlayNewSelectionEnd> + <WaveformPlayFirstSelectedSubtitle>Αναπαραγωγή του πρώτου υπότιτλου</WaveformPlayFirstSelectedSubtitle> + <WaveformFocusListView>Εστίαση σε προβολή λίστας</WaveformFocusListView> + <WaveformGoToPreviousSceneChange>Μετάβαση σε προηγούμενη αλλαγή σκηνής</WaveformGoToPreviousSceneChange> + <WaveformGoToNextSceneChange>Μετάβαση σε επόμενη αλλαγή σκηνής</WaveformGoToNextSceneChange> + <WaveformToggleSceneChange>Εναλλαγή αλλαγή σκηνής</WaveformToggleSceneChange> + <WaveformGuessStart>Αυτόματη προσαρμογή έναρξης μέσω έντασης/αλλαγή σκηνής</WaveformGuessStart> + <GoBack1Frame>Πίσω ένα καρέ</GoBack1Frame> + <GoForward1Frame>Μπροστά ένα καρέ</GoForward1Frame> + <GoBack1FrameWithPlay>Πίσω ένα καρέ (με αναπαραγωγή)</GoBack1FrameWithPlay> + <GoForward1FrameWithPlay>Μπροστά ένα καρέ (με αναπαραγωγή)</GoForward1FrameWithPlay> + <GoBack100Milliseconds>Πίσω 100 χιλ. δ.</GoBack100Milliseconds> + <GoForward100Milliseconds>Μπροστά 100 χιλ. δ.</GoForward100Milliseconds> + <GoBack500Milliseconds>Πίσω 500 χιλ. δ.</GoBack500Milliseconds> + <GoForward500Milliseconds>Μπροστά 500 χιλ. δ.</GoForward500Milliseconds> + <GoBack1Second>Πίσω 1 δευτερόλεπτο</GoBack1Second> + <GoForward1Second>Μπροστά 1 δευτερόλεπτο</GoForward1Second> + <GoBack5Seconds>Πίσω 5 δευτερόλεπτα</GoBack5Seconds> + <GoForward5Seconds>Μπροστά 5 δευτερόλεπτα</GoForward5Seconds> + <GoBackXSSeconds>Μικρή προώθηση χρόνου πίσω</GoBackXSSeconds> + <GoForwardXSSeconds>Μικρή προώθηση χρόνου εμπρός</GoForwardXSSeconds> + <GoBackXLSeconds>Μεγάλη προώθηση χρόνου πίσω</GoBackXLSeconds> + <GoForwardXLSeconds>Μεγάλη προώθηση χρόνου εμπρός</GoForwardXLSeconds> + <GoBack3Second>Πίσω 3 δευτερόλεπτα</GoBack3Second> + <GoToStartCurrent>Ορισμός θέσης βίντεο στην έναρξη του τρέχοντος υπότιτλου</GoToStartCurrent> + <ToggleStartEndCurrent>Εναλλαγή θέσης βίντεο μεταξύ έναρξης/λήξης τρέχοντος υπότιτλου</ToggleStartEndCurrent> + <PlayCurrent>Αναπαραγωγή τρέχοντος υπότιτλου</PlayCurrent> + <WaveformGoToPrevSubtitle>Μετάβαση σε προηγούμενο υπότιτλο (από θέση βίντεο)</WaveformGoToPrevSubtitle> + <WaveformGoToNextSubtitle>Μετάβαση σε επόμενο υπότιτλο (από θέση βίντεο)</WaveformGoToNextSubtitle> + <WaveformGoToPrevChapter>Μετάβαση σε προηγούμενο κεφάλαιο</WaveformGoToPrevChapter> + <WaveformGoToNextChapter>Μετάβαση σε επόμενο κεφάλαιο</WaveformGoToNextChapter> + <WaveformSelectNextSubtitle>Επιλογή επόμενου υπότιτλου (από θέση βίντεο, χωρίς αλλαγή)</WaveformSelectNextSubtitle> + <TogglePlayPause>Εναλλαγή αναπαραγωγής/παύσης</TogglePlayPause> + <Pause>Παύση</Pause> + <Fullscreen>Πλήρη οθόνη</Fullscreen> + <PlayRateSlower>Πιο αργός ρυθμός αναπαραγωγής</PlayRateSlower> + <PlayRateFaster>Ταχύτερος ρυθμός αναπαραγωγής</PlayRateFaster> + <VideoResetSpeedAndZoom>Επαναφορά ταχύτητας/μεγένθυσης</VideoResetSpeedAndZoom> + <CustomSearch1>Μετάφραση, προσαρμοσμένη αναζήτηση 1</CustomSearch1> + <CustomSearch2>Μετάφραση, προσαρμοσμένη αναζήτηση 2</CustomSearch2> + <CustomSearch3>Μετάφραση, προσαρμοσμένη αναζήτηση 3</CustomSearch3> + <CustomSearch4>Μετάφραση, προσαρμοσμένη αναζήτηση 4</CustomSearch4> + <CustomSearch5>Μετάφραση, προσαρμοσμένη αναζήτηση 5</CustomSearch5> + <SyntaxColoring>Χρωματισμός σύνταξης</SyntaxColoring> + <ListViewSyntaxColoring>Χρωματισμός σύνταξης στην προβολή λίστας</ListViewSyntaxColoring> + <SyntaxColorDurationIfTooSmall>Χρώμα διάρκειας εάν είναι πολύ μικρός</SyntaxColorDurationIfTooSmall> + <SyntaxColorDurationIfTooLarge>Χρώμα διάρκειας εάν είναι πολύ μεγάλος</SyntaxColorDurationIfTooLarge> + <SyntaxColorTextIfTooLong>Χρώμα κειμένου εάν είναι πολύ μακρύ</SyntaxColorTextIfTooLong> + <SyntaxColorTextIfTooWide>Χρώμα κειμένου αν είναι ευρύ (εικονοστοιχεία)</SyntaxColorTextIfTooWide> + <SyntaxColorTextMoreThanMaxLines>Χρώμα κειμένου αν είναι περισσότερες από {0} γραμμές</SyntaxColorTextMoreThanMaxLines> + <SyntaxColorOverlap>Χρώμα κωδικών χρόνου που επικαλύπτονται</SyntaxColorOverlap> + <SyntaxColorGap>Χρώμα κενού αν είναι μικρότερο</SyntaxColorGap> + <SyntaxErrorColor>Χρώμα σφάλματος</SyntaxErrorColor> + <SyntaxLineWidthSettings>Ρυθμίσεις...</SyntaxLineWidthSettings> + <LineWidthSettings>Ρυθμίσεις εύρους γραμμής</LineWidthSettings> + <MaximumLineWidth>Μέγιστο εύρος γραμμής:</MaximumLineWidth> + <Pixels>εικονοστοιχεία</Pixels> + <MeasureFont>Μέτρηση γραμματοσειράς:</MeasureFont> + <GoToFirstSelectedLine>Μετάβαση σε πρώτη επιλεγμένη γραμμή</GoToFirstSelectedLine> + <GoToNextEmptyLine>Μετάβαση σε επόμενη κενή γραμμή</GoToNextEmptyLine> + <MergeSelectedLines>Συγχώνευση γραμμών</MergeSelectedLines> + <MergeSelectedLinesAndAutoBreak>Συγχώνευση γραμμών και αυτόματη διάσπαση</MergeSelectedLinesAndAutoBreak> + <MergeSelectedLinesAndUnbreak>Συγχώνευση γραμμών και συνένωση</MergeSelectedLinesAndUnbreak> + <MergeSelectedLinesAndUnbreakCjk>Συγχώνευση γραμμών και συνένωση χωρίς κενό</MergeSelectedLinesAndUnbreakCjk> + <MergeSelectedLinesOnlyFirstText>Συγχώνευση γραμμών, κράτημα μόνο του πρώτου κειμένου</MergeSelectedLinesOnlyFirstText> + <MergeSelectedLinesBilingual>Συγχώνευση γραμμών δίγλωσσα</MergeSelectedLinesBilingual> + <SplitSelectedLineBilingual>Διαχωρισμός γραμμής δίγλωσσα</SplitSelectedLineBilingual> + <ToggleTranslationMode>Εναλλαγή τρόπου μετάφρασης</ToggleTranslationMode> + <SwitchOriginalAndTranslation>Εναλλαγή αρχικού και μετάφρασης</SwitchOriginalAndTranslation> + <MergeOriginalAndTranslation>Συγχώνευση αρχικού και μετάφρασης</MergeOriginalAndTranslation> + <MergeWithNext>Συγχώνευση με επόμενη</MergeWithNext> + <MergeWithPrevious>Συγχώνευση με προηγούμενη</MergeWithPrevious> + <ShortcutIsAlreadyDefinedX>Ορισμένη συντόμευση: {0}</ShortcutIsAlreadyDefinedX> + <ToggleTranslationAndOriginalInPreviews>Εναλλαγή μετάφρασης και αρχικού στην προεπισκόπηση βίντεο/ήχου</ToggleTranslationAndOriginalInPreviews> + <ListViewColumnDelete>Στήλη, διαγραφή κειμένου</ListViewColumnDelete> + <ListViewColumnDeleteAndShiftUp>Στήλη, διαγραφή κειμένου και άνω μετατόπιση</ListViewColumnDeleteAndShiftUp> + <ListViewColumnInsert>Στήλη, εισαγωγή κειμένου</ListViewColumnInsert> + <ListViewColumnPaste>Στήλη, επικόλληση</ListViewColumnPaste> + <ListViewColumnTextUp>Στήλη, κείμενο προς τα πάνω</ListViewColumnTextUp> + <ListViewColumnTextDown>Στήλη, κείμενο προς τα κάτω</ListViewColumnTextDown> + <ListViewFocusWaveform>Εστίαση κυματομορφής/φασματογραφήματος</ListViewFocusWaveform> + <ListViewGoToNextError>Μετάβαση σε επόμενο σφάλμα</ListViewGoToNextError> + <ShowBeamer>Ξεκινήστε υπότιτλο σε πλήρη οθόνη βιντεοπροβολέα</ShowBeamer> + <MainTextBoxMoveLastWordDown>Μετακίνηση τελευταίας λέξης στην επόμενη γραμμή</MainTextBoxMoveLastWordDown> + <MainTextBoxMoveFirstWordFromNextUp>Μετακίνηση πρώτης λέξης από την επόμενη γραμμή επάνω</MainTextBoxMoveFirstWordFromNextUp> + <MainTextBoxMoveFirstWordUpCurrent>Μετακίνηση πρώτης λέξης της κάτω γραμμής πάνω</MainTextBoxMoveFirstWordUpCurrent> + <MainTextBoxMoveLastWordDownCurrent>Μετακίνηση τελευταίας λέξης της άνω γραμμής κάτω</MainTextBoxMoveLastWordDownCurrent> + <MainTextBoxSelectionToLower>Επιλογή σε μικρά</MainTextBoxSelectionToLower> + <MainTextBoxSelectionToUpper>Επιλογή σε κεφαλαία</MainTextBoxSelectionToUpper> + <MainTextBoxSelectionToggleCasing>Εναλλαγή πεζών-κεφαλαίων επιλογής (κανονικά/κεφαλαία/πεζά)</MainTextBoxSelectionToggleCasing> + <MainTextBoxSelectionToRuby>Επιλογή σε Ruby (Ιαπωνικά)</MainTextBoxSelectionToRuby> + <MainTextBoxToggleAutoDuration>Εναλλαγή αυτόματης διάρκειας</MainTextBoxToggleAutoDuration> + <MainTextBoxAutoBreak>Αυτόματη διάσπαση κειμένου</MainTextBoxAutoBreak> + <MainTextBoxAutoBreakFromPos>Διάσπαση σε κενό από τη θέση δείκτη</MainTextBoxAutoBreakFromPos> + <MainTextBoxAutoBreakFromPosAndGoToNext>Διάσπαση σε κενό από τη θέση δείκτη και μετάβαση σε επόμενο</MainTextBoxAutoBreakFromPosAndGoToNext> + <MainTextBoxUnbreak>Συνένωση κειμένου</MainTextBoxUnbreak> + <MainFileSaveAll>Αποθήκευση όλων</MainFileSaveAll> + <Miscellaneous>Διάφορα</Miscellaneous> + <CpsIncludesSpace>Συμπερίληψη κενών στους χαρακτήρες/δευτερόλεπτο</CpsIncludesSpace> + <UseDoNotBreakAfterList>Χρήση της λίστας μη διάσπασης μετά από</UseDoNotBreakAfterList> + <BreakEarlyForLineEnding>Διάσπαση σε σημεία στίξης</BreakEarlyForLineEnding> + <BreakByPixelWidth>Διάσπαση βάσει εύρους εικονοστοιχείων</BreakByPixelWidth> + <BreakPreferBottomHeavy>Προτίμηση μεγαλύτερης κάτω γραμμής</BreakPreferBottomHeavy> + <BreakEarlyForDashDialog>Διάσπαση σε παύλα διάλογου</BreakEarlyForDashDialog> + <BreakEarlyForComma>Διάσπαση σε κόμμα</BreakEarlyForComma> + <GoogleTranslate>Μετάφραση Google</GoogleTranslate> + <GoogleTranslateApiKey>Κλειδί API</GoogleTranslateApiKey> + <MicrosoftBingTranslator>Μετάφραση Microsoft</MicrosoftBingTranslator> + <HowToSignUp>Βοήθεια εγγραφής</HowToSignUp> + <MicrosoftTranslateApiKey>Κλειδί</MicrosoftTranslateApiKey> + <MicrosoftTranslateTokenEndpoint>Δείγμα τελειώματος</MicrosoftTranslateTokenEndpoint> + <FontNote>Σημείωση: Οι ρυθμίσεις γραμματοσειράς αφορούν μόνο το περιβάλλον χρήση του Subtitle Edit.</FontNote> + <RestoreDefaultSettings>Επαναφορά ρυθμίσεων</RestoreDefaultSettings> + <RestoreDefaultSettingsMsg>Επαναφορά ρυθμίσεων σε προεπιλεγμένες τιμές. +Συνέχιση;</RestoreDefaultSettingsMsg> + <RemoveTimeCodes>Αφαίρεση κωδικών χρόνου</RemoveTimeCodes> + <EditFixContinuationStyleSettings>Επεξεργασία ρυθμίσεων για διόρθωση στυλ συνέχισης...</EditFixContinuationStyleSettings> + <FixContinuationStyleSettings>Ρυθμίσεις διόρθωσης στυλ συνέχισης</FixContinuationStyleSettings> + <UncheckInsertsAllCaps>Εντοπισμός και αποεπιλογή κεφαλαίων τίτλων μίας γραμμής</UncheckInsertsAllCaps> + <UncheckInsertsItalic>Εντοπισμός και αποεπιλογή τίτλων ή στίχων σε πλαγιαστά</UncheckInsertsItalic> + <UncheckInsertsLowercase>Εντοπισμός και αποεπιλογή πεζών τίτλων ή στίχων μίας γραμμής</UncheckInsertsLowercase> + <HideContinuationCandidatesWithoutName>Απόκρυψη απίθανων προτάσεων συνέχισης</HideContinuationCandidatesWithoutName> + <IgnoreLyrics>Αγνόηση στίχων μεταξύ μουσικών συμβόλων</IgnoreLyrics> + <MinFrameGap>Ελάχιστο κενό σε καρέ</MinFrameGap> + <XFramesAtYFrameRateGivesZMs>{0} καρέ ανά {1} καρέ είναι {2} χιλ. δευτερολέπτου.</XFramesAtYFrameRateGivesZMs> + <UseXAsNewGap>Χρήση "{0}" χιλ. δευτερολέπτου ως ελάχιστο κενό;</UseXAsNewGap> + </Settings> + <SettingsMpv> + <Title>Ρυθμίσεις mpv</Title> + <DownloadMpv>Λήψη mpv lib</DownloadMpv> + <DownloadMpvFailed>Αδυναμία λήψης mpv - παρακαλώ, προσπαθήστε αργότερα!</DownloadMpvFailed> + <DownloadMpvOk>Ολοκλήρωση λήψης mpv lib και έτοιμο προς χρήση.</DownloadMpvOk> + </SettingsMpv> + <SettingsFfmpeg> + <Title>Λήψη FFmpeg</Title> + <XDownloadFailed>Αδυναμία λήψης {0} - παρακαλώ, προσπαθήστε αργότερα!</XDownloadFailed> + <XDownloadOk>Λήψη {0} και έτοιμο προς χρήση.</XDownloadOk> + </SettingsFfmpeg> + <SetVideoOffset> + <Title>Ορισμός έναρξης βίντεο</Title> + <Description>Ορισμός έναρξης βίντεο (μη ακουλούθηση πραγματικού χρόνου βίντεο)</Description> + <RelativeToCurrentVideoPosition>Σχετικά με την τρέχουσα θέση βίντεο</RelativeToCurrentVideoPosition> + <KeepTimeCodes>Κράτημα υπαρχόντων κωδικών χρόνου (μη προσθήκη έναρξης βίντεο)</KeepTimeCodes> + <Reset>Επαναφορά</Reset> + </SetVideoOffset> + <ShowEarlierLater> + <Title>Εμφάνιση γραμμών νωρίτερα/αργότερα</Title> + <TitleAll>Εμφάνιση όλων των γραμμών νωρίτερα/αργότερα</TitleAll> + <ShowEarlier>Εμφάνιση νωρίτερα</ShowEarlier> + <ShowLater>Εμφάνιση αργότερα</ShowLater> + <TotalAdjustmentX>Συνολική προσαρμογή: {0}</TotalAdjustmentX> + <AllLines>Όλες οι γραμμές</AllLines> + <SelectedLinesOnly>Μόνο τις επιλεγμένες γραμμές</SelectedLinesOnly> + <SelectedLinesAndForward>Επιλογή από τη(ις) γραμμή(ές) και εμπρός</SelectedLinesAndForward> + </ShowEarlierLater> + <ShowHistory> + <Title>Ιστορικό (για αναίρεση)</Title> + <SelectRollbackPoint>Επιλέξτε χρόνο/περιγραφή για επαναφορά</SelectRollbackPoint> + <Time>Χρόνος</Time> + <Description>Περιγραφή</Description> + <CompareHistoryItems>Σύγκριση στοιχείων ιστορικού</CompareHistoryItems> + <CompareWithCurrent>Σύγκριση με τρέχον</CompareWithCurrent> + <Rollback>Επαναφορά</Rollback> + </ShowHistory> + <SpellCheck> + <Title>Ορθογραφικός έλεγχος</Title> + <FullText>Πλήρους κειμένου</FullText> + <WordNotFound>Λέξη δεν βρέθηκε</WordNotFound> + <Language>Γλώσσα</Language> + <Change>Αλλαγή</Change> + <ChangeAll>Αλλαγή όλων</ChangeAll> + <SkipOnce>Παράλειψη &amp;ενός</SkipOnce> + <SkipAll>&amp;Παράλειψη όλων</SkipAll> + <AddToUserDictionary>Προσθήκη στο λεξικό του χρήστη</AddToUserDictionary> + <AddToNamesAndIgnoreList>Προσθήκη στη λίστα ονομάτων/παραλείψεων (διάκριση πεζών-κεφαλαίων)</AddToNamesAndIgnoreList> + <AddToOcrReplaceList>Προσθήκη ζεύγους στη λίστα αντικατάστασης του OCR</AddToOcrReplaceList> + <Abort>Ματαίωση</Abort> + <Use>Χρήση</Use> + <UseAlways>&amp;Χρήση πάντα</UseAlways> + <Suggestions>Προτάσεις</Suggestions> + <SpellCheckProgress>Ορθογραφικός έλεγχος [{0}] - {1}</SpellCheckProgress> + <EditWholeText>Επεξεργασία ολόκληρου κειμένου</EditWholeText> + <EditWordOnly>Επεξεργασία λέξης</EditWordOnly> + <AddXToNames>Προσθήκη '{0}' στη λίστα ονομάτων</AddXToNames> + <AddXToUserDictionary>Προσθήκη {0} στο λεξικό χρήστη</AddXToUserDictionary> + <AutoFixNames>Αυτόματη επιδιόρθωση ονομάτων μόνο για διαφορά πεζών-κεφαλαίων</AutoFixNames> + <AutoFixNamesViaSuggestions>Διόρθωση ονομάτων μέσω 'προτάσεων ορθογραφικού ελέγχου'</AutoFixNamesViaSuggestions> + <CheckOneLetterWords>Ερώτηση για άγνωστες λέξεις ένός γράμματος</CheckOneLetterWords> + <TreatINQuoteAsING>Αντιμετώπιση κατάληξης " in' " ως " ing " (Μόνο Αγγλικά)</TreatINQuoteAsING> + <RememberUseAlwaysList>Απομνημόνευση λίστας "Χρήση πάντα"</RememberUseAlwaysList> + <ImageText>Κείμενο εικόνας</ImageText> + <SpellCheckCompleted>Ολοκλήρωση ορθογραφικού ελέγχου</SpellCheckCompleted> + <SpellCheckAborted>Ματαίωση ορθογραφικού ελέγχου</SpellCheckAborted> + <SpacesNotAllowed>Απαγορεύονται τα κενά σε λέξη!</SpacesNotAllowed> + <UndoX>Αναιρέθηκαν: {0}</UndoX> + </SpellCheck> + <NetflixQualityCheck> + <GlyphCheckReport>Μη έγκυρος χαρακτήρας {0} στη στήλη {1}</GlyphCheckReport> + <WhiteSpaceCheckReport>Μη έγκυρο κενό στη στήλη {0}</WhiteSpaceCheckReport> + <ReportPrompt>Δείτε την αναφορά εδώ: {0}.</ReportPrompt> + <OpenReportInFolder>Άνοιγμα φακέλου αναφοράς</OpenReportInFolder> + <FoundXIssues>Ο έλεγχος ποιότητας Netflix εντόπισε {0:#,###} προβλήματα.</FoundXIssues> + <CheckOk>Χωρίς προβλήματα</CheckOk> + <MaximumXCharsPerSecond>Μέγιστοι {0} χαρακτήρες/ δευτ (εξαίρεση κενών)</MaximumXCharsPerSecond> + <MaximumLineLength>Μέγιστο μήκος γραμμής ({0})</MaximumLineLength> + <MinimumDuration>Ελάχιστη διάρκεια: 5/6 δευτερολέπτου (833 χ.δ.)</MinimumDuration> + </NetflixQualityCheck> + <Split> + <Title>Διαχωρισμός</Title> + <SplitOptions>Επιλογές διαχωρισμού</SplitOptions> + <Lines>Γραμμές</Lines> + <Characters>Χαρακτήρες</Characters> + <NumberOfEqualParts>Αριθμός ίσων κομματιών</NumberOfEqualParts> + <SubtitleInfo>Πληροφορίες υπότιτλου</SubtitleInfo> + <NumberOfLinesX>Αριθμός γραμμών: {0:#,###}</NumberOfLinesX> + <NumberOfCharactersX>Αριθμός χαρακτήρων: {0:#,###,###}</NumberOfCharactersX> + <Output>Εξαγωγή</Output> + <FileName>Όνομα αρχείου</FileName> + <OutputFolder>Φάκελος εξαγωγής</OutputFolder> + <DoSplit>Διαχωρισμός</DoSplit> + <Basic>Βασικός</Basic> + </Split> + <SplitLongLines> + <Title>Διάσπαση/διαχωρισμός μεγάλων γραμμών</Title> + <SingleLineMaximumLength>Μέγιστο μήκος μονής γραμμής</SingleLineMaximumLength> + <LineMaximumLength>Μέγιστο μήκος γραμμής</LineMaximumLength> + <LineContinuationBeginEndStrings>Συμβολοσειρές έναρξης/λήξης συνέχισης της γραμμής</LineContinuationBeginEndStrings> + <NumberOfSplits>Σύνολο διαχωρισμών: {0}</NumberOfSplits> + <LongestSingleLineIsXAtY>Το μεγαλύτερο μήκος μονής γραμμής είναι {0} στη γραμμή {1}</LongestSingleLineIsXAtY> + <LongestLineIsXAtY>Το μεγαλύτερο μήκος μήκος ολικής γραμμής είναι {0} στη γραμμή {1}</LongestLineIsXAtY> + </SplitLongLines> + <SplitSubtitle> + <Title>Διαχωρισμός υπότιτλου</Title> + <Description1>Εισαγωγή μήκους πρώτου μέρους βίντεο ή περιήγηση</Description1> + <Description2>και πάρτε το μήκος από αρχείο βίντεο:</Description2> + <Split>&amp;Διαχωρισμός</Split> + <Done>&amp;Ολοκληρώθηκε</Done> + <NothingToSplit>Τίποτα για διαχωρισμό !</NothingToSplit> + <SavePartOneAs>Αποθήκευση μέρους 1 ως...</SavePartOneAs> + <SavePartTwoAs>Αποθήκευση μέρους 2 ως...</SavePartTwoAs> + <Part1>Μέρος1</Part1> + <Part2>Μέρος2</Part2> + <UnableToSaveFileX>Αδυναμία αποθήκευσης {0}</UnableToSaveFileX> + <OverwriteExistingFiles>Αντικατάσταση υπαρχόντων αρχείων;</OverwriteExistingFiles> + <FolderNotFoundX>Ο φάκελος δεν βρέθηκε: {0}</FolderNotFoundX> + <Untitled>Χωρίς τίτλο</Untitled> + </SplitSubtitle> + <StartNumberingFrom> + <Title>Επαναρίθμησης από...</Title> + <StartFromNumber>Έναρξη από τον αριθμό:</StartFromNumber> + <PleaseEnterAValidNumber>Εισαγωγή έγκυρου αριθμού</PleaseEnterAValidNumber> + </StartNumberingFrom> + <Statistics> + <Title>Στατιστικά</Title> + <TitleWithFileName>Στατιστικά - {0}</TitleWithFileName> + <GeneralStatistics>Γενικά στατιστικά</GeneralStatistics> + <MostUsed>Περισσότερη χρήση...</MostUsed> + <MostUsedLines>Οι περισσότερες χρησιμοποιούμενες γραμμές</MostUsedLines> + <MostUsedWords>Οι περισσότερες χρησιμοποιούμενες λέξεις</MostUsedWords> + <NothingFound>Δεν βρέθηκε τίποτα</NothingFound> + <NumberOfLinesX>Αριθμός γραμμών υποτίτλου: {0:#,###}</NumberOfLinesX> + <LengthInFormatXinCharactersY>Αριθμός χαρακτήρων όπως {0}: {1:#,###,##0}</LengthInFormatXinCharactersY> + <NumberOfCharactersInTextOnly>Αριθμός χαρακτήρων μόνο στο κείμενο: {0:#,###,##0}</NumberOfCharactersInTextOnly> + <TotalDuration>Συνολική διάρκεια των υποτίτλων: {0:#,##0}</TotalDuration> + <TotalCharsPerSecond>Σύνολο χαρακτήρων/δευτερόλεπτο: {0:0.0} δευτερόλεπτα</TotalCharsPerSecond> + <TotalWords>Σύνολο λέξεων: {0:#,##0}</TotalWords> + <NumberOfItalicTags>Αριθμός ετικετών πλάγιας γραφής: {0}</NumberOfItalicTags> + <NumberOfBoldTags>Αριθμός ετικετών έντονης γραφής: {0}</NumberOfBoldTags> + <NumberOfUnderlineTags>Αριθμός ετικετών υπογραμμισμένης γραφής: {0}</NumberOfUnderlineTags> + <NumberOfFontTags>Αριθμός ετικετών γραμματοσειράς: {0}</NumberOfFontTags> + <NumberOfAlignmentTags>Αριθμός ετικετών στοίχισης: {0}</NumberOfAlignmentTags> + <LineLengthMinimum>Μήκος υποτίτλου - ελάχιστο: {0}</LineLengthMinimum> + <LineLengthMaximum>Μήκος υποτίτλου - μέγιστο: {0}</LineLengthMaximum> + <LineLengthAverage>Μήκος υποτίτλου - μέσο: {0}</LineLengthAverage> + <LinesPerSubtitleAverage>Αριθμός γραμμών υποτίτλων - μέσος: {0:0.0}</LinesPerSubtitleAverage> + <SingleLineLengthMinimum>Μήκος μονής γραμμής - ελάχιστο: {0}</SingleLineLengthMinimum> + <SingleLineLengthMaximum>Μήκος μονής γραμμής - μέγιστο: {0}</SingleLineLengthMaximum> + <SingleLineLengthAverage>Μήκος μονής γραμμής - μέσο: {0}</SingleLineLengthAverage> + <SingleLineWidthMinimum>Εύρος μονής γραμμής - ελάχιστο: {0} εικονοστοιχεία</SingleLineWidthMinimum> + <SingleLineWidthMaximum>Εύρος μονής γραμμής - μέγιστο: {0} εικονοστοιχεία</SingleLineWidthMaximum> + <SingleLineWidthAverage>Εύρος μονής γραμμής - μέσο: {0} εικονοστοιχεία</SingleLineWidthAverage> + <DurationMinimum>Διάρκεια - ελάχιστη: {0:0.000} δευτερόλεπτα</DurationMinimum> + <DurationMaximum>Διάρκεια - μέγιστη: {0:0.000} δευτερόλεπτα</DurationMaximum> + <DurationAverage>Διάρκεια - μέση: {0:0.000} δευτερόλεπτα</DurationAverage> + <CharactersPerSecondMinimum>Χαρακτήρες/ δευτ - ελάχιστοι: {0:0.000}</CharactersPerSecondMinimum> + <CharactersPerSecondMaximum>Χαρακτήρες/ δευτ - μέγιστοι: {0:0.000}</CharactersPerSecondMaximum> + <CharactersPerSecondAverage>Χαρακτήρες/ δευτ - μέσοι: {0:0.000}</CharactersPerSecondAverage> + <Export>Εξαγωγή...</Export> + </Statistics> + <SubStationAlphaProperties> + <Title>Προχωρημένες ιδιότητες Sub Station Alpha</Title> + <TitleSubstationAlpha>Ιδιότητες Sub Station Alpha</TitleSubstationAlpha> + <Script>Σενάριο</Script> + <ScriptTitle>Τίτλος</ScriptTitle> + <OriginalScript>Αρχικό σενάριο</OriginalScript> + <Translation>Μετάφραση</Translation> + <Editing>Επιμέλεια</Editing> + <Timing>Χρονισμός</Timing> + <SyncPoint>Σημείο συγχρονισμού</SyncPoint> + <UpdatedBy>Ενημερωμένο από</UpdatedBy> + <UpdateDetails>Λεπτομέρειες ενημέρωσης</UpdateDetails> + <Resolution>Ανάλυση</Resolution> + <VideoResolution>Ανάλυση βίντεοVideo resolution</VideoResolution> + <Options>Επιλογές</Options> + <WrapStyle>Στυλ αναδίπλωσης</WrapStyle> + <Collision>Σύγκρουση</Collision> + <ScaleBorderAndShadow>Κλίμακα ορίων και σκιάς</ScaleBorderAndShadow> + </SubStationAlphaProperties> + <SubStationAlphaStyles> + <Title>Προχωρημένα στυλ Sub Station Alpha</Title> + <TitleSubstationAlpha>Στυλ Sub Station Alpha</TitleSubstationAlpha> + <Styles>Στυλ</Styles> + <Properties>Ιδιότητες</Properties> + <Name>Όνομα</Name> + <Font>Γραμματοσειρά</Font> + <FontName>Όνομα γραμματοσειράς</FontName> + <FontSize>Μέγεθος γραμματοσειράς</FontSize> + <UseCount>Χρησιμοποιημένα</UseCount> + <Primary>Πρωτογενής</Primary> + <Secondary>Δευτερογενής</Secondary> + <Tertiary>Τριτογενής</Tertiary> + <Outline>Περίγραμμα</Outline> + <Shadow>Σκιά</Shadow> + <Back>Πίσω</Back> + <Alignment>Στοίχιση</Alignment> + <TopLeft>Επάνω/αριστερά</TopLeft> + <TopCenter>Επάνω/κέντρο</TopCenter> + <TopRight>Επάνω/δεξιά</TopRight> + <MiddleLeft>Μέση/αριστερά</MiddleLeft> + <MiddleCenter>Μέση/κέντρο</MiddleCenter> + <MiddleRight>Μέση/δεξιά</MiddleRight> + <BottomLeft>Κάτω/αριστερά</BottomLeft> + <BottomCenter>Κάτω/κέντρο</BottomCenter> + <BottomRight>Κάτω/δεξιά</BottomRight> + <Colors>Χρώματα</Colors> + <Margins>Περιθώρια</Margins> + <MarginLeft>Περιθώριο αριστερά</MarginLeft> + <MarginRight>Περιθώριο δεξιά</MarginRight> + <MarginVertical>Περιθώριο κάθετα</MarginVertical> + <Border>Όριο</Border> + <PlusShadow>+ Σκιά</PlusShadow> + <OpaqueBox>Αδιαφανές πλαίσιο (χρήση χρώματος περιγράμματος)</OpaqueBox> + <Import>Εισαγωγή...</Import> + <Export>Εξαγωγή...</Export> + <Copy>Αντιγραφή</Copy> + <CopyOfY>Αντιγραφή από {0}</CopyOfY> + <CopyXOfY>Αντιγραφή {0} από {1}</CopyXOfY> + <New>Νέο</New> + <Remove>Αφαίρεση</Remove> + <RemoveAll>Αφ. όλων</RemoveAll> + <ImportStyleFromFile>Εισαγωγή στυλ από αρχείο...</ImportStyleFromFile> + <ExportStyleToFile>Εξαγωγή στυλ σε αρχείο... (προσθήκη σε περίπτωση υπάρχοντος στυλ)</ExportStyleToFile> + <ChooseStyle>Επιλογή στυλ για εισαγωγή</ChooseStyle> + <StyleAlreadyExits>Υπάρχον στυλ: {0}</StyleAlreadyExits> + <StyleXExportedToFileY>Το στυλ '{0}' έχει εξαχθεί στο αρχείο '{1}'</StyleXExportedToFileY> + <StyleXImportedFromFileY>Το στυλ '{0}' έχει εισαχθεί από το αρχείο '{1}'</StyleXImportedFromFileY> + </SubStationAlphaStyles> + <PointSync> + <Title>Συγχρονισμός σημείων</Title> + <TitleViaOtherSubtitle>Συγχρονισμός σημείων μέσω άλλου υπότιτλου</TitleViaOtherSubtitle> + <SyncHelp>Ορισμός δύο σημείων συγχρονισμού για πρόχειρο συγχρονισμό</SyncHelp> + <SetSyncPoint>Ορισμός σημείου συγχρονισμού</SetSyncPoint> + <RemoveSyncPoint>Αφαίρεση σημείου συγχρονισμού</RemoveSyncPoint> + <SyncPointsX>Σημείο συγχρονισμού: {0}</SyncPointsX> + <Info>Ένα σημείο συγχρονισμού θα προσαρμόσει τη θέση, δύο ή περισσότερα θα προσαρμόσουν τη θέση και την ταχύτητα</Info> + <ApplySync>Εφαρμογή</ApplySync> + </PointSync> + <TransportStreamSubtitleChooser> + <Title>Επιλογέας ροής μεταφοράς υποτίτλου - {0}</Title> + <PidLineImage>Εικόνες - Αναγνωριστικό πακέτου μεταφοράς = {0}, γλώσσα = {1}, αριθμός υποτίτλων = {2}</PidLineImage> + <PidLineTeletext>Τηλεκίμενο - Αναγνωριστικό πακέτου μεταφοράς = {1}, σελίδα = {0}, γλώσσα = {2}, αριθμός υποτίτλων = {3}</PidLineTeletext> + <SubLine>{0}: {1} -&gt; {2}, {3} εικόνα(ες)</SubLine> + </TransportStreamSubtitleChooser> + <UnknownSubtitle> + <Title>Άγνωστος τύπος υπότιτλου</Title> + <Message>Αν θέλετε αυτό να φτιαχτεί παρακαλώ στείλτε email στο mailto:niksedk@gmail.com και συμπεριλάβετε ένα αντίγραφο του υπότιτλου.</Message> + <ImportAsPlainText>Εισαγωγή ως απλό κείμενο...</ImportAsPlainText> + </UnknownSubtitle> + <VisualSync> + <Title>Οπτικός συγχρονισμός</Title> + <StartScene>Αρχική σκηνή</StartScene> + <EndScene>Τελική σκηνή</EndScene> + <Synchronize>Συγχρονισμός</Synchronize> + <HalfASecondBack>&lt; ½ δευτ.</HalfASecondBack> + <ThreeSecondsBack>&lt; 3 δευτ.</ThreeSecondsBack> + <PlayXSecondsAndBack>Αναπαραγωγή {0} δευτ. και πίσω</PlayXSecondsAndBack> + <FindText>Εύρεση κειμένου</FindText> + <GoToSubPosition>Μετάβαση στη θέση του υπότιτλου</GoToSubPosition> + <KeepChangesTitle>Διατήρηση αλλαγών;</KeepChangesTitle> + <KeepChangesMessage>Έχουν γίνει αλλαγές στον υπότιτλο μέσω 'Οπτικού συγχρονισμού'. +Διατήρηση αλλαγών;</KeepChangesMessage> + <SynchronizationDone>Ο συγχρονισμός ολοκληρώθηκε!</SynchronizationDone> + <StartSceneMustComeBeforeEndScene>Η αρχική σκηνή πρέπει να είναι πριν από την τελική!</StartSceneMustComeBeforeEndScene> + <Tip>Συμβουλή: Χρησιμοποιήστε &lt;ctrl+βέλη αριστερά/δεξιά&gt; για να μετακινηθείτε 100 χιλ. δευτ. πίσω/εμπρός</Tip> + </VisualSync> + <VobSubEditCharacters> + <Title>Επεξεργασία βάσης δεδομένων σύγκρισης εικόνων</Title> + <ChooseCharacter>Επιλογή χαρακτήρα(ων)</ChooseCharacter> + <ImageCompareFiles>Αρχεία σύγκρισης εικόνων</ImageCompareFiles> + <CurrentCompareImage>Τρέχουσα εικόνα σύγκρισης</CurrentCompareImage> + <TextAssociatedWithImage>Κείμενο που σχετίζεται με την εικόνα</TextAssociatedWithImage> + <IsItalic>Είναι &amp;πλαγιαστό</IsItalic> + <Update>&amp;Ενημέρωση</Update> + <Delete>&amp;Διαγραφή</Delete> + <ImageDoubleSize>Διπλό μέγεθος εικόνας</ImageDoubleSize> + <ImageFileNotFound>Το αρχείο εικόνας δεν βρέθηκε</ImageFileNotFound> + <Image>Εικόνα</Image> + </VobSubEditCharacters> + <VobSubOcr> + <Title>Εισαγωγή/OCR υπότιτλου VobSub (sub/idx)</Title> + <TitleBluRay>Εισαγωγή/OCR υπότιτλου Blu-ray (.sup)</TitleBluRay> + <OcrMethod>Μέθοδος OCR</OcrMethod> + <OcrViaTesseractVersionX>Tesseract {0}</OcrViaTesseractVersionX> + <OcrViaImageCompare>OCR μέσω σύγκρισης εικόνων</OcrViaImageCompare> + <OcrViaModi>OCR μέσω Microsoft Office Document Imaging (MODI). Προϋποθέτει Microsoft Office</OcrViaModi> + <OcrViaNOCR>OCR μέσω nOCR</OcrViaNOCR> + <TesseractEngineMode>Λειτουργία μηχανής</TesseractEngineMode> + <TesseractEngineModeLegacy>Αρχικό Tesseract (ανίχνευση πλαγιαστών)</TesseractEngineModeLegacy> + <TesseractEngineModeNeural>Δίκτυα LSTM</TesseractEngineModeNeural> + <TesseractEngineModeBoth>Tesseract + LSTM</TesseractEngineModeBoth> + <TesseractEngineModeDefault>Προεπιλεγμένο, βάσει διαθέσιμων</TesseractEngineModeDefault> + <Language>Γλώσσα</Language> + <ImageDatabase>Βάση δεδομένων εικόνων</ImageDatabase> + <NoOfPixelsIsSpace>Σύνολο εικονοστοιχείων διαστημάτων</NoOfPixelsIsSpace> + <MaxErrorPercent>Μέγιστο σφάλμα%</MaxErrorPercent> + <New>Νέο</New> + <Edit>Επεξεργασία</Edit> + <StartOcr>Έναρξη OCR</StartOcr> + <Stop>Διακοπή</Stop> + <StartOcrFrom>Έναρξη OCR από τον αριθμό υπότιτλου:</StartOcrFrom> + <LoadingVobSubImages>Φόρτωση εικόνων VobSub...</LoadingVobSubImages> + <LoadingImageCompareDatabase>Φόρτωση βάσης δεδομένων εικόνων σύγκρισης...</LoadingImageCompareDatabase> + <ConvertingImageCompareDatabase>Μετατροπή βάσης δεδομένων εικόνων σύγκρισης σε νέο τύπο (images.db/images.xml)...</ConvertingImageCompareDatabase> + <SubtitleImage>Εικόνα υπότιτλου</SubtitleImage> + <SubtitleText>Κείμενο υπότιτλου</SubtitleText> + <UnableToCreateCharacterDatabaseFolder>Αδυναμία δημιουργίας φακέλου 'Character Database Folder': {0}</UnableToCreateCharacterDatabaseFolder> + <SubtitleImageXofY>Εικόνα υπότιτλου {0} από {1}</SubtitleImageXofY> + <ImagePalette>Παλέτα εικόνας</ImagePalette> + <UseCustomColors>Χρήση προσαρμοσμένων χρωμάτων</UseCustomColors> + <Transparent>Χωρίς φόντο</Transparent> + <TransparentMinAlpha>Ελάχιστη τιμή άλφα (0=διαφανές, 255=πλήρως ορατό)</TransparentMinAlpha> + <TransportStream>Ροή μεταφοράς</TransportStream> + <TransportStreamGrayscale>Κλίμακα του γκρι</TransportStreamGrayscale> + <TransportStreamGetColor>Χρήση χρώματος (θα συμπεριληφθούν μερικές σπασμένες γραμμές)</TransportStreamGetColor> + <PromptForUnknownWords>Ερώτηση για άγνωστες λέξεις</PromptForUnknownWords> + <TryToGuessUnkownWords>Προσπάθεια μαντέματος άγνωστων λέξεων</TryToGuessUnkownWords> + <AutoBreakSubtitleIfMoreThanTwoLines>Αυτόματος διαχορισμός παραγράφου εάν έχει περισσότερες από δύο γραμμές</AutoBreakSubtitleIfMoreThanTwoLines> + <AllFixes>Όλες οι επιδιορθώσεις</AllFixes> + <GuessesUsed>Μαντεψιές</GuessesUsed> + <UnknownWords>Άγνωστες λέξεις</UnknownWords> + <UnknownWordToGuessInLine>{0} {1} μέσω λίστας διόρθωσης/αντικατάστασης OCR στη γραμμή: {2}</UnknownWordToGuessInLine> + <OcrAutoCorrectionSpellChecking>Αυτόματη διόρθωση/ορθογραφικός έλεγχος OCR</OcrAutoCorrectionSpellChecking> + <FixOcrErrors>Επιδιόρθωση σφαλμάτων OCR</FixOcrErrors> + <ImportTextWithMatchingTimeCodes>Εισαγωγή κειμένου με αντιστοιχία κωδικών χρόνου...</ImportTextWithMatchingTimeCodes> + <ImportNewTimeCodes>Εισαγωγή νέων κωδικών χρόνου</ImportNewTimeCodes> + <SaveSubtitleImageAs>Αποθήκευση εικόνας υπότιτλου ως...</SaveSubtitleImageAs> + <SaveAllSubtitleImagesAsBdnXml>Αποθήκευση όλων των εικόνων (png/bdn xml)...</SaveAllSubtitleImagesAsBdnXml> + <SaveAllSubtitleImagesWithHtml>Αποθήκευση όλων των εικόνων με HTML...</SaveAllSubtitleImagesWithHtml> + <XImagesSavedInY>{0} εικόνες αποθηκεύτηκαν στο {1}</XImagesSavedInY> + <DictionaryX>Λεξικό: {0}</DictionaryX> + <RightToLeft>Δεξιά προς αριστερά</RightToLeft> + <ShowOnlyForcedSubtitles>Εμφάνιση μόνο υποχρεωτικών υποτίτλων</ShowOnlyForcedSubtitles> + <UseTimeCodesFromIdx>Χρήση κωδικών χρόνου από αρχείο .idx</UseTimeCodesFromIdx> + <NoMatch>&lt;Καμία αντιστοιχία&gt;</NoMatch> + <AutoTransparentBackground>Αυτόματη διαφάνεια φόντου</AutoTransparentBackground> + <CaptureTopAlign>Λήψη άνω στοίχισης</CaptureTopAlign> + <InspectCompareMatchesForCurrentImage>Έλεγχος αντιστοιχιών σύγκρισης για την τρέχουσα εικόνα...</InspectCompareMatchesForCurrentImage> + <EditLastAdditions>Επεξεργασία προσθηκών της τελευταίας σύγκρισης εικόνας...</EditLastAdditions> + <SetItalicAngle>Ορισμός κλίσης πλαγιαστών...</SetItalicAngle> + <ItalicAngle>Κλίση πλαγιαστών</ItalicAngle> + <DiscardTitle>Απόρριψη αλλαγών του OCR;</DiscardTitle> + <DiscardText>Απόρριψη αλλαγών του OCR στην τρέχουσα συνεδρία;</DiscardText> + <MinLineSplitHeight>Ελάχιστο ύψος γραμμής (διαχωρισμός)</MinLineSplitHeight> + <FallbackToX>Επαναφορά σε {0}</FallbackToX> + <ImagePreProcessing>Προ-επεξεργασία εικόνας...</ImagePreProcessing> + <EditImageDb>Επεξεργασία βάσης δεδομένων εικόνας</EditImageDb> + <OcrTraining>Εκμάθηση OCR...</OcrTraining> + <SubtitleTrainingFile>Εκμάθηση με αρχείο υπότιτλου</SubtitleTrainingFile> + <LetterCombinations>Συνδυασμοί γράμματος που είναι χωρισμένο ως μία εικόνα</LetterCombinations> + <TrainingOptions>Επιλογές εκμάθησης</TrainingOptions> + <NumberOfSegments>Αριθμός τμημάτων ανά γράμμα</NumberOfSegments> + <AlsoTrainItalic>Εκμάθηση πλαγιαστών</AlsoTrainItalic> + <AlsoTrainBold>Εκμάθηση έντονων</AlsoTrainBold> + <StartTraining>Έναρξη εκμάθησης</StartTraining> + <NowTraining>Εκμάθηση γραμματοσειράς '{1}. Σύνολο χαρακτήρων που μαθεύτηκαν: {0:#,###,##0}, {2:#,###,##0} γνωστά</NowTraining> + </VobSubOcr> + <VobSubOcrCharacter> + <Title>OCR - Εικόνα σε κείμενο χειροκίνητα</Title> + <ShrinkSelection>Σμίκρυνση επιλογής</ShrinkSelection> + <ExpandSelection>Επέκταση επιλογής</ExpandSelection> + <SubtitleImage>Εικόνα υπότιτλου</SubtitleImage> + <Characters>Χαρακτήρας(ες)</Characters> + <CharactersAsText>Χαρακτήρας(ες) ως κείμενο</CharactersAsText> + <Italic>&amp;Πλαγιστά</Italic> + <Abort>&amp;Ματαίωση</Abort> + <Skip>Π&amp;αράβλεψη</Skip> + <Nordic>Σκανδιναβικά</Nordic> + <Spanish>Ισπανικά</Spanish> + <German>Γερμανικά</German> + <AutoSubmitOnFirstChar>Αυτόματη αποστολή στον &amp;πρώτο χαρακτήρα</AutoSubmitOnFirstChar> + <EditLastX>Επεξεργασία τελευταίου: {0}</EditLastX> + </VobSubOcrCharacter> + <VobSubOcrCharacterInspect> + <Title>Έλεγχος αντιστοιχιών σύγκρισης για την τρέχουσα εικόνα</Title> + <InspectItems>Έλεγχος στοιχείων</InspectItems> + <AddBetterMatch>Προσθήκη καλύτερης αντιστοιχίας</AddBetterMatch> + <Add>Προσθήκη</Add> + </VobSubOcrCharacterInspect> + <VobSubOcrNewFolder> + <Title>Νέος φάκελος</Title> + <Message>Όνομα νέου φακέλου βάσης δεδομένων χαρακτήρων</Message> + </VobSubOcrNewFolder> + <VobSubOcrSetItalicAngle> + <Title>Ορισμός κλίσης πλαγιαστών</Title> + <Description>Προσαρμογή τιμής μέχρι το στυλ κειμένου να είναι κανονικό. Το αρχικό κείμενο έχει πλαγιαστό στυλ.</Description> + </VobSubOcrSetItalicAngle> + <OcrPreprocessing> + <Title>Προ-επεξεργασία εικόνας με OCR</Title> + <Colors>Χρώματα</Colors> + <AdjustAlpha>Προσαρμογή τιμής μέχρι το κείμενο να είναι ορατό (εύρος τιμών μεταξύ 200 έως 300)</AdjustAlpha> + <OriginalImage>Αρχική εικόνα</OriginalImage> + <PostImage>Εικόνα μετά την προ-επεξεργασία</PostImage> + <BinaryThreshold>Όριο σύγκρισης δυαδικής εικόνας</BinaryThreshold> + <InvertColors>Αντιστροφή χρωμάτων</InvertColors> + <YellowToWhite>Κίτρινο σε άσπρο</YellowToWhite> + <ColorToWhite>Χρώμα σε άσπρο</ColorToWhite> + <ColorToRemove>Αφαίρεση χρώματος</ColorToRemove> + <Cropping>Κόψιμο</Cropping> + <CropTransparentColors>Κόψιμο διαφανών χρωμάτων</CropTransparentColors> + </OcrPreprocessing> + <Watermark> + <Title>Υδατόσημο</Title> + <WatermarkX>Υδατόσημο: {0}</WatermarkX> + <GenerateWatermarkTitle>Δημιουργία υδατόσημου</GenerateWatermarkTitle> + <SpreadOverEntireSubtitle>Εξάπλωση σε όλον τον υπότιτλο</SpreadOverEntireSubtitle> + <CurrentLineOnlyX>Μόνο σε τρέχουσα γραμμή: {0}</CurrentLineOnlyX> + <Generate>Δημιουργία</Generate> + <Remove>Αφαίρεση</Remove> + <BeforeWatermark>Πριν του υδατόσημου</BeforeWatermark> + <ErrorUnicodeEncodingOnly>Το υδατόσημολειτουργεί μόνο με κωδικοποίηση αρχείου unicode.</ErrorUnicodeEncodingOnly> + </Watermark> + <Waveform> + <ClickToAddWaveform>Κάντε κλικ για προσθήκη κυματομορφής</ClickToAddWaveform> + <ClickToAddWaveformAndSpectrogram>Κάντε κλικ για προσθήκη κυματομορφής/φασματογράμματος</ClickToAddWaveformAndSpectrogram> + <Seconds>δευτ.</Seconds> + <ZoomIn>Μεγέθυνση</ZoomIn> + <ZoomOut>Σμίκρυνση</ZoomOut> + <AddParagraphHere>Προσθήκη κειμένου</AddParagraphHere> + <AddParagraphHereAndPasteText>Προσθήκη κειμένου από το πρόχειρο</AddParagraphHereAndPasteText> + <SetParagraphAsSelection>Καθορισμός ως νέας επιλογής</SetParagraphAsSelection> + <FocusTextBox>Εστίαση πλαισίου κειμένου</FocusTextBox> + <GoToPrevious>Μετάβαση στον προηγούμενο υπότιτλο</GoToPrevious> + <GoToNext>Μετάβαση στον επόμενο υπότιτλο</GoToNext> + <DeleteParagraph>Διαγραφή κειμένου</DeleteParagraph> + <Split>Διαχωρισμός</Split> + <SplitAtCursor>Διαχωρισμός στη θέση του δείκτη</SplitAtCursor> + <MergeWithPrevious>Συγχώνευση με προηγούμενο</MergeWithPrevious> + <MergeWithNext>Συγχώνευση με επόμενο</MergeWithNext> + <ExtendToPrevious>Επέκταση μέχρι το προηγούμενο</ExtendToPrevious> + <ExtendToNext>Επέκταση μέχρι το επόμενο</ExtendToNext> + <PlaySelection>Αναπαραγωγή επιλογής</PlaySelection> + <ShowWaveformAndSpectrogram>Εμφάνιση κυματομορφής και φασματογράμματος</ShowWaveformAndSpectrogram> + <ShowWaveformOnly>Εμφάνιση μόνο κυματομορφής</ShowWaveformOnly> + <ShowSpectrogramOnly>Εμφάνιση μόνο φασματογράμματος</ShowSpectrogramOnly> + <AddSceneChange>Προσθήκη αλλαγής σκηνής</AddSceneChange> + <RemoveSceneChange>Αφαίρεση αλλαγής σκηνής</RemoveSceneChange> + <GuessTimeCodes>Μάντεψε τους κώδικες χρόνου...</GuessTimeCodes> + <SeekSilence>Αναζήτηση σιωπής...</SeekSilence> + <InsertSubtitleHere>Εισαγωγή υπότιτλου εδώ...</InsertSubtitleHere> + <CharsSecX>Χαρ/δευτ: {0:0.00}</CharsSecX> + <WordsMinX>Λέξεις/λεπτό: {0:0.00}</WordsMinX> + </Waveform> + <WaveformGenerateTimeCodes> + <Title>Εικασία κωδικών χρόνου</Title> + <StartFrom>Έναρξη από</StartFrom> + <CurrentVideoPosition>Τρέχουσα θέση βίντεο</CurrentVideoPosition> + <Beginning>Έναρξη</Beginning> + <DeleteLines>Διαγραφή γραμμών</DeleteLines> + <FromCurrentVideoPosition>Από την τρέχουσα θέση βίντεο</FromCurrentVideoPosition> + <DetectOptions>Εντοπισμός επιλογών</DetectOptions> + <ScanBlocksOfMs>Σάρωση των μπλοκ χιλιοστών του δευτερολέπτου</ScanBlocksOfMs> + <BlockAverageVolMin1>Η μέση τιμή των μπλοκ έντασης πρέπει να είναι πάνω από</BlockAverageVolMin1> + <BlockAverageVolMin2>% από τη μέση συνολική ένταση</BlockAverageVolMin2> + <BlockAverageVolMax1>Η μέση τιμή των μπλοκ έντασης πρέπει να είναι κάτω από</BlockAverageVolMax1> + <BlockAverageVolMax2>% από την μέγιστη συνολική ένταση</BlockAverageVolMax2> + <SplitLongLinesAt1>Διαχωρισμός μεγάλων υποτίτλων σε</SplitLongLinesAt1> + <SplitLongLinesAt2>χιλιοστά δευτερολέπτου</SplitLongLinesAt2> + <Other>Άλλο</Other> + </WaveformGenerateTimeCodes> + <WebVttNewVoice> + <Title>WebVTT - καθορισμός νέας φωνής</Title> + <VoiceName>Όνομα φωνής</VoiceName> + </WebVttNewVoice> </Language> \ No newline at end of file diff --git a/src/Languages/es-AR.xml b/src/ui/Languages/es-AR.xml similarity index 100% rename from src/Languages/es-AR.xml rename to src/ui/Languages/es-AR.xml diff --git a/src/Languages/es-ES.xml b/src/ui/Languages/es-ES.xml similarity index 100% rename from src/Languages/es-ES.xml rename to src/ui/Languages/es-ES.xml diff --git a/src/Languages/es-MX.xml b/src/ui/Languages/es-MX.xml similarity index 100% rename from src/Languages/es-MX.xml rename to src/ui/Languages/es-MX.xml diff --git a/src/Languages/eu-ES.xml b/src/ui/Languages/eu-ES.xml similarity index 100% rename from src/Languages/eu-ES.xml rename to src/ui/Languages/eu-ES.xml diff --git a/src/Languages/fa-IR.xml b/src/ui/Languages/fa-IR.xml similarity index 100% rename from src/Languages/fa-IR.xml rename to src/ui/Languages/fa-IR.xml diff --git a/src/Languages/fi-FI.xml b/src/ui/Languages/fi-FI.xml similarity index 100% rename from src/Languages/fi-FI.xml rename to src/ui/Languages/fi-FI.xml diff --git a/src/Languages/fr-BE.xml b/src/ui/Languages/fr-BE.xml similarity index 100% rename from src/Languages/fr-BE.xml rename to src/ui/Languages/fr-BE.xml diff --git a/src/Languages/fr-FR.xml b/src/ui/Languages/fr-FR.xml similarity index 100% rename from src/Languages/fr-FR.xml rename to src/ui/Languages/fr-FR.xml diff --git a/src/Languages/hr-HR.xml b/src/ui/Languages/hr-HR.xml similarity index 100% rename from src/Languages/hr-HR.xml rename to src/ui/Languages/hr-HR.xml diff --git a/src/Languages/hu-HU.xml b/src/ui/Languages/hu-HU.xml similarity index 100% rename from src/Languages/hu-HU.xml rename to src/ui/Languages/hu-HU.xml diff --git a/src/Languages/id-ID.xml b/src/ui/Languages/id-ID.xml similarity index 100% rename from src/Languages/id-ID.xml rename to src/ui/Languages/id-ID.xml diff --git a/src/Languages/it-IT.xml b/src/ui/Languages/it-IT.xml similarity index 100% rename from src/Languages/it-IT.xml rename to src/ui/Languages/it-IT.xml diff --git a/src/Languages/ja-JP.xml b/src/ui/Languages/ja-JP.xml similarity index 100% rename from src/Languages/ja-JP.xml rename to src/ui/Languages/ja-JP.xml diff --git a/src/Languages/ko-KR.xml b/src/ui/Languages/ko-KR.xml similarity index 100% rename from src/Languages/ko-KR.xml rename to src/ui/Languages/ko-KR.xml diff --git a/src/Languages/mk-MK.xml b/src/ui/Languages/mk-MK.xml similarity index 100% rename from src/Languages/mk-MK.xml rename to src/ui/Languages/mk-MK.xml diff --git a/src/Languages/nb-NO.xml b/src/ui/Languages/nb-NO.xml similarity index 100% rename from src/Languages/nb-NO.xml rename to src/ui/Languages/nb-NO.xml diff --git a/src/Languages/nl-NL.xml b/src/ui/Languages/nl-NL.xml similarity index 100% rename from src/Languages/nl-NL.xml rename to src/ui/Languages/nl-NL.xml diff --git a/src/Languages/pl-PL.xml b/src/ui/Languages/pl-PL.xml similarity index 100% rename from src/Languages/pl-PL.xml rename to src/ui/Languages/pl-PL.xml diff --git a/src/Languages/pt-BR.xml b/src/ui/Languages/pt-BR.xml similarity index 100% rename from src/Languages/pt-BR.xml rename to src/ui/Languages/pt-BR.xml diff --git a/src/Languages/pt-PT.xml b/src/ui/Languages/pt-PT.xml similarity index 100% rename from src/Languages/pt-PT.xml rename to src/ui/Languages/pt-PT.xml diff --git a/src/Languages/ro-RO.xml b/src/ui/Languages/ro-RO.xml similarity index 100% rename from src/Languages/ro-RO.xml rename to src/ui/Languages/ro-RO.xml diff --git a/src/Languages/ru-RU.xml b/src/ui/Languages/ru-RU.xml similarity index 100% rename from src/Languages/ru-RU.xml rename to src/ui/Languages/ru-RU.xml diff --git a/src/Languages/sl-SI.xml b/src/ui/Languages/sl-SI.xml similarity index 100% rename from src/Languages/sl-SI.xml rename to src/ui/Languages/sl-SI.xml diff --git a/src/Languages/sr-Cyrl-RS.xml b/src/ui/Languages/sr-Cyrl-RS.xml similarity index 100% rename from src/Languages/sr-Cyrl-RS.xml rename to src/ui/Languages/sr-Cyrl-RS.xml diff --git a/src/Languages/sr-Latn-RS.xml b/src/ui/Languages/sr-Latn-RS.xml similarity index 100% rename from src/Languages/sr-Latn-RS.xml rename to src/ui/Languages/sr-Latn-RS.xml diff --git a/src/Languages/sv-SE.xml b/src/ui/Languages/sv-SE.xml similarity index 100% rename from src/Languages/sv-SE.xml rename to src/ui/Languages/sv-SE.xml diff --git a/src/Languages/th-TH.xml b/src/ui/Languages/th-TH.xml similarity index 100% rename from src/Languages/th-TH.xml rename to src/ui/Languages/th-TH.xml diff --git a/src/Languages/tr-TR.xml b/src/ui/Languages/tr-TR.xml similarity index 100% rename from src/Languages/tr-TR.xml rename to src/ui/Languages/tr-TR.xml diff --git a/src/Languages/uk-UA.xml b/src/ui/Languages/uk-UA.xml similarity index 100% rename from src/Languages/uk-UA.xml rename to src/ui/Languages/uk-UA.xml diff --git a/src/Languages/vi-VN.xml b/src/ui/Languages/vi-VN.xml similarity index 100% rename from src/Languages/vi-VN.xml rename to src/ui/Languages/vi-VN.xml diff --git a/src/Languages/zh-Hans.xml b/src/ui/Languages/zh-Hans.xml similarity index 100% rename from src/Languages/zh-Hans.xml rename to src/ui/Languages/zh-Hans.xml diff --git a/src/Languages/zh-TW.xml b/src/ui/Languages/zh-TW.xml similarity index 100% rename from src/Languages/zh-TW.xml rename to src/ui/Languages/zh-TW.xml diff --git a/src/Logic/ColorChooser/ColorChangedEventArgs.cs b/src/ui/Logic/ColorChooser/ColorChangedEventArgs.cs similarity index 100% rename from src/Logic/ColorChooser/ColorChangedEventArgs.cs rename to src/ui/Logic/ColorChooser/ColorChangedEventArgs.cs diff --git a/src/Logic/ColorChooser/ColorHandler.cs b/src/ui/Logic/ColorChooser/ColorHandler.cs similarity index 100% rename from src/Logic/ColorChooser/ColorHandler.cs rename to src/ui/Logic/ColorChooser/ColorHandler.cs diff --git a/src/Logic/ColorChooser/ColorWheel.cs b/src/ui/Logic/ColorChooser/ColorWheel.cs similarity index 100% rename from src/Logic/ColorChooser/ColorWheel.cs rename to src/ui/Logic/ColorChooser/ColorWheel.cs diff --git a/src/Logic/CommandLineConvert/BluRaySupToBluRaySup.cs b/src/ui/Logic/CommandLineConvert/BluRaySupToBluRaySup.cs similarity index 100% rename from src/Logic/CommandLineConvert/BluRaySupToBluRaySup.cs rename to src/ui/Logic/CommandLineConvert/BluRaySupToBluRaySup.cs diff --git a/src/Logic/CommandLineConvert/CommandLineConverter.cs b/src/ui/Logic/CommandLineConvert/CommandLineConverter.cs similarity index 100% rename from src/Logic/CommandLineConvert/CommandLineConverter.cs rename to src/ui/Logic/CommandLineConvert/CommandLineConverter.cs diff --git a/src/Logic/CommandLineConvert/TsConvert.cs b/src/ui/Logic/CommandLineConvert/TsConvert.cs similarity index 100% rename from src/Logic/CommandLineConvert/TsConvert.cs rename to src/ui/Logic/CommandLineConvert/TsConvert.cs diff --git a/src/Logic/CommandLineConvert/TsToBdnXml.cs b/src/ui/Logic/CommandLineConvert/TsToBdnXml.cs similarity index 100% rename from src/Logic/CommandLineConvert/TsToBdnXml.cs rename to src/ui/Logic/CommandLineConvert/TsToBdnXml.cs diff --git a/src/Logic/CommandLineConvert/TsToBluRaySup.cs b/src/ui/Logic/CommandLineConvert/TsToBluRaySup.cs similarity index 100% rename from src/Logic/CommandLineConvert/TsToBluRaySup.cs rename to src/ui/Logic/CommandLineConvert/TsToBluRaySup.cs diff --git a/src/Logic/DarkTheme.cs b/src/ui/Logic/DarkTheme.cs similarity index 100% rename from src/Logic/DarkTheme.cs rename to src/ui/Logic/DarkTheme.cs diff --git a/src/Logic/FindReplaceDialogHelper.cs b/src/ui/Logic/FindReplaceDialogHelper.cs similarity index 97% rename from src/Logic/FindReplaceDialogHelper.cs rename to src/ui/Logic/FindReplaceDialogHelper.cs index 91144b4a3..2a9d5b446 100644 --- a/src/Logic/FindReplaceDialogHelper.cs +++ b/src/ui/Logic/FindReplaceDialogHelper.cs @@ -1,445 +1,445 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.Enums; -using System; -using System.Text.RegularExpressions; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Logic -{ - public class FindReplaceDialogHelper - { - private const string SeparatorChars = " #><-\"„”“[]'‘`´¶(){}♪,.!?:;¿¡.…—،؟\r\n\u2028"; - private Regex _regEx; - - public bool Success { get; set; } - public ReplaceType FindReplaceType { get; set; } - public int SelectedIndex { get; set; } - public int SelectedPosition { get; set; } - public int ReplaceFromPosition { get; set; } - public int StartLineIndex { get; set; } - public bool MatchInOriginal { get; set; } - public bool InProgress { get; set; } - - public int FindTextLength { get; private set; } - - public string FindText { get; } - - public string ReplaceText { get; } - - public FindReplaceDialogHelper(ReplaceType findType, string findText, Regex regEx, string replaceText, int startLineIndex) - { - ReplaceText = string.Empty; - FindReplaceType = findType; - FindText = findText; - - ReplaceText = replaceText; - if (ReplaceText != null) - { - ReplaceText = RegexUtils.FixNewLine(ReplaceText); - } - - _regEx = regEx; - FindTextLength = findText.Length; - StartLineIndex = startLineIndex; - MatchInOriginal = false; - } - - public bool Find(Subtitle subtitle, Subtitle originalSubtitle, int startIndex, int startPosition = 0) - { - return FindNext(subtitle, originalSubtitle, startIndex, startPosition, Configuration.Settings.General.AllowEditOfOriginalSubtitle); - } - - public bool Find(TextBox textBox, int startIndex) - { - return FindNext(textBox.Text, startIndex); - } - - private int FindPositionInText(string text, int startIndex) - { - if (startIndex >= text.Length && !(FindReplaceType.FindType == FindType.RegEx && startIndex == 0)) - { - return -1; - } - - if (FindReplaceType.FindType == FindType.CaseSensitive || FindReplaceType.FindType == FindType.Normal) - { - var comparison = GetComparison(); - var idx = text.IndexOf(FindText, startIndex, comparison); - while (idx >= 0) - { - if (FindReplaceType.WholeWord) - { - var startOk = idx == 0 || SeparatorChars.Contains(text[idx - 1]); - var endOk = idx + FindText.Length == text.Length || SeparatorChars.Contains(text[idx + FindText.Length]); - if (startOk && endOk) - { - return idx; - } - } - else - { - return idx; - } - idx = text.IndexOf(FindText, idx + FindText.Length, comparison); - } - return -1; - } - - var match = _regEx.Match(text, startIndex); - if (match.Success) - { - string groupName = RegexUtils.GetRegExGroup(FindText); - if (groupName != null && match.Groups[groupName] != null && match.Groups[groupName].Success) - { - FindTextLength = match.Groups[groupName].Length; - return match.Groups[groupName].Index; - } - FindTextLength = match.Length; - return match.Index; - } - return -1; - } - - public bool FindNext(Subtitle subtitle, Subtitle originalSubtitle, int startIndex, int position, bool allowEditOfOriginalSubtitle) - { - Success = false; - int index = 0; - if (position < 0) - { - position = 0; - } - - bool first = true; - foreach (Paragraph p in subtitle.Paragraphs) - { - if (index >= startIndex) - { - if (!first) - { - position = 0; - } - - int pos; - if (!MatchInOriginal) - { - pos = FindPositionInText(p.Text, position); - if (pos >= 0) - { - MatchInOriginal = false; - SelectedIndex = index; - SelectedPosition = pos; - ReplaceFromPosition = pos; - Success = true; - return true; - } - position = 0; - } - if (index < subtitle.Paragraphs.Count - 1) - { - MatchInOriginal = false; - } - - if (originalSubtitle != null && allowEditOfOriginalSubtitle) - { - Paragraph o = Utilities.GetOriginalParagraph(index, p, originalSubtitle.Paragraphs); - if (o != null) - { - pos = FindPositionInText(o.Text, position); - if (pos >= 0) - { - MatchInOriginal = true; - SelectedIndex = index; - SelectedPosition = pos; - ReplaceFromPosition = pos; - Success = true; - return true; - } - } - } - first = false; - } - index++; - } - return false; - } - - public bool FindPrevious(Subtitle subtitle, Subtitle originalSubtitle, int startIndex, int position, bool allowEditOfOriginalSubtitle) - { - Success = false; - int index = startIndex; - bool first = true; - for (var i = startIndex; i >= 0; i--) - { - Paragraph p = subtitle.Paragraphs[i]; - - if (originalSubtitle != null && allowEditOfOriginalSubtitle) - { - if (!first || MatchInOriginal) - { - Paragraph o = Utilities.GetOriginalParagraph(index, p, originalSubtitle.Paragraphs); - if (o != null) - { - if (!first) - { - position = o.Text.Length - 1; - } - - for (var j = 0; j <= position; j++) - { - if (position - j >= 0 && position - j + j < o.Text.Length) - { - var t = o.Text.Substring(position - j, j); - int pos = FindPositionInText(t, 0); - if (pos >= 0) - { - pos += position - j; - MatchInOriginal = true; - SelectedIndex = index; - SelectedPosition = pos; - ReplaceFromPosition = pos; - Success = true; - return true; - } - } - } - } - position = p.Text.Length - 1; - } - } - - MatchInOriginal = false; - if (!first) - { - position = p.Text.Length - 1; - } - - for (var j = 0; j <= position; j++) - { - if (position - j >= 0 && position < p.Text.Length) - { - var t = p.Text.Substring(position - j, j + 1); - int pos = FindPositionInText(t, 0); - if (pos >= 0) - { - pos += position - j; - MatchInOriginal = false; - SelectedIndex = index; - SelectedPosition = pos; - ReplaceFromPosition = pos; - Success = true; - return true; - } - } - } - position = 0; - first = false; - index--; - } - return false; - } - - public static ContextMenu GetRegExContextMenu(TextBox textBox) - { - var cm = new ContextMenu(); - var l = Configuration.Settings.Language.RegularExpressionContextMenu; - cm.MenuItems.Add(l.WordBoundary, delegate { textBox.SelectedText = "\\b"; }); - cm.MenuItems.Add(l.NonWordBoundary, delegate { textBox.SelectedText = "\\B"; }); - cm.MenuItems.Add(l.NewLine, delegate { textBox.SelectedText = "\\r\\n"; }); - cm.MenuItems.Add(l.AnyDigit, delegate { textBox.SelectedText = "\\d"; }); - cm.MenuItems.Add(l.NonDigit, delegate { textBox.SelectedText = "\\D"; }); - cm.MenuItems.Add(l.AnyCharacter, delegate { textBox.SelectedText = "."; }); - cm.MenuItems.Add(l.AnyWhitespace, delegate { textBox.SelectedText = "\\s"; }); - cm.MenuItems.Add(l.NonSpaceCharacter, delegate { textBox.SelectedText = "\\S"; }); - cm.MenuItems.Add(l.ZeroOrMore, delegate { textBox.SelectedText = "*"; }); - cm.MenuItems.Add(l.OneOrMore, delegate { textBox.SelectedText = "+"; }); - cm.MenuItems.Add(l.InCharacterGroup, delegate { textBox.SelectedText = "[test]"; }); - cm.MenuItems.Add(l.NotInCharacterGroup, delegate { textBox.SelectedText = "[^test]"; }); - return cm; - } - - public static ContextMenu GetRegExContextMenu(ComboBox comboBox) - { - var cm = new ContextMenu(); - var l = Configuration.Settings.Language.RegularExpressionContextMenu; - cm.MenuItems.Add(l.WordBoundary, delegate { comboBox.SelectedText = "\\b"; }); - cm.MenuItems.Add(l.NonWordBoundary, delegate { comboBox.SelectedText = "\\B"; }); - cm.MenuItems.Add(l.NewLine, delegate { comboBox.SelectedText = "\\r\\n"; }); - cm.MenuItems.Add(l.AnyDigit, delegate { comboBox.SelectedText = "\\d"; }); - cm.MenuItems.Add(l.NonDigit, delegate { comboBox.SelectedText = "\\D"; }); - cm.MenuItems.Add(l.AnyCharacter, delegate { comboBox.SelectedText = "."; }); - cm.MenuItems.Add(l.AnyWhitespace, delegate { comboBox.SelectedText = "\\s"; }); - cm.MenuItems.Add(l.NonSpaceCharacter, delegate { comboBox.SelectedText = "\\S"; }); - cm.MenuItems.Add(l.ZeroOrMore, delegate { comboBox.SelectedText = "*"; }); - cm.MenuItems.Add(l.OneOrMore, delegate { comboBox.SelectedText = "+"; }); - cm.MenuItems.Add(l.InCharacterGroup, delegate { comboBox.SelectedText = "[test]"; }); - cm.MenuItems.Add(l.NotInCharacterGroup, delegate { comboBox.SelectedText = "[^test]"; }); - return cm; - } - - public static ContextMenu GetReplaceTextContextMenu(TextBox textBox) - { - var cm = new ContextMenu(); - cm.MenuItems.Add(Configuration.Settings.Language.RegularExpressionContextMenu.NewLineShort, delegate { textBox.SelectedText = "\\n"; }); - return cm; - } - - public bool FindNext(string text, int startIndex) - { - Success = false; - startIndex++; - if (startIndex < text.Length) - { - if (FindReplaceType.FindType == FindType.RegEx) - { - Match match = _regEx.Match(text, startIndex); - if (match.Success) - { - string groupName = RegexUtils.GetRegExGroup(FindText); - if (groupName != null && match.Groups[groupName] != null && match.Groups[groupName].Success) - { - FindTextLength = match.Groups[groupName].Length; - SelectedIndex = match.Groups[groupName].Index; - } - else - { - FindTextLength = match.Length; - SelectedIndex = match.Index; - } - Success = true; - } - return match.Success; - } - string searchText = text.Substring(startIndex); - int pos = FindPositionInText(searchText, 0); - if (pos >= 0) - { - SelectedIndex = pos + startIndex; - return true; - } - } - return false; - } - - public bool FindPrevious(string text, int startIndex) - { - Success = false; - startIndex--; - if (startIndex < text.Length) - { - if (FindReplaceType.FindType == FindType.RegEx) - { - var matches = _regEx.Matches(text.Substring(0, startIndex)); - if (matches.Count > 0) - { - string groupName = RegexUtils.GetRegExGroup(FindText); - var last = matches[matches.Count - 1]; - if (groupName != null && last.Groups[groupName] != null && last.Groups[groupName].Success) - { - FindTextLength = last.Groups[groupName].Length; - SelectedIndex = last.Groups[groupName].Index; - } - else - { - FindTextLength = last.Length; - SelectedIndex = last.Index; - } - Success = true; - } - return Success; - } - string searchText = text.Substring(0, startIndex); - int pos = -1; - var comparison = GetComparison(); - var idx = searchText.LastIndexOf(FindText, startIndex, comparison); - while (idx >= 0) - { - if (FindReplaceType.WholeWord) - { - var startOk = idx == 0 || SeparatorChars.Contains(searchText[idx - 1]); - var endOk = idx + FindText.Length == searchText.Length || SeparatorChars.Contains(searchText[idx + FindText.Length]); - if (startOk && endOk) - { - pos = idx; - break; - } - } - else - { - pos = idx; - break; - } - searchText = text.Substring(0, idx); - idx = searchText.LastIndexOf(FindText, comparison); - } - if (pos >= 0) - { - SelectedIndex = pos; - return true; - } - } - return false; - } - - - public int FindCount(Subtitle subtitle, bool wholeWord) - { - var count = 0; - // validate pattern if find type is regex - if (FindReplaceType.FindType == FindType.RegEx) - { - var findText = RegexUtils.FixNewLine(FindText); - if (!RegexUtils.IsValidRegex(findText)) - { - MessageBox.Show(Configuration.Settings.Language.General.RegularExpressionIsNotValid); - return count; - } - _regEx = new Regex(findText); - } - var comparison = GetComparison(); - foreach (var p in subtitle.Paragraphs) - { - if (FindReplaceType.FindType == FindType.RegEx) - { - count += _regEx.Matches(p.Text).Count; - } - else - { - if (p.Text.Length < FindText.Length) - { - continue; - } - count += GetWordCount(p.Text, FindText, wholeWord, comparison); - } - } - return count; - } - - private int GetWordCount(string text, string pattern, bool matchWholeWord, StringComparison comparison) - { - var idx = text.IndexOf(pattern, comparison); - var count = 0; - while (idx >= 0) - { - if (matchWholeWord) - { - var startOk = (idx == 0) || (SeparatorChars.Contains(text[idx - 1])); - var endOk = (idx + pattern.Length == text.Length) || (SeparatorChars.Contains(text[idx + pattern.Length])); - if (startOk && endOk) - { - count++; - } - } - else - { - count++; - } - idx = text.IndexOf(pattern, idx + pattern.Length, comparison); - } - return count; - } - - private StringComparison GetComparison() => FindReplaceType.FindType == FindType.Normal ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal; - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.Enums; +using System; +using System.Text.RegularExpressions; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Logic +{ + public class FindReplaceDialogHelper + { + private const string SeparatorChars = " #><-\"„”“[]'‘`´¶(){}♪,.!?:;¿¡.…—،؟\r\n\u2028"; + private Regex _regEx; + + public bool Success { get; set; } + public ReplaceType FindReplaceType { get; set; } + public int SelectedIndex { get; set; } + public int SelectedPosition { get; set; } + public int ReplaceFromPosition { get; set; } + public int StartLineIndex { get; set; } + public bool MatchInOriginal { get; set; } + public bool InProgress { get; set; } + + public int FindTextLength { get; private set; } + + public string FindText { get; } + + public string ReplaceText { get; } + + public FindReplaceDialogHelper(ReplaceType findType, string findText, Regex regEx, string replaceText, int startLineIndex) + { + ReplaceText = string.Empty; + FindReplaceType = findType; + FindText = findText; + + ReplaceText = replaceText; + if (ReplaceText != null) + { + ReplaceText = RegexUtils.FixNewLine(ReplaceText); + } + + _regEx = regEx; + FindTextLength = findText.Length; + StartLineIndex = startLineIndex; + MatchInOriginal = false; + } + + public bool Find(Subtitle subtitle, Subtitle originalSubtitle, int startIndex, int startPosition = 0) + { + return FindNext(subtitle, originalSubtitle, startIndex, startPosition, Configuration.Settings.General.AllowEditOfOriginalSubtitle); + } + + public bool Find(TextBox textBox, int startIndex) + { + return FindNext(textBox.Text, startIndex); + } + + private int FindPositionInText(string text, int startIndex) + { + if (startIndex >= text.Length && !(FindReplaceType.FindType == FindType.RegEx && startIndex == 0)) + { + return -1; + } + + if (FindReplaceType.FindType == FindType.CaseSensitive || FindReplaceType.FindType == FindType.Normal) + { + var comparison = GetComparison(); + var idx = text.IndexOf(FindText, startIndex, comparison); + while (idx >= 0) + { + if (FindReplaceType.WholeWord) + { + var startOk = idx == 0 || SeparatorChars.Contains(text[idx - 1]); + var endOk = idx + FindText.Length == text.Length || SeparatorChars.Contains(text[idx + FindText.Length]); + if (startOk && endOk) + { + return idx; + } + } + else + { + return idx; + } + idx = text.IndexOf(FindText, idx + FindText.Length, comparison); + } + return -1; + } + + var match = _regEx.Match(text, startIndex); + if (match.Success) + { + string groupName = RegexUtils.GetRegExGroup(FindText); + if (groupName != null && match.Groups[groupName] != null && match.Groups[groupName].Success) + { + FindTextLength = match.Groups[groupName].Length; + return match.Groups[groupName].Index; + } + FindTextLength = match.Length; + return match.Index; + } + return -1; + } + + public bool FindNext(Subtitle subtitle, Subtitle originalSubtitle, int startIndex, int position, bool allowEditOfOriginalSubtitle) + { + Success = false; + int index = 0; + if (position < 0) + { + position = 0; + } + + bool first = true; + foreach (Paragraph p in subtitle.Paragraphs) + { + if (index >= startIndex) + { + if (!first) + { + position = 0; + } + + int pos; + if (!MatchInOriginal) + { + pos = FindPositionInText(p.Text, position); + if (pos >= 0) + { + MatchInOriginal = false; + SelectedIndex = index; + SelectedPosition = pos; + ReplaceFromPosition = pos; + Success = true; + return true; + } + position = 0; + } + if (index < subtitle.Paragraphs.Count - 1) + { + MatchInOriginal = false; + } + + if (originalSubtitle != null && allowEditOfOriginalSubtitle) + { + Paragraph o = Utilities.GetOriginalParagraph(index, p, originalSubtitle.Paragraphs); + if (o != null) + { + pos = FindPositionInText(o.Text, position); + if (pos >= 0) + { + MatchInOriginal = true; + SelectedIndex = index; + SelectedPosition = pos; + ReplaceFromPosition = pos; + Success = true; + return true; + } + } + } + first = false; + } + index++; + } + return false; + } + + public bool FindPrevious(Subtitle subtitle, Subtitle originalSubtitle, int startIndex, int position, bool allowEditOfOriginalSubtitle) + { + Success = false; + int index = startIndex; + bool first = true; + for (var i = startIndex; i >= 0; i--) + { + Paragraph p = subtitle.Paragraphs[i]; + + if (originalSubtitle != null && allowEditOfOriginalSubtitle) + { + if (!first || MatchInOriginal) + { + Paragraph o = Utilities.GetOriginalParagraph(index, p, originalSubtitle.Paragraphs); + if (o != null) + { + if (!first) + { + position = o.Text.Length - 1; + } + + for (var j = 0; j <= position; j++) + { + if (position - j >= 0 && position - j + j < o.Text.Length) + { + var t = o.Text.Substring(position - j, j); + int pos = FindPositionInText(t, 0); + if (pos >= 0) + { + pos += position - j; + MatchInOriginal = true; + SelectedIndex = index; + SelectedPosition = pos; + ReplaceFromPosition = pos; + Success = true; + return true; + } + } + } + } + position = p.Text.Length - 1; + } + } + + MatchInOriginal = false; + if (!first) + { + position = p.Text.Length - 1; + } + + for (var j = 0; j <= position; j++) + { + if (position - j >= 0 && position < p.Text.Length) + { + var t = p.Text.Substring(position - j, j + 1); + int pos = FindPositionInText(t, 0); + if (pos >= 0) + { + pos += position - j; + MatchInOriginal = false; + SelectedIndex = index; + SelectedPosition = pos; + ReplaceFromPosition = pos; + Success = true; + return true; + } + } + } + position = 0; + first = false; + index--; + } + return false; + } + + public static ContextMenu GetRegExContextMenu(TextBox textBox) + { + var cm = new ContextMenu(); + var l = Configuration.Settings.Language.RegularExpressionContextMenu; + cm.MenuItems.Add(l.WordBoundary, delegate { textBox.SelectedText = "\\b"; }); + cm.MenuItems.Add(l.NonWordBoundary, delegate { textBox.SelectedText = "\\B"; }); + cm.MenuItems.Add(l.NewLine, delegate { textBox.SelectedText = "\\r\\n"; }); + cm.MenuItems.Add(l.AnyDigit, delegate { textBox.SelectedText = "\\d"; }); + cm.MenuItems.Add(l.NonDigit, delegate { textBox.SelectedText = "\\D"; }); + cm.MenuItems.Add(l.AnyCharacter, delegate { textBox.SelectedText = "."; }); + cm.MenuItems.Add(l.AnyWhitespace, delegate { textBox.SelectedText = "\\s"; }); + cm.MenuItems.Add(l.NonSpaceCharacter, delegate { textBox.SelectedText = "\\S"; }); + cm.MenuItems.Add(l.ZeroOrMore, delegate { textBox.SelectedText = "*"; }); + cm.MenuItems.Add(l.OneOrMore, delegate { textBox.SelectedText = "+"; }); + cm.MenuItems.Add(l.InCharacterGroup, delegate { textBox.SelectedText = "[test]"; }); + cm.MenuItems.Add(l.NotInCharacterGroup, delegate { textBox.SelectedText = "[^test]"; }); + return cm; + } + + public static ContextMenu GetRegExContextMenu(ComboBox comboBox) + { + var cm = new ContextMenu(); + var l = Configuration.Settings.Language.RegularExpressionContextMenu; + cm.MenuItems.Add(l.WordBoundary, delegate { comboBox.SelectedText = "\\b"; }); + cm.MenuItems.Add(l.NonWordBoundary, delegate { comboBox.SelectedText = "\\B"; }); + cm.MenuItems.Add(l.NewLine, delegate { comboBox.SelectedText = "\\r\\n"; }); + cm.MenuItems.Add(l.AnyDigit, delegate { comboBox.SelectedText = "\\d"; }); + cm.MenuItems.Add(l.NonDigit, delegate { comboBox.SelectedText = "\\D"; }); + cm.MenuItems.Add(l.AnyCharacter, delegate { comboBox.SelectedText = "."; }); + cm.MenuItems.Add(l.AnyWhitespace, delegate { comboBox.SelectedText = "\\s"; }); + cm.MenuItems.Add(l.NonSpaceCharacter, delegate { comboBox.SelectedText = "\\S"; }); + cm.MenuItems.Add(l.ZeroOrMore, delegate { comboBox.SelectedText = "*"; }); + cm.MenuItems.Add(l.OneOrMore, delegate { comboBox.SelectedText = "+"; }); + cm.MenuItems.Add(l.InCharacterGroup, delegate { comboBox.SelectedText = "[test]"; }); + cm.MenuItems.Add(l.NotInCharacterGroup, delegate { comboBox.SelectedText = "[^test]"; }); + return cm; + } + + public static ContextMenu GetReplaceTextContextMenu(TextBox textBox) + { + var cm = new ContextMenu(); + cm.MenuItems.Add(Configuration.Settings.Language.RegularExpressionContextMenu.NewLineShort, delegate { textBox.SelectedText = "\\n"; }); + return cm; + } + + public bool FindNext(string text, int startIndex) + { + Success = false; + startIndex++; + if (startIndex < text.Length) + { + if (FindReplaceType.FindType == FindType.RegEx) + { + Match match = _regEx.Match(text, startIndex); + if (match.Success) + { + string groupName = RegexUtils.GetRegExGroup(FindText); + if (groupName != null && match.Groups[groupName] != null && match.Groups[groupName].Success) + { + FindTextLength = match.Groups[groupName].Length; + SelectedIndex = match.Groups[groupName].Index; + } + else + { + FindTextLength = match.Length; + SelectedIndex = match.Index; + } + Success = true; + } + return match.Success; + } + string searchText = text.Substring(startIndex); + int pos = FindPositionInText(searchText, 0); + if (pos >= 0) + { + SelectedIndex = pos + startIndex; + return true; + } + } + return false; + } + + public bool FindPrevious(string text, int startIndex) + { + Success = false; + startIndex--; + if (startIndex < text.Length) + { + if (FindReplaceType.FindType == FindType.RegEx) + { + var matches = _regEx.Matches(text.Substring(0, startIndex)); + if (matches.Count > 0) + { + string groupName = RegexUtils.GetRegExGroup(FindText); + var last = matches[matches.Count - 1]; + if (groupName != null && last.Groups[groupName] != null && last.Groups[groupName].Success) + { + FindTextLength = last.Groups[groupName].Length; + SelectedIndex = last.Groups[groupName].Index; + } + else + { + FindTextLength = last.Length; + SelectedIndex = last.Index; + } + Success = true; + } + return Success; + } + string searchText = text.Substring(0, startIndex); + int pos = -1; + var comparison = GetComparison(); + var idx = searchText.LastIndexOf(FindText, startIndex, comparison); + while (idx >= 0) + { + if (FindReplaceType.WholeWord) + { + var startOk = idx == 0 || SeparatorChars.Contains(searchText[idx - 1]); + var endOk = idx + FindText.Length == searchText.Length || SeparatorChars.Contains(searchText[idx + FindText.Length]); + if (startOk && endOk) + { + pos = idx; + break; + } + } + else + { + pos = idx; + break; + } + searchText = text.Substring(0, idx); + idx = searchText.LastIndexOf(FindText, comparison); + } + if (pos >= 0) + { + SelectedIndex = pos; + return true; + } + } + return false; + } + + + public int FindCount(Subtitle subtitle, bool wholeWord) + { + var count = 0; + // validate pattern if find type is regex + if (FindReplaceType.FindType == FindType.RegEx) + { + var findText = RegexUtils.FixNewLine(FindText); + if (!RegexUtils.IsValidRegex(findText)) + { + MessageBox.Show(Configuration.Settings.Language.General.RegularExpressionIsNotValid); + return count; + } + _regEx = new Regex(findText); + } + var comparison = GetComparison(); + foreach (var p in subtitle.Paragraphs) + { + if (FindReplaceType.FindType == FindType.RegEx) + { + count += _regEx.Matches(p.Text).Count; + } + else + { + if (p.Text.Length < FindText.Length) + { + continue; + } + count += GetWordCount(p.Text, FindText, wholeWord, comparison); + } + } + return count; + } + + private int GetWordCount(string text, string pattern, bool matchWholeWord, StringComparison comparison) + { + var idx = text.IndexOf(pattern, comparison); + var count = 0; + while (idx >= 0) + { + if (matchWholeWord) + { + var startOk = (idx == 0) || (SeparatorChars.Contains(text[idx - 1])); + var endOk = (idx + pattern.Length == text.Length) || (SeparatorChars.Contains(text[idx + pattern.Length])); + if (startOk && endOk) + { + count++; + } + } + else + { + count++; + } + idx = text.IndexOf(pattern, idx + pattern.Length, comparison); + } + return count; + } + + private StringComparison GetComparison() => FindReplaceType.FindType == FindType.Normal ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal; + + } +} diff --git a/src/Logic/ListViewSorter.cs b/src/ui/Logic/ListViewSorter.cs similarity index 100% rename from src/Logic/ListViewSorter.cs rename to src/ui/Logic/ListViewSorter.cs diff --git a/src/Logic/MainShortcuts.cs b/src/ui/Logic/MainShortcuts.cs similarity index 100% rename from src/Logic/MainShortcuts.cs rename to src/ui/Logic/MainShortcuts.cs diff --git a/src/Logic/NativeMethods.cs b/src/ui/Logic/NativeMethods.cs similarity index 100% rename from src/Logic/NativeMethods.cs rename to src/ui/Logic/NativeMethods.cs diff --git a/src/Logic/Networking/NikseWebServiceSession.cs b/src/ui/Logic/Networking/NikseWebServiceSession.cs similarity index 97% rename from src/Logic/Networking/NikseWebServiceSession.cs rename to src/ui/Logic/Networking/NikseWebServiceSession.cs index c5112cb22..24b9cb30e 100644 --- a/src/Logic/Networking/NikseWebServiceSession.cs +++ b/src/ui/Logic/Networking/NikseWebServiceSession.cs @@ -1,411 +1,411 @@ -using Nikse.SubtitleEdit.Core; -using System; -using System.Collections.Generic; -using System.Net; -using System.Text; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Logic.Networking -{ - public class NikseWebServiceSession : IDisposable - { - public class ChatEntry - { - public SeNetworkService.SeUser User { get; set; } - public string Message { get; set; } - } - - public event EventHandler OnUpdateTimerTick; - public event EventHandler OnUpdateUserLogEntries; - - private System.Windows.Forms.Timer _timerWebService; - public List<UpdateLogEntry> UpdateLog { get; } = new List<UpdateLogEntry>(); - public List<ChatEntry> ChatLog { get; } = new List<ChatEntry>(); - private SeNetworkService.SeService _seWs; - private DateTime _seWsLastUpdate = DateTime.Now.AddYears(-1); - public SeNetworkService.SeUser CurrentUser { get; set; } - public Subtitle LastSubtitle { get; set; } - public Subtitle Subtitle { get; private set; } - public Subtitle OriginalSubtitle { get; private set; } - public string SessionId { get; private set; } - private string _userName; - private string _fileName; - public List<SeNetworkService.SeUser> Users { get; private set; } - public StringBuilder Log { get; } - - public string WebServiceUrl => _seWs.Url; - - public NikseWebServiceSession(Subtitle subtitle, Subtitle originalSubtitle, EventHandler onUpdateTimerTick, EventHandler onUpdateUserLogEntries) - { - Subtitle = subtitle; - OriginalSubtitle = originalSubtitle; - _timerWebService = new System.Windows.Forms.Timer(); - if (Configuration.Settings.NetworkSettings.PollIntervalSeconds < 1) - { - Configuration.Settings.NetworkSettings.PollIntervalSeconds = 1; - } - - _timerWebService.Interval = Configuration.Settings.NetworkSettings.PollIntervalSeconds * 1000; - _timerWebService.Tick += TimerWebServiceTick; - Log = new StringBuilder(); - OnUpdateTimerTick = onUpdateTimerTick; - OnUpdateUserLogEntries = onUpdateUserLogEntries; - } - - public void StartServer(string webServiceUrl, string sessionKey, string userName, string fileName, out string message) - { - SessionId = sessionKey; - _userName = userName; - _fileName = fileName; - var list = new List<SeNetworkService.SeSequence>(); - foreach (Paragraph p in Subtitle.Paragraphs) - { - list.Add(new SeNetworkService.SeSequence - { - StartMilliseconds = (int)p.StartTime.TotalMilliseconds, - EndMilliseconds = (int)p.EndTime.TotalMilliseconds, - Text = WebUtility.HtmlEncode(p.Text.Replace(Environment.NewLine, "<br />")) - }); - } - - var originalSubtitle = new List<SeNetworkService.SeSequence>(); - if (OriginalSubtitle != null) - { - foreach (Paragraph p in OriginalSubtitle.Paragraphs) - { - originalSubtitle.Add(new SeNetworkService.SeSequence - { - StartMilliseconds = (int)p.StartTime.TotalMilliseconds, - EndMilliseconds = (int)p.EndTime.TotalMilliseconds, - Text = WebUtility.HtmlEncode(p.Text.Replace(Environment.NewLine, "<br />")) - }); - } - } - - _seWs = new SeNetworkService.SeService - { - Url = webServiceUrl, - Proxy = Utilities.GetProxy() - }; - var user = _seWs.Start(sessionKey, userName, list.ToArray(), originalSubtitle.ToArray(), fileName, out message); - CurrentUser = user; - Users = new List<SeNetworkService.SeUser> { user }; - if (message == "OK") - { - _timerWebService.Start(); - } - } - - public bool Join(string webServiceUrl, string userName, string sessionKey, out string message) - { - SessionId = sessionKey; - _seWs = new SeNetworkService.SeService - { - Url = webServiceUrl, - Proxy = Utilities.GetProxy() - }; - Users = new List<SeNetworkService.SeUser>(); - var users = _seWs.Join(sessionKey, userName, out message); - if (message != "OK") - { - return false; - } - - string tempFileName; - Subtitle = new Subtitle(); - foreach (var sequence in _seWs.GetSubtitle(sessionKey, out tempFileName, out _)) - { - Subtitle.Paragraphs.Add(new Paragraph(WebUtility.HtmlDecode(sequence.Text).Replace("<br />", Environment.NewLine), sequence.StartMilliseconds, sequence.EndMilliseconds)); - } - - _fileName = tempFileName; - - OriginalSubtitle = new Subtitle(); - var sequences = _seWs.GetOriginalSubtitle(sessionKey); - if (sequences != null) - { - foreach (var sequence in sequences) - { - OriginalSubtitle.Paragraphs.Add(new Paragraph(WebUtility.HtmlDecode(sequence.Text).Replace("<br />", Environment.NewLine), sequence.StartMilliseconds, sequence.EndMilliseconds)); - } - } - - SessionId = sessionKey; - CurrentUser = users[users.Length - 1]; // me - foreach (var user in users) - { - Users.Add(user); - } - - ReloadFromWs(); - _timerWebService.Start(); - return true; - } - - private void TimerWebServiceTick(object sender, EventArgs e) - { - OnUpdateTimerTick?.Invoke(sender, e); - } - - public void TimerStop() - { - _timerWebService.Stop(); - } - - public void TimerStart() - { - _timerWebService.Start(); - } - - public List<SeNetworkService.SeUpdate> GetUpdates(out string message, out int numberOfLines) - { - List<SeNetworkService.SeUpdate> list = new List<SeNetworkService.SeUpdate>(); - var updates = _seWs.GetUpdates(SessionId, CurrentUser.UserName, _seWsLastUpdate, out message, out var newUpdateTime, out numberOfLines); - if (updates != null) - { - foreach (var update in updates) - { - list.Add(update); - } - } - _seWsLastUpdate = newUpdateTime; - return list; - } - - public Subtitle ReloadSubtitle() - { - Subtitle.Paragraphs.Clear(); - var sequences = _seWs.GetSubtitle(SessionId, out var tempFileName, out var updateTime); - _fileName = tempFileName; - _seWsLastUpdate = updateTime; - if (sequences != null) - { - foreach (var sequence in sequences) - { - Subtitle.Paragraphs.Add(new Paragraph(WebUtility.HtmlDecode(sequence.Text).Replace("<br />", Environment.NewLine), sequence.StartMilliseconds, sequence.EndMilliseconds)); - } - } - return Subtitle; - } - - private void ReloadFromWs() - { - if (_seWs != null) - { - Subtitle = new Subtitle(); - var sequences = _seWs.GetSubtitle(SessionId, out _fileName, out _seWsLastUpdate); - foreach (var sequence in sequences) - { - var p = new Paragraph(WebUtility.HtmlDecode(sequence.Text).Replace("<br />", Environment.NewLine), sequence.StartMilliseconds, sequence.EndMilliseconds); - Subtitle.Paragraphs.Add(p); - } - Subtitle.Renumber(); - LastSubtitle = new Subtitle(Subtitle); - } - } - - public void AppendToLog(string text) - { - string timestamp = DateTime.Now.ToLongTimeString(); - Log.AppendLine(timestamp + ": " + UiUtil.GetListViewTextFromString(text.TrimEnd())); - } - - public string GetLog() - { - return Log.ToString(); - } - - public void SendChatMessage(string message) - { - _seWs.SendMessage(SessionId, WebUtility.HtmlEncode(message.Replace(Environment.NewLine, "<br />")), CurrentUser); - } - - internal void UpdateLine(int index, Paragraph paragraph) - { - _seWs.UpdateLine(SessionId, index, new SeNetworkService.SeSequence - { - StartMilliseconds = (int)paragraph.StartTime.TotalMilliseconds, - EndMilliseconds = (int)paragraph.EndTime.TotalMilliseconds, - Text = WebUtility.HtmlEncode(paragraph.Text.Replace(Environment.NewLine, "<br />")) - }, CurrentUser); - AddToWsUserLog(CurrentUser, index, "UPD", true); - } - - public void CheckForAndSubmitUpdates() - { - // check for changes in text/time codes (not insert/delete) - if (LastSubtitle != null) - { - for (int i = 0; i < Subtitle.Paragraphs.Count; i++) - { - var last = LastSubtitle.GetParagraphOrDefault(i); - var current = Subtitle.GetParagraphOrDefault(i); - if (last != null && current != null) - { - if (Math.Abs(last.StartTime.TotalMilliseconds - current.StartTime.TotalMilliseconds) > 0.01 || - Math.Abs(last.EndTime.TotalMilliseconds - current.EndTime.TotalMilliseconds) > 0.01 || - last.Text != current.Text) - { - UpdateLine(i, current); - } - } - } - } - } - - public void AddToWsUserLog(SeNetworkService.SeUser user, int pos, string action, bool updateUi) - { - for (int i = 0; i < UpdateLog.Count; i++) - { - if (UpdateLog[i].Index == pos) - { - UpdateLog.RemoveAt(i); - break; - } - } - - UpdateLog.Add(new UpdateLogEntry(0, user.UserName, pos, action)); - if (updateUi) - { - OnUpdateUserLogEntries?.Invoke(null, null); - } - } - - internal void Leave() - { - try - { - _seWs.Leave(SessionId, CurrentUser.UserName); - } - catch - { - // ignored - } - } - - internal void DeleteLines(List<int> indices) - { - _seWs.DeleteLines(SessionId, indices.ToArray(), CurrentUser); - foreach (int index in indices) - { - AdjustUpdateLogToDelete(index); - AppendToLog(string.Format(Configuration.Settings.Language.Main.NetworkDelete, CurrentUser.UserName, CurrentUser.Ip, index)); - } - } - - internal void InsertLine(int index, Paragraph newParagraph) - { - _seWs.InsertLine(SessionId, index, (int)newParagraph.StartTime.TotalMilliseconds, (int)newParagraph.EndTime.TotalMilliseconds, newParagraph.Text, CurrentUser); - AppendToLog(string.Format(Configuration.Settings.Language.Main.NetworkInsert, CurrentUser.UserName, CurrentUser.Ip, index, UiUtil.GetListViewTextFromString(newParagraph.Text))); - } - - internal void AdjustUpdateLogToInsert(int index) - { - foreach (var logEntry in UpdateLog) - { - if (logEntry.Index >= index) - { - logEntry.Index++; - } - } - } - - internal void AdjustUpdateLogToDelete(int index) - { - UpdateLogEntry removeThis = null; - foreach (var logEntry in UpdateLog) - { - if (logEntry.Index == index) - { - removeThis = logEntry; - } - else if (logEntry.Index > index) - { - logEntry.Index--; - } - } - if (removeThis != null) - { - UpdateLog.Remove(removeThis); - } - } - - internal string Restart() - { - string message = string.Empty; - int retries = 0; - const int maxRetries = 10; - while (retries < maxRetries) - { - try - { - System.Threading.Thread.Sleep(200); - StartServer(_seWs.Url, SessionId, _userName, _fileName, out message); - retries = maxRetries; - } - catch - { - System.Threading.Thread.Sleep(200); - retries++; - } - } - - if (message == "Session is already running") - { - return ReJoin(); - } - return message; - } - - internal string ReJoin() - { - string message = string.Empty; - int retries = 0; - const int maxRetries = 10; - while (retries < maxRetries) - { - try - { - System.Threading.Thread.Sleep(200); - if (Join(_seWs.Url, _userName, SessionId, out message)) - { - message = "Reload"; - } - - retries = maxRetries; - } - catch - { - System.Threading.Thread.Sleep(200); - retries++; - } - } - - return message; - } - - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - if (disposing) - { - if (_timerWebService != null) - { - _timerWebService.Dispose(); - _timerWebService = null; - } - if (_seWs != null) - { - _seWs.Dispose(); - _seWs = null; - } - } - } - - } -} +using Nikse.SubtitleEdit.Core; +using System; +using System.Collections.Generic; +using System.Net; +using System.Text; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Logic.Networking +{ + public class NikseWebServiceSession : IDisposable + { + public class ChatEntry + { + public SeNetworkService.SeUser User { get; set; } + public string Message { get; set; } + } + + public event EventHandler OnUpdateTimerTick; + public event EventHandler OnUpdateUserLogEntries; + + private System.Windows.Forms.Timer _timerWebService; + public List<UpdateLogEntry> UpdateLog { get; } = new List<UpdateLogEntry>(); + public List<ChatEntry> ChatLog { get; } = new List<ChatEntry>(); + private SeNetworkService.SeService _seWs; + private DateTime _seWsLastUpdate = DateTime.Now.AddYears(-1); + public SeNetworkService.SeUser CurrentUser { get; set; } + public Subtitle LastSubtitle { get; set; } + public Subtitle Subtitle { get; private set; } + public Subtitle OriginalSubtitle { get; private set; } + public string SessionId { get; private set; } + private string _userName; + private string _fileName; + public List<SeNetworkService.SeUser> Users { get; private set; } + public StringBuilder Log { get; } + + public string WebServiceUrl => _seWs.Url; + + public NikseWebServiceSession(Subtitle subtitle, Subtitle originalSubtitle, EventHandler onUpdateTimerTick, EventHandler onUpdateUserLogEntries) + { + Subtitle = subtitle; + OriginalSubtitle = originalSubtitle; + _timerWebService = new System.Windows.Forms.Timer(); + if (Configuration.Settings.NetworkSettings.PollIntervalSeconds < 1) + { + Configuration.Settings.NetworkSettings.PollIntervalSeconds = 1; + } + + _timerWebService.Interval = Configuration.Settings.NetworkSettings.PollIntervalSeconds * 1000; + _timerWebService.Tick += TimerWebServiceTick; + Log = new StringBuilder(); + OnUpdateTimerTick = onUpdateTimerTick; + OnUpdateUserLogEntries = onUpdateUserLogEntries; + } + + public void StartServer(string webServiceUrl, string sessionKey, string userName, string fileName, out string message) + { + SessionId = sessionKey; + _userName = userName; + _fileName = fileName; + var list = new List<SeNetworkService.SeSequence>(); + foreach (Paragraph p in Subtitle.Paragraphs) + { + list.Add(new SeNetworkService.SeSequence + { + StartMilliseconds = (int)p.StartTime.TotalMilliseconds, + EndMilliseconds = (int)p.EndTime.TotalMilliseconds, + Text = WebUtility.HtmlEncode(p.Text.Replace(Environment.NewLine, "<br />")) + }); + } + + var originalSubtitle = new List<SeNetworkService.SeSequence>(); + if (OriginalSubtitle != null) + { + foreach (Paragraph p in OriginalSubtitle.Paragraphs) + { + originalSubtitle.Add(new SeNetworkService.SeSequence + { + StartMilliseconds = (int)p.StartTime.TotalMilliseconds, + EndMilliseconds = (int)p.EndTime.TotalMilliseconds, + Text = WebUtility.HtmlEncode(p.Text.Replace(Environment.NewLine, "<br />")) + }); + } + } + + _seWs = new SeNetworkService.SeService + { + Url = webServiceUrl, + Proxy = Utilities.GetProxy() + }; + var user = _seWs.Start(sessionKey, userName, list.ToArray(), originalSubtitle.ToArray(), fileName, out message); + CurrentUser = user; + Users = new List<SeNetworkService.SeUser> { user }; + if (message == "OK") + { + _timerWebService.Start(); + } + } + + public bool Join(string webServiceUrl, string userName, string sessionKey, out string message) + { + SessionId = sessionKey; + _seWs = new SeNetworkService.SeService + { + Url = webServiceUrl, + Proxy = Utilities.GetProxy() + }; + Users = new List<SeNetworkService.SeUser>(); + var users = _seWs.Join(sessionKey, userName, out message); + if (message != "OK") + { + return false; + } + + string tempFileName; + Subtitle = new Subtitle(); + foreach (var sequence in _seWs.GetSubtitle(sessionKey, out tempFileName, out _)) + { + Subtitle.Paragraphs.Add(new Paragraph(WebUtility.HtmlDecode(sequence.Text).Replace("<br />", Environment.NewLine), sequence.StartMilliseconds, sequence.EndMilliseconds)); + } + + _fileName = tempFileName; + + OriginalSubtitle = new Subtitle(); + var sequences = _seWs.GetOriginalSubtitle(sessionKey); + if (sequences != null) + { + foreach (var sequence in sequences) + { + OriginalSubtitle.Paragraphs.Add(new Paragraph(WebUtility.HtmlDecode(sequence.Text).Replace("<br />", Environment.NewLine), sequence.StartMilliseconds, sequence.EndMilliseconds)); + } + } + + SessionId = sessionKey; + CurrentUser = users[users.Length - 1]; // me + foreach (var user in users) + { + Users.Add(user); + } + + ReloadFromWs(); + _timerWebService.Start(); + return true; + } + + private void TimerWebServiceTick(object sender, EventArgs e) + { + OnUpdateTimerTick?.Invoke(sender, e); + } + + public void TimerStop() + { + _timerWebService.Stop(); + } + + public void TimerStart() + { + _timerWebService.Start(); + } + + public List<SeNetworkService.SeUpdate> GetUpdates(out string message, out int numberOfLines) + { + List<SeNetworkService.SeUpdate> list = new List<SeNetworkService.SeUpdate>(); + var updates = _seWs.GetUpdates(SessionId, CurrentUser.UserName, _seWsLastUpdate, out message, out var newUpdateTime, out numberOfLines); + if (updates != null) + { + foreach (var update in updates) + { + list.Add(update); + } + } + _seWsLastUpdate = newUpdateTime; + return list; + } + + public Subtitle ReloadSubtitle() + { + Subtitle.Paragraphs.Clear(); + var sequences = _seWs.GetSubtitle(SessionId, out var tempFileName, out var updateTime); + _fileName = tempFileName; + _seWsLastUpdate = updateTime; + if (sequences != null) + { + foreach (var sequence in sequences) + { + Subtitle.Paragraphs.Add(new Paragraph(WebUtility.HtmlDecode(sequence.Text).Replace("<br />", Environment.NewLine), sequence.StartMilliseconds, sequence.EndMilliseconds)); + } + } + return Subtitle; + } + + private void ReloadFromWs() + { + if (_seWs != null) + { + Subtitle = new Subtitle(); + var sequences = _seWs.GetSubtitle(SessionId, out _fileName, out _seWsLastUpdate); + foreach (var sequence in sequences) + { + var p = new Paragraph(WebUtility.HtmlDecode(sequence.Text).Replace("<br />", Environment.NewLine), sequence.StartMilliseconds, sequence.EndMilliseconds); + Subtitle.Paragraphs.Add(p); + } + Subtitle.Renumber(); + LastSubtitle = new Subtitle(Subtitle); + } + } + + public void AppendToLog(string text) + { + string timestamp = DateTime.Now.ToLongTimeString(); + Log.AppendLine(timestamp + ": " + UiUtil.GetListViewTextFromString(text.TrimEnd())); + } + + public string GetLog() + { + return Log.ToString(); + } + + public void SendChatMessage(string message) + { + _seWs.SendMessage(SessionId, WebUtility.HtmlEncode(message.Replace(Environment.NewLine, "<br />")), CurrentUser); + } + + internal void UpdateLine(int index, Paragraph paragraph) + { + _seWs.UpdateLine(SessionId, index, new SeNetworkService.SeSequence + { + StartMilliseconds = (int)paragraph.StartTime.TotalMilliseconds, + EndMilliseconds = (int)paragraph.EndTime.TotalMilliseconds, + Text = WebUtility.HtmlEncode(paragraph.Text.Replace(Environment.NewLine, "<br />")) + }, CurrentUser); + AddToWsUserLog(CurrentUser, index, "UPD", true); + } + + public void CheckForAndSubmitUpdates() + { + // check for changes in text/time codes (not insert/delete) + if (LastSubtitle != null) + { + for (int i = 0; i < Subtitle.Paragraphs.Count; i++) + { + var last = LastSubtitle.GetParagraphOrDefault(i); + var current = Subtitle.GetParagraphOrDefault(i); + if (last != null && current != null) + { + if (Math.Abs(last.StartTime.TotalMilliseconds - current.StartTime.TotalMilliseconds) > 0.01 || + Math.Abs(last.EndTime.TotalMilliseconds - current.EndTime.TotalMilliseconds) > 0.01 || + last.Text != current.Text) + { + UpdateLine(i, current); + } + } + } + } + } + + public void AddToWsUserLog(SeNetworkService.SeUser user, int pos, string action, bool updateUi) + { + for (int i = 0; i < UpdateLog.Count; i++) + { + if (UpdateLog[i].Index == pos) + { + UpdateLog.RemoveAt(i); + break; + } + } + + UpdateLog.Add(new UpdateLogEntry(0, user.UserName, pos, action)); + if (updateUi) + { + OnUpdateUserLogEntries?.Invoke(null, null); + } + } + + internal void Leave() + { + try + { + _seWs.Leave(SessionId, CurrentUser.UserName); + } + catch + { + // ignored + } + } + + internal void DeleteLines(List<int> indices) + { + _seWs.DeleteLines(SessionId, indices.ToArray(), CurrentUser); + foreach (int index in indices) + { + AdjustUpdateLogToDelete(index); + AppendToLog(string.Format(Configuration.Settings.Language.Main.NetworkDelete, CurrentUser.UserName, CurrentUser.Ip, index)); + } + } + + internal void InsertLine(int index, Paragraph newParagraph) + { + _seWs.InsertLine(SessionId, index, (int)newParagraph.StartTime.TotalMilliseconds, (int)newParagraph.EndTime.TotalMilliseconds, newParagraph.Text, CurrentUser); + AppendToLog(string.Format(Configuration.Settings.Language.Main.NetworkInsert, CurrentUser.UserName, CurrentUser.Ip, index, UiUtil.GetListViewTextFromString(newParagraph.Text))); + } + + internal void AdjustUpdateLogToInsert(int index) + { + foreach (var logEntry in UpdateLog) + { + if (logEntry.Index >= index) + { + logEntry.Index++; + } + } + } + + internal void AdjustUpdateLogToDelete(int index) + { + UpdateLogEntry removeThis = null; + foreach (var logEntry in UpdateLog) + { + if (logEntry.Index == index) + { + removeThis = logEntry; + } + else if (logEntry.Index > index) + { + logEntry.Index--; + } + } + if (removeThis != null) + { + UpdateLog.Remove(removeThis); + } + } + + internal string Restart() + { + string message = string.Empty; + int retries = 0; + const int maxRetries = 10; + while (retries < maxRetries) + { + try + { + System.Threading.Thread.Sleep(200); + StartServer(_seWs.Url, SessionId, _userName, _fileName, out message); + retries = maxRetries; + } + catch + { + System.Threading.Thread.Sleep(200); + retries++; + } + } + + if (message == "Session is already running") + { + return ReJoin(); + } + return message; + } + + internal string ReJoin() + { + string message = string.Empty; + int retries = 0; + const int maxRetries = 10; + while (retries < maxRetries) + { + try + { + System.Threading.Thread.Sleep(200); + if (Join(_seWs.Url, _userName, SessionId, out message)) + { + message = "Reload"; + } + + retries = maxRetries; + } + catch + { + System.Threading.Thread.Sleep(200); + retries++; + } + } + + return message; + } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + if (_timerWebService != null) + { + _timerWebService.Dispose(); + _timerWebService = null; + } + if (_seWs != null) + { + _seWs.Dispose(); + _seWs = null; + } + } + } + + } +} diff --git a/src/Logic/Networking/UpdateLogEntry.cs b/src/ui/Logic/Networking/UpdateLogEntry.cs similarity index 96% rename from src/Logic/Networking/UpdateLogEntry.cs rename to src/ui/Logic/Networking/UpdateLogEntry.cs index 4c800f81c..77b2614a2 100644 --- a/src/Logic/Networking/UpdateLogEntry.cs +++ b/src/ui/Logic/Networking/UpdateLogEntry.cs @@ -1,28 +1,28 @@ -using System; - -namespace Nikse.SubtitleEdit.Logic.Networking -{ - public class UpdateLogEntry - { - public int Id { get; set; } - public string UserName { get; set; } - public int Index { get; set; } - public DateTime OccuredAt { get; set; } - public string Action { get; set; } - - public UpdateLogEntry(int id, string userName, int index, string action) - { - Id = id; - UserName = userName; - Index = index; - OccuredAt = DateTime.Now; - Action = action; - } - - public override string ToString() - { - return $"{OccuredAt.Hour:00}:{OccuredAt.Minute:00}:{OccuredAt.Second:00} {UserName}: {Action}"; - } - - } -} +using System; + +namespace Nikse.SubtitleEdit.Logic.Networking +{ + public class UpdateLogEntry + { + public int Id { get; set; } + public string UserName { get; set; } + public int Index { get; set; } + public DateTime OccuredAt { get; set; } + public string Action { get; set; } + + public UpdateLogEntry(int id, string userName, int index, string action) + { + Id = id; + UserName = userName; + Index = index; + OccuredAt = DateTime.Now; + Action = action; + } + + public override string ToString() + { + return $"{OccuredAt.Hour:00}:{OccuredAt.Minute:00}:{OccuredAt.Second:00} {UserName}: {Action}"; + } + + } +} diff --git a/src/Logic/NikseBitmapImageSplitter.cs b/src/ui/Logic/NikseBitmapImageSplitter.cs similarity index 97% rename from src/Logic/NikseBitmapImageSplitter.cs rename to src/ui/Logic/NikseBitmapImageSplitter.cs index 6d77ab422..763bd6ada 100644 --- a/src/Logic/NikseBitmapImageSplitter.cs +++ b/src/ui/Logic/NikseBitmapImageSplitter.cs @@ -1,1153 +1,1153 @@ -using Nikse.SubtitleEdit.Core; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Logic -{ - public class NikseBitmapImageSplitter - { - public static bool IsColorClose(Color a, Color b, int tolerance) - { - if (a.A < 120 && b.A < 120) - { - return true; // transparent - } - - var alphaDiff = Math.Abs(a.A - b.A); - if (alphaDiff > 50) - { - return false; // different alpha levels - } - - if (a.A > 250 && a.R > 90 && a.G > 90 && a.B > 90 && - b.A > 250 && b.R > 90 && b.G > 90 && b.B > 90) - { - return true; // dark, non transparent - } - - int diff = (a.R + a.G + a.B) - (b.R + b.G + b.B); - return diff < tolerance && diff > -tolerance; - } - - public static bool IsColorClose(byte aa, byte ar, byte ag, byte ab, Color b, int tolerance) - { - if (aa < 120 && b.A < 120) - { - return true; // transparent - } - - if (aa > 250 && ar > 90 && ag > 90 && ab > 90 && - b.A > 250 && b.R > 90 && b.G > 90 && b.B > 90) - { - return true; // dark, non transparent - } - - int diff = (ar + ag + ab) - (b.R + b.G + b.B); - return diff < tolerance && diff > -tolerance; - } - - public static NikseBitmap CropTopAndBottom(NikseBitmap bmp, out int topCropping) - { - int startTop = 0; - int maxTop = bmp.Height - 2; - if (maxTop > bmp.Height) - { - maxTop = bmp.Height; - } - - for (int y = 0; y < maxTop; y++) - { - bool allTransparent = true; - for (int x = 0; x < bmp.Width; x++) - { - int a = bmp.GetAlpha(x, y); - if (a != 0) - { - allTransparent = false; - break; - } - } - if (!allTransparent) - { - break; - } - - startTop++; - } - topCropping = startTop; - - int h = bmp.Height; - bool bottomCroppingDone = false; - for (int y = bmp.Height - 1; y > 3; y--) - { - for (int x = 0; x < bmp.Width; x++) - { - int a = bmp.GetAlpha(x, y); - if (a != 0) - { - bottomCroppingDone = true; - break; - } - } - h = y; - if (bottomCroppingDone) - { - break; - } - } - if (h - startTop + 1 <= 0) - { - return new NikseBitmap(0, 0); - } - - return bmp.CopyRectangle(new Rectangle(0, startTop, bmp.Width, h - startTop + 1)); - } - - public static NikseBitmap CropTopAndBottom(NikseBitmap bmp, out int topCropping, int maxDifferentPixelsOnLine) - { - int startTop = 0; - int maxTop = bmp.Height - 2; - if (maxTop > bmp.Height) - { - maxTop = bmp.Height; - } - - for (int y = 0; y < maxTop; y++) - { - int difference = 0; - bool allTransparent = true; - for (int x = 1; x < bmp.Width - 1; x++) - { - int a = bmp.GetAlpha(x, y); - if (a != 0) - { - difference++; - if (difference >= maxDifferentPixelsOnLine) - { - allTransparent = false; - break; - } - } - } - if (!allTransparent) - { - break; - } - - startTop++; - } - if (startTop > 9) - { - startTop -= 5; // if top space > 9, then always leave blank 5 pixels on top (so . is not confused with '). - } - - topCropping = startTop; - - for (int y = bmp.Height - 1; y > 3; y--) - { - int difference = 0; - bool allTransparent = true; - for (int x = 1; x < bmp.Width - 1; x++) - { - int a = bmp.GetAlpha(x, y); - if (a != 0) - { - difference++; - if (difference >= maxDifferentPixelsOnLine) - { - allTransparent = false; - break; - } - } - } - if (allTransparent == false) - { - return bmp.CopyRectangle(new Rectangle(0, startTop, bmp.Width - 1, y - startTop + 1)); - } - } - return bmp; - } - - public static List<ImageSplitterItem> SplitToLinesTransparentOrBlack(NikseBitmap bmp) - { - int startY = 0; - int size = 0; - var parts = new List<ImageSplitterItem>(); - for (int y = 0; y < bmp.Height; y++) - { - bool allTransparent = true; - for (int x = 0; x < bmp.Width; x++) - { - var c = bmp.GetPixel(x, y); - if (c.A > 20 && c.R + c.G + c.B > 20) - { - allTransparent = false; - break; - } - } - if (allTransparent) - { - if (size > 2 && size <= 15) - { - size++; // at least 15 pixels, like top of 'i' or top of 'È' - } - else - { - if (size > 8) - { - var part = bmp.CopyRectangle(new Rectangle(0, startY, bmp.Width, size + 1)); - parts.Add(new ImageSplitterItem(0, startY, part)); - } - size = 0; - startY = y; - } - } - else - { - size++; - } - } - if (size > 2) - { - parts.Add(size == bmp.Height ? new ImageSplitterItem(0, startY, bmp) : new ImageSplitterItem(0, startY, bmp.CopyRectangle(new Rectangle(0, startY, bmp.Width, size + 1)))); - } - return parts; - } - - /// <summary> - /// split into lines - /// </summary> - public static List<ImageSplitterItem> SplitToLines(NikseBitmap bmp, int minLineHeight, double averageLineHeight = -1) - { - int startY = 0; - int size = 0; - var parts = new List<ImageSplitterItem>(); - for (int y = 0; y < bmp.Height; y++) - { - if (bmp.IsLineTransparent(y)) - { - - // check for appendix below text - bool appendix = y >= bmp.Height - minLineHeight; - if (!appendix && y < bmp.Height - 10 && size > minLineHeight && minLineHeight > 15) - { - bool yp1 = bmp.IsLineTransparent(y + 1); - bool yp2 = bmp.IsLineTransparent(y + 2); - bool yp3 = bmp.IsLineTransparent(y + 3); - bool yp4 = bmp.IsLineTransparent(y + 4); - bool yp5 = bmp.IsLineTransparent(y + 5); - if (!yp1 || !yp2 || !yp3 || !yp4 || !yp5) - { - bool yp6 = bmp.IsLineTransparent(y + 6); - bool yp7 = bmp.IsLineTransparent(y + 7); - bool yp8 = bmp.IsLineTransparent(y + 8); - bool yp9 = bmp.IsLineTransparent(y + 9); - if (yp6 && yp7 && yp8 && yp9) - { - appendix = true; - } - } - } - - if (appendix || size > 1 && size <= minLineHeight) - { - size++; // at least 'lineMinHeight' pixels, like top of 'i' - } - else - { - if (size > 1) - { - var part = bmp.CopyRectangle(new Rectangle(0, startY, bmp.Width, size + 1)); - parts.Add(new ImageSplitterItem(0, startY, part)); - } - size = 0; - startY = y; - } - } - else - { - size++; - } - } - if (size > 1) - { - if (size == bmp.Height) - { - if (size > 100) - { - return SplitToLinesTransparentOrBlack(bmp); - } - - parts.Add(new ImageSplitterItem(0, startY, bmp)); - } - else - { - parts.Add(new ImageSplitterItem(0, startY, bmp.CopyRectangle(new Rectangle(0, startY, bmp.Width, size + 1)))); - } - } - if (parts.Count == 1 && averageLineHeight > 5 && bmp.Height > averageLineHeight * 3) - { - return SplitToLinesAggressive(bmp, minLineHeight, averageLineHeight); - } - return parts; - } - - private static List<ImageSplitterItem> SplitToLinesAggressive(NikseBitmap bmp, int minLineHeight, double averageLineHeight) - { - int startY = 0; - int size = 0; - var parts = new List<ImageSplitterItem>(); - for (int y = 0; y < bmp.Height; y++) - { - int a; - bool allTransparent = bmp.IsLineTransparent(y); - - if (size > 5 && size >= minLineHeight && size > averageLineHeight && !allTransparent && bmp.Width > 50 && y < bmp.Height - 5) - { - var leftX = 0; - while (leftX < bmp.Width) - { - a = bmp.GetAlpha(leftX, y); - if (a != 0) - { - break; - } - leftX++; - } - var rightX = bmp.Width; - while (rightX > 0) - { - a = bmp.GetAlpha(rightX, y - 1); - if (a != 0) - { - break; - } - rightX--; - } - if (leftX >= rightX) - { - allTransparent = true; - } - - leftX = 0; - while (leftX < bmp.Width) - { - a = bmp.GetAlpha(leftX, y - 1); - if (a != 0) - { - break; - } - leftX++; - } - rightX = bmp.Width; - while (rightX > 0) - { - a = bmp.GetAlpha(rightX, y); - if (a != 0) - { - break; - } - rightX--; - } - if (leftX >= rightX) - { - allTransparent = true; - } - } - - if (allTransparent) - { - if (size > 2 && size <= minLineHeight) - { - size++; // at least 'lineMinHeight' pixels, like top of 'i' - } - else - { - if (size > 2) - { - var part = bmp.CopyRectangle(new Rectangle(0, startY, bmp.Width, size + 1)); - parts.Add(new ImageSplitterItem(0, startY, part)); - } - size = 0; - startY = y; - } - } - else - { - size++; - } - } - if (size > 2) - { - if (size == bmp.Height) - { - if (size > 100) - { - return SplitToLinesTransparentOrBlack(bmp); - } - - parts.Add(new ImageSplitterItem(0, startY, bmp)); - } - else - { - parts.Add(new ImageSplitterItem(0, startY, bmp.CopyRectangle(new Rectangle(0, startY, bmp.Width, size + 1)))); - } - } - if (parts.Count == 1 && averageLineHeight > 5 && bmp.Height > averageLineHeight * 3) - { - return parts; - } - return parts; - } - - public static int IsBitmapsAlike(NikseBitmap bmp1, Bitmap bmp2) - { - int different = 0; - int maxDiff = bmp1.Width * bmp1.Height / 5; - for (int y = 0; y < bmp1.Height; y++) - { - for (int x = 0; x < bmp1.Width; x++) - { - if (!IsColorClose(bmp1.GetPixel(x, y), bmp2.GetPixel(x, y), 20)) - { - different++; - } - } - } - if (different > maxDiff) - { - return different + 10; - } - - return different; - } - - public static List<ImageSplitterItem> SplitBitmapToLines(NikseBitmap bmp, int xOrMorePixelsMakesSpace, bool rightToLeft, bool topToBottom, int minLineHeight, bool autoHeight, double averageLineHeight = -1) - { - var list = new List<ImageSplitterItem>(); - - // split into separate lines - var splitOld = SplitToLines(bmp, minLineHeight, averageLineHeight); - if (!autoHeight) - { - return splitOld; - } - - // fast horizontal split by x number of whole lines (3-4) - var splitThreeBlankLines = SplitToLinesByMinTransparentHorizontalLines(bmp, minLineHeight, 3); - var splitFourBlankLines = SplitToLinesByMinTransparentHorizontalLines(bmp, minLineHeight, 4); - var splitBlankLines = splitThreeBlankLines.Count == splitFourBlankLines.Count ? splitFourBlankLines : splitThreeBlankLines; - - var lineBitmaps = splitOld.Count > splitBlankLines.Count ? splitOld : splitBlankLines; - - if (lineBitmaps.Count == 1 && lineBitmaps[0].NikseBitmap?.Height > minLineHeight * 2.2) - { - lineBitmaps = SplitToLinesNew(lineBitmaps[0], minLineHeight, averageLineHeight); // more advanced split (allows for up/down) - } - - return lineBitmaps; - } - - public static List<ImageSplitterItem> SplitBitmapToLettersNew(NikseBitmap bmp, int xOrMorePixelsMakesSpace, bool rightToLeft, bool topToBottom, int minLineHeight, bool autoHeight, double averageLineHeight = -1) - { - var list = new List<ImageSplitterItem>(); - - // split into separate lines - var splitOld = SplitToLines(bmp, minLineHeight, averageLineHeight); - - List<ImageSplitterItem> lineBitmaps; - if (autoHeight) - { - // fast horizontal split by x number of whole lines (3-4) - var splitThreeBlankLines = SplitToLinesByMinTransparentHorizontalLines(bmp, minLineHeight, 3); - var splitFourBlankLines = SplitToLinesByMinTransparentHorizontalLines(bmp, minLineHeight, 4); - var splitBlankLines = splitThreeBlankLines.Count == splitFourBlankLines.Count ? splitFourBlankLines : splitThreeBlankLines; - - lineBitmaps = splitOld.Count > splitBlankLines.Count ? splitOld : splitBlankLines; - - if (lineBitmaps.Count == 1 && lineBitmaps[0].NikseBitmap?.Height > minLineHeight * 2.2) - { - lineBitmaps = SplitToLinesNew(lineBitmaps[0], minLineHeight, averageLineHeight); // more advanced split (allows for up/down) - } - } - else - { - lineBitmaps = splitOld; - } - - //foreach (var bitmap in tempBitmaps) - //{ - // // var height = bitmap.NikseBitmap.GetNonTransparentHeight(); - // var bitmaps = SplitToLinesNew(bitmap, minLineHeight, averageLineHeight); // more advanced split (allows for up/down) - // lineBitmaps.AddRange(bitmaps); - //} - - if (!topToBottom) - { - lineBitmaps.Reverse(); - } - - // split into letters - for (int index = 0; index < lineBitmaps.Count; index++) - { - var b = lineBitmaps[index]; - if (index > 0) - { - list.Add(new ImageSplitterItem(Environment.NewLine)); - } - - var line = new List<ImageSplitterItem>(); - foreach (var item in SplitHorizontalNew(b, xOrMorePixelsMakesSpace)) - { - item.Top = index > 0 ? item.Y - b.Y : item.Y; - item.ParentY = item.Y; - line.Add(item); - } - if (rightToLeft) - { - line.Reverse(); - } - - list.AddRange(line); - } - return list; - } - - - /// <summary> - /// split into lines - /// </summary> - public static List<ImageSplitterItem> SplitToLinesByMinTransparentHorizontalLines(NikseBitmap bmp, int minLineHeight, int minTransparentLines) - { - var parts = new List<ImageSplitterItem>(); - var startY = 0; - var lastTransparentY = -1; - var keysInSequence = 0; - for (int y = minLineHeight; y < bmp.Height - minLineHeight; y++) - { - var isLineTransparent = bmp.IsLineTransparent(y); - if (startY == y && isLineTransparent) - { - startY++; - continue; // skip start - } - - if (isLineTransparent) - { - if (lastTransparentY == y - 1) - { - if (keysInSequence == 0) - { - keysInSequence++; - } - - keysInSequence++; - } - - if (keysInSequence > 2 && lastTransparentY - startY > minLineHeight) - { - var part = bmp.CopyRectangle(new Rectangle(0, startY, bmp.Width, lastTransparentY - startY - 1)); - if (!part.IsImageOnlyTransparent() && part.GetNonTransparentHeight() >= minLineHeight) - { - var croppedTop = part.CropTopTransparent(0); - parts.Add(new ImageSplitterItem(0, startY + croppedTop, part)); - startY = lastTransparentY + 1; - } - } - lastTransparentY = y; - } - else - { - keysInSequence = 0; - lastTransparentY = -1; - } - } - - if (bmp.Height - startY > 1) - { - var part = bmp.CopyRectangle(new Rectangle(0, startY, bmp.Width, bmp.Height - startY)); - if (!part.IsImageOnlyTransparent()) - { - var croppedTop = part.CropTopTransparent(0); - parts.Add(new ImageSplitterItem(0, startY + croppedTop, part)); - } - } - - return parts; - } - - - /// <summary> - /// split into lines - /// </summary> - public static List<ImageSplitterItem> SplitToLinesNew(ImageSplitterItem item, int minLineHeight, double averageLineHeight = -1) - { - var bmp = new NikseBitmap(item.NikseBitmap); - var parts = new List<ImageSplitterItem>(); - bool started = false; - var splitLines = new Dictionary<int, List<Point>>(); - var startY = 0; - for (int y = minLineHeight; y < bmp.Height - minLineHeight; y++) - { - if (startY == y && bmp.IsLineTransparent(y)) - { - startY++; - continue; - } - - var points = new List<Point>(); - var yChange = 0; - var completed = false; - var backJump = 0; - int x = 0; - var maxUp = Math.Min(10, minLineHeight / 2); - while (x < bmp.Width) - { - var a1 = bmp.GetAlpha(x, y + yChange); - var a2 = bmp.GetAlpha(x, y + 1 + yChange); - if (a1 > 150 || a2 > 150) - { - if (x > 1 && yChange < 8 && - bmp.GetAlpha(x - 1, y + yChange) < 150 && bmp.GetAlpha(x - 1, y + yChange) < 150 && - bmp.GetAlpha(x - 1, y + 1 + yChange) < 150 && bmp.GetAlpha(x - 1, y + 2 + yChange) < 150 && - bmp.GetAlpha(x - 1, y + 2 + yChange) < 150 && bmp.GetAlpha(x - 1, y + 3 + yChange) < 150 && - bmp.GetAlpha(x, y + 2 + yChange) < 150 && bmp.GetAlpha(x, y + 3 + yChange) < 150) - { - yChange += 2; - } - - else if (x > 1 && yChange < 8 && - bmp.GetAlpha(x - 1, y + yChange) < 150 && bmp.GetAlpha(x - 1, y + yChange) < 150 && - bmp.GetAlpha(x - 1, y + 1 + yChange) < 150 && bmp.GetAlpha(x - 1, y + 2 + yChange) < 150 && - bmp.GetAlpha(x - 1, y + 2 + yChange) < 150 && bmp.GetAlpha(x - 1, y + 3 + yChange) < 150 && - bmp.GetAlpha(x - 1, y + 3 + yChange) < 150 && bmp.GetAlpha(x - 1, y + 4 + yChange) < 150 && - bmp.GetAlpha(x, y + 3 + yChange) < 150 && bmp.GetAlpha(x, y + 4 + yChange) < 150) - { - yChange += 3; - } - - else if (x > 1 && yChange < 7 && - bmp.GetAlpha(x - 1, y + yChange) < 150 && bmp.GetAlpha(x - 1, y + yChange) < 150 && - bmp.GetAlpha(x - 1, y + 1 + yChange) < 150 && bmp.GetAlpha(x - 1, y + 2 + yChange) < 150 && - bmp.GetAlpha(x - 1, y + 2 + yChange) < 150 && bmp.GetAlpha(x - 1, y + 3 + yChange) < 150 && - bmp.GetAlpha(x - 1, y + 3 + yChange) < 150 && bmp.GetAlpha(x - 1, y + 4 + yChange) < 150 && - bmp.GetAlpha(x - 1, y + 4 + yChange) < 150 && bmp.GetAlpha(x - 1, y + 5 + yChange) < 150 && - bmp.GetAlpha(x, y + 4 + yChange) < 150 && bmp.GetAlpha(x, y + 5 + yChange) < 150) - { - yChange += 4; - } - - else if (x > 1 && yChange > -7 && - bmp.GetAlpha(x - 1, y + yChange) < 150 && bmp.GetAlpha(x - 1, y + yChange) < 150 && - bmp.GetAlpha(x - 1, y - 1 + yChange) < 150 && bmp.GetAlpha(x - 1, y - 2 + yChange) < 150 && - bmp.GetAlpha(x - 1, y - 2 + yChange) < 150 && bmp.GetAlpha(x - 1, y - 3 + yChange) < 150 && - bmp.GetAlpha(x, y - 2 + yChange) < 150 && bmp.GetAlpha(x, y - 3 + yChange) < 150) - { - yChange -= 2; - } - - else if (x > 1 && yChange > -7 && - bmp.GetAlpha(x - 1, y + yChange) < 150 && bmp.GetAlpha(x - 1, y + yChange) < 150 && - bmp.GetAlpha(x - 1, y - 1 + yChange) < 150 && bmp.GetAlpha(x - 1, y - 2 + yChange) < 150 && - bmp.GetAlpha(x - 1, y - 2 + yChange) < 150 && bmp.GetAlpha(x - 1, y - 3 + yChange) < 150 && - bmp.GetAlpha(x - 1, y - 3 + yChange) < 150 && bmp.GetAlpha(x - 1, y - 4 + yChange) < 150 && - bmp.GetAlpha(x, y - 3 + yChange) < 150 && bmp.GetAlpha(x, y - 4 + yChange) < 150) - { - yChange -= 3; - } - - else if (x > 1 && yChange > -7 && - bmp.GetAlpha(x - 1, y + yChange) < 150 && bmp.GetAlpha(x - 1, y + yChange) < 150 && - bmp.GetAlpha(x - 1, y - 1 + yChange) < 150 && bmp.GetAlpha(x - 1, y - 2 + yChange) < 150 && - bmp.GetAlpha(x - 1, y - 2 + yChange) < 150 && bmp.GetAlpha(x - 1, y - 3 + yChange) < 150 && - bmp.GetAlpha(x - 1, y - 3 + yChange) < 150 && bmp.GetAlpha(x - 1, y - 4 + yChange) < 150 && - bmp.GetAlpha(x - 1, y - 4 + yChange) < 150 && bmp.GetAlpha(x - 1, y - 5 + yChange) < 150 && - bmp.GetAlpha(x, y - 4 + yChange) < 150 && bmp.GetAlpha(x, y - 5 + yChange) < 150) - { - yChange -= 4; - } - - else if (x > 10 && backJump < 3 && x > 5 && yChange > -7) // go left + up + check 12 pixels right - { - var done = false; - for (int i = 1; i < maxUp; i++) - { - for (int k = 1; k < 9; k++) - { - if (CanGoUpAndRight(bmp, i, 12, x - k, y + yChange, minLineHeight)) - { - backJump++; - x -= k; - points.RemoveAll(p => p.X > x); - done = true; - yChange -= (i + 1); - break; - } - } - - if (done) - { - break; - } - } - - if (!done) - { - started = true; - break; - } - } - - else - { - started = true; - break; - } - } - - if (started) - { - points.Add(new Point(x, y + yChange)); - } - - completed = x == bmp.Width - 1; - x++; - } - - if (completed) - { - splitLines.Add(y, points); - } - - } - - var transparentColor = Color.FromArgb(0, 0, 0, 0); - foreach (var line in splitLines) - { - var key = line.Key; - if (key - startY > minLineHeight && line.Value.Count > 0) - { - var maxY = line.Value.Max(p => p.Y); - var part = bmp.CopyRectangle(new Rectangle(0, startY, bmp.Width, maxY - startY)); - //part.GetBitmap().Save(@"j:\temp\split_" + parts.Count + "_before.bmp"); - - foreach (var point in line.Value) - { - // delete down - for (var y = point.Y - 1; y < startY + part.Height; y++) - { - part.SetPixel(point.X, y - startY, transparentColor); - } - } - //part.GetBitmap().Save(@"j:\temp\split_" + parts.Count + "_after.bmp"); - - if (!part.IsImageOnlyTransparent() && part.GetNonTransparentHeight() >= minLineHeight) - { - var minY = line.Value.Min(p => p.Y); - // bmp.GetBitmap().Save(@"j:\temp\main_" + parts.Count + "_before.bmp"); - foreach (var point in line.Value) - { - // delete up - for (var y = point.Y; y >= minY; y--) - { - bmp.SetPixel(point.X, y, transparentColor); - } - } - // bmp.GetBitmap().Save(@"j:\temp\main_" + parts.Count + "_after.bmp"); - - // part.GetBitmap().Save(@"j:\temp\split_" + parts.Count + "_after.bmp"); - var croppedTop = part.CropTopTransparent(0); - parts.Add(new ImageSplitterItem(0 + item.X, startY + croppedTop + item.Y, part)); - - startY = key + 1; - } - - } - } - - if (bmp.Height - startY > 1 && parts.Count > 0) - { - var part = bmp.CopyRectangle(new Rectangle(0, startY, bmp.Width, bmp.Height - startY)); - if (!part.IsImageOnlyTransparent()) - { - //part.GetBitmap().Save(@"j:\temp\split_" + parts.Count + ".bmp"); - var croppedTop = part.CropTopTransparent(0); - parts.Add(new ImageSplitterItem(0 + item.X, startY + croppedTop + item.Y, part)); - } - } - - if (parts.Count <= 1) - { - return new List<ImageSplitterItem> { item }; - } - - return parts; - } - - private static bool CanGoUpAndRight(NikseBitmap bmp, int up, int right, int x, int y, int minLineHeight) - { - if (y - up < 0 || x + right >= bmp.Width || y + minLineHeight > bmp.Height) - { - return false; - } - - for (int myY = y; myY > y - up && myY > 1; myY--) - { - var a = bmp.GetAlpha(x, myY); - if (a > 150) - { - return false; - } - } - - for (int myX = x; x < x + right && myX < bmp.Width; myX++) - { - var a = bmp.GetAlpha(myX, y - up); - if (a > 150) - { - return false; - } - } - - return true; - } - - - private static IEnumerable<ImageSplitterItem> SplitHorizontalNew(ImageSplitterItem lineSplitterItem, int xOrMorePixelsMakesSpace) - { - var bmp = new NikseBitmap(lineSplitterItem.NikseBitmap); - bmp.AddTransparentLineRight(); - var parts = new List<ImageSplitterItem>(); - int startX = 0; - int width = 0; - int spacePixels = 0; - int subtractSpacePixels = 0; - for (int x = 0; x < bmp.Width; x++) - { - bool right; - bool clean; - List<Point> points = IsVerticalLineTransparetNew(bmp, x, out right, out clean); - - if (points != null && clean) - { - spacePixels++; - } - - if (right && points != null) - { - int add = FindMaxX(points, x) - x; - width += add; - subtractSpacePixels = add; - } - - var newStartX = points != null ? FindMinX(points, x) : 0; - if (points == null) - { - width++; - } - else if (width > 0 && newStartX > startX + 1) - { - var bmp0 = new NikseBitmap(bmp); - // remove pixels after current; - for (int index = 0; index < points.Count; index++) - { - var p = points[index]; - bmp0.MakeVerticalLinePartTransparent(p.X, p.X + index, p.Y); - } - width = FindMaxX(points, x) - startX; - width--; - startX++; - var b1 = bmp0.CopyRectangle(new Rectangle(startX, 0, width, bmp.Height)); - - int addY; - b1 = CropTopAndBottom(b1, out addY); - - if (spacePixels >= xOrMorePixelsMakesSpace && parts.Count > 0) - { - parts.Add(new ImageSplitterItem(" ") { Y = addY + lineSplitterItem.Y }); - } - - if (b1.Width > 0 && b1.Height > 0) - { - parts.Add(new ImageSplitterItem(startX + lineSplitterItem.X, addY + lineSplitterItem.Y, b1)); //y is what? - } - - // remove pixels before next letter; - const int begin = 0; - foreach (var p in points) - { - bmp.MakeVerticalLinePartTransparent(begin, p.X, p.Y); - } - width = 1; - startX = FindMinX(points, x); - spacePixels = -subtractSpacePixels; - subtractSpacePixels = 0; - } - else if (clean) - { - width = 1; - startX = newStartX; - } - } - return parts; - } - - private static int FindMinX(List<Point> points, int x) - { - for (int index = 0; index < points.Count; index++) - { - var p = points[index]; - if (p.X < x) - { - x = p.X; - } - } - return x; - } - - private static int FindMaxX(List<Point> points, int x) - { - for (int index = 0; index < points.Count; index++) - { - var p = points[index]; - if (p.X > x) - { - x = p.X; - } - } - return x; - } - - private static List<Point> IsVerticalLineTransparetNew(NikseBitmap bmp, int x, out bool right, out bool clean) - { - right = false; - bool left = false; - int leftCount = 0; - int rightCount = 0; - clean = true; - var points = new List<Point>(); - int y = 0; - int maxSlide = bmp.Height / 4; - - while (y < bmp.Height) - { - if (bmp.GetAlpha(x, y) > 100) - { - clean = false; - if (x == 0) - { - return null; - } - - if (x < bmp.Width - 1 && y < bmp.Height - 1 && bmp.GetAlpha(x + 1, y) == 0 && bmp.GetAlpha(x + 1, y + 1) == 0) - { - //if pixels to the left - move right? - if (bmp.GetAlpha(x - 1, y) > 0) - { - x++; //(requires search for min/max x in points - right = true; - } - else if (x > 0 && bmp.GetAlpha(x - 1, y) == 0) - { - x--; //(requires search for min/max x in points - left = true; - } - else - { - return null; - } - } - else if (x < bmp.Width - 1 && y == bmp.Height - 1 && bmp.GetAlpha(x + 1, y) == 0 && bmp.GetAlpha(x + 1, y - 1) == 0) - { - //if pixels to the left - move right? - if (bmp.GetAlpha(x - 1, y) > 0) - { - x++; //(requires search for min/max x in points - } - else - { - return null; - } - right = true; - } - else if (bmp.GetAlpha(x - 1, y) == 0) - { - x--; - left = true; - } - else if (y > 5 && bmp.GetAlpha(x - 1, y - 1) == 0) - { - x--; - y--; - left = true; - while (points.Count > 0 && points[points.Count - 1].Y > y) - { - points.RemoveAt(points.Count - 1); - } - } - else if (y > 5 && bmp.GetAlpha(x - 1, y - 2) == 0) - { - x--; - y -= 2; - left = true; - while (points.Count > 0 && points[points.Count - 1].Y > y) - { - points.RemoveAt(points.Count - 1); - } - } - else - { - return null; - } - - if (left) - { - leftCount++; - } - - if (right) - { - rightCount++; - } - - if (leftCount > maxSlide || rightCount > maxSlide) - { - return null; - } - } - else - { - points.Add(new Point(x, y)); - y++; - } - } - return points; - } - - internal static int IsBitmapsAlike(ManagedBitmap bmp1, NikseBitmap bmp2) - { - int different = 0; - int maxDiff = bmp1.Width * bmp1.Height / 5; - - for (int x = 1; x < bmp1.Width; x++) - { - for (int y = 1; y < bmp1.Height; y++) - { - if (!IsColorClose(bmp1.GetPixel(x, y), bmp2.GetPixel(x, y), 20)) - { - different++; - } - } - if (different > maxDiff) - { - return different + 10; - } - } - return different; - } - - internal static int IsBitmapsAlike(NikseBitmap bmp1, ManagedBitmap bmp2) - { - int different = 0; - int maxDiff = bmp1.Width * bmp1.Height / 5; - - for (int x = 1; x < bmp1.Width; x++) - { - for (int y = 1; y < bmp1.Height; y++) - { - if (!IsColorClose(bmp1.GetPixel(x, y), bmp2.GetPixel(x, y), 20)) - { - different++; - } - } - if (different > maxDiff) - { - return different + 10; - } - } - return different; - } - - internal static int IsBitmapsAlike(Ocr.Binary.BinaryOcrBitmap bmp1, NikseBitmap bmp2) - { - int different = 0; - int maxDiff = bmp1.Width * bmp1.Height / 5; - int w4 = bmp2.Width * 4; - for (int y = 0; y < bmp1.Height; y++) - { - var alpha = y * w4 + 3; - var pixel = y * bmp1.Width; - for (int x = 0; x < bmp1.Width; x++) - { - if (bmp1.GetPixel(pixel) > 0 && bmp2.GetAlpha(alpha) < 100) - { - different++; - } - - pixel++; - alpha += 4; - } - if (different > maxDiff) - { - return different + 10; - } - } - return different; - } - - internal static int IsBitmapsAlike(Ocr.Binary.BinaryOcrBitmap bmp1, Ocr.Binary.BinaryOcrBitmap bmp2) - { - int different = 0; - int maxDiff = bmp1.Width * bmp1.Height / 5; - for (int y = 0; y < bmp1.Height; y++) - { - var pixel = y * bmp1.Width; - for (int x = 0; x < bmp1.Width; x++) - { - if (bmp1.GetPixel(pixel) != bmp2.GetPixel(pixel)) - { - different++; - } - - pixel++; - } - if (different > maxDiff) - { - return different + 10; - } - } - return different; - } - - internal static int IsBitmapsAlike(NikseBitmap bmp1, Ocr.Binary.BinaryOcrBitmap bmp2) - { - int different = 0; - int maxDiff = bmp1.Width * bmp1.Height / 5; - int w4 = bmp1.Width * 4; - for (int y = 1; y < bmp1.Height; y++) - { - var alpha = y * w4 + 7; - var pixel = y * bmp2.Width + 1; - for (int x = 1; x < bmp1.Width; x++) - { - if (bmp1.GetAlpha(alpha) < 100 && bmp2.GetPixel(pixel) > 0) - { - different++; - } - - pixel++; - alpha += 4; - } - if (different > maxDiff) - { - return different + 10; - } - } - return different; - } - - } -} +using Nikse.SubtitleEdit.Core; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Logic +{ + public class NikseBitmapImageSplitter + { + public static bool IsColorClose(Color a, Color b, int tolerance) + { + if (a.A < 120 && b.A < 120) + { + return true; // transparent + } + + var alphaDiff = Math.Abs(a.A - b.A); + if (alphaDiff > 50) + { + return false; // different alpha levels + } + + if (a.A > 250 && a.R > 90 && a.G > 90 && a.B > 90 && + b.A > 250 && b.R > 90 && b.G > 90 && b.B > 90) + { + return true; // dark, non transparent + } + + int diff = (a.R + a.G + a.B) - (b.R + b.G + b.B); + return diff < tolerance && diff > -tolerance; + } + + public static bool IsColorClose(byte aa, byte ar, byte ag, byte ab, Color b, int tolerance) + { + if (aa < 120 && b.A < 120) + { + return true; // transparent + } + + if (aa > 250 && ar > 90 && ag > 90 && ab > 90 && + b.A > 250 && b.R > 90 && b.G > 90 && b.B > 90) + { + return true; // dark, non transparent + } + + int diff = (ar + ag + ab) - (b.R + b.G + b.B); + return diff < tolerance && diff > -tolerance; + } + + public static NikseBitmap CropTopAndBottom(NikseBitmap bmp, out int topCropping) + { + int startTop = 0; + int maxTop = bmp.Height - 2; + if (maxTop > bmp.Height) + { + maxTop = bmp.Height; + } + + for (int y = 0; y < maxTop; y++) + { + bool allTransparent = true; + for (int x = 0; x < bmp.Width; x++) + { + int a = bmp.GetAlpha(x, y); + if (a != 0) + { + allTransparent = false; + break; + } + } + if (!allTransparent) + { + break; + } + + startTop++; + } + topCropping = startTop; + + int h = bmp.Height; + bool bottomCroppingDone = false; + for (int y = bmp.Height - 1; y > 3; y--) + { + for (int x = 0; x < bmp.Width; x++) + { + int a = bmp.GetAlpha(x, y); + if (a != 0) + { + bottomCroppingDone = true; + break; + } + } + h = y; + if (bottomCroppingDone) + { + break; + } + } + if (h - startTop + 1 <= 0) + { + return new NikseBitmap(0, 0); + } + + return bmp.CopyRectangle(new Rectangle(0, startTop, bmp.Width, h - startTop + 1)); + } + + public static NikseBitmap CropTopAndBottom(NikseBitmap bmp, out int topCropping, int maxDifferentPixelsOnLine) + { + int startTop = 0; + int maxTop = bmp.Height - 2; + if (maxTop > bmp.Height) + { + maxTop = bmp.Height; + } + + for (int y = 0; y < maxTop; y++) + { + int difference = 0; + bool allTransparent = true; + for (int x = 1; x < bmp.Width - 1; x++) + { + int a = bmp.GetAlpha(x, y); + if (a != 0) + { + difference++; + if (difference >= maxDifferentPixelsOnLine) + { + allTransparent = false; + break; + } + } + } + if (!allTransparent) + { + break; + } + + startTop++; + } + if (startTop > 9) + { + startTop -= 5; // if top space > 9, then always leave blank 5 pixels on top (so . is not confused with '). + } + + topCropping = startTop; + + for (int y = bmp.Height - 1; y > 3; y--) + { + int difference = 0; + bool allTransparent = true; + for (int x = 1; x < bmp.Width - 1; x++) + { + int a = bmp.GetAlpha(x, y); + if (a != 0) + { + difference++; + if (difference >= maxDifferentPixelsOnLine) + { + allTransparent = false; + break; + } + } + } + if (allTransparent == false) + { + return bmp.CopyRectangle(new Rectangle(0, startTop, bmp.Width - 1, y - startTop + 1)); + } + } + return bmp; + } + + public static List<ImageSplitterItem> SplitToLinesTransparentOrBlack(NikseBitmap bmp) + { + int startY = 0; + int size = 0; + var parts = new List<ImageSplitterItem>(); + for (int y = 0; y < bmp.Height; y++) + { + bool allTransparent = true; + for (int x = 0; x < bmp.Width; x++) + { + var c = bmp.GetPixel(x, y); + if (c.A > 20 && c.R + c.G + c.B > 20) + { + allTransparent = false; + break; + } + } + if (allTransparent) + { + if (size > 2 && size <= 15) + { + size++; // at least 15 pixels, like top of 'i' or top of 'È' + } + else + { + if (size > 8) + { + var part = bmp.CopyRectangle(new Rectangle(0, startY, bmp.Width, size + 1)); + parts.Add(new ImageSplitterItem(0, startY, part)); + } + size = 0; + startY = y; + } + } + else + { + size++; + } + } + if (size > 2) + { + parts.Add(size == bmp.Height ? new ImageSplitterItem(0, startY, bmp) : new ImageSplitterItem(0, startY, bmp.CopyRectangle(new Rectangle(0, startY, bmp.Width, size + 1)))); + } + return parts; + } + + /// <summary> + /// split into lines + /// </summary> + public static List<ImageSplitterItem> SplitToLines(NikseBitmap bmp, int minLineHeight, double averageLineHeight = -1) + { + int startY = 0; + int size = 0; + var parts = new List<ImageSplitterItem>(); + for (int y = 0; y < bmp.Height; y++) + { + if (bmp.IsLineTransparent(y)) + { + + // check for appendix below text + bool appendix = y >= bmp.Height - minLineHeight; + if (!appendix && y < bmp.Height - 10 && size > minLineHeight && minLineHeight > 15) + { + bool yp1 = bmp.IsLineTransparent(y + 1); + bool yp2 = bmp.IsLineTransparent(y + 2); + bool yp3 = bmp.IsLineTransparent(y + 3); + bool yp4 = bmp.IsLineTransparent(y + 4); + bool yp5 = bmp.IsLineTransparent(y + 5); + if (!yp1 || !yp2 || !yp3 || !yp4 || !yp5) + { + bool yp6 = bmp.IsLineTransparent(y + 6); + bool yp7 = bmp.IsLineTransparent(y + 7); + bool yp8 = bmp.IsLineTransparent(y + 8); + bool yp9 = bmp.IsLineTransparent(y + 9); + if (yp6 && yp7 && yp8 && yp9) + { + appendix = true; + } + } + } + + if (appendix || size > 1 && size <= minLineHeight) + { + size++; // at least 'lineMinHeight' pixels, like top of 'i' + } + else + { + if (size > 1) + { + var part = bmp.CopyRectangle(new Rectangle(0, startY, bmp.Width, size + 1)); + parts.Add(new ImageSplitterItem(0, startY, part)); + } + size = 0; + startY = y; + } + } + else + { + size++; + } + } + if (size > 1) + { + if (size == bmp.Height) + { + if (size > 100) + { + return SplitToLinesTransparentOrBlack(bmp); + } + + parts.Add(new ImageSplitterItem(0, startY, bmp)); + } + else + { + parts.Add(new ImageSplitterItem(0, startY, bmp.CopyRectangle(new Rectangle(0, startY, bmp.Width, size + 1)))); + } + } + if (parts.Count == 1 && averageLineHeight > 5 && bmp.Height > averageLineHeight * 3) + { + return SplitToLinesAggressive(bmp, minLineHeight, averageLineHeight); + } + return parts; + } + + private static List<ImageSplitterItem> SplitToLinesAggressive(NikseBitmap bmp, int minLineHeight, double averageLineHeight) + { + int startY = 0; + int size = 0; + var parts = new List<ImageSplitterItem>(); + for (int y = 0; y < bmp.Height; y++) + { + int a; + bool allTransparent = bmp.IsLineTransparent(y); + + if (size > 5 && size >= minLineHeight && size > averageLineHeight && !allTransparent && bmp.Width > 50 && y < bmp.Height - 5) + { + var leftX = 0; + while (leftX < bmp.Width) + { + a = bmp.GetAlpha(leftX, y); + if (a != 0) + { + break; + } + leftX++; + } + var rightX = bmp.Width; + while (rightX > 0) + { + a = bmp.GetAlpha(rightX, y - 1); + if (a != 0) + { + break; + } + rightX--; + } + if (leftX >= rightX) + { + allTransparent = true; + } + + leftX = 0; + while (leftX < bmp.Width) + { + a = bmp.GetAlpha(leftX, y - 1); + if (a != 0) + { + break; + } + leftX++; + } + rightX = bmp.Width; + while (rightX > 0) + { + a = bmp.GetAlpha(rightX, y); + if (a != 0) + { + break; + } + rightX--; + } + if (leftX >= rightX) + { + allTransparent = true; + } + } + + if (allTransparent) + { + if (size > 2 && size <= minLineHeight) + { + size++; // at least 'lineMinHeight' pixels, like top of 'i' + } + else + { + if (size > 2) + { + var part = bmp.CopyRectangle(new Rectangle(0, startY, bmp.Width, size + 1)); + parts.Add(new ImageSplitterItem(0, startY, part)); + } + size = 0; + startY = y; + } + } + else + { + size++; + } + } + if (size > 2) + { + if (size == bmp.Height) + { + if (size > 100) + { + return SplitToLinesTransparentOrBlack(bmp); + } + + parts.Add(new ImageSplitterItem(0, startY, bmp)); + } + else + { + parts.Add(new ImageSplitterItem(0, startY, bmp.CopyRectangle(new Rectangle(0, startY, bmp.Width, size + 1)))); + } + } + if (parts.Count == 1 && averageLineHeight > 5 && bmp.Height > averageLineHeight * 3) + { + return parts; + } + return parts; + } + + public static int IsBitmapsAlike(NikseBitmap bmp1, Bitmap bmp2) + { + int different = 0; + int maxDiff = bmp1.Width * bmp1.Height / 5; + for (int y = 0; y < bmp1.Height; y++) + { + for (int x = 0; x < bmp1.Width; x++) + { + if (!IsColorClose(bmp1.GetPixel(x, y), bmp2.GetPixel(x, y), 20)) + { + different++; + } + } + } + if (different > maxDiff) + { + return different + 10; + } + + return different; + } + + public static List<ImageSplitterItem> SplitBitmapToLines(NikseBitmap bmp, int xOrMorePixelsMakesSpace, bool rightToLeft, bool topToBottom, int minLineHeight, bool autoHeight, double averageLineHeight = -1) + { + var list = new List<ImageSplitterItem>(); + + // split into separate lines + var splitOld = SplitToLines(bmp, minLineHeight, averageLineHeight); + if (!autoHeight) + { + return splitOld; + } + + // fast horizontal split by x number of whole lines (3-4) + var splitThreeBlankLines = SplitToLinesByMinTransparentHorizontalLines(bmp, minLineHeight, 3); + var splitFourBlankLines = SplitToLinesByMinTransparentHorizontalLines(bmp, minLineHeight, 4); + var splitBlankLines = splitThreeBlankLines.Count == splitFourBlankLines.Count ? splitFourBlankLines : splitThreeBlankLines; + + var lineBitmaps = splitOld.Count > splitBlankLines.Count ? splitOld : splitBlankLines; + + if (lineBitmaps.Count == 1 && lineBitmaps[0].NikseBitmap?.Height > minLineHeight * 2.2) + { + lineBitmaps = SplitToLinesNew(lineBitmaps[0], minLineHeight, averageLineHeight); // more advanced split (allows for up/down) + } + + return lineBitmaps; + } + + public static List<ImageSplitterItem> SplitBitmapToLettersNew(NikseBitmap bmp, int xOrMorePixelsMakesSpace, bool rightToLeft, bool topToBottom, int minLineHeight, bool autoHeight, double averageLineHeight = -1) + { + var list = new List<ImageSplitterItem>(); + + // split into separate lines + var splitOld = SplitToLines(bmp, minLineHeight, averageLineHeight); + + List<ImageSplitterItem> lineBitmaps; + if (autoHeight) + { + // fast horizontal split by x number of whole lines (3-4) + var splitThreeBlankLines = SplitToLinesByMinTransparentHorizontalLines(bmp, minLineHeight, 3); + var splitFourBlankLines = SplitToLinesByMinTransparentHorizontalLines(bmp, minLineHeight, 4); + var splitBlankLines = splitThreeBlankLines.Count == splitFourBlankLines.Count ? splitFourBlankLines : splitThreeBlankLines; + + lineBitmaps = splitOld.Count > splitBlankLines.Count ? splitOld : splitBlankLines; + + if (lineBitmaps.Count == 1 && lineBitmaps[0].NikseBitmap?.Height > minLineHeight * 2.2) + { + lineBitmaps = SplitToLinesNew(lineBitmaps[0], minLineHeight, averageLineHeight); // more advanced split (allows for up/down) + } + } + else + { + lineBitmaps = splitOld; + } + + //foreach (var bitmap in tempBitmaps) + //{ + // // var height = bitmap.NikseBitmap.GetNonTransparentHeight(); + // var bitmaps = SplitToLinesNew(bitmap, minLineHeight, averageLineHeight); // more advanced split (allows for up/down) + // lineBitmaps.AddRange(bitmaps); + //} + + if (!topToBottom) + { + lineBitmaps.Reverse(); + } + + // split into letters + for (int index = 0; index < lineBitmaps.Count; index++) + { + var b = lineBitmaps[index]; + if (index > 0) + { + list.Add(new ImageSplitterItem(Environment.NewLine)); + } + + var line = new List<ImageSplitterItem>(); + foreach (var item in SplitHorizontalNew(b, xOrMorePixelsMakesSpace)) + { + item.Top = index > 0 ? item.Y - b.Y : item.Y; + item.ParentY = item.Y; + line.Add(item); + } + if (rightToLeft) + { + line.Reverse(); + } + + list.AddRange(line); + } + return list; + } + + + /// <summary> + /// split into lines + /// </summary> + public static List<ImageSplitterItem> SplitToLinesByMinTransparentHorizontalLines(NikseBitmap bmp, int minLineHeight, int minTransparentLines) + { + var parts = new List<ImageSplitterItem>(); + var startY = 0; + var lastTransparentY = -1; + var keysInSequence = 0; + for (int y = minLineHeight; y < bmp.Height - minLineHeight; y++) + { + var isLineTransparent = bmp.IsLineTransparent(y); + if (startY == y && isLineTransparent) + { + startY++; + continue; // skip start + } + + if (isLineTransparent) + { + if (lastTransparentY == y - 1) + { + if (keysInSequence == 0) + { + keysInSequence++; + } + + keysInSequence++; + } + + if (keysInSequence > 2 && lastTransparentY - startY > minLineHeight) + { + var part = bmp.CopyRectangle(new Rectangle(0, startY, bmp.Width, lastTransparentY - startY - 1)); + if (!part.IsImageOnlyTransparent() && part.GetNonTransparentHeight() >= minLineHeight) + { + var croppedTop = part.CropTopTransparent(0); + parts.Add(new ImageSplitterItem(0, startY + croppedTop, part)); + startY = lastTransparentY + 1; + } + } + lastTransparentY = y; + } + else + { + keysInSequence = 0; + lastTransparentY = -1; + } + } + + if (bmp.Height - startY > 1) + { + var part = bmp.CopyRectangle(new Rectangle(0, startY, bmp.Width, bmp.Height - startY)); + if (!part.IsImageOnlyTransparent()) + { + var croppedTop = part.CropTopTransparent(0); + parts.Add(new ImageSplitterItem(0, startY + croppedTop, part)); + } + } + + return parts; + } + + + /// <summary> + /// split into lines + /// </summary> + public static List<ImageSplitterItem> SplitToLinesNew(ImageSplitterItem item, int minLineHeight, double averageLineHeight = -1) + { + var bmp = new NikseBitmap(item.NikseBitmap); + var parts = new List<ImageSplitterItem>(); + bool started = false; + var splitLines = new Dictionary<int, List<Point>>(); + var startY = 0; + for (int y = minLineHeight; y < bmp.Height - minLineHeight; y++) + { + if (startY == y && bmp.IsLineTransparent(y)) + { + startY++; + continue; + } + + var points = new List<Point>(); + var yChange = 0; + var completed = false; + var backJump = 0; + int x = 0; + var maxUp = Math.Min(10, minLineHeight / 2); + while (x < bmp.Width) + { + var a1 = bmp.GetAlpha(x, y + yChange); + var a2 = bmp.GetAlpha(x, y + 1 + yChange); + if (a1 > 150 || a2 > 150) + { + if (x > 1 && yChange < 8 && + bmp.GetAlpha(x - 1, y + yChange) < 150 && bmp.GetAlpha(x - 1, y + yChange) < 150 && + bmp.GetAlpha(x - 1, y + 1 + yChange) < 150 && bmp.GetAlpha(x - 1, y + 2 + yChange) < 150 && + bmp.GetAlpha(x - 1, y + 2 + yChange) < 150 && bmp.GetAlpha(x - 1, y + 3 + yChange) < 150 && + bmp.GetAlpha(x, y + 2 + yChange) < 150 && bmp.GetAlpha(x, y + 3 + yChange) < 150) + { + yChange += 2; + } + + else if (x > 1 && yChange < 8 && + bmp.GetAlpha(x - 1, y + yChange) < 150 && bmp.GetAlpha(x - 1, y + yChange) < 150 && + bmp.GetAlpha(x - 1, y + 1 + yChange) < 150 && bmp.GetAlpha(x - 1, y + 2 + yChange) < 150 && + bmp.GetAlpha(x - 1, y + 2 + yChange) < 150 && bmp.GetAlpha(x - 1, y + 3 + yChange) < 150 && + bmp.GetAlpha(x - 1, y + 3 + yChange) < 150 && bmp.GetAlpha(x - 1, y + 4 + yChange) < 150 && + bmp.GetAlpha(x, y + 3 + yChange) < 150 && bmp.GetAlpha(x, y + 4 + yChange) < 150) + { + yChange += 3; + } + + else if (x > 1 && yChange < 7 && + bmp.GetAlpha(x - 1, y + yChange) < 150 && bmp.GetAlpha(x - 1, y + yChange) < 150 && + bmp.GetAlpha(x - 1, y + 1 + yChange) < 150 && bmp.GetAlpha(x - 1, y + 2 + yChange) < 150 && + bmp.GetAlpha(x - 1, y + 2 + yChange) < 150 && bmp.GetAlpha(x - 1, y + 3 + yChange) < 150 && + bmp.GetAlpha(x - 1, y + 3 + yChange) < 150 && bmp.GetAlpha(x - 1, y + 4 + yChange) < 150 && + bmp.GetAlpha(x - 1, y + 4 + yChange) < 150 && bmp.GetAlpha(x - 1, y + 5 + yChange) < 150 && + bmp.GetAlpha(x, y + 4 + yChange) < 150 && bmp.GetAlpha(x, y + 5 + yChange) < 150) + { + yChange += 4; + } + + else if (x > 1 && yChange > -7 && + bmp.GetAlpha(x - 1, y + yChange) < 150 && bmp.GetAlpha(x - 1, y + yChange) < 150 && + bmp.GetAlpha(x - 1, y - 1 + yChange) < 150 && bmp.GetAlpha(x - 1, y - 2 + yChange) < 150 && + bmp.GetAlpha(x - 1, y - 2 + yChange) < 150 && bmp.GetAlpha(x - 1, y - 3 + yChange) < 150 && + bmp.GetAlpha(x, y - 2 + yChange) < 150 && bmp.GetAlpha(x, y - 3 + yChange) < 150) + { + yChange -= 2; + } + + else if (x > 1 && yChange > -7 && + bmp.GetAlpha(x - 1, y + yChange) < 150 && bmp.GetAlpha(x - 1, y + yChange) < 150 && + bmp.GetAlpha(x - 1, y - 1 + yChange) < 150 && bmp.GetAlpha(x - 1, y - 2 + yChange) < 150 && + bmp.GetAlpha(x - 1, y - 2 + yChange) < 150 && bmp.GetAlpha(x - 1, y - 3 + yChange) < 150 && + bmp.GetAlpha(x - 1, y - 3 + yChange) < 150 && bmp.GetAlpha(x - 1, y - 4 + yChange) < 150 && + bmp.GetAlpha(x, y - 3 + yChange) < 150 && bmp.GetAlpha(x, y - 4 + yChange) < 150) + { + yChange -= 3; + } + + else if (x > 1 && yChange > -7 && + bmp.GetAlpha(x - 1, y + yChange) < 150 && bmp.GetAlpha(x - 1, y + yChange) < 150 && + bmp.GetAlpha(x - 1, y - 1 + yChange) < 150 && bmp.GetAlpha(x - 1, y - 2 + yChange) < 150 && + bmp.GetAlpha(x - 1, y - 2 + yChange) < 150 && bmp.GetAlpha(x - 1, y - 3 + yChange) < 150 && + bmp.GetAlpha(x - 1, y - 3 + yChange) < 150 && bmp.GetAlpha(x - 1, y - 4 + yChange) < 150 && + bmp.GetAlpha(x - 1, y - 4 + yChange) < 150 && bmp.GetAlpha(x - 1, y - 5 + yChange) < 150 && + bmp.GetAlpha(x, y - 4 + yChange) < 150 && bmp.GetAlpha(x, y - 5 + yChange) < 150) + { + yChange -= 4; + } + + else if (x > 10 && backJump < 3 && x > 5 && yChange > -7) // go left + up + check 12 pixels right + { + var done = false; + for (int i = 1; i < maxUp; i++) + { + for (int k = 1; k < 9; k++) + { + if (CanGoUpAndRight(bmp, i, 12, x - k, y + yChange, minLineHeight)) + { + backJump++; + x -= k; + points.RemoveAll(p => p.X > x); + done = true; + yChange -= (i + 1); + break; + } + } + + if (done) + { + break; + } + } + + if (!done) + { + started = true; + break; + } + } + + else + { + started = true; + break; + } + } + + if (started) + { + points.Add(new Point(x, y + yChange)); + } + + completed = x == bmp.Width - 1; + x++; + } + + if (completed) + { + splitLines.Add(y, points); + } + + } + + var transparentColor = Color.FromArgb(0, 0, 0, 0); + foreach (var line in splitLines) + { + var key = line.Key; + if (key - startY > minLineHeight && line.Value.Count > 0) + { + var maxY = line.Value.Max(p => p.Y); + var part = bmp.CopyRectangle(new Rectangle(0, startY, bmp.Width, maxY - startY)); + //part.GetBitmap().Save(@"j:\temp\split_" + parts.Count + "_before.bmp"); + + foreach (var point in line.Value) + { + // delete down + for (var y = point.Y - 1; y < startY + part.Height; y++) + { + part.SetPixel(point.X, y - startY, transparentColor); + } + } + //part.GetBitmap().Save(@"j:\temp\split_" + parts.Count + "_after.bmp"); + + if (!part.IsImageOnlyTransparent() && part.GetNonTransparentHeight() >= minLineHeight) + { + var minY = line.Value.Min(p => p.Y); + // bmp.GetBitmap().Save(@"j:\temp\main_" + parts.Count + "_before.bmp"); + foreach (var point in line.Value) + { + // delete up + for (var y = point.Y; y >= minY; y--) + { + bmp.SetPixel(point.X, y, transparentColor); + } + } + // bmp.GetBitmap().Save(@"j:\temp\main_" + parts.Count + "_after.bmp"); + + // part.GetBitmap().Save(@"j:\temp\split_" + parts.Count + "_after.bmp"); + var croppedTop = part.CropTopTransparent(0); + parts.Add(new ImageSplitterItem(0 + item.X, startY + croppedTop + item.Y, part)); + + startY = key + 1; + } + + } + } + + if (bmp.Height - startY > 1 && parts.Count > 0) + { + var part = bmp.CopyRectangle(new Rectangle(0, startY, bmp.Width, bmp.Height - startY)); + if (!part.IsImageOnlyTransparent()) + { + //part.GetBitmap().Save(@"j:\temp\split_" + parts.Count + ".bmp"); + var croppedTop = part.CropTopTransparent(0); + parts.Add(new ImageSplitterItem(0 + item.X, startY + croppedTop + item.Y, part)); + } + } + + if (parts.Count <= 1) + { + return new List<ImageSplitterItem> { item }; + } + + return parts; + } + + private static bool CanGoUpAndRight(NikseBitmap bmp, int up, int right, int x, int y, int minLineHeight) + { + if (y - up < 0 || x + right >= bmp.Width || y + minLineHeight > bmp.Height) + { + return false; + } + + for (int myY = y; myY > y - up && myY > 1; myY--) + { + var a = bmp.GetAlpha(x, myY); + if (a > 150) + { + return false; + } + } + + for (int myX = x; x < x + right && myX < bmp.Width; myX++) + { + var a = bmp.GetAlpha(myX, y - up); + if (a > 150) + { + return false; + } + } + + return true; + } + + + private static IEnumerable<ImageSplitterItem> SplitHorizontalNew(ImageSplitterItem lineSplitterItem, int xOrMorePixelsMakesSpace) + { + var bmp = new NikseBitmap(lineSplitterItem.NikseBitmap); + bmp.AddTransparentLineRight(); + var parts = new List<ImageSplitterItem>(); + int startX = 0; + int width = 0; + int spacePixels = 0; + int subtractSpacePixels = 0; + for (int x = 0; x < bmp.Width; x++) + { + bool right; + bool clean; + List<Point> points = IsVerticalLineTransparetNew(bmp, x, out right, out clean); + + if (points != null && clean) + { + spacePixels++; + } + + if (right && points != null) + { + int add = FindMaxX(points, x) - x; + width += add; + subtractSpacePixels = add; + } + + var newStartX = points != null ? FindMinX(points, x) : 0; + if (points == null) + { + width++; + } + else if (width > 0 && newStartX > startX + 1) + { + var bmp0 = new NikseBitmap(bmp); + // remove pixels after current; + for (int index = 0; index < points.Count; index++) + { + var p = points[index]; + bmp0.MakeVerticalLinePartTransparent(p.X, p.X + index, p.Y); + } + width = FindMaxX(points, x) - startX; + width--; + startX++; + var b1 = bmp0.CopyRectangle(new Rectangle(startX, 0, width, bmp.Height)); + + int addY; + b1 = CropTopAndBottom(b1, out addY); + + if (spacePixels >= xOrMorePixelsMakesSpace && parts.Count > 0) + { + parts.Add(new ImageSplitterItem(" ") { Y = addY + lineSplitterItem.Y }); + } + + if (b1.Width > 0 && b1.Height > 0) + { + parts.Add(new ImageSplitterItem(startX + lineSplitterItem.X, addY + lineSplitterItem.Y, b1)); //y is what? + } + + // remove pixels before next letter; + const int begin = 0; + foreach (var p in points) + { + bmp.MakeVerticalLinePartTransparent(begin, p.X, p.Y); + } + width = 1; + startX = FindMinX(points, x); + spacePixels = -subtractSpacePixels; + subtractSpacePixels = 0; + } + else if (clean) + { + width = 1; + startX = newStartX; + } + } + return parts; + } + + private static int FindMinX(List<Point> points, int x) + { + for (int index = 0; index < points.Count; index++) + { + var p = points[index]; + if (p.X < x) + { + x = p.X; + } + } + return x; + } + + private static int FindMaxX(List<Point> points, int x) + { + for (int index = 0; index < points.Count; index++) + { + var p = points[index]; + if (p.X > x) + { + x = p.X; + } + } + return x; + } + + private static List<Point> IsVerticalLineTransparetNew(NikseBitmap bmp, int x, out bool right, out bool clean) + { + right = false; + bool left = false; + int leftCount = 0; + int rightCount = 0; + clean = true; + var points = new List<Point>(); + int y = 0; + int maxSlide = bmp.Height / 4; + + while (y < bmp.Height) + { + if (bmp.GetAlpha(x, y) > 100) + { + clean = false; + if (x == 0) + { + return null; + } + + if (x < bmp.Width - 1 && y < bmp.Height - 1 && bmp.GetAlpha(x + 1, y) == 0 && bmp.GetAlpha(x + 1, y + 1) == 0) + { + //if pixels to the left - move right? + if (bmp.GetAlpha(x - 1, y) > 0) + { + x++; //(requires search for min/max x in points + right = true; + } + else if (x > 0 && bmp.GetAlpha(x - 1, y) == 0) + { + x--; //(requires search for min/max x in points + left = true; + } + else + { + return null; + } + } + else if (x < bmp.Width - 1 && y == bmp.Height - 1 && bmp.GetAlpha(x + 1, y) == 0 && bmp.GetAlpha(x + 1, y - 1) == 0) + { + //if pixels to the left - move right? + if (bmp.GetAlpha(x - 1, y) > 0) + { + x++; //(requires search for min/max x in points + } + else + { + return null; + } + right = true; + } + else if (bmp.GetAlpha(x - 1, y) == 0) + { + x--; + left = true; + } + else if (y > 5 && bmp.GetAlpha(x - 1, y - 1) == 0) + { + x--; + y--; + left = true; + while (points.Count > 0 && points[points.Count - 1].Y > y) + { + points.RemoveAt(points.Count - 1); + } + } + else if (y > 5 && bmp.GetAlpha(x - 1, y - 2) == 0) + { + x--; + y -= 2; + left = true; + while (points.Count > 0 && points[points.Count - 1].Y > y) + { + points.RemoveAt(points.Count - 1); + } + } + else + { + return null; + } + + if (left) + { + leftCount++; + } + + if (right) + { + rightCount++; + } + + if (leftCount > maxSlide || rightCount > maxSlide) + { + return null; + } + } + else + { + points.Add(new Point(x, y)); + y++; + } + } + return points; + } + + internal static int IsBitmapsAlike(ManagedBitmap bmp1, NikseBitmap bmp2) + { + int different = 0; + int maxDiff = bmp1.Width * bmp1.Height / 5; + + for (int x = 1; x < bmp1.Width; x++) + { + for (int y = 1; y < bmp1.Height; y++) + { + if (!IsColorClose(bmp1.GetPixel(x, y), bmp2.GetPixel(x, y), 20)) + { + different++; + } + } + if (different > maxDiff) + { + return different + 10; + } + } + return different; + } + + internal static int IsBitmapsAlike(NikseBitmap bmp1, ManagedBitmap bmp2) + { + int different = 0; + int maxDiff = bmp1.Width * bmp1.Height / 5; + + for (int x = 1; x < bmp1.Width; x++) + { + for (int y = 1; y < bmp1.Height; y++) + { + if (!IsColorClose(bmp1.GetPixel(x, y), bmp2.GetPixel(x, y), 20)) + { + different++; + } + } + if (different > maxDiff) + { + return different + 10; + } + } + return different; + } + + internal static int IsBitmapsAlike(Ocr.Binary.BinaryOcrBitmap bmp1, NikseBitmap bmp2) + { + int different = 0; + int maxDiff = bmp1.Width * bmp1.Height / 5; + int w4 = bmp2.Width * 4; + for (int y = 0; y < bmp1.Height; y++) + { + var alpha = y * w4 + 3; + var pixel = y * bmp1.Width; + for (int x = 0; x < bmp1.Width; x++) + { + if (bmp1.GetPixel(pixel) > 0 && bmp2.GetAlpha(alpha) < 100) + { + different++; + } + + pixel++; + alpha += 4; + } + if (different > maxDiff) + { + return different + 10; + } + } + return different; + } + + internal static int IsBitmapsAlike(Ocr.Binary.BinaryOcrBitmap bmp1, Ocr.Binary.BinaryOcrBitmap bmp2) + { + int different = 0; + int maxDiff = bmp1.Width * bmp1.Height / 5; + for (int y = 0; y < bmp1.Height; y++) + { + var pixel = y * bmp1.Width; + for (int x = 0; x < bmp1.Width; x++) + { + if (bmp1.GetPixel(pixel) != bmp2.GetPixel(pixel)) + { + different++; + } + + pixel++; + } + if (different > maxDiff) + { + return different + 10; + } + } + return different; + } + + internal static int IsBitmapsAlike(NikseBitmap bmp1, Ocr.Binary.BinaryOcrBitmap bmp2) + { + int different = 0; + int maxDiff = bmp1.Width * bmp1.Height / 5; + int w4 = bmp1.Width * 4; + for (int y = 1; y < bmp1.Height; y++) + { + var alpha = y * w4 + 7; + var pixel = y * bmp2.Width + 1; + for (int x = 1; x < bmp1.Width; x++) + { + if (bmp1.GetAlpha(alpha) < 100 && bmp2.GetPixel(pixel) > 0) + { + different++; + } + + pixel++; + alpha += 4; + } + if (different > maxDiff) + { + return different + 10; + } + } + return different; + } + + } +} diff --git a/src/Logic/Ocr/Binary/BinaryOcrBitmap.cs b/src/ui/Logic/Ocr/Binary/BinaryOcrBitmap.cs similarity index 96% rename from src/Logic/Ocr/Binary/BinaryOcrBitmap.cs rename to src/ui/Logic/Ocr/Binary/BinaryOcrBitmap.cs index c1d27677b..3622bac53 100644 --- a/src/Logic/Ocr/Binary/BinaryOcrBitmap.cs +++ b/src/ui/Logic/Ocr/Binary/BinaryOcrBitmap.cs @@ -1,911 +1,911 @@ -using Nikse.SubtitleEdit.Core; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.IO; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Logic.Ocr.Binary -{ - public class BinaryOcrBitmap - { - //File format: - //------------- - //2bytes=width - //2bytes=height - //2bytes=x - //2bytes=y - //2bytes=numberOfColoredPixels - //1byte=flags (1 bit = italic, next 7 bits = ExpandCount) - //4bytes=hash - //1bytes=text len - //text len bytes=text (UTF-8) - //w*h bytes / 8=pixels as bits(byte aligned) - - public int Width { get; private set; } - public int Height { get; private set; } - public int X { get; set; } - public int Y { get; set; } - public int NumberOfColoredPixels { get; private set; } - public uint Hash { get; private set; } - private byte[] _colors; - public bool Italic { get; set; } - public int ExpandCount { get; set; } - public bool LoadedOk { get; } - public string Text { get; set; } - public List<BinaryOcrBitmap> ExpandedList { get; set; } - - public string Key => Text + "|#|" + Hash + "_" + Width + "x" + Height + "_" + NumberOfColoredPixels; - - public override string ToString() - { - if (Italic) - { - return Text + " (" + Width + "x" + Height + ", italic)"; - } - - return Text + " (" + Width + "x" + Height + ")"; - } - - public BinaryOcrBitmap(int width, int height) - { - Width = width; - Height = height; - _colors = new byte[Width * Height]; - Hash = MurMurHash3.Hash(_colors); - NumberOfColoredPixels = 0; - } - - public BinaryOcrBitmap(Stream stream) - { - try - { - var buffer = new byte[16]; - int read = stream.Read(buffer, 0, buffer.Length); - if (read < buffer.Length) - { - LoadedOk = false; - return; - } - Width = buffer[0] << 8 | buffer[1]; - Height = buffer[2] << 8 | buffer[3]; - X = buffer[4] << 8 | buffer[5]; - Y = buffer[6] << 8 | buffer[7]; - NumberOfColoredPixels = buffer[8] << 8 | buffer[9]; - Italic = (buffer[10] & 0b10000000) > 0; - ExpandCount = buffer[10] & 0b01111111; - Hash = (uint)(buffer[11] << 24 | buffer[12] << 16 | buffer[13] << 8 | buffer[14]); - int textLen = buffer[15]; - if (textLen > 0) - { - buffer = new byte[textLen]; - stream.Read(buffer, 0, buffer.Length); - Text = System.Text.Encoding.UTF8.GetString(buffer); - } - - _colors = new byte[Width * Height]; - stream.Read(_colors, 0, _colors.Length); - LoadedOk = true; - } - catch - { - LoadedOk = false; - } - } - - public BinaryOcrBitmap(NikseBitmap nbmp) - { - InitializeViaNikseBmp(nbmp); - } - - public BinaryOcrBitmap(NikseBitmap nbmp, bool italic, int expandCount, string text, int x, int y) - { - InitializeViaNikseBmp(nbmp); - Italic = italic; - ExpandCount = expandCount; - Text = text; - X = x; - Y = y; - } - - private void InitializeViaNikseBmp(NikseBitmap nbmp) - { - Width = nbmp.Width; - Height = nbmp.Height; - _colors = new byte[Width * Height]; - var numberOfColoredPixels = 0; - for (int y = 0; y < Height; y++) - { - for (int x = 0; x < Width; x++) - { - var alpha = nbmp.GetAlpha(x, y); - if (alpha < 100) - { - _colors[Width * y + x] = 0; - } - else - { - _colors[Width * y + x] = 1; - numberOfColoredPixels++; - } - } - } - NumberOfColoredPixels = numberOfColoredPixels; - Hash = MurMurHash3.Hash(_colors); - } - - public bool AreColorsEqual(BinaryOcrBitmap other) - { - if (_colors.Length != other._colors.Length) - { - return false; - } - - for (int i = 0; i < _colors.Length; i++) - { - if (_colors[i] != other._colors[i]) - { - return false; - } - } - - return true; - } - - public void Save(Stream stream) - { - WriteInt16(stream, (ushort)Width); - WriteInt16(stream, (ushort)Height); - - WriteInt16(stream, (ushort)X); - WriteInt16(stream, (ushort)Y); - - WriteInt16(stream, (ushort)NumberOfColoredPixels); - - byte flags = (byte)(ExpandCount & 0b01111111); - if (Italic) - { - flags = (byte)(flags + 0b10000000); - } - - stream.WriteByte(flags); - - WriteInt32(stream, Hash); - - if (Text == null) - { - stream.WriteByte(0); - } - else - { - var textBuffer = System.Text.Encoding.UTF8.GetBytes(Text); - stream.WriteByte((byte)textBuffer.Length); - stream.Write(textBuffer, 0, textBuffer.Length); - } - - stream.Write(_colors, 0, _colors.Length); - } - - private static void WriteInt16(Stream stream, ushort val) - { - var buffer = new byte[2]; - buffer[0] = (byte)((val & 0xFF00) >> 8); - buffer[1] = (byte)(val & 0x00FF); - stream.Write(buffer, 0, buffer.Length); - } - - private static void WriteInt32(Stream stream, UInt32 val) - { - var buffer = new byte[4]; - buffer[0] = (byte)((val & 0xFF000000) >> 24); - buffer[1] = (byte)((val & 0xFF0000) >> 16); - buffer[2] = (byte)((val & 0xFF00) >> 8); - buffer[3] = (byte)(val & 0xFF); - stream.Write(buffer, 0, buffer.Length); - } - - public int GetPixel(int x, int y) - { - return _colors[Width * y + x]; - } - - public int GetPixel(int index) - { - return _colors[index]; - } - - public void SetPixel(int x, int y) - { - _colors[Width * y + x] = 1; - } - - /// <summary> - /// Copies a rectangle from the bitmap to a new bitmap - /// </summary> - /// <param name="section">Source rectangle</param> - /// <returns>Rectangle from current image as new bitmap</returns> - public ManagedBitmap GetRectangle(Rectangle section) - { - var newRectangle = new ManagedBitmap(section.Width, section.Height); - - int recty = 0; - for (int y = section.Top; y < section.Top + section.Height; y++) - { - int rectx = 0; - for (int x = section.Left; x < section.Left + section.Width; x++) - { - Color c = Color.Transparent; - if (GetPixel(x, y) > 0) - { - c = Color.White; - } - - newRectangle.SetPixel(rectx, recty, c); - rectx++; - } - recty++; - } - return newRectangle; - } - - public Bitmap ToOldBitmap() - { - return ToOldBitmap(Color.White); - } - - public Bitmap ToOldBitmap(Color color) - { - if (ExpandedList != null && ExpandedList.Count > 0) - { - int minX = X; - int minY = Y; - int maxX = X + Width; - int maxY = Y + Height; - var list = new List<BinaryOcrBitmap> { this }; - foreach (BinaryOcrBitmap bob in ExpandedList) - { - if (bob.X < minX) - { - minX = bob.X; - } - - if (bob.Y < minY) - { - minY = bob.Y; - } - - if (bob.X + bob.Width > maxX) - { - maxX = bob.X + bob.Width; - } - - if (bob.Y + bob.Height > maxY) - { - maxY = bob.Y + bob.Height; - } - - list.Add(bob); - } - var nbmp = new BinaryOcrBitmap(maxX - minX, maxY - minY); - foreach (BinaryOcrBitmap bob in list) - { - for (int y = 0; y < bob.Height; y++) - { - for (int x = 0; x < bob.Width; x++) - { - int c = bob.GetPixel(x, y); - if (c > 0) - { - nbmp.SetPixel(bob.X - minX + x, bob.Y - minY + y); - } - } - } - } - - return nbmp.ToOldBitmap(color); // Recursive - } - else - { - var nbmp = new NikseBitmap(Width, Height); - for (int y = 0; y < Height; y++) - { - for (int x = 0; x < Width; x++) - { - Color c = Color.Transparent; - if (GetPixel(x, y) > 0) - { - c = color; - } - - nbmp.SetPixel(x, y, c); - } - } - return nbmp.GetBitmap(); - } - } - - - public bool IsPeriod() - { - if (ExpandCount > 0 || Y < 20) - { - return false; - } - - if (Width == 4 && Height == 5 && NumberOfColoredPixels == 20) - { - return true; - } - - if (Width == 5 && Height == 6 && NumberOfColoredPixels >= 28) - { - return true; - } - - if (Width == 6 && Height == 7 && NumberOfColoredPixels >= 40) - { - return true; - } - - if (Width < Height || Width < 5 || Width > 10 || Height < 3 || Height > 9) - { - return false; - } - - return true; - } - - public bool IsPeriodAtTop(int lowercaseHeight) - { - if (ExpandCount > 0 || Y > lowercaseHeight * 0.7) - { - return false; - } - - if (Width == 4 && Height == 5 && NumberOfColoredPixels == 20) - { - return true; - } - - if (Width == 5 && Height == 6 && NumberOfColoredPixels >= 28) - { - return true; - } - - if (Width == 6 && Height == 7 && NumberOfColoredPixels >= 40) - { - return true; - } - - if (Width < Height || Width < 5 || Width > 10 || Height < 3 || Height > 9) - { - return false; - } - - return true; - } - - public bool IsComma() - { - if (ExpandCount > 0 || Y < 20 || Height < Width || Width < 4 || Width > 12 || Height < 8 || Height > 15) - { - return false; - } - - return true; - } - - public bool IsApostrophe() - { - if (ExpandCount > 0 || Y > 10 || Height < Width - 2 || Width < 4 || Width > 12 || Height < 8 || Height > 16) - { - return false; - } - if ((double)Width * Height / NumberOfColoredPixels > 1.2) - { - return false; - } - if ((double)Height / Width < 2) // aspect ratio - { - return false; - } - - return true; - } - - public bool IsLowercaseI(out bool italic) - { - italic = false; - if (ExpandCount > 0 || Y > 20 || Height < Width + 10 || Width < 3 || Width > 20 || Height < 21 || Height > 60) - { - return false; - } - if ((double)Height / Width < 2.2) // aspect ratio - { - return false; - } - - if (Width > Height / 4) - { - if (GetPixel(1, 1) == 0 && GetPixel(2, 2) == 0 && GetPixel(Width - 1, Height - 1) == 0 && GetPixel(Width - 2, Height - 2) == 0) - { - italic = true; - } - if (Height > 40 && (GetPixel(3, 3) == 1 || GetPixel(Width - 3, Height - 3) == 1)) - { - italic = false; - } - } - - var transparentHorLines = new bool[Height]; - for (int y = 0; y < Height; y++) - { - transparentHorLines[y] = true; - for (int x = 0; x < Width; x++) - { - if (GetPixel(x, y) != 0) - { - transparentHorLines[y] = false; - break; - } - } - } - if (transparentHorLines[0] || transparentHorLines[1]) - { - return false; - } - - for (int i = 0; i < Height / 2; i++) - { - if (transparentHorLines[Height - i - 1]) - { - return false; - } - } - var top = Height / 7; - for (int i = 0; i < 6; i++) - { - if (transparentHorLines[top + i]) - { - return true; - } - } - - return false; - } - - /// <summary> - /// Detects a lowercase non-italic 'j' - /// </summary> - /// <returns>true if image is 'j'</returns> - public bool IsLowercaseJ() - { - if (ExpandCount > 0 || Y > 20 || Height < Width * 2 || Width < 5 || Width > 25 || Height < 21 || Height > 70) - { - return false; - } - - var transparentHorLines = new bool[Height]; - for (int y = 0; y < Height; y++) - { - transparentHorLines[y] = true; - for (int x = 0; x < Width; x++) - { - if (GetPixel(x, y) != 0) - { - transparentHorLines[y] = false; - break; - } - } - } - - // top should be filled - if (transparentHorLines[0] || transparentHorLines[1]) - { - return false; - } - - // bottom half should be filled - for (int i = 0; i < Height / 2; i++) - { - if (transparentHorLines[Height - i - 1]) - { - return false; - } - } - - var top = Height / 7; - for (int i = 0; i < 6; i++) - { - if (transparentHorLines[top + i]) - { - top = top + i; - - // top left area should be free - int freeXPixels = 0; - for (int x = 0; x < Width; x++) - { - if (GetPixel(x, Height / 2) != 0) - { - break; - } - freeXPixels++; - } - if (freeXPixels < 3 || freeXPixels > Width * 0.67) - { - return false; - } - for (int y = top; y < Height * 0.67; y++) - { - for (int x = 0; x < freeXPixels; x++) - { - if (GetPixel(x, y) != 0) - { - return false; - } - } - } - return true; - } - } - - return false; - } - - public bool IsColon() - { - if (ExpandCount > 0 || Y < 5 || Y > 45 || Width > Height / 2 || Width < 3 || Width > 18 || Height < 14 || Height > 45) - { - return false; - } - - if (NumberOfColoredPixels * 2 > Width * Height) - { - return false; - } - - var transparentHorLines = new bool[Height]; - for (int y = 0; y < Height; y++) - { - transparentHorLines[y] = true; - for (int x = 0; x < Width; x++) - { - if (GetPixel(x, y) != 0) - { - transparentHorLines[y] = false; - break; - } - } - } - if (transparentHorLines[0] || transparentHorLines[1] || transparentHorLines[2]) - { - return false; - } - - if (transparentHorLines[Height - 1] || transparentHorLines[Height - 2] || transparentHorLines[Height - 3]) - { - return false; - } - - int startY = Height / 4; - int endY = startY * 3; - startY++; - endY--; - for (int y = startY; y < endY; y++) - { - if (!transparentHorLines[y]) - { - return false; - } - } - - return true; - } - - public bool IsDash() - { - if (ExpandCount > 0 || Y < 13 || Height * 2.3 > Width || Width < 10 || Width > 25 || Height < 3 || Height > 7) - { - return false; - } - - if (NumberOfColoredPixels + 7 < Width * Height) - { - return false; - } - - var transparentHorLines = new bool[Height]; - for (int y = 0; y < Height; y++) - { - transparentHorLines[y] = true; - for (int x = 0; x < Width; x++) - { - if (GetPixel(x, y) != 0) - { - transparentHorLines[y] = false; - break; - } - } - } - for (int i = 0; i < transparentHorLines.Length; i++) - { - if (transparentHorLines[i]) - { - return false; - } - } - - var transparentVerLines = new bool[Width]; - for (int x = 0; x < Width; x++) - { - transparentVerLines[x] = true; - for (int y = 0; y < Height; y++) - { - if (GetPixel(x, y) != 0) - { - transparentVerLines[x] = false; - break; - } - } - } - for (int i = 0; i < transparentVerLines.Length; i++) - { - if (transparentVerLines[i]) - { - return false; - } - } - - return true; - } - - public bool IsExclamationMark() - { - if (ExpandCount > 0 || Y > 20 || Height < Width + 10 || Width < 3 || Width > 17 || Height < 21 || Height > 50) - { - return false; - } - - if ((double)Height / Width < 2.3) // aspect ratio - { - return false; - } - - var transparentHorLines = new bool[Height]; - for (int y = 0; y < Height; y++) - { - transparentHorLines[y] = true; - for (int x = 0; x < Width; x++) - { - if (GetPixel(x, y) != 0) - { - transparentHorLines[y] = false; - break; - } - } - } - if (transparentHorLines[Height - 1] || transparentHorLines[Height - 2]) - { - return false; - } - - for (int i = 0; i < Height / 2; i++) - { - if (transparentHorLines[i]) - { - return false; - } - } - var bottom = Height - Height / 7; - for (int i = 0; i < 6; i++) - { - if (transparentHorLines[bottom - i]) - { - return true; - } - } - - return false; - } - - public bool IsLowercaseL() - { - if (ExpandCount > 0 || Y > 20 || Height < Width + 10 || Width < 4 || Width > 17 || Height < 21 || Height > 50) - { - return false; - } - - var transparentHorLines = new bool[Height]; - for (int y = 0; y < Height; y++) - { - transparentHorLines[y] = true; - for (int x = 0; x < Width; x++) - { - if (GetPixel(x, y) != 0) - { - transparentHorLines[y] = false; - break; - } - } - } - for (int i = 0; i < transparentHorLines.Length; i++) - { - if (transparentHorLines[i]) - { - return false; - } - } - - return true; - } - - public bool IsC() - { - if (ExpandCount > 0 || Y > 20 || Height < Width + 1 || Width < 12 || Width > 49 || Height < 15 || Height > 55) - { - return false; - } - - if (GetPixel(1, 1) != 0) - { - return false; - } - - if (GetPixel(1, Height - 1) != 0) - { - return false; - } - - if (GetPixel(Width - 1, 0) != 0) - { - return false; - } - - if (GetPixel(Width - 2, Height - 2) != 0) - { - return false; - } - - var transparentHorLines = new bool[Height]; - for (int y = 0; y < Height; y++) - { - transparentHorLines[y] = true; - for (int x = 0; x < Width; x++) - { - if (GetPixel(x, y) != 0) - { - transparentHorLines[y] = false; - break; - } - } - } - for (int i = 0; i < transparentHorLines.Length; i++) - { - if (transparentHorLines[i]) - { - return false; - } - } - - var transparentVerLines = new bool[Width]; - for (int x = 0; x < Width; x++) - { - transparentVerLines[x] = true; - for (int y = 0; y < Height; y++) - { - if (GetPixel(x, y) != 0) - { - transparentVerLines[x] = false; - break; - } - } - } - for (int i = 0; i < transparentVerLines.Length; i++) - { - if (transparentVerLines[i]) - { - return false; - } - } - - int halfWidth = Width / 2 - 1; - int halfHeight = Height / 2; - int halfHeightM1 = halfHeight--; - for (int x = halfWidth; x < Width; x++) - { - if (GetPixel(x, halfHeight) != 0 || GetPixel(x, halfHeightM1) != 0) - { - return false; - } - } - - return true; - } - - public bool IsO() - { - if (ExpandCount > 0 || Y > 20 || Math.Abs(Height - Width) > (int)Math.Round(Height / 6.0) || Width < 12 || Width > 49 || Height < 15 || Height > 55) - { - return false; - } - - if (GetPixel(1, 1) != 0) - { - return false; - } - - if (GetPixel(1, Height - 1) != 0) - { - return false; - } - - if (GetPixel(Width - 1, 0) != 0) - { - return false; - } - - if (GetPixel(Width - 2, Height - 2) != 0) - { - return false; - } - - var transparentHorLines = new bool[Height]; - for (int y = 0; y < Height; y++) - { - transparentHorLines[y] = true; - for (int x = 0; x < Width; x++) - { - if (GetPixel(x, y) != 0) - { - transparentHorLines[y] = false; - break; - } - } - } - for (int i = 0; i < transparentHorLines.Length; i++) - { - if (transparentHorLines[i]) - { - return false; - } - } - - var transparentVerLines = new bool[Width]; - for (int x = 0; x < Width; x++) - { - transparentVerLines[x] = true; - for (int y = 0; y < Height; y++) - { - if (GetPixel(x, y) != 0) - { - transparentVerLines[x] = false; - break; - } - } - } - for (int i = 0; i < transparentVerLines.Length; i++) - { - if (transparentVerLines[i]) - { - return false; - } - } - - int halfWidth = Width / 2 - 1; - int halfHeight = Height / 2; - int runLength = Width / 6; - for (int x = halfWidth - runLength; x < halfWidth + runLength; x++) - { - if (GetPixel(x, halfHeight - 1) != 0 || - GetPixel(x, halfHeight + 0) != 0 || - GetPixel(x, halfHeight + 1) != 0) - { - return false; - } - } - - return true; - } - - } -} +using Nikse.SubtitleEdit.Core; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Logic.Ocr.Binary +{ + public class BinaryOcrBitmap + { + //File format: + //------------- + //2bytes=width + //2bytes=height + //2bytes=x + //2bytes=y + //2bytes=numberOfColoredPixels + //1byte=flags (1 bit = italic, next 7 bits = ExpandCount) + //4bytes=hash + //1bytes=text len + //text len bytes=text (UTF-8) + //w*h bytes / 8=pixels as bits(byte aligned) + + public int Width { get; private set; } + public int Height { get; private set; } + public int X { get; set; } + public int Y { get; set; } + public int NumberOfColoredPixels { get; private set; } + public uint Hash { get; private set; } + private byte[] _colors; + public bool Italic { get; set; } + public int ExpandCount { get; set; } + public bool LoadedOk { get; } + public string Text { get; set; } + public List<BinaryOcrBitmap> ExpandedList { get; set; } + + public string Key => Text + "|#|" + Hash + "_" + Width + "x" + Height + "_" + NumberOfColoredPixels; + + public override string ToString() + { + if (Italic) + { + return Text + " (" + Width + "x" + Height + ", italic)"; + } + + return Text + " (" + Width + "x" + Height + ")"; + } + + public BinaryOcrBitmap(int width, int height) + { + Width = width; + Height = height; + _colors = new byte[Width * Height]; + Hash = MurMurHash3.Hash(_colors); + NumberOfColoredPixels = 0; + } + + public BinaryOcrBitmap(Stream stream) + { + try + { + var buffer = new byte[16]; + int read = stream.Read(buffer, 0, buffer.Length); + if (read < buffer.Length) + { + LoadedOk = false; + return; + } + Width = buffer[0] << 8 | buffer[1]; + Height = buffer[2] << 8 | buffer[3]; + X = buffer[4] << 8 | buffer[5]; + Y = buffer[6] << 8 | buffer[7]; + NumberOfColoredPixels = buffer[8] << 8 | buffer[9]; + Italic = (buffer[10] & 0b10000000) > 0; + ExpandCount = buffer[10] & 0b01111111; + Hash = (uint)(buffer[11] << 24 | buffer[12] << 16 | buffer[13] << 8 | buffer[14]); + int textLen = buffer[15]; + if (textLen > 0) + { + buffer = new byte[textLen]; + stream.Read(buffer, 0, buffer.Length); + Text = System.Text.Encoding.UTF8.GetString(buffer); + } + + _colors = new byte[Width * Height]; + stream.Read(_colors, 0, _colors.Length); + LoadedOk = true; + } + catch + { + LoadedOk = false; + } + } + + public BinaryOcrBitmap(NikseBitmap nbmp) + { + InitializeViaNikseBmp(nbmp); + } + + public BinaryOcrBitmap(NikseBitmap nbmp, bool italic, int expandCount, string text, int x, int y) + { + InitializeViaNikseBmp(nbmp); + Italic = italic; + ExpandCount = expandCount; + Text = text; + X = x; + Y = y; + } + + private void InitializeViaNikseBmp(NikseBitmap nbmp) + { + Width = nbmp.Width; + Height = nbmp.Height; + _colors = new byte[Width * Height]; + var numberOfColoredPixels = 0; + for (int y = 0; y < Height; y++) + { + for (int x = 0; x < Width; x++) + { + var alpha = nbmp.GetAlpha(x, y); + if (alpha < 100) + { + _colors[Width * y + x] = 0; + } + else + { + _colors[Width * y + x] = 1; + numberOfColoredPixels++; + } + } + } + NumberOfColoredPixels = numberOfColoredPixels; + Hash = MurMurHash3.Hash(_colors); + } + + public bool AreColorsEqual(BinaryOcrBitmap other) + { + if (_colors.Length != other._colors.Length) + { + return false; + } + + for (int i = 0; i < _colors.Length; i++) + { + if (_colors[i] != other._colors[i]) + { + return false; + } + } + + return true; + } + + public void Save(Stream stream) + { + WriteInt16(stream, (ushort)Width); + WriteInt16(stream, (ushort)Height); + + WriteInt16(stream, (ushort)X); + WriteInt16(stream, (ushort)Y); + + WriteInt16(stream, (ushort)NumberOfColoredPixels); + + byte flags = (byte)(ExpandCount & 0b01111111); + if (Italic) + { + flags = (byte)(flags + 0b10000000); + } + + stream.WriteByte(flags); + + WriteInt32(stream, Hash); + + if (Text == null) + { + stream.WriteByte(0); + } + else + { + var textBuffer = System.Text.Encoding.UTF8.GetBytes(Text); + stream.WriteByte((byte)textBuffer.Length); + stream.Write(textBuffer, 0, textBuffer.Length); + } + + stream.Write(_colors, 0, _colors.Length); + } + + private static void WriteInt16(Stream stream, ushort val) + { + var buffer = new byte[2]; + buffer[0] = (byte)((val & 0xFF00) >> 8); + buffer[1] = (byte)(val & 0x00FF); + stream.Write(buffer, 0, buffer.Length); + } + + private static void WriteInt32(Stream stream, UInt32 val) + { + var buffer = new byte[4]; + buffer[0] = (byte)((val & 0xFF000000) >> 24); + buffer[1] = (byte)((val & 0xFF0000) >> 16); + buffer[2] = (byte)((val & 0xFF00) >> 8); + buffer[3] = (byte)(val & 0xFF); + stream.Write(buffer, 0, buffer.Length); + } + + public int GetPixel(int x, int y) + { + return _colors[Width * y + x]; + } + + public int GetPixel(int index) + { + return _colors[index]; + } + + public void SetPixel(int x, int y) + { + _colors[Width * y + x] = 1; + } + + /// <summary> + /// Copies a rectangle from the bitmap to a new bitmap + /// </summary> + /// <param name="section">Source rectangle</param> + /// <returns>Rectangle from current image as new bitmap</returns> + public ManagedBitmap GetRectangle(Rectangle section) + { + var newRectangle = new ManagedBitmap(section.Width, section.Height); + + int recty = 0; + for (int y = section.Top; y < section.Top + section.Height; y++) + { + int rectx = 0; + for (int x = section.Left; x < section.Left + section.Width; x++) + { + Color c = Color.Transparent; + if (GetPixel(x, y) > 0) + { + c = Color.White; + } + + newRectangle.SetPixel(rectx, recty, c); + rectx++; + } + recty++; + } + return newRectangle; + } + + public Bitmap ToOldBitmap() + { + return ToOldBitmap(Color.White); + } + + public Bitmap ToOldBitmap(Color color) + { + if (ExpandedList != null && ExpandedList.Count > 0) + { + int minX = X; + int minY = Y; + int maxX = X + Width; + int maxY = Y + Height; + var list = new List<BinaryOcrBitmap> { this }; + foreach (BinaryOcrBitmap bob in ExpandedList) + { + if (bob.X < minX) + { + minX = bob.X; + } + + if (bob.Y < minY) + { + minY = bob.Y; + } + + if (bob.X + bob.Width > maxX) + { + maxX = bob.X + bob.Width; + } + + if (bob.Y + bob.Height > maxY) + { + maxY = bob.Y + bob.Height; + } + + list.Add(bob); + } + var nbmp = new BinaryOcrBitmap(maxX - minX, maxY - minY); + foreach (BinaryOcrBitmap bob in list) + { + for (int y = 0; y < bob.Height; y++) + { + for (int x = 0; x < bob.Width; x++) + { + int c = bob.GetPixel(x, y); + if (c > 0) + { + nbmp.SetPixel(bob.X - minX + x, bob.Y - minY + y); + } + } + } + } + + return nbmp.ToOldBitmap(color); // Recursive + } + else + { + var nbmp = new NikseBitmap(Width, Height); + for (int y = 0; y < Height; y++) + { + for (int x = 0; x < Width; x++) + { + Color c = Color.Transparent; + if (GetPixel(x, y) > 0) + { + c = color; + } + + nbmp.SetPixel(x, y, c); + } + } + return nbmp.GetBitmap(); + } + } + + + public bool IsPeriod() + { + if (ExpandCount > 0 || Y < 20) + { + return false; + } + + if (Width == 4 && Height == 5 && NumberOfColoredPixels == 20) + { + return true; + } + + if (Width == 5 && Height == 6 && NumberOfColoredPixels >= 28) + { + return true; + } + + if (Width == 6 && Height == 7 && NumberOfColoredPixels >= 40) + { + return true; + } + + if (Width < Height || Width < 5 || Width > 10 || Height < 3 || Height > 9) + { + return false; + } + + return true; + } + + public bool IsPeriodAtTop(int lowercaseHeight) + { + if (ExpandCount > 0 || Y > lowercaseHeight * 0.7) + { + return false; + } + + if (Width == 4 && Height == 5 && NumberOfColoredPixels == 20) + { + return true; + } + + if (Width == 5 && Height == 6 && NumberOfColoredPixels >= 28) + { + return true; + } + + if (Width == 6 && Height == 7 && NumberOfColoredPixels >= 40) + { + return true; + } + + if (Width < Height || Width < 5 || Width > 10 || Height < 3 || Height > 9) + { + return false; + } + + return true; + } + + public bool IsComma() + { + if (ExpandCount > 0 || Y < 20 || Height < Width || Width < 4 || Width > 12 || Height < 8 || Height > 15) + { + return false; + } + + return true; + } + + public bool IsApostrophe() + { + if (ExpandCount > 0 || Y > 10 || Height < Width - 2 || Width < 4 || Width > 12 || Height < 8 || Height > 16) + { + return false; + } + if ((double)Width * Height / NumberOfColoredPixels > 1.2) + { + return false; + } + if ((double)Height / Width < 2) // aspect ratio + { + return false; + } + + return true; + } + + public bool IsLowercaseI(out bool italic) + { + italic = false; + if (ExpandCount > 0 || Y > 20 || Height < Width + 10 || Width < 3 || Width > 20 || Height < 21 || Height > 60) + { + return false; + } + if ((double)Height / Width < 2.2) // aspect ratio + { + return false; + } + + if (Width > Height / 4) + { + if (GetPixel(1, 1) == 0 && GetPixel(2, 2) == 0 && GetPixel(Width - 1, Height - 1) == 0 && GetPixel(Width - 2, Height - 2) == 0) + { + italic = true; + } + if (Height > 40 && (GetPixel(3, 3) == 1 || GetPixel(Width - 3, Height - 3) == 1)) + { + italic = false; + } + } + + var transparentHorLines = new bool[Height]; + for (int y = 0; y < Height; y++) + { + transparentHorLines[y] = true; + for (int x = 0; x < Width; x++) + { + if (GetPixel(x, y) != 0) + { + transparentHorLines[y] = false; + break; + } + } + } + if (transparentHorLines[0] || transparentHorLines[1]) + { + return false; + } + + for (int i = 0; i < Height / 2; i++) + { + if (transparentHorLines[Height - i - 1]) + { + return false; + } + } + var top = Height / 7; + for (int i = 0; i < 6; i++) + { + if (transparentHorLines[top + i]) + { + return true; + } + } + + return false; + } + + /// <summary> + /// Detects a lowercase non-italic 'j' + /// </summary> + /// <returns>true if image is 'j'</returns> + public bool IsLowercaseJ() + { + if (ExpandCount > 0 || Y > 20 || Height < Width * 2 || Width < 5 || Width > 25 || Height < 21 || Height > 70) + { + return false; + } + + var transparentHorLines = new bool[Height]; + for (int y = 0; y < Height; y++) + { + transparentHorLines[y] = true; + for (int x = 0; x < Width; x++) + { + if (GetPixel(x, y) != 0) + { + transparentHorLines[y] = false; + break; + } + } + } + + // top should be filled + if (transparentHorLines[0] || transparentHorLines[1]) + { + return false; + } + + // bottom half should be filled + for (int i = 0; i < Height / 2; i++) + { + if (transparentHorLines[Height - i - 1]) + { + return false; + } + } + + var top = Height / 7; + for (int i = 0; i < 6; i++) + { + if (transparentHorLines[top + i]) + { + top = top + i; + + // top left area should be free + int freeXPixels = 0; + for (int x = 0; x < Width; x++) + { + if (GetPixel(x, Height / 2) != 0) + { + break; + } + freeXPixels++; + } + if (freeXPixels < 3 || freeXPixels > Width * 0.67) + { + return false; + } + for (int y = top; y < Height * 0.67; y++) + { + for (int x = 0; x < freeXPixels; x++) + { + if (GetPixel(x, y) != 0) + { + return false; + } + } + } + return true; + } + } + + return false; + } + + public bool IsColon() + { + if (ExpandCount > 0 || Y < 5 || Y > 45 || Width > Height / 2 || Width < 3 || Width > 18 || Height < 14 || Height > 45) + { + return false; + } + + if (NumberOfColoredPixels * 2 > Width * Height) + { + return false; + } + + var transparentHorLines = new bool[Height]; + for (int y = 0; y < Height; y++) + { + transparentHorLines[y] = true; + for (int x = 0; x < Width; x++) + { + if (GetPixel(x, y) != 0) + { + transparentHorLines[y] = false; + break; + } + } + } + if (transparentHorLines[0] || transparentHorLines[1] || transparentHorLines[2]) + { + return false; + } + + if (transparentHorLines[Height - 1] || transparentHorLines[Height - 2] || transparentHorLines[Height - 3]) + { + return false; + } + + int startY = Height / 4; + int endY = startY * 3; + startY++; + endY--; + for (int y = startY; y < endY; y++) + { + if (!transparentHorLines[y]) + { + return false; + } + } + + return true; + } + + public bool IsDash() + { + if (ExpandCount > 0 || Y < 13 || Height * 2.3 > Width || Width < 10 || Width > 25 || Height < 3 || Height > 7) + { + return false; + } + + if (NumberOfColoredPixels + 7 < Width * Height) + { + return false; + } + + var transparentHorLines = new bool[Height]; + for (int y = 0; y < Height; y++) + { + transparentHorLines[y] = true; + for (int x = 0; x < Width; x++) + { + if (GetPixel(x, y) != 0) + { + transparentHorLines[y] = false; + break; + } + } + } + for (int i = 0; i < transparentHorLines.Length; i++) + { + if (transparentHorLines[i]) + { + return false; + } + } + + var transparentVerLines = new bool[Width]; + for (int x = 0; x < Width; x++) + { + transparentVerLines[x] = true; + for (int y = 0; y < Height; y++) + { + if (GetPixel(x, y) != 0) + { + transparentVerLines[x] = false; + break; + } + } + } + for (int i = 0; i < transparentVerLines.Length; i++) + { + if (transparentVerLines[i]) + { + return false; + } + } + + return true; + } + + public bool IsExclamationMark() + { + if (ExpandCount > 0 || Y > 20 || Height < Width + 10 || Width < 3 || Width > 17 || Height < 21 || Height > 50) + { + return false; + } + + if ((double)Height / Width < 2.3) // aspect ratio + { + return false; + } + + var transparentHorLines = new bool[Height]; + for (int y = 0; y < Height; y++) + { + transparentHorLines[y] = true; + for (int x = 0; x < Width; x++) + { + if (GetPixel(x, y) != 0) + { + transparentHorLines[y] = false; + break; + } + } + } + if (transparentHorLines[Height - 1] || transparentHorLines[Height - 2]) + { + return false; + } + + for (int i = 0; i < Height / 2; i++) + { + if (transparentHorLines[i]) + { + return false; + } + } + var bottom = Height - Height / 7; + for (int i = 0; i < 6; i++) + { + if (transparentHorLines[bottom - i]) + { + return true; + } + } + + return false; + } + + public bool IsLowercaseL() + { + if (ExpandCount > 0 || Y > 20 || Height < Width + 10 || Width < 4 || Width > 17 || Height < 21 || Height > 50) + { + return false; + } + + var transparentHorLines = new bool[Height]; + for (int y = 0; y < Height; y++) + { + transparentHorLines[y] = true; + for (int x = 0; x < Width; x++) + { + if (GetPixel(x, y) != 0) + { + transparentHorLines[y] = false; + break; + } + } + } + for (int i = 0; i < transparentHorLines.Length; i++) + { + if (transparentHorLines[i]) + { + return false; + } + } + + return true; + } + + public bool IsC() + { + if (ExpandCount > 0 || Y > 20 || Height < Width + 1 || Width < 12 || Width > 49 || Height < 15 || Height > 55) + { + return false; + } + + if (GetPixel(1, 1) != 0) + { + return false; + } + + if (GetPixel(1, Height - 1) != 0) + { + return false; + } + + if (GetPixel(Width - 1, 0) != 0) + { + return false; + } + + if (GetPixel(Width - 2, Height - 2) != 0) + { + return false; + } + + var transparentHorLines = new bool[Height]; + for (int y = 0; y < Height; y++) + { + transparentHorLines[y] = true; + for (int x = 0; x < Width; x++) + { + if (GetPixel(x, y) != 0) + { + transparentHorLines[y] = false; + break; + } + } + } + for (int i = 0; i < transparentHorLines.Length; i++) + { + if (transparentHorLines[i]) + { + return false; + } + } + + var transparentVerLines = new bool[Width]; + for (int x = 0; x < Width; x++) + { + transparentVerLines[x] = true; + for (int y = 0; y < Height; y++) + { + if (GetPixel(x, y) != 0) + { + transparentVerLines[x] = false; + break; + } + } + } + for (int i = 0; i < transparentVerLines.Length; i++) + { + if (transparentVerLines[i]) + { + return false; + } + } + + int halfWidth = Width / 2 - 1; + int halfHeight = Height / 2; + int halfHeightM1 = halfHeight--; + for (int x = halfWidth; x < Width; x++) + { + if (GetPixel(x, halfHeight) != 0 || GetPixel(x, halfHeightM1) != 0) + { + return false; + } + } + + return true; + } + + public bool IsO() + { + if (ExpandCount > 0 || Y > 20 || Math.Abs(Height - Width) > (int)Math.Round(Height / 6.0) || Width < 12 || Width > 49 || Height < 15 || Height > 55) + { + return false; + } + + if (GetPixel(1, 1) != 0) + { + return false; + } + + if (GetPixel(1, Height - 1) != 0) + { + return false; + } + + if (GetPixel(Width - 1, 0) != 0) + { + return false; + } + + if (GetPixel(Width - 2, Height - 2) != 0) + { + return false; + } + + var transparentHorLines = new bool[Height]; + for (int y = 0; y < Height; y++) + { + transparentHorLines[y] = true; + for (int x = 0; x < Width; x++) + { + if (GetPixel(x, y) != 0) + { + transparentHorLines[y] = false; + break; + } + } + } + for (int i = 0; i < transparentHorLines.Length; i++) + { + if (transparentHorLines[i]) + { + return false; + } + } + + var transparentVerLines = new bool[Width]; + for (int x = 0; x < Width; x++) + { + transparentVerLines[x] = true; + for (int y = 0; y < Height; y++) + { + if (GetPixel(x, y) != 0) + { + transparentVerLines[x] = false; + break; + } + } + } + for (int i = 0; i < transparentVerLines.Length; i++) + { + if (transparentVerLines[i]) + { + return false; + } + } + + int halfWidth = Width / 2 - 1; + int halfHeight = Height / 2; + int runLength = Width / 6; + for (int x = halfWidth - runLength; x < halfWidth + runLength; x++) + { + if (GetPixel(x, halfHeight - 1) != 0 || + GetPixel(x, halfHeight + 0) != 0 || + GetPixel(x, halfHeight + 1) != 0) + { + return false; + } + } + + return true; + } + + } +} diff --git a/src/Logic/Ocr/Binary/BinaryOcrDb.cs b/src/ui/Logic/Ocr/Binary/BinaryOcrDb.cs similarity index 97% rename from src/Logic/Ocr/Binary/BinaryOcrDb.cs rename to src/ui/Logic/Ocr/Binary/BinaryOcrDb.cs index 151d530af..f0b142483 100644 --- a/src/Logic/Ocr/Binary/BinaryOcrDb.cs +++ b/src/ui/Logic/Ocr/Binary/BinaryOcrDb.cs @@ -1,254 +1,254 @@ -using Nikse.SubtitleEdit.Core; -using System; -using System.Collections.Generic; -using System.IO; -using System.IO.Compression; -using System.Linq; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Logic.Ocr.Binary -{ - public class BinaryOcrDb - { - public string FileName { get; } - public List<BinaryOcrBitmap> CompareImages = new List<BinaryOcrBitmap>(); - public List<BinaryOcrBitmap> CompareImagesExpanded = new List<BinaryOcrBitmap>(); - - public BinaryOcrDb(string fileName) - { - FileName = fileName; - } - - public BinaryOcrDb(string fileName, bool loadCompareImages) - { - FileName = fileName; - if (loadCompareImages) - { - LoadCompareImages(); - } - } - - public void Save() - { - using (Stream gz = new GZipStream(File.OpenWrite(FileName), CompressionMode.Compress)) - { - foreach (var bob in CompareImages) - { - if (bob.ExpandCount > 0) - { - System.Windows.Forms.MessageBox.Show("Ups, expand image in CompareImages!"); - } - - bob.Save(gz); - } - foreach (var bob in CompareImagesExpanded) - { - if (bob.ExpandCount == 0) - { - System.Windows.Forms.MessageBox.Show("Ups, not expanded image in CompareImagesExpanded!"); - } - - bob.Save(gz); - if (bob.ExpandedList.Count != bob.ExpandCount - 1) - { - throw new Exception("BinaryOcrDb.Save: Expanded image should have " + (bob.ExpandCount - 1) + " sub images"); - } - foreach (var expandedBob in bob.ExpandedList) - { - if (expandedBob.Text != null) - { - throw new Exception("BinaryOcrDb.Save: sub image should have null text"); - } - - expandedBob.Save(gz); - } - } - } - } - - public void LoadCompareImages() - { - var list = new List<BinaryOcrBitmap>(); - var expandList = new List<BinaryOcrBitmap>(); - - if (!File.Exists(FileName)) - { - CompareImages = list; - return; - } - - using (Stream gz = new GZipStream(File.OpenRead(FileName), CompressionMode.Decompress)) - { - bool done = false; - while (!done) - { - var bob = new BinaryOcrBitmap(gz); - if (bob.LoadedOk) - { - if (bob.ExpandCount > 0) - { - expandList.Add(bob); - bob.ExpandedList = new List<BinaryOcrBitmap>(); - for (int i = 1; i < bob.ExpandCount; i++) - { - var expandedBob = new BinaryOcrBitmap(gz); - if (expandedBob.LoadedOk) - { - if (expandedBob.Text != null) - { - throw new Exception("BinaryOcrDb.LoadCompareImages: sub image should have null text"); - } - - bob.ExpandedList.Add(expandedBob); - } - else - { - break; - } - } - } - else - { - list.Add(bob); - } - } - else - { - done = true; - } - } - } - CompareImages = list; - CompareImagesExpanded = expandList; - } - - private static int MaxCommaQuoteTopDiff = 15; - - public static bool AllowEqual(BinaryOcrBitmap match, BinaryOcrBitmap newBob) - { - if (match.Text != null && (match.Text == "," || match.Text == "'") && - Math.Abs(match.Y - newBob.Y) > MaxCommaQuoteTopDiff) - { - return false; - } - return true; - } - - public int FindExactMatch(BinaryOcrBitmap bob) - { - var bobHash = bob.Hash; - for (int i = 0; i < CompareImages.Count; i++) - { - var b = CompareImages[i]; - if (bobHash == b.Hash && bob.Width == b.Width && bob.Height == b.Height && bob.NumberOfColoredPixels == b.NumberOfColoredPixels) - { - if (AllowEqual(b, bob)) - { - return i; - } - } - } - return -1; - } - - public int FindExactMatchExpanded(BinaryOcrBitmap bob) - { - for (int i = 0; i < CompareImagesExpanded.Count; i++) - { - var b = CompareImagesExpanded[i]; - if (bob.Hash == b.Hash && - bob.Width == b.Width && - bob.Height == b.Height && - bob.NumberOfColoredPixels == b.NumberOfColoredPixels && - bob.ExpandCount == b.ExpandCount && - bob.AreColorsEqual(b)) - { - bool ok = true; - for (int k = 0; k < b.ExpandedList.Count; k++) - { - if (bob.ExpandedList[k].Hash != b.ExpandedList[k].Hash || - !bob.ExpandedList[k].AreColorsEqual(b.ExpandedList[k])) // expanded images - { - ok = false; - } - } - if (ok) - { - return i; - } - } - - } - return -1; - } - - public int Add(BinaryOcrBitmap bob) - { - int index; - if (bob.ExpandCount > 0) - { - if (bob.ExpandedList == null || bob.ExpandCount - 1 != bob.ExpandedList.Count) - { - throw new Exception("BinaryOcrDb.Add: There should be " + (bob.ExpandCount - 1) + " sub image(s)"); - } - - if (bob.ExpandedList[0].Text != null) - { - throw new Exception("BinaryOcrDb.Add: sub image should have null text"); - } - - index = FindExactMatchExpanded(bob); - if (index == -1 || CompareImagesExpanded[index].ExpandCount != bob.ExpandCount) - { - CompareImagesExpanded.Add(bob); - } - else - { - bool allAlike = true; - for (int i = 0; i < bob.ExpandCount - 1; i++) - { - if (bob.ExpandedList[i].Hash != CompareImagesExpanded[index].ExpandedList[i].Hash) - { - allAlike = false; - } - - if (bob.ExpandedList[i].Text != null) - { - throw new Exception("BinaryOcrDb.Add: sub image should have null text"); - } - } - if (!allAlike) - { - CompareImagesExpanded.Add(bob); - } - else - { - throw new Exception("BinaryOcrDb.Add: Expanded image already in db!"); - } - } - } - else - { - index = FindExactMatch(bob); - if (index == -1) - { - CompareImages.Add(bob); - } - else - { - throw new Exception("BinaryOcrDb.Add: Image already in db!"); - } - } - return index; - } - - public static List<string> GetDatabases() - { - return Directory - .GetFiles(Configuration.OcrDirectory.TrimEnd(Path.DirectorySeparatorChar), "*.db") - .Select(Path.GetFileNameWithoutExtension) - .OrderBy(p => p) - .ToList(); - } - } -} +using Nikse.SubtitleEdit.Core; +using System; +using System.Collections.Generic; +using System.IO; +using System.IO.Compression; +using System.Linq; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Logic.Ocr.Binary +{ + public class BinaryOcrDb + { + public string FileName { get; } + public List<BinaryOcrBitmap> CompareImages = new List<BinaryOcrBitmap>(); + public List<BinaryOcrBitmap> CompareImagesExpanded = new List<BinaryOcrBitmap>(); + + public BinaryOcrDb(string fileName) + { + FileName = fileName; + } + + public BinaryOcrDb(string fileName, bool loadCompareImages) + { + FileName = fileName; + if (loadCompareImages) + { + LoadCompareImages(); + } + } + + public void Save() + { + using (Stream gz = new GZipStream(File.OpenWrite(FileName), CompressionMode.Compress)) + { + foreach (var bob in CompareImages) + { + if (bob.ExpandCount > 0) + { + System.Windows.Forms.MessageBox.Show("Ups, expand image in CompareImages!"); + } + + bob.Save(gz); + } + foreach (var bob in CompareImagesExpanded) + { + if (bob.ExpandCount == 0) + { + System.Windows.Forms.MessageBox.Show("Ups, not expanded image in CompareImagesExpanded!"); + } + + bob.Save(gz); + if (bob.ExpandedList.Count != bob.ExpandCount - 1) + { + throw new Exception("BinaryOcrDb.Save: Expanded image should have " + (bob.ExpandCount - 1) + " sub images"); + } + foreach (var expandedBob in bob.ExpandedList) + { + if (expandedBob.Text != null) + { + throw new Exception("BinaryOcrDb.Save: sub image should have null text"); + } + + expandedBob.Save(gz); + } + } + } + } + + public void LoadCompareImages() + { + var list = new List<BinaryOcrBitmap>(); + var expandList = new List<BinaryOcrBitmap>(); + + if (!File.Exists(FileName)) + { + CompareImages = list; + return; + } + + using (Stream gz = new GZipStream(File.OpenRead(FileName), CompressionMode.Decompress)) + { + bool done = false; + while (!done) + { + var bob = new BinaryOcrBitmap(gz); + if (bob.LoadedOk) + { + if (bob.ExpandCount > 0) + { + expandList.Add(bob); + bob.ExpandedList = new List<BinaryOcrBitmap>(); + for (int i = 1; i < bob.ExpandCount; i++) + { + var expandedBob = new BinaryOcrBitmap(gz); + if (expandedBob.LoadedOk) + { + if (expandedBob.Text != null) + { + throw new Exception("BinaryOcrDb.LoadCompareImages: sub image should have null text"); + } + + bob.ExpandedList.Add(expandedBob); + } + else + { + break; + } + } + } + else + { + list.Add(bob); + } + } + else + { + done = true; + } + } + } + CompareImages = list; + CompareImagesExpanded = expandList; + } + + private static int MaxCommaQuoteTopDiff = 15; + + public static bool AllowEqual(BinaryOcrBitmap match, BinaryOcrBitmap newBob) + { + if (match.Text != null && (match.Text == "," || match.Text == "'") && + Math.Abs(match.Y - newBob.Y) > MaxCommaQuoteTopDiff) + { + return false; + } + return true; + } + + public int FindExactMatch(BinaryOcrBitmap bob) + { + var bobHash = bob.Hash; + for (int i = 0; i < CompareImages.Count; i++) + { + var b = CompareImages[i]; + if (bobHash == b.Hash && bob.Width == b.Width && bob.Height == b.Height && bob.NumberOfColoredPixels == b.NumberOfColoredPixels) + { + if (AllowEqual(b, bob)) + { + return i; + } + } + } + return -1; + } + + public int FindExactMatchExpanded(BinaryOcrBitmap bob) + { + for (int i = 0; i < CompareImagesExpanded.Count; i++) + { + var b = CompareImagesExpanded[i]; + if (bob.Hash == b.Hash && + bob.Width == b.Width && + bob.Height == b.Height && + bob.NumberOfColoredPixels == b.NumberOfColoredPixels && + bob.ExpandCount == b.ExpandCount && + bob.AreColorsEqual(b)) + { + bool ok = true; + for (int k = 0; k < b.ExpandedList.Count; k++) + { + if (bob.ExpandedList[k].Hash != b.ExpandedList[k].Hash || + !bob.ExpandedList[k].AreColorsEqual(b.ExpandedList[k])) // expanded images + { + ok = false; + } + } + if (ok) + { + return i; + } + } + + } + return -1; + } + + public int Add(BinaryOcrBitmap bob) + { + int index; + if (bob.ExpandCount > 0) + { + if (bob.ExpandedList == null || bob.ExpandCount - 1 != bob.ExpandedList.Count) + { + throw new Exception("BinaryOcrDb.Add: There should be " + (bob.ExpandCount - 1) + " sub image(s)"); + } + + if (bob.ExpandedList[0].Text != null) + { + throw new Exception("BinaryOcrDb.Add: sub image should have null text"); + } + + index = FindExactMatchExpanded(bob); + if (index == -1 || CompareImagesExpanded[index].ExpandCount != bob.ExpandCount) + { + CompareImagesExpanded.Add(bob); + } + else + { + bool allAlike = true; + for (int i = 0; i < bob.ExpandCount - 1; i++) + { + if (bob.ExpandedList[i].Hash != CompareImagesExpanded[index].ExpandedList[i].Hash) + { + allAlike = false; + } + + if (bob.ExpandedList[i].Text != null) + { + throw new Exception("BinaryOcrDb.Add: sub image should have null text"); + } + } + if (!allAlike) + { + CompareImagesExpanded.Add(bob); + } + else + { + throw new Exception("BinaryOcrDb.Add: Expanded image already in db!"); + } + } + } + else + { + index = FindExactMatch(bob); + if (index == -1) + { + CompareImages.Add(bob); + } + else + { + throw new Exception("BinaryOcrDb.Add: Image already in db!"); + } + } + return index; + } + + public static List<string> GetDatabases() + { + return Directory + .GetFiles(Configuration.OcrDirectory.TrimEnd(Path.DirectorySeparatorChar), "*.db") + .Select(Path.GetFileNameWithoutExtension) + .OrderBy(p => p) + .ToList(); + } + } +} diff --git a/src/Logic/Ocr/MatchesToItalicStringConverter.cs b/src/ui/Logic/Ocr/MatchesToItalicStringConverter.cs similarity index 100% rename from src/Logic/Ocr/MatchesToItalicStringConverter.cs rename to src/ui/Logic/Ocr/MatchesToItalicStringConverter.cs diff --git a/src/Logic/Ocr/ModiLanguage.cs b/src/ui/Logic/Ocr/ModiLanguage.cs similarity index 97% rename from src/Logic/Ocr/ModiLanguage.cs rename to src/ui/Logic/Ocr/ModiLanguage.cs index 44cef0997..f21a35be4 100644 --- a/src/Logic/Ocr/ModiLanguage.cs +++ b/src/ui/Logic/Ocr/ModiLanguage.cs @@ -1,50 +1,50 @@ -using System.Collections.Generic; - -namespace Nikse.SubtitleEdit.Logic.Ocr -{ - public class ModiLanguage - { - public int Id { get; set; } - public string Text { get; set; } - - public override string ToString() - { - return Text; - } - - public const int DefaultLanguageId = 2048; - - public static IEnumerable<ModiLanguage> AllLanguages - { - get - { - var list = new List<ModiLanguage> - { - new ModiLanguage { Id = DefaultLanguageId, Text = "Default" }, - new ModiLanguage { Id = 2052, Text = "Chinese simplified" }, - new ModiLanguage { Id = 1028, Text = "Chinese traditional" }, - new ModiLanguage { Id = 5, Text = "Chech" }, - new ModiLanguage { Id = 6, Text = "Danish" }, - new ModiLanguage { Id = 19, Text = "Dutch" }, - new ModiLanguage { Id = 9, Text = "English" }, - new ModiLanguage { Id = 11, Text = "Finnish" }, - new ModiLanguage { Id = 12, Text = "French" }, - new ModiLanguage { Id = 7, Text = "German" }, - new ModiLanguage { Id = 8, Text = "Greek" }, - new ModiLanguage { Id = 14, Text = "Hungarian" }, - new ModiLanguage { Id = 16, Text = "Italian" }, - new ModiLanguage { Id = 17, Text = "Japanese" }, - new ModiLanguage { Id = 18, Text = "Korean" }, - new ModiLanguage { Id = 20, Text = "Norweigian" }, - new ModiLanguage { Id = 21, Text = "Polish" }, - new ModiLanguage { Id = 22, Text = "Portuguese" }, - new ModiLanguage { Id = 25, Text = "Russian" }, - new ModiLanguage { Id = 10, Text = "Spanish" }, - new ModiLanguage { Id = 29, Text = "Swedish" }, - new ModiLanguage { Id = 31, Text = "Turkish" } - }; - return list; - } - } - } -} +using System.Collections.Generic; + +namespace Nikse.SubtitleEdit.Logic.Ocr +{ + public class ModiLanguage + { + public int Id { get; set; } + public string Text { get; set; } + + public override string ToString() + { + return Text; + } + + public const int DefaultLanguageId = 2048; + + public static IEnumerable<ModiLanguage> AllLanguages + { + get + { + var list = new List<ModiLanguage> + { + new ModiLanguage { Id = DefaultLanguageId, Text = "Default" }, + new ModiLanguage { Id = 2052, Text = "Chinese simplified" }, + new ModiLanguage { Id = 1028, Text = "Chinese traditional" }, + new ModiLanguage { Id = 5, Text = "Chech" }, + new ModiLanguage { Id = 6, Text = "Danish" }, + new ModiLanguage { Id = 19, Text = "Dutch" }, + new ModiLanguage { Id = 9, Text = "English" }, + new ModiLanguage { Id = 11, Text = "Finnish" }, + new ModiLanguage { Id = 12, Text = "French" }, + new ModiLanguage { Id = 7, Text = "German" }, + new ModiLanguage { Id = 8, Text = "Greek" }, + new ModiLanguage { Id = 14, Text = "Hungarian" }, + new ModiLanguage { Id = 16, Text = "Italian" }, + new ModiLanguage { Id = 17, Text = "Japanese" }, + new ModiLanguage { Id = 18, Text = "Korean" }, + new ModiLanguage { Id = 20, Text = "Norweigian" }, + new ModiLanguage { Id = 21, Text = "Polish" }, + new ModiLanguage { Id = 22, Text = "Portuguese" }, + new ModiLanguage { Id = 25, Text = "Russian" }, + new ModiLanguage { Id = 10, Text = "Spanish" }, + new ModiLanguage { Id = 29, Text = "Swedish" }, + new ModiLanguage { Id = 31, Text = "Turkish" } + }; + return list; + } + } + } +} diff --git a/src/Logic/Ocr/NOcrChar.cs b/src/ui/Logic/Ocr/NOcrChar.cs similarity index 97% rename from src/Logic/Ocr/NOcrChar.cs rename to src/ui/Logic/Ocr/NOcrChar.cs index e6f614363..1122a08a7 100644 --- a/src/Logic/Ocr/NOcrChar.cs +++ b/src/ui/Logic/Ocr/NOcrChar.cs @@ -1,318 +1,318 @@ -using System.Collections.Generic; -using System.Drawing; -using System.IO; - -namespace Nikse.SubtitleEdit.Logic.Ocr -{ - public class NOcrChar - { - public string Text { get; set; } - public int Width { get; set; } - public int Height { get; set; } - public int MarginTop { get; set; } - public bool Italic { get; set; } - public List<NOcrPoint> LinesForeground { get; } - public List<NOcrPoint> LinesBackground { get; } - public int ExpandCount { get; set; } - public bool LoadedOk { get; } - - public double WidthPercent => Height * 100.0 / Width; - - public NOcrChar() - { - LinesForeground = new List<NOcrPoint>(); - LinesBackground = new List<NOcrPoint>(); - Text = string.Empty; - } - - public NOcrChar(NOcrChar old) - { - LinesForeground = new List<NOcrPoint>(); - LinesBackground = new List<NOcrPoint>(); - Text = old.Text; - Width = old.Width; - Height = old.Height; - MarginTop = old.MarginTop; - Italic = old.Italic; - foreach (var p in old.LinesForeground) - { - LinesForeground.Add(new NOcrPoint(new Point(p.Start.X, p.Start.Y), new Point(p.End.X, p.End.Y))); - } - - foreach (var p in old.LinesBackground) - { - LinesBackground.Add(new NOcrPoint(new Point(p.Start.X, p.Start.Y), new Point(p.End.X, p.End.Y))); - } - } - - public NOcrChar(string text) - : this() - { - Text = text; - } - - public override string ToString() - { - return Text; - } - - public bool IsSensitive => Text == "O" || Text == "o" || Text == "0" || Text == "'" || Text == "-" || Text == ":" || Text == "\""; - - public NOcrChar(Stream stream, bool isVersion2) - { - try - { - if (isVersion2) - { - var buffer = new byte[4]; - int read = stream.Read(buffer, 0, buffer.Length); - if (read < buffer.Length) - { - LoadedOk = false; - return; - } - - var isShort = (buffer[0] & 0b0001_0000) > 0; - Italic = (buffer[0] & 0b0010_0000) > 0; - - if (isShort) - { - ExpandCount = buffer[0] & 0b0000_1111; - Width = buffer[1]; - Height = buffer[2]; - MarginTop = buffer[3]; - } - else - { - ExpandCount = stream.ReadByte(); - Width = stream.ReadByte() << 8 | stream.ReadByte(); - Height = stream.ReadByte() << 8 | stream.ReadByte(); - MarginTop = stream.ReadByte() << 8 | stream.ReadByte(); - } - - int textLen = stream.ReadByte(); - if (textLen > 0) - { - buffer = new byte[textLen]; - stream.Read(buffer, 0, buffer.Length); - Text = System.Text.Encoding.UTF8.GetString(buffer); - } - - if (isShort) - { - LinesForeground = ReadPointsBytes(stream); - LinesBackground = ReadPointsBytes(stream); - } - else - { - LinesForeground = ReadPoints(stream); - LinesBackground = ReadPoints(stream); - } - - LoadedOk = true; - } - else - { - var buffer = new byte[9]; - int read = stream.Read(buffer, 0, buffer.Length); - if (read < buffer.Length) - { - LoadedOk = false; - return; - } - - Width = buffer[0] << 8 | buffer[1]; - Height = buffer[2] << 8 | buffer[3]; - - MarginTop = buffer[4] << 8 | buffer[5]; - - Italic = buffer[6] != 0; - - ExpandCount = buffer[7]; - - int textLen = buffer[8]; - if (textLen > 0) - { - buffer = new byte[textLen]; - stream.Read(buffer, 0, buffer.Length); - Text = System.Text.Encoding.UTF8.GetString(buffer); - } - LinesForeground = ReadPoints(stream); - LinesBackground = ReadPoints(stream); - - LoadedOk = true; - } - } - catch - { - LoadedOk = false; - } - } - - private static List<NOcrPoint> ReadPoints(Stream stream) - { - int length = stream.ReadByte() << 8 | stream.ReadByte(); - var list = new List<NOcrPoint>(length); - var buffer = new byte[8]; - for (int i = 0; i < length; i++) - { - stream.Read(buffer, 0, buffer.Length); - var point = new NOcrPoint - { - Start = new Point(buffer[0] << 8 | buffer[1], buffer[2] << 8 | buffer[3]), - End = new Point(buffer[4] << 8 | buffer[5], buffer[6] << 8 | buffer[7]) - }; - list.Add(point); - } - return list; - } - - private static List<NOcrPoint> ReadPointsBytes(Stream stream) - { - int length = stream.ReadByte(); - var list = new List<NOcrPoint>(length); - var buffer = new byte[4]; - for (int i = 0; i < length; i++) - { - stream.Read(buffer, 0, buffer.Length); - var point = new NOcrPoint - { - Start = new Point(buffer[0], buffer[1]), - End = new Point(buffer[2], buffer[3]) - }; - list.Add(point); - } - return list; - } - - internal void Save(Stream stream) - { - if (IsAllByteValues()) - { - SaveOneBytes(stream); - } - else - { - SaveTwoBytes(stream); - } - } - - private bool IsAllByteValues() - { - return Width <= byte.MaxValue && Height <= byte.MaxValue && ExpandCount < 16 && - LinesBackground.Count <= byte.MaxValue && LinesForeground.Count <= byte.MaxValue && - IsAllPointByteValues(LinesForeground) && IsAllPointByteValues(LinesForeground); - } - - private static bool IsAllPointByteValues(List<NOcrPoint> lines) - { - for (var index = 0; index < lines.Count; index++) - { - var point = lines[index]; - if (point.Start.X > byte.MaxValue || point.Start.Y > byte.MaxValue || - point.End.X > byte.MaxValue || point.End.Y > byte.MaxValue) - { - return false; - } - } - - return true; - } - - private void SaveOneBytes(Stream stream) - { - var flags = 0b0001_0000; - - if (Italic) - { - flags |= 0b0010_0000; - } - - if (ExpandCount > 0) - { - flags |= (byte)ExpandCount; - } - - stream.WriteByte((byte)flags); - - stream.WriteByte((byte)Width); - stream.WriteByte((byte)Height); - stream.WriteByte((byte)MarginTop); - - if (Text == null) - { - stream.WriteByte(0); - } - else - { - var textBuffer = System.Text.Encoding.UTF8.GetBytes(Text); - stream.WriteByte((byte)textBuffer.Length); - stream.Write(textBuffer, 0, textBuffer.Length); - } - WritePointsAsOneByte(stream, LinesForeground); - WritePointsAsOneByte(stream, LinesBackground); - } - - private void SaveTwoBytes(Stream stream) - { - var flags = 0b0000_0000; - - if (Italic) - { - flags |= 0b0010_0000; - } - - stream.WriteByte((byte)flags); - stream.WriteByte((byte)ExpandCount); - - WriteInt16(stream, (ushort)Width); - WriteInt16(stream, (ushort)Height); - WriteInt16(stream, (ushort)MarginTop); - - if (Text == null) - { - stream.WriteByte(0); - } - else - { - var textBuffer = System.Text.Encoding.UTF8.GetBytes(Text); - stream.WriteByte((byte)textBuffer.Length); - stream.Write(textBuffer, 0, textBuffer.Length); - } - WritePoints(stream, LinesForeground); - WritePoints(stream, LinesBackground); - } - - private static void WritePointsAsOneByte(Stream stream, List<NOcrPoint> points) - { - stream.WriteByte((byte)points.Count); - foreach (var nOcrPoint in points) - { - stream.WriteByte((byte)nOcrPoint.Start.X); - stream.WriteByte((byte)nOcrPoint.Start.Y); - stream.WriteByte((byte)nOcrPoint.End.X); - stream.WriteByte((byte)nOcrPoint.End.Y); - } - } - - private static void WritePoints(Stream stream, List<NOcrPoint> points) - { - WriteInt16(stream, (ushort)points.Count); - foreach (var nOcrPoint in points) - { - WriteInt16(stream, (ushort)nOcrPoint.Start.X); - WriteInt16(stream, (ushort)nOcrPoint.Start.Y); - WriteInt16(stream, (ushort)nOcrPoint.End.X); - WriteInt16(stream, (ushort)nOcrPoint.End.Y); - } - } - - private static void WriteInt16(Stream stream, ushort val) - { - var buffer = new byte[2]; - buffer[0] = (byte)((val & 0xFF00) >> 8); - buffer[1] = (byte)(val & 0x00FF); - stream.Write(buffer, 0, buffer.Length); - } - } -} +using System.Collections.Generic; +using System.Drawing; +using System.IO; + +namespace Nikse.SubtitleEdit.Logic.Ocr +{ + public class NOcrChar + { + public string Text { get; set; } + public int Width { get; set; } + public int Height { get; set; } + public int MarginTop { get; set; } + public bool Italic { get; set; } + public List<NOcrPoint> LinesForeground { get; } + public List<NOcrPoint> LinesBackground { get; } + public int ExpandCount { get; set; } + public bool LoadedOk { get; } + + public double WidthPercent => Height * 100.0 / Width; + + public NOcrChar() + { + LinesForeground = new List<NOcrPoint>(); + LinesBackground = new List<NOcrPoint>(); + Text = string.Empty; + } + + public NOcrChar(NOcrChar old) + { + LinesForeground = new List<NOcrPoint>(); + LinesBackground = new List<NOcrPoint>(); + Text = old.Text; + Width = old.Width; + Height = old.Height; + MarginTop = old.MarginTop; + Italic = old.Italic; + foreach (var p in old.LinesForeground) + { + LinesForeground.Add(new NOcrPoint(new Point(p.Start.X, p.Start.Y), new Point(p.End.X, p.End.Y))); + } + + foreach (var p in old.LinesBackground) + { + LinesBackground.Add(new NOcrPoint(new Point(p.Start.X, p.Start.Y), new Point(p.End.X, p.End.Y))); + } + } + + public NOcrChar(string text) + : this() + { + Text = text; + } + + public override string ToString() + { + return Text; + } + + public bool IsSensitive => Text == "O" || Text == "o" || Text == "0" || Text == "'" || Text == "-" || Text == ":" || Text == "\""; + + public NOcrChar(Stream stream, bool isVersion2) + { + try + { + if (isVersion2) + { + var buffer = new byte[4]; + int read = stream.Read(buffer, 0, buffer.Length); + if (read < buffer.Length) + { + LoadedOk = false; + return; + } + + var isShort = (buffer[0] & 0b0001_0000) > 0; + Italic = (buffer[0] & 0b0010_0000) > 0; + + if (isShort) + { + ExpandCount = buffer[0] & 0b0000_1111; + Width = buffer[1]; + Height = buffer[2]; + MarginTop = buffer[3]; + } + else + { + ExpandCount = stream.ReadByte(); + Width = stream.ReadByte() << 8 | stream.ReadByte(); + Height = stream.ReadByte() << 8 | stream.ReadByte(); + MarginTop = stream.ReadByte() << 8 | stream.ReadByte(); + } + + int textLen = stream.ReadByte(); + if (textLen > 0) + { + buffer = new byte[textLen]; + stream.Read(buffer, 0, buffer.Length); + Text = System.Text.Encoding.UTF8.GetString(buffer); + } + + if (isShort) + { + LinesForeground = ReadPointsBytes(stream); + LinesBackground = ReadPointsBytes(stream); + } + else + { + LinesForeground = ReadPoints(stream); + LinesBackground = ReadPoints(stream); + } + + LoadedOk = true; + } + else + { + var buffer = new byte[9]; + int read = stream.Read(buffer, 0, buffer.Length); + if (read < buffer.Length) + { + LoadedOk = false; + return; + } + + Width = buffer[0] << 8 | buffer[1]; + Height = buffer[2] << 8 | buffer[3]; + + MarginTop = buffer[4] << 8 | buffer[5]; + + Italic = buffer[6] != 0; + + ExpandCount = buffer[7]; + + int textLen = buffer[8]; + if (textLen > 0) + { + buffer = new byte[textLen]; + stream.Read(buffer, 0, buffer.Length); + Text = System.Text.Encoding.UTF8.GetString(buffer); + } + LinesForeground = ReadPoints(stream); + LinesBackground = ReadPoints(stream); + + LoadedOk = true; + } + } + catch + { + LoadedOk = false; + } + } + + private static List<NOcrPoint> ReadPoints(Stream stream) + { + int length = stream.ReadByte() << 8 | stream.ReadByte(); + var list = new List<NOcrPoint>(length); + var buffer = new byte[8]; + for (int i = 0; i < length; i++) + { + stream.Read(buffer, 0, buffer.Length); + var point = new NOcrPoint + { + Start = new Point(buffer[0] << 8 | buffer[1], buffer[2] << 8 | buffer[3]), + End = new Point(buffer[4] << 8 | buffer[5], buffer[6] << 8 | buffer[7]) + }; + list.Add(point); + } + return list; + } + + private static List<NOcrPoint> ReadPointsBytes(Stream stream) + { + int length = stream.ReadByte(); + var list = new List<NOcrPoint>(length); + var buffer = new byte[4]; + for (int i = 0; i < length; i++) + { + stream.Read(buffer, 0, buffer.Length); + var point = new NOcrPoint + { + Start = new Point(buffer[0], buffer[1]), + End = new Point(buffer[2], buffer[3]) + }; + list.Add(point); + } + return list; + } + + internal void Save(Stream stream) + { + if (IsAllByteValues()) + { + SaveOneBytes(stream); + } + else + { + SaveTwoBytes(stream); + } + } + + private bool IsAllByteValues() + { + return Width <= byte.MaxValue && Height <= byte.MaxValue && ExpandCount < 16 && + LinesBackground.Count <= byte.MaxValue && LinesForeground.Count <= byte.MaxValue && + IsAllPointByteValues(LinesForeground) && IsAllPointByteValues(LinesForeground); + } + + private static bool IsAllPointByteValues(List<NOcrPoint> lines) + { + for (var index = 0; index < lines.Count; index++) + { + var point = lines[index]; + if (point.Start.X > byte.MaxValue || point.Start.Y > byte.MaxValue || + point.End.X > byte.MaxValue || point.End.Y > byte.MaxValue) + { + return false; + } + } + + return true; + } + + private void SaveOneBytes(Stream stream) + { + var flags = 0b0001_0000; + + if (Italic) + { + flags |= 0b0010_0000; + } + + if (ExpandCount > 0) + { + flags |= (byte)ExpandCount; + } + + stream.WriteByte((byte)flags); + + stream.WriteByte((byte)Width); + stream.WriteByte((byte)Height); + stream.WriteByte((byte)MarginTop); + + if (Text == null) + { + stream.WriteByte(0); + } + else + { + var textBuffer = System.Text.Encoding.UTF8.GetBytes(Text); + stream.WriteByte((byte)textBuffer.Length); + stream.Write(textBuffer, 0, textBuffer.Length); + } + WritePointsAsOneByte(stream, LinesForeground); + WritePointsAsOneByte(stream, LinesBackground); + } + + private void SaveTwoBytes(Stream stream) + { + var flags = 0b0000_0000; + + if (Italic) + { + flags |= 0b0010_0000; + } + + stream.WriteByte((byte)flags); + stream.WriteByte((byte)ExpandCount); + + WriteInt16(stream, (ushort)Width); + WriteInt16(stream, (ushort)Height); + WriteInt16(stream, (ushort)MarginTop); + + if (Text == null) + { + stream.WriteByte(0); + } + else + { + var textBuffer = System.Text.Encoding.UTF8.GetBytes(Text); + stream.WriteByte((byte)textBuffer.Length); + stream.Write(textBuffer, 0, textBuffer.Length); + } + WritePoints(stream, LinesForeground); + WritePoints(stream, LinesBackground); + } + + private static void WritePointsAsOneByte(Stream stream, List<NOcrPoint> points) + { + stream.WriteByte((byte)points.Count); + foreach (var nOcrPoint in points) + { + stream.WriteByte((byte)nOcrPoint.Start.X); + stream.WriteByte((byte)nOcrPoint.Start.Y); + stream.WriteByte((byte)nOcrPoint.End.X); + stream.WriteByte((byte)nOcrPoint.End.Y); + } + } + + private static void WritePoints(Stream stream, List<NOcrPoint> points) + { + WriteInt16(stream, (ushort)points.Count); + foreach (var nOcrPoint in points) + { + WriteInt16(stream, (ushort)nOcrPoint.Start.X); + WriteInt16(stream, (ushort)nOcrPoint.Start.Y); + WriteInt16(stream, (ushort)nOcrPoint.End.X); + WriteInt16(stream, (ushort)nOcrPoint.End.Y); + } + } + + private static void WriteInt16(Stream stream, ushort val) + { + var buffer = new byte[2]; + buffer[0] = (byte)((val & 0xFF00) >> 8); + buffer[1] = (byte)(val & 0x00FF); + stream.Write(buffer, 0, buffer.Length); + } + } +} diff --git a/src/Logic/Ocr/NOcrDb.cs b/src/ui/Logic/Ocr/NOcrDb.cs similarity index 100% rename from src/Logic/Ocr/NOcrDb.cs rename to src/ui/Logic/Ocr/NOcrDb.cs diff --git a/src/Logic/Ocr/NOcrPoint.cs b/src/ui/Logic/Ocr/NOcrPoint.cs similarity index 96% rename from src/Logic/Ocr/NOcrPoint.cs rename to src/ui/Logic/Ocr/NOcrPoint.cs index 178116f52..4c60fa63c 100644 --- a/src/Logic/Ocr/NOcrPoint.cs +++ b/src/ui/Logic/Ocr/NOcrPoint.cs @@ -1,110 +1,110 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Globalization; - -namespace Nikse.SubtitleEdit.Logic.Ocr -{ - public class NOcrPoint - { - public Point Start { get; set; } - public Point End { get; set; } - - public NOcrPoint() - { - Start = new Point(); - End = new Point(); - } - - public NOcrPoint(Point start, Point end) - { - Start = new Point(start.X, start.Y); - End = new Point(end.X, end.Y); - } - - public static PointF PointPixelsToPercent(Point p, int pixelWidth, int pixelHeight) - { - return new PointF((float)(p.X * 100.0 / pixelWidth), (float)(p.Y * 100.0 / pixelHeight)); - } - - public static Point PointPercentToPixels(PointF p, int pixelWidth, int pixelHeight) - { - return new Point((int)Math.Round(p.X / 100.0 * pixelWidth), (int)Math.Round(p.Y / 100.0 * pixelHeight)); - } - - public override string ToString() - { - return string.Format(CultureInfo.InvariantCulture, "{0},{1} -> {2},{3} ", Start.X, Start.Y, End.X, End.Y); - } - - public PointF GetStartPercent(int width, int height) - { - return PointPixelsToPercent(Start, width, height); - } - - public PointF GetEnd(int width, int height) - { - return PointPixelsToPercent(End, width, height); - } - - public List<Point> GetPoints() - { - return GetPoints(Start, End); - } - - public List<Point> ScaledGetPoints(NOcrChar nOcrChar, int width, int height) - { - return GetPoints(GetScaledStart(nOcrChar, width, height), GetScaledEnd(nOcrChar, width, height)); - } - - public static List<Point> GetPoints(Point start, Point end) - { - var list = new List<Point>(); - int x1 = start.X; - int x2 = end.X; - int y1 = start.Y; - int y2 = end.Y; - if (Math.Abs(start.X - end.X) > Math.Abs(start.Y - end.Y)) - { - if (x1 > x2) - { - x2 = start.X; - x1 = end.X; - y2 = start.Y; - y1 = end.Y; - } - double factor = (double)(y2 - y1) / (x2 - x1); - for (int i = x1; i <= x2; i++) - { - list.Add(new Point(i, (int)Math.Round(y1 + factor * (i - x1)))); - } - } - else - { - if (y1 > y2) - { - x2 = start.X; - x1 = end.X; - y2 = start.Y; - y1 = end.Y; - } - double factor = (double)(x2 - x1) / (y2 - y1); - for (int i = y1; i <= y2; i++) - { - list.Add(new Point((int)Math.Round(x1 + factor * (i - y1)), i)); - } - } - return list; - } - - internal Point GetScaledStart(NOcrChar ocrChar, int width, int height) - { - return new Point((int)Math.Round(Start.X * 100.0 / ocrChar.Width * width / 100.0), (int)Math.Round(Start.Y * 100.0 / ocrChar.Height * height / 100.0)); - } - - internal Point GetScaledEnd(NOcrChar ocrChar, int width, int height) - { - return new Point((int)Math.Round(End.X * 100.0 / ocrChar.Width * width / 100.0), (int)Math.Round(End.Y * 100.0 / ocrChar.Height * height / 100.0)); - } - } -} +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Globalization; + +namespace Nikse.SubtitleEdit.Logic.Ocr +{ + public class NOcrPoint + { + public Point Start { get; set; } + public Point End { get; set; } + + public NOcrPoint() + { + Start = new Point(); + End = new Point(); + } + + public NOcrPoint(Point start, Point end) + { + Start = new Point(start.X, start.Y); + End = new Point(end.X, end.Y); + } + + public static PointF PointPixelsToPercent(Point p, int pixelWidth, int pixelHeight) + { + return new PointF((float)(p.X * 100.0 / pixelWidth), (float)(p.Y * 100.0 / pixelHeight)); + } + + public static Point PointPercentToPixels(PointF p, int pixelWidth, int pixelHeight) + { + return new Point((int)Math.Round(p.X / 100.0 * pixelWidth), (int)Math.Round(p.Y / 100.0 * pixelHeight)); + } + + public override string ToString() + { + return string.Format(CultureInfo.InvariantCulture, "{0},{1} -> {2},{3} ", Start.X, Start.Y, End.X, End.Y); + } + + public PointF GetStartPercent(int width, int height) + { + return PointPixelsToPercent(Start, width, height); + } + + public PointF GetEnd(int width, int height) + { + return PointPixelsToPercent(End, width, height); + } + + public List<Point> GetPoints() + { + return GetPoints(Start, End); + } + + public List<Point> ScaledGetPoints(NOcrChar nOcrChar, int width, int height) + { + return GetPoints(GetScaledStart(nOcrChar, width, height), GetScaledEnd(nOcrChar, width, height)); + } + + public static List<Point> GetPoints(Point start, Point end) + { + var list = new List<Point>(); + int x1 = start.X; + int x2 = end.X; + int y1 = start.Y; + int y2 = end.Y; + if (Math.Abs(start.X - end.X) > Math.Abs(start.Y - end.Y)) + { + if (x1 > x2) + { + x2 = start.X; + x1 = end.X; + y2 = start.Y; + y1 = end.Y; + } + double factor = (double)(y2 - y1) / (x2 - x1); + for (int i = x1; i <= x2; i++) + { + list.Add(new Point(i, (int)Math.Round(y1 + factor * (i - x1)))); + } + } + else + { + if (y1 > y2) + { + x2 = start.X; + x1 = end.X; + y2 = start.Y; + y1 = end.Y; + } + double factor = (double)(x2 - x1) / (y2 - y1); + for (int i = y1; i <= y2; i++) + { + list.Add(new Point((int)Math.Round(x1 + factor * (i - y1)), i)); + } + } + return list; + } + + internal Point GetScaledStart(NOcrChar ocrChar, int width, int height) + { + return new Point((int)Math.Round(Start.X * 100.0 / ocrChar.Width * width / 100.0), (int)Math.Round(Start.Y * 100.0 / ocrChar.Height * height / 100.0)); + } + + internal Point GetScaledEnd(NOcrChar ocrChar, int width, int height) + { + return new Point((int)Math.Round(End.X * 100.0 / ocrChar.Width * width / 100.0), (int)Math.Round(End.Y * 100.0 / ocrChar.Height * height / 100.0)); + } + } +} diff --git a/src/Logic/Ocr/OcrAlphabet.cs b/src/ui/Logic/Ocr/OcrAlphabet.cs similarity index 96% rename from src/Logic/Ocr/OcrAlphabet.cs rename to src/ui/Logic/Ocr/OcrAlphabet.cs index 63711a0d3..e288fda54 100644 --- a/src/Logic/Ocr/OcrAlphabet.cs +++ b/src/ui/Logic/Ocr/OcrAlphabet.cs @@ -1,51 +1,51 @@ -using System.Collections.Generic; - -namespace Nikse.SubtitleEdit.Logic.Ocr -{ - public class OcrAlphabet - { - public OcrAlphabet() - { - OcrCharacters = new List<OcrCharacter>(); - } - - public List<OcrCharacter> OcrCharacters { get; } - - public int CalculateMaximumSize() - { - int max = 0; - foreach (OcrCharacter c in OcrCharacters) - { - foreach (OcrImage img in c.OcrImages) - { - int size = img.Bmp.Width * img.Bmp.Height; - if (size > max) - { - max = size; - } - } - } - return max; - } - - public OcrCharacter GetOcrCharacter(string text, bool addIfNotExists) - { - foreach (var ocrCharacter in OcrCharacters) - { - if (ocrCharacter.Text == text) - { - return ocrCharacter; - } - } - - if (addIfNotExists) - { - var ch = new OcrCharacter(text); - OcrCharacters.Add(ch); - return ch; - } - return null; - } - - } -} +using System.Collections.Generic; + +namespace Nikse.SubtitleEdit.Logic.Ocr +{ + public class OcrAlphabet + { + public OcrAlphabet() + { + OcrCharacters = new List<OcrCharacter>(); + } + + public List<OcrCharacter> OcrCharacters { get; } + + public int CalculateMaximumSize() + { + int max = 0; + foreach (OcrCharacter c in OcrCharacters) + { + foreach (OcrImage img in c.OcrImages) + { + int size = img.Bmp.Width * img.Bmp.Height; + if (size > max) + { + max = size; + } + } + } + return max; + } + + public OcrCharacter GetOcrCharacter(string text, bool addIfNotExists) + { + foreach (var ocrCharacter in OcrCharacters) + { + if (ocrCharacter.Text == text) + { + return ocrCharacter; + } + } + + if (addIfNotExists) + { + var ch = new OcrCharacter(text); + OcrCharacters.Add(ch); + return ch; + } + return null; + } + + } +} diff --git a/src/Logic/Ocr/OcrCharacter.cs b/src/ui/Logic/Ocr/OcrCharacter.cs similarity index 95% rename from src/Logic/Ocr/OcrCharacter.cs rename to src/ui/Logic/Ocr/OcrCharacter.cs index 4b08d91f1..d51f6bde9 100644 --- a/src/Logic/Ocr/OcrCharacter.cs +++ b/src/ui/Logic/Ocr/OcrCharacter.cs @@ -1,16 +1,16 @@ -using System.Collections.Generic; - -namespace Nikse.SubtitleEdit.Logic.Ocr -{ - public class OcrCharacter - { - public string Text { get; } - public List<OcrImage> OcrImages { get; set; } - - public OcrCharacter(string text) - { - Text = text; - OcrImages = new List<OcrImage>(); - } - } -} +using System.Collections.Generic; + +namespace Nikse.SubtitleEdit.Logic.Ocr +{ + public class OcrCharacter + { + public string Text { get; } + public List<OcrImage> OcrImages { get; set; } + + public OcrCharacter(string text) + { + Text = text; + OcrImages = new List<OcrImage>(); + } + } +} diff --git a/src/Logic/Ocr/OcrFixEngine.cs b/src/ui/Logic/Ocr/OcrFixEngine.cs similarity index 97% rename from src/Logic/Ocr/OcrFixEngine.cs rename to src/ui/Logic/Ocr/OcrFixEngine.cs index 103e1692b..019864de9 100644 --- a/src/Logic/Ocr/OcrFixEngine.cs +++ b/src/ui/Logic/Ocr/OcrFixEngine.cs @@ -1,2098 +1,2098 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.Dictionaries; -using Nikse.SubtitleEdit.Core.Forms.FixCommonErrors; -using Nikse.SubtitleEdit.Core.Interfaces; -using Nikse.SubtitleEdit.Core.SpellCheck; -using Nikse.SubtitleEdit.Forms; -using Nikse.SubtitleEdit.Forms.Ocr; -using Nikse.SubtitleEdit.Logic.SpellCheck; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using System.Windows.Forms; -using System.Xml; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Logic.Ocr -{ - public class OcrFixEngine : IDisposable, IDoSpell - { - public abstract class LogItem - { - public int Line { get; set; } - public string Text { get; } - - protected LogItem(int line, string text) - { - Line = line; - Text = text.Trim(); - } - - public override string ToString() - { - return $"#{Line}: {Text}"; - } - } - - private class AutoGuess : LogItem - { - public AutoGuess(int index, string word, string guess, string line) - : base(index + 1, string.Format(Configuration.Settings.Language.VobSubOcr.UnknownWordToGuessInLine, word, guess, line.Replace(Environment.NewLine, " "))) - { - } - } - - private class UnknownWord : LogItem - { - public UnknownWord(int index, string word) - : base(index + 1, word) - { - } - } - - public enum AutoGuessLevel - { - None, - Cautious, - Aggressive - } - - private string _userWordListXmlFileName; - private string _fiveLetterWordListLanguageName; - - private readonly OcrFixReplaceList _ocrFixReplaceList; - private NameList _nameListObj; - private HashSet<string> _nameList = new HashSet<string>(); - private HashSet<string> _nameListUppercase = new HashSet<string>(); - private HashSet<string> _nameListWithApostrophe = new HashSet<string>(); - private HashSet<string> _nameMultiWordList = new HashSet<string>(); // case sensitive phrases - private List<string> _nameMultiWordListAndWordsWithPeriods; - private HashSet<string> _abbreviationList; - private HashSet<string> _userWordList = new HashSet<string>(); - private HashSet<string> _wordSkipList = new HashSet<string>(); - private readonly HashSet<string> _wordSpellOkList = new HashSet<string>(); - private Hunspell _hunspell; - private Dictionary<string, string> _changeAllDictionary; - private SpellCheckWordLists _spellCheckWordLists; - private OcrSpellCheck _spellCheck; - private readonly Form _parentForm; - private string _spellCheckDictionaryName; - private readonly string _threeLetterIsoLanguageName; - - private static readonly Regex RegexAloneIasL = new Regex(@"\bl\b", RegexOptions.Compiled); - private static readonly Regex RegexLowercaseL = new Regex("[A-ZÆØÅÄÖÉÈÀÙÂÊÎÔÛËÏ]l[A-ZÆØÅÄÖÉÈÀÙÂÊÎÔÛËÏ]", RegexOptions.Compiled); - private static readonly Regex RegexUppercaseI = new Regex("[a-zæøåöääöéèàùâêîôûëï]I.", RegexOptions.Compiled); - private static readonly Regex RegexNumber1 = new Regex(@"(?<=\d) 1(?!/\d)", RegexOptions.Compiled); - - public bool Abort { get; set; } - public OcrSpellCheck.Action LastAction { get; set; } = OcrSpellCheck.Action.Abort; - public bool IsBinaryImageCompareOrNOcr { get; set; } - public List<LogItem> AutoGuessesUsed { get; set; } - public List<LogItem> UnknownWordsFound { get; set; } - public bool IsDictionaryLoaded { get; private set; } - - private readonly HashSet<char> _expectedChars = new HashSet<char> { ' ', '¡', '¿', ',', '.', '!', '?', ':', ';', '(', ')', '[', ']', '{', '}', '+', '-', '£', '\\', '"', '”', '„', '“', '«', '»', '#', '&', '%', '\r', '\n', '؟' }; // removed $ - private readonly HashSet<char> _expectedCharsNoComma = new HashSet<char> { ' ', '¡', '¿', '.', '!', '?', ':', ';', '(', ')', '[', ']', '{', '}', '+', '-', '£', '\\', '"', '”', '„', '“', '«', '»', '#', '&', '%', '\r', '\n', '؟' }; // removed $ + comma - - /// <summary> - /// Advanced OCR fixing via replace/spelling dictionaries + some hardcoded rules - /// </summary> - /// <param name="threeLetterIsoLanguageName">E.g. eng for English</param> - /// <param name="hunspellName">Name of hunspell dictionary</param> - /// <param name="parentForm">Used for centering/show spell check dialog</param> - /// <param name="isBinaryImageCompare">Calling from OCR via "Image compare"</param> - public OcrFixEngine(string threeLetterIsoLanguageName, string hunspellName, Form parentForm, bool isBinaryImageCompareOrNOcr = false) - { - if (string.IsNullOrEmpty(threeLetterIsoLanguageName)) - { - if (hunspellName != null && hunspellName.Length >= 2) - { - threeLetterIsoLanguageName = Iso639Dash2LanguageCode.GetThreeLetterCodeFromTwoLetterCode(hunspellName.Substring(0, 2)); - } - else - { - threeLetterIsoLanguageName = string.Empty; - } - } - - IsBinaryImageCompareOrNOcr = isBinaryImageCompareOrNOcr; - if (threeLetterIsoLanguageName == "per") - { - threeLetterIsoLanguageName = "fas"; - } - - _threeLetterIsoLanguageName = threeLetterIsoLanguageName; - _parentForm = parentForm; - - if (parentForm.GetType() != typeof(FixCommonErrors)) - { - _spellCheck = new OcrSpellCheck(_parentForm) { StartPosition = FormStartPosition.Manual, IsBinaryImageCompareOrNOcr = isBinaryImageCompareOrNOcr }; - _spellCheck.Location = new Point(parentForm.Left + (parentForm.Width / 2 - _spellCheck.Width / 2), - parentForm.Top + (parentForm.Height / 2 - _spellCheck.Height / 2)); - } - - _ocrFixReplaceList = OcrFixReplaceList.FromLanguageId(threeLetterIsoLanguageName); - if (!string.IsNullOrEmpty(threeLetterIsoLanguageName) || !string.IsNullOrEmpty(hunspellName)) - { - LoadSpellingDictionaries(threeLetterIsoLanguageName, hunspellName); // Hunspell etc. - } - - AutoGuessesUsed = new List<LogItem>(); - UnknownWordsFound = new List<LogItem>(); - } - - private void LoadSpellingDictionaries(string threeLetterIsoLanguageName, string hunspellName) - { - string dictionaryFolder = Utilities.DictionaryFolder; - if (!Directory.Exists(dictionaryFolder)) - { - return; - } - - if (!string.IsNullOrEmpty(hunspellName)) - { - var directDicFile = Path.Combine(dictionaryFolder, hunspellName + ".dic"); - if (File.Exists(directDicFile)) - { - LoadSpellingDictionariesViaDictionaryFileName(threeLetterIsoLanguageName, directDicFile, true); - return; - } - } - - if (!string.IsNullOrEmpty(hunspellName) && threeLetterIsoLanguageName == "eng" && hunspellName.Equals("en_gb", StringComparison.OrdinalIgnoreCase) && File.Exists(Path.Combine(dictionaryFolder, "en_GB.dic"))) - { - LoadSpellingDictionariesViaDictionaryFileName("eng", "en_GB.dic", true); - return; - } - if (!string.IsNullOrEmpty(hunspellName) && threeLetterIsoLanguageName == "eng" && hunspellName.Equals("en-gb", StringComparison.OrdinalIgnoreCase) && File.Exists(Path.Combine(dictionaryFolder, "en-GB.dic"))) - { - LoadSpellingDictionariesViaDictionaryFileName("eng", "en-GB.dic", true); - return; - } - if (!string.IsNullOrEmpty(hunspellName) && threeLetterIsoLanguageName == "eng" && hunspellName.Equals("en_ca", StringComparison.OrdinalIgnoreCase) && File.Exists(Path.Combine(dictionaryFolder, "en_CA.dic"))) - { - LoadSpellingDictionariesViaDictionaryFileName("eng", "en_CA.dic", true); - return; - } - if (!string.IsNullOrEmpty(hunspellName) && threeLetterIsoLanguageName == "eng" && hunspellName.Equals("en_au", StringComparison.OrdinalIgnoreCase) && File.Exists(Path.Combine(dictionaryFolder, "en_AU.dic"))) - { - LoadSpellingDictionariesViaDictionaryFileName("eng", "en_AU.dic", true); - return; - } - if (!string.IsNullOrEmpty(hunspellName) && threeLetterIsoLanguageName == "eng" && hunspellName.Equals("en_za", StringComparison.OrdinalIgnoreCase) && File.Exists(Path.Combine(dictionaryFolder, "en_ZA.dic"))) - { - LoadSpellingDictionariesViaDictionaryFileName("eng", "en_ZA.dic", true); - return; - } - if (threeLetterIsoLanguageName == "eng" && File.Exists(Path.Combine(dictionaryFolder, "en_US.dic"))) - { - LoadSpellingDictionariesViaDictionaryFileName("eng", "en_US.dic", true); - return; - } - - foreach (var culture in Iso639Dash2LanguageCode.List) - { - if (culture.ThreeLetterCode == threeLetterIsoLanguageName) - { - string dictionaryFileName = null; - if (!string.IsNullOrEmpty(hunspellName) && hunspellName.StartsWith(culture.TwoLetterCode, StringComparison.OrdinalIgnoreCase) && File.Exists(Path.Combine(dictionaryFolder, hunspellName + ".dic"))) - { - dictionaryFileName = Path.Combine(dictionaryFolder, hunspellName + ".dic"); - LoadSpellingDictionariesViaDictionaryFileName(threeLetterIsoLanguageName, dictionaryFileName, true); - return; - } - foreach (string dic in Directory.GetFiles(dictionaryFolder, "*.dic")) - { - string name = Path.GetFileNameWithoutExtension(dic); - if (!string.IsNullOrEmpty(name) && !name.StartsWith("hyph", StringComparison.Ordinal)) - { - try - { - name = name.Replace('_', '-'); - if (name.Length > 5) - { - name = name.Substring(0, 5); - } - - var ci = CultureInfo.GetCultureInfo(name); - if (ci.GetThreeLetterIsoLanguageName() == threeLetterIsoLanguageName || - ci.GetThreeLetterIsoLanguageName().Equals(threeLetterIsoLanguageName, StringComparison.OrdinalIgnoreCase)) - { - dictionaryFileName = dic; - break; - } - } - catch (Exception exception) - { - System.Diagnostics.Debug.WriteLine(exception.Message); - } - } - } - - if (dictionaryFileName == null) - { - return; - } - - LoadSpellingDictionariesViaDictionaryFileName(threeLetterIsoLanguageName, dictionaryFileName, true); - return; - } - } - - string dicFileName = null; - foreach (string dic in Directory.GetFiles(dictionaryFolder, "*.dic")) - { - string name = Path.GetFileNameWithoutExtension(dic); - if (!string.IsNullOrEmpty(name) && !name.StartsWith("hyph", StringComparison.Ordinal)) - { - try - { - name = name.Replace('_', '-'); - if (name.Length > 5) - { - name = name.Substring(0, 5); - } - - var ci = CultureInfo.GetCultureInfo(name); - if (ci.GetThreeLetterIsoLanguageName() == threeLetterIsoLanguageName || - ci.GetThreeLetterIsoLanguageName().Equals(threeLetterIsoLanguageName, StringComparison.OrdinalIgnoreCase)) - { - dicFileName = dic; - break; - } - } - catch (Exception exception) - { - System.Diagnostics.Debug.WriteLine(exception.Message); - } - } - } - - if (dicFileName == null) - { - return; - } - - LoadSpellingDictionariesViaDictionaryFileName(threeLetterIsoLanguageName, dicFileName, true); - } - - private void LoadSpellingDictionariesViaDictionaryFileName(string threeLetterIsoLanguageName, string dictionaryFileName, bool resetSkipList) - { - _fiveLetterWordListLanguageName = Path.GetFileNameWithoutExtension(dictionaryFileName); - if (_fiveLetterWordListLanguageName != null && _fiveLetterWordListLanguageName.Length > 5) - { - _fiveLetterWordListLanguageName = _fiveLetterWordListLanguageName.Substring(0, 5); - } - - string dictionary = Utilities.DictionaryFolder + _fiveLetterWordListLanguageName; - if (resetSkipList) - { - _wordSkipList = new HashSet<string> { Configuration.Settings.Tools.MusicSymbol, "*", "%", "#", "+", "$" }; - } - - // Load names etc list (names/noise words) - _nameListObj = new NameList(Configuration.DictionariesDirectory, _fiveLetterWordListLanguageName, Configuration.Settings.WordLists.UseOnlineNames, Configuration.Settings.WordLists.NamesUrl); - _nameList = _nameListObj.GetNames(); - _nameMultiWordList = _nameListObj.GetMultiNames(); - _nameListUppercase = new HashSet<string>(); - _nameListWithApostrophe = new HashSet<string>(); - var nameListWithPeriods = new List<string>(); - _abbreviationList = new HashSet<string>(); - - bool isEnglish = threeLetterIsoLanguageName.Equals("eng", StringComparison.OrdinalIgnoreCase); - foreach (string name in _nameList) - { - _nameListUppercase.Add(name.ToUpperInvariant()); - if (isEnglish) - { - if (!name.EndsWith('s')) - { - _nameListWithApostrophe.Add(name + "'s"); - } - else - { - _nameListWithApostrophe.Add(name + "'"); - } - } - - // Abbreviations. - if (name.EndsWith('.')) - { - _abbreviationList.Add(name); - } - - if (name.Contains(".", StringComparison.Ordinal)) - { - nameListWithPeriods.Add(name); - } - } - - _nameMultiWordListAndWordsWithPeriods = new List<string>(_nameMultiWordList.Concat(nameListWithPeriods)); - if (isEnglish) - { - if (!_abbreviationList.Contains("a.m.")) - { - _abbreviationList.Add("a.m."); - } - - if (!_abbreviationList.Contains("p.m.")) - { - _abbreviationList.Add("p.m."); - } - - if (!_abbreviationList.Contains("o.r.")) - { - _abbreviationList.Add("o.r."); - } - } - - // Load user words - _userWordList = new HashSet<string>(); - _userWordListXmlFileName = Utilities.LoadUserWordList(_userWordList, _fiveLetterWordListLanguageName); - foreach (string name in _userWordList) - { - if (name.EndsWith('.')) - { - _abbreviationList.Add(name); - } - } - - // Load Hunspell spell checker - try - { - if (dictionaryFileName.EndsWith(".dic", StringComparison.OrdinalIgnoreCase) && File.Exists(dictionaryFileName)) - { - dictionary = dictionaryFileName.Substring(0, dictionaryFileName.Length - 4); - } - else if (dictionaryFileName.EndsWith(".dic", StringComparison.OrdinalIgnoreCase) && File.Exists(Path.Combine(Utilities.DictionaryFolder, dictionaryFileName))) - { - var f = Path.Combine(Utilities.DictionaryFolder, dictionaryFileName); - dictionary = f.Substring(0, f.Length - 4); - } - else if (!File.Exists(dictionary + ".dic")) - { - var fileMatches = Directory.GetFiles(Utilities.DictionaryFolder, _fiveLetterWordListLanguageName + "*.dic"); - if (fileMatches.Length > 0) - { - dictionary = fileMatches[0].Substring(0, fileMatches[0].Length - 4); - } - } - _hunspell?.Dispose(); - _hunspell = Hunspell.GetHunspell(dictionary); - IsDictionaryLoaded = true; - _spellCheckDictionaryName = dictionary; - } - catch - { - IsDictionaryLoaded = false; - } - - // load spell check "change all" list - if (_hunspell != null) - { - var languageName = Path.GetFileName(_spellCheckDictionaryName); - if (!string.IsNullOrEmpty(languageName)) - { - _spellCheckWordLists = new SpellCheckWordLists(Utilities.DictionaryFolder, languageName, this); - _changeAllDictionary = _spellCheckWordLists.GetUseAlwaysList(); - } - } - } - - public string SpellCheckDictionaryName - { - get - { - string[] parts = _spellCheckDictionaryName?.Split(new[] { Path.DirectorySeparatorChar }, StringSplitOptions.RemoveEmptyEntries); - if (parts?.Length > 0) - { - return parts[parts.Length - 1]; - } - - return string.Empty; - } - } - - internal static Dictionary<string, string> LoadReplaceList(XmlDocument doc, string name) - { - var list = new Dictionary<string, string>(); - XmlNode node = doc.DocumentElement?.SelectSingleNode(name); - if (node != null) - { - foreach (XmlNode item in node.ChildNodes) - { - if (item.Attributes?["to"] != null && item.Attributes["from"] != null) - { - string to = item.Attributes["to"].InnerText; - string from = item.Attributes["from"].InnerText; - if (!list.ContainsKey(from)) - { - list.Add(from, to); - } - } - } - } - return list; - } - - internal static Dictionary<string, string> LoadRegExList(XmlDocument doc, string name) - { - var list = new Dictionary<string, string>(); - XmlNode node = doc.DocumentElement?.SelectSingleNode(name); - if (node != null) - { - foreach (XmlNode item in node.ChildNodes) - { - if (item.Attributes?["replaceWith"] != null && item.Attributes["find"] != null) - { - string to = item.Attributes["replaceWith"].InnerText; - string from = item.Attributes["find"].InnerText; - if (!list.ContainsKey(from)) - { - list.Add(from, to); - } - } - } - } - return list; - } - - public string FixOcrErrors(string input, int index, string lastLine, bool logSuggestions, AutoGuessLevel autoGuess) - { - var text = input; - while (text.Contains(Environment.NewLine + " ", StringComparison.Ordinal)) - { - text = text.Replace(Environment.NewLine + " ", Environment.NewLine); - } - - while (text.Contains(" " + Environment.NewLine, StringComparison.Ordinal)) - { - text = text.Replace(" " + Environment.NewLine, Environment.NewLine); - } - - while (text.Contains(Environment.NewLine + Environment.NewLine, StringComparison.Ordinal)) - { - text = text.Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); - } - - text = text.Trim(); - - // Try to prevent resizing when fixing Ocr-hardcoded. - var sb = new StringBuilder(text.Length + 2); - - if (Configuration.Settings.Tools.OcrFixUseHardcodedRules) - { - if (text.Length > 3 && text.StartsWith(". .") && char.IsLetter(text[3])) - { - text = text.Remove(1, 1).Insert(1, "."); - } - else if (text.Length > 3 && text.StartsWith(".. ") && char.IsLetter(text[3])) - { - text = text.Remove(2, 1).Insert(2, "."); - } - else if (text.Length > 3 && text.StartsWith("..") && char.IsLetter(text[2])) - { - text = "." + text; - } - - text = text.Replace("<i>-</i>", "-"); - text = text.Replace("<i>- </i>", "- "); - text = text.Replace("<i> - </i>", "- "); - text = text.Replace("<i> -</i>", "- "); - text = text.Replace("- ", "- "); - text = text.Replace("<i>a</i>", "a"); - text = text.Replace("<i>.</i>", "."); - text = text.TrimStart(); - - int len = text.Length; - for (int i = 0; i < len; i++) - { - char ch = text[i]; - switch (ch) - { - case 'fi': - sb.Append("fi"); - break; - case 'fl': // fb02 - sb.Append("fl"); - break; - case 'ν': // NOTE: Special unicode character! (Greek character!) - if (_threeLetterIsoLanguageName == "ell" || _threeLetterIsoLanguageName == "gre") - { - sb.Append(ch); // Keep Greek 'ν' - } - else - { - sb.Append('v'); - } - break; - case '‚': // #x201A (SINGLE LOW-9 QUOTATION MARK) to plain old comma - sb.Append(','); - break; - default: - sb.Append(ch); - break; - } - } - text = sb.ToString(); - sb.Clear(); - } - - text = ReplaceWordsBeforeLineFixes(text); - - text = FixCommonOcrLineErrors(text, lastLine); - - // check words split by only space and new line (as other split chars might by a part of from-replace-string, like "\/\/e're" contains slash) - sb = new StringBuilder(); - var word = new StringBuilder(); - string lastWord = null; - for (int i = 0; i < text.Length; i++) - { - if (text[i] != '.' && "\r\n ".Contains(text[i])) - { - if (word.Length > 0) - { - var fixedWord = FixOcrErrorsWord(lastWord, word, sb); - lastWord = fixedWord; - word.Clear(); - } - sb.Append(text[i]); - } - else - { - word.Append(text[i]); - } - } - if (word.Length > 0) // last word - { - FixOcrErrorsWord(lastWord, word, sb); - } - - // check words split by many chars like "()/-" etc. - text = sb.ToString(); - sb = new StringBuilder(); - word = new StringBuilder(); - lastWord = null; - for (int i = 0; i < text.Length; i++) - { - if (text[i] != '.' && _expectedChars.Contains(text[i])) - { - if (word.Length > 0) - { - var fixedWord = FixOcrErrorsWord(lastWord, word, sb); - lastWord = fixedWord; - word.Clear(); - } - sb.Append(text[i]); - } - else - { - word.Append(text[i]); - } - } - if (word.Length > 0) // last word - { - FixOcrErrorsWord(lastWord, word, sb); - } - - text = FixCommonOcrLineErrors(sb.ToString(), lastLine); - if (Configuration.Settings.Tools.OcrFixUseHardcodedRules) - { - text = FixLowercaseIToUppercaseI(text, lastLine); - if (SpellCheckDictionaryName.StartsWith("en_", StringComparison.Ordinal) || _threeLetterIsoLanguageName == "eng") - { - string oldText = text; - text = FixAloneLowercaseIToUppercaseI.FixAloneLowercaseIToUppercaseLine(RegexUtils.LittleIRegex, oldText, text, 'i'); - text = FixAloneLowercaseIToUppercaseI.FixAloneLowercaseIToUppercaseLine(RegexAloneIasL, oldText, text, 'l'); - } - else if (_threeLetterIsoLanguageName == "fra") - { - text = FixFrenchLApostrophe(text, " I'", lastLine); - text = FixFrenchLApostrophe(text, " L'", lastLine); - text = FixFrenchLApostrophe(text, " l'", lastLine); - text = FixFrenchLApostrophe(text, " I’", lastLine); - text = FixFrenchLApostrophe(text, " L’", lastLine); - text = FixFrenchLApostrophe(text, " l’", lastLine); - } - - text = Utilities.RemoveSpaceBetweenNumbers(text); - } - - // must be last - counts/logs unknown words - text = FixUnknownWordsViaGuessOrPrompt(out _, text, index, null, true, false, logSuggestions, autoGuess); - - return text; - } - - private string FixOcrErrorsWord(string lastWord, StringBuilder word, StringBuilder sb) - { - string fixedWord; - if (lastWord != null && lastWord.Contains("COLOR=", StringComparison.OrdinalIgnoreCase)) - { - fixedWord = word.ToString(); - } - else - { - var doFixWord = !(word.Length == 1 && sb.Length > 1 && sb.EndsWith('-')); - if (doFixWord) - { - fixedWord = word.ToString(); - - var post = string.Empty; - if (fixedWord.EndsWith('.') && fixedWord.IndexOf('.') == fixedWord.Length - 1) - { - post = "."; - fixedWord = fixedWord.Substring(0, fixedWord.Length - 1); - } - else if (fixedWord.EndsWith("...", StringComparison.Ordinal)) - { - post = "..."; - fixedWord = fixedWord.Substring(0, fixedWord.Length - 3); - } - - fixedWord = FixWordViaReplaceList(fixedWord); - fixedWord = _ocrFixReplaceList.FixCommonWordErrors(fixedWord); - - // Try using word lists for uppercase i inside words, e.g. "NIkolaj" to "Nikolaj" - if (fixedWord.Contains('I')) - { - var temp = fixedWord.Replace('I', 'i'); - if (temp != fixedWord.ToUpperInvariant()) - { - if (_nameList.Contains(temp)) - { - fixedWord = temp; - } - } - } - fixedWord += post; - } - else - { - fixedWord = word.ToString(); - } - } - - sb.Append(fixedWord); - return fixedWord; - } - - private string FixWordViaReplaceList(string word) - { - if (_changeAllDictionary != null && _changeAllDictionary.ContainsKey(word)) - { - return _changeAllDictionary[word]; - } - return word; - } - - internal static string FixFrenchLApostrophe(string input, string tag, string lastLine) - { - var text = input; - bool endingBeforeThis = string.IsNullOrEmpty(lastLine) || lastLine.EndsWith('.') || lastLine.EndsWith('!') || lastLine.EndsWith('?') || - lastLine.EndsWith(".</i>", StringComparison.Ordinal) || lastLine.EndsWith("!</i>", StringComparison.Ordinal) || lastLine.EndsWith("?</i>", StringComparison.Ordinal) || - lastLine.EndsWith(".</font>", StringComparison.Ordinal) || lastLine.EndsWith("!</font>", StringComparison.Ordinal) || lastLine.EndsWith("?</font>", StringComparison.Ordinal); - if (text.StartsWith(tag.TrimStart(), StringComparison.Ordinal) && text.Length > 3) - { - if (endingBeforeThis || char.IsUpper(text[2])) - { - text = @"L" + text.Substring(1); - } - else if (char.IsLower(text[2])) - { - text = @"l" + text.Substring(1); - } - } - else if (text.StartsWith("<i>" + tag.TrimStart(), StringComparison.Ordinal) && text.Length > 6) - { - if (endingBeforeThis || char.IsUpper(text[5])) - { - text = text.Remove(3, 1).Insert(3, "L"); - } - else if (char.IsLower(text[5])) - { - text = text.Remove(3, 1).Insert(3, "l"); - } - } - - int start = text.IndexOf(tag, StringComparison.Ordinal); - while (start > 0) - { - lastLine = HtmlUtil.RemoveHtmlTags(text.Substring(0, start)).TrimEnd().TrimEnd('-').TrimEnd(); - endingBeforeThis = string.IsNullOrEmpty(lastLine) || lastLine.EndsWith('.') || lastLine.EndsWith('!') || lastLine.EndsWith('?'); - if (start < text.Length - 4) - { - if (start == 1 && text.StartsWith('-')) - { - endingBeforeThis = true; - } - - if (start > 1) - { - string beforeThis = HtmlUtil.RemoveHtmlTags(text.Substring(0, start)); - endingBeforeThis = beforeThis.EndsWith('.') || beforeThis.EndsWith('!') || beforeThis.EndsWith('?'); - } - - if (endingBeforeThis) - { - text = text.Remove(start + 1, 1).Insert(start + 1, "L"); - } - else - { - text = text.Remove(start + 1, 1).Insert(start + 1, "l"); - } - } - start = text.IndexOf(tag, start + 1, StringComparison.Ordinal); - } - - tag = Environment.NewLine + tag.Trim(); - start = text.IndexOf(tag, StringComparison.Ordinal); - while (start > 0) - { - lastLine = HtmlUtil.RemoveHtmlTags(text.Substring(0, start)).TrimEnd().TrimEnd('-').TrimEnd(); - endingBeforeThis = string.IsNullOrEmpty(lastLine) || lastLine.EndsWith('.') || lastLine.EndsWith('!') || lastLine.EndsWith('?') || lastLine.EndsWith(".</i>", StringComparison.Ordinal); - if (start < text.Length - 5) - { - if (start > 1) - { - string beforeThis = HtmlUtil.RemoveHtmlTags(text.Substring(0, start)); - endingBeforeThis = beforeThis.EndsWith('.') || beforeThis.EndsWith('!') || beforeThis.EndsWith('?'); - } - - if (endingBeforeThis) - { - text = text.Remove(start + Environment.NewLine.Length, 1).Insert(start + Environment.NewLine.Length, "L"); - } - else - { - text = text.Remove(start + Environment.NewLine.Length, 1).Insert(start + Environment.NewLine.Length, "l"); - } - } - start = text.IndexOf(tag, start + 1, StringComparison.Ordinal); - } - - tag = Environment.NewLine + "<i>" + tag.Trim(); - start = text.IndexOf(tag, StringComparison.Ordinal); - while (start > 0) - { - lastLine = HtmlUtil.RemoveHtmlTags(text.Substring(0, start)).TrimEnd().TrimEnd('-').TrimEnd(); - endingBeforeThis = string.IsNullOrEmpty(lastLine) || lastLine.EndsWith('.') || lastLine.EndsWith('!') || lastLine.EndsWith('?') || lastLine.EndsWith(".</i>", StringComparison.Ordinal); - if (start < text.Length - 8) - { - if (endingBeforeThis || char.IsUpper(text[start + 5 + Environment.NewLine.Length])) - { - text = text.Remove(start + Environment.NewLine.Length + 3, 1).Insert(start + Environment.NewLine.Length + 3, "L"); - } - else if (char.IsLower(text[start + 5 + Environment.NewLine.Length])) - { - text = text.Remove(start + Environment.NewLine.Length + 3, 1).Insert(start + Environment.NewLine.Length + 3, "l"); - } - } - start = text.IndexOf(tag, start + 1, StringComparison.Ordinal); - } - return text; - } - - private string ReplaceWordsBeforeLineFixes(string text) - { - string lastWord = null; - var sb = new StringBuilder(); - var word = new StringBuilder(); - for (int i = 0; i < text.Length; i++) - { - if (_expectedCharsNoComma.Contains(text[i])) // fix e.g. "don,t" - { - if (word.Length > 0) - { - string fixedWord; - if (lastWord != null && lastWord.Contains("COLOR=", StringComparison.OrdinalIgnoreCase)) - { - fixedWord = word.ToString(); - } - else if (!word.ToString().Contains(',')) - { - fixedWord = word.ToString(); - } - else - { - fixedWord = _ocrFixReplaceList.FixCommonWordErrorsQuick(word.ToString()); - } - - sb.Append(fixedWord); - lastWord = fixedWord; - word.Clear(); - } - sb.Append(text[i]); - } - else - { - word.Append(text[i]); - } - } - if (word.Length > 0) // last word - { - string fixedWord; - if (lastWord != null && lastWord.Contains("COLOR=", StringComparison.OrdinalIgnoreCase)) - { - fixedWord = word.ToString(); - } - else if (!word.ToString().Contains(',')) - { - fixedWord = word.ToString(); - } - else - { - fixedWord = _ocrFixReplaceList.FixCommonWordErrorsQuick(word.ToString()); - } - - sb.Append(fixedWord); - } - - lastWord = null; - text = sb.ToString(); - sb = new StringBuilder(); - word = new StringBuilder(); - for (int i = 0; i < text.Length; i++) - { - if (_expectedChars.Contains(text[i])) // removed $ - { - if (word.Length > 0) - { - string fixedWord; - if (lastWord != null && lastWord.Contains("COLOR=", StringComparison.OrdinalIgnoreCase)) - { - fixedWord = word.ToString(); - } - else - { - fixedWord = _ocrFixReplaceList.FixCommonWordErrorsQuick(word.ToString()); - } - - sb.Append(fixedWord); - lastWord = fixedWord; - word.Clear(); - } - sb.Append(text[i]); - } - else - { - word.Append(text[i]); - } - } - if (word.Length > 0) // last word - { - string fixedWord = _ocrFixReplaceList.FixCommonWordErrorsQuick(word.ToString()); - sb.Append(fixedWord); - } - return sb.ToString(); - } - - private string FixCommonOcrLineErrors(string input, string lastLine) - { - var text = input; - text = FixOcrErrorViaLineReplaceList(text); - text = FixOcrErrorsViaHardcodedRules(text, lastLine, _abbreviationList); - text = FixOcrErrorViaLineReplaceList(text); - - if (Configuration.Settings.Tools.OcrFixUseHardcodedRules) - { - if (text.StartsWith('~')) - { - text = ("- " + text.Remove(0, 1)).Replace(" ", " "); - } - - text = text.Replace(Environment.NewLine + "~", Environment.NewLine + "- ").Replace(" ", " "); - - if (text.Length < 10 && text.Length > 4 && !text.Contains(Environment.NewLine, StringComparison.Ordinal) && text.StartsWith("II", StringComparison.Ordinal) && text.EndsWith("II", StringComparison.Ordinal)) - { - text = "\"" + text.Substring(2, text.Length - 4) + "\""; - } - - // e.g. "selectionsu." -> "selections..." - if (text.EndsWith("u.", StringComparison.Ordinal) && _hunspell != null) - { - string[] words = text.Split(new[] { ' ', '.' }, StringSplitOptions.RemoveEmptyEntries); - if (words.Length > 0) - { - string lastWord = words[words.Length - 1].Trim(); - if (lastWord.Length > 2 && - char.IsLower(lastWord[0]) && - !IsWordOrWordsCorrect(lastWord) && - IsWordOrWordsCorrect(lastWord.Substring(0, lastWord.Length - 1))) - { - text = text.Substring(0, text.Length - 2) + "..."; - } - } - } - - // music notes - if (text.StartsWith(".'", StringComparison.Ordinal) && text.EndsWith(".'", StringComparison.Ordinal)) - { - text = text.Replace(".'", Configuration.Settings.Tools.MusicSymbol); - } - } - - return text; - } - - private string FixLowercaseIToUppercaseI(string input, string lastLine) - { - var sb = new StringBuilder(); - var lines = input.SplitToLines(); - for (int i = 0; i < lines.Count; i++) - { - string l = lines[i]; - - if (i > 0) - { - lastLine = lines[i - 1]; - } - - lastLine = HtmlUtil.RemoveHtmlTags(lastLine); - - if (string.IsNullOrEmpty(lastLine) || - lastLine.EndsWith('.') || - lastLine.EndsWith('!') || - lastLine.EndsWith('?')) - { - var st = new StrippableText(l); - if (st.StrippedText.StartsWith('i') && !st.Pre.EndsWith('[') && !st.Pre.EndsWith('(') && !st.Pre.EndsWith("...", StringComparison.Ordinal)) - { - if (string.IsNullOrEmpty(lastLine) || (!lastLine.EndsWith("...", StringComparison.Ordinal) && !EndsWithAbbreviation(lastLine, _abbreviationList))) - { - l = st.Pre + "I" + st.StrippedText.Remove(0, 1) + st.Post; - } - } - } - sb.AppendLine(l); - } - return sb.ToString().TrimEnd('\r', '\n'); - } - - private static bool EndsWithAbbreviation(string line, HashSet<string> abbreviationList) - { - if (string.IsNullOrEmpty(line)) - { - return false; - } - if (line.Length > 5 && line[line.Length - 3] == '.' && char.IsLetter(line[line.Length - 2])) - { - return true; - } - if (abbreviationList != null) - { - foreach (string abbreviation in abbreviationList) - { - if (line.EndsWith(" " + abbreviation, StringComparison.OrdinalIgnoreCase)) - { - return true; - } - } - } - return false; - } - - public string FixOcrErrorsViaHardcodedRules(string input, string lastLine, HashSet<string> abbreviationList) - { - var text = input; - if (!Configuration.Settings.Tools.OcrFixUseHardcodedRules) - { - return text; - } - - text = text.Replace(",...", "..."); - - if (text.StartsWith("..", StringComparison.Ordinal) && !text.StartsWith("...", StringComparison.Ordinal)) - { - text = "." + text; - } - - string pre = string.Empty; - if (text.StartsWith("- ", StringComparison.Ordinal)) - { - pre = "- "; - text = text.Remove(0, 2); - } - else if (text.StartsWith('-')) - { - pre = "-"; - text = text.Remove(0, 1); - } - - bool hasDotDot = text.Contains("..", StringComparison.Ordinal) || text.Contains(". .", StringComparison.Ordinal); - if (hasDotDot) - { - if (text.Length > 5 && text.StartsWith("..", StringComparison.Ordinal) && Utilities.AllLettersAndNumbers.Contains(text[2])) - { - text = "..." + text.Remove(0, 2); - } - - if (text.Length > 7 && text.StartsWith("<i>..", StringComparison.Ordinal) && Utilities.AllLettersAndNumbers.Contains(text[5])) - { - text = "<i>..." + text.Remove(0, 5); - } - - if (text.Length > 5 && text.StartsWith(".. ", StringComparison.Ordinal) && Utilities.AllLettersAndNumbers.Contains(text[3])) - { - text = "..." + text.Remove(0, 3); - } - - if (text.Length > 7 && text.StartsWith("<i>.. ", StringComparison.Ordinal) && Utilities.AllLettersAndNumbers.Contains(text[6])) - { - text = "<i>..." + text.Remove(0, 6); - } - - if (text.Contains(Environment.NewLine + ".. ", StringComparison.Ordinal)) - { - text = text.Replace(Environment.NewLine + ".. ", Environment.NewLine + "..."); - } - - if (text.Contains(Environment.NewLine + "<i>.. ", StringComparison.Ordinal)) - { - text = text.Replace(Environment.NewLine + "<i>.. ", Environment.NewLine + "<i>..."); - } - - if (text.StartsWith(". ..", StringComparison.Ordinal)) - { - text = "..." + text.Remove(0, 4); - } - - if (text.StartsWith(".. .", StringComparison.Ordinal)) - { - text = "..." + text.Remove(0, 4); - } - - if (text.StartsWith(". . .", StringComparison.Ordinal)) - { - text = "..." + text.Remove(0, 5); - } - - if (text.StartsWith("... ", StringComparison.Ordinal)) - { - text = text.Remove(3, 1); - } - } - - text = pre + text; - - if (hasDotDot) - { - if (text.StartsWith("<i>. ..", StringComparison.Ordinal)) - { - text = "<i>..." + text.Remove(0, 7); - } - - if (text.StartsWith("<i>.. .", StringComparison.Ordinal)) - { - text = "<i>..." + text.Remove(0, 7); - } - - if (text.StartsWith("<i>. . .", StringComparison.Ordinal)) - { - text = "<i>..." + text.Remove(0, 8); - } - - if (text.StartsWith("<i>... ", StringComparison.Ordinal)) - { - text = text.Remove(6, 1); - } - - if (text.StartsWith(". . <i>.", StringComparison.Ordinal)) - { - text = "<i>..." + text.Remove(0, 8); - } - - if (text.StartsWith("...<i>", StringComparison.Ordinal) && (text.IndexOf("</i>", StringComparison.Ordinal) > text.IndexOf(' '))) - { - text = "<i>..." + text.Remove(0, 6); - } - - if (text.EndsWith(". ..", StringComparison.Ordinal)) - { - text = text.Remove(text.Length - 4, 4) + "..."; - } - - if (text.EndsWith(".. .", StringComparison.Ordinal)) - { - text = text.Remove(text.Length - 4, 4) + "..."; - } - - if (text.EndsWith(". . .", StringComparison.Ordinal)) - { - text = text.Remove(text.Length - 5, 5) + "..."; - } - - if (text.EndsWith(". ...", StringComparison.Ordinal)) - { - text = text.Remove(text.Length - 5, 5) + "..."; - } - - if (text.EndsWith(". ..</i>", StringComparison.Ordinal)) - { - text = text.Remove(text.Length - 8, 8) + "...</i>"; - } - - if (text.EndsWith(".. .</i>", StringComparison.Ordinal)) - { - text = text.Remove(text.Length - 8, 8) + "...</i>"; - } - - if (text.EndsWith(". . .</i>", StringComparison.Ordinal)) - { - text = text.Remove(text.Length - 9, 9) + "...</i>"; - } - - if (text.EndsWith(". ...</i>", StringComparison.Ordinal)) - { - text = text.Remove(text.Length - 9, 9) + "...</i>"; - } - - if (text.EndsWith(".</i> . .", StringComparison.Ordinal)) - { - text = text.Remove(text.Length - 9, 9) + "...</i>"; - } - - if (text.EndsWith(".</i>..", StringComparison.Ordinal)) - { - text = text.Remove(text.Length - 7, 7) + "...</i>"; - } - - text = text.Replace(".</i> . ." + Environment.NewLine, "...</i>" + Environment.NewLine); - - text = text.Replace(".. ?", "..?"); - text = text.Replace("..?", "...?"); - text = text.Replace("....?", "...?"); - - text = text.Replace(".. !", "..!"); - text = text.Replace("..!", "...!"); - text = text.Replace("....!", "...!"); - - text = text.Replace("... ?", "...?"); - text = text.Replace("... !", "...!"); - - text = text.Replace("....", "..."); - text = text.Replace("....", "..."); - - if (text.StartsWith("- ...", StringComparison.Ordinal) && lastLine != null && lastLine.EndsWith("...", StringComparison.Ordinal) && !text.Contains(Environment.NewLine + "-", StringComparison.Ordinal)) - { - text = text.Remove(0, 2); - } - - if (text.StartsWith("-...", StringComparison.Ordinal) && lastLine != null && lastLine.EndsWith("...", StringComparison.Ordinal) && !text.Contains(Environment.NewLine + "-", StringComparison.Ordinal)) - { - text = text.Remove(0, 1); - } - } - - var lastLineNoTags = lastLine; - if (!string.IsNullOrEmpty(lastLineNoTags)) - { - lastLineNoTags = HtmlUtil.RemoveHtmlTags(lastLineNoTags); - lastLineNoTags = lastLineNoTags.Trim('♪', '♫', ' ', '"'); - if (lastLine.EndsWith(']') && lastLineNoTags.IndexOf('[') > 0 && - Utilities.CountTagInText(lastLineNoTags, '[') == 1 && Utilities.CountTagInText(lastLineNoTags, ']') == 1) - { - lastLineNoTags = lastLineNoTags.Substring(0, lastLineNoTags.IndexOf('[')).Trim(); - } - } - - if (string.IsNullOrEmpty(lastLine) || lastLineNoTags.HasSentenceEnding(Iso639Dash2LanguageCode.GetTwoLetterCodeFromThreeLetterCode(_threeLetterIsoLanguageName))) - { - lastLine = HtmlUtil.RemoveHtmlTags(lastLine); - var st = new StrippableText(text); - if (lastLine == null || !lastLine.EndsWith("...", StringComparison.Ordinal) && !EndsWithAbbreviation(lastLine, abbreviationList)) - { - if (st.StrippedText.Length > 0 && !char.IsUpper(st.StrippedText[0]) && !st.Pre.EndsWith('[') && !st.Pre.EndsWith('(') && - !st.Pre.Contains("...", StringComparison.Ordinal) && - !st.Pre.Contains('…')) - { - if (!HtmlUtil.StartsWithUrl(st.StrippedText)) - { - var uppercaseLetter = char.ToUpper(st.StrippedText[0]); - if (st.StrippedText.Length > 1 && uppercaseLetter == 'L' && (st.StrippedText[1] == ' ' || char.IsLower(st.StrippedText[1]))) - { - uppercaseLetter = 'I'; - } - if (st.StrippedText.Length == 1 && uppercaseLetter == 'L') - { - uppercaseLetter = 'I'; - } - - if ((st.StrippedText.StartsWith("lo ", StringComparison.Ordinal) || st.StrippedText.Equals("lo.", StringComparison.Ordinal)) && _threeLetterIsoLanguageName.Equals("ita", StringComparison.Ordinal)) - { - uppercaseLetter = 'I'; - } - - if ((st.StrippedText.StartsWith("k ", StringComparison.Ordinal) || st.StrippedText.StartsWith("m ", StringComparison.Ordinal) || st.StrippedText.StartsWith("n ", StringComparison.Ordinal) || st.StrippedText.StartsWith("r ", StringComparison.Ordinal) || st.StrippedText.StartsWith("s ", StringComparison.Ordinal) || st.StrippedText.StartsWith("t ", StringComparison.Ordinal)) && - st.Pre.EndsWith('\'') && _threeLetterIsoLanguageName.Equals("nld", StringComparison.Ordinal)) - { - uppercaseLetter = st.StrippedText[0]; - } - - if ((st.StrippedText.StartsWith("l-I'll ", StringComparison.Ordinal) || st.StrippedText.StartsWith("l-l'll ", StringComparison.Ordinal)) && _threeLetterIsoLanguageName.Equals("eng", StringComparison.Ordinal)) - { - uppercaseLetter = 'I'; - st.StrippedText = "I-I" + st.StrippedText.Remove(0, 3); - } - - st.StrippedText = uppercaseLetter + st.StrippedText.Substring(1); - text = st.Pre + st.StrippedText + st.Post; - } - } - } - } - - // lines ending with ". should often end at ... (of no other quotes exists near by) - if ((lastLine == null || !lastLine.Contains('"')) && - text.EndsWith("\".", StringComparison.Ordinal) && text.IndexOf('"') == text.LastIndexOf('"') && text.Length > 3) - { - var lastChar = text[text.Length - 3]; - if (!char.IsDigit(lastChar)) - { - int position = text.Length - 2; - text = text.Remove(position).Insert(position, "..."); - } - } - - // change '<number><space>1' to '<number>1' - if (text.Contains('1')) - { - var match = RegexNumber1.Match(text); - while (match.Success) - { - text = text.Remove(match.Index, 1); - match = RegexNumber1.Match(text, match.Index); - } - } - - // change '' to " - text = text.Replace("''", "\""); - - // change 'sequeI of' to 'sequel of' - if (text.Contains('I')) - { - var match = RegexUppercaseI.Match(text); - while (match.Success) - { - bool doFix = !(match.Index >= 1 && text.Substring(match.Index - 1).StartsWith("Mc", StringComparison.Ordinal)); - if (match.Index >= 2 && text.Substring(match.Index - 2).StartsWith("Mac", StringComparison.Ordinal)) - { - doFix = false; - } - - if (doFix) - { - text = text.Substring(0, match.Index + 1) + "l" + text.Substring(match.Index + 2); - } - - if (match.Index + 1 < text.Length) - { - match = RegexUppercaseI.Match(text, match.Index + 1); - } - else - { - break; // end while - } - } - } - - // change 'NlCE' to 'NICE' - if (text.Contains('l')) - { - var match = RegexLowercaseL.Match(text); - while (match.Success) - { - text = text.Substring(0, match.Index + 1) + "I" + text.Substring(match.Index + 2); - match = RegexLowercaseL.Match(text); - } - } - - if (text.EndsWith(". \"</i>", StringComparison.Ordinal)) - { - text = text.Remove(text.Length - 6, 1); - } - - if (text.Contains(". \"</i>" + Environment.NewLine, StringComparison.Ordinal)) - { - var idx = text.IndexOf(". \"</i>" + Environment.NewLine, StringComparison.Ordinal); - if (idx > 0) - { - text = text.Remove(idx + 1, 1); - } - } - - return text; - } - - public string FixOcrErrorViaLineReplaceList(string input) - { - return _ocrFixReplaceList.FixOcrErrorViaLineReplaceList(input); - } - - public string FixUnknownWordsViaGuessOrPrompt(out int wordsNotFound, string line, int index, Bitmap bitmap, bool autoFix, bool promptForFixingErrors, bool log, AutoGuessLevel autoGuess) - { - var localIgnoreWords = new List<string>(); - wordsNotFound = 0; - - if (promptForFixingErrors && line.Length == 1 && !IsWordKnownOrNumber(line, line)) - { - SpellCheckOcrTextResult res = SpellCheckOcrText(line, bitmap, line, localIgnoreWords); - if (res.FixedWholeLine || res.Fixed) - { - return res.Line; - } - - wordsNotFound++; - return line; - } - - if (_hunspell == null) - { - return line; - } - - string tempLine = line; - const string p = " ¡¿,.!?:;()[]{}+-$£\"„”“#&%…—♪\r\n"; - var trimChars = p.ToArray(); - bool hasAllUpperWord = false; - foreach (var w in HtmlUtil.RemoveHtmlTags(line, true).Split(' ', '\r', '\n')) - { - var word = w.Trim(trimChars); - if (word.Length > 1 && word == word.ToUpperInvariant()) - { - hasAllUpperWord = true; - break; - } - } - - foreach (string name in _nameMultiWordListAndWordsWithPeriods) - { - int start = tempLine.FastIndexOf(name); - if (start < 0 && hasAllUpperWord) - { - start = tempLine.FastIndexOf(name.ToUpperInvariant()); - } - if (start == 0 || (start > 0 && p.Contains(tempLine[start - 1]))) - { - int end = start + name.Length; - if (end == tempLine.Length || p.Contains(tempLine[end])) - { - tempLine = tempLine.Remove(start, name.Length); - } - } - } - - int minLength = 2; - if (Configuration.Settings.Tools.CheckOneLetterWords) - { - minLength = 1; - } - - var words = new List<string>(); - var splitChars = SpellCheckWordLists.SplitChars.Where(ch => ch != '/' && ch != '|').ToArray(); - foreach (var w in tempLine - .Replace("<i>", string.Empty).Replace("</i>", string.Empty) - .Replace("<b>", string.Empty).Replace("</b>", string.Empty) - .Replace("<u>", string.Empty).Replace("</u>", string.Empty) - .Split(splitChars)) - { - words.Add(w.Trim(trimChars)); - } - - for (int i = 0; i < words.Count && i < 1000; i++) - { - string word = words[i].TrimStart('\''); - string wordNotEndTrimmed = word; - word = word.TrimEnd('\''); - if (!IsWordKnownOrNumber(word, line) && !localIgnoreWords.Contains(word)) - { - var correct = false; - if (word.Length > 1) - { - if (_wordSpellOkList.Contains(word)) - { - correct = true; - } - else if (DoSpell(word)) - { - correct = true; - _wordSpellOkList.Add(word); - } - - if (!correct) - { - correct = word.Length > minLength + 1 && DoSpell(word.Trim('\'')); - } - - if (!correct && word.Length > 3 && !word.EndsWith("ss", StringComparison.Ordinal) && !string.IsNullOrEmpty(_threeLetterIsoLanguageName) && - (_threeLetterIsoLanguageName == "eng" || _threeLetterIsoLanguageName == "dan" || _threeLetterIsoLanguageName == "swe" || _threeLetterIsoLanguageName == "nld")) - { - correct = DoSpell(word.TrimEnd('s')); - } - } - else - { - correct = !Configuration.Settings.Tools.CheckOneLetterWords; // hunspell allows too many single letter words - } - - if (!correct && _userWordList.Contains(word)) - { - correct = true; - } - - if (!correct && !line.Contains(word, StringComparison.Ordinal)) - { - correct = true; // already fixed - } - - if (!correct && Configuration.Settings.Tools.SpellCheckEnglishAllowInQuoteAsIng && wordNotEndTrimmed.EndsWith('\'') && - SpellCheckDictionaryName.StartsWith("en_", StringComparison.Ordinal) && word.EndsWith("in", StringComparison.OrdinalIgnoreCase)) - { - correct = DoSpell(word + "g"); - } - - if (_threeLetterIsoLanguageName == "eng" && (word.Equals("a", StringComparison.OrdinalIgnoreCase) || word == "I")) - { - correct = true; - } - else if (_threeLetterIsoLanguageName == "dan" && word.Equals("i", StringComparison.OrdinalIgnoreCase)) - { - correct = true; - } - - if (!correct && _threeLetterIsoLanguageName.Equals("ara", StringComparison.Ordinal)) - { - var trimmed = word.Trim('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', ',', '،', '؟', '»'); - if (trimmed != word) - { - if (_userWordList.Contains(trimmed)) - { - correct = true; - } - else - { - correct = DoSpell(trimmed); - } - } - } - - if (!correct) - { - //look for match via dash'ed word, e.g. sci-fi - string dashedWord = GetDashedWordBefore(word, line, words, i); - if (!string.IsNullOrEmpty(dashedWord)) - { - correct = IsWordKnownOrNumber(dashedWord, line); - if (!correct) - { - correct = DoSpell(dashedWord); - } - } - if (!correct) - { - dashedWord = GetDashedWordAfter(word, line, words, i); - if (!string.IsNullOrEmpty(dashedWord)) - { - correct = IsWordKnownOrNumber(dashedWord, line); - if (!correct) - { - correct = DoSpell(dashedWord); - } - } - } - - if (!correct && _spellCheckWordLists.HasUserWord("-" + word)) - { - correct = true; - } - } - - if (!correct && word.Contains('/') && !word.Contains("//", StringComparison.Ordinal)) - { - correct = word.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries) - .All(w => w.Length > 2 && (DoSpell(w) || IsWordKnownOrNumber(word, line))); - } - - if (!correct && word.Length == 1 && i < words.Count - 1 && words[i + 1].Length == 1) - { - var abbreviation = word + "." + words[i + 1] + "."; - if (_abbreviationList.Contains(abbreviation) && line.Contains(abbreviation, StringComparison.Ordinal)) - { - correct = true; - words[i + 1] = string.Empty; - } - else if (i < words.Count - 2 && words[i + 2].Length == 1) - { - abbreviation = word + "." + words[i + 1] + "." + words[i + 2] + "."; - if (_abbreviationList.Contains(abbreviation) && line.Contains(abbreviation, StringComparison.Ordinal)) - { - correct = true; - words[i + 1] = string.Empty; - words[i + 2] = string.Empty; - } - } - } - - if (word.Length == 0) - { - correct = true; - } - - if (!correct) - { - wordsNotFound++; - if (log) - { - string nf = word; - if (nf.StartsWith("<i>", StringComparison.Ordinal)) - { - nf = nf.Remove(0, 3); - } - - if (nf.Trim().Length > 0) - { - UnknownWordsFound.Add(new UnknownWord(index, nf)); - } - } - - if (autoFix && autoGuess != AutoGuessLevel.None) - { - var guesses = new List<string>(); - - // Name starting with "l" instead of 'I' - if (word.StartsWith('l') && word.Length > 3 && !_nameList.Contains(word)) - { - var w = "I" + word.Substring(1); - if (_nameList.Contains(w)) - { - guesses.Add(w); - } - } - - if (!correct && autoFix && word.Length > 3 && char.IsUpper(word[0]) && !_nameList.Contains(word)) - { - var rest = word.Substring(1); - if (rest != rest.ToUpperInvariant()) - { - var newWord = word[0] + rest.ToLowerInvariant(); - if (_nameList.Contains(newWord)) - { - guesses.Add(newWord); - } - } - } - - var wordWithVerticalLine = word.Replace("|", "l"); - if (word.Length > 3 && DoSpell(wordWithVerticalLine)) - { - if (word == word.ToUpperInvariant()) - { - wordWithVerticalLine = wordWithVerticalLine.ToUpperInvariant(); - } - - guesses.Add(wordWithVerticalLine); - } - - if (word.Length > 4 && autoGuess == AutoGuessLevel.Aggressive) - { - guesses.AddRange((List<string>)_ocrFixReplaceList.CreateGuessesFromLetters(word)); - - if (word[0] == 'L') - { - guesses.Add("I" + word.Substring(1)); - } - - if (word.Contains('$')) - { - guesses.Add(word.Replace("$", "s")); - } - - if (word.Contains('l') && word.RemoveChar('l').Length > 3) - { - var lowerLToUpperI = word.Replace('l', 'I'); - if (lowerLToUpperI == lowerLToUpperI.ToUpperInvariant()) - { - guesses.Add(lowerLToUpperI); - } - } - - string wordWithCasingChanged = GetWordWithDominatedCasing(word); - if (DoSpell(word.ToLowerInvariant())) - { - guesses.Insert(0, wordWithCasingChanged); - } - } - else if (Configuration.Settings.Tools.OcrFixUseHardcodedRules) - { - if (word.Length > 2 && word[0] == 'L') - { - guesses.Add("I" + word.Substring(1)); - } - - if (word.Length > 2 && word[0] == 'I' && char.IsLower(word[1])) - { - guesses.Add("l" + word.Substring(1)); - } - - if (i == 0) - { - guesses.Add(word.Replace(@"\/", "V")); - } - else - { - guesses.Add(word.Replace(@"\/", "v")); - } - - guesses.Add(word.Replace("fi", "fi")); - guesses.Add(word.Replace("fi", "fj")); - guesses.Add(word.Replace("fl", "fl")); - if (word.Contains('$')) - { - guesses.Add(word.Replace("$", "s")); - } - - if (!word.EndsWith('€') && !word.StartsWith('€')) - { - guesses.Add(word.Replace("€", "e")); - } - - guesses.Add(word.Replace("/", "l")); - guesses.Add(word.Replace(")/", "y")); - } - foreach (string guess in guesses) - { - if (!(guess.Length == 2 && guess[1] == ' ') && IsWordOrWordsCorrect(guess)) - { - string replacedLine = OcrFixReplaceList.ReplaceWord(line, word, guess); - if (replacedLine != line) - { - if (log) - { - AutoGuessesUsed.Add(new AutoGuess(index, word, guess, line)); - } - - line = replacedLine; - wordsNotFound--; - if (log && UnknownWordsFound.Count > 0) - { - UnknownWordsFound.RemoveAt(UnknownWordsFound.Count - 1); - } - - correct = true; - break; - } - } - } - } - if (!correct && promptForFixingErrors) - { - var suggestions = new List<string>(); - - if ((word == "Lt's" || word == "Lt'S") && SpellCheckDictionaryName.StartsWith("en_", StringComparison.Ordinal)) - { - suggestions.Add("It's"); - } - else - { - if (word.ToUpperInvariant() != "LT'S" && word.ToUpperInvariant() != "SOX'S") // TODO: Get fixed nhunspell - { - suggestions = DoSuggest(word); // 0.9.6 fails on "Lt'S" - } - } - - if (word.StartsWith("<i>", StringComparison.Ordinal)) - { - word = word.Remove(0, 3); - } - - if (word.EndsWith("</i>", StringComparison.Ordinal)) - { - word = word.Remove(word.Length - 4, 4); - } - - SpellCheckOcrTextResult res = SpellCheckOcrText(line, bitmap, word, suggestions); - if (Abort) - { - return null; - } - if (res.FixedWholeLine) - { - return res.Line; - } - if (res.Fixed) - { - localIgnoreWords.Add(word); - line = res.Line; - wordsNotFound--; - } - } - } - } - } - return line; - } - - private static string GetDashedWordBefore(string word, string line, List<string> words, int index) - { - if (index > 0 && line.Contains(words[index - 1] + "-" + word, StringComparison.Ordinal)) - { - return HtmlUtil.RemoveOpenCloseTags(words[index - 1] + "-" + word, HtmlUtil.TagItalic); - } - - return null; - } - - private static string GetDashedWordAfter(string word, string line, List<string> words, int index) - { - if (index < words.Count - 1 && line.Contains(word + "-" + words[index + 1].Replace("</i>", string.Empty), StringComparison.Ordinal)) - { - return HtmlUtil.RemoveOpenCloseTags(word + "-" + words[index + 1], HtmlUtil.TagItalic); - } - - return null; - } - - private static string GetWordWithDominatedCasing(string word) - { - int lowercase = 0; - int uppercase = 0; - for (int i = 0; i < word.Length; i++) - { - var ch = word[i]; - if (char.IsLower(ch)) - { - lowercase++; - } - else if (char.IsUpper(ch)) - { - uppercase++; - } - } - if (uppercase > lowercase) - { - return word.ToUpperInvariant(); - } - - return word.ToLowerInvariant(); - } - - /// <summary> - /// SpellCheck for OCR - /// </summary> - /// <returns>True, if word is fixed</returns> - private SpellCheckOcrTextResult SpellCheckOcrText(string line, Bitmap bitmap, string word, List<string> suggestions) - { - var result = new SpellCheckOcrTextResult { Fixed = false, FixedWholeLine = false, Line = null, Word = null }; - _spellCheck.Initialize(word, suggestions, line, bitmap, IsBinaryImageCompareOrNOcr); - _spellCheck.ShowDialog(_parentForm); - LastAction = _spellCheck.ActionResult; - switch (_spellCheck.ActionResult) - { - case OcrSpellCheck.Action.Abort: - Abort = true; - break; - case OcrSpellCheck.Action.AddToUserDictionary: - if (_userWordListXmlFileName != null) - { - Utilities.AddToUserDictionary(_spellCheck.Word.Trim().ToLowerInvariant(), _fiveLetterWordListLanguageName); - _userWordList.Add(_spellCheck.Word.Trim().ToLowerInvariant()); - } - result.Word = _spellCheck.Word; - result.Fixed = true; - result.Line = line; - if (word == result.Word) - { - return result; - } - - break; - case OcrSpellCheck.Action.AddToNames: - case OcrSpellCheck.Action.AddToNamesOnly: - result.Word = _spellCheck.Word; - result.Fixed = true; - try - { - string s = _spellCheck.Word.Trim(); - _nameListObj?.Add(s); - if (s.Contains(' ')) - { - _nameMultiWordList.Add(s); - } - else - { - _nameList.Add(s); - _nameListUppercase.Add(s.ToUpperInvariant()); - if (_fiveLetterWordListLanguageName.StartsWith("en", StringComparison.Ordinal)) - { - if (!s.EndsWith('s')) - { - _nameListWithApostrophe.Add(s + "'s"); - } - else - { - _nameListWithApostrophe.Add(s + "'"); - } - } - } - } - catch - { - _wordSkipList.Add(_spellCheck.Word); - } - result.Line = line; - if (word == result.Word || _spellCheck.ActionResult == OcrSpellCheck.Action.AddToNamesOnly) - { - return result; - } - - break; - case OcrSpellCheck.Action.AlwaysUseSuggestion: - try - { - _ocrFixReplaceList.AddWordOrPartial(word, _spellCheck.Word); - if (!word.Contains(' ')) - { - _spellCheckWordLists?.UseAlwaysListAdd(word, _spellCheck.Word); - } - } - catch (Exception exception) - { - MessageBox.Show(exception + Environment.NewLine + exception.StackTrace); - _wordSkipList.Add(word); - } - result.Fixed = true; - result.Word = _spellCheck.Word; - break; - case OcrSpellCheck.Action.ChangeAndSave: - try - { - _ocrFixReplaceList.AddWordOrPartial(word, _spellCheck.Word); - } - catch (Exception exception) - { - MessageBox.Show(exception + Environment.NewLine + exception.StackTrace); - _wordSkipList.Add(word); - } - result.Fixed = true; - result.Word = _spellCheck.Word; - break; - case OcrSpellCheck.Action.ChangeOnce: - result.Fixed = true; - result.Word = _spellCheck.Word; - break; - case OcrSpellCheck.Action.ChangeWholeText: - result.Line = _spellCheck.Paragraph; - result.FixedWholeLine = true; - break; - case OcrSpellCheck.Action.ChangeAllWholeText: - _ocrFixReplaceList.AddToWholeLineList(_spellCheck.OriginalWholeText, _spellCheck.Paragraph); - result.Line = _spellCheck.Paragraph; - result.FixedWholeLine = true; - break; - case OcrSpellCheck.Action.SkipAll: - _wordSkipList.Add(_spellCheck.Word); - _wordSkipList.Add(_spellCheck.Word.ToUpperInvariant()); - if (_spellCheck.Word.Length > 1) - { - _wordSkipList.Add(char.ToUpper(_spellCheck.Word[0]) + _spellCheck.Word.Substring(1)); - } - - break; - case OcrSpellCheck.Action.SkipOnce: - break; - case OcrSpellCheck.Action.SkipWholeText: - result.Line = line; - result.FixedWholeLine = true; - break; - case OcrSpellCheck.Action.UseSuggestion: - result.Word = _spellCheck.Word; - result.Fixed = true; - break; - case OcrSpellCheck.Action.InspectCompareMatches: - Abort = true; - break; - } - if (result.Fixed) - { - result.Line = OcrFixReplaceList.ReplaceWord(line, word, result.Word); - } - return result; - } - - public bool DoSpell(string word) - { - return _hunspell.Spell(word); - } - - public List<string> DoSuggest(string word) - { - return _hunspell.Suggest(word); - } - - public bool IsWordOrWordsCorrect(string word) - { - foreach (string s in word.Split(' ')) - { - if (!DoSpell(s)) - { - if (IsWordKnownOrNumber(word, word)) - { - return true; - } - - if (s.Length > 10 && s.Contains('/')) - { - string[] ar = s.Split('/'); - if (ar.Length == 2) - { - if (ar[0].Length > 3 && ar[1].Length > 3) - { - string a = ar[0]; - if (a == a.ToUpperInvariant()) - { - a = a[0] + a.Substring(1).ToLowerInvariant(); - } - - string b = ar[0]; - if (b == b.ToUpperInvariant()) - { - b = b[0] + b.Substring(1).ToLowerInvariant(); - } - - if ((DoSpell(a) || IsWordKnownOrNumber(a, word)) && - (DoSpell(b) || IsWordKnownOrNumber(b, word))) - { - return true; - } - } - } - } - return false; - } - } - return true; - } - - public bool IsWordKnownOrNumber(string word, string line) - { - if (double.TryParse(word.TrimStart('\'').Replace("$", string.Empty).Replace("£", string.Empty).Replace("¢", string.Empty), out _)) - { - return true; - } - - if (_wordSkipList.Contains(word)) - { - return true; - } - - if (_nameList.Contains(word.Trim('\''))) - { - return true; - } - - if (_nameListUppercase.Contains(word.Trim('\''))) - { - return true; - } - - if (_userWordList.Contains(word.ToLowerInvariant())) - { - return true; - } - - if (_userWordList.Contains(word.Trim('\'').ToLowerInvariant())) - { - return true; - } - - if (word.Length > 2 && _nameListUppercase.Contains(word)) - { - return true; - } - - if (word.Length > 2 && _nameListWithApostrophe.Contains(word)) - { - return true; - } - - if (_nameListObj != null && _nameListObj.IsInNamesMultiWordList(line, word)) - { - return true; - } - - return false; - } - - public int CountUnknownWordsViaDictionary(string line, out int numberOfCorrectWords) - { - numberOfCorrectWords = 0; - if (_hunspell == null) - { - return 0; - } - - int minLength = 2; - if (Configuration.Settings.Tools.CheckOneLetterWords) - { - minLength = 1; - } - - int wordsNotFound = 0; - var words = HtmlUtil.RemoveOpenCloseTags(line, HtmlUtil.TagItalic).Split(" \r\n\t".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); - for (int i = 0; i < words.Length; i++) - { - string word = words[i].Trim(SpellCheckWordLists.SplitChars.ToArray()); - if (word.Length >= minLength) - { - if (!IsWordKnownOrNumber(word, line)) - { - bool correct = word.Length > 1 && _hunspell.Spell(word); - if (!correct) - { - correct = word.Length > 2 && _hunspell.Spell(word.Trim('\'')); - } - - if (!correct && word.Length == 1 && _threeLetterIsoLanguageName == "eng" && (word == "I" || word == "A" || word == "a")) - { - correct = true; - } - - if (correct) - { - numberOfCorrectWords++; - } - else - { - wordsNotFound++; - } - } - else if (word.Length > 3) - { - numberOfCorrectWords++; - } - } - } - return wordsNotFound; - } - - public void Dispose() - { - if (_hunspell != null) - { - _hunspell.Dispose(); - _hunspell = null; - } - if (_spellCheck != null) - { - _spellCheck.Dispose(); - _spellCheck = null; - } - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.Dictionaries; +using Nikse.SubtitleEdit.Core.Forms.FixCommonErrors; +using Nikse.SubtitleEdit.Core.Interfaces; +using Nikse.SubtitleEdit.Core.SpellCheck; +using Nikse.SubtitleEdit.Forms; +using Nikse.SubtitleEdit.Forms.Ocr; +using Nikse.SubtitleEdit.Logic.SpellCheck; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Windows.Forms; +using System.Xml; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Logic.Ocr +{ + public class OcrFixEngine : IDisposable, IDoSpell + { + public abstract class LogItem + { + public int Line { get; set; } + public string Text { get; } + + protected LogItem(int line, string text) + { + Line = line; + Text = text.Trim(); + } + + public override string ToString() + { + return $"#{Line}: {Text}"; + } + } + + private class AutoGuess : LogItem + { + public AutoGuess(int index, string word, string guess, string line) + : base(index + 1, string.Format(Configuration.Settings.Language.VobSubOcr.UnknownWordToGuessInLine, word, guess, line.Replace(Environment.NewLine, " "))) + { + } + } + + private class UnknownWord : LogItem + { + public UnknownWord(int index, string word) + : base(index + 1, word) + { + } + } + + public enum AutoGuessLevel + { + None, + Cautious, + Aggressive + } + + private string _userWordListXmlFileName; + private string _fiveLetterWordListLanguageName; + + private readonly OcrFixReplaceList _ocrFixReplaceList; + private NameList _nameListObj; + private HashSet<string> _nameList = new HashSet<string>(); + private HashSet<string> _nameListUppercase = new HashSet<string>(); + private HashSet<string> _nameListWithApostrophe = new HashSet<string>(); + private HashSet<string> _nameMultiWordList = new HashSet<string>(); // case sensitive phrases + private List<string> _nameMultiWordListAndWordsWithPeriods; + private HashSet<string> _abbreviationList; + private HashSet<string> _userWordList = new HashSet<string>(); + private HashSet<string> _wordSkipList = new HashSet<string>(); + private readonly HashSet<string> _wordSpellOkList = new HashSet<string>(); + private Hunspell _hunspell; + private Dictionary<string, string> _changeAllDictionary; + private SpellCheckWordLists _spellCheckWordLists; + private OcrSpellCheck _spellCheck; + private readonly Form _parentForm; + private string _spellCheckDictionaryName; + private readonly string _threeLetterIsoLanguageName; + + private static readonly Regex RegexAloneIasL = new Regex(@"\bl\b", RegexOptions.Compiled); + private static readonly Regex RegexLowercaseL = new Regex("[A-ZÆØÅÄÖÉÈÀÙÂÊÎÔÛËÏ]l[A-ZÆØÅÄÖÉÈÀÙÂÊÎÔÛËÏ]", RegexOptions.Compiled); + private static readonly Regex RegexUppercaseI = new Regex("[a-zæøåöääöéèàùâêîôûëï]I.", RegexOptions.Compiled); + private static readonly Regex RegexNumber1 = new Regex(@"(?<=\d) 1(?!/\d)", RegexOptions.Compiled); + + public bool Abort { get; set; } + public OcrSpellCheck.Action LastAction { get; set; } = OcrSpellCheck.Action.Abort; + public bool IsBinaryImageCompareOrNOcr { get; set; } + public List<LogItem> AutoGuessesUsed { get; set; } + public List<LogItem> UnknownWordsFound { get; set; } + public bool IsDictionaryLoaded { get; private set; } + + private readonly HashSet<char> _expectedChars = new HashSet<char> { ' ', '¡', '¿', ',', '.', '!', '?', ':', ';', '(', ')', '[', ']', '{', '}', '+', '-', '£', '\\', '"', '”', '„', '“', '«', '»', '#', '&', '%', '\r', '\n', '؟' }; // removed $ + private readonly HashSet<char> _expectedCharsNoComma = new HashSet<char> { ' ', '¡', '¿', '.', '!', '?', ':', ';', '(', ')', '[', ']', '{', '}', '+', '-', '£', '\\', '"', '”', '„', '“', '«', '»', '#', '&', '%', '\r', '\n', '؟' }; // removed $ + comma + + /// <summary> + /// Advanced OCR fixing via replace/spelling dictionaries + some hardcoded rules + /// </summary> + /// <param name="threeLetterIsoLanguageName">E.g. eng for English</param> + /// <param name="hunspellName">Name of hunspell dictionary</param> + /// <param name="parentForm">Used for centering/show spell check dialog</param> + /// <param name="isBinaryImageCompare">Calling from OCR via "Image compare"</param> + public OcrFixEngine(string threeLetterIsoLanguageName, string hunspellName, Form parentForm, bool isBinaryImageCompareOrNOcr = false) + { + if (string.IsNullOrEmpty(threeLetterIsoLanguageName)) + { + if (hunspellName != null && hunspellName.Length >= 2) + { + threeLetterIsoLanguageName = Iso639Dash2LanguageCode.GetThreeLetterCodeFromTwoLetterCode(hunspellName.Substring(0, 2)); + } + else + { + threeLetterIsoLanguageName = string.Empty; + } + } + + IsBinaryImageCompareOrNOcr = isBinaryImageCompareOrNOcr; + if (threeLetterIsoLanguageName == "per") + { + threeLetterIsoLanguageName = "fas"; + } + + _threeLetterIsoLanguageName = threeLetterIsoLanguageName; + _parentForm = parentForm; + + if (parentForm.GetType() != typeof(FixCommonErrors)) + { + _spellCheck = new OcrSpellCheck(_parentForm) { StartPosition = FormStartPosition.Manual, IsBinaryImageCompareOrNOcr = isBinaryImageCompareOrNOcr }; + _spellCheck.Location = new Point(parentForm.Left + (parentForm.Width / 2 - _spellCheck.Width / 2), + parentForm.Top + (parentForm.Height / 2 - _spellCheck.Height / 2)); + } + + _ocrFixReplaceList = OcrFixReplaceList.FromLanguageId(threeLetterIsoLanguageName); + if (!string.IsNullOrEmpty(threeLetterIsoLanguageName) || !string.IsNullOrEmpty(hunspellName)) + { + LoadSpellingDictionaries(threeLetterIsoLanguageName, hunspellName); // Hunspell etc. + } + + AutoGuessesUsed = new List<LogItem>(); + UnknownWordsFound = new List<LogItem>(); + } + + private void LoadSpellingDictionaries(string threeLetterIsoLanguageName, string hunspellName) + { + string dictionaryFolder = Utilities.DictionaryFolder; + if (!Directory.Exists(dictionaryFolder)) + { + return; + } + + if (!string.IsNullOrEmpty(hunspellName)) + { + var directDicFile = Path.Combine(dictionaryFolder, hunspellName + ".dic"); + if (File.Exists(directDicFile)) + { + LoadSpellingDictionariesViaDictionaryFileName(threeLetterIsoLanguageName, directDicFile, true); + return; + } + } + + if (!string.IsNullOrEmpty(hunspellName) && threeLetterIsoLanguageName == "eng" && hunspellName.Equals("en_gb", StringComparison.OrdinalIgnoreCase) && File.Exists(Path.Combine(dictionaryFolder, "en_GB.dic"))) + { + LoadSpellingDictionariesViaDictionaryFileName("eng", "en_GB.dic", true); + return; + } + if (!string.IsNullOrEmpty(hunspellName) && threeLetterIsoLanguageName == "eng" && hunspellName.Equals("en-gb", StringComparison.OrdinalIgnoreCase) && File.Exists(Path.Combine(dictionaryFolder, "en-GB.dic"))) + { + LoadSpellingDictionariesViaDictionaryFileName("eng", "en-GB.dic", true); + return; + } + if (!string.IsNullOrEmpty(hunspellName) && threeLetterIsoLanguageName == "eng" && hunspellName.Equals("en_ca", StringComparison.OrdinalIgnoreCase) && File.Exists(Path.Combine(dictionaryFolder, "en_CA.dic"))) + { + LoadSpellingDictionariesViaDictionaryFileName("eng", "en_CA.dic", true); + return; + } + if (!string.IsNullOrEmpty(hunspellName) && threeLetterIsoLanguageName == "eng" && hunspellName.Equals("en_au", StringComparison.OrdinalIgnoreCase) && File.Exists(Path.Combine(dictionaryFolder, "en_AU.dic"))) + { + LoadSpellingDictionariesViaDictionaryFileName("eng", "en_AU.dic", true); + return; + } + if (!string.IsNullOrEmpty(hunspellName) && threeLetterIsoLanguageName == "eng" && hunspellName.Equals("en_za", StringComparison.OrdinalIgnoreCase) && File.Exists(Path.Combine(dictionaryFolder, "en_ZA.dic"))) + { + LoadSpellingDictionariesViaDictionaryFileName("eng", "en_ZA.dic", true); + return; + } + if (threeLetterIsoLanguageName == "eng" && File.Exists(Path.Combine(dictionaryFolder, "en_US.dic"))) + { + LoadSpellingDictionariesViaDictionaryFileName("eng", "en_US.dic", true); + return; + } + + foreach (var culture in Iso639Dash2LanguageCode.List) + { + if (culture.ThreeLetterCode == threeLetterIsoLanguageName) + { + string dictionaryFileName = null; + if (!string.IsNullOrEmpty(hunspellName) && hunspellName.StartsWith(culture.TwoLetterCode, StringComparison.OrdinalIgnoreCase) && File.Exists(Path.Combine(dictionaryFolder, hunspellName + ".dic"))) + { + dictionaryFileName = Path.Combine(dictionaryFolder, hunspellName + ".dic"); + LoadSpellingDictionariesViaDictionaryFileName(threeLetterIsoLanguageName, dictionaryFileName, true); + return; + } + foreach (string dic in Directory.GetFiles(dictionaryFolder, "*.dic")) + { + string name = Path.GetFileNameWithoutExtension(dic); + if (!string.IsNullOrEmpty(name) && !name.StartsWith("hyph", StringComparison.Ordinal)) + { + try + { + name = name.Replace('_', '-'); + if (name.Length > 5) + { + name = name.Substring(0, 5); + } + + var ci = CultureInfo.GetCultureInfo(name); + if (ci.GetThreeLetterIsoLanguageName() == threeLetterIsoLanguageName || + ci.GetThreeLetterIsoLanguageName().Equals(threeLetterIsoLanguageName, StringComparison.OrdinalIgnoreCase)) + { + dictionaryFileName = dic; + break; + } + } + catch (Exception exception) + { + System.Diagnostics.Debug.WriteLine(exception.Message); + } + } + } + + if (dictionaryFileName == null) + { + return; + } + + LoadSpellingDictionariesViaDictionaryFileName(threeLetterIsoLanguageName, dictionaryFileName, true); + return; + } + } + + string dicFileName = null; + foreach (string dic in Directory.GetFiles(dictionaryFolder, "*.dic")) + { + string name = Path.GetFileNameWithoutExtension(dic); + if (!string.IsNullOrEmpty(name) && !name.StartsWith("hyph", StringComparison.Ordinal)) + { + try + { + name = name.Replace('_', '-'); + if (name.Length > 5) + { + name = name.Substring(0, 5); + } + + var ci = CultureInfo.GetCultureInfo(name); + if (ci.GetThreeLetterIsoLanguageName() == threeLetterIsoLanguageName || + ci.GetThreeLetterIsoLanguageName().Equals(threeLetterIsoLanguageName, StringComparison.OrdinalIgnoreCase)) + { + dicFileName = dic; + break; + } + } + catch (Exception exception) + { + System.Diagnostics.Debug.WriteLine(exception.Message); + } + } + } + + if (dicFileName == null) + { + return; + } + + LoadSpellingDictionariesViaDictionaryFileName(threeLetterIsoLanguageName, dicFileName, true); + } + + private void LoadSpellingDictionariesViaDictionaryFileName(string threeLetterIsoLanguageName, string dictionaryFileName, bool resetSkipList) + { + _fiveLetterWordListLanguageName = Path.GetFileNameWithoutExtension(dictionaryFileName); + if (_fiveLetterWordListLanguageName != null && _fiveLetterWordListLanguageName.Length > 5) + { + _fiveLetterWordListLanguageName = _fiveLetterWordListLanguageName.Substring(0, 5); + } + + string dictionary = Utilities.DictionaryFolder + _fiveLetterWordListLanguageName; + if (resetSkipList) + { + _wordSkipList = new HashSet<string> { Configuration.Settings.Tools.MusicSymbol, "*", "%", "#", "+", "$" }; + } + + // Load names etc list (names/noise words) + _nameListObj = new NameList(Configuration.DictionariesDirectory, _fiveLetterWordListLanguageName, Configuration.Settings.WordLists.UseOnlineNames, Configuration.Settings.WordLists.NamesUrl); + _nameList = _nameListObj.GetNames(); + _nameMultiWordList = _nameListObj.GetMultiNames(); + _nameListUppercase = new HashSet<string>(); + _nameListWithApostrophe = new HashSet<string>(); + var nameListWithPeriods = new List<string>(); + _abbreviationList = new HashSet<string>(); + + bool isEnglish = threeLetterIsoLanguageName.Equals("eng", StringComparison.OrdinalIgnoreCase); + foreach (string name in _nameList) + { + _nameListUppercase.Add(name.ToUpperInvariant()); + if (isEnglish) + { + if (!name.EndsWith('s')) + { + _nameListWithApostrophe.Add(name + "'s"); + } + else + { + _nameListWithApostrophe.Add(name + "'"); + } + } + + // Abbreviations. + if (name.EndsWith('.')) + { + _abbreviationList.Add(name); + } + + if (name.Contains(".", StringComparison.Ordinal)) + { + nameListWithPeriods.Add(name); + } + } + + _nameMultiWordListAndWordsWithPeriods = new List<string>(_nameMultiWordList.Concat(nameListWithPeriods)); + if (isEnglish) + { + if (!_abbreviationList.Contains("a.m.")) + { + _abbreviationList.Add("a.m."); + } + + if (!_abbreviationList.Contains("p.m.")) + { + _abbreviationList.Add("p.m."); + } + + if (!_abbreviationList.Contains("o.r.")) + { + _abbreviationList.Add("o.r."); + } + } + + // Load user words + _userWordList = new HashSet<string>(); + _userWordListXmlFileName = Utilities.LoadUserWordList(_userWordList, _fiveLetterWordListLanguageName); + foreach (string name in _userWordList) + { + if (name.EndsWith('.')) + { + _abbreviationList.Add(name); + } + } + + // Load Hunspell spell checker + try + { + if (dictionaryFileName.EndsWith(".dic", StringComparison.OrdinalIgnoreCase) && File.Exists(dictionaryFileName)) + { + dictionary = dictionaryFileName.Substring(0, dictionaryFileName.Length - 4); + } + else if (dictionaryFileName.EndsWith(".dic", StringComparison.OrdinalIgnoreCase) && File.Exists(Path.Combine(Utilities.DictionaryFolder, dictionaryFileName))) + { + var f = Path.Combine(Utilities.DictionaryFolder, dictionaryFileName); + dictionary = f.Substring(0, f.Length - 4); + } + else if (!File.Exists(dictionary + ".dic")) + { + var fileMatches = Directory.GetFiles(Utilities.DictionaryFolder, _fiveLetterWordListLanguageName + "*.dic"); + if (fileMatches.Length > 0) + { + dictionary = fileMatches[0].Substring(0, fileMatches[0].Length - 4); + } + } + _hunspell?.Dispose(); + _hunspell = Hunspell.GetHunspell(dictionary); + IsDictionaryLoaded = true; + _spellCheckDictionaryName = dictionary; + } + catch + { + IsDictionaryLoaded = false; + } + + // load spell check "change all" list + if (_hunspell != null) + { + var languageName = Path.GetFileName(_spellCheckDictionaryName); + if (!string.IsNullOrEmpty(languageName)) + { + _spellCheckWordLists = new SpellCheckWordLists(Utilities.DictionaryFolder, languageName, this); + _changeAllDictionary = _spellCheckWordLists.GetUseAlwaysList(); + } + } + } + + public string SpellCheckDictionaryName + { + get + { + string[] parts = _spellCheckDictionaryName?.Split(new[] { Path.DirectorySeparatorChar }, StringSplitOptions.RemoveEmptyEntries); + if (parts?.Length > 0) + { + return parts[parts.Length - 1]; + } + + return string.Empty; + } + } + + internal static Dictionary<string, string> LoadReplaceList(XmlDocument doc, string name) + { + var list = new Dictionary<string, string>(); + XmlNode node = doc.DocumentElement?.SelectSingleNode(name); + if (node != null) + { + foreach (XmlNode item in node.ChildNodes) + { + if (item.Attributes?["to"] != null && item.Attributes["from"] != null) + { + string to = item.Attributes["to"].InnerText; + string from = item.Attributes["from"].InnerText; + if (!list.ContainsKey(from)) + { + list.Add(from, to); + } + } + } + } + return list; + } + + internal static Dictionary<string, string> LoadRegExList(XmlDocument doc, string name) + { + var list = new Dictionary<string, string>(); + XmlNode node = doc.DocumentElement?.SelectSingleNode(name); + if (node != null) + { + foreach (XmlNode item in node.ChildNodes) + { + if (item.Attributes?["replaceWith"] != null && item.Attributes["find"] != null) + { + string to = item.Attributes["replaceWith"].InnerText; + string from = item.Attributes["find"].InnerText; + if (!list.ContainsKey(from)) + { + list.Add(from, to); + } + } + } + } + return list; + } + + public string FixOcrErrors(string input, int index, string lastLine, bool logSuggestions, AutoGuessLevel autoGuess) + { + var text = input; + while (text.Contains(Environment.NewLine + " ", StringComparison.Ordinal)) + { + text = text.Replace(Environment.NewLine + " ", Environment.NewLine); + } + + while (text.Contains(" " + Environment.NewLine, StringComparison.Ordinal)) + { + text = text.Replace(" " + Environment.NewLine, Environment.NewLine); + } + + while (text.Contains(Environment.NewLine + Environment.NewLine, StringComparison.Ordinal)) + { + text = text.Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); + } + + text = text.Trim(); + + // Try to prevent resizing when fixing Ocr-hardcoded. + var sb = new StringBuilder(text.Length + 2); + + if (Configuration.Settings.Tools.OcrFixUseHardcodedRules) + { + if (text.Length > 3 && text.StartsWith(". .") && char.IsLetter(text[3])) + { + text = text.Remove(1, 1).Insert(1, "."); + } + else if (text.Length > 3 && text.StartsWith(".. ") && char.IsLetter(text[3])) + { + text = text.Remove(2, 1).Insert(2, "."); + } + else if (text.Length > 3 && text.StartsWith("..") && char.IsLetter(text[2])) + { + text = "." + text; + } + + text = text.Replace("<i>-</i>", "-"); + text = text.Replace("<i>- </i>", "- "); + text = text.Replace("<i> - </i>", "- "); + text = text.Replace("<i> -</i>", "- "); + text = text.Replace("- ", "- "); + text = text.Replace("<i>a</i>", "a"); + text = text.Replace("<i>.</i>", "."); + text = text.TrimStart(); + + int len = text.Length; + for (int i = 0; i < len; i++) + { + char ch = text[i]; + switch (ch) + { + case 'fi': + sb.Append("fi"); + break; + case 'fl': // fb02 + sb.Append("fl"); + break; + case 'ν': // NOTE: Special unicode character! (Greek character!) + if (_threeLetterIsoLanguageName == "ell" || _threeLetterIsoLanguageName == "gre") + { + sb.Append(ch); // Keep Greek 'ν' + } + else + { + sb.Append('v'); + } + break; + case '‚': // #x201A (SINGLE LOW-9 QUOTATION MARK) to plain old comma + sb.Append(','); + break; + default: + sb.Append(ch); + break; + } + } + text = sb.ToString(); + sb.Clear(); + } + + text = ReplaceWordsBeforeLineFixes(text); + + text = FixCommonOcrLineErrors(text, lastLine); + + // check words split by only space and new line (as other split chars might by a part of from-replace-string, like "\/\/e're" contains slash) + sb = new StringBuilder(); + var word = new StringBuilder(); + string lastWord = null; + for (int i = 0; i < text.Length; i++) + { + if (text[i] != '.' && "\r\n ".Contains(text[i])) + { + if (word.Length > 0) + { + var fixedWord = FixOcrErrorsWord(lastWord, word, sb); + lastWord = fixedWord; + word.Clear(); + } + sb.Append(text[i]); + } + else + { + word.Append(text[i]); + } + } + if (word.Length > 0) // last word + { + FixOcrErrorsWord(lastWord, word, sb); + } + + // check words split by many chars like "()/-" etc. + text = sb.ToString(); + sb = new StringBuilder(); + word = new StringBuilder(); + lastWord = null; + for (int i = 0; i < text.Length; i++) + { + if (text[i] != '.' && _expectedChars.Contains(text[i])) + { + if (word.Length > 0) + { + var fixedWord = FixOcrErrorsWord(lastWord, word, sb); + lastWord = fixedWord; + word.Clear(); + } + sb.Append(text[i]); + } + else + { + word.Append(text[i]); + } + } + if (word.Length > 0) // last word + { + FixOcrErrorsWord(lastWord, word, sb); + } + + text = FixCommonOcrLineErrors(sb.ToString(), lastLine); + if (Configuration.Settings.Tools.OcrFixUseHardcodedRules) + { + text = FixLowercaseIToUppercaseI(text, lastLine); + if (SpellCheckDictionaryName.StartsWith("en_", StringComparison.Ordinal) || _threeLetterIsoLanguageName == "eng") + { + string oldText = text; + text = FixAloneLowercaseIToUppercaseI.FixAloneLowercaseIToUppercaseLine(RegexUtils.LittleIRegex, oldText, text, 'i'); + text = FixAloneLowercaseIToUppercaseI.FixAloneLowercaseIToUppercaseLine(RegexAloneIasL, oldText, text, 'l'); + } + else if (_threeLetterIsoLanguageName == "fra") + { + text = FixFrenchLApostrophe(text, " I'", lastLine); + text = FixFrenchLApostrophe(text, " L'", lastLine); + text = FixFrenchLApostrophe(text, " l'", lastLine); + text = FixFrenchLApostrophe(text, " I’", lastLine); + text = FixFrenchLApostrophe(text, " L’", lastLine); + text = FixFrenchLApostrophe(text, " l’", lastLine); + } + + text = Utilities.RemoveSpaceBetweenNumbers(text); + } + + // must be last - counts/logs unknown words + text = FixUnknownWordsViaGuessOrPrompt(out _, text, index, null, true, false, logSuggestions, autoGuess); + + return text; + } + + private string FixOcrErrorsWord(string lastWord, StringBuilder word, StringBuilder sb) + { + string fixedWord; + if (lastWord != null && lastWord.Contains("COLOR=", StringComparison.OrdinalIgnoreCase)) + { + fixedWord = word.ToString(); + } + else + { + var doFixWord = !(word.Length == 1 && sb.Length > 1 && sb.EndsWith('-')); + if (doFixWord) + { + fixedWord = word.ToString(); + + var post = string.Empty; + if (fixedWord.EndsWith('.') && fixedWord.IndexOf('.') == fixedWord.Length - 1) + { + post = "."; + fixedWord = fixedWord.Substring(0, fixedWord.Length - 1); + } + else if (fixedWord.EndsWith("...", StringComparison.Ordinal)) + { + post = "..."; + fixedWord = fixedWord.Substring(0, fixedWord.Length - 3); + } + + fixedWord = FixWordViaReplaceList(fixedWord); + fixedWord = _ocrFixReplaceList.FixCommonWordErrors(fixedWord); + + // Try using word lists for uppercase i inside words, e.g. "NIkolaj" to "Nikolaj" + if (fixedWord.Contains('I')) + { + var temp = fixedWord.Replace('I', 'i'); + if (temp != fixedWord.ToUpperInvariant()) + { + if (_nameList.Contains(temp)) + { + fixedWord = temp; + } + } + } + fixedWord += post; + } + else + { + fixedWord = word.ToString(); + } + } + + sb.Append(fixedWord); + return fixedWord; + } + + private string FixWordViaReplaceList(string word) + { + if (_changeAllDictionary != null && _changeAllDictionary.ContainsKey(word)) + { + return _changeAllDictionary[word]; + } + return word; + } + + internal static string FixFrenchLApostrophe(string input, string tag, string lastLine) + { + var text = input; + bool endingBeforeThis = string.IsNullOrEmpty(lastLine) || lastLine.EndsWith('.') || lastLine.EndsWith('!') || lastLine.EndsWith('?') || + lastLine.EndsWith(".</i>", StringComparison.Ordinal) || lastLine.EndsWith("!</i>", StringComparison.Ordinal) || lastLine.EndsWith("?</i>", StringComparison.Ordinal) || + lastLine.EndsWith(".</font>", StringComparison.Ordinal) || lastLine.EndsWith("!</font>", StringComparison.Ordinal) || lastLine.EndsWith("?</font>", StringComparison.Ordinal); + if (text.StartsWith(tag.TrimStart(), StringComparison.Ordinal) && text.Length > 3) + { + if (endingBeforeThis || char.IsUpper(text[2])) + { + text = @"L" + text.Substring(1); + } + else if (char.IsLower(text[2])) + { + text = @"l" + text.Substring(1); + } + } + else if (text.StartsWith("<i>" + tag.TrimStart(), StringComparison.Ordinal) && text.Length > 6) + { + if (endingBeforeThis || char.IsUpper(text[5])) + { + text = text.Remove(3, 1).Insert(3, "L"); + } + else if (char.IsLower(text[5])) + { + text = text.Remove(3, 1).Insert(3, "l"); + } + } + + int start = text.IndexOf(tag, StringComparison.Ordinal); + while (start > 0) + { + lastLine = HtmlUtil.RemoveHtmlTags(text.Substring(0, start)).TrimEnd().TrimEnd('-').TrimEnd(); + endingBeforeThis = string.IsNullOrEmpty(lastLine) || lastLine.EndsWith('.') || lastLine.EndsWith('!') || lastLine.EndsWith('?'); + if (start < text.Length - 4) + { + if (start == 1 && text.StartsWith('-')) + { + endingBeforeThis = true; + } + + if (start > 1) + { + string beforeThis = HtmlUtil.RemoveHtmlTags(text.Substring(0, start)); + endingBeforeThis = beforeThis.EndsWith('.') || beforeThis.EndsWith('!') || beforeThis.EndsWith('?'); + } + + if (endingBeforeThis) + { + text = text.Remove(start + 1, 1).Insert(start + 1, "L"); + } + else + { + text = text.Remove(start + 1, 1).Insert(start + 1, "l"); + } + } + start = text.IndexOf(tag, start + 1, StringComparison.Ordinal); + } + + tag = Environment.NewLine + tag.Trim(); + start = text.IndexOf(tag, StringComparison.Ordinal); + while (start > 0) + { + lastLine = HtmlUtil.RemoveHtmlTags(text.Substring(0, start)).TrimEnd().TrimEnd('-').TrimEnd(); + endingBeforeThis = string.IsNullOrEmpty(lastLine) || lastLine.EndsWith('.') || lastLine.EndsWith('!') || lastLine.EndsWith('?') || lastLine.EndsWith(".</i>", StringComparison.Ordinal); + if (start < text.Length - 5) + { + if (start > 1) + { + string beforeThis = HtmlUtil.RemoveHtmlTags(text.Substring(0, start)); + endingBeforeThis = beforeThis.EndsWith('.') || beforeThis.EndsWith('!') || beforeThis.EndsWith('?'); + } + + if (endingBeforeThis) + { + text = text.Remove(start + Environment.NewLine.Length, 1).Insert(start + Environment.NewLine.Length, "L"); + } + else + { + text = text.Remove(start + Environment.NewLine.Length, 1).Insert(start + Environment.NewLine.Length, "l"); + } + } + start = text.IndexOf(tag, start + 1, StringComparison.Ordinal); + } + + tag = Environment.NewLine + "<i>" + tag.Trim(); + start = text.IndexOf(tag, StringComparison.Ordinal); + while (start > 0) + { + lastLine = HtmlUtil.RemoveHtmlTags(text.Substring(0, start)).TrimEnd().TrimEnd('-').TrimEnd(); + endingBeforeThis = string.IsNullOrEmpty(lastLine) || lastLine.EndsWith('.') || lastLine.EndsWith('!') || lastLine.EndsWith('?') || lastLine.EndsWith(".</i>", StringComparison.Ordinal); + if (start < text.Length - 8) + { + if (endingBeforeThis || char.IsUpper(text[start + 5 + Environment.NewLine.Length])) + { + text = text.Remove(start + Environment.NewLine.Length + 3, 1).Insert(start + Environment.NewLine.Length + 3, "L"); + } + else if (char.IsLower(text[start + 5 + Environment.NewLine.Length])) + { + text = text.Remove(start + Environment.NewLine.Length + 3, 1).Insert(start + Environment.NewLine.Length + 3, "l"); + } + } + start = text.IndexOf(tag, start + 1, StringComparison.Ordinal); + } + return text; + } + + private string ReplaceWordsBeforeLineFixes(string text) + { + string lastWord = null; + var sb = new StringBuilder(); + var word = new StringBuilder(); + for (int i = 0; i < text.Length; i++) + { + if (_expectedCharsNoComma.Contains(text[i])) // fix e.g. "don,t" + { + if (word.Length > 0) + { + string fixedWord; + if (lastWord != null && lastWord.Contains("COLOR=", StringComparison.OrdinalIgnoreCase)) + { + fixedWord = word.ToString(); + } + else if (!word.ToString().Contains(',')) + { + fixedWord = word.ToString(); + } + else + { + fixedWord = _ocrFixReplaceList.FixCommonWordErrorsQuick(word.ToString()); + } + + sb.Append(fixedWord); + lastWord = fixedWord; + word.Clear(); + } + sb.Append(text[i]); + } + else + { + word.Append(text[i]); + } + } + if (word.Length > 0) // last word + { + string fixedWord; + if (lastWord != null && lastWord.Contains("COLOR=", StringComparison.OrdinalIgnoreCase)) + { + fixedWord = word.ToString(); + } + else if (!word.ToString().Contains(',')) + { + fixedWord = word.ToString(); + } + else + { + fixedWord = _ocrFixReplaceList.FixCommonWordErrorsQuick(word.ToString()); + } + + sb.Append(fixedWord); + } + + lastWord = null; + text = sb.ToString(); + sb = new StringBuilder(); + word = new StringBuilder(); + for (int i = 0; i < text.Length; i++) + { + if (_expectedChars.Contains(text[i])) // removed $ + { + if (word.Length > 0) + { + string fixedWord; + if (lastWord != null && lastWord.Contains("COLOR=", StringComparison.OrdinalIgnoreCase)) + { + fixedWord = word.ToString(); + } + else + { + fixedWord = _ocrFixReplaceList.FixCommonWordErrorsQuick(word.ToString()); + } + + sb.Append(fixedWord); + lastWord = fixedWord; + word.Clear(); + } + sb.Append(text[i]); + } + else + { + word.Append(text[i]); + } + } + if (word.Length > 0) // last word + { + string fixedWord = _ocrFixReplaceList.FixCommonWordErrorsQuick(word.ToString()); + sb.Append(fixedWord); + } + return sb.ToString(); + } + + private string FixCommonOcrLineErrors(string input, string lastLine) + { + var text = input; + text = FixOcrErrorViaLineReplaceList(text); + text = FixOcrErrorsViaHardcodedRules(text, lastLine, _abbreviationList); + text = FixOcrErrorViaLineReplaceList(text); + + if (Configuration.Settings.Tools.OcrFixUseHardcodedRules) + { + if (text.StartsWith('~')) + { + text = ("- " + text.Remove(0, 1)).Replace(" ", " "); + } + + text = text.Replace(Environment.NewLine + "~", Environment.NewLine + "- ").Replace(" ", " "); + + if (text.Length < 10 && text.Length > 4 && !text.Contains(Environment.NewLine, StringComparison.Ordinal) && text.StartsWith("II", StringComparison.Ordinal) && text.EndsWith("II", StringComparison.Ordinal)) + { + text = "\"" + text.Substring(2, text.Length - 4) + "\""; + } + + // e.g. "selectionsu." -> "selections..." + if (text.EndsWith("u.", StringComparison.Ordinal) && _hunspell != null) + { + string[] words = text.Split(new[] { ' ', '.' }, StringSplitOptions.RemoveEmptyEntries); + if (words.Length > 0) + { + string lastWord = words[words.Length - 1].Trim(); + if (lastWord.Length > 2 && + char.IsLower(lastWord[0]) && + !IsWordOrWordsCorrect(lastWord) && + IsWordOrWordsCorrect(lastWord.Substring(0, lastWord.Length - 1))) + { + text = text.Substring(0, text.Length - 2) + "..."; + } + } + } + + // music notes + if (text.StartsWith(".'", StringComparison.Ordinal) && text.EndsWith(".'", StringComparison.Ordinal)) + { + text = text.Replace(".'", Configuration.Settings.Tools.MusicSymbol); + } + } + + return text; + } + + private string FixLowercaseIToUppercaseI(string input, string lastLine) + { + var sb = new StringBuilder(); + var lines = input.SplitToLines(); + for (int i = 0; i < lines.Count; i++) + { + string l = lines[i]; + + if (i > 0) + { + lastLine = lines[i - 1]; + } + + lastLine = HtmlUtil.RemoveHtmlTags(lastLine); + + if (string.IsNullOrEmpty(lastLine) || + lastLine.EndsWith('.') || + lastLine.EndsWith('!') || + lastLine.EndsWith('?')) + { + var st = new StrippableText(l); + if (st.StrippedText.StartsWith('i') && !st.Pre.EndsWith('[') && !st.Pre.EndsWith('(') && !st.Pre.EndsWith("...", StringComparison.Ordinal)) + { + if (string.IsNullOrEmpty(lastLine) || (!lastLine.EndsWith("...", StringComparison.Ordinal) && !EndsWithAbbreviation(lastLine, _abbreviationList))) + { + l = st.Pre + "I" + st.StrippedText.Remove(0, 1) + st.Post; + } + } + } + sb.AppendLine(l); + } + return sb.ToString().TrimEnd('\r', '\n'); + } + + private static bool EndsWithAbbreviation(string line, HashSet<string> abbreviationList) + { + if (string.IsNullOrEmpty(line)) + { + return false; + } + if (line.Length > 5 && line[line.Length - 3] == '.' && char.IsLetter(line[line.Length - 2])) + { + return true; + } + if (abbreviationList != null) + { + foreach (string abbreviation in abbreviationList) + { + if (line.EndsWith(" " + abbreviation, StringComparison.OrdinalIgnoreCase)) + { + return true; + } + } + } + return false; + } + + public string FixOcrErrorsViaHardcodedRules(string input, string lastLine, HashSet<string> abbreviationList) + { + var text = input; + if (!Configuration.Settings.Tools.OcrFixUseHardcodedRules) + { + return text; + } + + text = text.Replace(",...", "..."); + + if (text.StartsWith("..", StringComparison.Ordinal) && !text.StartsWith("...", StringComparison.Ordinal)) + { + text = "." + text; + } + + string pre = string.Empty; + if (text.StartsWith("- ", StringComparison.Ordinal)) + { + pre = "- "; + text = text.Remove(0, 2); + } + else if (text.StartsWith('-')) + { + pre = "-"; + text = text.Remove(0, 1); + } + + bool hasDotDot = text.Contains("..", StringComparison.Ordinal) || text.Contains(". .", StringComparison.Ordinal); + if (hasDotDot) + { + if (text.Length > 5 && text.StartsWith("..", StringComparison.Ordinal) && Utilities.AllLettersAndNumbers.Contains(text[2])) + { + text = "..." + text.Remove(0, 2); + } + + if (text.Length > 7 && text.StartsWith("<i>..", StringComparison.Ordinal) && Utilities.AllLettersAndNumbers.Contains(text[5])) + { + text = "<i>..." + text.Remove(0, 5); + } + + if (text.Length > 5 && text.StartsWith(".. ", StringComparison.Ordinal) && Utilities.AllLettersAndNumbers.Contains(text[3])) + { + text = "..." + text.Remove(0, 3); + } + + if (text.Length > 7 && text.StartsWith("<i>.. ", StringComparison.Ordinal) && Utilities.AllLettersAndNumbers.Contains(text[6])) + { + text = "<i>..." + text.Remove(0, 6); + } + + if (text.Contains(Environment.NewLine + ".. ", StringComparison.Ordinal)) + { + text = text.Replace(Environment.NewLine + ".. ", Environment.NewLine + "..."); + } + + if (text.Contains(Environment.NewLine + "<i>.. ", StringComparison.Ordinal)) + { + text = text.Replace(Environment.NewLine + "<i>.. ", Environment.NewLine + "<i>..."); + } + + if (text.StartsWith(". ..", StringComparison.Ordinal)) + { + text = "..." + text.Remove(0, 4); + } + + if (text.StartsWith(".. .", StringComparison.Ordinal)) + { + text = "..." + text.Remove(0, 4); + } + + if (text.StartsWith(". . .", StringComparison.Ordinal)) + { + text = "..." + text.Remove(0, 5); + } + + if (text.StartsWith("... ", StringComparison.Ordinal)) + { + text = text.Remove(3, 1); + } + } + + text = pre + text; + + if (hasDotDot) + { + if (text.StartsWith("<i>. ..", StringComparison.Ordinal)) + { + text = "<i>..." + text.Remove(0, 7); + } + + if (text.StartsWith("<i>.. .", StringComparison.Ordinal)) + { + text = "<i>..." + text.Remove(0, 7); + } + + if (text.StartsWith("<i>. . .", StringComparison.Ordinal)) + { + text = "<i>..." + text.Remove(0, 8); + } + + if (text.StartsWith("<i>... ", StringComparison.Ordinal)) + { + text = text.Remove(6, 1); + } + + if (text.StartsWith(". . <i>.", StringComparison.Ordinal)) + { + text = "<i>..." + text.Remove(0, 8); + } + + if (text.StartsWith("...<i>", StringComparison.Ordinal) && (text.IndexOf("</i>", StringComparison.Ordinal) > text.IndexOf(' '))) + { + text = "<i>..." + text.Remove(0, 6); + } + + if (text.EndsWith(". ..", StringComparison.Ordinal)) + { + text = text.Remove(text.Length - 4, 4) + "..."; + } + + if (text.EndsWith(".. .", StringComparison.Ordinal)) + { + text = text.Remove(text.Length - 4, 4) + "..."; + } + + if (text.EndsWith(". . .", StringComparison.Ordinal)) + { + text = text.Remove(text.Length - 5, 5) + "..."; + } + + if (text.EndsWith(". ...", StringComparison.Ordinal)) + { + text = text.Remove(text.Length - 5, 5) + "..."; + } + + if (text.EndsWith(". ..</i>", StringComparison.Ordinal)) + { + text = text.Remove(text.Length - 8, 8) + "...</i>"; + } + + if (text.EndsWith(".. .</i>", StringComparison.Ordinal)) + { + text = text.Remove(text.Length - 8, 8) + "...</i>"; + } + + if (text.EndsWith(". . .</i>", StringComparison.Ordinal)) + { + text = text.Remove(text.Length - 9, 9) + "...</i>"; + } + + if (text.EndsWith(". ...</i>", StringComparison.Ordinal)) + { + text = text.Remove(text.Length - 9, 9) + "...</i>"; + } + + if (text.EndsWith(".</i> . .", StringComparison.Ordinal)) + { + text = text.Remove(text.Length - 9, 9) + "...</i>"; + } + + if (text.EndsWith(".</i>..", StringComparison.Ordinal)) + { + text = text.Remove(text.Length - 7, 7) + "...</i>"; + } + + text = text.Replace(".</i> . ." + Environment.NewLine, "...</i>" + Environment.NewLine); + + text = text.Replace(".. ?", "..?"); + text = text.Replace("..?", "...?"); + text = text.Replace("....?", "...?"); + + text = text.Replace(".. !", "..!"); + text = text.Replace("..!", "...!"); + text = text.Replace("....!", "...!"); + + text = text.Replace("... ?", "...?"); + text = text.Replace("... !", "...!"); + + text = text.Replace("....", "..."); + text = text.Replace("....", "..."); + + if (text.StartsWith("- ...", StringComparison.Ordinal) && lastLine != null && lastLine.EndsWith("...", StringComparison.Ordinal) && !text.Contains(Environment.NewLine + "-", StringComparison.Ordinal)) + { + text = text.Remove(0, 2); + } + + if (text.StartsWith("-...", StringComparison.Ordinal) && lastLine != null && lastLine.EndsWith("...", StringComparison.Ordinal) && !text.Contains(Environment.NewLine + "-", StringComparison.Ordinal)) + { + text = text.Remove(0, 1); + } + } + + var lastLineNoTags = lastLine; + if (!string.IsNullOrEmpty(lastLineNoTags)) + { + lastLineNoTags = HtmlUtil.RemoveHtmlTags(lastLineNoTags); + lastLineNoTags = lastLineNoTags.Trim('♪', '♫', ' ', '"'); + if (lastLine.EndsWith(']') && lastLineNoTags.IndexOf('[') > 0 && + Utilities.CountTagInText(lastLineNoTags, '[') == 1 && Utilities.CountTagInText(lastLineNoTags, ']') == 1) + { + lastLineNoTags = lastLineNoTags.Substring(0, lastLineNoTags.IndexOf('[')).Trim(); + } + } + + if (string.IsNullOrEmpty(lastLine) || lastLineNoTags.HasSentenceEnding(Iso639Dash2LanguageCode.GetTwoLetterCodeFromThreeLetterCode(_threeLetterIsoLanguageName))) + { + lastLine = HtmlUtil.RemoveHtmlTags(lastLine); + var st = new StrippableText(text); + if (lastLine == null || !lastLine.EndsWith("...", StringComparison.Ordinal) && !EndsWithAbbreviation(lastLine, abbreviationList)) + { + if (st.StrippedText.Length > 0 && !char.IsUpper(st.StrippedText[0]) && !st.Pre.EndsWith('[') && !st.Pre.EndsWith('(') && + !st.Pre.Contains("...", StringComparison.Ordinal) && + !st.Pre.Contains('…')) + { + if (!HtmlUtil.StartsWithUrl(st.StrippedText)) + { + var uppercaseLetter = char.ToUpper(st.StrippedText[0]); + if (st.StrippedText.Length > 1 && uppercaseLetter == 'L' && (st.StrippedText[1] == ' ' || char.IsLower(st.StrippedText[1]))) + { + uppercaseLetter = 'I'; + } + if (st.StrippedText.Length == 1 && uppercaseLetter == 'L') + { + uppercaseLetter = 'I'; + } + + if ((st.StrippedText.StartsWith("lo ", StringComparison.Ordinal) || st.StrippedText.Equals("lo.", StringComparison.Ordinal)) && _threeLetterIsoLanguageName.Equals("ita", StringComparison.Ordinal)) + { + uppercaseLetter = 'I'; + } + + if ((st.StrippedText.StartsWith("k ", StringComparison.Ordinal) || st.StrippedText.StartsWith("m ", StringComparison.Ordinal) || st.StrippedText.StartsWith("n ", StringComparison.Ordinal) || st.StrippedText.StartsWith("r ", StringComparison.Ordinal) || st.StrippedText.StartsWith("s ", StringComparison.Ordinal) || st.StrippedText.StartsWith("t ", StringComparison.Ordinal)) && + st.Pre.EndsWith('\'') && _threeLetterIsoLanguageName.Equals("nld", StringComparison.Ordinal)) + { + uppercaseLetter = st.StrippedText[0]; + } + + if ((st.StrippedText.StartsWith("l-I'll ", StringComparison.Ordinal) || st.StrippedText.StartsWith("l-l'll ", StringComparison.Ordinal)) && _threeLetterIsoLanguageName.Equals("eng", StringComparison.Ordinal)) + { + uppercaseLetter = 'I'; + st.StrippedText = "I-I" + st.StrippedText.Remove(0, 3); + } + + st.StrippedText = uppercaseLetter + st.StrippedText.Substring(1); + text = st.Pre + st.StrippedText + st.Post; + } + } + } + } + + // lines ending with ". should often end at ... (of no other quotes exists near by) + if ((lastLine == null || !lastLine.Contains('"')) && + text.EndsWith("\".", StringComparison.Ordinal) && text.IndexOf('"') == text.LastIndexOf('"') && text.Length > 3) + { + var lastChar = text[text.Length - 3]; + if (!char.IsDigit(lastChar)) + { + int position = text.Length - 2; + text = text.Remove(position).Insert(position, "..."); + } + } + + // change '<number><space>1' to '<number>1' + if (text.Contains('1')) + { + var match = RegexNumber1.Match(text); + while (match.Success) + { + text = text.Remove(match.Index, 1); + match = RegexNumber1.Match(text, match.Index); + } + } + + // change '' to " + text = text.Replace("''", "\""); + + // change 'sequeI of' to 'sequel of' + if (text.Contains('I')) + { + var match = RegexUppercaseI.Match(text); + while (match.Success) + { + bool doFix = !(match.Index >= 1 && text.Substring(match.Index - 1).StartsWith("Mc", StringComparison.Ordinal)); + if (match.Index >= 2 && text.Substring(match.Index - 2).StartsWith("Mac", StringComparison.Ordinal)) + { + doFix = false; + } + + if (doFix) + { + text = text.Substring(0, match.Index + 1) + "l" + text.Substring(match.Index + 2); + } + + if (match.Index + 1 < text.Length) + { + match = RegexUppercaseI.Match(text, match.Index + 1); + } + else + { + break; // end while + } + } + } + + // change 'NlCE' to 'NICE' + if (text.Contains('l')) + { + var match = RegexLowercaseL.Match(text); + while (match.Success) + { + text = text.Substring(0, match.Index + 1) + "I" + text.Substring(match.Index + 2); + match = RegexLowercaseL.Match(text); + } + } + + if (text.EndsWith(". \"</i>", StringComparison.Ordinal)) + { + text = text.Remove(text.Length - 6, 1); + } + + if (text.Contains(". \"</i>" + Environment.NewLine, StringComparison.Ordinal)) + { + var idx = text.IndexOf(". \"</i>" + Environment.NewLine, StringComparison.Ordinal); + if (idx > 0) + { + text = text.Remove(idx + 1, 1); + } + } + + return text; + } + + public string FixOcrErrorViaLineReplaceList(string input) + { + return _ocrFixReplaceList.FixOcrErrorViaLineReplaceList(input); + } + + public string FixUnknownWordsViaGuessOrPrompt(out int wordsNotFound, string line, int index, Bitmap bitmap, bool autoFix, bool promptForFixingErrors, bool log, AutoGuessLevel autoGuess) + { + var localIgnoreWords = new List<string>(); + wordsNotFound = 0; + + if (promptForFixingErrors && line.Length == 1 && !IsWordKnownOrNumber(line, line)) + { + SpellCheckOcrTextResult res = SpellCheckOcrText(line, bitmap, line, localIgnoreWords); + if (res.FixedWholeLine || res.Fixed) + { + return res.Line; + } + + wordsNotFound++; + return line; + } + + if (_hunspell == null) + { + return line; + } + + string tempLine = line; + const string p = " ¡¿,.!?:;()[]{}+-$£\"„”“#&%…—♪\r\n"; + var trimChars = p.ToArray(); + bool hasAllUpperWord = false; + foreach (var w in HtmlUtil.RemoveHtmlTags(line, true).Split(' ', '\r', '\n')) + { + var word = w.Trim(trimChars); + if (word.Length > 1 && word == word.ToUpperInvariant()) + { + hasAllUpperWord = true; + break; + } + } + + foreach (string name in _nameMultiWordListAndWordsWithPeriods) + { + int start = tempLine.FastIndexOf(name); + if (start < 0 && hasAllUpperWord) + { + start = tempLine.FastIndexOf(name.ToUpperInvariant()); + } + if (start == 0 || (start > 0 && p.Contains(tempLine[start - 1]))) + { + int end = start + name.Length; + if (end == tempLine.Length || p.Contains(tempLine[end])) + { + tempLine = tempLine.Remove(start, name.Length); + } + } + } + + int minLength = 2; + if (Configuration.Settings.Tools.CheckOneLetterWords) + { + minLength = 1; + } + + var words = new List<string>(); + var splitChars = SpellCheckWordLists.SplitChars.Where(ch => ch != '/' && ch != '|').ToArray(); + foreach (var w in tempLine + .Replace("<i>", string.Empty).Replace("</i>", string.Empty) + .Replace("<b>", string.Empty).Replace("</b>", string.Empty) + .Replace("<u>", string.Empty).Replace("</u>", string.Empty) + .Split(splitChars)) + { + words.Add(w.Trim(trimChars)); + } + + for (int i = 0; i < words.Count && i < 1000; i++) + { + string word = words[i].TrimStart('\''); + string wordNotEndTrimmed = word; + word = word.TrimEnd('\''); + if (!IsWordKnownOrNumber(word, line) && !localIgnoreWords.Contains(word)) + { + var correct = false; + if (word.Length > 1) + { + if (_wordSpellOkList.Contains(word)) + { + correct = true; + } + else if (DoSpell(word)) + { + correct = true; + _wordSpellOkList.Add(word); + } + + if (!correct) + { + correct = word.Length > minLength + 1 && DoSpell(word.Trim('\'')); + } + + if (!correct && word.Length > 3 && !word.EndsWith("ss", StringComparison.Ordinal) && !string.IsNullOrEmpty(_threeLetterIsoLanguageName) && + (_threeLetterIsoLanguageName == "eng" || _threeLetterIsoLanguageName == "dan" || _threeLetterIsoLanguageName == "swe" || _threeLetterIsoLanguageName == "nld")) + { + correct = DoSpell(word.TrimEnd('s')); + } + } + else + { + correct = !Configuration.Settings.Tools.CheckOneLetterWords; // hunspell allows too many single letter words + } + + if (!correct && _userWordList.Contains(word)) + { + correct = true; + } + + if (!correct && !line.Contains(word, StringComparison.Ordinal)) + { + correct = true; // already fixed + } + + if (!correct && Configuration.Settings.Tools.SpellCheckEnglishAllowInQuoteAsIng && wordNotEndTrimmed.EndsWith('\'') && + SpellCheckDictionaryName.StartsWith("en_", StringComparison.Ordinal) && word.EndsWith("in", StringComparison.OrdinalIgnoreCase)) + { + correct = DoSpell(word + "g"); + } + + if (_threeLetterIsoLanguageName == "eng" && (word.Equals("a", StringComparison.OrdinalIgnoreCase) || word == "I")) + { + correct = true; + } + else if (_threeLetterIsoLanguageName == "dan" && word.Equals("i", StringComparison.OrdinalIgnoreCase)) + { + correct = true; + } + + if (!correct && _threeLetterIsoLanguageName.Equals("ara", StringComparison.Ordinal)) + { + var trimmed = word.Trim('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', ',', '،', '؟', '»'); + if (trimmed != word) + { + if (_userWordList.Contains(trimmed)) + { + correct = true; + } + else + { + correct = DoSpell(trimmed); + } + } + } + + if (!correct) + { + //look for match via dash'ed word, e.g. sci-fi + string dashedWord = GetDashedWordBefore(word, line, words, i); + if (!string.IsNullOrEmpty(dashedWord)) + { + correct = IsWordKnownOrNumber(dashedWord, line); + if (!correct) + { + correct = DoSpell(dashedWord); + } + } + if (!correct) + { + dashedWord = GetDashedWordAfter(word, line, words, i); + if (!string.IsNullOrEmpty(dashedWord)) + { + correct = IsWordKnownOrNumber(dashedWord, line); + if (!correct) + { + correct = DoSpell(dashedWord); + } + } + } + + if (!correct && _spellCheckWordLists.HasUserWord("-" + word)) + { + correct = true; + } + } + + if (!correct && word.Contains('/') && !word.Contains("//", StringComparison.Ordinal)) + { + correct = word.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries) + .All(w => w.Length > 2 && (DoSpell(w) || IsWordKnownOrNumber(word, line))); + } + + if (!correct && word.Length == 1 && i < words.Count - 1 && words[i + 1].Length == 1) + { + var abbreviation = word + "." + words[i + 1] + "."; + if (_abbreviationList.Contains(abbreviation) && line.Contains(abbreviation, StringComparison.Ordinal)) + { + correct = true; + words[i + 1] = string.Empty; + } + else if (i < words.Count - 2 && words[i + 2].Length == 1) + { + abbreviation = word + "." + words[i + 1] + "." + words[i + 2] + "."; + if (_abbreviationList.Contains(abbreviation) && line.Contains(abbreviation, StringComparison.Ordinal)) + { + correct = true; + words[i + 1] = string.Empty; + words[i + 2] = string.Empty; + } + } + } + + if (word.Length == 0) + { + correct = true; + } + + if (!correct) + { + wordsNotFound++; + if (log) + { + string nf = word; + if (nf.StartsWith("<i>", StringComparison.Ordinal)) + { + nf = nf.Remove(0, 3); + } + + if (nf.Trim().Length > 0) + { + UnknownWordsFound.Add(new UnknownWord(index, nf)); + } + } + + if (autoFix && autoGuess != AutoGuessLevel.None) + { + var guesses = new List<string>(); + + // Name starting with "l" instead of 'I' + if (word.StartsWith('l') && word.Length > 3 && !_nameList.Contains(word)) + { + var w = "I" + word.Substring(1); + if (_nameList.Contains(w)) + { + guesses.Add(w); + } + } + + if (!correct && autoFix && word.Length > 3 && char.IsUpper(word[0]) && !_nameList.Contains(word)) + { + var rest = word.Substring(1); + if (rest != rest.ToUpperInvariant()) + { + var newWord = word[0] + rest.ToLowerInvariant(); + if (_nameList.Contains(newWord)) + { + guesses.Add(newWord); + } + } + } + + var wordWithVerticalLine = word.Replace("|", "l"); + if (word.Length > 3 && DoSpell(wordWithVerticalLine)) + { + if (word == word.ToUpperInvariant()) + { + wordWithVerticalLine = wordWithVerticalLine.ToUpperInvariant(); + } + + guesses.Add(wordWithVerticalLine); + } + + if (word.Length > 4 && autoGuess == AutoGuessLevel.Aggressive) + { + guesses.AddRange((List<string>)_ocrFixReplaceList.CreateGuessesFromLetters(word)); + + if (word[0] == 'L') + { + guesses.Add("I" + word.Substring(1)); + } + + if (word.Contains('$')) + { + guesses.Add(word.Replace("$", "s")); + } + + if (word.Contains('l') && word.RemoveChar('l').Length > 3) + { + var lowerLToUpperI = word.Replace('l', 'I'); + if (lowerLToUpperI == lowerLToUpperI.ToUpperInvariant()) + { + guesses.Add(lowerLToUpperI); + } + } + + string wordWithCasingChanged = GetWordWithDominatedCasing(word); + if (DoSpell(word.ToLowerInvariant())) + { + guesses.Insert(0, wordWithCasingChanged); + } + } + else if (Configuration.Settings.Tools.OcrFixUseHardcodedRules) + { + if (word.Length > 2 && word[0] == 'L') + { + guesses.Add("I" + word.Substring(1)); + } + + if (word.Length > 2 && word[0] == 'I' && char.IsLower(word[1])) + { + guesses.Add("l" + word.Substring(1)); + } + + if (i == 0) + { + guesses.Add(word.Replace(@"\/", "V")); + } + else + { + guesses.Add(word.Replace(@"\/", "v")); + } + + guesses.Add(word.Replace("fi", "fi")); + guesses.Add(word.Replace("fi", "fj")); + guesses.Add(word.Replace("fl", "fl")); + if (word.Contains('$')) + { + guesses.Add(word.Replace("$", "s")); + } + + if (!word.EndsWith('€') && !word.StartsWith('€')) + { + guesses.Add(word.Replace("€", "e")); + } + + guesses.Add(word.Replace("/", "l")); + guesses.Add(word.Replace(")/", "y")); + } + foreach (string guess in guesses) + { + if (!(guess.Length == 2 && guess[1] == ' ') && IsWordOrWordsCorrect(guess)) + { + string replacedLine = OcrFixReplaceList.ReplaceWord(line, word, guess); + if (replacedLine != line) + { + if (log) + { + AutoGuessesUsed.Add(new AutoGuess(index, word, guess, line)); + } + + line = replacedLine; + wordsNotFound--; + if (log && UnknownWordsFound.Count > 0) + { + UnknownWordsFound.RemoveAt(UnknownWordsFound.Count - 1); + } + + correct = true; + break; + } + } + } + } + if (!correct && promptForFixingErrors) + { + var suggestions = new List<string>(); + + if ((word == "Lt's" || word == "Lt'S") && SpellCheckDictionaryName.StartsWith("en_", StringComparison.Ordinal)) + { + suggestions.Add("It's"); + } + else + { + if (word.ToUpperInvariant() != "LT'S" && word.ToUpperInvariant() != "SOX'S") // TODO: Get fixed nhunspell + { + suggestions = DoSuggest(word); // 0.9.6 fails on "Lt'S" + } + } + + if (word.StartsWith("<i>", StringComparison.Ordinal)) + { + word = word.Remove(0, 3); + } + + if (word.EndsWith("</i>", StringComparison.Ordinal)) + { + word = word.Remove(word.Length - 4, 4); + } + + SpellCheckOcrTextResult res = SpellCheckOcrText(line, bitmap, word, suggestions); + if (Abort) + { + return null; + } + if (res.FixedWholeLine) + { + return res.Line; + } + if (res.Fixed) + { + localIgnoreWords.Add(word); + line = res.Line; + wordsNotFound--; + } + } + } + } + } + return line; + } + + private static string GetDashedWordBefore(string word, string line, List<string> words, int index) + { + if (index > 0 && line.Contains(words[index - 1] + "-" + word, StringComparison.Ordinal)) + { + return HtmlUtil.RemoveOpenCloseTags(words[index - 1] + "-" + word, HtmlUtil.TagItalic); + } + + return null; + } + + private static string GetDashedWordAfter(string word, string line, List<string> words, int index) + { + if (index < words.Count - 1 && line.Contains(word + "-" + words[index + 1].Replace("</i>", string.Empty), StringComparison.Ordinal)) + { + return HtmlUtil.RemoveOpenCloseTags(word + "-" + words[index + 1], HtmlUtil.TagItalic); + } + + return null; + } + + private static string GetWordWithDominatedCasing(string word) + { + int lowercase = 0; + int uppercase = 0; + for (int i = 0; i < word.Length; i++) + { + var ch = word[i]; + if (char.IsLower(ch)) + { + lowercase++; + } + else if (char.IsUpper(ch)) + { + uppercase++; + } + } + if (uppercase > lowercase) + { + return word.ToUpperInvariant(); + } + + return word.ToLowerInvariant(); + } + + /// <summary> + /// SpellCheck for OCR + /// </summary> + /// <returns>True, if word is fixed</returns> + private SpellCheckOcrTextResult SpellCheckOcrText(string line, Bitmap bitmap, string word, List<string> suggestions) + { + var result = new SpellCheckOcrTextResult { Fixed = false, FixedWholeLine = false, Line = null, Word = null }; + _spellCheck.Initialize(word, suggestions, line, bitmap, IsBinaryImageCompareOrNOcr); + _spellCheck.ShowDialog(_parentForm); + LastAction = _spellCheck.ActionResult; + switch (_spellCheck.ActionResult) + { + case OcrSpellCheck.Action.Abort: + Abort = true; + break; + case OcrSpellCheck.Action.AddToUserDictionary: + if (_userWordListXmlFileName != null) + { + Utilities.AddToUserDictionary(_spellCheck.Word.Trim().ToLowerInvariant(), _fiveLetterWordListLanguageName); + _userWordList.Add(_spellCheck.Word.Trim().ToLowerInvariant()); + } + result.Word = _spellCheck.Word; + result.Fixed = true; + result.Line = line; + if (word == result.Word) + { + return result; + } + + break; + case OcrSpellCheck.Action.AddToNames: + case OcrSpellCheck.Action.AddToNamesOnly: + result.Word = _spellCheck.Word; + result.Fixed = true; + try + { + string s = _spellCheck.Word.Trim(); + _nameListObj?.Add(s); + if (s.Contains(' ')) + { + _nameMultiWordList.Add(s); + } + else + { + _nameList.Add(s); + _nameListUppercase.Add(s.ToUpperInvariant()); + if (_fiveLetterWordListLanguageName.StartsWith("en", StringComparison.Ordinal)) + { + if (!s.EndsWith('s')) + { + _nameListWithApostrophe.Add(s + "'s"); + } + else + { + _nameListWithApostrophe.Add(s + "'"); + } + } + } + } + catch + { + _wordSkipList.Add(_spellCheck.Word); + } + result.Line = line; + if (word == result.Word || _spellCheck.ActionResult == OcrSpellCheck.Action.AddToNamesOnly) + { + return result; + } + + break; + case OcrSpellCheck.Action.AlwaysUseSuggestion: + try + { + _ocrFixReplaceList.AddWordOrPartial(word, _spellCheck.Word); + if (!word.Contains(' ')) + { + _spellCheckWordLists?.UseAlwaysListAdd(word, _spellCheck.Word); + } + } + catch (Exception exception) + { + MessageBox.Show(exception + Environment.NewLine + exception.StackTrace); + _wordSkipList.Add(word); + } + result.Fixed = true; + result.Word = _spellCheck.Word; + break; + case OcrSpellCheck.Action.ChangeAndSave: + try + { + _ocrFixReplaceList.AddWordOrPartial(word, _spellCheck.Word); + } + catch (Exception exception) + { + MessageBox.Show(exception + Environment.NewLine + exception.StackTrace); + _wordSkipList.Add(word); + } + result.Fixed = true; + result.Word = _spellCheck.Word; + break; + case OcrSpellCheck.Action.ChangeOnce: + result.Fixed = true; + result.Word = _spellCheck.Word; + break; + case OcrSpellCheck.Action.ChangeWholeText: + result.Line = _spellCheck.Paragraph; + result.FixedWholeLine = true; + break; + case OcrSpellCheck.Action.ChangeAllWholeText: + _ocrFixReplaceList.AddToWholeLineList(_spellCheck.OriginalWholeText, _spellCheck.Paragraph); + result.Line = _spellCheck.Paragraph; + result.FixedWholeLine = true; + break; + case OcrSpellCheck.Action.SkipAll: + _wordSkipList.Add(_spellCheck.Word); + _wordSkipList.Add(_spellCheck.Word.ToUpperInvariant()); + if (_spellCheck.Word.Length > 1) + { + _wordSkipList.Add(char.ToUpper(_spellCheck.Word[0]) + _spellCheck.Word.Substring(1)); + } + + break; + case OcrSpellCheck.Action.SkipOnce: + break; + case OcrSpellCheck.Action.SkipWholeText: + result.Line = line; + result.FixedWholeLine = true; + break; + case OcrSpellCheck.Action.UseSuggestion: + result.Word = _spellCheck.Word; + result.Fixed = true; + break; + case OcrSpellCheck.Action.InspectCompareMatches: + Abort = true; + break; + } + if (result.Fixed) + { + result.Line = OcrFixReplaceList.ReplaceWord(line, word, result.Word); + } + return result; + } + + public bool DoSpell(string word) + { + return _hunspell.Spell(word); + } + + public List<string> DoSuggest(string word) + { + return _hunspell.Suggest(word); + } + + public bool IsWordOrWordsCorrect(string word) + { + foreach (string s in word.Split(' ')) + { + if (!DoSpell(s)) + { + if (IsWordKnownOrNumber(word, word)) + { + return true; + } + + if (s.Length > 10 && s.Contains('/')) + { + string[] ar = s.Split('/'); + if (ar.Length == 2) + { + if (ar[0].Length > 3 && ar[1].Length > 3) + { + string a = ar[0]; + if (a == a.ToUpperInvariant()) + { + a = a[0] + a.Substring(1).ToLowerInvariant(); + } + + string b = ar[0]; + if (b == b.ToUpperInvariant()) + { + b = b[0] + b.Substring(1).ToLowerInvariant(); + } + + if ((DoSpell(a) || IsWordKnownOrNumber(a, word)) && + (DoSpell(b) || IsWordKnownOrNumber(b, word))) + { + return true; + } + } + } + } + return false; + } + } + return true; + } + + public bool IsWordKnownOrNumber(string word, string line) + { + if (double.TryParse(word.TrimStart('\'').Replace("$", string.Empty).Replace("£", string.Empty).Replace("¢", string.Empty), out _)) + { + return true; + } + + if (_wordSkipList.Contains(word)) + { + return true; + } + + if (_nameList.Contains(word.Trim('\''))) + { + return true; + } + + if (_nameListUppercase.Contains(word.Trim('\''))) + { + return true; + } + + if (_userWordList.Contains(word.ToLowerInvariant())) + { + return true; + } + + if (_userWordList.Contains(word.Trim('\'').ToLowerInvariant())) + { + return true; + } + + if (word.Length > 2 && _nameListUppercase.Contains(word)) + { + return true; + } + + if (word.Length > 2 && _nameListWithApostrophe.Contains(word)) + { + return true; + } + + if (_nameListObj != null && _nameListObj.IsInNamesMultiWordList(line, word)) + { + return true; + } + + return false; + } + + public int CountUnknownWordsViaDictionary(string line, out int numberOfCorrectWords) + { + numberOfCorrectWords = 0; + if (_hunspell == null) + { + return 0; + } + + int minLength = 2; + if (Configuration.Settings.Tools.CheckOneLetterWords) + { + minLength = 1; + } + + int wordsNotFound = 0; + var words = HtmlUtil.RemoveOpenCloseTags(line, HtmlUtil.TagItalic).Split(" \r\n\t".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); + for (int i = 0; i < words.Length; i++) + { + string word = words[i].Trim(SpellCheckWordLists.SplitChars.ToArray()); + if (word.Length >= minLength) + { + if (!IsWordKnownOrNumber(word, line)) + { + bool correct = word.Length > 1 && _hunspell.Spell(word); + if (!correct) + { + correct = word.Length > 2 && _hunspell.Spell(word.Trim('\'')); + } + + if (!correct && word.Length == 1 && _threeLetterIsoLanguageName == "eng" && (word == "I" || word == "A" || word == "a")) + { + correct = true; + } + + if (correct) + { + numberOfCorrectWords++; + } + else + { + wordsNotFound++; + } + } + else if (word.Length > 3) + { + numberOfCorrectWords++; + } + } + } + return wordsNotFound; + } + + public void Dispose() + { + if (_hunspell != null) + { + _hunspell.Dispose(); + _hunspell = null; + } + if (_spellCheck != null) + { + _spellCheck.Dispose(); + _spellCheck = null; + } + } + + } +} diff --git a/src/Logic/Ocr/OcrImage.cs b/src/ui/Logic/Ocr/OcrImage.cs similarity index 96% rename from src/Logic/Ocr/OcrImage.cs rename to src/ui/Logic/Ocr/OcrImage.cs index 6df23a5da..97eed1552 100644 --- a/src/Logic/Ocr/OcrImage.cs +++ b/src/ui/Logic/Ocr/OcrImage.cs @@ -1,37 +1,37 @@ -using System.Drawing; - -namespace Nikse.SubtitleEdit.Logic.Ocr -{ - public class OcrImage - { - public bool Italic { get; set; } - public Bitmap Bmp { get; set; } - - public double[] GetTrainingData(int size) - { - int i = 0; - var data = new double[size]; - for (int y = 0; y < Bmp.Height; y++) - { - for (int x = 0; x < Bmp.Width; x++) - { - Color c = Bmp.GetPixel(x, y); - if (i < size) - { - if (c == Color.Transparent) - { - data[i] = -0.5; - } - else - { - int value = c.R + c.R + c.B; - data[i] = value / 766.0; - } - } - i++; - } - } - return data; - } - } -} +using System.Drawing; + +namespace Nikse.SubtitleEdit.Logic.Ocr +{ + public class OcrImage + { + public bool Italic { get; set; } + public Bitmap Bmp { get; set; } + + public double[] GetTrainingData(int size) + { + int i = 0; + var data = new double[size]; + for (int y = 0; y < Bmp.Height; y++) + { + for (int x = 0; x < Bmp.Width; x++) + { + Color c = Bmp.GetPixel(x, y); + if (i < size) + { + if (c == Color.Transparent) + { + data[i] = -0.5; + } + else + { + int value = c.R + c.R + c.B; + data[i] = value / 766.0; + } + } + i++; + } + } + return data; + } + } +} diff --git a/src/Logic/Ocr/PreprocessingSettings.cs b/src/ui/Logic/Ocr/PreprocessingSettings.cs similarity index 100% rename from src/Logic/Ocr/PreprocessingSettings.cs rename to src/ui/Logic/Ocr/PreprocessingSettings.cs diff --git a/src/Logic/Ocr/SpellCheckOcrTextResult.cs b/src/ui/Logic/Ocr/SpellCheckOcrTextResult.cs similarity index 96% rename from src/Logic/Ocr/SpellCheckOcrTextResult.cs rename to src/ui/Logic/Ocr/SpellCheckOcrTextResult.cs index 6f91e3bb2..0c0e6d726 100644 --- a/src/Logic/Ocr/SpellCheckOcrTextResult.cs +++ b/src/ui/Logic/Ocr/SpellCheckOcrTextResult.cs @@ -1,10 +1,10 @@ -namespace Nikse.SubtitleEdit.Logic.Ocr -{ - public class SpellCheckOcrTextResult - { - public bool Fixed { get; set; } - public bool FixedWholeLine { get; set; } - public string Word { get; set; } - public string Line { get; set; } - } -} +namespace Nikse.SubtitleEdit.Logic.Ocr +{ + public class SpellCheckOcrTextResult + { + public bool Fixed { get; set; } + public bool FixedWholeLine { get; set; } + public string Word { get; set; } + public string Line { get; set; } + } +} diff --git a/src/Logic/Ocr/Tesseract/TesseractMultiRunner.cs b/src/ui/Logic/Ocr/Tesseract/TesseractMultiRunner.cs similarity index 100% rename from src/Logic/Ocr/Tesseract/TesseractMultiRunner.cs rename to src/ui/Logic/Ocr/Tesseract/TesseractMultiRunner.cs diff --git a/src/Logic/Ocr/Tesseract/TesseractMultiThreadRunner.cs b/src/ui/Logic/Ocr/Tesseract/TesseractMultiThreadRunner.cs similarity index 100% rename from src/Logic/Ocr/Tesseract/TesseractMultiThreadRunner.cs rename to src/ui/Logic/Ocr/Tesseract/TesseractMultiThreadRunner.cs diff --git a/src/Logic/Ocr/Tesseract/TesseractRunner.cs b/src/ui/Logic/Ocr/Tesseract/TesseractRunner.cs similarity index 100% rename from src/Logic/Ocr/Tesseract/TesseractRunner.cs rename to src/ui/Logic/Ocr/Tesseract/TesseractRunner.cs diff --git a/src/Logic/Ocr/Tesseract/TesseractThreadRunner.cs b/src/ui/Logic/Ocr/Tesseract/TesseractThreadRunner.cs similarity index 100% rename from src/Logic/Ocr/Tesseract/TesseractThreadRunner.cs rename to src/ui/Logic/Ocr/Tesseract/TesseractThreadRunner.cs diff --git a/src/Logic/RtfTextConverterRichTextBox.cs b/src/ui/Logic/RtfTextConverterRichTextBox.cs similarity index 100% rename from src/Logic/RtfTextConverterRichTextBox.cs rename to src/ui/Logic/RtfTextConverterRichTextBox.cs diff --git a/src/Logic/SceneChangesGenerator.cs b/src/ui/Logic/SceneChangesGenerator.cs similarity index 100% rename from src/Logic/SceneChangesGenerator.cs rename to src/ui/Logic/SceneChangesGenerator.cs diff --git a/src/Logic/SpellCheck/Hunspell.cs b/src/ui/Logic/SpellCheck/Hunspell.cs similarity index 96% rename from src/Logic/SpellCheck/Hunspell.cs rename to src/ui/Logic/SpellCheck/Hunspell.cs index 3ce25b979..cf965e0ae 100644 --- a/src/Logic/SpellCheck/Hunspell.cs +++ b/src/ui/Logic/SpellCheck/Hunspell.cs @@ -1,53 +1,53 @@ -using Nikse.SubtitleEdit.Core; -using System; -using System.Collections.Generic; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Logic.SpellCheck -{ - public abstract class Hunspell : IDisposable - { - public static Hunspell GetHunspell(string dictionary) - { - // Finnish uses Voikko (not available via hunspell) - if (dictionary.EndsWith("fi_fi", StringComparison.OrdinalIgnoreCase)) - { - return new VoikkoSpellCheck(Configuration.BaseDirectory, Configuration.DictionariesDirectory); - } - - if (Configuration.IsRunningOnLinux) - { - return new LinuxHunspell(dictionary + ".aff", dictionary + ".dic"); - } - - if (Configuration.IsRunningOnMac) - { - return new MacHunspell(dictionary + ".aff", dictionary + ".dic"); - } - - return new WindowsHunspell(dictionary + ".aff", dictionary + ".dic"); - } - - public abstract bool Spell(string word); - public abstract List<string> Suggest(string word); - - public virtual void Dispose() - { - } - - protected void AddIShouldBeLowercaseLSuggestion(List<string> suggestions, string word) - { - if (suggestions == null) - { - return; - } - - // "I" can often be an ocr bug - should really be "l" - if (word.Length > 1 && word.StartsWith('I') && !suggestions.Contains("l" + word.Substring(1)) && Spell("l" + word.Substring(1))) - { - suggestions.Add("l" + word.Substring(1)); - } - } - - } -} +using Nikse.SubtitleEdit.Core; +using System; +using System.Collections.Generic; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Logic.SpellCheck +{ + public abstract class Hunspell : IDisposable + { + public static Hunspell GetHunspell(string dictionary) + { + // Finnish uses Voikko (not available via hunspell) + if (dictionary.EndsWith("fi_fi", StringComparison.OrdinalIgnoreCase)) + { + return new VoikkoSpellCheck(Configuration.BaseDirectory, Configuration.DictionariesDirectory); + } + + if (Configuration.IsRunningOnLinux) + { + return new LinuxHunspell(dictionary + ".aff", dictionary + ".dic"); + } + + if (Configuration.IsRunningOnMac) + { + return new MacHunspell(dictionary + ".aff", dictionary + ".dic"); + } + + return new WindowsHunspell(dictionary + ".aff", dictionary + ".dic"); + } + + public abstract bool Spell(string word); + public abstract List<string> Suggest(string word); + + public virtual void Dispose() + { + } + + protected void AddIShouldBeLowercaseLSuggestion(List<string> suggestions, string word) + { + if (suggestions == null) + { + return; + } + + // "I" can often be an ocr bug - should really be "l" + if (word.Length > 1 && word.StartsWith('I') && !suggestions.Contains("l" + word.Substring(1)) && Spell("l" + word.Substring(1))) + { + suggestions.Add("l" + word.Substring(1)); + } + } + + } +} diff --git a/src/Logic/SpellCheck/LinuxHunspell.cs b/src/ui/Logic/SpellCheck/LinuxHunspell.cs similarity index 97% rename from src/Logic/SpellCheck/LinuxHunspell.cs rename to src/ui/Logic/SpellCheck/LinuxHunspell.cs index c4cdc7257..84bd22851 100644 --- a/src/Logic/SpellCheck/LinuxHunspell.cs +++ b/src/ui/Logic/SpellCheck/LinuxHunspell.cs @@ -1,82 +1,82 @@ -using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; - -namespace Nikse.SubtitleEdit.Logic.SpellCheck -{ - public class LinuxHunspell : Hunspell - { - private IntPtr _hunspellHandle = IntPtr.Zero; - - public LinuxHunspell(string affDirectory, string dicDictory) - { - //Also search - /usr/share/hunspell - try - { - _hunspellHandle = NativeMethods.Hunspell_create(affDirectory, dicDictory); - } - catch - { - System.Windows.Forms.MessageBox.Show("Unable to start hunspell spell checker - make sure hunspell is installed!" + Environment.NewLine + - "E.g. install package 'libhunspell-dev' for Ubuntu, 'hunspell-devel' for Red Hat"); - throw; - } - } - - public override bool Spell(string word) - { - return NativeMethods.Hunspell_spell(_hunspellHandle, word) != 0; - } - - public override List<string> Suggest(string word) - { - IntPtr pointerToAddressStringArray = Marshal.AllocHGlobal(IntPtr.Size); - int resultCount = NativeMethods.Hunspell_suggest(_hunspellHandle, pointerToAddressStringArray, word); - IntPtr addressStringArray = Marshal.ReadIntPtr(pointerToAddressStringArray); - List<string> results = new List<string>(); - for (int i = 0; i < resultCount; i++) - { - IntPtr addressCharArray = Marshal.ReadIntPtr(addressStringArray, i * IntPtr.Size); - string suggestion = Marshal.PtrToStringAuto(addressCharArray); - if (!string.IsNullOrEmpty(suggestion)) - { - results.Add(suggestion); - } - } - NativeMethods.Hunspell_free_list(_hunspellHandle, pointerToAddressStringArray, resultCount); - Marshal.FreeHGlobal(pointerToAddressStringArray); - - return results; - } - - ~LinuxHunspell() - { - Dispose(false); - } - - private void ReleaseUnmanagedResources() - { - if (_hunspellHandle != IntPtr.Zero) - { - NativeMethods.Hunspell_destroy(_hunspellHandle); - _hunspellHandle = IntPtr.Zero; - } - } - - public override void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - if (disposing) - { - //ReleaseManagedResources(); - } - ReleaseUnmanagedResources(); - } - - } -} +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; + +namespace Nikse.SubtitleEdit.Logic.SpellCheck +{ + public class LinuxHunspell : Hunspell + { + private IntPtr _hunspellHandle = IntPtr.Zero; + + public LinuxHunspell(string affDirectory, string dicDictory) + { + //Also search - /usr/share/hunspell + try + { + _hunspellHandle = NativeMethods.Hunspell_create(affDirectory, dicDictory); + } + catch + { + System.Windows.Forms.MessageBox.Show("Unable to start hunspell spell checker - make sure hunspell is installed!" + Environment.NewLine + + "E.g. install package 'libhunspell-dev' for Ubuntu, 'hunspell-devel' for Red Hat"); + throw; + } + } + + public override bool Spell(string word) + { + return NativeMethods.Hunspell_spell(_hunspellHandle, word) != 0; + } + + public override List<string> Suggest(string word) + { + IntPtr pointerToAddressStringArray = Marshal.AllocHGlobal(IntPtr.Size); + int resultCount = NativeMethods.Hunspell_suggest(_hunspellHandle, pointerToAddressStringArray, word); + IntPtr addressStringArray = Marshal.ReadIntPtr(pointerToAddressStringArray); + List<string> results = new List<string>(); + for (int i = 0; i < resultCount; i++) + { + IntPtr addressCharArray = Marshal.ReadIntPtr(addressStringArray, i * IntPtr.Size); + string suggestion = Marshal.PtrToStringAuto(addressCharArray); + if (!string.IsNullOrEmpty(suggestion)) + { + results.Add(suggestion); + } + } + NativeMethods.Hunspell_free_list(_hunspellHandle, pointerToAddressStringArray, resultCount); + Marshal.FreeHGlobal(pointerToAddressStringArray); + + return results; + } + + ~LinuxHunspell() + { + Dispose(false); + } + + private void ReleaseUnmanagedResources() + { + if (_hunspellHandle != IntPtr.Zero) + { + NativeMethods.Hunspell_destroy(_hunspellHandle); + _hunspellHandle = IntPtr.Zero; + } + } + + public override void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + //ReleaseManagedResources(); + } + ReleaseUnmanagedResources(); + } + + } +} diff --git a/src/Logic/SpellCheck/MacHunspell.cs b/src/ui/Logic/SpellCheck/MacHunspell.cs similarity index 96% rename from src/Logic/SpellCheck/MacHunspell.cs rename to src/ui/Logic/SpellCheck/MacHunspell.cs index c390cbff6..5c0288225 100644 --- a/src/Logic/SpellCheck/MacHunspell.cs +++ b/src/ui/Logic/SpellCheck/MacHunspell.cs @@ -1,74 +1,74 @@ -using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; - -namespace Nikse.SubtitleEdit.Logic.SpellCheck -{ - public class MacHunspell : Hunspell - { - - private IntPtr _hunspellHandle; - - public MacHunspell(string affDirectory, string dicDictory) - { - //Also search - /usr/share/hunspell - _hunspellHandle = NativeMethods.Hunspell_create(affDirectory, dicDictory); - } - - public override bool Spell(string word) - { - return NativeMethods.Hunspell_spell(_hunspellHandle, word) != 0; - } - - public override List<string> Suggest(string word) - { - IntPtr pointerToAddressStringArray = Marshal.AllocHGlobal(IntPtr.Size); - int resultCount = NativeMethods.Hunspell_suggest(_hunspellHandle, pointerToAddressStringArray, word); - IntPtr addressStringArray = Marshal.ReadIntPtr(pointerToAddressStringArray); - List<string> results = new List<string>(); - for (int i = 0; i < resultCount; i++) - { - IntPtr addressCharArray = Marshal.ReadIntPtr(addressStringArray, i * IntPtr.Size); - string suggestion = Marshal.PtrToStringAuto(addressCharArray); - if (string.IsNullOrEmpty(suggestion)) - { - results.Add(suggestion); - } - } - NativeMethods.Hunspell_free_list(_hunspellHandle, pointerToAddressStringArray, resultCount); - Marshal.FreeHGlobal(pointerToAddressStringArray); - - return results; - } - - ~MacHunspell() - { - Dispose(false); - } - - private void ReleaseUnmanagedResources() - { - if (_hunspellHandle != IntPtr.Zero) - { - NativeMethods.Hunspell_destroy(_hunspellHandle); - _hunspellHandle = IntPtr.Zero; - } - } - - public override void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - if (disposing) - { - //ReleaseManagedResources(); - } - ReleaseUnmanagedResources(); - } - - } -} +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; + +namespace Nikse.SubtitleEdit.Logic.SpellCheck +{ + public class MacHunspell : Hunspell + { + + private IntPtr _hunspellHandle; + + public MacHunspell(string affDirectory, string dicDictory) + { + //Also search - /usr/share/hunspell + _hunspellHandle = NativeMethods.Hunspell_create(affDirectory, dicDictory); + } + + public override bool Spell(string word) + { + return NativeMethods.Hunspell_spell(_hunspellHandle, word) != 0; + } + + public override List<string> Suggest(string word) + { + IntPtr pointerToAddressStringArray = Marshal.AllocHGlobal(IntPtr.Size); + int resultCount = NativeMethods.Hunspell_suggest(_hunspellHandle, pointerToAddressStringArray, word); + IntPtr addressStringArray = Marshal.ReadIntPtr(pointerToAddressStringArray); + List<string> results = new List<string>(); + for (int i = 0; i < resultCount; i++) + { + IntPtr addressCharArray = Marshal.ReadIntPtr(addressStringArray, i * IntPtr.Size); + string suggestion = Marshal.PtrToStringAuto(addressCharArray); + if (string.IsNullOrEmpty(suggestion)) + { + results.Add(suggestion); + } + } + NativeMethods.Hunspell_free_list(_hunspellHandle, pointerToAddressStringArray, resultCount); + Marshal.FreeHGlobal(pointerToAddressStringArray); + + return results; + } + + ~MacHunspell() + { + Dispose(false); + } + + private void ReleaseUnmanagedResources() + { + if (_hunspellHandle != IntPtr.Zero) + { + NativeMethods.Hunspell_destroy(_hunspellHandle); + _hunspellHandle = IntPtr.Zero; + } + } + + public override void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + //ReleaseManagedResources(); + } + ReleaseUnmanagedResources(); + } + + } +} diff --git a/src/Logic/SpellCheck/VoikkoSpellCheck.cs b/src/ui/Logic/SpellCheck/VoikkoSpellCheck.cs similarity index 96% rename from src/Logic/SpellCheck/VoikkoSpellCheck.cs rename to src/ui/Logic/SpellCheck/VoikkoSpellCheck.cs index 0f341e74e..2cb63a974 100644 --- a/src/Logic/SpellCheck/VoikkoSpellCheck.cs +++ b/src/ui/Logic/SpellCheck/VoikkoSpellCheck.cs @@ -1,214 +1,214 @@ -using Nikse.SubtitleEdit.Core; -using System; -using System.Collections.Generic; -using System.IO; -using System.Runtime.InteropServices; -using System.Text; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Logic.SpellCheck -{ - public class VoikkoSpellCheck : Hunspell - { - - // Voikko functions in dll - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate IntPtr VoikkoInit(ref IntPtr error, byte[] languageCode, byte[] path); - private VoikkoInit _voikkoInit; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate void VoikkoTerminate(IntPtr libVlc); - private VoikkoTerminate _voikkoTerminate; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate Int32 VoikkoSpell(IntPtr handle, byte[] word); - private VoikkoSpell _voikkoSpell; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate IntPtr VoikkoSuggest(IntPtr handle, byte[] word); - private VoikkoSuggest _voikkoSuggest; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate IntPtr VoikkoFreeCstrArray(IntPtr array); - private VoikkoFreeCstrArray _voikkoFreeCstrArray; - - private IntPtr _libDll = IntPtr.Zero; - private IntPtr _libVoikko; - - private static string N2S(IntPtr ptr) - { - if (ptr == IntPtr.Zero) - { - return null; - } - - var bytes = new List<byte>(); - unsafe - { - for (byte* p = (byte*)ptr; *p != 0; p++) - { - bytes.Add(*p); - } - } - return N2S(bytes.ToArray()); - } - - private static string N2S(byte[] bytes) - { - return bytes == null ? null : Encoding.UTF8.GetString(bytes); - } - - private static byte[] S2N(string str) - { - return S2Encoding(str, Encoding.UTF8); - } - - private static byte[] S2Ansi(string str) - { - return S2Encoding(str, Encoding.Default); - } - - private static byte[] S2Encoding(string str, Encoding encoding) - { - return str == null ? null : encoding.GetBytes(str + '\0'); - } - - private object GetDllType(Type type, string name) - { - var address = NativeMethods.CrossGetProcAddress(_libDll, name); - return address != IntPtr.Zero ? Marshal.GetDelegateForFunctionPointer(address, type) : null; - } - - /// <summary> - /// Load dll dynamic + set pointers to needed methods - /// </summary> - /// <param name="baseFolder"></param> - private void LoadLibVoikkoDynamic(string baseFolder) - { - var dllFile = Path.Combine(baseFolder, "Voikkox86.dll"); - if (Configuration.IsRunningOnWindows) - { - if (IntPtr.Size == 8) - { - dllFile = Path.Combine(baseFolder, "Voikkox64.dll"); - } - - if (!File.Exists(dllFile)) - { - throw new FileNotFoundException(dllFile); - } - } - else - { - dllFile = Path.Combine(baseFolder, "libvoikko.so"); - } - - _libDll = NativeMethods.CrossLoadLibrary(dllFile); - - if (_libDll == IntPtr.Zero) - { - throw new FileLoadException("Unable to load " + dllFile); - } - - _voikkoInit = (VoikkoInit)GetDllType(typeof(VoikkoInit), "voikkoInit"); - _voikkoTerminate = (VoikkoTerminate)GetDllType(typeof(VoikkoTerminate), "voikkoTerminate"); - _voikkoSpell = (VoikkoSpell)GetDllType(typeof(VoikkoSpell), "voikkoSpellCstr"); - _voikkoSuggest = (VoikkoSuggest)GetDllType(typeof(VoikkoSuggest), "voikkoSuggestCstr"); - _voikkoFreeCstrArray = (VoikkoFreeCstrArray)GetDllType(typeof(VoikkoFreeCstrArray), "voikkoFreeCstrArray"); - - if (_voikkoInit == null || _voikkoTerminate == null || _voikkoSpell == null || _voikkoSuggest == null || _voikkoFreeCstrArray == null) - { - throw new FileLoadException("Not all methods in lib Voikko could be found!"); - } - } - - public override bool Spell(string word) - { - if (string.IsNullOrEmpty(word)) - { - return false; - } - - return Convert.ToBoolean(_voikkoSpell(_libVoikko, S2N(word))); - } - - public override List<string> Suggest(string word) - { - var suggestions = new List<string>(); - if (string.IsNullOrEmpty(word)) - { - return suggestions; - } - - var voikkoSuggestCstr = _voikkoSuggest(_libVoikko, S2N(word)); - if (voikkoSuggestCstr == IntPtr.Zero) - { - return suggestions; - } - - unsafe - { - for (byte** cStr = (byte**)voikkoSuggestCstr; *cStr != (byte*)0; cStr++) - { - suggestions.Add(N2S(new IntPtr(*cStr))); - } - } - _voikkoFreeCstrArray(voikkoSuggestCstr); - return suggestions; - } - - public VoikkoSpellCheck(string baseFolder, string dictionaryFolder) - { - LoadLibVoikkoDynamic(baseFolder); - - var error = new IntPtr(); - _libVoikko = _voikkoInit(ref error, S2N("fi"), S2Ansi(dictionaryFolder)); - if (_libVoikko == IntPtr.Zero && error != IntPtr.Zero) - { - throw new Exception(N2S(error)); - } - } - - ~VoikkoSpellCheck() - { - Dispose(false); - } - - private void ReleaseUnmanagedResources() - { - try - { - if (_libVoikko != IntPtr.Zero) - { - _voikkoTerminate(_libVoikko); - _libVoikko = IntPtr.Zero; - } - - if (_libDll != IntPtr.Zero) - { - NativeMethods.CrossFreeLibrary(_libDll); - _libDll = IntPtr.Zero; - } - } - catch - { - // ignored - } - } - - public override void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - if (disposing) - { - //ReleaseManagedResources(); - } - ReleaseUnmanagedResources(); - } - } -} +using Nikse.SubtitleEdit.Core; +using System; +using System.Collections.Generic; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Logic.SpellCheck +{ + public class VoikkoSpellCheck : Hunspell + { + + // Voikko functions in dll + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate IntPtr VoikkoInit(ref IntPtr error, byte[] languageCode, byte[] path); + private VoikkoInit _voikkoInit; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate void VoikkoTerminate(IntPtr libVlc); + private VoikkoTerminate _voikkoTerminate; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate Int32 VoikkoSpell(IntPtr handle, byte[] word); + private VoikkoSpell _voikkoSpell; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate IntPtr VoikkoSuggest(IntPtr handle, byte[] word); + private VoikkoSuggest _voikkoSuggest; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate IntPtr VoikkoFreeCstrArray(IntPtr array); + private VoikkoFreeCstrArray _voikkoFreeCstrArray; + + private IntPtr _libDll = IntPtr.Zero; + private IntPtr _libVoikko; + + private static string N2S(IntPtr ptr) + { + if (ptr == IntPtr.Zero) + { + return null; + } + + var bytes = new List<byte>(); + unsafe + { + for (byte* p = (byte*)ptr; *p != 0; p++) + { + bytes.Add(*p); + } + } + return N2S(bytes.ToArray()); + } + + private static string N2S(byte[] bytes) + { + return bytes == null ? null : Encoding.UTF8.GetString(bytes); + } + + private static byte[] S2N(string str) + { + return S2Encoding(str, Encoding.UTF8); + } + + private static byte[] S2Ansi(string str) + { + return S2Encoding(str, Encoding.Default); + } + + private static byte[] S2Encoding(string str, Encoding encoding) + { + return str == null ? null : encoding.GetBytes(str + '\0'); + } + + private object GetDllType(Type type, string name) + { + var address = NativeMethods.CrossGetProcAddress(_libDll, name); + return address != IntPtr.Zero ? Marshal.GetDelegateForFunctionPointer(address, type) : null; + } + + /// <summary> + /// Load dll dynamic + set pointers to needed methods + /// </summary> + /// <param name="baseFolder"></param> + private void LoadLibVoikkoDynamic(string baseFolder) + { + var dllFile = Path.Combine(baseFolder, "Voikkox86.dll"); + if (Configuration.IsRunningOnWindows) + { + if (IntPtr.Size == 8) + { + dllFile = Path.Combine(baseFolder, "Voikkox64.dll"); + } + + if (!File.Exists(dllFile)) + { + throw new FileNotFoundException(dllFile); + } + } + else + { + dllFile = Path.Combine(baseFolder, "libvoikko.so"); + } + + _libDll = NativeMethods.CrossLoadLibrary(dllFile); + + if (_libDll == IntPtr.Zero) + { + throw new FileLoadException("Unable to load " + dllFile); + } + + _voikkoInit = (VoikkoInit)GetDllType(typeof(VoikkoInit), "voikkoInit"); + _voikkoTerminate = (VoikkoTerminate)GetDllType(typeof(VoikkoTerminate), "voikkoTerminate"); + _voikkoSpell = (VoikkoSpell)GetDllType(typeof(VoikkoSpell), "voikkoSpellCstr"); + _voikkoSuggest = (VoikkoSuggest)GetDllType(typeof(VoikkoSuggest), "voikkoSuggestCstr"); + _voikkoFreeCstrArray = (VoikkoFreeCstrArray)GetDllType(typeof(VoikkoFreeCstrArray), "voikkoFreeCstrArray"); + + if (_voikkoInit == null || _voikkoTerminate == null || _voikkoSpell == null || _voikkoSuggest == null || _voikkoFreeCstrArray == null) + { + throw new FileLoadException("Not all methods in lib Voikko could be found!"); + } + } + + public override bool Spell(string word) + { + if (string.IsNullOrEmpty(word)) + { + return false; + } + + return Convert.ToBoolean(_voikkoSpell(_libVoikko, S2N(word))); + } + + public override List<string> Suggest(string word) + { + var suggestions = new List<string>(); + if (string.IsNullOrEmpty(word)) + { + return suggestions; + } + + var voikkoSuggestCstr = _voikkoSuggest(_libVoikko, S2N(word)); + if (voikkoSuggestCstr == IntPtr.Zero) + { + return suggestions; + } + + unsafe + { + for (byte** cStr = (byte**)voikkoSuggestCstr; *cStr != (byte*)0; cStr++) + { + suggestions.Add(N2S(new IntPtr(*cStr))); + } + } + _voikkoFreeCstrArray(voikkoSuggestCstr); + return suggestions; + } + + public VoikkoSpellCheck(string baseFolder, string dictionaryFolder) + { + LoadLibVoikkoDynamic(baseFolder); + + var error = new IntPtr(); + _libVoikko = _voikkoInit(ref error, S2N("fi"), S2Ansi(dictionaryFolder)); + if (_libVoikko == IntPtr.Zero && error != IntPtr.Zero) + { + throw new Exception(N2S(error)); + } + } + + ~VoikkoSpellCheck() + { + Dispose(false); + } + + private void ReleaseUnmanagedResources() + { + try + { + if (_libVoikko != IntPtr.Zero) + { + _voikkoTerminate(_libVoikko); + _libVoikko = IntPtr.Zero; + } + + if (_libDll != IntPtr.Zero) + { + NativeMethods.CrossFreeLibrary(_libDll); + _libDll = IntPtr.Zero; + } + } + catch + { + // ignored + } + } + + public override void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + //ReleaseManagedResources(); + } + ReleaseUnmanagedResources(); + } + } +} diff --git a/src/Logic/SpellCheck/WindowsHunspell.cs b/src/ui/Logic/SpellCheck/WindowsHunspell.cs similarity index 96% rename from src/Logic/SpellCheck/WindowsHunspell.cs rename to src/ui/Logic/SpellCheck/WindowsHunspell.cs index b55856336..6bae9a51d 100644 --- a/src/Logic/SpellCheck/WindowsHunspell.cs +++ b/src/ui/Logic/SpellCheck/WindowsHunspell.cs @@ -1,46 +1,46 @@ -using System; -using System.Collections.Generic; - -namespace Nikse.SubtitleEdit.Logic.SpellCheck -{ - public class WindowsHunspell : Hunspell - { - private NHunspell.Hunspell _hunspell; - - public WindowsHunspell(string affDictionary, string dicDictionary) - { - _hunspell = new NHunspell.Hunspell(affDictionary, dicDictionary); - } - - public override bool Spell(string word) - { - return _hunspell.Spell(word); - } - - public override List<string> Suggest(string word) - { - var list = _hunspell.Suggest(word); - AddIShouldBeLowercaseLSuggestion(list, word); - return list; - } - - public override void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - if (disposing) - { - if (_hunspell != null && !_hunspell.IsDisposed) - { - _hunspell.Dispose(); - } - _hunspell = null; - } - } - - } -} +using System; +using System.Collections.Generic; + +namespace Nikse.SubtitleEdit.Logic.SpellCheck +{ + public class WindowsHunspell : Hunspell + { + private NHunspell.Hunspell _hunspell; + + public WindowsHunspell(string affDictionary, string dicDictionary) + { + _hunspell = new NHunspell.Hunspell(affDictionary, dicDictionary); + } + + public override bool Spell(string word) + { + return _hunspell.Spell(word); + } + + public override List<string> Suggest(string word) + { + var list = _hunspell.Suggest(word); + AddIShouldBeLowercaseLSuggestion(list, word); + return list; + } + + public override void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + if (_hunspell != null && !_hunspell.IsDisposed) + { + _hunspell.Dispose(); + } + _hunspell = null; + } + } + + } +} diff --git a/src/Logic/SyncContextExtensions.cs b/src/ui/Logic/SyncContextExtensions.cs similarity index 100% rename from src/Logic/SyncContextExtensions.cs rename to src/ui/Logic/SyncContextExtensions.cs diff --git a/src/Logic/TaskbarList.cs b/src/ui/Logic/TaskbarList.cs similarity index 100% rename from src/Logic/TaskbarList.cs rename to src/ui/Logic/TaskbarList.cs diff --git a/src/Logic/TextDesigner.cs b/src/ui/Logic/TextDesigner.cs similarity index 100% rename from src/Logic/TextDesigner.cs rename to src/ui/Logic/TextDesigner.cs diff --git a/src/Logic/TextWidth.cs b/src/ui/Logic/TextWidth.cs similarity index 100% rename from src/Logic/TextWidth.cs rename to src/ui/Logic/TextWidth.cs diff --git a/src/Logic/UiEbuSaveHelper.cs b/src/ui/Logic/UiEbuSaveHelper.cs similarity index 100% rename from src/Logic/UiEbuSaveHelper.cs rename to src/ui/Logic/UiEbuSaveHelper.cs diff --git a/src/Logic/UiGetPacEncoding.cs b/src/ui/Logic/UiGetPacEncoding.cs similarity index 100% rename from src/Logic/UiGetPacEncoding.cs rename to src/ui/Logic/UiGetPacEncoding.cs diff --git a/src/Logic/UiGetYouTubeAnnotationStyles.cs b/src/ui/Logic/UiGetYouTubeAnnotationStyles.cs similarity index 100% rename from src/Logic/UiGetYouTubeAnnotationStyles.cs rename to src/ui/Logic/UiGetYouTubeAnnotationStyles.cs diff --git a/src/Logic/UiUtil.cs b/src/ui/Logic/UiUtil.cs similarity index 97% rename from src/Logic/UiUtil.cs rename to src/ui/Logic/UiUtil.cs index 176cd268a..104f24e64 100644 --- a/src/Logic/UiUtil.cs +++ b/src/ui/Logic/UiUtil.cs @@ -1,1209 +1,1209 @@ -using Nikse.SubtitleEdit.Controls; -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.SubtitleFormats; -using Nikse.SubtitleEdit.Forms; -using Nikse.SubtitleEdit.Logic.VideoPlayers; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Text; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Logic -{ - internal static class UiUtil - { - public static readonly Lazy<string> SubtitleExtensionFilter = new Lazy<string>(GetOpenDialogFilter); - - public static VideoInfo GetVideoInfo(string fileName) - { - var info = FileUtil.TryReadVideoInfoViaAviHeader(fileName); - if (info.Success) - { - return info; - } - - info = FileUtil.TryReadVideoInfoViaMatroskaHeader(fileName); - if (info.Success) - { - return info; - } - - info = FileUtil.TryReadVideoInfoViaMp4(fileName); - if (info.Success) - { - return info; - } - - info = TryReadVideoInfoViaDirectShow(fileName); - if (info.Success) - { - return info; - } - - return new VideoInfo { VideoCodec = "Unknown" }; - } - - private static VideoInfo TryReadVideoInfoViaDirectShow(string fileName) - { - return QuartsPlayer.GetVideoInfo(fileName); - } - - private static long _lastShowSubTicks = DateTime.UtcNow.Ticks; - private static int _lastShowSubHash; - - public static int ShowSubtitle(Subtitle subtitle, VideoPlayerContainer videoPlayerContainer) - { - if (videoPlayerContainer.VideoPlayer == null) - { - return -1; - } - - double positionInMilliseconds = videoPlayerContainer.CurrentPosition * TimeCode.BaseUnit; - var max = subtitle.Paragraphs.Count; - for (int i = 0; i < max; i++) - { - var p = subtitle.Paragraphs[i]; - if (p.StartTime.TotalMilliseconds <= positionInMilliseconds + 0.01 && p.EndTime.TotalMilliseconds >= positionInMilliseconds - 0.01) - { - string text = p.Text.Replace("|", Environment.NewLine); - bool isInfo = p == subtitle.Paragraphs[0] && (Math.Abs(p.StartTime.TotalMilliseconds) < 0.01 && Math.Abs(p.Duration.TotalMilliseconds) < 0.01 || Math.Abs(p.StartTime.TotalMilliseconds - Pac.PacNullTime.TotalMilliseconds) < 0.01); - if (!isInfo) - { - if (videoPlayerContainer.LastParagraph != p) - { - videoPlayerContainer.SetSubtitleText(text, p, subtitle); - } - else if (videoPlayerContainer.SubtitleText != text) - { - videoPlayerContainer.SetSubtitleText(text, p, subtitle); - } - TimeOutRefresh(subtitle, videoPlayerContainer, p); - return i; - } - } - } - - if (!string.IsNullOrEmpty(videoPlayerContainer.SubtitleText)) - { - videoPlayerContainer.SetSubtitleText(string.Empty, null, subtitle); - } - else - { - TimeOutRefresh(subtitle, videoPlayerContainer); - } - return -1; - } - - private static void TimeOutRefresh(Subtitle subtitle, VideoPlayerContainer videoPlayerContainer, Paragraph p = null) - { - if (DateTime.UtcNow.Ticks - _lastShowSubTicks > 10000 * 1000) // more than 1+ seconds ago - { - var newHash = subtitle.GetFastHashCode(string.Empty); - if (newHash != _lastShowSubHash) - { - videoPlayerContainer.SetSubtitleText(p == null ? string.Empty : p.Text, p, subtitle); - _lastShowSubHash = newHash; - } - - _lastShowSubTicks = DateTime.UtcNow.Ticks; - } - } - - public static int ShowSubtitle(Subtitle subtitle, Subtitle original, VideoPlayerContainer videoPlayerContainer) - { - if (videoPlayerContainer.VideoPlayer == null) - { - return -1; - } - - double positionInMilliseconds = (videoPlayerContainer.VideoPlayer.CurrentPosition * TimeCode.BaseUnit) + 15; - var max = subtitle.Paragraphs.Count; - for (int i = 0; i < max; i++) - { - var p = subtitle.Paragraphs[i]; - if (p.StartTime.TotalMilliseconds <= positionInMilliseconds && p.EndTime.TotalMilliseconds > positionInMilliseconds) - { - var op = Utilities.GetOriginalParagraph(0, p, original.Paragraphs); - string text = p.Text.Replace("|", Environment.NewLine); - if (op != null) - { - text = text + Environment.NewLine + Environment.NewLine + op.Text.Replace("|", Environment.NewLine); - } - - bool isInfo = p == subtitle.Paragraphs[0] && Math.Abs(p.StartTime.TotalMilliseconds) < 0.01 && positionInMilliseconds > 3000; - if (!isInfo) - { - if (videoPlayerContainer.LastParagraph != p || videoPlayerContainer.SubtitleText != text) - { - videoPlayerContainer.SetSubtitleText(text, p, subtitle); - } - return i; - } - } - } - if (!string.IsNullOrEmpty(videoPlayerContainer.SubtitleText)) - { - videoPlayerContainer.SetSubtitleText(string.Empty, null, subtitle); - } - return -1; - } - - public static bool IsQuartsDllInstalled - { - get - { - if (Utilities.IsRunningOnMono()) - { - return false; - } - - string quartzFileName = Environment.GetFolderPath(Environment.SpecialFolder.System).TrimEnd('\\') + @"\quartz.dll"; - return File.Exists(quartzFileName); - } - } - - public static bool IsMpcHcInstalled - { - get - { - if (Utilities.IsRunningOnMono()) - { - return false; - } - - try - { - return VideoPlayers.MpcHC.MpcHc.GetMpcHcFileName() != null; - } - catch (FileNotFoundException) - { - return false; - } - } - } - - public static VideoPlayer GetVideoPlayer() - { - var gs = Configuration.Settings.General; - - if (Configuration.IsRunningOnLinux) - { - if (gs.VideoPlayer == "VLC" && LibVlcDynamic.IsInstalled) - { - return new LibVlcDynamic(); - } - if (LibMpvDynamic.IsInstalled) - { - return new LibMpvDynamic(); - } - throw new NotSupportedException("You need 'libmpv-dev' or 'libvlc-dev' (on Ubuntu) and X11 to use the video player on Linux!"); - } - // Mono on OS X is 32 bit and thus requires 32 bit VLC. Place VLC in the same - // folder as Subtitle Edit and add this to the app.config inside the - // "configuration" element: - // <dllmap dll="libvlc" target="VLC.app/Contents/MacOS/lib/libvlc.dylib" /> - if (Configuration.IsRunningOnMac) - { - return new LibVlcMono(); - } - - if (gs.VideoPlayer == "VLC" && LibVlcDynamic.IsInstalled) - { - return new LibVlcDynamic(); - } - - if (gs.VideoPlayer == "MPV" && LibMpvDynamic.IsInstalled) - { - return new LibMpvDynamic(); - } - - if (gs.VideoPlayer == "MPC-HC" && VideoPlayers.MpcHC.MpcHc.IsInstalled) - { - return new VideoPlayers.MpcHC.MpcHc(); - } - - if (IsQuartsDllInstalled) - { - return new QuartsPlayer(); - } - - throw new NotSupportedException("You need DirectX, or mpv media player, or VLC media player installed as well as Subtitle Edit dll files in order to use the video player!"); - } - - public static bool InitializeVideoPlayerAndContainer(string fileName, VideoInfo videoInfo, VideoPlayerContainer videoPlayerContainer, EventHandler onVideoLoaded, EventHandler onVideoEnded) - { - try - { - videoPlayerContainer.VideoPlayer = GetVideoPlayer(); - videoPlayerContainer.VideoPlayer.Initialize(videoPlayerContainer.PanelPlayer, fileName, onVideoLoaded, onVideoEnded); - videoPlayerContainer.ShowStopButton = Configuration.Settings.General.VideoPlayerShowStopButton; - videoPlayerContainer.ShowFullscreenButton = false; - videoPlayerContainer.ShowMuteButton = Configuration.Settings.General.VideoPlayerShowMuteButton; - videoPlayerContainer.Volume = Configuration.Settings.General.VideoPlayerDefaultVolume; - videoPlayerContainer.EnableMouseWheelStep(); - if (fileName != null && (fileName.StartsWith("https://", StringComparison.OrdinalIgnoreCase) || fileName.StartsWith("http://", StringComparison.OrdinalIgnoreCase))) - { - // we don't have videoInfo for streams... - } - else - { - videoPlayerContainer.VideoWidth = videoInfo.Width; - videoPlayerContainer.VideoHeight = videoInfo.Height; - videoPlayerContainer.VideoPlayer.Resize(videoPlayerContainer.PanelPlayer.Width, videoPlayerContainer.PanelPlayer.Height); - } - - return true; - } - catch (Exception exception) - { - videoPlayerContainer.VideoPlayer = null; - var videoError = new VideoError(); - videoError.Initialize(fileName, exception); - videoError.ShowDialog(); - SeLogger.Error(exception, "InitializeVideoPlayerAndContainer failed to load video player"); - return false; - } - } - - public static void CheckAutoWrap(TextBox textBox, KeyEventArgs e, int numberOfNewLines) - { - // Do not auto-break lines more than 1 line. - if (numberOfNewLines != 1 || !Configuration.Settings.General.AutoWrapLineWhileTyping) - { - return; - } - - int length = HtmlUtil.RemoveHtmlTags(textBox.Text, true).Length; - if (e.Modifiers == Keys.None && e.KeyCode != Keys.Enter && length > Configuration.Settings.General.SubtitleLineMaximumLength) - { - string newText; - if (length > Configuration.Settings.General.SubtitleLineMaximumLength + 30) - { - newText = Utilities.AutoBreakLine(textBox.Text); - } - else - { - int lastSpace = textBox.Text.LastIndexOf(' '); - if (lastSpace > 0) - { - newText = textBox.Text.Remove(lastSpace, 1).Insert(lastSpace, Environment.NewLine); - } - else - { - newText = textBox.Text; - } - } - - int autoBreakIndex = newText.IndexOf(Environment.NewLine, StringComparison.Ordinal); - if (autoBreakIndex > 0) - { - int selectionStart = textBox.SelectionStart; - textBox.Text = newText; - if (selectionStart > autoBreakIndex) - { - selectionStart += Environment.NewLine.Length - 1; - } - if (selectionStart >= 0) - { - textBox.SelectionStart = selectionStart; - } - } - } - } - - public static void CheckAutoWrap(SETextBox textBox, KeyEventArgs e, int numberOfNewLines) - { - // Do not auto-break lines more than 1 line. - if (numberOfNewLines != 1 || !Configuration.Settings.General.AutoWrapLineWhileTyping) - { - return; - } - - int length = HtmlUtil.RemoveHtmlTags(textBox.Text, true).Length; - if (e.Modifiers == Keys.None && e.KeyCode != Keys.Enter && length > Configuration.Settings.General.SubtitleLineMaximumLength) - { - string newText; - if (length > Configuration.Settings.General.SubtitleLineMaximumLength + 30) - { - newText = Utilities.AutoBreakLine(textBox.Text); - } - else - { - int lastSpace = textBox.Text.LastIndexOf(' '); - if (lastSpace > 0) - { - newText = textBox.Text.Remove(lastSpace, 1).Insert(lastSpace, Environment.NewLine); - } - else - { - newText = textBox.Text; - } - } - - int autoBreakIndex = newText.IndexOf(Environment.NewLine, StringComparison.Ordinal); - if (autoBreakIndex > 0) - { - int selectionStart = textBox.SelectionStart; - textBox.Text = newText; - if (selectionStart > autoBreakIndex) - { - selectionStart += Environment.NewLine.Length - 1; - } - if (selectionStart >= 0) - { - textBox.SelectionStart = selectionStart; - } - } - } - } - - private static readonly Dictionary<string, Keys> AllKeys = new Dictionary<string, Keys>(); - private static Keys _helpKeys; - - public static Keys GetKeys(string keysInString) - { - if (string.IsNullOrEmpty(keysInString)) - { - return Keys.None; - } - - if (AllKeys.Count == 0) - { - foreach (Keys val in Enum.GetValues(typeof(Keys))) - { - string k = val.ToString().ToLowerInvariant(); - if (!AllKeys.ContainsKey(k)) - { - AllKeys.Add(k, val); - } - } - if (!AllKeys.ContainsKey("pagedown")) - { - AllKeys.Add("pagedown", Keys.RButton | Keys.Space); - } - - if (!AllKeys.ContainsKey("home")) - { - AllKeys.Add("home", Keys.MButton | Keys.Space); - } - - if (!AllKeys.ContainsKey("capslock")) - { - AllKeys.Add("capslock", Keys.CapsLock); - } - } - - string[] parts = keysInString.ToLowerInvariant().Split(new[] { '+' }, StringSplitOptions.RemoveEmptyEntries); - var resultKeys = Keys.None; - foreach (string k in parts) - { - if (AllKeys.ContainsKey(k)) - { - resultKeys = resultKeys | AllKeys[k]; - } - } - return resultKeys; - } - - public static Keys HelpKeys - { - get - { - if (_helpKeys == Keys.None) - { - _helpKeys = GetKeys(Configuration.Settings.Shortcuts.GeneralHelp); - } - return _helpKeys; - } - set => _helpKeys = value; - } - - public static void SetButtonHeight(Control control, int newHeight, int level) - { - if (level > 6) - { - return; - } - - if (control.HasChildren) - { - foreach (Control subControl in control.Controls) - { - if (subControl.HasChildren) - { - SetButtonHeight(subControl, newHeight, level + 1); - } - else if (subControl is Button) - { - subControl.Height = newHeight; - } - } - } - else if (control is Button) - { - control.Height = newHeight; - } - } - - public static void InitializeSubtitleFont(Control control) - { - var gs = Configuration.Settings.General; - - if (string.IsNullOrEmpty(gs.SubtitleFontName)) - { - gs.SubtitleFontName = DefaultSystemFont.Name; - } - - try - { - if (control is ListView) - { - if (gs.SubtitleListViewFontBold) - { - control.Font = new Font(gs.SubtitleFontName, gs.SubtitleListViewFontSize, FontStyle.Bold); - } - else - { - control.Font = new Font(gs.SubtitleFontName, gs.SubtitleListViewFontSize); - } - } - else if (control is SETextBox || control is TextBox) - { - if (gs.SubtitleTextBoxFontBold) - { - control.Font = new Font(gs.SubtitleFontName, gs.SubtitleTextBoxFontSize, FontStyle.Bold); - } - else - { - control.Font = new Font(gs.SubtitleFontName, gs.SubtitleTextBoxFontSize); - } - } - - control.BackColor = gs.SubtitleBackgroundColor; - control.ForeColor = gs.SubtitleFontColor; - } - catch - { - // ignored - } - } - - private static Font _defaultSystemFont; - private static Font DefaultSystemFont - { - get - { - if (_defaultSystemFont != null) - { - return _defaultSystemFont; - } - - var font = SystemFonts.MessageBoxFont; - if (Configuration.IsRunningOnLinux && IsFontPresent(Configuration.DefaultLinuxFontName)) - { - font = new Font(Configuration.DefaultLinuxFontName, 8F); - } - - _defaultSystemFont = IsFontPresent(font.Name) ? font : SystemFonts.DefaultFont; - return _defaultSystemFont; - } - } - - private static bool IsFontPresent(string fontName) - { - try - { - // Bold + italic + regular must be present - _ = new Font(fontName, 9, FontStyle.Bold); - _ = new Font(fontName, 9, FontStyle.Italic); - _ = new Font(fontName, 9, FontStyle.Regular); - return true; - } - catch - { - // ignore - } - - return false; - } - - public static Font GetDefaultFont() - { - var gs = Configuration.Settings.General; - if (string.IsNullOrEmpty(gs.SystemSubtitleFontNameOverride) || gs.SystemSubtitleFontSizeOverride < 5) - { - return DefaultSystemFont; - } - - try - { - return new Font(gs.SystemSubtitleFontNameOverride, gs.SystemSubtitleFontSizeOverride); - } - catch - { - return DefaultSystemFont; - } - } - - internal static void PreInitialize(Form form) - { - form.AutoScaleMode = AutoScaleMode.Dpi; - form.Font = GetDefaultFont(); - } - - public static void FixFonts(Control form, int iterations = 5) - { - FixFontsInner(form, iterations); - if (Configuration.Settings.General.UseDarkTheme) - { - DarkTheme.SetDarkTheme(form, 1500); - } - } - - internal static void FixFonts(ToolStripItem item) - { - item.Font = GetDefaultFont(); - if (Configuration.Settings.General.UseDarkTheme) - { - DarkTheme.SetDarkTheme(item); - } - } - - internal static void FixFonts(ToolStripComboBox item) - { - item.Font = GetDefaultFont(); - if (Configuration.Settings.General.UseDarkTheme) - { - DarkTheme.SetDarkTheme(item); - } - } - - private static void FixFontsInner(Control form, int iterations = 5) - { - if (iterations < 1 || form is SETextBox) - { - return; - } - - if (form is ContextMenuStrip cms) - { - foreach (var item in cms.Items) - { - if (item is ToolStripMenuItem tsmi) - { - tsmi.Font = GetDefaultFont(); - if (tsmi.HasDropDownItems) - { - foreach (var innerItem in tsmi.DropDownItems) - { - if (innerItem is ToolStripMenuItem innerTsmi) - { - innerTsmi.Font = GetDefaultFont(); - } - } - } - } - } - } - - if (form is TimeUpDown timeUpDown) - { - using (var g = Graphics.FromHwnd(IntPtr.Zero)) - { - var width = g.MeasureString("00:00:00.000", form.Font).Width; - if (timeUpDown.MaskedTextBox.Width < width - 3) - { - timeUpDown.MaskedTextBox.Font = new Font(timeUpDown.MaskedTextBox.Font.FontFamily, timeUpDown.MaskedTextBox.Font.Size - 1); - } - width = g.MeasureString("00:00:00.000", form.Font).Width; - if (timeUpDown.MaskedTextBox.Width < width - 3) - { - timeUpDown.MaskedTextBox.Font = new Font(timeUpDown.MaskedTextBox.Font.FontFamily, timeUpDown.MaskedTextBox.Font.Size - 1); - } - } - } - - foreach (Control c in form.Controls) - { - if (!c.Font.Name.Equals("Tahoma", StringComparison.Ordinal)) - { - c.Font = GetDefaultFont(); - } - - foreach (Control inner in c.Controls) - { - FixFontsInner(inner, iterations - 1); - } - } - } - - public static void FixLargeFonts(Control mainCtrl, Control ctrl) - { - using (Graphics graphics = mainCtrl.CreateGraphics()) - { - SizeF textSize = graphics.MeasureString(ctrl.Text, ctrl.Font); - if (textSize.Height > ctrl.Height - 4) - { - SetButtonHeight(mainCtrl, (int)Math.Round(textSize.Height + 7.5), 1); - } - } - } - - public static void SetSaveDialogFilter(SaveFileDialog saveFileDialog, SubtitleFormat currentFormat) - { - var sb = new StringBuilder(); - int index = 0; - foreach (SubtitleFormat format in SubtitleFormat.AllSubtitleFormats) - { - sb.Append(format.Name + "|*" + format.Extension + "|"); - if (currentFormat.Name == format.Name) - { - saveFileDialog.FilterIndex = index + 1; - } - index++; - } - saveFileDialog.Filter = sb.ToString().TrimEnd('|'); - } - - public static void GetLineLengths(Label label, string text) - { - label.ForeColor = ForeColor; - var lines = text.SplitToLines(); - const int max = 3; - var sb = new StringBuilder(); - for (int i = 0; i < lines.Count; i++) - { - string line = lines[i]; - if (i > 0) - { - sb.Append('/'); - } - - if (i > max) - { - sb.Append("..."); - label.Text = sb.ToString(); - return; - } - - sb.Append(line.CountCharacters(false, Configuration.Settings.General.IgnoreArabicDiacritics)); - if (line.CountCharacters(false, Configuration.Settings.General.IgnoreArabicDiacritics) > Configuration.Settings.General.SubtitleLineMaximumLength || i >= Configuration.Settings.General.MaxNumberOfLines) - { - label.ForeColor = Color.Red; - } - } - label.Text = sb.ToString(); - } - - public static void GetLinePixelWidths(Label label, string text) - { - label.ForeColor = ForeColor; - var lines = text.SplitToLines(); - const int max = 3; - var sb = new StringBuilder(); - for (int i = 0; i < lines.Count; i++) - { - string line = lines[i]; - if (i > 0) - { - sb.Append('/'); - } - - if (i > max) - { - sb.Append("..."); - label.Text = sb.ToString(); - return; - } - - int lineWidth = TextWidth.CalcPixelWidth(line); - sb.Append(lineWidth); - if (lineWidth > Configuration.Settings.General.SubtitleLineMaximumPixelWidth) - { - label.ForeColor = Color.Red; - } - } - label.Text = sb.ToString(); - } - - public static void InitializeSubtitleFormatComboBox(ToolStripComboBox comboBox, SubtitleFormat format) - { - InitializeSubtitleFormatComboBox(comboBox.ComboBox, format); - comboBox.DropDownWidth += 5; // .Net quirk? - } - - public static void InitializeSubtitleFormatComboBox(ComboBox comboBox, SubtitleFormat format) - { - InitializeSubtitleFormatComboBox(comboBox, new List<string> { format.FriendlyName }, format.FriendlyName); - } - - public static void InitializeSubtitleFormatComboBox(ToolStripComboBox comboBox, string selectedName) - { - InitializeSubtitleFormatComboBox(comboBox.ComboBox, selectedName); - comboBox.DropDownWidth += 5; // .Net quirk? - } - - public static void InitializeSubtitleFormatComboBox(ComboBox comboBox, string selectedName) - { - var formatNames = SubtitleFormat.AllSubtitleFormats.Where(format => !format.IsVobSubIndexFile).Select(format => format.FriendlyName); - InitializeSubtitleFormatComboBox(comboBox, formatNames.ToList(), selectedName); - } - - public static void InitializeSubtitleFormatComboBox(ComboBox comboBox, List<string> formatNames, string selectedName) - { - var selectedIndex = 0; - using (var graphics = comboBox.CreateGraphics()) - { - var maxWidth = (float)comboBox.DropDownWidth; - var max = formatNames.Count; - for (var index = 0; index < max; index++) - { - var name = formatNames[index]; - if (name.Equals(selectedName, StringComparison.OrdinalIgnoreCase)) - { - selectedIndex = index; - } - if (name.Length > 30) - { - var width = graphics.MeasureString(name, comboBox.Font).Width; - if (width > maxWidth) - { - maxWidth = width; - } - } - } - comboBox.DropDownWidth = (int)Math.Round(maxWidth + 7.5); - } - comboBox.BeginUpdate(); - comboBox.Items.Clear(); - comboBox.Items.AddRange(formatNames.ToArray<object>()); - comboBox.SelectedIndex = selectedIndex; - comboBox.EndUpdate(); - } - - public static void InitializeTextEncodingComboBox(ComboBox comboBox) - { - var defaultEncoding = Configuration.Settings.General.DefaultEncoding; - var selectedItem = (TextEncoding)null; - comboBox.BeginUpdate(); - comboBox.Items.Clear(); - var encList = new List<TextEncoding>(); - using (var graphics = comboBox.CreateGraphics()) - { - var maxWidth = 0.0F; - foreach (var encoding in Configuration.AvailableEncodings) - { - if (encoding.CodePage >= 874 && !encoding.IsEbcdic()) - { - var item = new TextEncoding(encoding, null); - if (selectedItem == null && item.Equals(defaultEncoding)) - { - selectedItem = item; - } - var width = graphics.MeasureString(item.DisplayName, comboBox.Font).Width; - if (width > maxWidth) - { - maxWidth = width; - } - if (encoding.CodePage.Equals(Encoding.UTF8.CodePage)) - { - item = new TextEncoding(Encoding.UTF8, TextEncoding.Utf8WithBom); - encList.Insert(TextEncoding.Utf8WithBomIndex, item); - if (item.Equals(defaultEncoding)) - { - selectedItem = item; - } - - item = new TextEncoding(Encoding.UTF8, TextEncoding.Utf8WithoutBom); - encList.Insert(TextEncoding.Utf8WithoutBomIndex, item); - if (item.Equals(defaultEncoding)) - { - selectedItem = item; - } - } - else - { - encList.Add(item); - } - } - } - comboBox.DropDownWidth = (int)Math.Round(maxWidth + 7.5); - } - comboBox.Items.AddRange(encList.ToArray<object>()); - if (selectedItem == null) - { - comboBox.SelectedIndex = TextEncoding.Utf8WithBomIndex; // UTF-8 if DefaultEncoding is not found - } - else if (selectedItem.DisplayName == TextEncoding.Utf8WithoutBom) - { - comboBox.SelectedIndex = TextEncoding.Utf8WithoutBomIndex; - } - else - { - comboBox.SelectedItem = selectedItem; - } - comboBox.EndUpdate(); - if (comboBox.SelectedItem is TextEncoding textEncodingListItem) - { - Configuration.Settings.General.DefaultEncoding = textEncodingListItem.DisplayName; - } - comboBox.AutoCompleteSource = AutoCompleteSource.ListItems; - comboBox.AutoCompleteMode = AutoCompleteMode.Append; - } - - public static TextEncoding GetTextEncodingComboBoxCurrentEncoding(ComboBox comboBox) - { - if (comboBox.SelectedIndex > 0 && comboBox.SelectedItem is TextEncoding textEncodingListItem) - { - return textEncodingListItem; - } - return new TextEncoding(Encoding.UTF8, TextEncoding.Utf8WithBom); - } - - public static void SetTextEncoding(ToolStripComboBox comboBoxEncoding, string encodingName) - { - if (encodingName == TextEncoding.Utf8WithBom) - { - comboBoxEncoding.SelectedIndex = TextEncoding.Utf8WithBomIndex; - return; - } - - if (encodingName == TextEncoding.Utf8WithoutBom) - { - comboBoxEncoding.SelectedIndex = TextEncoding.Utf8WithoutBomIndex; - return; - } - - foreach (TextEncoding item in comboBoxEncoding.Items) - { - if (item.Equals(encodingName)) - { - comboBoxEncoding.SelectedItem = item; - return; - } - } - - comboBoxEncoding.SelectedIndex = TextEncoding.Utf8WithBomIndex; // UTF-8 with BOM - } - - - - private const string BreakChars = "\",:;.¡!¿?()[]{}<>♪♫-–—/#*|؟،"; - - public static void ApplyControlBackspace(TextBox textBox) - { - if (textBox.SelectionLength == 0) - { - var text = textBox.Text; - var deleteUpTo = textBox.SelectionStart; - if (deleteUpTo > 0 && deleteUpTo <= text.Length) - { - text = text.Substring(0, deleteUpTo); - var textElementIndices = StringInfo.ParseCombiningCharacters(text); - var index = textElementIndices.Length; - var textIndex = deleteUpTo; - var deleteFrom = -1; - while (index > 0) - { - index--; - textIndex = textElementIndices[index]; - if (!IsSpaceCategory(CharUnicodeInfo.GetUnicodeCategory(text, textIndex))) - { - break; - } - } - if (index > 0) // HTML tag? - { - if (text[textIndex] == '>') - { - var openingBracketIndex = text.LastIndexOf('<', textIndex - 1); - if (openingBracketIndex >= 0 && text.IndexOf('>', openingBracketIndex + 1) == textIndex) - { - deleteFrom = openingBracketIndex; // delete whole tag - } - } - else if (text[textIndex] == '}') - { - var startIdx = text.LastIndexOf(@"{\", textIndex - 1, StringComparison.Ordinal); - if (startIdx >= 0 && text.IndexOf('}', startIdx + 1) == textIndex) - { - deleteFrom = startIdx; - } - } - } - if (deleteFrom < 0) - { - if (BreakChars.Contains(text[textIndex])) - { - deleteFrom = -2; - } - - while (index > 0) - { - index--; - textIndex = textElementIndices[index]; - if (IsSpaceCategory(CharUnicodeInfo.GetUnicodeCategory(text, textIndex))) - { - if (deleteFrom > -2) - { - if (deleteFrom < 0) - { - deleteFrom = textElementIndices[index + 1]; - } - break; - } - deleteFrom = textElementIndices[index + 1]; - if (!":!?".Contains(text[deleteFrom])) - { - break; - } - } - else if (BreakChars.Contains(text[textIndex])) - { - if (deleteFrom > -2) - { - if (deleteFrom < 0) - { - deleteFrom = textElementIndices[index + 1]; - } - break; - } - } - else - { - deleteFrom = -1; - } - } - } - if (deleteFrom < deleteUpTo) - { - if (deleteFrom < 0) - { - deleteFrom = 0; - } - textBox.Select(deleteFrom, deleteUpTo - deleteFrom); - textBox.Paste(string.Empty); - } - } - } - } - - public static void SelectWordAtCaret(SETextBox textBox) - { - var text = textBox.Text; - var endIndex = textBox.SelectionStart; - var startIndex = endIndex; - - while (startIndex > 0 && !IsSpaceCategory(CharUnicodeInfo.GetUnicodeCategory(text[startIndex - 1])) && !BreakChars.Contains(text[startIndex - 1])) - { - startIndex--; - } - textBox.SelectionStart = startIndex; - - while (endIndex < text.Length && !IsSpaceCategory(CharUnicodeInfo.GetUnicodeCategory(text[endIndex])) && !BreakChars.Contains(text[endIndex])) - { - endIndex++; - } - textBox.SelectionLength = endIndex - startIndex; - } - - private static bool IsSpaceCategory(UnicodeCategory c) - { - return c == UnicodeCategory.SpaceSeparator || c == UnicodeCategory.Control || c == UnicodeCategory.LineSeparator || c == UnicodeCategory.ParagraphSeparator; - } - - private static void AddExtension(StringBuilder sb, string extension) - { - if (!sb.ToString().Contains("*" + extension + ";", StringComparison.OrdinalIgnoreCase)) - { - sb.Append('*'); - sb.Append(extension.TrimStart('*')); - sb.Append(';'); - } - } - - private static string GetOpenDialogFilter() - { - var sb = new StringBuilder(); - sb.Append(Configuration.Settings.Language.General.SubtitleFiles + "|"); - foreach (SubtitleFormat s in SubtitleFormat.AllSubtitleFormats) - { - AddExtension(sb, s.Extension); - foreach (string ext in s.AlternateExtensions) - { - AddExtension(sb, ext); - } - } - AddExtension(sb, new Pac().Extension); - AddExtension(sb, new Cavena890().Extension); - AddExtension(sb, new Spt().Extension); - AddExtension(sb, new Sptx().Extension); - AddExtension(sb, new Wsb().Extension); - AddExtension(sb, new CheetahCaption().Extension); - AddExtension(sb, ".chk"); - AddExtension(sb, new CaptionsInc().Extension); - AddExtension(sb, new Ultech130().Extension); - AddExtension(sb, new ELRStudioClosedCaption().Extension); - AddExtension(sb, ".uld"); // Ultech drop frame - AddExtension(sb, new SonicScenaristBitmaps().Extension); - AddExtension(sb, ".mks"); - AddExtension(sb, ".mxf"); - AddExtension(sb, ".sup"); - AddExtension(sb, ".dost"); - AddExtension(sb, new FinalDraftTemplate2().Extension); - AddExtension(sb, new Ayato().Extension); - AddExtension(sb, new PacUnicode().Extension); - AddExtension(sb, new WinCaps32().Extension); - AddExtension(sb, new IsmtDfxp().Extension); - AddExtension(sb, new PlayCaptionsFreeEditor().Extension); - AddExtension(sb, ".cdg"); // karaoke - - if (!string.IsNullOrEmpty(Configuration.Settings.General.OpenSubtitleExtraExtensions)) - { - var extraExtensions = Configuration.Settings.General.OpenSubtitleExtraExtensions.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries); - foreach (string ext in extraExtensions) - { - if (ext.StartsWith("*.", StringComparison.Ordinal) && !sb.ToString().Contains(ext, StringComparison.OrdinalIgnoreCase)) - { - AddExtension(sb, ext); - } - } - } - AddExtension(sb, ".son"); - AddExtension(sb, ".mts"); - AddExtension(sb, ".m2ts"); - - sb.Append('|'); - sb.Append(Configuration.Settings.Language.General.AllFiles); - sb.Append("|*.*"); - return sb.ToString(); - } - - public static string GetListViewTextFromString(string s) => s.Replace(Environment.NewLine, Configuration.Settings.General.ListViewLineSeparatorString); - - public static string GetStringFromListViewText(string lviText) => lviText.Replace(Configuration.Settings.General.ListViewLineSeparatorString, Environment.NewLine); - - public static void SelectAll(this ListView lv) - { - lv.BeginUpdate(); - foreach (ListViewItem item in lv.Items) - { - item.Selected = true; - } - lv.EndUpdate(); - } - - public static void SelectFirstSelectedItemOnly(this ListView lv) - { - int itemsCount = lv.SelectedItems.Count - 1; - if (itemsCount > 0) - { - lv.BeginUpdate(); - do - { - lv.SelectedItems[itemsCount--].Selected = false; - } - while (itemsCount > 0); - if (lv.SelectedItems.Count > 0) - { - lv.EnsureVisible(lv.SelectedItems[0].Index); - lv.FocusedItem = lv.SelectedItems[0]; - } - else if (lv.Items.Count > 0) - { - lv.EnsureVisible(0); - lv.FocusedItem = lv.Items[0]; - } - lv.EndUpdate(); - } - } - - public static void InverseSelection(this ListView lv) - { - lv.BeginUpdate(); - foreach (ListViewItem item in lv.Items) - { - item.Selected = !item.Selected; - } - lv.EndUpdate(); - } - - internal static void CleanUpMenuItemPlugin(ToolStripMenuItem tsmi) - { - if (tsmi == null) - { - return; - } - for (int k = tsmi.DropDownItems.Count - 1; k > 0; k--) - { - ToolStripItem x = tsmi.DropDownItems[k]; - var fileName = (string)x.Tag; - if (!string.IsNullOrEmpty(fileName) && fileName.EndsWith(".dll", StringComparison.OrdinalIgnoreCase)) - { - tsmi.DropDownItems.Remove(x); - } - } - } - - public static Color BackColor => Configuration.Settings.General.UseDarkTheme ? DarkTheme.BackColor : Control.DefaultBackColor; - - public static Color ForeColor => Configuration.Settings.General.UseDarkTheme ? DarkTheme.ForeColor : Control.DefaultForeColor; - - public static void OpenFolderFromFileName(string fileName) - { - string folderName = Path.GetDirectoryName(fileName); - if (Configuration.IsRunningOnWindows) - { - string argument = @"/select, " + fileName; - System.Diagnostics.Process.Start("explorer.exe", argument); - } - else - { - UiUtil.OpenFolder(folderName); - } - } - - public static void OpenFolder(string folder) - { - OpenItem(folder, "folder"); - } - - public static void OpenURL(string url) - { - OpenItem(url, "url"); - } - - public static void OpenFile(string file) - { - OpenItem(file, "file"); - } - - public static void OpenItem(string item, string type) - { - try - { - if (Configuration.IsRunningOnWindows || Configuration.IsRunningOnMac) - { - System.Diagnostics.Process.Start(item); - } - else if (Configuration.IsRunningOnLinux) - { - System.Diagnostics.Process process = new System.Diagnostics.Process(); - process.EnableRaisingEvents = false; - process.StartInfo.FileName = "xdg-open"; - process.StartInfo.Arguments = item; - process.Start(); - } - } - catch (Exception exception) - { - MessageBox.Show($"Cannot open {type}: {item}{Environment.NewLine}{Environment.NewLine}{exception.Source}: {exception.Message}", "Error opening URL", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - } - } -} +using Nikse.SubtitleEdit.Controls; +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.SubtitleFormats; +using Nikse.SubtitleEdit.Forms; +using Nikse.SubtitleEdit.Logic.VideoPlayers; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Logic +{ + internal static class UiUtil + { + public static readonly Lazy<string> SubtitleExtensionFilter = new Lazy<string>(GetOpenDialogFilter); + + public static VideoInfo GetVideoInfo(string fileName) + { + var info = FileUtil.TryReadVideoInfoViaAviHeader(fileName); + if (info.Success) + { + return info; + } + + info = FileUtil.TryReadVideoInfoViaMatroskaHeader(fileName); + if (info.Success) + { + return info; + } + + info = FileUtil.TryReadVideoInfoViaMp4(fileName); + if (info.Success) + { + return info; + } + + info = TryReadVideoInfoViaDirectShow(fileName); + if (info.Success) + { + return info; + } + + return new VideoInfo { VideoCodec = "Unknown" }; + } + + private static VideoInfo TryReadVideoInfoViaDirectShow(string fileName) + { + return QuartsPlayer.GetVideoInfo(fileName); + } + + private static long _lastShowSubTicks = DateTime.UtcNow.Ticks; + private static int _lastShowSubHash; + + public static int ShowSubtitle(Subtitle subtitle, VideoPlayerContainer videoPlayerContainer) + { + if (videoPlayerContainer.VideoPlayer == null) + { + return -1; + } + + double positionInMilliseconds = videoPlayerContainer.CurrentPosition * TimeCode.BaseUnit; + var max = subtitle.Paragraphs.Count; + for (int i = 0; i < max; i++) + { + var p = subtitle.Paragraphs[i]; + if (p.StartTime.TotalMilliseconds <= positionInMilliseconds + 0.01 && p.EndTime.TotalMilliseconds >= positionInMilliseconds - 0.01) + { + string text = p.Text.Replace("|", Environment.NewLine); + bool isInfo = p == subtitle.Paragraphs[0] && (Math.Abs(p.StartTime.TotalMilliseconds) < 0.01 && Math.Abs(p.Duration.TotalMilliseconds) < 0.01 || Math.Abs(p.StartTime.TotalMilliseconds - Pac.PacNullTime.TotalMilliseconds) < 0.01); + if (!isInfo) + { + if (videoPlayerContainer.LastParagraph != p) + { + videoPlayerContainer.SetSubtitleText(text, p, subtitle); + } + else if (videoPlayerContainer.SubtitleText != text) + { + videoPlayerContainer.SetSubtitleText(text, p, subtitle); + } + TimeOutRefresh(subtitle, videoPlayerContainer, p); + return i; + } + } + } + + if (!string.IsNullOrEmpty(videoPlayerContainer.SubtitleText)) + { + videoPlayerContainer.SetSubtitleText(string.Empty, null, subtitle); + } + else + { + TimeOutRefresh(subtitle, videoPlayerContainer); + } + return -1; + } + + private static void TimeOutRefresh(Subtitle subtitle, VideoPlayerContainer videoPlayerContainer, Paragraph p = null) + { + if (DateTime.UtcNow.Ticks - _lastShowSubTicks > 10000 * 1000) // more than 1+ seconds ago + { + var newHash = subtitle.GetFastHashCode(string.Empty); + if (newHash != _lastShowSubHash) + { + videoPlayerContainer.SetSubtitleText(p == null ? string.Empty : p.Text, p, subtitle); + _lastShowSubHash = newHash; + } + + _lastShowSubTicks = DateTime.UtcNow.Ticks; + } + } + + public static int ShowSubtitle(Subtitle subtitle, Subtitle original, VideoPlayerContainer videoPlayerContainer) + { + if (videoPlayerContainer.VideoPlayer == null) + { + return -1; + } + + double positionInMilliseconds = (videoPlayerContainer.VideoPlayer.CurrentPosition * TimeCode.BaseUnit) + 15; + var max = subtitle.Paragraphs.Count; + for (int i = 0; i < max; i++) + { + var p = subtitle.Paragraphs[i]; + if (p.StartTime.TotalMilliseconds <= positionInMilliseconds && p.EndTime.TotalMilliseconds > positionInMilliseconds) + { + var op = Utilities.GetOriginalParagraph(0, p, original.Paragraphs); + string text = p.Text.Replace("|", Environment.NewLine); + if (op != null) + { + text = text + Environment.NewLine + Environment.NewLine + op.Text.Replace("|", Environment.NewLine); + } + + bool isInfo = p == subtitle.Paragraphs[0] && Math.Abs(p.StartTime.TotalMilliseconds) < 0.01 && positionInMilliseconds > 3000; + if (!isInfo) + { + if (videoPlayerContainer.LastParagraph != p || videoPlayerContainer.SubtitleText != text) + { + videoPlayerContainer.SetSubtitleText(text, p, subtitle); + } + return i; + } + } + } + if (!string.IsNullOrEmpty(videoPlayerContainer.SubtitleText)) + { + videoPlayerContainer.SetSubtitleText(string.Empty, null, subtitle); + } + return -1; + } + + public static bool IsQuartsDllInstalled + { + get + { + if (Utilities.IsRunningOnMono()) + { + return false; + } + + string quartzFileName = Environment.GetFolderPath(Environment.SpecialFolder.System).TrimEnd('\\') + @"\quartz.dll"; + return File.Exists(quartzFileName); + } + } + + public static bool IsMpcHcInstalled + { + get + { + if (Utilities.IsRunningOnMono()) + { + return false; + } + + try + { + return VideoPlayers.MpcHC.MpcHc.GetMpcHcFileName() != null; + } + catch (FileNotFoundException) + { + return false; + } + } + } + + public static VideoPlayer GetVideoPlayer() + { + var gs = Configuration.Settings.General; + + if (Configuration.IsRunningOnLinux) + { + if (gs.VideoPlayer == "VLC" && LibVlcDynamic.IsInstalled) + { + return new LibVlcDynamic(); + } + if (LibMpvDynamic.IsInstalled) + { + return new LibMpvDynamic(); + } + throw new NotSupportedException("You need 'libmpv-dev' or 'libvlc-dev' (on Ubuntu) and X11 to use the video player on Linux!"); + } + // Mono on OS X is 32 bit and thus requires 32 bit VLC. Place VLC in the same + // folder as Subtitle Edit and add this to the app.config inside the + // "configuration" element: + // <dllmap dll="libvlc" target="VLC.app/Contents/MacOS/lib/libvlc.dylib" /> + if (Configuration.IsRunningOnMac) + { + return new LibVlcMono(); + } + + if (gs.VideoPlayer == "VLC" && LibVlcDynamic.IsInstalled) + { + return new LibVlcDynamic(); + } + + if (gs.VideoPlayer == "MPV" && LibMpvDynamic.IsInstalled) + { + return new LibMpvDynamic(); + } + + if (gs.VideoPlayer == "MPC-HC" && VideoPlayers.MpcHC.MpcHc.IsInstalled) + { + return new VideoPlayers.MpcHC.MpcHc(); + } + + if (IsQuartsDllInstalled) + { + return new QuartsPlayer(); + } + + throw new NotSupportedException("You need DirectX, or mpv media player, or VLC media player installed as well as Subtitle Edit dll files in order to use the video player!"); + } + + public static bool InitializeVideoPlayerAndContainer(string fileName, VideoInfo videoInfo, VideoPlayerContainer videoPlayerContainer, EventHandler onVideoLoaded, EventHandler onVideoEnded) + { + try + { + videoPlayerContainer.VideoPlayer = GetVideoPlayer(); + videoPlayerContainer.VideoPlayer.Initialize(videoPlayerContainer.PanelPlayer, fileName, onVideoLoaded, onVideoEnded); + videoPlayerContainer.ShowStopButton = Configuration.Settings.General.VideoPlayerShowStopButton; + videoPlayerContainer.ShowFullscreenButton = false; + videoPlayerContainer.ShowMuteButton = Configuration.Settings.General.VideoPlayerShowMuteButton; + videoPlayerContainer.Volume = Configuration.Settings.General.VideoPlayerDefaultVolume; + videoPlayerContainer.EnableMouseWheelStep(); + if (fileName != null && (fileName.StartsWith("https://", StringComparison.OrdinalIgnoreCase) || fileName.StartsWith("http://", StringComparison.OrdinalIgnoreCase))) + { + // we don't have videoInfo for streams... + } + else + { + videoPlayerContainer.VideoWidth = videoInfo.Width; + videoPlayerContainer.VideoHeight = videoInfo.Height; + videoPlayerContainer.VideoPlayer.Resize(videoPlayerContainer.PanelPlayer.Width, videoPlayerContainer.PanelPlayer.Height); + } + + return true; + } + catch (Exception exception) + { + videoPlayerContainer.VideoPlayer = null; + var videoError = new VideoError(); + videoError.Initialize(fileName, exception); + videoError.ShowDialog(); + SeLogger.Error(exception, "InitializeVideoPlayerAndContainer failed to load video player"); + return false; + } + } + + public static void CheckAutoWrap(TextBox textBox, KeyEventArgs e, int numberOfNewLines) + { + // Do not auto-break lines more than 1 line. + if (numberOfNewLines != 1 || !Configuration.Settings.General.AutoWrapLineWhileTyping) + { + return; + } + + int length = HtmlUtil.RemoveHtmlTags(textBox.Text, true).Length; + if (e.Modifiers == Keys.None && e.KeyCode != Keys.Enter && length > Configuration.Settings.General.SubtitleLineMaximumLength) + { + string newText; + if (length > Configuration.Settings.General.SubtitleLineMaximumLength + 30) + { + newText = Utilities.AutoBreakLine(textBox.Text); + } + else + { + int lastSpace = textBox.Text.LastIndexOf(' '); + if (lastSpace > 0) + { + newText = textBox.Text.Remove(lastSpace, 1).Insert(lastSpace, Environment.NewLine); + } + else + { + newText = textBox.Text; + } + } + + int autoBreakIndex = newText.IndexOf(Environment.NewLine, StringComparison.Ordinal); + if (autoBreakIndex > 0) + { + int selectionStart = textBox.SelectionStart; + textBox.Text = newText; + if (selectionStart > autoBreakIndex) + { + selectionStart += Environment.NewLine.Length - 1; + } + if (selectionStart >= 0) + { + textBox.SelectionStart = selectionStart; + } + } + } + } + + public static void CheckAutoWrap(SETextBox textBox, KeyEventArgs e, int numberOfNewLines) + { + // Do not auto-break lines more than 1 line. + if (numberOfNewLines != 1 || !Configuration.Settings.General.AutoWrapLineWhileTyping) + { + return; + } + + int length = HtmlUtil.RemoveHtmlTags(textBox.Text, true).Length; + if (e.Modifiers == Keys.None && e.KeyCode != Keys.Enter && length > Configuration.Settings.General.SubtitleLineMaximumLength) + { + string newText; + if (length > Configuration.Settings.General.SubtitleLineMaximumLength + 30) + { + newText = Utilities.AutoBreakLine(textBox.Text); + } + else + { + int lastSpace = textBox.Text.LastIndexOf(' '); + if (lastSpace > 0) + { + newText = textBox.Text.Remove(lastSpace, 1).Insert(lastSpace, Environment.NewLine); + } + else + { + newText = textBox.Text; + } + } + + int autoBreakIndex = newText.IndexOf(Environment.NewLine, StringComparison.Ordinal); + if (autoBreakIndex > 0) + { + int selectionStart = textBox.SelectionStart; + textBox.Text = newText; + if (selectionStart > autoBreakIndex) + { + selectionStart += Environment.NewLine.Length - 1; + } + if (selectionStart >= 0) + { + textBox.SelectionStart = selectionStart; + } + } + } + } + + private static readonly Dictionary<string, Keys> AllKeys = new Dictionary<string, Keys>(); + private static Keys _helpKeys; + + public static Keys GetKeys(string keysInString) + { + if (string.IsNullOrEmpty(keysInString)) + { + return Keys.None; + } + + if (AllKeys.Count == 0) + { + foreach (Keys val in Enum.GetValues(typeof(Keys))) + { + string k = val.ToString().ToLowerInvariant(); + if (!AllKeys.ContainsKey(k)) + { + AllKeys.Add(k, val); + } + } + if (!AllKeys.ContainsKey("pagedown")) + { + AllKeys.Add("pagedown", Keys.RButton | Keys.Space); + } + + if (!AllKeys.ContainsKey("home")) + { + AllKeys.Add("home", Keys.MButton | Keys.Space); + } + + if (!AllKeys.ContainsKey("capslock")) + { + AllKeys.Add("capslock", Keys.CapsLock); + } + } + + string[] parts = keysInString.ToLowerInvariant().Split(new[] { '+' }, StringSplitOptions.RemoveEmptyEntries); + var resultKeys = Keys.None; + foreach (string k in parts) + { + if (AllKeys.ContainsKey(k)) + { + resultKeys = resultKeys | AllKeys[k]; + } + } + return resultKeys; + } + + public static Keys HelpKeys + { + get + { + if (_helpKeys == Keys.None) + { + _helpKeys = GetKeys(Configuration.Settings.Shortcuts.GeneralHelp); + } + return _helpKeys; + } + set => _helpKeys = value; + } + + public static void SetButtonHeight(Control control, int newHeight, int level) + { + if (level > 6) + { + return; + } + + if (control.HasChildren) + { + foreach (Control subControl in control.Controls) + { + if (subControl.HasChildren) + { + SetButtonHeight(subControl, newHeight, level + 1); + } + else if (subControl is Button) + { + subControl.Height = newHeight; + } + } + } + else if (control is Button) + { + control.Height = newHeight; + } + } + + public static void InitializeSubtitleFont(Control control) + { + var gs = Configuration.Settings.General; + + if (string.IsNullOrEmpty(gs.SubtitleFontName)) + { + gs.SubtitleFontName = DefaultSystemFont.Name; + } + + try + { + if (control is ListView) + { + if (gs.SubtitleListViewFontBold) + { + control.Font = new Font(gs.SubtitleFontName, gs.SubtitleListViewFontSize, FontStyle.Bold); + } + else + { + control.Font = new Font(gs.SubtitleFontName, gs.SubtitleListViewFontSize); + } + } + else if (control is SETextBox || control is TextBox) + { + if (gs.SubtitleTextBoxFontBold) + { + control.Font = new Font(gs.SubtitleFontName, gs.SubtitleTextBoxFontSize, FontStyle.Bold); + } + else + { + control.Font = new Font(gs.SubtitleFontName, gs.SubtitleTextBoxFontSize); + } + } + + control.BackColor = gs.SubtitleBackgroundColor; + control.ForeColor = gs.SubtitleFontColor; + } + catch + { + // ignored + } + } + + private static Font _defaultSystemFont; + private static Font DefaultSystemFont + { + get + { + if (_defaultSystemFont != null) + { + return _defaultSystemFont; + } + + var font = SystemFonts.MessageBoxFont; + if (Configuration.IsRunningOnLinux && IsFontPresent(Configuration.DefaultLinuxFontName)) + { + font = new Font(Configuration.DefaultLinuxFontName, 8F); + } + + _defaultSystemFont = IsFontPresent(font.Name) ? font : SystemFonts.DefaultFont; + return _defaultSystemFont; + } + } + + private static bool IsFontPresent(string fontName) + { + try + { + // Bold + italic + regular must be present + _ = new Font(fontName, 9, FontStyle.Bold); + _ = new Font(fontName, 9, FontStyle.Italic); + _ = new Font(fontName, 9, FontStyle.Regular); + return true; + } + catch + { + // ignore + } + + return false; + } + + public static Font GetDefaultFont() + { + var gs = Configuration.Settings.General; + if (string.IsNullOrEmpty(gs.SystemSubtitleFontNameOverride) || gs.SystemSubtitleFontSizeOverride < 5) + { + return DefaultSystemFont; + } + + try + { + return new Font(gs.SystemSubtitleFontNameOverride, gs.SystemSubtitleFontSizeOverride); + } + catch + { + return DefaultSystemFont; + } + } + + internal static void PreInitialize(Form form) + { + form.AutoScaleMode = AutoScaleMode.Dpi; + form.Font = GetDefaultFont(); + } + + public static void FixFonts(Control form, int iterations = 5) + { + FixFontsInner(form, iterations); + if (Configuration.Settings.General.UseDarkTheme) + { + DarkTheme.SetDarkTheme(form, 1500); + } + } + + internal static void FixFonts(ToolStripItem item) + { + item.Font = GetDefaultFont(); + if (Configuration.Settings.General.UseDarkTheme) + { + DarkTheme.SetDarkTheme(item); + } + } + + internal static void FixFonts(ToolStripComboBox item) + { + item.Font = GetDefaultFont(); + if (Configuration.Settings.General.UseDarkTheme) + { + DarkTheme.SetDarkTheme(item); + } + } + + private static void FixFontsInner(Control form, int iterations = 5) + { + if (iterations < 1 || form is SETextBox) + { + return; + } + + if (form is ContextMenuStrip cms) + { + foreach (var item in cms.Items) + { + if (item is ToolStripMenuItem tsmi) + { + tsmi.Font = GetDefaultFont(); + if (tsmi.HasDropDownItems) + { + foreach (var innerItem in tsmi.DropDownItems) + { + if (innerItem is ToolStripMenuItem innerTsmi) + { + innerTsmi.Font = GetDefaultFont(); + } + } + } + } + } + } + + if (form is TimeUpDown timeUpDown) + { + using (var g = Graphics.FromHwnd(IntPtr.Zero)) + { + var width = g.MeasureString("00:00:00.000", form.Font).Width; + if (timeUpDown.MaskedTextBox.Width < width - 3) + { + timeUpDown.MaskedTextBox.Font = new Font(timeUpDown.MaskedTextBox.Font.FontFamily, timeUpDown.MaskedTextBox.Font.Size - 1); + } + width = g.MeasureString("00:00:00.000", form.Font).Width; + if (timeUpDown.MaskedTextBox.Width < width - 3) + { + timeUpDown.MaskedTextBox.Font = new Font(timeUpDown.MaskedTextBox.Font.FontFamily, timeUpDown.MaskedTextBox.Font.Size - 1); + } + } + } + + foreach (Control c in form.Controls) + { + if (!c.Font.Name.Equals("Tahoma", StringComparison.Ordinal)) + { + c.Font = GetDefaultFont(); + } + + foreach (Control inner in c.Controls) + { + FixFontsInner(inner, iterations - 1); + } + } + } + + public static void FixLargeFonts(Control mainCtrl, Control ctrl) + { + using (Graphics graphics = mainCtrl.CreateGraphics()) + { + SizeF textSize = graphics.MeasureString(ctrl.Text, ctrl.Font); + if (textSize.Height > ctrl.Height - 4) + { + SetButtonHeight(mainCtrl, (int)Math.Round(textSize.Height + 7.5), 1); + } + } + } + + public static void SetSaveDialogFilter(SaveFileDialog saveFileDialog, SubtitleFormat currentFormat) + { + var sb = new StringBuilder(); + int index = 0; + foreach (SubtitleFormat format in SubtitleFormat.AllSubtitleFormats) + { + sb.Append(format.Name + "|*" + format.Extension + "|"); + if (currentFormat.Name == format.Name) + { + saveFileDialog.FilterIndex = index + 1; + } + index++; + } + saveFileDialog.Filter = sb.ToString().TrimEnd('|'); + } + + public static void GetLineLengths(Label label, string text) + { + label.ForeColor = ForeColor; + var lines = text.SplitToLines(); + const int max = 3; + var sb = new StringBuilder(); + for (int i = 0; i < lines.Count; i++) + { + string line = lines[i]; + if (i > 0) + { + sb.Append('/'); + } + + if (i > max) + { + sb.Append("..."); + label.Text = sb.ToString(); + return; + } + + sb.Append(line.CountCharacters(false, Configuration.Settings.General.IgnoreArabicDiacritics)); + if (line.CountCharacters(false, Configuration.Settings.General.IgnoreArabicDiacritics) > Configuration.Settings.General.SubtitleLineMaximumLength || i >= Configuration.Settings.General.MaxNumberOfLines) + { + label.ForeColor = Color.Red; + } + } + label.Text = sb.ToString(); + } + + public static void GetLinePixelWidths(Label label, string text) + { + label.ForeColor = ForeColor; + var lines = text.SplitToLines(); + const int max = 3; + var sb = new StringBuilder(); + for (int i = 0; i < lines.Count; i++) + { + string line = lines[i]; + if (i > 0) + { + sb.Append('/'); + } + + if (i > max) + { + sb.Append("..."); + label.Text = sb.ToString(); + return; + } + + int lineWidth = TextWidth.CalcPixelWidth(line); + sb.Append(lineWidth); + if (lineWidth > Configuration.Settings.General.SubtitleLineMaximumPixelWidth) + { + label.ForeColor = Color.Red; + } + } + label.Text = sb.ToString(); + } + + public static void InitializeSubtitleFormatComboBox(ToolStripComboBox comboBox, SubtitleFormat format) + { + InitializeSubtitleFormatComboBox(comboBox.ComboBox, format); + comboBox.DropDownWidth += 5; // .Net quirk? + } + + public static void InitializeSubtitleFormatComboBox(ComboBox comboBox, SubtitleFormat format) + { + InitializeSubtitleFormatComboBox(comboBox, new List<string> { format.FriendlyName }, format.FriendlyName); + } + + public static void InitializeSubtitleFormatComboBox(ToolStripComboBox comboBox, string selectedName) + { + InitializeSubtitleFormatComboBox(comboBox.ComboBox, selectedName); + comboBox.DropDownWidth += 5; // .Net quirk? + } + + public static void InitializeSubtitleFormatComboBox(ComboBox comboBox, string selectedName) + { + var formatNames = SubtitleFormat.AllSubtitleFormats.Where(format => !format.IsVobSubIndexFile).Select(format => format.FriendlyName); + InitializeSubtitleFormatComboBox(comboBox, formatNames.ToList(), selectedName); + } + + public static void InitializeSubtitleFormatComboBox(ComboBox comboBox, List<string> formatNames, string selectedName) + { + var selectedIndex = 0; + using (var graphics = comboBox.CreateGraphics()) + { + var maxWidth = (float)comboBox.DropDownWidth; + var max = formatNames.Count; + for (var index = 0; index < max; index++) + { + var name = formatNames[index]; + if (name.Equals(selectedName, StringComparison.OrdinalIgnoreCase)) + { + selectedIndex = index; + } + if (name.Length > 30) + { + var width = graphics.MeasureString(name, comboBox.Font).Width; + if (width > maxWidth) + { + maxWidth = width; + } + } + } + comboBox.DropDownWidth = (int)Math.Round(maxWidth + 7.5); + } + comboBox.BeginUpdate(); + comboBox.Items.Clear(); + comboBox.Items.AddRange(formatNames.ToArray<object>()); + comboBox.SelectedIndex = selectedIndex; + comboBox.EndUpdate(); + } + + public static void InitializeTextEncodingComboBox(ComboBox comboBox) + { + var defaultEncoding = Configuration.Settings.General.DefaultEncoding; + var selectedItem = (TextEncoding)null; + comboBox.BeginUpdate(); + comboBox.Items.Clear(); + var encList = new List<TextEncoding>(); + using (var graphics = comboBox.CreateGraphics()) + { + var maxWidth = 0.0F; + foreach (var encoding in Configuration.AvailableEncodings) + { + if (encoding.CodePage >= 874 && !encoding.IsEbcdic()) + { + var item = new TextEncoding(encoding, null); + if (selectedItem == null && item.Equals(defaultEncoding)) + { + selectedItem = item; + } + var width = graphics.MeasureString(item.DisplayName, comboBox.Font).Width; + if (width > maxWidth) + { + maxWidth = width; + } + if (encoding.CodePage.Equals(Encoding.UTF8.CodePage)) + { + item = new TextEncoding(Encoding.UTF8, TextEncoding.Utf8WithBom); + encList.Insert(TextEncoding.Utf8WithBomIndex, item); + if (item.Equals(defaultEncoding)) + { + selectedItem = item; + } + + item = new TextEncoding(Encoding.UTF8, TextEncoding.Utf8WithoutBom); + encList.Insert(TextEncoding.Utf8WithoutBomIndex, item); + if (item.Equals(defaultEncoding)) + { + selectedItem = item; + } + } + else + { + encList.Add(item); + } + } + } + comboBox.DropDownWidth = (int)Math.Round(maxWidth + 7.5); + } + comboBox.Items.AddRange(encList.ToArray<object>()); + if (selectedItem == null) + { + comboBox.SelectedIndex = TextEncoding.Utf8WithBomIndex; // UTF-8 if DefaultEncoding is not found + } + else if (selectedItem.DisplayName == TextEncoding.Utf8WithoutBom) + { + comboBox.SelectedIndex = TextEncoding.Utf8WithoutBomIndex; + } + else + { + comboBox.SelectedItem = selectedItem; + } + comboBox.EndUpdate(); + if (comboBox.SelectedItem is TextEncoding textEncodingListItem) + { + Configuration.Settings.General.DefaultEncoding = textEncodingListItem.DisplayName; + } + comboBox.AutoCompleteSource = AutoCompleteSource.ListItems; + comboBox.AutoCompleteMode = AutoCompleteMode.Append; + } + + public static TextEncoding GetTextEncodingComboBoxCurrentEncoding(ComboBox comboBox) + { + if (comboBox.SelectedIndex > 0 && comboBox.SelectedItem is TextEncoding textEncodingListItem) + { + return textEncodingListItem; + } + return new TextEncoding(Encoding.UTF8, TextEncoding.Utf8WithBom); + } + + public static void SetTextEncoding(ToolStripComboBox comboBoxEncoding, string encodingName) + { + if (encodingName == TextEncoding.Utf8WithBom) + { + comboBoxEncoding.SelectedIndex = TextEncoding.Utf8WithBomIndex; + return; + } + + if (encodingName == TextEncoding.Utf8WithoutBom) + { + comboBoxEncoding.SelectedIndex = TextEncoding.Utf8WithoutBomIndex; + return; + } + + foreach (TextEncoding item in comboBoxEncoding.Items) + { + if (item.Equals(encodingName)) + { + comboBoxEncoding.SelectedItem = item; + return; + } + } + + comboBoxEncoding.SelectedIndex = TextEncoding.Utf8WithBomIndex; // UTF-8 with BOM + } + + + + private const string BreakChars = "\",:;.¡!¿?()[]{}<>♪♫-–—/#*|؟،"; + + public static void ApplyControlBackspace(TextBox textBox) + { + if (textBox.SelectionLength == 0) + { + var text = textBox.Text; + var deleteUpTo = textBox.SelectionStart; + if (deleteUpTo > 0 && deleteUpTo <= text.Length) + { + text = text.Substring(0, deleteUpTo); + var textElementIndices = StringInfo.ParseCombiningCharacters(text); + var index = textElementIndices.Length; + var textIndex = deleteUpTo; + var deleteFrom = -1; + while (index > 0) + { + index--; + textIndex = textElementIndices[index]; + if (!IsSpaceCategory(CharUnicodeInfo.GetUnicodeCategory(text, textIndex))) + { + break; + } + } + if (index > 0) // HTML tag? + { + if (text[textIndex] == '>') + { + var openingBracketIndex = text.LastIndexOf('<', textIndex - 1); + if (openingBracketIndex >= 0 && text.IndexOf('>', openingBracketIndex + 1) == textIndex) + { + deleteFrom = openingBracketIndex; // delete whole tag + } + } + else if (text[textIndex] == '}') + { + var startIdx = text.LastIndexOf(@"{\", textIndex - 1, StringComparison.Ordinal); + if (startIdx >= 0 && text.IndexOf('}', startIdx + 1) == textIndex) + { + deleteFrom = startIdx; + } + } + } + if (deleteFrom < 0) + { + if (BreakChars.Contains(text[textIndex])) + { + deleteFrom = -2; + } + + while (index > 0) + { + index--; + textIndex = textElementIndices[index]; + if (IsSpaceCategory(CharUnicodeInfo.GetUnicodeCategory(text, textIndex))) + { + if (deleteFrom > -2) + { + if (deleteFrom < 0) + { + deleteFrom = textElementIndices[index + 1]; + } + break; + } + deleteFrom = textElementIndices[index + 1]; + if (!":!?".Contains(text[deleteFrom])) + { + break; + } + } + else if (BreakChars.Contains(text[textIndex])) + { + if (deleteFrom > -2) + { + if (deleteFrom < 0) + { + deleteFrom = textElementIndices[index + 1]; + } + break; + } + } + else + { + deleteFrom = -1; + } + } + } + if (deleteFrom < deleteUpTo) + { + if (deleteFrom < 0) + { + deleteFrom = 0; + } + textBox.Select(deleteFrom, deleteUpTo - deleteFrom); + textBox.Paste(string.Empty); + } + } + } + } + + public static void SelectWordAtCaret(SETextBox textBox) + { + var text = textBox.Text; + var endIndex = textBox.SelectionStart; + var startIndex = endIndex; + + while (startIndex > 0 && !IsSpaceCategory(CharUnicodeInfo.GetUnicodeCategory(text[startIndex - 1])) && !BreakChars.Contains(text[startIndex - 1])) + { + startIndex--; + } + textBox.SelectionStart = startIndex; + + while (endIndex < text.Length && !IsSpaceCategory(CharUnicodeInfo.GetUnicodeCategory(text[endIndex])) && !BreakChars.Contains(text[endIndex])) + { + endIndex++; + } + textBox.SelectionLength = endIndex - startIndex; + } + + private static bool IsSpaceCategory(UnicodeCategory c) + { + return c == UnicodeCategory.SpaceSeparator || c == UnicodeCategory.Control || c == UnicodeCategory.LineSeparator || c == UnicodeCategory.ParagraphSeparator; + } + + private static void AddExtension(StringBuilder sb, string extension) + { + if (!sb.ToString().Contains("*" + extension + ";", StringComparison.OrdinalIgnoreCase)) + { + sb.Append('*'); + sb.Append(extension.TrimStart('*')); + sb.Append(';'); + } + } + + private static string GetOpenDialogFilter() + { + var sb = new StringBuilder(); + sb.Append(Configuration.Settings.Language.General.SubtitleFiles + "|"); + foreach (SubtitleFormat s in SubtitleFormat.AllSubtitleFormats) + { + AddExtension(sb, s.Extension); + foreach (string ext in s.AlternateExtensions) + { + AddExtension(sb, ext); + } + } + AddExtension(sb, new Pac().Extension); + AddExtension(sb, new Cavena890().Extension); + AddExtension(sb, new Spt().Extension); + AddExtension(sb, new Sptx().Extension); + AddExtension(sb, new Wsb().Extension); + AddExtension(sb, new CheetahCaption().Extension); + AddExtension(sb, ".chk"); + AddExtension(sb, new CaptionsInc().Extension); + AddExtension(sb, new Ultech130().Extension); + AddExtension(sb, new ELRStudioClosedCaption().Extension); + AddExtension(sb, ".uld"); // Ultech drop frame + AddExtension(sb, new SonicScenaristBitmaps().Extension); + AddExtension(sb, ".mks"); + AddExtension(sb, ".mxf"); + AddExtension(sb, ".sup"); + AddExtension(sb, ".dost"); + AddExtension(sb, new FinalDraftTemplate2().Extension); + AddExtension(sb, new Ayato().Extension); + AddExtension(sb, new PacUnicode().Extension); + AddExtension(sb, new WinCaps32().Extension); + AddExtension(sb, new IsmtDfxp().Extension); + AddExtension(sb, new PlayCaptionsFreeEditor().Extension); + AddExtension(sb, ".cdg"); // karaoke + + if (!string.IsNullOrEmpty(Configuration.Settings.General.OpenSubtitleExtraExtensions)) + { + var extraExtensions = Configuration.Settings.General.OpenSubtitleExtraExtensions.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries); + foreach (string ext in extraExtensions) + { + if (ext.StartsWith("*.", StringComparison.Ordinal) && !sb.ToString().Contains(ext, StringComparison.OrdinalIgnoreCase)) + { + AddExtension(sb, ext); + } + } + } + AddExtension(sb, ".son"); + AddExtension(sb, ".mts"); + AddExtension(sb, ".m2ts"); + + sb.Append('|'); + sb.Append(Configuration.Settings.Language.General.AllFiles); + sb.Append("|*.*"); + return sb.ToString(); + } + + public static string GetListViewTextFromString(string s) => s.Replace(Environment.NewLine, Configuration.Settings.General.ListViewLineSeparatorString); + + public static string GetStringFromListViewText(string lviText) => lviText.Replace(Configuration.Settings.General.ListViewLineSeparatorString, Environment.NewLine); + + public static void SelectAll(this ListView lv) + { + lv.BeginUpdate(); + foreach (ListViewItem item in lv.Items) + { + item.Selected = true; + } + lv.EndUpdate(); + } + + public static void SelectFirstSelectedItemOnly(this ListView lv) + { + int itemsCount = lv.SelectedItems.Count - 1; + if (itemsCount > 0) + { + lv.BeginUpdate(); + do + { + lv.SelectedItems[itemsCount--].Selected = false; + } + while (itemsCount > 0); + if (lv.SelectedItems.Count > 0) + { + lv.EnsureVisible(lv.SelectedItems[0].Index); + lv.FocusedItem = lv.SelectedItems[0]; + } + else if (lv.Items.Count > 0) + { + lv.EnsureVisible(0); + lv.FocusedItem = lv.Items[0]; + } + lv.EndUpdate(); + } + } + + public static void InverseSelection(this ListView lv) + { + lv.BeginUpdate(); + foreach (ListViewItem item in lv.Items) + { + item.Selected = !item.Selected; + } + lv.EndUpdate(); + } + + internal static void CleanUpMenuItemPlugin(ToolStripMenuItem tsmi) + { + if (tsmi == null) + { + return; + } + for (int k = tsmi.DropDownItems.Count - 1; k > 0; k--) + { + ToolStripItem x = tsmi.DropDownItems[k]; + var fileName = (string)x.Tag; + if (!string.IsNullOrEmpty(fileName) && fileName.EndsWith(".dll", StringComparison.OrdinalIgnoreCase)) + { + tsmi.DropDownItems.Remove(x); + } + } + } + + public static Color BackColor => Configuration.Settings.General.UseDarkTheme ? DarkTheme.BackColor : Control.DefaultBackColor; + + public static Color ForeColor => Configuration.Settings.General.UseDarkTheme ? DarkTheme.ForeColor : Control.DefaultForeColor; + + public static void OpenFolderFromFileName(string fileName) + { + string folderName = Path.GetDirectoryName(fileName); + if (Configuration.IsRunningOnWindows) + { + string argument = @"/select, " + fileName; + System.Diagnostics.Process.Start("explorer.exe", argument); + } + else + { + UiUtil.OpenFolder(folderName); + } + } + + public static void OpenFolder(string folder) + { + OpenItem(folder, "folder"); + } + + public static void OpenURL(string url) + { + OpenItem(url, "url"); + } + + public static void OpenFile(string file) + { + OpenItem(file, "file"); + } + + public static void OpenItem(string item, string type) + { + try + { + if (Configuration.IsRunningOnWindows || Configuration.IsRunningOnMac) + { + System.Diagnostics.Process.Start(item); + } + else if (Configuration.IsRunningOnLinux) + { + System.Diagnostics.Process process = new System.Diagnostics.Process(); + process.EnableRaisingEvents = false; + process.StartInfo.FileName = "xdg-open"; + process.StartInfo.Arguments = item; + process.Start(); + } + } + catch (Exception exception) + { + MessageBox.Show($"Cannot open {type}: {item}{Environment.NewLine}{Environment.NewLine}{exception.Source}: {exception.Message}", "Error opening URL", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } +} diff --git a/src/Logic/VideoPlayers/DirectShowLib2005.cs b/src/ui/Logic/VideoPlayers/DirectShowLib2005.cs similarity index 100% rename from src/Logic/VideoPlayers/DirectShowLib2005.cs rename to src/ui/Logic/VideoPlayers/DirectShowLib2005.cs diff --git a/src/Logic/VideoPlayers/LibMpvDynamic.cs b/src/ui/Logic/VideoPlayers/LibMpvDynamic.cs similarity index 97% rename from src/Logic/VideoPlayers/LibMpvDynamic.cs rename to src/ui/Logic/VideoPlayers/LibMpvDynamic.cs index fcae35a10..5da61fe4f 100644 --- a/src/Logic/VideoPlayers/LibMpvDynamic.cs +++ b/src/ui/Logic/VideoPlayers/LibMpvDynamic.cs @@ -1,705 +1,705 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Core.SubtitleFormats; -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Runtime.InteropServices; -using System.Text; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Logic.VideoPlayers -{ - public class LibMpvDynamic : VideoPlayer, IDisposable - { - - #region mpv dll methods - see https://github.com/mpv-player/mpv/blob/master/libmpv/client.h - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate IntPtr MpvCreate(); - private MpvCreate _mpvCreate; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate int MpvInitialize(IntPtr mpvHandle); - private MpvInitialize _mpvInitialize; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate int MpvCommand(IntPtr mpvHandle, IntPtr utf8Strings); - private MpvCommand _mpvCommand; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate IntPtr MpvWaitEvent(IntPtr mpvHandle, double wait); - private MpvWaitEvent _mpvWaitEvent; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate int MpvSetOption(IntPtr mpvHandle, byte[] name, int format, ref long data); - private MpvSetOption _mpvSetOption; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate int MpvSetOptionString(IntPtr mpvHandle, byte[] name, byte[] value); - private MpvSetOptionString _mpvSetOptionString; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate int MpvGetPropertystring(IntPtr mpvHandle, byte[] name, int format, ref IntPtr data); - private MpvGetPropertystring _mpvGetPropertyString; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate int MpvGetPropertyDouble(IntPtr mpvHandle, byte[] name, int format, ref double data); - private MpvGetPropertyDouble _mpvGetPropertyDouble; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate int MpvSetProperty(IntPtr mpvHandle, byte[] name, int format, ref byte[] data); - private MpvSetProperty _mpvSetProperty; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate void MpvFree(IntPtr data); - private MpvFree _mpvFree; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate ulong MpvClientApiVersion(); - private MpvClientApiVersion _mpvClientApiVersion; - - #endregion - - private static IntPtr _libMpvDll = IntPtr.Zero; - private IntPtr _mpvHandle; - private Timer _videoLoadedTimer; - private double? _pausePosition; // Hack to hold precise seeking when paused - private string _secondSubtitleFileName; - - public override event EventHandler OnVideoLoaded; - public override event EventHandler OnVideoEnded; - - private const int MpvFormatString = 1; - - private object GetDllType(Type type, string name) - { - var address = NativeMethods.CrossGetProcAddress(_libMpvDll, name); - return address != IntPtr.Zero ? Marshal.GetDelegateForFunctionPointer(address, type) : null; - } - - private void LoadLibMpvDynamic() - { - _mpvCreate = (MpvCreate)GetDllType(typeof(MpvCreate), "mpv_create"); - _mpvInitialize = (MpvInitialize)GetDllType(typeof(MpvInitialize), "mpv_initialize"); - _mpvWaitEvent = (MpvWaitEvent)GetDllType(typeof(MpvWaitEvent), "mpv_wait_event"); - _mpvCommand = (MpvCommand)GetDllType(typeof(MpvCommand), "mpv_command"); - _mpvSetOption = (MpvSetOption)GetDllType(typeof(MpvSetOption), "mpv_set_option"); - _mpvSetOptionString = (MpvSetOptionString)GetDllType(typeof(MpvSetOptionString), "mpv_set_option_string"); - _mpvGetPropertyString = (MpvGetPropertystring)GetDllType(typeof(MpvGetPropertystring), "mpv_get_property"); - _mpvGetPropertyDouble = (MpvGetPropertyDouble)GetDllType(typeof(MpvGetPropertyDouble), "mpv_get_property"); - _mpvSetProperty = (MpvSetProperty)GetDllType(typeof(MpvSetProperty), "mpv_set_property"); - _mpvFree = (MpvFree)GetDllType(typeof(MpvFree), "mpv_free"); - _mpvClientApiVersion = (MpvClientApiVersion)GetDllType(typeof(MpvClientApiVersion), "mpv_client_api_version"); - } - - private bool IsAllMethodsLoaded() - { - return _mpvCreate != null && - _mpvInitialize != null && - _mpvWaitEvent != null && - _mpvCommand != null && - _mpvSetOption != null && - _mpvSetOptionString != null && - _mpvGetPropertyString != null && - _mpvGetPropertyDouble != null && - _mpvSetProperty != null && - _mpvFree != null; - } - - private static byte[] GetUtf8Bytes(string s) - { - return Encoding.UTF8.GetBytes(s + "\0"); - } - - public static IntPtr AllocateUtf8IntPtrArrayWithSentinel(string[] arr, out IntPtr[] byteArrayPointers) - { - int numberOfStrings = arr.Length + 1; // add extra element for extra null pointer last (sentinel) - byteArrayPointers = new IntPtr[numberOfStrings]; - IntPtr rootPointer = Marshal.AllocCoTaskMem(IntPtr.Size * numberOfStrings); - for (int index = 0; index < arr.Length; index++) - { - var bytes = GetUtf8Bytes(arr[index]); - IntPtr unmanagedPointer = Marshal.AllocHGlobal(bytes.Length); - Marshal.Copy(bytes, 0, unmanagedPointer, bytes.Length); - byteArrayPointers[index] = unmanagedPointer; - } - Marshal.Copy(byteArrayPointers, 0, rootPointer, numberOfStrings); - return rootPointer; - } - - private void DoMpvCommand(params string[] args) - { - if (_mpvHandle == IntPtr.Zero) - { - return; - } - - var mainPtr = AllocateUtf8IntPtrArrayWithSentinel(args, out var byteArrayPointers); - _mpvCommand(_mpvHandle, mainPtr); - foreach (var ptr in byteArrayPointers) - { - Marshal.FreeHGlobal(ptr); - } - Marshal.FreeHGlobal(mainPtr); - } - - public override string PlayerName => "libmpv " + VersionNumber; - - private int _volume = 75; - public override int Volume - { - get => _volume; - set - { - var v = Configuration.Settings.General.AllowVolumeBoost ? (int)Math.Round(value * 1.5) : value; - DoMpvCommand("set", "volume", v.ToString(CultureInfo.InvariantCulture)); - _volume = value; - } - } - - public override double Duration - { - get - { - lock (_lockObj) - { - if (_mpvHandle == IntPtr.Zero) - { - return 0; - } - - int mpvFormatDouble = 5; - double d = 0; - _mpvGetPropertyDouble(_mpvHandle, GetUtf8Bytes("duration"), mpvFormatDouble, ref d); - return d; - } - } - } - - public override double CurrentPosition - { - get - { - lock (_lockObj) - { - if (_mpvHandle == IntPtr.Zero) - { - return 0; - } - - if (_pausePosition != null) - { - if (_pausePosition < 0) - { - return 0; - } - - return _pausePosition.Value; - } - - int mpvFormatDouble = 5; - double d = 0; - _mpvGetPropertyDouble(_mpvHandle, GetUtf8Bytes("time-pos"), mpvFormatDouble, ref d); - return d; - } - } - set - { - lock (_lockObj) - { - - if (_mpvHandle == IntPtr.Zero) - { - return; - } - - if (IsPaused && value <= Duration) - { - _pausePosition = value; - } - - DoMpvCommand("seek", value.ToString(CultureInfo.InvariantCulture), "absolute"); - } - } - } - - private double _playRate = 1.0; - public override double PlayRate - { - get => _playRate; - set - { - DoMpvCommand("set", "speed", value.ToString(CultureInfo.InvariantCulture)); - _playRate = value; - } - } - - public void GetNextFrame() - { - if (_mpvHandle == IntPtr.Zero) - { - return; - } - - DoMpvCommand("frame-step"); - _pausePosition = null; - } - - public void GetPreviousFrame() - { - if (_mpvHandle == IntPtr.Zero) - { - return; - } - - DoMpvCommand("frame-back-step"); - _pausePosition = null; - } - - public override void Play() - { - lock (_lockObj) - { - if (_mpvHandle == IntPtr.Zero) - { - return; - } - - _pausePosition = null; - - if (_mpvHandle == IntPtr.Zero) - { - return; - } - - var bytes = GetUtf8Bytes("no"); - _mpvSetProperty(_mpvHandle, GetUtf8Bytes("pause"), MpvFormatString, ref bytes); - } - } - - public override void Pause() - { - lock (_lockObj) - { - if (_mpvHandle == IntPtr.Zero) - { - return; - } - - var bytes = GetUtf8Bytes("yes"); - _mpvSetProperty(_mpvHandle, GetUtf8Bytes("pause"), MpvFormatString, ref bytes); - } - } - - public override void Stop() - { - lock (_lockObj) - { - - if (_mpvHandle == IntPtr.Zero) - { - return; - } - - Pause(); - _pausePosition = null; - CurrentPosition = 0; - } - } - - public override bool IsPaused - { - get - { - if (_mpvHandle == IntPtr.Zero) - { - return true; - } - - var lpBuffer = IntPtr.Zero; - _mpvGetPropertyString(_mpvHandle, GetUtf8Bytes("pause"), MpvFormatString, ref lpBuffer); - var isPaused = Marshal.PtrToStringAnsi(lpBuffer) == "yes"; - _mpvFree(lpBuffer); - return isPaused; - } - } - - public override bool IsPlaying => !IsPaused; - - private List<KeyValuePair<int, string>> _audioTrackIds; - public List<KeyValuePair<int, string>> AudioTracks - { - get - { - if (_audioTrackIds == null) - { - _audioTrackIds = new List<KeyValuePair<int, string>>(); - var lpBuffer = IntPtr.Zero; - _mpvGetPropertyString(_mpvHandle, GetUtf8Bytes("track-list"), MpvFormatString, ref lpBuffer); - string trackListJson = Marshal.PtrToStringAnsi(lpBuffer); - foreach (var json in Json.ReadObjectArray(trackListJson)) - { - string trackType = Json.ReadTag(json, "type"); - int id = int.Parse(Json.ReadTag(json, "id")); - if (trackType == "audio") - { - string lang = Json.ReadTag(json, "lang"); - _audioTrackIds.Add(new KeyValuePair<int, string>(id, lang)); - } - } - _mpvFree(lpBuffer); - } - return _audioTrackIds; - } - } - - public int AudioTrackNumber - { - get - { - var lpBuffer = IntPtr.Zero; - _mpvGetPropertyString(_mpvHandle, GetUtf8Bytes("aid"), MpvFormatString, ref lpBuffer); - var numberString = Marshal.PtrToStringAnsi(lpBuffer); - if (string.IsNullOrEmpty(numberString)) - { - return 0; - } - - var id = int.Parse(numberString); - var idx = _audioTrackIds.FindIndex(x => x.Key == id); - var number = AudioTracks.Count > 1 && idx != -1 ? idx : 0; - _mpvFree(lpBuffer); - return number; - } - set - { - string id = "1"; - if (AudioTracks.Count > 1 && value >= 0 && value < _audioTrackIds.Count) - { - id = _audioTrackIds[value].Key.ToString(); - } - DoMpvCommand("set", "aid", id); - } - } - - public string VersionNumber - { - get - { - if (_mpvHandle == IntPtr.Zero) - { - return string.Empty; - } - - var version = _mpvClientApiVersion(); - var high = version >> 16; - var low = version & 0xff; - return high + "." + low; - } - } - - public void LoadSubtitle(string fileName) - { - DoMpvCommand("sub-add", fileName, "select"); - } - - public void LoadSecondSubtitle(string fileName) - { - _secondSubtitleFileName = fileName; - DoMpvCommand("sub-add", fileName, "select"); - } - - public void RemoveSubtitle() - { - if (!string.IsNullOrEmpty(_secondSubtitleFileName)) - { - return; - } - - DoMpvCommand("sub-remove"); - } - - public void ReloadSubtitle() - { - DoMpvCommand("sub-reload"); - } - - public void HideCursor() - { - _mpvSetOptionString(_mpvHandle, GetUtf8Bytes("cursor-autohide"), GetUtf8Bytes("always")); - } - - public void ShowCursor() - { - _mpvSetOptionString(_mpvHandle, GetUtf8Bytes("cursor-autohide"), GetUtf8Bytes("no")); - } - - public static bool IsInstalled - { - get - { - try - { - if (Configuration.IsRunningOnLinux) - { - return LoadLib(); - } - - var dllFile = GetMpvPath("mpv-1.dll"); - return File.Exists(dllFile); - } - catch (Exception ex) - { - SeLogger.Error(ex, "LibMpvDynamic.IsInstalled failed"); - return false; - } - } - } - - public static string GetMpvPath(string fileName) - { - if (Configuration.IsRunningOnWindows) - { - var path = Path.Combine(Configuration.DataDirectory, fileName); - if (File.Exists(path)) - { - return path; - } - } - - return null; - } - - private static bool LoadLib() - { - if (_libMpvDll == IntPtr.Zero) - { - if (Configuration.IsRunningOnWindows) - { - _libMpvDll = NativeMethods.CrossLoadLibrary(GetMpvPath("mpv-1.dll")); - } - else - { - _libMpvDll = NativeMethods.CrossLoadLibrary("libmpv.so"); - if (_libMpvDll == IntPtr.Zero) - { - _libMpvDll = NativeMethods.CrossLoadLibrary("libmpv.so.1"); - } - - int i = 107; - while (_libMpvDll == IntPtr.Zero && i < 120) - { - _libMpvDll = NativeMethods.CrossLoadLibrary($"libmpv.so.1.{i}.0"); - i++; - } - } - } - - return _libMpvDll != IntPtr.Zero; - } - - public override void Initialize(Control ownerControl, string videoFileName, EventHandler onVideoLoaded, EventHandler onVideoEnded) - { - _secondSubtitleFileName = null; - if (LoadLib()) - { - LoadLibMpvDynamic(); - if (!IsAllMethodsLoaded()) - { - throw new Exception("MPV - not all needed methods found in dll file"); - } - _mpvHandle = _mpvCreate.Invoke(); - - if (Configuration.Settings.General.MpvLogging) - { - var logFileName = Path.Combine(Configuration.DataDirectory, "mpv-log-" + Guid.NewGuid() + ".txt"); - _mpvSetOptionString(_mpvHandle, GetUtf8Bytes("log-file"), GetUtf8Bytes(logFileName)); - } - } - else if (!Directory.Exists(videoFileName)) - { - return; - } - - OnVideoLoaded = onVideoLoaded; - OnVideoEnded = onVideoEnded; - - if (!string.IsNullOrEmpty(videoFileName)) - { - _mpvInitialize.Invoke(_mpvHandle); - SetVideoOwner(ownerControl); - - string videoOutput = string.Empty; - if (Configuration.IsRunningOnLinux) - { - videoOutput = Configuration.Settings.General.MpvVideoOutputLinux; - } - else if (!string.IsNullOrWhiteSpace(Configuration.Settings.General.MpvVideoOutputWindows)) - { - videoOutput = Configuration.Settings.General.MpvVideoOutputWindows; - } - - if (!string.IsNullOrEmpty(videoOutput)) - { - _mpvSetOptionString(_mpvHandle, GetUtf8Bytes("vo"), GetUtf8Bytes(videoOutput)); - } - - _mpvSetOptionString(_mpvHandle, GetUtf8Bytes("keep-open"), GetUtf8Bytes("always")); // don't auto close video - _mpvSetOptionString(_mpvHandle, GetUtf8Bytes("no-sub"), GetUtf8Bytes("")); // don't load subtitles - if (videoFileName.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || - videoFileName.StartsWith("https://", StringComparison.OrdinalIgnoreCase)) - { - _mpvSetOptionString(_mpvHandle, GetUtf8Bytes("ytdl"), GetUtf8Bytes("yes")); - } - - if (!string.IsNullOrEmpty(Configuration.Settings.General.MpvExtraOption)) - { - var parts = Configuration.Settings.General.MpvExtraOption.Split('='); - if (parts.Length == 2) - { - _mpvSetOptionString(_mpvHandle, GetUtf8Bytes(parts[0]), GetUtf8Bytes(parts[1])); - } - else - { - _mpvSetOptionString(_mpvHandle, GetUtf8Bytes(Configuration.Settings.General.MpvExtraOption), GetUtf8Bytes("")); - } - } - - DoMpvCommand("loadfile", videoFileName); - - System.Threading.Thread.Sleep(100); - SetVideoOwner(ownerControl); - - _videoLoadedTimer = new Timer { Interval = 50 }; - _videoLoadedTimer.Tick += VideoLoadedTimer_Tick; - _videoLoadedTimer.Start(); - - SetVideoOwner(ownerControl); - } - } - - private void SetVideoOwner(Control ownerControl) - { - if (ownerControl != null) - { - int iterations = 25; - int returnCode = -1; - int mpvFormatInt64 = 4; - if (ownerControl.IsDisposed) - { - return; - } - var windowId = ownerControl.Handle.ToInt64(); - while (returnCode != 0 && iterations > 0) - { - Application.DoEvents(); - - lock (_lockObj) - { - if (_mpvHandle == IntPtr.Zero) - { - return; - } - returnCode = _mpvSetOption(_mpvHandle, GetUtf8Bytes("wid"), mpvFormatInt64, ref windowId); - if (returnCode != 0) - { - iterations--; - System.Threading.Thread.Sleep(100); - } - } - } - } - Pause(); - } - - private void VideoLoadedTimer_Tick(object sender, EventArgs e) - { - _videoLoadedTimer.Stop(); - const int mpvEventFileLoaded = 8; - int l = 0; - while (l < 10000) - { - Application.DoEvents(); - try - { - lock (_lockObj) - { - if (_mpvHandle == IntPtr.Zero) - { - return; - } - - var eventIdHandle = _mpvWaitEvent(_mpvHandle, 0); - var eventId = Convert.ToInt64(Marshal.PtrToStructure(eventIdHandle, typeof(int))); - if (eventId == mpvEventFileLoaded) - { - break; - } - } - l++; - } - catch - { - return; - } - } - Application.DoEvents(); - OnVideoLoaded?.Invoke(this, null); - Application.DoEvents(); - Pause(); - } - - public override void DisposeVideoPlayer() - { - Dispose(); - } - - private readonly object _lockObj = new object(); - private void ReleaseUnmanagedResources() - { - try - { - lock (_lockObj) - { - if (_mpvHandle != IntPtr.Zero) - { - HardDispose(); - } - } - } - catch - { - // ignored - } - } - - ~LibMpvDynamic() - { - Dispose(false); - } - - public void Dispose() - { - Dispose(true); - } - - public void HardDispose() - { - DoMpvCommand("stop"); - System.Threading.Thread.Sleep(150); - Application.DoEvents(); - DoMpvCommand("quit"); - _mpvHandle = IntPtr.Zero; - System.Threading.Thread.Sleep(150); - Application.DoEvents(); - System.Threading.Thread.Sleep(50); - Application.DoEvents(); - } - - protected virtual void Dispose(bool disposing) - { - ReleaseUnmanagedResources(); - } - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Core.SubtitleFormats; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Logic.VideoPlayers +{ + public class LibMpvDynamic : VideoPlayer, IDisposable + { + + #region mpv dll methods - see https://github.com/mpv-player/mpv/blob/master/libmpv/client.h + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate IntPtr MpvCreate(); + private MpvCreate _mpvCreate; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate int MpvInitialize(IntPtr mpvHandle); + private MpvInitialize _mpvInitialize; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate int MpvCommand(IntPtr mpvHandle, IntPtr utf8Strings); + private MpvCommand _mpvCommand; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate IntPtr MpvWaitEvent(IntPtr mpvHandle, double wait); + private MpvWaitEvent _mpvWaitEvent; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate int MpvSetOption(IntPtr mpvHandle, byte[] name, int format, ref long data); + private MpvSetOption _mpvSetOption; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate int MpvSetOptionString(IntPtr mpvHandle, byte[] name, byte[] value); + private MpvSetOptionString _mpvSetOptionString; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate int MpvGetPropertystring(IntPtr mpvHandle, byte[] name, int format, ref IntPtr data); + private MpvGetPropertystring _mpvGetPropertyString; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate int MpvGetPropertyDouble(IntPtr mpvHandle, byte[] name, int format, ref double data); + private MpvGetPropertyDouble _mpvGetPropertyDouble; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate int MpvSetProperty(IntPtr mpvHandle, byte[] name, int format, ref byte[] data); + private MpvSetProperty _mpvSetProperty; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate void MpvFree(IntPtr data); + private MpvFree _mpvFree; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate ulong MpvClientApiVersion(); + private MpvClientApiVersion _mpvClientApiVersion; + + #endregion + + private static IntPtr _libMpvDll = IntPtr.Zero; + private IntPtr _mpvHandle; + private Timer _videoLoadedTimer; + private double? _pausePosition; // Hack to hold precise seeking when paused + private string _secondSubtitleFileName; + + public override event EventHandler OnVideoLoaded; + public override event EventHandler OnVideoEnded; + + private const int MpvFormatString = 1; + + private object GetDllType(Type type, string name) + { + var address = NativeMethods.CrossGetProcAddress(_libMpvDll, name); + return address != IntPtr.Zero ? Marshal.GetDelegateForFunctionPointer(address, type) : null; + } + + private void LoadLibMpvDynamic() + { + _mpvCreate = (MpvCreate)GetDllType(typeof(MpvCreate), "mpv_create"); + _mpvInitialize = (MpvInitialize)GetDllType(typeof(MpvInitialize), "mpv_initialize"); + _mpvWaitEvent = (MpvWaitEvent)GetDllType(typeof(MpvWaitEvent), "mpv_wait_event"); + _mpvCommand = (MpvCommand)GetDllType(typeof(MpvCommand), "mpv_command"); + _mpvSetOption = (MpvSetOption)GetDllType(typeof(MpvSetOption), "mpv_set_option"); + _mpvSetOptionString = (MpvSetOptionString)GetDllType(typeof(MpvSetOptionString), "mpv_set_option_string"); + _mpvGetPropertyString = (MpvGetPropertystring)GetDllType(typeof(MpvGetPropertystring), "mpv_get_property"); + _mpvGetPropertyDouble = (MpvGetPropertyDouble)GetDllType(typeof(MpvGetPropertyDouble), "mpv_get_property"); + _mpvSetProperty = (MpvSetProperty)GetDllType(typeof(MpvSetProperty), "mpv_set_property"); + _mpvFree = (MpvFree)GetDllType(typeof(MpvFree), "mpv_free"); + _mpvClientApiVersion = (MpvClientApiVersion)GetDllType(typeof(MpvClientApiVersion), "mpv_client_api_version"); + } + + private bool IsAllMethodsLoaded() + { + return _mpvCreate != null && + _mpvInitialize != null && + _mpvWaitEvent != null && + _mpvCommand != null && + _mpvSetOption != null && + _mpvSetOptionString != null && + _mpvGetPropertyString != null && + _mpvGetPropertyDouble != null && + _mpvSetProperty != null && + _mpvFree != null; + } + + private static byte[] GetUtf8Bytes(string s) + { + return Encoding.UTF8.GetBytes(s + "\0"); + } + + public static IntPtr AllocateUtf8IntPtrArrayWithSentinel(string[] arr, out IntPtr[] byteArrayPointers) + { + int numberOfStrings = arr.Length + 1; // add extra element for extra null pointer last (sentinel) + byteArrayPointers = new IntPtr[numberOfStrings]; + IntPtr rootPointer = Marshal.AllocCoTaskMem(IntPtr.Size * numberOfStrings); + for (int index = 0; index < arr.Length; index++) + { + var bytes = GetUtf8Bytes(arr[index]); + IntPtr unmanagedPointer = Marshal.AllocHGlobal(bytes.Length); + Marshal.Copy(bytes, 0, unmanagedPointer, bytes.Length); + byteArrayPointers[index] = unmanagedPointer; + } + Marshal.Copy(byteArrayPointers, 0, rootPointer, numberOfStrings); + return rootPointer; + } + + private void DoMpvCommand(params string[] args) + { + if (_mpvHandle == IntPtr.Zero) + { + return; + } + + var mainPtr = AllocateUtf8IntPtrArrayWithSentinel(args, out var byteArrayPointers); + _mpvCommand(_mpvHandle, mainPtr); + foreach (var ptr in byteArrayPointers) + { + Marshal.FreeHGlobal(ptr); + } + Marshal.FreeHGlobal(mainPtr); + } + + public override string PlayerName => "libmpv " + VersionNumber; + + private int _volume = 75; + public override int Volume + { + get => _volume; + set + { + var v = Configuration.Settings.General.AllowVolumeBoost ? (int)Math.Round(value * 1.5) : value; + DoMpvCommand("set", "volume", v.ToString(CultureInfo.InvariantCulture)); + _volume = value; + } + } + + public override double Duration + { + get + { + lock (_lockObj) + { + if (_mpvHandle == IntPtr.Zero) + { + return 0; + } + + int mpvFormatDouble = 5; + double d = 0; + _mpvGetPropertyDouble(_mpvHandle, GetUtf8Bytes("duration"), mpvFormatDouble, ref d); + return d; + } + } + } + + public override double CurrentPosition + { + get + { + lock (_lockObj) + { + if (_mpvHandle == IntPtr.Zero) + { + return 0; + } + + if (_pausePosition != null) + { + if (_pausePosition < 0) + { + return 0; + } + + return _pausePosition.Value; + } + + int mpvFormatDouble = 5; + double d = 0; + _mpvGetPropertyDouble(_mpvHandle, GetUtf8Bytes("time-pos"), mpvFormatDouble, ref d); + return d; + } + } + set + { + lock (_lockObj) + { + + if (_mpvHandle == IntPtr.Zero) + { + return; + } + + if (IsPaused && value <= Duration) + { + _pausePosition = value; + } + + DoMpvCommand("seek", value.ToString(CultureInfo.InvariantCulture), "absolute"); + } + } + } + + private double _playRate = 1.0; + public override double PlayRate + { + get => _playRate; + set + { + DoMpvCommand("set", "speed", value.ToString(CultureInfo.InvariantCulture)); + _playRate = value; + } + } + + public void GetNextFrame() + { + if (_mpvHandle == IntPtr.Zero) + { + return; + } + + DoMpvCommand("frame-step"); + _pausePosition = null; + } + + public void GetPreviousFrame() + { + if (_mpvHandle == IntPtr.Zero) + { + return; + } + + DoMpvCommand("frame-back-step"); + _pausePosition = null; + } + + public override void Play() + { + lock (_lockObj) + { + if (_mpvHandle == IntPtr.Zero) + { + return; + } + + _pausePosition = null; + + if (_mpvHandle == IntPtr.Zero) + { + return; + } + + var bytes = GetUtf8Bytes("no"); + _mpvSetProperty(_mpvHandle, GetUtf8Bytes("pause"), MpvFormatString, ref bytes); + } + } + + public override void Pause() + { + lock (_lockObj) + { + if (_mpvHandle == IntPtr.Zero) + { + return; + } + + var bytes = GetUtf8Bytes("yes"); + _mpvSetProperty(_mpvHandle, GetUtf8Bytes("pause"), MpvFormatString, ref bytes); + } + } + + public override void Stop() + { + lock (_lockObj) + { + + if (_mpvHandle == IntPtr.Zero) + { + return; + } + + Pause(); + _pausePosition = null; + CurrentPosition = 0; + } + } + + public override bool IsPaused + { + get + { + if (_mpvHandle == IntPtr.Zero) + { + return true; + } + + var lpBuffer = IntPtr.Zero; + _mpvGetPropertyString(_mpvHandle, GetUtf8Bytes("pause"), MpvFormatString, ref lpBuffer); + var isPaused = Marshal.PtrToStringAnsi(lpBuffer) == "yes"; + _mpvFree(lpBuffer); + return isPaused; + } + } + + public override bool IsPlaying => !IsPaused; + + private List<KeyValuePair<int, string>> _audioTrackIds; + public List<KeyValuePair<int, string>> AudioTracks + { + get + { + if (_audioTrackIds == null) + { + _audioTrackIds = new List<KeyValuePair<int, string>>(); + var lpBuffer = IntPtr.Zero; + _mpvGetPropertyString(_mpvHandle, GetUtf8Bytes("track-list"), MpvFormatString, ref lpBuffer); + string trackListJson = Marshal.PtrToStringAnsi(lpBuffer); + foreach (var json in Json.ReadObjectArray(trackListJson)) + { + string trackType = Json.ReadTag(json, "type"); + int id = int.Parse(Json.ReadTag(json, "id")); + if (trackType == "audio") + { + string lang = Json.ReadTag(json, "lang"); + _audioTrackIds.Add(new KeyValuePair<int, string>(id, lang)); + } + } + _mpvFree(lpBuffer); + } + return _audioTrackIds; + } + } + + public int AudioTrackNumber + { + get + { + var lpBuffer = IntPtr.Zero; + _mpvGetPropertyString(_mpvHandle, GetUtf8Bytes("aid"), MpvFormatString, ref lpBuffer); + var numberString = Marshal.PtrToStringAnsi(lpBuffer); + if (string.IsNullOrEmpty(numberString)) + { + return 0; + } + + var id = int.Parse(numberString); + var idx = _audioTrackIds.FindIndex(x => x.Key == id); + var number = AudioTracks.Count > 1 && idx != -1 ? idx : 0; + _mpvFree(lpBuffer); + return number; + } + set + { + string id = "1"; + if (AudioTracks.Count > 1 && value >= 0 && value < _audioTrackIds.Count) + { + id = _audioTrackIds[value].Key.ToString(); + } + DoMpvCommand("set", "aid", id); + } + } + + public string VersionNumber + { + get + { + if (_mpvHandle == IntPtr.Zero) + { + return string.Empty; + } + + var version = _mpvClientApiVersion(); + var high = version >> 16; + var low = version & 0xff; + return high + "." + low; + } + } + + public void LoadSubtitle(string fileName) + { + DoMpvCommand("sub-add", fileName, "select"); + } + + public void LoadSecondSubtitle(string fileName) + { + _secondSubtitleFileName = fileName; + DoMpvCommand("sub-add", fileName, "select"); + } + + public void RemoveSubtitle() + { + if (!string.IsNullOrEmpty(_secondSubtitleFileName)) + { + return; + } + + DoMpvCommand("sub-remove"); + } + + public void ReloadSubtitle() + { + DoMpvCommand("sub-reload"); + } + + public void HideCursor() + { + _mpvSetOptionString(_mpvHandle, GetUtf8Bytes("cursor-autohide"), GetUtf8Bytes("always")); + } + + public void ShowCursor() + { + _mpvSetOptionString(_mpvHandle, GetUtf8Bytes("cursor-autohide"), GetUtf8Bytes("no")); + } + + public static bool IsInstalled + { + get + { + try + { + if (Configuration.IsRunningOnLinux) + { + return LoadLib(); + } + + var dllFile = GetMpvPath("mpv-1.dll"); + return File.Exists(dllFile); + } + catch (Exception ex) + { + SeLogger.Error(ex, "LibMpvDynamic.IsInstalled failed"); + return false; + } + } + } + + public static string GetMpvPath(string fileName) + { + if (Configuration.IsRunningOnWindows) + { + var path = Path.Combine(Configuration.DataDirectory, fileName); + if (File.Exists(path)) + { + return path; + } + } + + return null; + } + + private static bool LoadLib() + { + if (_libMpvDll == IntPtr.Zero) + { + if (Configuration.IsRunningOnWindows) + { + _libMpvDll = NativeMethods.CrossLoadLibrary(GetMpvPath("mpv-1.dll")); + } + else + { + _libMpvDll = NativeMethods.CrossLoadLibrary("libmpv.so"); + if (_libMpvDll == IntPtr.Zero) + { + _libMpvDll = NativeMethods.CrossLoadLibrary("libmpv.so.1"); + } + + int i = 107; + while (_libMpvDll == IntPtr.Zero && i < 120) + { + _libMpvDll = NativeMethods.CrossLoadLibrary($"libmpv.so.1.{i}.0"); + i++; + } + } + } + + return _libMpvDll != IntPtr.Zero; + } + + public override void Initialize(Control ownerControl, string videoFileName, EventHandler onVideoLoaded, EventHandler onVideoEnded) + { + _secondSubtitleFileName = null; + if (LoadLib()) + { + LoadLibMpvDynamic(); + if (!IsAllMethodsLoaded()) + { + throw new Exception("MPV - not all needed methods found in dll file"); + } + _mpvHandle = _mpvCreate.Invoke(); + + if (Configuration.Settings.General.MpvLogging) + { + var logFileName = Path.Combine(Configuration.DataDirectory, "mpv-log-" + Guid.NewGuid() + ".txt"); + _mpvSetOptionString(_mpvHandle, GetUtf8Bytes("log-file"), GetUtf8Bytes(logFileName)); + } + } + else if (!Directory.Exists(videoFileName)) + { + return; + } + + OnVideoLoaded = onVideoLoaded; + OnVideoEnded = onVideoEnded; + + if (!string.IsNullOrEmpty(videoFileName)) + { + _mpvInitialize.Invoke(_mpvHandle); + SetVideoOwner(ownerControl); + + string videoOutput = string.Empty; + if (Configuration.IsRunningOnLinux) + { + videoOutput = Configuration.Settings.General.MpvVideoOutputLinux; + } + else if (!string.IsNullOrWhiteSpace(Configuration.Settings.General.MpvVideoOutputWindows)) + { + videoOutput = Configuration.Settings.General.MpvVideoOutputWindows; + } + + if (!string.IsNullOrEmpty(videoOutput)) + { + _mpvSetOptionString(_mpvHandle, GetUtf8Bytes("vo"), GetUtf8Bytes(videoOutput)); + } + + _mpvSetOptionString(_mpvHandle, GetUtf8Bytes("keep-open"), GetUtf8Bytes("always")); // don't auto close video + _mpvSetOptionString(_mpvHandle, GetUtf8Bytes("no-sub"), GetUtf8Bytes("")); // don't load subtitles + if (videoFileName.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || + videoFileName.StartsWith("https://", StringComparison.OrdinalIgnoreCase)) + { + _mpvSetOptionString(_mpvHandle, GetUtf8Bytes("ytdl"), GetUtf8Bytes("yes")); + } + + if (!string.IsNullOrEmpty(Configuration.Settings.General.MpvExtraOption)) + { + var parts = Configuration.Settings.General.MpvExtraOption.Split('='); + if (parts.Length == 2) + { + _mpvSetOptionString(_mpvHandle, GetUtf8Bytes(parts[0]), GetUtf8Bytes(parts[1])); + } + else + { + _mpvSetOptionString(_mpvHandle, GetUtf8Bytes(Configuration.Settings.General.MpvExtraOption), GetUtf8Bytes("")); + } + } + + DoMpvCommand("loadfile", videoFileName); + + System.Threading.Thread.Sleep(100); + SetVideoOwner(ownerControl); + + _videoLoadedTimer = new Timer { Interval = 50 }; + _videoLoadedTimer.Tick += VideoLoadedTimer_Tick; + _videoLoadedTimer.Start(); + + SetVideoOwner(ownerControl); + } + } + + private void SetVideoOwner(Control ownerControl) + { + if (ownerControl != null) + { + int iterations = 25; + int returnCode = -1; + int mpvFormatInt64 = 4; + if (ownerControl.IsDisposed) + { + return; + } + var windowId = ownerControl.Handle.ToInt64(); + while (returnCode != 0 && iterations > 0) + { + Application.DoEvents(); + + lock (_lockObj) + { + if (_mpvHandle == IntPtr.Zero) + { + return; + } + returnCode = _mpvSetOption(_mpvHandle, GetUtf8Bytes("wid"), mpvFormatInt64, ref windowId); + if (returnCode != 0) + { + iterations--; + System.Threading.Thread.Sleep(100); + } + } + } + } + Pause(); + } + + private void VideoLoadedTimer_Tick(object sender, EventArgs e) + { + _videoLoadedTimer.Stop(); + const int mpvEventFileLoaded = 8; + int l = 0; + while (l < 10000) + { + Application.DoEvents(); + try + { + lock (_lockObj) + { + if (_mpvHandle == IntPtr.Zero) + { + return; + } + + var eventIdHandle = _mpvWaitEvent(_mpvHandle, 0); + var eventId = Convert.ToInt64(Marshal.PtrToStructure(eventIdHandle, typeof(int))); + if (eventId == mpvEventFileLoaded) + { + break; + } + } + l++; + } + catch + { + return; + } + } + Application.DoEvents(); + OnVideoLoaded?.Invoke(this, null); + Application.DoEvents(); + Pause(); + } + + public override void DisposeVideoPlayer() + { + Dispose(); + } + + private readonly object _lockObj = new object(); + private void ReleaseUnmanagedResources() + { + try + { + lock (_lockObj) + { + if (_mpvHandle != IntPtr.Zero) + { + HardDispose(); + } + } + } + catch + { + // ignored + } + } + + ~LibMpvDynamic() + { + Dispose(false); + } + + public void Dispose() + { + Dispose(true); + } + + public void HardDispose() + { + DoMpvCommand("stop"); + System.Threading.Thread.Sleep(150); + Application.DoEvents(); + DoMpvCommand("quit"); + _mpvHandle = IntPtr.Zero; + System.Threading.Thread.Sleep(150); + Application.DoEvents(); + System.Threading.Thread.Sleep(50); + Application.DoEvents(); + } + + protected virtual void Dispose(bool disposing) + { + ReleaseUnmanagedResources(); + } + } +} diff --git a/src/Logic/VideoPlayers/LibMpvMono.cs b/src/ui/Logic/VideoPlayers/LibMpvMono.cs similarity index 96% rename from src/Logic/VideoPlayers/LibMpvMono.cs rename to src/ui/Logic/VideoPlayers/LibMpvMono.cs index 6939c9d97..935d15b66 100644 --- a/src/Logic/VideoPlayers/LibMpvMono.cs +++ b/src/ui/Logic/VideoPlayers/LibMpvMono.cs @@ -1,382 +1,382 @@ -using Nikse.SubtitleEdit.Core; -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Runtime.InteropServices; -using System.Text; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; -using Nikse.SubtitleEdit.Core.SubtitleFormats; - - -namespace Nikse.SubtitleEdit.Logic.VideoPlayers -{ - public class LibMpvMono : VideoPlayer, IDisposable - { - - private IntPtr _libMpvDll; - private IntPtr _mpvHandle; - private Timer _videoLoadedTimer; - // private Timer _videoEndedTimer; - - public override event EventHandler OnVideoLoaded; - public override event EventHandler OnVideoEnded; - - private const int MpvFormatString = 1; - - - private static byte[] GetUtf8Bytes(string s) - { - return Encoding.UTF8.GetBytes(s + "\0"); - } - - public static IntPtr AllocateUtf8IntPtrArrayWithSentinel(string[] arr, out IntPtr[] byteArrayPointers) - { - int numberOfStrings = arr.Length + 1; // add extra element for extra null pointer last (sentinel) - byteArrayPointers = new IntPtr[numberOfStrings]; - IntPtr rootPointer = Marshal.AllocCoTaskMem(IntPtr.Size * numberOfStrings); - for (int index = 0; index < arr.Length; index++) - { - var bytes = GetUtf8Bytes(arr[index]); - IntPtr unmanagedPointer = Marshal.AllocHGlobal(bytes.Length); - Marshal.Copy(bytes, 0, unmanagedPointer, bytes.Length); - byteArrayPointers[index] = unmanagedPointer; - } - Marshal.Copy(byteArrayPointers, 0, rootPointer, numberOfStrings); - return rootPointer; - } - - private void DoMpvCommand(params string[] args) - { - if (_mpvHandle == IntPtr.Zero) - { - return; - } - - var mainPtr = AllocateUtf8IntPtrArrayWithSentinel(args, out var byteArrayPointers); - NativeMethods.mpv_command(_mpvHandle, mainPtr); - foreach (var ptr in byteArrayPointers) - { - Marshal.FreeHGlobal(ptr); - } - Marshal.FreeHGlobal(mainPtr); - } - - public override string PlayerName => "MPV Player"; - - private int _volume = 75; - public override int Volume - { - get => _volume; - set - { - DoMpvCommand("set", "volume", value.ToString()); - _volume = value; - } - } - - public override double Duration - { - get - { - if (_mpvHandle == IntPtr.Zero) - { - return 0; - } - - int mpvFormatDouble = 5; - double d = 0; - NativeMethods.mpv_get_property(_mpvHandle, GetUtf8Bytes("duration"), mpvFormatDouble, ref d); - return d; - } - } - - public override double CurrentPosition - { - get - { - if (_mpvHandle == IntPtr.Zero) - { - return 0; - } - - int mpvFormatDouble = 5; - double d = 0; - NativeMethods.mpv_get_property(_mpvHandle, GetUtf8Bytes("time-pos"), mpvFormatDouble, ref d); - return d; - } - set - { - if (_mpvHandle == IntPtr.Zero) - { - return; - } - - DoMpvCommand("seek", value.ToString(CultureInfo.InvariantCulture), "absolute"); - } - } - - private double _playRate = 2.0; - public override double PlayRate - { - get => _playRate; - set - { - DoMpvCommand("set", "speed", value.ToString(CultureInfo.InvariantCulture)); - _playRate = value; - } - } - - public void GetNextFrame() - { - if (_mpvHandle == IntPtr.Zero) - { - return; - } - - DoMpvCommand("frame-step"); - } - - public void GetPreviousFrame() - { - if (_mpvHandle == IntPtr.Zero) - { - return; - } - - DoMpvCommand("frame-back-step"); - } - - public override void Play() - { - if (_mpvHandle == IntPtr.Zero) - { - return; - } - - var bytes = GetUtf8Bytes("no"); - NativeMethods.mpv_set_property(_mpvHandle, GetUtf8Bytes("pause"), MpvFormatString, ref bytes); - } - - public override void Pause() - { - if (_mpvHandle == IntPtr.Zero) - { - return; - } - - var bytes = GetUtf8Bytes("yes"); - NativeMethods.mpv_set_property(_mpvHandle, GetUtf8Bytes("pause"), MpvFormatString, ref bytes); - } - - public override void Stop() - { - Pause(); - CurrentPosition = 0; - } - - public override bool IsPaused - { - get - { - if (_mpvHandle == IntPtr.Zero) - { - return true; - } - - var lpBuffer = NativeMethods.mpv_get_property_string(_mpvHandle, GetUtf8Bytes("pause")); - string s = Marshal.PtrToStringAnsi(lpBuffer); - bool isPaused = s == "yes"; - NativeMethods.mpv_free(lpBuffer); - return isPaused; - } - } - - public override bool IsPlaying => !IsPaused; - - private List<KeyValuePair<int, string>> _audioTrackIds; - public List<KeyValuePair<int, string>> AudioTracks - { - get - { - if (_audioTrackIds == null) - { - _audioTrackIds = new List<KeyValuePair<int, string>>(); - var lpBuffer = NativeMethods.mpv_get_property_string(_mpvHandle, GetUtf8Bytes("track-list")); - string trackListJson = Marshal.PtrToStringAnsi(lpBuffer); - foreach (var json in Json.ReadObjectArray(trackListJson)) - { - string trackType = Json.ReadTag(json, "type"); - int id = int.Parse(Json.ReadTag(json, "id")); - if (trackType == "audio") - { - string lang = Json.ReadTag(json, "lang"); - _audioTrackIds.Add(new KeyValuePair<int, string>(id, lang)); - } - } - NativeMethods.mpv_free(lpBuffer); - } - return _audioTrackIds; - } - } - - public int AudioTrackNumber - { - get - { - var lpBuffer = NativeMethods.mpv_get_property_string(_mpvHandle, GetUtf8Bytes("aid")); - int id = int.Parse(Marshal.PtrToStringAnsi(lpBuffer)); - int idx = _audioTrackIds.FindIndex(x => x.Key == id); - int number = AudioTracks.Count > 1 && idx != -1 ? idx : 0; - NativeMethods.mpv_free(lpBuffer); - return number; - } - set - { - string id = "1"; - if (AudioTracks.Count > 1 && value >= 0 && value < _audioTrackIds.Count) - { - id = _audioTrackIds[value].Key.ToString(); - } - DoMpvCommand("set", "aid", id); - } - } - - public static bool IsInstalled => true; - - public static string GetMpvPath(string fileName) - { - var path = Path.Combine(Configuration.DataDirectory, fileName); - if (File.Exists(path)) - { - return path; - } - - return null; - } - - public override void Initialize(Control ownerControl, string videoFileName, EventHandler onVideoLoaded, EventHandler onVideoEnded) - { - _mpvHandle = NativeMethods.mpv_create(); - OnVideoLoaded = onVideoLoaded; - OnVideoEnded = onVideoEnded; - - if (!string.IsNullOrEmpty(videoFileName)) - { - //Mono.Unix. - NativeMethods.mpv_initialize(_mpvHandle); - - string videoOutput = "gpu"; - if (!string.IsNullOrWhiteSpace(Configuration.Settings.General.MpvVideoOutputWindows)) - { - videoOutput = Configuration.Settings.General.MpvVideoOutputWindows; - } - - NativeMethods.mpv_set_option_string(_mpvHandle, GetUtf8Bytes("vo"), GetUtf8Bytes(videoOutput)); // "direct3d_shaders" is default, "direct3d" could be used for compabality with old systems - - NativeMethods.mpv_set_option_string(_mpvHandle, GetUtf8Bytes("keep-open"), GetUtf8Bytes("always")); // don't auto close video - NativeMethods.mpv_set_option_string(_mpvHandle, GetUtf8Bytes("no-sub"), GetUtf8Bytes("")); // don't load subtitles - if (ownerControl != null) - { - int mpvFormatInt64 = 4; - var windowId = ownerControl.Handle.ToInt64(); - NativeMethods.mpv_set_option(_mpvHandle, GetUtf8Bytes("wid"), mpvFormatInt64, ref windowId); - } - DoMpvCommand("loadfile", videoFileName); - - _videoLoadedTimer = new Timer { Interval = 50 }; - _videoLoadedTimer.Tick += VideoLoadedTimer_Tick; - _videoLoadedTimer.Start(); - } - } - - private void VideoLoadedTimer_Tick(object sender, EventArgs e) - { - _videoLoadedTimer.Stop(); - const int mpvEventFileLoaded = 8; - int l = 0; - while (l < 10000) - { - Application.DoEvents(); - try - { - if (_mpvHandle != IntPtr.Zero) - { - var eventIdHandle = NativeMethods.mpv_wait_event(_mpvHandle, 0); - var eventId = Convert.ToInt64(Marshal.PtrToStructure(eventIdHandle, typeof(int))); - if (eventId == mpvEventFileLoaded) - { - break; - } - } - l++; - } - catch - { - return; - } - } - Application.DoEvents(); - OnVideoLoaded?.Invoke(this, null); - - Application.DoEvents(); - Pause(); - } - - - public override void DisposeVideoPlayer() - { - Dispose(); - } - - private readonly object _lockObj = new object(); - - private void ReleaseUnmanagedResources() - { - try - { - lock (_lockObj) - { - if (_mpvHandle != IntPtr.Zero) - { - NativeMethods.mpv_terminate_destroy(_mpvHandle); - _mpvHandle = IntPtr.Zero; - } - - if (_libMpvDll != IntPtr.Zero) - { - NativeMethods.FreeLibrary(_libMpvDll); - _libMpvDll = IntPtr.Zero; - } - } - } - catch - { - // ignored - } - } - - ~LibMpvMono() - { - Dispose(false); - } - - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - if (_mpvHandle != IntPtr.Zero) - { - DoMpvCommand("quit"); - } - - ReleaseUnmanagedResources(); - } - - } -} +using Nikse.SubtitleEdit.Core; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.SubtitleFormats; + + +namespace Nikse.SubtitleEdit.Logic.VideoPlayers +{ + public class LibMpvMono : VideoPlayer, IDisposable + { + + private IntPtr _libMpvDll; + private IntPtr _mpvHandle; + private Timer _videoLoadedTimer; + // private Timer _videoEndedTimer; + + public override event EventHandler OnVideoLoaded; + public override event EventHandler OnVideoEnded; + + private const int MpvFormatString = 1; + + + private static byte[] GetUtf8Bytes(string s) + { + return Encoding.UTF8.GetBytes(s + "\0"); + } + + public static IntPtr AllocateUtf8IntPtrArrayWithSentinel(string[] arr, out IntPtr[] byteArrayPointers) + { + int numberOfStrings = arr.Length + 1; // add extra element for extra null pointer last (sentinel) + byteArrayPointers = new IntPtr[numberOfStrings]; + IntPtr rootPointer = Marshal.AllocCoTaskMem(IntPtr.Size * numberOfStrings); + for (int index = 0; index < arr.Length; index++) + { + var bytes = GetUtf8Bytes(arr[index]); + IntPtr unmanagedPointer = Marshal.AllocHGlobal(bytes.Length); + Marshal.Copy(bytes, 0, unmanagedPointer, bytes.Length); + byteArrayPointers[index] = unmanagedPointer; + } + Marshal.Copy(byteArrayPointers, 0, rootPointer, numberOfStrings); + return rootPointer; + } + + private void DoMpvCommand(params string[] args) + { + if (_mpvHandle == IntPtr.Zero) + { + return; + } + + var mainPtr = AllocateUtf8IntPtrArrayWithSentinel(args, out var byteArrayPointers); + NativeMethods.mpv_command(_mpvHandle, mainPtr); + foreach (var ptr in byteArrayPointers) + { + Marshal.FreeHGlobal(ptr); + } + Marshal.FreeHGlobal(mainPtr); + } + + public override string PlayerName => "MPV Player"; + + private int _volume = 75; + public override int Volume + { + get => _volume; + set + { + DoMpvCommand("set", "volume", value.ToString()); + _volume = value; + } + } + + public override double Duration + { + get + { + if (_mpvHandle == IntPtr.Zero) + { + return 0; + } + + int mpvFormatDouble = 5; + double d = 0; + NativeMethods.mpv_get_property(_mpvHandle, GetUtf8Bytes("duration"), mpvFormatDouble, ref d); + return d; + } + } + + public override double CurrentPosition + { + get + { + if (_mpvHandle == IntPtr.Zero) + { + return 0; + } + + int mpvFormatDouble = 5; + double d = 0; + NativeMethods.mpv_get_property(_mpvHandle, GetUtf8Bytes("time-pos"), mpvFormatDouble, ref d); + return d; + } + set + { + if (_mpvHandle == IntPtr.Zero) + { + return; + } + + DoMpvCommand("seek", value.ToString(CultureInfo.InvariantCulture), "absolute"); + } + } + + private double _playRate = 2.0; + public override double PlayRate + { + get => _playRate; + set + { + DoMpvCommand("set", "speed", value.ToString(CultureInfo.InvariantCulture)); + _playRate = value; + } + } + + public void GetNextFrame() + { + if (_mpvHandle == IntPtr.Zero) + { + return; + } + + DoMpvCommand("frame-step"); + } + + public void GetPreviousFrame() + { + if (_mpvHandle == IntPtr.Zero) + { + return; + } + + DoMpvCommand("frame-back-step"); + } + + public override void Play() + { + if (_mpvHandle == IntPtr.Zero) + { + return; + } + + var bytes = GetUtf8Bytes("no"); + NativeMethods.mpv_set_property(_mpvHandle, GetUtf8Bytes("pause"), MpvFormatString, ref bytes); + } + + public override void Pause() + { + if (_mpvHandle == IntPtr.Zero) + { + return; + } + + var bytes = GetUtf8Bytes("yes"); + NativeMethods.mpv_set_property(_mpvHandle, GetUtf8Bytes("pause"), MpvFormatString, ref bytes); + } + + public override void Stop() + { + Pause(); + CurrentPosition = 0; + } + + public override bool IsPaused + { + get + { + if (_mpvHandle == IntPtr.Zero) + { + return true; + } + + var lpBuffer = NativeMethods.mpv_get_property_string(_mpvHandle, GetUtf8Bytes("pause")); + string s = Marshal.PtrToStringAnsi(lpBuffer); + bool isPaused = s == "yes"; + NativeMethods.mpv_free(lpBuffer); + return isPaused; + } + } + + public override bool IsPlaying => !IsPaused; + + private List<KeyValuePair<int, string>> _audioTrackIds; + public List<KeyValuePair<int, string>> AudioTracks + { + get + { + if (_audioTrackIds == null) + { + _audioTrackIds = new List<KeyValuePair<int, string>>(); + var lpBuffer = NativeMethods.mpv_get_property_string(_mpvHandle, GetUtf8Bytes("track-list")); + string trackListJson = Marshal.PtrToStringAnsi(lpBuffer); + foreach (var json in Json.ReadObjectArray(trackListJson)) + { + string trackType = Json.ReadTag(json, "type"); + int id = int.Parse(Json.ReadTag(json, "id")); + if (trackType == "audio") + { + string lang = Json.ReadTag(json, "lang"); + _audioTrackIds.Add(new KeyValuePair<int, string>(id, lang)); + } + } + NativeMethods.mpv_free(lpBuffer); + } + return _audioTrackIds; + } + } + + public int AudioTrackNumber + { + get + { + var lpBuffer = NativeMethods.mpv_get_property_string(_mpvHandle, GetUtf8Bytes("aid")); + int id = int.Parse(Marshal.PtrToStringAnsi(lpBuffer)); + int idx = _audioTrackIds.FindIndex(x => x.Key == id); + int number = AudioTracks.Count > 1 && idx != -1 ? idx : 0; + NativeMethods.mpv_free(lpBuffer); + return number; + } + set + { + string id = "1"; + if (AudioTracks.Count > 1 && value >= 0 && value < _audioTrackIds.Count) + { + id = _audioTrackIds[value].Key.ToString(); + } + DoMpvCommand("set", "aid", id); + } + } + + public static bool IsInstalled => true; + + public static string GetMpvPath(string fileName) + { + var path = Path.Combine(Configuration.DataDirectory, fileName); + if (File.Exists(path)) + { + return path; + } + + return null; + } + + public override void Initialize(Control ownerControl, string videoFileName, EventHandler onVideoLoaded, EventHandler onVideoEnded) + { + _mpvHandle = NativeMethods.mpv_create(); + OnVideoLoaded = onVideoLoaded; + OnVideoEnded = onVideoEnded; + + if (!string.IsNullOrEmpty(videoFileName)) + { + //Mono.Unix. + NativeMethods.mpv_initialize(_mpvHandle); + + string videoOutput = "gpu"; + if (!string.IsNullOrWhiteSpace(Configuration.Settings.General.MpvVideoOutputWindows)) + { + videoOutput = Configuration.Settings.General.MpvVideoOutputWindows; + } + + NativeMethods.mpv_set_option_string(_mpvHandle, GetUtf8Bytes("vo"), GetUtf8Bytes(videoOutput)); // "direct3d_shaders" is default, "direct3d" could be used for compabality with old systems + + NativeMethods.mpv_set_option_string(_mpvHandle, GetUtf8Bytes("keep-open"), GetUtf8Bytes("always")); // don't auto close video + NativeMethods.mpv_set_option_string(_mpvHandle, GetUtf8Bytes("no-sub"), GetUtf8Bytes("")); // don't load subtitles + if (ownerControl != null) + { + int mpvFormatInt64 = 4; + var windowId = ownerControl.Handle.ToInt64(); + NativeMethods.mpv_set_option(_mpvHandle, GetUtf8Bytes("wid"), mpvFormatInt64, ref windowId); + } + DoMpvCommand("loadfile", videoFileName); + + _videoLoadedTimer = new Timer { Interval = 50 }; + _videoLoadedTimer.Tick += VideoLoadedTimer_Tick; + _videoLoadedTimer.Start(); + } + } + + private void VideoLoadedTimer_Tick(object sender, EventArgs e) + { + _videoLoadedTimer.Stop(); + const int mpvEventFileLoaded = 8; + int l = 0; + while (l < 10000) + { + Application.DoEvents(); + try + { + if (_mpvHandle != IntPtr.Zero) + { + var eventIdHandle = NativeMethods.mpv_wait_event(_mpvHandle, 0); + var eventId = Convert.ToInt64(Marshal.PtrToStructure(eventIdHandle, typeof(int))); + if (eventId == mpvEventFileLoaded) + { + break; + } + } + l++; + } + catch + { + return; + } + } + Application.DoEvents(); + OnVideoLoaded?.Invoke(this, null); + + Application.DoEvents(); + Pause(); + } + + + public override void DisposeVideoPlayer() + { + Dispose(); + } + + private readonly object _lockObj = new object(); + + private void ReleaseUnmanagedResources() + { + try + { + lock (_lockObj) + { + if (_mpvHandle != IntPtr.Zero) + { + NativeMethods.mpv_terminate_destroy(_mpvHandle); + _mpvHandle = IntPtr.Zero; + } + + if (_libMpvDll != IntPtr.Zero) + { + NativeMethods.FreeLibrary(_libMpvDll); + _libMpvDll = IntPtr.Zero; + } + } + } + catch + { + // ignored + } + } + + ~LibMpvMono() + { + Dispose(false); + } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (_mpvHandle != IntPtr.Zero) + { + DoMpvCommand("quit"); + } + + ReleaseUnmanagedResources(); + } + + } +} diff --git a/src/Logic/VideoPlayers/LibVlcDynamic.cs b/src/ui/Logic/VideoPlayers/LibVlcDynamic.cs similarity index 97% rename from src/Logic/VideoPlayers/LibVlcDynamic.cs rename to src/ui/Logic/VideoPlayers/LibVlcDynamic.cs index c54af9e1a..c944d0726 100644 --- a/src/Logic/VideoPlayers/LibVlcDynamic.cs +++ b/src/ui/Logic/VideoPlayers/LibVlcDynamic.cs @@ -1,1045 +1,1045 @@ -using Nikse.SubtitleEdit.Core; -using Nikse.SubtitleEdit.Forms; -using System; -using System.Collections.Generic; -using System.IO; -using System.Runtime.InteropServices; -using System.Text; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Logic.VideoPlayers -{ - public class LibVlcDynamic : VideoPlayer, IDisposable - { - private Timer _videoLoadedTimer; - private Timer _videoEndTimer; - private Timer _mouseTimer; - - private IntPtr _libVlcDll; - private IntPtr _libVlc; - private IntPtr _mediaPlayer; - private Control _ownerControl; - private Form _parentForm; - private double? _pausePosition; // Hack to hold precise seeking when paused - private int _volume = -1; - private static readonly object DisposeLock = new object(); - - // LibVLC Core - http://www.videolan.org/developers/vlc/doc/doxygen/html/group__libvlc__core.html - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate IntPtr libvlc_new(int argc, [MarshalAs(UnmanagedType.LPArray)] string[] argv); - private libvlc_new _libvlc_new; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate IntPtr libvlc_get_version(); - private libvlc_get_version _libvlc_get_version; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate void libvlc_release(IntPtr libVlc); - private libvlc_release _libvlc_release; - - // LibVLC Media - http://www.videolan.org/developers/vlc/doc/doxygen/html/group__libvlc__media.html - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate IntPtr libvlc_media_new_path(IntPtr instance, byte[] input); - private libvlc_media_new_path _libvlc_media_new_path; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate void libvlc_media_release(IntPtr media); - private libvlc_media_release _libvlc_media_release; - - // LibVLC Video Controls - http://www.videolan.org/developers/vlc/doc/doxygen/html/group__libvlc__video.html#g8f55326b8b51aecb59d8b8a446c3f118 - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate void libvlc_video_get_size(IntPtr mediaPlayer, UInt32 number, out UInt32 x, out UInt32 y); - private libvlc_video_get_size _libvlc_video_get_size; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate int libvlc_video_take_snapshot(IntPtr mediaPlayer, byte num, byte[] filePath, UInt32 width, UInt32 height); - private libvlc_video_take_snapshot _libvlc_video_take_snapshot; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate void libvlc_video_set_callbacks(IntPtr playerInstance, LockCallbackDelegate @lock, UnlockCallbackDelegate unlock, DisplayCallbackDelegate display, IntPtr opaque); - private libvlc_video_set_callbacks _libvlc_video_set_callbacks; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate int libvlc_video_set_format(IntPtr mediaPlayer, string chroma, UInt32 width, UInt32 height, UInt32 pitch); - private libvlc_video_set_format _libvlc_video_set_format; - - // LibVLC Audio Controls - http://www.videolan.org/developers/vlc/doc/doxygen/html/group__libvlc__audio.html - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate int libvlc_audio_get_volume(IntPtr mediaPlayer); - private libvlc_audio_get_volume _libvlc_audio_get_volume; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate void libvlc_audio_set_volume(IntPtr mediaPlayer, int volume); - private libvlc_audio_set_volume _libvlc_audio_set_volume; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate int libvlc_audio_get_track_count(IntPtr mediaPlayer); - private libvlc_audio_get_track_count _libvlc_audio_get_track_count; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate IntPtr libvlc_audio_get_track_description(IntPtr mediaPlayer); - private libvlc_audio_get_track_description _libvlc_audio_get_track_description; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate void libvlc_track_description_release(IntPtr mediaPlayer); - private libvlc_track_description_release _libvlc_track_description_release; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate int libvlc_audio_get_track(IntPtr mediaPlayer); - private libvlc_audio_get_track _libvlc_audio_get_track; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate int libvlc_audio_set_track(IntPtr mediaPlayer, int trackNumber); - private libvlc_audio_set_track _libvlc_audio_set_track; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate Int64 libvlc_audio_get_delay(IntPtr mediaPlayer); - private libvlc_audio_get_delay _libvlc_audio_get_delay; - - // LibVLC media player - http://www.videolan.org/developers/vlc/doc/doxygen/html/group__libvlc__media__player.html - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate IntPtr libvlc_media_player_new_from_media(IntPtr media); - private libvlc_media_player_new_from_media _libvlc_media_player_new_from_media; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate void libvlc_media_player_play(IntPtr mediaPlayer); - private libvlc_media_player_play _libvlc_media_player_play; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate void libvlc_media_player_stop(IntPtr mediaPlayer); - private libvlc_media_player_stop _libvlc_media_player_stop; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate void libvlc_media_player_set_hwnd(IntPtr mediaPlayer, IntPtr windowsHandle); - private libvlc_media_player_set_hwnd _libvlc_media_player_set_hwnd; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate void libvlc_media_player_set_xwindow(IntPtr mediaPlayer, IntPtr windowsHandle); - private libvlc_media_player_set_xwindow _libvlc_media_player_set_xwindow; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate int libvlc_media_player_is_playing(IntPtr mediaPlayer); - private libvlc_media_player_is_playing _libvlc_media_player_is_playing; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate int libvlc_media_player_set_pause(IntPtr mediaPlayer, int doPause); - private libvlc_media_player_set_pause _libvlc_media_player_set_pause; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate Int64 libvlc_media_player_get_time(IntPtr mediaPlayer); - private libvlc_media_player_get_time _libvlc_media_player_get_time; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate void libvlc_media_player_set_time(IntPtr mediaPlayer, Int64 position); - private libvlc_media_player_set_time _libvlc_media_player_set_time; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate byte libvlc_media_player_get_state(IntPtr mediaPlayer); - private libvlc_media_player_get_state _libvlc_media_player_get_state; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate Int64 libvlc_media_player_get_length(IntPtr mediaPlayer); - private libvlc_media_player_get_length _libvlc_media_player_get_length; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate void libvlc_media_player_release(IntPtr mediaPlayer); - private libvlc_media_player_release _libvlc_media_player_release; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate float libvlc_media_player_get_rate(IntPtr mediaPlayer); - private libvlc_media_player_get_rate _libvlc_media_player_get_rate; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate int libvlc_media_player_set_rate(IntPtr mediaPlayer, float rate); - private libvlc_media_player_set_rate _libvlc_media_player_set_rate; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate int libvlc_media_player_next_frame(IntPtr mediaPlayer); - private libvlc_media_player_next_frame _libvlc_media_player_next_frame; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate int libvlc_media_player_add_slave(IntPtr media, int type, byte[] filePath, bool select); - private libvlc_media_player_add_slave _libvlc_media_player_add_slave; - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate int libvlc_video_set_spu(IntPtr mediaPlayer, int trackNumber); - private libvlc_video_set_spu _libvlc_video_set_spu; - - /// <summary> - /// Callback prototype to allocate and lock a picture buffer. Whenever a new video frame needs to be decoded, the lock callback is invoked. Depending on the video chroma, one or three pixel planes of adequate dimensions must be returned via the second parameter. Those planes must be aligned on 32-bytes boundaries. - /// </summary> - /// <param name="opaque">Private pointer as passed to SetCallbacks()</param> - /// <param name="planes">Planes start address of the pixel planes (LibVLC allocates the array of void pointers, this callback must initialize the array)</param> - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate void LockCallbackDelegate(IntPtr opaque, ref IntPtr planes); - - /// <summary> - /// Callback prototype to unlock a picture buffer. When the video frame decoding is complete, the unlock callback is invoked. This callback might not be needed at all. It is only an indication that the application can now read the pixel values if it needs to. - /// </summary> - /// <param name="opaque">Private pointer as passed to SetCallbacks()</param> - /// <param name="picture">Private pointer returned from the LockCallback callback</param> - /// <param name="planes">Pixel planes as defined by the @ref libvlc_video_lock_cb callback (this parameter is only for convenience)</param> - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate void UnlockCallbackDelegate(IntPtr opaque, IntPtr picture, ref IntPtr planes); - - /// <summary> - /// Callback prototype to display a picture. When the video frame needs to be shown, as determined by the media playback clock, the display callback is invoked. - /// </summary> - /// <param name="opaque">Private pointer as passed to SetCallbacks()</param> - /// <param name="picture">Private pointer returned from the LockCallback callback</param> - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate void DisplayCallbackDelegate(IntPtr opaque, IntPtr picture); - - private object GetDllType(Type type, string name) - { - var address = NativeMethods.CrossGetProcAddress(_libVlcDll, name); - if (address != IntPtr.Zero) - { - return Marshal.GetDelegateForFunctionPointer(address, type); - } - return null; - } - - private void LoadLibVlcDynamic() - { - _libvlc_new = (libvlc_new)GetDllType(typeof(libvlc_new), "libvlc_new"); - _libvlc_get_version = (libvlc_get_version)GetDllType(typeof(libvlc_get_version), "libvlc_get_version"); - _libvlc_release = (libvlc_release)GetDllType(typeof(libvlc_release), "libvlc_release"); - - _libvlc_media_new_path = (libvlc_media_new_path)GetDllType(typeof(libvlc_media_new_path), "libvlc_media_new_path"); - _libvlc_media_player_new_from_media = (libvlc_media_player_new_from_media)GetDllType(typeof(libvlc_media_player_new_from_media), "libvlc_media_player_new_from_media"); - _libvlc_media_release = (libvlc_media_release)GetDllType(typeof(libvlc_media_release), "libvlc_media_release"); - - _libvlc_video_get_size = (libvlc_video_get_size)GetDllType(typeof(libvlc_video_get_size), "libvlc_video_get_size"); - _libvlc_video_set_spu = (libvlc_video_set_spu)GetDllType(typeof(libvlc_video_set_spu), "libvlc_video_set_spu"); - _libvlc_video_set_callbacks = (libvlc_video_set_callbacks)GetDllType(typeof(libvlc_video_set_callbacks), "libvlc_video_set_callbacks"); - _libvlc_video_set_format = (libvlc_video_set_format)GetDllType(typeof(libvlc_video_set_format), "libvlc_video_set_format"); - _libvlc_video_take_snapshot = (libvlc_video_take_snapshot)GetDllType(typeof(libvlc_video_take_snapshot), "libvlc_video_take_snapshot"); - - _libvlc_audio_get_track_count = (libvlc_audio_get_track_count)GetDllType(typeof(libvlc_audio_get_track_count), "libvlc_audio_get_track_count"); - _libvlc_audio_get_track_description = (libvlc_audio_get_track_description)GetDllType(typeof(libvlc_audio_get_track_description), "libvlc_audio_get_track_description"); - _libvlc_audio_get_track = (libvlc_audio_get_track)GetDllType(typeof(libvlc_audio_get_track), "libvlc_audio_get_track"); - _libvlc_audio_set_track = (libvlc_audio_set_track)GetDllType(typeof(libvlc_audio_set_track), "libvlc_audio_set_track"); - _libvlc_audio_get_delay = (libvlc_audio_get_delay)GetDllType(typeof(libvlc_audio_get_delay), "libvlc_audio_get_delay"); - _libvlc_audio_get_volume = (libvlc_audio_get_volume)GetDllType(typeof(libvlc_audio_get_volume), "libvlc_audio_get_volume"); - _libvlc_audio_set_volume = (libvlc_audio_set_volume)GetDllType(typeof(libvlc_audio_set_volume), "libvlc_audio_set_volume"); - - _libvlc_track_description_release = (libvlc_track_description_release)GetDllType(typeof(libvlc_track_description_release), "libvlc_track_description_release"); - if (_libvlc_track_description_release == null) - { //TODO: libvlc 4 beta... check when final version is out - _libvlc_track_description_release = (libvlc_track_description_release)GetDllType(typeof(libvlc_track_description_release), "libvlc_track_description_list_release"); - } - - _libvlc_media_player_play = (libvlc_media_player_play)GetDllType(typeof(libvlc_media_player_play), "libvlc_media_player_play"); - _libvlc_media_player_set_hwnd = (libvlc_media_player_set_hwnd)GetDllType(typeof(libvlc_media_player_set_hwnd), "libvlc_media_player_set_hwnd"); - _libvlc_media_player_set_xwindow = (libvlc_media_player_set_xwindow)GetDllType(typeof(libvlc_media_player_set_xwindow), "libvlc_media_player_set_xwindow"); - _libvlc_media_player_is_playing = (libvlc_media_player_is_playing)GetDllType(typeof(libvlc_media_player_is_playing), "libvlc_media_player_is_playing"); - _libvlc_media_player_set_pause = (libvlc_media_player_set_pause)GetDllType(typeof(libvlc_media_player_set_pause), "libvlc_media_player_set_pause"); - _libvlc_media_player_get_time = (libvlc_media_player_get_time)GetDllType(typeof(libvlc_media_player_get_time), "libvlc_media_player_get_time"); - _libvlc_media_player_set_time = (libvlc_media_player_set_time)GetDllType(typeof(libvlc_media_player_set_time), "libvlc_media_player_set_time"); - _libvlc_media_player_get_state = (libvlc_media_player_get_state)GetDllType(typeof(libvlc_media_player_get_state), "libvlc_media_player_get_state"); - _libvlc_media_player_get_length = (libvlc_media_player_get_length)GetDllType(typeof(libvlc_media_player_get_length), "libvlc_media_player_get_length"); - _libvlc_media_player_release = (libvlc_media_player_release)GetDllType(typeof(libvlc_media_player_release), "libvlc_media_player_release"); - _libvlc_media_player_get_rate = (libvlc_media_player_get_rate)GetDllType(typeof(libvlc_media_player_get_rate), "libvlc_media_player_get_rate"); - _libvlc_media_player_set_rate = (libvlc_media_player_set_rate)GetDllType(typeof(libvlc_media_player_set_rate), "libvlc_media_player_set_rate"); - _libvlc_media_player_next_frame = (libvlc_media_player_next_frame)GetDllType(typeof(libvlc_media_player_next_frame), "libvlc_media_player_next_frame"); - _libvlc_media_player_add_slave = (libvlc_media_player_add_slave)GetDllType(typeof(libvlc_media_player_add_slave), "libvlc_media_player_add_slave"); - _libvlc_media_player_stop = (libvlc_media_player_stop)GetDllType(typeof(libvlc_media_player_stop), "libvlc_media_player_stop"); - if (_libvlc_media_player_stop == null) - { //TODO: libvlc 4 beta... check when final version is out - _libvlc_media_player_stop = (libvlc_media_player_stop)GetDllType(typeof(libvlc_media_player_stop), "libvlc_media_player_stop_async"); - } - } - - private bool IsAllMethodsLoaded() - { - return _libvlc_new != null && - _libvlc_release != null && - _libvlc_media_new_path != null && - _libvlc_media_player_new_from_media != null && - _libvlc_media_release != null && - _libvlc_video_get_size != null && - _libvlc_audio_get_volume != null && - _libvlc_audio_set_volume != null && - _libvlc_media_player_play != null && - _libvlc_media_player_stop != null && - _libvlc_media_player_is_playing != null && - _libvlc_media_player_get_time != null && - _libvlc_media_player_set_time != null && - _libvlc_media_player_get_state != null && - _libvlc_media_player_get_length != null && - _libvlc_media_player_release != null && - _libvlc_media_player_get_rate != null && - _libvlc_media_player_set_rate != null; - } - - public static bool IsInstalled - { - get - { - try - { - using (var vlc = new LibVlcDynamic()) - { - vlc.Initialize(null, null, null, null); - var allMethodsLoaded = vlc.IsAllMethodsLoaded(); - if (!allMethodsLoaded) - { - SeLogger.Error("Not all required methods was found in libvlc"); - } - return allMethodsLoaded; - } - } - catch (Exception ex) - { - SeLogger.Error(ex, "LibVlcDynamic.IsInstalled"); - return false; - } - } - } - - public override string PlayerName - { - get - { - if (_libVlcDll == IntPtr.Zero || _libvlc_get_version == null) - { - return "VLC"; - } - - var versionPointer = _libvlc_get_version(); - var libVlcVersionIncludingCodeName = Marshal.PtrToStringAnsi(versionPointer); - return $"VLC {libVlcVersionIncludingCodeName}"; - } - } - - public override int Volume - { - get - { - if (_volume != -1) - { - return _volume; - } - - if (Configuration.Settings.General.AllowVolumeBoost) - { - var result = (int)Math.Round(_libvlc_audio_get_volume(_mediaPlayer) / 5.0); - return result > 100 ? 100 : result; - } - var v = _libvlc_audio_get_volume(_mediaPlayer); - return v > 100 ? 100 : v; - } - set - { - _volume = value; - if (Configuration.Settings.General.AllowVolumeBoost) - { - _libvlc_audio_set_volume(_mediaPlayer, value * 5); - } - else - { - _libvlc_audio_set_volume(_mediaPlayer, value); - } - } - } - - public override double Duration => _libvlc_media_player_get_length(_mediaPlayer) / TimeCode.BaseUnit; - - public override double CurrentPosition - { - get - { - if (_pausePosition != null) - { - return _pausePosition < 0 ? 0 : _pausePosition.Value; - } - return _libvlc_media_player_get_time(_mediaPlayer) / TimeCode.BaseUnit; - } - set - { - if (IsPaused && value <= Duration) - { - _pausePosition = value; - } - - _libvlc_media_player_set_time(_mediaPlayer, (long)(value * TimeCode.BaseUnit + 0.5)); - } - } - - public override double PlayRate - { - get => _libvlc_media_player_get_rate(_mediaPlayer); - set - { - if (value >= 0 && value <= 2.0) - { - _libvlc_media_player_set_rate(_mediaPlayer, (float)value); - } - } - } - - public void GetNextFrame() - { - _libvlc_media_player_next_frame(_mediaPlayer); - } - - public int VlcState => _libvlc_media_player_get_state(_mediaPlayer); - - public override void Play() - { - _libvlc_media_player_play(_mediaPlayer); - _pausePosition = null; - } - - public override void Pause() - { - if (_mediaPlayer == IntPtr.Zero) - { - return; - } - - _libvlc_media_player_set_pause(_mediaPlayer, 1); - WaitUntilReady(); - _libvlc_media_player_set_pause(_mediaPlayer, 1); - } - - private void WaitUntilReady() - { - int state = VlcState; - int i = 0; - while (state != 4 && i < 50) - { - System.Threading.Thread.Sleep(10); - Application.DoEvents(); - state = VlcState; - i++; - } - } - - public override void Stop() - { - _libvlc_media_player_stop(_mediaPlayer); - _pausePosition = null; - } - - public override bool IsPaused - { - get - { - const int paused = 4; - int state = _libvlc_media_player_get_state(_mediaPlayer); - return state == paused; - } - } - - public override bool IsPlaying - { - get - { - const int playing = 3; - int state = _libvlc_media_player_get_state(_mediaPlayer); - return state == playing; - } - } - - private struct TrackDescription - { - public int Id { get; set; } - public IntPtr Name { get; set; } - public IntPtr PNext { get; set; } - } - - public List<KeyValuePair<int, string>> GetAudioTracks() - { - int count = _libvlc_audio_get_track_count(_mediaPlayer); - var trackDescriptionsPointer = _libvlc_audio_get_track_description(_mediaPlayer); - var trackDescriptionList = new List<KeyValuePair<int, string>>(); - IntPtr trackDescriptionPointer = trackDescriptionsPointer; - while (trackDescriptionPointer != IntPtr.Zero) - { - var trackDescription = (TrackDescription)Marshal.PtrToStructure(trackDescriptionPointer, typeof(TrackDescription)); - string s = Marshal.PtrToStringAnsi(trackDescription.Name); - if (trackDescription.Id != -1) // not disable - { - trackDescriptionList.Add(new KeyValuePair<int, string>(trackDescription.Id, s)); - } - trackDescriptionPointer = trackDescription.PNext; - } - if (trackDescriptionsPointer != IntPtr.Zero) - { - _libvlc_track_description_release(trackDescriptionsPointer); - } - return trackDescriptionList; - } - - public int AudioTrackCount - { - get - { - var x = _libvlc_audio_get_track_count(_mediaPlayer) - 1; - return x; - } - } - - public int AudioTrackNumber - { - get - { - var x = _libvlc_audio_get_track(_mediaPlayer); - return x; - } - set => _libvlc_audio_set_track(_mediaPlayer, value); - } - - /// <summary> - /// Audio delay in milliseconds - /// </summary> - public Int64 AudioDelay => _libvlc_audio_get_delay(_mediaPlayer) / 1000; - - public bool TakeSnapshot(string fileName, UInt32 width, UInt32 height) - { - return _libvlc_video_take_snapshot?.Invoke(_mediaPlayer, 0, Encoding.UTF8.GetBytes(fileName + "\0"), width, height) == 1; - } - - public bool LoadSecondSubtitle(string fileName) - { - if (_libvlc_media_player_add_slave == null) - { - return false; - } - - var uri = new Uri(fileName); - return 0 == _libvlc_media_player_add_slave(_mediaPlayer, 0, Encoding.UTF8.GetBytes(uri.AbsoluteUri + "\0"), true); - } - - public LibVlcDynamic MakeSecondMediaPlayer(Control ownerControl, string videoFileName, EventHandler onVideoLoaded, EventHandler onVideoEnded) - { - var newVlc = new LibVlcDynamic { _libVlc = _libVlc, _libVlcDll = _libVlcDll, _ownerControl = ownerControl }; - if (ownerControl != null) - { - newVlc._parentForm = ownerControl.FindForm(); - } - - newVlc.LoadLibVlcDynamic(); - - newVlc.OnVideoLoaded = onVideoLoaded; - newVlc.OnVideoEnded = onVideoEnded; - - if (!string.IsNullOrEmpty(videoFileName)) - { - var media = _libvlc_media_new_path(_libVlc, Encoding.UTF8.GetBytes(videoFileName + "\0")); - newVlc._mediaPlayer = _libvlc_media_player_new_from_media(media); - _libvlc_media_release(media); - - if (ownerControl != null) - { - SetDrawableHandle(newVlc._mediaPlayer, ownerControl); - } - - if (onVideoEnded != null) - { - newVlc._videoEndTimer = new Timer { Interval = 500 }; - newVlc._videoEndTimer.Tick += VideoEndTimerTick; - newVlc._videoEndTimer.Start(); - } - - _libvlc_media_player_play(newVlc._mediaPlayer); - newVlc._videoLoadedTimer = new Timer { Interval = 100 }; - newVlc._videoLoadedTimer.Tick += newVlc.VideoLoadedTimer_Tick; - newVlc._videoLoadedTimer.Start(); - - newVlc._mouseTimer = new Timer { Interval = 25 }; - newVlc._mouseTimer.Tick += newVlc.MouseTimerTick; - newVlc._mouseTimer.Start(); - } - return newVlc; - } - - private void VideoLoadedTimer_Tick(object sender, EventArgs e) - { - _videoLoadedTimer.Stop(); - int i = 0; - while (!IsPlaying && i < 50) - { - System.Threading.Thread.Sleep(100); - i++; - } - Pause(); - _libvlc_video_set_spu?.Invoke(_mediaPlayer, -1); // turn of embedded subtitles - OnVideoLoaded?.Invoke(_mediaPlayer, new EventArgs()); - } - - public static string GetVlcPath(string fileName) - { - if (Configuration.IsRunningOnWindows) - { - var path = Path.Combine(Configuration.BaseDirectory, "VLC", fileName); - if (File.Exists(path)) - { - return path; - } - - if (!string.IsNullOrEmpty(Configuration.Settings.General.VlcLocation)) - { - try - { - if (Configuration.Settings.General.VlcLocation.EndsWith(".exe", StringComparison.OrdinalIgnoreCase)) - { - Configuration.Settings.General.VlcLocation = Path.GetDirectoryName(Configuration.Settings.General.VlcLocation); - } - - if (!string.IsNullOrEmpty(Configuration.Settings.General.VlcLocation)) - { - path = Path.Combine(Configuration.Settings.General.VlcLocation, fileName); - if (File.Exists(path)) - { - return path; - } - } - } - catch - { - // ignored - } - } - - if (!string.IsNullOrEmpty(Configuration.Settings.General.VlcLocationRelative)) - { - try - { - path = Configuration.Settings.General.VlcLocationRelative; - if (path.EndsWith(".exe", StringComparison.OrdinalIgnoreCase)) - { - path = Path.GetDirectoryName(path); - } - - if (path != null) - { - path = Path.Combine(path, fileName); - var fullPath = Path.GetFullPath(path); - if (File.Exists(fullPath)) - { - return fullPath; - } - - while (path.StartsWith("..", StringComparison.Ordinal)) - { - path = path.Remove(0, 3); - fullPath = Path.GetFullPath(path); - if (File.Exists(fullPath)) - { - return fullPath; - } - } - } - } - catch - { - // ignored - } - } - - // XP via registry path - path = RegistryUtil.GetValue(@"SOFTWARE\VideoLAN\VLC", "InstallDir"); - if (path != null && Directory.Exists(path)) - { - path = Path.Combine(path, fileName); - } - - if (File.Exists(path)) - { - return path; - } - - // Windows 7 via registry path - path = RegistryUtil.GetValue(@"SOFTWARE\Wow6432Node\VideoLAN\VLC", "InstallDir"); - if (path != null && Directory.Exists(path)) - { - path = Path.Combine(path, fileName); - } - - if (File.Exists(path)) - { - return path; - } - - path = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86); - if (!string.IsNullOrEmpty(path)) - { - var p = Path.Combine(path, "VideoLAN", "VLC", fileName); - if (File.Exists(p)) - { - return p; - } - - p = Path.Combine(path, "VLC", fileName); - if (File.Exists(p)) - { - return p; - } - } - - path = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles); - if (!string.IsNullOrEmpty(path)) - { - var p = Path.Combine(path, "VideoLAN", "VLC", fileName); - if (File.Exists(p)) - { - return p; - } - - p = Path.Combine(path, "VLC", fileName); - if (File.Exists(p)) - { - return p; - } - } - - path = Path.Combine(@"C:\Program Files (x86)\VideoLAN\VLC", fileName); - if (File.Exists(path)) - { - return path; - } - - path = Path.Combine(@"C:\Program Files\VideoLAN\VLC", fileName); - if (File.Exists(path)) - { - return path; - } - - path = Path.Combine(@"C:\Program Files (x86)\VLC", fileName); - if (File.Exists(path)) - { - return path; - } - - path = Path.Combine(@"C:\Program Files\VLC", fileName); - if (File.Exists(path)) - { - return path; - } - } - - return null; - } - - public bool InitializeAndStartFrameGrabbing(string videoFileName, - UInt32 width, UInt32 height, - LockCallbackDelegate @lock, - UnlockCallbackDelegate unlock, - DisplayCallbackDelegate display, - IntPtr opaque) - { - string dllFile = GetVlcPath("libvlc.dll"); - if (!File.Exists(dllFile) || string.IsNullOrEmpty(videoFileName)) - { - return false; - } - - var dir = Path.GetDirectoryName(dllFile); - if (dir != null) - { - Directory.SetCurrentDirectory(dir); - } - - _libVlcDll = NativeMethods.CrossLoadLibrary(dllFile); - LoadLibVlcDynamic(); - string[] initParameters = { "--no-skip-frames" }; - _libVlc = _libvlc_new(initParameters.Length, initParameters); - IntPtr media = _libvlc_media_new_path(_libVlc, Encoding.UTF8.GetBytes(videoFileName + "\0")); - _mediaPlayer = _libvlc_media_player_new_from_media(media); - _libvlc_media_release(media); - _libvlc_video_set_format(_mediaPlayer, "RV24", width, height, 3 * width); - _libvlc_video_set_callbacks(_mediaPlayer, @lock, unlock, display, opaque); - _libvlc_audio_set_volume(_mediaPlayer, 0); - _libvlc_media_player_set_rate(_mediaPlayer, 9f); - return true; - } - - public override void Initialize(Control ownerControl, string videoFileName, EventHandler onVideoLoaded, EventHandler onVideoEnded) - { - _ownerControl = ownerControl; - if (ownerControl != null) - { - _parentForm = ownerControl.FindForm(); - } - - var dllFile = "libvlc.so"; - if (Configuration.IsRunningOnWindows) - { - dllFile = GetVlcPath("libvlc.dll"); - if (File.Exists(dllFile)) - { - var dir = Path.GetDirectoryName(dllFile); - if (dir != null) - { - Directory.SetCurrentDirectory(dir); - } - } - } - - try - { - _libVlcDll = NativeMethods.CrossLoadLibrary(dllFile); - } - catch (Exception exception) - { - SeLogger.Error(exception, $"Unable to load '{dllFile}' (also check libc.so.6 + libdl.so.2)"); - } - - try - { - if (_libVlcDll == IntPtr.Zero && Configuration.IsRunningOnLinux) - { - for (int i = 4; i < 20; i++) - { - if (_libVlcDll == IntPtr.Zero) - { - dllFile = $"libvlc.so.{i}"; - _libVlcDll = NativeMethods.CrossLoadLibrary(dllFile); - } - } - - if (_libVlcDll == IntPtr.Zero) - { - foreach (var fileName in Directory.GetFiles("/usr/lib/x86_64-linux-gnu", "libvlc.so.?")) - { - if (_libVlcDll == IntPtr.Zero) - { - dllFile = fileName; - _libVlcDll = NativeMethods.CrossLoadLibrary(dllFile); - } - } - } - } - } - catch - { - // ignore - } - - if (_libVlcDll == IntPtr.Zero) - { - SeLogger.Error($"Unable to load '{dllFile}' (also check libc.so.6 + libdl.so.2)"); - return; - } - LoadLibVlcDynamic(); - - OnVideoLoaded = onVideoLoaded; - OnVideoEnded = onVideoEnded; - - if (!string.IsNullOrEmpty(videoFileName)) - { - string[] initParameters = { "--no-sub-autodetect-file" }; // , "--ffmpeg-hw" }; //, "--no-video-title-show" }; // TODO: Put in options/config file - _libVlc = _libvlc_new(initParameters.Length, initParameters); - var media = _libvlc_media_new_path(_libVlc, Encoding.UTF8.GetBytes(videoFileName + "\0")); - _mediaPlayer = _libvlc_media_player_new_from_media(media); - _libvlc_media_release(media); - - // Linux: libvlc_media_player_set_xdrawable (_mediaPlayer, xdrawable); - // Mac: libvlc_media_player_set_nsobject (_mediaPlayer, view); - - if (ownerControl != null) - { - SetDrawableHandle(_mediaPlayer, ownerControl); - } - - if (onVideoEnded != null) - { - _videoEndTimer = new Timer { Interval = 500 }; - _videoEndTimer.Tick += VideoEndTimerTick; - _videoEndTimer.Start(); - } - - _libvlc_media_player_play(_mediaPlayer); - _videoLoadedTimer = new Timer { Interval = 100 }; - _videoLoadedTimer.Tick += VideoLoadedTimer_Tick; - _videoLoadedTimer.Start(); - - _mouseTimer = new Timer { Interval = 25 }; - _mouseTimer.Tick += MouseTimerTick; - _mouseTimer.Start(); - } - } - - private void SetDrawableHandle(IntPtr mediaPlayer, Control ownerControl) - { - if (Configuration.IsRunningOnWindows) - { - _libvlc_media_player_set_hwnd(mediaPlayer, ownerControl.Handle); // windows - - //hack: sometimes vlc opens in it's own windows - this code seems to prevent this - for (int j = 0; j < 50; j++) - { - System.Threading.Thread.Sleep(10); - Application.DoEvents(); - } - - _libvlc_media_player_set_hwnd(mediaPlayer, ownerControl.Handle); // windows - } - else - { - _libvlc_media_player_set_xwindow(mediaPlayer, ownerControl.Handle); // linux - } - } - - public static bool IsLeftMouseButtonDown() - { - if (Configuration.IsRunningOnWindows) - { - const int KEY_PRESSED = 0x8000; - const int VK_LBUTTON = 0x1; - return Convert.ToBoolean(NativeMethods.GetKeyState(VK_LBUTTON) & KEY_PRESSED); - } - return false; - } - - private void MouseTimerTick(object sender, EventArgs e) - { - if (_mouseTimer == null) - { - return; - } - - _mouseTimer.Stop(); - - if (!(_parentForm is Main mainForm) || !mainForm.IsMenuOpen) - { - if (_parentForm != null && _ownerControl != null && _ownerControl.Visible && _parentForm.ContainsFocus && IsLeftMouseButtonDown()) - { - var p = _ownerControl.PointToClient(Control.MousePosition); - if (p.X > 0 && p.X < _ownerControl.Width && p.Y > 0 && p.Y < _ownerControl.Height) - { - if (IsPlaying) - { - Pause(); - } - else - { - Play(); - } - - int i = 0; - while (IsLeftMouseButtonDown() && i < 200) - { - System.Threading.Thread.Sleep(2); - Application.DoEvents(); - i++; - } - } - } - } - - _mouseTimer?.Start(); - } - - private void VideoEndTimerTick(object sender, EventArgs e) - { - lock (DisposeLock) - { - if (_mediaPlayer == IntPtr.Zero) - { - return; - } - - const int ended = 6; - int state = _libvlc_media_player_get_state(_mediaPlayer); - if (state != ended) - { - return; - } - - // hack to make sure VLC is in ready state - Stop(); - Play(); - Pause(); - OnVideoEnded?.Invoke(_mediaPlayer, new EventArgs()); - } - } - - public override void DisposeVideoPlayer() - { - Dispose(); - } - - public override event EventHandler OnVideoLoaded; - - public override event EventHandler OnVideoEnded; - - private void ReleaseUnmanagedResources() - { - try - { - lock (DisposeLock) - { - if (_mediaPlayer != IntPtr.Zero) - { - _libvlc_media_player_stop(_mediaPlayer); - WaitUntilReady(); - _libvlc_media_player_release(_mediaPlayer); // CRASHES in visual sync / point sync? - _mediaPlayer = IntPtr.Zero; - } - - if (_parentForm is Main) - { - if (_libvlc_release != null && _libVlc != IntPtr.Zero) - { - _libvlc_release(_libVlc); // CRASHES in visual sync / point sync? - _libVlc = IntPtr.Zero; - } - - if (_libVlcDll != IntPtr.Zero) - { - NativeMethods.CrossFreeLibrary(_libVlcDll); // CRASHES in visual sync / point sync? - _libVlcDll = IntPtr.Zero; - } - } - } - } - catch - { - // ignored - } - } - - ~LibVlcDynamic() - { - Dispose(false); - } - - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - if (disposing) - { - if (_videoLoadedTimer != null) - { - _videoLoadedTimer.Stop(); - _videoLoadedTimer.Dispose(); - _videoLoadedTimer = null; - } - if (_videoEndTimer != null) - { - _videoEndTimer.Stop(); - _videoEndTimer.Dispose(); - _videoEndTimer = null; - } - if (_mouseTimer != null) - { - _mouseTimer.Dispose(); - _mouseTimer = null; - } - Application.DoEvents(); - } - ReleaseUnmanagedResources(); - } - - } -} +using Nikse.SubtitleEdit.Core; +using Nikse.SubtitleEdit.Forms; +using System; +using System.Collections.Generic; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Logic.VideoPlayers +{ + public class LibVlcDynamic : VideoPlayer, IDisposable + { + private Timer _videoLoadedTimer; + private Timer _videoEndTimer; + private Timer _mouseTimer; + + private IntPtr _libVlcDll; + private IntPtr _libVlc; + private IntPtr _mediaPlayer; + private Control _ownerControl; + private Form _parentForm; + private double? _pausePosition; // Hack to hold precise seeking when paused + private int _volume = -1; + private static readonly object DisposeLock = new object(); + + // LibVLC Core - http://www.videolan.org/developers/vlc/doc/doxygen/html/group__libvlc__core.html + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate IntPtr libvlc_new(int argc, [MarshalAs(UnmanagedType.LPArray)] string[] argv); + private libvlc_new _libvlc_new; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate IntPtr libvlc_get_version(); + private libvlc_get_version _libvlc_get_version; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate void libvlc_release(IntPtr libVlc); + private libvlc_release _libvlc_release; + + // LibVLC Media - http://www.videolan.org/developers/vlc/doc/doxygen/html/group__libvlc__media.html + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate IntPtr libvlc_media_new_path(IntPtr instance, byte[] input); + private libvlc_media_new_path _libvlc_media_new_path; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate void libvlc_media_release(IntPtr media); + private libvlc_media_release _libvlc_media_release; + + // LibVLC Video Controls - http://www.videolan.org/developers/vlc/doc/doxygen/html/group__libvlc__video.html#g8f55326b8b51aecb59d8b8a446c3f118 + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate void libvlc_video_get_size(IntPtr mediaPlayer, UInt32 number, out UInt32 x, out UInt32 y); + private libvlc_video_get_size _libvlc_video_get_size; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate int libvlc_video_take_snapshot(IntPtr mediaPlayer, byte num, byte[] filePath, UInt32 width, UInt32 height); + private libvlc_video_take_snapshot _libvlc_video_take_snapshot; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate void libvlc_video_set_callbacks(IntPtr playerInstance, LockCallbackDelegate @lock, UnlockCallbackDelegate unlock, DisplayCallbackDelegate display, IntPtr opaque); + private libvlc_video_set_callbacks _libvlc_video_set_callbacks; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate int libvlc_video_set_format(IntPtr mediaPlayer, string chroma, UInt32 width, UInt32 height, UInt32 pitch); + private libvlc_video_set_format _libvlc_video_set_format; + + // LibVLC Audio Controls - http://www.videolan.org/developers/vlc/doc/doxygen/html/group__libvlc__audio.html + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate int libvlc_audio_get_volume(IntPtr mediaPlayer); + private libvlc_audio_get_volume _libvlc_audio_get_volume; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate void libvlc_audio_set_volume(IntPtr mediaPlayer, int volume); + private libvlc_audio_set_volume _libvlc_audio_set_volume; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate int libvlc_audio_get_track_count(IntPtr mediaPlayer); + private libvlc_audio_get_track_count _libvlc_audio_get_track_count; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate IntPtr libvlc_audio_get_track_description(IntPtr mediaPlayer); + private libvlc_audio_get_track_description _libvlc_audio_get_track_description; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate void libvlc_track_description_release(IntPtr mediaPlayer); + private libvlc_track_description_release _libvlc_track_description_release; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate int libvlc_audio_get_track(IntPtr mediaPlayer); + private libvlc_audio_get_track _libvlc_audio_get_track; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate int libvlc_audio_set_track(IntPtr mediaPlayer, int trackNumber); + private libvlc_audio_set_track _libvlc_audio_set_track; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate Int64 libvlc_audio_get_delay(IntPtr mediaPlayer); + private libvlc_audio_get_delay _libvlc_audio_get_delay; + + // LibVLC media player - http://www.videolan.org/developers/vlc/doc/doxygen/html/group__libvlc__media__player.html + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate IntPtr libvlc_media_player_new_from_media(IntPtr media); + private libvlc_media_player_new_from_media _libvlc_media_player_new_from_media; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate void libvlc_media_player_play(IntPtr mediaPlayer); + private libvlc_media_player_play _libvlc_media_player_play; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate void libvlc_media_player_stop(IntPtr mediaPlayer); + private libvlc_media_player_stop _libvlc_media_player_stop; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate void libvlc_media_player_set_hwnd(IntPtr mediaPlayer, IntPtr windowsHandle); + private libvlc_media_player_set_hwnd _libvlc_media_player_set_hwnd; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate void libvlc_media_player_set_xwindow(IntPtr mediaPlayer, IntPtr windowsHandle); + private libvlc_media_player_set_xwindow _libvlc_media_player_set_xwindow; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate int libvlc_media_player_is_playing(IntPtr mediaPlayer); + private libvlc_media_player_is_playing _libvlc_media_player_is_playing; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate int libvlc_media_player_set_pause(IntPtr mediaPlayer, int doPause); + private libvlc_media_player_set_pause _libvlc_media_player_set_pause; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate Int64 libvlc_media_player_get_time(IntPtr mediaPlayer); + private libvlc_media_player_get_time _libvlc_media_player_get_time; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate void libvlc_media_player_set_time(IntPtr mediaPlayer, Int64 position); + private libvlc_media_player_set_time _libvlc_media_player_set_time; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate byte libvlc_media_player_get_state(IntPtr mediaPlayer); + private libvlc_media_player_get_state _libvlc_media_player_get_state; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate Int64 libvlc_media_player_get_length(IntPtr mediaPlayer); + private libvlc_media_player_get_length _libvlc_media_player_get_length; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate void libvlc_media_player_release(IntPtr mediaPlayer); + private libvlc_media_player_release _libvlc_media_player_release; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate float libvlc_media_player_get_rate(IntPtr mediaPlayer); + private libvlc_media_player_get_rate _libvlc_media_player_get_rate; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate int libvlc_media_player_set_rate(IntPtr mediaPlayer, float rate); + private libvlc_media_player_set_rate _libvlc_media_player_set_rate; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate int libvlc_media_player_next_frame(IntPtr mediaPlayer); + private libvlc_media_player_next_frame _libvlc_media_player_next_frame; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate int libvlc_media_player_add_slave(IntPtr media, int type, byte[] filePath, bool select); + private libvlc_media_player_add_slave _libvlc_media_player_add_slave; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate int libvlc_video_set_spu(IntPtr mediaPlayer, int trackNumber); + private libvlc_video_set_spu _libvlc_video_set_spu; + + /// <summary> + /// Callback prototype to allocate and lock a picture buffer. Whenever a new video frame needs to be decoded, the lock callback is invoked. Depending on the video chroma, one or three pixel planes of adequate dimensions must be returned via the second parameter. Those planes must be aligned on 32-bytes boundaries. + /// </summary> + /// <param name="opaque">Private pointer as passed to SetCallbacks()</param> + /// <param name="planes">Planes start address of the pixel planes (LibVLC allocates the array of void pointers, this callback must initialize the array)</param> + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate void LockCallbackDelegate(IntPtr opaque, ref IntPtr planes); + + /// <summary> + /// Callback prototype to unlock a picture buffer. When the video frame decoding is complete, the unlock callback is invoked. This callback might not be needed at all. It is only an indication that the application can now read the pixel values if it needs to. + /// </summary> + /// <param name="opaque">Private pointer as passed to SetCallbacks()</param> + /// <param name="picture">Private pointer returned from the LockCallback callback</param> + /// <param name="planes">Pixel planes as defined by the @ref libvlc_video_lock_cb callback (this parameter is only for convenience)</param> + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate void UnlockCallbackDelegate(IntPtr opaque, IntPtr picture, ref IntPtr planes); + + /// <summary> + /// Callback prototype to display a picture. When the video frame needs to be shown, as determined by the media playback clock, the display callback is invoked. + /// </summary> + /// <param name="opaque">Private pointer as passed to SetCallbacks()</param> + /// <param name="picture">Private pointer returned from the LockCallback callback</param> + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate void DisplayCallbackDelegate(IntPtr opaque, IntPtr picture); + + private object GetDllType(Type type, string name) + { + var address = NativeMethods.CrossGetProcAddress(_libVlcDll, name); + if (address != IntPtr.Zero) + { + return Marshal.GetDelegateForFunctionPointer(address, type); + } + return null; + } + + private void LoadLibVlcDynamic() + { + _libvlc_new = (libvlc_new)GetDllType(typeof(libvlc_new), "libvlc_new"); + _libvlc_get_version = (libvlc_get_version)GetDllType(typeof(libvlc_get_version), "libvlc_get_version"); + _libvlc_release = (libvlc_release)GetDllType(typeof(libvlc_release), "libvlc_release"); + + _libvlc_media_new_path = (libvlc_media_new_path)GetDllType(typeof(libvlc_media_new_path), "libvlc_media_new_path"); + _libvlc_media_player_new_from_media = (libvlc_media_player_new_from_media)GetDllType(typeof(libvlc_media_player_new_from_media), "libvlc_media_player_new_from_media"); + _libvlc_media_release = (libvlc_media_release)GetDllType(typeof(libvlc_media_release), "libvlc_media_release"); + + _libvlc_video_get_size = (libvlc_video_get_size)GetDllType(typeof(libvlc_video_get_size), "libvlc_video_get_size"); + _libvlc_video_set_spu = (libvlc_video_set_spu)GetDllType(typeof(libvlc_video_set_spu), "libvlc_video_set_spu"); + _libvlc_video_set_callbacks = (libvlc_video_set_callbacks)GetDllType(typeof(libvlc_video_set_callbacks), "libvlc_video_set_callbacks"); + _libvlc_video_set_format = (libvlc_video_set_format)GetDllType(typeof(libvlc_video_set_format), "libvlc_video_set_format"); + _libvlc_video_take_snapshot = (libvlc_video_take_snapshot)GetDllType(typeof(libvlc_video_take_snapshot), "libvlc_video_take_snapshot"); + + _libvlc_audio_get_track_count = (libvlc_audio_get_track_count)GetDllType(typeof(libvlc_audio_get_track_count), "libvlc_audio_get_track_count"); + _libvlc_audio_get_track_description = (libvlc_audio_get_track_description)GetDllType(typeof(libvlc_audio_get_track_description), "libvlc_audio_get_track_description"); + _libvlc_audio_get_track = (libvlc_audio_get_track)GetDllType(typeof(libvlc_audio_get_track), "libvlc_audio_get_track"); + _libvlc_audio_set_track = (libvlc_audio_set_track)GetDllType(typeof(libvlc_audio_set_track), "libvlc_audio_set_track"); + _libvlc_audio_get_delay = (libvlc_audio_get_delay)GetDllType(typeof(libvlc_audio_get_delay), "libvlc_audio_get_delay"); + _libvlc_audio_get_volume = (libvlc_audio_get_volume)GetDllType(typeof(libvlc_audio_get_volume), "libvlc_audio_get_volume"); + _libvlc_audio_set_volume = (libvlc_audio_set_volume)GetDllType(typeof(libvlc_audio_set_volume), "libvlc_audio_set_volume"); + + _libvlc_track_description_release = (libvlc_track_description_release)GetDllType(typeof(libvlc_track_description_release), "libvlc_track_description_release"); + if (_libvlc_track_description_release == null) + { //TODO: libvlc 4 beta... check when final version is out + _libvlc_track_description_release = (libvlc_track_description_release)GetDllType(typeof(libvlc_track_description_release), "libvlc_track_description_list_release"); + } + + _libvlc_media_player_play = (libvlc_media_player_play)GetDllType(typeof(libvlc_media_player_play), "libvlc_media_player_play"); + _libvlc_media_player_set_hwnd = (libvlc_media_player_set_hwnd)GetDllType(typeof(libvlc_media_player_set_hwnd), "libvlc_media_player_set_hwnd"); + _libvlc_media_player_set_xwindow = (libvlc_media_player_set_xwindow)GetDllType(typeof(libvlc_media_player_set_xwindow), "libvlc_media_player_set_xwindow"); + _libvlc_media_player_is_playing = (libvlc_media_player_is_playing)GetDllType(typeof(libvlc_media_player_is_playing), "libvlc_media_player_is_playing"); + _libvlc_media_player_set_pause = (libvlc_media_player_set_pause)GetDllType(typeof(libvlc_media_player_set_pause), "libvlc_media_player_set_pause"); + _libvlc_media_player_get_time = (libvlc_media_player_get_time)GetDllType(typeof(libvlc_media_player_get_time), "libvlc_media_player_get_time"); + _libvlc_media_player_set_time = (libvlc_media_player_set_time)GetDllType(typeof(libvlc_media_player_set_time), "libvlc_media_player_set_time"); + _libvlc_media_player_get_state = (libvlc_media_player_get_state)GetDllType(typeof(libvlc_media_player_get_state), "libvlc_media_player_get_state"); + _libvlc_media_player_get_length = (libvlc_media_player_get_length)GetDllType(typeof(libvlc_media_player_get_length), "libvlc_media_player_get_length"); + _libvlc_media_player_release = (libvlc_media_player_release)GetDllType(typeof(libvlc_media_player_release), "libvlc_media_player_release"); + _libvlc_media_player_get_rate = (libvlc_media_player_get_rate)GetDllType(typeof(libvlc_media_player_get_rate), "libvlc_media_player_get_rate"); + _libvlc_media_player_set_rate = (libvlc_media_player_set_rate)GetDllType(typeof(libvlc_media_player_set_rate), "libvlc_media_player_set_rate"); + _libvlc_media_player_next_frame = (libvlc_media_player_next_frame)GetDllType(typeof(libvlc_media_player_next_frame), "libvlc_media_player_next_frame"); + _libvlc_media_player_add_slave = (libvlc_media_player_add_slave)GetDllType(typeof(libvlc_media_player_add_slave), "libvlc_media_player_add_slave"); + _libvlc_media_player_stop = (libvlc_media_player_stop)GetDllType(typeof(libvlc_media_player_stop), "libvlc_media_player_stop"); + if (_libvlc_media_player_stop == null) + { //TODO: libvlc 4 beta... check when final version is out + _libvlc_media_player_stop = (libvlc_media_player_stop)GetDllType(typeof(libvlc_media_player_stop), "libvlc_media_player_stop_async"); + } + } + + private bool IsAllMethodsLoaded() + { + return _libvlc_new != null && + _libvlc_release != null && + _libvlc_media_new_path != null && + _libvlc_media_player_new_from_media != null && + _libvlc_media_release != null && + _libvlc_video_get_size != null && + _libvlc_audio_get_volume != null && + _libvlc_audio_set_volume != null && + _libvlc_media_player_play != null && + _libvlc_media_player_stop != null && + _libvlc_media_player_is_playing != null && + _libvlc_media_player_get_time != null && + _libvlc_media_player_set_time != null && + _libvlc_media_player_get_state != null && + _libvlc_media_player_get_length != null && + _libvlc_media_player_release != null && + _libvlc_media_player_get_rate != null && + _libvlc_media_player_set_rate != null; + } + + public static bool IsInstalled + { + get + { + try + { + using (var vlc = new LibVlcDynamic()) + { + vlc.Initialize(null, null, null, null); + var allMethodsLoaded = vlc.IsAllMethodsLoaded(); + if (!allMethodsLoaded) + { + SeLogger.Error("Not all required methods was found in libvlc"); + } + return allMethodsLoaded; + } + } + catch (Exception ex) + { + SeLogger.Error(ex, "LibVlcDynamic.IsInstalled"); + return false; + } + } + } + + public override string PlayerName + { + get + { + if (_libVlcDll == IntPtr.Zero || _libvlc_get_version == null) + { + return "VLC"; + } + + var versionPointer = _libvlc_get_version(); + var libVlcVersionIncludingCodeName = Marshal.PtrToStringAnsi(versionPointer); + return $"VLC {libVlcVersionIncludingCodeName}"; + } + } + + public override int Volume + { + get + { + if (_volume != -1) + { + return _volume; + } + + if (Configuration.Settings.General.AllowVolumeBoost) + { + var result = (int)Math.Round(_libvlc_audio_get_volume(_mediaPlayer) / 5.0); + return result > 100 ? 100 : result; + } + var v = _libvlc_audio_get_volume(_mediaPlayer); + return v > 100 ? 100 : v; + } + set + { + _volume = value; + if (Configuration.Settings.General.AllowVolumeBoost) + { + _libvlc_audio_set_volume(_mediaPlayer, value * 5); + } + else + { + _libvlc_audio_set_volume(_mediaPlayer, value); + } + } + } + + public override double Duration => _libvlc_media_player_get_length(_mediaPlayer) / TimeCode.BaseUnit; + + public override double CurrentPosition + { + get + { + if (_pausePosition != null) + { + return _pausePosition < 0 ? 0 : _pausePosition.Value; + } + return _libvlc_media_player_get_time(_mediaPlayer) / TimeCode.BaseUnit; + } + set + { + if (IsPaused && value <= Duration) + { + _pausePosition = value; + } + + _libvlc_media_player_set_time(_mediaPlayer, (long)(value * TimeCode.BaseUnit + 0.5)); + } + } + + public override double PlayRate + { + get => _libvlc_media_player_get_rate(_mediaPlayer); + set + { + if (value >= 0 && value <= 2.0) + { + _libvlc_media_player_set_rate(_mediaPlayer, (float)value); + } + } + } + + public void GetNextFrame() + { + _libvlc_media_player_next_frame(_mediaPlayer); + } + + public int VlcState => _libvlc_media_player_get_state(_mediaPlayer); + + public override void Play() + { + _libvlc_media_player_play(_mediaPlayer); + _pausePosition = null; + } + + public override void Pause() + { + if (_mediaPlayer == IntPtr.Zero) + { + return; + } + + _libvlc_media_player_set_pause(_mediaPlayer, 1); + WaitUntilReady(); + _libvlc_media_player_set_pause(_mediaPlayer, 1); + } + + private void WaitUntilReady() + { + int state = VlcState; + int i = 0; + while (state != 4 && i < 50) + { + System.Threading.Thread.Sleep(10); + Application.DoEvents(); + state = VlcState; + i++; + } + } + + public override void Stop() + { + _libvlc_media_player_stop(_mediaPlayer); + _pausePosition = null; + } + + public override bool IsPaused + { + get + { + const int paused = 4; + int state = _libvlc_media_player_get_state(_mediaPlayer); + return state == paused; + } + } + + public override bool IsPlaying + { + get + { + const int playing = 3; + int state = _libvlc_media_player_get_state(_mediaPlayer); + return state == playing; + } + } + + private struct TrackDescription + { + public int Id { get; set; } + public IntPtr Name { get; set; } + public IntPtr PNext { get; set; } + } + + public List<KeyValuePair<int, string>> GetAudioTracks() + { + int count = _libvlc_audio_get_track_count(_mediaPlayer); + var trackDescriptionsPointer = _libvlc_audio_get_track_description(_mediaPlayer); + var trackDescriptionList = new List<KeyValuePair<int, string>>(); + IntPtr trackDescriptionPointer = trackDescriptionsPointer; + while (trackDescriptionPointer != IntPtr.Zero) + { + var trackDescription = (TrackDescription)Marshal.PtrToStructure(trackDescriptionPointer, typeof(TrackDescription)); + string s = Marshal.PtrToStringAnsi(trackDescription.Name); + if (trackDescription.Id != -1) // not disable + { + trackDescriptionList.Add(new KeyValuePair<int, string>(trackDescription.Id, s)); + } + trackDescriptionPointer = trackDescription.PNext; + } + if (trackDescriptionsPointer != IntPtr.Zero) + { + _libvlc_track_description_release(trackDescriptionsPointer); + } + return trackDescriptionList; + } + + public int AudioTrackCount + { + get + { + var x = _libvlc_audio_get_track_count(_mediaPlayer) - 1; + return x; + } + } + + public int AudioTrackNumber + { + get + { + var x = _libvlc_audio_get_track(_mediaPlayer); + return x; + } + set => _libvlc_audio_set_track(_mediaPlayer, value); + } + + /// <summary> + /// Audio delay in milliseconds + /// </summary> + public Int64 AudioDelay => _libvlc_audio_get_delay(_mediaPlayer) / 1000; + + public bool TakeSnapshot(string fileName, UInt32 width, UInt32 height) + { + return _libvlc_video_take_snapshot?.Invoke(_mediaPlayer, 0, Encoding.UTF8.GetBytes(fileName + "\0"), width, height) == 1; + } + + public bool LoadSecondSubtitle(string fileName) + { + if (_libvlc_media_player_add_slave == null) + { + return false; + } + + var uri = new Uri(fileName); + return 0 == _libvlc_media_player_add_slave(_mediaPlayer, 0, Encoding.UTF8.GetBytes(uri.AbsoluteUri + "\0"), true); + } + + public LibVlcDynamic MakeSecondMediaPlayer(Control ownerControl, string videoFileName, EventHandler onVideoLoaded, EventHandler onVideoEnded) + { + var newVlc = new LibVlcDynamic { _libVlc = _libVlc, _libVlcDll = _libVlcDll, _ownerControl = ownerControl }; + if (ownerControl != null) + { + newVlc._parentForm = ownerControl.FindForm(); + } + + newVlc.LoadLibVlcDynamic(); + + newVlc.OnVideoLoaded = onVideoLoaded; + newVlc.OnVideoEnded = onVideoEnded; + + if (!string.IsNullOrEmpty(videoFileName)) + { + var media = _libvlc_media_new_path(_libVlc, Encoding.UTF8.GetBytes(videoFileName + "\0")); + newVlc._mediaPlayer = _libvlc_media_player_new_from_media(media); + _libvlc_media_release(media); + + if (ownerControl != null) + { + SetDrawableHandle(newVlc._mediaPlayer, ownerControl); + } + + if (onVideoEnded != null) + { + newVlc._videoEndTimer = new Timer { Interval = 500 }; + newVlc._videoEndTimer.Tick += VideoEndTimerTick; + newVlc._videoEndTimer.Start(); + } + + _libvlc_media_player_play(newVlc._mediaPlayer); + newVlc._videoLoadedTimer = new Timer { Interval = 100 }; + newVlc._videoLoadedTimer.Tick += newVlc.VideoLoadedTimer_Tick; + newVlc._videoLoadedTimer.Start(); + + newVlc._mouseTimer = new Timer { Interval = 25 }; + newVlc._mouseTimer.Tick += newVlc.MouseTimerTick; + newVlc._mouseTimer.Start(); + } + return newVlc; + } + + private void VideoLoadedTimer_Tick(object sender, EventArgs e) + { + _videoLoadedTimer.Stop(); + int i = 0; + while (!IsPlaying && i < 50) + { + System.Threading.Thread.Sleep(100); + i++; + } + Pause(); + _libvlc_video_set_spu?.Invoke(_mediaPlayer, -1); // turn of embedded subtitles + OnVideoLoaded?.Invoke(_mediaPlayer, new EventArgs()); + } + + public static string GetVlcPath(string fileName) + { + if (Configuration.IsRunningOnWindows) + { + var path = Path.Combine(Configuration.BaseDirectory, "VLC", fileName); + if (File.Exists(path)) + { + return path; + } + + if (!string.IsNullOrEmpty(Configuration.Settings.General.VlcLocation)) + { + try + { + if (Configuration.Settings.General.VlcLocation.EndsWith(".exe", StringComparison.OrdinalIgnoreCase)) + { + Configuration.Settings.General.VlcLocation = Path.GetDirectoryName(Configuration.Settings.General.VlcLocation); + } + + if (!string.IsNullOrEmpty(Configuration.Settings.General.VlcLocation)) + { + path = Path.Combine(Configuration.Settings.General.VlcLocation, fileName); + if (File.Exists(path)) + { + return path; + } + } + } + catch + { + // ignored + } + } + + if (!string.IsNullOrEmpty(Configuration.Settings.General.VlcLocationRelative)) + { + try + { + path = Configuration.Settings.General.VlcLocationRelative; + if (path.EndsWith(".exe", StringComparison.OrdinalIgnoreCase)) + { + path = Path.GetDirectoryName(path); + } + + if (path != null) + { + path = Path.Combine(path, fileName); + var fullPath = Path.GetFullPath(path); + if (File.Exists(fullPath)) + { + return fullPath; + } + + while (path.StartsWith("..", StringComparison.Ordinal)) + { + path = path.Remove(0, 3); + fullPath = Path.GetFullPath(path); + if (File.Exists(fullPath)) + { + return fullPath; + } + } + } + } + catch + { + // ignored + } + } + + // XP via registry path + path = RegistryUtil.GetValue(@"SOFTWARE\VideoLAN\VLC", "InstallDir"); + if (path != null && Directory.Exists(path)) + { + path = Path.Combine(path, fileName); + } + + if (File.Exists(path)) + { + return path; + } + + // Windows 7 via registry path + path = RegistryUtil.GetValue(@"SOFTWARE\Wow6432Node\VideoLAN\VLC", "InstallDir"); + if (path != null && Directory.Exists(path)) + { + path = Path.Combine(path, fileName); + } + + if (File.Exists(path)) + { + return path; + } + + path = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86); + if (!string.IsNullOrEmpty(path)) + { + var p = Path.Combine(path, "VideoLAN", "VLC", fileName); + if (File.Exists(p)) + { + return p; + } + + p = Path.Combine(path, "VLC", fileName); + if (File.Exists(p)) + { + return p; + } + } + + path = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles); + if (!string.IsNullOrEmpty(path)) + { + var p = Path.Combine(path, "VideoLAN", "VLC", fileName); + if (File.Exists(p)) + { + return p; + } + + p = Path.Combine(path, "VLC", fileName); + if (File.Exists(p)) + { + return p; + } + } + + path = Path.Combine(@"C:\Program Files (x86)\VideoLAN\VLC", fileName); + if (File.Exists(path)) + { + return path; + } + + path = Path.Combine(@"C:\Program Files\VideoLAN\VLC", fileName); + if (File.Exists(path)) + { + return path; + } + + path = Path.Combine(@"C:\Program Files (x86)\VLC", fileName); + if (File.Exists(path)) + { + return path; + } + + path = Path.Combine(@"C:\Program Files\VLC", fileName); + if (File.Exists(path)) + { + return path; + } + } + + return null; + } + + public bool InitializeAndStartFrameGrabbing(string videoFileName, + UInt32 width, UInt32 height, + LockCallbackDelegate @lock, + UnlockCallbackDelegate unlock, + DisplayCallbackDelegate display, + IntPtr opaque) + { + string dllFile = GetVlcPath("libvlc.dll"); + if (!File.Exists(dllFile) || string.IsNullOrEmpty(videoFileName)) + { + return false; + } + + var dir = Path.GetDirectoryName(dllFile); + if (dir != null) + { + Directory.SetCurrentDirectory(dir); + } + + _libVlcDll = NativeMethods.CrossLoadLibrary(dllFile); + LoadLibVlcDynamic(); + string[] initParameters = { "--no-skip-frames" }; + _libVlc = _libvlc_new(initParameters.Length, initParameters); + IntPtr media = _libvlc_media_new_path(_libVlc, Encoding.UTF8.GetBytes(videoFileName + "\0")); + _mediaPlayer = _libvlc_media_player_new_from_media(media); + _libvlc_media_release(media); + _libvlc_video_set_format(_mediaPlayer, "RV24", width, height, 3 * width); + _libvlc_video_set_callbacks(_mediaPlayer, @lock, unlock, display, opaque); + _libvlc_audio_set_volume(_mediaPlayer, 0); + _libvlc_media_player_set_rate(_mediaPlayer, 9f); + return true; + } + + public override void Initialize(Control ownerControl, string videoFileName, EventHandler onVideoLoaded, EventHandler onVideoEnded) + { + _ownerControl = ownerControl; + if (ownerControl != null) + { + _parentForm = ownerControl.FindForm(); + } + + var dllFile = "libvlc.so"; + if (Configuration.IsRunningOnWindows) + { + dllFile = GetVlcPath("libvlc.dll"); + if (File.Exists(dllFile)) + { + var dir = Path.GetDirectoryName(dllFile); + if (dir != null) + { + Directory.SetCurrentDirectory(dir); + } + } + } + + try + { + _libVlcDll = NativeMethods.CrossLoadLibrary(dllFile); + } + catch (Exception exception) + { + SeLogger.Error(exception, $"Unable to load '{dllFile}' (also check libc.so.6 + libdl.so.2)"); + } + + try + { + if (_libVlcDll == IntPtr.Zero && Configuration.IsRunningOnLinux) + { + for (int i = 4; i < 20; i++) + { + if (_libVlcDll == IntPtr.Zero) + { + dllFile = $"libvlc.so.{i}"; + _libVlcDll = NativeMethods.CrossLoadLibrary(dllFile); + } + } + + if (_libVlcDll == IntPtr.Zero) + { + foreach (var fileName in Directory.GetFiles("/usr/lib/x86_64-linux-gnu", "libvlc.so.?")) + { + if (_libVlcDll == IntPtr.Zero) + { + dllFile = fileName; + _libVlcDll = NativeMethods.CrossLoadLibrary(dllFile); + } + } + } + } + } + catch + { + // ignore + } + + if (_libVlcDll == IntPtr.Zero) + { + SeLogger.Error($"Unable to load '{dllFile}' (also check libc.so.6 + libdl.so.2)"); + return; + } + LoadLibVlcDynamic(); + + OnVideoLoaded = onVideoLoaded; + OnVideoEnded = onVideoEnded; + + if (!string.IsNullOrEmpty(videoFileName)) + { + string[] initParameters = { "--no-sub-autodetect-file" }; // , "--ffmpeg-hw" }; //, "--no-video-title-show" }; // TODO: Put in options/config file + _libVlc = _libvlc_new(initParameters.Length, initParameters); + var media = _libvlc_media_new_path(_libVlc, Encoding.UTF8.GetBytes(videoFileName + "\0")); + _mediaPlayer = _libvlc_media_player_new_from_media(media); + _libvlc_media_release(media); + + // Linux: libvlc_media_player_set_xdrawable (_mediaPlayer, xdrawable); + // Mac: libvlc_media_player_set_nsobject (_mediaPlayer, view); + + if (ownerControl != null) + { + SetDrawableHandle(_mediaPlayer, ownerControl); + } + + if (onVideoEnded != null) + { + _videoEndTimer = new Timer { Interval = 500 }; + _videoEndTimer.Tick += VideoEndTimerTick; + _videoEndTimer.Start(); + } + + _libvlc_media_player_play(_mediaPlayer); + _videoLoadedTimer = new Timer { Interval = 100 }; + _videoLoadedTimer.Tick += VideoLoadedTimer_Tick; + _videoLoadedTimer.Start(); + + _mouseTimer = new Timer { Interval = 25 }; + _mouseTimer.Tick += MouseTimerTick; + _mouseTimer.Start(); + } + } + + private void SetDrawableHandle(IntPtr mediaPlayer, Control ownerControl) + { + if (Configuration.IsRunningOnWindows) + { + _libvlc_media_player_set_hwnd(mediaPlayer, ownerControl.Handle); // windows + + //hack: sometimes vlc opens in it's own windows - this code seems to prevent this + for (int j = 0; j < 50; j++) + { + System.Threading.Thread.Sleep(10); + Application.DoEvents(); + } + + _libvlc_media_player_set_hwnd(mediaPlayer, ownerControl.Handle); // windows + } + else + { + _libvlc_media_player_set_xwindow(mediaPlayer, ownerControl.Handle); // linux + } + } + + public static bool IsLeftMouseButtonDown() + { + if (Configuration.IsRunningOnWindows) + { + const int KEY_PRESSED = 0x8000; + const int VK_LBUTTON = 0x1; + return Convert.ToBoolean(NativeMethods.GetKeyState(VK_LBUTTON) & KEY_PRESSED); + } + return false; + } + + private void MouseTimerTick(object sender, EventArgs e) + { + if (_mouseTimer == null) + { + return; + } + + _mouseTimer.Stop(); + + if (!(_parentForm is Main mainForm) || !mainForm.IsMenuOpen) + { + if (_parentForm != null && _ownerControl != null && _ownerControl.Visible && _parentForm.ContainsFocus && IsLeftMouseButtonDown()) + { + var p = _ownerControl.PointToClient(Control.MousePosition); + if (p.X > 0 && p.X < _ownerControl.Width && p.Y > 0 && p.Y < _ownerControl.Height) + { + if (IsPlaying) + { + Pause(); + } + else + { + Play(); + } + + int i = 0; + while (IsLeftMouseButtonDown() && i < 200) + { + System.Threading.Thread.Sleep(2); + Application.DoEvents(); + i++; + } + } + } + } + + _mouseTimer?.Start(); + } + + private void VideoEndTimerTick(object sender, EventArgs e) + { + lock (DisposeLock) + { + if (_mediaPlayer == IntPtr.Zero) + { + return; + } + + const int ended = 6; + int state = _libvlc_media_player_get_state(_mediaPlayer); + if (state != ended) + { + return; + } + + // hack to make sure VLC is in ready state + Stop(); + Play(); + Pause(); + OnVideoEnded?.Invoke(_mediaPlayer, new EventArgs()); + } + } + + public override void DisposeVideoPlayer() + { + Dispose(); + } + + public override event EventHandler OnVideoLoaded; + + public override event EventHandler OnVideoEnded; + + private void ReleaseUnmanagedResources() + { + try + { + lock (DisposeLock) + { + if (_mediaPlayer != IntPtr.Zero) + { + _libvlc_media_player_stop(_mediaPlayer); + WaitUntilReady(); + _libvlc_media_player_release(_mediaPlayer); // CRASHES in visual sync / point sync? + _mediaPlayer = IntPtr.Zero; + } + + if (_parentForm is Main) + { + if (_libvlc_release != null && _libVlc != IntPtr.Zero) + { + _libvlc_release(_libVlc); // CRASHES in visual sync / point sync? + _libVlc = IntPtr.Zero; + } + + if (_libVlcDll != IntPtr.Zero) + { + NativeMethods.CrossFreeLibrary(_libVlcDll); // CRASHES in visual sync / point sync? + _libVlcDll = IntPtr.Zero; + } + } + } + } + catch + { + // ignored + } + } + + ~LibVlcDynamic() + { + Dispose(false); + } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + if (_videoLoadedTimer != null) + { + _videoLoadedTimer.Stop(); + _videoLoadedTimer.Dispose(); + _videoLoadedTimer = null; + } + if (_videoEndTimer != null) + { + _videoEndTimer.Stop(); + _videoEndTimer.Dispose(); + _videoEndTimer = null; + } + if (_mouseTimer != null) + { + _mouseTimer.Dispose(); + _mouseTimer = null; + } + Application.DoEvents(); + } + ReleaseUnmanagedResources(); + } + + } +} diff --git a/src/Logic/VideoPlayers/LibVlcMono.cs b/src/ui/Logic/VideoPlayers/LibVlcMono.cs similarity index 97% rename from src/Logic/VideoPlayers/LibVlcMono.cs rename to src/ui/Logic/VideoPlayers/LibVlcMono.cs index 843e32b03..0374c8166 100644 --- a/src/Logic/VideoPlayers/LibVlcMono.cs +++ b/src/ui/Logic/VideoPlayers/LibVlcMono.cs @@ -1,270 +1,270 @@ -using Nikse.SubtitleEdit.Core; -using System; -using System.Text; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Logic.VideoPlayers -{ - internal class LibVlcMono : VideoPlayer, IDisposable - { - private Timer _videoLoadedTimer; - private Timer _videoEndTimer; - private IntPtr _libVlcDLL; - private IntPtr _libVlc; - private IntPtr _mediaPlayer; - private Control _ownerControl; - private Form _parentForm; - - public override string PlayerName => "VLC Lib Mono"; - - public override int Volume - { - get => NativeMethods.libvlc_audio_get_volume(_mediaPlayer); - set => NativeMethods.libvlc_audio_set_volume(_mediaPlayer, value); - } - - public override double Duration => NativeMethods.libvlc_media_player_get_length(_mediaPlayer) / TimeCode.BaseUnit; - - public override double CurrentPosition - { - get => NativeMethods.libvlc_media_player_get_time(_mediaPlayer) / TimeCode.BaseUnit; - set => NativeMethods.libvlc_media_player_set_time(_mediaPlayer, (long)(value * TimeCode.BaseUnit)); - } - - public override double PlayRate - { - get => NativeMethods.libvlc_media_player_get_rate(_mediaPlayer); - set - { - if (value >= 0 && value <= 2.0) - { - NativeMethods.libvlc_media_player_set_rate(_mediaPlayer, (float)value); - } - } - } - - public override void Play() - { - NativeMethods.libvlc_media_player_play(_mediaPlayer); - } - - public override void Pause() - { - if (!IsPaused) - { - NativeMethods.libvlc_media_player_pause(_mediaPlayer); - } - } - - public override void Stop() - { - NativeMethods.libvlc_media_player_stop(_mediaPlayer); - } - - public override bool IsPaused - { - get - { - const int paused = 4; - int state = NativeMethods.libvlc_media_player_get_state(_mediaPlayer); - return state == paused; - } - } - - public override bool IsPlaying - { - get - { - const int playing = 3; - int state = NativeMethods.libvlc_media_player_get_state(_mediaPlayer); - return state == playing; - } - } - - public int AudioTrackCount => NativeMethods.libvlc_audio_get_track_count(_mediaPlayer) - 1; - - public int AudioTrackNumber - { - get => NativeMethods.libvlc_audio_get_track(_mediaPlayer) - 1; - set => NativeMethods.libvlc_audio_set_track(_mediaPlayer, value + 1); - } - - public LibVlcMono MakeSecondMediaPlayer(Control ownerControl, string videoFileName, EventHandler onVideoLoaded, EventHandler onVideoEnded) - { - LibVlcMono newVlc = new LibVlcMono - { - _libVlc = _libVlc, - _libVlcDLL = _libVlcDLL, - _ownerControl = ownerControl - }; - if (ownerControl != null) - { - newVlc._parentForm = ownerControl.FindForm(); - } - - newVlc.OnVideoLoaded = onVideoLoaded; - newVlc.OnVideoEnded = onVideoEnded; - - if (!string.IsNullOrEmpty(videoFileName)) - { - IntPtr media = NativeMethods.libvlc_media_new_path(_libVlc, Encoding.UTF8.GetBytes(videoFileName + "\0")); - newVlc._mediaPlayer = NativeMethods.libvlc_media_player_new_from_media(media); - NativeMethods.libvlc_media_release(media); - - // Linux: libvlc_media_player_set_xdrawable (_mediaPlayer, xdrawable); - // Mac: libvlc_media_player_set_nsobject (_mediaPlayer, view); - var ownerHandle = ownerControl == null ? IntPtr.Zero : ownerControl.Handle; - NativeMethods.libvlc_media_player_set_hwnd(newVlc._mediaPlayer, ownerHandle); // windows - - if (onVideoEnded != null) - { - newVlc._videoEndTimer = new Timer { Interval = 500 }; - newVlc._videoEndTimer.Tick += VideoEndTimerTick; - newVlc._videoEndTimer.Start(); - } - - NativeMethods.libvlc_media_player_play(newVlc._mediaPlayer); - newVlc._videoLoadedTimer = new Timer { Interval = 500 }; - newVlc._videoLoadedTimer.Tick += newVlc.VideoLoadedTimer_Tick; - newVlc._videoLoadedTimer.Start(); - } - return newVlc; - } - - private void VideoLoadedTimer_Tick(object sender, EventArgs e) - { - int i = 0; - while (!IsPlaying && i < 50) - { - System.Threading.Thread.Sleep(100); - i++; - } - NativeMethods.libvlc_media_player_pause(_mediaPlayer); - _videoLoadedTimer.Stop(); - - OnVideoLoaded?.Invoke(_mediaPlayer, new EventArgs()); - } - - public override void Initialize(Control ownerControl, string videoFileName, EventHandler onVideoLoaded, EventHandler onVideoEnded) - { - _ownerControl = ownerControl; - if (ownerControl != null) - { - _parentForm = ownerControl.FindForm(); - } - - OnVideoLoaded = onVideoLoaded; - OnVideoEnded = onVideoEnded; - - if (!string.IsNullOrEmpty(videoFileName)) - { - string[] initParameters = { "--no-sub-autodetect-file" }; //, "--no-video-title-show" }; // TODO: Put in options/config file - _libVlc = NativeMethods.libvlc_new(initParameters.Length, initParameters); - IntPtr media = NativeMethods.libvlc_media_new_path(_libVlc, Encoding.UTF8.GetBytes(videoFileName + "\0")); - _mediaPlayer = NativeMethods.libvlc_media_player_new_from_media(media); - NativeMethods.libvlc_media_release(media); - - // Linux: libvlc_media_player_set_xdrawable (_mediaPlayer, xdrawable); - // Mac: libvlc_media_player_set_nsobject (_mediaPlayer, view); - var ownerHandle = ownerControl == null ? IntPtr.Zero : ownerControl.Handle; - NativeMethods.libvlc_media_player_set_hwnd(_mediaPlayer, ownerHandle); // windows - - if (onVideoEnded != null) - { - _videoEndTimer = new Timer { Interval = 500 }; - _videoEndTimer.Tick += VideoEndTimerTick; - _videoEndTimer.Start(); - } - - NativeMethods.libvlc_media_player_play(_mediaPlayer); - _videoLoadedTimer = new Timer { Interval = 500 }; - _videoLoadedTimer.Tick += VideoLoadedTimer_Tick; - _videoLoadedTimer.Start(); - } - } - - private void VideoEndTimerTick(object sender, EventArgs e) - { - const int Ended = 6; - int state = NativeMethods.libvlc_media_player_get_state(_mediaPlayer); - if (state == Ended) - { - // hack to make sure VLC is in ready state - Stop(); - Play(); - Pause(); - OnVideoEnded.Invoke(_mediaPlayer, new EventArgs()); - } - } - - public override void DisposeVideoPlayer() - { - _videoLoadedTimer?.Stop(); - _videoEndTimer?.Stop(); - System.Threading.ThreadPool.QueueUserWorkItem(DisposeVLC, this); - } - - private void DisposeVLC(object player) - { - ReleaseUnmanagedResources(); - } - - public override event EventHandler OnVideoLoaded; - - public override event EventHandler OnVideoEnded; - - ~LibVlcMono() - { - Dispose(false); - } - - private void ReleaseUnmanagedResources() - { - try - { - if (_mediaPlayer != IntPtr.Zero) - { - NativeMethods.libvlc_media_player_stop(_mediaPlayer); - NativeMethods.libvlc_media_list_player_release(_mediaPlayer); - _mediaPlayer = IntPtr.Zero; - } - - if (_libVlc != IntPtr.Zero) - { - NativeMethods.libvlc_release(_libVlc); - _libVlc = IntPtr.Zero; - } - } - catch - { - // ignored - } - } - - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - if (disposing) - { - if (_videoLoadedTimer != null) - { - _videoLoadedTimer.Dispose(); - _videoLoadedTimer = null; - } - if (_videoEndTimer != null) - { - _videoEndTimer.Dispose(); - _videoEndTimer = null; - } - } - ReleaseUnmanagedResources(); - } - - } -} +using Nikse.SubtitleEdit.Core; +using System; +using System.Text; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Logic.VideoPlayers +{ + internal class LibVlcMono : VideoPlayer, IDisposable + { + private Timer _videoLoadedTimer; + private Timer _videoEndTimer; + private IntPtr _libVlcDLL; + private IntPtr _libVlc; + private IntPtr _mediaPlayer; + private Control _ownerControl; + private Form _parentForm; + + public override string PlayerName => "VLC Lib Mono"; + + public override int Volume + { + get => NativeMethods.libvlc_audio_get_volume(_mediaPlayer); + set => NativeMethods.libvlc_audio_set_volume(_mediaPlayer, value); + } + + public override double Duration => NativeMethods.libvlc_media_player_get_length(_mediaPlayer) / TimeCode.BaseUnit; + + public override double CurrentPosition + { + get => NativeMethods.libvlc_media_player_get_time(_mediaPlayer) / TimeCode.BaseUnit; + set => NativeMethods.libvlc_media_player_set_time(_mediaPlayer, (long)(value * TimeCode.BaseUnit)); + } + + public override double PlayRate + { + get => NativeMethods.libvlc_media_player_get_rate(_mediaPlayer); + set + { + if (value >= 0 && value <= 2.0) + { + NativeMethods.libvlc_media_player_set_rate(_mediaPlayer, (float)value); + } + } + } + + public override void Play() + { + NativeMethods.libvlc_media_player_play(_mediaPlayer); + } + + public override void Pause() + { + if (!IsPaused) + { + NativeMethods.libvlc_media_player_pause(_mediaPlayer); + } + } + + public override void Stop() + { + NativeMethods.libvlc_media_player_stop(_mediaPlayer); + } + + public override bool IsPaused + { + get + { + const int paused = 4; + int state = NativeMethods.libvlc_media_player_get_state(_mediaPlayer); + return state == paused; + } + } + + public override bool IsPlaying + { + get + { + const int playing = 3; + int state = NativeMethods.libvlc_media_player_get_state(_mediaPlayer); + return state == playing; + } + } + + public int AudioTrackCount => NativeMethods.libvlc_audio_get_track_count(_mediaPlayer) - 1; + + public int AudioTrackNumber + { + get => NativeMethods.libvlc_audio_get_track(_mediaPlayer) - 1; + set => NativeMethods.libvlc_audio_set_track(_mediaPlayer, value + 1); + } + + public LibVlcMono MakeSecondMediaPlayer(Control ownerControl, string videoFileName, EventHandler onVideoLoaded, EventHandler onVideoEnded) + { + LibVlcMono newVlc = new LibVlcMono + { + _libVlc = _libVlc, + _libVlcDLL = _libVlcDLL, + _ownerControl = ownerControl + }; + if (ownerControl != null) + { + newVlc._parentForm = ownerControl.FindForm(); + } + + newVlc.OnVideoLoaded = onVideoLoaded; + newVlc.OnVideoEnded = onVideoEnded; + + if (!string.IsNullOrEmpty(videoFileName)) + { + IntPtr media = NativeMethods.libvlc_media_new_path(_libVlc, Encoding.UTF8.GetBytes(videoFileName + "\0")); + newVlc._mediaPlayer = NativeMethods.libvlc_media_player_new_from_media(media); + NativeMethods.libvlc_media_release(media); + + // Linux: libvlc_media_player_set_xdrawable (_mediaPlayer, xdrawable); + // Mac: libvlc_media_player_set_nsobject (_mediaPlayer, view); + var ownerHandle = ownerControl == null ? IntPtr.Zero : ownerControl.Handle; + NativeMethods.libvlc_media_player_set_hwnd(newVlc._mediaPlayer, ownerHandle); // windows + + if (onVideoEnded != null) + { + newVlc._videoEndTimer = new Timer { Interval = 500 }; + newVlc._videoEndTimer.Tick += VideoEndTimerTick; + newVlc._videoEndTimer.Start(); + } + + NativeMethods.libvlc_media_player_play(newVlc._mediaPlayer); + newVlc._videoLoadedTimer = new Timer { Interval = 500 }; + newVlc._videoLoadedTimer.Tick += newVlc.VideoLoadedTimer_Tick; + newVlc._videoLoadedTimer.Start(); + } + return newVlc; + } + + private void VideoLoadedTimer_Tick(object sender, EventArgs e) + { + int i = 0; + while (!IsPlaying && i < 50) + { + System.Threading.Thread.Sleep(100); + i++; + } + NativeMethods.libvlc_media_player_pause(_mediaPlayer); + _videoLoadedTimer.Stop(); + + OnVideoLoaded?.Invoke(_mediaPlayer, new EventArgs()); + } + + public override void Initialize(Control ownerControl, string videoFileName, EventHandler onVideoLoaded, EventHandler onVideoEnded) + { + _ownerControl = ownerControl; + if (ownerControl != null) + { + _parentForm = ownerControl.FindForm(); + } + + OnVideoLoaded = onVideoLoaded; + OnVideoEnded = onVideoEnded; + + if (!string.IsNullOrEmpty(videoFileName)) + { + string[] initParameters = { "--no-sub-autodetect-file" }; //, "--no-video-title-show" }; // TODO: Put in options/config file + _libVlc = NativeMethods.libvlc_new(initParameters.Length, initParameters); + IntPtr media = NativeMethods.libvlc_media_new_path(_libVlc, Encoding.UTF8.GetBytes(videoFileName + "\0")); + _mediaPlayer = NativeMethods.libvlc_media_player_new_from_media(media); + NativeMethods.libvlc_media_release(media); + + // Linux: libvlc_media_player_set_xdrawable (_mediaPlayer, xdrawable); + // Mac: libvlc_media_player_set_nsobject (_mediaPlayer, view); + var ownerHandle = ownerControl == null ? IntPtr.Zero : ownerControl.Handle; + NativeMethods.libvlc_media_player_set_hwnd(_mediaPlayer, ownerHandle); // windows + + if (onVideoEnded != null) + { + _videoEndTimer = new Timer { Interval = 500 }; + _videoEndTimer.Tick += VideoEndTimerTick; + _videoEndTimer.Start(); + } + + NativeMethods.libvlc_media_player_play(_mediaPlayer); + _videoLoadedTimer = new Timer { Interval = 500 }; + _videoLoadedTimer.Tick += VideoLoadedTimer_Tick; + _videoLoadedTimer.Start(); + } + } + + private void VideoEndTimerTick(object sender, EventArgs e) + { + const int Ended = 6; + int state = NativeMethods.libvlc_media_player_get_state(_mediaPlayer); + if (state == Ended) + { + // hack to make sure VLC is in ready state + Stop(); + Play(); + Pause(); + OnVideoEnded.Invoke(_mediaPlayer, new EventArgs()); + } + } + + public override void DisposeVideoPlayer() + { + _videoLoadedTimer?.Stop(); + _videoEndTimer?.Stop(); + System.Threading.ThreadPool.QueueUserWorkItem(DisposeVLC, this); + } + + private void DisposeVLC(object player) + { + ReleaseUnmanagedResources(); + } + + public override event EventHandler OnVideoLoaded; + + public override event EventHandler OnVideoEnded; + + ~LibVlcMono() + { + Dispose(false); + } + + private void ReleaseUnmanagedResources() + { + try + { + if (_mediaPlayer != IntPtr.Zero) + { + NativeMethods.libvlc_media_player_stop(_mediaPlayer); + NativeMethods.libvlc_media_list_player_release(_mediaPlayer); + _mediaPlayer = IntPtr.Zero; + } + + if (_libVlc != IntPtr.Zero) + { + NativeMethods.libvlc_release(_libVlc); + _libVlc = IntPtr.Zero; + } + } + catch + { + // ignored + } + } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + if (_videoLoadedTimer != null) + { + _videoLoadedTimer.Dispose(); + _videoLoadedTimer = null; + } + if (_videoEndTimer != null) + { + _videoEndTimer.Dispose(); + _videoEndTimer = null; + } + } + ReleaseUnmanagedResources(); + } + + } +} diff --git a/src/Logic/VideoPlayers/MpcHC/MessageHandlerWindow.Designer.cs b/src/ui/Logic/VideoPlayers/MpcHC/MessageHandlerWindow.Designer.cs similarity index 100% rename from src/Logic/VideoPlayers/MpcHC/MessageHandlerWindow.Designer.cs rename to src/ui/Logic/VideoPlayers/MpcHC/MessageHandlerWindow.Designer.cs diff --git a/src/Logic/VideoPlayers/MpcHC/MessageHandlerWindow.cs b/src/ui/Logic/VideoPlayers/MpcHC/MessageHandlerWindow.cs similarity index 100% rename from src/Logic/VideoPlayers/MpcHC/MessageHandlerWindow.cs rename to src/ui/Logic/VideoPlayers/MpcHC/MessageHandlerWindow.cs diff --git a/src/ui/Logic/VideoPlayers/MpcHC/MessageHandlerWindow.resx b/src/ui/Logic/VideoPlayers/MpcHC/MessageHandlerWindow.resx new file mode 100644 index 000000000..1af7de150 --- /dev/null +++ b/src/ui/Logic/VideoPlayers/MpcHC/MessageHandlerWindow.resx @@ -0,0 +1,120 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> +</root> \ No newline at end of file diff --git a/src/Logic/VideoPlayers/MpcHC/MpcHc.cs b/src/ui/Logic/VideoPlayers/MpcHC/MpcHc.cs similarity index 97% rename from src/Logic/VideoPlayers/MpcHC/MpcHc.cs rename to src/ui/Logic/VideoPlayers/MpcHC/MpcHc.cs index 634adae60..1b1f76852 100644 --- a/src/Logic/VideoPlayers/MpcHC/MpcHc.cs +++ b/src/ui/Logic/VideoPlayers/MpcHC/MpcHc.cs @@ -1,541 +1,541 @@ -using Nikse.SubtitleEdit.Core; -using System; -using System.Collections; -using System.Diagnostics; -using System.Globalization; -using System.IO; -using System.Runtime.InteropServices; -using System.Text; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -namespace Nikse.SubtitleEdit.Logic.VideoPlayers.MpcHC -{ - public class MpcHc : VideoPlayer, IDisposable - { - private readonly object _locker = new object(); - - private const string ModePlay = "0"; - private const string ModePause = "1"; - private string _playMode = string.Empty; - private int _loaded; - private IntPtr _mpcHandle = IntPtr.Zero; - private IntPtr _videoHandle = IntPtr.Zero; - private IntPtr _videoPanelHandle = IntPtr.Zero; - private ProcessStartInfo _startInfo; - private Process _process; - private IntPtr _messageHandlerHandle = IntPtr.Zero; - private string _videoFileName; - private Timer _positionTimer; - private double _positionInSeconds; - private double _durationInSeconds; - private MessageHandlerWindow _form; - private int _initialWidth; - private int _initialHeight; - private Timer _hideMpcTimer = new Timer(); - private int _hideMpcTimerCount; - - public override string PlayerName => "MPC-HC"; - - private int _volume = 75; - - public override int Volume - { - get => _volume; - set - { - // MPC-HC moves from 0-100 in steps of 5 - for (int i = 0; i < 100; i += 5) - { - SendMpcMessage(MpcHcCommand.DecreaseVolume); - } - - for (_volume = 0; _volume < value; _volume += 5) - { - SendMpcMessage(MpcHcCommand.IncreaseVolume); - } - } - } - - public override double Duration => _durationInSeconds; - - public override double CurrentPosition - { - get => _positionInSeconds; - set => SendMpcMessage(MpcHcCommand.SetPosition, string.Format(CultureInfo.InvariantCulture, "{0:0.000}", value)); - } - - public override void Play() - { - _playMode = ModePlay; - SendMpcMessage(MpcHcCommand.Play); - } - - public override void Pause() - { - _playMode = ModePause; - SendMpcMessage(MpcHcCommand.Pause); - } - - public override void Stop() - { - SendMpcMessage(MpcHcCommand.Stop); - } - - public override bool IsPaused => _playMode == ModePause; - - public override bool IsPlaying => _playMode == ModePlay; - - public override void Initialize(Control ownerControl, string videoFileName, EventHandler onVideoLoaded, EventHandler onVideoEnded) - { - if (ownerControl == null) - { - return; - } - - VideoFileName = videoFileName; - OnVideoLoaded = onVideoLoaded; - OnVideoEnded = onVideoEnded; - - _initialWidth = ownerControl.Width; - _initialHeight = ownerControl.Height; - _form = new MessageHandlerWindow(); - _form.OnCopyData += OnCopyData; - _form.Show(); - _form.Hide(); - _videoPanelHandle = ownerControl.Handle; - _messageHandlerHandle = _form.Handle; - _videoFileName = videoFileName; - _startInfo = new ProcessStartInfo - { - FileName = GetMpcHcFileName(), - Arguments = "/new /minimized /slave " + _messageHandlerHandle - }; - _process = Process.Start(_startInfo); - _process?.WaitForInputIdle(); - - _positionTimer = new Timer { Interval = 100 }; - _positionTimer.Tick += PositionTimerTick; - } - - private void PositionTimerTick(object sender, EventArgs e) - { - SendMpcMessage(MpcHcCommand.GetCurrentPosition); - } - - private void OnCopyData(object sender, EventArgs e) - { - var message = (Message)sender; - var cds = (NativeMethods.CopyDataStruct)Marshal.PtrToStructure(message.LParam, typeof(NativeMethods.CopyDataStruct)); - var command = cds.dwData.ToUInt32(); - var param = Marshal.PtrToStringAuto(cds.lpData); - var multiParam = new string[0]; - if (param != null) - { - multiParam = param.Split('|'); - } - - switch (command) - { - case MpcHcCommand.Connect: - _positionTimer.Stop(); - _mpcHandle = (IntPtr)Convert.ToInt64(Marshal.PtrToStringAuto(cds.lpData)); - SendMpcMessage(MpcHcCommand.OpenFile, _videoFileName); - _positionTimer.Start(); - break; - case MpcHcCommand.PlayMode: - _playMode = param; - if (param == ModePlay && _loaded == 0) - { - _loaded = 1; - if (!HijackMpcHc()) - { - Application.DoEvents(); - HijackMpcHc(); - } - } - Application.DoEvents(); - HideMpcPlayerWindow(); - break; - case MpcHcCommand.NowPlaying: - if (_loaded == 1) - { - _loaded = 2; - - _durationInSeconds = 5000; - if (multiParam.Length >= 5 && double.TryParse(multiParam[4].Replace(",", ".").Trim(), NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var d)) - { - _durationInSeconds = d; - } - else if (multiParam.Length >= 1 && double.TryParse(multiParam[multiParam.Length - 1].Replace(",", ".").Trim(), NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out d)) - { - _durationInSeconds = d; - } - - Pause(); - Resize(_initialWidth, _initialHeight); - OnVideoLoaded?.Invoke(this, new EventArgs()); - - SendMpcMessage(MpcHcCommand.SetSubtitleTrack, "-1"); - - // be sure to hide MPC - _hideMpcTimerCount = 20; - _hideMpcTimer.Interval = 100; - _hideMpcTimer.Tick += (o, args) => - { - _hideMpcTimer.Stop(); - if (_hideMpcTimerCount > 0) - { - Application.DoEvents(); - HideMpcPlayerWindow(); - _hideMpcTimerCount--; - _hideMpcTimer.Start(); - } - }; - _hideMpcTimer.Start(); - } - break; - case MpcHcCommand.NotifyEndOfStream: - OnVideoEnded?.Invoke(this, new EventArgs()); - - break; - case MpcHcCommand.CurrentPosition: - if (!string.IsNullOrWhiteSpace(param)) - { - if (double.TryParse(param.Replace(",", "."), NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var d)) - { - _positionInSeconds = d; - } - } - break; - } - } - - private void HideMpcPlayerWindow() - { - NativeMethods.ShowWindow(_process.MainWindowHandle, NativeMethods.ShowWindowCommands.Hide); - NativeMethods.SetWindowPos(_process.MainWindowHandle, (IntPtr)NativeMethods.SpecialWindowHandles.HWND_TOP, -9999, -9999, 0, 0, NativeMethods.SetWindowPosFlags.SWP_NOACTIVATE); - } - - internal static bool GetWindowHandle(IntPtr windowHandle, ArrayList windowHandles) - { - windowHandles.Add(windowHandle); - return true; - } - - private ArrayList GetChildWindows() - { - var windowHandles = new ArrayList(); - NativeMethods.EnumedWindow callBackPtr = GetWindowHandle; - NativeMethods.EnumChildWindows(_process.MainWindowHandle, callBackPtr, windowHandles); - return windowHandles; - } - - private static bool IsWindowMpcHcVideo(IntPtr hWnd) - { - var className = new StringBuilder(256); - int returnCode = NativeMethods.GetClassName(hWnd, className, className.Capacity); // Get the window class name - if (returnCode != 0) - { - return className.ToString().EndsWith(":b:0000000000010003:0000000000000006:0000000000000000") || // MPC-HC 64-bit video class??? - className.ToString().EndsWith(":b:00010003:00000006:00000000"); // MPC-HC 32-bit video class??? - } - - return false; - } - - private bool HijackMpcHc() - { - IntPtr handle = _process.MainWindowHandle; - var handles = GetChildWindows(); - foreach (var h in handles) - { - if (IsWindowMpcHcVideo((IntPtr)h)) - { - _videoHandle = (IntPtr)h; - NativeMethods.SetParent((IntPtr)h, _videoPanelHandle); - NativeMethods.SetWindowPos(handle, (IntPtr)NativeMethods.SpecialWindowHandles.HWND_TOP, -9999, -9999, 0, 0, NativeMethods.SetWindowPosFlags.SWP_NOACTIVATE); - return true; - } - } - return false; - } - - public override void Resize(int width, int height) - { - if (_process == null || _videoHandle == IntPtr.Zero) - { - return; - } - - NativeMethods.ShowWindow(_process.MainWindowHandle, NativeMethods.ShowWindowCommands.ShowNoActivate); - NativeMethods.SetWindowPos(_videoHandle, (IntPtr)NativeMethods.SpecialWindowHandles.HWND_TOP, 0, 0, width, height, NativeMethods.SetWindowPosFlags.SWP_NOREPOSITION); - HideMpcPlayerWindow(); - } - - public static string GetMpcHcFileName() - { - return GetMpcHcFileName("_nvo") ?? GetMpcHcFileName(string.Empty); - } - - private static string GetMpcHcFileName(string fileNameSuffix) - { - if (!Configuration.IsRunningOnWindows) //short circuit on Linux to resolve issues with read-only filesystems - { - return null; - } - if (IntPtr.Size == 8) // 64-bit - { - var fileName = $"mpc-hc64{fileNameSuffix}.exe"; - var path = Path.Combine(Configuration.BaseDirectory, "MPC-HC", fileName); - if (File.Exists(path)) - { - return path; - } - - if (!string.IsNullOrEmpty(Configuration.Settings.General.MpcHcLocation)) - { - path = Configuration.Settings.General.MpcHcLocation; - if (File.Exists(path) && path.EndsWith(fileName, StringComparison.OrdinalIgnoreCase)) - { - return path; - } - - if (Directory.Exists(Configuration.Settings.General.MpcHcLocation)) - { - path = Path.Combine(Configuration.Settings.General.MpcHcLocation, fileName); - if (File.Exists(path)) - { - return path; - } - - path = Path.Combine(Configuration.Settings.General.MpcHcLocation, "MPC-HC", fileName); - if (File.Exists(path)) - { - return path; - } - } - } - - path = RegistryUtil.GetValue(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{2ACBF1FA-F5C3-4B19-A774-B22A31F231B9}_is1", "InstallLocation"); - if (path != null) - { - path = Path.Combine(path, fileName); - if (File.Exists(path)) - { - return path; - } - } - - path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "MPC-HC", fileName); - if (File.Exists(path)) - { - return path; - } - - path = $@"C:\Program Files\MPC-HC\{fileName}"; - if (File.Exists(path)) - { - return path; - } - - path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), $@"K-Lite Codec Pack\MPC-HC\{fileName}"); - if (File.Exists(path)) - { - return path; - } - - path = $@"C:\Program Files (x86)\K-Lite Codec Pack\MPC-HC64\{fileName}"; - if (File.Exists(path)) - { - return path; - } - - path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), $@"K-Lite Codec Pack\MPC-HC64\{fileName}"); - if (File.Exists(path)) - { - return path; - } - - path = $@"C:\Program Files (x86)\MPC-HC\{fileName}"; - if (File.Exists(path)) - { - return path; - } - } - else // 32-bit - { - var fileName = $"mpc-hc{fileNameSuffix}.exe"; - var path = Path.Combine(Configuration.BaseDirectory, "MPC-HC", fileName); - if (File.Exists(path)) - { - return path; - } - - if (!string.IsNullOrEmpty(Configuration.Settings.General.MpcHcLocation)) - { - path = Configuration.Settings.General.MpcHcLocation; - if (File.Exists(path) && path.EndsWith(fileName, StringComparison.OrdinalIgnoreCase)) - { - return path; - } - - if (Directory.Exists(Configuration.Settings.General.MpcHcLocation)) - { - path = Path.Combine(Configuration.Settings.General.MpcHcLocation, fileName); - if (File.Exists(path)) - { - return path; - } - - path = Path.Combine(Configuration.Settings.General.MpcHcLocation, "MPC-HC", fileName); - if (File.Exists(path)) - { - return path; - } - } - } - - path = RegistryUtil.GetValue(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{2624B969-7135-4EB1-B0F6-2D8C397B45F7}_is1", "InstallLocation"); - if (path != null) - { - path = Path.Combine(path, fileName); - if (File.Exists(path)) - { - return path; - } - } - - path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "MPC-HC", fileName); - if (File.Exists(path)) - { - return path; - } - - path = $@"C:\Program Files (x86)\MPC-HC\{fileName}"; - if (File.Exists(path)) - { - return path; - } - - path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), $@"K-Lite Codec Pack\MPC-HC\{fileName}"); - if (File.Exists(path)) - { - return path; - } - - path = $@"C:\Program Files\MPC-HC\{fileName}"; - if (File.Exists(path)) - { - return path; - } - } - - return null; - } - - public static bool IsInstalled => true; - - public override void DisposeVideoPlayer() - { - Dispose(); - } - - public override event EventHandler OnVideoLoaded; - - public override event EventHandler OnVideoEnded; - - private void ReleaseUnmanagedResources() - { - try - { - lock (_locker) - { - if (_mpcHandle != IntPtr.Zero) - { - SendMpcMessage(MpcHcCommand.CloseApplication); - _mpcHandle = IntPtr.Zero; - } - } - } - catch - { - // ignored - } - } - - ~MpcHc() - { - Dispose(false); - } - - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - try - { - if (disposing) - { - // release managed resources - if (_positionTimer != null) - { - _positionTimer.Stop(); - _positionTimer.Dispose(); - _positionTimer = null; - } - if (_hideMpcTimer != null) - { - _hideMpcTimer.Stop(); - _hideMpcTimer.Dispose(); - _hideMpcTimer = null; - } - - if (_form != null) - { - _form.OnCopyData -= OnCopyData; - //_form.Dispose(); this gives an error when doing File -> Exit... - _form = null; - } - - if (_process != null) - { - _process.Dispose(); - _process = null; - } - _startInfo = null; - } - ReleaseUnmanagedResources(); - } - catch (Exception exception) - { - MessageBox.Show(exception.Message); - } - } - - private void SendMpcMessage(uint command) - { - SendMpcMessage(command, string.Empty); - } - - private void SendMpcMessage(uint command, string parameter) - { - if (_mpcHandle == IntPtr.Zero || _messageHandlerHandle == IntPtr.Zero) - { - return; - } - - parameter += (char)0; - NativeMethods.CopyDataStruct cds; - cds.dwData = (UIntPtr)command; - cds.cbData = parameter.Length * Marshal.SystemDefaultCharSize; - cds.lpData = Marshal.StringToCoTaskMemAuto(parameter); - NativeMethods.SendMessage(_mpcHandle, NativeMethods.WindowsMessageCopyData, _messageHandlerHandle, ref cds); - } - - } -} +using Nikse.SubtitleEdit.Core; +using System; +using System.Collections; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +namespace Nikse.SubtitleEdit.Logic.VideoPlayers.MpcHC +{ + public class MpcHc : VideoPlayer, IDisposable + { + private readonly object _locker = new object(); + + private const string ModePlay = "0"; + private const string ModePause = "1"; + private string _playMode = string.Empty; + private int _loaded; + private IntPtr _mpcHandle = IntPtr.Zero; + private IntPtr _videoHandle = IntPtr.Zero; + private IntPtr _videoPanelHandle = IntPtr.Zero; + private ProcessStartInfo _startInfo; + private Process _process; + private IntPtr _messageHandlerHandle = IntPtr.Zero; + private string _videoFileName; + private Timer _positionTimer; + private double _positionInSeconds; + private double _durationInSeconds; + private MessageHandlerWindow _form; + private int _initialWidth; + private int _initialHeight; + private Timer _hideMpcTimer = new Timer(); + private int _hideMpcTimerCount; + + public override string PlayerName => "MPC-HC"; + + private int _volume = 75; + + public override int Volume + { + get => _volume; + set + { + // MPC-HC moves from 0-100 in steps of 5 + for (int i = 0; i < 100; i += 5) + { + SendMpcMessage(MpcHcCommand.DecreaseVolume); + } + + for (_volume = 0; _volume < value; _volume += 5) + { + SendMpcMessage(MpcHcCommand.IncreaseVolume); + } + } + } + + public override double Duration => _durationInSeconds; + + public override double CurrentPosition + { + get => _positionInSeconds; + set => SendMpcMessage(MpcHcCommand.SetPosition, string.Format(CultureInfo.InvariantCulture, "{0:0.000}", value)); + } + + public override void Play() + { + _playMode = ModePlay; + SendMpcMessage(MpcHcCommand.Play); + } + + public override void Pause() + { + _playMode = ModePause; + SendMpcMessage(MpcHcCommand.Pause); + } + + public override void Stop() + { + SendMpcMessage(MpcHcCommand.Stop); + } + + public override bool IsPaused => _playMode == ModePause; + + public override bool IsPlaying => _playMode == ModePlay; + + public override void Initialize(Control ownerControl, string videoFileName, EventHandler onVideoLoaded, EventHandler onVideoEnded) + { + if (ownerControl == null) + { + return; + } + + VideoFileName = videoFileName; + OnVideoLoaded = onVideoLoaded; + OnVideoEnded = onVideoEnded; + + _initialWidth = ownerControl.Width; + _initialHeight = ownerControl.Height; + _form = new MessageHandlerWindow(); + _form.OnCopyData += OnCopyData; + _form.Show(); + _form.Hide(); + _videoPanelHandle = ownerControl.Handle; + _messageHandlerHandle = _form.Handle; + _videoFileName = videoFileName; + _startInfo = new ProcessStartInfo + { + FileName = GetMpcHcFileName(), + Arguments = "/new /minimized /slave " + _messageHandlerHandle + }; + _process = Process.Start(_startInfo); + _process?.WaitForInputIdle(); + + _positionTimer = new Timer { Interval = 100 }; + _positionTimer.Tick += PositionTimerTick; + } + + private void PositionTimerTick(object sender, EventArgs e) + { + SendMpcMessage(MpcHcCommand.GetCurrentPosition); + } + + private void OnCopyData(object sender, EventArgs e) + { + var message = (Message)sender; + var cds = (NativeMethods.CopyDataStruct)Marshal.PtrToStructure(message.LParam, typeof(NativeMethods.CopyDataStruct)); + var command = cds.dwData.ToUInt32(); + var param = Marshal.PtrToStringAuto(cds.lpData); + var multiParam = new string[0]; + if (param != null) + { + multiParam = param.Split('|'); + } + + switch (command) + { + case MpcHcCommand.Connect: + _positionTimer.Stop(); + _mpcHandle = (IntPtr)Convert.ToInt64(Marshal.PtrToStringAuto(cds.lpData)); + SendMpcMessage(MpcHcCommand.OpenFile, _videoFileName); + _positionTimer.Start(); + break; + case MpcHcCommand.PlayMode: + _playMode = param; + if (param == ModePlay && _loaded == 0) + { + _loaded = 1; + if (!HijackMpcHc()) + { + Application.DoEvents(); + HijackMpcHc(); + } + } + Application.DoEvents(); + HideMpcPlayerWindow(); + break; + case MpcHcCommand.NowPlaying: + if (_loaded == 1) + { + _loaded = 2; + + _durationInSeconds = 5000; + if (multiParam.Length >= 5 && double.TryParse(multiParam[4].Replace(",", ".").Trim(), NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var d)) + { + _durationInSeconds = d; + } + else if (multiParam.Length >= 1 && double.TryParse(multiParam[multiParam.Length - 1].Replace(",", ".").Trim(), NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out d)) + { + _durationInSeconds = d; + } + + Pause(); + Resize(_initialWidth, _initialHeight); + OnVideoLoaded?.Invoke(this, new EventArgs()); + + SendMpcMessage(MpcHcCommand.SetSubtitleTrack, "-1"); + + // be sure to hide MPC + _hideMpcTimerCount = 20; + _hideMpcTimer.Interval = 100; + _hideMpcTimer.Tick += (o, args) => + { + _hideMpcTimer.Stop(); + if (_hideMpcTimerCount > 0) + { + Application.DoEvents(); + HideMpcPlayerWindow(); + _hideMpcTimerCount--; + _hideMpcTimer.Start(); + } + }; + _hideMpcTimer.Start(); + } + break; + case MpcHcCommand.NotifyEndOfStream: + OnVideoEnded?.Invoke(this, new EventArgs()); + + break; + case MpcHcCommand.CurrentPosition: + if (!string.IsNullOrWhiteSpace(param)) + { + if (double.TryParse(param.Replace(",", "."), NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var d)) + { + _positionInSeconds = d; + } + } + break; + } + } + + private void HideMpcPlayerWindow() + { + NativeMethods.ShowWindow(_process.MainWindowHandle, NativeMethods.ShowWindowCommands.Hide); + NativeMethods.SetWindowPos(_process.MainWindowHandle, (IntPtr)NativeMethods.SpecialWindowHandles.HWND_TOP, -9999, -9999, 0, 0, NativeMethods.SetWindowPosFlags.SWP_NOACTIVATE); + } + + internal static bool GetWindowHandle(IntPtr windowHandle, ArrayList windowHandles) + { + windowHandles.Add(windowHandle); + return true; + } + + private ArrayList GetChildWindows() + { + var windowHandles = new ArrayList(); + NativeMethods.EnumedWindow callBackPtr = GetWindowHandle; + NativeMethods.EnumChildWindows(_process.MainWindowHandle, callBackPtr, windowHandles); + return windowHandles; + } + + private static bool IsWindowMpcHcVideo(IntPtr hWnd) + { + var className = new StringBuilder(256); + int returnCode = NativeMethods.GetClassName(hWnd, className, className.Capacity); // Get the window class name + if (returnCode != 0) + { + return className.ToString().EndsWith(":b:0000000000010003:0000000000000006:0000000000000000") || // MPC-HC 64-bit video class??? + className.ToString().EndsWith(":b:00010003:00000006:00000000"); // MPC-HC 32-bit video class??? + } + + return false; + } + + private bool HijackMpcHc() + { + IntPtr handle = _process.MainWindowHandle; + var handles = GetChildWindows(); + foreach (var h in handles) + { + if (IsWindowMpcHcVideo((IntPtr)h)) + { + _videoHandle = (IntPtr)h; + NativeMethods.SetParent((IntPtr)h, _videoPanelHandle); + NativeMethods.SetWindowPos(handle, (IntPtr)NativeMethods.SpecialWindowHandles.HWND_TOP, -9999, -9999, 0, 0, NativeMethods.SetWindowPosFlags.SWP_NOACTIVATE); + return true; + } + } + return false; + } + + public override void Resize(int width, int height) + { + if (_process == null || _videoHandle == IntPtr.Zero) + { + return; + } + + NativeMethods.ShowWindow(_process.MainWindowHandle, NativeMethods.ShowWindowCommands.ShowNoActivate); + NativeMethods.SetWindowPos(_videoHandle, (IntPtr)NativeMethods.SpecialWindowHandles.HWND_TOP, 0, 0, width, height, NativeMethods.SetWindowPosFlags.SWP_NOREPOSITION); + HideMpcPlayerWindow(); + } + + public static string GetMpcHcFileName() + { + return GetMpcHcFileName("_nvo") ?? GetMpcHcFileName(string.Empty); + } + + private static string GetMpcHcFileName(string fileNameSuffix) + { + if (!Configuration.IsRunningOnWindows) //short circuit on Linux to resolve issues with read-only filesystems + { + return null; + } + if (IntPtr.Size == 8) // 64-bit + { + var fileName = $"mpc-hc64{fileNameSuffix}.exe"; + var path = Path.Combine(Configuration.BaseDirectory, "MPC-HC", fileName); + if (File.Exists(path)) + { + return path; + } + + if (!string.IsNullOrEmpty(Configuration.Settings.General.MpcHcLocation)) + { + path = Configuration.Settings.General.MpcHcLocation; + if (File.Exists(path) && path.EndsWith(fileName, StringComparison.OrdinalIgnoreCase)) + { + return path; + } + + if (Directory.Exists(Configuration.Settings.General.MpcHcLocation)) + { + path = Path.Combine(Configuration.Settings.General.MpcHcLocation, fileName); + if (File.Exists(path)) + { + return path; + } + + path = Path.Combine(Configuration.Settings.General.MpcHcLocation, "MPC-HC", fileName); + if (File.Exists(path)) + { + return path; + } + } + } + + path = RegistryUtil.GetValue(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{2ACBF1FA-F5C3-4B19-A774-B22A31F231B9}_is1", "InstallLocation"); + if (path != null) + { + path = Path.Combine(path, fileName); + if (File.Exists(path)) + { + return path; + } + } + + path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "MPC-HC", fileName); + if (File.Exists(path)) + { + return path; + } + + path = $@"C:\Program Files\MPC-HC\{fileName}"; + if (File.Exists(path)) + { + return path; + } + + path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), $@"K-Lite Codec Pack\MPC-HC\{fileName}"); + if (File.Exists(path)) + { + return path; + } + + path = $@"C:\Program Files (x86)\K-Lite Codec Pack\MPC-HC64\{fileName}"; + if (File.Exists(path)) + { + return path; + } + + path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), $@"K-Lite Codec Pack\MPC-HC64\{fileName}"); + if (File.Exists(path)) + { + return path; + } + + path = $@"C:\Program Files (x86)\MPC-HC\{fileName}"; + if (File.Exists(path)) + { + return path; + } + } + else // 32-bit + { + var fileName = $"mpc-hc{fileNameSuffix}.exe"; + var path = Path.Combine(Configuration.BaseDirectory, "MPC-HC", fileName); + if (File.Exists(path)) + { + return path; + } + + if (!string.IsNullOrEmpty(Configuration.Settings.General.MpcHcLocation)) + { + path = Configuration.Settings.General.MpcHcLocation; + if (File.Exists(path) && path.EndsWith(fileName, StringComparison.OrdinalIgnoreCase)) + { + return path; + } + + if (Directory.Exists(Configuration.Settings.General.MpcHcLocation)) + { + path = Path.Combine(Configuration.Settings.General.MpcHcLocation, fileName); + if (File.Exists(path)) + { + return path; + } + + path = Path.Combine(Configuration.Settings.General.MpcHcLocation, "MPC-HC", fileName); + if (File.Exists(path)) + { + return path; + } + } + } + + path = RegistryUtil.GetValue(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{2624B969-7135-4EB1-B0F6-2D8C397B45F7}_is1", "InstallLocation"); + if (path != null) + { + path = Path.Combine(path, fileName); + if (File.Exists(path)) + { + return path; + } + } + + path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "MPC-HC", fileName); + if (File.Exists(path)) + { + return path; + } + + path = $@"C:\Program Files (x86)\MPC-HC\{fileName}"; + if (File.Exists(path)) + { + return path; + } + + path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), $@"K-Lite Codec Pack\MPC-HC\{fileName}"); + if (File.Exists(path)) + { + return path; + } + + path = $@"C:\Program Files\MPC-HC\{fileName}"; + if (File.Exists(path)) + { + return path; + } + } + + return null; + } + + public static bool IsInstalled => true; + + public override void DisposeVideoPlayer() + { + Dispose(); + } + + public override event EventHandler OnVideoLoaded; + + public override event EventHandler OnVideoEnded; + + private void ReleaseUnmanagedResources() + { + try + { + lock (_locker) + { + if (_mpcHandle != IntPtr.Zero) + { + SendMpcMessage(MpcHcCommand.CloseApplication); + _mpcHandle = IntPtr.Zero; + } + } + } + catch + { + // ignored + } + } + + ~MpcHc() + { + Dispose(false); + } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + try + { + if (disposing) + { + // release managed resources + if (_positionTimer != null) + { + _positionTimer.Stop(); + _positionTimer.Dispose(); + _positionTimer = null; + } + if (_hideMpcTimer != null) + { + _hideMpcTimer.Stop(); + _hideMpcTimer.Dispose(); + _hideMpcTimer = null; + } + + if (_form != null) + { + _form.OnCopyData -= OnCopyData; + //_form.Dispose(); this gives an error when doing File -> Exit... + _form = null; + } + + if (_process != null) + { + _process.Dispose(); + _process = null; + } + _startInfo = null; + } + ReleaseUnmanagedResources(); + } + catch (Exception exception) + { + MessageBox.Show(exception.Message); + } + } + + private void SendMpcMessage(uint command) + { + SendMpcMessage(command, string.Empty); + } + + private void SendMpcMessage(uint command, string parameter) + { + if (_mpcHandle == IntPtr.Zero || _messageHandlerHandle == IntPtr.Zero) + { + return; + } + + parameter += (char)0; + NativeMethods.CopyDataStruct cds; + cds.dwData = (UIntPtr)command; + cds.cbData = parameter.Length * Marshal.SystemDefaultCharSize; + cds.lpData = Marshal.StringToCoTaskMemAuto(parameter); + NativeMethods.SendMessage(_mpcHandle, NativeMethods.WindowsMessageCopyData, _messageHandlerHandle, ref cds); + } + + } +} diff --git a/src/Logic/VideoPlayers/MpcHC/MpcHcCommand.cs b/src/ui/Logic/VideoPlayers/MpcHC/MpcHcCommand.cs similarity index 100% rename from src/Logic/VideoPlayers/MpcHC/MpcHcCommand.cs rename to src/ui/Logic/VideoPlayers/MpcHC/MpcHcCommand.cs diff --git a/src/Logic/VideoPlayers/MpcHC/NativeMethods.cs b/src/ui/Logic/VideoPlayers/MpcHC/NativeMethods.cs similarity index 100% rename from src/Logic/VideoPlayers/MpcHC/NativeMethods.cs rename to src/ui/Logic/VideoPlayers/MpcHC/NativeMethods.cs diff --git a/src/Logic/VideoPlayers/QuartsPlayer.cs b/src/ui/Logic/VideoPlayers/QuartsPlayer.cs similarity index 96% rename from src/Logic/VideoPlayers/QuartsPlayer.cs rename to src/ui/Logic/VideoPlayers/QuartsPlayer.cs index 3e68238cc..8ea041190 100644 --- a/src/Logic/VideoPlayers/QuartsPlayer.cs +++ b/src/ui/Logic/VideoPlayers/QuartsPlayer.cs @@ -1,373 +1,373 @@ -using Nikse.SubtitleEdit.Core; -using QuartzTypeLib; -using System; -using System.ComponentModel; -using System.Linq; -using System.Runtime.InteropServices; -using System.Windows.Forms; -using Nikse.SubtitleEdit.Core.Common; - -//https://docs.microsoft.com/en-us/windows/win32/directshow/directshow -//https://docs.microsoft.com/en-us/previous-versions//dd387928(v=vs.85) - -namespace Nikse.SubtitleEdit.Logic.VideoPlayers -{ - public class QuartsPlayer : VideoPlayer, IDisposable - { - public override event EventHandler OnVideoLoaded; - public override event EventHandler OnVideoEnded; - - private IVideoWindow _quartzVideo; - private FilgraphManager _quartzFilgraphManager; - private IMediaPosition _mediaPosition; - private bool _isPaused; - private Control _owner; - private Timer _videoEndTimer; - private BackgroundWorker _videoLoader; - private int _sourceWidth; - private int _sourceHeight; - - public override string PlayerName => "DirectShow"; - - /// <summary> - /// In DirectX -10000 is silent and 0 is full volume. - /// Also, -3500 to 0 seems to be all you can hear! Not much use for -3500 to -9999... - /// </summary> - public override int Volume - { - get - { - try - { - return ((IBasicAudio)_quartzFilgraphManager).Volume / 35 + 100; - } - catch - { - return 0; - } - } - set - { - try - { - if (value == 0) - { - ((IBasicAudio)_quartzFilgraphManager).Volume = -10000; - } - else - { - ((IBasicAudio)_quartzFilgraphManager).Volume = (value - 100) * 35; - } - } - catch - { - // ignored - } - } - } - - public override double Duration - { - get - { - try - { - return _mediaPosition.Duration; - } - catch - { - return 0; - } - } - } - - public override double CurrentPosition - { - get - { - try - { - return _mediaPosition.CurrentPosition; - } - catch - { - return 0; - } - } - set - { - if (value >= 0 && value <= Duration) - { - _mediaPosition.CurrentPosition = value; - } - } - } - - public override double PlayRate - { - get => _mediaPosition.Rate; - set - { - if (value >= 0 && value <= 2.0) - { - _mediaPosition.Rate = value; - } - } - } - - public override void Play() - { - _quartzFilgraphManager.Run(); - _isPaused = false; - } - - public override void Pause() - { - _quartzFilgraphManager.Pause(); - _isPaused = true; - } - - public override void Stop() - { - _quartzFilgraphManager.Stop(); - _isPaused = true; - } - - public override bool IsPaused => _isPaused; - - public override bool IsPlaying => !IsPaused; - - public override void Initialize(Control ownerControl, string videoFileName, EventHandler onVideoLoaded, EventHandler onVideoEnded) - { - const int wsChild = 0x40000000; - - string ext = System.IO.Path.GetExtension(videoFileName)?.ToLowerInvariant(); - bool isAudio = Utilities.AudioFileExtensions.Contains(ext); - - OnVideoLoaded = onVideoLoaded; - OnVideoEnded = onVideoEnded; - - VideoFileName = videoFileName; - _owner = ownerControl; - - try - { - // Hack for windows 10... ??? - if (!isAudio && Configuration.Settings.General.DirectShowDoubleLoad) - { - var quartzFilterGraphManager = new FilgraphManager(); - quartzFilterGraphManager.RenderFile(VideoFileName); - var quartzVideo = quartzFilterGraphManager as IVideoWindow; - quartzVideo.Visible = 0; - quartzVideo.Owner = (int)IntPtr.Zero; - } - } - catch - { - // ignore errors - } - - _quartzFilgraphManager = new FilgraphManager(); - _quartzFilgraphManager.RenderFile(VideoFileName); - - if (!isAudio) - { - _quartzVideo = _quartzFilgraphManager as IVideoWindow; - _quartzVideo.Owner = (int)ownerControl.Handle; - _quartzVideo.SetWindowPosition(0, 0, ownerControl.Width, ownerControl.Height); - _quartzVideo.WindowStyle = wsChild; - } - - if (!isAudio) - { - ((IBasicVideo)_quartzFilgraphManager).GetVideoSize(out _sourceWidth, out _sourceHeight); - } - - _owner.Resize += OwnerControlResize; - _mediaPosition = (IMediaPosition)_quartzFilgraphManager; - if (OnVideoLoaded != null) - { - _videoLoader = new BackgroundWorker(); - _videoLoader.RunWorkerCompleted += VideoLoaderRunWorkerCompleted; - _videoLoader.DoWork += VideoLoaderDoWork; - _videoLoader.RunWorkerAsync(); - } - - OwnerControlResize(this, null); - _videoEndTimer = new Timer { Interval = 500 }; - _videoEndTimer.Tick += VideoEndTimerTick; - _videoEndTimer.Start(); - - if (!isAudio) - { - _quartzVideo.MessageDrain = (int)ownerControl.Handle; - } - } - - public static VideoInfo GetVideoInfo(string videoFileName) - { - var info = new VideoInfo { Success = false }; - - try - { - var quartzFilgraphManager = new FilgraphManager(); - quartzFilgraphManager.RenderFile(videoFileName); - ((IBasicVideo)quartzFilgraphManager).GetVideoSize(out var width, out var height); - - info.Width = width; - info.Height = height; - var basicVideo2 = (IBasicVideo2)quartzFilgraphManager; - if (basicVideo2.AvgTimePerFrame > 0) - { - info.FramesPerSecond = 1 / basicVideo2.AvgTimePerFrame; - } - - info.Success = true; - var iMediaPosition = (quartzFilgraphManager as IMediaPosition); - info.TotalMilliseconds = iMediaPosition.Duration * 1000; - info.TotalSeconds = iMediaPosition.Duration; - info.TotalFrames = info.TotalSeconds * info.FramesPerSecond; - info.VideoCodec = string.Empty; // TODO: Get real codec names from quartzFilgraphManager.FilterCollection; - - Marshal.ReleaseComObject(quartzFilgraphManager); - } - catch - { - // ignored - } - - return info; - } - - private void VideoLoaderDoWork(object sender, DoWorkEventArgs e) - { - Application.DoEvents(); - } - - private void VideoLoaderRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) - { - if (OnVideoLoaded != null) - { - try - { - OnVideoLoaded.Invoke(_quartzFilgraphManager, new EventArgs()); - } - catch - { - // ignored - } - } - _videoEndTimer = null; - } - - private void VideoEndTimerTick(object sender, EventArgs e) - { - if (_isPaused == false && _quartzFilgraphManager != null && CurrentPosition >= Duration) - { - _isPaused = true; - if (OnVideoEnded != null && _quartzFilgraphManager != null) - { - OnVideoEnded.Invoke(_quartzFilgraphManager, new EventArgs()); - } - } - } - - private void OwnerControlResize(object sender, EventArgs e) - { - if (_quartzVideo == null) - { - return; - } - - try - { - // calc new scaled size with correct aspect ratio - float factorX = _owner.Width / (float)_sourceWidth; - float factorY = _owner.Height / (float)_sourceHeight; - - if (factorX > factorY) - { - _quartzVideo.Width = (int)(_sourceWidth * factorY); - _quartzVideo.Height = (int)(_sourceHeight * factorY); - } - else - { - _quartzVideo.Width = (int)(_sourceWidth * factorX); - _quartzVideo.Height = (int)(_sourceHeight * factorX); - } - - _quartzVideo.Left = (_owner.Width - _quartzVideo.Width) / 2; - _quartzVideo.Top = (_owner.Height - _quartzVideo.Height) / 2; - } - catch - { - // ignored - } - } - - public override void DisposeVideoPlayer() - { - System.Threading.ThreadPool.QueueUserWorkItem(DisposeQuarts, _quartzFilgraphManager); - } - - private void DisposeQuarts(object player) - { - Dispose(); - } - - private void ReleaseUnmanagedResources() - { - try - { - if (_quartzVideo != null) - { - _quartzVideo.Owner = -1; - } - } - catch - { - // ignored - } - - if (_quartzFilgraphManager != null) - { - try - { - _quartzFilgraphManager.Stop(); - Marshal.ReleaseComObject(_quartzFilgraphManager); - _quartzFilgraphManager = null; - } - catch - { - // ignored - } - } - _quartzVideo = null; - } - - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - if (disposing) - { - if (_videoEndTimer != null) - { - _videoEndTimer.Dispose(); - _videoEndTimer = null; - } - if (_videoLoader != null) - { - _videoLoader.Dispose(); - _videoLoader = null; - } - } - ReleaseUnmanagedResources(); - } - - } -} +using Nikse.SubtitleEdit.Core; +using QuartzTypeLib; +using System; +using System.ComponentModel; +using System.Linq; +using System.Runtime.InteropServices; +using System.Windows.Forms; +using Nikse.SubtitleEdit.Core.Common; + +//https://docs.microsoft.com/en-us/windows/win32/directshow/directshow +//https://docs.microsoft.com/en-us/previous-versions//dd387928(v=vs.85) + +namespace Nikse.SubtitleEdit.Logic.VideoPlayers +{ + public class QuartsPlayer : VideoPlayer, IDisposable + { + public override event EventHandler OnVideoLoaded; + public override event EventHandler OnVideoEnded; + + private IVideoWindow _quartzVideo; + private FilgraphManager _quartzFilgraphManager; + private IMediaPosition _mediaPosition; + private bool _isPaused; + private Control _owner; + private Timer _videoEndTimer; + private BackgroundWorker _videoLoader; + private int _sourceWidth; + private int _sourceHeight; + + public override string PlayerName => "DirectShow"; + + /// <summary> + /// In DirectX -10000 is silent and 0 is full volume. + /// Also, -3500 to 0 seems to be all you can hear! Not much use for -3500 to -9999... + /// </summary> + public override int Volume + { + get + { + try + { + return ((IBasicAudio)_quartzFilgraphManager).Volume / 35 + 100; + } + catch + { + return 0; + } + } + set + { + try + { + if (value == 0) + { + ((IBasicAudio)_quartzFilgraphManager).Volume = -10000; + } + else + { + ((IBasicAudio)_quartzFilgraphManager).Volume = (value - 100) * 35; + } + } + catch + { + // ignored + } + } + } + + public override double Duration + { + get + { + try + { + return _mediaPosition.Duration; + } + catch + { + return 0; + } + } + } + + public override double CurrentPosition + { + get + { + try + { + return _mediaPosition.CurrentPosition; + } + catch + { + return 0; + } + } + set + { + if (value >= 0 && value <= Duration) + { + _mediaPosition.CurrentPosition = value; + } + } + } + + public override double PlayRate + { + get => _mediaPosition.Rate; + set + { + if (value >= 0 && value <= 2.0) + { + _mediaPosition.Rate = value; + } + } + } + + public override void Play() + { + _quartzFilgraphManager.Run(); + _isPaused = false; + } + + public override void Pause() + { + _quartzFilgraphManager.Pause(); + _isPaused = true; + } + + public override void Stop() + { + _quartzFilgraphManager.Stop(); + _isPaused = true; + } + + public override bool IsPaused => _isPaused; + + public override bool IsPlaying => !IsPaused; + + public override void Initialize(Control ownerControl, string videoFileName, EventHandler onVideoLoaded, EventHandler onVideoEnded) + { + const int wsChild = 0x40000000; + + string ext = System.IO.Path.GetExtension(videoFileName)?.ToLowerInvariant(); + bool isAudio = Utilities.AudioFileExtensions.Contains(ext); + + OnVideoLoaded = onVideoLoaded; + OnVideoEnded = onVideoEnded; + + VideoFileName = videoFileName; + _owner = ownerControl; + + try + { + // Hack for windows 10... ??? + if (!isAudio && Configuration.Settings.General.DirectShowDoubleLoad) + { + var quartzFilterGraphManager = new FilgraphManager(); + quartzFilterGraphManager.RenderFile(VideoFileName); + var quartzVideo = quartzFilterGraphManager as IVideoWindow; + quartzVideo.Visible = 0; + quartzVideo.Owner = (int)IntPtr.Zero; + } + } + catch + { + // ignore errors + } + + _quartzFilgraphManager = new FilgraphManager(); + _quartzFilgraphManager.RenderFile(VideoFileName); + + if (!isAudio) + { + _quartzVideo = _quartzFilgraphManager as IVideoWindow; + _quartzVideo.Owner = (int)ownerControl.Handle; + _quartzVideo.SetWindowPosition(0, 0, ownerControl.Width, ownerControl.Height); + _quartzVideo.WindowStyle = wsChild; + } + + if (!isAudio) + { + ((IBasicVideo)_quartzFilgraphManager).GetVideoSize(out _sourceWidth, out _sourceHeight); + } + + _owner.Resize += OwnerControlResize; + _mediaPosition = (IMediaPosition)_quartzFilgraphManager; + if (OnVideoLoaded != null) + { + _videoLoader = new BackgroundWorker(); + _videoLoader.RunWorkerCompleted += VideoLoaderRunWorkerCompleted; + _videoLoader.DoWork += VideoLoaderDoWork; + _videoLoader.RunWorkerAsync(); + } + + OwnerControlResize(this, null); + _videoEndTimer = new Timer { Interval = 500 }; + _videoEndTimer.Tick += VideoEndTimerTick; + _videoEndTimer.Start(); + + if (!isAudio) + { + _quartzVideo.MessageDrain = (int)ownerControl.Handle; + } + } + + public static VideoInfo GetVideoInfo(string videoFileName) + { + var info = new VideoInfo { Success = false }; + + try + { + var quartzFilgraphManager = new FilgraphManager(); + quartzFilgraphManager.RenderFile(videoFileName); + ((IBasicVideo)quartzFilgraphManager).GetVideoSize(out var width, out var height); + + info.Width = width; + info.Height = height; + var basicVideo2 = (IBasicVideo2)quartzFilgraphManager; + if (basicVideo2.AvgTimePerFrame > 0) + { + info.FramesPerSecond = 1 / basicVideo2.AvgTimePerFrame; + } + + info.Success = true; + var iMediaPosition = (quartzFilgraphManager as IMediaPosition); + info.TotalMilliseconds = iMediaPosition.Duration * 1000; + info.TotalSeconds = iMediaPosition.Duration; + info.TotalFrames = info.TotalSeconds * info.FramesPerSecond; + info.VideoCodec = string.Empty; // TODO: Get real codec names from quartzFilgraphManager.FilterCollection; + + Marshal.ReleaseComObject(quartzFilgraphManager); + } + catch + { + // ignored + } + + return info; + } + + private void VideoLoaderDoWork(object sender, DoWorkEventArgs e) + { + Application.DoEvents(); + } + + private void VideoLoaderRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) + { + if (OnVideoLoaded != null) + { + try + { + OnVideoLoaded.Invoke(_quartzFilgraphManager, new EventArgs()); + } + catch + { + // ignored + } + } + _videoEndTimer = null; + } + + private void VideoEndTimerTick(object sender, EventArgs e) + { + if (_isPaused == false && _quartzFilgraphManager != null && CurrentPosition >= Duration) + { + _isPaused = true; + if (OnVideoEnded != null && _quartzFilgraphManager != null) + { + OnVideoEnded.Invoke(_quartzFilgraphManager, new EventArgs()); + } + } + } + + private void OwnerControlResize(object sender, EventArgs e) + { + if (_quartzVideo == null) + { + return; + } + + try + { + // calc new scaled size with correct aspect ratio + float factorX = _owner.Width / (float)_sourceWidth; + float factorY = _owner.Height / (float)_sourceHeight; + + if (factorX > factorY) + { + _quartzVideo.Width = (int)(_sourceWidth * factorY); + _quartzVideo.Height = (int)(_sourceHeight * factorY); + } + else + { + _quartzVideo.Width = (int)(_sourceWidth * factorX); + _quartzVideo.Height = (int)(_sourceHeight * factorX); + } + + _quartzVideo.Left = (_owner.Width - _quartzVideo.Width) / 2; + _quartzVideo.Top = (_owner.Height - _quartzVideo.Height) / 2; + } + catch + { + // ignored + } + } + + public override void DisposeVideoPlayer() + { + System.Threading.ThreadPool.QueueUserWorkItem(DisposeQuarts, _quartzFilgraphManager); + } + + private void DisposeQuarts(object player) + { + Dispose(); + } + + private void ReleaseUnmanagedResources() + { + try + { + if (_quartzVideo != null) + { + _quartzVideo.Owner = -1; + } + } + catch + { + // ignored + } + + if (_quartzFilgraphManager != null) + { + try + { + _quartzFilgraphManager.Stop(); + Marshal.ReleaseComObject(_quartzFilgraphManager); + _quartzFilgraphManager = null; + } + catch + { + // ignored + } + } + _quartzVideo = null; + } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + if (_videoEndTimer != null) + { + _videoEndTimer.Dispose(); + _videoEndTimer = null; + } + if (_videoLoader != null) + { + _videoLoader.Dispose(); + _videoLoader = null; + } + } + ReleaseUnmanagedResources(); + } + + } +} diff --git a/src/Logic/VideoPlayers/VideoPlayer.cs b/src/ui/Logic/VideoPlayers/VideoPlayer.cs similarity index 97% rename from src/Logic/VideoPlayers/VideoPlayer.cs rename to src/ui/Logic/VideoPlayers/VideoPlayer.cs index 58d370328..3c3946139 100644 --- a/src/Logic/VideoPlayers/VideoPlayer.cs +++ b/src/ui/Logic/VideoPlayers/VideoPlayer.cs @@ -1,32 +1,32 @@ -using System; -using System.Windows.Forms; - -namespace Nikse.SubtitleEdit.Logic.VideoPlayers -{ - public abstract class VideoPlayer - { - public abstract string PlayerName { get; } - public string VideoFileName { get; protected set; } - public abstract int Volume { get; set; } - public abstract double Duration { get; } - public abstract double CurrentPosition { get; set; } - - /// <summary> - /// 1.0 is normal playback speed, 0.5 is half speed, and 2.0 is twice speed. - /// </summary> - public virtual double PlayRate { get; set; } - - public abstract void Play(); - public abstract void Pause(); - public abstract void Stop(); - public abstract bool IsPaused { get; } - public abstract bool IsPlaying { get; } - public abstract void Initialize(Control ownerControl, string videoFileName, EventHandler onVideoLoaded, EventHandler onVideoEnded); - public abstract void DisposeVideoPlayer(); - public abstract event EventHandler OnVideoLoaded; - public abstract event EventHandler OnVideoEnded; - public virtual void Resize(int width, int height) - { - } - } -} +using System; +using System.Windows.Forms; + +namespace Nikse.SubtitleEdit.Logic.VideoPlayers +{ + public abstract class VideoPlayer + { + public abstract string PlayerName { get; } + public string VideoFileName { get; protected set; } + public abstract int Volume { get; set; } + public abstract double Duration { get; } + public abstract double CurrentPosition { get; set; } + + /// <summary> + /// 1.0 is normal playback speed, 0.5 is half speed, and 2.0 is twice speed. + /// </summary> + public virtual double PlayRate { get; set; } + + public abstract void Play(); + public abstract void Pause(); + public abstract void Stop(); + public abstract bool IsPaused { get; } + public abstract bool IsPlaying { get; } + public abstract void Initialize(Control ownerControl, string videoFileName, EventHandler onVideoLoaded, EventHandler onVideoEnded); + public abstract void DisposeVideoPlayer(); + public abstract event EventHandler OnVideoLoaded; + public abstract event EventHandler OnVideoEnded; + public virtual void Resize(int width, int height) + { + } + } +} diff --git a/src/Logic/WordSpellChecker.cs b/src/ui/Logic/WordSpellChecker.cs similarity index 97% rename from src/Logic/WordSpellChecker.cs rename to src/ui/Logic/WordSpellChecker.cs index 650587438..17b2771b0 100644 --- a/src/Logic/WordSpellChecker.cs +++ b/src/ui/Logic/WordSpellChecker.cs @@ -1,146 +1,146 @@ -using Nikse.SubtitleEdit.Forms; -using System; -using System.Reflection; -using System.Runtime.InteropServices; -using System.Windows.Forms; - -namespace Nikse.SubtitleEdit.Logic -{ - /// <summary> - /// Microsoft Word methods (late bound) for spell checking by Nikse - /// Mostly a bunch of hacks... - /// </summary> - internal class WordSpellChecker - { - private const int HWND_BOTTOM = 1; - - private const int SWP_NOACTIVATE = 0x0010; - private const short SWP_NOMOVE = 0X2; - private const short SWP_NOSIZE = 1; - private const short SWP_NOZORDER = 0X4; - private const int SWP_SHOWWINDOW = 0x0040; - - private const int wdWindowStateNormal = 0; - private const int wdWindowStateMaximize = 1; - private const int wdWindowStateMinimize = 2; - - private object _wordApplication; - private object _wordDocument; - private readonly Type _wordApplicationType; - private Type _wordDocumentType; - private readonly IntPtr _mainHandle; - private int _languageId = 1033; // English - - public WordSpellChecker(Main main, string languageId) - { - _mainHandle = main.Handle; - SetLanguageId(languageId); - - _wordApplicationType = Type.GetTypeFromProgID("Word.Application"); - _wordApplication = Activator.CreateInstance(_wordApplicationType); - - Application.DoEvents(); - _wordApplicationType.InvokeMember("WindowState", BindingFlags.SetProperty, null, _wordApplication, new object[] { wdWindowStateNormal }); - _wordApplicationType.InvokeMember("Top", BindingFlags.SetProperty, null, _wordApplication, new object[] { -5000 }); // hide window - it's a hack - Application.DoEvents(); - } - - private void SetLanguageId(string languageId) - { - try - { - var ci = System.Globalization.CultureInfo.GetCultureInfo(languageId); - _languageId = ci.LCID; - } - catch - { - _languageId = System.Globalization.CultureInfo.CurrentUICulture.LCID; - } - } - - public void NewDocument() - { - _wordDocumentType = Type.GetTypeFromProgID("Word.Document"); - _wordDocument = Activator.CreateInstance(_wordDocumentType); - } - - public void CloseDocument() - { - object saveChanges = false; - object p = Missing.Value; - _wordDocumentType.InvokeMember("Close", BindingFlags.InvokeMethod, null, _wordDocument, new object[] { saveChanges, p, p }); - } - - public string Version - { - get - { - object wordVersion = _wordApplicationType.InvokeMember("Version", BindingFlags.GetProperty, null, _wordApplication, null); - return wordVersion.ToString(); - } - } - - public void Quit() - { - object saveChanges = false; - object originalFormat = Missing.Value; - object routeDocument = Missing.Value; - _wordApplicationType.InvokeMember("Quit", BindingFlags.InvokeMethod, null, _wordApplication, new object[] { saveChanges, originalFormat, routeDocument }); - try - { - Marshal.ReleaseComObject(_wordDocument); - Marshal.ReleaseComObject(_wordApplication); - } - finally - { - _wordDocument = null; - _wordApplication = null; - } - } - - public string CheckSpelling(string text, out int errorsBefore, out int errorsAfter) - { - // insert text - object words = _wordDocumentType.InvokeMember("Words", BindingFlags.GetProperty, null, _wordDocument, null); - object range = words.GetType().InvokeMember("First", BindingFlags.GetProperty, null, words, null); - range.GetType().InvokeMember("InsertBefore", BindingFlags.InvokeMethod, null, range, new Object[] { text }); - - // set language... - range.GetType().InvokeMember("LanguageId", BindingFlags.SetProperty, null, range, new object[] { _languageId }); - - // spell check error count - object spellingErrors = _wordDocumentType.InvokeMember("SpellingErrors", BindingFlags.GetProperty, null, _wordDocument, null); - object spellingErrorsCount = spellingErrors.GetType().InvokeMember("Count", BindingFlags.GetProperty, null, spellingErrors, null); - errorsBefore = int.Parse(spellingErrorsCount.ToString()); - Marshal.ReleaseComObject(spellingErrors); - - // perform spell check - object p = Missing.Value; - if (errorsBefore > 0) - { - _wordApplicationType.InvokeMember("WindowState", BindingFlags.SetProperty, null, _wordApplication, new object[] { wdWindowStateNormal }); - _wordApplicationType.InvokeMember("Top", BindingFlags.SetProperty, null, _wordApplication, new object[] { -10000 }); // hide window - it's a hack - NativeMethods.SetWindowPos(_mainHandle, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); // make sure c# form is behind spell check dialog - _wordDocumentType.InvokeMember("CheckSpelling", BindingFlags.InvokeMethod, null, _wordDocument, new Object[] { p, p, p, p, p, p, p, p, p, p, p, p }); // 12 parameters - NativeMethods.SetWindowPos(_mainHandle, 0, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); // bring c# form to front again - _wordApplicationType.InvokeMember("Top", BindingFlags.SetProperty, null, _wordApplication, new object[] { -10000 }); // hide window - it's a hack - } - - // spell check error count - spellingErrors = _wordDocumentType.InvokeMember("SpellingErrors", BindingFlags.GetProperty, null, _wordDocument, null); - spellingErrorsCount = spellingErrors.GetType().InvokeMember("Count", BindingFlags.GetProperty, null, spellingErrors, null); - errorsAfter = int.Parse(spellingErrorsCount.ToString()); - Marshal.ReleaseComObject(spellingErrors); - - // Get spell check text - object resultText = range.GetType().InvokeMember("Text", BindingFlags.GetProperty, null, range, null); - range.GetType().InvokeMember("Delete", BindingFlags.InvokeMethod, null, range, null); - - Marshal.ReleaseComObject(words); - Marshal.ReleaseComObject(range); - - return resultText.ToString().TrimEnd(); // result needs a trimming at the end - } - - } -} +using Nikse.SubtitleEdit.Forms; +using System; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Windows.Forms; + +namespace Nikse.SubtitleEdit.Logic +{ + /// <summary> + /// Microsoft Word methods (late bound) for spell checking by Nikse + /// Mostly a bunch of hacks... + /// </summary> + internal class WordSpellChecker + { + private const int HWND_BOTTOM = 1; + + private const int SWP_NOACTIVATE = 0x0010; + private const short SWP_NOMOVE = 0X2; + private const short SWP_NOSIZE = 1; + private const short SWP_NOZORDER = 0X4; + private const int SWP_SHOWWINDOW = 0x0040; + + private const int wdWindowStateNormal = 0; + private const int wdWindowStateMaximize = 1; + private const int wdWindowStateMinimize = 2; + + private object _wordApplication; + private object _wordDocument; + private readonly Type _wordApplicationType; + private Type _wordDocumentType; + private readonly IntPtr _mainHandle; + private int _languageId = 1033; // English + + public WordSpellChecker(Main main, string languageId) + { + _mainHandle = main.Handle; + SetLanguageId(languageId); + + _wordApplicationType = Type.GetTypeFromProgID("Word.Application"); + _wordApplication = Activator.CreateInstance(_wordApplicationType); + + Application.DoEvents(); + _wordApplicationType.InvokeMember("WindowState", BindingFlags.SetProperty, null, _wordApplication, new object[] { wdWindowStateNormal }); + _wordApplicationType.InvokeMember("Top", BindingFlags.SetProperty, null, _wordApplication, new object[] { -5000 }); // hide window - it's a hack + Application.DoEvents(); + } + + private void SetLanguageId(string languageId) + { + try + { + var ci = System.Globalization.CultureInfo.GetCultureInfo(languageId); + _languageId = ci.LCID; + } + catch + { + _languageId = System.Globalization.CultureInfo.CurrentUICulture.LCID; + } + } + + public void NewDocument() + { + _wordDocumentType = Type.GetTypeFromProgID("Word.Document"); + _wordDocument = Activator.CreateInstance(_wordDocumentType); + } + + public void CloseDocument() + { + object saveChanges = false; + object p = Missing.Value; + _wordDocumentType.InvokeMember("Close", BindingFlags.InvokeMethod, null, _wordDocument, new object[] { saveChanges, p, p }); + } + + public string Version + { + get + { + object wordVersion = _wordApplicationType.InvokeMember("Version", BindingFlags.GetProperty, null, _wordApplication, null); + return wordVersion.ToString(); + } + } + + public void Quit() + { + object saveChanges = false; + object originalFormat = Missing.Value; + object routeDocument = Missing.Value; + _wordApplicationType.InvokeMember("Quit", BindingFlags.InvokeMethod, null, _wordApplication, new object[] { saveChanges, originalFormat, routeDocument }); + try + { + Marshal.ReleaseComObject(_wordDocument); + Marshal.ReleaseComObject(_wordApplication); + } + finally + { + _wordDocument = null; + _wordApplication = null; + } + } + + public string CheckSpelling(string text, out int errorsBefore, out int errorsAfter) + { + // insert text + object words = _wordDocumentType.InvokeMember("Words", BindingFlags.GetProperty, null, _wordDocument, null); + object range = words.GetType().InvokeMember("First", BindingFlags.GetProperty, null, words, null); + range.GetType().InvokeMember("InsertBefore", BindingFlags.InvokeMethod, null, range, new Object[] { text }); + + // set language... + range.GetType().InvokeMember("LanguageId", BindingFlags.SetProperty, null, range, new object[] { _languageId }); + + // spell check error count + object spellingErrors = _wordDocumentType.InvokeMember("SpellingErrors", BindingFlags.GetProperty, null, _wordDocument, null); + object spellingErrorsCount = spellingErrors.GetType().InvokeMember("Count", BindingFlags.GetProperty, null, spellingErrors, null); + errorsBefore = int.Parse(spellingErrorsCount.ToString()); + Marshal.ReleaseComObject(spellingErrors); + + // perform spell check + object p = Missing.Value; + if (errorsBefore > 0) + { + _wordApplicationType.InvokeMember("WindowState", BindingFlags.SetProperty, null, _wordApplication, new object[] { wdWindowStateNormal }); + _wordApplicationType.InvokeMember("Top", BindingFlags.SetProperty, null, _wordApplication, new object[] { -10000 }); // hide window - it's a hack + NativeMethods.SetWindowPos(_mainHandle, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); // make sure c# form is behind spell check dialog + _wordDocumentType.InvokeMember("CheckSpelling", BindingFlags.InvokeMethod, null, _wordDocument, new Object[] { p, p, p, p, p, p, p, p, p, p, p, p }); // 12 parameters + NativeMethods.SetWindowPos(_mainHandle, 0, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); // bring c# form to front again + _wordApplicationType.InvokeMember("Top", BindingFlags.SetProperty, null, _wordApplication, new object[] { -10000 }); // hide window - it's a hack + } + + // spell check error count + spellingErrors = _wordDocumentType.InvokeMember("SpellingErrors", BindingFlags.GetProperty, null, _wordDocument, null); + spellingErrorsCount = spellingErrors.GetType().InvokeMember("Count", BindingFlags.GetProperty, null, spellingErrors, null); + errorsAfter = int.Parse(spellingErrorsCount.ToString()); + Marshal.ReleaseComObject(spellingErrors); + + // Get spell check text + object resultText = range.GetType().InvokeMember("Text", BindingFlags.GetProperty, null, range, null); + range.GetType().InvokeMember("Delete", BindingFlags.InvokeMethod, null, range, null); + + Marshal.ReleaseComObject(words); + Marshal.ReleaseComObject(range); + + return resultText.ToString().TrimEnd(); // result needs a trimming at the end + } + + } +} diff --git a/src/Program.cs b/src/ui/Program.cs similarity index 97% rename from src/Program.cs rename to src/ui/Program.cs index 9451bfabb..501cc7684 100644 --- a/src/Program.cs +++ b/src/ui/Program.cs @@ -1,115 +1,115 @@ -using Nikse.SubtitleEdit.Forms; -using System; -using System.Diagnostics; -using System.Threading; -using System.Windows.Forms; - -namespace Nikse.SubtitleEdit -{ - internal static class Program - { - /// <summary> - /// The main entry point for the application. - /// </summary> - [STAThread] - private static void Main() - { -#if !DEBUG - // Add the event handler for handling UI thread exceptions to the event. - Application.ThreadException += Application_ThreadException; - - // Set the unhandled exception mode to force all Windows Forms errors to go through our handler. - Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); - - // Add the event handler for handling non-UI thread exceptions to the event. - AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; -#endif - - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new Main()); - } - - // Handle the UI exceptions by showing a dialog box, and asking the user whether or not they wish to abort execution. - private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e) - { - var exc = e.Exception; - // Ignore CultureNotFoundException to avoid error when changing language (on some computers) - see https://github.com/SubtitleEdit/subtitleedit/issues/719 - if (!(exc is System.Globalization.CultureNotFoundException)) - { - var dr = DialogResult.Abort; - try - { - var cap = "Windows Forms Thread Exception"; - var msg = "An application error occurred in Subtitle Edit " + GetVersion() + ". " + - "\nPlease report at https://github.com/SubtitleEdit/subtitleedit/issues with the following information:" + - "\n\nError Message:\n" + exc.Message + - "\n\nStack Trace:\n" + exc.StackTrace; - dr = MessageBox.Show(msg, cap, MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop, MessageBoxDefaultButton.Button1); - } - catch - { - } - if (dr == DialogResult.Abort) - { - Application.Exit(); - } - } - } - - private static string GetVersion() - { - try - { - return System.Reflection.Assembly.GetEntryAssembly().GetName().Version.ToString(); - } - catch - { - return string.Empty; - } - } - - // Handle the non-UI exceptions by logging the event to the ThreadException event log before - // the system default handler reports the exception to the user and terminates the application. - // NOTE: This exception handler cannot prevent the termination of the application. - private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) - { - try - { - var exc = e.ExceptionObject as Exception; - var msg = "A fatal non-UI error occurred in Subtitle Edit " + GetVersion() + "." + - "\nPlease report at https://github.com/SubtitleEdit/subtitleedit/issues with the following information:" + - "\n\nError Message:\n" + exc.Message + - "\n\nStack Trace:\n" + exc.StackTrace; - - // Since we can't prevent the app from terminating, log this to the event log. - if (!EventLog.SourceExists("ThreadException")) - { - EventLog.CreateEventSource("ThreadException", "Application"); - } - - // Create an EventLog instance and assign its source. - using (var eventLog = new EventLog { Source = "ThreadException" }) - { - eventLog.WriteEntry(msg); - } - } - catch (Exception ex) - { - try - { - var cap = "Non-UI Thread Exception"; - var msg = "A fatal non-UI error occurred in Subtitle Edit " + GetVersion() + "." + - "\nCould not write the error to the event log." + - "\nReason: " + ex.Message; - MessageBox.Show(msg, cap, MessageBoxButtons.OK, MessageBoxIcon.Stop); - } - finally - { - Application.Exit(); - } - } - } - - } -} +using Nikse.SubtitleEdit.Forms; +using System; +using System.Diagnostics; +using System.Threading; +using System.Windows.Forms; + +namespace Nikse.SubtitleEdit +{ + internal static class Program + { + /// <summary> + /// The main entry point for the application. + /// </summary> + [STAThread] + private static void Main() + { +#if !DEBUG + // Add the event handler for handling UI thread exceptions to the event. + Application.ThreadException += Application_ThreadException; + + // Set the unhandled exception mode to force all Windows Forms errors to go through our handler. + Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); + + // Add the event handler for handling non-UI thread exceptions to the event. + AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; +#endif + + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Main()); + } + + // Handle the UI exceptions by showing a dialog box, and asking the user whether or not they wish to abort execution. + private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e) + { + var exc = e.Exception; + // Ignore CultureNotFoundException to avoid error when changing language (on some computers) - see https://github.com/SubtitleEdit/subtitleedit/issues/719 + if (!(exc is System.Globalization.CultureNotFoundException)) + { + var dr = DialogResult.Abort; + try + { + var cap = "Windows Forms Thread Exception"; + var msg = "An application error occurred in Subtitle Edit " + GetVersion() + ". " + + "\nPlease report at https://github.com/SubtitleEdit/subtitleedit/issues with the following information:" + + "\n\nError Message:\n" + exc.Message + + "\n\nStack Trace:\n" + exc.StackTrace; + dr = MessageBox.Show(msg, cap, MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop, MessageBoxDefaultButton.Button1); + } + catch + { + } + if (dr == DialogResult.Abort) + { + Application.Exit(); + } + } + } + + private static string GetVersion() + { + try + { + return System.Reflection.Assembly.GetEntryAssembly().GetName().Version.ToString(); + } + catch + { + return string.Empty; + } + } + + // Handle the non-UI exceptions by logging the event to the ThreadException event log before + // the system default handler reports the exception to the user and terminates the application. + // NOTE: This exception handler cannot prevent the termination of the application. + private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) + { + try + { + var exc = e.ExceptionObject as Exception; + var msg = "A fatal non-UI error occurred in Subtitle Edit " + GetVersion() + "." + + "\nPlease report at https://github.com/SubtitleEdit/subtitleedit/issues with the following information:" + + "\n\nError Message:\n" + exc.Message + + "\n\nStack Trace:\n" + exc.StackTrace; + + // Since we can't prevent the app from terminating, log this to the event log. + if (!EventLog.SourceExists("ThreadException")) + { + EventLog.CreateEventSource("ThreadException", "Application"); + } + + // Create an EventLog instance and assign its source. + using (var eventLog = new EventLog { Source = "ThreadException" }) + { + eventLog.WriteEntry(msg); + } + } + catch (Exception ex) + { + try + { + var cap = "Non-UI Thread Exception"; + var msg = "A fatal non-UI error occurred in Subtitle Edit " + GetVersion() + "." + + "\nCould not write the error to the event log." + + "\nReason: " + ex.Message; + MessageBox.Show(msg, cap, MessageBoxButtons.OK, MessageBoxIcon.Stop); + } + finally + { + Application.Exit(); + } + } + } + + } +} diff --git a/src/ui/Properties/AssemblyInfo.cs b/src/ui/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..968f46738 --- /dev/null +++ b/src/ui/Properties/AssemblyInfo.cs @@ -0,0 +1,37 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Subtitle Edit")] +[assembly: AssemblyDescription("bc78b4e0e81bcd902c9ef942194599a51c4e2286")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Nikse")] +[assembly: AssemblyProduct("SubtitleEdit")] +[assembly: AssemblyCopyright("Copyright 2001-2020, Nikse")] +[assembly: AssemblyTrademark("Licensed under the GPL v3")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("8cb5792f-cd36-4dfb-b2fd-161e44be216d")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("3.5.18.95")] + +// Make the internal types available in our testing assembly. +[assembly: InternalsVisibleTo("Test")] \ No newline at end of file diff --git a/src/Properties/AssemblyInfo.cs.template b/src/ui/Properties/AssemblyInfo.cs.template similarity index 97% rename from src/Properties/AssemblyInfo.cs.template rename to src/ui/Properties/AssemblyInfo.cs.template index ae6e4a951..8e67d9757 100644 --- a/src/Properties/AssemblyInfo.cs.template +++ b/src/ui/Properties/AssemblyInfo.cs.template @@ -1,37 +1,37 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("Subtitle Edit")] -[assembly: AssemblyDescription("[GITHASH]")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Nikse")] -[assembly: AssemblyProduct("SubtitleEdit")] -[assembly: AssemblyCopyright("Copyright 2001-2020, Nikse")] -[assembly: AssemblyTrademark("Licensed under the GPL v3")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("8cb5792f-cd36-4dfb-b2fd-161e44be216d")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("3.5.18.[REVNO]")] - -// Make the internal types available in our testing assembly. +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Subtitle Edit")] +[assembly: AssemblyDescription("[GITHASH]")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Nikse")] +[assembly: AssemblyProduct("SubtitleEdit")] +[assembly: AssemblyCopyright("Copyright 2001-2020, Nikse")] +[assembly: AssemblyTrademark("Licensed under the GPL v3")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("8cb5792f-cd36-4dfb-b2fd-161e44be216d")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("3.5.18.[REVNO]")] + +// Make the internal types available in our testing assembly. [assembly: InternalsVisibleTo("Test")] \ No newline at end of file diff --git a/src/Properties/Resources.Designer.cs b/src/ui/Properties/Resources.Designer.cs similarity index 97% rename from src/Properties/Resources.Designer.cs rename to src/ui/Properties/Resources.Designer.cs index 6c816bca7..cdeeb68ba 100644 --- a/src/Properties/Resources.Designer.cs +++ b/src/ui/Properties/Resources.Designer.cs @@ -1,133 +1,133 @@ -//------------------------------------------------------------------------------ -// <auto-generated> -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// </auto-generated> -//------------------------------------------------------------------------------ - -namespace Nikse.SubtitleEdit.Properties { - using System; - - - /// <summary> - /// A strongly-typed resource class, for looking up localized strings, etc. - /// </summary> - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - public class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// <summary> - /// Returns the cached ResourceManager instance used by this class. - /// </summary> - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - public static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Nikse.SubtitleEdit.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// <summary> - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// </summary> - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - public static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// <summary> - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// </summary> - public static System.Drawing.Bitmap bookmark22 { - get { - object obj = ResourceManager.GetObject("bookmark22", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// <summary> - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// </summary> - public static System.Drawing.Bitmap connect { - get { - object obj = ResourceManager.GetObject("connect", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// <summary> - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// </summary> - public static System.Drawing.Bitmap Donate { - get { - object obj = ResourceManager.GetObject("Donate", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// <summary> - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// </summary> - public static System.Drawing.Bitmap Help { - get { - object obj = ResourceManager.GetObject("Help", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// <summary> - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// </summary> - public static System.Drawing.Bitmap Settings { - get { - object obj = ResourceManager.GetObject("Settings", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// <summary> - /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). - /// </summary> - public static System.Drawing.Icon SubtitleEditFormIcon { - get { - object obj = ResourceManager.GetObject("SubtitleEditFormIcon", resourceCulture); - return ((System.Drawing.Icon)(obj)); - } - } - - /// <summary> - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// </summary> - public static System.Drawing.Bitmap TransparentBackground { - get { - object obj = ResourceManager.GetObject("TransparentBackground", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - } -} +//------------------------------------------------------------------------------ +// <auto-generated> +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// </auto-generated> +//------------------------------------------------------------------------------ + +namespace Nikse.SubtitleEdit.Properties { + using System; + + + /// <summary> + /// A strongly-typed resource class, for looking up localized strings, etc. + /// </summary> + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + public class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// <summary> + /// Returns the cached ResourceManager instance used by this class. + /// </summary> + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Nikse.SubtitleEdit.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// <summary> + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// </summary> + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// <summary> + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// </summary> + public static System.Drawing.Bitmap bookmark22 { + get { + object obj = ResourceManager.GetObject("bookmark22", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// <summary> + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// </summary> + public static System.Drawing.Bitmap connect { + get { + object obj = ResourceManager.GetObject("connect", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// <summary> + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// </summary> + public static System.Drawing.Bitmap Donate { + get { + object obj = ResourceManager.GetObject("Donate", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// <summary> + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// </summary> + public static System.Drawing.Bitmap Help { + get { + object obj = ResourceManager.GetObject("Help", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// <summary> + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// </summary> + public static System.Drawing.Bitmap Settings { + get { + object obj = ResourceManager.GetObject("Settings", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// <summary> + /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). + /// </summary> + public static System.Drawing.Icon SubtitleEditFormIcon { + get { + object obj = ResourceManager.GetObject("SubtitleEditFormIcon", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// <summary> + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// </summary> + public static System.Drawing.Bitmap TransparentBackground { + get { + object obj = ResourceManager.GetObject("TransparentBackground", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/src/Properties/Resources.resx b/src/ui/Properties/Resources.resx similarity index 98% rename from src/Properties/Resources.resx rename to src/ui/Properties/Resources.resx index 6d7ee4a60..627480b2c 100644 --- a/src/Properties/Resources.resx +++ b/src/ui/Properties/Resources.resx @@ -1,142 +1,142 @@ -<?xml version="1.0" encoding="utf-8"?> -<root> - <!-- - Microsoft ResX Schema - - Version 2.0 - - The primary goals of this format is to allow a simple XML format - that is mostly human readable. The generation and parsing of the - various data types are done through the TypeConverter classes - associated with the data types. - - Example: - - ... ado.net/XML headers & schema ... - <resheader name="resmimetype">text/microsoft-resx</resheader> - <resheader name="version">2.0</resheader> - <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> - <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> - <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> - <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> - <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> - <value>[base64 mime encoded serialized .NET Framework object]</value> - </data> - <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> - <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> - <comment>This is a comment</comment> - </data> - - There are any number of "resheader" rows that contain simple - name/value pairs. - - Each data row contains a name, and value. The row also contains a - type or mimetype. Type corresponds to a .NET class that support - text/value conversion through the TypeConverter architecture. - Classes that don't support this are serialized and stored with the - mimetype set. - - The mimetype is used for serialized objects, and tells the - ResXResourceReader how to depersist the object. This is currently not - extensible. For a given mimetype the value must be set accordingly: - - Note - application/x-microsoft.net.object.binary.base64 is the format - that the ResXResourceWriter will generate, however the reader can - read any of the formats listed below. - - mimetype: application/x-microsoft.net.object.binary.base64 - value : The object must be serialized with - : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter - : and then encoded with base64 encoding. - - mimetype: application/x-microsoft.net.object.soap.base64 - value : The object must be serialized with - : System.Runtime.Serialization.Formatters.Soap.SoapFormatter - : and then encoded with base64 encoding. - - mimetype: application/x-microsoft.net.object.bytearray.base64 - value : The object must be serialized into a byte array - : using a System.ComponentModel.TypeConverter - : and then encoded with base64 encoding. - --> - <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> - <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> - <xsd:element name="root" msdata:IsDataSet="true"> - <xsd:complexType> - <xsd:choice maxOccurs="unbounded"> - <xsd:element name="metadata"> - <xsd:complexType> - <xsd:sequence> - <xsd:element name="value" type="xsd:string" minOccurs="0" /> - </xsd:sequence> - <xsd:attribute name="name" use="required" type="xsd:string" /> - <xsd:attribute name="type" type="xsd:string" /> - <xsd:attribute name="mimetype" type="xsd:string" /> - <xsd:attribute ref="xml:space" /> - </xsd:complexType> - </xsd:element> - <xsd:element name="assembly"> - <xsd:complexType> - <xsd:attribute name="alias" type="xsd:string" /> - <xsd:attribute name="name" type="xsd:string" /> - </xsd:complexType> - </xsd:element> - <xsd:element name="data"> - <xsd:complexType> - <xsd:sequence> - <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> - <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> - </xsd:sequence> - <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> - <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> - <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> - <xsd:attribute ref="xml:space" /> - </xsd:complexType> - </xsd:element> - <xsd:element name="resheader"> - <xsd:complexType> - <xsd:sequence> - <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> - </xsd:sequence> - <xsd:attribute name="name" type="xsd:string" use="required" /> - </xsd:complexType> - </xsd:element> - </xsd:choice> - </xsd:complexType> - </xsd:element> - </xsd:schema> - <resheader name="resmimetype"> - <value>text/microsoft-resx</value> - </resheader> - <resheader name="version"> - <value>2.0</value> - </resheader> - <resheader name="reader"> - <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> - </resheader> - <resheader name="writer"> - <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> - </resheader> - <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> - <data name="connect" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Icons\connect.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> - <data name="bookmark22" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\bookmark22.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> - <data name="SubtitleEditFormIcon" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Icons\SE.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> - <data name="TransparentBackground" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Resources\Transparent Background.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> - <data name="Help" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Icons\Help.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> - <data name="Donate" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Icons\Donate.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> - <data name="Settings" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Icons\Settings.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> + <data name="connect" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Icons\connect.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> + <data name="bookmark22" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\bookmark22.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> + <data name="SubtitleEditFormIcon" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Icons\SE.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> + <data name="TransparentBackground" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\Transparent Background.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> + <data name="Help" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Icons\Help.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> + <data name="Donate" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Icons\Donate.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> + <data name="Settings" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Icons\Settings.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> </root> \ No newline at end of file diff --git a/src/Properties/Settings.Designer.cs b/src/ui/Properties/Settings.Designer.cs similarity index 97% rename from src/Properties/Settings.Designer.cs rename to src/ui/Properties/Settings.Designer.cs index cd2462f49..9b8fa81d0 100644 --- a/src/Properties/Settings.Designer.cs +++ b/src/ui/Properties/Settings.Designer.cs @@ -1,36 +1,36 @@ -//------------------------------------------------------------------------------ -// <auto-generated> -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// </auto-generated> -//------------------------------------------------------------------------------ - -namespace Nikse.SubtitleEdit.Properties { - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.7.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default { - get { - return defaultInstance; - } - } - - [global::System.Configuration.ApplicationScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.SpecialSettingAttribute(global::System.Configuration.SpecialSetting.WebServiceUrl)] - [global::System.Configuration.DefaultSettingValueAttribute("http://localhost:2782/se/SeService.asmx")] - public string SubtitleEdit_SeNetworkService_SeService { - get { - return ((string)(this["SubtitleEdit_SeNetworkService_SeService"])); - } - } - } -} +//------------------------------------------------------------------------------ +// <auto-generated> +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// </auto-generated> +//------------------------------------------------------------------------------ + +namespace Nikse.SubtitleEdit.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.7.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.ApplicationScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.SpecialSettingAttribute(global::System.Configuration.SpecialSetting.WebServiceUrl)] + [global::System.Configuration.DefaultSettingValueAttribute("http://localhost:2782/se/SeService.asmx")] + public string SubtitleEdit_SeNetworkService_SeService { + get { + return ((string)(this["SubtitleEdit_SeNetworkService_SeService"])); + } + } + } +} diff --git a/src/Properties/Settings.settings b/src/ui/Properties/Settings.settings similarity index 98% rename from src/Properties/Settings.settings rename to src/ui/Properties/Settings.settings index 6ebed85b9..a415e6e6f 100644 --- a/src/Properties/Settings.settings +++ b/src/ui/Properties/Settings.settings @@ -1,9 +1,9 @@ -<?xml version='1.0' encoding='utf-8'?> -<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="Nikse.SubtitleEdit.Properties" GeneratedClassName="Settings"> - <Profiles /> - <Settings> - <Setting Name="SubtitleEdit_SeNetworkService_SeService" Type="(Web Service URL)" Scope="Application"> - <Value Profile="(Default)">http://localhost:2782/se/SeService.asmx</Value> - </Setting> - </Settings> +<?xml version='1.0' encoding='utf-8'?> +<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="Nikse.SubtitleEdit.Properties" GeneratedClassName="Settings"> + <Profiles /> + <Settings> + <Setting Name="SubtitleEdit_SeNetworkService_SeService" Type="(Web Service URL)" Scope="Application"> + <Value Profile="(Default)">http://localhost:2782/se/SeService.asmx</Value> + </Setting> + </Settings> </SettingsFile> \ No newline at end of file diff --git a/src/Resources/HunspellBackupDictionaries.xml b/src/ui/Resources/HunspellBackupDictionaries.xml similarity index 100% rename from src/Resources/HunspellBackupDictionaries.xml rename to src/ui/Resources/HunspellBackupDictionaries.xml diff --git a/src/Resources/HunspellBackupDictionaries.xml.gz b/src/ui/Resources/HunspellBackupDictionaries.xml.gz similarity index 100% rename from src/Resources/HunspellBackupDictionaries.xml.gz rename to src/ui/Resources/HunspellBackupDictionaries.xml.gz diff --git a/src/Resources/HunspellDictionaries.xml b/src/ui/Resources/HunspellDictionaries.xml similarity index 98% rename from src/Resources/HunspellDictionaries.xml rename to src/ui/Resources/HunspellDictionaries.xml index 119ee0743..5d88ee3a2 100644 --- a/src/Resources/HunspellDictionaries.xml +++ b/src/ui/Resources/HunspellDictionaries.xml @@ -1,374 +1,374 @@ -<OpenOfficeDictionaries> - <Dictionary> - <EnglishName>Afrikaans</EnglishName> - <NativeName>Afrikaans</NativeName> - <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/1109/0/dict-af.oxt?r=http%3A%2F%2Fextensions.services.openoffice.org%2Fen%2Fproject%2Fafrikaans-spell-checker&amp;ts=1373917891&amp;use_mirror=kent</DownloadLink> - <Description>Afrikaans spell checker</Description> - </Dictionary> - <Dictionary> - <EnglishName>Albanian</EnglishName> - <NativeName>Shqip</NativeName> - <DownloadLink>https://sourceforge.net/projects/aoo-extensions/files/3393/1/dict-sq.oxt/download</DownloadLink> - <Description>Albanian Spell Checker Dictionary</Description> - </Dictionary> - <Dictionary> - <EnglishName>Arabic</EnglishName> - <NativeName>عربي</NativeName> - <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/dict-ar-3-2.oxt</DownloadLink> - <Description>Arabic spell checker 3.2</Description> - </Dictionary> - <Dictionary> - <EnglishName>Basque</EnglishName> - <NativeName>Euskara</NativeName> - <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/1383/2/xuxen_4_ooo3.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fprojectrelease%2Fxuxen-basque-spell-checking-dictionary-40&amp;ts=1435689769&amp;use_mirror=garr</DownloadLink> - <Description>Xuxen: Basque spell checking dictionary - v4.0</Description> - </Dictionary> - <Dictionary> - <EnglishName>Belarusian</EnglishName> - <NativeName>Беларуская мова</NativeName> - <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/4611/15/dict-be-0.56.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fproject%2Fbelarusian-spell-checking-dictionary-recent-official-orthography&amp;ts=1373918638&amp;use_mirror=kent</DownloadLink> - <Description>Belarusian dictionary(spelling, hyphenation) - classic orthography</Description> - </Dictionary> - <Dictionary> - <EnglishName>Bosnian</EnglishName> - <NativeName>Bosanski</NativeName> - <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/dict-bs.oxt</DownloadLink> - <Description>Spellchecking dictionary for Bosnian language - 1.0 (Jan 24, 2013)</Description> - </Dictionary> - <Dictionary> - <EnglishName>Breton</EnglishName> - <NativeName>Brezhoneg</NativeName> - <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/dict-br-0-8.oxt</DownloadLink> - <Description>An Drouizig Breton Spell Checker</Description> - </Dictionary> - <Dictionary> - <EnglishName>Bulgarian</EnglishName> - <NativeName>Български</NativeName> - <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/744/8/dictionaries-bg.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fproject%2Fbulgarian-dictionaries-blgarski-rechnici&amp;ts=1435654358&amp;use_mirror=freefr</DownloadLink> - <Description>Bulgarian Dictionaries (български речници) v4.3.2 (22/09/2010)</Description> - </Dictionary> - <Dictionary> - <EnglishName>Catalan</EnglishName> - <NativeName>català</NativeName> - <DownloadLink>https://github.com/Softcatala/catalan-dict-tools/releases/download/v3.0.1/ca-valencia.3.0.1.oxt</DownloadLink> - <Description>Catalan spellchecking dictionaries, July 2015</Description> - </Dictionary> - <Dictionary> - <EnglishName>Catalan</EnglishName> - <NativeName>català-valencià</NativeName> - <DownloadLink>http://softcatala.org/diccionaris/actualitzacions/OOo/avl.oxt</DownloadLink> - <Description>Spelling dictionary for Catalan (Valencian version)</Description> - </Dictionary> - <Dictionary> - <EnglishName>Croatian</EnglishName> - <NativeName>Hrvatski</NativeName> - <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/1052/2/dict-hr.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fproject%2Fcroatian-dictionary-and-hyphenation-patterns&amp;ts=1373918817&amp;use_mirror=surfnet</DownloadLink> - <Description>Croatian dictionary and hyphenation patterns</Description> - </Dictionary> - <Dictionary> - <EnglishName>Czech</EnglishName> - <NativeName>Čeština</NativeName> - <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/1078/0/dict-cs-2.0.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fproject%2Fczech-dictionary-pack-%25C4%258Desk%25C3%25A9-slovn%25C3%25ADky&amp;ts=1373918869&amp;use_mirror=freefr</DownloadLink> - <Description>Czech dictionary pack / České slovníky</Description> - </Dictionary> - <Dictionary> - <EnglishName>Danish</EnglishName> - <NativeName>Dansk</NativeName> - <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/dict-da-2-4.oxt</DownloadLink> - <Description>Stavekontrolden version 2.2 - 2014-12-22</Description> - </Dictionary> - <Dictionary> - <EnglishName>Dutch</EnglishName> - <NativeName>Nederlands</NativeName> - <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/1456/6/nl-dict-v2.00g.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fproject%2Fdutch-spelling-and-hyphenation-dictionary&amp;ts=1373918951&amp;use_mirror=garr</DownloadLink> - <Description>Dutch spelling and hyphenation Dictionary</Description> - </Dictionary> - <Dictionary> - <EnglishName>English</EnglishName> - <NativeName></NativeName> - <DownloadLink>https://github.com/marcoagpinto/aoo-mozilla-en-dict/archive/master.zip</DownloadLink> - <Description>All English dictionaries (AU, CA, GB, US, ZA), 2018-04-16+</Description> - </Dictionary> - <Dictionary> - <EnglishName>Estonian</EnglishName> - <NativeName></NativeName> - <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/1328/0/dict-et.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fproject%2Festonian-spellchecking-and-hyphenation&amp;ts=1435689988&amp;use_mirror=freefr</DownloadLink> - <Description>Estonian spellchecking and hyphenation (13 October, 2008)</Description> - </Dictionary> - <Dictionary> - <EnglishName>Farsi (Persian)</EnglishName> - <NativeName>Persian/Farsi</NativeName> - <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/2359/1/dict-fa.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fprojectrelease%2Fpersian-spellchecker-dictionary-20090707&amp;ts=1435690384&amp;use_mirror=freefr</DownloadLink> - <Description>Persian Spellchecker Dictionary - 2009.07.07</Description> - </Dictionary> - <Dictionary> - <EnglishName>French</EnglishName> - <NativeName>Français</NativeName> - <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/lo-oo-ressources-linguistiques-fr-v5-7.oxt</DownloadLink> - <Description>Dictionnaires francais 5.3 (28/02/2015)</Description> - </Dictionary> - <Dictionary> - <EnglishName>German (Austria)</EnglishName> - <NativeName>Deutsch (Österreich)</NativeName> - <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/dict-de-at-frami-2017-01-12.oxt</DownloadLink> - <Description>German (de-AT frami) dictionaries 2013.12.06 (08/12/2013)</Description> - </Dictionary> - <Dictionary> - <EnglishName>German (Germany)</EnglishName> - <NativeName>German (de-DE frami) dictionaries - [de] Deutsche (de-DE frami) Rechtschreibung</NativeName> - <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/dict-de-de-frami-2017-01-12.oxt</DownloadLink> - <Description>German (de-DE igerman98) dictionaries</Description> - </Dictionary> - <Dictionary> - <EnglishName>Greek</EnglishName> - <NativeName>Ελληνικά</NativeName> - <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/1411/2/el_gr_v110.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fprojectrelease%2Fhellenic-greek-dictionary-spell-check-and-hyphenation-110&amp;ts=1435654652&amp;use_mirror=freefr</DownloadLink> - <Description>Hellenic (Greek) Dictionary (Spell Check and Hyphenation) - v1.1.0</Description> - </Dictionary> - <Dictionary> - <EnglishName>Hebrew</EnglishName> - <NativeName>Hebrew (he) spell check dictionary 2012-08-15</NativeName> - <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/dict-he-2012-08-15.oxt</DownloadLink> - <Description>Hebrew (he) spell check dictionary (Aug 15, 2012)</Description> - </Dictionary> - <Dictionary> - <EnglishName>Hindi</EnglishName> - <NativeName>हिंदी</NativeName> - <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/2367/1/dict-hi.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fproject%2Fhindi-spellchecker-dictionary&amp;ts=1435678775&amp;use_mirror=garr</DownloadLink> - <Description>Hindi Spellchecker Dictionary</Description> - </Dictionary> - <Dictionary> - <EnglishName>Hungarian</EnglishName> - <NativeName>Magyar</NativeName> - <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/1283/9/dict-hu.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fprojectrelease%2Fhungarian-dictionary-pack-20101019&amp;ts=1435690641&amp;use_mirror=freefr</DownloadLink> - <Description>Hungarian Dictionary Pack - (2010.10.19)</Description> - </Dictionary> - <Dictionary> - <EnglishName>Icelandic</EnglishName> - <NativeName>íslenska</NativeName> - <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/hunspell-is-2014-08-18.oxt</DownloadLink> - <Description>Icelandic spelling dictionary &amp; thesaurus 2013.05.11</Description> - </Dictionary> - <Dictionary> - <EnglishName>Indonesian</EnglishName> - <NativeName>Indonesia</NativeName> - <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/id-id.oxt</DownloadLink> - <Description>Indonesian dictionary - Kamus Indonesia 1.0</Description> - </Dictionary> - <Dictionary> - <EnglishName>Irish</EnglishName> - <NativeName>Gaeilge</NativeName> - <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/focloiri-gaeilge-5-0.oxt</DownloadLink> - <Description>Irish language spell checker, thesaurus, and hyphenation patterns 4.5</Description> - </Dictionary> - <Dictionary> - <EnglishName>Italian</EnglishName> - <NativeName>Italiano</NativeName> - <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/874d181c_dict-it.oxt</DownloadLink> - <Description>Italian and Latin spelling dictionaries 2013.03.31</Description> - </Dictionary> - <Dictionary> - <EnglishName>Italian</EnglishName> - <NativeName>Italiano</NativeName> - <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/1204/13/dict-it.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fprojectrelease%2Fitalian-dictionary-thesaurus-hyphenation-patterns-20130905&amp;ts=1435690929&amp;use_mirror=freefr</DownloadLink> - <Description>Italian dictionary, thesaurus, hyphenation patterns - (2013.09.05)</Description> - </Dictionary> - <Dictionary> - <EnglishName>Khmer</EnglishName> - <NativeName>Khmer</NativeName> - <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/5067/2/dict-km.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fproject%2Fkhmer-spelling-dictionary&amp;ts=1373998173&amp;use_mirror=netcologne</DownloadLink> - <Description>Khmer spelling dictionary 2011.05.11</Description> - </Dictionary> - <Dictionary> - <EnglishName>Korean</EnglishName> - <NativeName>한글</NativeName> - <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/korean-spell-checker-0-7-91-libo.oxt</DownloadLink> - <Description>Korean spellchecker 0.5.6</Description> - </Dictionary> - <Dictionary> - <EnglishName>Latin</EnglishName> - <NativeName>Latina</NativeName> - <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/dict-la-2013-03-31.oxt</DownloadLink> - <Description>Latin spelling and hyphenation dictionaries 2013.03.31</Description> - </Dictionary> - <Dictionary> - <EnglishName>Latvian</EnglishName> - <NativeName>Latviešu</NativeName> - <DownloadLink>http://ftp.nluug.nl/office/openoffice/contrib/dictionaries/hyph_lv_LV.zip</DownloadLink> - <Description>Latviešu valodas pareizrakstības pārbaudes modulis 0.9.6</Description> - </Dictionary> - <Dictionary> - <EnglishName>Lithuanian</EnglishName> - <NativeName>Lietuvių</NativeName> - <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/openoffice-spellcheck-lt-1-3.oxt</DownloadLink> - <Description>Lithuanian spellcheck and hyphenation dictionaries 1.3</Description> - </Dictionary> - <Dictionary> - <EnglishName>Lower Sorbian</EnglishName> - <NativeName>dolnoserbšćina</NativeName> - <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/lower-sorbian-spelling-dictionary-1-5-0.oxt</DownloadLink> - <Description>Lower Sorbian dictionary 1.4.6</Description> - </Dictionary> - <Dictionary> - <EnglishName>Malay</EnglishName> - <NativeName>Malay</NativeName> - <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/3904/0/ms_my.oxt</DownloadLink> - <Description>Malay Spell Checker v0.1 - 07/10/04</Description> - </Dictionary> - <Dictionary> - <EnglishName>Malayalam</EnglishName> - <NativeName>Malayalam</NativeName> - <DownloadLink>https://master.dl.sourceforge.net/project/aoo-extensions/2741/3/ml_in_dict-1-1.oxt</DownloadLink> - <Description>Malayalam Spellchecker 1.1.0</Description> - </Dictionary> - <Dictionary> - <EnglishName>Macedonian</EnglishName> - <NativeName>Macedonian</NativeName> - <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/3403/0/dict-mk.oxt</DownloadLink> - <Description>Macedonian dictionary was created by Taras Bendik</Description> - </Dictionary> - <Dictionary> - <EnglishName>Norwegian</EnglishName> - <NativeName>Norsk</NativeName> - <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/dictionary-no-no-1-0.oxt</DownloadLink> - <Description>Norsk stavekontroll (bokmål og nynorsk) 2.0.10</Description> - </Dictionary> - <Dictionary> - <EnglishName>Polish</EnglishName> - <NativeName>polski</NativeName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/hunspell/pl_PL.zip</DownloadLink> - <Description>Polish by https://sjp.pl - 2020-07-18</Description> - </Dictionary> - <Dictionary> - <EnglishName>Portuguese (Brazilian) - Libreoffice</EnglishName> - <NativeName>Português (do Brasil)</NativeName> - <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/veroptbrv320aoc.oxt</DownloadLink> - <Description>Brazilian Portuguese Spelling Dictionary V3.2 - Libreoffice</Description> - </Dictionary> - <Dictionary> - <EnglishName>Portuguese (Brazilian) - Firefox</EnglishName> - <NativeName>Português (do Brasil)</NativeName> - <DownloadLink>https://hg.mozilla.org/releases/l10n/mozilla-aurora/pt-BR/archive/81d9d556fa78.zip/extensions/spellcheck/hunspell/</DownloadLink> - <Description>Brazilian Portuguese Spelling Dictionary 2009 José João de Almeida - Firefox</Description> - </Dictionary> - <Dictionary> - <EnglishName>Portuguese (European Portuguese Dictionary)</EnglishName> - <NativeName>Português</NativeName> - <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/1196/40/oo3x-pt-pt-16.10.1.2.oxt</DownloadLink> - <Description>Corretores Ortográficos para Português de Portugal</Description> - </Dictionary> - <Dictionary> - <EnglishName>Portuguese (European Portuguese Dictionary - PRE AO90)</EnglishName> - <NativeName>Português</NativeName> - <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/17990/9/oo3x-pt-pt-preao-16.10.1.2.oxt</DownloadLink> - <Description>Corretores Ortográficos para Português de Portugal</Description> - </Dictionary> - <Dictionary> - <EnglishName>Romanian</EnglishName> - <NativeName>română</NativeName> - <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/1392/10/dict-ro.1.7.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fprojectrelease%2Fromanian-dictionary-pack-spell-checker-hyphenation-thesaurus-17&amp;ts=1435689394&amp;use_mirror=freefr</DownloadLink> - <Description>Romanian Dictionary Pack (spell checker, hyphenation, thesaurus) - v1.7</Description> - </Dictionary> - <Dictionary> - <EnglishName>Russian</EnglishName> - <NativeName>Русский</NativeName> - <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/dict-ru-ru-aot-0-4-3.oxt</DownloadLink> - <Description>Russian spellcheck dictionary. Based on works of AOT group. 0.4.0</Description> - </Dictionary> - <Dictionary> - <EnglishName>Serbian</EnglishName> - <NativeName>српски</NativeName> - <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/bb01ff21_dict-sr.oxt</DownloadLink> - <Description>Serbian (Cyrillic and Latin) Spelling and Hyphenation, Aug 08, 2019</Description> - </Dictionary> - <Dictionary> - <EnglishName>Sinhala</EnglishName> - <NativeName>Sinhala</NativeName> - <DownloadLink>http://extensions.openoffice.org/en/download/4346</DownloadLink> - <Description>Sinhala by laknath</Description> - </Dictionary> - <Dictionary> - <EnglishName>Slovak</EnglishName> - <NativeName>slovenčina</NativeName> - <DownloadLink>http://www.sk-spell.sk.cx/files/hunspell-sk-20110228.zip</DownloadLink> - <Description>Slovak dictionary package / Slovenské slovníky</Description> - </Dictionary> - <Dictionary> - <EnglishName>Slovenian</EnglishName> - <NativeName>slovenski</NativeName> - <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/8b7ba8bb_pack-sl.oxt</DownloadLink> - <Description>Slovenian Dictionary Pack - 2018.01.04</Description> - </Dictionary> - <Dictionary> - <EnglishName>Spanish</EnglishName> - <NativeName>España</NativeName> - <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/spanish-dictionary.oxt</DownloadLink> - <Description>Diccionario del idioma español - 1.0 (Dec 28, 2011)</Description> - </Dictionary> - <Dictionary> - <EnglishName>Spanish</EnglishName> - <NativeName>Español Genérico</NativeName> - <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/e217baa9_es-any.oxt</DownloadLink> - <Description>Genérico v2.1 (Apr 05, 2016)</Description> - </Dictionary> - <Dictionary> - <EnglishName>Swahili</EnglishName> - <NativeName>Kiswahili</NativeName> - <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/swahilidictionary-2013-03-12.oxt</DownloadLink> - <Description>Swahili Dictionary 2013.03.12</Description> - </Dictionary> - <Dictionary> - <EnglishName>Swedish</EnglishName> - <NativeName>Svenska</NativeName> - <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/5959/1/dict-sv.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fproject%2Fswedish-dictionaries-apache-openoffice&amp;ts=1375123584&amp;use_mirror=heanet</DownloadLink> - <Description>Swedish 2.16</Description> - </Dictionary> - <Dictionary> - <EnglishName>Thai</EnglishName> - <NativeName>ภาษาไทย</NativeName> - <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/2365/0/dict-th.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fproject%2Fthai-spellchecker-dictionary&amp;ts=1373919459&amp;use_mirror=netcologne</DownloadLink> - <Description>Thai Spell Checker Dictionary</Description> - </Dictionary> - <Dictionary> - <EnglishName>Turkish</EnglishName> - <NativeName>Turkish</NativeName> - <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/oo-turkish-dict-v1-2.oxt</DownloadLink> - <Description>Turkish Spellcheck Dictionary - 1.2</Description> - </Dictionary> - <Dictionary> - <EnglishName>Ukrainian</EnglishName> - <NativeName>Українська</NativeName> - <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/975/6/dict-uk_ua-1.7.1.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fprojectrelease%2Fukrainian-dictionary-171&amp;ts=1435691238&amp;use_mirror=freefr</DownloadLink> - <Description>Ukrainian Dictionary - v1.7.1 (27/03/2014)</Description> - </Dictionary> - <Dictionary> - <EnglishName>Valencian</EnglishName> - <NativeName>valencià</NativeName> - <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/1475/1/ca-valencia.3.0.0.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fprojectrelease%2Fspelling-dictionary-catalan-valencian-version-300&amp;ts=1435691121&amp;use_mirror=freefr</DownloadLink> - <Description>Spelling dictionary for Catalan (Valencian version) - v3.0.0 (25/05/2015)</Description> - </Dictionary> - <Dictionary> - <EnglishName>Vietnamese</EnglishName> - <NativeName>Tiếng Việt</NativeName> - <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/917/3/vi_spellchecker_ooo3.oxt?r=http%3A%2F%2Fextensions.services.openoffice.org%2Fen%2Fproject%2Fvietnamese-spellchecker&amp;ts=1373917708&amp;use_mirror=kent</DownloadLink> - <Description>Vietnamese SpellChecker</Description> - </Dictionary> - <Dictionary> - <EnglishName>Welsh (Wales)</EnglishName> - <NativeName>Welsh (Wales)</NativeName> - <DownloadLink>https://downloads.sourceforge.net/project/aoo-extensions/1583/1/geiriadur-cy.oxt</DownloadLink> - <Description>Xhosa spell checker</Description> - </Dictionary> - <Dictionary> - <EnglishName>Xhosa (South Africa)</EnglishName> - <NativeName>Xhosa (South Africa)</NativeName> - <DownloadLink>https://sourceforge.net/projects/aoo-extensions/files/3133/0/dict-xh_za-2009.10.30.oxt/download</DownloadLink> - <Description>Xhosa spell checker</Description> - </Dictionary> - <Dictionary> - <EnglishName>Zulu</EnglishName> - <NativeName>IsiZulu</NativeName> - <DownloadLink>https://sourceforge.net/projects/aoo-extensions/files/3132/3/dict-zu_za-2010.01.26.oxt/download</DownloadLink> - <Description>Zulu spell checker</Description> - </Dictionary> -</OpenOfficeDictionaries> +<OpenOfficeDictionaries> + <Dictionary> + <EnglishName>Afrikaans</EnglishName> + <NativeName>Afrikaans</NativeName> + <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/1109/0/dict-af.oxt?r=http%3A%2F%2Fextensions.services.openoffice.org%2Fen%2Fproject%2Fafrikaans-spell-checker&amp;ts=1373917891&amp;use_mirror=kent</DownloadLink> + <Description>Afrikaans spell checker</Description> + </Dictionary> + <Dictionary> + <EnglishName>Albanian</EnglishName> + <NativeName>Shqip</NativeName> + <DownloadLink>https://sourceforge.net/projects/aoo-extensions/files/3393/1/dict-sq.oxt/download</DownloadLink> + <Description>Albanian Spell Checker Dictionary</Description> + </Dictionary> + <Dictionary> + <EnglishName>Arabic</EnglishName> + <NativeName>عربي</NativeName> + <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/dict-ar-3-2.oxt</DownloadLink> + <Description>Arabic spell checker 3.2</Description> + </Dictionary> + <Dictionary> + <EnglishName>Basque</EnglishName> + <NativeName>Euskara</NativeName> + <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/1383/2/xuxen_4_ooo3.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fprojectrelease%2Fxuxen-basque-spell-checking-dictionary-40&amp;ts=1435689769&amp;use_mirror=garr</DownloadLink> + <Description>Xuxen: Basque spell checking dictionary - v4.0</Description> + </Dictionary> + <Dictionary> + <EnglishName>Belarusian</EnglishName> + <NativeName>Беларуская мова</NativeName> + <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/4611/15/dict-be-0.56.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fproject%2Fbelarusian-spell-checking-dictionary-recent-official-orthography&amp;ts=1373918638&amp;use_mirror=kent</DownloadLink> + <Description>Belarusian dictionary(spelling, hyphenation) - classic orthography</Description> + </Dictionary> + <Dictionary> + <EnglishName>Bosnian</EnglishName> + <NativeName>Bosanski</NativeName> + <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/dict-bs.oxt</DownloadLink> + <Description>Spellchecking dictionary for Bosnian language - 1.0 (Jan 24, 2013)</Description> + </Dictionary> + <Dictionary> + <EnglishName>Breton</EnglishName> + <NativeName>Brezhoneg</NativeName> + <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/dict-br-0-8.oxt</DownloadLink> + <Description>An Drouizig Breton Spell Checker</Description> + </Dictionary> + <Dictionary> + <EnglishName>Bulgarian</EnglishName> + <NativeName>Български</NativeName> + <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/744/8/dictionaries-bg.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fproject%2Fbulgarian-dictionaries-blgarski-rechnici&amp;ts=1435654358&amp;use_mirror=freefr</DownloadLink> + <Description>Bulgarian Dictionaries (български речници) v4.3.2 (22/09/2010)</Description> + </Dictionary> + <Dictionary> + <EnglishName>Catalan</EnglishName> + <NativeName>català</NativeName> + <DownloadLink>https://github.com/Softcatala/catalan-dict-tools/releases/download/v3.0.1/ca-valencia.3.0.1.oxt</DownloadLink> + <Description>Catalan spellchecking dictionaries, July 2015</Description> + </Dictionary> + <Dictionary> + <EnglishName>Catalan</EnglishName> + <NativeName>català-valencià</NativeName> + <DownloadLink>http://softcatala.org/diccionaris/actualitzacions/OOo/avl.oxt</DownloadLink> + <Description>Spelling dictionary for Catalan (Valencian version)</Description> + </Dictionary> + <Dictionary> + <EnglishName>Croatian</EnglishName> + <NativeName>Hrvatski</NativeName> + <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/1052/2/dict-hr.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fproject%2Fcroatian-dictionary-and-hyphenation-patterns&amp;ts=1373918817&amp;use_mirror=surfnet</DownloadLink> + <Description>Croatian dictionary and hyphenation patterns</Description> + </Dictionary> + <Dictionary> + <EnglishName>Czech</EnglishName> + <NativeName>Čeština</NativeName> + <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/1078/0/dict-cs-2.0.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fproject%2Fczech-dictionary-pack-%25C4%258Desk%25C3%25A9-slovn%25C3%25ADky&amp;ts=1373918869&amp;use_mirror=freefr</DownloadLink> + <Description>Czech dictionary pack / České slovníky</Description> + </Dictionary> + <Dictionary> + <EnglishName>Danish</EnglishName> + <NativeName>Dansk</NativeName> + <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/dict-da-2-4.oxt</DownloadLink> + <Description>Stavekontrolden version 2.2 - 2014-12-22</Description> + </Dictionary> + <Dictionary> + <EnglishName>Dutch</EnglishName> + <NativeName>Nederlands</NativeName> + <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/1456/6/nl-dict-v2.00g.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fproject%2Fdutch-spelling-and-hyphenation-dictionary&amp;ts=1373918951&amp;use_mirror=garr</DownloadLink> + <Description>Dutch spelling and hyphenation Dictionary</Description> + </Dictionary> + <Dictionary> + <EnglishName>English</EnglishName> + <NativeName></NativeName> + <DownloadLink>https://github.com/marcoagpinto/aoo-mozilla-en-dict/archive/master.zip</DownloadLink> + <Description>All English dictionaries (AU, CA, GB, US, ZA), 2018-04-16+</Description> + </Dictionary> + <Dictionary> + <EnglishName>Estonian</EnglishName> + <NativeName></NativeName> + <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/1328/0/dict-et.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fproject%2Festonian-spellchecking-and-hyphenation&amp;ts=1435689988&amp;use_mirror=freefr</DownloadLink> + <Description>Estonian spellchecking and hyphenation (13 October, 2008)</Description> + </Dictionary> + <Dictionary> + <EnglishName>Farsi (Persian)</EnglishName> + <NativeName>Persian/Farsi</NativeName> + <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/2359/1/dict-fa.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fprojectrelease%2Fpersian-spellchecker-dictionary-20090707&amp;ts=1435690384&amp;use_mirror=freefr</DownloadLink> + <Description>Persian Spellchecker Dictionary - 2009.07.07</Description> + </Dictionary> + <Dictionary> + <EnglishName>French</EnglishName> + <NativeName>Français</NativeName> + <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/lo-oo-ressources-linguistiques-fr-v5-7.oxt</DownloadLink> + <Description>Dictionnaires francais 5.3 (28/02/2015)</Description> + </Dictionary> + <Dictionary> + <EnglishName>German (Austria)</EnglishName> + <NativeName>Deutsch (Österreich)</NativeName> + <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/dict-de-at-frami-2017-01-12.oxt</DownloadLink> + <Description>German (de-AT frami) dictionaries 2013.12.06 (08/12/2013)</Description> + </Dictionary> + <Dictionary> + <EnglishName>German (Germany)</EnglishName> + <NativeName>German (de-DE frami) dictionaries - [de] Deutsche (de-DE frami) Rechtschreibung</NativeName> + <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/dict-de-de-frami-2017-01-12.oxt</DownloadLink> + <Description>German (de-DE igerman98) dictionaries</Description> + </Dictionary> + <Dictionary> + <EnglishName>Greek</EnglishName> + <NativeName>Ελληνικά</NativeName> + <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/1411/2/el_gr_v110.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fprojectrelease%2Fhellenic-greek-dictionary-spell-check-and-hyphenation-110&amp;ts=1435654652&amp;use_mirror=freefr</DownloadLink> + <Description>Hellenic (Greek) Dictionary (Spell Check and Hyphenation) - v1.1.0</Description> + </Dictionary> + <Dictionary> + <EnglishName>Hebrew</EnglishName> + <NativeName>Hebrew (he) spell check dictionary 2012-08-15</NativeName> + <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/dict-he-2012-08-15.oxt</DownloadLink> + <Description>Hebrew (he) spell check dictionary (Aug 15, 2012)</Description> + </Dictionary> + <Dictionary> + <EnglishName>Hindi</EnglishName> + <NativeName>हिंदी</NativeName> + <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/2367/1/dict-hi.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fproject%2Fhindi-spellchecker-dictionary&amp;ts=1435678775&amp;use_mirror=garr</DownloadLink> + <Description>Hindi Spellchecker Dictionary</Description> + </Dictionary> + <Dictionary> + <EnglishName>Hungarian</EnglishName> + <NativeName>Magyar</NativeName> + <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/1283/9/dict-hu.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fprojectrelease%2Fhungarian-dictionary-pack-20101019&amp;ts=1435690641&amp;use_mirror=freefr</DownloadLink> + <Description>Hungarian Dictionary Pack - (2010.10.19)</Description> + </Dictionary> + <Dictionary> + <EnglishName>Icelandic</EnglishName> + <NativeName>íslenska</NativeName> + <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/hunspell-is-2014-08-18.oxt</DownloadLink> + <Description>Icelandic spelling dictionary &amp; thesaurus 2013.05.11</Description> + </Dictionary> + <Dictionary> + <EnglishName>Indonesian</EnglishName> + <NativeName>Indonesia</NativeName> + <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/id-id.oxt</DownloadLink> + <Description>Indonesian dictionary - Kamus Indonesia 1.0</Description> + </Dictionary> + <Dictionary> + <EnglishName>Irish</EnglishName> + <NativeName>Gaeilge</NativeName> + <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/focloiri-gaeilge-5-0.oxt</DownloadLink> + <Description>Irish language spell checker, thesaurus, and hyphenation patterns 4.5</Description> + </Dictionary> + <Dictionary> + <EnglishName>Italian</EnglishName> + <NativeName>Italiano</NativeName> + <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/874d181c_dict-it.oxt</DownloadLink> + <Description>Italian and Latin spelling dictionaries 2013.03.31</Description> + </Dictionary> + <Dictionary> + <EnglishName>Italian</EnglishName> + <NativeName>Italiano</NativeName> + <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/1204/13/dict-it.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fprojectrelease%2Fitalian-dictionary-thesaurus-hyphenation-patterns-20130905&amp;ts=1435690929&amp;use_mirror=freefr</DownloadLink> + <Description>Italian dictionary, thesaurus, hyphenation patterns - (2013.09.05)</Description> + </Dictionary> + <Dictionary> + <EnglishName>Khmer</EnglishName> + <NativeName>Khmer</NativeName> + <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/5067/2/dict-km.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fproject%2Fkhmer-spelling-dictionary&amp;ts=1373998173&amp;use_mirror=netcologne</DownloadLink> + <Description>Khmer spelling dictionary 2011.05.11</Description> + </Dictionary> + <Dictionary> + <EnglishName>Korean</EnglishName> + <NativeName>한글</NativeName> + <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/korean-spell-checker-0-7-91-libo.oxt</DownloadLink> + <Description>Korean spellchecker 0.5.6</Description> + </Dictionary> + <Dictionary> + <EnglishName>Latin</EnglishName> + <NativeName>Latina</NativeName> + <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/dict-la-2013-03-31.oxt</DownloadLink> + <Description>Latin spelling and hyphenation dictionaries 2013.03.31</Description> + </Dictionary> + <Dictionary> + <EnglishName>Latvian</EnglishName> + <NativeName>Latviešu</NativeName> + <DownloadLink>http://ftp.nluug.nl/office/openoffice/contrib/dictionaries/hyph_lv_LV.zip</DownloadLink> + <Description>Latviešu valodas pareizrakstības pārbaudes modulis 0.9.6</Description> + </Dictionary> + <Dictionary> + <EnglishName>Lithuanian</EnglishName> + <NativeName>Lietuvių</NativeName> + <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/openoffice-spellcheck-lt-1-3.oxt</DownloadLink> + <Description>Lithuanian spellcheck and hyphenation dictionaries 1.3</Description> + </Dictionary> + <Dictionary> + <EnglishName>Lower Sorbian</EnglishName> + <NativeName>dolnoserbšćina</NativeName> + <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/lower-sorbian-spelling-dictionary-1-5-0.oxt</DownloadLink> + <Description>Lower Sorbian dictionary 1.4.6</Description> + </Dictionary> + <Dictionary> + <EnglishName>Malay</EnglishName> + <NativeName>Malay</NativeName> + <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/3904/0/ms_my.oxt</DownloadLink> + <Description>Malay Spell Checker v0.1 - 07/10/04</Description> + </Dictionary> + <Dictionary> + <EnglishName>Malayalam</EnglishName> + <NativeName>Malayalam</NativeName> + <DownloadLink>https://master.dl.sourceforge.net/project/aoo-extensions/2741/3/ml_in_dict-1-1.oxt</DownloadLink> + <Description>Malayalam Spellchecker 1.1.0</Description> + </Dictionary> + <Dictionary> + <EnglishName>Macedonian</EnglishName> + <NativeName>Macedonian</NativeName> + <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/3403/0/dict-mk.oxt</DownloadLink> + <Description>Macedonian dictionary was created by Taras Bendik</Description> + </Dictionary> + <Dictionary> + <EnglishName>Norwegian</EnglishName> + <NativeName>Norsk</NativeName> + <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/dictionary-no-no-1-0.oxt</DownloadLink> + <Description>Norsk stavekontroll (bokmål og nynorsk) 2.0.10</Description> + </Dictionary> + <Dictionary> + <EnglishName>Polish</EnglishName> + <NativeName>polski</NativeName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/hunspell/pl_PL.zip</DownloadLink> + <Description>Polish by https://sjp.pl - 2020-07-18</Description> + </Dictionary> + <Dictionary> + <EnglishName>Portuguese (Brazilian) - Libreoffice</EnglishName> + <NativeName>Português (do Brasil)</NativeName> + <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/veroptbrv320aoc.oxt</DownloadLink> + <Description>Brazilian Portuguese Spelling Dictionary V3.2 - Libreoffice</Description> + </Dictionary> + <Dictionary> + <EnglishName>Portuguese (Brazilian) - Firefox</EnglishName> + <NativeName>Português (do Brasil)</NativeName> + <DownloadLink>https://hg.mozilla.org/releases/l10n/mozilla-aurora/pt-BR/archive/81d9d556fa78.zip/extensions/spellcheck/hunspell/</DownloadLink> + <Description>Brazilian Portuguese Spelling Dictionary 2009 José João de Almeida - Firefox</Description> + </Dictionary> + <Dictionary> + <EnglishName>Portuguese (European Portuguese Dictionary)</EnglishName> + <NativeName>Português</NativeName> + <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/1196/40/oo3x-pt-pt-16.10.1.2.oxt</DownloadLink> + <Description>Corretores Ortográficos para Português de Portugal</Description> + </Dictionary> + <Dictionary> + <EnglishName>Portuguese (European Portuguese Dictionary - PRE AO90)</EnglishName> + <NativeName>Português</NativeName> + <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/17990/9/oo3x-pt-pt-preao-16.10.1.2.oxt</DownloadLink> + <Description>Corretores Ortográficos para Português de Portugal</Description> + </Dictionary> + <Dictionary> + <EnglishName>Romanian</EnglishName> + <NativeName>română</NativeName> + <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/1392/10/dict-ro.1.7.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fprojectrelease%2Fromanian-dictionary-pack-spell-checker-hyphenation-thesaurus-17&amp;ts=1435689394&amp;use_mirror=freefr</DownloadLink> + <Description>Romanian Dictionary Pack (spell checker, hyphenation, thesaurus) - v1.7</Description> + </Dictionary> + <Dictionary> + <EnglishName>Russian</EnglishName> + <NativeName>Русский</NativeName> + <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/dict-ru-ru-aot-0-4-3.oxt</DownloadLink> + <Description>Russian spellcheck dictionary. Based on works of AOT group. 0.4.0</Description> + </Dictionary> + <Dictionary> + <EnglishName>Serbian</EnglishName> + <NativeName>српски</NativeName> + <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/bb01ff21_dict-sr.oxt</DownloadLink> + <Description>Serbian (Cyrillic and Latin) Spelling and Hyphenation, Aug 08, 2019</Description> + </Dictionary> + <Dictionary> + <EnglishName>Sinhala</EnglishName> + <NativeName>Sinhala</NativeName> + <DownloadLink>http://extensions.openoffice.org/en/download/4346</DownloadLink> + <Description>Sinhala by laknath</Description> + </Dictionary> + <Dictionary> + <EnglishName>Slovak</EnglishName> + <NativeName>slovenčina</NativeName> + <DownloadLink>http://www.sk-spell.sk.cx/files/hunspell-sk-20110228.zip</DownloadLink> + <Description>Slovak dictionary package / Slovenské slovníky</Description> + </Dictionary> + <Dictionary> + <EnglishName>Slovenian</EnglishName> + <NativeName>slovenski</NativeName> + <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/8b7ba8bb_pack-sl.oxt</DownloadLink> + <Description>Slovenian Dictionary Pack - 2018.01.04</Description> + </Dictionary> + <Dictionary> + <EnglishName>Spanish</EnglishName> + <NativeName>España</NativeName> + <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/spanish-dictionary.oxt</DownloadLink> + <Description>Diccionario del idioma español - 1.0 (Dec 28, 2011)</Description> + </Dictionary> + <Dictionary> + <EnglishName>Spanish</EnglishName> + <NativeName>Español Genérico</NativeName> + <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/e217baa9_es-any.oxt</DownloadLink> + <Description>Genérico v2.1 (Apr 05, 2016)</Description> + </Dictionary> + <Dictionary> + <EnglishName>Swahili</EnglishName> + <NativeName>Kiswahili</NativeName> + <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/swahilidictionary-2013-03-12.oxt</DownloadLink> + <Description>Swahili Dictionary 2013.03.12</Description> + </Dictionary> + <Dictionary> + <EnglishName>Swedish</EnglishName> + <NativeName>Svenska</NativeName> + <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/5959/1/dict-sv.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fproject%2Fswedish-dictionaries-apache-openoffice&amp;ts=1375123584&amp;use_mirror=heanet</DownloadLink> + <Description>Swedish 2.16</Description> + </Dictionary> + <Dictionary> + <EnglishName>Thai</EnglishName> + <NativeName>ภาษาไทย</NativeName> + <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/2365/0/dict-th.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fproject%2Fthai-spellchecker-dictionary&amp;ts=1373919459&amp;use_mirror=netcologne</DownloadLink> + <Description>Thai Spell Checker Dictionary</Description> + </Dictionary> + <Dictionary> + <EnglishName>Turkish</EnglishName> + <NativeName>Turkish</NativeName> + <DownloadLink>https://extensions.libreoffice.org/assets/downloads/z/oo-turkish-dict-v1-2.oxt</DownloadLink> + <Description>Turkish Spellcheck Dictionary - 1.2</Description> + </Dictionary> + <Dictionary> + <EnglishName>Ukrainian</EnglishName> + <NativeName>Українська</NativeName> + <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/975/6/dict-uk_ua-1.7.1.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fprojectrelease%2Fukrainian-dictionary-171&amp;ts=1435691238&amp;use_mirror=freefr</DownloadLink> + <Description>Ukrainian Dictionary - v1.7.1 (27/03/2014)</Description> + </Dictionary> + <Dictionary> + <EnglishName>Valencian</EnglishName> + <NativeName>valencià</NativeName> + <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/1475/1/ca-valencia.3.0.0.oxt?r=http%3A%2F%2Fextensions.openoffice.org%2Fen%2Fprojectrelease%2Fspelling-dictionary-catalan-valencian-version-300&amp;ts=1435691121&amp;use_mirror=freefr</DownloadLink> + <Description>Spelling dictionary for Catalan (Valencian version) - v3.0.0 (25/05/2015)</Description> + </Dictionary> + <Dictionary> + <EnglishName>Vietnamese</EnglishName> + <NativeName>Tiếng Việt</NativeName> + <DownloadLink>http://downloads.sourceforge.net/project/aoo-extensions/917/3/vi_spellchecker_ooo3.oxt?r=http%3A%2F%2Fextensions.services.openoffice.org%2Fen%2Fproject%2Fvietnamese-spellchecker&amp;ts=1373917708&amp;use_mirror=kent</DownloadLink> + <Description>Vietnamese SpellChecker</Description> + </Dictionary> + <Dictionary> + <EnglishName>Welsh (Wales)</EnglishName> + <NativeName>Welsh (Wales)</NativeName> + <DownloadLink>https://downloads.sourceforge.net/project/aoo-extensions/1583/1/geiriadur-cy.oxt</DownloadLink> + <Description>Xhosa spell checker</Description> + </Dictionary> + <Dictionary> + <EnglishName>Xhosa (South Africa)</EnglishName> + <NativeName>Xhosa (South Africa)</NativeName> + <DownloadLink>https://sourceforge.net/projects/aoo-extensions/files/3133/0/dict-xh_za-2009.10.30.oxt/download</DownloadLink> + <Description>Xhosa spell checker</Description> + </Dictionary> + <Dictionary> + <EnglishName>Zulu</EnglishName> + <NativeName>IsiZulu</NativeName> + <DownloadLink>https://sourceforge.net/projects/aoo-extensions/files/3132/3/dict-zu_za-2010.01.26.oxt/download</DownloadLink> + <Description>Zulu spell checker</Description> + </Dictionary> +</OpenOfficeDictionaries> diff --git a/src/Resources/HunspellDictionaries.xml.gz b/src/ui/Resources/HunspellDictionaries.xml.gz similarity index 100% rename from src/Resources/HunspellDictionaries.xml.gz rename to src/ui/Resources/HunspellDictionaries.xml.gz diff --git a/src/Resources/SMPTE-428-7-2007-DCST.xsd b/src/ui/Resources/SMPTE-428-7-2007-DCST.xsd similarity index 100% rename from src/Resources/SMPTE-428-7-2007-DCST.xsd rename to src/ui/Resources/SMPTE-428-7-2007-DCST.xsd diff --git a/src/Resources/SMPTE-428-7-2007-DCST.xsd.gz b/src/ui/Resources/SMPTE-428-7-2007-DCST.xsd.gz similarity index 100% rename from src/Resources/SMPTE-428-7-2007-DCST.xsd.gz rename to src/ui/Resources/SMPTE-428-7-2007-DCST.xsd.gz diff --git a/src/Resources/SMPTE-428-7-2010-DCST.xsd b/src/ui/Resources/SMPTE-428-7-2010-DCST.xsd similarity index 97% rename from src/Resources/SMPTE-428-7-2010-DCST.xsd rename to src/ui/Resources/SMPTE-428-7-2010-DCST.xsd index 99b21d571..e2ecc19c0 100644 --- a/src/Resources/SMPTE-428-7-2010-DCST.xsd +++ b/src/ui/Resources/SMPTE-428-7-2010-DCST.xsd @@ -1,334 +1,334 @@ -<?xml version="1.0" encoding="UTF-8"?> -<xs:schema - targetNamespace="http://www.smpte-ra.org/schemas/428-7/2010/DCST" - xmlns:dcst="http://www.smpte-ra.org/schemas/428-7/2010/DCST" - xmlns:xs="http://www.w3.org/2001/XMLSchema" - elementFormDefault="qualified" attributeFormDefault="unqualified"> - - <!-- SubtitleReel --> - <xs:element name="SubtitleReel" type="dcst:SubtitleReelType" /> - <xs:complexType name="SubtitleReelType"> - <xs:sequence> - <xs:element name="Id" type="dcst:UUID" /> - <xs:element name="ContentTitleText" type="dcst:UserText" /> - <xs:element name="AnnotationText" type="dcst:UserText" minOccurs="0" /> - <xs:element name="IssueDate" type="xs:dateTime" /> - <xs:element name="ReelNumber" type="xs:positiveInteger" minOccurs="0" /> - <xs:element name="Language" type="xs:language" minOccurs="0" /> - <xs:element name="EditRate" type="dcst:RationalType" /> - <xs:element name="TimeCodeRate" type="xs:positiveInteger" /> - <xs:element name="StartTime" type="dcst:TimeCodeType" minOccurs="0" /> - <xs:element name="DisplayType" type="dcst:scopedTokenType" minOccurs="0" /> - <xs:element name="LoadFont" maxOccurs="unbounded"> - <xs:complexType> - <xs:simpleContent> - <xs:extension base="xs:anyURI"> - <xs:attribute name="ID" type="xs:string" use="optional" /> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - </xs:element> - <xs:element name="SubtitleList"> - <xs:complexType> - <xs:choice maxOccurs="unbounded"> - <xs:element name="Subtitle" type="dcst:SubtitleType" /> - <xs:element name="Font"> - <xs:complexType mixed="true"> - <xs:complexContent mixed="true"> - <xs:extension base="dcst:FontType"> - <xs:sequence> - <xs:element name="Subtitle" type="dcst:SubtitleType" maxOccurs="unbounded" /> - </xs:sequence> - </xs:extension> - </xs:complexContent> - </xs:complexType> - </xs:element> - </xs:choice> - </xs:complexType> - </xs:element> - </xs:sequence> - </xs:complexType> - - <!-- Subtitle --> - <xs:complexType name="SubtitleType"> - <xs:choice maxOccurs="unbounded"> - <xs:element name="Text" type="dcst:TextType" /> - <xs:element name="Image" type="dcst:ImageType" /> - <xs:element name="Font"> - <xs:complexType mixed="true"> - <xs:complexContent mixed="true"> - <xs:extension base="dcst:FontType"> - <xs:sequence> - <xs:element name="Text" type="dcst:TextType" /> - </xs:sequence> - </xs:extension> - </xs:complexContent> - </xs:complexType> - </xs:element> - </xs:choice> - <xs:attribute name="SpotNumber" type="xs:string" use="optional" /> - <xs:attribute name="TimeIn" type="dcst:TimeCodeType" use="required" /> - <xs:attribute name="TimeOut" type="dcst:TimeCodeType" use="required" /> - <xs:attribute name="FadeUpTime" type="dcst:TimeCodeType" use="optional" /> - <xs:attribute name="FadeDownTime" type="dcst:TimeCodeType" use="optional" /> - </xs:complexType> - - <!-- Image --> - <xs:complexType name="ImageType" mixed="false"> - <xs:simpleContent> - <xs:extension base="xs:anyURI"> - <xs:attribute name="Halign" use="optional" default="center"> - <xs:simpleType> - <xs:restriction base="xs:string"> - <xs:enumeration value="center" /> - <xs:enumeration value="left" /> - <xs:enumeration value="right" /> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - <xs:attribute name="Hposition" use="optional" default="0"> - <xs:simpleType> - <xs:restriction base="xs:decimal"> - <xs:minInclusive value="-100" /> - <xs:maxInclusive value="100" /> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - <xs:attribute name="Valign" use="optional" default="center"> - <xs:simpleType> - <xs:restriction base="xs:string"> - <xs:enumeration value="center" /> - <xs:enumeration value="bottom" /> - <xs:enumeration value="top" /> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - <xs:attribute name="Vposition" use="optional" default="0"> - <xs:simpleType> - <xs:restriction base="xs:decimal"> - <xs:minInclusive value="-100" /> - <xs:maxInclusive value="100" /> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - - <!-- Font --> - <xs:complexType name="FontType" mixed="true"> - <xs:attribute name="Script" use="optional" default="normal"> - <xs:simpleType> - <xs:restriction base="xs:string"> - <xs:enumeration value="normal" /> - <xs:enumeration value="super" /> - <xs:enumeration value="sub" /> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - <xs:attribute name="Effect" use="optional" default="none"> - <xs:simpleType> - <xs:restriction base="xs:string"> - <xs:enumeration value="none" /> - <xs:enumeration value="border" /> - <xs:enumeration value="shadow" /> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - <xs:attribute name="Italic" use="optional" default="no"> - <xs:simpleType> - <xs:restriction base="xs:string"> - <xs:enumeration value="yes" /> - <xs:enumeration value="no" /> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - <xs:attribute name="Underline" use="optional" default="no"> - <xs:simpleType> - <xs:restriction base="xs:string"> - <xs:enumeration value="yes" /> - <xs:enumeration value="no" /> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - <xs:attribute name="Weight" use="optional" default="normal"> - <xs:simpleType> - <xs:restriction base="xs:string"> - <xs:enumeration value="bold" /> - <xs:enumeration value="normal" /> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - <xs:attribute name="ID" type="xs:string" use="optional" /> - <xs:attribute name="Color" use="optional"> - <xs:simpleType> - <xs:restriction base="xs:hexBinary"> - <xs:length value="4" /> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - <xs:attribute name="EffectColor" use="optional"> - <xs:simpleType> - <xs:restriction base="xs:hexBinary"> - <xs:length value="4" /> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - <xs:attribute name="Size" use="optional" default="42"> - <xs:simpleType> - <xs:restriction base="xs:positiveInteger" /> - </xs:simpleType> - </xs:attribute> - <xs:attribute name="AspectAdjust" use="optional" type="xs:decimal" default="1.0" /> - <xs:attribute name="Spacing" use="optional" type="xs:decimal" default="1.0" /> - </xs:complexType> - - <!-- Text --> - <xs:complexType name="TextType" mixed="true"> - <xs:choice minOccurs="0" maxOccurs="unbounded"> - <xs:element name="Font" type="dcst:FontType" /> - <xs:element name="Ruby" type="dcst:RubyType" /> - <xs:element name="Space" type="dcst:SpaceType" /> - <xs:element name="HGroup" type="xs:string" /> - <xs:element name="Rotate" type="dcst:RotateType" /> - </xs:choice> - <xs:attribute name="Halign" use="optional" default="center"> - <xs:simpleType> - <xs:restriction base="xs:string"> - <xs:enumeration value="center" /> - <xs:enumeration value="left" /> - <xs:enumeration value="right" /> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - <xs:attribute name="Hposition" use="optional" default="0"> - <xs:simpleType> - <xs:restriction base="xs:decimal"> - <xs:minInclusive value="-100" /> - <xs:maxInclusive value="100" /> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - <xs:attribute name="Valign" use="optional" default="center"> - <xs:simpleType> - <xs:restriction base="xs:string"> - <xs:enumeration value="center" /> - <xs:enumeration value="bottom" /> - <xs:enumeration value="top" /> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - <xs:attribute name="Vposition" use="optional" default="0"> - <xs:simpleType> - <xs:restriction base="xs:decimal"> - <xs:minInclusive value="-100" /> - <xs:maxInclusive value="100" /> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - <xs:attribute name="Direction" use="optional" default="ltr"> - <xs:simpleType> - <xs:restriction base="xs:string"> - <xs:enumeration value="ltr" /> - <xs:enumeration value="rtl" /> - <xs:enumeration value="ttb" /> - <xs:enumeration value="btt" /> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - </xs:complexType> - - <!-- Rational Type --> - <xs:simpleType name="RationalType"> - <xs:restriction> - <xs:simpleType> - <xs:list itemType="xs:long" /> - </xs:simpleType> - <xs:length value="2" /> - </xs:restriction> - </xs:simpleType> - - <!-- TimeCode Type --> - <xs:simpleType name="TimeCodeType"> - <xs:restriction base="xs:string"> - <xs:pattern value="[0-2][0-9]:[0-5][0-9]:[0-5][0-9]:[0-2][0-9]" /> - </xs:restriction> - </xs:simpleType> - - <!-- Ruby Type --> - <xs:complexType name="RubyType"> - <xs:sequence> - <xs:element name="Rb" type="xs:string" /> - <xs:element name="Rt"> - <xs:complexType> - <xs:simpleContent> - <xs:extension base="xs:string"> - <xs:attribute name="Size" type="xs:decimal" use="optional" default="0.5" /> - <xs:attribute name="Position" use="optional" default="before"> - <xs:simpleType> - <xs:restriction base="xs:string"> - <xs:enumeration value="before" /> - <xs:enumeration value="after" /> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - <xs:attribute name="Spacing" type="xs:decimal" use="optional" default="0.5" /> - <xs:attribute name="Offset" type="xs:decimal" use="optional" default="0.5" /> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - </xs:element> - </xs:sequence> - </xs:complexType> - - <!-- Rotate Type --> - <xs:complexType name="RotateType"> - <xs:simpleContent> - <xs:extension base="xs:string"> - <xs:attribute name="Direction" use="optional" default="none"> - <xs:simpleType> - <xs:restriction base="xs:string"> - <xs:enumeration value="none" /> - <xs:enumeration value="left" /> - <xs:enumeration value="right" /> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - - <!-- Space Type --> - <xs:complexType name="SpaceType"> - <xs:simpleContent> - <xs:extension base="xs:string"> - <xs:attribute name="Size" type="xs:decimal" use="optional" default="1.0" /> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - - <!-- UUID Type --> - <xs:simpleType name="UUID"> - <xs:restriction base="xs:anyURI"> - <xs:pattern value="urn:uuid:[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}" /> - </xs:restriction> - </xs:simpleType> - - <!-- UserText Type --> - <xs:complexType name="UserText"> - <xs:simpleContent> - <xs:extension base="xs:string"> - <xs:attribute name="language" type="xs:language" use="optional" default="en" /> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - - <!-- Scoped Token Type --> - <xs:complexType name="scopedTokenType"> - <xs:simpleContent> - <xs:extension base="xs:token"> - <xs:attribute name="scope" type="xs:anyURI" use="optional" /> - </xs:extension> - </xs:simpleContent> - </xs:complexType> -</xs:schema> +<?xml version="1.0" encoding="UTF-8"?> +<xs:schema + targetNamespace="http://www.smpte-ra.org/schemas/428-7/2010/DCST" + xmlns:dcst="http://www.smpte-ra.org/schemas/428-7/2010/DCST" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + elementFormDefault="qualified" attributeFormDefault="unqualified"> + + <!-- SubtitleReel --> + <xs:element name="SubtitleReel" type="dcst:SubtitleReelType" /> + <xs:complexType name="SubtitleReelType"> + <xs:sequence> + <xs:element name="Id" type="dcst:UUID" /> + <xs:element name="ContentTitleText" type="dcst:UserText" /> + <xs:element name="AnnotationText" type="dcst:UserText" minOccurs="0" /> + <xs:element name="IssueDate" type="xs:dateTime" /> + <xs:element name="ReelNumber" type="xs:positiveInteger" minOccurs="0" /> + <xs:element name="Language" type="xs:language" minOccurs="0" /> + <xs:element name="EditRate" type="dcst:RationalType" /> + <xs:element name="TimeCodeRate" type="xs:positiveInteger" /> + <xs:element name="StartTime" type="dcst:TimeCodeType" minOccurs="0" /> + <xs:element name="DisplayType" type="dcst:scopedTokenType" minOccurs="0" /> + <xs:element name="LoadFont" maxOccurs="unbounded"> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:anyURI"> + <xs:attribute name="ID" type="xs:string" use="optional" /> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + <xs:element name="SubtitleList"> + <xs:complexType> + <xs:choice maxOccurs="unbounded"> + <xs:element name="Subtitle" type="dcst:SubtitleType" /> + <xs:element name="Font"> + <xs:complexType mixed="true"> + <xs:complexContent mixed="true"> + <xs:extension base="dcst:FontType"> + <xs:sequence> + <xs:element name="Subtitle" type="dcst:SubtitleType" maxOccurs="unbounded" /> + </xs:sequence> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + </xs:choice> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + + <!-- Subtitle --> + <xs:complexType name="SubtitleType"> + <xs:choice maxOccurs="unbounded"> + <xs:element name="Text" type="dcst:TextType" /> + <xs:element name="Image" type="dcst:ImageType" /> + <xs:element name="Font"> + <xs:complexType mixed="true"> + <xs:complexContent mixed="true"> + <xs:extension base="dcst:FontType"> + <xs:sequence> + <xs:element name="Text" type="dcst:TextType" /> + </xs:sequence> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + </xs:choice> + <xs:attribute name="SpotNumber" type="xs:string" use="optional" /> + <xs:attribute name="TimeIn" type="dcst:TimeCodeType" use="required" /> + <xs:attribute name="TimeOut" type="dcst:TimeCodeType" use="required" /> + <xs:attribute name="FadeUpTime" type="dcst:TimeCodeType" use="optional" /> + <xs:attribute name="FadeDownTime" type="dcst:TimeCodeType" use="optional" /> + </xs:complexType> + + <!-- Image --> + <xs:complexType name="ImageType" mixed="false"> + <xs:simpleContent> + <xs:extension base="xs:anyURI"> + <xs:attribute name="Halign" use="optional" default="center"> + <xs:simpleType> + <xs:restriction base="xs:string"> + <xs:enumeration value="center" /> + <xs:enumeration value="left" /> + <xs:enumeration value="right" /> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="Hposition" use="optional" default="0"> + <xs:simpleType> + <xs:restriction base="xs:decimal"> + <xs:minInclusive value="-100" /> + <xs:maxInclusive value="100" /> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="Valign" use="optional" default="center"> + <xs:simpleType> + <xs:restriction base="xs:string"> + <xs:enumeration value="center" /> + <xs:enumeration value="bottom" /> + <xs:enumeration value="top" /> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="Vposition" use="optional" default="0"> + <xs:simpleType> + <xs:restriction base="xs:decimal"> + <xs:minInclusive value="-100" /> + <xs:maxInclusive value="100" /> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + + <!-- Font --> + <xs:complexType name="FontType" mixed="true"> + <xs:attribute name="Script" use="optional" default="normal"> + <xs:simpleType> + <xs:restriction base="xs:string"> + <xs:enumeration value="normal" /> + <xs:enumeration value="super" /> + <xs:enumeration value="sub" /> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="Effect" use="optional" default="none"> + <xs:simpleType> + <xs:restriction base="xs:string"> + <xs:enumeration value="none" /> + <xs:enumeration value="border" /> + <xs:enumeration value="shadow" /> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="Italic" use="optional" default="no"> + <xs:simpleType> + <xs:restriction base="xs:string"> + <xs:enumeration value="yes" /> + <xs:enumeration value="no" /> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="Underline" use="optional" default="no"> + <xs:simpleType> + <xs:restriction base="xs:string"> + <xs:enumeration value="yes" /> + <xs:enumeration value="no" /> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="Weight" use="optional" default="normal"> + <xs:simpleType> + <xs:restriction base="xs:string"> + <xs:enumeration value="bold" /> + <xs:enumeration value="normal" /> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="ID" type="xs:string" use="optional" /> + <xs:attribute name="Color" use="optional"> + <xs:simpleType> + <xs:restriction base="xs:hexBinary"> + <xs:length value="4" /> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="EffectColor" use="optional"> + <xs:simpleType> + <xs:restriction base="xs:hexBinary"> + <xs:length value="4" /> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="Size" use="optional" default="42"> + <xs:simpleType> + <xs:restriction base="xs:positiveInteger" /> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="AspectAdjust" use="optional" type="xs:decimal" default="1.0" /> + <xs:attribute name="Spacing" use="optional" type="xs:decimal" default="1.0" /> + </xs:complexType> + + <!-- Text --> + <xs:complexType name="TextType" mixed="true"> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element name="Font" type="dcst:FontType" /> + <xs:element name="Ruby" type="dcst:RubyType" /> + <xs:element name="Space" type="dcst:SpaceType" /> + <xs:element name="HGroup" type="xs:string" /> + <xs:element name="Rotate" type="dcst:RotateType" /> + </xs:choice> + <xs:attribute name="Halign" use="optional" default="center"> + <xs:simpleType> + <xs:restriction base="xs:string"> + <xs:enumeration value="center" /> + <xs:enumeration value="left" /> + <xs:enumeration value="right" /> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="Hposition" use="optional" default="0"> + <xs:simpleType> + <xs:restriction base="xs:decimal"> + <xs:minInclusive value="-100" /> + <xs:maxInclusive value="100" /> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="Valign" use="optional" default="center"> + <xs:simpleType> + <xs:restriction base="xs:string"> + <xs:enumeration value="center" /> + <xs:enumeration value="bottom" /> + <xs:enumeration value="top" /> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="Vposition" use="optional" default="0"> + <xs:simpleType> + <xs:restriction base="xs:decimal"> + <xs:minInclusive value="-100" /> + <xs:maxInclusive value="100" /> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="Direction" use="optional" default="ltr"> + <xs:simpleType> + <xs:restriction base="xs:string"> + <xs:enumeration value="ltr" /> + <xs:enumeration value="rtl" /> + <xs:enumeration value="ttb" /> + <xs:enumeration value="btt" /> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + </xs:complexType> + + <!-- Rational Type --> + <xs:simpleType name="RationalType"> + <xs:restriction> + <xs:simpleType> + <xs:list itemType="xs:long" /> + </xs:simpleType> + <xs:length value="2" /> + </xs:restriction> + </xs:simpleType> + + <!-- TimeCode Type --> + <xs:simpleType name="TimeCodeType"> + <xs:restriction base="xs:string"> + <xs:pattern value="[0-2][0-9]:[0-5][0-9]:[0-5][0-9]:[0-2][0-9]" /> + </xs:restriction> + </xs:simpleType> + + <!-- Ruby Type --> + <xs:complexType name="RubyType"> + <xs:sequence> + <xs:element name="Rb" type="xs:string" /> + <xs:element name="Rt"> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute name="Size" type="xs:decimal" use="optional" default="0.5" /> + <xs:attribute name="Position" use="optional" default="before"> + <xs:simpleType> + <xs:restriction base="xs:string"> + <xs:enumeration value="before" /> + <xs:enumeration value="after" /> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="Spacing" type="xs:decimal" use="optional" default="0.5" /> + <xs:attribute name="Offset" type="xs:decimal" use="optional" default="0.5" /> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + + <!-- Rotate Type --> + <xs:complexType name="RotateType"> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute name="Direction" use="optional" default="none"> + <xs:simpleType> + <xs:restriction base="xs:string"> + <xs:enumeration value="none" /> + <xs:enumeration value="left" /> + <xs:enumeration value="right" /> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + + <!-- Space Type --> + <xs:complexType name="SpaceType"> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute name="Size" type="xs:decimal" use="optional" default="1.0" /> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + + <!-- UUID Type --> + <xs:simpleType name="UUID"> + <xs:restriction base="xs:anyURI"> + <xs:pattern value="urn:uuid:[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}" /> + </xs:restriction> + </xs:simpleType> + + <!-- UserText Type --> + <xs:complexType name="UserText"> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute name="language" type="xs:language" use="optional" default="en" /> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + + <!-- Scoped Token Type --> + <xs:complexType name="scopedTokenType"> + <xs:simpleContent> + <xs:extension base="xs:token"> + <xs:attribute name="scope" type="xs:anyURI" use="optional" /> + </xs:extension> + </xs:simpleContent> + </xs:complexType> +</xs:schema> diff --git a/src/Resources/SMPTE-428-7-2010-DCST.xsd.gz b/src/ui/Resources/SMPTE-428-7-2010-DCST.xsd.gz similarity index 100% rename from src/Resources/SMPTE-428-7-2010-DCST.xsd.gz rename to src/ui/Resources/SMPTE-428-7-2010-DCST.xsd.gz diff --git a/src/Resources/SMPTE-428-7-2014-DCST.xsd b/src/ui/Resources/SMPTE-428-7-2014-DCST.xsd similarity index 100% rename from src/Resources/SMPTE-428-7-2014-DCST.xsd rename to src/ui/Resources/SMPTE-428-7-2014-DCST.xsd diff --git a/src/Resources/SMPTE-428-7-2014-DCST.xsd.gz b/src/ui/Resources/SMPTE-428-7-2014-DCST.xsd.gz similarity index 100% rename from src/Resources/SMPTE-428-7-2014-DCST.xsd.gz rename to src/ui/Resources/SMPTE-428-7-2014-DCST.xsd.gz diff --git a/src/Resources/TesseractDictionaries.xml b/src/ui/Resources/TesseractDictionaries.xml similarity index 98% rename from src/Resources/TesseractDictionaries.xml rename to src/ui/Resources/TesseractDictionaries.xml index 8df4e9181..6b822bc71 100644 --- a/src/Resources/TesseractDictionaries.xml +++ b/src/ui/Resources/TesseractDictionaries.xml @@ -1,288 +1,288 @@ -<!-- Alternately from https://sourceforge.net/projects/tesseract-ocr-alt/files/ --> -<TesseractDictionaries> - <Dictionary> - <EnglishName>Afrikaans</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.afr.tar.gz</DownloadLink> - <Description>Afrikaans language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Albanian</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.sqi.tar.gz</DownloadLink> - <Description>Albanian language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Arabic</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.ara.tar.gz</DownloadLink> - <Description>Arabic language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Azerbaijani</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.aze.tar.gz</DownloadLink> - <Description>Azerbaijani language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Basque</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.eus.tar.gz</DownloadLink> - <Description>Basque language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Belarusian</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.bel.tar.gz</DownloadLink> - <Description>Belarusian language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Bengali</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.ben.tar.gz</DownloadLink> - <Description>Bengali language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Bulgarian</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.bul.tar.gz</DownloadLink> - <Description>Bulgarian language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Catalan</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.cat.tar.gz</DownloadLink> - <Description>Catalan language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Chinese (Simplified)</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.chi_sim.tar.gz</DownloadLink> - <Description>Chinese (Simplified) language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Chinese (Traditional)</EnglishName> - <DownloadLink>https://github.com/tesseract-ocr/tessdata/raw/bf82613055ebc6e63d9e3b438a5c234bfd638c93/chi_tra.traineddata</DownloadLink> - <Description>Chinese (Traditional) language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Cherokee</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.chr.tar.gz</DownloadLink> - <Description>Cherokee language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Croatian</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.hrv.tar.gz</DownloadLink> - <Description>Croatian language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Czech</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.ces.tar.gz</DownloadLink> - <Description>Czech language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Danish</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.dan.tar.gz</DownloadLink> - <Description>Danish language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Dutch</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.nld.tar.gz</DownloadLink> - <Description>Dutch language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>English</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.eng.tar.gz</DownloadLink> - <Description>English language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Estonian</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.est.tar.gz</DownloadLink> - <Description>Estonian language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Finnish</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.fin.tar.gz</DownloadLink> - <Description>Finnish language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>French</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.fra.tar.gz</DownloadLink> - <Description>French language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Galician</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.glg.tar.gz</DownloadLink> - <Description>Galician language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>German</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.deu.tar.gz</DownloadLink> - <Description>German language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Greek</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.ell.tar.gz</DownloadLink> - <Description>Greek language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Hebrew</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.heb.tar.gz</DownloadLink> - <Description>Hebrew language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Hindi</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.hin.tar.gz</DownloadLink> - <Description>Hindi language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Hungarian</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.hun.tar.gz</DownloadLink> - <Description>Hungarian language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Icelandic</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.isl.tar.gz</DownloadLink> - <Description>Icelandic language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Indonesian</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.ind.tar.gz</DownloadLink> - <Description>Indonesian language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Italian</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.ita.tar.gz</DownloadLink> - <Description>Italian language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Japanese</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.jpn.tar.gz</DownloadLink> - <Description>Japanese language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Kannada</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.kan.tar.gz</DownloadLink> - <Description>Kannada language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Korean</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.kor.tar.gz</DownloadLink> - <Description>Korean language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Latvian</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.lav.tar.gz</DownloadLink> - <Description>Latvian language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Lithuanian</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.lit.tar.gz</DownloadLink> - <Description>Lithuanian language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Macedonian</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.mkd.tar.gz</DownloadLink> - <Description>Macedonian language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Malay</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.msa.tar.gz</DownloadLink> - <Description>Malay language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Malayalam</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.mal.tar.gz</DownloadLink> - <Description>Malayalam language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Maltese</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.mlt.tar.gz</DownloadLink> - <Description>Maltese language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Norwegian</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.nor.tar.gz</DownloadLink> - <Description>Norwegian language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Persian</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.fas.tar.gz</DownloadLink> - <Description>Persian/Farsi language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Polish</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.pol.tar.gz</DownloadLink> - <Description>Polish language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Portuguese</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.por.tar.gz</DownloadLink> - <Description>Portuguese language data for Tesseract 3.02 </Description> - </Dictionary> - <Dictionary> - <EnglishName>Romanian</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.ron.tar.gz</DownloadLink> - <Description>Romanian language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Russian</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.rus.tar.gz</DownloadLink> - <Description>Russian Language Data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Serbian (Latin)</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.srp.tar.gz</DownloadLink> - <Description>Serbian (Latin) language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Slovak</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.slk.tar.gz</DownloadLink> - <Description>Slovak language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Slovenian</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.slv.tar.gz</DownloadLink> - <Description>Slovenian language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Spanish</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.spa.tar.gz</DownloadLink> - <Description>Spanish language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Swahili</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.swa.tar.gz</DownloadLink> - <Description>Swahili language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Swedish</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.swe.tar.gz</DownloadLink> - <Description>Swedish language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Tagalog</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.tgl.tar.gz</DownloadLink> - <Description>Tagalog language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Tamil</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.tam.tar.gz</DownloadLink> - <Description>Tamil language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Thai</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.tha.tar.gz</DownloadLink> - <Description>Thai language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Telugu</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.tel.tar.gz</DownloadLink> - <Description>Telugu language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Turkish</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.tur.tar.gz</DownloadLink> - <Description>Turkish language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Ukrainian</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.ukr.tar.gz</DownloadLink> - <Description>Ukrainian language data for Tesseract 3.02</Description> - </Dictionary> - <Dictionary> - <EnglishName>Vietnamese</EnglishName> - <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.vie.tar.gz</DownloadLink> - <Description>Vietnamese Language Data for Tesseract 3.02</Description> - </Dictionary> +<!-- Alternately from https://sourceforge.net/projects/tesseract-ocr-alt/files/ --> +<TesseractDictionaries> + <Dictionary> + <EnglishName>Afrikaans</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.afr.tar.gz</DownloadLink> + <Description>Afrikaans language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Albanian</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.sqi.tar.gz</DownloadLink> + <Description>Albanian language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Arabic</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.ara.tar.gz</DownloadLink> + <Description>Arabic language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Azerbaijani</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.aze.tar.gz</DownloadLink> + <Description>Azerbaijani language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Basque</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.eus.tar.gz</DownloadLink> + <Description>Basque language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Belarusian</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.bel.tar.gz</DownloadLink> + <Description>Belarusian language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Bengali</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.ben.tar.gz</DownloadLink> + <Description>Bengali language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Bulgarian</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.bul.tar.gz</DownloadLink> + <Description>Bulgarian language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Catalan</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.cat.tar.gz</DownloadLink> + <Description>Catalan language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Chinese (Simplified)</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.chi_sim.tar.gz</DownloadLink> + <Description>Chinese (Simplified) language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Chinese (Traditional)</EnglishName> + <DownloadLink>https://github.com/tesseract-ocr/tessdata/raw/bf82613055ebc6e63d9e3b438a5c234bfd638c93/chi_tra.traineddata</DownloadLink> + <Description>Chinese (Traditional) language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Cherokee</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.chr.tar.gz</DownloadLink> + <Description>Cherokee language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Croatian</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.hrv.tar.gz</DownloadLink> + <Description>Croatian language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Czech</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.ces.tar.gz</DownloadLink> + <Description>Czech language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Danish</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.dan.tar.gz</DownloadLink> + <Description>Danish language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Dutch</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.nld.tar.gz</DownloadLink> + <Description>Dutch language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>English</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.eng.tar.gz</DownloadLink> + <Description>English language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Estonian</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.est.tar.gz</DownloadLink> + <Description>Estonian language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Finnish</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.fin.tar.gz</DownloadLink> + <Description>Finnish language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>French</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.fra.tar.gz</DownloadLink> + <Description>French language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Galician</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.glg.tar.gz</DownloadLink> + <Description>Galician language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>German</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.deu.tar.gz</DownloadLink> + <Description>German language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Greek</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.ell.tar.gz</DownloadLink> + <Description>Greek language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Hebrew</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.heb.tar.gz</DownloadLink> + <Description>Hebrew language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Hindi</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.hin.tar.gz</DownloadLink> + <Description>Hindi language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Hungarian</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.hun.tar.gz</DownloadLink> + <Description>Hungarian language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Icelandic</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.isl.tar.gz</DownloadLink> + <Description>Icelandic language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Indonesian</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.ind.tar.gz</DownloadLink> + <Description>Indonesian language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Italian</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.ita.tar.gz</DownloadLink> + <Description>Italian language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Japanese</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.jpn.tar.gz</DownloadLink> + <Description>Japanese language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Kannada</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.kan.tar.gz</DownloadLink> + <Description>Kannada language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Korean</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.kor.tar.gz</DownloadLink> + <Description>Korean language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Latvian</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.lav.tar.gz</DownloadLink> + <Description>Latvian language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Lithuanian</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.lit.tar.gz</DownloadLink> + <Description>Lithuanian language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Macedonian</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.mkd.tar.gz</DownloadLink> + <Description>Macedonian language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Malay</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.msa.tar.gz</DownloadLink> + <Description>Malay language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Malayalam</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.mal.tar.gz</DownloadLink> + <Description>Malayalam language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Maltese</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.mlt.tar.gz</DownloadLink> + <Description>Maltese language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Norwegian</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.nor.tar.gz</DownloadLink> + <Description>Norwegian language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Persian</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.fas.tar.gz</DownloadLink> + <Description>Persian/Farsi language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Polish</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.pol.tar.gz</DownloadLink> + <Description>Polish language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Portuguese</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.por.tar.gz</DownloadLink> + <Description>Portuguese language data for Tesseract 3.02 </Description> + </Dictionary> + <Dictionary> + <EnglishName>Romanian</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.ron.tar.gz</DownloadLink> + <Description>Romanian language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Russian</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.rus.tar.gz</DownloadLink> + <Description>Russian Language Data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Serbian (Latin)</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.srp.tar.gz</DownloadLink> + <Description>Serbian (Latin) language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Slovak</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.slk.tar.gz</DownloadLink> + <Description>Slovak language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Slovenian</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.slv.tar.gz</DownloadLink> + <Description>Slovenian language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Spanish</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.spa.tar.gz</DownloadLink> + <Description>Spanish language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Swahili</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.swa.tar.gz</DownloadLink> + <Description>Swahili language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Swedish</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.swe.tar.gz</DownloadLink> + <Description>Swedish language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Tagalog</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.tgl.tar.gz</DownloadLink> + <Description>Tagalog language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Tamil</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.tam.tar.gz</DownloadLink> + <Description>Tamil language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Thai</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.tha.tar.gz</DownloadLink> + <Description>Thai language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Telugu</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.tel.tar.gz</DownloadLink> + <Description>Telugu language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Turkish</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.tur.tar.gz</DownloadLink> + <Description>Turkish language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Ukrainian</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.ukr.tar.gz</DownloadLink> + <Description>Ukrainian language data for Tesseract 3.02</Description> + </Dictionary> + <Dictionary> + <EnglishName>Vietnamese</EnglishName> + <DownloadLink>https://github.com/SubtitleEdit/support-files/raw/master/tessdata/tesseract-ocr-3.02.vie.tar.gz</DownloadLink> + <Description>Vietnamese Language Data for Tesseract 3.02</Description> + </Dictionary> </TesseractDictionaries> \ No newline at end of file diff --git a/src/Resources/TesseractDictionaries.xml.gz b/src/ui/Resources/TesseractDictionaries.xml.gz similarity index 100% rename from src/Resources/TesseractDictionaries.xml.gz rename to src/ui/Resources/TesseractDictionaries.xml.gz diff --git a/src/Resources/Transparent Background.png b/src/ui/Resources/Transparent Background.png similarity index 100% rename from src/Resources/Transparent Background.png rename to src/ui/Resources/Transparent Background.png diff --git a/src/Resources/bookmark22.png b/src/ui/Resources/bookmark22.png similarity index 100% rename from src/Resources/bookmark22.png rename to src/ui/Resources/bookmark22.png diff --git a/src/Resources/nOCR_TesseractHelper.xml.gz b/src/ui/Resources/nOCR_TesseractHelper.xml.gz similarity index 100% rename from src/Resources/nOCR_TesseractHelper.xml.gz rename to src/ui/Resources/nOCR_TesseractHelper.xml.gz diff --git a/src/Resources/pictureBoxFS.Image.png b/src/ui/Resources/pictureBoxFS.Image.png similarity index 100% rename from src/Resources/pictureBoxFS.Image.png rename to src/ui/Resources/pictureBoxFS.Image.png diff --git a/src/Resources/pictureBoxFSDown.Image.png b/src/ui/Resources/pictureBoxFSDown.Image.png similarity index 100% rename from src/Resources/pictureBoxFSDown.Image.png rename to src/ui/Resources/pictureBoxFSDown.Image.png diff --git a/src/Resources/pictureBoxFSOver.Image.png b/src/ui/Resources/pictureBoxFSOver.Image.png similarity index 100% rename from src/Resources/pictureBoxFSOver.Image.png rename to src/ui/Resources/pictureBoxFSOver.Image.png diff --git a/src/Resources/pictureBoxFastForward.Image.png b/src/ui/Resources/pictureBoxFastForward.Image.png similarity index 100% rename from src/Resources/pictureBoxFastForward.Image.png rename to src/ui/Resources/pictureBoxFastForward.Image.png diff --git a/src/Resources/pictureBoxFastForwardMouseDown.Image.png b/src/ui/Resources/pictureBoxFastForwardMouseDown.Image.png similarity index 100% rename from src/Resources/pictureBoxFastForwardMouseDown.Image.png rename to src/ui/Resources/pictureBoxFastForwardMouseDown.Image.png diff --git a/src/Resources/pictureBoxFastForwardMouseOver.Image.png b/src/ui/Resources/pictureBoxFastForwardMouseOver.Image.png similarity index 100% rename from src/Resources/pictureBoxFastForwardMouseOver.Image.png rename to src/ui/Resources/pictureBoxFastForwardMouseOver.Image.png diff --git a/src/Resources/pictureBoxNoFS.Image.png b/src/ui/Resources/pictureBoxNoFS.Image.png similarity index 100% rename from src/Resources/pictureBoxNoFS.Image.png rename to src/ui/Resources/pictureBoxNoFS.Image.png diff --git a/src/Resources/pictureBoxNoFSDown.Image.png b/src/ui/Resources/pictureBoxNoFSDown.Image.png similarity index 100% rename from src/Resources/pictureBoxNoFSDown.Image.png rename to src/ui/Resources/pictureBoxNoFSDown.Image.png diff --git a/src/Resources/pictureBoxNoFSOver.Image.png b/src/ui/Resources/pictureBoxNoFSOver.Image.png similarity index 100% rename from src/Resources/pictureBoxNoFSOver.Image.png rename to src/ui/Resources/pictureBoxNoFSOver.Image.png diff --git a/src/Resources/pictureBoxReverse.Image.png b/src/ui/Resources/pictureBoxReverse.Image.png similarity index 100% rename from src/Resources/pictureBoxReverse.Image.png rename to src/ui/Resources/pictureBoxReverse.Image.png diff --git a/src/Resources/pictureBoxReverseMouseDown.Image.png b/src/ui/Resources/pictureBoxReverseMouseDown.Image.png similarity index 100% rename from src/Resources/pictureBoxReverseMouseDown.Image.png rename to src/ui/Resources/pictureBoxReverseMouseDown.Image.png diff --git a/src/Resources/pictureBoxReverseMouseOver.Image.png b/src/ui/Resources/pictureBoxReverseMouseOver.Image.png similarity index 100% rename from src/Resources/pictureBoxReverseMouseOver.Image.png rename to src/ui/Resources/pictureBoxReverseMouseOver.Image.png diff --git a/src/SubtitleEdit.csproj b/src/ui/SubtitleEdit.csproj similarity index 97% rename from src/SubtitleEdit.csproj rename to src/ui/SubtitleEdit.csproj index d7a15815d..18905bddd 100644 --- a/src/SubtitleEdit.csproj +++ b/src/ui/SubtitleEdit.csproj @@ -1,1955 +1,1955 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <Import Project="packages\ILRepack.2.0.18\build\ILRepack.props" Condition="Exists('packages\ILRepack.2.0.18\build\ILRepack.props')" /> - <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> - <PropertyGroup> - <AppDesignerFolder>Properties</AppDesignerFolder> - <ApplicationIcon>Icons\SE.ico</ApplicationIcon> - <AssemblyName>SubtitleEdit</AssemblyName> - <BootstrapperEnabled>true</BootstrapperEnabled> - <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> - <FileAlignment>512</FileAlignment> - <ManifestCertificateThumbprint>DCCE7922B5E425ADB221E06DC2FB405664CF8F63</ManifestCertificateThumbprint> - <MapFileExtensions>true</MapFileExtensions> - <OutputType>WinExe</OutputType> - <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> - <ProjectGuid>{511A5B59-1C35-4719-8536-23B19AF9B21A}</ProjectGuid> - <PublishWizardCompleted>true</PublishWizardCompleted> - <RestorePackages>true</RestorePackages> - <RootNamespace>Nikse.SubtitleEdit</RootNamespace> - <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">.\</SolutionDir> - <TargetFrameworkProfile> - </TargetFrameworkProfile> - <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion> - </PropertyGroup> - <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> - <AllowUnsafeBlocks>true</AllowUnsafeBlocks> - <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet> - <DebugSymbols>true</DebugSymbols> - <DebugType>full</DebugType> - <DefineConstants>TRACE;DEBUG</DefineConstants> - <ErrorReport>prompt</ErrorReport> - <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> - <Optimize>false</Optimize> - <OutputPath>bin\Debug\</OutputPath> - <PlatformTarget>AnyCPU</PlatformTarget> - <UseVSHostingProcess>true</UseVSHostingProcess> - <WarningLevel>4</WarningLevel> - <Prefer32Bit>false</Prefer32Bit> - </PropertyGroup> - <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> - <AllowUnsafeBlocks>true</AllowUnsafeBlocks> - <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet> - <DebugType>pdbonly</DebugType> - <DefineConstants>TRACE</DefineConstants> - <ErrorReport>prompt</ErrorReport> - <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> - <Optimize>true</Optimize> - <OutputPath>bin\Release\</OutputPath> - <PlatformTarget>AnyCPU</PlatformTarget> - <UseVSHostingProcess>true</UseVSHostingProcess> - <WarningLevel>4</WarningLevel> - <Prefer32Bit>false</Prefer32Bit> - </PropertyGroup> - <ItemGroup> - <Reference Include="Interop.QuartzTypeLib, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"> - <EmbedInteropTypes>True</EmbedInteropTypes> - <HintPath>DLLs\Interop.QuartzTypeLib.dll</HintPath> - <SpecificVersion>False</SpecificVersion> - </Reference> - <Reference Include="NHunspell, Version=1.2.5554.16953, Culture=neutral, PublicKeyToken=1ac793ea843b4366, processorArchitecture=MSIL"> - <SpecificVersion>False</SpecificVersion> - <HintPath>packages\NHunspell.1.2.5554.16953\lib\net\NHunspell.dll</HintPath> - </Reference> - <Reference Include="System" /> - <Reference Include="System.Data" /> - <Reference Include="System.Drawing" /> - <Reference Include="System.EnterpriseServices" /> - <Reference Include="System.Web.Services" /> - <Reference Include="System.Windows.Forms" /> - <Reference Include="System.Xml" /> - </ItemGroup> - <ItemGroup> - <Compile Include="Controls\SETextBox.cs"> - <SubType>Component</SubType> - </Compile> - <Compile Include="Controls\VideoPlayerContainer.cs"> - <SubType>Component</SubType> - </Compile> - <Compile Include="Controls\TimeUpDown.cs"> - <SubType>UserControl</SubType> - </Compile> - <Compile Include="Controls\TimeUpDown.Designer.cs"> - <DependentUpon>TimeUpDown.cs</DependentUpon> - </Compile> - <Compile Include="Controls\AudioVisualizer.cs"> - <SubType>UserControl</SubType> - </Compile> - <Compile Include="Controls\AudioVisualizer.Designer.cs"> - <DependentUpon>AudioVisualizer.cs</DependentUpon> - </Compile> - <Compile Include="Forms\AlignmentPickerJapanese.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\AlignmentPickerJapanese.Designer.cs"> - <DependentUpon>AlignmentPickerJapanese.cs</DependentUpon> - </Compile> - <Compile Include="Forms\BatchConvertMkvEnding.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\BatchConvertMkvEnding.Designer.cs"> - <DependentUpon>BatchConvertMkvEnding.cs</DependentUpon> - </Compile> - <Compile Include="Forms\BatchConvertTsSettings.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\BatchConvertTsSettings.Designer.cs"> - <DependentUpon>BatchConvertTsSettings.cs</DependentUpon> - </Compile> - <Compile Include="Forms\BookmarkAdd.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\BookmarkAdd.Designer.cs"> - <DependentUpon>BookmarkAdd.cs</DependentUpon> - </Compile> - <Compile Include="Forms\AddWaveformBatch.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\AddWaveformBatch.Designer.cs"> - <DependentUpon>AddWaveformBatch.cs</DependentUpon> - </Compile> - <Compile Include="Forms\AudioToText.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\AudioToText.Designer.cs"> - <DependentUpon>AudioToText.cs</DependentUpon> - </Compile> - <Compile Include="Forms\BookmarksGoTo.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\BookmarksGoTo.Designer.cs"> - <DependentUpon>BookmarksGoTo.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Cavena890SaveOptions.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Cavena890SaveOptions.Designer.cs"> - <DependentUpon>Cavena890SaveOptions.cs</DependentUpon> - </Compile> - <Compile Include="Forms\CheckForUpdates.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\CheckForUpdates.Designer.cs"> - <DependentUpon>CheckForUpdates.cs</DependentUpon> - </Compile> - <Compile Include="Forms\ChooseFontName.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\ChooseFontName.Designer.cs"> - <DependentUpon>ChooseFontName.cs</DependentUpon> - </Compile> - <Compile Include="Forms\ColorChooser.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\DCinema\DCinemaPropertiesInterop.cs"> - <SubType>form</SubType> - </Compile> - <Compile Include="Forms\DCinema\DCinemaPropertiesInterop.Designer.cs"> - <DependentUpon>DCinemaPropertiesInterop.cs</DependentUpon> - </Compile> - <Compile Include="Forms\DCinema\DCinemaPropertiesSmpte.cs"> - <SubType>form</SubType> - </Compile> - <Compile Include="Forms\DCinema\DCinemaPropertiesSmpte.Designer.cs"> - <DependentUpon>DCinemaPropertiesSmpte.cs</DependentUpon> - </Compile> - <Compile Include="Forms\DoNotBreakAfterListEdit.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\DoNotBreakAfterListEdit.Designer.cs"> - <DependentUpon>DoNotBreakAfterListEdit.cs</DependentUpon> - </Compile> - <Compile Include="Forms\About.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\About.Designer.cs"> - <DependentUpon>About.cs</DependentUpon> - </Compile> - <Compile Include="Controls\SubtitleListView.cs"> - <SubType>Component</SubType> - </Compile> - <Compile Include="Forms\AddToNames.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\AddToNames.Designer.cs"> - <DependentUpon>AddToNames.cs</DependentUpon> - </Compile> - <Compile Include="Forms\DownloadFfmpeg.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\DownloadFfmpeg.Designer.cs"> - <DependentUpon>DownloadFfmpeg.cs</DependentUpon> - </Compile> - <Compile Include="Forms\DvdStudioProProperties.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\DvdStudioProProperties.Designer.cs"> - <DependentUpon>DvdStudioProProperties.cs</DependentUpon> - </Compile> - <Compile Include="Forms\EbuLanguageCode.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\EbuLanguageCode.Designer.cs"> - <DependentUpon>EbuLanguageCode.cs</DependentUpon> - </Compile> - <Compile Include="Forms\ExportFcpXmlAdvanced.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\ExportFcpXmlAdvanced.Designer.cs"> - <DependentUpon>ExportFcpXmlAdvanced.cs</DependentUpon> - </Compile> - <Compile Include="Forms\ExportPngXmlDialogOpenFolder.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\ExportPngXmlDialogOpenFolder.Designer.cs"> - <DependentUpon>ExportPngXmlDialogOpenFolder.cs</DependentUpon> - </Compile> - <Compile Include="Forms\ImportCdg.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\ImportCdg.Designer.cs"> - <DependentUpon>ImportCdg.cs</DependentUpon> - </Compile> - <Compile Include="Forms\ImportFinalDraft.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\ImportFinalDraft.Designer.cs"> - <DependentUpon>ImportFinalDraft.cs</DependentUpon> - </Compile> - <Compile Include="Forms\MultipleReplaceExportImport.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\MultipleReplaceExportImport.Designer.cs"> - <DependentUpon>MultipleReplaceExportImport.cs</DependentUpon> - </Compile> - <Compile Include="Forms\NetflixFixErrors.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\NetflixFixErrors.Designer.cs"> - <DependentUpon>NetflixFixErrors.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Ocr\AddBeterMultiMatch.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Ocr\AddBeterMultiMatch.Designer.cs"> - <DependentUpon>AddBeterMultiMatch.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Ocr\AddBetterMultiMatchNOcr.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Ocr\AddBetterMultiMatchNOcr.Designer.cs"> - <DependentUpon>AddBetterMultiMatchNOcr.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Ocr\AddToOcrReplaceList.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Ocr\AddToOcrReplaceList.Designer.cs"> - <DependentUpon>AddToOcrReplaceList.cs</DependentUpon> - </Compile> - <Compile Include="Forms\AddToUserDic.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\AddToUserDic.Designer.cs"> - <DependentUpon>AddToUserDic.cs</DependentUpon> - </Compile> - <Compile Include="Forms\AddWaveform.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\AddWaveform.Designer.cs"> - <DependentUpon>AddWaveform.cs</DependentUpon> - </Compile> - <Compile Include="Forms\AlignmentPicker.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\AlignmentPicker.Designer.cs"> - <DependentUpon>AlignmentPicker.cs</DependentUpon> - </Compile> - <Compile Include="Forms\ApplyDurationLimits.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\ApplyDurationLimits.Designer.cs"> - <DependentUpon>ApplyDurationLimits.cs</DependentUpon> - </Compile> - <Compile Include="Forms\AutoBreakUnbreakLines.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\AutoBreakUnbreakLines.Designer.cs"> - <DependentUpon>AutoBreakUnbreakLines.cs</DependentUpon> - </Compile> - <Compile Include="Forms\BatchConvert.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\BatchConvert.Designer.cs"> - <DependentUpon>BatchConvert.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Beamer.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Beamer.Designer.cs"> - <DependentUpon>Beamer.cs</DependentUpon> - </Compile> - <Compile Include="Forms\ChangeCasing.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\ChangeCasing.Designer.cs"> - <DependentUpon>ChangeCasing.cs</DependentUpon> - </Compile> - <Compile Include="Forms\ChangeCasingNames.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\ChangeCasingNames.Designer.cs"> - <DependentUpon>ChangeCasingNames.cs</DependentUpon> - </Compile> - <Compile Include="Forms\ChangeFrameRate.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\ChangeFrameRate.Designer.cs"> - <DependentUpon>ChangeFrameRate.cs</DependentUpon> - </Compile> - <Compile Include="Forms\ChangeSpeedInPercent.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\ChangeSpeedInPercent.Designer.cs"> - <DependentUpon>ChangeSpeedInPercent.cs</DependentUpon> - </Compile> - <Compile Include="Forms\ChooseAudioTrack.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\ChooseAudioTrack.Designer.cs"> - <DependentUpon>ChooseAudioTrack.cs</DependentUpon> - </Compile> - <Compile Include="Forms\ChooseLanguage.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\ChooseLanguage.Designer.cs"> - <DependentUpon>ChooseLanguage.cs</DependentUpon> - </Compile> - <Compile Include="Forms\ChooseEncoding.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\ChooseEncoding.Designer.cs"> - <DependentUpon>ChooseEncoding.cs</DependentUpon> - </Compile> - <Compile Include="Forms\ChooseResolution.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\ChooseResolution.Designer.cs"> - <DependentUpon>ChooseResolution.cs</DependentUpon> - </Compile> - <Compile Include="Forms\ChooseStyle.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\ChooseStyle.Designer.cs"> - <DependentUpon>ChooseStyle.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Compare.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Compare.Designer.cs"> - <DependentUpon>Compare.cs</DependentUpon> - </Compile> - <Compile Include="Forms\AdjustDisplayDuration.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\AdjustDisplayDuration.Designer.cs"> - <DependentUpon>AdjustDisplayDuration.cs</DependentUpon> - </Compile> - <Compile Include="Forms\DurationsBridgeGaps.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\DurationsBridgeGaps.Designer.cs"> - <DependentUpon>DurationsBridgeGaps.cs</DependentUpon> - </Compile> - <Compile Include="Forms\EbuColorPicker.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\EbuColorPicker.Designer.cs"> - <DependentUpon>EbuColorPicker.cs</DependentUpon> - </Compile> - <Compile Include="Forms\ExportCustomText.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\ExportCustomText.Designer.cs"> - <DependentUpon>ExportCustomText.cs</DependentUpon> - </Compile> - <Compile Include="Forms\ExportCustomTextFormat.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\ExportCustomTextFormat.Designer.cs"> - <DependentUpon>ExportCustomTextFormat.cs</DependentUpon> - </Compile> - <Compile Include="Forms\ExportPngXmlPreview.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\ExportPngXmlPreview.Designer.cs"> - <DependentUpon>ExportPngXmlPreview.cs</DependentUpon> - </Compile> - <Compile Include="Forms\ExportTextST.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\ExportTextST.Designer.cs"> - <DependentUpon>ExportTextST.cs</DependentUpon> - </Compile> - <Compile Include="Forms\FcpProperties.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\FcpProperties.Designer.cs"> - <DependentUpon>FcpProperties.cs</DependentUpon> - </Compile> - <Compile Include="Forms\ImportImages.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\ImportImages.Designer.cs"> - <DependentUpon>ImportImages.cs</DependentUpon> - </Compile> - <Compile Include="Forms\ImportSceneChanges.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\ImportSceneChanges.Designer.cs"> - <DependentUpon>ImportSceneChanges.cs</DependentUpon> - </Compile> - <Compile Include="Forms\ImportUnknownFormat.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\ImportUnknownFormat.Designer.cs"> - <DependentUpon>ImportUnknownFormat.cs</DependentUpon> - </Compile> - <Compile Include="Forms\MeasurementConverter.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\MeasurementConverter.Designer.cs"> - <DependentUpon>MeasurementConverter.cs</DependentUpon> - </Compile> - <Compile Include="Forms\MergeTextWithSameTimeCodes.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\MergeTextWithSameTimeCodes.Designer.cs"> - <DependentUpon>MergeTextWithSameTimeCodes.cs</DependentUpon> - </Compile> - <Compile Include="Forms\MultipleReplaceNewGroup.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\MultipleReplaceNewGroup.Designer.cs"> - <DependentUpon>MultipleReplaceNewGroup.cs</DependentUpon> - </Compile> - <Compile Include="Forms\NuendoProperties.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\NuendoProperties.Designer.cs"> - <DependentUpon>NuendoProperties.cs</DependentUpon> - </Compile> - <Compile Include="Forms\EbuSaveOptions.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\EbuSaveOptions.Designer.cs"> - <DependentUpon>EbuSaveOptions.cs</DependentUpon> - </Compile> - <Compile Include="Forms\EffectKaraoke.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\EffectKaraoke.Designer.cs"> - <DependentUpon>EffectKaraoke.cs</DependentUpon> - </Compile> - <Compile Include="Forms\EffectTypewriter.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\EffectTypewriter.Designer.cs"> - <DependentUpon>EffectTypewriter.cs</DependentUpon> - </Compile> - <Compile Include="Forms\ExportPngXml.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\ExportPngXml.Designer.cs"> - <DependentUpon>ExportPngXml.cs</DependentUpon> - </Compile> - <Compile Include="Forms\ExportText.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\ExportText.Designer.cs"> - <DependentUpon>ExportText.cs</DependentUpon> - </Compile> - <Compile Include="Forms\ExtractDateTimeInfo.cs"> - <SubType>form</SubType> - </Compile> - <Compile Include="Forms\ExtractDateTimeInfo.Designer.cs"> - <DependentUpon>ExtractDateTimeInfo.cs</DependentUpon> - </Compile> - <Compile Include="Forms\FindDialog.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\FindDialog.Designer.cs"> - <DependentUpon>FindDialog.cs</DependentUpon> - </Compile> - <Compile Include="Forms\FindSubtitleLine.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\FindSubtitleLine.Designer.cs"> - <DependentUpon>FindSubtitleLine.cs</DependentUpon> - </Compile> - <Compile Include="Forms\FixCommonErrors.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\FixCommonErrors.Designer.cs"> - <DependentUpon>FixCommonErrors.cs</DependentUpon> - </Compile> - <Compile Include="Forms\DvdSubRip.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\DvdSubRip.Designer.cs"> - <DependentUpon>DvdSubRip.cs</DependentUpon> - </Compile> - <Compile Include="Forms\DvdSubRipChooseLanguage.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\DvdSubRipChooseLanguage.Designer.cs"> - <DependentUpon>DvdSubRipChooseLanguage.cs</DependentUpon> - </Compile> - <Compile Include="Forms\GetDictionaries.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\GetDictionaries.Designer.cs"> - <DependentUpon>GetDictionaries.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Ocr\BinaryOcrChooseEditDb.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Ocr\BinaryOcrChooseEditDb.Designer.cs"> - <DependentUpon>BinaryOcrChooseEditDb.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Ocr\BinaryOcrTrain.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Ocr\BinaryOcrTrain.Designer.cs"> - <DependentUpon>BinaryOcrTrain.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Ocr\GetTesseractDictionaries.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Ocr\GetTesseractDictionaries.Designer.cs"> - <DependentUpon>GetTesseractDictionaries.cs</DependentUpon> - </Compile> - <Compile Include="Forms\HardSubExtract.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\HardSubExtract.Designer.cs"> - <DependentUpon>HardSubExtract.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Interjections.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Interjections.Designer.cs"> - <DependentUpon>Interjections.cs</DependentUpon> - </Compile> - <Compile Include="Forms\JoinSubtitles.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\JoinSubtitles.Designer.cs"> - <DependentUpon>JoinSubtitles.cs</DependentUpon> - </Compile> - <Compile Include="Forms\MergeDoubleLines.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\MergeDoubleLines.Designer.cs"> - <DependentUpon>MergeDoubleLines.cs</DependentUpon> - </Compile> - <Compile Include="Forms\ModifySelection.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\ModifySelection.Designer.cs"> - <DependentUpon>ModifySelection.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Networking\NetworkChat.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Networking\NetworkChat.Designer.cs"> - <DependentUpon>NetworkChat.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Networking\NetworkJoin.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Networking\NetworkJoin.Designer.cs"> - <DependentUpon>NetworkJoin.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Networking\NetworkLogAndInfo.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Networking\NetworkLogAndInfo.Designer.cs"> - <DependentUpon>NetworkLogAndInfo.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Networking\NetworkStart.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Networking\NetworkStart.Designer.cs"> - <DependentUpon>NetworkStart.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Ocr\DownloadTesseract4.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Ocr\DownloadTesseract4.Designer.cs"> - <DependentUpon>DownloadTesseract4.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Ocr\DownloadTesseract302.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Ocr\DownloadTesseract302.Designer.cs"> - <DependentUpon>DownloadTesseract302.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Ocr\GetTesseract302Dictionaries.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Ocr\GetTesseract302Dictionaries.Designer.cs"> - <DependentUpon>GetTesseract302Dictionaries.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Ocr\OcrPreprocessingT4.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Ocr\OcrPreprocessingT4.Designer.cs"> - <DependentUpon>OcrPreprocessingT4.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Ocr\OcrPreprocessingSettings.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Ocr\OcrPreprocessingSettings.Designer.cs"> - <DependentUpon>OcrPreprocessingSettings.cs</DependentUpon> - </Compile> - <Compile Include="Forms\OpenVideoDvd.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\OpenVideoDvd.Designer.cs"> - <DependentUpon>OpenVideoDvd.cs</DependentUpon> - </Compile> - <Compile Include="Forms\PacEncoding.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\PacEncoding.Designer.cs"> - <DependentUpon>PacEncoding.cs</DependentUpon> - </Compile> - <Compile Include="Forms\ColumnPaste.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\ColumnPaste.Designer.cs"> - <DependentUpon>ColumnPaste.cs</DependentUpon> - </Compile> - <Compile Include="Forms\PluginsGet.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\PluginsGet.Designer.cs"> - <DependentUpon>PluginsGet.cs</DependentUpon> - </Compile> - <Compile Include="Forms\PositionAndSizeForm.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\ProfileChoose.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\ProfileChoose.Designer.cs"> - <DependentUpon>ProfileChoose.cs</DependentUpon> - </Compile> - <Compile Include="Forms\RestoreAutoBackup.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\RestoreAutoBackup.Designer.cs"> - <DependentUpon>RestoreAutoBackup.cs</DependentUpon> - </Compile> - <Compile Include="Forms\RubyJapanese.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\RubyJapanese.Designer.cs"> - <DependentUpon>RubyJapanese.cs</DependentUpon> - </Compile> - <Compile Include="Forms\SeekSilence.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\SeekSilence.Designer.cs"> - <DependentUpon>SeekSilence.cs</DependentUpon> - </Compile> - <Compile Include="Forms\SetSyncPoint.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\SetSyncPoint.Designer.cs"> - <DependentUpon>SetSyncPoint.cs</DependentUpon> - </Compile> - <Compile Include="Forms\GoogleTranslate.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\GoogleTranslate.Designer.cs"> - <DependentUpon>GoogleTranslate.cs</DependentUpon> - </Compile> - <Compile Include="Forms\GoToLine.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\GoToLine.Designer.cs"> - <DependentUpon>GoToLine.cs</DependentUpon> - </Compile> - <Compile Include="Forms\ImportText.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\ImportText.Designer.cs"> - <DependentUpon>ImportText.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Main.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Main.Designer.cs"> - <DependentUpon>Main.cs</DependentUpon> - </Compile> - <Compile Include="Forms\MatroskaSubtitleChooser.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\MatroskaSubtitleChooser.Designer.cs"> - <DependentUpon>MatroskaSubtitleChooser.cs</DependentUpon> - </Compile> - <Compile Include="Forms\MergeShortLines.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\MergeShortLines.Designer.cs"> - <DependentUpon>MergeShortLines.cs</DependentUpon> - </Compile> - <Compile Include="Forms\MultipleReplace.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\MultipleReplace.Designer.cs"> - <DependentUpon>MultipleReplace.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Ocr\OCRSpellCheck.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Ocr\OCRSpellCheck.Designer.cs"> - <DependentUpon>OCRSpellCheck.cs</DependentUpon> - </Compile> - <Compile Include="Forms\RemoveTextFromHearImpaired.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\RemoveTextFromHearImpaired.Designer.cs"> - <DependentUpon>RemoveTextFromHearImpaired.cs</DependentUpon> - </Compile> - <Compile Include="Forms\ReplaceDialog.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\ReplaceDialog.Designer.cs"> - <DependentUpon>ReplaceDialog.cs</DependentUpon> - </Compile> - <Compile Include="Forms\SetMinimumDisplayTimeBetweenParagraphs.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\SetMinimumDisplayTimeBetweenParagraphs.Designer.cs"> - <DependentUpon>SetMinimumDisplayTimeBetweenParagraphs.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Settings.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Settings.Designer.cs"> - <DependentUpon>Settings.cs</DependentUpon> - </Compile> - <Compile Include="Forms\SettingsFixContinuationStyle.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\SettingsFixContinuationStyle.Designer.cs"> - <DependentUpon>SettingsFixContinuationStyle.cs</DependentUpon> - </Compile> - <Compile Include="Forms\SettingsGapChoose.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\SettingsGapChoose.Designer.cs"> - <DependentUpon>SettingsGapChoose.cs</DependentUpon> - </Compile> - <Compile Include="Forms\SettingsLineWidth.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\SettingsLineWidth.Designer.cs"> - <DependentUpon>SettingsLineWidth.cs</DependentUpon> - </Compile> - <Compile Include="Forms\SettingsMpv.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\SettingsMpv.Designer.cs"> - <DependentUpon>SettingsMpv.cs</DependentUpon> - </Compile> - <Compile Include="Forms\SettingsProfile.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\SettingsProfile.Designer.cs"> - <DependentUpon>SettingsProfile.cs</DependentUpon> - </Compile> - <Compile Include="Forms\SettingsProfileExport.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\SettingsProfileExport.Designer.cs"> - <DependentUpon>SettingsProfileExport.cs</DependentUpon> - </Compile> - <Compile Include="Forms\SetVideoOffset.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\SetVideoOffset.Designer.cs"> - <DependentUpon>SetVideoOffset.cs</DependentUpon> - </Compile> - <Compile Include="Forms\ShowEarlierLater.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\ShowEarlierLater.Designer.cs"> - <DependentUpon>ShowEarlierLater.cs</DependentUpon> - </Compile> - <Compile Include="Forms\ShowHistory.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\ShowHistory.Designer.cs"> - <DependentUpon>ShowHistory.cs</DependentUpon> - </Compile> - <Compile Include="Forms\SpellCheck.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\SpellCheck.Designer.cs"> - <DependentUpon>SpellCheck.cs</DependentUpon> - </Compile> - <Compile Include="Forms\DialogDoNotShowAgain.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\DialogDoNotShowAgain.Designer.cs"> - <DependentUpon>DialogDoNotShowAgain.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Split.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Split.Designer.cs"> - <DependentUpon>Split.cs</DependentUpon> - </Compile> - <Compile Include="Forms\SplitLongLines.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\SplitLongLines.Designer.cs"> - <DependentUpon>SplitLongLines.cs</DependentUpon> - </Compile> - <Compile Include="Forms\SplitSubtitle.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\SplitSubtitle.Designer.cs"> - <DependentUpon>SplitSubtitle.cs</DependentUpon> - </Compile> - <Compile Include="Forms\StartNumberingFrom.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\StartNumberingFrom.Designer.cs"> - <DependentUpon>StartNumberingFrom.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Statistics.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Statistics.Designer.cs"> - <DependentUpon>Statistics.cs</DependentUpon> - </Compile> - <Compile Include="Forms\StatusLog.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\StatusLog.Designer.cs"> - <DependentUpon>StatusLog.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Styles\StylesForm.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Styles\SubStationAlphaStylesBatchConvert.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Styles\SubStationAlphaStylesBatchConvert.Designer.cs"> - <DependentUpon>SubStationAlphaStylesBatchConvert.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Styles\SubStationAlphaStylesExport.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Styles\SubStationAlphaStylesExport.Designer.cs"> - <DependentUpon>SubStationAlphaStylesExport.cs</DependentUpon> - </Compile> - <Compile Include="Forms\SubStationAlphaProperties.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\SubStationAlphaProperties.Designer.cs"> - <DependentUpon>SubStationAlphaProperties.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Styles\SubStationAlphaStyles.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Styles\SubStationAlphaStyles.Designer.cs"> - <DependentUpon>SubStationAlphaStyles.cs</DependentUpon> - </Compile> - <Compile Include="Forms\TimedTextNewLanguage.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\TimedTextNewLanguage.Designer.cs"> - <DependentUpon>TimedTextNewLanguage.cs</DependentUpon> - </Compile> - <Compile Include="Forms\TimedTextProperties.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\TimedTextProperties.Designer.cs"> - <DependentUpon>TimedTextProperties.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Styles\TimedTextStyles.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Styles\TimedTextStyles.Designer.cs"> - <DependentUpon>TimedTextStyles.cs</DependentUpon> - </Compile> - <Compile Include="Forms\TransportStreamSubtitleChooser.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\TransportStreamSubtitleChooser.Designer.cs"> - <DependentUpon>TransportStreamSubtitleChooser.cs</DependentUpon> - </Compile> - <Compile Include="Forms\UnknownSubtitle.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\UnknownSubtitle.Designer.cs"> - <DependentUpon>UnknownSubtitle.cs</DependentUpon> - </Compile> - <Compile Include="Forms\VideoControlsUndocked.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\VideoControlsUndocked.Designer.cs"> - <DependentUpon>VideoControlsUndocked.cs</DependentUpon> - </Compile> - <Compile Include="Forms\VideoError.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\VideoError.Designer.cs"> - <DependentUpon>VideoError.cs</DependentUpon> - </Compile> - <Compile Include="Forms\VideoPlayerUndocked.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\VideoPlayerUndocked.Designer.cs"> - <DependentUpon>VideoPlayerUndocked.cs</DependentUpon> - </Compile> - <Compile Include="Forms\VisualSync.cs"> - <SubType>form</SubType> - </Compile> - <Compile Include="Forms\VisualSync.Designer.cs"> - <DependentUpon>VisualSync.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Ocr\VobSubCharactersImport.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Ocr\VobSubCharactersImport.Designer.cs"> - <DependentUpon>VobSubCharactersImport.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Ocr\VobSubEditCharacters.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Ocr\VobSubEditCharacters.Designer.cs"> - <DependentUpon>VobSubEditCharacters.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Ocr\VobSubNOcrCharacterInspect.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Ocr\VobSubNOcrCharacterInspect.Designer.cs"> - <DependentUpon>VobSubNOcrCharacterInspect.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Ocr\VobSubNOcrEdit.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Ocr\VobSubNOcrEdit.Designer.cs"> - <DependentUpon>VobSubNOcrEdit.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Ocr\VobSubNOcrTrain.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Ocr\VobSubNOcrTrain.Designer.cs"> - <DependentUpon>VobSubNOcrTrain.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Ocr\VobSubOcr.cs"> - <SubType>form</SubType> - </Compile> - <Compile Include="Forms\Ocr\VobSubOcr.Designer.cs"> - <DependentUpon>VobSubOcr.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Ocr\VobSubOcrCharacter.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Ocr\VobSubOcrCharacter.Designer.cs"> - <DependentUpon>VobSubOcrCharacter.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Ocr\VobSubOcrCharacterInspect.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Ocr\VobSubOcrCharacterInspect.Designer.cs"> - <DependentUpon>VobSubOcrCharacterInspect.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Ocr\VobSubOcrNewFolder.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Ocr\VobSubOcrNewFolder.Designer.cs"> - <DependentUpon>VobSubOcrNewFolder.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Ocr\VobSubOcrNOcrCharacter.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Ocr\VobSubOcrNOcrCharacter.Designer.cs"> - <DependentUpon>VobSubOcrNOcrCharacter.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Ocr\VobSubOcrSetItalicFactor.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Ocr\VobSubOcrSetItalicFactor.Designer.cs"> - <DependentUpon>VobSubOcrSetItalicFactor.cs</DependentUpon> - </Compile> - <Compile Include="Forms\Watermark.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\Watermark.Designer.cs"> - <DependentUpon>Watermark.cs</DependentUpon> - </Compile> - <Compile Include="Forms\WaveformGenerateTimeCodes.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\WaveformGenerateTimeCodes.Designer.cs"> - <DependentUpon>WaveformGenerateTimeCodes.cs</DependentUpon> - </Compile> - <Compile Include="Forms\WaveformUndocked.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\WaveformUndocked.Designer.cs"> - <DependentUpon>WaveformUndocked.cs</DependentUpon> - </Compile> - <Compile Include="Forms\GoogleOrMicrosoftTranslate.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\GoogleOrMicrosoftTranslate.Designer.cs"> - <DependentUpon>GoogleOrMicrosoftTranslate.cs</DependentUpon> - </Compile> - <Compile Include="Forms\TextPrompt.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\TextPrompt.Designer.cs"> - <DependentUpon>TextPrompt.cs</DependentUpon> - </Compile> - <Compile Include="Forms\YouTubeAnnotationsImport.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\YouTubeAnnotationsImport.Designer.cs"> - <DependentUpon>YouTubeAnnotationsImport.cs</DependentUpon> - </Compile> - <Compile Include="Logic\ColorChooser\ColorChangedEventArgs.cs" /> - <Compile Include="Logic\ColorChooser\ColorHandler.cs" /> - <Compile Include="Logic\ColorChooser\ColorWheel.cs" /> - <Compile Include="Logic\CommandLineConvert\BluRaySupToBluRaySup.cs" /> - <Compile Include="Logic\CommandLineConvert\CommandLineConverter.cs"> - <SubType>Code</SubType> - </Compile> - <Compile Include="Logic\CommandLineConvert\TsToBdnXml.cs" /> - <Compile Include="Logic\CommandLineConvert\TsConvert.cs" /> - <Compile Include="Logic\CommandLineConvert\TsToBluRaySup.cs" /> - <Compile Include="Logic\DarkTheme.cs" /> - <Compile Include="Logic\FindReplaceDialogHelper.cs" /> - <Compile Include="Logic\SceneChangesGenerator.cs" /> - <Compile Include="Logic\ListViewSorter.cs" /> - <Compile Include="Logic\NativeMethods.cs" /> - <Compile Include="Logic\NikseBitmapImageSplitter.cs" /> - <Compile Include="Logic\Networking\NikseWebServiceSession.cs"> - <SubType>Code</SubType> - </Compile> - <Compile Include="Logic\Networking\UpdateLogEntry.cs"> - <SubType>Code</SubType> - </Compile> - <Compile Include="Logic\Ocr\Binary\BinaryOcrBitmap.cs" /> - <Compile Include="Logic\Ocr\Binary\BinaryOcrDb.cs" /> - <Compile Include="Logic\Ocr\MatchesToItalicStringConverter.cs" /> - <Compile Include="Logic\Ocr\ModiLanguage.cs" /> - <Compile Include="Logic\Ocr\NOcrDb.cs" /> - <Compile Include="Logic\Ocr\OcrAlphabet.cs" /> - <Compile Include="Logic\Ocr\NOcrChar.cs" /> - <Compile Include="Logic\Ocr\OcrCharacter.cs" /> - <Compile Include="Logic\Ocr\OcrFixEngine.cs" /> - <Compile Include="Logic\Ocr\OcrImage.cs" /> - <Compile Include="Logic\Ocr\NOcrPoint.cs" /> - <Compile Include="Logic\Ocr\PreprocessingSettings.cs" /> - <Compile Include="Logic\Ocr\SpellCheckOcrTextResult.cs" /> - <Compile Include="Logic\Ocr\Tesseract\TesseractMultiThreadRunner.cs" /> - <Compile Include="Logic\Ocr\Tesseract\TesseractThreadRunner.cs" /> - <Compile Include="Logic\Ocr\Tesseract\TesseractRunner.cs" /> - <Compile Include="Logic\Ocr\Tesseract\TesseractMultiRunner.cs" /> - <Compile Include="Logic\RtfTextConverterRichTextBox.cs" /> - <Compile Include="Logic\MainShortcuts.cs" /> - <Compile Include="Logic\SpellCheck\Hunspell.cs" /> - <Compile Include="Logic\SpellCheck\LinuxHunspell.cs" /> - <Compile Include="Logic\SpellCheck\MacHunspell.cs" /> - <Compile Include="Logic\SpellCheck\VoikkoSpellCheck.cs" /> - <Compile Include="Logic\SpellCheck\WindowsHunspell.cs" /> - <Compile Include="Logic\SyncContextExtensions.cs" /> - <Compile Include="Logic\TaskbarList.cs" /> - <Compile Include="Logic\TextDesigner.cs" /> - <Compile Include="Logic\TextWidth.cs" /> - <Compile Include="Logic\UiEbuSaveHelper.cs" /> - <Compile Include="Logic\UiGetPacEncoding.cs" /> - <Compile Include="Logic\UiGetYouTubeAnnotationStyles.cs" /> - <Compile Include="Logic\UiUtil.cs" /> - <Compile Include="Logic\VideoPlayers\LibMpvMono.cs" /> - <Compile Include="Logic\VideoPlayers\LibMpvDynamic.cs" /> - <Compile Include="Logic\VideoPlayers\LibVlcDynamic.cs" /> - <Compile Include="Logic\VideoPlayers\LibVlcMono.cs" /> - <Compile Include="Logic\VideoPlayers\MpcHC\MessageHandlerWindow.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Logic\VideoPlayers\MpcHC\MessageHandlerWindow.Designer.cs"> - <DependentUpon>MessageHandlerWindow.cs</DependentUpon> - </Compile> - <Compile Include="Logic\VideoPlayers\MpcHC\MpcHcCommand.cs" /> - <Compile Include="Logic\VideoPlayers\MpcHC\MpcHc.cs" /> - <Compile Include="Logic\VideoPlayers\MpcHC\NativeMethods.cs" /> - <Compile Include="Logic\VideoPlayers\QuartsPlayer.cs" /> - <Compile Include="Logic\VideoPlayers\VideoPlayer.cs" /> - <Compile Include="Logic\WordSpellChecker.cs" /> - <Compile Include="Program.cs" /> - <Compile Include="Properties\AssemblyInfo.cs" /> - <Compile Include="Forms\SyncPointsSync.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="Forms\SyncPointsSync.Designer.cs"> - <DependentUpon>SyncPointsSync.cs</DependentUpon> - </Compile> - <Compile Include="Properties\Resources.Designer.cs"> - <AutoGen>True</AutoGen> - <DesignTime>True</DesignTime> - <DependentUpon>Resources.resx</DependentUpon> - </Compile> - <Compile Include="Web References\SeNetworkService\Reference.cs"> - <AutoGen>True</AutoGen> - <DesignTime>True</DesignTime> - <DependentUpon>Reference.map</DependentUpon> - </Compile> - <EmbeddedResource Include="Controls\TimeUpDown.resx"> - <DependentUpon>TimeUpDown.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Controls\AudioVisualizer.resx"> - <DependentUpon>AudioVisualizer.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\AlignmentPickerJapanese.resx"> - <DependentUpon>AlignmentPickerJapanese.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\BatchConvertMkvEnding.resx"> - <DependentUpon>BatchConvertMkvEnding.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\BatchConvertTsSettings.resx"> - <DependentUpon>BatchConvertTsSettings.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\BookmarkAdd.resx"> - <DependentUpon>BookmarkAdd.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\AddWaveformBatch.resx"> - <DependentUpon>AddWaveformBatch.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\AudioToText.resx"> - <DependentUpon>AudioToText.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\BookmarksGoTo.resx"> - <DependentUpon>BookmarksGoTo.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Cavena890SaveOptions.resx"> - <DependentUpon>Cavena890SaveOptions.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\CheckForUpdates.resx"> - <DependentUpon>CheckForUpdates.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\ChooseFontName.resx"> - <DependentUpon>ChooseFontName.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\ColorChooser.resx"> - <DependentUpon>ColorChooser.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\DCinema\DCinemaPropertiesInterop.resx"> - <DependentUpon>DCinemaPropertiesInterop.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\DCinema\DCinemaPropertiesSmpte.resx"> - <DependentUpon>DCinemaPropertiesSmpte.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\DoNotBreakAfterListEdit.resx"> - <DependentUpon>DoNotBreakAfterListEdit.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\About.resx"> - <DependentUpon>About.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\AddToNames.resx"> - <DependentUpon>AddToNames.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\DownloadFfmpeg.resx"> - <DependentUpon>DownloadFfmpeg.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\DvdStudioProProperties.resx"> - <DependentUpon>DvdStudioProProperties.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\EbuLanguageCode.resx"> - <DependentUpon>EbuLanguageCode.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\ExportFcpXmlAdvanced.resx"> - <DependentUpon>ExportFcpXmlAdvanced.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\ExportPngXmlDialogOpenFolder.resx"> - <DependentUpon>ExportPngXmlDialogOpenFolder.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\ImportCdg.resx"> - <DependentUpon>ImportCdg.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\ImportFinalDraft.resx"> - <DependentUpon>ImportFinalDraft.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\MultipleReplaceExportImport.resx"> - <DependentUpon>MultipleReplaceExportImport.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\NetflixFixErrors.resx"> - <DependentUpon>NetflixFixErrors.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Ocr\AddBeterMultiMatch.resx"> - <DependentUpon>AddBeterMultiMatch.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Ocr\AddBetterMultiMatchNOcr.resx"> - <DependentUpon>AddBetterMultiMatchNOcr.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Ocr\AddToOcrReplaceList.resx"> - <DependentUpon>AddToOcrReplaceList.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\AddToUserDic.resx"> - <DependentUpon>AddToUserDic.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\AddWaveform.resx"> - <DependentUpon>AddWaveform.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\AlignmentPicker.resx"> - <DependentUpon>AlignmentPicker.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\ApplyDurationLimits.resx"> - <DependentUpon>ApplyDurationLimits.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\BatchConvert.resx"> - <DependentUpon>BatchConvert.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Beamer.resx"> - <DependentUpon>Beamer.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\ChangeCasing.resx"> - <DependentUpon>ChangeCasing.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\ChangeFrameRate.resx"> - <DependentUpon>ChangeFrameRate.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\ChangeSpeedInPercent.resx"> - <DependentUpon>ChangeSpeedInPercent.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\ChooseAudioTrack.resx"> - <DependentUpon>ChooseAudioTrack.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\ChooseEncoding.resx"> - <DependentUpon>ChooseEncoding.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\AdjustDisplayDuration.resx"> - <DependentUpon>AdjustDisplayDuration.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\ChooseResolution.resx"> - <DependentUpon>ChooseResolution.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\ChooseStyle.resx"> - <DependentUpon>ChooseStyle.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\DurationsBridgeGaps.resx"> - <DependentUpon>DurationsBridgeGaps.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\EbuColorPicker.resx"> - <DependentUpon>EbuColorPicker.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\ExportCustomText.resx"> - <DependentUpon>ExportCustomText.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\ExportCustomTextFormat.resx"> - <DependentUpon>ExportCustomTextFormat.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\ExportPngXmlPreview.resx"> - <DependentUpon>ExportPngXmlPreview.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\ExportTextST.resx"> - <DependentUpon>ExportTextST.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\FcpProperties.resx"> - <DependentUpon>FcpProperties.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\ImportImages.resx"> - <DependentUpon>ImportImages.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\ImportSceneChanges.resx"> - <DependentUpon>ImportSceneChanges.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\ImportUnknownFormat.resx"> - <DependentUpon>ImportUnknownFormat.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\MeasurementConverter.resx"> - <DependentUpon>MeasurementConverter.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\MergeTextWithSameTimeCodes.resx"> - <DependentUpon>MergeTextWithSameTimeCodes.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\MultipleReplaceNewGroup.resx"> - <DependentUpon>MultipleReplaceNewGroup.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\NuendoProperties.resx"> - <DependentUpon>NuendoProperties.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\EbuSaveOptions.resx"> - <DependentUpon>EbuSaveOptions.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\EffectKaraoke.resx"> - <DependentUpon>EffectKaraoke.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\EffectTypewriter.resx"> - <DependentUpon>EffectTypewriter.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\ExportPngXml.resx"> - <DependentUpon>ExportPngXml.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\ExportText.resx"> - <DependentUpon>ExportText.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\ExtractDateTimeInfo.resx"> - <DependentUpon>ExtractDateTimeInfo.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\FindDialog.resx"> - <DependentUpon>FindDialog.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\FindSubtitleLine.resx"> - <DependentUpon>FindSubtitleLine.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\FixCommonErrors.resx"> - <DependentUpon>FixCommonErrors.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\DvdSubRip.resx"> - <DependentUpon>DvdSubRip.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\DvdSubRipChooseLanguage.resx"> - <DependentUpon>DvdSubRipChooseLanguage.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\GetDictionaries.resx"> - <DependentUpon>GetDictionaries.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Ocr\BinaryOcrChooseEditDb.resx"> - <DependentUpon>BinaryOcrChooseEditDb.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Ocr\BinaryOcrTrain.resx"> - <DependentUpon>BinaryOcrTrain.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Ocr\GetTesseractDictionaries.resx"> - <DependentUpon>GetTesseractDictionaries.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\HardSubExtract.resx"> - <DependentUpon>HardSubExtract.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Interjections.resx"> - <DependentUpon>Interjections.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\JoinSubtitles.resx"> - <DependentUpon>JoinSubtitles.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\MergeDoubleLines.resx"> - <DependentUpon>MergeDoubleLines.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\ModifySelection.resx"> - <DependentUpon>ModifySelection.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Networking\NetworkChat.resx"> - <DependentUpon>NetworkChat.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Networking\NetworkJoin.resx"> - <DependentUpon>NetworkJoin.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Networking\NetworkLogAndInfo.resx"> - <DependentUpon>NetworkLogAndInfo.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Networking\NetworkStart.resx"> - <DependentUpon>NetworkStart.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Ocr\DownloadTesseract4.resx"> - <DependentUpon>DownloadTesseract4.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Ocr\DownloadTesseract302.resx"> - <DependentUpon>DownloadTesseract302.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Ocr\GetTesseract302Dictionaries.resx"> - <DependentUpon>GetTesseract302Dictionaries.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Ocr\OcrPreprocessingT4.resx"> - <DependentUpon>OcrPreprocessingT4.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Ocr\OcrPreprocessingSettings.resx"> - <DependentUpon>OcrPreprocessingSettings.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\OpenVideoDvd.resx"> - <DependentUpon>OpenVideoDvd.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\PacEncoding.resx"> - <DependentUpon>PacEncoding.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\ColumnPaste.resx"> - <DependentUpon>ColumnPaste.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\PluginsGet.resx"> - <DependentUpon>PluginsGet.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\ProfileChoose.resx"> - <DependentUpon>ProfileChoose.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\RestoreAutoBackup.resx"> - <DependentUpon>RestoreAutoBackup.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\RubyJapanese.resx"> - <DependentUpon>RubyJapanese.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\SeekSilence.resx"> - <DependentUpon>SeekSilence.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\SetSyncPoint.resx"> - <DependentUpon>SetSyncPoint.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\GoogleTranslate.resx"> - <DependentUpon>GoogleTranslate.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\GoToLine.resx"> - <DependentUpon>GoToLine.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\ImportText.resx"> - <DependentUpon>ImportText.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\MatroskaSubtitleChooser.resx"> - <DependentUpon>MatroskaSubtitleChooser.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\MergeShortLines.resx"> - <DependentUpon>MergeShortLines.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\RemoveTextFromHearImpaired.resx"> - <DependentUpon>RemoveTextFromHearImpaired.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\ReplaceDialog.resx"> - <DependentUpon>ReplaceDialog.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\SetMinimumDisplayTimeBetweenParagraphs.resx"> - <DependentUpon>SetMinimumDisplayTimeBetweenParagraphs.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Settings.resx"> - <DependentUpon>Settings.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\SettingsFixContinuationStyle.resx"> - <DependentUpon>SettingsFixContinuationStyle.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\SettingsGapChoose.resx"> - <DependentUpon>SettingsGapChoose.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\SettingsLineWidth.resx"> - <DependentUpon>SettingsLineWidth.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\SettingsMpv.resx"> - <DependentUpon>SettingsMpv.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\SettingsProfile.resx"> - <DependentUpon>SettingsProfile.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\SettingsProfileExport.resx"> - <DependentUpon>SettingsProfileExport.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\SetVideoOffset.resx"> - <DependentUpon>SetVideoOffset.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\ShowHistory.resx"> - <DependentUpon>ShowHistory.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\SpellCheck.resx"> - <DependentUpon>SpellCheck.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\DialogDoNotShowAgain.resx"> - <DependentUpon>DialogDoNotShowAgain.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Split.resx"> - <DependentUpon>Split.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\SplitLongLines.resx"> - <DependentUpon>SplitLongLines.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\SplitSubtitle.resx"> - <DependentUpon>SplitSubtitle.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\StartNumberingFrom.resx"> - <DependentUpon>StartNumberingFrom.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Statistics.resx"> - <DependentUpon>Statistics.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\StatusLog.resx"> - <DependentUpon>StatusLog.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Styles\SubStationAlphaStylesBatchConvert.resx"> - <DependentUpon>SubStationAlphaStylesBatchConvert.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Styles\SubStationAlphaStylesExport.resx"> - <DependentUpon>SubStationAlphaStylesExport.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\SubStationAlphaProperties.resx"> - <DependentUpon>SubStationAlphaProperties.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Styles\SubStationAlphaStyles.resx"> - <DependentUpon>SubStationAlphaStyles.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\TimedTextNewLanguage.resx"> - <DependentUpon>TimedTextNewLanguage.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\TimedTextProperties.resx"> - <DependentUpon>TimedTextProperties.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Styles\TimedTextStyles.resx"> - <DependentUpon>TimedTextStyles.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\TransportStreamSubtitleChooser.resx"> - <DependentUpon>TransportStreamSubtitleChooser.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\UnknownSubtitle.resx"> - <DependentUpon>UnknownSubtitle.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\VideoControlsUndocked.resx"> - <DependentUpon>VideoControlsUndocked.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\VideoPlayerUndocked.resx"> - <DependentUpon>VideoPlayerUndocked.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\VisualSync.resx"> - <DependentUpon>VisualSync.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Ocr\VobSubCharactersImport.resx"> - <DependentUpon>VobSubCharactersImport.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Ocr\VobSubNOcrCharacterInspect.resx"> - <DependentUpon>VobSubNOcrCharacterInspect.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Ocr\VobSubNOcrEdit.resx"> - <DependentUpon>VobSubNOcrEdit.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Ocr\VobSubNOcrTrain.resx"> - <DependentUpon>VobSubNOcrTrain.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Ocr\VobSubOcr.resx"> - <DependentUpon>VobSubOcr.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Ocr\VobSubOcrCharacter.resx"> - <DependentUpon>VobSubOcrCharacter.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Ocr\VobSubOcrCharacterInspect.resx"> - <DependentUpon>VobSubOcrCharacterInspect.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Ocr\VobSubOcrNewFolder.resx"> - <DependentUpon>VobSubOcrNewFolder.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Ocr\VobSubOcrNOcrCharacter.resx"> - <DependentUpon>VobSubOcrNOcrCharacter.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Ocr\VobSubOcrSetItalicFactor.resx"> - <DependentUpon>VobSubOcrSetItalicFactor.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Watermark.resx"> - <DependentUpon>Watermark.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\WaveformGenerateTimeCodes.resx"> - <DependentUpon>WaveformGenerateTimeCodes.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\WaveformUndocked.resx"> - <DependentUpon>WaveformUndocked.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\GoogleOrMicrosoftTranslate.resx"> - <DependentUpon>GoogleOrMicrosoftTranslate.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\TextPrompt.resx"> - <DependentUpon>TextPrompt.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Forms\YouTubeAnnotationsImport.resx"> - <DependentUpon>YouTubeAnnotationsImport.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Logic\VideoPlayers\MpcHC\MessageHandlerWindow.resx"> - <DependentUpon>MessageHandlerWindow.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Properties\Resources.resx"> - <Generator>PublicResXFileCodeGenerator</Generator> - <SubType>Designer</SubType> - <LastGenOutput>Resources.Designer.cs</LastGenOutput> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Main.resx"> - <DependentUpon>Main.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\SyncPointsSync.resx"> - <DependentUpon>SyncPointsSync.cs</DependentUpon> - </EmbeddedResource> - <None Include="app.config" /> - <None Include="packages.config"> - <SubType>Designer</SubType> - </None> - <None Include="Properties\Settings.settings"> - <Generator>SettingsSingleFileGenerator</Generator> - <LastGenOutput>Settings.Designer.cs</LastGenOutput> - </None> - <Compile Include="Properties\Settings.Designer.cs"> - <AutoGen>True</AutoGen> - <DependentUpon>Settings.settings</DependentUpon> - <DesignTimeSharedInput>True</DesignTimeSharedInput> - </Compile> - <EmbeddedResource Include="Resources\HunspellDictionaries.xml.gz" /> - <EmbeddedResource Include="Resources\HunspellBackupDictionaries.xml.gz" /> - <EmbeddedResource Include="Resources\TesseractDictionaries.xml.gz" /> - <None Include="Resources\nOCR_TesseractHelper.xml.gz" /> - <None Include="Resources\SMPTE-428-7-2007-DCST.xsd"> - <SubType>Designer</SubType> - </None> - <EmbeddedResource Include="Resources\SMPTE-428-7-2007-DCST.xsd.gz" /> - <None Include="Resources\SMPTE-428-7-2010-DCST.xsd"> - <SubType>Designer</SubType> - </None> - <EmbeddedResource Include="Resources\SMPTE-428-7-2010-DCST.xsd.gz" /> - <None Include="Resources\SMPTE-428-7-2014-DCST.xsd"> - <SubType>Designer</SubType> - </None> - <EmbeddedResource Include="Resources\SMPTE-428-7-2014-DCST.xsd.gz" /> - <None Include="Web References\SeNetworkService\Reference.map"> - <Generator>MSDiscoCodeGenerator</Generator> - <LastGenOutput>Reference.cs</LastGenOutput> - </None> - <None Include="Web References\SeNetworkService\SeSequence.datasource"> - <DependentUpon>Reference.map</DependentUpon> - </None> - <None Include="Web References\SeNetworkService\SeService.wsdl" /> - <None Include="Web References\SeNetworkService\SeUpdate.datasource"> - <DependentUpon>Reference.map</DependentUpon> - </None> - <None Include="Web References\SeNetworkService\SeUser.datasource"> - <DependentUpon>Reference.map</DependentUpon> - </None> - </ItemGroup> - <ItemGroup> - <Content Include="DLLs\Voikkox64.dll" /> - <Content Include="DLLs\Voikkox86.dll" /> - <Content Include="Languages\ar-EG.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\bg-BG.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\br-FR.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\ca-ES.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\cs-CZ.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\da-DK.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\de-DE.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\el-GR.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\es-AR.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\es-ES.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\es-MX.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\eu-ES.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\fa-IR.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\fi-FI.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\fr-FR.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\hr-HR.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\hu-HU.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\id-ID.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\it-IT.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\ja-JP.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\ko-KR.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\mk-MK.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\nb-NO.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\nl-NL.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\pl-PL.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\pt-BR.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\pt-PT.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\ro-RO.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\ru-RU.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\sl-SI.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\sr-Cyrl-RS.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\sr-Latn-RS.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\sv-SE.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\th-TH.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\tr-TR.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\uk-UA.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\vi-VN.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\zh-Hans.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <Content Include="Languages\zh-TW.xml"> - <CopyToOutputDirectory>Always</CopyToOutputDirectory> - </Content> - <None Include="Web References\SeNetworkService\SeService.disco" /> - <None Include="DLLs\Interop.QuartzTypeLib.dll" /> - <Content Include="..\Changelog.txt" /> - <Content Include="..\LICENSE.txt" /> - <EmbeddedResource Include="Controls\VideoPlayerContainer.resx"> - <DependentUpon>VideoPlayerContainer.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\AutoBreakUnbreakLines.resx"> - <DependentUpon>AutoBreakUnbreakLines.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\ChangeCasingNames.resx"> - <DependentUpon>ChangeCasingNames.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\ChooseLanguage.resx"> - <DependentUpon>ChooseLanguage.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Compare.resx"> - <DependentUpon>Compare.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\MultipleReplace.resx"> - <DependentUpon>MultipleReplace.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Ocr\OCRSpellCheck.resx"> - <DependentUpon>OCRSpellCheck.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\ShowEarlierLater.resx"> - <DependentUpon>ShowEarlierLater.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\VideoError.resx"> - <DependentUpon>VideoError.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <EmbeddedResource Include="Forms\Ocr\VobSubEditCharacters.resx"> - <DependentUpon>VobSubEditCharacters.cs</DependentUpon> - <SubType>Designer</SubType> - </EmbeddedResource> - <None Include="Icons\connect.png" /> - <None Include="Icons\Donate.png" /> - <Content Include="Icons\SE.ico" /> - <Content Include="Icons\Find.png" /> - <Content Include="Icons\FixCommonErrors.png" /> - <Content Include="Icons\Help.png" /> - <Content Include="Icons\New.png" /> - <Content Include="Icons\Open.png" /> - <Content Include="Icons\RemoveTextForHI.png" /> - <Content Include="Icons\Replace.png" /> - <Content Include="Icons\Save.png" /> - <Content Include="Icons\SaveAs.png" /> - <Content Include="Icons\Settings.png" /> - <Content Include="Icons\SpellCheck.png" /> - <Content Include="Icons\VideoToggle.png" /> - <Content Include="Icons\VisualSync.png" /> - <Content Include="Icons\WaveformToggle.png" /> - <None Include="Resources\bookmark22.png" /> - <None Include="Resources\pictureBoxFS.Image.png" /> - <None Include="Resources\pictureBoxFSDown.Image.png" /> - <None Include="Resources\pictureBoxFSOver.Image.png" /> - <None Include="Resources\pictureBoxFastForward.Image.png" /> - <None Include="Resources\pictureBoxFastForwardMouseDown.Image.png" /> - <None Include="Resources\pictureBoxFastForwardMouseOver.Image.png" /> - <None Include="Resources\pictureBoxNoFS.Image.png" /> - <None Include="Resources\pictureBoxNoFSDown.Image.png" /> - <None Include="Resources\pictureBoxNoFSOver.Image.png" /> - <None Include="Resources\pictureBoxReverse.Image.png" /> - <None Include="Resources\pictureBoxReverseMouseDown.Image.png" /> - <None Include="Resources\pictureBoxReverseMouseOver.Image.png" /> - <None Include="Resources\Transparent Background.png" /> - <Content Include="Resources\TesseractDictionaries.xml"> - <SubType>Designer</SubType> - </Content> - <Content Include="Resources\HunspellBackupDictionaries.xml"> - <SubType>Designer</SubType> - </Content> - <Content Include="Resources\HunspellDictionaries.xml"> - <SubType>Designer</SubType> - </Content> - </ItemGroup> - <ItemGroup> - <BootstrapperPackage Include="Microsoft.Net.Client.3.5"> - <Visible>False</Visible> - <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName> - <Install>false</Install> - </BootstrapperPackage> - <BootstrapperPackage Include="Microsoft.Net.Framework.2.0"> - <Visible>False</Visible> - <ProductName>.NET Framework 2.0 %28x86%29</ProductName> - <Install>true</Install> - </BootstrapperPackage> - <BootstrapperPackage Include="Microsoft.Net.Framework.3.0"> - <Visible>False</Visible> - <ProductName>.NET Framework 3.0 %28x86%29</ProductName> - <Install>false</Install> - </BootstrapperPackage> - <BootstrapperPackage Include="Microsoft.Net.Framework.3.5"> - <Visible>False</Visible> - <ProductName>.NET Framework 3.5</ProductName> - <Install>false</Install> - </BootstrapperPackage> - <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1"> - <Visible>False</Visible> - <ProductName>.NET Framework 3.5 SP1</ProductName> - <Install>false</Install> - </BootstrapperPackage> - <BootstrapperPackage Include="Microsoft.Visual.C++.10.0.x86"> - <Visible>False</Visible> - <ProductName>Visual C++ 2010 Runtime Libraries %28x86%29</ProductName> - <Install>true</Install> - </BootstrapperPackage> - <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1"> - <Visible>False</Visible> - <ProductName>Windows Installer 3.1</ProductName> - <Install>true</Install> - </BootstrapperPackage> - </ItemGroup> - <ItemGroup> - <WebReferences Include="Web References\" /> - </ItemGroup> - <ItemGroup> - <WebReferenceUrl Include="http://localhost:2782/se/SeService.asmx"> - <UrlBehavior>Dynamic</UrlBehavior> - <RelPath>Web References\SeNetworkService\</RelPath> - <UpdateFromURL>http://localhost:2782/se/SeService.asmx</UpdateFromURL> - <ServiceLocationURL> - </ServiceLocationURL> - <CachedDynamicPropName> - </CachedDynamicPropName> - <CachedAppSettingsObjectName>Settings</CachedAppSettingsObjectName> - <CachedSettingsPropName>SubtitleEdit_SeNetworkService_SeService</CachedSettingsPropName> - </WebReferenceUrl> - </ItemGroup> - <ItemGroup> - <ProjectReference Include="..\libse\LibSE.csproj"> - <Project>{3e3cb28f-3a7b-430f-9eb3-0d6c1e53b753}</Project> - <Name>LibSE</Name> - <Private>True</Private> - </ProjectReference> - </ItemGroup> - <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> - <ItemGroup> - <HunspellAssemblies Include="Hunspellx64.dll"> - <Visible>false</Visible> - </HunspellAssemblies> - <HunspellAssemblies Include="Hunspellx86.dll"> - <Visible>false</Visible> - </HunspellAssemblies> - </ItemGroup> - <ItemGroup /> - <Target Name="BeforeCompile"> - <XmlPeek XmlInputPath="$(SolutionDir)packages.config" Query="//package[@id='NHunspell']/@version"> - <Output TaskParameter="Result" PropertyName="HunspellVersion" /> - </XmlPeek> - <PropertyGroup> - <HunspellDir>$(SolutionDir)packages\NHunspell.$(HunspellVersion)\content\</HunspellDir> - </PropertyGroup> - <Copy SourceFiles="@(HunspellAssemblies -> '$(HunspellDir)%(Identity)')" DestinationFolder="$(OutputPath)" SkipUnchangedFiles="True" /> - <Exec Command="%22$(SolutionDir)..\build_helpers.bat%22 rev %22$(ConfigurationName)%22" /> - </Target> - <Target Name="BeforeClean"> - <Delete Files="@(HunspellAssemblies -> '$(OutputPath)%(Identity)')" /> - </Target> - <!-- To modify your build process, add your task inside one of the targets below and uncomment it. - Other similar extension points exist, see Microsoft.Common.targets. - <Target Name="BeforeBuild"> - </Target> - <Target Name="AfterBuild"> - </Target> - --> +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <Import Project="packages\ILRepack.2.0.18\build\ILRepack.props" Condition="Exists('packages\ILRepack.2.0.18\build\ILRepack.props')" /> + <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> + <PropertyGroup> + <AppDesignerFolder>Properties</AppDesignerFolder> + <ApplicationIcon>Icons\SE.ico</ApplicationIcon> + <AssemblyName>SubtitleEdit</AssemblyName> + <BootstrapperEnabled>true</BootstrapperEnabled> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <FileAlignment>512</FileAlignment> + <ManifestCertificateThumbprint>DCCE7922B5E425ADB221E06DC2FB405664CF8F63</ManifestCertificateThumbprint> + <MapFileExtensions>true</MapFileExtensions> + <OutputType>WinExe</OutputType> + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> + <ProjectGuid>{511A5B59-1C35-4719-8536-23B19AF9B21A}</ProjectGuid> + <PublishWizardCompleted>true</PublishWizardCompleted> + <RestorePackages>true</RestorePackages> + <RootNamespace>Nikse.SubtitleEdit</RootNamespace> + <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">.\</SolutionDir> + <TargetFrameworkProfile> + </TargetFrameworkProfile> + <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> + <AllowUnsafeBlocks>true</AllowUnsafeBlocks> + <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet> + <DebugSymbols>true</DebugSymbols> + <DebugType>full</DebugType> + <DefineConstants>TRACE;DEBUG</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> + <Optimize>false</Optimize> + <OutputPath>bin\Debug\</OutputPath> + <PlatformTarget>AnyCPU</PlatformTarget> + <UseVSHostingProcess>true</UseVSHostingProcess> + <WarningLevel>4</WarningLevel> + <Prefer32Bit>false</Prefer32Bit> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> + <AllowUnsafeBlocks>true</AllowUnsafeBlocks> + <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet> + <DebugType>pdbonly</DebugType> + <DefineConstants>TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> + <Optimize>true</Optimize> + <OutputPath>bin\Release\</OutputPath> + <PlatformTarget>AnyCPU</PlatformTarget> + <UseVSHostingProcess>true</UseVSHostingProcess> + <WarningLevel>4</WarningLevel> + <Prefer32Bit>false</Prefer32Bit> + </PropertyGroup> + <ItemGroup> + <Reference Include="Interop.QuartzTypeLib, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"> + <EmbedInteropTypes>True</EmbedInteropTypes> + <HintPath>DLLs\Interop.QuartzTypeLib.dll</HintPath> + <SpecificVersion>False</SpecificVersion> + </Reference> + <Reference Include="NHunspell, Version=1.2.5554.16953, Culture=neutral, PublicKeyToken=1ac793ea843b4366, processorArchitecture=MSIL"> + <SpecificVersion>False</SpecificVersion> + <HintPath>packages\NHunspell.1.2.5554.16953\lib\net\NHunspell.dll</HintPath> + </Reference> + <Reference Include="System" /> + <Reference Include="System.Data" /> + <Reference Include="System.Drawing" /> + <Reference Include="System.EnterpriseServices" /> + <Reference Include="System.Web.Services" /> + <Reference Include="System.Windows.Forms" /> + <Reference Include="System.Xml" /> + </ItemGroup> + <ItemGroup> + <Compile Include="Controls\SETextBox.cs"> + <SubType>Component</SubType> + </Compile> + <Compile Include="Controls\VideoPlayerContainer.cs"> + <SubType>Component</SubType> + </Compile> + <Compile Include="Controls\TimeUpDown.cs"> + <SubType>UserControl</SubType> + </Compile> + <Compile Include="Controls\TimeUpDown.Designer.cs"> + <DependentUpon>TimeUpDown.cs</DependentUpon> + </Compile> + <Compile Include="Controls\AudioVisualizer.cs"> + <SubType>UserControl</SubType> + </Compile> + <Compile Include="Controls\AudioVisualizer.Designer.cs"> + <DependentUpon>AudioVisualizer.cs</DependentUpon> + </Compile> + <Compile Include="Forms\AlignmentPickerJapanese.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\AlignmentPickerJapanese.Designer.cs"> + <DependentUpon>AlignmentPickerJapanese.cs</DependentUpon> + </Compile> + <Compile Include="Forms\BatchConvertMkvEnding.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\BatchConvertMkvEnding.Designer.cs"> + <DependentUpon>BatchConvertMkvEnding.cs</DependentUpon> + </Compile> + <Compile Include="Forms\BatchConvertTsSettings.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\BatchConvertTsSettings.Designer.cs"> + <DependentUpon>BatchConvertTsSettings.cs</DependentUpon> + </Compile> + <Compile Include="Forms\BookmarkAdd.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\BookmarkAdd.Designer.cs"> + <DependentUpon>BookmarkAdd.cs</DependentUpon> + </Compile> + <Compile Include="Forms\AddWaveformBatch.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\AddWaveformBatch.Designer.cs"> + <DependentUpon>AddWaveformBatch.cs</DependentUpon> + </Compile> + <Compile Include="Forms\AudioToText.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\AudioToText.Designer.cs"> + <DependentUpon>AudioToText.cs</DependentUpon> + </Compile> + <Compile Include="Forms\BookmarksGoTo.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\BookmarksGoTo.Designer.cs"> + <DependentUpon>BookmarksGoTo.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Cavena890SaveOptions.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Cavena890SaveOptions.Designer.cs"> + <DependentUpon>Cavena890SaveOptions.cs</DependentUpon> + </Compile> + <Compile Include="Forms\CheckForUpdates.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\CheckForUpdates.Designer.cs"> + <DependentUpon>CheckForUpdates.cs</DependentUpon> + </Compile> + <Compile Include="Forms\ChooseFontName.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\ChooseFontName.Designer.cs"> + <DependentUpon>ChooseFontName.cs</DependentUpon> + </Compile> + <Compile Include="Forms\ColorChooser.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\DCinema\DCinemaPropertiesInterop.cs"> + <SubType>form</SubType> + </Compile> + <Compile Include="Forms\DCinema\DCinemaPropertiesInterop.Designer.cs"> + <DependentUpon>DCinemaPropertiesInterop.cs</DependentUpon> + </Compile> + <Compile Include="Forms\DCinema\DCinemaPropertiesSmpte.cs"> + <SubType>form</SubType> + </Compile> + <Compile Include="Forms\DCinema\DCinemaPropertiesSmpte.Designer.cs"> + <DependentUpon>DCinemaPropertiesSmpte.cs</DependentUpon> + </Compile> + <Compile Include="Forms\DoNotBreakAfterListEdit.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\DoNotBreakAfterListEdit.Designer.cs"> + <DependentUpon>DoNotBreakAfterListEdit.cs</DependentUpon> + </Compile> + <Compile Include="Forms\About.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\About.Designer.cs"> + <DependentUpon>About.cs</DependentUpon> + </Compile> + <Compile Include="Controls\SubtitleListView.cs"> + <SubType>Component</SubType> + </Compile> + <Compile Include="Forms\AddToNames.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\AddToNames.Designer.cs"> + <DependentUpon>AddToNames.cs</DependentUpon> + </Compile> + <Compile Include="Forms\DownloadFfmpeg.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\DownloadFfmpeg.Designer.cs"> + <DependentUpon>DownloadFfmpeg.cs</DependentUpon> + </Compile> + <Compile Include="Forms\DvdStudioProProperties.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\DvdStudioProProperties.Designer.cs"> + <DependentUpon>DvdStudioProProperties.cs</DependentUpon> + </Compile> + <Compile Include="Forms\EbuLanguageCode.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\EbuLanguageCode.Designer.cs"> + <DependentUpon>EbuLanguageCode.cs</DependentUpon> + </Compile> + <Compile Include="Forms\ExportFcpXmlAdvanced.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\ExportFcpXmlAdvanced.Designer.cs"> + <DependentUpon>ExportFcpXmlAdvanced.cs</DependentUpon> + </Compile> + <Compile Include="Forms\ExportPngXmlDialogOpenFolder.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\ExportPngXmlDialogOpenFolder.Designer.cs"> + <DependentUpon>ExportPngXmlDialogOpenFolder.cs</DependentUpon> + </Compile> + <Compile Include="Forms\ImportCdg.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\ImportCdg.Designer.cs"> + <DependentUpon>ImportCdg.cs</DependentUpon> + </Compile> + <Compile Include="Forms\ImportFinalDraft.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\ImportFinalDraft.Designer.cs"> + <DependentUpon>ImportFinalDraft.cs</DependentUpon> + </Compile> + <Compile Include="Forms\MultipleReplaceExportImport.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\MultipleReplaceExportImport.Designer.cs"> + <DependentUpon>MultipleReplaceExportImport.cs</DependentUpon> + </Compile> + <Compile Include="Forms\NetflixFixErrors.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\NetflixFixErrors.Designer.cs"> + <DependentUpon>NetflixFixErrors.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Ocr\AddBeterMultiMatch.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Ocr\AddBeterMultiMatch.Designer.cs"> + <DependentUpon>AddBeterMultiMatch.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Ocr\AddBetterMultiMatchNOcr.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Ocr\AddBetterMultiMatchNOcr.Designer.cs"> + <DependentUpon>AddBetterMultiMatchNOcr.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Ocr\AddToOcrReplaceList.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Ocr\AddToOcrReplaceList.Designer.cs"> + <DependentUpon>AddToOcrReplaceList.cs</DependentUpon> + </Compile> + <Compile Include="Forms\AddToUserDic.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\AddToUserDic.Designer.cs"> + <DependentUpon>AddToUserDic.cs</DependentUpon> + </Compile> + <Compile Include="Forms\AddWaveform.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\AddWaveform.Designer.cs"> + <DependentUpon>AddWaveform.cs</DependentUpon> + </Compile> + <Compile Include="Forms\AlignmentPicker.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\AlignmentPicker.Designer.cs"> + <DependentUpon>AlignmentPicker.cs</DependentUpon> + </Compile> + <Compile Include="Forms\ApplyDurationLimits.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\ApplyDurationLimits.Designer.cs"> + <DependentUpon>ApplyDurationLimits.cs</DependentUpon> + </Compile> + <Compile Include="Forms\AutoBreakUnbreakLines.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\AutoBreakUnbreakLines.Designer.cs"> + <DependentUpon>AutoBreakUnbreakLines.cs</DependentUpon> + </Compile> + <Compile Include="Forms\BatchConvert.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\BatchConvert.Designer.cs"> + <DependentUpon>BatchConvert.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Beamer.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Beamer.Designer.cs"> + <DependentUpon>Beamer.cs</DependentUpon> + </Compile> + <Compile Include="Forms\ChangeCasing.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\ChangeCasing.Designer.cs"> + <DependentUpon>ChangeCasing.cs</DependentUpon> + </Compile> + <Compile Include="Forms\ChangeCasingNames.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\ChangeCasingNames.Designer.cs"> + <DependentUpon>ChangeCasingNames.cs</DependentUpon> + </Compile> + <Compile Include="Forms\ChangeFrameRate.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\ChangeFrameRate.Designer.cs"> + <DependentUpon>ChangeFrameRate.cs</DependentUpon> + </Compile> + <Compile Include="Forms\ChangeSpeedInPercent.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\ChangeSpeedInPercent.Designer.cs"> + <DependentUpon>ChangeSpeedInPercent.cs</DependentUpon> + </Compile> + <Compile Include="Forms\ChooseAudioTrack.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\ChooseAudioTrack.Designer.cs"> + <DependentUpon>ChooseAudioTrack.cs</DependentUpon> + </Compile> + <Compile Include="Forms\ChooseLanguage.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\ChooseLanguage.Designer.cs"> + <DependentUpon>ChooseLanguage.cs</DependentUpon> + </Compile> + <Compile Include="Forms\ChooseEncoding.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\ChooseEncoding.Designer.cs"> + <DependentUpon>ChooseEncoding.cs</DependentUpon> + </Compile> + <Compile Include="Forms\ChooseResolution.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\ChooseResolution.Designer.cs"> + <DependentUpon>ChooseResolution.cs</DependentUpon> + </Compile> + <Compile Include="Forms\ChooseStyle.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\ChooseStyle.Designer.cs"> + <DependentUpon>ChooseStyle.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Compare.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Compare.Designer.cs"> + <DependentUpon>Compare.cs</DependentUpon> + </Compile> + <Compile Include="Forms\AdjustDisplayDuration.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\AdjustDisplayDuration.Designer.cs"> + <DependentUpon>AdjustDisplayDuration.cs</DependentUpon> + </Compile> + <Compile Include="Forms\DurationsBridgeGaps.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\DurationsBridgeGaps.Designer.cs"> + <DependentUpon>DurationsBridgeGaps.cs</DependentUpon> + </Compile> + <Compile Include="Forms\EbuColorPicker.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\EbuColorPicker.Designer.cs"> + <DependentUpon>EbuColorPicker.cs</DependentUpon> + </Compile> + <Compile Include="Forms\ExportCustomText.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\ExportCustomText.Designer.cs"> + <DependentUpon>ExportCustomText.cs</DependentUpon> + </Compile> + <Compile Include="Forms\ExportCustomTextFormat.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\ExportCustomTextFormat.Designer.cs"> + <DependentUpon>ExportCustomTextFormat.cs</DependentUpon> + </Compile> + <Compile Include="Forms\ExportPngXmlPreview.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\ExportPngXmlPreview.Designer.cs"> + <DependentUpon>ExportPngXmlPreview.cs</DependentUpon> + </Compile> + <Compile Include="Forms\ExportTextST.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\ExportTextST.Designer.cs"> + <DependentUpon>ExportTextST.cs</DependentUpon> + </Compile> + <Compile Include="Forms\FcpProperties.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\FcpProperties.Designer.cs"> + <DependentUpon>FcpProperties.cs</DependentUpon> + </Compile> + <Compile Include="Forms\ImportImages.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\ImportImages.Designer.cs"> + <DependentUpon>ImportImages.cs</DependentUpon> + </Compile> + <Compile Include="Forms\ImportSceneChanges.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\ImportSceneChanges.Designer.cs"> + <DependentUpon>ImportSceneChanges.cs</DependentUpon> + </Compile> + <Compile Include="Forms\ImportUnknownFormat.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\ImportUnknownFormat.Designer.cs"> + <DependentUpon>ImportUnknownFormat.cs</DependentUpon> + </Compile> + <Compile Include="Forms\MeasurementConverter.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\MeasurementConverter.Designer.cs"> + <DependentUpon>MeasurementConverter.cs</DependentUpon> + </Compile> + <Compile Include="Forms\MergeTextWithSameTimeCodes.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\MergeTextWithSameTimeCodes.Designer.cs"> + <DependentUpon>MergeTextWithSameTimeCodes.cs</DependentUpon> + </Compile> + <Compile Include="Forms\MultipleReplaceNewGroup.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\MultipleReplaceNewGroup.Designer.cs"> + <DependentUpon>MultipleReplaceNewGroup.cs</DependentUpon> + </Compile> + <Compile Include="Forms\NuendoProperties.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\NuendoProperties.Designer.cs"> + <DependentUpon>NuendoProperties.cs</DependentUpon> + </Compile> + <Compile Include="Forms\EbuSaveOptions.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\EbuSaveOptions.Designer.cs"> + <DependentUpon>EbuSaveOptions.cs</DependentUpon> + </Compile> + <Compile Include="Forms\EffectKaraoke.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\EffectKaraoke.Designer.cs"> + <DependentUpon>EffectKaraoke.cs</DependentUpon> + </Compile> + <Compile Include="Forms\EffectTypewriter.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\EffectTypewriter.Designer.cs"> + <DependentUpon>EffectTypewriter.cs</DependentUpon> + </Compile> + <Compile Include="Forms\ExportPngXml.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\ExportPngXml.Designer.cs"> + <DependentUpon>ExportPngXml.cs</DependentUpon> + </Compile> + <Compile Include="Forms\ExportText.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\ExportText.Designer.cs"> + <DependentUpon>ExportText.cs</DependentUpon> + </Compile> + <Compile Include="Forms\ExtractDateTimeInfo.cs"> + <SubType>form</SubType> + </Compile> + <Compile Include="Forms\ExtractDateTimeInfo.Designer.cs"> + <DependentUpon>ExtractDateTimeInfo.cs</DependentUpon> + </Compile> + <Compile Include="Forms\FindDialog.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\FindDialog.Designer.cs"> + <DependentUpon>FindDialog.cs</DependentUpon> + </Compile> + <Compile Include="Forms\FindSubtitleLine.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\FindSubtitleLine.Designer.cs"> + <DependentUpon>FindSubtitleLine.cs</DependentUpon> + </Compile> + <Compile Include="Forms\FixCommonErrors.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\FixCommonErrors.Designer.cs"> + <DependentUpon>FixCommonErrors.cs</DependentUpon> + </Compile> + <Compile Include="Forms\DvdSubRip.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\DvdSubRip.Designer.cs"> + <DependentUpon>DvdSubRip.cs</DependentUpon> + </Compile> + <Compile Include="Forms\DvdSubRipChooseLanguage.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\DvdSubRipChooseLanguage.Designer.cs"> + <DependentUpon>DvdSubRipChooseLanguage.cs</DependentUpon> + </Compile> + <Compile Include="Forms\GetDictionaries.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\GetDictionaries.Designer.cs"> + <DependentUpon>GetDictionaries.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Ocr\BinaryOcrChooseEditDb.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Ocr\BinaryOcrChooseEditDb.Designer.cs"> + <DependentUpon>BinaryOcrChooseEditDb.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Ocr\BinaryOcrTrain.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Ocr\BinaryOcrTrain.Designer.cs"> + <DependentUpon>BinaryOcrTrain.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Ocr\GetTesseractDictionaries.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Ocr\GetTesseractDictionaries.Designer.cs"> + <DependentUpon>GetTesseractDictionaries.cs</DependentUpon> + </Compile> + <Compile Include="Forms\HardSubExtract.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\HardSubExtract.Designer.cs"> + <DependentUpon>HardSubExtract.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Interjections.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Interjections.Designer.cs"> + <DependentUpon>Interjections.cs</DependentUpon> + </Compile> + <Compile Include="Forms\JoinSubtitles.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\JoinSubtitles.Designer.cs"> + <DependentUpon>JoinSubtitles.cs</DependentUpon> + </Compile> + <Compile Include="Forms\MergeDoubleLines.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\MergeDoubleLines.Designer.cs"> + <DependentUpon>MergeDoubleLines.cs</DependentUpon> + </Compile> + <Compile Include="Forms\ModifySelection.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\ModifySelection.Designer.cs"> + <DependentUpon>ModifySelection.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Networking\NetworkChat.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Networking\NetworkChat.Designer.cs"> + <DependentUpon>NetworkChat.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Networking\NetworkJoin.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Networking\NetworkJoin.Designer.cs"> + <DependentUpon>NetworkJoin.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Networking\NetworkLogAndInfo.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Networking\NetworkLogAndInfo.Designer.cs"> + <DependentUpon>NetworkLogAndInfo.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Networking\NetworkStart.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Networking\NetworkStart.Designer.cs"> + <DependentUpon>NetworkStart.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Ocr\DownloadTesseract4.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Ocr\DownloadTesseract4.Designer.cs"> + <DependentUpon>DownloadTesseract4.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Ocr\DownloadTesseract302.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Ocr\DownloadTesseract302.Designer.cs"> + <DependentUpon>DownloadTesseract302.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Ocr\GetTesseract302Dictionaries.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Ocr\GetTesseract302Dictionaries.Designer.cs"> + <DependentUpon>GetTesseract302Dictionaries.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Ocr\OcrPreprocessingT4.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Ocr\OcrPreprocessingT4.Designer.cs"> + <DependentUpon>OcrPreprocessingT4.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Ocr\OcrPreprocessingSettings.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Ocr\OcrPreprocessingSettings.Designer.cs"> + <DependentUpon>OcrPreprocessingSettings.cs</DependentUpon> + </Compile> + <Compile Include="Forms\OpenVideoDvd.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\OpenVideoDvd.Designer.cs"> + <DependentUpon>OpenVideoDvd.cs</DependentUpon> + </Compile> + <Compile Include="Forms\PacEncoding.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\PacEncoding.Designer.cs"> + <DependentUpon>PacEncoding.cs</DependentUpon> + </Compile> + <Compile Include="Forms\ColumnPaste.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\ColumnPaste.Designer.cs"> + <DependentUpon>ColumnPaste.cs</DependentUpon> + </Compile> + <Compile Include="Forms\PluginsGet.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\PluginsGet.Designer.cs"> + <DependentUpon>PluginsGet.cs</DependentUpon> + </Compile> + <Compile Include="Forms\PositionAndSizeForm.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\ProfileChoose.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\ProfileChoose.Designer.cs"> + <DependentUpon>ProfileChoose.cs</DependentUpon> + </Compile> + <Compile Include="Forms\RestoreAutoBackup.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\RestoreAutoBackup.Designer.cs"> + <DependentUpon>RestoreAutoBackup.cs</DependentUpon> + </Compile> + <Compile Include="Forms\RubyJapanese.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\RubyJapanese.Designer.cs"> + <DependentUpon>RubyJapanese.cs</DependentUpon> + </Compile> + <Compile Include="Forms\SeekSilence.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\SeekSilence.Designer.cs"> + <DependentUpon>SeekSilence.cs</DependentUpon> + </Compile> + <Compile Include="Forms\SetSyncPoint.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\SetSyncPoint.Designer.cs"> + <DependentUpon>SetSyncPoint.cs</DependentUpon> + </Compile> + <Compile Include="Forms\GoogleTranslate.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\GoogleTranslate.Designer.cs"> + <DependentUpon>GoogleTranslate.cs</DependentUpon> + </Compile> + <Compile Include="Forms\GoToLine.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\GoToLine.Designer.cs"> + <DependentUpon>GoToLine.cs</DependentUpon> + </Compile> + <Compile Include="Forms\ImportText.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\ImportText.Designer.cs"> + <DependentUpon>ImportText.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Main.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Main.Designer.cs"> + <DependentUpon>Main.cs</DependentUpon> + </Compile> + <Compile Include="Forms\MatroskaSubtitleChooser.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\MatroskaSubtitleChooser.Designer.cs"> + <DependentUpon>MatroskaSubtitleChooser.cs</DependentUpon> + </Compile> + <Compile Include="Forms\MergeShortLines.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\MergeShortLines.Designer.cs"> + <DependentUpon>MergeShortLines.cs</DependentUpon> + </Compile> + <Compile Include="Forms\MultipleReplace.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\MultipleReplace.Designer.cs"> + <DependentUpon>MultipleReplace.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Ocr\OCRSpellCheck.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Ocr\OCRSpellCheck.Designer.cs"> + <DependentUpon>OCRSpellCheck.cs</DependentUpon> + </Compile> + <Compile Include="Forms\RemoveTextFromHearImpaired.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\RemoveTextFromHearImpaired.Designer.cs"> + <DependentUpon>RemoveTextFromHearImpaired.cs</DependentUpon> + </Compile> + <Compile Include="Forms\ReplaceDialog.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\ReplaceDialog.Designer.cs"> + <DependentUpon>ReplaceDialog.cs</DependentUpon> + </Compile> + <Compile Include="Forms\SetMinimumDisplayTimeBetweenParagraphs.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\SetMinimumDisplayTimeBetweenParagraphs.Designer.cs"> + <DependentUpon>SetMinimumDisplayTimeBetweenParagraphs.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Settings.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Settings.Designer.cs"> + <DependentUpon>Settings.cs</DependentUpon> + </Compile> + <Compile Include="Forms\SettingsFixContinuationStyle.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\SettingsFixContinuationStyle.Designer.cs"> + <DependentUpon>SettingsFixContinuationStyle.cs</DependentUpon> + </Compile> + <Compile Include="Forms\SettingsGapChoose.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\SettingsGapChoose.Designer.cs"> + <DependentUpon>SettingsGapChoose.cs</DependentUpon> + </Compile> + <Compile Include="Forms\SettingsLineWidth.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\SettingsLineWidth.Designer.cs"> + <DependentUpon>SettingsLineWidth.cs</DependentUpon> + </Compile> + <Compile Include="Forms\SettingsMpv.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\SettingsMpv.Designer.cs"> + <DependentUpon>SettingsMpv.cs</DependentUpon> + </Compile> + <Compile Include="Forms\SettingsProfile.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\SettingsProfile.Designer.cs"> + <DependentUpon>SettingsProfile.cs</DependentUpon> + </Compile> + <Compile Include="Forms\SettingsProfileExport.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\SettingsProfileExport.Designer.cs"> + <DependentUpon>SettingsProfileExport.cs</DependentUpon> + </Compile> + <Compile Include="Forms\SetVideoOffset.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\SetVideoOffset.Designer.cs"> + <DependentUpon>SetVideoOffset.cs</DependentUpon> + </Compile> + <Compile Include="Forms\ShowEarlierLater.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\ShowEarlierLater.Designer.cs"> + <DependentUpon>ShowEarlierLater.cs</DependentUpon> + </Compile> + <Compile Include="Forms\ShowHistory.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\ShowHistory.Designer.cs"> + <DependentUpon>ShowHistory.cs</DependentUpon> + </Compile> + <Compile Include="Forms\SpellCheck.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\SpellCheck.Designer.cs"> + <DependentUpon>SpellCheck.cs</DependentUpon> + </Compile> + <Compile Include="Forms\DialogDoNotShowAgain.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\DialogDoNotShowAgain.Designer.cs"> + <DependentUpon>DialogDoNotShowAgain.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Split.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Split.Designer.cs"> + <DependentUpon>Split.cs</DependentUpon> + </Compile> + <Compile Include="Forms\SplitLongLines.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\SplitLongLines.Designer.cs"> + <DependentUpon>SplitLongLines.cs</DependentUpon> + </Compile> + <Compile Include="Forms\SplitSubtitle.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\SplitSubtitle.Designer.cs"> + <DependentUpon>SplitSubtitle.cs</DependentUpon> + </Compile> + <Compile Include="Forms\StartNumberingFrom.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\StartNumberingFrom.Designer.cs"> + <DependentUpon>StartNumberingFrom.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Statistics.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Statistics.Designer.cs"> + <DependentUpon>Statistics.cs</DependentUpon> + </Compile> + <Compile Include="Forms\StatusLog.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\StatusLog.Designer.cs"> + <DependentUpon>StatusLog.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Styles\StylesForm.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Styles\SubStationAlphaStylesBatchConvert.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Styles\SubStationAlphaStylesBatchConvert.Designer.cs"> + <DependentUpon>SubStationAlphaStylesBatchConvert.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Styles\SubStationAlphaStylesExport.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Styles\SubStationAlphaStylesExport.Designer.cs"> + <DependentUpon>SubStationAlphaStylesExport.cs</DependentUpon> + </Compile> + <Compile Include="Forms\SubStationAlphaProperties.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\SubStationAlphaProperties.Designer.cs"> + <DependentUpon>SubStationAlphaProperties.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Styles\SubStationAlphaStyles.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Styles\SubStationAlphaStyles.Designer.cs"> + <DependentUpon>SubStationAlphaStyles.cs</DependentUpon> + </Compile> + <Compile Include="Forms\TimedTextNewLanguage.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\TimedTextNewLanguage.Designer.cs"> + <DependentUpon>TimedTextNewLanguage.cs</DependentUpon> + </Compile> + <Compile Include="Forms\TimedTextProperties.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\TimedTextProperties.Designer.cs"> + <DependentUpon>TimedTextProperties.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Styles\TimedTextStyles.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Styles\TimedTextStyles.Designer.cs"> + <DependentUpon>TimedTextStyles.cs</DependentUpon> + </Compile> + <Compile Include="Forms\TransportStreamSubtitleChooser.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\TransportStreamSubtitleChooser.Designer.cs"> + <DependentUpon>TransportStreamSubtitleChooser.cs</DependentUpon> + </Compile> + <Compile Include="Forms\UnknownSubtitle.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\UnknownSubtitle.Designer.cs"> + <DependentUpon>UnknownSubtitle.cs</DependentUpon> + </Compile> + <Compile Include="Forms\VideoControlsUndocked.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\VideoControlsUndocked.Designer.cs"> + <DependentUpon>VideoControlsUndocked.cs</DependentUpon> + </Compile> + <Compile Include="Forms\VideoError.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\VideoError.Designer.cs"> + <DependentUpon>VideoError.cs</DependentUpon> + </Compile> + <Compile Include="Forms\VideoPlayerUndocked.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\VideoPlayerUndocked.Designer.cs"> + <DependentUpon>VideoPlayerUndocked.cs</DependentUpon> + </Compile> + <Compile Include="Forms\VisualSync.cs"> + <SubType>form</SubType> + </Compile> + <Compile Include="Forms\VisualSync.Designer.cs"> + <DependentUpon>VisualSync.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Ocr\VobSubCharactersImport.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Ocr\VobSubCharactersImport.Designer.cs"> + <DependentUpon>VobSubCharactersImport.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Ocr\VobSubEditCharacters.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Ocr\VobSubEditCharacters.Designer.cs"> + <DependentUpon>VobSubEditCharacters.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Ocr\VobSubNOcrCharacterInspect.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Ocr\VobSubNOcrCharacterInspect.Designer.cs"> + <DependentUpon>VobSubNOcrCharacterInspect.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Ocr\VobSubNOcrEdit.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Ocr\VobSubNOcrEdit.Designer.cs"> + <DependentUpon>VobSubNOcrEdit.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Ocr\VobSubNOcrTrain.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Ocr\VobSubNOcrTrain.Designer.cs"> + <DependentUpon>VobSubNOcrTrain.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Ocr\VobSubOcr.cs"> + <SubType>form</SubType> + </Compile> + <Compile Include="Forms\Ocr\VobSubOcr.Designer.cs"> + <DependentUpon>VobSubOcr.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Ocr\VobSubOcrCharacter.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Ocr\VobSubOcrCharacter.Designer.cs"> + <DependentUpon>VobSubOcrCharacter.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Ocr\VobSubOcrCharacterInspect.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Ocr\VobSubOcrCharacterInspect.Designer.cs"> + <DependentUpon>VobSubOcrCharacterInspect.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Ocr\VobSubOcrNewFolder.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Ocr\VobSubOcrNewFolder.Designer.cs"> + <DependentUpon>VobSubOcrNewFolder.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Ocr\VobSubOcrNOcrCharacter.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Ocr\VobSubOcrNOcrCharacter.Designer.cs"> + <DependentUpon>VobSubOcrNOcrCharacter.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Ocr\VobSubOcrSetItalicFactor.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Ocr\VobSubOcrSetItalicFactor.Designer.cs"> + <DependentUpon>VobSubOcrSetItalicFactor.cs</DependentUpon> + </Compile> + <Compile Include="Forms\Watermark.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\Watermark.Designer.cs"> + <DependentUpon>Watermark.cs</DependentUpon> + </Compile> + <Compile Include="Forms\WaveformGenerateTimeCodes.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\WaveformGenerateTimeCodes.Designer.cs"> + <DependentUpon>WaveformGenerateTimeCodes.cs</DependentUpon> + </Compile> + <Compile Include="Forms\WaveformUndocked.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\WaveformUndocked.Designer.cs"> + <DependentUpon>WaveformUndocked.cs</DependentUpon> + </Compile> + <Compile Include="Forms\GoogleOrMicrosoftTranslate.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\GoogleOrMicrosoftTranslate.Designer.cs"> + <DependentUpon>GoogleOrMicrosoftTranslate.cs</DependentUpon> + </Compile> + <Compile Include="Forms\TextPrompt.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\TextPrompt.Designer.cs"> + <DependentUpon>TextPrompt.cs</DependentUpon> + </Compile> + <Compile Include="Forms\YouTubeAnnotationsImport.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\YouTubeAnnotationsImport.Designer.cs"> + <DependentUpon>YouTubeAnnotationsImport.cs</DependentUpon> + </Compile> + <Compile Include="Logic\ColorChooser\ColorChangedEventArgs.cs" /> + <Compile Include="Logic\ColorChooser\ColorHandler.cs" /> + <Compile Include="Logic\ColorChooser\ColorWheel.cs" /> + <Compile Include="Logic\CommandLineConvert\BluRaySupToBluRaySup.cs" /> + <Compile Include="Logic\CommandLineConvert\CommandLineConverter.cs"> + <SubType>Code</SubType> + </Compile> + <Compile Include="Logic\CommandLineConvert\TsToBdnXml.cs" /> + <Compile Include="Logic\CommandLineConvert\TsConvert.cs" /> + <Compile Include="Logic\CommandLineConvert\TsToBluRaySup.cs" /> + <Compile Include="Logic\DarkTheme.cs" /> + <Compile Include="Logic\FindReplaceDialogHelper.cs" /> + <Compile Include="Logic\SceneChangesGenerator.cs" /> + <Compile Include="Logic\ListViewSorter.cs" /> + <Compile Include="Logic\NativeMethods.cs" /> + <Compile Include="Logic\NikseBitmapImageSplitter.cs" /> + <Compile Include="Logic\Networking\NikseWebServiceSession.cs"> + <SubType>Code</SubType> + </Compile> + <Compile Include="Logic\Networking\UpdateLogEntry.cs"> + <SubType>Code</SubType> + </Compile> + <Compile Include="Logic\Ocr\Binary\BinaryOcrBitmap.cs" /> + <Compile Include="Logic\Ocr\Binary\BinaryOcrDb.cs" /> + <Compile Include="Logic\Ocr\MatchesToItalicStringConverter.cs" /> + <Compile Include="Logic\Ocr\ModiLanguage.cs" /> + <Compile Include="Logic\Ocr\NOcrDb.cs" /> + <Compile Include="Logic\Ocr\OcrAlphabet.cs" /> + <Compile Include="Logic\Ocr\NOcrChar.cs" /> + <Compile Include="Logic\Ocr\OcrCharacter.cs" /> + <Compile Include="Logic\Ocr\OcrFixEngine.cs" /> + <Compile Include="Logic\Ocr\OcrImage.cs" /> + <Compile Include="Logic\Ocr\NOcrPoint.cs" /> + <Compile Include="Logic\Ocr\PreprocessingSettings.cs" /> + <Compile Include="Logic\Ocr\SpellCheckOcrTextResult.cs" /> + <Compile Include="Logic\Ocr\Tesseract\TesseractMultiThreadRunner.cs" /> + <Compile Include="Logic\Ocr\Tesseract\TesseractThreadRunner.cs" /> + <Compile Include="Logic\Ocr\Tesseract\TesseractRunner.cs" /> + <Compile Include="Logic\Ocr\Tesseract\TesseractMultiRunner.cs" /> + <Compile Include="Logic\RtfTextConverterRichTextBox.cs" /> + <Compile Include="Logic\MainShortcuts.cs" /> + <Compile Include="Logic\SpellCheck\Hunspell.cs" /> + <Compile Include="Logic\SpellCheck\LinuxHunspell.cs" /> + <Compile Include="Logic\SpellCheck\MacHunspell.cs" /> + <Compile Include="Logic\SpellCheck\VoikkoSpellCheck.cs" /> + <Compile Include="Logic\SpellCheck\WindowsHunspell.cs" /> + <Compile Include="Logic\SyncContextExtensions.cs" /> + <Compile Include="Logic\TaskbarList.cs" /> + <Compile Include="Logic\TextDesigner.cs" /> + <Compile Include="Logic\TextWidth.cs" /> + <Compile Include="Logic\UiEbuSaveHelper.cs" /> + <Compile Include="Logic\UiGetPacEncoding.cs" /> + <Compile Include="Logic\UiGetYouTubeAnnotationStyles.cs" /> + <Compile Include="Logic\UiUtil.cs" /> + <Compile Include="Logic\VideoPlayers\LibMpvMono.cs" /> + <Compile Include="Logic\VideoPlayers\LibMpvDynamic.cs" /> + <Compile Include="Logic\VideoPlayers\LibVlcDynamic.cs" /> + <Compile Include="Logic\VideoPlayers\LibVlcMono.cs" /> + <Compile Include="Logic\VideoPlayers\MpcHC\MessageHandlerWindow.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Logic\VideoPlayers\MpcHC\MessageHandlerWindow.Designer.cs"> + <DependentUpon>MessageHandlerWindow.cs</DependentUpon> + </Compile> + <Compile Include="Logic\VideoPlayers\MpcHC\MpcHcCommand.cs" /> + <Compile Include="Logic\VideoPlayers\MpcHC\MpcHc.cs" /> + <Compile Include="Logic\VideoPlayers\MpcHC\NativeMethods.cs" /> + <Compile Include="Logic\VideoPlayers\QuartsPlayer.cs" /> + <Compile Include="Logic\VideoPlayers\VideoPlayer.cs" /> + <Compile Include="Logic\WordSpellChecker.cs" /> + <Compile Include="Program.cs" /> + <Compile Include="Properties\AssemblyInfo.cs" /> + <Compile Include="Forms\SyncPointsSync.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\SyncPointsSync.Designer.cs"> + <DependentUpon>SyncPointsSync.cs</DependentUpon> + </Compile> + <Compile Include="Properties\Resources.Designer.cs"> + <AutoGen>True</AutoGen> + <DesignTime>True</DesignTime> + <DependentUpon>Resources.resx</DependentUpon> + </Compile> + <Compile Include="Web References\SeNetworkService\Reference.cs"> + <AutoGen>True</AutoGen> + <DesignTime>True</DesignTime> + <DependentUpon>Reference.map</DependentUpon> + </Compile> + <EmbeddedResource Include="Controls\TimeUpDown.resx"> + <DependentUpon>TimeUpDown.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Controls\AudioVisualizer.resx"> + <DependentUpon>AudioVisualizer.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\AlignmentPickerJapanese.resx"> + <DependentUpon>AlignmentPickerJapanese.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\BatchConvertMkvEnding.resx"> + <DependentUpon>BatchConvertMkvEnding.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\BatchConvertTsSettings.resx"> + <DependentUpon>BatchConvertTsSettings.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\BookmarkAdd.resx"> + <DependentUpon>BookmarkAdd.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\AddWaveformBatch.resx"> + <DependentUpon>AddWaveformBatch.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\AudioToText.resx"> + <DependentUpon>AudioToText.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\BookmarksGoTo.resx"> + <DependentUpon>BookmarksGoTo.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Cavena890SaveOptions.resx"> + <DependentUpon>Cavena890SaveOptions.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\CheckForUpdates.resx"> + <DependentUpon>CheckForUpdates.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\ChooseFontName.resx"> + <DependentUpon>ChooseFontName.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\ColorChooser.resx"> + <DependentUpon>ColorChooser.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\DCinema\DCinemaPropertiesInterop.resx"> + <DependentUpon>DCinemaPropertiesInterop.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\DCinema\DCinemaPropertiesSmpte.resx"> + <DependentUpon>DCinemaPropertiesSmpte.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\DoNotBreakAfterListEdit.resx"> + <DependentUpon>DoNotBreakAfterListEdit.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\About.resx"> + <DependentUpon>About.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\AddToNames.resx"> + <DependentUpon>AddToNames.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\DownloadFfmpeg.resx"> + <DependentUpon>DownloadFfmpeg.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\DvdStudioProProperties.resx"> + <DependentUpon>DvdStudioProProperties.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\EbuLanguageCode.resx"> + <DependentUpon>EbuLanguageCode.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\ExportFcpXmlAdvanced.resx"> + <DependentUpon>ExportFcpXmlAdvanced.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\ExportPngXmlDialogOpenFolder.resx"> + <DependentUpon>ExportPngXmlDialogOpenFolder.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\ImportCdg.resx"> + <DependentUpon>ImportCdg.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\ImportFinalDraft.resx"> + <DependentUpon>ImportFinalDraft.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\MultipleReplaceExportImport.resx"> + <DependentUpon>MultipleReplaceExportImport.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\NetflixFixErrors.resx"> + <DependentUpon>NetflixFixErrors.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Ocr\AddBeterMultiMatch.resx"> + <DependentUpon>AddBeterMultiMatch.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Ocr\AddBetterMultiMatchNOcr.resx"> + <DependentUpon>AddBetterMultiMatchNOcr.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Ocr\AddToOcrReplaceList.resx"> + <DependentUpon>AddToOcrReplaceList.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\AddToUserDic.resx"> + <DependentUpon>AddToUserDic.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\AddWaveform.resx"> + <DependentUpon>AddWaveform.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\AlignmentPicker.resx"> + <DependentUpon>AlignmentPicker.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\ApplyDurationLimits.resx"> + <DependentUpon>ApplyDurationLimits.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\BatchConvert.resx"> + <DependentUpon>BatchConvert.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Beamer.resx"> + <DependentUpon>Beamer.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\ChangeCasing.resx"> + <DependentUpon>ChangeCasing.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\ChangeFrameRate.resx"> + <DependentUpon>ChangeFrameRate.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\ChangeSpeedInPercent.resx"> + <DependentUpon>ChangeSpeedInPercent.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\ChooseAudioTrack.resx"> + <DependentUpon>ChooseAudioTrack.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\ChooseEncoding.resx"> + <DependentUpon>ChooseEncoding.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\AdjustDisplayDuration.resx"> + <DependentUpon>AdjustDisplayDuration.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\ChooseResolution.resx"> + <DependentUpon>ChooseResolution.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\ChooseStyle.resx"> + <DependentUpon>ChooseStyle.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\DurationsBridgeGaps.resx"> + <DependentUpon>DurationsBridgeGaps.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\EbuColorPicker.resx"> + <DependentUpon>EbuColorPicker.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\ExportCustomText.resx"> + <DependentUpon>ExportCustomText.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\ExportCustomTextFormat.resx"> + <DependentUpon>ExportCustomTextFormat.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\ExportPngXmlPreview.resx"> + <DependentUpon>ExportPngXmlPreview.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\ExportTextST.resx"> + <DependentUpon>ExportTextST.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\FcpProperties.resx"> + <DependentUpon>FcpProperties.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\ImportImages.resx"> + <DependentUpon>ImportImages.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\ImportSceneChanges.resx"> + <DependentUpon>ImportSceneChanges.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\ImportUnknownFormat.resx"> + <DependentUpon>ImportUnknownFormat.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\MeasurementConverter.resx"> + <DependentUpon>MeasurementConverter.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\MergeTextWithSameTimeCodes.resx"> + <DependentUpon>MergeTextWithSameTimeCodes.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\MultipleReplaceNewGroup.resx"> + <DependentUpon>MultipleReplaceNewGroup.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\NuendoProperties.resx"> + <DependentUpon>NuendoProperties.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\EbuSaveOptions.resx"> + <DependentUpon>EbuSaveOptions.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\EffectKaraoke.resx"> + <DependentUpon>EffectKaraoke.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\EffectTypewriter.resx"> + <DependentUpon>EffectTypewriter.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\ExportPngXml.resx"> + <DependentUpon>ExportPngXml.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\ExportText.resx"> + <DependentUpon>ExportText.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\ExtractDateTimeInfo.resx"> + <DependentUpon>ExtractDateTimeInfo.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\FindDialog.resx"> + <DependentUpon>FindDialog.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\FindSubtitleLine.resx"> + <DependentUpon>FindSubtitleLine.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\FixCommonErrors.resx"> + <DependentUpon>FixCommonErrors.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\DvdSubRip.resx"> + <DependentUpon>DvdSubRip.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\DvdSubRipChooseLanguage.resx"> + <DependentUpon>DvdSubRipChooseLanguage.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\GetDictionaries.resx"> + <DependentUpon>GetDictionaries.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Ocr\BinaryOcrChooseEditDb.resx"> + <DependentUpon>BinaryOcrChooseEditDb.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Ocr\BinaryOcrTrain.resx"> + <DependentUpon>BinaryOcrTrain.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Ocr\GetTesseractDictionaries.resx"> + <DependentUpon>GetTesseractDictionaries.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\HardSubExtract.resx"> + <DependentUpon>HardSubExtract.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Interjections.resx"> + <DependentUpon>Interjections.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\JoinSubtitles.resx"> + <DependentUpon>JoinSubtitles.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\MergeDoubleLines.resx"> + <DependentUpon>MergeDoubleLines.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\ModifySelection.resx"> + <DependentUpon>ModifySelection.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Networking\NetworkChat.resx"> + <DependentUpon>NetworkChat.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Networking\NetworkJoin.resx"> + <DependentUpon>NetworkJoin.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Networking\NetworkLogAndInfo.resx"> + <DependentUpon>NetworkLogAndInfo.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Networking\NetworkStart.resx"> + <DependentUpon>NetworkStart.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Ocr\DownloadTesseract4.resx"> + <DependentUpon>DownloadTesseract4.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Ocr\DownloadTesseract302.resx"> + <DependentUpon>DownloadTesseract302.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Ocr\GetTesseract302Dictionaries.resx"> + <DependentUpon>GetTesseract302Dictionaries.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Ocr\OcrPreprocessingT4.resx"> + <DependentUpon>OcrPreprocessingT4.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Ocr\OcrPreprocessingSettings.resx"> + <DependentUpon>OcrPreprocessingSettings.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\OpenVideoDvd.resx"> + <DependentUpon>OpenVideoDvd.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\PacEncoding.resx"> + <DependentUpon>PacEncoding.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\ColumnPaste.resx"> + <DependentUpon>ColumnPaste.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\PluginsGet.resx"> + <DependentUpon>PluginsGet.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\ProfileChoose.resx"> + <DependentUpon>ProfileChoose.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\RestoreAutoBackup.resx"> + <DependentUpon>RestoreAutoBackup.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\RubyJapanese.resx"> + <DependentUpon>RubyJapanese.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\SeekSilence.resx"> + <DependentUpon>SeekSilence.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\SetSyncPoint.resx"> + <DependentUpon>SetSyncPoint.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\GoogleTranslate.resx"> + <DependentUpon>GoogleTranslate.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\GoToLine.resx"> + <DependentUpon>GoToLine.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\ImportText.resx"> + <DependentUpon>ImportText.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\MatroskaSubtitleChooser.resx"> + <DependentUpon>MatroskaSubtitleChooser.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\MergeShortLines.resx"> + <DependentUpon>MergeShortLines.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\RemoveTextFromHearImpaired.resx"> + <DependentUpon>RemoveTextFromHearImpaired.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\ReplaceDialog.resx"> + <DependentUpon>ReplaceDialog.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\SetMinimumDisplayTimeBetweenParagraphs.resx"> + <DependentUpon>SetMinimumDisplayTimeBetweenParagraphs.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Settings.resx"> + <DependentUpon>Settings.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\SettingsFixContinuationStyle.resx"> + <DependentUpon>SettingsFixContinuationStyle.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\SettingsGapChoose.resx"> + <DependentUpon>SettingsGapChoose.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\SettingsLineWidth.resx"> + <DependentUpon>SettingsLineWidth.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\SettingsMpv.resx"> + <DependentUpon>SettingsMpv.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\SettingsProfile.resx"> + <DependentUpon>SettingsProfile.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\SettingsProfileExport.resx"> + <DependentUpon>SettingsProfileExport.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\SetVideoOffset.resx"> + <DependentUpon>SetVideoOffset.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\ShowHistory.resx"> + <DependentUpon>ShowHistory.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\SpellCheck.resx"> + <DependentUpon>SpellCheck.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\DialogDoNotShowAgain.resx"> + <DependentUpon>DialogDoNotShowAgain.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Split.resx"> + <DependentUpon>Split.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\SplitLongLines.resx"> + <DependentUpon>SplitLongLines.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\SplitSubtitle.resx"> + <DependentUpon>SplitSubtitle.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\StartNumberingFrom.resx"> + <DependentUpon>StartNumberingFrom.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Statistics.resx"> + <DependentUpon>Statistics.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\StatusLog.resx"> + <DependentUpon>StatusLog.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Styles\SubStationAlphaStylesBatchConvert.resx"> + <DependentUpon>SubStationAlphaStylesBatchConvert.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Styles\SubStationAlphaStylesExport.resx"> + <DependentUpon>SubStationAlphaStylesExport.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\SubStationAlphaProperties.resx"> + <DependentUpon>SubStationAlphaProperties.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Styles\SubStationAlphaStyles.resx"> + <DependentUpon>SubStationAlphaStyles.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\TimedTextNewLanguage.resx"> + <DependentUpon>TimedTextNewLanguage.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\TimedTextProperties.resx"> + <DependentUpon>TimedTextProperties.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Styles\TimedTextStyles.resx"> + <DependentUpon>TimedTextStyles.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\TransportStreamSubtitleChooser.resx"> + <DependentUpon>TransportStreamSubtitleChooser.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\UnknownSubtitle.resx"> + <DependentUpon>UnknownSubtitle.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\VideoControlsUndocked.resx"> + <DependentUpon>VideoControlsUndocked.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\VideoPlayerUndocked.resx"> + <DependentUpon>VideoPlayerUndocked.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\VisualSync.resx"> + <DependentUpon>VisualSync.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Ocr\VobSubCharactersImport.resx"> + <DependentUpon>VobSubCharactersImport.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Ocr\VobSubNOcrCharacterInspect.resx"> + <DependentUpon>VobSubNOcrCharacterInspect.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Ocr\VobSubNOcrEdit.resx"> + <DependentUpon>VobSubNOcrEdit.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Ocr\VobSubNOcrTrain.resx"> + <DependentUpon>VobSubNOcrTrain.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Ocr\VobSubOcr.resx"> + <DependentUpon>VobSubOcr.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Ocr\VobSubOcrCharacter.resx"> + <DependentUpon>VobSubOcrCharacter.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Ocr\VobSubOcrCharacterInspect.resx"> + <DependentUpon>VobSubOcrCharacterInspect.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Ocr\VobSubOcrNewFolder.resx"> + <DependentUpon>VobSubOcrNewFolder.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Ocr\VobSubOcrNOcrCharacter.resx"> + <DependentUpon>VobSubOcrNOcrCharacter.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Ocr\VobSubOcrSetItalicFactor.resx"> + <DependentUpon>VobSubOcrSetItalicFactor.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Watermark.resx"> + <DependentUpon>Watermark.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\WaveformGenerateTimeCodes.resx"> + <DependentUpon>WaveformGenerateTimeCodes.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\WaveformUndocked.resx"> + <DependentUpon>WaveformUndocked.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\GoogleOrMicrosoftTranslate.resx"> + <DependentUpon>GoogleOrMicrosoftTranslate.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\TextPrompt.resx"> + <DependentUpon>TextPrompt.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\YouTubeAnnotationsImport.resx"> + <DependentUpon>YouTubeAnnotationsImport.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Logic\VideoPlayers\MpcHC\MessageHandlerWindow.resx"> + <DependentUpon>MessageHandlerWindow.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Properties\Resources.resx"> + <Generator>PublicResXFileCodeGenerator</Generator> + <SubType>Designer</SubType> + <LastGenOutput>Resources.Designer.cs</LastGenOutput> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Main.resx"> + <DependentUpon>Main.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\SyncPointsSync.resx"> + <DependentUpon>SyncPointsSync.cs</DependentUpon> + </EmbeddedResource> + <None Include="app.config" /> + <None Include="packages.config"> + <SubType>Designer</SubType> + </None> + <None Include="Properties\Settings.settings"> + <Generator>SettingsSingleFileGenerator</Generator> + <LastGenOutput>Settings.Designer.cs</LastGenOutput> + </None> + <Compile Include="Properties\Settings.Designer.cs"> + <AutoGen>True</AutoGen> + <DependentUpon>Settings.settings</DependentUpon> + <DesignTimeSharedInput>True</DesignTimeSharedInput> + </Compile> + <EmbeddedResource Include="Resources\HunspellDictionaries.xml.gz" /> + <EmbeddedResource Include="Resources\HunspellBackupDictionaries.xml.gz" /> + <EmbeddedResource Include="Resources\TesseractDictionaries.xml.gz" /> + <None Include="Resources\nOCR_TesseractHelper.xml.gz" /> + <None Include="Resources\SMPTE-428-7-2007-DCST.xsd"> + <SubType>Designer</SubType> + </None> + <EmbeddedResource Include="Resources\SMPTE-428-7-2007-DCST.xsd.gz" /> + <None Include="Resources\SMPTE-428-7-2010-DCST.xsd"> + <SubType>Designer</SubType> + </None> + <EmbeddedResource Include="Resources\SMPTE-428-7-2010-DCST.xsd.gz" /> + <None Include="Resources\SMPTE-428-7-2014-DCST.xsd"> + <SubType>Designer</SubType> + </None> + <EmbeddedResource Include="Resources\SMPTE-428-7-2014-DCST.xsd.gz" /> + <None Include="Web References\SeNetworkService\Reference.map"> + <Generator>MSDiscoCodeGenerator</Generator> + <LastGenOutput>Reference.cs</LastGenOutput> + </None> + <None Include="Web References\SeNetworkService\SeSequence.datasource"> + <DependentUpon>Reference.map</DependentUpon> + </None> + <None Include="Web References\SeNetworkService\SeService.wsdl" /> + <None Include="Web References\SeNetworkService\SeUpdate.datasource"> + <DependentUpon>Reference.map</DependentUpon> + </None> + <None Include="Web References\SeNetworkService\SeUser.datasource"> + <DependentUpon>Reference.map</DependentUpon> + </None> + </ItemGroup> + <ItemGroup> + <Content Include="DLLs\Voikkox64.dll" /> + <Content Include="DLLs\Voikkox86.dll" /> + <Content Include="Languages\ar-EG.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\bg-BG.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\br-FR.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\ca-ES.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\cs-CZ.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\da-DK.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\de-DE.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\el-GR.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\es-AR.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\es-ES.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\es-MX.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\eu-ES.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\fa-IR.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\fi-FI.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\fr-FR.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\hr-HR.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\hu-HU.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\id-ID.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\it-IT.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\ja-JP.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\ko-KR.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\mk-MK.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\nb-NO.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\nl-NL.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\pl-PL.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\pt-BR.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\pt-PT.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\ro-RO.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\ru-RU.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\sl-SI.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\sr-Cyrl-RS.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\sr-Latn-RS.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\sv-SE.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\th-TH.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\tr-TR.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\uk-UA.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\vi-VN.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\zh-Hans.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <Content Include="Languages\zh-TW.xml"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Content> + <None Include="Web References\SeNetworkService\SeService.disco" /> + <None Include="DLLs\Interop.QuartzTypeLib.dll" /> + <Content Include="..\Changelog.txt" /> + <Content Include="..\LICENSE.txt" /> + <EmbeddedResource Include="Controls\VideoPlayerContainer.resx"> + <DependentUpon>VideoPlayerContainer.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\AutoBreakUnbreakLines.resx"> + <DependentUpon>AutoBreakUnbreakLines.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\ChangeCasingNames.resx"> + <DependentUpon>ChangeCasingNames.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\ChooseLanguage.resx"> + <DependentUpon>ChooseLanguage.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Compare.resx"> + <DependentUpon>Compare.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\MultipleReplace.resx"> + <DependentUpon>MultipleReplace.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Ocr\OCRSpellCheck.resx"> + <DependentUpon>OCRSpellCheck.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\ShowEarlierLater.resx"> + <DependentUpon>ShowEarlierLater.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\VideoError.resx"> + <DependentUpon>VideoError.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <EmbeddedResource Include="Forms\Ocr\VobSubEditCharacters.resx"> + <DependentUpon>VobSubEditCharacters.cs</DependentUpon> + <SubType>Designer</SubType> + </EmbeddedResource> + <None Include="Icons\connect.png" /> + <None Include="Icons\Donate.png" /> + <Content Include="Icons\SE.ico" /> + <Content Include="Icons\Find.png" /> + <Content Include="Icons\FixCommonErrors.png" /> + <Content Include="Icons\Help.png" /> + <Content Include="Icons\New.png" /> + <Content Include="Icons\Open.png" /> + <Content Include="Icons\RemoveTextForHI.png" /> + <Content Include="Icons\Replace.png" /> + <Content Include="Icons\Save.png" /> + <Content Include="Icons\SaveAs.png" /> + <Content Include="Icons\Settings.png" /> + <Content Include="Icons\SpellCheck.png" /> + <Content Include="Icons\VideoToggle.png" /> + <Content Include="Icons\VisualSync.png" /> + <Content Include="Icons\WaveformToggle.png" /> + <None Include="Resources\bookmark22.png" /> + <None Include="Resources\pictureBoxFS.Image.png" /> + <None Include="Resources\pictureBoxFSDown.Image.png" /> + <None Include="Resources\pictureBoxFSOver.Image.png" /> + <None Include="Resources\pictureBoxFastForward.Image.png" /> + <None Include="Resources\pictureBoxFastForwardMouseDown.Image.png" /> + <None Include="Resources\pictureBoxFastForwardMouseOver.Image.png" /> + <None Include="Resources\pictureBoxNoFS.Image.png" /> + <None Include="Resources\pictureBoxNoFSDown.Image.png" /> + <None Include="Resources\pictureBoxNoFSOver.Image.png" /> + <None Include="Resources\pictureBoxReverse.Image.png" /> + <None Include="Resources\pictureBoxReverseMouseDown.Image.png" /> + <None Include="Resources\pictureBoxReverseMouseOver.Image.png" /> + <None Include="Resources\Transparent Background.png" /> + <Content Include="Resources\TesseractDictionaries.xml"> + <SubType>Designer</SubType> + </Content> + <Content Include="Resources\HunspellBackupDictionaries.xml"> + <SubType>Designer</SubType> + </Content> + <Content Include="Resources\HunspellDictionaries.xml"> + <SubType>Designer</SubType> + </Content> + </ItemGroup> + <ItemGroup> + <BootstrapperPackage Include="Microsoft.Net.Client.3.5"> + <Visible>False</Visible> + <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName> + <Install>false</Install> + </BootstrapperPackage> + <BootstrapperPackage Include="Microsoft.Net.Framework.2.0"> + <Visible>False</Visible> + <ProductName>.NET Framework 2.0 %28x86%29</ProductName> + <Install>true</Install> + </BootstrapperPackage> + <BootstrapperPackage Include="Microsoft.Net.Framework.3.0"> + <Visible>False</Visible> + <ProductName>.NET Framework 3.0 %28x86%29</ProductName> + <Install>false</Install> + </BootstrapperPackage> + <BootstrapperPackage Include="Microsoft.Net.Framework.3.5"> + <Visible>False</Visible> + <ProductName>.NET Framework 3.5</ProductName> + <Install>false</Install> + </BootstrapperPackage> + <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1"> + <Visible>False</Visible> + <ProductName>.NET Framework 3.5 SP1</ProductName> + <Install>false</Install> + </BootstrapperPackage> + <BootstrapperPackage Include="Microsoft.Visual.C++.10.0.x86"> + <Visible>False</Visible> + <ProductName>Visual C++ 2010 Runtime Libraries %28x86%29</ProductName> + <Install>true</Install> + </BootstrapperPackage> + <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1"> + <Visible>False</Visible> + <ProductName>Windows Installer 3.1</ProductName> + <Install>true</Install> + </BootstrapperPackage> + </ItemGroup> + <ItemGroup> + <WebReferences Include="Web References\" /> + </ItemGroup> + <ItemGroup> + <WebReferenceUrl Include="http://localhost:2782/se/SeService.asmx"> + <UrlBehavior>Dynamic</UrlBehavior> + <RelPath>Web References\SeNetworkService\</RelPath> + <UpdateFromURL>http://localhost:2782/se/SeService.asmx</UpdateFromURL> + <ServiceLocationURL> + </ServiceLocationURL> + <CachedDynamicPropName> + </CachedDynamicPropName> + <CachedAppSettingsObjectName>Settings</CachedAppSettingsObjectName> + <CachedSettingsPropName>SubtitleEdit_SeNetworkService_SeService</CachedSettingsPropName> + </WebReferenceUrl> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\libse\LibSE.csproj"> + <Project>{3e3cb28f-3a7b-430f-9eb3-0d6c1e53b753}</Project> + <Name>LibSE</Name> + <Private>True</Private> + </ProjectReference> + </ItemGroup> + <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> + <ItemGroup> + <HunspellAssemblies Include="Hunspellx64.dll"> + <Visible>false</Visible> + </HunspellAssemblies> + <HunspellAssemblies Include="Hunspellx86.dll"> + <Visible>false</Visible> + </HunspellAssemblies> + </ItemGroup> + <ItemGroup /> + <Target Name="BeforeCompile"> + <XmlPeek XmlInputPath="$(SolutionDir)packages.config" Query="//package[@id='NHunspell']/@version"> + <Output TaskParameter="Result" PropertyName="HunspellVersion" /> + </XmlPeek> + <PropertyGroup> + <HunspellDir>$(SolutionDir)packages\NHunspell.$(HunspellVersion)\content\</HunspellDir> + </PropertyGroup> + <Copy SourceFiles="@(HunspellAssemblies -> '$(HunspellDir)%(Identity)')" DestinationFolder="$(OutputPath)" SkipUnchangedFiles="True" /> + <Exec Command="%22$(SolutionDir)\build_helpers.bat%22 rev %22$(ConfigurationName)%22" /> + </Target> + <Target Name="BeforeClean"> + <Delete Files="@(HunspellAssemblies -> '$(OutputPath)%(Identity)')" /> + </Target> + <!-- To modify your build process, add your task inside one of the targets below and uncomment it. + Other similar extension points exist, see Microsoft.Common.targets. + <Target Name="BeforeBuild"> + </Target> + <Target Name="AfterBuild"> + </Target> + --> </Project> \ No newline at end of file diff --git a/src/Web References/SeNetworkService/Reference.cs b/src/ui/Web References/SeNetworkService/Reference.cs similarity index 97% rename from src/Web References/SeNetworkService/Reference.cs rename to src/ui/Web References/SeNetworkService/Reference.cs index 91dfdbc2c..7189aa0ac 100644 --- a/src/Web References/SeNetworkService/Reference.cs +++ b/src/ui/Web References/SeNetworkService/Reference.cs @@ -1,965 +1,965 @@ -//------------------------------------------------------------------------------ -// <auto-generated> -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// </auto-generated> -//------------------------------------------------------------------------------ - -// -// This source code was auto-generated by Microsoft.VSDesigner, Version 4.0.30319.42000. -// -#pragma warning disable 1591 - -namespace Nikse.SubtitleEdit.SeNetworkService { - using System; - using System.Web.Services; - using System.Diagnostics; - using System.Web.Services.Protocols; - using System.Xml.Serialization; - using System.ComponentModel; - - - /// <remarks/> - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Web.Services.WebServiceBindingAttribute(Name="SeServiceSoap", Namespace="http://tempuri.org/")] - public partial class SeService : System.Web.Services.Protocols.SoapHttpClientProtocol { - - private System.Threading.SendOrPostCallback StartOperationCompleted; - - private System.Threading.SendOrPostCallback JoinOperationCompleted; - - private System.Threading.SendOrPostCallback LeaveOperationCompleted; - - private System.Threading.SendOrPostCallback DeleteLinesOperationCompleted; - - private System.Threading.SendOrPostCallback InsertLineOperationCompleted; - - private System.Threading.SendOrPostCallback UpdateLineOperationCompleted; - - private System.Threading.SendOrPostCallback SendMessageOperationCompleted; - - private System.Threading.SendOrPostCallback GetUpdatesOperationCompleted; - - private System.Threading.SendOrPostCallback GetSubtitleOperationCompleted; - - private System.Threading.SendOrPostCallback GetOriginalSubtitleOperationCompleted; - - private bool useDefaultCredentialsSetExplicitly; - - /// <remarks/> - public SeService() { - this.Url = global::Nikse.SubtitleEdit.Properties.Settings.Default.SubtitleEdit_SeNetworkService_SeService; - if ((this.IsLocalFileSystemWebService(this.Url) == true)) { - this.UseDefaultCredentials = true; - this.useDefaultCredentialsSetExplicitly = false; - } - else { - this.useDefaultCredentialsSetExplicitly = true; - } - } - - public new string Url { - get { - return base.Url; - } - set { - if ((((this.IsLocalFileSystemWebService(base.Url) == true) - && (this.useDefaultCredentialsSetExplicitly == false)) - && (this.IsLocalFileSystemWebService(value) == false))) { - base.UseDefaultCredentials = false; - } - base.Url = value; - } - } - - public new bool UseDefaultCredentials { - get { - return base.UseDefaultCredentials; - } - set { - base.UseDefaultCredentials = value; - this.useDefaultCredentialsSetExplicitly = true; - } - } - - /// <remarks/> - public event StartCompletedEventHandler StartCompleted; - - /// <remarks/> - public event JoinCompletedEventHandler JoinCompleted; - - /// <remarks/> - public event LeaveCompletedEventHandler LeaveCompleted; - - /// <remarks/> - public event DeleteLinesCompletedEventHandler DeleteLinesCompleted; - - /// <remarks/> - public event InsertLineCompletedEventHandler InsertLineCompleted; - - /// <remarks/> - public event UpdateLineCompletedEventHandler UpdateLineCompleted; - - /// <remarks/> - public event SendMessageCompletedEventHandler SendMessageCompleted; - - /// <remarks/> - public event GetUpdatesCompletedEventHandler GetUpdatesCompleted; - - /// <remarks/> - public event GetSubtitleCompletedEventHandler GetSubtitleCompleted; - - /// <remarks/> - public event GetOriginalSubtitleCompletedEventHandler GetOriginalSubtitleCompleted; - - /// <remarks/> - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Start", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public SeUser Start(string sessionKey, string userName, SeSequence[] subtitle, SeSequence[] originalSubtitle, string fileName, out string message) { - object[] results = this.Invoke("Start", new object[] { - sessionKey, - userName, - subtitle, - originalSubtitle, - fileName}); - message = ((string)(results[1])); - return ((SeUser)(results[0])); - } - - /// <remarks/> - public void StartAsync(string sessionKey, string userName, SeSequence[] subtitle, SeSequence[] originalSubtitle, string fileName) { - this.StartAsync(sessionKey, userName, subtitle, originalSubtitle, fileName, null); - } - - /// <remarks/> - public void StartAsync(string sessionKey, string userName, SeSequence[] subtitle, SeSequence[] originalSubtitle, string fileName, object userState) { - if ((this.StartOperationCompleted == null)) { - this.StartOperationCompleted = new System.Threading.SendOrPostCallback(this.OnStartOperationCompleted); - } - this.InvokeAsync("Start", new object[] { - sessionKey, - userName, - subtitle, - originalSubtitle, - fileName}, this.StartOperationCompleted, userState); - } - - private void OnStartOperationCompleted(object arg) { - if ((this.StartCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.StartCompleted(this, new StartCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// <remarks/> - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Join", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public SeUser[] Join(string sessionId, string userName, out string message) { - object[] results = this.Invoke("Join", new object[] { - sessionId, - userName}); - message = ((string)(results[1])); - return ((SeUser[])(results[0])); - } - - /// <remarks/> - public void JoinAsync(string sessionId, string userName) { - this.JoinAsync(sessionId, userName, null); - } - - /// <remarks/> - public void JoinAsync(string sessionId, string userName, object userState) { - if ((this.JoinOperationCompleted == null)) { - this.JoinOperationCompleted = new System.Threading.SendOrPostCallback(this.OnJoinOperationCompleted); - } - this.InvokeAsync("Join", new object[] { - sessionId, - userName}, this.JoinOperationCompleted, userState); - } - - private void OnJoinOperationCompleted(object arg) { - if ((this.JoinCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.JoinCompleted(this, new JoinCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// <remarks/> - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Leave", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public void Leave(string sessionId, string userName) { - this.Invoke("Leave", new object[] { - sessionId, - userName}); - } - - /// <remarks/> - public void LeaveAsync(string sessionId, string userName) { - this.LeaveAsync(sessionId, userName, null); - } - - /// <remarks/> - public void LeaveAsync(string sessionId, string userName, object userState) { - if ((this.LeaveOperationCompleted == null)) { - this.LeaveOperationCompleted = new System.Threading.SendOrPostCallback(this.OnLeaveOperationCompleted); - } - this.InvokeAsync("Leave", new object[] { - sessionId, - userName}, this.LeaveOperationCompleted, userState); - } - - private void OnLeaveOperationCompleted(object arg) { - if ((this.LeaveCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.LeaveCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// <remarks/> - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/DeleteLines", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public bool DeleteLines(string sessionId, int[] indices, SeUser user) { - object[] results = this.Invoke("DeleteLines", new object[] { - sessionId, - indices, - user}); - return ((bool)(results[0])); - } - - /// <remarks/> - public void DeleteLinesAsync(string sessionId, int[] indices, SeUser user) { - this.DeleteLinesAsync(sessionId, indices, user, null); - } - - /// <remarks/> - public void DeleteLinesAsync(string sessionId, int[] indices, SeUser user, object userState) { - if ((this.DeleteLinesOperationCompleted == null)) { - this.DeleteLinesOperationCompleted = new System.Threading.SendOrPostCallback(this.OnDeleteLinesOperationCompleted); - } - this.InvokeAsync("DeleteLines", new object[] { - sessionId, - indices, - user}, this.DeleteLinesOperationCompleted, userState); - } - - private void OnDeleteLinesOperationCompleted(object arg) { - if ((this.DeleteLinesCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.DeleteLinesCompleted(this, new DeleteLinesCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// <remarks/> - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/InsertLine", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public bool InsertLine(string sessionId, int index, int startMilliseconds, int endMilliseconds, string text, SeUser user) { - object[] results = this.Invoke("InsertLine", new object[] { - sessionId, - index, - startMilliseconds, - endMilliseconds, - text, - user}); - return ((bool)(results[0])); - } - - /// <remarks/> - public void InsertLineAsync(string sessionId, int index, int startMilliseconds, int endMilliseconds, string text, SeUser user) { - this.InsertLineAsync(sessionId, index, startMilliseconds, endMilliseconds, text, user, null); - } - - /// <remarks/> - public void InsertLineAsync(string sessionId, int index, int startMilliseconds, int endMilliseconds, string text, SeUser user, object userState) { - if ((this.InsertLineOperationCompleted == null)) { - this.InsertLineOperationCompleted = new System.Threading.SendOrPostCallback(this.OnInsertLineOperationCompleted); - } - this.InvokeAsync("InsertLine", new object[] { - sessionId, - index, - startMilliseconds, - endMilliseconds, - text, - user}, this.InsertLineOperationCompleted, userState); - } - - private void OnInsertLineOperationCompleted(object arg) { - if ((this.InsertLineCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.InsertLineCompleted(this, new InsertLineCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// <remarks/> - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/UpdateLine", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public bool UpdateLine(string sessionId, int index, SeSequence sequence, SeUser user) { - object[] results = this.Invoke("UpdateLine", new object[] { - sessionId, - index, - sequence, - user}); - return ((bool)(results[0])); - } - - /// <remarks/> - public void UpdateLineAsync(string sessionId, int index, SeSequence sequence, SeUser user) { - this.UpdateLineAsync(sessionId, index, sequence, user, null); - } - - /// <remarks/> - public void UpdateLineAsync(string sessionId, int index, SeSequence sequence, SeUser user, object userState) { - if ((this.UpdateLineOperationCompleted == null)) { - this.UpdateLineOperationCompleted = new System.Threading.SendOrPostCallback(this.OnUpdateLineOperationCompleted); - } - this.InvokeAsync("UpdateLine", new object[] { - sessionId, - index, - sequence, - user}, this.UpdateLineOperationCompleted, userState); - } - - private void OnUpdateLineOperationCompleted(object arg) { - if ((this.UpdateLineCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.UpdateLineCompleted(this, new UpdateLineCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// <remarks/> - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/SendMessage", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public bool SendMessage(string sessionId, string text, SeUser user) { - object[] results = this.Invoke("SendMessage", new object[] { - sessionId, - text, - user}); - return ((bool)(results[0])); - } - - /// <remarks/> - public void SendMessageAsync(string sessionId, string text, SeUser user) { - this.SendMessageAsync(sessionId, text, user, null); - } - - /// <remarks/> - public void SendMessageAsync(string sessionId, string text, SeUser user, object userState) { - if ((this.SendMessageOperationCompleted == null)) { - this.SendMessageOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSendMessageOperationCompleted); - } - this.InvokeAsync("SendMessage", new object[] { - sessionId, - text, - user}, this.SendMessageOperationCompleted, userState); - } - - private void OnSendMessageOperationCompleted(object arg) { - if ((this.SendMessageCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.SendMessageCompleted(this, new SendMessageCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// <remarks/> - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetUpdates", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public SeUpdate[] GetUpdates(string sessionId, string userName, System.DateTime lastUpdateTime, out string message, out System.DateTime newUpdateTime, out int numberOfLines) { - object[] results = this.Invoke("GetUpdates", new object[] { - sessionId, - userName, - lastUpdateTime}); - message = ((string)(results[1])); - newUpdateTime = ((System.DateTime)(results[2])); - numberOfLines = ((int)(results[3])); - return ((SeUpdate[])(results[0])); - } - - /// <remarks/> - public void GetUpdatesAsync(string sessionId, string userName, System.DateTime lastUpdateTime) { - this.GetUpdatesAsync(sessionId, userName, lastUpdateTime, null); - } - - /// <remarks/> - public void GetUpdatesAsync(string sessionId, string userName, System.DateTime lastUpdateTime, object userState) { - if ((this.GetUpdatesOperationCompleted == null)) { - this.GetUpdatesOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetUpdatesOperationCompleted); - } - this.InvokeAsync("GetUpdates", new object[] { - sessionId, - userName, - lastUpdateTime}, this.GetUpdatesOperationCompleted, userState); - } - - private void OnGetUpdatesOperationCompleted(object arg) { - if ((this.GetUpdatesCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.GetUpdatesCompleted(this, new GetUpdatesCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// <remarks/> - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetSubtitle", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public SeSequence[] GetSubtitle(string sessionId, out string fileName, out System.DateTime updateTime) { - object[] results = this.Invoke("GetSubtitle", new object[] { - sessionId}); - fileName = ((string)(results[1])); - updateTime = ((System.DateTime)(results[2])); - return ((SeSequence[])(results[0])); - } - - /// <remarks/> - public void GetSubtitleAsync(string sessionId) { - this.GetSubtitleAsync(sessionId, null); - } - - /// <remarks/> - public void GetSubtitleAsync(string sessionId, object userState) { - if ((this.GetSubtitleOperationCompleted == null)) { - this.GetSubtitleOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetSubtitleOperationCompleted); - } - this.InvokeAsync("GetSubtitle", new object[] { - sessionId}, this.GetSubtitleOperationCompleted, userState); - } - - private void OnGetSubtitleOperationCompleted(object arg) { - if ((this.GetSubtitleCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.GetSubtitleCompleted(this, new GetSubtitleCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// <remarks/> - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetOriginalSubtitle", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public SeSequence[] GetOriginalSubtitle(string sessionId) { - object[] results = this.Invoke("GetOriginalSubtitle", new object[] { - sessionId}); - return ((SeSequence[])(results[0])); - } - - /// <remarks/> - public void GetOriginalSubtitleAsync(string sessionId) { - this.GetOriginalSubtitleAsync(sessionId, null); - } - - /// <remarks/> - public void GetOriginalSubtitleAsync(string sessionId, object userState) { - if ((this.GetOriginalSubtitleOperationCompleted == null)) { - this.GetOriginalSubtitleOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetOriginalSubtitleOperationCompleted); - } - this.InvokeAsync("GetOriginalSubtitle", new object[] { - sessionId}, this.GetOriginalSubtitleOperationCompleted, userState); - } - - private void OnGetOriginalSubtitleOperationCompleted(object arg) { - if ((this.GetOriginalSubtitleCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.GetOriginalSubtitleCompleted(this, new GetOriginalSubtitleCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// <remarks/> - public new void CancelAsync(object userState) { - base.CancelAsync(userState); - } - - private bool IsLocalFileSystemWebService(string url) { - if (((url == null) - || (url == string.Empty))) { - return false; - } - System.Uri wsUri = new System.Uri(url); - if (((wsUri.Port >= 1024) - && (string.Compare(wsUri.Host, "localHost", System.StringComparison.OrdinalIgnoreCase) == 0))) { - return true; - } - return false; - } - } - - /// <remarks/> - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.8.4084.0")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/")] - public partial class SeSequence { - - private int indexField; - - private int startMillisecondsField; - - private int endMillisecondsField; - - private string textField; - - /// <remarks/> - public int Index { - get { - return this.indexField; - } - set { - this.indexField = value; - } - } - - /// <remarks/> - public int StartMilliseconds { - get { - return this.startMillisecondsField; - } - set { - this.startMillisecondsField = value; - } - } - - /// <remarks/> - public int EndMilliseconds { - get { - return this.endMillisecondsField; - } - set { - this.endMillisecondsField = value; - } - } - - /// <remarks/> - public string Text { - get { - return this.textField; - } - set { - this.textField = value; - } - } - } - - /// <remarks/> - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.8.4084.0")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/")] - public partial class SeUpdate { - - private System.DateTime timeField; - - private SeUser userField; - - private int indexField; - - private int startMillisecondsField; - - private int endMillisecondsField; - - private string textField; - - private string actionField; - - /// <remarks/> - public System.DateTime Time { - get { - return this.timeField; - } - set { - this.timeField = value; - } - } - - /// <remarks/> - public SeUser User { - get { - return this.userField; - } - set { - this.userField = value; - } - } - - /// <remarks/> - public int Index { - get { - return this.indexField; - } - set { - this.indexField = value; - } - } - - /// <remarks/> - public int StartMilliseconds { - get { - return this.startMillisecondsField; - } - set { - this.startMillisecondsField = value; - } - } - - /// <remarks/> - public int EndMilliseconds { - get { - return this.endMillisecondsField; - } - set { - this.endMillisecondsField = value; - } - } - - /// <remarks/> - public string Text { - get { - return this.textField; - } - set { - this.textField = value; - } - } - - /// <remarks/> - public string Action { - get { - return this.actionField; - } - set { - this.actionField = value; - } - } - } - - /// <remarks/> - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.8.4084.0")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/")] - public partial class SeUser { - - private string userNameField; - - private string ipField; - - private System.DateTime lastActivityField; - - /// <remarks/> - public string UserName { - get { - return this.userNameField; - } - set { - this.userNameField = value; - } - } - - /// <remarks/> - public string Ip { - get { - return this.ipField; - } - set { - this.ipField = value; - } - } - - /// <remarks/> - public System.DateTime LastActivity { - get { - return this.lastActivityField; - } - set { - this.lastActivityField = value; - } - } - } - - /// <remarks/> - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] - public delegate void StartCompletedEventHandler(object sender, StartCompletedEventArgs e); - - /// <remarks/> - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class StartCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal StartCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// <remarks/> - public SeUser Result { - get { - this.RaiseExceptionIfNecessary(); - return ((SeUser)(this.results[0])); - } - } - - /// <remarks/> - public string message { - get { - this.RaiseExceptionIfNecessary(); - return ((string)(this.results[1])); - } - } - } - - /// <remarks/> - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] - public delegate void JoinCompletedEventHandler(object sender, JoinCompletedEventArgs e); - - /// <remarks/> - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class JoinCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal JoinCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// <remarks/> - public SeUser[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((SeUser[])(this.results[0])); - } - } - - /// <remarks/> - public string message { - get { - this.RaiseExceptionIfNecessary(); - return ((string)(this.results[1])); - } - } - } - - /// <remarks/> - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] - public delegate void LeaveCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); - - /// <remarks/> - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] - public delegate void DeleteLinesCompletedEventHandler(object sender, DeleteLinesCompletedEventArgs e); - - /// <remarks/> - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class DeleteLinesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal DeleteLinesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// <remarks/> - public bool Result { - get { - this.RaiseExceptionIfNecessary(); - return ((bool)(this.results[0])); - } - } - } - - /// <remarks/> - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] - public delegate void InsertLineCompletedEventHandler(object sender, InsertLineCompletedEventArgs e); - - /// <remarks/> - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class InsertLineCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal InsertLineCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// <remarks/> - public bool Result { - get { - this.RaiseExceptionIfNecessary(); - return ((bool)(this.results[0])); - } - } - } - - /// <remarks/> - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] - public delegate void UpdateLineCompletedEventHandler(object sender, UpdateLineCompletedEventArgs e); - - /// <remarks/> - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class UpdateLineCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal UpdateLineCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// <remarks/> - public bool Result { - get { - this.RaiseExceptionIfNecessary(); - return ((bool)(this.results[0])); - } - } - } - - /// <remarks/> - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] - public delegate void SendMessageCompletedEventHandler(object sender, SendMessageCompletedEventArgs e); - - /// <remarks/> - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class SendMessageCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal SendMessageCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// <remarks/> - public bool Result { - get { - this.RaiseExceptionIfNecessary(); - return ((bool)(this.results[0])); - } - } - } - - /// <remarks/> - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] - public delegate void GetUpdatesCompletedEventHandler(object sender, GetUpdatesCompletedEventArgs e); - - /// <remarks/> - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetUpdatesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetUpdatesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// <remarks/> - public SeUpdate[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((SeUpdate[])(this.results[0])); - } - } - - /// <remarks/> - public string message { - get { - this.RaiseExceptionIfNecessary(); - return ((string)(this.results[1])); - } - } - - /// <remarks/> - public System.DateTime newUpdateTime { - get { - this.RaiseExceptionIfNecessary(); - return ((System.DateTime)(this.results[2])); - } - } - - /// <remarks/> - public int numberOfLines { - get { - this.RaiseExceptionIfNecessary(); - return ((int)(this.results[3])); - } - } - } - - /// <remarks/> - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] - public delegate void GetSubtitleCompletedEventHandler(object sender, GetSubtitleCompletedEventArgs e); - - /// <remarks/> - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetSubtitleCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetSubtitleCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// <remarks/> - public SeSequence[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((SeSequence[])(this.results[0])); - } - } - - /// <remarks/> - public string fileName { - get { - this.RaiseExceptionIfNecessary(); - return ((string)(this.results[1])); - } - } - - /// <remarks/> - public System.DateTime updateTime { - get { - this.RaiseExceptionIfNecessary(); - return ((System.DateTime)(this.results[2])); - } - } - } - - /// <remarks/> - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] - public delegate void GetOriginalSubtitleCompletedEventHandler(object sender, GetOriginalSubtitleCompletedEventArgs e); - - /// <remarks/> - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetOriginalSubtitleCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetOriginalSubtitleCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// <remarks/> - public SeSequence[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((SeSequence[])(this.results[0])); - } - } - } -} - +//------------------------------------------------------------------------------ +// <auto-generated> +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// </auto-generated> +//------------------------------------------------------------------------------ + +// +// This source code was auto-generated by Microsoft.VSDesigner, Version 4.0.30319.42000. +// +#pragma warning disable 1591 + +namespace Nikse.SubtitleEdit.SeNetworkService { + using System; + using System.Web.Services; + using System.Diagnostics; + using System.Web.Services.Protocols; + using System.Xml.Serialization; + using System.ComponentModel; + + + /// <remarks/> + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Web.Services.WebServiceBindingAttribute(Name="SeServiceSoap", Namespace="http://tempuri.org/")] + public partial class SeService : System.Web.Services.Protocols.SoapHttpClientProtocol { + + private System.Threading.SendOrPostCallback StartOperationCompleted; + + private System.Threading.SendOrPostCallback JoinOperationCompleted; + + private System.Threading.SendOrPostCallback LeaveOperationCompleted; + + private System.Threading.SendOrPostCallback DeleteLinesOperationCompleted; + + private System.Threading.SendOrPostCallback InsertLineOperationCompleted; + + private System.Threading.SendOrPostCallback UpdateLineOperationCompleted; + + private System.Threading.SendOrPostCallback SendMessageOperationCompleted; + + private System.Threading.SendOrPostCallback GetUpdatesOperationCompleted; + + private System.Threading.SendOrPostCallback GetSubtitleOperationCompleted; + + private System.Threading.SendOrPostCallback GetOriginalSubtitleOperationCompleted; + + private bool useDefaultCredentialsSetExplicitly; + + /// <remarks/> + public SeService() { + this.Url = global::Nikse.SubtitleEdit.Properties.Settings.Default.SubtitleEdit_SeNetworkService_SeService; + if ((this.IsLocalFileSystemWebService(this.Url) == true)) { + this.UseDefaultCredentials = true; + this.useDefaultCredentialsSetExplicitly = false; + } + else { + this.useDefaultCredentialsSetExplicitly = true; + } + } + + public new string Url { + get { + return base.Url; + } + set { + if ((((this.IsLocalFileSystemWebService(base.Url) == true) + && (this.useDefaultCredentialsSetExplicitly == false)) + && (this.IsLocalFileSystemWebService(value) == false))) { + base.UseDefaultCredentials = false; + } + base.Url = value; + } + } + + public new bool UseDefaultCredentials { + get { + return base.UseDefaultCredentials; + } + set { + base.UseDefaultCredentials = value; + this.useDefaultCredentialsSetExplicitly = true; + } + } + + /// <remarks/> + public event StartCompletedEventHandler StartCompleted; + + /// <remarks/> + public event JoinCompletedEventHandler JoinCompleted; + + /// <remarks/> + public event LeaveCompletedEventHandler LeaveCompleted; + + /// <remarks/> + public event DeleteLinesCompletedEventHandler DeleteLinesCompleted; + + /// <remarks/> + public event InsertLineCompletedEventHandler InsertLineCompleted; + + /// <remarks/> + public event UpdateLineCompletedEventHandler UpdateLineCompleted; + + /// <remarks/> + public event SendMessageCompletedEventHandler SendMessageCompleted; + + /// <remarks/> + public event GetUpdatesCompletedEventHandler GetUpdatesCompleted; + + /// <remarks/> + public event GetSubtitleCompletedEventHandler GetSubtitleCompleted; + + /// <remarks/> + public event GetOriginalSubtitleCompletedEventHandler GetOriginalSubtitleCompleted; + + /// <remarks/> + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Start", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public SeUser Start(string sessionKey, string userName, SeSequence[] subtitle, SeSequence[] originalSubtitle, string fileName, out string message) { + object[] results = this.Invoke("Start", new object[] { + sessionKey, + userName, + subtitle, + originalSubtitle, + fileName}); + message = ((string)(results[1])); + return ((SeUser)(results[0])); + } + + /// <remarks/> + public void StartAsync(string sessionKey, string userName, SeSequence[] subtitle, SeSequence[] originalSubtitle, string fileName) { + this.StartAsync(sessionKey, userName, subtitle, originalSubtitle, fileName, null); + } + + /// <remarks/> + public void StartAsync(string sessionKey, string userName, SeSequence[] subtitle, SeSequence[] originalSubtitle, string fileName, object userState) { + if ((this.StartOperationCompleted == null)) { + this.StartOperationCompleted = new System.Threading.SendOrPostCallback(this.OnStartOperationCompleted); + } + this.InvokeAsync("Start", new object[] { + sessionKey, + userName, + subtitle, + originalSubtitle, + fileName}, this.StartOperationCompleted, userState); + } + + private void OnStartOperationCompleted(object arg) { + if ((this.StartCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.StartCompleted(this, new StartCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// <remarks/> + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Join", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public SeUser[] Join(string sessionId, string userName, out string message) { + object[] results = this.Invoke("Join", new object[] { + sessionId, + userName}); + message = ((string)(results[1])); + return ((SeUser[])(results[0])); + } + + /// <remarks/> + public void JoinAsync(string sessionId, string userName) { + this.JoinAsync(sessionId, userName, null); + } + + /// <remarks/> + public void JoinAsync(string sessionId, string userName, object userState) { + if ((this.JoinOperationCompleted == null)) { + this.JoinOperationCompleted = new System.Threading.SendOrPostCallback(this.OnJoinOperationCompleted); + } + this.InvokeAsync("Join", new object[] { + sessionId, + userName}, this.JoinOperationCompleted, userState); + } + + private void OnJoinOperationCompleted(object arg) { + if ((this.JoinCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.JoinCompleted(this, new JoinCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// <remarks/> + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Leave", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public void Leave(string sessionId, string userName) { + this.Invoke("Leave", new object[] { + sessionId, + userName}); + } + + /// <remarks/> + public void LeaveAsync(string sessionId, string userName) { + this.LeaveAsync(sessionId, userName, null); + } + + /// <remarks/> + public void LeaveAsync(string sessionId, string userName, object userState) { + if ((this.LeaveOperationCompleted == null)) { + this.LeaveOperationCompleted = new System.Threading.SendOrPostCallback(this.OnLeaveOperationCompleted); + } + this.InvokeAsync("Leave", new object[] { + sessionId, + userName}, this.LeaveOperationCompleted, userState); + } + + private void OnLeaveOperationCompleted(object arg) { + if ((this.LeaveCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.LeaveCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// <remarks/> + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/DeleteLines", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public bool DeleteLines(string sessionId, int[] indices, SeUser user) { + object[] results = this.Invoke("DeleteLines", new object[] { + sessionId, + indices, + user}); + return ((bool)(results[0])); + } + + /// <remarks/> + public void DeleteLinesAsync(string sessionId, int[] indices, SeUser user) { + this.DeleteLinesAsync(sessionId, indices, user, null); + } + + /// <remarks/> + public void DeleteLinesAsync(string sessionId, int[] indices, SeUser user, object userState) { + if ((this.DeleteLinesOperationCompleted == null)) { + this.DeleteLinesOperationCompleted = new System.Threading.SendOrPostCallback(this.OnDeleteLinesOperationCompleted); + } + this.InvokeAsync("DeleteLines", new object[] { + sessionId, + indices, + user}, this.DeleteLinesOperationCompleted, userState); + } + + private void OnDeleteLinesOperationCompleted(object arg) { + if ((this.DeleteLinesCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.DeleteLinesCompleted(this, new DeleteLinesCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// <remarks/> + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/InsertLine", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public bool InsertLine(string sessionId, int index, int startMilliseconds, int endMilliseconds, string text, SeUser user) { + object[] results = this.Invoke("InsertLine", new object[] { + sessionId, + index, + startMilliseconds, + endMilliseconds, + text, + user}); + return ((bool)(results[0])); + } + + /// <remarks/> + public void InsertLineAsync(string sessionId, int index, int startMilliseconds, int endMilliseconds, string text, SeUser user) { + this.InsertLineAsync(sessionId, index, startMilliseconds, endMilliseconds, text, user, null); + } + + /// <remarks/> + public void InsertLineAsync(string sessionId, int index, int startMilliseconds, int endMilliseconds, string text, SeUser user, object userState) { + if ((this.InsertLineOperationCompleted == null)) { + this.InsertLineOperationCompleted = new System.Threading.SendOrPostCallback(this.OnInsertLineOperationCompleted); + } + this.InvokeAsync("InsertLine", new object[] { + sessionId, + index, + startMilliseconds, + endMilliseconds, + text, + user}, this.InsertLineOperationCompleted, userState); + } + + private void OnInsertLineOperationCompleted(object arg) { + if ((this.InsertLineCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.InsertLineCompleted(this, new InsertLineCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// <remarks/> + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/UpdateLine", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public bool UpdateLine(string sessionId, int index, SeSequence sequence, SeUser user) { + object[] results = this.Invoke("UpdateLine", new object[] { + sessionId, + index, + sequence, + user}); + return ((bool)(results[0])); + } + + /// <remarks/> + public void UpdateLineAsync(string sessionId, int index, SeSequence sequence, SeUser user) { + this.UpdateLineAsync(sessionId, index, sequence, user, null); + } + + /// <remarks/> + public void UpdateLineAsync(string sessionId, int index, SeSequence sequence, SeUser user, object userState) { + if ((this.UpdateLineOperationCompleted == null)) { + this.UpdateLineOperationCompleted = new System.Threading.SendOrPostCallback(this.OnUpdateLineOperationCompleted); + } + this.InvokeAsync("UpdateLine", new object[] { + sessionId, + index, + sequence, + user}, this.UpdateLineOperationCompleted, userState); + } + + private void OnUpdateLineOperationCompleted(object arg) { + if ((this.UpdateLineCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.UpdateLineCompleted(this, new UpdateLineCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// <remarks/> + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/SendMessage", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public bool SendMessage(string sessionId, string text, SeUser user) { + object[] results = this.Invoke("SendMessage", new object[] { + sessionId, + text, + user}); + return ((bool)(results[0])); + } + + /// <remarks/> + public void SendMessageAsync(string sessionId, string text, SeUser user) { + this.SendMessageAsync(sessionId, text, user, null); + } + + /// <remarks/> + public void SendMessageAsync(string sessionId, string text, SeUser user, object userState) { + if ((this.SendMessageOperationCompleted == null)) { + this.SendMessageOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSendMessageOperationCompleted); + } + this.InvokeAsync("SendMessage", new object[] { + sessionId, + text, + user}, this.SendMessageOperationCompleted, userState); + } + + private void OnSendMessageOperationCompleted(object arg) { + if ((this.SendMessageCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.SendMessageCompleted(this, new SendMessageCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// <remarks/> + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetUpdates", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public SeUpdate[] GetUpdates(string sessionId, string userName, System.DateTime lastUpdateTime, out string message, out System.DateTime newUpdateTime, out int numberOfLines) { + object[] results = this.Invoke("GetUpdates", new object[] { + sessionId, + userName, + lastUpdateTime}); + message = ((string)(results[1])); + newUpdateTime = ((System.DateTime)(results[2])); + numberOfLines = ((int)(results[3])); + return ((SeUpdate[])(results[0])); + } + + /// <remarks/> + public void GetUpdatesAsync(string sessionId, string userName, System.DateTime lastUpdateTime) { + this.GetUpdatesAsync(sessionId, userName, lastUpdateTime, null); + } + + /// <remarks/> + public void GetUpdatesAsync(string sessionId, string userName, System.DateTime lastUpdateTime, object userState) { + if ((this.GetUpdatesOperationCompleted == null)) { + this.GetUpdatesOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetUpdatesOperationCompleted); + } + this.InvokeAsync("GetUpdates", new object[] { + sessionId, + userName, + lastUpdateTime}, this.GetUpdatesOperationCompleted, userState); + } + + private void OnGetUpdatesOperationCompleted(object arg) { + if ((this.GetUpdatesCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetUpdatesCompleted(this, new GetUpdatesCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// <remarks/> + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetSubtitle", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public SeSequence[] GetSubtitle(string sessionId, out string fileName, out System.DateTime updateTime) { + object[] results = this.Invoke("GetSubtitle", new object[] { + sessionId}); + fileName = ((string)(results[1])); + updateTime = ((System.DateTime)(results[2])); + return ((SeSequence[])(results[0])); + } + + /// <remarks/> + public void GetSubtitleAsync(string sessionId) { + this.GetSubtitleAsync(sessionId, null); + } + + /// <remarks/> + public void GetSubtitleAsync(string sessionId, object userState) { + if ((this.GetSubtitleOperationCompleted == null)) { + this.GetSubtitleOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetSubtitleOperationCompleted); + } + this.InvokeAsync("GetSubtitle", new object[] { + sessionId}, this.GetSubtitleOperationCompleted, userState); + } + + private void OnGetSubtitleOperationCompleted(object arg) { + if ((this.GetSubtitleCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetSubtitleCompleted(this, new GetSubtitleCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// <remarks/> + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetOriginalSubtitle", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public SeSequence[] GetOriginalSubtitle(string sessionId) { + object[] results = this.Invoke("GetOriginalSubtitle", new object[] { + sessionId}); + return ((SeSequence[])(results[0])); + } + + /// <remarks/> + public void GetOriginalSubtitleAsync(string sessionId) { + this.GetOriginalSubtitleAsync(sessionId, null); + } + + /// <remarks/> + public void GetOriginalSubtitleAsync(string sessionId, object userState) { + if ((this.GetOriginalSubtitleOperationCompleted == null)) { + this.GetOriginalSubtitleOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetOriginalSubtitleOperationCompleted); + } + this.InvokeAsync("GetOriginalSubtitle", new object[] { + sessionId}, this.GetOriginalSubtitleOperationCompleted, userState); + } + + private void OnGetOriginalSubtitleOperationCompleted(object arg) { + if ((this.GetOriginalSubtitleCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetOriginalSubtitleCompleted(this, new GetOriginalSubtitleCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// <remarks/> + public new void CancelAsync(object userState) { + base.CancelAsync(userState); + } + + private bool IsLocalFileSystemWebService(string url) { + if (((url == null) + || (url == string.Empty))) { + return false; + } + System.Uri wsUri = new System.Uri(url); + if (((wsUri.Port >= 1024) + && (string.Compare(wsUri.Host, "localHost", System.StringComparison.OrdinalIgnoreCase) == 0))) { + return true; + } + return false; + } + } + + /// <remarks/> + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.8.4084.0")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/")] + public partial class SeSequence { + + private int indexField; + + private int startMillisecondsField; + + private int endMillisecondsField; + + private string textField; + + /// <remarks/> + public int Index { + get { + return this.indexField; + } + set { + this.indexField = value; + } + } + + /// <remarks/> + public int StartMilliseconds { + get { + return this.startMillisecondsField; + } + set { + this.startMillisecondsField = value; + } + } + + /// <remarks/> + public int EndMilliseconds { + get { + return this.endMillisecondsField; + } + set { + this.endMillisecondsField = value; + } + } + + /// <remarks/> + public string Text { + get { + return this.textField; + } + set { + this.textField = value; + } + } + } + + /// <remarks/> + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.8.4084.0")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/")] + public partial class SeUpdate { + + private System.DateTime timeField; + + private SeUser userField; + + private int indexField; + + private int startMillisecondsField; + + private int endMillisecondsField; + + private string textField; + + private string actionField; + + /// <remarks/> + public System.DateTime Time { + get { + return this.timeField; + } + set { + this.timeField = value; + } + } + + /// <remarks/> + public SeUser User { + get { + return this.userField; + } + set { + this.userField = value; + } + } + + /// <remarks/> + public int Index { + get { + return this.indexField; + } + set { + this.indexField = value; + } + } + + /// <remarks/> + public int StartMilliseconds { + get { + return this.startMillisecondsField; + } + set { + this.startMillisecondsField = value; + } + } + + /// <remarks/> + public int EndMilliseconds { + get { + return this.endMillisecondsField; + } + set { + this.endMillisecondsField = value; + } + } + + /// <remarks/> + public string Text { + get { + return this.textField; + } + set { + this.textField = value; + } + } + + /// <remarks/> + public string Action { + get { + return this.actionField; + } + set { + this.actionField = value; + } + } + } + + /// <remarks/> + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.8.4084.0")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/")] + public partial class SeUser { + + private string userNameField; + + private string ipField; + + private System.DateTime lastActivityField; + + /// <remarks/> + public string UserName { + get { + return this.userNameField; + } + set { + this.userNameField = value; + } + } + + /// <remarks/> + public string Ip { + get { + return this.ipField; + } + set { + this.ipField = value; + } + } + + /// <remarks/> + public System.DateTime LastActivity { + get { + return this.lastActivityField; + } + set { + this.lastActivityField = value; + } + } + } + + /// <remarks/> + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] + public delegate void StartCompletedEventHandler(object sender, StartCompletedEventArgs e); + + /// <remarks/> + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class StartCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal StartCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// <remarks/> + public SeUser Result { + get { + this.RaiseExceptionIfNecessary(); + return ((SeUser)(this.results[0])); + } + } + + /// <remarks/> + public string message { + get { + this.RaiseExceptionIfNecessary(); + return ((string)(this.results[1])); + } + } + } + + /// <remarks/> + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] + public delegate void JoinCompletedEventHandler(object sender, JoinCompletedEventArgs e); + + /// <remarks/> + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class JoinCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal JoinCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// <remarks/> + public SeUser[] Result { + get { + this.RaiseExceptionIfNecessary(); + return ((SeUser[])(this.results[0])); + } + } + + /// <remarks/> + public string message { + get { + this.RaiseExceptionIfNecessary(); + return ((string)(this.results[1])); + } + } + } + + /// <remarks/> + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] + public delegate void LeaveCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); + + /// <remarks/> + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] + public delegate void DeleteLinesCompletedEventHandler(object sender, DeleteLinesCompletedEventArgs e); + + /// <remarks/> + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class DeleteLinesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal DeleteLinesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// <remarks/> + public bool Result { + get { + this.RaiseExceptionIfNecessary(); + return ((bool)(this.results[0])); + } + } + } + + /// <remarks/> + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] + public delegate void InsertLineCompletedEventHandler(object sender, InsertLineCompletedEventArgs e); + + /// <remarks/> + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class InsertLineCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal InsertLineCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// <remarks/> + public bool Result { + get { + this.RaiseExceptionIfNecessary(); + return ((bool)(this.results[0])); + } + } + } + + /// <remarks/> + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] + public delegate void UpdateLineCompletedEventHandler(object sender, UpdateLineCompletedEventArgs e); + + /// <remarks/> + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class UpdateLineCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal UpdateLineCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// <remarks/> + public bool Result { + get { + this.RaiseExceptionIfNecessary(); + return ((bool)(this.results[0])); + } + } + } + + /// <remarks/> + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] + public delegate void SendMessageCompletedEventHandler(object sender, SendMessageCompletedEventArgs e); + + /// <remarks/> + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class SendMessageCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal SendMessageCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// <remarks/> + public bool Result { + get { + this.RaiseExceptionIfNecessary(); + return ((bool)(this.results[0])); + } + } + } + + /// <remarks/> + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] + public delegate void GetUpdatesCompletedEventHandler(object sender, GetUpdatesCompletedEventArgs e); + + /// <remarks/> + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetUpdatesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetUpdatesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// <remarks/> + public SeUpdate[] Result { + get { + this.RaiseExceptionIfNecessary(); + return ((SeUpdate[])(this.results[0])); + } + } + + /// <remarks/> + public string message { + get { + this.RaiseExceptionIfNecessary(); + return ((string)(this.results[1])); + } + } + + /// <remarks/> + public System.DateTime newUpdateTime { + get { + this.RaiseExceptionIfNecessary(); + return ((System.DateTime)(this.results[2])); + } + } + + /// <remarks/> + public int numberOfLines { + get { + this.RaiseExceptionIfNecessary(); + return ((int)(this.results[3])); + } + } + } + + /// <remarks/> + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] + public delegate void GetSubtitleCompletedEventHandler(object sender, GetSubtitleCompletedEventArgs e); + + /// <remarks/> + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetSubtitleCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetSubtitleCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// <remarks/> + public SeSequence[] Result { + get { + this.RaiseExceptionIfNecessary(); + return ((SeSequence[])(this.results[0])); + } + } + + /// <remarks/> + public string fileName { + get { + this.RaiseExceptionIfNecessary(); + return ((string)(this.results[1])); + } + } + + /// <remarks/> + public System.DateTime updateTime { + get { + this.RaiseExceptionIfNecessary(); + return ((System.DateTime)(this.results[2])); + } + } + } + + /// <remarks/> + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] + public delegate void GetOriginalSubtitleCompletedEventHandler(object sender, GetOriginalSubtitleCompletedEventArgs e); + + /// <remarks/> + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.4084.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetOriginalSubtitleCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetOriginalSubtitleCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// <remarks/> + public SeSequence[] Result { + get { + this.RaiseExceptionIfNecessary(); + return ((SeSequence[])(this.results[0])); + } + } + } +} + #pragma warning restore 1591 \ No newline at end of file diff --git a/src/Web References/SeNetworkService/Reference.map b/src/ui/Web References/SeNetworkService/Reference.map similarity index 98% rename from src/Web References/SeNetworkService/Reference.map rename to src/ui/Web References/SeNetworkService/Reference.map index 1e0d2be34..ef75c55b2 100644 --- a/src/Web References/SeNetworkService/Reference.map +++ b/src/ui/Web References/SeNetworkService/Reference.map @@ -1,7 +1,7 @@ -<?xml version="1.0" encoding="utf-8"?> -<DiscoveryClientResultsFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> - <Results> - <DiscoveryClientResult referenceType="System.Web.Services.Discovery.ContractReference" url="http://localhost:2782/se/SeService.asmx?wsdl" filename="SeService.wsdl" /> - <DiscoveryClientResult referenceType="System.Web.Services.Discovery.DiscoveryDocumentReference" url="http://localhost:2782/se/SeService.asmx?disco" filename="SeService.disco" /> - </Results> +<?xml version="1.0" encoding="utf-8"?> +<DiscoveryClientResultsFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + <Results> + <DiscoveryClientResult referenceType="System.Web.Services.Discovery.ContractReference" url="http://localhost:2782/se/SeService.asmx?wsdl" filename="SeService.wsdl" /> + <DiscoveryClientResult referenceType="System.Web.Services.Discovery.DiscoveryDocumentReference" url="http://localhost:2782/se/SeService.asmx?disco" filename="SeService.disco" /> + </Results> </DiscoveryClientResultsFile> \ No newline at end of file diff --git a/src/Web References/SeNetworkService/SeSequence.datasource b/src/ui/Web References/SeNetworkService/SeSequence.datasource similarity index 98% rename from src/Web References/SeNetworkService/SeSequence.datasource rename to src/ui/Web References/SeNetworkService/SeSequence.datasource index 9b7dbc5c1..bc52dff83 100644 --- a/src/Web References/SeNetworkService/SeSequence.datasource +++ b/src/ui/Web References/SeNetworkService/SeSequence.datasource @@ -1,10 +1,10 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - This file is automatically generated by Visual Studio .Net. It is - used to store generic object data source configuration information. - Renaming the file extension or editing the content of this file may - cause the file to be unrecognizable by the program. ---> -<GenericObjectDataSource DisplayName="SeSequence" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource"> - <TypeInfo>Nikse.SubtitleEdit.SeNetworkService.SeSequence, Web References.SeNetworkService.Reference.cs.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo> +<?xml version="1.0" encoding="utf-8"?> +<!-- + This file is automatically generated by Visual Studio .Net. It is + used to store generic object data source configuration information. + Renaming the file extension or editing the content of this file may + cause the file to be unrecognizable by the program. +--> +<GenericObjectDataSource DisplayName="SeSequence" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource"> + <TypeInfo>Nikse.SubtitleEdit.SeNetworkService.SeSequence, Web References.SeNetworkService.Reference.cs.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo> </GenericObjectDataSource> \ No newline at end of file diff --git a/src/Web References/SeNetworkService/SeService.disco b/src/ui/Web References/SeNetworkService/SeService.disco similarity index 99% rename from src/Web References/SeNetworkService/SeService.disco rename to src/ui/Web References/SeNetworkService/SeService.disco index 52c06b987..22d263bf1 100644 --- a/src/Web References/SeNetworkService/SeService.disco +++ b/src/ui/Web References/SeNetworkService/SeService.disco @@ -1,6 +1,6 @@ -<?xml version="1.0" encoding="utf-8"?> -<discovery xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/disco/"> - <contractRef ref="http://localhost:2782/se/SeService.asmx?wsdl" docRef="http://localhost:2782/se/SeService.asmx" xmlns="http://schemas.xmlsoap.org/disco/scl/" /> - <soap address="http://localhost:2782/se/SeService.asmx" xmlns:q1="http://tempuri.org/" binding="q1:SeServiceSoap" xmlns="http://schemas.xmlsoap.org/disco/soap/" /> - <soap address="http://localhost:2782/se/SeService.asmx" xmlns:q2="http://tempuri.org/" binding="q2:SeServiceSoap12" xmlns="http://schemas.xmlsoap.org/disco/soap/" /> +<?xml version="1.0" encoding="utf-8"?> +<discovery xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/disco/"> + <contractRef ref="http://localhost:2782/se/SeService.asmx?wsdl" docRef="http://localhost:2782/se/SeService.asmx" xmlns="http://schemas.xmlsoap.org/disco/scl/" /> + <soap address="http://localhost:2782/se/SeService.asmx" xmlns:q1="http://tempuri.org/" binding="q1:SeServiceSoap" xmlns="http://schemas.xmlsoap.org/disco/soap/" /> + <soap address="http://localhost:2782/se/SeService.asmx" xmlns:q2="http://tempuri.org/" binding="q2:SeServiceSoap12" xmlns="http://schemas.xmlsoap.org/disco/soap/" /> </discovery> \ No newline at end of file diff --git a/src/Web References/SeNetworkService/SeService.wsdl b/src/ui/Web References/SeNetworkService/SeService.wsdl similarity index 97% rename from src/Web References/SeNetworkService/SeService.wsdl rename to src/ui/Web References/SeNetworkService/SeService.wsdl index 0894d9714..67e94424b 100644 --- a/src/Web References/SeNetworkService/SeService.wsdl +++ b/src/ui/Web References/SeNetworkService/SeService.wsdl @@ -1,512 +1,512 @@ -<?xml version="1.0" encoding="utf-8"?> -<wsdl:definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://tempuri.org/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="http://tempuri.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> - <wsdl:types> - <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/"> - <s:element name="Start"> - <s:complexType> - <s:sequence> - <s:element minOccurs="0" maxOccurs="1" name="sessionKey" type="s:string" /> - <s:element minOccurs="0" maxOccurs="1" name="userName" type="s:string" /> - <s:element minOccurs="0" maxOccurs="1" name="subtitle" type="tns:ArrayOfSeSequence" /> - <s:element minOccurs="0" maxOccurs="1" name="originalSubtitle" type="tns:ArrayOfSeSequence" /> - <s:element minOccurs="0" maxOccurs="1" name="fileName" type="s:string" /> - </s:sequence> - </s:complexType> - </s:element> - <s:complexType name="ArrayOfSeSequence"> - <s:sequence> - <s:element minOccurs="0" maxOccurs="unbounded" name="SeSequence" nillable="true" type="tns:SeSequence" /> - </s:sequence> - </s:complexType> - <s:complexType name="SeSequence"> - <s:sequence> - <s:element minOccurs="1" maxOccurs="1" name="Index" type="s:int" /> - <s:element minOccurs="1" maxOccurs="1" name="StartMilliseconds" type="s:int" /> - <s:element minOccurs="1" maxOccurs="1" name="EndMilliseconds" type="s:int" /> - <s:element minOccurs="0" maxOccurs="1" name="Text" type="s:string" /> - </s:sequence> - </s:complexType> - <s:element name="StartResponse"> - <s:complexType> - <s:sequence> - <s:element minOccurs="0" maxOccurs="1" name="StartResult" type="tns:SeUser" /> - <s:element minOccurs="0" maxOccurs="1" name="message" type="s:string" /> - </s:sequence> - </s:complexType> - </s:element> - <s:complexType name="SeUser"> - <s:sequence> - <s:element minOccurs="0" maxOccurs="1" name="UserName" type="s:string" /> - <s:element minOccurs="0" maxOccurs="1" name="Ip" type="s:string" /> - <s:element minOccurs="1" maxOccurs="1" name="LastActivity" type="s:dateTime" /> - </s:sequence> - </s:complexType> - <s:element name="Join"> - <s:complexType> - <s:sequence> - <s:element minOccurs="0" maxOccurs="1" name="sessionId" type="s:string" /> - <s:element minOccurs="0" maxOccurs="1" name="userName" type="s:string" /> - </s:sequence> - </s:complexType> - </s:element> - <s:element name="JoinResponse"> - <s:complexType> - <s:sequence> - <s:element minOccurs="0" maxOccurs="1" name="JoinResult" type="tns:ArrayOfSeUser" /> - <s:element minOccurs="0" maxOccurs="1" name="message" type="s:string" /> - </s:sequence> - </s:complexType> - </s:element> - <s:complexType name="ArrayOfSeUser"> - <s:sequence> - <s:element minOccurs="0" maxOccurs="unbounded" name="SeUser" nillable="true" type="tns:SeUser" /> - </s:sequence> - </s:complexType> - <s:element name="Leave"> - <s:complexType> - <s:sequence> - <s:element minOccurs="0" maxOccurs="1" name="sessionId" type="s:string" /> - <s:element minOccurs="0" maxOccurs="1" name="userName" type="s:string" /> - </s:sequence> - </s:complexType> - </s:element> - <s:element name="LeaveResponse"> - <s:complexType /> - </s:element> - <s:element name="DeleteLines"> - <s:complexType> - <s:sequence> - <s:element minOccurs="0" maxOccurs="1" name="sessionId" type="s:string" /> - <s:element minOccurs="0" maxOccurs="1" name="indices" type="tns:ArrayOfInt" /> - <s:element minOccurs="0" maxOccurs="1" name="user" type="tns:SeUser" /> - </s:sequence> - </s:complexType> - </s:element> - <s:complexType name="ArrayOfInt"> - <s:sequence> - <s:element minOccurs="0" maxOccurs="unbounded" name="int" type="s:int" /> - </s:sequence> - </s:complexType> - <s:element name="DeleteLinesResponse"> - <s:complexType> - <s:sequence> - <s:element minOccurs="1" maxOccurs="1" name="DeleteLinesResult" type="s:boolean" /> - </s:sequence> - </s:complexType> - </s:element> - <s:element name="InsertLine"> - <s:complexType> - <s:sequence> - <s:element minOccurs="0" maxOccurs="1" name="sessionId" type="s:string" /> - <s:element minOccurs="1" maxOccurs="1" name="index" type="s:int" /> - <s:element minOccurs="1" maxOccurs="1" name="startMilliseconds" type="s:int" /> - <s:element minOccurs="1" maxOccurs="1" name="endMilliseconds" type="s:int" /> - <s:element minOccurs="0" maxOccurs="1" name="text" type="s:string" /> - <s:element minOccurs="0" maxOccurs="1" name="user" type="tns:SeUser" /> - </s:sequence> - </s:complexType> - </s:element> - <s:element name="InsertLineResponse"> - <s:complexType> - <s:sequence> - <s:element minOccurs="1" maxOccurs="1" name="InsertLineResult" type="s:boolean" /> - </s:sequence> - </s:complexType> - </s:element> - <s:element name="UpdateLine"> - <s:complexType> - <s:sequence> - <s:element minOccurs="0" maxOccurs="1" name="sessionId" type="s:string" /> - <s:element minOccurs="1" maxOccurs="1" name="index" type="s:int" /> - <s:element minOccurs="0" maxOccurs="1" name="sequence" type="tns:SeSequence" /> - <s:element minOccurs="0" maxOccurs="1" name="user" type="tns:SeUser" /> - </s:sequence> - </s:complexType> - </s:element> - <s:element name="UpdateLineResponse"> - <s:complexType> - <s:sequence> - <s:element minOccurs="1" maxOccurs="1" name="UpdateLineResult" type="s:boolean" /> - </s:sequence> - </s:complexType> - </s:element> - <s:element name="SendMessage"> - <s:complexType> - <s:sequence> - <s:element minOccurs="0" maxOccurs="1" name="sessionId" type="s:string" /> - <s:element minOccurs="0" maxOccurs="1" name="text" type="s:string" /> - <s:element minOccurs="0" maxOccurs="1" name="user" type="tns:SeUser" /> - </s:sequence> - </s:complexType> - </s:element> - <s:element name="SendMessageResponse"> - <s:complexType> - <s:sequence> - <s:element minOccurs="1" maxOccurs="1" name="SendMessageResult" type="s:boolean" /> - </s:sequence> - </s:complexType> - </s:element> - <s:element name="GetUpdates"> - <s:complexType> - <s:sequence> - <s:element minOccurs="0" maxOccurs="1" name="sessionId" type="s:string" /> - <s:element minOccurs="0" maxOccurs="1" name="userName" type="s:string" /> - <s:element minOccurs="1" maxOccurs="1" name="lastUpdateTime" type="s:dateTime" /> - </s:sequence> - </s:complexType> - </s:element> - <s:element name="GetUpdatesResponse"> - <s:complexType> - <s:sequence> - <s:element minOccurs="0" maxOccurs="1" name="GetUpdatesResult" type="tns:ArrayOfSeUpdate" /> - <s:element minOccurs="0" maxOccurs="1" name="message" type="s:string" /> - <s:element minOccurs="1" maxOccurs="1" name="newUpdateTime" type="s:dateTime" /> - <s:element minOccurs="1" maxOccurs="1" name="numberOfLines" type="s:int" /> - </s:sequence> - </s:complexType> - </s:element> - <s:complexType name="ArrayOfSeUpdate"> - <s:sequence> - <s:element minOccurs="0" maxOccurs="unbounded" name="SeUpdate" nillable="true" type="tns:SeUpdate" /> - </s:sequence> - </s:complexType> - <s:complexType name="SeUpdate"> - <s:sequence> - <s:element minOccurs="1" maxOccurs="1" name="Time" type="s:dateTime" /> - <s:element minOccurs="0" maxOccurs="1" name="User" type="tns:SeUser" /> - <s:element minOccurs="1" maxOccurs="1" name="Index" type="s:int" /> - <s:element minOccurs="1" maxOccurs="1" name="StartMilliseconds" type="s:int" /> - <s:element minOccurs="1" maxOccurs="1" name="EndMilliseconds" type="s:int" /> - <s:element minOccurs="0" maxOccurs="1" name="Text" type="s:string" /> - <s:element minOccurs="0" maxOccurs="1" name="Action" type="s:string" /> - </s:sequence> - </s:complexType> - <s:element name="GetSubtitle"> - <s:complexType> - <s:sequence> - <s:element minOccurs="0" maxOccurs="1" name="sessionId" type="s:string" /> - </s:sequence> - </s:complexType> - </s:element> - <s:element name="GetSubtitleResponse"> - <s:complexType> - <s:sequence> - <s:element minOccurs="0" maxOccurs="1" name="GetSubtitleResult" type="tns:ArrayOfSeSequence" /> - <s:element minOccurs="0" maxOccurs="1" name="fileName" type="s:string" /> - <s:element minOccurs="1" maxOccurs="1" name="updateTime" type="s:dateTime" /> - </s:sequence> - </s:complexType> - </s:element> - <s:element name="GetOriginalSubtitle"> - <s:complexType> - <s:sequence> - <s:element minOccurs="0" maxOccurs="1" name="sessionId" type="s:string" /> - </s:sequence> - </s:complexType> - </s:element> - <s:element name="GetOriginalSubtitleResponse"> - <s:complexType> - <s:sequence> - <s:element minOccurs="0" maxOccurs="1" name="GetOriginalSubtitleResult" type="tns:ArrayOfSeSequence" /> - </s:sequence> - </s:complexType> - </s:element> - </s:schema> - </wsdl:types> - <wsdl:message name="StartSoapIn"> - <wsdl:part name="parameters" element="tns:Start" /> - </wsdl:message> - <wsdl:message name="StartSoapOut"> - <wsdl:part name="parameters" element="tns:StartResponse" /> - </wsdl:message> - <wsdl:message name="JoinSoapIn"> - <wsdl:part name="parameters" element="tns:Join" /> - </wsdl:message> - <wsdl:message name="JoinSoapOut"> - <wsdl:part name="parameters" element="tns:JoinResponse" /> - </wsdl:message> - <wsdl:message name="LeaveSoapIn"> - <wsdl:part name="parameters" element="tns:Leave" /> - </wsdl:message> - <wsdl:message name="LeaveSoapOut"> - <wsdl:part name="parameters" element="tns:LeaveResponse" /> - </wsdl:message> - <wsdl:message name="DeleteLinesSoapIn"> - <wsdl:part name="parameters" element="tns:DeleteLines" /> - </wsdl:message> - <wsdl:message name="DeleteLinesSoapOut"> - <wsdl:part name="parameters" element="tns:DeleteLinesResponse" /> - </wsdl:message> - <wsdl:message name="InsertLineSoapIn"> - <wsdl:part name="parameters" element="tns:InsertLine" /> - </wsdl:message> - <wsdl:message name="InsertLineSoapOut"> - <wsdl:part name="parameters" element="tns:InsertLineResponse" /> - </wsdl:message> - <wsdl:message name="UpdateLineSoapIn"> - <wsdl:part name="parameters" element="tns:UpdateLine" /> - </wsdl:message> - <wsdl:message name="UpdateLineSoapOut"> - <wsdl:part name="parameters" element="tns:UpdateLineResponse" /> - </wsdl:message> - <wsdl:message name="SendMessageSoapIn"> - <wsdl:part name="parameters" element="tns:SendMessage" /> - </wsdl:message> - <wsdl:message name="SendMessageSoapOut"> - <wsdl:part name="parameters" element="tns:SendMessageResponse" /> - </wsdl:message> - <wsdl:message name="GetUpdatesSoapIn"> - <wsdl:part name="parameters" element="tns:GetUpdates" /> - </wsdl:message> - <wsdl:message name="GetUpdatesSoapOut"> - <wsdl:part name="parameters" element="tns:GetUpdatesResponse" /> - </wsdl:message> - <wsdl:message name="GetSubtitleSoapIn"> - <wsdl:part name="parameters" element="tns:GetSubtitle" /> - </wsdl:message> - <wsdl:message name="GetSubtitleSoapOut"> - <wsdl:part name="parameters" element="tns:GetSubtitleResponse" /> - </wsdl:message> - <wsdl:message name="GetOriginalSubtitleSoapIn"> - <wsdl:part name="parameters" element="tns:GetOriginalSubtitle" /> - </wsdl:message> - <wsdl:message name="GetOriginalSubtitleSoapOut"> - <wsdl:part name="parameters" element="tns:GetOriginalSubtitleResponse" /> - </wsdl:message> - <wsdl:portType name="SeServiceSoap"> - <wsdl:operation name="Start"> - <wsdl:input message="tns:StartSoapIn" /> - <wsdl:output message="tns:StartSoapOut" /> - </wsdl:operation> - <wsdl:operation name="Join"> - <wsdl:input message="tns:JoinSoapIn" /> - <wsdl:output message="tns:JoinSoapOut" /> - </wsdl:operation> - <wsdl:operation name="Leave"> - <wsdl:input message="tns:LeaveSoapIn" /> - <wsdl:output message="tns:LeaveSoapOut" /> - </wsdl:operation> - <wsdl:operation name="DeleteLines"> - <wsdl:input message="tns:DeleteLinesSoapIn" /> - <wsdl:output message="tns:DeleteLinesSoapOut" /> - </wsdl:operation> - <wsdl:operation name="InsertLine"> - <wsdl:input message="tns:InsertLineSoapIn" /> - <wsdl:output message="tns:InsertLineSoapOut" /> - </wsdl:operation> - <wsdl:operation name="UpdateLine"> - <wsdl:input message="tns:UpdateLineSoapIn" /> - <wsdl:output message="tns:UpdateLineSoapOut" /> - </wsdl:operation> - <wsdl:operation name="SendMessage"> - <wsdl:input message="tns:SendMessageSoapIn" /> - <wsdl:output message="tns:SendMessageSoapOut" /> - </wsdl:operation> - <wsdl:operation name="GetUpdates"> - <wsdl:input message="tns:GetUpdatesSoapIn" /> - <wsdl:output message="tns:GetUpdatesSoapOut" /> - </wsdl:operation> - <wsdl:operation name="GetSubtitle"> - <wsdl:input message="tns:GetSubtitleSoapIn" /> - <wsdl:output message="tns:GetSubtitleSoapOut" /> - </wsdl:operation> - <wsdl:operation name="GetOriginalSubtitle"> - <wsdl:input message="tns:GetOriginalSubtitleSoapIn" /> - <wsdl:output message="tns:GetOriginalSubtitleSoapOut" /> - </wsdl:operation> - </wsdl:portType> - <wsdl:binding name="SeServiceSoap" type="tns:SeServiceSoap"> - <soap:binding transport="http://schemas.xmlsoap.org/soap/http" /> - <wsdl:operation name="Start"> - <soap:operation soapAction="http://tempuri.org/Start" style="document" /> - <wsdl:input> - <soap:body use="literal" /> - </wsdl:input> - <wsdl:output> - <soap:body use="literal" /> - </wsdl:output> - </wsdl:operation> - <wsdl:operation name="Join"> - <soap:operation soapAction="http://tempuri.org/Join" style="document" /> - <wsdl:input> - <soap:body use="literal" /> - </wsdl:input> - <wsdl:output> - <soap:body use="literal" /> - </wsdl:output> - </wsdl:operation> - <wsdl:operation name="Leave"> - <soap:operation soapAction="http://tempuri.org/Leave" style="document" /> - <wsdl:input> - <soap:body use="literal" /> - </wsdl:input> - <wsdl:output> - <soap:body use="literal" /> - </wsdl:output> - </wsdl:operation> - <wsdl:operation name="DeleteLines"> - <soap:operation soapAction="http://tempuri.org/DeleteLines" style="document" /> - <wsdl:input> - <soap:body use="literal" /> - </wsdl:input> - <wsdl:output> - <soap:body use="literal" /> - </wsdl:output> - </wsdl:operation> - <wsdl:operation name="InsertLine"> - <soap:operation soapAction="http://tempuri.org/InsertLine" style="document" /> - <wsdl:input> - <soap:body use="literal" /> - </wsdl:input> - <wsdl:output> - <soap:body use="literal" /> - </wsdl:output> - </wsdl:operation> - <wsdl:operation name="UpdateLine"> - <soap:operation soapAction="http://tempuri.org/UpdateLine" style="document" /> - <wsdl:input> - <soap:body use="literal" /> - </wsdl:input> - <wsdl:output> - <soap:body use="literal" /> - </wsdl:output> - </wsdl:operation> - <wsdl:operation name="SendMessage"> - <soap:operation soapAction="http://tempuri.org/SendMessage" style="document" /> - <wsdl:input> - <soap:body use="literal" /> - </wsdl:input> - <wsdl:output> - <soap:body use="literal" /> - </wsdl:output> - </wsdl:operation> - <wsdl:operation name="GetUpdates"> - <soap:operation soapAction="http://tempuri.org/GetUpdates" style="document" /> - <wsdl:input> - <soap:body use="literal" /> - </wsdl:input> - <wsdl:output> - <soap:body use="literal" /> - </wsdl:output> - </wsdl:operation> - <wsdl:operation name="GetSubtitle"> - <soap:operation soapAction="http://tempuri.org/GetSubtitle" style="document" /> - <wsdl:input> - <soap:body use="literal" /> - </wsdl:input> - <wsdl:output> - <soap:body use="literal" /> - </wsdl:output> - </wsdl:operation> - <wsdl:operation name="GetOriginalSubtitle"> - <soap:operation soapAction="http://tempuri.org/GetOriginalSubtitle" style="document" /> - <wsdl:input> - <soap:body use="literal" /> - </wsdl:input> - <wsdl:output> - <soap:body use="literal" /> - </wsdl:output> - </wsdl:operation> - </wsdl:binding> - <wsdl:binding name="SeServiceSoap12" type="tns:SeServiceSoap"> - <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" /> - <wsdl:operation name="Start"> - <soap12:operation soapAction="http://tempuri.org/Start" style="document" /> - <wsdl:input> - <soap12:body use="literal" /> - </wsdl:input> - <wsdl:output> - <soap12:body use="literal" /> - </wsdl:output> - </wsdl:operation> - <wsdl:operation name="Join"> - <soap12:operation soapAction="http://tempuri.org/Join" style="document" /> - <wsdl:input> - <soap12:body use="literal" /> - </wsdl:input> - <wsdl:output> - <soap12:body use="literal" /> - </wsdl:output> - </wsdl:operation> - <wsdl:operation name="Leave"> - <soap12:operation soapAction="http://tempuri.org/Leave" style="document" /> - <wsdl:input> - <soap12:body use="literal" /> - </wsdl:input> - <wsdl:output> - <soap12:body use="literal" /> - </wsdl:output> - </wsdl:operation> - <wsdl:operation name="DeleteLines"> - <soap12:operation soapAction="http://tempuri.org/DeleteLines" style="document" /> - <wsdl:input> - <soap12:body use="literal" /> - </wsdl:input> - <wsdl:output> - <soap12:body use="literal" /> - </wsdl:output> - </wsdl:operation> - <wsdl:operation name="InsertLine"> - <soap12:operation soapAction="http://tempuri.org/InsertLine" style="document" /> - <wsdl:input> - <soap12:body use="literal" /> - </wsdl:input> - <wsdl:output> - <soap12:body use="literal" /> - </wsdl:output> - </wsdl:operation> - <wsdl:operation name="UpdateLine"> - <soap12:operation soapAction="http://tempuri.org/UpdateLine" style="document" /> - <wsdl:input> - <soap12:body use="literal" /> - </wsdl:input> - <wsdl:output> - <soap12:body use="literal" /> - </wsdl:output> - </wsdl:operation> - <wsdl:operation name="SendMessage"> - <soap12:operation soapAction="http://tempuri.org/SendMessage" style="document" /> - <wsdl:input> - <soap12:body use="literal" /> - </wsdl:input> - <wsdl:output> - <soap12:body use="literal" /> - </wsdl:output> - </wsdl:operation> - <wsdl:operation name="GetUpdates"> - <soap12:operation soapAction="http://tempuri.org/GetUpdates" style="document" /> - <wsdl:input> - <soap12:body use="literal" /> - </wsdl:input> - <wsdl:output> - <soap12:body use="literal" /> - </wsdl:output> - </wsdl:operation> - <wsdl:operation name="GetSubtitle"> - <soap12:operation soapAction="http://tempuri.org/GetSubtitle" style="document" /> - <wsdl:input> - <soap12:body use="literal" /> - </wsdl:input> - <wsdl:output> - <soap12:body use="literal" /> - </wsdl:output> - </wsdl:operation> - <wsdl:operation name="GetOriginalSubtitle"> - <soap12:operation soapAction="http://tempuri.org/GetOriginalSubtitle" style="document" /> - <wsdl:input> - <soap12:body use="literal" /> - </wsdl:input> - <wsdl:output> - <soap12:body use="literal" /> - </wsdl:output> - </wsdl:operation> - </wsdl:binding> - <wsdl:service name="SeService"> - <wsdl:port name="SeServiceSoap" binding="tns:SeServiceSoap"> - <soap:address location="http://localhost:2782/se/SeService.asmx" /> - </wsdl:port> - <wsdl:port name="SeServiceSoap12" binding="tns:SeServiceSoap12"> - <soap12:address location="http://localhost:2782/se/SeService.asmx" /> - </wsdl:port> - </wsdl:service> -</wsdl:definitions> +<?xml version="1.0" encoding="utf-8"?> +<wsdl:definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://tempuri.org/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="http://tempuri.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> + <wsdl:types> + <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/"> + <s:element name="Start"> + <s:complexType> + <s:sequence> + <s:element minOccurs="0" maxOccurs="1" name="sessionKey" type="s:string" /> + <s:element minOccurs="0" maxOccurs="1" name="userName" type="s:string" /> + <s:element minOccurs="0" maxOccurs="1" name="subtitle" type="tns:ArrayOfSeSequence" /> + <s:element minOccurs="0" maxOccurs="1" name="originalSubtitle" type="tns:ArrayOfSeSequence" /> + <s:element minOccurs="0" maxOccurs="1" name="fileName" type="s:string" /> + </s:sequence> + </s:complexType> + </s:element> + <s:complexType name="ArrayOfSeSequence"> + <s:sequence> + <s:element minOccurs="0" maxOccurs="unbounded" name="SeSequence" nillable="true" type="tns:SeSequence" /> + </s:sequence> + </s:complexType> + <s:complexType name="SeSequence"> + <s:sequence> + <s:element minOccurs="1" maxOccurs="1" name="Index" type="s:int" /> + <s:element minOccurs="1" maxOccurs="1" name="StartMilliseconds" type="s:int" /> + <s:element minOccurs="1" maxOccurs="1" name="EndMilliseconds" type="s:int" /> + <s:element minOccurs="0" maxOccurs="1" name="Text" type="s:string" /> + </s:sequence> + </s:complexType> + <s:element name="StartResponse"> + <s:complexType> + <s:sequence> + <s:element minOccurs="0" maxOccurs="1" name="StartResult" type="tns:SeUser" /> + <s:element minOccurs="0" maxOccurs="1" name="message" type="s:string" /> + </s:sequence> + </s:complexType> + </s:element> + <s:complexType name="SeUser"> + <s:sequence> + <s:element minOccurs="0" maxOccurs="1" name="UserName" type="s:string" /> + <s:element minOccurs="0" maxOccurs="1" name="Ip" type="s:string" /> + <s:element minOccurs="1" maxOccurs="1" name="LastActivity" type="s:dateTime" /> + </s:sequence> + </s:complexType> + <s:element name="Join"> + <s:complexType> + <s:sequence> + <s:element minOccurs="0" maxOccurs="1" name="sessionId" type="s:string" /> + <s:element minOccurs="0" maxOccurs="1" name="userName" type="s:string" /> + </s:sequence> + </s:complexType> + </s:element> + <s:element name="JoinResponse"> + <s:complexType> + <s:sequence> + <s:element minOccurs="0" maxOccurs="1" name="JoinResult" type="tns:ArrayOfSeUser" /> + <s:element minOccurs="0" maxOccurs="1" name="message" type="s:string" /> + </s:sequence> + </s:complexType> + </s:element> + <s:complexType name="ArrayOfSeUser"> + <s:sequence> + <s:element minOccurs="0" maxOccurs="unbounded" name="SeUser" nillable="true" type="tns:SeUser" /> + </s:sequence> + </s:complexType> + <s:element name="Leave"> + <s:complexType> + <s:sequence> + <s:element minOccurs="0" maxOccurs="1" name="sessionId" type="s:string" /> + <s:element minOccurs="0" maxOccurs="1" name="userName" type="s:string" /> + </s:sequence> + </s:complexType> + </s:element> + <s:element name="LeaveResponse"> + <s:complexType /> + </s:element> + <s:element name="DeleteLines"> + <s:complexType> + <s:sequence> + <s:element minOccurs="0" maxOccurs="1" name="sessionId" type="s:string" /> + <s:element minOccurs="0" maxOccurs="1" name="indices" type="tns:ArrayOfInt" /> + <s:element minOccurs="0" maxOccurs="1" name="user" type="tns:SeUser" /> + </s:sequence> + </s:complexType> + </s:element> + <s:complexType name="ArrayOfInt"> + <s:sequence> + <s:element minOccurs="0" maxOccurs="unbounded" name="int" type="s:int" /> + </s:sequence> + </s:complexType> + <s:element name="DeleteLinesResponse"> + <s:complexType> + <s:sequence> + <s:element minOccurs="1" maxOccurs="1" name="DeleteLinesResult" type="s:boolean" /> + </s:sequence> + </s:complexType> + </s:element> + <s:element name="InsertLine"> + <s:complexType> + <s:sequence> + <s:element minOccurs="0" maxOccurs="1" name="sessionId" type="s:string" /> + <s:element minOccurs="1" maxOccurs="1" name="index" type="s:int" /> + <s:element minOccurs="1" maxOccurs="1" name="startMilliseconds" type="s:int" /> + <s:element minOccurs="1" maxOccurs="1" name="endMilliseconds" type="s:int" /> + <s:element minOccurs="0" maxOccurs="1" name="text" type="s:string" /> + <s:element minOccurs="0" maxOccurs="1" name="user" type="tns:SeUser" /> + </s:sequence> + </s:complexType> + </s:element> + <s:element name="InsertLineResponse"> + <s:complexType> + <s:sequence> + <s:element minOccurs="1" maxOccurs="1" name="InsertLineResult" type="s:boolean" /> + </s:sequence> + </s:complexType> + </s:element> + <s:element name="UpdateLine"> + <s:complexType> + <s:sequence> + <s:element minOccurs="0" maxOccurs="1" name="sessionId" type="s:string" /> + <s:element minOccurs="1" maxOccurs="1" name="index" type="s:int" /> + <s:element minOccurs="0" maxOccurs="1" name="sequence" type="tns:SeSequence" /> + <s:element minOccurs="0" maxOccurs="1" name="user" type="tns:SeUser" /> + </s:sequence> + </s:complexType> + </s:element> + <s:element name="UpdateLineResponse"> + <s:complexType> + <s:sequence> + <s:element minOccurs="1" maxOccurs="1" name="UpdateLineResult" type="s:boolean" /> + </s:sequence> + </s:complexType> + </s:element> + <s:element name="SendMessage"> + <s:complexType> + <s:sequence> + <s:element minOccurs="0" maxOccurs="1" name="sessionId" type="s:string" /> + <s:element minOccurs="0" maxOccurs="1" name="text" type="s:string" /> + <s:element minOccurs="0" maxOccurs="1" name="user" type="tns:SeUser" /> + </s:sequence> + </s:complexType> + </s:element> + <s:element name="SendMessageResponse"> + <s:complexType> + <s:sequence> + <s:element minOccurs="1" maxOccurs="1" name="SendMessageResult" type="s:boolean" /> + </s:sequence> + </s:complexType> + </s:element> + <s:element name="GetUpdates"> + <s:complexType> + <s:sequence> + <s:element minOccurs="0" maxOccurs="1" name="sessionId" type="s:string" /> + <s:element minOccurs="0" maxOccurs="1" name="userName" type="s:string" /> + <s:element minOccurs="1" maxOccurs="1" name="lastUpdateTime" type="s:dateTime" /> + </s:sequence> + </s:complexType> + </s:element> + <s:element name="GetUpdatesResponse"> + <s:complexType> + <s:sequence> + <s:element minOccurs="0" maxOccurs="1" name="GetUpdatesResult" type="tns:ArrayOfSeUpdate" /> + <s:element minOccurs="0" maxOccurs="1" name="message" type="s:string" /> + <s:element minOccurs="1" maxOccurs="1" name="newUpdateTime" type="s:dateTime" /> + <s:element minOccurs="1" maxOccurs="1" name="numberOfLines" type="s:int" /> + </s:sequence> + </s:complexType> + </s:element> + <s:complexType name="ArrayOfSeUpdate"> + <s:sequence> + <s:element minOccurs="0" maxOccurs="unbounded" name="SeUpdate" nillable="true" type="tns:SeUpdate" /> + </s:sequence> + </s:complexType> + <s:complexType name="SeUpdate"> + <s:sequence> + <s:element minOccurs="1" maxOccurs="1" name="Time" type="s:dateTime" /> + <s:element minOccurs="0" maxOccurs="1" name="User" type="tns:SeUser" /> + <s:element minOccurs="1" maxOccurs="1" name="Index" type="s:int" /> + <s:element minOccurs="1" maxOccurs="1" name="StartMilliseconds" type="s:int" /> + <s:element minOccurs="1" maxOccurs="1" name="EndMilliseconds" type="s:int" /> + <s:element minOccurs="0" maxOccurs="1" name="Text" type="s:string" /> + <s:element minOccurs="0" maxOccurs="1" name="Action" type="s:string" /> + </s:sequence> + </s:complexType> + <s:element name="GetSubtitle"> + <s:complexType> + <s:sequence> + <s:element minOccurs="0" maxOccurs="1" name="sessionId" type="s:string" /> + </s:sequence> + </s:complexType> + </s:element> + <s:element name="GetSubtitleResponse"> + <s:complexType> + <s:sequence> + <s:element minOccurs="0" maxOccurs="1" name="GetSubtitleResult" type="tns:ArrayOfSeSequence" /> + <s:element minOccurs="0" maxOccurs="1" name="fileName" type="s:string" /> + <s:element minOccurs="1" maxOccurs="1" name="updateTime" type="s:dateTime" /> + </s:sequence> + </s:complexType> + </s:element> + <s:element name="GetOriginalSubtitle"> + <s:complexType> + <s:sequence> + <s:element minOccurs="0" maxOccurs="1" name="sessionId" type="s:string" /> + </s:sequence> + </s:complexType> + </s:element> + <s:element name="GetOriginalSubtitleResponse"> + <s:complexType> + <s:sequence> + <s:element minOccurs="0" maxOccurs="1" name="GetOriginalSubtitleResult" type="tns:ArrayOfSeSequence" /> + </s:sequence> + </s:complexType> + </s:element> + </s:schema> + </wsdl:types> + <wsdl:message name="StartSoapIn"> + <wsdl:part name="parameters" element="tns:Start" /> + </wsdl:message> + <wsdl:message name="StartSoapOut"> + <wsdl:part name="parameters" element="tns:StartResponse" /> + </wsdl:message> + <wsdl:message name="JoinSoapIn"> + <wsdl:part name="parameters" element="tns:Join" /> + </wsdl:message> + <wsdl:message name="JoinSoapOut"> + <wsdl:part name="parameters" element="tns:JoinResponse" /> + </wsdl:message> + <wsdl:message name="LeaveSoapIn"> + <wsdl:part name="parameters" element="tns:Leave" /> + </wsdl:message> + <wsdl:message name="LeaveSoapOut"> + <wsdl:part name="parameters" element="tns:LeaveResponse" /> + </wsdl:message> + <wsdl:message name="DeleteLinesSoapIn"> + <wsdl:part name="parameters" element="tns:DeleteLines" /> + </wsdl:message> + <wsdl:message name="DeleteLinesSoapOut"> + <wsdl:part name="parameters" element="tns:DeleteLinesResponse" /> + </wsdl:message> + <wsdl:message name="InsertLineSoapIn"> + <wsdl:part name="parameters" element="tns:InsertLine" /> + </wsdl:message> + <wsdl:message name="InsertLineSoapOut"> + <wsdl:part name="parameters" element="tns:InsertLineResponse" /> + </wsdl:message> + <wsdl:message name="UpdateLineSoapIn"> + <wsdl:part name="parameters" element="tns:UpdateLine" /> + </wsdl:message> + <wsdl:message name="UpdateLineSoapOut"> + <wsdl:part name="parameters" element="tns:UpdateLineResponse" /> + </wsdl:message> + <wsdl:message name="SendMessageSoapIn"> + <wsdl:part name="parameters" element="tns:SendMessage" /> + </wsdl:message> + <wsdl:message name="SendMessageSoapOut"> + <wsdl:part name="parameters" element="tns:SendMessageResponse" /> + </wsdl:message> + <wsdl:message name="GetUpdatesSoapIn"> + <wsdl:part name="parameters" element="tns:GetUpdates" /> + </wsdl:message> + <wsdl:message name="GetUpdatesSoapOut"> + <wsdl:part name="parameters" element="tns:GetUpdatesResponse" /> + </wsdl:message> + <wsdl:message name="GetSubtitleSoapIn"> + <wsdl:part name="parameters" element="tns:GetSubtitle" /> + </wsdl:message> + <wsdl:message name="GetSubtitleSoapOut"> + <wsdl:part name="parameters" element="tns:GetSubtitleResponse" /> + </wsdl:message> + <wsdl:message name="GetOriginalSubtitleSoapIn"> + <wsdl:part name="parameters" element="tns:GetOriginalSubtitle" /> + </wsdl:message> + <wsdl:message name="GetOriginalSubtitleSoapOut"> + <wsdl:part name="parameters" element="tns:GetOriginalSubtitleResponse" /> + </wsdl:message> + <wsdl:portType name="SeServiceSoap"> + <wsdl:operation name="Start"> + <wsdl:input message="tns:StartSoapIn" /> + <wsdl:output message="tns:StartSoapOut" /> + </wsdl:operation> + <wsdl:operation name="Join"> + <wsdl:input message="tns:JoinSoapIn" /> + <wsdl:output message="tns:JoinSoapOut" /> + </wsdl:operation> + <wsdl:operation name="Leave"> + <wsdl:input message="tns:LeaveSoapIn" /> + <wsdl:output message="tns:LeaveSoapOut" /> + </wsdl:operation> + <wsdl:operation name="DeleteLines"> + <wsdl:input message="tns:DeleteLinesSoapIn" /> + <wsdl:output message="tns:DeleteLinesSoapOut" /> + </wsdl:operation> + <wsdl:operation name="InsertLine"> + <wsdl:input message="tns:InsertLineSoapIn" /> + <wsdl:output message="tns:InsertLineSoapOut" /> + </wsdl:operation> + <wsdl:operation name="UpdateLine"> + <wsdl:input message="tns:UpdateLineSoapIn" /> + <wsdl:output message="tns:UpdateLineSoapOut" /> + </wsdl:operation> + <wsdl:operation name="SendMessage"> + <wsdl:input message="tns:SendMessageSoapIn" /> + <wsdl:output message="tns:SendMessageSoapOut" /> + </wsdl:operation> + <wsdl:operation name="GetUpdates"> + <wsdl:input message="tns:GetUpdatesSoapIn" /> + <wsdl:output message="tns:GetUpdatesSoapOut" /> + </wsdl:operation> + <wsdl:operation name="GetSubtitle"> + <wsdl:input message="tns:GetSubtitleSoapIn" /> + <wsdl:output message="tns:GetSubtitleSoapOut" /> + </wsdl:operation> + <wsdl:operation name="GetOriginalSubtitle"> + <wsdl:input message="tns:GetOriginalSubtitleSoapIn" /> + <wsdl:output message="tns:GetOriginalSubtitleSoapOut" /> + </wsdl:operation> + </wsdl:portType> + <wsdl:binding name="SeServiceSoap" type="tns:SeServiceSoap"> + <soap:binding transport="http://schemas.xmlsoap.org/soap/http" /> + <wsdl:operation name="Start"> + <soap:operation soapAction="http://tempuri.org/Start" style="document" /> + <wsdl:input> + <soap:body use="literal" /> + </wsdl:input> + <wsdl:output> + <soap:body use="literal" /> + </wsdl:output> + </wsdl:operation> + <wsdl:operation name="Join"> + <soap:operation soapAction="http://tempuri.org/Join" style="document" /> + <wsdl:input> + <soap:body use="literal" /> + </wsdl:input> + <wsdl:output> + <soap:body use="literal" /> + </wsdl:output> + </wsdl:operation> + <wsdl:operation name="Leave"> + <soap:operation soapAction="http://tempuri.org/Leave" style="document" /> + <wsdl:input> + <soap:body use="literal" /> + </wsdl:input> + <wsdl:output> + <soap:body use="literal" /> + </wsdl:output> + </wsdl:operation> + <wsdl:operation name="DeleteLines"> + <soap:operation soapAction="http://tempuri.org/DeleteLines" style="document" /> + <wsdl:input> + <soap:body use="literal" /> + </wsdl:input> + <wsdl:output> + <soap:body use="literal" /> + </wsdl:output> + </wsdl:operation> + <wsdl:operation name="InsertLine"> + <soap:operation soapAction="http://tempuri.org/InsertLine" style="document" /> + <wsdl:input> + <soap:body use="literal" /> + </wsdl:input> + <wsdl:output> + <soap:body use="literal" /> + </wsdl:output> + </wsdl:operation> + <wsdl:operation name="UpdateLine"> + <soap:operation soapAction="http://tempuri.org/UpdateLine" style="document" /> + <wsdl:input> + <soap:body use="literal" /> + </wsdl:input> + <wsdl:output> + <soap:body use="literal" /> + </wsdl:output> + </wsdl:operation> + <wsdl:operation name="SendMessage"> + <soap:operation soapAction="http://tempuri.org/SendMessage" style="document" /> + <wsdl:input> + <soap:body use="literal" /> + </wsdl:input> + <wsdl:output> + <soap:body use="literal" /> + </wsdl:output> + </wsdl:operation> + <wsdl:operation name="GetUpdates"> + <soap:operation soapAction="http://tempuri.org/GetUpdates" style="document" /> + <wsdl:input> + <soap:body use="literal" /> + </wsdl:input> + <wsdl:output> + <soap:body use="literal" /> + </wsdl:output> + </wsdl:operation> + <wsdl:operation name="GetSubtitle"> + <soap:operation soapAction="http://tempuri.org/GetSubtitle" style="document" /> + <wsdl:input> + <soap:body use="literal" /> + </wsdl:input> + <wsdl:output> + <soap:body use="literal" /> + </wsdl:output> + </wsdl:operation> + <wsdl:operation name="GetOriginalSubtitle"> + <soap:operation soapAction="http://tempuri.org/GetOriginalSubtitle" style="document" /> + <wsdl:input> + <soap:body use="literal" /> + </wsdl:input> + <wsdl:output> + <soap:body use="literal" /> + </wsdl:output> + </wsdl:operation> + </wsdl:binding> + <wsdl:binding name="SeServiceSoap12" type="tns:SeServiceSoap"> + <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" /> + <wsdl:operation name="Start"> + <soap12:operation soapAction="http://tempuri.org/Start" style="document" /> + <wsdl:input> + <soap12:body use="literal" /> + </wsdl:input> + <wsdl:output> + <soap12:body use="literal" /> + </wsdl:output> + </wsdl:operation> + <wsdl:operation name="Join"> + <soap12:operation soapAction="http://tempuri.org/Join" style="document" /> + <wsdl:input> + <soap12:body use="literal" /> + </wsdl:input> + <wsdl:output> + <soap12:body use="literal" /> + </wsdl:output> + </wsdl:operation> + <wsdl:operation name="Leave"> + <soap12:operation soapAction="http://tempuri.org/Leave" style="document" /> + <wsdl:input> + <soap12:body use="literal" /> + </wsdl:input> + <wsdl:output> + <soap12:body use="literal" /> + </wsdl:output> + </wsdl:operation> + <wsdl:operation name="DeleteLines"> + <soap12:operation soapAction="http://tempuri.org/DeleteLines" style="document" /> + <wsdl:input> + <soap12:body use="literal" /> + </wsdl:input> + <wsdl:output> + <soap12:body use="literal" /> + </wsdl:output> + </wsdl:operation> + <wsdl:operation name="InsertLine"> + <soap12:operation soapAction="http://tempuri.org/InsertLine" style="document" /> + <wsdl:input> + <soap12:body use="literal" /> + </wsdl:input> + <wsdl:output> + <soap12:body use="literal" /> + </wsdl:output> + </wsdl:operation> + <wsdl:operation name="UpdateLine"> + <soap12:operation soapAction="http://tempuri.org/UpdateLine" style="document" /> + <wsdl:input> + <soap12:body use="literal" /> + </wsdl:input> + <wsdl:output> + <soap12:body use="literal" /> + </wsdl:output> + </wsdl:operation> + <wsdl:operation name="SendMessage"> + <soap12:operation soapAction="http://tempuri.org/SendMessage" style="document" /> + <wsdl:input> + <soap12:body use="literal" /> + </wsdl:input> + <wsdl:output> + <soap12:body use="literal" /> + </wsdl:output> + </wsdl:operation> + <wsdl:operation name="GetUpdates"> + <soap12:operation soapAction="http://tempuri.org/GetUpdates" style="document" /> + <wsdl:input> + <soap12:body use="literal" /> + </wsdl:input> + <wsdl:output> + <soap12:body use="literal" /> + </wsdl:output> + </wsdl:operation> + <wsdl:operation name="GetSubtitle"> + <soap12:operation soapAction="http://tempuri.org/GetSubtitle" style="document" /> + <wsdl:input> + <soap12:body use="literal" /> + </wsdl:input> + <wsdl:output> + <soap12:body use="literal" /> + </wsdl:output> + </wsdl:operation> + <wsdl:operation name="GetOriginalSubtitle"> + <soap12:operation soapAction="http://tempuri.org/GetOriginalSubtitle" style="document" /> + <wsdl:input> + <soap12:body use="literal" /> + </wsdl:input> + <wsdl:output> + <soap12:body use="literal" /> + </wsdl:output> + </wsdl:operation> + </wsdl:binding> + <wsdl:service name="SeService"> + <wsdl:port name="SeServiceSoap" binding="tns:SeServiceSoap"> + <soap:address location="http://localhost:2782/se/SeService.asmx" /> + </wsdl:port> + <wsdl:port name="SeServiceSoap12" binding="tns:SeServiceSoap12"> + <soap12:address location="http://localhost:2782/se/SeService.asmx" /> + </wsdl:port> + </wsdl:service> +</wsdl:definitions> diff --git a/src/Web References/SeNetworkService/SeUpdate.datasource b/src/ui/Web References/SeNetworkService/SeUpdate.datasource similarity index 98% rename from src/Web References/SeNetworkService/SeUpdate.datasource rename to src/ui/Web References/SeNetworkService/SeUpdate.datasource index b5d0b1e97..951b13dd5 100644 --- a/src/Web References/SeNetworkService/SeUpdate.datasource +++ b/src/ui/Web References/SeNetworkService/SeUpdate.datasource @@ -1,10 +1,10 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - This file is automatically generated by Visual Studio .Net. It is - used to store generic object data source configuration information. - Renaming the file extension or editing the content of this file may - cause the file to be unrecognizable by the program. ---> -<GenericObjectDataSource DisplayName="SeUpdate" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource"> - <TypeInfo>Nikse.SubtitleEdit.SeNetworkService.SeUpdate, Web References.SeNetworkService.Reference.cs.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo> +<?xml version="1.0" encoding="utf-8"?> +<!-- + This file is automatically generated by Visual Studio .Net. It is + used to store generic object data source configuration information. + Renaming the file extension or editing the content of this file may + cause the file to be unrecognizable by the program. +--> +<GenericObjectDataSource DisplayName="SeUpdate" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource"> + <TypeInfo>Nikse.SubtitleEdit.SeNetworkService.SeUpdate, Web References.SeNetworkService.Reference.cs.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo> </GenericObjectDataSource> \ No newline at end of file diff --git a/src/Web References/SeNetworkService/SeUser.datasource b/src/ui/Web References/SeNetworkService/SeUser.datasource similarity index 98% rename from src/Web References/SeNetworkService/SeUser.datasource rename to src/ui/Web References/SeNetworkService/SeUser.datasource index 98e1e2eff..f86454535 100644 --- a/src/Web References/SeNetworkService/SeUser.datasource +++ b/src/ui/Web References/SeNetworkService/SeUser.datasource @@ -1,10 +1,10 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - This file is automatically generated by Visual Studio .Net. It is - used to store generic object data source configuration information. - Renaming the file extension or editing the content of this file may - cause the file to be unrecognizable by the program. ---> -<GenericObjectDataSource DisplayName="SeUser" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource"> - <TypeInfo>Nikse.SubtitleEdit.SeNetworkService.SeUser, Web References.SeNetworkService.Reference.cs.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo> +<?xml version="1.0" encoding="utf-8"?> +<!-- + This file is automatically generated by Visual Studio .Net. It is + used to store generic object data source configuration information. + Renaming the file extension or editing the content of this file may + cause the file to be unrecognizable by the program. +--> +<GenericObjectDataSource DisplayName="SeUser" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource"> + <TypeInfo>Nikse.SubtitleEdit.SeNetworkService.SeUser, Web References.SeNetworkService.Reference.cs.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo> </GenericObjectDataSource> \ No newline at end of file diff --git a/src/app.config b/src/ui/app.config similarity index 98% rename from src/app.config rename to src/ui/app.config index f9d9148b9..c3f5c8a30 100644 --- a/src/app.config +++ b/src/ui/app.config @@ -1,18 +1,18 @@ -<?xml version="1.0" encoding="utf-8"?> -<configuration> - <configSections> - <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> - <section name="Nikse.SubtitleEdit.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/> - </sectionGroup> - </configSections> - <applicationSettings> - <Nikse.SubtitleEdit.Properties.Settings> - <setting name="SubtitleEdit_SeNetworkService_SeService" serializeAs="String"> - <value>http://localhost:2782/se/SeService.asmx</value> - </setting> - </Nikse.SubtitleEdit.Properties.Settings> - </applicationSettings> - <startup> - <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2"/> - </startup> -</configuration> +<?xml version="1.0" encoding="utf-8"?> +<configuration> + <configSections> + <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> + <section name="Nikse.SubtitleEdit.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/> + </sectionGroup> + </configSections> + <applicationSettings> + <Nikse.SubtitleEdit.Properties.Settings> + <setting name="SubtitleEdit_SeNetworkService_SeService" serializeAs="String"> + <value>http://localhost:2782/se/SeService.asmx</value> + </setting> + </Nikse.SubtitleEdit.Properties.Settings> + </applicationSettings> + <startup> + <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2"/> + </startup> +</configuration> diff --git a/src/ui/packages/ILRepack.2.0.18/.signature.p7s b/src/ui/packages/ILRepack.2.0.18/.signature.p7s new file mode 100644 index 0000000000000000000000000000000000000000..08c3672cadb5a73393e7a06122180f8ad99ce7c7 GIT binary patch literal 9471 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 R)7A<IYvWK@RMV8r{{W%TK3f0) literal 0 HcmV?d00001 diff --git a/src/ui/packages/ILRepack.2.0.18/ILRepack.2.0.18.nupkg b/src/ui/packages/ILRepack.2.0.18/ILRepack.2.0.18.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..dfaa07d6f7fc81230b2135f200a01bbc07ea4653 GIT binary patch literal 605768 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 z%0A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 IgEP<aFGydaLjV8( literal 0 HcmV?d00001 diff --git a/src/ui/packages/ILRepack.2.0.18/build/ILRepack.props b/src/ui/packages/ILRepack.2.0.18/build/ILRepack.props new file mode 100644 index 000000000..03ff50bf6 --- /dev/null +++ b/src/ui/packages/ILRepack.2.0.18/build/ILRepack.props @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <PropertyGroup> + <ILRepack>$(MSBuildThisFileDirectory)..\tools\ILRepack.exe</ILRepack> + </PropertyGroup> +</Project> \ No newline at end of file diff --git a/src/ui/packages/ILRepack.2.0.18/tools/ILRepack.exe b/src/ui/packages/ILRepack.2.0.18/tools/ILRepack.exe new file mode 100644 index 0000000000000000000000000000000000000000..155b8026f4c1b854a8d3c57eca126c404c567603 GIT binary patch literal 1519104 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%0A5(UE- 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%0A=Q5i(cswyYljBUE|oU@ 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 literal 0 HcmV?d00001 diff --git a/src/ui/packages/NHunspell.1.2.5554.16953/.signature.p7s b/src/ui/packages/NHunspell.1.2.5554.16953/.signature.p7s new file mode 100644 index 0000000000000000000000000000000000000000..3dceacb0df5ace3a9a910ed30b37a539b643ba35 GIT binary patch literal 9480 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 literal 0 HcmV?d00001 diff --git a/src/ui/packages/NHunspell.1.2.5554.16953/NHunspell.1.2.5554.16953.nupkg b/src/ui/packages/NHunspell.1.2.5554.16953/NHunspell.1.2.5554.16953.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..bbc41cf92ce0bc867c375eba92861365372dc022 GIT binary patch literal 413272 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 literal 0 HcmV?d00001 diff --git a/src/ui/packages/NHunspell.1.2.5554.16953/Tools/install.ps1 b/src/ui/packages/NHunspell.1.2.5554.16953/Tools/install.ps1 new file mode 100644 index 000000000..bfd13c31e --- /dev/null +++ b/src/ui/packages/NHunspell.1.2.5554.16953/Tools/install.ps1 @@ -0,0 +1,13 @@ +param($installPath, $toolsPath, $package, $project) + +# Hunspellx86.dll (32 Bit Windows) +$hunspellx86Dll = $project.ProjectItems.Item("Hunspellx86.dll") +$hunspellx86Dll.Properties.Item("BuildAction").Value = 0 # BuildAction = None +$hunspellx86Dll.Properties.Item("CopyToOutputDirectory").Value = 2 # CopyToOutputDirectory = Copy if newer + + +# Hunspellx64.dll (64 Bit Windows) +$hunspellx64Dll = $project.ProjectItems.Item("Hunspellx64.dll") +$hunspellx64Dll.Properties.Item("BuildAction").Value = 0 # BuildAction = None +$hunspellx64Dll.Properties.Item("CopyToOutputDirectory").Value = 2 # CopyToOutputDirectory = Copy if newer + diff --git a/src/ui/packages/NHunspell.1.2.5554.16953/content/Hunspellx64.dll b/src/ui/packages/NHunspell.1.2.5554.16953/content/Hunspellx64.dll new file mode 100644 index 0000000000000000000000000000000000000000..55a29ec845706fdf1825320b9a31ae496b673975 GIT binary patch literal 524288 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%0A&2s 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 literal 0 HcmV?d00001 diff --git a/src/ui/packages/NHunspell.1.2.5554.16953/content/Hunspellx86.dll b/src/ui/packages/NHunspell.1.2.5554.16953/content/Hunspellx86.dll new file mode 100644 index 0000000000000000000000000000000000000000..7bc6cf22240fcefad1ded5d0a865827ff0045db5 GIT binary patch literal 442368 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%0D<0m9sb(mGig|m5aC(mCN`yDpzndD%Ws5 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 J1OFFq{|Ahu@+1HN literal 0 HcmV?d00001 diff --git a/src/ui/packages/NHunspell.1.2.5554.16953/lib/net/NHunspell.dll b/src/ui/packages/NHunspell.1.2.5554.16953/lib/net/NHunspell.dll new file mode 100644 index 0000000000000000000000000000000000000000..3984517d4880afa6e9e6d3702f52f64b1c0c6ac0 GIT binary patch literal 31744 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 literal 0 HcmV?d00001 diff --git a/src/ui/packages/NHunspell.1.2.5554.16953/lib/net/NHunspell.pdb b/src/ui/packages/NHunspell.1.2.5554.16953/lib/net/NHunspell.pdb new file mode 100644 index 0000000000000000000000000000000000000000..bb758683f19516c2a23237b833cba6c80008dc0d GIT binary patch literal 69120 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 literal 0 HcmV?d00001 diff --git a/www/Help.cshtml b/www/Help.cshtml deleted file mode 100644 index 31f837866..000000000 --- a/www/Help.cshtml +++ /dev/null @@ -1,986 +0,0 @@ -@{ - ViewBag.Title = "Subtitle Edit 3.3 Help"; - ViewBag.Footer = "hOpe iT HelpZ"; - ViewBag.MetaKeywords = "Subtitle Edit help, subtitle tutorial, FAQ, how to synchronize"; - ViewBag.MetaDescription = "Subtitle Edit help page"; - ViewBag.FavIcon = "/favicon.ico"; -} -<h1>@ViewBag.Title</h1> -<hr /> -<br /> -<div style="text-align:right">Help is also available in <a href="/SubtitleEdit/HelpEU">Basque</a> | <a href="/SubtitleEdit/HelpEs">Spanish</a> | <a href="/Content/SubtitleEdit/Help/RU">Russian</a></div> -<h2>Mini FAQ</h2> -Q: When I try to open a video in format x, SE cannot play video or there's no sound. What do I do?<br /> -A: If you use Direct Show as video player be sure to use <a href="#codecs">the correct codecs</a>. I recommend uninstalling codec packs like k-lite and only installing <a href="http://code.google.com/p/lavfilters/downloads/list">LAV filters</a> 32-bit (+64-bit if you want). Another option is to use VLC as video player.<br /> -<br /> -Q: Where is the delay tool?<br /> -A: Use <b>Show earlier/later</b> in the <b>Synchronization</b> menu. Shortcut is <b>Ctrl+Shift+A</b>. It's a tool window, so you can keep it open while working - or checking subtitle preview in video player.<br /> -<br /> -Q: Why can't Subtitle Edit change frame rate?<br /> -A: Well, it can. Check <b>Synchronization -> Change frame rate</b>.<br /> -<br /> -Q: Why can't Subtitle Edit split/append subtitles?<br /> -A: Try <b>Tools -> Split/append</b>.<br /> -<br /> -Q: Can Subtitle Edit offset times - but not from the very beginning?<br /> -A: Yes, you can work with a selection of subtitle lines. Select the lines -in the list view you want to work on (hint: click on the first line, -then shift+click on the last) and -then right-click in the list view (context menu) - now you can adjust -the selected lines in "visual sync selected lines" or just "show -selected lines earlier/later".<br /> -<br /> -Q: Can Subtitle Edit play video fullscreen?<br /> -A: Yes, press ALT+ENTER. Use space for play/pause and ALT+ARROW UP/DOWN for next/previous subtitle.<br /> -<br /> -Q: When translating/editing subtitles, can Subtitle Edit navigate quickly to next line?<br /> -A: Yes, press ALT+ARROW UP/DOWN for next previous subtitle - also textbox will keep focus.<br /> -<br /> -Q: Can Subtitle Edit add the subtitles to the video file?<br /> -A: No, Subtitle Edit cannot do this - but one or more of the 100+ output formats should work. Use either <i>File</i> -> <i>Save as...</i> for text based formats or <i>File</i> -> <i>Export...</i> for binary/image-based formats.<br /> -There are two ways of adding subtitles into the video file - hardcoding (cannot be turned off ever, so this <i>might</i> be a bad idea) or embedding (only for some formats like mkv, mp4).<br /> -Read more about <a href="AddSubtitlesToVideo">adding subtitles to video</a>. -<br /> -<br /> -<hr /> -<br /> -<h2>Help index</h2> -<div style="margin-left: 25px; line-height: 25px;"> - <a href="#main">Subtitle Edit main window</a><br /> - <a href="#main_resize">Subtitle Edit main window - resize/un-dock</a><br /> - <a href="#main_edit_original">Subtitle Edit main window - edit original</a><br /> - <a href="#video_modes">Video/wave form modes</a><br /> - <a href="#waveform">Wave form</a><br /> - <a href="#export">Export</a><br /> - <a href="#sync">Synchronization</a><br /> - <a href="#visual_sync">Visual sync</a><br /> - <a href="#translation">Translation (auto)</a><br /> - <a href="#fixcommonerrors">Fix common errors</a><br /> - <a href="#spellcheck">Spell check</a><br /> - <a href="#importvobsub">Import/OCR image based subtitles - like DVD Sub/idx or Blu-ray sup</a><br /> - <a href="#shortcuts">Shortcuts</a><br /> - <a href="#translate">Translating Subtitle Edit to another language</a><br /> - <a href="#networking">Networking - online collaboration</a><br /> - <a href="#codecs">Video player and codecs</a><br /> - <a href="#commandline">Command line conversion</a><br /> - <a href="#portable">Portable version and VLC</a><br /> - <a href="#plugins">Make your own plugin</a><br /> - <a href="#compile">Compiling Subtitle Edit</a><br /> - <a href="#issues">Known issues</a><br /> -</div> -<br /> -<hr /> -<br /> -<h2><a id="main">Subtitle Edit main window</a></h2> - -<br /> -<h3>Menu in main window</h3> -In the menu you can find many tools like change casing, split, append, spell check, synchronization, change frame rate, Google translate, find, replace, remove text for hearing impaired, and much more!<br /> -You can import subtitles from DVD, vobsub, Blu-ray sup - even vobsub inside Matroska files can be imported.<br /> -<br /> -<img src="/Content/SubtitleEdit/main_menu.png" alt="Menu" /><br /> -<br /> -<small>NOTE: Many tools are also available via right click in the list view.</small> -<br /> -<br /> -<br /> - -<br /> -<h3><a id="formats">Subtitle/file formats</a></h3> -<table> - <tr> - <td> - <img src="/Content/SubtitleEdit/FormatAndEncoding.png" alt="Subtitle format" /> - <br /> - <br /> - In the top menu you can choose format and encoding. The first dropdown list shows subtitle formats. SubRip (extension is ".srt") is - the most widely used format today, so it is recommended to save subtitles in this format.<br /> - Originally SubRip was a text only format, but in recent years html tags have been common. Especially the - italic and font tags are widely used. For a list of SubRip support in players <a href="http://ale5000.altervista.org/subtitles.htm">check this out</a>.<br /> - <br /> - File encoding is auto detected in most cases. ANSI is the old, formerly the most common found format, but it requires your - system to have a specific culture setting. UTF-8 is recommended for new subtitles, as it can handle non English - letters better than ANSI (UTF-8 subtitles will work on all computers no matter what culture settings a computer has), and can display other - symbols like music nodes. The only drawback of using UTF-8 is, that some older programs do not support UFT-8 and WinXP only has a few semi-unicode fonts (Lucida Sans Unicode, Time New Roman, Courier New).<br /> - If you have an ANSI file in another language than the current culture/language (or you have an invalid UTF/Unicode file) then you can use the menu - item: <i>File</i> -> <i>Import subtitle with manual chosen encoding</i>.<br /> - <br /> - <i>Import subtitle with manual chosen encoding</i> with preview:<br /> - <img src="/Content/SubtitleEdit/ChooseEncoding.gif" alt="ChooseEncoding" /> - </td> - </tr> -</table> -<br /> -<br /> - -<h3>Frame rate</h3> -<table> - <tr> - <td> - <img src="/Content/SubtitleEdit/help_framerate.png" alt="Frame rate" /><br /> - <br /> - Frame rate is no longer displayed by default, but you can enable it via the menu <i>Options</i> -> <i>Settings: Toolbar: Show frame rate in toolbar</i>.<br /> - Frame rate is used when converting between subtitle formats based on frames and formats based on time. - SubRip is based on time. MicroDvd (widely used 7-9 years ago, and still widely used in some countries) is based on frames.<br /> - Subtitles based on time is preferred as videos may not have a constant frame rate - which makes - working with subtitles based on frames not very flexible at all.<br /> - To change the frame rate use <i>Synchronization</i> -> <i>Change frame rate</i> - or use one of the other <a href="#sync">synchronizations tools</a>. - </td> - </tr> -</table> -<br /> -<br /> - -<h3>Subtitle view - List view or source view</h3> -<p>There are two ways of looking at a subtitle - list view or source view.</p> -<table> - <tr> - <td> - <img src="/Content/SubtitleEdit/help_sourceview.png" alt="Source view" /> - </td> - <td> - This is how the subtitle file actually looks - different for all formats.<br /> - You can edit text and time codes here, but be careful - it's also easy to mess things - up.<br /> - You can make Subtitle Edit start in Source view under Settings. - </td> - </tr> -</table> -<br /> -<table> - <tr> - <td colspan="2"> - <a id="listview"><img src="/Content/SubtitleEdit/help_listview.png" alt="List view" /></a> - </td> - </tr> - <tr> - <td> - The list view gives an excellent overview of the subtitle - the same for all formats.<br /> - You can edit text and time codes here, delete and insert lines easily.<br /> - <br /> - </td> - </tr> - <tr> - <td colspan="2"> - <br /> - It is also possible to select several lines and use tools like <i>Google translate</i> or - <i>Visual sync</i> on the selected lines.<br /> - <br /> - <a id="listview2"><img src="/Content/SubtitleEdit/help_listview2.png" alt="Listview" /></a> - </td> - </tr> - <td colspan="2"> - <br /> - <br /> - <h3>TextBox</h3> - <p>Above the textbox where you can type the actual subtitle is a label called "Char/sec". - If it's higher than 25 it will be colored orange/red.<br /> - <br /> - </p> - <img src="/Content/SubtitleEdit/TextBox.png" alt="search" /><br /> - <br /> - Below the textbox is a label called "Single line length". First line is 33 characters and second line is 75 characters. - The color referrers to how long current line is compared to Settings -> Options : General : Single line max length - (43 is default). Red means too long, orange means it's close to max. - <br /> - <br /> - </td> - <tr> - </tr> - <tr> - <td colspan="2"> - <br /> - <br /> - <h3>Show video and/or waveform/spectrogram</h3> - <br /> - <a id="main_resize">The main window can show video and/or wave form.</a> Video controls can even be un-docked - nice if you have two monitors!<br /> - The horizontal/vertical red lines shows where you can resize inside the main window (via splitters).<br /> - <br /> - <img src="/Content/SubtitleEdit/main_video1.png" alt="Main window - with video/waveform" /> - </td> - </tr> - <tr> - <td colspan="2"> - <br /> - <br /> - <a id="main_edit_original">It's now possible to edit both new translation and original subtitle at the same time.</a> Default, the original is read-only, but you can change that in Options -> Settings:General:Allow edit of original subtitle.<br /> - Shortcuts: <b>Ctrl+U</b> will toggle original subtitle. <b>Ctrl+Shift+U</b> will switch translated / original subtitle.<br /> - When editing both original and translated subtitle, changing start time/duration/deleting/inserting will affect both subtitles!<br /> - <br /> - <img src="/Content/SubtitleEdit/main_edit_original.jpg" alt="Main window - with video/waveform" /> - </td> - </tr> -</table> - -<br /> -<br /> -<h3>Search</h3> -<p>You can search by pressing Ctrl+F (F3 is find next). Regular expression search is available for nerds ;)</p> -<img src="/Content/SubtitleEdit/help_search.png" alt="search" /><br /> -<br /> -<hr /> -<br /> - -<br /> -<br /> -<h3><a id="multiple_replace">Multiple Replace</a></h3> -<p>In <i>Edit -> Multiple replace</i> you can create your own rules for fixing a subtitle - even advanced rules using <a href="http://en.wikipedia.org/wiki/Regular_expression">regular expressions</a>!</p> -<p>When writing regular expressions grouping and backreferences are very useful. Parts of a regular expression inside parentheses are groups and can be referenced in the replace string where $1 is a reference to the first group and $2 is a reference to the second and so on.<br /> -<div style="padding-left:15px"> -Example 1: <b>^J( .+)</b> + replace string <b>♪ $1</b> - only the starting "J" will be replaced, so if the text is "J Music Playing J" it will become "♪ Music Playing J"<br /> -Example 2: <b>([a-z]+)([0-9]+)</b> + replace string <b>$2$1</b> - two groupings that will be switched, so if the text is "number26" it will become "26number".<br /> -</div> -</p> -<img src="/Content/SubtitleEdit/main_edit_multiple_replace.png" alt="Multiple replace" /><br /> -<br /> -<hr /> -<br /> - -<h2><a id="video_modes">Video/wave form modes</a></h2> -<br /> -When using video and/or wave form three different modes (tabs) are available: Translate, Create, and Adjust. - -<h3>Translate mode</h3> -<img src="/Content/SubtitleEdit/mode_translate.png" alt="Translate mode" /><br /> -<br /> -In translate mode you can translate a subtitle from one language to another manually (or correct a machine -translated subtitle) while watching the video - and hearing the audio.<br /> -If "Auto repeat" is on, then the subtitle will be repeated x-times while you are typing in the correct text.<br /> -Use <i>File</i> -> <i>Open original subtitle (translator mode)</i> to also display the original text.<br /> -Hint: Do use the &lt;alt+arrow up/down&gt; for going to previous/next subtitle.<br /> -<br /> -<br /> - -<h3>Create mode</h3> -<img src="/Content/SubtitleEdit/mode_create.png" alt="Create/adjust lines" /><br /> -<br /> -This is the place to create subtitle lines from scratch or manually adjust existing lines.<br /> -<br /> -To create subtitle lines from scratch, pause the video file where the subtitle line should start and press the button -"Insert new subtitle at video pos". Then enter the text - duration is auto suggested. Now press the button "Play from -just before text" and if the text does not start exactly when the speech starts, then adjust "Start time" via the up/down -arrows until it does. The duration can be set via the button "Set end time" while the video is playing or via the "Duration up/down arrows.<br /> -To insert a subtitle right after the current line, press the Insert button (while the list view is focused).<br /> -<br /> -You can also right click on the audio wave form or in the list view to insert/merge/split/delete lines.<br /> -<br /> -<br /> - -<h3>Adjust mode</h3> -<img src="/Content/SubtitleEdit/mode_adjust.png" alt="Adjust mode" /><br /> -<br /> -This is the place to adjust existing lines.<br /> -<br /> -To adjust subtitle lines manually one by one starting from the top. Use the buttons "Set start and offset the rest" (F9) and "Set end &amp; go to next" (F10). -Fine-tuning of "Start time" and "Duration" should be done by using the up/down arrows.<br /> -<br /> -You can also right click on the audio wave form or in the list view to insert/merge/split/delete lines.<br /> -<br /> -<hr /> -<br /> - -<h2><a id="waveform">Wave form</a></h2> -The wave form control makes it easy to see exactly where speech start/end.<br /> -<img src="/Content/SubtitleEdit/Waveform1.png" alt="Wave form" /><br /> -<br /> -<br /> -With the right click menu, you can split/merge/delete subtitles.<br /> -<img src="/Content/SubtitleEdit/Waveform2.png" alt="Wave form - right click menu"/><br /> -<br /> -<br /> -To create a new paragraph, just select an empty area and right click.<br /> -<img src="/Content/SubtitleEdit/Waveform3.png" alt="Wave form - new selection" /><br /> -<br /> - -<h3>Wave form mouse/keys usage:</h3> -<ul> - <li>Mouse single click: Go to position</li> - <li>Mouse double click on existing subtitle: Select clicked subtitle</li> - <li>Mark area + right click on marked area: Prompt for add new paragraph / play current selection</li> - <li>Mouse drag left/right border of subtitles (adjusting start or end time)</li> - <li>Move/drag on middle of subtitle (adjusting both start and end time - but not duration)</li> - <li>Mouse right click can either add new subtitle or perform delete/split/merge on existing subtitle line</li> - <li>Mouse wheel scrolls waveform forward/back</li> - <li>alt+arrow left/right moves video position</li> - <li>alt+arrow up/down goes previous/next subtitle</li> - <li>Numeric +/- will zoom in/out</li> - <li>Mouse single click+Shift will set start for selected line (not moving end time)</li> - <li>Mouse single click+Ctrl will set end for selected line (not moving start time)</li> - <li>Mouse single click+Alt will set start for selected line (and keep duration)</li> - <li>Mouse double click on non-paragraph - toggle play</li> - <li><b>Mouse single click+Ctrl+Shift will set of start selected line + offset all lines after selected line (keeping durations)</b></li> - <li>Holding down ALT when moving start/end will move nearest subtitle start/end too if it's closer than 500 milliseconds - <a href="/Content/SubtitleEdit/WaveformMoveNextPrev.gif">like this.</a></li> -</ul> - -<br /> -<h3>Wave extraction</h3> -The extracting of wave data is done by <a href="http://www.videolan.org/">VLC media player 2.x (or 1.1.x/)</a>, and then a very small wave file (with a VERY low samplerate) is generated -and saved in the "WaveForms" folder. If VLC for some reason fails to extract a wave file from the video, you can extract the wave file with some other tool and drop -that wave file on the waveform control, which will generate a small wave file (with a VERY low samplerate) in the "WaveForms" folder.<br /> -<br /> -Note: You cannot use waveform without the video (if you only have a wav file and no video, it is possible to load the wave file as video file + drop the wave file on the waveform control). -<br /> -<hr /> -<br /> - - -<br /> -<h2><a id="export">Export</a></h2> -Subtitle Edit can save via "Save as..." in many different text formats, but if you want to save a subtitle in a binary format (like pac or 890) or an image based format (like png or bluray sup) you must use File -> Export.<br /> -Many styles like italic and color from subtitles are preserved when exporting to image based formats.<br /> -<br /> -<hr /> -<br /> - - -<h2><a id="sync">Synchronization</a></h2> -<table> - <tr> - <td> - <img src="/Content/SubtitleEdit/SyncMenu.png" alt="Sync menu" /> - </td> - </tr> - <tr> - <td> - <br /> - Subtitle Edit offers several ways to synchronize subtitles.<br /> - <p>Adjust all times (show earlier/later): This is useful if you for example need to show all texts 3 seconds earlier.</p> - <p><a href="#visual_sync">Visual sync</a>: Sync by matching start/end scene (more below).</p> - <p>Point sync: This allows synchronization by using 2 or more points - sync point time - codes can be entered manually which makes it easy to use time codes from another subtitle already in sync.</p> - <p>Point sync via other subtitle: If you have another subtitle in sync (perhaps in another language - it helps if you can understand it a bit) you can match one of - the first lines, match one of the last lines, sync, and then all lines should be in sync.</p> - <p>Change frame rate: This makes it easy to match text from a video with one frame rate to a video with another frame rate (can also be done by visual sync or point sync).</p> - </td> - </tr> -</table> -<br /> -<br /> -<br /> - - -<h2><a id="visual_sync">Visual sync</a></h2> -<table> - <tr> - <td colspan="2"> - <img src="/Content/SubtitleEdit/vissync.gif" alt="Visual Sync controls" /> - </td> - </tr> - <tr> - <td> - <img src="/Content/SubtitleEdit/help_vs2.png" alt="Synchronize button" /> - </td> - <td> - <br /> - Visual sync is a really easy way to synchronize a subtitle with a video file.<br /> - Match one of the first subtitle lines with the start scene. Then match one of the - last subtitle lines with the end scene. Press "Sync!" - and that's it :)<br /> - There are a few helper buttons which will help find the right place in the video where the - subtitle should start (just about where the first word comes out). The "Play 1 sec and back" button is a test button, - so you can easily very that the current position really is correct. Also check the <a href="#shortcuts">Shortcuts</a>.<br /> - <br /> - In some cases a subtitle is impossible to synchronize because one or more scenes have been removed/added. - In these cases you can select a number of subtitles in the subtitle <a href="#listview">list view</a>, right - click and choose <i>Visual sync selected lines</i>. This way you can adjust the subtitle in smaller parts. - </td> - </tr> -</table><br /> -<br /> -<hr /> -<br /> -<h2><a id="translation">Translation (auto)</a></h2> -Subtitle Edit can translate a subtitle by using <a href="http://www.google.com/translate">Google translation</a> -or <a href="../mt">Multi Translator</a> (only Swedish to Danish).<br /> -Google has translation between a lot of languages! It works fairly well, but translated subtitles will still -need manual correction (hint: use main window <a href="#video_modes">translate mode</a>). -<br /> -<br /> -<img src="/Content/SubtitleEdit/help_googletranslate.png" alt="Create/add lines" /><br /> -<br /> -<hr /> -<br /> -<h2><a id="fixcommonerrors">Fix common errors</a></h2> -<br /> -<img src="/Content/SubtitleEdit/help_fixcommonerrors1.png" alt="Fix common errors" /><br /> -<br /> -Some subtitles have an lot of errors (often these subtitles are created using OCR software).<br /> -"Tools -> Fix common errors" provides an easy way to fix a lot of these errors.<br /> -The first window shows a list of actions to fix, just tick the check boxes you want fixed and click "Next".<br /> -<br /> -<br /> -<img src="/Content/SubtitleEdit/help_fixcommonerrors2.png" alt="Fix common errors" /><br /> -<br /> -Now you can choose which fixes to apply. Default all fixes are selected, so you must un-check the checkbox for fixes -you do not wish to apply.<br /> -The log tab gives an overview of what will be done - and what was not possible to fix.<br /> -The "Apply selected fixes" button applies the fixes.<br /> -<br /> -<hr /> -<br /> -<b><a id="spellcheck">Spell check</a></b> -<br /> -<br /> -Spell check uses <a href="http://hunspell.sourceforge.net/">Hunspell</a> (which is also used by Open/LibraOffice, Firefox, Chrome, and Opera).<br /> -Only English dictionary is included, but you can easily find more dictionaries via the toolbar menu <i>Spell check</i> -> <i>Get dictionaries...</i>!<br /> -If you download <a href="http://extensions.services.openoffice.org/en/dictionaries">Open Office 3.x dictionaries</a> with the extension .oxt, then rename to .zip, and then unpack -the .dic file and the .aff file to the Subtitle Edit <i>Dictionary</i> folder.<br /> -<br /> -The spell check will show this window when it encounters an unknown word:<br /> -<img src="/Content/SubtitleEdit/spell_check.png" alt="spell check" /><br /> -<b><i>Edit whole text</i></b> will enable editing of the whole text (and not only the current word) - for this one sub only.<br /> -<b><i>Change all / Use always</i></b> will change current word in always - also in future works (saved in the OCR Fix Replace list - take a look at Dictionaries/eng_OCRFixReplaceList.xml to learn more about this file).<br /> -<b><i>Change / Use</i></b> will change current word just this once.<br /> -<b><i>Add to names/noise list (case sensitive)</i></b> will remember the name in the edit text box with current casing - also in future works.<br /> -<b><i>Add to user dictionary</i></b> will remember the word in the edit text box and not prompt for it any more - also in future works. User dictionary is not case sensitive.<br /> -<br /> -All buttons in the "Word not found" groupbox will use the word in the "Word not found" textbox.<br /> -<br /> -<hr /> -<br /> -<h2><a id="importvobsub">Import/OCR image based subtitles - like DVD Sub/idx or Blu-ray sup</a></h2> -<br /> -<br /> -If you open an image based subtitle like Blu-ray sup or sub/idx (vobsub) this screen will come up:<br /> -<br /> -<img src="/Content/SubtitleEdit/help_importvobsub.png" alt="Import/ocr image based subtitles" /><br /> -<br /> -<br /> -The list view now contains empty subtitle text lines with only timestamps. You can enter the text manually, but two (or three if you have MODI installed) better options exists: -<ul> - <li>OCR via Tesseract 3 (recommended): <a href="http://code.google.com/p/tesseract-ocr/">Tesseract</a> is an open source OCR engine. <br /> - You can find additional language data files at the <a href="http://code.google.com/p/tesseract-ocr/downloads/list">Tesseract Google code project</a>. These Tesseract - dictionary files need to be unpacked to [Subtitle Edit folder]\Tesseract\tessdata.<br /> - <br /> - If you right-click in the list view, you will get a context menu with these options:<br /> - <img src="/Content/SubtitleEdit/ocr_context_menu.png" alt="OCR list view context menu" /><br /> - <b><i>Import text with matching time codes...</i></b> can be used to continue working on an earlier created subtitle.<br /> - <b><i>Save subtitle image as...</i></b> allows for saving current image as either pgn, gif, bmp, or tiff.<br /> - <b><i>Save all images with html index</i></b> display all subtitles images in an html page - for easy proof reading.<br /> - <br /> - - OCR via Tesseract will work best if you also have <a href="#spellcheck">spell check</a> dictionaries.<br /> - <img src="/Content/SubtitleEdit/ocr_dictionary.png" alt="OCR dictionary" /><br /> - <b><i>prompt for unknown words</i></b> and <b><i>Try to guess unknown words</i></b> will only work if a dictionary is available. <b><i>Fix OCR errors</i></b> will also benefit - from a dictionary.<br /> - <br /> - The <b><i>prompt for unknown words</i></b> will look like this (window is re-sizable):<br /> - <img src="/Content/SubtitleEdit/ocr_spell_check.png" alt="OCR spell check" /><br /> - <b><i>Edit whole text</i></b> will enable editing of the whole text (and not only the current word) - for this one sub only.<br /> - <b><i>Change all / Use always</i></b> will change current word always - also in future works (saved in the OCR Fix Replace list - take a look at Dictionaries/eng_OCRFixReplaceList.xml to learn more about this file).<br /> - <b><i>Change / Use</i></b> will change current word just this once.<br /> - <b><i>Add to names/noise list (case sensitive)</i></b> will remember this name with current casing - also in future works.<br /> - <b><i>Add to user dictionary</i></b> will remember this word and not prompt for it any more - also in future works.<br /> - <br /> - <br /> - </li> - <li>OCR via image compare: This option does not require any third party software installed, but it does require the user to manually - enter letters based on image parts.<br /> - "No of pixels is space" should be decreased if not all translated words are separated (like "<i>wearefine.</i>"), and increased - if there are too many separations (like "<i>w e ar e fi n e.</i>").<br /> - Note: This does not work well with Blu-ray sup files!<br /> - <br /> - </li> - <li>OCR via MODI: MODI is short for <a href="http://en.wikipedia.org/wiki/Microsoft_Office_Document_Imaging">Microsoft Office Document Imaging</a>. It's included with Microsoft Office Tools ("Microsoft Office \ Microsoft Office Tools" folder in the start menu).<br /> - This works a lot like Tesseract, but requires MS Office.<br /> - If you do have Microsoft Office installed but the MODI OCR is not available do try to run the MS Office setup again and make sure that MODI is selected in the setup program. - <br /> - </li> -</ul> -Select one of the OCR methods and click on the button "Start OCR".<br/> -When you are done just click "OK" and do remember that an OCR'ed subtitle most likely contains some errors that need correction.<br /> -If a VobSub subtitle contains more than one language, you will be prompted for language.<br /> -<br /> -<hr /> -<br /> -<br /> -<h2><a id="shortcuts">Shortcuts</a></h2> -<br /> -<table id="tableShortcuts"> - <thead> - <tr> - <th>Window</th> - <th>Control</th> - <th>Shortcuts</th> - <th>Function</th> - </tr> - </thead> - <tbody> - <tr> - <td>Main</td> - <td>*</td> - <td>F1</td> - <td>Show this help file ;)</td> - </tr> - <tr> - <td>Main</td> - <td>*</td> - <td>Ctrl+F</td> - <td>Open the Find dialog</td> - </tr> - <tr> - <td>Main</td> - <td>*</td> - <td>F3</td> - <td>Find next</td> - </tr> - <tr> - <td>Main</td> - <td>*</td> - <td>Ctrl+z</td> - <td>Show history/undo</td> - </tr> - <tr> - <td>Main</td> - <td>*</td> - <td>Ctrl+G</td> - <td>Go to subtitle number dialog</td> - </tr> - <tr> - <td>Main</td> - <td>*</td> - <td>Ctrl+L</td> - <td>Locates (scrolls to) first selected subtitle line in the subtitle list view</td> - </tr> - <tr> - <td>Main</td> - <td>*</td> - <td>Alt+Arrow up</td> - <td>Go one line up in subtitle list view</td> - </tr> - <tr> - <td>Main</td> - <td>*</td> - <td>Alt+Arrow down</td> - <td>Go one line down in subtitle list view</td> - </tr> - <tr> - <td>Main</td> - <td>*</td> - <td>Ctrl+U</td> - <td>Translator mode on/off</td> - </tr> - <tr> - <td>Main</td> - <td>*</td> - <td>Ctrl+Shift+U</td> - <td>Switch current subtitle with original subtitle</td> - </tr> - <tr> - <td>Main</td> - <td>*</td> - <td>Shift+Insert</td> - <td>Insert line before first selected line</td> - </tr> - <tr> - <td>Main</td> - <td>*</td> - <td>Alt+Insert</td> - <td>Insert line after first selected line</td> - </tr> - <tr> - <td>Main</td> - <td>Subtitle text box</td> - <td>Ctrl+I</td> - <td>Make selection italic</td> - </tr> - <tr> - <td>-</td> - <td>-</td> - <td>-</td> - <td>-</td> - </tr> - <tr> - <td>Main</td> - <td>Subtitle list view</td> - <td>Ctrl+A</td> - <td>Select all lines</td> - </tr> - <tr> - <td>Main</td> - <td>Subtitle list view</td> - <td>Ctrl+D</td> - <td>Select only first selected line</td> - </tr> - <tr> - <td>Main</td> - <td>Subtitle list view</td> - <td>Ctrl+Shift+I</td> - <td>Inverse selection</td> - </tr> - <tr> - <td>Main</td> - <td>Subtitle list view</td> - <td>Delete</td> - <td>Delete selected lines</td> - </tr> - <tr> - <td>Main</td> - <td>Subtitle list view</td> - <td>Insert</td> - <td>Insert line after first selected line</td> - </tr> - <tr> - <td>Main</td> - <td>*</td> - <td>Ctrl+Shift+M (or Ctrl+K)</td> - <td>Merge selected lines</td> - </tr> - <tr> - <td>-</td> - <td>-</td> - <td>-</td> - <td>-</td> - </tr> - <tr> - <td>Main</td> - <td>video player/waveform</td> - <td>Alt+Arrow left</td> - <td>Go 0,5 second back in video</td> - </tr> - <tr> - <td>Main</td> - <td>video player/waveform</td> - <td>Alt+Arrow right</td> - <td>Go 0,5 second forward in video</td> - </tr> - <tr> - <td>Main</td> - <td>video player/waveform</td> - <td>Ctrl+Arrow left</td> - <td>Go 0,1 second back in video</td> - </tr> - <tr> - <td>Main</td> - <td>video player/waveform</td> - <td>Ctrl+Arrow right</td> - <td>Go 0,1 second forward in video</td> - </tr> - <tr> - <td>Main</td> - <td>video player/waveform</td> - <td>Ctrl+Alt+P</td> - <td>Pause video</td> - </tr> - <tr> - <td>Main</td> - <td>video player/waveform</td> - <td>Ctrl+P</td> - <td>Toggle play/pause video</td> - </tr> - <tr> - <td>Main</td> - <td>video player/waveform</td> - <td>F4</td> - <td>Toggle position between end/start of current paragraph</td> - </tr> - <tr> - <td>Main</td> - <td>video player/waveform</td> - <td>F5</td> - <td>Play current paragraph and stop right after</td> - </tr> - <tr> - <td>Main</td> - <td>video player/waveform</td> - <td>F6</td> - <td>Go to start of current paragraph</td> - </tr> - <tr> - <td>Main</td> - <td>video player/waveform</td> - <td>F7</td> - <td>Go 3 seconds back</td> - </tr> - <tr> - <td>Main</td> - <td>video player/waveform</td> - <td>F8</td> - <td>Toggle play/pause</td> - </tr> - <tr> - <td>Main</td> - <td>video player/waveform</td> - <td>F9-F12</td> - <td>Depend on mode (translate/create/adjust)</td> - </tr> - <tr> - <td>Main</td> - <td>video player/waveform</td> - <td>Alt+1</td> - <td>Go to start position of current paragraph</td> - </tr> - <tr> - <td>Main</td> - <td>video player/waveform</td> - <td>Alt+2</td> - <td>Go to end position of current paragraph</td> - </tr> - <tr> - <td>Main</td> - <td>video player/waveform</td> - <td>Alt+3</td> - <td>Go to previous paragraph</td> - </tr> - <tr> - <td>Main</td> - <td>video player/waveform</td> - <td>Alt+4</td> - <td>Go to next paragraph</td> - </tr> - <tr> - <td>Main</td> - <td>video player/waveform - Adjust mode</td> - <td>Ctrl+Space</td> - <td>Set start and offset the rest</td> - </tr> - <tr> - <td>Main</td> - <td>video player/waveform - Adjust mode</td> - <td>Shift+Space</td> - <td>Set end and go to next</td> - </tr> - <tr> - <td>-</td> - <td>-</td> - <td>-</td> - <td>-</td> - </tr> - <tr> - <td>Undocked video player</td> - <td>-</td> - <td>Alt+A</td> - <td>Resize window so video is aspect ratio 1:1</td> - </tr> - <tr> - <td>Undocked video player</td> - <td>-</td> - <td>Alt+Enter</td> - <td>Toggle maximized/normal window size</td> - </tr> - <tr> - <td>-</td> - <td>-</td> - <td>-</td> - <td>-</td> - </tr> - <tr> - <td>OCR via image compare - Image to text manually</td> - <td>-</td> - <td>Alt+Arrow right</td> - <td>Expand selection</td> - </tr> - <tr> - <td>OCR via image compare - Image to text manually</td> - <td>-</td> - <td>Alt+Arrow left</td> - <td>Shrink selection</td> - </tr> - <tr> - <td>OCR via image compare - Image to text manually</td> - <td>-</td> - <td>Alt+i (depends on translation)</td> - <td>Toggle italic</td> - </tr> - <tr> - <td>OCR via image compare - Image to text manually</td> - <td>-</td> - <td>Alt+f (depends on translation)</td> - <td>Toggle auto-submit (automatically continues after first pressed letter)</td> - </tr> - </tbody> -</table> -<br /> -<br /> -Note - many of the shortcuts are configurable via <i>Options -> Settings -> Shortcuts</i> (let me know if you need more):<br /> -<br /> -<img src="/Content/SubtitleEdit/shortcuts.png" alt="Configurable shortcuts" /><br /> -<br /> -<br /> -<br /> -<hr /> -<br /> -<br /> - -<h2><a id="translate">Translating Subtitle Edit to another language</a></h2> -<br /> -To translate Subtitle Edit first download <a href="/Content/SubtitleEdit/Language.xml">the English xml language file</a> and save it to your -"Subtitle Edit\Languages" folder. Translate the content of all tags with an xml editor or just notepad. You can also use -<a href="/XmlContentTranslator">Xml Content Translator</a>!<br /> -Save your edited xml file as 'CultureName'.xml ('CultureName' must be an <a href="http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo%28v=vs.80%29.aspx">existing culture name</a> - and also a tag in the xml file) in the SubtitleEdit\Languages folder. In Options > Choose language, -you can now test your translation by choosing your language as language.<br /> -Please do send any translations to me, so I can include them in Subtitle Edit - thx :)<br /> -Tip: <a href="http://winmerge.org">WinMerge </a> is an excellent tool for comparing files.<br /> -<br /> -The installer can localized by translating <a href="http://subtitleedit.googlecode.com/svn/trunk/installer/Custom_Messages.iss">this file</a>. -<br /> -<br /> -<hr /> -<br /> - - -<h2><a id="networking">Networking - online collaboration</a></h2> -<br /> -If you and a few friends want to translate the same subtitle at the same time over the internet, then do try the "Networking" feature.<br /> -First load the subtitle you want translated (and optionally the original subtitle). Then choose "Start new session" in the "Networking" menu:<br /> -<br /> -<img src="/Content/SubtitleEdit/NetworkingStart.png" alt="Start network session" /> -<br /> -<br /> -The "session key" is your subtitle id (can be any text you like) - other people need this in order to join (via menu Networking -> Join session) your session.<br /> -The "username" will be displayed when updating/inserting/deleting lines and in the chat window<br /> -The "webservice url" points to a small server program hosting the session (I initially developed this via direct p2p, but decided to use a webservice -instead, as it works much better with stuff like firewalls). <a href="/Content/SubtitleEdit/SENetworkingService.zip">Source code for this webservice is available</a> and should -make it easy to use your own server for hosting the networking session.<br /> -<br /> -<br /> -Subtitle Edit running in networking mode below. In the "User/action" column in the list view you can follow the translation progress - this might sparkle some synergistic effect!<br /> -<br /> -<img src="/Content/SubtitleEdit/networking.jpg" alt="Subtitle Edit running in networking mode" /> -<br /> -<br /> -<hr /> -<br /> - - -<h2><a id="codecs">Video player and codecs</a></h2> -<br /> -Subtitle Edit can use VLC media player inside Subtitle Edit instead of DirectShow - go to <i>Options -> Settings -> Video player</i>. If the VLC option is grayed out, then you probably -need to install VLC version 2.x or 1.1.x!<br /> -Yet another video option is to use <a href="http://www.mplayer2.org/">mplayer2</a>. Save "mplayer.exe" in your Subtitle Edit folder and in Subtitle Edit go to <i>Options -> Settings -> Video player</i> and choose "MPlayer".<br /> -Note: VLC and MPlayer come with their own codecs, so you don't need to install <a href="http://code.google.com/p/lavfilters/">LAV Filters</a> or ffdshow/Hali Matroska Splitter.<br /> -<br /> -<img src="/Content/SubtitleEdit/OptionsVideoPlayer.png" alt="Choose video player" /> -<br /> -<br /> -Often problems with the DirectShow video player in Subtitle Edit are caused by bad/conflicting/missing/old codecs (Codec packs are EVIL!).<br/> -The error might be something like System.Runtime.InteropServices.InvalidComObjectException and might mention QuartzTypeLib/QuartzPlayer.<br /> -<br /> -My recommendation is to uninstall all codec packs (incl. K-lite), reboot, and then install <a href="http://code.google.com/p/lavfilters/">LAV Filters - DirectShow Media Splitter and Decoders</a> <br /> -Note that Subtitle Edit is a 32-bit application (unless you have specifically found a 64-bit version) and hence requires 32-bit codecs - even on win7 64-bit<br /> -<br /> -If you have problems with a specific format/file try <a href="http://mediaarea.net/MediaInfo">MediaInfo</a> / <a href="http://www.headbands.com/gspot/">GSpot</a>.<br /><br /> -<br /> -<hr /> - -<h2><a id="commandline">Subtitle Edit command line conversion</a></h2> -<br /> -Subtitle Edit (3.2) can do command line conversion between formats listed in the main window format drop down list.<br /> -<br /> -Syntax: SubtitleEdit /convert "pattern" "name-of-format-without-spaces" [/encoding:?] [/fps:?] [/outputfolder:?]:<br /> -<br /> - Example 1: <div style="font-family:Times New Roman; font-style:italic">SubtitleEdit /convert sub1.srt sami</div> Result: Will convert sub1.srt to sub1.sub to SAMI format<br /> -<br /> - Example 2: <div style="font-family:Times New Roman; font-style:italic">SubtitleEdit /convert *.srt adobeencore</div> Result: Will convert all .srt files to Adobe Encore format<br /> -<br /> - Example 3: <div style="font-family:Times New Roman; font-style:italic">SubtitleEdit /convert *.srt adobeencore /encoding:windows-1252</div> Result: Same as above but using windows-1252 file encoding (see <a href="http://msdn.microsoft.com/en-us/library/system.text.encodinginfo.getencoding.aspx">Info.Name list</a> for more encodings)<br /> -<br /> - Example 4: <div style="font-family:Times New Roman; font-style:italic">SubtitleEdit /convert a.sub subrip /fps:25</div> Result: Converts frame based a.sub to time based a.srt via a frame rate of 25<br /> -<br /> - Example 5: <div style="font-family:Times New Roman; font-style:italic">SubtitleEdit /convert a.sub subrip /outputfolder:C:\Temp</div> Result: Converts a.sub to C:\Temp\a.srt<br /> -<br /> - To list supported formats: <div style="font-family:Times New Roman; font-style:italic">SubtitleEdit /convert /list</div> Result: Show the more than 100 supported formats in command line conversion!<br /> -<br /> -<br /> -<hr /> - -<h2><a id="portable">Portable version and VLC</a></h2> -<br /> -To use the portable version with VLC portable, download VLC portable (at least version 1.1.0, like <a href="http://get.videolan.org/vlc/2.0.6/win32/vlc-2.0.6-win32.zip">vlc 2.0.6</a>) and unpack to a sub folder in the Subtitle Edit folder called "VLC". Another option is to use the &lt;VlcLocation&gt; in Settings.xml.<br /> -Note: You need VLC 32-bit. -<br /> -<br /> -<hr /> - -<h2><a id="plugins">Make your own plugin</a></h2> -<br /> -If you can code C# or VB.net you can make your own plugins for SE (SE 3.3 and later).<br /> -<br /> -You can <a href="/Content/SubtitleEdit/PluginSource.zip">download two demo plugins here</a>.<br /> -"Haxor" is a very very basic example.<br /> -"Fix Hyphens" is a more complete example with a form and some basic helper classes.<br /> -At the moment it is possible to use plugins here: File, Tools, Sync, Translate, and Spellcheck.<br /> -<br /> -<br /> -<hr /> - -<h2><a id="compile">Compiling Subtitle Edit</a></h2> -<br /> -Compiling your own version of Subtitle Edit is easy as pie!<br /> -<br /> -If you don't have MS Visual Studio, then just download and install <a href="http://www.microsoft.com/express/vcsharp/">MS Visual C# Express</a>. -Then download the Subtitle Edit source code and open the "SubtitleEdit.csproj" file. Hit F5 - and that's it :)<br /> -Now you can change/add features you want or fix my bugs - if there were any ;) -<br /> -<br /> -<hr /> - - -<h2><a id="issues">Known issues</a></h2> -<br /> -Subtitle Edit has a few known problems!<br /> -<br /> -<table id="tableKnownIssues"> - <thead> - <tr> - <th>Problem</th> - <th>Solution</th> - </tr> - </thead> - <tbody> - <tr> - <td>Crash while playing/loading/showing video with K-Lite installed<br /> - (or other video/audio problems)</td> - <td>Uninstall K-lite and then install <a href="http://code.google.com/p/lavfilters/">LAV Filters - DirectShow Media Splitter and Decoders</a><br /> - <small>Note that Subtitle Edit is a 32-bit application (unless you have specifically found a 64-bit version) and hence requires 32-bit codecs - even on win7 64-bit</small> - <br /><br />Another option is to change video player to VLC in Subtitle Edit via Options->Settings: Video player!</td> - </tr> - <tr> - <td>Problems with unicode characters (WinXp)</td> - <td> - Use font Lucida Sans Unicode/Times New Roman - or upgrade your xp to Windows 7 or 8 (even Vista works better than XP here - also from April 8 2014 nobody should use XP as MS stops all updates/patches)<br /> - Also, you can use File -> Import subtitle with manual chosen encoding. - </td> - </tr> - <tr> - <td>Spell check (NHunspell) crashes</td> - <td>You can change spell check to use MS Word in Options!</td> - </tr> - <tr> - <td>Subtitle Edit fails to run from a network drive ("The publisher could not be verified")</td> - <td>If you do not have sufficient access to run Subtitle Edit from a network drive, then copy it to your local hard disk or obtain the needed access.</td> - </tr> - <tr> - <td>Subtitle Edit portable is not working properly in "Program files" folder</td> - <td>Use the installer if you want to have Subtitle Edit in "Program files" (remove portable version before)</td> - </tr> - <tr> - <td>Subtitle Edit does not detect VLC in options (it's grayed out)</td> - <td>You will need VLC 2.x - and it must be the 32-bit version (unless you also compiled your own 64-bit version of Subtitle Edit)</td> - </tr> - <tr> - <td>Tesseract will not run properly...</td> - <td>If you have used the tesseract installer, then uninstall it. After uninstalling the tesseract installer, you must still remove the environment variable "TESSDATA_PREFIX" (e.g. <a href="http://www.itechtalk.com/thread3595.html">like this)</a>.<br /> - Also, you might need the visual studio 2008 c++ runtime: http://www.microsoft.com/en-au/download/details.aspx?id=5582</td> - </tr> - </tbody> -</table> -<br /> -<br /> -<hr /> - -<br /> -<br /> -<br /> -<br /> -Did you not find what you were looking for? Feel free to <a href="mailto:nikse.dk@gmail.com">email me</a>.<br /> -<br /> -Also, do check out <a href="Video">the Subtitle Edit Intro videos</a> and the <a href="/Content/SubtitleEdit/TutorialByDny238.html">Syncing Subtitles with Subtitle Edit</a> tutorial by dny238! -<br /> -<br /> -<br /> -<br /> -<br /> -<script type="text/javascript"> - addGrid('tableShortcuts'); - addGrid('tableKnownIssues'); -</script> \ No newline at end of file diff --git a/www/HelpEU.cshtml b/www/HelpEU.cshtml deleted file mode 100644 index 64bc05c51..000000000 --- a/www/HelpEU.cshtml +++ /dev/null @@ -1,955 +0,0 @@ -@{ - ViewBag.Title = "Subtitle Edit 3.3 Laguntza"; - ViewBag.Footer = "LaGuNgaRrI iZaTeA iTxAroTen dUt"; - ViewBag.MetaKeywords = "Subtitle Edit help, subtitle tutorial, FAQ, how to synchronize"; - ViewBag.MetaDescription = "Subtitle Edit help page"; - ViewBag.FavIcon = "/favicon.ico"; -} -<h1>@ViewBag.Title</h1> -<hr /> -<br /> -<div style="text-align:right">Laguntza eskuragarri dago ere: <a href="/SubtitleEdit/Help">English</a> | <a href="/SubtitleEdit/HelpEs">Spanish</a> | <a href="/Content/SubtitleEdit/Help/RU">Russian</a></div> -<h2>SEG Txikia</h2> -G: x heuskarriko bideo bat irekitzen saiatzen naizenean, SE-ek ezin du bideoa irakurri edo ez dago soinurik. Zer egin dezaket?<br /> -E: Direct Show erabiltzen baduzu bideo irakurgailu bezala zihurtatu <a href="#codecs">kodek zuzenak</a> erabiltzeaz. Nik k-lite bezalako kodek pakete guztiak kentzea eta <a href="http://code.google.com/p/lavfilters/downloads/list">LAV iragazkiak</a> 32-bit (+64-bit nahi baduzu) bakarrik ezartzea gomendatzen dut. Beste aukera bat VLC bideo irakurgailu bezala erabiltzea da.<br /> -<br /> -G: Non dago atzerapen tresna?<br /> -E: Erabili <b>Erakutsi lehenago/geroago</b> <b>Aldiberetze</b> menuan. Lastertekla <b>Ktrl+Shift+A</b> da. Tresna leiho bat da, hortaz irekita eduki dezakezu lanean ari zaren bitartean <br /> edo azpidatziaren aurreikuspena bideo irakurgailuan egiaztatzerakoan.<br /> -<br /> -G: Zergaitik ezin du Subtitle Editek frame neurria aldatu?<br /> -E: Ongi, ahal du. Hautatu <b>Aldiberetzea -> Aldatu frame neurria</b>.<br /> -<br /> -G: Zergaitik ezin du Subtitle Editek azpidatziak banandu/erantsi?<br /> -E: Erabili <b>Tresnak -> Banandu/erantsi</b>.<br /> -<br /> -G: Subtitle Editek denborak orekatu ahal ditu - baina ez oso hasieratik?<br /> -E: Bai, azpidatzi lerro hautapen batekin lan egin dezakezu. Hautatu lerroak -zerrenda ikuspenean (aholkua: klikatu lehen lerroan, -orduan shift+klikatu azkena) eta -eskuin-klikatu zerrenda ikuspenean (hitzinguru menua) - orain hautaturiko lerroak -zehaztu ditzakezu "ikus aldiberetu hautaturiko lerroak" edo bestela "erakutsi -hauturiko lerroak lehenago/geroago" erabiliz.<br /> -<br /> -G: Subtitle Editek bideoa ikusleiho-osoan irakurri dezake?<br /> -E: Bai, sakatu ALT+ENTER. Erabili tarte tekla irakurri/pausatzeko eta ALT+GORA/BEHERA GEZIA hurrengo/aurreko azpidatzia ikusteko.<br /> -<br /> -G: Azpidatziak itzultzerakoan/editatzerakoan, Subtitle Editek nabigatu dezake azkar hurrengo lerrora?<br /> -E: Bai, sakatu ALT+GORA/BEHERA GEZIA hurrengo/aurreko azpidatzira joateko - idaz-kutxak ere fokuari heutsi diezaioke.<br /> -<br /> -G: Subtitle Editek gehitu ahal ditu azpidatziak bideo agirira?<br /> -E: Ez, Subtitle Editek ezin du egin - baina 100+ irteera heuskarrietako batek edo gehiagok lan egin behar du. Erabili <i>Agiria</i> -> <i>Gorde honela...</i> idatzi ohinarriko azpidatzientzat edo <i>Agiria</i> -> <i>Esportatu...</i> binario/irudi-ohinarriko heuskarrientzat.<br /> -Bi bide daude azpidatziak bideo agirira gehitzeko - erreta (ezin dira inoiz ezkutatu, hortaz <i>beharketa</i> hau ideia txarra izan daiteke) edo barneratuz (zenbait heuskarrirako bakarrik, mkv, mp4 bezala).<br /> -Irakurri gehiago <a href="AddSubtitlesToVideo">azpidatziak gehitzea bideoari</a>. -<br /> -<br /> -<hr /> -<br /> -<h2>Laguntza Aurkibidea</h2> -<div style="margin-left: 25px; line-height: 25px;"> - <a href="#main">Subtitle Edit leiho nagusia</a><br /> - <a href="#main_resize">Subtitle Edit leiho nagusia - birneurritu/uztargabetu</a><br /> - <a href="#main_edit_original">Subtitle Edit leiho nagusia - editatu jatorrizkoa</a><br /> - <a href="#video_modes">Bideo/uhinera edo argilitzaera moduak</a><br /> - <a href="#waveform">Uhinera eta Argilitzaera</a><br /> - <a href="#export">Esportatu</a><br /> - <a href="#sync">Aldiberetzea</a><br /> - <a href="#visual_sync">Ikus aldiberetzea</a><br /> - <a href="#translation">Itzulpena (berez)</a><br /> - <a href="#fixcommonerrors">Akats arrunten zuzenketa</a><br /> - <a href="#spellcheck">Idaz egiaztapena</a><br /> - <a href="#importvobsub">Inportatu/OCR irudi ohinarriko azpidatziak - DVD Sub/idx edo Blu-ray sup bezalakoak</a><br /> - <a href="#shortcuts">Lasterteklak</a><br /> - <a href="#translate">Subtitle Edit beste hizkuntza batera itzultzea</a><br /> - <a href="#networking">Sarea - online elkarlaguntza</a><br /> - <a href="#codecs">Bideo irakurgailua eta kodekak</a><br /> - <a href="#commandline">Komando lerro bihurketa</a><br /> - <a href="#portable">Bertsio eramangarria eta VLC</a><br /> - <a href="#plugins">Egin zeure plugina</a><br /> - <a href="#compile">Subtitle Edit bilketa</a><br /> - <a href="#issues">Arazo Ezagunak</a><br /> -</div> -<br /> -<hr /> -<br /> -<h2><a id="main">Subtitle Edit leiho nagusia</a></h2> - -<br /> -<h3>Ikusleiho nagusiko menua</h3> -Menuan tresna ugari aurkitu ditzakezu, aldatu hizki larri-xehera, banandu, erantsi, idaz egiaztapena, aldiberetzea, aldatu frame neurria, Google itzulpena, bilatu, ordeztu, kendu gorrentzako idatzia eta askoz gehiago!<br /> -DVD, vobsub, Blu-ray sup azpidatziak inportatu ditzakezu - Matroska barneko vobsub agiriak ere inportatu daitezke.<br /> -<br /> -<img src="/Content/SubtitleEdit/EU/main_menu.png" alt="Menu" /><br /> -<br /> -<small>OHARRA: Tresna ugari daude eskuragarri ere zerrenda ikuspenean eskuin klikatuz.</small> -<br /> -<br /> -<br /> - -<br /> -<h3><a id="formats">Azpidatzi/agiri heuskarriak</a></h3> -<table> - <tr> - <td> - <img src="/Content/SubtitleEdit/EU/FormatAndEncoding.png" alt="Subtitle format" /> - <br /> - <br /> - Goiko menuan heuskarria eta kodeaketa hautatu ditzakezu. Lehen hedagarri zerrendak azpidatzi heuskarriak erakusten ditu. SubRip (luzapena ".srt" da) gaur egun heuskarri erabiliena da, hortaz azpidatziak heuskarri honetan gordetzea gomendatzen da.<br /> - Jatorrian SubRip idazki soileko heuskarria zen, baina azken urteetan html etiketak arrunt bihurtu dira. Bereziki etzana eta hizkia etiketak oso erabiliak dira. SubRip sostengua duten irakurgailuen zerrenda ikusteko <a href="http://ale5000.altervista.org/subtitles.htm">aztertu hau</a>.<br /> - <br /> - Agiri kodeaketa berez atzematen da gehienetan. ANSI da gaur egun aurkitzen den heuskarri zahar arruntena, baina beharrezkoa da zure sistemak kultura ezarpen bereizia edukitzea. UTF-8 gomendatzen da azpidatzi berrientzat, honek Ingelerazkoak ez diren hizkiak ANSI-ak baino hobeto kudeatu ditzake (UTF-8 azpidatziek edozein ordenagailutan jardun dezakete zer kultura ezarpen duen axola gabe), eta musika notak bezalako beste ikur batzuk ere erakutsi ditzake. UTF-8 erabiltzearen alde txar bakarra da, batzuetan programa zaharrek ez dutela UFT-8 sostengatzen eta WinXP-ek erdi-unicode hizki gutxik batzuk besterik ez ditu (Lucida Sans Unicode, Time New Roman, Courier New).<br /> - ANSI agiri bat baduzu oraingo kultura/hizkuntzaren bestelakoa den hizkuntza batean (edo baliogabeko UTF/Unicode agiri bat baduzu) menuko gai hau erabili dezakezu:<br /> <i>Agiria</i> -> <i>Inportatu azpidatzia eskuzko kodeaketa hautapenarekin</i>.<br /> - <br /> - <i>Inportatu azpidatzia eskuzko kodeaketa hautapenarekin </i> aurreikuspenarekin:<br /> - <img src="/Content/SubtitleEdit/EU/ChooseEncoding.gif" alt="ChooseEncoding" /> - </td> - </tr> -</table> -<br /> -<br /> - -<h3>Frame neurria</h3> -<table> - <tr> - <td> - <img src="/Content/SubtitleEdit/EU/help_framerate.png" alt="Frame rate" /><br /> - <br /> - Frame neurria ez da berez erakusten, baina gaitu dezakezu menuan <i>Aukerak</i> -> <i>Ezarpenak: Tresnabarra: Erakutsi frame neurria tresnabarran</i>.<br /> - Frame neurria frametan eta denbora ohinarriko heuskarrietan ohinarrituriko azpidatziak heuskarri artean bihurtzerakoan erabiltzen da. - SubRip denboran ohinarriturik dago. MicroDvd (asko erabilia duela 7-9 urte) frametan ohinarriturik dago.<br /> - Denboran ohinarrituriko azpidatziak hobetsiak dira frame neurri aldagaitza ez duten bideotarako - zeinak malgutasunik - ez duten frametan ohinarrituriko azpidatziekin lan egiten duen.<br /> - Frame neurria aldatzeko erabili <i>Aldiberetzea</i> -> <i>Aldatu frame neurria</i> - edo erabili beste <a href="#sync">aldiberetze tresnak</a>-tako bat. - </td> - </tr> -</table> -<br /> -<br /> - -<h3>Azpidatzi ikuspena - Zerrenda ikuspena edo iturburu ikuspena</h3> -<p>Bi modu daude azpidatzi bat ikusteko - zerrenda ikuspena edo iturburu ikuspena.</p> -<table> - <tr> - <td> - <img src="/Content/SubtitleEdit/EU/help_sourceview.png" alt="Source view" /> - </td> - <td> - Horrela ikusten da azpidatzi agiria orain - ezberdina heuskarri bakoitzean.<br /> - Idatzia eta denbora-kodeak editatu ditzakezu hemen, baina kontuz - erraza da ere gauzak nahastea.<br /> - Subtitle Edit Iturburu ikuspegaian abiarazi dezakezu Ezarpenetan. - </td> - </tr> -</table> -<br /> -<table> - <tr> - <td colspan="2"> - <a id="listview"><img src="/Content/SubtitleEdit/EU/help_listview.png" alt="List view" /></a> - </td> - </tr> - <tr> - <td> - Zerrenda ikuspegian azpidatziaren gainikuspen bikaina ematen du - berdina heuskarri guztientzat.<br /> - Idatzia eta denbora-kodeak editatu ditzakezu hemen, lerroak ezabatzea eta txertatzea erraza da.<br /> - <br /> - </td> - </tr> - <tr> - <td colspan="2"> - <br /> - Ahal da ere lerro ugari hautatzea eta <i>Google itzultzailea</i> edo - <i>Ikus aldiberetzea</i> tresnak erabiltzea hautaturiko lerroetan.<br /> - <br /> - <a id="listview2"><img src="/Content/SubtitleEdit/EU/help_listview2.png" alt="Listview" /></a> - </td> - </tr> - <td colspan="2"> - <br /> - <br /> - <h3>Idaz-Kutxa</h3> - <p>Azpidatzia idatzi dezakezun idaz-kutxaren gainean "Hizk/seg" deituriko etiketa bat dago. - 25 baino gehiago baditu laranja/gorriz margotuko da.<br /> - <br /> - </p> - <img src="/Content/SubtitleEdit/EU/TextBox.png" alt="search" /><br /> - <br /> - Idaz-kutxaren azpian "Lerro bakarraren luzera" deituriko etiketa dago. Lehen lerroak 33 hizkirrikoa da eta bigarren lerroa 75 hizkirrikoa. - Lerro luzeraren margo xehetasunak alderatzen dira hemen: Ezarpenak -> Aukerak : Orokorra : Lerro bakarraren geh. luzera. - (43 da berezkoa). Gorriak luzeegia esanahi du, laranjak gehienetik hurbil dagoela. - <br /> - <br /> - </td> - <tr> - </tr> - <tr> - <td colspan="2"> - <br /> - <br /> - <h3>Erakutsi bideoa eta/edo uhinera/argilitzaera</h3> - <br /> - <a id="main_resize">Leiho nagusiak bideoa eta/edo uhinera-argilitzaera erakutsi ditzake.</a> Bideo aginteak uztargabetu daitezke ere - erabilgarria bi monitore badituzu!<br /> - Etzaneko/zutikako lerro gorriek leiho nagusia non birneurriratu dezakezun erakusten dute (banantzaile bidez).<br /> - <br /> - <img src="/Content/SubtitleEdit/EU/main_video1.png" alt="Main window - with video/waveform" /> - </td> - </tr> - <tr> - <td colspan="2"> - <br /> - <br /> - <a id="main_edit_original">Orain bi azpidatziak editatu daitezke aldiberean, itzulpen berria eta jatorrizko azpidatzia.</a> Berez, jatorrizkoa irakurtzeko-bakarrik da, baina hau aldatu dezakezu hemen:<br /> Aukerak -> Ezarpenak: Orokorra: Ahalbidetu jatorrizko azpidatzia editatzea.<br /> - Lasterteklak: <b>Ktrl+U</b> jatorrizko azpidatzia aldatzen du. <b>Ktrl+Shift+U</b> itzulitako / jatorrizko azpidatzia aldatuko du.<br /> - Biak editatzerakoan, jatorrizkoa eta itzulitako azpidatzia, hasiera denbora/iraupena/ezabapena/txertapenak bi azpidatziei eragingo die!<br /> - <br /> - <img src="/Content/SubtitleEdit/EU/main_edit_original.jpg" alt="Main window - with video/waveform" /> - </td> - </tr> -</table> - -<br /> -<br /> -<h3>Bilatu</h3> -<p>Bilaketa bat egin dezakezu Ktrl+F sakatuz (F3 bilatu hurrengoa). Adierazpen arrunt bilaketa eskuragarri dago.</p> -<img src="/Content/SubtitleEdit/EU/help_search.png" alt="search" /><br /> -<br /> -<hr /> -<br /> - -<br /> -<br /> -<h3><a id="multiple_replace">Ordezte Anitza</a></h3> -<p><i>Editatu -> Ordezte anitza</i> erabiliz zeure arauak sortu ditzakezu azpidatzi bat zuzentzeko - baita arau aurreratuak <a href="http://en.wikipedia.org/wiki/Regular_expression">adierazpen arruntak</a> erabiliz!</p> -<p>Idazterakoan adierazpen arrunt taldekatzea eta atzera-xehetasunak oso erabilgarriak dira. Adierazpen arrunt baten zatiak hitzarte batean taldeak dira eta xehetasun bezala erabili daitezke ordezte lerroan $1 lehen taldearen xehatasuna denean eta $2 bigarrenaren xehetasuna eta horrela.<br /> -<div style="padding-left:15px"> -1 adibidea: <b>^#( .+)</b> + ordeztu katea <b>♪ $1</b> - "#" hasiera bakarrik ordeztuko da, hortaz idaztzia "# Musika Entzuten #" bada "♪ Musika Entzuten #"-ekin ordeztuko da<br /> -2 adibidea: <b>([a-z]+)([0-9]+)</b> + ordeztu katea <b>$2$1</b> - bi taldeak aldatuko dira, hortaz idatzia "zenbakia52" bada "52zenbakia" bihurtuko da.<br /> -</div> -</p> -<img src="/Content/SubtitleEdit/EU/main_edit_multiple_replace.png" alt="Multiple replace" /><br /> -<br /> -<hr /> -<br /> - -<h2><a id="video_modes">Bideo/uhinera edo argilitza moduak</a></h2> -<br /> -Bideoa eta/edo uhinera-argilitzaera erabiltzarekoan hiru modu (hegats) daude eskuragarri: Itzuli, Sortu eta Zehaztu. - -<h3>Itzuli modua</h3> -<img src="/Content/SubtitleEdit/EU/mode_translate.png" alt="Translate mode" /><br /> -<br /> -Itzulpen moduan azpidatzi bat hizkuntza batetik bestera eskuz itzuli dezakezu (edo makinaz itzulitako azpidatzi bat zuzendu) -bideoa ikusten - eta audioa entzuten duzun bitartean.<br /> -"Berez berregin" gaituta badago, azpidatzia x-aldiz berregingo da idatzi zuzena idazten duzun bitartean.<br /> -Erabili <i>Agiria</i> -> <i>Ireki jatorrizko azpidatzia (itzultzaile modua)</i> jatorrizko idatzia ere erakusteko.<br /> -Aholkua: Erabili &lt;alt+gora/behera gezia&gt; aurreko/hurrengo azpidatzira joateko.<br /> -<br /> -<br /> - -<h3>Sortu modua</h3> -<img src="/Content/SubtitleEdit/EU/mode_create.png" alt="Create/adjust lines" /><br /> -<br /> -Hau azpidatzi lerroak hutsetik sortzeko edo dauden lerroak eskuz zehazteko tokia da.<br /> -<br /> -Azpidatzi lerroak hutsetik sortzeko, pausatu bideoa azpidatzi lerroa hasi behar den tokian eta sakatu "Txertatu azpidatzi berria bideo kokapenean". Orduan sartu idatzia - iraupena berez iradokitzen da. Orain sakatu "Irakurri idatziaren aurretik" botoia eta idatzia ez bada zehaz-mehatz hasten hizketa hasten denean, zehaztu "Hasiera denbora" gora/behera geziekin bat egin arte. Iraupena "Ezarri amaiera denbora" botoiarekin ezarri daiteke bideoa irakurtzen ari den bitartean edo "Iraupena" gora/behera geziak bidez.<br /> -Azpidatzi bat uneko lerroaren aurretik txertatzeko, sakatu Txertatu botoia (zerrenda ikuspegia fokuturik dagoela).<br /> -<br /> -Baita ere eskuin klikatu dezakezu uhineran edo zerrenda ikuspegian txertatu/batu/banandu/ezabatu lerroak egiteko.<br /> -<br /> -<br /> - -<h3>Zehaztu modua</h3> -<img src="/Content/SubtitleEdit/EU/mode_adjust.png" alt="Adjust mode" /><br /> -<br /> -Hau dauden lerroak zehazteko tokia da.<br /> -<br /> -Azpidatzi lerroak banan-banan eskuz zehazteko goitik hasiz. Erabili "Ezarri hasiera eta orekatu gainontzekoa" (F9) eta "Ezarri amaiera eta joan hurrengora" (F10) botoiak.<br /> -"Hasiera denbora" eta "Iraupena" azken ikutua gora/behera geziak erabiliz egin behar da.<br /> -<br /> -Baita ere eskuin klikatu dezakezu uhineran edo zerrenda ikuspegian txertatu/batu/banandu/ezabatu lerroak egiteko.<br /> -<br /> -<hr /> -<br /> - -<h2><a id="waveform">Uhinera</a></h2> -Uhinera aginteak errazagoa egiten du hizketaren hasiera/amaiera zehatz ikustea.<br /> -<img src="/Content/SubtitleEdit/EU/Waveform1.png" alt="Wave form" /><br /> -<br /> -<br /> -Menuan eskuin klikatuz, azpidatziak banandu/batu/ezabatu ditzakezu.<br /> -<img src="/Content/SubtitleEdit/EU/Waveform2.png" alt="Wave form - right click menu"/><br /> -<br /> -<br /> -Esaldi berri bat sortzeko, hautatu eremu huts bat eta eskuin klikatu.<br /> -<img src="/Content/SubtitleEdit/EU/Waveform3.png" alt="Wave form - new selection" /><br /> -<br /> - -<h3>Uhinera sagu/tekla erabilera:</h3> -<ul> - <li>Sagu klik bakarra: Joan kokapenera</li> - <li>Sagu klik bikoitza dagoen azpidatzian: Hautatu klikaturiko azpidatzia</li> - <li>Markatu erema + eskuin klikatu markaturiko eremuan: Galdetu gehitu esaldi berria / irakurri oraingo hautapena</li> - <li>Sagua arrastatu azpidatziaren ezker/eskuin hertzean (zehaztu hasiera edo amaiera denbora)</li> - <li>Mugitu/arrastatu azpidatziaren erdian (zehaztu biak hasiera eta amaiera denbora - baina ez iraupena)</li> - <li>Sagu eskuin klikak azpidatzi berri bat gehitu dezake edo ezabatu/banandu/batu badagoen azpidatzi lerro bat</li> - <li>Sagu gurpilak uhinera aurrera/atzera irristatzen du</li> - <li>alt+ezker/eskuin geziak bideo kokapena mugitzen du</li> - <li>alt+gora/behera gezia aurreko/hurrengo azpidatziara joateko</li> - <li>Zenbaki +/- zomma handitu/gutxitu</li> - <li>Sagu klik bakarra+Shift hautaturiko azpidatziaren hasiera ezarriko du (amaiera denbora mugitu gabe)</li> - <li>Sagu klik bakarra+Ktrl hautaturiko azpidatziaren amiera ezarriko du (hasiera denbora mugitu gabe)</li> - <li>Sagu klik bakarra+Alt hautaturiko azpidatziaren hasiera ezarriko du (eta iraupenari heutsi)</li> - <li>Sagu klik bikoitza esaldi-gabean - aldatu irakurketa</li> - <li><b>Sagu klik bakarra+Ktrl+Shift hautaturiko azpidatziaren hasiera ezarriko du + hautaturiko azpidatziaren ondorengo lerro guztiak orekatu (iraupenei heutsiz)</b></li> -</ul> - -<br /> -<h3>Uhin aterapena</h3> -Uhin datu aterapena <a href="http://www.videolan.org/">VLC multimedia irakurgailuak 2.x (edo 1.1.x/)</a> egiten du, eta uhin agiri oso txiki bat (lagineurri OSO apal batekin) sortu eta gordetzen da "Uhinera" agiritegian. VLC-k zerbaitegaitik huts egiten badu bideotik uhin agiria ateratzerakoan, uhin agiria beste tresna batekin atera dezakezu eta askatu uhin agiria uhinera agintean, honek uhin agiri txiki bat sortuko du (lagineurri OSO apal batekin) "Uhinera" agiritegian.<br /> -<br /> -Oharra: Ezin duzu uhinera bideo gabe erabili (wav agiria bakarrik baduzu eta ez bideoa, uhin agiria bideo bezala gertatu daiteke + askatu uhin agiria uhinera agintean). -<br /> -<hr /> -<br /> - - -<br /> -<h2><a id="export">Esportatu</a></h2> -Subtitle Editek "Gorde honela..." bidez idazki heuskarri ezberdin anitz gorde ditzake, baina azpidatzi bat heuskarri binarioan gordetzea nahi baduzu (pac edo 890 bezalakoak) edo irudi ohinarrikko heuskarri batean (png edo bluray sup bezalakoak) Agiria -> Esportatu erabili behar duzu.<br /> -Azpidatzien etzana eta margoa bezalako estilo anitz gordetzen dira irudi ohinarriko heuskarrietan esportatzerakoan.<br /> -<br /> -<hr /> -<br /> - - -<h2><a id="sync">Aldiberetzea</a></h2> -<table> - <tr> - <td> - <img src="/Content/SubtitleEdit/EU/SyncMenu.png" alt="Sync menu" /> - </td> - </tr> - <tr> - <td> - <br /> - Subtitle Editek bide anitz eskaintzen ditu azpidatziak aldiberetzeko.<br /> - <p>Zehaztu denbora guztiak (erakutsi lehenago/geroago): Hau erabilgarria da idatzi guztiak 3 segundu lehenago erakustea behar baduzu.</p> - <p><a href="#visual_sync">Ikus aldiberetzea</a>: Aldiberetu hasier/amaiera agerraldia berdinduz (behean gehiago).</p> - <p>Aldiberetze puntua: Honek aldiberetzea ahalbidetzen du 2 puntu edo gehiago erabiliz - aldiberetze puntu denbora kodeak - eskuz sartu daitezke honek erabilterraza egiten duelarik jadanik aldibereturik dagoen beste azpidatzi baten denbora kodeak erabiltzea.</p> - <p>Aldiberetze puntua beste azpidatzi baten bidez: Aldibereturik dagoen beste azpidatzi bat baduzu (adibidez beste hizkuntza batean - lagungarria da apur bat ulertu badezakezu) lehen lerroetako bat berdindu dezakezu, berdindu azken lerroetako bat, aldiberetu eta orduan lerro guztiak aldibereturik egon behar dute.</p> - <p>Aldatu frame neurria: Honek erraza egiten du idatzi bat berdintzea frame neurri bat duen bideo batetik beste frame neurri bat duen bideo batera (ikus aldiberetzez edo aldiberetze puntuaz ere egin daiteke).</p> - </td> - </tr> -</table> -<br /> -<br /> -<br /> - - -<h2><a id="visual_sync">Ikus aldiberetzea</a></h2> -<table> - <tr> - <td colspan="2"> - <img src="/Content/SubtitleEdit/EU/vissync.png" alt="Visual Sync controls" /> - </td> - </tr> - <tr> - <td> - <img src="/Content/SubtitleEdit/EU/help_vs2.png" alt="Synchronize button" /> - </td> - <td> - <br /> - Ikus aldiberetzea egitan bide erraza da azpidatzi bat bideo agiri batekin aldiberetzeko.<br /> - Berdindu lehen lerroetako bat hasierako agerraldiarekin. Orduan berdindu azpidatziaren azken - lerroetako bat amaiera agerraldiarekin. Sakatu "Aldiberetu!" - eta eginda :)<br /> - Botoi lagungarri gutxi batzuk daude azpidatzia bideoan hasi behar den tokia bilatzen lagunduko dutenak - (lehen hitza irtetzen den tokia). "Irakurri 1 seg eta atzera" botoia azterketa botoi bat da, - hortaz oraingo kokapena egitan zuzena den erraz egiaztatu dezakezu. Egiaztatu ere <a href="#shortcuts">Lasterteklak</a>.<br /> - <br /> - Batzuetan ezinezkoa da azpidatzia aldiberetzea agerraldi bat edo gehiago ezabatu/gehitu direlako. - Kasu hauetan azpidatzi zenbateko bat hautatu dezakezu azpidatziaren <a href="#listview">zerrenda ikuspegian</a>, eskuin - klikatu eta hautatu <i>Ikus aldiberetu hautaturiko lerroak</i>. Honela azpidatzia zati txikiagotan zehaztu dezakezu. - </td> - </tr> -</table><br /> -<br /> -<hr /> -<br /> -<h2><a id="translation">Itzulpena (berez)</a></h2> -Subtitle Editek azpidatzia itzuli dezake <a href="http://www.google.com/translate">Google itzulpena</a> erabiliz -edo <a href="../mt">Multi Translator</a> (Suedieratik Danierara bakarrik).<br /> -Googlek hizkuntza askoren arteko itzulpena egiten du! Nahiko ongi lan egiten du, baina itzulitako azpidatziek -oraindik eskuzko zuzenketa behar dute (aholkua: erabili leiho nagusiko <a href="#video_modes">itzulpen modua</a>). -<br /> -<br /> -<img src="/Content/SubtitleEdit/EU/help_googletranslate.png" alt="Create/add lines" /><br /> -<br /> -<hr /> -<br /> -<h2><a id="fixcommonerrors">Akats arrunt zuzenketa</a></h2> -<br /> -<img src="/Content/SubtitleEdit/EU/help_fixcommonerrors1.png" alt="Fix common errors" /><br /> -<br /> -Azpidatzi batzuek akats pilo bat izaten dute (sarri azpidatzi hauek OCR softwarea erabiliz sortuak dira).<br /> -"Tresnak -> Zuzendu akats arruntak" bide erraz bat eskaintzen du akats hauetako asko zuzentzeko.<br /> -Lehen leihoak zuzentzeko ekintzen zerrenda bat erakusten du, klikatu zuzentzea nahi dituzunak eta klikatu "Hurrengoa".<br /> -<br /> -<br /> -<img src="/Content/SubtitleEdit/EU/help_fixcommonerrors2.png" alt="Fix common errors" /><br /> -<br /> -Orain zer zuzenketa ezarri hautatu dezakezu. Berez lerro guztiak hautatzen dira, baina ezartzea nahi ez dituzun zuzenketak ezhautatu ditzakezu.<br /> -Ohar hegatsak zuzenduko denaren gainikuspen bat ematen du - eta zer ezin den zuzendu.<br /> -"Ezarri zuzenketak" botoiak zuzenketak ezartzen ditu.<br /> -<br /> -<hr /> -<br /> -<b><a id="spellcheck">Idaz-Egiaztapena</a></b> -<br /> -<br /> -Idaz-egiaztapena <a href="http://hunspell.sourceforge.net/">Hunspell</a> (Open/LibreOffice, Firefox, Chrome, eta Operak ere erabiltzen dutena) bidez egiten da.<br /> -Ingelerazko hiztegia bakarrik dago barne, baina erraz bilatu ditzakezu hiztegi gehiago tresnabarra menuan <i>Idaz-egiaztapena</i> -> <i>Lortu hiztegiak...</i>!<br /> -<a href="http://extensions.services.openoffice.org/en/dictionaries">Open Office 3.x hiztegiak</a> jeisten badituzu .oxt luzapenarekin, berrizandatu itzazu .zip, eta orduan despaketatu .dic agiria eta .aff agiria Subtitle Edit <i>Dictionary</i> agiritegira.<br /> -<br /> -Idaz-egiaztapenak leiho hau erakutsiko du hitz ezezagun bat aurkitzen duenean:<br /> -<img src="/Content/SubtitleEdit/EU/spell_check.png" alt="spell check" /><br /> -<b><i>Editatu idatzi osoa</i></b> idatzi osoa editatzea gaitzen du (eta ez uneko hitza bakarrik) - azpidatzi honetarako bakarrik.<br /> -<b><i>Aldatu denak / Erabili betik</i></b> uneko hitza betik aldatuko du - baita hurrengo lanetan (OCR Zuzendu Ordeztu zerrendan gordeta - bota begirada bat Dictionaries/eng_OCRFixReplaceList.xml agiri honetaz gehiago jakiteko).<br /> -<b><i>Aldatu / Erbili</i></b> uneko hitza oraingoan bakarrik aldatuko du.<br /> -<b><i>Gehitu zerrenda/zarata zerrendara (hizki xehe-larriak)</i></b> izena edizio idaz-kutxan gogoratuko du uneko xehe-larriz - baita hurrengo lanetan.<br /> -<b><i>Gehitu erabiltzaile zerrendara</i></b> hitza edizio idaz-kutxan gogoratuko du eta ez du berriro berataz galdetuko - baita hurrengo lanetan. Erabiltzaile hiztegiak ez ditu hizki xehe-larriak bereizten.<br /> -<br /> -"Hitza ez da aurkitu" taldekutxako botoi guztiak hitza erabiliko dute "Hitza ez da aurkitu" idazkutxan.<br /> -<br /> -<hr /> -<br /> -<h2><a id="importvobsub">Inportatu/OCR irudi ohinarriko azpidatziak - DVD Sub/idx edo Blu-ray sup bezalakoak</a></h2> -<br /> -<br /> -Blu-ray sup edo sub/idx (vobsub) bezalako irudi ohinarriko azpidatzi bat irekitzen baduzu leiho hau agertuko da:<br /> -<br /> -<img src="/Content/SubtitleEdit/EU/help_importvobsub.png" alt="Import/ocr image based subtitles" /><br /> -<br /> -<br /> -Zerrenda ikuspegiak orain denbora-kodea besterik ez duten azpidatzi lerro hutsak ditu. Idatzia eskuz sartu dezakezu, baina bi (edo hiru MODI ezarrita baduzu) aukera hobeagoak daude: -<ul> - <li>OCR Tesseract 3 bidez (gomendatua): <a href="http://code.google.com/p/tesseract-ocr/">Tesseract</a> iturburu irekiko OCR gailua da. <br /> - Hizkuntza gehigarri datu agiriak bilatu ditzakezu hemen: <a href="http://code.google.com/p/tesseract-ocr/downloads/list">Tesseract Google code project</a>. Tesseract hiztegi agiri hauek despaketatu egin behar dira [Subtitle Edit agiritegia]\Tesseract\tessdata.<br /> - <br /> - Zerrenda ikuspegian eskuin-klikatzen baduzu, aukera hauek dituen hitzinguru menu bat lortuko duzu:<br /> - <img src="/Content/SubtitleEdit/EU/ocr_context_menu.png" alt="OCR list view context menu" /><br /> - <b><i>Inportatu idatzia denbora-kode berdinekin...</i></b> lehenago sorturiko azpidatzi batekin lanean jarraitzeko erabili daiteke.<br /> - <b><i>Gorde azpidatzi irudia honela...</i></b> oraingo irudia pgn, gif, bmp, edo tiff bezala gordetzea ahalbidetzen du.<br /> - <b><i>Gorde irudi guztiak html aurkibidearekin</i></b> azpidatzi irudi guztiak html orrialde bezala erakusten ditu - irakurketa azterketa errazerako.<br /> - <br /> - - OCR Tesseract bidez hobeto lan egingo du <a href="#spellcheck">idaz-egiaztapen</a> hiztegiak badituzu.<br /> - <img src="/Content/SubtitleEdit/EU/ocr_dictionary.png" alt="OCR dictionary" /><br /> - <b><i>Galdetu hitz ezezagunak</i></b> eta <b><i>Saiatu iradokitzen hitz ezezagunak</i></b> hiztegia eskuragarri badago bakarrik lan egingo du. <b><i>Zuzendu OCR akatsak</i></b> ere onura ateratzen du hiztegia badu.<br /> - <br /> - <b><i>Galdetu hitz ezezagunak</i></b> honela ikusiko da (leihoa ber-neurriragarria da):<br /> - <img src="/Content/SubtitleEdit/EU/ocr_spell_check.png" alt="OCR spell check" /><br /> - <b><i>Editatu idatzi osoa</i></b> idatzi osoa editatzea gaitzen du (eta ez uneko hitza bakarrik) - azpidatzi honetarako bakarrik.<br /> - <b><i>Aldatu denak / Erabili betik</i></b> uneko hitza betik aldatuko du - baita hurrengo lanetan (OCR Zuzendu Ordeztu zerrendan gordeta - bota begirada bat Dictionaries/eng_OCRFixReplaceList.xml agiri honetaz gehiago jakiteko).<br /> - <b><i>Aldatu / Erabili</i></b> uneko hitza oraingoan bakarrik aldatuko du.<br /> - <b><i>Gehitu zerrenda/zarata zerrendara (hizki xehe-larriak)</i></b> izena uneko hizki xehe-larriz gogoratuko du - baita hurrengo lanetan.<br /> - <b><i>Gehitu erabiltzaile zerrendara</i></b> hitza edizio idaz-kutxan gogoratuko du eta ez du berriro berataz galdetuko - baita hurrengo lanetan.<br /> - <br /> - <br /> - </li> - <li>OCR irudi alderaketa bidez: Aukera honek ez behar hirugarren softwarerik ezarrita, baina - erabiltzaileak irudi zatietan ohinarrituriko hizkiak eskuz sartzea behar du.<br /> - "Ez dago pixelik tartean" gutxitu egin behar da itzulitako hitz guztiak ez badaude bananduta ("<i>ongigaude.</i>" bezala), eta handitua - bananketa gehiegi badaude ("<i>on gi ga u d e.</i>" bezala).<br /> - Oharra: Ez du ongi lan egiten Blu-ray sup agiriekin!<br /> - <br /> - </li> - <li>OCR MODI bidez: MODI <a href="http://en.wikipedia.org/wiki/Microsoft_Office_Document_Imaging">Microsoft Office Document Imaging</a> laburpena da. Hau Microsoft Office Tools-en barne dago ("Microsoft Office \ Microsoft Office Tools" agiritegia hasiera menuan).<br /> - Honek Tesseract-en oso antzera egiten du lan, baina MS Office behar du.<br /> - Microsoft Office ezarrita baduzu baina MODI OCR ez badago eskuragarri saiatu MS Office ezarpena berriro ekiten eta zihurtatu MODI hautaturik dagoela programaren ezarpenean. - <br /> - </li> -</ul> -Hautatu OCR metodoetako bat eta klikatu "Hasi OCR" botoia.<br/> -Eginda duzunean klikatu "Ongi" eta gogoratu OCR azpidatzi batek zihurrenik zuzenketa behar duten akats batzuk izango dituela.<br /> -VobSub azpidatzi batek hizkuntza bat baino gehiago badu, hizkuntza hautatzeko galdetuko zaizu.<br /> -<br /> -<hr /> -<br /> -<br /> -<h2><a id="shortcuts">Lasterteklak</a></h2> -<br /> -<table id="tableShortcuts"> - <thead> - <tr> - <th>Leihoa</th> - <th>Agintea</th> - <th>Lasterteklak</th> - <th>Eginkizuna</th> - </tr> - </thead> - <tbody> - <tr> - <td>Nagusia</td> - <td>*</td> - <td>F1</td> - <td>Erakutsi laguntza agiri hau ;)</td> - </tr> - <tr> - <td>Nagusia</td> - <td>*</td> - <td>Ktrl+F</td> - <td>Ireki Bilatu elkarrizketa</td> - </tr> - <tr> - <td>Nagusia</td> - <td>*</td> - <td>F3</td> - <td>Bilatu hurrengoa</td> - </tr> - <tr> - <td>Nagusia</td> - <td>*</td> - <td>Ktrl+z</td> - <td>Erakutsi historia/desegin</td> - </tr> - <tr> - <td>Nagusia</td> - <td>*</td> - <td>Ktrl+G</td> - <td>Joan azpidatzi zenbaki elkarrizketara</td> - </tr> - <tr> - <td>Nagusia</td> - <td>*</td> - <td>Ktrl+L</td> - <td>Azpidatzi zerrenda ikuspegian lehenik hautaturiko azpidatzi lerroa aurkitzen du (irriskapena)</td> - </tr> - <tr> - <td>Nagusia</td> - <td>*</td> - <td>Alt+Gora gezia</td> - <td>Joan lerro bat gora azpidatzi zerrenda ikuspegian</td> - </tr> - <tr> - <td>Nagusia</td> - <td>*</td> - <td>Alt+Behera gezia</td> - <td>Joan lerro bat behera azpidatzi zerrenda ikuspegian</td> - </tr> - <tr> - <td>Nagusia</td> - <td>*</td> - <td>Ktrl+U</td> - <td>Itzultzaile modua bai/ez</td> - </tr> - <tr> - <td>Nagusia</td> - <td>*</td> - <td>Ktrl+Shift+U</td> - <td>Aldatu oraingo azpidatzia jatorrizko azpidatziarekin</td> - </tr> - <tr> - <td>Nagusia</td> - <td>*</td> - <td>Shift+Txertatu</td> - <td>Txertatu lerroa hautaturiko lehen lerroaren aurretik</td> - </tr> - <tr> - <td>Nagusia</td> - <td>*</td> - <td>Alt+Txertatu</td> - <td>Txertatu lerroa hautaturiko lehen lerroaren ondoren</td> - </tr> - <tr> - <td>Nagusia</td> - <td>Azpidatzi idaz kutxa</td> - <td>Ktrl+I</td> - <td>Egin hautapena etzana</td> - </tr> - <tr> - <td>-</td> - <td>-</td> - <td>-</td> - <td>-</td> - </tr> - <tr> - <td>Nagusia</td> - <td>Azpidatzi zerrenda ikuspena</td> - <td>Ktrl+A</td> - <td>Hautatu lerro denak</td> - </tr> - <tr> - <td>Nagusia</td> - <td>Azpidatzi zerrenda ikuspena</td> - <td>ktrl+D</td> - <td>Hautatu bakarrik hauturiko lehen lerroa</td> - </tr> - <tr> - <td>Nagusia</td> - <td>Azpidatzi zerrenda ikuspena</td> - <td>Ktrl+Shift+I</td> - <td>Alderantzizkatu hautapena</td> - </tr> - <tr> - <td>Nagusia</td> - <td>Azpidatzi zerrenda ikuspena</td> - <td>Ezabatu</td> - <td>Ezabatu hautaturiko lerroak</td> - </tr> - <tr> - <td>Nagusia</td> - <td>Azpidatzi zerrenda ikuspena</td> - <td>Txertatu</td> - <td>Txertatu lerroa hautaturiko lehen lerroaren ondoren</td> - </tr> - <tr> - <td>Nagusia</td> - <td>*</td> - <td>Ktrl+Shift+M (edo Ktrl+K)</td> - <td>Batu hautaturiko lerroak</td> - </tr> - <tr> - <td>-</td> - <td>-</td> - <td>-</td> - <td>-</td> - </tr> - <tr> - <td>Nagusia</td> - <td>bideo irakurgailua/uhinera</td> - <td>Alt+Ezker gezia</td> - <td>Joan 0,5 segundu atzera bideoan</td> - </tr> - <tr> - <td>Nagusia</td> - <td>bideo irakurgailua/uhinera</td> - <td>Alt+Eskuin gezia</td> - <td>Joan 0,5 segundu aurrera bideoan</td> - </tr> - <tr> - <td>Nagusia</td> - <td>bideo irakurgailua/uhinera</td> - <td>Ktrl+Ezker gezia</td> - <td>Joan 0,1 segundu atzera bideoan</td> - </tr> - <tr> - <td>Nagusia</td> - <td>bideo irakurgailua/uhinera</td> - <td>Ktrl+Eskuin gezia</td> - <td>Joan 0,1 segundu aurrera bideoan</td> - </tr> - <tr> - <td>Nagusia</td> - <td>bideo irakurgailua/uhinera</td> - <td>Ktrl+Alt+P</td> - <td>Pausatu bideoa</td> - </tr> - <tr> - <td>Nagusia</td> - <td>bideo irakurgailua/uhinera</td> - <td>Ktrl+P</td> - <td>Aldatu irakurri/pausatu bideoa</td> - </tr> - <tr> - <td>Nagusia</td> - <td>bideo irakurgailua/uhinera</td> - <td>F4</td> - <td>Aldatu oraingo esaldiaren kokapena amaiera/hasiera artean</td> - </tr> - <tr> - <td>Nagusia</td> - <td>bideo irakurgailua/uhinera</td> - <td>F5</td> - <td>Irakurri oraingo esaldia eta gelditu ondoren</td> - </tr> - <tr> - <td>Nagusia</td> - <td>bideo irakurgailua/uhinera</td> - <td>F6</td> - <td>Joan oraingo esaldiaren hasiera kokapenera</td> - </tr> - <tr> - <td>Nagusia</td> - <td>bideo irakurgailua/uhinera</td> - <td>F7</td> - <td>Joan 3 segundu atzera</td> - </tr> - <tr> - <td>Nagusia</td> - <td>bideo irakurgailua/uhinera</td> - <td>F8</td> - <td>Aldatu irakurri/pausatu</td> - </tr> - <tr> - <td>Nagusia</td> - <td>bideo irakurgailua/uhinera</td> - <td>F9-F12</td> - <td>Moduaren arabera (itzuli/sortu/zehaztu</td> - </tr> - <tr> - <td>Nagusia</td> - <td>bideo irakurgailua/uhinera</td> - <td>Alt+1</td> - <td>Joan oraingo esaldiaren hasiera kokapena</td> - </tr> - <tr> - <td>Nagusia</td> - <td>bideo irakurgailua/uhinera</td> - <td>Alt+2</td> - <td>Joan oraingo esaldiaren amaiera kokapena</td> - </tr> - <tr> - <td>Nagusia</td> - <td>bideo irakurgailua/uhinera</td> - <td>Alt+3</td> - <td>Joan aurreko esaldira</td> - </tr> - <tr> - <td>Nagusia</td> - <td>bideo irakurgailua/uhinera</td> - <td>Alt+4</td> - <td>Joan hurrengo esaldira</td> - </tr> - <tr> - <td>Nagusia</td> - <td>bideo irakurgailua/uhinera - Zehaztu modua</td> - <td>Ktrl+Tartea</td> - <td>Ezarri hasiera eta orekatu gainontzekoa</td> - </tr> - <tr> - <td>Nagusia</td> - <td>bideo irakurgailua/uhinera - Zehaztu modua</td> - <td>Shift+Tartea</td> - <td>Ezarri amaiera eta joan hurrengora</td> - </tr> - <tr> - <td>-</td> - <td>-</td> - <td>-</td> - <td>-</td> - </tr> - <tr> - - <td>Uztargabetu bideo irakurgailua</td> - <td>-</td> - <td>Alt+A</td> - <td>Birneurritu bideo ikuspegi maila 1:1 izateko</td> - </tr> - <tr> - - <td>Uztargebetu bideo irakurgailua</td> - <td>-</td> - <td>Alt+Sartu</td> - <td>Aldatu leihoa handien/arrunt artean</td> - </tr> - <tr> - <td>-</td> - <td>-</td> - <td>-</td> - <td>-</td> - </tr> - <tr> - <td>OCR bidezko irudi alderaketa - Irudia idatzira eskuz</td> - <td>-</td> - <td>Alt+Eskuin gezia</td> - <td>Hedatu hautapena</td> - </tr> - <tr> - <td>OCR bidezko irudi alderaketa - Irudia idatzira eskuz</td> - <td>-</td> - <td>Alt+Ezker gezia</td> - <td>Hautapen murriztua</td> - </tr> - <tr> - <td>OCR bidezko irudi alderaketa - Irudia idatzira eskuz</td> - <td>-</td> - <td>Alt+i (itzulpenaren arabera)</td> - <td>Aldatu etzana</td> - </tr> - <tr> - <td>OCR bidezko irudi alderaketa - Irudia idatzira eskuz</td> - <td>-</td> - <td>Alt+f (itzulpenaren arabera)</td> - <td>Aldatu berez-aurkezpena (berezgaitasunez jarraitu sakaturiko lehen hizkiaren ondoren)</td> - </tr> - </tbody> -</table> -<br /> -<br /> -Oharra - lastertekla asko itxuratu daitezke hemen: <i>Aukerak -> Ezarpenak -> Lasterteklak</i> (jakinarazi diezadazu gehiago behar baduzu):<br /> -<br /> -<img src="/Content/SubtitleEdit/EU/shortcuts.png" alt="Configurable shortcuts" /><br /> -<br /> -<br /> -<br /> -<hr /> -<br /> -<br /> - -<h2><a id="translate">Itzuli Subtitle Edit beste hizkuntza batera</a></h2> -<br /> -Subtitle Edit itzultzeko lehenik jeitsi <a href="/Content/SubtitleEdit/Language.xml">Ingelerazko xml hizkuntza agiria</a> eta gorde zure -"Subtitle Edit\Languages" agiritegian. Itzuli etiketa guztien edukia xml editatzaile batean edo notepad-ekin. -<a href="/XmlContentTranslator">Xml Eduki Itzultzailea</a> ere erabili dezakezu!<br /> -Gorde editaturiko zure xml agiria honela 'KulturaIzena'.xml ('KulturaIzena' <a href="http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo%28v=vs.80%29.aspx">badagoen kultura izen bat</a> izan behar da - eta baita etiketa bat xml agirian) SubtitleEdit\Languages agiritegian.<br /> Orain Aukerak > Hautatu hizkuntza, hegatsean -zure itzulpena aztertu dezakezu zure hizkuntza hautatuz hizkuntza bezala.<br /> -Mesedez bidali itzulpena niri, horrela Subtitle Edit-en barneratuko dut - Mila esker :)<br /> -Aholkua: <a href="http://winmerge.org">WinMerge </a> tresna bikaina da agiriak alderatzeko.<br /> -<br /> -Ezartzailea <a href="http://subtitleedit.googlecode.com/svn/trunk/installer/Custom_Messages.iss">agiri hau</a> itzuliz herrialdetu daiteke. -<br /> -<br /> -<hr /> -<br /> - - -<h2><a id="networking">Sarea - online elkarlaguntza</a></h2> -<br /> -Zuk eta zenbait lagunek azpidatzi bera aldiberean itzultzea nahi baduzue internet bidez, saiatu "Sarea" ezaugarriarekin.<br /> -Lehenik gertatu itzultzea nahi duzun azpidatzia (eta aukeran jatorrizko azpidatzia). Orduan hautatu "Hasi saio berri bat" "Sarea" menuan:<br /> -<br /> -<img src="/Content/SubtitleEdit/EU/NetworkingStart.png" alt="Start network session" /> -<br /> -<br /> -"Saio giltza" zure azpidatziaren id-a da (zuk nahi duzun idazkia izan daiteke) - besteek hau behar dute zure saiora batu ahal izateko (menuko Sarea -> Batu saiora) bidez.<br /> -"Erabiltzaile izena" erakutsiko da lerroak eguneratu/txertatu/ezabatutakoan eta txat leihoan.<br /> -"Webzerbitzu url-a"-k zerbitzari programa hostalari txiki batean jartzen du (Hasieran hau zuzeneko p2p bidez garatu nuen, baina webzerbitzua erabiltzea erabaki nuen ordez, horrela askoz hobeto egiten du lan suhesiak bezalako gauzekin). <a href="/Content/SubtitleEdit/SENetworkingService.zip">Webzerbitzu honen iturburu kodea eskuragarri dago</a> eta oso erraza izan beharko litzake zure zerbitzaria erabiltzea sare saioak hostatzeko.<br /> -<br /> -<br /> -Subtitle Edit-ek behean erakusten den moduan egiten du lan sarean. "Erabiltzailea/ekintza" zutabean zerrenda ikuspegian itzulpenaren garapena jarraitu dezakezu - honek sinergia eraginen bat bizitu dezake!<br /> -<br /> -<img src="/Content/SubtitleEdit/EU/networking.jpg" alt="Subtitle Edit running in networking mode" /> -<br /> -<br /> -<hr /> -<br /> - - -<h2><a id="codecs">Bideo irakurgailua eta kodekak</a></h2> -<br /> -Subtitle Editek VLC multimedia irakurgailua erabili dezake Subtitle Edit barnean DirectShow ordez - joan <i>Aukerak -> Ezarpenak -> Bideo irakurgailua</i>. VLC aukera ez badago eskuragarri, zihurrenik VLC 2.x edo 1.1.x bertsioa ezarri beharko duzu!<br /> -Beste bideo aukera erabilgarri bat <a href="http://www.mplayer2.org/">mplayer2</a> da. Gorde "mplayer.exe" zure Subtitle Edit agiritegian eta Subtitle Editen joan <i>Aukerak -> Ezarpenak -> Bideo irakurgailua</i>-ra eta hautatu "MPlayer".<br /> -Oharra: VLC eta MPlayer beren kodekekin datoz, hortaz ez duzu <a href="http://code.google.com/p/lavfilters/">LAV Iragazkiak</a> edo ffdshow/Hali Matroska Banantzailea ezarri beharrik.<br /> -<br /> -<img src="/Content/SubtitleEdit/EU/OptionsVideoPlayer.png" alt="Choose video player" /> -<br /> -<br /> -Sarri DirectShow bideo irakurgailu arazoak Subtitle Editen kodek gaitz/gatazkatsu/galdu/zaharrek eraginak dira(Kodek paketeak DEABRUA dira!).<br/> -Akatsa horrelako zerbait izan daiteke: System.Runtime.InteropServices.InvalidComObjectException eta aipatu dezake QuartzTypeLib/QuartzPlayer.<br /> -<br /> -Nire gomendioa kodek pakete denak kentzea da (K-lite barne), berrabiarazi eta orduan ezarri <a href="http://code.google.com/p/lavfilters/">LAV Iragazkiak - DirectShow Multimedia Banantzailea eta Dekodeatzaileak</a> <br /> -Ohartu Subtitle Edit 32-biteko aplikazioa dela (64-biteko bertsio bereizi bat aurkitu ez baduzu) eta hortaz 32-biteko kodekak behar ditu - baita 64-biteko win7/8-an<br /> -<br /> -Arazoak badituzu heuskarri/agiri bereizi batekin saiatu honekin: <a href="http://mediaarea.net/MediaInfo">MediaInfo</a> / <a href="http://www.headbands.com/gspot/">GSpot</a>.<br /><br /> -<br /> -<hr /> - -<h2><a id="commandline">SE komando lerro bihurketa</a></h2> -<br /> -Subtitle Edit-ek (3.2) agindu lerro bihurketa egin dezake leiho nagusiko hedagarri zerrendako heuskarrien artean.<br /> -<br /> -Joskera: SubtitleEdit /convert "eredua" "heuskarriaren-izena-tarterik-gabe" [/kodeaketa:?] [/fs-ko:?] [/irteera-agiritegia:?]:<br /> -<br /> - 1 Adibidea: <div style="font-family:Times New Roman; font-style:italic">SubtitleEdit /convert sub1.srt sami</div> Emaitza: sub1.srt --> sub1.sub --> SAMI heuskarrira bihurtuko du<br /> -<br /> - 2 Adibidea: <div style="font-family:Times New Roman; font-style:italic">SubtitleEdit /convert *.srt adobeencore</div> Emaitza: .srt agiri guztiak Adobe Encore heuskarrira bihurtuko ditu<br /> -<br /> - 3 Adibidea: <div style="font-family:Times New Roman; font-style:italic">SubtitleEdit /convert *.srt adobeencore /encoding:windows-1252</div> Emaitza: Gainekoa bezala baina windows-1252 agiri kodeaketa erabiliz (ikusi <a href="http://msdn.microsoft.com/en-us/library/system.text.encodinginfo.getencoding.aspx">Info.Name zerrenda</a> kodeaketa gehiagorako)<br /> -<br /> - 4 Adibidea: <div style="font-family:Times New Roman; font-style:italic">SubtitleEdit /convert a.sub subrip /fps:25</div> Emaitza: Frame ohinarriko a.sub denbora ohinarriko a.srt bihurtzen ditu 25-eko frame neurriaren bidez<br /> -<br /> - 5 Adibidea: <div style="font-family:Times New Roman; font-style:italic">SubtitleEdit /convert a.sub subrip /outputfolder:C:\Temp</div> Emaitza: a.sub --> C:\Temp\a.srt bihurtzen ditu<br /> -<br /> - Sostengaturiko heuskarri zerrenda ikusteko: <div style="font-family:Times New Roman; font-style:italic">SubtitleEdit /convert /list</div> Emaitza: Agindu lerro bihurketan sostengaturiko 100 heuskarri baino gehiago erakusten ditu!<br /> -<br /> -<br /> -<hr /> - -<h2><a id="portable">Bertsio eramangarria eta VLC</a></h2> -<br /> -Bertsio eramangarria VLC-rekin erabiltzeko, jeitsi VLC eramangarria (gutxienez 1.1.0 bertsioa, azken bertsioa hemen: <a href="http://sourceforge.net/projects/azpidatziak.u/files/Euskarazko%20VLC-2.0.8%20%28EUS_XA%29%20Egonkor%20Eramangarria%20%28Programa%20Osorik%29.zip/download"> vlc 2.0.x</a> (Zip) eta despaketatu "VLC" deituriko agiritegi batera SubtitlEdit zuzenbidean. - -<br /> -<br /> -<hr /> - -<h2><a id="plugins">Egin zeure plugina</a></h2> -<br /> -C# edo VB.net kodeatu badezakezu zeure pluginak egin ditzakezu SE-rentzat (SE 3.3 eta berriagoak).<br /> -<br /> -<a href="/Content/SubtitleEdit/PluginSource.zip">Bi erakus plugin jeitsi ditzakezu hemen</a>.<br /> -"Haxor" adibide oso oso ohinarrizkoa da.<br /> -"Fix Hyphens" adibide osoago bat da forma batekin eta zenbait ohinarrizko klaseekin.<br /> -Oraingoz pluginak hemen erabili daitezke: Agiria, Tresnak, Aldiberetzea, Itzulpena eta Idaz-egiaztapena.<br /> -<br /> -<br /> -<hr /> - -<h2><a id="compile">Subtitle Edit bilketa</a></h2> -<br /> -Subtitle Edit-en zeure bertsioa biltzea osoa erraza da!<br /> -<br /> -Ez badizu MS Visual Studio, orduan besterik gabe jeitsi eta ezarri <a href="http://www.microsoft.com/express/vcsharp/">MS Visual C# Express</a>. -Orduan jeitsi Subtitle Edit-en iturburu kodea eta ireki "SubtitleEdit.csproj" agiria. Sakatu F5 - eta eginda :)<br /> -Orain nahi dituzun ezaugarriak aldatu/gehitu ditzakezu edo nire akatsak zuzendu - bakarren bat badago ;) -<br /> -<br /> -<hr /> - - -<h2><a id="issues">Arazo ezagunak</a></h2> -<br /> -Subtitle Editek arazo ezagun gutxi batzuk ditu!<br /> -<br /> -<table id="tableKnownIssues"> - <thead> - <tr> - <th>Arazoa</th> - <th>Konponbidea</hd> - </tr> - </thead> - <tbody> - <tr> - <td>Matxura irakurtzerakoan/gertatzerakoan/bideoa erakusterakoan K-Lite ezarrita dagoela</td> - <td>Kendu K-lite eta ezarri <a href="http://code.google.com/p/lavfilters/">LAV Iragazkiak - DirectShow Multimedia Banantzailea eta Dekodeatzaileka</a><br /> - <small>Ohartu Subtitle Edit 32-biteko aplikazioa dela (64-biteko bertsio bereizi bat aurkitu ez baduzu) eta hortaz 32-biteko kodekak behar ditu - baita 64-biteko win7/8-an</small> - <br /><br />Beste aukera bat bideo irakurgailua VLC-ra aldatzea da Subtitle Editen, Aukerak->Ezarpenak: Bideo irakurgailua erabiliz!</td> - </tr> - <tr> - <td>Arazoak unicode hizkiekin (WinXp)</td> - <td> - Erabili Lucida Sans Unicode/Times New Roman hizkiak - edo eguneratu zure xp Windows 7 edo 8-ra (Vistak ere XP-ak baino hobeto egiten du lan hemen - baita 2014-ko Apirilak 8-tik aurrera inork ez du XP erabili behar MS-ek eguneraketa/eranskin guztiak geldiarazten dituenez)<br /> - Erabili dezakezu ere, Agiria -> Inportatu azpidatziak eskuzko kodeaketa hautapenarekin. - </td> - </tr> - <tr> - <td>Idaz egiaztapen (NHunspell) matxura</td> - <td>Idaz egiaztatzeilea aldatu dezakezu Aukeratan MS Word erabiltzeko!</td> - </tr> - <tr> - <td>Subtitle Edit-ek huts egiten du sare gidagailu batetik ekiterakoan ("Argitaratzailea ezin da egiaztatu")</td> - <td>Ez baduzu nahikoa sarbiderik Subtitle Edit sare gidagailu batetik ekiteko, kopiatu zure tokiko diska gogorrera edo lortu beharrezko sarbide baimena.</td> - </tr> - <tr> - <td>Subtitle Edit eramangarriak ez du ongi lan egiten "Programa agiriak" agiritegian</td> - <td>Erabili ezartzailea Subtitle Edit "Programa agiriak"-an edukitzea nahi baduzu (kendu bertsio eramangarria aurretik)</td> - </tr> - <tr> - <td>Subtitle Editek ez du VLC atzematen aukeratan (hautaezina dago)</td> - <td>VLC 2.x behar duzu - eta 32-biteko bertsioa izan behar da (baita zeure Subtitle Edit 64-biteko bertsioa bilduta baduzu ere)</td> - </tr> - </tbody> -</table> -<br /> -<br /> -<hr /> - -<br /> -<br /> -<br /> -<br /> -Ez duzu bilatzen duzuna aurkitzen? Sentitu aske <a href="mailto:nikse.dk@gmail.com">post@mezu bidaltzeko niri</a>.<br /> -<br /> -<br /> -<br /> -<br /> -<br /> \ No newline at end of file diff --git a/www/HelpEs.cshtml b/www/HelpEs.cshtml deleted file mode 100644 index 1531e204f..000000000 --- a/www/HelpEs.cshtml +++ /dev/null @@ -1,985 +0,0 @@ -@{ - ViewBag.Title = "Subtitle Edit 3.3 Ayuda"; - ViewBag.Footer = "esPero Que leS SirvA"; - ViewBag.MetaKeywords = "Ayuda Subtitle Edit, tutorial subtítulos, FAQ, cómo sincronizar"; - ViewBag.MetaDescription = "Página de ayuda de Subtitle Edit"; - ViewBag.FavIcon = "/favicon.ico"; -} -<h1>@ViewBag.Title</h1> -<hr /> -<br /> -<div style="text-align:right">La ayuda también está disponible en <a href="/SubtitleEdit/HelpEU">Basco</a> | <a href="/SubtitleEdit/HelpEs">Español</a> | <a href="/Content/SubtitleEdit/Help/RU">Ruso</a></div> -<h2>Mini FAQ</h2> -P: Cuando intento un abrir un video en x formato, SE no puede abrir el video o no hay sonido. ¿Qué puedo hacer?<br /> -R: Si usas Direct Show como reproductor de video asegúrate de tener <a href="#codecs">los códecs correctos</a>. Recomiendo desinstalar códecs como k-lite e instalar <a href="https://github.com/Nevcairiel/LAVFilters/releases">LAV filters</a> de 32-bit (+64-bit si lo deseas) en su lugar. Otra opción es usar el reproductor de video de VLC en su lugar.<br /> -<br /> -P: ¿Dónde está la herramienta para sincronizar los subtítulos?<br /> -R: Usa <b>Ajustar todos los tiempos (mostrar antes/después)...</b> en el menú <b>Sincronización</b>. El atajo es <b>Ctrl+Shift+A</b>. Es una ventana de herramientas, para que pueda mantenerse abierta mientras se trabaja - o controle una vista previa de los subtítulos en el reproductor de video.<br /> -<br /> -P: ¿Puede Subtitle Edit cambiar la velocidad de fotogramas?<br /> -R: Bueno, puede. Ve a <b>Sincronización -> Cambiar tasa de cuadros...</b><br /> -<br /> -P: ¿Puede Subtitle Edit dividir/unir subtítulos?<br /> -R: Prueba con <b>Herramientas -> Dividir/Anexar/Unir subtítulos...</b><br /> -<br /> -P: ¿Puede Subtitle Edit modificar tiempos de compensación - pero no desde el principio?<br /> -R: Sí, se puede trabajar con una selección de líneas dentro del subtítulo. Selecciona las líneas en la lista que quieras trabajar(sugerencia: haz clic en la primera línea, luego shift+clic en la última) y a continuación, haga clic-derecho en la lista (menú contextual) - ahora puedes ajustar las líneas seleccionadas en "Sincronización visual líneas seleccionadas" o solo "Mostrar líneas seleccionadas antes/después".<br /> -<br /> -P: ¿Puede Subtitle Edit reproducir un video en pantalla completa?<br /> -R: Sí, presiona ALT+ENTER. Utiliza la barra espaciadora para reproducir/pausar y ALT+FLECHA ARRIBA/ABAJO para el subtítulo siguiente/anterior.<br /> -<br /> -P: Al traducir/editar subtítulos, ¿puede Subtitle Edit navegar rápidamente a la siguiente línea?<br /> -R: Sí, presiona ALT+FLECHA ARRIBA/ABAJO para el subtítulo anterior/siguiente - también el campo de texto se mantendrá enfocado.<br /> -<br /> -P: ¿Puede Subtitle Edit pegar los subtítulos en el archivo de video?<br /> -R: No, Subtitle Edit no puede hacer esto - pero uno o más de los más de 100 formatos de salida deberían servir. Utiliza ya sea <i>Archivo</i> -&gt; <i>Guardar como ...</i> para los formatos basados ​​en texto o <i>Archivo</i> -&gt; <i>Exportar ...</i> para formatos basados en binarios/imágenes.<br /> -Hay dos formas de agregar subtítulos en el archivo de video - pegados al video (no se puede deshabilitar, por lo que esta <i>podría</i> ser una mala idea) o dentro de un contenedor de video (sólo para algunos formatos como mp4, mkv)<br /> -Lee más acerca de <a href="AddSubtitlesToVideo">añadir subtítulos al video</a>. -<br /> -<br /> -<hr /> -<br /> -<h2>Índice de Ayuda</h2> -<div style="margin-left: 25px; line-height: 25px;"> - <a href="#main">Subtitle Edit ventana principal</a><br /> - <a href="#main_resize">Subtitle Edit ventana principal - ajustar/desacoplar</a><br /> - <a href="#main_edit_original">Subtitle Edit ventana principal - editar original</a><br /> - <a href="#video_modes">Modos de video/onda de audio</a><br /> - <a href="#waveform">Onda de audio</a><br /> - <a href="#export">Exportar</a><br /> - <a href="#sync">Sincronización</a><br /> - <a href="#visual_sync">Sincronización visual</a><br /> - <a href="#translation">Traducción (automática)</a><br /> - <a href="#fixcommonerrors">Corregir errores comunes</a><br /> - <a href="#spellcheck">Revisar ortografía</a><br /> - <a href="#importvobsub">Importar subtítulos OCR basados ​​en imágenes - como DVD Sub/idx o Blu-ray sup</a><br /> - <a href="#shortcuts">Atajos</a><br /> - <a href="#translate">Traduciendo Subtitle Edit a otro idioma</a><br /> - <a href="#networking">Redes - colaboración en línea</a><br /> - <a href="#codecs">Reproductor de video y códecs</a><br /> - <a href="#commandline">Conversión por línea de comandos</a><br /> - <a href="#portable">Versión portable y VLC</a><br /> - <a href="#plugins">Haz tu propio plugin</a><br /> - <a href="#compile">Compilar Subtitle Edit</a><br /> - <a href="#issues">Problemas conocidos</a><br /> -</div> -<br /> -<hr /> -<br /> -<h2><a id="main">Subtitle Edit ventana principal</a></h2> - -<br /> -<h3>Menú de la ventana principal</h3> -En el menú se pueden encontrar muchas herramientas como cambiar mayúsculas, dividir líneas largas, dividir/anexar subtítulo, corrector ortográfico, sincronización visual/puntual/desde otro subtítulo, cambio de la tasa de cuadros (FPS), traductor Google, buscar, reemplazar, quitar el texto para sordos (Closed Caption "CC"), ¡y mucho más!<br /> -Puedes importar subtítulos desde un DVD, vobsub, Blu-ray sup - incluso se pueden importar vobsub dentro de archivos Matroska.<br /> -<br /> -<img src="/Content/SubtitleEdit/main_menu.png" alt="Menu" /><br /> -<br /> -<small>NOTA: Muchas otras herramientas están también disponibles haciendo clic derecho en la lista de los subtítulos.</small> -<br /> -<br /> -<br /> - -<br /> -<h3><a id="formats">Subtítulo/formatos de archivo</a></h3> -<table> - <tr> - <td> - <img src="/Content/SubtitleEdit/FormatAndEncoding.png" alt="Subtitle format" /> - <br /> - <br /> - En el menú superior puedes elegir el formato y la codificación. La primera lista desplegable muestra formatos de subtítulos. SubRip (su extensión es ".srt") es - el formato más utilizado hoy en día, por lo que se recomienda guardar los subtítulos en este formato.<br /> - Originalmente SubRip era un formato de sólo texto, pero en los últimos años se empezaron a utilizar las etiquetas html. Especialmente las - etiquetas de cursiva y de fuentes son ampliamente utilizadas. Para obtener una lista de los reproductores que soportan SubRip <a href="http://ale5000.altervista.org/subtitles.htm">mira esto</a> .<br /> - <br /> - La codificación del archivo es detectada automáticamente en la mayoría de los casos. ANSI es un formato antiguo, que se utiliza mucho hoy en día, pero requiere que tu - sistema tenga una configuración de referencia cultural específica. Se recomienda UTF-8 para nuevos subtítulos, ya que puede manejar caracteres distintos al Inglés - mejor que ANSI (los subtítulos UTF-8 funcionarán en todos los equipos sin importar que configuración cultural tengan en la computadora) y puede mostrar otros - símbolos como notas de música. El único inconveniente con la utilización de UTF-8 es, que algunos programas antiguos no son compatibles con este formato y WinXP sólo tiene unas pocas fuentes semi-unicode (Lucida Sans Unicode, Time New Roman, Courier New).<br /> - Si tienes un archivo ANSI en otro idioma que no sea tu actual cultura/lengua (o tienes un archivo inválido UTF/Unicode), entonces puedes utilizar el menú - : <i>Archivo</i> -> <i>Importar subtítulos seleccionando codificador manualmente...</i><br /> - <br /> - <i>Importar subtítulos seleccionando codificador manualmente...</i> con vista previa:<br /> - <img src="/Content/SubtitleEdit/ChooseEncoding.gif" alt="ChooseEncoding" /> - </td> - </tr> -</table> -<br /> -<br /> - -<h3>Tasa de cuadros (FPS)</h3> -<table> - <tr> - <td> - <img src="/Content/SubtitleEdit/help_framerate.png" alt="Frame rate" /><br /> - <br /> - La velocidad de cuadros ya no se muestra por defecto, pero se puede activar a través del menú <i>Opciones</i> -> <i>Ajustes: Barra de herramientas: Mostrar tasa de cuadros en la barra de herramientas.</i><br /> - La tasa de cuadros se utiliza al convertir entre formatos de subtítulos basados ​​en cuadros y formatos basados ​​en tiempo. - SubRip se basa en el tiempo. MicroDVD (utilizados ampliamente hace 7-9 años) se basan en cuadros.<br /> - Los subtítulos basados ​​en el tiempo se usan siempre que los videos tengan una frecuencia de cuadros constante - en caso contrario - se utilizan los subtítulos basados ​​en cuadros, nada flexibles en absoluto.<br /> - Para cambiar la tasa de cuadros usa <i>Sincronización</i> -> <i>Cambiar tasa de cuadros</i> - o utiliza una de las otras <a href="#sync">herramientas de sincronización</a>. - </td> - </tr> -</table> -<br /> -<br /> - -<h3>Vistas del Subtítulo - vista de lista o vista original</h3> -<p>Hay dos formas de ver un subtítulo - vista de lista o vista original.</p> -<table> - <tr> - <td> - <img src="/Content/SubtitleEdit/help_sourceview.png" alt="Source view" /> - </td> - <td> - Así es como el archivo de subtítulo se ve en realidad - diferente para todos los formatos.<br /> - Puedes editar textos y códigos de tiempo aquí, pero ten cuidado - también es fácil echarlo a perder. - <br /> - Puedes hacer que Subtitle Edit comience con la vista original dentro de Ajustes. - </td> - </tr> -</table> -<br /> -<table> - <tr> - <td colspan="2"> - <a id="listview"><img src="/Content/SubtitleEdit/help_listview.png" alt="List view" /></a> - </td> - </tr> - <tr> - <td> - La vista de lista ofrece un excelente panorama de los subtítulos - lo mismo para todos los formatos.<br /> - Puedes editar textos y códigos de tiempo aquí, borrar e insertar líneas con facilidad.<br /> - <br /> - </td> - </tr> - <tr> - <td colspan="2"> - <br /> - También es posible seleccionar varias líneas y usar herramientas como <i>Traducir con Google</i> o - <i>Sincronización visual</i> en las líneas seleccionadas.<br /> - <br /> - <a id="listview2"><img src="/Content/SubtitleEdit/help_listview2.png" alt="Listview" /></a> - </td> - </tr> - <td colspan="2"> - <br /> - <br /> - <h3>Campo de texto</h3> - <p> - Por encima del campo de texto donde escribes el subtítulo actual hay una etiqueta llamada "Caracteres/segundo". - Si es mayor a 25 será de color naranja/rojo.<br /> - <br /> - </p> - <img src="/Content/SubtitleEdit/TextBox.png" alt="search" /><br /> - <br /> - Por debajo del campo de texto hay una etiqueta llamada "Longitud línea individual". La primera línea es de 33 caracteres y segunda línea es de 75 caracteres. - Los colores referentes a la comparación de la duración de la línea actual se pueden modificar en Opciones -> Ajustes: General: longitud máxima línea simple - (43 por defecto). Rojo significa demasiado largo, naranja significa que está cerca de máximo. - <br /> - <br /> - </td> - <tr></tr> - <tr> - <td colspan="2"> - <br /> - <br /> - <h3>Mostrar video y/o onda de audio/espectrograma</h3> - <br /> - <a id="main_resize">La ventana principal puede mostrar video y/o la onda de audio.</a> Los controles de video pueden incluso desacoplarse - ¡excelente si tienes dos monitores!<br /> - Las líneas rojas horizontales/verticales muestra donde se puede cambiar el tamaño dentro de la ventana principal (a través de divisores).<br /> - <br /> - <img src="/Content/SubtitleEdit/main_video1.png" alt="Main window - with video/waveform" /> - </td> - </tr> - <tr> - <td colspan="2"> - <br /> - <br /> - <a id="main_edit_original">Ahora es posible editar tanto la traducción como los subtítulos originales al mismo tiempo.</a> Por defecto, el original es de sólo lectura, pero puedes cambiar esto en Opciones -&gt; Ajustes: General: Permitir la edición del subtítulo original.<br /> - Atajos: <b>Ctrl+U</b> alternará con el subtítulo original. <b>Ctrl+Shift+U</b> cambia al subtítulo traducido/original.<br /> - Al editar los subtítulos originales y traducidos, ¡cambiar el inicio de tiempo/duración/eliminación/inserción afectará a ambos subtítulos!<br /> - <br /> - <img src="/Content/SubtitleEdit/main_edit_original.jpg" alt="Main window - with video/waveform" /> - </td> - </tr> -</table> - -<br /> -<br /> -<h3>Buscar</h3> -<p>Puede buscar pulsando Ctrl+F (F3 para buscar el siguiente). La búsqueda de expresión regular está disponible para nerds ;)</p> -<img src="/Content/SubtitleEdit/help_search.png" alt="search" /><br /> -<br /> -<hr /> -<br /> - -<br /> -<br /> -<h3><a id="multiple_replace">Reemplazado Múltiple</a></h3> -<p>En <i>Editar -> Reemplazado Múltiple...</i> puede crear tus propias reglas para la reparación de un subtítulo - ¡incluso reglas avanzadas usando <a href="https://es.wikipedia.org/wiki/Expresión_regular">expresiones regulares</a>!</p> -<p> - Al escribir expresiones regulares y referencias inversas son de mucha utilidad. Las partes dentro de paréntesis son grupos y pueden ser referenciados en la cadena de reemplazo donde $1 hace referencia al primer grupo y $2 al segundo y así continuamente.<br /> - <div style="padding-left:15px"> - Ejemplo 1: <b>^J( .+)</b> + cadena de reemplazo <b>♪ $1</b> - solo el inicio con "J" será reemplazado, entonces si el texto es "J Letra de la música J" se convertirá en "♪ Letra de la música J"<br /> - Ejemplo 2: <b>([a-zá-úñü]+)([0-9]+)</b> + cadena de reemplazo <b>$2$1</b> - dos grupos que serán intercambiados, entonces si el texto es "número26" se convertirá en "26número".<br /> - </div> -</p> -<img src="/Content/SubtitleEdit/main_edit_multiple_replace.png" alt="Multiple replace" /><br /> -<br /> -<hr /> -<br /> - -<h2><a id="video_modes">Modos de video/onda de audio</a></h2> -<br /> -Al utilizar video y/o onda de audio tres modos diferentes (pestañas) están disponibles: Traducir, Crear y Ajustar. - -<h3>Modo traductor</h3> -<img src="/Content/SubtitleEdit/mode_translate.png" alt="Translate mode" /><br /> -<br /> -En el modo traductor puedes traducir los subtítulos de un idioma a otro de forma manual (o corregir el subtítulo -traducido por una máquina) mientras se ve el video - y se escucha el audio.<br /> -Si "Repetir automáticamente" está activado, entonces el subtítulo se repetirá determinado número de veces mientras escribes el texto correcto.<br /> -Usa <i>Archivo</i> -> <i>Abrir subtítulo original (modo traductor)</i> para ver también el texto original.<br /> -Sugerencia: utiliza &lt;alt+flecha arriba/abajo&gt; para ir al subtítulo anterior/siguiente.<br /> -<br /> -<br /> - -<h3>Modo crear</h3> -<img src="/Content/SubtitleEdit/mode_create.png" alt="Create/adjust lines" /><br /> -<br /> -Este es el lugar para crear líneas de subtítulos desde cero o ajustar manualmente las líneas existentes.<br /> -<br /> -Para crear líneas de subtítulos desde cero, pausa el archivo de video donde la línea del subtítulo debe comenzar y pulsa el botón -"Inser. subt. en pocisión del video". A continuación, escribe el texto - la duración se ajusta automáticamente. Ahora presiona el botón "Repro. poco antes del texto" y si el texto no se inicia exactamente cuando el diálogo se inicia, entonces, corrige "Ajustar tiempo inicial" a través de las flechas arriba/abajo hasta que se ajusten. La duración se puede ajustar a través del botón "Ajustar tiempo final" mientras se reproduce el video o a través de las "Flechas de duración arriba/abajo".<br /> -Para insertar un subtítulo justo después de la línea actual, pulsa el botón Insertar (mientras que la lista está enfocada).<br /> -<br /> -También puedes hacer clic en la onda de audio o en la lista para insertar/dividir/combinar/eliminar las líneas.<br /> -<br /> -<br /> - -<h3>Modo ajustar</h3> -<img src="/Content/SubtitleEdit/mode_adjust.png" alt="Adjust mode" /><br /> -<br /> -Este es el lugar para ajustar las líneas existentes.<br /> -<br /> -Para ajustar las líneas de subtítulos manualmente uno por uno, comenzando desde la parte superior. Utiliza el botón "Ajustar inicio y compensar el resto" (F9) y "Ajustar tiempo final / siguiente" (F10). -Para hacerlo de forma más exacta, el "Tiempo inicial" y la "Duración" lo puedes ajustar mediante el uso de la flechas arriba/abajo.<br /> -<br /> -También puedes hacer clic en la onda de audio o en la lista para insertar/dividir/combinar/eliminar las líneas.<br /> -<br /> -<hr /> -<br /> - -<h2><a id="waveform">Forma de onda</a></h2> -El control de la forma de onda hace que sea fácil ver exactamente dónde comienza/termina el habla.<br /> -<img src="/Content/SubtitleEdit/Waveform1.png" alt="Wave form" /><br /> -<br /> -<br /> -Con el menú del botón derecho, puedes dividir/combinar/eliminar subtítulos.<br /> -<img src="/Content/SubtitleEdit/Waveform2.png" alt="Wave form - right click menu" /><br /> -<br /> -<br /> -Para crear un nuevo párrafo, sólo tienes que seleccionar un área vacía y hacer clic derecho "Añadir texto aquí".<br /> -<img src="/Content/SubtitleEdit/Waveform3.png" alt="Wave form - new selection" /><br /> -<br /> - -<h3>Forma de onda, uso del ratón/teclado:</h3> -<ul> - <li>Clic sencillo del ratón: Ir a la posición</li> - <li>Doble clic del ratón sobre el subtítulo existente: Seleccionar subtítulo clicado</li> - <li>Área marcada+clic derecho del ratón sobre el área marcada: Pregunta por Añadir texto aquí/Reproducir selección</li> - <li>Arrastrar con el ratón hacia la izquierda/derecha los bordes del subtítulo (ajusta el tiempo de inicio o fin)</li> - <li>Mover/arrastrar en medio del subtítulo (ajusta tanto el tiempo de inicio y final - pero no la duración)</li> - <li>Con el clic derecho del ratón se puede agregar un nuevo subtítulo o realizar una acción como borrar/dividir/combinar en la línea del subtítulo existente</li> - <li>Con la rueda del ratón puedes desplazarte por la onda de audio hacia adelante/atrás</li> - <li>Alt+flecha izquierda/derecha mueve la posición del video</li> - <li>Alt+flecha arriba/abajo va hacia el anterior/siguiente subtítulo</li> - <li>Los símbolos numéricos +/- hacen zum de acercamiento/alejamiento</li> - <li>Clic sencillo del ratón+Shift fijará el comienzo de la línea seleccionada (sin moverse el tiempo de finalización)</li> - <li>Clic sencillo del ratón+Ctrl fijará el final de la línea seleccionada (no se mueve el tiempo de inicio)</li> - <li>Clic sencillo del ratón+Alt fijará el comienzo de la línea seleccionada (y mantendrá la duración)</li> - <li>Doble clic del ratón en donde no hay un párrafo - intercambia la reproducción</li> - <li><b>Clic sencillo del ratón+Ctrl+Shift fijará el comienzo de la línea seleccionada y compensará todas las líneas siguientes (manteniendo sus duraciones)</b></li> - <li>Manteniendo presionada la tecla ALT al mover el inicio/final se moverá el inicio/final del subtítulo más cercano también si está más cercano a los 500 milisegundos - <a href="/Content/SubtitleEdit/WaveformMoveNextPrev.gif">como aquí.</a></li> -</ul> - -<br /> -<h3>Extracción de la forma de audio</h3> -La extracción de los datos de la forma de onda se realiza por medio de <a href="http://www.videolan.org/">VLC Media Player 2.x (o 1.1.x /)</a> y genera un archivo de onda muy pequeño (con una frecuencia de muestreo MUY baja) -y se guarda en la carpeta "WaveForms" del programa. Si por alguna razón VLC falla al extraer un archivo de sonido en el video, puedes extraer el archivo de onda con otra herramienta y soltar -ese archivo de onda en el control de forma de onda, lo que generará un archivo de onda pequeña (con una frecuencia de muestreo MUY baja) en la carpeta "WaveForms".<br /> -<br /> -Nota: No se puede utilizar una forma de onda sin el video (si sólo tienes un archivo wav y no el video, es posible cargar el archivo de audio como un archivo de video arrastrando el archivo de audio en el control de forma de onda). -<br /> -<hr /> -<br /> - - -<br /> -<h2><a id="export">Exportar</a></h2> -Subtitle Edit puede guardar a través de "Guardar como..." en muchos diferentes formatos de texto, pero si deseas guardar un subtítulo en un formato binario (como pac o 890) o un formato basado en imágenes (como png o bluray sup) debes utilizar Archivo -> Exportar.<br /> -Muchos estilos como cursivas y colores dentro de los subtítulos se mantendrán al exportar a formatos basados en imágenes.<br /> -<br /> -<hr /> -<br /> - - -<h2><a id="sync">Sincronización</a></h2> -<table> - <tr> - <td> - <img src="/Content/SubtitleEdit/SyncMenu.png" alt="Sync menu" /> - </td> - </tr> - <tr> - <td> - <br /> - Subtitle Edit ofrece varias opciones para sincronizar los subtítulos.<br /> - <p>Ajustar todos los tiempos (mostrar antes/después): Esto es útil si por ejemplo necesitas mostrar todos los textos 3 segundos antes.</p> - <p><a href="#visual_sync">Sincronización visual</a>: Sincroniza haciendo coincidir el inicio/final de una escena (más abajo).</p> - <p> - Sincronización puntual: Permite la sincronización mediante el uso de 2 o más puntos - los códigos de los tiempo de sincronización puntual - pueden ser introducidos manualmente, lo que hace que sea fácil de usar códigos de tiempo a partir de otro subtítulo ya en sincronía. - </p> - <p> - Sincronización puntual desde de otro subtítulo: Si tiene otro subtítulo sincronizado (tal vez en otro idioma - ayuda si se puede entender un poco) puedes coincidir con una de - las primeras líneas, coincidir con una de las últimas líneas, sincroniza y luego todas las líneas deben estar en sincronía. - </p> - <p>Cambiar la tasa de cuadros: Esto facilita que coincida el texto de un video con una velocidad de fotogramas distinta de otro (también se puede hacer por la sincronización visual o sincronización puntual).</p> - </td> - </tr> -</table> -<br /> -<br /> -<br /> - - -<h2><a id="visual_sync">Sincronización visual</a></h2> -<table> - <tr> - <td colspan="2"> - <img src="/Content/SubtitleEdit/vissync.gif" alt="Visual Sync controls" /> - </td> - </tr> - <tr> - <td> - <img src="/Content/SubtitleEdit/help_vs2.png" alt="Synchronize button" /> - </td> - <td> - <br /> - La sincronización visual es una manera muy fácil de sincronizar los subtítulos con un archivo de video.<br /> - Haz coincidir una de las primeras líneas del subtítulo con el comienzo de la escena. A continuación, haz coincidir una - de las últimas líneas del subtítulo con la escena final. Presiona el botón "Sincronización" - y eso es todo :)<br /> - Hay unos pocos botones de ayuda que te servirán para encontrar el lugar adecuado en el video donde el - subtítulo debe comenzar (justo donde aparece la primera palabra). El botón "Reproducir 2" es un botón de prueba, - para que fácilmente puedas ver si la posición actual es realmente la correcta. También puedes ver los <a href="shortcuts">Atajos</a> .<br /> - <br /> - En algunos casos, un subtítulo es imposible de sincronizar porque una o más escenas se han eliminado/añadido. - En estos casos se puede seleccionar un número de subtítulos en el subtítulo <a href="#listview"></a>Vista de lista/0}, haz - clic derecho con el ratón y selecciona <i>Sincro visual líneas seleccionadas...</i> De esta manera puedes ajustar el subtítulo en partes más pequeñas. - </td> - </tr> -</table><br /> -<br /> -<hr /> -<br /> -<h2><a id="translation">Traducción (automática)</a></h2> -Subtitle Edit puede traducir un subtítulo mediante el uso del <a href="http://www.google.com/translate">Traductor de Google</a> -o <a href="../mt">Multi Translator</a> (sólo del sueco al danés).<br /> -¡Google puede traducir entre un montón de idiomas! Funciona bastante bien, pero los subtítulos traducidos aún necesitan -corrección manual (sugerencia: utilizar ventana principal en <a href="#video_modes">modo traductor</a>). -<br /> -<br /> -<img src="/Content/SubtitleEdit/help_googletranslate.png" alt="Create/add lines" /><br /> -<br /> -<hr /> -<br /> -<h2><a id="fixcommonerrors">Corregir errores comunes</a></h2> -<br /> -<img src="/Content/SubtitleEdit/help_fixcommonerrors1.png" alt="Fix common errors" /><br /> -<br /> -Algunos subtítulos tienen una gran cantidad de errores (a menudo estos subtítulos se crean utilizando software OCR).<br /> -"Herramientas -> Fijar errores comunes" proporciona una manera fácil de solucionar muchos de estos errores.<br /> -La primera ventana muestra una lista de acciones para corregir, sólo debes marcar las casillas de verificación que desees reparar y pulsa "Siguiente".<br /> -<br /> -<br /> -<img src="/Content/SubtitleEdit/help_fixcommonerrors2.png" alt="Fix common errors" /><br /> -<br /> -Ahora puedes elegir que correcciones quieres aplicar. Por defecto todos las correcciones están seleccionadas, por lo que debes desmarcar las casillas de verificación de las correcciones -que no deseas aplicar.<br /> -La pestaña de registro ofrece una visión general de lo que se ha hecho - y de lo que no se ha podido corregir.<br /> -El botón "Aplicar correcciones" hace las reparaciones.<br /> -<br /> -<hr /> -<br /> -<b><a id="spellcheck">Revisar ortografía</a></b> -<br /> -<br /> -El corrector ortográfico utiliza <a href="http://hunspell.sourceforge.net/">Hunspell</a> (que también es utilizado por Open/LibraOffice, Firefox, Chrome y Opera).<br /> -Sólo el diccionario Inglés está incluido, pero se pueden encontrar más diccionarios a través del menú de la barra de herramientas <i>Ortografía</i> -> <i>Conseguir diccionarios...</i><br /> -Si descargas <a href="http://extensions.services.openoffice.org/en/dictionaries">los diccionarios Open Office 3.x</a> con la extensión .oxt, cambia la extensión a .zip, luego descomprime -el archivo .dic y el archivo .aff a la carpeta <i>Dictionaries</i> del programa Subtitle Edit.<br /> -<br /> -El corrector ortográfico mostrará esta ventana cuando encuentre una palabra desconocida:<br /> -<img src="http://www.nikse.dk/Content/SubtitleEdit/spell_check.png" alt="corrector ortográfico" /><br /> -<b><i>Editar texto completo</i></b> permitirá editar todo el texto (y no sólo la palabra actual) - para éste subtítulo únicamente.<br /> -<b><i>Cambiar todo / Utilizar siempre</i></b> va a cambiar la palabra actual siempre - también en trabajos futuros (guardado en la lista OCR de reemplazo - echarle un vistazo en la carpeta Dictionaries/spa_OCRFixReplaceList.xml para aprender más acerca de este archivo).<br /> -<b><i>Cambiar / Utilizar</i></b> va a cambiar la palabra sólo por esa vez.<br /> -<b><i>Añadir a list.nombres (sensible mayúsculas)</i></b> recordará el nombre en el campo de texto con el caso actual - también para futuros trabajos.<br /> -<b><i>Añadir al diccionario del usuario</i></b> recordará la palabra en el campo de texto y no pedirá cambiarla más - también para futuros trabajos. El diccionario del usuario no distingue entre mayúsculas y minúsculas.<br /> -<br /> -Todos los botones del grupo "Palabra no encontrada" usan la palabra en el campo de texto "Palabra no encontrada".<br /> -<br /> -<hr /> -<br /> -<h2><a id="importvobsub">Importar subtítulos OCR basados ​​en imágenes - como DVD Sub/idx o Blu-ray sup</a></h2> -<br /> -<br /> -Si abres un subtítulo basado en imágenes como Blu-ray sup o sub/idx (vobsub), esta pantalla aparecerá:<br /> -<br /> -<img src="/Content/SubtitleEdit/help_importvobsub.png" alt="Import/ocr image based subtitles" /><br /> -<br /> -<br /> -La lista que se muestra contiene sólamente subtítulos con líneas vacías de texto mostrando sólo los tiempos. Puedes introducir el texto de forma manual, pero existen dos (o tres si tienes instalado MODI) opciones mejores: -<ul> - <li> - OCR vía Tesseract 3 (recomendado): <a href="http://code.google.com/p/tesseract-ocr/">Tesseract</a> es un motor OCR de código abierto. <br /> - Puedes encontrar archivos de datos adicionales para otros idiomas en el proyecto <a href="http://code.google.com/p/tesseract-ocr/downloads/list">Tesseract Google code project</a>. Estos diccionarios para Tesseract - deben descomprimirse en [la carpeta de Subtitle Edit]\Tesseract\tessdata.<br /> - <br /> - Si haces clic derecho en la lista, aparecerá un menú contextual con las siguientes opciones:<br /> - <img src="/Content/SubtitleEdit/ocr_context_menu.png" alt="Menú contextual lista OCR" /><br /> - <b><i>Importar texto con código de tiempo coincidente...</i></b> se puede utilizar para seguir trabajando con un subtítulo antes creado.<br /> - <b><i>Guardar imagen de subtítulo como...</i></b> permite guardar la imagen actual ya sea como pgn, gif, bmp o tiff.<br /> - <b><i>Guardar todas las imágenes con el índice HTML...</i></b> muestra todas las imágenes del subtítulo en una página HTML - para una lectura fácil.<br /> - <br /> - - OCR via Tesseract will work best if you also havOCR vía Tesseract funcionará mejor si también tienes los <a href="#spellcheck">diccionarios ortográficos</a>.<br /> - <img src="/Content/SubtitleEdit/ocr_dictionary.png" alt="Diccionario OCR" /><br /> - <b><i>Solicitará palabras desconocidas</i></b> y <b><i>tratará de adivinar esas palabras</i></b>, sólo funcionará si está disponible un diccionario. <i><b>Corregir los errores de OCR</b></i> también se beneficiarán - de un diccionario.<br /> - <br /> - La <b><i>solicitud de palabras desconocidas</i></b> se verá como esto (la ventana puede redimensionarse):<br /> - <img src="/Content/SubtitleEdit/ocr_spell_check.png" alt="Corrector ortográfico OCR" /><br /> - <b><i>Editar texto completo</i></b> permitirá editar todo el texto (y no sólo la palabra actual) - para éste subtítulo únicamente.<br /> - <b><i>Cambiar todo / Utilizar siempre</i></b> va a cambiar la palabra actual siempre - también en trabajos futuros (guardado en la lista OCR de reemplazo - puedes echarle un vistazo en Dictionaries/spa_OCRFixReplaceList.xml para aprender más acerca de este archivo).<br /> - <b><i>Cambiar / Utilizar</i></b> la palabra actual se va a cambiar sólo por esta vez.<br /> - <b><i>Añadir a list.nombres (sensible mayúsculas)</i></b> recordará este nombre con la palabra actual - también para futuros trabajos.<br /> - <b><i>Añadir al diccionario del usuario</i></b> recordará esta palabra y no preguntará más por ella - también para futuros trabajos.<br /> - <br /> - <br /> - </li> - <li> - OCR a través de comparar imágenes: Esta opción no requiere ningún software de terceros instalado, pero sí requiere que el usuario manualmente - introduzca las letras basadas en partes de las imágenes.<br /> - "Ninguno de los pixeles es espacio" debe disminuirse si no todas las palabras traducidas están separadas (como "<i>"wearefine</i>"), Y aumentarse - si hay demasiadas separaciones (como "<i>w e ar e fi n e</i>").<br /> - Nota: ¡Esto no funciona bien con archivos Blu-ray sup!<br /> - <br /> - </li> - <li> - OCR vía MODI: MODI es la abreviatura de <a href="http://en.wikipedia.org/wiki/Microsoft_Office_Document_Imaging">Microsoft Office Document Imaging</a> . Se incluye con las herramientas de Microsoft Office (en la carpeta del menú de inicio "Microsoft Office\Microsoft Office Tools").<br /> - Esto funciona muy parecido a Tesseract, pero requiere de MS Office.<br /> - Si tienes Microsoft Office instalado, pero el OCR de MODI no está disponible trata de ejecutar la instalación de MS Office de nuevo y asegúrate de que MODI está seleccionado en el programa de instalación. - <br /> - </li> -</ul> -Selecciona uno de los métodos de OCR y haz clic en el botón "Empezar OCR".<br /> -Cuando hayas terminado haz clic en "Aceptar" y recuerda que el subtítulo que acabas de crear por este medio probablemente contenga algunos errores que haya que corregir.<br /> -Si un subtítulo VobSub contiene más de un idioma, se te pedirá escoger el lenguaje.<br /> -<br /> -<hr /> -<br /> -<br /> -<h2><a id="shortcuts">Atajos</a></h2> -<br /> -<table class="table table-striped" id="tableShortcuts"> - <thead> - <tr> - <th>Ventana</th> - <th>Control</th> - <th>Atajos</th> - <th>Función</th> - </tr> - </thead> - <tbody> - <tr> - <td>Principal</td> - <td>*</td> - <td>F1</td> - <td>Mostrar esta ayuda ;)</td> - </tr> - <tr> - <td>Principal</td> - <td>*</td> - <td>Ctrl+F</td> - <td>Abre el cuadro de diálogo Buscar</td> - </tr> - <tr> - <td>Principal</td> - <td>*</td> - <td>F3</td> - <td>Buscar siguiente</td> - </tr> - <tr> - <td>Principal</td> - <td>*</td> - <td>Ctrl+Z</td> - <td>Mostrar historial/deshacer</td> - </tr> - <tr> - <td>Principal</td> - <td>*</td> - <td>Ctrl+G</td> - <td>Ir al diálogo "Ir al subtítulo número (x - xxx)"</td> - </tr> - <tr> - <td>Principal</td> - <td>*</td> - <td>Ctrl+L</td> - <td>Localiza (desliza hacia) la primera línea del subtítulo seleccionado en la lista de subtítulos</td> - </tr> - <tr> - <td>Principal</td> - <td>*</td> - <td>Alt+Flecha arriba</td> - <td>Va un línea hacia arriba en la lista de subtítulos</td> - </tr> - <tr> - <td>Principal</td> - <td>*</td> - <td>Alt+Flecha abajo</td> - <td>Va un línea hacia abajo en la lista de subtítulos</td> - </tr> - <tr> - <td>Principal</td> - <td>*</td> - <td>Ctrl+U</td> - <td>Modo traductor activado/desactivado</td> - </tr> - <tr> - <td>Principal</td> - <td>*</td> - <td>Ctrl+Shift+U</td> - <td>Cambia el subtítulo actual con el subtítulo original</td> - </tr> - <tr> - <td>Principal</td> - <td>*</td> - <td>Shift+Insert</td> - <td>Inserta una línea antes de la primera línea seleccionada</td> - </tr> - <tr> - <td>Principal</td> - <td>*</td> - <td>Alt+Insert</td> - <td>Inserta una línea después de la primera línea seleccionada</td> - </tr> - <tr> - <td>Principal</td> - <td>Campo de texto del subtítulo</td> - <td>Ctrl+I</td> - <td>Hace cursiva la selección</td> - </tr> - <tr> - <td>-</td> - <td>-</td> - <td>-</td> - <td>-</td> - </tr> - <tr> - <td>Principal</td> - <td>Lista del subtítulo</td> - <td>Ctrl+A</td> - <td>Selecciona todas las líneas</td> - </tr> - <tr> - <td>Principal</td> - <td>Lista del subtítulo</td> - <td>Ctrl+D</td> - <td>Selecciona sólo la primera línea seleccionada</td> - </tr> - <tr> - <td>Principal</td> - <td>Lista del subtítulo</td> - <td>Ctrl+Shift+I</td> - <td>Invierte la selección</td> - </tr> - <tr> - <td>Principal</td> - <td>Lista del subtítulo</td> - <td>Suprimir</td> - <td>Elimina las líneas seleccionadas</td> - </tr> - <tr> - <td>Principal</td> - <td>Lista del subtítulo</td> - <td>Insert</td> - <td>Inserta una línea después de la primera línea seleccionada</td> - </tr> - <tr> - <td>Principal</td> - <td>*</td> - <td>Ctrl+Shift+M (o Ctrl+K)</td> - <td>Combina las líneas seleccionadas</td> - </tr> - <tr> - <td>-</td> - <td>-</td> - <td>-</td> - <td>-</td> - </tr> - <tr> - <td>Principal</td> - <td>reproductor de video/onda de audio</td> - <td>Alt+Flecha izquierda</td> - <td>Regresa 0,5 segundos en el video</td> - </tr> - <tr> - <td>Principal</td> - <td>reproductor de video/onda de audio</td> - <td>Alt+Flecha derecha</td> - <td>Adelanta 0,5 segundos en el video</td> - </tr> - <tr> - <td>Principal</td> - <td>reproductor de video/onda de audio</td> - <td>Ctrl+Flecha izquierda</td> - <td>Regresa 0,1 segundos en el video</td> - </tr> - <tr> - <td>Principal</td> - <td>reproductor de video/onda de audio</td> - <td>Ctrl+Flecha derecha</td> - <td>Adelanta 0,1 segundos en el video</td> - </tr> - <tr> - <td>Principal</td> - <td>reproductor de video/onda de audio</td> - <td>Ctrl+Alt+P</td> - <td>Pausa el video</td> - </tr> - <tr> - <td>Principal</td> - <td>reproductor de video/onda de audio</td> - <td>Ctrl+P</td> - <td>Alterna entre reproducir/pausar video</td> - </tr> - <tr> - <td>Principal</td> - <td>reproductor de video/onda de audio</td> - <td>F4</td> - <td>Alternar entre la posición final/principio del párrafo actual</td> - </tr> - <tr> - <td>Principal</td> - <td>reproductor de video/onda de audio</td> - <td>F5</td> - <td>Reproduce el párrafo actual y se detiene inmediatamente después</td> - </tr> - <tr> - <td>Principal</td> - <td>reproductor de video/onda de audio</td> - <td>F6</td> - <td>Va al inicio del párrafo actual</td> - </tr> - <tr> - <td>Principal</td> - <td>reproductor de video/onda de audio</td> - <td>F7</td> - <td>Regresa 3 segundos</td> - </tr> - <tr> - <td>Principal</td> - <td>reproductor de video/onda de audio</td> - <td>· F8.</td> - <td>Arterna entre reprodur/pausar</td> - </tr> - <tr> - <td>Principal</td> - <td>reproductor de video/onda de audio</td> - <td>F9-F12</td> - <td>Depende del modo (traducir/crear/ajustar)</td> - </tr> - <tr> - <td>Principal</td> - <td>reproductor de video/onda de audio</td> - <td>Alt +1</td> - <td>Va a la posición inicial del párrafo actual</td> - </tr> - <tr> - <td>Principal</td> - <td>reproductor de video/onda de audio</td> - <td>Alt +2</td> - <td>Va a la posición final del párrafo actual</td> - </tr> - <tr> - <td>Principal</td> - <td>reproductor de video/onda de audio</td> - <td>Alt+3</td> - <td>Va al párrafo anterior</td> - </tr> - <tr> - <td>Principal</td> - <td>reproductor de video/onda de audio</td> - <td>Alt +4</td> - <td>Va al párrafo siguiente</td> - </tr> - <tr> - <td>Principal</td> - <td>reprodutor de video/onda de audio - modo ajuste</td> - <td>Ctrl+Espacio</td> - <td>Establece el inicio y compensa al resto</td> - </tr> - <tr> - <td>Principal</td> - <td>reprodutor de video/onda de audio - modo ajuste</td> - <td>Shift+Espacio</td> - <td>Ajusta el final y va al siguiente</td> - </tr> - <tr> - <td>-</td> - <td>-</td> - <td>-</td> - <td>-</td> - </tr> - <tr> - <td>Reproductor de video desacoplado</td> - <td>-</td> - <td>Alt+A</td> - <td>Cambia el tamaño de la ventana de modo que el video tenga una relación de aspecto 1:1</td> - </tr> - <tr> - <td>Reproductor de video desacoplado</td> - <td>-</td> - <td>Alt+Enter</td> - <td>Alterna el tamaño de la ventana entre maximizado/normal</td> - </tr> - <tr> - <td>-</td> - <td>-</td> - <td>-</td> - <td>-</td> - </tr> - <tr> - <td>OCR mediante comparación de imágenes - imagen a texto de forma manual</td> - <td>-</td> - <td>Alt+Flecha derecha</td> - <td>Expande la selección</td> - </tr> - <tr> - <td>OCR mediante comparación de imágenes - imagen a texto de forma manual</td> - <td>-</td> - <td>Alt+Flecha izquierda</td> - <td>Compacta la selección</td> - </tr> - <tr> - <td>OCR mediante comparación de imágenes - imagen a texto de forma manual</td> - <td>-</td> - <td>Alt+I (depende de la traducción)</td> - <td>Activa las cursivas</td> - </tr> - <tr> - <td>OCR mediante comparación de imágenes - imagen a texto de forma manual</td> - <td>-</td> - <td>Alt+F (depende de la traducción)</td> - <td>Activa el envío automático (continúa automáticamente después de la primera letra presionada)</td> - </tr> - </tbody> -</table> -<br /> -<br /> -Note - many of the shortcuts are configurable via <i>Options -> Settings -> Shortcuts</i> (let me know if you need more):<br /> -<br /> -<img src="/Content/SubtitleEdit/shortcuts.png" alt="Configuración de atajos" /><br /> -<br /> -<br /> -<br /> -<hr /> -<br /> -<br /> - -<h2><a id="translate">Traduciendo Subtitle Edit a otro idioma</a></h2> -<br /> -Para traducir Subtitle Edit descarga primero <a href="/Content/SubtitleEdit/Language.xml">el archivo xml en inglés</a> y guárdalo en la carpeta -"Subtitle Edit\Languages". Traduce el contenido de todas las etiquetas con un editor xml o sólo con el bloc de notas. ¡También puedes utilizar -<a href="/XmlContentTranslator">Xml Content Translator</a>!<br /> -Guarda el archivo xml editado como 'CultureName'.xml ('CultureName' debe ser un <a href="http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo%28v=vs.80%29.aspx">nombre de referencia cultural existente</a> - y también una etiqueta en el archivo xml) en la carpeta SubtitleEdit\Languages. En Opciones -> Seleccionar idioma, -ahora puedes probar tu traducción al elegir tu idioma como lenguaje.<br /> -Por favor envíame las traducciones, para que yo pueda incluirlos en el Subtitle Edit - gracias :)<br /> -Sugerencia: <a href="http://winmerge.org">WinMerge </a> es una excelente herramienta para comparar archivos.<br /> -<br /> -El instalador puede localizarse mediante la traducción de <a href="http://subtitleedit.googlecode.com/svn/trunk/installer/Custom_Messages.iss">este archivo</a>. -<br /> -<br /> -<hr /> -<br /> - - -<h2><a id="networking">Redes - colaboración en línea</a></h2> -<br /> -Si tú y algunos amigos quieren traducir un subtítulo al mismo tiempo a través de Internet, pueden probar la característica "Red".<br /> -Primero carga los subtítulos que desean traducir (y opcionalmente el subtítulo original). Después, selecciona "Iniciar sesión" en el menú "Red":<br /> -<br /> -<img src="/Content/SubtitleEdit/NetworkingStart.png" alt="Start network session" /> -<br /> -<br /> -La "Clave de sesión" es el ID de tus subtítulos (puede ser cualquier texto que quieras) - otras personas necesitan esto para unirse (a través del menú Red -> Unirse a sesión) a la sesión.<br /> -El "Usuario" se mostrará en la pantalla al actualizar/insertar/eliminar las líneas y en la ventana del chat<br /> -La "URL" apunta a un pequeño programa en un servidor que aloja la sesión (Inicialmente lo desarrollé para usarlo directamente mediante p2p, pero decidí utilizar un servicio web -en su lugar, ya que funciona mucho mejor con cosas como cortafuegos "firewalls"). <a href="/Content/SubtitleEdit/SENetworkingService.zip">El código fuente de este servicio web está disponible</a> y es -fácil de usar para alojar una sesión en tu propio servidor de red.<br /> -<br /> -<br /> -Subtitle Edit funcionando en modo de red, como se muestra en la imagen. En la columna "Usuario/acción" de la lista de los subtítulos puedes seguir el progreso de traducción - ¡esto podría tener algún efecto sinérgico!<br /> -<br /> -<img src="/Content/SubtitleEdit/networking.jpg" alt="Subtitle Edit running in networking mode" /> -<br /> -<br /> -<hr /> -<br /> - - -<h2><a id="codecs">Reproductor de video y códecs</a></h2> -<br /> -Subtitle Edit puede usar el reproductor VLC dentro de Subtitle Edit en lugar de DirectShow - ir a <i>Opciones -> Ajustes -> Reproductor de Video.</i> Si la opción VLC está en gris, entonces probablemente -necesitas instalar VLC versión 2.x o 1.1.x.<br /> -Sin embargo, otra opción de video es usar <a href="http://www.mplayer2.org/">mplayer2</a> . Guarda "mplayer.exe" en la carpeta de Subtitle Edit y ve a <i>Opciones -> Ajustes -> Reproductor de video</i> y elige la opción "MPlayer".<br /> -Nota: VLC y MPlayer vienen con sus propios codecs, por lo que no es necesario instalar <a href="https://github.com/Nevcairiel/LAVFilters/releases">LAV Filters</a> o ffdshow/Hali Matroska Splitter.<br /> -<br /> -<img src="/Content/SubtitleEdit/OptionsVideoPlayer.png" alt="Elegir Reproductor de video" /> -<br /> -<br /> -A menudo, los problemas con el reproductor de video de DirectShow en el Subtitle Edit son causados ​​por codecs malos/conflictivos/desaparecidos/antiguos (¡Los paquetes de codecs son MALOS!).<br /> -El error podría aparecer como System.Runtime.InteropServices.InvalidComObjectException y podría mencionar algo como QuartzTypeLib/QuartzPlayer.<br /> -<br /> -Mi recomendación es desinstalar todos los paquetes de codecs (incl. K-lite), reiniciar y luego instalar <a href="https://github.com/Nevcairiel/LAVFilters/releases">LAV Filters - DirectShow Media Splitter and Decoders</a> <br /> -Tenga en cuenta que Subtitle Edit es una aplicación de 32-bit (a menos que específicamente hayas encontrado una versión de 64-bit) y por lo tanto requiere de codecs de 32-bit - incluso en win7 64-bit<br /> -<br /> -Si tienes problemas con un determinado formato/archivo intenta con <a href="http://mediaarea.net/MediaInfo">MediaInfo</a> / <a href="http://www.headbands.com/gspot/">GSpot</a>.<br /><br /> -<br /> -<hr /> - -<h2><a id="commandline">Subtitle Edit conversión mediante línea de comandos</a></h2> -<br /> -Subtitle Edit (3.3) puede realizar la conversión entre distintos formatos mediante línea de comandos.<br /> -<br /> -Sintaxis: SubtitleEdit /convert "pattern" "name-of-format-without-spaces" [/encoding:?] [/fps:?] [/outputfolder:?]:<br /> -<br /> - Ejemplo 1: <div style="font-family:Times New Roman;font-style:italic">SubtitleEdit /convert sub1.srt sami</div> Resultado: Convertirá sub1.srt a sub1.sub con formato SAMI<br /> -<br /> - Ejemplo 2: <div style="font-family:Times New Roman;font-style:italic">SubtitleEdit /convert *.srt adobeencore</div> Resultado: Convertirá todos los archivos .srt a formato Adobe Encore.<br /> -<br /> - Ejemplo 3 <div style="font-family:Times New Roman;font-style:italic">SubtitleEdit /convert *.srt adobeencore /encoding:windows-1252</div> Resultado: Igual que el anterior pero la codificación de archivos usará windows-1252 (véase la lista <a href="http://msdn.microsoft.com/en-us/library/system.text.encodinginfo.getencoding.aspx">Info.Name</a> para más codificaciones)<br /> -<br /> - Ejemplo 4 <div style="font-family:Times New Roman;font-style:italic">SubtitleEdit /convert a.sub subrip /fps:25</div> Resultado: Convierte a.sub en a.srt basado en tiempo a través de una tasa de 25 cuados<br /> -<br /> - Ejemplo 5 <div style="font-family:Times New Roman;font-style:italic">SubtitleEdit /convert a.sub subrip /outputfolder:C:\Temp</div> Resultado: Convierte a.sub a C:\Temp\a.srt<br /> -<br /> - Para una lista de formatos soportados: <div style="font-family:Times New Roman;font-style:italic">SubtitleEdit /convert /list</div> Resultado: ¡Muestra los más de 100 formatos soportados en la conversión mediante línea de comandos!<br /> -<br /> -<br /> -<hr /> - -<h2><a id="portable">Versión portable y VLC</a></h2> -<br /> -Para utilizar la versión portable de VLC, descarga VLC portable (al menos la versión 1.1.0, como <a href="http://get.videolan.org/vlc/2.1.3/win32/vlc-2.1.3-win32.zip">vlc 2.1.3</a>) y desempácala a una subcarpeta en la carpeta de Subtitle Edit llamándola "VLC". Otra opción es usar la carpeta donde se localiza &lt;Vlc&gt; en Settings.xml.<br /> -Nota: Nececitas la versión de VLC de 32-bit. -<br /> -<br /> -<hr /> - -<h2><a id="plugins">Haz tu propio plugin</a></h2> -<br /> -Si sabes programar en C# o VB.net puedes hacer tus propios plugins para el Subtitle Edit (SE 3.3 y posteriores).<br /> -<br /> -Puedes <a href="/Content/SubtitleEdit/PluginSource.zip">descargar dos plugins de demostración aquí</a>.<br /> -"Haxor" es un ejemplo muy básico.<br /> -"Fix Hyphens (Reparar Guiones)" es un ejemplo más completo de una forma y unas clases de ayuda básicas.<br /> -Por el momento es posible utilizar plugins aquí: Archivo, Herramientas, Sincronizar, Traducir y Ortografía.<br /> -<br /> -<br /> -<hr /> - -<h2><a id="compile">Compilar Subtitle Edit</a></h2> -<br /> -¡Compilar su propia versión de Subtitle Edit es pan comido!<br /> -<br /> -Si no tienes MS Visual Studio, sólo tienes que descargar e instalar <a href="http://www.microsoft.com/express/vcsharp/">MS Visual C# Express</a>. -Después, descarga el código fuente de Subtitle Edit y abre el archivo "SubtitleEdit.csproj". Pulsa F5 - y eso es todo :)<br /> -Ahora puedes cambiar/añadir características que desees o corregir mis errores - si hubiera alguno ;) -<br /> -<br /> -<hr /> - - -<h2><a id="issues">Problemas conocidos</a></h2> -<br /> -¡Subtitle Edit tiene algunos problemas conocidos!<br /> -<br /> -<table class="table table-striped" id="tableKnownIssues"> - <thead> - <tr> - <th>Problema</th> - <th>Solución</th> - </tr> - </thead> - <tbody> - <tr> - <td>Fallas durante la reproducción/carga/muestra del video con K-Lite instalado</td> - <td> - Desinstalar K-lite y luego instalar {0LAV Filters - DirectShow Media Splitter and Decoders<br /> - <small>Tenga en cuenta que Subtitle Edit es una aplicación de 32-bit (a menos que hayas encontrado específicamente una versión de 64-bit) y por lo tanto requiere de codecs de 32-bit - incluso en win7 64-bit</small> - <br /><br />¡Otra opción es cambiar el reproductor de video VLC en Subtitle Edit mediante Opciones-> Ajustes: Reproductor de Video! - </td> - </tr> - <tr> - <td>Problemas con los caracteres Unicode (WinXp)</td> - <td> - Usar la fuente Lucida Sans Unicode/Times New Roman - o actualizar tu XP a Windows 7 u 8 (Vista funciona incluso mejor que XP aquí - también desde el 8 de Abril del 2014 nadie debería utilizar XP ta que MS dejará de dar actualizaciones/parches)<br /> - Además, puedes utilizar Archivo -> Importar subtítulo seleccionando codificador manualmente. - </td> - </tr> - <tr> - <td>Corrector Ortográfico (NHunspell) se bloquea</td> - <td>¡Puedes cambiar el corrector ortográfico para utilizar MS Word en opciones!</td> - </tr> - <tr> - <td>Subtitle Edit no se puede ejecutar desde una unidad de red (("The publisher could not be verified")</td> - <td>Si no tienes permisos suficientes para ejecutar Subtitle Edit desde una unidad de red, cópialo en el disco duro local para obtener los permisos necesarios.</td> - </tr> - <tr> - <td>Subtitle Edit portable no funciona correctamente en la carpeta "Archivos de programa"</td> - <td>Utiliza el instalador si quieres tener Subtitle Edit en "Archivos de programa" (quita primero la versión portable)</td> - </tr> - <tr> - <td>Subtitle Edit no detecta VLC en opciones (está atenuada)</td> - <td>Necesitas VLC 2.x - y debe ser la versión de 32-bit (a menos que hayas compilado una versión propia en 64-bit del Subtitle Edit)</td> - </tr> - <tr> - <td>Tesseract no funciona correctamente...</td> - <td> - Si usaste el instalador de tesseract, entonces desinstálalo. Después de desinstalarlo, debes eliminar todavía la variable de entorno "TESSDATA_PREFIX" (ej. <a href="http://www.itechtalk.com/thread3595.html">como aquí)</a>.<br /> - Además, es posible que necesites visual studio 2008 c++ runtime: http://www.microsoft.com/en-au/download/details.aspx?id=5582 - </td> - </tr> - </tbody> -</table> -<br /> -<br /> -<hr /> - -<br /> -<br /> -<br /> -<br /> -¿No encontraste lo que necesitas? Siéntete libre de <a href="mailto:nikse.dk@gmail.com">enviarme un correo</a>.<br /> -<br /> -Además, ¡echa un vistazo a los <a href="Video">videos introductorios de Subtitle Edit</a> y al tutorial <a href="/Content/SubtitleEdit/TutorialByDny238.html">Sincronizar Subtítulos con Subtitle Edit</a> por dny238! -<br /> -<br /> -<br /> -<br />